diff --git a/CleanSpec.mk b/CleanSpec.mk
deleted file mode 100644
index b84e1b6..0000000
--- a/CleanSpec.mk
+++ /dev/null
@@ -1,49 +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.
-#
-
-# If you don't need to do a full clean build but would like to touch
-# a file or delete some intermediate files, add a clean step to the end
-# of the list.  These steps will only be run once, if they haven't been
-# run before.
-#
-# E.g.:
-#     $(call add-clean-step, touch -c external/sqlite/sqlite3.h)
-#     $(call add-clean-step, rm -rf $(PRODUCT_OUT)/obj/STATIC_LIBRARIES/libz_intermediates)
-#
-# Always use "touch -c" and "rm -f" or "rm -rf" to gracefully deal with
-# files that are missing or have been moved.
-#
-# Use $(PRODUCT_OUT) to get to the "out/target/product/blah/" directory.
-# Use $(OUT_DIR) to refer to the "out" directory.
-#
-# If you need to re-do something that's already mentioned, just copy
-# the command and add it to the bottom of the list.  E.g., if a change
-# that you made last week required touching a file and a change you
-# made today requires touching the same file, just copy the old
-# touch step and add it to the end of the list.
-#
-# ************************************************
-# NEWER CLEAN STEPS MUST BE AT THE END OF THE LIST
-# ************************************************
-
-# For example:
-#$(call add-clean-step, rm -rf $(OUT_DIR)/target/common/obj/APPS/AndroidTests_intermediates)
-#$(call add-clean-step, rm -rf $(OUT_DIR)/target/common/obj/JAVA_LIBRARIES/core_intermediates)
-#$(call add-clean-step, find $(OUT_DIR) -type f -name "IGTalkSession*" -print0 | xargs -0 rm -f)
-#$(call add-clean-step, rm -rf $(PRODUCT_OUT)/data/*)
-
-# ************************************************
-# NEWER CLEAN STEPS MUST BE AT THE END OF THE LIST
-# ************************************************
diff --git a/OWNERS b/OWNERS
index 743e830..7529cb9 100644
--- a/OWNERS
+++ b/OWNERS
@@ -1,4 +1 @@
-bohu@google.com
-tnorbye@google.com
-vsiva@google.com
-xav@google.com
+include platform/system/core:/janitors/OWNERS
diff --git a/README.txt b/README.txt
deleted file mode 100644
index 6625ea5..0000000
--- a/README.txt
+++ /dev/null
@@ -1,112 +0,0 @@
-Some of the SDK tools sources have moved out of the sdk.git project.
-They are no longer found here.
-
-Instead they can be found in the tools/base.git and the tools/swt.git projects.
-If you need to view/change the source and lack these folders, you can bring
-them by using a repo init command such as:
-
-$ repo init -u https://android.googlesource.com/platform/manifest -g all,-notdefault,tools
-$ repo sync [-j N]
-
-The libraries that are sourced in tools/base and tools/swt are converted to
-prebuilts which are located in prebuilts/devtools. These prebuilts are the
-ones being used when doing a "make sdk".
-
-
-----------
-1- I don't build full SDKs but I want to change tool X:
-----------
-
-Let's say as an example you want to change lint.
-It's now located in tools/base/lint.
-
-To build it from the command-line, you'd use "gradle" as such:
-
-$ cd tools/base
-$ ./gradlew lint:build
-
-Output is located in $TOP/out/host/gradle/tools/base/lint/libs/
-
-Some comments/tips:
-- Gradle is a build system, a bit like make or ant.
-  If you want to know more, visit http://www.gradle.org/
-
-- On Windows with the CMD shell, use ./gradlew.bat.
-  For Cygwin, Linux or Mac, use ./gradlew.
-
-- Gradle targets are in the form "project-name:task-name".
-  To get a list of possible tasks, try this:  $ ./gradlew lint:tasks
-
-- Generally there are only 2 task names to remember:
-  $ ./gradlew lint:assemble ==> builds but do not run tests.
-  $ ./gradlew lint:check    ==> runs tests and checks such as findbugs.
-
-- To find the list of project-names you can use with gradle:
-  $ ./gradlew projects
-
-The new moved projects are unsurprisingly named like their former "make"
-counterparts. They are split between 2 repos:
-- tools/swt contains all SWT-dependent projects.
-- tools/base contains all other non-SWT projects.
-
-However that means that when you want to modify a project using both repos,
-you need an extra step.
-
-For example, the SDK Manager UI is located in /tools/swt/sdkmanager.
-However it does depend on /tools/base/sdklib. Let's say you want to
-make a change in both sdklib and sdkuilib. Here are the steps:
-
-$ # Edit tools/base/sdklib files.
-$ cd tools/base ; ./gradlew sdklib:publishLocal
-  => this builds sdklib and "publishes" an sdklib.JAR into a local maven
-     repo located in the out/gradle folder. Note that this is just a
-     temporary build artifact and is NOT used by "make sdk".
-
-$ # Edit tools/swt/sdkmanager/sdkuilib files to use the changes from sdklib.
-$ cd ../../tools/swt ; ./gradlew sdkuilib:assemble
-  => this builds sdkuilib by using the local JAR of sdklib that is
-     located in the out/gradlew folder.
-
-
-
-----------
-2- How do I change some tools sources and build a new SDK using these?
-----------
-
-Let's say you changed something in tools/base/lint and run "make sdk" from
-the top dir. Your changes will NOT be included in the resulting SDK.
-
-That's because the SDK has been changed to only rely on the prebuilts located
-in /prebuilts/devtools. There are pros and cons with this approach and we're
-not going to discuss them here. Instead we'll focus on what you need to do.
-
-It's fairly simple. Go back to the top dir on your Android tree and run:
-
-$ prebuilts/devtools/update_jars.sh -f
-$ make sdk
-
-Now your changes are included in the generated SDK.
-
-What you should know about the update_jars.sh script:
-- Without argument, it prints what it would do but does nothing.
-  Use the "-f" argument to make it build/copy stuff.
-
-- It builds indiscriminiately. It just builds ALL the libs from
-  tools/base and tools/swt and updates all the JARs under prebuilts/devtools.
-  That should only take 20-30 seconds though. Eventually we'll work on
-  making it smarter because obviously we don't want anyone to just try
-  to submit 30 JARs just because their timestamp changed.
-
-- It generates a git merge msg in prebuilts/devtools that has the sha1
-  of the corresponding tools/base and tools/swt projects.
-  Use option -m to prevent this.
-
-
-------
-
-Need a place to discuss all this?
-http://groups.google.com/group/adt-dev is the right place.
-
---- RM 20130409
-
-
diff --git a/annotations/Android.bp b/annotations/Android.bp
deleted file mode 100644
index 35a0d58..0000000
--- a/annotations/Android.bp
+++ /dev/null
@@ -1,22 +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.
-//
-
-java_library_host {
-    name: "annotations",
-
-    srcs: ["src/**/*.java"],
-    java_resource_dirs: ["src"],
-}
diff --git a/annotations/NOTICE b/annotations/NOTICE
deleted file mode 100644
index 967eceb..0000000
--- a/annotations/NOTICE
+++ /dev/null
@@ -1,190 +0,0 @@
-
-   Copyright (c) 2012-2014, The Android Open Source Project
-
-   Licensed under the Apache License, Version 2.0 (the "License");
-   you may not use this file except in compliance with the License.
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
-
-
-                                 Apache License
-                           Version 2.0, January 2004
-                        http://www.apache.org/licenses/
-
-   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
-   1. Definitions.
-
-      "License" shall mean the terms and conditions for use, reproduction,
-      and distribution as defined by Sections 1 through 9 of this document.
-
-      "Licensor" shall mean the copyright owner or entity authorized by
-      the copyright owner that is granting the License.
-
-      "Legal Entity" shall mean the union of the acting entity and all
-      other entities that control, are controlled by, or are under common
-      control with that entity. For the purposes of this definition,
-      "control" means (i) the power, direct or indirect, to cause the
-      direction or management of such entity, whether by contract or
-      otherwise, or (ii) ownership of fifty percent (50%) or more of the
-      outstanding shares, or (iii) beneficial ownership of such entity.
-
-      "You" (or "Your") shall mean an individual or Legal Entity
-      exercising permissions granted by this License.
-
-      "Source" form shall mean the preferred form for making modifications,
-      including but not limited to software source code, documentation
-      source, and configuration files.
-
-      "Object" form shall mean any form resulting from mechanical
-      transformation or translation of a Source form, including but
-      not limited to compiled object code, generated documentation,
-      and conversions to other media types.
-
-      "Work" shall mean the work of authorship, whether in Source or
-      Object form, made available under the License, as indicated by a
-      copyright notice that is included in or attached to the work
-      (an example is provided in the Appendix below).
-
-      "Derivative Works" shall mean any work, whether in Source or Object
-      form, that is based on (or derived from) the Work and for which the
-      editorial revisions, annotations, elaborations, or other modifications
-      represent, as a whole, an original work of authorship. For the purposes
-      of this License, Derivative Works shall not include works that remain
-      separable from, or merely link (or bind by name) to the interfaces of,
-      the Work and Derivative Works thereof.
-
-      "Contribution" shall mean any work of authorship, including
-      the original version of the Work and any modifications or additions
-      to that Work or Derivative Works thereof, that is intentionally
-      submitted to Licensor for inclusion in the Work by the copyright owner
-      or by an individual or Legal Entity authorized to submit on behalf of
-      the copyright owner. For the purposes of this definition, "submitted"
-      means any form of electronic, verbal, or written communication sent
-      to the Licensor or its representatives, including but not limited to
-      communication on electronic mailing lists, source code control systems,
-      and issue tracking systems that are managed by, or on behalf of, the
-      Licensor for the purpose of discussing and improving the Work, but
-      excluding communication that is conspicuously marked or otherwise
-      designated in writing by the copyright owner as "Not a Contribution."
-
-      "Contributor" shall mean Licensor and any individual or Legal Entity
-      on behalf of whom a Contribution has been received by Licensor and
-      subsequently incorporated within the Work.
-
-   2. Grant of Copyright License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      copyright license to reproduce, prepare Derivative Works of,
-      publicly display, publicly perform, sublicense, and distribute the
-      Work and such Derivative Works in Source or Object form.
-
-   3. Grant of Patent License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      (except as stated in this section) patent license to make, have made,
-      use, offer to sell, sell, import, and otherwise transfer the Work,
-      where such license applies only to those patent claims licensable
-      by such Contributor that are necessarily infringed by their
-      Contribution(s) alone or by combination of their Contribution(s)
-      with the Work to which such Contribution(s) was submitted. If You
-      institute patent litigation against any entity (including a
-      cross-claim or counterclaim in a lawsuit) alleging that the Work
-      or a Contribution incorporated within the Work constitutes direct
-      or contributory patent infringement, then any patent licenses
-      granted to You under this License for that Work shall terminate
-      as of the date such litigation is filed.
-
-   4. Redistribution. You may reproduce and distribute copies of the
-      Work or Derivative Works thereof in any medium, with or without
-      modifications, and in Source or Object form, provided that You
-      meet the following conditions:
-
-      (a) You must give any other recipients of the Work or
-          Derivative Works a copy of this License; and
-
-      (b) You must cause any modified files to carry prominent notices
-          stating that You changed the files; and
-
-      (c) You must retain, in the Source form of any Derivative Works
-          that You distribute, all copyright, patent, trademark, and
-          attribution notices from the Source form of the Work,
-          excluding those notices that do not pertain to any part of
-          the Derivative Works; and
-
-      (d) If the Work includes a "NOTICE" text file as part of its
-          distribution, then any Derivative Works that You distribute must
-          include a readable copy of the attribution notices contained
-          within such NOTICE file, excluding those notices that do not
-          pertain to any part of the Derivative Works, in at least one
-          of the following places: within a NOTICE text file distributed
-          as part of the Derivative Works; within the Source form or
-          documentation, if provided along with the Derivative Works; or,
-          within a display generated by the Derivative Works, if and
-          wherever such third-party notices normally appear. The contents
-          of the NOTICE file are for informational purposes only and
-          do not modify the License. You may add Your own attribution
-          notices within Derivative Works that You distribute, alongside
-          or as an addendum to the NOTICE text from the Work, provided
-          that such additional attribution notices cannot be construed
-          as modifying the License.
-
-      You may add Your own copyright statement to Your modifications and
-      may provide additional or different license terms and conditions
-      for use, reproduction, or distribution of Your modifications, or
-      for any such Derivative Works as a whole, provided Your use,
-      reproduction, and distribution of the Work otherwise complies with
-      the conditions stated in this License.
-
-   5. Submission of Contributions. Unless You explicitly state otherwise,
-      any Contribution intentionally submitted for inclusion in the Work
-      by You to the Licensor shall be under the terms and conditions of
-      this License, without any additional terms or conditions.
-      Notwithstanding the above, nothing herein shall supersede or modify
-      the terms of any separate license agreement you may have executed
-      with Licensor regarding such Contributions.
-
-   6. Trademarks. This License does not grant permission to use the trade
-      names, trademarks, service marks, or product names of the Licensor,
-      except as required for reasonable and customary use in describing the
-      origin of the Work and reproducing the content of the NOTICE file.
-
-   7. Disclaimer of Warranty. Unless required by applicable law or
-      agreed to in writing, Licensor provides the Work (and each
-      Contributor provides its Contributions) on an "AS IS" BASIS,
-      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
-      implied, including, without limitation, any warranties or conditions
-      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
-      PARTICULAR PURPOSE. You are solely responsible for determining the
-      appropriateness of using or redistributing the Work and assume any
-      risks associated with Your exercise of permissions under this License.
-
-   8. Limitation of Liability. In no event and under no legal theory,
-      whether in tort (including negligence), contract, or otherwise,
-      unless required by applicable law (such as deliberate and grossly
-      negligent acts) or agreed to in writing, shall any Contributor be
-      liable to You for damages, including any direct, indirect, special,
-      incidental, or consequential damages of any character arising as a
-      result of this License or out of the use or inability to use the
-      Work (including but not limited to damages for loss of goodwill,
-      work stoppage, computer failure or malfunction, or any and all
-      other commercial damages or losses), even if such Contributor
-      has been advised of the possibility of such damages.
-
-   9. Accepting Warranty or Additional Liability. While redistributing
-      the Work or Derivative Works thereof, You may choose to offer,
-      and charge a fee for, acceptance of support, warranty, indemnity,
-      or other liability obligations and/or rights consistent with this
-      License. However, in accepting such obligations, You may act only
-      on Your own behalf and on Your sole responsibility, not on behalf
-      of any other Contributor, and only if You agree to indemnify,
-      defend, and hold each Contributor harmless for any liability
-      incurred by, or claims asserted against, such Contributor by reason
-      of your accepting any such warranty or additional liability.
-
-   END OF TERMS AND CONDITIONS
-
diff --git a/annotations/build.gradle b/annotations/build.gradle
deleted file mode 100644
index 21f1d7b..0000000
--- a/annotations/build.gradle
+++ /dev/null
@@ -1,20 +0,0 @@
-apply plugin: 'java'
-apply plugin: 'sdk-files'
-
-jar {
-    archiveName = 'annotations.jar'
-}
-
-sourceSets {
-    main.java.srcDirs 'src'
-}
-
-sdk {
-    common {
-        item(jar.archivePath) {
-            into 'support'
-            notice 'NOTICE'
-            builtBy jar
-        }
-    }
-}
diff --git a/annotations/src/android/annotation/SuppressLint.java b/annotations/src/android/annotation/SuppressLint.java
deleted file mode 100644
index 2d3456b..0000000
--- a/annotations/src/android/annotation/SuppressLint.java
+++ /dev/null
@@ -1,38 +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 android.annotation;
-
-import static java.lang.annotation.ElementType.CONSTRUCTOR;
-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 static java.lang.annotation.ElementType.TYPE;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/** Indicates that Lint should ignore the specified warnings for the annotated element. */
-@Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE})
-@Retention(RetentionPolicy.CLASS)
-public @interface SuppressLint {
-    /**
-     * The set of warnings (identified by the lint issue id) that should be
-     * ignored by lint. It is not an error to specify an unrecognized name.
-     */
-    String[] value();
-}
diff --git a/annotations/src/android/annotation/TargetApi.java b/annotations/src/android/annotation/TargetApi.java
deleted file mode 100644
index ea17890..0000000
--- a/annotations/src/android/annotation/TargetApi.java
+++ /dev/null
@@ -1,35 +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 android.annotation;
-
-import static java.lang.annotation.ElementType.CONSTRUCTOR;
-import static java.lang.annotation.ElementType.METHOD;
-import static java.lang.annotation.ElementType.TYPE;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/** Indicates that Lint should treat this type as targeting a given API level, no matter what the
-    project target is. */
-@Target({TYPE, METHOD, CONSTRUCTOR})
-@Retention(RetentionPolicy.CLASS)
-public @interface TargetApi {
-    /**
-     * This sets the target api level for the type..
-     */
-    int value();
-}
diff --git a/apkbuilder/NOTICE b/apkbuilder/NOTICE
deleted file mode 100644
index c5b1efa..0000000
--- a/apkbuilder/NOTICE
+++ /dev/null
@@ -1,190 +0,0 @@
-
-   Copyright (c) 2005-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.
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
-
-
-                                 Apache License
-                           Version 2.0, January 2004
-                        http://www.apache.org/licenses/
-
-   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
-   1. Definitions.
-
-      "License" shall mean the terms and conditions for use, reproduction,
-      and distribution as defined by Sections 1 through 9 of this document.
-
-      "Licensor" shall mean the copyright owner or entity authorized by
-      the copyright owner that is granting the License.
-
-      "Legal Entity" shall mean the union of the acting entity and all
-      other entities that control, are controlled by, or are under common
-      control with that entity. For the purposes of this definition,
-      "control" means (i) the power, direct or indirect, to cause the
-      direction or management of such entity, whether by contract or
-      otherwise, or (ii) ownership of fifty percent (50%) or more of the
-      outstanding shares, or (iii) beneficial ownership of such entity.
-
-      "You" (or "Your") shall mean an individual or Legal Entity
-      exercising permissions granted by this License.
-
-      "Source" form shall mean the preferred form for making modifications,
-      including but not limited to software source code, documentation
-      source, and configuration files.
-
-      "Object" form shall mean any form resulting from mechanical
-      transformation or translation of a Source form, including but
-      not limited to compiled object code, generated documentation,
-      and conversions to other media types.
-
-      "Work" shall mean the work of authorship, whether in Source or
-      Object form, made available under the License, as indicated by a
-      copyright notice that is included in or attached to the work
-      (an example is provided in the Appendix below).
-
-      "Derivative Works" shall mean any work, whether in Source or Object
-      form, that is based on (or derived from) the Work and for which the
-      editorial revisions, annotations, elaborations, or other modifications
-      represent, as a whole, an original work of authorship. For the purposes
-      of this License, Derivative Works shall not include works that remain
-      separable from, or merely link (or bind by name) to the interfaces of,
-      the Work and Derivative Works thereof.
-
-      "Contribution" shall mean any work of authorship, including
-      the original version of the Work and any modifications or additions
-      to that Work or Derivative Works thereof, that is intentionally
-      submitted to Licensor for inclusion in the Work by the copyright owner
-      or by an individual or Legal Entity authorized to submit on behalf of
-      the copyright owner. For the purposes of this definition, "submitted"
-      means any form of electronic, verbal, or written communication sent
-      to the Licensor or its representatives, including but not limited to
-      communication on electronic mailing lists, source code control systems,
-      and issue tracking systems that are managed by, or on behalf of, the
-      Licensor for the purpose of discussing and improving the Work, but
-      excluding communication that is conspicuously marked or otherwise
-      designated in writing by the copyright owner as "Not a Contribution."
-
-      "Contributor" shall mean Licensor and any individual or Legal Entity
-      on behalf of whom a Contribution has been received by Licensor and
-      subsequently incorporated within the Work.
-
-   2. Grant of Copyright License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      copyright license to reproduce, prepare Derivative Works of,
-      publicly display, publicly perform, sublicense, and distribute the
-      Work and such Derivative Works in Source or Object form.
-
-   3. Grant of Patent License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      (except as stated in this section) patent license to make, have made,
-      use, offer to sell, sell, import, and otherwise transfer the Work,
-      where such license applies only to those patent claims licensable
-      by such Contributor that are necessarily infringed by their
-      Contribution(s) alone or by combination of their Contribution(s)
-      with the Work to which such Contribution(s) was submitted. If You
-      institute patent litigation against any entity (including a
-      cross-claim or counterclaim in a lawsuit) alleging that the Work
-      or a Contribution incorporated within the Work constitutes direct
-      or contributory patent infringement, then any patent licenses
-      granted to You under this License for that Work shall terminate
-      as of the date such litigation is filed.
-
-   4. Redistribution. You may reproduce and distribute copies of the
-      Work or Derivative Works thereof in any medium, with or without
-      modifications, and in Source or Object form, provided that You
-      meet the following conditions:
-
-      (a) You must give any other recipients of the Work or
-          Derivative Works a copy of this License; and
-
-      (b) You must cause any modified files to carry prominent notices
-          stating that You changed the files; and
-
-      (c) You must retain, in the Source form of any Derivative Works
-          that You distribute, all copyright, patent, trademark, and
-          attribution notices from the Source form of the Work,
-          excluding those notices that do not pertain to any part of
-          the Derivative Works; and
-
-      (d) If the Work includes a "NOTICE" text file as part of its
-          distribution, then any Derivative Works that You distribute must
-          include a readable copy of the attribution notices contained
-          within such NOTICE file, excluding those notices that do not
-          pertain to any part of the Derivative Works, in at least one
-          of the following places: within a NOTICE text file distributed
-          as part of the Derivative Works; within the Source form or
-          documentation, if provided along with the Derivative Works; or,
-          within a display generated by the Derivative Works, if and
-          wherever such third-party notices normally appear. The contents
-          of the NOTICE file are for informational purposes only and
-          do not modify the License. You may add Your own attribution
-          notices within Derivative Works that You distribute, alongside
-          or as an addendum to the NOTICE text from the Work, provided
-          that such additional attribution notices cannot be construed
-          as modifying the License.
-
-      You may add Your own copyright statement to Your modifications and
-      may provide additional or different license terms and conditions
-      for use, reproduction, or distribution of Your modifications, or
-      for any such Derivative Works as a whole, provided Your use,
-      reproduction, and distribution of the Work otherwise complies with
-      the conditions stated in this License.
-
-   5. Submission of Contributions. Unless You explicitly state otherwise,
-      any Contribution intentionally submitted for inclusion in the Work
-      by You to the Licensor shall be under the terms and conditions of
-      this License, without any additional terms or conditions.
-      Notwithstanding the above, nothing herein shall supersede or modify
-      the terms of any separate license agreement you may have executed
-      with Licensor regarding such Contributions.
-
-   6. Trademarks. This License does not grant permission to use the trade
-      names, trademarks, service marks, or product names of the Licensor,
-      except as required for reasonable and customary use in describing the
-      origin of the Work and reproducing the content of the NOTICE file.
-
-   7. Disclaimer of Warranty. Unless required by applicable law or
-      agreed to in writing, Licensor provides the Work (and each
-      Contributor provides its Contributions) on an "AS IS" BASIS,
-      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
-      implied, including, without limitation, any warranties or conditions
-      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
-      PARTICULAR PURPOSE. You are solely responsible for determining the
-      appropriateness of using or redistributing the Work and assume any
-      risks associated with Your exercise of permissions under this License.
-
-   8. Limitation of Liability. In no event and under no legal theory,
-      whether in tort (including negligence), contract, or otherwise,
-      unless required by applicable law (such as deliberate and grossly
-      negligent acts) or agreed to in writing, shall any Contributor be
-      liable to You for damages, including any direct, indirect, special,
-      incidental, or consequential damages of any character arising as a
-      result of this License or out of the use or inability to use the
-      Work (including but not limited to damages for loss of goodwill,
-      work stoppage, computer failure or malfunction, or any and all
-      other commercial damages or losses), even if such Contributor
-      has been advised of the possibility of such damages.
-
-   9. Accepting Warranty or Additional Liability. While redistributing
-      the Work or Derivative Works thereof, You may choose to offer,
-      and charge a fee for, acceptance of support, warranty, indemnity,
-      or other liability obligations and/or rights consistent with this
-      License. However, in accepting such obligations, You may act only
-      on Your own behalf and on Your sole responsibility, not on behalf
-      of any other Contributor, and only if You agree to indemnify,
-      defend, and hold each Contributor harmless for any liability
-      incurred by, or claims asserted against, such Contributor by reason
-      of your accepting any such warranty or additional liability.
-
-   END OF TERMS AND CONDITIONS
-
diff --git a/apkbuilder/etc/apkbuilder b/apkbuilder/etc/apkbuilder
deleted file mode 100755
index 2116cdc..0000000
--- a/apkbuilder/etc/apkbuilder
+++ /dev/null
@@ -1,69 +0,0 @@
-#!/bin/sh
-# Copyright 2005-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.
-
-# Set up prog to be the path of this script, including following symlinks,
-# and set up progdir to be the fully-qualified pathname of its directory.
-prog="$0"
-while [ -h "${prog}" ]; do
-    newProg=`/bin/ls -ld "${prog}"`
-    newProg=`expr "${newProg}" : ".* -> \(.*\)$"`
-    if expr "x${newProg}" : 'x/' >/dev/null; then
-        prog="${newProg}"
-    else
-        progdir=`dirname "${prog}"`
-        prog="${progdir}/${newProg}"
-    fi
-done
-oldwd=`pwd`
-progdir=`dirname "${prog}"`
-cd "${progdir}"
-progdir=`pwd`
-prog="${progdir}"/`basename "${prog}"`
-cd "${oldwd}"
-
-jarfile=sdklib.jar
-frameworkdir="$progdir"
-if [ ! -r "$frameworkdir/$jarfile" ]
-then
-    frameworkdir=`dirname "$progdir"`/tools/lib
-fi
-if [ ! -r "$frameworkdir/$jarfile" ]
-then
-    frameworkdir=`dirname "$progdir"`/framework
-fi
-if [ ! -r "$frameworkdir/$jarfile" ]
-then
-    echo `basename "$prog"`": can't find $jarfile"
-    exit 1
-fi
-
-
-# Check args.
-if [ debug = "$1" ]; then
-    # add this in for debugging
-    java_debug=-agentlib:jdwp=transport=dt_socket,server=y,address=8050,suspend=y
-    shift 1
-else
-    java_debug=
-fi
-
-if [ "$OSTYPE" = "cygwin" ] ; then
-    jarpath=`cygpath -w  "$frameworkdir/$jarfile"`
-else
-    jarpath="$frameworkdir/$jarfile"
-fi
-
-# might need more memory, e.g. -Xmx128M
-exec java -Xmx128M $java_debug -classpath "$jarpath" com.android.sdklib.build.ApkBuilderMain "$@"
diff --git a/apkbuilder/etc/apkbuilder.bat b/apkbuilder/etc/apkbuilder.bat
deleted file mode 100755
index 3375b85..0000000
--- a/apkbuilder/etc/apkbuilder.bat
+++ /dev/null
@@ -1,45 +0,0 @@
-@echo off
-rem Copyright (C) 2007 The Android Open Source Project
-rem
-rem Licensed under the Apache License, Version 2.0 (the "License");
-rem you may not use this file except in compliance with the License.
-rem You may obtain a copy of the License at
-rem
-rem      http://www.apache.org/licenses/LICENSE-2.0
-rem
-rem Unless required by applicable law or agreed to in writing, software
-rem distributed under the License is distributed on an "AS IS" BASIS,
-rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-rem See the License for the specific language governing permissions and
-rem limitations under the License.
-
-rem don't modify the caller's environment
-setlocal
-
-rem Set up prog to be the path of this script, including following symlinks,
-rem and set up progdir to be the fully-qualified pathname of its directory.
-set prog=%~f0
-
-rem Change current directory and drive to where the script is, to avoid
-rem issues with directories containing whitespaces.
-cd /d %~dp0
-
-rem Check we have a valid Java.exe in the path.
-set java_exe=
-call lib\find_java.bat
-if not defined java_exe goto :EOF
-
-set jarfile=sdklib.jar
-set frameworkdir=.
-
-if exist %frameworkdir%\%jarfile% goto JarFileOk
-    set frameworkdir=lib
-
-if exist %frameworkdir%\%jarfile% goto JarFileOk
-    set frameworkdir=..\framework
-
-:JarFileOk
-
-set jarpath=%frameworkdir%\%jarfile%
-
-call "%java_exe%" -classpath "%jarpath%" com.android.sdklib.build.ApkBuilderMain %*
diff --git a/apkbuilder/readme.txt b/apkbuilder/readme.txt
deleted file mode 100644
index 1bb7bc8..0000000
--- a/apkbuilder/readme.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-The apkbuilder command line tool is deprecated, and is not maintained anymore.
-It is lacking recent build improvements such as support for Library Projects.
-
-Its source code has been moved into sdklib.
-It is recommended to directly use the com.android.sdklib.build.ApkBuilder class instead.
\ No newline at end of file
diff --git a/apps/.gitignore b/apps/.gitignore
deleted file mode 100644
index c3ae463..0000000
--- a/apps/.gitignore
+++ /dev/null
@@ -1,4 +0,0 @@
-bin
-gen
-local.properties
-
diff --git a/apps/NotificationStudio/.classpath b/apps/NotificationStudio/.classpath
deleted file mode 100644
index a4763d1..0000000
--- a/apps/NotificationStudio/.classpath
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="src" path="gen"/>
-	<classpathentry kind="con" path="com.android.ide.eclipse.adt.ANDROID_FRAMEWORK"/>
-	<classpathentry kind="con" path="com.android.ide.eclipse.adt.LIBRARIES"/>
-	<classpathentry kind="output" path="bin/classes"/>
-</classpath>
diff --git a/apps/NotificationStudio/.project b/apps/NotificationStudio/.project
deleted file mode 100644
index 00f0a21..0000000
--- a/apps/NotificationStudio/.project
+++ /dev/null
@@ -1,33 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>NotificationStudio</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>com.android.ide.eclipse.adt.ResourceManagerBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>com.android.ide.eclipse.adt.PreCompilerBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>com.android.ide.eclipse.adt.ApkBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>com.android.ide.eclipse.adt.AndroidNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/apps/NotificationStudio/.settings/org.eclipse.jdt.core.prefs b/apps/NotificationStudio/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index f77b31c..0000000
--- a/apps/NotificationStudio/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,4 +0,0 @@
-eclipse.preferences.version=1
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
-org.eclipse.jdt.core.compiler.compliance=1.5
-org.eclipse.jdt.core.compiler.source=1.5
diff --git a/apps/NotificationStudio/AndroidManifest.xml b/apps/NotificationStudio/AndroidManifest.xml
deleted file mode 100644
index cb849e0..0000000
--- a/apps/NotificationStudio/AndroidManifest.xml
+++ /dev/null
@@ -1,38 +0,0 @@
-<!--
-  Copyright 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.
-  -->
-
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
-    package="com.android.notificationstudio"
-    android:versionCode="5"
-    android:versionName="0.5" >
-
-    <uses-sdk android:targetSdkVersion="16" android:minSdkVersion="10" />
-
-    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
-
-    <application android:label="@string/app_name" >
-        <activity
-            android:name=".NotificationStudioActivity"
-            android:label="@string/app_name" >
-            <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/apps/NotificationStudio/libs/android-support-v4.jar b/apps/NotificationStudio/libs/android-support-v4.jar
deleted file mode 100644
index f92dea2..0000000
--- a/apps/NotificationStudio/libs/android-support-v4.jar
+++ /dev/null
Binary files differ
diff --git a/apps/NotificationStudio/project.properties b/apps/NotificationStudio/project.properties
deleted file mode 100644
index 9b84a6b..0000000
--- a/apps/NotificationStudio/project.properties
+++ /dev/null
@@ -1,14 +0,0 @@
-# This file is automatically generated by Android Tools.
-# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
-#
-# This file must be checked in Version Control Systems.
-#
-# To customize properties used by the Ant build system edit
-# "ant.properties", and override values to adapt the script to your
-# project structure.
-#
-# To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home):
-#proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt
-
-# Project target.
-target=android-16
diff --git a/apps/NotificationStudio/res/drawable-hdpi/android_logo.gif b/apps/NotificationStudio/res/drawable-hdpi/android_logo.gif
deleted file mode 100644
index 6078e86..0000000
--- a/apps/NotificationStudio/res/drawable-hdpi/android_logo.gif
+++ /dev/null
Binary files differ
diff --git a/apps/NotificationStudio/res/drawable-hdpi/ic_notification_multiple_mail_holo_dark.png b/apps/NotificationStudio/res/drawable-hdpi/ic_notification_multiple_mail_holo_dark.png
deleted file mode 100644
index c4f3648..0000000
--- a/apps/NotificationStudio/res/drawable-hdpi/ic_notification_multiple_mail_holo_dark.png
+++ /dev/null
Binary files differ
diff --git a/apps/NotificationStudio/res/drawable-hdpi/romain.jpg b/apps/NotificationStudio/res/drawable-hdpi/romain.jpg
deleted file mode 100644
index e932901..0000000
--- a/apps/NotificationStudio/res/drawable-hdpi/romain.jpg
+++ /dev/null
Binary files differ
diff --git a/apps/NotificationStudio/res/drawable-nodpi/icon_bg.xml b/apps/NotificationStudio/res/drawable-nodpi/icon_bg.xml
deleted file mode 100644
index dcecdd3..0000000
--- a/apps/NotificationStudio/res/drawable-nodpi/icon_bg.xml
+++ /dev/null
@@ -1,29 +0,0 @@
-<!--
-  Copyright 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.
-  -->
-
-<selector xmlns:android="http://schemas.android.com/apk/res/android">
-    <item android:state_selected="true">
-        <shape android:shape="rectangle">
-            <solid android:color="@color/icon_background" />
-            <stroke android:width="1px" android:color="@android:color/holo_blue_light" />
-        </shape>
-    </item>
-    <item>
-        <shape android:shape="rectangle">
-            <solid android:color="@color/icon_background" />
-        </shape>
-    </item>
-</selector>
\ No newline at end of file
diff --git a/apps/NotificationStudio/res/drawable-nodpi/romainguy_rockaway.jpg b/apps/NotificationStudio/res/drawable-nodpi/romainguy_rockaway.jpg
deleted file mode 100644
index 68473ba..0000000
--- a/apps/NotificationStudio/res/drawable-nodpi/romainguy_rockaway.jpg
+++ /dev/null
Binary files differ
diff --git a/apps/NotificationStudio/res/layout-v14/boolean_editor.xml b/apps/NotificationStudio/res/layout-v14/boolean_editor.xml
deleted file mode 100644
index ae77468..0000000
--- a/apps/NotificationStudio/res/layout-v14/boolean_editor.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-<!--
-  Copyright 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.
-  -->
-
-  <Switch xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="match_parent"
-    android:layout_height="wrap_content"
-    android:textSize="@dimen/editor_text_size"
-    android:visibility="gone" />
diff --git a/apps/NotificationStudio/res/layout-v16/studio.xml b/apps/NotificationStudio/res/layout-v16/studio.xml
deleted file mode 100644
index 083ac79..0000000
--- a/apps/NotificationStudio/res/layout-v16/studio.xml
+++ /dev/null
@@ -1,33 +0,0 @@
-<!--
-  Copyright 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.
-  -->
-
-<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent">
-
-    <com.android.notificationstudio.MaxHeightScrollView
-        android:id="@+id/preview_scroller"
-        android:layout_width="@dimen/notification_panel_width"
-        android:layout_height="wrap_content"
-        android:layout_gravity="center_horizontal"
-        android:layout_marginBottom="5dp" >
-
-        <include layout="@layout/preview" />
-    </com.android.notificationstudio.MaxHeightScrollView>
-
-    <include layout="@layout/editors" />
-
-</FrameLayout>
\ No newline at end of file
diff --git a/apps/NotificationStudio/res/layout-w801dp/studio.xml b/apps/NotificationStudio/res/layout-w801dp/studio.xml
deleted file mode 100644
index 0391f8b..0000000
--- a/apps/NotificationStudio/res/layout-w801dp/studio.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-<!--
-  Copyright 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.
-  -->
-
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent" >
-
-    <include
-        android:layout_width="@dimen/notification_panel_width"
-        android:layout_height="match_parent"
-        layout="@layout/preview" />
-
-    <include layout="@layout/editors" />
-
-</LinearLayout>
\ No newline at end of file
diff --git a/apps/NotificationStudio/res/layout/boolean_editor.xml b/apps/NotificationStudio/res/layout/boolean_editor.xml
deleted file mode 100644
index e482322..0000000
--- a/apps/NotificationStudio/res/layout/boolean_editor.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<!--
-  Copyright 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.
-  -->
-
-<View xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="match_parent"
-    android:layout_height="wrap_content"
-    android:visibility="gone" />
diff --git a/apps/NotificationStudio/res/layout/divider.xml b/apps/NotificationStudio/res/layout/divider.xml
deleted file mode 100644
index d2e20f8..0000000
--- a/apps/NotificationStudio/res/layout/divider.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<!--
-  Copyright 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.
-  -->
-
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="match_parent"
-    android:layout_height="wrap_content"
-    android:orientation="vertical" >
-
-    <TextView
-        android:id="@+id/divider_text"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_marginLeft="@dimen/editor_inset"
-        android:layout_marginTop="3dp"
-        android:textAllCaps="true"
-        android:textColor="@color/divider_text"
-        android:textSize="@dimen/editor_text_size" />
-
-    <View
-        android:layout_width="match_parent"
-        android:layout_height="1dp"
-        android:layout_marginLeft="@dimen/editor_inset"
-        android:layout_marginRight="@dimen/editor_inset"
-        android:layout_marginTop="3dp"
-        android:background="@color/divider_text" />
-
-</LinearLayout>
\ No newline at end of file
diff --git a/apps/NotificationStudio/res/layout/editable_item.xml b/apps/NotificationStudio/res/layout/editable_item.xml
deleted file mode 100644
index 816dd0f..0000000
--- a/apps/NotificationStudio/res/layout/editable_item.xml
+++ /dev/null
@@ -1,111 +0,0 @@
-<!--
-  Copyright 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.
-  -->
-
-<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:id="@+id/list_item_text"
-    android:layout_width="match_parent"
-    android:layout_height="wrap_content"
-    android:padding="@dimen/editor_inset" >
-
-    <TextView
-        android:id="@+id/caption"
-        android:layout_width="@dimen/editor_caption_width"
-        android:layout_height="wrap_content"
-        android:paddingBottom="@dimen/caption_padding_bottom"
-        android:paddingTop="@dimen/caption_padding_top"
-        android:textSize="@dimen/editor_text_size" />
-
-    <EditText
-        android:id="@+id/text_editor"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:layout_alignBaseline="@id/caption"
-        android:layout_toRightOf="@id/caption"
-        android:imeOptions="actionDone"
-        android:inputType="text"
-        android:paddingTop="0dp"
-        android:textSize="@dimen/editor_text_size"
-        android:visibility="gone" />
-
-    <View
-        android:layout_width="0px"
-        android:layout_height="0px"
-        android:focusable="true"
-        android:focusableInTouchMode="true" />
-
-    <ViewStub
-        android:id="@+id/boolean_editor_stub"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:layout_alignBaseline="@id/caption"
-        android:layout_toRightOf="@id/caption"
-        android:textSize="@dimen/editor_text_size"
-        android:visibility="gone" />
-
-    <Spinner
-        android:id="@+id/drop_down_editor"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:layout_alignBaseline="@id/caption"
-        android:layout_toRightOf="@id/caption"
-        android:focusable="true"
-        android:focusableInTouchMode="true"
-        android:visibility="gone" />
-
-    <HorizontalScrollView
-        android:id="@+id/icon_editor_scroller"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:layout_toRightOf="@id/caption"
-        android:scrollbars="none"
-        android:visibility="gone" >
-
-        <LinearLayout
-            android:id="@+id/icon_editor_layout"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content" >
-        </LinearLayout>
-    </HorizontalScrollView>
-
-    <Button
-        android:id="@+id/date_button"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_alignBaseline="@id/caption"
-        android:layout_toRightOf="@id/caption"
-        android:textSize="@dimen/editor_text_size"
-        android:visibility="gone" />
-
-    <Button
-        android:id="@+id/time_button"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_alignBaseline="@id/caption"
-        android:layout_toRightOf="@id/date_button"
-        android:textSize="@dimen/editor_text_size"
-        android:visibility="gone" />
-
-    <Button
-        android:id="@+id/reset_button"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_alignBaseline="@id/caption"
-        android:layout_toRightOf="@id/time_button"
-        android:text="@string/now"
-        android:textSize="@dimen/editor_text_size"
-        android:visibility="gone" />
-
-</RelativeLayout>
\ No newline at end of file
diff --git a/apps/NotificationStudio/res/layout/editors.xml b/apps/NotificationStudio/res/layout/editors.xml
deleted file mode 100644
index 7c7e120..0000000
--- a/apps/NotificationStudio/res/layout/editors.xml
+++ /dev/null
@@ -1,29 +0,0 @@
-<!--
-  Copyright 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.
-  -->
-
-<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
-    android:id="@+id/editors"
-    android:layout_width="match_parent"
-    android:layout_height="wrap_content"
-    android:background="@android:color/black" >
-
-    <LinearLayout
-        android:id="@+id/items"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:orientation="vertical" />
-
-</ScrollView>
\ No newline at end of file
diff --git a/apps/NotificationStudio/res/layout/preview.xml b/apps/NotificationStudio/res/layout/preview.xml
deleted file mode 100644
index 3d9c7a0..0000000
--- a/apps/NotificationStudio/res/layout/preview.xml
+++ /dev/null
@@ -1,56 +0,0 @@
-<!--
-  Copyright 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.
--->
-
-<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:tools="http://schemas.android.com/tools"
-    android:id="@+id/preview"
-    android:layout_width="match_parent"
-    android:layout_height="wrap_content" >
-
-    <FrameLayout
-        android:id="@+id/ticker"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:visibility="gone" />
-
-    <ImageView
-        android:id="@+id/large_icon"
-        android:layout_width="@android:dimen/notification_large_icon_width"
-        android:layout_height="@android:dimen/notification_large_icon_height"
-        android:layout_alignParentLeft="true"
-        android:layout_below="@id/ticker"
-        android:scaleType="center"
-        android:visibility="gone"
-        tools:ignore="ContentDescription" />
-
-    <FrameLayout
-        android:id="@+id/oneU"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:layout_below="@id/ticker"
-        android:layout_marginTop="5dp"
-        android:layout_toRightOf="@id/large_icon"
-        android:visibility="gone" />
-
-    <FrameLayout
-        android:id="@+id/fourU"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:layout_below="@id/oneU"
-        android:layout_marginTop="5dp"
-        android:visibility="gone" />
-
-</RelativeLayout>
\ No newline at end of file
diff --git a/apps/NotificationStudio/res/layout/studio.xml b/apps/NotificationStudio/res/layout/studio.xml
deleted file mode 100644
index 2646a44..0000000
--- a/apps/NotificationStudio/res/layout/studio.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<!--
-  Copyright 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.
-  -->
-
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    android:orientation="vertical" >
-
-    <include layout="@layout/preview" />
-
-    <include layout="@layout/editors" />
-
-</LinearLayout>
\ No newline at end of file
diff --git a/apps/NotificationStudio/res/menu/action_bar.xml b/apps/NotificationStudio/res/menu/action_bar.xml
deleted file mode 100644
index 35c897f..0000000
--- a/apps/NotificationStudio/res/menu/action_bar.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-<!--
-  Copyright 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.
-  -->
-
-<menu xmlns:android="http://schemas.android.com/apk/res/android" >
-
-    <item
-        android:id="@+id/action_share_code"
-        android:icon="@android:drawable/ic_menu_share"
-        android:showAsAction="never"
-        android:title="@string/share_generated_code"/>
-    <item
-        android:id="@+id/action_share_mockup"
-        android:icon="@android:drawable/ic_menu_share"
-        android:showAsAction="never"
-        android:title="@string/share_mockup"/>
-
-</menu>
\ No newline at end of file
diff --git a/apps/NotificationStudio/res/values-sw600dp/dimens.xml b/apps/NotificationStudio/res/values-sw600dp/dimens.xml
deleted file mode 100644
index 22e863f..0000000
--- a/apps/NotificationStudio/res/values-sw600dp/dimens.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<!--
-  Copyright 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.
-  -->
-
-<resources>
-
-    <dimen name="notification_panel_width">446dp</dimen>
-    <dimen name="caption_padding_bottom">6dp</dimen>
-    <dimen name="editor_text_size">16dp</dimen>
-    <dimen name="editor_caption_width">110dp</dimen>
-
-</resources>
\ No newline at end of file
diff --git a/apps/NotificationStudio/res/values-sw720dp/dimens.xml b/apps/NotificationStudio/res/values-sw720dp/dimens.xml
deleted file mode 100644
index f896047..0000000
--- a/apps/NotificationStudio/res/values-sw720dp/dimens.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-<!--
-  Copyright 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.
-  -->
-
-<resources>
-
-    <dimen name="notification_panel_width">448dp</dimen>
-
-</resources>
\ No newline at end of file
diff --git a/apps/NotificationStudio/res/values-v11/colors.xml b/apps/NotificationStudio/res/values-v11/colors.xml
deleted file mode 100644
index 224b09e..0000000
--- a/apps/NotificationStudio/res/values-v11/colors.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-<!--
-  Copyright 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.
--->
-
-<resources>
-
-    <color name="divider_text">@android:color/holo_blue_bright</color>
-
-</resources>
\ No newline at end of file
diff --git a/apps/NotificationStudio/res/values-v11/dimens.xml b/apps/NotificationStudio/res/values-v11/dimens.xml
deleted file mode 100644
index f5fd098..0000000
--- a/apps/NotificationStudio/res/values-v11/dimens.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-<!--
-  Copyright 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.
--->
-
-<resources>
-
-    <dimen name="caption_padding_top">6dp</dimen>
-
-</resources>
\ No newline at end of file
diff --git a/apps/NotificationStudio/res/values/colors.xml b/apps/NotificationStudio/res/values/colors.xml
deleted file mode 100644
index aabe9bc..0000000
--- a/apps/NotificationStudio/res/values/colors.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<!--
-  Copyright 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.
--->
-
-<resources>
-
-    <color name="gb_background">#dddddd</color>
-    <color name="divider_text">#dddddd</color>
-    <color name="icon_background">#3333B5E5</color>
-
-</resources>
\ No newline at end of file
diff --git a/apps/NotificationStudio/res/values/dimens.xml b/apps/NotificationStudio/res/values/dimens.xml
deleted file mode 100644
index e960ae6..0000000
--- a/apps/NotificationStudio/res/values/dimens.xml
+++ /dev/null
@@ -1,33 +0,0 @@
-<!--
-  Copyright 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.
-  -->
-
-<resources>
-
-    <dimen name="notification_panel_width">-1dp</dimen> <!-- MATCH_PARENT -->
-    <dimen name="editor_inset">8dp</dimen>
-    <dimen name="caption_padding_top">10dp</dimen>
-    <dimen name="caption_padding_bottom">0dp</dimen>
-    <dimen name="editor_text_size">12dp</dimen>
-    <dimen name="editor_caption_width">95dp</dimen>
-    <dimen name="editor_icon_size_small">40dp</dimen>
-    <dimen name="editor_icon_size_large">60dp</dimen>
-    <dimen name="editor_icon_outer_margin">5dp</dimen>
-    <dimen name="editor_icon_inner_margin">2dp</dimen>
-    <dimen name="editor_drop_down_padding">5dp</dimen>
-    <dimen name="editor_datetime_padding_v">0dp</dimen>
-    <dimen name="editor_datetime_padding_h">15dp</dimen>
-
-</resources>
\ No newline at end of file
diff --git a/apps/NotificationStudio/res/values/strings.xml b/apps/NotificationStudio/res/values/strings.xml
deleted file mode 100644
index e3990f3..0000000
--- a/apps/NotificationStudio/res/values/strings.xml
+++ /dev/null
@@ -1,55 +0,0 @@
-<!--
-  Copyright 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.
--->
-
-<resources>
-
-    <string name="app_name">Notification Studio</string>
-    <string name="now">Now</string>
-    <string name="share_generated_code">Share generated code…</string>
-    <string name="share_mockup">Share mockup…</string>
-    <string name="preset">Preset</string>
-    <string name="small_icon">Small Icon</string>
-    <string name="content_title">Content Title</string>
-    <string name="content_text">Content Text</string>
-    <string name="sub_text">Sub Text</string>
-    <string name="large_icon">Large Icon</string>
-    <string name="content_info">Content Info</string>
-    <string name="number">Number</string>
-    <string name="when">When</string>
-    <string name="progress">Progress</string>
-    <string name="uses_chron">Uses Chron</string>
-    <string name="style">Style</string>
-    <string name="picture">Picture</string>
-    <string name="big_text">Big Text</string>
-    <string name="lines">Lines</string>
-    <string name="big_content_title">Big Content Title</string>
-    <string name="summary_text">Summary Text</string>
-    <string name="icon">Icon</string>
-    <string name="text">Text</string>
-    <string name="properties">Properties</string>
-    <string name="action_1">Action 1</string>
-    <string name="action_2">Action 2</string>
-    <string name="action_3">Action 3</string>
-    <string name="preset_custom">(custom)</string>
-    <string name="preset_basic">Basic example</string>
-    <string name="preset_email">Email example</string>
-    <string name="preset_photo">Photo example</string>
-    <string name="style_none">(none)</string>
-    <string name="style_big_picture">BigPictureStyle</string>
-    <string name="style_big_text">BigTextStyle</string>
-    <string name="style_inbox">InboxStyle</string>
-
-</resources>
\ No newline at end of file
diff --git a/apps/NotificationStudio/src/com/android/notificationstudio/MaxHeightScrollView.java b/apps/NotificationStudio/src/com/android/notificationstudio/MaxHeightScrollView.java
deleted file mode 100644
index 1fc0284..0000000
--- a/apps/NotificationStudio/src/com/android/notificationstudio/MaxHeightScrollView.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Copyright 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.notificationstudio;
-
-import android.content.Context;
-import android.util.AttributeSet;
-import android.widget.ScrollView;
-
-public class MaxHeightScrollView extends ScrollView {
-
-    private int mMaxHeight;
-
-    public MaxHeightScrollView(Context context, AttributeSet attrs) {
-        super(context, attrs);
-    }
-
-    public void setMaxHeight(int maxHeight) {
-        mMaxHeight = maxHeight;
-    }
-
-    @Override
-    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
-        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
-        setMeasuredDimension(getMeasuredWidth(), Math.min(getMeasuredHeight(), mMaxHeight));
-    }
-
-}
diff --git a/apps/NotificationStudio/src/com/android/notificationstudio/NotificationStudioActivity.java b/apps/NotificationStudio/src/com/android/notificationstudio/NotificationStudioActivity.java
deleted file mode 100644
index 9c2e811..0000000
--- a/apps/NotificationStudio/src/com/android/notificationstudio/NotificationStudioActivity.java
+++ /dev/null
@@ -1,249 +0,0 @@
-/*
- * Copyright 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.notificationstudio;
-
-import android.animation.Animator;
-import android.animation.AnimatorListenerAdapter;
-import android.app.Activity;
-import android.app.Notification;
-import android.app.NotificationManager;
-import android.content.Context;
-import android.os.Build;
-import android.os.Bundle;
-import android.os.Handler;
-import android.util.DisplayMetrics;
-import android.util.Log;
-import android.view.Menu;
-import android.view.MenuInflater;
-import android.view.MenuItem;
-import android.view.MotionEvent;
-import android.view.View;
-import android.view.View.OnLayoutChangeListener;
-import android.view.ViewGroup;
-import android.view.inputmethod.InputMethodManager;
-import android.widget.EditText;
-import android.widget.FrameLayout;
-import android.widget.FrameLayout.LayoutParams;
-import android.widget.ImageView;
-import android.widget.LinearLayout;
-import android.widget.RemoteViews;
-import android.widget.TextView;
-
-import com.android.notificationstudio.action.ShareCodeAction;
-import com.android.notificationstudio.action.ShareMockupAction;
-import com.android.notificationstudio.editor.Editors;
-import com.android.notificationstudio.generator.NotificationGenerator;
-import com.android.notificationstudio.model.EditableItem;
-import com.android.notificationstudio.model.EditableItemConstants;
-
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
-
-public class NotificationStudioActivity extends Activity implements EditableItemConstants{
-    private static final String TAG = NotificationStudioActivity.class.getSimpleName();
-    private static final int PREVIEW_NOTIFICATION = 1;
-    private static final int REFRESH_DELAY = 50;
-    private static final ExecutorService BACKGROUND = Executors.newSingleThreadExecutor();
-
-    private boolean mRefreshPending;
-
-    private final Handler mHandler = new Handler();
-    private final Runnable mRefreshNotificationInner = new Runnable() {
-        public void run() {
-            refreshNotificationInner();
-        }};
-
-    @Override
-    public void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-
-        getWindow().setBackgroundDrawableResource(android.R.color.black);
-        setContentView(R.layout.studio);
-        initPreviewScroller();
-
-        EditableItem.initIfNecessary(this);
-
-        initEditors();
-    }
-
-    private void initPreviewScroller() {
-
-        MaxHeightScrollView preview = (MaxHeightScrollView) findViewById(R.id.preview_scroller);
-        if (preview == null)
-            return;
-        final int margin = ((ViewGroup.MarginLayoutParams) preview.getLayoutParams()).bottomMargin;
-        preview.addOnLayoutChangeListener(new OnLayoutChangeListener(){
-            public void onLayoutChange(View v, int left, int top, int right, int bottom,
-                    int oldLeft, int oldTop, int oldRight, int oldBottom) {
-                // animate preview height changes
-                if (oldBottom != bottom) {
-                    final View e = findViewById(R.id.editors);
-                    final int y = bottom + margin;
-                    e.animate()
-                        .translationY(y - oldBottom)
-                        .setListener(new AnimatorListenerAdapter() {
-                            public void onAnimationEnd(Animator animation) {
-                                FrameLayout.LayoutParams lp = (LayoutParams) e.getLayoutParams();
-                                lp.topMargin = y;
-                                e.setTranslationY(0);
-                                e.setLayoutParams(lp);
-                            }
-                        });
-                }
-            }});
-
-        // limit the max height for preview, leave room for editors + soft keyboard
-        DisplayMetrics dm = new DisplayMetrics();
-        getWindowManager().getDefaultDisplay().getMetrics(dm);
-        float actualHeight = dm.heightPixels / dm.ydpi;
-        float pct = actualHeight < 3.5 ? .32f :
-                    actualHeight < 4 ? .35f :
-                    .38f;
-        preview.setMaxHeight((int)(dm.heightPixels * pct));
-    }
-
-    private void initEditors() {
-        LinearLayout items = (LinearLayout) findViewById(R.id.items);
-        items.removeAllViews();
-        String currentCategory = null;
-        for (EditableItem item : EditableItem.values()) {
-            String itemCategory = item.getCategory(this);
-            if (!itemCategory.equals(currentCategory)) {
-                View dividerView = getLayoutInflater().inflate(R.layout.divider, null);
-                ((TextView) dividerView.findViewById(R.id.divider_text)).setText(itemCategory);
-                items.addView(dividerView);
-                currentCategory = itemCategory;
-            }
-            View editorView = Editors.newEditor(this, items, item);
-            if (editorView != null)
-                items.addView(editorView);
-        }
-        refreshNotification();
-    }
-
-    @Override
-    protected void onRestoreInstanceState(Bundle savedInstanceState) {
-       // we'll take care of restoring state
-    }
-
-    public void refreshNotification() {
-        mRefreshPending = true;
-        mHandler.postDelayed(mRefreshNotificationInner, REFRESH_DELAY);
-    }
-
-    private void refreshNotificationInner() {
-        if (!mRefreshPending) {
-            return;
-        }
-        final Notification notification = NotificationGenerator.build(this);
-        ViewGroup oneU = (ViewGroup) findViewById(R.id.oneU);
-        ViewGroup fourU = (ViewGroup) findViewById(R.id.fourU);
-        View oneUView = refreshRemoteViews(oneU, notification.contentView);
-        if (Build.VERSION.SDK_INT >= 16)
-            refreshRemoteViews(fourU, notification.bigContentView);
-        else if (Build.VERSION.SDK_INT >= 11) {
-            ImageView largeIcon = (ImageView) findViewById(R.id.large_icon);
-            largeIcon.setVisibility(notification.largeIcon == null ? View.GONE : View.VISIBLE);
-            if (notification.largeIcon != null)
-                largeIcon.setImageBitmap(notification.largeIcon);
-        } else if (oneUView != null) {
-            oneUView.setBackgroundColor(getResources().getColor(R.color.gb_background));
-            oneUView.setMinimumHeight(100);
-        }
-        mRefreshPending = false;
-
-        // this can take a while, run on a background thread
-        BACKGROUND.submit(new Runnable() {
-            public void run() {
-                NotificationManager mgr =
-                        (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
-                try {
-                    mgr.notify(PREVIEW_NOTIFICATION, notification);
-                } catch (Throwable t) {
-                    Log.w(TAG, "Error displaying notification", t);
-                }
-            }});
-    }
-
-    private View refreshRemoteViews(ViewGroup parent, RemoteViews remoteViews) {
-        parent.removeAllViews();
-        if (remoteViews != null) {
-            parent.setVisibility(View.VISIBLE);
-            try {
-                View v = remoteViews.apply(this, parent);
-                parent.addView(v);
-                return v;
-            } catch (Exception e) {
-                TextView exceptionView = new TextView(this);
-                exceptionView.setText(e.getClass().getSimpleName() + ": " + e.getMessage());
-                parent.addView(exceptionView);
-                return exceptionView;
-            }
-        } else {
-            parent.setVisibility(View.GONE);
-            return null;
-        }
-    }
-
-    // action bar setup
-    @Override
-    public boolean onCreateOptionsMenu(Menu menu) {
-        MenuInflater inflater = getMenuInflater();
-        inflater.inflate(R.menu.action_bar, menu);
-        return true;
-    }
-
-    @Override
-    public boolean onOptionsItemSelected(MenuItem item) {
-        switch (item.getItemId()) {
-            case R.id.action_share_code:
-                ShareCodeAction.launch(this, item.getTitle());
-                return true;
-            case R.id.action_share_mockup:
-                ShareMockupAction.launch(this, item.getTitle());
-                return true;
-        }
-        return false;
-    }
-
-    // hides the soft keyboard more aggressively when leaving text editors
-    @Override
-    public boolean dispatchTouchEvent(MotionEvent event) {
-        View v = getCurrentFocus();
-        boolean ret = super.dispatchTouchEvent(event);
-
-        if (v instanceof EditText) {
-            View currentFocus = getCurrentFocus();
-            int screenCoords[] = new int[2];
-            currentFocus.getLocationOnScreen(screenCoords);
-            float x = event.getRawX() + currentFocus.getLeft() - screenCoords[0];
-            float y = event.getRawY() + currentFocus.getTop() - screenCoords[1];
-
-            if (event.getAction() == MotionEvent.ACTION_UP
-                    && (x < currentFocus.getLeft() ||
-                        x >= currentFocus.getRight() ||
-                        y < currentFocus.getTop() ||
-                        y > currentFocus.getBottom())) {
-                InputMethodManager imm =
-                    (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
-                imm.hideSoftInputFromWindow(getWindow().getCurrentFocus().getWindowToken(), 0);
-            }
-        }
-        return ret;
-    }
-
-}
diff --git a/apps/NotificationStudio/src/com/android/notificationstudio/action/ShareCodeAction.java b/apps/NotificationStudio/src/com/android/notificationstudio/action/ShareCodeAction.java
deleted file mode 100644
index d7da434..0000000
--- a/apps/NotificationStudio/src/com/android/notificationstudio/action/ShareCodeAction.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Copyright 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.notificationstudio.action;
-
-import android.content.Context;
-import android.content.Intent;
-
-import com.android.notificationstudio.generator.CodeGenerator;
-
-public class ShareCodeAction {
-
-    public static void launch(Context context, CharSequence title) {
-        String shareBody = CodeGenerator.generate(context);
-        Intent sharingIntent = new Intent(android.content.Intent.ACTION_SEND);
-            sharingIntent.setType("text/plain");
-            sharingIntent.putExtra(android.content.Intent.EXTRA_SUBJECT, "Notification Code");
-            sharingIntent.putExtra(android.content.Intent.EXTRA_TEXT, shareBody);
-            context.startActivity(Intent.createChooser(sharingIntent, title));
-    }
-
-}
diff --git a/apps/NotificationStudio/src/com/android/notificationstudio/action/ShareMockupAction.java b/apps/NotificationStudio/src/com/android/notificationstudio/action/ShareMockupAction.java
deleted file mode 100644
index e377475..0000000
--- a/apps/NotificationStudio/src/com/android/notificationstudio/action/ShareMockupAction.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * Copyright 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.notificationstudio.action;
-
-import android.app.Activity;
-import android.content.Intent;
-import android.graphics.Bitmap;
-import android.graphics.Canvas;
-import android.net.Uri;
-import android.util.Log;
-import android.view.View;
-import android.widget.Toast;
-
-import com.android.notificationstudio.R;
-
-import java.io.ByteArrayOutputStream;
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.text.SimpleDateFormat;
-import java.util.Date;
-
-public class ShareMockupAction {
-    private static final String TAG = ShareMockupAction.class.getSimpleName();
-
-    private static final SimpleDateFormat FILE_NAME =
-            new SimpleDateFormat("'notification.'yyyyMMdd'.'HHmmss'.png'");
-
-    public static void launch(Activity activity, CharSequence title) {
-        // take a picture of the current mockup
-        View v = activity.findViewById(R.id.preview);
-        int w = v.getMeasuredWidth();
-        int h = v.getMeasuredHeight();
-        Bitmap mockup = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
-        Canvas c = new Canvas(mockup);
-        v.layout(0, 0, w, h);
-        v.draw(c);
-
-        // write the mockup to a temp file
-        ByteArrayOutputStream bytes = new ByteArrayOutputStream();
-        mockup.compress(Bitmap.CompressFormat.PNG, 100, bytes);
-        File f = new File(activity.getExternalCacheDir(), FILE_NAME.format(new Date()));
-        FileOutputStream fo = null;
-        try {
-            f.createNewFile();
-            fo = new FileOutputStream(f);
-            fo.write(bytes.toByteArray());
-        } catch (IOException e) {
-            String msg = "Error writing mockup file";
-            Log.w(TAG, msg, e);
-            Toast.makeText(activity, msg, Toast.LENGTH_SHORT).show();
-            return;
-        } finally {
-            if (fo != null)
-               try { fo.close(); } catch (Exception e) { }
-        }
-
-        // launch intent to send the mockup image
-        Intent share = new Intent(Intent.ACTION_SEND);
-        share.setType("image/png");
-        share.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(f.getAbsoluteFile()));
-        activity.startActivity(Intent.createChooser(share, title));
-    }
-
-}
diff --git a/apps/NotificationStudio/src/com/android/notificationstudio/editor/BitmapEditor.java b/apps/NotificationStudio/src/com/android/notificationstudio/editor/BitmapEditor.java
deleted file mode 100644
index 04194ac..0000000
--- a/apps/NotificationStudio/src/com/android/notificationstudio/editor/BitmapEditor.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Copyright 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.notificationstudio.editor;
-
-import android.content.res.Resources;
-import android.graphics.Bitmap;
-import android.widget.ImageView;
-
-import com.android.notificationstudio.R;
-
-public class BitmapEditor extends IconEditor {
-
-    @Override
-    protected void setImage(ImageView imageView, Object value) {
-        imageView.setImageBitmap((Bitmap) value);
-    }
-
-    protected int getIconSize(Resources res) {
-        return res.getDimensionPixelSize(R.dimen.editor_icon_size_large);
-    }
-
-}
diff --git a/apps/NotificationStudio/src/com/android/notificationstudio/editor/BooleanEditor.java b/apps/NotificationStudio/src/com/android/notificationstudio/editor/BooleanEditor.java
deleted file mode 100644
index 6a6a8cf..0000000
--- a/apps/NotificationStudio/src/com/android/notificationstudio/editor/BooleanEditor.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Copyright 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.notificationstudio.editor;
-
-import android.view.View;
-import android.view.ViewStub;
-import android.widget.CompoundButton;
-import android.widget.CompoundButton.OnCheckedChangeListener;
-import android.widget.Switch;
-
-import com.android.notificationstudio.R;
-import com.android.notificationstudio.editor.Editors.Editor;
-import com.android.notificationstudio.model.EditableItem;
-
-public class BooleanEditor implements Editor {
-
-    public Runnable bindEditor(View v, final EditableItem item, final Runnable afterChange) {
-        final ViewStub booleanEditorStub = (ViewStub) v.findViewById(R.id.boolean_editor_stub);
-        booleanEditorStub.setLayoutResource(R.layout.boolean_editor);
-        final Switch booleanEditor = (Switch) booleanEditorStub.inflate();
-        Runnable updateSwitch = new Runnable() {
-            public void run() {
-                booleanEditor.setChecked(item.hasValue() && item.getValueBool());
-            }};
-        booleanEditor.setVisibility(View.VISIBLE);
-        updateSwitch.run();
-        booleanEditor.setOnCheckedChangeListener(new OnCheckedChangeListener(){
-            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
-                item.setValue(isChecked);
-                afterChange.run();
-            }});
-        return updateSwitch;
-    }
-
-}
\ No newline at end of file
diff --git a/apps/NotificationStudio/src/com/android/notificationstudio/editor/DateTimeEditor.java b/apps/NotificationStudio/src/com/android/notificationstudio/editor/DateTimeEditor.java
deleted file mode 100644
index 8089de1..0000000
--- a/apps/NotificationStudio/src/com/android/notificationstudio/editor/DateTimeEditor.java
+++ /dev/null
@@ -1,139 +0,0 @@
-/*
- * Copyright 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.notificationstudio.editor;
-
-import android.app.Activity;
-import android.app.DatePickerDialog;
-import android.app.DatePickerDialog.OnDateSetListener;
-import android.app.Dialog;
-import android.app.DialogFragment;
-import android.app.FragmentTransaction;
-import android.app.TimePickerDialog;
-import android.app.TimePickerDialog.OnTimeSetListener;
-import android.os.Bundle;
-import android.view.View;
-import android.view.View.OnClickListener;
-import android.widget.Button;
-import android.widget.DatePicker;
-import android.widget.TimePicker;
-
-import com.android.notificationstudio.R;
-import com.android.notificationstudio.editor.Editors.Editor;
-import com.android.notificationstudio.model.EditableItem;
-
-import java.text.SimpleDateFormat;
-import java.util.Date;
-
-public class DateTimeEditor implements Editor {
-    private static final SimpleDateFormat YYYY_MM_DD = new SimpleDateFormat("yyyy/MM/dd");
-    private static final SimpleDateFormat HH_MM_SS = new SimpleDateFormat("HH:mm:ss");
-
-    @SuppressWarnings("deprecation")
-    public Runnable bindEditor(View v, final EditableItem item, final Runnable afterChange) {
-
-        final Button dateButton = (Button) v.findViewById(R.id.date_button);
-        final Button timeButton = (Button) v.findViewById(R.id.time_button);
-        final Button resetButton = (Button) v.findViewById(R.id.reset_button);
-
-        int vPad = v.getResources().getDimensionPixelSize(R.dimen.editor_datetime_padding_v);
-        int hPad = v.getResources().getDimensionPixelSize(R.dimen.editor_datetime_padding_h);
-        for (Button b : new Button[] { dateButton, timeButton, resetButton }) {
-            b.setVisibility(View.VISIBLE);
-            b.setPadding(hPad, vPad, hPad, vPad);
-        }
-
-        final Runnable updateButtonText = new Runnable() {
-            public void run() {
-                Date d = getDateTime(item);
-                String dateString = YYYY_MM_DD.format(d);
-                dateButton.setText(dateString);
-                String timeString = HH_MM_SS.format(d);
-                timeButton.setText(timeString);
-            }};
-        updateButtonText.run();
-
-        // wire up date button
-        DialogFragment datePickerFragment = new DialogFragment() {
-            @Override
-            public Dialog onCreateDialog(Bundle savedInstanceState) {
-                Date d = getDateTime(item);
-                OnDateSetListener onDateSet = new OnDateSetListener() {
-                    public void onDateSet(DatePicker view, int year,
-                            int monthOfYear, int dayOfMonth) {
-                        Date d = getDateTime(item);
-                        d.setYear(year - 1900);
-                        d.setMonth(monthOfYear);
-                        d.setDate(dayOfMonth);
-                        item.setValue(d.getTime());
-                        updateButtonText.run();
-                        afterChange.run();
-                    }
-                };
-                return new DatePickerDialog(getActivity(), onDateSet,
-                        d.getYear() + 1900, d.getMonth(), d.getDate());
-            }
-        };
-        Activity activity = (Activity) v.getContext();
-        launchDialogOnClick(activity, "datePicker", dateButton, datePickerFragment);
-
-        // wire up time button
-        DialogFragment timePickerFragment = new DialogFragment() {
-            @Override
-            public Dialog onCreateDialog(Bundle savedInstanceState) {
-                Date d = getDateTime(item);
-                OnTimeSetListener onTimeSet = new OnTimeSetListener() {
-                    public void onTimeSet(TimePicker view, int hourOfDay,
-                            int minute) {
-                        Date d = getDateTime(item);
-                        d.setHours(hourOfDay);
-                        d.setMinutes(minute);
-                        item.setValue(d.getTime());
-                        updateButtonText.run();
-                        afterChange.run();
-                    }
-                };
-                return new TimePickerDialog(getActivity(),
-                        onTimeSet, d.getHours(), d.getMinutes(), true);
-            }
-        };
-        launchDialogOnClick(activity, "timePicker", timeButton, timePickerFragment);
-
-        // wire up reset button
-        resetButton.setOnClickListener(new OnClickListener(){
-            public void onClick(View v) {
-                item.setValue(null);
-                updateButtonText.run();
-                afterChange.run();
-            }});
-        return updateButtonText;
-    }
-
-    private static Date getDateTime(EditableItem item) {
-        long value = item.hasValue() ? item.getValueLong() : System.currentTimeMillis();
-        return new Date(value);
-    }
-
-    private static void launchDialogOnClick(final Activity activity,
-            final String tag, Button button, final DialogFragment fragment) {
-        button.setOnClickListener(new OnClickListener(){
-            public void onClick(View v) {
-                FragmentTransaction ft = activity.getFragmentManager().beginTransaction();
-                fragment.show(ft, tag);
-            }});
-    }
-
-}
diff --git a/apps/NotificationStudio/src/com/android/notificationstudio/editor/DropDownEditor.java b/apps/NotificationStudio/src/com/android/notificationstudio/editor/DropDownEditor.java
deleted file mode 100644
index 64490fa..0000000
--- a/apps/NotificationStudio/src/com/android/notificationstudio/editor/DropDownEditor.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- * Copyright 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.notificationstudio.editor;
-
-import android.util.TypedValue;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.AdapterView;
-import android.widget.AdapterView.OnItemSelectedListener;
-import android.widget.ArrayAdapter;
-import android.widget.Spinner;
-import android.widget.TextView;
-
-import com.android.notificationstudio.R;
-import com.android.notificationstudio.editor.Editors.Editor;
-import com.android.notificationstudio.model.EditableItem;
-
-public class DropDownEditor implements Editor {
-
-    public Runnable bindEditor(View v, final EditableItem item, final Runnable afterChange) {
-        final Spinner dropDownEditor = (Spinner) v.findViewById(R.id.drop_down_editor);
-        dropDownEditor.setVisibility(View.VISIBLE);
-        Integer[] values = item.getAvailableValuesInteger();
-        final float textSize = v.getResources().getDimensionPixelSize(R.dimen.editor_text_size);
-        final int p = v.getResources().getDimensionPixelSize(R.dimen.editor_drop_down_padding);
-        final int p2 = p * 2;
-        final ArrayAdapter<Integer> adapter =
-            new ArrayAdapter<Integer>(v.getContext(), android.R.layout.simple_spinner_item, values) {
-
-            @Override
-            public View getDropDownView(int position, View convertView, ViewGroup parent) {
-                TextView v = (TextView) super.getDropDownView(position, convertView, parent);
-                v.setTextSize(TypedValue.COMPLEX_UNIT_PX, textSize);
-                v.setPadding(p2, p2, p2, p2);
-                v.setText(v.getResources().getString(getItem(position)));
-                return v;
-            }
-
-            @Override
-            public View getView(int position, View convertView, ViewGroup parent) {
-                TextView v = (TextView) super.getView(position, convertView, parent);
-                v.setTextSize(TypedValue.COMPLEX_UNIT_PX, textSize);
-                v.setPadding(p, p, p, p);
-                v.setText(v.getResources().getString(getItem(position)));
-                return v;
-            }
-        };
-        dropDownEditor.setAdapter(adapter);
-        Runnable updateSelection = new Runnable() {
-            public void run() {
-                dropDownEditor.setSelection(adapter.getPosition(item.getValueInt()));
-            }};
-        if (item.hasValue())
-            updateSelection.run();
-        dropDownEditor.setOnItemSelectedListener(new OnItemSelectedListener(){
-            public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
-                Object oldValue = item.getValue();
-                Object newValue = adapter.getItem(position);
-                if (newValue.equals(oldValue))
-                    return;
-                item.setValue(newValue);
-                afterChange.run();
-            }
-            public void onNothingSelected(AdapterView<?> parent) {
-                // noop
-            }});
-        return updateSelection;
-    }
-
-}
\ No newline at end of file
diff --git a/apps/NotificationStudio/src/com/android/notificationstudio/editor/Editors.java b/apps/NotificationStudio/src/com/android/notificationstudio/editor/Editors.java
deleted file mode 100644
index b7268f1..0000000
--- a/apps/NotificationStudio/src/com/android/notificationstudio/editor/Editors.java
+++ /dev/null
@@ -1,100 +0,0 @@
-/*
- * Copyright 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.notificationstudio.editor;
-
-import android.os.Build;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.TextView;
-
-import com.android.notificationstudio.NotificationStudioActivity;
-import com.android.notificationstudio.R;
-import com.android.notificationstudio.model.EditableItem;
-import com.android.notificationstudio.model.EditableItemConstants;
-
-import java.util.HashMap;
-import java.util.Map;
-
-public class Editors implements EditableItemConstants {
-
-    public interface Editor {
-        Runnable bindEditor(View v, EditableItem item, Runnable afterChange);
-    }
-
-    private static final Map<Integer, Editor> EDITORS = editors();
-    private static Runnable sUpdatePreset;
-
-    private static Map<Integer, Editor> editors() {
-        Map<Integer, Editor> editors = new HashMap<Integer, Editor>();
-        editors.put(TYPE_RESOURCE_ID, new IconEditor());
-        editors.put(TYPE_TEXT, new TextEditor());
-        editors.put(TYPE_INT, new IntEditor());
-        if (Build.VERSION.SDK_INT >= 14)  // switch 14, progress 14, uses chron 16
-            editors.put(TYPE_BOOLEAN, new BooleanEditor());
-        editors.put(TYPE_DROP_DOWN, new DropDownEditor());
-        editors.put(TYPE_BITMAP, new BitmapEditor());
-        if (Build.VERSION.SDK_INT >= 11) // fragments 11, when 11
-            editors.put(TYPE_DATETIME, new DateTimeEditor());
-        editors.put(TYPE_TEXT_LINES, new LinesEditor());
-        return editors;
-    }
-
-    public static View newEditor(final NotificationStudioActivity activity,
-            final ViewGroup parent, final EditableItem item) {
-        final View editorView = activity.getLayoutInflater().inflate(R.layout.editable_item, null);
-        ((TextView) editorView.findViewById(R.id.caption)).setText(item.getCaption(activity));
-
-        // bind visibility
-        editorView.setVisibility(item.isVisible() ? View.VISIBLE : View.GONE);
-        item.setVisibilityListener(new Runnable(){
-            public void run() {
-                editorView.setVisibility(item.isVisible() ? View.VISIBLE : View.GONE);
-            }});
-
-        // bind type-specific behavior
-        Editor editor = EDITORS.get(item.getType());
-        if (editor == null)
-            return null;
-        Runnable updater = editor.bindEditor(editorView, item, new Runnable() {
-            public void run() {
-                if (item.equals(EditableItem.PRESET)) {
-                    updateEditors(parent);
-                } else {
-                    EditableItem.PRESET.setValue(PRESET_CUSTOM);
-                    sUpdatePreset.run();
-                }
-                activity.refreshNotification();
-            }});
-
-        // store the updater as the view tag
-        editorView.setTag(updater);
-        if (item.equals(EditableItem.PRESET))
-            sUpdatePreset = updater;
-
-        return editorView;
-    }
-
-    private static void updateEditors(ViewGroup parent) {
-        for (int i = 0; i < parent.getChildCount(); i++) {
-            Object childTag = parent.getChildAt(i).getTag();
-            if (childTag instanceof Runnable) {
-                ((Runnable) childTag).run();
-            }
-        }
-    }
-
-}
diff --git a/apps/NotificationStudio/src/com/android/notificationstudio/editor/IconEditor.java b/apps/NotificationStudio/src/com/android/notificationstudio/editor/IconEditor.java
deleted file mode 100644
index 71e9005..0000000
--- a/apps/NotificationStudio/src/com/android/notificationstudio/editor/IconEditor.java
+++ /dev/null
@@ -1,118 +0,0 @@
-/*
- * Copyright 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.notificationstudio.editor;
-
-import android.content.res.Resources;
-import android.view.MotionEvent;
-import android.view.SoundEffectConstants;
-import android.view.View;
-import android.view.View.OnTouchListener;
-import android.view.ViewGroup;
-import android.widget.FrameLayout;
-import android.widget.HorizontalScrollView;
-import android.widget.ImageView;
-import android.widget.ImageView.ScaleType;
-import android.widget.LinearLayout;
-
-import com.android.notificationstudio.R;
-import com.android.notificationstudio.editor.Editors.Editor;
-import com.android.notificationstudio.model.EditableItem;
-
-public class IconEditor implements Editor {
-
-    public Runnable bindEditor(View v, final EditableItem item, final Runnable afterChange) {
-        final LinearLayout iconEditor = (LinearLayout) v.findViewById(R.id.icon_editor_layout);
-        final HorizontalScrollView scroller =
-                (HorizontalScrollView) v.findViewById(R.id.icon_editor_scroller);
-        scroller.setVisibility(View.VISIBLE);
-
-        final Object[] displayValues = getAvailableValuesForDisplay(item);
-        final Runnable updateSelection = new Runnable() {
-            public void run() {
-                for (int i=0;i<iconEditor.getChildCount();i++) {
-                    View imageViewHolder = iconEditor.getChildAt(i);
-                    Object iconResId = imageViewHolder.getTag();
-                    boolean selected = item.hasValue() && item.getValue().equals(iconResId) ||
-                            !item.hasValue() && iconResId == null;
-                    imageViewHolder.setSelected(selected);
-                    if (selected) {
-                        int x = imageViewHolder.getLeft();
-                        if (x < scroller.getScrollX() ||
-                            x > scroller.getScrollX() + scroller.getWidth()) {
-                            scroller.scrollTo(imageViewHolder.getLeft(), 0);
-                        }
-                    }
-                }
-            }};
-
-        int iconSize = getIconSize(v.getResources());
-        int outerMargin = v.getResources().getDimensionPixelSize(R.dimen.editor_icon_outer_margin);
-        int innerMargin = v.getResources().getDimensionPixelSize(R.dimen.editor_icon_inner_margin);
-
-        for (final Object iconResId : displayValues) {
-            final FrameLayout imageViewHolder = new FrameLayout(v.getContext());
-            imageViewHolder.setTag(iconResId);
-            final ImageView imageView = new ImageView(v.getContext());
-            imageView.setScaleType(ScaleType.CENTER);
-            imageView.setOnTouchListener(new OnTouchListener(){
-                public boolean onTouch(View v, MotionEvent event) {
-                    if (event.getAction() == MotionEvent.ACTION_UP) {
-                        v.playSoundEffect(SoundEffectConstants.CLICK);
-                        item.setValue(iconResId);
-                        updateSelection.run();
-                        afterChange.run();
-                    }
-                    return true;
-                }});
-
-            imageViewHolder.setBackgroundResource(R.drawable.icon_bg);
-            if (iconResId != null)
-                setImage(imageView, iconResId);
-
-            LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(iconSize, iconSize);
-            lp.bottomMargin = lp.topMargin = lp.leftMargin = lp.rightMargin = outerMargin;
-            imageViewHolder.setLayoutParams(lp);
-
-            FrameLayout.LayoutParams flp = new FrameLayout.LayoutParams(
-                    ViewGroup.LayoutParams.MATCH_PARENT,
-                    ViewGroup.LayoutParams.MATCH_PARENT);
-            flp.bottomMargin = flp.topMargin = flp.leftMargin = flp.rightMargin = innerMargin;
-            imageView.setLayoutParams(flp);
-
-            imageViewHolder.addView(imageView);
-            iconEditor.addView(imageViewHolder);
-        }
-        updateSelection.run();
-        return updateSelection;
-    }
-
-    protected int getIconSize(Resources res) {
-        return res.getDimensionPixelSize(R.dimen.editor_icon_size_small);
-    }
-
-    protected void setImage(ImageView imageView, Object value) {
-        imageView.setImageResource((Integer) value);
-    }
-
-    private Object[] getAvailableValuesForDisplay(EditableItem item) {
-        Object[] avail = item.getAvailableValues();
-        Object[] rt = new Object[avail.length + 1];
-        System.arraycopy(avail, 0, rt, 1, avail.length);
-        return rt;
-    }
-
-}
\ No newline at end of file
diff --git a/apps/NotificationStudio/src/com/android/notificationstudio/editor/IntEditor.java b/apps/NotificationStudio/src/com/android/notificationstudio/editor/IntEditor.java
deleted file mode 100644
index 393863e..0000000
--- a/apps/NotificationStudio/src/com/android/notificationstudio/editor/IntEditor.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Copyright 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.notificationstudio.editor;
-
-import android.text.InputType;
-
-public class IntEditor extends TextEditor {
-
-    @Override
-    protected Object parseValue(String str) {
-        return str == null ? null : Integer.parseInt(str);
-    }
-
-    protected int getInputType() {
-        return InputType.TYPE_CLASS_NUMBER;
-    }
-
-}
\ No newline at end of file
diff --git a/apps/NotificationStudio/src/com/android/notificationstudio/editor/LinesEditor.java b/apps/NotificationStudio/src/com/android/notificationstudio/editor/LinesEditor.java
deleted file mode 100644
index 5173a992..0000000
--- a/apps/NotificationStudio/src/com/android/notificationstudio/editor/LinesEditor.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Copyright 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.notificationstudio.editor;
-
-import android.text.InputType;
-
-public class LinesEditor extends TextEditor {
-
-    @Override
-    protected int getInputType() {
-        return InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_FLAG_MULTI_LINE;
-    }
-
-}
diff --git a/apps/NotificationStudio/src/com/android/notificationstudio/editor/TextEditor.java b/apps/NotificationStudio/src/com/android/notificationstudio/editor/TextEditor.java
deleted file mode 100644
index aa38eec..0000000
--- a/apps/NotificationStudio/src/com/android/notificationstudio/editor/TextEditor.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * Copyright 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.notificationstudio.editor;
-
-import android.text.Editable;
-import android.text.InputType;
-import android.text.TextWatcher;
-import android.view.View;
-import android.widget.EditText;
-
-import com.android.notificationstudio.R;
-import com.android.notificationstudio.editor.Editors.Editor;
-import com.android.notificationstudio.model.EditableItem;
-
-public class TextEditor implements Editor {
-
-    public Runnable bindEditor(View v, final EditableItem item, final Runnable afterChange) {
-        final EditText textEditor = (EditText) v.findViewById(R.id.text_editor);
-        textEditor.setVisibility(View.VISIBLE);
-        textEditor.setInputType(getInputType());
-        Runnable updateEditText = new Runnable() {
-            public void run() {
-                textEditor.setText(item.getValue() == null ? "" : item.getValue().toString());
-            }};
-        if (item.hasValue())
-            updateEditText.run();
-        textEditor.addTextChangedListener(new TextWatcher() {
-            public void afterTextChanged(Editable s) {
-                Object newVal = parseValue(s.length() == 0 ? null : s.toString());
-                if (equal(newVal, item.getValue()))
-                    return;
-                item.setValue(newVal);
-                afterChange.run();
-            }
-
-            public void beforeTextChanged(CharSequence s, int start, int count, int after) {
-                // noop
-            }
-
-            public void onTextChanged(CharSequence s, int start, int before, int count) {
-                // noop
-            }
-        });
-        return updateEditText;
-    }
-
-    protected int getInputType() {
-        return InputType.TYPE_CLASS_TEXT;
-    }
-
-    protected Object parseValue(String str) {
-        return str;
-    }
-
-    private static boolean equal(Object a,  Object b) {
-        return a == b || (a != null && a.equals(b));
-    }
-
-}
\ No newline at end of file
diff --git a/apps/NotificationStudio/src/com/android/notificationstudio/generator/CodeGenerator.java b/apps/NotificationStudio/src/com/android/notificationstudio/generator/CodeGenerator.java
deleted file mode 100644
index 81eca83..0000000
--- a/apps/NotificationStudio/src/com/android/notificationstudio/generator/CodeGenerator.java
+++ /dev/null
@@ -1,139 +0,0 @@
-/*
- * Copyright 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.notificationstudio.generator;
-import static com.android.notificationstudio.model.EditableItem.ACTION1_ICON;
-import static com.android.notificationstudio.model.EditableItem.ACTION1_TEXT;
-import static com.android.notificationstudio.model.EditableItem.ACTION2_ICON;
-import static com.android.notificationstudio.model.EditableItem.ACTION2_TEXT;
-import static com.android.notificationstudio.model.EditableItem.ACTION3_ICON;
-import static com.android.notificationstudio.model.EditableItem.ACTION3_TEXT;
-import static com.android.notificationstudio.model.EditableItem.BIG_CONTENT_TITLE;
-import static com.android.notificationstudio.model.EditableItem.BIG_TEXT;
-import static com.android.notificationstudio.model.EditableItem.CONTENT_INFO;
-import static com.android.notificationstudio.model.EditableItem.CONTENT_TEXT;
-import static com.android.notificationstudio.model.EditableItem.CONTENT_TITLE;
-import static com.android.notificationstudio.model.EditableItem.LARGE_ICON;
-import static com.android.notificationstudio.model.EditableItem.LINES;
-import static com.android.notificationstudio.model.EditableItem.NUMBER;
-import static com.android.notificationstudio.model.EditableItem.PICTURE;
-import static com.android.notificationstudio.model.EditableItem.PROGRESS;
-import static com.android.notificationstudio.model.EditableItem.SMALL_ICON;
-import static com.android.notificationstudio.model.EditableItem.STYLE;
-import static com.android.notificationstudio.model.EditableItem.SUB_TEXT;
-import static com.android.notificationstudio.model.EditableItem.SUMMARY_TEXT;
-import static com.android.notificationstudio.model.EditableItem.USES_CHRON;
-import static com.android.notificationstudio.model.EditableItem.WHEN;
-
-import android.content.Context;
-
-import com.android.notificationstudio.model.EditableItem;
-import com.android.notificationstudio.model.EditableItemConstants;
-
-public class CodeGenerator implements EditableItemConstants {
-
-    private static final String INDENT = "\n    ";
-    private static final String STYLE_INDENT = INDENT + "    ";
-
-    public static String generate(Context context) {
-
-        StringBuilder sb = new StringBuilder("new Notification.Builder(context)");
-
-        if (SMALL_ICON.hasValue())
-            sb.append(INDENT + ".setSmallIcon(" + getResourceVar(context, SMALL_ICON) + ")");
-        if (CONTENT_TITLE.hasValue())
-            sb.append(INDENT + ".setContentTitle(" + quote(CONTENT_TITLE) + ")");
-        if (CONTENT_TEXT.hasValue())
-            sb.append(INDENT + ".setContentText(" + quote(CONTENT_TEXT) + ")");
-        if (SUB_TEXT.hasValue())
-            sb.append(INDENT + ".setSubText(" + quote(SUB_TEXT) + ")");
-        if (LARGE_ICON.hasValue())
-            sb.append(INDENT + ".setLargeIcon(largeIconBitmap)");
-        if (CONTENT_INFO.hasValue())
-            sb.append(INDENT + ".setContentInfo(" + quote(CONTENT_INFO) + ")");
-        if (NUMBER.hasValue())
-            sb.append(INDENT + ".setNumber(" + NUMBER.getValueInt() + ")");
-        if (WHEN.hasValue())
-            sb.append(INDENT + ".setWhen(" + WHEN.getValueLong() + ")");
-        if (PROGRESS.hasValue() && PROGRESS.getValueBool())
-            sb.append(INDENT + ".setProgress(0, 0, true)");
-        if (USES_CHRON.hasValue())
-            sb.append(INDENT + ".setUsesChronometer(" + USES_CHRON.getValueBool() + ")");
-        if (ACTION1_ICON.hasValue())
-            generateAction(sb, ACTION1_ICON, ACTION1_TEXT, "action1PendingIntent");
-        if (ACTION2_ICON.hasValue())
-            generateAction(sb, ACTION2_ICON, ACTION2_TEXT, "action2PendingIntent");
-        if (ACTION3_ICON.hasValue())
-            generateAction(sb, ACTION3_ICON, ACTION3_TEXT, "action3PendingIntent");
-
-        if (STYLE.hasValue())
-            generateStyle(sb);
-
-        sb.append(INDENT + ".build();");
-        return sb.toString();
-    }
-
-    private static void generateStyle(StringBuilder sb) {
-        Integer styleValue = STYLE.getValueInt();
-        if (STYLE_BIG_PICTURE.equals(styleValue)) {
-            sb.append(INDENT + ".setStyle(new Notification.BigPictureStyle()");
-            if (PICTURE.hasValue())
-                sb.append(STYLE_INDENT + ".bigPicture(pictureBitmap)");
-        }
-        if (STYLE_BIG_TEXT.equals(styleValue)) {
-            sb.append(INDENT + ".setStyle(new Notification.BigTextStyle()");
-            if (BIG_TEXT.hasValue())
-                sb.append(STYLE_INDENT + ".bigText(" + quote(BIG_TEXT) + ")");
-        }
-        if (STYLE_INBOX.equals(styleValue)) {
-            sb.append(INDENT + ".setStyle(new Notification.InboxStyle()");
-            if (LINES.hasValue()) {
-                for (String line : LINES.getValueString().split("\\n")) {
-                    sb.append(STYLE_INDENT + ".addLine(" + quote(line) + ")");
-                }
-            }
-        }
-        if (BIG_CONTENT_TITLE.hasValue())
-            sb.append(STYLE_INDENT + ".setBigContentTitle(" + quote(BIG_CONTENT_TITLE) + ")");
-        if (SUMMARY_TEXT.hasValue())
-            sb.append(STYLE_INDENT + ".setSummaryText(" + quote(SUMMARY_TEXT) + ")");
-
-        sb.append(")");
-    }
-
-    private static void generateAction(StringBuilder sb,
-            EditableItem icon, EditableItem text, String intentName) {
-        sb.append(INDENT +
-            ".addAction(" + icon.getValueInt() + ", " + quote(text) + ", " + intentName + ")");
-    }
-
-    private static String quote(EditableItem text) {
-        return quote(text.getValueString());
-    }
-
-    private static String quote(String text) {
-        return text != null ? "\"" + text.replace("\"", "\\\"") + "\"" : "null";
-    }
-
-    private static String getResourceVar(Context context, EditableItem item) {
-        int resId = item.getValueInt();
-        String packageName = context.getResources().getResourcePackageName(resId);
-        String type = context.getResources().getResourceTypeName(resId);
-        String entryName = context.getResources().getResourceEntryName(resId);
-        return packageName + ".R." + type + "." + entryName;
-    }
-
-}
diff --git a/apps/NotificationStudio/src/com/android/notificationstudio/generator/NotificationGenerator.java b/apps/NotificationStudio/src/com/android/notificationstudio/generator/NotificationGenerator.java
deleted file mode 100644
index 64b4ece..0000000
--- a/apps/NotificationStudio/src/com/android/notificationstudio/generator/NotificationGenerator.java
+++ /dev/null
@@ -1,131 +0,0 @@
-/*
- * Copyright 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.notificationstudio.generator;
-import static com.android.notificationstudio.model.EditableItem.ACTION1_ICON;
-import static com.android.notificationstudio.model.EditableItem.ACTION1_TEXT;
-import static com.android.notificationstudio.model.EditableItem.ACTION2_ICON;
-import static com.android.notificationstudio.model.EditableItem.ACTION2_TEXT;
-import static com.android.notificationstudio.model.EditableItem.ACTION3_ICON;
-import static com.android.notificationstudio.model.EditableItem.ACTION3_TEXT;
-import static com.android.notificationstudio.model.EditableItem.BIG_CONTENT_TITLE;
-import static com.android.notificationstudio.model.EditableItem.BIG_TEXT;
-import static com.android.notificationstudio.model.EditableItem.CONTENT_INFO;
-import static com.android.notificationstudio.model.EditableItem.CONTENT_TEXT;
-import static com.android.notificationstudio.model.EditableItem.CONTENT_TITLE;
-import static com.android.notificationstudio.model.EditableItem.LARGE_ICON;
-import static com.android.notificationstudio.model.EditableItem.LINES;
-import static com.android.notificationstudio.model.EditableItem.NUMBER;
-import static com.android.notificationstudio.model.EditableItem.PICTURE;
-import static com.android.notificationstudio.model.EditableItem.PROGRESS;
-import static com.android.notificationstudio.model.EditableItem.SMALL_ICON;
-import static com.android.notificationstudio.model.EditableItem.STYLE;
-import static com.android.notificationstudio.model.EditableItem.SUB_TEXT;
-import static com.android.notificationstudio.model.EditableItem.SUMMARY_TEXT;
-import static com.android.notificationstudio.model.EditableItem.USES_CHRON;
-import static com.android.notificationstudio.model.EditableItem.WHEN;
-
-import android.app.Notification;
-import android.app.PendingIntent;
-import android.content.Context;
-import android.content.Intent;
-import android.support.v4.app.NotificationCompat;
-import android.support.v4.app.NotificationCompat.BigPictureStyle;
-import android.support.v4.app.NotificationCompat.BigTextStyle;
-import android.support.v4.app.NotificationCompat.InboxStyle;
-
-import com.android.notificationstudio.model.EditableItemConstants;
-
-public class NotificationGenerator implements EditableItemConstants {
-
-    public static Notification build(Context context) {
-
-        PendingIntent noop = PendingIntent.getActivity(context, 0, new Intent(), 0);
-
-        NotificationCompat.Builder builder = new NotificationCompat.Builder(context);
-        if (SMALL_ICON.hasValue())
-            builder.setSmallIcon(SMALL_ICON.getValueInt());
-        if (CONTENT_TITLE.hasValue())
-            builder.setContentTitle(CONTENT_TITLE.getValueString());
-        if (CONTENT_TEXT.hasValue())
-            builder.setContentText(CONTENT_TEXT.getValueString());
-        if (SUB_TEXT.hasValue())
-            builder.setSubText(SUB_TEXT.getValueString());
-        if (LARGE_ICON.hasValue())
-            builder.setLargeIcon(LARGE_ICON.getValueBitmap());
-        if (CONTENT_INFO.hasValue())
-            builder.setContentInfo(CONTENT_INFO.getValueString());
-        if (NUMBER.hasValue())
-            builder.setNumber(NUMBER.getValueInt());
-        if (WHEN.hasValue())
-            builder.setWhen(WHEN.getValueLong());
-        if (PROGRESS.hasValue() && PROGRESS.getValueBool())
-            builder.setProgress(0, 0, true);
-        if (USES_CHRON.hasValue())
-            builder.setUsesChronometer(USES_CHRON.getValueBool());
-        if (ACTION1_ICON.hasValue())
-            builder.addAction(ACTION1_ICON.getValueInt(), ACTION1_TEXT.getValueString(), noop);
-        if (ACTION2_ICON.hasValue())
-            builder.addAction(ACTION2_ICON.getValueInt(), ACTION2_TEXT.getValueString(), noop);
-        if (ACTION3_ICON.hasValue())
-            builder.addAction(ACTION3_ICON.getValueInt(), ACTION3_TEXT.getValueString(), noop);
-
-        if (STYLE.hasValue())
-            generateStyle(builder);
-
-        // for older OSes
-        builder.setContentIntent(noop);
-
-        return builder.build();
-    }
-
-    private static void generateStyle(NotificationCompat.Builder builder) {
-        Integer styleValue = STYLE.getValueInt();
-
-        if (STYLE_BIG_PICTURE.equals(styleValue)) {
-            BigPictureStyle bigPicture = new NotificationCompat.BigPictureStyle();
-            if (PICTURE.hasValue())
-                bigPicture.bigPicture(PICTURE.getValueBitmap());
-            if (BIG_CONTENT_TITLE.hasValue())
-                bigPicture.setBigContentTitle(BIG_CONTENT_TITLE.getValueString());
-            if (SUMMARY_TEXT.hasValue())
-                bigPicture.setSummaryText(SUMMARY_TEXT.getValueString());
-            builder.setStyle(bigPicture);
-        } else if (STYLE_BIG_TEXT.equals(styleValue)) {
-            BigTextStyle bigText = new NotificationCompat.BigTextStyle();
-            if (BIG_TEXT.hasValue())
-                bigText.bigText(BIG_TEXT.getValueString());
-            if (BIG_CONTENT_TITLE.hasValue())
-                bigText.setBigContentTitle(BIG_CONTENT_TITLE.getValueString());
-            if (SUMMARY_TEXT.hasValue())
-                bigText.setSummaryText(SUMMARY_TEXT.getValueString());
-            builder.setStyle(bigText);
-        } else if (STYLE_INBOX.equals(styleValue)) {
-            InboxStyle inboxStyle = new NotificationCompat.InboxStyle();
-            if (LINES.hasValue()) {
-                for (String line : LINES.getValueString().split("\\n")) {
-                    inboxStyle.addLine(line);
-                }
-            }
-            if (BIG_CONTENT_TITLE.hasValue())
-                inboxStyle.setBigContentTitle(BIG_CONTENT_TITLE.getValueString());
-            if (SUMMARY_TEXT.hasValue())
-                inboxStyle.setSummaryText(SUMMARY_TEXT.getValueString());
-            builder.setStyle(inboxStyle);
-        }
-    }
-
-}
diff --git a/apps/NotificationStudio/src/com/android/notificationstudio/model/EditableItem.java b/apps/NotificationStudio/src/com/android/notificationstudio/model/EditableItem.java
deleted file mode 100644
index 54e03e0..0000000
--- a/apps/NotificationStudio/src/com/android/notificationstudio/model/EditableItem.java
+++ /dev/null
@@ -1,216 +0,0 @@
-/*
- * Copyright 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.notificationstudio.model;
-
-import android.content.Context;
-import android.content.res.Resources;
-import android.graphics.Bitmap;
-import android.graphics.BitmapFactory;
-
-import com.android.notificationstudio.R;
-
-public enum EditableItem implements EditableItemConstants {
-
-    PRESET(R.string.preset, TYPE_DROP_DOWN, CATEGORY_MAIN,
-            PRESET_BASIC, PRESET_EMAIL, PRESET_PHOTO, PRESET_CUSTOM),
-    SMALL_ICON(R.string.small_icon, TYPE_RESOURCE_ID, CATEGORY_MAIN,
-            SMALL_ICONS),
-    CONTENT_TITLE(R.string.content_title, TYPE_TEXT, CATEGORY_MAIN),
-    CONTENT_TEXT(R.string.content_text, TYPE_TEXT, CATEGORY_MAIN),
-    SUB_TEXT(R.string.sub_text, TYPE_TEXT, CATEGORY_MAIN),
-    LARGE_ICON(R.string.large_icon, TYPE_BITMAP, CATEGORY_MAIN),
-    CONTENT_INFO(R.string.content_info, TYPE_TEXT, CATEGORY_MAIN),
-    NUMBER(R.string.number, TYPE_INT, CATEGORY_MAIN),
-    WHEN(R.string.when, TYPE_DATETIME, CATEGORY_MAIN),
-    PROGRESS(R.string.progress, TYPE_BOOLEAN, CATEGORY_MAIN),
-    USES_CHRON(R.string.uses_chron, TYPE_BOOLEAN, CATEGORY_MAIN),
-    STYLE(R.string.style, TYPE_DROP_DOWN, CATEGORY_STYLE,
-            STYLE_NONE, STYLE_BIG_PICTURE, STYLE_BIG_TEXT, STYLE_INBOX),
-    PICTURE(R.string.picture, TYPE_BITMAP, CATEGORY_STYLE),
-    BIG_TEXT(R.string.big_text, TYPE_TEXT, CATEGORY_STYLE),
-    LINES(R.string.lines, TYPE_TEXT_LINES, CATEGORY_STYLE),
-    BIG_CONTENT_TITLE(R.string.big_content_title, TYPE_TEXT, CATEGORY_STYLE),
-    SUMMARY_TEXT(R.string.summary_text, TYPE_TEXT, CATEGORY_STYLE),
-    ACTION1_ICON(R.string.icon, TYPE_RESOURCE_ID, CATEGORY_ACTION1,
-            ACTION_ICONS),
-    ACTION1_TEXT(R.string.text, TYPE_TEXT, CATEGORY_ACTION1),
-    ACTION2_ICON(R.string.icon, TYPE_RESOURCE_ID, CATEGORY_ACTION2,
-            ACTION_ICONS),
-    ACTION2_TEXT(R.string.text, TYPE_TEXT, CATEGORY_ACTION2),
-    ACTION3_ICON(R.string.icon, TYPE_RESOURCE_ID, CATEGORY_ACTION3,
-            ACTION_ICONS),
-    ACTION3_TEXT(R.string.text, TYPE_TEXT, CATEGORY_ACTION3),
-    ;
-
-    private final int mCaptionId;
-    private final int mType;
-    private final int mCategoryId;
-
-    private Object[] mAvailableValues;
-    private Object mValue;
-    private boolean mVisible = true;
-    private Runnable mVisibilityListener;
-
-    private EditableItem(int captionId, int type, int categoryId, Object... availableValues) {
-        mCaptionId = captionId;
-        mType = type;
-        mCategoryId = categoryId;
-        mAvailableValues = availableValues;
-    }
-
-    // init
-    public static void initIfNecessary(Context context) {
-        if (PRESET.hasValue())
-            return;
-        loadBitmaps(context, LARGE_ICON, LARGE_ICONS);
-        loadBitmaps(context, PICTURE, PICTURES);
-        PRESET.setValue(PRESET_BASIC);
-    }
-
-    private static void loadBitmaps(Context context, EditableItem item, int[] bitmapResIds) {
-        Object[] largeIconBitmaps = new Object[bitmapResIds.length];
-        Resources res = context.getResources();
-        for (int i = 0; i < bitmapResIds.length; i++)
-            largeIconBitmaps[i] = BitmapFactory.decodeResource(res, bitmapResIds[i]);
-        item.setAvailableValues(largeIconBitmaps);
-    }
-
-    // visibility
-    public boolean isVisible() {
-        return mVisible;
-    }
-
-    public void setVisible(boolean visible) {
-        if (mVisible == visible)
-            return;
-        mVisible = visible;
-        if (mVisibilityListener != null)
-            mVisibilityListener.run();
-    }
-
-    public void setVisibilityListener(Runnable listener) {
-        mVisibilityListener = listener;
-    }
-
-    // value
-
-    public boolean hasValue() {
-        return mValue != null;
-    }
-
-    public void setValue(Object value) {
-        if (mValue == value)
-            return;
-        mValue = value;
-        if (this == STYLE)
-            applyStyle();
-        if (this == PRESET && !PRESET_CUSTOM.equals(value))
-            applyPreset();
-    }
-
-    private void applyStyle() {
-        PICTURE.setVisible(STYLE_BIG_PICTURE.equals(mValue));
-        BIG_TEXT.setVisible(STYLE_BIG_TEXT.equals(mValue));
-        LINES.setVisible(STYLE_INBOX.equals(mValue));
-        BIG_CONTENT_TITLE.setVisible(!STYLE_NONE.equals(mValue));
-        SUMMARY_TEXT.setVisible(!STYLE_NONE.equals(mValue));
-    }
-
-    private void applyPreset() {
-        for (EditableItem item : values())
-            if (item != PRESET)
-                item.setValue(null);
-        STYLE.setValue(STYLE_NONE);
-        if (PRESET_BASIC.equals(mValue)) {
-            SMALL_ICON.setValue(android.R.drawable.stat_notify_chat);
-            CONTENT_TITLE.setValue("Basic title");
-            CONTENT_TEXT.setValue("Basic text");
-        } else if (PRESET_EMAIL.equals(mValue)) {
-            SMALL_ICON.setValue(R.drawable.ic_notification_multiple_mail_holo_dark);
-            LARGE_ICON.setValue(LARGE_ICON.getAvailableValues()[3]);
-            CONTENT_TITLE.setValue("3 new messages");
-            CONTENT_TEXT.setValue("Alice, Bob, Chuck");
-            STYLE.setValue(STYLE_INBOX);
-            LINES.setValue("Alice: Re: Something\n" +
-                           "Bob: Did you get the memo?\n" +
-                           "Chuck: Limited time offer!");
-        } else if (PRESET_PHOTO.equals(mValue)) {
-            SMALL_ICON.setValue(android.R.drawable.ic_menu_camera);
-            LARGE_ICON.setValue(LARGE_ICON.getAvailableValues()[2]);
-            CONTENT_TITLE.setValue("Sunset on the rocks");
-            CONTENT_TEXT.setValue("800x534 | 405.1K");
-            SUMMARY_TEXT.setValue(CONTENT_TEXT.getValueString());
-            STYLE.setValue(STYLE_BIG_PICTURE);
-            PICTURE.setValue(PICTURE.getAvailableValues()[0]);
-            ACTION1_ICON.setValue(android.R.drawable.ic_menu_share);
-            ACTION1_TEXT.setValue("Share");
-        }
-    }
-
-    public Object getValue() {
-        return mValue;
-    }
-
-    public String getValueString() {
-        return (String) mValue;
-    }
-
-    public int getValueInt() {
-        return (Integer) mValue;
-    }
-
-    public long getValueLong() {
-        return (Long) mValue;
-    }
-
-    public boolean getValueBool() {
-        return (Boolean) mValue;
-    }
-
-    public Bitmap getValueBitmap() {
-        return (Bitmap) mValue;
-    }
-
-    // available values
-
-    public Object[] getAvailableValues() {
-        return mAvailableValues;
-    }
-
-    public Integer[] getAvailableValuesInteger() {
-        Integer[] integers = new Integer[mAvailableValues.length];
-        System.arraycopy(mAvailableValues, 0, integers, 0, integers.length);
-        return integers;
-    }
-
-    public <T> void setAvailableValues(T... values) {
-        mAvailableValues = values;
-    }
-
-    public String getCaption(Context context) {
-        return context.getString(mCaptionId);
-    }
-
-    public String getCategory(Context context) {
-        return context.getString(mCategoryId);
-    }
-
-    public int getType() {
-        return mType;
-    }
-
-}
diff --git a/apps/NotificationStudio/src/com/android/notificationstudio/model/EditableItemConstants.java b/apps/NotificationStudio/src/com/android/notificationstudio/model/EditableItemConstants.java
deleted file mode 100644
index d4defdf..0000000
--- a/apps/NotificationStudio/src/com/android/notificationstudio/model/EditableItemConstants.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * Copyright 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.notificationstudio.model;
-
-import com.android.notificationstudio.R;
-
-public interface EditableItemConstants {
-
-    public static final int TYPE_TEXT = 0;
-    public static final int TYPE_DROP_DOWN = 1;
-    public static final int TYPE_RESOURCE_ID = 2;
-    public static final int TYPE_BITMAP = 3;
-    public static final int TYPE_INT = 4;
-    public static final int TYPE_DATETIME = 5;
-    public static final int TYPE_BOOLEAN = 6;
-    public static final int TYPE_TEXT_LINES = 7;
-
-    public static final int CATEGORY_MAIN = R.string.properties;
-    public static final int CATEGORY_STYLE = R.string.style;
-    public static final int CATEGORY_ACTION1 = R.string.action_1;
-    public static final int CATEGORY_ACTION2 = R.string.action_2;
-    public static final int CATEGORY_ACTION3 = R.string.action_3;
-
-    public static final Integer PRESET_CUSTOM = R.string.preset_custom;
-    public static final Integer PRESET_BASIC = R.string.preset_basic;
-    public static final Integer PRESET_EMAIL = R.string.preset_email;
-    public static final Integer PRESET_PHOTO = R.string.preset_photo;
-
-    public static final Integer STYLE_NONE = R.string.style_none;
-    public static final Integer STYLE_BIG_PICTURE = R.string.style_big_picture;
-    public static final Integer STYLE_BIG_TEXT = R.string.style_big_text;
-    public static final Integer STYLE_INBOX = R.string.style_inbox;
-
-    public static final Object[] SMALL_ICONS = new Object[] {
-        android.R.drawable.stat_sys_warning,
-        android.R.drawable.stat_sys_download_done,
-        android.R.drawable.stat_notify_chat,
-        android.R.drawable.stat_notify_sync,
-        android.R.drawable.stat_notify_more,
-        android.R.drawable.stat_notify_sdcard,
-        android.R.drawable.stat_sys_data_bluetooth,
-        android.R.drawable.stat_notify_voicemail,
-        android.R.drawable.stat_sys_speakerphone,
-        android.R.drawable.ic_menu_camera,
-        android.R.drawable.ic_menu_share,
-        R.drawable.ic_notification_multiple_mail_holo_dark
-    };
-
-    public static final Object[] ACTION_ICONS = SMALL_ICONS;
-
-    public static final int[] LARGE_ICONS = new int[]{
-      R.drawable.romainguy_rockaway,
-      R.drawable.android_logo,
-      R.drawable.romain,
-      R.drawable.ic_notification_multiple_mail_holo_dark
-    };
-
-    public static final int[] PICTURES = LARGE_ICONS;
-
-}
diff --git a/apps/SdkController/.classpath b/apps/SdkController/.classpath
deleted file mode 100755
index a4f1e40..0000000
--- a/apps/SdkController/.classpath
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="src" path="gen"/>
-	<classpathentry kind="con" path="com.android.ide.eclipse.adt.ANDROID_FRAMEWORK"/>
-	<classpathentry kind="con" path="com.android.ide.eclipse.adt.LIBRARIES"/>
-	<classpathentry kind="output" path="bin/classes"/>
-</classpath>
diff --git a/apps/SdkController/.project b/apps/SdkController/.project
deleted file mode 100755
index a3417c5..0000000
--- a/apps/SdkController/.project
+++ /dev/null
@@ -1,34 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>SdkControllerApp</name>
-	<comment></comment>
-	<projects>
-		<project>SdkControllerLib</project>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>com.android.ide.eclipse.adt.ResourceManagerBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>com.android.ide.eclipse.adt.PreCompilerBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>com.android.ide.eclipse.adt.ApkBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>com.android.ide.eclipse.adt.AndroidNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/apps/SdkController/.settings/org.eclipse.jdt.core.prefs b/apps/SdkController/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100755
index 5b174be..0000000
--- a/apps/SdkController/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,12 +0,0 @@
-#Fri Apr 06 22:06:54 PDT 2012
-eclipse.preferences.version=1
-org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6
-org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.6
-org.eclipse.jdt.core.compiler.debug.lineNumber=generate
-org.eclipse.jdt.core.compiler.debug.localVariable=generate
-org.eclipse.jdt.core.compiler.debug.sourceFile=generate
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.source=1.6
diff --git a/apps/SdkController/AndroidManifest.xml b/apps/SdkController/AndroidManifest.xml
deleted file mode 100755
index df7aa47..0000000
--- a/apps/SdkController/AndroidManifest.xml
+++ /dev/null
@@ -1,44 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
-    package="com.android.tools.sdkcontroller"
-    android:versionCode="1"
-    android:versionName="1.0" >
-
-    <uses-sdk
-        android:minSdkVersion="7"
-        android:targetSdkVersion="15" />
-
-    <uses-permission android:name="android.permission.INTERNET" />
-
-    <application
-        android:icon="@drawable/ic_launcher"
-        android:label="@string/app_name" >
-
-        <activity
-            android:name=".activities.MainActivity"
-            android:label="@string/app_name"
-            android:launchMode="singleInstance" >
-            <intent-filter>
-                <action android:name="android.intent.action.MAIN" />
-                <category android:name="android.intent.category.LAUNCHER" />
-            </intent-filter>
-        </activity>
-
-        <activity
-            android:name=".activities.SensorActivity"
-            android:launchMode="singleInstance"
-            android:windowSoftInputMode="stateUnchanged" android:label="@string/sensors_activity_title"/>
-
-        <activity
-            android:name=".activities.MultiTouchActivity"
-            android:launchMode="singleInstance"
-            android:screenOrientation="portrait"
-            android:theme="@style/Theme.MultiTouch"
-            android:windowSoftInputMode="stateHidden"/>
-
-        <service
-            android:name=".service.ControllerService"
-            android:description="@string/service_description"
-            android:icon="@drawable/ic_launcher" />
-    </application>
-</manifest>
diff --git a/apps/SdkController/Implementation.txt b/apps/SdkController/Implementation.txt
deleted file mode 100755
index f1ead49..0000000
--- a/apps/SdkController/Implementation.txt
+++ /dev/null
@@ -1,85 +0,0 @@
-Implementation Details for SdkControllerApp
--------------------------------------------
-
----- 2012-03-22
-App is in the namespace com.android.tools.sdkcontroller.
-
-This is an app that has a minSdkVersion of 7 (Eclair)
-and a targetSdkVersion of 15 (ICS). The target version
-means the app is forbidden under ICS from doing any network
-communication on its main thread.
-
-The overall design:
-- A background service is started by the app. It handles the connection
-  to the emulator and provides a number of "handlers". Handlers can be
-  though as being separate tasks that the user wants to achieve, for example
-  sending sensor data, sending multi-touch events, receiving screen updates,
-  sending a camera feed, etc.
-- All the handlers are started when the service starts and shutdown with it.
-  They basically stay there as long as the app is running, and its up to the
-  handler to deal with emulator connections starts/stopping. Some handlers
-  will run in the background (e.g. sending sensor data) whereas other might
-  need an activity to connect to them first.
-- The app has a number of activities which connect to existing handlers.
-
-Another way to see it is that the app handles a number of tasks which are
-composed of a background handler (that consumes data form the emulator and
-can send data to the emulator) and an optional activity for UI (that displays
-or controls the handler's state.)
-
-
-Here's a quick overview of the classes in the application:
-
-
-The main UI is in activities.MainActivity.
-There are 2 tasks activities: SensorActivity and MultiTouchActivity.
-
-These all derive from BaseBindingActivity which provides a few convenient common features
-- in onResume this will bind to the service, creating and starting it if necessary.
-- in onPause, this will unbind from the service, but does not stop it.
-
-Note however that due to the asynchronous nature of the bind operation, the activity
-must not attempt to use the service from onResume. Instead there are 2 callbacks to use:
-- onServiceConnected when the bind succeeded.
-- onServiceDisconnected as the reverse operation.
-
-When the activity is connected to the service, it can then use getServiceBinder()
-to get an interface to talk to the service.
-
-In the other direction, the activity provides a listener for the service to notify
-the application: ControllerListener createControllerListener().
-
-The activity can then access the handler:
-  handler = getServiceBinder().getHandler(HandlerType....)
-
-and then the activity wants to provide a listener to get notified by the handler:
-  handler.addUiHandler(new android.os.Handler(this));
-
-The emulator connection is separated in the "lib" subpackage:
-- EmulatorConnection abstracts a connection to the emulator.
-    - Object is first created by giving a non-null EmulatorListener.
-    - then connect(port) is called to initiate the connection.
-    - The EmulatorConnection is always created in SYNC mode.
-- EmulatorListener is a callback: the emulator connection uses it to indicate
-    when the connection is actually connected or disconnected.
-
-In the end we have the following workflow describing who controls what (-->):
-
-
-                                        Emulator
-                                         ^   ^
-                                         |   | EmuCnxHandler
-                      sendEventToEmulator|   | (EmulatorListener)
-                                         |   +-------------+
-                                         |                 |
-              handlers.BaseHandler       |                 v
- Activity  ------------------------>  Handler  <---- ControllerService
-    UI     <------------------------                     |     ^
-              android.os.Handler                         |     |
-   |  ^                                                  |     |
-   |  |               ControllerListener                 |     |
-   |  +--------------------------------------------------+     |
-   +-----------------------------------------------------------+
-                       ControllerBinder
-
-----
diff --git a/apps/SdkController/NOTICE b/apps/SdkController/NOTICE
deleted file mode 100644
index 06a9081..0000000
--- a/apps/SdkController/NOTICE
+++ /dev/null
@@ -1,190 +0,0 @@
-
-   Copyright (c) 2005-2014, The Android Open Source Project
-
-   Licensed under the Apache License, Version 2.0 (the "License");
-   you may not use this file except in compliance with the License.
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
-
-
-                                 Apache License
-                           Version 2.0, January 2004
-                        http://www.apache.org/licenses/
-
-   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
-   1. Definitions.
-
-      "License" shall mean the terms and conditions for use, reproduction,
-      and distribution as defined by Sections 1 through 9 of this document.
-
-      "Licensor" shall mean the copyright owner or entity authorized by
-      the copyright owner that is granting the License.
-
-      "Legal Entity" shall mean the union of the acting entity and all
-      other entities that control, are controlled by, or are under common
-      control with that entity. For the purposes of this definition,
-      "control" means (i) the power, direct or indirect, to cause the
-      direction or management of such entity, whether by contract or
-      otherwise, or (ii) ownership of fifty percent (50%) or more of the
-      outstanding shares, or (iii) beneficial ownership of such entity.
-
-      "You" (or "Your") shall mean an individual or Legal Entity
-      exercising permissions granted by this License.
-
-      "Source" form shall mean the preferred form for making modifications,
-      including but not limited to software source code, documentation
-      source, and configuration files.
-
-      "Object" form shall mean any form resulting from mechanical
-      transformation or translation of a Source form, including but
-      not limited to compiled object code, generated documentation,
-      and conversions to other media types.
-
-      "Work" shall mean the work of authorship, whether in Source or
-      Object form, made available under the License, as indicated by a
-      copyright notice that is included in or attached to the work
-      (an example is provided in the Appendix below).
-
-      "Derivative Works" shall mean any work, whether in Source or Object
-      form, that is based on (or derived from) the Work and for which the
-      editorial revisions, annotations, elaborations, or other modifications
-      represent, as a whole, an original work of authorship. For the purposes
-      of this License, Derivative Works shall not include works that remain
-      separable from, or merely link (or bind by name) to the interfaces of,
-      the Work and Derivative Works thereof.
-
-      "Contribution" shall mean any work of authorship, including
-      the original version of the Work and any modifications or additions
-      to that Work or Derivative Works thereof, that is intentionally
-      submitted to Licensor for inclusion in the Work by the copyright owner
-      or by an individual or Legal Entity authorized to submit on behalf of
-      the copyright owner. For the purposes of this definition, "submitted"
-      means any form of electronic, verbal, or written communication sent
-      to the Licensor or its representatives, including but not limited to
-      communication on electronic mailing lists, source code control systems,
-      and issue tracking systems that are managed by, or on behalf of, the
-      Licensor for the purpose of discussing and improving the Work, but
-      excluding communication that is conspicuously marked or otherwise
-      designated in writing by the copyright owner as "Not a Contribution."
-
-      "Contributor" shall mean Licensor and any individual or Legal Entity
-      on behalf of whom a Contribution has been received by Licensor and
-      subsequently incorporated within the Work.
-
-   2. Grant of Copyright License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      copyright license to reproduce, prepare Derivative Works of,
-      publicly display, publicly perform, sublicense, and distribute the
-      Work and such Derivative Works in Source or Object form.
-
-   3. Grant of Patent License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      (except as stated in this section) patent license to make, have made,
-      use, offer to sell, sell, import, and otherwise transfer the Work,
-      where such license applies only to those patent claims licensable
-      by such Contributor that are necessarily infringed by their
-      Contribution(s) alone or by combination of their Contribution(s)
-      with the Work to which such Contribution(s) was submitted. If You
-      institute patent litigation against any entity (including a
-      cross-claim or counterclaim in a lawsuit) alleging that the Work
-      or a Contribution incorporated within the Work constitutes direct
-      or contributory patent infringement, then any patent licenses
-      granted to You under this License for that Work shall terminate
-      as of the date such litigation is filed.
-
-   4. Redistribution. You may reproduce and distribute copies of the
-      Work or Derivative Works thereof in any medium, with or without
-      modifications, and in Source or Object form, provided that You
-      meet the following conditions:
-
-      (a) You must give any other recipients of the Work or
-          Derivative Works a copy of this License; and
-
-      (b) You must cause any modified files to carry prominent notices
-          stating that You changed the files; and
-
-      (c) You must retain, in the Source form of any Derivative Works
-          that You distribute, all copyright, patent, trademark, and
-          attribution notices from the Source form of the Work,
-          excluding those notices that do not pertain to any part of
-          the Derivative Works; and
-
-      (d) If the Work includes a "NOTICE" text file as part of its
-          distribution, then any Derivative Works that You distribute must
-          include a readable copy of the attribution notices contained
-          within such NOTICE file, excluding those notices that do not
-          pertain to any part of the Derivative Works, in at least one
-          of the following places: within a NOTICE text file distributed
-          as part of the Derivative Works; within the Source form or
-          documentation, if provided along with the Derivative Works; or,
-          within a display generated by the Derivative Works, if and
-          wherever such third-party notices normally appear. The contents
-          of the NOTICE file are for informational purposes only and
-          do not modify the License. You may add Your own attribution
-          notices within Derivative Works that You distribute, alongside
-          or as an addendum to the NOTICE text from the Work, provided
-          that such additional attribution notices cannot be construed
-          as modifying the License.
-
-      You may add Your own copyright statement to Your modifications and
-      may provide additional or different license terms and conditions
-      for use, reproduction, or distribution of Your modifications, or
-      for any such Derivative Works as a whole, provided Your use,
-      reproduction, and distribution of the Work otherwise complies with
-      the conditions stated in this License.
-
-   5. Submission of Contributions. Unless You explicitly state otherwise,
-      any Contribution intentionally submitted for inclusion in the Work
-      by You to the Licensor shall be under the terms and conditions of
-      this License, without any additional terms or conditions.
-      Notwithstanding the above, nothing herein shall supersede or modify
-      the terms of any separate license agreement you may have executed
-      with Licensor regarding such Contributions.
-
-   6. Trademarks. This License does not grant permission to use the trade
-      names, trademarks, service marks, or product names of the Licensor,
-      except as required for reasonable and customary use in describing the
-      origin of the Work and reproducing the content of the NOTICE file.
-
-   7. Disclaimer of Warranty. Unless required by applicable law or
-      agreed to in writing, Licensor provides the Work (and each
-      Contributor provides its Contributions) on an "AS IS" BASIS,
-      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
-      implied, including, without limitation, any warranties or conditions
-      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
-      PARTICULAR PURPOSE. You are solely responsible for determining the
-      appropriateness of using or redistributing the Work and assume any
-      risks associated with Your exercise of permissions under this License.
-
-   8. Limitation of Liability. In no event and under no legal theory,
-      whether in tort (including negligence), contract, or otherwise,
-      unless required by applicable law (such as deliberate and grossly
-      negligent acts) or agreed to in writing, shall any Contributor be
-      liable to You for damages, including any direct, indirect, special,
-      incidental, or consequential damages of any character arising as a
-      result of this License or out of the use or inability to use the
-      Work (including but not limited to damages for loss of goodwill,
-      work stoppage, computer failure or malfunction, or any and all
-      other commercial damages or losses), even if such Contributor
-      has been advised of the possibility of such damages.
-
-   9. Accepting Warranty or Additional Liability. While redistributing
-      the Work or Derivative Works thereof, You may choose to offer,
-      and charge a fee for, acceptance of support, warranty, indemnity,
-      or other liability obligations and/or rights consistent with this
-      License. However, in accepting such obligations, You may act only
-      on Your own behalf and on Your sole responsibility, not on behalf
-      of any other Contributor, and only if You agree to indemnify,
-      defend, and hold each Contributor harmless for any liability
-      incurred by, or claims asserted against, such Contributor by reason
-      of your accepting any such warranty or additional liability.
-
-   END OF TERMS AND CONDITIONS
-
diff --git a/apps/SdkController/assets/intro_help.html b/apps/SdkController/assets/intro_help.html
deleted file mode 100755
index 7657aa3..0000000
--- a/apps/SdkController/assets/intro_help.html
+++ /dev/null
@@ -1,42 +0,0 @@
-<html>
-<!--
-/*
- * 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.
- */
--->
-<head>
-  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
-  <style type="text/css">
-     body      { color: white;  background-color: black }
-     a:link    { color: #33B5E5; /*blue*/    }
-     a:visited { color: #99CC00; /*green*/   }
-     a:hover   { color: #FFBB33; /*yellow*/; }
-  </style>
-</head>
-<body>
-<hr/>
-<b>SdkController</b> is used to send sensor data from an actual device to an emulator. <p/>
-To use it, do the following: <br/>
-<ol>
-<li>Connect your device to your computer via USB. Make sure to enable <i>USB Debugging</i> in <i>Settings &gt; Developer Options</i>. </li>
-<li>Start this application on your device. </li>
-<li>On the computer in a shell, run: <br/><i>adb forward tcp:1970 localabstract:android.sdk.controller</i> </li>
-<li>Finally <b>run an emulator</b> with an AVD targetting <b>API 15</b>.
-Multi-touch emulation must be explicitly enabled in emulator either by setting "Touch screen type" property to "multi-touch" in AVD Manager,
-or by starting the emulator with "-screen multi-touch" option.</li>
-</ol>
-<a href="https://sites.google.com/a/android.com/tools/recent/sensoremulation">Read more.</a>
-</body>
-</html>
diff --git a/apps/SdkController/bin/SdkControllerApp.apk b/apps/SdkController/bin/SdkControllerApp.apk
deleted file mode 100755
index f8c1294..0000000
--- a/apps/SdkController/bin/SdkControllerApp.apk
+++ /dev/null
Binary files differ
diff --git a/apps/SdkController/proguard-project.txt b/apps/SdkController/proguard-project.txt
deleted file mode 100755
index f2fe155..0000000
--- a/apps/SdkController/proguard-project.txt
+++ /dev/null
@@ -1,20 +0,0 @@
-# To enable ProGuard in your project, edit project.properties
-# to define the proguard.config property as described in that file.
-#
-# Add project specific ProGuard rules here.
-# By default, the flags in this file are appended to flags specified
-# in ${sdk.dir}/tools/proguard/proguard-android.txt
-# You can edit the include path and order by changing the ProGuard
-# include property in project.properties.
-#
-# For more details, see
-#   http://developer.android.com/guide/developing/tools/proguard.html
-
-# Add any project specific keep options here:
-
-# If your project uses WebView with JS, uncomment the following
-# and specify the fully qualified class name to the JavaScript interface
-# class:
-#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
-#   public *;
-#}
diff --git a/apps/SdkController/project.properties b/apps/SdkController/project.properties
deleted file mode 100755
index 9c52cb1..0000000
--- a/apps/SdkController/project.properties
+++ /dev/null
@@ -1,14 +0,0 @@
-# This file is automatically generated by Android Tools.
-# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
-#
-# This file must be checked in Version Control Systems.
-#
-# To customize properties used by the Ant build system edit
-# "ant.properties", and override values to adapt the script to your
-# project structure.
-#
-# To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home):
-#proguard.config=${sdk.dir}\tools\proguard\proguard-android.txt:proguard-project.txt
-
-# Project target.
-target=android-15
diff --git a/apps/SdkController/res/drawable-hdpi/ic_launcher.png b/apps/SdkController/res/drawable-hdpi/ic_launcher.png
deleted file mode 100755
index 96a442e..0000000
--- a/apps/SdkController/res/drawable-hdpi/ic_launcher.png
+++ /dev/null
Binary files differ
diff --git a/apps/SdkController/res/drawable-ldpi/ic_launcher.png b/apps/SdkController/res/drawable-ldpi/ic_launcher.png
deleted file mode 100755
index 9923872..0000000
--- a/apps/SdkController/res/drawable-ldpi/ic_launcher.png
+++ /dev/null
Binary files differ
diff --git a/apps/SdkController/res/drawable-mdpi/ic_launcher.png b/apps/SdkController/res/drawable-mdpi/ic_launcher.png
deleted file mode 100755
index 359047d..0000000
--- a/apps/SdkController/res/drawable-mdpi/ic_launcher.png
+++ /dev/null
Binary files differ
diff --git a/apps/SdkController/res/drawable-xhdpi/ic_launcher.png b/apps/SdkController/res/drawable-xhdpi/ic_launcher.png
deleted file mode 100755
index 71c6d76..0000000
--- a/apps/SdkController/res/drawable-xhdpi/ic_launcher.png
+++ /dev/null
Binary files differ
diff --git a/apps/SdkController/res/layout-land/sensors.xml b/apps/SdkController/res/layout-land/sensors.xml
deleted file mode 100755
index 1f3e2f1..0000000
--- a/apps/SdkController/res/layout-land/sensors.xml
+++ /dev/null
@@ -1,168 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
- * 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.
- */
--->
-<LinearLayout
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:tools="http://schemas.android.com/tools"
-    android:layout_width="fill_parent"
-    android:layout_height="fill_parent"
-    android:orientation="vertical"
-    >
-
-    <RelativeLayout
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content" >
-
-        <TableRow
-            android:id="@+id/row1"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content" >
-
-            <TextView
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:text="@string/sensors_sample_rate"
-                android:gravity="right"
-                android:layout_marginRight="8dp"
-                />
-
-            <EditText
-                android:id="@+id/textSampleRate"
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:ems="4"
-                android:gravity="right"
-                android:imeOptions="actionNone|flagNoExtractUi|flagNoFullscreen|"
-                android:inputType="number"
-                android:text="@string/sensors_default_sample_rate"
-                tools:ignore="HardcodedText" />
-
-            <TextView
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:text="@string/sensors_hz_per_sensor" />
-
-        </TableRow>
-
-        <TableRow
-            android:id="@+id/row2"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:layout_alignParentRight="true"
-            android:layout_alignBaseline="@+id/row1"
-            >
-
-            <TextView
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:gravity="right"
-                android:layout_marginRight="8dp"
-                android:text="@string/sensors_actual_rate" />
-
-            <TextView
-                android:id="@+id/textActualRate"
-                android:gravity="right"
-                android:text="--"
-                tools:ignore="HardcodedText"
-                android:paddingLeft="8dp"
-                android:paddingRight="8dp"
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content" />
-
-            <TextView
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:text="@string/sensors_hz_average" />
-
-            <!-- This 1-pixel wide invisible edit field makes sure that row1 and
-                 row2 have the same height and an equal baseline. This works around
-                 the fact that row2's attribute layout_alignBaseline=row1 is in fact
-                 ignored. -->
-            <EditText
-                android:layout_width="1px"
-                android:layout_height="wrap_content"
-                android:imeOptions="actionNone"
-                android:focusable="false"
-                android:focusableInTouchMode="false"
-                android:visibility="invisible"
-                />
-
-        </TableRow>
-
-    </RelativeLayout>
-
-    <TableLayout
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_gravity="center_horizontal"
-        >
-
-        <TableRow
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content" >
-
-        </TableRow>
-
-        <TableRow
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content" >
-
-        </TableRow>
-
-    </TableLayout>
-
-    <TextView
-        android:layout_width="fill_parent"
-        android:layout_height="wrap_content"
-        android:layout_marginTop="16dp"
-        android:text="@string/sensors_top_description" />
-
-    <ScrollView
-        android:id="@+id/scrollView1"
-        android:layout_width="fill_parent"
-        android:layout_height="0dp"
-        android:layout_weight="1" >
-
-        <TableLayout
-            android:id="@+id/tableLayout"
-            android:layout_width="fill_parent"
-            android:layout_height="wrap_content"
-            android:saveEnabled="false" />
-
-    </ScrollView>
-
-    <!-- Placeholder status text. Becomes visibility=gone when empty. -->
-    <TextView
-        android:id="@+id/textStatus"
-        android:layout_width="fill_parent"
-        android:layout_height="wrap_content"
-        android:layout_marginTop="8dp"
-        android:textAppearance="?android:attr/textAppearanceSmall" />
-
-    <!-- Placeholder error text. Becomes visibility=gone when empty. -->
-    <TextView
-        android:id="@+id/textError"
-        android:layout_width="fill_parent"
-        android:layout_height="wrap_content"
-        android:gravity="center_horizontal"
-        android:background="#F00F"
-        android:padding="8dp"
-        android:textAppearance="?android:attr/textAppearanceSmall"
-        android:textColor="#FFF0" />
-
-</LinearLayout>
\ No newline at end of file
diff --git a/apps/SdkController/res/layout/main.xml b/apps/SdkController/res/layout/main.xml
deleted file mode 100755
index 2e7a4bb..0000000
--- a/apps/SdkController/res/layout/main.xml
+++ /dev/null
@@ -1,116 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
- * 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.
- */
--->
-
-<ScrollView
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:tools="http://schemas.android.com/tools"
-    android:layout_width="fill_parent"
-    android:layout_height="wrap_content"
-    >
-
-    <RelativeLayout
-        android:layout_width="fill_parent"
-        android:layout_height="wrap_content"
-        android:padding="8dp" >
-
-        <ToggleButton
-            android:id="@+id/toggleService"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:layout_alignParentRight="true"
-            />
-
-        <TextView
-            android:id="@+id/labelService"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:layout_alignBaseline="@+id/toggleService"
-            android:layout_alignParentLeft="true"
-            android:layout_marginTop="20dp"
-            android:text="@string/main_label_service"
-            android:textAppearance="?android:attr/textAppearanceLarge" />
-
-        <!-- Placeholder status text. Becomes visibility=gone when empty. -->
-        <TextView
-            android:id="@+id/textStatus"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:layout_alignBaseline="@+id/labelService"
-            android:layout_marginLeft="8dp"
-            android:layout_toRightOf="@+id/labelService"
-            android:text="[status]"
-            android:textAppearance="?android:attr/textAppearanceLarge"
-            tools:ignore="HardcodedText" />
-
-        <!-- Placeholder error text. Becomes visibility=gone when empty. -->
-        <TextView
-            android:id="@+id/textError"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:layout_alignParentLeft="true"
-            android:layout_alignParentRight="true"
-            android:layout_below="@+id/toggleService"
-            android:layout_marginBottom="8dp"
-            android:layout_marginTop="8dp"
-            android:background="#F00F"
-            android:gravity="center_horizontal"
-            android:padding="8dp"
-            android:text="[service errors]"
-            android:textAppearance="?android:attr/textAppearanceMedium"
-            android:textColor="#FFF0"
-            tools:ignore="HardcodedText" />
-
-        <TextView
-            android:id="@+id/labelButtons"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:layout_below="@+id/textError"
-            android:layout_marginTop="16dp"
-            android:text="@string/main_label_buttons"
-            android:textAppearance="?android:attr/textAppearanceLarge" />
-
-        <Button
-            android:id="@+id/btnOpenMultitouch"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:layout_below="@+id/labelButtons"
-            android:layout_centerHorizontal="true"
-            android:layout_marginTop="16dp"
-            android:text="@string/main_btn_open_multitouch" />
-
-        <Button
-            android:id="@+id/btnOpenSensors"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:layout_below="@+id/btnOpenMultitouch"
-            android:layout_centerHorizontal="true"
-            android:layout_marginTop="16dp"
-            android:text="@string/main_btn_open_sensors" />
-
-        <WebView
-            android:id="@+id/webIntro"
-            android:layout_width="fill_parent"
-            android:layout_height="wrap_content"
-            android:layout_below="@+id/btnOpenSensors"
-            android:layout_marginTop="16dp"
-            android:background="@null"
-            />
-
-    </RelativeLayout>
-</ScrollView>
diff --git a/apps/SdkController/res/layout/multitouch.xml b/apps/SdkController/res/layout/multitouch.xml
deleted file mode 100755
index 0aec0fb..0000000
--- a/apps/SdkController/res/layout/multitouch.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<RelativeLayout
-      xmlns:android="http://schemas.android.com/apk/res/android"
-      android:layout_width="fill_parent"
-      android:layout_height="fill_parent" >
-
-    <com.android.tools.sdkcontroller.views.MultiTouchView
-         android:id="@+id/imageView"
-         android:layout_width="fill_parent"
-         android:layout_height="fill_parent" />
-
-    <!-- Placeholder status text. Becomes visibility=gone when empty. -->
-    <TextView
-        android:id="@+id/textStatus"
-        android:layout_width="fill_parent"
-        android:layout_height="wrap_content"
-        android:layout_alignParentTop="true"
-        android:textAppearance="?android:attr/textAppearanceSmall" />
-
-    <!-- Placeholder error text. Becomes visibility=gone when empty. -->
-    <TextView
-        android:id="@+id/textError"
-        android:layout_width="fill_parent"
-        android:layout_height="wrap_content"
-        android:layout_below="@+id/textStatus"
-        android:gravity="center_horizontal"
-        android:background="#F00F"
-        android:padding="8dp"
-        android:textAppearance="?android:attr/textAppearanceSmall"
-        android:textColor="#FFF0" />
-
-</RelativeLayout>
diff --git a/apps/SdkController/res/layout/sensor_row.xml b/apps/SdkController/res/layout/sensor_row.xml
deleted file mode 100755
index 16ffd42..0000000
--- a/apps/SdkController/res/layout/sensor_row.xml
+++ /dev/null
@@ -1,42 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
- * 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.
- */
--->
-
-<!-- One row per sensor added to the TableLayout from layout/sensors.xml -->
-<TableRow xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:tools="http://schemas.android.com/tools"
-    android:layout_width="fill_parent"
-    android:layout_height="fill_parent" >
-
-    <CheckBox
-        android:id="@+id/row_checkbox"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_marginRight="10dp"
-        android:saveEnabled="false"
-        android:text="Some CheckBox"
-        tools:ignore="HardcodedText" />
-
-    <TextView
-        android:id="@+id/row_textview"
-        android:layout_width="fill_parent"
-        android:layout_height="wrap_content"
-        android:layout_weight="1"
-        android:textAppearance="?android:attr/textAppearanceSmall" />
-
-</TableRow>
diff --git a/apps/SdkController/res/layout/sensors.xml b/apps/SdkController/res/layout/sensors.xml
deleted file mode 100755
index afdab02..0000000
--- a/apps/SdkController/res/layout/sensors.xml
+++ /dev/null
@@ -1,130 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
- * 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.
- */
--->
-<LinearLayout
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:tools="http://schemas.android.com/tools"
-    android:layout_width="fill_parent"
-    android:layout_height="fill_parent"
-    android:orientation="vertical"
-    >
-
-    <TableLayout
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_gravity="center_horizontal"
-        >
-
-        <TableRow
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content" >
-
-            <TextView
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:text="@string/sensors_sample_rate"
-                android:gravity="right"
-                android:layout_marginRight="8dp"
-                />
-            <EditText
-                android:id="@+id/textSampleRate"
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:ems="4"
-                android:gravity="right"
-                android:imeOptions="actionNone|flagNoExtractUi|flagNoFullscreen|"
-                android:inputType="number"
-                android:text="@string/sensors_default_sample_rate" />
-
-            <TextView
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:text="@string/sensors_hz_per_sensor" />
-
-        </TableRow>
-
-        <TableRow
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content" >
-
-            <TextView
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:gravity="right"
-                android:layout_marginRight="8dp"
-                android:text="@string/sensors_actual_rate" />
-
-            <TextView
-                android:id="@+id/textActualRate"
-                android:gravity="right"
-                android:text="--"
-                tools:ignore="HardcodedText"
-                android:paddingLeft="8dp"
-                android:paddingRight="8dp"
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content" />
-
-            <TextView
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:text="@string/sensors_hz_average" />
-
-        </TableRow>
-
-    </TableLayout>
-
-    <TextView
-        android:layout_width="fill_parent"
-        android:layout_height="wrap_content"
-        android:layout_marginTop="16dp"
-        android:text="@string/sensors_top_description" />
-
-    <ScrollView
-        android:id="@+id/scrollView1"
-        android:layout_width="fill_parent"
-        android:layout_height="0dp"
-        android:layout_weight="1" >
-
-        <TableLayout
-            android:id="@+id/tableLayout"
-            android:layout_width="fill_parent"
-            android:layout_height="wrap_content"
-            android:saveEnabled="false" />
-
-    </ScrollView>
-
-    <!-- Placeholder status text. Becomes visibility=gone when empty. -->
-    <TextView
-        android:id="@+id/textStatus"
-        android:layout_width="fill_parent"
-        android:layout_height="wrap_content"
-        android:layout_marginTop="8dp"
-        android:textAppearance="?android:attr/textAppearanceSmall" />
-
-    <!-- Placeholder error text. Becomes visibility=gone when empty. -->
-    <TextView
-        android:id="@+id/textError"
-        android:layout_width="fill_parent"
-        android:layout_height="wrap_content"
-        android:gravity="center_horizontal"
-        android:background="#F00F"
-        android:padding="8dp"
-        android:textAppearance="?android:attr/textAppearanceSmall"
-        android:textColor="#FFF0" />
-
-</LinearLayout>
\ No newline at end of file
diff --git a/apps/SdkController/res/values-v11/styles_v11.xml b/apps/SdkController/res/values-v11/styles_v11.xml
deleted file mode 100755
index 3d3860e..0000000
--- a/apps/SdkController/res/values-v11/styles_v11.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
- * 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.
- */
--->
-
-<resources>
-
-    <style name="Theme.MultiTouch" parent="android:Theme.Holo.NoActionBar.Fullscreen">
-        <item name="android:windowBackground">@android:color/transparent</item>
-    </style>
-
-</resources>
diff --git a/apps/SdkController/res/values/strings.xml b/apps/SdkController/res/values/strings.xml
deleted file mode 100755
index e4e1dbb..0000000
--- a/apps/SdkController/res/values/strings.xml
+++ /dev/null
@@ -1,48 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
- * 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.
- */
--->
-
-<resources>
-
-    <!-- Strings for manifest. -->
-    <string name="app_name">SDK Controller</string>
-    <string name="service_description">Background service for SDK Controller</string>
-
-    <!-- Strings for service. -->
-    <string name="service_notif_title">SDK Controller is running</string>
-
-    <!-- Strings for layout/main -->
-    <string name="main_label_service">Service:</string>
-    <string name="main_label_buttons">What you can do:</string>
-    <string name="main_btn_open_multitouch">Control Multi-touch</string>
-    <string name="main_btn_open_sensors">Control Sensors</string>
-    <string name="main_service_status_connected">Emulator Connected</string>
-    <string name="main_service_status_disconnected">Emulator Connected</string>
-
-    <!-- Strings for layout/sensors -->
-    <string name="sensors_activity_title">SDK Controller &gt; Sensors</string>
-    <string name="sensors_top_description">Available Sensors:</string>
-    <string name="sensors_sample_rate">Sample Rate</string>
-    <string name="sensors_hz_per_sensor">Hz per sensor</string>
-    <string name="sensors_actual_rate">Actual</string>
-    <string name="sensors_hz_average">Hz average</string>
-    <!-- Default sample rate for SensorsActivity UI.
-         Should match the default for SensorsHandler.mUpdateTargetMs. -->
-    <string name="sensors_default_sample_rate">20</string>
-
-</resources>
diff --git a/apps/SdkController/res/values/styles.xml b/apps/SdkController/res/values/styles.xml
deleted file mode 100755
index 67c7278..0000000
--- a/apps/SdkController/res/values/styles.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
- * 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.
- */
--->
-
-<resources>
-
-    <style name="Theme.MultiTouch" parent="android:Theme.NoTitleBar.Fullscreen">
-        <item name="android:windowBackground">@android:color/transparent</item>
-    </style>
-
-</resources>
diff --git a/apps/SdkController/src/com/android/tools/sdkcontroller/activities/BaseBindingActivity.java b/apps/SdkController/src/com/android/tools/sdkcontroller/activities/BaseBindingActivity.java
deleted file mode 100755
index ab5306d..0000000
--- a/apps/SdkController/src/com/android/tools/sdkcontroller/activities/BaseBindingActivity.java
+++ /dev/null
@@ -1,159 +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.sdkcontroller.activities;
-
-import android.app.Activity;
-import android.content.ComponentName;
-import android.content.Context;
-import android.content.Intent;
-import android.content.ServiceConnection;
-import android.os.IBinder;
-import android.util.Log;
-
-import com.android.tools.sdkcontroller.service.ControllerService;
-import com.android.tools.sdkcontroller.service.ControllerService.ControllerBinder;
-import com.android.tools.sdkcontroller.service.ControllerService.ControllerListener;
-
-/**
- * Base activity class that knows how to bind and unbind from the
- * {@link ControllerService}.
- */
-public abstract class BaseBindingActivity extends Activity {
-
-    public static String TAG = BaseBindingActivity.class.getSimpleName();
-    private static boolean DEBUG = true;
-    private ServiceConnection mServiceConnection;
-    private ControllerBinder mServiceBinder;
-
-    /**
-     * Returns the binder. Activities can use that to query the controller service.
-     * @return An existing {@link ControllerBinder}.
-     *   The binder is only valid between calls {@link #onServiceConnected()} and
-     *   {@link #onServiceDisconnected()}. Returns null when not valid.
-     */
-    public ControllerBinder getServiceBinder() {
-        return mServiceBinder;
-    }
-
-    /**
-     * Called when the activity resumes.
-     * This automatically binds to the service, starting it as needed.
-     * <p/>
-     * Since on resume we automatically bind to the service, the {@link ServiceConnection}
-     * will is restored and {@link #onServiceConnected()} is called as necessary.
-     * Derived classes that need to initialize anything that is related to the service
-     * (e.g. getting their handler) should thus do so in {@link #onServiceConnected()} and
-     * <em>not</em> in {@link #onResume()} -- since binding to the service is asynchronous
-     * there is <em>no</em> guarantee that {@link #getServiceBinder()} returns non-null
-     * when this call finishes.
-     */
-    @Override
-    protected void onResume() {
-        super.onResume();
-        bindToService();
-    }
-
-    /**
-     * Called when the activity is paused.
-     * This automatically unbinds from the service but does not stop it.
-     */
-    @Override
-    protected void onPause() {
-        super.onPause();
-        unbindFromService();
-    }
-
-    // ----------
-
-    /**
-     * Called when binding to the service to get the activity's {@link ControllerListener}.
-     * @return A new non-null {@link ControllerListener}.
-     */
-    protected abstract ControllerListener createControllerListener();
-
-    /**
-     * Called by the service once the activity is connected (bound) to it.
-     * <p/>
-     * When this is called, {@link #getServiceBinder()} returns a non-null binder that
-     * can be used by the activity to control the service.
-     */
-    protected abstract void onServiceConnected();
-
-    /**
-     * Called by the service when it is forcibly disconnected OR when we know
-     * we're unbinding the service.
-     * <p/>
-     * When this is called, {@link #getServiceBinder()} returns a null binder and
-     * the activity should stop using that binder and remove any reference to it.
-     */
-    protected abstract void onServiceDisconnected();
-
-    /**
-     * Starts the service and binds to it.
-     */
-    protected void bindToService() {
-        if (mServiceConnection == null) {
-            final ControllerListener listener = createControllerListener();
-
-            mServiceConnection = new ServiceConnection() {
-                /**
-                 * Called when the service is connected.
-                 * Allows us to retrieve the binder to talk to the service.
-                 */
-                @Override
-                public void onServiceConnected(ComponentName name, IBinder service) {
-                    if (DEBUG) Log.d(TAG, "Activity connected to service");
-                    mServiceBinder = (ControllerBinder) service;
-                    mServiceBinder.addControllerListener(listener);
-                    BaseBindingActivity.this.onServiceConnected();
-                }
-
-                /**
-                 * Called when the service got disconnected, e.g. because it crashed.
-                 * This is <em>not</em> called when we unbind from the service.
-                 */
-                @Override
-                public void onServiceDisconnected(ComponentName name) {
-                    if (DEBUG) Log.d(TAG, "Activity disconnected from service");
-                    mServiceBinder = null;
-                    BaseBindingActivity.this.onServiceDisconnected();
-                }
-            };
-        }
-
-        // Start service so that it doesn't stop when we unbind
-        if (DEBUG) Log.d(TAG, "start requested & bind service");
-        Intent service = new Intent(this, ControllerService.class);
-        startService(service);
-        bindService(service,
-                mServiceConnection,
-                Context.BIND_AUTO_CREATE);
-    }
-
-    /**
-     * Unbinds from the service but does not actually stop the service.
-     * This lets us have it run in the background even if this isn't the active activity.
-     */
-    protected void unbindFromService() {
-        if (mServiceConnection != null) {
-            if (DEBUG) Log.d(TAG, "unbind service");
-            mServiceConnection.onServiceDisconnected(null /*name*/);
-            unbindService(mServiceConnection);
-            mServiceConnection = null;
-        }
-    }
-}
\ No newline at end of file
diff --git a/apps/SdkController/src/com/android/tools/sdkcontroller/activities/MainActivity.java b/apps/SdkController/src/com/android/tools/sdkcontroller/activities/MainActivity.java
deleted file mode 100755
index 4769245..0000000
--- a/apps/SdkController/src/com/android/tools/sdkcontroller/activities/MainActivity.java
+++ /dev/null
@@ -1,208 +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.sdkcontroller.activities;
-
-import android.content.Intent;
-import android.os.Bundle;
-import android.util.Log;
-import android.view.View;
-import android.view.View.OnClickListener;
-import android.webkit.WebView;
-import android.widget.Button;
-import android.widget.CompoundButton;
-import android.widget.CompoundButton.OnCheckedChangeListener;
-import android.widget.TextView;
-import android.widget.ToggleButton;
-
-import com.android.tools.sdkcontroller.R;
-import com.android.tools.sdkcontroller.service.ControllerService;
-import com.android.tools.sdkcontroller.service.ControllerService.ControllerBinder;
-import com.android.tools.sdkcontroller.service.ControllerService.ControllerListener;
-
-/**
- * Main activity. It's the entry point for the application.
- * It allows the user to start/stop the service and see it's current state and errors.
- * It also has buttons to start either the sensor control activity or the multitouch activity.
- */
-public class MainActivity extends BaseBindingActivity {
-
-    @SuppressWarnings("hiding")
-    public static String TAG = MainActivity.class.getSimpleName();
-    private static boolean DEBUG = true;
-    private Button mBtnOpenMultitouch;
-    private Button mBtnOpenSensors;
-    private ToggleButton mBtnToggleService;
-    private TextView mTextError;
-    private TextView mTextStatus;
-
-    /** Called when the activity is first created. */
-    @Override
-    public void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-        setContentView(R.layout.main);
-
-        mTextError  = (TextView) findViewById(R.id.textError);
-        mTextStatus = (TextView) findViewById(R.id.textStatus);
-
-        WebView wv = (WebView) findViewById(R.id.webIntro);
-        wv.loadUrl("file:///android_asset/intro_help.html");
-
-        setupButtons();
-    }
-
-    @Override
-    protected void onResume() {
-        // BaseBindingActivity.onResume will bind to the service.
-        super.onResume();
-        updateError();
-    }
-
-    @Override
-    protected void onPause() {
-        // BaseBindingActivity.onResume will unbind from (but not stop) the service.
-        super.onPause();
-    }
-
-    @Override
-    public void onBackPressed() {
-        if (DEBUG) Log.d(TAG, "onBackPressed");
-        // If back is pressed, we stop the service automatically.
-        // It seems more intuitive that way.
-        stopService();
-        super.onBackPressed();
-    }
-
-    // ----------
-
-    @Override
-    protected void onServiceConnected() {
-        updateButtons();
-    }
-
-    @Override
-    protected void onServiceDisconnected() {
-        updateButtons();
-    }
-
-    @Override
-    protected ControllerListener createControllerListener() {
-        return new MainControllerListener();
-    }
-
-    // ----------
-
-    private void setupButtons() {
-        mBtnOpenMultitouch = (Button) findViewById(R.id.btnOpenMultitouch);
-        mBtnOpenSensors    = (Button) findViewById(R.id.btnOpenSensors);
-
-        mBtnOpenMultitouch.setOnClickListener(new OnClickListener() {
-            @Override
-            public void onClick(View v) {
-                // Open the multi-touch activity.
-                Intent i = new Intent(MainActivity.this, MultiTouchActivity.class);
-                startActivity(i);
-            }
-        });
-
-        mBtnOpenSensors.setOnClickListener(new OnClickListener() {
-            @Override
-            public void onClick(View v) {
-                // Open the sensor activity.
-                Intent i = new Intent(MainActivity.this, SensorActivity.class);
-                startActivity(i);
-            }
-        });
-
-        mBtnToggleService = (ToggleButton) findViewById(R.id.toggleService);
-
-        // set initial state
-        updateButtons();
-
-        mBtnToggleService.setOnCheckedChangeListener(new OnCheckedChangeListener() {
-            @Override
-            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
-                if (isChecked) {
-                    bindToService();
-                    updateButtons();
-                } else {
-                    stopService();
-                    updateButtons();
-                }
-            }
-        });
-
-    }
-
-    private void updateButtons() {
-        boolean running = ControllerService.isServiceIsRunning();
-        mBtnOpenMultitouch.setEnabled(running);
-        mBtnOpenSensors.setEnabled(running);
-        mBtnToggleService.setChecked(running);
-    }
-
-    /**
-     * Unbind and then actually stops the service.
-     */
-    private void stopService() {
-        Intent service = new Intent(this, ControllerService.class);
-        unbindFromService();
-        if (DEBUG) Log.d(TAG, "stop service requested");
-        stopService(service);
-    }
-
-    private class MainControllerListener implements ControllerListener {
-        @Override
-        public void onErrorChanged() {
-            runOnUiThread(new Runnable() {
-                @Override
-                public void run() {
-                    updateError();
-                }
-            });
-        }
-
-        @Override
-        public void onStatusChanged() {
-            runOnUiThread(new Runnable() {
-                @Override
-                public void run() {
-                    updateStatus();
-                }
-            });
-        }
-    }
-
-    private void updateError() {
-        ControllerBinder binder = getServiceBinder();
-        String error = binder == null ? "" : binder.getServiceError();
-        if (error == null) {
-            error = "";
-        }
-
-        mTextError.setVisibility(error.length() == 0 ? View.GONE : View.VISIBLE);
-        mTextError.setText(error);
-    }
-
-    private void updateStatus() {
-        ControllerBinder binder = getServiceBinder();
-        boolean connected = binder == null ? false : binder.isEmuConnected();
-        mTextStatus.setText(
-                getText(connected ? R.string.main_service_status_connected
-                                  : R.string.main_service_status_disconnected));
-
-    }
-}
\ No newline at end of file
diff --git a/apps/SdkController/src/com/android/tools/sdkcontroller/activities/MultiTouchActivity.java b/apps/SdkController/src/com/android/tools/sdkcontroller/activities/MultiTouchActivity.java
deleted file mode 100755
index faba882..0000000
--- a/apps/SdkController/src/com/android/tools/sdkcontroller/activities/MultiTouchActivity.java
+++ /dev/null
@@ -1,388 +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.sdkcontroller.activities;
-
-import java.io.ByteArrayInputStream;
-import java.nio.ByteBuffer;
-import java.nio.ByteOrder;
-
-import android.graphics.Color;
-import android.os.Bundle;
-import android.os.Message;
-import android.util.Log;
-import android.view.MotionEvent;
-import android.view.View;
-import android.view.View.OnTouchListener;
-import android.widget.TextView;
-
-import com.android.tools.sdkcontroller.R;
-import com.android.tools.sdkcontroller.handlers.MultiTouchChannel;
-import com.android.tools.sdkcontroller.lib.Channel;
-import com.android.tools.sdkcontroller.lib.ProtocolConstants;
-import com.android.tools.sdkcontroller.service.ControllerService.ControllerBinder;
-import com.android.tools.sdkcontroller.service.ControllerService.ControllerListener;
-import com.android.tools.sdkcontroller.utils.ApiHelper;
-import com.android.tools.sdkcontroller.views.MultiTouchView;
-
-/**
- * Activity that controls and displays the {@link MultiTouchChannel}.
- */
-public class MultiTouchActivity extends BaseBindingActivity
-        implements android.os.Handler.Callback {
-
-    @SuppressWarnings("hiding")
-    private static String TAG = MultiTouchActivity.class.getSimpleName();
-    private static boolean DEBUG = true;
-
-    private volatile MultiTouchChannel mHandler;
-
-    private TextView mTextError;
-    private TextView mTextStatus;
-    private MultiTouchView mImageView;
-    /** Width of the emulator's display. */
-    private int mEmulatorWidth = 0;
-    /** Height of the emulator's display. */
-    private int mEmulatorHeight = 0;
-    /** Bitmap storage. */
-    private int[] mColors;
-
-    private final TouchListener mTouchListener = new TouchListener();
-    private final android.os.Handler mUiHandler = new android.os.Handler(this);
-
-    /** Called when the activity is first created. */
-    @Override
-    public void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-        setContentView(R.layout.multitouch);
-        mImageView  = (MultiTouchView) findViewById(R.id.imageView);
-        mTextError  = (TextView) findViewById(R.id.textError);
-        mTextStatus = (TextView) findViewById(R.id.textStatus);
-        updateStatus("Waiting for connection");
-
-        ApiHelper ah = ApiHelper.get();
-        ah.View_setSystemUiVisibility(mImageView, View.SYSTEM_UI_FLAG_LOW_PROFILE);
-    }
-
-    @Override
-    protected void onResume() {
-        if (DEBUG) Log.d(TAG, "onResume");
-        // BaseBindingActivity.onResume will bind to the service.
-        // Note: any initialization related to the service or the handler should
-        // go in onServiceConnected() since in this call the service may not be
-        // bound yet.
-        super.onResume();
-        updateError();
-    }
-
-    @Override
-    protected void onPause() {
-        if (DEBUG) Log.d(TAG, "onPause");
-        // BaseBindingActivity.onResume will unbind from (but not stop) the service.
-        super.onPause();
-        mImageView.setEnabled(false);
-        updateStatus("Paused");
-    }
-
-    // ----------
-
-    @Override
-    protected void onServiceConnected() {
-        if (DEBUG) Log.d(TAG, "onServiceConnected");
-        mHandler = (MultiTouchChannel) getServiceBinder().getChannel(Channel.MULTITOUCH_CHANNEL);
-        if (mHandler != null) {
-            mHandler.setViewSize(mImageView.getWidth(), mImageView.getHeight());
-            mHandler.addUiHandler(mUiHandler);
-        }
-    }
-
-    @Override
-    protected void onServiceDisconnected() {
-        if (DEBUG) Log.d(TAG, "onServiceDisconnected");
-        if (mHandler != null) {
-            mHandler.removeUiHandler(mUiHandler);
-            mHandler = null;
-        }
-    }
-
-    @Override
-    protected ControllerListener createControllerListener() {
-        return new MultiTouchControllerListener();
-    }
-
-    // ----------
-
-    private class MultiTouchControllerListener implements ControllerListener {
-        @Override
-        public void onErrorChanged() {
-            runOnUiThread(new Runnable() {
-                @Override
-                public void run() {
-                    updateError();
-                }
-            });
-        }
-
-        @Override
-        public void onStatusChanged() {
-            runOnUiThread(new Runnable() {
-                @Override
-                public void run() {
-                    ControllerBinder binder = getServiceBinder();
-                    if (binder != null) {
-                        boolean connected = binder.isEmuConnected();
-                        mImageView.setEnabled(connected);
-                        updateStatus(connected ? "Emulator connected" : "Emulator disconnected");
-                    }
-                }
-            });
-        }
-    }
-
-    // ----------
-
-    /**
-     * Implements OnTouchListener interface that receives touch screen events,
-     * and reports them to the emulator application.
-     */
-    class TouchListener implements OnTouchListener {
-        /**
-         * Touch screen event handler.
-         */
-        @Override
-        public boolean onTouch(View v, MotionEvent event) {
-            ByteBuffer bb = null;
-            final int action = event.getAction();
-            final int action_code = action & MotionEvent.ACTION_MASK;
-            final int action_pid_index = action >> MotionEvent.ACTION_POINTER_ID_SHIFT;
-            int msg_type = 0;
-            MultiTouchChannel h = mHandler;
-
-            // Build message for the emulator.
-            switch (action_code) {
-                case MotionEvent.ACTION_MOVE:
-                    if (h != null) {
-                        bb = ByteBuffer.allocate(
-                                event.getPointerCount() * ProtocolConstants.MT_EVENT_ENTRY_SIZE);
-                        bb.order(h.getEndian());
-                        for (int n = 0; n < event.getPointerCount(); n++) {
-                            mImageView.constructEventMessage(bb, event, n);
-                        }
-                        msg_type = ProtocolConstants.MT_MOVE;
-                    }
-                    break;
-                case MotionEvent.ACTION_DOWN:
-                    if (h != null) {
-                        bb = ByteBuffer.allocate(ProtocolConstants.MT_EVENT_ENTRY_SIZE);
-                        bb.order(h.getEndian());
-                        mImageView.constructEventMessage(bb, event, action_pid_index);
-                        msg_type = ProtocolConstants.MT_FISRT_DOWN;
-                    }
-                    break;
-                case MotionEvent.ACTION_UP:
-                    if (h != null) {
-                        bb = ByteBuffer.allocate(ProtocolConstants.MT_EVENT_ENTRY_SIZE);
-                        bb.order(h.getEndian());
-                        bb.putInt(event.getPointerId(action_pid_index));
-                        msg_type = ProtocolConstants.MT_LAST_UP;
-                    }
-                    break;
-                case MotionEvent.ACTION_POINTER_DOWN:
-                    if (h != null) {
-                        bb = ByteBuffer.allocate(ProtocolConstants.MT_EVENT_ENTRY_SIZE);
-                        bb.order(h.getEndian());
-                        mImageView.constructEventMessage(bb, event, action_pid_index);
-                        msg_type = ProtocolConstants.MT_POINTER_DOWN;
-                    }
-                    break;
-                case MotionEvent.ACTION_POINTER_UP:
-                    if (h != null) {
-                        bb = ByteBuffer.allocate(ProtocolConstants.MT_EVENT_ENTRY_SIZE);
-                        bb.order(h.getEndian());
-                        bb.putInt(event.getPointerId(action_pid_index));
-                        msg_type = ProtocolConstants.MT_POINTER_UP;
-                    }
-                    break;
-                default:
-                    Log.w(TAG, "Unknown action type: " + action_code);
-                    return true;
-            }
-
-            if (DEBUG && bb != null) Log.d(TAG, bb.toString());
-
-            if (h != null && bb != null) {
-                h.postMessage(msg_type, bb);
-            }
-            return true;
-        }
-    } // TouchListener
-
-    /** Implementation of Handler.Callback */
-    @Override
-    public boolean handleMessage(Message msg) {
-        switch (msg.what) {
-        case MultiTouchChannel.EVENT_MT_START:
-            MultiTouchChannel h = mHandler;
-            if (h != null) {
-                mImageView.setEnabled(true);
-                mImageView.setOnTouchListener(mTouchListener);
-            }
-            break;
-        case MultiTouchChannel.EVENT_MT_STOP:
-            mImageView.setOnTouchListener(null);
-            break;
-        case MultiTouchChannel.EVENT_FRAME_BUFFER:
-            onFrameBuffer(((ByteBuffer) msg.obj).array());
-            mHandler.postMessage(ProtocolConstants.MT_FB_HANDLED, (byte[]) null);
-            break;
-        }
-        return true; // we consumed this message
-    }
-
-    /**
-     * Called when a BLOB query is received from the emulator.
-     * <p/>
-     * This query is used to deliver framebuffer updates in the emulator. The
-     * blob contains an update header, followed by the bitmap containing updated
-     * rectangle. The header is defined as MTFrameHeader structure in
-     * external/qemu/android/multitouch-port.h
-     * <p/>
-     * NOTE: This method is called from the I/O loop, so all communication with
-     * the emulator will be "on hold" until this method returns.
-     *
-     * TODO ===> CHECK that we can consume that array from a different thread than the producer's.
-     * E.g. does the produce reuse the same array or does it generate a new one each time?
-     *
-     * @param array contains BLOB data for the query.
-     */
-    private void onFrameBuffer(byte[] array) {
-        final ByteBuffer bb = ByteBuffer.wrap(array);
-        bb.order(ByteOrder.LITTLE_ENDIAN);
-
-        // Read frame header.
-        final int header_size = bb.getInt();
-        final int disp_width = bb.getInt();
-        final int disp_height = bb.getInt();
-        final int x = bb.getInt();
-        final int y = bb.getInt();
-        final int w = bb.getInt();
-        final int h = bb.getInt();
-        final int bpl = bb.getInt();
-        final int bpp = bb.getInt();
-        final int format = bb.getInt();
-
-        // Update application display.
-        updateDisplay(disp_width, disp_height);
-
-        if (format == ProtocolConstants.MT_FRAME_JPEG) {
-            /*
-             * Framebuffer is in JPEG format.
-             */
-
-            final ByteArrayInputStream jpg = new ByteArrayInputStream(bb.array());
-            // Advance input stream to JPEG image.
-            jpg.skip(header_size);
-            // Draw the image.
-            mImageView.drawJpeg(x, y, w, h, jpg);
-        } else {
-            /*
-             * Framebuffer is in a raw RGB format.
-             */
-
-            final int pixel_num = h * w;
-            // Advance stream to the beginning of framebuffer data.
-            bb.position(header_size);
-
-            // Make sure that mColors is large enough to contain the
-            // update bitmap.
-            if (mColors == null || mColors.length < pixel_num) {
-                mColors = new int[pixel_num];
-            }
-
-            // Convert the blob bitmap into bitmap that we will display.
-            if (format == ProtocolConstants.MT_FRAME_RGB565) {
-                for (int n = 0; n < pixel_num; n++) {
-                    // Blob bitmap is in RGB565 format.
-                    final int color = bb.getShort();
-                    final int r = ((color & 0xf800) >> 8) | ((color & 0xf800) >> 14);
-                    final int g = ((color & 0x7e0) >> 3) | ((color & 0x7e0) >> 9);
-                    final int b = ((color & 0x1f) << 3) | ((color & 0x1f) >> 2);
-                    mColors[n] = Color.rgb(r, g, b);
-                }
-            } else if (format == ProtocolConstants.MT_FRAME_RGB888) {
-                for (int n = 0; n < pixel_num; n++) {
-                    // Blob bitmap is in RGB565 format.
-                    final int r = bb.getChar();
-                    final int g = bb.getChar();
-                    final int b = bb.getChar();
-                    mColors[n] = Color.rgb(r, g, b);
-                }
-            } else {
-                Log.w(TAG, "Invalid framebuffer format: " + format);
-                return;
-            }
-            mImageView.drawBitmap(x, y, w, h, mColors);
-        }
-    }
-
-    /**
-     * Updates application's screen accordingly to the emulator screen.
-     *
-     * @param e_width Width of the emulator screen.
-     * @param e_height Height of the emulator screen.
-     */
-    private void updateDisplay(int e_width, int e_height) {
-        if (e_width != mEmulatorWidth || e_height != mEmulatorHeight) {
-            mEmulatorWidth = e_width;
-            mEmulatorHeight = e_height;
-
-            boolean rotateDisplay = false;
-            int w = mImageView.getWidth();
-            int h = mImageView.getHeight();
-            if (w > h != e_width > e_height) {
-                rotateDisplay = true;
-                int tmp = w;
-                w = h;
-                h = tmp;
-            }
-
-            float dx = (float) w / (float) e_width;
-            float dy = (float) h / (float) e_height;
-            mImageView.setDxDy(dx, dy, rotateDisplay);
-            if (DEBUG) Log.d(TAG, "Dispay updated: " + e_width + " x " + e_height +
-                    " -> " + w + " x " + h + " ratio: " +
-                    dx + " x " + dy);
-        }
-    }
-
-    // ----------
-
-    private void updateStatus(String status) {
-        mTextStatus.setVisibility(status == null ? View.GONE : View.VISIBLE);
-        if (status != null) mTextStatus.setText(status);
-    }
-
-    private void updateError() {
-        ControllerBinder binder = getServiceBinder();
-        String error = binder == null ? "" : binder.getServiceError();
-        if (error == null) {
-            error = "";
-        }
-
-        mTextError.setVisibility(error.length() == 0 ? View.GONE : View.VISIBLE);
-        mTextError.setText(error);
-    }
-}
diff --git a/apps/SdkController/src/com/android/tools/sdkcontroller/activities/SensorActivity.java b/apps/SdkController/src/com/android/tools/sdkcontroller/activities/SensorActivity.java
deleted file mode 100755
index 61c3081..0000000
--- a/apps/SdkController/src/com/android/tools/sdkcontroller/activities/SensorActivity.java
+++ /dev/null
@@ -1,338 +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.sdkcontroller.activities;
-
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import android.os.Bundle;
-import android.os.Message;
-import android.util.Log;
-import android.view.KeyEvent;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.View.OnFocusChangeListener;
-import android.view.View.OnKeyListener;
-import android.widget.CheckBox;
-import android.widget.CompoundButton;
-import android.widget.TableLayout;
-import android.widget.TableRow;
-import android.widget.TextView;
-
-import com.android.tools.sdkcontroller.R;
-import com.android.tools.sdkcontroller.handlers.SensorChannel;
-import com.android.tools.sdkcontroller.handlers.SensorChannel.MonitoredSensor;
-import com.android.tools.sdkcontroller.lib.Channel;
-import com.android.tools.sdkcontroller.service.ControllerService.ControllerBinder;
-import com.android.tools.sdkcontroller.service.ControllerService.ControllerListener;
-
-/**
- * Activity that displays and controls the sensors from {@link SensorChannel}.
- * For each sensor it displays a checkbox that is enabled if the sensor is supported
- * by the emulator. The user can select whether the sensor is active. It also displays
- * data from the sensor when available.
- */
-public class SensorActivity extends BaseBindingActivity
-        implements android.os.Handler.Callback {
-
-    @SuppressWarnings("hiding")
-    public static String TAG = SensorActivity.class.getSimpleName();
-    private static boolean DEBUG = true;
-
-    private static final int MSG_UPDATE_ACTUAL_HZ = 0x31415;
-
-    private TableLayout mTableLayout;
-    private TextView mTextError;
-    private TextView mTextStatus;
-    private TextView mTextTargetHz;
-    private TextView mTextActualHz;
-    private SensorChannel mSensorHandler;
-
-    private final Map<MonitoredSensor, DisplayInfo> mDisplayedSensors =
-        new HashMap<SensorChannel.MonitoredSensor, SensorActivity.DisplayInfo>();
-    private final android.os.Handler mUiHandler = new android.os.Handler(this);
-    private int mTargetSampleRate;
-    private long mLastActualUpdateMs;
-
-    /** Called when the activity is first created. */
-    @Override
-    public void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-        setContentView(R.layout.sensors);
-        mTableLayout = (TableLayout) findViewById(R.id.tableLayout);
-        mTextError  = (TextView) findViewById(R.id.textError);
-        mTextStatus = (TextView) findViewById(R.id.textStatus);
-        mTextTargetHz = (TextView) findViewById(R.id.textSampleRate);
-        mTextActualHz = (TextView) findViewById(R.id.textActualRate);
-        updateStatus("Waiting for connection");
-
-        mTextTargetHz.setOnKeyListener(new OnKeyListener() {
-            @Override
-            public boolean onKey(View v, int keyCode, KeyEvent event) {
-                updateSampleRate();
-                return false;
-            }
-        });
-        mTextTargetHz.setOnFocusChangeListener(new OnFocusChangeListener() {
-            @Override
-            public void onFocusChange(View v, boolean hasFocus) {
-                updateSampleRate();
-            }
-        });
-    }
-
-    @Override
-    protected void onResume() {
-        if (DEBUG) Log.d(TAG, "onResume");
-        // BaseBindingActivity.onResume will bind to the service.
-        super.onResume();
-        updateError();
-    }
-
-    @Override
-    protected void onPause() {
-        if (DEBUG) Log.d(TAG, "onPause");
-        // BaseBindingActivity.onResume will unbind from (but not stop) the service.
-        super.onPause();
-    }
-
-    @Override
-    protected void onDestroy() {
-        if (DEBUG) Log.d(TAG, "onDestroy");
-        super.onDestroy();
-        removeSensorUi();
-    }
-
-    // ----------
-
-    @Override
-    protected void onServiceConnected() {
-        if (DEBUG) Log.d(TAG, "onServiceConnected");
-        createSensorUi();
-    }
-
-    @Override
-    protected void onServiceDisconnected() {
-        if (DEBUG) Log.d(TAG, "onServiceDisconnected");
-        removeSensorUi();
-    }
-
-    @Override
-    protected ControllerListener createControllerListener() {
-        return new SensorsControllerListener();
-    }
-
-    // ----------
-
-    private class SensorsControllerListener implements ControllerListener {
-        @Override
-        public void onErrorChanged() {
-            runOnUiThread(new Runnable() {
-                @Override
-                public void run() {
-                    updateError();
-                }
-            });
-        }
-
-        @Override
-        public void onStatusChanged() {
-            runOnUiThread(new Runnable() {
-                @Override
-                public void run() {
-                    ControllerBinder binder = getServiceBinder();
-                    if (binder != null) {
-                        boolean connected = binder.isEmuConnected();
-                        mTableLayout.setEnabled(connected);
-                        updateStatus(connected ? "Emulated connected" : "Emulator disconnected");
-                    }
-                }
-            });
-        }
-    }
-
-    private void createSensorUi() {
-        final LayoutInflater inflater = getLayoutInflater();
-
-        if (!mDisplayedSensors.isEmpty()) {
-            removeSensorUi();
-        }
-
-        mSensorHandler = (SensorChannel) getServiceBinder().getChannel(Channel.SENSOR_CHANNEL);
-        if (mSensorHandler != null) {
-            mSensorHandler.addUiHandler(mUiHandler);
-            mUiHandler.sendEmptyMessage(MSG_UPDATE_ACTUAL_HZ);
-
-            assert mDisplayedSensors.isEmpty();
-            List<MonitoredSensor> sensors = mSensorHandler.getSensors();
-            for (MonitoredSensor sensor : sensors) {
-                final TableRow row = (TableRow) inflater.inflate(R.layout.sensor_row,
-                                                                 mTableLayout,
-                                                                 false);
-                mTableLayout.addView(row);
-                mDisplayedSensors.put(sensor, new DisplayInfo(sensor, row));
-            }
-        }
-    }
-
-    private void removeSensorUi() {
-        if (mSensorHandler != null) {
-            mSensorHandler.removeUiHandler(mUiHandler);
-            mSensorHandler = null;
-        }
-        mTableLayout.removeAllViews();
-        for (DisplayInfo info : mDisplayedSensors.values()) {
-            info.release();
-        }
-        mDisplayedSensors.clear();
-    }
-
-    private class DisplayInfo implements CompoundButton.OnCheckedChangeListener {
-        private MonitoredSensor mSensor;
-        private CheckBox mChk;
-        private TextView mVal;
-
-        public DisplayInfo(MonitoredSensor sensor, TableRow row) {
-            mSensor = sensor;
-
-            // Initialize displayed checkbox for this sensor, and register
-            // checked state listener for it.
-            mChk = (CheckBox) row.findViewById(R.id.row_checkbox);
-            mChk.setText(sensor.getUiName());
-            mChk.setEnabled(sensor.isEnabledByEmulator());
-            mChk.setChecked(sensor.isEnabledByUser());
-            mChk.setOnCheckedChangeListener(this);
-
-            // Initialize displayed text box for this sensor.
-            mVal = (TextView) row.findViewById(R.id.row_textview);
-            mVal.setText(sensor.getValue());
-        }
-
-        /**
-         * Handles checked state change for the associated CheckBox. If check
-         * box is checked we will register sensor change listener. If it is
-         * unchecked, we will unregister sensor change listener.
-         */
-        @Override
-        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
-            if (mSensor != null) {
-                mSensor.onCheckedChanged(isChecked);
-            }
-        }
-
-        public void release() {
-            mChk = null;
-            mVal = null;
-            mSensor = null;
-
-        }
-
-        public void updateState() {
-            if (mChk != null && mSensor != null) {
-                mChk.setEnabled(mSensor.isEnabledByEmulator());
-                mChk.setChecked(mSensor.isEnabledByUser());
-            }
-        }
-
-        public void updateValue() {
-            if (mVal != null && mSensor != null) {
-                mVal.setText(mSensor.getValue());
-            }
-        }
-    }
-
-    /** Implementation of Handler.Callback */
-    @Override
-    public boolean handleMessage(Message msg) {
-        DisplayInfo info = null;
-        switch (msg.what) {
-        case SensorChannel.SENSOR_STATE_CHANGED:
-            info = mDisplayedSensors.get(msg.obj);
-            if (info != null) {
-                info.updateState();
-            }
-            break;
-        case SensorChannel.SENSOR_DISPLAY_MODIFIED:
-            info = mDisplayedSensors.get(msg.obj);
-            if (info != null) {
-                info.updateValue();
-            }
-            if (mSensorHandler != null) {
-                updateStatus(Integer.toString(mSensorHandler.getMsgSentCount()) + " events sent");
-
-                // Update the "actual rate" field if the value has changed
-                long ms = mSensorHandler.getActualUpdateMs();
-                if (ms != mLastActualUpdateMs) {
-                    mLastActualUpdateMs = ms;
-                    String hz = mLastActualUpdateMs <= 0 ? "--" :
-                                    Integer.toString((int) Math.ceil(1000. / ms));
-                    mTextActualHz.setText(hz);
-                }
-            }
-            break;
-        case MSG_UPDATE_ACTUAL_HZ:
-            if (mSensorHandler != null) {
-                // Update the "actual rate" field if the value has changed
-                long ms = mSensorHandler.getActualUpdateMs();
-                if (ms != mLastActualUpdateMs) {
-                    mLastActualUpdateMs = ms;
-                    String hz = mLastActualUpdateMs <= 0 ? "--" :
-                                    Integer.toString((int) Math.ceil(1000. / ms));
-                    mTextActualHz.setText(hz);
-                }
-                mUiHandler.sendEmptyMessageDelayed(MSG_UPDATE_ACTUAL_HZ, 1000 /*1s*/);
-            }
-        }
-        return true; // we consumed this message
-    }
-
-    private void updateStatus(String status) {
-        mTextStatus.setVisibility(status == null ? View.GONE : View.VISIBLE);
-        if (status != null) mTextStatus.setText(status);
-    }
-
-    private void updateError() {
-        ControllerBinder binder = getServiceBinder();
-        String error = binder == null ? "" : binder.getServiceError();
-        if (error == null) {
-            error = "";
-        }
-
-        mTextError.setVisibility(error.length() == 0 ? View.GONE : View.VISIBLE);
-        mTextError.setText(error);
-    }
-
-    private void updateSampleRate() {
-        String str = mTextTargetHz.getText().toString();
-        try {
-            int hz = Integer.parseInt(str.trim());
-
-            // Cap the value. 50 Hz is a reasonable max value for the emulator.
-            if (hz <= 0 || hz > 50) {
-                hz = 50;
-            }
-
-            if (hz != mTargetSampleRate) {
-                mTargetSampleRate = hz;
-                if (mSensorHandler != null) {
-                    mSensorHandler.setUpdateTargetMs(hz <= 0 ? 0 : (int)(1000.0f / hz));
-                }
-            }
-        } catch (Exception ignore) {}
-    }
-}
diff --git a/apps/SdkController/src/com/android/tools/sdkcontroller/handlers/MultiTouchChannel.java b/apps/SdkController/src/com/android/tools/sdkcontroller/handlers/MultiTouchChannel.java
deleted file mode 100755
index ad00e92..0000000
--- a/apps/SdkController/src/com/android/tools/sdkcontroller/handlers/MultiTouchChannel.java
+++ /dev/null
@@ -1,173 +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.sdkcontroller.handlers;
-
-import android.graphics.Point;
-import android.os.Message;
-import android.util.Log;
-
-import com.android.tools.sdkcontroller.lib.Channel;
-import com.android.tools.sdkcontroller.lib.ProtocolConstants;
-import com.android.tools.sdkcontroller.service.ControllerService;
-
-import java.nio.ByteBuffer;
-
-/**
- * Implements multi-touch emulation.
- */
-public class MultiTouchChannel extends Channel {
-
-    @SuppressWarnings("hiding")
-    private static final String TAG = MultiTouchChannel.class.getSimpleName();
-    /**
-     * A new frame buffer has been received from the emulator.
-     * Parameter {@code obj} is a {@code byte[] array} containing the screen data.
-     */
-    public static final int EVENT_FRAME_BUFFER = 1;
-    /**
-     * A multi-touch "start" command has been received from the emulator.
-     * Parameter {@code obj} is the string parameter from the start command.
-     */
-    public static final int EVENT_MT_START = 2;
-    /**
-     * A multi-touch "stop" command has been received from the emulator. There
-     * is no {@code obj} parameter associated.
-     */
-    public static final int EVENT_MT_STOP = 3;
-
-    private static final Point mViewSize = new Point(0, 0);
-
-    /**
-     * Constructs MultiTouchChannel instance.
-     */
-    public MultiTouchChannel(ControllerService service) {
-        super(service, Channel.MULTITOUCH_CHANNEL);
-    }
-
-    /**
-     * Sets size of the display view for emulated screen updates.
-     *
-     * @param width View width in pixels.
-     * @param height View height in pixels.
-     */
-    public void setViewSize(int width, int height) {
-        mViewSize.set(width, height);
-    }
-
-    /*
-     * Channel abstract implementation.
-     */
-
-    /**
-     * This method is invoked when this channel is fully connected with its
-     * counterpart in the emulator.
-     */
-    @Override
-    public void onEmulatorConnected() {
-        if (hasUiHandler()) {
-            enable();
-            notifyUiHandlers(EVENT_MT_START);
-        }
-    }
-
-    /**
-     * This method is invoked when this channel loses connection with its
-     * counterpart in the emulator.
-     */
-    @Override
-    public void onEmulatorDisconnected() {
-        if (hasUiHandler()) {
-            disable();
-            notifyUiHandlers(EVENT_MT_STOP);
-        }
-    }
-
-    /**
-     * A message has been received from the emulator.
-     *
-     * @param msg_type Message type.
-     * @param msg_data Packet received from the emulator.
-     */
-    @Override
-    public void onEmulatorMessage(int msg_type, ByteBuffer msg_data) {
-        switch (msg_type) {
-            case ProtocolConstants.MT_FB_UPDATE:
-                Message msg = Message.obtain();
-                msg.what = EVENT_FRAME_BUFFER;
-                msg.obj = msg_data;
-                postMessage(ProtocolConstants.MT_FB_ACK, (byte[]) null);
-                notifyUiHandlers(msg);
-                break;
-
-            default:
-                Log.e(TAG, "Unknown message type " + msg_type);
-        }
-    }
-
-    /**
-     * A query has been received from the emulator.
-     *
-     * @param query_id Identifies the query. This ID must be used when replying
-     *            to the query.
-     * @param query_type Query type.
-     * @param query_data Query data.
-     */
-    @Override
-    public void onEmulatorQuery(int query_id, int query_type, ByteBuffer query_data) {
-        Loge("Unexpected query " + query_type + " in multi-touch");
-        sendQueryResponse(query_id, (byte[]) null);
-    }
-
-    /**
-     * Registers a new UI handler.
-     *
-     * @param uiHandler A non-null UI handler to register. Ignored if the UI
-     *            handler is null or already registered.
-     */
-    @Override
-    public void addUiHandler(android.os.Handler uiHandler) {
-        final boolean first_handler = !hasUiHandler();
-        super.addUiHandler(uiHandler);
-        if (first_handler && isConnected()) {
-            enable();
-            notifyUiHandlers(EVENT_MT_START);
-        }
-    }
-
-    /**
-     * Unregisters an UI handler.
-     *
-     * @param uiHandler A non-null UI listener to unregister. Ignored if the
-     *            listener is null or already registered.
-     */
-    @Override
-    public void removeUiHandler(android.os.Handler uiHandler) {
-        super.removeUiHandler(uiHandler);
-        if (isConnected() && !hasUiHandler()) {
-            disable();
-        }
-    }
-
-    /***************************************************************************
-     * Logging wrappers
-     **************************************************************************/
-
-    private void Loge(String log) {
-        mService.addError(log);
-        Log.e(TAG, log);
-    }
-}
diff --git a/apps/SdkController/src/com/android/tools/sdkcontroller/handlers/SensorChannel.java b/apps/SdkController/src/com/android/tools/sdkcontroller/handlers/SensorChannel.java
deleted file mode 100755
index ffc2fd0..0000000
--- a/apps/SdkController/src/com/android/tools/sdkcontroller/handlers/SensorChannel.java
+++ /dev/null
@@ -1,675 +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.sdkcontroller.handlers;
-
-import java.nio.ByteBuffer;
-import java.util.ArrayList;
-import java.util.List;
-
-import android.content.Context;
-import android.hardware.Sensor;
-import android.hardware.SensorEvent;
-import android.hardware.SensorEventListener;
-import android.hardware.SensorManager;
-import android.os.Message;
-import android.os.SystemClock;
-import android.util.Log;
-
-import com.android.tools.sdkcontroller.lib.Channel;
-import com.android.tools.sdkcontroller.lib.ProtocolConstants;
-import com.android.tools.sdkcontroller.service.ControllerService;
-
-/**
- * Implements sensors emulation.
- */
-public class SensorChannel extends Channel {
-
-    @SuppressWarnings("hiding")
-    private static String TAG = SensorChannel.class.getSimpleName();
-    @SuppressWarnings("hiding")
-    private static boolean DEBUG = false;
-    /**
-     * The target update time per sensor. Ignored if 0 or negative.
-     * Sensor updates that arrive faster than this delay are ignored.
-     * Ideally the emulator can be updated at up to 50 fps, however
-     * for average power devices something like 20 fps is more
-     * reasonable.
-     * Default value should match res/values/strings.xml > sensors_default_sample_rate.
-     */
-    private long mUpdateTargetMs = 1000/20; // 20 fps in milliseconds
-    /** Accumulates average update frequency. */
-    private long mGlobalAvgUpdateMs = 0;
-
-    /** Array containing monitored sensors. */
-    private final List<MonitoredSensor> mSensors = new ArrayList<MonitoredSensor>();
-    /** Sensor manager. */
-    private SensorManager mSenMan;
-
-    /*
-     * Messages exchanged with the UI.
-     */
-
-    /**
-     * Sensor "enabled by emulator" state has changed. Parameter {@code obj} is
-     * the {@link MonitoredSensor}.
-     */
-    public static final int SENSOR_STATE_CHANGED = 1;
-    /**
-     * Sensor display value has changed. Parameter {@code obj} is the
-     * {@link MonitoredSensor}.
-     */
-    public static final int SENSOR_DISPLAY_MODIFIED = 2;
-
-    /**
-     * Constructs SensorChannel instance.
-     *
-     * @param service Service context.
-     */
-    public SensorChannel(ControllerService service) {
-        super(service, Channel.SENSOR_CHANNEL);
-        mSenMan = (SensorManager) service.getSystemService(Context.SENSOR_SERVICE);
-        // Iterate through the available sensors, adding them to the array.
-        List<Sensor> sensors = mSenMan.getSensorList(Sensor.TYPE_ALL);
-        int cur_index = 0;
-        for (int n = 0; n < sensors.size(); n++) {
-            Sensor avail_sensor = sensors.get(n);
-
-            // There can be multiple sensors of the same type. We need only one.
-            if (!isSensorTypeAlreadyMonitored(avail_sensor.getType())) {
-                // The first sensor we've got for the given type is not
-                // necessarily the right one. So, use the default sensor
-                // for the given type.
-                Sensor def_sens = mSenMan.getDefaultSensor(avail_sensor.getType());
-                MonitoredSensor to_add = new MonitoredSensor(def_sens);
-                cur_index++;
-                mSensors.add(to_add);
-                if (DEBUG)
-                    Log.d(TAG, String.format(
-                            "Monitoring sensor #%02d: Name = '%s', Type = 0x%x",
-                            cur_index, def_sens.getName(), def_sens.getType()));
-            }
-        }
-    }
-
-    /**
-     * Returns the list of sensors found on the device.
-     * The list is computed once by {@link #SensorChannel(ControllerService)}.
-     *
-     * @return A non-null possibly-empty list of sensors.
-     */
-    public List<MonitoredSensor> getSensors() {
-        return mSensors;
-    }
-
-    /**
-     * Set the target update delay throttling per-sensor, in milliseconds.
-     * <p/>
-     * For example setting it to 1000/50 means that updates for a <em>given</em> sensor
-     * faster than 50 fps is discarded.
-     *
-     * @param updateTargetMs 0 to disable throttling, otherwise a > 0 millisecond minimum
-     *   between sensor updates.
-     */
-    public void setUpdateTargetMs(long updateTargetMs) {
-        mUpdateTargetMs = updateTargetMs;
-    }
-
-    /**
-     * Returns the actual average time in milliseconds between same-sensor updates.
-     *
-     * @return The actual average time in milliseconds between same-sensor updates or 0.
-     */
-    public long getActualUpdateMs() {
-        return mGlobalAvgUpdateMs;
-    }
-
-    /*
-     * Channel abstract implementation.
-     */
-
-    /**
-     * This method is invoked when this channel is fully connected with its
-     * counterpart in the emulator.
-     */
-    @Override
-    public void onEmulatorConnected() {
-        // Emulation is now possible. Note though that it will start only after
-        // emulator tells us so with SENSORS_START command.
-        enable();
-    }
-
-    /**
-     * This method is invoked when this channel loses connection with its
-     * counterpart in the emulator.
-     */
-    @Override
-    public void onEmulatorDisconnected() {
-        // Stop sensor event callbacks.
-        stopSensors();
-    }
-
-    /**
-     * A query has been received from the emulator.
-     *
-     * @param query_id Identifies the query. This ID should be used when
-     *            replying to the query.
-     * @param query_type Query type.
-     * @param query_data Query data.
-     */
-    @Override
-    public void onEmulatorQuery(int query_id, int query_type, ByteBuffer query_data) {
-        switch (query_type) {
-            case ProtocolConstants.SENSORS_QUERY_LIST:
-                // Preallocate large response buffer.
-                ByteBuffer resp = ByteBuffer.allocate(1024);
-                resp.order(getEndian());
-                // Iterate through the list of monitored sensors, dumping them
-                // into the response buffer.
-                for (MonitoredSensor sensor : mSensors) {
-                    // Entry for each sensor must contain:
-                    // - an integer for its ID
-                    // - a zero-terminated emulator-friendly name.
-                    final byte[] name = sensor.getEmulatorFriendlyName().getBytes();
-                    final int required_size = 4 + name.length + 1;
-                    resp = ExpandIf(resp, required_size);
-                    resp.putInt(sensor.getType());
-                    resp.put(name);
-                    resp.put((byte) 0);
-                }
-                // Terminating entry contains single -1 integer.
-                resp = ExpandIf(resp, 4);
-                resp.putInt(-1);
-                sendQueryResponse(query_id, resp);
-                return;
-
-            default:
-                Loge("Unknown query " + query_type);
-                return;
-        }
-    }
-
-    /**
-     * A message has been received from the emulator.
-     *
-     * @param msg_type Message type.
-     * @param msg_data Packet received from the emulator.
-     */
-    @Override
-    public void onEmulatorMessage(int msg_type, ByteBuffer msg_data) {
-        switch (msg_type) {
-            case ProtocolConstants.SENSORS_START:
-                Log.v(TAG, "Starting sensors emulation.");
-                startSensors();
-                break;
-            case ProtocolConstants.SENSORS_STOP:
-                Log.v(TAG, "Stopping sensors emulation.");
-                stopSensors();
-                break;
-            case ProtocolConstants.SENSORS_ENABLE:
-                String enable_name = new String(msg_data.array());
-                Log.v(TAG, "Enabling sensor: " + enable_name);
-                onEnableSensor(enable_name);
-                break;
-            case ProtocolConstants.SENSORS_DISABLE:
-                String disable_name = new String(msg_data.array());
-                Log.v(TAG, "Disabling sensor: " + disable_name);
-                onDisableSensor(disable_name);
-                break;
-            default:
-                Loge("Unknown message type " + msg_type);
-                break;
-        }
-    }
-
-    /**
-     * Handles 'enable' message.
-     *
-     * @param name Emulator-friendly name of a sensor to enable, or "all" to
-     *            enable all sensors.
-     */
-    private void onEnableSensor(String name) {
-        if (name.contentEquals("all")) {
-            // Enable all sensors.
-            for (MonitoredSensor sensor : mSensors) {
-                sensor.enableSensor();
-            }
-        } else {
-            // Lookup sensor by emulator-friendly name.
-            final MonitoredSensor sensor = getSensorByEFN(name);
-            if (sensor != null) {
-                sensor.enableSensor();
-            }
-        }
-    }
-
-    /**
-     * Handles 'disable' message.
-     *
-     * @param name Emulator-friendly name of a sensor to disable, or "all" to
-     *            disable all sensors.
-     */
-    private void onDisableSensor(String name) {
-        if (name.contentEquals("all")) {
-            // Disable all sensors.
-            for (MonitoredSensor sensor : mSensors) {
-                sensor.disableSensor();
-            }
-        } else {
-            // Lookup sensor by emulator-friendly name.
-            MonitoredSensor sensor = getSensorByEFN(name);
-            if (sensor != null) {
-                sensor.disableSensor();
-            }
-        }
-    }
-
-    /**
-     * Start listening to all monitored sensors.
-     */
-    private void startSensors() {
-        for (MonitoredSensor sensor : mSensors) {
-            sensor.startListening();
-        }
-    }
-
-    /**
-     * Stop listening to all monitored sensors.
-     */
-    private void stopSensors() {
-        for (MonitoredSensor sensor : mSensors) {
-            sensor.stopListening();
-        }
-    }
-
-    /***************************************************************************
-     * Internals
-     **************************************************************************/
-
-    /**
-     * Checks if a sensor for the given type is already monitored.
-     *
-     * @param type Sensor type (one of the Sensor.TYPE_XXX constants)
-     * @return true if a sensor for the given type is already monitored, or
-     *         false if the sensor is not monitored.
-     */
-    private boolean isSensorTypeAlreadyMonitored(int type) {
-        for (MonitoredSensor sensor : mSensors) {
-            if (sensor.getType() == type) {
-                return true;
-            }
-        }
-        return false;
-    }
-
-    /**
-     * Looks up a monitored sensor by its emulator-friendly name.
-     *
-     * @param name Emulator-friendly name to look up the monitored sensor for.
-     * @return Monitored sensor for the fiven name, or null if sensor was not
-     *         found.
-     */
-    private MonitoredSensor getSensorByEFN(String name) {
-        for (MonitoredSensor sensor : mSensors) {
-            if (sensor.mEmulatorFriendlyName.contentEquals(name)) {
-                return sensor;
-            }
-        }
-        return null;
-    }
-
-    /**
-     * Encapsulates a sensor that is being monitored. To monitor sensor changes
-     * each monitored sensor registers with sensor manager as a sensor listener.
-     * To control sensor monitoring from the UI, each monitored sensor has two
-     * UI controls associated with it: - A check box (named after sensor) that
-     * can be used to enable, or disable listening to the sensor changes. - A
-     * text view where current sensor value is displayed.
-     */
-    public class MonitoredSensor {
-        /** Sensor to monitor. */
-        private final Sensor mSensor;
-        /** The sensor name to display in the UI. */
-        private String mUiName = "";
-        /** Text view displaying the value of the sensor. */
-        private String mValue = null;
-        /** Emulator-friendly name for the sensor. */
-        private String mEmulatorFriendlyName;
-        /** Formats string to show in the TextView. */
-        private String mTextFmt;
-        /** Sensor values. */
-        private float[] mValues = new float[3];
-        /**
-         * Enabled state. This state is controlled by the emulator, that
-         * maintains its own list of sensors. So, if a sensor is missing, or is
-         * disabled in the emulator, it should be disabled in this application.
-         */
-        private boolean mEnabledByEmulator = false;
-        /** User-controlled enabled state. */
-        private boolean mEnabledByUser = true;
-        /** Sensor event listener for this sensor. */
-        private final OurSensorEventListener mListener = new OurSensorEventListener();
-
-        /**
-         * Constructs MonitoredSensor instance, and register the listeners.
-         *
-         * @param sensor Sensor to monitor.
-         */
-        MonitoredSensor(Sensor sensor) {
-            mSensor = sensor;
-            mEnabledByUser = true;
-
-            // Set appropriate sensor name depending on the type. Unfortunately,
-            // we can't really use sensor.getName() here, since the value it
-            // returns (although resembles the purpose) is a bit vaguer than it
-            // should be. Also choose an appropriate format for the strings that
-            // display sensor's value.
-            switch (sensor.getType()) {
-                case Sensor.TYPE_ACCELEROMETER:
-                    mUiName = "Accelerometer";
-                    mTextFmt = "%+.2f %+.2f %+.2f";
-                    mEmulatorFriendlyName = "acceleration";
-                    break;
-                case 9: // Sensor.TYPE_GRAVITY is missing in API 7
-                    mUiName = "Gravity";
-                    mTextFmt = "%+.2f %+.2f %+.2f";
-                    mEmulatorFriendlyName = "gravity";
-                    break;
-                case Sensor.TYPE_GYROSCOPE:
-                    mUiName = "Gyroscope";
-                    mTextFmt = "%+.2f %+.2f %+.2f";
-                    mEmulatorFriendlyName = "gyroscope";
-                    break;
-                case Sensor.TYPE_LIGHT:
-                    mUiName = "Light";
-                    mTextFmt = "%.0f";
-                    mEmulatorFriendlyName = "light";
-                    break;
-                case 10: // Sensor.TYPE_LINEAR_ACCELERATION is missing in API 7
-                    mUiName = "Linear acceleration";
-                    mTextFmt = "%+.2f %+.2f %+.2f";
-                    mEmulatorFriendlyName = "linear-acceleration";
-                    break;
-                case Sensor.TYPE_MAGNETIC_FIELD:
-                    mUiName = "Magnetic field";
-                    mTextFmt = "%+.2f %+.2f %+.2f";
-                    mEmulatorFriendlyName = "magnetic-field";
-                    break;
-                case Sensor.TYPE_ORIENTATION:
-                    mUiName = "Orientation";
-                    mTextFmt = "%+03.0f %+03.0f %+03.0f";
-                    mEmulatorFriendlyName = "orientation";
-                    break;
-                case Sensor.TYPE_PRESSURE:
-                    mUiName = "Pressure";
-                    mTextFmt = "%.0f";
-                    mEmulatorFriendlyName = "pressure";
-                    break;
-                case Sensor.TYPE_PROXIMITY:
-                    mUiName = "Proximity";
-                    mTextFmt = "%.0f";
-                    mEmulatorFriendlyName = "proximity";
-                    break;
-                case 11: // Sensor.TYPE_ROTATION_VECTOR is missing in API 7
-                    mUiName = "Rotation";
-                    mTextFmt = "%+.2f %+.2f %+.2f";
-                    mEmulatorFriendlyName = "rotation";
-                    break;
-                case Sensor.TYPE_TEMPERATURE:
-                    mUiName = "Temperature";
-                    mTextFmt = "%.0f";
-                    mEmulatorFriendlyName = "temperature";
-                    break;
-                default:
-                    mUiName = "<Unknown>";
-                    mTextFmt = "N/A";
-                    mEmulatorFriendlyName = "unknown";
-                    if (DEBUG) Loge("Unknown sensor type " + mSensor.getType() +
-                            " for sensor " + mSensor.getName());
-                    break;
-            }
-        }
-
-        /**
-         * Get name for this sensor to display.
-         *
-         * @return Name for this sensor to display.
-         */
-        public String getUiName() {
-            return mUiName;
-        }
-
-        /**
-         * Gets current sensor value to display.
-         *
-         * @return Current sensor value to display.
-         */
-        public String getValue() {
-            if (mValue == null) {
-                float[] values = mValues;
-                mValue = String.format(mTextFmt, values[0], values[1], values[2]);
-            }
-            return mValue == null ? "??" : mValue;
-        }
-
-        /**
-         * Checks if monitoring of this this sensor has been enabled by
-         * emulator.
-         *
-         * @return true if monitoring of this this sensor has been enabled by
-         *         emulator, or false if emulator didn't enable this sensor.
-         */
-        public boolean isEnabledByEmulator() {
-            return mEnabledByEmulator;
-        }
-
-        /**
-         * Checks if monitoring of this this sensor has been enabled by user.
-         *
-         * @return true if monitoring of this this sensor has been enabled by
-         *         user, or false if user didn't enable this sensor.
-         */
-        public boolean isEnabledByUser() {
-            return mEnabledByUser;
-        }
-
-        /**
-         * Handles checked state change for the associated CheckBox. If check
-         * box is checked we will register sensor change listener. If it is
-         * unchecked, we will unregister sensor change listener.
-         */
-        public void onCheckedChanged(boolean isChecked) {
-            mEnabledByUser = isChecked;
-            if (isChecked) {
-                startListening();
-            } else {
-                stopListening();
-            }
-        }
-
-        /**
-         * Gets sensor type.
-         *
-         * @return Sensor type as one of the Sensor.TYPE_XXX constants.
-         */
-        private int getType() {
-            return mSensor.getType();
-        }
-
-        /**
-         * Gets sensor's emulator-friendly name.
-         *
-         * @return Sensor's emulator-friendly name.
-         */
-        private String getEmulatorFriendlyName() {
-            return mEmulatorFriendlyName;
-        }
-
-        /**
-         * Starts monitoring the sensor.
-         * NOTE: This method is called from outside of the UI thread.
-         */
-        private void startListening() {
-            if (mEnabledByEmulator && mEnabledByUser) {
-                if (DEBUG) Log.d(TAG, "+++ Sensor " + getEmulatorFriendlyName() + " is started.");
-                mSenMan.registerListener(mListener, mSensor, SensorManager.SENSOR_DELAY_FASTEST);
-            }
-        }
-
-        /**
-         * Stops monitoring the sensor.
-         * NOTE: This method is called from outside of the UI thread.
-         */
-        private void stopListening() {
-            if (DEBUG) Log.d(TAG, "--- Sensor " + getEmulatorFriendlyName() + " is stopped.");
-            mSenMan.unregisterListener(mListener);
-        }
-
-        /**
-         * Enables sensor events.
-         * NOTE: This method is called from outside of the UI thread.
-         */
-        private void enableSensor() {
-            if (DEBUG) Log.d(TAG, ">>> Sensor " + getEmulatorFriendlyName() + " is enabled.");
-            mEnabledByEmulator = true;
-            mValue = null;
-
-            Message msg = Message.obtain();
-            msg.what = SENSOR_STATE_CHANGED;
-            msg.obj = MonitoredSensor.this;
-            notifyUiHandlers(msg);
-        }
-
-        /**
-         * Disables sensor events.
-         * NOTE: This method is called from outside of the UI thread.
-         */
-        private void disableSensor() {
-            if (DEBUG) Log.w(TAG, "<<< Sensor " + getEmulatorFriendlyName() + " is disabled.");
-            mEnabledByEmulator = false;
-            mValue = "Disabled by emulator";
-
-            Message msg = Message.obtain();
-            msg.what = SENSOR_STATE_CHANGED;
-            msg.obj = MonitoredSensor.this;
-            notifyUiHandlers(msg);
-        }
-
-        private class OurSensorEventListener implements SensorEventListener {
-            /** Last update's time-stamp in local thread millisecond time. */
-            private long mLastUpdateTS = 0;
-            /** Last display update time-stamp. */
-            private long mLastDisplayTS = 0;
-            /** Preallocated buffer for change notification message. */
-            private final ByteBuffer mChangeMsg = ByteBuffer.allocate(64);
-
-            /**
-             * Handles "sensor changed" event.
-             * This is an implementation of the SensorEventListener interface.
-             */
-            @Override
-            public void onSensorChanged(SensorEvent event) {
-                long now = SystemClock.elapsedRealtime();
-
-                long deltaMs = 0;
-                if (mLastUpdateTS != 0) {
-                    deltaMs = now - mLastUpdateTS;
-                    if (mUpdateTargetMs > 0 && deltaMs < mUpdateTargetMs) {
-                        // New sample is arriving too fast. Discard it.
-                        return;
-                    }
-                }
-
-                // Format and post message for the emulator.
-                float[] values = event.values;
-                final int len = values.length;
-
-                mChangeMsg.order(getEndian());
-                mChangeMsg.position(0);
-                mChangeMsg.putInt(getType());
-                mChangeMsg.putFloat(values[0]);
-                if (len > 1) {
-                    mChangeMsg.putFloat(values[1]);
-                    if (len > 2) {
-                        mChangeMsg.putFloat(values[2]);
-                    }
-                }
-                postMessage(ProtocolConstants.SENSORS_SENSOR_EVENT, mChangeMsg);
-
-                // Computes average update time for this sensor and average globally.
-                if (mLastUpdateTS != 0) {
-                    if (mGlobalAvgUpdateMs != 0) {
-                        mGlobalAvgUpdateMs = (mGlobalAvgUpdateMs + deltaMs) / 2;
-                    } else {
-                        mGlobalAvgUpdateMs = deltaMs;
-                    }
-                }
-                mLastUpdateTS = now;
-
-                // Update the UI for the sensor, with a static throttling of 10 fps max.
-                if (hasUiHandler()) {
-                    if (mLastDisplayTS != 0) {
-                        long uiDeltaMs = now - mLastDisplayTS;
-                        if (uiDeltaMs < 1000 / 4 /* 4fps in ms */) {
-                            // Skip this UI update
-                            return;
-                        }
-                    }
-                    mLastDisplayTS = now;
-
-                    mValues[0] = values[0];
-                    if (len > 1) {
-                        mValues[1] = values[1];
-                        if (len > 2) {
-                            mValues[2] = values[2];
-                        }
-                    }
-                    mValue = null;
-
-                    Message msg = Message.obtain();
-                    msg.what = SENSOR_DISPLAY_MODIFIED;
-                    msg.obj = MonitoredSensor.this;
-                    notifyUiHandlers(msg);
-                }
-
-                if (DEBUG) {
-                    long now2 = SystemClock.elapsedRealtime();
-                    long processingTimeMs = now2 - now;
-                    Log.d(TAG, String.format("glob %d - local %d > target %d - processing %d -- %s",
-                            mGlobalAvgUpdateMs, deltaMs, mUpdateTargetMs, processingTimeMs,
-                            mSensor.getName()));
-                }
-            }
-
-            /**
-             * Handles "sensor accuracy changed" event.
-             * This is an implementation of the SensorEventListener interface.
-             */
-            @Override
-            public void onAccuracyChanged(Sensor sensor, int accuracy) {
-            }
-        }
-    } // MonitoredSensor
-
-    /***************************************************************************
-     * Logging wrappers
-     **************************************************************************/
-
-    private void Loge(String log) {
-        mService.addError(log);
-        Log.e(TAG, log);
-    }
-}
diff --git a/apps/SdkController/src/com/android/tools/sdkcontroller/lib/Channel.java b/apps/SdkController/src/com/android/tools/sdkcontroller/lib/Channel.java
deleted file mode 100644
index 639f4cf..0000000
--- a/apps/SdkController/src/com/android/tools/sdkcontroller/lib/Channel.java
+++ /dev/null
@@ -1,795 +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.sdkcontroller.lib;
-
-import android.os.Message;
-import android.util.Log;
-
-import com.android.tools.sdkcontroller.service.ControllerService;
-
-import java.io.IOException;
-import java.nio.ByteBuffer;
-import java.nio.ByteOrder;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.concurrent.BlockingQueue;
-import java.util.concurrent.LinkedBlockingQueue;
-import java.util.concurrent.atomic.AtomicInteger;
-
-/**
- * Encapsulates basics of a connection with the emulator.
- * This class must be used as a base class for all the channelss that provide
- * particular type of emulation (such as sensors, multi-touch, etc.)
- * <p/>
- * Essentially, Channel is an implementation of a particular emulated functionality,
- * that defines logical format of the data transferred between the emulator and
- * SDK controller. For instance, "sensors" is a channel that emulates sensors,
- * and transfers sensor value changes from the device to the emulator. "Multi-touch"
- * is a channel that supports multi-touch emulation, and transfers multi-touch
- * events to the emulator, while receiving frame buffer updates from the emulator.
- * <p/>
- * Besides connection with the emulator, each channel may contain one or more UI
- * components associated with it. This class provides some basics for UI support,
- * including:
- * <p/>
- * - Providing a way to register / unregister a UI component with the channel.
- * <p/>
- * - Implementing posting of messages to emulator in opposite to direct message
- * sent. This is due to requirement that UI threads are prohibited from doing
- * network I/O.
- */
-public abstract class Channel {
-
-    /**
-     * Encapsulates a message posted to be sent to the emulator from a worker
-     * thread. This class is used to describe a message that is posted in UI
-     * thread, and then picked up in the worker thread.
-     */
-    private class SdkControllerMessage {
-        /** Message type. */
-        private int mMessageType;
-        /** Message data (can be null). */
-        private byte[] mMessage;
-        /** Message data size */
-        private int mMessageSize;
-
-        /**
-         * Construct message from an array.
-         *
-         * @param type Message type.
-         * @param message Message data. Message data size is defined by size of
-         *            the array.
-         */
-        public SdkControllerMessage(int type, byte[] message) {
-            mMessageType = type;
-            mMessage = message;
-            mMessageSize = (message != null) ? message.length : 0;
-        }
-
-        /**
-         * Construct message from a ByteBuffer.
-         *
-         * @param type Message type.
-         * @param message Message data. Message data size is defined by
-         *            position() property of the ByteBuffer.
-         */
-        public SdkControllerMessage(int type, ByteBuffer message) {
-            mMessageType = type;
-            if (message != null) {
-                mMessage = message.array();
-                mMessageSize = message.position();
-            } else {
-                mMessage = null;
-                mMessageSize = 0;
-            }
-        }
-
-        /**
-         * Gets message type.
-
-         *
-         * @return Message type.
-         */
-        public int getMessageType() {
-            return mMessageType;
-        }
-
-        /**
-         * Gets message buffer.
-         *
-         * @return Message buffer.
-         */
-        public byte[] getMessage() {
-            return mMessage;
-        }
-
-        /**
-         * Gets message buffer size.
-         *
-         * @return Message buffer size.
-         */
-        public int getMessageSize() {
-            return mMessageSize;
-        }
-    } // SdkControllerMessage
-
-    /*
-     * Names for currently implemented SDK controller channels.
-     */
-
-    /** Name for a channel that handles sensors emulation */
-    public static final String SENSOR_CHANNEL = "sensors";
-    /** Name for a channel that handles multi-touch emulation */
-    public static final String MULTITOUCH_CHANNEL = "multi-touch";
-
-    /*
-     * Types of messages internally used by Channel class.
-     */
-
-    /** Service-side emulator is connected. */
-    private static final int MSG_CONNECTED = -1;
-    /** Service-side emulator is disconnected. */
-    private static final int MSG_DISCONNECTED = -2;
-    /** Service-side emulator is enabled. */
-    private static final int MSG_ENABLED = -3;
-    /** Service-side emulator is disabled. */
-    private static final int MSG_DISABLED = -4;
-
-    /** Tag for logging messages. */
-    private static final String TAG = "SdkControllerChannel";
-    /** Controls debug log. */
-    private static final boolean DEBUG = false;
-
-    /** Service that has created this object. */
-    protected ControllerService mService;
-
-    /*
-     * Socket stuff.
-     */
-
-    /** Socket to use to to communicate with the emulator. */
-    private Socket mSocket = null;
-    /** Channel name ("sensors", "multi-touch", etc.) */
-    private String mChannelName;
-    /** Endianness of data transferred in this channel. */
-    private ByteOrder mEndian;
-
-    /*
-     * Message posting support.
-     */
-
-    /** Total number of messages posted in this channel */
-    private final AtomicInteger mMsgCount = new AtomicInteger(0);
-    /** Flags whether or not message thread is running. */
-    private volatile boolean mRunMsgQueue = true;
-    /** Queue of messages pending transmission. */
-    private final BlockingQueue<SdkControllerMessage>
-            mMsgQueue = new LinkedBlockingQueue<SdkControllerMessage>();
-    /** Message thread */
-    private final Thread mMsgThread;
-
-    /*
-     * UI support.
-     */
-
-    /** Lists UI handlers attached to this channel. */
-    private final List<android.os.Handler> mUiHandlers = new ArrayList<android.os.Handler>();
-
-    /*
-     * Abstract methods.
-     */
-
-    /**
-     * This method is invoked when this channel is fully connected with its
-     * counterpart in the emulator.
-     */
-    public abstract void onEmulatorConnected();
-
-    /**
-     * This method is invoked when this channel loses connection with its
-     * counterpart in the emulator.
-     */
-    public abstract void onEmulatorDisconnected();
-
-    /**
-     * A message has been received from the emulator.
-     *
-     * @param msg_type Message type.
-     * @param msg_data Message data. Message data size is defined by the length
-     *            of the array wrapped by the ByteBuffer.
-     */
-    public abstract void onEmulatorMessage(int msg_type, ByteBuffer msg_data);
-
-    /**
-     * A query has been received from the emulator.
-     *
-     * @param query_id Identifies the query. This ID must be used when replying
-     *            to the query.
-     * @param query_type Query type.
-     * @param query_data Query data. Query data size is defined by the length of
-     *            the array wrapped by the ByteBuffer.
-     */
-    public abstract void onEmulatorQuery(int query_id, int query_type, ByteBuffer query_data);
-
-    /*
-     * Channel implementation.
-     */
-
-    /**
-     * Constructs Channel instance.
-     *
-     * @param name Channel name.
-     */
-    public Channel(ControllerService service, String name) {
-        mService = service;
-        mChannelName = name;
-        // Start the worker thread for posted messages.
-        mMsgThread = new Thread(new Runnable() {
-                @Override
-            public void run() {
-                if (DEBUG) Log.d(TAG, "MsgThread.started-" + mChannelName);
-                while (mRunMsgQueue) {
-                    try {
-                        SdkControllerMessage msg = mMsgQueue.take();
-                        if (msg != null) {
-                            sendMessage(
-                                    msg.getMessageType(), msg.getMessage(), msg.getMessageSize());
-                            mMsgCount.incrementAndGet();
-                        }
-                    } catch (InterruptedException e) {
-                        Log.e(TAG, "MsgThread-" + mChannelName, e);
-                    }
-                }
-                if (DEBUG) Log.d(TAG, "MsgThread.terminate-" + mChannelName);
-            }
-        }, "MsgThread-" + name);
-        mMsgThread.start();
-        if (DEBUG) Log.d(TAG, "Channel is constructed for " + mChannelName);
-    }
-
-    /**
-     * Gets name for this channel.
-     *
-     * @return Emulator name.
-     */
-    public String getChannelName() {
-        return mChannelName;
-    }
-
-    /**
-     * Gets endianness for this channel.
-     *
-     * @return Channel endianness.
-     */
-    public ByteOrder getEndian() {
-        return mEndian;
-    }
-
-    /**
-     * Gets number of messages sent via postMessage method.
-     *
-     * @return Number of messages sent via postMessage method.
-     */
-    public int getMsgSentCount() {
-        return mMsgCount.get();
-    }
-
-    /**
-     * Checks if this channel is connected with the emulator.
-     *
-     * @return true if this channel is connected with the emulator, or false if it is
-     *         not connected.
-     */
-    public boolean isConnected() {
-        // Use local copy of the socket, ensuring it's not going to NULL while
-        // we're working with it. If it gets closed, while we're in the middle
-        // of data transfer - it's OK, since it will produce an exception, and
-        // the caller will gracefully handle it.
-        //
-        // Same technique is used everywhere in this class where mSocket member
-        // is touched.
-        Socket socket = mSocket;
-        return socket != null && socket.isConnected();
-    }
-
-    /**
-     * Establishes connection with the emulator. This method is called by Connection
-     * object when emulator successfully connects to this channel, or this channel
-     * gets registered, and there is a pending socket connection for it.
-     *
-     * @param socket Channel connection socket.
-     */
-    public void connect(Socket socket) {
-        mSocket = socket;
-        mEndian = socket.getEndian();
-        Logv("Channel " + mChannelName + " is now connected with the emulator.");
-        // Notify the emulator that connection is established.
-        sendMessage(MSG_CONNECTED, (byte[]) null);
-
-        // Let the derived class know that emulator is connected, and start the
-        // I/O loop in which we will receive data from the emulator. Note that
-        // we start the loop after onEmulatorConnected call, since we don't want
-        // to start dispatching messages before the derived class could set
-        // itself up for receiving them.
-        onEmulatorConnected();
-        new Thread(new Runnable() {
-                @Override
-            public void run() {
-                runIOLooper();
-            }
-        }, "ChannelIoLoop").start();
-        mService.notifyStatusChanged();
-    }
-
-    /**
-     * Disconnects this channel from the emulator.
-     *
-     * @return true if this channel has been disconnected in this call, or false if
-     *         channel has been already disconnected when this method has been called.
-     */
-    public boolean disconnect() {
-        // This is the only place in this class where we will null the
-        // socket object. Since this method can be called concurrently from
-        // different threads, lets do this under the lock.
-        Socket socket;
-        synchronized (this) {
-            socket = mSocket;
-            mSocket = null;
-        }
-        if (socket != null) {
-            // Notify the emulator about channel disconnection before we close
-            // the communication socket.
-            try {
-                sendMessage(socket, MSG_DISCONNECTED, null, 0);
-            } catch (IOException e) {
-                // Ignore I/O exception at this point. We don't care about
-                // it, since the socket is being closed anyways.
-            }
-            // This will eventually stop I/O looper thread.
-            socket.close();
-            mService.notifyStatusChanged();
-        }
-        return socket != null;
-    }
-
-    /**
-     * Enables the emulation. Typically, this method is called for channels that are
-     * dependent on UI to handle the emulation. For instance, multi-touch emulation is
-     * disabled until at least one UI component is attached to the channel. So, for
-     * multi-touch emulation this method is called when UI gets attached to the channel.
-     */
-    public void enable() {
-        postMessage(MSG_ENABLED, (byte[]) null);
-        mService.notifyStatusChanged();
-    }
-
-    /**
-     * Disables the emulation. Just the opposite to enable(). For multi-touch this
-     * method is called when UI detaches from the channel.
-     */
-    public void disable() {
-        postMessage(MSG_DISABLED, (byte[]) null);
-        mService.notifyStatusChanged();
-    }
-
-    /**
-     * Sends message to the emulator.
-     *
-     * @param socket Socket to send the message to.
-     * @param msg_type Message type.
-     * @param msg Message data to send.
-     * @param len Byte size of message data.
-     * @throws IOException
-     */
-    private void sendMessage(Socket socket, int msg_type, byte[] msg, int len)
-            throws IOException {
-        // In async environment we must have message header and message data in
-        // one block to prevent messages from other threads getting between the
-        // header and the data. So, we can't sent header, and then the data. We
-        // must combine them in one data block instead.
-        ByteBuffer bb = ByteBuffer.allocate(ProtocolConstants.MESSAGE_HEADER_SIZE + len);
-        bb.order(mEndian);
-
-        // Initialize message header.
-        bb.putInt(ProtocolConstants.PACKET_SIGNATURE);
-        bb.putInt(ProtocolConstants.MESSAGE_HEADER_SIZE + len);
-        bb.putInt(ProtocolConstants.PACKET_TYPE_MESSAGE);
-        bb.putInt(msg_type);
-
-        // Save message data (if there is any).
-        if (len != 0) {
-            bb.put(msg, 0, len);
-        }
-
-        socket.send(bb.array());
-    }
-
-    /**
-     * Sends message to the emulator.
-     *
-     * @param msg_type Message type.
-     * @param msg Message data to send. Message size is defined by the size of
-     *            the array.
-     * @return true on success, or false if data transmission has failed.
-     */
-    public boolean sendMessage(int msg_type, byte[] msg, int msg_len) {
-        try {
-            Socket socket = mSocket;
-            if (socket != null) {
-                sendMessage(socket, msg_type, msg, msg_len);
-                return true;
-            } else {
-                Logw("sendMessage is called on disconnected Channel " + mChannelName);
-            }
-        } catch (IOException e) {
-            Loge("Exception " + e + " in sendMessage for Channel " + mChannelName);
-            onIoFailure();
-        }
-        return false;
-    }
-
-    /**
-     * Sends message to the emulator.
-     *
-     * @param msg_type Message type.
-     * @param msg Message data to send. Message size is defined by the size of
-     *            the array.
-     * @return true on success, or false if data transmission has failed.
-     */
-    public boolean sendMessage(int msg_type, byte[] msg) {
-        try {
-            Socket socket = mSocket;
-            if (socket != null) {
-                if (msg != null) {
-                    sendMessage(socket, msg_type, msg, msg.length);
-                } else {
-                    sendMessage(socket, msg_type, null, 0);
-                }
-                return true;
-            } else {
-                Logw("sendMessage is called on disconnected Channel " + mChannelName);
-            }
-        } catch (IOException e) {
-            Loge("Exception " + e + " in sendMessage for Channel " + mChannelName);
-            onIoFailure();
-        }
-        return false;
-    }
-
-    /**
-     * Sends message to the emulator.
-     *
-     * @param msg_type Message type.
-     * @param msg Message data to send. Message size is defined by the
-     *            position() property of the ByteBuffer.
-     * @return true on success, or false if data transmission has failed.
-     */
-    public boolean sendMessage(int msg_type, ByteBuffer msg) {
-        try {
-            Socket socket = mSocket;
-            if (socket != null) {
-                if (msg != null) {
-                    sendMessage(socket, msg_type, msg.array(), msg.position());
-                } else {
-                    sendMessage(socket, msg_type, null, 0);
-                }
-                return true;
-            } else {
-                Logw("sendMessage is called on disconnected Channel " + mChannelName);
-            }
-        } catch (IOException e) {
-            Loge("Exception " + e + " in sendMessage for Channel " + mChannelName);
-            onIoFailure();
-        }
-        return false;
-    }
-
-    /**
-     * Posts message to the emulator.
-     *
-     * @param msg_type Message type.
-     * @param msg Message data to post. Message size is defined by the size of
-     *            the array.
-     */
-    public void postMessage(int msg_type, byte[] msg) {
-        try {
-            mMsgQueue.put(new SdkControllerMessage(msg_type, msg));
-        } catch (InterruptedException e) {
-            Log.e(TAG, "mMessageQueue.put", e);
-        }
-    }
-
-    /**
-     * Posts message to the emulator.
-     *
-     * @param msg_type Message type.
-     * @param msg Message data to post. Message size is defined by the
-     *            position() property of the ByteBuffer.
-     */
-    public void postMessage(int msg_type, ByteBuffer msg) {
-        try {
-            mMsgQueue.put(new SdkControllerMessage(msg_type, msg));
-        } catch (InterruptedException e) {
-            Log.e(TAG, "mMessageQueue.put", e);
-        }
-    }
-
-    /**
-     * Sends query response to the emulator.
-     *
-     * @param query_id Query identifier.
-     * @param qresp Response to the query.
-     * @param len Byte size of query response data.
-     * @return true on success, or false if data transmission has failed.
-     */
-    public boolean sendQueryResponse(int query_id, byte[] qresp, int len) {
-        // Just like with messages, we must combine header and data in a single
-        // transmitting block.
-        ByteBuffer bb = ByteBuffer.allocate(ProtocolConstants.QUERY_RESP_HEADER_SIZE + len);
-        bb.order(mEndian);
-
-        // Initialize response header.
-        bb.putInt(ProtocolConstants.PACKET_SIGNATURE);
-        bb.putInt(ProtocolConstants.QUERY_RESP_HEADER_SIZE + len);
-        bb.putInt(ProtocolConstants.PACKET_TYPE_QUERY_RESPONSE);
-        bb.putInt(query_id);
-
-        // Save response data (if there is any).
-        if (qresp != null && len != 0) {
-            bb.put(qresp, 0, len);
-        }
-
-        // Send the response.
-        try {
-            Socket socket = mSocket;
-            if (socket != null) {
-                socket.send(bb.array());
-                return true;
-            } else {
-                Logw("sendQueryResponse is called on disconnected Channel "
-                        + mChannelName);
-            }
-        } catch (IOException e) {
-            Loge("Exception " + e + " in sendQueryResponse for Channel " + mChannelName);
-            onIoFailure();
-        }
-        return false;
-    }
-
-    /**
-     * Sends query response to the emulator.
-     *
-     * @param query_id Query identifier.
-     * @param qresp Response to the query. Query response size is defined by the
-     *            size of the array.
-     * @return true on success, or false if data transmission has failed.
-     */
-    public boolean sendQueryResponse(int query_id, byte[] qresp) {
-        return (qresp != null) ? sendQueryResponse(query_id, qresp, qresp.length) :
-                sendQueryResponse(query_id, null, 0);
-    }
-
-    /**
-     * Sends query response to the emulator.
-     *
-     * @param query_id Query identifier.
-     * @param qresp Response to the query. Query response size is defined by the
-     *            position() property of the ByteBuffer.
-     * @return true on success, or false if data transmission has failed.
-     */
-    public boolean sendQueryResponse(int query_id, ByteBuffer qresp) {
-        return (qresp != null) ? sendQueryResponse(query_id, qresp.array(), qresp.position()) :
-                sendQueryResponse(query_id, null, 0);
-    }
-
-    /**
-     * Handles an I/O failure occurred in the channel.
-     */
-    private void onIoFailure() {
-        // All I/O failures cause disconnection.
-        if (disconnect()) {
-            // Success of disconnect() indicates that I/O failure is not the
-            // result of a disconnection request, but is in deed an I/O
-            // failure. Report lost connection to the derived class.
-            Loge("Connection with the emulator has been lost in Channel " + mChannelName);
-            onEmulatorDisconnected();
-        }
-    }
-
-    /**
-     * Loops on the local socket, handling connection attempts.
-     */
-    private void runIOLooper() {
-        if (DEBUG) Log.d(TAG, "In I/O looper for Channel " + mChannelName);
-        // Initialize byte buffer large enough to receive packet header.
-        ByteBuffer header = ByteBuffer.allocate(ProtocolConstants.PACKET_HEADER_SIZE);
-        header.order(mEndian);
-        try {
-            // Since disconnection (which will null the mSocket) can be
-            // requested from outside of this thread, it's simpler just to make
-            // a copy of mSocket here, and work with that copy. Otherwise we
-            // will have to go through a complex synchronization algorithm that
-            // would decrease performance on normal runs. If socket gets closed
-            // while we're in the middle of transfer, an exception will occur,
-            // which we will catch and handle properly.
-            Socket socket = mSocket;
-            while (socket != null) {
-                // Reset header position.
-                header.position(0);
-                // This will receive total packet size + packet type.
-                socket.receive(header.array());
-                // First - signature.
-                final int signature = header.getInt();
-                assert signature == ProtocolConstants.PACKET_SIGNATURE;
-                // Next - packet size (including header).
-                int remains = header.getInt() - ProtocolConstants.PACKET_HEADER_SIZE;
-                // After the size comes packet type.
-                final int packet_type = header.getInt();
-
-                // Get the remainder of the data, and dispatch the packet to
-                // an appropriate handler.
-                switch (packet_type) {
-                    case ProtocolConstants.PACKET_TYPE_MESSAGE:
-                        // Read message header (one int: message type).
-                        final int ext = ProtocolConstants.MESSAGE_HEADER_SIZE - ProtocolConstants.PACKET_HEADER_SIZE;
-                        header.position(0);
-                        socket.receive(header.array(), ext);
-                        final int msg_type = header.getInt();
-
-                        // Read message data.
-                        remains -= ext;
-                        final ByteBuffer msg_data = ByteBuffer.allocate(remains);
-                        msg_data.order(mEndian);
-                        socket.receive(msg_data.array());
-
-                        // Dispatch message for handling.
-                        onEmulatorMessage(msg_type, msg_data);
-                        break;
-
-                    case ProtocolConstants.PACKET_TYPE_QUERY:
-                        // Read query ID and query type.
-                        final int extq = ProtocolConstants.QUERY_HEADER_SIZE - ProtocolConstants.PACKET_HEADER_SIZE;
-                        header.position(0);
-                        socket.receive(header.array(), extq);
-                        final int query_id = header.getInt();
-                        final int query_type = header.getInt();
-
-                        // Read query data.
-                        remains -= extq;
-                        final ByteBuffer query_data = ByteBuffer.allocate(remains);
-                        query_data.order(mEndian);
-                        socket.receive(query_data.array());
-
-                        // Dispatch query for handling.
-                        onEmulatorQuery(query_id, query_type, query_data);
-                        break;
-
-                    default:
-                        // Unknown packet type. Just discard the remainder
-                        // of the packet
-                        Loge("Unknown packet type " + packet_type + " in Channel "
-                                + mChannelName);
-                        final byte[] discard_data = new byte[remains];
-                        socket.receive(discard_data);
-                        break;
-                }
-                socket = mSocket;
-            }
-        } catch (IOException e) {
-            Loge("Exception " + e + " in I/O looper for Channel " + mChannelName);
-            onIoFailure();
-        }
-        if (DEBUG) Log.d(TAG, "Exiting I/O looper for Channel " + mChannelName);
-    }
-
-    /**
-     * Indicates any UI handler is currently registered with the channel. If no UI
-     * is displaying the channel's state, maybe the channel can skip UI related tasks.
-     *
-     * @return True if there's at least one UI handler registered.
-     */
-    public boolean hasUiHandler() {
-        return !mUiHandlers.isEmpty();
-    }
-
-    /**
-     * Registers a new UI handler.
-     *
-     * @param uiHandler A non-null UI handler to register. Ignored if the UI
-     *            handler is null or already registered.
-     */
-    public void addUiHandler(android.os.Handler uiHandler) {
-        assert uiHandler != null;
-        if (uiHandler != null) {
-            if (!mUiHandlers.contains(uiHandler)) {
-                mUiHandlers.add(uiHandler);
-            }
-        }
-    }
-
-    /**
-     * Unregisters an UI handler.
-     *
-     * @param uiHandler A non-null UI listener to unregister. Ignored if the
-     *            listener is null or already registered.
-     */
-    public void removeUiHandler(android.os.Handler uiHandler) {
-        assert uiHandler != null;
-        mUiHandlers.remove(uiHandler);
-    }
-
-    /**
-     * Protected method to be used by handlers to send an event to all UI
-     * handlers.
-     *
-     * @param event An integer event code with no specific parameters. To be
-     *            defined by the handler itself.
-     */
-    protected void notifyUiHandlers(int event) {
-        for (android.os.Handler uiHandler : mUiHandlers) {
-            uiHandler.sendEmptyMessage(event);
-        }
-    }
-
-    /**
-     * Protected method to be used by handlers to send an event to all UI
-     * handlers.
-     *
-     * @param msg An event with parameters. To be defined by the handler itself.
-     */
-    protected void notifyUiHandlers(Message msg) {
-        for (android.os.Handler uiHandler : mUiHandlers) {
-            uiHandler.sendMessage(msg);
-        }
-    }
-
-    /**
-     * A helper routine that expands ByteBuffer to contain given number of extra
-     * bytes.
-     *
-     * @param buff Buffer to expand.
-     * @param extra Number of bytes that are required to be available in the
-     *            buffer after current position()
-     * @return ByteBuffer, containing required number of available bytes.
-     */
-    public ByteBuffer ExpandIf(ByteBuffer buff, int extra) {
-        if (extra <= buff.remaining()) {
-            return buff;
-        }
-        ByteBuffer ret = ByteBuffer.allocate(buff.position() + extra);
-        ret.order(buff.order());
-        ret.put(buff.array(), 0, buff.position());
-        return ret;
-    }
-
-    /***************************************************************************
-     * Logging wrappers
-     **************************************************************************/
-
-    private void Loge(String log) {
-        mService.addError(log);
-        Log.e(TAG, log);
-    }
-
-    private void Logw(String log) {
-        Log.w(TAG, log);
-    }
-
-    private void Logv(String log) {
-        Log.v(TAG, log);
-    }
-}
diff --git a/apps/SdkController/src/com/android/tools/sdkcontroller/lib/Connection.java b/apps/SdkController/src/com/android/tools/sdkcontroller/lib/Connection.java
deleted file mode 100644
index cb50869..0000000
--- a/apps/SdkController/src/com/android/tools/sdkcontroller/lib/Connection.java
+++ /dev/null
@@ -1,412 +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.sdkcontroller.lib;
-
-import java.io.IOException;
-import java.nio.ByteBuffer;
-import java.nio.ByteOrder;
-import java.util.ArrayList;
-import java.util.List;
-
-import android.util.Log;
-import android.net.LocalServerSocket;
-import android.net.LocalSocket;
-
-import com.android.tools.sdkcontroller.lib.Channel;
-import com.android.tools.sdkcontroller.service.ControllerService;
-
-/**
- * Encapsulates a connection between SdkController service and the emulator. On
- * the device side, the connection is bound to the UNIX-domain socket named
- * 'android.sdk.controller'. On the emulator side the connection is established
- * via TCP port that is used to forward I/O traffic on the host machine to
- * 'android.sdk.controller' socket on the device. Typically, the port forwarding
- * can be enabled using adb command:
- * <p/>
- * 'adb forward tcp:<TCP port number> localabstract:android.sdk.controller'
- * <p/>
- * The way communication between the emulator and SDK controller service works
- * is as follows:
- * <p/>
- * 1. Both sides, emulator and the service have components that implement a particular
- * type of emulation. For instance, AndroidSensorsPort in the emulator, and
- * SensorChannel in the application implement sensors emulation.
- * Emulation channels are identified by unique names. For instance, sensor emulation
- * is done via "sensors" channel, multi-touch emulation is done via "multi-touch"
- * channel, etc.
- * <p/>
- * 2. Channels are connected to emulator via separate socket instance (though all
- * of the connections share the same socket address).
- * <p/>
- * 3. Connection is initiated by the emulator side, while the service provides
- * its side (a channel) that implement functionality and exchange protocol required
- * by the requested type of emulation.
- * <p/>
- * Given that, the main responsibilities of this class are:
- * <p/>
- * 1. Bind to "android.sdk.controller" socket, listening to emulator connections.
- * <p/>
- * 2. Maintain a list of service-side channels registered by the application.
- * <p/>
- * 3. Bind emulator connection with service-side channel via port name, provided by
- * the emulator.
- * <p/>
- * 4. Monitor connection state with the emulator, and automatically restore the
- * connection once it is lost.
- */
-public class Connection {
-    /** UNIX-domain name reserved for SDK controller. */
-    public static final String SDK_CONTROLLER_PORT = "android.sdk.controller";
-    /** Tag for logging messages. */
-    private static final String TAG = "SdkControllerConnection";
-    /** Controls debug logging */
-    private static final boolean DEBUG = false;
-
-    /** Server socket used to listen to emulator connections. */
-    private LocalServerSocket mServerSocket = null;
-    /** Service that has created this object. */
-    private ControllerService mService;
-    /**
-     * List of connected emulator sockets, pending for a channel to be registered.
-     * <p/>
-     * Emulator may connect to SDK controller before the app registers a channel
-     * for that connection. In this case (when app-side channel is not registered
-     * with this class) we will keep emulator connection in this list, pending
-     * for the app-side channel to register.
-     */
-    private List<Socket> mPendingSockets = new ArrayList<Socket>();
-    /**
-     * List of registered app-side channels.
-     * <p/>
-     * Channels that are kept in this list may be disconnected from (or pending
-     * connection with) the emulator, or they may be connected with the
-     * emulator.
-     */
-    private List<Channel> mChannels = new ArrayList<Channel>();
-
-    /**
-     * Constructs Connection instance.
-     */
-    public Connection(ControllerService service) {
-        mService = service;
-        if (DEBUG) Log.d(TAG, "SdkControllerConnection is constructed.");
-    }
-
-    /**
-     * Binds to the socket, and starts the listening thread.
-     */
-    public void connect() {
-        if (DEBUG) Log.d(TAG, "SdkControllerConnection is connecting...");
-        // Start connection listener.
-        new Thread(new Runnable() {
-                @Override
-            public void run() {
-                runIOLooper();
-            }
-        }, "SdkControllerConnectionIoLoop").start();
-    }
-
-    /**
-     * Stops the listener, and closes the socket.
-     *
-     * @return true if connection has been stopped in this call, or false if it
-     *         has been already stopped when this method has been called.
-     */
-    public boolean disconnect() {
-        // This is the only place in this class where we will null the
-        // socket object. Since this method can be called concurrently from
-        // different threads, lets do this under the lock.
-        LocalServerSocket socket;
-        synchronized (this) {
-            socket = mServerSocket;
-            mServerSocket = null;
-        }
-        if (socket != null) {
-            if (DEBUG) Log.d(TAG, "SdkControllerConnection is stopping I/O looper...");
-            // Stop accepting new connections.
-            wakeIOLooper(socket);
-            try {
-                socket.close();
-            } catch (Exception e) {
-            }
-
-            // Close all the pending sockets, and clear pending socket list.
-            if (DEBUG) Log.d(TAG, "SdkControllerConnection is closing pending sockets...");
-            for (Socket pending_socket : mPendingSockets) {
-                pending_socket.close();
-            }
-            mPendingSockets.clear();
-
-            // Disconnect all the emualtors.
-            if (DEBUG) Log.d(TAG, "SdkControllerConnection is disconnecting channels...");
-            for (Channel channel : mChannels) {
-                if (channel.disconnect()) {
-                    channel.onEmulatorDisconnected();
-                }
-            }
-            if (DEBUG) Log.d(TAG, "SdkControllerConnection is disconnected.");
-        }
-        return socket != null;
-    }
-
-    /**
-     * Registers SDK controller channel.
-     *
-     * @param channel SDK controller emulator to register.
-     * @return true if channel has been registered successfully, or false if channel
-     *         with the same name is already registered.
-     */
-    public boolean registerChannel(Channel channel) {
-        for (Channel check_channel : mChannels) {
-            if (check_channel.getChannelName().equals(channel.getChannelName())) {
-                Loge("Registering a duplicate Channel " + channel.getChannelName());
-                return false;
-            }
-        }
-        if (DEBUG) Log.d(TAG, "Registering Channel " + channel.getChannelName());
-        mChannels.add(channel);
-
-        // Lets see if there is a pending socket for this channel.
-        for (Socket pending_socket : mPendingSockets) {
-            if (pending_socket.getChannelName().equals(channel.getChannelName())) {
-                // Remove the socket from the pending list, and connect the registered channel with it.
-                if (DEBUG) Log.d(TAG, "Found pending Socket for registering Channel "
-                        + channel.getChannelName());
-                mPendingSockets.remove(pending_socket);
-                channel.connect(pending_socket);
-            }
-        }
-        return true;
-    }
-
-    /**
-     * Checks if at least one socket connection exists with channel.
-     *
-     * @return true if at least one socket connection exists with channel.
-     */
-    public boolean isEmulatorConnected() {
-        for (Channel channel : mChannels) {
-            if (channel.isConnected()) {
-                return true;
-            }
-        }
-        return !mPendingSockets.isEmpty();
-    }
-
-    /**
-     * Gets Channel instance for the given channel name.
-     *
-     * @param name Channel name to get Channel instance for.
-     * @return Channel instance for the given channel name, or NULL if no
-     *         channel has been registered for that name.
-     */
-    public Channel getChannel(String name) {
-        for (Channel channel : mChannels) {
-            if (channel.getChannelName().equals(name)) {
-                return channel;
-            }
-        }
-        return null;
-    }
-
-    /**
-     * Gets connected emulator socket that is pending for service-side channel
-     * registration.
-     *
-     * @param name Channel name to lookup Socket for.
-     * @return Connected emulator socket that is pending for service-side channel
-     *         registration, or null if no socket is pending for service-size
-     *         channel registration.
-     */
-    private Socket getPendingSocket(String name) {
-        for (Socket socket : mPendingSockets) {
-            if (socket.getChannelName().equals(name)) {
-                return socket;
-            }
-        }
-        return null;
-    }
-
-    /**
-     * Wakes I/O looper waiting on connection with the emulator.
-     *
-     * @param socket Server socket waiting on connection.
-     */
-    private void wakeIOLooper(LocalServerSocket socket) {
-        // We wake the looper by connecting to the socket.
-        LocalSocket waker = new LocalSocket();
-        try {
-            waker.connect(socket.getLocalSocketAddress());
-        } catch (IOException e) {
-            Loge("Exception " + e + " in SdkControllerConnection while waking up the I/O looper.");
-        }
-    }
-
-    /**
-     * Loops on the local socket, handling emulator connection attempts.
-     */
-    private void runIOLooper() {
-        if (DEBUG) Log.d(TAG, "In SdkControllerConnection I/O looper.");
-        do {
-            try {
-                // Create non-blocking server socket that would listen for connections,
-                // and bind it to the given port on the local host.
-                mServerSocket = new LocalServerSocket(SDK_CONTROLLER_PORT);
-                LocalServerSocket socket = mServerSocket;
-                while (socket != null) {
-                    final LocalSocket sk = socket.accept();
-                    if (mServerSocket != null) {
-                        onAccept(sk);
-                    } else {
-                        break;
-                    }
-                    socket = mServerSocket;
-                }
-            } catch (IOException e) {
-                Loge("Exception " + e + "SdkControllerConnection I/O looper.");
-            }
-            if (DEBUG) Log.d(TAG, "Exiting SdkControllerConnection I/O looper.");
-
-          // If we're exiting the internal loop for reasons other than an explicit
-          // disconnect request, we should reconnect again.
-        } while (disconnect());
-    }
-
-    /**
-     * Accepts new connection from the emulator.
-     *
-     * @param sock Connecting socket.
-     * @throws IOException
-     */
-    private void onAccept(LocalSocket sock) throws IOException {
-        final ByteBuffer handshake = ByteBuffer.allocate(ProtocolConstants.QUERY_HEADER_SIZE);
-
-        // By protocol, first byte received from newly connected emulator socket
-        // indicates host endianness.
-        Socket.receive(sock, handshake.array(), 1);
-        final ByteOrder endian = (handshake.getChar() == 0) ? ByteOrder.LITTLE_ENDIAN :
-                ByteOrder.BIG_ENDIAN;
-        handshake.order(endian);
-
-        // Right after that follows the handshake query header.
-        handshake.position(0);
-        Socket.receive(sock, handshake.array(), handshake.array().length);
-
-        // First int - signature
-        final int signature = handshake.getInt();
-        assert signature == ProtocolConstants.PACKET_SIGNATURE;
-        // Second int - total query size (including fixed query header)
-        final int remains = handshake.getInt() - ProtocolConstants.QUERY_HEADER_SIZE;
-        // After that - header type (which must be SDKCTL_PACKET_TYPE_QUERY)
-        final int msg_type = handshake.getInt();
-        assert msg_type == ProtocolConstants.PACKET_TYPE_QUERY;
-        // After that - query ID.
-        final int query_id = handshake.getInt();
-        // And finally, query type (which must be ProtocolConstants.QUERY_HANDSHAKE for
-        // handshake query)
-        final int query_type = handshake.getInt();
-        assert query_type == ProtocolConstants.QUERY_HANDSHAKE;
-        // Verify that received is a query.
-        if (msg_type != ProtocolConstants.PACKET_TYPE_QUERY) {
-            // Message type is not a query. Lets read and discard the remainder
-            // of the message.
-            if (remains > 0) {
-                Loge("Unexpected handshake message type: " + msg_type);
-                byte[] discard = new byte[remains];
-                Socket.receive(sock, discard, discard.length);
-            }
-            return;
-        }
-
-        // Receive query data.
-        final byte[] name_array = new byte[remains];
-        Socket.receive(sock, name_array, name_array.length);
-
-        // Prepare response header.
-        handshake.position(0);
-        handshake.putInt(ProtocolConstants.PACKET_SIGNATURE);
-        // Handshake reply is just one int.
-        handshake.putInt(ProtocolConstants.QUERY_RESP_HEADER_SIZE + 4);
-        handshake.putInt(ProtocolConstants.PACKET_TYPE_QUERY_RESPONSE);
-        handshake.putInt(query_id);
-
-        // Verify that received query is in deed a handshake query.
-        if (query_type != ProtocolConstants.QUERY_HANDSHAKE) {
-            // Query is not a handshake. Reply with failure.
-            Loge("Unexpected handshake query type: " + query_type);
-            handshake.putInt(ProtocolConstants.HANDSHAKE_RESP_QUERY_UNKNOWN);
-            sock.getOutputStream().write(handshake.array());
-            return;
-        }
-
-        // Handshake query data consist of SDK controller channel name.
-        final String channel_name = new String(name_array);
-        if (DEBUG) Log.d(TAG, "Handshake received for channel " + channel_name);
-
-        // Respond to query depending on service-side channel availability
-        final Channel channel = getChannel(channel_name);
-        Socket sk = null;
-
-        if (channel != null) {
-            if (channel.isConnected()) {
-                // This is a duplicate connection.
-                Loge("Duplicate connection to a connected Channel " + channel_name);
-                handshake.putInt(ProtocolConstants.HANDSHAKE_RESP_DUP);
-            } else {
-                // Connecting to a registered channel.
-                if (DEBUG) Log.d(TAG, "Emulator is connected to a registered Channel " + channel_name);
-                handshake.putInt(ProtocolConstants.HANDSHAKE_RESP_CONNECTED);
-            }
-        } else {
-            // Make sure that there are no other channel connections for this
-            // channel name.
-            if (getPendingSocket(channel_name) != null) {
-                // This is a duplicate.
-                Loge("Duplicate connection to a pending Socket " + channel_name);
-                handshake.putInt(ProtocolConstants.HANDSHAKE_RESP_DUP);
-            } else {
-                // Connecting to a channel that has not been registered yet.
-                if (DEBUG) Log.d(TAG, "Emulator is connected to a pending Socket " + channel_name);
-                handshake.putInt(ProtocolConstants.HANDSHAKE_RESP_NOPORT);
-                sk = new Socket(sock, channel_name, endian);
-                mPendingSockets.add(sk);
-            }
-        }
-
-        // Send handshake reply.
-        sock.getOutputStream().write(handshake.array());
-
-        // If a disconnected channel for emulator connection has been found,
-        // connect it.
-        if (channel != null && !channel.isConnected()) {
-            if (DEBUG) Log.d(TAG, "Connecting Channel " + channel_name + " with emulator.");
-            sk = new Socket(sock, channel_name, endian);
-            channel.connect(sk);
-        }
-
-        mService.notifyStatusChanged();
-    }
-
-    /***************************************************************************
-     * Logging wrappers
-     **************************************************************************/
-
-    private void Loge(String log) {
-        mService.addError(log);
-        Log.e(TAG, log);
-    }
-}
diff --git a/apps/SdkController/src/com/android/tools/sdkcontroller/lib/ProtocolConstants.java b/apps/SdkController/src/com/android/tools/sdkcontroller/lib/ProtocolConstants.java
deleted file mode 100644
index 32abf2b..0000000
--- a/apps/SdkController/src/com/android/tools/sdkcontroller/lib/ProtocolConstants.java
+++ /dev/null
@@ -1,146 +0,0 @@
-// Copyright 2012 Google Inc. All Rights Reserved.
-
-package com.android.tools.sdkcontroller.lib;
-
-/**
- * Contains declarations of constants that are tied to emulator implementation.
- * These constants can be changed only simultaneously in both places.
- */
-public final class ProtocolConstants {
-    /*
-     * Constants related to data transfer.
-     */
-
-    /** Signature of a packet sent via SDK controller socket ('SDKC') */
-    public static final int PACKET_SIGNATURE = 0x53444B43;
-
-    /*
-     * Header sizes for packets sent / received by SDK controller emulator.
-     */
-
-    /**
-     * 12 bytes (3 ints) for the packet header:
-     * <p/>
-     * - Signature.
-     * <p/>
-     * - Total packet size.
-     * <p/>
-     * - Packet type.
-     */
-    public static final int PACKET_HEADER_SIZE = 12;
-    /**
-     * 16 bytes (4 ints) for the message header:
-     * <p/>
-     * - Common packet header.
-     * <p/>
-     * - Message type.
-     */
-    public static final int MESSAGE_HEADER_SIZE = 16;
-    /**
-     * 20 bytes (5 ints) for the query header:
-     * <p/>
-     * - Common packet header.
-     * <p/>
-     * - Query ID.
-     * <p/>
-     * - Query type.
-     */
-    public static final int QUERY_HEADER_SIZE = 20;
-    /**
-     * 16 bytes (4 ints) for the query response:
-     * <p/>
-     * - Common packet header.
-     * <p/>
-     * - Query ID.
-     */
-    public static final int QUERY_RESP_HEADER_SIZE = 16;
-
-    /*
-     * Types of packets transferred via SDK Controller channel.
-     */
-
-    /** Packet is a message. */
-    public static final int PACKET_TYPE_MESSAGE = 1;
-    /** Packet is a query. */
-    public static final int PACKET_TYPE_QUERY = 2;
-    /** Packet is a response to a query. */
-    public static final int PACKET_TYPE_QUERY_RESPONSE = 3;
-
-    /*
-     * Constants related to handshake protocol between the emulator and a channel.
-     */
-
-    /**
-     * Query type for a special "handshake" query.
-     * <p/>
-     * When emulator connects to SDK controller, the first thing that goes
-     * through the socket is a special "handshake" query that delivers channel name
-     * to the service.
-     */
-    public static final int QUERY_HANDSHAKE = -1;
-    /**
-     * Handshake query response on condition that service-side channel is available
-     * (registered).
-     */
-    public static final int HANDSHAKE_RESP_CONNECTED = 0;
-    /**
-     * Handshake query response on condition that service-side channel is not
-     * available (not registered).
-     */
-    public static final int HANDSHAKE_RESP_NOPORT = 1;
-    /**
-     * Handshake query response on condition that there is already an existing
-     * emulator connection for this channel. Emulator should stop connection
-     * attempts in this case.
-     */
-    public static final int HANDSHAKE_RESP_DUP = -1;
-    /** Response to an unknown handshake query type. */
-    public static final int HANDSHAKE_RESP_QUERY_UNKNOWN = -2;
-
-    /*
-     * Constants related to multi-touch emulation.
-     */
-
-    /** Received frame is JPEG image. */
-    public static final int MT_FRAME_JPEG = 1;
-    /** Received frame is RGB565 bitmap. */
-    public static final int MT_FRAME_RGB565 = 2;
-    /** Received frame is RGB888 bitmap. */
-    public static final int MT_FRAME_RGB888 = 3;
-
-    /** Pointer(s) moved. */
-    public static final int MT_MOVE = 1;
-    /** First pointer down message. */
-    public static final int MT_FISRT_DOWN = 2;
-    /** Last pointer up message. */
-    public static final int MT_LAST_UP = 3;
-    /** Pointer down message. */
-    public static final int MT_POINTER_DOWN = 4;
-    /** Pointer up message. */
-    public static final int MT_POINTER_UP = 5;
-    /** Sends framebuffer update. */
-    public static final int MT_FB_UPDATE = 6;
-    /** Frame buffer update has been received. */
-    public static final int MT_FB_ACK = 7;
-    /** Frame buffer update has been handled. */
-    public static final int MT_FB_HANDLED = 8;
-    /** Size of an event entry in the touch event message to the emulator. */
-    public static final int MT_EVENT_ENTRY_SIZE = 16;
-
-    /*
-     * Constants related to sensor emulation.
-     */
-
-    /** Query type for a query that should return the list of available sensors. */
-    public static final int SENSORS_QUERY_LIST = 1;
-    /** Message that starts sensor emulation. */
-    public static final int SENSORS_START = 1;
-    /** Message that stops sensor emulation. */
-    public static final int SENSORS_STOP = 2;
-    /** Message that enables emulation of a particular sensor. */
-    public static final int SENSORS_ENABLE = 3;
-    /** Message that disables emulation of a particular sensor. */
-    public static final int SENSORS_DISABLE = 4;
-    /** Message that delivers sensor events to emulator. */
-    public static final int SENSORS_SENSOR_EVENT = 5;
-}
diff --git a/apps/SdkController/src/com/android/tools/sdkcontroller/lib/Socket.java b/apps/SdkController/src/com/android/tools/sdkcontroller/lib/Socket.java
deleted file mode 100644
index 08e6b28..0000000
--- a/apps/SdkController/src/com/android/tools/sdkcontroller/lib/Socket.java
+++ /dev/null
@@ -1,213 +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.sdkcontroller.lib;
-
-import android.net.LocalSocket;
-import android.util.Log;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.nio.ByteOrder;
-import java.nio.channels.ClosedChannelException;
-
-/**
- * Encapsulates a connection with the emulator over a UNIX-domain socket.
- */
-public class Socket {
-    /** UNIX-domain socket connected with the emulator. */
-    private LocalSocket mSocket = null;
-    /** Channel name for the connection established via this socket. */
-    private String mChannelName;
-    /** Endianness of data transferred in this connection. */
-    private ByteOrder mEndian;
-
-    /** Tag for message logging. */
-    private static final String TAG = "SdkControllerSocket";
-    /** Controls debug log. */
-    private static boolean DEBUG = false;
-
-    /**
-     * Constructs Socket instance.
-     *
-     * @param socket Socket connection with the emulator.
-     * @param name Channel port name for this connection.
-     * @param endian Endianness of data transferred in this connection.
-     */
-    public Socket(LocalSocket socket, String name, ByteOrder endian) {
-        mSocket = socket;
-        mChannelName = name;
-        mEndian = endian;
-        if (DEBUG) Log.d(TAG, "Socket is constructed for " + mChannelName);
-    }
-
-    /**
-     * Gets connection status of this socket.
-     *
-     * @return true if socket is connected, or false if socket is not connected.
-     */
-    public boolean isConnected() {
-        return mSocket != null;
-    }
-
-    /**
-     * Gets channel name for this socket.
-     *
-     * @return Channel name for this socket.
-     */
-    public String getChannelName() {
-        return mChannelName;
-    }
-
-    /**
-     * Gets endianness of data transferred via this socket.
-     *
-     * @return Endianness of data transferred via this socket.
-     */
-    public ByteOrder getEndian() {
-        return mEndian;
-    }
-
-    /**
-     * Sends data to the socket.
-     *
-     * @param data Data to send. Data size is defined by the length of the
-     *            array.
-     * @throws IOException
-     */
-    public void send(byte[] data) throws IOException {
-        // Use local copy of the socket, ensuring it's not going to NULL while
-        // we're working with it. If it gets closed, while we're in the middle
-        // of data transfer - it's OK, since it will produce an exception, and
-        // the caller will gracefully handle it.
-        //
-        // Same technique is used everywhere in this class where mSocket member
-        // is touched.
-        LocalSocket socket = mSocket;
-        if (socket == null) {
-            Logw("'send' request on closed Socket " + mChannelName);
-            throw new ClosedChannelException();
-        }
-        socket.getOutputStream().write(data);
-    }
-
-    /**
-     * Sends data to the socket.
-     *
-     * @param data Data to send.
-     * @param offset The start position in data from where to get bytes.
-     * @param len The number of bytes from data to write to this socket.
-     * @throws IOException
-     */
-    public void send(byte[] data, int offset, int len) throws IOException {
-        LocalSocket socket = mSocket;
-        if (socket == null) {
-            Logw("'send' request on closed Socket " + mChannelName);
-            throw new ClosedChannelException();
-        }
-        socket.getOutputStream().write(data, offset, len);
-    }
-
-    /**
-     * Receives data from the socket.
-     *
-     * @param socket Socket from where to receive data.
-     * @param data Array where to save received data.
-     * @param len Number of bytes to receive.
-     * @throws IOException
-     */
-    public static void receive(LocalSocket socket, byte[] data, int len) throws IOException {
-        final InputStream is = socket.getInputStream();
-        int received = 0;
-        while (received != len) {
-            final int chunk = is.read(data, received, len - received);
-            if (chunk < 0) {
-                throw new IOException(
-                        "I/O failure while receiving SDK controller data from socket.");
-            }
-            received += chunk;
-        }
-    }
-
-    /**
-     * Receives data from the socket.
-     *
-     * @param data Array where to save received data.
-     * @param len Number of bytes to receive.
-     * @throws IOException
-     */
-    public void receive(byte[] data, int len) throws IOException {
-        LocalSocket socket = mSocket;
-        if (socket == null) {
-            Logw("'receive' request on closed Socket " + mChannelName);
-            throw new ClosedChannelException();
-        }
-        receive(socket, data, len);
-    }
-
-    /**
-     * Receives data from the socket.
-     *
-     * @param data Array where to save received data. Data size is defined by
-     *            the size of the array.
-     * @throws IOException
-     */
-    public void receive(byte[] data) throws IOException {
-        receive(data, data.length);
-    }
-
-    /**
-     * Closes the socket.
-     *
-     * @return true if socket has been closed in this call, or false if it had
-     *         been already closed when this method has been called.
-     */
-    public boolean close() {
-        // This is the only place in this class where we will null the socket
-        // object. Since this method can be called concurrently from different
-        // threads, lets do this under the lock.
-        LocalSocket socket;
-        synchronized (this) {
-            socket = mSocket;
-            mSocket = null;
-        }
-        if (socket != null) {
-            try {
-                // Force all I/O to stop before closing the socket.
-                socket.shutdownInput();
-                socket.shutdownOutput();
-                socket.close();
-                if (DEBUG) Log.d(TAG, "Socket is closed for " + mChannelName);
-                return true;
-            } catch (IOException e) {
-                Loge("Exception " + e + " while closing Socket for " + mChannelName);
-            }
-        }
-        return false;
-    }
-
-    /***************************************************************************
-     * Logging wrappers
-     **************************************************************************/
-
-    private void Loge(String log) {
-        Log.e(TAG, log);
-    }
-
-    private void Logw(String log) {
-        Log.w(TAG, log);
-    }
-}
diff --git a/apps/SdkController/src/com/android/tools/sdkcontroller/service/ControllerService.java b/apps/SdkController/src/com/android/tools/sdkcontroller/service/ControllerService.java
deleted file mode 100755
index 9a3408b..0000000
--- a/apps/SdkController/src/com/android/tools/sdkcontroller/service/ControllerService.java
+++ /dev/null
@@ -1,319 +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.sdkcontroller.service;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import android.app.Activity;
-import android.app.Notification;
-import android.app.NotificationManager;
-import android.app.PendingIntent;
-import android.app.Service;
-import android.content.Intent;
-import android.os.Binder;
-import android.os.IBinder;
-import android.util.Log;
-
-import com.android.tools.sdkcontroller.R;
-import com.android.tools.sdkcontroller.activities.MainActivity;
-import com.android.tools.sdkcontroller.handlers.MultiTouchChannel;
-import com.android.tools.sdkcontroller.handlers.SensorChannel;
-import com.android.tools.sdkcontroller.lib.Connection;
-import com.android.tools.sdkcontroller.lib.Channel;
-
-/**
- * The background service of the SdkController.
- * There can be only one instance of this.
- * <p/>
- * The service manages a number of SDK controller channels which can be seen as
- * individual tasks that the user might want to accomplish, for example "sending
- * sensor data to the emulator" or "sending multi-touch data and displaying an
- * emulator screen".
- * <p/>
- * Each channel connects to the emulator via UNIX-domain socket that is bound to
- * "android.sdk.controller" port. Connection class provides a socket server that
- * listens to emulator connections on this port, and binds new connection with a
- * channel, based on channel name.
- * <p/>
- * All the channels are created when the service starts, and whether the emulator
- * connection is successful or not, and whether there's any UI to control it.
- * It's up to the channels to deal with these specific details. <br/>
- * For example the {@link SensorChannel} initializes its sensor list as soon as
- * created and then tries to send data as soon as there's an emulator
- * connection. On the other hand the {@link MultiTouchChannel} lays dormant till
- * there's an UI interacting with it.
- */
-public class ControllerService extends Service {
-
-    /*
-     * Implementation reference:
-     * http://developer.android.com/reference/android/app/Service.html#LocalServiceSample
-     */
-
-    /** Tag for logging messages. */
-    public static String TAG = ControllerService.class.getSimpleName();
-    /** Controls debug log. */
-    private static boolean DEBUG = true;
-    /** Identifier for the notification. */
-    private static int NOTIF_ID = 'S' << 24 + 'd' << 16 + 'k' << 8 + 'C' << 0;
-
-    /** Connection to the emulator. */
-    public Connection mConnection;
-
-
-    private final IBinder mBinder = new ControllerBinder();
-
-    private List<ControllerListener> mListeners = new ArrayList<ControllerListener>();
-
-    /**
-     * Whether the service is running. Set to true in onCreate, false in onDestroy.
-     */
-    private static volatile boolean gServiceIsRunning = false;
-
-    /** Internal error reported by the service. */
-    private String mServiceError = "";
-
-    /**
-     * Interface that the service uses to notify binded activities.
-     * <p/>
-     * As a design rule, implementations of this listener should be aware that most calls
-     * will NOT happen on the UI thread. Any access to the UI should be properly protected
-     * by using {@link Activity#runOnUiThread(Runnable)}.
-     */
-    public interface ControllerListener {
-        /**
-         * The error string reported by the service has changed. <br/>
-         * Note this may be called from a thread different than the UI thread.
-         */
-        void onErrorChanged();
-
-        /**
-         * The service status has changed (emulator connected/disconnected.)
-         */
-        void onStatusChanged();
-    }
-
-    /** Interface that callers can use to access the service. */
-    public class ControllerBinder extends Binder {
-
-        /**
-         * Adds a new listener that will be notified when the service state changes.
-         *
-         * @param listener A non-null listener. Ignored if already listed.
-         */
-        public void addControllerListener(ControllerListener listener) {
-            assert listener != null;
-            if (listener != null) {
-                synchronized (mListeners) {
-                    if (!mListeners.contains(listener)) {
-                        mListeners.add(listener);
-                    }
-                }
-            }
-        }
-
-        /**
-         * Removes a listener.
-         *
-         * @param listener A listener to remove. Can be null.
-         */
-        public void removeControllerListener(ControllerListener listener) {
-            assert listener != null;
-            synchronized (mListeners) {
-                mListeners.remove(listener);
-            }
-        }
-
-        /**
-         * Returns the error string accumulated by the service.
-         * Typically these would relate to failures to establish the communication
-         * channel(s) with the emulator, or unexpected disconnections.
-         */
-        public String getServiceError() {
-            return mServiceError;
-        }
-
-        /**
-         * Indicates when <em>any</all> of the SDK controller channels is connected
-         * with the emulator.
-         *
-         * @return True if any of the SDK controller channels is connected with the
-         *         emulator.
-         */
-        public boolean isEmuConnected() {
-            return mConnection.isEmulatorConnected();
-        }
-
-        /**
-         * Returns the channel instance for the given type.
-         *
-         * @param name One of the channel names. Must not be null.
-         * @return Null if the type is not found, otherwise the handler's unique instance.
-         */
-        public Channel getChannel(String name) {
-            return mConnection.getChannel(name);
-        }
-    }
-
-    /**
-     * Whether the service is running. Set to true in onCreate, false in onDestroy.
-     */
-    public static boolean isServiceIsRunning() {
-        return gServiceIsRunning;
-    }
-
-    @Override
-    public void onCreate() {
-        super.onCreate();
-        if (DEBUG) Log.d(TAG, "Service onCreate");
-        gServiceIsRunning = true;
-        showNotification();
-        onServiceStarted();
-    }
-
-    @Override
-    public int onStartCommand(Intent intent, int flags, int startId) {
-        // We want this service to continue running until it is explicitly
-        // stopped, so return sticky.
-        if (DEBUG) Log.d(TAG, "Service onStartCommand");
-        return START_STICKY;
-    }
-
-    @Override
-    public IBinder onBind(Intent intent) {
-        if (DEBUG) Log.d(TAG, "Service onBind");
-        return mBinder;
-    }
-
-    @Override
-    public void onDestroy() {
-        if (DEBUG) Log.d(TAG, "Service onDestroy");
-        gServiceIsRunning = false;
-        removeNotification();
-        resetError();
-        onServiceStopped();
-        super.onDestroy();
-    }
-
-    private void disconnectAll() {
-        if (mConnection != null) {
-            mConnection.disconnect();
-        }
-    }
-
-    /**
-     * Called when the service has been created.
-     */
-    private void onServiceStarted() {
-        try {
-            disconnectAll();
-
-            // Bind to SDK controller port, and start accepting emulator
-            // connections.
-            mConnection = new Connection(ControllerService.this);
-            mConnection.connect();
-
-            // Create and register sensors channel.
-            mConnection.registerChannel(new SensorChannel(ControllerService.this));
-            // Create and register multi-touch channel.
-            mConnection.registerChannel(new MultiTouchChannel(ControllerService.this));
-        } catch (Exception e) {
-            addError("Connection failed: " + e.toString());
-        }
-    }
-
-    /**
-     * Called when the service is being destroyed.
-     */
-    private void onServiceStopped() {
-        disconnectAll();
-    }
-
-    private void notifyErrorChanged() {
-        synchronized (mListeners) {
-            for (ControllerListener listener : mListeners) {
-                listener.onErrorChanged();
-            }
-        }
-    }
-
-    public void notifyStatusChanged() {
-        synchronized (mListeners) {
-            for (ControllerListener listener : mListeners) {
-                listener.onStatusChanged();
-            }
-        }
-    }
-
-    /**
-     * Resets the error string and notify listeners.
-     */
-    private void resetError() {
-        mServiceError = "";
-
-        notifyErrorChanged();
-    }
-
-    /**
-     * An internal utility method to add a line to the error string and notify listeners.
-     * @param error A non-null non-empty error line. \n will be added automatically.
-     */
-    public void addError(String error) {
-        Log.e(TAG, error);
-        if (mServiceError.length() > 0) {
-            mServiceError += "\n";
-        }
-        mServiceError += error;
-
-        notifyErrorChanged();
-    }
-
-    /**
-     * Displays a notification showing that the service is running.
-     * When the user touches the notification, it opens the main activity
-     * which allows the user to stop this service.
-     */
-    @SuppressWarnings("deprecated")
-    private void showNotification() {
-        NotificationManager nm = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
-
-        String text = getString(R.string.service_notif_title);
-
-        // Note: Notification is marked as deprecated -- in API 11+ there's a new Builder class
-        // but we need to have API 7 compatibility so we ignore that warning.
-
-        Notification n = new Notification(R.drawable.ic_launcher, text, System.currentTimeMillis());
-        n.flags |= Notification.FLAG_ONGOING_EVENT | Notification.FLAG_NO_CLEAR;
-        Intent intent = new Intent(this, MainActivity.class);
-        intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
-        PendingIntent pi = PendingIntent.getActivity(
-                this,   //context
-                0,      //requestCode
-                intent, //intent
-                0       //pending intent flags
-                );
-        n.setLatestEventInfo(this, text, text, pi);
-
-        nm.notify(NOTIF_ID, n);
-    }
-
-    private void removeNotification() {
-        NotificationManager nm = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
-        nm.cancel(NOTIF_ID);
-    }
-}
diff --git a/apps/SdkController/src/com/android/tools/sdkcontroller/utils/ApiHelper.java b/apps/SdkController/src/com/android/tools/sdkcontroller/utils/ApiHelper.java
deleted file mode 100755
index 66bce49..0000000
--- a/apps/SdkController/src/com/android/tools/sdkcontroller/utils/ApiHelper.java
+++ /dev/null
@@ -1,57 +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.sdkcontroller.utils;
-
-import android.annotation.TargetApi;
-import android.os.Build;
-import android.view.View;
-
-/**
- * Helper to deal with methods only available at certain API levels.
- * Users should get use {@link ApiHelper#get()} to retrieve a singleton
- * and then call the methods they desire. If the method is not available
- * on the current API level, a stub or a nop will be used instead.
- */
-@TargetApi(7)
-public class ApiHelper {
-
-    private static ApiHelper sApiHelper = null;
-
-    /** Creates a new ApiHelper adapted to the current runtime API level. */
-    public static ApiHelper get() {
-        if (sApiHelper == null) {
-            if (Build.VERSION.SDK_INT >= 11) {
-                sApiHelper = new ApiHelper_11();
-            } else {
-                sApiHelper = new ApiHelper();
-            }
-        }
-
-        return sApiHelper;
-    }
-
-    protected ApiHelper() {
-    }
-
-    /**
-     * Applies {@link View#setSystemUiVisibility(int)}, available only starting with API 11.
-     * Does nothing for API < 11.
-     */
-    public void View_setSystemUiVisibility(View view, int visibility) {
-        // nop
-    }
-}
diff --git a/apps/SdkController/src/com/android/tools/sdkcontroller/utils/ApiHelper_11.java b/apps/SdkController/src/com/android/tools/sdkcontroller/utils/ApiHelper_11.java
deleted file mode 100755
index 2d4e8cd..0000000
--- a/apps/SdkController/src/com/android/tools/sdkcontroller/utils/ApiHelper_11.java
+++ /dev/null
@@ -1,36 +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.sdkcontroller.utils;
-
-import android.annotation.TargetApi;
-import android.view.View;
-
-/**
- * API 11: support View_setSystemUiVisibility
- */
-@TargetApi(11)
-class ApiHelper_11 extends ApiHelper {
-
-    /**
-     * Applies {@link View#setSystemUiVisibility(int)}, available only starting with API 11.
-     * Does nothing for API < 11.
-     */
-    @Override
-    public void View_setSystemUiVisibility(View view, int visibility) {
-        view.setSystemUiVisibility(visibility);
-    }
-}
diff --git a/apps/SdkController/src/com/android/tools/sdkcontroller/views/MultiTouchView.java b/apps/SdkController/src/com/android/tools/sdkcontroller/views/MultiTouchView.java
deleted file mode 100755
index 0f185b1..0000000
--- a/apps/SdkController/src/com/android/tools/sdkcontroller/views/MultiTouchView.java
+++ /dev/null
@@ -1,232 +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.sdkcontroller.views;
-
-import java.io.InputStream;
-import java.nio.ByteBuffer;
-
-import android.content.Context;
-import android.graphics.Bitmap;
-import android.graphics.BitmapFactory;
-import android.graphics.Canvas;
-import android.graphics.Matrix;
-import android.graphics.Paint;
-import android.util.AttributeSet;
-import android.util.Log;
-import android.view.MotionEvent;
-import android.view.View;
-
-/**
- * Implements a main view for the application providing multi-touch emulation.
- */
-public class MultiTouchView extends View {
-    /** Tag for logging messages. */
-    private static final String TAG = MultiTouchView.class.getSimpleName();
-    /**
-     * Back-end bitmap. Initialized in onSizeChanged(), updated in
-     * onTouchEvent() and drawn in onDraw().
-     */
-    private Bitmap mBitmap;
-    /** Default Paint instance for drawing the bitmap. */
-    private final Paint mPaint = new Paint();
-    /** Canvas instance for this view. */
-    private Canvas mCanvas;
-    /** Emulator screen width to this view width ratio. */
-    private float mDx = 1;
-    /** Emulator screen height to this view height ratio. */
-    private float mDy = 1;
-    /**
-     * Flags whether or not image received from the emulator should be rotated.
-     * Rotation is required when display orientation state of the emulator and
-     * the device doesn't match.
-     */
-    private boolean mRotateDisplay;
-    /** Base matrix that keep emulator->device display scaling */
-    private Matrix mBaseMatrix = new Matrix();
-    /** Matrix that is used to draw emulator's screen on the device. */
-    private Matrix mDrawMatrix = new Matrix();
-
-    /**
-     * Simple constructor to use when creating a view from code.
-     *
-     * @see View#View(Context)
-     */
-    public MultiTouchView(Context context) {
-        this(context, null);
-    }
-
-    /**
-     * Constructor that is called when inflating a view from XML.
-     *
-     * @see View#View(Context, AttributeSet)
-     */
-    public MultiTouchView(Context context, AttributeSet attrs) {
-        this(context, attrs, 0);
-    }
-
-    /**
-     * Perform inflation from XML and apply a class-specific base style.
-     *
-     * @see View#View(Context, AttributeSet, int)
-     */
-    public MultiTouchView(Context context, AttributeSet attrs, int defStyle) {
-        super(context, attrs, defStyle);
-
-        // TODO Add constructor-time code here.
-    }
-
-    @Override
-    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
-        super.onSizeChanged(w, h, oldw, oldh);
-
-        mBitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
-        mCanvas = new Canvas(mBitmap);
-    }
-
-    @Override
-    protected void onDraw(Canvas canvas) {
-        super.onDraw(canvas);
-        // Just draw the back-end bitmap without zooming or scaling.
-        if (mBitmap != null) {
-            canvas.drawBitmap(mBitmap, 0, 0, null);
-        }
-    }
-
-    /**
-     * Sets emulator screen width and height to this view width and height
-     * ratio.
-     *
-     * @param dx Emulator screen width to this view width ratio.
-     * @param dy Emulator screen height to this view height ratio.
-     * @param rotateDisplay Flags whether image received from the emulator
-     *            should be rotated when drawn on the device.
-     */
-    public void setDxDy(float dx, float dy, boolean rotateDisplay) {
-        mDx = dx;
-        mDy = dy;
-        mRotateDisplay = rotateDisplay;
-
-        mBaseMatrix.setScale(dx, dy);
-        if (mRotateDisplay) {
-            mBaseMatrix.postRotate(90);
-            mBaseMatrix.postTranslate(getWidth(), 0);
-        }
-    }
-
-    /**
-     * Computes draw matrix for the emulator screen update.
-     *
-     * @param x Left screen coordinate of the bitmap on emulator screen.
-     * @param y Top screen coordinate of the bitmap on emulator screen.
-     */
-    private void computeDrawMatrix(int x, int y) {
-        mDrawMatrix.set(mBaseMatrix);
-        if (mRotateDisplay) {
-            mDrawMatrix.postTranslate(-y * mDy, x * mDx);
-        } else {
-            mDrawMatrix.postTranslate(x * mDx, y * mDy);
-        }
-    }
-
-    /**
-     * Draws a bitmap on the screen.
-     *
-     * @param x Left screen coordinate of the bitmap on emulator screen.
-     * @param y Top screen coordinate of the bitmap on emulator screen.
-     * @param w Width of the bitmap on the emulator screen.
-     * @param h Height of the bitmap on the emulator screen.
-     * @param colors Bitmap to draw.
-     */
-    public void drawBitmap(int x, int y, int w, int h, int[] colors) {
-        if (mCanvas != null) {
-            final Bitmap bmp = Bitmap.createBitmap(colors, 0, w, w, h, Bitmap.Config.ARGB_8888);
-
-            computeDrawMatrix(x, y);
-
-            /* Draw the bitmap and invalidate the updated region. */
-            mCanvas.drawBitmap(bmp, mDrawMatrix, mPaint);
-            invalidate();
-        }
-    }
-
-    /**
-     * Draws a JPEG bitmap on the screen.
-     *
-     * @param x Left screen coordinate of the bitmap on emulator screen.
-     * @param y Top screen coordinate of the bitmap on emulator screen.
-     * @param w Width of the bitmap on the emulator screen.
-     * @param h Height of the bitmap on the emulator screen.
-     * @param jpeg JPEG bitmap to draw.
-     */
-    public void drawJpeg(int x, int y, int w, int h, InputStream jpeg) {
-        if (mCanvas != null) {
-            final Bitmap bmp = BitmapFactory.decodeStream(jpeg);
-
-            computeDrawMatrix(x, y);
-
-            /* Draw the bitmap and invalidate the updated region. */
-            mCanvas.drawBitmap(bmp, mDrawMatrix, mPaint);
-            invalidate();
-        }
-    }
-
-    /**
-     * Constructs touch event message to be send to emulator.
-     *
-     * @param bb ByteBuffer where to construct the message.
-     * @param event Event for which to construct the message.
-     * @param ptr_index Index of the motion pointer for which to construct the
-     *            message.
-     */
-    public void constructEventMessage(ByteBuffer bb, MotionEvent event, int ptr_index) {
-        bb.putInt(event.getPointerId(ptr_index));
-        if (mRotateDisplay == false) {
-            bb.putInt((int) (event.getX(ptr_index) / mDx));
-            bb.putInt((int) (event.getY(ptr_index) / mDy));
-        } else {
-            bb.putInt((int) (event.getY(ptr_index) / mDy));
-            bb.putInt((int) (getWidth() - event.getX(ptr_index) / mDx));
-        }
-        // At the system level the input reader takes integers in the range
-        // 0 - 100 for the pressure.
-        int pressure = (int) (event.getPressure(ptr_index) * 100);
-        // Make sure it doesn't exceed 100...
-        if (pressure > 100) {
-            pressure = 100;
-        }
-        bb.putInt(pressure);
-    }
-
-    /***************************************************************************
-     * Logging wrappers
-     **************************************************************************/
-
-    @SuppressWarnings("unused")
-    private void Loge(String log) {
-        Log.e(TAG, log);
-    }
-
-    @SuppressWarnings("unused")
-    private void Logw(String log) {
-        Log.w(TAG, log);
-    }
-
-    @SuppressWarnings("unused")
-    private void Logv(String log) {
-        Log.v(TAG, log);
-    }
-}
diff --git a/attribute_stats/.classpath b/attribute_stats/.classpath
deleted file mode 100644
index fb50116..0000000
--- a/attribute_stats/.classpath
+++ /dev/null
@@ -1,6 +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="output" path="bin"/>
-</classpath>
diff --git a/attribute_stats/.gitignore b/attribute_stats/.gitignore
deleted file mode 100644
index ba077a4..0000000
--- a/attribute_stats/.gitignore
+++ /dev/null
@@ -1 +0,0 @@
-bin
diff --git a/attribute_stats/.project b/attribute_stats/.project
deleted file mode 100644
index 2f2cff1..0000000
--- a/attribute_stats/.project
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>attribute_stats</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/attribute_stats/.settings/org.eclipse.jdt.core.prefs b/attribute_stats/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index ea66196..0000000
--- a/attribute_stats/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,98 +0,0 @@
-eclipse.preferences.version=1
-org.eclipse.jdt.core.compiler.annotation.missingNonNullByDefaultAnnotation=ignore
-org.eclipse.jdt.core.compiler.annotation.nonnull=com.android.annotations.NonNull
-org.eclipse.jdt.core.compiler.annotation.nonnullbydefault=com.android.annotations.NonNullByDefault
-org.eclipse.jdt.core.compiler.annotation.nonnullisdefault=disabled
-org.eclipse.jdt.core.compiler.annotation.nullable=com.android.annotations.Nullable
-org.eclipse.jdt.core.compiler.annotation.nullanalysis=enabled
-org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6
-org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.6
-org.eclipse.jdt.core.compiler.debug.lineNumber=generate
-org.eclipse.jdt.core.compiler.debug.localVariable=generate
-org.eclipse.jdt.core.compiler.debug.sourceFile=generate
-org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
-org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
-org.eclipse.jdt.core.compiler.problem.comparingIdentical=warning
-org.eclipse.jdt.core.compiler.problem.deadCode=warning
-org.eclipse.jdt.core.compiler.problem.deprecation=warning
-org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
-org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
-org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
-org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=ignore
-org.eclipse.jdt.core.compiler.problem.fallthroughCase=warning
-org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
-org.eclipse.jdt.core.compiler.problem.fieldHiding=warning
-org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
-org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
-org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
-org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
-org.eclipse.jdt.core.compiler.problem.includeNullInfoFromAsserts=enabled
-org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
-org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=warning
-org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
-org.eclipse.jdt.core.compiler.problem.localVariableHiding=warning
-org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
-org.eclipse.jdt.core.compiler.problem.missingDefaultCase=ignore
-org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=warning
-org.eclipse.jdt.core.compiler.problem.missingEnumCaseDespiteDefault=disabled
-org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=warning
-org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=error
-org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled
-org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
-org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=ignore
-org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
-org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
-org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore
-org.eclipse.jdt.core.compiler.problem.nullAnnotationInferenceConflict=warning
-org.eclipse.jdt.core.compiler.problem.nullReference=warning
-org.eclipse.jdt.core.compiler.problem.nullSpecInsufficientInfo=warning
-org.eclipse.jdt.core.compiler.problem.nullSpecViolation=warning
-org.eclipse.jdt.core.compiler.problem.nullUncheckedConversion=ignore
-org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
-org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
-org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=warning
-org.eclipse.jdt.core.compiler.problem.potentialNullReference=warning
-org.eclipse.jdt.core.compiler.problem.potentialNullSpecViolation=error
-org.eclipse.jdt.core.compiler.problem.potentiallyUnclosedCloseable=warning
-org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
-org.eclipse.jdt.core.compiler.problem.redundantNullAnnotation=warning
-org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
-org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=ignore
-org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=warning
-org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=ignore
-org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=ignore
-org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
-org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
-org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=enabled
-org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
-org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
-org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
-org.eclipse.jdt.core.compiler.problem.unavoidableGenericTypeProblems=disabled
-org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
-org.eclipse.jdt.core.compiler.problem.unclosedCloseable=error
-org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
-org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
-org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=warning
-org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=warning
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.unusedImport=warning
-org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
-org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
-org.eclipse.jdt.core.compiler.problem.unusedObjectAllocation=warning
-org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
-org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
-org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
-org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
-org.eclipse.jdt.core.compiler.source=1.6
diff --git a/attribute_stats/README.txt b/attribute_stats/README.txt
deleted file mode 100644
index 15f51c2..0000000
--- a/attribute_stats/README.txt
+++ /dev/null
@@ -1,13 +0,0 @@
-Attribute Statistics
----------------------
-
-This program gathers statistics about attribute usage in layout
-files. This is how the "topAttrs" attributes listed in ADT's
-extra-view-metadata.xml file (which drives the common attributes
-listed in the top of the context menu) is determined by running this
-script on a body of sample Android code, such as the AOSP repository.
-
-This program takes one or more directory paths, and then it searches
-all of them recursively for layout files that are not in folders
-containing the string "test", and computes and prints frequency
-statistics.
diff --git a/attribute_stats/src/Analyzer.java b/attribute_stats/src/Analyzer.java
deleted file mode 100644
index 8da53ea..0000000
--- a/attribute_stats/src/Analyzer.java
+++ /dev/null
@@ -1,663 +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.
- */
-
-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.SAXException;
-
-import java.io.BufferedReader;
-import java.io.BufferedWriter;
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.FileReader;
-import java.io.FileWriter;
-import java.io.IOException;
-import java.io.Reader;
-import java.io.StringReader;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Map.Entry;
-import java.util.Set;
-
-import javax.xml.parsers.DocumentBuilder;
-import javax.xml.parsers.DocumentBuilderFactory;
-import javax.xml.parsers.ParserConfigurationException;
-
-/**
- * Gathers statistics about attribute usage in layout files. This is how the "topAttrs"
- * attributes listed in ADT's extra-view-metadata.xml (which drives the common attributes
- * listed in the top of the context menu) is determined by running this script on a body
- * of sample layout code.
- * <p>
- * This program takes one or more directory paths, and then it searches all of them recursively
- * for layout files that are not in folders containing the string "test", and computes and
- * prints frequency statistics.
- */
-public class Analyzer {
-    /** Number of attributes to print for each view */
-    public static final int ATTRIBUTE_COUNT = 6;
-    /** Separate out any attributes that constitute less than N percent of the total */
-    public static final int THRESHOLD = 10; // percent
-
-    private List<File> mDirectories;
-    private File mCurrentFile;
-    private boolean mListAdvanced;
-
-    /** Map from view id to map from attribute to frequency count */
-    private Map<String, Map<String, Usage>> mFrequencies =
-            new HashMap<String, Map<String, Usage>>(100);
-
-    private Map<String, Map<String, Usage>> mLayoutAttributeFrequencies =
-            new HashMap<String, Map<String, Usage>>(100);
-
-    private Map<String, String> mTopAttributes = new HashMap<String, String>(100);
-    private Map<String, String> mTopLayoutAttributes = new HashMap<String, String>(100);
-
-    private int mFileVisitCount;
-    private int mLayoutFileCount;
-    private File mXmlMetadataFile;
-
-    private Analyzer(List<File> directories, File xmlMetadataFile, boolean listAdvanced) {
-        mDirectories = directories;
-        mXmlMetadataFile = xmlMetadataFile;
-        mListAdvanced = listAdvanced;
-    }
-
-    public static void main(String[] args) {
-        if (args.length < 1) {
-            System.err.println("Usage: " + Analyzer.class.getSimpleName()
-                    + " <directory1> [directory2 [directory3 ...]]\n");
-            System.err.println("Recursively scans for layouts in the given directory and");
-            System.err.println("computes statistics about attribute frequencies.");
-            System.exit(-1);
-        }
-
-        File metadataFile = null;
-        List<File> directories = new ArrayList<File>();
-        boolean listAdvanced = false;
-        for (int i = 0, n = args.length; i < n; i++) {
-            String arg = args[i];
-
-            if (arg.equals("--list")) {
-                // List ALL encountered attributes
-                listAdvanced = true;
-                continue;
-            }
-
-            // The -metadata flag takes a pointer to an ADT extra-view-metadata.xml file
-            // and attempts to insert topAttrs attributes into it (and saves it as same
-            // file +.mod as an extension). This isn't listed on the usage flag because
-            // it's pretty brittle and requires some manual fixups to the file afterwards.
-            if (arg.equals("--metadata")) {
-                i++;
-                File file = new File(args[i]);
-                if (!file.exists()) {
-                    System.err.println(file.getName() + " does not exist");
-                    System.exit(-5);
-                }
-                if (!file.isFile() || !file.getName().endsWith(".xml")) {
-                    System.err.println(file.getName() + " must be an XML file");
-                    System.exit(-4);
-                }
-                metadataFile = file;
-                continue;
-            }
-            File directory = new File(arg);
-            if (!directory.exists()) {
-                System.err.println(directory.getName() + " does not exist");
-                System.exit(-2);
-            }
-
-            if (!directory.isDirectory()) {
-                System.err.println(directory.getName() + " is not a directory");
-                System.exit(-3);
-            }
-
-            directories.add(directory);
-        }
-
-        new Analyzer(directories, metadataFile, listAdvanced).analyze();
-    }
-
-    private void analyze() {
-        for (File directory : mDirectories) {
-            scanDirectory(directory);
-        }
-
-        if (mListAdvanced) {
-            listAdvanced();
-        }
-
-        printStatistics();
-
-        if (mXmlMetadataFile != null) {
-            printMergedMetadata();
-        }
-    }
-
-    private void scanDirectory(File directory) {
-        File[] files = directory.listFiles();
-        if (files == null) {
-            return;
-        }
-
-        for (File file : files) {
-            mFileVisitCount++;
-            if (mFileVisitCount % 50000 == 0) {
-                System.out.println("Analyzed " + mFileVisitCount + " files...");
-            }
-
-            if (file.isFile()) {
-                scanFile(file);
-            } else if (file.isDirectory()) {
-                // Skip stuff related to tests
-                if (file.getName().contains("test")) {
-                    continue;
-                }
-
-                // Recurse over subdirectories
-                scanDirectory(file);
-            }
-        }
-    }
-
-    private void scanFile(File file) {
-        if (file.getName().endsWith(".xml")) {
-            File parent = file.getParentFile();
-            if (parent.getName().startsWith("layout")) {
-                analyzeLayout(file);
-            }
-        }
-
-    }
-
-    private void analyzeLayout(File file) {
-        mCurrentFile = file;
-        mLayoutFileCount++;
-        Document document = null;
-        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
-        InputSource is = new InputSource(new StringReader(readFile(file)));
-        try {
-            factory.setNamespaceAware(true);
-            factory.setValidating(false);
-            DocumentBuilder builder = factory.newDocumentBuilder();
-            document = builder.parse(is);
-
-            analyzeDocument(document);
-
-        } catch (ParserConfigurationException e) {
-            // pass -- ignore files we can't parse
-        } catch (SAXException e) {
-            // pass -- ignore files we can't parse
-        } catch (IOException e) {
-            // pass -- ignore files we can't parse
-        }
-    }
-
-
-    private void analyzeDocument(Document document) {
-        analyzeElement(document.getDocumentElement());
-    }
-
-    private void analyzeElement(Element element) {
-        if (element.getTagName().equals("item")) {
-            // Resource files shouldn't be in the layout/ folder but I came across
-            // some cases
-            System.out.println("Warning: found <item> tag in a layout file in "
-                    + mCurrentFile.getPath());
-            return;
-        }
-
-        countAttributes(element);
-        countLayoutAttributes(element);
-
-        // Recurse over 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) {
-                analyzeElement((Element) child);
-            }
-        }
-    }
-
-    private void countAttributes(Element element) {
-        String tag = element.getTagName();
-        Map<String, Usage> attributeMap = mFrequencies.get(tag);
-        if (attributeMap == null) {
-            attributeMap = new HashMap<String, Usage>(70);
-            mFrequencies.put(tag, attributeMap);
-        }
-
-        NamedNodeMap attributes = element.getAttributes();
-        for (int i = 0, n = attributes.getLength(); i < n; i++) {
-            Node attribute = attributes.item(i);
-            String name = attribute.getNodeName();
-
-            if (name.startsWith("android:layout_")) {
-                // Skip layout attributes; they are a function of the parent layout that this
-                // view is embedded within, not the view itself.
-                // TODO: Consider whether we should incorporate this info or make statistics
-                // about that as well?
-                continue;
-            }
-
-            if (name.equals("android:id")) {
-                // Skip ids: they are (mostly) unrelated to the view type and the tool
-                // already offers id editing prominently
-                continue;
-            }
-
-            if (name.startsWith("xmlns:")) {
-                // Unrelated to frequency counts
-                continue;
-            }
-
-            Usage usage = attributeMap.get(name);
-            if (usage == null) {
-                usage = new Usage(name);
-            } else {
-                usage.incrementCount();
-            }
-            attributeMap.put(name, usage);
-        }
-    }
-
-    private void countLayoutAttributes(Element element) {
-        String parentTag = element.getParentNode().getNodeName();
-        Map<String, Usage> attributeMap = mLayoutAttributeFrequencies.get(parentTag);
-        if (attributeMap == null) {
-            attributeMap = new HashMap<String, Usage>(70);
-            mLayoutAttributeFrequencies.put(parentTag, attributeMap);
-        }
-
-        NamedNodeMap attributes = element.getAttributes();
-        for (int i = 0, n = attributes.getLength(); i < n; i++) {
-            Node attribute = attributes.item(i);
-            String name = attribute.getNodeName();
-
-            if (!name.startsWith("android:layout_")) {
-                continue;
-            }
-
-            // Skip layout_width and layout_height; they are mandatory in all but GridLayout so not
-            // very interesting
-            if (name.equals("android:layout_width") || name.equals("android:layout_height")) {
-                continue;
-            }
-
-            Usage usage = attributeMap.get(name);
-            if (usage == null) {
-                usage = new Usage(name);
-            } else {
-                usage.incrementCount();
-            }
-            attributeMap.put(name, usage);
-        }
-    }
-
-    // Copied from AdtUtils
-    private static String readFile(File file) {
-        try {
-            return readFile(new FileReader(file));
-        } catch (FileNotFoundException e) {
-            e.printStackTrace();
-        }
-
-        return null;
-    }
-
-    private static String readFile(Reader inputStream) {
-        BufferedReader reader = null;
-        try {
-            reader = new BufferedReader(inputStream);
-            StringBuilder sb = new StringBuilder(2000);
-            while (true) {
-                int c = reader.read();
-                if (c == -1) {
-                    return sb.toString();
-                } else {
-                    sb.append((char)c);
-                }
-            }
-        } catch (IOException e) {
-            // pass -- ignore files we can't read
-        } finally {
-            try {
-                if (reader != null) {
-                    reader.close();
-                }
-            } catch (IOException e) {
-                e.printStackTrace();
-            }
-        }
-
-        return null;
-    }
-
-    private void printStatistics() {
-        System.out.println("Analyzed " + mLayoutFileCount
-                + " layouts (in a directory trees containing " + mFileVisitCount + " files)");
-        System.out.println("Top " + ATTRIBUTE_COUNT
-                + " for each view (excluding layout_ attributes) :");
-        System.out.println("\n");
-        System.out.println(" Rank    Count    Share  Attribute");
-        System.out.println("=========================================================");
-        List<String> views = new ArrayList<String>(mFrequencies.keySet());
-        Collections.sort(views);
-        for (String view : views) {
-            String top = processUageMap(view, mFrequencies.get(view));
-            if (top != null) {
-                mTopAttributes.put(view,  top);
-            }
-        }
-
-        System.out.println("\n\n\nTop " + ATTRIBUTE_COUNT + " layout attributes (excluding "
-                + "mandatory layout_width and layout_height):");
-        System.out.println("\n");
-        System.out.println(" Rank    Count    Share  Attribute");
-        System.out.println("=========================================================");
-        views = new ArrayList<String>(mLayoutAttributeFrequencies.keySet());
-        Collections.sort(views);
-        for (String view : views) {
-            String top = processUageMap(view, mLayoutAttributeFrequencies.get(view));
-            if (top != null) {
-                mTopLayoutAttributes.put(view,  top);
-            }
-        }
-    }
-
-    private static String processUageMap(String view, Map<String, Usage> map) {
-        if (map == null) {
-            return null;
-        }
-
-        if (view.indexOf('.') != -1 && !view.startsWith("android.")) {
-            // Skip custom views
-            return null;
-        }
-
-        List<Usage> values = new ArrayList<Usage>(map.values());
-        if (values.size() == 0) {
-            return null;
-        }
-
-        Collections.sort(values);
-        int totalCount = 0;
-        for (Usage usage : values) {
-            totalCount += usage.count;
-        }
-
-        System.out.println("\n<" + view + ">:");
-        if (view.equals("#document")) {
-            System.out.println("(Set on root tag, probably intended for included context)");
-        }
-
-        int place = 1;
-        int count = 0;
-        int prevCount = -1;
-        float prevPercentage = 0f;
-        StringBuilder sb = new StringBuilder();
-        for (Usage usage : values) {
-            if (count++ >= ATTRIBUTE_COUNT && usage.count < prevCount) {
-                break;
-            }
-
-            float percentage = 100 * usage.count/(float)totalCount;
-            if (percentage < THRESHOLD && prevPercentage >= THRESHOLD) {
-                System.out.println("  -----Less than 10%-------------------------------------");
-            }
-            System.out.printf("  %1d.    %5d    %5.1f%%  %s\n", place, usage.count,
-                    percentage, usage.attribute);
-
-            prevPercentage = percentage;
-            if (prevCount != usage.count) {
-                prevCount = usage.count;
-                place++;
-            }
-
-            if (percentage >= THRESHOLD /*&& usage.count > 1*/) { // 1:Ignore when not enough data?
-                if (sb.length() > 0) {
-                    sb.append(',');
-                }
-                String name = usage.attribute;
-                if (name.startsWith("android:")) {
-                    name = name.substring("android:".length());
-                }
-                sb.append(name);
-            }
-        }
-
-        return sb.length() > 0 ? sb.toString() : null;
-    }
-
-    private void printMergedMetadata() {
-        assert mXmlMetadataFile != null;
-        String metadata = readFile(mXmlMetadataFile);
-        if (metadata == null || metadata.length() == 0) {
-            System.err.println("Invalid metadata file");
-            System.exit(-6);
-        }
-
-        System.err.flush();
-        System.out.println("\n\nUpdating layout metadata file...");
-        System.out.flush();
-
-        StringBuilder sb = new StringBuilder((int) (2 * mXmlMetadataFile.length()));
-        String[] lines = metadata.split("\n");
-        for (int i = 0; i < lines.length; i++) {
-            String line = lines[i];
-            sb.append(line).append('\n');
-            int classIndex = line.indexOf("class=\"");
-            if (classIndex != -1) {
-                int start = classIndex + "class=\"".length();
-                int end = line.indexOf('"', start + 1);
-                if (end != -1) {
-                    String view = line.substring(start, end);
-                    if (view.startsWith("android.widget.")) {
-                        view = view.substring("android.widget.".length());
-                    } else if (view.startsWith("android.view.")) {
-                        view = view.substring("android.view.".length());
-                    } else if (view.startsWith("android.webkit.")) {
-                        view = view.substring("android.webkit.".length());
-                    }
-                    String top = mTopAttributes.get(view);
-                    if (top == null) {
-                        System.err.println("Warning: No frequency data for view " + view);
-                    } else {
-                        sb.append(line.substring(0, classIndex)); // Indentation
-
-                        sb.append("topAttrs=\"");
-                        sb.append(top);
-                        sb.append("\"\n");
-                    }
-
-                    top = mTopLayoutAttributes.get(view);
-                    if (top != null) {
-                        // It's a layout attribute
-                        sb.append(line.substring(0, classIndex)); // Indentation
-
-                        sb.append("topLayoutAttrs=\"");
-                        sb.append(top);
-                        sb.append("\"\n");
-                    }
-                }
-            }
-        }
-
-        System.out.println("\nTop attributes:");
-        System.out.println("--------------------------");
-        List<String> views = new ArrayList<String>(mTopAttributes.keySet());
-        Collections.sort(views);
-        for (String view : views) {
-            String top = mTopAttributes.get(view);
-            System.out.println(view + ": " + top);
-        }
-
-        System.out.println("\nTop layout attributes:");
-        System.out.println("--------------------------");
-        views = new ArrayList<String>(mTopLayoutAttributes.keySet());
-        Collections.sort(views);
-        for (String view : views) {
-            String top = mTopLayoutAttributes.get(view);
-            System.out.println(view + ": " + top);
-        }
-
-        System.out.println("\nModified XML metadata file:\n");
-        String newContent = sb.toString();
-        File output = new File(mXmlMetadataFile.getParentFile(), mXmlMetadataFile.getName() + ".mod");
-        if (output.exists()) {
-            output.delete();
-        }
-        try {
-            BufferedWriter writer = new BufferedWriter(new FileWriter(output));
-            writer.write(newContent);
-            writer.close();
-        } catch (IOException e) {
-            e.printStackTrace();
-        }
-        System.out.println("Done - wrote " + output.getPath());
-    }
-
-    //private File mPublicFile = new File(location, "data/res/values/public.xml");
-    private File mPublicFile = new File("/Volumes/AndroidWork/git/frameworks/base/core/res/res/values/public.xml");
-
-    private void listAdvanced() {
-        Set<String> keys = new HashSet<String>(1000);
-
-        // Merged usages across view types
-        Map<String, Usage> mergedUsages = new HashMap<String, Usage>(100);
-
-        for (Entry<String,Map<String,Usage>> entry : mFrequencies.entrySet()) {
-            String view = entry.getKey();
-            if (view.indexOf('.') != -1 && !view.startsWith("android.")) {
-                // Skip custom views etc
-                continue;
-            }
-            Map<String, Usage> map = entry.getValue();
-            for (Usage usage : map.values()) {
-//                if (usage.count == 1) {
-//                    System.out.println("Only found *one* usage of " + usage.attribute);
-//                }
-//                if (usage.count < 4) {
-//                    System.out.println("Only found " + usage.count + " usage of " + usage.attribute);
-//                }
-
-                String attribute = usage.attribute;
-                int index = attribute.indexOf(':');
-                if (index == -1 || attribute.startsWith("android:")) {
-                    Usage merged = mergedUsages.get(attribute);
-                    if (merged == null) {
-                        merged = new Usage(attribute);
-                        merged.count = usage.count;
-                        mergedUsages.put(attribute, merged);
-                    } else {
-                        merged.count += usage.count;
-                    }
-                }
-            }
-        }
-
-        for (Usage usage : mergedUsages.values())  {
-            String attribute = usage.attribute;
-            if (usage.count < 4) {
-                System.out.println("Only found " + usage.count + " usage of " + usage.attribute);
-                continue;
-            }
-            int index = attribute.indexOf(':');
-            if (index != -1) {
-                attribute = attribute.substring(index + 1); // +1: skip ':'
-            }
-            keys.add(attribute);
-        }
-
-        List<String> sorted = new ArrayList<String>(keys);
-        Collections.sort(sorted);
-        System.out.println("\nEncountered Attributes");
-        System.out.println("-----------------------------");
-        for (String attribute : sorted) {
-            System.out.println(attribute);
-        }
-
-        System.out.println();
-    }
-
-    private static class Usage implements Comparable<Usage> {
-        public String attribute;
-        public int count;
-
-
-        public Usage(String attribute) {
-            super();
-            this.attribute = attribute;
-
-            count = 1;
-        }
-
-        public void incrementCount() {
-            count++;
-        }
-
-        @Override
-        public int compareTo(Usage o) {
-            // Sort by decreasing frequency, then sort alphabetically
-            int frequencyDelta = o.count - count;
-            if (frequencyDelta != 0) {
-                return frequencyDelta;
-            } else {
-                return attribute.compareTo(o.attribute);
-            }
-        }
-
-        @Override
-        public String toString() {
-            return attribute + ": " + count;
-        }
-
-        @Override
-        public int hashCode() {
-            final int prime = 31;
-            int result = 1;
-            result = prime * result + ((attribute == null) ? 0 : attribute.hashCode());
-            return result;
-        }
-
-        @Override
-        public boolean equals(Object obj) {
-            if (this == obj)
-                return true;
-            if (obj == null)
-                return false;
-            if (getClass() != obj.getClass())
-                return false;
-            Usage other = (Usage) obj;
-            if (attribute == null) {
-                if (other.attribute != null)
-                    return false;
-            } else if (!attribute.equals(other.attribute))
-                return false;
-            return true;
-        }
-    }
-}
diff --git a/avdlauncher/.gitignore b/avdlauncher/.gitignore
deleted file mode 100644
index f20e626..0000000
--- a/avdlauncher/.gitignore
+++ /dev/null
@@ -1 +0,0 @@
-images/avdlauncher_icon.o
diff --git a/avdlauncher/NOTICE b/avdlauncher/NOTICE
deleted file mode 100644
index c5b1efa..0000000
--- a/avdlauncher/NOTICE
+++ /dev/null
@@ -1,190 +0,0 @@
-
-   Copyright (c) 2005-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.
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
-
-
-                                 Apache License
-                           Version 2.0, January 2004
-                        http://www.apache.org/licenses/
-
-   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
-   1. Definitions.
-
-      "License" shall mean the terms and conditions for use, reproduction,
-      and distribution as defined by Sections 1 through 9 of this document.
-
-      "Licensor" shall mean the copyright owner or entity authorized by
-      the copyright owner that is granting the License.
-
-      "Legal Entity" shall mean the union of the acting entity and all
-      other entities that control, are controlled by, or are under common
-      control with that entity. For the purposes of this definition,
-      "control" means (i) the power, direct or indirect, to cause the
-      direction or management of such entity, whether by contract or
-      otherwise, or (ii) ownership of fifty percent (50%) or more of the
-      outstanding shares, or (iii) beneficial ownership of such entity.
-
-      "You" (or "Your") shall mean an individual or Legal Entity
-      exercising permissions granted by this License.
-
-      "Source" form shall mean the preferred form for making modifications,
-      including but not limited to software source code, documentation
-      source, and configuration files.
-
-      "Object" form shall mean any form resulting from mechanical
-      transformation or translation of a Source form, including but
-      not limited to compiled object code, generated documentation,
-      and conversions to other media types.
-
-      "Work" shall mean the work of authorship, whether in Source or
-      Object form, made available under the License, as indicated by a
-      copyright notice that is included in or attached to the work
-      (an example is provided in the Appendix below).
-
-      "Derivative Works" shall mean any work, whether in Source or Object
-      form, that is based on (or derived from) the Work and for which the
-      editorial revisions, annotations, elaborations, or other modifications
-      represent, as a whole, an original work of authorship. For the purposes
-      of this License, Derivative Works shall not include works that remain
-      separable from, or merely link (or bind by name) to the interfaces of,
-      the Work and Derivative Works thereof.
-
-      "Contribution" shall mean any work of authorship, including
-      the original version of the Work and any modifications or additions
-      to that Work or Derivative Works thereof, that is intentionally
-      submitted to Licensor for inclusion in the Work by the copyright owner
-      or by an individual or Legal Entity authorized to submit on behalf of
-      the copyright owner. For the purposes of this definition, "submitted"
-      means any form of electronic, verbal, or written communication sent
-      to the Licensor or its representatives, including but not limited to
-      communication on electronic mailing lists, source code control systems,
-      and issue tracking systems that are managed by, or on behalf of, the
-      Licensor for the purpose of discussing and improving the Work, but
-      excluding communication that is conspicuously marked or otherwise
-      designated in writing by the copyright owner as "Not a Contribution."
-
-      "Contributor" shall mean Licensor and any individual or Legal Entity
-      on behalf of whom a Contribution has been received by Licensor and
-      subsequently incorporated within the Work.
-
-   2. Grant of Copyright License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      copyright license to reproduce, prepare Derivative Works of,
-      publicly display, publicly perform, sublicense, and distribute the
-      Work and such Derivative Works in Source or Object form.
-
-   3. Grant of Patent License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      (except as stated in this section) patent license to make, have made,
-      use, offer to sell, sell, import, and otherwise transfer the Work,
-      where such license applies only to those patent claims licensable
-      by such Contributor that are necessarily infringed by their
-      Contribution(s) alone or by combination of their Contribution(s)
-      with the Work to which such Contribution(s) was submitted. If You
-      institute patent litigation against any entity (including a
-      cross-claim or counterclaim in a lawsuit) alleging that the Work
-      or a Contribution incorporated within the Work constitutes direct
-      or contributory patent infringement, then any patent licenses
-      granted to You under this License for that Work shall terminate
-      as of the date such litigation is filed.
-
-   4. Redistribution. You may reproduce and distribute copies of the
-      Work or Derivative Works thereof in any medium, with or without
-      modifications, and in Source or Object form, provided that You
-      meet the following conditions:
-
-      (a) You must give any other recipients of the Work or
-          Derivative Works a copy of this License; and
-
-      (b) You must cause any modified files to carry prominent notices
-          stating that You changed the files; and
-
-      (c) You must retain, in the Source form of any Derivative Works
-          that You distribute, all copyright, patent, trademark, and
-          attribution notices from the Source form of the Work,
-          excluding those notices that do not pertain to any part of
-          the Derivative Works; and
-
-      (d) If the Work includes a "NOTICE" text file as part of its
-          distribution, then any Derivative Works that You distribute must
-          include a readable copy of the attribution notices contained
-          within such NOTICE file, excluding those notices that do not
-          pertain to any part of the Derivative Works, in at least one
-          of the following places: within a NOTICE text file distributed
-          as part of the Derivative Works; within the Source form or
-          documentation, if provided along with the Derivative Works; or,
-          within a display generated by the Derivative Works, if and
-          wherever such third-party notices normally appear. The contents
-          of the NOTICE file are for informational purposes only and
-          do not modify the License. You may add Your own attribution
-          notices within Derivative Works that You distribute, alongside
-          or as an addendum to the NOTICE text from the Work, provided
-          that such additional attribution notices cannot be construed
-          as modifying the License.
-
-      You may add Your own copyright statement to Your modifications and
-      may provide additional or different license terms and conditions
-      for use, reproduction, or distribution of Your modifications, or
-      for any such Derivative Works as a whole, provided Your use,
-      reproduction, and distribution of the Work otherwise complies with
-      the conditions stated in this License.
-
-   5. Submission of Contributions. Unless You explicitly state otherwise,
-      any Contribution intentionally submitted for inclusion in the Work
-      by You to the Licensor shall be under the terms and conditions of
-      this License, without any additional terms or conditions.
-      Notwithstanding the above, nothing herein shall supersede or modify
-      the terms of any separate license agreement you may have executed
-      with Licensor regarding such Contributions.
-
-   6. Trademarks. This License does not grant permission to use the trade
-      names, trademarks, service marks, or product names of the Licensor,
-      except as required for reasonable and customary use in describing the
-      origin of the Work and reproducing the content of the NOTICE file.
-
-   7. Disclaimer of Warranty. Unless required by applicable law or
-      agreed to in writing, Licensor provides the Work (and each
-      Contributor provides its Contributions) on an "AS IS" BASIS,
-      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
-      implied, including, without limitation, any warranties or conditions
-      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
-      PARTICULAR PURPOSE. You are solely responsible for determining the
-      appropriateness of using or redistributing the Work and assume any
-      risks associated with Your exercise of permissions under this License.
-
-   8. Limitation of Liability. In no event and under no legal theory,
-      whether in tort (including negligence), contract, or otherwise,
-      unless required by applicable law (such as deliberate and grossly
-      negligent acts) or agreed to in writing, shall any Contributor be
-      liable to You for damages, including any direct, indirect, special,
-      incidental, or consequential damages of any character arising as a
-      result of this License or out of the use or inability to use the
-      Work (including but not limited to damages for loss of goodwill,
-      work stoppage, computer failure or malfunction, or any and all
-      other commercial damages or losses), even if such Contributor
-      has been advised of the possibility of such damages.
-
-   9. Accepting Warranty or Additional Liability. While redistributing
-      the Work or Derivative Works thereof, You may choose to offer,
-      and charge a fee for, acceptance of support, warranty, indemnity,
-      or other liability obligations and/or rights consistent with this
-      License. However, in accepting such obligations, You may act only
-      on Your own behalf and on Your sole responsibility, not on behalf
-      of any other Contributor, and only if You agree to indemnify,
-      defend, and hold each Contributor harmless for any liability
-      incurred by, or claims asserted against, such Contributor by reason
-      of your accepting any such warranty or additional liability.
-
-   END OF TERMS AND CONDITIONS
-
diff --git a/avdlauncher/avdlauncher.exe.manifest b/avdlauncher/avdlauncher.exe.manifest
deleted file mode 100755
index 4cf055c..0000000
--- a/avdlauncher/avdlauncher.exe.manifest
+++ /dev/null
@@ -1,33 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-
-<!--
-  For details on the Assembly Manifest, please look here:
-  http://msdn.microsoft.com/en-us/library/aa374191(VS.85).aspx
--->
-
-<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> 
-
-    <application>
-        <!--The ID below indicates application support for Windows Vista -->
-        <supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}" />
-        <!--The ID below indicates application support for Windows 7 -->
-        <supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}" />
-    </application>
-
-    <assemblyIdentity version="1.0.0.0"
-        processorArchitecture="x86"
-        name="Android.SDK.Launcher"
-        type="win32"
-        /> 
-
-    <description>Launches the Android SDK Manager to download Android SDK packages.</description> 
-
-    <!-- Identify the application security requirements. -->
-    <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
-        <security>
-            <requestedPrivileges>
-                <requestedExecutionLevel level="asInvoker" uiAccess="false" />
-            </requestedPrivileges>
-        </security>
-    </trustInfo>
-</assembly>
diff --git a/avdlauncher/build.gradle b/avdlauncher/build.gradle
deleted file mode 100644
index c280642..0000000
--- a/avdlauncher/build.gradle
+++ /dev/null
@@ -1,36 +0,0 @@
-apply plugin: 'c'
-apply plugin: 'sdk-files'
-apply plugin: 'windows-setup'
-
-executables {
-    avdLauncher {}
-}
-
-sources {
-    avdLauncher {
-        c {
-            source {
-                srcDir "src/source"
-                include "**/*.c"
-            }
-        }
-    }
-}
-
-sdk {
-    windows {
-        item( { getExeName("windows32AvdLauncherExecutable") } ) {
-            into 'lib'
-            name 'AVD Manager.exe'
-            builtBy 'windows32AvdLauncherExecutable'
-        }
-    }
-}
-
-def getExeName(String name) {
-    // binaries will return a set of binaries
-    def binaries = executables.avdLauncher.binaries.matching { it.name == name }
-    // calling .exeFile on the set returns an array with the result from each item in the set...
-    return binaries.executableFile.get(0)
-}
-
diff --git a/avdlauncher/images/android_icon.ico b/avdlauncher/images/android_icon.ico
deleted file mode 100644
index bd25179..0000000
--- a/avdlauncher/images/android_icon.ico
+++ /dev/null
Binary files differ
diff --git a/avdlauncher/images/android_icon.rc b/avdlauncher/images/android_icon.rc
deleted file mode 100644
index fcf9049..0000000
--- a/avdlauncher/images/android_icon.rc
+++ /dev/null
@@ -1,2 +0,0 @@
-1 ICON "../images/android_icon.ico"
-1 RT_MANIFEST "../avdlauncher.exe.manifest"
diff --git a/avdlauncher/src/source/avdlauncher.c b/avdlauncher/src/source/avdlauncher.c
deleted file mode 100644
index 12b1285..0000000
--- a/avdlauncher/src/source/avdlauncher.c
+++ /dev/null
@@ -1,134 +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.
- */
-
-/*
- * The "AVD Manager" is for Windows only.
- * This simple .exe will sit at the root of the Windows SDK
- * and currently simply executes tools\android.bat.
- *
- * TODO: replace by a jar-exe wrapper.
- */
-
-#ifdef _WIN32
-
-#include <stdio.h>
-#include <stdarg.h>
-#include <string.h>
-#include <windows.h>
-
-
-int _enable_dprintf = 0;
-
-void dprintf(char *msg, ...) {
-    va_list ap;
-    va_start(ap, msg);
-
-    if (_enable_dprintf) {
-        vfprintf(stderr, msg, ap);
-    }
-
-    va_end(ap);
-}
-
-void display_error(LPSTR description) {
-    DWORD err = GetLastError();
-    LPSTR s, s2;
-
-    fprintf(stderr, "%s, error %ld\n", description, err);
-
-    if (FormatMessageA(FORMAT_MESSAGE_ALLOCATE_BUFFER | /* dwFlags */
-                      FORMAT_MESSAGE_FROM_SYSTEM,
-                      NULL,                             /* lpSource */
-                      err,                              /* dwMessageId */
-                      0,                                /* dwLanguageId */
-                      (LPSTR)&s,                        /* lpBuffer */
-                      0,                                /* nSize */
-                      NULL) != 0) {                     /* va_list args */
-        fprintf(stderr, "%s", s);
-
-        s2 = (LPSTR) malloc(strlen(description) + strlen(s) + 5);
-        sprintf(s2, "%s\r\n%s", description, s);
-        MessageBox(NULL, s2, "Android AVD Manager - Error", MB_OK);
-        free(s2);
-        LocalFree(s);
-    }
-}
-
-
-int avd_launcher() {
-    int                   result = 0;
-    STARTUPINFO           startup;
-    PROCESS_INFORMATION   pinfo;
-    CHAR                  program_dir[MAX_PATH];
-    int                   ret, pos;
-
-    ZeroMemory(&pinfo, sizeof(pinfo));
-
-    ZeroMemory(&startup, sizeof(startup));
-    startup.cb = sizeof(startup);
-    startup.dwFlags     = STARTF_USESHOWWINDOW;
-    startup.wShowWindow = SW_HIDE|SW_MINIMIZE;
-
-    /* get path of current program, to switch dirs here when executing the command. */
-    ret = GetModuleFileName(NULL, program_dir, sizeof(program_dir));
-    if (ret == 0) {
-        display_error("Failed to get program's filename:");
-        result = 1;
-    } else {
-        /* Remove the last segment to keep only the directory. */
-        pos = ret - 1;
-        while (pos > 0 && program_dir[pos] != '\\') {
-            --pos;
-        }
-        program_dir[pos] = 0;
-    }
-
-    if (!result) {
-        dprintf("Program dir: %s\n", program_dir);
-
-        ret = CreateProcess(
-                NULL,                                       /* program path */
-                "tools\\android.bat avd",                   /* command-line */
-                NULL,                  /* process handle is not inheritable */
-                NULL,                   /* thread handle is not inheritable */
-                TRUE,                          /* yes, inherit some handles */
-                CREATE_NO_WINDOW,                /* we don't want a console */
-                NULL,                     /* use parent's environment block */
-                program_dir,             /* use parent's starting directory */
-                &startup,                 /* startup info, i.e. std handles */
-                &pinfo);
-
-        dprintf("CreateProcess returned %d\n", ret);
-
-        if (!ret) {
-            display_error("Failed to execute tools\\android.bat:");
-            result = 1;
-        }
-    }
-
-    dprintf("Cleanup.\n");
-
-    return result;
-}
-
-int main(int argc, char **argv) {
-    _enable_dprintf = argc > 1 && strcmp(argv[1], "-v") == 0;
-    dprintf("Verbose debug mode.\n");
-
-    return avd_launcher();
-}
-
-#endif /* _WIN32 */
diff --git a/build.gradle b/build.gradle
deleted file mode 100644
index 733ba3c..0000000
--- a/build.gradle
+++ /dev/null
@@ -1,150 +0,0 @@
-apply plugin: 'sdk-files'
-
-sdk {
-    common {
-        item('files/tools_source.properties') {
-            name 'source.properties'
-            notice null
-        }
-        item('files/plugin.prop') {
-            into 'lib'
-            notice null
-        }
-
-        item('emulator/snapshot/snapshots.img') {
-            into 'lib/emulator'
-            notice 'emulator/NOTICE'
-        }
-        item('emulator/skins/dynamic') {
-            into 'lib/emulator/skins/dynamic'
-            notice 'emulator/NOTICE'
-        }
-
-        item('templates/build.template') {
-            into 'lib'
-            notice 'templates/NOTICE'
-        }
-        item('templates/uibuild.template') {
-            into 'lib'
-            notice 'templates/NOTICE'
-        }
-        item('templates/build_gradle.template') {
-            into 'lib'
-            notice 'templates/NOTICE'
-        }
-
-        item('files/ant') {
-            into 'ant'
-            notice 'files/ant/NOTICE'
-        }
-        item('files/proguard-project.txt') {
-            into 'lib'
-            notice null
-        }
-        item('files/proguard-project.txt') {
-            into 'proguard'
-            notice null
-        }
-        item('files/proguard-android.txt') {
-            into 'proguard'
-            notice null
-        }
-        item('files/proguard-android-optimize.txt') {
-            into 'proguard'
-            notice null
-        }
-
-        item('files/devices.xml') {
-            into 'lib'
-            notice 'files/NOTICE'
-        }
-        item('files/android.el') {
-            into 'lib'
-            notice 'files/NOTICE'
-        }
-
-        item('apps/SdkController') {
-            into 'apps/SdkController'
-            notice 'apps/SdkController/NOTICE'
-        }
-
-        item('files/typos') {
-            into 'support'
-            notice 'files/NOTICE'
-        }
-
-        item("$rootProject.projectDir.parentFile/prebuilts/qemu-kernel/x86/pc-bios/bios.bin") {
-            into 'lib/pc-bios'
-            notice null
-        }
-        item("$rootProject.projectDir.parentFile/prebuilts/qemu-kernel/x86/pc-bios/vgabios-cirrus.bin") {
-            into 'lib/pc-bios'
-            notice null
-        }
-
-        item("$rootProject.projectDir.parentFile/prebuilts/tools/common/proguard/license.html") {
-            into 'proguard'
-            notice null
-        }
-
-        item("$rootProject.projectDir.parentFile/prebuilts/tools/common/proguard/proguard4.7/README") {
-            into 'proguard'
-            notice null
-        }
-
-        item("$rootProject.projectDir.parentFile/prebuilts/tools/common/proguard/proguard4.7/docs") {
-            into 'proguard/docs'
-            notice null
-        }
-
-        item("$rootProject.projectDir.parentFile/prebuilts/tools/common/proguard/proguard4.7/examples") {
-            into 'proguard/examples'
-            notice null
-        }
-
-        item("$rootProject.projectDir.parentFile/prebuilts/tools/common/proguard/proguard4.7/lib") {
-            into 'proguard/lib'
-            notice null
-        }
-
-        item("$rootProject.projectDir.parentFile/prebuilts/tools/common/proguard/proguard4.7/src/proguard/ant/task.properties") {
-            into 'proguard/ant'
-            notice null
-        }
-    }
-
-    common(mac, linux) {
-        item("$rootProject.projectDir.parentFile/prebuilts/tools/common/proguard/proguard4.7/bin/proguard.sh") {
-            into 'proguard/bin'
-            notice null
-        }
-
-        item("$rootProject.projectDir.parentFile/prebuilts/tools/common/proguard/proguard4.7/bin/proguardgui.sh") {
-            into 'proguard/bin'
-            notice null
-        }
-
-        item("$rootProject.projectDir.parentFile/prebuilts/tools/common/proguard/proguard4.7/bin/retrace.sh") {
-            into 'proguard/bin'
-            notice null
-        }
-    }
-
-    windows {
-        item("$rootProject.projectDir.parentFile/prebuilts/tools/common/proguard/proguard4.7/bin/proguard.bat") {
-            into 'proguard/bin'
-            notice null
-        }
-
-        item("$rootProject.projectDir.parentFile/prebuilts/tools/common/proguard/proguard4.7/bin/proguardgui.bat") {
-            into 'proguard/bin'
-            notice null
-        }
-
-        item("$rootProject.projectDir.parentFile/prebuilts/tools/common/proguard/proguard4.7/bin/retrace.bat") {
-            into 'proguard/bin'
-            notice null
-        }
-    }
-
-}
diff --git a/build/product_sdk.mk b/build/product_sdk.mk
deleted file mode 100644
index f1acd5f..0000000
--- a/build/product_sdk.mk
+++ /dev/null
@@ -1,30 +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.
-#
-
-
-#
-# This file is included by build.git/target/product/sdk.mk
-# to define the tools that needed to be built and included
-# in an SDK.
-#
-# If you add a dependency here, you will want to then
-# modify sdk.git/build/tools.atree to have the new files
-# packaged in the SDK.
-#
-
-# Host tools and java libraries that are parts of the SDK.
-PRODUCT_PACKAGES += \
-
diff --git a/changes.txt b/changes.txt
deleted file mode 100644
index d4ca45d..0000000
--- a/changes.txt
+++ /dev/null
@@ -1,199 +0,0 @@
-Change log for Android SDK Tools.
-
-Revision 22.2.1:
-- Emergency fix to new project templates.
-
-Revision 22.2.0:
-
-Revision 22:
-
-Revision 20:
-- Ant build system:
-- Ant build system:
-   * the location of the SDK can now be set through the ANDROID_HOME
-     environment variable (requires updating the project's build.xml file)
-   * Fixed issues with compilation, deployment of test projects and running tests.
-     Both separate test projects and self-contained app+test projects now work.
-   * Aidl files from library projects are now in the import list.
-
-Revision 19:
-- Fix GPU rendering
-
-Revision 18:
-* Fix Ant issues where some jar libraries in libs/ are not picked in some
-  cases
-* New version of SdkController
-
-Revision 17:
-* Bug fixes.
-* ProGuard updated to version 4.7. In addition to many new features,
-  this will fix the "Conversion to Dalvik format failed with error 1"
-  error some users have experienced.
-* The default proguard.cfg file has been updated with better
-  flags.
-* Lint now checks Java code, and checks which previously performed
-  pattern based searches in the Java code (such as the unused resource
-  check) have been rewritten to use the more accurate Java parse
-  trees.
-* Lint supports library projects, so for example the unused resource
-  check will properly handle resources declared in a library project
-  and referenced in a downstream project.
-* Lint warnings can be suppressed in Java code with the new
-  @SuppressLint annotation, and in XML files with the new tools:
-  namespace and ignore-attribute.
-* New lint checks:
-  * Find Android API calls that require a version of Android higher
-    than the minimum supported version. You can use the new @TargetApi
-    annotation to specify local overrides for conditionally loaded
-    code.
-  * Find object allocations within onDraw, onMeasure and onLayout
-    calls
-  * Find usages of HashMap<Integer,X> which can be replaced by the
-    more efficient SparseArray, SparseIntArray or SparseBooleanArray
-  * Find typos in XML namespace declarations, as well as unused custom
-    namespace declarations and usages of custom namespaces in library
-    projects which do not yet work
-  * Find manifest files which declare more than one <uses-sdk>
-    elements, or which fail to declare minSdkVersion or
-    targetSdkVersion
-  * Check dialog button order such that OK/Cancel are in the right
-    order (depending on the target version of Android), that they are
-    using the standard case ("OK", not "Ok" or "ok" etc), and that
-    there aren't any Back buttons.
-  * Check menus to ensure that they are using "ifRoom" instead of
-    "always" for the showAsAction attribute (unless it's used
-    sparingly)
-  * Find hardcoded android:debuggable attributes on <application>
-    elements. This can lead to accidentally leaving debug information
-    in published applications.
-  * Find errors in format strings. This includes inconsistencies
-    between translated versions, as well as incompatible types
-    declared in XML and supplied in the String.format call in Java.
-  * Find incorrect casts in Java code where the cast is incompatible
-    with the view type declared in XML layouts.
-  * Find hardcoded references to "/sdcard" in Java code; these should
-    be using Environment.getExternalStorageDirectory().getPath()
-    instead
-  * Find "import android.R" statements in Java code, which can lead to
-    confusing compilation error messages
-  * Find Java code which creates world-writeable files (which can lead
-    to security problems)
-  * Find references to private resources (which can lead to runtime
-    errors on devices that do not provide the resource, since private
-    resources may disappear any time, and may not be present on all
-    platforms.)
-  * Find invalid @id references (where for example a RelativeLayout
-    references an id that does not exist anywhere). If no match is
-    found, it looks for spelling mistakes and suggests other similar
-    ids in the error message.
-  * Finds method calls to java.lang.Math where a float variable is
-    cast to a double and/or the return value is cast to a float, and
-    suggests replacing it with the equivalent android.util.FloatMath
-    method.
-  * Finds calls to a getter on the same class where a field could be
-    accessed instead.
-  * Find XML files using a different encoding format than UTF-8, since
-    this can lead to subtle bugs (and lint was fixed to properly use
-    the specified encoding)
-  * Find XML resource files that contain text which should not be
-    there (such as in layouts). This can identify accidentally
-    malformed documents which happen to be valid XML, such as a
-    missing "<" tag opening character.
-  * Find style references which lead to cycles, such as extending
-    self.
-
-Revision 16:
-* New "lint" tool which scans Android project trees for potential
-  problems such as missing translations, duplicate ids between layouts
-  that include each other, using px instead of dp units, hardcoded
-  strings, missing contentDescriptions, obsolete Proguard
-  configuration files, etc. For a full list of available issues run
-  "lint --show" (and see eclipse/changes.txt for further details).
-* layoutopt was removed; its functionality is replaced by the new lint
-  tool
-
-Revision 14:
-
-- Build performance improvements:
-   * resource compilation and packaging now properly use dependency to only
-     be executed if a resource changed.
-   * Optimized resource compilation for projects with libraries. This should
-     speed up this phase significantly for large projects with libraries.
-   * PNG files that are optimized during resource packaging are now cached
-     and only re-optimized if they changed instead of doing at every build.
-- New library project mechanism:
-   *
-
-Revision 13:
-
-Revision 12: (07/2011):
-- The AVD manager and emulator can now use system images compiled for ARM v7 and
-  x86 CPUs.
-
-Revision 11 (05/2011):
-- See eclipse/changes.txt for ADT related changes.
-
-Revision 10 (02/2011):
-- The tools now automatically generate Java Programming Language
-  source files (in the gen directory) and bytecode (in the res/raw
-  directory) from your native .rs files
-
-Revision 9 (01/2011):
-- Fix packaging issue that broke draw9patch
-- Ant build rules will now check the Ant version and fail if it's older than 1.8
-- Fix "folder locked" errors when installing packages in SDK Manager on Windows.
-- Support https proxy when installing from SDK Manager.
-- SDK Manager now suggests to install missing base platform for add-ons.
-- Default proguard config file changes:
-   * ignore classes extending android.preference.Preference
-   * ignore classes extending android.app.backup.BackupAgentHelper
-- Ant lib rules now allow for overriding java.encoding, java.source, and java.target
-- Default encoding for Ant javac is now UTF-8
-- Logcat view in DDMS now properly displays UTF-8 characters.
-
-
-Revision 8 (12/2010):
-- New SDK component: platform-tools. This makes all platforms use the same
-  latest version of aapt/aidl/dx.
-- Support for true debug build. No need to change the value of debuggable in
-  the Android Manifest.
-  "ant debug" will automatically insert debuggable==true, while "ant release"
-  will not.
-  If debuggable=true is set, then "ant release" will actually do a debug build.
-- Automatic Proguard support in release builds. Only need to have a proguard.config
-  property in default.properties that points to a proguard config file.
-- new overridable Ant javac properties: java.encoding, java.source, and java.target
-  (default to "ascii", "1.5" and "1.5")
-
-
-Revision 7 (09/2010):
-- Support for Ant rules provided by the Tools components (override the one in
-  the platform component)
-- Added support for libraries with library dependencies.
-- Support for aidl files in library projects.
-- Support for extension targets in Ant build to perform tasks between the
-  normal tasks: -pre-build, -pre-compile, -post-compile.
-- Headless SDK update. See 'android -h update sdk' for more info.
-- Fixed location control in DDMS to work in any locale not using '.' as a
-  decimal point.
-
-
-Revision 6 (05/2010)
-- Support for library project to share code/resources among projects
-    - Updated Ant rules and custom tasks
-    - New "android create lib-project", "android update lib-project" actions.
-    - New parameter for "android update project"
-
-
-Revision 5 (03/2010):
-- AVD/SDK Manager:
-	- Fixed SSL download for the standalone version of the SDK Updater.
-	- Fixed issue with 64bit JVM on windows.
-	- Add support for samples components.
-	- improved support for dependency between components.
-	- AVDs now sorted by API level.
-	- Prevent deletion of running AVDs.
-	- Settings are now automatically saved, no need to click Apply.
-- Emulator now requires sd card to be 9MB and above.
-- Fixed layoutopt.bat to correctly execute on Windows.
-
diff --git a/docs/Notes_on_WST_StructuredDocument.txt b/docs/Notes_on_WST_StructuredDocument.txt
deleted file mode 100755
index dcf124d..0000000
--- a/docs/Notes_on_WST_StructuredDocument.txt
+++ /dev/null
@@ -1,183 +0,0 @@
-Notes on WST StructuredDocument
--------------------------------
-
-Created:    2010/11/26
-References: WST 3.1.x, Eclipse 3.5 Galileo
-
-To manipulate XML documents in refactorings, we sometimes use the WST/SEE
-"StructuredDocument" API. There isn't exactly a lot of documentation on
-this out there, so this is a short explanation of how it works, totally
-based on _empirical_ evidence. As such, it must be taken with a grain of salt.
-
-Examples of usage can be found in
-  sdk/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/refactorings/
-
-  
-1- Get a document instance
---------------------------
-
-To get a document from an existing IFile resource:
-
-    IModelManager modelMan = StructuredModelManager.getModelManager();
-    IStructuredDocument sdoc = modelMan.createStructuredDocumentFor(file);
-
-Note that the IStructuredDocument and all the associated interfaces we'll use
-below are all located in org.eclipse.wst.sse.core.internal.provisional,
-meaning they _might_ change later.
-
-Also note that this parses the content of the file on disk, not of a buffer
-with pending unsaved modifications opened in an editor.
-
-There is a counterpart for non-existent resources:
-
-    IModelManager.createNewStructuredDocumentFor(IFile)
-
-However our goal so far has been to _parse_ existing documents, find
-the place that we wanted to modify and then generate a TextFileChange
-for a refactoring operation. Consequently this document doesn't say
-anything about using this model to modify content directly.
-
-
-2- Structured Document overview
--------------------------------
-
-The IStructuredDocument is organized in "regions", which are little pieces
-of text.
-
-The document contains a list of region collections, each one being
-a list of regions. Each region has a type, as well as text.
-
-Since we use this to parse XML, let's look at this XML example:
-
-<?xml version="1.0" encoding="utf-8"?> \n
-<resource> \n
-    <color/>
-    <string name="my_string">Some Value</string>  <!-- comment -->\n
-</resource>
-
-
-This will result in the following regions and sub-regions:
-(all the constants below are located in DOMRegionContext)
-
-XML_PI_OPEN
-    XML_PI_OPEN:<?
-    XML_TAG_NAME:xml
-    XML_TAG_ATTRIBUTE_NAME:version
-    XML_TAG_ATTRIBUTE_EQUALS:=
-    XML_TAG_ATTRIBUTE_VALUE:"1.0"
-    XML_TAG_ATTRIBUTE_NAME:encoding
-    XML_TAG_ATTRIBUTE_EQUALS:=
-    XML_TAG_ATTRIBUTE_VALUE:"utf-8"
-    XML_PI_CLOSE:?>
-
-XML_CONTENT
-    XML_CONTENT:\n
-
-XML_TAG_NAME
-    XML_TAG_OPEN:<
-    XML_TAG_NAME:resources
-    XML_TAG_CLOSE:>
-
-XML_CONTENT
-    XML_CONTENT:\n + whitespace before color
-
-XML_TAG_NAME
-    XML_TAG_OPEN:<
-    XML_TAG_NAME:color
-    XML_EMPTY_TAG_CLOSE:/>
-
-XML_CONTENT
-    XML_CONTENT:\n + whitespace before string
-
-XML_TAG_NAME
-    XML_TAG_OPEN:<
-    XML_TAG_NAME:string
-    XML_TAG_ATTRIBUTE_NAME:name
-    XML_TAG_ATTRIBUTE_EQUALS:=
-    XML_TAG_ATTRIBUTE_VALUE:"my_string"
-    XML_TAG_CLOSE:>
-
-XML_CONTENT
-    XML_CONTENT:Some Value
-
-XML_TAG_NAME
-    XML_END_TAG_OPEN:</
-    XML_TAG_NAME:string
-    XML_TAG_CLOSE:>
-
-XML_CONTENT
-    XML_CONTENT: (2 spaces before the comment)
-
-XML_COMMENT_TEXT
-    XML_COMMENT_OPEN:<!--
-    XML_COMMENT_TEXT: comment
-    XML_COMMENT_CLOSE:--
-
-XML_CONTENT
-    XML_CONTENT: \n after comment
-
-XML_TAG_NAME
-    XML_END_TAG_OPEN:</
-    XML_TAG_NAME:resources
-    XML_TAG_CLOSE:>
-
-XML_CONTENT
-    XML_CONTENT:
-
-
-3- Iterating through regions
-----------------------------
-
-To iterate through all regions, we need to process the list of top-level regions and then
-iterate over inner regions:
-
-    for (IStructuredDocumentRegion regions : sdoc.getStructuredDocumentRegions()) {
-        // process inner regions
-        for (int i = 0; i < regions.getNumberOfRegions(); i++) {
-            ITextRegion region = regions.getRegions().get(i);
-            String type = region.getType();
-            String text = regions.getText(region);
-        }
-    }
-
-Each "region collection" basically matches one XML tag, with sub-regions for all the tokens
-inside a tag.
-
-Note that an XML_CONTENT region is actually the whitespace, was is known as a TEXT in the w3c DOM.
-
-Also note that each outer region has a type, but the inner regions also reuse a similar type.
-So for example an outer XML_TAG_NAME region collection is a proper XML tag, and it will contain
-an opening tag, a closing tag but also an XML_TAG_NAME that is the tag name itself.
-
-Surprisingly, the inner regions do not have many access methods we can use on them, except their
-type and start/length/end. There are two length and end methods:
-- getLength() and getEnd() take any whitespace into account.
-- getTextLength() and getTextEnd() exclude some typical trailing whitespace.
-
-Note that regarding the trailing whitespace, empirical evidence shows that in the XML case
-here, the only case where it matters is in a tag such as <string name="my_string">: for the
-XML_TAG_NAME region, getLength is 7 (string + space) and getTextLength is 6 (string, no space).
-Spacing between XML element is its own collapsed region.
-
-If you want the text of the inner region, you actually need to query it from the outer region.
-The outer IStructuredDocumentRegion (the region collection) contains lots more useful access
-methods, some of which return details on the inner regions:
-- getText     : without the whitespace.
-- getFullText : with the whitespace.
-- getStart / getLength / getEnd : type-dependent offset, including whitespace.
-- getStart / getTextLength / getTextEnd : type-dependent offset, excluding "irrelevant" whitespace.
-- getStartOffset / getEndOffset / getTextEndOffset : relative to document.
-
-Empirical evidence shows that there is no discernible difference between the getStart/getEnd
-values and those returned by getStartOffset/getEndOffset. Please abide by the javadoc.
-
-All offsets start at zero.
-
-Given a region collection, you can also browse regions either using a getRegions() list, or
-using getFirst/getLastRegion, or using getRegionAtCharacterOffset(). Iterating the region
-list seems the most useful scenario. There's no actual iterator provided for inner regions.
-
-There are a few other methods available in the regions classes. This was not an exhaustive list.
-
-
-----
diff --git a/docs/howto_SDK_git_cygwin.txt b/docs/howto_SDK_git_cygwin.txt
deleted file mode 100644
index 622c592..0000000
--- a/docs/howto_SDK_git_cygwin.txt
+++ /dev/null
@@ -1,189 +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.
-
-
-Subject: How to get the android source code using Cygwin and Git
-Date:    2009/04/27
-Updated: 2009/05/21
-Updated: 2010/03/30
-
-
-Table of content:
-  1- Goals and Requirements
-  2- Getting the code, the simple way
-  3- SSH issues
-  4- Advanced Tricks
-
-
--------------------------
-1- Goals and Requirements
--------------------------
-
-This document explains how to checkout the Android source from the git
-repositories under Windows.
-
-As stated in development/docs/howto_build_SDK.txt, one can't build the whole
-Android source code under Windows. You can only build the SDK tools for
-Windows.
-
-There are a number of caveats in checking out the code from Git under Windows. 
-This document tries to explain them.
-
-First you will need to meet the following requirements:
-- You must have Cygwin installed. But wait! You CANNOT use the latest Cygwin 1.7.
-  Instead you MUST use the "legacy Cygwin 1.5" that you can find at this page:
-
-    http://cygwin.org/win-9x.html
-
-  Don't mind the page title, just grab setup-legacy.exe and it will works just fine
-  under XP or Vista.
-
-- You must install Cyginw using the "Unix / Binary" mode.
-  If you don't do that, git will fail to properly compute some SHA1 keys.
-
-- You need the "git" and "curl" packages to checkout the code.
-  If you plan to contribute, you might want to get "gitk" also.
-
-  Note: if you want to build the SDK, check the howto_build_SDK.txt file
-  for a list of extra required packages.
-  The short summary is that you need at least these:
-    autoconf, bison, curl, flex, gcc, g++, git, gnupg, make, mingw-zlib, python, unzip, zip
-  and you must avoid the "readline" package.
-
-
------------------------------------
-2- Getting the code, the simple way
------------------------------------
-
-Out of the box, "repo" and "git" will work just fine under Cygwin:
-
-  $ repo init -u git://android.git.kernel.org/platform/manifest.git
-  $ repo sync
-
-And you're done. You can build as explained in howto_build_SDK.txt and ignore
-the rest of this document.
-
-
--------------
-3- SSH issues
--------------
-
-If you maintain your own private repository using an SSH server, you might get
-some "mux/ssh" errors. In this case try this:
-
-  $ repo init -u ssh://my.private.ssh.repo/platform/manifest.git
-  $ export GIT_SSH=ssh
-  $ repo sync
-
-
-------------------
-4- Advanced Tricks
-------------------
-
-There is one remaining issue with the default repo/git options:
-
-If you plan on contributing, you will notice that even after a fresh "repo
-sync" some projects are marked as having modified files. This happens on the
-"bionic" and the "external/iptables" project. The issue is that they have files
-which have the same name yet differ only by their case-sensitivity. Since the
-Windows filesystem is not case-sensitive, this confuses Git.
-
-Solution: we can simply ignore these projects as they are not needed to build
-the Windows SDK.
-
-To do this you just need to create a file .repo/local_manifest.xml that
-provides a list of projects to ignore:
-
-<?xml version="1.0" encoding="UTF-8"?>
-<manifest>
-  <remove-project name="platform/external/iptables" />
-</manifest>
-
-The other thing we can do is tell git not to track the files that cause
-problems:
-
-  cd bionic
-  git update-index --assume-unchanged \
-    libc/kernel/common/linux/netfilter/xt_CONNMARK.h \
-    libc/kernel/common/linux/netfilter/xt_MARK.h \
-    libc/kernel/common/linux/netfilter_ipv6/ip6t_HL.h
-
-  cd external/tcpdump;
-  git update-index --assume-unchanged \
-    tests/print-X.new \
-    tests/print-XX.new
-
-
-Here's a script that takes care of all these details. It performs the repo
-init, creates the appropriate local_manifest.xml, does a repo sync as
-needed and tell git to ignore the offending files:
-
-------------
-#!/bin/bash
-
-set -e  # fail on errors
-
-URL=ssh://android-git.corp.google.com:29418/platform/manifest.git
-BRANCH=donut
-if [ "$1" == "-b" ]; then shift; BRANCH=$1; shift; fi
-
-# repo init if there's no .repo directory
-if [[ ! -d .repo ]]; then
-    repo init -u $URL -b $BRANCH
-fi
-
-# create a local_manifest to exclude projects that cause problems under Windows
-# due to the case-insenstivines of the file system.
-L=.repo/local_manifest.xml
-if [[ ! -f $L ]]; then
-
-    cat > $L <<EOF
-<?xml version="1.0" encoding="UTF-8"?>
-<manifest>
-<remove-project name="platform/external/iptables" />
-</manifest>
-EOF
-fi
-
-# sync using the native ssh client if necessary
-[[ $URL != ${URL/ssh/} ]] && export GIT_SSH=ssh
-repo sync $@
-
-
-# These files cause trouble too, we need to ignore them
-(cd bionic;
-git update-index --assume-unchanged \
-    libc/kernel/common/linux/netfilter/xt_CONNMARK.h \
-    libc/kernel/common/linux/netfilter/xt_MARK.h \
-    libc/kernel/common/linux/netfilter_ipv6/ip6t_HL.h
-)
-(cd external/tcpdump;
-git update-index --assume-unchanged \
-    tests/print-X.new \
-    tests/print-XX.new
-)
-------------
-
-Simply extract this to a "my_sync.sh" file and try the following:
-  $ mkdir android_src
-  $ cd android_src
-  $ chmod +x mysync.sh
-  $ ./mysync.sh
-
-
--end-
-
-
-
-
diff --git a/docs/howto_build_SDK.txt b/docs/howto_build_SDK.txt
deleted file mode 100644
index e8228ba..0000000
--- a/docs/howto_build_SDK.txt
+++ /dev/null
@@ -1,235 +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.
-
-
-Subject: How to build an Android SDK & ADT Eclipse plugin.
-Date:    2009/03/27
-Updated: 2015/09/09
-
-
-Table of content:
-  0- License
-  1- Foreword
-  2- Building an SDK for MacOS and Linux
-  3- Building an SDK for Windows
-  4- Building an ADT plugin for Eclipse
-  5- Conclusion
-
-
-
-----------
-0- License
-----------
-
- 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.
-
-
-
------------
-1- Foreword
------------
-
-This document explains how to build the Android SDK and the ADT Eclipse plugin.
-
-It is designed for advanced users which are proficient with command-line
-operations and know how to setup the pre-required software.
-
-Basically it's not trivial yet when done right it's not that complicated.
-
-
-
---------------------------------------
-2- Building an SDK for MacOS and Linux
---------------------------------------
-
-First, setup your development environment and get the Android source code from
-git as explained here:
-
-  http://source.android.com/source/download.html
-
-For example for the cupcake branch:
-
-  $ mkdir ~/my-android-git
-  $ cd ~/my-android-git
-  $ repo init -u https://android.googlesource.com/platform/manifest -b master -g all,-notdefault,tools
-  $ repo sync
-
-Then once you have all the source, simply build the SDK using:
-
-  $ cd ~/my-android-git
-  $ . build/envsetup.sh
-  $ lunch sdk-eng
-  $ make sdk
-
-This will take a while, maybe between 20 minutes and several hours depending on
-your machine. After a while you'll see this in the output:
-
-  Package SDK: out/host/darwin-x86/sdk/android-sdk_eng.<build-id>_mac-x86.zip
-
-Some options:
-
-- Depending on your machine you can tell 'make' to build more things in
-  parallel, e.g. if you have a dual core, use "make -j4 sdk" to build faster.
-
-- You can define "BUILD_NUMBER" to control the build identifier that gets
-  incorporated in the resulting archive. The default is to use your username.
-  One suggestion is to include the date, e.g.:
-
-  $ export BUILD_NUMBER=${USER}-`date +%Y%m%d-%H%M%S`
-
-  There are certain characters you should avoid in the build number, typically
-  everything that might confuse 'make' or your shell. So for example avoid
-  punctuation and characters like $ & : / \ < > , and .
-
-
-
-------------------------------
-3- Building an SDK for Windows
-------------------------------
-
-Full Windows SDK builds are now only supported on Linux -- most of the
-framework is not designed to be built on Windows so technically the Windows
-SDK is build on top of a Linux SDK where a few binaries are replaced. So it
-cannot be built on Windows, and it cannot be built on Mac, only on Linux.
-
-I'll repeat this again because it's important:
-
-  To build the Android SDK for Windows, you need to use a *Linux* box.
-
-
-A- Pre-requisites
------------------
-
-Before you can even think of building the Android SDK for Windows, you need to
-perform the steps from section "2- Building an SDK for MacOS and Linux" above:
-setup and build a regular Linux SDK. Once this working, please continue here.
-
-Under Ubuntu, you will need the following extra packages:
-
-$ sudo apt-get install tofrodos
-
-tofrodos adds a unix2dos command
-
-
-B- Building
------------
-
-To build, perform the following steps:
-
-$ . build/envsetup.sh
-$ lunch sdk-eng
-$ make win_sdk
-
-Note that this will build both a Linux SDK then a Windows SDK.
-The result is located at
-   out/host/windows/sdk/android-sdk_eng.${USER}_windows/
-
-
-C- Building just the tools
---------------------------------------
-
-You can also build isolated windows tools directly on Linux without building
-the full SDK.
-
-To build, perform the following steps:
-
-  $ cd ~/my-android-git
-  $ . build/envsetup.sh
-  $ lunch sdk-eng
-  $ make winsdk-tools
-
-A specific tool can be built using:
-
-  $ make host_cross_adb
-
-Then the binaries are located at
-  out/host/windows-x86/bin/adb.exe
-
-
--------------------------------------
-4- Building an ADT plugin for Eclipse
--------------------------------------
-
-We've simplified the steps here.
-It used to be that you'd have to download a specific version of
-Eclipse and install it at a special location. That's not needed
-anymore.
-
-Instead you just change directories to your git repository and invoke the
-build script by giving it a destination directory and an optional build number:
-
-  $ mkdir ~/mysdk
-  $ cd ~/my-android-git   # <-- this is where you did your "repo sync"
-  $ sdk/eclipse/scripts/build_server.sh ~/mysdk $USER
-
-
-The first argument is the destination directory. It must be absolute. Do not
-give a relative destination directory such as "../mysdk" -- this would make the
-Eclipse build fail with a cryptic message:
-
-  BUILD SUCCESSFUL
-  Total time: 1 minute 5 seconds
-  **** Package in ../mysdk
-  Error: Build failed to produce ../mysdk/android-eclipse
-  Aborting
-
-The second argument is the build "number". The example used "$USER" but it
-really is a free identifier of your choice. It cannot contain spaces nor
-periods (dashes are ok.) If the build number is missing, a build timestamp will
-be used instead in the filename.
-
-The build should take something like 5-10 minutes.
-
-
-When the build succeeds, you'll see something like this at the end of the
-output:
-
-  ZIP of Update site available at ~/mysdk/android-eclipse-v200903272328.zip
-or
-  ZIP of Update site available at ~/mysdk/android-eclipse-<buildnumber>.zip
-
-When you load the plugin in Eclipse, its feature and plugin name will look like
-"com.android.ide.eclipse.adt_0.9.0.v200903272328-<buildnumber>.jar". The
-internal plugin ID is always composed of the package, the build timestamp and
-then your own build identifier (a.k.a. the "build number"), if provided. This
-means successive builds with the same build identifier are incremental and
-Eclipse will know how to update to more recent ones.
-
-
-
--------------
-5- Conclusion
--------------
-
-This completes the howto guide on building your own SDK and ADT plugin.
-Feedback is welcome on the public Android Open Source forums:
-  http://source.android.com/discuss
-
-If you are upgrading from a pre-cupcake to a cupcake or later SDK please read
-the accompanying document "howto_use_cupcake_sdk.txt".
-
--end-
-
diff --git a/docs/howto_use_cupcake_sdk.txt b/docs/howto_use_cupcake_sdk.txt
deleted file mode 100644
index 8107357..0000000
--- a/docs/howto_use_cupcake_sdk.txt
+++ /dev/null
@@ -1,371 +0,0 @@
-Subject: How to build use a Cupcake Android SDK & ADT Eclipse plugin.
-Date:    2009/03/27
-
-
-Table of content:
-  0- License
-  1- Foreword
-  2- Installation steps
-  3- For Eclipse users
-  4- For Ant users
-  5- Targets, AVDs, Emulator changes
-  6- Conclusion
-
-
-
-----------
-0- License
-----------
-
- 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.
-
-
-
------------
-1- Foreword
------------
-
-This explains how to use the "new" SDK provided starting with cupcake.
-The new SDK has as a different structure than the pre-cupcake ones.
-
-This means:
-- The new SDK does not work with older Eclipse plugins (ADT 0.8)
-- The old SDKs (1.0 and 1.1) do NOT work with this Eclipse plugin (ADT 0.9)
-
-
-
-----------------------
-2- Installation steps
-----------------------
-
-First you will need to grab the zip of the SDK for your platform or build it
-yourself. Please refer to the accompanying document "howto_build_SDK.txt" if
-needed.
-
-Unzip the SDK somewhere. We'll call that directory "SDK" in command-line
-examples.
-
-Grab the new ADT Eclipse plugin zip file or build it yourself. Keep it
-somewhere (no need to unzip).
-
-
-
---------------------
-3- For Eclipse users
---------------------
-
-
-Below we'll explain how you can upgrade your Eclipse install to the new plugin.
-If you already have a working Eclipse installation with a pre-0.9 ADT,
-another suggestion is to simply install a new copy of Eclipse and create a
-new empty workspace. This is just a precaution. The update process should
-be otherwise harmless.
-
-
-
-A- Setting up Eclipse
----------------------
-
-- You must have Eclipse 3.3 or 3.4. Eclipse 3.2 is not longer supported.
-
-  There are many flavors, or "editions", of Eclipse. To develop, we'd recommend
-  the "Java" edition. The "RCP" one is totally suitable too. The J2EE one is
-  probably overkill.
-
-
-- If updating an existing Eclipse, use Help > Software Update and please
-  uninstall the two features of the previous ADT: the "editors" feature and the
-  ADT feature itself.
-
-  => If you don't you will get a conflict on editors when installing
-     the new one.
-
-- Using Help > Software Update, add a new "archived site", point it to the new
-  adt.zip (e.g. android-eclipse-<some-id>.zip), select the "Install" button at
-  the top right and restart eclipse as needed.
-
-- After it restarts, please use Window > Preferences > Android and select
-  the new SDK folder that you unzipped in paragraph 2.
-
-
-
-B- Updating older projects
---------------------------
-
-If you have pre-0.9 projects in your Eclipse workspace, or if you import them
-from your code repository, these projects will fail to build at first.
-
-First right-click on the project and select "Properties":
-
-- In the properties, open the Android panel and select the platform to use.
-  The SDK comes with a 1.5 platform. Select it and close the properties panel.
-- Do a clean build.
-
-
-The new plugin creates a "gen" folder in your project where it puts the R.java
-and all automatically generated AIDL java files. If you get an error such as:
-
-  "The type R is already defined"
-
-that means you must check to see if your old R.java or your old auto-generated
-AIDL Java files are still present in the "src" folder. If yes, remove them.
-
-Note: this does not apply to your own hand-crafted parcelable AIDL java files.
-
-Note: if you want to reuse the project with an older Eclipse ADT install,
-      simply remove the "gen" folder from the build path of the project.
-
-
-C- New Wizards
---------------
-
-The "New Android Project" wizard has been expanded to use the multi-platform
-capabilities of the new SDK.
-
-There is now a "New XML File" wizard that lets you create skeleton XML resource
-files for your Android projects. This makes it easier to create a new layout, a
-new strings file, etc.
-
-Both wizard are available via File > New... as well as new icons in the main
-icon bar. If you do not see the new icons, you may need to use Window > Reset
-Perspective on your Java perspective.
-
-
-Please see step 5 "Emulator changes" below for important details on how to run
-the emulator.
-
-
-
-----------------
-4- For Ant users
-----------------
-
-
-A- build.xml has changed
-------------------------
-
-You must re-create your build.xml file.
-
-First if you had customized your build.xml, make a copy of it:
-
-  $ cd my-project
-  $ cp build.xml build.xml.old
-
-
-Then use the new "android" tool to create a new build.xml:
-
-  $ SDK/tools/android update project --path /path/to/my-project
-
-or
-
-  $ cd my-project
-  $ SDK/tools/android update project --path .
-
-
-A "gen" folder will be created the first time you build and your R.java and
-your AIDL Java files will be generated in this "gen" folder. You MUST remove
-the old R.java and old auto-generated AIDL java files manually. (Note: this
-does not apply to your own hand-crafted parcelabe AIDL java files.)
-
-
-B- Where is activitycreator?
-----------------------------
-
-Note that the "activitycreator" tool has been replaced by the new "android"
-tool too. Example of how to create a new Ant project:
-
-  $ SDK/tools/android create project --path /path/to/my/project --name ProjectName
-      --package com.mycompany.myapp --activity MyActivityClass
-      --target 1 --mode activity
-
-
-Please see paragraph 5 below for important details on how to run the emulator
-and the meaning of that "--target 1" parameter.
-
-
-
-----------------------------------
-5- Targets, AVDs, Emulator changes
-----------------------------------
-
-This applies to BOTH Eclipse and Ant users.
-
-One major change with the emulator is that now you must pre-create an "Android
-Virtual Device" (a.k.a "AVD") before you run the emulator.
-
-
-
-A- What is an AVD and why do I need one?
-----------------------------------------
-
-What is an "AVD"? If you forget, just run:
-
-  $ SDK/tools/emulator -help-virtual-device
-
-  An Android Virtual Device (AVD) models a single virtual device running the
-  Android platform that has, at least, its own kernel, system image and data
-  partition.
-
-There is a lot more explanation given by the emulator. Please run the help
-command given above to read the rest.
-
-The bottom line is that you can create many emulator configurations, or "AVDs",
-each with their own system image and most important each with their own user
-data and SD card data. Then you tell Eclipse or the emulator which one to use
-to debug or run your applications.
-
-
-Note for Eclipse users: eventually there will be a user interface to do all of
-these operations. For right now, please use the command line interface.
-
-
-B- Listing targets and AVDs
----------------------------
-
-There is a new tool called "android" in the SDK that lets you know which
-"target" and AVDs you can use.
-
-A target is a specific version of Android that you can use. By default the SDK
-comes with an "Android 1.5" target, codenamed "cupcake". In the future there
-will be more versions of Android to use, e.g. "Android 2.0" or specific add-ons
-provided by hardware manufacturers. When you want to run an emulator, you need
-to specify a given flavor of Android: this is the "target".
-
-
-To learn about available targets in your SDK, use this command:
-
-  $ SDK/tools/android list targets
-
-This will give you an output such as:
-
-  Available Android targets:
-  [1] Android 1.5
-       API level: 3
-       Skins: HVGA (default), HVGA-L, HVGA-P, QVGA-L, QVGA-P
-
-Note the "[1]". Later you will need to reference this as "--target 1" on the
-command line.
-
-
-Similarly you can list the available AVDs:
-
-  $ SDK/tools/android list avds
-
-Which might output something as:
-
-  Available Android Virtual Devices:
-      Name: my_avd
-      Path: C:\Users\<username>\.android\avd\my_avd.avd
-    Target: Android 1.5 (API level 3)
-      Skin: 320x480
-    Sdcard: 16M
-
-
-
-C- Creating an AVD
-------------------
-
-To create a configuration:
-
-  $ SDK/tools/android create avd --name my_avd_name --target 1
-
-
-where "target 1" is the index of a target listed by "android list targets".
-
-The AVD name is purely an identifier used to refer to the AVD later.
-Since it is used as directory name, please avoid using shell or path specific
-characters.
-
-To learn the various options available when creating an AVD, simply type:
-
-  $ SDK/tools/android create avd
-
-The android tool will automatically print an explanation of required arguments.
-
-
-
-D- Invoking an AVD from the command-line
-----------------------------------------
-
-To use this AVD in the emulator from the command-line, type:
-
-  $ SDK/tools/emulator @my_avd_name
-
-
-For more options, please consult the emulator help:
-
-  $ SDK/tools/emulator -help-virtual-device
-
-
-
-E- Invoking an AVD from Eclipse
--------------------------------
-
-By default Android projects in Eclipse have an "automatic target" mode.
-In this mode, when a project is deployed in debug or run, it checks:
-- If there's one running device or emulator, this is used for deployment.
-- If there's more than one running device or emulator, a "device chooser" is
-  shown to let the user select which one to use.
-- If there are no running devices or emulators, ADT looks at available AVDs.
-  If one matches the project configuration (e.g. same API level), it is
-  automatically used.
-
-Alternatively you can edit the "launch configuration" on your Android project
-in Eclipse by selecting the menu Run > Run Configurations. In the "target" tab
-of the configuration, you can choose:
-
-- Manual or automatic targetting mode.
-
-  - Manual means to always present the device chooser.
-  - Automatic is the behavior explained above.
-
-- In automatic mode, which AVD is preferred. If none is selected, the first
-  suitable is used.
-
-
-F- AVD concurrency
-------------------
-
-You can no longer run several emulators at the same time on the same
-configuration.
-
-Before this used to put the second or more emulators in a transient read-only
-mode that would not save user data.
-
-Now you just need to create as many AVDs as you want to run emulators.
-
-For example if you are working on a client/server application for Android, you
-could create a "client" AVD and a "server" AVD then run them both at once. The
-emulator window will show you the AVD name so that you know which one is which.
-
-Example:
-
-  $ SDK/tools/android create avd --name client --target 1 --sdcard 16M --skin HVGA
-  $ SDK/tools/android create avd --name server --target 1 --sdcard 32M --skin HVGA-P
-  $ SDK/tools/emulator @server &
-  $ SDK/tools/emulator @client &
-
-
-
--------------
-6- Conclusion
--------------
-
-This completes the howto guide on how to use the new Cupcake SDK.
-Feedback is welcome on the public Android Open Source forums:
-  http://source.android.com/community
-
--end-
-
diff --git a/dumpeventlog/.classpath b/dumpeventlog/.classpath
deleted file mode 100644
index b0326c8..0000000
--- a/dumpeventlog/.classpath
+++ /dev/null
@@ -1,7 +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 combineaccessrules="false" kind="src" path="/ddmlib"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/dumpeventlog/.gitignore b/dumpeventlog/.gitignore
deleted file mode 100644
index ba077a4..0000000
--- a/dumpeventlog/.gitignore
+++ /dev/null
@@ -1 +0,0 @@
-bin
diff --git a/dumpeventlog/.project b/dumpeventlog/.project
deleted file mode 100644
index c416f4f..0000000
--- a/dumpeventlog/.project
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>dumpeventlog</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/dumpeventlog/Android.bp b/dumpeventlog/Android.bp
deleted file mode 100644
index 618446f..0000000
--- a/dumpeventlog/Android.bp
+++ /dev/null
@@ -1,12 +0,0 @@
-// Copyright 2007 The Android Open Source Project
-//
-
-java_binary_host {
-    name: "dumpeventlog",
-
-    srcs: ["src/**/*.java"],
-
-    wrapper: "etc/dumpeventlog",
-    main_class: "com.android.dumpeventlog.DumpEventLog",
-    libs: ["ddmlib-prebuilt"],
-}
diff --git a/dumpeventlog/NOTICE b/dumpeventlog/NOTICE
deleted file mode 100644
index c5b1efa..0000000
--- a/dumpeventlog/NOTICE
+++ /dev/null
@@ -1,190 +0,0 @@
-
-   Copyright (c) 2005-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.
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
-
-
-                                 Apache License
-                           Version 2.0, January 2004
-                        http://www.apache.org/licenses/
-
-   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
-   1. Definitions.
-
-      "License" shall mean the terms and conditions for use, reproduction,
-      and distribution as defined by Sections 1 through 9 of this document.
-
-      "Licensor" shall mean the copyright owner or entity authorized by
-      the copyright owner that is granting the License.
-
-      "Legal Entity" shall mean the union of the acting entity and all
-      other entities that control, are controlled by, or are under common
-      control with that entity. For the purposes of this definition,
-      "control" means (i) the power, direct or indirect, to cause the
-      direction or management of such entity, whether by contract or
-      otherwise, or (ii) ownership of fifty percent (50%) or more of the
-      outstanding shares, or (iii) beneficial ownership of such entity.
-
-      "You" (or "Your") shall mean an individual or Legal Entity
-      exercising permissions granted by this License.
-
-      "Source" form shall mean the preferred form for making modifications,
-      including but not limited to software source code, documentation
-      source, and configuration files.
-
-      "Object" form shall mean any form resulting from mechanical
-      transformation or translation of a Source form, including but
-      not limited to compiled object code, generated documentation,
-      and conversions to other media types.
-
-      "Work" shall mean the work of authorship, whether in Source or
-      Object form, made available under the License, as indicated by a
-      copyright notice that is included in or attached to the work
-      (an example is provided in the Appendix below).
-
-      "Derivative Works" shall mean any work, whether in Source or Object
-      form, that is based on (or derived from) the Work and for which the
-      editorial revisions, annotations, elaborations, or other modifications
-      represent, as a whole, an original work of authorship. For the purposes
-      of this License, Derivative Works shall not include works that remain
-      separable from, or merely link (or bind by name) to the interfaces of,
-      the Work and Derivative Works thereof.
-
-      "Contribution" shall mean any work of authorship, including
-      the original version of the Work and any modifications or additions
-      to that Work or Derivative Works thereof, that is intentionally
-      submitted to Licensor for inclusion in the Work by the copyright owner
-      or by an individual or Legal Entity authorized to submit on behalf of
-      the copyright owner. For the purposes of this definition, "submitted"
-      means any form of electronic, verbal, or written communication sent
-      to the Licensor or its representatives, including but not limited to
-      communication on electronic mailing lists, source code control systems,
-      and issue tracking systems that are managed by, or on behalf of, the
-      Licensor for the purpose of discussing and improving the Work, but
-      excluding communication that is conspicuously marked or otherwise
-      designated in writing by the copyright owner as "Not a Contribution."
-
-      "Contributor" shall mean Licensor and any individual or Legal Entity
-      on behalf of whom a Contribution has been received by Licensor and
-      subsequently incorporated within the Work.
-
-   2. Grant of Copyright License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      copyright license to reproduce, prepare Derivative Works of,
-      publicly display, publicly perform, sublicense, and distribute the
-      Work and such Derivative Works in Source or Object form.
-
-   3. Grant of Patent License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      (except as stated in this section) patent license to make, have made,
-      use, offer to sell, sell, import, and otherwise transfer the Work,
-      where such license applies only to those patent claims licensable
-      by such Contributor that are necessarily infringed by their
-      Contribution(s) alone or by combination of their Contribution(s)
-      with the Work to which such Contribution(s) was submitted. If You
-      institute patent litigation against any entity (including a
-      cross-claim or counterclaim in a lawsuit) alleging that the Work
-      or a Contribution incorporated within the Work constitutes direct
-      or contributory patent infringement, then any patent licenses
-      granted to You under this License for that Work shall terminate
-      as of the date such litigation is filed.
-
-   4. Redistribution. You may reproduce and distribute copies of the
-      Work or Derivative Works thereof in any medium, with or without
-      modifications, and in Source or Object form, provided that You
-      meet the following conditions:
-
-      (a) You must give any other recipients of the Work or
-          Derivative Works a copy of this License; and
-
-      (b) You must cause any modified files to carry prominent notices
-          stating that You changed the files; and
-
-      (c) You must retain, in the Source form of any Derivative Works
-          that You distribute, all copyright, patent, trademark, and
-          attribution notices from the Source form of the Work,
-          excluding those notices that do not pertain to any part of
-          the Derivative Works; and
-
-      (d) If the Work includes a "NOTICE" text file as part of its
-          distribution, then any Derivative Works that You distribute must
-          include a readable copy of the attribution notices contained
-          within such NOTICE file, excluding those notices that do not
-          pertain to any part of the Derivative Works, in at least one
-          of the following places: within a NOTICE text file distributed
-          as part of the Derivative Works; within the Source form or
-          documentation, if provided along with the Derivative Works; or,
-          within a display generated by the Derivative Works, if and
-          wherever such third-party notices normally appear. The contents
-          of the NOTICE file are for informational purposes only and
-          do not modify the License. You may add Your own attribution
-          notices within Derivative Works that You distribute, alongside
-          or as an addendum to the NOTICE text from the Work, provided
-          that such additional attribution notices cannot be construed
-          as modifying the License.
-
-      You may add Your own copyright statement to Your modifications and
-      may provide additional or different license terms and conditions
-      for use, reproduction, or distribution of Your modifications, or
-      for any such Derivative Works as a whole, provided Your use,
-      reproduction, and distribution of the Work otherwise complies with
-      the conditions stated in this License.
-
-   5. Submission of Contributions. Unless You explicitly state otherwise,
-      any Contribution intentionally submitted for inclusion in the Work
-      by You to the Licensor shall be under the terms and conditions of
-      this License, without any additional terms or conditions.
-      Notwithstanding the above, nothing herein shall supersede or modify
-      the terms of any separate license agreement you may have executed
-      with Licensor regarding such Contributions.
-
-   6. Trademarks. This License does not grant permission to use the trade
-      names, trademarks, service marks, or product names of the Licensor,
-      except as required for reasonable and customary use in describing the
-      origin of the Work and reproducing the content of the NOTICE file.
-
-   7. Disclaimer of Warranty. Unless required by applicable law or
-      agreed to in writing, Licensor provides the Work (and each
-      Contributor provides its Contributions) on an "AS IS" BASIS,
-      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
-      implied, including, without limitation, any warranties or conditions
-      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
-      PARTICULAR PURPOSE. You are solely responsible for determining the
-      appropriateness of using or redistributing the Work and assume any
-      risks associated with Your exercise of permissions under this License.
-
-   8. Limitation of Liability. In no event and under no legal theory,
-      whether in tort (including negligence), contract, or otherwise,
-      unless required by applicable law (such as deliberate and grossly
-      negligent acts) or agreed to in writing, shall any Contributor be
-      liable to You for damages, including any direct, indirect, special,
-      incidental, or consequential damages of any character arising as a
-      result of this License or out of the use or inability to use the
-      Work (including but not limited to damages for loss of goodwill,
-      work stoppage, computer failure or malfunction, or any and all
-      other commercial damages or losses), even if such Contributor
-      has been advised of the possibility of such damages.
-
-   9. Accepting Warranty or Additional Liability. While redistributing
-      the Work or Derivative Works thereof, You may choose to offer,
-      and charge a fee for, acceptance of support, warranty, indemnity,
-      or other liability obligations and/or rights consistent with this
-      License. However, in accepting such obligations, You may act only
-      on Your own behalf and on Your sole responsibility, not on behalf
-      of any other Contributor, and only if You agree to indemnify,
-      defend, and hold each Contributor harmless for any liability
-      incurred by, or claims asserted against, such Contributor by reason
-      of your accepting any such warranty or additional liability.
-
-   END OF TERMS AND CONDITIONS
-
diff --git a/dumpeventlog/etc/dumpeventlog b/dumpeventlog/etc/dumpeventlog
deleted file mode 100755
index 56f8c22..0000000
--- a/dumpeventlog/etc/dumpeventlog
+++ /dev/null
@@ -1,81 +0,0 @@
-#!/bin/sh
-# Copyright 2005-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.
-
-# Set up prog to be the path of this script, including following symlinks,
-# and set up progdir to be the fully-qualified pathname of its directory.
-prog="$0"
-while [ -h "${prog}" ]; do
-    newProg=`/bin/ls -ld "${prog}"`
-    newProg=`expr "${newProg}" : ".* -> \(.*\)$"`
-    if expr "x${newProg}" : 'x/' >/dev/null; then
-        prog="${newProg}"
-    else
-        progdir=`dirname "${prog}"`
-        prog="${progdir}/${newProg}"
-    fi
-done
-oldwd=`pwd`
-progdir=`dirname "${prog}"`
-cd "${progdir}"
-progdir=`pwd`
-prog="${progdir}"/`basename "${prog}"`
-cd "${oldwd}"
-
-jarfile=dumpeventlog.jar
-frameworkdir="$progdir"
-libdir="$progdir"
-if [ ! -r "$frameworkdir/$jarfile" ]
-then
-    frameworkdir=`dirname "$progdir"`/tools/lib
-    libdir=`dirname "$progdir"`/tools/lib
-fi
-if [ ! -r "$frameworkdir/$jarfile" ]
-then
-    frameworkdir=`dirname "$progdir"`/framework
-    libdir=`dirname "$progdir"`/lib
-fi
-if [ ! -r "$frameworkdir/$jarfile" ]
-then
-    echo `basename "$prog"`": can't find $jarfile"
-    exit 1
-fi
-
-
-# Check args.
-if [ debug = "$1" ]; then
-    # add this in for debugging
-    java_debug=-agentlib:jdwp=transport=dt_socket,server=y,address=8050,suspend=y
-    shift 1
-else
-    java_debug=
-fi
-
-# Mac OS X needs an additional arg, or you get an "illegal thread" complaint.
-if [ `uname` = "Darwin" ]; then
-    os_opts="-XstartOnFirstThread"
-else
-    os_opts=
-fi
-
-if [ "$OSTYPE" = "cygwin" ] ; then
-    jarpath=`cygpath -w  "$frameworkdir/$jarfile"`
-    progdir=`cygpath -w  "$progdir"`
-else
-    jarpath="$frameworkdir/$jarfile"
-fi
-
-# need to use "java.ext.dirs" because "-jar" causes classpath to be ignored
-# might need more memory, e.g. -Xmx128M
-exec java -Xmx128M $os_opts $java_debug -Djava.ext.dirs="$frameworkdir" -Djava.library.path="$libdir" -jar "$jarpath" "$@"
diff --git a/dumpeventlog/src/com/android/dumpeventlog/DumpEventLog.java b/dumpeventlog/src/com/android/dumpeventlog/DumpEventLog.java
deleted file mode 100644
index 0669e33..0000000
--- a/dumpeventlog/src/com/android/dumpeventlog/DumpEventLog.java
+++ /dev/null
@@ -1,148 +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.dumpeventlog;
-
-import com.android.ddmlib.AdbCommandRejectedException;
-import com.android.ddmlib.AndroidDebugBridge;
-import com.android.ddmlib.IDevice;
-import com.android.ddmlib.Log;
-import com.android.ddmlib.TimeoutException;
-import com.android.ddmlib.Log.ILogOutput;
-import com.android.ddmlib.Log.LogLevel;
-import com.android.ddmlib.log.LogReceiver;
-import com.android.ddmlib.log.LogReceiver.ILogListener;
-import com.android.ddmlib.log.LogReceiver.LogEntry;
-
-import java.io.FileNotFoundException;
-import java.io.FileOutputStream;
-import java.io.IOException;
-
-/**
- * Connects to a device using ddmlib and dumps its event log as long as the device is connected.
- */
-public class DumpEventLog {
-
-    /**
-     * Custom {@link ILogListener} to receive and save the event log raw output.
-     */
-    private static class LogWriter implements ILogListener {
-        private FileOutputStream mOutputStream;
-        private LogReceiver mReceiver;
-
-        public LogWriter(String filePath) throws IOException {
-            mOutputStream = new FileOutputStream(filePath);
-        }
-
-        public void newData(byte[] data, int offset, int length) {
-            try {
-                mOutputStream.write(data, offset, length);
-            } catch (IOException e) {
-                if (mReceiver != null) {
-                    mReceiver.cancel();
-                }
-                System.out.println(e);
-            }
-        }
-
-        public void newEntry(LogEntry entry) {
-            // pass
-        }
-
-        public void setReceiver(LogReceiver receiver) {
-            mReceiver = receiver;
-        }
-
-        public void done() throws IOException {
-            mOutputStream.close();
-        }
-    }
-
-    public static void main(String[] args) {
-        if (args.length != 2) {
-            System.out.println("Usage: dumpeventlog <device s/n> <filepath>");
-            return;
-        }
-
-        // redirect the log output to /dev/null
-        Log.setLogOutput(new ILogOutput() {
-            public void printAndPromptLog(LogLevel logLevel, String tag, String message) {
-                // pass
-            }
-
-            public void printLog(LogLevel logLevel, String tag, String message) {
-                // pass
-            }
-        });
-
-        // init the lib
-        AndroidDebugBridge.init(false /* debugger support */);
-
-        try {
-            AndroidDebugBridge bridge = AndroidDebugBridge.createBridge();
-
-            // we can't just ask for the device list right away, as the internal thread getting
-            // them from ADB may not be done getting the first list.
-            // Since we don't really want getDevices() to be blocking, we wait here manually.
-            int count = 0;
-            while (bridge.hasInitialDeviceList() == false) {
-                try {
-                    Thread.sleep(100);
-                    count++;
-                } catch (InterruptedException e) {
-                    // pass
-                }
-
-                // let's not wait > 10 sec.
-                if (count > 100) {
-                    System.err.println("Timeout getting device list!");
-                    return;
-                }
-            }
-
-            // now get the devices
-            IDevice[] devices = bridge.getDevices();
-
-            for (IDevice device : devices) {
-                if (device.getSerialNumber().equals(args[0])) {
-                    try {
-                        grabLogFrom(device, args[1]);
-                    } catch (FileNotFoundException e) {
-                        e.printStackTrace();
-                    } catch (Exception e) {
-                        e.printStackTrace();
-                    }
-                    return;
-                }
-            }
-
-            System.err.println("Could not find " + args[0]);
-        } finally {
-            AndroidDebugBridge.terminate();
-        }
-    }
-
-    private static void grabLogFrom(IDevice device, String filePath) throws IOException,
-            TimeoutException, AdbCommandRejectedException {
-        LogWriter writer = new LogWriter(filePath);
-        LogReceiver receiver = new LogReceiver(writer);
-        writer.setReceiver(receiver);
-
-        device.runEventLogService(receiver);
-
-        writer.done();
-    }
-}
diff --git a/eclipse/.gitignore b/eclipse/.gitignore
deleted file mode 100644
index 78dbaee..0000000
--- a/eclipse/.gitignore
+++ /dev/null
@@ -1,3 +0,0 @@
-*.iml
-plugins/*/libs
-plugins/*/*.target
diff --git a/eclipse/artifacts/bundles/.project b/eclipse/artifacts/bundles/.project
deleted file mode 100644
index 9174087..0000000
--- a/eclipse/artifacts/bundles/.project
+++ /dev/null
@@ -1,11 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>tycho-bundles</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-	</buildSpec>
-	<natures>
-	</natures>
-</projectDescription>
diff --git a/eclipse/artifacts/bundles/monitor.product b/eclipse/artifacts/bundles/monitor.product
deleted file mode 100644
index c8c0f38..0000000
--- a/eclipse/artifacts/bundles/monitor.product
+++ /dev/null
@@ -1,61 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?pde version="3.5"?>
-
-<product name="monitor" uid="monitorproduct" id="com.android.ide.eclipse.monitor.product" application="com.android.ide.eclipse.monitor.Application" version="24.3.3.qualifier" useFeatures="true" includeLaunchers="true">
-
-
-   <configIni use="default">
-   </configIni>
-
-   <launcherArgs>
-      <programArgs>-data @noDefault</programArgs>
-      <vmArgs>-XX:MaxPermSize=256m
--Xms512m
--Xmx1024m</vmArgs>
-      <vmArgsMac>-XstartOnFirstThread -Dorg.eclipse.swt.internal.carbon.smallFonts</vmArgsMac>
-   </launcherArgs>
-
-   <windowImages/>
-
-   <splash
-      location="com.android.ide.eclipse.monitor" />
-   <launcher name="monitor">
-      <solaris/>
-      <win useIco="false">
-         <bmp/>
-      </win>
-   </launcher>
-
-
-   <vm>
-   </vm>
-
-
-   <plugins>
-   </plugins>
-
-   <features>
-      <feature id="com.android.ide.eclipse.ddms.feature"/>
-      <feature id="com.android.ide.eclipse.gldebugger.feature"/>
-      <feature id="com.android.ide.eclipse.hierarchyviewer.feature"/>
-      <feature id="com.android.ide.eclipse.traceview.feature"/>
-      <feature id="com.android.ide.eclipse.monitor.feature"/>
-      <feature id="org.eclipse.rcp"/>
-      <feature id="org.eclipse.emf.ecore"/>
-      <feature id="org.eclipse.e4.rcp"/>
-      <feature id="org.eclipse.emf.common"/>
-      <feature id="org.eclipse.platform"/>
-      <feature id="org.eclipse.equinox.p2.core.feature"/>
-      <feature id="org.eclipse.help"/>
-      <feature id="org.eclipse.equinox.p2.rcp.feature"/>
-      <feature id="org.eclipse.equinox.p2.extras.feature"/>
-      <feature id="org.eclipse.equinox.p2.user.ui"/>
-   </features>
-
-   <configurations>
-      <plugin id="org.eclipse.core.runtime" autoStart="true" startLevel="2" />
-      <plugin id="org.eclipse.equinox.common" autoStart="true" startLevel="2" />
-      <plugin id="org.eclipse.equinox.ds" autoStart="true" startLevel="2" />
-   </configurations>
-
-</product>
diff --git a/eclipse/artifacts/bundles/pom.xml b/eclipse/artifacts/bundles/pom.xml
deleted file mode 100644
index 3e8df67..0000000
--- a/eclipse/artifacts/bundles/pom.xml
+++ /dev/null
@@ -1,58 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-    <modelVersion>4.0.0</modelVersion>
-
-    <version>24.3.3-SNAPSHOT</version>
-    <artifactId>bundles</artifactId>
-    <packaging>eclipse-repository</packaging>
-    <name>bundles</name>
-
-    <parent>
-        <relativePath>../../pom.xml</relativePath>
-        <groupId>adt.group</groupId>
-        <artifactId>parent</artifactId>
-        <version>1.0.0-SNAPSHOT</version>
-    </parent>
-
-    <build>
-        <plugins>
-            <plugin>
-                <groupId>org.eclipse.tycho</groupId>
-                <artifactId>tycho-p2-director-plugin</artifactId>
-                <version>${tycho-version}</version>
-                <executions>
-                    <!-- install the product for all configured os/ws/arch environments
-                    using p2 director -->
-                    <execution>
-                        <id>materialize-products</id>
-                        <goals>
-                            <goal>materialize-products</goal>
-                        </goals>
-                    </execution>
-                    <!-- create product zips (one per os/ws/arch) -->
-                    <execution>
-                        <id>archive-products</id>
-                        <goals>
-                            <goal>archive-products</goal>
-                        </goals>
-                    </execution>
-                </executions>
-                <configuration>
-                    <formats>
-                        <win32>zip</win32>
-                        <linux>zip</linux>
-                        <macosx>zip</macosx>
-                    </formats>
-                    <products>
-                        <product>
-                            <id>monitorproduct</id>
-                            <attachId>com.android.ide.eclipse.monitor.product</attachId>
-                            <rootFolder>monitor</rootFolder>
-                        </product>
-                    </products>
-                </configuration>
-            </plugin>
-        </plugins>
-    </build>
-</project>
diff --git a/eclipse/build.gradle b/eclipse/build.gradle
deleted file mode 100644
index 5624821..0000000
--- a/eclipse/build.gradle
+++ /dev/null
@@ -1,205 +0,0 @@
-// Script used to build ADT plugins, IDE and monitor
-// There are 2 major tasks done by this plugin:
-//    copydeps: copies tools/base, tools/swt and prebuilt jars into plugins' libs folder
-//    buildEclipse: builds Eclipse by running Tycho from the commandline
-//
-// Usage: $ ANDROID_SRC/tools/gradlew -i -b /path/to/this/build.gradle copydeps|buildEclipse
-
-// get tools/base version
-apply from: "../../tools/buildSrc/base/version.gradle"
-
-ext.outPath = System.env.OUT_DIR
-if (outPath != null) {
-    ext.outFile = new File(outPath)
-} else {
-    outPath = '../../out'
-    ext.outFile = new File(projectDir, outPath)
-}
-
-repositories {
-    maven { url '../../prebuilts/tools/common/m2/repository' }
-    maven { url outPath + '/repo' }
-}
-
-ext {
-    // list of plugins whose manifest should be examined to identify dependencies
-    adtPlugins = new File(projectDir, 'plugins').listFiles().findAll { it.name.startsWith("com.android") }
-
-    //
-    def eclipseBuildDeps = new File(projectDir, "../../prebuilts/eclipse-build-deps").getCanonicalFile()
-    targetComponents = [
-            "platform": new File(eclipseBuildDeps, "platform/org.eclipse.platform-4.2.2.zip"),
-            "cdt"     : new File(eclipseBuildDeps, "cdt/cdt-master-8.0.2.zip"),
-            "emf"     : new File(eclipseBuildDeps, "emf/emf-xsd-Update-2.9.1.zip"),
-            "jdt"     : new File(eclipseBuildDeps, "jdt/org.eclipse.jdt.source-4.2.2.zip"),
-            "wtp"     : new File(eclipseBuildDeps, "wtp/wtp-repo-R-3.3.2-20120210195245.zip"),
-            "gef"     : new File(eclipseBuildDeps, "gef/GEF-Update-3.9.1.zip"),
-            "pde"     : new File(eclipseBuildDeps, "pde/org.eclipse.pde-3.8.zip"),
-            "egit"    : new File(eclipseBuildDeps, "egit/org.eclipse.egit.repository-2.2.0.201212191850-r.zip"),
-    ]
-
-    buildNumber = System.getenv("BUILD_NUMBER")
-    if (buildNumber == null) {
-        buildNumber = "SNAPSHOT"
-    }
-}
-
-// a mapping from the library names as used inside the plugin's MANIFEST.MF to the Maven artifact id
-def artifacts = [
-        // tools/base and tools/swt dependencies
-        'manifest-merger'     : "com.android.tools.build:manifest-merger:$ext.baseVersion",
-        'ddmlib'              : "com.android.tools.ddms:ddmlib:$ext.baseVersion",
-        'ddmuilib'            : "com.android.tools.ddms:ddmuilib:$ext.baseVersion",
-        'layoutlib-api'       : "com.android.tools.layoutlib:layoutlib-api:$ext.baseVersion",
-        'lint-api'            : "com.android.tools.lint:lint-api:$ext.baseVersion",
-        'lint-checks'         : "com.android.tools.lint:lint-checks:$ext.baseVersion",
-        'asset-studio'        : "com.android.tools:asset-studio:$ext.baseVersion",
-        'annotations'         : "com.android.tools:annotations:$ext.baseVersion",
-        'common'              : "com.android.tools:common:$ext.baseVersion",
-        'dvlib'               : "com.android.tools:dvlib:$ext.baseVersion",
-        'hierarchyviewer2lib' : "com.android.tools:hierarchyviewer2lib:$ext.baseVersion",
-        'ninepatch'           : "com.android.tools:ninepatch:$ext.baseVersion",
-        'rule-api'            : "com.android.tools:rule-api:$ext.baseVersion",
-        'sdk-common'          : "com.android.tools:sdk-common:$ext.baseVersion",
-        'sdklib'              : "com.android.tools:sdklib:$ext.baseVersion",
-        'sdkstats'            : "com.android.tools:sdkstats:$ext.baseVersion",
-        'sdkuilib'            : "com.android.tools:sdkuilib:$ext.baseVersion",
-        'swtmenubar'          : "com.android.tools:swtmenubar:$ext.baseVersion",
-        'testutils'           : "com.android.tools:testutils:$ext.baseVersion",
-        'traceview'           : "com.android.tools:traceview:$ext.baseVersion",
-        'uiautomatorviewer'   : "com.android.tools:uiautomatorviewer:$ext.baseVersion",
-
-        // prebuilts
-        'ant-glob'                         : 'com.android.tools.external:ant-glob:1.0',
-        'asm-5.0.3'                        : 'org.ow2.asm:asm:5.0.3',
-        'asm-analysis-5.0.3'               : 'org.ow2.asm:asm-analysis:5.0.3',
-        'asm-tree-5.0.3'                   : 'org.ow2.asm:asm-tree:5.0.3',
-        'commons-codec-1.4'                : 'commons-codec:commons-codec:1.4',
-        'commons-compress-1.0'             : 'org.apache.commons:commons-compress:1.8.1',
-        'commons-logging-1.1.1'            : 'commons-logging:commons-logging:1.1.1',
-        'easymock'                         : 'org.easymock:easymock:3.3',
-        'freemarker-2.3.20'                : 'org.freemarker:freemarker:2.3.20',
-        'guava-17.0'                       : 'com.google.guava:guava:17.0',
-        'host-libprotobuf-java-2.3.0-lite' : 'com.android.tools.external:libprotobuf-java-lite:2.3.0',
-        'httpclient-4.1.1'                 : 'org.apache.httpcomponents:httpclient:4.1.1',
-        'httpcore-4.1'                     : 'org.apache.httpcomponents:httpcore:4.1',
-        'httpmime-4.1'                     : 'org.apache.httpcomponents:httpmime:4.1',
-        'jcommon-1.0.12'                   : 'jfree:jcommon:1.0.12',
-        'jfreechart-1.0.9'                 : 'jfree:jfreechart:1.0.9',
-        'jfreechart-swt-1.0.9'             : 'jfree:jfreechart-swt:1.0.9',
-        'kxml2-2.3.0'                      : 'net.sf.kxml:kxml2:2.3.0',
-        'liblzf-1.0'                       : 'com.android.tools.external:liblzf:1.0',
-        'lombok-ast-0.2.3'                 : 'com.android.tools.external.lombok:lombok-ast:0.2.3',
-        'propertysheet'                    : 'com.android.tools.external:propertysheet:1.0',
-]
-
-configurations {
-    compile
-}
-
-dependencies {
-    compile artifacts.values()
-}
-
-task copydeps << {
-    // get the resolved dependencies from the compile configuration
-    def resolvedDependencies = configurations.compile.resolvedConfiguration.firstLevelModuleDependencies
-
-    // generate a map from "xy.jar" -> "/path/to/xy-1.0.jar"
-    def artifactMap = [:]
-    resolvedDependencies.each { dependency ->
-        def dependencyId = dependency.getName()
-        def artifactName = artifacts.find{ it.value == dependencyId}?.key
-
-        // get the jar file corresponding to the dependency
-        def artifact = getArtifact(dependency)
-        artifactMap.put(artifactName + ".jar", artifact)
-    }
-
-    project.adtPlugins.each { File pluginFile ->
-        def manifestDeps = getManifestDependencies(new File(pluginFile, "META-INF/MANIFEST.MF"))
-        logger.info("Dependencies for " + pluginFile.toString() + ": " + manifestDeps.join(","))
-
-        File dest = new File(pluginFile, "libs")
-        if (!manifestDeps.isEmpty() && !dest.isDirectory()) {
-            dest.mkdirs()
-        }
-
-        manifestDeps.each {
-            if (!artifactMap.containsKey(it)) {
-                throw new RuntimeException("No resolved artifact for: " + it + ", required for: "
-                        + pluginFile.getPath())
-            }
-
-            String destName = artifactMap.get(it)
-            logger.info("\tCopying " + destName + " to " + dest)
-            ant.copy(file: destName, tofile: new File(dest, it))
-        }
-    }
-}
-
-// unzip eclipse prebuilts into the out folder to create a target platform for the build
-task unzipTargetPlatform << {
-    File targetDir = new File(outFile, "/host/maven/target").getCanonicalFile()
-    targetDir.mkdirs()
-
-    project.targetComponents.each { String k, File v ->
-        File d = new File(targetDir, k)
-        logger.info("Unzipping " + v.getPath() + " into: " + d.getPath())
-        ant.unzip(src: v, dest: d)
-    }
-}
-
-task buildEclipse(type: Exec, dependsOn: unzipTargetPlatform) {
-    def maven = new File(projectDir, "../../prebuilts/eclipse/maven/apache-maven-3.2.1/bin/mvn").getCanonicalFile()
-    def androidOut = outFile.getCanonicalPath()
-    environment("M2_HOME", maven.getParentFile().getParentFile().getCanonicalPath())
-    workingDir projectDir
-    commandLine maven.getCanonicalPath(), "-s", "settings.xml", "-DforceContextQualifier=$project.buildNumber", "-DANDROID_OUT=$androidOut", "package"
-}
-
-private File getArtifact(ResolvedDependency dependency) {
-    if (dependency.moduleArtifacts.size() != 1) {
-        String msg = String.format("Each dependency is expected to map to a single jar file, " +
-                "but %s maps to the following artifacts: %s",
-                dependency,
-                dependency.moduleArtifacts.collect { it.file })
-        throw new RuntimeException(msg);
-    }
-
-    return dependency.moduleArtifacts.iterator().next().file
-}
-
-// parse a plugin's manifest file and return the list of jar dependencies expected to be
-// bundled inside
-private List<String> getManifestDependencies(File manifest) {
-    if (manifest == null || !manifest.exists()) {
-        return []
-    }
-
-    def entries = []
-
-    def fis = new FileInputStream(manifest)
-    try {
-        java.util.jar.Manifest m = new java.util.jar.Manifest(fis)
-        def classPath = m.getMainAttributes().getValue("Bundle-ClassPath")
-        if (classPath == null) {
-            return []
-        }
-
-        classPath.split(',').each {
-            if (!it.equals(".")) {
-                if (!it.startsWith("libs/") || !it.endsWith(".jar")) {
-                    throw new RuntimeException(
-                            "Unexpected classpath entry: " + it + " in file: " + manifest)
-                }
-
-                entries.add(it.substring("libs/".length()))
-            }
-        }
-    } finally {
-        fis.close()
-    }
-
-    return entries
-}
diff --git a/eclipse/buildConfig/allElements.xml b/eclipse/buildConfig/allElements.xml
deleted file mode 100644
index b3b5c4e..0000000
--- a/eclipse/buildConfig/allElements.xml
+++ /dev/null
@@ -1,112 +0,0 @@
-<!-- ========================================================================= -->
-<!-- Feature build ant targets                                                 -->
-<!-- Template obtained from org.eclipse.pde.build/templates/headless-build     -->
-<!-- ========================================================================= -->
-<project name="allElements Delegator">
-
-     <!-- ===================================================================== -->
-     <!-- Run a given ${target} on all elements being built                     -->
-     <!-- Replace element.id with the id of the top level element being built.    -->
-     <!-- If element.id does not exist in ${buildDirectory}/features/element.id   -->
-     <!-- or ${baseLocation}/features/element.id, then you must provide the       -->
-     <!-- location by setting the property "pluginPath"                           -->
-     <!-- Add on <ant> task for each top level element being built.             -->
-     <!-- ===================================================================== -->
-     <target name="allElementsDelegator">
-
-         <ant antfile="${genericTargets}" target="${target}">
-             <property name="type" value="feature" />
-             <property name="id" value="com.android.ide.eclipse.ddms" />
-         </ant>
-
-         <ant antfile="${genericTargets}" target="${target}">
-             <property name="type" value="feature" />
-             <property name="id" value="com.android.ide.eclipse.hierarchyviewer" />
-         </ant>
-
-         <ant antfile="${genericTargets}" target="${target}">
-             <property name="type" value="feature" />
-             <property name="id" value="com.android.ide.eclipse.adt" />
-         </ant>
-
-         <ant antfile="${genericTargets}" target="${target}">
-             <property name="type" value="feature" />
-             <property name="id" value="com.android.ide.eclipse.ndk" />
-         </ant>
-
-         <ant antfile="${genericTargets}" target="${target}">
-             <property name="type" value="feature" />
-             <property name="id" value="com.android.ide.eclipse.traceview" />
-         </ant>
-
-        <ant antfile="${genericTargets}" target="${target}">
-            <property name="type" value="feature" />
-            <property name="id" value="com.android.ide.eclipse.gldebugger" />
-        </ant>
-
-         <antcall target="buildInternalFeatures"/>
-     </target>
-
-     <!-- ===================================================================== -->
-     <!-- Conditional target for building the internal features                 -->
-     <!-- Builds if property internalSite is set                                -->
-     <!-- ===================================================================== -->
-     <target name="buildInternalFeatures" if="internalSite">
-        <ant antfile="${genericTargets}" target="${target}">
-            <property name="type" value="feature" />
-            <property name="id" value="com.android.ide.eclipse.tests" />
-        </ant>
-
-        <ant antfile="${genericTargets}" target="${target}">
-            <property name="type" value="feature" />
-            <property name="id" value="com.android.ide.eclipse.pdt" />
-        </ant>
-     </target>
-
-     <!-- ===================================================================== -->
-     <!-- Targets to assemble the built elements for particular configurations  -->
-     <!-- These generally call the generated assemble scripts (named in         -->
-     <!-- ${assembleScriptName}) but may also add pre and post processing       -->
-     <!-- Add one target for each root element and each configuration           -->
-     <!-- Replace element.id with the id of the top level element being built   -->
-     <!-- ===================================================================== -->
-     <target name="assemble.com.android.ide.eclipse.base">
-         <ant antfile="${assembleScriptName}" dir="${buildDirectory}"/>
-     </target>
-
-     <target name="assemble.com.android.ide.eclipse.adt">
-         <ant antfile="${assembleScriptName}" dir="${buildDirectory}"/>
-     </target>
-
-     <target name="assemble.com.android.ide.eclipse.adt.overlay">
-         <ant antfile="${assembleScriptName}" dir="${buildDirectory}"/>
-     </target>
-
-     <target name="assemble.com.android.ide.eclipse.ndk">
-         <ant antfile="${assembleScriptName}" dir="${buildDirectory}"/>
-     </target>
-
-     <target name="assemble.com.android.ide.eclipse.ddms">
-         <ant antfile="${assembleScriptName}" dir="${buildDirectory}"/>
-     </target>
-
-    <target name="assemble.com.android.ide.eclipse.tests">
-        <ant antfile="${assembleScriptName}" dir="${buildDirectory}"/>
-    </target>
-
-    <target name="assemble.com.android.ide.eclipse.hierarchyviewer">
-        <ant antfile="${assembleScriptName}" dir="${buildDirectory}"/>
-    </target>
-
-    <target name="assemble.com.android.ide.eclipse.pdt">
-        <ant antfile="${assembleScriptName}" dir="${buildDirectory}"/>
-    </target>
-
-    <target name="assemble.com.android.ide.eclipse.traceview">
-        <ant antfile="${assembleScriptName}" dir="${buildDirectory}"/>
-    </target>
-
-    <target name="assemble.com.android.ide.eclipse.gldebugger">
-        <ant antfile="${assembleScriptName}" dir="${buildDirectory}"/>
-    </target>
-</project>
diff --git a/eclipse/buildConfig/build.properties b/eclipse/buildConfig/build.properties
deleted file mode 100644
index 4c1d471..0000000
--- a/eclipse/buildConfig/build.properties
+++ /dev/null
@@ -1,239 +0,0 @@
-###############################################################################
-# Copyright (c) 2003, 2006 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-
-
-# This file was generated per the instructions located in Eclipse Help>Plug-in Development
-# Environment >  Guide > Tasks > Building features and customized for building the
-# Android Eclipse plugins.
-
-#####################
-# Parameters describing how and where to execute the build.
-# Typical users need only update the following properties:
-#    baseLocation - where things you are building against are installed
-#    bootclasspath - The base jars to compile against (typicaly rt.jar)
-#    configs - the list of {os, ws, arch} configurations to build.  
-#
-# Of course any of the settings here can be overridden by spec'ing 
-# them on the command line (e.g., -DbaseLocation=d:/eclipse
-
-############# PRODUCT/PACKAGING CONTROL #############
-product=/plugin or feature id/path/to/.product
-runPackager=true
-
-#Set the name of the archive that will result from the product build.
-#archiveNamePrefix=
-
-# The prefix that will be used in the generated archive.
-# override default of "eclipse" to aid for external site generation 
-archivePrefix=android-eclipse
-
-# The location underwhich all of the build output will be collected.
-collectingFolder=${archivePrefix}
-
-# The list of {os, ws, arch} configurations to build.  This 
-# value is a '&' separated list of ',' separate triples.  For example, 
-#     configs=win32,win32,x86 & linux,motif,x86
-# By default the value is *,*,*
-configs = *, *, *
-#configs=win32, win32, x86 & \
-#	linux, gtk, ppc &\
-# linux, gtk, x86 & \
-#	linux, gtk, x86_64 & \
-#	linux, motif, x86 & \
-#	solaris, motif, sparc & \
-#	solaris, gtk, sparc & \
-#	aix, motif, ppc & \
-#	hpux, motif, PA_RISC & \
-#	macosx, carbon, ppc
-
-# By default PDE creates one archive (result) per entry listed in the configs property.
-# Setting this value to try will cause PDE to only create one output containing all 
-# artifacts for all the platforms listed in the configs property.
-#groupConfigurations=true
-
-#The format of the archive. By default a zip is created using antZip.
-#The list can only contain the configuration for which the desired format is different than zip.
-#archivesFormat=win32, win32, x86 - antZip& \
-#	linux, gtk, ppc - antZip &\
-#    linux, gtk, x86 - antZip& \
-#	linux, gtk, x86_64 - antZip& \
-# linux, motif, x86 - antZip& \
-#	solaris, motif, sparc - antZip& \
-#	solaris, gtk, sparc - antZip& \
-#	aix, motif, ppc - antZip& \
-#	hpux, motif, PA_RISC - antZip& \
-#	macosx, carbon, ppc - antZip
-	
-#Set to true if you want the output to be ready for an update jar (no site.xml generated)
-outputUpdateJars = true
-
-#Set to true for Jnlp generation
-#codebase should be a URL that will be used as the root of all relative URLs in the output.
-#generateJnlp=false
-#jnlp.codebase=<codebase url>
-#jnlp.j2se=<j2se version>
-#jnlp.locale=<a locale>
-#jnlp.generateOfflineAllowed=true or false generate <offlineAllowed/> attribute in the generated features
-#jnlp.configs=${configs}			#uncomment to filter the content of the generated jnlp files based on the configuration being built
-
-#Set to true if you want to sign jars
-#signJars=false
-#sign.alias=<alias>
-#sign.keystore=<keystore location>
-#sign.storepass=<keystore password>
-
-#Arguments to send to the zip executable
-zipargs=
-
-#Arguments to send to the tar executable
-tarargs=
-
-#Control the creation of a file containing the version included in each configuration - on by default 
-#generateVersionsLists=false
-
-############## BUILD NAMING CONTROL ################
-# The directory into which the build elements are fetched and where
-# the build takes place.
-buildDirectory=.
-
-# Type of build.  Used in naming the build output.  Typically this value is
-# one of I, N, M, S, ...
-buildType=build
-
-# ID of the build.  Used in naming the build output.
-# forceContextQualifer = build label
-buildId=${forceContextQualifier}
-
-# Label for the build.  Used in naming the build output
-buildLabel=${buildId}
-
-# Timestamp for the build.  Used in naming the build output
-timestamp=007
-
-#The value to be used for the qualifier of a plugin or feature when you want to override the value computed by pde.
-#The value will only be applied to plugin or features indicating build.properties, qualifier = context 
-#forceContextQualifier=<the value for the qualifier>
-
-#Enable / disable the generation of a suffix for the features that use .qualifier. 
-#The generated suffix is computed according to the content of the feature   
-#generateFeatureVersionSuffix=true
-
-############# BASE CONTROL #############
-# Settings for the base Eclipse components and Java class libraries 
-# against which you are building.
-# Base location for anything the build needs to compile against.  For example,
-# in most RCP app or a plug-in,  the baseLocation should be the location of a previously
-# installed Eclipse against which the application or plug-in code will be compiled and the RCP delta pack.
-
-baseLocation=${ECLIPSE_HOME}
-#Os/Ws/Arch/nl of the eclipse specified by baseLocation
-# Note: These default values may be overridden by the build_plugins script
-baseos=linux
-basews=gtk
-basearch=x86
-
-#this property indicates whether you want the set of plug-ins and features to be considered during the build to be limited to the ones reachable from the features / plugins being built
-filteredDependencyCheck=false
-
-#this property indicates whether the resolution should be done in development mode (i.e. ignore multiple bundles with singletons)
-resolution.devMode=false
-
-#pluginPath is a list of locations in which to find plugins and features.  This list is separated by the platform file separator (; or :)
-#a location is one of:  
-#- the location of the jar or folder that is the plugin or feature : /path/to/foo.jar or /path/to/foo
-#- a directory that contains a /plugins or /features subdirectory
-#- the location of a feature.xml, or for 2.1 style plugins, the plugin.xml or fragment.xml
-#pluginPath=
-
-skipBase=true
-eclipseURL=<url for eclipse download site>
-eclipseBuildId=<Id of Eclipse build to get>
-eclipseBaseURL=${eclipseURL}/eclipse-platform-${eclipseBuildId}-win32.zip
-
-
-############# MAP FILE CONTROL ################
-# This section defines CVS tags to use when fetching the map files from the repository.
-# If you want to fetch the map file from repository / location, change the getMapFiles target in the customTargets.xml
-
-skipMaps=true
-mapsRepo=:pserver:anonymous@example.com/path/to/repo
-mapsRoot=path/to/maps
-mapsCheckoutTag=HEAD
-
-#tagMaps=true
-mapsTagTag=v${buildId}
-
-
-############ REPOSITORY CONTROL ###############
-# This section defines properties parameterizing the repositories where plugins, fragments
-# bundles and features are being obtained from. 
-
-# The tags to use when fetching elements to build.
-# By default thebuilder will use whatever is in the maps.  
-# This value takes the form of a comma separated list of repository identifier (like used in the map files) and the 
-# overriding value
-# For example fetchTag=CVS=HEAD, SVN=v20050101
-# fetchTag=HEAD
-skipFetch=true
-
-
-############# JAVA COMPILER OPTIONS ##############
-# The location of the Java jars to compile against.  Typically the rt.jar for your JDK/JRE
-#bootclasspath=${java.home}/lib/rt.jar
-
-# specific JRE locations to compile against. These values are used to compile bundles specifying a 
-# Bundle-RequiredExecutionEnvironment. Uncomment and set values for environments that you support
-#CDC-1.0/Foundation-1.0= /path/to/rt.jar
-#CDC-1.1/Foundation-1.1=
-#OSGi/Minimum-1.0=
-#OSGi/Minimum-1.1=
-#JRE-1.1=
-#J2SE-1.2=
-#J2SE-1.3=
-#J2SE-1.4=
-#J2SE-1.5=
-#JavaSE-1.6=
-#PersonalJava-1.1=
-#PersonalJava-1.2=
-#CDC-1.0/PersonalBasis-1.0=
-#CDC-1.0/PersonalJava-1.0=
-#CDC-1.1/PersonalBasis-1.1=
-#CDC-1.1/PersonalJava-1.1=
-
-# Specify the output format of the compiler log when eclipse jdt is used
-logExtension=.log
-
-# Whether or not to include debug info in the output jars
-javacDebugInfo=true
-
-# Whether or not to fail the build if there are compiler errors
-javacFailOnError=true
-
-# Enable or disable verbose mode of the compiler
-javacVerbose=true
-
-# Extra arguments for the compiler. These are specific to the java compiler being used.
-compilerArg=-warn:none
-
-# Default value for the version of the source code. This value is used when compiling plug-ins that do not set the Bundle-RequiredExecutionEnvironment or set javacSource in build.properties
-javacSource=1.6
-
-# Default value for the version of the byte code targeted. This value is used when compiling plug-ins that do not set the Bundle-RequiredExecutionEnvironment or set javacTarget in build.properties.
-javacTarget=1.6
-
-################### CUSTOM PROPERTIES #######################################
-# repository location for update site
-# comment out - this is passed in from command line 
-#updateSiteSource=${buildDirectory}/sites/external
-# where to place update site build
-updateSiteRoot=${user.home}/www/no_crawl/
-updateSiteFolder=${archivePrefix}
-updateSiteDestination=${updateSiteRoot}/${updateSiteFolder}
diff --git a/eclipse/buildConfig/buildUpdateSite.xml b/eclipse/buildConfig/buildUpdateSite.xml
deleted file mode 100644
index 1ab7c99..0000000
--- a/eclipse/buildConfig/buildUpdateSite.xml
+++ /dev/null
@@ -1,13 +0,0 @@
-<project name="update site">
-    <!-- ========================================================================= -->
-    <!-- Extracts feature zip for update site                                      -->
-    <!-- expected properties:                                                      -->
-    <!--    id - feature id to extract                                             -->
-    <!--    buildDirectory - base directgory where build takes place               -->
-    <!--    buildLabel - build id label                                            -->
-    <!--    updateSiteRoot - where to extract feature zip                          -->
-    <!-- ========================================================================= -->
-    <target name="extractFeature">
-        <unzip src="${buildDirectory}/${buildLabel}/${id}-${buildLabel}.zip" dest="${updateSiteRoot}"/>        
-    </target>
-</project>
diff --git a/eclipse/buildConfig/customTargets.xml b/eclipse/buildConfig/customTargets.xml
deleted file mode 100644
index 5a46bfc..0000000
--- a/eclipse/buildConfig/customTargets.xml
+++ /dev/null
@@ -1,195 +0,0 @@
-<!-- ========================================================================= -->
-<!-- Eclipse template file for PDE builds -->
-<!-- template originally obtained from org.eclipse.pde.build/templates/headless-build -->
-<!-- ========================================================================= -->
-<project name="Build specific targets and properties" default="noDefault">
-
-    <!-- ===================================================================== -->
-    <!-- Run a given ${target} on all elements being built -->
-    <!-- Add on <ant> task for each top level element being built. -->
-    <!-- ===================================================================== -->
-    <property name="allElementsFile" value="${builder}/allElements.xml"/>
-    <import file="${allElementsFile}" />
-    <target name="allElements">
-        <antcall target="allElementsDelegator" />
-    </target>
-    
-    <!-- ===================================================================== -->
-    <!-- ===================================================================== -->
-    <target name="getBaseComponents" depends="checkLocalBase" unless="skipBase">
-        <get src="${eclipseBaseURL}" dest="${buildDirectory}/../temp-base.zip" />
-        <unzip dest="${base}" overwrite="true" src="${buildDirectory}/../temp-base.zip" />
-    </target>
-
-    <target name="checkLocalBase">
-        <available file="${base}" property="skipBase" />
-    </target>
-
-    <!-- ===================================================================== -->
-    <!-- Check out map files from correct repository -->
-    <!-- Replace values for mapsCheckoutTag as desired. -->
-    <!-- ===================================================================== -->
-    <target name="getMapFiles" depends="checkLocalMaps" unless="skipMaps">
-        <property name="mapsCheckoutTag" value="HEAD" />
-        <cvs cvsRoot="${mapsRepo}" package="${mapsRoot}" dest="${buildDirectory}/maps" tag="${mapsCheckoutTag}" />
-    </target>
-
-    <target name="checkLocalMaps">
-        <available property="skipMaps" file="${buildDirectory}/maps" />
-    </target>
-
-    <target name="tagMapFiles" if="tagMaps">
-        <cvs dest="${buildDirectory}/maps/${mapsRoot}" command="tag ${mapsTagTag}" />
-    </target>
-
-    <!-- ===================================================================== -->
-
-    <target name="clean" unless="noclean">
-        <antcall target="allElements">
-            <param name="target" value="cleanElement" />
-        </antcall>
-    </target>
-
-    <target name="gatherLogs">
-        <mkdir dir="${buildDirectory}/${buildLabel}/compilelogs" />
-        <antcall target="allElements">
-            <param name="target" value="gatherLogs" />
-        </antcall>
-        <unzip dest="${buildDirectory}/${buildLabel}/compilelogs" overwrite="true">
-            <fileset dir="${buildDirectory}/features">
-                <include name="**/*.log.zip" />
-            </fileset>
-        </unzip>
-    </target>
-
-    <!-- ===================================================================== -->
-    <!-- Steps to do before setup -->
-    <!-- ===================================================================== -->
-    <target name="preSetup">
-    </target>
-
-    <!-- ===================================================================== -->
-    <!-- Steps to do after setup but before starting the build proper -->
-    <!-- ===================================================================== -->
-    <target name="postSetup">
-        <antcall target="getBaseComponents" />
-    </target>
-
-    <!-- ===================================================================== -->
-    <!-- Steps to do before fetching the build elements -->
-    <!-- ===================================================================== -->
-    <target name="preFetch">
-    </target>
-
-    <!-- ===================================================================== -->
-    <!-- Steps to do after fetching the build elements -->
-    <!-- ===================================================================== -->
-    <target name="postFetch">
-    </target>
-
-    <!-- ===================================================================== -->
-    <!-- Steps to do before generating the build scripts. -->
-    <!-- ===================================================================== -->
-    <target name="preGenerate">
-    </target>
-
-    <!-- ===================================================================== -->
-    <!-- Steps to do after generating the build scripts. -->
-    <!-- ===================================================================== -->
-    <target name="postGenerate">
-        <antcall target="clean" />
-    </target>
-
-    <!-- ===================================================================== -->
-    <!-- Steps to do before running the build.xmls for the elements being built. -->
-    <!-- ===================================================================== -->
-    <target name="preProcess">
-    </target>
-
-    <!-- ===================================================================== -->
-    <!-- Steps to do after running the build.xmls for the elements being built. -->
-    <!-- ===================================================================== -->
-    <target name="postProcess">
-    </target>
-
-    <!-- ===================================================================== -->
-    <!-- Steps to do before running assemble. -->
-    <!-- ===================================================================== -->
-    <target name="preAssemble">
-    </target>
-
-    <!-- ===================================================================== -->
-    <!-- Steps to do after  running assemble. -->
-    <!-- ===================================================================== -->
-    <target name="postAssemble">
-    </target>
-
-    <!-- ===================================================================== -->
-    <!-- Steps to do before running package. -->
-    <!-- ===================================================================== -->
-    <target name="prePackage">
-    </target>
-
-    <!-- ===================================================================== -->
-    <!-- Steps to do after  running package. -->
-    <!-- ===================================================================== -->
-    <target name="postPackage">
-    </target>
-
-    <!-- ===================================================================== -->
-    <!-- Steps to do after the build is done. -->
-    <!-- ===================================================================== -->
-    <target name="postBuild">
-        <antcall target="gatherLogs" />
-        <!-- Added this custom target ! -->
-        <antcall target="generateUpdateSite" />
-    </target>
-
-    <!-- ===================================================================== -->
-    <!-- Steps to do to test the build results -->
-    <!-- ===================================================================== -->
-    <target name="test">
-    </target>
-
-    <!-- ===================================================================== -->
-    <!-- Steps to do to publish the build results -->
-    <!-- ===================================================================== -->
-    <target name="publish">
-        
-    </target>
-
-    <!-- ===================================================================== -->
-    <!-- Default target                                                        -->
-    <!-- ===================================================================== -->
-    <target name="noDefault">
-        <echo message="You must specify a target when invoking this file" />
-    </target>
-    
-    <!-- ===================================================================== -->
-    <!-- Custom target:                                                        -->
-    <!-- Steps to do to generate the update site                               -->
-    <!-- ===================================================================== -->
-    <target name="generateUpdateSite">
-        <echo message="Copying update site source ${updateSiteSource} to destination"/>
-    	
-        <copy file="${updateSiteSource}/site.xml" overwrite="true" todir="${updateSiteDestination}"/>
-        <copy file="${updateSiteSource}/index.html" overwrite="true" todir="${updateSiteDestination}"/>
-        <copy file="${updateSiteSource}/web/site.css" overwrite="true" todir="${updateSiteDestination}/web"/>
-        <copy file="${updateSiteSource}/web/site.xsl" overwrite="true" todir="${updateSiteDestination}/web"/>
-        
-        <!-- replace qualifier version references with build label -->
-        <replace file="${updateSiteDestination}/site.xml" token="qualifier" value="${buildId}"/>
-        
-        <!-- now extract each features zip to update site -->
-        <antcall target="allElements">
-            <param name="genericTargets" value="${builder}/buildUpdateSite.xml"/>
-            <param name="target" value="extractFeature" />
-        </antcall>
-        
-        <chmod perm="755" type="both">
-            <fileset dir="${updateSiteDestination}">
-            </fileset>
-        </chmod>    
-    </target>
-
-</project>
diff --git a/eclipse/changes.txt b/eclipse/changes.txt
deleted file mode 100644
index aeec5cc..0000000
--- a/eclipse/changes.txt
+++ /dev/null
@@ -1,868 +0,0 @@
-21.0.0
-* Bug fixes.
-* JUnit test runner allows a test to be run on all devices
-* XML code completion can now complete (and show documentation for)
-  theme references, such as ?android:attr/dividerHeight
-* Improved flag and locale data in the configuration chooser
-* New lint checks:
-  * Find misspellings in English string files
-  * Detect certain types of wakelock mistakes leading to unnecessary
-    battery usage
-  * Find private key files placed in directories where they end up
-    getting bundled with the .apk
-  * Find usages of "dp" units with the font property textSize
-  * Find invalid selector files where a later state is fully covered
-    by an earlier state and is therefore unreachable
-  * Find incorrect use of the SecureRandom object (where it is
-    initialized with a fixed seed)
-  Various lint infrastructure improvements.
-
-20.0.0
-* A lot of bug fixes, performance fixes and memory fixes.
-* Support for Eclipse 4.x.
-* Build System
-  * Automatic merging of library project manifest files into the
-    including project's manifest. Enable with the
-    manifestmerger.enabled property.
-  * Automatic ProGuard support for the aapt -G flag. This means that
-    the build system will generate a temporary ProGuard keep-rules
-    file containing classes to keep that are referenced from XML files
-    (such as custom views) and pass this to ProGuard at
-    shrink-time. This can make the resulting APK much smaller when
-    using just a small portion of a large library project (such as the
-    Android Support library), since we have also removed the catch-all
-    rules to keep all custom views from the default ProGuard
-    configuration file.
-   * Aidl files from library projects are now in the import list.
-   * Fixes in Ant:
-     * Test projects now have access to the full classpath from the
-       tested projects, including Library Projects and 3rd party jar
-     * Applications embedding tests can now be deployed and tested,
-       including with code coverage, like test applications.
-* Lint
-  * Tighter integration with the layout editor (error and warning
-    icons overlaid views with errors, lint error messages shown as
-    tooltips in the layout canvas and in the outline, error count
-    displayed in the layout actions bar.)
-  * Lint is run incrementally in Java files on save, just like XML
-    files already are.
-  * New lint rules:
-  * Detect usages of Toast.makeText() without calling show() on the
-    result, as well as passing invalid duration parameters (e.g. a
-    number instead of one of the two allowed constants.)
-  * Detect incorrect manifest registrations (where elements such as
-    <uses-library>, <activity> etc are placed under the wrong parent.)
-  * Several security checks: Look for exported content providers
-    without required permissions, look for creation of world readable
-    files and preferences, look for calls to
-    android.webkit.WebSettings.setJavaScriptEnabled.
-  * Check to make sure that Fragment classes are instantiatable. If
-    you accidentally make a fragment innerclass non-static, or forget
-    to have a default constructor, you can hit runtime errors when the
-    system attempts to reinstantiate your fragment after a
-    configuration change.
-  * Look for handler leaks: This check makes sure that a handler inner
-    class does not hold an implicit reference to its outer class.
-  * Duplicate Activity registrations in the manifest. This can lead to
-    subtle errors that can be difficult to understand.
-  * Lint check ensuring that when you edit() a SharedPreference object
-    you call commit()
-* Layout Editor
-  * New property sheet implementation, which offers:
-    * Highlighting (in bold) for important attributes.
-    * Inline preview of colors and images, as well as the
-      corresponding resource name.
-    * Displays default values, when available.
-    * Completion of resource values and enum and flag constants.
-    * Support for showing and hiding "advanced" properties.
-    * Nested properties (and collapse all and expand all) for better
-      categorization. For example, layout params are listed first as a
-      single nested property.
-    * Tooltips over the attribute names, not values, so they never
-      obscure the value column.
-    * Checkbox support for boolean values.
-    * Support for switching between alphabetical and natural sort
-      orders.
-  * New window management. The propertysheet is now automatically
-    docked into the Outline view, and the outline can appear in a
-    maximized editor. The structure and palette views can be minimized
-    and appear temporarily on flyover.
-  * New configuration chooser above the layout editor, which in
-    addition to a visual refresh offers an activity chooser, a nested
-    theme chooser, a single button to flip orientation, better
-    wrapping behavior, etc.
-* SDK Manager:
-  * Cache to avoid downloading repository definitions all the time.
-  * New "Tools > Manage Add-on Sites" option that allows deactivating
-    3rd party sites (e.g. if one or more are temporarily slow to
-    load.)
-* NDK integration (alpha):
-  * Initial support for building and debugging projects with C/C++
-    code.
-  * To enable this, install the NDK feature (depends on CDT), and then
-    set the path to NDK in Android Preferences.
-  * Add NDK nature to an Android project by right clicking on the
-    project and select "Android Tools -> Add Native Support".
-  * To debug an NDK project, just right click and select "Debug As
-    Android Native Application".
-* Execution
-  * LogCat: Allow users to set colors for different priorities
-  * LogCat: Ctrl + F now brings up a Find dialog to find items (rather
-    than filter)
-  * Allow running on multiple devices with a single launch. The target
-    tab in the launch configuration dialog adds a new option which
-    allows launching on all connected devices, and a drop down allows
-    the user to further narrow down the list to just physical devices
-    or just emulators. (This applies only to Run configurations, not
-    to Debug/JUnit tests.)
-* XML Editing
-  * Code completion support for custom attributes on custom views.
-  * Go to Declaration now works for theme references (?android:attr,
-    ?attr: etc,)
-  * Completion of the minSdkVersion and targetSdkVersion attributes in
-    manifest files now include version descriptions for each of the
-    API levels
-  * Support XML editor outlines for layout files. Switching back and
-    forth between the text editor and graphical editor will alternate
-    between the two outlines, and in particular the XML editor outline
-    will keep up to date with edits in the editor, and selection will
-    follow the mouse cursor etc.
-* The Asset Studio Wizard now supports padding and disabling
-  background shapes
-
-19.0.0 (does not exist)
-
-18.0.0
-* Fix bug 27940 where exporting release package doesn't recompile libraries
-  in release mode.
-
-17.0.0:
-* ADT 17 requires Java 6 and Eclipse 3.6.2.
-* Improved Lint UI.
-   * Many new lint checks: See the tools changes.txt for details.
-   * New "Run Lint" toolbar action with a dropdown menu for selecting
-     specific (or all) projects, clearing results, etc.
-   * The results window is now organized as a tree rather than a flat
-     list. Each issue type has a single top level item, which makes it
-     easier to quickly scan through the reported issues and narrow
-     down to issues you are most interested in.
-   * The results window contains many new toolbar actions, including
-     expand/collapse, ignore in file, ignore in project, ignore
-     everywhere, show options, and configure columns.
-   * There are new columns available, such as category, priority,
-     project, file and line. The column selection (as well as the
-     column sizes) are persisted. You can click on columns to sort by
-     that column.
-   * The Lint Options dialog has Enable All and Disable All buttons,
-     and a search filter textbox to filter by issue id, summary and
-     severity.
-* New Quick Outline for XML editors (Ctrl-O, Command-O). This shows
-  the structure of the current file including icons and ids, and lets
-  you filter and quickly jump to specific ids.
-* The resource chooser now shows the resolved value for resources
-  (e.g. when selecting @string/hello it displays that the resolved value
-  is "Hello World"). It also allows editing the chosen value directly.
-* The layout editor no longer assigns default ids to layouts, includes
-  and merge tags. This tended to pollute the namespace with a lot of
-  unused resources since layouts aren't usually manipulated via code,
-  or referenced from XML. (The RelativeLayout editor automatically
-  assigns ids to views without ids when pointing to them.)
-* Export Screenshot from the Layout Editor
-* Layout editor fix for SlidingDrawer which on some platforms could
-  not be dragged into the layout. Also fix preview rendering for
-  SlidingDrawer and TabHost (issue 23022).
-* New default application icons, including an xhdpi version.
-* Important bug fixes:
-  * Fix bug in resource chooser which made some types of framework
-    resources impossible to select (issue 20589)
-  * Fix a bug in the formatter where a certain whitespace pattern
-    could result in a non-space character getting deleted (issue
-    23940)
-  * Fix locale bug affecting Turkish locales in particular (issue
-    23747)
-
-16.0.0:
-* New "lint" feature which scans the Android projects for potential
-  problems such as missing translations, duplicate ids between layouts
-  that include each other, using px instead of dp units, hardcoded
-  strings, missing contentDescriptions, obsolete Proguard
-  configuration files, etc. Lint can be run on the command line, but
-  it is also integrated into the Problems view in Eclipse, and there
-  are also quickfixes available for many of the reported errors.
-
-15.0.0
-Critical bug fixes only.
-
-14.0.0
-- Build system:
-  - (TODO: More info) Improved library projects
-  - Improved incremental builds
-    - Resource compilation is run much less frequently. It is no
-      longer run when strings are edited, or when layouts are edited
-      (unless a new id is introduced), and it is no longer run once
-      per library project (!)
-    - Resource compilation is no longer done for normal save
-      operations, only when running or debugging (option added in ADT
-      12 now on by default.)
-    - There is a new "PNG crunch cache", which means image crunching
-      is only done once, not once per build which is significant for
-      projects with many resources
-    - Incremental ant builds
-  - ADT now uses bin/classes to output the java compilation
-    and bin/ for Android specific classes. This will make bin show up
-    in the package explorer.
-- DDMS
-  - Brand new logcat view. Fixes bugs, displays and filters by
-    application names instead of just pids, fronts when application
-    runs.
-- XML Editing
-  - New XML formatter which formats all XML files according to the
-    standard Android coding style. The formatter can also reorder
-    attributes to follow the recommended order.
-  - Improved "smart indent": automatic indentation and un-indentation
-    when pressing Return in XML editors
-  - Go to Matching (Ctrl-Shift-P) in XML files can now jump between
-    opening and closing tags
-  - Changes made by the layout editor are automatically run through
-    the new XML formatter.
-  - Select Enclosing Element should now work on the Mac as well.
-- Java Editing
-  - Quickfix for extracting Strings when the caret is inside a String
-- Layout Editor
-  - New GridLayout support
-  - Tooltip feedback for resizing and dragging operations. For
-    example, when dragging in a relative layout, the proposed
-    constraints are shown, and when resizing the new dimensions are
-    shown.
-  - New "Remove Container" visual refactoring which removes the
-    children of a container up to the top level and transfers
-    namespace and layout attributes if necessary.
-  - Improved access to properties in the context menu: The most
-    frequently set attributes for each view are listed at the top of
-    the menu, and the properties menu offers access to the most
-    recently set attributes, attributes organized by their defining
-    view, and layout attributes only or all attributes alphabetically.
-  - The context menu now also contains pull-right menus for accessing
-    properties of the parents, which is useful when the children fully
-    cover the parent making it hard to select on its own.
-  - Ability to suppress rendering fidelity warnings.
-- Asset Studio integration: Wizard creation of launcher icons, menu
-    icons, tab icons, etc.
-- New Welcome Wizard to help installing and configuring the SDK
-  platforms.
-- The New Project and the New XML File wizards have been reworked into
-  multiple pages. Sample Projects are now copied into the workspace
-  such that they can be modified and deleted without affecting the
-  master copy.
-- The dependency on Eclipse GEF was removed.
-- Many bug fixes, and in particular some critical bug fixes on Linux
-
-13.0.0
-- Tools release only (command line tools)
-
-12.0.0 (July 6th, 2011)
-- Many bug fixes!
-- Visual Layout Editor:
-  - New RelativeLayout drop support with guideline suggestions for
-    attachments and cycle prevention.
-  - Resize support in most layouts. In LinearLayout, sizes are mapped
-    to weights. Guideline snapping to wrap_content and match_parent.
-  - Previews of drawables and colors in the resource chooser dialogs.
-  - Improved error messages and links for rendering errors, including
-    detection of misspellings of class names.
-- Build system: Delay post compiler phase until actual export or debug
-  to speed up interactive file saves. (This is off by default but can
-  be enabled in the ADT options panel.)
-
-11.0.0 (June 6th, 2011)
-- Visual Refactoring:
-  - The new "Extract Style" refactoring pulls out style constants and
-    defines them as style rules instead.
-  - The new "Wrap in Container" refactoring surrounds the selected
-    views with a new layout, and transfers namespace and layout
-    parameters to the new parent
-  - The new "Change Widget Type" refactoring changes the type of the
-    selected views to a new type. (Also, a new selection context menu
-    in the visual layout editor makes it easy to select siblings as
-    well as views anywhere in the layout that have the same type).
-  - The new "Change Layout" refactoring changes layouts from one type
-    to another, and can also flatten a layout hierarchy.
-  - The "Extract as Include" refactoring now finds identical fragments
-    in other layouts and offers to combine all into a single include.
-  - There is a new Refactoring Quick Assistant which can be invoked
-    from the XML editor (with Ctrl-1) to apply any of the above
-    refactorings (and Extract String) to the current selection.
-- Visual Layout Editor:
-  - Improved "rendering fidelity": The layout preview has been
-    improved and should more closely match the rendering on actual
-    devices.
-  - The visual editor now previews ListViews at designtime.  By
-    default, a two-line list item is shown, but with a context menu
-    you can pick any arbitrary layout to be used for the list items,
-    and you can also pick the header and footer layouts.
-  - The palette now supports "configurations" where a single view is
-    presented in various different configurations. For example, there
-    is a whole "Textfields" palette category where the EditText view
-    can be dragged in as a password field, an e-mail field, a phone
-    field, and so on. Similarly, TextViews are offered preconfigured
-    with large, normal and small theme sizes, and LinearLayouts are
-    offered both in horizontal and vertical configurations.
-  - The palette supports custom views, picking up any custom
-    implementations of the View class in your project source folders
-    or in included libraries, and these can be dragged into layouts.
-  - Fragments support: Fragments are available in the palette, and in
-    the tool you can choose which layout to show rendered for a given
-    fragment tag. Go to declaration works for fragment classes.
-  - The layout editor automatically applies a "zoom to fit" for newly
-    opened files as well as on device size and orientation changes to
-    ensure that large layouts are always fully visible unless you
-    manually zoom in.
-  - You can drop an "include" tag from the palette, which will pop up
-    a layout chooser, and the chosen layout is added as an include.
-    Similarly, dropping images or image buttons will pop up image
-    resource choosers to initialize the new image with.
-  - The configuration chooser now applies the "Render Target" and
-    "Locale" settings project wide, making it trivial to check the
-    layouts for different languages or render targets without having
-    to configure these individually for each layout.
-  - The layout editor is smarter about picking a default theme to
-    render a layout with, consulting factors like theme registrations
-    in the manifest, the SDK version, etc.
-  - The layout editor is also smarter about picking a default
-    configuration to render a layout with, defaulting to the currently
-    visible configuration in the previous file. It also considers the
-    SDK target to determine whether to default to a tablet or phone
-    screen size.
-  - Basic focus support: The first text field dropped in a layout is
-    assigned focus, and there are "Request Focus" and "Clear Focus"
-    context menu items on text fields to change the focus.
-- XML editors:
-  - Code completion has been significantly improved. It now works
-    within <style> elements, it completes dimensional units,
-    it sorts resource paths in values based on the attribute name,
-    etc. There are also many fixes to handle text replacement.
-  - AAPT errors are handled better. They are now underlined for the
-    relevant range in the editor, and a new quickfix makes it trivial
-    to create missing resources.
-  - Code completion for drawable, animation and color XML files.
-- DDMS:
-  - "New Folder" action in the File Explorer
-  - The screenshot dialog will add timestamps to the filenames, and
-    preserve the orientation on snapshot refresh
-- TraceView: Mouse-wheel zoom support in the timeline
-- The New Android Project wizard now supports Eclipse working sets
-- Most of the tools have improved integration with the Mac OSX
-  system menu bar.
-- Most of the tools have new launcher icons.
-
-10.0.1 (March, 2011)
-- Temporary work-around to resolve the rare cases in which the layout
-  editor will not open.
-- Fix issue in which ADT 10.0.0 would install on Eclipse 3.4 and
-  lower, even though ADT requires Eclipse 3.5 or higher (as of
-  10.0.0).
-
-10.0.0 (February 22nd, 2011)
-- The tools now automatically generate Java Programming Language
-  source files (in the gen/ directory) and bytecode (in the res/raw/
-  directory) from your .rs files.
-- A Binary XML editor has been added.
-- Traceview is now integrated into the Eclipse UI.
-- The "Go To Declaration" feature for XML and .java files quickly show
-  all the matches in the project and allows you jump to specific items
-  such as string translations or onClick handlers.
-- The Resource Chooser can create items such as dimensions, integers,
-  ids, and booleans.
-- Improvements to the Visual Layout Editor:
-  - A new Palette with categories and rendering previews.
-  - A Layout Actions bar that provides quick access to common layout
-    operations.
-  - When the Android 3.0 rendering library is selected, layouts render
-    more like they do on devices. This includes rendering of status
-    and title bars to more accurately reflect the actual screen space
-    available to applications.
-  - Zoom improvements such as fit to view, persistent scale, and
-    keyboard access..
-  - Further improvements to <merge> layouts, as well as layouts with
-    gesture overlays.
-  - Improved rendering error diagnostics.
-
-9.0.0 (January 26, 2011)
-- Visual Layout Editor
-    - Empty layouts with 0,0 size are now automatically expanded when
-      selected and during drag and drop
-    - Rendering target can now be changed from the default (project
-      target)
-    - When choosing resources for rendering, the API level is properly
-      handled
-    - Improved support for rendering <include> and <merge> views
-    - "Extract as Include" refactoring to extract selected views into
-      a separate included layout.
-    - String and reference properties can be edited from the layout
-      editor's context menu
-    - Rewritten outline drag & drop handling, improved label colors
-      and content
-    - The generated XML will be better formatted. Full XML formatter
-      can be enabled in the preferences (under Android > Editors), but
-      will touch part of the XML that isn't modified.
-    - Automatic configuration of many widgets on drop, such as
-      automatically filling a TextView in a vertical LinearLayout,
-      adding rows to new tables, etc.
-    - Double click views to jump to the corresponding XML declaration,
-      or for included views, to the included layout file
-    - Improved support for various views (such as TabHosts and
-      SlidingDrawers) when rendered using Honeycomb
-- Go to Declaration hyperlinks for navigating from @resource
-  references to their XML declarations, from the manifest file to
-  activity and service classes, from Java access of resource R fields
-  to the XML declarations, etc.
-- Logcat view in DDMS now properly displays UTF-8 characters.
-
-8.0.1 (October 2010)
-- Fix compilation issue in Android projects referencing standard Java
-  projects.
-- Better error reporting when exporting applications for release.
-
-8.0.0 (October 2010)
-- New version number scheme following the SDK Tools revision number.
-- Support for true debug build. No need to change the value of
-  debuggable in the Android Manifest.  Incremental build will
-  automatically insert debuggable==true while using the "export
-  signed/unsigned application package" will not.  If debuggable=true
-  is set, then release builds will actually do a debug build.
-- Automatic Proguard support in release builds. Only need to have a
-  proguard.config property in default.properties that points to a
-  proguard config file.
-- Completely rewritten Visual Layout Editor. This is very much a work
-  in progress.
-    - full drag and drop from palette to layout for all Layout
-      classes.
-    - Move widgets inside a Layout view, from one Layout view to
-      another and from one layout file to another.
-    - Contextual menu with enum/flag type properties.
-    - New zoom controls.
-- New HierarchyViewer plug-in integrated in Eclipse.
-- Android launch configurations don't recompile the whole workspace on
-  launch anymore.
-- android.jar source and javadoc location can now be configured.
-
-0.9.9:
-- Fix bug where ADT would delete the source folder of projects
-  imported from version control.
-
-0.9.8:
-- New Action "Rename Application Package" (under the "Android Tools"
-  contextual menu) will do a full application package refatoring.
-- Fixed issue with library project names containing characters that
-  aren't compatible with Eclipse path variable. The link between the
-  main project and the library would fail to create.
-- Added support for library projects that don't have a source folder
-  called "src". There is now support for any number of source folder,
-  with no name restriction. They can even be in sub folder such as
-  "src/java".
-- Added support for libraries with library dependencies.
-- added support for new resource qualifiers: car/desk, night/notnight
-  and navexposed/navhidden
-- Added more device screen types for the layout editor. All screen
-  resolution/density combinations from
-  http://developer.android.com/guide/practices/screens_support.html#range
-  is now available.
-
-0.9.7:
-- Support for library projects
-- Updated Property panel for Android project to edit library
-  dependencies.
-
-0.9.6:
-- Editing default.properties outside of eclipse will automatically
-  update the project
-- Fix issue when launching ADT the first time with the SDK Usage panel
-  that could create a deadlock between modal dialogs
-- Launched applications from ADT now behave as if they were clicked
-  from the Home screen of the emulator.
-- AVD creation dialog now enforce sd card of 9MB or higher
-- Fixed issue where add-on with no optional library would not show up
-  as valid targets for application launches.
-- Loads the SDK content only when a project requires it. This will
-  make Eclipse use less resources when the SDK contains many versions
-  of Android.
-- DDMS plug-in now contains the Allocation Tracker view.
-- Lots of fixes in the configuration selector of the Visual Layout
-  Editor.
-- Explode mode in the Visual Layout Editor adds a margin to all layout
-  objects so that it's easier to see embedded layouts
-- Outline mode in the Visual Layout Editor draws layout outline to
-  make it easier to see layout objects.
-- Fixed issues with the New Project Wizard when selecting samples.
-- Fixed possible crash when launching applications
-- New action in the Logcat view: "Go to problem" lets you go directly
-  from an exception trace output to the code.
-
-0.9.5:
-- Misc fixes in the SDK Updater
-
-0.9.4:
-- New "Create project from sample" choice in the New Project Wizard.
-- Improvements to the SDK Updater.
-- improvements to the AVD Manager (creation and launch dialogs)
-- new configuration selector in the Graphical Layout Editor
-
-0.9.3:
-- New wizard to create Android JUnit Test Projects.
-- New AVD wizard.
-- SDK Updater
-- zipalign support
-
-0.9.1:
-
-- Added an AVD creation wizard to ADT. It is automatically displayed
-  during a launch if no compatible AVDs are found.
-- Fixed issue with libs/ folder where files with no extension would
-  prevent the build from finishing.
-- Improved error handling during the final steps of the build to mark
-  the project if an unexpected error prevent the build from finishing.
-- Fixed issue when launching ADT on a clean install would trigger
-  org.eclipse.swt.SWTError: Not implemented [multiple displays].
-
-
-
-0.9.0:
-
-- Projects now store generated Java files (R.java/Manifest.java and
-  output from aidl) in a 'gen' source folder.
-- Support for the new Android SDK with support for multiple versions
-  of the Android platform and for vendor supplied add-ons.
-    * New Project Wizard lets you choose which platform/add-on to
-      target.
-    * Project properties (right click project in Package Explorer,
-      then "Properties"), lets you edit project target.
-    * New Launch configuration option to choose debug deployment
-      target.
-- Ability to export multiple apk from one project, using resource
-  filters. See the 'android' property for Android projects.
-- Support for running JUnit tests on a device/emulator from a new
-  "Android JUnit tests" launch configuration.
-
-0.8.1:
-
-- Alternate Layout wizard. In the layout editor, the "create" button
-  is now enabled to easily create alternate versions of the current
-  layout.
-- Fixed issue with custom themes/styles in the layout editor.
-- Export Wizard: To export an application for release, and sign it
-  with a non debug key. Accessible from the export menu, from the
-  Android Tools contextual menu, or from the overview page of the
-  manifest editor.
-- New XML File Wizard: To easily create new XML resources file in the
-  /res directory.
-- New checks on launch when attempting to debug on a device.
-- Basic support for drag'n'drop in Graphical layout editor. You can
-  add new items by drag'n'drop from the palette. There is no support
-  for moving/resizing yet.
-- Undo/redo support in all XML form editors and Graphical layout
-  editor.
-
-0.8.0:
-
-- Fixed issue with using custom classes implementing Parcelable in
-  aidl files. Right click the project and choose Android Tools >
-  Create aidl preprocess file for Parcelable Classes.
-- Added Custom Themes to theme drop down in the layout editor.
-- Customizable debug signing keystore path in preferences
-- Customizable HOME package name.
-
-0.7.1:
-
-- Layout Editor.
-
-0.6.1:
-- Fixed install issue when project name contains spaces (requires new
-  emulator image)
-- Fixed setup of the New class wizard in the manifest (when clicking
-  on "name" for a class attribute) in the cases where the class and
-  some of its parent packages were missing.
-- Properly kill the application that is about to be reinstalled.
-- Create missing android folder automatically when building
-  application (caused a signing error)
-- Manifest editor: support for uses-library node
-- Fixed NPE in editors.xml.descriptors.XmlDescriptors.createPreference
-- Fixed assert in MultiEditorPart.setActivePage
-- Fixed "connect to debugger" button in DeviceView. Also fixed support
-  for custom process names.
-
-0.6.0:
-
-- New launch option for activity. Can choose to launch default
-  activity (finds an activity configured to show up in the home
-  screen), or specific activity, or none.
-- Normal java resources (non java files placed in package folders) are
-  now properly packaged in the final package, and can be accessed
-  through normal java API such as ClassLoader.getResourceAsStream()
-- Launch configuration now has an option to wipe emulator data on
-  launch. This always asks for confirmation.
-- Launch configuration now has an option to disable the boot
-  animation. This will let the emulator start faster on older
-  computers.
-- Applications are now signed with a debug key (stored in
-  debug.keystore in ~/.android).
-- Installation of application is now more robust and will notify of
-  installation failure. Also installation is blocking, removing issues
-  where ADT tried to launch the activity before the app was installed.
-- Tree-based resource editor + content assist in XML editor for
-  layout, menu, preferences, values xml files. Work in progress...
-
-
-0.4.0 (adt 0.4.0, ddms 0.3.0, editors 0.2.0, common 0.1.0)
-
-- New AndroidManifest editor.
-- True multiple device support allowing debugging apps on several
-  device at the same time
-- New launch modes for device selection: automatic will launch an
-  emulator if no device are present, automatically target the device
-  if only one exists, and prompt the user if 2+ are connected. Manual
-  mode always prompt the user.
-- New classpath container remove the dependencies on the location of
-  android.jar making it easier to share a project through dsvn, cvs,
-  etc... You should fix your project (right click project, choose
-  Android > Fix Project properties)
-- Fixed a case where pm would fail and would up end outputting the
-  "usage" text, which would in turn confuse the plugin during parsing.
-- Fixed an issue with compiling aidl file when they import project
-  local files.
-
-
-0.3.4 (adt 0.3.4, ddms 0.2.3, editors 0.1.0)
-
-Internal release only.
-- Enabled device support.
-
-0.3.3 (adt 0.3.3, ddms 0.2.3, editors 0.1.0)
-
-- Support for referenced projects.
-- During launch, display if a package conflict occurs when the new
-  application is pushed onto the device.
-- You can now change the font of the logcat view. Also indentation is
-  now properly displayed.
-- Plugin generated files are now properly marked as derived. This will
-  make Team plugins ignore them.
-
-0.3.2
-
-- XML Highlighting for AndroidManifest.xml (requires WebTools WST plugin)
-- Custom java editor for R.java/Manifest.java to make those files non
-  editable. This is to replace the current locking mechanism which
-  causes issues on Mac OS.
-- Fixed some issue in the "Restart adb" feature in the device view of
-  ddms.
-- Better handling of aidl files and the java files generated from
-  them.
-- Plugin now retries to launch the app on the emulator if it fails due
-  to timing issues.
-- Skin dropdown in the Emulator/Target tabs is now build from the
-  content of the skin directory, to support developer made skins.
-- Emulator control panel. This is a UI on top of the emulator
-  console. it allows you to change the state of the network and gsm
-  connection, and to initiate incoming voice call.
-
-0.3.1
-
-- Fixed issue on winXP/Eclipse 3.2 where errors in the New Project
-  Wizard would not display.
-- Added missing intent definition in the AndroidManifest.xml file
-  created by the New Project Wizard.
-- Fixed possible NPE in the debug action from the Process View
-- Support for Eclipse 3.4
-
-0.2.6 / 0.3.0
-
-- New Project Wizard now makes it easy to open Android sample code
-- Plugin will output a warning if the build id of the device/emulator
-  does not match the sdk build id.
-- Java/Debug/ddms perspective now contains direct menus to open some
-  of the ddms views, and to create a new android project. This will
-  require you to reset your perspectives.
-- Error during builds now put an error marker on the project instead
-  of displaying an (annoying) dialog box.
-- Custom builders now remember their build state when restarting
-  eclipse.
-- Properly parse some aapt warnings and don't abort the build when
-  they happen.
-- Abort launch and prompt the user if the project contains errors.
-- New silent/normal/verbose build output.
-
-0.2.5
-
-- Check compiler compliance level before compilation and abort if
-  different from 1.5
-- Fix Project Properties will fix the project compiler compliance if
-  needed.
-- Fixed an issue with multiple source folders.
-- Added support for new Manifest.java class (it is automatically
-  generated with R.java if the content of the AndroidManifest.xml
-  requires it)
-- Fixed an issue that could result in not packaging code changes.
-- Automatic fix of the Launch Configurations when the java package in
-  the manifest is changed. Also improved Launch Config dialog and
-  error alert for erroneous activity names in the Launch
-  Configuration.
-- Support for external jars that are not under the project root
-  directory.
-- New projects have a default layout.
-- Misc fixes for Windows support.
-
-0.2.4
-
-- Fixed large resource corruption issue.
-
-0.2.3
-
-- Fixed issue related to the integration of dx.
-- Fixed issue related to the package generation that was modified for
-  windows support.
-
-0.2.2
-
-- Changing the SDK location in the Preferences does not require to
-  restart Eclipse anymore.
-- New SDK-Project sync mode in Android preference pane. Default value
-  set to true. If true, all android projects are automatically sync'ed
-  to the SDK defined in the preferences.
-- Cases where no emulator is running but a dialog still says "An
-  emulator is running..." should be less frequent.
-- Projects do not reference the standard desktop JRE anymore, as
-  android.zip contains the core java library. This will solve the case
-  where using a core class non present on the platform would not
-  generate a compilation error.
-- Changing the package defined in the manifest now deletes the R.java
-  class from its previous location. This will require 1 build after
-  upgrading the plugin, before it works.
-- Project selection in the Launch Config Dialog now only shows Android
-  projects.
-- Launching a debug/run session now checks that the project uses the
-  SDK set in the preferences (This is for the non automatic sync
-  mode).
-- Removed obsolete wallpaper mode in the New Project Creation Wizard.
-- dx (dalvik code conversion tool) now embedded instead of calling the
-  external version.
-- Improvements in the parsing of the aapt errors.
-- Some fixes for windows support.
-
-
-0.2.1
-
-- Fixed bug in logcat search where invalid regexp would cause a crash
-- Minor improvements to the build/launch process.
-
-0.2.0
-
-- Logcat view.
-- File Explorer view.
-- Custom options for emulator. In the Launch configuration dialog you
-  can specify custom command line emulator options. See
-  "emulator -help" for available options.
-- Android Tools > Export Application Package is now implemented.
-- Misc incremental builder fixes.
-- Including static .jar files as library in your project will
-  automatically include them in the final APK. Warning: only the
-  .class content is included.
-
-0.1.10
-
-- The res and assets folders now fully refresh before the build,
-  ensuring R.java and packaged resources are always up to date. This
-  can be disabled in the preferences under "Android" if this becomes
-  slow due to too many files.
-
-0.1.9
-
-- New Action in the "Processes" view to debug an application that is
-  already running. The source project for this application MUST be
-  opened in the current workspace.
-- Building the project now force refreshes the res folder. This should
-  help rebuilding the resources when only binary files were changed
-  from outside eclipse.
-- Clean/full builds now compile all aidl files found in the build path
-  (previously only incremental builds would compile them). Also, misc
-  improvements to the incremental builders.
-- Starting a run/debug session now asks to save the files and forces a
-  new build to ensure that the latest package is pushed on the device.
-- Plugin should be less aggressive when waiting for the emulator to be
-  ready. This should translate in fewer failed launches.
-
-0.1.8
-
-- Fixed Debugger issue introduced in 0.1.6
-- Added Log level preferences for DDMS. Look under Android > DDMS >
-  Advanced. Default error level is Error.
-
-0.1.7
-
-- Fixed issue where java warnings wouldn't trigger a new package. Now
-  only errors stop the packaging like it should be.
-- Added more error output in the console during launch.
-
-0.1.6
-
-- New "Android" Console. It receives the error output from external
-  tools such and aidl, dx, and aapt (only when they can't be
-  parsed). Any error force the console to be displayed.
-- The Activity Manager on the device/emulator now outputs some
-  messages in the "Android" console when asked to start an
-  activity. This should help you figure out what is wrong if the
-  application doesn't start.
-- Fixed a case where the .apk file would be updated with broken
-  code. Now if there are java compile error, the .apk is not touched.
-- Added support for manifest with non fully qualified activity java
-  name, yet not starting with a dot.
-- Fixed creation of manifest files (through New Project wizard) to use
-  proper namespace for attributes.
-- Better error reporting for namespace issue in the manifest.
-- "Reset Adb" action from the device view. Use this is the plugin
-  tells you an emulator is running when there are none.
-- New "ddms" Console which receives the standard output of ddms.
-
-0.1.5
-
-- Support for new activity declaration inside AndroidManifest.xml
-- fixed issue that prevented bin/ to be removed from the buildpath
-  when converting project.
-
-0.1.4
-
-- Changes in the Manifest, now properly trigger a new package of the
-  resources.
-
-0.1.3
-
-- Fixed the "fix project properties" action to remove old framework
-  libraries, just not add new ones.
-
-0.1.2
-
-- aidl builder. The Android Resources PreBuilder now also converts
-  aidl files into java files.
-- New Project wizard now allows to make Wallpaper activities instead
-  of gadgets (which are obsolete.)
-- Launch shortcuts. Right click in the package explorer allow you to
-  launch the application in debug or run mode directly without
-  creating launch configurations.
-- New project wizard and Project conversion now sets up the java doc
-  path for android.zip
-- Package builder now supports custom application assets placed in
-  assets/ (which is now created automatically by the New Project
-  Wizard).
-- New action: Android Tools > Fix Project Properties, in the package
-  explorer contextual menu. This allows you to fix the framework path
-  (and its javadoc path) in case you change the sdk location.
-
-0.1.1
-
-- Fixed project convertor to add the framework library if missing.
-
-0.1.0
-
-- New project wizard.
-- Python script-generated project convertor.
-- Incremental builders.
-- XML validation for resource files.
-- Android Launch Configuration.
diff --git a/eclipse/dictionary.txt b/eclipse/dictionary.txt
deleted file mode 100644
index 0dc00fd..0000000
--- a/eclipse/dictionary.txt
+++ /dev/null
@@ -1,362 +0,0 @@
-&apos;
-aapt
-accessor
-accessors
-adb
-addon
-adt
-aidl
-alt
-android
-anim
-antialias
-antialiased
-apache
-api
-apk
-app
-apps
-arg
-async
-attr
-attrs
-avd
-avds
-backfill
-backport
-backported
-basename
-basenames
-bitmask
-breadcrumb
-builtin
-bytecode
-cairo
-callback
-callbacks
-carlo
-cf
-changeset
-charset
-checkbox
-checkboxes
-classloader
-classpath
-clickable
-clipart
-clipboard
-clipboards
-closeables
-clueless
-codebase
-codename
-codenames
-colspan
-combo
-combobox
-combos
-compositor
-config
-configs
-configurability
-congrats
-coords
-credentials
-cyclical
-dalvik
-ddms
-deactivated
-debuggable
-dedent
-defstyle
-deprecated
-deselect
-deselects
-designtime
-dev
-dex
-dexified
-diff
-diffs
-dir
-dirs
-discoverable
-displayable
-ditto
-div
-docs
-dp
-dpi
-drawable
-drawables
-dropdown
-ed
-editable
-em
-endian
-endpoint
-enum
-enums
-env
-equidistant
-exec
-fallback
-flux
-flyout
-foo
-foreach
-fqcn
-framelayout
-froyo
-gen
-gif
-git
-glob
-globbing
-groovy
-guava
-guillemets
-hardcode
-hardcoded
-hardcodes
-hdpi
-helvetica
-highlighter
-holo
-hotfix
-href
-html
-http
-hyperlink
-hyperlinks
-ids
-ie
-iff
-img
-infos
-init
-inits
-inline
-inlined
-inset
-instanceof
-instantiatable
-int
-inter
-interpolator
-interpolators
-iterable
-javac
-javadoc
-jpg
-keystore
-layoutlib
-ldpi
-leaky
-levenshtein
-lib
-lifecycle
-linebreaks
-linestyle
-linkable
-linux
-locale
-locales
-logo
-lombok
-lopsided
-lowercase
-luminance
-mac
-macs
-malformed
-markup
-marquee
-maven
-mdpi
-memento
-metadata
-micro
-min
-mipmap
-misaligned
-monospace
-monte
-ms
-msg
-multi
-multimap
-multimaps
-namespace
-namespaces
-newfound
-nexus
-ninepatch
-nodpi
-nulling
-num
-ok
-op
-os
-palette
-param
-params
-parented
-pings
-placeholder
-placeholders
-plugin
-plugins
-png
-popup
-popups
-pre
-precompiler
-precompute
-precomputing
-pref
-prefs
-preload
-preloaded
-preloads
-primordial
-printf
-pristine
-programmatic
-programmatically
-proguard
-propertysheet
-proxies
-proxy
-pulldown
-px
-quickfix
-recompilation
-rect
-redo
-refactor
-refactored
-refactoring
-refactorings
-regex
-regexp
-regexps
-registry
-reindent
-reindenting
-remap
-renderable
-reparse
-reparses
-rescales
-residual
-resilient
-resizability
-resizable
-rev
-risky
-rollback
-rowspan
-rowspans
-sandbox
-sans
-scrollable
-scrollbar
-scrollbars
-scrubbing
-sdcard
-sdk
-se
-searchable
-selectable
-semi
-serializer
-settable
-snip
-spec
-src
-standalone
-stash
-stat
-stateful
-stateless
-stderr
-stdout
-stretchable
-stretchiness
-struct
-styleable
-styleables
-stylesheet
-subclassed
-subclassing
-submenu
-submenus
-subregion
-superclasses
-supertype
-symlinks
-synced
-syncs
-synthetically
-tabbed
-tad
-temp
-templated
-textfield
-textfields
-thematically
-themed
-thumbnail
-thumbnails
-timestamp
-timestamps
-tmp
-toolbar
-toolbars
-tooltip
-tooltips
-traceview
-translucency
-trig
-txt
-typo
-ui
-uncomment
-undescribed
-undoable
-unfiltered
-unhide
-unicode
-uninstall
-uninstallation
-uninstalling
-unset
-unweighted
-upcoming
-uppercase
-uri
-url
-urls
-utf
-validator
-validators
-varargs
-verbosity
-viewport
-vs
-wakelock
-wakelocks
-wallpaper
-webtools
-whilst
-wildcard
-workflow
-xdpi
-xhdpi
-xlarge
-xml
-xmlns
-ydpi
-zip
-zipalign
diff --git a/eclipse/features/com.android.ide.eclipse.adt.package/.project b/eclipse/features/com.android.ide.eclipse.adt.package/.project
deleted file mode 100644
index 1024cf0..0000000
--- a/eclipse/features/com.android.ide.eclipse.adt.package/.project
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>feature-adt-package</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.pde.FeatureBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.FeatureNature</nature>
-	</natures>
-</projectDescription>
diff --git a/eclipse/features/com.android.ide.eclipse.adt.package/build.properties b/eclipse/features/com.android.ide.eclipse.adt.package/build.properties
deleted file mode 100644
index 64dc64a..0000000
--- a/eclipse/features/com.android.ide.eclipse.adt.package/build.properties
+++ /dev/null
@@ -1,3 +0,0 @@
-bin.includes = feature.xml,\
-               p2.inf
-includeLaunchers=false
diff --git a/eclipse/features/com.android.ide.eclipse.adt.package/feature.xml b/eclipse/features/com.android.ide.eclipse.adt.package/feature.xml
deleted file mode 100644
index 56eeaaf..0000000
--- a/eclipse/features/com.android.ide.eclipse.adt.package/feature.xml
+++ /dev/null
@@ -1,45 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<feature
-      id="com.android.ide.eclipse.adt.package.feature"
-      label="ADT Package"
-      version="24.3.3.qualifier"
-      provider-name="The Android Open Source Project"
-      plugin="com.android.ide.eclipse.adt.package">
-
-   <description url="http://developer.android.com">
-      Android Developer Tools
-   </description>
-
-   <copyright>
-      Copyright (C) 2007-2014 The Android Open Source Project
-   </copyright>
-
-   <license url="http://www.eclipse.org/org/documents/epl-v10.php">
-      Note:  kxml2-2.3.0.jar is under the BSD license rather ...
-   </license>
-
-   <requires>
-      <import plugin="com.android.ide.eclipse.adt" version="22.3.0" match="greaterOrEqual"/>
-      <import plugin="com.android.ide.eclipse.base" version="22.3.0" match="greaterOrEqual"/>
-      <import plugin="com.android.ide.eclipse.ddms" version="22.3.0" match="greaterOrEqual"/>
-      <import plugin="com.android.ide.eclipse.gldebugger" version="22.3.0" match="greaterOrEqual"/>
-      <import plugin="com.android.ide.eclipse.hierarchyviewer" version="22.3.0" match="greaterOrEqual"/>
-      <import plugin="com.android.ide.eclipse.traceview" version="22.3.0" match="greaterOrEqual"/>
-      <import plugin="com.android.ide.eclipse.ndk" version="22.3.0" match="greaterOrEqual"/>
-      <import plugin="overlay.com.android.ide.eclipse.adt.overlay"/>
-      <import feature="org.eclipse.equinox.p2.user.ui"/>
-      <import feature="org.eclipse.platform"/>
-      <import feature="org.eclipse.rcp"/>
-      <import feature="org.eclipse.egit"/>
-      <import feature="org.eclipse.egit.import"/>
-      <import feature="org.eclipse.cdt"/>
-      <import feature="org.eclipse.jdt"/>
-   </requires>
-
-   <plugin
-         id="com.android.ide.eclipse.adt.package"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"/>
-
-</feature>
diff --git a/eclipse/features/com.android.ide.eclipse.adt.package/p2.inf b/eclipse/features/com.android.ide.eclipse.adt.package/p2.inf
deleted file mode 100644
index 93a365c..0000000
--- a/eclipse/features/com.android.ide.eclipse.adt.package/p2.inf
+++ /dev/null
@@ -1,9 +0,0 @@
-#tell pde.build not to generate start levels
-org.eclipse.pde.build.append.startlevels=false
-
-requires.1.namespace=org.eclipse.equinox.p2.iu
-requires.1.name=org.eclipse.platform.ide
-requires.1.greedy=true
-
-instructions.configure=\
-org.eclipse.equinox.p2.touchpoint.eclipse.addRepository(location:https${#58}//dl.google.com/android/eclipse/,type:0,name:Android Developer Tools Update Site,enabled:true);
diff --git a/eclipse/features/com.android.ide.eclipse.adt.package/pom.xml b/eclipse/features/com.android.ide.eclipse.adt.package/pom.xml
deleted file mode 100644
index 2ed5049..0000000
--- a/eclipse/features/com.android.ide.eclipse.adt.package/pom.xml
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-    <modelVersion>4.0.0</modelVersion>
-
-    <version>24.3.3-SNAPSHOT</version>
-    <artifactId>com.android.ide.eclipse.adt.package.feature</artifactId>
-    <packaging>eclipse-feature</packaging>
-    <name>adt.package</name>
-
-    <parent>
-        <relativePath>../../pom.xml</relativePath>
-        <groupId>adt.group</groupId>
-        <artifactId>parent</artifactId>
-        <version>1.0.0-SNAPSHOT</version>
-    </parent>
-</project>
diff --git a/eclipse/features/com.android.ide.eclipse.adt/.project b/eclipse/features/com.android.ide.eclipse.adt/.project
deleted file mode 100644
index 513b14b..0000000
--- a/eclipse/features/com.android.ide.eclipse.adt/.project
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>feature-adt</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.pde.FeatureBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.FeatureNature</nature>
-	</natures>
-</projectDescription>
diff --git a/eclipse/features/com.android.ide.eclipse.adt/build.properties b/eclipse/features/com.android.ide.eclipse.adt/build.properties
deleted file mode 100644
index 64f93a9..0000000
--- a/eclipse/features/com.android.ide.eclipse.adt/build.properties
+++ /dev/null
@@ -1 +0,0 @@
-bin.includes = feature.xml
diff --git a/eclipse/features/com.android.ide.eclipse.adt/feature.xml b/eclipse/features/com.android.ide.eclipse.adt/feature.xml
deleted file mode 100644
index 61bfbb0..0000000
--- a/eclipse/features/com.android.ide.eclipse.adt/feature.xml
+++ /dev/null
@@ -1,161 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<feature
-      id="com.android.ide.eclipse.adt.feature"
-      label="Android Development Tools"
-      version="24.3.3.qualifier"
-      provider-name="The Android Open Source Project"
-      plugin="com.android.ide.eclipse.adt">
-
-   <description>
-      Android Developer Tools.
-   </description>
-
-   <copyright>
-      Copyright (C) 2007-2011 The Android Open Source Project
-   </copyright>
-
-   <license url="http://www.eclipse.org/org/documents/epl-v10.php">
-      Note:  kxml2-2.3.0.jar is under the BSD license rather than the EPL.  You can find a copy of the BSD License at http://www.opensource.org/licenses/bsd-license.php
-
-      Eclipse Public License - v 1.0
-
-THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE PUBLIC LICENSE (&quot;AGREEMENT&quot;). ANY USE, REPRODUCTION OR DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT&apos;S ACCEPTANCE OF THIS AGREEMENT.
-
-1. DEFINITIONS
-
-&quot;Contribution&quot; means:
-
-a) in the case of the initial Contributor, the initial code and documentation distributed under this Agreement, and
-
-b) in the case of each subsequent Contributor:
-
-i) changes to the Program, and
-
-ii) additions to the Program;
-
-where such changes and/or additions to the Program originate from and are distributed by that particular Contributor. A Contribution &apos;originates&apos; from a Contributor if it was added to the Program by such Contributor itself or anyone acting on such Contributor&apos;s behalf. Contributions do not include additions to the Program which: (i) are separate modules of software distributed in conjunction with the Program under their own license agreement, and (ii) are not derivative works of the Program.
-
-&quot;Contributor&quot; means any person or entity that distributes the Program.
-
-&quot;Licensed Patents&quot; mean patent claims licensable by a Contributor which are necessarily infringed by the use or sale of its Contribution alone or when combined with the Program.
-
-&quot;Program&quot; means the Contributions distributed in accordance with this Agreement.
-
-&quot;Recipient&quot; means anyone who receives the Program under this Agreement, including all Contributors.
-
-2. GRANT OF RIGHTS
-
-a) Subject to the terms of this Agreement, each Contributor hereby grants Recipient a non-exclusive, worldwide, royalty-free copyright license to reproduce, prepare derivative works of, publicly display, publicly perform, distribute and sublicense the Contribution of such Contributor, if any, and such derivative works, in source code and object code form.
-
-b) Subject to the terms of this Agreement, each Contributor hereby grants Recipient a non-exclusive, worldwide, royalty-free patent license under Licensed Patents to make, use, sell, offer to sell, import and otherwise transfer the Contribution of such Contributor, if any, in source code and object code form. This patent license shall apply to the combination of the Contribution and the Program if, at the time the Contribution is added by the Contributor, such addition of the Contribution causes such combination to be covered by the Licensed Patents. The patent license shall not apply to any other combinations which include the Contribution. No hardware per se is licensed hereunder.
-
-c) Recipient understands that although each Contributor grants the licenses to its Contributions set forth herein, no assurances are provided by any Contributor that the Program does not infringe the patent or other intellectual property rights of any other entity. Each Contributor disclaims any liability to Recipient for claims brought by any other entity based on infringement of intellectual property rights or otherwise. As a condition to exercising the rights and licenses granted hereunder, each Recipient hereby assumes sole responsibility to secure any other intellectual property rights needed, if any. For example, if a third party patent license is required to allow Recipient to distribute the Program, it is Recipient&apos;s responsibility to acquire that license before distributing the Program.
-
-d) Each Contributor represents that to its knowledge it has sufficient copyright rights in its Contribution, if any, to grant the copyright license set forth in this Agreement.
-
-3. REQUIREMENTS
-
-A Contributor may choose to distribute the Program in object code form under its own license agreement, provided that:
-
-a) it complies with the terms and conditions of this Agreement; and
-
-b) its license agreement:
-
-i) effectively disclaims on behalf of all Contributors all warranties and conditions, express and implied, including warranties or conditions of title and non-infringement, and implied warranties or conditions of merchantability and fitness for a particular purpose;
-
-ii) effectively excludes on behalf of all Contributors all liability for damages, including direct, indirect, special, incidental and consequential damages, such as lost profits;
-
-iii) states that any provisions which differ from this Agreement are offered by that Contributor alone and not by any other party; and
-
-iv) states that source code for the Program is available from such Contributor, and informs licensees how to obtain it in a reasonable manner on or through a medium customarily used for software exchange.
-
-When the Program is made available in source code form:
-
-a) it must be made available under this Agreement; and
-
-b) a copy of this Agreement must be included with each copy of the Program.
-
-Contributors may not remove or alter any copyright notices contained within the Program.
-
-Each Contributor must identify itself as the originator of its Contribution, if any, in a manner that reasonably allows subsequent Recipients to identify the originator of the Contribution.
-
-4. COMMERCIAL DISTRIBUTION
-
-Commercial distributors of software may accept certain responsibilities with respect to end users, business partners and the like. While this license is intended to facilitate the commercial use of the Program, the Contributor who includes the Program in a commercial product offering should do so in a manner which does not create potential liability for other Contributors. Therefore, if a Contributor includes the Program in a commercial product offering, such Contributor (&quot;Commercial Contributor&quot;) hereby agrees to defend and indemnify every other Contributor (&quot;Indemnified Contributor&quot;) against any losses, damages and costs (collectively &quot;Losses&quot;) arising from claims, lawsuits and other legal actions brought by a third party against the Indemnified Contributor to the extent caused by the acts or omissions of such Commercial Contributor in connection with its distribution of the Program in a commercial product offering. The obligations in this section do not apply to any claims or Losses relating to any actual or alleged intellectual property infringement. In order to qualify, an Indemnified Contributor must: a) promptly notify the Commercial Contributor in writing of such claim, and b) allow the Commercial Contributor to control, and cooperate with the Commercial Contributor in, the defense and any related settlement negotiations. The Indemnified Contributor may participate in any such claim at its own expense.
-
-For example, a Contributor might include the Program in a commercial product offering, Product X. That Contributor is then a Commercial Contributor. If that Commercial Contributor then makes performance claims, or offers warranties related to Product X, those performance claims and warranties are such Commercial Contributor&apos;s responsibility alone. Under this section, the Commercial Contributor would have to defend claims against the other Contributors related to those performance claims and warranties, and if a court requires any other Contributor to pay any damages as a result, the Commercial Contributor must pay those damages.
-
-5. NO WARRANTY
-
-EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS PROVIDED ON AN &quot;AS IS&quot; BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely responsible for determining the appropriateness of using and distributing the Program and assumes all risks associated with its exercise of rights under this Agreement , including but not limited to the risks and costs of program errors, compliance with applicable laws, damage to or loss of data, programs or equipment, and unavailability or interruption of operations.
-
-6. DISCLAIMER OF LIABILITY
-
-EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
-
-7. GENERAL
-
-If any provision of this Agreement is invalid or unenforceable under applicable law, it shall not affect the validity or enforceability of the remainder of the terms of this Agreement, and without further action by the parties hereto, such provision shall be reformed to the minimum extent necessary to make such provision valid and enforceable.
-
-If Recipient institutes patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Program itself (excluding combinations of the Program with other software or hardware) infringes such Recipient&apos;s patent(s), then such Recipient&apos;s rights granted under Section 2(b) shall terminate as of the date such litigation is filed.
-
-All Recipient&apos;s rights under this Agreement shall terminate if it fails to comply with any of the material terms or conditions of this Agreement and does not cure such failure in a reasonable period of time after becoming aware of such noncompliance. If all Recipient&apos;s rights under this Agreement terminate, Recipient agrees to cease use and distribution of the Program as soon as reasonably practicable. However, Recipient&apos;s obligations under this Agreement and any licenses granted by Recipient relating to the Program shall continue and survive.
-
-Everyone is permitted to copy and distribute copies of this Agreement, but in order to avoid inconsistency the Agreement is copyrighted and may only be modified in the following manner. The Agreement Steward reserves the right to publish new versions (including revisions) of this Agreement from time to time. No one other than the Agreement Steward has the right to modify this Agreement. The Eclipse Foundation is the initial Agreement Steward. The Eclipse Foundation may assign the responsibility to serve as the Agreement Steward to a suitable separate entity. Each new version of the Agreement will be given a distinguishing version number. The Program (including Contributions) may always be distributed subject to the version of the Agreement under which it was received. In addition, after a new version of the Agreement is published, Contributor may elect to distribute the Program (including its Contributions) under the new version. Except as expressly stated in Sections 2(a) and 2(b) above, Recipient receives no rights or licenses to the intellectual property of any Contributor under this Agreement, whether expressly, by implication, estoppel or otherwise. All rights in the Program not expressly granted under this Agreement are reserved.
-
-This Agreement is governed by the laws of the State of New York and the intellectual property laws of the United States of America. No party to this Agreement will bring a legal action under this Agreement more than one year after the cause of action arose. Each party waives its rights to a jury trial in any resulting litigation.
-   </license>
-
-   <url>
-      <update label="Android Update Site" url="https://dl-ssl.google.com/android/eclipse/"/>
-   </url>
-
-   <requires>
-      <import plugin="com.android.ide.eclipse.base" match="perfect"/>
-      <import plugin="com.android.ide.eclipse.ddms" match="perfect"/>
-      <import plugin="org.eclipse.core.runtime" version="3.7.0" match="greaterOrEqual"/>
-      <import plugin="org.eclipse.core.resources"/>
-      <import plugin="org.eclipse.debug.core"/>
-      <import plugin="org.eclipse.debug.ui"/>
-      <import plugin="org.eclipse.jdt"/>
-      <import plugin="org.eclipse.ant.core"/>
-      <import plugin="org.eclipse.jdt.core"/>
-      <import plugin="org.eclipse.jdt.ui"/>
-      <import plugin="org.eclipse.jdt.launching"/>
-      <import plugin="org.eclipse.jface.text"/>
-      <import plugin="org.eclipse.ui.editors"/>
-      <import plugin="org.eclipse.ui.workbench.texteditor"/>
-      <import plugin="org.eclipse.ui.console"/>
-      <import plugin="org.eclipse.core.filesystem"/>
-      <import plugin="org.eclipse.ui" version="3.7" match="greaterOrEqual"/>
-      <import plugin="org.eclipse.ui.ide"/>
-      <import plugin="org.eclipse.ui.forms"/>
-      <import plugin="org.eclipse.ui.browser"/>
-      <import plugin="org.eclipse.ui.views"/>
-      <import plugin="org.eclipse.wst.sse.core"/>
-      <import plugin="org.eclipse.wst.sse.ui"/>
-      <import plugin="org.eclipse.wst.xml.core"/>
-      <import plugin="org.eclipse.wst.xml.ui"/>
-      <import plugin="org.eclipse.jdt.junit"/>
-      <import plugin="org.eclipse.jdt.junit.runtime"/>
-      <import plugin="org.eclipse.ltk.core.refactoring"/>
-      <import plugin="org.eclipse.ltk.ui.refactoring"/>
-      <import plugin="org.eclipse.core.expressions"/>
-      <import plugin="org.eclipse.compare"/>
-   </requires>
-
-   <plugin
-         id="com.android.ide.eclipse.adt"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="overlay.com.android.ide.eclipse.adt.overlay"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-</feature>
diff --git a/eclipse/features/com.android.ide.eclipse.adt/pom.xml b/eclipse/features/com.android.ide.eclipse.adt/pom.xml
deleted file mode 100644
index 30e504d..0000000
--- a/eclipse/features/com.android.ide.eclipse.adt/pom.xml
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-    <modelVersion>4.0.0</modelVersion>
-
-    <version>24.3.3-SNAPSHOT</version>
-    <artifactId>com.android.ide.eclipse.adt.feature</artifactId>
-    <packaging>eclipse-feature</packaging>
-    <name>adt</name>
-
-    <parent>
-        <relativePath>../../pom.xml</relativePath>
-        <groupId>adt.group</groupId>
-        <artifactId>parent</artifactId>
-        <version>1.0.0-SNAPSHOT</version>
-    </parent>
-</project>
diff --git a/eclipse/features/com.android.ide.eclipse.ddms/.project b/eclipse/features/com.android.ide.eclipse.ddms/.project
deleted file mode 100644
index 3a74819..0000000
--- a/eclipse/features/com.android.ide.eclipse.ddms/.project
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>feature-ddms</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.pde.FeatureBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.FeatureNature</nature>
-	</natures>
-</projectDescription>
diff --git a/eclipse/features/com.android.ide.eclipse.ddms/build.properties b/eclipse/features/com.android.ide.eclipse.ddms/build.properties
deleted file mode 100644
index 64f93a9..0000000
--- a/eclipse/features/com.android.ide.eclipse.ddms/build.properties
+++ /dev/null
@@ -1 +0,0 @@
-bin.includes = feature.xml
diff --git a/eclipse/features/com.android.ide.eclipse.ddms/feature.xml b/eclipse/features/com.android.ide.eclipse.ddms/feature.xml
deleted file mode 100644
index 812a9f2..0000000
--- a/eclipse/features/com.android.ide.eclipse.ddms/feature.xml
+++ /dev/null
@@ -1,253 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<feature
-      id="com.android.ide.eclipse.ddms.feature"
-      label="Android DDMS"
-      version="24.3.3.qualifier"
-      provider-name="The Android Open Source Project"
-      plugin="com.android.ide.eclipse.ddms">
-
-   <description>
-      Android Dalvik Debug Monitor Service
-   </description>
-
-   <copyright>
-      Copyright (C) 2007-2011 The Android Open Source Project
-   </copyright>
-
-   <license url="http://www.apache.org/licenses/LICENSE-2.0">
-      Note:  jcommon-1.0.12.jar is under the BSD license rather than the APL.  You can find a copy of the BSD License at http://www.opensource.org/licenses/bsd-license.php
-
-   jfreechart-1.0.9.jar and jfreechart-1.0.9-swt.jar are under the LGPL rather than the APL.  You can find a copy of the LGPL at http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt.  You can get the source code for these two components at http://android.git.kernel.org/pub/jfreechart-1.0.9.zip
-
-
-      Apache License
-                           Version 2.0, January 2004
-                        http://www.apache.org/licenses/
-
-   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
-   1. Definitions.
-
-      &quot;License&quot; shall mean the terms and conditions for use, reproduction,
-      and distribution as defined by Sections 1 through 9 of this document.
-
-      &quot;Licensor&quot; shall mean the copyright owner or entity authorized by
-      the copyright owner that is granting the License.
-
-      &quot;Legal Entity&quot; shall mean the union of the acting entity and all
-      other entities that control, are controlled by, or are under common
-      control with that entity. For the purposes of this definition,
-      &quot;control&quot; means (i) the power, direct or indirect, to cause the
-      direction or management of such entity, whether by contract or
-      otherwise, or (ii) ownership of fifty percent (50%) or more of the
-      outstanding shares, or (iii) beneficial ownership of such entity.
-
-      &quot;You&quot; (or &quot;Your&quot;) shall mean an individual or Legal Entity
-      exercising permissions granted by this License.
-
-      &quot;Source&quot; form shall mean the preferred form for making modifications,
-      including but not limited to software source code, documentation
-      source, and configuration files.
-
-      &quot;Object&quot; form shall mean any form resulting from mechanical
-      transformation or translation of a Source form, including but
-      not limited to compiled object code, generated documentation,
-      and conversions to other media types.
-
-      &quot;Work&quot; shall mean the work of authorship, whether in Source or
-      Object form, made available under the License, as indicated by a
-      copyright notice that is included in or attached to the work
-      (an example is provided in the Appendix below).
-
-      &quot;Derivative Works&quot; shall mean any work, whether in Source or Object
-      form, that is based on (or derived from) the Work and for which the
-      editorial revisions, annotations, elaborations, or other modifications
-      represent, as a whole, an original work of authorship. For the purposes
-      of this License, Derivative Works shall not include works that remain
-      separable from, or merely link (or bind by name) to the interfaces of,
-      the Work and Derivative Works thereof.
-
-      &quot;Contribution&quot; shall mean any work of authorship, including
-      the original version of the Work and any modifications or additions
-      to that Work or Derivative Works thereof, that is intentionally
-      submitted to Licensor for inclusion in the Work by the copyright owner
-      or by an individual or Legal Entity authorized to submit on behalf of
-      the copyright owner. For the purposes of this definition, &quot;submitted&quot;
-      means any form of electronic, verbal, or written communication sent
-      to the Licensor or its representatives, including but not limited to
-      communication on electronic mailing lists, source code control systems,
-      and issue tracking systems that are managed by, or on behalf of, the
-      Licensor for the purpose of discussing and improving the Work, but
-      excluding communication that is conspicuously marked or otherwise
-      designated in writing by the copyright owner as &quot;Not a Contribution.&quot;
-
-      &quot;Contributor&quot; shall mean Licensor and any individual or Legal Entity
-      on behalf of whom a Contribution has been received by Licensor and
-      subsequently incorporated within the Work.
-
-   2. Grant of Copyright License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      copyright license to reproduce, prepare Derivative Works of,
-      publicly display, publicly perform, sublicense, and distribute the
-      Work and such Derivative Works in Source or Object form.
-
-   3. Grant of Patent License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      (except as stated in this section) patent license to make, have made,
-      use, offer to sell, sell, import, and otherwise transfer the Work,
-      where such license applies only to those patent claims licensable
-      by such Contributor that are necessarily infringed by their
-      Contribution(s) alone or by combination of their Contribution(s)
-      with the Work to which such Contribution(s) was submitted. If You
-      institute patent litigation against any entity (including a
-      cross-claim or counterclaim in a lawsuit) alleging that the Work
-      or a Contribution incorporated within the Work constitutes direct
-      or contributory patent infringement, then any patent licenses
-      granted to You under this License for that Work shall terminate
-      as of the date such litigation is filed.
-
-   4. Redistribution. You may reproduce and distribute copies of the
-      Work or Derivative Works thereof in any medium, with or without
-      modifications, and in Source or Object form, provided that You
-      meet the following conditions:
-
-      (a) You must give any other recipients of the Work or
-          Derivative Works a copy of this License; and
-
-      (b) You must cause any modified files to carry prominent notices
-          stating that You changed the files; and
-
-      (c) You must retain, in the Source form of any Derivative Works
-          that You distribute, all copyright, patent, trademark, and
-          attribution notices from the Source form of the Work,
-          excluding those notices that do not pertain to any part of
-          the Derivative Works; and
-
-      (d) If the Work includes a &quot;NOTICE&quot; text file as part of its
-          distribution, then any Derivative Works that You distribute must
-          include a readable copy of the attribution notices contained
-          within such NOTICE file, excluding those notices that do not
-          pertain to any part of the Derivative Works, in at least one
-          of the following places: within a NOTICE text file distributed
-          as part of the Derivative Works; within the Source form or
-          documentation, if provided along with the Derivative Works; or,
-          within a display generated by the Derivative Works, if and
-          wherever such third-party notices normally appear. The contents
-          of the NOTICE file are for informational purposes only and
-          do not modify the License. You may add Your own attribution
-          notices within Derivative Works that You distribute, alongside
-          or as an addendum to the NOTICE text from the Work, provided
-          that such additional attribution notices cannot be construed
-          as modifying the License.
-
-      You may add Your own copyright statement to Your modifications and
-      may provide additional or different license terms and conditions
-      for use, reproduction, or distribution of Your modifications, or
-      for any such Derivative Works as a whole, provided Your use,
-      reproduction, and distribution of the Work otherwise complies with
-      the conditions stated in this License.
-
-   5. Submission of Contributions. Unless You explicitly state otherwise,
-      any Contribution intentionally submitted for inclusion in the Work
-      by You to the Licensor shall be under the terms and conditions of
-      this License, without any additional terms or conditions.
-      Notwithstanding the above, nothing herein shall supersede or modify
-      the terms of any separate license agreement you may have executed
-      with Licensor regarding such Contributions.
-
-   6. Trademarks. This License does not grant permission to use the trade
-      names, trademarks, service marks, or product names of the Licensor,
-      except as required for reasonable and customary use in describing the
-      origin of the Work and reproducing the content of the NOTICE file.
-
-   7. Disclaimer of Warranty. Unless required by applicable law or
-      agreed to in writing, Licensor provides the Work (and each
-      Contributor provides its Contributions) on an &quot;AS IS&quot; BASIS,
-      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
-      implied, including, without limitation, any warranties or conditions
-      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
-      PARTICULAR PURPOSE. You are solely responsible for determining the
-      appropriateness of using or redistributing the Work and assume any
-      risks associated with Your exercise of permissions under this License.
-
-   8. Limitation of Liability. In no event and under no legal theory,
-      whether in tort (including negligence), contract, or otherwise,
-      unless required by applicable law (such as deliberate and grossly
-      negligent acts) or agreed to in writing, shall any Contributor be
-      liable to You for damages, including any direct, indirect, special,
-      incidental, or consequential damages of any character arising as a
-      result of this License or out of the use or inability to use the
-      Work (including but not limited to damages for loss of goodwill,
-      work stoppage, computer failure or malfunction, or any and all
-      other commercial damages or losses), even if such Contributor
-      has been advised of the possibility of such damages.
-
-   9. Accepting Warranty or Additional Liability. While redistributing
-      the Work or Derivative Works thereof, You may choose to offer,
-      and charge a fee for, acceptance of support, warranty, indemnity,
-      or other liability obligations and/or rights consistent with this
-      License. However, in accepting such obligations, You may act only
-      on Your own behalf and on Your sole responsibility, not on behalf
-      of any other Contributor, and only if You agree to indemnify,
-      defend, and hold each Contributor harmless for any liability
-      incurred by, or claims asserted against, such Contributor by reason
-      of your accepting any such warranty or additional liability.
-
-   END OF TERMS AND CONDITIONS
-
-   APPENDIX: How to apply the Apache License to your work.
-
-      To apply the Apache License to your work, attach the following
-      boilerplate notice, with the fields enclosed by brackets &quot;[]&quot;
-      replaced with your own identifying information. (Don&apos;t include
-      the brackets!)  The text should be enclosed in the appropriate
-      comment syntax for the file format. We also recommend that a
-      file or class name and description of purpose be included on the
-      same &quot;printed page&quot; as the copyright notice for easier
-      identification within third-party archives.
-
-   Copyright [yyyy] [name of copyright owner]
-
-   Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
-   you may not use this file except in compliance with the License.
-   You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an &quot;AS IS&quot; BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
-   </license>
-
-   <url>
-      <update label="Android Update Site" url="https://dl-ssl.google.com/android/eclipse/"/>
-   </url>
-
-   <requires>
-      <import plugin="org.eclipse.ui" version="3.7.0" match="greaterOrEqual"/>
-      <import plugin="org.eclipse.core.runtime" version="3.7.0" match="greaterOrEqual"/>
-      <import plugin="org.eclipse.ui.console"/>
-      <import plugin="org.eclipse.core.resources"/>
-      <import plugin="org.eclipse.ui.ide"/>
-      <import plugin="org.eclipse.core.filesystem"/>
-   </requires>
-
-   <plugin
-         id="com.android.ide.eclipse.base"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="com.android.ide.eclipse.ddms"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-</feature>
diff --git a/eclipse/features/com.android.ide.eclipse.ddms/pom.xml b/eclipse/features/com.android.ide.eclipse.ddms/pom.xml
deleted file mode 100644
index fc9680d..0000000
--- a/eclipse/features/com.android.ide.eclipse.ddms/pom.xml
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-    <modelVersion>4.0.0</modelVersion>
-
-    <version>24.3.3-SNAPSHOT</version>
-    <artifactId>com.android.ide.eclipse.ddms.feature</artifactId>
-    <packaging>eclipse-feature</packaging>
-    <name>ddms</name>
-
-    <parent>
-        <relativePath>../../pom.xml</relativePath>
-        <groupId>adt.group</groupId>
-        <artifactId>parent</artifactId>
-        <version>1.0.0-SNAPSHOT</version>
-    </parent>
-</project>
diff --git a/eclipse/features/com.android.ide.eclipse.gldebugger/.project b/eclipse/features/com.android.ide.eclipse.gldebugger/.project
deleted file mode 100644
index 067a8f4..0000000
--- a/eclipse/features/com.android.ide.eclipse.gldebugger/.project
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>feature-gldebugger</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.pde.FeatureBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.FeatureNature</nature>
-	</natures>
-</projectDescription>
diff --git a/eclipse/features/com.android.ide.eclipse.gldebugger/build.properties b/eclipse/features/com.android.ide.eclipse.gldebugger/build.properties
deleted file mode 100644
index 64f93a9..0000000
--- a/eclipse/features/com.android.ide.eclipse.gldebugger/build.properties
+++ /dev/null
@@ -1 +0,0 @@
-bin.includes = feature.xml
diff --git a/eclipse/features/com.android.ide.eclipse.gldebugger/feature.xml b/eclipse/features/com.android.ide.eclipse.gldebugger/feature.xml
deleted file mode 100644
index 2259187..0000000
--- a/eclipse/features/com.android.ide.eclipse.gldebugger/feature.xml
+++ /dev/null
@@ -1,232 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<feature
-      id="com.android.ide.eclipse.gldebugger.feature"
-      label="Tracer for OpenGL ES"
-      version="24.3.3.qualifier"
-      provider-name="The Android Open Source Project">
-
-   <description>
-      GLESv2 Debugger Client (Alpha status).
-   </description>
-
-   <copyright>
-      Copyright (C) 2011 The Android Open Source Project
-   </copyright>
-
-   <license url="http://www.apache.org/licenses/LICENSE-2.0">
-      Apache License
-                           Version 2.0, January 2004
-                        http://www.apache.org/licenses/
-
-   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
-   1. Definitions.
-
-      &quot;License&quot; shall mean the terms and conditions for use, reproduction,
-      and distribution as defined by Sections 1 through 9 of this document.
-
-      &quot;Licensor&quot; shall mean the copyright owner or entity authorized by
-      the copyright owner that is granting the License.
-
-      &quot;Legal Entity&quot; shall mean the union of the acting entity and all
-      other entities that control, are controlled by, or are under common
-      control with that entity. For the purposes of this definition,
-      &quot;control&quot; means (i) the power, direct or indirect, to cause the
-      direction or management of such entity, whether by contract or
-      otherwise, or (ii) ownership of fifty percent (50%) or more of the
-      outstanding shares, or (iii) beneficial ownership of such entity.
-
-      &quot;You&quot; (or &quot;Your&quot;) shall mean an individual or Legal Entity
-      exercising permissions granted by this License.
-
-      &quot;Source&quot; form shall mean the preferred form for making modifications,
-      including but not limited to software source code, documentation
-      source, and configuration files.
-
-      &quot;Object&quot; form shall mean any form resulting from mechanical
-      transformation or translation of a Source form, including but
-      not limited to compiled object code, generated documentation,
-      and conversions to other media types.
-
-      &quot;Work&quot; shall mean the work of authorship, whether in Source or
-      Object form, made available under the License, as indicated by a
-      copyright notice that is included in or attached to the work
-      (an example is provided in the Appendix below).
-
-      &quot;Derivative Works&quot; shall mean any work, whether in Source or Object
-      form, that is based on (or derived from) the Work and for which the
-      editorial revisions, annotations, elaborations, or other modifications
-      represent, as a whole, an original work of authorship. For the purposes
-      of this License, Derivative Works shall not include works that remain
-      separable from, or merely link (or bind by name) to the interfaces of,
-      the Work and Derivative Works thereof.
-
-      &quot;Contribution&quot; shall mean any work of authorship, including
-      the original version of the Work and any modifications or additions
-      to that Work or Derivative Works thereof, that is intentionally
-      submitted to Licensor for inclusion in the Work by the copyright owner
-      or by an individual or Legal Entity authorized to submit on behalf of
-      the copyright owner. For the purposes of this definition, &quot;submitted&quot;
-      means any form of electronic, verbal, or written communication sent
-      to the Licensor or its representatives, including but not limited to
-      communication on electronic mailing lists, source code control systems,
-      and issue tracking systems that are managed by, or on behalf of, the
-      Licensor for the purpose of discussing and improving the Work, but
-      excluding communication that is conspicuously marked or otherwise
-      designated in writing by the copyright owner as &quot;Not a Contribution.&quot;
-
-      &quot;Contributor&quot; shall mean Licensor and any individual or Legal Entity
-      on behalf of whom a Contribution has been received by Licensor and
-      subsequently incorporated within the Work.
-
-   2. Grant of Copyright License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      copyright license to reproduce, prepare Derivative Works of,
-      publicly display, publicly perform, sublicense, and distribute the
-      Work and such Derivative Works in Source or Object form.
-
-   3. Grant of Patent License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      (except as stated in this section) patent license to make, have made,
-      use, offer to sell, sell, import, and otherwise transfer the Work,
-      where such license applies only to those patent claims licensable
-      by such Contributor that are necessarily infringed by their
-      Contribution(s) alone or by combination of their Contribution(s)
-      with the Work to which such Contribution(s) was submitted. If You
-      institute patent litigation against any entity (including a
-      cross-claim or counterclaim in a lawsuit) alleging that the Work
-      or a Contribution incorporated within the Work constitutes direct
-      or contributory patent infringement, then any patent licenses
-      granted to You under this License for that Work shall terminate
-      as of the date such litigation is filed.
-
-   4. Redistribution. You may reproduce and distribute copies of the
-      Work or Derivative Works thereof in any medium, with or without
-      modifications, and in Source or Object form, provided that You
-      meet the following conditions:
-
-      (a) You must give any other recipients of the Work or
-          Derivative Works a copy of this License; and
-
-      (b) You must cause any modified files to carry prominent notices
-          stating that You changed the files; and
-
-      (c) You must retain, in the Source form of any Derivative Works
-          that You distribute, all copyright, patent, trademark, and
-          attribution notices from the Source form of the Work,
-          excluding those notices that do not pertain to any part of
-          the Derivative Works; and
-
-      (d) If the Work includes a &quot;NOTICE&quot; text file as part of its
-          distribution, then any Derivative Works that You distribute must
-          include a readable copy of the attribution notices contained
-          within such NOTICE file, excluding those notices that do not
-          pertain to any part of the Derivative Works, in at least one
-          of the following places: within a NOTICE text file distributed
-          as part of the Derivative Works; within the Source form or
-          documentation, if provided along with the Derivative Works; or,
-          within a display generated by the Derivative Works, if and
-          wherever such third-party notices normally appear. The contents
-          of the NOTICE file are for informational purposes only and
-          do not modify the License. You may add Your own attribution
-          notices within Derivative Works that You distribute, alongside
-          or as an addendum to the NOTICE text from the Work, provided
-          that such additional attribution notices cannot be construed
-          as modifying the License.
-
-      You may add Your own copyright statement to Your modifications and
-      may provide additional or different license terms and conditions
-      for use, reproduction, or distribution of Your modifications, or
-      for any such Derivative Works as a whole, provided Your use,
-      reproduction, and distribution of the Work otherwise complies with
-      the conditions stated in this License.
-
-   5. Submission of Contributions. Unless You explicitly state otherwise,
-      any Contribution intentionally submitted for inclusion in the Work
-      by You to the Licensor shall be under the terms and conditions of
-      this License, without any additional terms or conditions.
-      Notwithstanding the above, nothing herein shall supersede or modify
-      the terms of any separate license agreement you may have executed
-      with Licensor regarding such Contributions.
-
-   6. Trademarks. This License does not grant permission to use the trade
-      names, trademarks, service marks, or product names of the Licensor,
-      except as required for reasonable and customary use in describing the
-      origin of the Work and reproducing the content of the NOTICE file.
-
-   7. Disclaimer of Warranty. Unless required by applicable law or
-      agreed to in writing, Licensor provides the Work (and each
-      Contributor provides its Contributions) on an &quot;AS IS&quot; BASIS,
-      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
-      implied, including, without limitation, any warranties or conditions
-      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
-      PARTICULAR PURPOSE. You are solely responsible for determining the
-      appropriateness of using or redistributing the Work and assume any
-      risks associated with Your exercise of permissions under this License.
-
-   8. Limitation of Liability. In no event and under no legal theory,
-      whether in tort (including negligence), contract, or otherwise,
-      unless required by applicable law (such as deliberate and grossly
-      negligent acts) or agreed to in writing, shall any Contributor be
-      liable to You for damages, including any direct, indirect, special,
-      incidental, or consequential damages of any character arising as a
-      result of this License or out of the use or inability to use the
-      Work (including but not limited to damages for loss of goodwill,
-      work stoppage, computer failure or malfunction, or any and all
-      other commercial damages or losses), even if such Contributor
-      has been advised of the possibility of such damages.
-
-   9. Accepting Warranty or Additional Liability. While redistributing
-      the Work or Derivative Works thereof, You may choose to offer,
-      and charge a fee for, acceptance of support, warranty, indemnity,
-      or other liability obligations and/or rights consistent with this
-      License. However, in accepting such obligations, You may act only
-      on Your own behalf and on Your sole responsibility, not on behalf
-      of any other Contributor, and only if You agree to indemnify,
-      defend, and hold each Contributor harmless for any liability
-      incurred by, or claims asserted against, such Contributor by reason
-      of your accepting any such warranty or additional liability.
-
-   END OF TERMS AND CONDITIONS
-
-   APPENDIX: How to apply the Apache License to your work.
-
-      To apply the Apache License to your work, attach the following
-      boilerplate notice, with the fields enclosed by brackets &quot;[]&quot;
-      replaced with your own identifying information. (Don&apos;t include
-      the brackets!)  The text should be enclosed in the appropriate
-      comment syntax for the file format. We also recommend that a
-      file or class name and description of purpose be included on the
-      same &quot;printed page&quot; as the copyright notice for easier
-      identification within third-party archives.
-
-   Copyright [yyyy] [name of copyright owner]
-
-   Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
-   you may not use this file except in compliance with the License.
-   You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an &quot;AS IS&quot; BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
-   </license>
-
-   <requires>
-      <import plugin="org.eclipse.ui"/>
-      <import plugin="org.eclipse.core.runtime"/>
-   </requires>
-
-   <plugin
-         id="com.android.ide.eclipse.gldebugger"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-</feature>
diff --git a/eclipse/features/com.android.ide.eclipse.gldebugger/pom.xml b/eclipse/features/com.android.ide.eclipse.gldebugger/pom.xml
deleted file mode 100644
index 65f086f..0000000
--- a/eclipse/features/com.android.ide.eclipse.gldebugger/pom.xml
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-    <modelVersion>4.0.0</modelVersion>
-
-    <version>24.3.3-SNAPSHOT</version>
-    <artifactId>com.android.ide.eclipse.gldebugger.feature</artifactId>
-    <packaging>eclipse-feature</packaging>
-    <name>gldebugger</name>
-
-    <parent>
-        <relativePath>../../pom.xml</relativePath>
-        <groupId>adt.group</groupId>
-        <artifactId>parent</artifactId>
-        <version>1.0.0-SNAPSHOT</version>
-    </parent>
-</project>
diff --git a/eclipse/features/com.android.ide.eclipse.hierarchyviewer/.project b/eclipse/features/com.android.ide.eclipse.hierarchyviewer/.project
deleted file mode 100644
index 0c7a096..0000000
--- a/eclipse/features/com.android.ide.eclipse.hierarchyviewer/.project
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>feature-hierarchyviewer</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.pde.FeatureBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.FeatureNature</nature>
-	</natures>
-</projectDescription>
diff --git a/eclipse/features/com.android.ide.eclipse.hierarchyviewer/build.properties b/eclipse/features/com.android.ide.eclipse.hierarchyviewer/build.properties
deleted file mode 100644
index 64f93a9..0000000
--- a/eclipse/features/com.android.ide.eclipse.hierarchyviewer/build.properties
+++ /dev/null
@@ -1 +0,0 @@
-bin.includes = feature.xml
diff --git a/eclipse/features/com.android.ide.eclipse.hierarchyviewer/feature.xml b/eclipse/features/com.android.ide.eclipse.hierarchyviewer/feature.xml
deleted file mode 100644
index b9b3596..0000000
--- a/eclipse/features/com.android.ide.eclipse.hierarchyviewer/feature.xml
+++ /dev/null
@@ -1,239 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<feature
-      id="com.android.ide.eclipse.hierarchyviewer.feature"
-      label="Android Hierarchy Viewer"
-      version="24.3.3.qualifier"
-      provider-name="The Android Open Source Project"
-      plugin="com.android.ide.eclipse.hierarchyviewer">
-
-   <description>
-      Android Hierarchy Viewer.
-   </description>
-
-   <copyright>
-      Copyright (C) 2010-2011 The Android Open Source Project
-   </copyright>
-
-   <license url="http://www.apache.org/licenses/LICENSE-2.0.txt">
-      Apache License
-                           Version 2.0, January 2004
-                        http://www.apache.org/licenses/
-
-   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
-   1. Definitions.
-
-      &quot;License&quot; shall mean the terms and conditions for use, reproduction,
-      and distribution as defined by Sections 1 through 9 of this document.
-
-      &quot;Licensor&quot; shall mean the copyright owner or entity authorized by
-      the copyright owner that is granting the License.
-
-      &quot;Legal Entity&quot; shall mean the union of the acting entity and all
-      other entities that control, are controlled by, or are under common
-      control with that entity. For the purposes of this definition,
-      &quot;control&quot; means (i) the power, direct or indirect, to cause the
-      direction or management of such entity, whether by contract or
-      otherwise, or (ii) ownership of fifty percent (50%) or more of the
-      outstanding shares, or (iii) beneficial ownership of such entity.
-
-      &quot;You&quot; (or &quot;Your&quot;) shall mean an individual or Legal Entity
-      exercising permissions granted by this License.
-
-      &quot;Source&quot; form shall mean the preferred form for making modifications,
-      including but not limited to software source code, documentation
-      source, and configuration files.
-
-      &quot;Object&quot; form shall mean any form resulting from mechanical
-      transformation or translation of a Source form, including but
-      not limited to compiled object code, generated documentation,
-      and conversions to other media types.
-
-      &quot;Work&quot; shall mean the work of authorship, whether in Source or
-      Object form, made available under the License, as indicated by a
-      copyright notice that is included in or attached to the work
-      (an example is provided in the Appendix below).
-
-      &quot;Derivative Works&quot; shall mean any work, whether in Source or Object
-      form, that is based on (or derived from) the Work and for which the
-      editorial revisions, annotations, elaborations, or other modifications
-      represent, as a whole, an original work of authorship. For the purposes
-      of this License, Derivative Works shall not include works that remain
-      separable from, or merely link (or bind by name) to the interfaces of,
-      the Work and Derivative Works thereof.
-
-      &quot;Contribution&quot; shall mean any work of authorship, including
-      the original version of the Work and any modifications or additions
-      to that Work or Derivative Works thereof, that is intentionally
-      submitted to Licensor for inclusion in the Work by the copyright owner
-      or by an individual or Legal Entity authorized to submit on behalf of
-      the copyright owner. For the purposes of this definition, &quot;submitted&quot;
-      means any form of electronic, verbal, or written communication sent
-      to the Licensor or its representatives, including but not limited to
-      communication on electronic mailing lists, source code control systems,
-      and issue tracking systems that are managed by, or on behalf of, the
-      Licensor for the purpose of discussing and improving the Work, but
-      excluding communication that is conspicuously marked or otherwise
-      designated in writing by the copyright owner as &quot;Not a Contribution.&quot;
-
-      &quot;Contributor&quot; shall mean Licensor and any individual or Legal Entity
-      on behalf of whom a Contribution has been received by Licensor and
-      subsequently incorporated within the Work.
-
-   2. Grant of Copyright License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      copyright license to reproduce, prepare Derivative Works of,
-      publicly display, publicly perform, sublicense, and distribute the
-      Work and such Derivative Works in Source or Object form.
-
-   3. Grant of Patent License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      (except as stated in this section) patent license to make, have made,
-      use, offer to sell, sell, import, and otherwise transfer the Work,
-      where such license applies only to those patent claims licensable
-      by such Contributor that are necessarily infringed by their
-      Contribution(s) alone or by combination of their Contribution(s)
-      with the Work to which such Contribution(s) was submitted. If You
-      institute patent litigation against any entity (including a
-      cross-claim or counterclaim in a lawsuit) alleging that the Work
-      or a Contribution incorporated within the Work constitutes direct
-      or contributory patent infringement, then any patent licenses
-      granted to You under this License for that Work shall terminate
-      as of the date such litigation is filed.
-
-   4. Redistribution. You may reproduce and distribute copies of the
-      Work or Derivative Works thereof in any medium, with or without
-      modifications, and in Source or Object form, provided that You
-      meet the following conditions:
-
-      (a) You must give any other recipients of the Work or
-          Derivative Works a copy of this License; and
-
-      (b) You must cause any modified files to carry prominent notices
-          stating that You changed the files; and
-
-      (c) You must retain, in the Source form of any Derivative Works
-          that You distribute, all copyright, patent, trademark, and
-          attribution notices from the Source form of the Work,
-          excluding those notices that do not pertain to any part of
-          the Derivative Works; and
-
-      (d) If the Work includes a &quot;NOTICE&quot; text file as part of its
-          distribution, then any Derivative Works that You distribute must
-          include a readable copy of the attribution notices contained
-          within such NOTICE file, excluding those notices that do not
-          pertain to any part of the Derivative Works, in at least one
-          of the following places: within a NOTICE text file distributed
-          as part of the Derivative Works; within the Source form or
-          documentation, if provided along with the Derivative Works; or,
-          within a display generated by the Derivative Works, if and
-          wherever such third-party notices normally appear. The contents
-          of the NOTICE file are for informational purposes only and
-          do not modify the License. You may add Your own attribution
-          notices within Derivative Works that You distribute, alongside
-          or as an addendum to the NOTICE text from the Work, provided
-          that such additional attribution notices cannot be construed
-          as modifying the License.
-
-      You may add Your own copyright statement to Your modifications and
-      may provide additional or different license terms and conditions
-      for use, reproduction, or distribution of Your modifications, or
-      for any such Derivative Works as a whole, provided Your use,
-      reproduction, and distribution of the Work otherwise complies with
-      the conditions stated in this License.
-
-   5. Submission of Contributions. Unless You explicitly state otherwise,
-      any Contribution intentionally submitted for inclusion in the Work
-      by You to the Licensor shall be under the terms and conditions of
-      this License, without any additional terms or conditions.
-      Notwithstanding the above, nothing herein shall supersede or modify
-      the terms of any separate license agreement you may have executed
-      with Licensor regarding such Contributions.
-
-   6. Trademarks. This License does not grant permission to use the trade
-      names, trademarks, service marks, or product names of the Licensor,
-      except as required for reasonable and customary use in describing the
-      origin of the Work and reproducing the content of the NOTICE file.
-
-   7. Disclaimer of Warranty. Unless required by applicable law or
-      agreed to in writing, Licensor provides the Work (and each
-      Contributor provides its Contributions) on an &quot;AS IS&quot; BASIS,
-      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
-      implied, including, without limitation, any warranties or conditions
-      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
-      PARTICULAR PURPOSE. You are solely responsible for determining the
-      appropriateness of using or redistributing the Work and assume any
-      risks associated with Your exercise of permissions under this License.
-
-   8. Limitation of Liability. In no event and under no legal theory,
-      whether in tort (including negligence), contract, or otherwise,
-      unless required by applicable law (such as deliberate and grossly
-      negligent acts) or agreed to in writing, shall any Contributor be
-      liable to You for damages, including any direct, indirect, special,
-      incidental, or consequential damages of any character arising as a
-      result of this License or out of the use or inability to use the
-      Work (including but not limited to damages for loss of goodwill,
-      work stoppage, computer failure or malfunction, or any and all
-      other commercial damages or losses), even if such Contributor
-      has been advised of the possibility of such damages.
-
-   9. Accepting Warranty or Additional Liability. While redistributing
-      the Work or Derivative Works thereof, You may choose to offer,
-      and charge a fee for, acceptance of support, warranty, indemnity,
-      or other liability obligations and/or rights consistent with this
-      License. However, in accepting such obligations, You may act only
-      on Your own behalf and on Your sole responsibility, not on behalf
-      of any other Contributor, and only if You agree to indemnify,
-      defend, and hold each Contributor harmless for any liability
-      incurred by, or claims asserted against, such Contributor by reason
-      of your accepting any such warranty or additional liability.
-
-   END OF TERMS AND CONDITIONS
-
-   APPENDIX: How to apply the Apache License to your work.
-
-      To apply the Apache License to your work, attach the following
-      boilerplate notice, with the fields enclosed by brackets &quot;[]&quot;
-      replaced with your own identifying information. (Don&apos;t include
-      the brackets!)  The text should be enclosed in the appropriate
-      comment syntax for the file format. We also recommend that a
-      file or class name and description of purpose be included on the
-      same &quot;printed page&quot; as the copyright notice for easier
-      identification within third-party archives.
-
-   Copyright [yyyy] [name of copyright owner]
-
-   Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
-   you may not use this file except in compliance with the License.
-   You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an &quot;AS IS&quot; BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
-   </license>
-
-   <url>
-      <update label="Android Update Site" url="https://dl-ssl.google.com/android/eclipse/"/>
-   </url>
-
-   <requires>
-      <import plugin="org.eclipse.ui" version="3.7.0" match="greaterOrEqual"/>
-      <import plugin="org.eclipse.core.runtime" version="3.7.0" match="greaterOrEqual"/>
-      <import plugin="org.eclipse.ui.console"/>
-      <import plugin="com.android.ide.eclipse.ddms" match="perfect"/>
-   </requires>
-
-   <plugin
-         id="com.android.ide.eclipse.hierarchyviewer"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-</feature>
diff --git a/eclipse/features/com.android.ide.eclipse.hierarchyviewer/pom.xml b/eclipse/features/com.android.ide.eclipse.hierarchyviewer/pom.xml
deleted file mode 100644
index 119476a..0000000
--- a/eclipse/features/com.android.ide.eclipse.hierarchyviewer/pom.xml
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-    <modelVersion>4.0.0</modelVersion>
-
-    <version>24.3.3-SNAPSHOT</version>
-    <artifactId>com.android.ide.eclipse.hierarchyviewer.feature</artifactId>
-    <packaging>eclipse-feature</packaging>
-    <name>hierarchyviewer</name>
-
-    <parent>
-        <relativePath>../../pom.xml</relativePath>
-        <groupId>adt.group</groupId>
-        <artifactId>parent</artifactId>
-        <version>1.0.0-SNAPSHOT</version>
-    </parent>
-</project>
diff --git a/eclipse/features/com.android.ide.eclipse.monitor/.project b/eclipse/features/com.android.ide.eclipse.monitor/.project
deleted file mode 100644
index 347f1dc..0000000
--- a/eclipse/features/com.android.ide.eclipse.monitor/.project
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>feature-monitor</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.pde.FeatureBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.FeatureNature</nature>
-	</natures>
-</projectDescription>
diff --git a/eclipse/features/com.android.ide.eclipse.monitor/build.properties b/eclipse/features/com.android.ide.eclipse.monitor/build.properties
deleted file mode 100644
index 64f93a9..0000000
--- a/eclipse/features/com.android.ide.eclipse.monitor/build.properties
+++ /dev/null
@@ -1 +0,0 @@
-bin.includes = feature.xml
diff --git a/eclipse/features/com.android.ide.eclipse.monitor/feature.xml b/eclipse/features/com.android.ide.eclipse.monitor/feature.xml
deleted file mode 100644
index 5720908..0000000
--- a/eclipse/features/com.android.ide.eclipse.monitor/feature.xml
+++ /dev/null
@@ -1,233 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<feature
-      id="com.android.ide.eclipse.monitor.feature"
-      label="Android Monitor"
-      version="24.3.3.qualifier"
-      provider-name="The Android Open Source Project"
-      plugin="com.android.ide.eclipse.monitor">
-
-   <description>
-      Android Debug Monitor
-   </description>
-
-   <copyright>
-      Copyright (C) 2007-2014 The Android Open Source Project
-   </copyright>
-
-   <license url="http://www.apache.org/licenses/LICENSE-2.0">
-      Note:  jcommon-1.0.12.jar is under the BSD license rather than the APL.  You can find a copy of the BSD License at http://www.opensource.org/licenses/bsd-license.php
-
-   jfreechart-1.0.9.jar and jfreechart-1.0.9-swt.jar are under the LGPL rather than the APL.  You can find a copy of the LGPL at http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt.  You can get the source code for these two components at http://android.git.kernel.org/pub/jfreechart-1.0.9.zip
-
-
-      Apache License
-                           Version 2.0, January 2004
-                        http://www.apache.org/licenses/
-
-   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
-   1. Definitions.
-
-      &quot;License&quot; shall mean the terms and conditions for use, reproduction,
-      and distribution as defined by Sections 1 through 9 of this document.
-
-      &quot;Licensor&quot; shall mean the copyright owner or entity authorized by
-      the copyright owner that is granting the License.
-
-      &quot;Legal Entity&quot; shall mean the union of the acting entity and all
-      other entities that control, are controlled by, or are under common
-      control with that entity. For the purposes of this definition,
-      &quot;control&quot; means (i) the power, direct or indirect, to cause the
-      direction or management of such entity, whether by contract or
-      otherwise, or (ii) ownership of fifty percent (50%) or more of the
-      outstanding shares, or (iii) beneficial ownership of such entity.
-
-      &quot;You&quot; (or &quot;Your&quot;) shall mean an individual or Legal Entity
-      exercising permissions granted by this License.
-
-      &quot;Source&quot; form shall mean the preferred form for making modifications,
-      including but not limited to software source code, documentation
-      source, and configuration files.
-
-      &quot;Object&quot; form shall mean any form resulting from mechanical
-      transformation or translation of a Source form, including but
-      not limited to compiled object code, generated documentation,
-      and conversions to other media types.
-
-      &quot;Work&quot; shall mean the work of authorship, whether in Source or
-      Object form, made available under the License, as indicated by a
-      copyright notice that is included in or attached to the work
-      (an example is provided in the Appendix below).
-
-      &quot;Derivative Works&quot; shall mean any work, whether in Source or Object
-      form, that is based on (or derived from) the Work and for which the
-      editorial revisions, annotations, elaborations, or other modifications
-      represent, as a whole, an original work of authorship. For the purposes
-      of this License, Derivative Works shall not include works that remain
-      separable from, or merely link (or bind by name) to the interfaces of,
-      the Work and Derivative Works thereof.
-
-      &quot;Contribution&quot; shall mean any work of authorship, including
-      the original version of the Work and any modifications or additions
-      to that Work or Derivative Works thereof, that is intentionally
-      submitted to Licensor for inclusion in the Work by the copyright owner
-      or by an individual or Legal Entity authorized to submit on behalf of
-      the copyright owner. For the purposes of this definition, &quot;submitted&quot;
-      means any form of electronic, verbal, or written communication sent
-      to the Licensor or its representatives, including but not limited to
-      communication on electronic mailing lists, source code control systems,
-      and issue tracking systems that are managed by, or on behalf of, the
-      Licensor for the purpose of discussing and improving the Work, but
-      excluding communication that is conspicuously marked or otherwise
-      designated in writing by the copyright owner as &quot;Not a Contribution.&quot;
-
-      &quot;Contributor&quot; shall mean Licensor and any individual or Legal Entity
-      on behalf of whom a Contribution has been received by Licensor and
-      subsequently incorporated within the Work.
-
-   2. Grant of Copyright License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      copyright license to reproduce, prepare Derivative Works of,
-      publicly display, publicly perform, sublicense, and distribute the
-      Work and such Derivative Works in Source or Object form.
-
-   3. Grant of Patent License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      (except as stated in this section) patent license to make, have made,
-      use, offer to sell, sell, import, and otherwise transfer the Work,
-      where such license applies only to those patent claims licensable
-      by such Contributor that are necessarily infringed by their
-      Contribution(s) alone or by combination of their Contribution(s)
-      with the Work to which such Contribution(s) was submitted. If You
-      institute patent litigation against any entity (including a
-      cross-claim or counterclaim in a lawsuit) alleging that the Work
-      or a Contribution incorporated within the Work constitutes direct
-      or contributory patent infringement, then any patent licenses
-      granted to You under this License for that Work shall terminate
-      as of the date such litigation is filed.
-
-   4. Redistribution. You may reproduce and distribute copies of the
-      Work or Derivative Works thereof in any medium, with or without
-      modifications, and in Source or Object form, provided that You
-      meet the following conditions:
-
-      (a) You must give any other recipients of the Work or
-          Derivative Works a copy of this License; and
-
-      (b) You must cause any modified files to carry prominent notices
-          stating that You changed the files; and
-
-      (c) You must retain, in the Source form of any Derivative Works
-          that You distribute, all copyright, patent, trademark, and
-          attribution notices from the Source form of the Work,
-          excluding those notices that do not pertain to any part of
-          the Derivative Works; and
-
-      (d) If the Work includes a &quot;NOTICE&quot; text file as part of its
-          distribution, then any Derivative Works that You distribute must
-          include a readable copy of the attribution notices contained
-          within such NOTICE file, excluding those notices that do not
-          pertain to any part of the Derivative Works, in at least one
-          of the following places: within a NOTICE text file distributed
-          as part of the Derivative Works; within the Source form or
-          documentation, if provided along with the Derivative Works; or,
-          within a display generated by the Derivative Works, if and
-          wherever such third-party notices normally appear. The contents
-          of the NOTICE file are for informational purposes only and
-          do not modify the License. You may add Your own attribution
-          notices within Derivative Works that You distribute, alongside
-          or as an addendum to the NOTICE text from the Work, provided
-          that such additional attribution notices cannot be construed
-          as modifying the License.
-
-      You may add Your own copyright statement to Your modifications and
-      may provide additional or different license terms and conditions
-      for use, reproduction, or distribution of Your modifications, or
-      for any such Derivative Works as a whole, provided Your use,
-      reproduction, and distribution of the Work otherwise complies with
-      the conditions stated in this License.
-
-   5. Submission of Contributions. Unless You explicitly state otherwise,
-      any Contribution intentionally submitted for inclusion in the Work
-      by You to the Licensor shall be under the terms and conditions of
-      this License, without any additional terms or conditions.
-      Notwithstanding the above, nothing herein shall supersede or modify
-      the terms of any separate license agreement you may have executed
-      with Licensor regarding such Contributions.
-
-   6. Trademarks. This License does not grant permission to use the trade
-      names, trademarks, service marks, or product names of the Licensor,
-      except as required for reasonable and customary use in describing the
-      origin of the Work and reproducing the content of the NOTICE file.
-
-   7. Disclaimer of Warranty. Unless required by applicable law or
-      agreed to in writing, Licensor provides the Work (and each
-      Contributor provides its Contributions) on an &quot;AS IS&quot; BASIS,
-      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
-      implied, including, without limitation, any warranties or conditions
-      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
-      PARTICULAR PURPOSE. You are solely responsible for determining the
-      appropriateness of using or redistributing the Work and assume any
-      risks associated with Your exercise of permissions under this License.
-
-   8. Limitation of Liability. In no event and under no legal theory,
-      whether in tort (including negligence), contract, or otherwise,
-      unless required by applicable law (such as deliberate and grossly
-      negligent acts) or agreed to in writing, shall any Contributor be
-      liable to You for damages, including any direct, indirect, special,
-      incidental, or consequential damages of any character arising as a
-      result of this License or out of the use or inability to use the
-      Work (including but not limited to damages for loss of goodwill,
-      work stoppage, computer failure or malfunction, or any and all
-      other commercial damages or losses), even if such Contributor
-      has been advised of the possibility of such damages.
-
-   9. Accepting Warranty or Additional Liability. While redistributing
-      the Work or Derivative Works thereof, You may choose to offer,
-      and charge a fee for, acceptance of support, warranty, indemnity,
-      or other liability obligations and/or rights consistent with this
-      License. However, in accepting such obligations, You may act only
-      on Your own behalf and on Your sole responsibility, not on behalf
-      of any other Contributor, and only if You agree to indemnify,
-      defend, and hold each Contributor harmless for any liability
-      incurred by, or claims asserted against, such Contributor by reason
-      of your accepting any such warranty or additional liability.
-
-   END OF TERMS AND CONDITIONS
-
-   APPENDIX: How to apply the Apache License to your work.
-
-      To apply the Apache License to your work, attach the following
-      boilerplate notice, with the fields enclosed by brackets &quot;[]&quot;
-      replaced with your own identifying information. (Don&apos;t include
-      the brackets!)  The text should be enclosed in the appropriate
-      comment syntax for the file format. We also recommend that a
-      file or class name and description of purpose be included on the
-      same &quot;printed page&quot; as the copyright notice for easier
-      identification within third-party archives.
-
-   Copyright [yyyy] [name of copyright owner]
-
-   Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
-   you may not use this file except in compliance with the License.
-   You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an &quot;AS IS&quot; BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
-   </license>
-
-   <plugin
-         id="com.android.ide.eclipse.monitor"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-</feature>
diff --git a/eclipse/features/com.android.ide.eclipse.monitor/pom.xml b/eclipse/features/com.android.ide.eclipse.monitor/pom.xml
deleted file mode 100644
index a59a05f..0000000
--- a/eclipse/features/com.android.ide.eclipse.monitor/pom.xml
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-    <modelVersion>4.0.0</modelVersion>
-
-    <version>24.3.3-SNAPSHOT</version>
-    <artifactId>com.android.ide.eclipse.monitor.feature</artifactId>
-    <packaging>eclipse-feature</packaging>
-    <name>monitor</name>
-
-    <parent>
-        <relativePath>../../pom.xml</relativePath>
-        <groupId>adt.group</groupId>
-        <artifactId>parent</artifactId>
-        <version>1.0.0-SNAPSHOT</version>
-    </parent>
-</project>
diff --git a/eclipse/features/com.android.ide.eclipse.ndk/.project b/eclipse/features/com.android.ide.eclipse.ndk/.project
deleted file mode 100644
index 42d1891..0000000
--- a/eclipse/features/com.android.ide.eclipse.ndk/.project
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>feature-ndk</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.pde.FeatureBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.FeatureNature</nature>
-	</natures>
-</projectDescription>
diff --git a/eclipse/features/com.android.ide.eclipse.ndk/build.properties b/eclipse/features/com.android.ide.eclipse.ndk/build.properties
deleted file mode 100644
index 64f93a9..0000000
--- a/eclipse/features/com.android.ide.eclipse.ndk/build.properties
+++ /dev/null
@@ -1 +0,0 @@
-bin.includes = feature.xml
diff --git a/eclipse/features/com.android.ide.eclipse.ndk/feature.xml b/eclipse/features/com.android.ide.eclipse.ndk/feature.xml
deleted file mode 100644
index 8a8407e..0000000
--- a/eclipse/features/com.android.ide.eclipse.ndk/feature.xml
+++ /dev/null
@@ -1,117 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<feature
-      id="com.android.ide.eclipse.ndk.feature"
-      label="Android Native Development Tools"
-      version="24.3.3.qualifier"
-      provider-name="The Android Open Source Project">
-
-   <description>
-      Android Native Developer Tools.
-   </description>
-
-   <license url="http://www.eclipse.org/org/documents/epl-v10.php">
-      Eclipse Public License - v 1.0
-
-THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE PUBLIC LICENSE (&quot;AGREEMENT&quot;). ANY USE, REPRODUCTION OR DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT&apos;S ACCEPTANCE OF THIS AGREEMENT.
-
-1. DEFINITIONS
-
-&quot;Contribution&quot; means:
-
-a) in the case of the initial Contributor, the initial code and documentation distributed under this Agreement, and
-
-b) in the case of each subsequent Contributor:
-
-i) changes to the Program, and
-
-ii) additions to the Program;
-
-where such changes and/or additions to the Program originate from and are distributed by that particular Contributor. A Contribution &apos;originates&apos; from a Contributor if it was added to the Program by such Contributor itself or anyone acting on such Contributor&apos;s behalf. Contributions do not include additions to the Program which: (i) are separate modules of software distributed in conjunction with the Program under their own license agreement, and (ii) are not derivative works of the Program.
-
-&quot;Contributor&quot; means any person or entity that distributes the Program.
-
-&quot;Licensed Patents&quot; mean patent claims licensable by a Contributor which are necessarily infringed by the use or sale of its Contribution alone or when combined with the Program.
-
-&quot;Program&quot; means the Contributions distributed in accordance with this Agreement.
-
-&quot;Recipient&quot; means anyone who receives the Program under this Agreement, including all Contributors.
-
-2. GRANT OF RIGHTS
-
-a) Subject to the terms of this Agreement, each Contributor hereby grants Recipient a non-exclusive, worldwide, royalty-free copyright license to reproduce, prepare derivative works of, publicly display, publicly perform, distribute and sublicense the Contribution of such Contributor, if any, and such derivative works, in source code and object code form.
-
-b) Subject to the terms of this Agreement, each Contributor hereby grants Recipient a non-exclusive, worldwide, royalty-free patent license under Licensed Patents to make, use, sell, offer to sell, import and otherwise transfer the Contribution of such Contributor, if any, in source code and object code form. This patent license shall apply to the combination of the Contribution and the Program if, at the time the Contribution is added by the Contributor, such addition of the Contribution causes such combination to be covered by the Licensed Patents. The patent license shall not apply to any other combinations which include the Contribution. No hardware per se is licensed hereunder.
-
-c) Recipient understands that although each Contributor grants the licenses to its Contributions set forth herein, no assurances are provided by any Contributor that the Program does not infringe the patent or other intellectual property rights of any other entity. Each Contributor disclaims any liability to Recipient for claims brought by any other entity based on infringement of intellectual property rights or otherwise. As a condition to exercising the rights and licenses granted hereunder, each Recipient hereby assumes sole responsibility to secure any other intellectual property rights needed, if any. For example, if a third party patent license is required to allow Recipient to distribute the Program, it is Recipient&apos;s responsibility to acquire that license before distributing the Program.
-
-d) Each Contributor represents that to its knowledge it has sufficient copyright rights in its Contribution, if any, to grant the copyright license set forth in this Agreement.
-
-3. REQUIREMENTS
-
-A Contributor may choose to distribute the Program in object code form under its own license agreement, provided that:
-
-a) it complies with the terms and conditions of this Agreement; and
-
-b) its license agreement:
-
-i) effectively disclaims on behalf of all Contributors all warranties and conditions, express and implied, including warranties or conditions of title and non-infringement, and implied warranties or conditions of merchantability and fitness for a particular purpose;
-
-ii) effectively excludes on behalf of all Contributors all liability for damages, including direct, indirect, special, incidental and consequential damages, such as lost profits;
-
-iii) states that any provisions which differ from this Agreement are offered by that Contributor alone and not by any other party; and
-
-iv) states that source code for the Program is available from such Contributor, and informs licensees how to obtain it in a reasonable manner on or through a medium customarily used for software exchange.
-
-When the Program is made available in source code form:
-
-a) it must be made available under this Agreement; and
-
-b) a copy of this Agreement must be included with each copy of the Program.
-
-Contributors may not remove or alter any copyright notices contained within the Program.
-
-Each Contributor must identify itself as the originator of its Contribution, if any, in a manner that reasonably allows subsequent Recipients to identify the originator of the Contribution.
-
-4. COMMERCIAL DISTRIBUTION
-
-Commercial distributors of software may accept certain responsibilities with respect to end users, business partners and the like. While this license is intended to facilitate the commercial use of the Program, the Contributor who includes the Program in a commercial product offering should do so in a manner which does not create potential liability for other Contributors. Therefore, if a Contributor includes the Program in a commercial product offering, such Contributor (&quot;Commercial Contributor&quot;) hereby agrees to defend and indemnify every other Contributor (&quot;Indemnified Contributor&quot;) against any losses, damages and costs (collectively &quot;Losses&quot;) arising from claims, lawsuits and other legal actions brought by a third party against the Indemnified Contributor to the extent caused by the acts or omissions of such Commercial Contributor in connection with its distribution of the Program in a commercial product offering. The obligations in this section do not apply to any claims or Losses relating to any actual or alleged intellectual property infringement. In order to qualify, an Indemnified Contributor must: a) promptly notify the Commercial Contributor in writing of such claim, and b) allow the Commercial Contributor to control, and cooperate with the Commercial Contributor in, the defense and any related settlement negotiations. The Indemnified Contributor may participate in any such claim at its own expense.
-
-For example, a Contributor might include the Program in a commercial product offering, Product X. That Contributor is then a Commercial Contributor. If that Commercial Contributor then makes performance claims, or offers warranties related to Product X, those performance claims and warranties are such Commercial Contributor&apos;s responsibility alone. Under this section, the Commercial Contributor would have to defend claims against the other Contributors related to those performance claims and warranties, and if a court requires any other Contributor to pay any damages as a result, the Commercial Contributor must pay those damages.
-
-5. NO WARRANTY
-
-EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS PROVIDED ON AN &quot;AS IS&quot; BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely responsible for determining the appropriateness of using and distributing the Program and assumes all risks associated with its exercise of rights under this Agreement , including but not limited to the risks and costs of program errors, compliance with applicable laws, damage to or loss of data, programs or equipment, and unavailability or interruption of operations.
-
-6. DISCLAIMER OF LIABILITY
-
-EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
-
-7. GENERAL
-
-If any provision of this Agreement is invalid or unenforceable under applicable law, it shall not affect the validity or enforceability of the remainder of the terms of this Agreement, and without further action by the parties hereto, such provision shall be reformed to the minimum extent necessary to make such provision valid and enforceable.
-
-If Recipient institutes patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Program itself (excluding combinations of the Program with other software or hardware) infringes such Recipient&apos;s patent(s), then such Recipient&apos;s rights granted under Section 2(b) shall terminate as of the date such litigation is filed.
-
-All Recipient&apos;s rights under this Agreement shall terminate if it fails to comply with any of the material terms or conditions of this Agreement and does not cure such failure in a reasonable period of time after becoming aware of such noncompliance. If all Recipient&apos;s rights under this Agreement terminate, Recipient agrees to cease use and distribution of the Program as soon as reasonably practicable. However, Recipient&apos;s obligations under this Agreement and any licenses granted by Recipient relating to the Program shall continue and survive.
-
-Everyone is permitted to copy and distribute copies of this Agreement, but in order to avoid inconsistency the Agreement is copyrighted and may only be modified in the following manner. The Agreement Steward reserves the right to publish new versions (including revisions) of this Agreement from time to time. No one other than the Agreement Steward has the right to modify this Agreement. The Eclipse Foundation is the initial Agreement Steward. The Eclipse Foundation may assign the responsibility to serve as the Agreement Steward to a suitable separate entity. Each new version of the Agreement will be given a distinguishing version number. The Program (including Contributions) may always be distributed subject to the version of the Agreement under which it was received. In addition, after a new version of the Agreement is published, Contributor may elect to distribute the Program (including its Contributions) under the new version. Except as expressly stated in Sections 2(a) and 2(b) above, Recipient receives no rights or licenses to the intellectual property of any Contributor under this Agreement, whether expressly, by implication, estoppel or otherwise. All rights in the Program not expressly granted under this Agreement are reserved.
-
-This Agreement is governed by the laws of the State of New York and the intellectual property laws of the United States of America. No party to this Agreement will bring a legal action under this Agreement more than one year after the cause of action arose. Each party waives its rights to a jury trial in any resulting litigation.
-   </license>
-
-   <url>
-      <update label="Android Update Site" url="https://dl-ssl.google.com/android/eclipse/"/>
-   </url>
-
-   <requires>
-      <import feature="org.eclipse.cdt"/>
-   </requires>
-
-   <plugin
-         id="com.android.ide.eclipse.ndk"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-</feature>
diff --git a/eclipse/features/com.android.ide.eclipse.ndk/pom.xml b/eclipse/features/com.android.ide.eclipse.ndk/pom.xml
deleted file mode 100644
index 87da6f3..0000000
--- a/eclipse/features/com.android.ide.eclipse.ndk/pom.xml
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-    <modelVersion>4.0.0</modelVersion>
-
-    <version>24.3.3-SNAPSHOT</version>
-    <artifactId>com.android.ide.eclipse.ndk.feature</artifactId>
-    <packaging>eclipse-feature</packaging>
-    <name>ndk</name>
-
-    <parent>
-        <relativePath>../../pom.xml</relativePath>
-        <groupId>adt.group</groupId>
-        <artifactId>parent</artifactId>
-        <version>1.0.0-SNAPSHOT</version>
-    </parent>
-</project>
diff --git a/eclipse/features/com.android.ide.eclipse.pdt/.project b/eclipse/features/com.android.ide.eclipse.pdt/.project
deleted file mode 100644
index 8aa2663..0000000
--- a/eclipse/features/com.android.ide.eclipse.pdt/.project
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>feature-pdt</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.pde.FeatureBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.FeatureNature</nature>
-	</natures>
-</projectDescription>
diff --git a/eclipse/features/com.android.ide.eclipse.pdt/build.properties b/eclipse/features/com.android.ide.eclipse.pdt/build.properties
deleted file mode 100644
index 64f93a9..0000000
--- a/eclipse/features/com.android.ide.eclipse.pdt/build.properties
+++ /dev/null
@@ -1 +0,0 @@
-bin.includes = feature.xml
diff --git a/eclipse/features/com.android.ide.eclipse.pdt/feature.xml b/eclipse/features/com.android.ide.eclipse.pdt/feature.xml
deleted file mode 100644
index 446509a..0000000
--- a/eclipse/features/com.android.ide.eclipse.pdt/feature.xml
+++ /dev/null
@@ -1,245 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<feature
-      id="com.android.ide.eclipse.pdt"
-      label="Android Platform Development Tools"
-      version="24.3.3.qualifier"
-      provider-name="The Android Open Source Project">
-
-   <description>
-      Android Platform Developer Tools.
-   </description>
-
-   <copyright>
-      Copyright (C) 2010-2011 The Android Open Source Project
-   </copyright>
-
-   <license url="http://www.apache.org/licenses/LICENSE-2.0.txt">
-      Apache License
-                           Version 2.0, January 2004
-                        http://www.apache.org/licenses/
-
-   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
-   1. Definitions.
-
-      &quot;License&quot; shall mean the terms and conditions for use, reproduction,
-      and distribution as defined by Sections 1 through 9 of this document.
-
-      &quot;Licensor&quot; shall mean the copyright owner or entity authorized by
-      the copyright owner that is granting the License.
-
-      &quot;Legal Entity&quot; shall mean the union of the acting entity and all
-      other entities that control, are controlled by, or are under common
-      control with that entity. For the purposes of this definition,
-      &quot;control&quot; means (i) the power, direct or indirect, to cause the
-      direction or management of such entity, whether by contract or
-      otherwise, or (ii) ownership of fifty percent (50%) or more of the
-      outstanding shares, or (iii) beneficial ownership of such entity.
-
-      &quot;You&quot; (or &quot;Your&quot;) shall mean an individual or Legal Entity
-      exercising permissions granted by this License.
-
-      &quot;Source&quot; form shall mean the preferred form for making modifications,
-      including but not limited to software source code, documentation
-      source, and configuration files.
-
-      &quot;Object&quot; form shall mean any form resulting from mechanical
-      transformation or translation of a Source form, including but
-      not limited to compiled object code, generated documentation,
-      and conversions to other media types.
-
-      &quot;Work&quot; shall mean the work of authorship, whether in Source or
-      Object form, made available under the License, as indicated by a
-      copyright notice that is included in or attached to the work
-      (an example is provided in the Appendix below).
-
-      &quot;Derivative Works&quot; shall mean any work, whether in Source or Object
-      form, that is based on (or derived from) the Work and for which the
-      editorial revisions, annotations, elaborations, or other modifications
-      represent, as a whole, an original work of authorship. For the purposes
-      of this License, Derivative Works shall not include works that remain
-      separable from, or merely link (or bind by name) to the interfaces of,
-      the Work and Derivative Works thereof.
-
-      &quot;Contribution&quot; shall mean any work of authorship, including
-      the original version of the Work and any modifications or additions
-      to that Work or Derivative Works thereof, that is intentionally
-      submitted to Licensor for inclusion in the Work by the copyright owner
-      or by an individual or Legal Entity authorized to submit on behalf of
-      the copyright owner. For the purposes of this definition, &quot;submitted&quot;
-      means any form of electronic, verbal, or written communication sent
-      to the Licensor or its representatives, including but not limited to
-      communication on electronic mailing lists, source code control systems,
-      and issue tracking systems that are managed by, or on behalf of, the
-      Licensor for the purpose of discussing and improving the Work, but
-      excluding communication that is conspicuously marked or otherwise
-      designated in writing by the copyright owner as &quot;Not a Contribution.&quot;
-
-      &quot;Contributor&quot; shall mean Licensor and any individual or Legal Entity
-      on behalf of whom a Contribution has been received by Licensor and
-      subsequently incorporated within the Work.
-
-   2. Grant of Copyright License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      copyright license to reproduce, prepare Derivative Works of,
-      publicly display, publicly perform, sublicense, and distribute the
-      Work and such Derivative Works in Source or Object form.
-
-   3. Grant of Patent License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      (except as stated in this section) patent license to make, have made,
-      use, offer to sell, sell, import, and otherwise transfer the Work,
-     where such license applies only to those patent claims licensable
-      by such Contributor that are necessarily infringed by their
-      Contribution(s) alone or by combination of their Contribution(s)
-      with the Work to which such Contribution(s) was submitted. If You
-      institute patent litigation against any entity (including a
-      cross-claim or counterclaim in a lawsuit) alleging that the Work
-      or a Contribution incorporated within the Work constitutes direct
-      or contributory patent infringement, then any patent licenses
-      granted to You under this License for that Work shall terminate
-      as of the date such litigation is filed.
-
-   4. Redistribution. You may reproduce and distribute copies of the
-      Work or Derivative Works thereof in any medium, with or without
-      modifications, and in Source or Object form, provided that You
-      meet the following conditions:
-
-      (a) You must give any other recipients of the Work or
-          Derivative Works a copy of this License; and
-
-      (b) You must cause any modified files to carry prominent notices
-          stating that You changed the files; and
-
-      (c) You must retain, in the Source form of any Derivative Works
-          that You distribute, all copyright, patent, trademark, and
-          attribution notices from the Source form of the Work,
-          excluding those notices that do not pertain to any part of
-          the Derivative Works; and
-
-      (d) If the Work includes a &quot;NOTICE&quot; text file as part of its
-          distribution, then any Derivative Works that You distribute must
-          include a readable copy of the attribution notices contained
-          within such NOTICE file, excluding those notices that do not
-          pertain to any part of the Derivative Works, in at least one
-          of the following places: within a NOTICE text file distributed
-          as part of the Derivative Works; within the Source form or
-          documentation, if provided along with the Derivative Works; or,
-          within a display generated by the Derivative Works, if and
-          wherever such third-party notices normally appear. The contents
-          of the NOTICE file are for informational purposes only and
-          do not modify the License. You may add Your own attribution
-          notices within Derivative Works that You distribute, alongside
-          or as an addendum to the NOTICE text from the Work, provided
-          that such additional attribution notices cannot be construed
-          as modifying the License.
-
-      You may add Your own copyright statement to Your modifications and
-      may provide additional or different license terms and conditions
-      for use, reproduction, or distribution of Your modifications, or
-      for any such Derivative Works as a whole, provided Your use,
-      reproduction, and distribution of the Work otherwise complies with
-      the conditions stated in this License.
-
-   5. Submission of Contributions. Unless You explicitly state otherwise,
-      any Contribution intentionally submitted for inclusion in the Work
-      by You to the Licensor shall be under the terms and conditions of
-      this License, without any additional terms or conditions.
-      Notwithstanding the above, nothing herein shall supersede or modify
-      the terms of any separate license agreement you may have executed
-      with Licensor regarding such Contributions.
-
-   6. Trademarks. This License does not grant permission to use the trade
-      names, trademarks, service marks, or product names of the Licensor,
-      except as required for reasonable and customary use in describing the
-      origin of the Work and reproducing the content of the NOTICE file.
-
-   7. Disclaimer of Warranty. Unless required by applicable law or
-      agreed to in writing, Licensor provides the Work (and each
-      Contributor provides its Contributions) on an &quot;AS IS&quot; BASIS,
-      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
-      implied, including, without limitation, any warranties or conditions
-      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
-      PARTICULAR PURPOSE. You are solely responsible for determining the
-      appropriateness of using or redistributing the Work and assume any
-      risks associated with Your exercise of permissions under this License.
-
-   8. Limitation of Liability. In no event and under no legal theory,
-      whether in tort (including negligence), contract, or otherwise,
-      unless required by applicable law (such as deliberate and grossly
-      negligent acts) or agreed to in writing, shall any Contributor be
-      liable to You for damages, including any direct, indirect, special,
-      incidental, or consequential damages of any character arising as a
-      result of this License or out of the use or inability to use the
-      Work (including but not limited to damages for loss of goodwill,
-      work stoppage, computer failure or malfunction, or any and all
-      other commercial damages or losses), even if such Contributor
-      has been advised of the possibility of such damages.
-
-   9. Accepting Warranty or Additional Liability. While redistributing
-      the Work or Derivative Works thereof, You may choose to offer,
-      and charge a fee for, acceptance of support, warranty, indemnity,
-      or other liability obligations and/or rights consistent with this
-      License. However, in accepting such obligations, You may act only
-      on Your own behalf and on Your sole responsibility, not on behalf
-      of any other Contributor, and only if You agree to indemnify,
-      defend, and hold each Contributor harmless for any liability
-      incurred by, or claims asserted against, such Contributor by reason
-      of your accepting any such warranty or additional liability.
-
-   END OF TERMS AND CONDITIONS
-
-   APPENDIX: How to apply the Apache License to your work.
-
-      To apply the Apache License to your work, attach the following
-      boilerplate notice, with the fields enclosed by brackets &quot;[]&quot;
-      replaced with your own identifying information. (Don&apos;t include
-      the brackets!)  The text should be enclosed in the appropriate
-      comment syntax for the file format. We also recommend that a
-      file or class name and description of purpose be included on the
-      same &quot;printed page&quot; as the copyright notice for easier
-      identification within third-party archives.
-
-   Copyright [yyyy] [name of copyright owner]
-
-   Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
-   you may not use this file except in compliance with the License.
-   You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an &quot;AS IS&quot; BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
-   </license>
-
-   <url>
-      <update label="Android Update Site" url="https://dl-ssl.google.com/android/eclipse/"/>
-   </url>
-
-   <requires>
-      <import plugin="org.eclipse.ui"/>
-      <import plugin="org.eclipse.core.runtime"/>
-      <import plugin="com.android.ide.eclipse.ddms"/>
-      <import plugin="org.eclipse.core.resources"/>
-      <import plugin="org.eclipse.jdt.core"/>
-      <import plugin="org.eclipse.jdt.ui"/>
-      <import plugin="org.eclipse.jface.text"/>
-      <import plugin="org.eclipse.ui.editors"/>
-      <import plugin="org.eclipse.jdt.launching"/>
-      <import plugin="org.eclipse.debug.core"/>
-      <import plugin="org.eclipse.debug.ui"/>
-   </requires>
-
-   <plugin
-         id="com.android.ide.eclipse.pdt"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-</feature>
diff --git a/eclipse/features/com.android.ide.eclipse.tests/.project b/eclipse/features/com.android.ide.eclipse.tests/.project
deleted file mode 100644
index e9a6867..0000000
--- a/eclipse/features/com.android.ide.eclipse.tests/.project
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>feature-tests</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.pde.FeatureBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.FeatureNature</nature>
-	</natures>
-</projectDescription>
diff --git a/eclipse/features/com.android.ide.eclipse.tests/build.properties b/eclipse/features/com.android.ide.eclipse.tests/build.properties
deleted file mode 100644
index 64f93a9..0000000
--- a/eclipse/features/com.android.ide.eclipse.tests/build.properties
+++ /dev/null
@@ -1 +0,0 @@
-bin.includes = feature.xml
diff --git a/eclipse/features/com.android.ide.eclipse.tests/feature.xml b/eclipse/features/com.android.ide.eclipse.tests/feature.xml
deleted file mode 100644
index 965e3ec..0000000
--- a/eclipse/features/com.android.ide.eclipse.tests/feature.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<feature
-      id="com.android.ide.eclipse.tests"
-      label="ADT Tests"
-      version="24.3.3.qualifier"
-      provider-name="The Android Open Source Project">
-
-   <copyright>
-      Copyright (C) 2007-2011 The Android Open Source Project
-   </copyright>
-
-   <requires>
-      <import plugin="org.junit"/>
-      <import plugin="com.android.ide.eclipse.adt" version="10.0.0" match="greaterOrEqual"/>
-   </requires>
-
-   <plugin
-         id="com.android.ide.eclipse.tests"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-</feature>
diff --git a/eclipse/features/com.android.ide.eclipse.traceview/.project b/eclipse/features/com.android.ide.eclipse.traceview/.project
deleted file mode 100644
index c6cf73c..0000000
--- a/eclipse/features/com.android.ide.eclipse.traceview/.project
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>feature-traceview</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.pde.FeatureBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.FeatureNature</nature>
-	</natures>
-</projectDescription>
diff --git a/eclipse/features/com.android.ide.eclipse.traceview/build.properties b/eclipse/features/com.android.ide.eclipse.traceview/build.properties
deleted file mode 100644
index 64f93a9..0000000
--- a/eclipse/features/com.android.ide.eclipse.traceview/build.properties
+++ /dev/null
@@ -1 +0,0 @@
-bin.includes = feature.xml
diff --git a/eclipse/features/com.android.ide.eclipse.traceview/feature.xml b/eclipse/features/com.android.ide.eclipse.traceview/feature.xml
deleted file mode 100644
index 43793a6..0000000
--- a/eclipse/features/com.android.ide.eclipse.traceview/feature.xml
+++ /dev/null
@@ -1,239 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<feature
-      id="com.android.ide.eclipse.traceview.feature"
-      label="Android Traceview"
-      version="24.3.3.qualifier"
-      provider-name="The Android Open Source Project"
-      plugin="com.android.ide.eclipse.traceview">
-
-   <description>
-      Android Traceview
-   </description>
-
-   <copyright>
-      Copyright (C) 2011 The Android Open Source Project
-   </copyright>
-
-   <license url="http://www.apache.org/licenses/LICENSE-2.0">
-      Apache License
-                           Version 2.0, January 2004
-                        http://www.apache.org/licenses/
-
-   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
-   1. Definitions.
-
-      &quot;License&quot; shall mean the terms and conditions for use, reproduction,
-      and distribution as defined by Sections 1 through 9 of this document.
-
-      &quot;Licensor&quot; shall mean the copyright owner or entity authorized by
-      the copyright owner that is granting the License.
-
-      &quot;Legal Entity&quot; shall mean the union of the acting entity and all
-      other entities that control, are controlled by, or are under common
-      control with that entity. For the purposes of this definition,
-      &quot;control&quot; means (i) the power, direct or indirect, to cause the
-      direction or management of such entity, whether by contract or
-      otherwise, or (ii) ownership of fifty percent (50%) or more of the
-      outstanding shares, or (iii) beneficial ownership of such entity.
-
-      &quot;You&quot; (or &quot;Your&quot;) shall mean an individual or Legal Entity
-      exercising permissions granted by this License.
-
-      &quot;Source&quot; form shall mean the preferred form for making modifications,
-      including but not limited to software source code, documentation
-      source, and configuration files.
-
-      &quot;Object&quot; form shall mean any form resulting from mechanical
-      transformation or translation of a Source form, including but
-      not limited to compiled object code, generated documentation,
-      and conversions to other media types.
-
-      &quot;Work&quot; shall mean the work of authorship, whether in Source or
-      Object form, made available under the License, as indicated by a
-      copyright notice that is included in or attached to the work
-      (an example is provided in the Appendix below).
-
-      &quot;Derivative Works&quot; shall mean any work, whether in Source or Object
-      form, that is based on (or derived from) the Work and for which the
-      editorial revisions, annotations, elaborations, or other modifications
-      represent, as a whole, an original work of authorship. For the purposes
-      of this License, Derivative Works shall not include works that remain
-      separable from, or merely link (or bind by name) to the interfaces of,
-      the Work and Derivative Works thereof.
-
-      &quot;Contribution&quot; shall mean any work of authorship, including
-      the original version of the Work and any modifications or additions
-      to that Work or Derivative Works thereof, that is intentionally
-      submitted to Licensor for inclusion in the Work by the copyright owner
-      or by an individual or Legal Entity authorized to submit on behalf of
-      the copyright owner. For the purposes of this definition, &quot;submitted&quot;
-      means any form of electronic, verbal, or written communication sent
-      to the Licensor or its representatives, including but not limited to
-      communication on electronic mailing lists, source code control systems,
-      and issue tracking systems that are managed by, or on behalf of, the
-      Licensor for the purpose of discussing and improving the Work, but
-      excluding communication that is conspicuously marked or otherwise
-      designated in writing by the copyright owner as &quot;Not a Contribution.&quot;
-
-      &quot;Contributor&quot; shall mean Licensor and any individual or Legal Entity
-      on behalf of whom a Contribution has been received by Licensor and
-      subsequently incorporated within the Work.
-
-   2. Grant of Copyright License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      copyright license to reproduce, prepare Derivative Works of,
-      publicly display, publicly perform, sublicense, and distribute the
-      Work and such Derivative Works in Source or Object form.
-
-   3. Grant of Patent License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      (except as stated in this section) patent license to make, have made,
-      use, offer to sell, sell, import, and otherwise transfer the Work,
-      where such license applies only to those patent claims licensable
-      by such Contributor that are necessarily infringed by their
-      Contribution(s) alone or by combination of their Contribution(s)
-      with the Work to which such Contribution(s) was submitted. If You
-      institute patent litigation against any entity (including a
-      cross-claim or counterclaim in a lawsuit) alleging that the Work
-      or a Contribution incorporated within the Work constitutes direct
-      or contributory patent infringement, then any patent licenses
-      granted to You under this License for that Work shall terminate
-      as of the date such litigation is filed.
-
-   4. Redistribution. You may reproduce and distribute copies of the
-      Work or Derivative Works thereof in any medium, with or without
-      modifications, and in Source or Object form, provided that You
-      meet the following conditions:
-
-      (a) You must give any other recipients of the Work or
-          Derivative Works a copy of this License; and
-
-      (b) You must cause any modified files to carry prominent notices
-          stating that You changed the files; and
-
-      (c) You must retain, in the Source form of any Derivative Works
-          that You distribute, all copyright, patent, trademark, and
-          attribution notices from the Source form of the Work,
-          excluding those notices that do not pertain to any part of
-          the Derivative Works; and
-
-      (d) If the Work includes a &quot;NOTICE&quot; text file as part of its
-          distribution, then any Derivative Works that You distribute must
-          include a readable copy of the attribution notices contained
-          within such NOTICE file, excluding those notices that do not
-          pertain to any part of the Derivative Works, in at least one
-          of the following places: within a NOTICE text file distributed
-          as part of the Derivative Works; within the Source form or
-          documentation, if provided along with the Derivative Works; or,
-          within a display generated by the Derivative Works, if and
-          wherever such third-party notices normally appear. The contents
-          of the NOTICE file are for informational purposes only and
-          do not modify the License. You may add Your own attribution
-          notices within Derivative Works that You distribute, alongside
-          or as an addendum to the NOTICE text from the Work, provided
-          that such additional attribution notices cannot be construed
-          as modifying the License.
-
-      You may add Your own copyright statement to Your modifications and
-      may provide additional or different license terms and conditions
-      for use, reproduction, or distribution of Your modifications, or
-      for any such Derivative Works as a whole, provided Your use,
-      reproduction, and distribution of the Work otherwise complies with
-      the conditions stated in this License.
-
-   5. Submission of Contributions. Unless You explicitly state otherwise,
-      any Contribution intentionally submitted for inclusion in the Work
-      by You to the Licensor shall be under the terms and conditions of
-      this License, without any additional terms or conditions.
-      Notwithstanding the above, nothing herein shall supersede or modify
-      the terms of any separate license agreement you may have executed
-      with Licensor regarding such Contributions.
-
-   6. Trademarks. This License does not grant permission to use the trade
-      names, trademarks, service marks, or product names of the Licensor,
-      except as required for reasonable and customary use in describing the
-      origin of the Work and reproducing the content of the NOTICE file.
-
-   7. Disclaimer of Warranty. Unless required by applicable law or
-      agreed to in writing, Licensor provides the Work (and each
-      Contributor provides its Contributions) on an &quot;AS IS&quot; BASIS,
-      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
-      implied, including, without limitation, any warranties or conditions
-      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
-      PARTICULAR PURPOSE. You are solely responsible for determining the
-      appropriateness of using or redistributing the Work and assume any
-      risks associated with Your exercise of permissions under this License.
-
-   8. Limitation of Liability. In no event and under no legal theory,
-      whether in tort (including negligence), contract, or otherwise,
-      unless required by applicable law (such as deliberate and grossly
-      negligent acts) or agreed to in writing, shall any Contributor be
-      liable to You for damages, including any direct, indirect, special,
-      incidental, or consequential damages of any character arising as a
-      result of this License or out of the use or inability to use the
-      Work (including but not limited to damages for loss of goodwill,
-      work stoppage, computer failure or malfunction, or any and all
-      other commercial damages or losses), even if such Contributor
-      has been advised of the possibility of such damages.
-
-   9. Accepting Warranty or Additional Liability. While redistributing
-      the Work or Derivative Works thereof, You may choose to offer,
-      and charge a fee for, acceptance of support, warranty, indemnity,
-      or other liability obligations and/or rights consistent with this
-      License. However, in accepting such obligations, You may act only
-      on Your own behalf and on Your sole responsibility, not on behalf
-      of any other Contributor, and only if You agree to indemnify,
-      defend, and hold each Contributor harmless for any liability
-      incurred by, or claims asserted against, such Contributor by reason
-      of your accepting any such warranty or additional liability.
-
-   END OF TERMS AND CONDITIONS
-
-   APPENDIX: How to apply the Apache License to your work.
-
-      To apply the Apache License to your work, attach the following
-      boilerplate notice, with the fields enclosed by brackets &quot;[]&quot;
-      replaced with your own identifying information. (Don&apos;t include
-      the brackets!)  The text should be enclosed in the appropriate
-      comment syntax for the file format. We also recommend that a
-      file or class name and description of purpose be included on the
-      same &quot;printed page&quot; as the copyright notice for easier
-      identification within third-party archives.
-
-   Copyright [yyyy] [name of copyright owner]
-
-   Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
-   you may not use this file except in compliance with the License.
-   You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an &quot;AS IS&quot; BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
-   </license>
-
-   <url>
-      <update label="Android Update Site" url="https://dl-ssl.google.com/android/eclipse/"/>
-   </url>
-
-   <requires>
-      <import plugin="org.eclipse.core.runtime" version="3.7.0" match="greaterOrEqual"/>
-      <import plugin="com.android.ide.eclipse.ddms" version="10.0.0" match="greaterOrEqual"/>
-      <import plugin="org.eclipse.core.filesystem"/>
-      <import plugin="org.eclipse.core.resources"/>
-   </requires>
-
-   <plugin
-         id="com.android.ide.eclipse.traceview"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-</feature>
diff --git a/eclipse/features/com.android.ide.eclipse.traceview/pom.xml b/eclipse/features/com.android.ide.eclipse.traceview/pom.xml
deleted file mode 100644
index eea0f7f..0000000
--- a/eclipse/features/com.android.ide.eclipse.traceview/pom.xml
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-    <modelVersion>4.0.0</modelVersion>
-
-    <version>24.3.3-SNAPSHOT</version>
-    <artifactId>com.android.ide.eclipse.traceview.feature</artifactId>
-    <packaging>eclipse-feature</packaging>
-    <name>traceview</name>
-
-    <parent>
-        <relativePath>../../pom.xml</relativePath>
-        <groupId>adt.group</groupId>
-        <artifactId>parent</artifactId>
-        <version>1.0.0-SNAPSHOT</version>
-    </parent>
-</project>
diff --git a/eclipse/monitor/build.gradle b/eclipse/monitor/build.gradle
deleted file mode 100644
index da8adcf..0000000
--- a/eclipse/monitor/build.gradle
+++ /dev/null
@@ -1,111 +0,0 @@
-apply plugin: 'sdk-files'
-
-def basePath = "../../../out/host/maven/bundles-24.3.3-SNAPSHOT/products/"
-
-sdk {
-    linux {
-        item('monitor') {
-            notice null
-            executable true
-        }
-        item(basePath + 'lin64/monitor') {
-            into 'lib/monitor-x86_64'
-            notice null
-            builtBy 'unzipLinux64'
-        }
-        item(basePath + 'lin/monitor') {
-            into 'lib/monitor-x86'
-            notice null
-            builtBy 'unzipLinux'
-        }
-    }
-
-    mac {
-        item('monitor') {
-            notice null
-            executable true
-        }
-        item(basePath + 'mac64/monitor') {
-            into 'lib/monitor-x86_64'
-            notice null
-            builtBy 'unzipMac64'
-        }
-    }
-
-
-    windows {
-        item('monitor.bat') {
-            notice null
-            executable true
-        }
-        item(basePath + 'win64/monitor') {
-            into 'lib/monitor-x86_64'
-            notice null
-            builtBy 'unzipWin64'
-        }
-        item(basePath + 'win/monitor') {
-            into 'lib/monitor-x86'
-            notice null
-            builtBy 'unzipWin'
-        }
-    }
-}
-
-// Using PDE build, the size of monitor was 43M
-// With Tycho, we are at close to 75M. Until we figure out the proper way
-// to exclude unnecessary content, we just remove these plugins from the final build.
-def pluginsToRemove = [
-    'org.eclipse.platform.doc.user_4.2.2.v20130121-200410.jar',
-    'org.eclipse.debug.ui_3.8.2.v20130130-171415.ja',
-    'org.apache.jasper.glassfish_2.2.2.v201205150955.jar',
-    'org.eclipse.team.ui_3.6.201.v20130125-135424.jar',
-    'org.apache.lucene.core_2.9.1.v201101211721.jar',
-    'org.eclipse.help.webapp_3.6.101.v20130116-182509.jar',
-    'org.eclipse.help.ui_3.5.201.v20130108-092756.jar',
-    'org.eclipse.help.base_3.6.101.v201302041200.jar',
-    'org.eclipse.team.core_3.6.100.v20120524-0627.jar',
-    'org.eclipse.jetty.server_8.1.3.v20120522.jar',
-    'org.eclipse.ui.intro_3.4.200.v20120521-2344.jar',
-    'org.eclipse.ui.cheatsheets_3.4.200.v20120521-2344.jar',
-    'org.apache.ant_1.8.3.v201301120609/**'
-]
-
-task unzipLinux64(type: Copy) {
-    from zipTree(file(basePath + 'monitorproduct-linux.gtk.x86_64.zip'))
-    into file(basePath + 'lin64/')
-    pluginsToRemove.each {
-        exclude "**/$it"
-    }
-}
-
-task unzipLinux(type: Copy) {
-    from zipTree(file(basePath + 'monitorproduct-linux.gtk.x86.zip'))
-    into file(basePath + 'lin/')
-    pluginsToRemove.each {
-        exclude "**/$it"
-    }
-}
-
-task unzipMac64(type: Copy) {
-    from zipTree(file(basePath + 'monitorproduct-macosx.cocoa.x86_64.zip'))
-    into file(basePath + 'mac64/')
-    pluginsToRemove.each {
-        exclude "**/$it"
-    }
-}
-
-task unzipWin64(type: Copy) {
-    from zipTree(file(basePath + 'monitorproduct-win32.win32.x86_64.zip'))
-    into file(basePath + 'win64/')
-    pluginsToRemove.each {
-        exclude "**/$it"
-    }
-}
-
-task unzipWin(type: Copy) {
-    from zipTree(file(basePath + 'monitorproduct-win32.win32.x86.zip'))
-    into file(basePath + 'win/')
-    pluginsToRemove.each {
-        exclude "**/$it"
-    }
-}
diff --git a/eclipse/monitor/monitor b/eclipse/monitor/monitor
deleted file mode 100755
index 53a2bb5..0000000
--- a/eclipse/monitor/monitor
+++ /dev/null
@@ -1,44 +0,0 @@
-#!/bin/bash
-# Copyright 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.
-
-# Set up prog to be the path of this script, including following symlinks,
-# and set up progdir to be the fully-qualified pathname of its directory.
-prog="$0"
-while [ -h "${prog}" ]; do
-    newProg=`/bin/ls -ld "${prog}"`
-    newProg=`expr "${newProg}" : ".* -> \(.*\)$"`
-    if expr "x${newProg}" : 'x/' >/dev/null; then
-        prog="${newProg}"
-    else
-        progdir=`dirname "${prog}"`
-        prog="${progdir}/${newProg}"
-    fi
-done
-oldwd=`pwd`
-progdir=`dirname "${prog}"`
-cd "${progdir}"
-
-javaCmd="java"
-
-vmarch=`${javaCmd} -jar lib/archquery.jar`
-
-app=lib/monitor-${vmarch}/monitor
-if [[ "Darwin" == `uname` ]]; then
-  app=${app}.app/Contents/MacOS/monitor
-fi
-
-
-exec $app
-
diff --git a/eclipse/monitor/monitor.bat b/eclipse/monitor/monitor.bat
deleted file mode 100755
index aab18ae..0000000
--- a/eclipse/monitor/monitor.bat
+++ /dev/null
@@ -1,32 +0,0 @@
-@echo off
-rem Copyright (C) 2012 The Android Open Source Project
-rem
-rem Licensed under the Apache License, Version 2.0 (the "License");
-rem you may not use this file except in compliance with the License.
-rem You may obtain a copy of the License at
-rem
-rem      http://www.apache.org/licenses/LICENSE-2.0
-rem
-rem Unless required by applicable law or agreed to in writing, software
-rem distributed under the License is distributed on an "AS IS" BASIS,
-rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-rem See the License for the specific language governing permissions and
-rem limitations under the License.
-
-rem don't modify the caller's environment
-setlocal
-
-rem Change current directory and drive to where the script is, to avoid
-rem issues with directories containing whitespaces.
-cd /d %~dp0
-
-rem Check we have a valid Java.exe in the path.
-set java_exe=
-call lib\find_java.bat
-if not defined java_exe goto :EOF
-
-:QueryArch
-for /f "delims=" %%a in ('"%java_exe%" -jar lib\archquery.jar') do set vmarch=%%a
-
-start lib\monitor-%vmarch%\monitor
-
diff --git a/eclipse/plugins/.gitignore b/eclipse/plugins/.gitignore
deleted file mode 100644
index 76afe3e..0000000
--- a/eclipse/plugins/.gitignore
+++ /dev/null
@@ -1,7 +0,0 @@
-*/bin
-
-com.android.ide.eclipse.tests/unittests/com/android/ddmlib
-com.android.ide.eclipse.tests/unittests/com/android/sdklib
-com.android.ide.eclipse.tests/unittests/com/android/sdkuilib
-com.android.ide.eclipse.tests/unittests/com/android/layoutlib
-
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt.overlay/.classpath b/eclipse/plugins/com.android.ide.eclipse.adt.overlay/.classpath
deleted file mode 100644
index acad1c2..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt.overlay/.classpath
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt.overlay/.project b/eclipse/plugins/com.android.ide.eclipse.adt.overlay/.project
deleted file mode 100644
index b24d832..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt.overlay/.project
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>plugin-adt-overlay</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.PluginNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt.overlay/.settings/org.eclipse.jdt.core.prefs b/eclipse/plugins/com.android.ide.eclipse.adt.overlay/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index ea66196..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt.overlay/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,98 +0,0 @@
-eclipse.preferences.version=1
-org.eclipse.jdt.core.compiler.annotation.missingNonNullByDefaultAnnotation=ignore
-org.eclipse.jdt.core.compiler.annotation.nonnull=com.android.annotations.NonNull
-org.eclipse.jdt.core.compiler.annotation.nonnullbydefault=com.android.annotations.NonNullByDefault
-org.eclipse.jdt.core.compiler.annotation.nonnullisdefault=disabled
-org.eclipse.jdt.core.compiler.annotation.nullable=com.android.annotations.Nullable
-org.eclipse.jdt.core.compiler.annotation.nullanalysis=enabled
-org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6
-org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.6
-org.eclipse.jdt.core.compiler.debug.lineNumber=generate
-org.eclipse.jdt.core.compiler.debug.localVariable=generate
-org.eclipse.jdt.core.compiler.debug.sourceFile=generate
-org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
-org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
-org.eclipse.jdt.core.compiler.problem.comparingIdentical=warning
-org.eclipse.jdt.core.compiler.problem.deadCode=warning
-org.eclipse.jdt.core.compiler.problem.deprecation=warning
-org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
-org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
-org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
-org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=ignore
-org.eclipse.jdt.core.compiler.problem.fallthroughCase=warning
-org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
-org.eclipse.jdt.core.compiler.problem.fieldHiding=warning
-org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
-org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
-org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
-org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
-org.eclipse.jdt.core.compiler.problem.includeNullInfoFromAsserts=enabled
-org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
-org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=warning
-org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
-org.eclipse.jdt.core.compiler.problem.localVariableHiding=warning
-org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
-org.eclipse.jdt.core.compiler.problem.missingDefaultCase=ignore
-org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=warning
-org.eclipse.jdt.core.compiler.problem.missingEnumCaseDespiteDefault=disabled
-org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=warning
-org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=error
-org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled
-org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
-org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=ignore
-org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
-org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
-org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore
-org.eclipse.jdt.core.compiler.problem.nullAnnotationInferenceConflict=warning
-org.eclipse.jdt.core.compiler.problem.nullReference=warning
-org.eclipse.jdt.core.compiler.problem.nullSpecInsufficientInfo=warning
-org.eclipse.jdt.core.compiler.problem.nullSpecViolation=warning
-org.eclipse.jdt.core.compiler.problem.nullUncheckedConversion=ignore
-org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
-org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
-org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=warning
-org.eclipse.jdt.core.compiler.problem.potentialNullReference=warning
-org.eclipse.jdt.core.compiler.problem.potentialNullSpecViolation=error
-org.eclipse.jdt.core.compiler.problem.potentiallyUnclosedCloseable=warning
-org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
-org.eclipse.jdt.core.compiler.problem.redundantNullAnnotation=warning
-org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
-org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=ignore
-org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=warning
-org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=ignore
-org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=ignore
-org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
-org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
-org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=enabled
-org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
-org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
-org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
-org.eclipse.jdt.core.compiler.problem.unavoidableGenericTypeProblems=disabled
-org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
-org.eclipse.jdt.core.compiler.problem.unclosedCloseable=error
-org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
-org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
-org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=warning
-org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=warning
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.unusedImport=warning
-org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
-org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
-org.eclipse.jdt.core.compiler.problem.unusedObjectAllocation=warning
-org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
-org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
-org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
-org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
-org.eclipse.jdt.core.compiler.source=1.6
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt.overlay/META-INF/MANIFEST.MF b/eclipse/plugins/com.android.ide.eclipse.adt.overlay/META-INF/MANIFEST.MF
deleted file mode 100644
index d1f897e..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt.overlay/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,19 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: ADT XML Overlay
-Bundle-SymbolicName: overlay.com.android.ide.eclipse.adt.overlay;singleton:=true
-Bundle-Version: 24.3.3.qualifier
-Bundle-Vendor: The Android Open Source Project
-Require-Bundle: org.eclipse.core.runtime,
- org.eclipse.core.resources,
- org.eclipse.ui,
- org.eclipse.debug.core,
- org.eclipse.debug.ui,
- org.eclipse.wst.sse.core,
- org.eclipse.wst.sse.ui,
- org.eclipse.wst.xml.core,
- org.eclipse.wst.xml.ui,
- com.android.ide.eclipse.adt
-Bundle-ActivationPolicy: lazy
-Import-Package: org.eclipse.jface.text.formatter
-Bundle-RequiredExecutionEnvironment: JavaSE-1.6
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt.overlay/MODULE_LICENSE_EPL b/eclipse/plugins/com.android.ide.eclipse.adt.overlay/MODULE_LICENSE_EPL
deleted file mode 100644
index e69de29..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt.overlay/MODULE_LICENSE_EPL
+++ /dev/null
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt.overlay/NOTICE b/eclipse/plugins/com.android.ide.eclipse.adt.overlay/NOTICE
deleted file mode 100644
index cedb5b4..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt.overlay/NOTICE
+++ /dev/null
@@ -1,221 +0,0 @@
-*Eclipse Public License - v 1.0*
-
-THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE
-PUBLIC LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION OF
-THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT.
-
-*1. DEFINITIONS*
-
-"Contribution" means:
-
-a) in the case of the initial Contributor, the initial code and
-documentation distributed under this Agreement, and
-b) in the case of each subsequent Contributor:
-
-i) changes to the Program, and
-
-ii) additions to the Program;
-
-where such changes and/or additions to the Program originate from and
-are distributed by that particular Contributor. A Contribution
-'originates' from a Contributor if it was added to the Program by such
-Contributor itself or anyone acting on such Contributor's behalf.
-Contributions do not include additions to the Program which: (i) are
-separate modules of software distributed in conjunction with the Program
-under their own license agreement, and (ii) are not derivative works of
-the Program.
-
-"Contributor" means any person or entity that distributes the Program.
-
-"Licensed Patents " mean patent claims licensable by a Contributor which
-are necessarily infringed by the use or sale of its Contribution alone
-or when combined with the Program.
-
-"Program" means the Contributions distributed in accordance with this
-Agreement.
-
-"Recipient" means anyone who receives the Program under this Agreement,
-including all Contributors.
-
-*2. GRANT OF RIGHTS*
-
-a) Subject to the terms of this Agreement, each Contributor hereby
-grants Recipient a non-exclusive, worldwide, royalty-free copyright
-license to reproduce, prepare derivative works of, publicly display,
-publicly perform, distribute and sublicense the Contribution of such
-Contributor, if any, and such derivative works, in source code and
-object code form.
-
-b) Subject to the terms of this Agreement, each Contributor hereby
-grants Recipient a non-exclusive, worldwide, royalty-free patent license
-under Licensed Patents to make, use, sell, offer to sell, import and
-otherwise transfer the Contribution of such Contributor, if any, in
-source code and object code form. This patent license shall apply to the
-combination of the Contribution and the Program if, at the time the
-Contribution is added by the Contributor, such addition of the
-Contribution causes such combination to be covered by the Licensed
-Patents. The patent license shall not apply to any other combinations
-which include the Contribution. No hardware per se is licensed hereunder.
-
-c) Recipient understands that although each Contributor grants the
-licenses to its Contributions set forth herein, no assurances are
-provided by any Contributor that the Program does not infringe the
-patent or other intellectual property rights of any other entity. Each
-Contributor disclaims any liability to Recipient for claims brought by
-any other entity based on infringement of intellectual property rights
-or otherwise. As a condition to exercising the rights and licenses
-granted hereunder, each Recipient hereby assumes sole responsibility to
-secure any other intellectual property rights needed, if any. For
-example, if a third party patent license is required to allow Recipient
-to distribute the Program, it is Recipient's responsibility to acquire
-that license before distributing the Program.
-
-d) Each Contributor represents that to its knowledge it has sufficient
-copyright rights in its Contribution, if any, to grant the copyright
-license set forth in this Agreement.
-
-*3. REQUIREMENTS*
-
-A Contributor may choose to distribute the Program in object code form
-under its own license agreement, provided that:
-
-a) it complies with the terms and conditions of this Agreement; and
-
-b) its license agreement:
-
-i) effectively disclaims on behalf of all Contributors all warranties
-and conditions, express and implied, including warranties or conditions
-of title and non-infringement, and implied warranties or conditions of
-merchantability and fitness for a particular purpose;
-
-ii) effectively excludes on behalf of all Contributors all liability for
-damages, including direct, indirect, special, incidental and
-consequential damages, such as lost profits;
-
-iii) states that any provisions which differ from this Agreement are
-offered by that Contributor alone and not by any other party; and
-
-iv) states that source code for the Program is available from such
-Contributor, and informs licensees how to obtain it in a reasonable
-manner on or through a medium customarily used for software exchange.
-
-When the Program is made available in source code form:
-
-a) it must be made available under this Agreement; and
-
-b) a copy of this Agreement must be included with each copy of the Program.
-
-Contributors may not remove or alter any copyright notices contained
-within the Program.
-
-Each Contributor must identify itself as the originator of its
-Contribution, if any, in a manner that reasonably allows subsequent
-Recipients to identify the originator of the Contribution.
-
-*4. COMMERCIAL DISTRIBUTION*
-
-Commercial distributors of software may accept certain responsibilities
-with respect to end users, business partners and the like. While this
-license is intended to facilitate the commercial use of the Program, the
-Contributor who includes the Program in a commercial product offering
-should do so in a manner which does not create potential liability for
-other Contributors. Therefore, if a Contributor includes the Program in
-a commercial product offering, such Contributor ("Commercial
-Contributor") hereby agrees to defend and indemnify every other
-Contributor ("Indemnified Contributor") against any losses, damages and
-costs (collectively "Losses") arising from claims, lawsuits and other
-legal actions brought by a third party against the Indemnified
-Contributor to the extent caused by the acts or omissions of such
-Commercial Contributor in connection with its distribution of the
-Program in a commercial product offering. The obligations in this
-section do not apply to any claims or Losses relating to any actual or
-alleged intellectual property infringement. In order to qualify, an
-Indemnified Contributor must: a) promptly notify the Commercial
-Contributor in writing of such claim, and b) allow the Commercial
-Contributor to control, and cooperate with the Commercial Contributor
-in, the defense and any related settlement negotiations. The Indemnified
-Contributor may participate in any such claim at its own expense.
-
-For example, a Contributor might include the Program in a commercial
-product offering, Product X. That Contributor is then a Commercial
-Contributor. If that Commercial Contributor then makes performance
-claims, or offers warranties related to Product X, those performance
-claims and warranties are such Commercial Contributor's responsibility
-alone. Under this section, the Commercial Contributor would have to
-defend claims against the other Contributors related to those
-performance claims and warranties, and if a court requires any other
-Contributor to pay any damages as a result, the Commercial Contributor
-must pay those damages.
-
-*5. NO WARRANTY*
-
-EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS PROVIDED
-ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
-EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES
-OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR
-A PARTICULAR PURPOSE. Each Recipient is solely responsible for
-determining the appropriateness of using and distributing the Program
-and assumes all risks associated with its exercise of rights under this
-Agreement , including but not limited to the risks and costs of program
-errors, compliance with applicable laws, damage to or loss of data,
-programs or equipment, and unavailability or interruption of operations.
-
-*6. DISCLAIMER OF LIABILITY*
-
-EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT NOR
-ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT,
-INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING
-WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF
-LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
-NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR
-DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED
-HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
-
-*7. GENERAL*
-
-If any provision of this Agreement is invalid or unenforceable under
-applicable law, it shall not affect the validity or enforceability of
-the remainder of the terms of this Agreement, and without further action
-by the parties hereto, such provision shall be reformed to the minimum
-extent necessary to make such provision valid and enforceable.
-
-If Recipient institutes patent litigation against any entity (including
-a cross-claim or counterclaim in a lawsuit) alleging that the Program
-itself (excluding combinations of the Program with other software or
-hardware) infringes such Recipient's patent(s), then such Recipient's
-rights granted under Section 2(b) shall terminate as of the date such
-litigation is filed.
-
-All Recipient's rights under this Agreement shall terminate if it fails
-to comply with any of the material terms or conditions of this Agreement
-and does not cure such failure in a reasonable period of time after
-becoming aware of such noncompliance. If all Recipient's rights under
-this Agreement terminate, Recipient agrees to cease use and distribution
-of the Program as soon as reasonably practicable. However, Recipient's
-obligations under this Agreement and any licenses granted by Recipient
-relating to the Program shall continue and survive.
-
-Everyone is permitted to copy and distribute copies of this Agreement,
-but in order to avoid inconsistency the Agreement is copyrighted and may
-only be modified in the following manner. The Agreement Steward reserves
-the right to publish new versions (including revisions) of this
-Agreement from time to time. No one other than the Agreement Steward has
-the right to modify this Agreement. The Eclipse Foundation is the
-initial Agreement Steward. The Eclipse Foundation may assign the
-responsibility to serve as the Agreement Steward to a suitable separate
-entity. Each new version of the Agreement will be given a distinguishing
-version number. The Program (including Contributions) may always be
-distributed subject to the version of the Agreement under which it was
-received. In addition, after a new version of the Agreement is
-published, Contributor may elect to distribute the Program (including
-its Contributions) under the new version. Except as expressly stated in
-Sections 2(a) and 2(b) above, Recipient receives no rights or licenses
-to the intellectual property of any Contributor under this Agreement,
-whether expressly, by implication, estoppel or otherwise. All rights in
-the Program not expressly granted under this Agreement are reserved.
-
-This Agreement is governed by the laws of the State of New York and the
-intellectual property laws of the United States of America. No party to
-this Agreement will bring a legal action under this Agreement more than
-one year after the cause of action arose. Each party waives its rights
-to a jury trial in any resulting litigation.
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt.overlay/README.txt b/eclipse/plugins/com.android.ide.eclipse.adt.overlay/README.txt
deleted file mode 100644
index 7b7f0d1..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt.overlay/README.txt
+++ /dev/null
@@ -1,14 +0,0 @@
-This plugin provides a minor extension to the ADT plugin to support
-XML formatting via the "Source > Format" action on files.
-
-The reason the plugin package name starts with the word "overlay"
-instead of the normal "com.android.eclipse" package is that the plugin
-name *must* be alphabetically later than "org.eclipse". The reasons
-for this is detailed in issue
-   http://code.google.com/p/android/issues/detail?id=20450
-but essentially the plugin registration to override the
-formatProcessor is processed in the alphabetical order of the plugin
-names, so the org.eclipse plugin would clobber the com.android.eclipse
-plugin. To work around this, the specific registration code was moved
-out to a separate plugin, but the formatter itself continues to live
-in ADT.
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt.overlay/build.properties b/eclipse/plugins/com.android.ide.eclipse.adt.overlay/build.properties
deleted file mode 100644
index 50668f3..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt.overlay/build.properties
+++ /dev/null
@@ -1,4 +0,0 @@
-bin.includes = META-INF/,\
-               plugin.xml,\
-               NOTICE
-jars.compile.order =
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt.overlay/plugin.xml b/eclipse/plugins/com.android.ide.eclipse.adt.overlay/plugin.xml
deleted file mode 100644
index 5b4b520..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt.overlay/plugin.xml
+++ /dev/null
@@ -1,10 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.5"?>
-<plugin>
-    <extension point="org.eclipse.wst.sse.core.formatProcessors">
-        <processor
-            class="com.android.ide.eclipse.adt.internal.editors.formatting.XmlFormatProcessor"
-            contentTypeId="org.eclipse.core.runtime.xml">
-        </processor>
-    </extension>
-</plugin>
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt.overlay/pom.xml b/eclipse/plugins/com.android.ide.eclipse.adt.overlay/pom.xml
deleted file mode 100644
index 6dbe3d2..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt.overlay/pom.xml
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-    <modelVersion>4.0.0</modelVersion>
-
-    <version>24.3.3-SNAPSHOT</version>
-    <artifactId>overlay.com.android.ide.eclipse.adt.overlay</artifactId>
-    <packaging>eclipse-plugin</packaging>
-    <name>adt.overlay</name>
-
-    <parent>
-        <relativePath>../../pom.xml</relativePath>
-        <groupId>adt.group</groupId>
-        <artifactId>parent</artifactId>
-        <version>1.0.0-SNAPSHOT</version>
-    </parent>
-</project>
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt.package/.project b/eclipse/plugins/com.android.ide.eclipse.adt.package/.project
deleted file mode 100644
index eedf4c6..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt.package/.project
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>plugin-adt-package</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.PluginNature</nature>
-	</natures>
-</projectDescription>
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt.package/META-INF/MANIFEST.MF b/eclipse/plugins/com.android.ide.eclipse.adt.package/META-INF/MANIFEST.MF
deleted file mode 100644
index 999aead..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt.package/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,10 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: ADT Package
-Bundle-SymbolicName: com.android.ide.eclipse.adt.package;singleton:=true
-Bundle-Version: 24.3.3.qualifier
-Bundle-Vendor: The Android Open Source Project
-Bundle-RequiredExecutionEnvironment: JavaSE-1.6
-Eclipse-BundleShape: dir
-Require-Bundle: org.eclipse.platform,
- org.eclipse.equinox.app
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt.package/about.ini b/eclipse/plugins/com.android.ide.eclipse.adt.package/about.ini
deleted file mode 100644
index 31e8489..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt.package/about.ini
+++ /dev/null
@@ -1,5 +0,0 @@
-aboutText=%blurb
-featureImage=icons/adt32.png
-windowImage=icons/adt16.png
-aboutImage=adt-about.png
-appName=ADT
\ No newline at end of file
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt.package/about.properties b/eclipse/plugins/com.android.ide.eclipse.adt.package/about.properties
deleted file mode 100644
index 4f75169..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt.package/about.properties
+++ /dev/null
@@ -1,6 +0,0 @@
-blurb=Android Developer Tools\n\
-\n\
-Build: {0}\n\
-\n\
-Copyright (c) The Android Open Source Project.\n\
-Visit http://developer.android.com and http://source.android.com
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt.package/adt-about.png b/eclipse/plugins/com.android.ide.eclipse.adt.package/adt-about.png
deleted file mode 100644
index 7235e49..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt.package/adt-about.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt.package/build.properties b/eclipse/plugins/com.android.ide.eclipse.adt.package/build.properties
deleted file mode 100644
index 0688953..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt.package/build.properties
+++ /dev/null
@@ -1,11 +0,0 @@
-source.. = src/
-output.. = bin/
-bin.includes = META-INF/,\
-               plugin.xml,\
-               .,\
-               plugin_customization.ini,\
-               adt-about.png,\
-               splash.bmp,\
-               icons/,\
-               about.ini,\
-               about.properties
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt.package/icons/adt.icns b/eclipse/plugins/com.android.ide.eclipse.adt.package/icons/adt.icns
deleted file mode 100644
index b29e329..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt.package/icons/adt.icns
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt.package/icons/adt.ico b/eclipse/plugins/com.android.ide.eclipse.adt.package/icons/adt.ico
deleted file mode 100644
index 5ea4275..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt.package/icons/adt.ico
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt.package/icons/adt.png b/eclipse/plugins/com.android.ide.eclipse.adt.package/icons/adt.png
deleted file mode 100644
index 1f76f87..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt.package/icons/adt.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt.package/icons/adt16.png b/eclipse/plugins/com.android.ide.eclipse.adt.package/icons/adt16.png
deleted file mode 100644
index bbd14be..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt.package/icons/adt16.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt.package/icons/adt32.png b/eclipse/plugins/com.android.ide.eclipse.adt.package/icons/adt32.png
deleted file mode 100644
index 0ef9fdf..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt.package/icons/adt32.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt.package/icons/adt48.png b/eclipse/plugins/com.android.ide.eclipse.adt.package/icons/adt48.png
deleted file mode 100644
index ab846e1..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt.package/icons/adt48.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt.package/plugin.xml b/eclipse/plugins/com.android.ide.eclipse.adt.package/plugin.xml
deleted file mode 100644
index 7974659..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt.package/plugin.xml
+++ /dev/null
@@ -1,71 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.4"?>
-<plugin>
-   <extension
-         id="adtproduct"
-         name="ADT Bundle"
-         point="org.eclipse.core.runtime.products">
-      <product
-            application="org.eclipse.ui.ide.workbench"
-            name="Eclipse">
-         <property
-            name="preferenceCustomization"
-            value="plugin_customization.ini" />
-         <property
-            name="appName"
-            value="Eclipse" />
-         <property
-            name="aboutImage"
-            value="adt-about.png">
-         </property>
-         <property
-            name="aboutText"
-            value="Android Developer Tools&#x0A;&#x0A;This product includes Eclipse Platform, JDT, CDT, EMF, GEF and WTP, all of which are&#x0A;Copyright (c) Eclipse contributors and others.&#x0A;Visit http://eclipse.org/&#x0A;&#x0A;Android Developer Tools are Copyright (c) The Android Open Source Project.&#x0A;Visit http://developer.android.com">
-         </property>
-         <property
-            name="startupProgressRect"
-            value="216,229,170,4" />
-         <property
-            name="startupMessageRect"
-            value="216,240,265,30" />
-         <property
-            name="startupForegroundColor"
-            value="999999" />
-         <property
-            name="windowImages"
-            value="icons/adt16.png,icons/adt32.png,icons/adt48.png">
-         </property>
-         <property
-            name="introBrandingImage"
-            value="product:intro-eclipse.png">
-         </property>
-         <property
-            name="introTitle"
-            value="Welcome to the Eclipse IDE for Android Developers">
-         </property>
-         <property
-            name="introBrandingImageText"
-            value="Eclipse Project">
-         </property>
-         <property
-            name="applicationXMI"
-            value="org.eclipse.platform/LegacyIDE.e4xmi">
-         </property>
-         <property
-            name="cssTheme"
-            value="org.eclipse.e4.ui.css.theme.e4_default">
-         </property>
-         <property
-            name="applicationCSSResources"
-            value="platform:/plugin/org.eclipse.ui.themes/images/">
-         </property>
-      </product>
-   </extension>
-   <extension
-         point="org.eclipse.ui.intro">
-      <introProductBinding
-            introId="org.eclipse.ui.intro.universal"
-            productId="com.android.ide.eclipse.adt.package.product">
-      </introProductBinding>
-   </extension>
-</plugin>
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt.package/plugin_customization.ini b/eclipse/plugins/com.android.ide.eclipse.adt.package/plugin_customization.ini
deleted file mode 100644
index 5585184..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt.package/plugin_customization.ini
+++ /dev/null
@@ -1,8 +0,0 @@
-org.eclipse.ui/defaultPerspectiveId=org.eclipse.jdt.ui.JavaPerspective
-org.eclipse.ui/SHOW_TRADITIONAL_STYLE_TABS=false
-org.eclipse.ui/DOCK_PERSPECTIVE_BAR=topRight
-org.eclipse.ui/PERSPECTIVE_BAR_EXTRAS=com.android.ide.eclipse.ddms.Perspective
-org.eclipse.ui/PERSPECTIVE_BAR_SIZE=250
-org.eclipse.ui/SHOW_PROGRESS_ON_STARTUP = false
-org.eclipse.ui.workbench/SHOW_BUILDID_ON_STARTUP=true
-org.eclipse.ui/SHOW_MEMORY_MONITOR=true
\ No newline at end of file
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt.package/pom.xml b/eclipse/plugins/com.android.ide.eclipse.adt.package/pom.xml
deleted file mode 100644
index f6000ce..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt.package/pom.xml
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-    <modelVersion>4.0.0</modelVersion>
-
-    <version>24.3.3-SNAPSHOT</version>
-    <artifactId>com.android.ide.eclipse.adt.package</artifactId>
-    <packaging>eclipse-plugin</packaging>
-    <name>adt.package</name>
-
-    <parent>
-        <relativePath>../../pom.xml</relativePath>
-        <groupId>adt.group</groupId>
-        <artifactId>parent</artifactId>
-        <version>1.0.0-SNAPSHOT</version>
-    </parent>
-</project>
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt.package/splash.bmp b/eclipse/plugins/com.android.ide.eclipse.adt.package/splash.bmp
deleted file mode 100644
index 0af8058..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt.package/splash.bmp
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/.classpath b/eclipse/plugins/com.android.ide.eclipse.adt/.classpath
deleted file mode 100644
index c5f5919..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/.classpath
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry excluding="Makefile|resources/" kind="src" path="src"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry exported="true" kind="lib" path="libs/ninepatch.jar" sourcepath="/ninepatch"/>
-	<classpathentry exported="true" kind="lib" path="libs/sdkuilib.jar" sourcepath="/sdkuilib"/>
-	<classpathentry exported="true" kind="lib" path="libs/rule-api.jar" sourcepath="/rule-api"/>
-	<classpathentry exported="true" kind="lib" path="libs/lint-api.jar" sourcepath="/lint-api"/>
-	<classpathentry exported="true" kind="lib" path="libs/lint-checks.jar" sourcepath="/lint-checks"/>
-	<classpathentry exported="true" kind="lib" path="libs/asset-studio.jar" sourcepath="/asset-studio"/>
-	<classpathentry exported="true" kind="lib" path="libs/ant-glob.jar"/>
-	<classpathentry exported="true" kind="lib" path="libs/freemarker-2.3.20.jar"/>
-	<classpathentry exported="true" kind="lib" path="libs/manifest-merger.jar" sourcepath="/ManifestMerger"/>
-	<classpathentry exported="true" kind="lib" path="libs/lombok-ast-0.2.2.jar"/>
-	<classpathentry exported="true" kind="lib" path="libs/propertysheet.jar"/>
-	<classpathentry exported="true" kind="lib" path="libs/asm-5.0.3.jar"/>
-	<classpathentry exported="true" kind="lib" path="libs/asm-analysis-5.0.3.jar"/>
-	<classpathentry exported="true" kind="lib" path="libs/asm-tree-5.0.3.jar"/>
-	<classpathentry exported="true" kind="lib" path="libs/swtmenubar.jar"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/.gitignore b/eclipse/plugins/com.android.ide.eclipse.adt/.gitignore
deleted file mode 100644
index 5e56e04..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/.gitignore
+++ /dev/null
@@ -1 +0,0 @@
-/bin
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/.project b/eclipse/plugins/com.android.ide.eclipse.adt/.project
deleted file mode 100644
index 0bc58f9..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/.project
+++ /dev/null
@@ -1,30 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>plugin-adt</name>
-	<comment></comment>
-	<projects>
-		<project>SdkLib</project>
-		<project>SdkUiLib</project>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.PluginNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/.settings/org.eclipse.core.resources.prefs b/eclipse/plugins/com.android.ide.eclipse.adt/.settings/org.eclipse.core.resources.prefs
deleted file mode 100644
index b3c7fde..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/.settings/org.eclipse.core.resources.prefs
+++ /dev/null
@@ -1 +0,0 @@
-eclipse.preferences.version=1
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/.settings/org.eclipse.jdt.core.prefs b/eclipse/plugins/com.android.ide.eclipse.adt/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index ea66196..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,98 +0,0 @@
-eclipse.preferences.version=1
-org.eclipse.jdt.core.compiler.annotation.missingNonNullByDefaultAnnotation=ignore
-org.eclipse.jdt.core.compiler.annotation.nonnull=com.android.annotations.NonNull
-org.eclipse.jdt.core.compiler.annotation.nonnullbydefault=com.android.annotations.NonNullByDefault
-org.eclipse.jdt.core.compiler.annotation.nonnullisdefault=disabled
-org.eclipse.jdt.core.compiler.annotation.nullable=com.android.annotations.Nullable
-org.eclipse.jdt.core.compiler.annotation.nullanalysis=enabled
-org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6
-org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.6
-org.eclipse.jdt.core.compiler.debug.lineNumber=generate
-org.eclipse.jdt.core.compiler.debug.localVariable=generate
-org.eclipse.jdt.core.compiler.debug.sourceFile=generate
-org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
-org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
-org.eclipse.jdt.core.compiler.problem.comparingIdentical=warning
-org.eclipse.jdt.core.compiler.problem.deadCode=warning
-org.eclipse.jdt.core.compiler.problem.deprecation=warning
-org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
-org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
-org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
-org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=ignore
-org.eclipse.jdt.core.compiler.problem.fallthroughCase=warning
-org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
-org.eclipse.jdt.core.compiler.problem.fieldHiding=warning
-org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
-org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
-org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
-org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
-org.eclipse.jdt.core.compiler.problem.includeNullInfoFromAsserts=enabled
-org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
-org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=warning
-org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
-org.eclipse.jdt.core.compiler.problem.localVariableHiding=warning
-org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
-org.eclipse.jdt.core.compiler.problem.missingDefaultCase=ignore
-org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=warning
-org.eclipse.jdt.core.compiler.problem.missingEnumCaseDespiteDefault=disabled
-org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=warning
-org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=error
-org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled
-org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
-org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=ignore
-org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
-org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
-org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore
-org.eclipse.jdt.core.compiler.problem.nullAnnotationInferenceConflict=warning
-org.eclipse.jdt.core.compiler.problem.nullReference=warning
-org.eclipse.jdt.core.compiler.problem.nullSpecInsufficientInfo=warning
-org.eclipse.jdt.core.compiler.problem.nullSpecViolation=warning
-org.eclipse.jdt.core.compiler.problem.nullUncheckedConversion=ignore
-org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
-org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
-org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=warning
-org.eclipse.jdt.core.compiler.problem.potentialNullReference=warning
-org.eclipse.jdt.core.compiler.problem.potentialNullSpecViolation=error
-org.eclipse.jdt.core.compiler.problem.potentiallyUnclosedCloseable=warning
-org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
-org.eclipse.jdt.core.compiler.problem.redundantNullAnnotation=warning
-org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
-org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=ignore
-org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=warning
-org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=ignore
-org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=ignore
-org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
-org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
-org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=enabled
-org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
-org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
-org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
-org.eclipse.jdt.core.compiler.problem.unavoidableGenericTypeProblems=disabled
-org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
-org.eclipse.jdt.core.compiler.problem.unclosedCloseable=error
-org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
-org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
-org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=warning
-org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=warning
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.unusedImport=warning
-org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
-org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
-org.eclipse.jdt.core.compiler.problem.unusedObjectAllocation=warning
-org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
-org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
-org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
-org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
-org.eclipse.jdt.core.compiler.source=1.6
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/.settings/org.moreunit.prefs b/eclipse/plugins/com.android.ide.eclipse.adt/.settings/org.moreunit.prefs
deleted file mode 100644
index c5e8a5e..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/.settings/org.moreunit.prefs
+++ /dev/null
@@ -1,4 +0,0 @@
-eclipse.preferences.version=1
-org.moreunit.prefixes=
-org.moreunit.unitsourcefolder=plugin-adt\:src\:plugin-tests\:unittests\#plugin-adt\:src\:plugin-tests\:src
-org.moreunit.useprojectsettings=true
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
deleted file mode 100644
index 3115f79..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,140 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: Android Development Toolkit
-Bundle-SymbolicName: com.android.ide.eclipse.adt;singleton:=true
-Bundle-Version: 24.3.3.qualifier
-Bundle-ClassPath: .,
- libs/sdkuilib.jar,
- libs/ninepatch.jar,
- libs/freemarker-2.3.20.jar,
- libs/rule-api.jar,
- libs/asset-studio.jar,
- libs/lint-api.jar,
- libs/lint-checks.jar,
- libs/lombok-ast-0.2.3.jar,
- libs/asm-5.0.3.jar,
- libs/asm-tree-5.0.3.jar,
- libs/asm-analysis-5.0.3.jar,
- libs/propertysheet.jar,
- libs/ant-glob.jar,
- libs/swtmenubar.jar,
- libs/manifest-merger.jar
-Bundle-Activator: com.android.ide.eclipse.adt.AdtPlugin
-Bundle-Vendor: The Android Open Source Project
-Require-Bundle: com.android.ide.eclipse.base,
- com.android.ide.eclipse.ddms,
- org.eclipse.core.runtime,
- org.eclipse.core.resources,
- org.eclipse.debug.core,
- org.eclipse.debug.ui,
- org.eclipse.jdt,
- org.eclipse.ant.core,
- org.eclipse.jdt.core,
- org.eclipse.jdt.ui,
- org.eclipse.jdt.launching,
- org.eclipse.jface.text,
- org.eclipse.ui.editors,
- org.eclipse.ui.workbench.texteditor,
- org.eclipse.ui.console,
- org.eclipse.core.filesystem,
- org.eclipse.ui,
- org.eclipse.ui.ide,
- org.eclipse.ui.forms,
- org.eclipse.ui.browser,
- org.eclipse.ui.views,
- org.eclipse.wst.sse.core,
- org.eclipse.wst.sse.ui,
- org.eclipse.wst.xml.core,
- org.eclipse.wst.xml.ui,
- org.eclipse.jdt.junit,
- org.eclipse.jdt.junit.runtime,
- org.eclipse.ltk.core.refactoring,
- org.eclipse.ltk.ui.refactoring,
- org.eclipse.core.expressions,
- org.eclipse.compare
-Bundle-ActivationPolicy: lazy
-Export-Package: 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.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.package",
- com.android.ide.eclipse.adt.internal;x-friends:="com.android.ide.eclipse.tests",
- com.android.ide.eclipse.adt.internal.actions;x-friends:="com.android.ide.eclipse.tests",
- com.android.ide.eclipse.adt.internal.assetstudio;x-friends:="com.android.ide.eclipse.tests",
- com.android.ide.eclipse.adt.internal.build;x-friends:="com.android.ide.eclipse.tests",
- com.android.ide.eclipse.adt.internal.build.builders;x-friends:="com.android.ide.eclipse.tests",
- com.android.ide.eclipse.adt.internal.editors;x-friends:="com.android.ide.eclipse.tests",
- com.android.ide.eclipse.adt.internal.editors.animator;x-friends:="com.android.ide.eclipse.tests",
- com.android.ide.eclipse.adt.internal.editors.binaryxml;x-friends:="com.android.ide.eclipse.tests",
- com.android.ide.eclipse.adt.internal.editors.color;x-friends:="com.android.ide.eclipse.tests",
- com.android.ide.eclipse.adt.internal.editors.common;x-friends:="com.android.ide.eclipse.tests",
- com.android.ide.eclipse.adt.internal.editors.descriptors;x-friends:="com.android.ide.eclipse.tests",
- com.android.ide.eclipse.adt.internal.editors.drawable;x-friends:="com.android.ide.eclipse.tests",
- com.android.ide.eclipse.adt.internal.editors.export;x-friends:="com.android.ide.eclipse.tests",
- com.android.ide.eclipse.adt.internal.editors.formatting;x-friends:="overlay.com.android.ide.eclipse.adt.overlay,com.android.ide.eclipse.tests",
- com.android.ide.eclipse.adt.internal.editors.layout;x-friends:="com.android.ide.eclipse.tests",
- com.android.ide.eclipse.adt.internal.editors.layout.configuration;x-friends:="com.android.ide.eclipse.tests",
- com.android.ide.eclipse.adt.internal.editors.layout.descriptors;x-friends:="com.android.ide.eclipse.tests",
- com.android.ide.eclipse.adt.internal.editors.layout.gle2;x-friends:="com.android.ide.eclipse.tests",
- com.android.ide.eclipse.adt.internal.editors.layout.gre;x-friends:="com.android.ide.eclipse.tests",
- com.android.ide.eclipse.adt.internal.editors.layout.properties;x-friends:="com.android.ide.eclipse.tests",
- com.android.ide.eclipse.adt.internal.editors.layout.refactoring;x-friends:="com.android.ide.eclipse.tests",
- com.android.ide.eclipse.adt.internal.editors.layout.uimodel;x-friends:="com.android.ide.eclipse.tests",
- com.android.ide.eclipse.adt.internal.editors.manifest;x-friends:="com.android.ide.eclipse.tests",
- com.android.ide.eclipse.adt.internal.editors.manifest.descriptors;x-friends:="com.android.ide.eclipse.tests",
- com.android.ide.eclipse.adt.internal.editors.manifest.model;x-friends:="com.android.ide.eclipse.tests",
- com.android.ide.eclipse.adt.internal.editors.manifest.pages;x-friends:="com.android.ide.eclipse.tests",
- com.android.ide.eclipse.adt.internal.editors.menu;x-friends:="com.android.ide.eclipse.tests",
- com.android.ide.eclipse.adt.internal.editors.menu.descriptors;x-friends:="com.android.ide.eclipse.tests",
- com.android.ide.eclipse.adt.internal.editors.otherxml;x-friends:="com.android.ide.eclipse.tests",
- com.android.ide.eclipse.adt.internal.editors.otherxml.descriptors;x-friends:="com.android.ide.eclipse.tests",
- com.android.ide.eclipse.adt.internal.editors.ui;x-friends:="com.android.ide.eclipse.tests",
- com.android.ide.eclipse.adt.internal.editors.ui.tree;x-friends:="com.android.ide.eclipse.tests",
- com.android.ide.eclipse.adt.internal.editors.uimodel;x-friends:="com.android.ide.eclipse.tests",
- com.android.ide.eclipse.adt.internal.editors.values;x-friends:="com.android.ide.eclipse.tests",
- com.android.ide.eclipse.adt.internal.editors.values.descriptors;x-friends:="com.android.ide.eclipse.tests",
- com.android.ide.eclipse.adt.internal.editors.values.uimodel;x-friends:="com.android.ide.eclipse.tests",
- com.android.ide.eclipse.adt.internal.launch;x-friends:="com.android.ide.eclipse.tests",
- com.android.ide.eclipse.adt.internal.launch.junit;x-friends:="com.android.ide.eclipse.tests",
- com.android.ide.eclipse.adt.internal.launch.junit.runtime;x-friends:="com.android.ide.eclipse.tests",
- com.android.ide.eclipse.adt.internal.lint;x-friends:="com.android.ide.eclipse.tests",
- com.android.ide.eclipse.adt.internal.preferences;x-friends:="com.android.ide.eclipse.tests",
- com.android.ide.eclipse.adt.internal.project;x-friends:="com.android.ide.eclipse.tests",
- com.android.ide.eclipse.adt.internal.properties;x-friends:="com.android.ide.eclipse.tests",
- com.android.ide.eclipse.adt.internal.refactorings.core;x-friends:="com.android.ide.eclipse.tests",
- com.android.ide.eclipse.adt.internal.refactorings.extractstring;x-friends:="com.android.ide.eclipse.tests",
- com.android.ide.eclipse.adt.internal.refactorings.renamepackage;x-friends:="com.android.ide.eclipse.tests",
- com.android.ide.eclipse.adt.internal.resources;x-friends:="com.android.ide.eclipse.tests",
- com.android.ide.eclipse.adt.internal.resources.manager;x-friends:="com.android.ide.eclipse.tests",
- 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.package",
- com.android.ide.eclipse.adt.internal.wizards.export;x-friends:="com.android.ide.eclipse.tests",
- com.android.ide.eclipse.adt.internal.wizards.exportgradle;x-friends:="com.android.ide.eclipse.tests",
- com.android.ide.eclipse.adt.internal.wizards.newproject;x-friends:="com.android.ide.eclipse.tests",
- 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.manifmerger;x-friends:="com.android.ide.eclipse.tests",
- com.android.ninepatch;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",
- com.android.sdkuilib.internal.repository.ui;x-friends:="com.android.ide.eclipse.tests",
- com.android.sdkuilib.internal.tasks;x-friends:="com.android.ide.eclipse.tests",
- com.android.sdkuilib.internal.widgets;x-friends:="com.android.ide.eclipse.tests",
- com.android.sdkuilib.repository;x-friends:="com.android.ide.eclipse.tests",
- com.android.sdkuilib.ui;x-friends:="com.android.ide.eclipse.tests",
- 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",
- freemarker.cache;x-friends:="com.android.ide.eclipse.tests",
- freemarker.template;x-friends:="com.android.ide.eclipse.tests"
-Bundle-RequiredExecutionEnvironment: JavaSE-1.6
-Import-Package: com.ibm.icu.text,
- org.eclipse.core.variables
-
-
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/MODULE_LICENSE_EPL b/eclipse/plugins/com.android.ide.eclipse.adt/MODULE_LICENSE_EPL
deleted file mode 100644
index e69de29..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/MODULE_LICENSE_EPL
+++ /dev/null
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/NOTICE b/eclipse/plugins/com.android.ide.eclipse.adt/NOTICE
deleted file mode 100644
index 49c101d..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/NOTICE
+++ /dev/null
@@ -1,224 +0,0 @@
-*Eclipse Public License - v 1.0*
-
-THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE
-PUBLIC LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION OF
-THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT.
-
-*1. DEFINITIONS*
-
-"Contribution" means:
-
-a) in the case of the initial Contributor, the initial code and
-documentation distributed under this Agreement, and
-b) in the case of each subsequent Contributor:
-
-i) changes to the Program, and
-
-ii) additions to the Program;
-
-where such changes and/or additions to the Program originate from and
-are distributed by that particular Contributor. A Contribution
-'originates' from a Contributor if it was added to the Program by such
-Contributor itself or anyone acting on such Contributor's behalf.
-Contributions do not include additions to the Program which: (i) are
-separate modules of software distributed in conjunction with the Program
-under their own license agreement, and (ii) are not derivative works of
-the Program.
-
-"Contributor" means any person or entity that distributes the Program.
-
-"Licensed Patents " mean patent claims licensable by a Contributor which
-are necessarily infringed by the use or sale of its Contribution alone
-or when combined with the Program.
-
-"Program" means the Contributions distributed in accordance with this
-Agreement.
-
-"Recipient" means anyone who receives the Program under this Agreement,
-including all Contributors.
-
-*2. GRANT OF RIGHTS*
-
-a) Subject to the terms of this Agreement, each Contributor hereby
-grants Recipient a non-exclusive, worldwide, royalty-free copyright
-license to reproduce, prepare derivative works of, publicly display,
-publicly perform, distribute and sublicense the Contribution of such
-Contributor, if any, and such derivative works, in source code and
-object code form.
-
-b) Subject to the terms of this Agreement, each Contributor hereby
-grants Recipient a non-exclusive, worldwide, royalty-free patent license
-under Licensed Patents to make, use, sell, offer to sell, import and
-otherwise transfer the Contribution of such Contributor, if any, in
-source code and object code form. This patent license shall apply to the
-combination of the Contribution and the Program if, at the time the
-Contribution is added by the Contributor, such addition of the
-Contribution causes such combination to be covered by the Licensed
-Patents. The patent license shall not apply to any other combinations
-which include the Contribution. No hardware per se is licensed hereunder.
-
-c) Recipient understands that although each Contributor grants the
-licenses to its Contributions set forth herein, no assurances are
-provided by any Contributor that the Program does not infringe the
-patent or other intellectual property rights of any other entity. Each
-Contributor disclaims any liability to Recipient for claims brought by
-any other entity based on infringement of intellectual property rights
-or otherwise. As a condition to exercising the rights and licenses
-granted hereunder, each Recipient hereby assumes sole responsibility to
-secure any other intellectual property rights needed, if any. For
-example, if a third party patent license is required to allow Recipient
-to distribute the Program, it is Recipient's responsibility to acquire
-that license before distributing the Program.
-
-d) Each Contributor represents that to its knowledge it has sufficient
-copyright rights in its Contribution, if any, to grant the copyright
-license set forth in this Agreement.
-
-*3. REQUIREMENTS*
-
-A Contributor may choose to distribute the Program in object code form
-under its own license agreement, provided that:
-
-a) it complies with the terms and conditions of this Agreement; and
-
-b) its license agreement:
-
-i) effectively disclaims on behalf of all Contributors all warranties
-and conditions, express and implied, including warranties or conditions
-of title and non-infringement, and implied warranties or conditions of
-merchantability and fitness for a particular purpose;
-
-ii) effectively excludes on behalf of all Contributors all liability for
-damages, including direct, indirect, special, incidental and
-consequential damages, such as lost profits;
-
-iii) states that any provisions which differ from this Agreement are
-offered by that Contributor alone and not by any other party; and
-
-iv) states that source code for the Program is available from such
-Contributor, and informs licensees how to obtain it in a reasonable
-manner on or through a medium customarily used for software exchange.
-
-When the Program is made available in source code form:
-
-a) it must be made available under this Agreement; and
-
-b) a copy of this Agreement must be included with each copy of the Program.
-
-Contributors may not remove or alter any copyright notices contained
-within the Program.
-
-Each Contributor must identify itself as the originator of its
-Contribution, if any, in a manner that reasonably allows subsequent
-Recipients to identify the originator of the Contribution.
-
-*4. COMMERCIAL DISTRIBUTION*
-
-Commercial distributors of software may accept certain responsibilities
-with respect to end users, business partners and the like. While this
-license is intended to facilitate the commercial use of the Program, the
-Contributor who includes the Program in a commercial product offering
-should do so in a manner which does not create potential liability for
-other Contributors. Therefore, if a Contributor includes the Program in
-a commercial product offering, such Contributor ("Commercial
-Contributor") hereby agrees to defend and indemnify every other
-Contributor ("Indemnified Contributor") against any losses, damages and
-costs (collectively "Losses") arising from claims, lawsuits and other
-legal actions brought by a third party against the Indemnified
-Contributor to the extent caused by the acts or omissions of such
-Commercial Contributor in connection with its distribution of the
-Program in a commercial product offering. The obligations in this
-section do not apply to any claims or Losses relating to any actual or
-alleged intellectual property infringement. In order to qualify, an
-Indemnified Contributor must: a) promptly notify the Commercial
-Contributor in writing of such claim, and b) allow the Commercial
-Contributor to control, and cooperate with the Commercial Contributor
-in, the defense and any related settlement negotiations. The Indemnified
-Contributor may participate in any such claim at its own expense.
-
-For example, a Contributor might include the Program in a commercial
-product offering, Product X. That Contributor is then a Commercial
-Contributor. If that Commercial Contributor then makes performance
-claims, or offers warranties related to Product X, those performance
-claims and warranties are such Commercial Contributor's responsibility
-alone. Under this section, the Commercial Contributor would have to
-defend claims against the other Contributors related to those
-performance claims and warranties, and if a court requires any other
-Contributor to pay any damages as a result, the Commercial Contributor
-must pay those damages.
-
-*5. NO WARRANTY*
-
-EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS PROVIDED
-ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
-EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES
-OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR
-A PARTICULAR PURPOSE. Each Recipient is solely responsible for
-determining the appropriateness of using and distributing the Program
-and assumes all risks associated with its exercise of rights under this
-Agreement , including but not limited to the risks and costs of program
-errors, compliance with applicable laws, damage to or loss of data,
-programs or equipment, and unavailability or interruption of operations.
-
-*6. DISCLAIMER OF LIABILITY*
-
-EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT NOR
-ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT,
-INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING
-WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF
-LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
-NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR
-DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED
-HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
-
-*7. GENERAL*
-
-If any provision of this Agreement is invalid or unenforceable under
-applicable law, it shall not affect the validity or enforceability of
-the remainder of the terms of this Agreement, and without further action
-by the parties hereto, such provision shall be reformed to the minimum
-extent necessary to make such provision valid and enforceable.
-
-If Recipient institutes patent litigation against any entity (including
-a cross-claim or counterclaim in a lawsuit) alleging that the Program
-itself (excluding combinations of the Program with other software or
-hardware) infringes such Recipient's patent(s), then such Recipient's
-rights granted under Section 2(b) shall terminate as of the date such
-litigation is filed.
-
-All Recipient's rights under this Agreement shall terminate if it fails
-to comply with any of the material terms or conditions of this Agreement
-and does not cure such failure in a reasonable period of time after
-becoming aware of such noncompliance. If all Recipient's rights under
-this Agreement terminate, Recipient agrees to cease use and distribution
-of the Program as soon as reasonably practicable. However, Recipient's
-obligations under this Agreement and any licenses granted by Recipient
-relating to the Program shall continue and survive.
-
-Everyone is permitted to copy and distribute copies of this Agreement,
-but in order to avoid inconsistency the Agreement is copyrighted and may
-only be modified in the following manner. The Agreement Steward reserves
-the right to publish new versions (including revisions) of this
-Agreement from time to time. No one other than the Agreement Steward has
-the right to modify this Agreement. The Eclipse Foundation is the
-initial Agreement Steward. The Eclipse Foundation may assign the
-responsibility to serve as the Agreement Steward to a suitable separate
-entity. Each new version of the Agreement will be given a distinguishing
-version number. The Program (including Contributions) may always be
-distributed subject to the version of the Agreement under which it was
-received. In addition, after a new version of the Agreement is
-published, Contributor may elect to distribute the Program (including
-its Contributions) under the new version. Except as expressly stated in
-Sections 2(a) and 2(b) above, Recipient receives no rights or licenses
-to the intellectual property of any Contributor under this Agreement,
-whether expressly, by implication, estoppel or otherwise. All rights in
-the Program not expressly granted under this Agreement are reserved.
-
-This Agreement is governed by the laws of the State of New York and the
-intellectual property laws of the United States of America. No party to
-this Agreement will bring a legal action under this Agreement more than
-one year after the cause of action arose. Each party waives its rights
-to a jury trial in any resulting litigation.
-
- 
-
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/about.html b/eclipse/plugins/com.android.ide.eclipse.adt/about.html
deleted file mode 100644
index baa6af1..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/about.html
+++ /dev/null
@@ -1,108 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
-    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
-<title>About</title>
-</head>
-<body lang="EN-US">
-<h2>About This Content</h2>
- 
-<p>September 19, 2010</p>	
-<h3>License</h3>
-
-<pre>
- Note:  kxml2-2.3.0.jar is under the BSD license rather than the EPL.  You can find a copy of the BSD License at http://www.opensource.org/licenses/bsd-license.php
-
-      Eclipse Public License - v 1.0
-
-THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE PUBLIC LICENSE (&quot;AGREEMENT&quot;). ANY USE, REPRODUCTION OR DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT&apos;S ACCEPTANCE OF THIS AGREEMENT.
-
-1. DEFINITIONS
-
-&quot;Contribution&quot; means:
-
-a) in the case of the initial Contributor, the initial code and documentation distributed under this Agreement, and
-
-b) in the case of each subsequent Contributor:
-
-i) changes to the Program, and
-
-ii) additions to the Program;
-
-where such changes and/or additions to the Program originate from and are distributed by that particular Contributor. A Contribution &apos;originates&apos; from a Contributor if it was added to the Program by such Contributor itself or anyone acting on such Contributor&apos;s behalf. Contributions do not include additions to the Program which: (i) are separate modules of software distributed in conjunction with the Program under their own license agreement, and (ii) are not derivative works of the Program.
-
-&quot;Contributor&quot; means any person or entity that distributes the Program.
-
-&quot;Licensed Patents&quot; mean patent claims licensable by a Contributor which are necessarily infringed by the use or sale of its Contribution alone or when combined with the Program.
-
-&quot;Program&quot; means the Contributions distributed in accordance with this Agreement.
-
-&quot;Recipient&quot; means anyone who receives the Program under this Agreement, including all Contributors.
-
-2. GRANT OF RIGHTS
-
-a) Subject to the terms of this Agreement, each Contributor hereby grants Recipient a non-exclusive, worldwide, royalty-free copyright license to reproduce, prepare derivative works of, publicly display, publicly perform, distribute and sublicense the Contribution of such Contributor, if any, and such derivative works, in source code and object code form.
-
-b) Subject to the terms of this Agreement, each Contributor hereby grants Recipient a non-exclusive, worldwide, royalty-free patent license under Licensed Patents to make, use, sell, offer to sell, import and otherwise transfer the Contribution of such Contributor, if any, in source code and object code form. This patent license shall apply to the combination of the Contribution and the Program if, at the time the Contribution is added by the Contributor, such addition of the Contribution causes such combination to be covered by the Licensed Patents. The patent license shall not apply to any other combinations which include the Contribution. No hardware per se is licensed hereunder.
-
-c) Recipient understands that although each Contributor grants the licenses to its Contributions set forth herein, no assurances are provided by any Contributor that the Program does not infringe the patent or other intellectual property rights of any other entity. Each Contributor disclaims any liability to Recipient for claims brought by any other entity based on infringement of intellectual property rights or otherwise. As a condition to exercising the rights and licenses granted hereunder, each Recipient hereby assumes sole responsibility to secure any other intellectual property rights needed, if any. For example, if a third party patent license is required to allow Recipient to distribute the Program, it is Recipient&apos;s responsibility to acquire that license before distributing the Program.
-
-d) Each Contributor represents that to its knowledge it has sufficient copyright rights in its Contribution, if any, to grant the copyright license set forth in this Agreement.
-
-3. REQUIREMENTS
-
-A Contributor may choose to distribute the Program in object code form under its own license agreement, provided that:
-
-a) it complies with the terms and conditions of this Agreement; and
-
-b) its license agreement:
-
-i) effectively disclaims on behalf of all Contributors all warranties and conditions, express and implied, including warranties or conditions of title and non-infringement, and implied warranties or conditions of merchantability and fitness for a particular purpose;
-
-ii) effectively excludes on behalf of all Contributors all liability for damages, including direct, indirect, special, incidental and consequential damages, such as lost profits;
-
-iii) states that any provisions which differ from this Agreement are offered by that Contributor alone and not by any other party; and
-
-iv) states that source code for the Program is available from such Contributor, and informs licensees how to obtain it in a reasonable manner on or through a medium customarily used for software exchange.
-
-When the Program is made available in source code form:
-
-a) it must be made available under this Agreement; and
-
-b) a copy of this Agreement must be included with each copy of the Program.
-
-Contributors may not remove or alter any copyright notices contained within the Program.
-
-Each Contributor must identify itself as the originator of its Contribution, if any, in a manner that reasonably allows subsequent Recipients to identify the originator of the Contribution.
-
-4. COMMERCIAL DISTRIBUTION
-
-Commercial distributors of software may accept certain responsibilities with respect to end users, business partners and the like. While this license is intended to facilitate the commercial use of the Program, the Contributor who includes the Program in a commercial product offering should do so in a manner which does not create potential liability for other Contributors. Therefore, if a Contributor includes the Program in a commercial product offering, such Contributor (&quot;Commercial Contributor&quot;) hereby agrees to defend and indemnify every other Contributor (&quot;Indemnified Contributor&quot;) against any losses, damages and costs (collectively &quot;Losses&quot;) arising from claims, lawsuits and other legal actions brought by a third party against the Indemnified Contributor to the extent caused by the acts or omissions of such Commercial Contributor in connection with its distribution of the Program in a commercial product offering. The obligations in this section do not apply to any claims or Losses relating to any actual or alleged intellectual property infringement. In order to qualify, an Indemnified Contributor must: a) promptly notify the Commercial Contributor in writing of such claim, and b) allow the Commercial Contributor to control, and cooperate with the Commercial Contributor in, the defense and any related settlement negotiations. The Indemnified Contributor may participate in any such claim at its own expense.
-
-For example, a Contributor might include the Program in a commercial product offering, Product X. That Contributor is then a Commercial Contributor. If that Commercial Contributor then makes performance claims, or offers warranties related to Product X, those performance claims and warranties are such Commercial Contributor&apos;s responsibility alone. Under this section, the Commercial Contributor would have to defend claims against the other Contributors related to those performance claims and warranties, and if a court requires any other Contributor to pay any damages as a result, the Commercial Contributor must pay those damages.
-
-5. NO WARRANTY
-
-EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS PROVIDED ON AN &quot;AS IS&quot; BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely responsible for determining the appropriateness of using and distributing the Program and assumes all risks associated with its exercise of rights under this Agreement , including but not limited to the risks and costs of program errors, compliance with applicable laws, damage to or loss of data, programs or equipment, and unavailability or interruption of operations.
-
-6. DISCLAIMER OF LIABILITY
-
-EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
-
-7. GENERAL
-
-If any provision of this Agreement is invalid or unenforceable under applicable law, it shall not affect the validity or enforceability of the remainder of the terms of this Agreement, and without further action by the parties hereto, such provision shall be reformed to the minimum extent necessary to make such provision valid and enforceable.
-
-If Recipient institutes patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Program itself (excluding combinations of the Program with other software or hardware) infringes such Recipient&apos;s patent(s), then such Recipient&apos;s rights granted under Section 2(b) shall terminate as of the date such litigation is filed.
-
-All Recipient&apos;s rights under this Agreement shall terminate if it fails to comply with any of the material terms or conditions of this Agreement and does not cure such failure in a reasonable period of time after becoming aware of such noncompliance. If all Recipient&apos;s rights under this Agreement terminate, Recipient agrees to cease use and distribution of the Program as soon as reasonably practicable. However, Recipient&apos;s obligations under this Agreement and any licenses granted by Recipient relating to the Program shall continue and survive.
-
-Everyone is permitted to copy and distribute copies of this Agreement, but in order to avoid inconsistency the Agreement is copyrighted and may only be modified in the following manner. The Agreement Steward reserves the right to publish new versions (including revisions) of this Agreement from time to time. No one other than the Agreement Steward has the right to modify this Agreement. The Eclipse Foundation is the initial Agreement Steward. The Eclipse Foundation may assign the responsibility to serve as the Agreement Steward to a suitable separate entity. Each new version of the Agreement will be given a distinguishing version number. The Program (including Contributions) may always be distributed subject to the version of the Agreement under which it was received. In addition, after a new version of the Agreement is published, Contributor may elect to distribute the Program (including its Contributions) under the new version. Except as expressly stated in Sections 2(a) and 2(b) above, Recipient receives no rights or licenses to the intellectual property of any Contributor under this Agreement, whether expressly, by implication, estoppel or otherwise. All rights in the Program not expressly granted under this Agreement are reserved.
-
-This Agreement is governed by the laws of the State of New York and the intellectual property laws of the United States of America. No party to this Agreement will bring a legal action under this Agreement more than one year after the cause of action arose. Each party waives its rights to a jury trial in any resulting litigation.
-
-</pre>
-
-</body>
-</html>
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/about.ini b/eclipse/plugins/com.android.ide.eclipse.adt/about.ini
deleted file mode 100644
index 2d7cdaa..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/about.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-aboutText=%blurb
-featureImage=icons/android-32.png
\ No newline at end of file
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/about.properties b/eclipse/plugins/com.android.ide.eclipse.adt/about.properties
deleted file mode 100755
index 34218e9..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/about.properties
+++ /dev/null
@@ -1,7 +0,0 @@
-blurb=Android Development Toolkit\n\
-\n\
-Version\: {featureVersion}\n\
-\n\
-(c) Copyright 2007-2011 The Android Open Source Project.  All rights reserved.\n\
-Visit http://developer.android.com/sdk/eclipse-adt.html
-
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/adt-platform-juno-sr2.target b/eclipse/plugins/com.android.ide.eclipse.adt/adt-platform-juno-sr2.target
deleted file mode 100644
index b63f382..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/adt-platform-juno-sr2.target
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<?pde version="3.8"?>
-
-<target name="adt-platform-juno-sr2" sequenceNumber="4">
-<locations>
-<location includeAllPlatforms="false" includeConfigurePhase="true" includeMode="planner" includeSource="true" type="InstallableUnit">
-<unit id="org.eclipse.platform.ide" version="4.2.2.M20130204-1200"/>
-<unit id="org.eclipse.gef.feature.group" version="3.9.0.201212170307"/>
-<unit id="org.eclipse.wst.xml_ui.feature.feature.group" version="3.4.2.v201211061806-7H7GFeJDxumUrsn5qkiQgOEhsz0p60HAmPyU6VX"/>
-<unit id="org.eclipse.pde.source.feature.group" version="3.8.2.v20130116-091538-7c7wFj0FFt6Zr9bd4AM1JEQMS"/>
-<unit id="org.eclipse.emf.codegen.feature.group" version="2.8.0.v20130125-0826"/>
-<unit id="org.eclipse.jdt.feature.group" version="3.8.2.v20130116-090414-8-8nFu3FNOfwKLRuqgXKIy9z0I83"/>
-<unit id="org.eclipse.emf.ecore.feature.group" version="2.8.3.v20130125-0546"/>
-<unit id="org.eclipse.emf.common.feature.group" version="2.8.0.v20130125-0546"/>
-<unit id="org.eclipse.jdt.source.feature.group" version="3.8.2.v20130116-090414-8-8nFu3FNOfwKLRuqgXKIy9z0I83"/>
-<unit id="org.eclipse.emf.feature.group" version="2.8.3.v20130125-0826"/>
-<unit id="org.eclipse.cdt.feature.group" version="8.1.2.201302132326"/>
-<unit id="org.eclipse.egit.feature.group" version="2.2.0.201212191850-r"/>
-<unit id="org.eclipse.emf.common.ui.feature.group" version="2.7.0.v20130125-0826"/>
-<unit id="org.eclipse.emf.codegen.ui.feature.group" version="2.7.0.v20130125-0826"/>
-<unit id="org.eclipse.wb.core.xml.feature.feature.group" version="1.5.2.r42x201302111919"/>
-<repository location="http://download.eclipse.org/releases/juno"/>
-</location>
-</locations>
-</target>
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/adt.launch b/eclipse/plugins/com.android.ide.eclipse.adt/adt.launch
deleted file mode 100644
index 5699837..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/adt.launch
+++ /dev/null
@@ -1,33 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<launchConfiguration type="org.eclipse.pde.ui.RuntimeWorkbench">
-<booleanAttribute key="append.args" value="true"/>
-<booleanAttribute key="askclear" value="true"/>
-<booleanAttribute key="automaticAdd" value="true"/>
-<booleanAttribute key="automaticValidate" value="false"/>
-<stringAttribute key="bootstrap" value=""/>
-<stringAttribute key="checked" value="[NONE]"/>
-<booleanAttribute key="clearConfig" value="false"/>
-<booleanAttribute key="clearws" value="false"/>
-<booleanAttribute key="clearwslog" value="false"/>
-<stringAttribute key="configLocation" value="${workspace_loc}/.metadata/.plugins/org.eclipse.pde.core/adt"/>
-<booleanAttribute key="default" value="false"/>
-<stringAttribute key="deselected_workspace_plugins" value="com.android.ide.eclipse.monitor"/>
-<booleanAttribute key="includeOptional" value="true"/>
-<stringAttribute key="location" value="${workspace_loc}/../runtime-adt-idea133-ksr2"/>
-<booleanAttribute key="org.eclipse.jdt.launching.ATTR_USE_START_ON_FIRST_THREAD" value="true"/>
-<stringAttribute key="org.eclipse.jdt.launching.JRE_CONTAINER" value="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6"/>
-<stringAttribute key="org.eclipse.jdt.launching.PROGRAM_ARGUMENTS" value="-os ${target.os} -ws ${target.ws} -arch ${target.arch} -nl ${target.nl} -consoleLog"/>
-<stringAttribute key="org.eclipse.jdt.launching.SOURCE_PATH_PROVIDER" value="org.eclipse.pde.ui.workbenchClasspathProvider"/>
-<stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-XX:MaxPermSize=256m&#10;-Xms128m&#10;-Xmx1024m"/>
-<stringAttribute key="pde.version" value="3.3"/>
-<stringAttribute key="product" value="org.eclipse.platform.ide"/>
-<stringAttribute key="selected_target_plugins" value="com.android.tools.asset-studio@default:default,com.android.tools.build.er-model@default:default,com.android.tools.build.manifest-merger@default:default,com.android.tools.common@default:default,com.android.tools.ddms.ddmlib@default:default,com.android.tools.ddms.ddmuilib@default:default,com.android.tools.dvlib@default:default,com.android.tools.external.ant-glob@default:default,com.android.tools.external.liblzf@default:default,com.android.tools.external.libprotobuf-java-lite@default:default,com.android.tools.external.lombok.ast@default:default,com.android.tools.external.propertysheet@default:default,com.android.tools.hierarchyviewer2lib@default:default,com.android.tools.layoutlib.api@default:default,com.android.tools.lint.api@default:default,com.android.tools.lint.checks@default:default,com.android.tools.ninepatch@default:default,com.android.tools.rule-api@default:default,com.android.tools.sdk-common@default:default,com.android.tools.sdklib@default:default,com.android.tools.sdkstats@default:default,com.android.tools.sdkuilib@default:default,com.android.tools.swtmenubar@default:default,com.android.tools.testutils@default:default,com.android.tools.traceview@default:default,com.android.tools.uiautomatorviewer@default:default,com.google.guava@default:default,com.ibm.icu@default:default,com.jcraft.jsch@default:default,com.sun.el@default:default,commons-logging@default:default,java_cup.runtime@default:default,javax.activation@default:default,javax.annotation@default:default,javax.el@default:default,javax.inject@default:default,javax.jws@default:default,javax.mail@default:default,javax.persistence@default:default,javax.servlet.jsp@default:default,javax.servlet@default:default,javax.wsdl*1.5.1.v201012040544@default:default,javax.wsdl*1.6.2.v201012040545@default:default,javax.xml.bind@default:default,javax.xml.rpc@default:default,javax.xml.soap@default:default,javax.xml.stream@default:default,javax.xml.ws@default:default,javax.xml@default:default,jfree.chart-swt@default:default,jfree.chart@default:default,jfree.jcommon@default:default,junit@default:default,net.sf.kxml.2@default:default,net.sourceforge.lpg.lpgjavaruntime@default:default,org.apache.ant@default:default,org.apache.axis@default:default,org.apache.batik.css@default:default,org.apache.batik.util.gui@default:default,org.apache.batik.util@default:default,org.apache.bcel@default:default,org.apache.commons.codec*1.4.0.v201209201156@default:default,org.apache.commons.codec*1.4.0@default:default,org.apache.commons.collections@default:default,org.apache.commons.compress@default:default,org.apache.commons.discovery@default:default,org.apache.commons.lang@default:default,org.apache.commons.logging*1.0.4.v201101211617@default:default,org.apache.commons.logging*1.1.1.v201101211721@default:default,org.apache.felix.gogo.command@default:default,org.apache.felix.gogo.runtime@default:default,org.apache.felix.gogo.shell@default:default,org.apache.httpcomponents.httpclient*4.1.1@default:default,org.apache.httpcomponents.httpclient*4.1.3.v201209201135@default:default,org.apache.httpcomponents.httpcore*4.1.0@default:default,org.apache.httpcomponents.httpcore*4.1.4.v201203221030@default:default,org.apache.httpcomponents.httpmime@default:default,org.apache.jasper.glassfish@default:default,org.apache.log4j@default:default,org.apache.lucene.analysis@default:default,org.apache.lucene.core@default:default,org.apache.velocity@default:default,org.apache.wsil4j@default:default,org.apache.xalan@default:default,org.apache.xerces@default:default,org.apache.xml.resolver@default:default,org.apache.xml.serializer@default:default,org.eclipse.ant.core@default:default,org.eclipse.ant.launching@default:default,org.eclipse.ant.ui@default:default,org.eclipse.cdt.autotools.core@default:default,org.eclipse.cdt.autotools.docs@default:default,org.eclipse.cdt.autotools.ui@default:default,org.eclipse.cdt.build.crossgcc@default:default,org.eclipse.cdt.codan.checkers.ui@default:default,org.eclipse.cdt.codan.checkers@default:default,org.eclipse.cdt.codan.core.cxx@default:default,org.eclipse.cdt.codan.core@default:default,org.eclipse.cdt.codan.ui.cxx@default:default,org.eclipse.cdt.codan.ui@default:default,org.eclipse.cdt.core.aix@default:false,org.eclipse.cdt.core.linux.ppc64@default:false,org.eclipse.cdt.core.linux.x86@default:false,org.eclipse.cdt.core.linux.x86_64@default:false,org.eclipse.cdt.core.linux@default:false,org.eclipse.cdt.core.lrparser.xlc@default:default,org.eclipse.cdt.core.lrparser@default:default,org.eclipse.cdt.core.macosx@default:false,org.eclipse.cdt.core.parser.upc@default:default,org.eclipse.cdt.core.solaris@default:false,org.eclipse.cdt.core.win32.x86@default:false,org.eclipse.cdt.core.win32.x86_64@default:false,org.eclipse.cdt.core.win32@default:false,org.eclipse.cdt.core@default:default,org.eclipse.cdt.debug.core@default:default,org.eclipse.cdt.debug.gdbjtag.core@default:default,org.eclipse.cdt.debug.gdbjtag.ui@default:default,org.eclipse.cdt.debug.gdbjtag@default:default,org.eclipse.cdt.debug.mi.core@default:default,org.eclipse.cdt.debug.mi.ui@default:default,org.eclipse.cdt.debug.ui.memory.floatingpoint@default:default,org.eclipse.cdt.debug.ui.memory.memorybrowser@default:default,org.eclipse.cdt.debug.ui.memory.search@default:default,org.eclipse.cdt.debug.ui.memory.traditional@default:default,org.eclipse.cdt.debug.ui.memory.transport@default:default,org.eclipse.cdt.debug.ui@default:default,org.eclipse.cdt.doc.isv@default:default,org.eclipse.cdt.doc.user@default:default,org.eclipse.cdt.dsf.gdb.multicorevisualizer.ui@default:default,org.eclipse.cdt.dsf.gdb.ui@default:default,org.eclipse.cdt.dsf.gdb@default:default,org.eclipse.cdt.dsf.ui@default:default,org.eclipse.cdt.dsf@default:default,org.eclipse.cdt.errorparsers.xlc@default:default,org.eclipse.cdt.examples.dsf.pda.ui@default:default,org.eclipse.cdt.examples.dsf.pda@default:default,org.eclipse.cdt.examples.dsf@default:default,org.eclipse.cdt.gdb.ui@default:default,org.eclipse.cdt.gdb@default:default,org.eclipse.cdt.launch.remote@default:default,org.eclipse.cdt.launch@default:default,org.eclipse.cdt.make.core@default:default,org.eclipse.cdt.make.ui@default:default,org.eclipse.cdt.make.xlc.core@default:default,org.eclipse.cdt.managedbuilder.bupc.ui@default:default,org.eclipse.cdt.managedbuilder.core@default:default,org.eclipse.cdt.managedbuilder.gnu.ui@default:default,org.eclipse.cdt.managedbuilder.llvm.ui@default:default,org.eclipse.cdt.managedbuilder.ui@default:default,org.eclipse.cdt.managedbuilder.xlc.core@default:default,org.eclipse.cdt.managedbuilder.xlc.ui@default:default,org.eclipse.cdt.managedbuilder.xlupc.ui@default:default,org.eclipse.cdt.msw.build@default:default,org.eclipse.cdt.qt.core@default:default,org.eclipse.cdt.qt.ui@default:default,org.eclipse.cdt.sdk@default:default,org.eclipse.cdt.testsrunner.boost@default:default,org.eclipse.cdt.testsrunner.gtest@default:default,org.eclipse.cdt.testsrunner.qttest@default:default,org.eclipse.cdt.testsrunner@default:default,org.eclipse.cdt.ui@default:default,org.eclipse.cdt.util@default:default,org.eclipse.cdt.visualizer.core@default:default,org.eclipse.cdt.visualizer.ui@default:default,org.eclipse.cdt@default:default,org.eclipse.compare.core@default:default,org.eclipse.compare@default:default,org.eclipse.core.commands@default:default,org.eclipse.core.contenttype@default:default,org.eclipse.core.databinding.beans@default:default,org.eclipse.core.databinding.observable@default:default,org.eclipse.core.databinding.property@default:default,org.eclipse.core.databinding@default:default,org.eclipse.core.expressions@default:default,org.eclipse.core.externaltools@default:default,org.eclipse.core.filebuffers@default:default,org.eclipse.core.filesystem.linux.x86_64@default:false,org.eclipse.core.filesystem@default:default,org.eclipse.core.jobs@default:default,org.eclipse.core.net.linux.x86_64@default:false,org.eclipse.core.net@default:default,org.eclipse.core.resources@default:default,org.eclipse.core.runtime.compatibility.registry@default:false,org.eclipse.core.runtime.compatibility@default:default,org.eclipse.core.runtime@default:true,org.eclipse.core.variables@default:default,org.eclipse.debug.core@default:default,org.eclipse.debug.ui@default:default,org.eclipse.draw2d.doc.isv@default:default,org.eclipse.draw2d@default:default,org.eclipse.e4.core.commands@default:default,org.eclipse.e4.core.contexts@default:default,org.eclipse.e4.core.di.extensions@default:default,org.eclipse.e4.core.di@default:default,org.eclipse.e4.core.services@default:default,org.eclipse.e4.ui.bindings@default:default,org.eclipse.e4.ui.css.core@default:default,org.eclipse.e4.ui.css.swt.theme@default:default,org.eclipse.e4.ui.css.swt@default:default,org.eclipse.e4.ui.di@default:default,org.eclipse.e4.ui.model.workbench@default:default,org.eclipse.e4.ui.services@default:default,org.eclipse.e4.ui.widgets@default:default,org.eclipse.e4.ui.workbench.addons.swt@default:default,org.eclipse.e4.ui.workbench.renderers.swt@default:default,org.eclipse.e4.ui.workbench.swt@default:default,org.eclipse.e4.ui.workbench3@default:default,org.eclipse.e4.ui.workbench@default:default,org.eclipse.ecf.filetransfer@default:default,org.eclipse.ecf.identity@default:default,org.eclipse.ecf.provider.filetransfer.httpclient4.ssl@default:false,org.eclipse.ecf.provider.filetransfer.httpclient4@default:default,org.eclipse.ecf.provider.filetransfer.ssl@default:false,org.eclipse.ecf.provider.filetransfer@default:default,org.eclipse.ecf.ssl@default:false,org.eclipse.ecf@default:default,org.eclipse.emf.activities@default:default,org.eclipse.emf.ant@default:default,org.eclipse.emf.cheatsheets@default:default,org.eclipse.emf.codegen.ecore.ui@default:default,org.eclipse.emf.codegen.ecore@default:default,org.eclipse.emf.codegen.ui@default:default,org.eclipse.emf.codegen@default:default,org.eclipse.emf.common.ui@default:default,org.eclipse.emf.common@default:default,org.eclipse.emf.converter@default:default,org.eclipse.emf.databinding.edit@default:default,org.eclipse.emf.databinding@default:default,org.eclipse.emf.doc@default:default,org.eclipse.emf.ecore.change.edit@default:default,org.eclipse.emf.ecore.change@default:default,org.eclipse.emf.ecore.edit@default:default,org.eclipse.emf.ecore.editor@default:default,org.eclipse.emf.ecore.xmi@default:default,org.eclipse.emf.ecore@default:default,org.eclipse.emf.edit.ui@default:default,org.eclipse.emf.edit@default:default,org.eclipse.emf.example.installer@default:default,org.eclipse.emf.examples.databinding.project.core.model@default:default,org.eclipse.emf.examples.databinding.project.core@default:default,org.eclipse.emf.examples.databinding.project.ui.rcp@default:default,org.eclipse.emf.examples.generator.validator@default:default,org.eclipse.emf.examples.jet.article2@default:default,org.eclipse.emf.examples.library.edit@default:default,org.eclipse.emf.examples.library.editor@default:default,org.eclipse.emf.examples.library@default:default,org.eclipse.emf.examples@default:default,org.eclipse.emf.exporter.html@default:default,org.eclipse.emf.exporter@default:default,org.eclipse.emf.importer.ecore@default:default,org.eclipse.emf.importer.java@default:default,org.eclipse.emf.importer.rose@default:default,org.eclipse.emf.importer@default:default,org.eclipse.emf.java.edit@default:default,org.eclipse.emf.java.editor@default:default,org.eclipse.emf.java@default:default,org.eclipse.emf.mapping.ecore.editor@default:default,org.eclipse.emf.mapping.ecore2ecore.editor@default:default,org.eclipse.emf.mapping.ecore2ecore@default:default,org.eclipse.emf.mapping.ecore2xml.ui@default:default,org.eclipse.emf.mapping.ecore2xml@default:default,org.eclipse.emf.mapping.ecore@default:default,org.eclipse.emf.mapping.ui@default:default,org.eclipse.emf.mapping.xsd2ecore.editor@default:default,org.eclipse.emf.mapping.xsd2ecore@default:default,org.eclipse.emf.mapping@default:default,org.eclipse.emf@default:default,org.eclipse.equinox.app@default:default,org.eclipse.equinox.bidi@default:default,org.eclipse.equinox.common@2:true,org.eclipse.equinox.console@default:default,org.eclipse.equinox.ds@1:true,org.eclipse.equinox.event@default:default,org.eclipse.equinox.frameworkadmin.equinox@default:default,org.eclipse.equinox.frameworkadmin@default:default,org.eclipse.equinox.http.jetty@default:default,org.eclipse.equinox.http.registry@default:default,org.eclipse.equinox.http.servlet@default:default,org.eclipse.equinox.jsp.jasper.registry@default:default,org.eclipse.equinox.jsp.jasper@default:default,org.eclipse.equinox.launcher.gtk.linux.x86_64@default:false,org.eclipse.equinox.launcher@default:default,org.eclipse.equinox.p2.artifact.repository@default:default,org.eclipse.equinox.p2.console@default:default,org.eclipse.equinox.p2.core@default:default,org.eclipse.equinox.p2.director.app@default:default,org.eclipse.equinox.p2.director@default:default,org.eclipse.equinox.p2.directorywatcher@default:default,org.eclipse.equinox.p2.engine@default:default,org.eclipse.equinox.p2.extensionlocation@default:default,org.eclipse.equinox.p2.garbagecollector@default:default,org.eclipse.equinox.p2.jarprocessor@default:default,org.eclipse.equinox.p2.metadata.repository@default:default,org.eclipse.equinox.p2.metadata@default:default,org.eclipse.equinox.p2.operations@default:default,org.eclipse.equinox.p2.publisher.eclipse@default:default,org.eclipse.equinox.p2.publisher@default:default,org.eclipse.equinox.p2.ql@default:default,org.eclipse.equinox.p2.reconciler.dropins@default:default,org.eclipse.equinox.p2.repository.tools@default:default,org.eclipse.equinox.p2.repository@default:default,org.eclipse.equinox.p2.touchpoint.eclipse@default:default,org.eclipse.equinox.p2.touchpoint.natives@default:default,org.eclipse.equinox.p2.transport.ecf@default:default,org.eclipse.equinox.p2.ui.importexport@default:default,org.eclipse.equinox.p2.ui.sdk.scheduler@default:default,org.eclipse.equinox.p2.ui.sdk@default:default,org.eclipse.equinox.p2.ui@default:default,org.eclipse.equinox.p2.updatechecker@default:default,org.eclipse.equinox.p2.updatesite@default:default,org.eclipse.equinox.preferences@default:default,org.eclipse.equinox.registry@default:default,org.eclipse.equinox.security.ui@default:default,org.eclipse.equinox.security@default:default,org.eclipse.equinox.simpleconfigurator.manipulator@default:default,org.eclipse.equinox.simpleconfigurator@1:true,org.eclipse.equinox.util@default:default,org.eclipse.gef.doc.isv@default:default,org.eclipse.gef.examples.flow@default:default,org.eclipse.gef.examples.logic@default:default,org.eclipse.gef.examples.shapes@default:default,org.eclipse.gef.examples.text@default:default,org.eclipse.gef.examples.ui.pde@default:default,org.eclipse.gef@default:default,org.eclipse.help.base@default:default,org.eclipse.help.ui@default:default,org.eclipse.help.webapp@default:default,org.eclipse.help@default:default,org.eclipse.jdt.annotation@default:default,org.eclipse.jdt.apt.core@default:default,org.eclipse.jdt.apt.pluggable.core@default:default,org.eclipse.jdt.apt.ui@default:default,org.eclipse.jdt.compiler.apt@default:false,org.eclipse.jdt.compiler.tool@default:false,org.eclipse.jdt.core.manipulation@default:default,org.eclipse.jdt.core@default:default,org.eclipse.jdt.debug.ui@default:default,org.eclipse.jdt.debug@default:default,org.eclipse.jdt.doc.isv@default:default,org.eclipse.jdt.doc.user@default:default,org.eclipse.jdt.junit.core@default:default,org.eclipse.jdt.junit.runtime@default:default,org.eclipse.jdt.junit4.runtime@default:default,org.eclipse.jdt.junit@default:default,org.eclipse.jdt.launching@default:default,org.eclipse.jdt.ui@default:default,org.eclipse.jdt@default:default,org.eclipse.jem.beaninfo.vm.common@default:default,org.eclipse.jem.beaninfo.vm@default:default,org.eclipse.jem.beaninfo@default:default,org.eclipse.jem.proxy@default:default,org.eclipse.jem.util@default:default,org.eclipse.jem.workbench@default:default,org.eclipse.jem@default:default,org.eclipse.jetty.continuation@default:default,org.eclipse.jetty.http@default:default,org.eclipse.jetty.io@default:default,org.eclipse.jetty.security@default:default,org.eclipse.jetty.server@default:default,org.eclipse.jetty.servlet@default:default,org.eclipse.jetty.util@default:default,org.eclipse.jetty.webapp@default:default,org.eclipse.jetty.xml@default:default,org.eclipse.jface.databinding@default:default,org.eclipse.jface.text@default:default,org.eclipse.jface@default:default,org.eclipse.jpt.common.branding@default:default,org.eclipse.jpt.common.core@default:default,org.eclipse.jpt.common.eclipselink.branding@default:default,org.eclipse.jpt.common.eclipselink.core@default:default,org.eclipse.jpt.common.ui@default:default,org.eclipse.jpt.common.utility@default:default,org.eclipse.jpt.dbws.eclipselink.branding@default:default,org.eclipse.jpt.dbws.eclipselink.core.gen@default:default,org.eclipse.jpt.dbws.eclipselink.ui@default:default,org.eclipse.jpt.doc.isv@default:default,org.eclipse.jpt.doc.user@default:default,org.eclipse.jpt.jaxb.branding@default:default,org.eclipse.jpt.jaxb.core.schemagen@default:default,org.eclipse.jpt.jaxb.core@default:default,org.eclipse.jpt.jaxb.eclipselink.branding@default:default,org.eclipse.jpt.jaxb.eclipselink.core.schemagen@default:default,org.eclipse.jpt.jaxb.eclipselink.core@default:default,org.eclipse.jpt.jaxb.eclipselink.ui@default:default,org.eclipse.jpt.jaxb.ui@default:default,org.eclipse.jpt.jpa.annotate@default:default,org.eclipse.jpt.jpa.branding@default:default,org.eclipse.jpt.jpa.core@default:default,org.eclipse.jpt.jpa.db.ui@default:default,org.eclipse.jpt.jpa.db@default:default,org.eclipse.jpt.jpa.eclipselink.branding@default:default,org.eclipse.jpt.jpa.eclipselink.core.ddlgen@default:default,org.eclipse.jpt.jpa.eclipselink.core@default:default,org.eclipse.jpt.jpa.eclipselink.ui@default:default,org.eclipse.jpt.jpa.gen@default:default,org.eclipse.jpt.jpa.ui@default:default,org.eclipse.jpt.jpadiagrameditor.branding@default:default,org.eclipse.jpt.jpadiagrameditor.doc.user@default:default,org.eclipse.jpt.jpadiagrameditor.ui@default:default,org.eclipse.jsch.core@default:default,org.eclipse.jsch.ui@default:default,org.eclipse.jsf.branding@default:default,org.eclipse.jst.common.annotations.controller@default:default,org.eclipse.jst.common.annotations.core@default:default,org.eclipse.jst.common.annotations.ui@default:default,org.eclipse.jst.common.fproj.enablement.jdt.sdk@default:default,org.eclipse.jst.common.frameworks@default:default,org.eclipse.jst.common.project.facet.core@default:default,org.eclipse.jst.common.project.facet.ui@default:default,org.eclipse.jst.common.ui@default:default,org.eclipse.jst.ejb.doc.user@default:default,org.eclipse.jst.ejb.ui.infopop@default:default,org.eclipse.jst.ejb.ui@default:default,org.eclipse.jst.j2ee.core@default:default,org.eclipse.jst.j2ee.doc.user@default:default,org.eclipse.jst.j2ee.ejb.annotation.model@default:default,org.eclipse.jst.j2ee.ejb.annotations.emitter@default:default,org.eclipse.jst.j2ee.ejb.annotations.ui@default:default,org.eclipse.jst.j2ee.ejb.annotations.xdoclet@default:default,org.eclipse.jst.j2ee.ejb@default:default,org.eclipse.jst.j2ee.infopop@default:default,org.eclipse.jst.j2ee.jca.ui@default:default,org.eclipse.jst.j2ee.jca@default:default,org.eclipse.jst.j2ee.navigator.ui@default:default,org.eclipse.jst.j2ee.ui@default:default,org.eclipse.jst.j2ee.web@default:default,org.eclipse.jst.j2ee.webservice.ui@default:default,org.eclipse.jst.j2ee.webservice@default:default,org.eclipse.jst.j2ee.xdoclet.runtime@default:default,org.eclipse.jst.j2ee@default:default,org.eclipse.jst.jee.ejb@default:default,org.eclipse.jst.jee.ui@default:default,org.eclipse.jst.jee.web@default:default,org.eclipse.jst.jee@default:default,org.eclipse.jst.jsf.apache.trinidad.tagsupport@default:default,org.eclipse.jst.jsf.common.runtime@default:default,org.eclipse.jst.jsf.common.ui@default:default,org.eclipse.jst.jsf.common@default:default,org.eclipse.jst.jsf.core@default:default,org.eclipse.jst.jsf.doc.dev@default:default,org.eclipse.jst.jsf.doc.user@default:default,org.eclipse.jst.jsf.facelet.core@default:default,org.eclipse.jst.jsf.facelet.ui@default:default,org.eclipse.jst.jsf.facesconfig.ui@default:default,org.eclipse.jst.jsf.facesconfig@default:default,org.eclipse.jst.jsf.standard.tagsupport@default:default,org.eclipse.jst.jsf.ui@default:default,org.eclipse.jst.jsp.core@default:default,org.eclipse.jst.jsp.ui.infopop@default:default,org.eclipse.jst.jsp.ui@default:default,org.eclipse.jst.pagedesigner.jsf.ui@default:default,org.eclipse.jst.pagedesigner.jsp.core@default:default,org.eclipse.jst.pagedesigner@default:default,org.eclipse.jst.server.core@default:default,org.eclipse.jst.server.generic.core@default:default,org.eclipse.jst.server.generic.jboss@default:default,org.eclipse.jst.server.generic.jonas@default:default,org.eclipse.jst.server.generic.ui@default:default,org.eclipse.jst.server.preview.adapter@default:default,org.eclipse.jst.server.tomcat.core@default:default,org.eclipse.jst.server.tomcat.ui@default:default,org.eclipse.jst.server.ui.doc.user@default:default,org.eclipse.jst.server.ui.infopop@default:default,org.eclipse.jst.server.ui@default:default,org.eclipse.jst.servlet.ui.infopop@default:default,org.eclipse.jst.servlet.ui@default:default,org.eclipse.jst.standard.schemas@default:default,org.eclipse.jst.ws.annotations.core@default:default,org.eclipse.jst.ws.axis.consumption.core@default:default,org.eclipse.jst.ws.axis.consumption.ui@default:default,org.eclipse.jst.ws.axis.creation.ui@default:default,org.eclipse.jst.ws.axis.infopop@default:default,org.eclipse.jst.ws.axis.ui.doc.user@default:default,org.eclipse.jst.ws.axis2.consumption.core@default:default,org.eclipse.jst.ws.axis2.consumption.ui@default:default,org.eclipse.jst.ws.axis2.core@default:default,org.eclipse.jst.ws.axis2.creation.core@default:default,org.eclipse.jst.ws.axis2.creation.ui@default:default,org.eclipse.jst.ws.axis2.ui.doc.user@default:default,org.eclipse.jst.ws.axis2.ui@default:default,org.eclipse.jst.ws.consumption.infopop@default:default,org.eclipse.jst.ws.consumption.ui.doc.user@default:default,org.eclipse.jst.ws.consumption.ui@default:default,org.eclipse.jst.ws.consumption@default:default,org.eclipse.jst.ws.creation.ejb.ui@default:default,org.eclipse.jst.ws.creation.ui@default:default,org.eclipse.jst.ws.cxf.consumption.core@default:default,org.eclipse.jst.ws.cxf.consumption.ui@default:default,org.eclipse.jst.ws.cxf.core@default:default,org.eclipse.jst.ws.cxf.creation.core@default:default,org.eclipse.jst.ws.cxf.creation.ui@default:default,org.eclipse.jst.ws.cxf.doc.user@default:default,org.eclipse.jst.ws.cxf.ui@default:default,org.eclipse.jst.ws.doc.user@default:default,org.eclipse.jst.ws.infopop@default:default,org.eclipse.jst.ws.jaxb.core@default:default,org.eclipse.jst.ws.jaxrs.core@default:default,org.eclipse.jst.ws.jaxrs.ui@default:default,org.eclipse.jst.ws.jaxws.core@default:default,org.eclipse.jst.ws.jaxws.doc.isv@default:default,org.eclipse.jst.ws.jaxws.doc.user@default:default,org.eclipse.jst.ws.jaxws.dom.doc.isv@default:default,org.eclipse.jst.ws.jaxws.dom.integration@default:default,org.eclipse.jst.ws.jaxws.dom.runtime@default:default,org.eclipse.jst.ws.jaxws.dom.ui@default:default,org.eclipse.jst.ws.jaxws.ui@default:default,org.eclipse.jst.ws.jaxws.utils@default:default,org.eclipse.jst.ws.uddiregistry@default:default,org.eclipse.jst.ws.ui@default:default,org.eclipse.jst.ws@default:default,org.eclipse.linuxtools.cdt.autotools.core@default:default,org.eclipse.ltk.core.refactoring@default:default,org.eclipse.ltk.ui.refactoring@default:default,org.eclipse.osgi.services@default:default,org.eclipse.osgi.util@default:default,org.eclipse.osgi@-1:true,org.eclipse.persistence.antlr@default:default,org.eclipse.persistence.asm@default:default,org.eclipse.persistence.core@default:default,org.eclipse.persistence.dbws.builder@default:default,org.eclipse.persistence.dbws@default:default,org.eclipse.persistence.jpa.jpql@default:default,org.eclipse.persistence.jpa@default:default,org.eclipse.persistence.moxy@default:default,org.eclipse.platform.doc.user@default:default,org.eclipse.platform@default:default,org.eclipse.rcp@default:default,org.eclipse.search@default:default,org.eclipse.servertools.doc.isv@default:default,org.eclipse.swt.gtk.linux.x86_64@default:false,org.eclipse.swt@default:default,org.eclipse.team.core@default:default,org.eclipse.team.ui@default:default,org.eclipse.text@default:default,org.eclipse.ui.browser@default:default,org.eclipse.ui.cheatsheets@default:default,org.eclipse.ui.console@default:default,org.eclipse.ui.editors@default:default,org.eclipse.ui.externaltools@default:default,org.eclipse.ui.forms@default:default,org.eclipse.ui.ide.application@default:default,org.eclipse.ui.ide@default:default,org.eclipse.ui.intro.universal@default:default,org.eclipse.ui.intro@default:default,org.eclipse.ui.navigator.resources@default:default,org.eclipse.ui.navigator@default:default,org.eclipse.ui.net@default:default,org.eclipse.ui.views.properties.tabbed@default:default,org.eclipse.ui.views@default:default,org.eclipse.ui.workbench.texteditor@default:default,org.eclipse.ui.workbench@default:default,org.eclipse.ui@default:default,org.eclipse.update.configurator@3:true,org.eclipse.wst.command.env.core@default:default,org.eclipse.wst.command.env.doc.user@default:default,org.eclipse.wst.command.env.infopop@default:default,org.eclipse.wst.command.env.ui@default:default,org.eclipse.wst.command.env@default:default,org.eclipse.wst.common.api.doc@default:default,org.eclipse.wst.common.core@default:default,org.eclipse.wst.common.emf@default:default,org.eclipse.wst.common.emfworkbench.integration@default:default,org.eclipse.wst.common.environment@default:default,org.eclipse.wst.common.fproj.sdk@default:default,org.eclipse.wst.common.frameworks.ui@default:default,org.eclipse.wst.common.frameworks@default:default,org.eclipse.wst.common.infopop@default:default,org.eclipse.wst.common.modulecore.ui@default:default,org.eclipse.wst.common.modulecore@default:default,org.eclipse.wst.common.project.facet.core@default:default,org.eclipse.wst.common.project.facet.doc.api@default:default,org.eclipse.wst.common.project.facet.ui@default:default,org.eclipse.wst.common.snippets@default:default,org.eclipse.wst.common.ui@default:default,org.eclipse.wst.common.uriresolver@default:default,org.eclipse.wst.css.core@default:default,org.eclipse.wst.css.ui@default:default,org.eclipse.wst.doc.user@default:default,org.eclipse.wst.dtd.core@default:default,org.eclipse.wst.dtd.ui.infopop@default:default,org.eclipse.wst.dtd.ui@default:default,org.eclipse.wst.dtdeditor.doc.user@default:default,org.eclipse.wst.html.core@default:default,org.eclipse.wst.html.ui.infopop@default:default,org.eclipse.wst.html.ui@default:default,org.eclipse.wst.internet.cache@default:default,org.eclipse.wst.internet.monitor.core@default:default,org.eclipse.wst.internet.monitor.ui@default:default,org.eclipse.wst.jsdt.core@default:default,org.eclipse.wst.jsdt.debug.core@default:default,org.eclipse.wst.jsdt.debug.crossfire@default:default,org.eclipse.wst.jsdt.debug.rhino.debugger@default:default,org.eclipse.wst.jsdt.debug.rhino.ui@default:default,org.eclipse.wst.jsdt.debug.rhino@default:default,org.eclipse.wst.jsdt.debug.transport@default:default,org.eclipse.wst.jsdt.debug.ui@default:default,org.eclipse.wst.jsdt.doc@default:default,org.eclipse.wst.jsdt.manipulation@default:default,org.eclipse.wst.jsdt.support.firefox@default:default,org.eclipse.wst.jsdt.support.ie@default:default,org.eclipse.wst.jsdt.ui@default:default,org.eclipse.wst.jsdt.web.core@default:default,org.eclipse.wst.jsdt.web.support.jsp@default:default,org.eclipse.wst.jsdt.web.ui@default:default,org.eclipse.wst.server.core@default:default,org.eclipse.wst.server.discovery@default:default,org.eclipse.wst.server.http.core@default:default,org.eclipse.wst.server.http.ui@default:default,org.eclipse.wst.server.preview.adapter@default:default,org.eclipse.wst.server.preview@default:default,org.eclipse.wst.server.ui.doc.user@default:default,org.eclipse.wst.server.ui.infopop@default:default,org.eclipse.wst.server.ui@default:default,org.eclipse.wst.sse.core@default:default,org.eclipse.wst.sse.doc.user@default:default,org.eclipse.wst.sse.ui.infopop@default:default,org.eclipse.wst.sse.ui@default:default,org.eclipse.wst.standard.schemas@default:default,org.eclipse.wst.validation.doc.isv@default:default,org.eclipse.wst.validation.infopop@default:default,org.eclipse.wst.validation.ui@default:default,org.eclipse.wst.validation@default:default,org.eclipse.wst.web.ui.infopop@default:default,org.eclipse.wst.web.ui@default:default,org.eclipse.wst.web@default:default,org.eclipse.wst.webtools.doc.user@default:default,org.eclipse.wst.ws.api.doc@default:default,org.eclipse.wst.ws.explorer@default:default,org.eclipse.wst.ws.infopop@default:default,org.eclipse.wst.ws.parser@default:default,org.eclipse.wst.ws.service.policy.ui@default:default,org.eclipse.wst.ws.service.policy@default:default,org.eclipse.wst.ws.ui@default:default,org.eclipse.wst.ws@default:default,org.eclipse.wst.wsdl.doc.isv@default:default,org.eclipse.wst.wsdl.ui.doc.user@default:default,org.eclipse.wst.wsdl.ui@default:default,org.eclipse.wst.wsdl.validation@default:default,org.eclipse.wst.wsdl@default:default,org.eclipse.wst.wsi.ui.doc.user@default:default,org.eclipse.wst.wsi.ui@default:default,org.eclipse.wst.wsi@default:default,org.eclipse.wst.xml.core@default:default,org.eclipse.wst.xml.ui.infopop@default:default,org.eclipse.wst.xml.ui@default:default,org.eclipse.wst.xml.xpath.core@default:default,org.eclipse.wst.xml.xpath.ui@default:default,org.eclipse.wst.xml.xpath2.processor.doc.user@default:default,org.eclipse.wst.xml.xpath2.processor@default:default,org.eclipse.wst.xml.xpath2.wtptypes@default:default,org.eclipse.wst.xml.xpath2@default:default,org.eclipse.wst.xmleditor.doc.user@default:default,org.eclipse.wst.xsd.core@default:default,org.eclipse.wst.xsd.ui@default:default,org.eclipse.wst.xsdeditor.doc.user@default:default,org.eclipse.wst.xsl.core@default:default,org.eclipse.wst.xsl.debug.ui@default:default,org.eclipse.wst.xsl.doc@default:default,org.eclipse.wst.xsl.exslt.core@default:default,org.eclipse.wst.xsl.exslt.ui@default:default,org.eclipse.wst.xsl.jaxp.debug.ui@default:default,org.eclipse.wst.xsl.jaxp.debug@default:default,org.eclipse.wst.xsl.jaxp.launching@default:default,org.eclipse.wst.xsl.launching@default:default,org.eclipse.wst.xsl.saxon@default:default,org.eclipse.wst.xsl.sdk.documentation@default:default,org.eclipse.wst.xsl.ui@default:default,org.eclipse.wst.xsl.xalan@default:default,org.eclipse.wst.xsl@default:default,org.eclipse.xsd.cheatsheets@default:default,org.eclipse.xsd.doc@default:default,org.eclipse.xsd.ecore.converter@default:default,org.eclipse.xsd.ecore.exporter@default:default,org.eclipse.xsd.ecore.importer@default:default,org.eclipse.xsd.edit@default:default,org.eclipse.xsd.editor@default:default,org.eclipse.xsd.example.installer@default:default,org.eclipse.xsd.mapping.editor@default:default,org.eclipse.xsd.mapping@default:default,org.eclipse.xsd@default:default,org.eclipse.zest.core@default:default,org.eclipse.zest.doc.isv@default:default,org.eclipse.zest.layouts@default:default,org.freemarker.freemarker@default:default,org.hamcrest.core@default:default,org.jdom@default:default,org.junit@default:default,org.mozilla.javascript@default:default,org.ow2.asm.analysis@default:default,org.ow2.asm.tree@default:default,org.ow2.asm@default:default,org.sat4j.core@default:default,org.sat4j.pb@default:default,org.uddi4j@default:default,org.w3c.css.sac@default:default,org.w3c.dom.smil@default:default,org.w3c.dom.svg@default:default"/>
-<stringAttribute key="selected_workspace_plugins" value="com.android.ide.eclipse.adt.package@default:default,com.android.ide.eclipse.adt@default:default,com.android.ide.eclipse.base@default:default,com.android.ide.eclipse.ddms@default:default,com.android.ide.eclipse.gldebugger.tests@default:default,com.android.ide.eclipse.gldebugger@default:default,com.android.ide.eclipse.hierarchyviewer@default:default,com.android.ide.eclipse.ndk@default:default,com.android.ide.eclipse.pdt@default:default,com.android.ide.eclipse.tests@default:false,com.android.ide.eclipse.traceview@default:default,overlay.com.android.ide.eclipse.adt.overlay@default:default"/>
-<booleanAttribute key="show_selected_only" value="false"/>
-<stringAttribute key="templateConfig" value="${target_home}/configuration/config.ini"/>
-<booleanAttribute key="tracing" value="false"/>
-<booleanAttribute key="useCustomFeatures" value="false"/>
-<booleanAttribute key="useDefaultConfig" value="true"/>
-<booleanAttribute key="useDefaultConfigArea" value="true"/>
-<booleanAttribute key="useProduct" value="true"/>
-</launchConfiguration>
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/build.properties b/eclipse/plugins/com.android.ide.eclipse.adt/build.properties
deleted file mode 100644
index 32d7d7e..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/build.properties
+++ /dev/null
@@ -1,12 +0,0 @@
-bin.includes = plugin.xml,\
-               META-INF/,\
-               icons/,\
-               .,\
-               libs/,\
-               templates/,\
-               about.ini,\
-               about.properties,\
-               NOTICE,\
-               about.html
-source.. = src/
-output.. = bin/
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/icons/AbsoluteLayout.png b/eclipse/plugins/com.android.ide.eclipse.adt/icons/AbsoluteLayout.png
deleted file mode 100644
index c7d2381..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/icons/AbsoluteLayout.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/icons/AdapterViewFlipper.png b/eclipse/plugins/com.android.ide.eclipse.adt/icons/AdapterViewFlipper.png
deleted file mode 100644
index 89f8c63..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/icons/AdapterViewFlipper.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/icons/AnalogClock.png b/eclipse/plugins/com.android.ide.eclipse.adt/icons/AnalogClock.png
deleted file mode 100644
index 163939c..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/icons/AnalogClock.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/icons/AutoCompleteTextView.png b/eclipse/plugins/com.android.ide.eclipse.adt/icons/AutoCompleteTextView.png
deleted file mode 100644
index ae7c284..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/icons/AutoCompleteTextView.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/icons/Button.png b/eclipse/plugins/com.android.ide.eclipse.adt/icons/Button.png
deleted file mode 100644
index 3b576c7..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/icons/Button.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/icons/CalendarView.png b/eclipse/plugins/com.android.ide.eclipse.adt/icons/CalendarView.png
deleted file mode 100644
index 033c51c..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/icons/CalendarView.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/icons/CheckBox.png b/eclipse/plugins/com.android.ide.eclipse.adt/icons/CheckBox.png
deleted file mode 100644
index 1321e1e..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/icons/CheckBox.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/icons/CheckedTextView.png b/eclipse/plugins/com.android.ide.eclipse.adt/icons/CheckedTextView.png
deleted file mode 100644
index a8c5f61..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/icons/CheckedTextView.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/icons/Chronometer.png b/eclipse/plugins/com.android.ide.eclipse.adt/icons/Chronometer.png
deleted file mode 100644
index 563f30c..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/icons/Chronometer.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/icons/DatePicker.png b/eclipse/plugins/com.android.ide.eclipse.adt/icons/DatePicker.png
deleted file mode 100644
index 107529e..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/icons/DatePicker.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/icons/DialerFilter.png b/eclipse/plugins/com.android.ide.eclipse.adt/icons/DialerFilter.png
deleted file mode 100644
index 41652ea..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/icons/DialerFilter.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/icons/DigitalClock.png b/eclipse/plugins/com.android.ide.eclipse.adt/icons/DigitalClock.png
deleted file mode 100644
index d3b8740..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/icons/DigitalClock.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/icons/EditText.png b/eclipse/plugins/com.android.ide.eclipse.adt/icons/EditText.png
deleted file mode 100644
index bb292ba..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/icons/EditText.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/icons/ExpandableListView.png b/eclipse/plugins/com.android.ide.eclipse.adt/icons/ExpandableListView.png
deleted file mode 100644
index fd10697..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/icons/ExpandableListView.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/icons/FrameLayout.png b/eclipse/plugins/com.android.ide.eclipse.adt/icons/FrameLayout.png
deleted file mode 100644
index 66bd042..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/icons/FrameLayout.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/icons/Gallery.png b/eclipse/plugins/com.android.ide.eclipse.adt/icons/Gallery.png
deleted file mode 100644
index 36b8ff6..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/icons/Gallery.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/icons/GestureOverlayView.png b/eclipse/plugins/com.android.ide.eclipse.adt/icons/GestureOverlayView.png
deleted file mode 100644
index 40acdbf..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/icons/GestureOverlayView.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/icons/GridLayout.png b/eclipse/plugins/com.android.ide.eclipse.adt/icons/GridLayout.png
deleted file mode 100644
index ca64e8c..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/icons/GridLayout.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/icons/GridView.png b/eclipse/plugins/com.android.ide.eclipse.adt/icons/GridView.png
deleted file mode 100644
index 33ae3cb..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/icons/GridView.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/icons/HorizontalScrollView.png b/eclipse/plugins/com.android.ide.eclipse.adt/icons/HorizontalScrollView.png
deleted file mode 100644
index fa142cb..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/icons/HorizontalScrollView.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/icons/ImageButton.png b/eclipse/plugins/com.android.ide.eclipse.adt/icons/ImageButton.png
deleted file mode 100644
index 01ef257..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/icons/ImageButton.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/icons/ImageSwitcher.png b/eclipse/plugins/com.android.ide.eclipse.adt/icons/ImageSwitcher.png
deleted file mode 100644
index c089a2a..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/icons/ImageSwitcher.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/icons/ImageView.png b/eclipse/plugins/com.android.ide.eclipse.adt/icons/ImageView.png
deleted file mode 100644
index 1f0ff05..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/icons/ImageView.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/icons/LinearLayout.png b/eclipse/plugins/com.android.ide.eclipse.adt/icons/LinearLayout.png
deleted file mode 100644
index 6d6a794..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/icons/LinearLayout.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/icons/ListView.png b/eclipse/plugins/com.android.ide.eclipse.adt/icons/ListView.png
deleted file mode 100644
index 09aaea9..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/icons/ListView.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/icons/MediaController.png b/eclipse/plugins/com.android.ide.eclipse.adt/icons/MediaController.png
deleted file mode 100644
index ef30b34..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/icons/MediaController.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/icons/MultiAutoCompleteTextView.png b/eclipse/plugins/com.android.ide.eclipse.adt/icons/MultiAutoCompleteTextView.png
deleted file mode 100644
index 94b823f..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/icons/MultiAutoCompleteTextView.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/icons/NumberPicker.png b/eclipse/plugins/com.android.ide.eclipse.adt/icons/NumberPicker.png
deleted file mode 100644
index 7557067..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/icons/NumberPicker.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/icons/ProgressBar.png b/eclipse/plugins/com.android.ide.eclipse.adt/icons/ProgressBar.png
deleted file mode 100644
index 23a98fc..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/icons/ProgressBar.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/icons/QuickContactBadge.png b/eclipse/plugins/com.android.ide.eclipse.adt/icons/QuickContactBadge.png
deleted file mode 100644
index b8a7a77..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/icons/QuickContactBadge.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/icons/RadioButton.png b/eclipse/plugins/com.android.ide.eclipse.adt/icons/RadioButton.png
deleted file mode 100644
index 8e55fa7..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/icons/RadioButton.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/icons/RadioGroup.png b/eclipse/plugins/com.android.ide.eclipse.adt/icons/RadioGroup.png
deleted file mode 100644
index 1070b24..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/icons/RadioGroup.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/icons/RatingBar.png b/eclipse/plugins/com.android.ide.eclipse.adt/icons/RatingBar.png
deleted file mode 100644
index 6921212..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/icons/RatingBar.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/icons/RelativeLayout.png b/eclipse/plugins/com.android.ide.eclipse.adt/icons/RelativeLayout.png
deleted file mode 100644
index 976e55f..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/icons/RelativeLayout.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/icons/ScrollView.png b/eclipse/plugins/com.android.ide.eclipse.adt/icons/ScrollView.png
deleted file mode 100644
index 618f082..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/icons/ScrollView.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/icons/SearchView.png b/eclipse/plugins/com.android.ide.eclipse.adt/icons/SearchView.png
deleted file mode 100644
index 2b45fc2..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/icons/SearchView.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/icons/SeekBar.png b/eclipse/plugins/com.android.ide.eclipse.adt/icons/SeekBar.png
deleted file mode 100644
index eeffbca..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/icons/SeekBar.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/icons/SlidingDrawer.png b/eclipse/plugins/com.android.ide.eclipse.adt/icons/SlidingDrawer.png
deleted file mode 100644
index af1e774..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/icons/SlidingDrawer.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/icons/Space.png b/eclipse/plugins/com.android.ide.eclipse.adt/icons/Space.png
deleted file mode 100644
index 28b2553..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/icons/Space.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/icons/Spinner.png b/eclipse/plugins/com.android.ide.eclipse.adt/icons/Spinner.png
deleted file mode 100644
index 34cdc7c..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/icons/Spinner.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/icons/StackView.png b/eclipse/plugins/com.android.ide.eclipse.adt/icons/StackView.png
deleted file mode 100644
index 203bafc..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/icons/StackView.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/icons/SurfaceView.png b/eclipse/plugins/com.android.ide.eclipse.adt/icons/SurfaceView.png
deleted file mode 100644
index 40b5685..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/icons/SurfaceView.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/icons/Switch.png b/eclipse/plugins/com.android.ide.eclipse.adt/icons/Switch.png
deleted file mode 100644
index 45df979..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/icons/Switch.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/icons/TabHost.png b/eclipse/plugins/com.android.ide.eclipse.adt/icons/TabHost.png
deleted file mode 100644
index 9153a88..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/icons/TabHost.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/icons/TabWidget.png b/eclipse/plugins/com.android.ide.eclipse.adt/icons/TabWidget.png
deleted file mode 100644
index 7992fa2..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/icons/TabWidget.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/icons/TableLayout.png b/eclipse/plugins/com.android.ide.eclipse.adt/icons/TableLayout.png
deleted file mode 100644
index 0a41339..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/icons/TableLayout.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/icons/TableRow.png b/eclipse/plugins/com.android.ide.eclipse.adt/icons/TableRow.png
deleted file mode 100644
index 58aeabb..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/icons/TableRow.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/icons/TextSwitcher.png b/eclipse/plugins/com.android.ide.eclipse.adt/icons/TextSwitcher.png
deleted file mode 100644
index 6de1d92..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/icons/TextSwitcher.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/icons/TextView.png b/eclipse/plugins/com.android.ide.eclipse.adt/icons/TextView.png
deleted file mode 100644
index 5eec764..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/icons/TextView.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/icons/TextureView.png b/eclipse/plugins/com.android.ide.eclipse.adt/icons/TextureView.png
deleted file mode 100644
index 353b6b7..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/icons/TextureView.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/icons/TimePicker.png b/eclipse/plugins/com.android.ide.eclipse.adt/icons/TimePicker.png
deleted file mode 100644
index 5115f6d..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/icons/TimePicker.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/icons/ToggleButton.png b/eclipse/plugins/com.android.ide.eclipse.adt/icons/ToggleButton.png
deleted file mode 100644
index 7ee1265..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/icons/ToggleButton.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/icons/TwoLineListItem.png b/eclipse/plugins/com.android.ide.eclipse.adt/icons/TwoLineListItem.png
deleted file mode 100644
index 1000979..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/icons/TwoLineListItem.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/icons/VerticalLinearLayout.png b/eclipse/plugins/com.android.ide.eclipse.adt/icons/VerticalLinearLayout.png
deleted file mode 100644
index 1d67620..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/icons/VerticalLinearLayout.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/icons/VideoView.png b/eclipse/plugins/com.android.ide.eclipse.adt/icons/VideoView.png
deleted file mode 100644
index 509b0a3..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/icons/VideoView.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/icons/View.png b/eclipse/plugins/com.android.ide.eclipse.adt/icons/View.png
deleted file mode 100644
index f07944f..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/icons/View.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/icons/ViewAnimator.png b/eclipse/plugins/com.android.ide.eclipse.adt/icons/ViewAnimator.png
deleted file mode 100644
index 7d6bea6..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/icons/ViewAnimator.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/icons/ViewFlipper.png b/eclipse/plugins/com.android.ide.eclipse.adt/icons/ViewFlipper.png
deleted file mode 100644
index 300ed2d..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/icons/ViewFlipper.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/icons/ViewStub.png b/eclipse/plugins/com.android.ide.eclipse.adt/icons/ViewStub.png
deleted file mode 100644
index e5036ff..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/icons/ViewStub.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/icons/ViewSwitcher.png b/eclipse/plugins/com.android.ide.eclipse.adt/icons/ViewSwitcher.png
deleted file mode 100644
index adc0abe..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/icons/ViewSwitcher.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/icons/WebView.png b/eclipse/plugins/com.android.ide.eclipse.adt/icons/WebView.png
deleted file mode 100644
index 90b3c06..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/icons/WebView.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/icons/ZoomButton.png b/eclipse/plugins/com.android.ide.eclipse.adt/icons/ZoomButton.png
deleted file mode 100644
index 90e0d8b..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/icons/ZoomButton.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/icons/ZoomControls.png b/eclipse/plugins/com.android.ide.eclipse.adt/icons/ZoomControls.png
deleted file mode 100644
index 7928c65..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/icons/ZoomControls.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/icons/activity.png b/eclipse/plugins/com.android.ide.eclipse.adt/icons/activity.png
deleted file mode 100644
index 3612361..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/icons/activity.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/icons/add.png b/eclipse/plugins/com.android.ide.eclipse.adt/icons/add.png
deleted file mode 100644
index eefc2ca..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/icons/add.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/icons/android-32.png b/eclipse/plugins/com.android.ide.eclipse.adt/icons/android-32.png
deleted file mode 100644
index 4e0cc13..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/icons/android-32.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/icons/android-64.png b/eclipse/plugins/com.android.ide.eclipse.adt/icons/android-64.png
deleted file mode 100644
index 2c6f149..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/icons/android-64.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/icons/android.png b/eclipse/plugins/com.android.ide.eclipse.adt/icons/android.png
deleted file mode 100644
index a8dc35e..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/icons/android.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/icons/android_app.png b/eclipse/plugins/com.android.ide.eclipse.adt/icons/android_app.png
deleted file mode 100644
index 8ca3770..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/icons/android_app.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/icons/android_file.png b/eclipse/plugins/com.android.ide.eclipse.adt/icons/android_file.png
deleted file mode 100644
index be9b8e6..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/icons/android_file.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/icons/android_project.png b/eclipse/plugins/com.android.ide.eclipse.adt/icons/android_project.png
deleted file mode 100644
index 5334568..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/icons/android_project.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/icons/androidjunit.png b/eclipse/plugins/com.android.ide.eclipse.adt/icons/androidjunit.png
deleted file mode 100644
index 25826dc..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/icons/androidjunit.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/icons/attribute.png b/eclipse/plugins/com.android.ide.eclipse.adt/icons/attribute.png
deleted file mode 100644
index 04508ea..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/icons/attribute.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/icons/avd_manager.png b/eclipse/plugins/com.android.ide.eclipse.adt/icons/avd_manager.png
deleted file mode 100644
index f8a173c..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/icons/avd_manager.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/icons/az_sort.png b/eclipse/plugins/com.android.ide.eclipse.adt/icons/az_sort.png
deleted file mode 100644
index 5d92f76..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/icons/az_sort.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/icons/bidi.png b/eclipse/plugins/com.android.ide.eclipse.adt/icons/bidi.png
deleted file mode 100644
index 4ffe131..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/icons/bidi.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/icons/checker.png b/eclipse/plugins/com.android.ide.eclipse.adt/icons/checker.png
deleted file mode 100644
index 78908f4..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/icons/checker.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/icons/clipping.png b/eclipse/plugins/com.android.ide.eclipse.adt/icons/clipping.png
deleted file mode 100644
index 6f2a35f..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/icons/clipping.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/icons/close.png b/eclipse/plugins/com.android.ide.eclipse.adt/icons/close.png
deleted file mode 100644
index a94d96c..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/icons/close.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/icons/closed-folder.png b/eclipse/plugins/com.android.ide.eclipse.adt/icons/closed-folder.png
deleted file mode 100644
index 3fe8d8b..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/icons/closed-folder.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/icons/columns.png b/eclipse/plugins/com.android.ide.eclipse.adt/icons/columns.png
deleted file mode 100644
index 6b49eae..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/icons/columns.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/icons/components_view.png b/eclipse/plugins/com.android.ide.eclipse.adt/icons/components_view.png
deleted file mode 100644
index 9f9755f..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/icons/components_view.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/icons/customView.png b/eclipse/plugins/com.android.ide.eclipse.adt/icons/customView.png
deleted file mode 100644
index 0ff48d3..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/icons/customView.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/icons/default_template.png b/eclipse/plugins/com.android.ide.eclipse.adt/icons/default_template.png
deleted file mode 100644
index ddede69..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/icons/default_template.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/icons/delete.png b/eclipse/plugins/com.android.ide.eclipse.adt/icons/delete.png
deleted file mode 100644
index db5fab8..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/icons/delete.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/icons/dimension.png b/eclipse/plugins/com.android.ide.eclipse.adt/icons/dimension.png
deleted file mode 100644
index 10057c8..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/icons/dimension.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/icons/display.png b/eclipse/plugins/com.android.ide.eclipse.adt/icons/display.png
deleted file mode 100644
index 8831f89..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/icons/display.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/icons/dockmode.png b/eclipse/plugins/com.android.ide.eclipse.adt/icons/dockmode.png
deleted file mode 100644
index 71d1804..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/icons/dockmode.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/icons/down.png b/eclipse/plugins/com.android.ide.eclipse.adt/icons/down.png
deleted file mode 100644
index 162e736..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/icons/down.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/icons/dpi.png b/eclipse/plugins/com.android.ide.eclipse.adt/icons/dpi.png
deleted file mode 100644
index fae5e96..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/icons/dpi.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/icons/draw9patch-16.png b/eclipse/plugins/com.android.ide.eclipse.adt/icons/draw9patch-16.png
deleted file mode 100644
index cc080e7..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/icons/draw9patch-16.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/icons/editPreview.png b/eclipse/plugins/com.android.ide.eclipse.adt/icons/editPreview.png
deleted file mode 100644
index fd36133..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/icons/editPreview.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/icons/editor_page_design.png b/eclipse/plugins/com.android.ide.eclipse.adt/icons/editor_page_design.png
deleted file mode 100644
index a19f3b0..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/icons/editor_page_design.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/icons/editor_page_source.png b/eclipse/plugins/com.android.ide.eclipse.adt/icons/editor_page_source.png
deleted file mode 100644
index 874cc1e..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/icons/editor_page_source.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/icons/element.png b/eclipse/plugins/com.android.ide.eclipse.adt/icons/element.png
deleted file mode 100644
index e5cd0ca..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/icons/element.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/icons/error-badge.png b/eclipse/plugins/com.android.ide.eclipse.adt/icons/error-badge.png
deleted file mode 100644
index 2e63c35..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/icons/error-badge.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/icons/error.png b/eclipse/plugins/com.android.ide.eclipse.adt/icons/error.png
deleted file mode 100644
index 1eecf2c..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/icons/error.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/icons/expandall-disabled.png b/eclipse/plugins/com.android.ide.eclipse.adt/icons/expandall-disabled.png
deleted file mode 100644
index 0897da3..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/icons/expandall-disabled.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/icons/expandall.png b/eclipse/plugins/com.android.ide.eclipse.adt/icons/expandall.png
deleted file mode 100644
index 7bdf83d..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/icons/expandall.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/icons/explode.png b/eclipse/plugins/com.android.ide.eclipse.adt/icons/explode.png
deleted file mode 100644
index f250055..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/icons/explode.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/icons/filter_advanced_properties.png b/eclipse/plugins/com.android.ide.eclipse.adt/icons/filter_advanced_properties.png
deleted file mode 100644
index 5f5b078..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/icons/filter_advanced_properties.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/icons/flip_landscape.png b/eclipse/plugins/com.android.ide.eclipse.adt/icons/flip_landscape.png
deleted file mode 100644
index 4940cea..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/icons/flip_landscape.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/icons/flip_portrait.png b/eclipse/plugins/com.android.ide.eclipse.adt/icons/flip_portrait.png
deleted file mode 100644
index c28a980..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/icons/flip_portrait.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/icons/fragment.png b/eclipse/plugins/com.android.ide.eclipse.adt/icons/fragment.png
deleted file mode 100644
index 4e31546..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/icons/fragment.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/icons/globe.png b/eclipse/plugins/com.android.ide.eclipse.adt/icons/globe.png
deleted file mode 100644
index 45e5e05..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/icons/globe.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/icons/goto_definition.png b/eclipse/plugins/com.android.ide.eclipse.adt/icons/goto_definition.png
deleted file mode 100644
index daac537..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/icons/goto_definition.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/icons/gradle.png b/eclipse/plugins/com.android.ide.eclipse.adt/icons/gradle.png
deleted file mode 100644
index 63ba4c2..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/icons/gradle.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/icons/height.png b/eclipse/plugins/com.android.ide.eclipse.adt/icons/height.png
deleted file mode 100644
index 33c0774..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/icons/height.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/icons/ignore-all-disabled.png b/eclipse/plugins/com.android.ide.eclipse.adt/icons/ignore-all-disabled.png
deleted file mode 100644
index 56f0098..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/icons/ignore-all-disabled.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/icons/ignore-all.png b/eclipse/plugins/com.android.ide.eclipse.adt/icons/ignore-all.png
deleted file mode 100644
index 581e323..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/icons/ignore-all.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/icons/ignore-file-disabled.png b/eclipse/plugins/com.android.ide.eclipse.adt/icons/ignore-file-disabled.png
deleted file mode 100644
index e995699..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/icons/ignore-file-disabled.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/icons/ignore-file.png b/eclipse/plugins/com.android.ide.eclipse.adt/icons/ignore-file.png
deleted file mode 100644
index 12d656d..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/icons/ignore-file.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/icons/ignore-project-disabled.png b/eclipse/plugins/com.android.ide.eclipse.adt/icons/ignore-project-disabled.png
deleted file mode 100644
index 33e21a5..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/icons/ignore-project-disabled.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/icons/ignore-project.png b/eclipse/plugins/com.android.ide.eclipse.adt/icons/ignore-project.png
deleted file mode 100644
index d8e0975..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/icons/ignore-project.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/icons/ignore-this-disabled.png b/eclipse/plugins/com.android.ide.eclipse.adt/icons/ignore-this-disabled.png
deleted file mode 100644
index 0576450..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/icons/ignore-this-disabled.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/icons/ignore-this.png b/eclipse/plugins/com.android.ide.eclipse.adt/icons/ignore-this.png
deleted file mode 100644
index 3e66d82..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/icons/ignore-this.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/icons/include.png b/eclipse/plugins/com.android.ide.eclipse.adt/icons/include.png
deleted file mode 100644
index d8eecd9..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/icons/include.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/icons/keyboard.png b/eclipse/plugins/com.android.ide.eclipse.adt/icons/keyboard.png
deleted file mode 100644
index 7911a85..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/icons/keyboard.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/icons/landscape.png b/eclipse/plugins/com.android.ide.eclipse.adt/icons/landscape.png
deleted file mode 100644
index 4ed5c2e..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/icons/landscape.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/icons/language.png b/eclipse/plugins/com.android.ide.eclipse.adt/icons/language.png
deleted file mode 100644
index a727dd5..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/icons/language.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/icons/lint1.png b/eclipse/plugins/com.android.ide.eclipse.adt/icons/lint1.png
deleted file mode 100644
index f429164..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/icons/lint1.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/icons/lint2.png b/eclipse/plugins/com.android.ide.eclipse.adt/icons/lint2.png
deleted file mode 100644
index 8434b78..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/icons/lint2.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/icons/lint3.png b/eclipse/plugins/com.android.ide.eclipse.adt/icons/lint3.png
deleted file mode 100644
index 43ab63e..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/icons/lint3.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/icons/lint4.png b/eclipse/plugins/com.android.ide.eclipse.adt/icons/lint4.png
deleted file mode 100644
index 67fee2d..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/icons/lint4.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/icons/lint5.png b/eclipse/plugins/com.android.ide.eclipse.adt/icons/lint5.png
deleted file mode 100644
index 3d0c188..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/icons/lint5.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/icons/lint6.png b/eclipse/plugins/com.android.ide.eclipse.adt/icons/lint6.png
deleted file mode 100644
index 42a9767..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/icons/lint6.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/icons/lint7.png b/eclipse/plugins/com.android.ide.eclipse.adt/icons/lint7.png
deleted file mode 100644
index 743aabc..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/icons/lint7.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/icons/lint8.png b/eclipse/plugins/com.android.ide.eclipse.adt/icons/lint8.png
deleted file mode 100644
index 927067a..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/icons/lint8.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/icons/lint9.png b/eclipse/plugins/com.android.ide.eclipse.adt/icons/lint9.png
deleted file mode 100644
index 44e66a0..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/icons/lint9.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/icons/lint9p.png b/eclipse/plugins/com.android.ide.eclipse.adt/icons/lint9p.png
deleted file mode 100644
index 853ace9..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/icons/lint9p.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/icons/lintrun.png b/eclipse/plugins/com.android.ide.eclipse.adt/icons/lintrun.png
deleted file mode 100644
index d1a074b..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/icons/lintrun.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/icons/lintview.png b/eclipse/plugins/com.android.ide.eclipse.adt/icons/lintview.png
deleted file mode 100644
index c22d68d..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/icons/lintview.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/icons/mainLaunchTab.png b/eclipse/plugins/com.android.ide.eclipse.adt/icons/mainLaunchTab.png
deleted file mode 100644
index 2540fbb..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/icons/mainLaunchTab.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/icons/match.png b/eclipse/plugins/com.android.ide.eclipse.adt/icons/match.png
deleted file mode 100644
index 7e939c2..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/icons/match.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/icons/match_multiple.png b/eclipse/plugins/com.android.ide.eclipse.adt/icons/match_multiple.png
deleted file mode 100644
index 79ffc2d..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/icons/match_multiple.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/icons/mcc.png b/eclipse/plugins/com.android.ide.eclipse.adt/icons/mcc.png
deleted file mode 100644
index 4dc95d7..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/icons/mcc.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/icons/merge.png b/eclipse/plugins/com.android.ide.eclipse.adt/icons/merge.png
deleted file mode 100644
index 18087bd..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/icons/merge.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/icons/minimizePreview.png b/eclipse/plugins/com.android.ide.eclipse.adt/icons/minimizePreview.png
deleted file mode 100644
index 4ddc540..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/icons/minimizePreview.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/icons/mnc.png b/eclipse/plugins/com.android.ide.eclipse.adt/icons/mnc.png
deleted file mode 100644
index aefffe4..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/icons/mnc.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/icons/navpad.png b/eclipse/plugins/com.android.ide.eclipse.adt/icons/navpad.png
deleted file mode 100644
index c2bb79a..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/icons/navpad.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/icons/newConfig.png b/eclipse/plugins/com.android.ide.eclipse.adt/icons/newConfig.png
deleted file mode 100644
index d6317df..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/icons/newConfig.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/icons/newCustomView.png b/eclipse/plugins/com.android.ide.eclipse.adt/icons/newCustomView.png
deleted file mode 100644
index dc64f4f..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/icons/newCustomView.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/icons/newJunit.png b/eclipse/plugins/com.android.ide.eclipse.adt/icons/newJunit.png
deleted file mode 100644
index e881e79..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/icons/newJunit.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/icons/new_adt_project.png b/eclipse/plugins/com.android.ide.eclipse.adt/icons/new_adt_project.png
deleted file mode 100644
index 0f0e883..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/icons/new_adt_project.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/icons/new_asset_set.png b/eclipse/plugins/com.android.ide.eclipse.adt/icons/new_asset_set.png
deleted file mode 100644
index 108dcb1..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/icons/new_asset_set.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/icons/new_xml.png b/eclipse/plugins/com.android.ide.eclipse.adt/icons/new_xml.png
deleted file mode 100644
index 59e1891..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/icons/new_xml.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/icons/newannotation.png b/eclipse/plugins/com.android.ide.eclipse.adt/icons/newannotation.png
deleted file mode 100644
index d2e4721..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/icons/newannotation.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/icons/nightmode.png b/eclipse/plugins/com.android.ide.eclipse.adt/icons/nightmode.png
deleted file mode 100644
index a04e4cf..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/icons/nightmode.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/icons/open-folder.png b/eclipse/plugins/com.android.ide.eclipse.adt/icons/open-folder.png
deleted file mode 100644
index 8c4a2e1..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/icons/open-folder.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/icons/options.png b/eclipse/plugins/com.android.ide.eclipse.adt/icons/options.png
deleted file mode 100644
index 01948a2..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/icons/options.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/icons/orientation.png b/eclipse/plugins/com.android.ide.eclipse.adt/icons/orientation.png
deleted file mode 100644
index 53b5e62..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/icons/orientation.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/icons/outline.png b/eclipse/plugins/com.android.ide.eclipse.adt/icons/outline.png
deleted file mode 100644
index dbfb63b..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/icons/outline.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/icons/palette.png b/eclipse/plugins/com.android.ide.eclipse.adt/icons/palette.png
deleted file mode 100644
index fd7ca1c..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/icons/palette.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/icons/portrait.png b/eclipse/plugins/com.android.ide.eclipse.adt/icons/portrait.png
deleted file mode 100644
index 3786153..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/icons/portrait.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/icons/properties_default.png b/eclipse/plugins/com.android.ide.eclipse.adt/icons/properties_default.png
deleted file mode 100644
index 5696a31..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/icons/properties_default.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/icons/properties_view.png b/eclipse/plugins/com.android.ide.eclipse.adt/icons/properties_view.png
deleted file mode 100644
index 8df5d2d..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/icons/properties_view.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/icons/quickfix-disabled.png b/eclipse/plugins/com.android.ide.eclipse.adt/icons/quickfix-disabled.png
deleted file mode 100644
index 262bdac..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/icons/quickfix-disabled.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/icons/quickfix.png b/eclipse/plugins/com.android.ide.eclipse.adt/icons/quickfix.png
deleted file mode 100644
index a433199..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/icons/quickfix.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/icons/quickfix_error.png b/eclipse/plugins/com.android.ide.eclipse.adt/icons/quickfix_error.png
deleted file mode 100644
index 92022ee..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/icons/quickfix_error.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/icons/quickfix_warning.png b/eclipse/plugins/com.android.ide.eclipse.adt/icons/quickfix_warning.png
deleted file mode 100644
index bfbde37..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/icons/quickfix_warning.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/icons/ratio.png b/eclipse/plugins/com.android.ide.eclipse.adt/icons/ratio.png
deleted file mode 100644
index 8bf07f2..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/icons/ratio.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/icons/refresh.png b/eclipse/plugins/com.android.ide.eclipse.adt/icons/refresh.png
deleted file mode 100644
index 7cbebf4..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/icons/refresh.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/icons/refreshPreview.png b/eclipse/plugins/com.android.ide.eclipse.adt/icons/refreshPreview.png
deleted file mode 100644
index d103763..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/icons/refreshPreview.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/icons/region.png b/eclipse/plugins/com.android.ide.eclipse.adt/icons/region.png
deleted file mode 100644
index 9608cd6..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/icons/region.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/icons/renderError.png b/eclipse/plugins/com.android.ide.eclipse.adt/icons/renderError.png
deleted file mode 100644
index 95be641..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/icons/renderError.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/icons/requestFocus.png b/eclipse/plugins/com.android.ide.eclipse.adt/icons/requestFocus.png
deleted file mode 100644
index ed239d4..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/icons/requestFocus.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/icons/restorePreview.png b/eclipse/plugins/com.android.ide.eclipse.adt/icons/restorePreview.png
deleted file mode 100644
index d6b3f32..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/icons/restorePreview.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/icons/sdk_manager.png b/eclipse/plugins/com.android.ide.eclipse.adt/icons/sdk_manager.png
deleted file mode 100644
index 08ffda8..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/icons/sdk_manager.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/icons/shadow-b.png b/eclipse/plugins/com.android.ide.eclipse.adt/icons/shadow-b.png
deleted file mode 100644
index 68f4f4b..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/icons/shadow-b.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/icons/shadow-bl.png b/eclipse/plugins/com.android.ide.eclipse.adt/icons/shadow-bl.png
deleted file mode 100644
index ee7dbe8..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/icons/shadow-bl.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/icons/shadow-br.png b/eclipse/plugins/com.android.ide.eclipse.adt/icons/shadow-br.png
deleted file mode 100644
index c45ad77..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/icons/shadow-br.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/icons/shadow-r.png b/eclipse/plugins/com.android.ide.eclipse.adt/icons/shadow-r.png
deleted file mode 100644
index 4af7a33..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/icons/shadow-r.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/icons/shadow-tr.png b/eclipse/plugins/com.android.ide.eclipse.adt/icons/shadow-tr.png
deleted file mode 100644
index 1fd0c77..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/icons/shadow-tr.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/icons/shadow2-b.png b/eclipse/plugins/com.android.ide.eclipse.adt/icons/shadow2-b.png
deleted file mode 100644
index 963973e..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/icons/shadow2-b.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/icons/shadow2-bl.png b/eclipse/plugins/com.android.ide.eclipse.adt/icons/shadow2-bl.png
deleted file mode 100644
index 7612487..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/icons/shadow2-bl.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/icons/shadow2-br.png b/eclipse/plugins/com.android.ide.eclipse.adt/icons/shadow2-br.png
deleted file mode 100644
index 8e20252..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/icons/shadow2-br.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/icons/shadow2-r.png b/eclipse/plugins/com.android.ide.eclipse.adt/icons/shadow2-r.png
deleted file mode 100644
index 8e026f1..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/icons/shadow2-r.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/icons/shadow2-tr.png b/eclipse/plugins/com.android.ide.eclipse.adt/icons/shadow2-tr.png
deleted file mode 100644
index 590373c..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/icons/shadow2-tr.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/icons/size.png b/eclipse/plugins/com.android.ide.eclipse.adt/icons/size.png
deleted file mode 100644
index c8a82b0..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/icons/size.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/icons/sort_alpha.png b/eclipse/plugins/com.android.ide.eclipse.adt/icons/sort_alpha.png
deleted file mode 100644
index 112e05b..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/icons/sort_alpha.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/icons/square.png b/eclipse/plugins/com.android.ide.eclipse.adt/icons/square.png
deleted file mode 100644
index 7cc8a4c..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/icons/square.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/icons/swidth.png b/eclipse/plugins/com.android.ide.eclipse.adt/icons/swidth.png
deleted file mode 100644
index b74a68f..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/icons/swidth.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/icons/text_input.png b/eclipse/plugins/com.android.ide.eclipse.adt/icons/text_input.png
deleted file mode 100644
index b4ddc87..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/icons/text_input.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/icons/themes.png b/eclipse/plugins/com.android.ide.eclipse.adt/icons/themes.png
deleted file mode 100644
index c96394c..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/icons/themes.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/icons/touch.png b/eclipse/plugins/com.android.ide.eclipse.adt/icons/touch.png
deleted file mode 100644
index 6536576..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/icons/touch.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/icons/up.png b/eclipse/plugins/com.android.ide.eclipse.adt/icons/up.png
deleted file mode 100644
index fac118b..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/icons/up.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/icons/version.png b/eclipse/plugins/com.android.ide.eclipse.adt/icons/version.png
deleted file mode 100644
index a8dc35e..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/icons/version.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/icons/view_menu.png b/eclipse/plugins/com.android.ide.eclipse.adt/icons/view_menu.png
deleted file mode 100644
index 8575107..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/icons/view_menu.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/icons/warning-badge.png b/eclipse/plugins/com.android.ide.eclipse.adt/icons/warning-badge.png
deleted file mode 100644
index d71d6e3..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/icons/warning-badge.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/icons/warning.png b/eclipse/plugins/com.android.ide.eclipse.adt/icons/warning.png
deleted file mode 100644
index ca3b6ed..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/icons/warning.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/icons/width.png b/eclipse/plugins/com.android.ide.eclipse.adt/icons/width.png
deleted file mode 100644
index e5243fa..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/icons/width.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/icons/zoom100.png b/eclipse/plugins/com.android.ide.eclipse.adt/icons/zoom100.png
deleted file mode 100644
index b127559..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/icons/zoom100.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/icons/zoomfit.png b/eclipse/plugins/com.android.ide.eclipse.adt/icons/zoomfit.png
deleted file mode 100644
index 242b24a..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/icons/zoomfit.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/icons/zoomminus.png b/eclipse/plugins/com.android.ide.eclipse.adt/icons/zoomminus.png
deleted file mode 100644
index aa6409e..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/icons/zoomminus.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/icons/zoomplus.png b/eclipse/plugins/com.android.ide.eclipse.adt/icons/zoomplus.png
deleted file mode 100644
index dbbd5c8..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/icons/zoomplus.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/icons/zoomreal.png b/eclipse/plugins/com.android.ide.eclipse.adt/icons/zoomreal.png
deleted file mode 100644
index 2a020e0..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/icons/zoomreal.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/plugin.xml b/eclipse/plugins/com.android.ide.eclipse.adt/plugin.xml
deleted file mode 100644
index 5584914..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/plugin.xml
+++ /dev/null
@@ -1,1340 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.2"?>
-<plugin>
-    <extension
-        id="com.android.ide.eclipse.common.xmlProblem"
-        name="Android XML Format Problem"
-        point="org.eclipse.core.resources.markers">
-        <super type="org.eclipse.core.resources.problemmarker" />
-        <super type="org.eclipse.core.resources.textmarker" />
-        <persistent value="true" />
-    </extension>
-    <extension
-        id="com.android.ide.eclipse.common.aaptProblem"
-        name="Android AAPT Problem"
-        point="org.eclipse.core.resources.markers">
-        <super type="org.eclipse.core.resources.problemmarker" />
-        <super type="org.eclipse.core.resources.textmarker" />
-        <persistent value="true" />
-    </extension>
-    <extension
-        id="com.android.ide.eclipse.common.aapt2Problem"
-        name="Android AAPT Problem"
-        point="org.eclipse.core.resources.markers">
-        <super type="org.eclipse.core.resources.problemmarker" />
-        <super type="org.eclipse.core.resources.textmarker" />
-        <persistent value="true" />
-    </extension>
-    <extension
-        id="com.android.ide.eclipse.common.aidlProblem"
-        name="Android AIDL Problem"
-        point="org.eclipse.core.resources.markers">
-        <super type="org.eclipse.core.resources.problemmarker" />
-        <super type="org.eclipse.core.resources.textmarker" />
-        <persistent value="true" />
-    </extension>
-    <extension
-        id="com.android.ide.eclipse.common.rsProblem"
-        name="Android RenderScript Problem"
-        point="org.eclipse.core.resources.markers">
-        <super type="org.eclipse.core.resources.problemmarker" />
-        <super type="org.eclipse.core.resources.textmarker" />
-        <persistent value="true" />
-    </extension>
-    <extension
-        id="com.android.ide.eclipse.common.androidProblem"
-        name="Android XML Content Problem"
-        point="org.eclipse.core.resources.markers">
-        <super type="org.eclipse.core.resources.problemmarker" />
-        <super type="org.eclipse.core.resources.textmarker" />
-        <persistent value="true" />
-    </extension>
-    <extension
-        id="com.android.ide.eclipse.adt.lintProblem"
-        name="Android Lint Problem"
-        point="org.eclipse.core.resources.markers">
-        <super type="org.eclipse.core.resources.problemmarker" />
-        <super type="org.eclipse.core.resources.textmarker" />
-        <persistent value="true" />
-    </extension>
-    <extension
-        id="com.android.ide.eclipse.adt.manifMergerProblem"
-        name="Android Manifest Merger Problem"
-        point="org.eclipse.core.resources.markers">
-        <super type="org.eclipse.core.resources.problemmarker" />
-        <super type="org.eclipse.core.resources.textmarker" />
-        <persistent value="true" />
-    </extension>
-    <extension
-        id="com.android.ide.eclipse.adt.adtProblem"
-        name="Android ADT Problem"
-        point="org.eclipse.core.resources.markers">
-        <super type="org.eclipse.core.resources.problemmarker" />
-        <super type="org.eclipse.core.resources.textmarker" />
-        <persistent value="true" />
-    </extension>
-    <extension
-        id="com.android.ide.eclipse.adt.targetProblem"
-        name="Android Target Problem"
-        point="org.eclipse.core.resources.markers">
-        <super type="org.eclipse.core.resources.problemmarker" />
-        <persistent value="false" />
-    </extension>
-    <extension
-        id="com.android.ide.eclipse.adt.buildToolsProblem"
-        name="Android Build Tools Problem"
-        point="org.eclipse.core.resources.markers">
-        <super type="org.eclipse.core.resources.problemmarker" />
-        <persistent value="false" />
-    </extension>
-    <extension
-        id="com.android.ide.eclipse.adt.dependencyProblem"
-        name="Android Dependency Problem"
-        point="org.eclipse.core.resources.markers">
-        <super type="org.eclipse.core.resources.problemmarker" />
-        <persistent value="false" />
-    </extension>
-    <extension
-        id="com.android.ide.eclipse.adt.packagingProblem"
-        name="Android Packaging Problem"
-        point="org.eclipse.core.resources.markers">
-        <super type="org.eclipse.core.resources.problemmarker" />
-        <persistent value="true" />
-    </extension>
-    <extension point="org.eclipse.ui.ide.markerResolution">
-        <markerResolutionGenerator
-            markerType="com.android.ide.eclipse.adt.lintProblem"
-            class="com.android.ide.eclipse.adt.internal.lint.LintFixGenerator" />
-        <markerResolutionGenerator
-            markerType="com.android.ide.eclipse.common.aaptProblem"
-            class="com.android.ide.eclipse.adt.internal.build.AaptQuickFix" />
-    </extension>
-    <extension
-        id="ResourceManagerBuilder"
-        name="Android Resource Manager"
-        point="org.eclipse.core.resources.builders">
-        <builder hasNature="true">
-            <run class="com.android.ide.eclipse.adt.internal.build.builders.ResourceManagerBuilder" />
-        </builder>
-    </extension>
-    <extension
-        id="PreCompilerBuilder"
-        name="Android Pre Compiler"
-        point="org.eclipse.core.resources.builders">
-        <builder hasNature="true">
-            <run class="com.android.ide.eclipse.adt.internal.build.builders.PreCompilerBuilder" />
-        </builder>
-    </extension>
-    <extension
-        id="ApkBuilder"
-        name="Android Package Builder"
-        point="org.eclipse.core.resources.builders">
-        <builder hasNature="true">
-            <run class="com.android.ide.eclipse.adt.internal.build.builders.PostCompilerBuilder" />
-        </builder>
-    </extension>
-    <extension
-        id="AndroidNature"
-        name="Android Project Nature"
-        point="org.eclipse.core.resources.natures">
-        <runtime>
-            <run class="com.android.ide.eclipse.adt.internal.project.AndroidNature" />
-        </runtime>
-        <builder id="com.android.ide.eclipse.adt.ResourceManagerBuilder" />
-        <builder id="com.android.ide.eclipse.adt.PreCompilerBuilder" />
-        <builder id="com.android.ide.eclipse.adt.ApkBuilder" />
-    </extension>
-    <extension
-        id="ExportNature"
-        name="Android Export Project Nature"
-        point="org.eclipse.core.resources.natures">
-        <runtime>
-            <run class="com.android.ide.eclipse.adt.internal.project.ExportNature" />
-        </runtime>
-    </extension>
-    <extension
-        point="org.eclipse.ui.importWizards">
-        <category
-            id="com.android.ide.eclipse.wizards.category"
-            name="Android" />
-        <wizard
-            canFinishEarly="false"
-            category="com.android.ide.eclipse.wizards.category"
-            class="com.android.ide.eclipse.adt.internal.wizards.newproject.ImportProjectWizard"
-            finalPerspective="org.eclipse.jdt.ui.JavaPerspective"
-            hasPages="true"
-            icon="icons/new_adt_project.png"
-            id="com.android.ide.eclipse.adt.project.ImportProjectWizard"
-            name="Existing Android Code Into Workspace"
-            preferredPerspectives="org.eclipse.jdt.ui.JavaPerspective"
-            project="true">
-        </wizard>
-    </extension>
-    <extension point="org.eclipse.ui.newWizards">
-        <category
-            id="com.android.ide.eclipse.wizards.category"
-            name="Android" />
-        <wizard
-            canFinishEarly="false"
-            category="com.android.ide.eclipse.wizards.category"
-            class="com.android.ide.eclipse.adt.internal.wizards.templates.NewProjectWizard"
-            finalPerspective="org.eclipse.jdt.ui.JavaPerspective"
-            hasPages="true"
-            icon="icons/new_adt_project.png"
-            id="com.android.ide.eclipse.adt.project.NewProjectWizard"
-            name="Android Application Project"
-            preferredPerspectives="org.eclipse.jdt.ui.JavaPerspective"
-            project="true" >
-            <description>
-               Create an Android Application Project
-            </description>
-        </wizard>
-        <wizard
-            canFinishEarly="false"
-            category="com.android.ide.eclipse.wizards.category"
-            class="com.android.ide.eclipse.adt.internal.wizards.newproject.NewTestProjectWizard"
-            finalPerspective="org.eclipse.jdt.ui.JavaPerspective"
-            hasPages="true"
-            icon="icons/newJunit.png"
-            id="com.android.ide.eclipse.adt.project.NewTestProjectWizard"
-            name="Android Test Project"
-            preferredPerspectives="org.eclipse.jdt.ui.JavaPerspective"
-            project="true">
-            <description>
-               Create an Android Test Project
-            </description>
-        </wizard>
-        <wizard
-            canFinishEarly="false"
-            category="com.android.ide.eclipse.wizards.category"
-            class="com.android.ide.eclipse.adt.internal.wizards.newproject.NewSampleProjectWizard"
-            finalPerspective="org.eclipse.jdt.ui.JavaPerspective"
-            hasPages="true"
-            icon="icons/new_adt_project.png"
-            id="com.android.ide.eclipse.adt.project.NewSampleProjectWizard"
-            name="Android Sample Project"
-            preferredPerspectives="org.eclipse.jdt.ui.JavaPerspective"
-            project="true">
-            <description>
-               Create an Android Sample Project
-            </description>
-        </wizard>
-        <wizard
-            canFinishEarly="false"
-            category="com.android.ide.eclipse.wizards.category"
-            class="com.android.ide.eclipse.adt.internal.wizards.newproject.ImportProjectWizard"
-            finalPerspective="org.eclipse.jdt.ui.JavaPerspective"
-            hasPages="true"
-            icon="icons/new_adt_project.png"
-            id="com.android.ide.eclipse.adt.project.ImportProjectWizard.NewPrj"
-            name="Android Project from Existing Code"
-            preferredPerspectives="org.eclipse.jdt.ui.JavaPerspective"
-            project="true">
-            <description>
-               Create one or more Android projects from existing code
-            </description>
-        </wizard>
-        <wizard
-            canFinishEarly="false"
-            category="com.android.ide.eclipse.wizards.category"
-            class="com.android.ide.eclipse.adt.internal.wizards.newxmlfile.NewXmlFileWizard"
-            finalPerspective="org.eclipse.jdt.ui.JavaPerspective"
-            hasPages="true"
-            icon="icons/new_xml.png"
-            id="com.android.ide.eclipse.editors.wizards.NewXmlFileWizard"
-            name="Android XML File"
-            preferredPerspectives="org.eclipse.jdt.ui.JavaPerspective"
-            project="false">
-            <description>
-               Create an Android resource XML file
-            </description>
-        </wizard>
-        <wizard
-            canFinishEarly="false"
-            category="com.android.ide.eclipse.wizards.category"
-            class="com.android.ide.eclipse.adt.internal.wizards.newxmlfile.NewXmlFileWizard$NewLayoutWizard"
-            finalPerspective="org.eclipse.jdt.ui.JavaPerspective"
-            hasPages="true"
-            icon="icons/new_xml.png"
-            id="com.android.ide.eclipse.editors.wizards.NewXmlFileWizard.Layout"
-            name="Android XML Layout File"
-            preferredPerspectives="org.eclipse.jdt.ui.JavaPerspective"
-            project="false">
-            <description>
-               Create an Android layout XML file
-            </description>
-        </wizard>
-        <wizard
-            canFinishEarly="false"
-            category="com.android.ide.eclipse.wizards.category"
-            class="com.android.ide.eclipse.adt.internal.wizards.newxmlfile.NewXmlFileWizard$NewValuesWizard"
-            finalPerspective="org.eclipse.jdt.ui.JavaPerspective"
-            hasPages="true"
-            icon="icons/new_xml.png"
-            id="com.android.ide.eclipse.editors.wizards.NewXmlFileWizard.Values"
-            name="Android XML Values File"
-            preferredPerspectives="org.eclipse.jdt.ui.JavaPerspective"
-            project="false">
-            <description>
-               Create an Android XML values file such as strings.xml
-            </description>
-        </wizard>
-        <wizard
-            canFinishEarly="false"
-            category="com.android.ide.eclipse.wizards.category"
-            class="com.android.ide.eclipse.adt.internal.wizards.templates.NewActivityWizard"
-            finalPerspective="org.eclipse.jdt.ui.JavaPerspective"
-            hasPages="true"
-            icon="icons/new_adt_project.png"
-            id="com.android.ide.eclipse.editors.wizards.NewActivityWizard"
-            name="Android Activity"
-            preferredPerspectives="org.eclipse.jdt.ui.JavaPerspective"
-            project="false" >
-            <description>
-               Create an Android Activity
-            </description>
-        </wizard>
-        <wizard
-            canFinishEarly="false"
-            category="com.android.ide.eclipse.wizards.category"
-            class="com.android.ide.eclipse.adt.internal.wizards.templates.NewActivityWizard$OtherWizard"
-            finalPerspective="org.eclipse.jdt.ui.JavaPerspective"
-            hasPages="true"
-            icon="icons/newCustomView.png"
-            id="com.android.ide.eclipse.editors.wizards.NewActivityWizard.OtherWizard"
-            name="Android Object"
-            preferredPerspectives="org.eclipse.jdt.ui.JavaPerspective"
-            project="false" >
-            <description>
-               Create an Android object such as a Service, an Activity, a Broadcast Receiver, a Notification, etc.
-            </description>
-        </wizard>
-        <!-- Available through generic object list above
-        <wizard
-            canFinishEarly="false"
-            category="com.android.ide.eclipse.wizards.category"
-            class="com.android.ide.eclipse.adt.internal.wizards.templates.NewTemplateWizard$NewCustomViewWizard"
-            finalPerspective="org.eclipse.jdt.ui.JavaPerspective"
-            hasPages="true"
-            icon="icons/newCustomView.png"
-            id="com.android.ide.eclipse.editors.wizards.NewTemplateWizard.CustomView"
-            name="Android Custom View"
-            preferredPerspectives="org.eclipse.jdt.ui.JavaPerspective"
-            project="false" >
-            <description>
-               Create an Android custom view
-            </description>
-        </wizard>
-        -->
-        <wizard
-            canFinishEarly="false"
-            category="com.android.ide.eclipse.wizards.category"
-            class="com.android.ide.eclipse.adt.internal.assetstudio.CreateAssetSetWizard"
-            finalPerspective="org.eclipse.jdt.ui.JavaPerspective"
-            hasPages="true"
-            icon="icons/new_asset_set.png"
-            id="com.android.ide.eclipse.adt.internal.assetstudio.CreateAssetSetWizard"
-            name="Android Icon Set"
-            preferredPerspectives="org.eclipse.jdt.ui.JavaPerspective"
-            project="false" >
-            <description>
-               Create an Android icon set
-            </description>
-        </wizard>
-
-        <!-- During development only: Support for testing templates -->
-        <wizard
-            canFinishEarly="false"
-            category="com.android.ide.eclipse.wizards.category"
-            class="com.android.ide.eclipse.adt.internal.wizards.templates.TemplateTestWizard"
-            finalPerspective="org.eclipse.jdt.ui.JavaPerspective"
-            hasPages="true"
-            icon="icons/androidjunit.png"
-            id="com.android.ide.eclipse.editors.wizards.TemplateTestWizard"
-            name="Template Development Wizard"
-            preferredPerspectives="org.eclipse.jdt.ui.JavaPerspective"
-            project="false" />
-    </extension>
-    <extension point="org.eclipse.debug.core.launchConfigurationTypes">
-        <launchConfigurationType
-            delegate="com.android.ide.eclipse.adt.internal.launch.LaunchConfigDelegate"
-            delegateDescription="The Android Application Launcher supports running and debugging remote Android applications on devices or emulators."
-            delegateName="Android Launcher"
-            id="com.android.ide.eclipse.adt.debug.LaunchConfigType"
-            modes="debug, run"
-            name="Android Application"
-            public="true"
-            sourceLocatorId="com.android.ide.eclipse.adt.internal.sourcelookup.AdtSourceLookupDirector"
-            sourcePathComputerId="org.eclipse.jdt.launching.sourceLookup.javaSourcePathComputer">
-        </launchConfigurationType>
-    </extension>
-    <extension point="org.eclipse.debug.ui.launchConfigurationTypeImages">
-        <launchConfigurationTypeImage
-            configTypeID="com.android.ide.eclipse.adt.debug.LaunchConfigType"
-            icon="icons/android_app.png"
-            id="com.android.ide.eclipse.adt.debug.LaunchConfigTypeImage" />
-    </extension>
-    <extension point="org.eclipse.debug.ui.launchConfigurationTabGroups">
-        <launchConfigurationTabGroup
-            class="com.android.ide.eclipse.adt.internal.launch.LaunchConfigTabGroup"
-            description="Android Application"
-            id="com.android.ide.eclipse.adt.debug.LaunchConfigTabGroup"
-            type="com.android.ide.eclipse.adt.debug.LaunchConfigType" />
-    </extension>
-    <extension point="org.eclipse.debug.ui.launchShortcuts">
-        <shortcut
-            class="com.android.ide.eclipse.adt.internal.launch.LaunchShortcut"
-            icon="icons/android_app.png"
-            id="com.android.ide.eclipse.adt.debug.launching.LaunchShortcut"
-            label="Android Application"
-            modes="run, debug">
-            <contextualLaunch>
-                <enablement>
-                    <with variable="selection">
-                        <count value="1" />
-                        <iterate>
-                            <or>
-                                <adapt type="org.eclipse.core.resources.IFile">
-                                    <and>
-                                        <test
-                                            property="org.eclipse.core.resources.contentTypeId"
-                                            value="org.eclipse.core.runtime.xml" />
-                                        <test
-                                            property="org.eclipse.core.resources.projectNature"
-                                            value="com.android.ide.eclipse.adt.AndroidNature" />
-                                    </and>
-                                </adapt>
-                                <and>
-                                    <test property="org.eclipse.jdt.launching.isContainer" />
-                                    <test
-                                        property="org.eclipse.jdt.launching.hasProjectNature"
-                                        args="com.android.ide.eclipse.adt.AndroidNature" />
-                                </and>
-                            </or>
-                        </iterate>
-                    </with>
-                </enablement>
-            </contextualLaunch>
-            <perspective id="org.eclipse.jdt.ui.JavaPerspective" />
-            <perspective id="org.eclipse.debug.ui.DebugPerspective" />
-            <configurationType id="com.android.ide.eclipse.adt.debug.LaunchConfigType">
-            </configurationType>
-            <description
-                description="Runs an Android Application"
-                mode="run">
-            </description>
-            <description
-                description="Debugs an Android Application"
-                mode="debug">
-            </description>
-        </shortcut>
-    </extension>
-    <extension point="org.eclipse.ui.popupMenus">
-        <objectContribution
-            id="com.android.ide.eclipse.adt.contribution2"
-            nameFilter="*"
-            objectClass="org.eclipse.core.resources.IProject"
-            adaptable="true">
-            <menu
-                id="com.android.ide.eclipse.adt.AndroidTools"
-                label="Android Tools"
-                path="additions">
-                <separator name="group1" />
-                <separator name="group2" />
-                <separator name="group3" />
-                <separator name="group4" />
-            </menu>
-            <filter
-                name="projectNature"
-                value="com.android.ide.eclipse.adt.AndroidNature">
-            </filter>
-            <action
-                class="com.android.ide.eclipse.adt.internal.wizards.actions.NewXmlFileAction"
-                enablesFor="1"
-                icon="icons/new_xml.png"
-                id="com.android.ide.eclipse.adt.wizards.actions.NewXmlFileAction"
-                label="New Resource File..."
-                menubarPath="com.android.ide.eclipse.adt.AndroidTools/group1"
-                tooltip="Opens a wizard to help create a new Android XML Resource file">
-            </action>
-            <action
-                class="com.android.ide.eclipse.adt.internal.wizards.actions.NewTestProjectAction"
-                enablesFor="1"
-                icon="icons/androidjunit.png"
-                id="com.android.ide.eclipse.adt.wizards.actions.NewTestProjectAction"
-                label="New Test Project..."
-                menubarPath="com.android.ide.eclipse.adt.AndroidTools/group1"
-                tooltip="Opens a wizard to help create a new Android Test Project">
-            </action>
-            <action
-                class="com.android.ide.eclipse.adt.internal.wizards.actions.ExportAction"
-                enablesFor="1"
-                id="com.android.ide.eclipse.adt.project.ExportAction"
-                label="Export Unsigned Application Package..."
-                menubarPath="com.android.ide.eclipse.adt.AndroidTools/group2" />
-            <action
-                class="com.android.ide.eclipse.adt.internal.wizards.actions.ExportWizardAction"
-                enablesFor="1"
-                id="com.android.ide.eclipse.adt.project.ExportWizardAction"
-                label="Export Signed Application Package..."
-                menubarPath="com.android.ide.eclipse.adt.AndroidTools/group2" />
-            <action
-                class="com.android.ide.eclipse.adt.internal.actions.FixProjectAction"
-                enablesFor="1"
-                id="com.android.ide.eclipse.adt.project.FixProjectAction"
-                label="Fix Project Properties"
-                menubarPath="com.android.ide.eclipse.adt.AndroidTools/group3" />
-            <action
-                class="com.android.ide.eclipse.adt.internal.actions.AddSupportJarAction"
-                enablesFor="1"
-                icon="icons/android.png"
-                id="com.android.ide.eclipse.adt.wizards.actions.AddCompatibilityJarAction"
-                label="Add Support Library..."
-                menubarPath="com.android.ide.eclipse.adt.AndroidTools/group3"
-                tooltip="Add the Compatibility Library to the project">
-            </action>
-            <action
-                class="com.android.ide.eclipse.adt.internal.refactorings.renamepackage.RenamePackageAction"
-                enablesFor="1"
-                id="com.android.ide.eclipse.adt.project.RenamePackageAction"
-                label="Rename Application Package"
-                menubarPath="com.android.ide.eclipse.adt.AndroidTools/group3" />
-            <action
-                class="com.android.ide.eclipse.adt.internal.actions.DexDumpAction"
-                enablesFor="1"
-                id="com.android.ide.eclipse.adt.DexDumpAction"
-                label="Display dex bytecode"
-                menubarPath="com.android.ide.eclipse.adt.AndroidTools/group3" />
-            <action
-                class="com.android.ide.eclipse.adt.internal.lint.ClearLintMarkersAction"
-                enablesFor="1"
-                id="com.android.ide.eclipse.adt.internal.lint.ClearLintMarkersAction"
-                label="Clear Lint Markers"
-                menubarPath="com.android.ide.eclipse.adt.AndroidTools/group4" />
-            <action
-                class="com.android.ide.eclipse.adt.internal.lint.RunLintAction"
-                enablesFor="1"
-                id="com.android.ide.eclipse.adt.internal.lint.RunLintAction"
-                label="Run Lint: Check for Common Errors"
-                icon="icons/lintrun.png"
-                menubarPath="com.android.ide.eclipse.adt.AndroidTools/group4" />
-        </objectContribution>
-    </extension>
-    <extension point="org.eclipse.ui.preferencePages">
-        <page
-            class="com.android.ide.eclipse.adt.internal.preferences.AndroidPreferencePage"
-            id="com.android.ide.eclipse.preferences.main"
-            name="Android" />
-        <page
-            category="com.android.ide.eclipse.preferences.main"
-            class="com.android.ide.eclipse.adt.internal.preferences.BuildPreferencePage"
-            id="com.android.ide.eclipse.adt.preferences.BuildPreferencePage"
-            name="Build" />
-        <page
-            category="com.android.ide.eclipse.preferences.main"
-            class="com.android.ide.eclipse.adt.internal.preferences.LaunchPreferencePage"
-            id="com.android.ide.eclipse.adt.preferences.LaunchPreferencePage"
-            name="Launch" />
-        <page
-            category="com.android.ide.eclipse.preferences.main"
-            class="com.android.ide.eclipse.adt.internal.preferences.EditorsPage"
-            id="com.android.ide.eclipse.adt.preferences.EditorsPage"
-            name="Editors">
-        </page>
-        <page
-            category="com.android.ide.eclipse.preferences.main"
-            class="com.android.ide.eclipse.adt.internal.preferences.LintPreferencePage"
-            id="com.android.ide.eclipse.common.preferences.LintPreferencePage"
-            name="Lint Error Checking">
-        </page>
-    </extension>
-    <extension point="org.eclipse.core.runtime.preferences">
-        <initializer class="com.android.ide.eclipse.adt.internal.preferences.AdtPrefs" />
-    </extension>
-    <extension point="org.eclipse.ui.perspectiveExtensions">
-        <perspectiveExtension targetID="org.eclipse.jdt.ui.JavaPerspective">
-            <newWizardShortcut id="com.android.ide.eclipse.adt.project.NewProjectWizard" />
-            <newWizardShortcut id="com.android.ide.eclipse.editors.wizards.NewXmlFileWizard" />
-            <actionSet id="adt.actionSet.wizards" />
-            <actionSet id="adt.actionSet.avdManager" />
-            <actionSet id="adt.actionSet.lint" />
-            <actionSet id="adt.actionSet.refactorings" />
-        </perspectiveExtension>
-        <perspectiveExtension targetID="org.eclipse.debug.ui.DebugPerspective">
-            <viewShortcut id="com.android.ide.eclipse.ddms.views.LogCatView" />
-            <viewShortcut id="com.android.ide.eclipse.ddms.views.DeviceView" />
-        </perspectiveExtension>
-    </extension>
-    <extension point="org.eclipse.ui.ide.projectNatureImages">
-        <image
-            icon="icons/android_project.png"
-            id="com.android.ide.eclipse.adt.AndroidNature.image"
-            natureId="com.android.ide.eclipse.adt.AndroidNature">
-        </image>
-    </extension>
-    <extension point="org.eclipse.jdt.core.classpathContainerInitializer">
-        <classpathContainerInitializer
-            class="com.android.ide.eclipse.adt.internal.project.AndroidClasspathContainerInitializer"
-            id="com.android.ide.eclipse.adt.ANDROID_FRAMEWORK">
-        </classpathContainerInitializer>
-        <classpathContainerInitializer
-            class="com.android.ide.eclipse.adt.internal.project.LibraryClasspathContainerInitializer"
-            id="com.android.ide.eclipse.adt.LIBRARIES">
-        </classpathContainerInitializer>
-        <classpathContainerInitializer
-            class="com.android.ide.eclipse.adt.internal.project.LibraryClasspathContainerInitializer"
-            id="com.android.ide.eclipse.adt.DEPENDENCIES">
-        </classpathContainerInitializer>
-    </extension>
-    <extension point="org.eclipse.jdt.ui.classpathContainerPage">
-        <classpathContainerPage
-            name="Android Classpath Container"
-            class="com.android.ide.eclipse.adt.internal.project.AndroidClasspathContainerPage"
-            id="com.android.ide.eclipse.adt.ANDROID_FRAMEWORK">
-        </classpathContainerPage>
-    </extension>
-    <extension point="org.eclipse.ui.exportWizards">
-        <category
-            id="com.android.ide.eclipse.wizards.category"
-            name="Android">
-        </category>
-        <wizard
-            category="com.android.ide.eclipse.wizards.category"
-            class="com.android.ide.eclipse.adt.internal.wizards.export.ExportWizard"
-            icon="icons/android.png"
-            id="com.android.ide.eclipse.adt.project.ExportWizard"
-            name="Export Android Application">
-        </wizard>
-    </extension>
-    <extension point="org.eclipse.ui.exportWizards">
-        <category
-            id="com.android.ide.eclipse.wizards.category"
-            name="Android">
-        </category>
-        <wizard
-            category="com.android.ide.eclipse.wizards.category"
-            class="com.android.ide.eclipse.adt.internal.wizards.exportgradle.GradleExportWizard"
-            icon="icons/gradle.png"
-            id="com.android.ide.eclipse.adt.project.ExportGradleWizard"
-            name="Generate Gradle build files">
-            <selection
-                class="org.eclipse.jdt.core.IJavaProject">
-            </selection>
-        </wizard>
-    </extension>
-    <extension point="org.eclipse.ui.commands">
-        <command
-            name="Debug Android Application"
-            description="Debug Android Application"
-            categoryId="org.eclipse.debug.ui.category.run"
-            id="com.android.ide.eclipse.adt.launch.LaunchShortcut.debug">
-        </command>
-        <command
-            name="Run Android Application"
-            description="Run Android Application"
-            categoryId="org.eclipse.debug.ui.category.run"
-            id="com.android.ide.eclipse.adt.launch.LaunchShortcut.run">
-        </command>
-    </extension>
-    <extension point="org.eclipse.ui.decorators">
-        <decorator
-            adaptable="true"
-            class="com.android.ide.eclipse.adt.internal.project.FolderDecorator"
-            id="com.android.ide.eclipse.adt.project.FolderDecorator"
-            label="Android Decorator"
-            lightweight="true"
-            location="TOP_RIGHT"
-            objectClass="org.eclipse.core.resources.IFolder"
-            state="true">
-        </decorator>
-    </extension>
-    <extension point="org.eclipse.ui.editors">
-        <editor
-            class="com.android.ide.eclipse.adt.internal.editors.export.ExportEditor"
-            default="true"
-            filenames="export.properties"
-            icon="icons/android_file.png"
-            id="com.android.ide.eclipse.editors.export.ExportEditor"
-            name="Android Export Editor">
-        </editor>
-
-        <editor
-            class="com.android.ide.eclipse.adt.internal.editors.manifest.ManifestEditor"
-            default="true"
-            filenames="AndroidManifest.xml"
-            icon="icons/android_file.png"
-            id="com.android.ide.eclipse.editors.manifest.ManifestEditor"
-            name="Android Manifest Editor">
-        </editor>
-
-        <!--
-        This is the new generic multi-purpose single XML editor used by ADT.
-        It is designed to replace all the other XML editors (layout, manifest, drawable,
-        animation, color, values, xml) and does so by using a single common Editor class
-        that defers to multiple delegate handlers.
-        -->
-        <editor
-              class="com.android.ide.eclipse.adt.internal.editors.common.CommonXmlEditor"
-              contributorClass="com.android.ide.eclipse.adt.internal.editors.common.CommonActionContributor"
-              default="true"
-              extensions="xml"
-              icon="icons/android_file.png"
-              id="com.android.ide.eclipse.editors.CommonXmlEditor"
-              matchingStrategy="com.android.ide.eclipse.adt.internal.editors.common.CommonMatchingStrategy"
-              name="Android Common XML Editor">
-        </editor>
-
-        <!--
-        For compatibilit with existing ADT installs, we still need to keep the editor
-        IDs of the previously defined editors. E.g. for the color editor note that the
-        id remains the same but class name changes to the new class. This will make
-        Eclipse not complain upon startup of an existing workspace.
-        -->
-        <editor
-            class="com.android.ide.eclipse.adt.internal.editors.common.CommonXmlEditor"
-            contributorClass="com.android.ide.eclipse.adt.internal.editors.common.CommonActionContributor"
-            default="false"
-            icon="icons/android_file.png"
-            id="com.android.ide.eclipse.editors.layout.LayoutEditor"
-            matchingStrategy="com.android.ide.eclipse.adt.internal.editors.common.CommonMatchingStrategy"
-            name="Legacy Android Layout Editor">
-        </editor>
-       <editor
-            class="com.android.ide.eclipse.adt.internal.editors.common.CommonXmlEditor"
-            default="false"
-            icon="icons/android_file.png"
-            id="com.android.ide.eclipse.editors.resources.ResourcesEditor"
-            name="Legacy Android Resource Editor">
-        </editor>
-        <editor
-            class="com.android.ide.eclipse.adt.internal.editors.common.CommonXmlEditor"
-            default="false"
-            icon="icons/android_file.png"
-            id="com.android.ide.eclipse.editors.menu.MenuEditor"
-            name="Legacy Android Menu Editor">
-        </editor>
-        <editor
-            class="com.android.ide.eclipse.adt.internal.editors.common.CommonXmlEditor"
-            default="false"
-            icon="icons/android_file.png"
-            id="com.android.ide.eclipse.editors.xml.XmlEditor"
-            name="Legacy Android Xml Resources Editor">
-        </editor>
-        <editor
-            class="com.android.ide.eclipse.adt.internal.editors.common.CommonXmlEditor"
-            default="false"
-            icon="icons/android_file.png"
-            id="com.android.ide.eclipse.editors.animator.AnimationEditor"
-            name="Legacy Android Animation Editor">
-        </editor>
-        <editor
-            class="com.android.ide.eclipse.adt.internal.editors.common.CommonXmlEditor"
-            default="false"
-            icon="icons/android_file.png"
-            id="com.android.ide.eclipse.editors.drawable.DrawableEditor"
-            name="Legacy Android Drawable Editor">
-        </editor>
-        <editor
-            class="com.android.ide.eclipse.adt.internal.editors.common.CommonXmlEditor"
-            default="false"
-            icon="icons/android_file.png"
-            id="com.android.ide.eclipse.editors.color.ColorEditor"
-            name="Legacy Android Color Editor">
-        </editor>
-
-        <editor
-            class="com.android.ide.eclipse.adt.internal.editors.binaryxml.BinaryXMLMultiPageEditorPart"
-            contributorClass="org.eclipse.wst.xml.ui.internal.tabletree.XMLMultiPageEditorActionBarContributor"
-            icon="$nl$/icons/android_file.png"
-            id="com.android.ide.eclipse.adt.binedit.BinaryXMLMultiPageEditorPart"
-            name="Android Binary XML editor"
-            symbolicFontName="org.eclipse.wst.sse.ui.textfont">
-            <contentTypeBinding contentTypeId="com.android.ide.eclipse.adt.binaryXml">
-            </contentTypeBinding>
-        </editor>
-        <editor
-            class="com.android.ide.eclipse.adt.internal.editors.draw9patch.Draw9PatchEditor"
-            contributorClass="com.android.ide.eclipse.adt.internal.editors.common.CommonActionContributor"
-            icon="icons/android_file.png"
-            id="draw9patchplugin.editors.Draw9PatchEditor"
-            name="Android Draw 9-patch Editor"
-            extensions="9.png">
-        </editor>
-    </extension>
-    <extension point="org.eclipse.ui.views">
-        <view
-            allowMultiple="false"
-            category="com.android.ide.eclipse.ddms.views.category"
-            class="com.android.ide.eclipse.adt.internal.ui.ResourceExplorerView"
-            icon="icons/draw9patch-16.png"
-            id="com.android.ide.eclipse.editors.resources.explorer.ResourceExplorerView"
-            name="Resource Explorer">
-        </view>
-        <view
-              class="com.android.ide.eclipse.adt.internal.lint.LintViewPart"
-              category="com.android.ide.eclipse.ddms.views.category"
-              id="com.android.ide.eclipse.adt.internal.lint.LintViewPart"
-              icon="icons/lintview.png"
-              name="Lint Warnings">
-        </view>
-    </extension>
-    <extension point="org.eclipse.wst.sse.ui.editorConfiguration">
-        <sourceViewerConfiguration
-            class="com.android.ide.eclipse.adt.internal.editors.manifest.ManifestSourceViewerConfig"
-            target="com.android.ide.eclipse.editors.manifest.ManifestEditor">
-        </sourceViewerConfiguration>
-        <sourceViewerConfiguration
-            class="com.android.ide.eclipse.adt.internal.editors.common.CommonSourceViewerConfig"
-            target="com.android.ide.eclipse.editors.CommonXmlEditor">
-        </sourceViewerConfiguration>
-        <quickOutlineConfiguration
-            class="com.android.ide.eclipse.adt.internal.editors.AndroidQuickOutlineConfiguration"
-            target="org.eclipse.core.runtime.xml" />
-        <contentOutlineConfiguration
-            class="com.android.ide.eclipse.adt.internal.editors.AndroidOutlineConfiguration"
-            target="org.eclipse.core.runtime.xml" />
-        <doubleClickStrategy
-            class="com.android.ide.eclipse.adt.internal.editors.AndroidDoubleClickStrategy"
-            target="org.eclipse.wst.xml.XML_DEFAULT" />
-        <provisionalConfiguration
-            type="org.eclipse.jface.text.quickassist.IQuickAssistProcessor"
-            class="com.android.ide.eclipse.adt.internal.editors.formatting.XmlQuickAssistManager"
-            target="org.eclipse.wst.xml.XML_DEFAULT" />
-        <provisionalConfiguration
-            type="characterpairmatcher"
-            class="com.android.ide.eclipse.adt.internal.editors.AndroidXmlCharacterMatcher"
-            target="org.eclipse.core.runtime.xml" />
-    </extension>
-    <extension point="org.eclipse.jdt.ui.quickAssistProcessors">
-        <quickAssistProcessor
-            id="AndroidJavaAssistant"
-            name="Android Java Quick Assistant"
-            requiredSourceLevel="1.5"
-            class="com.android.ide.eclipse.adt.internal.editors.layout.refactoring.JavaQuickAssistant">
-        </quickAssistProcessor>
-    </extension>
-    <extension
-        point="org.eclipse.jdt.ui.quickFixProcessors">
-        <quickFixProcessor
-            name="Android Convert Switch Quickfix Processor"
-            class="com.android.ide.eclipse.adt.internal.build.ConvertSwitchQuickFixProcessor"
-            id="com.android.ide.eclipse.adt.internal.build.ConvertSwitchQuickFixProcessor">
-            <handledMarkerTypes>
-                <markerType id="org.eclipse.jdt.core.problem"/>
-            </handledMarkerTypes>
-        </quickFixProcessor>
-    </extension>
-    <extension point="org.eclipse.ui.propertyPages">
-        <page
-            adaptable="true"
-            class="com.android.ide.eclipse.adt.internal.properties.AndroidPropertyPage"
-            id="com.android.ide.eclipse.adt.project.properties.AndroidPropertyPage"
-            name="Android"
-            nameFilter="*"
-            objectClass="org.eclipse.core.resources.IProject">
-            <enabledWhen>
-                <test
-                    property="org.eclipse.jdt.launching.hasProjectNature"
-                    args="com.android.ide.eclipse.adt.AndroidNature" />
-            </enabledWhen>
-        </page>
-        <page
-            class="com.android.ide.eclipse.adt.internal.preferences.LintPreferencePage"
-            id="com.android.ide.eclipse.adt.internal.preferences.LintPreferencePage"
-            name="Android Lint Preferences">
-            <filter
-                name="nature"
-                value="com.android.ide.eclipse.adt.AndroidNature">
-            </filter>
-            <enabledWhen>
-                <adapt type="org.eclipse.core.resources.IProject" />
-            </enabledWhen>
-        </page>
-    </extension>
-    <extension point="org.eclipse.ui.actionSets">
-        <actionSet
-            description="Android Wizards"
-            id="adt.actionSet.wizards"
-            label="Android Wizards"
-            visible="false">
-            <action
-                class="com.android.ide.eclipse.adt.internal.wizards.actions.NewXmlFileAction"
-                icon="icons/new_xml.png"
-                id="com.android.ide.eclipse.adt.wizards.actions.NewXmlFileAction"
-                label="New Android XML File"
-                style="push"
-                toolbarPath="android_project">
-            </action>
-        </actionSet>
-        <actionSet
-            description="Refactorings for Android"
-            id="adt.actionSet.refactorings"
-            label="Android Refactorings"
-            visible="false">
-
-         <!-- This duplicates the Refactoring Menu definition from the jdt.ui plugin.xml,
-              which allows us to insert our contribution even if the JDT is not loaded.
-              We overload the definition with our new group.-->
-            <menu
-                label="Refactor"
-                path="edit"
-                id="org.eclipse.jdt.ui.refactoring.menu">
-                <separator name="undoRedoGroup" />
-                <separator name="reorgGroup" />
-                <separator name="androidGroup" />
-                <separator name="codingGroup" />
-                <separator name="reorgGroup2" />
-                <separator name="typeGroup" />
-                <separator name="typeGroup2" />
-                <separator name="codingGroup2" />
-                <separator name="typeGroup3" />
-                <separator name="scriptGroup" />
-            </menu>
-            <menu
-                label="Android"
-                path="org.eclipse.jdt.ui.refactoring.menu/androidGroup"
-                id="com.android.ide.eclipse.adt.refactoring.menu">
-                <separator name="android" />
-            </menu>
-            <action
-                class="com.android.ide.eclipse.adt.internal.refactorings.extractstring.ExtractStringAction"
-                definitionId="com.android.ide.eclipse.adt.refactoring.extract.string"
-                id="com.android.ide.eclipse.adt.actions.ExtractString"
-                label="Extract Android String..."
-                menubarPath="org.eclipse.jdt.ui.refactoring.menu/com.android.ide.eclipse.adt.refactoring.menu/android"
-                style="push"
-                tooltip="Extracts a string into Android resource string">
-            </action>
-            <action
-                class="com.android.ide.eclipse.adt.internal.editors.layout.refactoring.ExtractIncludeAction"
-                definitionId="com.android.ide.eclipse.adt.refactoring.extract.include"
-                id="com.android.ide.eclipse.adt.actions.ExtractInclude"
-                label="Extract as Include..."
-                menubarPath="org.eclipse.jdt.ui.refactoring.menu/com.android.ide.eclipse.adt.refactoring.menu/android"
-                style="push"
-                tooltip="Extracts Views as Included Layout">
-            </action>
-            <action
-                class="com.android.ide.eclipse.adt.internal.editors.layout.refactoring.ExtractStyleAction"
-                definitionId="com.android.ide.eclipse.adt.refactoring.extract.style"
-                id="com.android.ide.eclipse.adt.actions.ExtractStyle"
-                label="Extract Style..."
-                menubarPath="org.eclipse.jdt.ui.refactoring.menu/com.android.ide.eclipse.adt.refactoring.menu/android"
-                style="push"
-                tooltip="Extracts Styles">
-            </action>
-            <action
-                class="com.android.ide.eclipse.adt.internal.editors.layout.refactoring.WrapInAction"
-                definitionId="com.android.ide.eclipse.adt.refactoring.wrapin"
-                id="com.android.ide.eclipse.adt.actions.WrapIn"
-                label="Wrap In Container..."
-                menubarPath="org.eclipse.jdt.ui.refactoring.menu/com.android.ide.eclipse.adt.refactoring.menu/android"
-                style="push"
-                tooltip="Wraps Views in a new container">
-            </action>
-            <action
-                class="com.android.ide.eclipse.adt.internal.editors.layout.refactoring.UnwrapAction"
-                definitionId="com.android.ide.eclipse.adt.refactoring.unwrap"
-                id="com.android.ide.eclipse.adt.actions.Unwrap"
-                label="Remove Container..."
-                menubarPath="org.eclipse.jdt.ui.refactoring.menu/com.android.ide.eclipse.adt.refactoring.menu/android"
-                style="push"
-                tooltip="Unwraps Views by Removing their container">
-            </action>
-            <action
-                class="com.android.ide.eclipse.adt.internal.editors.layout.refactoring.ChangeLayoutAction"
-                definitionId="com.android.ide.eclipse.adt.refactoring.convert"
-                id="com.android.ide.eclipse.adt.actions.ChangeLayout"
-                label="Change Layout..."
-                menubarPath="org.eclipse.jdt.ui.refactoring.menu/com.android.ide.eclipse.adt.refactoring.menu/android"
-                style="push"
-                tooltip="Changes layouts from one type to another">
-            </action>
-            <action
-                class="com.android.ide.eclipse.adt.internal.editors.layout.refactoring.ChangeViewAction"
-                definitionId="com.android.ide.eclipse.adt.refactoring.changeview"
-                id="com.android.ide.eclipse.adt.actions.ChangeView"
-                label="Change Widget Type..."
-                menubarPath="org.eclipse.jdt.ui.refactoring.menu/com.android.ide.eclipse.adt.refactoring.menu/android"
-                style="push"
-                tooltip="Changes the type of the selected widgets">
-            </action>
-            <menu
-                id="org.eclipse.jdt.ui.refactoring.menu"
-                label="Refactor">
-            </menu>
-        </actionSet>
-        <actionSet
-            description="Android AVD and SDK Manager"
-            id="adt.actionSet.avdManager"
-            label="Android SDK and AVD Manager"
-            visible="false">
-            <action
-                class="com.android.ide.eclipse.adt.internal.actions.AvdManagerAction"
-                icon="icons/avd_manager.png"
-                id="com.android.ide.eclipse.adt.ui.avdmanager"
-                label="Android Virtual Device Manager"
-                menubarPath="Window/additions"
-                style="push"
-                toolbarPath="android_project">
-            </action>
-            <action
-                class="com.android.ide.eclipse.adt.internal.actions.SdkManagerAction"
-                icon="icons/sdk_manager.png"
-                id="com.android.ide.eclipse.adt.ui.sdkmanager"
-                label="Android SDK Manager"
-                menubarPath="Window/additions"
-                style="push"
-                toolbarPath="android_project">
-            </action>
-        </actionSet>
-        <actionSet
-            description="Android Lint"
-            id="adt.actionSet.lint"
-            label="Android Lint"
-            visible="false">
-            <action
-                class="com.android.ide.eclipse.adt.internal.lint.RunLintAction"
-                style="pulldown"
-                icon="icons/lintrun.png"
-                id="com.android.ide.eclipse.adt.ui.lintrunner"
-                label="Run Android Lint"
-                menubarPath="Window/additions"
-                toolbarPath="android_project">
-            </action>
-        </actionSet>
-    </extension>
-    <extension point="org.eclipse.debug.core.launchDelegates">
-        <launchDelegate
-            delegate="com.android.ide.eclipse.adt.internal.launch.JUnitLaunchConfigDelegate"
-            delegateDescription="Removes the Android JAR from the Bootstrap Classpath"
-            id="com.android.ide.eclipse.adt.launch.JUnitLaunchConfigDelegate.launchAndroidJunit"
-            modes="run,debug"
-            name="Android JUnit Test"
-            type="org.eclipse.jdt.junit.launchconfig">
-        </launchDelegate>
-    </extension>
-    <extension point="org.eclipse.debug.core.launchConfigurationTypes">
-        <launchConfigurationType
-            delegate="com.android.ide.eclipse.adt.internal.launch.junit.AndroidJUnitLaunchConfigDelegate"
-            id="com.android.ide.eclipse.adt.junit.launchConfigurationType"
-            modes="run,debug"
-            name="Android JUnit Test"
-            public="true"
-            sourceLocatorId="com.android.ide.eclipse.adt.internal.sourcelookup.AdtSourceLookupDirector"
-            sourcePathComputerId="org.eclipse.jdt.launching.sourceLookup.javaSourcePathComputer">
-        </launchConfigurationType>
-    </extension>
-    <extension point="org.eclipse.debug.core.sourceLocators">
-        <sourceLocator
-            id="com.android.ide.eclipse.adt.internal.sourcelookup.AdtSourceLookupDirector"
-            class="com.android.ide.eclipse.adt.internal.sourcelookup.AdtSourceLookupDirector"
-            name="%sourceLocator.name">
-        </sourceLocator>
-    </extension>
-    <extension point="org.eclipse.debug.ui.launchConfigurationTypeImages">
-        <launchConfigurationTypeImage
-            configTypeID="com.android.ide.eclipse.adt.junit.launchConfigurationType"
-            icon="icons/androidjunit.png"
-            id="com.android.ide.eclipse.adt.junit.launchConfigurationTypeImage">
-        </launchConfigurationTypeImage>
-    </extension>
-    <extension point="org.eclipse.debug.ui.launchConfigurationTabGroups">
-        <launchConfigurationTabGroup
-            class="com.android.ide.eclipse.adt.internal.launch.junit.AndroidJUnitTabGroup"
-            description="Android JUnit Test"
-            id="com.android.ide.eclipse.adt.junit.AndroidJUnitLaunchConfigTabGroup"
-            type="com.android.ide.eclipse.adt.junit.launchConfigurationType" />
-    </extension>
-    <extension point="org.eclipse.debug.ui.launchShortcuts">
-        <shortcut
-            class="com.android.ide.eclipse.adt.internal.launch.junit.AndroidJUnitLaunchShortcut"
-            icon="icons/androidjunit.png"
-            id="com.android.ide.eclipse.adt.junit.launchShortcut"
-            label="Android JUnit Test"
-            modes="run,debug">
-            <contextualLaunch>
-                <enablement>
-                    <with variable="selection">
-                        <count value="1" />
-                        <iterate>
-                            <adapt type="org.eclipse.jdt.core.IJavaElement">
-                                <test
-                                    property="org.eclipse.jdt.core.isInJavaProjectWithNature"
-                                    value="com.android.ide.eclipse.adt.AndroidNature" />
-                                <test
-                                    property="org.eclipse.jdt.core.hasTypeOnClasspath"
-                                    value="junit.framework.Test" />
-                                <test property="com.android.ide.eclipse.adt.canLaunchAsJUnit" />
-                            </adapt>
-                        </iterate>
-                    </with>
-                </enablement>
-            </contextualLaunch>
-            <configurationType id="com.android.ide.eclipse.adt.junit.launchConfigurationType">
-            </configurationType>
-        </shortcut>
-    </extension>
-    <extension point="org.eclipse.ui.commands">
-        <category
-            description="Refactorings for Android Projects"
-            id="com.android.ide.eclipse.adt.refactoring.category"
-            name="Android Refactorings">
-        </category>
-        <command
-            categoryId="com.android.ide.eclipse.adt.refactoring.category"
-            description="Extract Strings into Android String Resources"
-            id="com.android.ide.eclipse.adt.refactoring.extract.string"
-            name="Extract Android String">
-        </command>
-        <command
-            categoryId="com.android.ide.eclipse.adt.refactoring.category"
-            description="Extract Views as Included Layout"
-            id="com.android.ide.eclipse.adt.refactoring.extract.include"
-            name="Extract as Include">
-        </command>
-        <command
-            categoryId="com.android.ide.eclipse.adt.refactoring.category"
-            description="Extract Styles"
-            id="com.android.ide.eclipse.adt.refactoring.extract.style"
-            name="Extract Styles">
-        </command>
-        <command
-            categoryId="com.android.ide.eclipse.adt.refactoring.category"
-            description="Wraps Views in a New Container"
-            id="com.android.ide.eclipse.adt.refactoring.wrapin"
-            name="Wrap in Container">
-        </command>
-        <command
-            categoryId="com.android.ide.eclipse.adt.refactoring.category"
-            description="Unwraps Views From Their Container"
-            id="com.android.ide.eclipse.adt.refactoring.unwrap"
-            name="Remove Container">
-        </command>
-        <command
-            categoryId="com.android.ide.eclipse.adt.refactoring.category"
-            description="Converts Layouts from One Type to Another"
-            id="com.android.ide.eclipse.adt.refactoring.convert"
-            name="Change Layout">
-        </command>
-        <command
-            categoryId="com.android.ide.eclipse.adt.refactoring.category"
-            description="Changes the widget type for the selection"
-            id="com.android.ide.eclipse.adt.refactoring.changeview"
-            name="Change Widget Type">
-        </command>
-    </extension>
-    <extension point="org.eclipse.ltk.core.refactoring.refactoringContributions">
-        <contribution
-            class="com.android.ide.eclipse.adt.internal.refactorings.extractstring.ExtractStringContribution"
-            id="com.android.ide.eclipse.adt.refactoring.extract.string">
-        </contribution>
-        <contribution
-            class="com.android.ide.eclipse.adt.internal.editors.layout.refactoring.ExtractIncludeContribution"
-            id="com.android.ide.eclipse.adt.refactoring.extract.include">
-        </contribution>
-        <contribution
-            class="com.android.ide.eclipse.adt.internal.editors.layout.refactoring.ExtractStyleContribution"
-            id="com.android.ide.eclipse.adt.refactoring.extract.style">
-        </contribution>
-        <contribution
-            class="com.android.ide.eclipse.adt.internal.editors.layout.refactoring.WrapInContribution"
-            id="com.android.ide.eclipse.adt.refactoring.wrapin">
-        </contribution>
-        <contribution
-            class="com.android.ide.eclipse.adt.internal.editors.layout.refactoring.UnwrapContribution"
-            id="com.android.ide.eclipse.adt.refactoring.unwrap">
-        </contribution>
-        <contribution
-            class="com.android.ide.eclipse.adt.internal.editors.layout.refactoring.ChangeLayoutContribution"
-            id="com.android.ide.eclipse.adt.refactoring.convert">
-        </contribution>
-        <contribution
-            class="com.android.ide.eclipse.adt.internal.editors.layout.refactoring.ChangeViewContribution"
-            id="com.android.ide.eclipse.adt.refactoring.changeview">
-        </contribution>
-    </extension>
-    <extension point="org.eclipse.core.expressions.propertyTesters">
-        <propertyTester
-            properties="isTest,canLaunchAsJUnit"
-            namespace="com.android.ide.eclipse.adt"
-            type="org.eclipse.core.runtime.IAdaptable"
-            class="com.android.ide.eclipse.adt.internal.launch.junit.AndroidJUnitPropertyTester"
-            id="com.android.ide.eclipse.adt.AndroidJUnitPropertyTester">
-        </propertyTester>
-    </extension>
-    <extension point="com.android.ide.eclipse.ddms.toolsLocator">
-        <locator class="com.android.ide.eclipse.adt.ToolsLocator">
-        </locator>
-    </extension>
-    <extension point="com.android.ide.eclipse.ddms.debuggerConnector">
-        <connector class="com.android.ide.eclipse.adt.DebuggerConnector">
-        </connector>
-    </extension>
-    <extension point="com.android.ide.eclipse.ddms.sourceRevealer">
-        <revealer class="com.android.ide.eclipse.adt.SourceRevealer">
-        </revealer>
-    </extension>
-    <extension point="org.eclipse.ltk.core.refactoring.renameParticipants">
-        <renameParticipant
-            class="com.android.ide.eclipse.adt.internal.refactorings.core.AndroidTypeRenameParticipant"
-            id="com.android.ide.eclipse.adt.internal.refactoring.core.AndroidTypeRenameParticipant"
-            name="Android Rename Type Participant">
-            <enablement>
-                <with variable="element">
-                    <instanceof value="org.eclipse.jdt.core.IType">
-                    </instanceof>
-                </with>
-                <with variable="affectedNatures">
-                    <iterate operator="or">
-                        <equals value="com.android.ide.eclipse.adt.AndroidNature" />
-                    </iterate>
-                </with>
-            </enablement>
-        </renameParticipant>
-        <renameParticipant
-            class="com.android.ide.eclipse.adt.internal.refactorings.core.RenameResourceParticipant"
-            id="com.android.ide.eclipse.adt.internal.refactorings.core.RenameResourceParticipant"
-            name="Android Rename Resource Participant">
-            <enablement>
-                <with variable="element">
-                    <or>
-                        <instanceof value="org.eclipse.jdt.core.IField"/>
-                        <instanceof value="org.eclipse.core.resources.IResource" />
-                        <instanceof value="java.lang.String" />
-                    </or>
-                </with>
-                <with variable="affectedNatures">
-                    <iterate operator="or">
-                        <equals value="com.android.ide.eclipse.adt.AndroidNature" />
-                    </iterate>
-                </with>
-            </enablement>
-        </renameParticipant>
-        <renameParticipant
-            class="com.android.ide.eclipse.adt.internal.refactorings.core.AndroidPackageRenameParticipant"
-            id="com.android.ide.eclipse.adt.internal.refactoring.core.AndroidPackageRenameParticipant"
-            name="Android Rename Package Participant">
-            <enablement>
-                <with variable="element">
-                    <instanceof value="org.eclipse.jdt.core.IPackageFragment">
-                    </instanceof>
-                </with>
-                <with variable="affectedNatures">
-                    <iterate operator="or">
-                        <equals value="com.android.ide.eclipse.adt.AndroidNature" />
-                    </iterate>
-                </with>
-            </enablement>
-        </renameParticipant>
-    </extension>
-    <extension point="org.eclipse.ltk.core.refactoring.moveParticipants">
-        <moveParticipant
-            class="com.android.ide.eclipse.adt.internal.refactorings.core.AndroidTypeMoveParticipant"
-            id="com.android.ide.eclipse.adt.internal.refactoring.core.androidTypeMoveParticipant"
-            name="Android Move Type Participant">
-            <enablement>
-                <with variable="element">
-                    <instanceof value="org.eclipse.jdt.core.IType">
-                    </instanceof>
-                </with>
-                <with variable="affectedNatures">
-                    <iterate operator="or">
-                        <equals value="com.android.ide.eclipse.adt.AndroidNature" />
-                    </iterate>
-                </with>
-            </enablement>
-        </moveParticipant>
-    </extension>
-    <extension point="org.eclipse.ui.workbench.texteditor.hyperlinkDetectorTargets">
-        <target
-            id="com.android.ide.eclipse.xmlCode"
-            name="XML Editor">
-            <context type="org.eclipse.ui.texteditor.ITextEditor" />
-        </target>
-    </extension>
-    <extension point="org.eclipse.ui.workbench.texteditor.hyperlinkDetectors">
-        <hyperlinkDetector
-            class="com.android.ide.eclipse.adt.internal.editors.Hyperlinks$XmlResolver"
-            id="com.android.ide.eclipse.xmlCodeResolver"
-            name="Android XML Hyperlink Detector"
-            targetId="com.android.ide.eclipse.xmlCode">
-        </hyperlinkDetector>
-        <hyperlinkDetector
-            class="com.android.ide.eclipse.adt.internal.editors.Hyperlinks$JavaResolver"
-            id="com.android.ide.eclipse.javaCodeResolver"
-            name="Android Java Hyperlink Detector"
-            targetId="org.eclipse.jdt.ui.javaCode">
-        </hyperlinkDetector>
-      <!--
-      Register this hyperlink provider TWICE, once without any modifier keys, and
-      once with Modifier1+Modifier2. The one without (which will pick up the default
-      of M1) will typically duel with the builtin Java hyperlink resolver, so the
-      user gets a popup and must choose our resolver with the arrow key or mouse
-      action. The second registration adds a quick bypass for that.
-      -->
-        <hyperlinkDetector
-            class="com.android.ide.eclipse.adt.internal.editors.Hyperlinks$JavaResolver"
-            id="com.android.ide.eclipse.javaCodeResolver2"
-            modifierKeys="M1+M2+M3"
-            name="Android Java Hyperlink Detector (Extra Modifier Key)"
-            targetId="org.eclipse.jdt.ui.javaCode">
-        </hyperlinkDetector>
-    </extension>
-    <extension point="org.eclipse.ui.bindings">
-        <key
-            sequence="M3+M2+A S"
-            contextId="org.eclipse.ui.contexts.window"
-            commandId="com.android.ide.eclipse.adt.refactoring.extract.string"
-            schemeId="org.eclipse.ui.defaultAcceleratorConfiguration" />
-        <key
-            sequence="M3+M2+A D"
-            contextId="org.eclipse.ui.contexts.window"
-            commandId="com.android.ide.eclipse.adt.launch.LaunchShortcut.debug"
-            schemeId="org.eclipse.ui.defaultAcceleratorConfiguration" />
-        <key
-            sequence="M3+M2+A R"
-            contextId="org.eclipse.ui.contexts.window"
-            commandId="com.android.ide.eclipse.adt.launch.LaunchShortcut.run"
-            schemeId="org.eclipse.ui.defaultAcceleratorConfiguration" />
-     <!-- Rebind the select-enclosing actions from WTP's M2+M3 to M2+M4 to be
-          consistent with Java files. The contextId is org.eclipse.core.runtime.xml
-          instead of org.eclipse.wst.sse.ui.structuredTextEditorScope to avoid
-          keyboard conflict warnings (and an action selection dialog.)
-     -->
-        <key
-            platform="carbon"
-            sequence="CTRL+SHIFT+ARROW_UP"
-            contextId="org.eclipse.core.runtime.xml"
-            commandId="org.eclipse.wst.sse.ui.structure.select.enclosing"
-            schemeId="org.eclipse.ui.defaultAcceleratorConfiguration" />
-        <key
-            platform="carbon"
-            sequence="CTRL+SHIFT+ARROW_DOWN"
-            contextId="org.eclipse.core.runtime.xml"
-            commandId="org.eclipse.wst.sse.ui.structure.select.last"
-            schemeId="org.eclipse.ui.defaultAcceleratorConfiguration" />
-    </extension>
-    <extension point="org.eclipse.core.contenttype.contentTypes">
-        <content-type
-            describer="com.android.ide.eclipse.adt.internal.editors.binaryxml.BinaryXMLDescriber"
-            file-extensions="xml"
-            id="com.android.ide.eclipse.adt.binaryXml"
-            name="Android Binary XML"
-            priority="high">
-        </content-type>
-    </extension>
-    <extension point="org.eclipse.ui.startup">
-        <startup class="com.android.ide.eclipse.adt.internal.welcome.AdtStartup"/>
-    </extension>
-
-    <!-- workaround for bug 15003. -->
-    <extension
-        point="org.eclipse.core.filebuffers.documentCreation"
-        id="binaryXmlfactories"
-        name="Binary XML Document Factory Extension">
-        <factory
-            contentTypeId="com.android.ide.eclipse.adt.binaryXml"
-            class="org.eclipse.wst.sse.core.internal.filebuffers.BasicStructuredDocumentFactory" />
-    </extension>
-</plugin>
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/pom.xml b/eclipse/plugins/com.android.ide.eclipse.adt/pom.xml
deleted file mode 100644
index a0257be..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/pom.xml
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-    <modelVersion>4.0.0</modelVersion>
-
-    <version>24.3.3-SNAPSHOT</version>
-    <artifactId>com.android.ide.eclipse.adt</artifactId>
-    <packaging>eclipse-plugin</packaging>
-    <name>adt</name>
-
-    <parent>
-        <relativePath>../../pom.xml</relativePath>
-        <groupId>adt.group</groupId>
-        <artifactId>parent</artifactId>
-        <version>1.0.0-SNAPSHOT</version>
-    </parent>
-</project>
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/AbsListViewRule.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/AbsListViewRule.java
deleted file mode 100644
index cd1b0fc..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/AbsListViewRule.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Copyright (C) 2010 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.layout;
-
-import com.android.ide.common.api.IViewRule;
-
-/**
- * An {@link IViewRule} for android.widget.AbsListViewRule
- */
-public class AbsListViewRule extends IgnoredLayoutRule {
-
-    // GridViews and ListViews are not configurable via XML
-
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/AbsoluteLayoutRule.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/AbsoluteLayoutRule.java
deleted file mode 100644
index 3ec3b5f..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/AbsoluteLayoutRule.java
+++ /dev/null
@@ -1,254 +0,0 @@
-/*
- * Copyright (C) 2010 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.layout;
-
-import static com.android.SdkConstants.ANDROID_URI;
-import static com.android.SdkConstants.ATTR_LAYOUT_X;
-import static com.android.SdkConstants.ATTR_LAYOUT_Y;
-import static com.android.SdkConstants.VALUE_N_DP;
-
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-import com.android.ide.common.api.DrawingStyle;
-import com.android.ide.common.api.DropFeedback;
-import com.android.ide.common.api.IDragElement;
-import com.android.ide.common.api.IFeedbackPainter;
-import com.android.ide.common.api.IGraphics;
-import com.android.ide.common.api.INode;
-import com.android.ide.common.api.INodeHandler;
-import com.android.ide.common.api.IViewRule;
-import com.android.ide.common.api.Point;
-import com.android.ide.common.api.Rect;
-import com.android.ide.common.api.SegmentType;
-import com.android.utils.Pair;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-
-/**
- * An {@link IViewRule} for android.widget.AbsoluteLayout and all its derived
- * classes.
- */
-public class AbsoluteLayoutRule extends BaseLayoutRule {
-
-    @Override
-    public List<String> getSelectionHint(@NonNull INode parentNode, @NonNull INode childNode) {
-        List<String> infos = new ArrayList<String>(2);
-        infos.add("AbsoluteLayout is deprecated.");
-        infos.add("Use other layouts instead.");
-        return infos;
-    }
-
-    // ==== Drag'n'drop support ====
-    // The AbsoluteLayout accepts any drag'n'drop anywhere on its surface.
-
-    @Override
-    public DropFeedback onDropEnter(@NonNull INode targetNode, @Nullable Object targetView,
-            final @Nullable IDragElement[] elements) {
-
-        if (elements.length == 0) {
-            return null;
-        }
-
-        DropFeedback df = new DropFeedback(null, new IFeedbackPainter() {
-            @Override
-            public void paint(@NonNull IGraphics gc, @NonNull INode node,
-                    @NonNull DropFeedback feedback) {
-                // Paint callback for the AbsoluteLayout.
-                // This is called by the canvas when a draw is needed.
-                drawFeedback(gc, node, elements, feedback);
-            }
-        });
-        df.errorMessage = "AbsoluteLayout is deprecated.";
-        return df;
-    }
-
-    void drawFeedback(
-            IGraphics gc,
-            INode targetNode,
-            IDragElement[] elements,
-            DropFeedback feedback) {
-        Rect b = targetNode.getBounds();
-        if (!b.isValid()) {
-            return;
-        }
-
-        // Highlight the receiver
-        gc.useStyle(DrawingStyle.DROP_RECIPIENT);
-        gc.drawRect(b);
-
-        // Get the drop point
-        Point p = (Point) feedback.userData;
-
-        if (p == null) {
-            return;
-        }
-
-        int x = p.x;
-        int y = p.y;
-
-        Rect be = elements[0].getBounds();
-
-        if (be.isValid()) {
-            // At least the first element has a bound. Draw rectangles
-            // for all dropped elements with valid bounds, offset at
-            // the drop point.
-            int offsetX = x - be.x + (feedback.dragBounds != null ? feedback.dragBounds.x : 0);
-            int offsetY = y - be.y + (feedback.dragBounds != null ? feedback.dragBounds.y : 0);
-            gc.useStyle(DrawingStyle.DROP_PREVIEW);
-            for (IDragElement element : elements) {
-                drawElement(gc, element, offsetX, offsetY);
-            }
-        } else {
-            // We don't have bounds for new elements. In this case
-            // just draw cross hairs to the drop point.
-            gc.useStyle(DrawingStyle.GUIDELINE);
-            gc.drawLine(x, b.y, x, b.y + b.h);
-            gc.drawLine(b.x, y, b.x + b.w, y);
-
-            // Use preview lines to indicate the bottom quadrant as well (to
-            // indicate that you are looking at the top left position of the
-            // drop, not the center for example)
-            gc.useStyle(DrawingStyle.DROP_PREVIEW);
-            gc.drawLine(x, y, b.x + b.w, y);
-            gc.drawLine(x, y, x, b.y + b.h);
-        }
-    }
-
-    @Override
-    public DropFeedback onDropMove(@NonNull INode targetNode, @NonNull IDragElement[] elements,
-            @Nullable DropFeedback feedback, @NonNull Point p) {
-        // Update the data used by the DropFeedback.paintCallback above.
-        feedback.userData = p;
-        feedback.requestPaint = true;
-
-        return feedback;
-    }
-
-    @Override
-    public void onDropLeave(@NonNull INode targetNode, @NonNull IDragElement[] elements,
-            @Nullable DropFeedback feedback) {
-        // Nothing to do.
-    }
-
-    @Override
-    public void onDropped(final @NonNull INode targetNode, final @NonNull IDragElement[] elements,
-            final @Nullable DropFeedback feedback, final @NonNull Point p) {
-
-        final Rect b = targetNode.getBounds();
-        if (!b.isValid()) {
-            return;
-        }
-
-        // Collect IDs from dropped elements and remap them to new IDs
-        // if this is a copy or from a different canvas.
-        final Map<String, Pair<String, String>> idMap = getDropIdMap(targetNode, elements,
-                feedback.isCopy || !feedback.sameCanvas);
-
-        targetNode.editXml("Add elements to AbsoluteLayout", new INodeHandler() {
-            @Override
-            public void handle(@NonNull INode node) {
-                boolean first = true;
-                Point offset = null;
-
-                // Now write the new elements.
-                for (IDragElement element : elements) {
-                    String fqcn = element.getFqcn();
-                    Rect be = element.getBounds();
-
-                    INode newChild = targetNode.appendChild(fqcn);
-
-                    // Copy all the attributes, modifying them as needed.
-                    addAttributes(newChild, element, idMap, DEFAULT_ATTR_FILTER);
-
-                    int deltaX = (feedback.dragBounds != null ? feedback.dragBounds.x : 0);
-                    int deltaY = (feedback.dragBounds != null ? feedback.dragBounds.y : 0);
-
-                    int x = p.x - b.x + deltaX;
-                    int y = p.y - b.y + deltaY;
-
-                    if (first) {
-                        first = false;
-                        if (be.isValid()) {
-                            offset = new Point(x - be.x, y - be.y);
-                        }
-                    } else if (offset != null && be.isValid()) {
-                        x = offset.x + be.x;
-                        y = offset.y + be.y;
-                    } else {
-                        x += 10;
-                        y += be.isValid() ? be.h : 10;
-                    }
-
-                    double scale = feedback.dipScale;
-                    if (scale != 1.0) {
-                        x *= scale;
-                        y *= scale;
-                    }
-
-                    newChild.setAttribute(ANDROID_URI, ATTR_LAYOUT_X,
-                            String.format(VALUE_N_DP, x));
-                    newChild.setAttribute(ANDROID_URI, ATTR_LAYOUT_Y,
-                            String.format(VALUE_N_DP, y));
-
-                    addInnerElements(newChild, element, idMap);
-                }
-            }
-        });
-    }
-
-    /**
-     * {@inheritDoc}
-     * <p>
-     * Overridden in this layout in order to let the top left coordinate be affected by
-     * the resize operation too. In other words, dragging the top left corner to resize a
-     * widget will not only change the size of the widget, it will also move it (though in
-     * this case, the bottom right corner will stay fixed).
-     */
-    @Override
-    protected void setNewSizeBounds(ResizeState resizeState, INode node, INode layout,
-            Rect previousBounds, Rect newBounds, SegmentType horizontalEdge,
-            SegmentType verticalEdge) {
-        super.setNewSizeBounds(resizeState, node, layout, previousBounds, newBounds,
-                horizontalEdge, verticalEdge);
-        if (verticalEdge != null && newBounds.x != previousBounds.x) {
-            node.setAttribute(ANDROID_URI, ATTR_LAYOUT_X,
-                    String.format(VALUE_N_DP,
-                            mRulesEngine.pxToDp(newBounds.x - node.getParent().getBounds().x)));
-        }
-        if (horizontalEdge != null && newBounds.y != previousBounds.y) {
-            node.setAttribute(ANDROID_URI, ATTR_LAYOUT_Y,
-                    String.format(VALUE_N_DP,
-                            mRulesEngine.pxToDp(newBounds.y - node.getParent().getBounds().y)));
-        }
-    }
-
-    @Override
-    protected String getResizeUpdateMessage(ResizeState resizeState, INode child, INode parent,
-            Rect newBounds, SegmentType horizontalEdge, SegmentType verticalEdge) {
-        Rect parentBounds = parent.getBounds();
-        if (horizontalEdge == SegmentType.BOTTOM && verticalEdge == SegmentType.RIGHT) {
-            return super.getResizeUpdateMessage(resizeState, child, parent, newBounds,
-                    horizontalEdge, verticalEdge);
-        }
-        return String.format("x=%d, y=%d\nwidth=%s, height=%s",
-                mRulesEngine.pxToDp(newBounds.x - parentBounds.x),
-                mRulesEngine.pxToDp(newBounds.y - parentBounds.y),
-                resizeState.getWidthAttribute(), resizeState.getHeightAttribute());
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/AdapterViewRule.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/AdapterViewRule.java
deleted file mode 100644
index 28f5fc9..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/AdapterViewRule.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * Copyright (C) 2010 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.layout;
-
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-import com.android.ide.common.api.DrawingStyle;
-import com.android.ide.common.api.DropFeedback;
-import com.android.ide.common.api.IDragElement;
-import com.android.ide.common.api.IFeedbackPainter;
-import com.android.ide.common.api.IGraphics;
-import com.android.ide.common.api.INode;
-import com.android.ide.common.api.Point;
-import com.android.ide.common.api.Rect;
-
-/** Rule for AdapterView subclasses that don't have more specific rules */
-public class AdapterViewRule extends BaseLayoutRule {
-    @Override
-    public DropFeedback onDropEnter(@NonNull INode targetNode, @Nullable Object targetView,
-            @Nullable IDragElement[] elements) {
-        // You are not allowed to insert children into AdapterViews; you must
-        // use the dedicated addView methods etc dynamically
-        DropFeedback dropFeedback = new DropFeedback(null,  new IFeedbackPainter() {
-            @Override
-            public void paint(@NonNull IGraphics gc, @NonNull INode node,
-                    @NonNull DropFeedback feedback) {
-                Rect b = node.getBounds();
-                if (b.isValid()) {
-                    gc.useStyle(DrawingStyle.DROP_RECIPIENT);
-                    gc.drawRect(b);
-                }
-            }
-        });
-        String fqcn = targetNode.getFqcn();
-        String name = fqcn.substring(fqcn.lastIndexOf('.') +1);
-        dropFeedback.errorMessage = String.format(
-                "%s cannot be configured via XML; add content to the AdapterView using Java code",
-                name);
-        dropFeedback.invalidTarget = true;
-        return dropFeedback;
-    }
-
-    @Override
-    public DropFeedback onDropMove(@NonNull INode targetNode, @NonNull IDragElement[] elements,
-            @Nullable DropFeedback feedback, @NonNull Point p) {
-        feedback.invalidTarget = true;
-        return feedback;
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/BaseLayoutRule.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/BaseLayoutRule.java
deleted file mode 100644
index df2c8f4..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/BaseLayoutRule.java
+++ /dev/null
@@ -1,878 +0,0 @@
-/*
- * Copyright (C) 2010 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.layout;
-
-import static com.android.SdkConstants.ANDROID_URI;
-import static com.android.SdkConstants.ATTR_ID;
-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_ROW;
-import static com.android.SdkConstants.ATTR_LAYOUT_ROW_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_WIDTH;
-import static com.android.SdkConstants.ATTR_LAYOUT_X;
-import static com.android.SdkConstants.ATTR_LAYOUT_Y;
-import static com.android.SdkConstants.VALUE_FILL_PARENT;
-import static com.android.SdkConstants.VALUE_MATCH_PARENT;
-import static com.android.SdkConstants.VALUE_WRAP_CONTENT;
-
-import com.android.SdkConstants;
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-import com.android.ide.common.api.DrawingStyle;
-import com.android.ide.common.api.DropFeedback;
-import com.android.ide.common.api.IAttributeInfo;
-import com.android.ide.common.api.IClientRulesEngine;
-import com.android.ide.common.api.IDragElement;
-import com.android.ide.common.api.IDragElement.IDragAttribute;
-import com.android.ide.common.api.IFeedbackPainter;
-import com.android.ide.common.api.IGraphics;
-import com.android.ide.common.api.IMenuCallback;
-import com.android.ide.common.api.INode;
-import com.android.ide.common.api.INodeHandler;
-import com.android.ide.common.api.IViewRule;
-import com.android.ide.common.api.MarginType;
-import com.android.ide.common.api.Point;
-import com.android.ide.common.api.Rect;
-import com.android.ide.common.api.RuleAction;
-import com.android.ide.common.api.RuleAction.ChoiceProvider;
-import com.android.ide.common.api.Segment;
-import com.android.ide.common.api.SegmentType;
-import com.android.utils.Pair;
-
-import java.net.URL;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-/**
- * A {@link IViewRule} for all layouts.
- */
-public class BaseLayoutRule extends BaseViewRule {
-    private static final String ACTION_FILL_WIDTH = "_fillW";  //$NON-NLS-1$
-    private static final String ACTION_FILL_HEIGHT = "_fillH"; //$NON-NLS-1$
-    private static final String ACTION_MARGIN = "_margin";     //$NON-NLS-1$
-    private static final URL ICON_MARGINS =
-        BaseLayoutRule.class.getResource("margins.png"); //$NON-NLS-1$
-    private static final URL ICON_GRAVITY =
-        BaseLayoutRule.class.getResource("gravity.png"); //$NON-NLS-1$
-    private static final URL ICON_FILL_WIDTH =
-        BaseLayoutRule.class.getResource("fillwidth.png"); //$NON-NLS-1$
-    private static final URL ICON_FILL_HEIGHT =
-        BaseLayoutRule.class.getResource("fillheight.png"); //$NON-NLS-1$
-
-    // ==== Layout Actions support ====
-
-    // The Margin layout parameters are available for LinearLayout, FrameLayout, RelativeLayout,
-    // and their subclasses.
-    protected final RuleAction createMarginAction(final INode parentNode,
-            final List<? extends INode> children) {
-
-        final List<? extends INode> targets = children == null || children.size() == 0 ?
-                Collections.singletonList(parentNode)
-                : children;
-        final INode first = targets.get(0);
-
-        IMenuCallback actionCallback = new IMenuCallback() {
-            @Override
-            public void action(@NonNull RuleAction action,
-                    @NonNull List<? extends INode> selectedNodes,
-                    final @Nullable String valueId,
-                    final @Nullable Boolean newValue) {
-                parentNode.editXml("Change Margins", new INodeHandler() {
-                    @Override
-                    public void handle(@NonNull INode n) {
-                        String uri = ANDROID_URI;
-                        String all = first.getStringAttr(uri, ATTR_LAYOUT_MARGIN);
-                        String left = first.getStringAttr(uri, ATTR_LAYOUT_MARGIN_LEFT);
-                        String right = first.getStringAttr(uri, ATTR_LAYOUT_MARGIN_RIGHT);
-                        String top = first.getStringAttr(uri, ATTR_LAYOUT_MARGIN_TOP);
-                        String bottom = first.getStringAttr(uri, ATTR_LAYOUT_MARGIN_BOTTOM);
-                        String[] margins = mRulesEngine.displayMarginInput(all, left,
-                                right, top, bottom);
-                        if (margins != null) {
-                            assert margins.length == 5;
-                            for (INode child : targets) {
-                                child.setAttribute(uri, ATTR_LAYOUT_MARGIN, margins[0]);
-                                child.setAttribute(uri, ATTR_LAYOUT_MARGIN_LEFT, margins[1]);
-                                child.setAttribute(uri, ATTR_LAYOUT_MARGIN_RIGHT, margins[2]);
-                                child.setAttribute(uri, ATTR_LAYOUT_MARGIN_TOP, margins[3]);
-                                child.setAttribute(uri, ATTR_LAYOUT_MARGIN_BOTTOM, margins[4]);
-                            }
-                        }
-                    }
-                });
-            }
-        };
-
-        return RuleAction.createAction(ACTION_MARGIN, "Change Margins...", actionCallback,
-                ICON_MARGINS, 40, false);
-    }
-
-    // Both LinearLayout and RelativeLayout have a gravity (but RelativeLayout applies it
-    // to the parent whereas for LinearLayout it's on the children)
-    protected final RuleAction createGravityAction(final List<? extends INode> targets, final
-            String attributeName) {
-        if (targets != null && targets.size() > 0) {
-            final INode first = targets.get(0);
-            ChoiceProvider provider = new ChoiceProvider() {
-                @Override
-                public void addChoices(@NonNull List<String> titles, @NonNull List<URL> iconUrls,
-                        @NonNull List<String> ids) {
-                    IAttributeInfo info = first.getAttributeInfo(ANDROID_URI, attributeName);
-                    if (info != null) {
-                        // Generate list of possible gravity value constants
-                        assert info.getFormats().contains(IAttributeInfo.Format.FLAG);
-                        for (String name : info.getFlagValues()) {
-                            titles.add(getAttributeDisplayName(name));
-                            ids.add(name);
-                        }
-                    }
-                }
-            };
-
-            return RuleAction.createChoices("_gravity", "Change Gravity", //$NON-NLS-1$
-                    new PropertyCallback(targets, "Change Gravity", ANDROID_URI,
-                            attributeName),
-                    provider,
-                    first.getStringAttr(ANDROID_URI, attributeName), ICON_GRAVITY,
-                    43, false);
-        }
-
-        return null;
-    }
-
-    @Override
-    public void addLayoutActions(
-            @NonNull List<RuleAction> actions,
-            final @NonNull INode parentNode,
-            final @NonNull List<? extends INode> children) {
-        super.addLayoutActions(actions, parentNode, children);
-
-        final List<? extends INode> targets = children == null || children.size() == 0 ?
-                Collections.singletonList(parentNode)
-                : children;
-        final INode first = targets.get(0);
-
-        // Shared action callback
-        IMenuCallback actionCallback = new IMenuCallback() {
-            @Override
-            public void action(
-                    @NonNull RuleAction action,
-                    @NonNull List<? extends INode> selectedNodes,
-                    final @Nullable String valueId,
-                    final @Nullable Boolean newValue) {
-                final String actionId = action.getId();
-                final String undoLabel;
-                if (actionId.equals(ACTION_FILL_WIDTH)) {
-                    undoLabel = "Change Width Fill";
-                } else if (actionId.equals(ACTION_FILL_HEIGHT)) {
-                    undoLabel = "Change Height Fill";
-                } else {
-                    return;
-                }
-                parentNode.editXml(undoLabel, new INodeHandler() {
-                    @Override
-                    public void handle(@NonNull INode n) {
-                        String attribute = actionId.equals(ACTION_FILL_WIDTH)
-                                ? ATTR_LAYOUT_WIDTH : ATTR_LAYOUT_HEIGHT;
-                        String value;
-                        if (newValue) {
-                            if (supportsMatchParent()) {
-                                value = VALUE_MATCH_PARENT;
-                            } else {
-                                value = VALUE_FILL_PARENT;
-                            }
-                        } else {
-                            value = VALUE_WRAP_CONTENT;
-                        }
-                        for (INode child : targets) {
-                            child.setAttribute(ANDROID_URI, attribute, value);
-                        }
-                    }
-                });
-            }
-        };
-
-        actions.add(RuleAction.createToggle(ACTION_FILL_WIDTH, "Toggle Fill Width",
-                isFilled(first, ATTR_LAYOUT_WIDTH), actionCallback, ICON_FILL_WIDTH, 10, false));
-        actions.add(RuleAction.createToggle(ACTION_FILL_HEIGHT, "Toggle Fill Height",
-                isFilled(first, ATTR_LAYOUT_HEIGHT), actionCallback, ICON_FILL_HEIGHT, 20, false));
-    }
-
-    // ==== Paste support ====
-
-    /**
-     * The default behavior for pasting in a layout is to simulate a drop in the
-     * top-left corner of the view.
-     * <p/>
-     * Note that we explicitly do not call super() here -- the BaseViewRule.onPaste handler
-     * will call onPasteBeforeChild() instead.
-     * <p/>
-     * Derived layouts should override this behavior if not appropriate.
-     */
-    @Override
-    public void onPaste(@NonNull INode targetNode, @Nullable Object targetView,
-            @NonNull IDragElement[] elements) {
-        DropFeedback feedback = onDropEnter(targetNode, targetView, elements);
-        if (feedback != null) {
-            Point p = targetNode.getBounds().getTopLeft();
-            feedback = onDropMove(targetNode, elements, feedback, p);
-            if (feedback != null) {
-                onDropLeave(targetNode, elements, feedback);
-                onDropped(targetNode, elements, feedback, p);
-            }
-        }
-    }
-
-    /**
-     * The default behavior for pasting in a layout with a specific child target
-     * is to simulate a drop right above the top left of the given child target.
-     * <p/>
-     * This method is invoked by BaseView when onPaste() is called --
-     * views don't generally accept children and instead use the target node as
-     * a hint to paste "before" it.
-     *
-     * @param parentNode the parent node we're pasting into
-     * @param parentView the view object for the parent layout, or null
-     * @param targetNode the first selected node
-     * @param elements the elements being pasted
-     */
-    public void onPasteBeforeChild(INode parentNode, Object parentView, INode targetNode,
-            IDragElement[] elements) {
-        DropFeedback feedback = onDropEnter(parentNode, parentView, elements);
-        if (feedback != null) {
-            Point parentP = parentNode.getBounds().getTopLeft();
-            Point targetP = targetNode.getBounds().getTopLeft();
-            if (parentP.y < targetP.y) {
-                targetP.y -= 1;
-            }
-
-            feedback = onDropMove(parentNode, elements, feedback, targetP);
-            if (feedback != null) {
-                onDropLeave(parentNode, elements, feedback);
-                onDropped(parentNode, elements, feedback, targetP);
-            }
-        }
-    }
-
-    // ==== Utility methods used by derived layouts ====
-
-    /**
-     * Draws the bounds of the given elements and all its children elements in the canvas
-     * with the specified offset.
-     *
-     * @param gc the graphics context
-     * @param element the element to be drawn
-     * @param offsetX a horizontal delta to add to the current bounds of the element when
-     *            drawing it
-     * @param offsetY a vertical delta to add to the current bounds of the element when
-     *            drawing it
-     */
-    public void drawElement(IGraphics gc, IDragElement element, int offsetX, int offsetY) {
-        Rect b = element.getBounds();
-        if (b.isValid()) {
-            gc.drawRect(b.x + offsetX, b.y + offsetY, b.x + offsetX + b.w, b.y + offsetY + b.h);
-        }
-
-        for (IDragElement inner : element.getInnerElements()) {
-            drawElement(gc, inner, offsetX, offsetY);
-        }
-    }
-
-    /**
-     * Collect all the "android:id" IDs from the dropped elements. When moving
-     * objects within the same canvas, that's all there is to do. However if the
-     * objects are moved to a different canvas or are copied then set
-     * createNewIds to true to find the existing IDs under targetNode and create
-     * a map with new non-conflicting unique IDs as needed. Returns a map String
-     * old-id => tuple (String new-id, String fqcn) where fqcn is the FQCN of
-     * the element.
-     */
-    protected static Map<String, Pair<String, String>> getDropIdMap(INode targetNode,
-            IDragElement[] elements, boolean createNewIds) {
-        Map<String, Pair<String, String>> idMap = new HashMap<String, Pair<String, String>>();
-
-        if (createNewIds) {
-            collectIds(idMap, elements);
-            // Need to remap ids if necessary
-            idMap = remapIds(targetNode, idMap);
-        }
-
-        return idMap;
-    }
-
-    /**
-     * Fills idMap with a map String id => tuple (String id, String fqcn) where
-     * fqcn is the FQCN of the element (in case we want to generate new IDs
-     * based on the element type.)
-     *
-     * @see #getDropIdMap
-     */
-    protected static Map<String, Pair<String, String>> collectIds(
-            Map<String, Pair<String, String>> idMap,
-            IDragElement[] elements) {
-        for (IDragElement element : elements) {
-            IDragAttribute attr = element.getAttribute(ANDROID_URI, ATTR_ID);
-            if (attr != null) {
-                String id = attr.getValue();
-                if (id != null && id.length() > 0) {
-                    idMap.put(id, Pair.of(id, element.getFqcn()));
-                }
-            }
-
-            collectIds(idMap, element.getInnerElements());
-        }
-
-        return idMap;
-    }
-
-    /**
-     * Used by #getDropIdMap to find new IDs in case of conflict.
-     */
-    protected static Map<String, Pair<String, String>> remapIds(INode node,
-            Map<String, Pair<String, String>> idMap) {
-        // Visit the document to get a list of existing ids
-        Set<String> existingIdSet = new HashSet<String>();
-        collectExistingIds(node.getRoot(), existingIdSet);
-
-        Map<String, Pair<String, String>> new_map = new HashMap<String, Pair<String, String>>();
-        for (Map.Entry<String, Pair<String, String>> entry : idMap.entrySet()) {
-            String key = entry.getKey();
-            Pair<String, String> value = entry.getValue();
-
-            String id = normalizeId(key);
-
-            if (!existingIdSet.contains(id)) {
-                // Not a conflict. Use as-is.
-                new_map.put(key, value);
-                if (!key.equals(id)) {
-                    new_map.put(id, value);
-                }
-            } else {
-                // There is a conflict. Get a new id.
-                String new_id = findNewId(value.getSecond(), existingIdSet);
-                value = Pair.of(new_id, value.getSecond());
-                new_map.put(id, value);
-                new_map.put(id.replaceFirst("@\\+", "@"), value); //$NON-NLS-1$ //$NON-NLS-2$
-            }
-        }
-
-        return new_map;
-    }
-
-    /**
-     * Used by #remapIds to find a new ID for a conflicting element.
-     */
-    protected static String findNewId(String fqcn, Set<String> existingIdSet) {
-        // Get the last component of the FQCN (e.g. "android.view.Button" =>
-        // "Button")
-        String name = fqcn.substring(fqcn.lastIndexOf('.') + 1);
-
-        for (int i = 1; i < 1000000; i++) {
-            String id = String.format("@+id/%s%02d", name, i); //$NON-NLS-1$
-            if (!existingIdSet.contains(id)) {
-                existingIdSet.add(id);
-                return id;
-            }
-        }
-
-        // We'll never reach here.
-        return null;
-    }
-
-    /**
-     * Used by #getDropIdMap to find existing IDs recursively.
-     */
-    protected static void collectExistingIds(INode root, Set<String> existingIdSet) {
-        if (root == null) {
-            return;
-        }
-
-        String id = root.getStringAttr(ANDROID_URI, ATTR_ID);
-        if (id != null) {
-            id = normalizeId(id);
-
-            if (!existingIdSet.contains(id)) {
-                existingIdSet.add(id);
-            }
-        }
-
-        for (INode child : root.getChildren()) {
-            collectExistingIds(child, existingIdSet);
-        }
-    }
-
-    /**
-     * Transforms @id/name into @+id/name to treat both forms the same way.
-     */
-    protected static String normalizeId(String id) {
-        if (id.indexOf("@+") == -1) { //$NON-NLS-1$
-            id = id.replaceFirst("@", "@+"); //$NON-NLS-1$ //$NON-NLS-2$
-        }
-        return id;
-    }
-
-    /**
-     * For use by {@link BaseLayoutRule#addAttributes} A filter should return a
-     * valid replacement string.
-     */
-    protected static interface AttributeFilter {
-        String replace(String attributeUri, String attributeName, String attributeValue);
-    }
-
-    private static final String[] EXCLUDED_ATTRIBUTES = new String[] {
-        // Common
-        ATTR_LAYOUT_GRAVITY,
-
-        // from AbsoluteLayout
-        ATTR_LAYOUT_X,
-        ATTR_LAYOUT_Y,
-
-        // from RelativeLayout
-        ATTR_LAYOUT_ABOVE,
-        ATTR_LAYOUT_BELOW,
-        ATTR_LAYOUT_TO_LEFT_OF,
-        ATTR_LAYOUT_TO_RIGHT_OF,
-        ATTR_LAYOUT_ALIGN_BASELINE,
-        ATTR_LAYOUT_ALIGN_TOP,
-        ATTR_LAYOUT_ALIGN_BOTTOM,
-        ATTR_LAYOUT_ALIGN_LEFT,
-        ATTR_LAYOUT_ALIGN_RIGHT,
-        ATTR_LAYOUT_ALIGN_PARENT_TOP,
-        ATTR_LAYOUT_ALIGN_PARENT_BOTTOM,
-        ATTR_LAYOUT_ALIGN_PARENT_LEFT,
-        ATTR_LAYOUT_ALIGN_PARENT_RIGHT,
-        ATTR_LAYOUT_ALIGN_WITH_PARENT_MISSING,
-        ATTR_LAYOUT_CENTER_HORIZONTAL,
-        ATTR_LAYOUT_CENTER_IN_PARENT,
-        ATTR_LAYOUT_CENTER_VERTICAL,
-
-        // From GridLayout
-        ATTR_LAYOUT_ROW,
-        ATTR_LAYOUT_ROW_SPAN,
-        ATTR_LAYOUT_COLUMN,
-        ATTR_LAYOUT_COLUMN_SPAN
-    };
-
-    /**
-     * Default attribute filter used by the various layouts to filter out some properties
-     * we don't want to offer.
-     */
-    public static final AttributeFilter DEFAULT_ATTR_FILTER = new AttributeFilter() {
-        Set<String> mExcludes;
-
-        @Override
-        public String replace(String uri, String name, String value) {
-            if (!ANDROID_URI.equals(uri)) {
-                return value;
-            }
-
-            if (mExcludes == null) {
-                mExcludes = new HashSet<String>(EXCLUDED_ATTRIBUTES.length);
-                mExcludes.addAll(Arrays.asList(EXCLUDED_ATTRIBUTES));
-            }
-
-            return mExcludes.contains(name) ? null : value;
-        }
-    };
-
-    /**
-     * Copies all the attributes from oldElement to newNode. Uses the idMap to
-     * transform the value of all attributes of Format.REFERENCE. If filter is
-     * non-null, it's a filter that can rewrite the attribute string.
-     */
-    protected static void addAttributes(INode newNode, IDragElement oldElement,
-            Map<String, Pair<String, String>> idMap, AttributeFilter filter) {
-
-        for (IDragAttribute attr : oldElement.getAttributes()) {
-            String uri = attr.getUri();
-            String name = attr.getName();
-            String value = attr.getValue();
-
-            IAttributeInfo attrInfo = newNode.getAttributeInfo(uri, name);
-            if (attrInfo != null) {
-                if (attrInfo.getFormats().contains(IAttributeInfo.Format.REFERENCE)) {
-                    if (idMap.containsKey(value)) {
-                        value = idMap.get(value).getFirst();
-                    }
-                }
-            }
-
-            if (filter != null) {
-                value = filter.replace(uri, name, value);
-            }
-            if (value != null && value.length() > 0) {
-                newNode.setAttribute(uri, name, value);
-            }
-        }
-    }
-
-    /**
-     * Adds all the children elements of oldElement to newNode, recursively.
-     * Attributes are adjusted by calling addAttributes with idMap as necessary,
-     * with no closure filter.
-     */
-    protected static void addInnerElements(INode newNode, IDragElement oldElement,
-            Map<String, Pair<String, String>> idMap) {
-
-        for (IDragElement element : oldElement.getInnerElements()) {
-            String fqcn = element.getFqcn();
-            INode childNode = newNode.appendChild(fqcn);
-
-            addAttributes(childNode, element, idMap, null /* filter */);
-            addInnerElements(childNode, element, idMap);
-        }
-    }
-
-    /**
-     * Insert the given elements into the given node at the given position
-     *
-     * @param targetNode the node to insert into
-     * @param elements the elements to insert
-     * @param createNewIds if true, generate new ids when there is a conflict
-     * @param initialInsertPos index among targetnode's children which to insert the
-     *            children
-     */
-    public static void insertAt(final INode targetNode, final IDragElement[] elements,
-            final boolean createNewIds, final int initialInsertPos) {
-
-        // Collect IDs from dropped elements and remap them to new IDs
-        // if this is a copy or from a different canvas.
-        final Map<String, Pair<String, String>> idMap = getDropIdMap(targetNode, elements,
-                createNewIds);
-
-        targetNode.editXml("Insert Elements", new INodeHandler() {
-
-            @Override
-            public void handle(@NonNull INode node) {
-                // Now write the new elements.
-                int insertPos = initialInsertPos;
-                for (IDragElement element : elements) {
-                    String fqcn = element.getFqcn();
-
-                    INode newChild = targetNode.insertChildAt(fqcn, insertPos);
-
-                    // insertPos==-1 means to insert at the end. Otherwise
-                    // increment the insertion position.
-                    if (insertPos >= 0) {
-                        insertPos++;
-                    }
-
-                    // Copy all the attributes, modifying them as needed.
-                    addAttributes(newChild, element, idMap, DEFAULT_ATTR_FILTER);
-                    addInnerElements(newChild, element, idMap);
-                }
-            }
-        });
-    }
-
-    // ---- Resizing ----
-
-    /** Creates a new {@link ResizeState} object to track resize state */
-    protected ResizeState createResizeState(INode layout, Object layoutView, INode node) {
-        return new ResizeState(this, layout, layoutView, node);
-    }
-
-    @Override
-    public DropFeedback onResizeBegin(@NonNull INode child, @NonNull INode parent,
-            @Nullable SegmentType horizontalEdge, @Nullable SegmentType verticalEdge,
-            @Nullable Object childView, @Nullable Object parentView) {
-        ResizeState state = createResizeState(parent, parentView, child);
-        state.horizontalEdgeType = horizontalEdge;
-        state.verticalEdgeType = verticalEdge;
-
-        // Compute preferred (wrap_content) size such that we can offer guidelines to
-        // snap to the preferred size
-        Map<INode, Rect> sizes = mRulesEngine.measureChildren(parent,
-                new IClientRulesEngine.AttributeFilter() {
-                    @Override
-                    public String getAttribute(@NonNull INode node, @Nullable String namespace,
-                            @NonNull String localName) {
-                        // Change attributes to wrap_content
-                        if (ATTR_LAYOUT_WIDTH.equals(localName)
-                                && SdkConstants.NS_RESOURCES.equals(namespace)) {
-                            return VALUE_WRAP_CONTENT;
-                        }
-                        if (ATTR_LAYOUT_HEIGHT.equals(localName)
-                                && SdkConstants.NS_RESOURCES.equals(namespace)) {
-                            return VALUE_WRAP_CONTENT;
-                        }
-
-                        return null;
-                    }
-                });
-        if (sizes != null) {
-            state.wrapBounds = sizes.get(child);
-        }
-
-        return new DropFeedback(state, new IFeedbackPainter() {
-            @Override
-            public void paint(@NonNull IGraphics gc, @NonNull INode node,
-                    @NonNull DropFeedback feedback) {
-                ResizeState resizeState = (ResizeState) feedback.userData;
-                if (resizeState != null && resizeState.bounds != null) {
-                    paintResizeFeedback(gc, node, resizeState);
-                }
-            }
-        });
-    }
-
-    protected void paintResizeFeedback(IGraphics gc, INode node, ResizeState resizeState) {
-        gc.useStyle(DrawingStyle.RESIZE_PREVIEW);
-        Rect b = resizeState.bounds;
-        gc.drawRect(b);
-
-        if (resizeState.horizontalFillSegment != null) {
-            gc.useStyle(DrawingStyle.GUIDELINE);
-            Segment s = resizeState.horizontalFillSegment;
-            gc.drawLine(s.from, s.at, s.to, s.at);
-        }
-        if (resizeState.verticalFillSegment != null) {
-            gc.useStyle(DrawingStyle.GUIDELINE);
-            Segment s = resizeState.verticalFillSegment;
-            gc.drawLine(s.at, s.from, s.at, s.to);
-        }
-
-        if (resizeState.wrapBounds != null) {
-            gc.useStyle(DrawingStyle.GUIDELINE);
-            int wrapWidth = resizeState.wrapBounds.w;
-            int wrapHeight = resizeState.wrapBounds.h;
-
-            // Show the "wrap_content" guideline.
-            // If we are showing both the wrap_width and wrap_height lines
-            // then we show at most the rectangle formed by the two lines;
-            // otherwise we show the entire width of the line
-            if (resizeState.horizontalEdgeType != null) {
-                int y = -1;
-                switch (resizeState.horizontalEdgeType) {
-                    case TOP:
-                        y = b.y + b.h - wrapHeight;
-                        break;
-                    case BOTTOM:
-                        y = b.y + wrapHeight;
-                        break;
-                    default: assert false : resizeState.horizontalEdgeType;
-                }
-                if (resizeState.verticalEdgeType != null) {
-                    switch (resizeState.verticalEdgeType) {
-                        case LEFT:
-                            gc.drawLine(b.x + b.w - wrapWidth, y, b.x + b.w, y);
-                            break;
-                        case RIGHT:
-                            gc.drawLine(b.x, y, b.x + wrapWidth, y);
-                            break;
-                        default: assert false : resizeState.verticalEdgeType;
-                    }
-                } else {
-                    gc.drawLine(b.x, y, b.x + b.w, y);
-                }
-            }
-            if (resizeState.verticalEdgeType != null) {
-                int x = -1;
-                switch (resizeState.verticalEdgeType) {
-                    case LEFT:
-                        x = b.x + b.w - wrapWidth;
-                        break;
-                    case RIGHT:
-                        x = b.x + wrapWidth;
-                        break;
-                    default: assert false : resizeState.verticalEdgeType;
-                }
-                if (resizeState.horizontalEdgeType != null) {
-                    switch (resizeState.horizontalEdgeType) {
-                        case TOP:
-                            gc.drawLine(x, b.y + b.h - wrapHeight, x, b.y + b.h);
-                            break;
-                        case BOTTOM:
-                            gc.drawLine(x, b.y, x, b.y + wrapHeight);
-                            break;
-                        default: assert false : resizeState.horizontalEdgeType;
-                    }
-                } else {
-                    gc.drawLine(x, b.y, x, b.y + b.h);
-                }
-            }
-        }
-    }
-
-    /**
-     * Returns the maximum number of pixels will be considered a "match" when snapping
-     * resize or move positions to edges or other constraints
-     *
-     * @return the maximum number of pixels to consider for snapping
-     */
-    public static final int getMaxMatchDistance() {
-        // TODO - make constant once we're happy with the feel
-        return 20;
-    }
-
-    @Override
-    public void onResizeUpdate(@Nullable DropFeedback feedback, @NonNull INode child,
-            @NonNull INode parent, @NonNull Rect newBounds, int modifierMask) {
-        ResizeState state = (ResizeState) feedback.userData;
-        state.bounds = newBounds;
-        state.modifierMask = modifierMask;
-
-        // Match on wrap bounds
-        state.wrapWidth = state.wrapHeight = false;
-        if (state.wrapBounds != null) {
-            Rect b = state.wrapBounds;
-            int maxMatchDistance = getMaxMatchDistance();
-            if (state.horizontalEdgeType != null) {
-                if (Math.abs(newBounds.h - b.h) < maxMatchDistance) {
-                    state.wrapHeight = true;
-                    if (state.horizontalEdgeType == SegmentType.TOP) {
-                        newBounds.y += newBounds.h - b.h;
-                    }
-                    newBounds.h = b.h;
-                }
-            }
-            if (state.verticalEdgeType != null) {
-                if (Math.abs(newBounds.w - b.w) < maxMatchDistance) {
-                    state.wrapWidth = true;
-                    if (state.verticalEdgeType == SegmentType.LEFT) {
-                        newBounds.x += newBounds.w - b.w;
-                    }
-                    newBounds.w = b.w;
-                }
-            }
-        }
-
-        // Match on fill bounds
-        state.horizontalFillSegment = null;
-        state.fillHeight = false;
-        if (state.horizontalEdgeType == SegmentType.BOTTOM && !state.wrapHeight) {
-            Rect parentBounds = parent.getBounds();
-            state.horizontalFillSegment = new Segment(parentBounds.y2(), newBounds.x,
-                newBounds.x2(),
-                null /*node*/, null /*id*/, SegmentType.BOTTOM, MarginType.NO_MARGIN);
-            if (Math.abs(newBounds.y2() - parentBounds.y2()) < getMaxMatchDistance()) {
-                state.fillHeight = true;
-                newBounds.h = parentBounds.y2() - newBounds.y;
-            }
-        }
-        state.verticalFillSegment = null;
-        state.fillWidth = false;
-        if (state.verticalEdgeType == SegmentType.RIGHT && !state.wrapWidth) {
-            Rect parentBounds = parent.getBounds();
-            state.verticalFillSegment = new Segment(parentBounds.x2(), newBounds.y,
-                newBounds.y2(),
-                null /*node*/, null /*id*/, SegmentType.RIGHT, MarginType.NO_MARGIN);
-            if (Math.abs(newBounds.x2() - parentBounds.x2()) < getMaxMatchDistance()) {
-                state.fillWidth = true;
-                newBounds.w = parentBounds.x2() - newBounds.x;
-            }
-        }
-
-        feedback.tooltip = getResizeUpdateMessage(state, child, parent,
-                newBounds, state.horizontalEdgeType, state.verticalEdgeType);
-    }
-
-    @Override
-    public void onResizeEnd(@Nullable DropFeedback feedback, @NonNull INode child,
-            final @NonNull INode parent, final @NonNull Rect newBounds) {
-        final Rect oldBounds = child.getBounds();
-        if (oldBounds.w != newBounds.w || oldBounds.h != newBounds.h) {
-            final ResizeState state = (ResizeState) feedback.userData;
-            child.editXml("Resize", new INodeHandler() {
-                @Override
-                public void handle(@NonNull INode n) {
-                    setNewSizeBounds(state, n, parent, oldBounds, newBounds,
-                            state.horizontalEdgeType, state.verticalEdgeType);
-                }
-            });
-        }
-    }
-
-    /**
-     * Returns the message to display to the user during the resize operation
-     *
-     * @param resizeState the current resize state
-     * @param child the child node being resized
-     * @param parent the parent of the resized node
-     * @param newBounds the new bounds to resize the child to, in pixels
-     * @param horizontalEdge the horizontal edge being resized
-     * @param verticalEdge the vertical edge being resized
-     * @return the message to display for the current resize bounds
-     */
-    protected String getResizeUpdateMessage(ResizeState resizeState, INode child, INode parent,
-            Rect newBounds, SegmentType horizontalEdge, SegmentType verticalEdge) {
-        String width = resizeState.getWidthAttribute();
-        String height = resizeState.getHeightAttribute();
-
-        if (horizontalEdge == null) {
-            return width;
-        } else if (verticalEdge == null) {
-            return height;
-        } else {
-            // U+00D7: Unicode for multiplication sign
-            return String.format("%s \u00D7 %s", width, height);
-        }
-    }
-
-    /**
-     * Performs the edit on the node to complete a resizing operation. The actual edit
-     * part is pulled out such that subclasses can change/add to the edits and be part of
-     * the same undo event
-     *
-     * @param resizeState the current resize state
-     * @param node the child node being resized
-     * @param layout the parent of the resized node
-     * @param newBounds the new bounds to resize the child to, in pixels
-     * @param horizontalEdge the horizontal edge being resized
-     * @param verticalEdge the vertical edge being resized
-     */
-    protected void setNewSizeBounds(ResizeState resizeState, INode node, INode layout,
-            Rect oldBounds, Rect newBounds, SegmentType horizontalEdge, SegmentType verticalEdge) {
-        if (verticalEdge != null
-            && (newBounds.w != oldBounds.w || resizeState.wrapWidth || resizeState.fillWidth)) {
-            node.setAttribute(ANDROID_URI, ATTR_LAYOUT_WIDTH, resizeState.getWidthAttribute());
-        }
-        if (horizontalEdge != null
-            && (newBounds.h != oldBounds.h || resizeState.wrapHeight || resizeState.fillHeight)) {
-            node.setAttribute(ANDROID_URI, ATTR_LAYOUT_HEIGHT, resizeState.getHeightAttribute());
-        }
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/BaseViewRule.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/BaseViewRule.java
deleted file mode 100644
index 83ce9ef..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/BaseViewRule.java
+++ /dev/null
@@ -1,996 +0,0 @@
-/*
- * Copyright (C) 2010 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.layout;
-
-import static com.android.SdkConstants.ANDROID_URI;
-import static com.android.SdkConstants.ATTR_CLASS;
-import static com.android.SdkConstants.ATTR_HINT;
-import static com.android.SdkConstants.ATTR_ID;
-import static com.android.SdkConstants.ATTR_LAYOUT_HEIGHT;
-import static com.android.SdkConstants.ATTR_LAYOUT_RESOURCE_PREFIX;
-import static com.android.SdkConstants.ATTR_LAYOUT_WIDTH;
-import static com.android.SdkConstants.ATTR_STYLE;
-import static com.android.SdkConstants.ATTR_TEXT;
-import static com.android.SdkConstants.DOT_LAYOUT_PARAMS;
-import static com.android.SdkConstants.ID_PREFIX;
-import static com.android.SdkConstants.NEW_ID_PREFIX;
-import static com.android.SdkConstants.VALUE_FALSE;
-import static com.android.SdkConstants.VALUE_FILL_PARENT;
-import static com.android.SdkConstants.VALUE_MATCH_PARENT;
-import static com.android.SdkConstants.VALUE_TRUE;
-import static com.android.SdkConstants.VALUE_WRAP_CONTENT;
-import static com.android.SdkConstants.VIEW_FRAGMENT;
-
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-import com.android.ide.common.api.AbstractViewRule;
-import com.android.ide.common.api.IAttributeInfo;
-import com.android.ide.common.api.IAttributeInfo.Format;
-import com.android.ide.common.api.IClientRulesEngine;
-import com.android.ide.common.api.IDragElement;
-import com.android.ide.common.api.IMenuCallback;
-import com.android.ide.common.api.INode;
-import com.android.ide.common.api.IViewMetadata;
-import com.android.ide.common.api.IViewRule;
-import com.android.ide.common.api.RuleAction;
-import com.android.ide.common.api.RuleAction.ActionProvider;
-import com.android.ide.common.api.RuleAction.ChoiceProvider;
-import com.android.resources.ResourceType;
-import com.android.utils.Pair;
-
-import java.net.URL;
-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.LinkedList;
-import java.util.List;
-import java.util.Locale;
-import java.util.Map;
-import java.util.Map.Entry;
-import java.util.Set;
-
-/**
- * Common IViewRule processing to all view and layout classes.
- */
-public class BaseViewRule extends AbstractViewRule {
-    /** List of recently edited properties */
-    private static List<String> sRecent = new LinkedList<String>();
-
-    /** Maximum number of recent properties to track and list */
-    private final static int MAX_RECENT_COUNT = 12;
-
-    // Strings used as internal ids, group ids and prefixes for actions
-    private static final String FALSE_ID = "false"; //$NON-NLS-1$
-    private static final String TRUE_ID = "true"; //$NON-NLS-1$
-    private static final String PROP_PREFIX = "@prop@"; //$NON-NLS-1$
-    private static final String CLEAR_ID = "clear"; //$NON-NLS-1$
-    private static final String ZCUSTOM = "zcustom"; //$NON-NLS-1$
-
-    protected IClientRulesEngine mRulesEngine;
-
-    // Cache of attributes. Key is FQCN of a node mixed with its view hierarchy
-    // parent. Values are a custom map as needed by getContextMenu.
-    private Map<String, Map<String, Prop>> mAttributesMap =
-        new HashMap<String, Map<String, Prop>>();
-
-    @Override
-    public boolean onInitialize(@NonNull String fqcn, @NonNull IClientRulesEngine engine) {
-        mRulesEngine = engine;
-
-        // This base rule can handle any class so we don't need to filter on
-        // FQCN. Derived classes should do so if they can handle some
-        // subclasses.
-
-        // If onInitialize returns false, it means it can't handle the given
-        // FQCN and will be unloaded.
-
-        return true;
-    }
-
-    /**
-     * Returns the {@link IClientRulesEngine} associated with this {@link IViewRule}
-     *
-     * @return the {@link IClientRulesEngine} associated with this {@link IViewRule}
-     */
-    public IClientRulesEngine getRulesEngine() {
-        return mRulesEngine;
-    }
-
-    // === Context Menu ===
-
-    /**
-     * Generate custom actions for the context menu: <br/>
-     * - Explicit layout_width and layout_height attributes.
-     * - List of all other simple toggle attributes.
-     */
-    @Override
-    public void addContextMenuActions(@NonNull List<RuleAction> actions,
-            final @NonNull INode selectedNode) {
-        String width = null;
-        String currentWidth = selectedNode.getStringAttr(ANDROID_URI, ATTR_LAYOUT_WIDTH);
-
-        String fillParent = getFillParentValueName();
-        boolean canMatchParent = supportsMatchParent();
-        if (canMatchParent && VALUE_FILL_PARENT.equals(currentWidth)) {
-            currentWidth = VALUE_MATCH_PARENT;
-        } else if (!canMatchParent && VALUE_MATCH_PARENT.equals(currentWidth)) {
-            currentWidth = VALUE_FILL_PARENT;
-        } else if (!VALUE_WRAP_CONTENT.equals(currentWidth) && !fillParent.equals(currentWidth)) {
-            width = currentWidth;
-        }
-
-        String height = null;
-        String currentHeight = selectedNode.getStringAttr(ANDROID_URI, ATTR_LAYOUT_HEIGHT);
-
-        if (canMatchParent && VALUE_FILL_PARENT.equals(currentHeight)) {
-            currentHeight = VALUE_MATCH_PARENT;
-        } else if (!canMatchParent && VALUE_MATCH_PARENT.equals(currentHeight)) {
-            currentHeight = VALUE_FILL_PARENT;
-        } else if (!VALUE_WRAP_CONTENT.equals(currentHeight)
-                && !fillParent.equals(currentHeight)) {
-            height = currentHeight;
-        }
-        final String newWidth = width;
-        final String newHeight = height;
-
-        final IMenuCallback onChange = new IMenuCallback() {
-            @Override
-            public void action(
-                    final @NonNull RuleAction action,
-                    final @NonNull List<? extends INode> selectedNodes,
-                    final @Nullable String valueId, final @Nullable Boolean newValue) {
-                String fullActionId = action.getId();
-                boolean isProp = fullActionId.startsWith(PROP_PREFIX);
-                final String actionId = isProp ?
-                        fullActionId.substring(PROP_PREFIX.length()) : fullActionId;
-
-                if (fullActionId.equals(ATTR_LAYOUT_WIDTH)) {
-                    final String newAttrValue = getValue(valueId, newWidth);
-                    if (newAttrValue != null) {
-                        for (INode node : selectedNodes) {
-                            node.editXml("Change Attribute " + ATTR_LAYOUT_WIDTH,
-                                    new PropertySettingNodeHandler(ANDROID_URI,
-                                            ATTR_LAYOUT_WIDTH, newAttrValue));
-                        }
-                        editedProperty(ATTR_LAYOUT_WIDTH);
-                    }
-                    return;
-                } else if (fullActionId.equals(ATTR_LAYOUT_HEIGHT)) {
-                    // Ask the user
-                    final String newAttrValue = getValue(valueId, newHeight);
-                    if (newAttrValue != null) {
-                        for (INode node : selectedNodes) {
-                            node.editXml("Change Attribute " + ATTR_LAYOUT_HEIGHT,
-                                    new PropertySettingNodeHandler(ANDROID_URI,
-                                            ATTR_LAYOUT_HEIGHT, newAttrValue));
-                        }
-                        editedProperty(ATTR_LAYOUT_HEIGHT);
-                    }
-                    return;
-                } else if (fullActionId.equals(ATTR_ID)) {
-                    // Ids must be set individually so open the id dialog for each
-                    // selected node (though allow cancel to break the loop)
-                    for (INode node : selectedNodes) {
-                        if (!mRulesEngine.rename(node)) {
-                            break;
-                        }
-                    }
-                    editedProperty(ATTR_ID);
-                    return;
-                } else if (isProp) {
-                    INode firstNode = selectedNodes.get(0);
-                    String key = getPropertyMapKey(selectedNode);
-                    Map<String, Prop> props = mAttributesMap.get(key);
-                    final Prop prop = (props != null) ? props.get(actionId) : null;
-
-                    if (prop != null) {
-                        editedProperty(actionId);
-
-                        // For custom values (requiring an input dialog) input the
-                        // value outside the undo-block.
-                        // Input the value as a text, unless we know it's the "text" or
-                        // "style" attributes (where we know we want to ask for specific
-                        // resource types).
-                        String uri = ANDROID_URI;
-                        String v = null;
-                        if (prop.isStringEdit()) {
-                            boolean isStyle = actionId.equals(ATTR_STYLE);
-                            boolean isText = actionId.equals(ATTR_TEXT);
-                            boolean isHint = actionId.equals(ATTR_HINT);
-                            if (isStyle || isText || isHint) {
-                                String resourceTypeName = isStyle
-                                        ? ResourceType.STYLE.getName()
-                                        : ResourceType.STRING.getName();
-                                String oldValue = selectedNodes.size() == 1
-                                    ? (isStyle ? firstNode.getStringAttr(ATTR_STYLE, actionId)
-                                            : firstNode.getStringAttr(ANDROID_URI, actionId))
-                                    : ""; //$NON-NLS-1$
-                                oldValue = ensureValidString(oldValue);
-                                v = mRulesEngine.displayResourceInput(resourceTypeName, oldValue);
-                                if (isStyle) {
-                                    uri = null;
-                                }
-                            } else if (actionId.equals(ATTR_CLASS) && selectedNodes.size() >= 1 &&
-                                    VIEW_FRAGMENT.equals(selectedNodes.get(0).getFqcn())) {
-                                v = mRulesEngine.displayFragmentSourceInput();
-                                uri = null;
-                            } else {
-                                v = inputAttributeValue(firstNode, actionId);
-                            }
-                        }
-                        final String customValue = v;
-
-                        for (INode n : selectedNodes) {
-                            if (prop.isToggle()) {
-                                // case of toggle
-                                String value = "";                  //$NON-NLS-1$
-                                if (valueId.equals(TRUE_ID)) {
-                                    value = newValue ? "true" : ""; //$NON-NLS-1$ //$NON-NLS-2$
-                                } else if (valueId.equals(FALSE_ID)) {
-                                    value = newValue ? "false" : "";//$NON-NLS-1$ //$NON-NLS-2$
-                                }
-                                n.setAttribute(uri, actionId, value);
-                            } else if (prop.isFlag()) {
-                                // case of a flag
-                                String values = "";                 //$NON-NLS-1$
-                                if (!valueId.equals(CLEAR_ID)) {
-                                    values = n.getStringAttr(ANDROID_URI, actionId);
-                                    Set<String> newValues = new HashSet<String>();
-                                    if (values != null) {
-                                        newValues.addAll(Arrays.asList(
-                                                values.split("\\|"))); //$NON-NLS-1$
-                                    }
-                                    if (newValue) {
-                                        newValues.add(valueId);
-                                    } else {
-                                        newValues.remove(valueId);
-                                    }
-
-                                    List<String> sorted = new ArrayList<String>(newValues);
-                                    Collections.sort(sorted);
-                                    values = join('|', sorted);
-
-                                    // Special case
-                                    if (valueId.equals("normal")) { //$NON-NLS-1$
-                                        // For textStyle for example, if you have "bold|italic"
-                                        // and you select the "normal" property, this should
-                                        // not behave in the normal flag way and "or" itself in;
-                                        // it should replace the other two.
-                                        // This also applies to imeOptions.
-                                        values = valueId;
-                                    }
-                                }
-                                n.setAttribute(uri, actionId, values);
-                            } else if (prop.isEnum()) {
-                                // case of an enum
-                                String value = "";                   //$NON-NLS-1$
-                                if (!valueId.equals(CLEAR_ID)) {
-                                    value = newValue ? valueId : ""; //$NON-NLS-1$
-                                }
-                                n.setAttribute(uri, actionId, value);
-                            } else {
-                                assert prop.isStringEdit();
-                                // We've already received the value outside the undo block
-                                if (customValue != null) {
-                                    n.setAttribute(uri, actionId, customValue);
-                                }
-                            }
-                        }
-                    }
-                }
-            }
-
-            /**
-             * Input the custom value for the given attribute. This will use the Reference
-             * Chooser if it is a reference value, otherwise a plain text editor.
-             */
-            private String inputAttributeValue(final INode node, final String attribute) {
-                String oldValue = node.getStringAttr(ANDROID_URI, attribute);
-                oldValue = ensureValidString(oldValue);
-                IAttributeInfo attributeInfo = node.getAttributeInfo(ANDROID_URI, attribute);
-                if (attributeInfo != null
-                        && attributeInfo.getFormats().contains(Format.REFERENCE)) {
-                    return mRulesEngine.displayReferenceInput(oldValue);
-                } else {
-                    // A single resource type? If so use a resource chooser initialized
-                    // to this specific type
-                    /* This does not work well, because the metadata is a bit misleading:
-                     * for example a Button's "text" property and a Button's "onClick" property
-                     * both claim to be of type [string], but @string/ is NOT valid for
-                     * onClick..
-                    if (attributeInfo != null && attributeInfo.getFormats().length == 1) {
-                        // Resource chooser
-                        Format format = attributeInfo.getFormats()[0];
-                        return mRulesEngine.displayResourceInput(format.name(), oldValue);
-                    }
-                    */
-
-                    // Fallback: just edit the raw XML string
-                    String message = String.format("New %1$s Value:", attribute);
-                    return mRulesEngine.displayInput(message, oldValue, null);
-                }
-            }
-
-            /**
-             * Returns the value (which will ask the user if the value is the special
-             * {@link #ZCUSTOM} marker
-             */
-            private String getValue(String valueId, String defaultValue) {
-                if (valueId.equals(ZCUSTOM)) {
-                    if (defaultValue == null) {
-                        defaultValue = "";
-                    }
-                    String value = mRulesEngine.displayInput(
-                            "Set custom layout attribute value (example: 50dp)",
-                            defaultValue, null);
-                    if (value != null && value.trim().length() > 0) {
-                        return value.trim();
-                    } else {
-                        return null;
-                    }
-                }
-
-                return valueId;
-            }
-        };
-
-        IAttributeInfo textAttribute = selectedNode.getAttributeInfo(ANDROID_URI, ATTR_TEXT);
-        if (textAttribute != null) {
-            actions.add(RuleAction.createAction(PROP_PREFIX + ATTR_TEXT, "Edit Text...", onChange,
-                    null, 10, true));
-        }
-
-        String editIdLabel = selectedNode.getStringAttr(ANDROID_URI, ATTR_ID) != null ?
-                "Edit ID..." : "Assign ID...";
-        actions.add(RuleAction.createAction(ATTR_ID, editIdLabel, onChange, null, 20, true));
-
-        addCommonPropertyActions(actions, selectedNode, onChange, 21);
-
-        // Create width choice submenu
-        actions.add(RuleAction.createSeparator(32));
-        List<Pair<String, String>> widthChoices = new ArrayList<Pair<String,String>>(4);
-        widthChoices.add(Pair.of(VALUE_WRAP_CONTENT, "Wrap Content"));
-        if (canMatchParent) {
-            widthChoices.add(Pair.of(VALUE_MATCH_PARENT, "Match Parent"));
-        } else {
-            widthChoices.add(Pair.of(VALUE_FILL_PARENT, "Fill Parent"));
-        }
-        if (width != null) {
-            widthChoices.add(Pair.of(width, width));
-        }
-        widthChoices.add(Pair.of(ZCUSTOM, "Other..."));
-        actions.add(RuleAction.createChoices(
-                ATTR_LAYOUT_WIDTH, "Layout Width",
-                onChange,
-                null /* iconUrls */,
-                currentWidth,
-                null, 35,
-                true, // supportsMultipleNodes
-                widthChoices));
-
-        // Create height choice submenu
-        List<Pair<String, String>> heightChoices = new ArrayList<Pair<String,String>>(4);
-        heightChoices.add(Pair.of(VALUE_WRAP_CONTENT, "Wrap Content"));
-        if (canMatchParent) {
-            heightChoices.add(Pair.of(VALUE_MATCH_PARENT, "Match Parent"));
-        } else {
-            heightChoices.add(Pair.of(VALUE_FILL_PARENT, "Fill Parent"));
-        }
-        if (height != null) {
-            heightChoices.add(Pair.of(height, height));
-        }
-        heightChoices.add(Pair.of(ZCUSTOM, "Other..."));
-        actions.add(RuleAction.createChoices(
-                ATTR_LAYOUT_HEIGHT, "Layout Height",
-                onChange,
-                null /* iconUrls */,
-                currentHeight,
-                null, 40,
-                true,
-                heightChoices));
-
-        actions.add(RuleAction.createSeparator(45));
-        RuleAction properties = RuleAction.createChoices("properties", "Other Properties", //$NON-NLS-1$
-                onChange /*callback*/, null /*icon*/, 50,
-                true /*supportsMultipleNodes*/, new ActionProvider() {
-            @Override
-            public @NonNull List<RuleAction> getNestedActions(@NonNull INode node) {
-                List<RuleAction> propertyActionTypes = new ArrayList<RuleAction>();
-                propertyActionTypes.add(RuleAction.createChoices(
-                        "recent", "Recent", //$NON-NLS-1$
-                        onChange /*callback*/, null /*icon*/, 10,
-                        true /*supportsMultipleNodes*/, new ActionProvider() {
-                            @Override
-                            public @NonNull List<RuleAction> getNestedActions(@NonNull INode n) {
-                                List<RuleAction> propertyActions = new ArrayList<RuleAction>();
-                                addRecentPropertyActions(propertyActions, n, onChange);
-                                return propertyActions;
-                            }
-                }));
-
-                propertyActionTypes.add(RuleAction.createSeparator(20));
-
-                addInheritedProperties(propertyActionTypes, node, onChange, 30);
-
-                propertyActionTypes.add(RuleAction.createSeparator(50));
-                propertyActionTypes.add(RuleAction.createChoices(
-                        "layoutparams", "Layout Parameters", //$NON-NLS-1$
-                        onChange /*callback*/, null /*icon*/, 60,
-                        true /*supportsMultipleNodes*/, new ActionProvider() {
-                            @Override
-                            public @NonNull List<RuleAction> getNestedActions(@NonNull INode n) {
-                                List<RuleAction> propertyActions = new ArrayList<RuleAction>();
-                                addPropertyActions(propertyActions, n, onChange, null, true);
-                                return propertyActions;
-                            }
-                }));
-
-                propertyActionTypes.add(RuleAction.createSeparator(70));
-
-                propertyActionTypes.add(RuleAction.createChoices(
-                        "allprops", "All By Name", //$NON-NLS-1$
-                        onChange /*callback*/, null /*icon*/, 80,
-                        true /*supportsMultipleNodes*/, new ActionProvider() {
-                            @Override
-                            public @NonNull List<RuleAction> getNestedActions(@NonNull INode n) {
-                                List<RuleAction> propertyActions = new ArrayList<RuleAction>();
-                                addPropertyActions(propertyActions, n, onChange, null, false);
-                                return propertyActions;
-                            }
-                }));
-
-                return propertyActionTypes;
-            }
-        });
-
-        actions.add(properties);
-    }
-
-    @Override
-    @Nullable
-    public String getDefaultActionId(@NonNull final INode selectedNode) {
-        IAttributeInfo textAttribute = selectedNode.getAttributeInfo(ANDROID_URI, ATTR_TEXT);
-        if (textAttribute != null) {
-            return PROP_PREFIX + ATTR_TEXT;
-        }
-
-        return null;
-    }
-
-    private static String getPropertyMapKey(INode node) {
-        // Compute the key for mAttributesMap. This depends on the type of this
-        // node and its parent in the view hierarchy.
-        StringBuilder sb = new StringBuilder();
-        sb.append(node.getFqcn());
-        sb.append('_');
-        INode parent = node.getParent();
-        if (parent != null) {
-            sb.append(parent.getFqcn());
-        }
-        return sb.toString();
-    }
-
-    /**
-     * Adds menu items for the inherited attributes, one pull-right menu for each super class
-     * that defines attributes.
-     *
-     * @param propertyActionTypes the actions list to add into
-     * @param node the node to apply the attributes to
-     * @param onChange the callback to use for setting attributes
-     * @param sortPriority the initial sort attribute for the first menu item
-     */
-    private void addInheritedProperties(List<RuleAction> propertyActionTypes, INode node,
-            final IMenuCallback onChange, int sortPriority) {
-        List<String> attributeSources = node.getAttributeSources();
-        for (final String definedBy : attributeSources) {
-            String sourceClass = definedBy;
-
-            // Strip package prefixes when necessary
-            int index = sourceClass.length();
-            if (sourceClass.endsWith(DOT_LAYOUT_PARAMS)) {
-                index = sourceClass.length() - DOT_LAYOUT_PARAMS.length() - 1;
-            }
-            int lastDot = sourceClass.lastIndexOf('.', index);
-            if (lastDot != -1) {
-                sourceClass = sourceClass.substring(lastDot + 1);
-            }
-
-            String label;
-            if (definedBy.equals(node.getFqcn())) {
-                label = String.format("Defined by %1$s", sourceClass);
-            } else {
-                label = String.format("Inherited from %1$s", sourceClass);
-            }
-
-            propertyActionTypes.add(RuleAction.createChoices("def_" + definedBy,
-                    label,
-                    onChange /*callback*/, null /*icon*/, sortPriority++,
-                    true /*supportsMultipleNodes*/, new ActionProvider() {
-                        @Override
-                        public @NonNull List<RuleAction> getNestedActions(@NonNull INode n) {
-                            List<RuleAction> propertyActions = new ArrayList<RuleAction>();
-                            addPropertyActions(propertyActions, n, onChange, definedBy, false);
-                            return propertyActions;
-                        }
-           }));
-        }
-    }
-
-    /**
-     * Creates a list of properties that are commonly edited for views of the
-     * selected node's type
-     */
-    private void addCommonPropertyActions(List<RuleAction> actions, INode selectedNode,
-            IMenuCallback onChange, int sortPriority) {
-        Map<String, Prop> properties = getPropertyMetadata(selectedNode);
-        IViewMetadata metadata = mRulesEngine.getMetadata(selectedNode.getFqcn());
-        if (metadata != null) {
-            List<String> attributes = metadata.getTopAttributes();
-            if (attributes.size() > 0) {
-                for (String attribute : attributes) {
-                    // Text and ID are handled manually in the menu construction code because
-                    // we want to place them consistently and customize the action label
-                    if (ATTR_TEXT.equals(attribute) || ATTR_ID.equals(attribute)) {
-                        continue;
-                    }
-
-                    Prop property = properties.get(attribute);
-                    if (property != null) {
-                        String title = property.getTitle();
-                        if (title.endsWith("...")) {
-                            title = String.format("Edit %1$s", property.getTitle());
-                        }
-                        actions.add(createPropertyAction(property, attribute, title,
-                                selectedNode, onChange, sortPriority));
-                        sortPriority++;
-                    }
-                }
-            }
-        }
-    }
-
-    /**
-     * Record that the given property was just edited; adds it to the front of
-     * the recently edited property list
-     *
-     * @param property the name of the property
-     */
-    static void editedProperty(String property) {
-        if (sRecent.contains(property)) {
-            sRecent.remove(property);
-        } else if (sRecent.size() > MAX_RECENT_COUNT) {
-            sRecent.remove(sRecent.size() - 1);
-        }
-        sRecent.add(0, property);
-    }
-
-    /**
-     * Creates a list of recently modified properties that apply to the given selected node
-     */
-    private void addRecentPropertyActions(List<RuleAction> actions, INode selectedNode,
-            IMenuCallback onChange) {
-        int sortPriority = 10;
-        Map<String, Prop> properties = getPropertyMetadata(selectedNode);
-        for (String attribute : sRecent) {
-            Prop property = properties.get(attribute);
-            if (property != null) {
-                actions.add(createPropertyAction(property, attribute, property.getTitle(),
-                        selectedNode, onChange, sortPriority));
-                sortPriority += 10;
-            }
-        }
-    }
-
-    /**
-     * Creates a list of nested actions representing the property-setting
-     * actions for the given selected node
-     */
-    private void addPropertyActions(List<RuleAction> actions, INode selectedNode,
-            IMenuCallback onChange, String definedBy, boolean layoutParamsOnly) {
-
-        Map<String, Prop> properties = getPropertyMetadata(selectedNode);
-
-        int sortPriority = 10;
-        for (Map.Entry<String, Prop> entry : properties.entrySet()) {
-            String id = entry.getKey();
-            Prop property = entry.getValue();
-            if (layoutParamsOnly) {
-                // If we have definedBy information, that is most accurate; all layout
-                // params will be defined by a class whose name ends with
-                // .LayoutParams:
-                if (definedBy != null) {
-                    if (!definedBy.endsWith(DOT_LAYOUT_PARAMS)) {
-                        continue;
-                    }
-                } else if (!id.startsWith(ATTR_LAYOUT_RESOURCE_PREFIX)) {
-                    continue;
-                }
-            }
-            if (definedBy != null && !definedBy.equals(property.getDefinedBy())) {
-                continue;
-            }
-            actions.add(createPropertyAction(property, id, property.getTitle(),
-                    selectedNode, onChange, sortPriority));
-            sortPriority += 10;
-        }
-
-        // The properties are coming out of map key order which isn't right, so sort
-        // alphabetically instead
-        Collections.sort(actions, new Comparator<RuleAction>() {
-            @Override
-            public int compare(RuleAction action1, RuleAction action2) {
-                return action1.getTitle().compareTo(action2.getTitle());
-            }
-        });
-    }
-
-    private RuleAction createPropertyAction(Prop p, String id, String title, INode selectedNode,
-            IMenuCallback onChange, int sortPriority) {
-        if (p.isToggle()) {
-            // Toggles are handled as a multiple-choice between true, false
-            // and nothing (clear)
-            String value = selectedNode.getStringAttr(ANDROID_URI, id);
-            if (value != null) {
-                value = value.toLowerCase(Locale.US);
-            }
-            if (VALUE_TRUE.equals(value)) {
-                value = TRUE_ID;
-            } else if (VALUE_FALSE.equals(value)) {
-                value = FALSE_ID;
-            } else {
-                value = CLEAR_ID;
-            }
-            return RuleAction.createChoices(PROP_PREFIX + id, title,
-                    onChange, BOOLEAN_CHOICE_PROVIDER,
-                    value,
-                    null, sortPriority,
-                    true);
-        } else if (p.getChoices() != null) {
-            // Enum or flags. Their possible values are the multiple-choice
-            // items, with an extra "clear" option to remove everything.
-            String current = selectedNode.getStringAttr(ANDROID_URI, id);
-            if (current == null || current.length() == 0) {
-                current = CLEAR_ID;
-            }
-            return RuleAction.createChoices(PROP_PREFIX + id, title,
-                    onChange, new EnumPropertyChoiceProvider(p),
-                    current,
-                    null, sortPriority,
-                    true);
-        } else {
-            return RuleAction.createAction(
-                    PROP_PREFIX + id,
-                    title,
-                    onChange,
-                    null, sortPriority,
-                    true);
-        }
-    }
-
-    private Map<String, Prop> getPropertyMetadata(final INode selectedNode) {
-        String key = getPropertyMapKey(selectedNode);
-        Map<String, Prop> props = mAttributesMap.get(key);
-        if (props == null) {
-            // Prepare the property map
-            props = new HashMap<String, Prop>();
-            for (IAttributeInfo attrInfo : selectedNode.getDeclaredAttributes()) {
-                String id = attrInfo != null ? attrInfo.getName() : null;
-                if (id == null || id.equals(ATTR_LAYOUT_WIDTH) || id.equals(ATTR_LAYOUT_HEIGHT)) {
-                    // Layout width/height are already handled at the root level
-                    continue;
-                }
-                if (attrInfo == null) {
-                    continue;
-                }
-                EnumSet<Format> formats = attrInfo.getFormats();
-
-                String title = getAttributeDisplayName(id);
-
-                String definedBy = attrInfo != null ? attrInfo.getDefinedBy() : null;
-                if (formats.contains(IAttributeInfo.Format.BOOLEAN)) {
-                    props.put(id, new Prop(title, true, definedBy));
-                } else if (formats.contains(IAttributeInfo.Format.ENUM)) {
-                    // Convert each enum into a map id=>title
-                    Map<String, String> values = new HashMap<String, String>();
-                    if (attrInfo != null) {
-                        for (String e : attrInfo.getEnumValues()) {
-                            values.put(e, getAttributeDisplayName(e));
-                        }
-                    }
-
-                    props.put(id, new Prop(title, false, false, values, definedBy));
-                } else if (formats.contains(IAttributeInfo.Format.FLAG)) {
-                    // Convert each flag into a map id=>title
-                    Map<String, String> values = new HashMap<String, String>();
-                    if (attrInfo != null) {
-                        for (String e : attrInfo.getFlagValues()) {
-                            values.put(e, getAttributeDisplayName(e));
-                        }
-                    }
-
-                    props.put(id, new Prop(title, false, true, values, definedBy));
-                } else {
-                    props.put(id, new Prop(title + "...", false, definedBy));
-                }
-            }
-            mAttributesMap.put(key, props);
-        }
-        return props;
-    }
-
-    /**
-     * A {@link ChoiceProvder} which provides alternatives suitable for choosing
-     * values for a boolean property: true, false, or "default".
-     */
-    private static ChoiceProvider BOOLEAN_CHOICE_PROVIDER = new ChoiceProvider() {
-        @Override
-        public void addChoices(@NonNull List<String> titles, @NonNull List<URL> iconUrls,
-                @NonNull List<String> ids) {
-            titles.add("True");
-            ids.add(TRUE_ID);
-
-            titles.add("False");
-            ids.add(FALSE_ID);
-
-            titles.add(RuleAction.SEPARATOR);
-            ids.add(RuleAction.SEPARATOR);
-
-            titles.add("Default");
-            ids.add(CLEAR_ID);
-        }
-    };
-
-    /**
-     * A {@link ChoiceProvider} which provides the various available
-     * attribute values available for a given {@link Prop} property descriptor.
-     */
-    private static class EnumPropertyChoiceProvider implements ChoiceProvider {
-        private Prop mProperty;
-
-        public EnumPropertyChoiceProvider(Prop property) {
-            super();
-            mProperty = property;
-        }
-
-        @Override
-        public void addChoices(@NonNull List<String> titles, @NonNull List<URL> iconUrls,
-                @NonNull List<String> ids) {
-            for (Entry<String, String> entry : mProperty.getChoices().entrySet()) {
-                ids.add(entry.getKey());
-                titles.add(entry.getValue());
-            }
-
-            titles.add(RuleAction.SEPARATOR);
-            ids.add(RuleAction.SEPARATOR);
-
-            titles.add("Default");
-            ids.add(CLEAR_ID);
-        }
-    }
-
-    /**
-     * Returns true if the given node is "filled" (e.g. has layout width set to match
-     * parent or fill parent
-     */
-    protected final boolean isFilled(INode node, String attribute) {
-        String value = node.getStringAttr(ANDROID_URI, attribute);
-        return VALUE_MATCH_PARENT.equals(value) || VALUE_FILL_PARENT.equals(value);
-    }
-
-    /**
-     * Returns fill_parent or match_parent, depending on whether the minimum supported
-     * platform supports match_parent or not
-     *
-     * @return match_parent or fill_parent depending on which is supported by the project
-     */
-    protected final String getFillParentValueName() {
-        return supportsMatchParent() ? VALUE_MATCH_PARENT : VALUE_FILL_PARENT;
-    }
-
-    /**
-     * Returns true if the project supports match_parent instead of just fill_parent
-     *
-     * @return true if the project supports match_parent instead of just fill_parent
-     */
-    protected final boolean supportsMatchParent() {
-        // fill_parent was renamed match_parent in API level 8
-        return mRulesEngine.getMinApiLevel() >= 8;
-    }
-
-    /** Join strings into a single string with the given delimiter */
-    static String join(char delimiter, Collection<String> strings) {
-        StringBuilder sb = new StringBuilder(100);
-        for (String s : strings) {
-            if (sb.length() > 0) {
-                sb.append(delimiter);
-            }
-            sb.append(s);
-        }
-        return sb.toString();
-    }
-
-    static Map<String, String> concatenate(Map<String, String> pre, Map<String, String> post) {
-        Map<String, String> result = new HashMap<String, String>(pre.size() + post.size());
-        result.putAll(pre);
-        result.putAll(post);
-        return result;
-    }
-
-    // Quick utility for building up maps declaratively to minimize the diffs
-    static Map<String, String> mapify(String... values) {
-        Map<String, String> map = new HashMap<String, String>(values.length / 2);
-        for (int i = 0; i < values.length; i += 2) {
-            String key = values[i];
-            if (key == null) {
-                continue;
-            }
-            String value = values[i + 1];
-            map.put(key, value);
-        }
-
-        return map;
-    }
-
-    /**
-     * Produces a display name for an attribute, usually capitalizing the attribute name
-     * and splitting up underscores into new words
-     *
-     * @param name the attribute name to convert
-     * @return a display name for the attribute name
-     */
-    public static String getAttributeDisplayName(String name) {
-        if (name != null && name.length() > 0) {
-            StringBuilder sb = new StringBuilder();
-            boolean capitalizeNext = true;
-            for (int i = 0, n = name.length(); i < n; i++) {
-                char c = name.charAt(i);
-                if (capitalizeNext) {
-                    c = Character.toUpperCase(c);
-                }
-                capitalizeNext = false;
-                if (c == '_') {
-                    c = ' ';
-                    capitalizeNext = true;
-                }
-                sb.append(c);
-            }
-
-            return sb.toString();
-        }
-
-        return name;
-    }
-
-
-    // ==== Paste support ====
-
-    /**
-     * Most views can't accept children so there's nothing to paste on them. In
-     * this case, defer the call to the parent layout and use the target node as
-     * an indication of where to paste.
-     */
-    @Override
-    public void onPaste(@NonNull INode targetNode, @Nullable Object targetView,
-            @NonNull IDragElement[] elements) {
-        //
-        INode parent = targetNode.getParent();
-        if (parent != null) {
-            String parentFqcn = parent.getFqcn();
-            IViewRule parentRule = mRulesEngine.loadRule(parentFqcn);
-
-            if (parentRule instanceof BaseLayoutRule) {
-                ((BaseLayoutRule) parentRule).onPasteBeforeChild(parent, targetView, targetNode,
-                        elements);
-            }
-        }
-    }
-
-    /**
-     * Support class for the context menu code. Stores state about properties in
-     * the context menu.
-     */
-    private static class Prop {
-        private final boolean mToggle;
-        private final boolean mFlag;
-        private final String mTitle;
-        private final Map<String, String> mChoices;
-        private String mDefinedBy;
-
-        public Prop(String title, boolean isToggle, boolean isFlag, Map<String, String> choices,
-                String definedBy) {
-            mTitle = title;
-            mToggle = isToggle;
-            mFlag = isFlag;
-            mChoices = choices;
-            mDefinedBy = definedBy;
-        }
-
-        public String getDefinedBy() {
-            return mDefinedBy;
-        }
-
-        public Prop(String title, boolean isToggle, String definedBy) {
-            this(title, isToggle, false, null, definedBy);
-        }
-
-        private boolean isToggle() {
-            return mToggle;
-        }
-
-        private boolean isFlag() {
-            return mFlag && mChoices != null;
-        }
-
-        private boolean isEnum() {
-            return !mFlag && mChoices != null;
-        }
-
-        private String getTitle() {
-            return mTitle;
-        }
-
-        private Map<String, String> getChoices() {
-            return mChoices;
-        }
-
-        private boolean isStringEdit() {
-            return mChoices == null && !mToggle;
-        }
-    }
-
-    /**
-     * Returns a source attribute value which points to a sample image. This is typically
-     * used to provide an initial image shown on ImageButtons, etc. There is no guarantee
-     * that the source pointed to by this method actually exists.
-     *
-     * @return a source attribute to use for sample images, never null
-     */
-    protected final String getSampleImageSrc() {
-        // Builtin graphics available since v1:
-        return "@android:drawable/btn_star"; //$NON-NLS-1$
-    }
-
-    /**
-     * Strips the {@code @+id} or {@code @id} prefix off of the given id
-     *
-     * @param id attribute to be stripped
-     * @return the id name without the {@code @+id} or {@code @id} prefix
-     */
-    @NonNull
-    public static String stripIdPrefix(@Nullable String id) {
-        if (id == null) {
-            return ""; //$NON-NLS-1$
-        } 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;
-    }
-
-    private static String ensureValidString(String value) {
-        if (value == null) {
-            value = ""; //$NON-NLS-1$
-        }
-        return value;
-    }
- }
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/CalendarViewRule.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/CalendarViewRule.java
deleted file mode 100644
index 91684e2..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/CalendarViewRule.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Copyright (C) 2010 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.layout;
-
-import static com.android.SdkConstants.ANDROID_URI;
-import static com.android.SdkConstants.ATTR_LAYOUT_HEIGHT;
-import static com.android.SdkConstants.ATTR_LAYOUT_WIDTH;
-
-import com.android.annotations.NonNull;
-import com.android.ide.common.api.INode;
-import com.android.ide.common.api.IViewRule;
-import com.android.ide.common.api.InsertType;
-
-/**
- * An {@link IViewRule} for android.widget.CalendarView.
- */
-public class CalendarViewRule extends BaseViewRule {
-
-    @Override
-    public void onCreate(@NonNull INode node, @NonNull INode parent,
-            @NonNull InsertType insertType) {
-        super.onCreate(node, parent, insertType);
-
-        // CalendarViews need a lot of space, and the wrapping doesn't seem to work
-        // well anyway; it reports a much-to-small size than actually accommodates its
-        // content.
-        node.setAttribute(ANDROID_URI, ATTR_LAYOUT_WIDTH, getFillParentValueName());
-        node.setAttribute(ANDROID_URI, ATTR_LAYOUT_HEIGHT, getFillParentValueName());
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/DatePickerRule.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/DatePickerRule.java
deleted file mode 100644
index a635a9a..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/DatePickerRule.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * Copyright (C) 2010 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.layout;
-
-public class DatePickerRule extends IgnoredLayoutRule {
-    // A DatePicker inherits from FrameLayout but is not a general purpose
-    // FrameLayout
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/DialerFilterRule.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/DialerFilterRule.java
deleted file mode 100644
index 606bbd8..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/DialerFilterRule.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- * Copyright (C) 2010 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.layout;
-
-import static com.android.SdkConstants.ANDROID_URI;
-import static com.android.SdkConstants.ATTR_ID;
-import static com.android.SdkConstants.ATTR_LAYOUT_BELOW;
-import static com.android.SdkConstants.ATTR_LAYOUT_WIDTH;
-import static com.android.SdkConstants.ATTR_TEXT;
-import static com.android.SdkConstants.FQCN_EDIT_TEXT;
-
-import com.android.annotations.NonNull;
-import com.android.ide.common.api.INode;
-import com.android.ide.common.api.IViewRule;
-import com.android.ide.common.api.InsertType;
-
-/**
- * An {@link IViewRule} for android.widget.DialerFilterRule.
- */
-public class DialerFilterRule extends BaseViewRule {
-
-    @Override
-    public void onCreate(@NonNull INode node, @NonNull INode parent,
-            @NonNull InsertType insertType) {
-        super.onCreate(node, parent, insertType);
-
-        // A DialerFilter requires a couple of nested EditTexts with fixed ids:
-        if (insertType.isCreate()) {
-            String fillParent = getFillParentValueName();
-            INode hint = node.appendChild(FQCN_EDIT_TEXT);
-            hint.setAttribute(ANDROID_URI, ATTR_TEXT, "Hint");
-            hint.setAttribute(ANDROID_URI, ATTR_ID, "@android:id/hint"); //$NON-NLS-1$
-            hint.setAttribute(ANDROID_URI, ATTR_LAYOUT_WIDTH, fillParent);
-
-            INode primary = node.appendChild(FQCN_EDIT_TEXT);
-            primary.setAttribute(ANDROID_URI, ATTR_TEXT, "Primary");
-            primary.setAttribute(ANDROID_URI, ATTR_ID, "@android:id/primary"); //$NON-NLS-1$
-            primary.setAttribute(ANDROID_URI, ATTR_LAYOUT_BELOW,
-                    "@android:id/hint"); //$NON-NLS-1$
-            primary.setAttribute(ANDROID_URI, ATTR_LAYOUT_WIDTH, fillParent);
-
-
-            // What do we initialize the icon to?
-            //INode icon = node.appendChild("android.widget.ImageView"); //$NON-NLS-1$
-            //icon.setAttribute(ANDROID_URI, ATTR_ID, "@android:id/icon"); //$NON-NLS-1$
-        }
-    }
-
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/EditTextRule.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/EditTextRule.java
deleted file mode 100644
index 03a5bc0..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/EditTextRule.java
+++ /dev/null
@@ -1,139 +0,0 @@
-/*
- * Copyright (C) 2010 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.layout;
-
-import static com.android.SdkConstants.ANDROID_URI;
-import static com.android.SdkConstants.ATTR_EMS;
-import static com.android.SdkConstants.REQUEST_FOCUS;
-
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-import com.android.ide.common.api.IMenuCallback;
-import com.android.ide.common.api.INode;
-import com.android.ide.common.api.INodeHandler;
-import com.android.ide.common.api.IViewRule;
-import com.android.ide.common.api.InsertType;
-import com.android.ide.common.api.RuleAction;
-
-import java.util.List;
-
-/**
- * An {@link IViewRule} for android.widget.EditText.
- */
-public class EditTextRule extends BaseViewRule {
-
-    @Override
-    public void onCreate(@NonNull INode node, @NonNull INode parent,
-            @NonNull InsertType insertType) {
-        super.onCreate(node, parent, insertType);
-
-        if (parent != null) {
-            INode focus = findFocus(findRoot(parent));
-            if (focus == null) {
-                // Add <requestFocus>
-                node.appendChild(REQUEST_FOCUS);
-            }
-
-            if (parent.getBounds().w >= 320) {
-                node.setAttribute(ANDROID_URI, ATTR_EMS, "10"); //$NON-NLS-1$
-            }
-        }
-    }
-
-    /**
-     * {@inheritDoc}
-     * <p>
-     * Adds a "Request Focus" menu item.
-     */
-    @Override
-    public void addContextMenuActions(@NonNull List<RuleAction> actions,
-            final @NonNull INode selectedNode) {
-        super.addContextMenuActions(actions, selectedNode);
-
-        final boolean hasFocus = hasFocus(selectedNode);
-        final String label = hasFocus ? "Clear Focus" : "Request Focus";
-
-        IMenuCallback onChange = new IMenuCallback() {
-            @Override
-            public void action(
-                    @NonNull RuleAction menuAction,
-                    @NonNull List<? extends INode> selectedNodes,
-                    @Nullable String valueId,
-                    @Nullable Boolean newValue) {
-                selectedNode.editXml(label, new INodeHandler() {
-                    @Override
-                    public void handle(@NonNull INode node) {
-                        INode focus = findFocus(findRoot(node));
-                        if (focus != null && focus.getParent() != null) {
-                            focus.getParent().removeChild(focus);
-                        }
-                        if (!hasFocus) {
-                            node.appendChild(REQUEST_FOCUS);
-                        }
-                    }
-                });
-            }
-        };
-
-        actions.add(RuleAction.createAction("_setfocus", label, onChange, //$NON-NLS-1$
-                null, 5, false /*supportsMultipleNodes*/));
-        actions.add(RuleAction.createSeparator(7));
-    }
-
-    /** Returns true if the given node currently has focus */
-    private static boolean hasFocus(INode node) {
-        INode focus = findFocus(node);
-        if (focus != null) {
-            return focus.getParent() == node;
-        }
-
-        return false;
-    }
-
-    /** Returns the root/top level node in the view hierarchy that contains the given node */
-    private static INode findRoot(INode node) {
-        // First find the parent
-        INode root = node;
-        while (root != null) {
-            INode parent = root.getParent();
-            if (parent == null) {
-                break;
-            } else {
-                root = parent;
-            }
-        }
-
-        return root;
-    }
-
-    /** Finds the focus node (not the node containing focus, but the actual request focus node
-     * under a given node */
-    private static INode findFocus(INode node) {
-        if (node.getFqcn().equals(REQUEST_FOCUS)) {
-            return node;
-        }
-
-        for (INode child : node.getChildren()) {
-            INode focus = findFocus(child);
-            if (focus != null) {
-                return focus;
-            }
-        }
-        return null;
-    }
-
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/FragmentRule.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/FragmentRule.java
deleted file mode 100644
index f99cf0c..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/FragmentRule.java
+++ /dev/null
@@ -1,46 +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.layout;
-
-import static com.android.SdkConstants.ANDROID_URI;
-import static com.android.SdkConstants.ATTR_NAME;
-
-import com.android.annotations.NonNull;
-import com.android.ide.common.api.INode;
-import com.android.ide.common.api.IViewRule;
-import com.android.ide.common.api.InsertType;
-
-/**
- * An {@link IViewRule} for the special XML {@code <fragment>} tag.
- */
-public class FragmentRule extends BaseViewRule {
-    @Override
-    public void onCreate(@NonNull INode node, @NonNull INode parent,
-            @NonNull InsertType insertType) {
-        // When dropping a fragment tag, ask the user which class to use.
-        if (insertType == InsertType.CREATE) { // NOT InsertType.CREATE_PREVIEW
-            String fqcn = mRulesEngine.displayFragmentSourceInput();
-            if (fqcn != null) {
-                node.editXml("Add Fragment",
-                    new PropertySettingNodeHandler(ANDROID_URI, ATTR_NAME,
-                            fqcn.length() > 0 ? fqcn : null));
-            } else {
-                // Remove the view; the insertion was canceled
-                parent.removeChild(node);
-            }
-        }
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/FrameLayoutRule.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/FrameLayoutRule.java
deleted file mode 100644
index 0f90962..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/FrameLayoutRule.java
+++ /dev/null
@@ -1,195 +0,0 @@
-/*
- * Copyright (C) 2010 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.layout;
-
-import static com.android.SdkConstants.ANDROID_URI;
-import static com.android.SdkConstants.ATTR_LAYOUT_GRAVITY;
-import static com.android.SdkConstants.ATTR_LAYOUT_HEIGHT;
-import static com.android.SdkConstants.ATTR_LAYOUT_WIDTH;
-
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-import com.android.ide.common.api.DrawingStyle;
-import com.android.ide.common.api.DropFeedback;
-import com.android.ide.common.api.IDragElement;
-import com.android.ide.common.api.IFeedbackPainter;
-import com.android.ide.common.api.IGraphics;
-import com.android.ide.common.api.INode;
-import com.android.ide.common.api.INodeHandler;
-import com.android.ide.common.api.IViewMetadata;
-import com.android.ide.common.api.IViewMetadata.FillPreference;
-import com.android.ide.common.api.IViewRule;
-import com.android.ide.common.api.InsertType;
-import com.android.ide.common.api.Point;
-import com.android.ide.common.api.Rect;
-import com.android.ide.common.api.RuleAction;
-import com.android.utils.Pair;
-
-import java.util.List;
-import java.util.Map;
-
-/**
- * An {@link IViewRule} for android.widget.FrameLayout and all its derived
- * classes.
- */
-public class FrameLayoutRule extends BaseLayoutRule {
-
-    // ==== Drag'n'drop support ====
-    // The FrameLayout accepts any drag'n'drop anywhere on its surface.
-
-    @Override
-    public DropFeedback onDropEnter(@NonNull INode targetNode, @Nullable Object targetView,
-            final @Nullable IDragElement[] elements) {
-        if (elements.length == 0) {
-            return null;
-        }
-
-        return new DropFeedback(null, new IFeedbackPainter() {
-            @Override
-            public void paint(@NonNull IGraphics gc, @NonNull INode node,
-                    @NonNull DropFeedback feedback) {
-                drawFeedback(gc, node, elements, feedback);
-            }
-        });
-    }
-
-    protected void drawFeedback(
-            IGraphics gc,
-            INode targetNode,
-            IDragElement[] elements,
-            DropFeedback feedback) {
-        Rect b = targetNode.getBounds();
-        if (!b.isValid()) {
-            return;
-        }
-
-        gc.useStyle(DrawingStyle.DROP_RECIPIENT);
-        gc.drawRect(b);
-
-        // Get the drop point
-        Point p = (Point) feedback.userData;
-
-        if (p == null) {
-            return;
-        }
-
-        Rect be = elements[0].getBounds();
-
-        gc.useStyle(DrawingStyle.DROP_PREVIEW);
-        if (be.isValid()) {
-            // At least the first element has a bound. Draw rectangles
-            // for all dropped elements with valid bounds, offset at
-            // (0,0)
-            for (IDragElement it : elements) {
-                Rect currBounds = it.getBounds();
-                if (currBounds.isValid()) {
-                    int offsetX = b.x - currBounds.x;
-                    int offsetY = b.y - currBounds.y;
-                    drawElement(gc, it, offsetX, offsetY);
-                }
-            }
-        } else {
-            // We don't have bounds for new elements. In this case
-            // just draw insert lines indicating the top left corner where
-            // the item will be placed
-
-            // +1: Place lines fully within the view (the stroke width is 2) to
-            // make
-            // it even more visually obvious
-            gc.drawLine(b.x + 1, b.y, b.x + 1, b.y + b.h);
-            gc.drawLine(b.x, b.y + 1, b.x + b.w, b.y + 1);
-        }
-    }
-
-    @Override
-    public DropFeedback onDropMove(@NonNull INode targetNode, @NonNull IDragElement[] elements,
-            @Nullable DropFeedback feedback, @NonNull Point p) {
-        feedback.userData = p;
-        feedback.requestPaint = true;
-        return feedback;
-    }
-
-    @Override
-    public void onDropLeave(@NonNull INode targetNode, @NonNull IDragElement[] elements,
-            @Nullable DropFeedback feedback) {
-        // ignore
-    }
-
-    @Override
-    public void onDropped(final @NonNull INode targetNode, final @NonNull IDragElement[] elements,
-            final @Nullable DropFeedback feedback, final @NonNull Point p) {
-        Rect b = targetNode.getBounds();
-        if (!b.isValid()) {
-            return;
-        }
-
-        // Collect IDs from dropped elements and remap them to new IDs
-        // if this is a copy or from a different canvas.
-        final Map<String, Pair<String, String>> idMap = getDropIdMap(targetNode, elements,
-                feedback.isCopy || !feedback.sameCanvas);
-
-        targetNode.editXml("Add elements to FrameLayout", new INodeHandler() {
-
-            @Override
-            public void handle(@NonNull INode node) {
-
-                // Now write the new elements.
-                for (IDragElement element : elements) {
-                    String fqcn = element.getFqcn();
-
-                    INode newChild = targetNode.appendChild(fqcn);
-
-                    // Copy all the attributes, modifying them as needed.
-                    addAttributes(newChild, element, idMap, DEFAULT_ATTR_FILTER);
-
-                    addInnerElements(newChild, element, idMap);
-                }
-            }
-        });
-    }
-
-    @Override
-    public void addLayoutActions(
-            @NonNull List<RuleAction> actions,
-            final @NonNull INode parentNode,
-            final @NonNull List<? extends INode> children) {
-        super.addLayoutActions(actions, parentNode, children);
-        actions.add(RuleAction.createSeparator(25));
-        actions.add(createMarginAction(parentNode, children));
-        if (children != null && children.size() > 0) {
-            actions.add(createGravityAction(children, ATTR_LAYOUT_GRAVITY));
-        }
-    }
-
-    @Override
-    public void onChildInserted(@NonNull INode node, @NonNull INode parent,
-            @NonNull InsertType insertType) {
-        // Look at the fill preferences and fill embedded layouts etc
-        String fqcn = node.getFqcn();
-        IViewMetadata metadata = mRulesEngine.getMetadata(fqcn);
-        if (metadata != null) {
-            FillPreference fill = metadata.getFillPreference();
-            String fillParent = getFillParentValueName();
-            if (fill.fillHorizontally(true)) {
-                node.setAttribute(ANDROID_URI, ATTR_LAYOUT_WIDTH, fillParent);
-            }
-            if (fill.fillVertically(false)) {
-                node.setAttribute(ANDROID_URI, ATTR_LAYOUT_HEIGHT, fillParent);
-            }
-        }
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/GravityHelper.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/GravityHelper.java
deleted file mode 100644
index b9aabad..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/GravityHelper.java
+++ /dev/null
@@ -1,233 +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.layout;
-
-import static com.android.SdkConstants.ANDROID_URI;
-import static com.android.SdkConstants.ATTR_LAYOUT_GRAVITY;
-import static com.android.SdkConstants.GRAVITY_VALUE_BOTTOM;
-import static com.android.SdkConstants.GRAVITY_VALUE_CENTER;
-import static com.android.SdkConstants.GRAVITY_VALUE_CENTER_HORIZONTAL;
-import static com.android.SdkConstants.GRAVITY_VALUE_CENTER_VERTICAL;
-import static com.android.SdkConstants.GRAVITY_VALUE_FILL;
-import static com.android.SdkConstants.GRAVITY_VALUE_FILL_HORIZONTAL;
-import static com.android.SdkConstants.GRAVITY_VALUE_FILL_VERTICAL;
-import static com.android.SdkConstants.GRAVITY_VALUE_LEFT;
-import static com.android.SdkConstants.GRAVITY_VALUE_RIGHT;
-import static com.android.SdkConstants.GRAVITY_VALUE_TOP;
-
-import org.w3c.dom.Element;
-
-/** Helper class for looking up the gravity masks of gravity attributes */
-public class GravityHelper {
-    // From SDK constants; temporary
-    public static final String GRAVITY_VALUE_START = "start";                         //$NON-NLS-1$
-    public static final String GRAVITY_VALUE_END = "end";                             //$NON-NLS-1$
-
-    /** Bitmask for a gravity which includes left */
-    @SuppressWarnings("PointlessBitwiseExpression") // for symmetry with other fields
-    public static final int GRAVITY_LEFT         = 1 << 0;
-
-    /** Bitmask for a gravity which includes right */
-    public static final int GRAVITY_RIGHT        = 1 << 1;
-
-    /** Bitmask for a gravity which includes center horizontal */
-    public static final int GRAVITY_CENTER_HORIZ = 1 << 2;
-
-    /** Bitmask for a gravity which includes fill horizontal */
-    public static final int GRAVITY_FILL_HORIZ   = 1 << 3;
-
-    /** Bitmask for a gravity which includes center vertical */
-    public static final int GRAVITY_CENTER_VERT  = 1 << 4;
-
-    /** Bitmask for a gravity which includes fill vertical */
-    public static final int GRAVITY_FILL_VERT    = 1 << 5;
-
-    /** Bitmask for a gravity which includes top */
-    public static final int GRAVITY_TOP          = 1 << 6;
-
-    /** Bitmask for a gravity which includes bottom */
-    public static final int GRAVITY_BOTTOM       = 1 << 7;
-
-    /** Bitmask for a gravity which includes start */
-    public static final int GRAVITY_START        = 1 << 8;
-
-    /** Bitmask for a gravity which includes end */
-    public static final int GRAVITY_END          = 1 << 9;
-
-    /** Bitmask for a gravity which includes any horizontal constraint */
-    public static final int GRAVITY_HORIZ_MASK = GRAVITY_CENTER_HORIZ | GRAVITY_FILL_HORIZ
-            | GRAVITY_LEFT | GRAVITY_RIGHT | GRAVITY_START | GRAVITY_END;
-
-    /** Bitmask for a gravity which any vertical constraint */
-    public static final int GRAVITY_VERT_MASK = GRAVITY_CENTER_VERT | GRAVITY_FILL_VERT
-            | GRAVITY_TOP | GRAVITY_BOTTOM;
-
-    /**
-     * Returns the gravity of the given element
-     *
-     * @param element the element to look up the gravity for
-     * @return a bit mask corresponding to the selected gravities
-     */
-    public static int getGravity(Element element) {
-        String gravityString = element.getAttributeNS(ANDROID_URI, ATTR_LAYOUT_GRAVITY);
-        return getGravity(gravityString, GRAVITY_LEFT | GRAVITY_TOP);
-    }
-
-    /**
-     * Returns the gravity bitmask for the given gravity string description
-     *
-     * @param gravityString the gravity string description
-     * @param defaultMask the default/initial bitmask to start with
-     * @return a bitmask corresponding to the gravity description
-     */
-    public static int getGravity(String gravityString, int defaultMask) {
-        int gravity = defaultMask;
-        if (gravityString != null && !gravityString.isEmpty()) {
-            String[] anchors = gravityString.split("\\|"); //$NON-NLS-1$
-            for (String anchor : anchors) {
-                if (GRAVITY_VALUE_CENTER.equals(anchor)) {
-                    gravity = GRAVITY_CENTER_HORIZ | GRAVITY_CENTER_VERT;
-                } else if (GRAVITY_VALUE_FILL.equals(anchor)) {
-                    gravity = GRAVITY_FILL_HORIZ | GRAVITY_FILL_VERT;
-                } else if (GRAVITY_VALUE_CENTER_VERTICAL.equals(anchor)) {
-                    gravity = (gravity & GRAVITY_HORIZ_MASK) | GRAVITY_CENTER_VERT;
-                } else if (GRAVITY_VALUE_CENTER_HORIZONTAL.equals(anchor)) {
-                    gravity = (gravity & GRAVITY_VERT_MASK) | GRAVITY_CENTER_HORIZ;
-                } else if (GRAVITY_VALUE_FILL_VERTICAL.equals(anchor)) {
-                    gravity = (gravity & GRAVITY_HORIZ_MASK) | GRAVITY_FILL_VERT;
-                } else if (GRAVITY_VALUE_FILL_HORIZONTAL.equals(anchor)) {
-                    gravity = (gravity & GRAVITY_VERT_MASK) | GRAVITY_FILL_HORIZ;
-                } else if (GRAVITY_VALUE_TOP.equals(anchor)) {
-                    gravity = (gravity & GRAVITY_HORIZ_MASK) | GRAVITY_TOP;
-                } else if (GRAVITY_VALUE_BOTTOM.equals(anchor)) {
-                    gravity = (gravity & GRAVITY_HORIZ_MASK) | GRAVITY_BOTTOM;
-                } else if (GRAVITY_VALUE_LEFT.equals(anchor)) {
-                    gravity = (gravity & (GRAVITY_VERT_MASK|GRAVITY_START)) | GRAVITY_LEFT;
-                } else if (GRAVITY_VALUE_RIGHT.equals(anchor)) {
-                    gravity = (gravity & (GRAVITY_VERT_MASK|GRAVITY_END)) | GRAVITY_RIGHT;
-                } else if (GRAVITY_VALUE_START.equals(anchor)) {
-                    gravity = (gravity & (GRAVITY_VERT_MASK|GRAVITY_LEFT)) | GRAVITY_START;
-                } else if (GRAVITY_VALUE_END.equals(anchor)) {
-                    gravity = (gravity & (GRAVITY_VERT_MASK|GRAVITY_RIGHT)) | GRAVITY_END;
-                } // else: "clip" not supported
-            }
-        }
-
-        return gravity;
-    }
-
-    /**
-     * Returns true if the given gravity bitmask is constrained horizontally
-     *
-     * @param gravity the gravity bitmask
-     * @return true if the given gravity bitmask is constrained horizontally
-     */
-    public static boolean isConstrainedHorizontally(int gravity) {
-        return (gravity & GRAVITY_HORIZ_MASK) != 0;
-    }
-
-    /**
-     * Returns true if the given gravity bitmask is constrained vertically
-     *
-     * @param gravity the gravity bitmask
-     * @return true if the given gravity bitmask is constrained vertically
-     */
-    public static boolean isConstrainedVertically(int gravity) {
-        return (gravity & GRAVITY_VERT_MASK) != 0;
-    }
-
-    /**
-     * Returns true if the given gravity bitmask is left aligned
-     *
-     * @param gravity the gravity bitmask
-     * @return true if the given gravity bitmask is left aligned
-     */
-    public static boolean isLeftAligned(int gravity) {
-        return (gravity & (GRAVITY_LEFT|GRAVITY_START)) != 0;
-    }
-
-    /**
-     * Returns true if the given gravity bitmask is top aligned
-     *
-     * @param gravity the gravity bitmask
-     * @return true if the given gravity bitmask is aligned
-     */
-    public static boolean isTopAligned(int gravity) {
-        return (gravity & GRAVITY_TOP) != 0;
-    }
-
-    /** Returns a gravity value string from the given gravity bitmask
-     *
-     * @param gravity the gravity bitmask
-     * @return the corresponding gravity string suitable as an XML attribute value
-     */
-    public static String getGravity(int gravity) {
-        if (gravity == 0) {
-            return "";
-        }
-
-        if ((gravity & (GRAVITY_CENTER_HORIZ | GRAVITY_CENTER_VERT)) ==
-                (GRAVITY_CENTER_HORIZ | GRAVITY_CENTER_VERT)) {
-            return GRAVITY_VALUE_CENTER;
-        }
-
-        StringBuilder sb = new StringBuilder(30);
-        int horizontal = gravity & GRAVITY_HORIZ_MASK;
-        int vertical = gravity & GRAVITY_VERT_MASK;
-
-        if ((horizontal & (GRAVITY_LEFT|GRAVITY_START)) != 0) {
-            if ((horizontal & GRAVITY_LEFT) != 0) {
-                sb.append(GRAVITY_VALUE_LEFT);
-            }
-            if ((horizontal & GRAVITY_START) != 0) {
-                if (sb.length() > 0) {
-                    sb.append('|');
-                }
-                sb.append(GRAVITY_VALUE_START);
-            }
-        } else if ((horizontal & (GRAVITY_RIGHT|GRAVITY_END)) != 0) {
-            if ((horizontal & GRAVITY_RIGHT) != 0) {
-                sb.append(GRAVITY_VALUE_RIGHT);
-            }
-            if ((horizontal & GRAVITY_END) != 0) {
-                if (sb.length() > 0) {
-                    sb.append('|');
-                }
-                sb.append(GRAVITY_VALUE_END);
-            }
-        } else if ((horizontal & GRAVITY_CENTER_HORIZ) != 0) {
-            sb.append(GRAVITY_VALUE_CENTER_HORIZONTAL);
-        } else if ((horizontal & GRAVITY_FILL_HORIZ) != 0) {
-            sb.append(GRAVITY_VALUE_FILL_HORIZONTAL);
-        }
-
-        if (sb.length() > 0 && vertical != 0) {
-            sb.append('|');
-        }
-
-        if ((vertical & GRAVITY_TOP) != 0) {
-            sb.append(GRAVITY_VALUE_TOP);
-        } else if ((vertical & GRAVITY_BOTTOM) != 0) {
-            sb.append(GRAVITY_VALUE_BOTTOM);
-        } else if ((vertical & GRAVITY_CENTER_VERT) != 0) {
-            sb.append(GRAVITY_VALUE_CENTER_VERTICAL);
-        } else if ((vertical & GRAVITY_FILL_VERT) != 0) {
-            sb.append(GRAVITY_VALUE_FILL_VERTICAL);
-        }
-
-        return sb.toString();
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/GridLayoutRule.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/GridLayoutRule.java
deleted file mode 100644
index 80a23c6..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/GridLayoutRule.java
+++ /dev/null
@@ -1,676 +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.layout;
-
-import static com.android.SdkConstants.ANDROID_URI;
-import static com.android.SdkConstants.ATTR_LAYOUT_COLUMN;
-import static com.android.SdkConstants.ATTR_LAYOUT_GRAVITY;
-import static com.android.SdkConstants.ATTR_LAYOUT_ROW;
-import static com.android.SdkConstants.ATTR_ORIENTATION;
-import static com.android.SdkConstants.FQCN_GRID_LAYOUT;
-import static com.android.SdkConstants.FQCN_SPACE;
-import static com.android.SdkConstants.FQCN_SPACE_V7;
-import static com.android.SdkConstants.GRAVITY_VALUE_FILL;
-import static com.android.SdkConstants.GRAVITY_VALUE_FILL_HORIZONTAL;
-import static com.android.SdkConstants.GRAVITY_VALUE_FILL_VERTICAL;
-import static com.android.SdkConstants.GRAVITY_VALUE_LEFT;
-import static com.android.SdkConstants.GRID_LAYOUT;
-import static com.android.SdkConstants.VALUE_HORIZONTAL;
-import static com.android.SdkConstants.VALUE_TRUE;
-
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-import com.android.ide.common.api.DrawingStyle;
-import com.android.ide.common.api.DropFeedback;
-import com.android.ide.common.api.IDragElement;
-import com.android.ide.common.api.IFeedbackPainter;
-import com.android.ide.common.api.IGraphics;
-import com.android.ide.common.api.IMenuCallback;
-import com.android.ide.common.api.INode;
-import com.android.ide.common.api.INodeHandler;
-import com.android.ide.common.api.IViewMetadata;
-import com.android.ide.common.api.IViewMetadata.FillPreference;
-import com.android.ide.common.api.IViewRule;
-import com.android.ide.common.api.InsertType;
-import com.android.ide.common.api.Point;
-import com.android.ide.common.api.Rect;
-import com.android.ide.common.api.RuleAction;
-import com.android.ide.common.api.RuleAction.Choices;
-import com.android.ide.common.api.SegmentType;
-import com.android.ide.common.layout.grid.GridDropHandler;
-import com.android.ide.common.layout.grid.GridLayoutPainter;
-import com.android.ide.common.layout.grid.GridModel;
-import com.android.ide.common.layout.grid.GridModel.ViewData;
-import com.android.utils.Pair;
-
-import java.net.URL;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
-import java.util.Map;
-
-/**
- * An {@link IViewRule} for android.widget.GridLayout which provides designtime
- * interaction with GridLayouts.
- * <p>
- * TODO:
- * <ul>
- * <li>Handle multi-drag: preserving relative positions and alignments among dragged
- * views.
- * <li>Handle GridLayouts that have been configured in a vertical orientation.
- * <li>Handle free-form editing GridLayouts that have been manually edited rather than
- * built up using free-form editing (e.g. they might not follow the same spacing
- * convention, might use weights etc)
- * <li>Avoid setting row and column numbers on the actual elements if they can be skipped
- * to make the XML leaner.
- * </ul>
- */
-public class GridLayoutRule extends BaseLayoutRule {
-    /**
-     * The size of the visual regular grid that we snap to (if {@link #sSnapToGrid} is set
-     */
-    public static final int GRID_SIZE = 16;
-
-    /** Standard gap between views */
-    public static final int SHORT_GAP_DP = 16;
-
-    /**
-     * The preferred margin size, in pixels
-     */
-    public static final int MARGIN_SIZE = 32;
-
-    /**
-     * Size in screen pixels in the IDE of the gutter shown for new rows and columns (in
-     * grid mode)
-     */
-    private static final int NEW_CELL_WIDTH = 10;
-
-    /**
-     * Maximum size of a widget relative to a cell which is allowed to fit into a cell
-     * (and thereby enlarge it) before it is spread with row or column spans.
-     */
-    public static final double MAX_CELL_DIFFERENCE = 1.2;
-
-    /** Whether debugging diagnostics is available in the toolbar */
-    private static final boolean CAN_DEBUG =
-            VALUE_TRUE.equals(System.getenv("ADT_DEBUG_GRIDLAYOUT")); //$NON-NLS-1$
-
-    private static final String ACTION_ADD_ROW = "_addrow"; //$NON-NLS-1$
-    private static final String ACTION_REMOVE_ROW = "_removerow"; //$NON-NLS-1$
-    private static final String ACTION_ADD_COL = "_addcol"; //$NON-NLS-1$
-    private static final String ACTION_REMOVE_COL = "_removecol"; //$NON-NLS-1$
-    private static final String ACTION_ORIENTATION = "_orientation"; //$NON-NLS-1$
-    private static final String ACTION_SHOW_STRUCTURE = "_structure"; //$NON-NLS-1$
-    private static final String ACTION_GRID_MODE = "_gridmode"; //$NON-NLS-1$
-    private static final String ACTION_SNAP = "_snap"; //$NON-NLS-1$
-    private static final String ACTION_DEBUG = "_debug"; //$NON-NLS-1$
-
-    private static final URL ICON_HORIZONTAL = GridLayoutRule.class.getResource("hlinear.png"); //$NON-NLS-1$
-    private static final URL ICON_VERTICAL = GridLayoutRule.class.getResource("vlinear.png"); //$NON-NLS-1$
-    private static final URL ICON_ADD_ROW = GridLayoutRule.class.getResource("addrow.png"); //$NON-NLS-1$
-    private static final URL ICON_REMOVE_ROW = GridLayoutRule.class.getResource("removerow.png"); //$NON-NLS-1$
-    private static final URL ICON_ADD_COL = GridLayoutRule.class.getResource("addcol.png"); //$NON-NLS-1$
-    private static final URL ICON_REMOVE_COL = GridLayoutRule.class.getResource("removecol.png"); //$NON-NLS-1$
-    private static final URL ICON_SHOW_STRUCT = GridLayoutRule.class.getResource("showgrid.png"); //$NON-NLS-1$
-    private static final URL ICON_GRID_MODE = GridLayoutRule.class.getResource("gridmode.png"); //$NON-NLS-1$
-    private static final URL ICON_SNAP = GridLayoutRule.class.getResource("snap.png"); //$NON-NLS-1$
-
-    /**
-     * Whether the IDE should show diagnostics for debugging the grid layout - including
-     * spacers visibly in the outline, showing row and column numbers, and so on
-     */
-    public static boolean sDebugGridLayout = CAN_DEBUG;
-
-    /** Whether the structure (grid model) should be displayed persistently to the user */
-    public static boolean sShowStructure = false;
-
-    /** Whether the drop positions should snap to a regular grid */
-    public static boolean sSnapToGrid = false;
-
-    /**
-     * Whether the grid is edited in "grid mode" where the operations are row/column based
-     * rather than free-form
-     */
-    public static boolean sGridMode = true;
-
-    /** Constructs a new {@link GridLayoutRule} */
-    public GridLayoutRule() {
-    }
-
-    @Override
-    public void addLayoutActions(
-            @NonNull List<RuleAction> actions,
-            final @NonNull INode parentNode,
-            final @NonNull List<? extends INode> children) {
-        super.addLayoutActions(actions, parentNode, children);
-
-        String namespace = getNamespace(parentNode);
-        Choices orientationAction = RuleAction.createChoices(
-                ACTION_ORIENTATION,
-                "Orientation", //$NON-NLS-1$
-                new PropertyCallback(Collections.singletonList(parentNode),
-                        "Change LinearLayout Orientation", namespace, ATTR_ORIENTATION), Arrays
-                        .<String> asList("Set Horizontal Orientation", "Set Vertical Orientation"),
-                Arrays.<URL> asList(ICON_HORIZONTAL, ICON_VERTICAL), Arrays.<String> asList(
-                        "horizontal", "vertical"), getCurrentOrientation(parentNode),
-                null /* icon */, -10, false);
-        orientationAction.setRadio(true);
-        actions.add(orientationAction);
-
-        // Gravity and margins
-        if (children != null && children.size() > 0) {
-            actions.add(RuleAction.createSeparator(35));
-            actions.add(createMarginAction(parentNode, children));
-            actions.add(createGravityAction(children, ATTR_LAYOUT_GRAVITY));
-        }
-
-        IMenuCallback actionCallback = new IMenuCallback() {
-            @Override
-            public void action(
-                    final @NonNull RuleAction action,
-                    @NonNull List<? extends INode> selectedNodes,
-                    final @Nullable String valueId,
-                    final @Nullable Boolean newValue) {
-                parentNode.editXml("Add/Remove Row/Column", new INodeHandler() {
-                    @Override
-                    public void handle(@NonNull INode n) {
-                        String id = action.getId();
-                        if (id.equals(ACTION_SHOW_STRUCTURE)) {
-                            sShowStructure = !sShowStructure;
-                            mRulesEngine.redraw();
-                            return;
-                        } else if (id.equals(ACTION_GRID_MODE)) {
-                            sGridMode = !sGridMode;
-                            mRulesEngine.redraw();
-                            return;
-                        } else if (id.equals(ACTION_SNAP)) {
-                            sSnapToGrid = !sSnapToGrid;
-                            mRulesEngine.redraw();
-                            return;
-                        } else if (id.equals(ACTION_DEBUG)) {
-                            sDebugGridLayout = !sDebugGridLayout;
-                            mRulesEngine.layout();
-                            return;
-                        }
-
-                        GridModel grid = GridModel.get(mRulesEngine, parentNode, null);
-                        if (id.equals(ACTION_ADD_ROW)) {
-                            grid.addRow(children);
-                        } else if (id.equals(ACTION_REMOVE_ROW)) {
-                            grid.removeRows(children);
-                        } else if (id.equals(ACTION_ADD_COL)) {
-                            grid.addColumn(children);
-                        } else if (id.equals(ACTION_REMOVE_COL)) {
-                            grid.removeColumns(children);
-                        }
-                    }
-
-                });
-            }
-        };
-
-        actions.add(RuleAction.createSeparator(142));
-
-        actions.add(RuleAction.createToggle(ACTION_GRID_MODE, "Grid Model Mode",
-                sGridMode, actionCallback, ICON_GRID_MODE, 145, false));
-
-        // Add and Remove Column actions only apply in Grid Mode
-        if (sGridMode) {
-            actions.add(RuleAction.createToggle(ACTION_SHOW_STRUCTURE, "Show Structure",
-                    sShowStructure, actionCallback, ICON_SHOW_STRUCT, 147, false));
-
-            // Add Row and Add Column
-            actions.add(RuleAction.createSeparator(150));
-            actions.add(RuleAction.createAction(ACTION_ADD_COL, "Add Column", actionCallback,
-                    ICON_ADD_COL, 160, false /* supportsMultipleNodes */));
-            actions.add(RuleAction.createAction(ACTION_ADD_ROW, "Add Row", actionCallback,
-                    ICON_ADD_ROW, 165, false));
-
-            // Remove Row and Remove Column (if something is selected)
-            if (children != null && children.size() > 0) {
-                // TODO: Add "Merge Columns" and "Merge Rows" ?
-
-                actions.add(RuleAction.createAction(ACTION_REMOVE_COL, "Remove Column",
-                        actionCallback, ICON_REMOVE_COL, 170, false));
-                actions.add(RuleAction.createAction(ACTION_REMOVE_ROW, "Remove Row",
-                        actionCallback, ICON_REMOVE_ROW, 175, false));
-            }
-
-            actions.add(RuleAction.createSeparator(185));
-        } else {
-            actions.add(RuleAction.createToggle(ACTION_SHOW_STRUCTURE, "Show Structure",
-                    sShowStructure, actionCallback, ICON_SHOW_STRUCT, 190, false));
-
-            // Snap to Grid and Show Structure are only relevant in free form mode
-            actions.add(RuleAction.createToggle(ACTION_SNAP, "Snap to Grid",
-                    sSnapToGrid, actionCallback, ICON_SNAP, 200, false));
-        }
-
-        // Temporary: Diagnostics for GridLayout
-        if (CAN_DEBUG) {
-            actions.add(RuleAction.createToggle(ACTION_DEBUG, "Debug",
-                    sDebugGridLayout, actionCallback, null, 210, false));
-        }
-    }
-
-    /**
-     * Returns the orientation attribute value currently used by the node (even if not
-     * defined, in which case the default horizontal value is returned)
-     */
-    private String getCurrentOrientation(final INode node) {
-        String orientation = node.getStringAttr(getNamespace(node), ATTR_ORIENTATION);
-        if (orientation == null || orientation.length() == 0) {
-            orientation = VALUE_HORIZONTAL;
-        }
-        return orientation;
-    }
-
-    @Override
-    public DropFeedback onDropEnter(@NonNull INode targetNode, @Nullable Object targetView,
-            @Nullable IDragElement[] elements) {
-        GridDropHandler userData = new GridDropHandler(this, targetNode, targetView);
-        IFeedbackPainter painter = GridLayoutPainter.createDropFeedbackPainter(this, elements);
-        return new DropFeedback(userData, painter);
-    }
-
-    @Override
-    public DropFeedback onDropMove(@NonNull INode targetNode, @NonNull IDragElement[] elements,
-            @Nullable DropFeedback feedback, @NonNull Point p) {
-        if (feedback == null) {
-            return null;
-        }
-        feedback.requestPaint = true;
-
-        GridDropHandler handler = (GridDropHandler) feedback.userData;
-        handler.computeMatches(feedback, p);
-
-        return feedback;
-    }
-
-    @Override
-    public void onDropped(final @NonNull INode targetNode, final @NonNull IDragElement[] elements,
-            @Nullable DropFeedback feedback, @NonNull Point p) {
-        if (feedback == null) {
-            return;
-        }
-
-        Rect b = targetNode.getBounds();
-        if (!b.isValid()) {
-            return;
-        }
-
-        GridDropHandler dropHandler = (GridDropHandler) feedback.userData;
-        if (dropHandler.getRowMatch() == null || dropHandler.getColumnMatch() == null) {
-            return;
-        }
-
-        // Collect IDs from dropped elements and remap them to new IDs
-        // if this is a copy or from a different canvas.
-        Map<String, Pair<String, String>> idMap = getDropIdMap(targetNode, elements,
-                feedback.isCopy || !feedback.sameCanvas);
-
-        for (IDragElement element : elements) {
-            INode newChild;
-            if (!sGridMode) {
-                newChild = dropHandler.handleFreeFormDrop(targetNode, element);
-            } else {
-                newChild = dropHandler.handleGridModeDrop(targetNode, element);
-            }
-
-            // Copy all the attributes, modifying them as needed.
-            addAttributes(newChild, element, idMap, DEFAULT_ATTR_FILTER);
-
-            addInnerElements(newChild, element, idMap);
-        }
-    }
-
-    @Override
-    public void onChildInserted(@NonNull INode node, @NonNull INode parent,
-            @NonNull InsertType insertType) {
-        if (insertType == InsertType.MOVE_WITHIN) {
-            // Don't adjust widths/heights/weights when just moving within a single layout
-            return;
-        }
-
-        if (GridModel.isSpace(node.getFqcn())) {
-            return;
-        }
-
-        // Attempt to set "fill" properties on newly added views such that for example
-        // a text field will stretch horizontally.
-        String fqcn = node.getFqcn();
-        IViewMetadata metadata = mRulesEngine.getMetadata(fqcn);
-        FillPreference fill = metadata.getFillPreference();
-        String gravity = computeDefaultGravity(fill);
-        if (gravity != null) {
-            node.setAttribute(getNamespace(parent), ATTR_LAYOUT_GRAVITY, gravity);
-        }
-    }
-
-    /**
-     * Returns the namespace URI to use for GridLayout-specific attributes, such
-     * as columnCount, layout_column, layout_column_span, layout_gravity etc.
-     *
-     * @param layout the GridLayout instance to look up the namespace for
-     * @return the namespace, never null
-     */
-    public String getNamespace(INode layout) {
-        String namespace = ANDROID_URI;
-
-        String fqcn = layout.getFqcn();
-        if (!fqcn.equals(GRID_LAYOUT) && !fqcn.equals(FQCN_GRID_LAYOUT)) {
-            namespace = mRulesEngine.getAppNameSpace();
-        }
-
-        return namespace;
-    }
-
-    /**
-     * Computes the default gravity to be used for a widget of the given fill
-     * preference when added to a grid layout
-     *
-     * @param fill the fill preference for the widget
-     * @return the gravity value, or null, to be set on the widget
-     */
-    public static String computeDefaultGravity(FillPreference fill) {
-        String horizontal = GRAVITY_VALUE_LEFT;
-        String vertical = null;
-        if (fill.fillHorizontally(true /*verticalContext*/)) {
-            horizontal = GRAVITY_VALUE_FILL_HORIZONTAL;
-        }
-        if (fill.fillVertically(true /*verticalContext*/)) {
-            vertical = GRAVITY_VALUE_FILL_VERTICAL;
-        }
-        String gravity;
-        if (horizontal == GRAVITY_VALUE_FILL_HORIZONTAL
-                && vertical == GRAVITY_VALUE_FILL_VERTICAL) {
-            gravity = GRAVITY_VALUE_FILL;
-        } else if (vertical != null) {
-            gravity = horizontal + '|' + vertical;
-        } else {
-            gravity = horizontal;
-        }
-
-        return gravity;
-    }
-
-    @Override
-    public void onRemovingChildren(@NonNull List<INode> deleted, @NonNull INode parent,
-            boolean moved) {
-        super.onRemovingChildren(deleted, parent, moved);
-
-        if (!sGridMode) {
-            // Attempt to clean up spacer objects for any newly-empty rows or columns
-            // as the result of this deletion
-            GridModel grid = GridModel.get(mRulesEngine, parent, null);
-            grid.onDeleted(deleted);
-        }
-    }
-
-    @Override
-    protected void paintResizeFeedback(IGraphics gc, INode node, ResizeState state) {
-        if (!sGridMode) {
-            GridModel grid = getGrid(state);
-            GridLayoutPainter.paintResizeFeedback(gc, state.layout, grid);
-        }
-
-        if (resizingWidget(state)) {
-            super.paintResizeFeedback(gc, node, state);
-        } else {
-            GridModel grid = getGrid(state);
-            int startColumn = grid.getColumn(state.bounds.x);
-            int endColumn = grid.getColumn(state.bounds.x2());
-            int columnSpan = endColumn - startColumn + 1;
-
-            int startRow = grid.getRow(state.bounds.y);
-            int endRow = grid.getRow(state.bounds.y2());
-            int rowSpan = endRow - startRow + 1;
-
-            Rect cellBounds = grid.getCellBounds(startRow, startColumn, rowSpan, columnSpan);
-            gc.useStyle(DrawingStyle.RESIZE_PREVIEW);
-            gc.drawRect(cellBounds);
-        }
-    }
-
-    /** Returns the grid size cached on the given {@link ResizeState} object */
-    private GridModel getGrid(ResizeState resizeState) {
-        GridModel grid = (GridModel) resizeState.clientData;
-        if (grid == null) {
-            grid = GridModel.get(mRulesEngine, resizeState.layout, resizeState.layoutView);
-            resizeState.clientData = grid;
-        }
-
-        return grid;
-    }
-
-    @Override
-    protected void setNewSizeBounds(ResizeState state, INode node, INode layout,
-            Rect oldBounds, Rect newBounds, SegmentType horizontalEdge, SegmentType verticalEdge) {
-
-        if (resizingWidget(state)) {
-            if (state.fillWidth || state.fillHeight || state.wrapWidth || state.wrapHeight) {
-                GridModel grid = getGrid(state);
-                ViewData view = grid.getView(node);
-                if (view != null) {
-                    String gravityString = grid.getGridAttribute(view.node, ATTR_LAYOUT_GRAVITY);
-                    int gravity = GravityHelper.getGravity(gravityString, 0);
-                    if (view.column > 0 && verticalEdge != null && state.fillWidth) {
-                        state.fillWidth = false;
-                        state.wrapWidth = true;
-                        gravity &= ~GravityHelper.GRAVITY_HORIZ_MASK;
-                        gravity |= GravityHelper.GRAVITY_FILL_HORIZ;
-                    } else if (verticalEdge != null && state.wrapWidth) {
-                        gravity &= ~GravityHelper.GRAVITY_HORIZ_MASK;
-                        gravity |= GravityHelper.GRAVITY_LEFT;
-                    }
-                    if (view.row > 0 && horizontalEdge != null && state.fillHeight) {
-                        state.fillHeight = false;
-                        state.wrapHeight = true;
-                        gravity &= ~GravityHelper.GRAVITY_VERT_MASK;
-                        gravity |= GravityHelper.GRAVITY_FILL_VERT;
-                    } else if (horizontalEdge != null && state.wrapHeight) {
-                        gravity &= ~GravityHelper.GRAVITY_VERT_MASK;
-                        gravity |= GravityHelper.GRAVITY_TOP;
-                    }
-                    gravityString = GravityHelper.getGravity(gravity);
-                    grid.setGridAttribute(view.node, ATTR_LAYOUT_GRAVITY, gravityString);
-                    // Fall through and set layout_width and/or layout_height to wrap_content
-                }
-            }
-            super.setNewSizeBounds(state, node, layout, oldBounds, newBounds, horizontalEdge,
-                    verticalEdge);
-        } else {
-            Pair<Integer, Integer> spans = computeResizeSpans(state);
-            int rowSpan = spans.getFirst();
-            int columnSpan = spans.getSecond();
-            GridModel grid = getGrid(state);
-            grid.setColumnSpanAttribute(node, columnSpan);
-            grid.setRowSpanAttribute(node, rowSpan);
-
-            ViewData view = grid.getView(node);
-            if (view != null) {
-                String gravityString = grid.getGridAttribute(view.node, ATTR_LAYOUT_GRAVITY);
-                int gravity = GravityHelper.getGravity(gravityString, 0);
-                if (verticalEdge != null && columnSpan > 1) {
-                    gravity &= ~GravityHelper.GRAVITY_HORIZ_MASK;
-                    gravity |= GravityHelper.GRAVITY_FILL_HORIZ;
-                }
-                if (horizontalEdge != null && rowSpan > 1) {
-                    gravity &= ~GravityHelper.GRAVITY_VERT_MASK;
-                    gravity |= GravityHelper.GRAVITY_FILL_VERT;
-                }
-                gravityString = GravityHelper.getGravity(gravity);
-                grid.setGridAttribute(view.node, ATTR_LAYOUT_GRAVITY, gravityString);
-            }
-        }
-    }
-
-    @Override
-    protected String getResizeUpdateMessage(ResizeState state, INode child, INode parent,
-            Rect newBounds, SegmentType horizontalEdge, SegmentType verticalEdge) {
-        Pair<Integer, Integer> spans = computeResizeSpans(state);
-        if (resizingWidget(state)) {
-            String width = state.getWidthAttribute();
-            String height = state.getHeightAttribute();
-
-            String message;
-            if (horizontalEdge == null) {
-                message = width;
-            } else if (verticalEdge == null) {
-                message = height;
-            } else {
-                // U+00D7: Unicode for multiplication sign
-                message = String.format("%s \u00D7 %s", width, height);
-            }
-
-            // Tack on a tip about using the Shift modifier key
-            return String.format("%s\n(Press Shift to resize row/column spans)", message);
-        } else {
-            int rowSpan = spans.getFirst();
-            int columnSpan = spans.getSecond();
-            return String.format("ColumnSpan=%d, RowSpan=%d\n(Release Shift to resize widget itself)",
-                    columnSpan, rowSpan);
-        }
-    }
-
-    /**
-     * Returns true if we're resizing the widget, and false if we're resizing the cell
-     * spans
-     */
-    private static boolean resizingWidget(ResizeState state) {
-        return (state.modifierMask & DropFeedback.MODIFIER2) == 0;
-    }
-
-    /**
-     * Computes the new column and row spans as the result of the current resizing
-     * operation
-     */
-    private Pair<Integer, Integer> computeResizeSpans(ResizeState state) {
-        GridModel grid = getGrid(state);
-
-        int startColumn = grid.getColumn(state.bounds.x);
-        int endColumn = grid.getColumn(state.bounds.x2());
-        int columnSpan = endColumn - startColumn + 1;
-
-        int startRow = grid.getRow(state.bounds.y);
-        int endRow = grid.getRow(state.bounds.y2());
-        int rowSpan = endRow - startRow + 1;
-
-        return Pair.of(rowSpan, columnSpan);
-    }
-
-    /**
-     * Returns the size of the new cell gutter in layout coordinates
-     *
-     * @return the size of the new cell gutter in layout coordinates
-     */
-    public int getNewCellSize() {
-        return mRulesEngine.screenToLayout(NEW_CELL_WIDTH / 2);
-    }
-
-    @Override
-    public void paintSelectionFeedback(@NonNull IGraphics graphics, @NonNull INode parentNode,
-            @NonNull List<? extends INode> childNodes, @Nullable Object view) {
-        super.paintSelectionFeedback(graphics, parentNode, childNodes, view);
-
-        if (sShowStructure) {
-            // TODO: Cache the grid
-            if (view != null) {
-                if (GridLayoutPainter.paintStructure(view, DrawingStyle.GUIDELINE_DASHED,
-                        parentNode, graphics)) {
-                    return;
-                }
-            }
-            GridLayoutPainter.paintStructure(DrawingStyle.GUIDELINE_DASHED,
-                        parentNode, graphics, GridModel.get(mRulesEngine, parentNode, view));
-        } else if (sDebugGridLayout) {
-            GridLayoutPainter.paintStructure(DrawingStyle.GRID,
-                    parentNode, graphics, GridModel.get(mRulesEngine, parentNode, view));
-        }
-
-        // TBD: Highlight the cells around the selection, and display easy controls
-        // for for example tweaking the rowspan/colspan of a cell? (but only in grid mode)
-    }
-
-    /**
-     * Paste into a GridLayout. We have several possible behaviors (and many
-     * more than are listed here):
-     * <ol>
-     * <li> Preserve the current positions of the elements (if pasted from another
-     *      canvas, not just XML markup copied from say a web site) and apply those
-     *      into the current grid. This might mean "overwriting" (sitting on top of)
-     *      existing elements.
-     * <li> Fill available "holes" in the grid.
-     * <li> Lay them out consecutively, row by row, like text.
-     * <li> Some hybrid approach, where I attempt to preserve the <b>relative</b>
-     *      relationships (columns/wrapping, spacing between the pasted views etc)
-     *      but I append them to the bottom of the layout on one or more new rows.
-     * <li> Try to paste at the current mouse position, if known, preserving the
-     *      relative distances between the existing elements there.
-     * </ol>
-     * Attempting to preserve the current position isn't possible right now,
-     * because the clipboard data contains only the textual representation of
-     * the markup. (We'd need to stash position information from a previous
-     * layout render along with the clipboard data).
-     * <p>
-     * Currently, this implementation simply lays out the elements row by row,
-     * approach #3 above.
-     */
-    @Override
-    public void onPaste(
-            @NonNull INode targetNode,
-            @Nullable Object targetView,
-            @NonNull IDragElement[] elements) {
-        DropFeedback feedback = onDropEnter(targetNode, targetView, elements);
-        if (feedback != null) {
-            Rect b = targetNode.getBounds();
-            if (!b.isValid()) {
-                return;
-            }
-
-            Map<String, Pair<String, String>> idMap = getDropIdMap(targetNode, elements,
-                    true /* remap id's */);
-
-            for (IDragElement element : elements) {
-                // Skip <Space> elements and only insert the real elements being
-                // copied
-                if (elements.length > 1 && (FQCN_SPACE.equals(element.getFqcn())
-                        || FQCN_SPACE_V7.equals(element.getFqcn()))) {
-                    continue;
-                }
-
-                String fqcn = element.getFqcn();
-                INode newChild = targetNode.appendChild(fqcn);
-                addAttributes(newChild, element, idMap, DEFAULT_ATTR_FILTER);
-
-                // Ensure that we reset any potential row/column attributes from a different
-                // grid layout being copied from
-                GridDropHandler handler = (GridDropHandler) feedback.userData;
-                GridModel grid = handler.getGrid();
-                grid.setGridAttribute(newChild, ATTR_LAYOUT_COLUMN, null);
-                grid.setGridAttribute(newChild, ATTR_LAYOUT_ROW, null);
-
-                // TODO: Set columnSpans to avoid making these widgets completely
-                // break the layout
-                // Alternatively, I could just lay them all out on subsequent lines
-                // with a column span of columnSpan5
-
-                addInnerElements(newChild, element, idMap);
-            }
-        }
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/GridViewRule.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/GridViewRule.java
deleted file mode 100644
index b82f391..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/GridViewRule.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Copyright (C) 2010 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.layout;
-
-import static com.android.SdkConstants.ANDROID_URI;
-import static com.android.SdkConstants.ATTR_LAYOUT_WIDTH;
-import static com.android.SdkConstants.ATTR_NUM_COLUMNS;
-
-import com.android.annotations.NonNull;
-import com.android.ide.common.api.INode;
-import com.android.ide.common.api.IViewRule;
-import com.android.ide.common.api.InsertType;
-
-/**
- * An {@link IViewRule} for android.widget.GridView
- */
-public class GridViewRule extends BaseViewRule {
-
-    @Override
-    public void onCreate(@NonNull INode node, @NonNull INode parent,
-            @NonNull InsertType insertType) {
-        super.onCreate(node, parent, insertType);
-
-        node.setAttribute(ANDROID_URI, ATTR_LAYOUT_WIDTH, getFillParentValueName());
-        node.setAttribute(ANDROID_URI, ATTR_NUM_COLUMNS, "3"); //$NON-NLS-1$
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/HorizontalScrollViewRule.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/HorizontalScrollViewRule.java
deleted file mode 100644
index 7229490..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/HorizontalScrollViewRule.java
+++ /dev/null
@@ -1,96 +0,0 @@
-/*
- * Copyright (C) 2010 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.layout;
-
-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_ORIENTATION;
-import static com.android.SdkConstants.FQCN_LINEAR_LAYOUT;
-import static com.android.SdkConstants.VALUE_HORIZONTAL;
-
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-import com.android.ide.common.api.DrawingStyle;
-import com.android.ide.common.api.DropFeedback;
-import com.android.ide.common.api.IDragElement;
-import com.android.ide.common.api.IGraphics;
-import com.android.ide.common.api.INode;
-import com.android.ide.common.api.IViewRule;
-import com.android.ide.common.api.InsertType;
-import com.android.ide.common.api.Point;
-import com.android.ide.common.api.Rect;
-
-/**
- * An {@link IViewRule} for android.widget.HorizontalScrollView.
- */
-public class HorizontalScrollViewRule extends FrameLayoutRule {
-
-    @Override
-    public void onChildInserted(@NonNull INode child, @NonNull INode parent,
-            @NonNull InsertType insertType) {
-        super.onChildInserted(child, parent, insertType);
-
-        // The child of the ScrollView should fill in both directions
-        String fillParent = getFillParentValueName();
-        child.setAttribute(ANDROID_URI, ATTR_LAYOUT_WIDTH, fillParent);
-        child.setAttribute(ANDROID_URI, ATTR_LAYOUT_HEIGHT, fillParent);
-    }
-
-    @Override
-    public void onCreate(@NonNull INode node, @NonNull INode parent,
-            @NonNull InsertType insertType) {
-        super.onCreate(node, parent, insertType);
-
-        if (insertType.isCreate()) {
-            // Insert a horizontal linear layout which is commonly used with horizontal scrollbars
-            // as described by the documentation for HorizontalScrollbars.
-            INode linearLayout = node.appendChild(FQCN_LINEAR_LAYOUT);
-            linearLayout.setAttribute(ANDROID_URI, ATTR_ORIENTATION,
-                    VALUE_HORIZONTAL);
-        }
-    }
-
-    @Override
-    public DropFeedback onDropMove(@NonNull INode targetNode, @NonNull IDragElement[] elements,
-            @Nullable DropFeedback feedback, @NonNull Point p) {
-        DropFeedback f = super.onDropMove(targetNode, elements, feedback, p);
-
-        // HorizontalScrollViews only allow a single child
-        if (targetNode.getChildren().length > 0) {
-            f.invalidTarget = true;
-        }
-        return f;
-    }
-
-    @Override
-    protected void drawFeedback(
-            IGraphics gc,
-            INode targetNode,
-            IDragElement[] elements,
-            DropFeedback feedback) {
-        if (targetNode.getChildren().length > 0) {
-            Rect b = targetNode.getBounds();
-            if (b.isValid()) {
-                gc.useStyle(DrawingStyle.DROP_RECIPIENT);
-                gc.drawRect(b);
-            }
-        } else {
-            super.drawFeedback(gc, targetNode, elements, feedback);
-        }
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/IgnoredLayoutRule.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/IgnoredLayoutRule.java
deleted file mode 100644
index 3a65a86..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/IgnoredLayoutRule.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Copyright (C) 2010 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.layout;
-
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-import com.android.ide.common.api.DropFeedback;
-import com.android.ide.common.api.IDragElement;
-import com.android.ide.common.api.INode;
-
-/**
- * An ignored layout is a layout that should not be treated as a layout by the
- * visual editor (usually because the widget extends a layout class we recognize
- * and support, but where the widget is more restrictive in how it manages its
- * children so we don't want to expose the normal configuration options).
- * <p>
- * For example, the ZoomControls widget is not user-configurable as a
- * LinearLayout even though it extends it. Our ZoomControls rule is therefore a
- * subclass of this {@link IgnoredLayoutRule} class.
- */
-public abstract class IgnoredLayoutRule extends BaseLayoutRule {
-    @Override
-    public DropFeedback onDropEnter(@NonNull INode targetNode, @Nullable Object targetView,
-            @Nullable IDragElement[] elements) {
-        // Do nothing; this layout rule corresponds to a layout that
-        // should not be handled as a layout by the visual editor - usually
-        // because some widget is extending a layout for implementation purposes
-        // but does not want to expose configurability of the base layout in the
-        // editor.
-        return null;
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/ImageButtonRule.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/ImageButtonRule.java
deleted file mode 100644
index 9907950..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/ImageButtonRule.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Copyright (C) 2010 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.layout;
-
-import static com.android.SdkConstants.ANDROID_URI;
-import static com.android.SdkConstants.ATTR_SRC;
-
-import com.android.annotations.NonNull;
-import com.android.ide.common.api.INode;
-import com.android.ide.common.api.IViewRule;
-import com.android.ide.common.api.InsertType;
-
-/**
- * An {@link IViewRule} for android.widget.ImageButton.
- */
-public class ImageButtonRule extends BaseViewRule {
-
-    @Override
-    public void onCreate(@NonNull INode node, @NonNull INode parent,
-            @NonNull InsertType insertType) {
-        super.onCreate(node, parent, insertType);
-
-        // When dropping an include tag, ask the user which layout to include.
-        if (insertType == InsertType.CREATE) { // NOT InsertType.CREATE_PREVIEW
-            String src = mRulesEngine.displayResourceInput("drawable", ""); //$NON-NLS-1$ //$NON-NLS-2$
-            if (src != null) {
-                node.editXml("Set Image",
-                    new PropertySettingNodeHandler(ANDROID_URI, ATTR_SRC,
-                            src.length() > 0 ? src : null));
-                return;
-            }
-        }
-
-        // Fallback if dismissed or during previews etc
-        if (insertType.isCreate()) {
-            node.setAttribute(ANDROID_URI, ATTR_SRC, getSampleImageSrc());
-        }
-    }
-
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/ImageViewRule.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/ImageViewRule.java
deleted file mode 100644
index bc0184c..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/ImageViewRule.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * Copyright (C) 2010 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.layout;
-
-import static com.android.SdkConstants.ANDROID_URI;
-import static com.android.SdkConstants.ATTR_SRC;
-
-import com.android.annotations.NonNull;
-import com.android.ide.common.api.INode;
-import com.android.ide.common.api.IViewRule;
-import com.android.ide.common.api.InsertType;
-
-/**
- * An {@link IViewRule} for android.widget.ImageViewRule.
- */
-public class ImageViewRule extends BaseViewRule {
-
-    @Override
-    public void onCreate(@NonNull INode node, @NonNull INode parent,
-            @NonNull InsertType insertType) {
-        super.onCreate(node, parent, insertType);
-
-        // When dropping an include tag, ask the user which layout to include.
-        if (insertType == InsertType.CREATE) { // NOT InsertType.CREATE_PREVIEW
-            String src = mRulesEngine.displayResourceInput("drawable", ""); //$NON-NLS-1$ //$NON-NLS-2$
-            if (src != null) {
-                node.editXml("Set Image",
-                    new PropertySettingNodeHandler(ANDROID_URI, ATTR_SRC,
-                            src.length() > 0 ? src : null));
-                return;
-            } else {
-                // Remove the view; the insertion was canceled
-                parent.removeChild(node);
-            }
-        }
-
-        // Fallback if dismissed or during previews etc
-        if (insertType.isCreate()) {
-            node.setAttribute(ANDROID_URI, ATTR_SRC, getSampleImageSrc());
-        }
-    }
-
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/IncludeRule.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/IncludeRule.java
deleted file mode 100644
index fcb1a6d..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/IncludeRule.java
+++ /dev/null
@@ -1,46 +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.layout;
-
-import static com.android.SdkConstants.ATTR_LAYOUT;
-
-import com.android.annotations.NonNull;
-import com.android.ide.common.api.INode;
-import com.android.ide.common.api.IViewRule;
-import com.android.ide.common.api.InsertType;
-
-/**
- * An {@link IViewRule} for the special XML {@code <include>} tag.
- */
-public class IncludeRule extends BaseViewRule {
-    @Override
-    public void onCreate(@NonNull INode node, @NonNull INode parent,
-            @NonNull InsertType insertType) {
-        // When dropping an include tag, ask the user which layout to include.
-        if (insertType == InsertType.CREATE) { // NOT InsertType.CREATE_PREVIEW
-            String include = mRulesEngine.displayIncludeSourceInput();
-            if (include != null) {
-                node.editXml("Include Layout",
-                    // Note -- the layout attribute is NOT in the Android namespace!
-                    new PropertySettingNodeHandler(null, ATTR_LAYOUT,
-                            include.length() > 0 ? include : null));
-            } else {
-                // Remove the view; the insertion was canceled
-                parent.removeChild(node);
-            }
-        }
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/LinearLayoutRule.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/LinearLayoutRule.java
deleted file mode 100644
index 610fe5d..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/LinearLayoutRule.java
+++ /dev/null
@@ -1,1092 +0,0 @@
-/*
- * Copyright (C) 2010 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.layout;
-
-import static com.android.SdkConstants.ANDROID_URI;
-import static com.android.SdkConstants.ATTR_BASELINE_ALIGNED;
-import static com.android.SdkConstants.ATTR_LAYOUT_GRAVITY;
-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_WEIGHT_SUM;
-import static com.android.SdkConstants.VALUE_1;
-import static com.android.SdkConstants.VALUE_HORIZONTAL;
-import static com.android.SdkConstants.VALUE_VERTICAL;
-import static com.android.SdkConstants.VALUE_WRAP_CONTENT;
-import static com.android.SdkConstants.VALUE_ZERO_DP;
-import static com.android.ide.eclipse.adt.AdtUtils.formatFloatAttribute;
-
-import com.android.SdkConstants;
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-import com.android.ide.common.api.DrawingStyle;
-import com.android.ide.common.api.DropFeedback;
-import com.android.ide.common.api.IClientRulesEngine;
-import com.android.ide.common.api.IDragElement;
-import com.android.ide.common.api.IFeedbackPainter;
-import com.android.ide.common.api.IGraphics;
-import com.android.ide.common.api.IMenuCallback;
-import com.android.ide.common.api.INode;
-import com.android.ide.common.api.INodeHandler;
-import com.android.ide.common.api.IViewMetadata;
-import com.android.ide.common.api.IViewMetadata.FillPreference;
-import com.android.ide.common.api.IViewRule;
-import com.android.ide.common.api.InsertType;
-import com.android.ide.common.api.Point;
-import com.android.ide.common.api.Rect;
-import com.android.ide.common.api.RuleAction;
-import com.android.ide.common.api.RuleAction.Choices;
-import com.android.ide.common.api.SegmentType;
-import com.android.ide.eclipse.adt.AdtPlugin;
-
-import java.net.URL;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
-import java.util.Map;
-
-/**
- * An {@link IViewRule} for android.widget.LinearLayout and all its derived
- * classes.
- */
-public class LinearLayoutRule extends BaseLayoutRule {
-    private static final String ACTION_ORIENTATION = "_orientation"; //$NON-NLS-1$
-    private static final String ACTION_WEIGHT = "_weight"; //$NON-NLS-1$
-    private static final String ACTION_DISTRIBUTE = "_distribute"; //$NON-NLS-1$
-    private static final String ACTION_BASELINE = "_baseline"; //$NON-NLS-1$
-    private static final String ACTION_CLEAR = "_clear"; //$NON-NLS-1$
-    private static final String ACTION_DOMINATE = "_dominate"; //$NON-NLS-1$
-
-    private static final URL ICON_HORIZONTAL =
-        LinearLayoutRule.class.getResource("hlinear.png"); //$NON-NLS-1$
-    private static final URL ICON_VERTICAL =
-        LinearLayoutRule.class.getResource("vlinear.png"); //$NON-NLS-1$
-    private static final URL ICON_WEIGHTS =
-        LinearLayoutRule.class.getResource("weights.png"); //$NON-NLS-1$
-    private static final URL ICON_DISTRIBUTE =
-        LinearLayoutRule.class.getResource("distribute.png"); //$NON-NLS-1$
-    private static final URL ICON_BASELINE =
-        LinearLayoutRule.class.getResource("baseline.png"); //$NON-NLS-1$
-    private static final URL ICON_CLEAR_WEIGHTS =
-            LinearLayoutRule.class.getResource("clearweights.png"); //$NON-NLS-1$
-    private static final URL ICON_DOMINATE =
-            LinearLayoutRule.class.getResource("allweight.png"); //$NON-NLS-1$
-
-    /**
-     * Returns the current orientation, regardless of whether it has been defined in XML
-     *
-     * @param node The LinearLayout to look up the orientation for
-     * @return "horizontal" or "vertical" depending on the current orientation of the
-     *         linear layout
-     */
-    private String getCurrentOrientation(final INode node) {
-        String orientation = node.getStringAttr(ANDROID_URI, ATTR_ORIENTATION);
-        if (orientation == null || orientation.length() == 0) {
-            orientation = VALUE_HORIZONTAL;
-        }
-        return orientation;
-    }
-
-    /**
-     * Returns true if the given node represents a vertical linear layout.
-     * @param node the node to check layout orientation for
-     * @return true if the layout is in vertical mode, otherwise false
-     */
-    protected boolean isVertical(INode node) {
-        // Horizontal is the default, so if no value is specified it is horizontal.
-        return VALUE_VERTICAL.equals(node.getStringAttr(ANDROID_URI,
-                ATTR_ORIENTATION));
-    }
-
-    /**
-     * Returns true if this LinearLayout supports switching orientation.
-     *
-     * @return true if this layout supports orientations
-     */
-    protected boolean supportsOrientation() {
-        return true;
-    }
-
-    @Override
-    public void addLayoutActions(
-            @NonNull List<RuleAction> actions,
-            final @NonNull INode parentNode,
-            final @NonNull List<? extends INode> children) {
-        super.addLayoutActions(actions, parentNode, children);
-        if (supportsOrientation()) {
-            Choices action = RuleAction.createChoices(
-                    ACTION_ORIENTATION, "Orientation",  //$NON-NLS-1$
-                    new PropertyCallback(Collections.singletonList(parentNode),
-                            "Change LinearLayout Orientation",
-                            ANDROID_URI, ATTR_ORIENTATION),
-                    Arrays.<String>asList("Set Horizontal Orientation","Set Vertical Orientation"),
-                    Arrays.<URL>asList(ICON_HORIZONTAL, ICON_VERTICAL),
-                    Arrays.<String>asList("horizontal", "vertical"),
-                    getCurrentOrientation(parentNode),
-                    null /* icon */,
-                    -10,
-                    false /* supportsMultipleNodes */
-            );
-            action.setRadio(true);
-            actions.add(action);
-        }
-        if (!isVertical(parentNode)) {
-            String current = parentNode.getStringAttr(ANDROID_URI, ATTR_BASELINE_ALIGNED);
-            boolean isAligned =  current == null || Boolean.valueOf(current);
-            actions.add(RuleAction.createToggle(ACTION_BASELINE, "Toggle Baseline Alignment",
-                    isAligned,
-                    new PropertyCallback(Collections.singletonList(parentNode),
-                            "Change Baseline Alignment",
-                            ANDROID_URI, ATTR_BASELINE_ALIGNED), // TODO: Also set index?
-                    ICON_BASELINE, 38, false));
-        }
-
-        // Gravity
-        if (children != null && children.size() > 0) {
-            actions.add(RuleAction.createSeparator(35));
-
-            // Margins
-            actions.add(createMarginAction(parentNode, children));
-
-            // Gravity
-            actions.add(createGravityAction(children, ATTR_LAYOUT_GRAVITY));
-
-            // Weights
-            IMenuCallback actionCallback = new IMenuCallback() {
-                @Override
-                public void action(
-                        final @NonNull RuleAction action,
-                        @NonNull List<? extends INode> selectedNodes,
-                        final @Nullable String valueId,
-                        final @Nullable Boolean newValue) {
-                    parentNode.editXml("Change Weight", new INodeHandler() {
-                        @Override
-                        public void handle(@NonNull INode n) {
-                            String id = action.getId();
-                            if (id.equals(ACTION_WEIGHT)) {
-                                String weight =
-                                    children.get(0).getStringAttr(ANDROID_URI, ATTR_LAYOUT_WEIGHT);
-                                if (weight == null || weight.length() == 0) {
-                                    weight = "0.0"; //$NON-NLS-1$
-                                }
-                                weight = mRulesEngine.displayInput("Enter Weight Value:", weight,
-                                        null);
-                                if (weight != null) {
-                                    if (weight.isEmpty()) {
-                                        weight = null; // remove attribute
-                                    }
-                                    for (INode child : children) {
-                                        child.setAttribute(ANDROID_URI,
-                                                ATTR_LAYOUT_WEIGHT, weight);
-                                    }
-                                }
-                            } else if (id.equals(ACTION_DISTRIBUTE)) {
-                                distributeWeights(parentNode, parentNode.getChildren());
-                            } else if (id.equals(ACTION_CLEAR)) {
-                                clearWeights(parentNode);
-                            } else if (id.equals(ACTION_CLEAR) || id.equals(ACTION_DOMINATE)) {
-                                clearWeights(parentNode);
-                                distributeWeights(parentNode,
-                                        children.toArray(new INode[children.size()]));
-                            } else {
-                                assert id.equals(ACTION_BASELINE);
-                            }
-                        }
-                    });
-                }
-            };
-            actions.add(RuleAction.createSeparator(50));
-            actions.add(RuleAction.createAction(ACTION_DISTRIBUTE, "Distribute Weights Evenly",
-                    actionCallback, ICON_DISTRIBUTE, 60, false /*supportsMultipleNodes*/));
-            actions.add(RuleAction.createAction(ACTION_DOMINATE, "Assign All Weight",
-                    actionCallback, ICON_DOMINATE, 70, false));
-            actions.add(RuleAction.createAction(ACTION_WEIGHT, "Change Layout Weight",
-                    actionCallback, ICON_WEIGHTS, 80, false));
-            actions.add(RuleAction.createAction(ACTION_CLEAR, "Clear All Weights",
-                     actionCallback, ICON_CLEAR_WEIGHTS, 90, false));
-        }
-    }
-
-    private void distributeWeights(INode parentNode, INode[] targets) {
-        // Any XML to get weight sum?
-        String weightSum = parentNode.getStringAttr(ANDROID_URI,
-                ATTR_WEIGHT_SUM);
-        double sum = -1.0;
-        if (weightSum != null) {
-            // Distribute
-            try {
-                sum = Double.parseDouble(weightSum);
-            } catch (NumberFormatException nfe) {
-                // Just keep using the default
-            }
-        }
-        int numTargets = targets.length;
-        double share;
-        if (sum <= 0.0) {
-            // The sum will be computed from the children, so just
-            // use arbitrary amount
-            share = 1.0;
-        } else {
-            share = sum / numTargets;
-        }
-        String value = formatFloatAttribute((float) share);
-        String sizeAttribute = isVertical(parentNode) ?
-                ATTR_LAYOUT_HEIGHT : ATTR_LAYOUT_WIDTH;
-        for (INode target : targets) {
-            target.setAttribute(ANDROID_URI, ATTR_LAYOUT_WEIGHT, value);
-            // Also set the width/height to 0dp to ensure actual equal
-            // size (without this, only the remaining space is
-            // distributed)
-            if (VALUE_WRAP_CONTENT.equals(target.getStringAttr(ANDROID_URI, sizeAttribute))) {
-                target.setAttribute(ANDROID_URI, sizeAttribute, VALUE_ZERO_DP);
-            }
-        }
-    }
-
-    private void clearWeights(INode parentNode) {
-        // Clear attributes
-        String sizeAttribute = isVertical(parentNode)
-                ? ATTR_LAYOUT_HEIGHT : ATTR_LAYOUT_WIDTH;
-        for (INode target : parentNode.getChildren()) {
-            target.setAttribute(ANDROID_URI, ATTR_LAYOUT_WEIGHT, null);
-            String size = target.getStringAttr(ANDROID_URI, sizeAttribute);
-            if (size != null && size.startsWith("0")) { //$NON-NLS-1$
-                target.setAttribute(ANDROID_URI, sizeAttribute, VALUE_WRAP_CONTENT);
-            }
-        }
-    }
-
-    // ==== Drag'n'drop support ====
-
-    @Override
-    public DropFeedback onDropEnter(final @NonNull INode targetNode, @Nullable Object targetView,
-            final @Nullable IDragElement[] elements) {
-
-        if (elements.length == 0) {
-            return null;
-        }
-
-        Rect bn = targetNode.getBounds();
-        if (!bn.isValid()) {
-            return null;
-        }
-
-        boolean isVertical = isVertical(targetNode);
-
-        // Prepare a list of insertion points: X coords for horizontal, Y for
-        // vertical.
-        List<MatchPos> indexes = new ArrayList<MatchPos>();
-
-        int last = isVertical ? bn.y : bn.x;
-        int pos = 0;
-        boolean lastDragged = false;
-        int selfPos = -1;
-        for (INode it : targetNode.getChildren()) {
-            Rect bc = it.getBounds();
-            if (bc.isValid()) {
-                // First see if this node looks like it's the same as one of the
-                // *dragged* bounds
-                boolean isDragged = false;
-                for (IDragElement element : elements) {
-                    // This tries to determine if an INode corresponds to an
-                    // IDragElement, by comparing their bounds.
-                    if (element.isSame(it)) {
-                        isDragged = true;
-                        break;
-                    }
-                }
-
-                // We don't want to insert drag positions before or after the
-                // element that is itself being dragged. However, we -do- want
-                // to insert a match position here, at the center, such that
-                // when you drag near its current position we show a match right
-                // where it's already positioned.
-                if (isDragged) {
-                    int v = isVertical ? bc.y + (bc.h / 2) : bc.x + (bc.w / 2);
-                    selfPos = pos;
-                    indexes.add(new MatchPos(v, pos++));
-                } else if (lastDragged) {
-                    // Even though we don't want to insert a match below, we
-                    // need to increment the index counter such that subsequent
-                    // lines know their correct index in the child list.
-                    pos++;
-                } else {
-                    // Add an insertion point between the last point and the
-                    // start of this child
-                    int v = isVertical ? bc.y : bc.x;
-                    v = (last + v) / 2;
-                    indexes.add(new MatchPos(v, pos++));
-                }
-
-                last = isVertical ? (bc.y + bc.h) : (bc.x + bc.w);
-                lastDragged = isDragged;
-            } else {
-                // We still have to count this position even if it has no bounds, or
-                // subsequent children will be inserted at the wrong place
-                pos++;
-            }
-        }
-
-        // Finally add an insert position after all the children - unless of
-        // course we happened to be dragging the last element
-        if (!lastDragged) {
-            int v = last + 1;
-            indexes.add(new MatchPos(v, pos));
-        }
-
-        int posCount = targetNode.getChildren().length + 1;
-        return new DropFeedback(new LinearDropData(indexes, posCount, isVertical, selfPos),
-                new IFeedbackPainter() {
-
-                    @Override
-                    public void paint(@NonNull IGraphics gc, @NonNull INode node,
-                            @NonNull DropFeedback feedback) {
-                        // Paint callback for the LinearLayout. This is called
-                        // by the canvas when a draw is needed.
-                        drawFeedback(gc, node, elements, feedback);
-                    }
-                });
-    }
-
-    void drawFeedback(IGraphics gc, INode node, IDragElement[] elements, DropFeedback feedback) {
-        Rect b = node.getBounds();
-        if (!b.isValid()) {
-            return;
-        }
-
-        // Highlight the receiver
-        gc.useStyle(DrawingStyle.DROP_RECIPIENT);
-        gc.drawRect(b);
-
-        gc.useStyle(DrawingStyle.DROP_ZONE);
-
-        LinearDropData data = (LinearDropData) feedback.userData;
-        boolean isVertical = data.isVertical();
-        int selfPos = data.getSelfPos();
-
-        for (MatchPos it : data.getIndexes()) {
-            int i = it.getDistance();
-            int pos = it.getPosition();
-            // Don't show insert drop zones for "self"-index since that one goes
-            // right through the center of the widget rather than in a sibling
-            // position
-            if (pos != selfPos) {
-                if (isVertical) {
-                    // draw horizontal lines
-                    gc.drawLine(b.x, i, b.x + b.w, i);
-                } else {
-                    // draw vertical lines
-                    gc.drawLine(i, b.y, i, b.y + b.h);
-                }
-            }
-        }
-
-        Integer currX = data.getCurrX();
-        Integer currY = data.getCurrY();
-
-        if (currX != null && currY != null) {
-            gc.useStyle(DrawingStyle.DROP_ZONE_ACTIVE);
-
-            int x = currX;
-            int y = currY;
-
-            Rect be = elements[0].getBounds();
-
-            // Draw a clear line at the closest drop zone (unless we're over the
-            // dragged element itself)
-            if (data.getInsertPos() != selfPos || selfPos == -1) {
-                gc.useStyle(DrawingStyle.DROP_PREVIEW);
-                if (data.getWidth() != null) {
-                    int width = data.getWidth();
-                    int fromX = x - width / 2;
-                    int toX = x + width / 2;
-                    gc.drawLine(fromX, y, toX, y);
-                } else if (data.getHeight() != null) {
-                    int height = data.getHeight();
-                    int fromY = y - height / 2;
-                    int toY = y + height / 2;
-                    gc.drawLine(x, fromY, x, toY);
-                }
-            }
-
-            if (be.isValid()) {
-                boolean isLast = data.isLastPosition();
-
-                // At least the first element has a bound. Draw rectangles for
-                // all dropped elements with valid bounds, offset at the drop
-                // point.
-                int offsetX;
-                int offsetY;
-                if (isVertical) {
-                    offsetX = b.x - be.x;
-                    offsetY = currY - be.y - (isLast ? 0 : (be.h / 2));
-
-                } else {
-                    offsetX = currX - be.x - (isLast ? 0 : (be.w / 2));
-                    offsetY = b.y - be.y;
-                }
-
-                gc.useStyle(DrawingStyle.DROP_PREVIEW);
-                for (IDragElement element : elements) {
-                    Rect bounds = element.getBounds();
-                    if (bounds.isValid() && (bounds.w > b.w || bounds.h > b.h) &&
-                            node.getChildren().length == 0) {
-                        // The bounds of the child does not fully fit inside the target.
-                        // Limit the bounds to the layout bounds (but only when there
-                        // are no children, since otherwise positioning around the existing
-                        // children gets difficult)
-                        final int px, py, pw, ph;
-                        if (bounds.w > b.w) {
-                            px = b.x;
-                            pw = b.w;
-                        } else {
-                            px = bounds.x + offsetX;
-                            pw = bounds.w;
-                        }
-                        if (bounds.h > b.h) {
-                            py = b.y;
-                            ph = b.h;
-                        } else {
-                            py = bounds.y + offsetY;
-                            ph = bounds.h;
-                        }
-                        Rect within = new Rect(px, py, pw, ph);
-                        gc.drawRect(within);
-                    } else {
-                        drawElement(gc, element, offsetX, offsetY);
-                    }
-                }
-            }
-        }
-    }
-
-    @Override
-    public DropFeedback onDropMove(@NonNull INode targetNode, @NonNull IDragElement[] elements,
-            @Nullable DropFeedback feedback, @NonNull Point p) {
-        Rect b = targetNode.getBounds();
-        if (!b.isValid()) {
-            return feedback;
-        }
-
-        LinearDropData data = (LinearDropData) feedback.userData;
-        boolean isVertical = data.isVertical();
-
-        int bestDist = Integer.MAX_VALUE;
-        int bestIndex = Integer.MIN_VALUE;
-        Integer bestPos = null;
-
-        for (MatchPos index : data.getIndexes()) {
-            int i = index.getDistance();
-            int pos = index.getPosition();
-            int dist = (isVertical ? p.y : p.x) - i;
-            if (dist < 0)
-                dist = -dist;
-            if (dist < bestDist) {
-                bestDist = dist;
-                bestIndex = i;
-                bestPos = pos;
-                if (bestDist <= 0)
-                    break;
-            }
-        }
-
-        if (bestIndex != Integer.MIN_VALUE) {
-            Integer oldX = data.getCurrX();
-            Integer oldY = data.getCurrY();
-
-            if (isVertical) {
-                data.setCurrX(b.x + b.w / 2);
-                data.setCurrY(bestIndex);
-                data.setWidth(b.w);
-                data.setHeight(null);
-            } else {
-                data.setCurrX(bestIndex);
-                data.setCurrY(b.y + b.h / 2);
-                data.setWidth(null);
-                data.setHeight(b.h);
-            }
-
-            data.setInsertPos(bestPos);
-
-            feedback.requestPaint = !equals(oldX, data.getCurrX())
-                    || !equals(oldY, data.getCurrY());
-        }
-
-        return feedback;
-    }
-
-    private static boolean equals(Integer i1, Integer i2) {
-        if (i1 == i2) {
-            return true;
-        } else if (i1 != null) {
-            return i1.equals(i2);
-        } else {
-            // We know i2 != null
-            return i2.equals(i1);
-        }
-    }
-
-    @Override
-    public void onDropLeave(@NonNull INode targetNode, @NonNull IDragElement[] elements,
-            @Nullable DropFeedback feedback) {
-        // ignore
-    }
-
-    @Override
-    public void onDropped(final @NonNull INode targetNode, final @NonNull IDragElement[] elements,
-            final @Nullable DropFeedback feedback, final @NonNull Point p) {
-
-        LinearDropData data = (LinearDropData) feedback.userData;
-        final int initialInsertPos = data.getInsertPos();
-        insertAt(targetNode, elements, feedback.isCopy || !feedback.sameCanvas, initialInsertPos);
-    }
-
-    @Override
-    public void onChildInserted(@NonNull INode node, @NonNull INode parent,
-            @NonNull InsertType insertType) {
-        if (insertType == InsertType.MOVE_WITHIN) {
-            // Don't adjust widths/heights/weights when just moving within a single
-            // LinearLayout
-            return;
-        }
-
-        // Attempt to set fill-properties on newly added views such that for example,
-        // in a vertical layout, a text field defaults to filling horizontally, but not
-        // vertically.
-        String fqcn = node.getFqcn();
-        IViewMetadata metadata = mRulesEngine.getMetadata(fqcn);
-        if (metadata != null) {
-            boolean vertical = isVertical(parent);
-            FillPreference fill = metadata.getFillPreference();
-            String fillParent = getFillParentValueName();
-            if (fill.fillHorizontally(vertical)) {
-                node.setAttribute(ANDROID_URI, ATTR_LAYOUT_WIDTH, fillParent);
-            } else if (!vertical && fill == FillPreference.WIDTH_IN_VERTICAL) {
-                // In a horizontal layout, make views that would fill horizontally in a
-                // vertical layout have a non-zero weight instead. This will make the item
-                // fill but only enough to allow other views to be shown as well.
-                // (However, for drags within the same layout we do not touch
-                // the weight, since it might already have been tweaked to a particular
-                // value)
-                node.setAttribute(ANDROID_URI, ATTR_LAYOUT_WEIGHT, VALUE_1);
-            }
-            if (fill.fillVertically(vertical)) {
-                node.setAttribute(ANDROID_URI, ATTR_LAYOUT_HEIGHT, fillParent);
-            }
-        }
-
-        // If you insert into a layout that already is using layout weights,
-        // and all the layout weights are the same (nonzero) value, then use
-        // the same weight for this new layout as well. Also duplicate the 0dip/0px/0dp
-        // sizes, if used.
-        boolean duplicateWeight = true;
-        boolean duplicate0dip = true;
-        String sameWeight = null;
-        String sizeAttribute = isVertical(parent) ? ATTR_LAYOUT_HEIGHT : ATTR_LAYOUT_WIDTH;
-        for (INode target : parent.getChildren()) {
-            if (target == node) {
-                continue;
-            }
-            String weight = target.getStringAttr(ANDROID_URI, ATTR_LAYOUT_WEIGHT);
-            if (weight == null || weight.length() == 0) {
-                duplicateWeight = false;
-                break;
-            } else if (sameWeight != null && !sameWeight.equals(weight)) {
-                duplicateWeight = false;
-            } else {
-                sameWeight = weight;
-            }
-            String size = target.getStringAttr(ANDROID_URI, sizeAttribute);
-            if (size != null && !size.startsWith("0")) { //$NON-NLS-1$
-                duplicate0dip = false;
-                break;
-            }
-        }
-        if (duplicateWeight && sameWeight != null) {
-            node.setAttribute(ANDROID_URI, ATTR_LAYOUT_WEIGHT, sameWeight);
-            if (duplicate0dip) {
-                node.setAttribute(ANDROID_URI, sizeAttribute, VALUE_ZERO_DP);
-            }
-        }
-    }
-
-    /** A possible match position */
-    private static class MatchPos {
-        /** The pixel distance */
-        private int mDistance;
-        /** The position among siblings */
-        private int mPosition;
-
-        public MatchPos(int distance, int position) {
-            mDistance = distance;
-            mPosition = position;
-        }
-
-        @Override
-        public String toString() {
-            return "MatchPos [distance=" + mDistance //$NON-NLS-1$
-                    + ", position=" + mPosition      //$NON-NLS-1$
-                    + "]";                           //$NON-NLS-1$
-        }
-
-        private int getDistance() {
-            return mDistance;
-        }
-
-        private int getPosition() {
-            return mPosition;
-        }
-    }
-
-    private static class LinearDropData {
-        /** Vertical layout? */
-        private final boolean mVertical;
-
-        /** Insert points (pixels + index) */
-        private final List<MatchPos> mIndexes;
-
-        /** Number of insert positions in the target node */
-        private final int mNumPositions;
-
-        /** Current marker X position */
-        private Integer mCurrX;
-
-        /** Current marker Y position */
-        private Integer mCurrY;
-
-        /** Position of the dragged element in this layout (or
-            -1 if the dragged element is from elsewhere) */
-        private final int mSelfPos;
-
-        /** Current drop insert index (-1 for "at the end") */
-        private int mInsertPos = -1;
-
-        /** width of match line if it's a horizontal one */
-        private Integer mWidth;
-
-        /** height of match line if it's a vertical one */
-        private Integer mHeight;
-
-        public LinearDropData(List<MatchPos> indexes, int numPositions,
-                boolean isVertical, int selfPos) {
-            mIndexes = indexes;
-            mNumPositions = numPositions;
-            mVertical = isVertical;
-            mSelfPos = selfPos;
-        }
-
-        @Override
-        public String toString() {
-            return "LinearDropData [currX=" + mCurrX //$NON-NLS-1$
-                    + ", currY=" + mCurrY //$NON-NLS-1$
-                    + ", height=" + mHeight //$NON-NLS-1$
-                    + ", indexes=" + mIndexes //$NON-NLS-1$
-                    + ", insertPos=" + mInsertPos //$NON-NLS-1$
-                    + ", isVertical=" + mVertical //$NON-NLS-1$
-                    + ", selfPos=" + mSelfPos //$NON-NLS-1$
-                    + ", width=" + mWidth //$NON-NLS-1$
-                    + "]"; //$NON-NLS-1$
-        }
-
-        private boolean isVertical() {
-            return mVertical;
-        }
-
-        private void setCurrX(Integer currX) {
-            mCurrX = currX;
-        }
-
-        private Integer getCurrX() {
-            return mCurrX;
-        }
-
-        private void setCurrY(Integer currY) {
-            mCurrY = currY;
-        }
-
-        private Integer getCurrY() {
-            return mCurrY;
-        }
-
-        private int getSelfPos() {
-            return mSelfPos;
-        }
-
-        private void setInsertPos(int insertPos) {
-            mInsertPos = insertPos;
-        }
-
-        private int getInsertPos() {
-            return mInsertPos;
-        }
-
-        private List<MatchPos> getIndexes() {
-            return mIndexes;
-        }
-
-        private void setWidth(Integer width) {
-            mWidth = width;
-        }
-
-        private Integer getWidth() {
-            return mWidth;
-        }
-
-        private void setHeight(Integer height) {
-            mHeight = height;
-        }
-
-        private Integer getHeight() {
-            return mHeight;
-        }
-
-        /**
-         * Returns true if we are inserting into the last position
-         *
-         * @return true if we are inserting into the last position
-         */
-        public boolean isLastPosition() {
-            return mInsertPos == mNumPositions - 1;
-        }
-    }
-
-    /** Custom resize state used during linear layout resizing */
-    private class LinearResizeState extends ResizeState {
-        /** Whether the node should be assigned a new weight */
-        public boolean useWeight;
-        /** Weight sum to be applied to the parent */
-        private float mNewWeightSum;
-        /** The weight to be set on the node (provided {@link #useWeight} is true) */
-        private float mWeight;
-        /** Map from nodes to preferred bounds of nodes where the weights have been cleared */
-        public final Map<INode, Rect> unweightedSizes;
-        /** Total required size required by the siblings <b>without</b> weights */
-        public int totalLength;
-        /** List of nodes which should have their weights cleared */
-        public List<INode> mClearWeights;
-
-        private LinearResizeState(BaseLayoutRule rule, INode layout, Object layoutView,
-                INode node) {
-            super(rule, layout, layoutView, node);
-
-            unweightedSizes = mRulesEngine.measureChildren(layout,
-                    new IClientRulesEngine.AttributeFilter() {
-                        @Override
-                        public String getAttribute(@NonNull INode n, @Nullable String namespace,
-                                @NonNull String localName) {
-                            // Clear out layout weights; we need to measure the unweighted sizes
-                            // of the children
-                            if (ATTR_LAYOUT_WEIGHT.equals(localName)
-                                    && SdkConstants.NS_RESOURCES.equals(namespace)) {
-                                return ""; //$NON-NLS-1$
-                            }
-
-                            return null;
-                        }
-                    });
-
-            // Compute total required size required by the siblings *without* weights
-            totalLength = 0;
-            final boolean isVertical = isVertical(layout);
-            for (Map.Entry<INode, Rect> entry : unweightedSizes.entrySet()) {
-                Rect preferredSize = entry.getValue();
-                if (isVertical) {
-                    totalLength += preferredSize.h;
-                } else {
-                    totalLength += preferredSize.w;
-                }
-            }
-        }
-
-        /** Resets the computed state */
-        void reset() {
-            mNewWeightSum = -1;
-            useWeight = false;
-            mClearWeights = null;
-        }
-
-        /** Sets a weight to be applied to the node */
-        void setWeight(float weight) {
-            useWeight = true;
-            mWeight = weight;
-        }
-
-        /** Sets a weight sum to be applied to the parent layout */
-        void setWeightSum(float weightSum) {
-            mNewWeightSum = weightSum;
-        }
-
-        /** Marks that the given node should be cleared when applying the new size */
-        void clearWeight(INode n) {
-            if (mClearWeights == null) {
-                mClearWeights = new ArrayList<INode>();
-            }
-            mClearWeights.add(n);
-        }
-
-        /** Applies the state to the nodes */
-        public void apply() {
-            assert useWeight;
-
-            String value = mWeight > 0 ? formatFloatAttribute(mWeight) : null;
-            node.setAttribute(ANDROID_URI, ATTR_LAYOUT_WEIGHT, value);
-
-            if (mClearWeights != null) {
-                for (INode n : mClearWeights) {
-                    if (getWeight(n) > 0.0f) {
-                        n.setAttribute(ANDROID_URI, ATTR_LAYOUT_WEIGHT, null);
-                    }
-                }
-            }
-
-            if (mNewWeightSum > 0.0) {
-                layout.setAttribute(ANDROID_URI, ATTR_WEIGHT_SUM,
-                        formatFloatAttribute(mNewWeightSum));
-            }
-        }
-    }
-
-    @Override
-    protected ResizeState createResizeState(INode layout, Object layoutView, INode node) {
-        return new LinearResizeState(this, layout, layoutView, node);
-    }
-
-    protected void updateResizeState(LinearResizeState resizeState, final INode node, INode layout,
-            Rect oldBounds, Rect newBounds, SegmentType horizontalEdge,
-            SegmentType verticalEdge) {
-        // Update the resize state.
-        // This method attempts to compute a new layout weight to be used in the direction
-        // of the linear layout. If the superclass has already determined that we can snap to
-        // a wrap_content or match_parent boundary, we prefer that. Otherwise, we attempt to
-        // compute a layout weight - which can fail if the size is too big (not enough room),
-        // or if the size is too small (smaller than the natural width of the node), and so on.
-        // In that case this method just aborts, which will leave the resize state object
-        // in such a state that it will call the superclass to resize instead, which will fall
-        // back to device independent pixel sizing.
-        resizeState.reset();
-
-        if (oldBounds.equals(newBounds)) {
-            return;
-        }
-
-        // If we're setting the width/height to wrap_content/match_parent in the dimension of the
-        // linear layout, then just apply wrap_content and clear weights.
-        boolean isVertical = isVertical(layout);
-        if (!isVertical && verticalEdge != null) {
-            if (resizeState.wrapWidth || resizeState.fillWidth) {
-                resizeState.clearWeight(node);
-                return;
-            }
-            if (newBounds.w == oldBounds.w) {
-                return;
-            }
-        }
-
-        if (isVertical && horizontalEdge != null) {
-            if (resizeState.wrapHeight || resizeState.fillHeight) {
-                resizeState.clearWeight(node);
-                return;
-            }
-            if (newBounds.h == oldBounds.h) {
-                return;
-            }
-        }
-
-        // Compute weight sum
-        float sum = getWeightSum(layout);
-        if (sum <= 0.0f) {
-            sum = 1.0f;
-            resizeState.setWeightSum(sum);
-        }
-
-        // If the new size of the node is smaller than its preferred/wrap_content size,
-        // then we cannot use weights to size it; switch to pixel-based sizing instead
-        Map<INode, Rect> sizes = resizeState.unweightedSizes;
-        Rect nodePreferredSize = sizes.get(node);
-        if (nodePreferredSize != null) {
-            if (horizontalEdge != null && newBounds.h < nodePreferredSize.h ||
-                    verticalEdge != null && newBounds.w < nodePreferredSize.w) {
-                return;
-            }
-        }
-
-        Rect layoutBounds = layout.getBounds();
-        int remaining = (isVertical ? layoutBounds.h : layoutBounds.w) - resizeState.totalLength;
-        Rect nodeBounds = sizes.get(node);
-        if (nodeBounds == null) {
-            return;
-        }
-
-        if (remaining > 0) {
-            int missing = 0;
-            if (isVertical) {
-                if (newBounds.h > nodeBounds.h) {
-                    missing = newBounds.h - nodeBounds.h;
-                } else if (newBounds.h > resizeState.wrapBounds.h) {
-                    // The weights concern how much space to ADD to the view.
-                    // What if we have resized it to a size *smaller* than its current
-                    // size without the weight delta? This can happen if you for example
-                    // have set a hardcoded size, such as 500dp, and then size it to some
-                    // smaller size.
-                    missing = newBounds.h - resizeState.wrapBounds.h;
-                    remaining += nodeBounds.h - resizeState.wrapBounds.h;
-                    resizeState.wrapHeight = true;
-                }
-            } else {
-                if (newBounds.w > nodeBounds.w) {
-                    missing = newBounds.w - nodeBounds.w;
-                } else if (newBounds.w > resizeState.wrapBounds.w) {
-                    missing = newBounds.w - resizeState.wrapBounds.w;
-                    remaining += nodeBounds.w - resizeState.wrapBounds.w;
-                    resizeState.wrapWidth = true;
-                }
-            }
-            if (missing > 0) {
-                // (weight / weightSum) * remaining = missing, so
-                // weight = missing * weightSum / remaining
-                float weight = missing * sum / remaining;
-                resizeState.setWeight(weight);
-            }
-        }
-    }
-
-    /**
-     * {@inheritDoc}
-     * <p>
-     * Overridden in this layout in order to make resizing affect the layout_weight
-     * attribute instead of the layout_width (for horizontal LinearLayouts) or
-     * layout_height (for vertical LinearLayouts).
-     */
-    @Override
-    protected void setNewSizeBounds(ResizeState state, final INode node, INode layout,
-            Rect oldBounds, Rect newBounds, SegmentType horizontalEdge,
-            SegmentType verticalEdge) {
-        LinearResizeState resizeState = (LinearResizeState) state;
-        updateResizeState(resizeState, node, layout, oldBounds, newBounds,
-                horizontalEdge, verticalEdge);
-
-        if (resizeState.useWeight) {
-            resizeState.apply();
-
-            // Handle resizing in the opposite dimension of the layout
-            final boolean isVertical = isVertical(layout);
-            if (!isVertical && horizontalEdge != null) {
-                if (newBounds.h != oldBounds.h || resizeState.wrapHeight
-                        || resizeState.fillHeight) {
-                    node.setAttribute(ANDROID_URI, ATTR_LAYOUT_HEIGHT,
-                            resizeState.getHeightAttribute());
-                }
-            }
-            if (isVertical && verticalEdge != null) {
-                if (newBounds.w != oldBounds.w || resizeState.wrapWidth || resizeState.fillWidth) {
-                    node.setAttribute(ANDROID_URI, ATTR_LAYOUT_WIDTH,
-                            resizeState.getWidthAttribute());
-                }
-            }
-        } else {
-            node.setAttribute(ANDROID_URI, ATTR_LAYOUT_WEIGHT, null);
-            super.setNewSizeBounds(resizeState, node, layout, oldBounds, newBounds,
-                    horizontalEdge, verticalEdge);
-        }
-    }
-
-    @Override
-    protected String getResizeUpdateMessage(ResizeState state, INode child, INode parent,
-            Rect newBounds, SegmentType horizontalEdge, SegmentType verticalEdge) {
-        LinearResizeState resizeState = (LinearResizeState) state;
-        updateResizeState(resizeState, child, parent, child.getBounds(), newBounds,
-                horizontalEdge, verticalEdge);
-
-        if (resizeState.useWeight) {
-            String weight = formatFloatAttribute(resizeState.mWeight);
-            String dimension = String.format("weight %1$s", weight);
-
-            String width;
-            String height;
-            if (isVertical(parent)) {
-                width = resizeState.getWidthAttribute();
-                height = dimension;
-            } else {
-                width = dimension;
-                height = resizeState.getHeightAttribute();
-            }
-
-            if (horizontalEdge == null) {
-                return width;
-            } else if (verticalEdge == null) {
-                return height;
-            } else {
-                // U+00D7: Unicode for multiplication sign
-                return String.format("%s \u00D7 %s", width, height);
-            }
-        } else {
-            return super.getResizeUpdateMessage(state, child, parent, newBounds,
-                    horizontalEdge, verticalEdge);
-        }
-    }
-
-    /**
-     * Returns the layout weight of of the given child of a LinearLayout, or 0.0 if it
-     * does not define a weight
-     */
-    private static float getWeight(INode linearLayoutChild) {
-        String weight = linearLayoutChild.getStringAttr(ANDROID_URI, ATTR_LAYOUT_WEIGHT);
-        if (weight != null && weight.length() > 0) {
-            try {
-                return Float.parseFloat(weight);
-            } catch (NumberFormatException nfe) {
-                AdtPlugin.log(nfe, "Invalid weight %1$s", weight);
-            }
-        }
-
-        return 0.0f;
-    }
-
-    /**
-     * Returns the sum of all the layout weights of the children in the given LinearLayout
-     *
-     * @param linearLayout the layout to compute the total sum for
-     * @return the total sum of all the layout weights in the given layout
-     */
-    private static float getWeightSum(INode linearLayout) {
-        String weightSum = linearLayout.getStringAttr(ANDROID_URI,
-                ATTR_WEIGHT_SUM);
-        float sum = -1.0f;
-        if (weightSum != null) {
-            // Distribute
-            try {
-                sum = Float.parseFloat(weightSum);
-                return sum;
-            } catch (NumberFormatException nfe) {
-                // Just keep using the default
-            }
-        }
-
-        return getSumOfWeights(linearLayout);
-    }
-
-    private static float getSumOfWeights(INode linearLayout) {
-        float sum = 0.0f;
-        for (INode child : linearLayout.getChildren()) {
-            sum += getWeight(child);
-        }
-
-        return sum;
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/ListViewRule.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/ListViewRule.java
deleted file mode 100644
index 70728c8..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/ListViewRule.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Copyright (C) 2010 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.layout;
-
-import static com.android.SdkConstants.ANDROID_URI;
-import static com.android.SdkConstants.ATTR_LAYOUT_WIDTH;
-
-import com.android.annotations.NonNull;
-import com.android.ide.common.api.INode;
-import com.android.ide.common.api.IViewRule;
-import com.android.ide.common.api.InsertType;
-
-/**
- * An {@link IViewRule} for android.widget.ListView and all its derived classes such
- * as ExpandableListView.
- * This is the "root" rule, that is used whenever there is not more specific
- * rule to apply.
- */
-public class ListViewRule extends AdapterViewRule {
-
-    @Override
-    public void onCreate(@NonNull INode node, @NonNull INode parent,
-            @NonNull InsertType insertType) {
-        super.onCreate(node, parent, insertType);
-
-        node.setAttribute(ANDROID_URI, ATTR_LAYOUT_WIDTH, getFillParentValueName());
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/MapViewRule.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/MapViewRule.java
deleted file mode 100644
index 006661e..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/MapViewRule.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Copyright (C) 2010 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.layout;
-
-import static com.android.SdkConstants.ANDROID_URI;
-
-import com.android.annotations.NonNull;
-import com.android.ide.common.api.INode;
-import com.android.ide.common.api.IViewRule;
-import com.android.ide.common.api.InsertType;
-
-/**
- * An {@link IViewRule} for com.google.android.maps.MapView.
- * <p>
- * TODO: This class should be pulled out of the ADT and bundled with the add ons
- * (not the core jar but an optional tool jar)
- */
-public class MapViewRule extends BaseViewRule {
-
-    @Override
-    public void onCreate(@NonNull INode node, @NonNull INode parent,
-            @NonNull InsertType insertType) {
-        super.onCreate(node, parent, insertType);
-
-        if (insertType.isCreate()) {
-            node.setAttribute(ANDROID_URI, "android:apiKey",  //$NON-NLS-1$
-                   "Your API key: see " + //$NON-NLS-1$
-                   "http://code.google.com/android/add-ons/google-apis/mapkey.html"); //$NON-NLS-1$
-        }
-    }
-
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/MergeRule.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/MergeRule.java
deleted file mode 100644
index 9cef9c4..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/MergeRule.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.ide.common.layout;
-
-import com.android.annotations.NonNull;
-import com.android.ide.common.api.INode;
-import com.android.ide.common.api.RuleAction;
-
-import java.util.List;
-
-/**
- * Drop handler for the {@code <merge>} tag
- */
-public class MergeRule extends FrameLayoutRule {
-    // The <merge> tag behaves a lot like the FrameLayout; all children are added
-    // on top of each other at (0,0)
-
-    @Override
-    public void addContextMenuActions(@NonNull List<RuleAction> actions,
-            final @NonNull INode selectedNode) {
-        // Deliberately ignore super.getContextMenu(); we don't want to attempt to list
-        // properties for the <merge> tag
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/PropertyCallback.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/PropertyCallback.java
deleted file mode 100644
index da2614e..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/PropertyCallback.java
+++ /dev/null
@@ -1,82 +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.layout;
-
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-import com.android.ide.common.api.IMenuCallback;
-import com.android.ide.common.api.INode;
-import com.android.ide.common.api.INodeHandler;
-import com.android.ide.common.api.RuleAction;
-
-import java.util.List;
-
-/**
- * Convenience implementation of {@link IMenuCallback} which can be used to set a
- * particular property to the new valueId or newValue passed from the {@link IMenuCallback}
- */
-public class PropertyCallback implements IMenuCallback {
-    private final List<? extends INode> mTargetNodes;
-    private final String mUndoLabel;
-    private final String mUri;
-    private final String mAttribute;
-
-    /**
-     * Creates a new property callback.
-     *
-     * @param targetNodes the nodes to apply the property to, or null to use the
-     *            nodes pass into the
-     *            {@link #action(RuleAction, List, String, Boolean)} method.
-     * @param undoLabel the label to use for the undo action
-     * @param uri the attribute URI to apply
-     * @param attribute the attribute name to apply
-     */
-    public PropertyCallback(List<? extends INode> targetNodes, String undoLabel,
-            String uri, String attribute) {
-        super();
-        mTargetNodes = targetNodes;
-        mUndoLabel = undoLabel;
-        mUri = uri;
-        mAttribute = attribute;
-    }
-
-    // ---- Implements IMenuCallback ----
-    @Override
-    public void action(@NonNull RuleAction action, @NonNull List<? extends INode> selectedNodes,
-            final @Nullable String valueId, final @Nullable Boolean newValue) {
-        if (mTargetNodes != null && mTargetNodes.size() > 0) {
-            selectedNodes = mTargetNodes;
-        }
-        if (selectedNodes == null || selectedNodes.size() == 0) {
-            return;
-        }
-        final List<? extends INode> nodes = selectedNodes;
-        selectedNodes.get(0).editXml(mUndoLabel, new INodeHandler() {
-            @Override
-            public void handle(@NonNull INode n) {
-                for (INode targetNode : nodes) {
-                    if (valueId != null) {
-                        targetNode.setAttribute(mUri, mAttribute, valueId);
-                    } else {
-                        assert newValue != null;
-                        targetNode.setAttribute(mUri, mAttribute, Boolean.toString(newValue));
-                    }
-                }
-            }
-        });
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/PropertySettingNodeHandler.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/PropertySettingNodeHandler.java
deleted file mode 100644
index 13c8842..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/PropertySettingNodeHandler.java
+++ /dev/null
@@ -1,42 +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.layout;
-
-import com.android.annotations.NonNull;
-import com.android.ide.common.api.INode;
-import com.android.ide.common.api.INodeHandler;
-
-/**
- * A convenience implementation of {@link INodeHandler} for setting a given attribute to a
- * given value on a particular node.
- */
-class PropertySettingNodeHandler implements INodeHandler {
-    private final String mNamespaceUri;
-    private final String mAttribute;
-    private final String mValue;
-
-    PropertySettingNodeHandler(String namespaceUri, String attribute, String value) {
-        super();
-        mNamespaceUri = namespaceUri;
-        mAttribute = attribute;
-        mValue = value;
-    }
-
-    @Override
-    public void handle(@NonNull INode node) {
-        node.setAttribute(mNamespaceUri, mAttribute, mValue);
-    }
-}
\ No newline at end of file
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/QuickContactBadgeRule.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/QuickContactBadgeRule.java
deleted file mode 100644
index 0164794..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/QuickContactBadgeRule.java
+++ /dev/null
@@ -1,34 +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.layout;
-
-import com.android.annotations.NonNull;
-import com.android.ide.common.api.INode;
-import com.android.ide.common.api.IViewRule;
-import com.android.ide.common.api.InsertType;
-
-/**
- * An {@link IViewRule} for android.widget.QuickContactBadgeRule.
- */
-public class QuickContactBadgeRule extends ImageViewRule {
-    @Override
-    public void onCreate(@NonNull INode node, @NonNull INode parent,
-            @NonNull InsertType insertType) {
-        // Deliberately override onCreate such that we don't populate a default
-        // image; at design time layoutlib will supply the system default contacts
-        // image.
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/RadioGroupRule.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/RadioGroupRule.java
deleted file mode 100644
index c9aa207..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/RadioGroupRule.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.ide.common.layout;
-
-import static com.android.SdkConstants.ATTR_CHECKED;
-import static com.android.SdkConstants.ATTR_ID;
-import static com.android.SdkConstants.VALUE_TRUE;
-
-
-import com.android.SdkConstants;
-import static com.android.SdkConstants.ANDROID_URI;
-import com.android.annotations.NonNull;
-import com.android.ide.common.api.INode;
-import com.android.ide.common.api.IViewRule;
-import com.android.ide.common.api.InsertType;
-
-/**
- * An {@link IViewRule} for android.widget.RadioGroup which initializes the radio group
- * with some radio buttons
- */
-public class RadioGroupRule extends LinearLayoutRule {
-    @Override
-    public void onCreate(@NonNull INode node, @NonNull INode parent,
-            @NonNull InsertType insertType) {
-        super.onCreate(node, parent, insertType);
-
-        if (insertType.isCreate()) {
-            for (int i = 0; i < 3; i++) {
-                INode handle = node.appendChild(SdkConstants.FQCN_RADIO_BUTTON);
-                handle.setAttribute(ANDROID_URI, ATTR_ID, String.format("@+id/radio%d", i));
-                if (i == 0) {
-                    handle.setAttribute(ANDROID_URI, ATTR_CHECKED, VALUE_TRUE);
-                }
-            }
-        }
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/RelativeLayoutRule.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/RelativeLayoutRule.java
deleted file mode 100644
index b4bc869..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/RelativeLayoutRule.java
+++ /dev/null
@@ -1,413 +0,0 @@
-/*
- * Copyright (C) 2010 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.layout;
-
-import static com.android.SdkConstants.ANDROID_URI;
-import static com.android.SdkConstants.ATTR_GRAVITY;
-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_RESOURCE_PREFIX;
-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.VALUE_TRUE;
-
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-import com.android.ide.common.api.DropFeedback;
-import com.android.ide.common.api.IDragElement;
-import com.android.ide.common.api.IGraphics;
-import com.android.ide.common.api.IMenuCallback;
-import com.android.ide.common.api.INode;
-import com.android.ide.common.api.INodeHandler;
-import com.android.ide.common.api.IViewRule;
-import com.android.ide.common.api.InsertType;
-import com.android.ide.common.api.Point;
-import com.android.ide.common.api.Rect;
-import com.android.ide.common.api.RuleAction;
-import com.android.ide.common.api.SegmentType;
-import com.android.ide.common.layout.relative.ConstraintPainter;
-import com.android.ide.common.layout.relative.DeletionHandler;
-import com.android.ide.common.layout.relative.GuidelinePainter;
-import com.android.ide.common.layout.relative.MoveHandler;
-import com.android.ide.common.layout.relative.ResizeHandler;
-import com.android.utils.Pair;
-
-import java.net.URL;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
-import java.util.Map;
-
-/**
- * An {@link IViewRule} for android.widget.RelativeLayout and all its derived
- * classes.
- */
-public class RelativeLayoutRule extends BaseLayoutRule {
-    private static final String ACTION_SHOW_STRUCTURE = "_structure"; //$NON-NLS-1$
-    private static final String ACTION_SHOW_CONSTRAINTS = "_constraints"; //$NON-NLS-1$
-    private static final String ACTION_CENTER_VERTICAL = "_centerVert"; //$NON-NLS-1$
-    private static final String ACTION_CENTER_HORIZONTAL = "_centerHoriz"; //$NON-NLS-1$
-    private static final URL ICON_CENTER_VERTICALLY =
-        RelativeLayoutRule.class.getResource("centerVertically.png"); //$NON-NLS-1$
-    private static final URL ICON_CENTER_HORIZONTALLY =
-        RelativeLayoutRule.class.getResource("centerHorizontally.png"); //$NON-NLS-1$
-    private static final URL ICON_SHOW_STRUCTURE =
-        BaseLayoutRule.class.getResource("structure.png"); //$NON-NLS-1$
-    private static final URL ICON_SHOW_CONSTRAINTS =
-        BaseLayoutRule.class.getResource("constraints.png"); //$NON-NLS-1$
-
-    public static boolean sShowStructure = false;
-    public static boolean sShowConstraints = true;
-
-    // ==== Selection ====
-
-    @Override
-    public List<String> getSelectionHint(@NonNull INode parentNode, @NonNull INode childNode) {
-        List<String> infos = new ArrayList<String>(18);
-        addAttr(ATTR_LAYOUT_ABOVE, childNode, infos);
-        addAttr(ATTR_LAYOUT_BELOW, childNode, infos);
-        addAttr(ATTR_LAYOUT_TO_LEFT_OF, childNode, infos);
-        addAttr(ATTR_LAYOUT_TO_RIGHT_OF, childNode, infos);
-        addAttr(ATTR_LAYOUT_ALIGN_BASELINE, childNode, infos);
-        addAttr(ATTR_LAYOUT_ALIGN_TOP, childNode, infos);
-        addAttr(ATTR_LAYOUT_ALIGN_BOTTOM, childNode, infos);
-        addAttr(ATTR_LAYOUT_ALIGN_LEFT, childNode, infos);
-        addAttr(ATTR_LAYOUT_ALIGN_RIGHT, childNode, infos);
-        addAttr(ATTR_LAYOUT_ALIGN_PARENT_TOP, childNode, infos);
-        addAttr(ATTR_LAYOUT_ALIGN_PARENT_BOTTOM, childNode, infos);
-        addAttr(ATTR_LAYOUT_ALIGN_PARENT_LEFT, childNode, infos);
-        addAttr(ATTR_LAYOUT_ALIGN_PARENT_RIGHT, childNode, infos);
-        addAttr(ATTR_LAYOUT_ALIGN_WITH_PARENT_MISSING, childNode, infos);
-        addAttr(ATTR_LAYOUT_CENTER_HORIZONTAL, childNode, infos);
-        addAttr(ATTR_LAYOUT_CENTER_IN_PARENT, childNode, infos);
-        addAttr(ATTR_LAYOUT_CENTER_VERTICAL, childNode, infos);
-
-        return infos;
-    }
-
-    private void addAttr(String propertyName, INode childNode, List<String> infos) {
-        String a = childNode.getStringAttr(ANDROID_URI, propertyName);
-        if (a != null && a.length() > 0) {
-            // Display the layout parameters without the leading layout_ prefix
-            // and id references without the @+id/ prefix
-            if (propertyName.startsWith(ATTR_LAYOUT_RESOURCE_PREFIX)) {
-                propertyName = propertyName.substring(ATTR_LAYOUT_RESOURCE_PREFIX.length());
-            }
-            a = stripIdPrefix(a);
-            String s = propertyName + ": " + a;
-            infos.add(s);
-        }
-    }
-
-    @Override
-    public void paintSelectionFeedback(@NonNull IGraphics graphics, @NonNull INode parentNode,
-            @NonNull List<? extends INode> childNodes, @Nullable Object view) {
-        super.paintSelectionFeedback(graphics, parentNode, childNodes, view);
-
-        boolean showDependents = true;
-        if (sShowStructure) {
-            childNodes = Arrays.asList(parentNode.getChildren());
-            // Avoid painting twice - both as incoming and outgoing
-            showDependents = false;
-        } else if (!sShowConstraints) {
-            return;
-        }
-
-        ConstraintPainter.paintSelectionFeedback(graphics, parentNode, childNodes, showDependents);
-    }
-
-    // ==== Drag'n'drop support ====
-
-    @Override
-    public DropFeedback onDropEnter(@NonNull INode targetNode, @Nullable Object targetView,
-            @Nullable IDragElement[] elements) {
-        return new DropFeedback(new MoveHandler(targetNode, elements, mRulesEngine),
-                new GuidelinePainter());
-    }
-
-    @Override
-    public DropFeedback onDropMove(@NonNull INode targetNode, @NonNull IDragElement[] elements,
-            @Nullable DropFeedback feedback, @NonNull Point p) {
-        if (elements == null || elements.length == 0 || feedback == null) {
-            return null;
-        }
-
-        MoveHandler state = (MoveHandler) feedback.userData;
-        int offsetX = p.x + (feedback.dragBounds != null ? feedback.dragBounds.x : 0);
-        int offsetY = p.y + (feedback.dragBounds != null ? feedback.dragBounds.y : 0);
-        state.updateMove(feedback, elements, offsetX, offsetY, feedback.modifierMask);
-
-        // Or maybe only do this if the results changed...
-        feedback.requestPaint = true;
-
-        return feedback;
-    }
-
-    @Override
-    public void onDropLeave(@NonNull INode targetNode, @NonNull IDragElement[] elements,
-            @Nullable DropFeedback feedback) {
-    }
-
-    @Override
-    public void onDropped(final @NonNull INode targetNode, final @NonNull IDragElement[] elements,
-            final @Nullable DropFeedback feedback, final @NonNull Point p) {
-        if (feedback == null) {
-            return;
-        }
-
-        final MoveHandler state = (MoveHandler) feedback.userData;
-
-        final Map<String, Pair<String, String>> idMap = getDropIdMap(targetNode, elements,
-                feedback.isCopy || !feedback.sameCanvas);
-
-        targetNode.editXml("Dropped", new INodeHandler() {
-            @Override
-            public void handle(@NonNull INode n) {
-                int index = -1;
-
-                // Remove cycles
-                state.removeCycles();
-
-                // Now write the new elements.
-                INode previous = null;
-                for (IDragElement element : elements) {
-                    String fqcn = element.getFqcn();
-
-                    // index==-1 means to insert at the end.
-                    // Otherwise increment the insertion position.
-                    if (index >= 0) {
-                        index++;
-                    }
-
-                    INode newChild = targetNode.insertChildAt(fqcn, index);
-
-                    // Copy all the attributes, modifying them as needed.
-                    addAttributes(newChild, element, idMap, BaseLayoutRule.DEFAULT_ATTR_FILTER);
-                    addInnerElements(newChild, element, idMap);
-
-                    if (previous == null) {
-                        state.applyConstraints(newChild);
-                        previous = newChild;
-                    } else {
-                        // Arrange the nodes next to each other, depending on which
-                        // edge we are attaching to. For example, if attaching to the
-                        // top edge, arrange the subsequent nodes in a column below it.
-                        //
-                        // TODO: Try to do something smarter here where we detect
-                        // constraints between the dragged edges, and we preserve these.
-                        // We have to do this carefully though because if the
-                        // constraints go through some other nodes not part of the
-                        // selection, this doesn't work right, and you might be
-                        // dragging several connected components, which we'd then
-                        // need to stitch together such that they are all visible.
-
-                        state.attachPrevious(previous, newChild);
-                        previous = newChild;
-                    }
-                }
-            }
-        });
-    }
-
-    @Override
-    public void onChildInserted(@NonNull INode node, @NonNull INode parent,
-            @NonNull InsertType insertType) {
-        // TODO: Handle more generically some way to ensure that widgets with no
-        // intrinsic size get some minimum size until they are attached on multiple
-        // opposing sides.
-        //String fqcn = node.getFqcn();
-        //if (fqcn.equals(FQCN_EDIT_TEXT)) {
-        //    node.setAttribute(ANDROID_URI, ATTR_LAYOUT_WIDTH, "100dp"); //$NON-NLS-1$
-        //}
-    }
-
-    @Override
-    public void onRemovingChildren(@NonNull List<INode> deleted, @NonNull INode parent,
-            boolean moved) {
-        super.onRemovingChildren(deleted, parent, moved);
-
-        if (!moved) {
-            DeletionHandler handler = new DeletionHandler(deleted, Collections.<INode>emptyList(),
-                    parent);
-            handler.updateConstraints();
-        }
-    }
-
-    // ==== Resize Support ====
-
-    @Override
-    public DropFeedback onResizeBegin(@NonNull INode child, @NonNull INode parent,
-            @Nullable SegmentType horizontalEdgeType, @Nullable SegmentType verticalEdgeType,
-            @Nullable Object childView, @Nullable Object parentView) {
-        ResizeHandler state = new ResizeHandler(parent, child, mRulesEngine,
-                horizontalEdgeType, verticalEdgeType);
-        return new DropFeedback(state, new GuidelinePainter());
-    }
-
-    @Override
-    public void onResizeUpdate(@Nullable DropFeedback feedback, @NonNull INode child,
-            @NonNull INode parent, @NonNull Rect newBounds,
-            int modifierMask) {
-        if (feedback == null) {
-            return;
-        }
-
-        ResizeHandler state = (ResizeHandler) feedback.userData;
-        state.updateResize(feedback, child, newBounds, modifierMask);
-    }
-
-    @Override
-    public void onResizeEnd(@Nullable DropFeedback feedback, @NonNull INode child,
-            @NonNull INode parent, final @NonNull Rect newBounds) {
-        if (feedback == null) {
-            return;
-        }
-        final ResizeHandler state = (ResizeHandler) feedback.userData;
-
-        child.editXml("Resize", new INodeHandler() {
-            @Override
-            public void handle(@NonNull INode n) {
-                state.removeCycles();
-                state.applyConstraints(n);
-            }
-        });
-    }
-
-    // ==== Layout Actions Bar ====
-
-    @Override
-    public void addLayoutActions(
-            @NonNull List<RuleAction> actions,
-            final @NonNull INode parentNode,
-            final @NonNull List<? extends INode> children) {
-        super.addLayoutActions(actions, parentNode, children);
-
-        actions.add(createGravityAction(Collections.<INode>singletonList(parentNode),
-                ATTR_GRAVITY));
-        actions.add(RuleAction.createSeparator(25));
-        actions.add(createMarginAction(parentNode, children));
-
-        IMenuCallback callback = new IMenuCallback() {
-            @Override
-            public void action(@NonNull RuleAction action,
-                    @NonNull List<? extends INode> selectedNodes,
-                    final @Nullable String valueId,
-                    final @Nullable Boolean newValue) {
-                final String id = action.getId();
-                if (id.equals(ACTION_CENTER_VERTICAL)|| id.equals(ACTION_CENTER_HORIZONTAL)) {
-                    parentNode.editXml("Center", new INodeHandler() {
-                        @Override
-                        public void handle(@NonNull INode n) {
-                            if (id.equals(ACTION_CENTER_VERTICAL)) {
-                                for (INode child : children) {
-                                    centerVertically(child);
-                                }
-                            } else if (id.equals(ACTION_CENTER_HORIZONTAL)) {
-                                for (INode child : children) {
-                                    centerHorizontally(child);
-                                }
-                            }
-                            mRulesEngine.redraw();
-                        }
-
-                    });
-                } else if (id.equals(ACTION_SHOW_CONSTRAINTS)) {
-                    sShowConstraints = !sShowConstraints;
-                    mRulesEngine.redraw();
-                } else {
-                    assert id.equals(ACTION_SHOW_STRUCTURE);
-                    sShowStructure = !sShowStructure;
-                    mRulesEngine.redraw();
-                }
-            }
-        };
-
-        // Centering actions
-        if (children != null && children.size() > 0) {
-                        actions.add(RuleAction.createSeparator(150));
-            actions.add(RuleAction.createAction(ACTION_CENTER_VERTICAL, "Center Vertically",
-                    callback, ICON_CENTER_VERTICALLY, 160, false));
-            actions.add(RuleAction.createAction(ACTION_CENTER_HORIZONTAL, "Center Horizontally",
-                    callback, ICON_CENTER_HORIZONTALLY, 170, false));
-        }
-
-        actions.add(RuleAction.createSeparator(80));
-        actions.add(RuleAction.createToggle(ACTION_SHOW_CONSTRAINTS, "Show Constraints",
-                sShowConstraints, callback, ICON_SHOW_CONSTRAINTS, 180, false));
-        actions.add(RuleAction.createToggle(ACTION_SHOW_STRUCTURE, "Show All Relationships",
-                sShowStructure, callback, ICON_SHOW_STRUCTURE, 190, false));
-    }
-
-    private void centerHorizontally(INode node) {
-        // Clear horizontal-oriented attributes from the node
-        node.setAttribute(ANDROID_URI, ATTR_LAYOUT_ALIGN_PARENT_LEFT, null);
-        node.setAttribute(ANDROID_URI, ATTR_LAYOUT_ALIGN_LEFT, null);
-        node.setAttribute(ANDROID_URI, ATTR_LAYOUT_TO_RIGHT_OF, null);
-        node.setAttribute(ANDROID_URI, ATTR_LAYOUT_CENTER_HORIZONTAL, null);
-        node.setAttribute(ANDROID_URI, ATTR_LAYOUT_ALIGN_PARENT_RIGHT, null);
-        node.setAttribute(ANDROID_URI, ATTR_LAYOUT_ALIGN_RIGHT, null);
-        node.setAttribute(ANDROID_URI, ATTR_LAYOUT_TO_LEFT_OF, null);
-        node.setAttribute(ANDROID_URI, ATTR_LAYOUT_CENTER_HORIZONTAL, null);
-
-        if (VALUE_TRUE.equals(node.getStringAttr(ANDROID_URI, ATTR_LAYOUT_CENTER_IN_PARENT))) {
-            // Already done
-        } else if (VALUE_TRUE.equals(node.getStringAttr(ANDROID_URI,
-                ATTR_LAYOUT_CENTER_VERTICAL))) {
-            node.setAttribute(ANDROID_URI, ATTR_LAYOUT_CENTER_VERTICAL, null);
-            node.setAttribute(ANDROID_URI, ATTR_LAYOUT_CENTER_IN_PARENT, VALUE_TRUE);
-        } else {
-            node.setAttribute(ANDROID_URI, ATTR_LAYOUT_CENTER_HORIZONTAL, VALUE_TRUE);
-        }
-    }
-
-    private void centerVertically(INode node) {
-        // Clear vertical-oriented attributes from the node
-        node.setAttribute(ANDROID_URI, ATTR_LAYOUT_ALIGN_PARENT_TOP, null);
-        node.setAttribute(ANDROID_URI, ATTR_LAYOUT_ALIGN_TOP, null);
-        node.setAttribute(ANDROID_URI, ATTR_LAYOUT_BELOW, null);
-        node.setAttribute(ANDROID_URI, ATTR_LAYOUT_ALIGN_PARENT_BOTTOM, null);
-        node.setAttribute(ANDROID_URI, ATTR_LAYOUT_ALIGN_BOTTOM, null);
-        node.setAttribute(ANDROID_URI, ATTR_LAYOUT_ABOVE, null);
-        node.setAttribute(ANDROID_URI, ATTR_LAYOUT_CENTER_VERTICAL, null);
-        node.setAttribute(ANDROID_URI, ATTR_LAYOUT_ALIGN_BASELINE, null);
-
-        // Center vertically
-        if (VALUE_TRUE.equals(node.getStringAttr(ANDROID_URI, ATTR_LAYOUT_CENTER_IN_PARENT))) {
-            // ALready done
-        } else if (VALUE_TRUE.equals(node.getStringAttr(ANDROID_URI,
-                ATTR_LAYOUT_CENTER_HORIZONTAL))) {
-            node.setAttribute(ANDROID_URI, ATTR_LAYOUT_CENTER_HORIZONTAL, null);
-            node.setAttribute(ANDROID_URI, ATTR_LAYOUT_CENTER_IN_PARENT, VALUE_TRUE);
-        } else {
-            node.setAttribute(ANDROID_URI, ATTR_LAYOUT_CENTER_VERTICAL, VALUE_TRUE);
-        }
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/ResizeState.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/ResizeState.java
deleted file mode 100644
index 42b9083..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/ResizeState.java
+++ /dev/null
@@ -1,131 +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.layout;
-
-import static com.android.SdkConstants.VALUE_N_DP;
-import static com.android.SdkConstants.VALUE_WRAP_CONTENT;
-
-import com.android.ide.common.api.INode;
-import com.android.ide.common.api.Rect;
-import com.android.ide.common.api.Segment;
-import com.android.ide.common.api.SegmentType;
-
-/** State held during resizing operations */
-class ResizeState {
-    /**
-     * The associated rule
-     */
-    private final BaseLayoutRule mRule;
-
-    /**
-     * The node being resized
-     */
-    public final INode node;
-
-     /**
-      * The layout containing the resized node
-      */
-    public final INode layout;
-
-    /** The proposed resized bounds of the node */
-    public Rect bounds;
-
-    /** The preferred wrap_content bounds of the node */
-    public Rect wrapBounds;
-
-    /** The suggested horizontal fill_parent guideline position */
-    public Segment horizontalFillSegment;
-
-    /** The suggested vertical fill_parent guideline position */
-    public Segment verticalFillSegment;
-
-    /** The type of horizontal edge being resized, or null */
-    public SegmentType horizontalEdgeType;
-
-    /** The type of vertical edge being resized, or null */
-    public SegmentType verticalEdgeType;
-
-    /** Whether the user has snapped to the wrap_content width */
-    public boolean wrapWidth;
-
-    /** Whether the user has snapped to the wrap_content height */
-    public boolean wrapHeight;
-
-    /** Whether the user has snapped to the match_parent width */
-    public boolean fillWidth;
-
-    /** Whether the user has snapped to the match_parent height */
-    public boolean fillHeight;
-
-    /** Custom field for use by subclasses */
-    public Object clientData;
-
-    /** Keyboard mask */
-    public int modifierMask;
-
-    /**
-     * The actual view object for the layout containing the resizing operation,
-     * or null if not known
-     */
-    public Object layoutView;
-
-    /**
-     * Constructs a new {@link ResizeState}
-     *
-     * @param rule the associated rule
-     * @param layout the parent layout containing the resized node
-     * @param layoutView the actual View instance for the layout, or null if not known
-     * @param node the node being resized
-     */
-    ResizeState(BaseLayoutRule rule, INode layout, Object layoutView, INode node) {
-        mRule = rule;
-
-        this.layout = layout;
-        this.node = node;
-        this.layoutView = layoutView;
-    }
-
-    /**
-     * Returns the width attribute to be set to match the new bounds
-     *
-     * @return the width string, never null
-     */
-    public String getWidthAttribute() {
-        if (wrapWidth) {
-            return VALUE_WRAP_CONTENT;
-        } else if (fillWidth) {
-            return mRule.getFillParentValueName();
-        } else {
-            return String.format(VALUE_N_DP, mRule.mRulesEngine.pxToDp(bounds.w));
-        }
-    }
-
-    /**
-     * Returns the height attribute to be set to match the new bounds
-     *
-     * @return the height string, never null
-     */
-    public String getHeightAttribute() {
-        if (wrapHeight) {
-            return VALUE_WRAP_CONTENT;
-        } else if (fillHeight) {
-            return mRule.getFillParentValueName();
-        } else {
-            return String.format(VALUE_N_DP, mRule.mRulesEngine.pxToDp(bounds.h));
-        }
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/ScrollViewRule.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/ScrollViewRule.java
deleted file mode 100644
index 9f2b4ae..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/ScrollViewRule.java
+++ /dev/null
@@ -1,96 +0,0 @@
-/*
- * Copyright (C) 2010 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.layout;
-
-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_ORIENTATION;
-import static com.android.SdkConstants.FQCN_LINEAR_LAYOUT;
-import static com.android.SdkConstants.VALUE_VERTICAL;
-
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-import com.android.ide.common.api.DrawingStyle;
-import com.android.ide.common.api.DropFeedback;
-import com.android.ide.common.api.IDragElement;
-import com.android.ide.common.api.IGraphics;
-import com.android.ide.common.api.INode;
-import com.android.ide.common.api.IViewRule;
-import com.android.ide.common.api.InsertType;
-import com.android.ide.common.api.Point;
-import com.android.ide.common.api.Rect;
-
-/**
- * An {@link IViewRule} for android.widget.ScrollView.
- */
-public class ScrollViewRule extends FrameLayoutRule {
-
-    @Override
-    public void onChildInserted(@NonNull INode child, @NonNull INode parent,
-            @NonNull InsertType insertType) {
-        super.onChildInserted(child, parent, insertType);
-
-        // The child of the ScrollView should fill in both directions
-        String fillParent = getFillParentValueName();
-        child.setAttribute(ANDROID_URI, ATTR_LAYOUT_WIDTH, fillParent);
-        child.setAttribute(ANDROID_URI, ATTR_LAYOUT_HEIGHT, fillParent);
-    }
-
-    @Override
-    public void onCreate(@NonNull INode node, @NonNull INode parent,
-            @NonNull InsertType insertType) {
-        super.onCreate(node, parent, insertType);
-
-        if (insertType.isCreate()) {
-            // Insert a default linear layout (which will in turn be registered as
-            // a child of this node and the create child method above will set its
-            // fill parent attributes, its id, etc.
-            INode linear = node.appendChild(FQCN_LINEAR_LAYOUT);
-            linear.setAttribute(ANDROID_URI, ATTR_ORIENTATION, VALUE_VERTICAL);
-        }
-    }
-
-    @Override
-    public DropFeedback onDropMove(@NonNull INode targetNode, @NonNull IDragElement[] elements,
-            @Nullable DropFeedback feedback, @NonNull Point p) {
-        DropFeedback f = super.onDropMove(targetNode, elements, feedback, p);
-
-        // ScrollViews only allow a single child
-        if (targetNode.getChildren().length > 0) {
-            f.invalidTarget = true;
-        }
-        return f;
-    }
-
-    @Override
-    protected void drawFeedback(
-            IGraphics gc,
-            INode targetNode,
-            IDragElement[] elements,
-            DropFeedback feedback) {
-        if (targetNode.getChildren().length > 0) {
-            Rect b = targetNode.getBounds();
-            if (b.isValid()) {
-                gc.useStyle(DrawingStyle.DROP_RECIPIENT);
-                gc.drawRect(b);
-            }
-        } else {
-            super.drawFeedback(gc, targetNode, elements, feedback);
-        }
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/SeekBarRule.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/SeekBarRule.java
deleted file mode 100644
index b88f8ab..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/SeekBarRule.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Copyright (C) 2010 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.layout;
-
-import static com.android.SdkConstants.ANDROID_URI;
-import static com.android.SdkConstants.ATTR_LAYOUT_WIDTH;
-
-import com.android.annotations.NonNull;
-import com.android.ide.common.api.INode;
-import com.android.ide.common.api.IViewRule;
-import com.android.ide.common.api.InsertType;
-
-/**
- * An {@link IViewRule} for android.widget.SeekBar
- */
-public class SeekBarRule extends BaseViewRule {
-
-    @Override
-    public void onCreate(@NonNull INode node, @NonNull INode parent,
-            @NonNull InsertType insertType) {
-        super.onCreate(node, parent, insertType);
-
-        // A SeekBar isn't useful with wrap_content because it packs itself down to
-        // almost no usable width -- so just make it grow in all layouts
-        node.setAttribute(ANDROID_URI, ATTR_LAYOUT_WIDTH, getFillParentValueName());
-    }
-
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/SlidingDrawerRule.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/SlidingDrawerRule.java
deleted file mode 100644
index e4267bb..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/SlidingDrawerRule.java
+++ /dev/null
@@ -1,68 +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.layout;
-
-import static com.android.SdkConstants.ATTR_CONTENT;
-import static com.android.SdkConstants.ATTR_HANDLE;
-import static com.android.SdkConstants.ATTR_ID;
-import static com.android.SdkConstants.ATTR_LAYOUT_HEIGHT;
-import static com.android.SdkConstants.ATTR_LAYOUT_WIDTH;
-import static com.android.SdkConstants.ATTR_TEXT;
-
-
-import com.android.SdkConstants;
-import static com.android.SdkConstants.ANDROID_URI;
-import com.android.annotations.NonNull;
-import com.android.ide.common.api.INode;
-import com.android.ide.common.api.IViewRule;
-import com.android.ide.common.api.InsertType;
-
-/**
- * An {@link IViewRule} for android.widget.SlidingDrawerRule which initializes new sliding
- * drawers with their mandatory children and default sizing attributes
- */
-public class SlidingDrawerRule extends BaseLayoutRule {
-
-    @Override
-    public void onCreate(@NonNull INode node, @NonNull INode parent,
-            @NonNull InsertType insertType) {
-        super.onCreate(node, parent, insertType);
-
-        if (insertType.isCreate()) {
-            String matchParent = getFillParentValueName();
-            node.setAttribute(ANDROID_URI, ATTR_LAYOUT_WIDTH, matchParent);
-            node.setAttribute(ANDROID_URI, ATTR_LAYOUT_HEIGHT, matchParent);
-
-            // Create mandatory children and reference them from the handle and content
-            // attributes of the sliding drawer
-            String handleId = "@+id/handle";    //$NON-NLS-1$
-            String contentId = "@+id/content";  //$NON-NLS-1$
-            node.setAttribute(ANDROID_URI, ATTR_HANDLE, handleId);
-            node.setAttribute(ANDROID_URI, ATTR_CONTENT, contentId);
-
-            // Handle
-            INode handle = node.appendChild(SdkConstants.FQCN_BUTTON);
-            handle.setAttribute(ANDROID_URI, ATTR_TEXT, "Handle");
-            handle.setAttribute(ANDROID_URI, ATTR_ID, handleId);
-
-            // Content
-            INode content = node.appendChild(SdkConstants.FQCN_LINEAR_LAYOUT);
-            content.setAttribute(ANDROID_URI, ATTR_ID, contentId);
-            content.setAttribute(ANDROID_URI, ATTR_LAYOUT_WIDTH, matchParent);
-            content.setAttribute(ANDROID_URI, ATTR_LAYOUT_HEIGHT, matchParent);
-        }
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/TabHostRule.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/TabHostRule.java
deleted file mode 100644
index cb2153b..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/TabHostRule.java
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- * Copyright (C) 2010 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.layout;
-
-import static com.android.SdkConstants.ANDROID_URI;
-import static com.android.SdkConstants.ATTR_ID;
-import static com.android.SdkConstants.ATTR_LAYOUT_HEIGHT;
-import static com.android.SdkConstants.ATTR_LAYOUT_WIDTH;
-import static com.android.SdkConstants.ATTR_ORIENTATION;
-import static com.android.SdkConstants.FQCN_FRAME_LAYOUT;
-import static com.android.SdkConstants.FQCN_LINEAR_LAYOUT;
-import static com.android.SdkConstants.FQCN_TAB_WIDGET;
-import static com.android.SdkConstants.VALUE_VERTICAL;
-import static com.android.SdkConstants.VALUE_WRAP_CONTENT;
-
-import com.android.annotations.NonNull;
-import com.android.ide.common.api.INode;
-import com.android.ide.common.api.IViewRule;
-import com.android.ide.common.api.InsertType;
-
-/**
- * An {@link IViewRule} for android.widget.TabHost.
- */
-public class TabHostRule extends IgnoredLayoutRule {
-    // The TabHost layout states in its documentation that you typically
-    // manipulate its children via the TabHost rather than directly manipulating
-    // the child elements yourself, e.g. via addTab() etc.
-
-    @Override
-    public void onCreate(@NonNull INode node, @NonNull INode parent,
-            @NonNull InsertType insertType) {
-        super.onCreate(node, parent, insertType);
-
-        if (insertType.isCreate()) {
-            String fillParent = getFillParentValueName();
-
-            // Configure default Table setup as described in the Table tutorial
-            node.setAttribute(ANDROID_URI, ATTR_ID, "@android:id/tabhost"); //$NON-NLS-1$
-            node.setAttribute(ANDROID_URI, ATTR_LAYOUT_WIDTH, fillParent);
-            node.setAttribute(ANDROID_URI, ATTR_LAYOUT_HEIGHT, fillParent);
-
-            INode linear = node.appendChild(FQCN_LINEAR_LAYOUT);
-            linear.setAttribute(ANDROID_URI, ATTR_LAYOUT_WIDTH, fillParent);
-            linear.setAttribute(ANDROID_URI, ATTR_LAYOUT_HEIGHT, fillParent);
-            linear.setAttribute(ANDROID_URI, ATTR_ORIENTATION,
-                    VALUE_VERTICAL);
-
-            INode tab = linear.appendChild(FQCN_TAB_WIDGET);
-            tab.setAttribute(ANDROID_URI, ATTR_LAYOUT_WIDTH, fillParent);
-            tab.setAttribute(ANDROID_URI, ATTR_LAYOUT_HEIGHT, VALUE_WRAP_CONTENT);
-            tab.setAttribute(ANDROID_URI, ATTR_ID, "@android:id/tabs"); //$NON-NLS-1$
-
-            INode frame = linear.appendChild(FQCN_FRAME_LAYOUT);
-            frame.setAttribute(ANDROID_URI, ATTR_LAYOUT_WIDTH, fillParent);
-            frame.setAttribute(ANDROID_URI, ATTR_LAYOUT_HEIGHT, fillParent);
-            frame.setAttribute(ANDROID_URI, ATTR_ID, "@android:id/tabcontent"); //$NON-NLS-1$
-
-            for (int i = 0; i < 3; i++) {
-                INode child = frame.appendChild(FQCN_LINEAR_LAYOUT);
-                child.setAttribute(ANDROID_URI, ATTR_LAYOUT_WIDTH, fillParent);
-                child.setAttribute(ANDROID_URI, ATTR_LAYOUT_HEIGHT, fillParent);
-                child.setAttribute(ANDROID_URI, ATTR_ID,
-                        String.format("@+id/tab%d", i + 1)); //$NON-NLS-1$
-            }
-        }
-    }
-
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/TabWidgetRule.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/TabWidgetRule.java
deleted file mode 100755
index 7ebaea5..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/TabWidgetRule.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * Copyright (C) 2010 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.layout;
-
-import com.android.ide.common.api.IViewRule;
-
-/**
- * An {@link IViewRule} for android.widget.TabWidget.
- */
-public class TabWidgetRule extends IgnoredLayoutRule {
-    // TabWidgets aren't configurable as plain LinearLayout since they
-    // are supposed to be manipulated by their parent TabHost.
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/TableLayoutRule.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/TableLayoutRule.java
deleted file mode 100644
index b6aeeb4..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/TableLayoutRule.java
+++ /dev/null
@@ -1,218 +0,0 @@
-/*
- * Copyright (C) 2010 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.layout;
-
-import static com.android.SdkConstants.FQCN_TABLE_ROW;
-
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-import com.android.ide.common.api.DropFeedback;
-import com.android.ide.common.api.IClientRulesEngine;
-import com.android.ide.common.api.IMenuCallback;
-import com.android.ide.common.api.INode;
-import com.android.ide.common.api.INodeHandler;
-import com.android.ide.common.api.IViewRule;
-import com.android.ide.common.api.InsertType;
-import com.android.ide.common.api.RuleAction;
-import com.android.ide.common.api.SegmentType;
-
-import java.net.URL;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-/**
- * An {@link IViewRule} for android.widget.TableLayout.
- */
-public class TableLayoutRule extends LinearLayoutRule {
-    // A table is a linear layout, but with a few differences:
-    // the default is vertical, not horizontal
-    // The fill of all children should be wrap_content
-
-    private static final String ACTION_ADD_ROW = "_addrow"; //$NON-NLS-1$
-    private static final String ACTION_REMOVE_ROW = "_removerow"; //$NON-NLS-1$
-    private static final URL ICON_ADD_ROW =
-        TableLayoutRule.class.getResource("addrow.png"); //$NON-NLS-1$
-    private static final URL ICON_REMOVE_ROW =
-        TableLayoutRule.class.getResource("removerow.png"); //$NON-NLS-1$
-
-    @Override
-    protected boolean isVertical(INode node) {
-        // Tables are always vertical
-        return true;
-    }
-
-    @Override
-    protected boolean supportsOrientation() {
-        return false;
-    }
-
-    @Override
-    public void onChildInserted(@NonNull INode child, @NonNull INode parent,
-            @NonNull InsertType insertType) {
-        // Overridden to inhibit the setting of layout_width/layout_height since
-        // it should always be match_parent
-    }
-
-    /**
-     * Add an explicit "Add Row" action to the context menu
-     */
-    @Override
-    public void addContextMenuActions(@NonNull List<RuleAction> actions,
-            final @NonNull INode selectedNode) {
-        super.addContextMenuActions(actions, selectedNode);
-
-        IMenuCallback addTab = new IMenuCallback() {
-            @Override
-            public void action(
-                    @NonNull RuleAction action,
-                    @NonNull List<? extends INode> selectedNodes,
-                    final @Nullable String valueId,
-                    @Nullable Boolean newValue) {
-                final INode node = selectedNode;
-                INode newRow = node.appendChild(FQCN_TABLE_ROW);
-                mRulesEngine.select(Collections.singletonList(newRow));
-            }
-        };
-        actions.add(RuleAction.createAction("_addrow", "Add Row", addTab, null, 5, false)); //$NON-NLS-1$
-    }
-
-    @Override
-    public void addLayoutActions(
-            @NonNull List<RuleAction> actions,
-            final @NonNull INode parentNode,
-            final @NonNull List<? extends INode> children) {
-        super.addLayoutActions(actions, parentNode, children);
-        addTableLayoutActions(mRulesEngine, actions, parentNode, children);
-    }
-
-    /**
-     * Adds layout actions to add and remove toolbar items
-     */
-    static void addTableLayoutActions(final IClientRulesEngine rulesEngine,
-            List<RuleAction> actions, final INode parentNode,
-            final List<? extends INode> children) {
-        IMenuCallback actionCallback = new IMenuCallback() {
-            @Override
-            public void action(
-                    final @NonNull RuleAction action,
-                    @NonNull List<? extends INode> selectedNodes,
-                    final @Nullable String valueId,
-                    final @Nullable Boolean newValue) {
-                parentNode.editXml("Add/Remove Table Row", new INodeHandler() {
-                    @Override
-                    public void handle(@NonNull INode n) {
-                        if (action.getId().equals(ACTION_ADD_ROW)) {
-                            // Determine the index of the selection, if any; if there is
-                            // a selection, insert the row before the current row, otherwise
-                            // append it to the table.
-                            int index = -1;
-                            INode[] rows = parentNode.getChildren();
-                            if (children != null) {
-                                findTableIndex:
-                                for (INode child : children) {
-                                    // Find direct child of table layout
-                                    while (child != null && child.getParent() != parentNode) {
-                                        child = child.getParent();
-                                    }
-                                    if (child != null) {
-                                        // Compute index of direct child of table layout
-                                        for (int i = 0; i < rows.length; i++) {
-                                            if (rows[i] == child) {
-                                                index = i;
-                                                break findTableIndex;
-                                            }
-                                        }
-                                    }
-                                }
-                            }
-                            INode newRow;
-                            if (index == -1) {
-                                newRow = parentNode.appendChild(FQCN_TABLE_ROW);
-                            } else {
-                                newRow = parentNode.insertChildAt(FQCN_TABLE_ROW, index);
-                            }
-                            rulesEngine.select(Collections.singletonList(newRow));
-                        } else if (action.getId().equals(ACTION_REMOVE_ROW)) {
-                            // Find the direct children of the TableLayout to delete;
-                            // this is necessary since TableRow might also use
-                            // this implementation, so the parentNode is the true
-                            // TableLayout but the children might be grand children.
-                            Set<INode> targets = new HashSet<INode>();
-                            for (INode child : children) {
-                                while (child != null && child.getParent() != parentNode) {
-                                    child = child.getParent();
-                                }
-                                if (child != null) {
-                                    targets.add(child);
-                                }
-                            }
-                            for (INode target : targets) {
-                                parentNode.removeChild(target);
-                            }
-                        }
-                    }
-                });
-            }
-        };
-
-        // Add Row
-        actions.add(RuleAction.createSeparator(150));
-        actions.add(RuleAction.createAction(ACTION_ADD_ROW, "Add Table Row", actionCallback,
-                ICON_ADD_ROW, 160, false));
-
-        // Remove Row (if something is selected)
-        if (children != null && children.size() > 0) {
-            actions.add(RuleAction.createAction(ACTION_REMOVE_ROW, "Remove Table Row",
-                    actionCallback, ICON_REMOVE_ROW, 170, false));
-        }
-    }
-
-    @Override
-    public void onCreate(@NonNull INode node, @NonNull INode parent,
-            @NonNull InsertType insertType) {
-        super.onCreate(node, parent, insertType);
-
-        if (insertType.isCreate()) {
-            // Start the table with 4 rows
-            for (int i = 0; i < 4; i++) {
-                node.appendChild(FQCN_TABLE_ROW);
-            }
-        }
-    }
-
-    @Override
-    public DropFeedback onResizeBegin(@NonNull INode child, @NonNull INode parent,
-            @Nullable SegmentType horizontalEdge, @Nullable SegmentType verticalEdge,
-            @Nullable Object childView, @Nullable Object parentView) {
-        // Children of a table layout cannot set their widths (it is controlled by column
-        // settings on the table). They can set their heights (though for TableRow, the
-        // height is always wrap_content).
-        if (horizontalEdge == null) { // Widths are edited by vertical edges.
-            // The user is not editing a vertical height so don't allow resizing at all
-            return null;
-        }
-        if (child.getFqcn().equals(FQCN_TABLE_ROW)) {
-            // TableRows are always WRAP_CONTENT
-            return null;
-        }
-
-        // Allow resizing heights only
-        return super.onResizeBegin(child, parent, horizontalEdge, null /*verticalEdge*/,
-                childView, parentView);
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/TableRowRule.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/TableRowRule.java
deleted file mode 100644
index 6e3f202..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/TableRowRule.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- * Copyright (C) 2010 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.layout;
-
-import static com.android.SdkConstants.FQCN_TABLE_LAYOUT;
-
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-import com.android.ide.common.api.DropFeedback;
-import com.android.ide.common.api.INode;
-import com.android.ide.common.api.IViewRule;
-import com.android.ide.common.api.InsertType;
-import com.android.ide.common.api.RuleAction;
-import com.android.ide.common.api.SegmentType;
-
-import java.util.List;
-
-/**
- * An {@link IViewRule} for android.widget.TableRow.
- */
-public class TableRowRule extends LinearLayoutRule {
-    @Override
-    protected boolean isVertical(INode node) {
-        return false;
-    }
-
-    @Override
-    protected boolean supportsOrientation() {
-        return false;
-    }
-
-    @Override
-    public void onChildInserted(@NonNull INode child, @NonNull INode parent,
-            @NonNull InsertType insertType) {
-        // Overridden to inhibit the setting of layout_width/layout_height since
-        // the table row will enforce match_parent and wrap_content for width and height
-        // respectively.
-    }
-
-    @Override
-    public void addLayoutActions(
-            @NonNull List<RuleAction> actions,
-            final @NonNull INode parentNode,
-            final @NonNull List<? extends INode> children) {
-        super.addLayoutActions(actions, parentNode, children);
-
-        // Also apply table-specific actions on the table row such that you can
-        // select something in a table row and still get offered actions on the surrounding
-        // table.
-        if (children != null) {
-            INode grandParent = parentNode.getParent();
-            if (grandParent != null && grandParent.getFqcn().equals(FQCN_TABLE_LAYOUT)) {
-                TableLayoutRule.addTableLayoutActions(mRulesEngine, actions, grandParent,
-                        children);
-            }
-        }
-    }
-
-    @Override
-    public DropFeedback onResizeBegin(@NonNull INode child, @NonNull INode parent,
-            @Nullable SegmentType horizontalEdge, @Nullable SegmentType verticalEdge,
-            @Nullable Object childView, @Nullable Object parentView) {
-        // No resizing in TableRows; the width is *always* match_parent and the height is
-        // *always* wrap_content.
-        return null;
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/TimePickerRule.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/TimePickerRule.java
deleted file mode 100755
index 1eb603d..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/TimePickerRule.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * Copyright (C) 2010 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.layout;
-
-import com.android.ide.common.api.IViewRule;
-
-/**
- * An {@link IViewRule} for android.widget.TimePicker.
- */
-public class TimePickerRule extends IgnoredLayoutRule {
-    // A TimePicker inherits from FrameLayout but is not a general purpose
-    // FrameLayout
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/ViewRule.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/ViewRule.java
deleted file mode 100755
index a7b23ab..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/ViewRule.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Copyright (C) 2010 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.layout;
-
-import com.android.ide.common.api.IViewRule;
-
-/**
- * An {@link IViewRule} for android.view.View and all its derived classes. This
- * is the "root" rule, that is used whenever there is not more specific rule to
- * apply.
- * <p/>
- * There is no customization here, everything that is common to all views is
- * simply implemented in BaseViewRule.
- */
-public class ViewRule extends BaseViewRule {
-
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/ViewTagRule.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/ViewTagRule.java
deleted file mode 100644
index a89a3d8..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/ViewTagRule.java
+++ /dev/null
@@ -1,49 +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.ide.common.layout;
-
-import static com.android.SdkConstants.ATTR_CLASS;
-
-import com.android.annotations.NonNull;
-import com.android.ide.common.api.INode;
-import com.android.ide.common.api.IViewRule;
-import com.android.ide.common.api.InsertType;
-import com.android.ide.eclipse.adt.internal.editors.layout.descriptors.ViewElementDescriptor;
-
-/**
- * An {@link IViewRule} for the special XML {@code <view>} tag.
- */
-public class ViewTagRule extends BaseViewRule {
-    @Override
-    public void onCreate(@NonNull INode node, @NonNull INode parent,
-            @NonNull InsertType insertType) {
-        // When dropping a view tag, ask the user which custom view class to use
-        if (insertType == InsertType.CREATE) { // NOT InsertType.CREATE_PREVIEW
-            String fqcn = mRulesEngine.displayCustomViewClassInput();
-            if (fqcn != null) {
-                if (!ViewElementDescriptor.viewNeedsPackage(fqcn)) {
-                    fqcn = fqcn.substring(fqcn.lastIndexOf('.') + 1);
-                }
-                node.editXml("Set Custom View Class",
-                    new PropertySettingNodeHandler(null, ATTR_CLASS,
-                            fqcn.length() > 0 ? fqcn : null));
-            } else {
-                // Remove the view; the insertion was canceled
-                parent.removeChild(node);
-            }
-        }
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/WebViewRule.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/WebViewRule.java
deleted file mode 100644
index 42b06e6..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/WebViewRule.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Copyright (C) 2010 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.layout;
-
-import static com.android.SdkConstants.ANDROID_URI;
-import static com.android.SdkConstants.ATTR_LAYOUT_HEIGHT;
-import static com.android.SdkConstants.ATTR_LAYOUT_WIDTH;
-
-import com.android.annotations.NonNull;
-import com.android.ide.common.api.INode;
-import com.android.ide.common.api.IViewRule;
-import com.android.ide.common.api.InsertType;
-
-/**
- * An {@link IViewRule} for android.widget.ZoomControls.
- */
-public class WebViewRule extends IgnoredLayoutRule {
-    // A WebView is not a general purpose AbsoluteLayout you should drop stuff
-    // into; it's an AbsoluteLayout for implementation purposes.
-
-    @Override
-    public void onCreate(@NonNull INode node, @NonNull INode parent,
-            @NonNull InsertType insertType) {
-        super.onCreate(node, parent, insertType);
-
-        if (insertType.isCreate()) {
-            String matchParent = getFillParentValueName();
-            node.setAttribute(ANDROID_URI, ATTR_LAYOUT_WIDTH, matchParent);
-            node.setAttribute(ANDROID_URI, ATTR_LAYOUT_HEIGHT, matchParent);
-        }
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/ZoomButtonRule.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/ZoomButtonRule.java
deleted file mode 100644
index 66cbd45..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/ZoomButtonRule.java
+++ /dev/null
@@ -1,35 +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.layout;
-
-import static com.android.SdkConstants.ANDROID_URI;
-import static com.android.SdkConstants.ATTR_SRC;
-
-import com.android.annotations.NonNull;
-import com.android.ide.common.api.INode;
-import com.android.ide.common.api.InsertType;
-
-public class ZoomButtonRule extends BaseViewRule {
-    @Override
-    public void onCreate(@NonNull INode node, @NonNull INode parent,
-            @NonNull InsertType insertType) {
-        super.onCreate(node, parent, insertType);
-
-        if (insertType.isCreate()) {
-            node.setAttribute(ANDROID_URI, ATTR_SRC, "@android:drawable/btn_plus"); //$NON-NLS-1$
-        }
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/ZoomControlsRule.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/ZoomControlsRule.java
deleted file mode 100755
index 226bf4e..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/ZoomControlsRule.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * Copyright (C) 2010 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.layout;
-
-import com.android.ide.common.api.IViewRule;
-
-/**
- * An {@link IViewRule} for android.widget.ZoomControls.
- */
-public class ZoomControlsRule extends IgnoredLayoutRule {
-    // A ZoomControl is only a LinearLayout in terms of borrowing
-    // implementation; it does not behave like one in terms of configurability.
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/addcol.png b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/addcol.png
deleted file mode 100644
index 21391ef..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/addcol.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/addrow.png b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/addrow.png
deleted file mode 100644
index 0faa3e6..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/addrow.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/allweight.png b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/allweight.png
deleted file mode 100644
index 506c663..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/allweight.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/baseline.png b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/baseline.png
deleted file mode 100644
index acb187c..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/baseline.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/centerHorizontally.png b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/centerHorizontally.png
deleted file mode 100644
index 5053cda..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/centerHorizontally.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/centerVertically.png b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/centerVertically.png
deleted file mode 100644
index ebba8e8..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/centerVertically.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/clearweights.png b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/clearweights.png
deleted file mode 100644
index ad27c17..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/clearweights.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/constraints.png b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/constraints.png
deleted file mode 100644
index 7247d5a..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/constraints.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/distribute.png b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/distribute.png
deleted file mode 100644
index eac2340..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/distribute.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/fillheight.png b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/fillheight.png
deleted file mode 100644
index 38e137d..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/fillheight.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/fillwidth.png b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/fillwidth.png
deleted file mode 100644
index f272aab..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/fillwidth.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/gravity.png b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/gravity.png
deleted file mode 100644
index 4f20928..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/gravity.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/grid/GridDropHandler.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/grid/GridDropHandler.java
deleted file mode 100644
index 8bdb56b..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/grid/GridDropHandler.java
+++ /dev/null
@@ -1,840 +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.layout.grid;
-
-import static com.android.SdkConstants.ATTR_COLUMN_COUNT;
-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_ROW;
-import static com.android.SdkConstants.ATTR_LAYOUT_ROW_SPAN;
-import static com.android.ide.common.layout.GravityHelper.getGravity;
-import static com.android.ide.common.layout.GridLayoutRule.GRID_SIZE;
-import static com.android.ide.common.layout.GridLayoutRule.MARGIN_SIZE;
-import static com.android.ide.common.layout.GridLayoutRule.MAX_CELL_DIFFERENCE;
-import static com.android.ide.common.layout.GridLayoutRule.SHORT_GAP_DP;
-import static com.android.ide.common.layout.grid.GridModel.UNDEFINED;
-import static java.lang.Math.abs;
-
-import com.android.ide.common.api.DropFeedback;
-import com.android.ide.common.api.IDragElement;
-import com.android.ide.common.api.INode;
-import com.android.ide.common.api.IViewMetadata;
-import com.android.ide.common.api.Margins;
-import com.android.ide.common.api.Point;
-import com.android.ide.common.api.Rect;
-import com.android.ide.common.api.SegmentType;
-import com.android.ide.common.layout.BaseLayoutRule;
-import com.android.ide.common.layout.GravityHelper;
-import com.android.ide.common.layout.GridLayoutRule;
-import com.android.ide.eclipse.adt.internal.editors.layout.gre.ViewMetadataRepository;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.List;
-import java.util.Locale;
-
-/**
- * The {@link GridDropHandler} handles drag and drop operations into and within a
- * GridLayout, computing guidelines, handling drops to edit the grid model, and so on.
- */
-public class GridDropHandler {
-    private final GridModel mGrid;
-    private final GridLayoutRule mRule;
-    private GridMatch mColumnMatch;
-    private GridMatch mRowMatch;
-
-    /**
-     * Creates a new {@link GridDropHandler} for
-     * @param gridLayoutRule the corresponding {@link GridLayoutRule}
-     * @param layout the GridLayout node
-     * @param view the view instance of the grid layout receiving the drop
-     */
-    public GridDropHandler(GridLayoutRule gridLayoutRule, INode layout, Object view) {
-        mRule = gridLayoutRule;
-        mGrid = GridModel.get(mRule.getRulesEngine(), layout, view);
-    }
-
-    /**
-     * Computes the best horizontal and vertical matches for a drag to the given position.
-     *
-     * @param feedback a {@link DropFeedback} object containing drag state like the drag
-     *            bounds and the drag baseline
-     * @param p the mouse position
-     */
-    public void computeMatches(DropFeedback feedback, Point p) {
-        mRowMatch = mColumnMatch = null;
-        feedback.tooltip = null;
-
-        Rect bounds = mGrid.layout.getBounds();
-        int x1 = p.x;
-        int y1 = p.y;
-
-        Rect dragBounds = feedback.dragBounds;
-        int w = dragBounds != null ? dragBounds.w : 0;
-        int h = dragBounds != null ? dragBounds.h : 0;
-        if (!GridLayoutRule.sGridMode) {
-            if (dragBounds != null) {
-                // Sometimes the items are centered under the mouse so
-                // offset by the top left corner distance
-                x1 += dragBounds.x;
-                y1 += dragBounds.y;
-            }
-
-            int x2 = x1 + w;
-            int y2 = y1 + h;
-
-            if (x2 < bounds.x || y2 < bounds.y || x1 > bounds.x2() || y1 > bounds.y2()) {
-                return;
-            }
-
-            List<GridMatch> columnMatches = new ArrayList<GridMatch>();
-            List<GridMatch> rowMatches = new ArrayList<GridMatch>();
-            int max = BaseLayoutRule.getMaxMatchDistance();
-
-            // Column matches:
-            addLeftSideMatch(x1, columnMatches, max);
-            addRightSideMatch(x2, columnMatches, max);
-            addCenterColumnMatch(bounds, x1, y1, x2, y2, columnMatches, max);
-
-            // Row matches:
-            int row = (mGrid.getViewCount() == 0) ? 0 : mGrid.getClosestRow(y1);
-            int rowY = mGrid.getRowY(row);
-            addTopMatch(y1, rowMatches, max, row, rowY);
-            addBaselineMatch(feedback.dragBaseline, y1, rowMatches, max, row, rowY);
-            addBottomMatch(y2, rowMatches, max);
-
-            // Look for gap-matches: Predefined spacing between widgets.
-            // TODO: Make this use metadata for predefined spacing between
-            // pairs of types of components. For example, buttons have certain
-            // inserts in their 9-patch files (depending on the theme) that should
-            // be considered and subtracted from the overall proposed distance!
-            addColumnGapMatch(bounds, x1, x2, columnMatches, max);
-            addRowGapMatch(bounds, y1, y2, rowMatches, max);
-
-            // Fallback: Split existing cell. Also do snap-to-grid.
-            if (GridLayoutRule.sSnapToGrid) {
-                x1 = ((x1 - MARGIN_SIZE - bounds.x) / GRID_SIZE) * GRID_SIZE
-                        + MARGIN_SIZE + bounds.x;
-                y1 = ((y1 - MARGIN_SIZE - bounds.y) / GRID_SIZE) * GRID_SIZE
-                        + MARGIN_SIZE + bounds.y;
-                x2 = x1 + w;
-                y2 = y1 + h;
-            }
-
-
-            if (columnMatches.size() == 0 && x1 >= bounds.x) {
-                // Split the current cell since we have no matches
-                // TODO: Decide whether it should be gravity left or right...
-                columnMatches.add(new GridMatch(SegmentType.LEFT, 0, x1, mGrid.getColumn(x1),
-                        true /* createCell */, UNDEFINED));
-            }
-            if (rowMatches.size() == 0 && y1 >= bounds.y) {
-                rowMatches.add(new GridMatch(SegmentType.TOP, 0, y1, mGrid.getRow(y1),
-                        true /* createCell */, UNDEFINED));
-            }
-
-            // Pick best matches
-            Collections.sort(rowMatches);
-            Collections.sort(columnMatches);
-
-            mColumnMatch = null;
-            mRowMatch = null;
-            String columnDescription = null;
-            String rowDescription = null;
-            if (columnMatches.size() > 0) {
-                mColumnMatch = columnMatches.get(0);
-                columnDescription = mColumnMatch.getDisplayName(mGrid.layout);
-            }
-            if (rowMatches.size() > 0) {
-                mRowMatch = rowMatches.get(0);
-                rowDescription = mRowMatch.getDisplayName(mGrid.layout);
-            }
-
-            if (columnDescription != null && rowDescription != null) {
-                feedback.tooltip = columnDescription + '\n' + rowDescription;
-            }
-
-            feedback.invalidTarget = mColumnMatch == null || mRowMatch == null;
-        } else {
-            // Find which cell we're inside.
-
-            // TODO: Find out where within the cell we are, and offer to tweak the gravity
-            // based on the position.
-            int column = mGrid.getColumn(x1);
-            int row = mGrid.getRow(y1);
-
-            int leftDistance = mGrid.getColumnDistance(column, x1);
-            int rightDistance = mGrid.getColumnDistance(column + 1, x1);
-            int topDistance = mGrid.getRowDistance(row, y1);
-            int bottomDistance = mGrid.getRowDistance(row + 1, y1);
-
-            int SLOP = 2;
-            int radius = mRule.getNewCellSize();
-            if (rightDistance < radius + SLOP) {
-                column = Math.min(column + 1, mGrid.actualColumnCount);
-                leftDistance = rightDistance;
-            }
-            if (bottomDistance < radius + SLOP) {
-                row = Math.min(row + 1, mGrid.actualRowCount);
-                topDistance = bottomDistance;
-            }
-
-            boolean createColumn = leftDistance < radius + SLOP;
-            boolean createRow = topDistance < radius + SLOP;
-            if (x1 >= bounds.x2()) {
-                createColumn = true;
-            }
-            if (y1 >= bounds.y2()) {
-                createRow = true;
-            }
-
-            int cellWidth = leftDistance + rightDistance;
-            int cellHeight = topDistance + bottomDistance;
-            SegmentType horizontalType = SegmentType.LEFT;
-            SegmentType verticalType = SegmentType.TOP;
-            int minDistance = 10; // Don't center or right/bottom align in tiny cells
-            if (!createColumn && leftDistance > minDistance
-                    && dragBounds != null && dragBounds.w < cellWidth - 10) {
-                if (rightDistance < leftDistance) {
-                    horizontalType = SegmentType.RIGHT;
-                }
-
-                int centerDistance = Math.abs(cellWidth / 2 - leftDistance);
-                if (centerDistance < leftDistance / 2 && centerDistance < rightDistance / 2) {
-                    horizontalType = SegmentType.CENTER_HORIZONTAL;
-                }
-            }
-            if (!createRow && topDistance > minDistance
-                    && dragBounds != null && dragBounds.h < cellHeight - 10) {
-                if (bottomDistance < topDistance) {
-                    verticalType = SegmentType.BOTTOM;
-                }
-                int centerDistance = Math.abs(cellHeight / 2 - topDistance);
-                if (centerDistance < topDistance / 2 && centerDistance < bottomDistance / 2) {
-                    verticalType = SegmentType.CENTER_VERTICAL;
-                }
-            }
-
-            mColumnMatch = new GridMatch(horizontalType, 0, x1, column, createColumn, 0);
-            mRowMatch = new GridMatch(verticalType, 0, y1, row, createRow, 0);
-
-            StringBuilder description = new StringBuilder(50);
-            String rowString = Integer.toString(mColumnMatch.cellIndex + 1);
-            String columnString = Integer.toString(mRowMatch.cellIndex + 1);
-            if (mRowMatch.createCell && mRowMatch.cellIndex < mGrid.actualRowCount) {
-                description.append(String.format("Shift row %1$d down", mRowMatch.cellIndex + 1));
-                description.append('\n');
-            }
-            if (mColumnMatch.createCell && mColumnMatch.cellIndex < mGrid.actualColumnCount) {
-                description.append(String.format("Shift column %1$d right",
-                        mColumnMatch.cellIndex + 1));
-                description.append('\n');
-            }
-            description.append(String.format("Insert into cell (%1$s,%2$s)",
-                    rowString, columnString));
-            description.append('\n');
-            description.append(String.format("Align %1$s, %2$s",
-                    horizontalType.name().toLowerCase(Locale.US),
-                    verticalType.name().toLowerCase(Locale.US)));
-            feedback.tooltip = description.toString();
-        }
-    }
-
-    /**
-     * Adds a match to align the left edge with some other edge.
-     */
-    private void addLeftSideMatch(int x1, List<GridMatch> columnMatches, int max) {
-        int column = (mGrid.getViewCount() == 0) ? 0 : mGrid.getClosestColumn(x1);
-        int columnX = mGrid.getColumnX(column);
-        int distance = abs(columnX - x1);
-        if (distance <= max) {
-            columnMatches.add(new GridMatch(SegmentType.LEFT, distance, columnX, column,
-                    false, UNDEFINED));
-        }
-    }
-
-    /**
-     * Adds a match to align the right edge with some other edge.
-     */
-    private void addRightSideMatch(int x2, List<GridMatch> columnMatches, int max) {
-        // TODO: Only match the right hand side if the drag bounds fit fully within the
-        // cell! Ditto for match below.
-        int columnRight = (mGrid.getViewCount() == 0) ? 0 : mGrid.getClosestColumn(x2);
-        int rightDistance = mGrid.getColumnDistance(columnRight, x2);
-        if (rightDistance < max) {
-            int columnX = mGrid.getColumnX(columnRight);
-            if (columnX > mGrid.layout.getBounds().x) {
-                columnMatches.add(new GridMatch(SegmentType.RIGHT, rightDistance, columnX,
-                        columnRight, false, UNDEFINED));
-            }
-        }
-    }
-
-    /**
-     * Adds a horizontal match with the center axis of the GridLayout
-     */
-    private void addCenterColumnMatch(Rect bounds, int x1, int y1, int x2, int y2,
-            List<GridMatch> columnMatches, int max) {
-        Collection<INode> intersectsRow = mGrid.getIntersectsRow(y1, y2);
-        if (intersectsRow.size() == 0) {
-            // Offer centering on this row since there isn't anything there
-            int matchedLine = bounds.centerX();
-            int distance = abs((x1 + x2) / 2 - matchedLine);
-            if (distance <= 2 * max) {
-                boolean createCell = false; // always just put in column 0
-                columnMatches.add(new GridMatch(SegmentType.CENTER_HORIZONTAL, distance,
-                        matchedLine, 0 /* column */, createCell, UNDEFINED));
-            }
-        }
-    }
-
-    /**
-     * Adds a match to align the top edge with some other edge.
-     */
-    private void addTopMatch(int y1, List<GridMatch> rowMatches, int max, int row, int rowY) {
-        int distance = mGrid.getRowDistance(row, y1);
-        if (distance <= max) {
-            rowMatches.add(new GridMatch(SegmentType.TOP, distance, rowY, row, false,
-                    UNDEFINED));
-        }
-    }
-
-    /**
-     * Adds a match to align the bottom edge with some other edge.
-     */
-    private void addBottomMatch(int y2, List<GridMatch> rowMatches, int max) {
-        int rowBottom = (mGrid.getViewCount() == 0) ? 0 : mGrid.getClosestRow(y2);
-        int distance = mGrid.getRowDistance(rowBottom, y2);
-        if (distance < max) {
-            int rowY = mGrid.getRowY(rowBottom);
-            if (rowY > mGrid.layout.getBounds().y) {
-                rowMatches.add(new GridMatch(SegmentType.BOTTOM, distance, rowY,
-                        rowBottom, false, UNDEFINED));
-            }
-        }
-    }
-
-    /**
-     * Adds a baseline match, if applicable.
-     */
-    private void addBaselineMatch(int dragBaseline, int y1, List<GridMatch> rowMatches, int max,
-            int row, int rowY) {
-        int dragBaselineY = y1 + dragBaseline;
-        int rowBaseline = mGrid.getBaseline(row);
-        if (rowBaseline != -1) {
-            int rowBaselineY = rowY + rowBaseline;
-            int distance = abs(dragBaselineY - rowBaselineY);
-            if (distance < max) {
-                rowMatches.add(new GridMatch(SegmentType.BASELINE, distance, rowBaselineY, row,
-                        false, UNDEFINED));
-            }
-        }
-    }
-
-    /**
-     * Computes a horizontal "gap" match - a preferred distance from the nearest edge,
-     * including margin edges
-     */
-    private void addColumnGapMatch(Rect bounds, int x1, int x2, List<GridMatch> columnMatches,
-            int max) {
-        if (x1 < bounds.x + MARGIN_SIZE + max) {
-            int matchedLine = bounds.x + MARGIN_SIZE;
-            int distance = abs(matchedLine - x1);
-            if (distance <= max) {
-                boolean createCell = mGrid.getColumnX(mGrid.getColumn(matchedLine)) != matchedLine;
-                columnMatches.add(new GridMatch(SegmentType.LEFT, distance, matchedLine,
-                        0, createCell, MARGIN_SIZE));
-            }
-        } else if (x2 > bounds.x2() - MARGIN_SIZE - max) {
-            int matchedLine = bounds.x2() - MARGIN_SIZE;
-            int distance = abs(matchedLine - x2);
-            if (distance <= max) {
-                // This does not yet work properly; we need to use columnWeights to achieve this
-                //boolean createCell = mGrid.getColumnX(mGrid.getColumn(matchedLine)) != matchedLine;
-                //columnMatches.add(new GridMatch(SegmentType.RIGHT, distance, matchedLine,
-                //        mGrid.actualColumnCount - 1, createCell, MARGIN_SIZE));
-            }
-        } else {
-            int columnRight = mGrid.getColumn(x1 - SHORT_GAP_DP);
-            int columnX = mGrid.getColumnMaxX(columnRight);
-            int matchedLine = columnX + SHORT_GAP_DP;
-            int distance = abs(matchedLine - x1);
-            if (distance <= max) {
-                boolean createCell = mGrid.getColumnX(mGrid.getColumn(matchedLine)) != matchedLine;
-                columnMatches.add(new GridMatch(SegmentType.LEFT, distance, matchedLine,
-                        columnRight, createCell, SHORT_GAP_DP));
-            }
-
-            // Add a column directly adjacent (no gap)
-            columnRight = mGrid.getColumn(x1);
-            columnX = mGrid.getColumnMaxX(columnRight);
-            matchedLine = columnX;
-            distance = abs(matchedLine - x1);
-
-            // Let's say you have this arrangement:
-            //     [button1][button2]
-            // This is two columns, where the right hand side edge of column 1 is
-            // flush with the left side edge of column 2, because in fact the width of
-            // button1 is what defines the width of column 1, and that in turn is what
-            // defines the left side position of column 2.
-            //
-            // In this case we don't want to consider inserting a new column at the
-            // right hand side of button1 a better match than matching left on column 2.
-            // Therefore, to ensure that this doesn't happen, we "penalize" right column
-            // matches such that they don't get preferential treatment when the matching
-            // line is on the left side of the column.
-            distance += 2;
-
-            if (distance <= max) {
-                boolean createCell = mGrid.getColumnX(mGrid.getColumn(matchedLine)) != matchedLine;
-                columnMatches.add(new GridMatch(SegmentType.LEFT, distance, matchedLine,
-                        columnRight, createCell, 0));
-            }
-        }
-    }
-
-    /**
-     * Computes a vertical "gap" match - a preferred distance from the nearest edge,
-     * including margin edges
-     */
-    private void addRowGapMatch(Rect bounds, int y1, int y2, List<GridMatch> rowMatches, int max) {
-        if (y1 < bounds.y + MARGIN_SIZE + max) {
-            int matchedLine = bounds.y + MARGIN_SIZE;
-            int distance = abs(matchedLine - y1);
-            if (distance <= max) {
-                boolean createCell = mGrid.getRowY(mGrid.getRow(matchedLine)) != matchedLine;
-                rowMatches.add(new GridMatch(SegmentType.TOP, distance, matchedLine,
-                        0, createCell, MARGIN_SIZE));
-            }
-        } else if (y2 > bounds.y2() - MARGIN_SIZE - max) {
-            int matchedLine = bounds.y2() - MARGIN_SIZE;
-            int distance = abs(matchedLine - y2);
-            if (distance <= max) {
-                // This does not yet work properly; we need to use columnWeights to achieve this
-                //boolean createCell = mGrid.getRowY(mGrid.getRow(matchedLine)) != matchedLine;
-                //rowMatches.add(new GridMatch(SegmentType.BOTTOM, distance, matchedLine,
-                //        mGrid.actualRowCount - 1, createCell, MARGIN_SIZE));
-            }
-        } else {
-            int rowBottom = mGrid.getRow(y1 - SHORT_GAP_DP);
-            int rowY = mGrid.getRowMaxY(rowBottom);
-            int matchedLine = rowY + SHORT_GAP_DP;
-            int distance = abs(matchedLine - y1);
-            if (distance <= max) {
-                boolean createCell = mGrid.getRowY(mGrid.getRow(matchedLine)) != matchedLine;
-                rowMatches.add(new GridMatch(SegmentType.TOP, distance, matchedLine,
-                        rowBottom, createCell, SHORT_GAP_DP));
-            }
-
-            // Add a row directly adjacent (no gap)
-            rowBottom = mGrid.getRow(y1);
-            rowY = mGrid.getRowMaxY(rowBottom);
-            matchedLine = rowY;
-            distance = abs(matchedLine - y1);
-            distance += 2; // See explanation in addColumnGapMatch
-            if (distance <= max) {
-                boolean createCell = mGrid.getRowY(mGrid.getRow(matchedLine)) != matchedLine;
-                rowMatches.add(new GridMatch(SegmentType.TOP, distance, matchedLine,
-                        rowBottom, createCell, 0));
-            }
-
-        }
-    }
-
-    /**
-     * Called when a node is dropped in free-form mode. This will insert the dragged
-     * element into the grid and returns the newly created node.
-     *
-     * @param targetNode the GridLayout node
-     * @param element the dragged element
-     * @return the newly created {@link INode}
-     */
-    public INode handleFreeFormDrop(INode targetNode, IDragElement element) {
-        assert mRowMatch != null;
-        assert mColumnMatch != null;
-
-        String fqcn = element.getFqcn();
-
-        INode newChild = null;
-
-        Rect bounds = element.getBounds();
-        int row = mRowMatch.cellIndex;
-        int column = mColumnMatch.cellIndex;
-
-        if (targetNode.getChildren().length == 0) {
-            //
-            // Set up the initial structure:
-            //
-            //
-            //    Fixed                                 Fixed
-            //     Size                                  Size
-            //    Column       Expanding Column         Column
-            //   +-----+-------------------------------+-----+
-            //   |     |                               |     |
-            //   | 0,0 |              0,1              | 0,2 | Fixed Size Row
-            //   |     |                               |     |
-            //   +-----+-------------------------------+-----+
-            //   |     |                               |     |
-            //   |     |                               |     |
-            //   |     |                               |     |
-            //   | 1,0 |              1,1              | 1,2 | Expanding Row
-            //   |     |                               |     |
-            //   |     |                               |     |
-            //   |     |                               |     |
-            //   +-----+-------------------------------+-----+
-            //   |     |                               |     |
-            //   | 2,0 |              2,1              | 2,2 | Fixed Size Row
-            //   |     |                               |     |
-            //   +-----+-------------------------------+-----+
-            //
-            // This is implemented in GridLayout by the following grid, where
-            // SC1 has columnWeight=1 and SR1 has rowWeight=1.
-            // (SC=Space for Column, SR=Space for Row)
-            //
-            //   +------+-------------------------------+------+
-            //   |      |                               |      |
-            //   | SCR0 |             SC1               | SC2  |
-            //   |      |                               |      |
-            //   +------+-------------------------------+------+
-            //   |      |                               |      |
-            //   |      |                               |      |
-            //   |      |                               |      |
-            //   | SR1  |                               |      |
-            //   |      |                               |      |
-            //   |      |                               |      |
-            //   |      |                               |      |
-            //   +------+-------------------------------+------+
-            //   |      |                               |      |
-            //   | SR2  |                               |      |
-            //   |      |                               |      |
-            //   +------+-------------------------------+------+
-            //
-            // Note that when we split columns and rows here, if splitting the expanding
-            // row or column then the row or column weight should be moved to the right or
-            // bottom half!
-
-
-            //int columnX = mGrid.getColumnX(column);
-            //int rowY = mGrid.getRowY(row);
-
-            mGrid.setGridAttribute(targetNode, ATTR_COLUMN_COUNT, 2);
-            //mGrid.setGridAttribute(targetNode, ATTR_COLUMN_COUNT, 3);
-            //INode scr0 = addSpacer(targetNode, -1, 0, 0, 1, 1);
-            //INode sc1 = addSpacer(targetNode, -1, 0, 1, 0, 0);
-            //INode sc2 = addSpacer(targetNode, -1, 0, 2, 1, 0);
-            //INode sr1 = addSpacer(targetNode, -1, 1, 0, 0, 0);
-            //INode sr2 = addSpacer(targetNode, -1, 2, 0, 0, 1);
-            //mGrid.setGridAttribute(sc1, ATTR_LAYOUT_GRAVITY, VALUE_FILL_HORIZONTAL);
-            //mGrid.setGridAttribute(sr1, ATTR_LAYOUT_GRAVITY, VALUE_FILL_VERTICAL);
-            //
-            //mGrid.loadFromXml();
-            //column = mGrid.getColumn(columnX);
-            //row = mGrid.getRow(rowY);
-        }
-
-        int startX, endX;
-        if (mColumnMatch.type == SegmentType.RIGHT) {
-            endX = mColumnMatch.matchedLine - 1;
-            startX = endX - bounds.w;
-            column = mGrid.getColumn(startX);
-        } else {
-            startX = mColumnMatch.matchedLine; // TODO: What happens on type=RIGHT?
-            endX = startX + bounds.w;
-        }
-        int startY, endY;
-        if (mRowMatch.type == SegmentType.BOTTOM) {
-            endY = mRowMatch.matchedLine - 1;
-            startY = endY - bounds.h;
-            row = mGrid.getRow(startY);
-        } else if (mRowMatch.type == SegmentType.BASELINE) {
-            // TODO: The rowSpan should always be 1 for baseline alignments, since
-            // otherwise the alignment won't work!
-            startY = endY = mRowMatch.matchedLine;
-        } else {
-            startY = mRowMatch.matchedLine;
-            endY = startY + bounds.h;
-        }
-        int endColumn = mGrid.getColumn(endX);
-        int endRow = mGrid.getRow(endY);
-        int columnSpan = endColumn - column + 1;
-        int rowSpan = endRow - row + 1;
-
-        // Make sure my math was right:
-        assert mRowMatch.type != SegmentType.BASELINE || rowSpan == 1 : rowSpan;
-
-        // If the item almost fits into the row (at most N % bigger) then just enlarge
-        // the row; don't add a rowspan since that will defeat baseline alignment etc
-        if (!mRowMatch.createCell && bounds.h <= MAX_CELL_DIFFERENCE * mGrid.getRowHeight(
-                mRowMatch.type == SegmentType.BOTTOM ? endRow : row, 1)) {
-            if (mRowMatch.type == SegmentType.BOTTOM) {
-                row += rowSpan - 1;
-            }
-            rowSpan = 1;
-        }
-        if (!mColumnMatch.createCell && bounds.w <= MAX_CELL_DIFFERENCE * mGrid.getColumnWidth(
-                mColumnMatch.type == SegmentType.RIGHT ? endColumn : column, 1)) {
-            if (mColumnMatch.type == SegmentType.RIGHT) {
-                column += columnSpan - 1;
-            }
-            columnSpan = 1;
-        }
-
-        if (mColumnMatch.type == SegmentType.CENTER_HORIZONTAL) {
-            column = 0;
-            columnSpan = mGrid.actualColumnCount;
-        }
-
-        // Temporary: Ensure we don't get in trouble with implicit positions
-        mGrid.applyPositionAttributes();
-
-        // Split cells to make a new column
-        if (mColumnMatch.createCell) {
-            int columnWidthPx = mGrid.getColumnDistance(column, mColumnMatch.matchedLine);
-            //assert columnWidthPx == columnMatch.distance; // TBD? IF so simplify
-            int columnWidthDp = mRule.getRulesEngine().pxToDp(columnWidthPx);
-
-            int maxX = mGrid.getColumnMaxX(column);
-            boolean insertMarginColumn = false;
-            if (mColumnMatch.margin == 0) {
-                columnWidthDp = 0;
-            } else if (mColumnMatch.margin != UNDEFINED) {
-                int distance = abs(mColumnMatch.matchedLine - (maxX + mColumnMatch.margin));
-                insertMarginColumn = column > 0 && distance < 2;
-                if (insertMarginColumn) {
-                    int margin = mColumnMatch.margin;
-                    if (ViewMetadataRepository.INSETS_SUPPORTED) {
-                        IViewMetadata metadata = mRule.getRulesEngine().getMetadata(fqcn);
-                        if (metadata != null) {
-                            Margins insets = metadata.getInsets();
-                            if (insets != null) {
-                                // TODO:
-                                // Consider left or right side attachment
-                                // TODO: Also consider inset of element on cell to the left
-                                margin -= insets.left;
-                            }
-                        }
-                    }
-
-                    columnWidthDp = mRule.getRulesEngine().pxToDp(margin);
-                }
-            }
-
-            column++;
-            mGrid.splitColumn(column, insertMarginColumn, columnWidthDp, mColumnMatch.matchedLine);
-            if (insertMarginColumn) {
-                column++;
-            }
-        }
-
-        // Split cells to make a new  row
-        if (mRowMatch.createCell) {
-            int rowHeightPx = mGrid.getRowDistance(row, mRowMatch.matchedLine);
-            //assert rowHeightPx == rowMatch.distance; // TBD? If so simplify
-            int rowHeightDp = mRule.getRulesEngine().pxToDp(rowHeightPx);
-
-            int maxY = mGrid.getRowMaxY(row);
-            boolean insertMarginRow = false;
-            if (mRowMatch.margin == 0) {
-                rowHeightDp = 0;
-            } else if (mRowMatch.margin != UNDEFINED) {
-                int distance = abs(mRowMatch.matchedLine - (maxY + mRowMatch.margin));
-                insertMarginRow = row > 0 && distance < 2;
-                if (insertMarginRow) {
-                    int margin = mRowMatch.margin;
-                    IViewMetadata metadata = mRule.getRulesEngine().getMetadata(element.getFqcn());
-                    if (metadata != null) {
-                        Margins insets = metadata.getInsets();
-                        if (insets != null) {
-                            // TODO:
-                            // Consider left or right side attachment
-                            // TODO: Also consider inset of element on cell to the left
-                            margin -= insets.top;
-                        }
-                    }
-
-                    rowHeightDp = mRule.getRulesEngine().pxToDp(margin);
-                }
-            }
-
-            row++;
-            mGrid.splitRow(row, insertMarginRow, rowHeightDp, mRowMatch.matchedLine);
-            if (insertMarginRow) {
-                row++;
-            }
-        }
-
-        // Figure out where to insert the new child
-
-        int index = mGrid.getInsertIndex(row, column);
-        if (index == -1) {
-            // Couldn't find a later place to insert
-            newChild = targetNode.appendChild(fqcn);
-        } else {
-            GridModel.ViewData next = mGrid.getView(index);
-
-            newChild = targetNode.insertChildAt(fqcn, index);
-
-            // Must also apply positions to the following child to ensure
-            // that the new child doesn't affect the implicit numbering!
-            // TODO: We can later check whether the implied number is equal to
-            // what it already is such that we don't need this
-            next.applyPositionAttributes();
-        }
-
-        // Set the cell position (gravity) of the new widget
-        int gravity = 0;
-        if (mColumnMatch.type == SegmentType.RIGHT) {
-            gravity |= GravityHelper.GRAVITY_RIGHT;
-        } else if (mColumnMatch.type == SegmentType.CENTER_HORIZONTAL) {
-            gravity |= GravityHelper.GRAVITY_CENTER_HORIZ;
-        }
-        mGrid.setGridAttribute(newChild, ATTR_LAYOUT_COLUMN, column);
-        if (mRowMatch.type == SegmentType.BASELINE) {
-            // There *is* no baseline gravity constant, instead, leave the
-            // vertical gravity unspecified and GridLayout will treat it as
-            // baseline alignment
-            //gravity |= GravityHelper.GRAVITY_BASELINE;
-        } else if (mRowMatch.type == SegmentType.BOTTOM) {
-            gravity |= GravityHelper.GRAVITY_BOTTOM;
-        } else if (mRowMatch.type == SegmentType.CENTER_VERTICAL) {
-            gravity |= GravityHelper.GRAVITY_CENTER_VERT;
-        }
-        // Ensure that we have at least one horizontal and vertical constraint, otherwise
-        // the new item will be fixed. As an example, if we have a single button in the
-        // table which we inserted *without* a gravity, and we then insert a button
-        // above it with a vertical gravity, then only the top column would be considered
-        // stretchable, and it will fill all available vertical space and the previous
-        // button will jump to the bottom.
-        if (!GravityHelper.isConstrainedHorizontally(gravity)) {
-            gravity |= GravityHelper.GRAVITY_LEFT;
-        }
-        /* This causes problems: Try placing two buttons vertically from the top of the layout.
-           We need to solve the free column/free row problem first.
-        if (!GravityHelper.isConstrainedVertically(gravity)
-                // There is no baseline constant, so we have to leave it unconstrained instead
-                && mRowMatch.type != SegmentType.BASELINE
-                // You also can't baseline align one element with another that has vertical
-                // alignment top or bottom, so when we first "freely" place views (e.g.
-                // at a particular y location), also place it freely (no constraint).
-                && !mRowMatch.createCell) {
-            gravity |= GravityHelper.GRAVITY_TOP;
-        }
-        */
-        mGrid.setGridAttribute(newChild, ATTR_LAYOUT_GRAVITY, getGravity(gravity));
-
-        mGrid.setGridAttribute(newChild, ATTR_LAYOUT_ROW, row);
-
-        // Apply spans to ensure that the widget can fit without pushing columns
-        if (columnSpan > 1) {
-            mGrid.setGridAttribute(newChild, ATTR_LAYOUT_COLUMN_SPAN, columnSpan);
-        }
-        if (rowSpan > 1) {
-            mGrid.setGridAttribute(newChild, ATTR_LAYOUT_ROW_SPAN, rowSpan);
-        }
-
-        // Ensure that we don't store columnCount=0
-        if (mGrid.actualColumnCount == 0) {
-            mGrid.setGridAttribute(mGrid.layout, ATTR_COLUMN_COUNT, Math.max(1, column + 1));
-        }
-
-        return newChild;
-    }
-
-    /**
-     * Called when a drop is completed and we're in grid-editing mode. This will insert
-     * the dragged element into the target cell.
-     *
-     * @param targetNode the GridLayout node
-     * @param element the dragged element
-     * @return the newly created node
-     */
-    public INode handleGridModeDrop(INode targetNode, IDragElement element) {
-        String fqcn = element.getFqcn();
-        INode newChild = targetNode.appendChild(fqcn);
-
-        int column = mColumnMatch.cellIndex;
-        if (mColumnMatch.createCell) {
-            mGrid.addColumn(column,
-                    newChild, UNDEFINED, false, UNDEFINED, UNDEFINED);
-        }
-        int row = mRowMatch.cellIndex;
-        if (mRowMatch.createCell) {
-            mGrid.addRow(row, newChild, UNDEFINED, false, UNDEFINED, UNDEFINED);
-        }
-
-        mGrid.setGridAttribute(newChild, ATTR_LAYOUT_COLUMN, column);
-        mGrid.setGridAttribute(newChild, ATTR_LAYOUT_ROW, row);
-
-        int gravity = 0;
-        if (mColumnMatch.type == SegmentType.RIGHT) {
-            gravity |= GravityHelper.GRAVITY_RIGHT;
-        } else if (mColumnMatch.type == SegmentType.CENTER_HORIZONTAL) {
-            gravity |= GravityHelper.GRAVITY_CENTER_HORIZ;
-        }
-        if (mRowMatch.type == SegmentType.BASELINE) {
-            // There *is* no baseline gravity constant, instead, leave the
-            // vertical gravity unspecified and GridLayout will treat it as
-            // baseline alignment
-            //gravity |= GravityHelper.GRAVITY_BASELINE;
-        } else if (mRowMatch.type == SegmentType.BOTTOM) {
-            gravity |= GravityHelper.GRAVITY_BOTTOM;
-        } else if (mRowMatch.type == SegmentType.CENTER_VERTICAL) {
-            gravity |= GravityHelper.GRAVITY_CENTER_VERT;
-        }
-        if (!GravityHelper.isConstrainedHorizontally(gravity)) {
-            gravity |= GravityHelper.GRAVITY_LEFT;
-        }
-        if (!GravityHelper.isConstrainedVertically(gravity)) {
-            gravity |= GravityHelper.GRAVITY_TOP;
-        }
-        mGrid.setGridAttribute(newChild, ATTR_LAYOUT_GRAVITY, getGravity(gravity));
-
-        if (mGrid.declaredColumnCount == UNDEFINED || mGrid.declaredColumnCount < column + 1) {
-            mGrid.setGridAttribute(mGrid.layout, ATTR_COLUMN_COUNT, column + 1);
-        }
-
-        return newChild;
-    }
-
-    /**
-     * Returns the best horizontal match
-     *
-     * @return the best horizontal match, or null if there is no match
-     */
-    public GridMatch getColumnMatch() {
-        return mColumnMatch;
-    }
-
-    /**
-     * Returns the best vertical match
-     *
-     * @return the best vertical match, or null if there is no match
-     */
-    public GridMatch getRowMatch() {
-        return mRowMatch;
-    }
-
-    /**
-     * Returns the grid used by the drop handler
-     *
-     * @return the grid used by the drop handler, never null
-     */
-    public GridModel getGrid() {
-        return mGrid;
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/grid/GridLayoutPainter.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/grid/GridLayoutPainter.java
deleted file mode 100644
index 7e2d3a7..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/grid/GridLayoutPainter.java
+++ /dev/null
@@ -1,370 +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.layout.grid;
-
-import static com.android.ide.common.layout.GridLayoutRule.GRID_SIZE;
-import static com.android.ide.common.layout.GridLayoutRule.MARGIN_SIZE;
-import static com.android.ide.common.layout.grid.GridModel.UNDEFINED;
-
-import com.android.annotations.NonNull;
-import com.android.ide.common.api.DrawingStyle;
-import com.android.ide.common.api.DropFeedback;
-import com.android.ide.common.api.IDragElement;
-import com.android.ide.common.api.IFeedbackPainter;
-import com.android.ide.common.api.IGraphics;
-import com.android.ide.common.api.INode;
-import com.android.ide.common.api.Rect;
-import com.android.ide.common.api.SegmentType;
-import com.android.ide.common.layout.GridLayoutRule;
-import com.android.utils.Pair;
-
-/**
- * Painter which paints feedback during drag, drop and resizing operations, as well as
- * static selection feedback
- */
-public class GridLayoutPainter {
-
-    /**
-     * Creates a painter for drop feedback
-     *
-     * @param rule the corresponding {@link GridLayoutRule}
-     * @param elements the dragged elements
-     * @return a {@link IFeedbackPainter} which can paint the drop feedback
-     */
-    public static IFeedbackPainter createDropFeedbackPainter(GridLayoutRule rule,
-            IDragElement[] elements) {
-        return new DropFeedbackPainter(rule, elements);
-    }
-
-    /**
-     * Paints the structure (the grid model) of the given GridLayout.
-     *
-     * @param style the drawing style to use to paint the structure lines
-     * @param layout the grid layout node
-     * @param gc the graphics context to paint into
-     * @param grid the grid model to be visualized
-     */
-    public static void paintStructure(DrawingStyle style, INode layout, IGraphics gc,
-            GridModel grid) {
-        Rect b = layout.getBounds();
-
-        gc.useStyle(style);
-        for (int row = 0; row < grid.actualRowCount; row++) {
-            int y = grid.getRowY(row);
-            gc.drawLine(b.x, y, b.x2(), y);
-        }
-        for (int column = 0; column < grid.actualColumnCount; column++) {
-            int x = grid.getColumnX(column);
-            gc.drawLine(x, b.y, x, b.y2());
-        }
-    }
-
-    /**
-     * Paints a regular grid according to the {@link GridLayoutRule#GRID_SIZE} and
-     * {@link GridLayoutRule#MARGIN_SIZE} dimensions. These are the same lines that
-     * snap-to-grid will align with.
-     *
-     * @param layout the GridLayout node
-     * @param gc the graphics context to paint the grid into
-     */
-    public static void paintGrid(INode layout, IGraphics gc) {
-        Rect b = layout.getBounds();
-
-        int oldAlpha = gc.getAlpha();
-        gc.useStyle(DrawingStyle.GUIDELINE);
-        gc.setAlpha(128);
-
-        int y1 = b.y + MARGIN_SIZE;
-        int y2 = b.y2() - MARGIN_SIZE;
-        for (int y = y1; y < y2; y += GRID_SIZE) {
-            int x1 = b.x + MARGIN_SIZE;
-            int x2 = b.x2() - MARGIN_SIZE;
-            for (int x = x1; x < x2; x += GRID_SIZE) {
-                gc.drawPoint(x, y);
-            }
-        }
-        gc.setAlpha(oldAlpha);
-    }
-
-    /**
-     * Paint resizing feedback (which currently paints the grid model faintly.)
-     *
-     * @param gc the graphics context
-     * @param layout the GridLayout
-     * @param grid the grid model
-     */
-    public static void paintResizeFeedback(IGraphics gc, INode layout, GridModel grid) {
-        paintStructure(DrawingStyle.GRID, layout, gc, grid);
-    }
-
-    /**
-     * A painter which can paint the drop feedback for elements being dragged into or
-     * within a GridLayout.
-     */
-    private static class DropFeedbackPainter implements IFeedbackPainter {
-        private final GridLayoutRule mRule;
-        private final IDragElement[] mElements;
-
-        /** Constructs a new {@link GridLayoutPainter} bound to the given {@link GridLayoutRule}
-         * @param rule the corresponding rule
-         * @param elements the elements to draw */
-        public DropFeedbackPainter(GridLayoutRule rule, IDragElement[] elements) {
-            mRule = rule;
-            mElements = elements;
-        }
-
-        // Implements IFeedbackPainter
-        @Override
-        public void paint(@NonNull IGraphics gc, @NonNull INode node,
-                @NonNull DropFeedback feedback) {
-            Rect b = node.getBounds();
-            if (!b.isValid()) {
-                return;
-            }
-
-            // Highlight the receiver
-            gc.useStyle(DrawingStyle.DROP_RECIPIENT);
-            gc.drawRect(b);
-            GridDropHandler data = (GridDropHandler) feedback.userData;
-
-            if (!GridLayoutRule.sGridMode) {
-                paintFreeFormDropFeedback(gc, node, feedback, b, data);
-            } else {
-                paintGridModeDropFeedback(gc, b, data);
-            }
-        }
-
-        /**
-         * Paints the drag feedback for a free-form mode drag
-         */
-        private void paintFreeFormDropFeedback(IGraphics gc, INode node, DropFeedback feedback,
-                Rect b, GridDropHandler data) {
-            GridModel grid = data.getGrid();
-            if (GridLayoutRule.sSnapToGrid) {
-                GridLayoutPainter.paintGrid(node, gc);
-            }
-            GridLayoutPainter.paintStructure(DrawingStyle.GRID, node, gc, grid);
-
-            GridMatch rowMatch = data.getRowMatch();
-            GridMatch columnMatch = data.getColumnMatch();
-
-            if (rowMatch == null || columnMatch == null) {
-                return;
-            }
-
-            IDragElement first = mElements[0];
-            Rect dragBounds = first.getBounds();
-            int offsetX = 0;
-            int offsetY = 0;
-            if (rowMatch.type == SegmentType.BOTTOM) {
-                offsetY -= dragBounds.h;
-            } else if (rowMatch.type == SegmentType.BASELINE) {
-                offsetY -= feedback.dragBaseline;
-            }
-            if (columnMatch.type == SegmentType.RIGHT) {
-                offsetX -= dragBounds.w;
-            } else if (columnMatch.type == SegmentType.CENTER_HORIZONTAL) {
-                offsetX -= dragBounds.w / 2;
-            }
-
-            // Draw guidelines for matches
-            int y = rowMatch.matchedLine;
-            int x = columnMatch.matchedLine;
-            Rect bounds = first.getBounds();
-
-            // Draw margin
-            if (rowMatch.margin != UNDEFINED && rowMatch.margin > 0) {
-                gc.useStyle(DrawingStyle.DISTANCE);
-                int centerX = bounds.w / 2 + offsetX + x;
-                int y1;
-                int y2;
-                if (rowMatch.type == SegmentType.TOP) {
-                    y1 = offsetY + y - 1;
-                    y2 = rowMatch.matchedLine - rowMatch.margin;
-                } else {
-                    assert rowMatch.type == SegmentType.BOTTOM;
-                    y1 = bounds.h + offsetY + y - 1;
-                    y2 = rowMatch.matchedLine + rowMatch.margin;
-                }
-                gc.drawLine(b.x, y1, b.x2(), y1);
-                gc.drawLine(b.x, y2, b.x2(), y2);
-                gc.drawString(Integer.toString(rowMatch.margin),
-                        centerX - 3, y1 + (y2 - y1 - 16) / 2);
-            } else {
-                gc.useStyle(rowMatch.margin == 0 ? DrawingStyle.DISTANCE
-                        : rowMatch.createCell ? DrawingStyle.GUIDELINE_DASHED
-                                : DrawingStyle.GUIDELINE);
-                gc.drawLine(b.x, y, b.x2(), y );
-            }
-
-            if (columnMatch.margin != UNDEFINED && columnMatch.margin > 0) {
-                gc.useStyle(DrawingStyle.DISTANCE);
-                int centerY = bounds.h / 2 + offsetY + y;
-                int x1;
-                int x2;
-                if (columnMatch.type == SegmentType.LEFT) {
-                    x1 = offsetX + x - 1;
-                    x2 = columnMatch.matchedLine - columnMatch.margin;
-                } else {
-                    assert columnMatch.type == SegmentType.RIGHT;
-                    x1 = bounds.w + offsetX + x - 1;
-                    x2 = columnMatch.matchedLine + columnMatch.margin;
-                }
-                gc.drawLine(x1, b.y, x1, b.y2());
-                gc.drawLine(x2, b.y, x2, b.y2());
-                gc.drawString(Integer.toString(columnMatch.margin),
-                        x1 + (x2 - x1 - 16) / 2, centerY - 3);
-            } else {
-                gc.useStyle(columnMatch.margin == 0 ? DrawingStyle.DISTANCE
-                        : columnMatch.createCell ? DrawingStyle.GUIDELINE_DASHED
-                                : DrawingStyle.GUIDELINE);
-                gc.drawLine(x, b.y, x, b.y2());
-            }
-
-            // Draw preview rectangles for all the dragged elements
-            gc.useStyle(DrawingStyle.DROP_PREVIEW);
-            offsetX += x - bounds.x;
-            offsetY += y - bounds.y;
-
-            for (IDragElement element : mElements) {
-                if (element == first) {
-                    mRule.drawElement(gc, first, offsetX, offsetY);
-                    // Preview baseline as well
-                    if (feedback.dragBaseline != -1) {
-                        int x1 = dragBounds.x + offsetX;
-                        int y1 = dragBounds.y + offsetY + feedback.dragBaseline;
-                        gc.drawLine(x1, y1, x1 + dragBounds.w, y1);
-                    }
-                } else {
-                    b = element.getBounds();
-                    if (b.isValid()) {
-                        gc.drawRect(b.x + offsetX, b.y + offsetY,
-                                b.x + offsetX + b.w, b.y + offsetY + b.h);
-                    }
-                }
-            }
-        }
-
-        /**
-         * Paints the drag feedback for a grid-mode drag
-         */
-        private void paintGridModeDropFeedback(IGraphics gc, Rect b, GridDropHandler data) {
-            int radius = mRule.getNewCellSize();
-            GridModel grid = data.getGrid();
-
-            gc.useStyle(DrawingStyle.GUIDELINE);
-            // Paint grid
-            for (int row = 1; row < grid.actualRowCount; row++) {
-                int y = grid.getRowY(row);
-                gc.drawLine(b.x, y - radius, b.x2(), y - radius);
-                gc.drawLine(b.x, y + radius, b.x2(), y + radius);
-
-            }
-            for (int column = 1; column < grid.actualColumnCount; column++) {
-                int x = grid.getColumnX(column);
-                gc.drawLine(x - radius, b.y, x - radius, b.y2());
-                gc.drawLine(x + radius, b.y, x + radius, b.y2());
-            }
-            gc.drawRect(b.x, b.y, b.x2(), b.y2());
-            gc.drawRect(b.x + 2 * radius, b.y + 2 * radius,
-                    b.x2() - 2 * radius, b.y2() - 2 * radius);
-
-            GridMatch columnMatch = data.getColumnMatch();
-            GridMatch rowMatch = data.getRowMatch();
-            int column = columnMatch.cellIndex;
-            int row = rowMatch.cellIndex;
-            boolean createColumn = columnMatch.createCell;
-            boolean createRow = rowMatch.createCell;
-
-            Rect cellBounds = grid.getCellBounds(row, column, 1, 1);
-
-            IDragElement first = mElements[0];
-            Rect dragBounds = first.getBounds();
-            int offsetX = cellBounds.x - dragBounds.x;
-            int offsetY = cellBounds.y - dragBounds.y;
-
-            gc.useStyle(DrawingStyle.DROP_ZONE_ACTIVE);
-            if (createColumn) {
-                gc.fillRect(new Rect(cellBounds.x - radius,
-                        cellBounds.y + (createRow ? -radius : radius),
-                        2 * radius + 1, cellBounds.h - (createRow ? 0 : 2 * radius)));
-                offsetX -= radius + dragBounds.w / 2;
-            }
-            if (createRow) {
-                gc.fillRect(new Rect(cellBounds.x + radius, cellBounds.y - radius,
-                        cellBounds.w - 2 * radius, 2 * radius + 1));
-                offsetY -= radius + dragBounds.h / 2;
-            } else if (!createColumn) {
-                // Choose this cell
-                gc.fillRect(new Rect(cellBounds.x + radius, cellBounds.y + radius,
-                        cellBounds.w - 2 * radius, cellBounds.h - 2 * radius));
-            }
-
-            gc.useStyle(DrawingStyle.DROP_PREVIEW);
-
-            Rect bounds = first.getBounds();
-            int x = offsetX;
-            int y = offsetY;
-            if (columnMatch.type == SegmentType.RIGHT) {
-                x += cellBounds.w - bounds.w;
-            } else if (columnMatch.type == SegmentType.CENTER_HORIZONTAL) {
-                x += cellBounds.w / 2 - bounds.w / 2;
-            }
-            if (rowMatch.type == SegmentType.BOTTOM) {
-                y += cellBounds.h - bounds.h;
-            } else if (rowMatch.type == SegmentType.CENTER_VERTICAL) {
-                y += cellBounds.h / 2 - bounds.h / 2;
-            }
-
-            mRule.drawElement(gc, first, x, y);
-        }
-    }
-
-    /**
-     * Paints the structure (the row and column boundaries) of the given
-     * GridLayout
-     *
-     * @param view the instance of the GridLayout whose structure should be
-     *            painted
-     * @param style the drawing style to use for the cell boundaries
-     * @param layout the layout element
-     * @param gc the graphics context
-     * @return true if the structure was successfully inferred from the view and
-     *         painted
-     */
-    public static boolean paintStructure(Object view, DrawingStyle style, INode layout,
-            IGraphics gc) {
-        Pair<int[],int[]> cellBounds = GridModel.getAxisBounds(view);
-        if (cellBounds != null) {
-            int[] xs = cellBounds.getFirst();
-            int[] ys = cellBounds.getSecond();
-            Rect b = layout.getBounds();
-            gc.useStyle(style);
-            for (int row = 0; row < ys.length; row++) {
-                int y = ys[row] + b.y;
-                gc.drawLine(b.x, y, b.x2(), y);
-            }
-            for (int column = 0; column < xs.length; column++) {
-                int x = xs[column] + b.x;
-                gc.drawLine(x, b.y, x, b.y2());
-            }
-
-            return true;
-        } else {
-            return false;
-        }
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/grid/GridMatch.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/grid/GridMatch.java
deleted file mode 100644
index 9bee343..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/grid/GridMatch.java
+++ /dev/null
@@ -1,154 +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.layout.grid;
-
-import static com.android.ide.common.layout.grid.GridModel.UNDEFINED;
-
-import com.android.ide.common.api.INode;
-import com.android.ide.common.api.SegmentType;
-
-/**
- * A match for a drag within a GridLayout, corresponding to an alignment with another
- * edge, or a margin, or centering, or a gap distance from another edge and so on.
- */
-class GridMatch implements Comparable<GridMatch> {
-    /** The distance to the matched edge - used to pick best matches */
-    public final int distance;
-
-    /** Type of edge that was matched (this refers to the edge on the dragged node,
-     * not on the matched node/row/cell etc) */
-    public final SegmentType type;
-
-    /** Row or column for the match */
-    public int cellIndex;
-
-    /** If true, create a new row/column */
-    public boolean createCell;
-
-    /** The actual x or y position of the matched segment */
-    public int matchedLine;
-
-    /** Amount of margin between the matched edges */
-    public int margin;
-
-    /**
-     * Constructs a match.
-     *
-     * @param type the edge of the dragged element that was matched
-     * @param distance the absolute distance from the ideal match - used to find the best
-     *            match
-     * @param matchedLine the actual X or Y location of the ideal match
-     * @param cellIndex the index of the row or column we matched with
-     * @param createCell if true, create a new cell by splitting the existing cell at the
-     *            matchedLine position
-     * @param margin a margin distance to add to the actual location from the matched line
-     */
-    GridMatch(SegmentType type, int distance, int matchedLine, int cellIndex,
-            boolean createCell, int margin) {
-        super();
-        this.type = type;
-        this.distance = distance;
-        this.matchedLine = matchedLine;
-        this.cellIndex = cellIndex;
-        this.createCell = createCell;
-        this.margin = margin;
-    }
-
-    // Implements Comparable<GridMatch>
-    @Override
-    public int compareTo(GridMatch o) {
-        // Pick closest matches first
-        if (distance != o.distance) {
-            return distance - o.distance;
-        }
-
-        // Prefer some types of matches over other matches
-        return getPriority() - o.getPriority();
-    }
-
-    /**
-     * Describes the match for the user
-     *
-     * @param layout the GridLayout containing the match
-     * @return a short description for the user of the match
-     */
-    public String getDisplayName(INode layout) {
-        switch (type) {
-            case BASELINE:
-                return String.format("Align baseline in row %1$d", cellIndex + 1);
-            case CENTER_HORIZONTAL:
-                return "Center horizontally";
-            case LEFT:
-                if (!createCell) {
-                    return String.format("Insert into column %1$d", cellIndex + 1);
-                }
-                if (margin != UNDEFINED) {
-                    if (cellIndex == 0 && margin != 0) {
-                        return "Add one margin distance from the left";
-                    }
-                    return String.format("Add next to column %1$d", cellIndex + 1);
-                }
-                return String.format("Align left at x=%1$d", matchedLine - layout.getBounds().x);
-            case RIGHT:
-                if (!createCell) {
-                    return String.format("Insert right-aligned into column %1$d", cellIndex + 1);
-                }
-                return String.format("Align right at x=%1$d", matchedLine - layout.getBounds().x);
-            case TOP:
-                if (!createCell) {
-                    return String.format("Insert into row %1$d", cellIndex + 1);
-                }
-                if (margin != UNDEFINED) {
-                    if (cellIndex == 0 && margin != 0) {
-                        return "Add one margin distance from the top";
-                    }
-                    return String.format("Add below row %1$d", cellIndex + 1);
-                }
-                return String.format("Align top at y=%1d", matchedLine - layout.getBounds().y);
-            case BOTTOM:
-                if (!createCell) {
-                    return String.format("Insert into bottom of row %1$d", cellIndex + 1);
-                }
-                return String.format("Align bottom at y=%1d", matchedLine - layout.getBounds().y);
-            case CENTER_VERTICAL:
-                return "Center vertically";
-            case UNKNOWN:
-            default:
-                return null;
-        }
-    }
-
-    /**
-     * Computes the sorting priority of this match, giving baseline matches higher
-     * precedence than centering which in turn is ordered before external edge matches
-     */
-    private int getPriority() {
-        switch (type) {
-            case BASELINE:
-                return 0;
-            case CENTER_HORIZONTAL:
-            case CENTER_VERTICAL:
-                return 1;
-            case BOTTOM:
-            case LEFT:
-            case RIGHT:
-            case TOP:
-                return 2;
-        }
-
-        return 3;
-    }
-}
\ No newline at end of file
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/grid/GridModel.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/grid/GridModel.java
deleted file mode 100644
index 46770e8..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/grid/GridModel.java
+++ /dev/null
@@ -1,2384 +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.layout.grid;
-
-import static com.android.SdkConstants.ANDROID_URI;
-import static com.android.SdkConstants.ATTR_COLUMN_COUNT;
-import static com.android.SdkConstants.ATTR_ID;
-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_ROW;
-import static com.android.SdkConstants.ATTR_LAYOUT_ROW_SPAN;
-import static com.android.SdkConstants.ATTR_LAYOUT_WIDTH;
-import static com.android.SdkConstants.ATTR_ORIENTATION;
-import static com.android.SdkConstants.ATTR_ROW_COUNT;
-import static com.android.SdkConstants.FQCN_GRID_LAYOUT;
-import static com.android.SdkConstants.FQCN_SPACE;
-import static com.android.SdkConstants.FQCN_SPACE_V7;
-import static com.android.SdkConstants.GRID_LAYOUT;
-import static com.android.SdkConstants.NEW_ID_PREFIX;
-import static com.android.SdkConstants.SPACE;
-import static com.android.SdkConstants.VALUE_BOTTOM;
-import static com.android.SdkConstants.VALUE_CENTER_VERTICAL;
-import static com.android.SdkConstants.VALUE_N_DP;
-import static com.android.SdkConstants.VALUE_TOP;
-import static com.android.SdkConstants.VALUE_VERTICAL;
-import static com.android.ide.common.layout.GravityHelper.GRAVITY_BOTTOM;
-import static com.android.ide.common.layout.GravityHelper.GRAVITY_CENTER_HORIZ;
-import static com.android.ide.common.layout.GravityHelper.GRAVITY_CENTER_VERT;
-import static com.android.ide.common.layout.GravityHelper.GRAVITY_RIGHT;
-import static java.lang.Math.abs;
-import static java.lang.Math.max;
-import static java.lang.Math.min;
-
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-import com.android.ide.common.api.IClientRulesEngine;
-import com.android.ide.common.api.INode;
-import com.android.ide.common.api.IViewMetadata;
-import com.android.ide.common.api.Margins;
-import com.android.ide.common.api.Rect;
-import com.android.ide.common.layout.GravityHelper;
-import com.android.ide.common.layout.GridLayoutRule;
-import com.android.utils.Pair;
-import com.google.common.collect.ArrayListMultimap;
-import com.google.common.collect.Multimap;
-
-import java.io.PrintWriter;
-import java.io.StringWriter;
-import java.lang.ref.WeakReference;
-import java.lang.reflect.Field;
-import java.lang.reflect.Method;
-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;
-
-/** Models a GridLayout */
-public class GridModel {
-    /** Marker value used to indicate values (rows, columns, etc) which have not been set */
-    static final int UNDEFINED = Integer.MIN_VALUE;
-
-    /** The size of spacers in the dimension that they are not defining */
-    static final int SPACER_SIZE_DP = 1;
-
-    /** Attribute value used for {@link #SPACER_SIZE_DP} */
-    private static final String SPACER_SIZE = String.format(VALUE_N_DP, SPACER_SIZE_DP);
-
-    /** Width assigned to a newly added column with the Add Column action */
-    private static final int DEFAULT_CELL_WIDTH = 100;
-
-    /** Height assigned to a newly added row with the Add Row action */
-    private static final int DEFAULT_CELL_HEIGHT = 15;
-
-    /** The GridLayout node, never null */
-    public final INode layout;
-
-    /** True if this is a vertical layout, and false if it is horizontal (the default) */
-    public boolean vertical;
-
-    /** The declared count of rows (which may be {@link #UNDEFINED} if not specified) */
-    public int declaredRowCount;
-
-    /** The declared count of columns (which may be {@link #UNDEFINED} if not specified) */
-    public int declaredColumnCount;
-
-    /** The actual count of rows found in the grid */
-    public int actualRowCount;
-
-    /** The actual count of columns found in the grid */
-    public int actualColumnCount;
-
-    /**
-     * Array of positions (indexed by column) of the left edge of table cells; this
-     * corresponds to the column positions in the grid
-     */
-    private int[] mLeft;
-
-    /**
-     * Array of positions (indexed by row) of the top edge of table cells; this
-     * corresponds to the row positions in the grid
-     */
-    private int[] mTop;
-
-    /**
-     * Array of positions (indexed by column) of the maximum right hand side bounds of a
-     * node in the given column; this represents the visual edge of a column even when the
-     * actual column is wider
-     */
-    private int[] mMaxRight;
-
-    /**
-     * Array of positions (indexed by row) of the maximum bottom bounds of a node in the
-     * given row; this represents the visual edge of a row even when the actual row is
-     * taller
-     */
-    private int[] mMaxBottom;
-
-    /**
-     * Array of baselines computed for the rows. This array is populated lazily and should
-     * not be accessed directly; call {@link #getBaseline(int)} instead.
-     */
-    private int[] mBaselines;
-
-    /** List of all the view data for the children in this layout */
-    private List<ViewData> mChildViews;
-
-    /** The {@link IClientRulesEngine} */
-    private final IClientRulesEngine mRulesEngine;
-
-    /**
-     * An actual instance of a GridLayout object that this grid model corresponds to.
-     */
-    private Object mViewObject;
-
-    /** The namespace to use for attributes */
-    private String mNamespace;
-
-    /**
-     * Constructs a {@link GridModel} for the given layout
-     *
-     * @param rulesEngine the associated rules engine
-     * @param node the GridLayout node
-     * @param viewObject an actual GridLayout instance, or null
-     */
-    private GridModel(IClientRulesEngine rulesEngine, INode node, Object viewObject) {
-        mRulesEngine = rulesEngine;
-        layout = node;
-        mViewObject = viewObject;
-        loadFromXml();
-    }
-
-    // Factory cache for most recent item (used primarily because during paints and drags
-    // the grid model is called repeatedly for the same view object.)
-    private static WeakReference<Object> sCachedViewObject = new WeakReference<Object>(null);
-    private static WeakReference<GridModel> sCachedViewModel;
-
-    /**
-     * Factory which returns a grid model for the given node.
-     *
-     * @param rulesEngine the associated rules engine
-     * @param node the GridLayout node
-     * @param viewObject an actual GridLayout instance, or null
-     * @return a new model
-     */
-    @NonNull
-    public static GridModel get(
-            @NonNull IClientRulesEngine rulesEngine,
-            @NonNull INode node,
-            @Nullable Object viewObject) {
-        if (viewObject != null && viewObject == sCachedViewObject.get()) {
-            GridModel model = sCachedViewModel.get();
-            if (model != null) {
-                return model;
-            }
-        }
-
-        GridModel model = new GridModel(rulesEngine, node, viewObject);
-        sCachedViewModel = new WeakReference<GridModel>(model);
-        sCachedViewObject = new WeakReference<Object>(viewObject);
-        return model;
-    }
-
-    /**
-     * Returns the {@link ViewData} for the child at the given index
-     *
-     * @param index the position of the child node whose view we want to look up
-     * @return the corresponding {@link ViewData}
-     */
-    public ViewData getView(int index) {
-        return mChildViews.get(index);
-    }
-
-    /**
-     * Returns the {@link ViewData} for the given child node.
-     *
-     * @param node the node for which we want the view info
-     * @return the view info for the node, or null if not found
-     */
-    public ViewData getView(INode node) {
-        for (ViewData view : mChildViews) {
-            if (view.node == node) {
-                return view;
-            }
-        }
-
-        return null;
-    }
-
-    /**
-     * Computes the index (among the children nodes) to insert a new node into which
-     * should be positioned at the given row and column. This will skip over any nodes
-     * that have implicit positions earlier than the given node, and will also ensure that
-     * all nodes are placed before the spacer nodes.
-     *
-     * @param row the target row of the new node
-     * @param column the target column of the new node
-     * @return the insert position to use or -1 if no preference is found
-     */
-    public int getInsertIndex(int row, int column) {
-        if (vertical) {
-            for (ViewData view : mChildViews) {
-                if (view.column > column || view.column == column && view.row >= row) {
-                    return view.index;
-                }
-            }
-        } else {
-            for (ViewData view : mChildViews) {
-                if (view.row > row || view.row == row && view.column >= column) {
-                    return view.index;
-                }
-            }
-        }
-
-        // Place it before the first spacer
-        for (ViewData view : mChildViews) {
-            if (view.isSpacer()) {
-                return view.index;
-            }
-        }
-
-        return -1;
-    }
-
-    /**
-     * Returns the baseline of the given row, or -1 if none is found. This looks for views
-     * in the row which have baseline vertical alignment and also define their own
-     * baseline, and returns the first such match.
-     *
-     * @param row the row to look up a baseline for
-     * @return the baseline relative to the row position, or -1 if not defined
-     */
-    public int getBaseline(int row) {
-        if (row < 0 || row >= mBaselines.length) {
-            return -1;
-        }
-
-        int baseline = mBaselines[row];
-        if (baseline == UNDEFINED) {
-            baseline = -1;
-
-            // TBD: Consider stringing together row information in the view data
-            // so I can quickly identify the views in a given row instead of searching
-            // among all?
-            for (ViewData view : mChildViews) {
-                // We only count baselines for views with rowSpan=1 because
-                // baseline alignment doesn't work for cell spanning views
-                if (view.row == row && view.rowSpan == 1) {
-                    baseline = view.node.getBaseline();
-                    if (baseline != -1) {
-                        // Even views that do have baselines do not count towards a row
-                        // baseline if they have a vertical gravity
-                        String gravity = getGridAttribute(view.node, ATTR_LAYOUT_GRAVITY);
-                        if (gravity == null
-                                || !(gravity.contains(VALUE_TOP)
-                                        || gravity.contains(VALUE_BOTTOM)
-                                        || gravity.contains(VALUE_CENTER_VERTICAL))) {
-                            // Compute baseline relative to the row, not the view itself
-                            baseline += view.node.getBounds().y - getRowY(row);
-                            break;
-                        }
-                    }
-                }
-            }
-            mBaselines[row] = baseline;
-        }
-
-        return baseline;
-    }
-
-    /** Applies the row and column values into the XML */
-    void applyPositionAttributes() {
-        for (ViewData view : mChildViews) {
-            view.applyPositionAttributes();
-        }
-
-        // Also fix the columnCount
-        if (getGridAttribute(layout, ATTR_COLUMN_COUNT) != null &&
-                declaredColumnCount > actualColumnCount) {
-            setGridAttribute(layout, ATTR_COLUMN_COUNT, actualColumnCount);
-        }
-    }
-
-    /**
-     * Sets the given GridLayout attribute (rowCount, layout_row, etc) to the
-     * given value. This automatically handles using the right XML namespace
-     * based on whether the GridLayout is the android.widget.GridLayout, or the
-     * support library GridLayout, and whether it's in a library project or not
-     * etc.
-     *
-     * @param node the node to apply the attribute to
-     * @param name the local name of the attribute
-     * @param value the integer value to set the attribute to
-     */
-    public void setGridAttribute(INode node, String name, int value) {
-        setGridAttribute(node, name, Integer.toString(value));
-    }
-
-    /**
-     * Sets the given GridLayout attribute (rowCount, layout_row, etc) to the
-     * given value. This automatically handles using the right XML namespace
-     * based on whether the GridLayout is the android.widget.GridLayout, or the
-     * support library GridLayout, and whether it's in a library project or not
-     * etc.
-     *
-     * @param node the node to apply the attribute to
-     * @param name the local name of the attribute
-     * @param value the string value to set the attribute to, or null to clear
-     *            it
-     */
-    public void setGridAttribute(INode node, String name, String value) {
-        node.setAttribute(getNamespace(), name, value);
-    }
-
-    /**
-     * Returns the namespace URI to use for GridLayout-specific attributes, such
-     * as columnCount, layout_column, layout_column_span, layout_gravity etc.
-     *
-     * @return the namespace, never null
-     */
-    public String getNamespace() {
-        if (mNamespace == null) {
-            mNamespace = ANDROID_URI;
-
-            String fqcn = layout.getFqcn();
-            if (!fqcn.equals(GRID_LAYOUT) && !fqcn.equals(FQCN_GRID_LAYOUT)) {
-                mNamespace = mRulesEngine.getAppNameSpace();
-            }
-        }
-
-        return mNamespace;
-    }
-
-    /** Removes the given flag from a flag attribute value and returns the result */
-    static String removeFlag(String flag, String value) {
-        if (value.equals(flag)) {
-            return null;
-        }
-        // Handle spaces between pipes and flag are a prefix, suffix and interior occurrences
-        int index = value.indexOf(flag);
-        if (index != -1) {
-            int pipe = value.lastIndexOf('|', index);
-            int endIndex = index + flag.length();
-            if (pipe != -1) {
-                value = value.substring(0, pipe).trim() + value.substring(endIndex).trim();
-            } else {
-                pipe = value.indexOf('|', endIndex);
-                if (pipe != -1) {
-                    value = value.substring(0, index).trim() + value.substring(pipe + 1).trim();
-                } else {
-                    value = value.substring(0, index).trim() + value.substring(endIndex).trim();
-                }
-            }
-        }
-
-        return value;
-    }
-
-    /**
-     * Loads a {@link GridModel} from the XML model.
-     */
-    private void loadFromXml() {
-        INode[] children = layout.getChildren();
-
-        declaredRowCount = getGridAttribute(layout, ATTR_ROW_COUNT, UNDEFINED);
-        declaredColumnCount = getGridAttribute(layout, ATTR_COLUMN_COUNT, UNDEFINED);
-        // Horizontal is the default, so if no value is specified it is horizontal.
-        vertical = VALUE_VERTICAL.equals(getGridAttribute(layout, ATTR_ORIENTATION));
-
-        mChildViews = new ArrayList<ViewData>(children.length);
-        int index = 0;
-        for (INode child : children) {
-            ViewData view = new ViewData(child, index++);
-            mChildViews.add(view);
-        }
-
-        // Assign row/column positions to all cells that do not explicitly define them
-        if (!assignRowsAndColumnsFromViews(mChildViews)) {
-            assignRowsAndColumnsFromXml(
-                    declaredRowCount == UNDEFINED ? children.length : declaredRowCount,
-                    declaredColumnCount == UNDEFINED ? children.length : declaredColumnCount);
-        }
-
-        assignCellBounds();
-
-        for (int i = 0; i <= actualRowCount; i++) {
-            mBaselines[i] = UNDEFINED;
-        }
-    }
-
-    private Pair<Map<Integer, Integer>, Map<Integer, Integer>> findCellsOutsideDeclaredBounds() {
-        // See if we have any (row,column) pairs that fall outside the declared
-        // bounds; for these we identify the number of unique values and assign these
-        // consecutive values
-        Map<Integer, Integer> extraColumnsMap = null;
-        Map<Integer, Integer> extraRowsMap = null;
-        if (declaredRowCount != UNDEFINED) {
-            Set<Integer> extraRows = null;
-            for (ViewData view : mChildViews) {
-                if (view.row >= declaredRowCount) {
-                    if (extraRows == null) {
-                        extraRows = new HashSet<Integer>();
-                    }
-                    extraRows.add(view.row);
-                }
-            }
-            if (extraRows != null && declaredRowCount != UNDEFINED) {
-                List<Integer> rows = new ArrayList<Integer>(extraRows);
-                Collections.sort(rows);
-                int row = declaredRowCount;
-                extraRowsMap = new HashMap<Integer, Integer>();
-                for (Integer declared : rows) {
-                    extraRowsMap.put(declared, row++);
-                }
-            }
-        }
-        if (declaredColumnCount != UNDEFINED) {
-            Set<Integer> extraColumns = null;
-            for (ViewData view : mChildViews) {
-                if (view.column >= declaredColumnCount) {
-                    if (extraColumns == null) {
-                        extraColumns = new HashSet<Integer>();
-                    }
-                    extraColumns.add(view.column);
-                }
-            }
-            if (extraColumns != null && declaredColumnCount != UNDEFINED) {
-                List<Integer> columns = new ArrayList<Integer>(extraColumns);
-                Collections.sort(columns);
-                int column = declaredColumnCount;
-                extraColumnsMap = new HashMap<Integer, Integer>();
-                for (Integer declared : columns) {
-                    extraColumnsMap.put(declared, column++);
-                }
-            }
-        }
-
-        return Pair.of(extraRowsMap, extraColumnsMap);
-    }
-
-    /**
-     * Figure out actual row and column numbers for views that do not specify explicit row
-     * and/or column numbers
-     * TODO: Consolidate with the algorithm in GridLayout to ensure we get the
-     * exact same results!
-     */
-    private void assignRowsAndColumnsFromXml(int rowCount, int columnCount) {
-        Pair<Map<Integer, Integer>, Map<Integer, Integer>> p = findCellsOutsideDeclaredBounds();
-        Map<Integer, Integer> extraRowsMap = p.getFirst();
-        Map<Integer, Integer> extraColumnsMap = p.getSecond();
-
-        if (!vertical) {
-            // Horizontal GridLayout: this is the default. Row and column numbers
-            // are assigned by assuming that the children are assigned successive
-            // column numbers until we get to the column count of the grid, at which
-            // point we jump to the next row. If any cell specifies either an explicit
-            // row number of column number, we jump to the next available position.
-            // Note also that if there are any rowspans on the current row, then the
-            // next row we jump to is below the largest such rowspan - in other words,
-            // the algorithm does not fill holes in the middle!
-
-            // TODO: Ensure that we don't run into trouble if a later element specifies
-            // an earlier number... find out what the layout does in that case!
-            int row = 0;
-            int column = 0;
-            int nextRow = 1;
-            for (ViewData view : mChildViews) {
-                int declaredColumn = view.column;
-                if (declaredColumn != UNDEFINED) {
-                    if (declaredColumn >= columnCount) {
-                        assert extraColumnsMap != null;
-                        declaredColumn = extraColumnsMap.get(declaredColumn);
-                        view.column = declaredColumn;
-                    }
-                    if (declaredColumn < column) {
-                        // Must jump to the next row to accommodate the new row
-                        assert nextRow > row;
-                        //row++;
-                        row = nextRow;
-                    }
-                    column = declaredColumn;
-                } else {
-                    view.column = column;
-                }
-                if (view.row != UNDEFINED) {
-                    // TODO: Should this adjust the column number too? (If so must
-                    // also update view.column since we've already processed the local
-                    // column number)
-                    row = view.row;
-                } else {
-                    view.row = row;
-                }
-
-                nextRow = Math.max(nextRow, view.row + view.rowSpan);
-
-                // Advance
-                column += view.columnSpan;
-                if (column >= columnCount) {
-                    column = 0;
-                    assert nextRow > row;
-                    //row++;
-                    row = nextRow;
-                }
-            }
-        } else {
-            // Vertical layout: successive children are assigned to the same column in
-            // successive rows.
-            int row = 0;
-            int column = 0;
-            int nextColumn = 1;
-            for (ViewData view : mChildViews) {
-                int declaredRow = view.row;
-                if (declaredRow != UNDEFINED) {
-                    if (declaredRow >= rowCount) {
-                        declaredRow = extraRowsMap.get(declaredRow);
-                        view.row = declaredRow;
-                    }
-                    if (declaredRow < row) {
-                        // Must jump to the next column to accommodate the new column
-                        assert nextColumn > column;
-                        column = nextColumn;
-                    }
-                    row = declaredRow;
-                } else {
-                    view.row = row;
-                }
-                if (view.column != UNDEFINED) {
-                    // TODO: Should this adjust the row number too? (If so must
-                    // also update view.row since we've already processed the local
-                    // row number)
-                    column = view.column;
-                } else {
-                    view.column = column;
-                }
-
-                nextColumn = Math.max(nextColumn, view.column + view.columnSpan);
-
-                // Advance
-                row += view.rowSpan;
-                if (row >= rowCount) {
-                    row = 0;
-                    assert nextColumn > column;
-                    //row++;
-                    column = nextColumn;
-                }
-            }
-        }
-    }
-
-    private static boolean sAttemptSpecReflection = true;
-
-    private boolean assignRowsAndColumnsFromViews(List<ViewData> views) {
-        if (!sAttemptSpecReflection) {
-            return false;
-        }
-
-        try {
-            // Lazily initialized reflection methods
-            Field spanField = null;
-            Field rowSpecField = null;
-            Field colSpecField = null;
-            Field minField = null;
-            Field maxField = null;
-            Method getLayoutParams = null;
-
-            for (ViewData view : views) {
-                // TODO: If the element *specifies* anything in XML, use that instead
-                Object child = mRulesEngine.getViewObject(view.node);
-                if (child == null) {
-                    // Fallback to XML model
-                    return false;
-                }
-
-                if (getLayoutParams == null) {
-                    getLayoutParams = child.getClass().getMethod("getLayoutParams"); //$NON-NLS-1$
-                }
-                Object layoutParams = getLayoutParams.invoke(child);
-                if (rowSpecField == null) {
-                    Class<? extends Object> layoutParamsClass = layoutParams.getClass();
-                    rowSpecField = layoutParamsClass.getDeclaredField("rowSpec");    //$NON-NLS-1$
-                    colSpecField = layoutParamsClass.getDeclaredField("columnSpec"); //$NON-NLS-1$
-                    rowSpecField.setAccessible(true);
-                    colSpecField.setAccessible(true);
-                }
-                assert colSpecField != null;
-
-                Object rowSpec = rowSpecField.get(layoutParams);
-                Object colSpec = colSpecField.get(layoutParams);
-                if (spanField == null) {
-                    spanField = rowSpec.getClass().getDeclaredField("span"); //$NON-NLS-1$
-                    spanField.setAccessible(true);
-                }
-                assert spanField != null;
-                Object rowInterval = spanField.get(rowSpec);
-                Object colInterval = spanField.get(colSpec);
-                if (minField == null) {
-                    Class<? extends Object> intervalClass = rowInterval.getClass();
-                    minField = intervalClass.getDeclaredField("min"); //$NON-NLS-1$
-                    maxField = intervalClass.getDeclaredField("max"); //$NON-NLS-1$
-                    minField.setAccessible(true);
-                    maxField.setAccessible(true);
-                }
-                assert maxField != null;
-
-                int row = minField.getInt(rowInterval);
-                int col = minField.getInt(colInterval);
-                int rowEnd = maxField.getInt(rowInterval);
-                int colEnd = maxField.getInt(colInterval);
-
-                view.column = col;
-                view.row = row;
-                view.columnSpan = colEnd - col;
-                view.rowSpan = rowEnd - row;
-            }
-
-            return true;
-
-        } catch (Throwable e) {
-            sAttemptSpecReflection = false;
-            return false;
-        }
-    }
-
-    /**
-     * Computes the positions of the column and row boundaries
-     */
-    private void assignCellBounds() {
-        if (!assignCellBoundsFromView()) {
-            assignCellBoundsFromBounds();
-        }
-        initializeMaxBounds();
-        mBaselines = new int[actualRowCount + 1];
-    }
-
-    /**
-     * Computes the positions of the column and row boundaries, using actual
-     * layout data from the associated GridLayout instance (stored in
-     * {@link #mViewObject})
-     */
-    private boolean assignCellBoundsFromView() {
-        if (mViewObject != null) {
-            Pair<int[], int[]> cellBounds = GridModel.getAxisBounds(mViewObject);
-            if (cellBounds != null) {
-                int[] xs = cellBounds.getFirst();
-                int[] ys = cellBounds.getSecond();
-                Rect layoutBounds = layout.getBounds();
-
-                // Handle "blank" grid layouts: insert a fake grid of CELL_COUNT^2 cells
-                // where the user can do initial placement
-                if (actualColumnCount <= 1 && actualRowCount <= 1 && mChildViews.isEmpty()) {
-                    final int CELL_COUNT = 1;
-                    xs = new int[CELL_COUNT + 1];
-                    ys = new int[CELL_COUNT + 1];
-                    int cellWidth = layoutBounds.w / CELL_COUNT;
-                    int cellHeight = layoutBounds.h / CELL_COUNT;
-
-                    for (int i = 0; i <= CELL_COUNT; i++) {
-                        xs[i] = i * cellWidth;
-                        ys[i] = i * cellHeight;
-                    }
-                }
-
-                actualColumnCount = xs.length - 1;
-                actualRowCount = ys.length - 1;
-
-                int layoutBoundsX = layoutBounds.x;
-                int layoutBoundsY = layoutBounds.y;
-                mLeft = new int[xs.length];
-                mTop = new int[ys.length];
-                for (int i = 0; i < xs.length; i++) {
-                    mLeft[i] = xs[i] + layoutBoundsX;
-                }
-                for (int i = 0; i < ys.length; i++) {
-                    mTop[i] = ys[i] + layoutBoundsY;
-                }
-
-                return true;
-            }
-        }
-
-        return false;
-    }
-
-    /**
-     * Computes the boundaries of the rows and columns by considering the bounds of the
-     * children.
-     */
-    private void assignCellBoundsFromBounds() {
-        Rect layoutBounds = layout.getBounds();
-
-        // Compute the actualColumnCount and actualRowCount. This -should- be
-        // as easy as declaredColumnCount + extraColumnsMap.size(),
-        // but the user doesn't *have* to declare a column count (or a row count)
-        // and we need both, so go and find the actual row and column maximums.
-        int maxColumn = 0;
-        int maxRow = 0;
-        for (ViewData view : mChildViews) {
-            maxColumn = max(maxColumn, view.column);
-            maxRow = max(maxRow, view.row);
-        }
-        actualColumnCount = maxColumn + 1;
-        actualRowCount = maxRow + 1;
-
-        mLeft = new int[actualColumnCount + 1];
-        for (int i = 1; i < actualColumnCount; i++) {
-            mLeft[i] = UNDEFINED;
-        }
-        mLeft[0] = layoutBounds.x;
-        mLeft[actualColumnCount] = layoutBounds.x2();
-        mTop = new int[actualRowCount + 1];
-        for (int i = 1; i < actualRowCount; i++) {
-            mTop[i] = UNDEFINED;
-        }
-        mTop[0] = layoutBounds.y;
-        mTop[actualRowCount] = layoutBounds.y2();
-
-        for (ViewData view : mChildViews) {
-            Rect bounds = view.node.getBounds();
-            if (!bounds.isValid()) {
-                continue;
-            }
-            int column = view.column;
-            int row = view.row;
-
-            if (mLeft[column] == UNDEFINED) {
-                mLeft[column] = bounds.x;
-            } else {
-                mLeft[column] = Math.min(bounds.x, mLeft[column]);
-            }
-            if (mTop[row] == UNDEFINED) {
-                mTop[row] = bounds.y;
-            } else {
-                mTop[row] = Math.min(bounds.y, mTop[row]);
-            }
-        }
-
-        // Ensure that any empty columns/rows have a valid boundary value; for now,
-        for (int i = actualColumnCount - 1; i >= 0; i--) {
-            if (mLeft[i] == UNDEFINED) {
-                if (i == 0) {
-                    mLeft[i] = layoutBounds.x;
-                } else if (i < actualColumnCount - 1) {
-                    mLeft[i] = mLeft[i + 1] - 1;
-                    if (mLeft[i - 1] != UNDEFINED && mLeft[i] < mLeft[i - 1]) {
-                        mLeft[i] = mLeft[i - 1];
-                    }
-                } else {
-                    mLeft[i] = layoutBounds.x2();
-                }
-            }
-        }
-        for (int i = actualRowCount - 1; i >= 0; i--) {
-            if (mTop[i] == UNDEFINED) {
-                if (i == 0) {
-                    mTop[i] = layoutBounds.y;
-                } else if (i < actualRowCount - 1) {
-                    mTop[i] = mTop[i + 1] - 1;
-                    if (mTop[i - 1] != UNDEFINED && mTop[i] < mTop[i - 1]) {
-                        mTop[i] = mTop[i - 1];
-                    }
-                } else {
-                    mTop[i] = layoutBounds.y2();
-                }
-            }
-        }
-
-        // The bounds should be in ascending order now
-        if (false && GridLayoutRule.sDebugGridLayout) {
-            for (int i = 1; i < actualRowCount; i++) {
-                assert mTop[i + 1] >= mTop[i];
-            }
-            for (int i = 0; i < actualColumnCount; i++) {
-                assert mLeft[i + 1] >= mLeft[i];
-            }
-        }
-    }
-
-    /**
-     * Determine, for each row and column, what the largest x and y edges are
-     * within that row or column. This is used to find a natural split point to
-     * suggest when adding something "to the right of" or "below" another view.
-     */
-    private void initializeMaxBounds() {
-        mMaxRight = new int[actualColumnCount + 1];
-        mMaxBottom = new int[actualRowCount + 1];
-
-        for (ViewData view : mChildViews) {
-            Rect bounds = view.node.getBounds();
-            if (!bounds.isValid()) {
-                continue;
-            }
-
-            if (!view.isSpacer()) {
-                int x2 = bounds.x2();
-                int y2 = bounds.y2();
-                int column = view.column;
-                int row = view.row;
-                int targetColumn = min(actualColumnCount - 1,
-                        column + view.columnSpan - 1);
-                int targetRow = min(actualRowCount - 1, row + view.rowSpan - 1);
-                IViewMetadata metadata = mRulesEngine.getMetadata(view.node.getFqcn());
-                if (metadata != null) {
-                    Margins insets = metadata.getInsets();
-                    if (insets != null) {
-                        x2 -= insets.right;
-                        y2 -= insets.bottom;
-                    }
-                }
-                if (mMaxRight[targetColumn] < x2
-                        && ((view.gravity & (GRAVITY_CENTER_HORIZ | GRAVITY_RIGHT)) == 0)) {
-                    mMaxRight[targetColumn] = x2;
-                }
-                if (mMaxBottom[targetRow] < y2
-                        && ((view.gravity & (GRAVITY_CENTER_VERT | GRAVITY_BOTTOM)) == 0)) {
-                    mMaxBottom[targetRow] = y2;
-                }
-            }
-        }
-    }
-
-    /**
-     * Looks up the x[] and y[] locations of the columns and rows in the given GridLayout
-     * instance.
-     *
-     * @param view the GridLayout object, which should already have performed layout
-     * @return a pair of x[] and y[] integer arrays, or null if it could not be found
-     */
-    public static Pair<int[], int[]> getAxisBounds(Object view) {
-        try {
-            Class<?> clz = view.getClass();
-            String verticalAxisName = "verticalAxis";
-            Field horizontalAxis;
-            try {
-                horizontalAxis = clz.getDeclaredField("horizontalAxis"); //$NON-NLS-1$
-            } catch (NoSuchFieldException e) {
-                // Field names changed in KitKat
-                horizontalAxis = clz.getDeclaredField("mHorizontalAxis"); //$NON-NLS-1$
-                verticalAxisName = "mVerticalAxis";
-            }
-            Field verticalAxis = clz.getDeclaredField(verticalAxisName);
-            horizontalAxis.setAccessible(true);
-            verticalAxis.setAccessible(true);
-            Object horizontal = horizontalAxis.get(view);
-            Object vertical = verticalAxis.get(view);
-            Field locations = horizontal.getClass().getDeclaredField("locations"); //$NON-NLS-1$
-            assert locations.getType().isArray() : locations.getType();
-            locations.setAccessible(true);
-            Object horizontalLocations = locations.get(horizontal);
-            Object verticalLocations = locations.get(vertical);
-            int[] xs = (int[]) horizontalLocations;
-            int[] ys = (int[]) verticalLocations;
-            return Pair.of(xs, ys);
-        } catch (Throwable t) {
-            // Probably trying to show a GridLayout on a platform that does not support it.
-            // Return null to indicate that the grid bounds must be computed from view bounds.
-            return null;
-        }
-    }
-
-    /**
-     * Add a new column.
-     *
-     * @param selectedChildren if null or empty, add the column at the end of the grid,
-     *            and otherwise add it before the column of the first selected child
-     * @return the newly added column spacer
-     */
-    public INode addColumn(List<? extends INode> selectedChildren) {
-        // Determine insert index
-        int newColumn = actualColumnCount;
-        if (selectedChildren != null && selectedChildren.size() > 0) {
-            INode first = selectedChildren.get(0);
-            ViewData view = getView(first);
-            newColumn = view.column;
-        }
-
-        INode newView = addColumn(newColumn, null, UNDEFINED, false, UNDEFINED, UNDEFINED);
-        if (newView != null) {
-            mRulesEngine.select(Collections.singletonList(newView));
-        }
-
-        return newView;
-    }
-
-    /**
-     * Adds a new column.
-     *
-     * @param newColumn the column index to insert before
-     * @param newView the {@link INode} to insert as the column spacer, which may be null
-     *            (in which case a spacer is automatically created)
-     * @param columnWidthDp the width, in device independent pixels, of the column to be
-     *            added (which may be {@link #UNDEFINED}
-     * @param split if true, split the existing column into two at the given x position
-     * @param row the row to add the newView to
-     * @param x the x position of the column we're inserting
-     * @return the column spacer
-     */
-    public INode addColumn(int newColumn, INode newView, int columnWidthDp,
-            boolean split, int row, int x) {
-        // Insert a new column
-        actualColumnCount++;
-        if (declaredColumnCount != UNDEFINED) {
-            declaredColumnCount++;
-            setGridAttribute(layout, ATTR_COLUMN_COUNT, declaredColumnCount);
-        }
-
-        boolean isLastColumn = true;
-        for (ViewData view : mChildViews) {
-            if (view.column >= newColumn) {
-                isLastColumn = false;
-                break;
-            }
-        }
-
-        for (ViewData view : mChildViews) {
-            boolean columnSpanSet = false;
-
-            int endColumn = view.column + view.columnSpan;
-            if (view.column >= newColumn || endColumn == newColumn) {
-                if (view.column == newColumn || endColumn == newColumn) {
-                    //if (view.row == 0) {
-                    if (newView == null && !isLastColumn) {
-                        // Insert a new spacer
-                        int index = getChildIndex(layout.getChildren(), view.node);
-                        assert view.index == index; // TODO: Get rid of getter
-                        if (endColumn == newColumn) {
-                            // This cell -ends- at the desired position: insert it after
-                            index++;
-                        }
-
-                        ViewData newViewData = addSpacer(layout, index,
-                                split ? row : UNDEFINED,
-                                split ? newColumn - 1 : UNDEFINED,
-                                columnWidthDp != UNDEFINED ? columnWidthDp : DEFAULT_CELL_WIDTH,
-                                DEFAULT_CELL_HEIGHT);
-                        newViewData.column = newColumn - 1;
-                        newViewData.row = row;
-                        newView = newViewData.node;
-                    }
-
-                    // Set the actual row number on the first cell on the new row.
-                    // This means we don't really need the spacer above to imply
-                    // the new row number, but we use the spacer to assign the row
-                    // some height.
-                    if (view.column == newColumn) {
-                        view.column++;
-                        setGridAttribute(view.node, ATTR_LAYOUT_COLUMN, view.column);
-                    } // else: endColumn == newColumn: handled below
-                } else if (getGridAttribute(view.node, ATTR_LAYOUT_COLUMN) != null) {
-                    view.column++;
-                    setGridAttribute(view.node, ATTR_LAYOUT_COLUMN, view.column);
-                }
-            } else if (endColumn > newColumn) {
-                view.columnSpan++;
-                setColumnSpanAttribute(view.node, view.columnSpan);
-                columnSpanSet = true;
-            }
-
-            if (split && !columnSpanSet && view.node.getBounds().x2() > x) {
-                if (view.node.getBounds().x < x) {
-                    view.columnSpan++;
-                    setColumnSpanAttribute(view.node, view.columnSpan);
-                }
-            }
-        }
-
-        // Hardcode the row numbers if the last column is a new column such that
-        // they don't jump back to backfill the previous row's new last cell
-        if (isLastColumn) {
-            for (ViewData view : mChildViews) {
-                if (view.column == 0 && view.row > 0) {
-                    setGridAttribute(view.node, ATTR_LAYOUT_ROW, view.row);
-                }
-            }
-            if (split) {
-                assert newView == null;
-                addSpacer(layout, -1, row, newColumn -1,
-                        columnWidthDp != UNDEFINED ? columnWidthDp : DEFAULT_CELL_WIDTH,
-                                SPACER_SIZE_DP);
-            }
-        }
-
-        return newView;
-    }
-
-    /**
-     * Removes the columns containing the given selection
-     *
-     * @param selectedChildren a list of nodes whose columns should be deleted
-     */
-    public void removeColumns(List<? extends INode> selectedChildren) {
-        if (selectedChildren.size() == 0) {
-            return;
-        }
-
-        // Figure out which columns should be removed
-        Set<Integer> removeColumns = new HashSet<Integer>();
-        Set<ViewData> removedViews = new HashSet<ViewData>();
-        for (INode child : selectedChildren) {
-            ViewData view = getView(child);
-            removedViews.add(view);
-            removeColumns.add(view.column);
-        }
-        // Sort them in descending order such that we can process each
-        // deletion independently
-        List<Integer> removed = new ArrayList<Integer>(removeColumns);
-        Collections.sort(removed, Collections.reverseOrder());
-
-        for (int removedColumn : removed) {
-            // Remove column.
-            // First, adjust column count.
-            // TODO: Don't do this if the column being deleted is outside
-            // the declared column range!
-            // TODO: Do this under a write lock? / editXml lock?
-            actualColumnCount--;
-            if (declaredColumnCount != UNDEFINED) {
-                declaredColumnCount--;
-            }
-
-            // Remove any elements that begin in the deleted columns...
-            // If they have colspan > 1, then we must insert a spacer instead.
-            // For any other elements that overlap, we need to subtract from the span.
-
-            for (ViewData view : mChildViews) {
-                if (view.column == removedColumn) {
-                    int index = getChildIndex(layout.getChildren(), view.node);
-                    assert view.index == index; // TODO: Get rid of getter
-                    if (view.columnSpan > 1) {
-                        // Make a new spacer which is the width of the following
-                        // columns
-                        int columnWidth = getColumnWidth(removedColumn, view.columnSpan) -
-                                getColumnWidth(removedColumn, 1);
-                        int columnWidthDip = mRulesEngine.pxToDp(columnWidth);
-                        ViewData spacer = addSpacer(layout, index, UNDEFINED, UNDEFINED,
-                                columnWidthDip, SPACER_SIZE_DP);
-                        spacer.row = 0;
-                        spacer.column = removedColumn;
-                    }
-                    layout.removeChild(view.node);
-                } else if (view.column < removedColumn
-                        && view.column + view.columnSpan > removedColumn) {
-                    // Subtract column span to skip this item
-                    view.columnSpan--;
-                    setColumnSpanAttribute(view.node, view.columnSpan);
-                } else if (view.column > removedColumn) {
-                    view.column--;
-                    if (getGridAttribute(view.node, ATTR_LAYOUT_COLUMN) != null) {
-                        setGridAttribute(view.node, ATTR_LAYOUT_COLUMN, view.column);
-                    }
-                }
-            }
-        }
-
-        // Remove children from child list!
-        if (removedViews.size() <= 2) {
-            mChildViews.removeAll(removedViews);
-        } else {
-            List<ViewData> remaining =
-                    new ArrayList<ViewData>(mChildViews.size() - removedViews.size());
-            for (ViewData view : mChildViews) {
-                if (!removedViews.contains(view)) {
-                    remaining.add(view);
-                }
-            }
-            mChildViews = remaining;
-        }
-
-        //if (declaredColumnCount != UNDEFINED) {
-            setGridAttribute(layout, ATTR_COLUMN_COUNT, actualColumnCount);
-        //}
-
-    }
-
-    /**
-     * Add a new row.
-     *
-     * @param selectedChildren if null or empty, add the row at the bottom of the grid,
-     *            and otherwise add it before the row of the first selected child
-     * @return the newly added row spacer
-     */
-    public INode addRow(List<? extends INode> selectedChildren) {
-        // Determine insert index
-        int newRow = actualRowCount;
-        if (selectedChildren.size() > 0) {
-            INode first = selectedChildren.get(0);
-            ViewData view = getView(first);
-            newRow = view.row;
-        }
-
-        INode newView = addRow(newRow, null, UNDEFINED, false, UNDEFINED, UNDEFINED);
-        if (newView != null) {
-            mRulesEngine.select(Collections.singletonList(newView));
-        }
-
-        return newView;
-    }
-
-    /**
-     * Adds a new column.
-     *
-     * @param newRow the row index to insert before
-     * @param newView the {@link INode} to insert as the row spacer, which may be null (in
-     *            which case a spacer is automatically created)
-     * @param rowHeightDp the height, in device independent pixels, of the row to be added
-     *            (which may be {@link #UNDEFINED}
-     * @param split if true, split the existing row into two at the given y position
-     * @param column the column to add the newView to
-     * @param y the y position of the row we're inserting
-     * @return the row spacer
-     */
-    public INode addRow(int newRow, INode newView, int rowHeightDp, boolean split,
-            int column, int y) {
-        actualRowCount++;
-        if (declaredRowCount != UNDEFINED) {
-            declaredRowCount++;
-            setGridAttribute(layout, ATTR_ROW_COUNT, declaredRowCount);
-        }
-
-        boolean added = false;
-        for (ViewData view : mChildViews) {
-            if (view.row >= newRow) {
-                // Adjust the column count
-                if (view.row == newRow && view.column == 0) {
-                    // Insert a new spacer
-                    if (newView == null) {
-                        int index = getChildIndex(layout.getChildren(), view.node);
-                        assert view.index == index; // TODO: Get rid of getter
-                        if (declaredColumnCount != UNDEFINED && !split) {
-                            setGridAttribute(layout, ATTR_COLUMN_COUNT, declaredColumnCount);
-                        }
-                        ViewData newViewData = addSpacer(layout, index,
-                                    split ? newRow - 1 : UNDEFINED,
-                                    split ? column : UNDEFINED,
-                                    SPACER_SIZE_DP,
-                                    rowHeightDp != UNDEFINED ? rowHeightDp : DEFAULT_CELL_HEIGHT);
-                        newViewData.column = column;
-                        newViewData.row = newRow - 1;
-                        newView = newViewData.node;
-                    }
-
-                    // Set the actual row number on the first cell on the new row.
-                    // This means we don't really need the spacer above to imply
-                    // the new row number, but we use the spacer to assign the row
-                    // some height.
-                    view.row++;
-                    setGridAttribute(view.node, ATTR_LAYOUT_ROW, view.row);
-
-                    added = true;
-                } else if (getGridAttribute(view.node, ATTR_LAYOUT_ROW) != null) {
-                    view.row++;
-                    setGridAttribute(view.node, ATTR_LAYOUT_ROW, view.row);
-                }
-            } else {
-                int endRow = view.row + view.rowSpan;
-                if (endRow > newRow) {
-                    view.rowSpan++;
-                    setRowSpanAttribute(view.node, view.rowSpan);
-                } else if (split && view.node.getBounds().y2() > y) {
-                    if (view.node.getBounds().y < y) {
-                        view.rowSpan++;
-                        setRowSpanAttribute(view.node, view.rowSpan);
-                    }
-                }
-            }
-        }
-
-        if (!added) {
-            // Append a row at the end
-            if (newView == null) {
-                ViewData newViewData = addSpacer(layout, -1, UNDEFINED, UNDEFINED,
-                        SPACER_SIZE_DP,
-                        rowHeightDp != UNDEFINED ? rowHeightDp : DEFAULT_CELL_HEIGHT);
-                newViewData.column = column;
-                // TODO: MAke sure this row number is right!
-                newViewData.row = split ? newRow - 1 : newRow;
-                newView = newViewData.node;
-            }
-            if (declaredColumnCount != UNDEFINED && !split) {
-                setGridAttribute(layout, ATTR_COLUMN_COUNT, declaredColumnCount);
-            }
-            if (split) {
-                setGridAttribute(newView, ATTR_LAYOUT_ROW, newRow - 1);
-                setGridAttribute(newView, ATTR_LAYOUT_COLUMN, column);
-            }
-        }
-
-        return newView;
-    }
-
-    /**
-     * Removes the rows containing the given selection
-     *
-     * @param selectedChildren a list of nodes whose rows should be deleted
-     */
-    public void removeRows(List<? extends INode> selectedChildren) {
-        if (selectedChildren.size() == 0) {
-            return;
-        }
-
-        // Figure out which rows should be removed
-        Set<ViewData> removedViews = new HashSet<ViewData>();
-        Set<Integer> removedRows = new HashSet<Integer>();
-        for (INode child : selectedChildren) {
-            ViewData view = getView(child);
-            removedViews.add(view);
-            removedRows.add(view.row);
-        }
-        // Sort them in descending order such that we can process each
-        // deletion independently
-        List<Integer> removed = new ArrayList<Integer>(removedRows);
-        Collections.sort(removed, Collections.reverseOrder());
-
-        for (int removedRow : removed) {
-            // Remove row.
-            // First, adjust row count.
-            // TODO: Don't do this if the row being deleted is outside
-            // the declared row range!
-            actualRowCount--;
-            if (declaredRowCount != UNDEFINED) {
-                declaredRowCount--;
-                setGridAttribute(layout, ATTR_ROW_COUNT, declaredRowCount);
-            }
-
-            // Remove any elements that begin in the deleted rows...
-            // If they have colspan > 1, then we must hardcode a new row number
-            // instead.
-            // For any other elements that overlap, we need to subtract from the span.
-
-            for (ViewData view : mChildViews) {
-                if (view.row == removedRow) {
-                    // We don't have to worry about a rowSpan > 1 here, because even
-                    // if it is, those rowspans are not used to assign default row/column
-                    // positions for other cells
-// TODO: Check this; it differs from the removeColumns logic!
-                    layout.removeChild(view.node);
-                } else if (view.row > removedRow) {
-                    view.row--;
-                    if (getGridAttribute(view.node, ATTR_LAYOUT_ROW) != null) {
-                        setGridAttribute(view.node, ATTR_LAYOUT_ROW, view.row);
-                    }
-                } else if (view.row < removedRow
-                        && view.row + view.rowSpan > removedRow) {
-                    // Subtract row span to skip this item
-                    view.rowSpan--;
-                    setRowSpanAttribute(view.node, view.rowSpan);
-                }
-            }
-        }
-
-        // Remove children from child list!
-        if (removedViews.size() <= 2) {
-            mChildViews.removeAll(removedViews);
-        } else {
-            List<ViewData> remaining =
-                    new ArrayList<ViewData>(mChildViews.size() - removedViews.size());
-            for (ViewData view : mChildViews) {
-                if (!removedViews.contains(view)) {
-                    remaining.add(view);
-                }
-            }
-            mChildViews = remaining;
-        }
-    }
-
-    /**
-     * Returns the row containing the given y line
-     *
-     * @param y the vertical position
-     * @return the row containing the given line
-     */
-    public int getRow(int y) {
-        int row = Arrays.binarySearch(mTop, y);
-        if (row == -1) {
-            // Smaller than the first element; just use the first row
-            return 0;
-        } else if (row < 0) {
-            row = -(row + 2);
-        }
-
-        return row;
-    }
-
-    /**
-     * Returns the column containing the given x line
-     *
-     * @param x the horizontal position
-     * @return the column containing the given line
-     */
-    public int getColumn(int x) {
-        int column = Arrays.binarySearch(mLeft, x);
-        if (column == -1) {
-            // Smaller than the first element; just use the first column
-            return 0;
-        } else if (column < 0) {
-            column = -(column + 2);
-        }
-
-        return column;
-    }
-
-    /**
-     * Returns the closest row to the given y line. This is
-     * either the row containing the line, or the row below it.
-     *
-     * @param y the vertical position
-     * @return the closest row
-     */
-    public int getClosestRow(int y) {
-        int row = Arrays.binarySearch(mTop, y);
-        if (row == -1) {
-            // Smaller than the first element; just use the first column
-            return 0;
-        } else if (row < 0) {
-            row = -(row + 2);
-        }
-
-        if (getRowDistance(row, y) < getRowDistance(row + 1, y)) {
-            return row;
-        } else {
-            return row + 1;
-        }
-    }
-
-    /**
-     * Returns the closest column to the given x line. This is
-     * either the column containing the line, or the column following it.
-     *
-     * @param x the horizontal position
-     * @return the closest column
-     */
-    public int getClosestColumn(int x) {
-        int column = Arrays.binarySearch(mLeft, x);
-        if (column == -1) {
-            // Smaller than the first element; just use the first column
-            return 0;
-        } else if (column < 0) {
-            column = -(column + 2);
-        }
-
-        if (getColumnDistance(column, x) < getColumnDistance(column + 1, x)) {
-            return column;
-        } else {
-            return column + 1;
-        }
-    }
-
-    /**
-     * Returns the distance between the given x position and the beginning of the given column
-     *
-     * @param column the column
-     * @param x the x position
-     * @return the distance between the two
-     */
-    public int getColumnDistance(int column, int x) {
-        return abs(getColumnX(column) - x);
-    }
-
-    /**
-     * Returns the actual width of the given column. This returns the difference between
-     * the rightmost edge of the views (not including spacers) and the left edge of the
-     * column.
-     *
-     * @param column the column
-     * @return the actual width of the non-spacer views in the column
-     */
-    public int getColumnActualWidth(int column) {
-        return getColumnMaxX(column) - getColumnX(column);
-    }
-
-    /**
-     * Returns the distance between the given y position and the top of the given row
-     *
-     * @param row the row
-     * @param y the y position
-     * @return the distance between the two
-     */
-    public int getRowDistance(int row, int y) {
-        return abs(getRowY(row) - y);
-    }
-
-    /**
-     * Returns the y position of the top of the given row
-     *
-     * @param row the target row
-     * @return the y position of its top edge
-     */
-    public int getRowY(int row) {
-        return mTop[min(mTop.length - 1, max(0, row))];
-    }
-
-    /**
-     * Returns the bottom-most edge of any of the non-spacer children in the given row
-     *
-     * @param row the target row
-     * @return the bottom-most edge of any of the non-spacer children in the row
-     */
-    public int getRowMaxY(int row) {
-        return mMaxBottom[min(mMaxBottom.length - 1, max(0, row))];
-    }
-
-    /**
-     * Returns the actual height of the given row. This returns the difference between
-     * the bottom-most edge of the views (not including spacers) and the top edge of the
-     * row.
-     *
-     * @param row the row
-     * @return the actual height of the non-spacer views in the row
-     */
-    public int getRowActualHeight(int row) {
-        return getRowMaxY(row) - getRowY(row);
-    }
-
-    /**
-     * Returns a list of all the nodes that intersects the rows in the range
-     * {@code y1 <= y <= y2}.
-     *
-     * @param y1 the starting y, inclusive
-     * @param y2 the ending y, inclusive
-     * @return a list of nodes intersecting the given rows, never null but possibly empty
-     */
-    public Collection<INode> getIntersectsRow(int y1, int y2) {
-        List<INode> nodes = new ArrayList<INode>();
-
-        for (ViewData view : mChildViews) {
-            if (!view.isSpacer()) {
-                Rect bounds = view.node.getBounds();
-                if (bounds.y2() >= y1 && bounds.y <= y2) {
-                    nodes.add(view.node);
-                }
-            }
-        }
-
-        return nodes;
-    }
-
-    /**
-     * Returns the height of the given row or rows (if the rowSpan is greater than 1)
-     *
-     * @param row the target row
-     * @param rowSpan the row span
-     * @return the height in pixels of the given rows
-     */
-    public int getRowHeight(int row, int rowSpan) {
-        return getRowY(row + rowSpan) - getRowY(row);
-    }
-
-    /**
-     * Returns the x position of the left edge of the given column
-     *
-     * @param column the target column
-     * @return the x position of its left edge
-     */
-    public int getColumnX(int column) {
-        return mLeft[min(mLeft.length - 1, max(0, column))];
-    }
-
-    /**
-     * Returns the rightmost edge of any of the non-spacer children in the given row
-     *
-     * @param column the target column
-     * @return the rightmost edge of any of the non-spacer children in the column
-     */
-    public int getColumnMaxX(int column) {
-        return mMaxRight[min(mMaxRight.length - 1, max(0, column))];
-    }
-
-    /**
-     * Returns the width of the given column or columns (if the columnSpan is greater than 1)
-     *
-     * @param column the target column
-     * @param columnSpan the column span
-     * @return the width in pixels of the given columns
-     */
-    public int getColumnWidth(int column, int columnSpan) {
-        return getColumnX(column + columnSpan) - getColumnX(column);
-    }
-
-    /**
-     * Returns the bounds of the cell at the given row and column position, with the given
-     * row and column spans.
-     *
-     * @param row the target row
-     * @param column the target column
-     * @param rowSpan the row span
-     * @param columnSpan the column span
-     * @return the bounds, in pixels, of the given cell
-     */
-    public Rect getCellBounds(int row, int column, int rowSpan, int columnSpan) {
-        return new Rect(getColumnX(column), getRowY(row),
-                getColumnWidth(column, columnSpan),
-                getRowHeight(row, rowSpan));
-    }
-
-    /**
-     * Produces a display of view contents along with the pixel positions of each
-     * row/column, like the following (used for diagnostics only)
-     *
-     * <pre>
-     *          |0                  |49                 |143                |192           |240
-     *        36|                   |                   |button2            |
-     *        72|                   |radioButton1       |button2            |
-     *        74|button1            |radioButton1       |button2            |
-     *       108|button1            |                   |button2            |
-     *       110|                   |                   |button2            |
-     *       149|                   |                   |                   |
-     *       320
-     * </pre>
-     */
-    @Override
-    public String toString() {
-        // Dump out the view table
-        int cellWidth = 25;
-
-        List<List<List<ViewData>>> rowList = new ArrayList<List<List<ViewData>>>(mTop.length);
-        for (int row = 0; row < mTop.length; row++) {
-            List<List<ViewData>> columnList = new ArrayList<List<ViewData>>(mLeft.length);
-            for (int col = 0; col < mLeft.length; col++) {
-                columnList.add(new ArrayList<ViewData>(4));
-            }
-            rowList.add(columnList);
-        }
-        for (ViewData view : mChildViews) {
-            for (int i = 0; i < view.rowSpan; i++) {
-                if (view.row + i > mTop.length) { // Guard against bogus span values
-                    break;
-                }
-                if (rowList.size() <= view.row + i) {
-                    break;
-                }
-                for (int j = 0; j < view.columnSpan; j++) {
-                    List<List<ViewData>> columnList = rowList.get(view.row + i);
-                    if (columnList.size() <= view.column + j) {
-                        break;
-                    }
-                    columnList.get(view.column + j).add(view);
-                }
-            }
-        }
-
-        StringWriter stringWriter = new StringWriter();
-        PrintWriter out = new PrintWriter(stringWriter);
-        out.printf("%" + cellWidth + "s", ""); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-        for (int col = 0; col < actualColumnCount + 1; col++) {
-            out.printf("|%-" + (cellWidth - 1) + "d", mLeft[col]); //$NON-NLS-1$ //$NON-NLS-2$
-        }
-        out.printf("\n"); //$NON-NLS-1$
-        for (int row = 0; row < actualRowCount + 1; row++) {
-            out.printf("%" + cellWidth + "d", mTop[row]); //$NON-NLS-1$ //$NON-NLS-2$
-            if (row == actualRowCount) {
-                break;
-            }
-            for (int col = 0; col < actualColumnCount; col++) {
-                List<ViewData> views = rowList.get(row).get(col);
-
-                StringBuilder sb = new StringBuilder();
-                for (ViewData view : views) {
-                    String id = view != null ? view.getId() : ""; //$NON-NLS-1$
-                    if (id.startsWith(NEW_ID_PREFIX)) {
-                        id = id.substring(NEW_ID_PREFIX.length());
-                    }
-                    if (id.length() > cellWidth - 2) {
-                        id = id.substring(0, cellWidth - 2);
-                    }
-                    if (sb.length() > 0) {
-                        sb.append(',');
-                    }
-                    sb.append(id);
-                }
-                String cellString = sb.toString();
-                if (cellString.contains(",") && cellString.length() > cellWidth - 2) { //$NON-NLS-1$
-                    cellString = cellString.substring(0, cellWidth - 6) + "...,"; //$NON-NLS-1$
-                }
-                out.printf("|%-" + (cellWidth - 2) + "s ", cellString); //$NON-NLS-1$ //$NON-NLS-2$
-            }
-            out.printf("\n"); //$NON-NLS-1$
-        }
-
-        out.flush();
-        return stringWriter.toString();
-    }
-
-    /**
-     * Split a cell into two or three columns.
-     *
-     * @param newColumn The column number to insert before
-     * @param insertMarginColumn If false, then the cell at newColumn -1 is split with the
-     *            left part taking up exactly columnWidthDp dips. If true, then the column
-     *            is split twice; the left part is the implicit width of the column, the
-     *            new middle (margin) column is exactly the columnWidthDp size and the
-     *            right column is the remaining space of the old cell.
-     * @param columnWidthDp The width of the column inserted before the new column (or if
-     *            insertMarginColumn is false, then the width of the margin column)
-     * @param x the x coordinate of the new column
-     */
-    public void splitColumn(int newColumn, boolean insertMarginColumn, int columnWidthDp, int x) {
-        actualColumnCount++;
-
-        // Insert a new column
-        if (declaredColumnCount != UNDEFINED) {
-            declaredColumnCount++;
-            if (insertMarginColumn) {
-                declaredColumnCount++;
-            }
-            setGridAttribute(layout, ATTR_COLUMN_COUNT, declaredColumnCount);
-        }
-
-        // Are we inserting a new last column in the grid? That requires some special handling...
-        boolean isLastColumn = true;
-        for (ViewData view : mChildViews) {
-            if (view.column >= newColumn) {
-                isLastColumn = false;
-                break;
-            }
-        }
-
-        // Hardcode the row numbers if the last column is a new column such that
-        // they don't jump back to backfill the previous row's new last cell:
-        // TODO: Only do this for horizontal layouts!
-        if (isLastColumn) {
-            for (ViewData view : mChildViews) {
-                if (view.column == 0 && view.row > 0) {
-                    if (getGridAttribute(view.node, ATTR_LAYOUT_ROW) == null) {
-                        setGridAttribute(view.node, ATTR_LAYOUT_ROW, view.row);
-                    }
-                }
-            }
-        }
-
-        // Find the spacer which marks this column, and if found, mark it as a split
-        ViewData prevColumnSpacer = null;
-        for (ViewData view : mChildViews) {
-            if (view.column == newColumn - 1 && view.isColumnSpacer()) {
-                prevColumnSpacer = view;
-                break;
-            }
-        }
-
-        // Process all existing grid elements:
-        //  * Increase column numbers for all columns that have a hardcoded column number
-        //     greater than the new column
-        //  * Set an explicit column=0 where needed (TODO: Implement this)
-        //  * Increase the columnSpan for all columns that overlap the newly inserted column edge
-        //  * Split the spacer which defined the size of this column into two
-        //    (and if not found, create a new spacer)
-        //
-        for (ViewData view : mChildViews) {
-            if (view == prevColumnSpacer) {
-                continue;
-            }
-
-            INode node = view.node;
-            int column = view.column;
-            if (column > newColumn || (column == newColumn && view.node.getBounds().x2() > x)) {
-                // ALWAYS set the column, because
-                //    (1) if it has been set, it needs to be corrected
-                //    (2) if it has not been set, it needs to be set to cause this column
-                //        to skip over the new column (there may be no views for the new
-                //        column on this row).
-                //   TODO: Enhance this such that we only set the column to a skip number
-                //   where necessary, e.g. only on the FIRST view on this row following the
-                //   skipped column!
-
-                //if (getGridAttribute(node, ATTR_LAYOUT_COLUMN) != null) {
-                view.column += insertMarginColumn ? 2 : 1;
-                setGridAttribute(node, ATTR_LAYOUT_COLUMN, view.column);
-                //}
-            } else if (!view.isSpacer()) {
-                // Adjust the column span? We must increase it if
-                //  (1) the new column is inside the range [column, column + columnSpan]
-                //  (2) the new column is within the last cell in the column span,
-                //      and the exact X location of the split is within the horizontal
-                //      *bounds* of this node (provided it has gravity=left)
-                //  (3) the new column is within the last cell and the cell has gravity
-                //      right or gravity center
-                int endColumn = column + view.columnSpan;
-                if (endColumn > newColumn
-                        || endColumn == newColumn && (view.node.getBounds().x2() > x
-                                || GravityHelper.isConstrainedHorizontally(view.gravity)
-                                    &&  !GravityHelper.isLeftAligned(view.gravity))) {
-                    // This cell spans the new insert position, so increment the column span
-                    view.columnSpan += insertMarginColumn ? 2 : 1;
-                    setColumnSpanAttribute(node, view.columnSpan);
-                }
-            }
-        }
-
-        // Insert new spacer:
-        if (prevColumnSpacer != null) {
-            int px = getColumnWidth(newColumn - 1, 1);
-            if (insertMarginColumn || columnWidthDp == 0) {
-                px -= getColumnActualWidth(newColumn - 1);
-            }
-            int dp = mRulesEngine.pxToDp(px);
-            int remaining = dp - columnWidthDp;
-            if (remaining > 0) {
-                prevColumnSpacer.node.setAttribute(ANDROID_URI, ATTR_LAYOUT_WIDTH,
-                        String.format(VALUE_N_DP, remaining));
-                prevColumnSpacer.column = insertMarginColumn ? newColumn + 1 : newColumn;
-                setGridAttribute(prevColumnSpacer.node, ATTR_LAYOUT_COLUMN,
-                        prevColumnSpacer.column);
-            }
-        }
-
-        if (columnWidthDp > 0) {
-            int index = prevColumnSpacer != null ? prevColumnSpacer.index : -1;
-
-            addSpacer(layout, index, 0, insertMarginColumn ? newColumn : newColumn - 1,
-                columnWidthDp, SPACER_SIZE_DP);
-        }
-    }
-
-    /**
-     * Split a cell into two or three rows.
-     *
-     * @param newRow The row number to insert before
-     * @param insertMarginRow If false, then the cell at newRow -1 is split with the above
-     *            part taking up exactly rowHeightDp dips. If true, then the row is split
-     *            twice; the top part is the implicit height of the row, the new middle
-     *            (margin) row is exactly the rowHeightDp size and the bottom column is
-     *            the remaining space of the old cell.
-     * @param rowHeightDp The height of the row inserted before the new row (or if
-     *            insertMarginRow is false, then the height of the margin row)
-     * @param y the y coordinate of the new row
-     */
-    public void splitRow(int newRow, boolean insertMarginRow, int rowHeightDp, int y) {
-        actualRowCount++;
-
-        // Insert a new row
-        if (declaredRowCount != UNDEFINED) {
-            declaredRowCount++;
-            if (insertMarginRow) {
-                declaredRowCount++;
-            }
-            setGridAttribute(layout, ATTR_ROW_COUNT, declaredRowCount);
-        }
-
-        // Find the spacer which marks this row, and if found, mark it as a split
-        ViewData prevRowSpacer = null;
-        for (ViewData view : mChildViews) {
-            if (view.row == newRow - 1 && view.isRowSpacer()) {
-                prevRowSpacer = view;
-                break;
-            }
-        }
-
-        // Se splitColumn() for details
-        for (ViewData view : mChildViews) {
-            if (view == prevRowSpacer) {
-                continue;
-            }
-
-            INode node = view.node;
-            int row = view.row;
-            if (row > newRow || (row == newRow && view.node.getBounds().y2() > y)) {
-                //if (getGridAttribute(node, ATTR_LAYOUT_ROW) != null) {
-                view.row += insertMarginRow ? 2 : 1;
-                setGridAttribute(node, ATTR_LAYOUT_ROW, view.row);
-                //}
-            } else if (!view.isSpacer()) {
-                int endRow = row + view.rowSpan;
-                if (endRow > newRow
-                        || endRow == newRow && (view.node.getBounds().y2() > y
-                                || GravityHelper.isConstrainedVertically(view.gravity)
-                                    && !GravityHelper.isTopAligned(view.gravity))) {
-                    // This cell spans the new insert position, so increment the row span
-                    view.rowSpan += insertMarginRow ? 2 : 1;
-                    setRowSpanAttribute(node, view.rowSpan);
-                }
-            }
-        }
-
-        // Insert new spacer:
-        if (prevRowSpacer != null) {
-            int px = getRowHeight(newRow - 1, 1);
-            if (insertMarginRow || rowHeightDp == 0) {
-                px -= getRowActualHeight(newRow - 1);
-            }
-            int dp = mRulesEngine.pxToDp(px);
-            int remaining = dp - rowHeightDp;
-            if (remaining > 0) {
-                prevRowSpacer.node.setAttribute(ANDROID_URI, ATTR_LAYOUT_HEIGHT,
-                        String.format(VALUE_N_DP, remaining));
-                prevRowSpacer.row = insertMarginRow ? newRow + 1 : newRow;
-                setGridAttribute(prevRowSpacer.node, ATTR_LAYOUT_ROW, prevRowSpacer.row);
-            }
-        }
-
-        if (rowHeightDp > 0) {
-            int index = prevRowSpacer != null ? prevRowSpacer.index : -1;
-            addSpacer(layout, index, insertMarginRow ? newRow : newRow - 1,
-                    0, SPACER_SIZE_DP, rowHeightDp);
-        }
-    }
-
-    /**
-     * Data about a view in a table; this is not the same as a cell because multiple views
-     * can share a single cell, and a view can span many cells.
-     */
-    public class ViewData {
-        public final INode node;
-        public final int index;
-        public int row;
-        public int column;
-        public int rowSpan;
-        public int columnSpan;
-        public int gravity;
-
-        ViewData(INode n, int index) {
-            node = n;
-            this.index = index;
-
-            column = getGridAttribute(n, ATTR_LAYOUT_COLUMN, UNDEFINED);
-            columnSpan = getGridAttribute(n, ATTR_LAYOUT_COLUMN_SPAN, 1);
-            row = getGridAttribute(n, ATTR_LAYOUT_ROW, UNDEFINED);
-            rowSpan = getGridAttribute(n, ATTR_LAYOUT_ROW_SPAN, 1);
-            gravity = GravityHelper.getGravity(getGridAttribute(n, ATTR_LAYOUT_GRAVITY), 0);
-        }
-
-        /** Applies the column and row fields into the XML model */
-        void applyPositionAttributes() {
-            setGridAttribute(node, ATTR_LAYOUT_COLUMN, column);
-            setGridAttribute(node, ATTR_LAYOUT_ROW, row);
-        }
-
-        /** Returns the id of this node, or makes one up for display purposes */
-        String getId() {
-            String id = node.getStringAttr(ANDROID_URI, ATTR_ID);
-            if (id == null) {
-                id = "<unknownid>"; //$NON-NLS-1$
-                String fqn = node.getFqcn();
-                fqn = fqn.substring(fqn.lastIndexOf('.') + 1);
-                id = fqn + "-"
-                        + Integer.toString(System.identityHashCode(node)).substring(0, 3);
-            }
-
-            return id;
-        }
-
-        /** Returns true if this {@link ViewData} represents a spacer */
-        boolean isSpacer() {
-            return isSpace(node.getFqcn());
-        }
-
-        /**
-         * Returns true if this {@link ViewData} represents a column spacer
-         */
-        boolean isColumnSpacer() {
-            return isSpacer() &&
-                // Any spacer not found in column 0 is a column spacer since we
-                // place all horizontal spacers in column 0
-                ((column > 0)
-                // TODO: Find a cleaner way. Maybe set ids on the elements in (0,0) and
-                // for column distinguish by id. Or at least only do this for column 0!
-                || !SPACER_SIZE.equals(node.getStringAttr(ANDROID_URI, ATTR_LAYOUT_WIDTH)));
-        }
-
-        /**
-         * Returns true if this {@link ViewData} represents a row spacer
-         */
-        boolean isRowSpacer() {
-            return isSpacer() &&
-                // Any spacer not found in row 0 is a row spacer since we
-                // place all vertical spacers in row 0
-                ((row > 0)
-                // TODO: Find a cleaner way. Maybe set ids on the elements in (0,0) and
-                // for column distinguish by id. Or at least only do this for column 0!
-                || !SPACER_SIZE.equals(node.getStringAttr(ANDROID_URI, ATTR_LAYOUT_HEIGHT)));
-        }
-    }
-
-    /**
-     * Sets the column span of the given node to the given value (or if the value is 1,
-     * removes it)
-     *
-     * @param node the target node
-     * @param span the new column span
-     */
-    public void setColumnSpanAttribute(INode node, int span) {
-        setGridAttribute(node, ATTR_LAYOUT_COLUMN_SPAN, span > 1 ? Integer.toString(span) : null);
-    }
-
-    /**
-     * Sets the row span of the given node to the given value (or if the value is 1,
-     * removes it)
-     *
-     * @param node the target node
-     * @param span the new row span
-     */
-    public void setRowSpanAttribute(INode node, int span) {
-        setGridAttribute(node, ATTR_LAYOUT_ROW_SPAN, span > 1 ? Integer.toString(span) : null);
-    }
-
-    /** Returns the index of the given target node in the given child node array */
-    static int getChildIndex(INode[] children, INode target) {
-        int index = 0;
-        for (INode child : children) {
-            if (child == target) {
-                return index;
-            }
-            index++;
-        }
-
-        return -1;
-    }
-
-    /**
-     * Update the model to account for the given nodes getting deleted. The nodes
-     * are not actually deleted by this method; that is assumed to be performed by the
-     * caller. Instead this method performs whatever model updates are necessary to
-     * preserve the grid structure.
-     *
-     * @param nodes the nodes to be deleted
-     */
-    public void onDeleted(@NonNull List<INode> nodes) {
-        if (nodes.size() == 0) {
-            return;
-        }
-
-        // Attempt to clean up spacer objects for any newly-empty rows or columns
-        // as the result of this deletion
-
-        Set<INode> deleted = new HashSet<INode>();
-
-        for (INode child : nodes) {
-            // We don't care about deletion of spacers
-            String fqcn = child.getFqcn();
-            if (fqcn.equals(FQCN_SPACE) || fqcn.equals(FQCN_SPACE_V7)) {
-                continue;
-            }
-            deleted.add(child);
-        }
-
-        Set<Integer> usedColumns = new HashSet<Integer>(actualColumnCount);
-        Set<Integer> usedRows = new HashSet<Integer>(actualRowCount);
-        Multimap<Integer, ViewData> columnSpacers = ArrayListMultimap.create(actualColumnCount, 2);
-        Multimap<Integer, ViewData> rowSpacers = ArrayListMultimap.create(actualRowCount, 2);
-        Set<ViewData> removedViews = new HashSet<ViewData>();
-
-        for (ViewData view : mChildViews) {
-            if (deleted.contains(view.node)) {
-                removedViews.add(view);
-            } else if (view.isColumnSpacer()) {
-                columnSpacers.put(view.column, view);
-            } else if (view.isRowSpacer()) {
-                rowSpacers.put(view.row, view);
-            } else {
-                usedColumns.add(Integer.valueOf(view.column));
-                usedRows.add(Integer.valueOf(view.row));
-            }
-        }
-
-        if (usedColumns.size() == 0 || usedRows.size() == 0) {
-            // No more views - just remove all the spacers
-            for (ViewData spacer : columnSpacers.values()) {
-                layout.removeChild(spacer.node);
-            }
-            for (ViewData spacer : rowSpacers.values()) {
-                layout.removeChild(spacer.node);
-            }
-            mChildViews.clear();
-            actualColumnCount = 0;
-            declaredColumnCount = 2;
-            actualRowCount = 0;
-            declaredRowCount = UNDEFINED;
-            setGridAttribute(layout, ATTR_COLUMN_COUNT, 2);
-
-            return;
-        }
-
-        // Determine columns to introduce spacers into:
-        // This is tricky; I should NOT combine spacers if there are cells tied to
-        // individual ones
-
-        // TODO: Invalidate column sizes too! Otherwise repeated updates might get confused!
-        // Similarly, inserts need to do the same!
-
-        // Produce map of old column numbers to new column numbers
-        // Collapse regions of consecutive space and non-space ranges together
-        int[] columnMap = new int[actualColumnCount + 1]; // +1: Easily handle columnSpans as well
-        int newColumn = 0;
-        boolean prevUsed = usedColumns.contains(0);
-        for (int column = 1; column < actualColumnCount; column++) {
-            boolean used = usedColumns.contains(column);
-            if (used || prevUsed != used) {
-                newColumn++;
-                prevUsed = used;
-            }
-            columnMap[column] = newColumn;
-        }
-        newColumn++;
-        columnMap[actualColumnCount] = newColumn;
-        assert columnMap[0] == 0;
-
-        int[] rowMap = new int[actualRowCount + 1]; // +1: Easily handle rowSpans as well
-        int newRow = 0;
-        prevUsed = usedRows.contains(0);
-        for (int row = 1; row < actualRowCount; row++) {
-            boolean used = usedRows.contains(row);
-            if (used || prevUsed != used) {
-                newRow++;
-                prevUsed = used;
-            }
-            rowMap[row] = newRow;
-        }
-        newRow++;
-        rowMap[actualRowCount] = newRow;
-        assert rowMap[0] == 0;
-
-
-        // Adjust column and row numbers to account for deletions: for a given cell, if it
-        // is to the right of a deleted column, reduce its column number, and if it only
-        // spans across the deleted column, reduce its column span.
-        for (ViewData view : mChildViews) {
-            if (removedViews.contains(view)) {
-                continue;
-            }
-            int newColumnStart = columnMap[Math.min(columnMap.length - 1, view.column)];
-            // Gracefully handle rogue/invalid columnSpans in the XML
-            int newColumnEnd = columnMap[Math.min(columnMap.length - 1,
-                    view.column + view.columnSpan)];
-            if (newColumnStart != view.column) {
-                view.column = newColumnStart;
-                setGridAttribute(view.node, ATTR_LAYOUT_COLUMN, view.column);
-            }
-
-            int columnSpan = newColumnEnd - newColumnStart;
-            if (columnSpan != view.columnSpan) {
-                if (columnSpan >= 1) {
-                    view.columnSpan = columnSpan;
-                    setColumnSpanAttribute(view.node, view.columnSpan);
-                } // else: merging spacing columns together
-            }
-
-
-            int newRowStart = rowMap[Math.min(rowMap.length - 1, view.row)];
-            int newRowEnd = rowMap[Math.min(rowMap.length - 1, view.row + view.rowSpan)];
-            if (newRowStart != view.row) {
-                view.row = newRowStart;
-                setGridAttribute(view.node, ATTR_LAYOUT_ROW, view.row);
-            }
-
-            int rowSpan = newRowEnd - newRowStart;
-            if (rowSpan != view.rowSpan) {
-                if (rowSpan >= 1) {
-                    view.rowSpan = rowSpan;
-                    setRowSpanAttribute(view.node, view.rowSpan);
-                } // else: merging spacing rows together
-            }
-        }
-
-        // Merge spacers (and add spacers for newly empty columns)
-        int start = 0;
-        while (start < actualColumnCount) {
-            // Find next unused span
-            while (start < actualColumnCount && usedColumns.contains(start)) {
-                start++;
-            }
-            if (start == actualColumnCount) {
-                break;
-            }
-            assert !usedColumns.contains(start);
-            // Find the next span of unused columns and produce a SINGLE
-            // spacer for that range (unless it's a zero-sized columns)
-            int end = start + 1;
-            for (; end < actualColumnCount; end++) {
-                if (usedColumns.contains(end)) {
-                    break;
-                }
-            }
-
-            // Add up column sizes
-            int width = getColumnWidth(start, end - start);
-
-            // Find all spacers: the first one found should be moved to the start column
-            // and assigned to the full height of the columns, and
-            // the column count reduced by the corresponding amount
-
-            // TODO: if width = 0, fully remove
-
-            boolean isFirstSpacer = true;
-            for (int column = start; column < end; column++) {
-                Collection<ViewData> spacers = columnSpacers.get(column);
-                if (spacers != null && !spacers.isEmpty()) {
-                    // Avoid ConcurrentModificationException since we're inserting into the
-                    // map within this loop (always at a different index, but the map doesn't
-                    // know that)
-                    spacers = new ArrayList<ViewData>(spacers);
-                    for (ViewData spacer : spacers) {
-                        if (isFirstSpacer) {
-                            isFirstSpacer = false;
-                            spacer.column = columnMap[start];
-                            setGridAttribute(spacer.node, ATTR_LAYOUT_COLUMN, spacer.column);
-                            if (end - start > 1) {
-                                // Compute a merged width for all the spacers (not needed if
-                                // there's just one spacer; it should already have the correct width)
-                                int columnWidthDp = mRulesEngine.pxToDp(width);
-                                spacer.node.setAttribute(ANDROID_URI, ATTR_LAYOUT_WIDTH,
-                                        String.format(VALUE_N_DP, columnWidthDp));
-                            }
-                            columnSpacers.put(start, spacer);
-                        } else {
-                            removedViews.add(spacer); // Mark for model removal
-                            layout.removeChild(spacer.node);
-                        }
-                    }
-                }
-            }
-
-            if (isFirstSpacer) {
-                // No spacer: create one
-                int columnWidthDp = mRulesEngine.pxToDp(width);
-                addSpacer(layout, -1, UNDEFINED, columnMap[start], columnWidthDp, DEFAULT_CELL_HEIGHT);
-            }
-
-            start = end;
-        }
-        actualColumnCount = newColumn;
-//if (usedColumns.contains(newColumn)) {
-//    // TODO: This may be totally wrong for right aligned content!
-//    actualColumnCount++;
-//}
-
-        // Merge spacers for rows
-        start = 0;
-        while (start < actualRowCount) {
-            // Find next unused span
-            while (start < actualRowCount && usedRows.contains(start)) {
-                start++;
-            }
-            if (start == actualRowCount) {
-                break;
-            }
-            assert !usedRows.contains(start);
-            // Find the next span of unused rows and produce a SINGLE
-            // spacer for that range (unless it's a zero-sized rows)
-            int end = start + 1;
-            for (; end < actualRowCount; end++) {
-                if (usedRows.contains(end)) {
-                    break;
-                }
-            }
-
-            // Add up row sizes
-            int height = getRowHeight(start, end - start);
-
-            // Find all spacers: the first one found should be moved to the start row
-            // and assigned to the full height of the rows, and
-            // the row count reduced by the corresponding amount
-
-            // TODO: if width = 0, fully remove
-
-            boolean isFirstSpacer = true;
-            for (int row = start; row < end; row++) {
-                Collection<ViewData> spacers = rowSpacers.get(row);
-                if (spacers != null && !spacers.isEmpty()) {
-                    // Avoid ConcurrentModificationException since we're inserting into the
-                    // map within this loop (always at a different index, but the map doesn't
-                    // know that)
-                    spacers = new ArrayList<ViewData>(spacers);
-                    for (ViewData spacer : spacers) {
-                        if (isFirstSpacer) {
-                            isFirstSpacer = false;
-                            spacer.row = rowMap[start];
-                            setGridAttribute(spacer.node, ATTR_LAYOUT_ROW, spacer.row);
-                            if (end - start > 1) {
-                                // Compute a merged width for all the spacers (not needed if
-                                // there's just one spacer; it should already have the correct height)
-                                int rowHeightDp = mRulesEngine.pxToDp(height);
-                                spacer.node.setAttribute(ANDROID_URI, ATTR_LAYOUT_HEIGHT,
-                                        String.format(VALUE_N_DP, rowHeightDp));
-                            }
-                            rowSpacers.put(start, spacer);
-                        } else {
-                            removedViews.add(spacer); // Mark for model removal
-                            layout.removeChild(spacer.node);
-                        }
-                    }
-                }
-            }
-
-            if (isFirstSpacer) {
-                // No spacer: create one
-                int rowWidthDp = mRulesEngine.pxToDp(height);
-                addSpacer(layout, -1, rowMap[start], UNDEFINED, DEFAULT_CELL_WIDTH, rowWidthDp);
-            }
-
-            start = end;
-        }
-        actualRowCount = newRow;
-//        if (usedRows.contains(newRow)) {
-//            actualRowCount++;
-//        }
-
-        // Update the model: remove removed children from the view data list
-        if (removedViews.size() <= 2) {
-            mChildViews.removeAll(removedViews);
-        } else {
-            List<ViewData> remaining =
-                    new ArrayList<ViewData>(mChildViews.size() - removedViews.size());
-            for (ViewData view : mChildViews) {
-                if (!removedViews.contains(view)) {
-                    remaining.add(view);
-                }
-            }
-            mChildViews = remaining;
-        }
-
-        // Update the final column and row declared attributes
-        if (declaredColumnCount != UNDEFINED) {
-            declaredColumnCount = actualColumnCount;
-            setGridAttribute(layout, ATTR_COLUMN_COUNT, actualColumnCount);
-        }
-        if (declaredRowCount != UNDEFINED) {
-            declaredRowCount = actualRowCount;
-            setGridAttribute(layout, ATTR_ROW_COUNT, actualRowCount);
-        }
-    }
-
-    /**
-     * Adds a spacer to the given parent, at the given index.
-     *
-     * @param parent the GridLayout
-     * @param index the index to insert the spacer at, or -1 to append
-     * @param row the row to add the spacer to (or {@link #UNDEFINED} to not set a row yet
-     * @param column the column to add the spacer to (or {@link #UNDEFINED} to not set a
-     *            column yet
-     * @param widthDp the width in device independent pixels to assign to the spacer
-     * @param heightDp the height in device independent pixels to assign to the spacer
-     * @return the newly added spacer
-     */
-    ViewData addSpacer(INode parent, int index, int row, int column,
-            int widthDp, int heightDp) {
-        INode spacer;
-
-        String tag = FQCN_SPACE;
-        String gridLayout = parent.getFqcn();
-        if (!gridLayout.equals(GRID_LAYOUT) && gridLayout.length() > GRID_LAYOUT.length()) {
-            String pkg = gridLayout.substring(0, gridLayout.length() - GRID_LAYOUT.length());
-            tag = pkg + SPACE;
-        }
-        if (index != -1) {
-            spacer = parent.insertChildAt(tag, index);
-        } else {
-            spacer = parent.appendChild(tag);
-        }
-
-        ViewData view = new ViewData(spacer, index != -1 ? index : mChildViews.size());
-        mChildViews.add(view);
-
-        if (row != UNDEFINED) {
-            view.row = row;
-            setGridAttribute(spacer, ATTR_LAYOUT_ROW, row);
-        }
-        if (column != UNDEFINED) {
-            view.column = column;
-            setGridAttribute(spacer, ATTR_LAYOUT_COLUMN, column);
-        }
-        if (widthDp > 0) {
-            spacer.setAttribute(ANDROID_URI, ATTR_LAYOUT_WIDTH,
-                    String.format(VALUE_N_DP, widthDp));
-        }
-        if (heightDp > 0) {
-            spacer.setAttribute(ANDROID_URI, ATTR_LAYOUT_HEIGHT,
-                    String.format(VALUE_N_DP, heightDp));
-        }
-
-        // Temporary hack
-        if (GridLayoutRule.sDebugGridLayout) {
-            //String id = NEW_ID_PREFIX + "s";
-            //if (row == 0) {
-            //    id += "c";
-            //}
-            //if (column == 0) {
-            //    id += "r";
-            //}
-            //if (row > 0) {
-            //    id += Integer.toString(row);
-            //}
-            //if (column > 0) {
-            //    id += Integer.toString(column);
-            //}
-            String id = NEW_ID_PREFIX + "spacer_" //$NON-NLS-1$
-                    + Integer.toString(System.identityHashCode(spacer)).substring(0, 3);
-            spacer.setAttribute(ANDROID_URI, ATTR_ID, id);
-        }
-
-
-        return view;
-    }
-
-    /**
-     * Returns the string value of the given attribute, or null if it does not
-     * exist. This only works for attributes that are GridLayout specific, such
-     * as columnCount, layout_column, layout_row_span, etc.
-     *
-     * @param node the target node
-     * @param name the attribute name (which must be in the android: namespace)
-     * @return the attribute value or null
-     */
-
-    public String getGridAttribute(INode node, String name) {
-        return node.getStringAttr(getNamespace(), name);
-    }
-
-    /**
-     * Returns the integer value of the given attribute, or the given defaultValue if the
-     * attribute was not set. This only works for attributes that are GridLayout specific,
-     * such as columnCount, layout_column, layout_row_span, etc.
-     *
-     * @param node the target node
-     * @param attribute the attribute name (which must be in the android: namespace)
-     * @param defaultValue the default value to use if the value is not set
-     * @return the attribute integer value
-     */
-    private int getGridAttribute(INode node, String attribute, int defaultValue) {
-        String valueString = node.getStringAttr(getNamespace(), attribute);
-        if (valueString != null) {
-            try {
-                return Integer.decode(valueString);
-            } catch (NumberFormatException nufe) {
-                // Ignore - error in user's XML
-            }
-        }
-
-        return defaultValue;
-    }
-
-    /**
-     * Returns the number of children views in the GridLayout
-     *
-     * @return the number of children views in the GridLayout
-     */
-    public int getViewCount() {
-        return mChildViews.size();
-    }
-
-    /**
-     * Returns true if the given class name represents a spacer
-     *
-     * @param fqcn the fully qualified class name
-     * @return true if this is a spacer
-     */
-    public static boolean isSpace(String fqcn) {
-        return FQCN_SPACE.equals(fqcn) || FQCN_SPACE_V7.equals(fqcn);
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/gridmode.png b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/gridmode.png
deleted file mode 100644
index 59e0a45..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/gridmode.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/hlinear.png b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/hlinear.png
deleted file mode 100644
index b293fe7..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/hlinear.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/margins.png b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/margins.png
deleted file mode 100644
index b0d8141..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/margins.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/relative/ConstraintPainter.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/relative/ConstraintPainter.java
deleted file mode 100644
index 447d2d8..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/relative/ConstraintPainter.java
+++ /dev/null
@@ -1,783 +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.layout.relative;
-
-import static com.android.ide.common.api.DrawingStyle.DEPENDENCY;
-import static com.android.ide.common.api.DrawingStyle.GUIDELINE;
-import static com.android.ide.common.api.DrawingStyle.GUIDELINE_DASHED;
-import static com.android.ide.common.api.SegmentType.BASELINE;
-import static com.android.ide.common.api.SegmentType.BOTTOM;
-import static com.android.ide.common.api.SegmentType.CENTER_HORIZONTAL;
-import static com.android.ide.common.api.SegmentType.CENTER_VERTICAL;
-import static com.android.ide.common.api.SegmentType.LEFT;
-import static com.android.ide.common.api.SegmentType.RIGHT;
-import static com.android.ide.common.api.SegmentType.TOP;
-import static com.android.ide.common.api.SegmentType.UNKNOWN;
-import static com.android.ide.common.layout.relative.ConstraintType.ALIGN_BASELINE;
-import static com.android.ide.common.layout.relative.ConstraintType.ALIGN_BOTTOM;
-import static com.android.ide.common.layout.relative.ConstraintType.LAYOUT_ABOVE;
-import static com.android.ide.common.layout.relative.ConstraintType.LAYOUT_BELOW;
-import static com.android.ide.common.layout.relative.ConstraintType.LAYOUT_LEFT_OF;
-import static com.android.ide.common.layout.relative.ConstraintType.LAYOUT_RIGHT_OF;
-
-import com.android.ide.common.api.DrawingStyle;
-import com.android.ide.common.api.IGraphics;
-import com.android.ide.common.api.INode;
-import com.android.ide.common.api.Margins;
-import com.android.ide.common.api.Rect;
-import com.android.ide.common.api.SegmentType;
-import com.android.ide.common.layout.relative.DependencyGraph.Constraint;
-import com.android.ide.common.layout.relative.DependencyGraph.ViewData;
-
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-/**
- * The {@link ConstraintPainter} is responsible for painting relative layout constraints -
- * such as a source node having its top edge constrained to a target node with a given margin.
- * This painter is used both to show static constraints, as well as visualizing proposed
- * constraints during a move or resize operation.
- */
-public class ConstraintPainter {
-    /** The size of the arrow head */
-    private static final int ARROW_SIZE = 5;
-    /** Size (height for horizontal, and width for vertical) parent feedback rectangles */
-    private static final int PARENT_RECT_SIZE = 12;
-
-    /**
-     * Paints a given match as a constraint.
-     *
-     * @param graphics the graphics context
-     * @param sourceBounds the source bounds
-     * @param match the match
-     */
-    static void paintConstraint(IGraphics graphics, Rect sourceBounds, Match match) {
-        Rect targetBounds = match.edge.node.getBounds();
-        ConstraintType type = match.type;
-        assert type != null;
-        paintConstraint(graphics, type, match.with.node, sourceBounds, match.edge.node,
-                targetBounds, null /* allConstraints */, true /* highlightTargetEdge */);
-    }
-
-    /**
-     * Paints a constraint.
-     * <p>
-     * TODO: when there are multiple links originating in the same direction from
-     * center, maybe offset them slightly from each other?
-     *
-     * @param graphics the graphics context to draw into
-     * @param constraint The constraint to be drawn
-     */
-    private static void paintConstraint(IGraphics graphics, Constraint constraint,
-            Set<Constraint> allConstraints) {
-        ViewData source = constraint.from;
-        ViewData target = constraint.to;
-
-        INode sourceNode = source.node;
-        INode targetNode = target.node;
-        if (sourceNode == targetNode) {
-            // Self reference - don't visualize
-            return;
-        }
-
-        Rect sourceBounds = sourceNode.getBounds();
-        Rect targetBounds = targetNode.getBounds();
-        paintConstraint(graphics, constraint.type, sourceNode, sourceBounds, targetNode,
-                targetBounds, allConstraints, false /* highlightTargetEdge */);
-    }
-
-    /**
-     * Paint selection feedback by painting constraints for the selected nodes
-     *
-     * @param graphics the graphics context
-     * @param parentNode the parent relative layout
-     * @param childNodes the nodes whose constraints should be painted
-     * @param showDependents whether incoming constraints should be shown as well
-     */
-    public static void paintSelectionFeedback(IGraphics graphics, INode parentNode,
-            List<? extends INode> childNodes, boolean showDependents) {
-
-        DependencyGraph dependencyGraph = new DependencyGraph(parentNode);
-        Set<INode> horizontalDeps = dependencyGraph.dependsOn(childNodes, false /* vertical */);
-        Set<INode> verticalDeps = dependencyGraph.dependsOn(childNodes, true /* vertical */);
-        Set<INode> deps = new HashSet<INode>(horizontalDeps.size() + verticalDeps.size());
-        deps.addAll(horizontalDeps);
-        deps.addAll(verticalDeps);
-        if (deps.size() > 0) {
-            graphics.useStyle(DEPENDENCY);
-            for (INode node : deps) {
-                // Don't highlight the selected nodes themselves
-                if (childNodes.contains(node)) {
-                    continue;
-                }
-                Rect bounds = node.getBounds();
-                graphics.fillRect(bounds);
-            }
-        }
-
-        graphics.useStyle(GUIDELINE);
-        for (INode childNode : childNodes) {
-            ViewData view = dependencyGraph.getView(childNode);
-            if (view == null) {
-                continue;
-            }
-
-            // Paint all incoming constraints
-            if (showDependents) {
-                paintConstraints(graphics, view.dependedOnBy);
-            }
-
-            // Paint all outgoing constraints
-            paintConstraints(graphics, view.dependsOn);
-        }
-    }
-
-    /**
-     * Paints a set of constraints.
-     */
-    private static void paintConstraints(IGraphics graphics, List<Constraint> constraints) {
-        Set<Constraint> mutableConstraintSet = new HashSet<Constraint>(constraints);
-
-        // WORKAROUND! Hide alignBottom attachments if we also have a alignBaseline
-        // constraint; this is because we also *add* alignBottom attachments when you add
-        // alignBaseline constraints to work around a surprising behavior of baseline
-        // constraints.
-        for (Constraint constraint : constraints) {
-            if (constraint.type == ALIGN_BASELINE) {
-                // Remove any baseline
-                for (Constraint c : constraints) {
-                    if (c.type == ALIGN_BOTTOM && c.to.node == constraint.to.node) {
-                        mutableConstraintSet.remove(c);
-                    }
-                }
-            }
-        }
-
-        for (Constraint constraint : constraints) {
-            // paintConstraint can digest more than one constraint, so we need to keep
-            // checking to see if the given constraint is still relevant.
-            if (mutableConstraintSet.contains(constraint)) {
-                paintConstraint(graphics, constraint, mutableConstraintSet);
-            }
-        }
-    }
-
-    /**
-     * Paints a constraint of the given type from the given source node, to the
-     * given target node, with the specified bounds.
-     */
-    private static void paintConstraint(IGraphics graphics, ConstraintType type, INode sourceNode,
-            Rect sourceBounds, INode targetNode, Rect targetBounds,
-            Set<Constraint> allConstraints, boolean highlightTargetEdge) {
-
-        SegmentType sourceSegmentTypeX = type.sourceSegmentTypeX;
-        SegmentType sourceSegmentTypeY = type.sourceSegmentTypeY;
-        SegmentType targetSegmentTypeX = type.targetSegmentTypeX;
-        SegmentType targetSegmentTypeY = type.targetSegmentTypeY;
-
-        // Horizontal center constraint?
-        if (sourceSegmentTypeX == CENTER_VERTICAL && targetSegmentTypeX == CENTER_VERTICAL) {
-            paintHorizontalCenterConstraint(graphics, sourceBounds, targetBounds);
-            return;
-        }
-
-        // Vertical center constraint?
-        if (sourceSegmentTypeY == CENTER_HORIZONTAL && targetSegmentTypeY == CENTER_HORIZONTAL) {
-            paintVerticalCenterConstraint(graphics, sourceBounds, targetBounds);
-            return;
-        }
-
-        // Corner constraint?
-        if (allConstraints != null
-                && (type == LAYOUT_ABOVE || type == LAYOUT_BELOW
-                        || type == LAYOUT_LEFT_OF || type == LAYOUT_RIGHT_OF)) {
-            if (paintCornerConstraint(graphics, type, sourceNode, sourceBounds, targetNode,
-                    targetBounds, allConstraints)) {
-                return;
-            }
-        }
-
-        // Vertical constraint?
-        if (sourceSegmentTypeX == UNKNOWN) {
-            paintVerticalConstraint(graphics, type, sourceNode, sourceBounds, targetNode,
-                    targetBounds, highlightTargetEdge);
-            return;
-        }
-
-        // Horizontal constraint?
-        if (sourceSegmentTypeY == UNKNOWN) {
-            paintHorizontalConstraint(graphics, type, sourceNode, sourceBounds, targetNode,
-                    targetBounds, highlightTargetEdge);
-            return;
-        }
-
-        // This shouldn't happen - it means we have a constraint that defines all sides
-        // and is not a centering constraint
-        assert false;
-    }
-
-    /**
-     * Paints a corner constraint, or returns false if this constraint is not a corner.
-     * A corner is one where there are two constraints from this source node to the
-     * same target node, one horizontal and one vertical, to the closest edges on
-     * the target node.
-     * <p>
-     * Corners are a common occurrence. If we treat the horizontal and vertical
-     * constraints separately (below & toRightOf), then we end up with a lot of
-     * extra lines and arrows -- e.g. two shared edges and arrows pointing to these
-     * shared edges:
-     *
-     * <pre>
-     *  +--------+ |
-     *  | Target -->
-     *  +----|---+ |
-     *       v
-     *  - - - - - -|- - - - - -
-     *                   ^
-     *             | +---|----+
-     *             <-- Source |
-     *             | +--------+
-     *
-     * Instead, we can simply draw a diagonal arrow here to represent BOTH constraints and
-     * reduce clutter:
-     *
-     *  +---------+
-     *  | Target _|
-     *  +-------|\+
-     *            \
-     *             \--------+
-     *             | Source |
-     *             +--------+
-     * </pre>
-     *
-     * @param graphics the graphics context to draw
-     * @param type the constraint to be drawn
-     * @param sourceNode the source node
-     * @param sourceBounds the bounds of the source node
-     * @param targetNode the target node
-     * @param targetBounds the bounds of the target node
-     * @param allConstraints the set of all constraints; if a corner is found and painted the
-     *    matching corner constraint is removed from the set
-     * @return true if the constraint was handled and painted as a corner, false otherwise
-     */
-    private static boolean paintCornerConstraint(IGraphics graphics, ConstraintType type,
-            INode sourceNode, Rect sourceBounds, INode targetNode, Rect targetBounds,
-            Set<Constraint> allConstraints) {
-
-        SegmentType sourceSegmentTypeX = type.sourceSegmentTypeX;
-        SegmentType sourceSegmentTypeY = type.sourceSegmentTypeY;
-        SegmentType targetSegmentTypeX = type.targetSegmentTypeX;
-        SegmentType targetSegmentTypeY = type.targetSegmentTypeY;
-
-        ConstraintType opposite1 = null, opposite2 = null;
-        switch (type) {
-            case LAYOUT_BELOW:
-            case LAYOUT_ABOVE:
-                opposite1 = LAYOUT_LEFT_OF;
-                opposite2 = LAYOUT_RIGHT_OF;
-                break;
-            case LAYOUT_LEFT_OF:
-            case LAYOUT_RIGHT_OF:
-                opposite1 = LAYOUT_ABOVE;
-                opposite2 = LAYOUT_BELOW;
-                break;
-            default:
-                return false;
-        }
-        Constraint pair = null;
-        for (Constraint constraint : allConstraints) {
-            if ((constraint.type == opposite1 || constraint.type == opposite2) &&
-                    constraint.to.node == targetNode && constraint.from.node == sourceNode) {
-                pair = constraint;
-                break;
-            }
-        }
-
-        // TODO -- ensure that the nodes are adjacent! In other words, that
-        // their bounds are within N pixels.
-
-        if (pair != null) {
-            // Visualize the corner constraint
-            if (sourceSegmentTypeX == UNKNOWN) {
-                sourceSegmentTypeX = pair.type.sourceSegmentTypeX;
-            }
-            if (sourceSegmentTypeY == UNKNOWN) {
-                sourceSegmentTypeY = pair.type.sourceSegmentTypeY;
-            }
-            if (targetSegmentTypeX == UNKNOWN) {
-                targetSegmentTypeX = pair.type.targetSegmentTypeX;
-            }
-            if (targetSegmentTypeY == UNKNOWN) {
-                targetSegmentTypeY = pair.type.targetSegmentTypeY;
-            }
-
-            int x1, y1, x2, y2;
-            if (sourceSegmentTypeX == LEFT) {
-                x1 = sourceBounds.x + 1 * sourceBounds.w / 4;
-            } else {
-                x1 = sourceBounds.x + 3 * sourceBounds.w / 4;
-            }
-            if (sourceSegmentTypeY == TOP) {
-                y1 = sourceBounds.y + 1 * sourceBounds.h / 4;
-            } else {
-                y1 = sourceBounds.y + 3 * sourceBounds.h / 4;
-            }
-            if (targetSegmentTypeX == LEFT) {
-                x2 = targetBounds.x + 1 * targetBounds.w / 4;
-            } else {
-                x2 = targetBounds.x + 3 * targetBounds.w / 4;
-            }
-            if (targetSegmentTypeY == TOP) {
-                y2 = targetBounds.y + 1 * targetBounds.h / 4;
-            } else {
-                y2 = targetBounds.y + 3 * targetBounds.h / 4;
-            }
-
-            graphics.useStyle(GUIDELINE);
-            graphics.drawArrow(x1, y1, x2, y2, ARROW_SIZE);
-
-            // Don't process this constraint on its own later.
-            allConstraints.remove(pair);
-
-            return true;
-        }
-
-        return false;
-    }
-
-    /**
-     * Paints a vertical constraint, handling the various scenarios where there are
-     * margins, or where the two nodes overlap horizontally and where they don't, etc.
-     * <p>
-     * Here's an example of what will be shown for a "below" constraint where the
-     * nodes do not overlap horizontally and the target node has a bottom margin:
-     * <pre>
-     *  +--------+
-     *  | Target |
-     *  +--------+
-     *       |
-     *       v
-     *   - - - - - - - - - - - - - -
-     *                         ^
-     *                         |
-     *                    +--------+
-     *                    | Source |
-     *                    +--------+
-     * </pre>
-     */
-    private static void paintVerticalConstraint(IGraphics graphics, ConstraintType type,
-            INode sourceNode, Rect sourceBounds, INode targetNode, Rect targetBounds,
-            boolean highlightTargetEdge) {
-        SegmentType sourceSegmentTypeY = type.sourceSegmentTypeY;
-        SegmentType targetSegmentTypeY = type.targetSegmentTypeY;
-        Margins targetMargins = targetNode.getMargins();
-
-        assert sourceSegmentTypeY != UNKNOWN;
-        assert targetBounds != null;
-
-        int sourceY = sourceSegmentTypeY.getY(sourceNode, sourceBounds);
-        int targetY = targetSegmentTypeY ==
-            UNKNOWN ? sourceY : targetSegmentTypeY.getY(targetNode, targetBounds);
-
-        if (highlightTargetEdge && type.isRelativeToParentEdge()) {
-            graphics.useStyle(DrawingStyle.DROP_ZONE_ACTIVE);
-            graphics.fillRect(targetBounds.x, targetY - PARENT_RECT_SIZE / 2,
-                    targetBounds.x2(), targetY + PARENT_RECT_SIZE / 2);
-        }
-
-        // First see if the two views overlap horizontally. If so, we can just draw a direct
-        // arrow from the source up to (or down to) the target.
-        //
-        //  +--------+
-        //  | Target |
-        //  +--------+
-        //         ^
-        //         |
-        //         |
-        //       +--------+
-        //       | Source |
-        //       +--------+
-        //
-        int maxLeft = Math.max(sourceBounds.x, targetBounds.x);
-        int minRight = Math.min(sourceBounds.x2(), targetBounds.x2());
-
-        int center = (maxLeft + minRight) / 2;
-        if (center > sourceBounds.x && center < sourceBounds.x2()) {
-            // Yes, the lines overlap -- just draw a straight arrow
-            //
-            //
-            // If however there is a margin on the target edge, it should be drawn like this:
-            //
-            //  +--------+
-            //  | Target |
-            //  +--------+
-            //         |
-            //         |
-            //         v
-            //   - - - - - - -
-            //         ^
-            //         |
-            //         |
-            //       +--------+
-            //       | Source |
-            //       +--------+
-            //
-            // Use a minimum threshold for this visualization since it doesn't look good
-            // for small margins
-            if (targetSegmentTypeY == BOTTOM && targetMargins.bottom > 5) {
-                int sharedY = targetY + targetMargins.bottom;
-                if (sourceY > sharedY + 2) { // Skip when source falls on the margin line
-                    graphics.useStyle(GUIDELINE_DASHED);
-                    graphics.drawLine(targetBounds.x, sharedY, targetBounds.x2(), sharedY);
-                    graphics.useStyle(GUIDELINE);
-                    graphics.drawArrow(center, sourceY, center, sharedY + 2, ARROW_SIZE);
-                    graphics.drawArrow(center, targetY, center, sharedY - 3, ARROW_SIZE);
-                } else {
-                    graphics.useStyle(GUIDELINE);
-                    // Draw reverse arrow to make it clear the node is as close
-                    // at it can be
-                    graphics.drawArrow(center, targetY, center, sourceY, ARROW_SIZE);
-                }
-                return;
-            } else if (targetSegmentTypeY == TOP && targetMargins.top > 5) {
-                int sharedY = targetY - targetMargins.top;
-                if (sourceY < sharedY - 2) {
-                    graphics.useStyle(GUIDELINE_DASHED);
-                    graphics.drawLine(targetBounds.x, sharedY, targetBounds.x2(), sharedY);
-                    graphics.useStyle(GUIDELINE);
-                    graphics.drawArrow(center, sourceY, center, sharedY - 3, ARROW_SIZE);
-                    graphics.drawArrow(center, targetY, center, sharedY + 3, ARROW_SIZE);
-                } else {
-                    graphics.useStyle(GUIDELINE);
-                    graphics.drawArrow(center, targetY, center, sourceY, ARROW_SIZE);
-                }
-                return;
-            }
-
-            // TODO: If the center falls smack in the center of the sourceBounds,
-            // AND the source node is part of the selection, then adjust the
-            // center location such that it is off to the side, let's say 1/4 or 3/4 of
-            // the overlap region, to ensure that it does not overlap the center selection
-            // handle
-
-            // When the constraint is for two immediately adjacent edges, we
-            // need to make some adjustments to make sure the arrow points in the right
-            // direction
-            if (sourceY == targetY) {
-                if (sourceSegmentTypeY == BOTTOM || sourceSegmentTypeY == BASELINE) {
-                    sourceY -= 2 * ARROW_SIZE;
-                } else if (sourceSegmentTypeY == TOP) {
-                    sourceY += 2 * ARROW_SIZE;
-                } else {
-                    assert sourceSegmentTypeY == CENTER_HORIZONTAL : sourceSegmentTypeY;
-                    sourceY += sourceBounds.h / 2 - 2 * ARROW_SIZE;
-                }
-            } else if (sourceSegmentTypeY == BASELINE) {
-                sourceY = targetY - 2 * ARROW_SIZE;
-            }
-
-            // Center the vertical line in the overlap region
-            graphics.useStyle(GUIDELINE);
-            graphics.drawArrow(center, sourceY, center, targetY, ARROW_SIZE);
-
-            return;
-        }
-
-        // If there is no horizontal overlap in the vertical constraints, then we
-        // will show the attachment relative to a dashed line that extends beyond
-        // the target bounds, like this:
-        //
-        //  +--------+
-        //  | Target |
-        //  +--------+ - - - - - - - - -
-        //                         ^
-        //                         |
-        //                    +--------+
-        //                    | Source |
-        //                    +--------+
-        //
-        // However, if the target node has a vertical margin, we may need to offset
-        // the line:
-        //
-        //  +--------+
-        //  | Target |
-        //  +--------+
-        //       |
-        //       v
-        //   - - - - - - - - - - - - - -
-        //                         ^
-        //                         |
-        //                    +--------+
-        //                    | Source |
-        //                    +--------+
-        //
-        // If not, we'll need to indicate a shared edge. This is the edge that separate
-        // them (but this will require me to evaluate margins!)
-
-        // Compute overlap region and pick the middle
-        int sharedY = targetSegmentTypeY ==
-            UNKNOWN ? sourceY : targetSegmentTypeY.getY(targetNode, targetBounds);
-        if (type.relativeToMargin) {
-            if (targetSegmentTypeY == TOP) {
-                sharedY -= targetMargins.top;
-            } else if (targetSegmentTypeY == BOTTOM) {
-                sharedY += targetMargins.bottom;
-            }
-        }
-
-        int startX;
-        int endX;
-        if (center <= sourceBounds.x) {
-            startX = targetBounds.x + targetBounds.w / 4;
-            endX = sourceBounds.x2();
-        } else {
-            assert (center >= sourceBounds.x2());
-            startX = sourceBounds.x;
-            endX = targetBounds.x + 3 * targetBounds.w / 4;
-        }
-        // Must draw segmented line instead
-        // Place the arrow 1/4 instead of 1/2 in the source to avoid overlapping with the
-        // selection handles
-        graphics.useStyle(GUIDELINE_DASHED);
-        graphics.drawLine(startX, sharedY, endX, sharedY);
-
-        // Adjust position of source arrow such that it does not sit across edge; it
-        // should point directly at the edge
-        if (Math.abs(sharedY - sourceY) < 2 * ARROW_SIZE) {
-            if (sourceSegmentTypeY == BASELINE) {
-                sourceY = sharedY - 2 * ARROW_SIZE;
-            } else if (sourceSegmentTypeY == TOP) {
-                sharedY = sourceY;
-                sourceY = sharedY + 2 * ARROW_SIZE;
-            } else {
-                sharedY = sourceY;
-                sourceY = sharedY - 2 * ARROW_SIZE;
-            }
-        }
-
-        graphics.useStyle(GUIDELINE);
-
-        // Draw the line from the source anchor to the shared edge
-        int x = sourceBounds.x + ((sourceSegmentTypeY == BASELINE) ?
-                sourceBounds.w / 2 :  sourceBounds.w / 4);
-        graphics.drawArrow(x, sourceY, x, sharedY, ARROW_SIZE);
-
-        // Draw the line from the target to the horizontal shared edge
-        int tx = targetBounds.centerX();
-        if (targetSegmentTypeY == TOP) {
-            int ty = targetBounds.y;
-            int margin = targetMargins.top;
-            if (margin == 0 || !type.relativeToMargin) {
-                graphics.drawArrow(tx, ty + 2 * ARROW_SIZE, tx, ty, ARROW_SIZE);
-            } else {
-                graphics.drawArrow(tx, ty, tx, ty - margin, ARROW_SIZE);
-            }
-        } else if (targetSegmentTypeY == BOTTOM) {
-            int ty = targetBounds.y2();
-            int margin = targetMargins.bottom;
-            if (margin == 0 || !type.relativeToMargin) {
-                graphics.drawArrow(tx, ty - 2 * ARROW_SIZE, tx, ty, ARROW_SIZE);
-            } else {
-                graphics.drawArrow(tx, ty, tx, ty + margin, ARROW_SIZE);
-            }
-        } else {
-            assert targetSegmentTypeY == BASELINE : targetSegmentTypeY;
-            int ty = targetSegmentTypeY.getY(targetNode, targetBounds);
-            graphics.drawArrow(tx, ty - 2 * ARROW_SIZE, tx, ty, ARROW_SIZE);
-        }
-
-        return;
-    }
-
-    /**
-     * Paints a horizontal constraint, handling the various scenarios where there are margins,
-     * or where the two nodes overlap horizontally and where they don't, etc.
-     */
-    private static void paintHorizontalConstraint(IGraphics graphics, ConstraintType type,
-            INode sourceNode, Rect sourceBounds, INode targetNode, Rect targetBounds,
-            boolean highlightTargetEdge) {
-        SegmentType sourceSegmentTypeX = type.sourceSegmentTypeX;
-        SegmentType targetSegmentTypeX = type.targetSegmentTypeX;
-        Margins targetMargins = targetNode.getMargins();
-
-        assert sourceSegmentTypeX != UNKNOWN;
-        assert targetBounds != null;
-
-        // See paintVerticalConstraint for explanations of the various cases.
-
-        int sourceX = sourceSegmentTypeX.getX(sourceNode, sourceBounds);
-        int targetX = targetSegmentTypeX == UNKNOWN ?
-                sourceX : targetSegmentTypeX.getX(targetNode, targetBounds);
-
-        if (highlightTargetEdge && type.isRelativeToParentEdge()) {
-            graphics.useStyle(DrawingStyle.DROP_ZONE_ACTIVE);
-            graphics.fillRect(targetX - PARENT_RECT_SIZE / 2, targetBounds.y,
-                    targetX + PARENT_RECT_SIZE / 2, targetBounds.y2());
-        }
-
-        int maxTop = Math.max(sourceBounds.y, targetBounds.y);
-        int minBottom = Math.min(sourceBounds.y2(), targetBounds.y2());
-
-        // First see if the two views overlap vertically. If so, we can just draw a direct
-        // arrow from the source over to the target.
-        int center = (maxTop + minBottom) / 2;
-        if (center > sourceBounds.y && center < sourceBounds.y2()) {
-            // See if we should draw a margin line
-            if (targetSegmentTypeX == RIGHT && targetMargins.right > 5) {
-                int sharedX = targetX + targetMargins.right;
-                if (sourceX > sharedX + 2) { // Skip when source falls on the margin line
-                    graphics.useStyle(GUIDELINE_DASHED);
-                    graphics.drawLine(sharedX, targetBounds.y, sharedX, targetBounds.y2());
-                    graphics.useStyle(GUIDELINE);
-                    graphics.drawArrow(sourceX, center, sharedX + 2, center, ARROW_SIZE);
-                    graphics.drawArrow(targetX, center, sharedX - 3, center, ARROW_SIZE);
-                } else {
-                    graphics.useStyle(GUIDELINE);
-                    // Draw reverse arrow to make it clear the node is as close
-                    // at it can be
-                    graphics.drawArrow(targetX, center, sourceX, center, ARROW_SIZE);
-                }
-                return;
-            } else if (targetSegmentTypeX == LEFT && targetMargins.left > 5) {
-                int sharedX = targetX - targetMargins.left;
-                if (sourceX < sharedX - 2) {
-                    graphics.useStyle(GUIDELINE_DASHED);
-                    graphics.drawLine(sharedX, targetBounds.y, sharedX, targetBounds.y2());
-                    graphics.useStyle(GUIDELINE);
-                    graphics.drawArrow(sourceX, center, sharedX - 3, center, ARROW_SIZE);
-                    graphics.drawArrow(targetX, center, sharedX + 3, center, ARROW_SIZE);
-                } else {
-                    graphics.useStyle(GUIDELINE);
-                    graphics.drawArrow(targetX, center, sourceX, center, ARROW_SIZE);
-                }
-                return;
-            }
-
-            if (sourceX == targetX) {
-                if (sourceSegmentTypeX == RIGHT) {
-                    sourceX -= 2 * ARROW_SIZE;
-                } else if (sourceSegmentTypeX == LEFT ) {
-                    sourceX += 2 * ARROW_SIZE;
-                } else {
-                    assert sourceSegmentTypeX == CENTER_VERTICAL : sourceSegmentTypeX;
-                    sourceX += sourceBounds.w / 2 - 2 * ARROW_SIZE;
-                }
-            }
-
-            graphics.useStyle(GUIDELINE);
-            graphics.drawArrow(sourceX, center, targetX, center, ARROW_SIZE);
-            return;
-        }
-
-        // Segment line
-
-        // Compute overlap region and pick the middle
-        int sharedX = targetSegmentTypeX == UNKNOWN ?
-                sourceX : targetSegmentTypeX.getX(targetNode, targetBounds);
-        if (type.relativeToMargin) {
-            if (targetSegmentTypeX == LEFT) {
-                sharedX -= targetMargins.left;
-            } else if (targetSegmentTypeX == RIGHT) {
-                sharedX += targetMargins.right;
-            }
-        }
-
-        int startY, endY;
-        if (center <= sourceBounds.y) {
-            startY = targetBounds.y + targetBounds.h / 4;
-            endY = sourceBounds.y2();
-        } else {
-            assert (center >= sourceBounds.y2());
-            startY = sourceBounds.y;
-            endY = targetBounds.y + 3 * targetBounds.h / 2;
-        }
-
-        // Must draw segmented line instead
-        // Place at 1/4 instead of 1/2 to avoid overlapping with selection handles
-        int y = sourceBounds.y + sourceBounds.h / 4;
-        graphics.useStyle(GUIDELINE_DASHED);
-        graphics.drawLine(sharedX, startY, sharedX, endY);
-
-        // Adjust position of source arrow such that it does not sit across edge; it
-        // should point directly at the edge
-        if (Math.abs(sharedX - sourceX) < 2 * ARROW_SIZE) {
-            if (sourceSegmentTypeX == LEFT) {
-                sharedX = sourceX;
-                sourceX = sharedX + 2 * ARROW_SIZE;
-            } else {
-                sharedX = sourceX;
-                sourceX = sharedX - 2 * ARROW_SIZE;
-            }
-        }
-
-        graphics.useStyle(GUIDELINE);
-
-        // Draw the line from the source anchor to the shared edge
-        graphics.drawArrow(sourceX, y, sharedX, y, ARROW_SIZE);
-
-        // Draw the line from the target to the horizontal shared edge
-        int ty = targetBounds.centerY();
-        if (targetSegmentTypeX == LEFT) {
-            int tx = targetBounds.x;
-            int margin = targetMargins.left;
-            if (margin == 0 || !type.relativeToMargin) {
-                graphics.drawArrow(tx + 2 * ARROW_SIZE, ty, tx, ty, ARROW_SIZE);
-            } else {
-                graphics.drawArrow(tx, ty, tx - margin, ty, ARROW_SIZE);
-            }
-        } else {
-            assert targetSegmentTypeX == RIGHT;
-            int tx = targetBounds.x2();
-            int margin = targetMargins.right;
-            if (margin == 0 || !type.relativeToMargin) {
-                graphics.drawArrow(tx - 2 * ARROW_SIZE, ty, tx, ty, ARROW_SIZE);
-            } else {
-                graphics.drawArrow(tx, ty, tx + margin, ty, ARROW_SIZE);
-            }
-        }
-
-        return;
-    }
-
-    /**
-     * Paints a vertical center constraint. The constraint is shown as a dashed line
-     * through the vertical view, and a solid line over the node bounds.
-     */
-    private static void paintVerticalCenterConstraint(IGraphics graphics, Rect sourceBounds,
-            Rect targetBounds) {
-        graphics.useStyle(GUIDELINE_DASHED);
-        graphics.drawLine(targetBounds.x, targetBounds.centerY(),
-                targetBounds.x2(), targetBounds.centerY());
-        graphics.useStyle(GUIDELINE);
-        graphics.drawLine(sourceBounds.x, sourceBounds.centerY(),
-                sourceBounds.x2(), sourceBounds.centerY());
-    }
-
-    /**
-     * Paints a horizontal center constraint. The constraint is shown as a dashed line
-     * through the horizontal view, and a solid line over the node bounds.
-     */
-    private static void paintHorizontalCenterConstraint(IGraphics graphics, Rect sourceBounds,
-            Rect targetBounds) {
-        graphics.useStyle(GUIDELINE_DASHED);
-        graphics.drawLine(targetBounds.centerX(), targetBounds.y,
-                targetBounds.centerX(), targetBounds.y2());
-        graphics.useStyle(GUIDELINE);
-        graphics.drawLine(sourceBounds.centerX(), sourceBounds.y,
-                sourceBounds.centerX(), sourceBounds.y2());
-    }
-}
\ No newline at end of file
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/relative/ConstraintType.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/relative/ConstraintType.java
deleted file mode 100644
index ed4ac1b..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/relative/ConstraintType.java
+++ /dev/null
@@ -1,241 +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.layout.relative;
-
-import static com.android.ide.common.api.SegmentType.BASELINE;
-import static com.android.ide.common.api.SegmentType.BOTTOM;
-import static com.android.ide.common.api.SegmentType.CENTER_HORIZONTAL;
-import static com.android.ide.common.api.SegmentType.CENTER_VERTICAL;
-import static com.android.ide.common.api.SegmentType.LEFT;
-import static com.android.ide.common.api.SegmentType.RIGHT;
-import static com.android.ide.common.api.SegmentType.TOP;
-import static com.android.ide.common.api.SegmentType.UNKNOWN;
-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_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_TO_LEFT_OF;
-import static com.android.SdkConstants.ATTR_LAYOUT_TO_RIGHT_OF;
-
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-import com.android.ide.common.api.SegmentType;
-
-import java.util.HashMap;
-import java.util.Map;
-
-/**
- * Each constraint type corresponds to a type of constraint available for the
- * RelativeLayout; for example, {@link #LAYOUT_ABOVE} corresponds to the layout_above constraint.
- */
-enum ConstraintType {
-    LAYOUT_ABOVE(ATTR_LAYOUT_ABOVE,
-            null /* sourceX */, BOTTOM, null /* targetX */, TOP,
-            false /* targetParent */, true /* horizontalEdge */, false /* verticalEdge */,
-            true /* relativeToMargin */),
-
-    LAYOUT_BELOW(ATTR_LAYOUT_BELOW, null, TOP, null, BOTTOM, false, true, false, true),
-    ALIGN_TOP(ATTR_LAYOUT_ALIGN_TOP, null, TOP, null, TOP, false, true, false, false),
-    ALIGN_BOTTOM(ATTR_LAYOUT_ALIGN_BOTTOM, null, BOTTOM, null, BOTTOM, false, true, false, false),
-    ALIGN_LEFT(ATTR_LAYOUT_ALIGN_LEFT, LEFT, null, LEFT, null, false, false, true, false),
-    ALIGN_RIGHT(ATTR_LAYOUT_ALIGN_RIGHT, RIGHT, null, RIGHT, null, false, false, true, false),
-    LAYOUT_LEFT_OF(ATTR_LAYOUT_TO_LEFT_OF, RIGHT, null, LEFT, null, false, false, true, true),
-    LAYOUT_RIGHT_OF(ATTR_LAYOUT_TO_RIGHT_OF, LEFT, null, RIGHT, null, false, false, true, true),
-    ALIGN_PARENT_TOP(ATTR_LAYOUT_ALIGN_PARENT_TOP, null, TOP, null, TOP, true, true, false, false),
-    ALIGN_BASELINE(ATTR_LAYOUT_ALIGN_BASELINE, null, BASELINE, null, BASELINE, false, true, false,
-            false),
-    ALIGN_PARENT_LEFT(ATTR_LAYOUT_ALIGN_PARENT_LEFT, LEFT, null, LEFT, null, true, false, true,
-            false),
-    ALIGN_PARENT_RIGHT(ATTR_LAYOUT_ALIGN_PARENT_RIGHT, RIGHT, null, RIGHT, null, true, false, true,
-            false),
-    ALIGN_PARENT_BOTTOM(ATTR_LAYOUT_ALIGN_PARENT_BOTTOM, null, BOTTOM, null, BOTTOM, true, true,
-            false, false),
-    LAYOUT_CENTER_HORIZONTAL(ATTR_LAYOUT_CENTER_HORIZONTAL, CENTER_VERTICAL, null, CENTER_VERTICAL,
-            null, true, true, false, false),
-    LAYOUT_CENTER_VERTICAL(ATTR_LAYOUT_CENTER_VERTICAL, null, CENTER_HORIZONTAL, null,
-            CENTER_HORIZONTAL, true, false, true, false),
-    LAYOUT_CENTER_IN_PARENT(ATTR_LAYOUT_CENTER_IN_PARENT, CENTER_VERTICAL, CENTER_HORIZONTAL,
-            CENTER_VERTICAL, CENTER_HORIZONTAL, true, true, true, false);
-
-    private ConstraintType(String name, SegmentType sourceSegmentTypeX,
-            SegmentType sourceSegmentTypeY, SegmentType targetSegmentTypeX,
-            SegmentType targetSegmentTypeY, boolean targetParent, boolean horizontalEdge,
-            boolean verticalEdge, boolean relativeToMargin) {
-        assert horizontalEdge || verticalEdge;
-
-        this.name = name;
-        this.sourceSegmentTypeX = sourceSegmentTypeX != null ? sourceSegmentTypeX : UNKNOWN;
-        this.sourceSegmentTypeY = sourceSegmentTypeY != null ? sourceSegmentTypeY : UNKNOWN;
-        this.targetSegmentTypeX = targetSegmentTypeX != null ? targetSegmentTypeX : UNKNOWN;
-        this.targetSegmentTypeY = targetSegmentTypeY != null ? targetSegmentTypeY : UNKNOWN;
-        this.targetParent = targetParent;
-        this.horizontalEdge = horizontalEdge;
-        this.verticalEdge = verticalEdge;
-        this.relativeToMargin = relativeToMargin;
-    }
-
-    /** The attribute name of the constraint */
-    public final String name;
-
-    /** The horizontal position of the source of the constraint */
-    public final SegmentType sourceSegmentTypeX;
-
-    /** The vertical position of the source of the constraint */
-    public final SegmentType sourceSegmentTypeY;
-
-    /** The horizontal position of the target of the constraint */
-    public final SegmentType targetSegmentTypeX;
-
-    /** The vertical position of the target of the constraint */
-    public final SegmentType targetSegmentTypeY;
-
-    /**
-     * If true, the constraint targets the parent layout, otherwise it targets another
-     * view
-     */
-    public final boolean targetParent;
-
-    /** If true, this constraint affects the horizontal dimension */
-    public final boolean horizontalEdge;
-
-    /** If true, this constraint affects the vertical dimension */
-    public final boolean verticalEdge;
-
-    /**
-     * Whether this constraint is relative to the margin bounds of the node rather than
-     * the node's actual bounds
-     */
-    public final boolean relativeToMargin;
-
-    /** Map from attribute name to constraint type */
-    private static Map<String, ConstraintType> sNameToType;
-
-    /**
-     * Returns the {@link ConstraintType} corresponding to the given attribute name, or
-     * null if not found.
-     *
-     * @param attribute the name of the attribute to look up
-     * @return the corresponding {@link ConstraintType}
-     */
-    @Nullable
-    public static ConstraintType fromAttribute(@NonNull String attribute) {
-        if (sNameToType == null) {
-            ConstraintType[] types = ConstraintType.values();
-            Map<String, ConstraintType> map = new HashMap<String, ConstraintType>(types.length);
-            for (ConstraintType type : types) {
-                map.put(type.name, type);
-            }
-            sNameToType = map;
-        }
-        return sNameToType.get(attribute);
-    }
-
-    /**
-     * Returns true if this constraint type represents a constraint where the target edge
-     * is one of the parent edges (actual edge, not center/baseline segments)
-     *
-     * @return true if the target segment is a parent edge
-     */
-    public boolean isRelativeToParentEdge() {
-        return this == ALIGN_PARENT_LEFT || this == ALIGN_PARENT_RIGHT || this == ALIGN_PARENT_TOP
-                || this == ALIGN_PARENT_BOTTOM;
-    }
-
-    /**
-     * Returns a {@link ConstraintType} for a potential match of edges.
-     *
-     * @param withParent if true, the target is the parent
-     * @param from the source edge
-     * @param to the target edge
-     * @return a {@link ConstraintType}, or null
-     */
-    @Nullable
-    public static ConstraintType forMatch(boolean withParent, SegmentType from, SegmentType to) {
-        // Attached to parent edge?
-        if (withParent) {
-            switch (from) {
-                case TOP:
-                    return ALIGN_PARENT_TOP;
-                case BOTTOM:
-                    return ALIGN_PARENT_BOTTOM;
-                case LEFT:
-                    return ALIGN_PARENT_LEFT;
-                case RIGHT:
-                    return ALIGN_PARENT_RIGHT;
-                case CENTER_HORIZONTAL:
-                    return LAYOUT_CENTER_VERTICAL;
-                case CENTER_VERTICAL:
-                    return LAYOUT_CENTER_HORIZONTAL;
-            }
-
-            return null;
-        }
-
-        // Attached to some other node.
-        switch (from) {
-            case TOP:
-                switch (to) {
-                    case TOP:
-                        return ALIGN_TOP;
-                    case BOTTOM:
-                        return LAYOUT_BELOW;
-                    case BASELINE:
-                        return ALIGN_BASELINE;
-                }
-                break;
-            case BOTTOM:
-                switch (to) {
-                    case TOP:
-                        return LAYOUT_ABOVE;
-                    case BOTTOM:
-                        return ALIGN_BOTTOM;
-                    case BASELINE:
-                        return ALIGN_BASELINE;
-                }
-                break;
-            case LEFT:
-                switch (to) {
-                    case LEFT:
-                        return ALIGN_LEFT;
-                    case RIGHT:
-                        return LAYOUT_RIGHT_OF;
-                }
-                break;
-            case RIGHT:
-                switch (to) {
-                    case LEFT:
-                        return LAYOUT_LEFT_OF;
-                    case RIGHT:
-                        return ALIGN_RIGHT;
-                }
-                break;
-            case BASELINE:
-                return ALIGN_BASELINE;
-        }
-
-        return null;
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/relative/DeletionHandler.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/relative/DeletionHandler.java
deleted file mode 100644
index 3eac510..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/relative/DeletionHandler.java
+++ /dev/null
@@ -1,267 +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.ide.common.layout.relative;
-
-import static com.android.SdkConstants.ANDROID_URI;
-import static com.android.SdkConstants.ATTR_ID;
-import static com.android.SdkConstants.ATTR_LAYOUT_MARGIN;
-import static com.android.SdkConstants.ATTR_LAYOUT_RESOURCE_PREFIX;
-import static com.android.SdkConstants.ID_PREFIX;
-import static com.android.SdkConstants.NEW_ID_PREFIX;
-import static com.android.ide.common.layout.BaseViewRule.stripIdPrefix;
-import static com.android.ide.common.layout.relative.ConstraintType.LAYOUT_CENTER_HORIZONTAL;
-import static com.android.ide.common.layout.relative.ConstraintType.LAYOUT_CENTER_VERTICAL;
-
-import com.android.SdkConstants;
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-import com.android.ide.common.api.INode;
-import com.android.ide.common.api.INode.IAttribute;
-import com.google.common.collect.Maps;
-import com.google.common.collect.Sets;
-
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-/**
- * Handles deletions in a relative layout, transferring constraints across
- * deleted nodes
- * <p>
- * TODO: Consider adding the
- * {@link SdkConstants#ATTR_LAYOUT_ALIGN_WITH_PARENT_MISSING} attribute to a
- * node if it's pointing to a node which is deleted and which has no transitive
- * reference to another node.
- */
-public class DeletionHandler {
-    private final INode mLayout;
-    private final INode[] mChildren;
-    private final List<INode> mDeleted;
-    private final Set<String> mDeletedIds;
-    private final Map<String, INode> mNodeMap;
-    private final List<INode> mMoved;
-
-    /**
-     * Creates a new {@link DeletionHandler}
-     *
-     * @param deleted the deleted nodes
-     * @param moved nodes that were moved (e.g. deleted, but also inserted elsewhere)
-     * @param layout the parent layout of the deleted nodes
-     */
-    public DeletionHandler(@NonNull List<INode> deleted, @NonNull List<INode> moved,
-            @NonNull INode layout) {
-        mDeleted = deleted;
-        mMoved = moved;
-        mLayout = layout;
-
-        mChildren = mLayout.getChildren();
-        mNodeMap = Maps.newHashMapWithExpectedSize(mChildren.length);
-        for (INode child : mChildren) {
-            String id = child.getStringAttr(ANDROID_URI, ATTR_ID);
-            if (id != null) {
-                mNodeMap.put(stripIdPrefix(id), child);
-            }
-        }
-
-        mDeletedIds = Sets.newHashSetWithExpectedSize(mDeleted.size());
-        for (INode node : mDeleted) {
-            String id = node.getStringAttr(ANDROID_URI, ATTR_ID);
-            if (id != null) {
-                mDeletedIds.add(stripIdPrefix(id));
-            }
-        }
-
-        // Any widgets that remain (e.g. typically because they were moved) should
-        // keep their incoming dependencies
-        for (INode node : mMoved) {
-            String id = node.getStringAttr(ANDROID_URI, ATTR_ID);
-            if (id != null) {
-                mDeletedIds.remove(stripIdPrefix(id));
-            }
-        }
-    }
-
-    @Nullable
-    private static String getId(@NonNull IAttribute attribute) {
-        if (attribute.getName().startsWith(ATTR_LAYOUT_RESOURCE_PREFIX)
-                && ANDROID_URI.equals(attribute.getUri())
-                && !attribute.getName().startsWith(ATTR_LAYOUT_MARGIN)) {
-            String id = attribute.getValue();
-            // It might not be an id reference, so check manually rather than just
-            // calling stripIdPrefix():
-            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 null;
-    }
-
-    /**
-     * Updates the constraints in the layout to handle deletion of a set of
-     * nodes. This ensures that any constraints pointing to one of the deleted
-     * nodes are changed properly to point to a non-deleted node with similar
-     * constraints.
-     */
-    public void updateConstraints() {
-        if (mChildren.length == mDeleted.size()) {
-            // Deleting everything: Nothing to be done
-            return;
-        }
-
-        // Now remove incoming edges to any views that were deleted. If possible,
-        // don't just delete them but replace them with a transitive constraint, e.g.
-        // if we have "A <= B <= C" and "B" is removed, then we end up with "A <= C",
-
-        for (INode child : mChildren) {
-            if (mDeleted.contains(child)) {
-                continue;
-            }
-
-            for (IAttribute attribute : child.getLiveAttributes()) {
-                String id = getId(attribute);
-                if (id != null) {
-                    if (mDeletedIds.contains(id)) {
-                        // Unset this reference to a deleted widget. It might be
-                        // replaced if the pointed to node points to some other node
-                        // on the same side, but it may use a different constraint name,
-                        // or have none at all (e.g. parent).
-                        String name = attribute.getName();
-                        child.setAttribute(ANDROID_URI, name, null);
-
-                        INode deleted = mNodeMap.get(id);
-                        if (deleted != null) {
-                            ConstraintType type = ConstraintType.fromAttribute(name);
-                            if (type != null) {
-                                transfer(deleted, child, type, 0);
-                            }
-                        }
-                    }
-                }
-            }
-        }
-    }
-
-    private void transfer(INode deleted, INode target, ConstraintType targetType, int depth) {
-        if (depth == 20) {
-            // Prevent really deep flow or unbounded recursion in case there is a bug in
-            // the cycle detection code
-            return;
-        }
-
-        assert mDeleted.contains(deleted);
-
-        for (IAttribute attribute : deleted.getLiveAttributes()) {
-            String name = attribute.getName();
-            ConstraintType type = ConstraintType.fromAttribute(name);
-            if (type == null) {
-                continue;
-            }
-
-            ConstraintType transfer = getCompatibleConstraint(type, targetType);
-            if (transfer != null) {
-                String id = getId(attribute);
-                if (id != null) {
-                    if (mDeletedIds.contains(id)) {
-                        INode nextDeleted = mNodeMap.get(id);
-                        if (nextDeleted != null) {
-                            // Points to another deleted node: recurse
-                            transfer(nextDeleted, target, targetType, depth + 1);
-                        }
-                    } else {
-                        // Found an undeleted node destination: point to it directly.
-                        // Note that we're using the
-                        target.setAttribute(ANDROID_URI, transfer.name, attribute.getValue());
-                    }
-                } else {
-                    // Pointing to parent or center etc (non-id ref): replicate this on the target
-                    target.setAttribute(ANDROID_URI, name, attribute.getValue());
-                }
-            }
-        }
-    }
-
-    /**
-     * Determines if two constraints are in the same direction and if so returns
-     * the constraint in the same direction. Rather than returning boolean true
-     * or false, this returns the constraint which is sometimes modified. For
-     * example, if you have a node which points left to a node which is centered
-     * in parent, then the constraint is turned into center horizontal.
-     */
-    @Nullable
-    private static ConstraintType getCompatibleConstraint(
-            @NonNull ConstraintType first, @NonNull ConstraintType second) {
-        if (first == second) {
-            return first;
-        }
-
-        switch (second) {
-            case ALIGN_LEFT:
-            case LAYOUT_RIGHT_OF:
-                switch (first) {
-                    case LAYOUT_CENTER_HORIZONTAL:
-                    case LAYOUT_LEFT_OF:
-                    case ALIGN_LEFT:
-                        return first;
-                    case LAYOUT_CENTER_IN_PARENT:
-                        return LAYOUT_CENTER_HORIZONTAL;
-                }
-                return null;
-
-            case ALIGN_RIGHT:
-            case LAYOUT_LEFT_OF:
-                switch (first) {
-                    case LAYOUT_CENTER_HORIZONTAL:
-                    case ALIGN_RIGHT:
-                    case LAYOUT_LEFT_OF:
-                        return first;
-                    case LAYOUT_CENTER_IN_PARENT:
-                        return LAYOUT_CENTER_HORIZONTAL;
-                }
-                return null;
-
-            case ALIGN_TOP:
-            case LAYOUT_BELOW:
-            case ALIGN_BASELINE:
-                switch (first) {
-                    case LAYOUT_CENTER_VERTICAL:
-                    case ALIGN_TOP:
-                    case LAYOUT_BELOW:
-                    case ALIGN_BASELINE:
-                        return first;
-                    case LAYOUT_CENTER_IN_PARENT:
-                        return LAYOUT_CENTER_VERTICAL;
-                }
-                return null;
-            case ALIGN_BOTTOM:
-            case LAYOUT_ABOVE:
-                switch (first) {
-                    case LAYOUT_CENTER_VERTICAL:
-                    case ALIGN_BOTTOM:
-                    case LAYOUT_ABOVE:
-                    case ALIGN_BASELINE:
-                        return first;
-                    case LAYOUT_CENTER_IN_PARENT:
-                        return LAYOUT_CENTER_VERTICAL;
-                }
-                return null;
-        }
-
-        return null;
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/relative/DependencyGraph.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/relative/DependencyGraph.java
deleted file mode 100644
index 43d52d1..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/relative/DependencyGraph.java
+++ /dev/null
@@ -1,326 +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.layout.relative;
-
-import static com.android.SdkConstants.ATTR_ID;
-import static com.android.SdkConstants.ATTR_LAYOUT_RESOURCE_PREFIX;
-import static com.android.SdkConstants.VALUE_TRUE;
-
-
-import com.android.SdkConstants;
-import static com.android.SdkConstants.ANDROID_URI;
-import com.android.ide.common.api.IDragElement;
-import com.android.ide.common.api.IDragElement.IDragAttribute;
-import com.android.ide.common.api.INode;
-import com.android.ide.common.api.INode.IAttribute;
-import com.android.ide.common.layout.BaseLayoutRule;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-/**
- * Data structure about relative layout relationships which makes it possible to:
- * <ul>
- * <li> Quickly determine not just the dependencies on other nodes, but which nodes
- *    depend on this node such that they can be visualized for the selection
- * <li> Determine if there are cyclic dependencies, and whether a potential move
- *    would result in a cycle
- * <li> Determine the "depth" of a given node (in terms of how many connections it
- *     is away from a parent edge) such that we can prioritize connections which
- *     minimizes the depth
- * </ul>
- */
-class DependencyGraph {
-    /** Format to chain include cycles in: a=>b=>c=>d etc */
-    static final String CHAIN_FORMAT = "%1$s=>%2$s"; //$NON-NLS-1$
-
-    /** Format to chain constraint dependencies: button 1 above button2 etc */
-    private static final String DEPENDENCY_FORMAT = "%1$s %2$s %3$s"; //$NON-NLS-1$
-
-    private final Map<String, ViewData> mIdToView = new HashMap<String, ViewData>();
-    private final Map<INode, ViewData> mNodeToView = new HashMap<INode, ViewData>();
-
-    /** Constructs a new {@link DependencyGraph} for the given relative layout */
-    DependencyGraph(INode layout) {
-        INode[] nodes = layout.getChildren();
-
-        // Parent view:
-        String parentId = layout.getStringAttr(ANDROID_URI, ATTR_ID);
-        if (parentId != null) {
-            parentId = BaseLayoutRule.stripIdPrefix(parentId);
-        } else {
-            parentId = "RelativeLayout"; // For display purposes; we never reference
-            // the parent id from a constraint, only via parent-relative params
-            // like centerInParent
-        }
-        ViewData parentView = new ViewData(layout, parentId);
-        mNodeToView.put(layout, parentView);
-        if (parentId != null) {
-            mIdToView.put(parentId, parentView);
-        }
-
-        for (INode child : nodes) {
-            String id = child.getStringAttr(ANDROID_URI, ATTR_ID);
-            if (id != null) {
-                id = BaseLayoutRule.stripIdPrefix(id);
-            }
-            ViewData view = new ViewData(child, id);
-            mNodeToView.put(child, view);
-            if (id != null) {
-                mIdToView.put(id, view);
-            }
-        }
-
-        for (ViewData view : mNodeToView.values()) {
-            for (IAttribute attribute : view.node.getLiveAttributes()) {
-                String name = attribute.getName();
-                ConstraintType type = ConstraintType.fromAttribute(name);
-                if (type != null) {
-                    String value = attribute.getValue();
-
-                    if (type.targetParent) {
-                        if (value.equals(VALUE_TRUE)) {
-                            Constraint constraint = new Constraint(type, view, parentView);
-                            view.dependsOn.add(constraint);
-                            parentView.dependedOnBy.add(constraint);
-                        }
-                    } else {
-                        // id-based constraint.
-                        // NOTE: The id could refer to some widget that is NOT a sibling!
-                        String targetId = BaseLayoutRule.stripIdPrefix(value);
-                        ViewData target = mIdToView.get(targetId);
-                        if (target == view) {
-                            // Self-reference. RelativeLayout ignores these so it's
-                            // not an error like a deeper cycle (where RelativeLayout
-                            // will throw an exception), but we might as well warn
-                            // the user about it.
-                            // TODO: Where do we emit this error?
-                        } else if (target != null) {
-                            Constraint constraint = new Constraint(type, view, target);
-                            view.dependsOn.add(constraint);
-                            target.dependedOnBy.add(constraint);
-                        } else {
-                            // This is valid but we might want to warn...
-                            //System.out.println("Warning: no view data found for " + targetId);
-                        }
-                    }
-                }
-            }
-        }
-    }
-
-    public ViewData getView(IDragElement element) {
-        IDragAttribute attribute = element.getAttribute(ANDROID_URI, ATTR_ID);
-        if (attribute != null) {
-            String id = attribute.getValue();
-            id = BaseLayoutRule.stripIdPrefix(id);
-            return getView(id);
-        }
-
-        return null;
-    }
-
-    public ViewData getView(String id) {
-        return mIdToView.get(id);
-    }
-
-    public ViewData getView(INode node) {
-        return mNodeToView.get(node);
-    }
-
-    /**
-     * Returns the set of views that depend on the given node in either the horizontal or
-     * vertical direction
-     *
-     * @param nodes the set of nodes that we want to compute the transitive dependencies
-     *            for
-     * @param vertical if true, look for vertical edge dependencies, otherwise look for
-     *            horizontal edge dependencies
-     * @return the set of nodes that directly or indirectly depend on the given nodes in
-     *         the given direction
-     */
-    public Set<INode> dependsOn(Collection<? extends INode> nodes, boolean vertical) {
-        List<ViewData> reachable = new ArrayList<ViewData>();
-
-        // Traverse the graph of constraints and determine all nodes affected by
-        // this node
-        Set<ViewData> visiting = new HashSet<ViewData>();
-        for (INode node : nodes) {
-            ViewData view = mNodeToView.get(node);
-            if (view != null) {
-                findBackwards(view, visiting, reachable, vertical, view);
-            }
-        }
-
-        Set<INode> dependents = new HashSet<INode>(reachable.size());
-
-        for (ViewData v : reachable) {
-            dependents.add(v.node);
-        }
-
-        return dependents;
-    }
-
-    private void findBackwards(ViewData view,
-            Set<ViewData> visiting, List<ViewData> reachable,
-            boolean vertical, ViewData start) {
-        visiting.add(view);
-        reachable.add(view);
-
-        for (Constraint constraint : view.dependedOnBy) {
-            if (vertical && !constraint.type.verticalEdge) {
-                continue;
-            } else  if (!vertical && !constraint.type.horizontalEdge) {
-                continue;
-            }
-
-            assert constraint.to == view;
-            ViewData from = constraint.from;
-            if (visiting.contains(from)) {
-                // Cycle - what do we do to highlight this?
-                List<Constraint> path = getPathTo(start.node, view.node, vertical);
-                if (path != null) {
-                    // TODO: display to the user somehow. We need log access for the
-                    // view rules.
-                    System.out.println(Constraint.describePath(path, null, null));
-                }
-            } else {
-                findBackwards(from, visiting, reachable, vertical, start);
-            }
-        }
-
-        visiting.remove(view);
-    }
-
-    public List<Constraint> getPathTo(INode from, INode to, boolean vertical) {
-        // Traverse the graph of constraints and determine all nodes affected by
-        // this node
-        Set<ViewData> visiting = new HashSet<ViewData>();
-        List<Constraint> path = new ArrayList<Constraint>();
-        ViewData view = mNodeToView.get(from);
-        if (view != null) {
-            return findForwards(view, visiting, path, vertical, to);
-        }
-
-        return null;
-    }
-
-    private List<Constraint> findForwards(ViewData view, Set<ViewData> visiting,
-            List<Constraint> path, boolean vertical, INode target) {
-        visiting.add(view);
-
-        for (Constraint constraint : view.dependsOn) {
-            if (vertical && !constraint.type.verticalEdge) {
-                continue;
-            } else  if (!vertical && !constraint.type.horizontalEdge) {
-                continue;
-            }
-
-            try {
-                path.add(constraint);
-
-                if (constraint.to.node == target) {
-                    return new ArrayList<Constraint>(path);
-                }
-
-                assert constraint.from == view;
-                ViewData to = constraint.to;
-                if (visiting.contains(to)) {
-                    // CYCLE!
-                    continue;
-                }
-
-                List<Constraint> chain = findForwards(to, visiting, path, vertical, target);
-                if (chain != null) {
-                    return chain;
-                }
-            } finally {
-                path.remove(constraint);
-            }
-        }
-
-        visiting.remove(view);
-
-        return null;
-    }
-
-    /**
-     * Info about a specific widget child of a relative layout and its constraints. This
-     * is a node in the dependency graph.
-     */
-    static class ViewData {
-        public final INode node;
-        public final String id;
-        public final List<Constraint> dependsOn = new ArrayList<Constraint>(4);
-        public final List<Constraint> dependedOnBy = new ArrayList<Constraint>(8);
-
-        ViewData(INode node, String id) {
-            this.node = node;
-            this.id = id;
-        }
-    }
-
-    /**
-     * Info about a specific constraint between two widgets in a relative layout. This is
-     * an edge in the dependency graph.
-     */
-    static class Constraint {
-        public final ConstraintType type;
-        public final ViewData from;
-        public final ViewData to;
-
-        // TODO: Initialize depth -- should be computed independently for top, left, etc.
-        // We can use this in GuidelineHandler.MatchComparator to prefer matches that
-        // are closer to a parent edge:
-        //public int depth;
-
-        Constraint(ConstraintType type, ViewData from, ViewData to) {
-            this.type = type;
-            this.from = from;
-            this.to = to;
-        }
-
-        static String describePath(List<Constraint> path, String newName, String newId) {
-            String s = "";
-            for (int i = path.size() - 1; i >= 0; i--) {
-                Constraint constraint = path.get(i);
-                String suffix = (i == path.size() -1) ? constraint.to.id : s;
-                s = String.format(DEPENDENCY_FORMAT, constraint.from.id,
-                        stripLayoutAttributePrefix(constraint.type.name), suffix);
-            }
-
-            if (newName != null) {
-                s = String.format(DEPENDENCY_FORMAT, s, stripLayoutAttributePrefix(newName),
-                        BaseLayoutRule.stripIdPrefix(newId));
-            }
-
-            return s;
-        }
-
-        private static String stripLayoutAttributePrefix(String name) {
-            if (name.startsWith(ATTR_LAYOUT_RESOURCE_PREFIX)) {
-                return name.substring(ATTR_LAYOUT_RESOURCE_PREFIX.length());
-            }
-
-            return name;
-        }
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/relative/GuidelineHandler.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/relative/GuidelineHandler.java
deleted file mode 100644
index db08b18..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/relative/GuidelineHandler.java
+++ /dev/null
@@ -1,839 +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.layout.relative;
-
-import static com.android.ide.common.api.MarginType.NO_MARGIN;
-import static com.android.ide.common.api.MarginType.WITHOUT_MARGIN;
-import static com.android.ide.common.api.MarginType.WITH_MARGIN;
-import static com.android.ide.common.api.SegmentType.BASELINE;
-import static com.android.ide.common.api.SegmentType.BOTTOM;
-import static com.android.ide.common.api.SegmentType.CENTER_HORIZONTAL;
-import static com.android.ide.common.api.SegmentType.CENTER_VERTICAL;
-import static com.android.ide.common.api.SegmentType.LEFT;
-import static com.android.ide.common.api.SegmentType.RIGHT;
-import static com.android.ide.common.api.SegmentType.TOP;
-import static com.android.ide.common.layout.BaseLayoutRule.getMaxMatchDistance;
-import static com.android.SdkConstants.ATTR_ID;
-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_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_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_TO_LEFT_OF;
-import static com.android.SdkConstants.ATTR_LAYOUT_TO_RIGHT_OF;
-import static com.android.SdkConstants.VALUE_N_DP;
-import static com.android.SdkConstants.VALUE_TRUE;
-import static com.android.ide.common.layout.relative.ConstraintType.ALIGN_BASELINE;
-
-import static java.lang.Math.abs;
-
-import com.android.SdkConstants;
-import static com.android.SdkConstants.ANDROID_URI;
-import com.android.ide.common.api.DropFeedback;
-import com.android.ide.common.api.IClientRulesEngine;
-import com.android.ide.common.api.INode;
-import com.android.ide.common.api.Margins;
-import com.android.ide.common.api.Rect;
-import com.android.ide.common.api.Segment;
-import com.android.ide.common.api.SegmentType;
-import com.android.ide.common.layout.BaseLayoutRule;
-import com.android.ide.common.layout.relative.DependencyGraph.Constraint;
-import com.android.ide.common.layout.relative.DependencyGraph.ViewData;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.List;
-import java.util.Set;
-
-/**
- * The {@link GuidelineHandler} class keeps track of state related to a guideline operation
- * like move and resize, and performs various constraint computations.
- */
-public class GuidelineHandler {
-    /**
-     * A dependency graph for the relative layout recording constraint relationships
-     */
-    protected DependencyGraph mDependencyGraph;
-
-    /** The RelativeLayout we are moving/resizing within */
-    public INode layout;
-
-    /** The set of nodes being dragged (may be null) */
-    protected Collection<INode> mDraggedNodes;
-
-    /** The bounds of the primary child node being dragged */
-    protected Rect mBounds;
-
-    /** Whether the left edge is being moved/resized */
-    protected boolean mMoveLeft;
-
-    /** Whether the right edge is being moved/resized */
-    protected boolean mMoveRight;
-
-    /** Whether the top edge is being moved/resized */
-    protected boolean mMoveTop;
-
-    /** Whether the bottom edge is being moved/resized */
-    protected boolean mMoveBottom;
-
-    /**
-     * Whether the drop/move/resize position should be snapped (which can be turned off
-     * with a modifier key during the operation)
-     */
-    protected boolean mSnap = true;
-
-    /**
-     * The set of nodes which depend on the currently selected nodes, including
-     * transitively, through horizontal constraints (a "horizontal constraint"
-     * is a constraint between two horizontal edges)
-     */
-    protected Set<INode> mHorizontalDeps;
-
-    /**
-     * The set of nodes which depend on the currently selected nodes, including
-     * transitively, through vertical constraints (a "vertical constraint"
-     * is a constraint between two vertical edges)
-     */
-    protected Set<INode> mVerticalDeps;
-
-    /** The current list of constraints which result in a horizontal cycle (if applicable) */
-    protected List<Constraint> mHorizontalCycle;
-
-    /** The current list of constraints which result in a vertical cycle (if applicable) */
-    protected List<Constraint> mVerticalCycle;
-
-    /**
-     * All horizontal segments in the relative layout - top and bottom edges, baseline
-     * edges, and top and bottom edges offset by the applicable margins in each direction
-     */
-    protected List<Segment> mHorizontalEdges;
-
-    /**
-     * All vertical segments in the relative layout - left and right edges, and left and
-     * right edges offset by the applicable margins in each direction
-     */
-    protected List<Segment> mVerticalEdges;
-
-    /**
-     * All center vertical segments in the relative layout. These are kept separate since
-     * they only match other center edges.
-     */
-    protected List<Segment> mCenterVertEdges;
-
-    /**
-     * All center horizontal segments in the relative layout. These are kept separate
-     * since they only match other center edges.
-     */
-    protected List<Segment> mCenterHorizEdges;
-
-    /**
-     * Suggestions for horizontal matches. There could be more than one, but all matches
-     * will be equidistant from the current position (as well as in the same direction,
-     * which means that you can't have one match 5 pixels to the left and one match 5
-     * pixels to the right since it would be impossible to snap to fit with both; you can
-     * however have multiple matches all 5 pixels to the left.)
-     * <p
-     * The best vertical match will be found in {@link #mCurrentTopMatch} or
-     * {@link #mCurrentBottomMatch}.
-     */
-    protected List<Match> mHorizontalSuggestions;
-
-    /**
-     * Suggestions for vertical matches.
-     * <p
-     * The best vertical match will be found in {@link #mCurrentLeftMatch} or
-     * {@link #mCurrentRightMatch}.
-     */
-    protected List<Match> mVerticalSuggestions;
-
-    /**
-     * The current match on the left edge, or null if no match or if the left edge is not
-     * being moved or resized.
-     */
-    protected Match mCurrentLeftMatch;
-
-    /**
-     * The current match on the top edge, or null if no match or if the top edge is not
-     * being moved or resized.
-     */
-    protected Match mCurrentTopMatch;
-
-    /**
-     * The current match on the right edge, or null if no match or if the right edge is
-     * not being moved or resized.
-     */
-    protected Match mCurrentRightMatch;
-
-    /**
-     * The current match on the bottom edge, or null if no match or if the bottom edge is
-     * not being moved or resized.
-     */
-    protected Match mCurrentBottomMatch;
-
-    /**
-     * The amount of margin to add to the top edge, or 0
-     */
-    protected int mTopMargin;
-
-    /**
-     * The amount of margin to add to the bottom edge, or 0
-     */
-    protected int mBottomMargin;
-
-    /**
-     * The amount of margin to add to the left edge, or 0
-     */
-    protected int mLeftMargin;
-
-    /**
-     * The amount of margin to add to the right edge, or 0
-     */
-    protected int mRightMargin;
-
-    /**
-     * The associated rules engine
-     */
-    protected IClientRulesEngine mRulesEngine;
-
-    /**
-     * Construct a new {@link GuidelineHandler} for the given relative layout.
-     *
-     * @param layout the RelativeLayout to handle
-     */
-    GuidelineHandler(INode layout, IClientRulesEngine rulesEngine) {
-        this.layout = layout;
-        mRulesEngine = rulesEngine;
-
-        mHorizontalEdges = new ArrayList<Segment>();
-        mVerticalEdges = new ArrayList<Segment>();
-        mCenterVertEdges = new ArrayList<Segment>();
-        mCenterHorizEdges = new ArrayList<Segment>();
-        mDependencyGraph = new DependencyGraph(layout);
-    }
-
-    /**
-     * Returns true if the handler has any suggestions to offer
-     *
-     * @return true if the handler has any suggestions to offer
-     */
-    public boolean haveSuggestions() {
-        return mCurrentLeftMatch != null || mCurrentTopMatch != null
-                || mCurrentRightMatch != null || mCurrentBottomMatch != null;
-    }
-
-    /**
-     * Returns the closest match.
-     *
-     * @return the closest match, or null if nothing matched
-     */
-    protected Match pickBestMatch(List<Match> matches) {
-        int alternatives = matches.size();
-        if (alternatives == 0) {
-            return null;
-        } else if (alternatives == 1) {
-            Match match = matches.get(0);
-            return match;
-        } else {
-            assert alternatives > 1;
-            Collections.sort(matches, new MatchComparator());
-            return matches.get(0);
-        }
-    }
-
-    private boolean checkCycle(DropFeedback feedback, Match match, boolean vertical) {
-        if (match != null && match.cycle) {
-            for (INode node : mDraggedNodes) {
-                INode from = match.edge.node;
-                assert match.with.node == null || match.with.node == node;
-                INode to = node;
-                List<Constraint> path = mDependencyGraph.getPathTo(from, to, vertical);
-                if (path != null) {
-                    if (vertical) {
-                        mVerticalCycle = path;
-                    } else {
-                        mHorizontalCycle = path;
-                    }
-                    String desc = Constraint.describePath(path,
-                            match.type.name, match.edge.id);
-
-                    feedback.errorMessage = "Constraint creates a cycle: " + desc;
-                    return true;
-                }
-            }
-        }
-
-        return false;
-    }
-
-    /**
-     * Checks for any cycles in the dependencies
-     *
-     * @param feedback the drop feedback state
-     */
-    public void checkCycles(DropFeedback feedback) {
-        // Deliberate short circuit evaluation -- only list the first cycle
-        feedback.errorMessage = null;
-        mHorizontalCycle = null;
-        mVerticalCycle = null;
-
-        if (checkCycle(feedback, mCurrentTopMatch, true /* vertical */)
-                || checkCycle(feedback, mCurrentBottomMatch, true)) {
-        }
-
-        if (checkCycle(feedback, mCurrentLeftMatch, false)
-                || checkCycle(feedback, mCurrentRightMatch, false)) {
-        }
-    }
-
-    /** Records the matchable outside edges for the given node to the potential match list */
-    protected void addBounds(INode node, String id,
-            boolean addHorizontal, boolean addVertical) {
-        Rect b = node.getBounds();
-        Margins margins = node.getMargins();
-        if (addHorizontal) {
-            if (margins.top != 0) {
-                mHorizontalEdges.add(new Segment(b.y, b.x, b.x2(), node, id, TOP, WITHOUT_MARGIN));
-                mHorizontalEdges.add(new Segment(b.y - margins.top, b.x, b.x2(), node, id,
-                        TOP, WITH_MARGIN));
-            } else {
-                mHorizontalEdges.add(new Segment(b.y, b.x, b.x2(), node, id, TOP, NO_MARGIN));
-            }
-            if (margins.bottom != 0) {
-                mHorizontalEdges.add(new Segment(b.y2(), b.x, b.x2(), node, id, BOTTOM,
-                        WITHOUT_MARGIN));
-                mHorizontalEdges.add(new Segment(b.y2() + margins.bottom, b.x, b.x2(), node,
-                        id, BOTTOM, WITH_MARGIN));
-            } else {
-                mHorizontalEdges.add(new Segment(b.y2(), b.x, b.x2(), node, id,
-                        BOTTOM, NO_MARGIN));
-            }
-        }
-        if (addVertical) {
-            if (margins.left != 0) {
-                mVerticalEdges.add(new Segment(b.x, b.y, b.y2(), node, id, LEFT, WITHOUT_MARGIN));
-                mVerticalEdges.add(new Segment(b.x - margins.left, b.y, b.y2(), node, id, LEFT,
-                        WITH_MARGIN));
-            } else {
-                mVerticalEdges.add(new Segment(b.x, b.y, b.y2(), node, id, LEFT, NO_MARGIN));
-            }
-
-            if (margins.right != 0) {
-                mVerticalEdges.add(new Segment(b.x2(), b.y, b.y2(), node, id,
-                        RIGHT, WITHOUT_MARGIN));
-                mVerticalEdges.add(new Segment(b.x2() + margins.right, b.y, b.y2(), node, id,
-                        RIGHT, WITH_MARGIN));
-            } else {
-                mVerticalEdges.add(new Segment(b.x2(), b.y, b.y2(), node, id,
-                        RIGHT, NO_MARGIN));
-            }
-        }
-    }
-
-    /** Records the center edges for the given node to the potential match list */
-    protected void addCenter(INode node, String id,
-            boolean addHorizontal, boolean addVertical) {
-        Rect b = node.getBounds();
-
-        if (addHorizontal) {
-            mCenterHorizEdges.add(new Segment(b.centerY(), b.x, b.x2(),
-                node, id, CENTER_HORIZONTAL, NO_MARGIN));
-        }
-        if (addVertical) {
-            mCenterVertEdges.add(new Segment(b.centerX(), b.y, b.y2(),
-                node, id, CENTER_VERTICAL, NO_MARGIN));
-        }
-    }
-
-    /** Records the baseline edge for the given node to the potential match list */
-    protected int addBaseLine(INode node, String id) {
-        int baselineY = node.getBaseline();
-        if (baselineY != -1) {
-            Rect b = node.getBounds();
-            mHorizontalEdges.add(new Segment(b.y + baselineY, b.x, b.x2(), node, id, BASELINE,
-                    NO_MARGIN));
-        }
-
-        return baselineY;
-    }
-
-    protected void snapVertical(Segment vEdge, int x, Rect newBounds) {
-        newBounds.x = x;
-    }
-
-    protected void snapHorizontal(Segment hEdge, int y, Rect newBounds) {
-        newBounds.y = y;
-    }
-
-    /**
-     * Returns whether two edge types are compatible. For example, we only match the
-     * center of one object with the center of another.
-     *
-     * @param edge the first edge type to compare
-     * @param dragged the second edge type to compare the first one with
-     * @param delta the delta between the two edge locations
-     * @return true if the two edge types can be compatibly matched
-     */
-    protected boolean isEdgeTypeCompatible(SegmentType edge, SegmentType dragged, int delta) {
-
-        if (Math.abs(delta) > BaseLayoutRule.getMaxMatchDistance()) {
-            if (dragged == LEFT || dragged == TOP) {
-                if (delta > 0) {
-                    return false;
-                }
-            } else {
-                if (delta < 0) {
-                    return false;
-                }
-            }
-        }
-
-        switch (edge) {
-            case BOTTOM:
-            case TOP:
-                return dragged == TOP || dragged == BOTTOM;
-            case LEFT:
-            case RIGHT:
-                return dragged == LEFT || dragged == RIGHT;
-
-            // Center horizontal, center vertical and Baseline only matches the same
-            // type, and only within the matching distance -- no margins!
-            case BASELINE:
-            case CENTER_HORIZONTAL:
-            case CENTER_VERTICAL:
-                return dragged == edge && Math.abs(delta) < getMaxMatchDistance();
-            default: assert false : edge;
-        }
-        return false;
-    }
-
-    /**
-     * Finds the closest matching segments among the given list of edges for the given
-     * dragged edge, and returns these as a list of matches
-     */
-    protected List<Match> findClosest(Segment draggedEdge, List<Segment> edges) {
-        List<Match> closest = new ArrayList<Match>();
-        addClosest(draggedEdge, edges, closest);
-        return closest;
-    }
-
-    protected void addClosest(Segment draggedEdge, List<Segment> edges,
-            List<Match> closest) {
-        int at = draggedEdge.at;
-        int closestDelta = closest.size() > 0 ? closest.get(0).delta : Integer.MAX_VALUE;
-        int closestDistance = abs(closestDelta);
-        for (Segment edge : edges) {
-            assert draggedEdge.edgeType.isHorizontal() == edge.edgeType.isHorizontal();
-
-            int delta = edge.at - at;
-            int distance = abs(delta);
-            if (distance > closestDistance) {
-                continue;
-            }
-
-            if (!isEdgeTypeCompatible(edge.edgeType, draggedEdge.edgeType, delta)) {
-                continue;
-            }
-
-            boolean withParent = edge.node == layout;
-            ConstraintType type = ConstraintType.forMatch(withParent,
-                    draggedEdge.edgeType, edge.edgeType);
-            if (type == null) {
-                continue;
-            }
-
-            // Ensure that the edge match is compatible; for example, a "below"
-            // constraint can only apply to the margin bounds and a "bottom"
-            // constraint can only apply to the non-margin bounds.
-            if (type.relativeToMargin && edge.marginType == WITHOUT_MARGIN) {
-                continue;
-            } else if (!type.relativeToMargin && edge.marginType == WITH_MARGIN) {
-                continue;
-            }
-
-            Match match = new Match(this, edge, draggedEdge, type, delta);
-
-            if (distance < closestDistance) {
-                closest.clear();
-                closestDistance = distance;
-                closestDelta = delta;
-            } else if (delta * closestDelta < 0) {
-                // They have different signs, e.g. the matches are equal but
-                // on opposite sides; can't accept them both
-                continue;
-            }
-            closest.add(match);
-        }
-    }
-
-    protected void clearSuggestions() {
-        mHorizontalSuggestions = mVerticalSuggestions = null;
-        mCurrentLeftMatch = mCurrentRightMatch = null;
-        mCurrentTopMatch = mCurrentBottomMatch = null;
-    }
-
-    /**
-     * Given a node, apply the suggestions by expressing them as relative layout param
-     * values
-     *
-     * @param n the node to apply constraints to
-     */
-    public void applyConstraints(INode n) {
-        // Process each edge separately
-        String centerBoth = n.getStringAttr(ANDROID_URI, ATTR_LAYOUT_CENTER_IN_PARENT);
-        if (centerBoth != null && centerBoth.equals(VALUE_TRUE)) {
-            n.setAttribute(ANDROID_URI, ATTR_LAYOUT_CENTER_IN_PARENT, null);
-
-            // If you had a center-in-both-directions attribute, and you're
-            // only resizing in one dimension, then leave the other dimension
-            // centered, e.g. if you have centerInParent and apply alignLeft,
-            // then you should end up with alignLeft and centerVertically
-            if (mCurrentTopMatch == null && mCurrentBottomMatch == null) {
-                n.setAttribute(ANDROID_URI, ATTR_LAYOUT_CENTER_VERTICAL, VALUE_TRUE);
-            }
-            if (mCurrentLeftMatch == null && mCurrentRightMatch == null) {
-                n.setAttribute(ANDROID_URI, ATTR_LAYOUT_CENTER_HORIZONTAL, VALUE_TRUE);
-            }
-        }
-
-        if (mMoveTop) {
-            // Remove top attachments
-            n.setAttribute(ANDROID_URI, ATTR_LAYOUT_ALIGN_PARENT_TOP, null);
-            n.setAttribute(ANDROID_URI, ATTR_LAYOUT_ALIGN_TOP, null);
-            n.setAttribute(ANDROID_URI, ATTR_LAYOUT_BELOW, null);
-
-            n.setAttribute(ANDROID_URI, ATTR_LAYOUT_CENTER_VERTICAL, null);
-            n.setAttribute(ANDROID_URI, ATTR_LAYOUT_ALIGN_BASELINE, null);
-
-        }
-
-        if (mMoveBottom) {
-            // Remove bottom attachments
-            n.setAttribute(ANDROID_URI, ATTR_LAYOUT_ALIGN_PARENT_BOTTOM, null);
-            n.setAttribute(ANDROID_URI, ATTR_LAYOUT_ALIGN_BOTTOM, null);
-            n.setAttribute(ANDROID_URI, ATTR_LAYOUT_ABOVE, null);
-            n.setAttribute(ANDROID_URI, ATTR_LAYOUT_CENTER_VERTICAL, null);
-            n.setAttribute(ANDROID_URI, ATTR_LAYOUT_ALIGN_BASELINE, null);
-        }
-
-        if (mMoveLeft) {
-            // Remove left attachments
-            n.setAttribute(ANDROID_URI, ATTR_LAYOUT_ALIGN_PARENT_LEFT, null);
-            n.setAttribute(ANDROID_URI, ATTR_LAYOUT_ALIGN_LEFT, null);
-            n.setAttribute(ANDROID_URI, ATTR_LAYOUT_TO_RIGHT_OF, null);
-            n.setAttribute(ANDROID_URI, ATTR_LAYOUT_CENTER_HORIZONTAL, null);
-        }
-
-        if (mMoveRight) {
-            // Remove right attachments
-            n.setAttribute(ANDROID_URI, ATTR_LAYOUT_ALIGN_PARENT_RIGHT, null);
-            n.setAttribute(ANDROID_URI, ATTR_LAYOUT_ALIGN_RIGHT, null);
-            n.setAttribute(ANDROID_URI, ATTR_LAYOUT_TO_LEFT_OF, null);
-            n.setAttribute(ANDROID_URI, ATTR_LAYOUT_CENTER_HORIZONTAL, null);
-        }
-
-        if (mMoveTop && mCurrentTopMatch != null) {
-            applyConstraint(n, mCurrentTopMatch.getConstraint(true /* generateId */));
-            if (mCurrentTopMatch.type == ALIGN_BASELINE) {
-                // HACK! WORKAROUND! Baseline doesn't provide a new bottom edge for attachments
-                String c = mCurrentTopMatch.getConstraint(true);
-                c = c.replace(ATTR_LAYOUT_ALIGN_BASELINE, ATTR_LAYOUT_ALIGN_BOTTOM);
-                applyConstraint(n, c);
-            }
-        }
-
-        if (mMoveBottom && mCurrentBottomMatch != null) {
-            applyConstraint(n, mCurrentBottomMatch.getConstraint(true));
-        }
-
-        if (mMoveLeft && mCurrentLeftMatch != null) {
-            applyConstraint(n, mCurrentLeftMatch.getConstraint(true));
-        }
-
-        if (mMoveRight && mCurrentRightMatch != null) {
-            applyConstraint(n, mCurrentRightMatch.getConstraint(true));
-        }
-
-        if (mMoveLeft) {
-            applyMargin(n, ATTR_LAYOUT_MARGIN_LEFT, mLeftMargin);
-        }
-        if (mMoveRight) {
-            applyMargin(n, ATTR_LAYOUT_MARGIN_RIGHT, mRightMargin);
-        }
-        if (mMoveTop) {
-            applyMargin(n, ATTR_LAYOUT_MARGIN_TOP, mTopMargin);
-        }
-        if (mMoveBottom) {
-            applyMargin(n, ATTR_LAYOUT_MARGIN_BOTTOM, mBottomMargin);
-        }
-    }
-
-    private void applyConstraint(INode n, String constraint) {
-        assert constraint.contains("=") : constraint;
-        String name = constraint.substring(0, constraint.indexOf('='));
-        String value = constraint.substring(constraint.indexOf('=') + 1);
-        n.setAttribute(ANDROID_URI, name, value);
-    }
-
-    private void applyMargin(INode n, String marginAttribute, int margin) {
-        if (margin > 0) {
-            int dp = mRulesEngine.pxToDp(margin);
-            n.setAttribute(ANDROID_URI, marginAttribute, String.format(VALUE_N_DP, dp));
-        } else if (n.getStringAttr(ANDROID_URI, marginAttribute) != null) {
-            // Clear out existing margin
-            n.setAttribute(ANDROID_URI, marginAttribute, null);
-        }
-    }
-
-    private void removeRelativeParams(INode node) {
-        for (ConstraintType type : ConstraintType.values()) {
-            node.setAttribute(ANDROID_URI, type.name, null);
-        }
-        node.setAttribute(ANDROID_URI,ATTR_LAYOUT_MARGIN_LEFT, null);
-        node.setAttribute(ANDROID_URI,ATTR_LAYOUT_MARGIN_RIGHT, null);
-        node.setAttribute(ANDROID_URI,ATTR_LAYOUT_MARGIN_TOP, null);
-        node.setAttribute(ANDROID_URI,ATTR_LAYOUT_MARGIN_BOTTOM, null);
-    }
-
-    /**
-     * Attach the new child to the previous node
-     * @param previous the previous child
-     * @param node the new child to attach it to
-     */
-    public void attachPrevious(INode previous, INode node) {
-        removeRelativeParams(node);
-
-        String id = previous.getStringAttr(ANDROID_URI, ATTR_ID);
-        if (id == null) {
-            return;
-        }
-
-        if (mCurrentTopMatch != null || mCurrentBottomMatch != null) {
-            // Attaching the top: arrange below, and for bottom arrange above
-            node.setAttribute(ANDROID_URI,
-                    mCurrentTopMatch != null ? ATTR_LAYOUT_BELOW : ATTR_LAYOUT_ABOVE, id);
-            // Apply same left/right constraints as the parent
-            if (mCurrentLeftMatch != null) {
-                applyConstraint(node, mCurrentLeftMatch.getConstraint(true));
-                applyMargin(node, ATTR_LAYOUT_MARGIN_LEFT, mLeftMargin);
-            } else if (mCurrentRightMatch != null) {
-                applyConstraint(node, mCurrentRightMatch.getConstraint(true));
-                applyMargin(node, ATTR_LAYOUT_MARGIN_RIGHT, mRightMargin);
-            }
-        } else if (mCurrentLeftMatch != null || mCurrentRightMatch != null) {
-            node.setAttribute(ANDROID_URI,
-                    mCurrentLeftMatch != null ? ATTR_LAYOUT_TO_RIGHT_OF : ATTR_LAYOUT_TO_LEFT_OF,
-                            id);
-            // Apply same top/bottom constraints as the parent
-            if (mCurrentTopMatch != null) {
-                applyConstraint(node, mCurrentTopMatch.getConstraint(true));
-                applyMargin(node, ATTR_LAYOUT_MARGIN_TOP, mTopMargin);
-            } else if (mCurrentBottomMatch != null) {
-                applyConstraint(node, mCurrentBottomMatch.getConstraint(true));
-                applyMargin(node, ATTR_LAYOUT_MARGIN_BOTTOM, mBottomMargin);
-            }
-        } else {
-            return;
-        }
-    }
-
-    /** Breaks any cycles detected by the handler */
-    public void removeCycles() {
-        if (mHorizontalCycle != null) {
-            removeCycles(mHorizontalDeps);
-        }
-        if (mVerticalCycle != null) {
-            removeCycles(mVerticalDeps);
-        }
-    }
-
-    private void removeCycles(Set<INode> deps) {
-        for (INode node : mDraggedNodes) {
-            ViewData view = mDependencyGraph.getView(node);
-            if (view != null) {
-                for (Constraint constraint : view.dependedOnBy) {
-                    // For now, remove ALL constraints pointing to this node in this orientation.
-                    // Later refine this to be smarter. (We can't JUST remove the constraints
-                    // identified in the cycle since there could be multiple.)
-                    constraint.from.node.setAttribute(ANDROID_URI, constraint.type.name, null);
-                }
-            }
-        }
-    }
-
-    /**
-     * Comparator used to sort matches such that the first match is the most desirable
-     * match (where we prefer attaching to parent bounds, we avoid matches that lead to a
-     * cycle, we prefer constraints on closer widgets rather than ones further away, and
-     * so on.)
-     * <p>
-     * There are a number of sorting criteria. One of them is the distance between the
-     * matched edges. We may end up with multiple matches that are the same distance. In
-     * that case we look at the orientation; on the left side, prefer left-oriented
-     * attachments, and on the right-side prefer right-oriented attachments. For example,
-     * consider the following scenario:
-     *
-     * <pre>
-     *    +--------------------+-------------------------+
-     *    | Attached on left   |                         |
-     *    +--------------------+                         |
-     *    |                                              |
-     *    |                    +-----+                   |
-     *    |                    |  A  |                   |
-     *    |                    +-----+                   |
-     *    |                                              |
-     *    |                    +-------------------------+
-     *    |                    |       Attached on right |
-     *    +--------------------+-------------------------+
-     * </pre>
-     *
-     * Here, dragging the left edge should attach to the top left attached view, whereas
-     * in the following layout dragging the right edge would attach to the bottom view:
-     *
-     * <pre>
-     *    +--------------------------+-------------------+
-     *    | Attached on left         |                   |
-     *    +--------------------------+                   |
-     *    |                                              |
-     *    |                    +-----+                   |
-     *    |                    |  A  |                   |
-     *    |                    +-----+                   |
-     *    |                                              |
-     *    |                          +-------------------+
-     *    |                          | Attached on right |
-     *    +--------------------------+-------------------+
-     *
-     * </pre>
-     *
-     * </ul>
-     */
-    private final class MatchComparator implements Comparator<Match> {
-        @Override
-        public int compare(Match m1, Match m2) {
-            // Always prefer matching parent bounds
-            int parent1 = m1.edge.node == layout ? -1 : 1;
-            int parent2 = m2.edge.node == layout ? -1 : 1;
-            // unless it's a center bound -- those should always get lowest priority since
-            // they overlap with other usually more interesting edges near the center of
-            // the layout.
-            if (m1.edge.edgeType == CENTER_HORIZONTAL
-                    || m1.edge.edgeType == CENTER_VERTICAL) {
-                parent1 = 2;
-            }
-            if (m2.edge.edgeType == CENTER_HORIZONTAL
-                    || m2.edge.edgeType == CENTER_VERTICAL) {
-                parent2 = 2;
-            }
-            if (parent1 != parent2) {
-                return parent1 - parent2;
-            }
-
-            // Avoid matching edges that would lead to a cycle
-            if (m1.edge.edgeType.isHorizontal()) {
-                int cycle1 = mHorizontalDeps.contains(m1.edge.node) ? 1 : -1;
-                int cycle2 = mHorizontalDeps.contains(m2.edge.node) ? 1 : -1;
-                if (cycle1 != cycle2) {
-                    return cycle1 - cycle2;
-                }
-            } else {
-                int cycle1 = mVerticalDeps.contains(m1.edge.node) ? 1 : -1;
-                int cycle2 = mVerticalDeps.contains(m2.edge.node) ? 1 : -1;
-                if (cycle1 != cycle2) {
-                    return cycle1 - cycle2;
-                }
-            }
-
-            // TODO: Sort by minimum depth -- do we have the depth anywhere?
-
-            // Prefer nodes that are closer
-            int distance1, distance2;
-            if (m1.edge.to <= m1.with.from) {
-                distance1 = m1.with.from - m1.edge.to;
-            } else if (m1.edge.from >= m1.with.to) {
-                distance1 = m1.edge.from - m1.with.to;
-            } else {
-                // Some kind of overlap - not sure how to prioritize these yet...
-                distance1 = 0;
-            }
-            if (m2.edge.to <= m2.with.from) {
-                distance2 = m2.with.from - m2.edge.to;
-            } else if (m2.edge.from >= m2.with.to) {
-                distance2 = m2.edge.from - m2.with.to;
-            } else {
-                // Some kind of overlap - not sure how to prioritize these yet...
-                distance2 = 0;
-            }
-
-            if (distance1 != distance2) {
-                return distance1 - distance2;
-            }
-
-            // Prefer matching on baseline
-            int baseline1 = (m1.edge.edgeType == BASELINE) ? -1 : 1;
-            int baseline2 = (m2.edge.edgeType == BASELINE) ? -1 : 1;
-            if (baseline1 != baseline2) {
-                return baseline1 - baseline2;
-            }
-
-            // Prefer matching top/left edges before matching bottom/right edges
-            int orientation1 = (m1.with.edgeType == LEFT ||
-                      m1.with.edgeType == TOP) ? -1 : 1;
-            int orientation2 = (m2.with.edgeType == LEFT ||
-                      m2.with.edgeType == TOP) ? -1 : 1;
-            if (orientation1 != orientation2) {
-                return orientation1 - orientation2;
-            }
-
-            // Prefer opposite-matching over same-matching.
-            // In other words, if we have the choice of matching
-            // our left edge with another element's left edge,
-            // or matching our left edge with another element's right
-            // edge, prefer the right edge since that
-            // The two matches have identical distance; try to sort by
-            // orientation
-            int edgeType1 = (m1.edge.edgeType != m1.with.edgeType) ? -1 : 1;
-            int edgeType2 = (m2.edge.edgeType != m2.with.edgeType) ? -1 : 1;
-            if (edgeType1 != edgeType2) {
-                return edgeType1 - edgeType2;
-            }
-
-            return 0;
-        }
-    }
-
-    /**
-     * Returns the {@link IClientRulesEngine} IDE callback
-     *
-     * @return the {@link IClientRulesEngine} IDE callback, never null
-     */
-    public IClientRulesEngine getRulesEngine() {
-        return mRulesEngine;
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/relative/GuidelinePainter.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/relative/GuidelinePainter.java
deleted file mode 100644
index 2fe7476..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/relative/GuidelinePainter.java
+++ /dev/null
@@ -1,208 +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.layout.relative;
-
-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.ID_PREFIX;
-import static com.android.SdkConstants.NEW_ID_PREFIX;
-
-import com.android.annotations.NonNull;
-import com.android.ide.common.api.DrawingStyle;
-import com.android.ide.common.api.DropFeedback;
-import com.android.ide.common.api.IFeedbackPainter;
-import com.android.ide.common.api.IGraphics;
-import com.android.ide.common.api.INode;
-import com.android.ide.common.api.Point;
-import com.android.ide.common.api.Rect;
-import com.android.ide.common.api.SegmentType;
-import com.android.ide.common.layout.relative.DependencyGraph.Constraint;
-
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-/**
- * The {@link GuidelinePainter} is responsible for painting guidelines during an operation
- * which uses a {@link GuidelineHandler} such as a resize operation.
- */
-public final class GuidelinePainter implements IFeedbackPainter {
-    // ---- Implements IFeedbackPainter ----
-    @Override
-    public void paint(@NonNull IGraphics gc, @NonNull INode node, @NonNull DropFeedback feedback) {
-        GuidelineHandler state = (GuidelineHandler) feedback.userData;
-
-        for (INode dragged : state.mDraggedNodes) {
-            gc.useStyle(DrawingStyle.DRAGGED);
-            Rect bounds = dragged.getBounds();
-            if (bounds.isValid()) {
-                gc.fillRect(bounds);
-            }
-        }
-
-        Set<INode> horizontalDeps = state.mHorizontalDeps;
-        Set<INode> verticalDeps = state.mVerticalDeps;
-        Set<INode> deps = new HashSet<INode>(horizontalDeps.size() + verticalDeps.size());
-        deps.addAll(horizontalDeps);
-        deps.addAll(verticalDeps);
-        if (deps.size() > 0) {
-            gc.useStyle(DrawingStyle.DEPENDENCY);
-            for (INode n : deps) {
-                // Don't highlight the selected nodes themselves
-                if (state.mDraggedNodes.contains(n)) {
-                    continue;
-                }
-                Rect bounds = n.getBounds();
-                gc.fillRect(bounds);
-            }
-        }
-
-        if (state.mBounds != null) {
-            if (state instanceof MoveHandler) {
-                gc.useStyle(DrawingStyle.DROP_PREVIEW);
-            } else {
-                // Resizing
-                if (state.haveSuggestions()) {
-                    gc.useStyle(DrawingStyle.RESIZE_PREVIEW);
-                } else {
-                    gc.useStyle(DrawingStyle.RESIZE_FAIL);
-                }
-            }
-            gc.drawRect(state.mBounds);
-
-            // Draw baseline preview too
-            if (feedback.dragBaseline != -1) {
-                int y = state.mBounds.y + feedback.dragBaseline;
-                gc.drawLine(state.mBounds.x, y, state.mBounds.x2(), y);
-            }
-        }
-
-        List<String> strings = new ArrayList<String>();
-
-        showMatch(gc, state.mCurrentLeftMatch, state, strings,
-                state.mLeftMargin, ATTR_LAYOUT_MARGIN_LEFT);
-        showMatch(gc, state.mCurrentRightMatch, state, strings,
-                state.mRightMargin, ATTR_LAYOUT_MARGIN_RIGHT);
-        showMatch(gc, state.mCurrentTopMatch, state, strings,
-                state.mTopMargin, ATTR_LAYOUT_MARGIN_TOP);
-        showMatch(gc, state.mCurrentBottomMatch, state, strings,
-                state.mBottomMargin, ATTR_LAYOUT_MARGIN_BOTTOM);
-
-        if (strings.size() > 0) {
-            // Update the drag tooltip
-            StringBuilder sb = new StringBuilder(200);
-            for (String s : strings) {
-                if (sb.length() > 0) {
-                    sb.append('\n');
-                }
-                sb.append(s);
-            }
-            feedback.tooltip = sb.toString();
-
-            // Set the tooltip orientation to ensure that it does not interfere with
-            // the constraint arrows
-            if (state.mCurrentLeftMatch != null) {
-                feedback.tooltipX = SegmentType.RIGHT;
-            } else if (state.mCurrentRightMatch != null) {
-                feedback.tooltipX = SegmentType.LEFT;
-            }
-            if (state.mCurrentTopMatch != null) {
-                feedback.tooltipY = SegmentType.BOTTOM;
-            } else if (state.mCurrentBottomMatch != null) {
-                feedback.tooltipY = SegmentType.TOP;
-            }
-        } else {
-            feedback.tooltip = null;
-        }
-
-        if (state.mHorizontalCycle != null) {
-            paintCycle(gc, state, state.mHorizontalCycle);
-        }
-        if (state.mVerticalCycle != null) {
-            paintCycle(gc, state, state.mVerticalCycle);
-        }
-    }
-
-    /** Paints a particular match constraint */
-    private void showMatch(IGraphics gc, Match m, GuidelineHandler state, List<String> strings,
-            int margin, String marginAttribute) {
-        if (m == null) {
-            return;
-        }
-        ConstraintPainter.paintConstraint(gc, state.mBounds, m);
-
-        // Display the constraint. Remove the @id/ and @+id/ prefixes to make the text
-        // shorter and easier to read. This doesn't use stripPrefix() because the id is
-        // usually not a prefix of the value (for example, 'layout_alignBottom=@+id/foo').
-        String constraint = m.getConstraint(false /* generateId */);
-        String description = constraint.replace(NEW_ID_PREFIX, "").replace(ID_PREFIX, "");
-        if (description.startsWith(ATTR_LAYOUT_RESOURCE_PREFIX)) {
-            description = description.substring(ATTR_LAYOUT_RESOURCE_PREFIX.length());
-        }
-        if (margin > 0) {
-            int dp = state.getRulesEngine().pxToDp(margin);
-            description = String.format("%1$s, margin=%2$d dp", description, dp);
-        }
-        strings.add(description);
-    }
-
-    /** Paints a constraint cycle */
-    void paintCycle(IGraphics gc, GuidelineHandler state, List<Constraint> cycle) {
-        gc.useStyle(DrawingStyle.CYCLE);
-        assert cycle.size() > 0;
-
-        INode from = cycle.get(0).from.node;
-        Rect fromBounds = from.getBounds();
-        if (state.mDraggedNodes.contains(from)) {
-            fromBounds = state.mBounds;
-        }
-        Point fromCenter = fromBounds.center();
-        INode to = null;
-
-        List<Point> points = new ArrayList<Point>();
-        points.add(fromCenter);
-
-        for (Constraint constraint : cycle) {
-            assert constraint.from.node == from;
-            to = constraint.to.node;
-            assert from != null && to != null;
-
-            Point toCenter = to.getBounds().center();
-            points.add(toCenter);
-
-            // Also go through the dragged node bounds
-            boolean isDragged = state.mDraggedNodes.contains(to);
-            if (isDragged) {
-                toCenter = state.mBounds.center();
-                points.add(toCenter);
-            }
-
-            from = to;
-            fromCenter = toCenter;
-        }
-
-        points.add(fromCenter);
-        points.add(points.get(0));
-
-        for (int i = 1, n = points.size(); i < n; i++) {
-            gc.drawLine(points.get(i-1), points.get(i));
-        }
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/relative/Match.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/relative/Match.java
deleted file mode 100644
index 6f3f0d0..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/relative/Match.java
+++ /dev/null
@@ -1,100 +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.layout.relative;
-
-import static com.android.SdkConstants.ATTR_ID;
-import static com.android.SdkConstants.VALUE_TRUE;
-
-
-import com.android.SdkConstants;
-import static com.android.SdkConstants.ANDROID_URI;
-import com.android.ide.common.api.Segment;
-
-/** A match is a potential pairing of two segments with a given {@link ConstraintType}. */
-class Match {
-    /** the edge of the dragged node that is matched */
-    public final Segment with;
-
-    /** the "other" edge that the dragged edge is matched with */
-    public final Segment edge;
-
-    /** the signed distance between the matched edges */
-    public final int delta;
-
-    /** the type of constraint this is a match for */
-    public final ConstraintType type;
-
-    /** whether this {@link Match} results in a cycle */
-    public boolean cycle;
-
-    /** The associated {@link GuidelineHander} which performed the match */
-    private final GuidelineHandler mHandler;
-
-    /**
-     * Create a new match.
-     *
-     * @param handler the handler which performed the match
-     * @param edge the "other" edge that the dragged edge is matched with
-     * @param with the edge of the dragged node that is matched
-     * @param type the type of constraint this is a match for
-     * @param delta the signed distance between the matched edges
-     */
-    public Match(GuidelineHandler handler, Segment edge, Segment with,
-            ConstraintType type, int delta) {
-        mHandler = handler;
-
-        this.edge = edge;
-        this.with = with;
-        this.type = type;
-        this.delta = delta;
-    }
-
-    /**
-     * Returns the XML constraint attribute value for this match
-     *
-     * @param generateId whether an id should be generated if one is missing
-     * @return the XML constraint attribute value for this match
-     */
-    public String getConstraint(boolean generateId) {
-        if (type.targetParent) {
-            return type.name + '=' + VALUE_TRUE;
-        } else {
-            String id = edge.id;
-            if (id == null || id.length() == -1) {
-                if (!generateId) {
-                    // Placeholder to display for the user during dragging
-                    id = "<generated>";
-                } else {
-                    // Must generate an id on the fly!
-                    // See if it's been set by a different constraint we've already applied
-                    // to this same node
-                    id = edge.node.getStringAttr(ANDROID_URI, ATTR_ID);
-                    if (id == null || id.length() == 0) {
-                        id = mHandler.getRulesEngine().getUniqueId(edge.node.getFqcn());
-                        edge.node.setAttribute(ANDROID_URI, ATTR_ID, id);
-                    }
-                }
-            }
-            return type.name + '=' + id;
-        }
-    }
-
-    @Override
-    public String toString() {
-        return "Match [type=" + type + ", delta=" + delta + ", edge=" + edge
-                + "]";
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/relative/MoveHandler.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/relative/MoveHandler.java
deleted file mode 100644
index 0fa915d..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/relative/MoveHandler.java
+++ /dev/null
@@ -1,299 +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.layout.relative;
-
-import static com.android.ide.common.api.MarginType.NO_MARGIN;
-import static com.android.ide.common.api.SegmentType.BASELINE;
-import static com.android.ide.common.api.SegmentType.BOTTOM;
-import static com.android.ide.common.api.SegmentType.CENTER_HORIZONTAL;
-import static com.android.ide.common.api.SegmentType.CENTER_VERTICAL;
-import static com.android.ide.common.api.SegmentType.LEFT;
-import static com.android.ide.common.api.SegmentType.RIGHT;
-import static com.android.ide.common.api.SegmentType.TOP;
-import static com.android.SdkConstants.ATTR_ID;
-
-import static java.lang.Math.abs;
-
-import com.android.SdkConstants;
-import static com.android.SdkConstants.ANDROID_URI;
-import com.android.ide.common.api.DropFeedback;
-import com.android.ide.common.api.IClientRulesEngine;
-import com.android.ide.common.api.IDragElement;
-import com.android.ide.common.api.INode;
-import com.android.ide.common.api.Rect;
-import com.android.ide.common.api.Segment;
-import com.android.ide.common.layout.BaseLayoutRule;
-import com.android.ide.common.layout.relative.DependencyGraph.ViewData;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * A {@link MoveHandler} is a {@link GuidelineHandler} which handles move and drop
- * gestures, and offers guideline suggestions and snapping.
- * <p>
- * Unlike the {@link ResizeHandler}, the {@link MoveHandler} looks for matches for all
- * different segment types -- the left edge, the right edge, the baseline, the center
- * edges, and so on -- and picks the best among these.
- */
-public class MoveHandler extends GuidelineHandler {
-    private int mDraggedBaseline;
-
-    /**
-     * Creates a new {@link MoveHandler}.
-     *
-     * @param layout the layout element the handler is operating on
-     * @param elements the elements being dragged in the move operation
-     * @param rulesEngine the corresponding {@link IClientRulesEngine}
-     */
-    public MoveHandler(INode layout, IDragElement[] elements, IClientRulesEngine rulesEngine) {
-        super(layout, rulesEngine);
-
-        // Compute list of nodes being dragged within the layout, if any
-        List<INode> nodes = new ArrayList<INode>();
-        for (IDragElement element : elements) {
-            ViewData view = mDependencyGraph.getView(element);
-            if (view != null) {
-                nodes.add(view.node);
-            }
-        }
-        mDraggedNodes = nodes;
-
-        mHorizontalDeps = mDependencyGraph.dependsOn(nodes, false /* verticalEdge */);
-        mVerticalDeps = mDependencyGraph.dependsOn(nodes, true /* verticalEdge */);
-
-        for (INode child : layout.getChildren()) {
-            Rect bc = child.getBounds();
-            if (bc.isValid()) {
-                // First see if this node looks like it's the same as one of the
-                // *dragged* bounds
-                boolean isDragged = false;
-                for (IDragElement element : elements) {
-                    // This tries to determine if an INode corresponds to an
-                    // IDragElement, by comparing their bounds.
-                    if (bc.equals(element.getBounds())) {
-                        isDragged = true;
-                    }
-                }
-
-                if (!isDragged) {
-                    String id = child.getStringAttr(ANDROID_URI, ATTR_ID);
-                    // It's okay for id to be null; if you apply a constraint
-                    // to a node with a missing id we will generate the id
-
-                    boolean addHorizontal = !mHorizontalDeps.contains(child);
-                    boolean addVertical = !mVerticalDeps.contains(child);
-
-                    addBounds(child, id, addHorizontal, addVertical);
-                    if (addHorizontal) {
-                        addBaseLine(child, id);
-                    }
-                }
-            }
-        }
-
-        String id = layout.getStringAttr(ANDROID_URI, ATTR_ID);
-        addBounds(layout, id, true, true);
-        addCenter(layout, id, true, true);
-    }
-
-    @Override
-    protected void snapVertical(Segment vEdge, int x, Rect newBounds) {
-        int maxDistance = BaseLayoutRule.getMaxMatchDistance();
-        if (vEdge.edgeType == LEFT) {
-            int margin = !mSnap ? 0 : abs(newBounds.x - x);
-            if (margin > maxDistance) {
-                mLeftMargin = margin;
-            } else {
-                newBounds.x = x;
-            }
-        } else if (vEdge.edgeType == RIGHT) {
-            int margin = !mSnap ? 0 : abs(newBounds.x - (x - newBounds.w));
-            if (margin > maxDistance) {
-                mRightMargin = margin;
-            } else {
-                newBounds.x = x - newBounds.w;
-            }
-        } else if (vEdge.edgeType == CENTER_VERTICAL) {
-            newBounds.x = x - newBounds.w / 2;
-        } else {
-            assert false : vEdge;
-        }
-    }
-
-    // TODO: Consider unifying this with the snapping logic in ResizeHandler
-    @Override
-    protected void snapHorizontal(Segment hEdge, int y, Rect newBounds) {
-        int maxDistance = BaseLayoutRule.getMaxMatchDistance();
-        if (hEdge.edgeType == TOP) {
-            int margin = !mSnap ? 0 : abs(newBounds.y - y);
-            if (margin > maxDistance) {
-                mTopMargin = margin;
-            } else {
-                newBounds.y = y;
-            }
-        } else if (hEdge.edgeType == BOTTOM) {
-            int margin = !mSnap ? 0 : abs(newBounds.y - (y - newBounds.h));
-            if (margin > maxDistance) {
-                mBottomMargin = margin;
-            } else {
-                newBounds.y = y - newBounds.h;
-            }
-        } else if (hEdge.edgeType == CENTER_HORIZONTAL) {
-            int margin = !mSnap ? 0 : abs(newBounds.y - (y - newBounds.h / 2));
-            if (margin > maxDistance) {
-                mTopMargin = margin;
-                // or bottomMargin?
-            } else {
-                newBounds.y = y - newBounds.h / 2;
-            }
-        } else if (hEdge.edgeType == BASELINE) {
-                newBounds.y = y - mDraggedBaseline;
-        } else {
-            assert false : hEdge;
-        }
-    }
-
-    /**
-     * Updates the handler for the given mouse move
-     *
-     * @param feedback the feedback handler
-     * @param elements the elements being dragged
-     * @param offsetX the new mouse X coordinate
-     * @param offsetY the new mouse Y coordinate
-     * @param modifierMask the keyboard modifiers pressed during the drag
-     */
-    public void updateMove(DropFeedback feedback, IDragElement[] elements,
-            int offsetX, int offsetY, int modifierMask) {
-        mSnap = (modifierMask & DropFeedback.MODIFIER2) == 0;
-
-        Rect firstBounds = elements[0].getBounds();
-        INode firstNode = null;
-        if (mDraggedNodes != null && mDraggedNodes.size() > 0) {
-            // TODO - this isn't quite right; this could be a different node than we have
-            // bounds for!
-            firstNode = mDraggedNodes.iterator().next();
-            firstBounds = firstNode.getBounds();
-        }
-
-        mBounds = new Rect(offsetX, offsetY, firstBounds.w, firstBounds.h);
-        Rect layoutBounds = layout.getBounds();
-        if (mBounds.x2() > layoutBounds.x2()) {
-            mBounds.x -= mBounds.x2() - layoutBounds.x2();
-        }
-        if (mBounds.y2() > layoutBounds.y2()) {
-            mBounds.y -= mBounds.y2() - layoutBounds.y2();
-        }
-        if (mBounds.x < layoutBounds.x) {
-            mBounds.x = layoutBounds.x;
-        }
-        if (mBounds.y < layoutBounds.y) {
-            mBounds.y = layoutBounds.y;
-        }
-
-        clearSuggestions();
-
-        Rect b = mBounds;
-        Segment edge = new Segment(b.y, b.x, b.x2(), null, null, TOP, NO_MARGIN);
-        List<Match> horizontalMatches = findClosest(edge, mHorizontalEdges);
-        edge = new Segment(b.y2(), b.x, b.x2(), null, null, BOTTOM, NO_MARGIN);
-        addClosest(edge, mHorizontalEdges, horizontalMatches);
-
-        edge = new Segment(b.x, b.y, b.y2(), null, null, LEFT, NO_MARGIN);
-        List<Match> verticalMatches = findClosest(edge, mVerticalEdges);
-        edge = new Segment(b.x2(), b.y, b.y2(), null, null, RIGHT, NO_MARGIN);
-        addClosest(edge, mVerticalEdges, verticalMatches);
-
-        // Match center
-        edge = new Segment(b.centerX(), b.y, b.y2(), null, null, CENTER_VERTICAL, NO_MARGIN);
-        addClosest(edge, mCenterVertEdges, verticalMatches);
-        edge = new Segment(b.centerY(), b.x, b.x2(), null, null, CENTER_HORIZONTAL, NO_MARGIN);
-        addClosest(edge, mCenterHorizEdges, horizontalMatches);
-
-        // Match baseline
-        if (firstNode != null) {
-            int baseline = firstNode.getBaseline();
-            if (baseline != -1) {
-                mDraggedBaseline = baseline;
-                edge = new Segment(b.y + baseline, b.x, b.x2(), firstNode, null, BASELINE,
-                        NO_MARGIN);
-                addClosest(edge, mHorizontalEdges, horizontalMatches);
-            }
-        } else {
-            int baseline = feedback.dragBaseline;
-            if (baseline != -1) {
-                mDraggedBaseline = baseline;
-                edge = new Segment(offsetY + baseline, b.x, b.x2(), null, null, BASELINE,
-                        NO_MARGIN);
-                addClosest(edge, mHorizontalEdges, horizontalMatches);
-            }
-        }
-
-        mHorizontalSuggestions = horizontalMatches;
-        mVerticalSuggestions = verticalMatches;
-        mTopMargin = mBottomMargin = mLeftMargin = mRightMargin = 0;
-
-        Match match = pickBestMatch(mHorizontalSuggestions);
-        if (match != null) {
-            if (mHorizontalDeps.contains(match.edge.node)) {
-                match.cycle = true;
-            }
-
-            // Reset top AND bottom bounds regardless of whether both are bound
-            mMoveTop = true;
-            mMoveBottom = true;
-
-            // TODO: Consider doing the snap logic on all the possible matches
-            // BEFORE sorting, in case this affects the best-pick algorithm (since some
-            // edges snap and others don't).
-            snapHorizontal(match.with, match.edge.at, mBounds);
-
-            if (match.with.edgeType == TOP) {
-                mCurrentTopMatch = match;
-            } else if (match.with.edgeType == BOTTOM) {
-                mCurrentBottomMatch = match;
-            } else {
-                assert match.with.edgeType == CENTER_HORIZONTAL
-                        || match.with.edgeType == BASELINE : match.with.edgeType;
-                mCurrentTopMatch = match;
-            }
-        }
-
-        match = pickBestMatch(mVerticalSuggestions);
-        if (match != null) {
-            if (mVerticalDeps.contains(match.edge.node)) {
-                match.cycle = true;
-            }
-
-            // Reset left AND right bounds regardless of whether both are bound
-            mMoveLeft = true;
-            mMoveRight = true;
-
-            snapVertical(match.with, match.edge.at, mBounds);
-
-            if (match.with.edgeType == LEFT) {
-                mCurrentLeftMatch = match;
-            } else if (match.with.edgeType == RIGHT) {
-                mCurrentRightMatch = match;
-            } else {
-                assert match.with.edgeType == CENTER_VERTICAL;
-                mCurrentLeftMatch = match;
-            }
-        }
-
-        checkCycles(feedback);
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/relative/ResizeHandler.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/relative/ResizeHandler.java
deleted file mode 100644
index a5e071d..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/relative/ResizeHandler.java
+++ /dev/null
@@ -1,265 +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.layout.relative;
-
-import static com.android.ide.common.api.MarginType.NO_MARGIN;
-import static com.android.ide.common.api.SegmentType.BASELINE;
-import static com.android.ide.common.api.SegmentType.BOTTOM;
-import static com.android.ide.common.api.SegmentType.CENTER_HORIZONTAL;
-import static com.android.ide.common.api.SegmentType.CENTER_VERTICAL;
-import static com.android.ide.common.api.SegmentType.LEFT;
-import static com.android.ide.common.api.SegmentType.RIGHT;
-import static com.android.ide.common.api.SegmentType.TOP;
-import static com.android.SdkConstants.ATTR_ID;
-
-import static java.lang.Math.abs;
-
-import com.android.SdkConstants;
-import static com.android.SdkConstants.ANDROID_URI;
-import com.android.ide.common.api.DropFeedback;
-import com.android.ide.common.api.IClientRulesEngine;
-import com.android.ide.common.api.INode;
-import com.android.ide.common.api.Rect;
-import com.android.ide.common.api.Segment;
-import com.android.ide.common.api.SegmentType;
-import com.android.ide.common.layout.BaseLayoutRule;
-
-import java.util.Collections;
-import java.util.Set;
-
-/**
- * A {@link ResizeHandler} is a {@link GuidelineHandler} which handles resizing of individual
- * edges in a RelativeLayout.
- */
-public class ResizeHandler extends GuidelineHandler {
-    private final SegmentType mHorizontalEdgeType;
-    private final SegmentType mVerticalEdgeType;
-
-    /**
-     * Creates a new {@link ResizeHandler}
-     *
-     * @param layout the layout containing the resized node
-     * @param resized the node being resized
-     * @param rulesEngine the applicable {@link IClientRulesEngine}
-     * @param horizontalEdgeType the type of horizontal edge being resized, or null
-     * @param verticalEdgeType the type of vertical edge being resized, or null
-     */
-    public ResizeHandler(INode layout, INode resized,
-            IClientRulesEngine rulesEngine,
-            SegmentType horizontalEdgeType, SegmentType verticalEdgeType) {
-        super(layout, rulesEngine);
-
-        assert horizontalEdgeType != null || verticalEdgeType != null;
-        assert horizontalEdgeType != BASELINE && verticalEdgeType != BASELINE;
-        assert horizontalEdgeType != CENTER_HORIZONTAL && verticalEdgeType != CENTER_HORIZONTAL;
-        assert horizontalEdgeType != CENTER_VERTICAL && verticalEdgeType != CENTER_VERTICAL;
-
-        mHorizontalEdgeType = horizontalEdgeType;
-        mVerticalEdgeType = verticalEdgeType;
-
-        Set<INode> nodes = Collections.singleton(resized);
-        mDraggedNodes = nodes;
-
-        mHorizontalDeps = mDependencyGraph.dependsOn(nodes, false /* vertical */);
-        mVerticalDeps = mDependencyGraph.dependsOn(nodes, true /* vertical */);
-
-        if (horizontalEdgeType != null) {
-            if (horizontalEdgeType == TOP) {
-                mMoveTop = true;
-            } else if (horizontalEdgeType == BOTTOM) {
-                mMoveBottom = true;
-            }
-        }
-        if (verticalEdgeType != null) {
-            if (verticalEdgeType == LEFT) {
-                mMoveLeft = true;
-            } else if (verticalEdgeType == RIGHT) {
-                mMoveRight = true;
-            }
-        }
-
-        for (INode child : layout.getChildren()) {
-            if (child != resized) {
-                String id = child.getStringAttr(ANDROID_URI, ATTR_ID);
-                addBounds(child, id,
-                        !mHorizontalDeps.contains(child),
-                        !mVerticalDeps.contains(child));
-            }
-        }
-
-        addBounds(layout, layout.getStringAttr(ANDROID_URI, ATTR_ID), true, true);
-    }
-
-    @Override
-    protected void snapVertical(Segment vEdge, int x, Rect newBounds) {
-        int maxDistance = BaseLayoutRule.getMaxMatchDistance();
-        if (vEdge.edgeType == LEFT) {
-            int margin = mSnap ? 0 : abs(newBounds.x - x);
-            if (margin > maxDistance) {
-                mLeftMargin = margin;
-            } else {
-                newBounds.w += newBounds.x - x;
-                newBounds.x = x;
-            }
-        } else if (vEdge.edgeType == RIGHT) {
-            int margin = mSnap ? 0 : abs(newBounds.x - (x - newBounds.w));
-            if (margin > maxDistance) {
-                mRightMargin = margin;
-            } else {
-                newBounds.w = x - newBounds.x;
-            }
-        } else {
-            assert false : vEdge;
-        }
-    }
-
-    @Override
-    protected void snapHorizontal(Segment hEdge, int y, Rect newBounds) {
-        int maxDistance = BaseLayoutRule.getMaxMatchDistance();
-        if (hEdge.edgeType == TOP) {
-            int margin = mSnap ? 0 : abs(newBounds.y - y);
-            if (margin > maxDistance) {
-                mTopMargin = margin;
-            } else {
-                newBounds.h += newBounds.y - y;
-                newBounds.y = y;
-            }
-        } else if (hEdge.edgeType == BOTTOM) {
-            int margin = mSnap ? 0 : abs(newBounds.y - (y - newBounds.h));
-            if (margin > maxDistance) {
-                mBottomMargin = margin;
-            } else {
-                newBounds.h = y - newBounds.y;
-            }
-        } else {
-            assert false : hEdge;
-        }
-    }
-
-    @Override
-    protected boolean isEdgeTypeCompatible(SegmentType edge, SegmentType dragged, int delta) {
-        boolean compatible = super.isEdgeTypeCompatible(edge, dragged, delta);
-
-        // When resizing and not snapping (e.g. using margins to pick a specific pixel
-        // width) we cannot use -negative- margins to jump back to a closer edge; we
-        // must always use positive margins, so mark closer edges that result in a negative
-        // margin as not compatible.
-        if (compatible && !mSnap) {
-            switch (dragged) {
-                case LEFT:
-                case TOP:
-                    return delta <= 0;
-                default:
-                    return delta >= 0;
-            }
-        }
-
-        return compatible;
-    }
-
-    /**
-     * Updates the handler for the given mouse resize
-     *
-     * @param feedback the feedback handler
-     * @param child the node being resized
-     * @param newBounds the new bounds of the resize rectangle
-     * @param modifierMask the keyboard modifiers pressed during the drag
-     */
-    public void updateResize(DropFeedback feedback, INode child, Rect newBounds,
-            int modifierMask) {
-        mSnap = (modifierMask & DropFeedback.MODIFIER2) == 0;
-        mBounds = newBounds;
-        clearSuggestions();
-
-        Rect b = newBounds;
-        Segment hEdge = null;
-        Segment vEdge = null;
-        String childId = child.getStringAttr(ANDROID_URI, ATTR_ID);
-
-        // TODO: MarginType=NO_MARGIN may not be right. Consider resizing a widget
-        //   that has margins and how that should be handled.
-
-        if (mHorizontalEdgeType == TOP) {
-            hEdge = new Segment(b.y, b.x, b.x2(), child, childId, mHorizontalEdgeType, NO_MARGIN);
-        } else if (mHorizontalEdgeType == BOTTOM) {
-            hEdge = new Segment(b.y2(), b.x, b.x2(), child, childId, mHorizontalEdgeType,
-                    NO_MARGIN);
-        } else {
-            assert mHorizontalEdgeType == null;
-        }
-
-        if (mVerticalEdgeType == LEFT) {
-            vEdge = new Segment(b.x, b.y, b.y2(), child, childId, mVerticalEdgeType, NO_MARGIN);
-        } else if (mVerticalEdgeType == RIGHT) {
-            vEdge = new Segment(b.x2(), b.y, b.y2(), child, childId, mVerticalEdgeType, NO_MARGIN);
-        } else {
-            assert mVerticalEdgeType == null;
-        }
-
-        mTopMargin = mBottomMargin = mLeftMargin = mRightMargin = 0;
-
-        if (hEdge != null && mHorizontalEdges.size() > 0) {
-            // Compute horizontal matches
-            mHorizontalSuggestions = findClosest(hEdge, mHorizontalEdges);
-
-            Match match = pickBestMatch(mHorizontalSuggestions);
-            if (match != null
-                    && (!mSnap || Math.abs(match.delta) < BaseLayoutRule.getMaxMatchDistance())) {
-                if (mHorizontalDeps.contains(match.edge.node)) {
-                    match.cycle = true;
-                }
-
-                snapHorizontal(hEdge, match.edge.at, newBounds);
-
-                if (hEdge.edgeType == TOP) {
-                    mCurrentTopMatch = match;
-                } else if (hEdge.edgeType == BOTTOM) {
-                    mCurrentBottomMatch = match;
-                } else {
-                    assert hEdge.edgeType == CENTER_HORIZONTAL
-                            || hEdge.edgeType == BASELINE : hEdge;
-                    mCurrentTopMatch = match;
-                }
-            }
-        }
-
-        if (vEdge != null && mVerticalEdges.size() > 0) {
-            mVerticalSuggestions = findClosest(vEdge, mVerticalEdges);
-
-            Match match = pickBestMatch(mVerticalSuggestions);
-            if (match != null
-                    && (!mSnap || Math.abs(match.delta) < BaseLayoutRule.getMaxMatchDistance())) {
-                if (mVerticalDeps.contains(match.edge.node)) {
-                    match.cycle = true;
-                }
-
-                // Snap
-                snapVertical(vEdge, match.edge.at, newBounds);
-
-                if (vEdge.edgeType == LEFT) {
-                    mCurrentLeftMatch = match;
-                } else if (vEdge.edgeType == RIGHT) {
-                    mCurrentRightMatch = match;
-                } else {
-                    assert vEdge.edgeType == CENTER_VERTICAL;
-                    mCurrentLeftMatch = match;
-                }
-            }
-        }
-
-        checkCycles(feedback);
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/removecol.png b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/removecol.png
deleted file mode 100644
index c41261a..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/removecol.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/removerow.png b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/removerow.png
deleted file mode 100644
index db695a7..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/removerow.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/showgrid.png b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/showgrid.png
deleted file mode 100644
index 6f7bf91..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/showgrid.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/snap.png b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/snap.png
deleted file mode 100644
index b50a16e..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/snap.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/structure.png b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/structure.png
deleted file mode 100644
index e5d7538..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/structure.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/vlinear.png b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/vlinear.png
deleted file mode 100644
index e03c16e..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/vlinear.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/weights.png b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/weights.png
deleted file mode 100644
index cb654a1..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/weights.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/resources/platform/AttributeInfo.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/resources/platform/AttributeInfo.java
deleted file mode 100755
index e246975b..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/resources/platform/AttributeInfo.java
+++ /dev/null
@@ -1,355 +0,0 @@
-/*
- * 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.common.resources.platform;
-
-import static com.android.SdkConstants.ANDROID_PREFIX;
-import static com.android.SdkConstants.ANDROID_THEME_PREFIX;
-import static com.android.SdkConstants.ID_PREFIX;
-import static com.android.SdkConstants.NEW_ID_PREFIX;
-import static com.android.SdkConstants.PREFIX_THEME_REF;
-import static com.android.SdkConstants.VALUE_FALSE;
-import static com.android.SdkConstants.VALUE_TRUE;
-import static com.android.ide.common.api.IAttributeInfo.Format.BOOLEAN;
-import static com.android.ide.common.api.IAttributeInfo.Format.COLOR;
-import static com.android.ide.common.api.IAttributeInfo.Format.DIMENSION;
-import static com.android.ide.common.api.IAttributeInfo.Format.ENUM;
-import static com.android.ide.common.api.IAttributeInfo.Format.FLAG;
-import static com.android.ide.common.api.IAttributeInfo.Format.FLOAT;
-import static com.android.ide.common.api.IAttributeInfo.Format.FRACTION;
-import static com.android.ide.common.api.IAttributeInfo.Format.INTEGER;
-import static com.android.ide.common.api.IAttributeInfo.Format.STRING;
-
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-import com.android.ide.common.api.IAttributeInfo;
-import com.android.ide.common.resources.ResourceRepository;
-import com.android.resources.ResourceType;
-import com.google.common.base.Splitter;
-
-import java.util.EnumSet;
-import java.util.regex.Pattern;
-
-
-/**
- * Information about an attribute as gathered from the attrs.xml file where
- * the attribute was declared. This must include a format (string, reference, float, etc.),
- * possible flag or enum values, whether it's deprecated and its javadoc.
- */
-public class AttributeInfo implements IAttributeInfo {
-    /** XML Name of the attribute */
-    private String mName;
-
-    /** Formats of the attribute. Cannot be null. Should have at least one format. */
-    private EnumSet<Format> mFormats;
-    /** Values for enum. null for other types. */
-    private String[] mEnumValues;
-    /** Values for flag. null for other types. */
-    private String[] mFlagValues;
-    /** Short javadoc (i.e. the first sentence). */
-    private String mJavaDoc;
-    /** Documentation for deprecated attributes. Null if not deprecated. */
-    private String mDeprecatedDoc;
-    /** The source class defining this attribute */
-    private String mDefinedBy;
-
-    /**
-     * @param name The XML Name of the attribute
-     * @param formats The formats of the attribute. Cannot be null.
-     *                Should have at least one format.
-     */
-    public AttributeInfo(@NonNull String name, @NonNull EnumSet<Format> formats) {
-        mName = name;
-        mFormats = formats;
-    }
-
-    /**
-     * @param name The XML Name of the attribute
-     * @param formats The formats of the attribute. Cannot be null.
-     *                Should have at least one format.
-     * @param javadoc Short javadoc (i.e. the first sentence).
-     */
-    public AttributeInfo(@NonNull String name, @NonNull EnumSet<Format> formats, String javadoc) {
-        mName = name;
-        mFormats = formats;
-        mJavaDoc = javadoc;
-    }
-
-    public AttributeInfo(AttributeInfo info) {
-        mName = info.mName;
-        mFormats = info.mFormats;
-        mEnumValues = info.mEnumValues;
-        mFlagValues = info.mFlagValues;
-        mJavaDoc = info.mJavaDoc;
-        mDeprecatedDoc = info.mDeprecatedDoc;
-    }
-
-    /**
-     * Sets the XML Name of the attribute
-     *
-     * @param name the new name to assign
-     */
-    public void setName(String name) {
-        mName = name;
-    }
-
-    /** Returns the XML Name of the attribute */
-    @Override
-    public @NonNull String getName() {
-        return mName;
-    }
-    /** Returns the formats of the attribute. Cannot be null.
-     *  Should have at least one format. */
-    @Override
-    public @NonNull EnumSet<Format> getFormats() {
-        return mFormats;
-    }
-    /** Returns the values for enums. null for other types. */
-    @Override
-    public String[] getEnumValues() {
-        return mEnumValues;
-    }
-    /** Returns the values for flags. null for other types. */
-    @Override
-    public String[] getFlagValues() {
-        return mFlagValues;
-    }
-    /** Returns a short javadoc, .i.e. the first sentence. */
-    @Override
-    public @NonNull String getJavaDoc() {
-        return mJavaDoc;
-    }
-    /** Returns the documentation for deprecated attributes. Null if not deprecated. */
-    @Override
-    public String getDeprecatedDoc() {
-        return mDeprecatedDoc;
-    }
-
-    /** Sets the values for enums. null for other types. */
-    public AttributeInfo setEnumValues(String[] values) {
-        mEnumValues = values;
-        return this;
-    }
-
-    /** Sets the values for flags. null for other types. */
-    public AttributeInfo setFlagValues(String[] values) {
-        mFlagValues = values;
-        return this;
-    }
-
-    /** Sets a short javadoc, .i.e. the first sentence. */
-    public void setJavaDoc(String javaDoc) {
-        mJavaDoc = javaDoc;
-    }
-
-    /** Sets the documentation for deprecated attributes. Null if not deprecated. */
-    public void setDeprecatedDoc(String deprecatedDoc) {
-        mDeprecatedDoc = deprecatedDoc;
-    }
-
-    /**
-     * Sets the name of the class (fully qualified class name) which defined
-     * this attribute
-     *
-     * @param definedBy the name of the class (fully qualified class name) which
-     *            defined this attribute
-     */
-    public void setDefinedBy(String definedBy) {
-        mDefinedBy = definedBy;
-    }
-
-    /**
-     * Returns the name of the class (fully qualified class name) which defined
-     * this attribute
-     *
-     * @return the name of the class (fully qualified class name) which defined
-     *         this attribute
-     */
-    @Override
-    public @NonNull String getDefinedBy() {
-        return mDefinedBy;
-    }
-
-    private final static Pattern INTEGER_PATTERN = Pattern.compile("-?[0-9]+"); //$NON-NLS-1$
-    private final static Pattern FLOAT_PATTERN =
-            Pattern.compile("-?[0-9]?(\\.[0-9]+)?"); //$NON-NLS-1$
-    private final static Pattern DIMENSION_PATTERN =
-            Pattern.compile("-?[0-9]+(\\.[0-9]+)?(dp|dip|sp|px|pt|in|mm)"); //$NON-NLS-1$
-
-    /**
-     * Checks the given value and returns true only if it is a valid XML value
-     * for this attribute.
-     *
-     * @param value the XML value to check
-     * @param projectResources project resources to validate resource URLs with,
-     *            if any
-     * @param frameworkResources framework resources to validate resource URLs
-     *            with, if any
-     * @return true if the value is valid, false otherwise
-     */
-    public boolean isValid(
-            @NonNull String value,
-            @Nullable ResourceRepository projectResources,
-            @Nullable ResourceRepository frameworkResources) {
-
-        if (mFormats.contains(STRING) || mFormats.isEmpty()) {
-            // Anything is allowed
-            return true;
-        }
-
-        // All other formats require a nonempty string
-        if (value.isEmpty()) {
-            // Except for flags
-            if (mFormats.contains(FLAG)) {
-                return true;
-            }
-
-            return false;
-        }
-        char first = value.charAt(0);
-
-        // There are many attributes which are incorrectly marked in the attrs.xml
-        // file, such as "duration", "minHeight", etc. These are marked as only
-        // accepting "integer", but also appear to accept "reference". Therefore,
-        // in these cases, be more lenient. (This happens for theme references too,
-        // such as ?android:attr/listPreferredItemHeight)
-        if ((first == '@' || first == '?') /* && mFormats.contains(REFERENCE)*/) {
-            if (value.equals("@null")) {
-                return true;
-            }
-
-            if (value.startsWith(NEW_ID_PREFIX) || value.startsWith(ID_PREFIX)) {
-                // These are handled in the IdGeneratingResourceFile; we shouldn't
-                // complain about not finding ids in the repository yet since they may
-                // not yet have been defined (@+id's can be defined in the same layout,
-                // later on.)
-                return true;
-            }
-
-            if (value.startsWith(ANDROID_PREFIX) || value.startsWith(ANDROID_THEME_PREFIX)) {
-                if (frameworkResources != null) {
-                    return frameworkResources.hasResourceItem(value);
-                }
-            } else if (projectResources != null) {
-                return projectResources.hasResourceItem(value);
-            }
-
-            // Validate resource string
-            String url = value;
-            int typeEnd = url.indexOf('/', 1);
-            if (typeEnd != -1) {
-                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) {
-                    // TODO: Validate that the name portion conforms to the rules
-                    // (is an identifier but not a keyword, etc.)
-                    // Also validate that the prefix before the colon is either
-                    // not there or is "android"
-
-                    //int nameBegin = typeEnd + 1;
-                    //String name = url.substring(nameBegin);
-                    return true;
-                }
-            } else if (value.startsWith(PREFIX_THEME_REF)) {
-                if (projectResources != null) {
-                    return projectResources.hasResourceItem(ResourceType.ATTR,
-                            value.substring(PREFIX_THEME_REF.length()));
-                } else {
-                    // Until proven otherwise
-                    return true;
-                }
-            }
-        }
-
-        if (mFormats.contains(ENUM) && mEnumValues != null) {
-            for (String e : mEnumValues) {
-                if (value.equals(e)) {
-                    return true;
-                }
-            }
-        }
-
-        if (mFormats.contains(FLAG) && mFlagValues != null) {
-            for (String v : Splitter.on('|').split(value)) {
-                for (String e : mFlagValues) {
-                    if (v.equals(e)) {
-                        return true;
-                    }
-                }
-            }
-        }
-
-        if (mFormats.contains(DIMENSION)) {
-            if (DIMENSION_PATTERN.matcher(value).matches()) {
-                return true;
-            }
-        }
-
-        if (mFormats.contains(BOOLEAN)) {
-            if (value.equalsIgnoreCase(VALUE_TRUE) || value.equalsIgnoreCase(VALUE_FALSE)) {
-                return true;
-            }
-        }
-
-        if (mFormats.contains(FLOAT)) {
-            if (Character.isDigit(first) || first == '-' || first == '.') {
-                if (FLOAT_PATTERN.matcher(value).matches()) {
-                    return true;
-                }
-                // AAPT accepts more general floats, such as ".1",
-                try {
-                    Float.parseFloat(value);
-                    return true;
-                } catch (NumberFormatException nufe) {
-                    // Not a float
-                }
-            }
-        }
-
-        if (mFormats.contains(INTEGER)) {
-            if (Character.isDigit(first) || first == '-') {
-                if (INTEGER_PATTERN.matcher(value).matches()) {
-                    return true;
-                }
-            }
-        }
-
-        if (mFormats.contains(COLOR)) {
-            if (first == '#' && value.length() <= 9) { // Only allowed 32 bit ARGB
-                try {
-                    // Use Long.parseLong rather than Integer.parseInt to not overflow on
-                    // 32 big hex values like "ff191919"
-                    Long.parseLong(value.substring(1), 16);
-                    return true;
-                } catch (NumberFormatException nufe) {
-                    // Not a valid color number
-                }
-            }
-        }
-
-        if (mFormats.contains(FRACTION)) {
-            // should end with % or %p
-            return true;
-        }
-
-        return false;
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/resources/platform/AttrsXmlParser.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/resources/platform/AttrsXmlParser.java
deleted file mode 100644
index 1330c50..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/resources/platform/AttrsXmlParser.java
+++ /dev/null
@@ -1,698 +0,0 @@
-/*
- * 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.common.resources.platform;
-
-import static com.android.SdkConstants.DOT_LAYOUT_PARAMS;
-import static com.android.ide.eclipse.adt.AdtConstants.DOC_HIDE;
-
-import com.android.ide.common.api.IAttributeInfo.Format;
-import com.android.ide.common.resources.platform.ViewClassInfo.LayoutParamsInfo;
-import com.android.ide.eclipse.adt.AdtUtils;
-import com.android.utils.ILogger;
-import com.google.common.collect.Maps;
-
-import org.w3c.dom.Document;
-import org.w3c.dom.Node;
-import org.xml.sax.SAXException;
-
-import java.io.File;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.EnumSet;
-import java.util.HashMap;
-import java.util.Locale;
-import java.util.Map;
-import java.util.Map.Entry;
-
-import javax.xml.parsers.DocumentBuilder;
-import javax.xml.parsers.DocumentBuilderFactory;
-import javax.xml.parsers.ParserConfigurationException;
-
-/**
- * Parser for attributes description files.
- */
-public final class AttrsXmlParser {
-
-    public static final String ANDROID_MANIFEST_STYLEABLE = "AndroidManifest";  //$NON-NLS-1$
-
-    private Document mDocument;
-    private String mOsAttrsXmlPath;
-
-    // all attributes that have the same name are supposed to have the same
-    // parameters so we'll keep a cache of them to avoid processing them twice.
-    private Map<String, AttributeInfo> mAttributeMap;
-
-    /** Map of all attribute names for a given element */
-    private final Map<String, DeclareStyleableInfo> mStyleMap =
-        new HashMap<String, DeclareStyleableInfo>();
-
-    /** Map from format name (lower case) to the uppercase version */
-    private Map<String, Format> mFormatNames = new HashMap<String, Format>(10);
-
-    /**
-     * Map of all (constant, value) pairs for attributes of format enum or flag.
-     * E.g. for attribute name=gravity, this tells us there's an enum/flag called "center"
-     * with value 0x11.
-     */
-    private Map<String, Map<String, Integer>> mEnumFlagValues;
-
-    /**
-     * A logger object. Must not be null.
-     */
-    private final ILogger mLog;
-
-    /**
-     * Creates a new {@link AttrsXmlParser}, set to load things from the given
-     * XML file. Nothing has been parsed yet. Callers should call {@link #preload()}
-     * next.
-     *
-     * @param osAttrsXmlPath The path of the <code>attrs.xml</code> file to parse.
-     *              Must not be null. Should point to an existing valid XML document.
-     * @param log A logger object. Must not be null.
-     * @param expectedAttributeCount expected number of attributes in the file
-     */
-    public AttrsXmlParser(String osAttrsXmlPath, ILogger log, int expectedAttributeCount) {
-        this(osAttrsXmlPath, null /* inheritableAttributes */, log, expectedAttributeCount);
-    }
-
-    /**
-     * Returns the parsed map of attribute infos
-     *
-     * @return a map from string name to {@link AttributeInfo}
-     */
-    public Map<String, AttributeInfo> getAttributeMap() {
-        return mAttributeMap;
-    }
-
-    /**
-     * Creates a new {@link AttrsXmlParser} set to load things from the given
-     * XML file.
-     * <p/>
-     * If inheritableAttributes is non-null, it must point to a preloaded
-     * {@link AttrsXmlParser} which attributes will be used for this one. Since
-     * already defined attributes are not modifiable, they are thus "inherited".
-     *
-     * @param osAttrsXmlPath The path of the <code>attrs.xml</code> file to parse.
-     *              Must not be null. Should point to an existing valid XML document.
-     * @param inheritableAttributes An optional parser with attributes to inherit. Can be null.
-     *              If not null, the parser must have had its {@link #preload()} method
-     *              invoked prior to being used here.
-     * @param log A logger object. Must not be null.
-     * @param expectedAttributeCount expected number of attributes in the file
-     */
-    public AttrsXmlParser(
-            String osAttrsXmlPath,
-            AttrsXmlParser inheritableAttributes,
-            ILogger log,
-            int expectedAttributeCount) {
-        mOsAttrsXmlPath = osAttrsXmlPath;
-        mLog = log;
-
-        assert osAttrsXmlPath != null;
-        assert log != null;
-
-        mAttributeMap = Maps.newHashMapWithExpectedSize(expectedAttributeCount);
-        if (inheritableAttributes == null) {
-            mEnumFlagValues = new HashMap<String, Map<String,Integer>>();
-        } else {
-            mAttributeMap.putAll(inheritableAttributes.mAttributeMap);
-            mEnumFlagValues = new HashMap<String, Map<String,Integer>>(
-                                                         inheritableAttributes.mEnumFlagValues);
-        }
-
-        // Pre-compute the set of format names such that we don't have to compute the uppercase
-        // version of the same format string names again and again
-        for (Format f : Format.values()) {
-            mFormatNames.put(f.name().toLowerCase(Locale.US), f);
-        }
-    }
-
-    /**
-     * Returns the OS path of the attrs.xml file parsed.
-     */
-    public String getOsAttrsXmlPath() {
-        return mOsAttrsXmlPath;
-    }
-
-    /**
-     * Preloads the document, parsing all attributes and declared styles.
-     *
-     * @return Self, for command chaining.
-     */
-    public AttrsXmlParser preload() {
-        Document doc = getDocument();
-
-        if (doc == null) {
-            mLog.warning("Failed to find %1$s", //$NON-NLS-1$
-                    mOsAttrsXmlPath);
-            return this;
-        }
-
-        Node res = doc.getFirstChild();
-        while (res != null &&
-                res.getNodeType() != Node.ELEMENT_NODE &&
-                !res.getNodeName().equals("resources")) { //$NON-NLS-1$
-            res = res.getNextSibling();
-        }
-
-        if (res == null) {
-            mLog.warning("Failed to find a <resources> node in %1$s", //$NON-NLS-1$
-                    mOsAttrsXmlPath);
-            return this;
-        }
-
-        parseResources(res);
-        return this;
-    }
-
-    /**
-     * Loads all attributes & javadoc for the view class info based on the class name.
-     */
-    public void loadViewAttributes(ViewClassInfo info) {
-        if (getDocument() != null) {
-            String xmlName = info.getShortClassName();
-            DeclareStyleableInfo style = mStyleMap.get(xmlName);
-            if (style != null) {
-                String definedBy = info.getFullClassName();
-                AttributeInfo[] attributes = style.getAttributes();
-                for (AttributeInfo attribute : attributes) {
-                    if (attribute.getDefinedBy() == null) {
-                        attribute.setDefinedBy(definedBy);
-                    }
-                }
-                info.setAttributes(attributes);
-                info.setJavaDoc(style.getJavaDoc());
-            }
-        }
-    }
-
-    /**
-     * Loads all attributes for the layout data info based on the class name.
-     */
-    public void loadLayoutParamsAttributes(LayoutParamsInfo info) {
-        if (getDocument() != null) {
-            // Transforms "LinearLayout" and "LayoutParams" into "LinearLayout_Layout".
-            ViewClassInfo viewLayoutClass = info.getViewLayoutClass();
-            String xmlName = String.format("%1$s_%2$s", //$NON-NLS-1$
-                    viewLayoutClass.getShortClassName(),
-                    info.getShortClassName());
-            xmlName = AdtUtils.stripSuffix(xmlName, "Params"); //$NON-NLS-1$
-
-            DeclareStyleableInfo style = mStyleMap.get(xmlName);
-            if (style != null) {
-                // For defined by, use the actual class name, e.g.
-                //   android.widget.LinearLayout.LayoutParams
-                String definedBy = viewLayoutClass.getFullClassName() + DOT_LAYOUT_PARAMS;
-                AttributeInfo[] attributes = style.getAttributes();
-                for (AttributeInfo attribute : attributes) {
-                    if (attribute.getDefinedBy() == null) {
-                        attribute.setDefinedBy(definedBy);
-                    }
-                }
-                info.setAttributes(attributes);
-            }
-        }
-    }
-
-    /**
-     * Returns a list of all <code>declare-styleable</code> found in the XML file.
-     */
-    public Map<String, DeclareStyleableInfo> getDeclareStyleableList() {
-        return Collections.unmodifiableMap(mStyleMap);
-    }
-
-    /**
-     * Returns a map of all enum and flag constants sorted by parent attribute name.
-     * The map is attribute_name => (constant_name => integer_value).
-     */
-    public Map<String, Map<String, Integer>> getEnumFlagValues() {
-        return mEnumFlagValues;
-    }
-
-    //-------------------------
-
-    /**
-     * Creates an XML document from the attrs.xml OS path.
-     * May return null if the file doesn't exist or cannot be parsed.
-     */
-    private Document getDocument() {
-        if (mDocument == null) {
-            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
-            factory.setIgnoringComments(false);
-            try {
-                DocumentBuilder builder = factory.newDocumentBuilder();
-                mDocument = builder.parse(new File(mOsAttrsXmlPath));
-            } catch (ParserConfigurationException e) {
-                mLog.error(e, "Failed to create XML document builder for %1$s", //$NON-NLS-1$
-                        mOsAttrsXmlPath);
-            } catch (SAXException e) {
-                mLog.error(e, "Failed to parse XML document %1$s", //$NON-NLS-1$
-                        mOsAttrsXmlPath);
-            } catch (IOException e) {
-                mLog.error(e, "Failed to read XML document %1$s", //$NON-NLS-1$
-                        mOsAttrsXmlPath);
-            }
-        }
-        return mDocument;
-    }
-
-    /**
-     * Finds all the &lt;declare-styleable&gt; and &lt;attr&gt; nodes
-     * in the top &lt;resources&gt; node.
-     */
-    private void parseResources(Node res) {
-
-        Map<String, String> unknownParents = new HashMap<String, String>();
-
-        Node lastComment = null;
-        for (Node node = res.getFirstChild(); node != null; node = node.getNextSibling()) {
-            switch (node.getNodeType()) {
-            case Node.COMMENT_NODE:
-                lastComment = node;
-                break;
-            case Node.ELEMENT_NODE:
-                if (node.getNodeName().equals("declare-styleable")) {          //$NON-NLS-1$
-                    Node nameNode = node.getAttributes().getNamedItem("name"); //$NON-NLS-1$
-                    if (nameNode != null) {
-                        String name = nameNode.getNodeValue();
-
-                        Node parentNode = node.getAttributes().getNamedItem("parent"); //$NON-NLS-1$
-                        String parents = parentNode == null ? null : parentNode.getNodeValue();
-
-                        if (name != null && !mStyleMap.containsKey(name)) {
-                            DeclareStyleableInfo style = parseDeclaredStyleable(name, node);
-                            if (parents != null) {
-                                String[] parentsArray =
-                                    parseStyleableParents(parents, mStyleMap, unknownParents);
-                                style.setParents(parentsArray);
-                            }
-                            mStyleMap.put(name, style);
-                            unknownParents.remove(name);
-                            if (lastComment != null) {
-                                String nodeValue = lastComment.getNodeValue();
-                                if (nodeValue.contains(DOC_HIDE)) {
-                                    mStyleMap.remove(name);
-                                } else {
-                                    style.setJavaDoc(parseJavadoc(nodeValue));
-                                }
-                            }
-                        }
-                    }
-                } else if (node.getNodeName().equals("attr")) {                //$NON-NLS-1$
-                    parseAttr(node, lastComment);
-                }
-                lastComment = null;
-                break;
-            }
-        }
-
-        // If we have any unknown parent, re-create synthetic styleable for them.
-        for (Entry<String, String> entry : unknownParents.entrySet()) {
-            String name = entry.getKey();
-            String parent = entry.getValue();
-
-            DeclareStyleableInfo style = new DeclareStyleableInfo(name, (AttributeInfo[])null);
-            if (parent != null) {
-                style.setParents(new String[] { parent });
-            }
-            mStyleMap.put(name, style);
-
-            // Simplify parents names. See SDK Bug 3125910.
-            // Implementation detail: that since we want to delete and add to the map,
-            // we can't just use an iterator.
-            for (String key : new ArrayList<String>(mStyleMap.keySet())) {
-                if (key.startsWith(name) && !key.equals(name)) {
-                    // We found a child which name starts with the full name of the
-                    // parent. Simplify the children name.
-                    String newName = ANDROID_MANIFEST_STYLEABLE + key.substring(name.length());
-
-                    DeclareStyleableInfo newStyle =
-                        new DeclareStyleableInfo(newName, mStyleMap.get(key));
-                    mStyleMap.remove(key);
-                    mStyleMap.put(newName, newStyle);
-                }
-            }
-        }
-    }
-
-    /**
-     * Parses the "parents" attribute from a &lt;declare-styleable&gt;.
-     * <p/>
-     * The syntax is the following:
-     * <pre>
-     *   parent[.parent]* [[space|,] parent[.parent]* ]
-     * </pre>
-     * <p/>
-     * In English: </br>
-     * - There can be one or more parents, separated by whitespace or commas. </br>
-     * - Whitespace is ignored and trimmed. </br>
-     * - A parent name is actually composed of one or more identifiers joined by a dot.
-     * <p/>
-     * Styleables do not usually need to declare their parent chain (e.g. the grand-parents
-     * of a parent.) Parent names are unique, so in most cases a styleable will only declare
-     * its immediate parent.
-     * <p/>
-     * However it is possible for a styleable's parent to not exist, e.g. if you have a
-     * styleable "A" that is the root and then styleable "C" declares its parent to be "A.B".
-     * In this case we record "B" as the parent, even though it is unknown and will never be
-     * known. Any parent that is currently not in the knownParent map is thus added to the
-     * unknownParent set. The caller will remove the name from the unknownParent set when it
-     * sees a declaration for it.
-     *
-     * @param parents The parents string to parse. Must not be null or empty.
-     * @param knownParents The map of all declared styles known so far.
-     * @param unknownParents A map of all unknown parents collected here.
-     * @return The array of terminal parent names parsed from the parents string.
-     */
-    private String[] parseStyleableParents(String parents,
-            Map<String, DeclareStyleableInfo> knownParents,
-            Map<String, String> unknownParents) {
-
-        ArrayList<String> result = new ArrayList<String>();
-
-        for (String parent : parents.split("[ \t\n\r\f,|]")) {          //$NON-NLS-1$
-            parent = parent.trim();
-            if (parent.length() == 0) {
-                continue;
-            }
-            if (parent.indexOf('.') >= 0) {
-                // This is a grand-parent/parent chain. Make sure we know about the
-                // parents and only record the terminal one.
-                String last = null;
-                for (String name : parent.split("\\.")) {          //$NON-NLS-1$
-                    if (name.length() > 0) {
-                        if (!knownParents.containsKey(name)) {
-                            // Record this unknown parent and its grand parent.
-                            unknownParents.put(name, last);
-                        }
-                        last = name;
-                    }
-                }
-                parent = last;
-            }
-
-            result.add(parent);
-        }
-
-        return result.toArray(new String[result.size()]);
-    }
-
-    /**
-     * Parses an &lt;attr&gt; node and convert it into an {@link AttributeInfo} if it is valid.
-     */
-    private AttributeInfo parseAttr(Node attrNode, Node lastComment) {
-        AttributeInfo info = null;
-        Node nameNode = attrNode.getAttributes().getNamedItem("name"); //$NON-NLS-1$
-        if (nameNode != null) {
-            String name = nameNode.getNodeValue();
-            if (name != null) {
-                info = mAttributeMap.get(name);
-                // If the attribute is unknown yet, parse it.
-                // If the attribute is know but its format is unknown, parse it too.
-                if (info == null || info.getFormats().size() == 0) {
-                    info = parseAttributeTypes(attrNode, name);
-                    if (info != null) {
-                        mAttributeMap.put(name, info);
-                    }
-                } else if (lastComment != null) {
-                    info = new AttributeInfo(info);
-                }
-                if (info != null) {
-                    if (lastComment != null) {
-                        String nodeValue = lastComment.getNodeValue();
-                        if (nodeValue.contains(DOC_HIDE)) {
-                            return null;
-                        }
-                        info.setJavaDoc(parseJavadoc(nodeValue));
-                        info.setDeprecatedDoc(parseDeprecatedDoc(nodeValue));
-                    }
-                }
-            }
-        }
-        return info;
-    }
-
-    /**
-     * Finds all the attributes for a particular style node,
-     * e.g. a declare-styleable of name "TextView" or "LinearLayout_Layout".
-     *
-     * @param styleName The name of the declare-styleable node
-     * @param declareStyleableNode The declare-styleable node itself
-     */
-    private DeclareStyleableInfo parseDeclaredStyleable(String styleName,
-            Node declareStyleableNode) {
-        ArrayList<AttributeInfo> attrs = new ArrayList<AttributeInfo>();
-        Node lastComment = null;
-        for (Node node = declareStyleableNode.getFirstChild();
-             node != null;
-             node = node.getNextSibling()) {
-
-            switch (node.getNodeType()) {
-            case Node.COMMENT_NODE:
-                lastComment = node;
-                break;
-            case Node.ELEMENT_NODE:
-                if (node.getNodeName().equals("attr")) {                       //$NON-NLS-1$
-                    AttributeInfo info = parseAttr(node, lastComment);
-                    if (info != null) {
-                        attrs.add(info);
-                    }
-                }
-                lastComment = null;
-                break;
-            }
-
-        }
-
-        return new DeclareStyleableInfo(styleName, attrs.toArray(new AttributeInfo[attrs.size()]));
-    }
-
-    /**
-     * Returns the {@link AttributeInfo} for a specific <attr> XML node.
-     * This gets the javadoc, the type, the name and the enum/flag values if any.
-     * <p/>
-     * The XML node is expected to have the following attributes:
-     * <ul>
-     * <li>"name", which is mandatory. The node is skipped if this is missing.</li>
-     * <li>"format".</li>
-     * </ul>
-     * The format may be one type or two types (e.g. "reference|color").
-     * An extra format can be implied: "enum" or "flag" are not specified in the "format" attribute,
-     * they are implicitly stated by the presence of sub-nodes <enum> or <flag>.
-     * <p/>
-     * By design, attr nodes of the same name MUST have the same type.
-     * Attribute nodes are thus cached by name and reused as much as possible.
-     * When reusing a node, it is duplicated and its javadoc reassigned.
-     */
-    private AttributeInfo parseAttributeTypes(Node attrNode, String name) {
-        EnumSet<Format> formats = null;
-        String[] enumValues = null;
-        String[] flagValues = null;
-
-        Node attrFormat = attrNode.getAttributes().getNamedItem("format"); //$NON-NLS-1$
-        if (attrFormat != null) {
-            for (String f : attrFormat.getNodeValue().split("\\|")) { //$NON-NLS-1$
-                Format format = mFormatNames.get(f);
-                if (format == null) {
-                    mLog.info(
-                        "Unknown format name '%s' in <attr name=\"%s\">, file '%s'.", //$NON-NLS-1$
-                        f, name, getOsAttrsXmlPath());
-                } else if (format != AttributeInfo.Format.ENUM &&
-                        format != AttributeInfo.Format.FLAG) {
-                    if (formats == null) {
-                        formats = format.asSet();
-                    } else {
-                        if (formats.size() == 1) {
-                            formats = EnumSet.copyOf(formats);
-                        }
-                        formats.add(format);
-                    }
-                }
-            }
-        }
-
-        // does this <attr> have <enum> children?
-        enumValues = parseEnumFlagValues(attrNode, "enum", name); //$NON-NLS-1$
-        if (enumValues != null) {
-            if (formats == null) {
-                formats = Format.ENUM_SET;
-            } else {
-                if (formats.size() == 1) {
-                    formats = EnumSet.copyOf(formats);
-                }
-                formats.add(Format.ENUM);
-            }
-        }
-
-        // does this <attr> have <flag> children?
-        flagValues = parseEnumFlagValues(attrNode, "flag", name); //$NON-NLS-1$
-        if (flagValues != null) {
-            if (formats == null) {
-                formats = Format.FLAG_SET;
-            } else {
-                if (formats.size() == 1) {
-                    formats = EnumSet.copyOf(formats);
-                }
-                formats.add(Format.FLAG);
-            }
-        }
-
-        if (formats == null) {
-            formats = Format.NONE;
-        }
-
-        AttributeInfo info = new AttributeInfo(name, formats);
-        info.setEnumValues(enumValues);
-        info.setFlagValues(flagValues);
-        return info;
-    }
-
-    /**
-     * Given an XML node that represents an <attr> node, this method searches
-     * if the node has any children nodes named "target" (e.g. "enum" or "flag").
-     * Such nodes must have a "name" attribute.
-     * <p/>
-     * If "attrNode" is null, look for any <attr> that has the given attrNode
-     * and the requested children nodes.
-     * <p/>
-     * This method collects all the possible names of these children nodes and
-     * return them.
-     *
-     * @param attrNode The <attr> XML node
-     * @param filter The child node to look for, either "enum" or "flag".
-     * @param attrName The value of the name attribute of <attr>
-     *
-     * @return Null if there are no such children nodes, otherwise an array of length >= 1
-     *         of all the names of these children nodes.
-     */
-    private String[] parseEnumFlagValues(Node attrNode, String filter, String attrName) {
-        ArrayList<String> names = null;
-        for (Node child = attrNode.getFirstChild(); child != null; child = child.getNextSibling()) {
-            if (child.getNodeType() == Node.ELEMENT_NODE && child.getNodeName().equals(filter)) {
-                Node nameNode = child.getAttributes().getNamedItem("name");  //$NON-NLS-1$
-                if (nameNode == null) {
-                    mLog.warning(
-                            "Missing name attribute in <attr name=\"%s\"><%s></attr>", //$NON-NLS-1$
-                            attrName, filter);
-                } else {
-                    if (names == null) {
-                        names = new ArrayList<String>();
-                    }
-                    String name = nameNode.getNodeValue();
-                    names.add(name);
-
-                    Node valueNode = child.getAttributes().getNamedItem("value");  //$NON-NLS-1$
-                    if (valueNode == null) {
-                        mLog.warning(
-                            "Missing value attribute in <attr name=\"%s\"><%s name=\"%s\"></attr>", //$NON-NLS-1$
-                            attrName, filter, name);
-                    } else {
-                        String value = valueNode.getNodeValue();
-                        try {
-                            // Integer.decode cannot handle "ffffffff", see JDK issue 6624867
-                            int i = (int) (long) Long.decode(value);
-
-                            Map<String, Integer> map = mEnumFlagValues.get(attrName);
-                            if (map == null) {
-                                map = new HashMap<String, Integer>();
-                                mEnumFlagValues.put(attrName, map);
-                            }
-                            map.put(name, Integer.valueOf(i));
-
-                        } catch(NumberFormatException e) {
-                            mLog.error(e,
-                                    "Value in <attr name=\"%s\"><%s name=\"%s\" value=\"%s\"></attr> is not a valid decimal or hexadecimal", //$NON-NLS-1$
-                                    attrName, filter, name, value);
-                        }
-                    }
-                }
-            }
-        }
-        return names == null ? null : names.toArray(new String[names.size()]);
-    }
-
-    /**
-     * Parses the javadoc comment.
-     * Only keeps the first sentence.
-     * <p/>
-     * This does not remove nor simplify links and references.
-     */
-    private String parseJavadoc(String comment) {
-        if (comment == null) {
-            return null;
-        }
-
-        // sanitize & collapse whitespace
-        comment = comment.replaceAll("\\s+", " "); //$NON-NLS-1$ //$NON-NLS-2$
-
-        // Explicitly remove any @deprecated tags since they are handled separately.
-        comment = comment.replaceAll("(?:\\{@deprecated[^}]*\\}|@deprecated[^@}]*)", "");
-
-        // take everything up to the first dot that is followed by a space or the end of the line.
-        // I love regexps :-). For the curious, the regexp is:
-        // - start of line
-        // - ignore whitespace
-        // - group:
-        //   - everything, not greedy
-        //   - non-capturing group (?: )
-        //      - end of string
-        //      or
-        //      - not preceded by a letter, a dot and another letter (for "i.e" and "e.g" )
-        //                            (<! non-capturing zero-width negative look-behind)
-        //      - a dot
-        //      - followed by a space (?= non-capturing zero-width positive look-ahead)
-        // - anything else is ignored
-        comment = comment.replaceFirst("^\\s*(.*?(?:$|(?<![a-zA-Z]\\.[a-zA-Z])\\.(?=\\s))).*", "$1"); //$NON-NLS-1$ //$NON-NLS-2$
-
-        return comment;
-    }
-
-
-    /**
-     * Parses the javadoc and extract the first @deprecated tag, if any.
-     * Returns null if there's no @deprecated tag.
-     * The deprecated tag can be of two forms:
-     * - {+@deprecated ...text till the next bracket }
-     *   Note: there should be no space or + between { and @. I need one in this comment otherwise
-     *   this method will be tagged as deprecated ;-)
-     * - @deprecated ...text till the next @tag or end of the comment.
-     * In both cases the comment can be multi-line.
-     */
-    private String parseDeprecatedDoc(String comment) {
-        // Skip if we can't even find the tag in the comment.
-        if (comment == null) {
-            return null;
-        }
-
-        // sanitize & collapse whitespace
-        comment = comment.replaceAll("\\s+", " "); //$NON-NLS-1$ //$NON-NLS-2$
-
-        int pos = comment.indexOf("{@deprecated");
-        if (pos >= 0) {
-            comment = comment.substring(pos + 12 /* len of {@deprecated */);
-            comment = comment.replaceFirst("^([^}]*).*", "$1");
-        } else if ((pos = comment.indexOf("@deprecated")) >= 0) {
-            comment = comment.substring(pos + 11 /* len of @deprecated */);
-            comment = comment.replaceFirst("^(.*?)(?:@.*|$)", "$1");
-        } else {
-            return null;
-        }
-
-        return comment.trim();
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/resources/platform/DeclareStyleableInfo.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/resources/platform/DeclareStyleableInfo.java
deleted file mode 100644
index 40111e2..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/resources/platform/DeclareStyleableInfo.java
+++ /dev/null
@@ -1,102 +0,0 @@
-/*
- * 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.common.resources.platform;
-
-
-/**
- * Information needed to represent a View or ViewGroup (aka Layout) item
- * in the layout hierarchy, as extracted from the main android.jar and the
- * associated attrs.xml.
- */
-public class DeclareStyleableInfo {
-    /** The style name, never null. */
-    private final String mStyleName;
-    /** Attributes for this view or view group. Can be empty but never null. */
-    private final AttributeInfo[] mAttributes;
-    /** Short javadoc. Can be null. */
-    private String mJavaDoc;
-    /** Optional name of the parents styleable. Can be null. */
-    private String[] mParents;
-
-    /**
-     * Creates a new {@link DeclareStyleableInfo}.
-     *
-     * @param styleName The name of the style. Should not be empty nor null.
-     * @param attributes The initial list of attributes. Can be null.
-     */
-    public DeclareStyleableInfo(String styleName, AttributeInfo[] attributes) {
-        mStyleName = styleName;
-        mAttributes = attributes == null ? new AttributeInfo[0] : attributes;
-    }
-
-    /**
-     * Creates a new {@link DeclareStyleableInfo} that has the same attributes
-     * as an existing one and only differs by name.
-     *
-     * @param styleName The name of the style. Should not be empty nor null.
-     * @param existing The existing {@link DeclareStyleableInfo} to mirror.
-     */
-    public DeclareStyleableInfo(String styleName, DeclareStyleableInfo existing) {
-        mStyleName = styleName;
-
-        mJavaDoc = existing.getJavaDoc();
-
-        String[] parents = existing.getParents();
-        if (parents != null) {
-            mParents = new String[parents.length];
-            System.arraycopy(parents, 0, mParents, 0, parents.length);
-        }
-
-        AttributeInfo[] attrs = existing.getAttributes();
-        if (attrs == null || attrs.length == 0) {
-            mAttributes = new AttributeInfo[0];
-        } else {
-            mAttributes = new AttributeInfo[attrs.length];
-            System.arraycopy(attrs, 0, mAttributes, 0, attrs.length);
-        }
-    }
-
-    /** Returns style name */
-    public String getStyleName() {
-        return mStyleName;
-    }
-
-    /** Returns the attributes for this view or view group. Maybe empty but not null. */
-    public AttributeInfo[] getAttributes() {
-        return mAttributes;
-    }
-
-    /** Returns a short javadoc */
-    public String getJavaDoc() {
-        return mJavaDoc;
-    }
-
-    /** Sets the javadoc. */
-    public void setJavaDoc(String javaDoc) {
-        mJavaDoc = javaDoc;
-    }
-
-    /** Sets the name of the parents styleable. Can be null. */
-    public void setParents(String[] parents) {
-        mParents = parents;
-    }
-
-    /** Returns the name of the parents styleable. Can be null. */
-    public String[] getParents() {
-        return mParents;
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/resources/platform/ViewClassInfo.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/resources/platform/ViewClassInfo.java
deleted file mode 100644
index 214eb9c..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/resources/platform/ViewClassInfo.java
+++ /dev/null
@@ -1,158 +0,0 @@
-/*
- * 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.common.resources.platform;
-
-
-/**
- * Information needed to represent a View or ViewGroup (aka Layout) item
- * in the layout hierarchy, as extracted from the main android.jar and the
- * associated attrs.xml.
- */
-public class ViewClassInfo {
-    /** Is this a layout class (i.e. ViewGroup) or just a view? */
-    private boolean mIsLayout;
-    /** FQCN e.g. android.view.View, never null. */
-    private String mFullClassName;
-    /** Short class name, e.g. View, never null. */
-    private String mShortClassName;
-    /** Super class. Can be null. */
-    private ViewClassInfo mSuperClass;
-    /** Short javadoc. Can be null. */
-    private String mJavaDoc;
-    /** Attributes for this view or view group. Can be empty but never null. */
-    private AttributeInfo[] mAttributes;
-
-    public static class LayoutParamsInfo {
-        /** Short class name, e.g. LayoutData, never null. */
-        private String mShortClassName;
-        /** ViewLayout class info owning this layout data */
-        private ViewClassInfo mViewLayoutClass;
-        /** Super class. Can be null. */
-        private LayoutParamsInfo mSuperClass;
-        /** Layout Data Attributes for layout classes. Can be empty but not null. */
-        private AttributeInfo[] mAttributes;
-
-        public LayoutParamsInfo(ViewClassInfo enclosingViewClassInfo,
-                String shortClassName, LayoutParamsInfo superClassInfo) {
-            mShortClassName = shortClassName;
-            mViewLayoutClass = enclosingViewClassInfo;
-            mSuperClass = superClassInfo;
-            mAttributes = new AttributeInfo[0];
-        }
-
-        /** Returns short class name, e.g. "LayoutData" */
-        public String getShortClassName() {
-            return mShortClassName;
-        }
-        /** Returns the ViewLayout class info enclosing this layout data. Cannot null. */
-        public ViewClassInfo getViewLayoutClass() {
-            return mViewLayoutClass;
-        }
-        /** Returns the super class info. Can be null. */
-        public LayoutParamsInfo getSuperClass() {
-            return mSuperClass;
-        }
-        /** Returns the LayoutData attributes. Can be empty but not null. */
-        public AttributeInfo[] getAttributes() {
-            return mAttributes;
-        }
-        /** Sets the LayoutData attributes. Can be empty but not null. */
-        public void setAttributes(AttributeInfo[] attributes) {
-            mAttributes = attributes;
-        }
-    }
-
-    /** Layout data info for a layout class. Null for all non-layout classes and always
-     *  non-null for a layout class. */
-    public LayoutParamsInfo mLayoutData;
-
-    // --------
-
-    public ViewClassInfo(boolean isLayout, String fullClassName, String shortClassName) {
-        mIsLayout = isLayout;
-        mFullClassName = fullClassName;
-        mShortClassName = shortClassName;
-        mAttributes = new AttributeInfo[0];
-    }
-
-    /** Returns whether this is a layout class (i.e. ViewGroup) or just a View */
-    public boolean isLayout() {
-        return mIsLayout;
-    }
-
-    /** Returns FQCN e.g. "android.view.View" */
-    public String getFullClassName() {
-        return mFullClassName;
-    }
-
-    /** Returns short class name, e.g. "View" */
-    public String getShortClassName() {
-        return mShortClassName;
-    }
-
-    /** Returns the super class. Can be null. */
-    public ViewClassInfo getSuperClass() {
-        return mSuperClass;
-    }
-
-    /** Returns a short javadoc */
-    public String getJavaDoc() {
-        return mJavaDoc;
-    }
-
-    /** Returns the attributes for this view or view group. Maybe empty but not null. */
-    public AttributeInfo[] getAttributes() {
-        return mAttributes;
-    }
-
-    /** Returns the LayoutData info for layout classes. Null for non-layout view classes. */
-    public LayoutParamsInfo getLayoutData() {
-        return mLayoutData;
-    }
-
-    /**
-     * Sets a link on the info of the super class of this View or ViewGroup.
-     * <p/>
-     * The super class info must be of the same kind (i.e. group to group or view to view)
-     * except for the top ViewGroup which links to the View info.
-     * <p/>
-     * The super class cannot be null except for the top View info.
-     */
-    public void setSuperClass(ViewClassInfo superClass) {
-        mSuperClass = superClass;
-    }
-
-    /** Sets the javadoc for this View or ViewGroup. */
-    public void setJavaDoc(String javaDoc) {
-        mJavaDoc = javaDoc;
-    }
-
-    /** Sets the list of attributes for this View or ViewGroup. */
-    public void setAttributes(AttributeInfo[] attributes) {
-        mAttributes = attributes;
-    }
-
-    /**
-     * Sets the {@link LayoutParamsInfo} for layout classes.
-     * Does nothing for non-layout view classes.
-     */
-    public void setLayoutParams(LayoutParamsInfo layoutData) {
-        if (mIsLayout) {
-            mLayoutData = layoutData;
-        }
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/AdtConstants.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/AdtConstants.java
deleted file mode 100644
index 0e3b783..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/AdtConstants.java
+++ /dev/null
@@ -1,242 +0,0 @@
-/*
- * Copyright (C) 2007 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;
-
-import static com.android.SdkConstants.DOT_AIDL;
-import static com.android.SdkConstants.DOT_DEP;
-import static com.android.SdkConstants.DOT_FS;
-import static com.android.SdkConstants.DOT_JAVA;
-import static com.android.SdkConstants.DOT_RS;
-
-import com.android.SdkConstants;
-import com.android.ide.eclipse.adt.internal.build.builders.PostCompilerBuilder;
-import com.android.ide.eclipse.adt.internal.build.builders.PreCompilerBuilder;
-import com.android.ide.eclipse.adt.internal.build.builders.ResourceManagerBuilder;
-
-import org.eclipse.jdt.core.JavaCore;
-
-import java.io.File;
-
-/**
- * Constant definition class.<br>
- * <br>
- * Most constants have a prefix defining the content.
- * <ul>
- * <li><code>WS_</code> Workspace path constant. Those are absolute paths,
- * from the project root.</li>
- * <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>MARKER_</code> Resource Marker Ids constant.</li>
- * <li><code>EXT_</code> File extension constant. This does NOT include a dot.</li>
- * <li><code>DOT_</code> File extension constant. This start with a dot.</li>
- * <li><code>RE_</code> Regexp constant.</li>
- * <li><code>NS_</code> Namespace constant.</li>
- * <li><code>CLASS_</code> Fully qualified class name.</li>
- * </ul>
- *
- */
-public class AdtConstants {
-    /**
-     * The old Editors Plugin ID. It is still used in some places for compatibility.
-     * Please do not use for new features.
-     */
-    public static final String EDITORS_NAMESPACE = "com.android.ide.eclipse.editors"; //$NON-NLS-1$
-
-    /** Nature of default Android projects */
-    public final static String NATURE_DEFAULT = "com.android.ide.eclipse.adt.AndroidNature"; //$NON-NLS-1$
-
-    /** The container id for the android framework jar file */
-    public final static String CONTAINER_FRAMEWORK =
-        "com.android.ide.eclipse.adt.ANDROID_FRAMEWORK"; //$NON-NLS-1$
-
-    /** The container id for the libraries */
-    public final static String CONTAINER_PRIVATE_LIBRARIES = "com.android.ide.eclipse.adt.LIBRARIES"; //$NON-NLS-1$
-    public final static String CONTAINER_DEPENDENCIES = "com.android.ide.eclipse.adt.DEPENDENCIES";
-
-
-    /** Separator for workspace path, i.e. "/". */
-    public final static String WS_SEP = "/"; //$NON-NLS-1$
-    /** Separator character for workspace path, i.e. '/'. */
-    public final static char WS_SEP_CHAR = '/';
-
-    /** aapt's proguard output */
-    public final static String FN_AAPT_PROGUARD = "proguard.txt"; //$NON-NLS-1$
-
-    /** Temporary packaged resources file name, i.e. "resources.ap_" */
-    public final static String FN_RESOURCES_AP_ = "resources.ap_"; //$NON-NLS-1$
-
-    public final static String FN_TRACEVIEW =
-        (SdkConstants.CURRENT_PLATFORM == SdkConstants.PLATFORM_WINDOWS) ?
-            "traceview.bat" : "traceview"; //$NON-NLS-1$ //$NON-NLS-2$
-
-    public final static String FN_HPROF_CONV =
-        (SdkConstants.CURRENT_PLATFORM == SdkConstants.PLATFORM_WINDOWS) ?
-            "hprof-conv.exe" : "hprof-conv"; //$NON-NLS-1$ //$NON-NLS-2$
-
-    /** Absolute path of the workspace root, i.e. "/" */
-    public final static String WS_ROOT = WS_SEP;
-
-    /** Absolute path of the resource folder, e.g. "/res".<br> This is a workspace path. */
-    public final static String WS_RESOURCES = WS_SEP + SdkConstants.FD_RESOURCES;
-
-    public final static String FD_CRUNCH = "crunch";  //$NON-NLS-1$
-    public final static String FD_BC = "bc";  //$NON-NLS-1$
-
-    /** Path of crunch cache folder relative to the output folder.<br> This is a workspace path. */
-    public final static String WS_BIN_RELATIVE_CRUNCHCACHE = SdkConstants.FD_RESOURCES
-                                                                + WS_SEP + FD_CRUNCH;
-
-    /** Path of bc output folder relative to the output folder.<br> This is a workspace path. */
-    public final static String WS_BIN_RELATIVE_BC = SdkConstants.FD_RESOURCES
-                                                        + WS_SEP + FD_BC;
-
-    /** Path of rs libs output folder relative to the output folder.<br> This is a workspace path. */
-    public final static String WS_BIN_RELATIVE_RS_LIBS = SdkConstants.FD_RS_LIBS;
-
-    /** Absolute path of the resource folder, e.g. "/assets".<br> This is a workspace path. */
-    public final static String WS_ASSETS = WS_SEP + SdkConstants.FD_ASSETS;
-
-    /** Absolute path of the layout folder, e.g. "/res/layout".<br> This is a workspace path. */
-    public final static String WS_LAYOUTS = WS_RESOURCES + WS_SEP + SdkConstants.FD_RES_LAYOUT;
-
-    /** Leaf of the javaDoc folder. Does not start with a separator. */
-    public final static String WS_JAVADOC_FOLDER_LEAF = SdkConstants.FD_DOCS + "/" + //$NON-NLS-1$
-            SdkConstants.FD_DOCS_REFERENCE;
-
-    /** Path of the samples directory relative to the sdk folder.
-     *  This is an OS path, ending with a separator.
-     *  FIXME: remove once the NPW is fixed. */
-    public final static String OS_SDK_SAMPLES_FOLDER = SdkConstants.FD_SAMPLES + File.separator;
-
-    public final static String RE_DOT = "\\."; //$NON-NLS-1$
-    /** Regexp for java extension, i.e. "\.java$" */
-    public final static String RE_JAVA_EXT = "\\" + DOT_JAVA + "$"; //$NON-NLS-1$ //$NON-NLS-2$
-    /** Regexp for aidl extension, i.e. "\.aidl$" */
-    public final static String RE_AIDL_EXT = "\\" + DOT_AIDL + "$"; //$NON-NLS-1$ //$NON-NLS-2$
-    /** Regexp for rs extension, i.e. "\.rs$" */
-    public final static String RE_RS_EXT = "\\" + DOT_RS + "$"; //$NON-NLS-1$ //$NON-NLS-2$
-    /** Regexp for rs extension, i.e. "\.fs$" */
-    public final static String RE_FS_EXT = "\\" + DOT_FS + "$"; //$NON-NLS-1$ //$NON-NLS-2$
-    /** Regexp for .d extension, i.e. "\.d$" */
-    public final static String RE_DEP_EXT = "\\" + DOT_DEP + "$"; //$NON-NLS-1$ //$NON-NLS-2$
-
-    /**
-     * Namespace pattern for the custom resource XML, i.e. "http://schemas.android.com/apk/res/%s"
-     * <p/>
-     * This string contains a %s. It must be combined with the desired Java package, e.g.:
-     * <pre>
-     *    String.format(SdkConstants.NS_CUSTOM_RESOURCES, "android");
-     *    String.format(SdkConstants.NS_CUSTOM_RESOURCES, "com.test.mycustomapp");
-     * </pre>
-     *
-     * Note: if you need an URI specifically for the "android" namespace, consider using
-     * {@link SdkConstants#NS_RESOURCES} instead.
-     */
-    // TODO rename NS_CUSTOM_RESOURCES to NS_CUSTOM_RESOURCES_S (denoting it takes a %s) in
-    // another CL.
-    public final static String NS_CUSTOM_RESOURCES = "http://schemas.android.com/apk/res/%1$s"; //$NON-NLS-1$
-
-    /** The old common plug-in ID. Please do not use for new features. */
-    private static final String LEGACY_PLUGIN_ID = "com.android.ide.eclipse.common"; //$NON-NLS-1$
-
-    /** Generic marker for ADT errors, only to be used in the {@link ResourceManagerBuilder} */
-    public final static String MARKER_ADT = AdtPlugin.PLUGIN_ID + ".adtProblem"; //$NON-NLS-1$
-
-    /** Marker for Android Target errors.
-     * This is not cleared on each build like other markers. Instead, it's cleared
-     * when an AndroidClasspathContainerInitializer has succeeded in creating an
-     * AndroidClasspathContainer */
-    public final static String MARKER_TARGET = AdtPlugin.PLUGIN_ID + ".targetProblem"; //$NON-NLS-1$
-    /** Marker for Android Build Tools errors.
-     * This is not cleared on each build like other markers. Instead, it's cleared
-     * when the build tools are setup in the projectState. */
-    public final static String MARKER_BUILD_TOOLS = AdtPlugin.PLUGIN_ID + ".buildToolsProblem"; //$NON-NLS-1$
-    /** Marker for Android Dependency errors.
-     * This is not cleared on each build like other markers. Instead, it's cleared
-     * when a LibraryClasspathContainerInitializer has succeeded in creating a
-     * LibraryClasspathContainer */
-    public final static String MARKER_DEPENDENCY = AdtPlugin.PLUGIN_ID + ".dependencyProblem"; //$NON-NLS-1$
-
-
-    /** aapt marker error when running the compile command, only to be used
-     * in {@link PreCompilerBuilder} */
-    public final static String MARKER_AAPT_COMPILE = LEGACY_PLUGIN_ID + ".aaptProblem"; //$NON-NLS-1$
-
-    /** XML marker error, only to be used in {@link PreCompilerBuilder} */
-    public final static String MARKER_XML = LEGACY_PLUGIN_ID + ".xmlProblem"; //$NON-NLS-1$
-
-    /** aidl marker error, only to be used in {@link PreCompilerBuilder} */
-    public final static String MARKER_AIDL = LEGACY_PLUGIN_ID + ".aidlProblem"; //$NON-NLS-1$
-
-    /** renderscript marker error, only to be used in {@link PreCompilerBuilder} */
-    public final static String MARKER_RENDERSCRIPT = LEGACY_PLUGIN_ID + ".rsProblem"; //$NON-NLS-1$
-
-    /** android marker error, only to be used in the Manifest parsing
-     * from the {@link PreCompilerBuilder} */
-    public final static String MARKER_ANDROID = LEGACY_PLUGIN_ID + ".androidProblem"; //$NON-NLS-1$
-
-
-    /** aapt marker error when running the package command, only to be used in
-     * {@link PostCompilerBuilder} */
-    public final static String MARKER_AAPT_PACKAGE = LEGACY_PLUGIN_ID + ".aapt2Problem"; //$NON-NLS-1$
-
-    /** final packaging error marker, only to be used in {@link PostCompilerBuilder} */
-    public final static String MARKER_PACKAGING = AdtPlugin.PLUGIN_ID + ".packagingProblem"; //$NON-NLS-1$
-
-    /** manifest merger error, only to be used in {@link PreCompilerBuilder} */
-    public final static String MARKER_MANIFMERGER = AdtPlugin.PLUGIN_ID + ".manifMergerProblem"; //$NON-NLS-1$
-
-    /** Marker for lint errors */
-    public final static String MARKER_LINT = AdtPlugin.PLUGIN_ID + ".lintProblem"; //$NON-NLS-1$
-
-    /** Name for the "type" marker attribute */
-    public final static String MARKER_ATTR_TYPE = "android.type"; //$NON-NLS-1$
-    /** Name for the "class" marker attribute */
-    public final static String MARKER_ATTR_CLASS = "android.class"; //$NON-NLS-1$
-    /** activity value for marker attribute "type" */
-    public final static String MARKER_ATTR_TYPE_ACTIVITY = "activity"; //$NON-NLS-1$
-    /** service value for marker attribute "type" */
-    public final static String MARKER_ATTR_TYPE_SERVICE = "service"; //$NON-NLS-1$
-    /** receiver value for marker attribute "type" */
-    public final static String MARKER_ATTR_TYPE_RECEIVER = "receiver"; //$NON-NLS-1$
-    /** provider value for marker attribute "type" */
-    public final static String MARKER_ATTR_TYPE_PROVIDER = "provider"; //$NON-NLS-1$
-
-    /**
-     * Preferred compiler level, i.e. "1.6".
-     */
-    public final static String COMPILER_COMPLIANCE_PREFERRED = JavaCore.VERSION_1_6;
-    /**
-     * List of valid compiler level, i.e. "1.5" and "1.6"
-     */
-    public final static String[] COMPILER_COMPLIANCE = {
-        JavaCore.VERSION_1_5,
-        JavaCore.VERSION_1_6,
-    };
-
-    /** The base URL where to find the Android class & manifest documentation */
-    public static final String CODESITE_BASE_URL = "http://code.google.com/android";  //$NON-NLS-1$
-
-    public static final String LIBRARY_TEST_RUNNER = "android.test.runner"; //$NON-NLS-1$
-
-    /** Documentation marker for elements, attributes etc that should be hidden */
-    public static final String DOC_HIDE = "@hide"; //$NON-NLS-1$
-
-    public static final String DEX_OPTIONS_FORCEJUMBO = "dex.force.jumbo"; //$NON-NLS-1$
-    public static final String DEX_OPTIONS_DISABLE_MERGER = "dex.disable.merger"; //$NON-NLS-1$
-}
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
deleted file mode 100644
index f7ef41f..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/AdtPlugin.java
+++ /dev/null
@@ -1,2045 +0,0 @@
-/*
- * Copyright (C) 2007 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;
-
-import static com.android.SdkConstants.CURRENT_PLATFORM;
-import static com.android.SdkConstants.PLATFORM_DARWIN;
-import static com.android.SdkConstants.PLATFORM_LINUX;
-import static com.android.SdkConstants.PLATFORM_WINDOWS;
-
-import com.android.SdkConstants;
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-import com.android.ide.common.resources.ResourceFile;
-import com.android.ide.common.sdk.LoadStatus;
-import com.android.ide.eclipse.adt.AdtPlugin.CheckSdkErrorHandler.Solution;
-import com.android.ide.eclipse.adt.internal.VersionCheck;
-import com.android.ide.eclipse.adt.internal.actions.SdkManagerAction;
-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.common.CommonXmlEditor;
-import com.android.ide.eclipse.adt.internal.editors.layout.gle2.IncludeFinder;
-import com.android.ide.eclipse.adt.internal.lint.LintDeltaProcessor;
-import com.android.ide.eclipse.adt.internal.preferences.AdtPrefs;
-import com.android.ide.eclipse.adt.internal.preferences.AdtPrefs.BuildVerbosity;
-import com.android.ide.eclipse.adt.internal.project.AndroidClasspathContainerInitializer;
-import com.android.ide.eclipse.adt.internal.project.BaseProjectHelper;
-import com.android.ide.eclipse.adt.internal.project.ProjectHelper;
-import com.android.ide.eclipse.adt.internal.resources.manager.GlobalProjectMonitor;
-import com.android.ide.eclipse.adt.internal.resources.manager.GlobalProjectMonitor.IFileListener;
-import com.android.ide.eclipse.adt.internal.resources.manager.GlobalProjectMonitor.IProjectListener;
-import com.android.ide.eclipse.adt.internal.resources.manager.ResourceManager;
-import com.android.ide.eclipse.adt.internal.sdk.Sdk;
-import com.android.ide.eclipse.adt.internal.sdk.Sdk.ITargetChangeListener;
-import com.android.ide.eclipse.adt.internal.ui.EclipseUiHelper;
-import com.android.ide.eclipse.ddms.DdmsPlugin;
-import com.android.io.StreamException;
-import com.android.resources.ResourceFolderType;
-import com.android.sdklib.IAndroidTarget;
-import com.android.utils.ILogger;
-import com.google.common.collect.Sets;
-import com.google.common.io.Closeables;
-
-import org.eclipse.core.commands.Command;
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IMarkerDelta;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResourceDelta;
-import org.eclipse.core.resources.IWorkspace;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.QualifiedName;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.core.runtime.SubMonitor;
-import org.eclipse.core.runtime.jobs.Job;
-import org.eclipse.jdt.core.IJavaElement;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.JavaCore;
-import org.eclipse.jdt.ui.JavaUI;
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.jface.preference.PreferenceDialog;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.text.IRegion;
-import org.eclipse.jface.util.IPropertyChangeListener;
-import org.eclipse.jface.util.PropertyChangeEvent;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.IEditorDescriptor;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.browser.IWebBrowser;
-import org.eclipse.ui.browser.IWorkbenchBrowserSupport;
-import org.eclipse.ui.commands.ICommandService;
-import org.eclipse.ui.console.ConsolePlugin;
-import org.eclipse.ui.console.IConsole;
-import org.eclipse.ui.console.IConsoleConstants;
-import org.eclipse.ui.console.MessageConsole;
-import org.eclipse.ui.console.MessageConsoleStream;
-import org.eclipse.ui.dialogs.PreferencesUtil;
-import org.eclipse.ui.handlers.IHandlerService;
-import org.eclipse.ui.ide.IDE;
-import org.eclipse.ui.plugin.AbstractUIPlugin;
-import org.eclipse.ui.texteditor.AbstractTextEditor;
-import org.eclipse.wb.internal.core.DesignerPlugin;
-import org.osgi.framework.Bundle;
-import org.osgi.framework.BundleContext;
-
-import java.io.BufferedInputStream;
-import java.io.BufferedReader;
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.FileReader;
-import java.io.FileWriter;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.io.OutputStream;
-import java.io.Reader;
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-import java.util.Set;
-
-/**
- * The activator class controls the plug-in life cycle
- */
-public class AdtPlugin extends AbstractUIPlugin implements ILogger {
-    /** The plug-in ID */
-    public static final String PLUGIN_ID = "com.android.ide.eclipse.adt"; //$NON-NLS-1$
-
-    /** singleton instance */
-    private static AdtPlugin sPlugin;
-
-    private static Image sAndroidLogo;
-    private static ImageDescriptor sAndroidLogoDesc;
-
-    /** The global android console */
-    private MessageConsole mAndroidConsole;
-
-    /** Stream to write in the android console */
-    private MessageConsoleStream mAndroidConsoleStream;
-
-    /** Stream to write error messages to the android console */
-    private MessageConsoleStream mAndroidConsoleErrorStream;
-
-    /** Color used in the error console */
-    private Color mRed;
-
-    /** Load status of the SDK. Any access MUST be in a synchronized(mPostLoadProjects) block */
-    private LoadStatus mSdkLoadedStatus = LoadStatus.LOADING;
-    /** Project to update once the SDK is loaded.
-     * Any access MUST be in a synchronized(mPostLoadProjectsToResolve) block */
-    private final Set<IJavaProject> mPostLoadProjectsToResolve = Sets.newHashSet();
-    /** Project to check validity of cache vs actual once the SDK is loaded.
-     * Any access MUST be in a synchronized(mPostLoadProjectsToResolve) block */
-    private final ArrayList<IJavaProject> mPostLoadProjectsToCheck = new ArrayList<IJavaProject>();
-
-    private GlobalProjectMonitor mResourceMonitor;
-    private ArrayList<ITargetChangeListener> mTargetChangeListeners =
-            new ArrayList<ITargetChangeListener>();
-
-    /**
-     * This variable indicates that the job inside parseSdkContent() is currently
-     * trying to load the SDK, to avoid re-entrance.
-     * To check whether this succeeds or not, please see {@link #getSdkLoadStatus()}.
-     */
-    private volatile boolean mParseSdkContentIsRunning;
-
-    /**
-     * An error handler for checkSdkLocationAndId() that will handle the generated error
-     * or warning message. Each method must return a boolean that will in turn be returned by
-     * checkSdkLocationAndId.
-     */
-    public static abstract class CheckSdkErrorHandler {
-
-        public enum Solution {
-            NONE,
-            OPEN_SDK_MANAGER,
-            OPEN_ANDROID_PREFS,
-            OPEN_P2_UPDATE
-        }
-
-        /**
-         * Handle an error message during sdk location check. Returns whatever
-         * checkSdkLocationAndId() should returns.
-         */
-        public abstract boolean handleError(Solution solution, String message);
-
-        /**
-         * Handle a warning message during sdk location check. Returns whatever
-         * checkSdkLocationAndId() should returns.
-         */
-        public abstract boolean handleWarning(Solution solution, String message);
-    }
-
-    /**
-     * The constructor
-     */
-    public AdtPlugin() {
-        sPlugin = this;
-    }
-
-    /*
-     * (non-Javadoc)
-     * @see org.eclipse.ui.plugin.AbstractUIPlugin#start(org.osgi.framework.BundleContext)
-     */
-    @Override
-    public void start(BundleContext context) throws Exception {
-        super.start(context);
-
-        // set the default android console.
-        mAndroidConsole = new MessageConsole("Android", null); //$NON-NLS-1$
-        ConsolePlugin.getDefault().getConsoleManager().addConsoles(
-                new IConsole[] { mAndroidConsole });
-
-        // get the stream to write in the android console.
-        mAndroidConsoleStream = mAndroidConsole.newMessageStream();
-        mAndroidConsoleErrorStream = mAndroidConsole.newMessageStream();
-
-        // get the eclipse store
-        IPreferenceStore eclipseStore = getPreferenceStore();
-        AdtPrefs.init(eclipseStore);
-
-        // set the listener for the preference change
-        eclipseStore.addPropertyChangeListener(new IPropertyChangeListener() {
-            @Override
-            public void propertyChange(PropertyChangeEvent event) {
-                // load the new preferences
-                AdtPrefs.getPrefs().loadValues(event);
-
-                // if the SDK changed, we have to do some extra work
-                if (AdtPrefs.PREFS_SDK_DIR.equals(event.getProperty())) {
-
-                    // finally restart adb, in case it's a different version
-                    DdmsPlugin.setToolsLocation(getOsAbsoluteAdb(), true /* startAdb */,
-                            getOsAbsoluteHprofConv(), getOsAbsoluteTraceview());
-
-                    // get the SDK location and build id.
-                    if (checkSdkLocationAndId()) {
-                        // if sdk if valid, reparse it
-
-                        reparseSdk();
-                    }
-                }
-            }
-        });
-
-        // load preferences.
-        AdtPrefs.getPrefs().loadValues(null /*event*/);
-
-        // initialize property-sheet library
-        DesignerPlugin.initialize(
-                this,
-                PLUGIN_ID,
-                CURRENT_PLATFORM == PLATFORM_WINDOWS,
-                CURRENT_PLATFORM == PLATFORM_DARWIN,
-                CURRENT_PLATFORM == PLATFORM_LINUX);
-
-        // initialize editors
-        startEditors();
-
-        // Listen on resource file edits for updates to file inclusion
-        IncludeFinder.start();
-    }
-
-    /*
-     * (non-Javadoc)
-     *
-     * @see org.eclipse.ui.plugin.AbstractUIPlugin#stop(org.osgi.framework.BundleContext)
-     */
-    @Override
-    public void stop(BundleContext context) throws Exception {
-        super.stop(context);
-
-        stopEditors();
-        IncludeFinder.stop();
-
-        DesignerPlugin.dispose();
-
-        if (mRed != null) {
-            mRed.dispose();
-            mRed = null;
-        }
-
-        synchronized (AdtPlugin.class) {
-            sPlugin = null;
-        }
-    }
-
-    /** Called when the workbench has been started */
-    public void workbenchStarted() {
-        // Parse the SDK content.
-        // This is deferred in separate jobs to avoid blocking the bundle start.
-        final boolean isSdkLocationValid = checkSdkLocationAndId();
-        if (isSdkLocationValid) {
-            // parse the SDK resources.
-            // Wait 2 seconds before starting the job. This leaves some time to the
-            // other bundles to initialize.
-            parseSdkContent(2000 /*milliseconds*/);
-        }
-
-        Display display = getDisplay();
-        mRed = new Color(display, 0xFF, 0x00, 0x00);
-
-        // because this can be run, in some cases, by a non ui thread, and because
-        // changing the console properties update the ui, we need to make this change
-        // in the ui thread.
-        display.asyncExec(new Runnable() {
-            @Override
-            public void run() {
-                mAndroidConsoleErrorStream.setColor(mRed);
-            }
-        });
-    }
-
-    /**
-     * Returns the shared instance
-     *
-     * @return the shared instance
-     */
-    public static synchronized AdtPlugin getDefault() {
-        return sPlugin;
-    }
-
-    /**
-     * Returns the current display, if any
-     *
-     * @return the display
-     */
-    @NonNull
-    public static Display getDisplay() {
-        synchronized (AdtPlugin.class) {
-            if (sPlugin != null) {
-                IWorkbench bench = sPlugin.getWorkbench();
-                if (bench != null) {
-                    Display display = bench.getDisplay();
-                    if (display != null) {
-                        return display;
-                    }
-                }
-            }
-        }
-
-        Display display = Display.getCurrent();
-        if (display != null) {
-            return display;
-        }
-
-        return Display.getDefault();
-    }
-
-    /**
-     * Returns the shell, if any
-     *
-     * @return the shell, if any
-     */
-    @Nullable
-    public static Shell getShell() {
-        Display display = AdtPlugin.getDisplay();
-        Shell shell = display.getActiveShell();
-        if (shell == null) {
-            Shell[] shells = display.getShells();
-            if (shells.length > 0) {
-                shell = shells[0];
-            }
-        }
-
-        return shell;
-    }
-
-    /** Returns the adb path relative to the sdk folder */
-    public static String getOsRelativeAdb() {
-        return SdkConstants.OS_SDK_PLATFORM_TOOLS_FOLDER + SdkConstants.FN_ADB;
-    }
-
-    /** Returns the emulator path relative to the sdk folder */
-    public static String getOsRelativeEmulator() {
-        return SdkConstants.OS_SDK_TOOLS_FOLDER + SdkConstants.FN_EMULATOR;
-    }
-
-    /** Returns the adb path relative to the sdk folder */
-    public static String getOsRelativeProguard() {
-        return SdkConstants.OS_SDK_TOOLS_PROGUARD_BIN_FOLDER + SdkConstants.FN_PROGUARD;
-    }
-
-    /** Returns the absolute adb path */
-    public static String getOsAbsoluteAdb() {
-        return getOsSdkFolder() + getOsRelativeAdb();
-    }
-
-    /** Returns the absolute traceview path */
-    public static String getOsAbsoluteTraceview() {
-        return getOsSdkFolder() + SdkConstants.OS_SDK_TOOLS_FOLDER +
-                AdtConstants.FN_TRACEVIEW;
-    }
-
-    /** Returns the absolute emulator path */
-    public static String getOsAbsoluteEmulator() {
-        return getOsSdkFolder() + getOsRelativeEmulator();
-    }
-
-    public static String getOsAbsoluteHprofConv() {
-        return getOsSdkFolder() + SdkConstants.OS_SDK_PLATFORM_TOOLS_FOLDER +
-                AdtConstants.FN_HPROF_CONV;
-    }
-
-    /** Returns the absolute proguard path */
-    public static String getOsAbsoluteProguard() {
-        return getOsSdkFolder() + getOsRelativeProguard();
-    }
-
-    /**
-     * Returns a Url file path to the javaDoc folder.
-     */
-    public static String getUrlDoc() {
-        return ProjectHelper.getJavaDocPath(
-                getOsSdkFolder() + AdtConstants.WS_JAVADOC_FOLDER_LEAF);
-    }
-
-    /**
-     * Returns the SDK folder.
-     * Guaranteed to be terminated by a platform-specific path separator.
-     */
-    public static synchronized String getOsSdkFolder() {
-        if (sPlugin == null) {
-            return null;
-        }
-
-        return AdtPrefs.getPrefs().getOsSdkFolder();
-    }
-
-    public static String getOsSdkToolsFolder() {
-        return getOsSdkFolder() + SdkConstants.OS_SDK_TOOLS_FOLDER;
-    }
-
-    /**
-     * Returns an image descriptor for the image file at the given
-     * plug-in relative path
-     *
-     * @param path the path
-     * @return the image descriptor
-     */
-    public static ImageDescriptor getImageDescriptor(String path) {
-        return imageDescriptorFromPlugin(PLUGIN_ID, path);
-    }
-
-    /**
-     * Reads the contents of an {@link IFile} and return it as a String
-     *
-     * @param file the file to be read
-     * @return the String read from the file, or null if there was an error
-     */
-    @SuppressWarnings("resource") // Eclipse doesn't understand Closeables.closeQuietly yet
-    @Nullable
-    public static String readFile(@NonNull IFile file) {
-        InputStream contents = null;
-        InputStreamReader reader = null;
-        try {
-            contents = file.getContents();
-            String charset = file.getCharset();
-            reader = new InputStreamReader(contents, charset);
-            return readFile(reader);
-        } catch (CoreException e) {
-            // pass -- ignore files we can't read
-        } catch (IOException e) {
-            // pass -- ignore files we can't read.
-
-            // Note that IFile.getContents() indicates it throws a CoreException but
-            // experience shows that if the file does not exists it really throws
-            // IOException.
-            // New InputStreamReader() throws UnsupportedEncodingException
-            // which is handled by this IOException catch.
-
-        } finally {
-            Closeables.closeQuietly(reader);
-            Closeables.closeQuietly(contents);
-        }
-
-        return null;
-    }
-
-    /**
-     * Reads the contents of an {@link File} and return it as a String
-     *
-     * @param file the file to be read
-     * @return the String read from the file, or null if there was an error
-     */
-    public static String readFile(File file) {
-        try {
-            return readFile(new FileReader(file));
-        } catch (FileNotFoundException e) {
-            AdtPlugin.log(e, "Can't read file %1$s", file); //$NON-NLS-1$
-        }
-
-        return null;
-    }
-
-    /**
-     * Writes the given content out to the given {@link File}. The file will be deleted if
-     * it already exists.
-     *
-     * @param file the target file
-     * @param content the content to be written into the file
-     */
-    public static void writeFile(File file, String content) {
-        if (file.exists()) {
-            file.delete();
-        }
-        FileWriter fw = null;
-        try {
-            fw = new FileWriter(file);
-            fw.write(content);
-        } catch (IOException e) {
-            AdtPlugin.log(e, null);
-        } finally {
-            if (fw != null) {
-                try {
-                    fw.close();
-                } catch (IOException e) {
-                    AdtPlugin.log(e, null);
-                }
-            }
-        }
-    }
-
-    /**
-     * Returns true iff the given file contains the given String.
-     *
-     * @param file the file to look for the string in
-     * @param string the string to be searched for
-     * @return true if the file is found and contains the given string anywhere within it
-     */
-    @SuppressWarnings("resource") // Closed by streamContains
-    public static boolean fileContains(IFile file, String string) {
-        InputStream contents = null;
-        try {
-            contents = file.getContents();
-            String charset = file.getCharset();
-            return streamContains(new InputStreamReader(contents, charset), string);
-        } catch (Exception e) {
-            AdtPlugin.log(e, "Can't read file %1$s", file); //$NON-NLS-1$
-        }
-
-        return false;
-    }
-
-    /**
-     * Returns true iff the given file contains the given String.
-     *
-     * @param file the file to look for the string in
-     * @param string the string to be searched for
-     * @return true if the file is found and contains the given string anywhere within it
-     */
-    public static boolean fileContains(File file, String string) {
-        try {
-            return streamContains(new FileReader(file), string);
-        } catch (Exception e) {
-            AdtPlugin.log(e, "Can't read file %1$s", file); //$NON-NLS-1$
-        }
-
-        return false;
-    }
-
-    /**
-     * Returns true iff the given input stream contains the given String.
-     *
-     * @param r the stream to look for the string in
-     * @param string the string to be searched for
-     * @return true if the file is found and contains the given string anywhere within it
-     */
-    public static boolean streamContains(Reader r, String string) {
-        if (string.length() == 0) {
-            return true;
-        }
-
-        PushbackReader reader = null;
-        try {
-            reader = new PushbackReader(r, string.length());
-            char first = string.charAt(0);
-            while (true) {
-                int c = reader.read();
-                if (c == -1) {
-                    return false;
-                } else if (c == first) {
-                    boolean matches = true;
-                    for (int i = 1; i < string.length(); i++) {
-                        c = reader.read();
-                        if (c == -1) {
-                            return false;
-                        } else if (string.charAt(i) != (char)c) {
-                            matches = false;
-                            // Back up the characters that did not match
-                            reader.backup(i-1);
-                            break;
-                        }
-                    }
-                    if (matches) {
-                        return true;
-                    }
-                }
-            }
-        } catch (Exception e) {
-            AdtPlugin.log(e, "Can't read stream"); //$NON-NLS-1$
-        } finally {
-            try {
-                if (reader != null) {
-                    reader.close();
-                }
-            } catch (IOException e) {
-                AdtPlugin.log(e, "Can't read stream"); //$NON-NLS-1$
-            }
-        }
-
-        return false;
-
-    }
-
-    /**
-     * A special reader that allows backing up in the input (up to a predefined maximum
-     * number of characters)
-     * <p>
-     * NOTE: This class ONLY works with the {@link #read()} method!!
-     */
-    private static class PushbackReader extends BufferedReader {
-        /**
-         * Rolling/circular buffer. Can be a char rather than int since we never store EOF
-         * in it.
-         */
-        private char[] mStorage;
-
-        /** Points to the head of the queue. When equal to the tail, the queue is empty. */
-        private int mHead;
-
-        /**
-         * Points to the tail of the queue. This will move with each read of the actual
-         * wrapped reader, and the characters previous to it in the circular buffer are
-         * the most recently read characters.
-         */
-        private int mTail;
-
-        /**
-         * Creates a new reader with a given maximum number of backup characters
-         *
-         * @param reader the reader to wrap
-         * @param max the maximum number of characters to allow rollback for
-         */
-        public PushbackReader(Reader reader, int max) {
-            super(reader);
-            mStorage = new char[max + 1];
-        }
-
-        @Override
-        public int read() throws IOException {
-            // Have we backed up? If so we should serve characters
-            // from the storage
-            if (mHead != mTail) {
-                char c = mStorage[mHead];
-                mHead = (mHead + 1) % mStorage.length;
-                return c;
-            }
-            assert mHead == mTail;
-
-            // No backup -- read the next character, but stash it into storage
-            // as well such that we can retrieve it if we must.
-            int c = super.read();
-            mStorage[mHead] = (char) c;
-            mHead = mTail = (mHead + 1) % mStorage.length;
-            return c;
-        }
-
-        /**
-         * Backs up the reader a given number of characters. The next N reads will yield
-         * the N most recently read characters prior to this backup.
-         *
-         * @param n the number of characters to be backed up
-         */
-        public void backup(int n) {
-            if (n >= mStorage.length) {
-                throw new IllegalArgumentException("Exceeded backup limit");
-            }
-            assert n < mStorage.length;
-            mHead -= n;
-            if (mHead < 0) {
-                mHead += mStorage.length;
-            }
-        }
-    }
-
-    /**
-     * Reads the contents of a {@link ResourceFile} and returns it as a String
-     *
-     * @param file the file to be read
-     * @return the contents as a String, or null if reading failed
-     */
-    public static String readFile(ResourceFile file) {
-        InputStream contents = null;
-        try {
-            contents = file.getFile().getContents();
-            return readFile(new InputStreamReader(contents));
-        } catch (StreamException e) {
-            // pass -- ignore files we can't read
-        } finally {
-            try {
-                if (contents != null) {
-                    contents.close();
-                }
-            } catch (IOException e) {
-                AdtPlugin.log(e, "Can't read layout file"); //$NON-NLS-1$
-            }
-        }
-
-        return null;
-    }
-
-    /**
-     * Reads the contents of a {@link Reader} and return it as a String. This
-     * method will close the input reader.
-     *
-     * @param reader the reader to be read from
-     * @return the String read from reader, or null if there was an error
-     */
-    public static String readFile(Reader reader) {
-        BufferedReader bufferedReader = null;
-        try {
-            bufferedReader = new BufferedReader(reader);
-            StringBuilder sb = new StringBuilder(2000);
-            while (true) {
-                int c = bufferedReader.read();
-                if (c == -1) {
-                    return sb.toString();
-                } else {
-                    sb.append((char)c);
-                }
-            }
-        } catch (IOException e) {
-            // pass -- ignore files we can't read
-        } finally {
-            try {
-                if (bufferedReader != null) {
-                    bufferedReader.close();
-                }
-            } catch (IOException e) {
-                AdtPlugin.log(e, "Can't read input stream"); //$NON-NLS-1$
-            }
-        }
-
-        return null;
-    }
-
-    /**
-     * Reads and returns the content of a text file embedded in the plugin jar
-     * file.
-     * @param filepath the file path to the text file
-     * @return null if the file could not be read
-     */
-    public static String readEmbeddedTextFile(String filepath) {
-        try {
-            InputStream is = readEmbeddedFileAsStream(filepath);
-            if (is != null) {
-                BufferedReader reader = new BufferedReader(new InputStreamReader(is));
-                try {
-                    String line;
-                    StringBuilder total = new StringBuilder(reader.readLine());
-                    while ((line = reader.readLine()) != null) {
-                        total.append('\n');
-                        total.append(line);
-                    }
-
-                    return total.toString();
-                } finally {
-                    reader.close();
-                }
-            }
-        } catch (IOException e) {
-            // we'll just return null
-            AdtPlugin.log(e, "Failed to read text file '%s'", filepath);  //$NON-NLS-1$
-        }
-
-        return null;
-    }
-
-    /**
-     * Reads and returns the content of a binary file embedded in the plugin jar
-     * file.
-     * @param filepath the file path to the text file
-     * @return null if the file could not be read
-     */
-    public static byte[] readEmbeddedFile(String filepath) {
-        try {
-            InputStream is = readEmbeddedFileAsStream(filepath);
-            if (is != null) {
-                // create a buffered reader to facilitate reading.
-                BufferedInputStream stream = new BufferedInputStream(is);
-                try {
-                    // get the size to read.
-                    int avail = stream.available();
-
-                    // create the buffer and reads it.
-                    byte[] buffer = new byte[avail];
-                    stream.read(buffer);
-
-                    // and return.
-                    return buffer;
-                } finally {
-                    stream.close();
-                }
-            }
-        } catch (IOException e) {
-            // we'll just return null;.
-            AdtPlugin.log(e, "Failed to read binary file '%s'", filepath);  //$NON-NLS-1$
-        }
-
-        return null;
-    }
-
-    /**
-     * Reads and returns the content of a binary file embedded in the plugin jar
-     * file.
-     * @param filepath the file path to the text file
-     * @return null if the file could not be read
-     */
-    public static InputStream readEmbeddedFileAsStream(String filepath) {
-        // attempt to read an embedded file
-        try {
-            URL url = getEmbeddedFileUrl(AdtConstants.WS_SEP + filepath);
-            if (url != null) {
-                return url.openStream();
-            }
-        } catch (MalformedURLException e) {
-            // we'll just return null.
-            AdtPlugin.log(e, "Failed to read stream '%s'", filepath);  //$NON-NLS-1$
-        } catch (IOException e) {
-            // we'll just return null;.
-            AdtPlugin.log(e, "Failed to read stream '%s'", filepath);  //$NON-NLS-1$
-        }
-
-        return null;
-    }
-
-    /**
-     * Returns the URL of a binary file embedded in the plugin jar file.
-     * @param filepath the file path to the text file
-     * @return null if the file was not found.
-     */
-    public static URL getEmbeddedFileUrl(String filepath) {
-        Bundle bundle = null;
-        synchronized (AdtPlugin.class) {
-            if (sPlugin != null) {
-                bundle = sPlugin.getBundle();
-            } else {
-                AdtPlugin.log(IStatus.WARNING, "ADT Plugin is missing");    //$NON-NLS-1$
-                return null;
-            }
-        }
-
-        // attempt to get a file to one of the template.
-        String path = filepath;
-        if (!path.startsWith(AdtConstants.WS_SEP)) {
-            path = AdtConstants.WS_SEP + path;
-        }
-
-        URL url = bundle.getEntry(path);
-
-        if (url == null) {
-            AdtPlugin.log(IStatus.INFO, "Bundle file URL not found at path '%s'", path); //$NON-NLS-1$
-        }
-
-        return url;
-    }
-
-    /**
-     * Displays an error dialog box. This dialog box is ran asynchronously in the ui thread,
-     * therefore this method can be called from any thread.
-     * @param title The title of the dialog box
-     * @param message The error message
-     */
-    public final static void displayError(final String title, final String message) {
-        // get the current Display
-        final Display display = getDisplay();
-
-        // dialog box only run in ui thread..
-        display.asyncExec(new Runnable() {
-            @Override
-            public void run() {
-                Shell shell = display.getActiveShell();
-                MessageDialog.openError(shell, title, message);
-            }
-        });
-    }
-
-    /**
-     * Displays a warning dialog box. This dialog box is ran asynchronously in the ui thread,
-     * therefore this method can be called from any thread.
-     * @param title The title of the dialog box
-     * @param message The warning message
-     */
-    public final static void displayWarning(final String title, final String message) {
-        // get the current Display
-        final Display display = getDisplay();
-
-        // dialog box only run in ui thread..
-        display.asyncExec(new Runnable() {
-            @Override
-            public void run() {
-                Shell shell = display.getActiveShell();
-                MessageDialog.openWarning(shell, title, message);
-            }
-        });
-    }
-
-    /**
-     * Display a yes/no question dialog box. This dialog is opened synchronously in the ui thread,
-     * therefore this message can be called from any thread.
-     * @param title The title of the dialog box
-     * @param message The error message
-     * @return true if OK was clicked.
-     */
-    public final static boolean displayPrompt(final String title, final String message) {
-        // get the current Display and Shell
-        final Display display = getDisplay();
-
-        // we need to ask the user what he wants to do.
-        final boolean[] result = new boolean[1];
-        display.syncExec(new Runnable() {
-            @Override
-            public void run() {
-                Shell shell = display.getActiveShell();
-                result[0] = MessageDialog.openQuestion(shell, title, message);
-            }
-        });
-        return result[0];
-    }
-
-    /**
-     * Logs a message to the default Eclipse log.
-     *
-     * @param severity The severity code. Valid values are: {@link IStatus#OK},
-     * {@link IStatus#ERROR}, {@link IStatus#INFO}, {@link IStatus#WARNING} or
-     * {@link IStatus#CANCEL}.
-     * @param format The format string, like for {@link String#format(String, Object...)}.
-     * @param args The arguments for the format string, like for
-     * {@link String#format(String, Object...)}.
-     */
-    public static void log(int severity, String format, Object ... args) {
-        if (format == null) {
-            return;
-        }
-
-        String message = String.format(format, args);
-        Status status = new Status(severity, PLUGIN_ID, message);
-
-        if (getDefault() != null) {
-            getDefault().getLog().log(status);
-        } else {
-            // During UnitTests, we generally don't have a plugin object. It's ok
-            // to log to stdout or stderr in this case.
-            (severity < IStatus.ERROR ? System.out : System.err).println(status.toString());
-        }
-    }
-
-    /**
-     * Logs an exception to the default Eclipse log.
-     * <p/>
-     * The status severity is always set to ERROR.
-     *
-     * @param exception the exception to log.
-     * @param format The format string, like for {@link String#format(String, Object...)}.
-     * @param args The arguments for the format string, like for
-     * {@link String#format(String, Object...)}.
-     */
-    public static void log(Throwable exception, String format, Object ... args) {
-        String message = null;
-        if (format != null) {
-            message = String.format(format, args);
-        } else {
-            message = "";
-        }
-        Status status = new Status(IStatus.ERROR, PLUGIN_ID, message, exception);
-
-        if (getDefault() != null) {
-            getDefault().getLog().log(status);
-        } else {
-            // During UnitTests, we generally don't have a plugin object. It's ok
-            // to log to stderr in this case.
-            System.err.println(status.toString());
-        }
-    }
-
-    /**
-     * This is a mix between log(Throwable) and printErrorToConsole.
-     * <p/>
-     * This logs the exception with an ERROR severity and the given printf-like format message.
-     * The same message is then printed on the Android error console with the associated tag.
-     *
-     * @param exception the exception to log.
-     * @param format The format string, like for {@link String#format(String, Object...)}.
-     * @param args The arguments for the format string, like for
-     * {@link String#format(String, Object...)}.
-     */
-    public static synchronized void logAndPrintError(Throwable exception, String tag,
-            String format, Object ... args) {
-        if (sPlugin != null) {
-            String message = String.format(format, args);
-            Status status = new Status(IStatus.ERROR, PLUGIN_ID, message, exception);
-            getDefault().getLog().log(status);
-            printToStream(sPlugin.mAndroidConsoleErrorStream, tag, message);
-            showAndroidConsole();
-        }
-    }
-
-    /**
-     * Prints one or more error message to the android console.
-     * @param tag A tag to be associated with the message. Can be null.
-     * @param objects the objects to print through their <code>toString</code> method.
-     */
-    public static synchronized void printErrorToConsole(String tag, Object... objects) {
-        if (sPlugin != null) {
-            printToStream(sPlugin.mAndroidConsoleErrorStream, tag, objects);
-
-            showAndroidConsole();
-        }
-    }
-
-    /**
-     * Prints one or more error message to the android console.
-     * @param objects the objects to print through their <code>toString</code> method.
-     */
-    public static void printErrorToConsole(Object... objects) {
-        printErrorToConsole((String)null, objects);
-    }
-
-    /**
-     * Prints one or more error message to the android console.
-     * @param project The project to which the message is associated. Can be null.
-     * @param objects the objects to print through their <code>toString</code> method.
-     */
-    public static void printErrorToConsole(IProject project, Object... objects) {
-        String tag = project != null ? project.getName() : null;
-        printErrorToConsole(tag, objects);
-    }
-
-    /**
-     * Prints one or more build messages to the android console, filtered by Build output verbosity.
-     * @param level {@link BuildVerbosity} level of the message.
-     * @param project The project to which the message is associated. Can be null.
-     * @param objects the objects to print through their <code>toString</code> method.
-     * @see BuildVerbosity#ALWAYS
-     * @see BuildVerbosity#NORMAL
-     * @see BuildVerbosity#VERBOSE
-     */
-    public static synchronized void printBuildToConsole(BuildVerbosity level, IProject project,
-            Object... objects) {
-        if (sPlugin != null) {
-            if (level.getLevel() <= AdtPrefs.getPrefs().getBuildVerbosity().getLevel()) {
-                String tag = project != null ? project.getName() : null;
-                printToStream(sPlugin.mAndroidConsoleStream, tag, objects);
-            }
-        }
-    }
-
-    /**
-     * Prints one or more message to the android console.
-     * @param tag The tag to be associated with the message. Can be null.
-     * @param objects the objects to print through their <code>toString</code> method.
-     */
-    public static synchronized void printToConsole(String tag, Object... objects) {
-        if (sPlugin != null) {
-            printToStream(sPlugin.mAndroidConsoleStream, tag, objects);
-        }
-    }
-
-    /**
-     * Prints one or more message to the android console.
-     * @param project The project to which the message is associated. Can be null.
-     * @param objects the objects to print through their <code>toString</code> method.
-     */
-    public static void printToConsole(IProject project, Object... objects) {
-        String tag = project != null ? project.getName() : null;
-        printToConsole(tag, objects);
-    }
-
-    /** Force the display of the android console */
-    public static void showAndroidConsole() {
-        // first make sure the console is in the workbench
-        EclipseUiHelper.showView(IConsoleConstants.ID_CONSOLE_VIEW, true);
-
-        // now make sure it's not docked.
-        ConsolePlugin.getDefault().getConsoleManager().showConsoleView(
-                AdtPlugin.getDefault().getAndroidConsole());
-    }
-
-    /**
-     * Returns whether the {@link IAndroidTarget}s have been loaded from the SDK.
-     */
-    public final LoadStatus getSdkLoadStatus() {
-        synchronized (Sdk.getLock()) {
-            return mSdkLoadedStatus;
-        }
-    }
-
-    /**
-     * Sets the given {@link IJavaProject} to have its target resolved again once the SDK finishes
-     * to load.
-     */
-    public final void setProjectToResolve(IJavaProject javaProject) {
-        synchronized (Sdk.getLock()) {
-            mPostLoadProjectsToResolve.add(javaProject);
-        }
-    }
-
-    /**
-     * Sets the given {@link IJavaProject} to have its target checked for consistency
-     * once the SDK finishes to load. This is used if the target is resolved using cached
-     * information while the SDK is loading.
-     */
-    public final void setProjectToCheck(IJavaProject javaProject) {
-        // only lock on
-        synchronized (Sdk.getLock()) {
-            mPostLoadProjectsToCheck.add(javaProject);
-        }
-    }
-
-    /**
-     * Checks the location of the SDK in the prefs is valid.
-     * If it is not, display a warning dialog to the user and try to display
-     * some useful link to fix the situation (setup the preferences, perform an
-     * update, etc.)
-     *
-     * @return True if the SDK location points to an SDK.
-     *  If false, the user has already been presented with a modal dialog explaining that.
-     */
-    public boolean checkSdkLocationAndId() {
-        String sdkLocation = AdtPrefs.getPrefs().getOsSdkFolder();
-
-        return checkSdkLocationAndId(sdkLocation, new CheckSdkErrorHandler() {
-            private String mTitle = "Android SDK";
-
-            /**
-             * Handle an error, which is the case where the check did not find any SDK.
-             * This returns false to {@link AdtPlugin#checkSdkLocationAndId()}.
-             */
-            @Override
-            public boolean handleError(Solution solution, String message) {
-                displayMessage(solution, message, MessageDialog.ERROR);
-                return false;
-            }
-
-            /**
-             * Handle an warning, which is the case where the check found an SDK
-             * but it might need to be repaired or is missing an expected component.
-             *
-             * This returns true to {@link AdtPlugin#checkSdkLocationAndId()}.
-             */
-            @Override
-            public boolean handleWarning(Solution solution, String message) {
-                displayMessage(solution, message, MessageDialog.WARNING);
-                return true;
-            }
-
-            private void displayMessage(
-                    final Solution solution,
-                    final String message,
-                    final int dialogImageType) {
-                final Display disp = getDisplay();
-                disp.asyncExec(new Runnable() {
-                    @Override
-                    public void run() {
-                        Shell shell = disp.getActiveShell();
-                        if (shell == null) {
-                            shell = AdtPlugin.getShell();
-                        }
-                        if (shell == null) {
-                            return;
-                        }
-
-                        String customLabel = null;
-                        switch(solution) {
-                        case OPEN_ANDROID_PREFS:
-                            customLabel = "Open Preferences";
-                            break;
-                        case OPEN_P2_UPDATE:
-                            customLabel = "Check for Updates";
-                            break;
-                        case OPEN_SDK_MANAGER:
-                            customLabel = "Open SDK Manager";
-                            break;
-                        }
-
-                        String btnLabels[] = new String[customLabel == null ? 1 : 2];
-                        btnLabels[0] = customLabel;
-                        btnLabels[btnLabels.length - 1] = IDialogConstants.CLOSE_LABEL;
-
-                        MessageDialog dialog = new MessageDialog(
-                                shell, // parent
-                                mTitle,
-                                null, // dialogTitleImage
-                                message,
-                                dialogImageType,
-                                btnLabels,
-                                btnLabels.length - 1);
-                        int index = dialog.open();
-
-                        if (customLabel != null && index == 0) {
-                            switch(solution) {
-                            case OPEN_ANDROID_PREFS:
-                                openAndroidPrefs();
-                                break;
-                            case OPEN_P2_UPDATE:
-                                openP2Update();
-                                break;
-                            case OPEN_SDK_MANAGER:
-                                openSdkManager();
-                                break;
-                            }
-                        }
-                    }
-                });
-            }
-
-            private void openSdkManager() {
-                // Open the standalone external SDK Manager since we know
-                // that ADT on Windows is bound to be locking some SDK folders.
-                //
-                // Also when this is invoked because SdkManagerAction.run() fails, this
-                // test will fail and we'll fallback on using the internal one.
-                if (SdkManagerAction.openExternalSdkManager()) {
-                    return;
-                }
-
-                // Otherwise open the regular SDK Manager bundled within ADT
-                if (!SdkManagerAction.openAdtSdkManager()) {
-                    // We failed because the SDK location is undefined. In this case
-                    // let's open the preferences instead.
-                    openAndroidPrefs();
-                }
-            }
-
-            private void openP2Update() {
-                Display disp = getDisplay();
-                if (disp == null) {
-                    return;
-                }
-                disp.asyncExec(new Runnable() {
-                    @Override
-                    public void run() {
-                        String cmdId = "org.eclipse.equinox.p2.ui.sdk.update";  //$NON-NLS-1$
-                        IWorkbench wb = PlatformUI.getWorkbench();
-                        if (wb == null) {
-                            return;
-                        }
-
-                        ICommandService cs = (ICommandService) wb.getService(ICommandService.class);
-                        IHandlerService is = (IHandlerService) wb.getService(IHandlerService.class);
-                        if (cs == null || is == null) {
-                            return;
-                        }
-
-                        Command cmd = cs.getCommand(cmdId);
-                        if (cmd != null && cmd.isDefined()) {
-                            try {
-                                is.executeCommand(cmdId, null/*event*/);
-                            } catch (Exception ignore) {
-                                AdtPlugin.log(ignore, "Failed to execute command %s", cmdId);
-                            }
-                        }
-                    }
-                });
-            }
-
-            private void openAndroidPrefs() {
-                PreferenceDialog dialog = PreferencesUtil.createPreferenceDialogOn(
-                        getDisplay().getActiveShell(),
-                        "com.android.ide.eclipse.preferences.main", //$NON-NLS-1$ preferencePageId
-                        null,  // displayedIds
-                        null); // data
-                dialog.open();
-            }
-        });
-    }
-
-    /**
-     * Internal helper to perform the actual sdk location and id check.
-     * <p/>
-     * This is useful for callers who want to override what happens when the check
-     * fails. Otherwise consider calling {@link #checkSdkLocationAndId()} that will
-     * present a modal dialog to the user in case of failure.
-     *
-     * @param osSdkLocation The sdk directory, an OS path. Can be null.
-     * @param errorHandler An checkSdkErrorHandler that can display a warning or an error.
-     * @return False if there was an error or the result from the errorHandler invocation.
-     */
-    public boolean checkSdkLocationAndId(@Nullable String osSdkLocation,
-                                         @NonNull CheckSdkErrorHandler errorHandler) {
-        if (osSdkLocation == null || osSdkLocation.trim().length() == 0) {
-            return errorHandler.handleError(
-                    Solution.OPEN_ANDROID_PREFS,
-                    "Location of the Android SDK has not been setup in the preferences.");
-        }
-
-        if (!osSdkLocation.endsWith(File.separator)) {
-            osSdkLocation = osSdkLocation + File.separator;
-        }
-
-        File osSdkFolder = new File(osSdkLocation);
-        if (osSdkFolder.isDirectory() == false) {
-            return errorHandler.handleError(
-                    Solution.OPEN_ANDROID_PREFS,
-                    String.format(Messages.Could_Not_Find_Folder, osSdkLocation));
-        }
-
-        String osTools = osSdkLocation + SdkConstants.OS_SDK_TOOLS_FOLDER;
-        File toolsFolder = new File(osTools);
-        if (toolsFolder.isDirectory() == false) {
-            return errorHandler.handleError(
-                    Solution.OPEN_ANDROID_PREFS,
-                    String.format(Messages.Could_Not_Find_Folder_In_SDK,
-                            SdkConstants.FD_TOOLS, osSdkLocation));
-        }
-
-        // first check the min plug-in requirement as its error message is easier to figure
-        // out for the user
-        if (VersionCheck.checkVersion(osSdkLocation, errorHandler) == false) {
-            return false;
-        }
-
-        // check that we have both the tools component and the platform-tools component.
-        String platformTools = osSdkLocation + SdkConstants.OS_SDK_PLATFORM_TOOLS_FOLDER;
-        if (checkFolder(platformTools) == false) {
-            return errorHandler.handleWarning(
-                    Solution.OPEN_SDK_MANAGER,
-                    "SDK Platform Tools component is missing!\n" +
-                    "Please use the SDK Manager to install it.");
-        }
-
-        String tools = osSdkLocation + SdkConstants.OS_SDK_TOOLS_FOLDER;
-        if (checkFolder(tools) == false) {
-            return errorHandler.handleError(
-                    Solution.OPEN_SDK_MANAGER,
-                    "SDK Tools component is missing!\n" +
-                    "Please use the SDK Manager to install it.");
-        }
-
-        // check the path to various tools we use to make sure nothing is missing. This is
-        // not meant to be exhaustive.
-        String[] filesToCheck = new String[] {
-                osSdkLocation + getOsRelativeAdb(),
-                osSdkLocation + getOsRelativeEmulator()
-        };
-        for (String file : filesToCheck) {
-            if (checkFile(file) == false) {
-                return errorHandler.handleError(
-                        Solution.OPEN_ANDROID_PREFS,
-                        String.format(Messages.Could_Not_Find, file));
-            }
-        }
-
-        return true;
-    }
-
-    /**
-     * Checks if a path reference a valid existing file.
-     * @param osPath the os path to check.
-     * @return true if the file exists and is, in fact, a file.
-     */
-    private boolean checkFile(String osPath) {
-        File file = new File(osPath);
-        if (file.isFile() == false) {
-            return false;
-        }
-
-        return true;
-    }
-
-    /**
-     * Checks if a path reference a valid existing folder.
-     * @param osPath the os path to check.
-     * @return true if the folder exists and is, in fact, a folder.
-     */
-    private boolean checkFolder(String osPath) {
-        File file = new File(osPath);
-        if (file.isDirectory() == false) {
-            return false;
-        }
-
-        return true;
-    }
-
-    /**
-     * Parses the SDK resources.
-     */
-    private void parseSdkContent(long delay) {
-        // Perform the update in a thread (here an Eclipse runtime job)
-        // since this should never block the caller (especially the start method)
-        Job job = new Job(Messages.AdtPlugin_Android_SDK_Content_Loader) {
-            @SuppressWarnings("unchecked")
-            @Override
-            protected IStatus run(IProgressMonitor monitor) {
-                try {
-
-                    if (mParseSdkContentIsRunning) {
-                        return new Status(IStatus.WARNING, PLUGIN_ID,
-                                "An Android SDK is already being loaded. Please try again later.");
-                    }
-
-                    mParseSdkContentIsRunning = true;
-
-                    SubMonitor progress = SubMonitor.convert(monitor,
-                            "Initialize SDK Manager", 100);
-
-                    Sdk sdk = Sdk.loadSdk(AdtPrefs.getPrefs().getOsSdkFolder());
-
-                    if (sdk != null) {
-                        ArrayList<IJavaProject> list = new ArrayList<IJavaProject>();
-                        synchronized (Sdk.getLock()) {
-                            mSdkLoadedStatus = LoadStatus.LOADED;
-
-                            progress.setTaskName("Check Projects");
-
-                            for (IJavaProject javaProject : mPostLoadProjectsToResolve) {
-                                IProject iProject = javaProject.getProject();
-                                if (iProject.isOpen()) {
-                                    // project that have been resolved before the sdk was loaded
-                                    // will have a ProjectState where the IAndroidTarget is null
-                                    // so we load the target now that the SDK is loaded.
-                                    sdk.loadTargetAndBuildTools(Sdk.getProjectState(iProject));
-                                    list.add(javaProject);
-                                }
-                            }
-
-                            // done with this list.
-                            mPostLoadProjectsToResolve.clear();
-                        }
-
-                        // check the projects that need checking.
-                        // The method modifies the list (it removes the project that
-                        // do not need to be resolved again).
-                        AndroidClasspathContainerInitializer.checkProjectsCache(
-                                mPostLoadProjectsToCheck);
-
-                        list.addAll(mPostLoadProjectsToCheck);
-
-                        // update the project that needs recompiling.
-                        if (list.size() > 0) {
-                            IJavaProject[] array = list.toArray(
-                                    new IJavaProject[list.size()]);
-                            ProjectHelper.updateProjects(array);
-                        }
-
-                        progress.worked(10);
-                    } else {
-                        // SDK failed to Load!
-                        // Sdk#loadSdk() has already displayed an error.
-                        synchronized (Sdk.getLock()) {
-                            mSdkLoadedStatus = LoadStatus.FAILED;
-                        }
-                    }
-
-                    // Notify resource changed listeners
-                    progress.setTaskName("Refresh UI");
-                    progress.setWorkRemaining(mTargetChangeListeners.size());
-
-                    // Clone the list before iterating, to avoid ConcurrentModification
-                    // exceptions
-                    final List<ITargetChangeListener> listeners =
-                        (List<ITargetChangeListener>)mTargetChangeListeners.clone();
-                    final SubMonitor progress2 = progress;
-                    AdtPlugin.getDisplay().asyncExec(new Runnable() {
-                        @Override
-                        public void run() {
-                            for (ITargetChangeListener listener : listeners) {
-                                try {
-                                    listener.onSdkLoaded();
-                                } catch (Exception e) {
-                                    AdtPlugin.log(e, "Failed to update a TargetChangeListener."); //$NON-NLS-1$
-                                } finally {
-                                    progress2.worked(1);
-                                }
-                            }
-                        }
-                    });
-                } catch (Throwable t) {
-                    log(t, "Unknown exception in parseSdkContent.");    //$NON-NLS-1$
-                    return new Status(IStatus.ERROR, PLUGIN_ID,
-                            "parseSdkContent failed", t);               //$NON-NLS-1$
-
-                } finally {
-                    mParseSdkContentIsRunning = false;
-                    if (monitor != null) {
-                        monitor.done();
-                    }
-                }
-
-                return Status.OK_STATUS;
-            }
-        };
-        job.setPriority(Job.BUILD); // build jobs are run after other interactive jobs
-        job.setRule(ResourcesPlugin.getWorkspace().getRoot());
-        if (delay > 0) {
-            job.schedule(delay);
-        } else {
-            job.schedule();
-        }
-    }
-
-    /** Returns the global android console */
-    public MessageConsole getAndroidConsole() {
-        return mAndroidConsole;
-    }
-
-    // ----- Methods for Editors -------
-
-    public void startEditors() {
-        sAndroidLogoDesc = imageDescriptorFromPlugin(AdtPlugin.PLUGIN_ID,
-                "/icons/android.png"); //$NON-NLS-1$
-        sAndroidLogo = sAndroidLogoDesc.createImage();
-
-        // Add a resource listener to handle compiled resources.
-        IWorkspace ws = ResourcesPlugin.getWorkspace();
-        mResourceMonitor = GlobalProjectMonitor.startMonitoring(ws);
-
-        if (mResourceMonitor != null) {
-            try {
-                setupEditors(mResourceMonitor);
-                ResourceManager.setup(mResourceMonitor);
-                LintDeltaProcessor.startListening(mResourceMonitor);
-            } catch (Throwable t) {
-                log(t, "ResourceManager.setup failed"); //$NON-NLS-1$
-            }
-        }
-    }
-
-    /**
-     * The <code>AbstractUIPlugin</code> implementation of this <code>Plugin</code>
-     * method saves this plug-in's preference and dialog stores and shuts down
-     * its image registry (if they are in use). Subclasses may extend this
-     * method, but must send super <b>last</b>. A try-finally statement should
-     * be used where necessary to ensure that <code>super.shutdown()</code> is
-     * always done.
-     *
-     * @see org.eclipse.ui.plugin.AbstractUIPlugin#stop(org.osgi.framework.BundleContext)
-     */
-    public void stopEditors() {
-        sAndroidLogo.dispose();
-
-        IconFactory.getInstance().dispose();
-
-        LintDeltaProcessor.stopListening(mResourceMonitor);
-
-        // Remove the resource listener that handles compiled resources.
-        IWorkspace ws = ResourcesPlugin.getWorkspace();
-        GlobalProjectMonitor.stopMonitoring(ws);
-
-        if (mRed != null) {
-            mRed.dispose();
-            mRed = null;
-        }
-    }
-
-    /**
-     * Returns an Image for the small Android logo.
-     *
-     * Callers should not dispose it.
-     */
-    public static Image getAndroidLogo() {
-        return sAndroidLogo;
-    }
-
-    /**
-     * Returns an {@link ImageDescriptor} for the small Android logo.
-     *
-     * Callers should not dispose it.
-     */
-    public static ImageDescriptor getAndroidLogoDesc() {
-        return sAndroidLogoDesc;
-    }
-
-    /**
-     * Returns the ResourceMonitor object.
-     */
-    public GlobalProjectMonitor getResourceMonitor() {
-        return mResourceMonitor;
-    }
-
-    /**
-     * Sets up the editor resource listener.
-     * <p>
-     * The listener handles:
-     * <ul>
-     * <li> Discovering newly created files, and ensuring that if they are in an Android
-     *      project, they default to the right XML editor.
-     * <li> Discovering deleted files, and closing the corresponding editors if necessary.
-     *      This is only done for XML files, since other editors such as Java editors handles
-     *      it on their own.
-     * <ul>
-     *
-     * This is called by the {@link AdtPlugin} during initialization.
-     *
-     * @param monitor The main Resource Monitor object.
-     */
-    public void setupEditors(GlobalProjectMonitor monitor) {
-        monitor.addFileListener(new IFileListener() {
-            @Override
-            public void fileChanged(@NonNull IFile file, @NonNull IMarkerDelta[] markerDeltas,
-                    int kind, @Nullable String extension, int flags, boolean isAndroidProject) {
-                if (!isAndroidProject) {
-                    return;
-                }
-                if (flags == IResourceDelta.MARKERS || !SdkConstants.EXT_XML.equals(extension)) {
-                    // ONLY the markers changed, or not XML file: not relevant to this listener
-                    return;
-                }
-
-                if (kind == IResourceDelta.REMOVED) {
-                    AdtUtils.closeEditors(file, false /*save*/);
-                    return;
-                }
-
-                // The resources files must have a file path similar to
-                //    project/res/.../*.xml
-                // There is no support for sub folders, so the segment count must be 4
-                if (file.getFullPath().segmentCount() == 4) {
-                    // check if we are inside the res folder.
-                    String segment = file.getFullPath().segment(1);
-                    if (segment.equalsIgnoreCase(SdkConstants.FD_RESOURCES)) {
-                        // we are inside a res/ folder, get the ResourceFolderType of the
-                        // parent folder.
-                        String[] folderSegments = file.getParent().getName().split(
-                                SdkConstants.RES_QUALIFIER_SEP);
-
-                        // get the enum for the resource type.
-                        ResourceFolderType type = ResourceFolderType.getTypeByName(
-                                folderSegments[0]);
-
-                        if (type != null) {
-                            if (kind == IResourceDelta.ADDED) {
-                                // A new file {@code /res/type-config/some.xml} was added.
-                                // All the /res XML files are handled by the same common editor now.
-                                IDE.setDefaultEditor(file, CommonXmlEditor.ID);
-                            }
-                        } else {
-                            // if the res folder is null, this means the name is invalid,
-                            // in this case we remove whatever android editors that was set
-                            // as the default editor.
-                            IEditorDescriptor desc = IDE.getDefaultEditor(file);
-                            String editorId = desc.getId();
-                            if (editorId.startsWith(AdtConstants.EDITORS_NAMESPACE)) {
-                                // reset the default editor.
-                                IDE.setDefaultEditor(file, null);
-                            }
-                        }
-                    }
-                }
-            }
-        }, IResourceDelta.ADDED | IResourceDelta.REMOVED);
-
-        monitor.addProjectListener(new IProjectListener() {
-            @Override
-            public void projectClosed(IProject project) {
-                // Close any editors referencing this project
-                AdtUtils.closeEditors(project, true /*save*/);
-            }
-
-            @Override
-            public void projectDeleted(IProject project) {
-                // Close any editors referencing this project
-                AdtUtils.closeEditors(project, false /*save*/);
-            }
-
-            @Override
-            public void projectOpenedWithWorkspace(IProject project) {
-            }
-
-            @Override
-            public void allProjectsOpenedWithWorkspace() {
-            }
-
-            @Override
-            public void projectOpened(IProject project) {
-            }
-
-            @Override
-            public void projectRenamed(IProject project, IPath from) {
-            }
-        });
-    }
-
-    /**
-     * Adds a new {@link ITargetChangeListener} to be notified when a new SDK is loaded, or when
-     * a project has its target changed.
-     */
-    public void addTargetListener(ITargetChangeListener listener) {
-        mTargetChangeListeners.add(listener);
-    }
-
-    /**
-     * Removes an existing {@link ITargetChangeListener}.
-     * @see #addTargetListener(ITargetChangeListener)
-     */
-    public void removeTargetListener(ITargetChangeListener listener) {
-        mTargetChangeListeners.remove(listener);
-    }
-
-    /**
-     * Updates all the {@link ITargetChangeListener}s that a target has changed for a given project.
-     * <p/>Only editors related to that project should reload.
-     */
-    @SuppressWarnings("unchecked")
-    public void updateTargetListeners(final IProject project) {
-        final List<ITargetChangeListener> listeners =
-            (List<ITargetChangeListener>)mTargetChangeListeners.clone();
-
-        AdtPlugin.getDisplay().asyncExec(new Runnable() {
-            @Override
-            public void run() {
-                for (ITargetChangeListener listener : listeners) {
-                    try {
-                        listener.onProjectTargetChange(project);
-                    } catch (Exception e) {
-                        AdtPlugin.log(e, "Failed to update a TargetChangeListener.");  //$NON-NLS-1$
-                    }
-                }
-            }
-        });
-    }
-
-    /**
-     * Updates all the {@link ITargetChangeListener}s that a target data was loaded.
-     * <p/>Only editors related to a project using this target should reload.
-     */
-    @SuppressWarnings("unchecked")
-    public void updateTargetListeners(final IAndroidTarget target) {
-        final List<ITargetChangeListener> listeners =
-            (List<ITargetChangeListener>)mTargetChangeListeners.clone();
-
-        Display display = AdtPlugin.getDisplay();
-        if (display == null || display.isDisposed()) {
-            return;
-        }
-        display.asyncExec(new Runnable() {
-            @Override
-            public void run() {
-                for (ITargetChangeListener listener : listeners) {
-                    try {
-                        listener.onTargetLoaded(target);
-                    } catch (Exception e) {
-                        AdtPlugin.log(e, "Failed to update a TargetChangeListener.");  //$NON-NLS-1$
-                    }
-                }
-            }
-        });
-    }
-
-    public static synchronized OutputStream getOutStream() {
-        return sPlugin.mAndroidConsoleStream;
-    }
-
-    public static synchronized OutputStream getErrorStream() {
-        return sPlugin.mAndroidConsoleErrorStream;
-    }
-
-    /**
-     * Sets the named persistent property for the given file to the given value
-     *
-     * @param file the file to associate the property with
-     * @param qname the name of the property
-     * @param value the new value, or null to clear the property
-     */
-    public static void setFileProperty(IFile file, QualifiedName qname, String value) {
-        try {
-            file.setPersistentProperty(qname, value);
-        } catch (CoreException e) {
-            log(e, "Cannot set property %1$s to %2$s", qname, value);
-        }
-    }
-
-    /**
-     * Gets the named persistent file property from the given file
-     *
-     * @param file the file to look up properties for
-     * @param qname the name of the property to look up
-     * @return the property value, or null
-     */
-    public static String getFileProperty(IFile file, QualifiedName qname) {
-        try {
-            return file.getPersistentProperty(qname);
-        } catch (CoreException e) {
-            log(e, "Cannot get property %1$s", qname);
-        }
-
-        return null;
-    }
-
-    /**
-     * Conditionally reparses the content of the SDK if it has changed on-disk
-     * and updates opened projects.
-     * <p/>
-     * The operation is asynchronous and happens in a background eclipse job.
-     * <p/>
-     * This operation is called in multiple places and should be reasonably
-     * cheap and conservative. The goal is to automatically refresh the SDK
-     * when it is obvious it has changed so when not sure the code should
-     * tend to not reload and avoid reloading too often (which is an expensive
-     * operation that has a lot of user impact.)
-     */
-    public void refreshSdk() {
-        // SDK can't have changed if we haven't loaded it yet.
-        final Sdk sdk = Sdk.getCurrent();
-        if (sdk == null) {
-            return;
-        }
-
-        Job job = new Job("Check Android SDK") {
-            @Override
-            protected IStatus run(IProgressMonitor monitor) {
-                // SDK has changed if its location path is different.
-                File location = sdk.getSdkFileLocation();
-                boolean changed = location == null || !location.isDirectory();
-
-                if (!changed) {
-                    assert location != null;
-                    File prefLocation = new File(AdtPrefs.getPrefs().getOsSdkFolder());
-                    changed = !location.equals(prefLocation);
-
-                    if (changed) {
-                        // Basic file path comparison indicates they are not the same.
-                        // Let's dig a bit deeper.
-                        try {
-                            location     = location.getCanonicalFile();
-                            prefLocation = prefLocation.getCanonicalFile();
-                            changed = !location.equals(prefLocation);
-                        } catch (IOException ignore) {
-                            // There's no real reason for the canonicalization to fail
-                            // if the paths map to actual directories. And if they don't
-                            // this should have been caught above.
-                        }
-                    }
-                }
-
-                if (!changed) {
-                    // Check whether the target directories has potentially changed.
-                    changed = sdk.haveTargetsChanged();
-                }
-
-                if (changed) {
-                    monitor.setTaskName("Reload Android SDK");
-                    reparseSdk();
-                }
-
-                monitor.done();
-                return Status.OK_STATUS;
-            }
-        };
-        job.setRule(ResourcesPlugin.getWorkspace().getRoot());
-        job.setPriority(Job.SHORT); // a short background job, not interactive.
-        job.schedule();
-    }
-
-    /**
-     * Reparses the content of the SDK and updates opened projects.
-     * The operation is asynchronous and happens in a background eclipse job.
-     * <p/>
-     * This reloads the SDK all the time. To only perform this when it has potentially
-     * changed, call {@link #refreshSdk()} instead.
-     */
-    public void reparseSdk() {
-        // add all the opened Android projects to the list of projects to be updated
-        // after the SDK is reloaded
-        synchronized (Sdk.getLock()) {
-            // get the project to refresh.
-            IJavaProject[] androidProjects = BaseProjectHelper.getAndroidProjects(null /*filter*/);
-            mPostLoadProjectsToResolve.addAll(Arrays.asList(androidProjects));
-        }
-
-        // parse the SDK resources at the new location
-        parseSdkContent(0 /*immediately*/);
-    }
-
-    /**
-     * Prints messages, associated with a project to the specified stream
-     * @param stream The stream to write to
-     * @param tag The tag associated to the message. Can be null
-     * @param objects The objects to print through their toString() method (or directly for
-     * {@link String} objects.
-     */
-    public static synchronized void printToStream(MessageConsoleStream stream, String tag,
-            Object... objects) {
-        String dateTag = AndroidPrintStream.getMessageTag(tag);
-
-        for (Object obj : objects) {
-            stream.print(dateTag);
-            stream.print(" "); //$NON-NLS-1$
-            if (obj instanceof String) {
-                stream.println((String)obj);
-            } else if (obj == null) {
-                stream.println("(null)");  //$NON-NLS-1$
-            } else {
-                stream.println(obj.toString());
-            }
-        }
-    }
-
-    // --------- ILogger methods -----------
-
-    @Override
-    public void error(@Nullable Throwable t, @Nullable String format, Object... args) {
-        if (t != null) {
-            log(t, format, args);
-        } else {
-            log(IStatus.ERROR, format, args);
-        }
-    }
-
-    @Override
-    public void info(@NonNull String format, Object... args) {
-        log(IStatus.INFO, format, args);
-    }
-
-    @Override
-    public void verbose(@NonNull String format, Object... args) {
-        log(IStatus.INFO, format, args);
-    }
-
-    @Override
-    public void warning(@NonNull String format, Object... args) {
-        log(IStatus.WARNING, format, args);
-    }
-
-    /**
-     * Opens the given URL in a browser tab
-     *
-     * @param url the URL to open in a browser
-     */
-    public static void openUrl(URL url) {
-        IWorkbenchBrowserSupport support = PlatformUI.getWorkbench().getBrowserSupport();
-        IWebBrowser browser;
-        try {
-            browser = support.createBrowser(PLUGIN_ID);
-            browser.openURL(url);
-        } catch (PartInitException e) {
-            log(e, null);
-        }
-    }
-
-    /**
-     * Opens a Java class for the given fully qualified class name
-     *
-     * @param project the project containing the class
-     * @param fqcn the fully qualified class name of the class to be opened
-     * @return true if the class was opened, false otherwise
-     */
-    public static boolean openJavaClass(IProject project, String fqcn) {
-        if (fqcn == null) {
-            return false;
-        }
-
-        // Handle inner classes
-        if (fqcn.indexOf('$') != -1) {
-            fqcn = fqcn.replaceAll("\\$", "."); //$NON-NLS-1$ //$NON-NLS-2$
-        }
-
-        try {
-            if (project.hasNature(JavaCore.NATURE_ID)) {
-                IJavaProject javaProject = JavaCore.create(project);
-                IJavaElement result = javaProject.findType(fqcn);
-                if (result != null) {
-                    return JavaUI.openInEditor(result) != null;
-                }
-            }
-        } catch (Throwable e) {
-            log(e, "Can't open class %1$s", fqcn); //$NON-NLS-1$
-        }
-
-        return false;
-    }
-
-    /**
-     * For a stack trace entry, specifying a class, method, and optionally
-     * fileName and line number, open the corresponding line in the editor.
-     *
-     * @param fqcn the fully qualified name of the class
-     * @param method the method name
-     * @param fileName the file name, or null
-     * @param lineNumber the line number or -1
-     * @return true if the target location could be opened, false otherwise
-     */
-    public static boolean openStackTraceLine(@Nullable String fqcn,
-            @Nullable String method, @Nullable String fileName, int lineNumber) {
-        return new SourceRevealer().revealMethod(fqcn + '.' + method, fileName, lineNumber, null);
-    }
-
-    /**
-     * Opens the given file and shows the given (optional) region in the editor (or
-     * if no region is specified, opens the editor tab.)
-     *
-     * @param file the file to be opened
-     * @param region an optional region which if set will be selected and shown to the
-     *            user
-     * @throws PartInitException if something goes wrong
-     */
-    public static void openFile(IFile file, IRegion region) throws PartInitException {
-        openFile(file, region, true);
-    }
-
-    // TODO: Make an openEditor which does the above, and make the above pass false for showEditor
-
-    /**
-     * Opens the given file and shows the given (optional) region
-     *
-     * @param file the file to be opened
-     * @param region an optional region which if set will be selected and shown to the
-     *            user
-     * @param showEditorTab if true, front the editor tab after opening the file
-     * @return the editor that was opened, or null if no editor was opened
-     * @throws PartInitException if something goes wrong
-     */
-    public static IEditorPart openFile(IFile file, IRegion region, boolean showEditorTab)
-            throws PartInitException {
-        IWorkbenchPage page = AdtUtils.getActiveWorkbenchPage();
-        if (page == null) {
-            return null;
-        }
-        IEditorPart targetEditor = IDE.openEditor(page, file, true);
-        if (targetEditor instanceof AndroidXmlEditor) {
-            AndroidXmlEditor editor = (AndroidXmlEditor) targetEditor;
-            if (region != null) {
-                editor.show(region.getOffset(), region.getLength(), showEditorTab);
-            } else if (showEditorTab) {
-                editor.setActivePage(AndroidXmlEditor.TEXT_EDITOR_ID);
-            }
-        } else if (targetEditor instanceof AbstractTextEditor) {
-            AbstractTextEditor editor = (AbstractTextEditor) targetEditor;
-            if (region != null) {
-                editor.setHighlightRange(region.getOffset(), region.getLength(),
-                        true /* moveCursor*/);
-            }
-        }
-
-        return targetEditor;
-    }
-}
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
deleted file mode 100644
index 93cd2da..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/AdtUtils.java
+++ /dev/null
@@ -1,1561 +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.eclipse.adt;
-
-import static com.android.SdkConstants.TOOLS_PREFIX;
-import static com.android.SdkConstants.TOOLS_URI;
-import static org.eclipse.ui.IWorkbenchPage.MATCH_INPUT;
-
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-import com.android.sdklib.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;
-import com.android.ide.eclipse.adt.internal.project.BaseProjectHelper;
-import com.android.ide.eclipse.adt.internal.project.BaseProjectHelper.IProjectFilter;
-import com.android.ide.eclipse.adt.internal.sdk.Sdk;
-import com.android.resources.ResourceFolderType;
-import com.android.resources.ResourceType;
-import com.android.sdklib.AndroidVersion;
-import com.android.sdklib.IAndroidTarget;
-import com.android.sdklib.repository.PkgProps;
-import com.android.utils.XmlUtils;
-import com.google.common.io.ByteStreams;
-import com.google.common.io.Closeables;
-
-import org.eclipse.core.filebuffers.FileBuffers;
-import org.eclipse.core.filebuffers.ITextFileBuffer;
-import org.eclipse.core.filebuffers.ITextFileBufferManager;
-import org.eclipse.core.filebuffers.LocationKind;
-import org.eclipse.core.filesystem.URIUtil;
-import org.eclipse.core.resources.IContainer;
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IFolder;
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IWorkspace;
-import org.eclipse.core.resources.IWorkspaceRoot;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jface.text.BadLocationException;
-import org.eclipse.jface.text.IDocument;
-import org.eclipse.jface.text.IRegion;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IEditorReference;
-import org.eclipse.ui.IFileEditorInput;
-import org.eclipse.ui.IURIEditorInput;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.editors.text.TextFileDocumentProvider;
-import org.eclipse.ui.part.FileEditorInput;
-import org.eclipse.ui.texteditor.IDocumentProvider;
-import org.eclipse.ui.texteditor.ITextEditor;
-import org.eclipse.wst.sse.core.StructuredModelManager;
-import org.eclipse.wst.sse.core.internal.provisional.IModelManager;
-import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
-import org.eclipse.wst.sse.core.internal.provisional.IndexedRegion;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
-import org.w3c.dom.Attr;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-
-import java.io.File;
-import java.io.InputStream;
-import java.net.URISyntaxException;
-import java.net.URL;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Locale;
-
-
-/** Utility methods for ADT */
-@SuppressWarnings("restriction") // WST API
-public class AdtUtils {
-    /**
-     * Creates a Java class name out of the given string, if possible. For
-     * example, "My Project" becomes "MyProject", "hello" becomes "Hello",
-     * "Java's" becomes "Java", and so on.
-     *
-     * @param string the string to be massaged into a Java class
-     * @return the string as a Java class, or null if a class name could not be
-     *         extracted
-     */
-    @Nullable
-    public static String extractClassName(@NonNull String string) {
-        StringBuilder sb = new StringBuilder(string.length());
-        int n = string.length();
-
-        int i = 0;
-        for (; i < n; i++) {
-            char c = Character.toUpperCase(string.charAt(i));
-            if (Character.isJavaIdentifierStart(c)) {
-                sb.append(c);
-                i++;
-                break;
-            }
-        }
-        if (sb.length() > 0) {
-            for (; i < n; i++) {
-                char c = string.charAt(i);
-                if (Character.isJavaIdentifierPart(c)) {
-                    sb.append(c);
-                }
-            }
-
-            return sb.toString();
-        }
-
-        return null;
-    }
-
-    /**
-     * Strips off the last file extension from the given filename, e.g.
-     * "foo.backup.diff" will be turned into "foo.backup".
-     * <p>
-     * Note that dot files (e.g. ".profile") will be left alone.
-     *
-     * @param filename the filename to be stripped
-     * @return the filename without the last file extension.
-     */
-    public static String stripLastExtension(String filename) {
-        int dotIndex = filename.lastIndexOf('.');
-        if (dotIndex > 0) { // > 0 instead of != -1: Treat dot files (e.g. .profile) differently
-            return filename.substring(0, dotIndex);
-        } else {
-            return filename;
-        }
-    }
-
-    /**
-     * Strips off all extensions from the given filename, e.g. "foo.9.png" will
-     * be turned into "foo".
-     * <p>
-     * Note that dot files (e.g. ".profile") will be left alone.
-     *
-     * @param filename the filename to be stripped
-     * @return the filename without any file extensions
-     */
-    public static String stripAllExtensions(String filename) {
-        int dotIndex = filename.indexOf('.');
-        if (dotIndex > 0) { // > 0 instead of != -1: Treat dot files (e.g. .profile) differently
-            return filename.substring(0, dotIndex);
-        } else {
-            return filename;
-        }
-    }
-
-    /**
-     * Strips the given suffix from the given string, provided that the string ends with
-     * the suffix.
-     *
-     * @param string the full string to strip from
-     * @param suffix the suffix to strip out
-     * @return the string without the suffix at the end
-     */
-    public static String stripSuffix(@NonNull String string, @NonNull String suffix) {
-        if (string.endsWith(suffix)) {
-            return string.substring(0, string.length() - suffix.length());
-        }
-
-        return string;
-    }
-
-    /**
-     * Capitalizes the string, i.e. transforms the initial [a-z] into [A-Z].
-     * Returns the string unmodified if the first character is not [a-z].
-     *
-     * @param str The string to capitalize.
-     * @return The capitalized string
-     */
-    public static String capitalize(String str) {
-        if (str == null || str.length() < 1 || Character.isUpperCase(str.charAt(0))) {
-            return str;
-        }
-
-        StringBuilder sb = new StringBuilder();
-        sb.append(Character.toUpperCase(str.charAt(0)));
-        sb.append(str.substring(1));
-        return sb.toString();
-    }
-
-    /**
-     * Converts a CamelCase word into an underlined_word
-     *
-     * @param string the CamelCase version of the word
-     * @return the underlined version of the word
-     */
-    public static String camelCaseToUnderlines(String string) {
-        if (string.isEmpty()) {
-            return string;
-        }
-
-        StringBuilder sb = new StringBuilder(2 * string.length());
-        int n = string.length();
-        boolean lastWasUpperCase = Character.isUpperCase(string.charAt(0));
-        for (int i = 0; i < n; i++) {
-            char c = string.charAt(i);
-            boolean isUpperCase = Character.isUpperCase(c);
-            if (isUpperCase && !lastWasUpperCase) {
-                sb.append('_');
-            }
-            lastWasUpperCase = isUpperCase;
-            c = Character.toLowerCase(c);
-            sb.append(c);
-        }
-
-        return sb.toString();
-    }
-
-    /**
-     * Converts an underlined_word into a CamelCase word
-     *
-     * @param string the underlined word to convert
-     * @return the CamelCase version of the word
-     */
-    public static String underlinesToCamelCase(String string) {
-        StringBuilder sb = new StringBuilder(string.length());
-        int n = string.length();
-
-        int i = 0;
-        boolean upcaseNext = true;
-        for (; i < n; i++) {
-            char c = string.charAt(i);
-            if (c == '_') {
-                upcaseNext = true;
-            } else {
-                if (upcaseNext) {
-                    c = Character.toUpperCase(c);
-                }
-                upcaseNext = false;
-                sb.append(c);
-            }
-        }
-
-        return sb.toString();
-    }
-
-    /**
-     * Returns the current editor (the currently visible and active editor), or null if
-     * not found
-     *
-     * @return the current editor, or null
-     */
-    public static IEditorPart getActiveEditor() {
-        IWorkbenchWindow window = getActiveWorkbenchWindow();
-        if (window != null) {
-            IWorkbenchPage page = window.getActivePage();
-            if (page != null) {
-                return page.getActiveEditor();
-            }
-        }
-
-        return null;
-    }
-
-    /**
-     * Returns the current active workbench, or null if not found
-     *
-     * @return the current window, or null
-     */
-    @Nullable
-    public static IWorkbenchWindow getActiveWorkbenchWindow() {
-        IWorkbench workbench = PlatformUI.getWorkbench();
-        IWorkbenchWindow window = workbench.getActiveWorkbenchWindow();
-        if (window == null) {
-            IWorkbenchWindow[] windows = workbench.getWorkbenchWindows();
-            if (windows.length > 0) {
-                window = windows[0];
-            }
-        }
-
-        return window;
-    }
-
-    /**
-     * Returns the current active workbench page, or null if not found
-     *
-     * @return the current page, or null
-     */
-    @Nullable
-    public static IWorkbenchPage getActiveWorkbenchPage() {
-        IWorkbenchWindow window = getActiveWorkbenchWindow();
-        if (window != null) {
-            IWorkbenchPage page = window.getActivePage();
-            if (page == null) {
-                IWorkbenchPage[] pages = window.getPages();
-                if (pages.length > 0) {
-                    page = pages[0];
-                }
-            }
-
-            return page;
-        }
-
-        return null;
-    }
-
-    /**
-     * Returns the current active workbench part, or null if not found
-     *
-     * @return the current active workbench part, or null
-     */
-    @Nullable
-    public static IWorkbenchPart getActivePart() {
-        IWorkbenchWindow window = getActiveWorkbenchWindow();
-        if (window != null) {
-            IWorkbenchPage activePage = window.getActivePage();
-            if (activePage != null) {
-                return activePage.getActivePart();
-            }
-        }
-        return null;
-    }
-
-    /**
-     * Returns the current text editor (the currently visible and active editor), or null
-     * if not found.
-     *
-     * @return the current text editor, or null
-     */
-    public static ITextEditor getActiveTextEditor() {
-        IEditorPart editor = getActiveEditor();
-        if (editor != null) {
-            if (editor instanceof ITextEditor) {
-                return (ITextEditor) editor;
-            } else {
-                return (ITextEditor) editor.getAdapter(ITextEditor.class);
-            }
-        }
-
-        return null;
-    }
-
-    /**
-     * Looks through the open editors and returns the editors that have the
-     * given file as input.
-     *
-     * @param file the file to search for
-     * @param restore whether editors should be restored (if they have an open
-     *            tab, but the editor hasn't been restored since the most recent
-     *            IDE start yet
-     * @return a collection of editors
-     */
-    @NonNull
-    public static Collection<IEditorPart> findEditorsFor(@NonNull IFile file, boolean restore) {
-        FileEditorInput input = new FileEditorInput(file);
-        List<IEditorPart> result = null;
-        IWorkbench workbench = PlatformUI.getWorkbench();
-        IWorkbenchWindow[] windows = workbench.getWorkbenchWindows();
-        for (IWorkbenchWindow window : windows) {
-            IWorkbenchPage[] pages = window.getPages();
-            for (IWorkbenchPage page : pages) {
-                IEditorReference[] editors = page.findEditors(input, null,  MATCH_INPUT);
-                if (editors != null) {
-                    for (IEditorReference reference : editors) {
-                        IEditorPart editor = reference.getEditor(restore);
-                        if (editor != null) {
-                            if (result == null) {
-                                result = new ArrayList<IEditorPart>();
-                            }
-                            result.add(editor);
-                        }
-                    }
-                }
-            }
-        }
-
-        if (result == null) {
-            return Collections.emptyList();
-        }
-
-        return result;
-    }
-
-    /**
-     * Attempts to convert the given {@link URL} into a {@link File}.
-     *
-     * @param url the {@link URL} to be converted
-     * @return the corresponding {@link File}, which may not exist
-     */
-    @NonNull
-    public static File getFile(@NonNull URL url) {
-        try {
-            // First try URL.toURI(): this will work for URLs that contain %20 for spaces etc.
-            // Unfortunately, it *doesn't* work for "broken" URLs where the URL contains
-            // spaces, which is often the case.
-            return new File(url.toURI());
-        } catch (URISyntaxException e) {
-            // ...so as a fallback, go to the old url.getPath() method, which handles space paths.
-            return new File(url.getPath());
-        }
-    }
-
-    /**
-     * Returns the file for the current editor, if any.
-     *
-     * @return the file for the current editor, or null if none
-     */
-    public static IFile getActiveFile() {
-        IEditorPart editor = getActiveEditor();
-        if (editor != null) {
-            IEditorInput input = editor.getEditorInput();
-            if (input instanceof IFileEditorInput) {
-                IFileEditorInput fileInput = (IFileEditorInput) input;
-                return fileInput.getFile();
-            }
-        }
-
-        return null;
-    }
-
-    /**
-     * Returns an absolute path to the given resource
-     *
-     * @param resource the resource to look up a path for
-     * @return an absolute file system path to the resource
-     */
-    @NonNull
-    public static IPath getAbsolutePath(@NonNull IResource resource) {
-        IPath location = resource.getRawLocation();
-        if (location != null) {
-            return location.makeAbsolute();
-        } else {
-            IWorkspace workspace = ResourcesPlugin.getWorkspace();
-            IWorkspaceRoot root = workspace.getRoot();
-            IPath workspacePath = root.getLocation();
-            return workspacePath.append(resource.getFullPath());
-        }
-    }
-
-    /**
-     * Converts a workspace-relative path to an absolute file path
-     *
-     * @param path the workspace-relative path to convert
-     * @return the corresponding absolute file in the file system
-     */
-    @NonNull
-    public static File workspacePathToFile(@NonNull IPath path) {
-        IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
-        IResource res = root.findMember(path);
-        if (res != null) {
-            IPath location = res.getLocation();
-            if (location != null) {
-                return location.toFile();
-            }
-            return root.getLocation().append(path).toFile();
-        }
-
-        return path.toFile();
-    }
-
-    /**
-     * Converts a {@link File} to an {@link IFile}, if possible.
-     *
-     * @param file a file to be converted
-     * @return the corresponding {@link IFile}, or null
-     */
-    public static IFile fileToIFile(File file) {
-        if (!file.isAbsolute()) {
-            file = file.getAbsoluteFile();
-        }
-
-        IWorkspaceRoot workspace = ResourcesPlugin.getWorkspace().getRoot();
-        IFile[] files = workspace.findFilesForLocationURI(file.toURI());
-        if (files.length > 0) {
-            return files[0];
-        }
-
-        IPath filePath = new Path(file.getPath());
-        return pathToIFile(filePath);
-    }
-
-    /**
-     * Converts a {@link File} to an {@link IResource}, if possible.
-     *
-     * @param file a file to be converted
-     * @return the corresponding {@link IResource}, or null
-     */
-    public static IResource fileToResource(File file) {
-        if (!file.isAbsolute()) {
-            file = file.getAbsoluteFile();
-        }
-
-        IWorkspaceRoot workspace = ResourcesPlugin.getWorkspace().getRoot();
-        IFile[] files = workspace.findFilesForLocationURI(file.toURI());
-        if (files.length > 0) {
-            return files[0];
-        }
-
-        IPath filePath = new Path(file.getPath());
-        return pathToResource(filePath);
-    }
-
-    /**
-     * Converts a {@link IPath} to an {@link IFile}, if possible.
-     *
-     * @param path a path to be converted
-     * @return the corresponding {@link IFile}, or null
-     */
-    public static IFile pathToIFile(IPath path) {
-        IWorkspaceRoot workspace = ResourcesPlugin.getWorkspace().getRoot();
-
-        IFile[] files = workspace.findFilesForLocationURI(URIUtil.toURI(path.makeAbsolute()));
-        if (files.length > 0) {
-            return files[0];
-        }
-
-        IPath workspacePath = workspace.getLocation();
-        if (workspacePath.isPrefixOf(path)) {
-            IPath relativePath = path.makeRelativeTo(workspacePath);
-            IResource member = workspace.findMember(relativePath);
-            if (member instanceof IFile) {
-                return (IFile) member;
-            }
-        } else if (path.isAbsolute()) {
-            return workspace.getFileForLocation(path);
-        }
-
-        return null;
-    }
-
-    /**
-     * Converts a {@link IPath} to an {@link IResource}, if possible.
-     *
-     * @param path a path to be converted
-     * @return the corresponding {@link IResource}, or null
-     */
-    public static IResource pathToResource(IPath path) {
-        IWorkspaceRoot workspace = ResourcesPlugin.getWorkspace().getRoot();
-
-        IFile[] files = workspace.findFilesForLocationURI(URIUtil.toURI(path.makeAbsolute()));
-        if (files.length > 0) {
-            return files[0];
-        }
-
-        IPath workspacePath = workspace.getLocation();
-        if (workspacePath.isPrefixOf(path)) {
-            IPath relativePath = path.makeRelativeTo(workspacePath);
-            return workspace.findMember(relativePath);
-        } else if (path.isAbsolute()) {
-            return workspace.getFileForLocation(path);
-        }
-
-        return null;
-    }
-
-    /**
-     * Returns all markers in a file/document that fit on the same line as the given offset
-     *
-     * @param markerType the marker type
-     * @param file the file containing the markers
-     * @param document the document showing the markers
-     * @param offset the offset to be checked
-     * @return a list (possibly empty but never null) of matching markers
-     */
-    @NonNull
-    public static List<IMarker> findMarkersOnLine(
-            @NonNull String markerType,
-            @NonNull IResource file,
-            @NonNull IDocument document,
-            int offset) {
-        List<IMarker> matchingMarkers = new ArrayList<IMarker>(2);
-        try {
-            IMarker[] markers = file.findMarkers(markerType, true, IResource.DEPTH_ZERO);
-
-            // Look for a match on the same line as the caret.
-            IRegion lineInfo = document.getLineInformationOfOffset(offset);
-            int lineStart = lineInfo.getOffset();
-            int lineEnd = lineStart + lineInfo.getLength();
-            int offsetLine = document.getLineOfOffset(offset);
-
-
-            for (IMarker marker : markers) {
-                int start = marker.getAttribute(IMarker.CHAR_START, -1);
-                int end = marker.getAttribute(IMarker.CHAR_END, -1);
-                if (start >= lineStart && start <= lineEnd && end > start) {
-                    matchingMarkers.add(marker);
-                } else if (start == -1 && end == -1) {
-                    // Some markers don't set character range, they only set the line
-                    int line = marker.getAttribute(IMarker.LINE_NUMBER, -1);
-                    if (line == offsetLine + 1) {
-                        matchingMarkers.add(marker);
-                    }
-                }
-            }
-        } catch (CoreException e) {
-            AdtPlugin.log(e, null);
-        } catch (BadLocationException e) {
-            AdtPlugin.log(e, null);
-        }
-
-        return matchingMarkers;
-    }
-
-    /**
-     * Returns the available and open Android projects
-     *
-     * @return the available and open Android projects, never null
-     */
-    @NonNull
-    public static IJavaProject[] getOpenAndroidProjects() {
-        return BaseProjectHelper.getAndroidProjects(new IProjectFilter() {
-            @Override
-            public boolean accept(IProject project) {
-                return project.isAccessible();
-            }
-        });
-    }
-
-    /**
-     * Returns a unique project name, based on the given {@code base} file name
-     * possibly with a {@code conjunction} and a new number behind it to ensure
-     * that the project name is unique. For example,
-     * {@code getUniqueProjectName("project", "_")} will return
-     * {@code "project"} if that name does not already exist, and if it does, it
-     * will return {@code "project_2"}.
-     *
-     * @param base the base name to use, such as "foo"
-     * @param conjunction a string to insert between the base name and the
-     *            number.
-     * @return a unique project name based on the given base and conjunction
-     */
-    public static String getUniqueProjectName(String base, String conjunction) {
-        // We're using all workspace projects here rather than just open Android project
-        // via getOpenAndroidProjects because the name cannot conflict with non-Android
-        // or closed projects either
-        IWorkspaceRoot workspaceRoot = ResourcesPlugin.getWorkspace().getRoot();
-        IProject[] projects = workspaceRoot.getProjects();
-
-        for (int i = 1; i < 1000; i++) {
-            String name = i == 1 ? base : base + conjunction + Integer.toString(i);
-            boolean found = false;
-            for (IProject project : projects) {
-                // Need to make case insensitive comparison, since otherwise we can hit
-                // org.eclipse.core.internal.resources.ResourceException:
-                // A resource exists with a different case: '/test'.
-                if (project.getName().equalsIgnoreCase(name)) {
-                    found = true;
-                    break;
-                }
-            }
-            if (!found) {
-                return name;
-            }
-        }
-
-        return base;
-    }
-
-    /**
-     * Returns the name of the parent folder for the given editor input
-     *
-     * @param editorInput the editor input to check
-     * @return the parent folder, which is never null but may be ""
-     */
-    @NonNull
-    public static String getParentFolderName(@Nullable IEditorInput editorInput) {
-        if (editorInput instanceof IFileEditorInput) {
-             IFile file = ((IFileEditorInput) editorInput).getFile();
-             return file.getParent().getName();
-        }
-
-        if (editorInput instanceof IURIEditorInput) {
-            IURIEditorInput urlEditorInput = (IURIEditorInput) editorInput;
-            String path = urlEditorInput.getURI().toString();
-            int lastIndex = path.lastIndexOf('/');
-            if (lastIndex != -1) {
-                int lastLastIndex = path.lastIndexOf('/', lastIndex - 1);
-                if (lastLastIndex != -1) {
-                    return path.substring(lastLastIndex + 1, lastIndex);
-                }
-            }
-        }
-
-        return "";
-    }
-
-    /**
-     * Returns the XML editor for the given editor part
-     *
-     * @param part the editor part to look up the editor for
-     * @return the editor or null if this part is not an XML editor
-     */
-    @Nullable
-    public static AndroidXmlEditor getXmlEditor(@NonNull IEditorPart part) {
-        if (part instanceof AndroidXmlEditor) {
-            return (AndroidXmlEditor) part;
-        } else if (part instanceof GraphicalEditorPart) {
-            ((GraphicalEditorPart) part).getEditorDelegate().getEditor();
-        }
-
-        return null;
-    }
-
-    /**
-     * Sets the given tools: attribute in the given XML editor document, adding
-     * the tools name space declaration if necessary, formatting the affected
-     * document region, and optionally comma-appending to an existing value and
-     * optionally opening and revealing the attribute.
-     *
-     * @param editor the associated editor
-     * @param element the associated element
-     * @param description the description of the attribute (shown in the undo
-     *            event)
-     * @param name the name of the attribute
-     * @param value the attribute value
-     * @param reveal if true, open the editor and select the given attribute
-     *            node
-     * @param appendValue if true, add this value as a comma separated value to
-     *            the existing attribute value, if any
-     */
-    public static void setToolsAttribute(
-            @NonNull final AndroidXmlEditor editor,
-            @NonNull final Element element,
-            @NonNull final String description,
-            @NonNull final String name,
-            @Nullable final String value,
-            final boolean reveal,
-            final boolean appendValue) {
-        editor.wrapUndoEditXmlModel(description, new Runnable() {
-            @Override
-            public void run() {
-                String prefix = XmlUtils.lookupNamespacePrefix(element, TOOLS_URI, null, true);
-                if (prefix == null) {
-                    // Add in new prefix...
-                    prefix = XmlUtils.lookupNamespacePrefix(element,
-                            TOOLS_URI, TOOLS_PREFIX, true /*create*/);
-                    if (value != null) {
-                        // ...and ensure that the header is formatted such that
-                        // the XML namespace declaration is placed in the right
-                        // position and wrapping is applied etc.
-                        editor.scheduleNodeReformat(editor.getUiRootNode(),
-                                true /*attributesOnly*/);
-                    }
-                }
-
-                String v = value;
-                if (appendValue && v != null) {
-                    String prev = element.getAttributeNS(TOOLS_URI, name);
-                    if (prev.length() > 0) {
-                        v = prev + ',' + value;
-                    }
-                }
-
-                // Use the non-namespace form of set attribute since we can't
-                // reference the namespace until the model has been reloaded
-                if (v != null) {
-                    element.setAttribute(prefix + ':' + name, v);
-                } else {
-                    element.removeAttribute(prefix + ':' + name);
-                }
-
-                UiElementNode rootUiNode = editor.getUiRootNode();
-                if (rootUiNode != null && v != null) {
-                    final UiElementNode uiNode = rootUiNode.findXmlNode(element);
-                    if (uiNode != null) {
-                        editor.scheduleNodeReformat(uiNode, true /*attributesOnly*/);
-
-                        if (reveal) {
-                            // Update editor selection after format
-                            Display display = AdtPlugin.getDisplay();
-                            if (display != null) {
-                                display.asyncExec(new Runnable() {
-                                    @Override
-                                    public void run() {
-                                        Node xmlNode = uiNode.getXmlNode();
-                                        Attr attribute = ((Element) xmlNode).getAttributeNodeNS(
-                                                TOOLS_URI, name);
-                                        if (attribute instanceof IndexedRegion) {
-                                            IndexedRegion region = (IndexedRegion) attribute;
-                                            editor.getStructuredTextEditor().selectAndReveal(
-                                                    region.getStartOffset(), region.getLength());
-                                        }
-                                    }
-                                });
-                            }
-                        }
-                    }
-                }
-            }
-        });
-    }
-
-    /**
-     * Returns a string label for the given target, of the form
-     * "API 16: Android 4.1 (Jelly Bean)".
-     *
-     * @param target the target to generate a string from
-     * @return a suitable display string
-     */
-    @NonNull
-    public static String getTargetLabel(@NonNull IAndroidTarget target) {
-        if (target.isPlatform()) {
-            AndroidVersion version = target.getVersion();
-            String codename = target.getProperty(PkgProps.PLATFORM_CODENAME);
-            String release = target.getProperty("ro.build.version.release"); //$NON-NLS-1$
-            if (codename != null) {
-                return String.format("API %1$d: Android %2$s (%3$s)",
-                        version.getApiLevel(),
-                        release,
-                        codename);
-            }
-            return String.format("API %1$d: Android %2$s", version.getApiLevel(),
-                    release);
-        }
-
-        return String.format("%1$s (API %2$s)", target.getFullName(),
-                target.getVersion().getApiString());
-    }
-
-    /**
-     * Sets the given tools: attribute in the given XML editor document, adding
-     * the tools name space declaration if necessary, and optionally
-     * comma-appending to an existing value.
-     *
-     * @param file the file associated with the element
-     * @param element the associated element
-     * @param description the description of the attribute (shown in the undo
-     *            event)
-     * @param name the name of the attribute
-     * @param value the attribute value
-     * @param appendValue if true, add this value as a comma separated value to
-     *            the existing attribute value, if any
-     */
-    public static void setToolsAttribute(
-            @NonNull final IFile file,
-            @NonNull final Element element,
-            @NonNull final String description,
-            @NonNull final String name,
-            @Nullable final String value,
-            final boolean appendValue) {
-        IModelManager modelManager = StructuredModelManager.getModelManager();
-        if (modelManager == null) {
-            return;
-        }
-
-        try {
-            IStructuredModel model = null;
-            if (model == null) {
-                model = modelManager.getModelForEdit(file);
-            }
-            if (model != null) {
-                try {
-                    model.aboutToChangeModel();
-                    if (model instanceof IDOMModel) {
-                        IDOMModel domModel = (IDOMModel) model;
-                        Document doc = domModel.getDocument();
-                        if (doc != null && element.getOwnerDocument() == doc) {
-                            String prefix = XmlUtils.lookupNamespacePrefix(element, TOOLS_URI,
-                                    null, true);
-                            if (prefix == null) {
-                                // Add in new prefix...
-                                prefix = XmlUtils.lookupNamespacePrefix(element,
-                                        TOOLS_URI, TOOLS_PREFIX, true);
-                            }
-
-                            String v = value;
-                            if (appendValue && v != null) {
-                                String prev = element.getAttributeNS(TOOLS_URI, name);
-                                if (prev.length() > 0) {
-                                    v = prev + ',' + value;
-                                }
-                            }
-
-                            // Use the non-namespace form of set attribute since we can't
-                            // reference the namespace until the model has been reloaded
-                            if (v != null) {
-                                element.setAttribute(prefix + ':' + name, v);
-                            } else {
-                                element.removeAttribute(prefix + ':' + name);
-                            }
-                        }
-                    }
-                } finally {
-                    model.changedModel();
-                    String updated = model.getStructuredDocument().get();
-                    model.releaseFromEdit();
-                    model.save(file);
-
-                    // Must also force a save on disk since the above model.save(file) often
-                    // (always?) has no effect.
-                    ITextFileBufferManager manager = FileBuffers.getTextFileBufferManager();
-                    NullProgressMonitor monitor = new NullProgressMonitor();
-                    IPath path = file.getFullPath();
-                    manager.connect(path, LocationKind.IFILE, monitor);
-                    try {
-                        ITextFileBuffer buffer = manager.getTextFileBuffer(path,
-                                LocationKind.IFILE);
-                        IDocument currentDocument = buffer.getDocument();
-                        currentDocument.set(updated);
-                        buffer.commit(monitor, true);
-                    } finally {
-                        manager.disconnect(path, LocationKind.IFILE,  monitor);
-                    }
-                }
-            }
-        } catch (Exception e) {
-            AdtPlugin.log(e, null);
-        }
-    }
-
-    /**
-     * Returns the Android version and code name of the given API level
-     *
-     * @param api the api level
-     * @return a suitable version display name
-     */
-    public static String getAndroidName(int api) {
-        if (api <= SdkVersionInfo.HIGHEST_KNOWN_API) {
-            return SdkVersionInfo.getAndroidName(api);
-        }
-
-        // Consult SDK manager to see if we know any more (later) names,
-        // installed by user
-        Sdk sdk = Sdk.getCurrent();
-        if (sdk != null) {
-            for (IAndroidTarget target : sdk.getTargets()) {
-                if (target.isPlatform()) {
-                    AndroidVersion version = target.getVersion();
-                    if (version.getApiLevel() == api) {
-                        return getTargetLabel(target);
-                    }
-                }
-            }
-        }
-
-        return "API " + api;
-    }
-
-    /**
-     * Returns the highest known API level to this version of ADT. The
-     * {@link #getAndroidName(int)} method will return real names up to and
-     * including this number.
-     *
-     * @return the highest known API number
-     */
-    public static int getHighestKnownApiLevel() {
-        return SdkVersionInfo.HIGHEST_KNOWN_API;
-    }
-
-    /**
-     * Returns a list of known API names
-     *
-     * @return a list of string API names, starting from 1 and up through the
-     *         maximum known versions (with no gaps)
-     */
-    public static String[] getKnownVersions() {
-        int max = getHighestKnownApiLevel();
-        Sdk sdk = Sdk.getCurrent();
-        if (sdk != null) {
-            for (IAndroidTarget target : sdk.getTargets()) {
-                if (target.isPlatform()) {
-                    AndroidVersion version = target.getVersion();
-                    if (!version.isPreview()) {
-                        max = Math.max(max, version.getApiLevel());
-                    }
-                }
-            }
-        }
-
-        String[] versions = new String[max];
-        for (int api = 1; api <= max; api++) {
-            versions[api-1] = getAndroidName(api);
-        }
-
-        return versions;
-    }
-
-    /**
-     * Returns the Android project(s) that are selected or active, if any. This
-     * considers the selection, the active editor, etc.
-     *
-     * @param selection the current selection
-     * @return a list of projects, possibly empty (but never null)
-     */
-    @NonNull
-    public static List<IProject> getSelectedProjects(@Nullable ISelection selection) {
-        List<IProject> projects = new ArrayList<IProject>();
-
-        if (selection instanceof IStructuredSelection) {
-            IStructuredSelection structuredSelection = (IStructuredSelection) selection;
-            // get the unique selected item.
-            Iterator<?> iterator = structuredSelection.iterator();
-            while (iterator.hasNext()) {
-                Object element = iterator.next();
-
-                // First look up the resource (since some adaptables
-                // provide an IResource but not an IProject, and we can
-                // always go from IResource to IProject)
-                IResource resource = null;
-                if (element instanceof IResource) { // may include IProject
-                   resource = (IResource) element;
-                } else if (element instanceof IAdaptable) {
-                    IAdaptable adaptable = (IAdaptable)element;
-                    Object adapter = adaptable.getAdapter(IResource.class);
-                    resource = (IResource) adapter;
-                }
-
-                // get the project object from it.
-                IProject project = null;
-                if (resource != null) {
-                    project = resource.getProject();
-                } else if (element instanceof IAdaptable) {
-                    project = (IProject) ((IAdaptable) element).getAdapter(IProject.class);
-                }
-
-                if (project != null && !projects.contains(project)) {
-                    projects.add(project);
-                }
-            }
-        }
-
-        if (projects.isEmpty()) {
-            // Try to look at the active editor instead
-            IFile file = AdtUtils.getActiveFile();
-            if (file != null) {
-                projects.add(file.getProject());
-            }
-        }
-
-        if (projects.isEmpty()) {
-            // If we didn't find a default project based on the selection, check how many
-            // open Android projects we can find in the current workspace. If there's only
-            // one, we'll just select it by default.
-            IJavaProject[] open = AdtUtils.getOpenAndroidProjects();
-            for (IJavaProject project : open) {
-                projects.add(project.getProject());
-            }
-            return projects;
-        } else {
-            // Make sure all the projects are Android projects
-            List<IProject> androidProjects = new ArrayList<IProject>(projects.size());
-            for (IProject project : projects) {
-                if (BaseProjectHelper.isAndroidProject(project)) {
-                    androidProjects.add(project);
-                }
-            }
-            return androidProjects;
-        }
-    }
-
-    private static Boolean sEclipse4;
-
-    /**
-     * Returns true if the running Eclipse is version 4.x or later
-     *
-     * @return true if the current Eclipse version is 4.x or later, false
-     *         otherwise
-     */
-    public static boolean isEclipse4() {
-        if (sEclipse4 == null) {
-            sEclipse4 = Platform.getBundle("org.eclipse.e4.ui.model.workbench") != null; //$NON-NLS-1$
-        }
-
-        return sEclipse4;
-    }
-
-    /**
-     * Reads the contents of an {@link IFile} and return it as a byte array
-     *
-     * @param file the file to be read
-     * @return the String read from the file, or null if there was an error
-     */
-    @SuppressWarnings("resource") // Eclipse doesn't understand Closeables.closeQuietly yet
-    @Nullable
-    public static byte[] readData(@NonNull IFile file) {
-        InputStream contents = null;
-        try {
-            contents = file.getContents();
-            return ByteStreams.toByteArray(contents);
-        } catch (Exception e) {
-            // Pass -- just return null
-        } finally {
-            Closeables.closeQuietly(contents);
-        }
-
-        return null;
-    }
-
-    /**
-     * Ensure that a given folder (and all its parents) are created. This implements
-     * the equivalent of {@link File#mkdirs()} for {@link IContainer} folders.
-     *
-     * @param container the container to ensure exists
-     * @throws CoreException if an error occurs
-     */
-    public static void ensureExists(@Nullable IContainer container) throws CoreException {
-        if (container == null || container.exists()) {
-            return;
-        }
-        IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
-        IFolder folder = root.getFolder(container.getFullPath());
-        ensureExists(folder);
-    }
-
-    private static void ensureExists(IFolder folder) throws CoreException {
-        if (folder != null && !folder.exists()) {
-            IContainer parent = folder.getParent();
-            if (parent instanceof IFolder) {
-                ensureExists((IFolder) parent);
-            }
-            folder.create(false, false, null);
-        }
-    }
-
-    /**
-     * Format the given floating value into an XML string, omitting decimals if
-     * 0
-     *
-     * @param value the value to be formatted
-     * @return the corresponding XML string for the value
-     */
-    public static String formatFloatAttribute(float value) {
-        if (value != (int) value) {
-            // Run String.format without a locale, because we don't want locale-specific
-            // conversions here like separating the decimal part with a comma instead of a dot!
-            return String.format((Locale) null, "%.2f", value); //$NON-NLS-1$
-        } else {
-            return Integer.toString((int) value);
-        }
-    }
-
-    /**
-     * Creates all the directories required for the given path.
-     *
-     * @param wsPath the path to create all the parent directories for
-     * @return true if all the parent directories were created
-     */
-    public static boolean createWsParentDirectory(IContainer wsPath) {
-        if (wsPath.getType() == IResource.FOLDER) {
-            if (wsPath.exists()) {
-                return true;
-            }
-
-            IFolder folder = (IFolder) wsPath;
-            try {
-                if (createWsParentDirectory(wsPath.getParent())) {
-                    folder.create(true /* force */, true /* local */, null /* monitor */);
-                    return true;
-                }
-            } catch (CoreException e) {
-                e.printStackTrace();
-            }
-        }
-
-        return false;
-    }
-
-    /**
-     * Lists the files of the given directory and returns them as an array which
-     * is never null. This simplifies processing file listings from for each
-     * loops since {@link File#listFiles} can return null. This method simply
-     * wraps it and makes sure it returns an empty array instead if necessary.
-     *
-     * @param dir the directory to list
-     * @return the children, or empty if it has no children, is not a directory,
-     *         etc.
-     */
-    @NonNull
-    public static File[] listFiles(File dir) {
-        File[] files = dir.listFiles();
-        if (files != null) {
-            return files;
-        } else {
-            return new File[0];
-        }
-    }
-
-    /**
-     * Closes all open editors that are showing a file for the given project. This method
-     * should be called when a project is closed or deleted.
-     * <p>
-     * This method can be called from any thread, but if it is not called on the GUI thread
-     * the editor will be closed asynchronously.
-     *
-     * @param project the project to close all editors for
-     * @param save whether unsaved editors should be saved first
-     */
-    public static void closeEditors(@NonNull final IProject project, final boolean save) {
-        final Display display = AdtPlugin.getDisplay();
-        if (display == null || display.isDisposed()) {
-            return;
-        }
-        if (display.getThread() != Thread.currentThread()) {
-            display.asyncExec(new Runnable() {
-                @Override
-                public void run() {
-                    closeEditors(project, save);
-                }
-            });
-            return;
-        }
-
-        // Close editors for removed files
-        IWorkbench workbench = PlatformUI.getWorkbench();
-        for (IWorkbenchWindow window : workbench.getWorkbenchWindows()) {
-            for (IWorkbenchPage page : window.getPages()) {
-                List<IEditorReference> matching = null;
-                for (IEditorReference ref : page.getEditorReferences()) {
-                    boolean close = false;
-                    try {
-                        IEditorInput input = ref.getEditorInput();
-                        if (input instanceof IFileEditorInput) {
-                            IFileEditorInput fileInput = (IFileEditorInput) input;
-                            if (project.equals(fileInput.getFile().getProject())) {
-                                close = true;
-                            }
-                        }
-                    } catch (PartInitException ex) {
-                        close = true;
-                    }
-                    if (close) {
-                        if (matching == null) {
-                            matching = new ArrayList<IEditorReference>(2);
-                        }
-                        matching.add(ref);
-                    }
-                }
-                if (matching != null) {
-                    IEditorReference[] refs = new IEditorReference[matching.size()];
-                    page.closeEditors(matching.toArray(refs), save);
-                }
-            }
-        }
-    }
-
-    /**
-     * Closes all open editors for the given file. Note that a file can be open in
-     * more than one editor, for example by using Open With on the file to choose different
-     * editors.
-     * <p>
-     * This method can be called from any thread, but if it is not called on the GUI thread
-     * the editor will be closed asynchronously.
-     *
-     * @param file the file whose editors should be closed.
-     * @param save whether unsaved editors should be saved first
-     */
-    public static void closeEditors(@NonNull final IFile file, final boolean save) {
-        final Display display = AdtPlugin.getDisplay();
-        if (display == null || display.isDisposed()) {
-            return;
-        }
-        if (display.getThread() != Thread.currentThread()) {
-            display.asyncExec(new Runnable() {
-                @Override
-                public void run() {
-                    closeEditors(file, save);
-                }
-            });
-            return;
-        }
-
-        // Close editors for removed files
-        IWorkbench workbench = PlatformUI.getWorkbench();
-        for (IWorkbenchWindow window : workbench.getWorkbenchWindows()) {
-            for (IWorkbenchPage page : window.getPages()) {
-                List<IEditorReference> matching = null;
-                for (IEditorReference ref : page.getEditorReferences()) {
-                    boolean close = false;
-                    try {
-                        IEditorInput input = ref.getEditorInput();
-                        if (input instanceof IFileEditorInput) {
-                            IFileEditorInput fileInput = (IFileEditorInput) input;
-                            if (file.equals(fileInput.getFile())) {
-                                close = true;
-                            }
-                        }
-                    } catch (PartInitException ex) {
-                        close = true;
-                    }
-                    if (close) {
-                        // Found
-                        if (matching == null) {
-                            matching = new ArrayList<IEditorReference>(2);
-                        }
-                        matching.add(ref);
-                        // We don't break here in case the file is
-                        // opened multiple times with different editors.
-                    }
-                }
-                if (matching != null) {
-                    IEditorReference[] refs = new IEditorReference[matching.size()];
-                    page.closeEditors(matching.toArray(refs), save);
-                }
-            }
-        }
-    }
-
-    /**
-     * Returns the offset region of the given 0-based line number in the given
-     * file
-     *
-     * @param file the file to look up the line number in
-     * @param line the line number (0-based, meaning that the first line is line
-     *            0)
-     * @return the corresponding offset range, or null
-     */
-    @Nullable
-    public static IRegion getRegionOfLine(@NonNull IFile file, int line) {
-        IDocumentProvider provider = new TextFileDocumentProvider();
-        try {
-            provider.connect(file);
-            IDocument document = provider.getDocument(file);
-            if (document != null) {
-                return document.getLineInformation(line);
-            }
-        } catch (Exception e) {
-            AdtPlugin.log(e, "Can't find range information for %1$s", file.getName());
-        } finally {
-            provider.disconnect(file);
-        }
-
-        return null;
-    }
-
-    /**
-     * Returns all resource variations for the given file
-     *
-     * @param file resource file, which should be an XML file in one of the
-     *            various resource folders, e.g. res/layout, res/values-xlarge, etc.
-     * @param includeSelf if true, include the file itself in the list,
-     *            otherwise exclude it
-     * @return a list of all the resource variations
-     */
-    public static List<IFile> getResourceVariations(@Nullable IFile file, boolean includeSelf) {
-        if (file == null) {
-            return Collections.emptyList();
-        }
-
-        // Compute the set of layout files defining this layout resource
-        List<IFile> variations = new ArrayList<IFile>();
-        String name = file.getName();
-        IContainer parent = file.getParent();
-        if (parent != null) {
-            IContainer resFolder = parent.getParent();
-            if (resFolder != null) {
-                String parentName = parent.getName();
-                String prefix = parentName;
-                int qualifiers = prefix.indexOf('-');
-
-                if (qualifiers != -1) {
-                    parentName = prefix.substring(0, qualifiers);
-                    prefix = prefix.substring(0, qualifiers + 1);
-                } else {
-                    prefix = prefix + '-';
-                }
-                try {
-                    for (IResource resource : resFolder.members()) {
-                        String n = resource.getName();
-                        if ((n.startsWith(prefix) || n.equals(parentName))
-                                && resource instanceof IContainer) {
-                            IContainer layoutFolder = (IContainer) resource;
-                            IResource r = layoutFolder.findMember(name);
-                            if (r instanceof IFile) {
-                                IFile variation = (IFile) r;
-                                if (!includeSelf && file.equals(variation)) {
-                                    continue;
-                                }
-                                variations.add(variation);
-                            }
-                        }
-                    }
-                } catch (CoreException e) {
-                    AdtPlugin.log(e, null);
-                }
-            }
-        }
-
-        return variations;
-    }
-
-    /**
-     * Returns whether the current thread is the UI thread
-     *
-     * @return true if the current thread is the UI thread
-     */
-    public static boolean isUiThread() {
-        return AdtPlugin.getDisplay() != null
-                && AdtPlugin.getDisplay().getThread() == Thread.currentThread();
-    }
-
-    /**
-     * Replaces any {@code \\uNNNN} references in the given string with the corresponding
-     * unicode characters.
-     *
-     * @param s the string to perform replacements in
-     * @return the string with unicode escapes replaced with actual characters
-     */
-    @NonNull
-    public static String replaceUnicodeEscapes(@NonNull String s) {
-        // Handle unicode escapes
-        if (s.indexOf("\\u") != -1) { //$NON-NLS-1$
-            StringBuilder sb = new StringBuilder(s.length());
-            for (int i = 0, n = s.length(); i < n; i++) {
-                char c = s.charAt(i);
-                if (c == '\\' && i < n - 1) {
-                    char next = s.charAt(i + 1);
-                    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 nufe) {
-                            // Invalid escape: Just proceed to literally transcribe it
-                            sb.append(c);
-                        }
-                    } else {
-                        sb.append(c);
-                        sb.append(next);
-                        i++;
-                        continue;
-                    }
-                } else {
-                    sb.append(c);
-                }
-            }
-            s = sb.toString();
-        }
-
-        return s;
-    }
-
-    /**
-     * Looks up the {@link ResourceFolderType} corresponding to a given
-     * {@link ResourceType}: the folder where those resources can be found.
-     * <p>
-     * Note that {@link ResourceType#ID} is a special case: it can not just
-     * be defined in {@link ResourceFolderType#VALUES}, but it can also be
-     * defined inline via {@code @+id} in {@link ResourceFolderType#LAYOUT} and
-     * {@link ResourceFolderType#MENU} folders.
-     *
-     * @param type the resource type
-     * @return the corresponding resource folder type
-     */
-    @NonNull
-    public static ResourceFolderType getFolderTypeFor(@NonNull ResourceType type) {
-        switch (type) {
-            case ANIM:
-                return ResourceFolderType.ANIM;
-            case ANIMATOR:
-                return ResourceFolderType.ANIMATOR;
-            case ARRAY:
-                return ResourceFolderType.VALUES;
-            case COLOR:
-                return ResourceFolderType.COLOR;
-            case DRAWABLE:
-                return ResourceFolderType.DRAWABLE;
-            case INTERPOLATOR:
-                return ResourceFolderType.INTERPOLATOR;
-            case LAYOUT:
-                return ResourceFolderType.LAYOUT;
-            case MENU:
-                return ResourceFolderType.MENU;
-            case MIPMAP:
-                return ResourceFolderType.MIPMAP;
-            case RAW:
-                return ResourceFolderType.RAW;
-            case XML:
-                return ResourceFolderType.XML;
-            case ATTR:
-            case BOOL:
-            case DECLARE_STYLEABLE:
-            case DIMEN:
-            case FRACTION:
-            case ID:
-            case INTEGER:
-            case PLURALS:
-            case PUBLIC:
-            case STRING:
-            case STYLE:
-            case STYLEABLE:
-                return ResourceFolderType.VALUES;
-            default:
-                assert false : type;
-            return ResourceFolderType.VALUES;
-
-        }
-    }
-
-    /**
-     * Looks up the {@link ResourceType} defined in a given {@link ResourceFolderType}.
-     * <p>
-     * Note that for {@link ResourceFolderType#VALUES} there are many, many
-     * different types of resources that can be defined, so this method returns
-     * {@code null} for that scenario.
-     * <p>
-     * Note also that {@link ResourceType#ID} is a special case: it can not just
-     * be defined in {@link ResourceFolderType#VALUES}, but it can also be
-     * defined inline via {@code @+id} in {@link ResourceFolderType#LAYOUT} and
-     * {@link ResourceFolderType#MENU} folders.
-     *
-     * @param folderType the resource folder type
-     * @return the corresponding resource type, or null if {@code folderType} is
-     *         {@link ResourceFolderType#VALUES}
-     */
-    @Nullable
-    public static ResourceType getResourceTypeFor(@NonNull ResourceFolderType folderType) {
-        switch (folderType) {
-            case ANIM:
-                return ResourceType.ANIM;
-            case ANIMATOR:
-                return ResourceType.ANIMATOR;
-            case COLOR:
-                return ResourceType.COLOR;
-            case DRAWABLE:
-                return ResourceType.DRAWABLE;
-            case INTERPOLATOR:
-                return ResourceType.INTERPOLATOR;
-            case LAYOUT:
-                return ResourceType.LAYOUT;
-            case MENU:
-                return ResourceType.MENU;
-            case MIPMAP:
-                return ResourceType.MIPMAP;
-            case RAW:
-                return ResourceType.RAW;
-            case XML:
-                return ResourceType.XML;
-            case VALUES:
-                return null;
-            default:
-                assert false : folderType;
-                return null;
-        }
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/AndroidPrintStream.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/AndroidPrintStream.java
deleted file mode 100644
index 9eac361..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/AndroidPrintStream.java
+++ /dev/null
@@ -1,89 +0,0 @@
-/*
- * Copyright (C) 2010 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;
-
-import org.eclipse.core.resources.IProject;
-
-import java.io.OutputStream;
-import java.io.PrintStream;
-import java.util.Calendar;
-
-/**
- * Custom PrintStream allowing to precede the message with a tag containing data/project info.
- *
- * Additionally, a prefix can be set (and removed) at runtime.
- *
- * Only {@link #println()} is supported.
- */
-public class AndroidPrintStream extends PrintStream {
-    private IProject mProject;
-    private String mPrefix;
-
-    /**
-     * Default constructor with project and output stream.
-     * The project is used to get the project name for the output tag.
-     *
-     * @param project The Project
-     * @param prefix A prefix to be printed before the actual message. Can be null
-     * @param stream The Stream
-     */
-    public AndroidPrintStream(IProject project, String prefix, OutputStream stream) {
-        super(stream);
-        mProject = project;
-    }
-
-    /**
-     * Updates the value of the prefix.
-     * @param prefix
-     */
-    public void setPrefix(String prefix) {
-        mPrefix = prefix;
-    }
-
-    @Override
-    public void println(String message) {
-        // write the date/project tag first.
-        String tag = getMessageTag(mProject != null ? mProject.getName() : null);
-
-        print(tag);
-        print(" "); //$NON-NLS-1$
-        if (mPrefix != null) {
-            print(mPrefix);
-            print(" "); //$NON-NLS-1$
-        }
-
-        // then write the regular message
-        super.println(message);
-    }
-
-    /**
-     * Creates a string containing the current date/time, and the tag.
-     * The tag does not end with a whitespace.
-     * @param tag The tag associated to the message. Can be null
-     * @return The dateTag
-     */
-    public static String getMessageTag(String tag) {
-        Calendar c = Calendar.getInstance();
-
-        if (tag == null) {
-            return String.format(Messages.Console_Date_Tag, c);
-        }
-
-        return String.format(Messages.Console_Data_Project_Tag, c, tag);
-    }
-
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/DebuggerConnector.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/DebuggerConnector.java
deleted file mode 100644
index 233ab2e..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/DebuggerConnector.java
+++ /dev/null
@@ -1,159 +0,0 @@
-/*
- * Copyright (C) 2010 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;
-
-import com.android.ide.eclipse.adt.internal.launch.AndroidLaunchController;
-import com.android.ide.eclipse.adt.internal.project.ProjectHelper;
-import com.android.ide.eclipse.adt.internal.resources.manager.GlobalProjectMonitor;
-import com.android.ide.eclipse.adt.internal.resources.manager.GlobalProjectMonitor.IProjectListener;
-import com.android.ide.eclipse.ddms.IDebuggerConnector;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.IPath;
-
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Map.Entry;
-import java.util.Set;
-
-/**
- * Implementation of the com.android.ide.ddms.debuggerConnector extension point.
- */
-public class DebuggerConnector implements IDebuggerConnector {
-    private WorkspaceAppCache mWorkspaceAppCache;
-
-    public DebuggerConnector() {
-        mWorkspaceAppCache = new WorkspaceAppCache();
-        GlobalProjectMonitor.getMonitor().addProjectListener(mWorkspaceAppCache);
-    }
-
-    @Override
-    public boolean connectDebugger(String appName, int appPort, int selectedPort) {
-        // search for an android project matching the process name
-        IProject project = ProjectHelper.findAndroidProjectByAppName(appName);
-        if (project != null) {
-            AndroidLaunchController.debugRunningApp(project, appPort);
-            return true;
-        }
-
-        return false;
-    }
-
-    /** {@inheritDoc} */
-    @Override
-    public boolean isWorkspaceApp(String appName) {
-        return mWorkspaceAppCache.isWorkspaceApp(appName);
-    }
-
-    /**
-     * A cache of Android application name to workspace project name mappings.
-     * Users can query whether an application is present in the workspace using
-     * {@link #isWorkspaceApp(String)}. The cache listens to workspace changes
-     * (project open/close/delete etc), and keeps its internal mappings up-to-date.<br>
-     * This class is designed with the following assumptions:
-     * <ul>
-     *   <li> There are a significant number of calls to {@link #isWorkspaceApp(String)}, with
-     *        a large number of possible application names as arguments. </li>
-     *   <li> The number of projects actually present in the workspace, and the
-     *        number of user initiated project changes (project open/close/delete/rename) are both
-     *        relatively small. </li>
-     * </ul>
-     */
-    static class WorkspaceAppCache implements IProjectListener {
-        /** Apps known to be not in the workspace. */
-        private Set<String> mAppsNotInWorkspace;
-
-        /** Mapping of application name to project name for apps present in the workspace. */
-        private Map<String, String> mAppsInWorkspace;
-
-        public WorkspaceAppCache() {
-            mAppsNotInWorkspace = new HashSet<String>();
-            mAppsInWorkspace = new HashMap<String, String>();
-        }
-
-        public boolean isWorkspaceApp(String appName) {
-            if (mAppsNotInWorkspace.contains(appName)) {
-                return false;
-            }
-
-            String projectName = mAppsInWorkspace.get(appName);
-            if (projectName == null) {
-                IProject p = ProjectHelper.findAndroidProjectByAppName(appName);
-                if (p == null) {
-                    mAppsNotInWorkspace.add(appName);
-                } else {
-                    projectName = p.getName();
-                    mAppsInWorkspace.put(appName, projectName);
-                }
-            }
-            return projectName != null;
-        }
-
-        /** {@inheritDoc} */
-        @Override
-        public void projectRenamed(IProject project, IPath from) {
-            // when a project is renamed, ideally we should just update the current
-            // known mapping of app name -> project name. However, the projectRenamed
-            // callback is called only after projectDeleted() and projectOpened() are called,
-            // so there is really nothing we can do here..
-        }
-
-        /** {@inheritDoc} */
-        @Override
-        public void projectOpenedWithWorkspace(IProject project) {
-            // don't do anything as the cache is lazily initialized
-        }
-
-        @Override
-        public void allProjectsOpenedWithWorkspace() {
-            // don't do anything as the cache is lazily initialized
-        }
-
-        /** {@inheritDoc} */
-        @Override
-        public void projectOpened(IProject project) {
-            // A newly opened project could contribute some Android application.
-            // So we invalidate the set of apps that are known to be not in the workspace, as
-            // that set could be out of date now.
-            mAppsNotInWorkspace.clear();
-        }
-
-        /** {@inheritDoc} */
-        @Override
-        public void projectDeleted(IProject project) {
-            // Deletion is effectively the same as closing
-            projectClosed(project);
-        }
-
-        /** {@inheritDoc} */
-        @Override
-        public void projectClosed(IProject project) {
-            // When a project is closed, remove all mappings contributed by the project.
-            Map<String, String> updatedCache = new HashMap<String, String>();
-
-            String name = project.getName();
-            for (Entry<String, String> e : mAppsInWorkspace.entrySet()) {
-                if (!e.getValue().equals(name)) {
-                    updatedCache.put(e.getKey(), e.getValue());
-                }
-            }
-
-            mAppsInWorkspace = updatedCache;
-        }
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/Messages.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/Messages.java
deleted file mode 100644
index 413c792..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/Messages.java
+++ /dev/null
@@ -1,44 +0,0 @@
-
-package com.android.ide.eclipse.adt;
-
-import org.eclipse.osgi.util.NLS;
-
-public class Messages extends NLS {
-    private static final String BUNDLE_NAME = "com.android.ide.eclipse.adt.messages"; //$NON-NLS-1$
-
-    public static String AdtPlugin_Android_SDK_Content_Loader;
-
-    public static String AdtPlugin_Android_SDK_Resource_Parser;
-
-    public static String AdtPlugin_Failed_To_Parse_s;
-
-    public static String AdtPlugin_Failed_To_Start_s;
-
-    public static String Console_Data_Project_Tag;
-
-    public static String Console_Date_Tag;
-
-    public static String Could_Not_Find;
-
-    public static String Could_Not_Find_Folder;
-
-    public static String Could_Not_Find_Folder_In_SDK;
-
-    public static String VersionCheck_Plugin_Too_Old;
-
-    public static String VersionCheck_Plugin_Version_Failed;
-
-    public static String VersionCheck_Build_Tool_Missing;
-
-    public static String VersionCheck_Tools_Too_Old;
-
-    public static String VersionCheck_Unable_To_Parse_Version_s;
-
-    static {
-        // initialize resource bundle
-        NLS.initializeMessages(BUNDLE_NAME, Messages.class);
-    }
-
-    private Messages() {
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/SourceRevealer.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/SourceRevealer.java
deleted file mode 100644
index b1b5390..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/SourceRevealer.java
+++ /dev/null
@@ -1,465 +0,0 @@
-/*
- * Copyright (C) 2010 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;
-
-import static com.android.SdkConstants.CLASS_CONSTRUCTOR;
-import static com.android.SdkConstants.CONSTRUCTOR_NAME;
-
-import com.android.ide.eclipse.adt.internal.project.BaseProjectHelper;
-import com.android.ide.eclipse.adt.internal.project.ProjectHelper;
-import com.android.ide.eclipse.ddms.ISourceRevealer;
-import com.google.common.base.Predicate;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.jdt.core.ICompilationUnit;
-import org.eclipse.jdt.core.IJavaElement;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.IMethod;
-import org.eclipse.jdt.core.ISourceRange;
-import org.eclipse.jdt.core.IType;
-import org.eclipse.jdt.core.JavaModelException;
-import org.eclipse.jdt.core.search.IJavaSearchConstants;
-import org.eclipse.jdt.core.search.SearchEngine;
-import org.eclipse.jdt.core.search.SearchMatch;
-import org.eclipse.jdt.core.search.SearchParticipant;
-import org.eclipse.jdt.core.search.SearchPattern;
-import org.eclipse.jdt.core.search.SearchRequestor;
-import org.eclipse.jdt.ui.JavaUI;
-import org.eclipse.jface.text.IRegion;
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-import org.eclipse.jface.viewers.LabelProvider;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.window.Window;
-import org.eclipse.ui.IPerspectiveRegistry;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.WorkbenchException;
-import org.eclipse.ui.dialogs.ListDialog;
-import org.eclipse.ui.ide.IDE;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-/**
- * Implementation of the com.android.ide.ddms.sourceRevealer extension point.
- * Note that this code is duplicated in the PDT plugin's SourceRevealer as well.
- */
-public class SourceRevealer implements ISourceRevealer {
-    @Override
-    public boolean reveal(String applicationName, String className, int line) {
-        IProject project = ProjectHelper.findAndroidProjectByAppName(applicationName);
-        if (project != null) {
-            return BaseProjectHelper.revealSource(project, className, line);
-        }
-
-        return false;
-    }
-
-    /**
-     * Reveal the source for given fully qualified method name.<br>
-     *
-     * The method should take care of the following scenarios:<ol>
-     * <li> A search, either by filename/line number, or for fqmn might provide only 1 result.
-     *    In such a case, just open that result. Give preference to the file name/line # search
-     *    since that is the most accurate (gets to the line number). </li>
-     * <li> The search might not provide any results. e.g, the method name may be of the form
-     *    "com.x.y$1.methodName". Searches for methods within anonymous classes will fail. In
-     *    such a case, if the fileName:lineNumber argument is available, a search for that
-     *    should be made instead. </li>
-     * <li> The search might provide multiple results. In such a case, the fileName/lineNumber
-     *    values should be utilized to narrow down the results.</li>
-     * </ol>
-     *
-     * @param fqmn fully qualified method name
-     * @param fileName file name in which the method is present, null if not known
-     * @param lineNumber line number in the file which should be given focus, -1 if not known.
-     *        Line numbers begin at 1, not 0.
-     * @param perspective perspective to switch to before the source is revealed, null to not
-     *        switch perspectives
-     */
-    @Override
-    public boolean revealMethod(String fqmn, String fileName, int lineNumber, String perspective) {
-        // Search by filename:linenumber. If there is just one result for it, that would
-        // be the correct match that is accurate to the line
-        List<SearchMatch> fileMatches = Collections.emptyList();
-        if (fileName != null && lineNumber >= 0) {
-            fileMatches = searchForFile(fileName);
-            if (fileMatches.size() == 1) {
-                return revealLineMatch(fileMatches, fileName, lineNumber, perspective);
-            }
-        }
-
-        List<SearchMatch> methodMatches = searchForMethod(fqmn);
-
-        // if there is a unique method name match:
-        //    1. if there are > 1 file name matches, try to see if they can be narrowed down
-        //    2. if not, display the method match
-        if (methodMatches.size() == 1) {
-            if (fileMatches.size() > 0) {
-                List<SearchMatch> filteredMatches = filterMatchByResource(fileMatches,
-                                                        methodMatches.get(0).getResource());
-                if (filteredMatches.size() == 1) {
-                    return revealLineMatch(filteredMatches, fileName, lineNumber, perspective);
-                }
-            } else if (fileName != null && lineNumber > 0) {
-                // Couldn't find file match, but we have a filename and line number: attempt
-                // to use this to pinpoint the location within the method
-                IMethod method = (IMethod) methodMatches.get(0).getElement();
-                IJavaElement element = method;
-                while (element != null) {
-                    if (element instanceof ICompilationUnit) {
-                        ICompilationUnit unit = ((ICompilationUnit) element).getPrimary();
-                        IResource resource = unit.getResource();
-                        if (resource instanceof IFile) {
-                            IFile file = (IFile) resource;
-
-                            try {
-                                // See if the line number looks like it's inside the given method
-                                ISourceRange sourceRange = method.getSourceRange();
-                                IRegion region = AdtUtils.getRegionOfLine(file, lineNumber - 1);
-                                // When fields are initialized with code, this logically belongs
-                                // to the constructor, but the line numbers are outside of the
-                                // constructor. In this case we'll trust the line number rather
-                                // than the method range.
-                                boolean isConstructor = fqmn.endsWith(CONSTRUCTOR_NAME);
-                                if (isConstructor
-                                        || region != null
-                                            && region.getOffset() >= sourceRange.getOffset()
-                                            && region.getOffset() < sourceRange.getOffset()
-                                            + sourceRange.getLength()) {
-                                    // Yes: use the line number instead
-                                    if (perspective != null) {
-                                        SourceRevealer.switchToPerspective(perspective);
-                                    }
-                                    return displayFile(file, lineNumber);
-                                }
-
-                            } catch (JavaModelException e) {
-                                AdtPlugin.log(e, null);
-                            }
-                        }
-                    }
-                    element = element.getParent();
-                }
-
-            }
-
-            return displayMethod((IMethod) methodMatches.get(0).getElement(), perspective);
-        }
-
-        // no matches for search by method, so search by filename
-        if (methodMatches.size() == 0) {
-            if (fileMatches.size() > 0) {
-                return revealLineMatch(fileMatches, fileName, lineNumber, perspective);
-            } else {
-                // Last ditch effort: attempt to look up the class corresponding to the fqn
-                // and jump to the line there
-                if (fileMatches.isEmpty() && fqmn.indexOf('.') != -1) {
-                    String className = fqmn.substring(0, fqmn.lastIndexOf('.'));
-                    for (IJavaProject project : BaseProjectHelper.getAndroidProjects(null)) {
-                        IType type;
-                        try {
-                            type = project.findType(className);
-                            if (type != null && type.exists()) {
-                                IResource resource = type.getResource();
-                                if (resource instanceof IFile) {
-                                    if (perspective != null) {
-                                        SourceRevealer.switchToPerspective(perspective);
-                                    }
-                                    return displayFile((IFile) resource, lineNumber);
-                                }
-                            }
-                        } catch (JavaModelException e) {
-                            AdtPlugin.log(e, null);
-                        }
-                    }
-                }
-
-                return false;
-            }
-        }
-
-        // multiple matches for search by method, narrow down by filename
-        if (fileName != null) {
-            return revealLineMatch(
-                    filterMatchByFileName(methodMatches, fileName),
-                    fileName, lineNumber, perspective);
-        }
-
-        // prompt the user
-        SearchMatch match = getMatchToDisplay(methodMatches, fqmn);
-        if (match == null) {
-            return false;
-        } else {
-            return displayMethod((IMethod) match.getElement(), perspective);
-        }
-    }
-
-    private boolean revealLineMatch(List<SearchMatch> matches, String fileName, int lineNumber,
-            String perspective) {
-        SearchMatch match = getMatchToDisplay(matches,
-                String.format("%s:%d", fileName, lineNumber));
-        if (match == null) {
-            return false;
-        }
-
-        if (perspective != null) {
-            SourceRevealer.switchToPerspective(perspective);
-        }
-
-        return displayFile((IFile) match.getResource(), lineNumber);
-    }
-
-    private boolean displayFile(IFile file, int lineNumber) {
-        try {
-            IMarker marker = file.createMarker(IMarker.TEXT);
-            marker.setAttribute(IMarker.LINE_NUMBER, lineNumber);
-            IDE.openEditor(
-                    PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage(),
-                    marker);
-            marker.delete();
-            return true;
-        } catch (CoreException e) {
-            AdtPlugin.printErrorToConsole(e.getMessage());
-            return false;
-        }
-    }
-
-    private boolean displayMethod(IMethod method, String perspective) {
-        if (perspective != null) {
-            SourceRevealer.switchToPerspective(perspective);
-        }
-
-        try {
-            JavaUI.openInEditor(method);
-            return true;
-        } catch (Exception e) {
-            AdtPlugin.printErrorToConsole(e.getMessage());
-            return false;
-        }
-    }
-
-    private List<SearchMatch> filterMatchByFileName(List<SearchMatch> matches, String fileName) {
-        if (fileName == null) {
-            return matches;
-        }
-
-        // Use a map to collapse multiple matches in a single file into just one match since
-        // we know the line number in the file.
-        Map<IResource, SearchMatch> matchesPerFile =
-                new HashMap<IResource, SearchMatch>(matches.size());
-
-        for (SearchMatch m: matches) {
-            if (m.getResource() instanceof IFile
-                    && m.getResource().getName().startsWith(fileName)) {
-                matchesPerFile.put(m.getResource(), m);
-            }
-        }
-
-        List<SearchMatch> filteredMatches = new ArrayList<SearchMatch>(matchesPerFile.values());
-
-        // sort results, first by project name, then by file name
-        Collections.sort(filteredMatches, new Comparator<SearchMatch>() {
-            @Override
-            public int compare(SearchMatch m1, SearchMatch m2) {
-                String p1 = m1.getResource().getProject().getName();
-                String p2 = m2.getResource().getProject().getName();
-
-                if (!p1.equals(p2)) {
-                    return p1.compareTo(p2);
-                }
-
-                String r1 = m1.getResource().getName();
-                String r2 = m2.getResource().getName();
-                return r1.compareTo(r2);
-            }
-        });
-        return filteredMatches;
-    }
-
-    private List<SearchMatch> filterMatchByResource(List<SearchMatch> matches,
-            IResource resource) {
-        List<SearchMatch> filteredMatches = new ArrayList<SearchMatch>(matches.size());
-
-        for (SearchMatch m: matches) {
-            if (m.getResource().equals(resource)) {
-                filteredMatches.add(m);
-            }
-        }
-
-        return filteredMatches;
-    }
-
-    private SearchMatch getMatchToDisplay(List<SearchMatch> matches, String searchTerm) {
-        // no matches for given search
-        if (matches.size() == 0) {
-            return null;
-        }
-
-        // there is only 1 match, so we return that
-        if (matches.size() == 1) {
-            return matches.get(0);
-        }
-
-        // multiple matches, prompt the user to select
-        IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
-        if (window == null) {
-            return null;
-        }
-
-        ListDialog dlg = new ListDialog(window.getShell());
-        dlg.setMessage("Multiple files match search: " + searchTerm);
-        dlg.setTitle("Select file to open");
-        dlg.setInput(matches);
-        dlg.setContentProvider(new IStructuredContentProvider() {
-            @Override
-            public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-            }
-
-            @Override
-            public void dispose() {
-            }
-
-            @Override
-            public Object[] getElements(Object inputElement) {
-                return ((List<?>) inputElement).toArray();
-            }
-        });
-        dlg.setLabelProvider(new LabelProvider() {
-           @Override
-           public String getText(Object element) {
-               SearchMatch m = (SearchMatch) element;
-               return String.format("/%s/%s",    //$NON-NLS-1$
-                       m.getResource().getProject().getName(),
-                       m.getResource().getProjectRelativePath().toString());
-           }
-        });
-        dlg.setInitialSelections(new Object[] { matches.get(0) });
-        dlg.setHelpAvailable(false);
-
-        if (dlg.open() == Window.OK) {
-            Object[] selectedMatches = dlg.getResult();
-            if (selectedMatches.length > 0) {
-                return (SearchMatch) selectedMatches[0];
-            }
-        }
-
-        return null;
-    }
-
-    private List<SearchMatch> searchForFile(String fileName) {
-        return searchForPattern(fileName, IJavaSearchConstants.CLASS, MATCH_IS_FILE_PREDICATE);
-    }
-
-    private List<SearchMatch> searchForMethod(String fqmn) {
-        if (fqmn.endsWith(CONSTRUCTOR_NAME)) {
-            fqmn = fqmn.substring(0, fqmn.length() - CONSTRUCTOR_NAME.length() - 1); // -1: dot
-            return searchForPattern(fqmn, IJavaSearchConstants.CONSTRUCTOR,
-                    MATCH_IS_METHOD_PREDICATE);
-        }
-        if (fqmn.endsWith(CLASS_CONSTRUCTOR)) {
-            // Don't try to search for class init methods: Eclipse will throw NPEs if you do
-            return Collections.emptyList();
-        }
-
-        return searchForPattern(fqmn, IJavaSearchConstants.METHOD, MATCH_IS_METHOD_PREDICATE);
-    }
-
-    private List<SearchMatch> searchForPattern(String pattern, int searchFor,
-            Predicate<SearchMatch> filterPredicate) {
-        SearchEngine se = new SearchEngine();
-        SearchPattern searchPattern = SearchPattern.createPattern(
-                pattern,
-                searchFor,
-                IJavaSearchConstants.DECLARATIONS,
-                SearchPattern.R_EXACT_MATCH | SearchPattern.R_CASE_SENSITIVE);
-        SearchResultAccumulator requestor = new SearchResultAccumulator(filterPredicate);
-        try {
-            se.search(searchPattern,
-                    new SearchParticipant[] {SearchEngine.getDefaultSearchParticipant()},
-                    SearchEngine.createWorkspaceScope(),
-                    requestor,
-                    new NullProgressMonitor());
-        } catch (CoreException e) {
-            AdtPlugin.printErrorToConsole(e.getMessage());
-            return Collections.emptyList();
-        }
-
-        return requestor.getMatches();
-    }
-
-    private static final Predicate<SearchMatch> MATCH_IS_FILE_PREDICATE =
-            new Predicate<SearchMatch>() {
-                @Override
-                public boolean apply(SearchMatch match) {
-                    return match.getResource() instanceof IFile;
-                }
-            };
-
-    private static final Predicate<SearchMatch> MATCH_IS_METHOD_PREDICATE =
-            new Predicate<SearchMatch>() {
-                @Override
-                public boolean apply(SearchMatch match) {
-                    return match.getResource() instanceof IFile;
-                }
-            };
-
-    private static class SearchResultAccumulator extends SearchRequestor {
-        private final List<SearchMatch> mSearchMatches = new ArrayList<SearchMatch>();
-        private final Predicate<SearchMatch> mPredicate;
-
-        public SearchResultAccumulator(Predicate<SearchMatch> filterPredicate) {
-            mPredicate = filterPredicate;
-        }
-
-        public List<SearchMatch> getMatches() {
-            return mSearchMatches;
-        }
-
-        @Override
-        public void acceptSearchMatch(SearchMatch match) throws CoreException {
-            if (mPredicate.apply(match)) {
-                mSearchMatches.add(match);
-            }
-        }
-    }
-
-    private static void switchToPerspective(String perspectiveId) {
-        IWorkbench workbench = PlatformUI.getWorkbench();
-        IWorkbenchWindow window = workbench.getActiveWorkbenchWindow();
-        IPerspectiveRegistry perspectiveRegistry = workbench.getPerspectiveRegistry();
-        if (perspectiveId != null
-                && perspectiveId.length() > 0
-                && perspectiveRegistry.findPerspectiveWithId(perspectiveId) != null) {
-            try {
-                workbench.showPerspective(perspectiveId, window);
-            } catch (WorkbenchException e) {
-                AdtPlugin.printErrorToConsole(e.getMessage());
-            }
-        }
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/ToolsLocator.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/ToolsLocator.java
deleted file mode 100644
index ee9eea7..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/ToolsLocator.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Copyright (C) 2010 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;
-
-import com.android.ide.eclipse.ddms.IToolsLocator;
-
-/**
- * Implementation of the com.android.ide.ddms.toolsLocator extension point.
- *
- */
-public class ToolsLocator implements IToolsLocator {
-
-    @Override
-    public String getAdbLocation() {
-        return AdtPlugin.getOsAbsoluteAdb();
-    }
-
-    @Override
-    public String getHprofConvLocation() {
-        return AdtPlugin.getOsAbsoluteHprofConv();
-    }
-
-    @Override
-    public String getTraceViewLocation() {
-        return AdtPlugin.getOsAbsoluteTraceview();
-    }
-}
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
deleted file mode 100644
index 576e9c3..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/VersionCheck.java
+++ /dev/null
@@ -1,189 +0,0 @@
-/*
- * Copyright (C) 2007 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;
-
-import com.android.SdkConstants;
-import com.android.ide.eclipse.adt.AdtPlugin;
-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.repository.FullRevision;
-import com.android.sdklib.repository.FullRevision.PreviewComparison;
-import com.android.sdklib.repository.PkgProps;
-
-import org.osgi.framework.Constants;
-import org.osgi.framework.Version;
-
-import java.io.BufferedReader;
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.FileReader;
-import java.io.IOException;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-/**
- * Class handling the version check for the plugin vs. the SDK.<br>
- * The plugin must be able to support all version of the SDK.
- *
- * <p/>An SDK can require a new version of the plugin.
- * <p/>The SDK contains a file with the minimum version for the plugin. This file is inside the
- * <code>tools/lib</code> directory, and is called <code>plugin.prop</code>.<br>
- * Inside that text file, there is a line in the format "plugin.version=#.#.#". This is checked
- * against the current plugin version.<br>
- *
- */
-public final class VersionCheck {
-    /**
-     * The minimum version of the SDK Tools that this version of ADT requires.
-     */
-    private final static FullRevision MIN_TOOLS_REV = new FullRevision(24, 0, 2, 0);
-
-    /**
-     * Pattern to get the minimum plugin version supported by the SDK. This is read from
-     * the file <code>$SDK/tools/lib/plugin.prop</code>.
-     */
-    private final static Pattern sPluginVersionPattern = Pattern.compile(
-            "^plugin.version=(\\d+)\\.(\\d+)\\.(\\d+).*$"); //$NON-NLS-1$
-    private final static Pattern sSourcePropPattern = Pattern.compile(
-            "^" + PkgProps.PKG_REVISION + "=(.*)$"); //$NON-NLS-1$
-
-    /**
-     * Checks the plugin and the SDK have compatible versions.
-     * @param osSdkPath The path to the SDK
-     * @return true if compatible.
-     */
-    public static boolean checkVersion(String osSdkPath, CheckSdkErrorHandler errorHandler) {
-        AdtPlugin plugin = AdtPlugin.getDefault();
-        String osLibs = osSdkPath + SdkConstants.OS_SDK_TOOLS_LIB_FOLDER;
-
-        // get the plugin property file, and grab the minimum plugin version required
-        // to work with the sdk
-        int minMajorVersion = -1;
-        int minMinorVersion = -1;
-        int minMicroVersion = -1;
-        BufferedReader reader = null;
-        try {
-            reader = new BufferedReader(new FileReader(osLibs + SdkConstants.FN_PLUGIN_PROP));
-            String line;
-            while ((line = reader.readLine()) != null) {
-                Matcher m = sPluginVersionPattern.matcher(line);
-                if (m.matches()) {
-                    minMajorVersion = Integer.parseInt(m.group(1));
-                    minMinorVersion = Integer.parseInt(m.group(2));
-                    minMicroVersion = Integer.parseInt(m.group(3));
-                    break;
-                }
-            }
-        } catch (FileNotFoundException e) {
-            // the build id will be null, and this is handled by the builders.
-        } catch (IOException e) {
-            // the build id will be null, and this is handled by the builders.
-        } finally {
-            if (reader != null) {
-                try {
-                    reader.close();
-                } catch (IOException e) {
-                } finally {
-                    reader = null;
-                }
-            }
-        }
-
-        // Failed to get the min plugin version number?
-        if (minMajorVersion == -1 || minMinorVersion == -1 || minMicroVersion ==-1) {
-            return errorHandler.handleWarning(
-                    Solution.OPEN_SDK_MANAGER,
-                    Messages.VersionCheck_Plugin_Version_Failed);
-        }
-
-        // Are the build tools installed? We can't query Sdk#getLatestBuildTool yet, since
-        // SDK initialization typically hasn't completed yet and Sdk.getCurrent() is null.
-        File buildToolsFolder = new File(osSdkPath, SdkConstants.FD_BUILD_TOOLS);
-        if (!buildToolsFolder.isDirectory()) {
-            return errorHandler.handleWarning(
-                    Solution.OPEN_SDK_MANAGER,
-                    Messages.VersionCheck_Build_Tool_Missing);
-        }
-
-        // test the plugin number
-        String versionString = (String) plugin.getBundle().getHeaders().get(
-                Constants.BUNDLE_VERSION);
-        Version version = new Version(versionString);
-
-        boolean valid = true;
-        if (version.getMajor() < minMajorVersion) {
-            valid = false;
-        } else if (version.getMajor() == minMajorVersion) {
-            if (version.getMinor() < minMinorVersion) {
-                valid = false;
-            } else if (version.getMinor() == minMinorVersion) {
-                if (version.getMicro() < minMicroVersion) {
-                    valid = false;
-                }
-            }
-        }
-
-        if (valid == false) {
-            return errorHandler.handleError(
-                    Solution.OPEN_P2_UPDATE,
-                    String.format(Messages.VersionCheck_Plugin_Too_Old,
-                            minMajorVersion, minMinorVersion, minMicroVersion, versionString));
-        }
-
-        // now check whether the tools are new enough.
-        String osTools = osSdkPath + SdkConstants.OS_SDK_TOOLS_FOLDER;
-        FullRevision toolsRevision = new FullRevision(Integer.MAX_VALUE);
-        try {
-            reader = new BufferedReader(new FileReader(osTools + SdkConstants.FN_SOURCE_PROP));
-            String line;
-            while ((line = reader.readLine()) != null) {
-                Matcher m = sSourcePropPattern.matcher(line);
-                if (m.matches()) {
-                    try {
-                        toolsRevision = FullRevision.parseRevision(m.group(1));
-                    } catch (NumberFormatException ignore) {}
-                    break;
-                }
-            }
-        } catch (FileNotFoundException e) {
-            // the build id will be null, and this is handled by the builders.
-        } catch (IOException e) {
-            // the build id will be null, and this is handled by the builders.
-        } finally {
-            if (reader != null) {
-                try {
-                    reader.close();
-                } catch (IOException e) {
-                } finally {
-                    reader = null;
-                }
-            }
-        }
-
-        if (toolsRevision.compareTo(MIN_TOOLS_REV, PreviewComparison.IGNORE) < 0) {
-            // this is a warning only as we need to parse the SDK to allow updating
-            // of the tools!
-            return errorHandler.handleWarning(
-                    Solution.OPEN_SDK_MANAGER,
-                    String.format(Messages.VersionCheck_Tools_Too_Old,
-                            MIN_TOOLS_REV, toolsRevision));
-        }
-
-        return true; // no error!
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/actions/AddSupportJarAction.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/actions/AddSupportJarAction.java
deleted file mode 100644
index f0af8bb..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/actions/AddSupportJarAction.java
+++ /dev/null
@@ -1,626 +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.eclipse.adt.internal.actions;
-
-import com.android.SdkConstants;
-import com.android.annotations.Nullable;
-import com.android.ide.eclipse.adt.AdtConstants;
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.ide.eclipse.adt.AdtUtils;
-import com.android.ide.eclipse.adt.internal.sdk.AdtConsoleSdkLog;
-import com.android.ide.eclipse.adt.internal.sdk.ProjectState;
-import com.android.ide.eclipse.adt.internal.sdk.Sdk;
-import com.android.sdklib.SdkManager;
-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.io.FileOp;
-import com.android.sdkuilib.internal.repository.ui.AdtUpdateDialog;
-import com.android.utils.NullLogger;
-import com.android.utils.Pair;
-
-import org.eclipse.core.filesystem.EFS;
-import org.eclipse.core.filesystem.IFileStore;
-import org.eclipse.core.filesystem.IFileSystem;
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IFolder;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IProjectDescription;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IWorkspace;
-import org.eclipse.core.resources.IWorkspaceRoot;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.core.runtime.jobs.Job;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.JavaCore;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.ui.IObjectActionDelegate;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.IWorkbenchWindowActionDelegate;
-
-import java.io.File;
-import java.io.IOException;
-import java.util.Iterator;
-import java.util.Map;
-
-/**
- * An action to add the android-support-v4.jar support library
- * to the selected project.
- * <p/>
- * This should be used by the GLE. The action itself is currently more
- * like an example of how to invoke the new {@link AdtUpdateDialog}.
- * <p/>
- * TODO: make this more configurable.
- */
-public class AddSupportJarAction implements IObjectActionDelegate {
-
-    /** The vendor ID of the support library. */
-    private static final String VENDOR_ID = "android";                             //$NON-NLS-1$
-    /** The path ID of the support library. */
-    private static final String SUPPORT_ID = "support";                            //$NON-NLS-1$
-    /** The path ID of the compatibility library (which was its id for releases 1-3). */
-    private static final String COMPATIBILITY_ID = "compatibility";                //$NON-NLS-1$
-    private static final String FD_GRIDLAYOUT = "gridlayout";                      //$NON-NLS-1$
-    private static final String FD_V7 = "v7";                                      //$NON-NLS-1$
-    private static final String FD_V4 = "v4";                                      //$NON-NLS-1$
-    private static final String FD_V13 = "v13";                                    //$NON-NLS-1$
-    private static final String FD_APPCOMPAT = "appcompat";                        //$NON-NLS-1$
-    private static final String FD_LIBS = "libs";                                  //$NON-NLS-1$
-    private static final String ANDROID_SUPPORT_V4_JAR = "android-support-v4.jar"; //$NON-NLS-1$
-    private static final String ANDROID_SUPPORT_V13_JAR = "android-support-v13.jar";//$NON-NLS-1$
-    private static final String APPCOMPAT_V7_JAR = "android-support-v7-appcompat.jar";//$NON-NLS-1$
-    private static final String APP_COMPAT_LIB_NAME = "appcompat_v7";               //$NON-NLS-1$
-    private ISelection mSelection;
-
-    /**
-     * @see IObjectActionDelegate#setActivePart(IAction, IWorkbenchPart)
-     */
-    @Override
-    public void setActivePart(IAction action, IWorkbenchPart targetPart) {
-    }
-
-    @Override
-    public void run(IAction action) {
-        if (mSelection instanceof IStructuredSelection) {
-
-            for (Iterator<?> it = ((IStructuredSelection) mSelection).iterator();
-                    it.hasNext();) {
-                Object element = it.next();
-                IProject project = null;
-                if (element instanceof IProject) {
-                    project = (IProject) element;
-                } else if (element instanceof IAdaptable) {
-                    project = (IProject) ((IAdaptable) element)
-                            .getAdapter(IProject.class);
-                }
-                if (project != null) {
-                    install(project);
-                }
-            }
-        }
-    }
-
-    @Override
-    public void selectionChanged(IAction action, ISelection selection) {
-        mSelection = selection;
-    }
-
-    /**
-     * Install the support jar into the given project.
-     *
-     * @param project The Android project to install the support jar into
-     * @return true if the installation was successful
-     */
-    public static boolean install(final IProject project) {
-        File jarPath = installSupport(-1);
-        if (jarPath != null) {
-            try {
-                return copyJarIntoProject(project, jarPath) != null;
-            } catch (Exception e) {
-                AdtPlugin.log(e, null);
-            }
-        }
-
-        return false;
-    }
-
-    /**
-     * Installs the Android Support library into the SDK extras/ folder. If a minimum
-     * revision number is specified, this method will check whether the package is already
-     * installed, and if the installed revision is at least as high as the requested revision,
-     * this method will exit without performing an update.
-     *
-     * @param minimumRevision a minimum revision, or -1 to upgrade
-     *            unconditionally. Note that this does <b>NOT</b> specify which
-     *            revision to install; the latest version will always be
-     *            installed.
-     * @return the location of the support jar file, or null if something went
-     *            wrong
-     */
-    @Nullable
-    public static File installSupport(int minimumRevision) {
-
-        final Sdk sdk = Sdk.getCurrent();
-        if (sdk == null) {
-            AdtPlugin.printErrorToConsole(
-                    AddSupportJarAction.class.getSimpleName(),   // tag
-                    "Error: Android SDK is not loaded yet."); //$NON-NLS-1$
-            return null;
-        }
-
-        String sdkLocation = sdk.getSdkOsLocation();
-        if (minimumRevision > 0) {
-            File path = getSupportJarFile();
-            if (path != null) {
-                assert path.exists(); // guaranteed by the getSupportJarFile call
-                int installedRevision = getInstalledRevision();
-                if (installedRevision != -1 && minimumRevision <= installedRevision) {
-                    return path;
-                }
-            }
-        }
-
-        // TODO: For the generic action, check the library isn't in the project already.
-
-        // First call the package manager to make sure the package is installed
-        // and get the installation path of the library.
-
-        AdtUpdateDialog window = new AdtUpdateDialog(
-                AdtPlugin.getShell(),
-                new AdtConsoleSdkLog(),
-                sdkLocation);
-
-        Pair<Boolean, File> result = window.installExtraPackage(VENDOR_ID, SUPPORT_ID);
-
-        // TODO: Make sure the version is at the required level; we know we need at least one
-        // containing the v7 support
-
-        if (!result.getFirst().booleanValue()) {
-            AdtPlugin.printErrorToConsole("Failed to install Android Support library");
-            return null;
-        }
-
-        // TODO these "v4" values needs to be dynamic, e.g. we could try to match
-        // vN/android-support-vN.jar. Eventually we'll want to rely on info from the
-        // package manifest anyway so this is irrelevant.
-
-        File path = new File(result.getSecond(), FD_V4);
-        final File jarPath = new File(path, ANDROID_SUPPORT_V4_JAR);
-
-        if (!jarPath.isFile()) {
-            AdtPlugin.printErrorToConsole("Android Support Jar not found:",
-                    jarPath.getAbsolutePath());
-            return null;
-        }
-
-        return jarPath;
-    }
-
-    /**
-     * Returns the installed revision number of the Android Support
-     * library, or -1 if the package is not installed.
-     *
-     * @return the installed revision number, or -1
-     */
-    public static int getInstalledRevision() {
-        final Sdk sdk = Sdk.getCurrent();
-        if (sdk != null) {
-            String sdkLocation = sdk.getSdkOsLocation();
-            SdkManager manager = SdkManager.createManager(sdkLocation, NullLogger.getLogger());
-            Map<String, Integer> versions = manager.getExtrasVersions();
-            Integer version = versions.get(VENDOR_ID + '/' + SUPPORT_ID);
-            if (version == null) {
-                // Check the old compatibility library. When the library is updated in-place
-                // the manager doesn't change its folder name (since that is a source of
-                // endless issues on Windows.)
-                version = versions.get(VENDOR_ID + '/' + COMPATIBILITY_ID);
-            }
-            if (version != null) {
-                return version.intValue();
-            }
-        }
-
-        return -1;
-    }
-
-    /**
-     * Similar to {@link #install}, but rather than copy a jar into the given
-     * project, it creates a new library project in the workspace for the
-     * support library, and adds a library dependency on the newly
-     * installed library from the given project.
-     *
-     * @param project the project to add a dependency on the library to
-     * @param waitForFinish If true, block until the task has finished
-     * @return true if the installation was successful (or if
-     *         <code>waitForFinish</code> is false, if the installation is
-     *         likely to be successful - e.g. the user has at least agreed to
-     *         all installation prompts.)
-     */
-    public static boolean installGridLayoutLibrary(final IProject project, boolean waitForFinish) {
-        final IJavaProject javaProject = JavaCore.create(project);
-        if (javaProject != null) {
-
-            File supportPath = getSupportPackageDir();
-            if (!supportPath.isDirectory()) {
-                File path = installSupport(8); // GridLayout arrived in rev 7 and fixed in rev 8
-                if (path == null) {
-                    return false;
-                }
-                assert path.equals(supportPath);
-            }
-            File libraryPath = new File(supportPath, FD_V7 + File.separator + FD_GRIDLAYOUT);
-            if (!libraryPath.isDirectory()) {
-                // Upgrade support package: it's out of date. The SDK manager will
-                // perform an upgrade to the latest version if the package is already installed.
-                File path = installSupport(-1);
-                if (path == null) {
-                    return false;
-                }
-                assert path.equals(libraryPath) : path;
-            }
-
-            // Create workspace copy of the project and add library dependency
-            IProject libraryProject = createLibraryProject(libraryPath, project,
-                    "gridlayout_v7", waitForFinish); //$NON-NLS-1$
-            if (libraryProject != null) {
-                return addLibraryDependency(libraryProject, project, waitForFinish);
-            }
-        }
-
-        return false;
-    }
-
-    /**
-     * Similar to {@link #install}, but rather than copy a jar into the given
-     * project, it creates a new library project in the workspace for the
-     * support library, and adds a library dependency on the newly
-     * installed library from the given project.
-     *
-     * @param project the project to add a dependency on the library to
-     * @param waitForFinish If true, block until the task has finished
-     * @return true if the installation was successful (or if
-     *         <code>waitForFinish</code> is false, if the installation is
-     *         likely to be successful - e.g. the user has at least agreed to
-     *         all installation prompts.)
-     */
-    public static boolean installAppCompatLibrary(final IProject project, boolean waitForFinish) {
-        final IJavaProject javaProject = JavaCore.create(project);
-        if (javaProject != null) {
-
-            // Don't add in the library if it already exists
-            ProjectState state = Sdk.getProjectState(project);
-            ProjectPropertiesWorkingCopy copy = state.getProperties().makeWorkingCopy();
-            for (String property : copy.keySet()) {
-                if (property.startsWith(ProjectProperties.PROPERTY_LIB_REF)) {
-                    String libraryReference = copy.getProperty(property);
-                    if (libraryReference != null && libraryReference.contains(APP_COMPAT_LIB_NAME)) {
-                        return true;
-                    }
-                }
-            }
-
-            File supportPath = getSupportPackageDir();
-            if (!supportPath.isDirectory()) {
-                File path = installSupport(7);
-                if (path == null) {
-                    return false;
-                }
-                assert path.equals(supportPath);
-            }
-            File libraryPath = new File(supportPath, FD_V7 + File.separator + FD_APPCOMPAT);
-            if (!libraryPath.isDirectory()) {
-                // Upgrade support package: it's out of date. The SDK manager will
-                // perform an upgrade to the latest version if the package is already installed.
-                File path = installSupport(-1);
-                if (path == null) {
-                    return false;
-                }
-                assert path.equals(libraryPath) : path;
-            }
-
-            // Check to see if there's already a version of the library available
-            IWorkspace workspace = ResourcesPlugin.getWorkspace();
-            IWorkspaceRoot root = workspace.getRoot();
-            IProject libraryProject = root.getProject(APP_COMPAT_LIB_NAME);
-            if (!libraryProject.exists()) {
-            	// Create workspace copy of the project and add library dependency
-            	libraryProject = createLibraryProject(libraryPath, project,
-            			APP_COMPAT_LIB_NAME, waitForFinish);
-            }
-            if (libraryProject != null) {
-                return addLibraryDependency(libraryProject, project, waitForFinish);
-            }
-        }
-
-        return false;
-    }
-
-    /**
-     * Returns the directory containing the support libraries (v4, v7, v13,
-     * ...), which may or may not exist
-     *
-     * @return a path to the support library or null
-     */
-    private static File getSupportPackageDir() {
-        final Sdk sdk = Sdk.getCurrent();
-        if (sdk != null) {
-            String sdkLocation = sdk.getSdkOsLocation();
-            SdkManager manager = SdkManager.createManager(sdkLocation, NullLogger.getLogger());
-            Map<String, Integer> versions = manager.getExtrasVersions();
-            Integer version = versions.get(VENDOR_ID + '/' + SUPPORT_ID);
-            if (version != null) {
-                File supportPath = new File(sdkLocation,
-                        SdkConstants.FD_EXTRAS + File.separator
-                        + VENDOR_ID + File.separator
-                        + SUPPORT_ID);
-                return supportPath;
-            }
-
-            // Check the old compatibility library. When the library is updated in-place
-            // the manager doesn't change its folder name (since that is a source of
-            // endless issues on Windows.)
-            version = versions.get(VENDOR_ID + '/' + COMPATIBILITY_ID);
-            if (version != null) {
-                File supportPath = new File(sdkLocation,
-                        SdkConstants.FD_EXTRAS + File.separator
-                        + VENDOR_ID + File.separator
-                        + COMPATIBILITY_ID);
-                return supportPath;
-            }
-        }
-        return null;
-    }
-
-    /**
-     * Returns a path to the installed jar file for the support library,
-     * or null if it does not exist
-     *
-     * @return a path to the v4.jar or null
-     */
-    @Nullable
-    public static File getSupportJarFile() {
-        File supportDir = getSupportPackageDir();
-        if (supportDir != null) {
-            File path = new File(supportDir, FD_V4 + File.separator + ANDROID_SUPPORT_V4_JAR);
-            if (path.exists()) {
-                return path;
-            }
-        }
-
-        return null;
-    }
-
-    /**
-     * Returns a path to the installed jar file for the support library,
-     * or null if it does not exist
-     *
-     * @return a path to the v13.jar or null
-     */
-    @Nullable
-    public static File getSupport13JarFile() {
-        File supportDir = getSupportPackageDir();
-        if (supportDir != null) {
-            File path = new File(supportDir, FD_V13 + File.separator + ANDROID_SUPPORT_V13_JAR);
-            if (path.exists()) {
-                return path;
-            }
-        }
-
-        return null;
-    }
-
-    /**
-     * Creates a library project in the Eclipse workspace out of the grid layout project
-     * in the SDK tree.
-     *
-     * @param libraryPath the path to the directory tree containing the project contents
-     * @param project the project to copy the SDK target out of
-     * @param waitForFinish whether the operation should finish before this method returns
-     * @return a library project, or null if it fails for some reason
-     */
-    private static IProject createLibraryProject(
-            final File libraryPath,
-            final IProject project,
-            final String libraryName,
-            boolean waitForFinish) {
-
-        // Install a new library into the workspace. This is a copy rather than
-        // a reference to the support library version such that modifications
-        // do not modify the pristine copy in the SDK install area.
-
-        final IProject newProject;
-        try {
-            IProgressMonitor monitor = new NullProgressMonitor();
-            IWorkspace workspace = ResourcesPlugin.getWorkspace();
-            IWorkspaceRoot root = workspace.getRoot();
-
-            String name = AdtUtils.getUniqueProjectName(
-                    libraryName, "_"); //$NON-NLS-1$
-            newProject = root.getProject(name);
-            IProjectDescription description = workspace.newProjectDescription(name);
-            String[] natures = new String[] { AdtConstants.NATURE_DEFAULT, JavaCore.NATURE_ID };
-            description.setNatureIds(natures);
-            newProject.create(description, monitor);
-
-            // Copy in the files recursively
-            IFileSystem fileSystem = EFS.getLocalFileSystem();
-            IFileStore sourceDir = fileSystem.getStore(libraryPath.toURI());
-            IFileStore destDir = fileSystem.getStore(newProject.getLocationURI());
-            sourceDir.copy(destDir, EFS.OVERWRITE, null);
-
-            // Make sure the src folder exists
-            destDir.getChild(SdkConstants.SRC_FOLDER).mkdir(0, null /*monitor*/);
-
-            // Set the android platform to the same level as the calling project
-            ProjectState state = Sdk.getProjectState(project);
-            String target = state.getProperties().getProperty(ProjectProperties.PROPERTY_TARGET);
-            if (target != null && target.length() > 0) {
-                ProjectProperties properties = ProjectProperties.load(
-                        destDir.toLocalFile(EFS.NONE, new NullProgressMonitor()).getPath(),
-                        PropertyType.PROJECT);
-                ProjectPropertiesWorkingCopy copy = properties.makeWorkingCopy();
-                copy.setProperty(ProjectProperties.PROPERTY_TARGET, target);
-                try {
-                    copy.save();
-                } catch (Exception e) {
-                    AdtPlugin.log(e, null);
-                }
-            }
-
-            newProject.open(monitor);
-
-            return newProject;
-        } catch (CoreException e) {
-            AdtPlugin.log(e, null);
-            return null;
-        }
-    }
-
-    /**
-     * Adds a library dependency on the given library into the given project.
-     *
-     * @param libraryProject the library project to depend on
-     * @param dependentProject the project to write the dependency into
-     * @param waitForFinish whether this method should wait for the job to
-     *            finish
-     * @return true if the operation succeeded
-     */
-    public static boolean addLibraryDependency(
-            final IProject libraryProject,
-            final IProject dependentProject,
-            boolean waitForFinish) {
-
-        // Now add library dependency
-
-        // Run an Eclipse asynchronous job to update the project
-        Job job = new Job("Add Support Library Dependency to Project") {
-            @Override
-            protected IStatus run(IProgressMonitor monitor) {
-                try {
-                    monitor.beginTask("Add library dependency to project build path", 3);
-                    monitor.worked(1);
-
-                    // TODO: Add library project to the project.properties file!
-                    ProjectState state = Sdk.getProjectState(dependentProject);
-                    ProjectPropertiesWorkingCopy mPropertiesWorkingCopy =
-                            state.getProperties().makeWorkingCopy();
-
-                    // Get the highest version number of the libraries; there cannot be any
-                    // gaps so we will assign the next library the next number
-                    int nextVersion = 1;
-                    for (String property : mPropertiesWorkingCopy.keySet()) {
-                        if (property.startsWith(ProjectProperties.PROPERTY_LIB_REF)) {
-                            String s = property.substring(
-                                    ProjectProperties.PROPERTY_LIB_REF.length());
-                            int version = Integer.parseInt(s);
-                            if (version >= nextVersion) {
-                                nextVersion = version + 1;
-                            }
-                        }
-                    }
-
-                    IPath relativePath = libraryProject.getLocation().makeRelativeTo(
-                            dependentProject.getLocation());
-
-                    mPropertiesWorkingCopy.setProperty(
-                            ProjectProperties.PROPERTY_LIB_REF + nextVersion,
-                            relativePath.toString());
-                    try {
-                        mPropertiesWorkingCopy.save();
-                        IResource projectProp = dependentProject.findMember(
-                                SdkConstants.FN_PROJECT_PROPERTIES);
-                        projectProp.refreshLocal(IResource.DEPTH_ZERO, new NullProgressMonitor());
-                    } catch (Exception e) {
-                        String msg = String.format(
-                                "Failed to save %1$s for project %2$s",
-                                SdkConstants.FN_PROJECT_PROPERTIES, dependentProject.getName());
-                        AdtPlugin.log(e, msg);
-                    }
-
-                    // Project fix-ups
-                    Job fix = FixProjectAction.createFixProjectJob(libraryProject);
-                    fix.schedule();
-                    fix.join();
-
-                    monitor.worked(1);
-
-                    return Status.OK_STATUS;
-                } catch (Exception e) {
-                    return new Status(Status.ERROR, AdtPlugin.PLUGIN_ID, Status.ERROR,
-                            "Failed", e); //$NON-NLS-1$
-                } finally {
-                    if (monitor != null) {
-                        monitor.done();
-                    }
-                }
-            }
-        };
-        job.schedule();
-
-        if (waitForFinish) {
-            try {
-                job.join();
-                return job.getState() == IStatus.OK;
-            } catch (InterruptedException e) {
-                AdtPlugin.log(e, null);
-            }
-        }
-
-        return true;
-    }
-
-    private static IResource copyJarIntoProject(
-            IProject project,
-            File jarPath) throws IOException, CoreException {
-        IFolder resFolder = project.getFolder(SdkConstants.FD_NATIVE_LIBS);
-        if (!resFolder.exists()) {
-            resFolder.create(IResource.FORCE, true /*local*/, null);
-        }
-
-        IFile destFile = resFolder.getFile(jarPath.getName());
-        IPath loc = destFile.getLocation();
-        File destPath = loc.toFile();
-
-        // Only modify the file if necessary so that we don't trigger unnecessary recompilations
-        FileOp f = new FileOp();
-        if (!f.isFile(destPath) || !f.isSameFile(jarPath, destPath)) {
-            f.copyFile(jarPath, destPath);
-            // Make sure Eclipse discovers java.io file changes
-            resFolder.refreshLocal(1, new NullProgressMonitor());
-        }
-
-        return destFile;
-    }
-
-    /**
-     * @see IWorkbenchWindowActionDelegate#init
-     */
-    public void init(IWorkbenchWindow window) {
-        // pass
-    }
-
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/actions/AvdManagerAction.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/actions/AvdManagerAction.java
deleted file mode 100644
index 86f2d3c..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/actions/AvdManagerAction.java
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- * Copyright (C) 2009 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.actions;
-
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.ide.eclipse.adt.internal.sdk.AdtConsoleSdkLog;
-import com.android.ide.eclipse.adt.internal.sdk.Sdk;
-import com.android.sdkuilib.repository.AvdManagerWindow;
-import com.android.sdkuilib.repository.AvdManagerWindow.AvdInvocationContext;
-
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.ui.IObjectActionDelegate;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.IWorkbenchWindowActionDelegate;
-
-/**
- * Delegate for the toolbar/menu action "AVD Manager".
- * It displays the AVD Manager window.
- */
-public class AvdManagerAction implements IWorkbenchWindowActionDelegate, IObjectActionDelegate {
-
-    @Override
-    public void dispose() {
-        // nothing to dispose.
-    }
-
-    @Override
-    public void init(IWorkbenchWindow window) {
-        // no init
-    }
-
-    @Override
-    public void run(IAction action) {
-        final Sdk sdk = Sdk.getCurrent();
-        if (sdk != null) {
-            // Although orthogonal to the avd manager action, this is a good time
-            // to check whether the SDK has changed on disk.
-            AdtPlugin.getDefault().refreshSdk();
-
-            // Runs the updater window, directing all logs to the ADT console.
-            AvdManagerWindow window = new AvdManagerWindow(
-                    AdtPlugin.getShell(),
-                    new AdtConsoleSdkLog(),
-                    sdk.getSdkOsLocation(),
-                    AvdInvocationContext.IDE);
-            window.open();
-        } else {
-            AdtPlugin.displayError("Android SDK",
-                    "Location of the Android SDK has not been setup in the preferences.");
-        }
-    }
-
-    @Override
-    public void selectionChanged(IAction action, ISelection selection) {
-        // nothing related to the current selection.
-    }
-
-    @Override
-    public void setActivePart(IAction action, IWorkbenchPart targetPart) {
-        // nothing to do.
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/actions/DexDumpAction.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/actions/DexDumpAction.java
deleted file mode 100755
index 78fcfd4..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/actions/DexDumpAction.java
+++ /dev/null
@@ -1,276 +0,0 @@
-/*
- * Copyright (C) 2010 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.actions;
-
-import com.android.SdkConstants;
-import com.android.annotations.Nullable;
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.ide.eclipse.adt.internal.preferences.AdtPrefs.BuildVerbosity;
-import com.android.ide.eclipse.adt.internal.sdk.Sdk;
-import com.android.sdklib.BuildToolInfo;
-import com.android.utils.GrabProcessOutput;
-import com.android.utils.GrabProcessOutput.IProcessOutput;
-import com.android.utils.GrabProcessOutput.Wait;
-import com.android.utils.SdkUtils;
-
-import org.eclipse.core.filesystem.EFS;
-import org.eclipse.core.filesystem.IFileStore;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.core.runtime.jobs.Job;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.ui.IObjectActionDelegate;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.ide.IDE;
-
-import java.io.BufferedWriter;
-import java.io.File;
-import java.io.FileWriter;
-import java.io.IOException;
-import java.util.Iterator;
-
-/**
- * Runs dexdump on the classes.dex of a selected project.
- */
-public class DexDumpAction implements IObjectActionDelegate {
-
-    private ISelection mSelection;
-
-    @Override
-    public void setActivePart(IAction action, IWorkbenchPart targetPart) {
-        // pass
-    }
-
-    @Override
-    public void run(IAction action) {
-        if (mSelection instanceof IStructuredSelection) {
-            for (Iterator<?> it = ((IStructuredSelection)mSelection).iterator(); it.hasNext();) {
-                Object element = it.next();
-                IProject project = null;
-                if (element instanceof IProject) {
-                    project = (IProject)element;
-                } else if (element instanceof IAdaptable) {
-                    project = (IProject)((IAdaptable)element).getAdapter(IProject.class);
-                }
-                if (project != null) {
-                    dexDumpProject(project);
-                }
-            }
-        }
-    }
-
-    @Override
-    public void selectionChanged(IAction action, ISelection selection) {
-        mSelection = selection;
-    }
-
-    /**
-     * Calls {@link #runDexDump(IProject, IProgressMonitor)} inside a job.
-     *
-     * @param project on which to run dexdump.
-     */
-    private void dexDumpProject(final IProject project) {
-        new Job("Dexdump") {
-            @Override
-            protected IStatus run(IProgressMonitor monitor) {
-                return runDexDump(project, monitor);
-            }
-        }.schedule();
-    }
-
-    /**
-     * Runs <code>dexdump</code> on the classex.dex of the project.
-     * Saves the output in a temporary file.
-     * On success, opens the file in the default text editor.
-     *
-     * @param project on which to run dexdump.
-     * @param monitor The job's monitor.
-     */
-    private IStatus runDexDump(final IProject project, IProgressMonitor monitor) {
-        File dstFile = null;
-        boolean removeDstFile = true;
-        try {
-            if (monitor != null) {
-                monitor.beginTask(String.format("Dump dex of %1$s", project.getName()), 2);
-            }
-
-            Sdk current = Sdk.getCurrent();
-            if (current == null) {
-                AdtPlugin.printErrorToConsole(project,
-                        "DexDump: missing current SDK");                            //$NON-NLS-1$
-                return Status.OK_STATUS;
-            }
-
-            BuildToolInfo buildToolInfo = current.getLatestBuildTool();
-            if (buildToolInfo == null) {
-                AdtPlugin.printErrorToConsole(project,
-                    "SDK missing build tools. Please install build tools using SDK Manager.");
-                return Status.OK_STATUS;
-            }
-
-            File buildToolsFolder = buildToolInfo.getLocation();
-            File dexDumpFile = new File(buildToolsFolder, SdkConstants.FN_DEXDUMP);
-
-            IPath binPath = project.getFolder(SdkConstants.FD_OUTPUT).getLocation();
-            if (binPath == null) {
-                AdtPlugin.printErrorToConsole(project,
-                    "DexDump: missing project /bin folder. Please compile first."); //$NON-NLS-1$
-                return Status.OK_STATUS;
-            }
-
-            File classesDexFile =
-                new File(binPath.toOSString(), SdkConstants.FN_APK_CLASSES_DEX);
-            if (!classesDexFile.exists()) {
-                AdtPlugin.printErrorToConsole(project,
-                    "DexDump: missing classex.dex for project. Please compile first.");//$NON-NLS-1$
-                return Status.OK_STATUS;
-            }
-
-            try {
-                dstFile = File.createTempFile(
-                        "dexdump_" + project.getName() + "_",         //$NON-NLS-1$ //$NON-NLS-2$
-                        ".txt");                                                    //$NON-NLS-1$
-            } catch (Exception e) {
-                AdtPlugin.logAndPrintError(e, project.getName(),
-                        "DexDump: createTempFile failed.");                         //$NON-NLS-1$
-                return Status.OK_STATUS;
-            }
-
-            // --- Exec command line and save result to dst file
-
-            String[] command = new String[2];
-            command[0] = dexDumpFile.getAbsolutePath();
-            command[1] = classesDexFile.getAbsolutePath();
-
-            try {
-                final Process process = Runtime.getRuntime().exec(command);
-
-                final BufferedWriter writer = new BufferedWriter(new FileWriter(dstFile));
-                try {
-                    final String lineSep = SdkUtils.getLineSeparator();
-
-                    int err = GrabProcessOutput.grabProcessOutput(
-                            process,
-                            Wait.WAIT_FOR_READERS,
-                            new IProcessOutput() {
-                                @Override
-                                public void out(@Nullable String line) {
-                                    if (line != null) {
-                                        try {
-                                            writer.write(line);
-                                            writer.write(lineSep);
-                                        } catch (IOException ignore) {}
-                                    }
-                                }
-
-                                @Override
-                                public void err(@Nullable String line) {
-                                    if (line != null) {
-                                        AdtPlugin.printBuildToConsole(BuildVerbosity.VERBOSE,
-                                                project, line);
-                                    }
-                                }
-                            });
-
-                    if (err == 0) {
-                        // The command worked. In this case we don't remove the
-                        // temp file in the finally block.
-                        removeDstFile = false;
-                    } else {
-                        AdtPlugin.printErrorToConsole(project,
-                            "DexDump failed with code " + Integer.toString(err));       //$NON-NLS-1$
-                        return Status.OK_STATUS;
-                    }
-                } finally {
-                    writer.close();
-                }
-            } catch (InterruptedException e) {
-                // ?
-            }
-
-            if (monitor != null) {
-                monitor.worked(1);
-            }
-
-            // --- Open the temp file in an editor
-
-            final String dstPath = dstFile.getAbsolutePath();
-            AdtPlugin.getDisplay().asyncExec(new Runnable() {
-                @Override
-                public void run() {
-                    IFileStore fileStore =
-                        EFS.getLocalFileSystem().getStore(new Path(dstPath));
-                    if (!fileStore.fetchInfo().isDirectory() &&
-                            fileStore.fetchInfo().exists()) {
-
-                        IWorkbench wb = PlatformUI.getWorkbench();
-                        IWorkbenchWindow win = wb == null ? null : wb.getActiveWorkbenchWindow();
-                        final IWorkbenchPage page = win == null ? null : win.getActivePage();
-
-                        if (page != null) {
-                            try {
-                                IDE.openEditorOnFileStore(page, fileStore);
-                            } catch (PartInitException e) {
-                                AdtPlugin.logAndPrintError(e, project.getName(),
-                                "Opening DexDump result failed. Result is available at %1$s", //$NON-NLS-1$
-                                dstPath);
-                            }
-                        }
-                    }
-                }
-            });
-
-            if (monitor != null) {
-                monitor.worked(1);
-            }
-
-            return Status.OK_STATUS;
-
-        } catch (IOException e) {
-            AdtPlugin.logAndPrintError(e, project.getName(),
-                    "DexDump failed.");                                     //$NON-NLS-1$
-            return Status.OK_STATUS;
-
-        } finally {
-            // By default we remove the temp file on failure.
-            if (removeDstFile && dstFile != null) {
-                try {
-                    dstFile.delete();
-                } catch (Exception e) {
-                    AdtPlugin.logAndPrintError(e, project.getName(),
-                            "DexDump: can't delete temp file %1$s.",        //$NON-NLS-1$
-                            dstFile.getAbsoluteFile());
-                }
-            }
-            if (monitor != null) {
-                monitor.done();
-            }
-        }
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/actions/FixProjectAction.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/actions/FixProjectAction.java
deleted file mode 100644
index 254219f..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/actions/FixProjectAction.java
+++ /dev/null
@@ -1,154 +0,0 @@
-/*
- * Copyright (C) 2007 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.actions;
-
-import com.android.annotations.NonNull;
-import com.android.ide.eclipse.adt.internal.project.AndroidNature;
-import com.android.ide.eclipse.adt.internal.project.ProjectHelper;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.core.runtime.jobs.Job;
-import org.eclipse.jdt.core.JavaModelException;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.ui.IObjectActionDelegate;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.IWorkbenchWindowActionDelegate;
-
-import java.util.Iterator;
-
-/**
- * Action to fix the project properties:
- * <ul>
- * <li>Make sure the framework archive is present with the link to the java
- * doc</li>
- * </ul>
- */
-public class FixProjectAction implements IObjectActionDelegate {
-
-    private ISelection mSelection;
-
-    /**
-     * @see IObjectActionDelegate#setActivePart(IAction, IWorkbenchPart)
-     */
-    @Override
-    public void setActivePart(IAction action, IWorkbenchPart targetPart) {
-    }
-
-    @Override
-    public void run(IAction action) {
-        if (mSelection instanceof IStructuredSelection) {
-
-            for (Iterator<?> it = ((IStructuredSelection) mSelection).iterator();
-                    it.hasNext();) {
-                Object element = it.next();
-                IProject project = null;
-                if (element instanceof IProject) {
-                    project = (IProject) element;
-                } else if (element instanceof IAdaptable) {
-                    project = (IProject) ((IAdaptable) element)
-                            .getAdapter(IProject.class);
-                }
-                if (project != null) {
-                    fixProject(project);
-                }
-            }
-        }
-    }
-
-    @Override
-    public void selectionChanged(IAction action, ISelection selection) {
-        mSelection = selection;
-    }
-
-    private void fixProject(final IProject project) {
-        createFixProjectJob(project).schedule();
-    }
-
-    /**
-     * Creates a job to fix the project
-     *
-     * @param project the project to fix
-     * @return a job to perform the fix (not yet scheduled)
-     */
-    @NonNull
-    public static Job createFixProjectJob(@NonNull final IProject project) {
-        return new Job("Fix Project Properties") {
-
-            @Override
-            protected IStatus run(IProgressMonitor monitor) {
-                try {
-                    if (monitor != null) {
-                        monitor.beginTask("Fix Project Properties", 6);
-                    }
-
-                    ProjectHelper.fixProject(project);
-                    if (monitor != null) {
-                        monitor.worked(1);
-                    }
-
-                    // fix the nature order to have the proper project icon
-                    ProjectHelper.fixProjectNatureOrder(project);
-                    if (monitor != null) {
-                        monitor.worked(1);
-                    }
-
-                    // now we fix the builders
-                    AndroidNature.configureResourceManagerBuilder(project);
-                    if (monitor != null) {
-                        monitor.worked(1);
-                    }
-
-                    AndroidNature.configurePreBuilder(project);
-                    if (monitor != null) {
-                        monitor.worked(1);
-                    }
-
-                    AndroidNature.configureApkBuilder(project);
-                    if (monitor != null) {
-                        monitor.worked(1);
-                    }
-
-                    return Status.OK_STATUS;
-                } catch (JavaModelException e) {
-                    return e.getJavaModelStatus();
-                } catch (CoreException e) {
-                    return e.getStatus();
-                } finally {
-                    if (monitor != null) {
-                        monitor.done();
-                    }
-                }
-            }
-        };
-    }
-
-    /**
-     * @see IWorkbenchWindowActionDelegate#init
-     */
-    public void init(IWorkbenchWindow window) {
-        // pass
-    }
-
-}
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
deleted file mode 100644
index 48667be..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/actions/SdkManagerAction.java
+++ /dev/null
@@ -1,354 +0,0 @@
-/*
- * Copyright (C) 2009 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.actions;
-
-import com.android.SdkConstants;
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.ide.eclipse.adt.internal.preferences.AdtPrefs;
-import com.android.ide.eclipse.adt.internal.sdk.AdtConsoleSdkLog;
-import com.android.ide.eclipse.adt.internal.sdk.Sdk;
-import com.android.sdklib.io.FileOp;
-import com.android.sdklib.repository.ISdkChangeListener;
-import com.android.utils.GrabProcessOutput;
-import com.android.utils.GrabProcessOutput.IProcessOutput;
-import com.android.utils.GrabProcessOutput.Wait;
-import com.android.sdkuilib.repository.SdkUpdaterWindow;
-import com.android.sdkuilib.repository.SdkUpdaterWindow.SdkInvocationContext;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.jface.dialogs.ProgressMonitorDialog;
-import org.eclipse.jface.operation.IRunnableWithProgress;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.IObjectActionDelegate;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.IWorkbenchWindowActionDelegate;
-
-import java.io.File;
-import java.lang.reflect.InvocationTargetException;
-import java.util.concurrent.atomic.AtomicBoolean;
-
-/**
- * Delegate for the toolbar/menu action "Android SDK Manager".
- * It displays the Android SDK Manager.
- */
-public class SdkManagerAction implements IWorkbenchWindowActionDelegate, IObjectActionDelegate {
-
-    @Override
-    public void dispose() {
-        // nothing to dispose.
-    }
-
-    @Override
-    public void init(IWorkbenchWindow window) {
-        // no init
-    }
-
-    @Override
-    public void run(IAction action) {
-        // Although orthogonal to the sdk manager action, this is a good time
-        // to check whether the SDK has changed on disk.
-        AdtPlugin.getDefault().refreshSdk();
-
-        if (!openExternalSdkManager()) {
-            // If we failed to execute the sdk manager, check the SDK location.
-            // If it's not properly set, the check will display a dialog to state
-            // so to the user and a link to the prefs.
-            // Here's it's ok to call checkSdkLocationAndId() since it will not try
-            // to run the SdkManagerAction (it might run openExternalSdkManager though.)
-            // If checkSdkLocationAndId tries to open the SDK Manager, it end up using
-            // the internal one.
-            if (AdtPlugin.getDefault().checkSdkLocationAndId()) {
-                // The SDK check was successful, yet the sdk manager fail to launch anyway.
-                AdtPlugin.displayError(
-                        "Android SDK",
-                        "Failed to run the Android SDK Manager. Check the Android Console View for details.");
-            }
-        }
-    }
-
-    /**
-     * A custom implementation of {@link ProgressMonitorDialog} that allows us
-     * to rename the "Cancel" button to "Close" from the internal task.
-     */
-    private static class CloseableProgressMonitorDialog extends ProgressMonitorDialog {
-
-        public CloseableProgressMonitorDialog(Shell parent) {
-            super(parent);
-        }
-
-        public void changeCancelToClose() {
-            if (cancel != null && !cancel.isDisposed()) {
-                Display display = getShell() == null ? null : getShell().getDisplay();
-                if (display != null) {
-                    display.syncExec(new Runnable() {
-                        @Override
-                        public void run() {
-                            if (cancel != null && !cancel.isDisposed()) {
-                                cancel.setText(IDialogConstants.CLOSE_LABEL);
-                            }
-                        }
-                    });
-                }
-            }
-        }
-    }
-
-    /**
-     * Opens the SDK Manager as an external application.
-     * This call is asynchronous, it doesn't wait for the manager to be closed.
-     * <p/>
-     * Important: this method must NOT invoke {@link AdtPlugin#checkSdkLocationAndId}
-     * (in any of its variations) since the dialog uses this method to invoke the sdk
-     * manager if needed.
-     *
-     * @return True if the application was found and executed. False if it could not
-     *   be located or could not be launched.
-     */
-    public static boolean openExternalSdkManager() {
-
-        // On windows this takes a couple seconds and it's not clear the launch action
-        // has been invoked. To prevent the user from randomly clicking the "open sdk manager"
-        // button multiple times, show a progress window that will automatically close
-        // after a couple seconds.
-
-        // By default openExternalSdkManager will return false.
-        final AtomicBoolean returnValue = new AtomicBoolean(false);
-
-        final CloseableProgressMonitorDialog p =
-            new CloseableProgressMonitorDialog(AdtPlugin.getShell());
-        p.setOpenOnRun(true);
-        try {
-            p.run(true /*fork*/, true /*cancelable*/, new IRunnableWithProgress() {
-                @Override
-                public void run(IProgressMonitor monitor)
-                        throws InvocationTargetException, InterruptedException {
-
-                    // Get the SDK locatiom from the current SDK or as fallback
-                    // directly from the ADT preferences.
-                    Sdk sdk = Sdk.getCurrent();
-                    String osSdkLocation = sdk == null ? null : sdk.getSdkOsLocation();
-                    if (osSdkLocation == null || !new File(osSdkLocation).isDirectory()) {
-                        osSdkLocation = AdtPrefs.getPrefs().getOsSdkFolder();
-                    }
-
-                    // If there's no SDK location or it's not a valid directory,
-                    // there's nothing we can do. When this is invoked from run()
-                    // the checkSdkLocationAndId method call should display a dialog
-                    // telling the user to configure the preferences.
-                    if (osSdkLocation == null || !new File(osSdkLocation).isDirectory()) {
-                        return;
-                    }
-
-                    final int numIter = 30;  //30*100=3s to wait for window
-                    final int sleepMs = 100;
-                    monitor.beginTask("Starting Android SDK Manager", numIter);
-
-                    File androidBat = FileOp.append(
-                            osSdkLocation,
-                            SdkConstants.FD_TOOLS,
-                            SdkConstants.androidCmdName());
-
-                    if (!androidBat.exists()) {
-                        AdtPlugin.printErrorToConsole("SDK Manager",
-                                "Missing %s file in Android SDK.", SdkConstants.androidCmdName());
-                        return;
-                    }
-
-                    if (monitor.isCanceled()) {
-                        // Canceled by user; return true as if it succeeded.
-                        returnValue.set(true);
-                        return;
-                    }
-
-                    p.changeCancelToClose();
-
-                    try {
-                        final AdtConsoleSdkLog logger = new AdtConsoleSdkLog();
-
-                        String command[] = new String[] {
-                                androidBat.getAbsolutePath(),
-                                "sdk"   //$NON-NLS-1$
-                        };
-                        Process process = Runtime.getRuntime().exec(command);
-                        GrabProcessOutput.grabProcessOutput(
-                                process,
-                                Wait.ASYNC,
-                                new IProcessOutput() {
-                                    @Override
-                                    public void out(@Nullable String line) {
-                                        // Ignore stdout
-                                    }
-
-                                    @Override
-                                    public void err(@Nullable String line) {
-                                        if (line != null) {
-                                            logger.info("[SDK Manager] %s", line);
-                                        }
-                                    }
-                                });
-
-                        // Set openExternalSdkManager to return true.
-                        returnValue.set(true);
-                    } catch (Exception ignore) {
-                    }
-
-                    // This small wait prevents the progress dialog from closing too fast.
-                    for (int i = 0; i < numIter; i++) {
-                        if (monitor.isCanceled()) {
-                            // Canceled by user; return true as if it succeeded.
-                            returnValue.set(true);
-                            return;
-                        }
-                        if (i == 10) {
-                            monitor.subTask("Initializing... SDK Manager will show up shortly.");
-                        }
-                        try {
-                            Thread.sleep(sleepMs);
-                            monitor.worked(1);
-                        } catch (InterruptedException e) {
-                            // ignore
-                        }
-                    }
-
-                    monitor.done();
-                }
-            });
-        } catch (Exception e) {
-            AdtPlugin.log(e, "SDK Manager exec failed");    //$NON-NLS-1#
-            return false;
-        }
-
-        return returnValue.get();
-    }
-
-    /**
-     * Opens the SDK Manager bundled within ADT.
-     * The call is blocking and does not return till the SD Manager window is closed.
-     *
-     * @return True if the SDK location is known and the SDK Manager was started.
-     *   False if the SDK location is not set and we can't open a SDK Manager to
-     *   manage files in an unknown location.
-     */
-    public static boolean openAdtSdkManager() {
-        final Sdk sdk = Sdk.getCurrent();
-        if (sdk == null) {
-            return false;
-        }
-
-        // Runs the updater window, directing only warning/errors logs to the ADT console
-        // (normal log is just dropped, which is fine since the SDK Manager has its own
-        // log window now.)
-
-        SdkUpdaterWindow window = new SdkUpdaterWindow(
-                AdtPlugin.getShell(),
-                new AdtConsoleSdkLog() {
-                    @Override
-                    public void info(@NonNull String msgFormat, Object... args) {
-                        // Do not show non-error/warning log in Eclipse.
-                    };
-                    @Override
-                    public void verbose(@NonNull String msgFormat, Object... args) {
-                        // Do not show non-error/warning log in Eclipse.
-                    };
-                },
-                sdk.getSdkOsLocation(),
-                SdkInvocationContext.IDE);
-
-        ISdkChangeListener listener = new ISdkChangeListener() {
-            @Override
-            public void onSdkLoaded() {
-                // Ignore initial load of the SDK.
-            }
-
-            /**
-             * Unload all we can from the SDK before new packages are installed.
-             * Typically we need to get rid of references to dx from platform-tools
-             * and to any platform resource data.
-             * <p/>
-             * {@inheritDoc}
-             */
-            @Override
-            public void preInstallHook() {
-
-                // TODO we need to unload as much of as SDK as possible. Otherwise
-                // on Windows we end up with Eclipse locking some files and we can't
-                // replace them.
-                //
-                // At this point, we know what the user wants to install so it would be
-                // possible to pass in flags to know what needs to be unloaded. Typically
-                // we need to:
-                // - unload dex if platform-tools is going to be updated. There's a vague
-                //   attempt below at removing any references to dex and GCing. Seems
-                //   to do the trick.
-                // - unload any target that is going to be updated since it may have
-                //   resource data used by a current layout editor (e.g. data/*.ttf
-                //   and various data/res/*.xml).
-                //
-                // Most important we need to make sure there isn't a build going on
-                // and if there is one, either abort it or wait for it to complete and
-                // then we want to make sure we don't get any attempt to use the SDK
-                // before the postInstallHook is called.
-
-                if (sdk != null) {
-                    sdk.unloadTargetData(true /*preventReload*/);
-                    sdk.unloadDexWrappers();
-                }
-            }
-
-            /**
-             * Nothing to do. We'll reparse the SDK later in onSdkReload.
-             * <p/>
-             * {@inheritDoc}
-             */
-            @Override
-            public void postInstallHook() {
-            }
-
-            /**
-             * Reparse the SDK in case anything was add/removed.
-             * <p/>
-             * {@inheritDoc}
-             */
-            @Override
-            public void onSdkReload() {
-                AdtPlugin.getDefault().reparseSdk();
-            }
-        };
-
-        window.addListener(listener);
-        window.open();
-
-        return true;
-    }
-
-    @Override
-    public void selectionChanged(IAction action, ISelection selection) {
-        // nothing related to the current selection.
-    }
-
-    @Override
-    public void setActivePart(IAction action, IWorkbenchPart targetPart) {
-        // nothing to do.
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/assetstudio/AssetType.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/assetstudio/AssetType.java
deleted file mode 100644
index 5cfeebb..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/assetstudio/AssetType.java
+++ /dev/null
@@ -1,88 +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.eclipse.adt.internal.assetstudio;
-
-/**
- * The type of asset to create: launcher icon, menu icon, etc.
- */
-public enum AssetType {
-    /** Launcher icon to be shown in the application list */
-    LAUNCHER("Launcher Icons", "ic_launcher"),                             //$NON-NLS-2$
-
-    /** Icons shown in the action bar */
-    ACTIONBAR("Action Bar and Tab Icons (Android 3.0+)", "ic_action_%s"),  //$NON-NLS-2$
-
-    /** Icons shown in a notification message */
-    NOTIFICATION("Notification Icons", "ic_stat_%s"),                      //$NON-NLS-2$
-
-    /** Icons shown as part of tabs */
-    TAB("Pre-Android 3.0 Tab Icons", "ic_tab_%s"),                         //$NON-NLS-2$
-
-    /** Icons shown in menus */
-    MENU("Pre-Android 3.0 Menu Icons", "ic_menu_%s");                      //$NON-NLS-2$
-
-    /** Display name to show to the user in the asset type selection list */
-    private final String mDisplayName;
-
-    /** Default asset name format */
-    private String mDefaultNameFormat;
-
-    AssetType(String displayName, String defaultNameFormat) {
-        mDisplayName = displayName;
-        mDefaultNameFormat = defaultNameFormat;
-    }
-
-    /**
-     * Returns the display name of this asset type to show to the user in the
-     * asset wizard selection page etc
-     */
-    String getDisplayName() {
-        return mDisplayName;
-    }
-
-    /**
-     * Returns the default format to use to suggest a name for the asset
-     */
-    String getDefaultNameFormat() {
-        return mDefaultNameFormat;
-    }
-
-    /** Whether this asset type configures foreground scaling */
-    boolean needsForegroundScaling() {
-        return this == LAUNCHER;
-    }
-
-    /** Whether this asset type needs a shape parameter */
-    boolean needsShape() {
-        return this == LAUNCHER;
-    }
-
-    /** Whether this asset type needs foreground and background color parameters */
-    boolean needsColors() {
-        return this == LAUNCHER;
-    }
-
-    /** Whether this asset type needs an effects parameter */
-    boolean needsEffects() {
-        return this == LAUNCHER;
-    }
-
-    /** Whether this asset type needs a theme parameter */
-    boolean needsTheme() {
-        return this == ACTIONBAR;
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/assetstudio/ChooseAssetTypePage.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/assetstudio/ChooseAssetTypePage.java
deleted file mode 100644
index a26a22e..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/assetstudio/ChooseAssetTypePage.java
+++ /dev/null
@@ -1,225 +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.eclipse.adt.internal.assetstudio;
-
-import com.android.ide.eclipse.adt.internal.project.ProjectChooserHelper;
-import com.android.ide.eclipse.adt.internal.project.ProjectChooserHelper.ProjectCombo;
-import com.android.ide.eclipse.adt.internal.resources.ResourceNameValidator;
-import com.android.resources.ResourceFolderType;
-
-import org.eclipse.jface.dialogs.IMessageProvider;
-import org.eclipse.jface.wizard.WizardPage;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.dnd.Clipboard;
-import org.eclipse.swt.dnd.TextTransfer;
-import org.eclipse.swt.dnd.Transfer;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Text;
-
-/** Page for choosing the type of asset to create, as well as the target project */
-public class ChooseAssetTypePage extends WizardPage implements SelectionListener, ModifyListener {
-    private final CreateAssetSetWizardState mValues;
-    private ProjectCombo mProjectButton;
-    private Button mClipboardButton;
-    private Text mNameText;
-    private boolean mNameModified;
-    private Label mResourceName;
-
-    /**
-     * Create the wizard.
-     */
-    public ChooseAssetTypePage(CreateAssetSetWizardState values) {
-        super("chooseAssetTypePage");
-        mValues = values;
-        setTitle("Choose Icon Set Type");
-        setDescription("Select the type of icon set to create:");
-    }
-
-    /**
-     * Create contents of the wizard.
-     *
-     * @param parent the parent composite
-     */
-    @Override
-    public void createControl(Composite parent) {
-        Composite container = new Composite(parent, SWT.NULL);
-
-        setControl(container);
-        container.setLayout(new GridLayout(3, false));
-
-        for (AssetType type : AssetType.values()) {
-            Button button = new Button(container, SWT.RADIO);
-            button.setData(type);
-            button.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false, 3, 1));
-            button.setSelection(type == mValues.type);
-            button.setText(type.getDisplayName());
-            button.addSelectionListener(this);
-        }
-
-        Label separator = new Label(container, SWT.SEPARATOR | SWT.HORIZONTAL);
-        GridData gdSeparator = new GridData(SWT.FILL, SWT.CENTER, false, false, 3, 1);
-        gdSeparator.heightHint = 20;
-        separator.setLayoutData(gdSeparator);
-
-        Label projectLabel = new Label(container, SWT.NONE);
-        projectLabel.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1));
-        projectLabel.setText("Project:");
-
-        ProjectChooserHelper helper =
-                new ProjectChooserHelper(getShell(), null /* filter */);
-        mProjectButton = new ProjectCombo(helper, container, mValues.project);
-        mProjectButton.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 2, 1));
-        mProjectButton.addSelectionListener(this);
-
-        Label assetLabel = new Label(container, SWT.NONE);
-        assetLabel.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1));
-        assetLabel.setText("Icon Name:");
-
-        mNameText = new Text(container, SWT.BORDER);
-        mNameText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 2, 1));
-        mNameText.addModifyListener(this);
-
-        Label resourceLabel = new Label(container, SWT.NONE);
-        resourceLabel.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1));
-        resourceLabel.setText("Resource:");
-
-        mResourceName = new Label(container, SWT.NONE);
-        mResourceName.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
-
-        mClipboardButton = new Button(container, SWT.FLAT);
-        mClipboardButton.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1));
-        mClipboardButton.setText("Copy Name to Clipboard");
-
-        mClipboardButton.addSelectionListener(this);
-
-        updateAssetType();
-        validatePage();
-        parent.getDisplay().asyncExec(new Runnable() {
-            @Override
-            public void run() {
-                mNameText.setFocus();
-            }
-        });
-    }
-
-    private void updateAssetType() {
-        if (!mNameModified) {
-            // Default name suggestion, possibly as a suffix, e.g. "ic_menu_<name>"
-            String replace = "name";
-            String suggestedName = String.format(mValues.type.getDefaultNameFormat(), replace);
-            mNameText.setText(suggestedName);
-            mValues.outputName = suggestedName;
-
-            updateResourceLabel();
-            mNameModified = false;
-            int start = suggestedName.indexOf(replace);
-            if (start != -1) {
-                mNameText.setSelection(start, start + replace.length());
-            } else {
-                mNameText.selectAll();
-            }
-        } else {
-            mNameText.selectAll();
-        }
-    }
-
-    private void updateResourceLabel() {
-        mResourceName.setText("@drawable/" + getOutputName()); //$NON-NLS-1$
-    }
-
-    @Override
-    public boolean canFlipToNextPage() {
-        return mValues.project != null;
-    }
-
-    @Override
-    public void widgetSelected(SelectionEvent e) {
-        Object source = e.getSource();
-        if (source == mProjectButton) {
-            mValues.project = mProjectButton.getSelectedProject();
-            validatePage();
-        } else if (source == mClipboardButton) {
-            Clipboard clipboard = new Clipboard(getShell().getDisplay());
-            TextTransfer textTransfer = TextTransfer.getInstance();
-            clipboard.setContents(
-                    new Object[] { mResourceName.getText() },
-                    new Transfer[] { textTransfer });
-            clipboard.dispose();
-        } else if (source instanceof Button) {
-            // User selected a different asset type to be created
-            Object data = ((Button) source).getData();
-            if (data instanceof AssetType) {
-                mValues.type = (AssetType) data;
-                CreateAssetSetWizardState.sLastType = mValues.type;
-                updateAssetType();
-            }
-        }
-    }
-
-    @Override
-    public void widgetDefaultSelected(SelectionEvent e) {
-    }
-
-    @Override
-    public void modifyText(ModifyEvent e) {
-        Object source = e.getSource();
-        if (source == mNameText) {
-            mNameModified = true;
-            mValues.outputName = mNameText.getText().trim();
-            updateResourceLabel();
-        }
-
-        validatePage();
-    }
-
-    private String getOutputName() {
-        return mNameText.getText().trim();
-    }
-
-    private void validatePage() {
-        String error = null;
-
-        if (mValues.project == null) {
-            error = "Please select an Android project.";
-        } else {
-            String outputName = getOutputName();
-            if (outputName == null || outputName.length() == 0) {
-                error = "Please enter a name";
-            } else {
-                ResourceNameValidator validator =
-                        ResourceNameValidator.create(true, ResourceFolderType.DRAWABLE);
-                error = validator.isValid(outputName);
-            }
-        }
-
-        setPageComplete(error == null);
-        if (error != null) {
-            setMessage(error, IMessageProvider.ERROR);
-        } else {
-            setErrorMessage(null);
-            setMessage(null);
-        }
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/assetstudio/ConfigureAssetSetPage.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/assetstudio/ConfigureAssetSetPage.java
deleted file mode 100644
index 17336ad..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/assetstudio/ConfigureAssetSetPage.java
+++ /dev/null
@@ -1,1251 +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.eclipse.adt.internal.assetstudio;
-
-import static com.android.ide.eclipse.adt.internal.wizards.templates.NewProjectWizard.DEFAULT_LAUNCHER_ICON;
-import static java.awt.image.BufferedImage.TYPE_INT_ARGB;
-
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-import com.android.assetstudiolib.ActionBarIconGenerator;
-import com.android.assetstudiolib.GraphicGenerator;
-import com.android.assetstudiolib.GraphicGenerator.Shape;
-import com.android.assetstudiolib.LauncherIconGenerator;
-import com.android.assetstudiolib.MenuIconGenerator;
-import com.android.assetstudiolib.NotificationIconGenerator;
-import com.android.assetstudiolib.TabIconGenerator;
-import com.android.assetstudiolib.TextRenderUtil;
-import com.android.assetstudiolib.Util;
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.ide.eclipse.adt.AdtUtils;
-import com.android.ide.eclipse.adt.internal.assetstudio.CreateAssetSetWizardState.SourceType;
-import com.android.ide.eclipse.adt.internal.editors.layout.gle2.ImageControl;
-import com.android.ide.eclipse.adt.internal.editors.layout.gle2.ImageUtils;
-import com.android.ide.eclipse.adt.internal.editors.layout.gle2.SwtUtils;
-import com.android.ide.eclipse.adt.internal.editors.manifest.ManifestInfo;
-import com.android.utils.Pair;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IWorkspaceRoot;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.jface.dialogs.IMessageProvider;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.jface.wizard.WizardPage;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.ScrolledComposite;
-import org.eclipse.swt.custom.StackLayout;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.events.MouseAdapter;
-import org.eclipse.swt.events.MouseEvent;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.FontData;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.graphics.RGB;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.layout.RowData;
-import org.eclipse.swt.layout.RowLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.ColorDialog;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.FileDialog;
-import org.eclipse.swt.widgets.FontDialog;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Slider;
-import org.eclipse.swt.widgets.Text;
-
-import java.awt.Paint;
-import java.awt.image.BufferedImage;
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.LinkedHashMap;
-import java.util.Map;
-import java.util.Map.Entry;
-
-import javax.imageio.ImageIO;
-
-/**
- * This is normally page 2 of a Create New Asset Set wizard, unless we can offer actions
- * to create a specific asset type, in which case we skip page 1. On this page the user
- * gets to configure the parameters of the asset, and see a preview.
- */
-public class ConfigureAssetSetPage extends WizardPage implements SelectionListener,
-        ModifyListener {
-    private final CreateAssetSetWizardState mValues;
-
-    private static final int PREVIEW_AREA_WIDTH = 144;
-
-    private boolean mShown;
-
-    private Composite mConfigurationArea;
-    private Button mImageRadio;
-    private Button mClipartRadio;
-    private Button mTextRadio;
-    private Button mPickImageButton;
-    private Button mTrimCheckBox;
-    private Slider mPaddingSlider;
-    private Label mPercentLabel;
-    private Button mCropRadio;
-    private Button mCenterRadio;
-    private Button mNoShapeRadio;
-    private Button mSquareRadio;
-    private Button mCircleButton;
-    private Button mBgButton;
-    private Button mFgButton;
-    private Composite mPreviewArea;
-    private Button mFontButton;
-    private Composite mForegroundArea;
-    private Composite mImageForm;
-    private Composite mClipartForm;
-    private Composite mTextForm;
-    private Text mImagePathText;
-
-    private boolean mTimerPending;
-    private RGB mBgColor;
-    private RGB mFgColor;
-    private Text mText;
-
-    /** Most recently set image path: preserved across wizard sessions */
-    private static String sImagePath;
-    private Button mChooseClipart;
-    private Composite mClipartPreviewPanel;
-    private Label mThemeLabel;
-    private Composite mThemeComposite;
-    private Button mHoloLightRadio;
-    private Button mHoloDarkRadio;
-    private Label mScalingLabel;
-    private Composite mScalingComposite;
-    private Label mShapeLabel;
-    private Composite mShapeComposite;
-    private Label mBgColorLabel;
-    private Label mFgColorLabel;
-
-    private boolean mIgnore;
-    private SourceType mShowingType;
-
-    /**
-     * Create the wizard.
-     *
-     * @param values the wizard state
-     */
-    public ConfigureAssetSetPage(CreateAssetSetWizardState values) {
-        super("configureAssetPage");
-        mValues = values;
-
-        setTitle("Configure Icon Set");
-        setDescription("Configure the attributes of the icon set");
-    }
-
-    /**
-     * Create contents of the wizard.
-     *
-     * @param parent the parent widget
-     */
-    @Override
-    @SuppressWarnings("unused") // Don't warn about unassigned "new Label(.)": has side-effect
-    public void createControl(Composite parent) {
-        Composite container = new Composite(parent, SWT.NULL);
-
-        setControl(container);
-        GridLayout glContainer = new GridLayout(2, false);
-        glContainer.marginWidth = 0;
-        glContainer.horizontalSpacing = 0;
-        glContainer.marginHeight = 0;
-        glContainer.verticalSpacing = 0;
-        container.setLayout(glContainer);
-
-        ScrolledComposite configurationScrollArea = new ScrolledComposite(container, SWT.V_SCROLL);
-        configurationScrollArea.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 2));
-        configurationScrollArea.setExpandHorizontal(true);
-        configurationScrollArea.setExpandVertical(true);
-
-        mConfigurationArea = new Composite(configurationScrollArea, SWT.NONE);
-        GridLayout glConfigurationArea = new GridLayout(3, false);
-        glConfigurationArea.horizontalSpacing = 0;
-        glConfigurationArea.marginRight = 15;
-        glConfigurationArea.marginWidth = 0;
-        glConfigurationArea.marginHeight = 0;
-        mConfigurationArea.setLayout(glConfigurationArea);
-
-        Label foregroundLabel = new Label(mConfigurationArea, SWT.NONE);
-        foregroundLabel.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1));
-        foregroundLabel.setText("Foreground:");
-
-        Composite foregroundComposite = new Composite(mConfigurationArea, SWT.NONE);
-        foregroundComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false, 2, 1));
-        GridLayout glForegroundComposite = new GridLayout(5, false);
-        glForegroundComposite.horizontalSpacing = 0;
-        foregroundComposite.setLayout(glForegroundComposite);
-
-        mImageRadio = new Button(foregroundComposite, SWT.FLAT | SWT.TOGGLE);
-        mImageRadio.setSelection(false);
-        mImageRadio.addSelectionListener(this);
-        mImageRadio.setText("Image");
-
-        mClipartRadio = new Button(foregroundComposite, SWT.FLAT | SWT.TOGGLE);
-        mClipartRadio.setText("Clipart");
-        mClipartRadio.addSelectionListener(this);
-
-        mTextRadio = new Button(foregroundComposite, SWT.FLAT | SWT.TOGGLE);
-        mTextRadio.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false, 3, 1));
-        mTextRadio.setText("Text");
-        mTextRadio.addSelectionListener(this);
-        new Label(mConfigurationArea, SWT.NONE);
-
-        mForegroundArea = new Composite(mConfigurationArea, SWT.NONE);
-        mForegroundArea.setLayout(new StackLayout());
-        mForegroundArea.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false, 2, 1));
-
-        mImageForm = new Composite(mForegroundArea, SWT.NONE);
-        mImageForm.setLayout(new GridLayout(3, false));
-
-        Label fileLabel = new Label(mImageForm, SWT.NONE);
-        fileLabel.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1));
-        fileLabel.setText("Image File:");
-
-        mImagePathText = new Text(mImageForm, SWT.BORDER);
-        GridData pathLayoutData = new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1);
-        pathLayoutData.widthHint = 200;
-        mImagePathText.setLayoutData(pathLayoutData);
-        mImagePathText.addSelectionListener(this);
-        mImagePathText.addModifyListener(this);
-
-        mPickImageButton = new Button(mImageForm, SWT.FLAT);
-        mPickImageButton.setText("Browse...");
-        mPickImageButton.addSelectionListener(this);
-
-        mClipartForm = new Composite(mForegroundArea, SWT.NONE);
-        mClipartForm.setLayout(new GridLayout(2, false));
-
-        mChooseClipart = new Button(mClipartForm, SWT.FLAT);
-        mChooseClipart.setText("Choose...");
-        mChooseClipart.addSelectionListener(this);
-
-        mClipartPreviewPanel = new Composite(mClipartForm, SWT.NONE);
-        RowLayout rlClipartPreviewPanel = new RowLayout(SWT.HORIZONTAL);
-        rlClipartPreviewPanel.marginBottom = 0;
-        rlClipartPreviewPanel.marginTop = 0;
-        rlClipartPreviewPanel.center = true;
-        mClipartPreviewPanel.setLayout(rlClipartPreviewPanel);
-        mClipartPreviewPanel.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));
-
-        mTextForm = new Composite(mForegroundArea, SWT.NONE);
-        mTextForm.setLayout(new GridLayout(2, false));
-
-        Label textLabel = new Label(mTextForm, SWT.NONE);
-        textLabel.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1));
-        textLabel.setText("Text:");
-
-        mText = new Text(mTextForm, SWT.BORDER);
-        mText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
-        mText.addModifyListener(this);
-
-        Label fontLabel = new Label(mTextForm, SWT.NONE);
-        fontLabel.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1));
-        fontLabel.setText("Font:");
-
-        mFontButton = new Button(mTextForm, SWT.FLAT);
-        mFontButton.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, true, false, 1, 1));
-        mFontButton.addSelectionListener(this);
-        mFontButton.setText("Choose Font...");
-        new Label(mConfigurationArea, SWT.NONE);
-
-        mTrimCheckBox = new Button(mConfigurationArea, SWT.CHECK);
-        mTrimCheckBox.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false, 2, 1));
-        mTrimCheckBox.setSelection(false);
-        mTrimCheckBox.setText("Trim Surrounding Blank Space");
-        mTrimCheckBox.addSelectionListener(this);
-        new Label(mConfigurationArea, SWT.NONE);
-
-        Label paddingLabel = new Label(mConfigurationArea, SWT.NONE);
-        paddingLabel.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false, 2, 1));
-        paddingLabel.setText("Additional Padding:");
-        new Label(mConfigurationArea, SWT.NONE);
-
-        mPaddingSlider = new Slider(mConfigurationArea, SWT.NONE);
-        mPaddingSlider.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
-        // This doesn't work right -- not sure why. For now just use a plain slider
-        // and subtract 10 from it to get the real range.
-        //mPaddingSlider.setValues(0, -10, 50, 0, 1, 10);
-        //mPaddingSlider.setSelection(10 + 15);
-        mPaddingSlider.addSelectionListener(this);
-
-        mPercentLabel = new Label(mConfigurationArea, SWT.NONE);
-        mPercentLabel.setText("  15%"); // Enough available space for -10%
-        mScalingLabel = new Label(mConfigurationArea, SWT.NONE);
-        mScalingLabel.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1));
-        mScalingLabel.setText("Foreground Scaling:");
-
-        mScalingComposite = new Composite(mConfigurationArea, SWT.NONE);
-        mScalingComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false, 2, 1));
-        GridLayout gl_mScalingComposite = new GridLayout(5, false);
-        gl_mScalingComposite.horizontalSpacing = 0;
-        mScalingComposite.setLayout(gl_mScalingComposite);
-
-        mCropRadio = new Button(mScalingComposite, SWT.FLAT | SWT.TOGGLE);
-        mCropRadio.setSelection(true);
-        mCropRadio.setText("Crop");
-        mCropRadio.addSelectionListener(this);
-
-        mCenterRadio = new Button(mScalingComposite, SWT.FLAT | SWT.TOGGLE);
-        mCenterRadio.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false, 4, 1));
-        mCenterRadio.setText("Center");
-        mCenterRadio.addSelectionListener(this);
-
-        mShapeLabel = new Label(mConfigurationArea, SWT.NONE);
-        mShapeLabel.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1));
-        mShapeLabel.setText("Shape");
-
-        mShapeComposite = new Composite(mConfigurationArea, SWT.NONE);
-        mShapeComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false, 2, 1));
-        GridLayout gl_mShapeComposite = new GridLayout(6, false);
-        gl_mShapeComposite.horizontalSpacing = 0;
-        mShapeComposite.setLayout(gl_mShapeComposite);
-
-        mNoShapeRadio = new Button(mShapeComposite, SWT.FLAT | SWT.TOGGLE);
-        mNoShapeRadio.setText("None");
-        mNoShapeRadio.addSelectionListener(this);
-
-        mSquareRadio = new Button(mShapeComposite, SWT.FLAT | SWT.TOGGLE);
-        mSquareRadio.setSelection(true);
-        mSquareRadio.setText("Square");
-        mSquareRadio.addSelectionListener(this);
-
-        mCircleButton = new Button(mShapeComposite, SWT.FLAT | SWT.TOGGLE);
-        mCircleButton.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false, 4, 1));
-        mCircleButton.setText("Circle");
-        mCircleButton.addSelectionListener(this);
-
-        mThemeLabel = new Label(mConfigurationArea, SWT.NONE);
-        mThemeLabel.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1));
-        mThemeLabel.setText("Theme");
-
-        mThemeComposite = new Composite(mConfigurationArea, SWT.NONE);
-        mThemeComposite.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 2, 1));
-        GridLayout gl_mThemeComposite = new GridLayout(2, false);
-        gl_mThemeComposite.horizontalSpacing = 0;
-        mThemeComposite.setLayout(gl_mThemeComposite);
-
-        mHoloLightRadio = new Button(mThemeComposite, SWT.FLAT | SWT.TOGGLE);
-        mHoloLightRadio.setText("Holo Light");
-        mHoloLightRadio.setSelection(true);
-        mHoloLightRadio.addSelectionListener(this);
-
-        mHoloDarkRadio = new Button(mThemeComposite, SWT.FLAT | SWT.TOGGLE);
-        mHoloDarkRadio.setText("Holo Dark");
-        mHoloDarkRadio.addSelectionListener(this);
-
-        mBgColorLabel = new Label(mConfigurationArea, SWT.NONE);
-        mBgColorLabel.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1));
-        mBgColorLabel.setText("Background Color:");
-
-        mBgButton = new Button(mConfigurationArea, SWT.FLAT);
-        mBgButton.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false, 2, 1));
-        mBgButton.addSelectionListener(this);
-        mBgButton.setAlignment(SWT.CENTER);
-
-        mFgColorLabel = new Label(mConfigurationArea, SWT.NONE);
-        mFgColorLabel.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1));
-        mFgColorLabel.setText("Foreground Color:");
-
-        mFgButton = new Button(mConfigurationArea, SWT.FLAT);
-        mFgButton.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false, 2, 1));
-        mFgButton.setAlignment(SWT.CENTER);
-        mFgButton.addSelectionListener(this);
-
-        configurationScrollArea.setContent(mConfigurationArea);
-        configurationScrollArea.setMinSize(mConfigurationArea.computeSize(SWT.DEFAULT,
-                SWT.DEFAULT));
-
-        Label previewLabel = new Label(container, SWT.NONE);
-        previewLabel.setLayoutData(new GridData(SWT.CENTER, SWT.CENTER, false, false, 1, 1));
-        previewLabel.setText("Preview:");
-
-        mPreviewArea = new Composite(container, SWT.BORDER);
-
-        RowLayout rlPreviewAreaPreviewArea = new RowLayout(SWT.HORIZONTAL);
-        rlPreviewAreaPreviewArea.wrap = true;
-        rlPreviewAreaPreviewArea.pack = true;
-        rlPreviewAreaPreviewArea.center = true;
-        rlPreviewAreaPreviewArea.spacing = 0;
-        rlPreviewAreaPreviewArea.marginBottom = 0;
-        rlPreviewAreaPreviewArea.marginTop = 0;
-        rlPreviewAreaPreviewArea.marginRight = 0;
-        rlPreviewAreaPreviewArea.marginLeft = 0;
-        mPreviewArea.setLayout(rlPreviewAreaPreviewArea);
-        GridData gdMPreviewArea = new GridData(SWT.FILL, SWT.FILL, false, false, 1, 1);
-        gdMPreviewArea.widthHint = PREVIEW_AREA_WIDTH;
-        mPreviewArea.setLayoutData(gdMPreviewArea);
-
-        // Initial color
-        Display display = parent.getDisplay();
-        updateColor(display, mValues.background, true /*background*/);
-        updateColor(display, mValues.foreground, false /*background*/);
-
-        setSourceType(mValues.sourceType);
-
-        new Label(mConfigurationArea, SWT.NONE);
-        new Label(mConfigurationArea, SWT.NONE);
-        new Label(mConfigurationArea, SWT.NONE);
-
-        validatePage();
-    }
-
-    void configureAssetType(AssetType type) {
-        if (mValues.sourceType != mShowingType) {
-            mShowingType = mValues.sourceType;
-            showGroup(type.needsForegroundScaling(), mScalingLabel, mScalingComposite);
-            showGroup(type.needsShape(), mShapeLabel, mShapeComposite);
-            showGroup(type.needsTheme(), mThemeLabel, mThemeComposite);
-            showGroup(type.needsColors(), mBgColorLabel, mBgButton);
-            showGroup(type.needsColors() && mValues.sourceType != SourceType.IMAGE,
-                    mFgColorLabel, mFgButton);
-
-            Composite parent = mScalingLabel.getParent();
-            parent.pack();
-            parent.layout();
-        }
-    }
-
-    private static void showGroup(boolean show, Control control1, Control control2) {
-        showControl(show, control1);
-        showControl(show, control2);
-    }
-
-    private static void showControl(boolean show, Control control) {
-        Object data = control.getLayoutData();
-        if (data instanceof GridData) {
-            GridData gridData = (GridData) data;
-            gridData.exclude = !show;
-        }
-        control.setVisible(show);
-    }
-
-    @Override
-    public void setVisible(boolean visible) {
-        super.setVisible(visible);
-
-        // We update the image selection here rather than in {@link #createControl} because
-        // that method is called when the wizard is created, and we want to wait until the
-        // user has chosen a project before attempting to look up the right default image to use
-        if (visible) {
-            mShown = true;
-
-            // Clear out old previews - important if the user goes back to page one, changes
-            // asset type and steps into page 2 - at that point we arrive here and we might
-            // display the old previews for a brief period until the preview delay timer expires.
-            for (Control c : mPreviewArea.getChildren()) {
-                c.dispose();
-            }
-            mPreviewArea.layout(true);
-
-            // Update asset type configuration: will show/hide parameter controls depending
-            // on which asset type is chosen
-            AssetType type = mValues.type;
-            assert type != null;
-            configureAssetType(type);
-
-            // Initial image - use the most recently used image, or the default launcher
-            // icon created in our default projects, if there
-            if (mValues.imagePath != null) {
-                sImagePath = mValues.imagePath.getPath();
-            }
-            if (sImagePath == null) {
-                IProject project = mValues.project;
-                if (project != null) {
-                    IResource icon = project.findMember("res/drawable-hdpi/icon.png"); //$NON-NLS-1$
-                    if (icon != null) {
-                        IWorkspaceRoot workspace = ResourcesPlugin.getWorkspace().getRoot();
-                        IPath workspacePath = workspace.getLocation();
-                        sImagePath = workspacePath.append(icon.getFullPath()).toOSString();
-                    }
-                }
-            }
-            if (sImagePath != null) {
-                mValues.imagePath = new File(sImagePath);
-                mImagePathText.setText(sImagePath);
-            }
-
-            try {
-                mIgnore = true;
-
-                mTrimCheckBox.setSelection(mValues.trim);
-
-                // This doesn't work right -- not sure why. For now just use a plain slider
-                // and subtract 10 from it to get the real range.
-                //mPaddingSlider.setValues(0, -10, 50, 0, 1, 10);
-                //mPaddingSlider.setSelection(10 + 15);
-                mPaddingSlider.setSelection(mValues.padding + 10);
-                mPercentLabel.setText(Integer.toString(mValues.padding) + '%');
-
-                if (mValues.imagePath != null) {
-                    mImagePathText.setText(mValues.imagePath.getPath());
-                }
-
-                if (mValues.text != null) {
-                    mText.setText(mValues.text);
-                }
-
-                setSourceType(mValues.sourceType);
-
-                // Shape=NONE does not apply for notification icons; it's needed for API < 9
-                if (mValues.shape == Shape.NONE && mValues.type == AssetType.NOTIFICATION) {
-                    mValues.shape = Shape.SQUARE;
-                }
-
-                setShape(mValues.shape);
-                mNoShapeRadio.setEnabled(mValues.type != AssetType.NOTIFICATION);
-
-                if (mValues.sourceType == SourceType.CLIPART
-                        && mValues.clipartName != null) {
-                    updateClipartPreview();
-                }
-
-                // Initial color
-                Display display = mPreviewArea.getDisplay();
-                //updateColor(display, new RGB(0xa4, 0xc6, 0x39), true /*background*/);
-                updateColor(display, mValues.background, true /*background*/);
-                updateColor(display, mValues.foreground, false /*background*/);
-
-                updateTrimOptions();
-            } finally {
-                mIgnore = false;
-            }
-
-            validatePage();
-
-            requestUpdatePreview(true /*quickly*/);
-
-            if (mTextRadio.getSelection()) {
-                mText.setFocus();
-            }
-        }
-    }
-
-    private void setSourceType(CreateAssetSetWizardState.SourceType sourceType) {
-        if (sourceType == CreateAssetSetWizardState.SourceType.IMAGE) {
-            chooseForegroundTab(mImageRadio, mImageForm);
-        } else if (sourceType == CreateAssetSetWizardState.SourceType.CLIPART) {
-            chooseForegroundTab(mClipartRadio, mClipartForm);
-            mChooseClipart.setFocus();
-        } else if (sourceType == CreateAssetSetWizardState.SourceType.TEXT) {
-            updateFontLabel();
-            chooseForegroundTab(mTextRadio, mTextForm);
-            mText.setFocus();
-        }
-    }
-
-    private void updateTrimOptions() {
-        // Trimming and padding is not available for clipart images; padding etc is
-        // predefined to work well with action bar icons
-        if (mValues.sourceType == SourceType.CLIPART
-                && mValues.type == AssetType.ACTIONBAR) {
-            mTrimCheckBox.setEnabled(false);
-            mPaddingSlider.setEnabled(false);
-            mValues.trim = false;
-        } else if (!mTrimCheckBox.isEnabled()) {
-            mTrimCheckBox.setEnabled(true);
-            mPaddingSlider.setEnabled(true);
-        }
-    }
-
-    private boolean validatePage() {
-        String error = null;
-        //String warning = null;
-
-        if (mImageRadio.getSelection()) {
-            String path = mValues.imagePath != null ? mValues.imagePath.getPath() : null;
-            if (path == null || path.length() == 0) {
-                error = "Select an image";
-            } else if (path.equals(DEFAULT_LAUNCHER_ICON)) {
-                // Silent
-            } else if (!(new File(path).exists())) {
-                error = String.format("%1$s does not exist", path);
-            } else {
-                // Preserve across wizard sessions
-                sImagePath = path;
-            }
-        } else if (mTextRadio.getSelection()) {
-            if (mValues.text.length() == 0) {
-                error = "Enter text";
-            }
-        } else {
-            assert mClipartRadio.getSelection();
-            if (mValues.clipartName == null) {
-                error = "Select clip art";
-            }
-        }
-
-        setPageComplete(error == null);
-        if (error != null) {
-            setMessage(error, IMessageProvider.ERROR);
-        //} else if (warning != null) {
-        //    setMessage(warning, IMessageProvider.WARNING);
-        } else {
-            setErrorMessage(null);
-            setMessage(null);
-        }
-
-        return error == null;
-    }
-
-    @Override
-    public boolean isPageComplete() {
-        // Force user to reach second page before hitting Finish
-        return mShown;
-    }
-
-    // ---- Implements ModifyListener ----
-
-    @Override
-    public void modifyText(ModifyEvent e) {
-        if (mIgnore) {
-            return;
-        }
-
-        if (e.getSource() == mImagePathText) {
-            mValues.imagePath = new File(mImagePathText.getText().trim());
-            requestUpdatePreview(false);
-        } else if (e.getSource() == mText) {
-            mValues.text = mText.getText().trim();
-            requestUpdatePreview(false);
-        }
-
-        validatePage();
-    }
-
-    // ---- Implements SelectionListener ----
-
-    @Override
-    public void widgetDefaultSelected(SelectionEvent e) {
-        // Nothing to do
-    }
-
-    @Override
-    public void widgetSelected(SelectionEvent e) {
-        if (mIgnore) {
-            return;
-        }
-
-        Object source = e.getSource();
-        boolean updateQuickly = true;
-
-        // Tabs
-        if (source == mImageRadio) {
-            mValues.sourceType = CreateAssetSetWizardState.SourceType.IMAGE;
-            chooseForegroundTab((Button) source, mImageForm);
-            configureAssetType(mValues.type);
-            updateTrimOptions();
-        } else if (source == mClipartRadio) {
-            mValues.sourceType = CreateAssetSetWizardState.SourceType.CLIPART;
-            chooseForegroundTab((Button) source, mClipartForm);
-            configureAssetType(mValues.type);
-            updateTrimOptions();
-        } else if (source == mTextRadio) {
-            mValues.sourceType = CreateAssetSetWizardState.SourceType.TEXT;
-            updateFontLabel();
-            chooseForegroundTab((Button) source, mTextForm);
-            configureAssetType(mValues.type);
-            mText.setFocus();
-            updateTrimOptions();
-        }
-
-        // Choose image file
-        if (source == mPickImageButton) {
-            FileDialog dialog = new FileDialog(mPickImageButton.getShell(), SWT.OPEN);
-
-            String curLocation = mImagePathText.getText().trim();
-            if (!curLocation.isEmpty()) {
-                dialog.setFilterPath(curLocation);
-            }
-
-            String file = dialog.open();
-            if (file != null) {
-                mValues.imagePath = new File(file);
-                mImagePathText.setText(file);
-            }
-        }
-
-        // Enforce Radio Groups
-        if (source == mCropRadio) {
-            mCropRadio.setSelection(true); // Ensure that you can't toggle it off
-            mCenterRadio.setSelection(false);
-            mValues.crop = true;
-        } else if (source == mCenterRadio) {
-            mCenterRadio.setSelection(true);
-            mCropRadio.setSelection(false);
-            mValues.crop = false;
-        }
-        if (source == mSquareRadio) {
-            mValues.shape = GraphicGenerator.Shape.SQUARE;
-            setShape(mValues.shape);
-        } else if (source == mCircleButton) {
-            mValues.shape = GraphicGenerator.Shape.CIRCLE;
-            setShape(mValues.shape);
-        } else if (source == mNoShapeRadio) {
-            mValues.shape = GraphicGenerator.Shape.NONE;
-            setShape(mValues.shape);
-        }
-
-        if (source == mTrimCheckBox) {
-            mValues.trim = mTrimCheckBox.getSelection();
-        }
-
-        if (source == mHoloDarkRadio) {
-            mHoloDarkRadio.setSelection(true);
-            mHoloLightRadio.setSelection(false);
-            mValues.holoDark = true;
-        } else if (source == mHoloLightRadio) {
-            mHoloLightRadio.setSelection(true);
-            mHoloDarkRadio.setSelection(false);
-            mValues.holoDark = false;
-        }
-
-        if (source == mChooseClipart) {
-            MessageDialog dialog = new MessageDialog(mChooseClipart.getShell(),
-                    "Choose Clip Art",
-                    null, "Choose Clip Art Image:", MessageDialog.NONE,
-                    new String[] { "Close" }, 0) {
-                @Override
-                protected Control createCustomArea(Composite parent) {
-                    // Outer form which just establishes a width for the inner form which
-                    // wraps in a RowLayout
-                    Composite outer = new Composite(parent, SWT.NONE);
-                    GridLayout gridLayout = new GridLayout();
-                    outer.setLayout(gridLayout);
-
-                    Composite chooserForm = new Composite(outer, SWT.NONE);
-                    GridData gd = new GridData();
-                    gd.grabExcessVerticalSpace = true;
-                    gd.widthHint = 450;
-                    chooserForm.setLayoutData(gd);
-                    RowLayout clipartFormLayout = new RowLayout(SWT.HORIZONTAL);
-                    clipartFormLayout.center = true;
-                    clipartFormLayout.wrap = true;
-                    chooserForm.setLayout(clipartFormLayout);
-
-                    MouseAdapter clickListener = new MouseAdapter() {
-                        @Override
-                        public void mouseDown(MouseEvent event) {
-                            // Clicked on some of the sample art
-                            if (event.widget instanceof ImageControl) {
-                                ImageControl image = (ImageControl) event.widget;
-                                mValues.clipartName = (String) image.getData();
-                                close();
-
-                                updateClipartPreview();
-                                updatePreview();
-                            }
-                        }
-                    };
-                    Display display = chooserForm.getDisplay();
-                    Color hoverColor = display.getSystemColor(SWT.COLOR_RED);
-                    Iterator<String> clipartImages = GraphicGenerator.getClipartNames();
-                    while (clipartImages.hasNext()) {
-                        String name = clipartImages.next();
-                        try {
-                            BufferedImage icon = GraphicGenerator.getClipartIcon(name);
-                            if (icon != null) {
-                                Image swtImage = SwtUtils.convertToSwt(display, icon, true, -1);
-                                ImageControl img = new ImageControl(chooserForm,
-                                        SWT.NONE, swtImage);
-                                img.setData(name);
-                                img.setHoverColor(hoverColor);
-                                img.addMouseListener(clickListener);
-                            }
-                        } catch (IOException e1) {
-                            AdtPlugin.log(e1, null);
-                        }
-                    }
-                    outer.pack();
-                    outer.layout();
-                    return outer;
-                }
-            };
-            dialog.open();
-        }
-
-        if (source == mBgButton) {
-            ColorDialog dlg = new ColorDialog(mBgButton.getShell());
-            dlg.setRGB(mBgColor);
-            dlg.setText("Choose a new Background Color");
-            RGB rgb = dlg.open();
-            if (rgb != null) {
-                // Dispose the old color, create the
-                // new one, and set into the label
-                mValues.background = rgb;
-                updateColor(mBgButton.getDisplay(), rgb, true /*background*/);
-            }
-        } else if (source == mFgButton) {
-            ColorDialog dlg = new ColorDialog(mFgButton.getShell());
-            dlg.setRGB(mFgColor);
-            dlg.setText("Choose a new Foreground Color");
-            RGB rgb = dlg.open();
-            if (rgb != null) {
-                // Dispose the old color, create the
-                // new one, and set into the label
-                mValues.foreground = rgb;
-                updateColor(mFgButton.getDisplay(), rgb, false /*background*/);
-            }
-        }
-
-        if (source == mFontButton) {
-            FontDialog dialog = new FontDialog(mFontButton.getShell());
-            FontData[] fontList;
-            if (mFontButton.getData() == null) {
-                fontList = mFontButton.getDisplay().getFontList(
-                        mValues.getTextFont().getFontName(), true /*scalable*/);
-            } else {
-                fontList = mFontButton.getFont().getFontData();
-            }
-            dialog.setFontList(fontList);
-            FontData data = dialog.open();
-            if (data != null) {
-                Font font = new Font(mFontButton.getDisplay(), dialog.getFontList());
-                mFontButton.setFont(font);
-                mFontButton.setData(font);
-
-                // Always use a large font for the rendering, even though user is typically
-                // picking small font sizes in the font chooser
-                //int dpi = mFontButton.getDisplay().getDPI().y;
-                //int height = (int) Math.round(fontData.getHeight() * dpi / 72.0);
-                int fontHeight = new TextRenderUtil.Options().fontSize;
-                FontData fontData = font.getFontData()[0];
-                int awtStyle = java.awt.Font.PLAIN;
-                int swtStyle = fontData.getStyle();
-                if ((swtStyle & SWT.ITALIC) != 0) {
-                    awtStyle |= java.awt.Font.ITALIC;
-                }
-                if ((swtStyle & SWT.BOLD) != 0) {
-                    awtStyle = java.awt.Font.BOLD;
-                }
-                mValues.setTextFont(new java.awt.Font(fontData.getName(), awtStyle, fontHeight));
-
-                updateFontLabel();
-                mFontButton.getParent().pack();
-            }
-        }
-
-        if (source == mPaddingSlider) {
-            mValues.padding = getPadding();
-            mPercentLabel.setText(Integer.toString(getPadding()) + '%');
-
-            // When dragging the slider, only do periodic updates
-            updateQuickly = false;
-        }
-
-        requestUpdatePreview(updateQuickly);
-    }
-
-    @SuppressWarnings("unused") // SWT constructors have side effects and are not unused
-    private void updateClipartPreview() {
-        for (Control c : mClipartPreviewPanel.getChildren()) {
-            c.dispose();
-        }
-        if (mClipartPreviewPanel.getChildren().length == 0) {
-            try {
-                BufferedImage icon = GraphicGenerator.getClipartIcon(
-                        mValues.clipartName);
-                if (icon != null) {
-                    Display display = mClipartForm.getDisplay();
-                    Image swtImage = SwtUtils.convertToSwt(display, icon,
-                            true, -1);
-                    new ImageControl(mClipartPreviewPanel,
-                            SWT.NONE, swtImage);
-                }
-            } catch (IOException e1) {
-                AdtPlugin.log(e1, null);
-            }
-            mClipartPreviewPanel.pack();
-            mClipartPreviewPanel.layout();
-        }
-    }
-
-    private void setShape(GraphicGenerator.Shape shape) {
-        if (shape == GraphicGenerator.Shape.SQUARE) {
-            mSquareRadio.setSelection(true);
-            mCircleButton.setSelection(false);
-            mNoShapeRadio.setSelection(false);
-        } else if (shape == GraphicGenerator.Shape.CIRCLE) {
-            mCircleButton.setSelection(true);
-            mSquareRadio.setSelection(false);
-            mNoShapeRadio.setSelection(false);
-        } else if (shape == GraphicGenerator.Shape.NONE) {
-            mNoShapeRadio.setSelection(true);
-            mCircleButton.setSelection(false);
-            mSquareRadio.setSelection(false);
-        } else {
-            assert false : shape;
-        }
-    }
-
-    private void updateFontLabel() {
-        mFontButton.setText(mValues.getTextFont().getFontName());
-    }
-
-    private int getPadding() {
-        // Shifted - see comment for mPaddingSlider construction for an explanation
-        return mPaddingSlider.getSelection() - 10;
-    }
-
-    private void chooseForegroundTab(Button newButton, Composite newArea) {
-        if (newButton.getSelection()) {
-            mImageRadio.setSelection(false);
-            mClipartRadio.setSelection(false);
-            mTextRadio.setSelection(false);
-            newButton.setSelection(true);
-            StackLayout stackLayout = (StackLayout) mForegroundArea.getLayout();
-            stackLayout.topControl = newArea;
-            mForegroundArea.layout();
-        } else {
-            // Treat it as a radio button: you can't click to turn it off, you have to
-            // click on one of the other buttons
-            newButton.setSelection(true);
-        }
-    }
-
-    /**
-     * Delay updates of the preview, to ensure that the SWT UI acts immediately (to handle
-     * radio group selections etc).
-     *
-     * @param quickly if true, update the previews soon, otherwise schedule one a bit later
-     */
-    private void requestUpdatePreview(boolean quickly) {
-        if (mTimerPending) {
-            return;
-        }
-        mTimerPending = true;
-
-        final Runnable timer = new Runnable() {
-            @Override
-            public void run() {
-                mTimerPending = false;
-                updatePreview();
-            }
-        };
-
-        mPreviewArea.getDisplay().timerExec(quickly ? 10 : 250, timer);
-    }
-
-    private void updatePreview() {
-        Display display = mPreviewArea.getDisplay();
-
-        for (Control c : mPreviewArea.getChildren()) {
-            c.dispose();
-        }
-
-        if (!validatePage()) {
-            return;
-        }
-
-        Map<String, Map<String, BufferedImage>> map = generateImages(mValues,
-                true /*previewOnly*/, this);
-        for (Entry<String, Map<String, BufferedImage>> categoryEntry : map.entrySet()) {
-            String category = categoryEntry.getKey();
-            if (category.length() > 0) {
-                Label nameLabel = new Label(mPreviewArea, SWT.NONE);
-                nameLabel.setText(String.format("%1$s:", category));
-                RowData rowData = new RowData();
-                nameLabel.setLayoutData(rowData);
-                // Ensure these get their own rows
-                rowData.width = PREVIEW_AREA_WIDTH;
-            }
-
-            Map<String, BufferedImage> images = categoryEntry.getValue();
-            for (Entry<String, BufferedImage> entry :  images.entrySet()) {
-                BufferedImage image = entry.getValue();
-                Image swtImage = SwtUtils.convertToSwt(display, image, true, -1);
-                if (swtImage != null) {
-                    @SuppressWarnings("unused") // Has side effect
-                    ImageControl imageControl = new ImageControl(mPreviewArea, SWT.NONE, swtImage);
-                }
-            }
-        }
-
-        mPreviewArea.layout(true);
-    }
-
-    /**
-     * Generate images using the given wizard state
-     *
-     * @param mValues the state to use
-     * @param previewOnly whether we are only generating previews
-     * @param page if non null, a wizard page to write error messages to
-     * @return a map of image objects
-     */
-    public static Map<String, Map<String, BufferedImage>> generateImages(
-            @NonNull CreateAssetSetWizardState mValues,
-            boolean previewOnly,
-            @Nullable WizardPage page) {
-        // Map of ids to images: Preserve insertion order (the densities)
-        Map<String, Map<String, BufferedImage>> categoryMap =
-                new LinkedHashMap<String, Map<String, BufferedImage>>();
-
-        AssetType type = mValues.type;
-        boolean trim = mValues.trim;
-
-        BufferedImage sourceImage = null;
-        switch (mValues.sourceType) {
-            case IMAGE: {
-                // Load the image
-                // TODO: Only do this when the source image type is image
-                String path = mValues.imagePath != null ? mValues.imagePath.getPath() : "";
-                if (path.length() == 0) {
-                    if (page != null) {
-                        page.setErrorMessage("Enter a filename");
-                    }
-                    return Collections.emptyMap();
-                }
-                if (!path.equals(DEFAULT_LAUNCHER_ICON)) {
-                    File file = new File(path);
-                    if (!file.isFile()) {
-                        if (page != null) {
-                            page.setErrorMessage(String.format("%1$s does not exist", file.getPath()));
-                        }
-                        return Collections.emptyMap();
-                    }
-                }
-
-                if (page != null) {
-                    page.setErrorMessage(null);
-                }
-                try {
-                    sourceImage = mValues.getCachedImage(path, false);
-                    if (sourceImage != null) {
-                        if (trim) {
-                            sourceImage = ImageUtils.cropBlank(sourceImage, null, TYPE_INT_ARGB);
-                        }
-                        if (mValues.padding != 0) {
-                            sourceImage = Util.paddedImage(sourceImage, mValues.padding);
-                        }
-                    }
-                } catch (IOException ioe) {
-                    if (page != null) {
-                        page.setErrorMessage(ioe.getLocalizedMessage());
-                    }
-                }
-                break;
-            }
-            case CLIPART: {
-                try {
-                    sourceImage = GraphicGenerator.getClipartImage(mValues.clipartName);
-
-                    boolean isActionBar = mValues.type == AssetType.ACTIONBAR;
-                    if (trim && !isActionBar) {
-                        sourceImage = ImageUtils.cropBlank(sourceImage, null, TYPE_INT_ARGB);
-                    }
-
-                    if (type.needsColors()) {
-                        RGB fg = mValues.foreground;
-                        int color = 0xFF000000 | (fg.red << 16) | (fg.green << 8) | fg.blue;
-                        Paint paint = new java.awt.Color(color);
-                        sourceImage = Util.filledImage(sourceImage, paint);
-                    }
-
-                    int padding = mValues.padding;
-                    if (padding != 0 && !isActionBar) {
-                        sourceImage = Util.paddedImage(sourceImage, padding);
-                    }
-                } catch (IOException e) {
-                    AdtPlugin.log(e, null);
-                    return categoryMap;
-                }
-                break;
-            }
-            case TEXT: {
-                String text = mValues.text;
-                TextRenderUtil.Options options = new TextRenderUtil.Options();
-                options.font = mValues.getTextFont();
-                int color;
-                if (type.needsColors()) {
-                    RGB fg = mValues.foreground;
-                    color = 0xFF000000 | (fg.red << 16) | (fg.green << 8) | fg.blue;
-                } else {
-                    color = 0xFFFFFFFF;
-                }
-                options.foregroundColor = color;
-                sourceImage = TextRenderUtil.renderTextImage(text, mValues.padding, options);
-
-                if (trim) {
-                    sourceImage = ImageUtils.cropBlank(sourceImage, null, TYPE_INT_ARGB);
-                }
-
-                int padding = mValues.padding;
-                if (padding != 0) {
-                    sourceImage = Util.paddedImage(sourceImage, padding);
-                }
-                break;
-            }
-        }
-
-        GraphicGenerator generator = null;
-        GraphicGenerator.Options options = null;
-        switch (type) {
-            case LAUNCHER: {
-                generator = new LauncherIconGenerator();
-                LauncherIconGenerator.LauncherOptions launcherOptions =
-                        new LauncherIconGenerator.LauncherOptions();
-                launcherOptions.shape = mValues.shape;
-                launcherOptions.crop = mValues.crop;
-                launcherOptions.style = GraphicGenerator.Style.SIMPLE;
-
-                RGB bg = mValues.background;
-                int color = (bg.red << 16) | (bg.green << 8) | bg.blue;
-                launcherOptions.backgroundColor = color;
-                // Flag which tells the generator iterator to include a web graphic
-                launcherOptions.isWebGraphic = !previewOnly;
-                options = launcherOptions;
-
-                break;
-            }
-            case MENU:
-                generator = new MenuIconGenerator();
-                options = new GraphicGenerator.Options();
-                break;
-            case ACTIONBAR: {
-                generator = new ActionBarIconGenerator();
-                ActionBarIconGenerator.ActionBarOptions actionBarOptions =
-                        new ActionBarIconGenerator.ActionBarOptions();
-                actionBarOptions.theme = mValues.holoDark
-                        ? ActionBarIconGenerator.Theme.HOLO_DARK
-                                : ActionBarIconGenerator.Theme.HOLO_LIGHT;
-                actionBarOptions.sourceIsClipart = (mValues.sourceType == SourceType.CLIPART);
-
-                options = actionBarOptions;
-                break;
-            }
-            case NOTIFICATION: {
-                generator = new NotificationIconGenerator();
-                options = new NotificationIconGenerator.NotificationOptions();
-                break;
-            }
-            case TAB:
-                generator = new TabIconGenerator();
-                options = new TabIconGenerator.TabOptions();
-                break;
-            default:
-                AdtPlugin.log(IStatus.ERROR, "Unsupported asset type: %1$s", type);
-                return categoryMap;
-        }
-
-        options.sourceImage = sourceImage;
-
-        IProject project = mValues.project;
-        if (mValues.minSdk != -1) {
-            options.minSdk = mValues.minSdk;
-        } else {
-            Pair<Integer, Integer> v = ManifestInfo.computeSdkVersions(project);
-            options.minSdk = v.getFirst();
-        }
-
-        String baseName = mValues.outputName;
-        generator.generate(null, categoryMap, mValues, options, baseName);
-
-        return categoryMap;
-    }
-
-    /**
-     * Generate custom icons into the project based on the asset studio wizard
-     * state
-     *
-     * @param newProject the project to write into
-     * @param values the wizard state to read configuration settings from
-     * @param previewOnly whether we are only generating a preview. For example,
-     *            the launcher icons won't generate a huge 512x512 web graphic
-     *            in preview mode
-     * @param page a wizard page to write error messages to, or null
-     */
-    public static void generateIcons(final IProject newProject,
-            @NonNull CreateAssetSetWizardState values,
-            boolean previewOnly,
-            @Nullable WizardPage page) {
-        // Generate the custom icons
-        Map<String, Map<String, BufferedImage>> categories = generateImages(values,
-                false /*previewOnly*/, page);
-        for (Map<String, BufferedImage> previews : categories.values()) {
-            for (Map.Entry<String, BufferedImage> entry : previews.entrySet()) {
-                String relativePath = entry.getKey();
-                IPath dest = new Path(relativePath);
-                IFile file = newProject.getFile(dest);
-
-                // In case template already created icons (should remove that)
-                // remove them first
-                if (file.exists()) {
-                    try {
-                        file.delete(true, new NullProgressMonitor());
-                    } catch (CoreException e) {
-                        AdtPlugin.log(e, null);
-                    }
-                }
-                AdtUtils.createWsParentDirectory(file.getParent());
-                BufferedImage image = entry.getValue();
-
-                ByteArrayOutputStream stream = new ByteArrayOutputStream();
-                try {
-                    ImageIO.write(image, "PNG", stream); //$NON-NLS-1$
-                    byte[] bytes = stream.toByteArray();
-                    InputStream is = new ByteArrayInputStream(bytes);
-                    file.create(is, true /*force*/, null /*progress*/);
-                } catch (IOException e) {
-                    AdtPlugin.log(e, null);
-                } catch (CoreException e) {
-                    AdtPlugin.log(e, null);
-                }
-
-                try {
-                    file.getParent().refreshLocal(1, new NullProgressMonitor());
-                } catch (CoreException e) {
-                    AdtPlugin.log(e, null);
-                }
-            }
-        }
-    }
-
-    private void updateColor(Display display, RGB color, boolean isBackground) {
-        // Button.setBackgroundColor does not work (at least not on OSX) so
-        // we instead have to use Button.setImage with an image of the given
-        // color
-        BufferedImage coloredImage = ImageUtils.createColoredImage(60, 20, color);
-        Image image = SwtUtils.convertToSwt(display, coloredImage, false, -1);
-
-        if (isBackground) {
-            mBgColor = color;
-            mBgButton.setImage(image);
-        } else {
-            mFgColor = color;
-            mFgButton.setImage(image);
-        }
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/assetstudio/CreateAssetSetWizard.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/assetstudio/CreateAssetSetWizard.java
deleted file mode 100644
index 6b10012..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/assetstudio/CreateAssetSetWizard.java
+++ /dev/null
@@ -1,312 +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.eclipse.adt.internal.assetstudio;
-
-import com.android.ide.eclipse.adt.AdtConstants;
-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.project.BaseProjectHelper;
-import com.android.utils.Pair;
-
-import org.eclipse.core.resources.IContainer;
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.ui.JavaUI;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.jface.viewers.ISelectionProvider;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.TreePath;
-import org.eclipse.jface.viewers.TreeSelection;
-import org.eclipse.jface.wizard.Wizard;
-import org.eclipse.swt.SWT;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.INewWizard;
-import org.eclipse.ui.IViewPart;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchPartSite;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.part.FileEditorInput;
-
-import java.awt.image.BufferedImage;
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-import java.util.Map;
-
-import javax.imageio.ImageIO;
-
-/**
- * Wizard for creating a new icon set
- */
-public class CreateAssetSetWizard extends Wizard implements INewWizard {
-    private ChooseAssetTypePage mChooseAssetPage;
-    private ConfigureAssetSetPage mConfigureAssetPage;
-    private IProject mInitialProject;
-    private List<IResource> mCreatedFiles;
-    private CreateAssetSetWizardState mValues = new CreateAssetSetWizardState();
-
-    /** Creates a new asset set wizard */
-    public CreateAssetSetWizard() {
-        setWindowTitle("Create Asset Set");
-    }
-
-    @Override
-    public void addPages() {
-        mValues.project = mInitialProject;
-
-        mChooseAssetPage = new ChooseAssetTypePage(mValues);
-        mConfigureAssetPage = new ConfigureAssetSetPage(mValues);
-
-        addPage(mChooseAssetPage);
-        addPage(mConfigureAssetPage);
-    }
-
-    @Override
-    public boolean performFinish() {
-        Map<String, Map<String, BufferedImage>> categories =
-                ConfigureAssetSetPage.generateImages(mValues, false, null);
-
-        IProject project = mValues.project;
-
-        // Write out the images into the project
-        boolean yesToAll = false;
-        mCreatedFiles = new ArrayList<IResource>();
-
-        for (Map<String, BufferedImage> previews : categories.values()) {
-            for (Map.Entry<String, BufferedImage> entry : previews.entrySet()) {
-                String relativePath = entry.getKey();
-                IPath dest = new Path(relativePath);
-                IFile file = project.getFile(dest);
-                if (file.exists()) {
-                    // Warn that the file already exists and ask the user what to do
-                    if (!yesToAll) {
-                        MessageDialog dialog = new MessageDialog(null, "File Already Exists", null,
-                                String.format(
-                                        "%1$s already exists.\nWould you like to replace it?",
-                                        file.getProjectRelativePath().toOSString()),
-                                MessageDialog.QUESTION, new String[] {
-                                        // Yes will be moved to the end because it's the default
-                                        "Yes", "No", "Cancel", "Yes to All"
-                                }, 0);
-                        int result = dialog.open();
-                        switch (result) {
-                            case 0:
-                                // Yes
-                                break;
-                            case 3:
-                                // Yes to all
-                                yesToAll = true;
-                                break;
-                            case 1:
-                                // No
-                                continue;
-                            case SWT.DEFAULT:
-                            case 2:
-                                // Cancel
-                                return false;
-                        }
-                    }
-
-                    try {
-                        file.delete(true, new NullProgressMonitor());
-                    } catch (CoreException e) {
-                        AdtPlugin.log(e, null);
-                    }
-                }
-
-                AdtUtils.createWsParentDirectory(file.getParent());
-                BufferedImage image = entry.getValue();
-
-                ByteArrayOutputStream stream = new ByteArrayOutputStream();
-                try {
-                    ImageIO.write(image, "PNG", stream); //$NON-NLS-1$
-                    byte[] bytes = stream.toByteArray();
-                    InputStream is = new ByteArrayInputStream(bytes);
-                    file.create(is, true /*force*/, null /*progress*/);
-                    mCreatedFiles.add(file);
-                } catch (IOException e) {
-                    AdtPlugin.log(e, null);
-                } catch (CoreException e) {
-                    AdtPlugin.log(e, null);
-                }
-
-                try {
-                    file.getParent().refreshLocal(1, new NullProgressMonitor());
-                } catch (CoreException e) {
-                    AdtPlugin.log(e, null);
-                }
-            }
-        }
-
-        // Finally select the files themselves
-        selectFiles(project, mCreatedFiles);
-
-        return true;
-    }
-
-    private void selectFiles(IProject project, List<? extends IResource> createdFiles) {
-        // Attempt to select the newly created files in the Package Explorer
-        IWorkbench workbench = AdtPlugin.getDefault().getWorkbench();
-        IWorkbenchPage page = workbench.getActiveWorkbenchWindow().getActivePage();
-        IViewPart viewPart = page.findView(JavaUI.ID_PACKAGES);
-        if (viewPart != null) {
-            IWorkbenchPartSite site = viewPart.getSite();
-            IJavaProject javaProject = null;
-            try {
-                javaProject = BaseProjectHelper.getJavaProject(project);
-            } catch (CoreException e) {
-                AdtPlugin.log(e, null);
-            }
-            final ISelectionProvider provider = site.getSelectionProvider();
-            if (provider != null) {
-                List<TreePath> pathList = new ArrayList<TreePath>();
-                for (IResource file : createdFiles) {
-                    // Create a TreePath for the given file,
-                    // which should be the JavaProject, followed by the folders down to
-                    // the final file.
-                    List<Object> segments = new ArrayList<Object>();
-                    segments.add(file);
-                    IContainer folder = file.getParent();
-                    if (folder != null && !(folder instanceof IProject)) {
-                        segments.add(folder);
-                        // res folder
-                        folder = folder.getParent();
-                        if (folder != null && !(folder instanceof IProject)) {
-                            segments.add(folder);
-                        }
-                    }
-                    // project
-                    segments.add(javaProject);
-
-                    Collections.reverse(segments);
-                    TreePath path = new TreePath(segments.toArray());
-                    pathList.add(path);
-
-                    // IDEA: Maybe normalize the files backwards (IFile objects aren't unique)
-                    // by maybe using the package explorer icons instead
-                }
-
-                TreePath[] paths = pathList.toArray(new TreePath[pathList.size()]);
-                final TreeSelection selection = new TreeSelection(paths);
-
-                provider.setSelection(selection);
-
-                // Workaround: The above doesn't always work; it will frequently select
-                // some siblings of the real files. I've tried a number of workarounds:
-                // normalizing the IFile objects by looking up the canonical ones via
-                // their relative paths from the project; deferring execution with
-                // Display.asyncRun; first calling select on the parents, etc.
-                // However, it turns out a simple workaround works best: Calling this
-                // method TWICE. The first call seems to expand all the necessary parents,
-                // and the second call ensures that the correct children are selected!
-                provider.setSelection(selection);
-
-                viewPart.setFocus();
-            }
-        }
-    }
-
-    /** Sets the initial project to be used by the wizard */
-    void setProject(IProject project) {
-        mInitialProject = project;
-        mValues.project = project;
-    }
-
-    @Override
-    public void init(IWorkbench workbench, IStructuredSelection selection) {
-        setHelpAvailable(false);
-
-        mInitialProject = guessProject(selection);
-        mValues.project = mInitialProject;
-    }
-
-    private IProject guessProject(IStructuredSelection selection) {
-        if (selection == null) {
-            return null;
-        }
-
-        for (Object element : selection.toList()) {
-            if (element instanceof IAdaptable) {
-                IResource res = (IResource) ((IAdaptable) element).getAdapter(IResource.class);
-                IProject project = res != null ? res.getProject() : null;
-
-                // Is this an Android project?
-                try {
-                    if (project == null || !project.hasNature(AdtConstants.NATURE_DEFAULT)) {
-                        continue;
-                    }
-                } catch (CoreException e) {
-                    // checking the nature failed, ignore this resource
-                    continue;
-                }
-
-                return project;
-            } else if (element instanceof Pair<?, ?>) {
-                // Pair of Project/String
-                @SuppressWarnings("unchecked")
-                Pair<IProject, String> pair = (Pair<IProject, String>) element;
-                return pair.getFirst();
-            }
-        }
-
-        // Try to figure out the project from the active editor
-        IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
-        if (window != null) {
-            IWorkbenchPage page = window.getActivePage();
-            if (page != null) {
-                IEditorPart activeEditor = page.getActiveEditor();
-                if (activeEditor instanceof AndroidXmlEditor) {
-                    Object input = ((AndroidXmlEditor) activeEditor).getEditorInput();
-                    if (input instanceof FileEditorInput) {
-                        FileEditorInput fileInput = (FileEditorInput) input;
-                        return fileInput.getFile().getProject();
-                    }
-                }
-            }
-        }
-
-        IJavaProject[] projects = AdtUtils.getOpenAndroidProjects();
-        if (projects != null && projects.length == 1) {
-            return projects[0].getProject();
-        }
-
-        return null;
-    }
-
-    /**
-     * Returns the list of files created by the wizard. This method will return
-     * null if {@link #performFinish()} has not yet been called.
-     *
-     * @return a list of files created by the wizard, or null
-     */
-    List<IResource> getCreatedFiles() {
-        return mCreatedFiles;
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/assetstudio/CreateAssetSetWizardState.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/assetstudio/CreateAssetSetWizardState.java
deleted file mode 100644
index d3a0f42..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/assetstudio/CreateAssetSetWizardState.java
+++ /dev/null
@@ -1,258 +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.ide.eclipse.adt.internal.assetstudio;
-
-import static com.android.ide.eclipse.adt.internal.wizards.templates.NewProjectWizard.DEFAULT_LAUNCHER_ICON;
-
-import com.android.annotations.NonNull;
-import com.android.assetstudiolib.GraphicGenerator;
-import com.android.assetstudiolib.GraphicGenerator.Shape;
-import com.android.assetstudiolib.GraphicGeneratorContext;
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.ide.eclipse.adt.internal.wizards.templates.TemplateManager;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.swt.graphics.RGB;
-
-import java.awt.Font;
-import java.awt.GraphicsEnvironment;
-import java.awt.image.BufferedImage;
-import java.io.File;
-import java.io.IOException;
-import java.util.HashMap;
-import java.util.Map;
-
-import javax.imageio.ImageIO;
-
-/**
- * Value object for the AssetStudio wizard. These values are both set by the
- * wizard as well as read by the wizard initially, so passing in a configured
- * {@link CreateAssetSetWizardState} to the icon generator is possible.
- */
-public class CreateAssetSetWizardState implements GraphicGeneratorContext {
-    /**
-     * The type of asset being created. This field is static such that when you
-     * bring up the wizard repeatedly (for example to create multiple
-     * notification icons) you don't have to keep selecting the same type over
-     * and over.
-     */
-    public static AssetType sLastType = AssetType.LAUNCHER;
-
-    /** The type of asset to be created */
-    public AssetType type = sLastType;
-
-    /** The base name to use for the created icons */
-    public String outputName;
-
-    /** The minimum SDK being targeted */
-    public int minSdk = -1;
-
-    /** The project to create the icons into */
-    public IProject project;
-
-    /** Whether empty space around the source image should be trimmed */
-    public boolean trim = true;
-
-    /** The type of source the icon is being created from */
-    public SourceType sourceType = SourceType.TEXT;
-
-    /** If {@link #sourceType} is a {@link SourceType#CLIPART}, the name of the clipart image */
-    public String clipartName;
-
-    /** If {@link #sourceType} is a {@link SourceType#IMAGE}, the path to the input image */
-    public File imagePath;
-
-    /** If {@link #sourceType} is a {@link SourceType#TEXT}, the text to render */
-    public String text = "aA";
-
-    /** The amount of padding to add around the source image */
-    public int padding = 15;
-
-    /** The background shape */
-    public Shape shape = Shape.SQUARE;
-
-    /** Whether the image should be cropped */
-    public boolean crop;
-
-    /** Whether to use Holo Dark for action bar icons */
-    public boolean holoDark;
-
-    /** The background color to use for the shape (unless the shape is {@link Shape#NONE} */
-    public RGB background = new RGB(0xff, 0x00, 0x00);
-
-    /** The background color to use for the text or clipart (unless shape is {@link Shape#NONE} */
-    public RGB foreground = new RGB(0x00, 0x00, 0x00);
-
-    /** If {@link #sourceType} is a {@link SourceType#TEXT}, the font of the text to render */
-    private Font mTextFont;
-
-    private Map<String, BufferedImage> mImageCache = null;
-
-    /**
-     * Gets the text font to be used for text rendering if the
-     * {@link #sourceType} is a {@link SourceType#TEXT}
-     *
-     * @return the text font
-     */
-    @NonNull
-    public Font getTextFont() {
-        if (mTextFont == null) {
-            GraphicsEnvironment env = GraphicsEnvironment.getLocalGraphicsEnvironment();
-            String[] fontNames = env.getAvailableFontFamilyNames();
-            for (String familyName : fontNames) {
-                if (familyName.equals("Helvetica")) {
-                    mTextFont = new java.awt.Font(familyName, java.awt.Font.BOLD, 512);
-                    break;
-                }
-            }
-            if (mTextFont == null) {
-                for (String familyName : fontNames) {
-                    if (familyName.equals("Arial")) {
-                        mTextFont = new java.awt.Font(familyName, java.awt.Font.BOLD, 512);
-                        break;
-                    }
-                }
-
-                if (mTextFont == null) {
-                    mTextFont = new java.awt.Font("SansSerif", java.awt.Font.BOLD, 512);
-                }
-            }
-        }
-
-        return mTextFont;
-    }
-
-    /**
-     * Sets the text font to be used for text rendering if the
-     * {@link #sourceType} is a {@link SourceType#TEXT}
-     *
-     * @param textFont the font to use
-     */
-    public void setTextFont(@NonNull Font textFont) {
-        mTextFont = textFont;
-    }
-
-    /** Types of sources that the asset studio can use to generate icons from */
-    public enum SourceType {
-        /** Generate the icon using the image pointed to by {@link #imagePath} */
-        IMAGE,
-
-        /** Generate the icon using the clipart named by {@link #clipartName} */
-        CLIPART,
-
-        /** Generate the icon using the text in {@link #text} */
-        TEXT
-    }
-
-    // ---- Implements GraphicGeneratorContext ----
-
-    @Override
-    public BufferedImage loadImageResource(String relativeName) {
-        try {
-            return getCachedImage(relativeName, true);
-        } catch (IOException e) {
-            AdtPlugin.log(e, null);
-            return null;
-        }
-    }
-
-    BufferedImage getCachedImage(String path, boolean isPluginRelative)
-            throws IOException {
-        BufferedImage image = mImageCache != null ? mImageCache.get(path) : null;
-        if (image == null) {
-            image = getImage(path, isPluginRelative);
-            if (mImageCache == null) {
-                mImageCache = new HashMap<String, BufferedImage>();
-            }
-            mImageCache.put(path, image);
-        }
-
-        return image;
-    }
-
-    @NonNull
-    static BufferedImage getImage(@NonNull String path, boolean isPluginRelative)
-            throws IOException {
-        BufferedImage image = null;
-        if (isPluginRelative) {
-            image = GraphicGenerator.getStencilImage(path);
-        } else {
-            if (path.equals(DEFAULT_LAUNCHER_ICON)) {
-                File file = TemplateManager.getTemplateLocation(
-                  "projects/NewAndroidApplication/root/res/drawable-xhdpi/ic_launcher.png"); //$NON-NLS-1$
-                if (file != null) {
-                    path = file.getPath();
-                } else {
-                    image = GraphicGenerator.getStencilImage("user.png");
-                }
-            }
-
-            File file = new File(path);
-
-            // Requires Batik
-            //if (file.getName().endsWith(DOT_SVG)) {
-            //    image = loadSvgImage(file);
-            //}
-
-            if (image == null) {
-                image = ImageIO.read(file);
-            }
-        }
-
-        if (image == null) {
-            image = new BufferedImage(1,1, BufferedImage.TYPE_INT_ARGB);
-        }
-
-        return image;
-    }
-
-    // This requires Batik for SVG rendering
-    //
-    //public static BufferedImage loadSvgImage(File file) {
-    //    BufferedImageTranscoder transcoder = new BufferedImageTranscoder();
-    //
-    //    String svgURI = file.toURI().toString();
-    //    TranscoderInput input = new TranscoderInput(svgURI);
-    //
-    //    try {
-    //        transcoder.transcode(input, null);
-    //    } catch (TranscoderException e) {
-    //        e.printStackTrace();
-    //        return null;
-    //    }
-    //
-    //    return transcoder.decodedImage;
-    //}
-    //
-    ///**
-    // * A dummy implementation of an {@link ImageTranscoder} that simply stores the {@link
-    // * BufferedImage} generated by the SVG library.
-    // */
-    //private static class BufferedImageTranscoder extends ImageTranscoder {
-    //    public BufferedImage decodedImage;
-    //
-    //    @Override
-    //    public BufferedImage createImage(int w, int h) {
-    //        return new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB);
-    //    }
-    //
-    //    @Override
-    //    public void writeImage(BufferedImage image, TranscoderOutput output)
-    //            throws TranscoderException {
-    //        this.decodedImage = image;
-    //    }
-    //}
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/assetstudio/OpenCreateAssetSetWizardAction.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/assetstudio/OpenCreateAssetSetWizardAction.java
deleted file mode 100644
index 09cc325..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/assetstudio/OpenCreateAssetSetWizardAction.java
+++ /dev/null
@@ -1,58 +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.eclipse.adt.internal.assetstudio;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.jdt.ui.actions.AbstractOpenWizardAction;
-import org.eclipse.ui.INewWizard;
-
-import java.util.List;
-
-/** An action for opening the Create Icon Set wizard */
-public class OpenCreateAssetSetWizardAction extends AbstractOpenWizardAction {
-    private IProject mProject;
-    private CreateAssetSetWizard mWizard;
-
-    /**
-     * Creates a new {@link #OpenCreateAssetSetWizardAction} instance
-     *
-     * @param project the initial project to associate with the wizard
-     */
-    public OpenCreateAssetSetWizardAction(IProject project) {
-        mProject = project;
-    }
-
-
-    @Override
-    protected INewWizard createWizard() throws CoreException {
-        mWizard = new CreateAssetSetWizard();
-        mWizard.setProject(mProject);
-        return mWizard;
-    }
-
-    /**
-     * Returns the list of files created by the wizard. Must only be called
-     * after this action's {@link #run()} method has been called. May return
-     * null if the user cancels out of the wizard.
-     *
-     * @return a list of files created by the wizard, or null
-     */
-    public List<IResource> getCreatedFiles() {
-        return mWizard.getCreatedFiles();
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/build/AaptExecException.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/build/AaptExecException.java
deleted file mode 100644
index 23b1baa..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/build/AaptExecException.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Copyright (C) 2010 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.build;
-
-/**
- * Exception thrown when the execution of aapt fails.
- *
- */
-public final class AaptExecException extends Exception {
-    private static final long serialVersionUID = 1L;
-
-    AaptExecException(String message, Throwable cause) {
-        super(message, cause);
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/build/AaptParser.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/build/AaptParser.java
deleted file mode 100644
index 1f17fb7..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/build/AaptParser.java
+++ /dev/null
@@ -1,783 +0,0 @@
-/*
- * Copyright (C) 2010 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.build;
-
-import com.android.ide.eclipse.adt.AdtConstants;
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.ide.eclipse.adt.internal.project.BaseProjectHelper;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.jface.text.FindReplaceDocumentAdapter;
-import org.eclipse.jface.text.IDocument;
-import org.eclipse.jface.text.IRegion;
-import org.eclipse.jface.text.Region;
-import org.eclipse.ui.editors.text.TextFileDocumentProvider;
-import org.eclipse.ui.texteditor.IDocumentProvider;
-
-import java.io.File;
-import java.util.List;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-public final class AaptParser {
-
-    // TODO: rename the pattern to something that makes sense + javadoc comments.
-    /**
-     * Single line aapt warning for skipping files.<br>
-     * "  (skipping hidden file '&lt;file path&gt;'"
-     */
-    private final static Pattern sPattern0Line1 = Pattern.compile(
-            "^\\s+\\(skipping hidden file\\s'(.*)'\\)$"); //$NON-NLS-1$
-
-    /**
-     * First line of dual line aapt error.<br>
-     * "ERROR at line &lt;line&gt;: &lt;error&gt;"<br>
-     * " (Occurred while parsing &lt;path&gt;)"
-     */
-    private final static Pattern sPattern1Line1 = Pattern.compile(
-            "^ERROR\\s+at\\s+line\\s+(\\d+):\\s+(.*)$"); //$NON-NLS-1$
-    /**
-     * Second line of dual line aapt error.<br>
-     * "ERROR at line &lt;line&gt;: &lt;error&gt;"<br>
-     * " (Occurred while parsing &lt;path&gt;)"<br>
-     * @see #sPattern1Line1
-     */
-    private final static Pattern sPattern1Line2 = Pattern.compile(
-            "^\\s+\\(Occurred while parsing\\s+(.*)\\)$");  //$NON-NLS-1$
-    /**
-     * First line of dual line aapt error.<br>
-     * "ERROR: &lt;error&gt;"<br>
-     * "Defined at file &lt;path&gt; line &lt;line&gt;"
-     */
-    private final static Pattern sPattern2Line1 = Pattern.compile(
-            "^ERROR:\\s+(.+)$"); //$NON-NLS-1$
-    /**
-     * Second line of dual line aapt error.<br>
-     * "ERROR: &lt;error&gt;"<br>
-     * "Defined at file &lt;path&gt; line &lt;line&gt;"<br>
-     * @see #sPattern2Line1
-     */
-    private final static Pattern sPattern2Line2 = Pattern.compile(
-            "Defined\\s+at\\s+file\\s+(.+)\\s+line\\s+(\\d+)"); //$NON-NLS-1$
-    /**
-     * Single line aapt error<br>
-     * "&lt;path&gt; line &lt;line&gt;: &lt;error&gt;"
-     */
-    private final static Pattern sPattern3Line1 = Pattern.compile(
-            "^(.+)\\sline\\s(\\d+):\\s(.+)$"); //$NON-NLS-1$
-    /**
-     * First line of dual line aapt error.<br>
-     * "ERROR parsing XML file &lt;path&gt;"<br>
-     * "&lt;error&gt; at line &lt;line&gt;"
-     */
-    private final static Pattern sPattern4Line1 = Pattern.compile(
-            "^Error\\s+parsing\\s+XML\\s+file\\s(.+)$"); //$NON-NLS-1$
-    /**
-     * Second line of dual line aapt error.<br>
-     * "ERROR parsing XML file &lt;path&gt;"<br>
-     * "&lt;error&gt; at line &lt;line&gt;"<br>
-     * @see #sPattern4Line1
-     */
-    private final static Pattern sPattern4Line2 = Pattern.compile(
-            "^(.+)\\s+at\\s+line\\s+(\\d+)$"); //$NON-NLS-1$
-
-    /**
-     * Single line aapt warning<br>
-     * "&lt;path&gt;:&lt;line&gt;: &lt;error&gt;"
-     */
-    private final static Pattern sPattern5Line1 = Pattern.compile(
-            "^(.+?):(\\d+):\\s+WARNING:(.+)$"); //$NON-NLS-1$
-
-    /**
-     * Single line aapt error<br>
-     * "&lt;path&gt;:&lt;line&gt;: &lt;error&gt;"
-     */
-    private final static Pattern sPattern6Line1 = Pattern.compile(
-            "^(.+?):(\\d+):\\s+(.+)$"); //$NON-NLS-1$
-
-    /**
-     * 4 line aapt error<br>
-     * "ERROR: 9-path image &lt;path&gt; malformed"<br>
-     * Line 2 and 3 are taken as-is while line 4 is ignored (it repeats with<br>
-     * 'ERROR: failure processing &lt;path&gt;)
-     */
-    private final static Pattern sPattern7Line1 = Pattern.compile(
-            "^ERROR:\\s+9-patch\\s+image\\s+(.+)\\s+malformed\\.$"); //$NON-NLS-1$
-
-    private final static Pattern sPattern8Line1 = Pattern.compile(
-            "^(invalid resource directory name): (.*)$"); //$NON-NLS-1$
-
-    /**
-     * Portion of the error message which states the context in which the error occurred,
-     * such as which property was being processed and what the string value was that
-     * caused the error.
-     * <p>
-     * Example:
-     * error: No resource found that matches the given name (at 'text' with value '@string/foo')
-     */
-    private static final Pattern sValueRangePattern =
-        Pattern.compile("\\(at '(.+)' with value '(.*)'\\)"); //$NON-NLS-1$
-
-
-    /**
-     * Portion of error message which points to the second occurrence of a repeated resource
-     * definition.
-     * <p>
-     * Example:
-     * error: Resource entry repeatedStyle1 already has bag item android:gravity.
-     */
-    private static final Pattern sRepeatedRangePattern =
-        Pattern.compile("Resource entry (.+) already has bag item (.+)\\."); //$NON-NLS-1$
-
-    /**
-     * Error message emitted when aapt skips a file because for example it's name is
-     * invalid, such as a layout file name which starts with _.
-     * <p>
-     * This error message is used by AAPT in Tools 19 and earlier.
-     */
-    private static final Pattern sSkippingPattern =
-        Pattern.compile("    \\(skipping (.+) .+ '(.*)'\\)"); //$NON-NLS-1$
-
-    /**
-     * Error message emitted when aapt skips a file because for example it's name is
-     * invalid, such as a layout file name which starts with _.
-     * <p>
-     * This error message is used by AAPT in Tools 20 and later.
-     */
-    private static final Pattern sNewSkippingPattern =
-        Pattern.compile("    \\(skipping .+ '(.+)' due to ANDROID_AAPT_IGNORE pattern '.+'\\)"); //$NON-NLS-1$
-
-    /**
-     * Suffix of error message which points to the first occurrence of a repeated resource
-     * definition.
-     * Example:
-     * Originally defined here.
-     */
-    private static final String ORIGINALLY_DEFINED_MSG = "Originally defined here."; //$NON-NLS-1$
-
-    /**
-     * Portion of error message which points to the second occurrence of a repeated resource
-     * definition.
-     * <p>
-     * Example:
-     * error: Resource entry repeatedStyle1 already has bag item android:gravity.
-     */
-    private static final Pattern sNoResourcePattern =
-        Pattern.compile("No resource found that matches the given name: attr '(.+)'\\."); //$NON-NLS-1$
-
-    /**
-     * Portion of error message which points to a missing required attribute in a
-     * resource definition.
-     * <p>
-     * Example:
-     * error: error: A 'name' attribute is required for <style>
-     */
-    private static final Pattern sRequiredPattern =
-        Pattern.compile("A '(.+)' attribute is required for <(.+)>"); //$NON-NLS-1$
-
-    /**
-     * 2 line aapt error<br>
-     * "ERROR: Invalid configuration: foo"<br>
-     * "                              ^^^"<br>
-     * There's no need to parse the 2nd line.
-     */
-    private final static Pattern sPattern9Line1 = Pattern.compile(
-            "^Invalid configuration: (.+)$"); //$NON-NLS-1$
-
-    private final static Pattern sXmlBlockPattern = Pattern.compile(
-            "W/ResourceType\\(.*\\): Bad XML block: no root element node found"); //$NON-NLS-1$
-
-    /**
-     * Parse the output of aapt and mark the incorrect file with error markers
-     *
-     * @param results the output of aapt
-     * @param project the project containing the file to mark
-     * @return true if the parsing failed, false if success.
-     */
-    public static boolean parseOutput(List<String> results, IProject project) {
-        int size = results.size();
-        if (size > 0) {
-            return parseOutput(results.toArray(new String[size]), project);
-        }
-
-        return false;
-    }
-
-    /**
-     * Parse the output of aapt and mark the incorrect file with error markers
-     *
-     * @param results the output of aapt
-     * @param project the project containing the file to mark
-     * @return true if the parsing failed, false if success.
-     */
-    public static boolean parseOutput(String[] results, IProject project) {
-        // nothing to parse? just return false;
-        if (results.length == 0) {
-            return false;
-        }
-
-        // get the root of the project so that we can make IFile from full
-        // file path
-        String osRoot = project.getLocation().toOSString();
-
-        Matcher m;
-
-        for (int i = 0; i < results.length ; i++) {
-            String p = results[i];
-
-            m = sPattern0Line1.matcher(p);
-            if (m.matches()) {
-                // we ignore those (as this is an ignore message from aapt)
-                continue;
-            }
-
-            m = sPattern1Line1.matcher(p);
-            if (m.matches()) {
-                String lineStr = m.group(1);
-                String msg = m.group(2);
-
-                // get the matcher for the next line.
-                m = getNextLineMatcher(results, ++i, sPattern1Line2);
-                if (m == null) {
-                    return true;
-                }
-
-                String location = m.group(1);
-
-                // check the values and attempt to mark the file.
-                if (checkAndMark(location, lineStr, msg, osRoot, project,
-                        AdtConstants.MARKER_AAPT_COMPILE, IMarker.SEVERITY_ERROR) == false) {
-                    return true;
-                }
-                continue;
-            }
-
-            // this needs to be tested before Pattern2 since they both start with 'ERROR:'
-            m = sPattern7Line1.matcher(p);
-            if (m.matches()) {
-                String location = m.group(1);
-                String msg = p; // default msg is the line in case we don't find anything else
-
-                if (++i < results.length) {
-                    msg = results[i].trim();
-                    if (++i < results.length) {
-                        msg = msg + " - " + results[i].trim(); //$NON-NLS-1$
-
-                        // skip the next line
-                        i++;
-                    }
-                }
-
-                // display the error
-                if (checkAndMark(location, null, msg, osRoot, project,
-                        AdtConstants.MARKER_AAPT_COMPILE, IMarker.SEVERITY_ERROR) == false) {
-                    return true;
-                }
-
-                // success, go to the next line
-                continue;
-            }
-
-            m =  sPattern2Line1.matcher(p);
-            if (m.matches()) {
-                // get the msg
-                String msg = m.group(1);
-
-                // get the matcher for the next line.
-                m = getNextLineMatcher(results, ++i, sPattern2Line2);
-                if (m == null) {
-                    return true;
-                }
-
-                String location = m.group(1);
-                String lineStr = m.group(2);
-
-                // check the values and attempt to mark the file.
-                if (checkAndMark(location, lineStr, msg, osRoot, project,
-                        AdtConstants.MARKER_AAPT_COMPILE, IMarker.SEVERITY_ERROR) == false) {
-                    return true;
-                }
-                continue;
-            }
-
-            m = sPattern3Line1.matcher(p);
-            if (m.matches()) {
-                String location = m.group(1);
-                String lineStr = m.group(2);
-                String msg = m.group(3);
-
-                // check the values and attempt to mark the file.
-                if (checkAndMark(location, lineStr, msg, osRoot, project,
-                        AdtConstants.MARKER_AAPT_COMPILE, IMarker.SEVERITY_ERROR) == false) {
-                    return true;
-                }
-
-                // success, go to the next line
-                continue;
-            }
-
-            m = sPattern4Line1.matcher(p);
-            if (m.matches()) {
-                // get the filename.
-                String location = m.group(1);
-
-                // get the matcher for the next line.
-                m = getNextLineMatcher(results, ++i, sPattern4Line2);
-                if (m == null) {
-                    return true;
-                }
-
-                String msg = m.group(1);
-                String lineStr = m.group(2);
-
-                // check the values and attempt to mark the file.
-                if (checkAndMark(location, lineStr, msg, osRoot, project,
-                        AdtConstants.MARKER_AAPT_COMPILE, IMarker.SEVERITY_ERROR) == false) {
-                    return true;
-                }
-
-                // success, go to the next line
-                continue;
-            }
-
-            m = sPattern5Line1.matcher(p);
-            if (m.matches()) {
-                String location = m.group(1);
-                String lineStr = m.group(2);
-                String msg = m.group(3);
-
-                // check the values and attempt to mark the file.
-                if (checkAndMark(location, lineStr, msg, osRoot, project,
-                        AdtConstants.MARKER_AAPT_COMPILE, IMarker.SEVERITY_WARNING) == false) {
-                    return true;
-                }
-
-                // success, go to the next line
-                continue;
-            }
-
-            m = sPattern6Line1.matcher(p);
-            if (m.matches()) {
-                String location = m.group(1);
-                String lineStr = m.group(2);
-                String msg = m.group(3);
-
-                // check the values and attempt to mark the file.
-                if (checkAndMark(location, lineStr, msg, osRoot, project,
-                        AdtConstants.MARKER_AAPT_COMPILE, IMarker.SEVERITY_ERROR) == false) {
-                    return true;
-                }
-
-                // success, go to the next line
-                continue;
-            }
-
-            m = sPattern8Line1.matcher(p);
-            if (m.matches()) {
-                String location = m.group(2);
-                String msg = m.group(1);
-
-                // check the values and attempt to mark the file.
-                if (checkAndMark(location, null, msg, osRoot, project,
-                        AdtConstants.MARKER_AAPT_COMPILE, IMarker.SEVERITY_ERROR) == false) {
-                    return true;
-                }
-
-                // success, go to the next line
-                continue;
-            }
-
-            m = sPattern9Line1.matcher(p);
-            if (m.matches()) {
-                String badConfig = m.group(1);
-                String msg = String.format("APK Configuration filter '%1$s' is invalid", badConfig);
-
-                // skip the next line
-                i++;
-
-                // check the values and attempt to mark the file.
-                if (checkAndMark(null /*location*/, null, msg, osRoot, project,
-                        AdtConstants.MARKER_AAPT_PACKAGE, IMarker.SEVERITY_ERROR) == false) {
-                    return true;
-                }
-
-                // success, go to the next line
-                continue;
-            }
-
-            m = sNewSkippingPattern.matcher(p);
-            if (m.matches()) {
-                String location = m.group(1);
-
-                if (location.startsWith(".")         //$NON-NLS-1$
-                        || location.endsWith("~")) { //$NON-NLS-1$
-                    continue;
-                }
-
-                // check the values and attempt to mark the file.
-                if (checkAndMark(location, null, p.trim(), osRoot, project,
-                        AdtConstants.MARKER_AAPT_COMPILE, IMarker.SEVERITY_WARNING) == false) {
-                    return true;
-                }
-
-                // success, go to the next line
-                continue;
-            }
-
-            m = sSkippingPattern.matcher(p);
-            if (m.matches()) {
-                String location = m.group(2);
-
-                // Certain files can safely be skipped without marking the project
-                // as having errors. See isHidden() in AaptAssets.cpp:
-                String type = m.group(1);
-                if (type.equals("backup")          //$NON-NLS-1$   // main.xml~, etc
-                        || type.equals("hidden")   //$NON-NLS-1$   // .gitignore, etc
-                        || type.equals("index")) { //$NON-NLS-1$   // thumbs.db, etc
-                    continue;
-                }
-
-                // check the values and attempt to mark the file.
-                if (checkAndMark(location, null, p.trim(), osRoot, project,
-                        AdtConstants.MARKER_AAPT_COMPILE, IMarker.SEVERITY_WARNING) == false) {
-                    return true;
-                }
-
-                // success, go to the next line
-                continue;
-            }
-
-            m = sXmlBlockPattern.matcher(p);
-            if (m.matches()) {
-                // W/ResourceType(12345): Bad XML block: no root element node found
-                // Sadly there's NO filename reference; this error typically describes the
-                // error *after* this line.
-                if (results.length == 1) {
-                    // This is the only error message: dump to console and quit
-                    return true;
-                }
-                // Continue: the real culprit is displayed next and should get a marker
-                continue;
-            }
-
-            return true;
-        }
-
-        return false;
-    }
-
-    /**
-     * Check if the parameters gotten from the error output are valid, and mark
-     * the file with an AAPT marker.
-     * @param location the full OS path of the error file. If null, the project is marked
-     * @param lineStr
-     * @param message
-     * @param root The root directory of the project, in OS specific format.
-     * @param project
-     * @param markerId The marker id to put.
-     * @param severity The severity of the marker to put (IMarker.SEVERITY_*)
-     * @return true if the parameters were valid and the file was marked successfully.
-     *
-     * @see IMarker
-     */
-    private static final  boolean checkAndMark(String location, String lineStr,
-            String message, String root, IProject project, String markerId, int severity) {
-        // check this is in fact a file
-        if (location != null) {
-            File f = new File(location);
-            if (f.exists() == false) {
-                return false;
-            }
-        }
-
-        // get the line number
-        int line = -1; // default value for error with no line.
-
-        if (lineStr != null) {
-            try {
-                line = Integer.parseInt(lineStr);
-            } catch (NumberFormatException e) {
-                // looks like the string we extracted wasn't a valid
-                // file number. Parsing failed and we return true
-                return false;
-            }
-        }
-
-        // add the marker
-        IResource f2 = project;
-        if (location != null) {
-            f2 = getResourceFromFullPath(location, root, project);
-            if (f2 == null) {
-                return false;
-            }
-        }
-
-        // Attempt to determine the exact range of characters affected by this error.
-        // This will look up the actual text of the file, go to the particular error line
-        // and scan for the specific string mentioned in the error.
-        int startOffset = -1;
-        int endOffset = -1;
-        if (f2 instanceof IFile) {
-            IRegion region = findRange((IFile) f2, line, message);
-            if (region != null) {
-                startOffset = region.getOffset();
-                endOffset = startOffset + region.getLength();
-            }
-        }
-
-        // check if there's a similar marker already, since aapt is launched twice
-        boolean markerAlreadyExists = false;
-        try {
-            IMarker[] markers = f2.findMarkers(markerId, true, IResource.DEPTH_ZERO);
-
-            for (IMarker marker : markers) {
-                if (startOffset != -1) {
-                    int tmpBegin = marker.getAttribute(IMarker.CHAR_START, -1);
-                    if (tmpBegin != startOffset) {
-                        break;
-                    }
-                    int tmpEnd = marker.getAttribute(IMarker.CHAR_END, -1);
-                    if (tmpEnd != startOffset) {
-                        break;
-                    }
-                }
-
-                int tmpLine = marker.getAttribute(IMarker.LINE_NUMBER, -1);
-                if (tmpLine != line) {
-                    break;
-                }
-
-                int tmpSeverity = marker.getAttribute(IMarker.SEVERITY, -1);
-                if (tmpSeverity != severity) {
-                    break;
-                }
-
-                String tmpMsg = marker.getAttribute(IMarker.MESSAGE, null);
-                if (tmpMsg == null || tmpMsg.equals(message) == false) {
-                    break;
-                }
-
-                // if we're here, all the marker attributes are equals, we found it
-                // and exit
-                markerAlreadyExists = true;
-                break;
-            }
-
-        } catch (CoreException e) {
-            // if we couldn't get the markers, then we just mark the file again
-            // (since markerAlreadyExists is initialized to false, we do nothing)
-        }
-
-        if (markerAlreadyExists == false) {
-            BaseProjectHelper.markResource(f2, markerId, message, line,
-                    startOffset, endOffset, severity);
-        }
-
-        return true;
-    }
-
-    /**
-     * Given an aapt error message in a given file and a given (initial) line number,
-     * return the corresponding offset range for the error, or null.
-     */
-    private static IRegion findRange(IFile file, int line, String message) {
-        Matcher matcher = sValueRangePattern.matcher(message);
-        if (matcher.find()) {
-            String property = matcher.group(1);
-            String value = matcher.group(2);
-
-            // First find the property. We can't just immediately look for the
-            // value, because there could be other attributes in this element
-            // earlier than the one in error, and we might accidentally pick
-            // up on a different occurrence of the value in a context where
-            // it is valid.
-            if (value.length() > 0) {
-                return findRange(file, line, property, value);
-            } else {
-                // Find first occurrence of property followed by '' or ""
-                IRegion region1 = findRange(file, line, property, "\"\""); //$NON-NLS-1$
-                IRegion region2 = findRange(file, line, property, "''");   //$NON-NLS-1$
-                if (region1 == null) {
-                    if (region2 == null) {
-                        // Highlight the property instead
-                        return findRange(file, line, property, null);
-                    }
-                    return region2;
-                } else if (region2 == null) {
-                    return region1;
-                } else if (region1.getOffset() < region2.getOffset()) {
-                    return region1;
-                } else {
-                    return region2;
-                }
-            }
-        }
-
-        matcher = sRepeatedRangePattern.matcher(message);
-        if (matcher.find()) {
-            String property = matcher.group(2);
-            return findRange(file, line, property, null);
-        }
-
-        matcher = sNoResourcePattern.matcher(message);
-        if (matcher.find()) {
-            String property = matcher.group(1);
-            return findRange(file, line, property, null);
-        }
-
-        matcher = sRequiredPattern.matcher(message);
-        if (matcher.find()) {
-            String elementName = matcher.group(2);
-            IRegion region = findRange(file, line, '<' + elementName, null);
-            if (region != null && region.getLength() > 1) {
-                // Skip the opening <
-                region = new Region(region.getOffset() + 1, region.getLength() - 1);
-            }
-            return region;
-        }
-
-        if (message.endsWith(ORIGINALLY_DEFINED_MSG)) {
-            return findLineTextRange(file, line);
-        }
-
-        return null;
-    }
-
-    /**
-     * Given a file and line number, return the range of the first match starting on the
-     * given line. If second is non null, also search for the second string starting at he
-     * location of the first string.
-     */
-    private static IRegion findRange(IFile file, int line, String first,
-            String second) {
-        IRegion region = null;
-        IDocumentProvider provider = new TextFileDocumentProvider();
-        try {
-            provider.connect(file);
-            IDocument document = provider.getDocument(file);
-            if (document != null) {
-                IRegion lineInfo = document.getLineInformation(line - 1);
-                int lineStartOffset = lineInfo.getOffset();
-                // The aapt errors will be anchored on the line where the
-                // element starts - which means that with formatting where
-                // attributes end up on subsequent lines we don't find it on
-                // the error line indicated by aapt.
-                // Therefore, search forwards in the document.
-                FindReplaceDocumentAdapter adapter =
-                    new FindReplaceDocumentAdapter(document);
-
-                region = adapter.find(lineStartOffset, first,
-                        true /*forwardSearch*/, true /*caseSensitive*/,
-                        false /*wholeWord*/, false /*regExSearch*/);
-                if (region != null && second != null) {
-                    region = adapter.find(region.getOffset() + first.length(), second,
-                            true /*forwardSearch*/, true /*caseSensitive*/,
-                            false /*wholeWord*/, false /*regExSearch*/);
-                }
-            }
-        } catch (Exception e) {
-            AdtPlugin.log(e, "Can't find range information for %1$s", file.getName());
-        } finally {
-            provider.disconnect(file);
-        }
-        return region;
-    }
-
-    /** Returns the non-whitespace line range at the given line number. */
-    private static IRegion findLineTextRange(IFile file, int line) {
-        IDocumentProvider provider = new TextFileDocumentProvider();
-        try {
-            provider.connect(file);
-            IDocument document = provider.getDocument(file);
-            if (document != null) {
-                IRegion lineInfo = document.getLineInformation(line - 1);
-                String lineContents = document.get(lineInfo.getOffset(), lineInfo.getLength());
-                int lineBegin = 0;
-                int lineEnd = lineContents.length()-1;
-
-                for (; lineEnd >= 0; lineEnd--) {
-                    char c = lineContents.charAt(lineEnd);
-                    if (!Character.isWhitespace(c)) {
-                        break;
-                    }
-                }
-                lineEnd++;
-                for (; lineBegin < lineEnd; lineBegin++) {
-                    char c = lineContents.charAt(lineBegin);
-                    if (!Character.isWhitespace(c)) {
-                        break;
-                    }
-                }
-                if (lineBegin < lineEnd) {
-                    return new Region(lineInfo.getOffset() + lineBegin, lineEnd - lineBegin);
-                }
-            }
-        } catch (Exception e) {
-            AdtPlugin.log(e, "Can't find range information for %1$s", file.getName());
-        } finally {
-            provider.disconnect(file);
-        }
-
-        return null;
-    }
-
-    /**
-     * Returns a matching matcher for the next line
-     * @param lines The array of lines
-     * @param nextIndex The index of the next line
-     * @param pattern The pattern to match
-     * @return null if error or no match, the matcher otherwise.
-     */
-    private static final Matcher getNextLineMatcher(String[] lines,
-            int nextIndex, Pattern pattern) {
-        // unless we can't, because we reached the last line
-        if (nextIndex == lines.length) {
-            // we expected a 2nd line, so we flag as error
-            // and we bail
-            return null;
-        }
-
-        Matcher m = pattern.matcher(lines[nextIndex]);
-        if (m.matches()) {
-           return m;
-        }
-
-        return null;
-    }
-
-    private static IResource getResourceFromFullPath(String filename, String root,
-            IProject project) {
-        if (filename.startsWith(root)) {
-            String file = filename.substring(root.length());
-
-            // get the resource
-            IResource r = project.findMember(file);
-
-            // if the resource is valid, we add the marker
-            if (r != null && r.exists()) {
-                return r;
-            }
-        }
-
-        return null;
-    }
-
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/build/AaptQuickFix.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/build/AaptQuickFix.java
deleted file mode 100644
index 3db3808..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/build/AaptQuickFix.java
+++ /dev/null
@@ -1,431 +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.eclipse.adt.internal.build;
-
-import static com.android.SdkConstants.ANDROID_URI;
-import static com.android.SdkConstants.XMLNS_ANDROID;
-import static com.android.SdkConstants.XMLNS_URI;
-
-import com.android.ide.common.resources.ResourceUrl;
-import com.android.ide.eclipse.adt.AdtConstants;
-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.resources.ResourceHelper;
-import com.android.resources.ResourceType;
-import com.android.utils.Pair;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.jface.text.BadLocationException;
-import org.eclipse.jface.text.IDocument;
-import org.eclipse.jface.text.IRegion;
-import org.eclipse.jface.text.Region;
-import org.eclipse.jface.text.contentassist.ICompletionProposal;
-import org.eclipse.jface.text.contentassist.IContextInformation;
-import org.eclipse.jface.text.quickassist.IQuickAssistInvocationContext;
-import org.eclipse.jface.text.quickassist.IQuickAssistProcessor;
-import org.eclipse.jface.text.source.Annotation;
-import org.eclipse.jface.text.source.ISourceViewer;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.ui.IMarkerResolution;
-import org.eclipse.ui.IMarkerResolution2;
-import org.eclipse.ui.IMarkerResolutionGenerator2;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.editors.text.TextFileDocumentProvider;
-import org.eclipse.ui.texteditor.IDocumentProvider;
-import org.eclipse.wst.sse.core.StructuredModelManager;
-import org.eclipse.wst.sse.core.internal.provisional.IModelManager;
-import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
-import org.eclipse.wst.sse.core.internal.provisional.IndexedRegion;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
-import org.w3c.dom.Attr;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-
-import java.util.List;
-
-/**
- * Shared handler for both quick assist processors (Control key handler) and quick fix
- * marker resolution (Problem view handling), since there is a lot of overlap between
- * these two UI handlers.
- */
-@SuppressWarnings("restriction") // XML model
-public class AaptQuickFix implements IMarkerResolutionGenerator2, IQuickAssistProcessor {
-
-    public AaptQuickFix() {
-    }
-
-    /** Returns the error message from aapt that signals missing resources */
-    private static String getTargetMarkerErrorMessage() {
-        return "No resource found that matches the given name";
-    }
-
-    /** Returns the error message from aapt that signals a missing namespace declaration */
-    private static String getUnboundErrorMessage() {
-        return "Error parsing XML: unbound prefix";
-    }
-
-    // ---- Implements IMarkerResolution2 ----
-
-    @Override
-    public boolean hasResolutions(IMarker marker) {
-        String message = null;
-        try {
-            message = (String) marker.getAttribute(IMarker.MESSAGE);
-        } catch (CoreException e) {
-            AdtPlugin.log(e, null);
-        }
-
-        return message != null
-                && (message.contains(getTargetMarkerErrorMessage())
-                        || message.contains(getUnboundErrorMessage()));
-    }
-
-    @Override
-    public IMarkerResolution[] getResolutions(IMarker marker) {
-        IResource markerResource = marker.getResource();
-        IProject project = markerResource.getProject();
-        try {
-            String message = (String) marker.getAttribute(IMarker.MESSAGE);
-            if (message.contains(getUnboundErrorMessage()) && markerResource instanceof IFile) {
-                return new IMarkerResolution[] {
-                        new CreateNamespaceFix((IFile) markerResource)
-                    };
-            }
-        } catch (CoreException e1) {
-            AdtPlugin.log(e1, null);
-        }
-
-        int start = marker.getAttribute(IMarker.CHAR_START, 0);
-        int end = marker.getAttribute(IMarker.CHAR_END, 0);
-        if (end > start) {
-            int length = end - start;
-            IDocumentProvider provider = new TextFileDocumentProvider();
-            try {
-                provider.connect(markerResource);
-                IDocument document = provider.getDocument(markerResource);
-                String resource = document.get(start, length);
-                if (ResourceHelper.canCreateResource(resource)) {
-                    return new IMarkerResolution[] {
-                        new CreateResourceProposal(project, resource)
-                    };
-                }
-            } catch (Exception e) {
-                AdtPlugin.log(e, "Can't find range information for %1$s", markerResource);
-            } finally {
-                provider.disconnect(markerResource);
-            }
-        }
-
-        return null;
-    }
-
-    // ---- Implements IQuickAssistProcessor ----
-
-    @Override
-    public boolean canAssist(IQuickAssistInvocationContext invocationContext) {
-        return true;
-    }
-
-    @Override
-    public boolean canFix(Annotation annotation) {
-        return true;
-    }
-
-    @Override
-    public ICompletionProposal[] computeQuickAssistProposals(
-            IQuickAssistInvocationContext invocationContext) {
-
-        // We have to find the corresponding project/file (so we can look up the aapt
-        // error markers). Unfortunately, an IQuickAssistProcessor only gets
-        // access to an ISourceViewer which has no hooks back to the surrounding
-        // editor.
-        //
-        // However, the IQuickAssistProcessor will only be used interactively by a file
-        // being edited, so we can cheat like the hyperlink detector and simply
-        // look up the currently active file in the IDE. To be on the safe side,
-        // we'll make sure that that editor has the same sourceViewer such that
-        // we are indeed looking at the right file:
-        ISourceViewer sourceViewer = invocationContext.getSourceViewer();
-        AndroidXmlEditor editor = AndroidXmlEditor.fromTextViewer(sourceViewer);
-        if (editor != null) {
-            IFile file = editor.getInputFile();
-            if (file == null) {
-                return null;
-            }
-            IDocument document = sourceViewer.getDocument();
-            List<IMarker> markers = AdtUtils.findMarkersOnLine(AdtConstants.MARKER_AAPT_COMPILE,
-                    file, document, invocationContext.getOffset());
-            try {
-                for (IMarker marker : markers) {
-                    String message = marker.getAttribute(IMarker.MESSAGE, ""); //$NON-NLS-1$
-                    if (message.contains(getTargetMarkerErrorMessage())) {
-                        int start = marker.getAttribute(IMarker.CHAR_START, 0);
-                        int end = marker.getAttribute(IMarker.CHAR_END, 0);
-                        int length = end - start;
-                        String resource = document.get(start, length);
-                        // Can only offer create value for non-framework value
-                        // resources
-                        if (ResourceHelper.canCreateResource(resource)) {
-                            IProject project = editor.getProject();
-                            return new ICompletionProposal[] {
-                                new CreateResourceProposal(project, resource)
-                            };
-                        }
-                    } else if (message.contains(getUnboundErrorMessage())) {
-                        return new ICompletionProposal[] {
-                            new CreateNamespaceFix(null)
-                        };
-                    }
-                }
-            } catch (BadLocationException e) {
-                AdtPlugin.log(e, null);
-            }
-        }
-
-        return null;
-    }
-
-    @Override
-    public String getErrorMessage() {
-        return null;
-    }
-
-    /** Quick fix to insert namespace binding when missing */
-    private final static class CreateNamespaceFix
-            implements ICompletionProposal, IMarkerResolution2 {
-        private IFile mFile;
-
-        public CreateNamespaceFix(IFile file) {
-            mFile = file;
-        }
-
-        private IndexedRegion perform(IDocument doc) {
-            IModelManager manager = StructuredModelManager.getModelManager();
-            IStructuredModel model = manager.getExistingModelForEdit(doc);
-            if (model != null) {
-                try {
-                    perform(model);
-                } finally {
-                    model.releaseFromEdit();
-                }
-            }
-
-            return null;
-        }
-
-        private IndexedRegion perform(IFile file) {
-            IModelManager manager = StructuredModelManager.getModelManager();
-            IStructuredModel model;
-            try {
-                model = manager.getModelForEdit(file);
-                if (model != null) {
-                    try {
-                        perform(model);
-                    } finally {
-                        model.releaseFromEdit();
-                    }
-                }
-            } catch (Exception e) {
-                AdtPlugin.log(e, "Can't look up XML model");
-            }
-
-            return null;
-        }
-
-        private IndexedRegion perform(IStructuredModel model) {
-            if (model instanceof IDOMModel) {
-                IDOMModel domModel = (IDOMModel) model;
-                Document document = domModel.getDocument();
-                Element element = document.getDocumentElement();
-                Attr attr = document.createAttributeNS(XMLNS_URI, XMLNS_ANDROID);
-                attr.setValue(ANDROID_URI);
-                element.getAttributes().setNamedItemNS(attr);
-                return (IndexedRegion) attr;
-            }
-
-            return null;
-        }
-
-        // ---- Implements ICompletionProposal ----
-
-        @Override
-        public void apply(IDocument document) {
-            perform(document);
-        }
-
-        @Override
-        public String getAdditionalProposalInfo() {
-            return "Adds an Android namespace declaratiopn to the root element.";
-        }
-
-        @Override
-        public IContextInformation getContextInformation() {
-            return null;
-        }
-
-        @Override
-        public String getDisplayString() {
-            return "Insert namespace binding";
-        }
-
-        @Override
-        public Image getImage() {
-            return AdtPlugin.getAndroidLogo();
-        }
-
-        @Override
-        public Point getSelection(IDocument doc) {
-            return null;
-        }
-
-
-        // ---- Implements MarkerResolution2 ----
-
-        @Override
-        public String getLabel() {
-            return getDisplayString();
-        }
-
-        @Override
-        public void run(IMarker marker) {
-            try {
-                AdtPlugin.openFile(mFile, null);
-            } catch (PartInitException e) {
-                AdtPlugin.log(e, "Can't open file %1$s", mFile.getName());
-            }
-
-            IndexedRegion indexedRegion = perform(mFile);
-            if (indexedRegion != null) {
-                try {
-                    IRegion region =
-                        new Region(indexedRegion.getStartOffset(), indexedRegion.getLength());
-                    AdtPlugin.openFile(mFile, region);
-                } catch (PartInitException e) {
-                    AdtPlugin.log(e, "Can't open file %1$s", mFile.getName());
-                }
-            }
-        }
-
-        @Override
-        public String getDescription() {
-            return getAdditionalProposalInfo();
-        }
-    }
-
-    private static class CreateResourceProposal
-            implements ICompletionProposal, IMarkerResolution2 {
-        private final IProject mProject;
-        private final String mResource;
-
-        CreateResourceProposal(IProject project, String resource) {
-            super();
-            mProject = project;
-            mResource = resource;
-        }
-
-        private void perform() {
-            ResourceUrl resource = ResourceUrl.parse(mResource);
-            if (resource == null) {
-                return;
-            }
-            ResourceType type = resource.type;
-            String name = resource.name;
-            assert !resource.framework;
-            String value = ""; //$NON-NLS-1$
-
-            // Try to pick a reasonable first guess. The new value will be highlighted and
-            // selected for editing, but if we have an initial value then the new file
-            // won't show an error.
-            switch (type) {
-                case STRING: value = "TODO"; break; //$NON-NLS-1$
-                case DIMEN: value = "1dp"; break; //$NON-NLS-1$
-                case BOOL: value = "true"; break; //$NON-NLS-1$
-                case COLOR: value = "#000000"; break; //$NON-NLS-1$
-                case INTEGER: value = "1"; break; //$NON-NLS-1$
-                case ARRAY: value = "<item>1</item>"; break; //$NON-NLS-1$
-            }
-
-            Pair<IFile, IRegion> location =
-                ResourceHelper.createResource(mProject, type, name, value);
-            if (location != null) {
-                IFile file = location.getFirst();
-                IRegion region = location.getSecond();
-                try {
-                    AdtPlugin.openFile(file, region);
-                } catch (PartInitException e) {
-                    AdtPlugin.log(e, "Can't open file %1$s", file.getName());
-                }
-            }
-        }
-
-        // ---- Implements ICompletionProposal ----
-
-        @Override
-        public void apply(IDocument document) {
-            perform();
-        }
-
-        @Override
-        public String getAdditionalProposalInfo() {
-            return "Creates an XML file entry for the given missing resource "
-                    + "and opens it in the editor.";
-        }
-
-        @Override
-        public IContextInformation getContextInformation() {
-            return null;
-        }
-
-        @Override
-        public String getDisplayString() {
-            return String.format("Create resource %1$s", mResource);
-        }
-
-        @Override
-        public Image getImage() {
-            return AdtPlugin.getAndroidLogo();
-        }
-
-        @Override
-        public Point getSelection(IDocument document) {
-            return null;
-        }
-
-        // ---- Implements MarkerResolution2 ----
-
-        @Override
-        public String getLabel() {
-            return getDisplayString();
-        }
-
-        @Override
-        public void run(IMarker marker) {
-            perform();
-        }
-
-        @Override
-        public String getDescription() {
-            return getAdditionalProposalInfo();
-        }
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/build/AaptResultException.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/build/AaptResultException.java
deleted file mode 100644
index 8d8fe68..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/build/AaptResultException.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Copyright (C) 2010 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.build;
-
-/**
- * Exception thrown when aapt reports an error in the resources.
- *
- */
-public final class AaptResultException extends ExecResultException {
-    private static final long serialVersionUID = 1L;
-
-    AaptResultException(int errorCode, String[] output) {
-        super(errorCode, output);
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/build/AidlProcessor.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/build/AidlProcessor.java
deleted file mode 100644
index 806fa9c..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/build/AidlProcessor.java
+++ /dev/null
@@ -1,484 +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.eclipse.adt.internal.build;
-
-import com.android.SdkConstants;
-import com.android.annotations.NonNull;
-import com.android.ide.eclipse.adt.AdtConstants;
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.ide.eclipse.adt.internal.build.builders.BaseBuilder;
-import com.android.ide.eclipse.adt.internal.preferences.AdtPrefs;
-import com.android.ide.eclipse.adt.internal.preferences.AdtPrefs.BuildVerbosity;
-import com.android.ide.eclipse.adt.internal.project.BaseProjectHelper;
-import com.android.sdklib.BuildToolInfo;
-import com.android.sdklib.IAndroidTarget;
-import com.android.sdklib.io.FileOp;
-
-import org.eclipse.core.resources.IContainer;
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IFolder;
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IWorkspaceRoot;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.core.runtime.SubProgressMonitor;
-import org.eclipse.jdt.core.IJavaProject;
-
-import java.io.File;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.List;
-import java.util.Set;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-/**
- * A {@link SourceProcessor} for aidl files.
- *
- */
-public class AidlProcessor extends SourceProcessor {
-
-    private static final String PROPERTY_COMPILE_AIDL = "compileAidl"; //$NON-NLS-1$
-
-    /**
-     * Single line aidl error<br>
-     * {@code <path>:<line>: <error>}<br>
-     * or<br>
-     * {@code <path>:<line> <error>}<br>
-     */
-    private static Pattern sAidlPattern1 = Pattern.compile("^(.+?):(\\d+):?\\s(.+)$"); //$NON-NLS-1$
-
-    private final static Set<String> EXTENSIONS = Collections.singleton(SdkConstants.EXT_AIDL);
-
-    private enum AidlType {
-        UNKNOWN, INTERFACE, PARCELABLE;
-    }
-
-    // See comment in #getAidlType()
-//  private final static Pattern sParcelablePattern = Pattern.compile(
-//          "^\\s*parcelable\\s+([a-zA-Z_][a-zA-Z0-9_]*)\\s*;\\s*$");
-//
-//  private final static Pattern sInterfacePattern = Pattern.compile(
-//          "^\\s*interface\\s+([a-zA-Z_][a-zA-Z0-9_]*)\\s*(?:\\{.*)?$");
-
-
-    public AidlProcessor(@NonNull IJavaProject javaProject, @NonNull BuildToolInfo buildToolInfo,
-            @NonNull IFolder genFolder) {
-        super(javaProject, buildToolInfo, genFolder);
-    }
-
-    @Override
-    protected Set<String> getExtensions() {
-        return EXTENSIONS;
-    }
-
-    @Override
-    protected String getSavePropertyName() {
-        return PROPERTY_COMPILE_AIDL;
-    }
-
-    @Override
-    protected void doCompileFiles(List<IFile> sources, BaseBuilder builder,
-            IProject project, IAndroidTarget projectTarget,
-            List<IPath> sourceFolders, List<IFile> notCompiledOut, List<File> libraryProjectsOut,
-            IProgressMonitor monitor) throws CoreException {
-        // create the command line
-        List<String> commandList = new ArrayList<String>(
-                4 + sourceFolders.size() + libraryProjectsOut.size());
-        commandList.add(getBuildToolInfo().getPath(BuildToolInfo.PathId.AIDL));
-        commandList.add(quote("-p" + projectTarget.getPath(IAndroidTarget.ANDROID_AIDL))); //$NON-NLS-1$
-
-        // since the path are relative to the workspace and not the project itself, we need
-        // the workspace root.
-        IWorkspaceRoot wsRoot = ResourcesPlugin.getWorkspace().getRoot();
-        for (IPath p : sourceFolders) {
-            IFolder f = wsRoot.getFolder(p);
-            if (f.exists()) { // if the resource doesn't exist, getLocation will return null.
-                commandList.add(quote("-I" + f.getLocation().toOSString())); //$NON-NLS-1$
-            }
-        }
-
-        for (File libOut : libraryProjectsOut) {
-            // FIXME: make folder configurable
-            File aidlFile = new File(libOut, SdkConstants.FD_AIDL);
-            if (aidlFile.isDirectory()) {
-                commandList.add(quote("-I" + aidlFile.getAbsolutePath())); //$NON-NLS-1$
-            }
-        }
-
-        // convert to array with 2 extra strings for the in/out file paths.
-        int index = commandList.size();
-        String[] commands = commandList.toArray(new String[index + 2]);
-
-        boolean verbose = AdtPrefs.getPrefs().getBuildVerbosity() == BuildVerbosity.VERBOSE;
-
-        // remove the generic marker from the project
-        builder.removeMarkersFromResource(project, AdtConstants.MARKER_AIDL);
-
-        // prepare the two output folders.
-        IFolder genFolder = getGenFolder();
-        IFolder projectOut = BaseProjectHelper.getAndroidOutputFolder(project);
-        IFolder aidlOutFolder = projectOut.getFolder(SdkConstants.FD_AIDL);
-        if (aidlOutFolder.exists() == false) {
-            aidlOutFolder.create(true /*force*/, true /*local*/,
-                    new SubProgressMonitor(monitor, 10));
-        }
-
-        boolean success = false;
-
-        // loop until we've compile them all
-        for (IFile sourceFile : sources) {
-            if (verbose) {
-                String name = sourceFile.getName();
-                IPath sourceFolderPath = getSourceFolderFor(sourceFile);
-                if (sourceFolderPath != null) {
-                    // make a path to the source file relative to the source folder.
-                    IPath relative = sourceFile.getFullPath().makeRelativeTo(sourceFolderPath);
-                    name = relative.toString();
-                }
-                AdtPlugin.printToConsole(project, "AIDL: " + name);
-            }
-
-            // Remove the AIDL error markers from the aidl file
-            builder.removeMarkersFromResource(sourceFile, AdtConstants.MARKER_AIDL);
-
-            // get the path of the source file.
-            IPath sourcePath = sourceFile.getLocation();
-            String osSourcePath = sourcePath.toOSString();
-
-            // look if we already know the output
-            SourceFileData data = getFileData(sourceFile);
-            if (data == null) {
-                data = new SourceFileData(sourceFile);
-                addData(data);
-            }
-
-            // if there's no output file yet, compute it.
-            if (data.getOutput() == null) {
-                IFile javaFile = getAidlOutputFile(sourceFile, genFolder,
-                        true /*replaceExt*/, true /*createFolders*/, monitor);
-                data.setOutputFile(javaFile);
-            }
-
-            // finish to set the command line.
-            commands[index] = quote(osSourcePath);
-            commands[index + 1] = quote(data.getOutput().getLocation().toOSString());
-
-            // launch the process
-            if (execAidl(builder, project, commands, sourceFile, verbose) == false) {
-                // aidl failed. File should be marked. We add the file to the list
-                // of file that will need compilation again.
-                notCompiledOut.add(sourceFile);
-            } else {
-                // Success. we'll return that we generated code
-                setCompilationStatus(COMPILE_STATUS_CODE);
-                success = true;
-
-                // Also copy the file to the bin folder.
-                IFile aidlOutFile = getAidlOutputFile(sourceFile, aidlOutFolder,
-                        false /*replaceExt*/, true /*createFolders*/, monitor);
-
-                FileOp op = new FileOp();
-                try {
-                    op.copyFile(sourceFile.getLocation().toFile(),
-                            aidlOutFile.getLocation().toFile());
-                } catch (IOException e) {
-                }
-            }
-        }
-
-        if (success) {
-            aidlOutFolder.refreshLocal(IResource.DEPTH_INFINITE, monitor);
-        }
-    }
-
-    @Override
-    protected void loadOutputAndDependencies() {
-        IProgressMonitor monitor = new NullProgressMonitor();
-        IFolder genFolder = getGenFolder();
-
-        Collection<SourceFileData> dataList = getAllFileData();
-        for (SourceFileData data : dataList) {
-            try {
-                IFile javaFile = getAidlOutputFile(data.getSourceFile(), genFolder,
-                        true /*replaceExt*/, false /*createFolders*/, monitor);
-                data.setOutputFile(javaFile);
-            } catch (CoreException e) {
-                // ignore, we're not asking to create the folder so this won't happen anyway.
-            }
-
-        }
-    }
-
-    /**
-     * Execute the aidl command line, parse the output, and mark the aidl file
-     * with any reported errors.
-     * @param command the String array containing the command line to execute.
-     * @param file The IFile object representing the aidl file being
-     *      compiled.
-     * @param verbose the build verbosity
-     * @return false if the exec failed, and build needs to be aborted.
-     */
-    private boolean execAidl(BaseBuilder builder, IProject project, String[] command, IFile file,
-            boolean verbose) {
-        // do the exec
-        try {
-            if (verbose) {
-                StringBuilder sb = new StringBuilder();
-                for (String c : command) {
-                    sb.append(c);
-                    sb.append(' ');
-                }
-                String cmd_line = sb.toString();
-                AdtPlugin.printToConsole(project, cmd_line);
-            }
-
-            Process p = Runtime.getRuntime().exec(command);
-
-            // list to store each line of stderr
-            ArrayList<String> stdErr = new ArrayList<String>();
-
-            // get the output and return code from the process
-            int returnCode = BuildHelper.grabProcessOutput(project, p, stdErr);
-
-            if (stdErr.size() > 0) {
-                // attempt to parse the error output
-                boolean parsingError = parseAidlOutput(stdErr, file);
-
-                // If the process failed and we couldn't parse the output
-                // we print a message, mark the project and exit
-                if (returnCode != 0) {
-
-                    if (parsingError || verbose) {
-                        // display the message in the console.
-                        if (parsingError) {
-                            AdtPlugin.printErrorToConsole(project, stdErr.toArray());
-
-                            // mark the project
-                            BaseProjectHelper.markResource(project, AdtConstants.MARKER_AIDL,
-                                    Messages.Unparsed_AIDL_Errors, IMarker.SEVERITY_ERROR);
-                        } else {
-                            AdtPlugin.printToConsole(project, stdErr.toArray());
-                        }
-                    }
-                    return false;
-                }
-            } else if (returnCode != 0) {
-                // no stderr output but exec failed.
-                String msg = String.format(Messages.AIDL_Exec_Error_d, returnCode);
-
-                BaseProjectHelper.markResource(project, AdtConstants.MARKER_AIDL,
-                       msg, IMarker.SEVERITY_ERROR);
-
-                return false;
-            }
-        } catch (IOException e) {
-            // mark the project and exit
-            String msg = String.format(Messages.AIDL_Exec_Error_s, command[0]);
-            BaseProjectHelper.markResource(project, AdtConstants.MARKER_AIDL, msg,
-                    IMarker.SEVERITY_ERROR);
-            return false;
-        } catch (InterruptedException e) {
-            // mark the project and exit
-            String msg = String.format(Messages.AIDL_Exec_Error_s, command[0]);
-            BaseProjectHelper.markResource(project, AdtConstants.MARKER_AIDL, msg,
-                    IMarker.SEVERITY_ERROR);
-            return false;
-        }
-
-        return true;
-    }
-
-    /**
-     * Parse the output of aidl and mark the file with any errors.
-     * @param lines The output to parse.
-     * @param file The file to mark with error.
-     * @return true if the parsing failed, false if success.
-     */
-    private boolean parseAidlOutput(ArrayList<String> lines, IFile file) {
-        // nothing to parse? just return false;
-        if (lines.size() == 0) {
-            return false;
-        }
-
-        Matcher m;
-
-        for (int i = 0; i < lines.size(); i++) {
-            String p = lines.get(i);
-
-            m = sAidlPattern1.matcher(p);
-            if (m.matches()) {
-                // we can ignore group 1 which is the location since we already
-                // have a IFile object representing the aidl file.
-                String lineStr = m.group(2);
-                String msg = m.group(3);
-
-                // get the line number
-                int line = 0;
-                try {
-                    line = Integer.parseInt(lineStr);
-                } catch (NumberFormatException e) {
-                    // looks like the string we extracted wasn't a valid
-                    // file number. Parsing failed and we return true
-                    return true;
-                }
-
-                // mark the file
-                BaseProjectHelper.markResource(file, AdtConstants.MARKER_AIDL, msg, line,
-                        IMarker.SEVERITY_ERROR);
-
-                // success, go to the next line
-                continue;
-            }
-
-            // invalid line format, flag as error, and bail
-            return true;
-        }
-
-        return false;
-    }
-
-    /**
-     * Returns the {@link IFile} handle to the destination file for a given aidl source file
-     * ({@link AidlData}).
-     * @param sourceFile The source file
-     * @param outputFolder the top level output folder (not including the package folders)
-     * @param createFolders whether or not the parent folder of the destination should be created
-     * if it does not exist.
-     * @param monitor the progress monitor
-     * @return the handle to the destination file.
-     * @throws CoreException
-     */
-    private IFile getAidlOutputFile(IFile sourceFile, IFolder outputFolder, boolean replaceExt,
-            boolean createFolders, IProgressMonitor monitor) throws CoreException {
-
-        IPath sourceFolderPath = getSourceFolderFor(sourceFile);
-
-        // this really shouldn't happen since the sourceFile must be in a source folder
-        // since it comes from the delta visitor
-        if (sourceFolderPath != null) {
-            // make a path to the source file relative to the source folder.
-            IPath relative = sourceFile.getFullPath().makeRelativeTo(sourceFolderPath);
-            // remove the file name. This is now the destination folder.
-            relative = relative.removeLastSegments(1);
-
-            // get an IFolder for this path.
-            IFolder destinationFolder = outputFolder.getFolder(relative);
-
-            // create it if needed.
-            if (destinationFolder.exists() == false && createFolders) {
-                createFolder(destinationFolder, monitor);
-            }
-
-            // Build the Java file name from the aidl name.
-            String javaName;
-            if (replaceExt) {
-                javaName = sourceFile.getName().replaceAll(
-                        AdtConstants.RE_AIDL_EXT, SdkConstants.DOT_JAVA);
-            } else {
-                javaName = sourceFile.getName();
-            }
-
-            // get the resource for the java file.
-            IFile javaFile = destinationFolder.getFile(javaName);
-            return javaFile;
-        }
-
-        return null;
-    }
-
-    /**
-     * Creates the destination folder. Because
-     * {@link IFolder#create(boolean, boolean, IProgressMonitor)} only works if the parent folder
-     * already exists, this goes and ensure that all the parent folders actually exist, or it
-     * creates them as well.
-     * @param destinationFolder The folder to create
-     * @param monitor the {@link IProgressMonitor},
-     * @throws CoreException
-     */
-    private void createFolder(IFolder destinationFolder, IProgressMonitor monitor)
-            throws CoreException {
-
-        // check the parent exist and create if necessary.
-        IContainer parent = destinationFolder.getParent();
-        if (parent.getType() == IResource.FOLDER && parent.exists() == false) {
-            createFolder((IFolder)parent, monitor);
-        }
-
-        // create the folder.
-        destinationFolder.create(true /*force*/, true /*local*/,
-                new SubProgressMonitor(monitor, 10));
-    }
-
-    /**
-     * Returns the type of the aidl file. Aidl files can either declare interfaces, or declare
-     * parcelables. This method will attempt to parse the file and return the type. If the type
-     * cannot be determined, then it will return {@link AidlType#UNKNOWN}.
-     * @param file The aidl file
-     * @return the type of the aidl.
-     */
-    private static AidlType getAidlType(IFile file) {
-        // At this time, parsing isn't available, so we return UNKNOWN. This will force
-        // a recompilation of all aidl file as soon as one is changed.
-        return AidlType.UNKNOWN;
-
-        // TODO: properly parse aidl file to determine type and generate dependency graphs.
-//
-//        String className = file.getName().substring(0,
-//                file.getName().length() - SdkConstants.DOT_AIDL.length());
-//
-//        InputStream input = file.getContents(true /* force*/);
-//        try {
-//            BufferedReader reader = new BufferedReader(new InputStreateader(input));
-//            String line;
-//            while ((line = reader.readLine()) != null) {
-//                if (line.length() == 0) {
-//                    continue;
-//                }
-//
-//                Matcher m = sParcelablePattern.matcher(line);
-//                if (m.matches() && m.group(1).equals(className)) {
-//                    return AidlType.PARCELABLE;
-//                }
-//
-//                m = sInterfacePattern.matcher(line);
-//                if (m.matches() && m.group(1).equals(className)) {
-//                    return AidlType.INTERFACE;
-//                }
-//            }
-//        } catch (IOException e) {
-//            throw new CoreException(new Status(IStatus.ERROR, AdtPlugin.PLUGIN_ID,
-//                    "Error parsing aidl file", e));
-//        } finally {
-//            try {
-//                input.close();
-//            } catch (IOException e) {
-//                throw new CoreException(new Status(IStatus.ERROR, AdtPlugin.PLUGIN_ID,
-//                        "Error parsing aidl file", e));
-//            }
-//        }
-//
-//        return AidlType.UNKNOWN;
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/build/BuildHelper.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/build/BuildHelper.java
deleted file mode 100644
index 78d9d94..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/build/BuildHelper.java
+++ /dev/null
@@ -1,1225 +0,0 @@
-/*
- * Copyright (C) 2010 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.build;
-
-import com.android.SdkConstants;
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-import com.android.ide.eclipse.adt.AdtConstants;
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.ide.eclipse.adt.AndroidPrintStream;
-import com.android.ide.eclipse.adt.internal.preferences.AdtPrefs;
-import com.android.ide.eclipse.adt.internal.preferences.AdtPrefs.BuildVerbosity;
-import com.android.ide.eclipse.adt.internal.project.BaseProjectHelper;
-import com.android.ide.eclipse.adt.internal.sdk.ProjectState;
-import com.android.ide.eclipse.adt.internal.sdk.Sdk;
-import com.android.prefs.AndroidLocation.AndroidLocationException;
-import com.android.sdklib.BuildToolInfo;
-import com.android.sdklib.IAndroidTarget;
-import com.android.sdklib.IAndroidTarget.IOptionalLibrary;
-import com.android.sdklib.build.ApkBuilder;
-import com.android.sdklib.build.ApkBuilder.JarStatus;
-import com.android.sdklib.build.ApkBuilder.SigningInfo;
-import com.android.sdklib.build.ApkCreationException;
-import com.android.sdklib.build.DuplicateFileException;
-import com.android.sdklib.build.RenderScriptProcessor;
-import com.android.sdklib.build.SealedApkException;
-import com.android.sdklib.internal.build.DebugKeyProvider;
-import com.android.sdklib.internal.build.DebugKeyProvider.KeytoolException;
-import com.android.utils.GrabProcessOutput;
-import com.android.utils.GrabProcessOutput.IProcessOutput;
-import com.android.utils.GrabProcessOutput.Wait;
-import com.google.common.base.Charsets;
-import com.google.common.hash.HashCode;
-import com.google.common.hash.HashFunction;
-import com.google.common.hash.Hashing;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IFolder;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IWorkspaceRoot;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.jdt.core.IClasspathContainer;
-import org.eclipse.jdt.core.IClasspathEntry;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.JavaCore;
-import org.eclipse.jdt.core.JavaModelException;
-import org.eclipse.jface.preference.IPreferenceStore;
-
-import java.io.File;
-import java.io.FileWriter;
-import java.io.IOException;
-import java.io.PrintStream;
-import java.security.PrivateKey;
-import java.security.cert.X509Certificate;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.TreeMap;
-
-/**
- * Helper with methods for the last 3 steps of the generation of an APK.
- *
- * {@link #packageResources(IFile, IProject[], String, int, String, String)} packages the
- * application resources using aapt into a zip file that is ready to be integrated into the apk.
- *
- * {@link #executeDx(IJavaProject, String, String, IJavaProject[])} will convert the Java byte
- * code into the Dalvik bytecode.
- *
- * {@link #finalPackage(String, String, String, boolean, IJavaProject, IProject[], IJavaProject[], String, boolean)}
- * will make the apk from all the previous components.
- *
- * This class only executes the 3 above actions. It does not handle the errors, and simply sends
- * them back as custom exceptions.
- *
- * Warnings are handled by the {@link ResourceMarker} interface.
- *
- * Console output (verbose and non verbose) is handled through the {@link AndroidPrintStream} passed
- * to the constructor.
- *
- */
-public class BuildHelper {
-
-    private static final String CONSOLE_PREFIX_DX = "Dx";   //$NON-NLS-1$
-    private final static String TEMP_PREFIX = "android_";   //$NON-NLS-1$
-
-    private static final String COMMAND_CRUNCH = "crunch";  //$NON-NLS-1$
-    private static final String COMMAND_PACKAGE = "package"; //$NON-NLS-1$
-
-    @NonNull
-    private final ProjectState mProjectState;
-    @NonNull
-    private final IProject mProject;
-    @NonNull
-    private final BuildToolInfo mBuildToolInfo;
-    @NonNull
-    private final AndroidPrintStream mOutStream;
-    @NonNull
-    private final AndroidPrintStream mErrStream;
-    private final boolean mForceJumbo;
-    private final boolean mDisableDexMerger;
-    private final boolean mVerbose;
-    private final boolean mDebugMode;
-
-    private final Set<String> mCompiledCodePaths = new HashSet<String>();
-
-    public static final boolean BENCHMARK_FLAG = false;
-    public static long sStartOverallTime = 0;
-    public static long sStartJavaCTime = 0;
-
-    private final static int MILLION = 1000000;
-    private String mProguardFile;
-
-    /**
-     * An object able to put a marker on a resource.
-     */
-    public interface ResourceMarker {
-        void setWarning(IResource resource, String message);
-    }
-
-    /**
-     * Creates a new post-compiler helper
-     * @param project
-     * @param outStream
-     * @param errStream
-     * @param debugMode whether this is a debug build
-     * @param verbose
-     * @throws CoreException
-     */
-    public BuildHelper(@NonNull ProjectState projectState,
-            @NonNull BuildToolInfo buildToolInfo,
-            @NonNull AndroidPrintStream outStream,
-            @NonNull AndroidPrintStream errStream,
-            boolean forceJumbo, boolean disableDexMerger, boolean debugMode,
-            boolean verbose, ResourceMarker resMarker) throws CoreException {
-        mProjectState = projectState;
-        mProject = projectState.getProject();
-        mBuildToolInfo = buildToolInfo;
-        mOutStream = outStream;
-        mErrStream = errStream;
-        mDebugMode = debugMode;
-        mVerbose = verbose;
-        mForceJumbo = forceJumbo;
-        mDisableDexMerger = disableDexMerger;
-
-        gatherPaths(resMarker);
-    }
-
-    public void updateCrunchCache() throws AaptExecException, AaptResultException {
-        // Benchmarking start
-        long startCrunchTime = 0;
-        if (BENCHMARK_FLAG) {
-            String msg = "BENCHMARK ADT: Starting Initial Packaging (.ap_)"; //$NON-NLS-1$
-            AdtPlugin.printBuildToConsole(BuildVerbosity.ALWAYS, mProject, msg);
-            startCrunchTime = System.nanoTime();
-        }
-
-        // Get the resources folder to crunch from
-        IFolder resFolder = mProject.getFolder(AdtConstants.WS_RESOURCES);
-        List<String> resPaths = new ArrayList<String>();
-        resPaths.add(resFolder.getLocation().toOSString());
-
-        // Get the output folder where the cache is stored.
-        IFolder binFolder = BaseProjectHelper.getAndroidOutputFolder(mProject);
-        IFolder cacheFolder = binFolder.getFolder(AdtConstants.WS_BIN_RELATIVE_CRUNCHCACHE);
-        String cachePath = cacheFolder.getLocation().toOSString();
-
-        /* For crunching, we don't need the osManifestPath, osAssetsPath, or the configFilter
-         * parameters for executeAapt
-         */
-        executeAapt(COMMAND_CRUNCH, "", resPaths, "", cachePath, "", 0);
-
-        // Benchmarking end
-        if (BENCHMARK_FLAG) {
-            String msg = "BENCHMARK ADT: Ending Initial Package (.ap_). \nTime Elapsed: " //$NON-NLS-1$
-                            + ((System.nanoTime() - startCrunchTime)/MILLION) + "ms";     //$NON-NLS-1$
-            AdtPlugin.printBuildToConsole(BuildVerbosity.ALWAYS, mProject, msg);
-        }
-    }
-
-    /**
-     * Packages the resources of the projet into a .ap_ file.
-     * @param manifestFile the manifest of the project.
-     * @param libProjects the list of library projects that this project depends on.
-     * @param resFilter an optional resource filter to be used with the -c option of aapt. If null
-     * no filters are used.
-     * @param versionCode an optional versionCode to be inserted in the manifest during packaging.
-     * If the value is <=0, no values are inserted.
-     * @param outputFolder where to write the resource ap_ file.
-     * @param outputFilename the name of the resource ap_ file.
-     * @throws AaptExecException
-     * @throws AaptResultException
-     */
-    public void packageResources(IFile manifestFile, List<IProject> libProjects, String resFilter,
-            int versionCode, String outputFolder, String outputFilename)
-            throws AaptExecException, AaptResultException {
-
-        // Benchmarking start
-        long startPackageTime = 0;
-        if (BENCHMARK_FLAG) {
-            String msg = "BENCHMARK ADT: Starting Initial Packaging (.ap_)";    //$NON-NLS-1$
-            AdtPlugin.printBuildToConsole(BuildVerbosity.ALWAYS, mProject, msg);
-            startPackageTime = System.nanoTime();
-        }
-
-        // need to figure out some path before we can execute aapt;
-        IFolder binFolder = BaseProjectHelper.getAndroidOutputFolder(mProject);
-
-        // get the cache folder
-        IFolder cacheFolder = binFolder.getFolder(AdtConstants.WS_BIN_RELATIVE_CRUNCHCACHE);
-
-        // get the BC folder
-        IFolder bcFolder = binFolder.getFolder(AdtConstants.WS_BIN_RELATIVE_BC);
-
-        // get the resource folder
-        IFolder resFolder = mProject.getFolder(AdtConstants.WS_RESOURCES);
-
-        // and the assets folder
-        IFolder assetsFolder = mProject.getFolder(AdtConstants.WS_ASSETS);
-
-        // we need to make sure this one exists.
-        if (assetsFolder.exists() == false) {
-            assetsFolder = null;
-        }
-
-        // list of res folder (main project + maybe libraries)
-        ArrayList<String> osResPaths = new ArrayList<String>();
-
-        IPath resLocation = resFolder.getLocation();
-        IPath manifestLocation = manifestFile.getLocation();
-
-        if (resLocation != null && manifestLocation != null) {
-
-            // png cache folder first.
-            addFolderToList(osResPaths, cacheFolder);
-            addFolderToList(osResPaths, bcFolder);
-
-            // regular res folder next.
-            osResPaths.add(resLocation.toOSString());
-
-            // then libraries
-            if (libProjects != null) {
-                for (IProject lib : libProjects) {
-                    // png cache folder first
-                    IFolder libBinFolder = BaseProjectHelper.getAndroidOutputFolder(lib);
-
-                    IFolder libCacheFolder = libBinFolder.getFolder(AdtConstants.WS_BIN_RELATIVE_CRUNCHCACHE);
-                    addFolderToList(osResPaths, libCacheFolder);
-
-                    IFolder libBcFolder = libBinFolder.getFolder(AdtConstants.WS_BIN_RELATIVE_BC);
-                    addFolderToList(osResPaths, libBcFolder);
-
-                    // regular res folder next.
-                    IFolder libResFolder = lib.getFolder(AdtConstants.WS_RESOURCES);
-                    addFolderToList(osResPaths, libResFolder);
-                }
-            }
-
-            String osManifestPath = manifestLocation.toOSString();
-
-            String osAssetsPath = null;
-            if (assetsFolder != null) {
-                osAssetsPath = assetsFolder.getLocation().toOSString();
-            }
-
-            // build the default resource package
-            executeAapt(COMMAND_PACKAGE, osManifestPath, osResPaths, osAssetsPath,
-                    outputFolder + File.separator + outputFilename, resFilter,
-                    versionCode);
-        }
-
-        // Benchmarking end
-        if (BENCHMARK_FLAG) {
-            String msg = "BENCHMARK ADT: Ending Initial Package (.ap_). \nTime Elapsed: " //$NON-NLS-1$
-                            + ((System.nanoTime() - startPackageTime)/MILLION) + "ms";    //$NON-NLS-1$
-            AdtPlugin.printBuildToConsole(BuildVerbosity.ALWAYS, mProject, msg);
-        }
-    }
-
-    /**
-     * Adds os path of a folder to a list only if the folder actually exists.
-     * @param pathList
-     * @param folder
-     */
-    private void addFolderToList(List<String> pathList, IFolder folder) {
-        // use a File instead of the IFolder API to ignore workspace refresh issue.
-        File testFile = new File(folder.getLocation().toOSString());
-        if (testFile.isDirectory()) {
-            pathList.add(testFile.getAbsolutePath());
-        }
-    }
-
-    /**
-     * Makes a final package signed with the debug key.
-     *
-     * Packages the dex files, the temporary resource file into the final package file.
-     *
-     * Whether the package is a debug package is controlled with the <var>debugMode</var> parameter
-     * in {@link #PostCompilerHelper(IProject, PrintStream, PrintStream, boolean, boolean)}
-     *
-     * @param intermediateApk The path to the temporary resource file.
-     * @param dex The path to the dex file.
-     * @param output The path to the final package file to create.
-     * @param libProjects an optional list of library projects (can be null)
-     * @return true if success, false otherwise.
-     * @throws ApkCreationException
-     * @throws AndroidLocationException
-     * @throws KeytoolException
-     * @throws NativeLibInJarException
-     * @throws CoreException
-     * @throws DuplicateFileException
-     */
-    public void finalDebugPackage(String intermediateApk, String dex, String output,
-            List<IProject> libProjects, ResourceMarker resMarker)
-            throws ApkCreationException, KeytoolException, AndroidLocationException,
-            NativeLibInJarException, DuplicateFileException, CoreException {
-
-        AdtPlugin adt = AdtPlugin.getDefault();
-        if (adt == null) {
-            return;
-        }
-
-        // get the debug keystore to use.
-        IPreferenceStore store = adt.getPreferenceStore();
-        String keystoreOsPath = store.getString(AdtPrefs.PREFS_CUSTOM_DEBUG_KEYSTORE);
-        if (keystoreOsPath == null || new File(keystoreOsPath).isFile() == false) {
-            keystoreOsPath = DebugKeyProvider.getDefaultKeyStoreOsPath();
-            AdtPlugin.printBuildToConsole(BuildVerbosity.VERBOSE, mProject,
-                    Messages.ApkBuilder_Using_Default_Key);
-        } else {
-            AdtPlugin.printBuildToConsole(BuildVerbosity.VERBOSE, mProject,
-                    String.format(Messages.ApkBuilder_Using_s_To_Sign, keystoreOsPath));
-        }
-
-        // from the keystore, get the signing info
-        SigningInfo info = ApkBuilder.getDebugKey(keystoreOsPath, mVerbose ? mOutStream : null);
-
-        finalPackage(intermediateApk, dex, output, libProjects,
-                info != null ? info.key : null, info != null ? info.certificate : null, resMarker);
-    }
-
-    /**
-     * Makes the final package.
-     *
-     * Packages the dex files, the temporary resource file into the final package file.
-     *
-     * Whether the package is a debug package is controlled with the <var>debugMode</var> parameter
-     * in {@link #PostCompilerHelper(IProject, PrintStream, PrintStream, boolean, boolean)}
-     *
-     * @param intermediateApk The path to the temporary resource file.
-     * @param dex The path to the dex file.
-     * @param output The path to the final package file to create.
-     * @param debugSign whether the apk must be signed with the debug key.
-     * @param libProjects an optional list of library projects (can be null)
-     * @param abiFilter an optional filter. If not null, then only the matching ABI is included in
-     * the final archive
-     * @return true if success, false otherwise.
-     * @throws NativeLibInJarException
-     * @throws ApkCreationException
-     * @throws CoreException
-     * @throws DuplicateFileException
-     */
-    public void finalPackage(String intermediateApk, String dex, String output,
-            List<IProject> libProjects,
-            PrivateKey key, X509Certificate certificate, ResourceMarker resMarker)
-            throws NativeLibInJarException, ApkCreationException, DuplicateFileException,
-            CoreException {
-
-        try {
-            ApkBuilder apkBuilder = new ApkBuilder(output, intermediateApk, dex,
-                    key, certificate,
-                    mVerbose ? mOutStream: null);
-            apkBuilder.setDebugMode(mDebugMode);
-
-            // either use the full compiled code paths or just the proguard file
-            // if present
-            Collection<String> pathsCollection = mCompiledCodePaths;
-            if (mProguardFile != null) {
-                pathsCollection = Collections.singletonList(mProguardFile);
-                mProguardFile = null;
-            }
-
-            // Now we write the standard resources from all the output paths.
-            for (String path : pathsCollection) {
-                File file = new File(path);
-                if (file.isFile()) {
-                    JarStatus jarStatus = apkBuilder.addResourcesFromJar(file);
-
-                    // check if we found native libraries in the external library. This
-                    // constitutes an error or warning depending on if they are in lib/
-                    if (jarStatus.getNativeLibs().size() > 0) {
-                        String libName = file.getName();
-
-                        String msg = String.format(
-                                "Native libraries detected in '%1$s'. See console for more information.",
-                                libName);
-
-                        ArrayList<String> consoleMsgs = new ArrayList<String>();
-
-                        consoleMsgs.add(String.format(
-                                "The library '%1$s' contains native libraries that will not run on the device.",
-                                libName));
-
-                        if (jarStatus.hasNativeLibsConflicts()) {
-                            consoleMsgs.add("Additionally some of those libraries will interfer with the installation of the application because of their location in lib/");
-                            consoleMsgs.add("lib/ is reserved for NDK libraries.");
-                        }
-
-                        consoleMsgs.add("The following libraries were found:");
-
-                        for (String lib : jarStatus.getNativeLibs()) {
-                            consoleMsgs.add(" - " + lib);
-                        }
-
-                        String[] consoleStrings = consoleMsgs.toArray(new String[consoleMsgs.size()]);
-
-                        // if there's a conflict or if the prefs force error on any native code in jar
-                        // files, throw an exception
-                        if (jarStatus.hasNativeLibsConflicts() ||
-                                AdtPrefs.getPrefs().getBuildForceErrorOnNativeLibInJar()) {
-                            throw new NativeLibInJarException(jarStatus, msg, libName, consoleStrings);
-                        } else {
-                            // otherwise, put a warning, and output to the console also.
-                            if (resMarker != null) {
-                                resMarker.setWarning(mProject, msg);
-                            }
-
-                            for (String string : consoleStrings) {
-                                mOutStream.println(string);
-                            }
-                        }
-                    }
-                } else if (file.isDirectory()) {
-                    // this is technically not a source folder (class folder instead) but since we
-                    // only care about Java resources (ie non class/java files) this will do the
-                    // same
-                    apkBuilder.addSourceFolder(file);
-                }
-            }
-
-            // now write the native libraries.
-            // First look if the lib folder is there.
-            IResource libFolder = mProject.findMember(SdkConstants.FD_NATIVE_LIBS);
-            if (libFolder != null && libFolder.exists() &&
-                    libFolder.getType() == IResource.FOLDER) {
-                // get a File for the folder.
-                apkBuilder.addNativeLibraries(libFolder.getLocation().toFile());
-            }
-
-            // next the native libraries for the renderscript support mode.
-            if (mProjectState.getRenderScriptSupportMode()) {
-                IFolder androidOutputFolder = BaseProjectHelper.getAndroidOutputFolder(mProject);
-                IResource rsLibFolder = androidOutputFolder.getFolder(
-                        AdtConstants.WS_BIN_RELATIVE_RS_LIBS);
-                File rsLibFolderFile = rsLibFolder.getLocation().toFile();
-                if (rsLibFolderFile.isDirectory()) {
-                    apkBuilder.addNativeLibraries(rsLibFolderFile);
-                }
-
-                File rsLibs = RenderScriptProcessor.getSupportNativeLibFolder(
-                        mBuildToolInfo.getLocation().getAbsolutePath());
-                if (rsLibs.isDirectory()) {
-                    apkBuilder.addNativeLibraries(rsLibs);
-                }
-            }
-
-            // write the native libraries for the library projects.
-            if (libProjects != null) {
-                for (IProject lib : libProjects) {
-                    libFolder = lib.findMember(SdkConstants.FD_NATIVE_LIBS);
-                    if (libFolder != null && libFolder.exists() &&
-                            libFolder.getType() == IResource.FOLDER) {
-                        apkBuilder.addNativeLibraries(libFolder.getLocation().toFile());
-                    }
-                }
-            }
-
-            // seal the APK.
-            apkBuilder.sealApk();
-        } catch (SealedApkException e) {
-            // this won't happen as we control when the apk is sealed.
-        }
-    }
-
-    public void setProguardOutput(String proguardFile) {
-        mProguardFile = proguardFile;
-    }
-
-    public Collection<String> getCompiledCodePaths() {
-        return mCompiledCodePaths;
-    }
-
-    public void runProguard(List<File> proguardConfigs, File inputJar, Collection<String> jarFiles,
-                            File obfuscatedJar, File logOutput)
-            throws ProguardResultException, ProguardExecException, IOException {
-        IAndroidTarget target = Sdk.getCurrent().getTarget(mProject);
-
-        // prepare the command line for proguard
-        List<String> command = new ArrayList<String>();
-        command.add(AdtPlugin.getOsAbsoluteProguard());
-
-        for (File configFile : proguardConfigs) {
-            command.add("-include"); //$NON-NLS-1$
-            command.add(quotePath(configFile.getAbsolutePath()));
-        }
-
-        command.add("-injars"); //$NON-NLS-1$
-        StringBuilder sb = new StringBuilder(quotePath(inputJar.getAbsolutePath()));
-        for (String jarFile : jarFiles) {
-            sb.append(File.pathSeparatorChar);
-            sb.append(quotePath(jarFile));
-        }
-        command.add(quoteWinArg(sb.toString()));
-
-        command.add("-outjars"); //$NON-NLS-1$
-        command.add(quotePath(obfuscatedJar.getAbsolutePath()));
-
-        command.add("-libraryjars"); //$NON-NLS-1$
-        sb = new StringBuilder(quotePath(target.getPath(IAndroidTarget.ANDROID_JAR)));
-        IOptionalLibrary[] libraries = target.getOptionalLibraries();
-        if (libraries != null) {
-            for (IOptionalLibrary lib : libraries) {
-                sb.append(File.pathSeparatorChar);
-                sb.append(quotePath(lib.getJarPath()));
-            }
-        }
-        command.add(quoteWinArg(sb.toString()));
-
-        if (logOutput != null) {
-            if (logOutput.isDirectory() == false) {
-                logOutput.mkdirs();
-            }
-
-            command.add("-dump");                                              //$NON-NLS-1$
-            command.add(new File(logOutput, "dump.txt").getAbsolutePath());    //$NON-NLS-1$
-
-            command.add("-printseeds");                                        //$NON-NLS-1$
-            command.add(new File(logOutput, "seeds.txt").getAbsolutePath());   //$NON-NLS-1$
-
-            command.add("-printusage");                                        //$NON-NLS-1$
-            command.add(new File(logOutput, "usage.txt").getAbsolutePath());   //$NON-NLS-1$
-
-            command.add("-printmapping");                                      //$NON-NLS-1$
-            command.add(new File(logOutput, "mapping.txt").getAbsolutePath()); //$NON-NLS-1$
-        }
-
-        String commandArray[] = null;
-
-        if (SdkConstants.currentPlatform() == SdkConstants.PLATFORM_WINDOWS) {
-            commandArray = createWindowsProguardConfig(command);
-        }
-
-        if (commandArray == null) {
-            // For Mac & Linux, use a regular command string array.
-            commandArray = command.toArray(new String[command.size()]);
-        }
-
-        // Define PROGUARD_HOME to point to $SDK/tools/proguard if it's not yet defined.
-        // The Mac/Linux proguard.sh can infer it correctly but not the proguard.bat one.
-        String[] envp = null;
-        Map<String, String> envMap = new TreeMap<String, String>(System.getenv());
-        if (!envMap.containsKey("PROGUARD_HOME")) {                                    //$NON-NLS-1$
-            envMap.put("PROGUARD_HOME", Sdk.getCurrent().getSdkOsLocation() +          //$NON-NLS-1$
-                                        SdkConstants.FD_TOOLS + File.separator +
-                                        SdkConstants.FD_PROGUARD);
-            envp = new String[envMap.size()];
-            int i = 0;
-            for (Map.Entry<String, String> entry : envMap.entrySet()) {
-                envp[i++] = String.format("%1$s=%2$s",                                 //$NON-NLS-1$
-                                          entry.getKey(),
-                                          entry.getValue());
-            }
-        }
-
-        if (AdtPrefs.getPrefs().getBuildVerbosity() == BuildVerbosity.VERBOSE) {
-            sb = new StringBuilder();
-            for (String c : commandArray) {
-                sb.append(c).append(' ');
-            }
-            AdtPlugin.printToConsole(mProject, sb.toString());
-        }
-
-        // launch
-        int execError = 1;
-        try {
-            // launch the command line process
-            Process process = Runtime.getRuntime().exec(commandArray, envp);
-
-            // list to store each line of stderr
-            ArrayList<String> results = new ArrayList<String>();
-
-            // get the output and return code from the process
-            execError = grabProcessOutput(mProject, process, results);
-
-            if (mVerbose) {
-                for (String resultString : results) {
-                    mOutStream.println(resultString);
-                }
-            }
-
-            if (execError != 0) {
-                throw new ProguardResultException(execError,
-                        results.toArray(new String[results.size()]));
-            }
-
-        } catch (IOException e) {
-            String msg = String.format(Messages.Proguard_Exec_Error, commandArray[0]);
-            throw new ProguardExecException(msg, e);
-        } catch (InterruptedException e) {
-            String msg = String.format(Messages.Proguard_Exec_Error, commandArray[0]);
-            throw new ProguardExecException(msg, e);
-        }
-    }
-
-    /**
-     * For tools R8 up to R11, the proguard.bat launcher on Windows only accepts
-     * arguments %1..%9. Since we generally have about 15 arguments, we were working
-     * around this by generating a temporary config file for proguard and then using
-     * that.
-     * Starting with tools R12, the proguard.bat launcher has been fixed to take
-     * all arguments using %* so we no longer need this hack.
-     *
-     * @param command
-     * @return
-     * @throws IOException
-     */
-    private String[] createWindowsProguardConfig(List<String> command) throws IOException {
-
-        // Arg 0 is the proguard.bat path and arg 1 is the user config file
-        String launcher = AdtPlugin.readFile(new File(command.get(0)));
-        if (launcher.contains("%*")) {                                      //$NON-NLS-1$
-            // This is the launcher from Tools R12. Don't work around it.
-            return null;
-        }
-
-        // On Windows, proguard.bat can only pass %1...%9 to the java -jar proguard.jar
-        // call, but we have at least 15 arguments here so some get dropped silently
-        // and quoting is a big issue. So instead we'll work around that by writing
-        // all the arguments to a temporary config file.
-
-        String[] commandArray = new String[3];
-
-        commandArray[0] = command.get(0);
-        commandArray[1] = command.get(1);
-
-        // Write all the other arguments to a config file
-        File argsFile = File.createTempFile(TEMP_PREFIX, ".pro");           //$NON-NLS-1$
-        // TODO FIXME this may leave a lot of temp files around on a long session.
-        // Should have a better way to clean up e.g. before each build.
-        argsFile.deleteOnExit();
-
-        FileWriter fw = new FileWriter(argsFile);
-
-        for (int i = 2; i < command.size(); i++) {
-            String s = command.get(i);
-            fw.write(s);
-            fw.write(s.startsWith("-") ? ' ' : '\n');                       //$NON-NLS-1$
-        }
-
-        fw.close();
-
-        commandArray[2] = "@" + argsFile.getAbsolutePath();                 //$NON-NLS-1$
-        return commandArray;
-    }
-
-    /**
-     * Quotes a single path for proguard to deal with spaces.
-     *
-     * @param path The path to quote.
-     * @return The original path if it doesn't contain a space.
-     *   Or the original path surrounded by single quotes if it contains spaces.
-     */
-    private String quotePath(String path) {
-        if (path.indexOf(' ') != -1) {
-            path = '\'' + path + '\'';
-        }
-        return path;
-    }
-
-    /**
-     * Quotes a compound proguard argument to deal with spaces.
-     * <p/>
-     * Proguard takes multi-path arguments such as "path1;path2" for some options.
-     * When the {@link #quotePath} methods adds quotes for such a path if it contains spaces,
-     * the proguard shell wrapper will absorb the quotes, so we need to quote around the
-     * quotes.
-     *
-     * @param path The path to quote.
-     * @return The original path if it doesn't contain a single quote.
-     *   Or on Windows the original path surrounded by double quotes if it contains a quote.
-     */
-    private String quoteWinArg(String path) {
-        if (path.indexOf('\'') != -1 &&
-                SdkConstants.currentPlatform() == SdkConstants.PLATFORM_WINDOWS) {
-            path = '"' + path + '"';
-        }
-        return path;
-    }
-
-
-    /**
-     * Execute the Dx tool for dalvik code conversion.
-     * @param javaProject The java project
-     * @param inputPaths the input paths for DX
-     * @param osOutFilePath the path of the dex file to create.
-     *
-     * @throws CoreException
-     * @throws DexException
-     */
-    public void executeDx(IJavaProject javaProject, Collection<String> inputPaths,
-            String osOutFilePath)
-            throws CoreException, DexException {
-
-        // get the dex wrapper
-        Sdk sdk = Sdk.getCurrent();
-        DexWrapper wrapper = sdk.getDexWrapper(mBuildToolInfo);
-
-        if (wrapper == null) {
-            throw new CoreException(new Status(IStatus.ERROR, AdtPlugin.PLUGIN_ID,
-                    Messages.ApkBuilder_UnableBuild_Dex_Not_loaded));
-        }
-
-        try {
-            // set a temporary prefix on the print streams.
-            mOutStream.setPrefix(CONSOLE_PREFIX_DX);
-            mErrStream.setPrefix(CONSOLE_PREFIX_DX);
-
-            IFolder binFolder = BaseProjectHelper.getAndroidOutputFolder(javaProject.getProject());
-            File binFile = binFolder.getLocation().toFile();
-            File dexedLibs = new File(binFile, "dexedLibs");
-            if (dexedLibs.exists() == false) {
-                dexedLibs.mkdir();
-            }
-
-            // replace the libs by their dexed versions (dexing them if needed.)
-            List<String> finalInputPaths = new ArrayList<String>(inputPaths.size());
-            if (mDisableDexMerger || inputPaths.size() == 1) {
-                // only one input, no need to put a pre-dexed version, even if this path is
-                // just a jar file (case for proguard'ed builds)
-                finalInputPaths.addAll(inputPaths);
-            } else {
-
-                for (String input : inputPaths) {
-                    File inputFile = new File(input);
-                    if (inputFile.isDirectory()) {
-                        finalInputPaths.add(input);
-                    } else if (inputFile.isFile()) {
-                        String fileName = getDexFileName(inputFile);
-
-                        File dexedLib = new File(dexedLibs, fileName);
-                        String dexedLibPath = dexedLib.getAbsolutePath();
-
-                        if (dexedLib.isFile() == false ||
-                                dexedLib.lastModified() < inputFile.lastModified()) {
-
-                            if (mVerbose) {
-                                mOutStream.println(
-                                        String.format("Pre-Dexing %1$s -> %2$s", input, fileName));
-                            }
-
-                            if (dexedLib.isFile()) {
-                                dexedLib.delete();
-                            }
-
-                            int res = wrapper.run(dexedLibPath, Collections.singleton(input),
-                                    mForceJumbo, mVerbose, mOutStream, mErrStream);
-
-                            if (res != 0) {
-                                // output error message and mark the project.
-                                String message = String.format(Messages.Dalvik_Error_d, res);
-                                throw new DexException(message);
-                            }
-                        } else {
-                            if (mVerbose) {
-                                mOutStream.println(
-                                        String.format("Using Pre-Dexed %1$s <- %2$s",
-                                                fileName, input));
-                            }
-                        }
-
-                        finalInputPaths.add(dexedLibPath);
-                    }
-                }
-            }
-
-            if (mVerbose) {
-                for (String input : finalInputPaths) {
-                    mOutStream.println("Input: " + input);
-                }
-            }
-
-            int res = wrapper.run(osOutFilePath,
-                    finalInputPaths,
-                    mForceJumbo,
-                    mVerbose,
-                    mOutStream, mErrStream);
-
-            mOutStream.setPrefix(null);
-            mErrStream.setPrefix(null);
-
-            if (res != 0) {
-                // output error message and marker the project.
-                String message = String.format(Messages.Dalvik_Error_d, res);
-                throw new DexException(message);
-            }
-        } catch (DexException e) {
-            throw e;
-        } catch (Throwable t) {
-            String message = t.getMessage();
-            if (message == null) {
-                message = t.getClass().getCanonicalName();
-            }
-            message = String.format(Messages.Dalvik_Error_s, message);
-
-            throw new DexException(message, t);
-        }
-    }
-
-    private String getDexFileName(File inputFile) {
-        // get the filename
-        String name = inputFile.getName();
-        // remove the extension
-        int pos = name.lastIndexOf('.');
-        if (pos != -1) {
-            name = name.substring(0, pos);
-        }
-
-        // add a hash of the original file path
-        HashFunction hashFunction = Hashing.md5();
-        HashCode hashCode = hashFunction.hashString(inputFile.getAbsolutePath(), Charsets.UTF_8);
-
-        return name + "-" + hashCode.toString() + ".jar";
-    }
-
-    /**
-     * Executes aapt. If any error happen, files or the project will be marked.
-     * @param command The command for aapt to execute. Currently supported: package and crunch
-     * @param osManifestPath The path to the manifest file
-     * @param osResPath The path to the res folder
-     * @param osAssetsPath The path to the assets folder. This can be null.
-     * @param osOutFilePath The path to the temporary resource file to create,
-     *   or in the case of crunching the path to the cache to create/update.
-     * @param configFilter The configuration filter for the resources to include
-     * (used with -c option, for example "port,en,fr" to include portrait, English and French
-     * resources.)
-     * @param versionCode optional version code to insert in the manifest during packaging. If <=0
-     * then no value is inserted
-     * @throws AaptExecException
-     * @throws AaptResultException
-     */
-    private void executeAapt(String aaptCommand, String osManifestPath,
-            List<String> osResPaths, String osAssetsPath, String osOutFilePath,
-            String configFilter, int versionCode) throws AaptExecException, AaptResultException {
-        IAndroidTarget target = Sdk.getCurrent().getTarget(mProject);
-
-        String aapt = mBuildToolInfo.getPath(BuildToolInfo.PathId.AAPT);
-
-        // Create the command line.
-        ArrayList<String> commandArray = new ArrayList<String>();
-        commandArray.add(aapt);
-        commandArray.add(aaptCommand);
-        if (AdtPrefs.getPrefs().getBuildVerbosity() == BuildVerbosity.VERBOSE) {
-            commandArray.add("-v"); //$NON-NLS-1$
-        }
-
-        // Common to all commands
-        for (String path : osResPaths) {
-            commandArray.add("-S"); //$NON-NLS-1$
-            commandArray.add(path);
-        }
-
-        if (aaptCommand.equals(COMMAND_PACKAGE)) {
-            commandArray.add("-f");          //$NON-NLS-1$
-            commandArray.add("--no-crunch"); //$NON-NLS-1$
-
-            // if more than one res, this means there's a library (or more) and we need
-            // to activate the auto-add-overlay
-            if (osResPaths.size() > 1) {
-                commandArray.add("--auto-add-overlay"); //$NON-NLS-1$
-            }
-
-            if (mDebugMode) {
-                commandArray.add("--debug-mode"); //$NON-NLS-1$
-            }
-
-            if (versionCode > 0) {
-                commandArray.add("--version-code"); //$NON-NLS-1$
-                commandArray.add(Integer.toString(versionCode));
-            }
-
-            if (configFilter != null) {
-                commandArray.add("-c"); //$NON-NLS-1$
-                commandArray.add(configFilter);
-            }
-
-            // never compress apks.
-            commandArray.add("-0");
-            commandArray.add("apk");
-
-            commandArray.add("-M"); //$NON-NLS-1$
-            commandArray.add(osManifestPath);
-
-            if (osAssetsPath != null) {
-                commandArray.add("-A"); //$NON-NLS-1$
-                commandArray.add(osAssetsPath);
-            }
-
-            commandArray.add("-I"); //$NON-NLS-1$
-            commandArray.add(target.getPath(IAndroidTarget.ANDROID_JAR));
-
-            commandArray.add("-F"); //$NON-NLS-1$
-            commandArray.add(osOutFilePath);
-        } else if (aaptCommand.equals(COMMAND_CRUNCH)) {
-            commandArray.add("-C"); //$NON-NLS-1$
-            commandArray.add(osOutFilePath);
-        }
-
-        String command[] = commandArray.toArray(
-                new String[commandArray.size()]);
-
-        if (AdtPrefs.getPrefs().getBuildVerbosity() == BuildVerbosity.VERBOSE) {
-            StringBuilder sb = new StringBuilder();
-            for (String c : command) {
-                sb.append(c);
-                sb.append(' ');
-            }
-            AdtPlugin.printToConsole(mProject, sb.toString());
-        }
-
-        // Benchmarking start
-        long startAaptTime = 0;
-        if (BENCHMARK_FLAG) {
-            String msg = "BENCHMARK ADT: Starting " + aaptCommand  //$NON-NLS-1$
-                         + " call to Aapt";                        //$NON-NLS-1$
-            AdtPlugin.printBuildToConsole(BuildVerbosity.ALWAYS, mProject, msg);
-            startAaptTime = System.nanoTime();
-        }
-
-        // launch
-        try {
-            // launch the command line process
-            Process process = Runtime.getRuntime().exec(command);
-
-            // list to store each line of stderr
-            ArrayList<String> stdErr = new ArrayList<String>();
-
-            // get the output and return code from the process
-            int returnCode = grabProcessOutput(mProject, process, stdErr);
-
-            if (mVerbose) {
-                for (String stdErrString : stdErr) {
-                    mOutStream.println(stdErrString);
-                }
-            }
-            if (returnCode != 0) {
-                throw new AaptResultException(returnCode,
-                        stdErr.toArray(new String[stdErr.size()]));
-            }
-        } catch (IOException e) {
-            String msg = String.format(Messages.AAPT_Exec_Error_s, command[0]);
-            throw new AaptExecException(msg, e);
-        } catch (InterruptedException e) {
-            String msg = String.format(Messages.AAPT_Exec_Error_s, command[0]);
-            throw new AaptExecException(msg, e);
-        }
-
-        // Benchmarking end
-        if (BENCHMARK_FLAG) {
-            String msg = "BENCHMARK ADT: Ending " + aaptCommand                  //$NON-NLS-1$
-                         + " call to Aapt.\nBENCHMARK ADT: Time Elapsed: "       //$NON-NLS-1$
-                         + ((System.nanoTime() - startAaptTime)/MILLION) + "ms"; //$NON-NLS-1$
-            AdtPlugin.printBuildToConsole(BuildVerbosity.ALWAYS, mProject, msg);
-        }
-    }
-
-    /**
-     * Computes all the project output and dependencies that must go into building the apk.
-     *
-     * @param resMarker
-     * @throws CoreException
-     */
-    private void gatherPaths(ResourceMarker resMarker)
-            throws CoreException {
-        IWorkspaceRoot wsRoot = ResourcesPlugin.getWorkspace().getRoot();
-
-        // get a java project for the project.
-        IJavaProject javaProject = JavaCore.create(mProject);
-
-
-        // get the output of the main project
-        IPath path = javaProject.getOutputLocation();
-        IResource outputResource = wsRoot.findMember(path);
-        if (outputResource != null && outputResource.getType() == IResource.FOLDER) {
-            mCompiledCodePaths.add(outputResource.getLocation().toOSString());
-        }
-
-        // we could use IJavaProject.getResolvedClasspath directly, but we actually
-        // want to see the containers themselves.
-        IClasspathEntry[] classpaths = javaProject.readRawClasspath();
-        if (classpaths != null) {
-            for (IClasspathEntry e : classpaths) {
-                // ignore non exported entries, unless they're in the DEPEDENCIES container,
-                // in which case we always want it (there may be some older projects that
-                // have it as non exported).
-                if (e.isExported() ||
-                        (e.getEntryKind() == IClasspathEntry.CPE_CONTAINER &&
-                         e.getPath().toString().equals(AdtConstants.CONTAINER_DEPENDENCIES))) {
-                    handleCPE(e, javaProject, wsRoot, resMarker);
-                }
-            }
-        }
-    }
-
-    private void handleCPE(IClasspathEntry entry, IJavaProject javaProject,
-            IWorkspaceRoot wsRoot, ResourceMarker resMarker) {
-
-        // if this is a classpath variable reference, we resolve it.
-        if (entry.getEntryKind() == IClasspathEntry.CPE_VARIABLE) {
-            entry = JavaCore.getResolvedClasspathEntry(entry);
-        }
-
-        if (entry.getEntryKind() == IClasspathEntry.CPE_PROJECT) {
-            IProject refProject = wsRoot.getProject(entry.getPath().lastSegment());
-            try {
-                // ignore if it's an Android project, or if it's not a Java Project
-                if (refProject.hasNature(JavaCore.NATURE_ID) &&
-                        refProject.hasNature(AdtConstants.NATURE_DEFAULT) == false) {
-                    IJavaProject refJavaProject = JavaCore.create(refProject);
-
-                    // get the output folder
-                    IPath path = refJavaProject.getOutputLocation();
-                    IResource outputResource = wsRoot.findMember(path);
-                    if (outputResource != null && outputResource.getType() == IResource.FOLDER) {
-                        mCompiledCodePaths.add(outputResource.getLocation().toOSString());
-                    }
-                }
-            } catch (CoreException exception) {
-                // can't query the project nature? ignore
-            }
-
-        } else if (entry.getEntryKind() == IClasspathEntry.CPE_LIBRARY) {
-            handleClasspathLibrary(entry, wsRoot, resMarker);
-        } else if (entry.getEntryKind() == IClasspathEntry.CPE_CONTAINER) {
-            // get the container
-            try {
-                IClasspathContainer container = JavaCore.getClasspathContainer(
-                        entry.getPath(), javaProject);
-                // ignore the system and default_system types as they represent
-                // libraries that are part of the runtime.
-                if (container != null && container.getKind() == IClasspathContainer.K_APPLICATION) {
-                    IClasspathEntry[] entries = container.getClasspathEntries();
-                    for (IClasspathEntry cpe : entries) {
-                        handleCPE(cpe, javaProject, wsRoot, resMarker);
-                    }
-                }
-            } catch (JavaModelException jme) {
-                // can't resolve the container? ignore it.
-                AdtPlugin.log(jme, "Failed to resolve ClasspathContainer: %s", entry.getPath());
-            }
-        }
-    }
-
-    private void handleClasspathLibrary(IClasspathEntry e, IWorkspaceRoot wsRoot,
-            ResourceMarker resMarker) {
-        // get the IPath
-        IPath path = e.getPath();
-
-        IResource resource = wsRoot.findMember(path);
-
-        if (resource != null && resource.getType() == IResource.PROJECT) {
-            // if it's a project we should just ignore it because it's going to be added
-            // later when we add all the referenced projects.
-
-        } else if (SdkConstants.EXT_JAR.equalsIgnoreCase(path.getFileExtension())) {
-            // case of a jar file (which could be relative to the workspace or a full path)
-            if (resource != null && resource.exists() &&
-                    resource.getType() == IResource.FILE) {
-                mCompiledCodePaths.add(resource.getLocation().toOSString());
-            } else {
-                // if the jar path doesn't match a workspace resource,
-                // then we get an OSString and check if this links to a valid file.
-                String osFullPath = path.toOSString();
-
-                File f = new File(osFullPath);
-                if (f.isFile()) {
-                    mCompiledCodePaths.add(osFullPath);
-                } else {
-                    String message = String.format( Messages.Couldnt_Locate_s_Error,
-                            path);
-                    // always output to the console
-                    mOutStream.println(message);
-
-                    // put a marker
-                    if (resMarker != null) {
-                        resMarker.setWarning(mProject, message);
-                    }
-                }
-            }
-        } else {
-            // this can be the case for a class folder.
-            if (resource != null && resource.exists() &&
-                    resource.getType() == IResource.FOLDER) {
-                mCompiledCodePaths.add(resource.getLocation().toOSString());
-            } else {
-                // if the path doesn't match a workspace resource,
-                // then we get an OSString and check if this links to a valid folder.
-                String osFullPath = path.toOSString();
-
-                File f = new File(osFullPath);
-                if (f.isDirectory()) {
-                    mCompiledCodePaths.add(osFullPath);
-                }
-            }
-        }
-    }
-
-    /**
-     * Checks a {@link IFile} to make sure it should be packaged as standard resources.
-     * @param file the IFile representing the file.
-     * @return true if the file should be packaged as standard java resources.
-     */
-    public static boolean checkFileForPackaging(IFile file) {
-        String name = file.getName();
-
-        String ext = file.getFileExtension();
-        return ApkBuilder.checkFileForPackaging(name, ext);
-    }
-
-    /**
-     * Checks whether an {@link IFolder} and its content is valid for packaging into the .apk as
-     * standard Java resource.
-     * @param folder the {@link IFolder} to check.
-     */
-    public static boolean checkFolderForPackaging(IFolder folder) {
-        String name = folder.getName();
-        return ApkBuilder.checkFolderForPackaging(name);
-    }
-
-    /**
-     * Returns a list of {@link IJavaProject} matching the provided {@link IProject} objects.
-     * @param projects the IProject objects.
-     * @return a new list object containing the IJavaProject object for the given IProject objects.
-     * @throws CoreException
-     */
-    public static List<IJavaProject> getJavaProjects(List<IProject> projects) throws CoreException {
-        ArrayList<IJavaProject> list = new ArrayList<IJavaProject>();
-
-        for (IProject p : projects) {
-            if (p.isOpen() && p.hasNature(JavaCore.NATURE_ID)) {
-
-                list.add(JavaCore.create(p));
-            }
-        }
-
-        return list;
-    }
-
-    /**
-     * Get the stderr output of a process and return when the process is done.
-     * @param process The process to get the output from
-     * @param stderr The array to store the stderr output
-     * @return the process return code.
-     * @throws InterruptedException
-     */
-    public final static int grabProcessOutput(
-            final IProject project,
-            final Process process,
-            final ArrayList<String> stderr)
-            throws InterruptedException {
-
-        return GrabProcessOutput.grabProcessOutput(
-                process,
-                Wait.WAIT_FOR_READERS, // we really want to make sure we get all the output!
-                new IProcessOutput() {
-
-                    @SuppressWarnings("unused")
-                    @Override
-                    public void out(@Nullable String line) {
-                        if (line != null) {
-                            // If benchmarking always print the lines that
-                            // correspond to benchmarking info returned by ADT
-                            if (BENCHMARK_FLAG && line.startsWith("BENCHMARK:")) {    //$NON-NLS-1$
-                                AdtPlugin.printBuildToConsole(BuildVerbosity.ALWAYS,
-                                        project, line);
-                            } else {
-                                AdtPlugin.printBuildToConsole(BuildVerbosity.VERBOSE,
-                                        project, line);
-                            }
-                        }
-                    }
-
-                    @Override
-                    public void err(@Nullable String line) {
-                        if (line != null) {
-                            stderr.add(line);
-                            if (BuildVerbosity.VERBOSE == AdtPrefs.getPrefs().getBuildVerbosity()) {
-                                AdtPlugin.printErrorToConsole(project, line);
-                            }
-                        }
-                    }
-                });
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/build/ConvertSwitchDialog.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/build/ConvertSwitchDialog.java
deleted file mode 100644
index 20bee5d..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/build/ConvertSwitchDialog.java
+++ /dev/null
@@ -1,144 +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.eclipse.adt.internal.build;
-
-import com.android.ide.eclipse.adt.internal.editors.IconFactory;
-
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.jface.dialogs.IMessageProvider;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.jface.dialogs.TitleAreaDialog;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Link;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.browser.IWebBrowser;
-
-import java.net.URL;
-
-/**
- * Dialog shown by the {@link ConvertSwitchQuickFixProcessor}. This is a custom
- * dialog rather than a plain {@link MessageDialog} such that we can show a link
- * and point to a web page for more info.
- */
-class ConvertSwitchDialog extends TitleAreaDialog implements SelectionListener {
-    /** URL containing more info */
-    private static final String URL = "http://tools.android.com/tips/non-constant-fields"; //$NON-NLS-1$
-
-    private final String mField;
-
-    private Link mLink;
-
-    /**
-     * Create the dialog.
-     * @param parentShell the parent shell
-     * @param field the field name we're warning about
-     */
-    public ConvertSwitchDialog(Shell parentShell, String field) {
-        super(parentShell);
-        mField = field;
-        Image image = IconFactory.getInstance().getIcon("android-64"); //$NON-NLS-1$
-        setTitleImage(image);
-    }
-
-    @Override
-    protected Control createDialogArea(Composite parent) {
-        String text = String.format(
-            "As of ADT 14, the resource fields (such as %1$s) are no longer constants " +
-            "when defined in library projects. This is necessary to make library " +
-            "projects reusable without recompiling them.\n" +
-            "\n" +
-            "One consequence of this is that you can no longer use the fields directly " +
-            "in switch statements. You must use an if-else chain instead.\n" +
-            "\n" +
-            "Eclipse can automatically convert from a switch statement to an if-else " +
-            "statement. Just place the caret on the switch keyword and invoke " +
-            "Quick Fix (Ctrl-1 on Windows and Linux, Cmd-1 on Mac), then select " +
-            "\"Convert 'switch' to 'if-else'\".\n" +
-            "\n" +
-            "For more information, see <a href=\"" + URL + "\">" + URL + "</a>",
-            mField);
-
-        Composite area = (Composite) super.createDialogArea(parent);
-        Composite container = new Composite(area, SWT.NONE);
-        container.setLayout(new GridLayout(1, false));
-        container.setLayoutData(new GridData(GridData.FILL_BOTH));
-
-        mLink = new Link(container, SWT.NONE);
-        mLink.setLayoutData(new GridData(SWT.LEFT, SWT.TOP, true, true, 1, 1));
-        mLink.setText(text);
-        mLink.addSelectionListener(this);
-
-        setMessage("Non-Constant Expressions: Migration Necessary", IMessageProvider.INFORMATION);
-
-        return area;
-    }
-
-    @Override
-    protected void createButtonsForButtonBar(Composite parent) {
-        createButton(parent, IDialogConstants.OK_ID, IDialogConstants.OK_LABEL, true);
-        createButton(parent, IDialogConstants.HELP_ID, IDialogConstants.HELP_LABEL, false);
-    }
-
-    @Override
-    protected Point getInitialSize() {
-        return new Point(500, 400);
-    }
-
-    private void showWebPage() {
-        try {
-            IWorkbench workbench = PlatformUI.getWorkbench();
-            IWebBrowser browser = workbench.getBrowserSupport().getExternalBrowser();
-            browser.openURL(new URL(URL));
-        } catch (Exception e) {
-            String message = String.format("Could not open browser. Vist\n%1$s\ninstead.",
-                    URL);
-            MessageDialog.openError(getShell(), "Browser Error", message);
-        }
-
-    }
-
-    @Override
-    protected void buttonPressed(int buttonId) {
-        if (buttonId == IDialogConstants.HELP_ID) {
-            showWebPage();
-        } else {
-            super.buttonPressed(buttonId);
-        }
-    }
-
-    // ---- Implements SelectionListener ----
-
-    @Override
-    public void widgetSelected(SelectionEvent e) {
-        if (e.getSource() == mLink) {
-            showWebPage();
-        }
-    }
-
-    @Override
-    public void widgetDefaultSelected(SelectionEvent e) {
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/build/ConvertSwitchQuickFixProcessor.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/build/ConvertSwitchQuickFixProcessor.java
deleted file mode 100644
index a99dc76..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/build/ConvertSwitchQuickFixProcessor.java
+++ /dev/null
@@ -1,224 +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.eclipse.adt.internal.build;
-
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.ide.eclipse.adt.AdtUtils;
-
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.jdt.core.IBuffer;
-import org.eclipse.jdt.core.ICompilationUnit;
-import org.eclipse.jdt.core.compiler.IProblem;
-import org.eclipse.jdt.core.dom.ASTNode;
-import org.eclipse.jdt.core.dom.QualifiedName;
-import org.eclipse.jdt.ui.text.java.IInvocationContext;
-import org.eclipse.jdt.ui.text.java.IJavaCompletionProposal;
-import org.eclipse.jdt.ui.text.java.IProblemLocation;
-import org.eclipse.jdt.ui.text.java.IQuickFixProcessor;
-import org.eclipse.jface.text.IDocument;
-import org.eclipse.jface.text.contentassist.IContextInformation;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.editors.text.TextFileDocumentProvider;
-import org.eclipse.ui.texteditor.IDocumentProvider;
-
-import java.util.List;
-
-/**
- * A quickfix processor which looks for "case expressions must be constant
- * expressions" errors, and if they apply to fields in a class named R, it
- * assumes this is code related to library projects that are no longer final and
- * will need to be rewritten to use if-else chains instead.
- */
-public class ConvertSwitchQuickFixProcessor implements IQuickFixProcessor {
-    /** Constructs a new {@link ConvertSwitchQuickFixProcessor} */
-    public ConvertSwitchQuickFixProcessor() {
-    }
-
-    @Override
-    public boolean hasCorrections(ICompilationUnit cu, int problemId) {
-        return problemId == IProblem.NonConstantExpression;
-    }
-
-    @Override
-    public IJavaCompletionProposal[] getCorrections(IInvocationContext context,
-            IProblemLocation[] location) throws CoreException {
-        if (location == null || location.length == 0) {
-            return null;
-        }
-        ASTNode coveringNode = context.getCoveringNode();
-        if (coveringNode == null) {
-            return null;
-        }
-
-        // Look up the fully qualified name of the non-constant expression, if any, and
-        // make sure it's R-something.
-        if (coveringNode.getNodeType() == ASTNode.SIMPLE_NAME) {
-            coveringNode = coveringNode.getParent();
-            if (coveringNode == null) {
-                return null;
-            }
-        }
-        if (coveringNode.getNodeType() != ASTNode.QUALIFIED_NAME) {
-            return null;
-        }
-        QualifiedName name = (QualifiedName) coveringNode;
-        if (!name.getFullyQualifiedName().startsWith("R.")) { //$NON-NLS-1$
-            return null;
-        }
-
-        IProblemLocation error = location[0];
-        int errorStart = error.getOffset();
-        int errorLength = error.getLength();
-        int caret = context.getSelectionOffset();
-
-        // Even though the hasCorrections() method above will return false for everything
-        // other than non-constant expression errors, it turns out this getCorrections()
-        // method will ALSO be called on lines where there is no such error. In particular,
-        // if you have an invalid cast expression like this:
-        //     Button button = findViewById(R.id.textView);
-        // then this method will be called, and the expression will pass all of the above
-        // checks. However, we -don't- want to show a migrate code suggestion in that case!
-        // Therefore, we'll need to check if we're *actually* on a line with the given
-        // problem.
-        //
-        // Unfortunately, we don't get passed the problemId again, and there's no access
-        // to it. So instead we'll need to look up the markers on the line, and see
-        // if we actually have a constant expression warning. This is not pretty!!
-
-        boolean foundError = false;
-        ICompilationUnit compilationUnit = context.getCompilationUnit();
-        IResource file = compilationUnit.getResource();
-        if (file != null) {
-            IDocumentProvider provider = new TextFileDocumentProvider();
-            try {
-                provider.connect(file);
-                IDocument document = provider.getDocument(file);
-                if (document != null) {
-                    List<IMarker> markers = AdtUtils.findMarkersOnLine(IMarker.PROBLEM,
-                            file, document, errorStart);
-                    for (IMarker marker : markers) {
-                        String message = marker.getAttribute(IMarker.MESSAGE, "");
-                        // There are no other attributes in the marker we can use to identify
-                        // the exact error, so we'll need to resort to the actual message
-                        // text even though that would not work if the messages had been
-                        // localized... This can also break if the error messages change. Yuck.
-                        if (message.contains("constant expressions")) { //$NON-NLS-1$
-                            foundError = true;
-                        }
-                    }
-                }
-            } catch (Exception e) {
-                AdtPlugin.log(e, "Can't validate error message in %1$s", file.getName());
-            } finally {
-                provider.disconnect(file);
-            }
-        }
-        if (!foundError) {
-            // Not a constant-expression warning, so do nothing
-            return null;
-        }
-
-        IBuffer buffer = compilationUnit.getBuffer();
-        boolean sameLine = false;
-        // See if the caret is on the same line as the error
-        if (caret <= errorStart) {
-            // Search backwards to beginning of line
-            for (int i = errorStart; i >= 0; i--) {
-                if (i <= caret) {
-                    sameLine = true;
-                    break;
-                }
-                char c = buffer.getChar(i);
-                if (c == '\n') {
-                    break;
-                }
-            }
-        } else {
-            // Search forwards to the end of the line
-            for (int i = errorStart + errorLength, n = buffer.getLength(); i < n; i++) {
-                if (i >= caret) {
-                    sameLine = true;
-                    break;
-                }
-                char c = buffer.getChar(i);
-                if (c == '\n') {
-                    break;
-                }
-            }
-        }
-
-        if (sameLine) {
-            String expression = buffer.getText(errorStart, errorLength);
-            return new IJavaCompletionProposal[] {
-                new MigrateProposal(expression)
-            };
-        }
-
-        return null;
-    }
-
-    /** Proposal for the quick fix which displays an explanation message to the user */
-    private class MigrateProposal implements IJavaCompletionProposal {
-        private String mExpression;
-
-        private MigrateProposal(String expression) {
-            mExpression = expression;
-        }
-
-        @Override
-        public void apply(IDocument document) {
-            Shell shell = AdtPlugin.getShell();
-            ConvertSwitchDialog dialog = new ConvertSwitchDialog(shell, mExpression);
-            dialog.open();
-        }
-
-        @Override
-        public Point getSelection(IDocument document) {
-            return null;
-        }
-
-        @Override
-        public String getAdditionalProposalInfo() {
-            return "As of ADT 14, resource fields cannot be used as switch cases. Invoke this " +
-                    "fix to get more information.";
-        }
-
-        @Override
-        public String getDisplayString() {
-            return "Migrate Android Code";
-        }
-
-        @Override
-        public Image getImage() {
-            return AdtPlugin.getAndroidLogo();
-        }
-
-        @Override
-        public IContextInformation getContextInformation() {
-            return null;
-        }
-
-        @Override
-        public int getRelevance() {
-            return 50;
-        }
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/build/DefaultSourceChangeHandler.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/build/DefaultSourceChangeHandler.java
deleted file mode 100644
index ea0d695..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/build/DefaultSourceChangeHandler.java
+++ /dev/null
@@ -1,105 +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.eclipse.adt.internal.build;
-
-import org.eclipse.core.resources.IContainer;
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IResourceDelta;
-
-import java.util.HashSet;
-import java.util.Set;
-
-/**
- * Base source change handler for the {@link SourceProcessor} classes.
- *
- * It can be used as is, as long as the matching {@link SourceProcessor} properly implements
- * its abstract methods, and the processor does not output resource files,
- * or can be extended to provide custom implementation for:
- * {@link #handleSourceFile(IFile, int)}
- * {@link #handleGeneratedFile(IFile, int)}
- * {@link #handleResourceFile(IFile, int)}
- * {@link #filterResourceFolder(IContainer)}
- *
- */
-public class DefaultSourceChangeHandler implements SourceChangeHandler {
-
-    private SourceProcessor mProcessor;
-
-    /** List of source files found that are modified or new. */
-    private final Set<IFile> mToCompile = new HashSet<IFile>();
-
-    /** List of source files that have been removed. */
-    private final Set<IFile> mRemoved = new HashSet<IFile>();
-
-    @Override
-    public boolean handleGeneratedFile(IFile file, int kind) {
-        if (kind == IResourceDelta.REMOVED || kind == IResourceDelta.CHANGED) {
-            IFile sourceFile = mProcessor.isOutput(file);
-            if (sourceFile != null) {
-                mToCompile.add(sourceFile);
-                return true;
-            }
-        }
-
-        return false;
-    }
-
-    @Override
-    public void handleSourceFile(IFile file, int kind) {
-        // first the file itself if this is a match for the processor's extension
-        if (mProcessor.getExtensions().contains(file.getFileExtension())) {
-            if (kind == IResourceDelta.REMOVED) {
-                mRemoved.add(file);
-            } else {
-                mToCompile.add(file);
-            }
-        }
-
-        // now the dependencies. In all case we compile the files that depend on the
-        // added/changed/removed file.
-        mToCompile.addAll(mProcessor.isDependency(file));
-    }
-
-    protected void addFileToCompile(IFile file) {
-        mToCompile.add(file);
-    }
-
-    Set<IFile> getFilesToCompile() {
-        return mToCompile;
-    }
-
-    protected void addRemovedFile(IFile file) {
-        mRemoved.add(file);
-    }
-
-    Set<IFile> getRemovedFiles() {
-        return mRemoved;
-    }
-
-    public void reset() {
-        mToCompile.clear();
-        mRemoved.clear();
-    }
-
-    protected SourceProcessor getProcessor() {
-        return mProcessor;
-    }
-
-    void init(SourceProcessor processor) {
-        mProcessor = processor;
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/build/DexException.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/build/DexException.java
deleted file mode 100644
index 032e5e6..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/build/DexException.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Copyright (C) 2010 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.build;
-
-/**
- * Exception throw when dx fails.
- *
- */
-public final class DexException extends Exception {
-    private static final long serialVersionUID = 1L;
-
-    DexException(String message) {
-        super(message);
-    }
-
-    DexException(String message, Throwable cause) {
-        super(message, cause);
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/build/DexWrapper.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/build/DexWrapper.java
deleted file mode 100644
index 3f88284..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/build/DexWrapper.java
+++ /dev/null
@@ -1,218 +0,0 @@
-/*
- * 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.build;
-
-import com.android.SdkConstants;
-import com.android.ide.eclipse.adt.AdtPlugin;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-
-import java.io.File;
-import java.io.PrintStream;
-import java.lang.reflect.Constructor;
-import java.lang.reflect.Field;
-import java.lang.reflect.Method;
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.net.URLClassLoader;
-import java.util.Collection;
-
-/**
- * Wrapper to access dx.jar through reflection.
- * <p/>Since there is no proper api to call the method in the dex library, this wrapper is going
- * to access it through reflection.
- */
-public final class DexWrapper {
-
-    private final static String DEX_MAIN = "com.android.dx.command.dexer.Main"; //$NON-NLS-1$
-    private final static String DEX_CONSOLE = "com.android.dx.command.DxConsole"; //$NON-NLS-1$
-    private final static String DEX_ARGS = "com.android.dx.command.dexer.Main$Arguments"; //$NON-NLS-1$
-
-    private final static String MAIN_RUN = "run"; //$NON-NLS-1$
-
-    private Method mRunMethod;
-
-    private Constructor<?> mArgConstructor;
-    private Field mArgOutName;
-    private Field mArgVerbose;
-    private Field mArgJarOutput;
-    private Field mArgFileNames;
-    private Field mArgForceJumbo;
-
-    private Field mConsoleOut;
-    private Field mConsoleErr;
-
-    /**
-     * Loads the dex library from a file path.
-     *
-     * The loaded library can be used via
-     * {@link DexWrapper#run(String, String[], boolean, PrintStream, PrintStream)}.
-     *
-     * @param osFilepath the location of the dx.jar file.
-     * @return an IStatus indicating the result of the load.
-     */
-    public synchronized IStatus loadDex(String osFilepath) {
-        try {
-            File f = new File(osFilepath);
-            if (f.isFile() == false) {
-                return new Status(IStatus.ERROR, AdtPlugin.PLUGIN_ID, String.format(
-                        Messages.DexWrapper_s_does_not_exists, osFilepath));
-            }
-            URL url = f.toURI().toURL();
-
-            @SuppressWarnings("resource")
-			URLClassLoader loader = new URLClassLoader(new URL[] { url },
-                    DexWrapper.class.getClassLoader());
-
-            // get the classes.
-            Class<?> mainClass = loader.loadClass(DEX_MAIN);
-            Class<?> consoleClass = loader.loadClass(DEX_CONSOLE);
-            Class<?> argClass = loader.loadClass(DEX_ARGS);
-
-            try {
-                // now get the fields/methods we need
-                mRunMethod = mainClass.getMethod(MAIN_RUN, argClass);
-
-                mArgConstructor = argClass.getConstructor();
-                mArgOutName = argClass.getField("outName"); //$NON-NLS-1$
-                mArgJarOutput = argClass.getField("jarOutput"); //$NON-NLS-1$
-                mArgFileNames = argClass.getField("fileNames"); //$NON-NLS-1$
-                mArgVerbose = argClass.getField("verbose"); //$NON-NLS-1$
-                mArgForceJumbo = argClass.getField("forceJumbo"); //$NON-NLS-1$
-
-                mConsoleOut = consoleClass.getField("out"); //$NON-NLS-1$
-                mConsoleErr = consoleClass.getField("err"); //$NON-NLS-1$
-
-            } catch (SecurityException e) {
-                return createErrorStatus(Messages.DexWrapper_SecuryEx_Unable_To_Find_API, e);
-            } catch (NoSuchMethodException e) {
-                return createErrorStatus(Messages.DexWrapper_SecuryEx_Unable_To_Find_Method, e);
-            } catch (NoSuchFieldException e) {
-                return createErrorStatus(Messages.DexWrapper_SecuryEx_Unable_To_Find_Field, e);
-            }
-
-            return Status.OK_STATUS;
-        } catch (MalformedURLException e) {
-            // really this should not happen.
-            return createErrorStatus(
-                    String.format(Messages.DexWrapper_Failed_to_load_s, osFilepath), e);
-        } catch (ClassNotFoundException e) {
-            return createErrorStatus(
-                    String.format(Messages.DexWrapper_Failed_to_load_s, osFilepath), e);
-        }
-    }
-
-    /**
-     * Removes any reference to the dex library.
-     * <p/>
-     * {@link #loadDex(String)} must be called on the wrapper
-     * before {@link #run(String, String[], boolean, PrintStream, PrintStream)} can
-     * be used again.
-     */
-    public synchronized void unload() {
-        mRunMethod = null;
-        mArgConstructor = null;
-        mArgOutName = null;
-        mArgJarOutput = null;
-        mArgFileNames = null;
-        mArgVerbose = null;
-        mConsoleOut = null;
-        mConsoleErr = null;
-        System.gc();
-    }
-
-    /**
-     * Runs the dex command.
-     * The wrapper must have been initialized via {@link #loadDex(String)} first.
-     *
-     * @param osOutFilePath the OS path to the outputfile (classes.dex
-     * @param osFilenames list of input source files (.class and .jar files)
-     * @param forceJumbo force jumbo mode.
-     * @param verbose verbose mode.
-     * @param outStream the stdout console
-     * @param errStream the stderr console
-     * @return the integer return code of com.android.dx.command.dexer.Main.run()
-     * @throws CoreException
-     */
-    public synchronized int run(String osOutFilePath, Collection<String> osFilenames,
-            boolean forceJumbo, boolean verbose,
-            PrintStream outStream, PrintStream errStream) throws CoreException {
-
-        assert mRunMethod != null;
-        assert mArgConstructor != null;
-        assert mArgOutName != null;
-        assert mArgJarOutput != null;
-        assert mArgFileNames != null;
-        assert mArgForceJumbo != null;
-        assert mArgVerbose != null;
-        assert mConsoleOut != null;
-        assert mConsoleErr != null;
-
-        if (mRunMethod == null) {
-            throw new CoreException(createErrorStatus(
-                    String.format(Messages.DexWrapper_Unable_To_Execute_Dex_s,
-                            "wrapper was not properly loaded first"),
-                    null /*exception*/));
-        }
-
-        try {
-            // set the stream
-            mConsoleErr.set(null /* obj: static field */, errStream);
-            mConsoleOut.set(null /* obj: static field */, outStream);
-
-            // create the Arguments object.
-            Object args = mArgConstructor.newInstance();
-            mArgOutName.set(args, osOutFilePath);
-            mArgFileNames.set(args, osFilenames.toArray(new String[osFilenames.size()]));
-            mArgJarOutput.set(args, osOutFilePath.endsWith(SdkConstants.DOT_JAR));
-            mArgForceJumbo.set(args, forceJumbo);
-            mArgVerbose.set(args, verbose);
-
-            // call the run method
-            Object res = mRunMethod.invoke(null /* obj: static method */, args);
-
-            if (res instanceof Integer) {
-                return ((Integer)res).intValue();
-            }
-
-            return -1;
-        } catch (Exception e) {
-            Throwable t = e;
-            while (t.getCause() != null) {
-                t = t.getCause();
-            }
-
-            String msg = t.getMessage();
-            if (msg == null) {
-                msg = String.format("%s. Check the Eclipse log for stack trace.",
-                        t.getClass().getName());
-            }
-
-            throw new CoreException(createErrorStatus(
-                    String.format(Messages.DexWrapper_Unable_To_Execute_Dex_s, msg), t));
-        }
-    }
-
-    private static IStatus createErrorStatus(String message, Throwable e) {
-        AdtPlugin.log(e, message);
-        AdtPlugin.printErrorToConsole(Messages.DexWrapper_Dex_Loader, message);
-
-        return new Status(IStatus.ERROR, AdtPlugin.PLUGIN_ID, message, e);
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/build/ExecResultException.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/build/ExecResultException.java
deleted file mode 100644
index 63a7a69..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/build/ExecResultException.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * Copyright (C) 2010 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.build;
-
-/**
- * Base exception class containing the error code and output of an external tool failed exec.
- *
- */
-class ExecResultException extends Exception {
-    private static final long serialVersionUID = 1L;
-
-    private final int mErrorCode;
-    private final String[] mOutput;
-
-    protected ExecResultException(int errorCode, String[] output) {
-        mErrorCode = errorCode;
-        mOutput = output;
-    }
-
-    /**
-     * Returns the full output of aapt.
-     */
-    public String[] getOutput() {
-        return mOutput;
-    }
-
-    /**
-     * Returns the aapt return code.
-     */
-    public int getErrorCode() {
-        return mErrorCode;
-    }
-
-    public String getLabel() {
-        return "Command-line";
-    }
-
-    @Override
-    public String toString() {
-        String result = String.format("%1$s Error %2$d", getLabel(), mErrorCode);
-        if (mOutput != null && mOutput.length > 0) {
-            // Note : the "error detail" window in Eclipse seem to ignore the \n,
-            // so we prefix them with a space. It's not optimal but it's slightly readable.
-            result += " \nOutput:";
-            for (String o : mOutput) {
-                if (o != null) {
-                    result += " \n" + o;
-                }
-            }
-        }
-        return result;
-    }
-
-    @Override
-    public String getMessage() {
-        return toString();
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/build/Messages.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/build/Messages.java
deleted file mode 100644
index 9ceba20..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/build/Messages.java
+++ /dev/null
@@ -1,150 +0,0 @@
-
-package com.android.ide.eclipse.adt.internal.build;
-
-import org.eclipse.osgi.util.NLS;
-
-public class Messages extends NLS {
-    private static final String BUNDLE_NAME = "com.android.ide.eclipse.adt.internal.build.build_messages"; //$NON-NLS-1$
-
-    public static String AAPT_Error;
-
-    public static String AAPT_Exec_Error_s;
-
-    public static String AAPT_Exec_Error_d;
-
-    public static String AAPT_Exec_Error_Other_s;
-
-    public static String Added_s_s_Needs_Updating;
-
-    public static String AIDL_Exec_Error_s;
-
-    public static String AIDL_Exec_Error_d;
-
-    public static String AIDL_Java_Conflict;
-
-    public static String ApkBuilder_Certificate_Expired_on_s;
-
-    public static String ApkBuilder_JAVA_HOME_is_s;
-
-    public static String ApkBuilder_Packaging_s;
-
-    public static String ApkBuilder_Packaging_s_into_s;
-
-    public static String ApkBuilder_s_Conflict_with_file_s;
-
-    public static String ApkBuilder_Signing_Key_Creation_s;
-
-    public static String ApkBuilder_Unable_To_Gey_Key;
-
-    public static String ApkBuilder_UnableBuild_Dex_Not_loaded;
-
-    public static String ApkBuilder_Update_or_Execute_manually_s;
-
-    public static String ApkBuilder_Using_Default_Key;
-
-    public static String ApkBuilder_Using_s_To_Sign;
-
-    public static String Checking_Package_Change;
-
-    public static String Compiler_Compliance_Error;
-
-    public static String Couldnt_Locate_s_Error;
-
-    public static String Dalvik_Error_d;
-
-    public static String Dalvik_Error_s;
-
-    public static String Delete_Obsolete_Error;
-
-    public static String DexWrapper_Dex_Loader;
-
-    public static String DexWrapper_Failed_to_load_s;
-
-    public static String DexWrapper_s_does_not_exists;
-
-    public static String DexWrapper_SecuryEx_Unable_To_Find_API;
-
-    public static String DexWrapper_SecuryEx_Unable_To_Find_Field;
-
-    public static String DexWrapper_SecuryEx_Unable_To_Find_Method;
-
-    public static String DexWrapper_Unable_To_Execute_Dex_s;
-
-    public static String DX_Jar_Error;
-
-    public static String Failed_To_Get_Output;
-
-    public static String Final_Archive_Error_s;
-
-    public static String Incompatible_VM_Warning;
-
-    public static String Marker_Delete_Error;
-
-    public static String No_SDK_Setup_Error;
-
-    public static String Nothing_To_Compile;
-
-    public static String Output_Missing;
-
-    public static String Package_s_Doesnt_Exist_Error;
-
-    public static String Preparing_Generated_Files;
-
-    public static String Project_Has_Errors;
-
-    public static String Refreshing_Res;
-
-    public static String Removing_Generated_Classes;
-
-    public static String Requires_1_5_Error;
-
-    public static String Requires_Class_Compatibility_s;
-
-    public static String Requires_Compiler_Compliance_s;
-
-    public static String Requires_Source_Compatibility_s;
-
-    public static String s_Contains_Xml_Error;
-
-    public static String s_Doesnt_Declare_Package_Error;
-
-    public static String s_File_Missing;
-
-    public static String s_Missing_Repackaging;
-
-    public static String s_Modified_Manually_Recreating_s;
-
-    public static String s_Modified_Recreating_s;
-
-    public static String s_Removed_Recreating_s;
-
-    public static String s_Removed_s_Needs_Updating;
-
-    public static String Start_Full_Apk_Build;
-
-    public static String Start_Full_Pre_Compiler;
-
-    public static String Skip_Post_Compiler;
-
-    public static String Start_Full_Post_Compiler;
-
-    public static String Start_Inc_Apk_Build;
-
-    public static String Start_Inc_Pre_Compiler;
-
-    public static String Unparsed_AAPT_Errors;
-
-    public static String Unparsed_AIDL_Errors;
-
-    public static String Xml_Error;
-
-    public static String Proguard_Exec_Error;
-
-    static {
-        // initialize resource bundle
-        NLS.initializeMessages(BUNDLE_NAME, Messages.class);
-    }
-
-    private Messages() {
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/build/NativeLibInJarException.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/build/NativeLibInJarException.java
deleted file mode 100644
index 18f4ae7..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/build/NativeLibInJarException.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * Copyright (C) 2010 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.build;
-
-import com.android.sdklib.build.ApkBuilder.JarStatus;
-
-/**
- * Exception throw when native libraries are detected in jar file.
- *
- */
-public final class NativeLibInJarException extends Exception {
-    private static final long serialVersionUID = 1L;
-
-    private final JarStatus mStatus;
-    private final String mLibName;
-    private final String[] mConsoleMsgs;
-
-    NativeLibInJarException(JarStatus status, String message, String libName,
-            String[] consoleMsgs) {
-        super(message);
-        mStatus = status;
-        mLibName = libName;
-        mConsoleMsgs = consoleMsgs;
-    }
-
-    /**
-     * Returns the {@link JarStatus} object containing the information about the libraries that
-     * were found.
-     */
-    public JarStatus getStatus() {
-        return mStatus;
-    }
-
-    /**
-     * Returns the name of the jar file containing the native libraries.
-     */
-    public String getJarName() {
-        return mLibName;
-    }
-
-    /**
-     * Returns additional information that should be shown to the user.
-     */
-    public String[] getAdditionalInfo() {
-        return mConsoleMsgs;
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/build/ProguardExecException.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/build/ProguardExecException.java
deleted file mode 100644
index 3eb688b..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/build/ProguardExecException.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Copyright (C) 2010 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.build;
-
-/**
- * Exception thrown when the execution of proguard fails.
- *
- */
-public final class ProguardExecException extends Exception {
-    private static final long serialVersionUID = 1L;
-
-    ProguardExecException(String message, Throwable cause) {
-        super(message, cause);
-    }
-}
-
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/build/ProguardResultException.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/build/ProguardResultException.java
deleted file mode 100644
index 54246b3..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/build/ProguardResultException.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Copyright (C) 2010 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.build;
-
-/**
- * Exception thrown when aapt reports an error in the resources.
- *
- */
-public final class ProguardResultException extends ExecResultException {
-    private static final long serialVersionUID = 1L;
-
-    ProguardResultException(int errorCode, String[] output) {
-        super(errorCode, output);
-    }
-
-    @Override
-    public String getLabel() {
-        return "Proguard";
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/build/RenderScriptLauncher.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/build/RenderScriptLauncher.java
deleted file mode 100644
index 1d3c7bd..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/build/RenderScriptLauncher.java
+++ /dev/null
@@ -1,244 +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.eclipse.adt.internal.build;
-
-import com.android.annotations.NonNull;
-import com.android.ide.eclipse.adt.AdtConstants;
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.ide.eclipse.adt.internal.project.BaseProjectHelper;
-import com.android.sdklib.build.RenderScriptProcessor.CommandLineLauncher;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IFolder;
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Path;
-
-import java.io.File;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-/**
- * A {@link SourceProcessor} for RenderScript files.
- */
-public class RenderScriptLauncher implements CommandLineLauncher {
-
-    /**
-     * Single line llvm-rs-cc error: {@code <path>:<line>:<col>: <error>}
-     */
-    private static Pattern sLlvmPattern1 = Pattern.compile("^(.+?):(\\d+):(\\d+):\\s(.+)$"); //$NON-NLS-1$
-
-    @NonNull
-    private final IProject mProject;
-    @NonNull
-    private final IFolder mSourceOutFolder;
-    @NonNull
-    private final IFolder mResOutFolder;
-    @NonNull
-    private final IProgressMonitor mMonitor;
-    private final boolean mVerbose;
-
-    public RenderScriptLauncher(
-            @NonNull IProject project,
-            @NonNull IFolder sourceOutFolder,
-            @NonNull IFolder resOutFolder,
-            @NonNull IProgressMonitor monitor,
-            boolean verbose) {
-        mProject = project;
-        mSourceOutFolder = sourceOutFolder;
-        mResOutFolder = resOutFolder;
-        mMonitor = monitor;
-        mVerbose = verbose;
-    }
-
-    @Override
-    public void launch(File executable, List<String> arguments, Map<String, String> envVariableMap)
-            throws IOException, InterruptedException {
-        // do the exec
-        try {
-            if (mVerbose) {
-                StringBuilder sb = new StringBuilder(executable.getAbsolutePath());
-                for (String c : arguments) {
-                    sb.append(' ').append(c);
-                }
-                String cmd_line = sb.toString();
-                AdtPlugin.printToConsole(mProject, cmd_line);
-            }
-
-            String[] commandArray = new String[1 + arguments.size()];
-            commandArray[0] = executable.getAbsolutePath();
-            System.arraycopy(arguments.toArray(), 0, commandArray, 1, arguments.size());
-
-            ProcessBuilder processBuilder = new ProcessBuilder(commandArray);
-            Map<String, String> processEnvs = processBuilder.environment();
-            for (Map.Entry<String, String> entry : envVariableMap.entrySet()) {
-                processEnvs.put(entry.getKey(), entry.getValue());
-            }
-
-            Process p = processBuilder.start();
-
-            // list to store each line of stderr
-            ArrayList<String> stdErr = new ArrayList<String>();
-
-            // get the output and return code from the process
-            int returnCode = BuildHelper.grabProcessOutput(mProject, p, stdErr);
-
-            if (stdErr.size() > 0) {
-                // attempt to parse the error output
-                boolean parsingError = parseLlvmOutput(stdErr);
-
-                // If the process failed and we couldn't parse the output
-                // we print a message, mark the project and exit
-                if (returnCode != 0) {
-
-                    if (parsingError || mVerbose) {
-                        // display the message in the console.
-                        if (parsingError) {
-                            AdtPlugin.printErrorToConsole(mProject, stdErr.toArray());
-
-                            // mark the project
-                            BaseProjectHelper.markResource(mProject,
-                                    AdtConstants.MARKER_RENDERSCRIPT,
-                                    "Unparsed Renderscript error! Check the console for output.",
-                                    IMarker.SEVERITY_ERROR);
-                        } else {
-                            AdtPlugin.printToConsole(mProject, stdErr.toArray());
-                        }
-                    }
-                    return;
-                }
-            } else if (returnCode != 0) {
-                // no stderr output but exec failed.
-                String msg = String.format("Error executing Renderscript: Return code %1$d",
-                        returnCode);
-
-                BaseProjectHelper.markResource(mProject, AdtConstants.MARKER_AIDL,
-                       msg, IMarker.SEVERITY_ERROR);
-
-                return;
-            }
-        } catch (IOException e) {
-            // mark the project and exit
-            String msg = String.format(
-                    "Error executing Renderscript. Please check %1$s is present at %2$s",
-                    executable.getName(), executable.getAbsolutePath());
-            AdtPlugin.log(IStatus.ERROR, msg);
-            BaseProjectHelper.markResource(mProject, AdtConstants.MARKER_RENDERSCRIPT, msg,
-                    IMarker.SEVERITY_ERROR);
-            throw e;
-        } catch (InterruptedException e) {
-            // mark the project and exit
-            String msg = String.format(
-                    "Error executing Renderscript. Please check %1$s is present at %2$s",
-                    executable.getName(), executable.getAbsolutePath());
-            AdtPlugin.log(IStatus.ERROR, msg);
-            BaseProjectHelper.markResource(mProject, AdtConstants.MARKER_RENDERSCRIPT, msg,
-                    IMarker.SEVERITY_ERROR);
-            throw e;
-        }
-
-        try {
-            mSourceOutFolder.refreshLocal(IResource.DEPTH_ONE, mMonitor);
-            mResOutFolder.refreshLocal(IResource.DEPTH_ONE, mMonitor);
-        } catch (CoreException e) {
-            AdtPlugin.log(e, "failed to refresh folders");
-        }
-
-        return;
-    }
-
-    /**
-     * Parse the output of llvm-rs-cc and mark the file with any errors.
-     * @param lines The output to parse.
-     * @return true if the parsing failed, false if success.
-     */
-    private boolean parseLlvmOutput(ArrayList<String> lines) {
-        // nothing to parse? just return false;
-        if (lines.size() == 0) {
-            return false;
-        }
-
-        // get the root folder for the project as we're going to ignore everything that's
-        // not in the project
-        String rootPath = mProject.getLocation().toOSString();
-        int rootPathLength = rootPath.length();
-
-        Matcher m;
-
-        boolean parsing = false;
-
-        for (int i = 0; i < lines.size(); i++) {
-            String p = lines.get(i);
-
-            m = sLlvmPattern1.matcher(p);
-            if (m.matches()) {
-                // get the file path. This may, or may not be the main file being compiled.
-                String filePath = m.group(1);
-                if (filePath.startsWith(rootPath) == false) {
-                    // looks like the error in a non-project file. Keep parsing, but
-                    // we'll return true
-                    parsing = true;
-                    continue;
-                }
-
-                // get the actual file.
-                filePath = filePath.substring(rootPathLength);
-                // remove starting separator since we want the path to be relative
-                if (filePath.startsWith(File.separator)) {
-                    filePath = filePath.substring(1);
-                }
-
-                // get the file
-                IFile f = mProject.getFile(new Path(filePath));
-
-                String lineStr = m.group(2);
-                // ignore group 3 for now, this is the col number
-                String msg = m.group(4);
-
-                // get the line number
-                int line = 0;
-                try {
-                    line = Integer.parseInt(lineStr);
-                } catch (NumberFormatException e) {
-                    // looks like the string we extracted wasn't a valid
-                    // file number. Parsing failed and we return true
-                    return true;
-                }
-
-                // mark the file
-                BaseProjectHelper.markResource(f, AdtConstants.MARKER_RENDERSCRIPT, msg, line,
-                        IMarker.SEVERITY_ERROR);
-
-                // success, go to the next line
-                continue;
-            }
-
-            // invalid line format, flag as error, and keep going
-            parsing = true;
-        }
-
-        return parsing;
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/build/RsSourceChangeHandler.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/build/RsSourceChangeHandler.java
deleted file mode 100644
index 715895a..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/build/RsSourceChangeHandler.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/*
- * Copyright (C) 2013 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.build;
-
-import com.android.SdkConstants;
-import com.android.annotations.NonNull;
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.sdklib.build.RenderScriptChecker;
-
-import org.eclipse.core.resources.IFile;
-
-import java.io.File;
-import java.io.IOException;
-import java.util.Set;
-
-public class RsSourceChangeHandler implements SourceChangeHandler {
-
-    private final RenderScriptChecker mChecker;
-    private boolean mIsCheckerLoaded = false;
-
-    private boolean mMustCompile = false;
-
-    public RsSourceChangeHandler(@NonNull RenderScriptChecker checker) {
-        mChecker = checker;
-    }
-
-    @Override
-    public boolean handleGeneratedFile(IFile file, int kind) {
-        if (mMustCompile) {
-            return false;
-        }
-
-        if (!mIsCheckerLoaded) {
-            try {
-                mChecker.loadDependencies();
-            } catch (IOException e) {
-                // failed to load the dependency files, force a compilation, log the error.
-                AdtPlugin.log(e, "Failed to read dependency files");
-                mMustCompile = true;
-                return false;
-            }
-        }
-
-        Set<File> oldOutputs = mChecker.getOldOutputs();
-        // mustCompile is always false here.
-        mMustCompile = oldOutputs.contains(file.getLocation().toFile());
-        return mMustCompile;
-    }
-
-    @Override
-    public void handleSourceFile(IFile file, int kind) {
-        if (mMustCompile) {
-            return;
-        }
-
-        String ext = file.getFileExtension();
-        if (SdkConstants.EXT_RS.equals(ext) ||
-                SdkConstants.EXT_FS.equals(ext) ||
-                SdkConstants.EXT_RSH.equals(ext)) {
-            mMustCompile = true;
-        }
-    }
-
-    public boolean mustCompile() {
-        return mMustCompile;
-    }
-
-    @NonNull
-    public RenderScriptChecker getChecker() {
-        return mChecker;
-    }
-
-    public void prepareFullBuild() {
-        mMustCompile = true;
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/build/SourceChangeHandler.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/build/SourceChangeHandler.java
deleted file mode 100644
index 12a0551..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/build/SourceChangeHandler.java
+++ /dev/null
@@ -1,25 +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.eclipse.adt.internal.build;
-
-import org.eclipse.core.resources.IFile;
-
-public interface SourceChangeHandler {
-
-    boolean handleGeneratedFile(IFile file, int kind);
-    void handleSourceFile(IFile file, int kind);
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/build/SourceFileData.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/build/SourceFileData.java
deleted file mode 100644
index d06bf16..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/build/SourceFileData.java
+++ /dev/null
@@ -1,132 +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.eclipse.adt.internal.build;
-
-import org.eclipse.core.resources.IFile;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
-/**
- * Data for Android-specific source files. It contains a list of output files and a list
- * of dependencies.
- * The source file itself is a implied dependency and is not meant to be in the dependency list.
- */
-public class SourceFileData {
-
-    private final IFile mSourceFile;
-    private final List<IFile> mOutputFiles = new ArrayList<IFile>();
-    private final List<IFile> mDependencyFiles = new ArrayList<IFile>();
-
-    public SourceFileData(IFile sourceFile) {
-        this(sourceFile, null, null);
-    }
-
-    SourceFileData(IFile sourceFile,
-            List<IFile> outputFiles, List<IFile> dependencyFiles) {
-        mSourceFile = sourceFile;
-        if (outputFiles != null) {
-            mOutputFiles.addAll(outputFiles);
-        }
-        if (dependencyFiles != null) {
-            mDependencyFiles.addAll(dependencyFiles);
-        }
-    }
-
-    SourceFileData(IFile sourceFile, IFile outputFile) {
-        mSourceFile = sourceFile;
-        if (outputFile != null) {
-            mOutputFiles.add(outputFile);
-        }
-    }
-
-    /**
-     * Returns the source file as an {@link IFile}
-     */
-    public IFile getSourceFile() {
-        return mSourceFile;
-    }
-
-    /**
-     * Returns whether the given file is a dependency for this source file.
-     * <p/>Note that the source file itself is not tested against. Therefore if
-     * {@code file.equals(getSourceFile()} returns {@code true}, this method will return
-     * {@code false}.
-     * @param file the file to check against
-     * @return true if the given file is a dependency for this source file.
-     */
-    public boolean dependsOn(IFile file) {
-        return mDependencyFiles.contains(file);
-    }
-
-    /**
-     * Returns whether the given file is an ouput of this source file.
-     * @param file the file to test.
-     * @return true if the file is an output file.
-     */
-    public boolean generated(IFile file) {
-        return mOutputFiles.contains(file);
-    }
-
-    void setOutputFiles(List<IFile> outputFiles) {
-        mOutputFiles.clear();
-        if (outputFiles != null) {
-            mOutputFiles.addAll(outputFiles);
-        }
-    }
-
-    void setOutputFile(IFile outputFile) {
-        mOutputFiles.clear();
-        if (outputFile != null) {
-            mOutputFiles.add(outputFile);
-        }
-    }
-
-    void setDependencyFiles(List<IFile> depFiles) {
-        mDependencyFiles.clear();
-        if (depFiles != null) {
-            mDependencyFiles.addAll(depFiles);
-        }
-    }
-
-    public List<IFile> getDependencyFiles() {
-        return mDependencyFiles;
-    }
-
-    /**
-     * Shortcut access to the first output file. This is useful for generator that only output
-     * one file.
-     */
-    public IFile getOutput() {
-        if (mOutputFiles.size() > 0) {
-            return mOutputFiles.get(0);
-        }
-
-        return null;
-    }
-
-    public List<IFile> getOutputFiles() {
-        return Collections.unmodifiableList(mOutputFiles);
-    }
-
-    @Override
-    public String toString() {
-        return "NonJavaFileBundle [mSourceFile=" + mSourceFile + ", mGeneratedFiles="
-                + mOutputFiles + ", mDependencies=" + mDependencyFiles + "]";
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/build/SourceProcessor.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/build/SourceProcessor.java
deleted file mode 100644
index 1fc3e4e..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/build/SourceProcessor.java
+++ /dev/null
@@ -1,454 +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.eclipse.adt.internal.build;
-
-import com.android.SdkConstants;
-import com.android.annotations.NonNull;
-import com.android.ide.eclipse.adt.internal.build.builders.BaseBuilder;
-import com.android.ide.eclipse.adt.internal.project.BaseProjectHelper;
-import com.android.ide.eclipse.adt.internal.project.ProjectHelper;
-import com.android.sdklib.BuildToolInfo;
-import com.android.sdklib.IAndroidTarget;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IFolder;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IWorkspaceRoot;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.jdt.core.IJavaProject;
-
-import java.io.File;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Locale;
-import java.util.Map;
-import java.util.Set;
-
-/**
- * Base class to handle generated java code.
- *
- * It provides management for modified source file list, deleted source file list, reconciliation
- * of previous lists, storing the current state of the build.
- *
- */
-public abstract class SourceProcessor {
-
-    public final static int COMPILE_STATUS_NONE = 0;
-    public final static int COMPILE_STATUS_CODE = 0x1;
-    public final static int COMPILE_STATUS_RES = 0x2;
-
-    /** List of all source files, their dependencies, and their output. */
-    private final Map<IFile, SourceFileData> mFiles = new HashMap<IFile, SourceFileData>();
-
-    private final IJavaProject mJavaProject;
-    private BuildToolInfo mBuildToolInfo;
-    private final IFolder mGenFolder;
-    private final DefaultSourceChangeHandler mDeltaVisitor;
-
-    /** List of source files pending compilation at the next build */
-    private final List<IFile> mToCompile = new ArrayList<IFile>();
-
-    /** List of removed source files pending cleaning at the next build. */
-    private final List<IFile> mRemoved = new ArrayList<IFile>();
-
-    private int mLastCompilationStatus = COMPILE_STATUS_NONE;
-
-    /**
-     * Quotes a path inside "". If the platform is not windows, the path is returned as is.
-     * @param path the path to quote
-     * @return the quoted path.
-     */
-    public static String quote(String path) {
-        if (SdkConstants.CURRENT_PLATFORM == SdkConstants.PLATFORM_WINDOWS) {
-            if (path.endsWith(File.separator)) {
-                path = path.substring(0, path.length() -1);
-            }
-            return "\"" + path + "\"";
-        }
-
-        return path;
-    }
-
-    protected SourceProcessor(
-            @NonNull IJavaProject javaProject,
-            @NonNull BuildToolInfo buildToolInfo,
-            @NonNull IFolder genFolder,
-            @NonNull DefaultSourceChangeHandler deltaVisitor) {
-        mJavaProject = javaProject;
-        mBuildToolInfo = buildToolInfo;
-        mGenFolder = genFolder;
-        mDeltaVisitor = deltaVisitor;
-
-        mDeltaVisitor.init(this);
-
-        IProject project = javaProject.getProject();
-
-        // get all the source files
-        buildSourceFileList();
-
-        // load the known dependencies
-        loadOutputAndDependencies();
-
-        boolean mustCompile = loadState(project);
-
-        // if we stored that we have to compile some files, we build the list that will compile them
-        // all. For now we have to reuse the full list since we don't know which files needed
-        // compilation.
-        if (mustCompile) {
-            mToCompile.addAll(mFiles.keySet());
-        }
-    }
-
-    protected SourceProcessor(
-            @NonNull IJavaProject javaProject,
-            @NonNull BuildToolInfo buildToolInfo,
-            @NonNull IFolder genFolder) {
-        this(javaProject, buildToolInfo, genFolder, new DefaultSourceChangeHandler());
-    }
-
-    public void setBuildToolInfo(BuildToolInfo buildToolInfo) {
-        mBuildToolInfo = buildToolInfo;
-    }
-
-
-    /**
-     * Returns whether the given file is an output of this processor by return the source
-     * file that generated it.
-     * @param file the file to test.
-     * @return the source file that generated the given file or null.
-     */
-    IFile isOutput(IFile file) {
-        for (SourceFileData data : mFiles.values()) {
-            if (data.generated(file)) {
-                return data.getSourceFile();
-            }
-        }
-
-        return null;
-    }
-
-    /**
-     * Returns whether the given file is a dependency for other files by returning a list
-     * of file depending on the given file.
-     * @param file the file to test.
-     * @return a list of files that depend on the given file or an empty list if there
-     *    are no matches.
-     */
-    List<IFile> isDependency(IFile file) {
-        ArrayList<IFile> files = new ArrayList<IFile>();
-        for (SourceFileData data : mFiles.values()) {
-            if (data.dependsOn(file)) {
-                files.add(data.getSourceFile());
-            }
-        }
-
-        return files;
-    }
-
-    void addData(SourceFileData data) {
-        mFiles.put(data.getSourceFile(), data);
-    }
-
-    SourceFileData getFileData(IFile file) {
-        return mFiles.get(file);
-    }
-
-    Collection<SourceFileData> getAllFileData() {
-        return mFiles.values();
-    }
-
-    public final DefaultSourceChangeHandler getChangeHandler() {
-        return mDeltaVisitor;
-    }
-
-    final IJavaProject getJavaProject() {
-        return mJavaProject;
-    }
-
-    final BuildToolInfo getBuildToolInfo() {
-        return mBuildToolInfo;
-    }
-
-    final IFolder getGenFolder() {
-        return mGenFolder;
-    }
-
-    final List<IFile> getToCompile() {
-        return mToCompile;
-    }
-
-    final List<IFile> getRemovedFile() {
-        return mRemoved;
-    }
-
-    final void addFileToCompile(IFile file) {
-        mToCompile.add(file);
-    }
-
-    public final void prepareFullBuild(IProject project) {
-        mDeltaVisitor.reset();
-
-        mToCompile.clear();
-        mRemoved.clear();
-
-        // get all the source files
-        buildSourceFileList();
-
-        mToCompile.addAll(mFiles.keySet());
-
-        saveState(project);
-    }
-
-    public final void doneVisiting(IProject project) {
-        // merge the previous file modification lists and the new one.
-        mergeFileModifications(mDeltaVisitor);
-
-        mDeltaVisitor.reset();
-
-        saveState(project);
-    }
-
-    /**
-     * Returns the extension of the source files handled by this processor.
-     * @return
-     */
-    protected abstract Set<String> getExtensions();
-
-    protected abstract String getSavePropertyName();
-
-    /**
-     * Compiles the source files and return a status bitmask of the type of file that was generated.
-     *
-     */
-    public final int compileFiles(BaseBuilder builder,
-            IProject project, IAndroidTarget projectTarget,
-            List<IPath> sourceFolders, List<File> libraryProjectsOut, IProgressMonitor monitor)
-            throws CoreException {
-
-        mLastCompilationStatus = COMPILE_STATUS_NONE;
-
-        if (mToCompile.size() == 0 && mRemoved.size() == 0) {
-            return mLastCompilationStatus;
-        }
-
-        // if a source file is being removed before we managed to compile it, it'll be in
-        // both list. We *need* to remove it from the compile list or it'll never go away.
-        for (IFile sourceFile : mRemoved) {
-            int pos = mToCompile.indexOf(sourceFile);
-            if (pos != -1) {
-                mToCompile.remove(pos);
-            }
-        }
-
-        // list of files that have failed compilation.
-        List<IFile> stillNeedCompilation = new ArrayList<IFile>();
-
-        doCompileFiles(mToCompile, builder, project, projectTarget, sourceFolders,
-                stillNeedCompilation, libraryProjectsOut, monitor);
-
-        mToCompile.clear();
-        mToCompile.addAll(stillNeedCompilation);
-
-        // Remove the files created from source files that have been removed.
-        for (IFile sourceFile : mRemoved) {
-            // look if we already know the output
-            SourceFileData data = getFileData(sourceFile);
-            if (data != null) {
-                doRemoveFiles(data);
-            }
-        }
-
-        // remove the associated file data.
-        for (IFile removedFile : mRemoved) {
-            mFiles.remove(removedFile);
-        }
-
-        mRemoved.clear();
-
-        // store the build state. If there are any files that failed to compile, we will
-        // force a full aidl compile on the next project open. (unless a full compilation succeed
-        // before the project is closed/re-opened.)
-        saveState(project);
-
-        return mLastCompilationStatus;
-    }
-
-    protected abstract void doCompileFiles(
-            List<IFile> filesToCompile, BaseBuilder builder,
-            IProject project, IAndroidTarget projectTarget,
-            List<IPath> sourceFolders, List<IFile> notCompiledOut,
-            List<File> libraryProjectsOut, IProgressMonitor monitor) throws CoreException;
-
-    /**
-     * Adds a compilation status. It can be any of (in combination too):
-     * <p/>
-     * {@link #COMPILE_STATUS_CODE} means this processor created source code files.
-     * {@link #COMPILE_STATUS_RES} means this process created resources.
-     */
-    protected void setCompilationStatus(int status) {
-        mLastCompilationStatus |= status;
-    }
-
-    protected void doRemoveFiles(SourceFileData data) throws CoreException {
-        List<IFile> outputFiles = data.getOutputFiles();
-        for (IFile outputFile : outputFiles) {
-            if (outputFile.exists()) {
-                outputFile.getLocation().toFile().delete();
-            }
-        }
-    }
-
-    public final boolean loadState(IProject project) {
-        return ProjectHelper.loadBooleanProperty(project, getSavePropertyName(),
-                true /*defaultValue*/);
-    }
-
-    public final void saveState(IProject project) {
-        // TODO: Optimize by saving only the files that need compilation
-        ProjectHelper.saveStringProperty(project, getSavePropertyName(),
-                Boolean.toString(mToCompile.size() > 0));
-    }
-
-    protected abstract void loadOutputAndDependencies();
-
-
-    protected IPath getSourceFolderFor(IFile file) {
-        // find the source folder for the class so that we can infer the package from the
-        // difference between the file and its source folder.
-        List<IPath> sourceFolders = BaseProjectHelper.getSourceClasspaths(getJavaProject());
-        IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
-
-        for (IPath sourceFolderPath : sourceFolders) {
-            IFolder sourceFolder = root.getFolder(sourceFolderPath);
-            // we don't look in the 'gen' source folder as there will be no source in there.
-            if (sourceFolder.exists() && sourceFolder.equals(getGenFolder()) == false) {
-                // look for the source file parent, until we find this source folder.
-                IResource parent = file;
-                while ((parent = parent.getParent()) != null) {
-                    if (parent.equals(sourceFolder)) {
-                        return sourceFolderPath;
-                    }
-                }
-            }
-        }
-
-        return null;
-    }
-
-    /**
-     * Goes through the build paths and fills the list of files to compile.
-     *
-     * @param project The project.
-     * @param sourceFolderPathList The list of source folder paths.
-     */
-    private final void buildSourceFileList() {
-        mFiles.clear();
-
-        IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
-        List<IPath> sourceFolderPathList = BaseProjectHelper.getSourceClasspaths(mJavaProject);
-
-        for (IPath sourceFolderPath : sourceFolderPathList) {
-            IFolder sourceFolder = root.getFolder(sourceFolderPath);
-            // we don't look in the 'gen' source folder as there will be no source in there.
-            if (sourceFolder.exists() && sourceFolder.equals(getGenFolder()) == false) {
-                scanFolderForSourceFiles(sourceFolder, sourceFolder);
-            }
-        }
-    }
-
-    /**
-     * Scans a folder and fills the list of files to compile.
-     * @param sourceFolder the root source folder.
-     * @param folder The folder to scan.
-     */
-    private void scanFolderForSourceFiles(IFolder sourceFolder, IFolder folder) {
-        try {
-            IResource[] members = folder.members();
-            for (IResource r : members) {
-                // get the type of the resource
-               switch (r.getType()) {
-                   case IResource.FILE: {
-                       // if this a file, check that the file actually exist
-                       // and that it's the type of of file that's used in this processor
-                       String extension = r.exists() ? r.getFileExtension() : null;
-                       if (extension != null &&
-                               getExtensions().contains(extension.toLowerCase(Locale.US))) {
-                           mFiles.put((IFile) r, new SourceFileData((IFile) r));
-                       }
-                       break;
-                   }
-                   case IResource.FOLDER:
-                       // recursively go through children
-                       scanFolderForSourceFiles(sourceFolder, (IFolder)r);
-                       break;
-                   default:
-                       // this would mean it's a project or the workspace root
-                       // which is unlikely to happen. we do nothing
-                       break;
-               }
-            }
-        } catch (CoreException e) {
-            // Couldn't get the members list for some reason. Just return.
-        }
-    }
-
-
-    /**
-     * Merge the current list of source file to compile/remove with the one coming from the
-     * delta visitor
-     * @param visitor the delta visitor.
-     */
-    private void mergeFileModifications(DefaultSourceChangeHandler visitor) {
-        Set<IFile> toRemove = visitor.getRemovedFiles();
-        Set<IFile> toCompile = visitor.getFilesToCompile();
-
-        // loop through the new toRemove list, and add it to the old one,
-        // plus remove any file that was still to compile and that are now
-        // removed
-        for (IFile r : toRemove) {
-            if (mRemoved.indexOf(r) == -1) {
-                mRemoved.add(r);
-            }
-
-            int index = mToCompile.indexOf(r);
-            if (index != -1) {
-                mToCompile.remove(index);
-            }
-        }
-
-        // now loop through the new files to compile and add it to the list.
-        // Also look for them in the remove list, this would mean that they
-        // were removed, then added back, and we shouldn't remove them, just
-        // recompile them.
-        for (IFile r : toCompile) {
-            if (mToCompile.indexOf(r) == -1) {
-                mToCompile.add(r);
-            }
-
-            int index = mRemoved.indexOf(r);
-            if (index != -1) {
-                mRemoved.remove(index);
-            }
-        }
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/build/build_messages.properties b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/build/build_messages.properties
deleted file mode 100644
index f387ab5..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/build/build_messages.properties
+++ /dev/null
@@ -1,67 +0,0 @@
-Start_Full_Apk_Build=Starting full Package build.
-Start_Full_Pre_Compiler=Starting full Pre Compiler.
-Skip_Post_Compiler=Skipping over Post Compiler.
-Start_Full_Post_Compiler=Starting full Post Compiler.
-Start_Inc_Apk_Build=Starting incremental Package build: Checking resource changes.
-Start_Inc_Pre_Compiler=Starting incremental Pre Compiler: Checking resource changes.
-Xml_Error=Error in an XML file: aborting build.
-s_Missing_Repackaging=%1$s missing. Repackaging.
-Project_Has_Errors=Project contains error(s). Package Builder aborted.
-Failed_To_Get_Output=Failed to get project output folder\!
-Output_Missing=Output folder missing\! Make sure your project is configured properly.
-s_File_Missing=%1$s file missing\!
-Unparsed_AAPT_Errors=Unparsed aapt error(s)\! Check the console for output.
-Unparsed_AIDL_Errors=Unparsed aidl error\! Check the console for output.
-AAPT_Exec_Error_s=Error executing aapt. Please check aapt is present at %1$s
-AAPT_Exec_Error_d=Error executing aapt: Return code %1$d
-AAPT_Exec_Error_Other_s=Error executing aapt: %1$s
-Dalvik_Error_d=Conversion to Dalvik format failed with error %1$d
-DX_Jar_Error=Dx.jar is not found inside the plugin. Reinstall ADT\!
-Dalvik_Error_s=Conversion to Dalvik format failed: %1$s
-Incompatible_VM_Warning=Note: You may be using an incompatible virtual machine or class library.
-Requires_1_5_Error=This program requires JDK 1.5 compatibility.
-Final_Archive_Error_s=Error generating final archive: %1$s
-Marker_Delete_Error=Failed to delete marker '%1$s' for %2$s
-Couldnt_Locate_s_Error=Could not locate '%1$s'. This will not be added to the package.
-Compiler_Compliance_Error=Compiler compliance level not compatible: Build aborted.
-No_SDK_Setup_Error=SDK directory has not been setup. Please go to the Android preferences and enter the location of the SDK.
-s_Contains_Xml_Error=%1$s contains XML error: Build aborted.
-s_Doesnt_Declare_Package_Error=%1$s does not declare a Java package: Build aborted.
-Checking_Package_Change=Checking Java package value did not change...
-Package_s_Doesnt_Exist_Error=Package '%1$s' does not exist\!
-Preparing_Generated_Files=Preparing generated java files for update/creation.
-AAPT_Error='aapt' error. Pre Compiler Build aborted.
-Nothing_To_Compile=Nothing to pre compile\!
-Removing_Generated_Classes=Removing generated java classes.
-Delete_Obsolete_Error=Failed to delete obsolete %1$s, please delete it manually
-DexWrapper_Dex_Loader=Dex Loader
-AIDL_Java_Conflict=%1$s is in the way of %2$s, remove it or rename of one the files.
-AIDL_Exec_Error_d=Error executing aidl: Return code %1$d
-AIDL_Exec_Error_s=Error executing aidl. Please check aidl is present at %1$s
-s_Removed_Recreating_s=%1$s was removed\! Recreating %1$s\!
-s_Modified_Manually_Recreating_s=%1$s was modified manually\! Reverting to generated version\!
-s_Modified_Recreating_s='%1$s' was modified.
-Added_s_s_Needs_Updating=New resource file: '%1$s', %2$s needs to be updated.
-s_Removed_s_Needs_Updating='%1$s' was removed, %2$s needs to be updated.
-Requires_Compiler_Compliance_s=Android requires compiler compliance level 5.0 or 6.0. Found '%1$s' instead. Please use Android Tools > Fix Project Properties.
-Requires_Source_Compatibility_s=Android requires source compatibility set to 5.0 or 6.0. Found '%1$s' instead. Please use Android Tools > Fix Project Properties.
-Requires_Class_Compatibility_s=Android requires .class compatibility set to 5.0 or 6.0. Found '%1$s' instead. Please use Android Tools > Fix Project Properties.
-Refreshing_Res=Refreshing resource folders.
-DexWrapper_s_does_not_exists=%1$s does not exist or is not a file
-DexWrapper_Failed_to_load_s=Failed to load %1$s
-DexWrapper_Unable_To_Execute_Dex_s=Unable to execute dex: %1$s
-DexWrapper_SecuryEx_Unable_To_Find_API=SecurityException: Unable to find API for dex.jar
-DexWrapper_SecuryEx_Unable_To_Find_Method=SecurityException: Unable to find method for dex.jar
-DexWrapper_SecuryEx_Unable_To_Find_Field=SecurityException: Unable to find field for dex.jar
-ApkBuilder_UnableBuild_Dex_Not_loaded=Unable to build: the file dx.jar was not loaded from the SDK folder\!
-ApkBuilder_Using_Default_Key=Using default debug key to sign package
-ApkBuilder_Using_s_To_Sign=Using '%1$s' to sign package
-ApkBuilder_Signing_Key_Creation_s=Signing Key Creation:
-ApkBuilder_Unable_To_Gey_Key=Unable to get debug signature key
-ApkBuilder_Certificate_Expired_on_s=Debug certificate expired on %1$s\!
-ApkBuilder_Packaging_s=Packaging %1$s
-ApkBuilder_JAVA_HOME_is_s=The Java VM Home used is: %1$s
-ApkBuilder_Update_or_Execute_manually_s=Update it if necessary, or manually execute the following command:
-ApkBuilder_s_Conflict_with_file_s=%1$s conflicts with another file already put at %2$s
-ApkBuilder_Packaging_s_into_s=Packaging %1$s into %2$s
-Proguard_Exec_Error=Error executing Proguard. Please check Proguard is present at %1$s
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/build/builders/BaseBuilder.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/build/builders/BaseBuilder.java
deleted file mode 100644
index 1625914..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/build/builders/BaseBuilder.java
+++ /dev/null
@@ -1,483 +0,0 @@
-/*
- * Copyright (C) 2007 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.build.builders;
-
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-import com.android.ide.common.sdk.LoadStatus;
-import com.android.ide.eclipse.adt.AdtConstants;
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.ide.eclipse.adt.internal.build.BuildHelper;
-import com.android.ide.eclipse.adt.internal.build.Messages;
-import com.android.ide.eclipse.adt.internal.preferences.AdtPrefs.BuildVerbosity;
-import com.android.ide.eclipse.adt.internal.project.BaseProjectHelper;
-import com.android.ide.eclipse.adt.internal.project.ProjectHelper;
-import com.android.ide.eclipse.adt.internal.project.XmlErrorHandler;
-import com.android.ide.eclipse.adt.internal.project.XmlErrorHandler.XmlErrorListener;
-import com.android.ide.eclipse.adt.internal.sdk.ProjectState;
-import com.android.ide.eclipse.adt.internal.sdk.Sdk;
-import com.android.ide.eclipse.adt.io.IFileWrapper;
-import com.android.io.IAbstractFile;
-import com.android.io.StreamException;
-import com.android.sdklib.BuildToolInfo;
-import com.android.sdklib.IAndroidTarget;
-import com.android.sdklib.repository.FullRevision;
-
-import org.eclipse.core.resources.IContainer;
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IFolder;
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IncrementalProjectBuilder;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.jobs.Job;
-import org.eclipse.jdt.core.IJavaProject;
-import org.xml.sax.SAXException;
-
-import java.util.ArrayList;
-
-import javax.xml.parsers.ParserConfigurationException;
-import javax.xml.parsers.SAXParser;
-import javax.xml.parsers.SAXParserFactory;
-
-/**
- * Base builder for XML files. This class allows for basic XML parsing with
- * error checking and marking the files for errors/warnings.
- */
-public abstract class BaseBuilder extends IncrementalProjectBuilder {
-
-    protected static final boolean DEBUG_LOG = "1".equals(              //$NON-NLS-1$
-            System.getenv("ANDROID_BUILD_DEBUG"));                      //$NON-NLS-1$
-
-    /** SAX Parser factory. */
-    private SAXParserFactory mParserFactory;
-
-    /**
-     * The build tool to use to build. This is guaranteed to be non null after a call to
-     * {@link #abortOnBadSetup(IJavaProject, ProjectState)} since this will throw if it can't be
-     * queried.
-     */
-    protected BuildToolInfo mBuildToolInfo;
-
-    /**
-     * Base Resource Delta Visitor to handle XML error
-     */
-    protected static class BaseDeltaVisitor implements XmlErrorListener {
-
-        /** The Xml builder used to validate XML correctness. */
-        protected BaseBuilder mBuilder;
-
-        /**
-         * XML error flag. if true, we keep parsing the ResourceDelta but the
-         * compilation will not happen (we're putting markers)
-         */
-        public boolean mXmlError = false;
-
-        public BaseDeltaVisitor(BaseBuilder builder) {
-            mBuilder = builder;
-        }
-
-        /**
-         * Finds a matching Source folder for the current path. This checks if the current path
-         * leads to, or is a source folder.
-         * @param sourceFolders The list of source folders
-         * @param pathSegments The segments of the current path
-         * @return The segments of the source folder, or null if no match was found
-         */
-        protected static String[] findMatchingSourceFolder(ArrayList<IPath> sourceFolders,
-                String[] pathSegments) {
-
-            for (IPath p : sourceFolders) {
-                // check if we are inside one of those source class path
-
-                // get the segments
-                String[] srcSegments = p.segments();
-
-                // compare segments. We want the path of the resource
-                // we're visiting to be
-                boolean valid = true;
-                int segmentCount = pathSegments.length;
-
-                for (int i = 0 ; i < segmentCount; i++) {
-                    String s1 = pathSegments[i];
-                    String s2 = srcSegments[i];
-
-                    if (s1.equalsIgnoreCase(s2) == false) {
-                        valid = false;
-                        break;
-                    }
-                }
-
-                if (valid) {
-                    // this folder, or one of this children is a source
-                    // folder!
-                    // we return its segments
-                    return srcSegments;
-                }
-            }
-
-            return null;
-        }
-
-        /**
-         * Sent when an XML error is detected.
-         * @see XmlErrorListener
-         */
-        @Override
-        public void errorFound() {
-            mXmlError = true;
-        }
-    }
-
-    protected static class AbortBuildException extends Exception {
-        private static final long serialVersionUID = 1L;
-    }
-
-    public BaseBuilder() {
-        super();
-        mParserFactory = SAXParserFactory.newInstance();
-
-        // FIXME when the compiled XML support for namespace is in, set this to true.
-        mParserFactory.setNamespaceAware(false);
-    }
-
-    /**
-     * Checks an Xml file for validity. Errors/warnings will be marked on the
-     * file
-     * @param resource the resource to check
-     * @param visitor a valid resource delta visitor
-     */
-    protected final void checkXML(IResource resource, BaseDeltaVisitor visitor) {
-
-        // first make sure this is an xml file
-        if (resource instanceof IFile) {
-            IFile file = (IFile)resource;
-
-            // remove previous markers
-            removeMarkersFromResource(file, AdtConstants.MARKER_XML);
-
-            // create  the error handler
-            XmlErrorHandler reporter = new XmlErrorHandler(file, visitor);
-            try {
-                // parse
-                getParser().parse(file.getContents(), reporter);
-            } catch (Exception e1) {
-            }
-        }
-    }
-
-    /**
-     * Returns the SAXParserFactory, instantiating it first if it's not already
-     * created.
-     * @return the SAXParserFactory object
-     * @throws ParserConfigurationException
-     * @throws SAXException
-     */
-    protected final SAXParser getParser() throws ParserConfigurationException,
-            SAXException {
-        return mParserFactory.newSAXParser();
-    }
-
-    /**
-     * Adds a marker to the current project.  This methods catches thrown {@link CoreException},
-     * and returns null instead.
-     *
-     * @param markerId The id of the marker to add.
-     * @param message the message associated with the mark
-     * @param severity the severity of the marker.
-     * @return the marker that was created (or null if failure)
-     * @see IMarker
-     */
-    protected final IMarker markProject(String markerId, String message, int severity) {
-        return BaseProjectHelper.markResource(getProject(), markerId, message, severity);
-    }
-
-    /**
-     * Removes markers from a resource and only the resource (not its children).
-     * @param file The file from which to delete the markers.
-     * @param markerId The id of the markers to remove. If null, all marker of
-     * type <code>IMarker.PROBLEM</code> will be removed.
-     */
-    public final void removeMarkersFromResource(IResource resource, String markerId) {
-        try {
-            if (resource.exists()) {
-                resource.deleteMarkers(markerId, true, IResource.DEPTH_ZERO);
-            }
-        } catch (CoreException ce) {
-            String msg = String.format(Messages.Marker_Delete_Error, markerId, resource.toString());
-            AdtPlugin.printErrorToConsole(getProject(), msg);
-        }
-    }
-
-    /**
-     * Removes markers from a container and its children.
-     * @param folder The container from which to delete the markers.
-     * @param markerId The id of the markers to remove. If null, all marker of
-     * type <code>IMarker.PROBLEM</code> will be removed.
-     */
-    protected final void removeMarkersFromContainer(IContainer folder, String markerId) {
-        try {
-            if (folder.exists()) {
-                folder.deleteMarkers(markerId, true, IResource.DEPTH_INFINITE);
-            }
-        } catch (CoreException ce) {
-            String msg = String.format(Messages.Marker_Delete_Error, markerId, folder.toString());
-            AdtPlugin.printErrorToConsole(getProject(), msg);
-        }
-    }
-
-    /**
-     * Get the stderr output of a process and return when the process is done.
-     * @param process The process to get the ouput from
-     * @param stdErr The array to store the stderr output
-     * @return the process return code.
-     * @throws InterruptedException
-     */
-    protected final int grabProcessOutput(final Process process,
-            final ArrayList<String> stdErr) throws InterruptedException {
-        return BuildHelper.grabProcessOutput(getProject(), process, stdErr);
-    }
-
-
-
-    /**
-     * Saves a String property into the persistent storage of the project.
-     * @param propertyName the name of the property. The id of the plugin is added to this string.
-     * @param value the value to save
-     * @return true if the save succeeded.
-     */
-    protected boolean saveProjectStringProperty(String propertyName, String value) {
-        IProject project = getProject();
-        return ProjectHelper.saveStringProperty(project, propertyName, value);
-    }
-
-
-    /**
-     * Loads a String property from the persistent storage of the project.
-     * @param propertyName the name of the property. The id of the plugin is added to this string.
-     * @return the property value or null if it was not found.
-     */
-    protected String loadProjectStringProperty(String propertyName) {
-        IProject project = getProject();
-        return ProjectHelper.loadStringProperty(project, propertyName);
-    }
-
-    /**
-     * Saves a property into the persistent storage of the project.
-     * @param propertyName the name of the property. The id of the plugin is added to this string.
-     * @param value the value to save
-     * @return true if the save succeeded.
-     */
-    protected boolean saveProjectBooleanProperty(String propertyName, boolean value) {
-        IProject project = getProject();
-        return ProjectHelper.saveStringProperty(project, propertyName, Boolean.toString(value));
-    }
-
-    /**
-     * Loads a boolean property from the persistent storage of the project.
-     * @param propertyName the name of the property. The id of the plugin is added to this string.
-     * @param defaultValue The default value to return if the property was not found.
-     * @return the property value or the default value if the property was not found.
-     */
-    protected boolean loadProjectBooleanProperty(String propertyName, boolean defaultValue) {
-        IProject project = getProject();
-        return ProjectHelper.loadBooleanProperty(project, propertyName, defaultValue);
-    }
-
-    /**
-     * Aborts the build if the SDK/project setups are broken. This does not
-     * display any errors.
-     *
-     * @param javaProject The {@link IJavaProject} being compiled.
-     * @param projectState the project state, optional. will be queried if null.
-     * @throws CoreException
-     */
-    protected void abortOnBadSetup(@NonNull IJavaProject javaProject,
-            @Nullable ProjectState projectState) throws AbortBuildException, CoreException {
-        IProject iProject = javaProject.getProject();
-        // check if we have finished loading the project target.
-        Sdk sdk = Sdk.getCurrent();
-        if (sdk == null) {
-            throw new AbortBuildException();
-        }
-
-        if (projectState == null) {
-            projectState = Sdk.getProjectState(javaProject.getProject());
-        }
-
-        // get the target for the project
-        IAndroidTarget target = projectState.getTarget();
-
-        if (target == null) {
-            throw new AbortBuildException();
-        }
-
-        // check on the target data.
-        if (sdk.checkAndLoadTargetData(target, javaProject) != LoadStatus.LOADED) {
-            throw new AbortBuildException();
-       }
-
-        mBuildToolInfo = projectState.getBuildToolInfo();
-        if (mBuildToolInfo == null) {
-            mBuildToolInfo = sdk.getLatestBuildTool();
-
-            if (mBuildToolInfo == null) {
-                AdtPlugin.printBuildToConsole(BuildVerbosity.VERBOSE, iProject,
-                        "No \"Build Tools\" package available; use SDK Manager to install one.");
-                throw new AbortBuildException();
-            } else {
-                AdtPlugin.printBuildToConsole(BuildVerbosity.VERBOSE, iProject,
-                        String.format("Using default Build Tools revision %s",
-                                mBuildToolInfo.getRevision())
-                        );
-            }
-        }
-
-        // abort if there are TARGET or ADT type markers
-        stopOnMarker(iProject, AdtConstants.MARKER_TARGET, IResource.DEPTH_ZERO,
-                false /*checkSeverity*/);
-        stopOnMarker(iProject, AdtConstants.MARKER_ADT, IResource.DEPTH_ZERO,
-                false /*checkSeverity*/);
-    }
-
-    protected void stopOnMarker(IProject project, String markerType, int depth,
-            boolean checkSeverity)
-            throws AbortBuildException {
-        try {
-            IMarker[] markers = project.findMarkers(markerType, false /*includeSubtypes*/, depth);
-
-            if (markers.length > 0) {
-                if (checkSeverity == false) {
-                    throw new AbortBuildException();
-                } else {
-                    for (IMarker marker : markers) {
-                        int severity = marker.getAttribute(IMarker.SEVERITY, -1 /*defaultValue*/);
-                        if (severity == IMarker.SEVERITY_ERROR) {
-                            throw new AbortBuildException();
-                        }
-                    }
-                }
-            }
-        } catch (CoreException e) {
-            // don't stop, something's really screwed up and the build will break later with
-            // a better error message.
-        }
-    }
-
-    /**
-     * Handles a {@link StreamException} by logging the info and marking the project.
-     * This should generally be followed by exiting the build process.
-     *
-     * @param e the exception
-     */
-    protected void handleStreamException(StreamException e) {
-        IAbstractFile file = e.getFile();
-
-        String msg;
-
-        IResource target = getProject();
-        if (file instanceof IFileWrapper) {
-            target = ((IFileWrapper) file).getIFile();
-
-            if (e.getError() == StreamException.Error.OUTOFSYNC) {
-                msg = "File is Out of sync";
-            } else {
-                msg = "Error reading file. Read log for details";
-            }
-
-        } else {
-            if (e.getError() == StreamException.Error.OUTOFSYNC) {
-                msg = String.format("Out of sync file: %s", file.getOsLocation());
-            } else {
-                msg = String.format("Error reading file %s. Read log for details",
-                        file.getOsLocation());
-            }
-        }
-
-        AdtPlugin.logAndPrintError(e, getProject().getName(), msg);
-        BaseProjectHelper.markResource(target, AdtConstants.MARKER_ADT, msg,
-                IMarker.SEVERITY_ERROR);
-    }
-
-    /**
-     * Handles a generic {@link Throwable} by logging the info and marking the project.
-     * This should generally be followed by exiting the build process.
-     *
-     * @param t the {@link Throwable}.
-     * @param message the message to log and to associate with the marker.
-     */
-    protected void handleException(Throwable t, String message) {
-        AdtPlugin.logAndPrintError(t, getProject().getName(), message);
-        markProject(AdtConstants.MARKER_ADT, message, IMarker.SEVERITY_ERROR);
-    }
-
-    /**
-     * Recursively delete all the derived resources from a root resource. The root resource is not
-     * deleted.
-     * @param rootResource the root resource
-     * @param monitor a progress monitor.
-     * @throws CoreException
-     *
-     */
-    protected void removeDerivedResources(IResource rootResource, IProgressMonitor monitor)
-            throws CoreException {
-        removeDerivedResources(rootResource, false, monitor);
-    }
-
-    /**
-     * delete a resource and its children. returns true if the root resource was deleted. All
-     * sub-folders *will* be deleted if they were emptied (not if they started empty).
-     * @param rootResource the root resource
-     * @param deleteRoot whether to delete the root folder.
-     * @param monitor a progress monitor.
-     * @throws CoreException
-     */
-    private void removeDerivedResources(IResource rootResource, boolean deleteRoot,
-            IProgressMonitor monitor) throws CoreException {
-        if (rootResource.exists()) {
-            // if it's a folder, delete derived member.
-            if (rootResource.getType() == IResource.FOLDER) {
-                IFolder folder = (IFolder)rootResource;
-                IResource[] members = folder.members();
-                boolean wasNotEmpty = members.length > 0;
-                for (IResource member : members) {
-                    removeDerivedResources(member, true /*deleteRoot*/, monitor);
-                }
-
-                // if the folder had content that is now all removed, delete the folder.
-                if (deleteRoot && wasNotEmpty && folder.members().length == 0) {
-                    rootResource.getLocation().toFile().delete();
-                }
-            }
-
-            // if the root resource is derived, delete it.
-            if (rootResource.isDerived()) {
-                rootResource.getLocation().toFile().delete();
-            }
-        }
-    }
-
-    protected void launchJob(Job newJob) {
-        newJob.setPriority(Job.BUILD);
-        newJob.setRule(ResourcesPlugin.getWorkspace().getRoot());
-        newJob.schedule();
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/build/builders/ChangedFileSet.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/build/builders/ChangedFileSet.java
deleted file mode 100644
index 4f5b47f..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/build/builders/ChangedFileSet.java
+++ /dev/null
@@ -1,70 +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.ide.eclipse.adt.internal.build.builders;
-
-import com.android.annotations.NonNull;
-
-import org.apache.tools.ant.types.selectors.SelectorUtils;
-import org.eclipse.core.runtime.IPath;
-
-/**
- * Collection of file path or path patterns to be checked for changes.
- *
- * All paths should be relative to the project they belong to.
- * Patterns can use Ant-type glob patterns.
- *
- * This is an immutable class that does not store any info beyond the list of paths. This is to
- * be used in conjunction with {@link PatternBasedDeltaVisitor}.
- */
-class ChangedFileSet {
-
-    private final String mLogName;
-
-    private final String[] mInputs;
-    private String mOutput;
-
-    ChangedFileSet(String logName, String... inputs) {
-        mLogName = logName;
-        mInputs = inputs;
-    }
-
-    public void setOutput(@NonNull String output) {
-        mOutput = output;
-    }
-
-    public boolean isInput(@NonNull String path, @NonNull IPath iPath) {
-        for (String i : mInputs) {
-            if (SelectorUtils.matchPath(i, path)) {
-                return true;
-            }
-        }
-
-        return false;
-    }
-
-    public boolean isOutput(@NonNull String path, @NonNull IPath iPath) {
-        if (mOutput != null) {
-            return SelectorUtils.matchPath(mOutput, path);
-        }
-
-        return false;
-    }
-
-    public String getLogName() {
-        return mLogName;
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/build/builders/ChangedFileSetHelper.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/build/builders/ChangedFileSetHelper.java
deleted file mode 100644
index 9fc19a7..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/build/builders/ChangedFileSetHelper.java
+++ /dev/null
@@ -1,200 +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.ide.eclipse.adt.internal.build.builders;
-
-import com.android.SdkConstants;
-import com.android.annotations.NonNull;
-import com.android.ide.eclipse.adt.AdtConstants;
-import com.android.ide.eclipse.adt.internal.project.BaseProjectHelper;
-
-import org.eclipse.core.resources.IFolder;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.IPath;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * Helper class to generate {@link ChangedFileSet} for given projects.
- *
- * Also contains non project specific {@link ChangedFileSet} such as {@link #MANIFEST}
- * and {@link #NATIVE_LIBS}
- */
-class ChangedFileSetHelper {
-
-    final static ChangedFileSet MANIFEST;
-    final static ChangedFileSet NATIVE_LIBS;
-
-    static {
-        MANIFEST = new ChangedFileSet("manifest",                                  //$NON-NLS-1$
-                SdkConstants.FN_ANDROID_MANIFEST_XML);
-
-        // FIXME: move compiled native libs to bin/libs/
-        NATIVE_LIBS = new ChangedFileSet(
-                "nativeLibs",
-                SdkConstants.FD_NATIVE_LIBS + "/*/*.so",                           //$NON-NLS-1$
-                SdkConstants.FD_NATIVE_LIBS + "/*/" + SdkConstants.FN_GDBSERVER);  //$NON-NLS-1$
-    }
-
-    /**
-     * Returns a ChangedFileSet for Java resources inside a given project's source folders.
-     * @param project the project.
-     * @return a ChangedFileSet
-     */
-    static ChangedFileSet getJavaResCfs(@NonNull IProject project) {
-
-        // get the source folder for the given project.
-        IPath projectPath = project.getFullPath();
-
-        // get the source folders.
-        List<IPath> srcPaths = BaseProjectHelper.getSourceClasspaths(project);
-        List<String> paths = new ArrayList<String>(srcPaths.size());
-
-        // create a pattern for each of them.
-        for (IPath path : srcPaths) {
-            paths.add(path.makeRelativeTo(projectPath).toString() + "/**");        //$NON-NLS-1$
-        }
-
-        // custom ChangedFileSet to ignore .java files.
-        return new JavaResChangedSet("javaRes",                                    //$NON-NLS-1$
-                paths.toArray(new String[paths.size()]));
-    }
-
-    /**
-     * Returns a {@link ChangedFileSet} for all the resources (included assets), and the output
-     * file (compiled resources
-     * @param project the project
-     * @return a ChangeFileSet
-     */
-    static ChangedFileSet getResCfs(@NonNull IProject project) {
-        // generated res is inside the project's android output folder
-        String path = getRelativeAndroidOut(project);
-
-        ChangedFileSet set = new ChangedFileSet(
-                "resources",                                                       //$NON-NLS-1$
-                SdkConstants.FD_RES + "/**",                                       //$NON-NLS-1$
-                SdkConstants.FD_ASSETS + "/**",                                    //$NON-NLS-1$
-                path + '/' + AdtConstants.WS_BIN_RELATIVE_BC + "/**");             //$NON-NLS-1$
-
-        // output file is based on the project's android output folder
-        set.setOutput(path + '/' + AdtConstants.FN_RESOURCES_AP_);
-
-        return set;
-    }
-
-    /**
-     * Returns a {@link ChangedFileSet} for all the resources (included assets), and the output
-     * file (compiled resources
-     * @param project the project
-     * @return a ChangeFileSet
-     */
-    static ChangedFileSet getMergedManifestCfs(@NonNull IProject project) {
-        // input path is inside the project's android output folder
-        String path = getRelativeAndroidOut(project);
-
-        ChangedFileSet set = new ChangedFileSet(
-                "mergedManifest",                                                 //$NON-NLS-1$
-                path + '/' + SdkConstants.FN_ANDROID_MANIFEST_XML);
-
-        return set;
-    }
-
-    /**
-     * Returns a {@link ChangedFileSet} for the generated R.txt file
-     * @param project the project
-     * @return a ChangeFileSet
-     */
-    static ChangedFileSet getTextSymbols(@NonNull IProject project) {
-        // input path is inside the project's android output folder
-        String path = getRelativeAndroidOut(project);
-
-        ChangedFileSet set = new ChangedFileSet(
-                "textSymbols",                                                   //$NON-NLS-1$
-                path + '/' + SdkConstants.FN_RESOURCE_TEXT);
-
-        return set;
-    }
-
-    /**
-     * Returns a {@link ChangedFileSet} for a project's javac output.
-     * @param project the project
-     * @return a ChangedFileSet
-     */
-    static ChangedFileSet getByteCodeCfs(@NonNull IProject project) {
-        // input pattern is based on the project's Java compiler's output folder
-        String path = getRelativeJavaCOut(project);
-
-        ChangedFileSet set = new ChangedFileSet("compiledCode",                   //$NON-NLS-1$
-                path + "/**/*" + SdkConstants.DOT_CLASS);                         //$NON-NLS-1$
-
-        return set;
-    }
-
-    /**
-     * Returns a {@link ChangedFileSet} for a project's complete resources, including
-     * generated resources and crunch cache.
-     * @param project the project
-     * @return a ChangeFileSet
-     */
-    static ChangedFileSet getFullResCfs(@NonNull IProject project) {
-        // generated res are in the project's android output folder
-        String path = getRelativeAndroidOut(project);
-
-        ChangedFileSet set = new ChangedFileSet("libResources",                   //$NON-NLS-1$
-                SdkConstants.FD_RES + "/**",                                      //$NON-NLS-1$
-                path + '/' + SdkConstants.FD_RES + "/**");                        //$NON-NLS-1$
-
-        return set;
-    }
-
-    /**
-     * Returns a {@link ChangedFileSet} for a project's whole code, including
-     * compiled bytecode, 3rd party libs, and the output file containing the Dalvik
-     * bytecode file.
-     * @param project the project
-     * @return a ChangeFileSet
-     */
-    static ChangedFileSet getCodeCfs(@NonNull IProject project) {
-        // input pattern is based on the project's Java compiler's output folder
-        String path = getRelativeJavaCOut(project);
-
-        ChangedFileSet set = new ChangedFileSet("classAndJars",                    //$NON-NLS-1$
-                path + "/**/*" + SdkConstants.DOT_CLASS,                           //$NON-NLS-1$
-                SdkConstants.FD_NATIVE_LIBS + "/*" + SdkConstants.DOT_JAR);        //$NON-NLS-1$
-
-        // output file is based on the project's android output folder
-        path = getRelativeAndroidOut(project);
-        set.setOutput(path + '/' + SdkConstants.FN_APK_CLASSES_DEX);
-
-        return set;
-    }
-
-    private static String getRelativePath(@NonNull IProject project, @NonNull IResource resource) {
-        return resource.getFullPath().makeRelativeTo(project.getFullPath()).toString();
-    }
-
-    private static String getRelativeAndroidOut(@NonNull IProject project) {
-        IFolder folder = BaseProjectHelper.getAndroidOutputFolder(project);
-        return getRelativePath(project, folder);
-    }
-
-    private static String getRelativeJavaCOut(@NonNull IProject project) {
-        IFolder folder = BaseProjectHelper.getJavaOutputFolder(project);
-        return getRelativePath(project, folder);
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/build/builders/JavaResChangedSet.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/build/builders/JavaResChangedSet.java
deleted file mode 100644
index 6b257ef..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/build/builders/JavaResChangedSet.java
+++ /dev/null
@@ -1,46 +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.ide.eclipse.adt.internal.build.builders;
-
-import com.android.annotations.NonNull;
-import com.android.sdklib.build.ApkBuilder;
-
-import org.eclipse.core.runtime.IPath;
-
-/**
- * Custom {@link ChangedFileSet} for java resources.
- *
- * This builds the set of inputs to be all the source folders of the given project,
- * and excludes files that won't be packaged.
- * This exclusion can't be easily described as a glob-pattern so it's overriding the default
- * behavior instead.
- *
- */
-class JavaResChangedSet extends ChangedFileSet {
-
-    JavaResChangedSet(String logName, String... inputs) {
-        super(logName, inputs);
-    }
-
-    @Override
-    public boolean isInput(@NonNull String path, @NonNull IPath iPath) {
-        if (!ApkBuilder.checkFileForPackaging(iPath.lastSegment(), iPath.getFileExtension())) {
-            return false;
-        }
-        return super.isInput(path, iPath);
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/build/builders/PatternBasedDeltaVisitor.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/build/builders/PatternBasedDeltaVisitor.java
deleted file mode 100644
index b52ede9..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/build/builders/PatternBasedDeltaVisitor.java
+++ /dev/null
@@ -1,139 +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.ide.eclipse.adt.internal.build.builders;
-
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.ide.eclipse.adt.internal.build.BuildHelper;
-
-import org.eclipse.core.resources.IFolder;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IResourceDelta;
-import org.eclipse.core.resources.IResourceDeltaVisitor;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IStatus;
-
-import java.util.ArrayList;
-import java.util.IdentityHashMap;
-import java.util.List;
-import java.util.Map;
-
-/**
- * Delta visitor checking changed files against given glob-patterns.
- *
- * The visitor is given {@link ChangedFileSet} objects which contains patterns to detect change
- * in input and output files. (Output files are only tested if the delta indicate the file
- * was removed).
- *
- * After the visitor has visited the whole delta, it can be queried to see which ChangedFileSet
- * recognized a file change. (ChangedFileSet are immutable and do not record this info).
- */
-class PatternBasedDeltaVisitor implements IResourceDeltaVisitor {
-
-    private final static boolean DEBUG_LOG = "1".equals(              //$NON-NLS-1$
-            System.getenv("ANDROID_VISITOR_DEBUG"));                  //$NON-NLS-1$
-
-    private final IProject mMainProject;
-    private final IProject mDeltaProject;
-
-    private final List<ChangedFileSet> mSets = new ArrayList<ChangedFileSet>();
-    private final Map<ChangedFileSet, Boolean> mResults =
-            new IdentityHashMap<ChangedFileSet, Boolean>();
-
-    private final String mLogName;
-
-    PatternBasedDeltaVisitor(IProject mainProject, IProject deltaProject, String logName) {
-        mMainProject = mainProject;
-        mDeltaProject = deltaProject;
-        mLogName = logName;
-        if (DEBUG_LOG) {
-            AdtPlugin.log(IStatus.INFO, "%s (%s): Delta for %s",               //$NON-NLS-1$
-                    mMainProject.getName(), mLogName, mDeltaProject.getName());
-        }
-    }
-
-    void addSet(ChangedFileSet bundle) {
-        mSets.add(bundle);
-    }
-
-    boolean checkSet(ChangedFileSet bundle) {
-        Boolean r = mResults.get(bundle);
-        if (r != null) {
-            return r.booleanValue();
-        }
-
-        return false;
-    }
-
-    @Override
-    public boolean visit(IResourceDelta delta) throws CoreException {
-        IResource resource = delta.getResource();
-
-        if (resource.getType() == IResource.FOLDER) {
-            // always visit the subfolders, unless the folder is not to be included
-            return BuildHelper.checkFolderForPackaging((IFolder)resource);
-
-        } else if (resource.getType() == IResource.FILE) {
-            IPath path = resource.getFullPath().makeRelativeTo(mDeltaProject.getFullPath());
-            String pathStr = path.toString();
-
-            // FIXME: no need to loop through all the sets once they have all said they need something (return false below and above)
-            for (ChangedFileSet set : mSets) {
-                // FIXME: should ignore sets that have already returned true.
-
-                if (set.isInput(pathStr, path)) {
-                    mResults.put(set, Boolean.TRUE);
-
-                    if (DEBUG_LOG) {
-                        String cfs_logName = set.getLogName();
-
-                        if (cfs_logName != null) {
-                            AdtPlugin.log(IStatus.INFO, "%s (%s:%s): %s",              //$NON-NLS-1$
-                                    mMainProject.getName(), mLogName, cfs_logName,
-                                    resource.getFullPath().toString());
-                        } else {
-                            AdtPlugin.log(IStatus.INFO, "%s (%s): %s",                 //$NON-NLS-1$
-                                    mMainProject.getName(), mLogName,
-                                    resource.getFullPath().toString());
-                        }
-                    }
-
-                } else if (delta.getKind() == IResourceDelta.REMOVED &&
-                        set.isOutput(pathStr, path)) {
-                    mResults.put(set, Boolean.TRUE);
-
-                    if (DEBUG_LOG) {
-                        String cfs_logName = set.getLogName();
-
-                        if (cfs_logName != null) {
-                            AdtPlugin.log(IStatus.INFO, "%s (%s:%s): %s",              //$NON-NLS-1$
-                                    mMainProject.getName(), mLogName, cfs_logName,
-                                    resource.getFullPath().toString());
-                        } else {
-                            AdtPlugin.log(IStatus.INFO, "%s (%s): %s",                 //$NON-NLS-1$
-                                    mMainProject.getName(), mLogName,
-                                    resource.getFullPath().toString());
-                        }
-                    }
-                }
-            }
-        }
-
-        return true;
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/build/builders/PostCompilerBuilder.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/build/builders/PostCompilerBuilder.java
deleted file mode 100644
index 8aacb44..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/build/builders/PostCompilerBuilder.java
+++ /dev/null
@@ -1,946 +0,0 @@
-/*
- * Copyright (C) 2007 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.build.builders;
-
-import com.android.SdkConstants;
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-import com.android.ide.eclipse.adt.AdtConstants;
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.ide.eclipse.adt.AndroidPrintStream;
-import com.android.ide.eclipse.adt.internal.build.AaptExecException;
-import com.android.ide.eclipse.adt.internal.build.AaptParser;
-import com.android.ide.eclipse.adt.internal.build.AaptResultException;
-import com.android.ide.eclipse.adt.internal.build.BuildHelper;
-import com.android.ide.eclipse.adt.internal.build.BuildHelper.ResourceMarker;
-import com.android.ide.eclipse.adt.internal.build.DexException;
-import com.android.ide.eclipse.adt.internal.build.Messages;
-import com.android.ide.eclipse.adt.internal.build.NativeLibInJarException;
-import com.android.ide.eclipse.adt.internal.lint.LintDeltaProcessor;
-import com.android.ide.eclipse.adt.internal.preferences.AdtPrefs;
-import com.android.ide.eclipse.adt.internal.preferences.AdtPrefs.BuildVerbosity;
-import com.android.ide.eclipse.adt.internal.project.ApkInstallManager;
-import com.android.ide.eclipse.adt.internal.project.BaseProjectHelper;
-import com.android.ide.eclipse.adt.internal.project.LibraryClasspathContainerInitializer;
-import com.android.ide.eclipse.adt.internal.project.ProjectHelper;
-import com.android.ide.eclipse.adt.internal.resources.manager.ResourceManager;
-import com.android.ide.eclipse.adt.internal.sdk.ProjectState;
-import com.android.ide.eclipse.adt.internal.sdk.Sdk;
-import com.android.ide.eclipse.adt.io.IFileWrapper;
-import com.android.prefs.AndroidLocation.AndroidLocationException;
-import com.android.sdklib.build.ApkBuilder;
-import com.android.sdklib.build.ApkCreationException;
-import com.android.sdklib.build.DuplicateFileException;
-import com.android.sdklib.build.IArchiveBuilder;
-import com.android.sdklib.build.SealedApkException;
-import com.android.sdklib.internal.build.DebugKeyProvider.KeytoolException;
-import com.android.xml.AndroidManifest;
-
-import org.eclipse.core.resources.IContainer;
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IFolder;
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IResourceDelta;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.jdt.core.IJavaModelMarker;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.JavaCore;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
-import java.util.Map;
-import java.util.jar.Attributes;
-import java.util.jar.JarEntry;
-import java.util.jar.JarOutputStream;
-import java.util.jar.Manifest;
-import java.util.regex.Pattern;
-
-public class PostCompilerBuilder extends BaseBuilder {
-
-    /** This ID is used in plugin.xml and in each project's .project file.
-     * It cannot be changed even if the class is renamed/moved */
-    public static final String ID = "com.android.ide.eclipse.adt.ApkBuilder"; //$NON-NLS-1$
-
-    private static final String PROPERTY_CONVERT_TO_DEX = "convertToDex"; //$NON-NLS-1$
-    private static final String PROPERTY_PACKAGE_RESOURCES = "packageResources"; //$NON-NLS-1$
-    private static final String PROPERTY_BUILD_APK = "buildApk"; //$NON-NLS-1$
-
-    /** Flag to pass to PostCompiler builder that sets if it runs or not.
-     *  Set this flag whenever calling build if PostCompiler is to run
-     */
-    public final static String POST_C_REQUESTED = "RunPostCompiler"; //$NON-NLS-1$
-
-    /**
-     * Dex conversion flag. This is set to true if one of the changed/added/removed
-     * file is a .class file. Upon visiting all the delta resource, if this
-     * flag is true, then we know we'll have to make the "classes.dex" file.
-     */
-    private boolean mConvertToDex = false;
-
-    /**
-     * Package resources flag. This is set to true if one of the changed/added/removed
-     * file is a resource file. Upon visiting all the delta resource, if
-     * this flag is true, then we know we'll have to repackage the resources.
-     */
-    private boolean mPackageResources = false;
-
-    /**
-     * Final package build flag.
-     */
-    private boolean mBuildFinalPackage = false;
-
-    private AndroidPrintStream mOutStream = null;
-    private AndroidPrintStream mErrStream = null;
-
-
-    private ResourceMarker mResourceMarker = new ResourceMarker() {
-        @Override
-        public void setWarning(IResource resource, String message) {
-            BaseProjectHelper.markResource(resource, AdtConstants.MARKER_PACKAGING,
-                    message, IMarker.SEVERITY_WARNING);
-        }
-    };
-
-
-    public PostCompilerBuilder() {
-        super();
-    }
-
-    @Override
-    protected void clean(IProgressMonitor monitor) throws CoreException {
-        super.clean(monitor);
-
-        // Get the project.
-        IProject project = getProject();
-
-        if (DEBUG_LOG) {
-            AdtPlugin.log(IStatus.INFO, "%s CLEAN(POST)", project.getName());
-        }
-
-        // Clear the project of the generic markers
-        removeMarkersFromContainer(project, AdtConstants.MARKER_AAPT_PACKAGE);
-        removeMarkersFromContainer(project, AdtConstants.MARKER_PACKAGING);
-
-        // also remove the files in the output folder (but not the Eclipse output folder).
-        IFolder javaOutput = BaseProjectHelper.getJavaOutputFolder(project);
-        IFolder androidOutput = BaseProjectHelper.getAndroidOutputFolder(project);
-
-        if (javaOutput.equals(androidOutput) == false) {
-            // get the content
-            IResource[] members = androidOutput.members();
-            for (IResource member : members) {
-                if (member.equals(javaOutput) == false) {
-                    member.delete(true /*force*/, monitor);
-                }
-            }
-        }
-    }
-
-    // build() returns a list of project from which this project depends for future compilation.
-    @Override
-    protected IProject[] build(
-            int kind,
-            @SuppressWarnings("rawtypes") Map args,
-            IProgressMonitor monitor)
-            throws CoreException {
-        // get a project object
-        IProject project = getProject();
-
-        if (DEBUG_LOG) {
-            AdtPlugin.log(IStatus.INFO, "%s BUILD(POST)", project.getName());
-        }
-
-        // Benchmarking start
-        long startBuildTime = 0;
-        if (BuildHelper.BENCHMARK_FLAG) {
-            // End JavaC Timer
-            String msg = "BENCHMARK ADT: Ending Compilation \n BENCHMARK ADT: Time Elapsed: " +    //$NON-NLS-1$
-                         (System.nanoTime() - BuildHelper.sStartJavaCTime)/Math.pow(10, 6) + "ms"; //$NON-NLS-1$
-            AdtPlugin.printBuildToConsole(BuildVerbosity.ALWAYS, project, msg);
-            msg = "BENCHMARK ADT: Starting PostCompilation";                                       //$NON-NLS-1$
-            AdtPlugin.printBuildToConsole(BuildVerbosity.ALWAYS, project, msg);
-            startBuildTime = System.nanoTime();
-        }
-
-        // list of referenced projects. This is a mix of java projects and library projects
-        // and is computed below.
-        IProject[] allRefProjects = null;
-
-        try {
-            // get the project info
-            ProjectState projectState = Sdk.getProjectState(project);
-
-            // this can happen if the project has no project.properties.
-            if (projectState == null) {
-                return null;
-            }
-
-            boolean isLibrary = projectState.isLibrary();
-
-            // get the libraries
-            List<IProject> libProjects = projectState.getFullLibraryProjects();
-
-            IJavaProject javaProject = JavaCore.create(project);
-
-            // get the list of referenced projects.
-            List<IProject> javaProjects = ProjectHelper.getReferencedProjects(project);
-            List<IJavaProject> referencedJavaProjects = BuildHelper.getJavaProjects(
-                    javaProjects);
-
-            // mix the java project and the library projects
-            final int size = libProjects.size() + javaProjects.size();
-            ArrayList<IProject> refList = new ArrayList<IProject>(size);
-            refList.addAll(libProjects);
-            refList.addAll(javaProjects);
-            allRefProjects = refList.toArray(new IProject[size]);
-
-            // get the android output folder
-            IFolder androidOutputFolder = BaseProjectHelper.getAndroidOutputFolder(project);
-            IFolder resOutputFolder = androidOutputFolder.getFolder(SdkConstants.FD_RES);
-
-            // First thing we do is go through the resource delta to not
-            // lose it if we have to abort the build for any reason.
-            if (args.containsKey(POST_C_REQUESTED)
-                    && AdtPrefs.getPrefs().getBuildSkipPostCompileOnFileSave()) {
-                // Skip over flag setting
-            } else if (kind == FULL_BUILD) {
-                AdtPlugin.printBuildToConsole(BuildVerbosity.VERBOSE, project,
-                        Messages.Start_Full_Apk_Build);
-
-                if (DEBUG_LOG) {
-                    AdtPlugin.log(IStatus.INFO, "%s full build!", project.getName());
-                }
-
-                // Full build: we do all the steps.
-                mPackageResources = true;
-                mConvertToDex = true;
-                mBuildFinalPackage = true;
-            } else {
-                AdtPlugin.printBuildToConsole(BuildVerbosity.VERBOSE, project,
-                        Messages.Start_Inc_Apk_Build);
-
-                // go through the resources and see if something changed.
-                IResourceDelta delta = getDelta(project);
-                if (delta == null) {
-                    // no delta? Same as full build: we do all the steps.
-                    mPackageResources = true;
-                    mConvertToDex = true;
-                    mBuildFinalPackage = true;
-                } else {
-
-                    if (ResourceManager.isAutoBuilding() && AdtPrefs.getPrefs().isLintOnSave()) {
-                        // Check for errors on save/build, if enabled
-                        LintDeltaProcessor.create().process(delta);
-                    }
-
-                    PatternBasedDeltaVisitor dv = new PatternBasedDeltaVisitor(
-                            project, project,
-                            "POST:Main");
-
-                    ChangedFileSet manifestCfs = ChangedFileSetHelper.getMergedManifestCfs(project);
-                    dv.addSet(manifestCfs);
-
-                    ChangedFileSet resCfs = ChangedFileSetHelper.getResCfs(project);
-                    dv.addSet(resCfs);
-
-                    ChangedFileSet androidCodeCfs = ChangedFileSetHelper.getCodeCfs(project);
-                    dv.addSet(androidCodeCfs);
-
-                    ChangedFileSet javaResCfs = ChangedFileSetHelper.getJavaResCfs(project);
-                    dv.addSet(javaResCfs);
-                    dv.addSet(ChangedFileSetHelper.NATIVE_LIBS);
-
-                    delta.accept(dv);
-
-                    // save the state
-                    mPackageResources |= dv.checkSet(manifestCfs) || dv.checkSet(resCfs);
-
-                    mConvertToDex |= dv.checkSet(androidCodeCfs);
-
-                    mBuildFinalPackage |= dv.checkSet(javaResCfs) ||
-                            dv.checkSet(ChangedFileSetHelper.NATIVE_LIBS);
-                }
-
-                // check the libraries
-                if (libProjects.size() > 0) {
-                    for (IProject libProject : libProjects) {
-                        delta = getDelta(libProject);
-                        if (delta != null) {
-                            PatternBasedDeltaVisitor visitor = new PatternBasedDeltaVisitor(
-                                    project, libProject,
-                                    "POST:Lib");
-
-                            ChangedFileSet libResCfs = ChangedFileSetHelper.getFullResCfs(
-                                    libProject);
-                            visitor.addSet(libResCfs);
-                            visitor.addSet(ChangedFileSetHelper.NATIVE_LIBS);
-                            // FIXME: add check on the library.jar?
-
-                            delta.accept(visitor);
-
-                            mPackageResources |= visitor.checkSet(libResCfs);
-                            mBuildFinalPackage |= visitor.checkSet(
-                                    ChangedFileSetHelper.NATIVE_LIBS);
-                        }
-                    }
-                }
-
-                // also go through the delta for all the referenced projects
-                final int referencedCount = referencedJavaProjects.size();
-                for (int i = 0 ; i < referencedCount; i++) {
-                    IJavaProject referencedJavaProject = referencedJavaProjects.get(i);
-                    delta = getDelta(referencedJavaProject.getProject());
-                    if (delta != null) {
-                        IProject referencedProject = referencedJavaProject.getProject();
-                        PatternBasedDeltaVisitor visitor = new PatternBasedDeltaVisitor(
-                                project, referencedProject,
-                                "POST:RefedProject");
-
-                        ChangedFileSet javaResCfs = ChangedFileSetHelper.getJavaResCfs(referencedProject);
-                        visitor.addSet(javaResCfs);
-
-                        ChangedFileSet bytecodeCfs = ChangedFileSetHelper.getByteCodeCfs(referencedProject);
-                        visitor.addSet(bytecodeCfs);
-
-                        delta.accept(visitor);
-
-                        // save the state
-                        mConvertToDex |= visitor.checkSet(bytecodeCfs);
-                        mBuildFinalPackage |= visitor.checkSet(javaResCfs);
-                    }
-                }
-            }
-
-            // store the build status in the persistent storage
-            saveProjectBooleanProperty(PROPERTY_CONVERT_TO_DEX, mConvertToDex);
-            saveProjectBooleanProperty(PROPERTY_PACKAGE_RESOURCES, mPackageResources);
-            saveProjectBooleanProperty(PROPERTY_BUILD_APK, mBuildFinalPackage);
-
-            // Top level check to make sure the build can move forward. Only do this after recording
-            // delta changes.
-            abortOnBadSetup(javaProject, projectState);
-
-            // Get the output stream. Since the builder is created for the life of the
-            // project, they can be kept around.
-            if (mOutStream == null) {
-                mOutStream = new AndroidPrintStream(project, null /*prefix*/,
-                        AdtPlugin.getOutStream());
-                mErrStream = new AndroidPrintStream(project, null /*prefix*/,
-                        AdtPlugin.getOutStream());
-            }
-
-            // remove older packaging markers.
-            removeMarkersFromContainer(javaProject.getProject(), AdtConstants.MARKER_PACKAGING);
-
-            // finished with the common init and tests. Special case of the library.
-            if (isLibrary) {
-                // check the jar output file is present, if not create it.
-                IFile jarIFile = androidOutputFolder.getFile(
-                        project.getName().toLowerCase() + SdkConstants.DOT_JAR);
-                if (mConvertToDex == false && jarIFile.exists() == false) {
-                    mConvertToDex = true;
-                }
-
-                // also update the crunch cache always since aapt does it smartly only
-                // on the files that need it.
-                if (DEBUG_LOG) {
-                    AdtPlugin.log(IStatus.INFO, "%s running crunch!", project.getName());
-                }
-                BuildHelper helper = new BuildHelper(
-                        projectState,
-                        mBuildToolInfo,
-                        mOutStream, mErrStream,
-                        false /*jumbo mode doesn't matter here*/,
-                        false /*dex merger doesn't matter here*/,
-                        true /*debugMode*/,
-                        AdtPrefs.getPrefs().getBuildVerbosity() == BuildVerbosity.VERBOSE,
-                        mResourceMarker);
-                updateCrunchCache(project, helper);
-
-                // refresh recursively bin/res folder
-                resOutputFolder.refreshLocal(IResource.DEPTH_INFINITE, monitor);
-
-                if (mConvertToDex) { // in this case this means some class files changed and
-                                     // we need to update the jar file.
-                    if (DEBUG_LOG) {
-                        AdtPlugin.log(IStatus.INFO, "%s updating jar!", project.getName());
-                    }
-
-                    // resource to the AndroidManifest.xml file
-                    IFile manifestFile = project.getFile(SdkConstants.FN_ANDROID_MANIFEST_XML);
-                    String appPackage = AndroidManifest.getPackage(new IFileWrapper(manifestFile));
-
-                    IFolder javaOutputFolder = BaseProjectHelper.getJavaOutputFolder(project);
-
-                    writeLibraryPackage(jarIFile, project, appPackage, javaOutputFolder);
-                    saveProjectBooleanProperty(PROPERTY_CONVERT_TO_DEX, mConvertToDex = false);
-
-                    // refresh the bin folder content with no recursion to update the library
-                    // jar file.
-                    androidOutputFolder.refreshLocal(IResource.DEPTH_ONE, monitor);
-
-                    // Also update the projects. The only way to force recompile them is to
-                    // reset the library container.
-                    List<ProjectState> parentProjects = projectState.getParentProjects();
-                    LibraryClasspathContainerInitializer.updateProject(parentProjects);
-                }
-
-                return allRefProjects;
-            }
-
-            // Check to see if we're going to launch or export. If not, we can skip
-            // the packaging and dexing process.
-            if (!args.containsKey(POST_C_REQUESTED)
-                    && AdtPrefs.getPrefs().getBuildSkipPostCompileOnFileSave()) {
-                AdtPlugin.printBuildToConsole(BuildVerbosity.VERBOSE, project,
-                        Messages.Skip_Post_Compiler);
-                return allRefProjects;
-            } else {
-                AdtPlugin.printBuildToConsole(BuildVerbosity.VERBOSE, project,
-                        Messages.Start_Full_Post_Compiler);
-            }
-
-            // first thing we do is check that the SDK directory has been setup.
-            String osSdkFolder = AdtPlugin.getOsSdkFolder();
-
-            if (osSdkFolder.length() == 0) {
-                // this has already been checked in the precompiler. Therefore,
-                // while we do have to cancel the build, we don't have to return
-                // any error or throw anything.
-                return allRefProjects;
-            }
-
-            // do some extra check, in case the output files are not present. This
-            // will force to recreate them.
-            IResource tmp = null;
-
-            if (mPackageResources == false) {
-                // check the full resource package
-                tmp = androidOutputFolder.findMember(AdtConstants.FN_RESOURCES_AP_);
-                if (tmp == null || tmp.exists() == false) {
-                    mPackageResources = true;
-                }
-            }
-
-            // check classes.dex is present. If not we force to recreate it.
-            if (mConvertToDex == false) {
-                tmp = androidOutputFolder.findMember(SdkConstants.FN_APK_CLASSES_DEX);
-                if (tmp == null || tmp.exists() == false) {
-                    mConvertToDex = true;
-                }
-            }
-
-            // also check the final file(s)!
-            String finalPackageName = ProjectHelper.getApkFilename(project, null /*config*/);
-            if (mBuildFinalPackage == false) {
-                tmp = androidOutputFolder.findMember(finalPackageName);
-                if (tmp == null || (tmp instanceof IFile &&
-                        tmp.exists() == false)) {
-                    String msg = String.format(Messages.s_Missing_Repackaging, finalPackageName);
-                    AdtPlugin.printBuildToConsole(BuildVerbosity.VERBOSE, project, msg);
-                    mBuildFinalPackage = true;
-                }
-            }
-
-            // at this point we know if we need to recreate the temporary apk
-            // or the dex file, but we don't know if we simply need to recreate them
-            // because they are missing
-
-            // refresh the output directory first
-            IContainer ic = androidOutputFolder.getParent();
-            if (ic != null) {
-                ic.refreshLocal(IResource.DEPTH_ONE, monitor);
-            }
-
-            // we need to test all three, as we may need to make the final package
-            // but not the intermediary ones.
-            if (mPackageResources || mConvertToDex || mBuildFinalPackage) {
-                String forceJumboStr = projectState.getProperty(
-                        AdtConstants.DEX_OPTIONS_FORCEJUMBO);
-                Boolean jumbo = Boolean.valueOf(forceJumboStr);
-
-                String dexMergerStr = projectState.getProperty(
-                        AdtConstants.DEX_OPTIONS_DISABLE_MERGER);
-                Boolean dexMerger = Boolean.valueOf(dexMergerStr);
-
-                BuildHelper helper = new BuildHelper(
-                        projectState,
-                        mBuildToolInfo,
-                        mOutStream, mErrStream,
-                        jumbo.booleanValue(),
-                        dexMerger.booleanValue(),
-                        true /*debugMode*/,
-                        AdtPrefs.getPrefs().getBuildVerbosity() == BuildVerbosity.VERBOSE,
-                        mResourceMarker);
-
-                IPath androidBinLocation = androidOutputFolder.getLocation();
-                if (androidBinLocation == null) {
-                    markProject(AdtConstants.MARKER_PACKAGING, Messages.Output_Missing,
-                            IMarker.SEVERITY_ERROR);
-                    return allRefProjects;
-                }
-                String osAndroidBinPath = androidBinLocation.toOSString();
-
-                // resource to the AndroidManifest.xml file
-                IFile manifestFile = androidOutputFolder.getFile(
-                        SdkConstants.FN_ANDROID_MANIFEST_XML);
-
-                if (manifestFile == null || manifestFile.exists() == false) {
-                    // mark project and exit
-                    String msg = String.format(Messages.s_File_Missing,
-                            SdkConstants.FN_ANDROID_MANIFEST_XML);
-                    markProject(AdtConstants.MARKER_PACKAGING, msg, IMarker.SEVERITY_ERROR);
-                    return allRefProjects;
-                }
-
-                // Remove the old .apk.
-                // This make sure that if the apk is corrupted, then dx (which would attempt
-                // to open it), will not fail.
-                String osFinalPackagePath = osAndroidBinPath + File.separator + finalPackageName;
-                File finalPackage = new File(osFinalPackagePath);
-
-                // if delete failed, this is not really a problem, as the final package generation
-                // handle already present .apk, and if that one failed as well, the user will be
-                // notified.
-                finalPackage.delete();
-
-                // Check if we need to package the resources.
-                if (mPackageResources) {
-                    // also update the crunch cache always since aapt does it smartly only
-                    // on the files that need it.
-                    if (DEBUG_LOG) {
-                        AdtPlugin.log(IStatus.INFO, "%s running crunch!", project.getName());
-                    }
-                    if (updateCrunchCache(project, helper) == false) {
-                        return allRefProjects;
-                    }
-
-                    // refresh recursively bin/res folder
-                    resOutputFolder.refreshLocal(IResource.DEPTH_INFINITE, monitor);
-
-                    if (DEBUG_LOG) {
-                        AdtPlugin.log(IStatus.INFO, "%s packaging resources!", project.getName());
-                    }
-                    // remove some aapt_package only markers.
-                    removeMarkersFromContainer(project, AdtConstants.MARKER_AAPT_PACKAGE);
-
-                    try {
-                        helper.packageResources(manifestFile, libProjects, null /*resfilter*/,
-                                0 /*versionCode */, osAndroidBinPath,
-                                AdtConstants.FN_RESOURCES_AP_);
-                    } catch (AaptExecException e) {
-                        BaseProjectHelper.markResource(project, AdtConstants.MARKER_PACKAGING,
-                                e.getMessage(), IMarker.SEVERITY_ERROR);
-                        return allRefProjects;
-                    } catch (AaptResultException e) {
-                        // attempt to parse the error output
-                        String[] aaptOutput = e.getOutput();
-                        boolean parsingError = AaptParser.parseOutput(aaptOutput, project);
-
-                        // if we couldn't parse the output we display it in the console.
-                        if (parsingError) {
-                            AdtPlugin.printErrorToConsole(project, (Object[]) aaptOutput);
-
-                            // if the exec failed, and we couldn't parse the error output (and
-                            // therefore not all files that should have been marked, were marked),
-                            // we put a generic marker on the project and abort.
-                            BaseProjectHelper.markResource(project,
-                                    AdtConstants.MARKER_PACKAGING,
-                                    Messages.Unparsed_AAPT_Errors,
-                                    IMarker.SEVERITY_ERROR);
-                        }
-                    }
-
-                    // build has been done. reset the state of the builder
-                    mPackageResources = false;
-
-                    // and store it
-                    saveProjectBooleanProperty(PROPERTY_PACKAGE_RESOURCES, mPackageResources);
-                }
-
-                String classesDexPath = osAndroidBinPath + File.separator +
-                        SdkConstants.FN_APK_CLASSES_DEX;
-
-                // then we check if we need to package the .class into classes.dex
-                if (mConvertToDex) {
-                    if (DEBUG_LOG) {
-                        AdtPlugin.log(IStatus.INFO, "%s running dex!", project.getName());
-                    }
-                    try {
-                        Collection<String> dxInputPaths = helper.getCompiledCodePaths();
-
-                        helper.executeDx(javaProject, dxInputPaths, classesDexPath);
-                    } catch (DexException e) {
-                        String message = e.getMessage();
-
-                        AdtPlugin.printErrorToConsole(project, message);
-                        BaseProjectHelper.markResource(project, AdtConstants.MARKER_PACKAGING,
-                                message, IMarker.SEVERITY_ERROR);
-
-                        Throwable cause = e.getCause();
-
-                        if (cause instanceof NoClassDefFoundError
-                                || cause instanceof NoSuchMethodError) {
-                            AdtPlugin.printErrorToConsole(project, Messages.Incompatible_VM_Warning,
-                                    Messages.Requires_1_5_Error);
-                        }
-
-                        // dx failed, we return
-                        return allRefProjects;
-                    }
-
-                    // build has been done. reset the state of the builder
-                    mConvertToDex = false;
-
-                    // and store it
-                    saveProjectBooleanProperty(PROPERTY_CONVERT_TO_DEX, mConvertToDex);
-                }
-
-                // now we need to make the final package from the intermediary apk
-                // and classes.dex.
-                // This is the default package with all the resources.
-
-                try {
-                    if (DEBUG_LOG) {
-                        AdtPlugin.log(IStatus.INFO, "%s making final package!", project.getName());
-                    }
-                    helper.finalDebugPackage(
-                            osAndroidBinPath + File.separator + AdtConstants.FN_RESOURCES_AP_,
-                        classesDexPath, osFinalPackagePath, libProjects, mResourceMarker);
-                } catch (KeytoolException e) {
-                    String eMessage = e.getMessage();
-
-                    // mark the project with the standard message
-                    String msg = String.format(Messages.Final_Archive_Error_s, eMessage);
-                    BaseProjectHelper.markResource(project, AdtConstants.MARKER_PACKAGING, msg,
-                            IMarker.SEVERITY_ERROR);
-
-                    // output more info in the console
-                    AdtPlugin.printErrorToConsole(project,
-                            msg,
-                            String.format(Messages.ApkBuilder_JAVA_HOME_is_s, e.getJavaHome()),
-                            Messages.ApkBuilder_Update_or_Execute_manually_s,
-                            e.getCommandLine());
-
-                    AdtPlugin.log(e, msg);
-
-                    return allRefProjects;
-                } catch (ApkCreationException e) {
-                    String eMessage = e.getMessage();
-
-                    // mark the project with the standard message
-                    String msg = String.format(Messages.Final_Archive_Error_s, eMessage);
-                    BaseProjectHelper.markResource(project, AdtConstants.MARKER_PACKAGING, msg,
-                            IMarker.SEVERITY_ERROR);
-
-                    AdtPlugin.log(e, msg);
-                } catch (AndroidLocationException e) {
-                    String eMessage = e.getMessage();
-
-                    // mark the project with the standard message
-                    String msg = String.format(Messages.Final_Archive_Error_s, eMessage);
-                    BaseProjectHelper.markResource(project, AdtConstants.MARKER_PACKAGING, msg,
-                            IMarker.SEVERITY_ERROR);
-                    AdtPlugin.log(e, msg);
-                } catch (NativeLibInJarException e) {
-                    String msg = e.getMessage();
-
-                    BaseProjectHelper.markResource(project, AdtConstants.MARKER_PACKAGING,
-                            msg, IMarker.SEVERITY_ERROR);
-
-                    AdtPlugin.printErrorToConsole(project, (Object[]) e.getAdditionalInfo());
-                } catch (CoreException e) {
-                    // mark project and return
-                    String msg = String.format(Messages.Final_Archive_Error_s, e.getMessage());
-                    AdtPlugin.printErrorToConsole(project, msg);
-                    BaseProjectHelper.markResource(project, AdtConstants.MARKER_PACKAGING, msg,
-                            IMarker.SEVERITY_ERROR);
-                    AdtPlugin.log(e, msg);
-                } catch (DuplicateFileException e) {
-                    String msg1 = String.format(
-                            "Found duplicate file for APK: %1$s\nOrigin 1: %2$s\nOrigin 2: %3$s",
-                            e.getArchivePath(), e.getFile1(), e.getFile2());
-                    String msg2 = String.format(Messages.Final_Archive_Error_s, msg1);
-                    AdtPlugin.printErrorToConsole(project, msg2);
-                    BaseProjectHelper.markResource(project, AdtConstants.MARKER_PACKAGING, msg2,
-                            IMarker.SEVERITY_ERROR);
-                }
-
-                // we are done.
-
-                // refresh the bin folder content with no recursion.
-                androidOutputFolder.refreshLocal(IResource.DEPTH_ONE, monitor);
-
-                // build has been done. reset the state of the builder
-                mBuildFinalPackage = false;
-
-                // and store it
-                saveProjectBooleanProperty(PROPERTY_BUILD_APK, mBuildFinalPackage);
-
-                // reset the installation manager to force new installs of this project
-                ApkInstallManager.getInstance().resetInstallationFor(project);
-
-                AdtPlugin.printBuildToConsole(BuildVerbosity.VERBOSE, getProject(),
-                        "Build Success!");
-            }
-        } catch (AbortBuildException e) {
-            return allRefProjects;
-        } catch (Exception exception) {
-            // try to catch other exception to actually display an error. This will be useful
-            // if we get an NPE or something so that we can at least notify the user that something
-            // went wrong.
-
-            // first check if this is a CoreException we threw to cancel the build.
-            if (exception instanceof CoreException) {
-                if (((CoreException)exception).getStatus().getSeverity() == IStatus.CANCEL) {
-                    // Project is already marked with an error. Nothing to do
-                    return allRefProjects;
-                }
-            }
-
-            String msg = exception.getMessage();
-            if (msg == null) {
-                msg = exception.getClass().getCanonicalName();
-            }
-
-            msg = String.format("Unknown error: %1$s", msg);
-            AdtPlugin.logAndPrintError(exception, project.getName(), msg);
-            markProject(AdtConstants.MARKER_PACKAGING, msg, IMarker.SEVERITY_ERROR);
-        }
-
-        // Benchmarking end
-        if (BuildHelper.BENCHMARK_FLAG) {
-            String msg = "BENCHMARK ADT: Ending PostCompilation. \n BENCHMARK ADT: Time Elapsed: " + //$NON-NLS-1$
-                         ((System.nanoTime() - startBuildTime)/Math.pow(10, 6)) + "ms";              //$NON-NLS-1$
-            AdtPlugin.printBuildToConsole(BuildVerbosity.ALWAYS, project, msg);
-            // End Overall Timer
-            msg = "BENCHMARK ADT: Done with everything! \n BENCHMARK ADT: Time Elapsed: " +          //$NON-NLS-1$
-                  (System.nanoTime() - BuildHelper.sStartOverallTime)/Math.pow(10, 6) + "ms";        //$NON-NLS-1$
-            AdtPlugin.printBuildToConsole(BuildVerbosity.ALWAYS, project, msg);
-        }
-
-        return allRefProjects;
-    }
-
-    private static class JarBuilder implements IArchiveBuilder {
-
-        private static Pattern R_PATTERN = Pattern.compile("R(\\$.*)?\\.class"); //$NON-NLS-1$
-        private static String BUILD_CONFIG_CLASS = "BuildConfig.class"; //$NON-NLS-1$
-
-        private final byte[] buffer = new byte[1024];
-        private final JarOutputStream mOutputStream;
-        private final String mAppPackage;
-
-        JarBuilder(JarOutputStream outputStream, String appPackage) {
-            mOutputStream = outputStream;
-            mAppPackage = appPackage.replace('.', '/');
-        }
-
-        public void addFile(IFile file, IFolder rootFolder) throws ApkCreationException {
-            // we only package class file from the output folder
-            if (SdkConstants.EXT_CLASS.equals(file.getFileExtension()) == false) {
-                return;
-            }
-
-            IPath packageApp = file.getParent().getFullPath().makeRelativeTo(
-                    rootFolder.getFullPath());
-
-            String name = file.getName();
-            // Ignore the library's R/Manifest/BuildConfig classes.
-            if (mAppPackage.equals(packageApp.toString()) &&
-                            (BUILD_CONFIG_CLASS.equals(name) ||
-                            R_PATTERN.matcher(name).matches())) {
-                return;
-            }
-
-            IPath path = file.getFullPath().makeRelativeTo(rootFolder.getFullPath());
-            try {
-                addFile(file.getContents(), file.getLocalTimeStamp(), path.toString());
-            } catch (ApkCreationException e) {
-                throw e;
-            } catch (Exception e) {
-                throw new ApkCreationException(e, "Failed to add %s", file);
-            }
-        }
-
-        @Override
-        public void addFile(File file, String archivePath) throws ApkCreationException,
-                SealedApkException, DuplicateFileException {
-            try {
-                FileInputStream inputStream = new FileInputStream(file);
-                long lastModified = file.lastModified();
-                addFile(inputStream, lastModified, archivePath);
-            } catch (ApkCreationException e) {
-                throw e;
-            } catch (Exception e) {
-                throw new ApkCreationException(e, "Failed to add %s", file);
-            }
-        }
-
-        private void addFile(InputStream content, long lastModified, String archivePath)
-                throws IOException, ApkCreationException {
-            // create the jar entry
-            JarEntry entry = new JarEntry(archivePath);
-            entry.setTime(lastModified);
-
-            try {
-                // add the entry to the jar archive
-                mOutputStream.putNextEntry(entry);
-
-                // read the content of the entry from the input stream, and write
-                // it into the archive.
-                int count;
-                while ((count = content.read(buffer)) != -1) {
-                    mOutputStream.write(buffer, 0, count);
-                }
-            } finally {
-                try {
-                    if (content != null) {
-                        content.close();
-                    }
-                } catch (Exception e) {
-                    throw new ApkCreationException(e, "Failed to close stream");
-                }
-            }
-        }
-    }
-
-    /**
-     * Updates the crunch cache if needed and return true if the build must continue.
-     */
-    private boolean updateCrunchCache(IProject project, BuildHelper helper) {
-        try {
-            helper.updateCrunchCache();
-        } catch (AaptExecException e) {
-            BaseProjectHelper.markResource(project, AdtConstants.MARKER_PACKAGING,
-                    e.getMessage(), IMarker.SEVERITY_ERROR);
-            return false;
-        } catch (AaptResultException e) {
-            // attempt to parse the error output
-            String[] aaptOutput = e.getOutput();
-            boolean parsingError = AaptParser.parseOutput(aaptOutput, project);
-            // if we couldn't parse the output we display it in the console.
-            if (parsingError) {
-                AdtPlugin.printErrorToConsole(project, (Object[]) aaptOutput);
-            }
-        }
-
-        return true;
-    }
-
-    /**
-     * Writes the library jar file.
-     * @param jarIFile the destination file
-     * @param project the library project
-     * @param appPackage the library android package
-     * @param javaOutputFolder the JDT output folder.
-     */
-    private void writeLibraryPackage(IFile jarIFile, IProject project, String appPackage,
-            IFolder javaOutputFolder) {
-
-        JarOutputStream jos = null;
-        try {
-            Manifest manifest = new Manifest();
-            Attributes mainAttributes = manifest.getMainAttributes();
-            mainAttributes.put(Attributes.Name.CLASS_PATH, "Android ADT"); //$NON-NLS-1$
-            mainAttributes.putValue("Created-By", "1.0 (Android)"); //$NON-NLS-1$  //$NON-NLS-2$
-            jos = new JarOutputStream(
-                    new FileOutputStream(jarIFile.getLocation().toFile()), manifest);
-
-            JarBuilder jarBuilder = new JarBuilder(jos, appPackage);
-
-            // write the class files
-            writeClassFilesIntoJar(jarBuilder, javaOutputFolder, javaOutputFolder);
-
-            // now write the standard Java resources from the output folder
-            ApkBuilder.addSourceFolder(jarBuilder, javaOutputFolder.getLocation().toFile());
-
-            saveProjectBooleanProperty(PROPERTY_CONVERT_TO_DEX, mConvertToDex);
-        } catch (Exception e) {
-            AdtPlugin.log(e, "Failed to write jar file %s", jarIFile.getLocation().toOSString());
-        } finally {
-            if (jos != null) {
-                try {
-                    jos.close();
-                } catch (IOException e) {
-                    // pass
-                }
-            }
-        }
-    }
-
-    private void writeClassFilesIntoJar(JarBuilder builder, IFolder folder, IFolder rootFolder)
-            throws CoreException, IOException, ApkCreationException {
-        IResource[] members = folder.members();
-        for (IResource member : members) {
-            if (member.getType() == IResource.FOLDER) {
-                writeClassFilesIntoJar(builder, (IFolder) member, rootFolder);
-            } else if (member.getType() == IResource.FILE) {
-                IFile file = (IFile) member;
-                builder.addFile(file, rootFolder);
-            }
-        }
-    }
-
-    @Override
-    protected void startupOnInitialize() {
-        super.startupOnInitialize();
-
-        // load the build status. We pass true as the default value to
-        // force a recompile in case the property was not found
-        mConvertToDex = loadProjectBooleanProperty(PROPERTY_CONVERT_TO_DEX, true);
-        mPackageResources = loadProjectBooleanProperty(PROPERTY_PACKAGE_RESOURCES, true);
-        mBuildFinalPackage = loadProjectBooleanProperty(PROPERTY_BUILD_APK, true);
-    }
-
-    @Override
-    protected void abortOnBadSetup(
-            @NonNull IJavaProject javaProject,
-            @Nullable ProjectState projectState) throws AbortBuildException, CoreException {
-        super.abortOnBadSetup(javaProject, projectState);
-
-        IProject iProject = getProject();
-
-        // do a (hopefully quick) search for Precompiler type markers. Those are always only
-        // errors.
-        stopOnMarker(iProject, AdtConstants.MARKER_AAPT_COMPILE, IResource.DEPTH_INFINITE,
-                false /*checkSeverity*/);
-        stopOnMarker(iProject, AdtConstants.MARKER_AIDL, IResource.DEPTH_INFINITE,
-                false /*checkSeverity*/);
-        stopOnMarker(iProject, AdtConstants.MARKER_RENDERSCRIPT, IResource.DEPTH_INFINITE,
-                false /*checkSeverity*/);
-        stopOnMarker(iProject, AdtConstants.MARKER_ANDROID, IResource.DEPTH_ZERO,
-                false /*checkSeverity*/);
-
-        // do a search for JDT markers. Those can be errors or warnings
-        stopOnMarker(iProject, IJavaModelMarker.JAVA_MODEL_PROBLEM_MARKER,
-                IResource.DEPTH_INFINITE, true /*checkSeverity*/);
-        stopOnMarker(iProject, IJavaModelMarker.BUILDPATH_PROBLEM_MARKER,
-                IResource.DEPTH_INFINITE, true /*checkSeverity*/);
-    }
-}
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
deleted file mode 100644
index 0d9ee48..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/build/builders/PreCompilerBuilder.java
+++ /dev/null
@@ -1,1401 +0,0 @@
-/*
- * Copyright (C) 2007 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.build.builders;
-
-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;
-import com.android.ide.eclipse.adt.internal.build.AaptParser;
-import com.android.ide.eclipse.adt.internal.build.AidlProcessor;
-import com.android.ide.eclipse.adt.internal.build.Messages;
-import com.android.ide.eclipse.adt.internal.build.RenderScriptLauncher;
-import com.android.ide.eclipse.adt.internal.build.RsSourceChangeHandler;
-import com.android.ide.eclipse.adt.internal.build.SourceProcessor;
-import com.android.ide.eclipse.adt.internal.build.builders.BaseBuilder.AbortBuildException;
-import com.android.ide.eclipse.adt.internal.lint.EclipseLintClient;
-import com.android.ide.eclipse.adt.internal.preferences.AdtPrefs;
-import com.android.ide.eclipse.adt.internal.preferences.AdtPrefs.BuildVerbosity;
-import com.android.ide.eclipse.adt.internal.project.AndroidManifestHelper;
-import com.android.ide.eclipse.adt.internal.project.BaseProjectHelper;
-import com.android.ide.eclipse.adt.internal.project.FixLaunchConfig;
-import com.android.ide.eclipse.adt.internal.project.ProjectHelper;
-import com.android.ide.eclipse.adt.internal.project.XmlErrorHandler.BasicXmlErrorListener;
-import com.android.ide.eclipse.adt.internal.resources.manager.IdeScanningContext;
-import com.android.ide.eclipse.adt.internal.resources.manager.ProjectResources;
-import com.android.ide.eclipse.adt.internal.resources.manager.ResourceManager;
-import com.android.ide.eclipse.adt.internal.sdk.AdtManifestMergeCallback;
-import com.android.ide.eclipse.adt.internal.sdk.ProjectState;
-import com.android.ide.eclipse.adt.internal.sdk.Sdk;
-import com.android.ide.eclipse.adt.io.IFileWrapper;
-import com.android.ide.eclipse.adt.io.IFolderWrapper;
-import com.android.io.StreamException;
-import com.android.manifmerger.ManifestMerger;
-import com.android.manifmerger.MergerLog;
-import com.android.sdklib.AndroidVersion;
-import com.android.sdklib.BuildToolInfo;
-import com.android.sdklib.IAndroidTarget;
-import com.android.sdklib.build.RenderScriptChecker;
-import com.android.sdklib.build.RenderScriptProcessor;
-import com.android.sdklib.internal.build.BuildConfigGenerator;
-import com.android.sdklib.internal.build.SymbolLoader;
-import com.android.sdklib.internal.build.SymbolWriter;
-import com.android.sdklib.internal.project.ProjectProperties;
-import com.android.sdklib.io.FileOp;
-import com.android.sdklib.repository.FullRevision;
-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.Multimap;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IFolder;
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IResourceDelta;
-import org.eclipse.core.resources.IWorkspaceRoot;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.JavaCore;
-import org.xml.sax.SAXException;
-
-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 javax.xml.parsers.ParserConfigurationException;
-
-/**
- * Pre Java Compiler.
- * This incremental builder performs 2 tasks:
- * <ul>
- * <li>compiles the resources located in the res/ folder, along with the
- * AndroidManifest.xml file into the R.java class.</li>
- * <li>compiles any .aidl files into a corresponding java file.</li>
- * </ul>
- *
- */
-public class PreCompilerBuilder extends BaseBuilder {
-
-    /** This ID is used in plugin.xml and in each project's .project file.
-     * It cannot be changed even if the class is renamed/moved */
-    public static final String ID = "com.android.ide.eclipse.adt.PreCompilerBuilder"; //$NON-NLS-1$
-
-    /** Flag to pass to PreCompiler builder that the build is a release build.
-     */
-    public final static String RELEASE_REQUESTED = "android.releaseBuild"; //$NON-NLS-1$
-
-    private static final String PROPERTY_PACKAGE = "manifestPackage"; //$NON-NLS-1$
-    private static final String PROPERTY_MERGE_MANIFEST = "mergeManifest"; //$NON-NLS-1$
-    private static final String PROPERTY_COMPILE_RESOURCES = "compileResources"; //$NON-NLS-1$
-    private static final String PROPERTY_COMPILE_BUILDCONFIG = "createBuildConfig"; //$NON-NLS-1$
-    private static final String PROPERTY_BUILDCONFIG_MODE = "buildConfigMode"; //$NON-NLS-1$
-
-    private static final boolean MANIFEST_MERGER_ENABLED_DEFAULT = false;
-    private static final String MANIFEST_MERGER_PROPERTY = "manifestmerger.enabled"; //$NON-NLS-1$
-
-    /** Merge Manifest Flag. Computed from resource delta, reset after action is taken.
-     * Stored persistently in the project. */
-    private boolean mMustMergeManifest = false;
-    /** Resource compilation Flag. Computed from resource delta, reset after action is taken.
-     * Stored persistently in the project. */
-    private boolean mMustCompileResources = false;
-    /** BuildConfig Flag. Computed from resource delta, reset after action is taken.
-     * Stored persistently in the project. */
-    private boolean mMustCreateBuildConfig = false;
-    /** BuildConfig last more Flag. Computed from resource delta, reset after action is taken.
-     * Stored persistently in the project. */
-    private boolean mLastBuildConfigMode;
-
-    /** cache of the java package defined in the manifest */
-    private String mManifestPackage;
-
-    /** Output folder for generated Java File. Created on the Builder init
-     * @see #startupOnInitialize()
-     */
-    private IFolder mGenFolder;
-
-    /**
-     * Progress monitor used at the end of every build to refresh the content of the 'gen' folder
-     * and set the generated files as derived.
-     */
-    private DerivedProgressMonitor mDerivedProgressMonitor;
-
-    private AidlProcessor mAidlProcessor;
-    private RsSourceChangeHandler mRenderScriptSourceChangeHandler;
-
-    /**
-     * Progress monitor waiting the end of the process to set a persistent value
-     * in a file. This is typically used in conjunction with <code>IResource.refresh()</code>,
-     * since this call is asynchronous, and we need to wait for it to finish for the file
-     * to be known by eclipse, before we can call <code>resource.setPersistentProperty</code> on
-     * a new file.
-     */
-    private static class DerivedProgressMonitor implements IProgressMonitor {
-        private boolean mCancelled = false;
-        private boolean mDone = false;
-        private final IFolder mGenFolder;
-
-        public DerivedProgressMonitor(IFolder genFolder) {
-            mGenFolder = genFolder;
-        }
-
-        void reset() {
-            mDone = false;
-        }
-
-        @Override
-        public void beginTask(String name, int totalWork) {
-        }
-
-        @Override
-        public void done() {
-            if (mDone == false) {
-                mDone = true;
-                processChildrenOf(mGenFolder);
-            }
-        }
-
-        private void processChildrenOf(IFolder folder) {
-            IResource[] list;
-            try {
-                list = folder.members();
-            } catch (CoreException e) {
-                return;
-            }
-
-            for (IResource member : list) {
-                if (member.exists()) {
-                    if (member.getType() == IResource.FOLDER) {
-                        processChildrenOf((IFolder) member);
-                    }
-
-                    try {
-                        member.setDerived(true, new NullProgressMonitor());
-                    } catch (CoreException e) {
-                        // This really shouldn't happen since we check that the resource
-                        // exist.
-                        // Worst case scenario, the resource isn't marked as derived.
-                    }
-                }
-            }
-        }
-
-        @Override
-        public void internalWorked(double work) {
-        }
-
-        @Override
-        public boolean isCanceled() {
-            return mCancelled;
-        }
-
-        @Override
-        public void setCanceled(boolean value) {
-            mCancelled = value;
-        }
-
-        @Override
-        public void setTaskName(String name) {
-        }
-
-        @Override
-        public void subTask(String name) {
-        }
-
-        @Override
-        public void worked(int work) {
-        }
-    }
-
-    public PreCompilerBuilder() {
-        super();
-    }
-
-    // build() returns a list of project from which this project depends for future compilation.
-    @Override
-    protected IProject[] build(
-            int kind,
-            @SuppressWarnings("rawtypes") Map args,
-            IProgressMonitor monitor)
-            throws CoreException {
-        // get a project object
-        IProject project = getProject();
-
-        if (DEBUG_LOG) {
-            AdtPlugin.log(IStatus.INFO, "%s BUILD(PRE)", project.getName());
-        }
-
-        // For the PreCompiler, only the library projects are considered Referenced projects,
-        // as only those projects have an impact on what is generated by this builder.
-        IProject[] result = null;
-
-        IFolder resOutFolder = null;
-
-        try {
-            assert mDerivedProgressMonitor != null;
-
-            mDerivedProgressMonitor.reset();
-
-            // get the project info
-            ProjectState projectState = Sdk.getProjectState(project);
-
-            // this can happen if the project has no project.properties.
-            if (projectState == null) {
-                return null;
-            }
-
-            boolean isLibrary = projectState.isLibrary();
-
-            IAndroidTarget projectTarget = projectState.getTarget();
-
-            // get the libraries
-            List<IProject> libProjects = projectState.getFullLibraryProjects();
-            result = libProjects.toArray(new IProject[libProjects.size()]);
-
-            IJavaProject javaProject = JavaCore.create(project);
-
-            // Top level check to make sure the build can move forward.
-            abortOnBadSetup(javaProject, projectState);
-
-            // now we need to get the classpath list
-            List<IPath> sourceFolderPathList = BaseProjectHelper.getSourceClasspaths(javaProject);
-
-            IFolder androidOutputFolder = BaseProjectHelper.getAndroidOutputFolder(project);
-
-            resOutFolder = getResOutFolder(androidOutputFolder);
-
-            setupSourceProcessors(javaProject, projectState, sourceFolderPathList,
-                    androidOutputFolder);
-
-            PreCompilerDeltaVisitor dv = null;
-            String javaPackage = null;
-            String minSdkVersion = null;
-
-            if (kind == FULL_BUILD) {
-                AdtPlugin.printBuildToConsole(BuildVerbosity.VERBOSE, project,
-                        Messages.Start_Full_Pre_Compiler);
-
-                if (DEBUG_LOG) {
-                    AdtPlugin.log(IStatus.INFO, "%s full build!", project.getName());
-                }
-
-                // do some clean up.
-                doClean(project, monitor);
-
-                mMustMergeManifest = true;
-                mMustCompileResources = true;
-                mMustCreateBuildConfig = true;
-
-                mAidlProcessor.prepareFullBuild(project);
-                mRenderScriptSourceChangeHandler.prepareFullBuild();
-            } else {
-                AdtPlugin.printBuildToConsole(BuildVerbosity.VERBOSE, project,
-                        Messages.Start_Inc_Pre_Compiler);
-
-                // Go through the resources and see if something changed.
-                // Even if the mCompileResources flag is true from a previously aborted
-                // build, we need to go through the Resource delta to get a possible
-                // list of aidl files to compile/remove.
-                IResourceDelta delta = getDelta(project);
-                if (delta == null) {
-                    mMustCompileResources = true;
-
-                    mAidlProcessor.prepareFullBuild(project);
-                    mRenderScriptSourceChangeHandler.prepareFullBuild();
-                } else {
-                    dv = new PreCompilerDeltaVisitor(this, sourceFolderPathList,
-                            mAidlProcessor.getChangeHandler(),
-                            mRenderScriptSourceChangeHandler);
-                    delta.accept(dv);
-
-                    // Check to see if Manifest.xml, Manifest.java, or R.java have changed:
-                    mMustCompileResources |= dv.getCompileResources();
-                    mMustMergeManifest |= dv.hasManifestChanged();
-
-                    // Notify the ResourceManager:
-                    ResourceManager resManager = ResourceManager.getInstance();
-
-                    if (ResourceManager.isAutoBuilding()) {
-                        ProjectResources projectResources = resManager.getProjectResources(project);
-
-                        IdeScanningContext context = new IdeScanningContext(projectResources,
-                                project, true);
-
-                        boolean wasCleared = projectResources.ensureInitialized();
-
-                        if (!wasCleared) {
-                            resManager.processDelta(delta, context);
-                        }
-
-                        // Check whether this project or its dependencies (libraries) have
-                        // resources that need compilation
-                        if (wasCleared || context.needsFullAapt()) {
-                            mMustCompileResources = true;
-
-                            // Must also call markAaptRequested on the project to not just
-                            // store "aapt required" on this project, but also on any projects
-                            // depending on this project if it's a library project
-                            ResourceManager.markAaptRequested(project);
-                        }
-
-                        // Update error markers in the source editor
-                        if (!mMustCompileResources) {
-                            context.updateMarkers(false /* async */);
-                        }
-                    } // else: already processed the deltas in ResourceManager's IRawDeltaListener
-
-                    mAidlProcessor.doneVisiting(project);
-
-                    // get the java package from the visitor
-                    javaPackage = dv.getManifestPackage();
-                    minSdkVersion = dv.getMinSdkVersion();
-                }
-            }
-
-            // Has anyone marked this project as needing aapt? Typically done when
-            // one of the library projects this project depends on has changed
-            mMustCompileResources |= ResourceManager.isAaptRequested(project);
-
-            // if the main manifest didn't change, then we check for the library
-            // ones (will trigger manifest merging too)
-            if (libProjects.size() > 0) {
-                for (IProject libProject : libProjects) {
-                    IResourceDelta delta = getDelta(libProject);
-                    if (delta != null) {
-                        PatternBasedDeltaVisitor visitor = new PatternBasedDeltaVisitor(
-                                project, libProject,
-                                "PRE:LibManifest"); //$NON-NLS-1$
-                        visitor.addSet(ChangedFileSetHelper.MANIFEST);
-
-                        ChangedFileSet textSymbolCFS = null;
-                        if (isLibrary == false) {
-                            textSymbolCFS = ChangedFileSetHelper.getTextSymbols(
-                                    libProject);
-                            visitor.addSet(textSymbolCFS);
-                        }
-
-                        delta.accept(visitor);
-
-                        mMustMergeManifest |= visitor.checkSet(ChangedFileSetHelper.MANIFEST);
-
-                        if (textSymbolCFS != null) {
-                            mMustCompileResources |= visitor.checkSet(textSymbolCFS);
-                        }
-
-                        // no need to test others if we have all flags at true.
-                        if (mMustMergeManifest &&
-                                (mMustCompileResources || textSymbolCFS == null)) {
-                            break;
-                        }
-                    }
-                }
-            }
-
-            // store the build status in the persistent storage
-            saveProjectBooleanProperty(PROPERTY_MERGE_MANIFEST, mMustMergeManifest);
-            saveProjectBooleanProperty(PROPERTY_COMPILE_RESOURCES, mMustCompileResources);
-            saveProjectBooleanProperty(PROPERTY_COMPILE_BUILDCONFIG, mMustCreateBuildConfig);
-
-            // if there was some XML errors, we just return w/o doing
-            // anything since we've put some markers in the files anyway.
-            if (dv != null && dv.mXmlError) {
-                AdtPlugin.printErrorToConsole(project, Messages.Xml_Error);
-
-                return result;
-            }
-
-            if (projectState.getRenderScriptSupportMode()) {
-                FullRevision minBuildToolsRev = new FullRevision(19,0,3);
-                if (mBuildToolInfo.getRevision().compareTo(minBuildToolsRev) == -1) {
-                    String msg = "RenderScript support mode requires Build-Tools 19.0.3 or later.";
-                    AdtPlugin.printErrorToConsole(project, msg);
-                    markProject(AdtConstants.MARKER_ADT, msg, IMarker.SEVERITY_ERROR);
-
-                    return result;
-                }
-            }
-
-            // get the manifest file
-            IFile manifestFile = ProjectHelper.getManifest(project);
-
-            if (manifestFile == null) {
-                String msg = String.format(Messages.s_File_Missing,
-                        SdkConstants.FN_ANDROID_MANIFEST_XML);
-                AdtPlugin.printErrorToConsole(project, msg);
-                markProject(AdtConstants.MARKER_ADT, msg, IMarker.SEVERITY_ERROR);
-
-                return result;
-
-                // TODO: document whether code below that uses manifest (which is now guaranteed
-                // to be null) will actually be executed or not.
-            }
-
-            // lets check the XML of the manifest first, if that hasn't been done by the
-            // resource delta visitor yet.
-            if (dv == null || dv.getCheckedManifestXml() == false) {
-                BasicXmlErrorListener errorListener = new BasicXmlErrorListener();
-                try {
-                    ManifestData parser = AndroidManifestHelper.parseUnchecked(
-                            new IFileWrapper(manifestFile),
-                            true /*gather data*/,
-                            errorListener);
-
-                    if (errorListener.mHasXmlError == true) {
-                        // There was an error in the manifest, its file has been marked
-                        // by the XmlErrorHandler. The stopBuild() call below will abort
-                        // this with an exception.
-                        String msg = String.format(Messages.s_Contains_Xml_Error,
-                                SdkConstants.FN_ANDROID_MANIFEST_XML);
-                        AdtPlugin.printBuildToConsole(BuildVerbosity.VERBOSE, project, msg);
-                        markProject(AdtConstants.MARKER_ADT, msg, IMarker.SEVERITY_ERROR);
-
-                        return result;
-                    }
-
-                    // Get the java package from the parser.
-                    // This can be null if the parsing failed because the resource is out of sync,
-                    // in which case the error will already have been logged anyway.
-                    if (parser != null) {
-                        javaPackage = parser.getPackage();
-                        minSdkVersion = parser.getMinSdkVersionString();
-                    }
-                } catch (StreamException e) {
-                    handleStreamException(e);
-
-                    return result;
-                } catch (ParserConfigurationException e) {
-                    String msg = String.format(
-                            "Bad parser configuration for %s: %s",
-                            manifestFile.getFullPath(),
-                            e.getMessage());
-
-                    handleException(e, msg);
-                    return result;
-
-                } catch (SAXException e) {
-                    String msg = String.format(
-                            "Parser exception for %s: %s",
-                            manifestFile.getFullPath(),
-                            e.getMessage());
-
-                    handleException(e, msg);
-                    return result;
-                } catch (IOException e) {
-                    String msg = String.format(
-                            "I/O error for %s: %s",
-                            manifestFile.getFullPath(),
-                            e.getMessage());
-
-                    handleException(e, msg);
-                    return result;
-                }
-            }
-
-            int minSdkValue = -1;
-
-            if (minSdkVersion != null) {
-                try {
-                    minSdkValue = Integer.parseInt(minSdkVersion);
-                } catch (NumberFormatException e) {
-                    // it's ok, it means minSdkVersion contains a (hopefully) valid codename.
-                }
-
-                AndroidVersion targetVersion = projectTarget.getVersion();
-
-                // remove earlier marker from the manifest
-                removeMarkersFromResource(manifestFile, AdtConstants.MARKER_ADT);
-
-                if (minSdkValue != -1) {
-                    String codename = targetVersion.getCodename();
-                    if (codename != null) {
-                        // integer minSdk when the target is a preview => fatal error
-                        String msg = String.format(
-                                "Platform %1$s is a preview and requires application manifest to set %2$s to '%1$s'",
-                                codename, AndroidManifest.ATTRIBUTE_MIN_SDK_VERSION);
-                        AdtPlugin.printErrorToConsole(project, msg);
-                        BaseProjectHelper.markResource(manifestFile, AdtConstants.MARKER_ADT,
-                                msg, IMarker.SEVERITY_ERROR);
-                        return result;
-                    } else if (minSdkValue > targetVersion.getApiLevel()) {
-                        // integer minSdk is too high for the target => warning
-                        String msg = String.format(
-                                "Attribute %1$s (%2$d) is higher than the project target API level (%3$d)",
-                                AndroidManifest.ATTRIBUTE_MIN_SDK_VERSION,
-                                minSdkValue, targetVersion.getApiLevel());
-                        AdtPlugin.printBuildToConsole(BuildVerbosity.VERBOSE, project, msg);
-                        BaseProjectHelper.markResource(manifestFile, AdtConstants.MARKER_ADT,
-                                msg, IMarker.SEVERITY_WARNING);
-                    }
-                } else {
-                    // looks like the min sdk is a codename, check it matches the codename
-                    // of the platform
-                    String codename = targetVersion.getCodename();
-                    if (codename == null) {
-                        // platform is not a preview => fatal error
-                        String msg = String.format(
-                                "Manifest attribute '%1$s' is set to '%2$s'. Integer is expected.",
-                                AndroidManifest.ATTRIBUTE_MIN_SDK_VERSION, minSdkVersion);
-                        AdtPlugin.printErrorToConsole(project, msg);
-                        BaseProjectHelper.markResource(manifestFile, AdtConstants.MARKER_ADT,
-                                msg, IMarker.SEVERITY_ERROR);
-                        return result;
-                    } else if (codename.equals(minSdkVersion) == false) {
-                        // platform and manifest codenames don't match => fatal error.
-                        String msg = String.format(
-                                "Value of manifest attribute '%1$s' does not match platform codename '%2$s'",
-                                AndroidManifest.ATTRIBUTE_MIN_SDK_VERSION, codename);
-                        AdtPlugin.printErrorToConsole(project, msg);
-                        BaseProjectHelper.markResource(manifestFile, AdtConstants.MARKER_ADT,
-                                msg, IMarker.SEVERITY_ERROR);
-                        return result;
-                    }
-
-                    // if we get there, the minSdkVersion is a codename matching the target
-                    // platform codename. In this case we set minSdkValue to the previous API
-                    // level, as it's used by source processors.
-                    minSdkValue = targetVersion.getApiLevel();
-                }
-            } else if (projectTarget.getVersion().isPreview()) {
-                // else the minSdkVersion is not set but we are using a preview target.
-                // Display an error
-                String codename = projectTarget.getVersion().getCodename();
-                String msg = String.format(
-                        "Platform %1$s is a preview and requires application manifests to set %2$s to '%1$s'",
-                        codename, AndroidManifest.ATTRIBUTE_MIN_SDK_VERSION);
-                AdtPlugin.printErrorToConsole(project, msg);
-                BaseProjectHelper.markResource(manifestFile, AdtConstants.MARKER_ADT, msg,
-                        IMarker.SEVERITY_ERROR);
-                return result;
-            }
-
-            if (javaPackage == null || javaPackage.length() == 0) {
-                // looks like the AndroidManifest file isn't valid.
-                String msg = String.format(Messages.s_Doesnt_Declare_Package_Error,
-                        SdkConstants.FN_ANDROID_MANIFEST_XML);
-                AdtPlugin.printErrorToConsole(project, msg);
-                BaseProjectHelper.markResource(manifestFile, AdtConstants.MARKER_ADT,
-                        msg, IMarker.SEVERITY_ERROR);
-
-                return result;
-            } else if (javaPackage.indexOf('.') == -1) {
-                // The application package name does not contain 2+ segments!
-                String msg = String.format(
-                        "Application package '%1$s' must have a minimum of 2 segments.",
-                        SdkConstants.FN_ANDROID_MANIFEST_XML);
-                AdtPlugin.printErrorToConsole(project, msg);
-                BaseProjectHelper.markResource(manifestFile, AdtConstants.MARKER_ADT,
-                        msg, IMarker.SEVERITY_ERROR);
-
-                return result;
-            }
-
-            // at this point we have the java package. We need to make sure it's not a different
-            // package than the previous one that were built.
-            if (javaPackage.equals(mManifestPackage) == false) {
-                // The manifest package has changed, the user may want to update
-                // the launch configuration
-                if (mManifestPackage != null) {
-                    AdtPlugin.printBuildToConsole(BuildVerbosity.VERBOSE, project,
-                            Messages.Checking_Package_Change);
-
-                    FixLaunchConfig flc = new FixLaunchConfig(project, mManifestPackage,
-                            javaPackage);
-                    flc.start();
-                }
-
-                // record the new manifest package, and save it.
-                mManifestPackage = javaPackage;
-                saveProjectStringProperty(PROPERTY_PACKAGE, mManifestPackage);
-
-                // force a clean
-                doClean(project, monitor);
-                mMustMergeManifest = true;
-                mMustCompileResources = true;
-                mMustCreateBuildConfig = true;
-                mAidlProcessor.prepareFullBuild(project);
-                mRenderScriptSourceChangeHandler.prepareFullBuild();
-
-                saveProjectBooleanProperty(PROPERTY_MERGE_MANIFEST, mMustMergeManifest);
-                saveProjectBooleanProperty(PROPERTY_COMPILE_RESOURCES, mMustCompileResources);
-                saveProjectBooleanProperty(PROPERTY_COMPILE_BUILDCONFIG, mMustCreateBuildConfig);
-            }
-
-            try {
-                handleBuildConfig(args);
-            } catch (IOException e) {
-                handleException(e, "Failed to create BuildConfig class");
-                return result;
-            }
-
-            // merge the manifest
-            if (mMustMergeManifest) {
-                boolean enabled = MANIFEST_MERGER_ENABLED_DEFAULT;
-                String propValue = projectState.getProperty(MANIFEST_MERGER_PROPERTY);
-                if (propValue != null) {
-                    enabled = Boolean.valueOf(propValue);
-                }
-
-                if (mergeManifest(androidOutputFolder, libProjects, enabled) == false) {
-                    return result;
-                }
-            }
-
-            List<File> libProjectsOut = new ArrayList<File>(libProjects.size());
-            for (IProject libProject : libProjects) {
-                libProjectsOut.add(
-                        BaseProjectHelper.getAndroidOutputFolder(libProject)
-                            .getLocation().toFile());
-            }
-
-            // run the source processors
-            int processorStatus = SourceProcessor.COMPILE_STATUS_NONE;
-
-
-            try {
-                processorStatus |= mAidlProcessor.compileFiles(this,
-                        project, projectTarget, sourceFolderPathList,
-                        libProjectsOut, monitor);
-            } catch (Throwable t) {
-                handleException(t, "Failed to run aidl. Check workspace log for detail.");
-                return result;
-            }
-
-            try {
-                processorStatus |= compileRs(minSdkValue, projectState, androidOutputFolder,
-                        resOutFolder, monitor);
-            } catch (Throwable t) {
-                handleException(t, "Failed to run renderscript. Check workspace log for detail.");
-                return result;
-            }
-
-            // if a processor created some resources file, force recompilation of the resources.
-            if ((processorStatus & SourceProcessor.COMPILE_STATUS_RES) != 0) {
-                mMustCompileResources = true;
-                // save the current state before attempting the compilation
-                saveProjectBooleanProperty(PROPERTY_COMPILE_RESOURCES, mMustCompileResources);
-            }
-
-            // handle the resources, after the processors are run since some (renderscript)
-            // generate resources.
-            boolean compiledTheResources = mMustCompileResources;
-            if (mMustCompileResources) {
-                if (DEBUG_LOG) {
-                    AdtPlugin.log(IStatus.INFO, "%s compiling resources!", project.getName());
-                }
-
-                IFile proguardFile = null;
-                if (projectState.getProperty(ProjectProperties.PROPERTY_PROGUARD_CONFIG) != null) {
-                    proguardFile = androidOutputFolder.getFile(AdtConstants.FN_AAPT_PROGUARD);
-                }
-
-                handleResources(project, javaPackage, projectTarget, manifestFile, resOutFolder,
-                        libProjects, isLibrary, proguardFile);
-            }
-
-            if (processorStatus == SourceProcessor.COMPILE_STATUS_NONE &&
-                    compiledTheResources == false) {
-                AdtPlugin.printBuildToConsole(BuildVerbosity.VERBOSE, project,
-                        Messages.Nothing_To_Compile);
-            }
-        } catch (AbortBuildException e) {
-            return result;
-        } finally {
-            // refresh the 'gen' source folder. Once this is done with the custom progress
-            // monitor to mark all new files as derived
-            mGenFolder.refreshLocal(IResource.DEPTH_INFINITE, mDerivedProgressMonitor);
-            if (resOutFolder != null) {
-                resOutFolder.refreshLocal(IResource.DEPTH_INFINITE, mDerivedProgressMonitor);
-            }
-        }
-
-        return result;
-    }
-
-    private IFolder getResOutFolder(IFolder androidOutputFolder) {
-        return androidOutputFolder.getFolder(AdtConstants.WS_BIN_RELATIVE_BC);
-    }
-
-    @Override
-    protected void clean(IProgressMonitor monitor) throws CoreException {
-        super.clean(monitor);
-
-        if (DEBUG_LOG) {
-            AdtPlugin.log(IStatus.INFO, "%s CLEAN(PRE)", getProject().getName());
-        }
-
-        doClean(getProject(), monitor);
-        if (mGenFolder != null) {
-            mGenFolder.refreshLocal(IResource.DEPTH_INFINITE, monitor);
-        }
-    }
-
-    private void doClean(IProject project, IProgressMonitor monitor) throws CoreException {
-        AdtPlugin.printBuildToConsole(BuildVerbosity.VERBOSE, project,
-                Messages.Removing_Generated_Classes);
-
-        // remove all the derived resources from the 'gen' source folder.
-        if (mGenFolder != null && mGenFolder.exists()) {
-            // gen folder should not be derived, but previous version could set it to derived
-            // so we make sure this isn't the case (or it'll get deleted by the clean)
-            mGenFolder.setDerived(false, monitor);
-
-            removeDerivedResources(mGenFolder, monitor);
-        }
-
-        // Clear the project of the generic markers
-        removeMarkersFromContainer(project, AdtConstants.MARKER_AAPT_COMPILE);
-        removeMarkersFromContainer(project, AdtConstants.MARKER_XML);
-        removeMarkersFromContainer(project, AdtConstants.MARKER_AIDL);
-        removeMarkersFromContainer(project, AdtConstants.MARKER_RENDERSCRIPT);
-        removeMarkersFromContainer(project, AdtConstants.MARKER_MANIFMERGER);
-        removeMarkersFromContainer(project, AdtConstants.MARKER_ANDROID);
-
-        // Also clean up lint
-        EclipseLintClient.clearMarkers(project);
-
-        // clean the project repo
-        ProjectResources res = ResourceManager.getInstance().getProjectResources(project);
-        res.clear();
-    }
-
-    @Override
-    protected void startupOnInitialize() {
-        try {
-            super.startupOnInitialize();
-
-            IProject project = getProject();
-
-            // load the previous IFolder and java package.
-            mManifestPackage = loadProjectStringProperty(PROPERTY_PACKAGE);
-
-            // get the source folder in which all the Java files are created
-            mGenFolder = project.getFolder(SdkConstants.FD_GEN_SOURCES);
-            mDerivedProgressMonitor = new DerivedProgressMonitor(mGenFolder);
-
-            // Load the current compile flags. We ask for true if not found to force a recompile.
-            mMustMergeManifest = loadProjectBooleanProperty(PROPERTY_MERGE_MANIFEST, true);
-            mMustCompileResources = loadProjectBooleanProperty(PROPERTY_COMPILE_RESOURCES, true);
-            mMustCreateBuildConfig = loadProjectBooleanProperty(PROPERTY_COMPILE_BUILDCONFIG, true);
-            Boolean v = ProjectHelper.loadBooleanProperty(project, PROPERTY_BUILDCONFIG_MODE);
-            if (v == null) {
-                // no previous build config mode? force regenerate
-                mMustCreateBuildConfig = true;
-            } else {
-                mLastBuildConfigMode = v;
-            }
-
-        } catch (Throwable throwable) {
-            AdtPlugin.log(throwable, "Failed to finish PrecompilerBuilder#startupOnInitialize()");
-        }
-    }
-
-    private void setupSourceProcessors(@NonNull IJavaProject javaProject,
-            @NonNull ProjectState projectState,
-            @NonNull List<IPath> sourceFolderPathList,
-            @NonNull IFolder androidOutputFolder) {
-        if (mAidlProcessor == null) {
-            mAidlProcessor = new AidlProcessor(javaProject, mBuildToolInfo, mGenFolder);
-        } else {
-            mAidlProcessor.setBuildToolInfo(mBuildToolInfo);
-        }
-
-        List<File> sourceFolders = Lists.newArrayListWithCapacity(sourceFolderPathList.size());
-        IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
-
-        for (IPath path : sourceFolderPathList) {
-            IResource resource = root.findMember(path);
-            if (resource != null && resource.exists() && resource.getType() == IResource.FOLDER) {
-                IPath fullPath = resource.getLocation();
-                if (fullPath != null) {
-                    sourceFolders.add(fullPath.toFile());
-                }
-            }
-        }
-
-        RenderScriptChecker checker = new RenderScriptChecker(sourceFolders,
-                androidOutputFolder.getLocation().toFile());
-        mRenderScriptSourceChangeHandler = new RsSourceChangeHandler(checker);
-    }
-
-    private int compileRs(int minSdkValue,
-            @NonNull ProjectState projectState,
-            @NonNull IFolder androidOutputFolder,
-            @NonNull IFolder resOutFolder,
-            @NonNull IProgressMonitor monitor)
-            throws IOException, InterruptedException {
-        if (!mRenderScriptSourceChangeHandler.mustCompile()) {
-            return SourceProcessor.COMPILE_STATUS_NONE;
-        }
-
-        RenderScriptChecker checker = mRenderScriptSourceChangeHandler.getChecker();
-
-        List<File> inputs = checker.findInputFiles();
-        List<File> importFolders = checker.getSourceFolders();
-        File buildFolder = androidOutputFolder.getLocation().toFile();
-
-
-        // get the renderscript target
-        int rsTarget = minSdkValue == -1 ? 11 : minSdkValue;
-        String rsTargetStr = projectState.getProperty(ProjectProperties.PROPERTY_RS_TARGET);
-        if (rsTargetStr != null) {
-            try {
-                rsTarget = Integer.parseInt(rsTargetStr);
-            } catch (NumberFormatException e) {
-                handleException(e, String.format(
-                        "Property %s is not an integer.",
-                        ProjectProperties.PROPERTY_RS_TARGET));
-                return SourceProcessor.COMPILE_STATUS_NONE;
-            }
-        }
-
-        RenderScriptProcessor processor = new RenderScriptProcessor(
-                inputs,
-                importFolders,
-                buildFolder,
-                mGenFolder.getLocation().toFile(),
-                resOutFolder.getLocation().toFile(),
-                new File(buildFolder, SdkConstants.FD_RS_OBJ),
-                new File(buildFolder, SdkConstants.FD_RS_LIBS),
-                mBuildToolInfo,
-                rsTarget,
-                false /*debugBuild, always false for now*/,
-                3,
-                projectState.getRenderScriptSupportMode());
-
-        // clean old dependency files fiest
-        checker.cleanDependencies();
-
-        // then clean old output files
-        processor.cleanOldOutput(checker.getOldOutputs());
-
-        RenderScriptLauncher launcher = new RenderScriptLauncher(
-                getProject(),
-                mGenFolder,
-                resOutFolder,
-                monitor,
-                AdtPrefs.getPrefs().getBuildVerbosity() == BuildVerbosity.VERBOSE /*verbose*/);
-
-        // and run the build
-        processor.build(launcher);
-
-        return SourceProcessor.COMPILE_STATUS_CODE | SourceProcessor.COMPILE_STATUS_RES;
-    }
-
-    @SuppressWarnings("deprecation")
-    private void handleBuildConfig(@SuppressWarnings("rawtypes") Map args)
-            throws IOException, CoreException {
-        boolean debugMode = !args.containsKey(RELEASE_REQUESTED);
-
-        BuildConfigGenerator generator = new BuildConfigGenerator(
-                mGenFolder.getLocation().toOSString(), mManifestPackage, debugMode);
-
-        if (mMustCreateBuildConfig == false) {
-            // check the file is present.
-            IFolder folder = getGenManifestPackageFolder();
-            if (folder.exists(new Path(BuildConfigGenerator.BUILD_CONFIG_NAME)) == false) {
-                mMustCreateBuildConfig = true;
-                AdtPlugin.printBuildToConsole(BuildVerbosity.VERBOSE, getProject(),
-                        String.format("Class %1$s is missing!",
-                                BuildConfigGenerator.BUILD_CONFIG_NAME));
-            } else if (debugMode != mLastBuildConfigMode) {
-                // else if the build mode changed, force creation
-                mMustCreateBuildConfig = true;
-                AdtPlugin.printBuildToConsole(BuildVerbosity.VERBOSE, getProject(),
-                        String.format("Different build mode, must update %1$s!",
-                                BuildConfigGenerator.BUILD_CONFIG_NAME));
-            }
-        }
-
-        if (mMustCreateBuildConfig) {
-            if (DEBUG_LOG) {
-                AdtPlugin.log(IStatus.INFO, "%s generating BuilderConfig!", getProject().getName());
-            }
-
-            AdtPlugin.printBuildToConsole(BuildVerbosity.VERBOSE, getProject(),
-                    String.format("Generating %1$s...", BuildConfigGenerator.BUILD_CONFIG_NAME));
-            generator.generate();
-
-            mMustCreateBuildConfig = false;
-            saveProjectBooleanProperty(PROPERTY_COMPILE_BUILDCONFIG, mMustCreateBuildConfig);
-            saveProjectBooleanProperty(PROPERTY_BUILDCONFIG_MODE, mLastBuildConfigMode = debugMode);
-        }
-    }
-
-    private boolean mergeManifest(IFolder androidOutFolder, List<IProject> libProjects,
-            boolean enabled) throws CoreException {
-        if (DEBUG_LOG) {
-            AdtPlugin.log(IStatus.INFO, "%s merging manifests!", getProject().getName());
-        }
-
-        IFile outFile = androidOutFolder.getFile(SdkConstants.FN_ANDROID_MANIFEST_XML);
-        IFile manifest = getProject().getFile(SdkConstants.FN_ANDROID_MANIFEST_XML);
-
-        // remove existing markers from the manifest.
-        // FIXME: only remove from manifest once the markers are put there.
-        removeMarkersFromResource(getProject(), AdtConstants.MARKER_MANIFMERGER);
-
-        // If the merging is not enabled or if there's no library then we simply copy the
-        // manifest over.
-        if (enabled == false || libProjects.size() == 0) {
-            try {
-                new FileOp().copyFile(manifest.getLocation().toFile(),
-                        outFile.getLocation().toFile());
-
-                outFile.refreshLocal(IResource.DEPTH_INFINITE, mDerivedProgressMonitor);
-
-                saveProjectBooleanProperty(PROPERTY_MERGE_MANIFEST, mMustMergeManifest = false);
-            } catch (IOException e) {
-                handleException(e, "Failed to copy Manifest");
-                return false;
-            }
-        } else {
-            final ArrayList<String> errors = new ArrayList<String>();
-
-            // TODO change MergerLog.wrapSdkLog by a custom IMergerLog that will create
-            // and maintain error markers.
-            ManifestMerger merger = new ManifestMerger(
-                MergerLog.wrapSdkLog(new ILogger() {
-                    @Override
-                    public void warning(@NonNull String warningFormat, Object... args) {
-                        AdtPlugin.printToConsole(getProject(), String.format(warningFormat, args));
-                    }
-
-                    @Override
-                    public void info(@NonNull String msgFormat, Object... args) {
-                        AdtPlugin.printToConsole(getProject(), String.format(msgFormat, args));
-                    }
-
-                    @Override
-                    public void verbose(@NonNull String msgFormat, Object... args) {
-                        info(msgFormat, args);
-                    }
-
-                    @Override
-                    public void error(@Nullable Throwable t, @Nullable String errorFormat,
-                            Object... args) {
-                        errors.add(String.format(errorFormat, args));
-                    }
-                }),
-                new AdtManifestMergeCallback());
-
-            File[] libManifests = new File[libProjects.size()];
-            int libIndex = 0;
-            for (IProject lib : libProjects) {
-                libManifests[libIndex++] = lib.getFile(SdkConstants.FN_ANDROID_MANIFEST_XML)
-                        .getLocation().toFile();
-            }
-
-            if (merger.process(
-                    outFile.getLocation().toFile(),
-                    manifest.getLocation().toFile(),
-                    libManifests,
-                    null /*injectAttributes*/, null /*packageOverride*/) == false) {
-                if (errors.size() > 1) {
-                    StringBuilder sb = new StringBuilder();
-                    for (String s : errors) {
-                        sb.append(s).append('\n');
-                    }
-
-                    markProject(AdtConstants.MARKER_MANIFMERGER, sb.toString(),
-                            IMarker.SEVERITY_ERROR);
-
-                } else if (errors.size() == 1) {
-                    markProject(AdtConstants.MARKER_MANIFMERGER, errors.get(0),
-                            IMarker.SEVERITY_ERROR);
-                } else {
-                    markProject(AdtConstants.MARKER_MANIFMERGER, "Unknown error merging manifest",
-                            IMarker.SEVERITY_ERROR);
-                }
-                return false;
-            }
-
-            outFile.refreshLocal(IResource.DEPTH_INFINITE, mDerivedProgressMonitor);
-            saveProjectBooleanProperty(PROPERTY_MERGE_MANIFEST, mMustMergeManifest = false);
-        }
-
-        return true;
-    }
-
-    /**
-     * Handles resource changes and regenerate whatever files need regenerating.
-     * @param project the main project
-     * @param javaPackage the app package for the main project
-     * @param projectTarget the target of the main project
-     * @param manifest the {@link IFile} representing the project manifest
-     * @param libProjects the library dependencies
-     * @param isLibrary if the project is a library project
-     * @throws CoreException
-     * @throws AbortBuildException
-     */
-    private void handleResources(IProject project, String javaPackage, IAndroidTarget projectTarget,
-            IFile manifest, IFolder resOutFolder, List<IProject> libProjects, boolean isLibrary,
-            IFile proguardFile) throws CoreException, AbortBuildException {
-        // get the resource folder
-        IFolder resFolder = project.getFolder(AdtConstants.WS_RESOURCES);
-
-        // get the file system path
-        IPath outputLocation = mGenFolder.getLocation();
-        IPath resLocation = resFolder.getLocation();
-        IPath manifestLocation = manifest == null ? null : manifest.getLocation();
-
-        // those locations have to exist for us to do something!
-        if (outputLocation != null && resLocation != null
-                && manifestLocation != null) {
-            String osOutputPath = outputLocation.toOSString();
-            String osResPath = resLocation.toOSString();
-            String osManifestPath = manifestLocation.toOSString();
-
-            // remove the aapt markers
-            removeMarkersFromResource(manifest, AdtConstants.MARKER_AAPT_COMPILE);
-            removeMarkersFromContainer(resFolder, AdtConstants.MARKER_AAPT_COMPILE);
-
-            AdtPlugin.printBuildToConsole(BuildVerbosity.VERBOSE, project,
-                    Messages.Preparing_Generated_Files);
-
-            // we need to figure out where to store the R class.
-            // get the parent folder for R.java and update mManifestPackageSourceFolder
-            IFolder mainPackageFolder = getGenManifestPackageFolder();
-
-            // handle libraries
-            ArrayList<IFolder> libResFolders = Lists.newArrayList();
-            ArrayList<Pair<File, String>> libRFiles = Lists.newArrayList();
-            if (libProjects != null) {
-                for (IProject lib : libProjects) {
-                    IFolder libResFolder = lib.getFolder(SdkConstants.FD_RES);
-                    if (libResFolder.exists()) {
-                        libResFolders.add(libResFolder);
-                    }
-
-                    try {
-                        // get the package of the library, and if it's different form the
-                        // main project, generate the R class for it too.
-                        String libJavaPackage = AndroidManifest.getPackage(new IFolderWrapper(lib));
-                        if (libJavaPackage.equals(javaPackage) == false) {
-
-                            IFolder libOutput = BaseProjectHelper.getAndroidOutputFolder(lib);
-                            File libOutputFolder = libOutput.getLocation().toFile();
-
-                            libRFiles.add(Pair.of(
-                                    new File(libOutputFolder, "R.txt"),
-                                    libJavaPackage));
-
-                        }
-                    } catch (Exception e) {
-                    }
-                }
-            }
-
-            String proguardFilePath = proguardFile != null ?
-                    proguardFile.getLocation().toOSString(): null;
-
-            File resOutFile = resOutFolder.getLocation().toFile();
-            String resOutPath = resOutFile.isDirectory() ? resOutFile.getAbsolutePath() : null;
-
-            execAapt(project, projectTarget, osOutputPath, resOutPath, osResPath, osManifestPath,
-                    mainPackageFolder, libResFolders, libRFiles, isLibrary, proguardFilePath);
-        }
-    }
-
-    /**
-     * Executes AAPT to generate R.java/Manifest.java
-     * @param project the main project
-     * @param projectTarget the main project target
-     * @param osOutputPath the OS output path for the generated file. This is the source folder, not
-     * the package folder.
-     * @param osResPath the OS path to the res folder for the main project
-     * @param osManifestPath the OS path to the manifest of the main project
-     * @param packageFolder the IFolder that will contain the generated file. Unlike
-     * <var>osOutputPath</var> this is the direct parent of the generated files.
-     * If <var>customJavaPackage</var> is not null, this must match the new destination triggered
-     * by its value.
-     * @param libResFolders the list of res folders for the library.
-     * @param libRFiles a list of R files for the libraries.
-     * @param isLibrary if the project is a library project
-     * @param proguardFile an optional path to store proguard information
-     * @throws AbortBuildException
-     */
-    @SuppressWarnings("deprecation")
-    private void execAapt(IProject project, IAndroidTarget projectTarget, String osOutputPath,
-            String osBcOutPath, String osResPath, String osManifestPath, IFolder packageFolder,
-            ArrayList<IFolder> libResFolders, List<Pair<File, String>> libRFiles,
-            boolean isLibrary, String proguardFile)
-            throws AbortBuildException {
-
-        // We actually need to delete the manifest.java as it may become empty and
-        // in this case aapt doesn't generate an empty one, but instead doesn't
-        // touch it.
-        IFile manifestJavaFile = packageFolder.getFile(SdkConstants.FN_MANIFEST_CLASS);
-        manifestJavaFile.getLocation().toFile().delete();
-
-        // launch aapt: create the command line
-        ArrayList<String> array = new ArrayList<String>();
-
-        String aaptPath = mBuildToolInfo.getPath(BuildToolInfo.PathId.AAPT);
-
-        array.add(aaptPath);
-        array.add("package"); //$NON-NLS-1$
-        array.add("-m"); //$NON-NLS-1$
-        if (AdtPrefs.getPrefs().getBuildVerbosity() == BuildVerbosity.VERBOSE) {
-            array.add("-v"); //$NON-NLS-1$
-        }
-
-        if (isLibrary) {
-            array.add("--non-constant-id"); //$NON-NLS-1$
-        }
-
-        if (libResFolders.size() > 0) {
-            array.add("--auto-add-overlay"); //$NON-NLS-1$
-        }
-
-        // If a library or has libraries, generate a text version of the R symbols.
-        File outputFolder = BaseProjectHelper.getAndroidOutputFolder(project).getLocation()
-                .toFile();
-
-        if (isLibrary || !libRFiles.isEmpty()) {
-            array.add("--output-text-symbols"); //$NON-NLS-1$
-            array.add(outputFolder.getAbsolutePath());
-        }
-
-        array.add("-J"); //$NON-NLS-1$
-        array.add(osOutputPath);
-        array.add("-M"); //$NON-NLS-1$
-        array.add(osManifestPath);
-        if (osBcOutPath != null) {
-            array.add("-S"); //$NON-NLS-1$
-            array.add(osBcOutPath);
-        }
-        array.add("-S"); //$NON-NLS-1$
-        array.add(osResPath);
-        for (IFolder libResFolder : libResFolders) {
-            array.add("-S"); //$NON-NLS-1$
-            array.add(libResFolder.getLocation().toOSString());
-        }
-
-        array.add("-I"); //$NON-NLS-1$
-        array.add(projectTarget.getPath(IAndroidTarget.ANDROID_JAR));
-
-        // use the proguard file
-        if (proguardFile != null && proguardFile.length() > 0) {
-            array.add("-G");
-            array.add(proguardFile);
-        }
-
-        if (AdtPrefs.getPrefs().getBuildVerbosity() == BuildVerbosity.VERBOSE) {
-            StringBuilder sb = new StringBuilder();
-            for (String c : array) {
-                sb.append(c);
-                sb.append(' ');
-            }
-            String cmd_line = sb.toString();
-            AdtPlugin.printToConsole(project, cmd_line);
-        }
-
-        // launch
-        try {
-            // launch the command line process
-            Process process = Runtime.getRuntime().exec(
-                    array.toArray(new String[array.size()]));
-
-            // list to store each line of stderr
-            ArrayList<String> stdErr = new ArrayList<String>();
-
-            // get the output and return code from the process
-            int returnCode = grabProcessOutput(process, stdErr);
-
-            // attempt to parse the error output
-            boolean parsingError = AaptParser.parseOutput(stdErr, project);
-
-            // if we couldn't parse the output we display it in the console.
-            if (parsingError) {
-                if (returnCode != 0) {
-                    AdtPlugin.printErrorToConsole(project, stdErr.toArray());
-                } else {
-                    AdtPlugin.printBuildToConsole(BuildVerbosity.NORMAL,
-                            project, stdErr.toArray());
-                }
-            }
-
-            if (returnCode != 0) {
-                // if the exec failed, and we couldn't parse the error output
-                // (and therefore not all files that should have been marked,
-                // were marked), we put a generic marker on the project and abort.
-                if (parsingError) {
-                    markProject(AdtConstants.MARKER_ADT,
-                            Messages.Unparsed_AAPT_Errors, IMarker.SEVERITY_ERROR);
-                } else if (stdErr.size() == 0) {
-                    // no parsing error because sdterr was empty. We still need to put
-                    // a marker otherwise there's no user visible feedback.
-                    markProject(AdtConstants.MARKER_ADT,
-                            String.format(Messages.AAPT_Exec_Error_d, returnCode),
-                            IMarker.SEVERITY_ERROR);
-                }
-
-                AdtPlugin.printBuildToConsole(BuildVerbosity.VERBOSE, project,
-                        Messages.AAPT_Error);
-
-                // abort if exec failed.
-                throw new AbortBuildException();
-            }
-
-            // now if the project has libraries, R needs to be created for each libraries
-            // unless this is a library.
-            if (isLibrary == false && !libRFiles.isEmpty()) {
-                File rFile = new File(outputFolder, SdkConstants.FN_RESOURCE_TEXT);
-                // 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 fullSymbolValues = new SymbolLoader(rFile);
-                    fullSymbolValues.load();
-
-                    Multimap<String, SymbolLoader> libMap = ArrayListMultimap.create();
-
-                    // 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 (Pair<File, String> lib : libRFiles) {
-                        String libPackage = lib.getSecond();
-                        File rText = 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);
-                        }
-                    }
-
-                    // 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(osOutputPath, packageName,
-                                fullSymbolValues);
-                        for (SymbolLoader symbolLoader : symbols) {
-                            writer.addSymbolsToWrite(symbolLoader);
-                        }
-                        writer.write();
-                    }
-                }
-            }
-
-        } catch (IOException e1) {
-            // something happen while executing the process,
-            // mark the project and exit
-            String msg;
-            String path = array.get(0);
-            if (!new File(path).exists()) {
-                msg = String.format(Messages.AAPT_Exec_Error_s, path);
-            } else {
-                String description = e1.getLocalizedMessage();
-                if (e1.getCause() != null && e1.getCause() != e1) {
-                    description = description + ": " + e1.getCause().getLocalizedMessage();
-                }
-                msg = String.format(Messages.AAPT_Exec_Error_Other_s, description);
-            }
-
-            markProject(AdtConstants.MARKER_ADT, msg, IMarker.SEVERITY_ERROR);
-
-            // Add workaround for the Linux problem described here:
-            //    http://developer.android.com/sdk/installing.html#troubleshooting
-            // There are various posts on StackOverflow elsewhere where people are asking
-            // about aapt failing to run, so even though this is documented in the
-            // Troubleshooting section add an error message to help with this
-            // scenario.
-            if (SdkConstants.CURRENT_PLATFORM == SdkConstants.PLATFORM_LINUX
-                    && System.getProperty("os.arch").endsWith("64") //$NON-NLS-1$ //$NON-NLS-2$
-                    && new File(aaptPath).exists()
-                    && new File("/usr/bin/apt-get").exists()) {     //$NON-NLS-1$
-                markProject(AdtConstants.MARKER_ADT,
-                        "Hint: On 64-bit systems, make sure the 32-bit libraries are installed: \"sudo apt-get install ia32-libs\" or on some systems, \"sudo apt-get install lib32z1\"",
-                        IMarker.SEVERITY_ERROR);
-                // Note - this uses SEVERITY_ERROR even though it's really SEVERITY_INFO because
-                // we want this error message to show up adjacent to the aapt error message
-                // (and Eclipse sorts by priority)
-            }
-
-            // This interrupts the build.
-            throw new AbortBuildException();
-        } catch (InterruptedException e) {
-            // we got interrupted waiting for the process to end...
-            // mark the project and exit
-            String msg = String.format(Messages.AAPT_Exec_Error_s, array.get(0));
-            markProject(AdtConstants.MARKER_ADT, msg, IMarker.SEVERITY_ERROR);
-
-            // This interrupts the build.
-            throw new AbortBuildException();
-        } finally {
-            // we've at least attempted to run aapt, save the fact that we don't have to
-            // run it again, unless there's a new resource change.
-            saveProjectBooleanProperty(PROPERTY_COMPILE_RESOURCES,
-                    mMustCompileResources = false);
-            ResourceManager.clearAaptRequest(project);
-        }
-    }
-
-    /**
-     * Creates a relative {@link IPath} from a java package.
-     * @param javaPackageName the java package.
-     */
-    private IPath getJavaPackagePath(String javaPackageName) {
-        // convert the java package into path
-        String[] segments = javaPackageName.split(AdtConstants.RE_DOT);
-
-        StringBuilder path = new StringBuilder();
-        for (String s : segments) {
-           path.append(AdtConstants.WS_SEP_CHAR);
-           path.append(s);
-        }
-
-        return new Path(path.toString());
-    }
-
-    /**
-     * Returns an {@link IFolder} (located inside the 'gen' source folder), that matches the
-     * package defined in the manifest. This {@link IFolder} may not actually exist
-     * (aapt will create it anyway).
-     * @return the {@link IFolder} that will contain the R class or null if
-     * the folder was not found.
-     * @throws CoreException
-     */
-    private IFolder getGenManifestPackageFolder() throws CoreException {
-        // get the path for the package
-        IPath packagePath = getJavaPackagePath(mManifestPackage);
-
-        // get a folder for this path under the 'gen' source folder, and return it.
-        // This IFolder may not reference an actual existing folder.
-        return mGenFolder.getFolder(packagePath);
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/build/builders/PreCompilerDeltaVisitor.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/build/builders/PreCompilerDeltaVisitor.java
deleted file mode 100644
index 57316f5..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/build/builders/PreCompilerDeltaVisitor.java
+++ /dev/null
@@ -1,417 +0,0 @@
-/*
- * Copyright (C) 2007 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.build.builders;
-
-import com.android.SdkConstants;
-import com.android.ide.common.xml.ManifestData;
-import com.android.ide.eclipse.adt.AdtConstants;
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.ide.eclipse.adt.internal.build.Messages;
-import com.android.ide.eclipse.adt.internal.build.SourceChangeHandler;
-import com.android.ide.eclipse.adt.internal.build.builders.BaseBuilder.BaseDeltaVisitor;
-import com.android.ide.eclipse.adt.internal.preferences.AdtPrefs.BuildVerbosity;
-import com.android.ide.eclipse.adt.internal.project.AndroidManifestHelper;
-import com.android.ide.eclipse.adt.internal.project.BaseProjectHelper;
-import com.android.ide.eclipse.adt.io.IFileWrapper;
-import com.google.common.collect.Lists;
-
-import org.eclipse.core.resources.IContainer;
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IFolder;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IResourceDelta;
-import org.eclipse.core.resources.IResourceDeltaVisitor;
-import org.eclipse.core.resources.IWorkspaceRoot;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-
-import java.util.Arrays;
-import java.util.List;
-
-/**
- * Resource Delta visitor for the pre-compiler.
- * <p/>This delta visitor only cares about files that are the source or the result of actions of the
- * {@link PreCompilerBuilder}:
- * <ul><li>R.java/Manifest.java generated by compiling the resources</li>
- * <li>Any Java files generated by <code>aidl</code></li></ul>.
- *
- * Therefore it looks for the following:
- * <ul><li>Any modification in the resource folder</li>
- * <li>Removed files from the source folder receiving generated Java files</li>
- * <li>Any modification to aidl files.</li>
- *
- */
-class PreCompilerDeltaVisitor extends BaseDeltaVisitor implements IResourceDeltaVisitor {
-
-    // Result fields.
-    private boolean mChangedManifest = false;
-
-    /**
-     * Compile flag. This is set to true if one of the changed/added/removed
-     * files is Manifest.java, or R.java. All other file changes
-     * will be taken care of by ResourceManager.
-     */
-    private boolean mCompileResources = false;
-
-    /** Manifest check/parsing flag. */
-    private boolean mCheckedManifestXml = false;
-
-    /** Application Package, gathered from the parsing of the manifest */
-    private String mJavaPackage = null;
-    /** minSDKVersion attribute value, gathered from the parsing of the manifest */
-    private String mMinSdkVersion = null;
-
-    // Internal usage fields.
-    /**
-     * In Resource folder flag. This allows us to know if we're in the
-     * resource folder.
-     */
-    private boolean mInRes = false;
-
-    /**
-     * Current Source folder. This allows us to know if we're in a source
-     * folder, and which folder.
-     */
-    private IFolder mSourceFolder = null;
-
-    /** List of source folders. */
-    private final List<IPath> mSourceFolders;
-    private boolean mIsGenSourceFolder = false;
-
-    private final List<SourceChangeHandler> mSourceChangeHandlers = Lists.newArrayList();
-    private final IWorkspaceRoot mRoot;
-
-    private IFolder mAndroidOutputFolder;
-
-    public PreCompilerDeltaVisitor(BaseBuilder builder, List<IPath> sourceFolders,
-            SourceChangeHandler... handlers) {
-        super(builder);
-        mSourceFolders = sourceFolders;
-        mRoot = ResourcesPlugin.getWorkspace().getRoot();
-
-        mSourceChangeHandlers.addAll(Arrays.asList(handlers));
-
-        mAndroidOutputFolder = BaseProjectHelper.getAndroidOutputFolder(builder.getProject());
-    }
-
-    /**
-     * Get whether Manifest.java, Manifest.xml, or R.java have changed
-     * @return true if any of Manifest.xml, Manifest.java, or R.java have been modified
-     */
-    public boolean getCompileResources() {
-        return mCompileResources || mChangedManifest;
-    }
-
-    public boolean hasManifestChanged() {
-        return mChangedManifest;
-    }
-
-    /**
-     * Returns whether the manifest file was parsed/checked for error during the resource delta
-     * visiting.
-     */
-    public boolean getCheckedManifestXml() {
-        return mCheckedManifestXml;
-    }
-
-    /**
-     * Returns the manifest package if the manifest was checked/parsed.
-     * <p/>
-     * This can return null in two cases:
-     * <ul>
-     * <li>The manifest was not part of the resource change delta, and the manifest was
-     * not checked/parsed ({@link #getCheckedManifestXml()} returns <code>false</code>)</li>
-     * <li>The manifest was parsed ({@link #getCheckedManifestXml()} returns <code>true</code>),
-     * but the package declaration is missing</li>
-     * </ul>
-     * @return the manifest package or null.
-     */
-    public String getManifestPackage() {
-        return mJavaPackage;
-    }
-
-    /**
-     * Returns the minSDkVersion attribute from the manifest if it was checked/parsed.
-     * <p/>
-     * This can return null in two cases:
-     * <ul>
-     * <li>The manifest was not part of the resource change delta, and the manifest was
-     * not checked/parsed ({@link #getCheckedManifestXml()} returns <code>false</code>)</li>
-     * <li>The manifest was parsed ({@link #getCheckedManifestXml()} returns <code>true</code>),
-     * but the package declaration is missing</li>
-     * </ul>
-     * @return the minSdkVersion or null.
-     */
-    public String getMinSdkVersion() {
-        return mMinSdkVersion;
-    }
-
-    /*
-     * (non-Javadoc)
-     *
-     * @see org.eclipse.core.resources.IResourceDeltaVisitor
-     *      #visit(org.eclipse.core.resources.IResourceDelta)
-     */
-    @Override
-    public boolean visit(IResourceDelta delta) throws CoreException {
-        // we are only going to look for changes in res/, source folders and in
-        // AndroidManifest.xml since the delta visitor goes through the main
-        // folder before its children we can check when the path segment
-        // count is 2 (format will be /$Project/folder) and make sure we are
-        // processing res/, source folders or AndroidManifest.xml
-
-        IResource resource = delta.getResource();
-        IPath path = resource.getFullPath();
-        String[] segments = path.segments();
-
-        // since the delta visitor also visits the root we return true if
-        // segments.length = 1
-        if (segments.length == 1) {
-            // this is always the Android project since we call
-            // Builder#getDelta(IProject) on the project itself.
-            return true;
-        } else if (segments.length == 2) {
-            // if we are at an item directly under the root directory,
-            // then we are not yet in a source or resource folder
-            mInRes = false;
-            mSourceFolder = null;
-
-            if (SdkConstants.FD_RESOURCES.equalsIgnoreCase(segments[1])) {
-                // this is the resource folder that was modified. we want to
-                // see its content.
-
-                // since we're going to visit its children next, we set the
-                // flag
-                mInRes = true;
-                mSourceFolder = null;
-                return true;
-            } else if (SdkConstants.FN_ANDROID_MANIFEST_XML.equalsIgnoreCase(segments[1])) {
-                // any change in the manifest could trigger a new R.java
-                // class, so we don't need to check the delta kind
-                if (delta.getKind() != IResourceDelta.REMOVED) {
-                    // clean the error markers on the file.
-                    IFile manifestFile = (IFile)resource;
-
-                    if (manifestFile.exists()) {
-                        manifestFile.deleteMarkers(AdtConstants.MARKER_XML, true,
-                                IResource.DEPTH_ZERO);
-                        manifestFile.deleteMarkers(AdtConstants.MARKER_ANDROID, true,
-                                IResource.DEPTH_ZERO);
-                    }
-
-                    // parse the manifest for data and error
-                    ManifestData manifestData = AndroidManifestHelper.parse(
-                            new IFileWrapper(manifestFile), true /*gatherData*/, this);
-
-                    if (manifestData != null) {
-                        mJavaPackage = manifestData.getPackage();
-                        mMinSdkVersion = manifestData.getMinSdkVersionString();
-                    }
-
-                    mCheckedManifestXml = true;
-                }
-                mChangedManifest = true;
-
-                // we don't want to go to the children, not like they are
-                // any for this resource anyway.
-                return false;
-            }
-        }
-
-        // at this point we can either be in the source folder or in the
-        // resource folder or in a different folder that contains a source
-        // folder.
-        // This is due to not all source folder being src/. Some could be
-        // something/somethingelse/src/
-
-        // so first we test if we already know we are in a source or
-        // resource folder.
-
-        if (mSourceFolder != null) {
-            // if we are in the res folder, we are looking for the following changes:
-            // - added/removed/modified aidl files.
-            // - missing R.java file
-
-            // if the resource is a folder, we just go straight to the children
-            if (resource.getType() == IResource.FOLDER) {
-                return true;
-            }
-
-            if (resource.getType() != IResource.FILE) {
-                return false;
-            }
-            IFile file = (IFile)resource;
-
-            // get the modification kind
-            int kind = delta.getKind();
-
-            // we process normal source folder and the 'gen' source folder differently.
-            if (mIsGenSourceFolder) {
-                // this is the generated java file source folder.
-                // - if R.java/Manifest.java are removed/modified, we recompile the resources
-                // - if aidl files are removed/modified, we recompile them.
-
-                boolean outputWarning = false;
-
-                String fileName = resource.getName();
-
-                // Special case of R.java/Manifest.java.
-                if (SdkConstants.FN_RESOURCE_CLASS.equals(fileName) ||
-                        SdkConstants.FN_MANIFEST_CLASS.equals(fileName)) {
-                    // if it was removed, there's a possibility that it was removed due to a
-                    // package change, or an aidl that was removed, but the only thing
-                    // that will happen is that we'll have an extra build. Not much of a problem.
-                    mCompileResources = true;
-
-                    // we want a warning
-                    outputWarning = true;
-                } else {
-                    // look to see if this file was generated by a processor.
-                    for (SourceChangeHandler handler : mSourceChangeHandlers) {
-                        if (handler.handleGeneratedFile(file, kind)) {
-                            outputWarning = true;
-                            break; // there shouldn't be 2 processors that handle the same file.
-                        }
-                    }
-                }
-
-                if (outputWarning) {
-                    if (kind == IResourceDelta.REMOVED) {
-                        // We print an error just so that it's red, but it's just a warning really.
-                        String msg = String.format(Messages.s_Removed_Recreating_s, fileName);
-                        AdtPlugin.printErrorToConsole(mBuilder.getProject(), msg);
-                    } else if (kind == IResourceDelta.CHANGED) {
-                        // the file was modified manually! we can't allow it.
-                        String msg = String.format(Messages.s_Modified_Manually_Recreating_s,
-                                fileName);
-                        AdtPlugin.printErrorToConsole(mBuilder.getProject(), msg);
-                    }
-                }
-            } else {
-                // this is another source folder.
-                for (SourceChangeHandler handler : mSourceChangeHandlers) {
-                    handler.handleSourceFile(file, kind);
-                }
-            }
-
-            // no children.
-            return false;
-        } else if (mInRes) {
-            // if we are in the res folder, we are looking for the following
-            // changes:
-            // - added/removed/modified xml files.
-            // - added/removed files of any other type
-
-            // if the resource is a folder, we just go straight to the
-            // children
-            if (resource.getType() == IResource.FOLDER) {
-                return true;
-            }
-
-            // get the extension of the resource
-            String ext = resource.getFileExtension();
-            int kind = delta.getKind();
-
-            String p = resource.getProjectRelativePath().toString();
-            String message = null;
-            switch (kind) {
-                case IResourceDelta.CHANGED:
-                    // display verbose message
-                    message = String.format(Messages.s_Modified_Recreating_s, p);
-                    break;
-                case IResourceDelta.ADDED:
-                    // display verbose message
-                    message = String.format(Messages.Added_s_s_Needs_Updating, p,
-                            SdkConstants.FN_RESOURCE_CLASS);
-                    break;
-                case IResourceDelta.REMOVED:
-                    // display verbose message
-                    message = String.format(Messages.s_Removed_s_Needs_Updating, p,
-                            SdkConstants.FN_RESOURCE_CLASS);
-                    break;
-            }
-            if (message != null) {
-                AdtPlugin.printBuildToConsole(BuildVerbosity.VERBOSE,
-                        mBuilder.getProject(), message);
-            }
-
-            // If it's an XML resource, check the syntax
-            if (SdkConstants.EXT_XML.equalsIgnoreCase(ext) && kind != IResourceDelta.REMOVED) {
-                // check xml Validity
-                mBuilder.checkXML(resource, this);
-            }
-            // Whether or not to generate R.java for a changed resource is taken care of by the
-            // Resource Manager.
-        } else if (resource instanceof IFolder) {
-            // first check if we are in the android output folder.
-            if (resource.equals(mAndroidOutputFolder)) {
-                // we want to visit the merged manifest.
-                return true;
-            }
-
-            // in this case we may be inside a folder that contains a source
-            // folder, go through the list of known source folders
-
-            for (IPath sourceFolderPath : mSourceFolders) {
-                // first check if they match exactly.
-                if (sourceFolderPath.equals(path)) {
-                    // this is a source folder!
-                    mInRes = false;
-                    mSourceFolder = getFolder(sourceFolderPath); // all non null due to test above
-                    mIsGenSourceFolder = path.segmentCount() == 2 &&
-                            path.segment(1).equals(SdkConstants.FD_GEN_SOURCES);
-                    return true;
-                }
-
-                // check if we are on the way to a source folder.
-                int count = sourceFolderPath.matchingFirstSegments(path);
-                if (count == path.segmentCount()) {
-                    mInRes = false;
-                    return true;
-                }
-            }
-
-            // if we're here, we are visiting another folder
-            // like /$Project/bin/ for instance (we get notified for changes
-            // in .class!)
-            // This could also be another source folder and we have found
-            // R.java in a previous source folder
-            // We don't want to visit its children
-            return false;
-        }
-
-        return false;
-    }
-
-    /**
-     * Returns a handle to the folder identified by the given path in this container.
-     * <p/>The different with {@link IContainer#getFolder(IPath)} is that this returns a non
-     * null object only if the resource actually exists and is a folder (and not a file)
-     * @param path the path of the folder to return.
-     * @return a handle to the folder if it exists, or null otherwise.
-     */
-    private IFolder getFolder(IPath path) {
-        IResource resource = mRoot.findMember(path);
-        if (resource != null && resource.exists() && resource.getType() == IResource.FOLDER) {
-            return (IFolder)resource;
-        }
-
-        return null;
-    }
-
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/build/builders/ResourceManagerBuilder.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/build/builders/ResourceManagerBuilder.java
deleted file mode 100644
index 8e01cca..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/build/builders/ResourceManagerBuilder.java
+++ /dev/null
@@ -1,317 +0,0 @@
-/*
- * Copyright (C) 2007 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.build.builders;
-
-import com.android.SdkConstants;
-import com.android.ide.eclipse.adt.AdtConstants;
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.ide.eclipse.adt.internal.build.Messages;
-import com.android.ide.eclipse.adt.internal.preferences.AdtPrefs;
-import com.android.ide.eclipse.adt.internal.preferences.AdtPrefs.BuildVerbosity;
-import com.android.ide.eclipse.adt.internal.project.BaseProjectHelper;
-import com.android.ide.eclipse.adt.internal.project.ProjectHelper;
-import com.android.ide.eclipse.adt.internal.sdk.ProjectState;
-import com.android.ide.eclipse.adt.internal.sdk.Sdk;
-import com.android.sdklib.BuildToolInfo;
-import com.android.sdklib.IAndroidTarget;
-import com.android.utils.Pair;
-
-import org.eclipse.core.resources.IFolder;
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IWorkspaceRoot;
-import org.eclipse.core.resources.IncrementalProjectBuilder;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.core.runtime.SubProgressMonitor;
-import org.eclipse.core.runtime.jobs.Job;
-import org.eclipse.jdt.core.IClasspathEntry;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.JavaCore;
-
-import java.util.List;
-import java.util.Map;
-
-/**
- * Resource manager builder whose only purpose is to refresh the resource folder
- * so that the other builder use an up to date version.
- */
-public class ResourceManagerBuilder extends BaseBuilder {
-
-    public static final String ID = "com.android.ide.eclipse.adt.ResourceManagerBuilder"; //$NON-NLS-1$
-
-    public ResourceManagerBuilder() {
-        super();
-    }
-
-    @Override
-    protected void clean(IProgressMonitor monitor) throws CoreException {
-        super.clean(monitor);
-
-        // Get the project.
-        IProject project = getProject();
-
-        // Clear the project of the generic markers
-        removeMarkersFromContainer(project, AdtConstants.MARKER_ADT);
-    }
-
-    // build() returns a list of project from which this project depends for future compilation.
-    @SuppressWarnings("unchecked")
-    @Override
-    protected IProject[] build(int kind, Map args, IProgressMonitor monitor)
-            throws CoreException {
-        // Get the project.
-        final IProject project = getProject();
-        IJavaProject javaProject = JavaCore.create(project);
-
-        // Clear the project of the generic markers
-        removeMarkersFromContainer(project, AdtConstants.MARKER_ADT);
-
-        // check for existing target marker, in which case we abort.
-        // (this means: no SDK, no target, or unresolvable target.)
-        try {
-            abortOnBadSetup(javaProject, null);
-        } catch (AbortBuildException e) {
-            return null;
-        }
-
-        // Check the compiler compliance level, displaying the error message
-        // since this is the first builder.
-        Pair<Integer, String> result = ProjectHelper.checkCompilerCompliance(project);
-        String errorMessage = null;
-        switch (result.getFirst().intValue()) {
-            case ProjectHelper.COMPILER_COMPLIANCE_LEVEL:
-                errorMessage = Messages.Requires_Compiler_Compliance_s;
-                break;
-            case ProjectHelper.COMPILER_COMPLIANCE_SOURCE:
-                errorMessage = Messages.Requires_Source_Compatibility_s;
-                break;
-            case ProjectHelper.COMPILER_COMPLIANCE_CODEGEN_TARGET:
-                errorMessage = Messages.Requires_Class_Compatibility_s;
-                break;
-        }
-
-        if (errorMessage != null) {
-            errorMessage = String.format(errorMessage,
-                    result.getSecond() == null ? "(no value)" : result.getSecond());
-
-            if (JavaCore.VERSION_1_7.equals(result.getSecond())) {
-                // If the user is trying to target 1.7 but compiling with something older,
-                // the error message can be a bit misleading; instead point them in the
-                // direction of updating the project's build target.
-                Sdk currentSdk = Sdk.getCurrent();
-                if (currentSdk != null) {
-                    IAndroidTarget target = currentSdk.getTarget(project.getProject());
-                    if (target != null && target.getVersion().getApiLevel() < 19) {
-                        errorMessage = "Using 1.7 requires compiling with Android 4.4 " +
-                                "(KitKat); currently using " + target.getVersion();
-                    }
-
-                    ProjectState projectState = Sdk.getProjectState(project);
-                    if (projectState != null) {
-                        BuildToolInfo buildToolInfo = projectState.getBuildToolInfo();
-                        if (buildToolInfo == null) {
-                            buildToolInfo = currentSdk.getLatestBuildTool();
-                        }
-                        if (buildToolInfo != null && buildToolInfo.getRevision().getMajor() < 19) {
-                            errorMessage = "Using 1.7 requires using Android Build Tools " +
-                                    "version 19 or later; currently using " +
-                                    buildToolInfo.getRevision();
-                        }
-                    }
-                }
-            }
-
-            markProject(AdtConstants.MARKER_ADT, errorMessage, IMarker.SEVERITY_ERROR);
-            AdtPlugin.printErrorToConsole(project, errorMessage);
-
-            return null;
-        }
-
-        // Check that the SDK directory has been setup.
-        String osSdkFolder = AdtPlugin.getOsSdkFolder();
-
-        if (osSdkFolder == null || osSdkFolder.length() == 0) {
-            AdtPlugin.printErrorToConsole(project, Messages.No_SDK_Setup_Error);
-            markProject(AdtConstants.MARKER_ADT, Messages.No_SDK_Setup_Error,
-                    IMarker.SEVERITY_ERROR);
-
-            return null;
-        }
-
-        // check the 'gen' source folder is present
-        boolean hasGenSrcFolder = false; // whether the project has a 'gen' source folder setup
-
-        IClasspathEntry[] classpaths = javaProject.readRawClasspath();
-        if (classpaths != null) {
-            for (IClasspathEntry e : classpaths) {
-                if (e.getEntryKind() == IClasspathEntry.CPE_SOURCE) {
-                    IPath path = e.getPath();
-                    if (path.segmentCount() == 2 &&
-                            path.segment(1).equals(SdkConstants.FD_GEN_SOURCES)) {
-                        hasGenSrcFolder = true;
-                        break;
-                    }
-                }
-            }
-        }
-
-        boolean genFolderPresent = false; // whether the gen folder actually exists
-        IResource resource = project.findMember(SdkConstants.FD_GEN_SOURCES);
-        genFolderPresent = resource != null && resource.exists();
-
-        if (hasGenSrcFolder == false && genFolderPresent) {
-            // No source folder setup for 'gen' in the project, but there's already a
-            // 'gen' resource (file or folder).
-            String message;
-            if (resource.getType() == IResource.FOLDER) {
-                // folder exists already! This is an error. If the folder had been created
-                // by the NewProjectWizard, it'd be a source folder.
-                message = String.format("%1$s already exists but is not a source folder. Convert to a source folder or rename it.",
-                        resource.getFullPath().toString());
-            } else {
-                // resource exists but is not a folder.
-                message = String.format(
-                        "Resource %1$s is in the way. ADT needs a source folder called 'gen' to work. Rename or delete resource.",
-                        resource.getFullPath().toString());
-            }
-
-            AdtPlugin.printErrorToConsole(project, message);
-            markProject(AdtConstants.MARKER_ADT, message, IMarker.SEVERITY_ERROR);
-
-            return null;
-        } else if (hasGenSrcFolder == false || genFolderPresent == false) {
-            // either there is no 'gen' source folder in the project (older SDK),
-            // or the folder does not exist (was deleted, or was a fresh svn checkout maybe.)
-
-            // In case we are migrating from an older SDK, we go through the current source
-            // folders and delete the generated Java files.
-            List<IPath> sourceFolders = BaseProjectHelper.getSourceClasspaths(javaProject);
-            IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
-            for (IPath path : sourceFolders) {
-                IResource member = root.findMember(path);
-                if (member != null) {
-                    removeDerivedResources(member, monitor);
-                }
-            }
-
-            // create the new source folder, if needed
-            IFolder genFolder = project.getFolder(SdkConstants.FD_GEN_SOURCES);
-            if (genFolderPresent == false) {
-                AdtPlugin.printBuildToConsole(BuildVerbosity.VERBOSE, project,
-                        "Creating 'gen' source folder for generated Java files");
-                genFolder.create(true /* force */, true /* local */,
-                        new SubProgressMonitor(monitor, 10));
-            }
-
-            // add it to the source folder list, if needed only (or it will throw)
-            if (hasGenSrcFolder == false) {
-                IClasspathEntry[] entries = javaProject.getRawClasspath();
-                entries = ProjectHelper.addEntryToClasspath(entries,
-                        JavaCore.newSourceEntry(genFolder.getFullPath()));
-                javaProject.setRawClasspath(entries, new SubProgressMonitor(monitor, 10));
-            }
-
-            // refresh specifically the gen folder first, as it may break the build
-            // if it doesn't arrive in time then refresh the whole project as usual.
-            genFolder.refreshLocal(IResource.DEPTH_ZERO, new SubProgressMonitor(monitor, 10));
-            project.refreshLocal(IResource.DEPTH_INFINITE, new SubProgressMonitor(monitor, 10));
-
-            // it seems like doing this fails to properly rebuild the project. the Java builder
-            // running right after this builder will not see the gen folder, and will not be
-            // restarted after this build. Therefore in this particular case, we start another
-            // build asynchronously so that it's rebuilt after this build.
-            launchJob(new Job("rebuild") {
-                @Override
-                protected IStatus run(IProgressMonitor m) {
-                    try {
-                        project.build(IncrementalProjectBuilder.INCREMENTAL_BUILD, m);
-                        return Status.OK_STATUS;
-                    } catch (CoreException e) {
-                        return e.getStatus();
-                    }
-                }
-            });
-
-        }
-
-        // convert older projects which use bin as the eclipse output folder into projects
-        // using bin/classes
-        IFolder androidOutput = BaseProjectHelper.getAndroidOutputFolder(project);
-        IFolder javaOutput = BaseProjectHelper.getJavaOutputFolder(project);
-        if (androidOutput.exists() == false || javaOutput == null ||
-                javaOutput.getParent().equals(androidOutput) == false) {
-            // get what we want as the new java output.
-            IFolder newJavaOutput = androidOutput.getFolder(SdkConstants.FD_CLASSES_OUTPUT);
-
-            if (androidOutput.exists() == false) {
-                androidOutput.create(true /*force*/, true /*local*/, monitor);
-            }
-
-            if (newJavaOutput.exists() == false) {
-                newJavaOutput.create(true /*force*/, true /*local*/, monitor);
-            }
-
-            // set the java output to this project.
-            javaProject.setOutputLocation(newJavaOutput.getFullPath(), monitor);
-
-            // need to do a full build. Can't build while we're already building, so launch a
-            // job to build it right after this build
-            launchJob(new Job("rebuild") {
-                @Override
-                protected IStatus run(IProgressMonitor jobMonitor) {
-                    try {
-                        project.build(IncrementalProjectBuilder.CLEAN_BUILD, jobMonitor);
-                        return Status.OK_STATUS;
-                    } catch (CoreException e) {
-                        return e.getStatus();
-                    }
-                }
-            });
-        }
-
-        // check that we have bin/res/
-        IFolder binResFolder = androidOutput.getFolder(SdkConstants.FD_RESOURCES);
-        if (binResFolder.exists() == false) {
-            binResFolder.create(true /* force */, true /* local */,
-                    new SubProgressMonitor(monitor, 10));
-            project.refreshLocal(IResource.DEPTH_ONE, new SubProgressMonitor(monitor, 10));
-        }
-
-        // Check the preference to be sure we are supposed to refresh
-        // the folders.
-        if (AdtPrefs.getPrefs().getBuildForceResResfresh()) {
-            AdtPlugin.printBuildToConsole(BuildVerbosity.VERBOSE, project, Messages.Refreshing_Res);
-
-            // refresh the res folder.
-            IFolder resFolder = project.getFolder(AdtConstants.WS_RESOURCES);
-            resFolder.refreshLocal(IResource.DEPTH_INFINITE, monitor);
-
-            // Also refresh the assets folder to make sure the ApkBuilder
-            // will now it's changed and will force a new resource packaging.
-            IFolder assetsFolder = project.getFolder(AdtConstants.WS_ASSETS);
-            assetsFolder.refreshLocal(IResource.DEPTH_INFINITE, monitor);
-        }
-
-        return null;
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/AndroidContentAssist.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/AndroidContentAssist.java
deleted file mode 100644
index 5aac51f..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/AndroidContentAssist.java
+++ /dev/null
@@ -1,1331 +0,0 @@
-/*
- * Copyright (C) 2007 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.editors;
-
-import static com.android.SdkConstants.ANDROID_URI;
-import static com.android.SdkConstants.ATTR_LAYOUT_RESOURCE_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.UNIT_DP;
-import static com.android.SdkConstants.UNIT_IN;
-import static com.android.SdkConstants.UNIT_MM;
-import static com.android.SdkConstants.UNIT_PT;
-import static com.android.SdkConstants.UNIT_PX;
-import static com.android.SdkConstants.UNIT_SP;
-import static com.android.ide.eclipse.adt.internal.editors.descriptors.AttributeDescriptor.ATTRIBUTE_ICON_FILENAME;
-
-import com.android.ide.common.api.IAttributeInfo;
-import com.android.ide.common.api.IAttributeInfo.Format;
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.ide.eclipse.adt.internal.editors.descriptors.AttributeDescriptor;
-import com.android.ide.eclipse.adt.internal.editors.descriptors.ElementDescriptor;
-import com.android.ide.eclipse.adt.internal.editors.descriptors.IDescriptorProvider;
-import com.android.ide.eclipse.adt.internal.editors.descriptors.SeparatorAttributeDescriptor;
-import com.android.ide.eclipse.adt.internal.editors.descriptors.TextValueDescriptor;
-import com.android.ide.eclipse.adt.internal.editors.layout.gle2.DomUtilities;
-import com.android.ide.eclipse.adt.internal.editors.uimodel.UiAttributeNode;
-import com.android.ide.eclipse.adt.internal.editors.uimodel.UiElementNode;
-import com.android.ide.eclipse.adt.internal.editors.uimodel.UiFlagAttributeNode;
-import com.android.ide.eclipse.adt.internal.editors.uimodel.UiResourceAttributeNode;
-import com.android.ide.eclipse.adt.internal.sdk.AndroidTargetData;
-import com.android.utils.Pair;
-import com.android.utils.XmlUtils;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.jdt.core.IType;
-import org.eclipse.jdt.ui.ISharedImages;
-import org.eclipse.jdt.ui.JavaUI;
-import org.eclipse.jface.text.BadLocationException;
-import org.eclipse.jface.text.IDocument;
-import org.eclipse.jface.text.IRegion;
-import org.eclipse.jface.text.ITextViewer;
-import org.eclipse.jface.text.contentassist.ICompletionProposal;
-import org.eclipse.jface.text.contentassist.IContentAssistProcessor;
-import org.eclipse.jface.text.contentassist.IContextInformation;
-import org.eclipse.jface.text.contentassist.IContextInformationValidator;
-import org.eclipse.jface.text.source.ISourceViewer;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.wst.sse.core.internal.provisional.IndexedRegion;
-import org.w3c.dom.Node;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Comparator;
-import java.util.EnumSet;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.regex.Pattern;
-
-/**
- * Content Assist Processor for Android XML files
- * <p>
- * Remaining corner cases:
- * <ul>
- * <li>Completion does not work right if there is a space between the = and the opening
- *   quote.
- * <li>Replacement completion does not work right if the caret is to the left of the
- *   opening quote, where the opening quote is a single quote, and the replacement items use
- *   double quotes.
- * </ul>
- */
-@SuppressWarnings("restriction") // XML model
-public abstract class AndroidContentAssist implements IContentAssistProcessor {
-
-    /** Regexp to detect a full attribute after an element tag.
-     * <pre>Syntax:
-     *    name = "..." quoted string with all but < and "
-     * or:
-     *    name = '...' quoted string with all but < and '
-     * </pre>
-     */
-    private static Pattern sFirstAttribute = Pattern.compile(
-            "^ *[a-zA-Z_:]+ *= *(?:\"[^<\"]*\"|'[^<']*')");  //$NON-NLS-1$
-
-    /** Regexp to detect an element tag name */
-    private static Pattern sFirstElementWord = Pattern.compile("^[a-zA-Z0-9_:.-]+"); //$NON-NLS-1$
-
-    /** Regexp to detect whitespace */
-    private static Pattern sWhitespace = Pattern.compile("\\s+"); //$NON-NLS-1$
-
-    protected final static String ROOT_ELEMENT = "";
-
-    /** Descriptor of the root of the XML hierarchy. This a "fake" ElementDescriptor which
-     *  is used to list all the possible roots given by actual implementations.
-     *  DO NOT USE DIRECTLY. Call {@link #getRootDescriptor()} instead. */
-    private ElementDescriptor mRootDescriptor;
-
-    private final int mDescriptorId;
-
-    protected AndroidXmlEditor mEditor;
-
-    /**
-     * Constructor for AndroidContentAssist
-     * @param descriptorId An id for {@link AndroidTargetData#getDescriptorProvider(int)}.
-     *      The Id can be one of {@link AndroidTargetData#DESCRIPTOR_MANIFEST},
-     *      {@link AndroidTargetData#DESCRIPTOR_LAYOUT},
-     *      {@link AndroidTargetData#DESCRIPTOR_MENU},
-     *      or {@link AndroidTargetData#DESCRIPTOR_OTHER_XML}.
-     *      All other values will throw an {@link IllegalArgumentException} later at runtime.
-     */
-    public AndroidContentAssist(int descriptorId) {
-        mDescriptorId = descriptorId;
-    }
-
-    /**
-     * Returns a list of completion proposals based on the
-     * specified location within the document that corresponds
-     * to the current cursor position within the text viewer.
-     *
-     * @param viewer the viewer whose document is used to compute the proposals
-     * @param offset an offset within the document for which completions should be computed
-     * @return an array of completion proposals or <code>null</code> if no proposals are possible
-     *
-     * @see org.eclipse.jface.text.contentassist.IContentAssistProcessor#computeCompletionProposals(org.eclipse.jface.text.ITextViewer, int)
-     */
-    @Override
-    public ICompletionProposal[] computeCompletionProposals(ITextViewer viewer, int offset) {
-        String wordPrefix = extractElementPrefix(viewer, offset);
-
-        if (mEditor == null) {
-            mEditor = AndroidXmlEditor.fromTextViewer(viewer);
-            if (mEditor == null) {
-                // This should not happen. Duck and forget.
-                AdtPlugin.log(IStatus.ERROR, "Editor not found during completion");
-                return null;
-            }
-        }
-
-        // List of proposals, in the order presented to the user.
-        List<ICompletionProposal> proposals = new ArrayList<ICompletionProposal>(80);
-
-        // Look up the caret context - where in an element, or between elements, or
-        // within an element's children, is the given caret offset located?
-        Pair<Node, Node> context = DomUtilities.getNodeContext(viewer.getDocument(), offset);
-        if (context == null) {
-            return null;
-        }
-        Node parentNode = context.getFirst();
-        Node currentNode = context.getSecond();
-        assert parentNode != null || currentNode != null;
-
-        UiElementNode rootUiNode = mEditor.getUiRootNode();
-        if (currentNode == null || currentNode.getNodeType() == Node.TEXT_NODE) {
-             UiElementNode parentUiNode =
-                 rootUiNode == null ? null : rootUiNode.findXmlNode(parentNode);
-             computeTextValues(proposals, offset, parentNode, currentNode, parentUiNode,
-                    wordPrefix);
-        } else if (currentNode.getNodeType() == Node.ELEMENT_NODE) {
-            String parent = currentNode.getNodeName();
-            AttribInfo info = parseAttributeInfo(viewer, offset, offset - wordPrefix.length());
-            char nextChar = extractChar(viewer, offset);
-            if (info != null) {
-                // check to see if we can find a UiElementNode matching this XML node
-                UiElementNode currentUiNode = rootUiNode == null
-                    ? null : rootUiNode.findXmlNode(currentNode);
-                computeAttributeProposals(proposals, viewer, offset, wordPrefix, currentUiNode,
-                        parentNode, currentNode, parent, info, nextChar);
-            } else {
-                computeNonAttributeProposals(viewer, offset, wordPrefix, proposals, parentNode,
-                        currentNode, parent, nextChar);
-            }
-        }
-
-        return proposals.toArray(new ICompletionProposal[proposals.size()]);
-    }
-
-    private void computeNonAttributeProposals(ITextViewer viewer, int offset, String wordPrefix,
-            List<ICompletionProposal> proposals, Node parentNode, Node currentNode, String parent,
-            char nextChar) {
-        if (startsWith(parent, wordPrefix)) {
-            // We are still editing the element's tag name, not the attributes
-            // (the element's tag name may not even be complete)
-
-            Object[] choices = getChoicesForElement(parent, currentNode);
-            if (choices == null || choices.length == 0) {
-                return;
-            }
-
-            int replaceLength = parent.length() - wordPrefix.length();
-            boolean isNew = replaceLength == 0 && nextNonspaceChar(viewer, offset) == '<';
-            // Special case: if we are right before the beginning of a new
-            // element, wipe out the replace length such that we insert before it,
-            // we don't edit the current element.
-            if (wordPrefix.length() == 0 && nextChar == '<') {
-                replaceLength = 0;
-                isNew = true;
-            }
-
-            // If we found some suggestions, do we need to add an opening "<" bracket
-            // for the element? We don't if the cursor is right after "<" or "</".
-            // Per XML Spec, there's no whitespace between "<" or "</" and the tag name.
-            char needTag = computeElementNeedTag(viewer, offset, wordPrefix);
-
-            addMatchingProposals(proposals, choices, offset,
-                    parentNode != null ? parentNode : null, wordPrefix, needTag,
-                    false /* isAttribute */, isNew, false /*isComplete*/,
-                    replaceLength);
-        }
-    }
-
-    private void computeAttributeProposals(List<ICompletionProposal> proposals, ITextViewer viewer,
-            int offset, String wordPrefix, UiElementNode currentUiNode, Node parentNode,
-            Node currentNode, String parent, AttribInfo info, char nextChar) {
-        // We're editing attributes in an element node (either the attributes' names
-        // or their values).
-
-        if (info.isInValue) {
-            if (computeAttributeValues(proposals, offset, parent, info.name, currentNode,
-                    wordPrefix, info.skipEndTag, info.replaceLength)) {
-                return;
-            }
-        }
-
-        // Look up attribute proposals based on descriptors
-        Object[] choices = getChoicesForAttribute(parent, currentNode, currentUiNode,
-                info, wordPrefix);
-        if (choices == null || choices.length == 0) {
-            return;
-        }
-
-        int replaceLength = info.replaceLength;
-        if (info.correctedPrefix != null) {
-            wordPrefix = info.correctedPrefix;
-        }
-        char needTag = info.needTag;
-        // Look to the right and see if we're followed by whitespace
-        boolean isNew = replaceLength == 0
-            && (Character.isWhitespace(nextChar) || nextChar == '>' || nextChar == '/');
-
-        addMatchingProposals(proposals, choices, offset, parentNode != null ? parentNode : null,
-                wordPrefix, needTag, true /* isAttribute */, isNew, info.skipEndTag,
-                replaceLength);
-    }
-
-    private char computeElementNeedTag(ITextViewer viewer, int offset, String wordPrefix) {
-        char needTag = 0;
-        int offset2 = offset - wordPrefix.length() - 1;
-        char c1 = extractChar(viewer, offset2);
-        if (!((c1 == '<') || (c1 == '/' && extractChar(viewer, offset2 - 1) == '<'))) {
-            needTag = '<';
-        }
-        return needTag;
-    }
-
-    protected int computeTextReplaceLength(Node currentNode, int offset) {
-        if (currentNode == null) {
-            return 0;
-        }
-
-        assert currentNode != null && currentNode.getNodeType() == Node.TEXT_NODE;
-
-        String nodeValue = currentNode.getNodeValue();
-        int relativeOffset = offset - ((IndexedRegion) currentNode).getStartOffset();
-        int lineEnd = nodeValue.indexOf('\n', relativeOffset);
-        if (lineEnd == -1) {
-            lineEnd = nodeValue.length();
-        }
-        return lineEnd - relativeOffset;
-    }
-
-    /**
-     * Gets the choices when the user is editing the name of an XML element.
-     * <p/>
-     * The user is editing the name of an element (the "parent").
-     * Find the grand-parent and if one is found, return its children element list.
-     * The name which is being edited should be one of those.
-     * <p/>
-     * Example: <manifest><applic*cursor* => returns the list of all elements that
-     * can be found under <manifest>, of which <application> is one of the choices.
-     *
-     * @return an ElementDescriptor[] or null if no valid element was found.
-     */
-    protected Object[] getChoicesForElement(String parent, Node currentNode) {
-        ElementDescriptor grandparent = null;
-        if (currentNode.getParentNode().getNodeType() == Node.ELEMENT_NODE) {
-            grandparent = getDescriptor(currentNode.getParentNode().getNodeName());
-        } else if (currentNode.getParentNode().getNodeType() == Node.DOCUMENT_NODE) {
-            grandparent = getRootDescriptor();
-        }
-        if (grandparent != null) {
-            for (ElementDescriptor e : grandparent.getChildren()) {
-                if (e.getXmlName().startsWith(parent)) {
-                    return sort(grandparent.getChildren());
-                }
-            }
-        }
-
-        return null;
-    }
-
-    /** Non-destructively sort a list of ElementDescriptors and return the result */
-    protected static ElementDescriptor[] sort(ElementDescriptor[] elements) {
-        if (elements != null && elements.length > 1) {
-            // Sort alphabetically. Must make copy to not destroy original.
-            ElementDescriptor[] copy = new ElementDescriptor[elements.length];
-            System.arraycopy(elements, 0, copy, 0, elements.length);
-
-            Arrays.sort(copy, new Comparator<ElementDescriptor>() {
-                @Override
-                public int compare(ElementDescriptor e1, ElementDescriptor e2) {
-                    return e1.getXmlLocalName().compareTo(e2.getXmlLocalName());
-                }
-            });
-
-            return copy;
-        }
-
-        return elements;
-    }
-
-    /**
-     * Gets the choices when the user is editing an XML attribute.
-     * <p/>
-     * In input, attrInfo contains details on the analyzed context, namely whether the
-     * user is editing an attribute value (isInValue) or an attribute name.
-     * <p/>
-     * In output, attrInfo also contains two possible new values (this is a hack to circumvent
-     * the lack of out-parameters in Java):
-     * - AttribInfo.correctedPrefix if the user has been editing an attribute value and it has
-     *   been detected that what the user typed is different from what extractElementPrefix()
-     *   predicted. This happens because extractElementPrefix() stops when a character that
-     *   cannot be an element name appears whereas parseAttributeInfo() uses a grammar more
-     *   lenient as suitable for attribute values.
-     * - AttribInfo.needTag will be non-zero if we find that the attribute completion proposal
-     *   must be double-quoted.
-     * @param currentUiNode
-     *
-     * @return an AttributeDescriptor[] if the user is editing an attribute name.
-     *         a String[] if the user is editing an attribute value with some known values,
-     *         or null if nothing is known about the context.
-     */
-    private Object[] getChoicesForAttribute(
-            String parent, Node currentNode, UiElementNode currentUiNode, AttribInfo attrInfo,
-            String wordPrefix) {
-        Object[] choices = null;
-        if (attrInfo.isInValue) {
-            // Editing an attribute's value... Get the attribute name and then the
-            // possible choices for the tuple(parent,attribute)
-            String value = attrInfo.valuePrefix;
-            if (value.startsWith("'") || value.startsWith("\"")) {   //$NON-NLS-1$   //$NON-NLS-2$
-                value = value.substring(1);
-                // The prefix that was found at the beginning only scan for characters
-                // valid for tag name. We now know the real prefix for this attribute's
-                // value, which is needed to generate the completion choices below.
-                attrInfo.correctedPrefix = value;
-            } else {
-                attrInfo.needTag = '"';
-            }
-
-            if (currentUiNode != null) {
-                // look for an UI attribute matching the current attribute name
-                String attrName = attrInfo.name;
-                // remove any namespace prefix from the attribute name
-                int pos = attrName.indexOf(':');
-                if (pos >= 0) {
-                    attrName = attrName.substring(pos + 1);
-                }
-
-                UiAttributeNode currAttrNode = null;
-                for (UiAttributeNode attrNode : currentUiNode.getAllUiAttributes()) {
-                    if (attrNode.getDescriptor().getXmlLocalName().equals(attrName)) {
-                        currAttrNode = attrNode;
-                        break;
-                    }
-                }
-
-                if (currAttrNode != null) {
-                    choices = getAttributeValueChoices(currAttrNode, attrInfo, value);
-                }
-            }
-
-            if (choices == null) {
-                // fallback on the older descriptor-only based lookup.
-
-                // in order to properly handle the special case of the name attribute in
-                // the action tag, we need the grandparent of the action node, to know
-                // what type of actions we need.
-                // e.g. activity -> intent-filter -> action[@name]
-                String greatGrandParentName = null;
-                Node grandParent = currentNode.getParentNode();
-                if (grandParent != null) {
-                    Node greatGrandParent = grandParent.getParentNode();
-                    if (greatGrandParent != null) {
-                        greatGrandParentName = greatGrandParent.getLocalName();
-                    }
-                }
-
-                AndroidTargetData data = mEditor.getTargetData();
-                if (data != null) {
-                    choices = data.getAttributeValues(parent, attrInfo.name, greatGrandParentName);
-                }
-            }
-        } else {
-            // Editing an attribute's name... Get attributes valid for the parent node.
-            if (currentUiNode != null) {
-                choices = currentUiNode.getAttributeDescriptors();
-            } else {
-                ElementDescriptor parentDesc = getDescriptor(parent);
-                if (parentDesc != null) {
-                    choices = parentDesc.getAttributes();
-                }
-            }
-        }
-        return choices;
-    }
-
-    protected Object[] getAttributeValueChoices(UiAttributeNode currAttrNode, AttribInfo attrInfo,
-            String value) {
-        Object[] choices;
-        int pos;
-        choices = currAttrNode.getPossibleValues(value);
-        if (choices != null && currAttrNode instanceof UiResourceAttributeNode) {
-            attrInfo.skipEndTag = false;
-        }
-
-        if (currAttrNode instanceof UiFlagAttributeNode) {
-            // A "flag" can consist of several values separated by "or" (|).
-            // If the correct prefix contains such a pipe character, we change
-            // it so that only the currently edited value is completed.
-            pos = value.lastIndexOf('|');
-            if (pos >= 0) {
-                attrInfo.correctedPrefix = value = value.substring(pos + 1);
-                attrInfo.needTag = 0;
-            }
-
-            attrInfo.skipEndTag = false;
-        }
-
-        // Should we do suffix completion on dimension units etc?
-        choices = completeSuffix(choices, value, currAttrNode);
-
-        // Check to see if the user is attempting resource completion
-        AttributeDescriptor attributeDescriptor = currAttrNode.getDescriptor();
-        IAttributeInfo attributeInfo = attributeDescriptor.getAttributeInfo();
-        if (value.startsWith(PREFIX_RESOURCE_REF)
-                && !attributeInfo.getFormats().contains(Format.REFERENCE)) {
-            // Special case: If the attribute value looks like a reference to a
-            // resource, offer to complete it, since in many cases our metadata
-            // does not correctly state whether a resource value is allowed. We don't
-            // offer these for an empty completion context, but if the user has
-            // actually typed "@", in that case list resource matches.
-            // For example, for android:minHeight this makes completion on @dimen/
-            // possible.
-            choices = UiResourceAttributeNode.computeResourceStringMatches(
-                    mEditor, attributeDescriptor, value);
-            attrInfo.skipEndTag = false;
-        } else if (value.startsWith(PREFIX_THEME_REF)
-                && !attributeInfo.getFormats().contains(Format.REFERENCE)) {
-            choices = UiResourceAttributeNode.computeResourceStringMatches(
-                    mEditor, attributeDescriptor, value);
-            attrInfo.skipEndTag = false;
-        }
-
-        return choices;
-    }
-
-    /**
-     * Compute attribute values. Return true if the complete set of values was
-     * added, so addition descriptor information should not be added.
-     */
-    protected boolean computeAttributeValues(List<ICompletionProposal> proposals, int offset,
-            String parentTagName, String attributeName, Node node, String wordPrefix,
-            boolean skipEndTag, int replaceLength) {
-        return false;
-    }
-
-    protected void computeTextValues(List<ICompletionProposal> proposals, int offset,
-            Node parentNode, Node currentNode, UiElementNode uiParent,
-            String wordPrefix) {
-
-       if (parentNode != null) {
-           // Examine the parent of the text node.
-           Object[] choices = getElementChoicesForTextNode(parentNode);
-           if (choices != null && choices.length > 0) {
-               ISourceViewer viewer = mEditor.getStructuredSourceViewer();
-               char needTag = computeElementNeedTag(viewer, offset, wordPrefix);
-
-               int replaceLength = 0;
-               addMatchingProposals(proposals, choices,
-                       offset, parentNode, wordPrefix, needTag,
-                               false /* isAttribute */,
-                               false /*isNew*/,
-                               false /*isComplete*/,
-                               replaceLength);
-           }
-       }
-    }
-
-    /**
-     * Gets the choices when the user is editing an XML text node.
-     * <p/>
-     * This means the user is editing outside of any XML element or attribute.
-     * Simply return the list of XML elements that can be present there, based on the
-     * parent of the current node.
-     *
-     * @return An ElementDescriptor[] or null.
-     */
-    protected ElementDescriptor[] getElementChoicesForTextNode(Node parentNode) {
-        ElementDescriptor[] choices = null;
-        String parent;
-        if (parentNode.getNodeType() == Node.ELEMENT_NODE) {
-            // We're editing a text node which parent is an element node. Limit
-            // content assist to elements valid for the parent.
-            parent = parentNode.getNodeName();
-            ElementDescriptor desc = getDescriptor(parent);
-            if (desc == null && parent.indexOf('.') != -1) {
-                // The parent is a custom view and we don't have metadata about its
-                // allowable children, so just assume any normal layout tag is
-                // legal
-                desc = mRootDescriptor;
-            }
-
-            if (desc != null) {
-                choices = sort(desc.getChildren());
-            }
-        } else if (parentNode.getNodeType() == Node.DOCUMENT_NODE) {
-            // We're editing a text node at the first level (i.e. root node).
-            // Limit content assist to the only valid root elements.
-            choices = sort(getRootDescriptor().getChildren());
-        }
-
-        return choices;
-    }
-
-     /**
-     * Given a list of choices, adds in any that match the current prefix into the
-     * proposals list.
-     * <p/>
-     * Choices is an object array. Items of the array can be:
-     * - ElementDescriptor: a possible element descriptor which XML name should be completed.
-     * - AttributeDescriptor: a possible attribute descriptor which XML name should be completed.
-     * - String: string values to display as-is to the user. Typically those are possible
-     *           values for a given attribute.
-     * - Pair of Strings: the first value is the keyword to insert, and the second value
-     *           is the tooltip/help for the value to be displayed in the documentation popup.
-     */
-    protected void addMatchingProposals(List<ICompletionProposal> proposals, Object[] choices,
-            int offset, Node currentNode, String wordPrefix, char needTag,
-            boolean isAttribute, boolean isNew, boolean skipEndTag, int replaceLength) {
-        if (choices == null) {
-            return;
-        }
-
-        Map<String, String> nsUriMap = new HashMap<String, String>();
-        boolean haveLayoutParams = false;
-
-        for (Object choice : choices) {
-            String keyword = null;
-            String nsPrefix = null;
-            String nsUri = null;
-            Image icon = null;
-            String tooltip = null;
-            if (choice instanceof ElementDescriptor) {
-                keyword = ((ElementDescriptor)choice).getXmlName();
-                icon    = ((ElementDescriptor)choice).getGenericIcon();
-                // Tooltip computed lazily in {@link CompletionProposal}
-            } else if (choice instanceof TextValueDescriptor) {
-                continue; // Value nodes are not part of the completion choices
-            } else if (choice instanceof SeparatorAttributeDescriptor) {
-                continue; // not real attribute descriptors
-            } else if (choice instanceof AttributeDescriptor) {
-                keyword = ((AttributeDescriptor)choice).getXmlLocalName();
-                icon    = ((AttributeDescriptor)choice).getGenericIcon();
-                // Tooltip computed lazily in {@link CompletionProposal}
-
-                // Get the namespace URI for the attribute. Note that some attributes
-                // do not have a namespace and thus return null here.
-                nsUri = ((AttributeDescriptor)choice).getNamespaceUri();
-                if (nsUri != null) {
-                    nsPrefix = nsUriMap.get(nsUri);
-                    if (nsPrefix == null) {
-                        nsPrefix = XmlUtils.lookupNamespacePrefix(currentNode, nsUri, false);
-                        nsUriMap.put(nsUri, nsPrefix);
-                    }
-                }
-                if (nsPrefix != null) {
-                    nsPrefix += ":"; //$NON-NLS-1$
-                }
-
-            } else if (choice instanceof String) {
-                keyword = (String) choice;
-                if (isAttribute) {
-                    icon = IconFactory.getInstance().getIcon(ATTRIBUTE_ICON_FILENAME);
-                }
-            } else if (choice instanceof Pair<?, ?>) {
-                @SuppressWarnings("unchecked")
-                Pair<String, String> pair = (Pair<String, String>) choice;
-                keyword = pair.getFirst();
-                tooltip = pair.getSecond();
-                if (isAttribute) {
-                    icon = IconFactory.getInstance().getIcon(ATTRIBUTE_ICON_FILENAME);
-                }
-            } else if (choice instanceof IType) {
-                IType type = (IType) choice;
-                keyword = type.getFullyQualifiedName();
-                icon = JavaUI.getSharedImages().getImage(ISharedImages.IMG_OBJS_CUNIT);
-            } else {
-                continue; // discard unknown choice
-            }
-
-            String nsKeyword = nsPrefix == null ? keyword : (nsPrefix + keyword);
-
-            if (nameStartsWith(nsKeyword, wordPrefix, nsPrefix)) {
-                keyword = nsKeyword;
-                String endTag = ""; //$NON-NLS-1$
-                if (needTag != 0) {
-                    if (needTag == '"') {
-                        keyword = needTag + keyword;
-                        endTag = String.valueOf(needTag);
-                    } else if (needTag == '<') {
-                        if (elementCanHaveChildren(choice)) {
-                            endTag = String.format("></%1$s>", keyword);  //$NON-NLS-1$
-                        } else {
-                            endTag = "/>";  //$NON-NLS-1$
-                        }
-                        keyword = needTag + keyword + ' ';
-                    } else if (needTag == ' ') {
-                        keyword = needTag + keyword;
-                    }
-                } else if (!isAttribute && isNew) {
-                    if (elementCanHaveChildren(choice)) {
-                        endTag = String.format("></%1$s>", keyword);  //$NON-NLS-1$
-                    } else {
-                        endTag = "/>";  //$NON-NLS-1$
-                    }
-                    keyword = keyword + ' ';
-                }
-
-                final String suffix;
-                int cursorPosition;
-                final String displayString;
-                if (choice instanceof AttributeDescriptor && isNew) {
-                    // Special case for attributes: insert ="" stuff and locate caret inside ""
-                    suffix = "=\"\""; //$NON-NLS-1$
-                    cursorPosition = keyword.length() + suffix.length() - 1;
-                    displayString = keyword + endTag; // don't include suffix;
-                } else {
-                    suffix = endTag;
-                    cursorPosition = keyword.length();
-                    displayString = null;
-                }
-
-                if (skipEndTag) {
-                    assert isAttribute;
-                    cursorPosition++;
-                }
-
-                if (nsPrefix != null &&
-                        keyword.startsWith(ATTR_LAYOUT_RESOURCE_PREFIX, nsPrefix.length())) {
-                    haveLayoutParams = true;
-                }
-
-                // For attributes, automatically insert ns:attribute="" and place the cursor
-                // inside the quotes.
-                // Special case for attributes: insert ="" stuff and locate caret inside ""
-                proposals.add(new CompletionProposal(
-                    this,
-                    choice,
-                    keyword + suffix,                   // String replacementString
-                    offset - wordPrefix.length(),       // int replacementOffset
-                    wordPrefix.length() + replaceLength,// int replacementLength
-                    cursorPosition,                     // cursorPosition
-                    icon,                               // Image image
-                    displayString,                      // displayString
-                    null,                               // IContextInformation contextInformation
-                    tooltip,                            // String additionalProposalInfo
-                    nsPrefix,
-                    nsUri
-                ));
-            }
-        }
-
-        if (wordPrefix.length() > 0 && haveLayoutParams
-                && !wordPrefix.startsWith(ATTR_LAYOUT_RESOURCE_PREFIX)) {
-            // Sort layout parameters to the front if we automatically inserted some
-            // that you didn't request. For example, you typed "width" and we match both
-            // "width" and "layout_width" - should match layout_width.
-            String nsPrefix = nsUriMap.get(ANDROID_URI);
-            if (nsPrefix == null) {
-                nsPrefix = PREFIX_ANDROID;
-            } else {
-                nsPrefix += ':';
-            }
-            if (!(wordPrefix.startsWith(nsPrefix)
-                    && wordPrefix.startsWith(ATTR_LAYOUT_RESOURCE_PREFIX, nsPrefix.length()))) {
-                int nextLayoutIndex = 0;
-                for (int i = 0, n = proposals.size(); i < n; i++) {
-                    ICompletionProposal proposal = proposals.get(i);
-                    String keyword = proposal.getDisplayString();
-                    if (keyword.startsWith(nsPrefix) &&
-                            keyword.startsWith(ATTR_LAYOUT_RESOURCE_PREFIX, nsPrefix.length())
-                            && i != nextLayoutIndex) {
-                        // Swap to front
-                        ICompletionProposal temp = proposals.get(nextLayoutIndex);
-                        proposals.set(nextLayoutIndex, proposal);
-                        proposals.set(i, temp);
-                        nextLayoutIndex++;
-                    }
-                }
-            }
-        }
-    }
-
-    /**
-     * Returns true if the given word starts with the given prefix. The comparison is not
-     * case sensitive.
-     *
-     * @param word the word to test
-     * @param prefix the prefix the word should start with
-     * @return true if the given word starts with the given prefix
-     */
-    protected static boolean startsWith(String word, String prefix) {
-        int prefixLength = prefix.length();
-        int wordLength = word.length();
-        if (wordLength < prefixLength) {
-            return false;
-        }
-
-        for (int i = 0; i < prefixLength; i++) {
-            if (Character.toLowerCase(prefix.charAt(i))
-                    != Character.toLowerCase(word.charAt(i))) {
-                return false;
-            }
-        }
-
-        return true;
-    }
-
-    /** @return the editor associated with this content assist */
-    AndroidXmlEditor getEditor() {
-        return mEditor;
-    }
-
-    /**
-     * This method performs a prefix match for the given word and prefix, with a couple of
-     * Android code completion specific twists:
-     * <ol>
-     * <li> The match is not case sensitive, so {word="fOo",prefix="FoO"} is a match.
-     * <li>If the word to be matched has a namespace prefix, the typed prefix doesn't have
-     * to match it. So {word="android:foo", prefix="foo"} is a match.
-     * <li>If the attribute name part starts with "layout_" it can be omitted. So
-     * {word="android:layout_marginTop",prefix="margin"} is a match, as is
-     * {word="android:layout_marginTop",prefix="android:margin"}.
-     * </ol>
-     *
-     * @param word the full word to be matched, including namespace if any
-     * @param prefix the prefix to check
-     * @param nsPrefix the namespace prefix (android: or local definition of android
-     *            namespace prefix)
-     * @return true if the prefix matches for code completion
-     */
-    protected static boolean nameStartsWith(String word, String prefix, String nsPrefix) {
-        if (nsPrefix == null) {
-            nsPrefix = ""; //$NON-NLS-1$
-        }
-
-        int wordStart = nsPrefix.length();
-        int prefixStart = 0;
-
-        if (startsWith(prefix, nsPrefix)) {
-            // Already matches up through the namespace prefix:
-            prefixStart = wordStart;
-        } else if (startsWith(nsPrefix, prefix)) {
-            return true;
-        }
-
-        int prefixLength = prefix.length();
-        int wordLength = word.length();
-
-        if (wordLength - wordStart < prefixLength - prefixStart) {
-            return false;
-        }
-
-        boolean matches = true;
-        for (int i = prefixStart, j = wordStart; i < prefixLength; i++, j++) {
-            char c1 = Character.toLowerCase(prefix.charAt(i));
-            char c2 = Character.toLowerCase(word.charAt(j));
-            if (c1 != c2) {
-                matches = false;
-                break;
-            }
-        }
-
-        if (!matches && word.startsWith(ATTR_LAYOUT_RESOURCE_PREFIX, wordStart)
-                && !prefix.startsWith(ATTR_LAYOUT_RESOURCE_PREFIX, prefixStart)) {
-            wordStart += ATTR_LAYOUT_RESOURCE_PREFIX.length();
-
-            if (wordLength - wordStart < prefixLength - prefixStart) {
-                return false;
-            }
-
-            for (int i = prefixStart, j = wordStart; i < prefixLength; i++, j++) {
-                char c1 = Character.toLowerCase(prefix.charAt(i));
-                char c2 = Character.toLowerCase(word.charAt(j));
-                if (c1 != c2) {
-                    return false;
-                }
-            }
-
-            return true;
-        }
-
-        return matches;
-    }
-
-    /**
-     * Indicates whether this descriptor describes an element that can potentially
-     * have children (either sub-elements or text value). If an element can have children,
-     * we want to explicitly write an opening and a separate closing tag.
-     * <p/>
-     * Elements can have children if the descriptor has children element descriptors
-     * or if one of the attributes is a TextValueDescriptor.
-     *
-     * @param descriptor An ElementDescriptor or an AttributeDescriptor
-     * @return True if the descriptor is an ElementDescriptor that can have children or a text
-     *         value
-     */
-    private boolean elementCanHaveChildren(Object descriptor) {
-        if (descriptor instanceof ElementDescriptor) {
-            ElementDescriptor desc = (ElementDescriptor) descriptor;
-            if (desc.hasChildren()) {
-                return true;
-            }
-            for (AttributeDescriptor attrDesc : desc.getAttributes()) {
-                if (attrDesc instanceof TextValueDescriptor) {
-                    return true;
-                }
-            }
-        }
-        return false;
-    }
-
-    /**
-     * Returns the element descriptor matching a given XML node name or null if it can't be
-     * found.
-     * <p/>
-     * This is simplistic; ideally we should consider the parent's chain to make sure we
-     * can differentiate between different hierarchy trees. Right now the first match found
-     * is returned.
-     */
-    private ElementDescriptor getDescriptor(String nodeName) {
-        return getRootDescriptor().findChildrenDescriptor(nodeName, true /* recursive */);
-    }
-
-    @Override
-    public IContextInformation[] computeContextInformation(ITextViewer viewer, int offset) {
-        return null;
-    }
-
-    /**
-     * Returns the characters which when entered by the user should
-     * automatically trigger the presentation of possible completions.
-     *
-     * In our case, we auto-activate on opening tags and attributes namespace.
-     *
-     * @return the auto activation characters for completion proposal or <code>null</code>
-     *      if no auto activation is desired
-     */
-    @Override
-    public char[] getCompletionProposalAutoActivationCharacters() {
-        return new char[]{ '<', ':', '=' };
-    }
-
-    @Override
-    public char[] getContextInformationAutoActivationCharacters() {
-        return null;
-    }
-
-    @Override
-    public IContextInformationValidator getContextInformationValidator() {
-        return null;
-    }
-
-    @Override
-    public String getErrorMessage() {
-        return null;
-    }
-
-    /**
-     * Heuristically extracts the prefix used for determining template relevance
-     * from the viewer's document. The default implementation returns the String from
-     * offset backwards that forms a potential XML element name, attribute name or
-     * attribute value.
-     *
-     * The part were we access the document was extracted from
-     * org.eclipse.jface.text.templatesTemplateCompletionProcessor and adapted to our needs.
-     *
-     * @param viewer the viewer
-     * @param offset offset into document
-     * @return the prefix to consider
-     */
-    protected String extractElementPrefix(ITextViewer viewer, int offset) {
-        int i = offset;
-        IDocument document = viewer.getDocument();
-        if (i > document.getLength()) return ""; //$NON-NLS-1$
-
-        try {
-            for (; i > 0; --i) {
-                char ch = document.getChar(i - 1);
-
-                // We want all characters that can form a valid:
-                // - element name, e.g. anything that is a valid Java class/variable literal.
-                // - attribute name, including : for the namespace
-                // - attribute value.
-                // Before we were inclusive and that made the code fragile. So now we're
-                // going to be exclusive: take everything till we get one of:
-                // - any form of whitespace
-                // - any xml separator, e.g. < > ' " and =
-                if (Character.isWhitespace(ch) ||
-                        ch == '<' || ch == '>' || ch == '\'' || ch == '"' || ch == '=') {
-                    break;
-                }
-            }
-
-            return document.get(i, offset - i);
-        } catch (BadLocationException e) {
-            return ""; //$NON-NLS-1$
-        }
-    }
-
-    /**
-     * Extracts the character at the given offset.
-     * Returns 0 if the offset is invalid.
-     */
-    protected char extractChar(ITextViewer viewer, int offset) {
-        IDocument document = viewer.getDocument();
-        if (offset > document.getLength()) return 0;
-
-        try {
-            return document.getChar(offset);
-        } catch (BadLocationException e) {
-            return 0;
-        }
-    }
-
-    /**
-     * Search forward and find the first non-space character and return it. Returns 0 if no
-     * such character was found.
-     */
-    private char nextNonspaceChar(ITextViewer viewer, int offset) {
-        IDocument document = viewer.getDocument();
-        int length = document.getLength();
-        for (; offset < length; offset++) {
-            try {
-                char c = document.getChar(offset);
-                if (!Character.isWhitespace(c)) {
-                    return c;
-                }
-            } catch (BadLocationException e) {
-                return 0;
-            }
-        }
-
-        return 0;
-    }
-
-    /**
-     * Information about the current edit of an attribute as reported by parseAttributeInfo.
-     */
-    protected static class AttribInfo {
-        public AttribInfo() {
-        }
-
-        /** True if the cursor is located in an attribute's value, false if in an attribute name */
-        public boolean isInValue = false;
-        /** The attribute name. Null when not set. */
-        public String name = null;
-        /** The attribute value top the left of the cursor. Null when not set. The value
-         * *may* start with a quote (' or "), in which case we know we don't need to quote
-         * the string for the user */
-        public String valuePrefix = null;
-        /** String typed by the user so far (i.e. right before requesting code completion),
-         *  which will be corrected if we find a possible completion for an attribute value.
-         *  See the long comment in getChoicesForAttribute(). */
-        public String correctedPrefix = null;
-        /** Non-zero if an attribute value need a start/end tag (i.e. quotes or brackets) */
-        public char needTag = 0;
-        /** Number of characters to replace after the prefix */
-        public int replaceLength = 0;
-        /** Should the cursor advance through the end tag when inserted? */
-        public boolean skipEndTag = false;
-    }
-
-    /**
-     * Try to guess if the cursor is editing an element's name or an attribute following an
-     * element. If it's an attribute, try to find if an attribute name is being defined or
-     * its value.
-     * <br/>
-     * This is currently *only* called when we know the cursor is after a complete element
-     * tag name, so it should never return null.
-     * <br/>
-     * Reference for XML syntax: http://www.w3.org/TR/2006/REC-xml-20060816/#sec-starttags
-     * <br/>
-     * @return An AttribInfo describing which attribute is being edited or null if the cursor is
-     *         not editing an attribute (in which case it must be an element's name).
-     */
-    private AttribInfo parseAttributeInfo(ITextViewer viewer, int offset, int prefixStartOffset) {
-        AttribInfo info = new AttribInfo();
-        int originalOffset = offset;
-
-        IDocument document = viewer.getDocument();
-        int n = document.getLength();
-        if (offset <= n) {
-            try {
-                // Look to the right to make sure we aren't sitting on the boundary of the
-                // beginning of a new element with whitespace before it
-                if (offset < n && document.getChar(offset) == '<') {
-                    return null;
-                }
-
-                n = offset;
-                for (;offset > 0; --offset) {
-                    char ch = document.getChar(offset - 1);
-                    if (ch == '>') break;
-                    if (ch == '<') break;
-                }
-
-                // text will contain the full string of the current element,
-                // i.e. whatever is after the "<" to the current cursor
-                String text = document.get(offset, n - offset);
-
-                // Normalize whitespace to single spaces
-                text = sWhitespace.matcher(text).replaceAll(" "); //$NON-NLS-1$
-
-                // Remove the leading element name. By spec, it must be after the < without
-                // any whitespace. If there's nothing left, no attribute has been defined yet.
-                // Be sure to keep any whitespace after the initial word if any, as it matters.
-                text = sFirstElementWord.matcher(text).replaceFirst("");  //$NON-NLS-1$
-
-                // There MUST be space after the element name. If not, the cursor is still
-                // defining the element name.
-                if (!text.startsWith(" ")) { //$NON-NLS-1$
-                    return null;
-                }
-
-                // Remove full attributes:
-                // Syntax:
-                //    name = "..." quoted string with all but < and "
-                // or:
-                //    name = '...' quoted string with all but < and '
-                String temp;
-                do {
-                    temp = text;
-                    text = sFirstAttribute.matcher(temp).replaceFirst("");  //$NON-NLS-1$
-                } while(!temp.equals(text));
-
-                IRegion lineInfo = document.getLineInformationOfOffset(originalOffset);
-                int lineStart = lineInfo.getOffset();
-                String line = document.get(lineStart, lineInfo.getLength());
-                int cursorColumn = originalOffset - lineStart;
-                int prefixLength = originalOffset - prefixStartOffset;
-
-                // Now we're left with 3 cases:
-                // - nothing: either there is no attribute definition or the cursor located after
-                //   a completed attribute definition.
-                // - a string with no =: the user is writing an attribute name. This case can be
-                //   merged with the previous one.
-                // - string with an = sign, optionally followed by a quote (' or "): the user is
-                //   writing the value of the attribute.
-                int posEqual = text.indexOf('=');
-                if (posEqual == -1) {
-                    info.isInValue = false;
-                    info.name = text.trim();
-
-                    // info.name is currently just the prefix of the attribute name.
-                    // Look at the text buffer to find the complete name (since we need
-                    // to know its bounds in order to replace it when a different attribute
-                    // that matches this prefix is chosen)
-                    int nameStart = cursorColumn;
-                    for (int nameEnd = nameStart; nameEnd < line.length(); nameEnd++) {
-                        char c = line.charAt(nameEnd);
-                        if (!(Character.isLetter(c) || c == ':' || c == '_')) {
-                            String nameSuffix = line.substring(nameStart, nameEnd);
-                            info.name = text.trim() + nameSuffix;
-                            break;
-                        }
-                    }
-
-                    info.replaceLength = info.name.length() - prefixLength;
-
-                    if (info.name.length() == 0 && originalOffset > 0) {
-                        // Ensure that attribute names are properly separated
-                        char prevChar = extractChar(viewer, originalOffset - 1);
-                        if (prevChar == '"' || prevChar == '\'') {
-                            // Ensure that the attribute is properly separated from the
-                            // previous element
-                            info.needTag = ' ';
-                        }
-                    }
-                    info.skipEndTag = false;
-                } else {
-                    info.isInValue = true;
-                    info.name = text.substring(0, posEqual).trim();
-                    info.valuePrefix = text.substring(posEqual + 1);
-
-                    char quoteChar = '"'; // Does " or ' surround the XML value?
-                    for (int i = posEqual + 1; i < text.length(); i++) {
-                        if (!Character.isWhitespace(text.charAt(i))) {
-                            quoteChar = text.charAt(i);
-                            break;
-                        }
-                    }
-
-                    // Must compute the complete value
-                    int valueStart = cursorColumn;
-                    int valueEnd = valueStart;
-                    for (; valueEnd < line.length(); valueEnd++) {
-                        char c = line.charAt(valueEnd);
-                        if (c == quoteChar) {
-                            // Make sure this isn't the *opening* quote of the value,
-                            // which is the case if we invoke code completion with the
-                            // caret between the = and the opening quote; in that case
-                            // we consider it value completion, and offer items including
-                            // the quotes, but we shouldn't bail here thinking we have found
-                            // the end of the value.
-                            // Look backwards to make sure we find another " before
-                            // we find a =
-                            boolean isFirst = false;
-                            for (int j = valueEnd - 1; j >= 0; j--) {
-                                char pc = line.charAt(j);
-                                if (pc == '=') {
-                                    isFirst = true;
-                                    break;
-                                } else if (pc == quoteChar) {
-                                    valueStart = j;
-                                    break;
-                                }
-                            }
-                            if (!isFirst) {
-                                info.skipEndTag = true;
-                                break;
-                            }
-                        }
-                    }
-                    int valueEndOffset = valueEnd + lineStart;
-                    info.replaceLength = valueEndOffset - (prefixStartOffset + prefixLength);
-                    // Is the caret to the left of the value quote? If so, include it in
-                    // the replace length.
-                    int valueStartOffset = valueStart + lineStart;
-                    if (valueStartOffset == prefixStartOffset && valueEnd > valueStart) {
-                        info.replaceLength++;
-                    }
-                }
-                return info;
-            } catch (BadLocationException e) {
-                // pass
-            }
-        }
-
-        return null;
-    }
-
-    /** Returns the root descriptor id to use */
-    protected int getRootDescriptorId() {
-        return mDescriptorId;
-    }
-
-    /**
-     * Computes (if needed) and returns the root descriptor.
-     */
-    protected ElementDescriptor getRootDescriptor() {
-        if (mRootDescriptor == null) {
-            AndroidTargetData data = mEditor.getTargetData();
-            if (data != null) {
-                IDescriptorProvider descriptorProvider =
-                    data.getDescriptorProvider(getRootDescriptorId());
-
-                if (descriptorProvider != null) {
-                    mRootDescriptor = new ElementDescriptor("",     //$NON-NLS-1$
-                            descriptorProvider.getRootElementDescriptors());
-                }
-            }
-        }
-
-        return mRootDescriptor;
-    }
-
-    /**
-     * Fixed list of dimension units, along with user documentation, for use by
-     * {@link #completeSuffix}.
-     */
-    private static final String[] sDimensionUnits = new String[] {
-        UNIT_DP,
-        "<b>Density-independent Pixels</b> - an abstract unit that is based on the physical "
-                + "density of the screen.",
-
-        UNIT_SP,
-        "<b>Scale-independent Pixels</b> - this is like the dp unit, but it is also scaled by "
-                + "the user's font size preference.",
-
-        UNIT_PT,
-        "<b>Points</b> - 1/72 of an inch based on the physical size of the screen.",
-
-        UNIT_MM,
-        "<b>Millimeters</b> - based on the physical size of the screen.",
-
-        UNIT_IN,
-        "<b>Inches</b> - based on the physical size of the screen.",
-
-        UNIT_PX,
-        "<b>Pixels</b> - corresponds to actual pixels on the screen. Not recommended.",
-    };
-
-    /**
-     * Fixed list of fractional units, along with user documentation, for use by
-     * {@link #completeSuffix}
-     */
-    private static final String[] sFractionUnits = new String[] {
-        "%",  //$NON-NLS-1$
-        "<b>Fraction</b> - a percentage of the base size",
-
-        "%p", //$NON-NLS-1$
-        "<b>Fraction</b> - a percentage relative to parent container",
-    };
-
-    /**
-     * Completes suffixes for applicable types (like dimensions and fractions) such that
-     * after a dimension number you get completion on unit types like "px".
-     */
-    private Object[] completeSuffix(Object[] choices, String value, UiAttributeNode currAttrNode) {
-        IAttributeInfo attributeInfo = currAttrNode.getDescriptor().getAttributeInfo();
-        EnumSet<Format> formats = attributeInfo.getFormats();
-        List<Object> suffixes = new ArrayList<Object>();
-
-        if (value.length() > 0 && Character.isDigit(value.charAt(0))) {
-            boolean hasDimension = formats.contains(Format.DIMENSION);
-            boolean hasFraction = formats.contains(Format.FRACTION);
-
-            if (hasDimension || hasFraction) {
-                // Split up the value into a numeric part (the prefix) and the
-                // unit part (the suffix)
-                int suffixBegin = 0;
-                for (; suffixBegin < value.length(); suffixBegin++) {
-                    if (!Character.isDigit(value.charAt(suffixBegin))) {
-                        break;
-                    }
-                }
-                String number = value.substring(0, suffixBegin);
-                String suffix = value.substring(suffixBegin);
-
-                // Add in the matching dimension and/or fraction units, if any
-                if (hasDimension) {
-                    // Each item has two entries in the array of strings: the first odd numbered
-                    // ones are the unit names and the second even numbered ones are the
-                    // corresponding descriptions.
-                    for (int i = 0; i < sDimensionUnits.length; i += 2) {
-                        String unit = sDimensionUnits[i];
-                        if (startsWith(unit, suffix)) {
-                            String description = sDimensionUnits[i + 1];
-                            suffixes.add(Pair.of(number + unit, description));
-                        }
-                    }
-
-                    // Allow "dip" completion but don't offer it ("dp" is preferred)
-                    if (startsWith(suffix, "di") || startsWith(suffix, "dip")) { //$NON-NLS-1$ //$NON-NLS-2$
-                        suffixes.add(Pair.of(number + "dip", "Alternative name for \"dp\"")); //$NON-NLS-1$
-                    }
-                }
-                if (hasFraction) {
-                    for (int i = 0; i < sFractionUnits.length; i += 2) {
-                        String unit = sFractionUnits[i];
-                        if (startsWith(unit, suffix)) {
-                            String description = sFractionUnits[i + 1];
-                            suffixes.add(Pair.of(number + unit, description));
-                        }
-                    }
-                }
-            }
-        }
-
-        boolean hasFlag = formats.contains(Format.FLAG);
-        if (hasFlag) {
-            boolean isDone = false;
-            String[] flagValues = attributeInfo.getFlagValues();
-            for (String flagValue : flagValues) {
-                if (flagValue.equals(value)) {
-                    isDone = true;
-                    break;
-                }
-            }
-            if (isDone) {
-                // Add in all the new values with a separator of |
-                String currentValue = currAttrNode.getCurrentValue();
-                for (String flagValue : flagValues) {
-                    if (currentValue == null || !currentValue.contains(flagValue)) {
-                        suffixes.add(value + '|' + flagValue);
-                    }
-                }
-            }
-        }
-
-        if (suffixes.size() > 0) {
-            // Merge previously added choices (from attribute enums etc) with the new matches
-            List<Object> all = new ArrayList<Object>();
-            if (choices != null) {
-                for (Object s : choices) {
-                    all.add(s);
-                }
-            }
-            all.addAll(suffixes);
-            choices = all.toArray();
-        }
-
-        return choices;
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/AndroidDoubleClickStrategy.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/AndroidDoubleClickStrategy.java
deleted file mode 100644
index 8716487..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/AndroidDoubleClickStrategy.java
+++ /dev/null
@@ -1,92 +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.ide.eclipse.adt.internal.editors;
-
-import static com.android.SdkConstants.PREFIX_RESOURCE_REF;
-import static com.android.SdkConstants.PREFIX_THEME_REF;
-
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.wst.xml.core.internal.regions.DOMRegionContext;
-import org.eclipse.wst.xml.ui.internal.doubleclick.XMLDoubleClickStrategy;
-
-/**
- * Custom version of {@link XMLDoubleClickStrategy} which is smarter about
- * selecting portions of resource references, etc.
- */
-@SuppressWarnings("restriction") // XML API
-public class AndroidDoubleClickStrategy extends XMLDoubleClickStrategy {
-    /**
-     * Creates a new {@linkplain AndroidDoubleClickStrategy}
-     */
-    public AndroidDoubleClickStrategy() {
-    }
-
-    @Override
-    protected void processElementDoubleClicked() {
-        // Special case: if you click on the local name portion of an attribute pair,
-        // select only the local name. For example, if you click anywhere in the "text" region
-        // of "android:text", select just the "text" portion.
-        if (fTextRegion.getType() == DOMRegionContext.XML_TAG_ATTRIBUTE_NAME) {
-            String regionText = fStructuredDocumentRegion.getText(fTextRegion);
-            int cursor = fCaretPosition - fStructuredDocumentRegion.getStartOffset(fTextRegion);
-            int ns = regionText.indexOf(':');
-            if (cursor > ns) {
-                int start = ns + 1;
-                fTextViewer.setSelectedRange(fStructuredDocumentRegion.getStartOffset(fTextRegion)
-                        + start,  fTextRegion.getTextLength() - start);
-                return;
-            }
-        }
-
-        super.processElementDoubleClicked();
-    }
-
-    @Override
-    protected Point getWord(String string, int cursor) {
-        if (string == null) {
-            return null;
-        }
-
-        // Default implementation will strip off the surrounding quotes etc:
-        Point position = super.getWord(string, cursor);
-
-        assert cursor >= position.x && cursor <= position.y;
-
-        // Special case: when you click on a resource identifier name, only select the
-        // name portion
-        if (string.startsWith(PREFIX_RESOURCE_REF, position.x) ||
-                string.startsWith(PREFIX_THEME_REF, position.x)) {
-            int nameStart = string.indexOf('/', position.x + 1);
-            if (nameStart != -1 && nameStart < cursor) {
-                position.x = nameStart + 1;
-                return position;
-            }
-        }
-
-        // Special case: when you have a dotted name, such as com.android.tools.MyClass,
-        // and you click on the last part, select only that part
-        int lastDot = string.lastIndexOf('.', cursor);
-        if (lastDot >= position.x && lastDot < position.y - 1) {
-            int next = string.indexOf('.', cursor);
-            if (next == -1 || next > position.y) {
-                position.x = lastDot + 1;
-            }
-        }
-
-        return position;
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/AndroidOutlineConfiguration.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/AndroidOutlineConfiguration.java
deleted file mode 100644
index 6061d92..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/AndroidOutlineConfiguration.java
+++ /dev/null
@@ -1,37 +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.ide.eclipse.adt.internal.editors;
-
-
-import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.jface.viewers.TreeViewer;
-import org.eclipse.wst.xml.ui.views.contentoutline.XMLContentOutlineConfiguration;
-
-/**
- * Custom version of {@link XMLContentOutlineConfiguration} which adds in icons and
- * details such as id or name, to the labels.
- */
-public class AndroidOutlineConfiguration extends XMLContentOutlineConfiguration {
-    /** Constructs a new {@link AndroidOutlineConfiguration} */
-    public AndroidOutlineConfiguration() {
-    }
-
-    @Override
-    public ILabelProvider getLabelProvider(TreeViewer viewer) {
-        return new OutlineLabelProvider();
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/AndroidQuickOutlineConfiguration.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/AndroidQuickOutlineConfiguration.java
deleted file mode 100644
index 0a8e9dc..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/AndroidQuickOutlineConfiguration.java
+++ /dev/null
@@ -1,35 +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.ide.eclipse.adt.internal.editors;
-
-import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.wst.xml.ui.internal.quickoutline.XMLQuickOutlineConfiguration;
-
-/**
- * Custom version of {@link XMLQuickOutlineConfiguration} which adds in icons and
- * details such as id or name, to the labels.
- */
-public class AndroidQuickOutlineConfiguration extends XMLQuickOutlineConfiguration {
-    /** Constructs a new {@link AndroidQuickOutlineConfiguration} */
-    public AndroidQuickOutlineConfiguration() {
-    }
-
-    @Override
-    public ILabelProvider getLabelProvider() {
-        return new OutlineLabelProvider();
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/AndroidSourceViewerConfig.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/AndroidSourceViewerConfig.java
deleted file mode 100644
index b2c10ec..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/AndroidSourceViewerConfig.java
+++ /dev/null
@@ -1,243 +0,0 @@
-/*
- * Copyright (C) 2007 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.editors;
-
-
-import com.android.ide.eclipse.adt.internal.editors.formatting.AndroidXmlFormatter;
-import com.android.ide.eclipse.adt.internal.editors.formatting.AndroidXmlFormattingStrategy;
-
-import org.eclipse.jface.text.DefaultAutoIndentStrategy;
-import org.eclipse.jface.text.IAutoEditStrategy;
-import org.eclipse.jface.text.ITextHover;
-import org.eclipse.jface.text.ITextViewer;
-import org.eclipse.jface.text.contentassist.ICompletionProposal;
-import org.eclipse.jface.text.contentassist.IContentAssistProcessor;
-import org.eclipse.jface.text.contentassist.IContentAssistant;
-import org.eclipse.jface.text.contentassist.IContextInformation;
-import org.eclipse.jface.text.contentassist.IContextInformationValidator;
-import org.eclipse.jface.text.formatter.IContentFormatter;
-import org.eclipse.jface.text.formatter.MultiPassContentFormatter;
-import org.eclipse.jface.text.source.ISourceViewer;
-import org.eclipse.wst.sse.core.text.IStructuredPartitions;
-import org.eclipse.wst.xml.core.text.IXMLPartitions;
-import org.eclipse.wst.xml.ui.StructuredTextViewerConfigurationXML;
-import org.eclipse.wst.xml.ui.internal.contentassist.XMLContentAssistProcessor;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-
-/**
- * Base Source Viewer Configuration for Android resources.
- */
-@SuppressWarnings({"restriction", "deprecation"}) // XMLContentAssistProcessor etc
-public abstract class AndroidSourceViewerConfig extends StructuredTextViewerConfigurationXML {
-
-    public AndroidSourceViewerConfig() {
-        super();
-    }
-
-    @Override
-    public IContentAssistant getContentAssistant(ISourceViewer sourceViewer) {
-        return super.getContentAssistant(sourceViewer);
-    }
-
-    /**
-     * Returns the IContentAssistProcessor that
-     * {@link #getContentAssistProcessors(ISourceViewer, String)} should use
-     * for XML and default/unknown partitions.
-     *
-     * @return An {@link IContentAssistProcessor} or null.
-     */
-    public abstract IContentAssistProcessor getAndroidContentAssistProcessor(
-            ISourceViewer sourceViewer,
-            String partitionType);
-
-    /**
-     * Returns the content assist processors that will be used for content
-     * assist in the given source viewer and for the given partition type.
-     *
-     * @param sourceViewer the source viewer to be configured by this
-     *        configuration
-     * @param partitionType the partition type for which the content assist
-     *        processors are applicable
-     * @return IContentAssistProcessors or null if should not be supported
-     */
-    @Override
-    protected IContentAssistProcessor[] getContentAssistProcessors(
-            ISourceViewer sourceViewer, String partitionType) {
-        ArrayList<IContentAssistProcessor> processors = new ArrayList<IContentAssistProcessor>();
-        if (partitionType == IStructuredPartitions.UNKNOWN_PARTITION ||
-            partitionType == IStructuredPartitions.DEFAULT_PARTITION ||
-            partitionType == IXMLPartitions.XML_DEFAULT) {
-
-            IContentAssistProcessor processor =
-                getAndroidContentAssistProcessor(sourceViewer, partitionType);
-
-            if (processor != null) {
-                processors.add(processor);
-            }
-        }
-
-        IContentAssistProcessor[] others = super.getContentAssistProcessors(sourceViewer,
-                partitionType);
-        if (others != null && others.length > 0) {
-            for (IContentAssistProcessor p : others) {
-                // Builtin Eclipse WTP code completion assistant? If so,
-                // wrap it with our own filter which hides some unwanted completions.
-                if (p instanceof XMLContentAssistProcessor
-                        // On Eclipse 3.7, XMLContentAssistProcessor is no longer used,
-                        // and instead org.eclipse.wst.xml.ui.internal.contentassist.
-                        // XMLStructuredContentAssistProcessor is used - which isn't available
-                        // at compile time in 3.5.
-                        || p.getClass().getSimpleName().equals(
-                            "XMLStructuredContentAssistProcessor")) { //$NON-NLS-1$
-                    processors.add(new FilteringContentAssistProcessor(p));
-                } else {
-                    processors.add(p);
-                }
-            }
-        }
-
-        if (processors.size() > 0) {
-            return processors.toArray(new IContentAssistProcessor[processors.size()]);
-        } else {
-            return null;
-        }
-    }
-
-    @Override
-    public ITextHover getTextHover(ISourceViewer sourceViewer, String contentType) {
-        // TODO text hover for android xml
-        return super.getTextHover(sourceViewer, contentType);
-    }
-
-    @Override
-    public IAutoEditStrategy[] getAutoEditStrategies(
-            ISourceViewer sourceViewer, String contentType) {
-        IAutoEditStrategy[] strategies = super.getAutoEditStrategies(sourceViewer, contentType);
-        List<IAutoEditStrategy> s = new ArrayList<IAutoEditStrategy>(strategies.length + 1);
-        s.add(new AndroidXmlAutoEditStrategy());
-
-        // Add other registered strategies, except the builtin indentation strategy which is
-        // now handled by the above AndroidXmlAutoEditStrategy
-        for (IAutoEditStrategy strategy : strategies) {
-            if (strategy instanceof DefaultAutoIndentStrategy) {
-                continue;
-            }
-            s.add(strategy);
-        }
-
-        return s.toArray(new IAutoEditStrategy[s.size()]);
-    }
-
-    @Override
-    public IContentFormatter getContentFormatter(ISourceViewer sourceViewer) {
-        IContentFormatter formatter = super.getContentFormatter(sourceViewer);
-
-        if (formatter instanceof MultiPassContentFormatter) {
-            ((MultiPassContentFormatter) formatter).setMasterStrategy(
-                    new AndroidXmlFormattingStrategy());
-            return formatter;
-        } else {
-            return new AndroidXmlFormatter();
-        }
-    }
-
-    @Override
-    protected Map<String, ?> getHyperlinkDetectorTargets(final ISourceViewer sourceViewer) {
-        @SuppressWarnings("unchecked")
-        Map<String, ?> targets = super.getHyperlinkDetectorTargets(sourceViewer);
-        // If we want to look up more context in our HyperlinkDetector via the
-        // getAdapter method, we should place an IAdaptable object into the map here.
-        targets.put("com.android.ide.eclipse.xmlCode", null); //$NON-NLS-1$
-        return targets;
-    }
-
-    /**
-     * A delegating {@link IContentAssistProcessor} whose purpose is to filter out some
-     * default Eclipse XML completions which are distracting in Android XML files
-     */
-    private static class FilteringContentAssistProcessor implements IContentAssistProcessor {
-        private IContentAssistProcessor mDelegate;
-
-        public FilteringContentAssistProcessor(IContentAssistProcessor delegate) {
-            super();
-            mDelegate = delegate;
-        }
-
-        @Override
-        public ICompletionProposal[] computeCompletionProposals(ITextViewer viewer, int offset) {
-            ICompletionProposal[] result = mDelegate.computeCompletionProposals(viewer, offset);
-            if (result == null) {
-                return null;
-            }
-
-            List<ICompletionProposal> proposals =
-                new ArrayList<ICompletionProposal>(result.length);
-            for (ICompletionProposal proposal : result) {
-                String replacement = proposal.getDisplayString();
-                if (replacement.charAt(0) == '"' &&
-                        replacement.charAt(replacement.length() - 1) == '"') {
-                    // Filter out attribute values. In Android XML files (where there is no DTD
-                    // etc) the default Eclipse XML code completion simply provides the
-                    // existing value as a completion. This is often misleading, since if you
-                    // for example have a typo, completion will show your current (wrong)
-                    // value as a valid completion.
-                } else if (replacement.contains("Namespace")  //$NON-NLS-1$
-                        || replacement.startsWith("XSL ")  //$NON-NLS-1$
-                        || replacement.contains("Schema")) {  //$NON-NLS-1$
-                    // Eclipse adds in a number of namespace and schema related completions which
-                    // are not usually applicable in our files.
-                } else {
-                    proposals.add(proposal);
-                }
-            }
-
-            if (proposals.size() == result.length) {
-                return result;
-            } else {
-                return proposals.toArray(new ICompletionProposal[proposals.size()]);
-            }
-        }
-
-        @Override
-        public IContextInformation[] computeContextInformation(ITextViewer viewer, int offset) {
-            return mDelegate.computeContextInformation(viewer, offset);
-        }
-
-        @Override
-        public char[] getCompletionProposalAutoActivationCharacters() {
-            return mDelegate.getCompletionProposalAutoActivationCharacters();
-        }
-
-        @Override
-        public char[] getContextInformationAutoActivationCharacters() {
-            return mDelegate.getContextInformationAutoActivationCharacters();
-        }
-
-        @Override
-        public IContextInformationValidator getContextInformationValidator() {
-            return mDelegate.getContextInformationValidator();
-        }
-
-        @Override
-        public String getErrorMessage() {
-            return mDelegate.getErrorMessage();
-        }
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/AndroidTextEditor.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/AndroidTextEditor.java
deleted file mode 100644
index 2e60df5..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/AndroidTextEditor.java
+++ /dev/null
@@ -1,591 +0,0 @@
-/*
- * Copyright (C) 2010 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.editors;
-
-import com.android.ide.eclipse.adt.AdtPlugin;
-
-import org.eclipse.core.internal.filebuffers.SynchronizableDocument;
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IResourceChangeEvent;
-import org.eclipse.core.resources.IResourceChangeListener;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.QualifiedName;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.dialogs.ErrorDialog;
-import org.eclipse.jface.text.DocumentEvent;
-import org.eclipse.jface.text.DocumentRewriteSession;
-import org.eclipse.jface.text.DocumentRewriteSessionType;
-import org.eclipse.jface.text.IDocument;
-import org.eclipse.jface.text.IDocumentExtension4;
-import org.eclipse.jface.text.IDocumentListener;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.ui.IActionBars;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IEditorSite;
-import org.eclipse.ui.IFileEditorInput;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.actions.ActionFactory;
-import org.eclipse.ui.browser.IWorkbenchBrowserSupport;
-import org.eclipse.ui.editors.text.TextEditor;
-import org.eclipse.ui.forms.IManagedForm;
-import org.eclipse.ui.forms.editor.FormEditor;
-import org.eclipse.ui.forms.editor.IFormPage;
-import org.eclipse.ui.forms.events.HyperlinkAdapter;
-import org.eclipse.ui.forms.events.HyperlinkEvent;
-import org.eclipse.ui.forms.events.IHyperlinkListener;
-import org.eclipse.ui.forms.widgets.FormText;
-import org.eclipse.ui.internal.browser.WorkbenchBrowserSupport;
-import org.eclipse.ui.part.FileEditorInput;
-import org.eclipse.ui.part.MultiPageEditorPart;
-import org.eclipse.ui.part.WorkbenchPart;
-import org.eclipse.ui.texteditor.IDocumentProvider;
-import org.eclipse.wst.sse.ui.StructuredTextEditor;
-
-import java.net.MalformedURLException;
-import java.net.URL;
-
-/**
- * Multi-page form editor for Android text files.
- * <p/>
- * It is designed to work with a {@link TextEditor} that will display a text file.
- * <br/>
- * Derived classes must implement createFormPages to create the forms before the
- * source editor. This can be a no-op if desired.
- */
-@SuppressWarnings("restriction")
-public abstract class AndroidTextEditor extends FormEditor implements IResourceChangeListener {
-
-    /** Preference name for the current page of this file */
-    private static final String PREF_CURRENT_PAGE = "_current_page";
-
-    /** Id string used to create the Android SDK browser */
-    private static String BROWSER_ID = "android"; //$NON-NLS-1$
-
-    /** Page id of the XML source editor, used for switching tabs programmatically */
-    public final static String TEXT_EDITOR_ID = "editor_part"; //$NON-NLS-1$
-
-    /** Width hint for text fields. Helps the grid layout resize properly on smaller screens */
-    public static final int TEXT_WIDTH_HINT = 50;
-
-    /** Page index of the text editor (always the last page) */
-    private int mTextPageIndex;
-
-    /** The text editor */
-    private TextEditor mTextEditor;
-
-    /** flag set during page creation */
-    private boolean mIsCreatingPage = false;
-
-    private IDocument mDocument;
-
-    /**
-     * Creates a form editor.
-     */
-    public AndroidTextEditor() {
-        super();
-    }
-
-    // ---- Abstract Methods ----
-
-    /**
-     * Creates the various form pages.
-     * <p/>
-     * Derived classes must implement this to add their own specific tabs.
-     */
-    abstract protected void createFormPages();
-
-    /**
-     * Called by the base class {@link AndroidTextEditor} once all pages (custom form pages
-     * as well as text editor page) have been created. This give a chance to deriving
-     * classes to adjust behavior once the text page has been created.
-     */
-    protected void postCreatePages() {
-        // Nothing in the base class.
-    }
-
-    /**
-     * Subclasses should override this method to process the new text model.
-     * This is called after the document has been edited.
-     *
-     * The base implementation is empty.
-     *
-     * @param event Specification of changes applied to document.
-     */
-    protected void onDocumentChanged(DocumentEvent event) {
-        // pass
-    }
-
-    // ---- Base Class Overrides, Interfaces Implemented ----
-
-    /**
-     * Creates the pages of the multi-page editor.
-     */
-    @Override
-    protected void addPages() {
-        createAndroidPages();
-        selectDefaultPage(null /* defaultPageId */);
-    }
-
-    /**
-     * Creates the page for the Android Editors
-     */
-    protected void createAndroidPages() {
-        mIsCreatingPage = true;
-        createFormPages();
-        createTextEditor();
-        createUndoRedoActions();
-        postCreatePages();
-        mIsCreatingPage = false;
-    }
-
-    /**
-     * Returns whether the editor is currently creating its pages.
-     */
-    public boolean isCreatingPages() {
-        return mIsCreatingPage;
-    }
-
-    /**
-     * Creates undo redo actions for the editor site (so that it works for any page of this
-     * multi-page editor) by re-using the actions defined by the {@link TextEditor}
-     * (aka the XML text editor.)
-     */
-    private void createUndoRedoActions() {
-        IActionBars bars = getEditorSite().getActionBars();
-        if (bars != null) {
-            IAction action = mTextEditor.getAction(ActionFactory.UNDO.getId());
-            bars.setGlobalActionHandler(ActionFactory.UNDO.getId(), action);
-
-            action = mTextEditor.getAction(ActionFactory.REDO.getId());
-            bars.setGlobalActionHandler(ActionFactory.REDO.getId(), action);
-
-            bars.updateActionBars();
-        }
-    }
-
-    /**
-     * Selects the default active page.
-     * @param defaultPageId the id of the page to show. If <code>null</code> the editor attempts to
-     * find the default page in the properties of the {@link IResource} object being edited.
-     */
-    protected void selectDefaultPage(String defaultPageId) {
-        if (defaultPageId == null) {
-            if (getEditorInput() instanceof IFileEditorInput) {
-                IFile file = ((IFileEditorInput) getEditorInput()).getFile();
-
-                QualifiedName qname = new QualifiedName(AdtPlugin.PLUGIN_ID,
-                        getClass().getSimpleName() + PREF_CURRENT_PAGE);
-                String pageId;
-                try {
-                    pageId = file.getPersistentProperty(qname);
-                    if (pageId != null) {
-                        defaultPageId = pageId;
-                    }
-                } catch (CoreException e) {
-                    // ignored
-                }
-            }
-        }
-
-        if (defaultPageId != null) {
-            try {
-                setActivePage(Integer.parseInt(defaultPageId));
-            } catch (Exception e) {
-                // We can get NumberFormatException from parseInt but also
-                // AssertionError from setActivePage when the index is out of bounds.
-                // Generally speaking we just want to ignore any exception and fall back on the
-                // first page rather than crash the editor load. Logging the error is enough.
-                AdtPlugin.log(e, "Selecting page '%s' in AndroidXmlEditor failed", defaultPageId);
-            }
-        }
-    }
-
-    /**
-     * Removes all the pages from the editor.
-     */
-    protected void removePages() {
-        int count = getPageCount();
-        for (int i = count - 1 ; i >= 0 ; i--) {
-            removePage(i);
-        }
-    }
-
-    /**
-     * Overrides the parent's setActivePage to be able to switch to the xml editor.
-     *
-     * If the special pageId TEXT_EDITOR_ID is given, switches to the mTextPageIndex page.
-     * This is needed because the editor doesn't actually derive from IFormPage and thus
-     * doesn't have the get-by-page-id method. In this case, the method returns null since
-     * IEditorPart does not implement IFormPage.
-     */
-    @Override
-    public IFormPage setActivePage(String pageId) {
-        if (pageId.equals(TEXT_EDITOR_ID)) {
-            super.setActivePage(mTextPageIndex);
-            return null;
-        } else {
-            return super.setActivePage(pageId);
-        }
-    }
-
-
-    /**
-     * Notifies this multi-page editor that the page with the given id has been
-     * activated. This method is called when the user selects a different tab.
-     *
-     * @see MultiPageEditorPart#pageChange(int)
-     */
-    @Override
-    protected void pageChange(int newPageIndex) {
-        super.pageChange(newPageIndex);
-
-        // Do not record page changes during creation of pages
-        if (mIsCreatingPage) {
-            return;
-        }
-
-        if (getEditorInput() instanceof IFileEditorInput) {
-            IFile file = ((IFileEditorInput) getEditorInput()).getFile();
-
-            QualifiedName qname = new QualifiedName(AdtPlugin.PLUGIN_ID,
-                    getClass().getSimpleName() + PREF_CURRENT_PAGE);
-            try {
-                file.setPersistentProperty(qname, Integer.toString(newPageIndex));
-            } catch (CoreException e) {
-                // ignore
-            }
-        }
-    }
-
-    /**
-     * Notifies this listener that some resource changes
-     * are happening, or have already happened.
-     *
-     * Closes all project files on project close.
-     * @see IResourceChangeListener
-     */
-    @Override
-    public void resourceChanged(final IResourceChangeEvent event) {
-        if (event.getType() == IResourceChangeEvent.PRE_CLOSE) {
-            Display.getDefault().asyncExec(new Runnable() {
-                @Override
-                public void run() {
-                    @SuppressWarnings("hiding")
-                    IWorkbenchPage[] pages = getSite().getWorkbenchWindow().getPages();
-                    for (int i = 0; i < pages.length; i++) {
-                        if (((FileEditorInput)mTextEditor.getEditorInput())
-                                .getFile().getProject().equals(
-                                        event.getResource())) {
-                            IEditorPart editorPart = pages[i].findEditor(mTextEditor
-                                    .getEditorInput());
-                            pages[i].closeEditor(editorPart, true);
-                        }
-                    }
-                }
-            });
-        }
-    }
-
-    /**
-     * Initializes the editor part with a site and input.
-     * <p/>
-     * Checks that the input is an instance of {@link IFileEditorInput}.
-     *
-     * @see FormEditor
-     */
-    @Override
-    public void init(IEditorSite site, IEditorInput editorInput) throws PartInitException {
-        if (!(editorInput instanceof IFileEditorInput))
-            throw new PartInitException("Invalid Input: Must be IFileEditorInput");
-        super.init(site, editorInput);
-    }
-
-    /**
-     * Returns the {@link IFile} matching the editor's input or null.
-     * <p/>
-     * By construction, the editor input has to be an {@link IFileEditorInput} so it must
-     * have an associated {@link IFile}. Null can only be returned if this editor has no
-     * input somehow.
-     */
-    public IFile getFile() {
-        if (getEditorInput() instanceof IFileEditorInput) {
-            return ((IFileEditorInput) getEditorInput()).getFile();
-        }
-        return null;
-    }
-
-    /**
-     * Removes attached listeners.
-     *
-     * @see WorkbenchPart
-     */
-    @Override
-    public void dispose() {
-        ResourcesPlugin.getWorkspace().removeResourceChangeListener(this);
-
-        super.dispose();
-    }
-
-    /**
-     * Commit all dirty pages then saves the contents of the text editor.
-     * <p/>
-     * This works by committing all data to the XML model and then
-     * asking the Structured XML Editor to save the XML.
-     *
-     * @see IEditorPart
-     */
-    @Override
-    public void doSave(IProgressMonitor monitor) {
-        commitPages(true /* onSave */);
-
-        // The actual "save" operation is done by the Structured XML Editor
-        getEditor(mTextPageIndex).doSave(monitor);
-    }
-
-    /* (non-Javadoc)
-     * Saves the contents of this editor to another object.
-     * <p>
-     * Subclasses must override this method to implement the open-save-close lifecycle
-     * for an editor.  For greater details, see <code>IEditorPart</code>
-     * </p>
-     *
-     * @see IEditorPart
-     */
-    @Override
-    public void doSaveAs() {
-        commitPages(true /* onSave */);
-
-        IEditorPart editor = getEditor(mTextPageIndex);
-        editor.doSaveAs();
-        setPageText(mTextPageIndex, editor.getTitle());
-        setInput(editor.getEditorInput());
-    }
-
-    /**
-     * Commits all dirty pages in the editor. This method should
-     * be called as a first step of a 'save' operation.
-     * <p/>
-     * This is the same implementation as in {@link FormEditor}
-     * except it fixes two bugs: a cast to IFormPage is done
-     * from page.get(i) <em>before</em> being tested with instanceof.
-     * Another bug is that the last page might be a null pointer.
-     * <p/>
-     * The incorrect casting makes the original implementation crash due
-     * to our {@link StructuredTextEditor} not being an {@link IFormPage}
-     * so we have to override and duplicate to fix it.
-     *
-     * @param onSave <code>true</code> if commit is performed as part
-     * of the 'save' operation, <code>false</code> otherwise.
-     * @since 3.3
-     */
-    @Override
-    public void commitPages(boolean onSave) {
-        if (pages != null) {
-            for (int i = 0; i < pages.size(); i++) {
-                Object page = pages.get(i);
-                if (page != null && page instanceof IFormPage) {
-                    IFormPage form_page = (IFormPage) page;
-                    IManagedForm managed_form = form_page.getManagedForm();
-                    if (managed_form != null && managed_form.isDirty()) {
-                        managed_form.commit(onSave);
-                    }
-                }
-            }
-        }
-    }
-
-    /* (non-Javadoc)
-     * Returns whether the "save as" operation is supported by this editor.
-     * <p>
-     * Subclasses must override this method to implement the open-save-close lifecycle
-     * for an editor.  For greater details, see <code>IEditorPart</code>
-     * </p>
-     *
-     * @see IEditorPart
-     */
-    @Override
-    public boolean isSaveAsAllowed() {
-        return false;
-    }
-
-    // ---- Local methods ----
-
-
-    /**
-     * Helper method that creates a new hyper-link Listener.
-     * Used by derived classes which need active links in {@link FormText}.
-     * <p/>
-     * This link listener handles two kinds of URLs:
-     * <ul>
-     * <li> Links starting with "http" are simply sent to a local browser.
-     * <li> Links starting with "file:/" are simply sent to a local browser.
-     * <li> Links starting with "page:" are expected to be an editor page id to switch to.
-     * <li> Other links are ignored.
-     * </ul>
-     *
-     * @return A new hyper-link listener for FormText to use.
-     */
-    public final IHyperlinkListener createHyperlinkListener() {
-        return new HyperlinkAdapter() {
-            /**
-             * Switch to the page corresponding to the link that has just been clicked.
-             * For this purpose, the HREF of the &lt;a&gt; tags above is the page ID to switch to.
-             */
-            @Override
-            public void linkActivated(HyperlinkEvent e) {
-                super.linkActivated(e);
-                String link = e.data.toString();
-                if (link.startsWith("http") ||          //$NON-NLS-1$
-                        link.startsWith("file:/")) {    //$NON-NLS-1$
-                    openLinkInBrowser(link);
-                } else if (link.startsWith("page:")) {  //$NON-NLS-1$
-                    // Switch to an internal page
-                    setActivePage(link.substring(5 /* strlen("page:") */));
-                }
-            }
-        };
-    }
-
-    /**
-     * Open the http link into a browser
-     *
-     * @param link The URL to open in a browser
-     */
-    private void openLinkInBrowser(String link) {
-        try {
-            IWorkbenchBrowserSupport wbs = WorkbenchBrowserSupport.getInstance();
-            wbs.createBrowser(BROWSER_ID).openURL(new URL(link));
-        } catch (PartInitException e1) {
-            // pass
-        } catch (MalformedURLException e1) {
-            // pass
-        }
-    }
-
-    /**
-     * Creates the XML source editor.
-     * <p/>
-     * Memorizes the index page of the source editor (it's always the last page, but the number
-     * of pages before can change.)
-     * <br/>
-     * Retrieves the underlying XML model from the StructuredEditor and attaches a listener to it.
-     * Finally triggers modelChanged() on the model listener -- derived classes can use this
-     * to initialize the model the first time.
-     * <p/>
-     * Called only once <em>after</em> createFormPages.
-     */
-    private void createTextEditor() {
-        try {
-            mTextEditor = new TextEditor();
-            int index = addPage(mTextEditor, getEditorInput());
-            mTextPageIndex = index;
-            setPageText(index, mTextEditor.getTitle());
-
-            IDocumentProvider provider = mTextEditor.getDocumentProvider();
-            mDocument = provider.getDocument(getEditorInput());
-
-            mDocument.addDocumentListener(new IDocumentListener() {
-                @Override
-                public void documentChanged(DocumentEvent event) {
-                    onDocumentChanged(event);
-                }
-
-                @Override
-                public void documentAboutToBeChanged(DocumentEvent event) {
-                    // ignore
-                }
-            });
-
-
-        } catch (PartInitException e) {
-            ErrorDialog.openError(getSite().getShell(),
-                    "Android Text Editor Error", null, e.getStatus());
-        }
-    }
-
-    /**
-     * Gives access to the {@link IDocument} from the {@link TextEditor}, corresponding to
-     * the current file input.
-     * <p/>
-     * All edits should be wrapped in a {@link #wrapRewriteSession(Runnable)}.
-     * The actual document instance is a {@link SynchronizableDocument}, which creates a lock
-     * around read/set operations. The base API provided by {@link IDocument} provides ways to
-     * manipulate the document line per line or as a bulk.
-     */
-    public IDocument getDocument() {
-        return mDocument;
-    }
-
-    /**
-     * Returns the {@link IProject} for the edited file.
-     */
-    public IProject getProject() {
-        if (mTextEditor != null) {
-            IEditorInput input = mTextEditor.getEditorInput();
-            if (input instanceof FileEditorInput) {
-                FileEditorInput fileInput = (FileEditorInput)input;
-                IFile inputFile = fileInput.getFile();
-
-                if (inputFile != null) {
-                    return inputFile.getProject();
-                }
-            }
-        }
-
-        return null;
-    }
-
-    /**
-     * Runs the given operation in the context of a document RewriteSession.
-     * Takes care of properly starting and stopping the operation.
-     * <p/>
-     * The operation itself should just access {@link #getDocument()} and use the
-     * normal document's API to manipulate it.
-     *
-     * @see #getDocument()
-     */
-    public void wrapRewriteSession(Runnable operation) {
-        if (mDocument instanceof IDocumentExtension4) {
-            IDocumentExtension4 doc4 = (IDocumentExtension4) mDocument;
-
-            DocumentRewriteSession session = null;
-            try {
-                session = doc4.startRewriteSession(DocumentRewriteSessionType.UNRESTRICTED_SMALL);
-
-                operation.run();
-            } catch(IllegalStateException e) {
-                AdtPlugin.log(e, "wrapRewriteSession failed");
-                e.printStackTrace();
-            } finally {
-                if (session != null) {
-                    doc4.stopRewriteSession(session);
-                }
-            }
-
-        } else {
-            // Not an IDocumentExtension4? Unlikely. Try the operation anyway.
-            operation.run();
-        }
-    }
-
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/AndroidXmlAutoEditStrategy.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/AndroidXmlAutoEditStrategy.java
deleted file mode 100644
index 8a078ef..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/AndroidXmlAutoEditStrategy.java
+++ /dev/null
@@ -1,460 +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.eclipse.adt.internal.editors;
-
-import static org.eclipse.wst.xml.core.internal.regions.DOMRegionContext.XML_CONTENT;
-import static org.eclipse.wst.xml.core.internal.regions.DOMRegionContext.XML_EMPTY_TAG_CLOSE;
-import static org.eclipse.wst.xml.core.internal.regions.DOMRegionContext.XML_END_TAG_OPEN;
-import static org.eclipse.wst.xml.core.internal.regions.DOMRegionContext.XML_TAG_CLOSE;
-import static org.eclipse.wst.xml.core.internal.regions.DOMRegionContext.XML_TAG_NAME;
-import static org.eclipse.wst.xml.core.internal.regions.DOMRegionContext.XML_TAG_OPEN;
-
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.ide.eclipse.adt.AdtUtils;
-import com.android.ide.eclipse.adt.internal.editors.formatting.EclipseXmlFormatPreferences;
-import com.android.utils.Pair;
-
-import org.eclipse.jface.text.BadLocationException;
-import org.eclipse.jface.text.DocumentCommand;
-import org.eclipse.jface.text.IAutoEditStrategy;
-import org.eclipse.jface.text.IDocument;
-import org.eclipse.jface.text.IRegion;
-import org.eclipse.jface.text.TextUtilities;
-import org.eclipse.ui.texteditor.ITextEditor;
-import org.eclipse.ui.texteditor.ITextEditorExtension3;
-import org.eclipse.wst.sse.core.StructuredModelManager;
-import org.eclipse.wst.sse.core.internal.provisional.IModelManager;
-import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
-import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;
-import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocumentRegion;
-import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegion;
-import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegionList;
-
-/**
- * Edit strategy for Android XML files. It attempts a number of edit
- * enhancements:
- * <ul>
- *   <li> Auto indentation. The default XML indentation scheme is to just copy the
- *        indentation of the previous line. This edit strategy improves on that situation
- *        by considering the tag and bracket balance on the current line and using it
- *        to determine whether the next line should be indented or use the same
- *        indentation as the parent, or even the indentation of an earlier line
- *        (when for example the current line closes an element which was started on an
- *        earlier line.)
- *   <li> Newline handling. In addition to indenting, it can also adjust the following text
- *        appropriately when a newline is inserted. For example, it will reformat
- *        the following (where | represents the caret position):
- *    <pre>
- *       {@code <item name="a">|</item>}
- *    </pre>
- *    into
- *    <pre>
- *       {@code <item name="a">}
- *           |
- *       {@code </item>}
- *    </pre>
- * </ul>
- * In the future we might consider other editing enhancements here as well, such as
- * refining the comment handling, or reindenting when you type the / of a closing tag,
- * or even making the bracket matcher more resilient.
- */
-@SuppressWarnings("restriction") // XML model
-public class AndroidXmlAutoEditStrategy implements IAutoEditStrategy {
-
-    @Override
-    public void customizeDocumentCommand(IDocument document, DocumentCommand c) {
-        if (!isSmartInsertMode()) {
-            return;
-        }
-
-        if (!(document instanceof IStructuredDocument)) {
-            // This shouldn't happen unless this strategy is used on an invalid document
-            return;
-        }
-        IStructuredDocument doc = (IStructuredDocument) document;
-
-        // Handle newlines/indentation
-        if (c.length == 0 && c.text != null
-                && TextUtilities.endsWith(doc.getLegalLineDelimiters(), c.text) != -1) {
-
-            IModelManager modelManager = StructuredModelManager.getModelManager();
-            IStructuredModel model = modelManager.getModelForRead(doc);
-            if (model != null) {
-                try {
-                    final int offset = c.offset;
-                    int lineStart = findLineStart(doc, offset);
-                    int textStart = findTextStart(doc, lineStart, offset);
-
-                    IStructuredDocumentRegion region = doc.getRegionAtCharacterOffset(textStart);
-                    if (region != null && region.getType().equals(XML_TAG_NAME)) {
-                        Pair<Integer,Integer> balance = getBalance(doc, textStart, offset);
-                        int tagBalance = balance.getFirst();
-                        int bracketBalance = balance.getSecond();
-
-                        String lineIndent = ""; //$NON-NLS-1$
-                        if (textStart > lineStart) {
-                            lineIndent = doc.get(lineStart, textStart - lineStart);
-                        }
-
-                        // We only care if tag or bracket balance is greater than 0;
-                        // we never *dedent* on negative balances
-                        boolean addIndent = false;
-                        if (bracketBalance < 0) {
-                            // Handle
-                            //    <foo
-                            //        ></foo>^
-                            // and
-                            //    <foo
-                            //        />^
-                            ITextRegion left = getRegionAt(doc, offset, true /*biasLeft*/);
-                            if (left != null
-                                    && (left.getType().equals(XML_TAG_CLOSE)
-                                        || left.getType().equals(XML_EMPTY_TAG_CLOSE))) {
-
-                                // Find the corresponding open tag...
-                                // The org.eclipse.wst.xml.ui.gotoMatchingTag frequently
-                                // doesn't work, it just says "No matching brace found"
-                                // (or I would use that here).
-
-                                int targetBalance = 0;
-                                ITextRegion right = getRegionAt(doc, offset, false /*biasLeft*/);
-                                if (right != null && right.getType().equals(XML_END_TAG_OPEN)) {
-                                    targetBalance = -1;
-                                }
-                                int openTag = AndroidXmlCharacterMatcher.findTagBackwards(doc,
-                                        offset, targetBalance);
-                                if (openTag != -1) {
-                                    // Look up the indentation of the given line
-                                    lineIndent = AndroidXmlEditor.getIndentAtOffset(doc, openTag);
-                                }
-                            }
-                        } else if (tagBalance > 0 || bracketBalance > 0) {
-                            // Add indentation
-                            addIndent = true;
-                        }
-
-                        StringBuilder sb = new StringBuilder(c.text);
-                        sb.append(lineIndent);
-                        String oneIndentUnit = EclipseXmlFormatPreferences.create().getOneIndentUnit();
-                        if (addIndent) {
-                            sb.append(oneIndentUnit);
-                        }
-
-                        // Handle
-                        //     <foo>^</foo>
-                        // turning into
-                        //     <foo>
-                        //         ^
-                        //     </foo>
-                        ITextRegion left = getRegionAt(doc, offset, true /*biasLeft*/);
-                        ITextRegion right = getRegionAt(doc, offset, false /*biasLeft*/);
-                        if (left != null && right != null
-                                && left.getType().equals(XML_TAG_CLOSE)
-                                && right.getType().equals(XML_END_TAG_OPEN)) {
-                            // Move end tag
-                            if (tagBalance > 0 && bracketBalance < 0) {
-                                sb.append(oneIndentUnit);
-                            }
-                            c.caretOffset = offset + sb.length();
-                            c.shiftsCaret = false;
-                            sb.append(TextUtilities.getDefaultLineDelimiter(doc));
-                            sb.append(lineIndent);
-                        }
-                        c.text = sb.toString();
-                    } else if (region != null && region.getType().equals(XML_CONTENT)) {
-                        // Indenting in text content. If you're in the middle of editing
-                        // text, just copy the current line indentation.
-                        // However, if you're editing in leading whitespace (e.g. you press
-                        // newline on a blank line following say an element) then figure
-                        // out the indentation as if the newline had been pressed at the
-                        // end of the element, and insert that amount of indentation.
-                        // In this case we need to also make sure to subtract any existing
-                        // whitespace on the current line such that if we have
-                        //
-                        // <foo>
-                        // ^   <bar/>
-                        // </foo>
-                        //
-                        // you end up with
-                        //
-                        // <foo>
-                        //
-                        //    ^<bar/>
-                        // </foo>
-                        //
-                        String text = region.getText();
-                        int regionStart = region.getStartOffset();
-                        int delta = offset - regionStart;
-                        boolean inWhitespacePrefix = true;
-                        for (int i = 0, n = Math.min(delta, text.length()); i < n; i++) {
-                            char ch = text.charAt(i);
-                            if (!Character.isWhitespace(ch)) {
-                                inWhitespacePrefix = false;
-                                break;
-                            }
-                        }
-                        if (inWhitespacePrefix) {
-                            IStructuredDocumentRegion previous = region.getPrevious();
-                            if (previous != null && previous.getType() == XML_TAG_NAME) {
-                                ITextRegionList subRegions = previous.getRegions();
-                                ITextRegion last = subRegions.get(subRegions.size() - 1);
-                                if (last.getType() == XML_TAG_CLOSE ||
-                                        last.getType() == XML_EMPTY_TAG_CLOSE) {
-                                    // See if the last tag was a closing tag
-                                    boolean wasClose = last.getType() == XML_EMPTY_TAG_CLOSE;
-                                    if (!wasClose) {
-                                        // Search backwards to see if the XML_TAG_CLOSE
-                                        // is the end of an </endtag>
-                                        for (int i = subRegions.size() - 2; i >= 0; i--) {
-                                            ITextRegion current = subRegions.get(i);
-                                            String type = current.getType();
-                                            if (type != XML_TAG_NAME) {
-                                                wasClose = type == XML_END_TAG_OPEN;
-                                                break;
-                                            }
-                                        }
-                                    }
-
-                                    int begin = AndroidXmlCharacterMatcher.findTagBackwards(doc,
-                                            previous.getStartOffset() + last.getStart(), 0);
-                                    int prevLineStart = findLineStart(doc, begin);
-                                    int prevTextStart = findTextStart(doc, prevLineStart, begin);
-
-                                    String lineIndent = ""; //$NON-NLS-1$
-                                    if (prevTextStart > prevLineStart) {
-                                        lineIndent = doc.get(prevLineStart,
-                                                prevTextStart - prevLineStart);
-                                    }
-                                    StringBuilder sb = new StringBuilder(c.text);
-                                    sb.append(lineIndent);
-
-                                    // See if there is whitespace on the insert line that
-                                    // we should also remove
-                                    for (int i = delta, n = text.length(); i < n; i++) {
-                                        char ch = text.charAt(i);
-                                        if (ch == ' ') {
-                                            c.length++;
-                                        } else {
-                                            break;
-                                        }
-                                    }
-
-                                    boolean addIndent = (last.getType() == XML_TAG_CLOSE)
-                                            && !wasClose;
-
-                                    // Is there just whitespace left of this text tag
-                                    // until we reach an end tag?
-                                    boolean whitespaceToEndTag = true;
-                                    for (int i = delta; i < text.length(); i++) {
-                                        char ch = text.charAt(i);
-                                        if (ch == '\n' || !Character.isWhitespace(ch)) {
-                                            whitespaceToEndTag = false;
-                                            break;
-                                        }
-                                    }
-                                    if (whitespaceToEndTag) {
-                                        IStructuredDocumentRegion next = region.getNext();
-                                        if (next != null && next.getType() == XML_TAG_NAME) {
-                                            String nextType = next.getRegions().get(0).getType();
-                                            if (nextType == XML_END_TAG_OPEN) {
-                                                addIndent = false;
-                                            }
-                                        }
-                                    }
-
-                                    if (addIndent) {
-                                        sb.append(EclipseXmlFormatPreferences.create()
-                                                .getOneIndentUnit());
-                                    }
-                                    c.text = sb.toString();
-
-                                    return;
-                                }
-                            }
-                        }
-                        copyPreviousLineIndentation(doc, c);
-                    } else {
-                        copyPreviousLineIndentation(doc, c);
-                    }
-                } catch (BadLocationException e) {
-                    AdtPlugin.log(e, null);
-                } finally {
-                    model.releaseFromRead();
-                }
-            }
-        }
-    }
-
-    /**
-     * Returns the offset of the start of the line (which might be whitespace)
-     *
-     * @param document the document
-     * @param offset an offset for a character anywhere on the line
-     * @return the offset of the first character on the line
-     * @throws BadLocationException if the offset is invalid
-     */
-    public static int findLineStart(IDocument document, int offset) throws BadLocationException {
-        offset = Math.max(0, Math.min(offset, document.getLength() - 1));
-        IRegion info = document.getLineInformationOfOffset(offset);
-        return info.getOffset();
-    }
-
-    /**
-     * Finds the first non-whitespace character on the given line
-     *
-     * @param document the document to search
-     * @param lineStart the offset of the beginning of the line
-     * @param lineEnd the offset of the end of the line, or the maximum position on the
-     *            line to search
-     * @return the offset of the first non whitespace character, or the maximum position,
-     *         whichever is smallest
-     * @throws BadLocationException if the offsets are invalid
-     */
-    public static int findTextStart(IDocument document, int lineStart, int lineEnd)
-            throws BadLocationException {
-        for (int offset = lineStart; offset < lineEnd; offset++) {
-            char c = document.getChar(offset);
-            if (c != ' ' && c != '\t') {
-                return offset;
-            }
-        }
-
-        return lineEnd;
-    }
-
-    /**
-     * Indent the new line the same way as the current line.
-     *
-     * @param doc the document to indent in
-     * @param command the document command to customize
-     * @throws BadLocationException if the offsets are invalid
-     */
-    private void copyPreviousLineIndentation(IDocument doc, DocumentCommand command)
-            throws BadLocationException {
-
-        if (command.offset == -1 || doc.getLength() == 0) {
-            return;
-        }
-
-        int lineStart = findLineStart(doc, command.offset);
-        int textStart = findTextStart(doc, lineStart, command.offset);
-
-        StringBuilder sb = new StringBuilder(command.text);
-        if (textStart > lineStart) {
-            sb.append(doc.get(lineStart, textStart - lineStart));
-        }
-
-        command.text = sb.toString();
-    }
-
-
-    /**
-     * Returns the subregion at the given offset, with a bias to the left or a bias to the
-     * right. In other words, if | represents the caret position, in the XML
-     * {@code <foo>|</bar>} then the subregion with bias left is the closing {@code >} and
-     * the subregion with bias right is the opening {@code </}.
-     *
-     * @param doc the document
-     * @param offset the offset in the document
-     * @param biasLeft whether we should look at the token on the left or on the right
-     * @return the subregion at the given offset, or null if not found
-     */
-    private static ITextRegion getRegionAt(IStructuredDocument doc, int offset,
-            boolean biasLeft) {
-        if (biasLeft) {
-            offset--;
-        }
-        IStructuredDocumentRegion region =
-                doc.getRegionAtCharacterOffset(offset);
-        if (region != null) {
-            return region.getRegionAtCharacterOffset(offset);
-        }
-
-        return null;
-    }
-
-    /**
-     * Returns a pair of (tag-balance,bracket-balance) for the range textStart to offset.
-     *
-     * @param doc the document
-     * @param start the offset of the starting character (inclusive)
-     * @param end the offset of the ending character (exclusive)
-     * @return the balance of tags and brackets
-     */
-    private static Pair<Integer, Integer> getBalance(IStructuredDocument doc,
-            int start, int end) {
-        // Balance of open and closing tags
-        // <foo></foo> has tagBalance = 0, <foo> has tagBalance = 1
-        int tagBalance = 0;
-        // Balance of open and closing brackets
-        // <foo attr1="value1"> has bracketBalance = 1, <foo has bracketBalance = 1
-        int bracketBalance = 0;
-        IStructuredDocumentRegion region = doc.getRegionAtCharacterOffset(start);
-
-        if (region != null) {
-            boolean inOpenTag = true;
-            while (region != null && region.getStartOffset() < end) {
-                int regionStart = region.getStartOffset();
-                ITextRegionList subRegions = region.getRegions();
-                for (int i = 0, n = subRegions.size(); i < n; i++) {
-                    ITextRegion subRegion = subRegions.get(i);
-                    int subRegionStart = regionStart + subRegion.getStart();
-                    int subRegionEnd = regionStart + subRegion.getEnd();
-                    if (subRegionEnd < start || subRegionStart >= end) {
-                        continue;
-                    }
-                    String type = subRegion.getType();
-
-                    if (XML_TAG_OPEN.equals(type)) {
-                        bracketBalance++;
-                        inOpenTag = true;
-                    } else if (XML_TAG_CLOSE.equals(type)) {
-                        bracketBalance--;
-                        if (inOpenTag) {
-                            tagBalance++;
-                        } else {
-                            tagBalance--;
-                        }
-                    } else if (XML_END_TAG_OPEN.equals(type)) {
-                        bracketBalance++;
-                        inOpenTag = false;
-                    } else if (XML_EMPTY_TAG_CLOSE.equals(type)) {
-                        bracketBalance--;
-                    }
-                }
-
-                region = region.getNext();
-            }
-        }
-
-        return Pair.of(tagBalance, bracketBalance);
-    }
-
-    /**
-     * Determine if we're in smart insert mode (if so, don't do any edit magic)
-     *
-     * @return true if the editor is in smart mode (or if it's an unknown editor type)
-     */
-    private static boolean isSmartInsertMode() {
-        ITextEditor textEditor = AdtUtils.getActiveTextEditor();
-        if (textEditor instanceof ITextEditorExtension3) {
-            ITextEditorExtension3 editor = (ITextEditorExtension3) textEditor;
-            return editor.getInsertMode() == ITextEditorExtension3.SMART_INSERT;
-        }
-
-        return true;
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/AndroidXmlCharacterMatcher.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/AndroidXmlCharacterMatcher.java
deleted file mode 100644
index 8a12fe0..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/AndroidXmlCharacterMatcher.java
+++ /dev/null
@@ -1,238 +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.eclipse.adt.internal.editors;
-
-import static org.eclipse.wst.xml.core.internal.regions.DOMRegionContext.XML_EMPTY_TAG_CLOSE;
-import static org.eclipse.wst.xml.core.internal.regions.DOMRegionContext.XML_END_TAG_OPEN;
-import static org.eclipse.wst.xml.core.internal.regions.DOMRegionContext.XML_TAG_CLOSE;
-import static org.eclipse.wst.xml.core.internal.regions.DOMRegionContext.XML_TAG_NAME;
-import static org.eclipse.wst.xml.core.internal.regions.DOMRegionContext.XML_TAG_OPEN;
-
-import org.eclipse.jface.text.IDocument;
-import org.eclipse.jface.text.IRegion;
-import org.eclipse.jface.text.Region;
-import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;
-import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocumentRegion;
-import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegion;
-import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegionList;
-import org.eclipse.wst.xml.ui.internal.text.XMLDocumentRegionEdgeMatcher;
-
-/**
- * Custom version of the character matcher for XML files which adds the ability to
- * jump between open and close tags in the XML file.
- */
-@SuppressWarnings("restriction")
-public class AndroidXmlCharacterMatcher extends XMLDocumentRegionEdgeMatcher {
-    /**
-     * Constructs a new character matcher for Android XML files
-     */
-    public AndroidXmlCharacterMatcher() {
-    }
-
-    @Override
-    public IRegion match(IDocument doc, int offset) {
-        if (offset < 0 || offset >= doc.getLength()) {
-            return null;
-        }
-
-        IRegion match = findOppositeTag(doc, offset);
-        if (match != null) {
-            return match;
-        }
-
-        return super.match(doc, offset);
-    }
-
-    private IRegion findOppositeTag(IDocument document, int offset) {
-        if (!(document instanceof IStructuredDocument)) {
-            return null;
-        }
-        IStructuredDocument doc = (IStructuredDocument) document;
-
-        IStructuredDocumentRegion region = doc.getRegionAtCharacterOffset(offset);
-        if (region == null) {
-            return null;
-        }
-
-        ITextRegion subRegion = region.getRegionAtCharacterOffset(offset);
-        if (subRegion == null) {
-            return null;
-        }
-        ITextRegionList subRegions = region.getRegions();
-        int index = subRegions.indexOf(subRegion);
-
-        String type = subRegion.getType();
-        boolean isOpenTag = false;
-        boolean isCloseTag = false;
-
-        if (type.equals(XML_TAG_OPEN)) {
-            isOpenTag = true;
-        } else if (type.equals(XML_END_TAG_OPEN)) {
-            isCloseTag = true;
-        } else if (!(type.equals(XML_TAG_CLOSE) || type.equals(XML_TAG_NAME)) &&
-                (subRegion.getStart() + region.getStartOffset() == offset)) {
-            // Look to the left one character; we may have the case where you're
-            // pointing to the right of a tag, e.g.
-            //     <foo>^text
-            offset--;
-            region = doc.getRegionAtCharacterOffset(offset);
-            if (region == null) {
-                return null;
-            }
-            subRegion = region.getRegionAtCharacterOffset(offset);
-            if (subRegion == null) {
-                return null;
-            }
-            type = subRegion.getType();
-
-            subRegions = region.getRegions();
-            index = subRegions.indexOf(subRegion);
-        }
-
-        if (type.equals(XML_TAG_CLOSE) || type.equals(XML_TAG_NAME)) {
-            for (int i = index; i >= 0; i--) {
-                subRegion = subRegions.get(i);
-                type = subRegion.getType();
-                if (type.equals(XML_TAG_OPEN)) {
-                    isOpenTag = true;
-                    break;
-                } else if (type.equals(XML_END_TAG_OPEN)) {
-                    isCloseTag = true;
-                    break;
-                }
-            }
-        }
-
-        if (isOpenTag) {
-            // Find closing tag
-            int target = findTagForwards(doc, subRegion.getStart() + region.getStartOffset(), 0);
-            // Note - there is no point in looking up the whole region for the matching
-            // tag, because even if you pass a length greater than 1 here, the paint highlighter
-            // will only highlight a single character -- the *last* character of the region,
-            // not the whole region itself.
-            return new Region(target, 1);
-        } else if (isCloseTag) {
-            // Find open tag
-            int target = findTagBackwards(doc, subRegion.getStart() + region.getStartOffset(), -1);
-            return new Region(target, 1);
-        }
-
-        return null;
-    }
-
-    /**
-     * Finds the corresponding open tag by searching backwards until the tag balance
-     * reaches a given target.
-     *
-     * @param doc the document
-     * @param offset the ending offset (where the search begins searching backwards from)
-     * @param targetTagBalance the balance to end the search at
-     * @return the offset of the beginning of the open tag
-     */
-    public static int findTagBackwards(IStructuredDocument doc, int offset, int targetTagBalance) {
-        // Balance of open and closing tags
-        int tagBalance = 0;
-        // Balance of open and closing brackets
-        IStructuredDocumentRegion region = doc.getRegionAtCharacterOffset(offset);
-        if (region != null) {
-            boolean inEmptyTag = true;
-
-            while (region != null) {
-                int regionStart = region.getStartOffset();
-                ITextRegionList subRegions = region.getRegions();
-                for (int i = subRegions.size() - 1; i >= 0; i--) {
-                    ITextRegion subRegion = subRegions.get(i);
-                    int subRegionStart = regionStart + subRegion.getStart();
-                    if (subRegionStart >= offset) {
-                        continue;
-                    }
-                    String type = subRegion.getType();
-
-                    // Iterate backwards and keep track of the tag balance such that
-                    // we can find the corresponding opening tag
-
-                    if (XML_TAG_OPEN.equals(type)) {
-                        if (!inEmptyTag) {
-                            tagBalance--;
-                        }
-                        if (tagBalance == targetTagBalance) {
-                            return subRegionStart;
-                        }
-                    } else if (XML_END_TAG_OPEN.equals(type)) {
-                        tagBalance++;
-                    } else if (XML_EMPTY_TAG_CLOSE.equals(type)) {
-                        inEmptyTag = true;
-                    } else if (XML_TAG_CLOSE.equals(type)) {
-                        inEmptyTag = false;
-                    }
-                }
-
-                region = region.getPrevious();
-            }
-        }
-
-        return -1;
-    }
-
-    /**
-     * Finds the corresponding closing tag by searching forwards until the tag balance
-     * reaches a given target.
-     *
-     * @param doc the document
-     * @param start the starting offset (where the search begins searching forwards from)
-     * @param targetTagBalance the balance to end the search at
-     * @return the offset of the beginning of the closing tag
-     */
-    public static int findTagForwards(IStructuredDocument doc, int start, int targetTagBalance) {
-        int tagBalance = 0;
-        IStructuredDocumentRegion region = doc.getRegionAtCharacterOffset(start);
-
-        if (region != null) {
-            while (region != null) {
-                int regionStart = region.getStartOffset();
-                ITextRegionList subRegions = region.getRegions();
-                for (int i = 0, n = subRegions.size(); i < n; i++) {
-                    ITextRegion subRegion = subRegions.get(i);
-                    int subRegionStart = regionStart + subRegion.getStart();
-                    int subRegionEnd = regionStart + subRegion.getEnd();
-                    if (subRegionEnd < start) {
-                        continue;
-                    }
-                    String type = subRegion.getType();
-
-                    if (XML_TAG_OPEN.equals(type)) {
-                        tagBalance++;
-                    } else if (XML_END_TAG_OPEN.equals(type)) {
-                        tagBalance--;
-                        if (tagBalance == targetTagBalance) {
-                            return subRegionStart;
-                        }
-                    } else if (XML_EMPTY_TAG_CLOSE.equals(type)) {
-                        tagBalance--;
-                        if (tagBalance == targetTagBalance) {
-                            // We don't jump to matching tags within a self-closed tag
-                            return -1;
-                        }
-                    }
-                }
-
-                region = region.getNext();
-            }
-        }
-
-        return -1;
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/AndroidXmlEditor.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/AndroidXmlEditor.java
deleted file mode 100644
index 1d4e133..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/AndroidXmlEditor.java
+++ /dev/null
@@ -1,1709 +0,0 @@
-/*
- * Copyright (C) 2007 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.editors;
-
-import static org.eclipse.wst.sse.ui.internal.actions.StructuredTextEditorActionConstants.ACTION_NAME_FORMAT_DOCUMENT;
-
-import com.android.annotations.Nullable;
-import com.android.ide.eclipse.adt.AdtConstants;
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.ide.eclipse.adt.AdtUtils;
-import com.android.ide.eclipse.adt.internal.editors.uimodel.UiElementNode;
-import com.android.ide.eclipse.adt.internal.lint.EclipseLintRunner;
-import com.android.ide.eclipse.adt.internal.preferences.AdtPrefs;
-import com.android.ide.eclipse.adt.internal.refactorings.core.RenameResourceXmlTextAction;
-import com.android.ide.eclipse.adt.internal.sdk.AndroidTargetData;
-import com.android.ide.eclipse.adt.internal.sdk.Sdk;
-import com.android.ide.eclipse.adt.internal.sdk.Sdk.ITargetChangeListener;
-import com.android.ide.eclipse.adt.internal.sdk.Sdk.TargetChangeListener;
-import com.android.sdklib.IAndroidTarget;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.QualifiedName;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.core.runtime.jobs.Job;
-import org.eclipse.jdt.ui.actions.IJavaEditorActionDefinitionIds;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.dialogs.ErrorDialog;
-import org.eclipse.jface.text.BadLocationException;
-import org.eclipse.jface.text.IDocument;
-import org.eclipse.jface.text.IRegion;
-import org.eclipse.jface.text.ITextViewer;
-import org.eclipse.jface.text.source.ISourceViewer;
-import org.eclipse.swt.custom.StyledText;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.ui.IActionBars;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IEditorReference;
-import org.eclipse.ui.IEditorSite;
-import org.eclipse.ui.IFileEditorInput;
-import org.eclipse.ui.IURIEditorInput;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.actions.ActionFactory;
-import org.eclipse.ui.browser.IWorkbenchBrowserSupport;
-import org.eclipse.ui.forms.IManagedForm;
-import org.eclipse.ui.forms.editor.FormEditor;
-import org.eclipse.ui.forms.editor.IFormPage;
-import org.eclipse.ui.forms.events.HyperlinkAdapter;
-import org.eclipse.ui.forms.events.HyperlinkEvent;
-import org.eclipse.ui.forms.events.IHyperlinkListener;
-import org.eclipse.ui.forms.widgets.FormText;
-import org.eclipse.ui.ide.IDEActionFactory;
-import org.eclipse.ui.ide.IGotoMarker;
-import org.eclipse.ui.internal.browser.WorkbenchBrowserSupport;
-import org.eclipse.ui.part.MultiPageEditorPart;
-import org.eclipse.ui.part.WorkbenchPart;
-import org.eclipse.ui.views.contentoutline.IContentOutlinePage;
-import org.eclipse.wst.sse.core.StructuredModelManager;
-import org.eclipse.wst.sse.core.internal.provisional.IModelManager;
-import org.eclipse.wst.sse.core.internal.provisional.IModelStateListener;
-import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
-import org.eclipse.wst.sse.core.internal.provisional.IndexedRegion;
-import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;
-import org.eclipse.wst.sse.ui.StructuredTextEditor;
-import org.eclipse.wst.sse.ui.internal.StructuredTextViewer;
-import org.eclipse.wst.xml.core.internal.document.NodeContainer;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
-import org.w3c.dom.Document;
-import org.w3c.dom.Node;
-
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.util.Collections;
-
-/**
- * Multi-page form editor for Android XML files.
- * <p/>
- * It is designed to work with a {@link StructuredTextEditor} that will display an XML file.
- * <br/>
- * Derived classes must implement createFormPages to create the forms before the
- * source editor. This can be a no-op if desired.
- */
-@SuppressWarnings("restriction") // Uses XML model, which has no non-restricted replacement yet
-public abstract class AndroidXmlEditor extends FormEditor {
-
-    /** Icon used for the XML source page. */
-    public static final String ICON_XML_PAGE = "editor_page_source"; //$NON-NLS-1$
-
-    /** Preference name for the current page of this file */
-    private static final String PREF_CURRENT_PAGE = "_current_page"; //$NON-NLS-1$
-
-    /** Id string used to create the Android SDK browser */
-    private static String BROWSER_ID = "android"; //$NON-NLS-1$
-
-    /** Page id of the XML source editor, used for switching tabs programmatically */
-    public final static String TEXT_EDITOR_ID = "editor_part"; //$NON-NLS-1$
-
-    /** Width hint for text fields. Helps the grid layout resize properly on smaller screens */
-    public static final int TEXT_WIDTH_HINT = 50;
-
-    /** Page index of the text editor (always the last page) */
-    protected int mTextPageIndex;
-    /** The text editor */
-    private StructuredTextEditor mTextEditor;
-    /** Listener for the XML model from the StructuredEditor */
-    private XmlModelStateListener mXmlModelStateListener;
-    /** Listener to update the root node if the target of the file is changed because of a
-     * SDK location change or a project target change */
-    private TargetChangeListener mTargetListener = null;
-
-    /** flag set during page creation */
-    private boolean mIsCreatingPage = false;
-
-    /**
-     * Flag used to ignore XML model updates. For example, the flag is set during
-     * formatting. A format operation should completely preserve the semantics of the XML
-     * so the document listeners can use this flag to skip updating the model when edits
-     * are observed during a formatting operation
-     */
-    private boolean mIgnoreXmlUpdate;
-
-    /**
-     * Flag indicating we're inside {@link #wrapEditXmlModel(Runnable)}.
-     * This is a counter, which allows us to nest the edit XML calls.
-     * There is no pending operation when the counter is at zero.
-     */
-    private int mIsEditXmlModelPending;
-
-    /**
-     * Usually null, but during an editing operation, represents the highest
-     * node which should be formatted when the editing operation is complete.
-     */
-    private UiElementNode mFormatNode;
-
-    /**
-     * Whether {@link #mFormatNode} should be formatted recursively, or just
-     * the node itself (its arguments)
-     */
-    private boolean mFormatChildren;
-
-    /**
-     * Creates a form editor.
-     * <p/>
-     * Some derived classes will want to use {@link #addDefaultTargetListener()}
-     * to setup the default listener to monitor SDK target changes. This
-     * is no longer the default.
-     */
-    public AndroidXmlEditor() {
-        super();
-    }
-
-    @Override
-    public void init(IEditorSite site, IEditorInput input) throws PartInitException {
-        super.init(site, input);
-        // Trigger a check to see if the SDK needs to be reloaded (which will
-        // invoke onSdkLoaded or ITargetChangeListener asynchronously as needed).
-        AdtPlugin.getDefault().refreshSdk();
-    }
-
-    /**
-     * Setups a default {@link ITargetChangeListener} that will call
-     * {@link #initUiRootNode(boolean)} when the SDK or the target changes.
-     */
-    public void addDefaultTargetListener() {
-        if (mTargetListener == null) {
-            mTargetListener = new TargetChangeListener() {
-                @Override
-                public IProject getProject() {
-                    return AndroidXmlEditor.this.getProject();
-                }
-
-                @Override
-                public void reload() {
-                    commitPages(false /* onSave */);
-
-                    // recreate the ui root node always
-                    initUiRootNode(true /*force*/);
-                }
-            };
-            AdtPlugin.getDefault().addTargetListener(mTargetListener);
-        }
-    }
-
-    // ---- Abstract Methods ----
-
-    /**
-     * Returns the root node of the UI element hierarchy manipulated by the current
-     * UI node editor.
-     */
-    abstract public UiElementNode getUiRootNode();
-
-    /**
-     * Creates the various form pages.
-     * <p/>
-     * Derived classes must implement this to add their own specific tabs.
-     */
-    abstract protected void createFormPages();
-
-    /**
-     * Called by the base class {@link AndroidXmlEditor} once all pages (custom form pages
-     * as well as text editor page) have been created. This give a chance to deriving
-     * classes to adjust behavior once the text page has been created.
-     */
-    protected void postCreatePages() {
-        // Nothing in the base class.
-    }
-
-    /**
-     * Creates the initial UI Root Node, including the known mandatory elements.
-     * @param force if true, a new UiManifestNode is recreated even if it already exists.
-     */
-    abstract protected void initUiRootNode(boolean force);
-
-    /**
-     * Subclasses should override this method to process the new XML Model, which XML
-     * root node is given.
-     *
-     * The base implementation is empty.
-     *
-     * @param xml_doc The XML document, if available, or null if none exists.
-     */
-    abstract protected void xmlModelChanged(Document xml_doc);
-
-    /**
-     * Controls whether XML models are ignored or not.
-     *
-     * @param ignore when true, ignore all subsequent XML model updates, when false start
-     *            processing XML model updates again
-     */
-    public void setIgnoreXmlUpdate(boolean ignore) {
-        mIgnoreXmlUpdate = ignore;
-    }
-
-    /**
-     * Returns whether XML model events are ignored or not. This is the case
-     * when we are deliberately modifying the document in a way which does not
-     * change the semantics (such as formatting), or when we have already
-     * directly updated the model ourselves.
-     *
-     * @return true if XML events should be ignored
-     */
-    public boolean getIgnoreXmlUpdate() {
-        return mIgnoreXmlUpdate;
-    }
-
-    // ---- Base Class Overrides, Interfaces Implemented ----
-
-    @Override
-    public Object getAdapter(@SuppressWarnings("rawtypes") Class adapter) {
-        Object result = super.getAdapter(adapter);
-
-        if (result != null && adapter.equals(IGotoMarker.class) ) {
-            final IGotoMarker gotoMarker = (IGotoMarker) result;
-            return new IGotoMarker() {
-                @Override
-                public void gotoMarker(IMarker marker) {
-                    gotoMarker.gotoMarker(marker);
-                    try {
-                        // Lint markers should always jump to XML text
-                        if (marker.getType().equals(AdtConstants.MARKER_LINT)) {
-                            IEditorPart editor = AdtUtils.getActiveEditor();
-                            if (editor instanceof AndroidXmlEditor) {
-                                AndroidXmlEditor xmlEditor = (AndroidXmlEditor) editor;
-                                xmlEditor.setActivePage(AndroidXmlEditor.TEXT_EDITOR_ID);
-                            }
-                        }
-                    } catch (CoreException e) {
-                        AdtPlugin.log(e, null);
-                    }
-                }
-            };
-        }
-
-        if (result == null && adapter == IContentOutlinePage.class) {
-            return getStructuredTextEditor().getAdapter(adapter);
-        }
-
-        return result;
-    }
-
-    /**
-     * Creates the pages of the multi-page editor.
-     */
-    @Override
-    protected void addPages() {
-        createAndroidPages();
-        selectDefaultPage(null /* defaultPageId */);
-    }
-
-    /**
-     * Creates the page for the Android Editors
-     */
-    public void createAndroidPages() {
-        mIsCreatingPage = true;
-        createFormPages();
-        createTextEditor();
-        updateActionBindings();
-        postCreatePages();
-        mIsCreatingPage = false;
-    }
-
-    /**
-     * Returns whether the editor is currently creating its pages.
-     */
-    public boolean isCreatingPages() {
-        return mIsCreatingPage;
-    }
-
-    /**
-     * {@inheritDoc}
-     * <p/>
-     * If the page is an instance of {@link IPageImageProvider}, the image returned by
-     * by {@link IPageImageProvider#getPageImage()} will be set on the page's tab.
-     */
-    @Override
-    public int addPage(IFormPage page) throws PartInitException {
-        int index = super.addPage(page);
-        if (page instanceof IPageImageProvider) {
-            setPageImage(index, ((IPageImageProvider) page).getPageImage());
-        }
-        return index;
-    }
-
-    /**
-     * {@inheritDoc}
-     * <p/>
-     * If the editor is an instance of {@link IPageImageProvider}, the image returned by
-     * by {@link IPageImageProvider#getPageImage()} will be set on the page's tab.
-     */
-    @Override
-    public int addPage(IEditorPart editor, IEditorInput input) throws PartInitException {
-        int index = super.addPage(editor, input);
-        if (editor instanceof IPageImageProvider) {
-            setPageImage(index, ((IPageImageProvider) editor).getPageImage());
-        }
-        return index;
-    }
-
-    /**
-     * Creates undo redo (etc) actions for the editor site (so that it works for any page of this
-     * multi-page editor) by re-using the actions defined by the {@link StructuredTextEditor}
-     * (aka the XML text editor.)
-     */
-    protected void updateActionBindings() {
-        IActionBars bars = getEditorSite().getActionBars();
-        if (bars != null) {
-            IAction action = mTextEditor.getAction(ActionFactory.UNDO.getId());
-            bars.setGlobalActionHandler(ActionFactory.UNDO.getId(), action);
-
-            action = mTextEditor.getAction(ActionFactory.REDO.getId());
-            bars.setGlobalActionHandler(ActionFactory.REDO.getId(), action);
-
-            bars.setGlobalActionHandler(ActionFactory.DELETE.getId(),
-                    mTextEditor.getAction(ActionFactory.DELETE.getId()));
-            bars.setGlobalActionHandler(ActionFactory.CUT.getId(),
-                    mTextEditor.getAction(ActionFactory.CUT.getId()));
-            bars.setGlobalActionHandler(ActionFactory.COPY.getId(),
-                    mTextEditor.getAction(ActionFactory.COPY.getId()));
-            bars.setGlobalActionHandler(ActionFactory.PASTE.getId(),
-                    mTextEditor.getAction(ActionFactory.PASTE.getId()));
-            bars.setGlobalActionHandler(ActionFactory.SELECT_ALL.getId(),
-                    mTextEditor.getAction(ActionFactory.SELECT_ALL.getId()));
-            bars.setGlobalActionHandler(ActionFactory.FIND.getId(),
-                    mTextEditor.getAction(ActionFactory.FIND.getId()));
-            bars.setGlobalActionHandler(IDEActionFactory.BOOKMARK.getId(),
-                    mTextEditor.getAction(IDEActionFactory.BOOKMARK.getId()));
-
-            bars.updateActionBars();
-        }
-    }
-
-    /**
-     * Clears the action bindings for the editor site.
-     */
-    protected void clearActionBindings(boolean includeUndoRedo) {
-        IActionBars bars = getEditorSite().getActionBars();
-        if (bars != null) {
-            // For some reason, undo/redo doesn't seem to work in the form editor.
-            // This appears to be the case for pure Eclipse form editors too, e.g. see
-            //      https://bugs.eclipse.org/bugs/show_bug.cgi?id=68423
-            // However, as a workaround we can use the *text* editor's underlying undo
-            // to revert operations being done in the UI, and the form automatically updates.
-            // Therefore, to work around this, we simply leave the text editor bindings
-            // in place if {@code includeUndoRedo} is not set
-            if (includeUndoRedo) {
-                bars.setGlobalActionHandler(ActionFactory.UNDO.getId(), null);
-                bars.setGlobalActionHandler(ActionFactory.REDO.getId(), null);
-            }
-            bars.setGlobalActionHandler(ActionFactory.DELETE.getId(), null);
-            bars.setGlobalActionHandler(ActionFactory.CUT.getId(), null);
-            bars.setGlobalActionHandler(ActionFactory.COPY.getId(), null);
-            bars.setGlobalActionHandler(ActionFactory.PASTE.getId(), null);
-            bars.setGlobalActionHandler(ActionFactory.SELECT_ALL.getId(), null);
-            bars.setGlobalActionHandler(ActionFactory.FIND.getId(), null);
-            bars.setGlobalActionHandler(IDEActionFactory.BOOKMARK.getId(), null);
-
-            bars.updateActionBars();
-        }
-    }
-
-    /**
-     * Selects the default active page.
-     * @param defaultPageId the id of the page to show. If <code>null</code> the editor attempts to
-     * find the default page in the properties of the {@link IResource} object being edited.
-     */
-    public void selectDefaultPage(String defaultPageId) {
-        if (defaultPageId == null) {
-            IFile file = getInputFile();
-            if (file != null) {
-                QualifiedName qname = new QualifiedName(AdtPlugin.PLUGIN_ID,
-                        getClass().getSimpleName() + PREF_CURRENT_PAGE);
-                String pageId;
-                try {
-                    pageId = file.getPersistentProperty(qname);
-                    if (pageId != null) {
-                        defaultPageId = pageId;
-                    }
-                } catch (CoreException e) {
-                    // ignored
-                }
-            }
-        }
-
-        if (defaultPageId != null) {
-            try {
-                setActivePage(Integer.parseInt(defaultPageId));
-            } catch (Exception e) {
-                // We can get NumberFormatException from parseInt but also
-                // AssertionError from setActivePage when the index is out of bounds.
-                // Generally speaking we just want to ignore any exception and fall back on the
-                // first page rather than crash the editor load. Logging the error is enough.
-                AdtPlugin.log(e, "Selecting page '%s' in AndroidXmlEditor failed", defaultPageId);
-            }
-        } else if (AdtPrefs.getPrefs().isXmlEditorPreferred(getPersistenceCategory())) {
-            setActivePage(mTextPageIndex);
-        }
-    }
-
-    /** The layout editor */
-    public static final int CATEGORY_LAYOUT   = 1 << 0;
-    /** The manifest editor */
-    public static final int CATEGORY_MANIFEST = 1 << 1;
-    /** Any other XML editor */
-    public static final int CATEGORY_OTHER    = 1 << 2;
-
-    /**
-     * Returns the persistence category to use for this editor; this should be
-     * one of the {@code CATEGORY_} constants such as {@link #CATEGORY_MANIFEST},
-     * {@link #CATEGORY_LAYOUT}, {@link #CATEGORY_OTHER}, ...
-     * <p>
-     * The persistence category is used to group editors together when it comes
-     * to certain types of persistence metadata. For example, whether this type
-     * of file was most recently edited graphically or with an XML text editor.
-     * We'll open new files in the same text or graphical mode as the last time
-     * the user edited a file of the same persistence category.
-     * <p>
-     * Before we added the persistence category, we had a single boolean flag
-     * recording whether the XML files were most recently edited graphically or
-     * not. However, this meant that users can't for example prefer to edit
-     * Manifest files graphically and string files via XML. By splitting the
-     * editors up into categories, we can track the mode at a finer granularity,
-     * and still allow similar editors such as those used for animations and
-     * colors to be treated the same way.
-     *
-     * @return the persistence category constant
-     */
-    protected int getPersistenceCategory() {
-        return CATEGORY_OTHER;
-    }
-
-    /**
-     * Removes all the pages from the editor.
-     */
-    protected void removePages() {
-        int count = getPageCount();
-        for (int i = count - 1 ; i >= 0 ; i--) {
-            removePage(i);
-        }
-    }
-
-    /**
-     * Overrides the parent's setActivePage to be able to switch to the xml editor.
-     *
-     * If the special pageId TEXT_EDITOR_ID is given, switches to the mTextPageIndex page.
-     * This is needed because the editor doesn't actually derive from IFormPage and thus
-     * doesn't have the get-by-page-id method. In this case, the method returns null since
-     * IEditorPart does not implement IFormPage.
-     */
-    @Override
-    public IFormPage setActivePage(String pageId) {
-        if (pageId.equals(TEXT_EDITOR_ID)) {
-            super.setActivePage(mTextPageIndex);
-            return null;
-        } else {
-            return super.setActivePage(pageId);
-        }
-    }
-
-    /**
-     * Notifies this multi-page editor that the page with the given id has been
-     * activated. This method is called when the user selects a different tab.
-     *
-     * @see MultiPageEditorPart#pageChange(int)
-     */
-    @Override
-    protected void pageChange(int newPageIndex) {
-        super.pageChange(newPageIndex);
-
-        // Do not record page changes during creation of pages
-        if (mIsCreatingPage) {
-            return;
-        }
-
-        IFile file = getInputFile();
-        if (file != null) {
-            QualifiedName qname = new QualifiedName(AdtPlugin.PLUGIN_ID,
-                    getClass().getSimpleName() + PREF_CURRENT_PAGE);
-            try {
-                file.setPersistentProperty(qname, Integer.toString(newPageIndex));
-            } catch (CoreException e) {
-                // ignore
-            }
-        }
-
-        boolean isTextPage = newPageIndex == mTextPageIndex;
-        AdtPrefs.getPrefs().setXmlEditorPreferred(getPersistenceCategory(), isTextPage);
-    }
-
-    /**
-     * Returns true if the active page is the editor page
-     *
-     * @return true if the active page is the editor page
-     */
-    public boolean isEditorPageActive() {
-        return getActivePage() == mTextPageIndex;
-    }
-
-    /**
-     * Returns the {@link IFile} matching the editor's input or null.
-     */
-    @Nullable
-    public IFile getInputFile() {
-        IEditorInput input = getEditorInput();
-        if (input instanceof IFileEditorInput) {
-            return ((IFileEditorInput) input).getFile();
-        }
-        return null;
-    }
-
-    /**
-     * Removes attached listeners.
-     *
-     * @see WorkbenchPart
-     */
-    @Override
-    public void dispose() {
-        IStructuredModel xml_model = getModelForRead();
-        if (xml_model != null) {
-            try {
-                if (mXmlModelStateListener != null) {
-                    xml_model.removeModelStateListener(mXmlModelStateListener);
-                }
-
-            } finally {
-                xml_model.releaseFromRead();
-            }
-        }
-
-        if (mTargetListener != null) {
-            AdtPlugin.getDefault().removeTargetListener(mTargetListener);
-            mTargetListener = null;
-        }
-
-        super.dispose();
-    }
-
-    /**
-     * Commit all dirty pages then saves the contents of the text editor.
-     * <p/>
-     * This works by committing all data to the XML model and then
-     * asking the Structured XML Editor to save the XML.
-     *
-     * @see IEditorPart
-     */
-    @Override
-    public void doSave(IProgressMonitor monitor) {
-        commitPages(true /* onSave */);
-
-        if (AdtPrefs.getPrefs().isFormatOnSave()) {
-            IAction action = mTextEditor.getAction(ACTION_NAME_FORMAT_DOCUMENT);
-            if (action != null) {
-                try {
-                    mIgnoreXmlUpdate = true;
-                    action.run();
-                } finally {
-                    mIgnoreXmlUpdate = false;
-                }
-            }
-        }
-
-        // The actual "save" operation is done by the Structured XML Editor
-        getEditor(mTextPageIndex).doSave(monitor);
-
-        // Check for errors on save, if enabled
-        if (AdtPrefs.getPrefs().isLintOnSave()) {
-            runLint();
-        }
-    }
-
-    /**
-     * Tells the editor to start a Lint check.
-     * It's up to the caller to check whether this should be done depending on preferences.
-     * <p/>
-     * The default implementation is to call {@link #startLintJob()}.
-     *
-     * @return The Job started by {@link EclipseLintRunner} or null if no job was started.
-     */
-    protected Job runLint() {
-        return startLintJob();
-    }
-
-    /**
-     * Utility method that creates a Job to run Lint on the current document.
-     * Does not wait for the job to finish - just returns immediately.
-     *
-     * @return a new job, or null
-     * @see EclipseLintRunner#startLint(java.util.List, IResource, IDocument,
-     *      boolean, boolean)
-     */
-    @Nullable
-    public Job startLintJob() {
-        IFile file = getInputFile();
-        if (file != null) {
-            return EclipseLintRunner.startLint(Collections.singletonList(file), file,
-                    getStructuredDocument(), false /*fatalOnly*/, false /*show*/);
-        }
-
-        return null;
-    }
-
-    /* (non-Javadoc)
-     * Saves the contents of this editor to another object.
-     * <p>
-     * Subclasses must override this method to implement the open-save-close lifecycle
-     * for an editor.  For greater details, see <code>IEditorPart</code>
-     * </p>
-     *
-     * @see IEditorPart
-     */
-    @Override
-    public void doSaveAs() {
-        commitPages(true /* onSave */);
-
-        IEditorPart editor = getEditor(mTextPageIndex);
-        editor.doSaveAs();
-        setPageText(mTextPageIndex, editor.getTitle());
-        setInput(editor.getEditorInput());
-    }
-
-    /**
-     * Commits all dirty pages in the editor. This method should
-     * be called as a first step of a 'save' operation.
-     * <p/>
-     * This is the same implementation as in {@link FormEditor}
-     * except it fixes two bugs: a cast to IFormPage is done
-     * from page.get(i) <em>before</em> being tested with instanceof.
-     * Another bug is that the last page might be a null pointer.
-     * <p/>
-     * The incorrect casting makes the original implementation crash due
-     * to our {@link StructuredTextEditor} not being an {@link IFormPage}
-     * so we have to override and duplicate to fix it.
-     *
-     * @param onSave <code>true</code> if commit is performed as part
-     * of the 'save' operation, <code>false</code> otherwise.
-     * @since 3.3
-     */
-    @Override
-    public void commitPages(boolean onSave) {
-        if (pages != null) {
-            for (int i = 0; i < pages.size(); i++) {
-                Object page = pages.get(i);
-                if (page != null && page instanceof IFormPage) {
-                    IFormPage form_page = (IFormPage) page;
-                    IManagedForm managed_form = form_page.getManagedForm();
-                    if (managed_form != null && managed_form.isDirty()) {
-                        managed_form.commit(onSave);
-                    }
-                }
-            }
-        }
-    }
-
-    /* (non-Javadoc)
-     * Returns whether the "save as" operation is supported by this editor.
-     * <p>
-     * Subclasses must override this method to implement the open-save-close lifecycle
-     * for an editor.  For greater details, see <code>IEditorPart</code>
-     * </p>
-     *
-     * @see IEditorPart
-     */
-    @Override
-    public boolean isSaveAsAllowed() {
-        return false;
-    }
-
-    /**
-     * Returns the page index of the text editor (always the last page)
-
-     * @return the page index of the text editor (always the last page)
-     */
-    public int getTextPageIndex() {
-        return mTextPageIndex;
-    }
-
-    // ---- Local methods ----
-
-
-    /**
-     * Helper method that creates a new hyper-link Listener.
-     * Used by derived classes which need active links in {@link FormText}.
-     * <p/>
-     * This link listener handles two kinds of URLs:
-     * <ul>
-     * <li> Links starting with "http" are simply sent to a local browser.
-     * <li> Links starting with "file:/" are simply sent to a local browser.
-     * <li> Links starting with "page:" are expected to be an editor page id to switch to.
-     * <li> Other links are ignored.
-     * </ul>
-     *
-     * @return A new hyper-link listener for FormText to use.
-     */
-    public final IHyperlinkListener createHyperlinkListener() {
-        return new HyperlinkAdapter() {
-            /**
-             * Switch to the page corresponding to the link that has just been clicked.
-             * For this purpose, the HREF of the &lt;a&gt; tags above is the page ID to switch to.
-             */
-            @Override
-            public void linkActivated(HyperlinkEvent e) {
-                super.linkActivated(e);
-                String link = e.data.toString();
-                if (link.startsWith("http") ||          //$NON-NLS-1$
-                        link.startsWith("file:/")) {    //$NON-NLS-1$
-                    openLinkInBrowser(link);
-                } else if (link.startsWith("page:")) {  //$NON-NLS-1$
-                    // Switch to an internal page
-                    setActivePage(link.substring(5 /* strlen("page:") */));
-                }
-            }
-        };
-    }
-
-    /**
-     * Open the http link into a browser
-     *
-     * @param link The URL to open in a browser
-     */
-    private void openLinkInBrowser(String link) {
-        try {
-            IWorkbenchBrowserSupport wbs = WorkbenchBrowserSupport.getInstance();
-            wbs.createBrowser(BROWSER_ID).openURL(new URL(link));
-        } catch (PartInitException e1) {
-            // pass
-        } catch (MalformedURLException e1) {
-            // pass
-        }
-    }
-
-    /**
-     * Creates the XML source editor.
-     * <p/>
-     * Memorizes the index page of the source editor (it's always the last page, but the number
-     * of pages before can change.)
-     * <br/>
-     * Retrieves the underlying XML model from the StructuredEditor and attaches a listener to it.
-     * Finally triggers modelChanged() on the model listener -- derived classes can use this
-     * to initialize the model the first time.
-     * <p/>
-     * Called only once <em>after</em> createFormPages.
-     */
-    private void createTextEditor() {
-        try {
-            mTextEditor = new StructuredTextEditor() {
-                @Override
-                protected void createActions() {
-                    super.createActions();
-
-                    Action action = new RenameResourceXmlTextAction(mTextEditor);
-                    action.setActionDefinitionId(IJavaEditorActionDefinitionIds.RENAME_ELEMENT);
-                    setAction(IJavaEditorActionDefinitionIds.RENAME_ELEMENT, action);
-                }
-            };
-            int index = addPage(mTextEditor, getEditorInput());
-            mTextPageIndex = index;
-            setPageText(index, mTextEditor.getTitle());
-            setPageImage(index,
-                    IconFactory.getInstance().getIcon(ICON_XML_PAGE));
-
-            if (!(mTextEditor.getTextViewer().getDocument() instanceof IStructuredDocument)) {
-                Status status = new Status(IStatus.ERROR, AdtPlugin.PLUGIN_ID,
-                        "Error opening the Android XML editor. Is the document an XML file?");
-                throw new RuntimeException("Android XML Editor Error", new CoreException(status));
-            }
-
-            IStructuredModel xml_model = getModelForRead();
-            if (xml_model != null) {
-                try {
-                    mXmlModelStateListener = new XmlModelStateListener();
-                    xml_model.addModelStateListener(mXmlModelStateListener);
-                    mXmlModelStateListener.modelChanged(xml_model);
-                } catch (Exception e) {
-                    AdtPlugin.log(e, "Error while loading editor"); //$NON-NLS-1$
-                } finally {
-                    xml_model.releaseFromRead();
-                }
-            }
-        } catch (PartInitException e) {
-            ErrorDialog.openError(getSite().getShell(),
-                    "Android XML Editor Error", null, e.getStatus());
-        }
-    }
-
-    /**
-     * Returns the ISourceViewer associated with the Structured Text editor.
-     */
-    public final ISourceViewer getStructuredSourceViewer() {
-        if (mTextEditor != null) {
-            // We can't access mDelegate.getSourceViewer() because it is protected,
-            // however getTextViewer simply returns the SourceViewer casted, so we
-            // can use it instead.
-            return mTextEditor.getTextViewer();
-        }
-        return null;
-    }
-
-    /**
-     * Return the {@link StructuredTextEditor} associated with this XML editor
-     *
-     * @return the associated {@link StructuredTextEditor}
-     */
-    public StructuredTextEditor getStructuredTextEditor() {
-        return mTextEditor;
-    }
-
-    /**
-     * Returns the {@link IStructuredDocument} used by the StructuredTextEditor (aka Source
-     * Editor) or null if not available.
-     */
-    public IStructuredDocument getStructuredDocument() {
-        if (mTextEditor != null && mTextEditor.getTextViewer() != null) {
-            return (IStructuredDocument) mTextEditor.getTextViewer().getDocument();
-        }
-        return null;
-    }
-
-    /**
-     * Returns a version of the model that has been shared for read.
-     * <p/>
-     * Callers <em>must</em> call model.releaseFromRead() when done, typically
-     * in a try..finally clause.
-     *
-     * Portability note: this uses getModelManager which is part of wst.sse.core; however
-     * the interface returned is part of wst.sse.core.internal.provisional so we can
-     * expect it to change in a distant future if they start cleaning their codebase,
-     * however unlikely that is.
-     *
-     * @return The model for the XML document or null if cannot be obtained from the editor
-     */
-    public IStructuredModel getModelForRead() {
-        IStructuredDocument document = getStructuredDocument();
-        if (document != null) {
-            IModelManager mm = StructuredModelManager.getModelManager();
-            if (mm != null) {
-                // TODO simplify this by not using the internal IStructuredDocument.
-                // Instead we can now use mm.getModelForRead(getFile()).
-                // However we must first check that SSE for Eclipse 3.3 or 3.4 has this
-                // method. IIRC 3.3 didn't have it.
-
-                return mm.getModelForRead(document);
-            }
-        }
-        return null;
-    }
-
-    /**
-     * Returns a version of the model that has been shared for edit.
-     * <p/>
-     * Callers <em>must</em> call model.releaseFromEdit() when done, typically
-     * in a try..finally clause.
-     * <p/>
-     * Because of this, it is mandatory to use the wrapper
-     * {@link #wrapEditXmlModel(Runnable)} which executes a runnable into a
-     * properly configured model and then performs whatever cleanup is necessary.
-     *
-     * @return The model for the XML document or null if cannot be obtained from the editor
-     */
-    private IStructuredModel getModelForEdit() {
-        IStructuredDocument document = getStructuredDocument();
-        if (document != null) {
-            IModelManager mm = StructuredModelManager.getModelManager();
-            if (mm != null) {
-                // TODO simplify this by not using the internal IStructuredDocument.
-                // Instead we can now use mm.getModelForRead(getFile()).
-                // However we must first check that SSE for Eclipse 3.3 or 3.4 has this
-                // method. IIRC 3.3 didn't have it.
-
-                return mm.getModelForEdit(document);
-            }
-        }
-        return null;
-    }
-
-    /**
-     * Helper class to perform edits on the XML model whilst making sure the
-     * model has been prepared to be changed.
-     * <p/>
-     * It first gets a model for edition using {@link #getModelForEdit()},
-     * then calls {@link IStructuredModel#aboutToChangeModel()},
-     * then performs the requested action
-     * and finally calls {@link IStructuredModel#changedModel()}
-     * and {@link IStructuredModel#releaseFromEdit()}.
-     * <p/>
-     * The method is synchronous. As soon as the {@link IStructuredModel#changedModel()} method
-     * is called, XML model listeners will be triggered.
-     * <p/>
-     * Calls can be nested: only the first outer call will actually start and close the edit
-     * session.
-     * <p/>
-     * This method is <em>not synchronized</em> and is not thread safe.
-     * Callers must be using it from the the main UI thread.
-     *
-     * @param editAction Something that will change the XML.
-     */
-    public final void wrapEditXmlModel(Runnable editAction) {
-        wrapEditXmlModel(editAction, null);
-    }
-
-    /**
-     * Perform any editor-specific hooks after applying an edit. When edits are
-     * nested, the hooks will only run after the final top level edit has been
-     * performed.
-     * <p>
-     * Note that the edit hooks are performed outside of the edit lock so
-     * the hooks should not perform edits on the model without acquiring
-     * a lock first.
-     */
-    public void runEditHooks() {
-        if (!mIgnoreXmlUpdate) {
-            // Check for errors, if enabled
-            if (AdtPrefs.getPrefs().isLintOnSave()) {
-                runLint();
-            }
-        }
-    }
-
-    /**
-     * Executor which performs the given action under an edit lock (and optionally as a
-     * single undo event).
-     *
-     * @param editAction the action to be executed
-     * @param undoLabel if non null, the edit action will be run as a single undo event
-     *            and the label used as the name of the undoable action
-     */
-    private final void wrapEditXmlModel(final Runnable editAction, final String undoLabel) {
-        Display display = mTextEditor.getSite().getShell().getDisplay();
-        if (display.getThread() != Thread.currentThread()) {
-            display.syncExec(new Runnable() {
-                @Override
-                public void run() {
-                    if (!mTextEditor.getTextViewer().getControl().isDisposed()) {
-                        wrapEditXmlModel(editAction, undoLabel);
-                    }
-                }
-            });
-            return;
-        }
-
-        IStructuredModel model = null;
-        int undoReverseCount = 0;
-        try {
-
-            if (mIsEditXmlModelPending == 0) {
-                try {
-                    model = getModelForEdit();
-                    if (undoLabel != null) {
-                        // Run this action as an undoable unit.
-                        // We have to do it more than once, because in some scenarios
-                        // Eclipse WTP decides to cancel the current undo command on its
-                        // own -- see http://code.google.com/p/android/issues/detail?id=15901
-                        // for one such call chain. By nesting these calls several times
-                        // we've incrementing the command count such that a couple of
-                        // cancellations are ignored. Interfering with this mechanism may
-                        // sound dangerous, but it appears that this undo-termination is
-                        // done for UI reasons to anticipate what the user wants, and we know
-                        // that in *our* scenarios we want the entire unit run as a single
-                        // unit. Here's what the documentation for
-                        // IStructuredTextUndoManager#forceEndOfPendingCommand says
-                        //   "Normally, the undo manager can figure out the best
-                        //    times when to end a pending command and begin a new
-                        //    one ... to the structure of a structured
-                        //    document. There are times, however, when clients may
-                        //    wish to override those algorithms and end one earlier
-                        //    than normal. The one known case is for multi-page
-                        //    editors. If a user is on one page, and type '123' as
-                        //    attribute value, then click around to other parts of
-                        //    page, or different pages, then return to '123|' and
-                        //    type 456, then "undo" they typically expect the undo
-                        //    to just undo what they just typed, the 456, not the
-                        //    whole attribute value."
-                        for (int i = 0; i < 4; i++) {
-                            model.beginRecording(this, undoLabel);
-                            undoReverseCount++;
-                        }
-                    }
-                    model.aboutToChangeModel();
-                } catch (Throwable t) {
-                    // This is never supposed to happen unless we suddenly don't have a model.
-                    // If it does, we don't want to even try to modify anyway.
-                    AdtPlugin.log(t, "XML Editor failed to get model to edit");  //$NON-NLS-1$
-                    return;
-                }
-            }
-            mIsEditXmlModelPending++;
-            editAction.run();
-        } finally {
-            mIsEditXmlModelPending--;
-            if (model != null) {
-                try {
-                    boolean oldIgnore = mIgnoreXmlUpdate;
-                    try {
-                        mIgnoreXmlUpdate = true;
-
-                        if (AdtPrefs.getPrefs().getFormatGuiXml() && mFormatNode != null) {
-                            if (mFormatNode == getUiRootNode()) {
-                                reformatDocument();
-                            } else {
-                                Node node = mFormatNode.getXmlNode();
-                                if (node instanceof IndexedRegion) {
-                                    IndexedRegion region = (IndexedRegion) node;
-                                    int begin = region.getStartOffset();
-                                    int end = region.getEndOffset();
-
-                                    if (!mFormatChildren) {
-                                        // This will format just the attribute list
-                                        end = begin + 1;
-                                    }
-
-                                    if (mFormatChildren
-                                         && node == node.getOwnerDocument().getDocumentElement()) {
-                                        reformatDocument();
-                                    } else {
-                                        reformatRegion(begin, end);
-                                    }
-                                }
-                            }
-                            mFormatNode = null;
-                            mFormatChildren = false;
-                        }
-
-                        // Notify the model we're done modifying it. This must *always* be executed.
-                        model.changedModel();
-
-                        // Clean up the undo unit. This is done more than once as explained
-                        // above for beginRecording.
-                        for (int i = 0; i < undoReverseCount; i++) {
-                            model.endRecording(this);
-                        }
-                    } finally {
-                        mIgnoreXmlUpdate = oldIgnore;
-                    }
-                } catch (Exception e) {
-                    AdtPlugin.log(e, "Failed to clean up undo unit");
-                }
-                model.releaseFromEdit();
-
-                if (mIsEditXmlModelPending < 0) {
-                    AdtPlugin.log(IStatus.ERROR,
-                            "wrapEditXmlModel finished with invalid nested counter==%1$d", //$NON-NLS-1$
-                            mIsEditXmlModelPending);
-                    mIsEditXmlModelPending = 0;
-                }
-
-                runEditHooks();
-
-                // Notify listeners
-                IStructuredModel readModel = getModelForRead();
-                if (readModel != null) {
-                    try {
-                        mXmlModelStateListener.modelChanged(readModel);
-                    } catch (Exception e) {
-                        AdtPlugin.log(e, "Error while notifying changes"); //$NON-NLS-1$
-                    } finally {
-                        readModel.releaseFromRead();
-                    }
-                }
-            }
-        }
-    }
-
-    /**
-     * Does this editor participate in the "format GUI editor changes" option?
-     *
-     * @return true if this editor supports automatically formatting XML
-     *         affected by GUI changes
-     */
-    public boolean supportsFormatOnGuiEdit() {
-        return false;
-    }
-
-    /**
-     * Mark the given node as needing to be formatted when the current edits are
-     * done, provided the user has turned that option on (see
-     * {@link AdtPrefs#getFormatGuiXml()}).
-     *
-     * @param node the node to be scheduled for formatting
-     * @param attributesOnly if true, only update the attributes list of the
-     *            node, otherwise update the node recursively (e.g. all children
-     *            too)
-     */
-    public void scheduleNodeReformat(UiElementNode node, boolean attributesOnly) {
-        if (!supportsFormatOnGuiEdit()) {
-            return;
-        }
-
-        if (node == mFormatNode) {
-            if (!attributesOnly) {
-                mFormatChildren = true;
-            }
-        } else if (mFormatNode == null) {
-            mFormatNode = node;
-            mFormatChildren = !attributesOnly;
-        } else {
-            if (mFormatNode.isAncestorOf(node)) {
-                mFormatChildren = true;
-            } else if (node.isAncestorOf(mFormatNode)) {
-                mFormatNode = node;
-                mFormatChildren = true;
-            } else {
-                // Two independent nodes; format their closest common ancestor.
-                // Later we could consider having a small number of independent nodes
-                // and formatting those, and only switching to formatting the common ancestor
-                // when the number of individual nodes gets large.
-                mFormatChildren = true;
-                mFormatNode = UiElementNode.getCommonAncestor(mFormatNode, node);
-            }
-        }
-    }
-
-    /**
-     * Creates an "undo recording" session by calling the undoableAction runnable
-     * under an undo session.
-     * <p/>
-     * This also automatically starts an edit XML session, as if
-     * {@link #wrapEditXmlModel(Runnable)} had been called.
-     * <p>
-     * You can nest several calls to {@link #wrapUndoEditXmlModel(String, Runnable)}, only one
-     * recording session will be created.
-     *
-     * @param label The label for the undo operation. Can be null. Ideally we should really try
-     *              to put something meaningful if possible.
-     * @param undoableAction the action to be run as a single undoable unit
-     */
-    public void wrapUndoEditXmlModel(String label, Runnable undoableAction) {
-        assert label != null : "All undoable actions should have a label";
-        wrapEditXmlModel(undoableAction, label == null ? "" : label); //$NON-NLS-1$
-    }
-
-    /**
-     * Returns true when the runnable of {@link #wrapEditXmlModel(Runnable)} is currently
-     * being executed. This means it is safe to actually edit the XML model.
-     *
-     * @return true if the XML model is already locked for edits
-     */
-    public boolean isEditXmlModelPending() {
-        return mIsEditXmlModelPending > 0;
-    }
-
-    /**
-     * Returns the XML {@link Document} or null if we can't get it
-     */
-    public final Document getXmlDocument(IStructuredModel model) {
-        if (model == null) {
-            AdtPlugin.log(IStatus.WARNING, "Android Editor: No XML model for root node."); //$NON-NLS-1$
-            return null;
-        }
-
-        if (model instanceof IDOMModel) {
-            IDOMModel dom_model = (IDOMModel) model;
-            return dom_model.getDocument();
-        }
-        return null;
-    }
-
-    /**
-     * Returns the {@link IProject} for the edited file.
-     */
-    @Nullable
-    public IProject getProject() {
-        IFile file = getInputFile();
-        if (file != null) {
-            return file.getProject();
-        }
-
-        return null;
-    }
-
-    /**
-     * Returns the {@link AndroidTargetData} for the edited file.
-     */
-    @Nullable
-    public AndroidTargetData getTargetData() {
-        IProject project = getProject();
-        if (project != null) {
-            Sdk currentSdk = Sdk.getCurrent();
-            if (currentSdk != null) {
-                IAndroidTarget target = currentSdk.getTarget(project);
-
-                if (target != null) {
-                    return currentSdk.getTargetData(target);
-                }
-            }
-        }
-
-        IEditorInput input = getEditorInput();
-        if (input instanceof IURIEditorInput) {
-            IURIEditorInput urlInput = (IURIEditorInput) input;
-            Sdk currentSdk = Sdk.getCurrent();
-            if (currentSdk != null) {
-                try {
-                    String path = AdtUtils.getFile(urlInput.getURI().toURL()).getPath();
-                    IAndroidTarget[] targets = currentSdk.getTargets();
-                    for (IAndroidTarget target : targets) {
-                        if (path.startsWith(target.getLocation())) {
-                            return currentSdk.getTargetData(target);
-                        }
-                    }
-                } catch (MalformedURLException e) {
-                    // File might be in some other weird random location we can't
-                    // handle: Just ignore these
-                }
-            }
-        }
-
-        return null;
-    }
-
-    /**
-     * Shows the editor range corresponding to the given XML node. This will
-     * front the editor and select the text range.
-     *
-     * @param xmlNode The DOM node to be shown. The DOM node should be an XML
-     *            node from the existing XML model used by the structured XML
-     *            editor; it will not do attribute matching to find a
-     *            "corresponding" element in the document from some foreign DOM
-     *            tree.
-     * @return True if the node was shown.
-     */
-    public boolean show(Node xmlNode) {
-        if (xmlNode instanceof IndexedRegion) {
-            IndexedRegion region = (IndexedRegion)xmlNode;
-
-            IEditorPart textPage = getEditor(mTextPageIndex);
-            if (textPage instanceof StructuredTextEditor) {
-                StructuredTextEditor editor = (StructuredTextEditor) textPage;
-
-                setActivePage(AndroidXmlEditor.TEXT_EDITOR_ID);
-
-                // Note - we cannot use region.getLength() because that seems to
-                // always return 0.
-                int regionLength = region.getEndOffset() - region.getStartOffset();
-                editor.selectAndReveal(region.getStartOffset(), regionLength);
-                return true;
-            }
-        }
-
-        return false;
-    }
-
-    /**
-     * Selects and reveals the given range in the text editor
-     *
-     * @param start the beginning offset
-     * @param length the length of the region to show
-     * @param frontTab if true, front the tab, otherwise just make the selection but don't
-     *     change the active tab
-     */
-    public void show(int start, int length, boolean frontTab) {
-        IEditorPart textPage = getEditor(mTextPageIndex);
-        if (textPage instanceof StructuredTextEditor) {
-            StructuredTextEditor editor = (StructuredTextEditor) textPage;
-            if (frontTab) {
-                setActivePage(AndroidXmlEditor.TEXT_EDITOR_ID);
-            }
-            editor.selectAndReveal(start, length);
-            if (frontTab) {
-                editor.setFocus();
-            }
-        }
-    }
-
-    /**
-     * Returns true if this editor has more than one page (usually a graphical view and an
-     * editor)
-     *
-     * @return true if this editor has multiple pages
-     */
-    public boolean hasMultiplePages() {
-        return getPageCount() > 1;
-    }
-
-    /**
-     * Get the XML text directly from the editor.
-     *
-     * @param xmlNode The node whose XML text we want to obtain.
-     * @return The XML representation of the {@link Node}, or null if there was an error.
-     */
-    public String getXmlText(Node xmlNode) {
-        String data = null;
-        IStructuredModel model = getModelForRead();
-        try {
-            IStructuredDocument document = getStructuredDocument();
-            if (xmlNode instanceof NodeContainer) {
-                // The easy way to get the source of an SSE XML node.
-                data = ((NodeContainer) xmlNode).getSource();
-            } else  if (xmlNode instanceof IndexedRegion && document != null) {
-                // Try harder.
-                IndexedRegion region = (IndexedRegion) xmlNode;
-                int start = region.getStartOffset();
-                int end = region.getEndOffset();
-
-                if (end > start) {
-                    data = document.get(start, end - start);
-                }
-            }
-        } catch (BadLocationException e) {
-            // the region offset was invalid. ignore.
-        } finally {
-            model.releaseFromRead();
-        }
-        return data;
-    }
-
-    /**
-     * Formats the text around the given caret range, using the current Eclipse
-     * XML formatter settings.
-     *
-     * @param begin The starting offset of the range to be reformatted.
-     * @param end The ending offset of the range to be reformatted.
-     */
-    public void reformatRegion(int begin, int end) {
-        ISourceViewer textViewer = getStructuredSourceViewer();
-
-        // Clamp text range to valid offsets.
-        IDocument document = textViewer.getDocument();
-        int documentLength = document.getLength();
-        end = Math.min(end, documentLength);
-        begin = Math.min(begin, end);
-
-        if (!AdtPrefs.getPrefs().getUseCustomXmlFormatter()) {
-            // Workarounds which only apply to the builtin Eclipse formatter:
-            //
-            // It turns out the XML formatter does *NOT* format things correctly if you
-            // select just a region of text. You *MUST* also include the leading whitespace
-            // on the line, or it will dedent all the content to column 0. Therefore,
-            // we must figure out the offset of the start of the line that contains the
-            // beginning of the tag.
-            try {
-                IRegion lineInformation = document.getLineInformationOfOffset(begin);
-                if (lineInformation != null) {
-                    int lineBegin = lineInformation.getOffset();
-                    if (lineBegin != begin) {
-                        begin = lineBegin;
-                    } else if (begin > 0) {
-                        // Trick #2: It turns out that, if an XML element starts in column 0,
-                        // then the XML formatter will NOT indent it (even if its parent is
-                        // indented). If you on the other hand include the end of the previous
-                        // line (the newline), THEN the formatter also correctly inserts the
-                        // element. Therefore, we adjust the beginning range to include the
-                        // previous line (if we are not already in column 0 of the first line)
-                        // in the case where the element starts the line.
-                        begin--;
-                    }
-                }
-            } catch (BadLocationException e) {
-                // This cannot happen because we already clamped the offsets
-                AdtPlugin.log(e, e.toString());
-            }
-        }
-
-        if (textViewer instanceof StructuredTextViewer) {
-            StructuredTextViewer structuredTextViewer = (StructuredTextViewer) textViewer;
-            int operation = ISourceViewer.FORMAT;
-            boolean canFormat = structuredTextViewer.canDoOperation(operation);
-            if (canFormat) {
-                StyledText textWidget = textViewer.getTextWidget();
-                textWidget.setSelection(begin, end);
-
-                boolean oldIgnore = mIgnoreXmlUpdate;
-                try {
-                    // Formatting does not affect the XML model so ignore notifications
-                    // about model edits from this
-                    mIgnoreXmlUpdate = true;
-                    structuredTextViewer.doOperation(operation);
-                } finally {
-                    mIgnoreXmlUpdate = oldIgnore;
-                }
-
-                textWidget.setSelection(0, 0);
-            }
-        }
-    }
-
-    /**
-     * Invokes content assist in this editor at the given offset
-     *
-     * @param offset the offset to invoke content assist at, or -1 to leave
-     *            caret alone
-     */
-    public void invokeContentAssist(int offset) {
-        ISourceViewer textViewer = getStructuredSourceViewer();
-        if (textViewer instanceof StructuredTextViewer) {
-            StructuredTextViewer structuredTextViewer = (StructuredTextViewer) textViewer;
-            int operation = ISourceViewer.CONTENTASSIST_PROPOSALS;
-            boolean allowed = structuredTextViewer.canDoOperation(operation);
-            if (allowed) {
-                if (offset != -1) {
-                    StyledText textWidget = textViewer.getTextWidget();
-                    // Clamp text range to valid offsets.
-                    IDocument document = textViewer.getDocument();
-                    int documentLength = document.getLength();
-                    offset = Math.max(0, Math.min(offset, documentLength));
-                    textWidget.setSelection(offset, offset);
-                }
-                structuredTextViewer.doOperation(operation);
-            }
-        }
-    }
-
-    /**
-     * Formats the XML region corresponding to the given node.
-     *
-     * @param node The node to be formatted.
-     */
-    public void reformatNode(Node node) {
-        if (mIsCreatingPage) {
-            return;
-        }
-
-        if (node instanceof IndexedRegion) {
-            IndexedRegion region = (IndexedRegion) node;
-            int begin = region.getStartOffset();
-            int end = region.getEndOffset();
-            reformatRegion(begin, end);
-        }
-    }
-
-    /**
-     * Formats the XML document according to the user's XML formatting settings.
-     */
-    public void reformatDocument() {
-        ISourceViewer textViewer = getStructuredSourceViewer();
-        if (textViewer instanceof StructuredTextViewer) {
-            StructuredTextViewer structuredTextViewer = (StructuredTextViewer) textViewer;
-            int operation = StructuredTextViewer.FORMAT_DOCUMENT;
-            boolean canFormat = structuredTextViewer.canDoOperation(operation);
-            if (canFormat) {
-                boolean oldIgnore = mIgnoreXmlUpdate;
-                try {
-                    // Formatting does not affect the XML model so ignore notifications
-                    // about model edits from this
-                    mIgnoreXmlUpdate = true;
-                    structuredTextViewer.doOperation(operation);
-                } finally {
-                    mIgnoreXmlUpdate = oldIgnore;
-                }
-            }
-        }
-    }
-
-    /**
-     * Returns the indentation String of the given node.
-     *
-     * @param xmlNode The node whose indentation we want.
-     * @return The indent-string of the given node, or "" if the indentation for some reason could
-     *         not be computed.
-     */
-    public String getIndent(Node xmlNode) {
-        return getIndent(getStructuredDocument(), xmlNode);
-    }
-
-    /**
-     * Returns the indentation String of the given node.
-     *
-     * @param document The Eclipse document containing the XML
-     * @param xmlNode The node whose indentation we want.
-     * @return The indent-string of the given node, or "" if the indentation for some reason could
-     *         not be computed.
-     */
-    public static String getIndent(IDocument document, Node xmlNode) {
-        if (xmlNode instanceof IndexedRegion) {
-            IndexedRegion region = (IndexedRegion)xmlNode;
-            int startOffset = region.getStartOffset();
-            return getIndentAtOffset(document, startOffset);
-        }
-
-        return ""; //$NON-NLS-1$
-    }
-
-    /**
-     * Returns the indentation String at the line containing the given offset
-     *
-     * @param document the document containing the offset
-     * @param offset The offset of a character on a line whose indentation we seek
-     * @return The indent-string of the given node, or "" if the indentation for some
-     *         reason could not be computed.
-     */
-    public static String getIndentAtOffset(IDocument document, int offset) {
-        try {
-            IRegion lineInformation = document.getLineInformationOfOffset(offset);
-            if (lineInformation != null) {
-                int lineBegin = lineInformation.getOffset();
-                if (lineBegin != offset) {
-                    String prefix = document.get(lineBegin, offset - lineBegin);
-
-                    // It's possible that the tag whose indentation we seek is not
-                    // at the beginning of the line. In that case we'll just return
-                    // the indentation of the line itself.
-                    for (int i = 0; i < prefix.length(); i++) {
-                        if (!Character.isWhitespace(prefix.charAt(i))) {
-                            return prefix.substring(0, i);
-                        }
-                    }
-
-                    return prefix;
-                }
-            }
-        } catch (BadLocationException e) {
-            AdtPlugin.log(e, "Could not obtain indentation"); //$NON-NLS-1$
-        }
-
-        return ""; //$NON-NLS-1$
-    }
-
-    /**
-     * Returns the active {@link AndroidXmlEditor}, provided it matches the given source
-     * viewer
-     *
-     * @param viewer the source viewer to ensure the active editor is associated with
-     * @return the active editor provided it matches the given source viewer or null.
-     */
-    public static AndroidXmlEditor fromTextViewer(ITextViewer viewer) {
-        IWorkbenchWindow wwin = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
-        if (wwin != null) {
-            // Try the active editor first.
-            IWorkbenchPage page = wwin.getActivePage();
-            if (page != null) {
-                IEditorPart editor = page.getActiveEditor();
-                if (editor instanceof AndroidXmlEditor) {
-                    ISourceViewer ssviewer =
-                        ((AndroidXmlEditor) editor).getStructuredSourceViewer();
-                    if (ssviewer == viewer) {
-                        return (AndroidXmlEditor) editor;
-                    }
-                }
-            }
-
-            // If that didn't work, try all the editors
-            for (IWorkbenchPage page2 : wwin.getPages()) {
-                if (page2 != null) {
-                    for (IEditorReference editorRef : page2.getEditorReferences()) {
-                        IEditorPart editor = editorRef.getEditor(false /*restore*/);
-                        if (editor instanceof AndroidXmlEditor) {
-                            ISourceViewer ssviewer =
-                                ((AndroidXmlEditor) editor).getStructuredSourceViewer();
-                            if (ssviewer == viewer) {
-                                return (AndroidXmlEditor) editor;
-                            }
-                        }
-                    }
-                }
-            }
-        }
-
-        return null;
-    }
-
-    /** Called when this editor is activated */
-    public void activated() {
-        if (getActivePage() == mTextPageIndex) {
-            updateActionBindings();
-        }
-    }
-
-    /** Called when this editor is deactivated */
-    public void deactivated() {
-    }
-
-    /**
-     * Listen to changes in the underlying XML model in the structured editor.
-     */
-    private class XmlModelStateListener implements IModelStateListener {
-
-        /**
-         * A model is about to be changed. This typically is initiated by one
-         * client of the model, to signal a large change and/or a change to the
-         * model's ID or base Location. A typical use might be if a client might
-         * want to suspend processing until all changes have been made.
-         * <p/>
-         * This AndroidXmlEditor implementation of IModelChangedListener is empty.
-         */
-        @Override
-        public void modelAboutToBeChanged(IStructuredModel model) {
-            // pass
-        }
-
-        /**
-         * Signals that the changes foretold by modelAboutToBeChanged have been
-         * made. A typical use might be to refresh, or to resume processing that
-         * was suspended as a result of modelAboutToBeChanged.
-         * <p/>
-         * This AndroidXmlEditor implementation calls the xmlModelChanged callback.
-         */
-        @Override
-        public void modelChanged(IStructuredModel model) {
-            if (mIgnoreXmlUpdate) {
-                return;
-            }
-            xmlModelChanged(getXmlDocument(model));
-        }
-
-        /**
-         * Notifies that a model's dirty state has changed, and passes that state
-         * in isDirty. A model becomes dirty when any change is made, and becomes
-         * not-dirty when the model is saved.
-         * <p/>
-         * This AndroidXmlEditor implementation of IModelChangedListener is empty.
-         */
-        @Override
-        public void modelDirtyStateChanged(IStructuredModel model, boolean isDirty) {
-            // pass
-        }
-
-        /**
-         * A modelDeleted means the underlying resource has been deleted. The
-         * model itself is not removed from model management until all have
-         * released it. Note: baseLocation is not (necessarily) changed in this
-         * event, but may not be accurate.
-         * <p/>
-         * This AndroidXmlEditor implementation of IModelChangedListener is empty.
-         */
-        @Override
-        public void modelResourceDeleted(IStructuredModel model) {
-            // pass
-        }
-
-        /**
-         * A model has been renamed or copied (as in saveAs..). In the renamed
-         * case, the two parameters are the same instance, and only contain the
-         * new info for id and base location.
-         * <p/>
-         * This AndroidXmlEditor implementation of IModelChangedListener is empty.
-         */
-        @Override
-        public void modelResourceMoved(IStructuredModel oldModel, IStructuredModel newModel) {
-            // pass
-        }
-
-        /**
-         * This AndroidXmlEditor implementation of IModelChangedListener is empty.
-         */
-        @Override
-        public void modelAboutToBeReinitialized(IStructuredModel structuredModel) {
-            // pass
-        }
-
-        /**
-         * This AndroidXmlEditor implementation of IModelChangedListener is empty.
-         */
-        @Override
-        public void modelReinitialized(IStructuredModel structuredModel) {
-            // pass
-        }
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/CompletionProposal.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/CompletionProposal.java
deleted file mode 100644
index 2d44677..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/CompletionProposal.java
+++ /dev/null
@@ -1,229 +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.ide.eclipse.adt.internal.editors;
-
-import static com.android.SdkConstants.XMLNS;
-
-import com.android.ide.common.api.IAttributeInfo;
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.ide.eclipse.adt.internal.editors.descriptors.AttributeDescriptor;
-import com.android.ide.eclipse.adt.internal.editors.descriptors.DescriptorsUtils;
-import com.android.ide.eclipse.adt.internal.editors.descriptors.ElementDescriptor;
-import com.android.ide.eclipse.adt.internal.editors.descriptors.IDescriptorProvider;
-import com.android.ide.eclipse.adt.internal.editors.descriptors.TextAttributeDescriptor;
-import com.android.ide.eclipse.adt.internal.editors.layout.gle2.DomUtilities;
-import com.android.ide.eclipse.adt.internal.sdk.AndroidTargetData;
-import com.android.utils.XmlUtils;
-
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.jdt.core.ISourceRange;
-import org.eclipse.jdt.core.IType;
-import org.eclipse.jdt.core.JavaModelException;
-import org.eclipse.jface.text.BadLocationException;
-import org.eclipse.jface.text.IDocument;
-import org.eclipse.jface.text.Position;
-import org.eclipse.jface.text.contentassist.ICompletionProposal;
-import org.eclipse.jface.text.contentassist.IContextInformation;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.graphics.Point;
-import org.w3c.dom.Attr;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-import org.w3c.dom.NamedNodeMap;
-
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-/**
- * Just like {@link org.eclipse.jface.text.contentassist.CompletionProposal},
- * but computes the documentation string lazily since they are typically only
- * displayed for a small subset (the currently focused item) of the available
- * proposals, and producing the strings requires some computation.
- * <p>
- * It also attempts to compute documentation for value strings like
- * ?android:attr/dividerHeight.
- * <p>
- * TODO: Enhance this to compute documentation for additional values, such as
- * the various enum values (which are available in the attrs.xml file, but not
- * in the AttributeInfo objects for each enum value). To do this, I should
- * basically keep around the maps computed by the attrs.xml parser.
- */
-class CompletionProposal implements ICompletionProposal {
-    private static final Pattern ATTRIBUTE_PATTERN =
-            Pattern.compile("[@?]android:attr/(.*)"); //$NON-NLS-1$
-
-    private final AndroidContentAssist mAssist;
-    private final Object mChoice;
-    private final int mCursorPosition;
-    private int mReplacementOffset;
-    private final int mReplacementLength;
-    private final String mReplacementString;
-    private final Image mImage;
-    private final String mDisplayString;
-    private final IContextInformation mContextInformation;
-    private final String mNsPrefix;
-    private final String mNsUri;
-    private String mAdditionalProposalInfo;
-
-    CompletionProposal(AndroidContentAssist assist,
-            Object choice, String replacementString, int replacementOffset,
-            int replacementLength, int cursorPosition, Image image, String displayString,
-            IContextInformation contextInformation, String additionalProposalInfo,
-            String nsPrefix, String nsUri) {
-        assert replacementString != null;
-        assert replacementOffset >= 0;
-        assert replacementLength >= 0;
-        assert cursorPosition >= 0;
-
-        mAssist = assist;
-        mChoice = choice;
-        mCursorPosition = cursorPosition;
-        mReplacementOffset = replacementOffset;
-        mReplacementLength = replacementLength;
-        mReplacementString = replacementString;
-        mImage = image;
-        mDisplayString = displayString;
-        mContextInformation = contextInformation;
-        mAdditionalProposalInfo = additionalProposalInfo;
-        mNsPrefix = nsPrefix;
-        mNsUri = nsUri;
-    }
-
-    @Override
-    public Point getSelection(IDocument document) {
-        return new Point(mReplacementOffset + mCursorPosition, 0);
-    }
-
-    @Override
-    public IContextInformation getContextInformation() {
-        return mContextInformation;
-    }
-
-    @Override
-    public Image getImage() {
-        return mImage;
-    }
-
-    @Override
-    public String getDisplayString() {
-        if (mDisplayString != null) {
-            return mDisplayString;
-        }
-        return mReplacementString;
-    }
-
-    @Override
-    public String getAdditionalProposalInfo() {
-        if (mAdditionalProposalInfo == null) {
-            if (mChoice instanceof ElementDescriptor) {
-                String tooltip = ((ElementDescriptor)mChoice).getTooltip();
-                mAdditionalProposalInfo = DescriptorsUtils.formatTooltip(tooltip);
-            } else if (mChoice instanceof TextAttributeDescriptor) {
-                mAdditionalProposalInfo = ((TextAttributeDescriptor) mChoice).getTooltip();
-            } else if (mChoice instanceof String) {
-                // Try to produce it lazily for strings like @android
-                String value = (String) mChoice;
-                Matcher matcher = ATTRIBUTE_PATTERN.matcher(value);
-                if (matcher.matches()) {
-                    String attrName = matcher.group(1);
-                    AndroidTargetData data = mAssist.getEditor().getTargetData();
-                    if (data != null) {
-                        IDescriptorProvider descriptorProvider =
-                            data.getDescriptorProvider(mAssist.getRootDescriptorId());
-                        if (descriptorProvider != null) {
-                            ElementDescriptor[] rootElementDescriptors =
-                                descriptorProvider.getRootElementDescriptors();
-                            for (ElementDescriptor elementDesc : rootElementDescriptors) {
-                                for (AttributeDescriptor desc : elementDesc.getAttributes()) {
-                                    String name = desc.getXmlLocalName();
-                                    if (attrName.equals(name)) {
-                                        IAttributeInfo attributeInfo = desc.getAttributeInfo();
-                                        if (attributeInfo != null) {
-                                            return attributeInfo.getJavaDoc();
-                                        }
-                                    }
-                                }
-                            }
-                        }
-                    }
-
-                }
-            } else if (mChoice instanceof IType) {
-                IType type = (IType) mChoice;
-                try {
-                    ISourceRange javadocRange = type.getJavadocRange();
-                    if (javadocRange != null && javadocRange.getLength() > 0) {
-                        ISourceRange sourceRange = type.getSourceRange();
-                        if (sourceRange != null) {
-                            String source = type.getSource();
-                            int start = javadocRange.getOffset() - sourceRange.getOffset();
-                            int length = javadocRange.getLength();
-                            String doc = source.substring(start, start + length);
-                            return doc;
-                        }
-                    }
-                    return type.getAttachedJavadoc(new NullProgressMonitor());
-                } catch (JavaModelException e) {
-                    AdtPlugin.log(e, null);
-                }
-            }
-        }
-
-        return mAdditionalProposalInfo;
-    }
-
-    @Override
-    public void apply(IDocument document) {
-        try {
-            Position position = new Position(mReplacementOffset);
-            document.addPosition(position);
-
-            // Ensure that the namespace is defined in the document
-            String prefix = mNsPrefix;
-            if (mNsUri != null && prefix != null) {
-                Document dom = DomUtilities.getDocument(mAssist.getEditor());
-                if (dom != null) {
-                    Element root = dom.getDocumentElement();
-                    if (root != null) {
-                        // Is the namespace already defined?
-                        boolean found = false;
-                        NamedNodeMap attributes = root.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) && mNsUri.equals(attribute.getValue())) {
-                                found = true;
-                                break;
-                            }
-                        }
-                        if (!found) {
-                            if (prefix.endsWith(":")) { //$NON-NLS-1$
-                                prefix = prefix.substring(0, prefix.length() - 1);
-                            }
-                            XmlUtils.lookupNamespacePrefix(root, mNsUri, prefix, true);
-                        }
-                    }
-                }
-            }
-
-            mReplacementOffset = position.getOffset();
-            document.removePosition(position);
-            document.replace(mReplacementOffset, mReplacementLength, mReplacementString);
-        } catch (BadLocationException x) {
-            // ignore
-        }
-    }
-}
\ No newline at end of file
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/Hyperlinks.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/Hyperlinks.java
deleted file mode 100644
index 95cec47..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/Hyperlinks.java
+++ /dev/null
@@ -1,1893 +0,0 @@
-/*
- * Copyright (C) 2010 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.editors;
-
-import static com.android.SdkConstants.ANDROID_PKG;
-import static com.android.SdkConstants.ANDROID_PREFIX;
-import static com.android.SdkConstants.ANDROID_STYLE_RESOURCE_PREFIX;
-import static com.android.SdkConstants.ANDROID_THEME_PREFIX;
-import static com.android.SdkConstants.ANDROID_URI;
-import static com.android.SdkConstants.ATTR_CLASS;
-import static com.android.SdkConstants.ATTR_CONTEXT;
-import static com.android.SdkConstants.ATTR_ID;
-import static com.android.SdkConstants.ATTR_NAME;
-import static com.android.SdkConstants.ATTR_ON_CLICK;
-import static com.android.SdkConstants.CLASS_ACTIVITY;
-import static com.android.SdkConstants.EXT_XML;
-import static com.android.SdkConstants.FD_DOCS;
-import static com.android.SdkConstants.FD_DOCS_REFERENCE;
-import static com.android.SdkConstants.FN_RESOURCE_BASE;
-import static com.android.SdkConstants.FN_RESOURCE_CLASS;
-import static com.android.SdkConstants.NEW_ID_PREFIX;
-import static com.android.SdkConstants.PREFIX_RESOURCE_REF;
-import static com.android.SdkConstants.PREFIX_THEME_REF;
-import static com.android.SdkConstants.STYLE_RESOURCE_PREFIX;
-import static com.android.SdkConstants.TAG_RESOURCES;
-import static com.android.SdkConstants.TAG_STYLE;
-import static com.android.SdkConstants.TOOLS_URI;
-import static com.android.SdkConstants.VIEW;
-import static com.android.SdkConstants.VIEW_FRAGMENT;
-import static com.android.xml.AndroidManifest.ATTRIBUTE_NAME;
-import static com.android.xml.AndroidManifest.ATTRIBUTE_PACKAGE;
-import static com.android.xml.AndroidManifest.NODE_ACTIVITY;
-import static com.android.xml.AndroidManifest.NODE_SERVICE;
-
-import com.android.SdkConstants;
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-import com.android.annotations.VisibleForTesting;
-import com.android.ide.common.resources.ResourceFile;
-import com.android.ide.common.resources.ResourceFolder;
-import com.android.ide.common.resources.ResourceRepository;
-import com.android.ide.common.resources.ResourceUrl;
-import com.android.ide.common.resources.configuration.FolderConfiguration;
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.ide.eclipse.adt.AdtUtils;
-import com.android.ide.eclipse.adt.internal.editors.layout.LayoutEditorDelegate;
-import com.android.ide.eclipse.adt.internal.editors.layout.gle2.GraphicalEditorPart;
-import com.android.ide.eclipse.adt.internal.editors.manifest.ManifestEditor;
-import com.android.ide.eclipse.adt.internal.editors.manifest.ManifestInfo;
-import com.android.ide.eclipse.adt.internal.project.BaseProjectHelper;
-import com.android.ide.eclipse.adt.internal.resources.ResourceHelper;
-import com.android.ide.eclipse.adt.internal.resources.manager.ProjectResources;
-import com.android.ide.eclipse.adt.internal.resources.manager.ResourceManager;
-import com.android.ide.eclipse.adt.internal.sdk.AndroidTargetData;
-import com.android.ide.eclipse.adt.internal.sdk.ProjectState;
-import com.android.ide.eclipse.adt.internal.sdk.Sdk;
-import com.android.ide.eclipse.adt.io.IFileWrapper;
-import com.android.ide.eclipse.adt.io.IFolderWrapper;
-import com.android.io.FileWrapper;
-import com.android.io.IAbstractFile;
-import com.android.io.IAbstractFolder;
-import com.android.resources.ResourceFolderType;
-import com.android.resources.ResourceType;
-import com.android.sdklib.IAndroidTarget;
-import com.android.utils.Pair;
-
-import org.apache.xerces.parsers.DOMParser;
-import org.apache.xerces.xni.Augmentations;
-import org.apache.xerces.xni.NamespaceContext;
-import org.apache.xerces.xni.QName;
-import org.apache.xerces.xni.XMLAttributes;
-import org.apache.xerces.xni.XMLLocator;
-import org.apache.xerces.xni.XNIException;
-import org.eclipse.core.filesystem.EFS;
-import org.eclipse.core.filesystem.IFileStore;
-import org.eclipse.core.resources.IContainer;
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IFolder;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.jdt.core.Flags;
-import org.eclipse.jdt.core.ICodeAssist;
-import org.eclipse.jdt.core.IJavaElement;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.IMethod;
-import org.eclipse.jdt.core.IType;
-import org.eclipse.jdt.core.JavaModelException;
-import org.eclipse.jdt.core.search.IJavaSearchConstants;
-import org.eclipse.jdt.core.search.IJavaSearchScope;
-import org.eclipse.jdt.core.search.SearchEngine;
-import org.eclipse.jdt.core.search.SearchMatch;
-import org.eclipse.jdt.core.search.SearchParticipant;
-import org.eclipse.jdt.core.search.SearchPattern;
-import org.eclipse.jdt.core.search.SearchRequestor;
-import org.eclipse.jdt.internal.ui.javaeditor.EditorUtility;
-import org.eclipse.jdt.internal.ui.javaeditor.JavaEditor;
-import org.eclipse.jdt.internal.ui.text.JavaWordFinder;
-import org.eclipse.jdt.ui.JavaUI;
-import org.eclipse.jdt.ui.actions.SelectionDispatchAction;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.action.IStatusLineManager;
-import org.eclipse.jface.text.BadLocationException;
-import org.eclipse.jface.text.IDocument;
-import org.eclipse.jface.text.IRegion;
-import org.eclipse.jface.text.ITextViewer;
-import org.eclipse.jface.text.Region;
-import org.eclipse.jface.text.hyperlink.AbstractHyperlinkDetector;
-import org.eclipse.jface.text.hyperlink.IHyperlink;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IEditorReference;
-import org.eclipse.ui.IEditorSite;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.ide.IDE;
-import org.eclipse.ui.part.FileEditorInput;
-import org.eclipse.ui.part.MultiPageEditorPart;
-import org.eclipse.ui.texteditor.ITextEditor;
-import org.eclipse.wst.sse.core.StructuredModelManager;
-import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
-import org.eclipse.wst.sse.core.internal.provisional.IndexedRegion;
-import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;
-import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocumentRegion;
-import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegion;
-import org.eclipse.wst.sse.ui.StructuredTextEditor;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
-import org.eclipse.wst.xml.core.internal.regions.DOMRegionContext;
-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 org.xml.sax.InputSource;
-import org.xml.sax.SAXException;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.List;
-import java.util.concurrent.atomic.AtomicBoolean;
-
-/**
- * Class containing hyperlink resolvers for XML and Java files to jump to associated
- * resources -- Java Activity and Service classes, XML layout and string declarations,
- * image drawables, etc.
- */
-@SuppressWarnings("restriction")
-public class Hyperlinks {
-    private static final String CATEGORY = "category";                            //$NON-NLS-1$
-    private static final String ACTION = "action";                                //$NON-NLS-1$
-    private static final String PERMISSION = "permission";                        //$NON-NLS-1$
-    private static final String USES_PERMISSION = "uses-permission";              //$NON-NLS-1$
-    private static final String CATEGORY_PKG_PREFIX = "android.intent.category."; //$NON-NLS-1$
-    private static final String ACTION_PKG_PREFIX = "android.intent.action.";     //$NON-NLS-1$
-    private static final String PERMISSION_PKG_PREFIX = "android.permission.";    //$NON-NLS-1$
-
-    private Hyperlinks() {
-        // Not instantiatable. This is a container class containing shared code
-        // for the various inner classes that are actual hyperlink resolvers.
-    }
-
-    /**
-     * Returns whether a string represents a valid fully qualified name for a view class.
-     * Does not check for existence.
-     */
-    @VisibleForTesting
-    static boolean isViewClassName(String name) {
-        int length = name.length();
-        if (length < 2 || name.indexOf('.') == -1) {
-            return false;
-        }
-
-        boolean lastWasDot = true;
-        for (int i = 0; i < length; i++) {
-            char c = name.charAt(i);
-            if (lastWasDot) {
-                if (!Character.isJavaIdentifierStart(c)) {
-                    return false;
-                }
-                lastWasDot = false;
-            } else {
-                if (c == '.') {
-                    lastWasDot = true;
-                } else if (!Character.isJavaIdentifierPart(c)) {
-                    return false;
-                }
-            }
-        }
-
-        return !lastWasDot;
-    }
-
-    /** Determines whether the given attribute <b>name</b> is linkable */
-    private static boolean isAttributeNameLink(XmlContext context) {
-        // We could potentially allow you to link to builtin Android properties:
-        //   ANDROID_URI.equals(attribute.getNamespaceURI())
-        // and then jump into the res/values/attrs.xml document that is available
-        // in the SDK data directory (path found via
-        // IAndroidTarget.getPath(IAndroidTarget.ATTRIBUTES)).
-        //
-        // For now, we're not doing that.
-        //
-        // We could also allow to jump into custom attributes in custom view
-        // classes. Not yet implemented.
-
-        return false;
-    }
-
-    /** Determines whether the given attribute <b>value</b> is linkable */
-    private static boolean isAttributeValueLink(XmlContext context) {
-        // Everything else here is attribute based
-        Attr attribute = context.getAttribute();
-        if (attribute == null) {
-            return false;
-        }
-
-        if (isClassAttribute(context) || isOnClickAttribute(context)
-                || isManifestName(context) || isStyleAttribute(context)) {
-            return true;
-        }
-
-        String value = attribute.getValue();
-        if (value.startsWith(NEW_ID_PREFIX)) {
-            // It's a value -declaration-, nowhere else to jump
-            // (though we could consider jumping to the R-file; would that
-            // be helpful?)
-            return !ATTR_ID.equals(attribute.getLocalName());
-        }
-
-        ResourceUrl resource = ResourceUrl.parse(value);
-        if (resource != null) {
-            return true;
-        }
-
-        return false;
-    }
-
-    /** Determines whether the given element <b>name</b> is linkable */
-    private static boolean isElementNameLink(XmlContext context) {
-        if (isClassElement(context)) {
-            return true;
-        }
-
-        return false;
-    }
-
-    /**
-     * Returns true if this node/attribute pair corresponds to a manifest reference to
-     * an activity.
-     */
-    private static boolean isActivity(XmlContext context) {
-        // Is this an <activity> or <service> in an AndroidManifest.xml file? If so, jump
-        // to it
-        Attr attribute = context.getAttribute();
-        String tagName = context.getElement().getTagName();
-        if (NODE_ACTIVITY.equals(tagName) && ATTRIBUTE_NAME.equals(attribute.getLocalName())
-                && ANDROID_URI.equals(attribute.getNamespaceURI())) {
-            return true;
-        }
-
-        return false;
-    }
-
-    /**
-     * Returns true if this node/attribute pair corresponds to a manifest android:name reference
-     */
-    private static boolean isManifestName(XmlContext context) {
-        Attr attribute = context.getAttribute();
-        if (attribute != null && ATTRIBUTE_NAME.equals(attribute.getLocalName())
-                && ANDROID_URI.equals(attribute.getNamespaceURI())) {
-            if (getEditor() instanceof ManifestEditor) {
-                return true;
-            }
-        }
-
-        return false;
-    }
-
-    /**
-     * Opens the declaration corresponding to an android:name reference in the
-     * AndroidManifest.xml file
-     */
-    private static boolean openManifestName(IProject project, XmlContext context) {
-        if (isActivity(context)) {
-            String fqcn = getActivityClassFqcn(context);
-            return AdtPlugin.openJavaClass(project, fqcn);
-        } else if (isService(context)) {
-            String fqcn = getServiceClassFqcn(context);
-            return AdtPlugin.openJavaClass(project, fqcn);
-        } else if (isBuiltinPermission(context)) {
-            String permission = context.getAttribute().getValue();
-            // Mutate something like android.permission.ACCESS_CHECKIN_PROPERTIES
-            // into relative doc url android/Manifest.permission.html#ACCESS_CHECKIN_PROPERTIES
-            assert permission.startsWith(PERMISSION_PKG_PREFIX);
-            String relative = "android/Manifest.permission.html#" //$NON-NLS-1$
-                    + permission.substring(PERMISSION_PKG_PREFIX.length());
-
-            URL url = getDocUrl(relative);
-            if (url != null) {
-                AdtPlugin.openUrl(url);
-                return true;
-            } else {
-                return false;
-            }
-        } else if (isBuiltinIntent(context)) {
-            String intent = context.getAttribute().getValue();
-            // Mutate something like android.intent.action.MAIN into
-            // into relative doc url android/content/Intent.html#ACTION_MAIN
-            String relative;
-            if (intent.startsWith(ACTION_PKG_PREFIX)) {
-                relative = "android/content/Intent.html#ACTION_" //$NON-NLS-1$
-                        + intent.substring(ACTION_PKG_PREFIX.length());
-            } else if (intent.startsWith(CATEGORY_PKG_PREFIX)) {
-                relative = "android/content/Intent.html#CATEGORY_" //$NON-NLS-1$
-                        + intent.substring(CATEGORY_PKG_PREFIX.length());
-            } else {
-                return false;
-            }
-            URL url = getDocUrl(relative);
-            if (url != null) {
-                AdtPlugin.openUrl(url);
-                return true;
-            } else {
-                return false;
-            }
-        }
-
-        return false;
-    }
-
-    /** Returns true if this represents a style attribute */
-    private static boolean isStyleAttribute(XmlContext context) {
-        String tag = context.getElement().getTagName();
-        return TAG_STYLE.equals(tag);
-    }
-
-    /**
-     * Returns true if this represents a {@code <view class="foo.bar.Baz">} class
-     * attribute, or a {@code <fragment android:name="foo.bar.Baz">} class attribute
-     */
-    private static boolean isClassAttribute(XmlContext context) {
-        Attr attribute = context.getAttribute();
-        if (attribute == null) {
-            return false;
-        }
-        String tag = context.getElement().getTagName();
-        String attributeName = attribute.getLocalName();
-        return ATTR_CLASS.equals(attributeName) && (VIEW.equals(tag) || VIEW_FRAGMENT.equals(tag))
-                || ATTR_NAME.equals(attributeName) && VIEW_FRAGMENT.equals(tag)
-                || (ATTR_CONTEXT.equals(attributeName)
-                        && TOOLS_URI.equals(attribute.getNamespaceURI()));
-    }
-
-    /** Returns true if this represents an onClick attribute specifying a method handler */
-    private static boolean isOnClickAttribute(XmlContext context) {
-        Attr attribute = context.getAttribute();
-        if (attribute == null) {
-            return false;
-        }
-        return ATTR_ON_CLICK.equals(attribute.getLocalName()) && attribute.getValue().length() > 0;
-    }
-
-    /** Returns true if this represents a {@code <foo.bar.Baz>} custom view class element */
-    private static boolean isClassElement(XmlContext context) {
-        if (context.getAttribute() != null) {
-            // Don't match the outer element if the user is hovering over a specific attribute
-            return false;
-        }
-        // If the element looks like a fully qualified class name (e.g. it's a custom view
-        // element) offer it as a link
-        String tag = context.getElement().getTagName();
-        return isViewClassName(tag);
-    }
-
-    /** Returns the FQCN for a class declaration at the given context */
-    private static String getClassFqcn(XmlContext context) {
-        if (isClassAttribute(context)) {
-            String value = context.getAttribute().getValue();
-            if (!value.isEmpty() && value.charAt(0) == '.') {
-                IProject project = getProject();
-                if (project != null) {
-                    ManifestInfo info = ManifestInfo.get(project);
-                    String pkg = info.getPackage();
-                    if (pkg != null) {
-                        value = pkg + value;
-                    }
-                }
-            }
-            return value;
-        } else if (isClassElement(context)) {
-            return context.getElement().getTagName();
-        }
-
-        return null;
-    }
-
-    /**
-     * Returns true if this node/attribute pair corresponds to a manifest reference to
-     * an service.
-     */
-    private static boolean isService(XmlContext context) {
-        Attr attribute = context.getAttribute();
-        Element node = context.getElement();
-
-        // Is this an <activity> or <service> in an AndroidManifest.xml file? If so, jump to it
-        String nodeName = node.getNodeName();
-        if (NODE_SERVICE.equals(nodeName) && ATTRIBUTE_NAME.equals(attribute.getLocalName())
-                && ANDROID_URI.equals(attribute.getNamespaceURI())) {
-            return true;
-        }
-
-        return false;
-    }
-
-    /**
-     * Returns a URL pointing to the Android reference documentation, either installed
-     * locally or the one on android.com
-     *
-     * @param relative a relative url to append to the root url
-     * @return a URL pointing to the documentation
-     */
-    private static URL getDocUrl(String relative) {
-        // First try to find locally installed documentation
-        File sdkLocation = new File(Sdk.getCurrent().getSdkOsLocation());
-        File docs = new File(sdkLocation, FD_DOCS + File.separator + FD_DOCS_REFERENCE);
-        try {
-            if (docs.exists()) {
-                String s = docs.toURI().toURL().toExternalForm();
-                if (!s.endsWith("/")) { //$NON-NLS-1$
-                    s += "/";           //$NON-NLS-1$
-                }
-                return new URL(s + relative);
-            }
-            // If not, fallback to the online documentation
-            return new URL("http://developer.android.com/reference/" + relative); //$NON-NLS-1$
-        } catch (MalformedURLException e) {
-            AdtPlugin.log(e, "Can't create URL for %1$s", docs);
-            return null;
-        }
-    }
-
-    /** Returns true if the context is pointing to a permission name reference */
-    private static boolean isBuiltinPermission(XmlContext context) {
-        Attr attribute = context.getAttribute();
-        Element node = context.getElement();
-
-        // Is this an <activity> or <service> in an AndroidManifest.xml file? If so, jump to it
-        String nodeName = node.getNodeName();
-        if ((USES_PERMISSION.equals(nodeName) || PERMISSION.equals(nodeName))
-                && ATTRIBUTE_NAME.equals(attribute.getLocalName())
-                && ANDROID_URI.equals(attribute.getNamespaceURI())) {
-            String value = attribute.getValue();
-            if (value.startsWith(PERMISSION_PKG_PREFIX)) {
-                return true;
-            }
-        }
-
-        return false;
-    }
-
-    /** Returns true if the context is pointing to an intent reference */
-    private static boolean isBuiltinIntent(XmlContext context) {
-        Attr attribute = context.getAttribute();
-        Element node = context.getElement();
-
-        // Is this an <activity> or <service> in an AndroidManifest.xml file? If so, jump to it
-        String nodeName = node.getNodeName();
-        if ((ACTION.equals(nodeName) || CATEGORY.equals(nodeName))
-                && ATTRIBUTE_NAME.equals(attribute.getLocalName())
-                && ANDROID_URI.equals(attribute.getNamespaceURI())) {
-            String value = attribute.getValue();
-            if (value.startsWith(ACTION_PKG_PREFIX) || value.startsWith(CATEGORY_PKG_PREFIX)) {
-                return true;
-            }
-        }
-
-        return false;
-    }
-
-
-    /**
-     * Returns the fully qualified class name of an activity referenced by the given
-     * AndroidManifest.xml node
-     */
-    private static String getActivityClassFqcn(XmlContext context) {
-        Attr attribute = context.getAttribute();
-        Element node = context.getElement();
-        StringBuilder sb = new StringBuilder();
-        Element root = node.getOwnerDocument().getDocumentElement();
-        String pkg = root.getAttribute(ATTRIBUTE_PACKAGE);
-        String className = attribute.getValue();
-        if (className.startsWith(".")) { //$NON-NLS-1$
-            sb.append(pkg);
-        } 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:
-            sb.append(pkg);
-            sb.append('.');
-        } // else: the class name is already a fully qualified class name
-        sb.append(className);
-        return sb.toString();
-    }
-
-    /**
-     * Returns the fully qualified class name of a service referenced by the given
-     * AndroidManifest.xml node
-     */
-    private static String getServiceClassFqcn(XmlContext context) {
-        // Same logic
-        return getActivityClassFqcn(context);
-    }
-
-    /**
-     * Returns the XML tag containing an element description for value items of the given
-     * resource type
-     *
-     * @param type the resource type to query the XML tag name for
-     * @return the tag name used for value declarations in XML of resources of the given
-     *         type
-     */
-    public static String getTagName(ResourceType type) {
-        if (type == ResourceType.ID) {
-            // Ids are recorded in <item> tags instead of <id> tags
-            return SdkConstants.TAG_ITEM;
-        }
-
-        return type.getName();
-    }
-
-    /**
-     * Computes the actual exact location to jump to for a given XML context.
-     *
-     * @param context the XML context to be opened
-     * @return true if the request was handled successfully
-     */
-    private static boolean open(XmlContext context) {
-        IProject project = getProject();
-        if (project == null) {
-            return false;
-        }
-
-        if (isManifestName(context)) {
-            return openManifestName(project, context);
-        } else if (isClassElement(context) || isClassAttribute(context)) {
-            return AdtPlugin.openJavaClass(project, getClassFqcn(context));
-        } else if (isOnClickAttribute(context)) {
-            return openOnClickMethod(project, context.getAttribute().getValue());
-        } else {
-            return false;
-        }
-    }
-
-    /** Opens a path (which may not be in the workspace) */
-    private static void openPath(IPath filePath, IRegion region, int offset) {
-        IEditorPart sourceEditor = getEditor();
-        IWorkbenchPage page = sourceEditor.getEditorSite().getPage();
-
-        IFile file = AdtUtils.pathToIFile(filePath);
-        if (file != null && file.exists()) {
-            try {
-                AdtPlugin.openFile(file, region);
-                return;
-            } catch (PartInitException ex) {
-                AdtPlugin.log(ex, "Can't open %$1s", filePath); //$NON-NLS-1$
-            }
-        } else {
-            // It's not a path in the workspace; look externally
-            // (this is probably an @android: path)
-            if (filePath.isAbsolute()) {
-                IFileStore fileStore = EFS.getLocalFileSystem().getStore(filePath);
-                if (!fileStore.fetchInfo().isDirectory() && fileStore.fetchInfo().exists()) {
-                    try {
-                        IEditorPart target = IDE.openEditorOnFileStore(page, fileStore);
-                        if (target instanceof MultiPageEditorPart) {
-                            MultiPageEditorPart part = (MultiPageEditorPart) target;
-                            IEditorPart[] editors = part.findEditors(target.getEditorInput());
-                            if (editors != null) {
-                                for (IEditorPart editor : editors) {
-                                    if (editor instanceof StructuredTextEditor) {
-                                        StructuredTextEditor ste = (StructuredTextEditor) editor;
-                                        part.setActiveEditor(editor);
-                                        ste.selectAndReveal(offset, 0);
-                                        break;
-                                    }
-                                }
-                            }
-                        }
-
-                        return;
-                    } catch (PartInitException ex) {
-                        AdtPlugin.log(ex, "Can't open %$1s", filePath); //$NON-NLS-1$
-                    }
-                }
-            }
-        }
-
-        // Failed: display message to the user
-        displayError(String.format("Could not find resource %1$s", filePath));
-    }
-
-    private static void displayError(String message) {
-        // Failed: display message to the user
-        IEditorSite editorSite = getEditor().getEditorSite();
-        IStatusLineManager status = editorSite.getActionBars().getStatusLineManager();
-        status.setErrorMessage(message);
-    }
-
-    /**
-     * Opens a Java method referenced by the given on click attribute method name
-     *
-     * @param project the project containing the click handler
-     * @param method the method name of the on click handler
-     * @return true if the method was opened, false otherwise
-     */
-    public static boolean openOnClickMethod(IProject project, String method) {
-        // Search for the method in the Java index, filtering by the required click handler
-        // method signature (public and has a single View parameter), and narrowing the scope
-        // first to Activity classes, then to the whole workspace.
-        final AtomicBoolean success = new AtomicBoolean(false);
-        SearchRequestor requestor = new SearchRequestor() {
-            @Override
-            public void acceptSearchMatch(SearchMatch match) throws CoreException {
-                Object element = match.getElement();
-                if (element instanceof IMethod) {
-                    IMethod methodElement = (IMethod) element;
-                    String[] parameterTypes = methodElement.getParameterTypes();
-                    if (parameterTypes != null
-                            && parameterTypes.length == 1
-                            && ("Qandroid.view.View;".equals(parameterTypes[0]) //$NON-NLS-1$
-                                    || "QView;".equals(parameterTypes[0]))) {   //$NON-NLS-1$
-                        // Check that it's public
-                        if (Flags.isPublic(methodElement.getFlags())) {
-                            JavaUI.openInEditor(methodElement);
-                            success.getAndSet(true);
-                        }
-                    }
-                }
-            }
-        };
-        try {
-            IJavaSearchScope scope = null;
-            IType activityType = null;
-            IJavaProject javaProject = BaseProjectHelper.getJavaProject(project);
-            if (javaProject != null) {
-                activityType = javaProject.findType(CLASS_ACTIVITY);
-                if (activityType != null) {
-                    scope = SearchEngine.createHierarchyScope(activityType);
-                }
-            }
-            if (scope == null) {
-                scope = SearchEngine.createWorkspaceScope();
-            }
-
-            SearchParticipant[] participants = new SearchParticipant[] {
-                SearchEngine.getDefaultSearchParticipant()
-            };
-            int matchRule = SearchPattern.R_PATTERN_MATCH | SearchPattern.R_CASE_SENSITIVE;
-            SearchPattern pattern = SearchPattern.createPattern("*." + method,
-                    IJavaSearchConstants.METHOD, IJavaSearchConstants.DECLARATIONS, matchRule);
-            SearchEngine engine = new SearchEngine();
-            engine.search(pattern, participants, scope, requestor, new NullProgressMonitor());
-
-            boolean ok = success.get();
-            if (!ok && activityType != null) {
-                // TODO: Create a project+dependencies scope and search only that scope
-
-                // Try searching again with a complete workspace scope this time
-                scope = SearchEngine.createWorkspaceScope();
-                engine.search(pattern, participants, scope, requestor, new NullProgressMonitor());
-
-                // TODO: There could be more than one match; add code to consider them all
-                // and pick the most likely candidate and open only that one.
-
-                ok = success.get();
-            }
-            return ok;
-        } catch (CoreException e) {
-            AdtPlugin.log(e, null);
-        }
-        return false;
-    }
-
-    /**
-     * Returns the current configuration, if the associated UI editor has been initialized
-     * and has an associated configuration
-     *
-     * @return the configuration for this file, or null
-     */
-    private static FolderConfiguration getConfiguration() {
-        IEditorPart editor = getEditor();
-        if (editor != null) {
-            LayoutEditorDelegate delegate = LayoutEditorDelegate.fromEditor(editor);
-            GraphicalEditorPart graphicalEditor =
-                delegate == null ? null : delegate.getGraphicalEditor();
-
-            if (graphicalEditor != null) {
-                return graphicalEditor.getConfiguration();
-            } else {
-                // TODO: Could try a few more things to get the configuration:
-                // (1) try to look at the file.getPersistentProperty(NAME_CONFIG_STATE)
-                //    which will return previously saved state. This isn't necessary today
-                //    since no editors seem to be lazily initialized.
-                // (2) attempt to use the configuration from any of the other open
-                //    files, especially files in the same directory as this one.
-            }
-
-            // Create a configuration from the current file
-            IProject project = null;
-            IEditorInput editorInput = editor.getEditorInput();
-            if (editorInput instanceof FileEditorInput) {
-                IFile file = ((FileEditorInput) editorInput).getFile();
-                project = file.getProject();
-                ProjectResources pr = ResourceManager.getInstance().getProjectResources(project);
-                IContainer parent = file.getParent();
-                if (parent instanceof IFolder) {
-                    ResourceFolder resFolder = pr.getResourceFolder((IFolder) parent);
-                    if (resFolder != null) {
-                        return resFolder.getConfiguration();
-                    }
-                }
-            }
-
-            // Might be editing a Java file, where there is no configuration context.
-            // Instead look at surrounding files in the workspace and obtain one valid
-            // configuration.
-            for (IEditorReference reference : editor.getSite().getPage().getEditorReferences()) {
-                IEditorPart part = reference.getEditor(false /*restore*/);
-
-                LayoutEditorDelegate refDelegate = LayoutEditorDelegate.fromEditor(part);
-                if (refDelegate != null) {
-                    IProject refProject = refDelegate.getEditor().getProject();
-                    if (project == null || project == refProject) {
-                        GraphicalEditorPart refGraphicalEditor = refDelegate.getGraphicalEditor();
-                        if (refGraphicalEditor != null) {
-                            return refGraphicalEditor.getConfiguration();
-                        }
-                    }
-                }
-            }
-        }
-
-        return null;
-    }
-
-    /** Returns the {@link IAndroidTarget} to be used for looking up system resources */
-    private static IAndroidTarget getTarget(IProject project) {
-        IEditorPart editor = getEditor();
-        LayoutEditorDelegate delegate = LayoutEditorDelegate.fromEditor(editor);
-        if (delegate != null) {
-            GraphicalEditorPart graphicalEditor = delegate.getGraphicalEditor();
-            if (graphicalEditor != null) {
-                return graphicalEditor.getRenderingTarget();
-            }
-        }
-
-        Sdk currentSdk = Sdk.getCurrent();
-        if (currentSdk == null) {
-            return null;
-        }
-
-        return currentSdk.getTarget(project);
-    }
-
-    /** Return either the project resources or the framework resources (or null) */
-    private static ResourceRepository getResources(IProject project, boolean framework) {
-        if (framework) {
-            IAndroidTarget target = getTarget(project);
-
-            if (target == null && project == null && framework) {
-                // No current project: probably jumped into some of the framework XML resource
-                // files and attempting to jump around. Attempt to figure out which target
-                // we're dealing with and continue looking within the same framework.
-                IEditorPart editor = getEditor();
-                Sdk sdk = Sdk.getCurrent();
-                if (sdk != null && editor instanceof AndroidXmlEditor) {
-                    AndroidTargetData data = ((AndroidXmlEditor) editor).getTargetData();
-                    if (data != null) {
-                        return data.getFrameworkResources();
-                    }
-                }
-            }
-
-            if (target == null) {
-                return null;
-            }
-            AndroidTargetData data = Sdk.getCurrent().getTargetData(target);
-            if (data == null) {
-                return null;
-            }
-            return data.getFrameworkResources();
-        } else {
-            return ResourceManager.getInstance().getProjectResources(project);
-        }
-    }
-
-    /**
-     * Finds a definition of an id attribute in layouts. (Ids can also be defined as
-     * resources; use {@link #findValueInXml} or {@link #findValueInDocument} to locate it there.)
-     */
-    private static Pair<IFile, IRegion> findIdDefinition(IProject project, String id) {
-        // FIRST look in the same file as the originating request, that's where you usually
-        // want to jump
-        IFile self = AdtUtils.getActiveFile();
-        if (self != null && EXT_XML.equals(self.getFileExtension())) {
-            Pair<IFile, IRegion> target = findIdInXml(id, self);
-            if (target != null) {
-                return target;
-            }
-        }
-
-        // Look in the configuration folder: Search compatible configurations
-        ResourceRepository resources = getResources(project, false /* isFramework */);
-        FolderConfiguration configuration = getConfiguration();
-        if (configuration != null) { // Not the case when searching from Java files for example
-            List<ResourceFolder> folders = resources.getFolders(ResourceFolderType.LAYOUT);
-            if (folders != null) {
-                for (ResourceFolder folder : folders) {
-                    if (folder.getConfiguration().isMatchFor(configuration)) {
-                        IAbstractFolder wrapper = folder.getFolder();
-                        if (wrapper instanceof IFolderWrapper) {
-                            IFolder iFolder = ((IFolderWrapper) wrapper).getIFolder();
-                            Pair<IFile, IRegion> target = findIdInFolder(iFolder, id);
-                            if (target != null) {
-                                return target;
-                            }
-                        }
-                    }
-                }
-                return null;
-            }
-        }
-
-        // Ugh. Search ALL layout files in the project!
-        List<ResourceFolder> folders = resources.getFolders(ResourceFolderType.LAYOUT);
-        if (folders != null) {
-            for (ResourceFolder folder : folders) {
-                IAbstractFolder wrapper = folder.getFolder();
-                if (wrapper instanceof IFolderWrapper) {
-                    IFolder iFolder = ((IFolderWrapper) wrapper).getIFolder();
-                    Pair<IFile, IRegion> target = findIdInFolder(iFolder, id);
-                    if (target != null) {
-                        return target;
-                    }
-                }
-            }
-        }
-
-        return null;
-    }
-
-    /**
-     * Finds a definition of an id attribute in a particular layout folder.
-     */
-    private static Pair<IFile, IRegion> findIdInFolder(IContainer f, String id) {
-        try {
-            // Check XML files in values/
-            for (IResource resource : f.members()) {
-                if (resource.exists() && !resource.isDerived() && resource instanceof IFile) {
-                    IFile file = (IFile) resource;
-                    // Must have an XML extension
-                    if (EXT_XML.equals(file.getFileExtension())) {
-                        Pair<IFile, IRegion> target = findIdInXml(id, file);
-                        if (target != null) {
-                            return target;
-                        }
-                    }
-                }
-            }
-        } catch (CoreException e) {
-            AdtPlugin.log(e, ""); //$NON-NLS-1$
-        }
-
-        return null;
-    }
-
-    /** Parses the given file and locates a definition of the given resource */
-    private static Pair<IFile, IRegion> findValueInXml(
-            ResourceType type, String name, IFile file) {
-        IStructuredModel model = null;
-        try {
-            model = StructuredModelManager.getModelManager().getExistingModelForRead(file);
-            if (model == null) {
-                // There is no open or cached model for the file; see if the file looks
-                // like it's interesting (content contains the String name we are looking for)
-                if (AdtPlugin.fileContains(file, name)) {
-                    // Yes, so parse content
-                    model = StructuredModelManager.getModelManager().getModelForRead(file);
-                }
-            }
-            if (model instanceof IDOMModel) {
-                IDOMModel domModel = (IDOMModel) model;
-                Document document = domModel.getDocument();
-                return findValueInDocument(type, name, file, document);
-            }
-        } catch (IOException e) {
-            AdtPlugin.log(e, "Can't parse %1$s", file); //$NON-NLS-1$
-        } catch (CoreException e) {
-            AdtPlugin.log(e, "Can't parse %1$s", file); //$NON-NLS-1$
-        } finally {
-            if (model != null) {
-                model.releaseFromRead();
-            }
-        }
-
-        return null;
-    }
-
-    /** Looks within an XML DOM document for the given resource name and returns it */
-    private static Pair<IFile, IRegion> findValueInDocument(
-            ResourceType type, String name, IFile file, Document document) {
-        String targetTag = getTagName(type);
-        Element root = document.getDocumentElement();
-        if (root.getTagName().equals(TAG_RESOURCES)) {
-            NodeList topLevel = root.getChildNodes();
-            Pair<IFile, IRegion> value = findValueInChildren(name, file, targetTag, topLevel);
-            if (value == null && type == ResourceType.ATTR) {
-                for (int i = 0, n = topLevel.getLength(); i < n; i++) {
-                    Node child = topLevel.item(i);
-                    if (child.getNodeType() == Node.ELEMENT_NODE) {
-                        Element element = (Element)child;
-                        String tagName = element.getTagName();
-                        if (tagName.equals("declare-styleable")) {
-                            NodeList children = element.getChildNodes();
-                            value = findValueInChildren(name, file, targetTag, children);
-                            if (value != null) {
-                                return value;
-                            }
-                        }
-                    }
-                }
-            }
-
-            return value;
-        }
-
-        return null;
-    }
-
-    private static Pair<IFile, IRegion> findValueInChildren(String name, IFile file,
-            String targetTag, NodeList children) {
-        for (int i = 0, n = children.getLength(); i < n; i++) {
-            Node child = children.item(i);
-            if (child.getNodeType() == Node.ELEMENT_NODE) {
-                Element element = (Element)child;
-                String tagName = element.getTagName();
-                if (tagName.equals(targetTag)) {
-                    String elementName = element.getAttribute(ATTR_NAME);
-                    if (elementName.equals(name)) {
-                        IRegion region = null;
-                        if (element instanceof IndexedRegion) {
-                            IndexedRegion r = (IndexedRegion) element;
-                            // IndexedRegion.getLength() returns bogus values
-                            int length = r.getEndOffset() - r.getStartOffset();
-                            region = new Region(r.getStartOffset(), length);
-                        }
-
-                        return Pair.of(file, region);
-                    }
-                }
-            }
-        }
-
-        return null;
-    }
-
-    /** Parses the given file and locates a definition of the given resource */
-    private static Pair<IFile, IRegion> findIdInXml(String id, IFile file) {
-        IStructuredModel model = null;
-        try {
-            model = StructuredModelManager.getModelManager().getExistingModelForRead(file);
-            if (model == null) {
-                // There is no open or cached model for the file; see if the file looks
-                // like it's interesting (content contains the String name we are looking for)
-                if (AdtPlugin.fileContains(file, id)) {
-                    // Yes, so parse content
-                    model = StructuredModelManager.getModelManager().getModelForRead(file);
-                }
-            }
-            if (model instanceof IDOMModel) {
-                IDOMModel domModel = (IDOMModel) model;
-                Document document = domModel.getDocument();
-                return findIdInDocument(id, file, document);
-            }
-        } catch (IOException e) {
-            AdtPlugin.log(e, "Can't parse %1$s", file); //$NON-NLS-1$
-        } catch (CoreException e) {
-            AdtPlugin.log(e, "Can't parse %1$s", file); //$NON-NLS-1$
-        } finally {
-            if (model != null) {
-                model.releaseFromRead();
-            }
-        }
-
-        return null;
-    }
-
-    /** Looks within an XML DOM document for the given resource name and returns it */
-    private static Pair<IFile, IRegion> findIdInDocument(String id, IFile file,
-            Document document) {
-        String targetAttribute = NEW_ID_PREFIX + id;
-        Element root = document.getDocumentElement();
-        Pair<IFile, IRegion> result = findIdInElement(root, file, targetAttribute,
-                true /*requireId*/);
-        if (result == null) {
-            result = findIdInElement(root, file, targetAttribute, false /*requireId*/);
-        }
-        return result;
-    }
-
-    private static Pair<IFile, IRegion> findIdInElement(
-            Element root, IFile file, String targetAttribute, boolean requireIdAttribute) {
-        NamedNodeMap attributes = root.getAttributes();
-        for (int i = 0, n = attributes.getLength(); i < n; i++) {
-            Node item = attributes.item(i);
-            if (item instanceof Attr) {
-                Attr attribute = (Attr) item;
-                if (requireIdAttribute && !ATTR_ID.equals(attribute.getLocalName())) {
-                    continue;
-                }
-                String value = attribute.getValue();
-                if (value.equals(targetAttribute)) {
-                    // Select the element -containing- the id rather than the attribute itself
-                    IRegion region = null;
-                    Node element = attribute.getOwnerElement();
-                    //if (attribute instanceof IndexedRegion) {
-                    if (element instanceof IndexedRegion) {
-                        IndexedRegion r = (IndexedRegion) element;
-                        int length = r.getEndOffset() - r.getStartOffset();
-                        region = new Region(r.getStartOffset(), length);
-                    }
-
-                    return Pair.of(file, region);
-                }
-            }
-        }
-
-        NodeList children = root.getChildNodes();
-        for (int i = 0, n = children.getLength(); i < n; i++) {
-            Node child = children.item(i);
-            if (child.getNodeType() == Node.ELEMENT_NODE) {
-                Element element = (Element)child;
-                Pair<IFile, IRegion> result = findIdInElement(element, file, targetAttribute,
-                        requireIdAttribute);
-                if (result != null) {
-                    return result;
-                }
-            }
-        }
-
-        return null;
-    }
-
-    /** Parses the given file and locates a definition of the given resource */
-    private static Pair<File, Integer> findValueInXml(ResourceType type, String name, File file) {
-        // We can't use the StructureModelManager on files outside projects
-        // There is no open or cached model for the file; see if the file looks
-        // like it's interesting (content contains the String name we are looking for)
-        if (AdtPlugin.fileContains(file, name)) {
-            try {
-                InputSource is = new InputSource(new FileInputStream(file));
-                OffsetTrackingParser parser = new OffsetTrackingParser();
-                parser.parse(is);
-                Document document = parser.getDocument();
-
-                return findValueInDocument(type, name, file, parser, document);
-            } catch (SAXException e) {
-                // pass -- ignore files we can't parse
-            } catch (IOException e) {
-                // pass -- ignore files we can't parse
-            }
-        }
-
-        return null;
-    }
-
-    /** Looks within an XML DOM document for the given resource name and returns it */
-    private static Pair<File, Integer> findValueInDocument(ResourceType type, String name,
-            File file, OffsetTrackingParser parser, Document document) {
-        String targetTag = type.getName();
-        if (type == ResourceType.ID) {
-            // Ids are recorded in <item> tags instead of <id> tags
-            targetTag = "item"; //$NON-NLS-1$
-        }
-
-        Pair<File, Integer> result = findTag(name, file, parser, document, targetTag);
-        if (result == null && type == ResourceType.ATTR) {
-            // Attributes seem to be defined in <public> tags
-            targetTag = "public"; //$NON-NLS-1$
-            result = findTag(name, file, parser, document, targetTag);
-        }
-        return result;
-    }
-
-    private static Pair<File, Integer> findTag(String name, File file, OffsetTrackingParser parser,
-            Document document, String targetTag) {
-        NodeList children = document.getElementsByTagName(targetTag);
-        for (int i = 0, n = children.getLength(); i < n; i++) {
-            Node child = children.item(i);
-            if (child.getNodeType() == Node.ELEMENT_NODE) {
-                Element element = (Element) child;
-                if (element.getTagName().equals(targetTag)) {
-                    String elementName = element.getAttribute(ATTR_NAME);
-                    if (elementName.equals(name)) {
-                        return Pair.of(file, parser.getOffset(element));
-                    }
-                }
-            }
-        }
-
-        return null;
-    }
-
-    private static IHyperlink[] getStyleLinks(XmlContext context, IRegion range, String url) {
-        Attr attribute = context.getAttribute();
-        if (attribute != null) {
-            // Split up theme resource urls to the nearest dot forwards, such that you
-            // can point to "Theme.Light" by placing the caret anywhere after the dot,
-            // and point to just "Theme" by pointing before it.
-            int caret = context.getInnerRegionCaretOffset();
-            String value = attribute.getValue();
-            int index = value.indexOf('.', caret);
-            if (index != -1) {
-                url = url.substring(0, index);
-                range = new Region(range.getOffset(),
-                        range.getLength() - (value.length() - index));
-            }
-        }
-
-        ResourceUrl resource = ResourceUrl.parse(url);
-        if (resource == null) {
-            String androidStyle = ANDROID_STYLE_RESOURCE_PREFIX;
-            if (url.startsWith(ANDROID_PREFIX)) {
-                url = androidStyle + url.substring(ANDROID_PREFIX.length());
-            } else if (url.startsWith(ANDROID_THEME_PREFIX)) {
-                url = androidStyle + url.substring(ANDROID_THEME_PREFIX.length());
-            } else if (url.startsWith(ANDROID_PKG + ':')) {
-                url = androidStyle + url.substring(ANDROID_PKG.length() + 1);
-            } else {
-                url = STYLE_RESOURCE_PREFIX + url;
-            }
-        }
-        return getResourceLinks(range, url);
-    }
-
-    private static IHyperlink[] getResourceLinks(@Nullable IRegion range, @NonNull String url) {
-        IProject project = Hyperlinks.getProject();
-        FolderConfiguration configuration = getConfiguration();
-        return getResourceLinks(range, url, project, configuration);
-    }
-
-    /**
-     * Computes hyperlinks to resource definitions for resource urls (e.g.
-     * {@code @android:string/ok} or {@code @layout/foo}. May create multiple links.
-     * @param range TBD
-     * @param url the resource url
-     * @param project the relevant project
-     * @param configuration the applicable configuration
-     * @return an array of hyperlinks, or null
-     */
-    @Nullable
-    public static IHyperlink[] getResourceLinks(@Nullable IRegion range, @NonNull String url,
-            @Nullable IProject project,  @Nullable FolderConfiguration configuration) {
-        List<IHyperlink> links = new ArrayList<IHyperlink>();
-
-        ResourceUrl resource = ResourceUrl.parse(url);
-        if (resource == null) {
-            return null;
-        }
-        ResourceType type = resource.type;
-        String name = resource.name;
-        boolean isFramework = resource.framework;
-        if (project == null) {
-            // Local reference *within* a framework
-            isFramework = true;
-        }
-
-        ResourceRepository resources = getResources(project, isFramework);
-        if (resources == null) {
-            return null;
-        }
-        List<ResourceFile> sourceFiles = resources.getSourceFiles(type, name,
-                null /*configuration*/);
-        if (sourceFiles == null) {
-            ProjectState projectState = Sdk.getProjectState(project);
-            if (projectState != null) {
-                List<IProject> libraries = projectState.getFullLibraryProjects();
-                if (libraries != null && !libraries.isEmpty()) {
-                    for (IProject library : libraries) {
-                        resources = ResourceManager.getInstance().getProjectResources(library);
-                        sourceFiles = resources.getSourceFiles(type, name, null /*configuration*/);
-                        if (sourceFiles != null && !sourceFiles.isEmpty()) {
-                            break;
-                        }
-                    }
-                }
-            }
-        }
-
-        ResourceFile best = null;
-        if (configuration != null && sourceFiles != null && sourceFiles.size() > 0) {
-            List<ResourceFile> bestFiles = resources.getSourceFiles(type, name, configuration);
-            if (bestFiles != null && bestFiles.size() > 0) {
-                best = bestFiles.get(0);
-            }
-        }
-        if (sourceFiles != null) {
-            List<ResourceFile> matches = new ArrayList<ResourceFile>();
-            for (ResourceFile resourceFile : sourceFiles) {
-                matches.add(resourceFile);
-            }
-
-            if (matches.size() > 0) {
-                final ResourceFile fBest = best;
-                Collections.sort(matches, new Comparator<ResourceFile>() {
-                    @Override
-                    public int compare(ResourceFile rf1, ResourceFile rf2) {
-                        // Sort best item to the front
-                        if (rf1 == fBest) {
-                            return -1;
-                        } else if (rf2 == fBest) {
-                            return 1;
-                        } else {
-                            return getFileName(rf1).compareTo(getFileName(rf2));
-                        }
-                    }
-                });
-
-                // Is this something found in a values/ folder?
-                boolean valueResource = ResourceHelper.isValueBasedResourceType(type);
-
-                for (ResourceFile file : matches) {
-                    String folderName = file.getFolder().getFolder().getName();
-                    String label = String.format("Open Declaration in %1$s/%2$s",
-                            folderName, getFileName(file));
-
-                    // Only search for resource type within the file if it's an
-                    // XML file and it is a value resource
-                    ResourceLink link = new ResourceLink(label, range, file,
-                            valueResource ? type : null, name);
-                    links.add(link);
-                }
-            }
-        }
-
-        // Id's are handled specially because they are typically defined
-        // inline (though they -can- be defined in the values folder above as
-        // well, in which case we will prefer that definition)
-        if (!isFramework && type == ResourceType.ID && links.size() == 0) {
-            // Must compute these lazily...
-            links.add(new ResourceLink("Open XML Declaration", range, null, type, name));
-        }
-
-        if (links.size() > 0) {
-            return links.toArray(new IHyperlink[links.size()]);
-        } else {
-            return null;
-        }
-    }
-
-    private static String getFileName(ResourceFile file) {
-        return file.getFile().getName();
-    }
-
-    /** Detector for finding Android references in XML files */
-   public static class XmlResolver extends AbstractHyperlinkDetector {
-
-        @Override
-        public IHyperlink[] detectHyperlinks(ITextViewer textViewer, IRegion region,
-                boolean canShowMultipleHyperlinks) {
-
-            if (region == null || textViewer == null) {
-                return null;
-            }
-
-            IDocument document = textViewer.getDocument();
-
-            XmlContext context = XmlContext.find(document, region.getOffset());
-            if (context == null) {
-                return null;
-            }
-
-            IRegion range = context.getInnerRange(document);
-            boolean isLinkable = false;
-            String type = context.getInnerRegion().getType();
-            if (type == DOMRegionContext.XML_TAG_ATTRIBUTE_VALUE) {
-                if (isAttributeValueLink(context)) {
-                    isLinkable = true;
-                    // Strip out quotes
-                    range = new Region(range.getOffset() + 1, range.getLength() - 2);
-
-                    Attr attribute = context.getAttribute();
-                    if (isStyleAttribute(context)) {
-                        return getStyleLinks(context, range, attribute.getValue());
-                    }
-                    if (attribute != null
-                            && (attribute.getValue().startsWith(PREFIX_RESOURCE_REF)
-                                    || attribute.getValue().startsWith(PREFIX_THEME_REF))) {
-                        // Instantly create links for resources since we can use the existing
-                        // resolved maps for this and offer multiple choices for the user
-                        String url = attribute.getValue();
-                        return getResourceLinks(range, url);
-                    }
-                }
-            } else if (type == DOMRegionContext.XML_TAG_ATTRIBUTE_NAME) {
-                if (isAttributeNameLink(context)) {
-                    isLinkable = true;
-                }
-            } else if (type == DOMRegionContext.XML_TAG_NAME) {
-                if (isElementNameLink(context)) {
-                    isLinkable = true;
-                }
-            } else if (type == DOMRegionContext.XML_CONTENT) {
-                Node parentNode = context.getNode().getParentNode();
-                if (parentNode != null && parentNode.getNodeType() == Node.ELEMENT_NODE) {
-                    // Try to complete resources defined inline as text, such as
-                    // style definitions
-                    ITextRegion outer = context.getElementRegion();
-                    ITextRegion inner = context.getInnerRegion();
-                    int innerOffset = outer.getStart() + inner.getStart();
-                    int caretOffset = innerOffset + context.getInnerRegionCaretOffset();
-                    try {
-                        IRegion lineInfo = document.getLineInformationOfOffset(caretOffset);
-                        int lineStart = lineInfo.getOffset();
-                        int lineEnd = Math.min(lineStart + lineInfo.getLength(),
-                                innerOffset + inner.getLength());
-
-                        // Compute the resource URL
-                        int urlStart = -1;
-                        int offset = caretOffset;
-                        while (offset > lineStart) {
-                            char c = document.getChar(offset);
-                            if (c == '@' || c == '?') {
-                                urlStart = offset;
-                                break;
-                            } else if (!isValidResourceUrlChar(c)) {
-                                break;
-                            }
-                            offset--;
-                        }
-
-                        if (urlStart != -1) {
-                            offset = caretOffset;
-                            while (offset < lineEnd) {
-                                if (!isValidResourceUrlChar(document.getChar(offset))) {
-                                    break;
-                                }
-                                offset++;
-                            }
-
-                            int length = offset - urlStart;
-                            String url = document.get(urlStart, length);
-                            range = new Region(urlStart, length);
-                            return getResourceLinks(range, url);
-                        }
-                    } catch (BadLocationException e) {
-                        AdtPlugin.log(e, null);
-                    }
-                }
-            }
-
-            if (isLinkable) {
-                IHyperlink hyperlink = new DeferredResolutionLink(context, range);
-                if (hyperlink != null) {
-                    return new IHyperlink[] {
-                        hyperlink
-                    };
-                }
-            }
-
-            return null;
-        }
-    }
-
-    private static boolean isValidResourceUrlChar(char c) {
-        return Character.isJavaIdentifierPart(c) || c == ':' || c == '/' || c == '.' || c == '+';
-
-    }
-
-    /** Detector for finding Android references in Java files */
-    public static class JavaResolver extends AbstractHyperlinkDetector {
-
-        @Override
-        public IHyperlink[] detectHyperlinks(ITextViewer textViewer, IRegion region,
-                boolean canShowMultipleHyperlinks) {
-            // Most of this is identical to the builtin JavaElementHyperlinkDetector --
-            // everything down to the Android R filtering below
-
-            ITextEditor textEditor = (ITextEditor) getAdapter(ITextEditor.class);
-            if (region == null || !(textEditor instanceof JavaEditor))
-                return null;
-
-            IAction openAction = textEditor.getAction("OpenEditor"); //$NON-NLS-1$
-            if (!(openAction instanceof SelectionDispatchAction))
-                return null;
-
-            int offset = region.getOffset();
-
-            IJavaElement input = EditorUtility.getEditorInputJavaElement(textEditor, false);
-            if (input == null)
-                return null;
-
-            try {
-                IDocument document = textEditor.getDocumentProvider().getDocument(
-                        textEditor.getEditorInput());
-                IRegion wordRegion = JavaWordFinder.findWord(document, offset);
-                if (wordRegion == null || wordRegion.getLength() == 0)
-                    return null;
-
-                IJavaElement[] elements = null;
-                elements = ((ICodeAssist) input).codeSelect(wordRegion.getOffset(), wordRegion
-                        .getLength());
-
-                // Specific Android R class filtering:
-                if (elements.length > 0) {
-                    IJavaElement element = elements[0];
-                    if (element.getElementType() == IJavaElement.FIELD) {
-                        IJavaElement unit = element.getAncestor(IJavaElement.COMPILATION_UNIT);
-                        if (unit == null) {
-                            // Probably in a binary; see if this is an android.R resource
-                            IJavaElement type = element.getAncestor(IJavaElement.TYPE);
-                            if (type != null && type.getParent() != null) {
-                                IJavaElement parentType = type.getParent();
-                                if (parentType.getElementType() == IJavaElement.CLASS_FILE) {
-                                    String pn = parentType.getElementName();
-                                    String prefix = FN_RESOURCE_BASE + "$"; //$NON-NLS-1$
-                                    if (pn.startsWith(prefix)) {
-                                        return createTypeLink(element, type, wordRegion, true);
-                                    }
-                                }
-                            }
-                        } else if (FN_RESOURCE_CLASS.equals(unit.getElementName())) {
-                            // Yes, we're referencing the project R class.
-                            // Offer hyperlink navigation to XML resource files for
-                            // the various definitions
-                            IJavaElement type = element.getAncestor(IJavaElement.TYPE);
-                            if (type != null) {
-                                return createTypeLink(element, type, wordRegion, false);
-                            }
-                        }
-                    }
-
-                }
-                return null;
-            } catch (JavaModelException e) {
-                return null;
-            }
-        }
-
-        private IHyperlink[] createTypeLink(IJavaElement element, IJavaElement type,
-                IRegion wordRegion, boolean isFrameworkResource) {
-            String typeName = type.getElementName();
-            // typeName will be "id", "layout", "string", etc
-            if (isFrameworkResource) {
-                typeName = ANDROID_PKG + ':' + typeName;
-            }
-            String elementName = element.getElementName();
-            String url = '@' + typeName + '/' + elementName;
-            return getResourceLinks(wordRegion, url);
-        }
-    }
-
-    /** Returns the editor applicable to this hyperlink detection */
-    private static IEditorPart getEditor() {
-        // I would like to be able to find this via getAdapter(TextEditor.class) but
-        // couldn't find a way to initialize the editor context from
-        // AndroidSourceViewerConfig#getHyperlinkDetectorTargets (which only has
-        // a TextViewer, not a TextEditor, instance).
-        //
-        // Therefore, for now, use a hack. This hack is reasonable because hyperlink
-        // resolvers are only run for the front-most visible window in the active
-        // workbench.
-        return AdtUtils.getActiveEditor();
-    }
-
-    /** Returns the project applicable to this hyperlink detection */
-    @Nullable
-    private static IProject getProject() {
-        IFile file = AdtUtils.getActiveFile();
-        if (file != null) {
-            return file.getProject();
-        }
-
-        return null;
-    }
-
-    /**
-     * Hyperlink implementation which delays computing the actual file and offset target
-     * until it is asked to open the hyperlink
-     */
-    private static class DeferredResolutionLink implements IHyperlink {
-        private XmlContext mXmlContext;
-        private IRegion mRegion;
-
-        public DeferredResolutionLink(XmlContext xmlContext, IRegion mRegion) {
-            super();
-            this.mXmlContext = xmlContext;
-            this.mRegion = mRegion;
-        }
-
-        @Override
-        public IRegion getHyperlinkRegion() {
-            return mRegion;
-        }
-
-        @Override
-        public String getHyperlinkText() {
-            return "Open XML Declaration";
-        }
-
-        @Override
-        public String getTypeLabel() {
-            return null;
-        }
-
-        @Override
-        public void open() {
-            // Lazily compute the location to open
-            if (mXmlContext != null && !Hyperlinks.open(mXmlContext)) {
-                // Failed: display message to the user
-                displayError("Could not open link");
-            }
-        }
-    }
-
-    /**
-     * Hyperlink implementation which provides a link for a resource; the actual file name
-     * is known, but the value location within XML files is deferred until the link is
-     * actually opened.
-     */
-    static class ResourceLink implements IHyperlink {
-        private final String mLinkText;
-        private final IRegion mLinkRegion;
-        private final ResourceType mType;
-        private final String mName;
-        private final ResourceFile mFile;
-
-        /**
-         * Constructs a new {@link ResourceLink}.
-         *
-         * @param linkText the description of the link to be shown in a popup when there
-         *            is more than one match
-         * @param linkRegion the region corresponding to the link source highlight
-         * @param file the target resource file containing the link definition
-         * @param type the type of resource being linked to
-         * @param name the name of the resource being linked to
-         */
-        public ResourceLink(String linkText, IRegion linkRegion, ResourceFile file,
-                ResourceType type, String name) {
-            super();
-            mLinkText = linkText;
-            mLinkRegion = linkRegion;
-            mType = type;
-            mName = name;
-            mFile = file;
-        }
-
-        @Override
-        public IRegion getHyperlinkRegion() {
-            return mLinkRegion;
-        }
-
-        @Override
-        public String getHyperlinkText() {
-            // return "Open XML Declaration";
-            return mLinkText;
-        }
-
-        @Override
-        public String getTypeLabel() {
-            return null;
-        }
-
-        @Override
-        public void open() {
-            // We have to defer computation of ids until the link is clicked since we
-            // don't have a fast map lookup for these
-            if (mFile == null && mType == ResourceType.ID) {
-                // Id's are handled specially because they are typically defined
-                // inline (though they -can- be defined in the values folder above as well,
-                // in which case we will prefer that definition)
-                IProject project = getProject();
-                Pair<IFile,IRegion> def = findIdDefinition(project, mName);
-                if (def != null) {
-                    try {
-                        AdtPlugin.openFile(def.getFirst(), def.getSecond());
-                    } catch (PartInitException e) {
-                        AdtPlugin.log(e, null);
-                    }
-                    return;
-                }
-
-                displayError(String.format("Could not find id %1$s", mName));
-                return;
-            }
-
-            IAbstractFile wrappedFile = mFile != null ? mFile.getFile() : null;
-            if (wrappedFile instanceof IFileWrapper) {
-                IFile file = ((IFileWrapper) wrappedFile).getIFile();
-                try {
-                    // Lazily search for the target?
-                    IRegion region = null;
-                    String extension = file.getFileExtension();
-                    if (mType != null && mName != null && EXT_XML.equals(extension)) {
-                        Pair<IFile, IRegion> target;
-                        if (mType == ResourceType.ID) {
-                            target = findIdInXml(mName, file);
-                        } else {
-                            target = findValueInXml(mType, mName, file);
-                        }
-                        if (target != null) {
-                            region = target.getSecond();
-                        }
-                    }
-                    AdtPlugin.openFile(file, region);
-                } catch (PartInitException e) {
-                    AdtPlugin.log(e, null);
-                }
-            } else if (wrappedFile instanceof FileWrapper) {
-                File file = ((FileWrapper) wrappedFile);
-                IPath path = new Path(file.getAbsolutePath());
-                int offset = 0;
-                // Lazily search for the target?
-                if (mType != null && mName != null && EXT_XML.equals(path.getFileExtension())) {
-                    if (file.exists()) {
-                        Pair<File, Integer> target = findValueInXml(mType, mName, file);
-                        if (target != null && target.getSecond() != null) {
-                            offset = target.getSecond();
-                        }
-                    }
-                }
-                openPath(path, null, offset);
-            } else {
-                throw new IllegalArgumentException("Invalid link parameters");
-            }
-        }
-
-        ResourceFile getFile() {
-            return mFile;
-        }
-    }
-
-    /**
-     * XML context containing node, potentially attribute, and text regions surrounding a
-     * particular caret offset
-     */
-    private static class XmlContext {
-        private final Node mNode;
-        private final Element mElement;
-        private final Attr mAttribute;
-        private final IStructuredDocumentRegion mOuterRegion;
-        private final ITextRegion mInnerRegion;
-        private final int mInnerRegionOffset;
-
-        public XmlContext(Node node, Element element, Attr attribute,
-                IStructuredDocumentRegion outerRegion,
-                ITextRegion innerRegion, int innerRegionOffset) {
-            super();
-            mNode = node;
-            mElement = element;
-            mAttribute = attribute;
-            mOuterRegion = outerRegion;
-            mInnerRegion = innerRegion;
-            mInnerRegionOffset = innerRegionOffset;
-        }
-
-        /**
-         * Gets the current node, never null
-         *
-         * @return the surrounding node
-         */
-        public Node getNode() {
-            return mNode;
-        }
-
-
-        /**
-         * Gets the current node, may be null
-         *
-         * @return the surrounding node
-         */
-        public Element getElement() {
-            return mElement;
-        }
-
-        /**
-         * Returns the current attribute, or null if we are not over an attribute
-         *
-         * @return the attribute, or null
-         */
-        public Attr getAttribute() {
-            return mAttribute;
-        }
-
-        /**
-         * Gets the region of the element
-         *
-         * @return the region of the surrounding element, never null
-         */
-        public ITextRegion getElementRegion() {
-            return mOuterRegion;
-        }
-
-        /**
-         * Gets the inner region, which can be the tag name, an attribute name, an
-         * attribute value, or some other portion of an XML element
-         * @return the inner region, never null
-         */
-        public ITextRegion getInnerRegion() {
-            return mInnerRegion;
-        }
-
-        /**
-         * Gets the caret offset relative to the inner region
-         *
-         * @return the offset relative to the inner region
-         */
-        public int getInnerRegionCaretOffset() {
-            return mInnerRegionOffset;
-        }
-
-        /**
-         * Returns a range with suffix whitespace stripped out
-         *
-         * @param document the document containing the regions
-         * @return the range of the inner region, minus any whitespace at the end
-         */
-        public IRegion getInnerRange(IDocument document) {
-            int start = mOuterRegion.getStart() + mInnerRegion.getStart();
-            int length = mInnerRegion.getLength();
-            try {
-                String s = document.get(start, length);
-                for (int i = s.length() - 1; i >= 0; i--) {
-                    if (Character.isWhitespace(s.charAt(i))) {
-                        length--;
-                    }
-                }
-            } catch (BadLocationException e) {
-                AdtPlugin.log(e, ""); //$NON-NLS-1$
-            }
-            return new Region(start, length);
-        }
-
-        /**
-         * Returns the node the cursor is currently on in the document. null if no node is
-         * selected
-         */
-        private static XmlContext find(IDocument document, int offset) {
-            // Loosely based on getCurrentNode and getCurrentAttr in the WST's
-            // XMLHyperlinkDetector.
-            IndexedRegion inode = null;
-            IStructuredModel model = null;
-            try {
-                model = StructuredModelManager.getModelManager().getExistingModelForRead(document);
-                if (model != null) {
-                    inode = model.getIndexedRegion(offset);
-                    if (inode == null) {
-                        inode = model.getIndexedRegion(offset - 1);
-                    }
-
-                    if (inode instanceof Element) {
-                        Element element = (Element) inode;
-                        Attr attribute = null;
-                        if (element.hasAttributes()) {
-                            NamedNodeMap attrs = element.getAttributes();
-                            // go through each attribute in node and if attribute contains
-                            // offset, return that attribute
-                            for (int i = 0; i < attrs.getLength(); ++i) {
-                                // assumption that if parent node is of type IndexedRegion,
-                                // then its attributes will also be of type IndexedRegion
-                                IndexedRegion attRegion = (IndexedRegion) attrs.item(i);
-                                if (attRegion.contains(offset)) {
-                                    attribute = (Attr) attrs.item(i);
-                                    break;
-                                }
-                            }
-                        }
-
-                        IStructuredDocument doc = model.getStructuredDocument();
-                        IStructuredDocumentRegion region = doc.getRegionAtCharacterOffset(offset);
-                        if (region != null
-                                && DOMRegionContext.XML_TAG_NAME.equals(region.getType())) {
-                            ITextRegion subRegion = region.getRegionAtCharacterOffset(offset);
-                            if (subRegion == null) {
-                                return null;
-                            }
-                            int regionStart = region.getStartOffset();
-                            int subregionStart = subRegion.getStart();
-                            int relativeOffset = offset - (regionStart + subregionStart);
-                            return new XmlContext(element, element, attribute, region, subRegion,
-                                    relativeOffset);
-                        }
-                    } else if (inode instanceof Node) {
-                        IStructuredDocument doc = model.getStructuredDocument();
-                        IStructuredDocumentRegion region = doc.getRegionAtCharacterOffset(offset);
-                        if (region != null
-                                && DOMRegionContext.XML_CONTENT.equals(region.getType())) {
-                            ITextRegion subRegion = region.getRegionAtCharacterOffset(offset);
-                            int regionStart = region.getStartOffset();
-                            int subregionStart = subRegion.getStart();
-                            int relativeOffset = offset - (regionStart + subregionStart);
-                            return new XmlContext((Node) inode, null, null, region, subRegion,
-                                    relativeOffset);
-                        }
-
-                    }
-                }
-            } finally {
-                if (model != null) {
-                    model.releaseFromRead();
-                }
-            }
-
-            return null;
-        }
-    }
-
-    /**
-     * DOM parser which records offsets in the element nodes such that it can return
-     * offsets for elements later
-     */
-    private static final class OffsetTrackingParser extends DOMParser {
-
-        private static final String KEY_OFFSET = "offset"; //$NON-NLS-1$
-
-        private static final String KEY_NODE =
-            "http://apache.org/xml/properties/dom/current-element-node"; //$NON-NLS-1$
-
-        private XMLLocator mLocator;
-
-        public OffsetTrackingParser() throws SAXException {
-            this.setFeature("http://apache.org/xml/features/dom/defer-node-expansion",//$NON-NLS-1$
-                    false);
-        }
-
-        public int getOffset(Node node) {
-            Integer offset = (Integer) node.getUserData(KEY_OFFSET);
-            if (offset != null) {
-                return offset;
-            }
-
-            return -1;
-        }
-
-        @Override
-        public void startElement(QName elementQName, XMLAttributes attrList, Augmentations augs)
-                throws XNIException {
-            int offset = mLocator.getCharacterOffset();
-            super.startElement(elementQName, attrList, augs);
-
-            try {
-                Node node = (Node) this.getProperty(KEY_NODE);
-                if (node != null) {
-                    node.setUserData(KEY_OFFSET, offset, null);
-                }
-            } catch (org.xml.sax.SAXException ex) {
-                AdtPlugin.log(ex, ""); //$NON-NLS-1$
-            }
-        }
-
-        @Override
-        public void startDocument(XMLLocator locator, String encoding,
-                NamespaceContext namespaceContext, Augmentations augs) throws XNIException {
-            super.startDocument(locator, encoding, namespaceContext, augs);
-            mLocator = locator;
-        }
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/IPageImageProvider.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/IPageImageProvider.java
deleted file mode 100755
index 7cd80ec..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/IPageImageProvider.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Copyright (C) 2010 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.editors;
-
-import org.eclipse.swt.graphics.Image;
-
-/**
- * Interface that editor pages can implement to provide an icon
- * for the page tab in the XML editor.
- */
-public interface IPageImageProvider {
-
-    /**
-     * Returns an {@link Image} that the editor will display in the page's tab.
-     *
-     * @return An {@link Image} for the editor tab for this page. Null for no image.
-     */
-    Image getPageImage();
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/IconFactory.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/IconFactory.java
deleted file mode 100644
index 41807f8..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/IconFactory.java
+++ /dev/null
@@ -1,448 +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.eclipse.adt.internal.editors;
-
-import com.android.SdkConstants;
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.ide.eclipse.adt.internal.editors.ui.ErrorImageComposite;
-import com.google.common.collect.Maps;
-
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.FontData;
-import org.eclipse.swt.graphics.GC;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.graphics.ImageData;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.graphics.RGB;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.ui.plugin.AbstractUIPlugin;
-
-import java.net.URL;
-import java.util.IdentityHashMap;
-import java.util.Map;
-
-/**
- * Factory to generate icons for Android Editors.
- * <p/>
- * Icons are kept here and reused.
- */
-public class IconFactory {
-    public static final int COLOR_RED     = SWT.COLOR_DARK_RED;
-    public static final int COLOR_GREEN   = SWT.COLOR_DARK_GREEN;
-    public static final int COLOR_BLUE    = SWT.COLOR_DARK_BLUE;
-    public static final int COLOR_DEFAULT = SWT.COLOR_BLACK;
-
-    public static final int SHAPE_CIRCLE  = 'C';
-    public static final int SHAPE_RECT    = 'R';
-    public static final int SHAPE_DEFAULT = SHAPE_CIRCLE;
-
-    private static IconFactory sInstance;
-
-    private Map<String, Image> mIconMap = Maps.newHashMap();
-    private Map<URL, Image> mUrlMap = Maps.newHashMap();
-    private Map<String, ImageDescriptor> mImageDescMap = Maps.newHashMap();
-    private Map<Image, Image> mErrorIcons;
-    private Map<Image, Image> mWarningIcons;
-
-    private IconFactory() {
-    }
-
-    public static synchronized IconFactory getInstance() {
-        if (sInstance == null) {
-            sInstance = new IconFactory();
-        }
-        return sInstance;
-    }
-
-    public void dispose() {
-        // Dispose icons
-        for (Image icon : mIconMap.values()) {
-            // The map can contain null values
-            if (icon != null) {
-                icon.dispose();
-            }
-        }
-        mIconMap.clear();
-        for (Image icon : mUrlMap.values()) {
-            // The map can contain null values
-            if (icon != null) {
-                icon.dispose();
-            }
-        }
-        mUrlMap.clear();
-        if (mErrorIcons != null) {
-            for (Image icon : mErrorIcons.values()) {
-                // The map can contain null values
-                if (icon != null) {
-                    icon.dispose();
-                }
-            }
-            mErrorIcons = null;
-        }
-        if (mWarningIcons != null) {
-            for (Image icon : mWarningIcons.values()) {
-                // The map can contain null values
-                if (icon != null) {
-                    icon.dispose();
-                }
-            }
-            mWarningIcons = null;
-        }
-    }
-
-    /**
-     * Returns an Image for a given icon name.
-     * <p/>
-     * Callers should not dispose it.
-     *
-     * @param osName The leaf name, without the extension, of an existing icon in the
-     *        editor's "icons" directory. If it doesn't exists, a default icon will be
-     *        generated automatically based on the name.
-     */
-    public Image getIcon(String osName) {
-        return getIcon(osName, COLOR_DEFAULT, SHAPE_DEFAULT);
-    }
-
-    /**
-     * Returns an Image for a given icon name.
-     * <p/>
-     * Callers should not dispose it.
-     *
-     * @param osName The leaf name, without the extension, of an existing icon in the
-     *        editor's "icons" directory. If it doesn't exist, a default icon will be
-     *        generated automatically based on the name.
-     * @param color The color of the text in the automatically generated icons,
-     *        one of COLOR_DEFAULT, COLOR_RED, COLOR_BLUE or COLOR_RED.
-     * @param shape The shape of the icon in the automatically generated icons,
-     *        one of SHAPE_DEFAULT, SHAPE_CIRCLE or SHAPE_RECT.
-     */
-    public Image getIcon(String osName, int color, int shape) {
-        String key = Character.toString((char) shape) + Integer.toString(color) + osName;
-        Image icon = mIconMap.get(key);
-        if (icon == null && !mIconMap.containsKey(key)) {
-            ImageDescriptor id = getImageDescriptor(osName, color, shape);
-            if (id != null) {
-                icon = id.createImage();
-            }
-            // Note that we store null references in the icon map, to avoid looking them
-            // up every time. If it didn't exist once, it will not exist later.
-            mIconMap.put(key, icon);
-        }
-        return icon;
-    }
-
-    /**
-     * Returns an ImageDescriptor for a given icon name.
-     * <p/>
-     * Callers should not dispose it.
-     *
-     * @param osName The leaf name, without the extension, of an existing icon in the
-     *        editor's "icons" directory. If it doesn't exists, a default icon will be
-     *        generated automatically based on the name.
-     */
-    public ImageDescriptor getImageDescriptor(String osName) {
-        return getImageDescriptor(osName, COLOR_DEFAULT, SHAPE_DEFAULT);
-    }
-
-    /**
-     * Returns an ImageDescriptor for a given icon name.
-     * <p/>
-     * Callers should not dispose it.
-     *
-     * @param osName The leaf name, without the extension, of an existing icon in the
-     *        editor's "icons" directory. If it doesn't exists, a default icon will be
-     *        generated automatically based on the name.
-     * @param color The color of the text in the automatically generated icons.
-     *        one of COLOR_DEFAULT, COLOR_RED, COLOR_BLUE or COLOR_RED.
-     * @param shape The shape of the icon in the automatically generated icons,
-     *        one of SHAPE_DEFAULT, SHAPE_CIRCLE or SHAPE_RECT.
-     */
-    public ImageDescriptor getImageDescriptor(String osName, int color, int shape) {
-        String key = Character.toString((char) shape) + Integer.toString(color) + osName;
-        ImageDescriptor id = mImageDescMap.get(key);
-        if (id == null && !mImageDescMap.containsKey(key)) {
-            id = AbstractUIPlugin.imageDescriptorFromPlugin(
-                    AdtPlugin.PLUGIN_ID,
-                    String.format("/icons/%1$s.png", osName)); //$NON-NLS-1$
-
-            if (id == null) {
-                id = new LetterImageDescriptor(osName.charAt(0), color, shape);
-            }
-
-            // Note that we store null references in the icon map, to avoid looking them
-            // up every time. If it didn't exist once, it will not exist later.
-            mImageDescMap.put(key, id);
-        }
-        return id;
-    }
-
-    /**
-     * Returns an Image for a given icon name.
-     * <p/>
-     * Callers should not dispose it.
-     *
-     * @param osName The leaf name, without the extension, of an existing icon
-     *            in the editor's "icons" directory. If it doesn't exist, the
-     *            fallback will be used instead.
-     * @param fallback the fallback icon name to use if the primary icon does
-     *            not exist, or null if the method should return null if the
-     *            image does not exist
-     * @return the icon, which should not be disposed by the caller, or null
-     * if the image does not exist *and*
-     */
-    @Nullable
-    public Image getIcon(@NonNull String osName, @Nullable String fallback) {
-        String key = osName;
-        Image icon = mIconMap.get(key);
-        if (icon == null && !mIconMap.containsKey(key)) {
-            ImageDescriptor id = getImageDescriptor(osName, fallback);
-            if (id != null) {
-                icon = id.createImage();
-            }
-            // Note that we store null references in the icon map, to avoid looking them
-            // up every time. If it didn't exist once, it will not exist later.
-            mIconMap.put(key, icon);
-        }
-        return icon;
-    }
-
-    /**
-     * Returns an icon of the given name, or if that image does not exist and
-     * icon of the given fallback name.
-     *
-     * @param key the icon name
-     * @param fallbackKey the fallback image to use if the primary key does not
-     *            exist
-     * @return the image descriptor, or null if the image does not exist and the
-     *         fallbackKey is null
-     */
-    @Nullable
-    public ImageDescriptor getImageDescriptor(@NonNull String key, @Nullable String fallbackKey) {
-        ImageDescriptor id = mImageDescMap.get(key);
-        if (id == null && !mImageDescMap.containsKey(key)) {
-            id = AbstractUIPlugin.imageDescriptorFromPlugin(
-                    AdtPlugin.PLUGIN_ID,
-                    String.format("/icons/%1$s.png", key)); //$NON-NLS-1$
-            if (id == null) {
-                if (fallbackKey == null) {
-                    return null;
-                }
-                id = getImageDescriptor(fallbackKey);
-            }
-
-            // Place the fallback image for this key as well such that we don't keep trying
-            // to load the failed image
-            mImageDescMap.put(key, id);
-        }
-
-        return id;
-    }
-
-    /**
-     * Returns the image indicated by the given URL
-     *
-     * @param url the url to the image resources
-     * @return the image for the url, or null if it cannot be initialized
-     */
-    public Image getIcon(URL url) {
-        Image image = mUrlMap.get(url);
-        if (image == null) {
-            ImageDescriptor descriptor = ImageDescriptor.createFromURL(url);
-            image = descriptor.createImage();
-            mUrlMap.put(url, image);
-        }
-
-        return image;
-    }
-
-    /**
-     * Returns an image with an error icon overlaid on it. The icons are cached,
-     * so the base image should be cached as well, or this method will keep
-     * storing new overlays into its cache.
-     *
-     * @param image the base image
-     * @return the combined image
-     */
-    @NonNull
-    public Image addErrorIcon(@NonNull Image image) {
-        if (mErrorIcons != null) {
-            Image combined = mErrorIcons.get(image);
-            if (combined != null) {
-                return combined;
-            }
-        } else {
-            mErrorIcons = new IdentityHashMap<Image, Image>();
-        }
-
-        Image combined = new ErrorImageComposite(image, false).createImage();
-        mErrorIcons.put(image, combined);
-
-        return combined;
-    }
-
-    /**
-     * Returns an image with a warning icon overlaid on it. The icons are
-     * cached, so the base image should be cached as well, or this method will
-     * keep storing new overlays into its cache.
-     *
-     * @param image the base image
-     * @return the combined image
-     */
-    @NonNull
-    public Image addWarningIcon(@NonNull Image image) {
-        if (mWarningIcons != null) {
-            Image combined = mWarningIcons.get(image);
-            if (combined != null) {
-                return combined;
-            }
-        } else {
-            mWarningIcons = new IdentityHashMap<Image, Image>();
-        }
-
-        Image combined = new ErrorImageComposite(image, true).createImage();
-        mWarningIcons.put(image, combined);
-
-        return combined;
-    }
-
-    /**
-     * A simple image description that generates a 16x16 image which consists
-     * of a colored letter inside a black & white circle.
-     */
-    private static class LetterImageDescriptor extends ImageDescriptor {
-
-        private final char mLetter;
-        private final int mColor;
-        private final int mShape;
-
-        public LetterImageDescriptor(char letter, int color, int shape) {
-            mLetter = Character.toUpperCase(letter);
-            mColor = color;
-            mShape = shape;
-        }
-
-        @Override
-        public ImageData getImageData() {
-
-            final int SX = 15;
-            final int SY = 15;
-            final int RX = 4;
-            final int RY = 4;
-
-            Display display = Display.getCurrent();
-            if (display == null) {
-                return null;
-            }
-
-            Image image = new Image(display, SX, SY);
-
-            GC gc = new GC(image);
-            gc.setAdvanced(true);
-            gc.setAntialias(SWT.ON);
-            gc.setTextAntialias(SWT.ON);
-
-            // image.setBackground() does not appear to have any effect; we must explicitly
-            // paint into the image the background color we want masked out later.
-            // HOWEVER, alpha transparency does not work; we only get to mark a single color
-            // as transparent. You might think we could pick a system color (to avoid having
-            // to allocate and dispose the color), or a wildly unique color (to make sure we
-            // don't accidentally pick up any extra pixels in the image as transparent), but
-            // this has the very unfortunate side effect of making neighbor pixels in the
-            // antialiased rendering of the circle pick up shades of that alternate color,
-            // which looks bad. Therefore we pick a color which is similar to one of our
-            // existing colors but hopefully different from most pixels. A visual check
-            // confirms that this seems to work pretty well:
-            RGB backgroundRgb = new RGB(254, 254, 254);
-            Color backgroundColor = new Color(display, backgroundRgb);
-            gc.setBackground(backgroundColor);
-            gc.fillRectangle(0, 0, SX, SY);
-
-            gc.setBackground(display.getSystemColor(SWT.COLOR_WHITE));
-            if (mShape == SHAPE_CIRCLE) {
-                gc.fillOval(0, 0, SX - 1, SY - 1);
-            } else if (mShape == SHAPE_RECT) {
-                gc.fillRoundRectangle(0, 0, SX - 1, SY - 1, RX, RY);
-            }
-
-            gc.setForeground(display.getSystemColor(SWT.COLOR_BLACK));
-            gc.setLineWidth(1);
-            if (mShape == SHAPE_CIRCLE) {
-                gc.drawOval(0, 0, SX - 1, SY - 1);
-            } else if (mShape == SHAPE_RECT) {
-                gc.drawRoundRectangle(0, 0, SX - 1, SY - 1, RX, RY);
-            }
-
-            // Get a bold version of the default system font, if possible.
-            Font font = display.getSystemFont();
-            FontData[] fds = font.getFontData();
-            fds[0].setStyle(SWT.BOLD);
-            // use 3/4th of the circle diameter for the font size (in pixels)
-            // and convert it to "font points" (font points in SWT are hardcoded in an
-            // arbitrary 72 dpi and then converted in real pixels using whatever is
-            // indicated by getDPI -- at least that's how it works under Win32).
-            fds[0].setHeight((int) ((SY + 1) * 3./4. * 72./display.getDPI().y));
-            // Note: win32 implementation always uses fds[0] so we change just that one.
-            // getFontData indicates that the array of fd is really an unusual thing for X11.
-            font = new Font(display, fds);
-            gc.setFont(font);
-            gc.setForeground(display.getSystemColor(mColor));
-
-            // Text measurement varies so slightly depending on the platform
-            int ofx = 0;
-            int ofy = 0;
-            if (SdkConstants.CURRENT_PLATFORM == SdkConstants.PLATFORM_WINDOWS) {
-                ofx = +1;
-                ofy = -1;
-            } else if (SdkConstants.CURRENT_PLATFORM == SdkConstants.PLATFORM_DARWIN) {
-                // Tweak pixel positioning of some letters that don't look good on the Mac
-                if (mLetter != 'T' && mLetter != 'V') {
-                    ofy = -1;
-                }
-                if (mLetter == 'I') {
-                    ofx = -2;
-                }
-            }
-
-            String s = Character.toString(mLetter);
-            Point p = gc.textExtent(s);
-            int tx = (SX + ofx - p.x) / 2;
-            int ty = (SY + ofy - p.y) / 2;
-            gc.drawText(s, tx, ty, true /* isTransparent */);
-
-            font.dispose();
-            gc.dispose();
-
-            ImageData data = image.getImageData();
-            image.dispose();
-            backgroundColor.dispose();
-
-            // Set transparent pixel in the palette such that on paint (over palette,
-            // which has a background of SWT.COLOR_WIDGET_BACKGROUND, and over the tree
-            // which has a white background) we will substitute the background in for
-            // the backgroundPixel.
-            int backgroundPixel = data.palette.getPixel(backgroundRgb);
-            data.transparentPixel = backgroundPixel;
-
-            return data;
-        }
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/OutlineLabelProvider.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/OutlineLabelProvider.java
deleted file mode 100644
index bb5d1ba..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/OutlineLabelProvider.java
+++ /dev/null
@@ -1,117 +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.ide.eclipse.adt.internal.editors;
-
-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.ATTR_NAME;
-import static com.android.SdkConstants.ATTR_SRC;
-import static com.android.SdkConstants.ATTR_TEXT;
-import static com.android.SdkConstants.DRAWABLE_PREFIX;
-import static com.android.SdkConstants.LAYOUT_RESOURCE_PREFIX;
-import static com.android.SdkConstants.VIEW;
-import static com.android.SdkConstants.VIEW_TAG;
-
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.wst.xml.ui.internal.contentoutline.JFaceNodeLabelProvider;
-import org.w3c.dom.DOMException;
-import org.w3c.dom.Element;
-
-/**
- * Label provider for the XML outlines and quick outlines: Use our own icons,
- * when available, and and include the most important attribute (id, name, or
- * text)
- */
-@SuppressWarnings("restriction")
-// XML UI API
-class OutlineLabelProvider extends JFaceNodeLabelProvider {
-    @Override
-    public Image getImage(Object element) {
-        if (element instanceof Element) {
-            Element e = (Element) element;
-            String tagName = e.getTagName();
-            if (VIEW_TAG.equals(tagName)) {
-                // Can't have both view.png and View.png; issues on case sensitive vs
-                // case insensitive file systems
-                tagName = VIEW;
-            }
-            IconFactory factory = IconFactory.getInstance();
-            Image img = factory.getIcon(tagName, null);
-            if (img != null) {
-                return img;
-            }
-        }
-        return super.getImage(element);
-    }
-
-    @Override
-    public String getText(Object element) {
-        String text = super.getText(element);
-        if (element instanceof Element) {
-            Element e = (Element) element;
-            String id = getAttributeNS(e, ANDROID_URI, ATTR_ID);
-            if (id == null || id.length() == 0) {
-                id = getAttributeNS(e, ANDROID_URI, ATTR_NAME);
-                if (id == null || id.length() == 0) {
-                    id = e.getAttribute(ATTR_NAME);
-                    if (id == null || id.length() == 0) {
-                        id = getAttributeNS(e, ANDROID_URI, ATTR_TEXT);
-                        if (id != null && id.length() > 15) {
-                            id = id.substring(0, 12) + "...";
-                        }
-                        if (id == null || id.length() == 0) {
-                            id = getAttributeNS(e, ANDROID_URI, ATTR_SRC);
-                            if (id != null && id.length() > 0) {
-                                if (id.startsWith(DRAWABLE_PREFIX)) {
-                                    id = id.substring(DRAWABLE_PREFIX.length());
-                                }
-                            } else {
-                                id = e.getAttribute(ATTR_LAYOUT);
-                                if (id != null && id.length() > 0) {
-                                    if (id.startsWith(LAYOUT_RESOURCE_PREFIX)) {
-                                        id = id.substring(LAYOUT_RESOURCE_PREFIX.length());
-                                    }
-                                }
-                            }
-                        }
-                    }
-                }
-            }
-            if (id != null && id.length() > 0) {
-                return text + ": " + id; //$NON-NLS-1$
-            }
-        }
-        return text;
-    }
-
-    /**
-     * Wrapper around {@link Element#getAttributeNS(String, String)}.
-     * <p/>
-     * The implementation used in Eclipse's XML editor sometimes internally
-     * throws an NPE instead of politely returning null.
-     *
-     * @see Element#getAttributeNS(String, String)
-     */
-    private String getAttributeNS(Element e, String uri, String name) throws DOMException {
-        try {
-            return e.getAttributeNS(uri, name);
-        } catch (NullPointerException ignore) {
-            return null;
-        }
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/XmlEditorMultiOutline.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/XmlEditorMultiOutline.java
deleted file mode 100644
index 61db9f3..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/XmlEditorMultiOutline.java
+++ /dev/null
@@ -1,221 +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.ide.eclipse.adt.internal.editors;
-
-import com.android.ide.eclipse.adt.AdtPlugin;
-
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.action.IStatusLineManager;
-import org.eclipse.jface.action.IToolBarManager;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.ui.IActionBars;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.part.IPageBookViewPage;
-import org.eclipse.ui.part.Page;
-import org.eclipse.ui.part.PageBook;
-import org.eclipse.ui.views.contentoutline.IContentOutlinePage;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * Outline used for XML editors that have multiple pages with separate outlines:
- * switches between them
- * <p>
- * See https://bugs.eclipse.org/bugs/show_bug.cgi?id=1917
- * <p>
- * Modeled after .org.eclipse.pde.internal.ui.editor.PDEMultiPageContentOutline
- */
-public class XmlEditorMultiOutline extends Page implements IContentOutlinePage,
-        ISelectionChangedListener {
-    private boolean mDisposed;
-    private PageBook mPageBook;
-    private IContentOutlinePage mCurrentPage;
-    private IActionBars mActionBars;
-    private IContentOutlinePage mEmptyPage;
-    private List<ISelectionChangedListener> mListeners;
-    private ISelection mSelection;
-
-    public XmlEditorMultiOutline() {
-    }
-
-    @Override
-    public Control getControl() {
-        return mPageBook;
-    }
-
-    @Override
-    public void createControl(Composite parent) {
-        mPageBook = new PageBook(parent, SWT.NONE);
-    }
-
-    @Override
-    public void dispose() {
-        mDisposed = true;
-        mListeners = null;
-        if (mPageBook != null && !mPageBook.isDisposed()) {
-            mPageBook.dispose();
-            mPageBook = null;
-        }
-        if (mEmptyPage != null) {
-            mEmptyPage.dispose();
-            mEmptyPage = null;
-        }
-    }
-
-    public boolean isDisposed() {
-        return mDisposed;
-    }
-
-    @Override
-    public void makeContributions(IMenuManager menuManager, IToolBarManager toolBarManager,
-            IStatusLineManager statusLineManager) {
-    }
-
-    @Override
-    public void setActionBars(IActionBars actionBars) {
-        mActionBars = actionBars;
-        if (mCurrentPage != null) {
-            setPageActive(mCurrentPage);
-        }
-    }
-
-    @Override
-    public void setFocus() {
-        if (mCurrentPage != null) {
-            mCurrentPage.setFocus();
-        }
-    }
-
-    @Override
-    public void addSelectionChangedListener(ISelectionChangedListener listener) {
-        if (mListeners == null) {
-            mListeners = new ArrayList<ISelectionChangedListener>(2);
-        }
-        mListeners.add(listener);
-    }
-
-    @Override
-    public void removeSelectionChangedListener(ISelectionChangedListener listener) {
-        mListeners.remove(listener);
-    }
-
-    @Override
-    public ISelection getSelection() {
-        return mSelection;
-    }
-
-    @Override
-    public void selectionChanged(SelectionChangedEvent event) {
-        setSelection(event.getSelection());
-    }
-
-    public void setPageActive(IContentOutlinePage page) {
-        if (page == null) {
-            if (mEmptyPage == null) {
-                mEmptyPage = new EmptyPage();
-            }
-            page = mEmptyPage;
-        }
-        if (mCurrentPage != null) {
-            mCurrentPage.removeSelectionChangedListener(this);
-        }
-        page.addSelectionChangedListener(this);
-        mCurrentPage = page;
-        // Still initializing?
-        if (mPageBook == null) {
-            return;
-        }
-        Control control = page.getControl();
-        if (control == null || control.isDisposed()) {
-            if (page instanceof IPageBookViewPage) {
-                try {
-                    ((IPageBookViewPage) page).init(getSite());
-                } catch (PartInitException e) {
-                    AdtPlugin.log(e, null);
-                }
-            }
-            page.createControl(mPageBook);
-            page.setActionBars(mActionBars);
-            control = page.getControl();
-        }
-        mPageBook.showPage(control);
-    }
-
-    @Override
-    public void setSelection(ISelection selection) {
-        mSelection = selection;
-        if (mListeners != null) {
-            SelectionChangedEvent e = new SelectionChangedEvent(this, selection);
-            for (int i = 0; i < mListeners.size(); i++) {
-                mListeners.get(i).selectionChanged(e);
-            }
-        }
-    }
-
-    private static class EmptyPage implements IContentOutlinePage {
-        private Composite mControl;
-
-        private EmptyPage() {
-        }
-
-        @Override
-        public void createControl(Composite parent) {
-            mControl = new Composite(parent, SWT.NULL);
-        }
-
-        @Override
-        public void dispose() {
-        }
-
-        @Override
-        public Control getControl() {
-            return mControl;
-        }
-
-        @Override
-        public void setActionBars(IActionBars actionBars) {
-        }
-
-        @Override
-        public void setFocus() {
-        }
-
-        @Override
-        public void addSelectionChangedListener(ISelectionChangedListener listener) {
-        }
-
-        @Override
-        public ISelection getSelection() {
-            return StructuredSelection.EMPTY;
-        }
-
-        @Override
-        public void removeSelectionChangedListener(ISelectionChangedListener listener) {
-        }
-
-        @Override
-        public void setSelection(ISelection selection) {
-        }
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/animator/AnimDescriptors.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/animator/AnimDescriptors.java
deleted file mode 100644
index 2489cf5..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/animator/AnimDescriptors.java
+++ /dev/null
@@ -1,124 +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.eclipse.adt.internal.editors.animator;
-
-import com.android.SdkConstants;
-import com.android.ide.common.resources.platform.DeclareStyleableInfo;
-import com.android.ide.eclipse.adt.internal.editors.descriptors.ElementDescriptor;
-import com.android.ide.eclipse.adt.internal.editors.descriptors.IDescriptorProvider;
-import com.android.ide.eclipse.adt.internal.editors.descriptors.XmlnsAttributeDescriptor;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-/** Descriptors for the res/anim resources */
-public class AnimDescriptors implements IDescriptorProvider {
-    /** The root element descriptor */
-    private ElementDescriptor mDescriptor;
-    /** The root element descriptors */
-    private ElementDescriptor[] mRootDescriptors;
-    private Map<String, ElementDescriptor> nameToDescriptor;
-
-    /** @return the root descriptor. */
-    @Override
-    public ElementDescriptor getDescriptor() {
-        if (mDescriptor == null) {
-            mDescriptor = new ElementDescriptor("", getRootElementDescriptors()); //$NON-NLS-1$
-        }
-
-        return mDescriptor;
-    }
-
-    @Override
-    public ElementDescriptor[] getRootElementDescriptors() {
-        return mRootDescriptors;
-    }
-
-    public ElementDescriptor getElementDescriptor(String mRootTag) {
-        if (nameToDescriptor == null) {
-            nameToDescriptor = new HashMap<String, ElementDescriptor>();
-            for (ElementDescriptor descriptor : getRootElementDescriptors()) {
-                nameToDescriptor.put(descriptor.getXmlName(), descriptor);
-            }
-        }
-
-        ElementDescriptor descriptor = nameToDescriptor.get(mRootTag);
-        if (descriptor == null) {
-            descriptor = getDescriptor();
-        }
-        return descriptor;
-    }
-
-    public synchronized void updateDescriptors(Map<String, DeclareStyleableInfo> styleMap) {
-        if (styleMap == null) {
-            return;
-        }
-
-        XmlnsAttributeDescriptor xmlns = new XmlnsAttributeDescriptor(SdkConstants.ANDROID_NS_NAME,
-                SdkConstants.ANDROID_URI);
-
-        List<ElementDescriptor> descriptors = new ArrayList<ElementDescriptor>();
-
-        String sdkUrl =
-            "http://developer.android.com/guide/topics/graphics/view-animation.html"; //$NON-NLS-1$
-        ElementDescriptor set = AnimatorDescriptors.addElement(descriptors, styleMap,
-                "set", "Set", "AnimationSet", "Animation", //$NON-NLS-1$ //$NON-NLS-3$ //$NON-NLS-4$
-                "A container that holds other animation elements (<alpha>, <scale>, "
-                    + "<translate>, <rotate>) or other <set> elements. ",
-                sdkUrl,
-                xmlns, null, true /*mandatory*/);
-
-        AnimatorDescriptors.addElement(descriptors, styleMap,
-                "alpha", "Alpha", "AlphaAnimation", "Animation", //$NON-NLS-1$ //$NON-NLS-3$ //$NON-NLS-4$
-                "A fade-in or fade-out animation.",
-                sdkUrl,
-                xmlns, null, true /*mandatory*/);
-
-        AnimatorDescriptors.addElement(descriptors, styleMap,
-                "scale", "Scale", "ScaleAnimation", "Animation", //$NON-NLS-1$ //$NON-NLS-3$ //$NON-NLS-4$
-                "A resizing animation. You can specify the center point of the image from "
-                    + "which it grows outward (or inward) by specifying pivotX and pivotY. "
-                    + "For example, if these values are 0, 0 (top-left corner), all growth "
-                    + "will be down and to the right.",
-                sdkUrl,
-                xmlns, null, true /*mandatory*/);
-
-        AnimatorDescriptors.addElement(descriptors, styleMap,
-                "rotate", "Rotate", "RotateAnimation", "Animation", //$NON-NLS-1$ //$NON-NLS-3$ //$NON-NLS-4$
-                "A rotation animation.",
-                sdkUrl,
-                xmlns, null, true /*mandatory*/);
-
-        AnimatorDescriptors.addElement(descriptors, styleMap,
-                "translate", "Translate", "TranslateAnimation", "Animation", //$NON-NLS-1$ //$NON-NLS-3$ //$NON-NLS-4$
-                "A vertical and/or horizontal motion. Supports the following attributes in "
-                    + "any of the following three formats: values from -100 to 100 ending "
-                    + "with \"%\", indicating a percentage relative to itself; values from "
-                    + "-100 to 100 ending in \"%p\", indicating a percentage relative to its "
-                    + "parent; a float value with no suffix, indicating an absolute value.",
-                sdkUrl,
-                xmlns, null, true /*mandatory*/);
-
-        mRootDescriptors = descriptors.toArray(new ElementDescriptor[descriptors.size()]);
-
-        // Allow <set> to nest the others (and other sets)
-        if (set != null) {
-            set.setChildren(mRootDescriptors);
-        }
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/animator/AnimationContentAssist.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/animator/AnimationContentAssist.java
deleted file mode 100644
index 8a4cf23..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/animator/AnimationContentAssist.java
+++ /dev/null
@@ -1,168 +0,0 @@
-/*
- * Copyright (C) 2007 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.editors.animator;
-
-import static com.android.SdkConstants.ANDROID_NS_NAME_PREFIX;
-import static com.android.SdkConstants.ANDROID_PKG;
-
-import com.android.annotations.VisibleForTesting;
-import com.android.ide.common.api.IAttributeInfo.Format;
-import com.android.ide.common.resources.ResourceItem;
-import com.android.ide.common.resources.ResourceRepository;
-import com.android.ide.eclipse.adt.AdtUtils;
-import com.android.ide.eclipse.adt.internal.editors.AndroidContentAssist;
-import com.android.ide.eclipse.adt.internal.editors.descriptors.AttributeDescriptor;
-import com.android.ide.eclipse.adt.internal.editors.descriptors.ElementDescriptor;
-import com.android.ide.eclipse.adt.internal.editors.descriptors.IDescriptorProvider;
-import com.android.ide.eclipse.adt.internal.editors.descriptors.SeparatorAttributeDescriptor;
-import com.android.ide.eclipse.adt.internal.sdk.AndroidTargetData;
-import com.android.resources.ResourceFolderType;
-import com.android.resources.ResourceType;
-import com.android.utils.Pair;
-
-import org.eclipse.jface.text.contentassist.ICompletionProposal;
-import org.w3c.dom.Node;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.EnumSet;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-/**
- * Content Assist Processor for /res/drawable XML files
- */
-@VisibleForTesting
-public final class AnimationContentAssist extends AndroidContentAssist {
-    private static final String OBJECT_ANIMATOR = "objectAnimator"; //$NON-NLS-1$
-    private static final String PROPERTY_NAME = "propertyName";  //$NON-NLS-1$
-    private static final String INTERPOLATOR_PROPERTY_NAME = "interpolator"; //$NON-NLS-1$
-    private static final String INTERPOLATOR_NAME_SUFFIX = "_interpolator"; //$NON-NLS-1$
-
-    public AnimationContentAssist() {
-        super(AndroidTargetData.DESCRIPTOR_ANIMATOR);
-    }
-
-    @Override
-    protected int getRootDescriptorId() {
-        String folderName = AdtUtils.getParentFolderName(mEditor.getEditorInput());
-        ResourceFolderType folderType = ResourceFolderType.getFolderType(folderName);
-        if (folderType == ResourceFolderType.ANIM) {
-            return AndroidTargetData.DESCRIPTOR_ANIM;
-        } else {
-            return AndroidTargetData.DESCRIPTOR_ANIMATOR;
-        }
-    }
-
-    @Override
-    protected boolean computeAttributeValues(List<ICompletionProposal> proposals, int offset,
-            String parentTagName, String attributeName, Node node, String wordPrefix,
-            boolean skipEndTag, int replaceLength) {
-
-        // Add value completion for the interpolator and propertyName attributes
-
-        if (attributeName.endsWith(INTERPOLATOR_PROPERTY_NAME)) {
-            if (!wordPrefix.startsWith("@android:anim/")) { //$NON-NLS-1$
-                // List all framework interpolators with full path first
-                AndroidTargetData data = mEditor.getTargetData();
-                ResourceRepository repository = data.getFrameworkResources();
-                List<String> interpolators = new ArrayList<String>();
-                String base = '@' + ANDROID_PKG + ':' + ResourceType.ANIM.getName() + '/';
-                for (ResourceItem item : repository.getResourceItemsOfType(ResourceType.ANIM)) {
-                    String name = item.getName();
-                    if (name.endsWith(INTERPOLATOR_NAME_SUFFIX)) {
-                        interpolators.add(base + item.getName());
-                    }
-                }
-                addMatchingProposals(proposals, interpolators.toArray(), offset, node, wordPrefix,
-                        (char) 0 /* needTag */, true /* isAttribute */, false /* isNew */,
-                        skipEndTag /* skipEndTag */, replaceLength);
-            }
-
-
-            return super.computeAttributeValues(proposals, offset, parentTagName, attributeName,
-                    node, wordPrefix, skipEndTag, replaceLength);
-        } else if (parentTagName.equals(OBJECT_ANIMATOR)
-                && attributeName.endsWith(PROPERTY_NAME)) {
-
-            // Special case: the user is code completing inside
-            //    <objectAnimator propertyName="^">
-            // In this case, offer ALL attribute names that make sense for animation
-            // (e.g. all numeric ones)
-
-            String attributePrefix = wordPrefix;
-            if (startsWith(attributePrefix, ANDROID_NS_NAME_PREFIX)) {
-                attributePrefix = attributePrefix.substring(ANDROID_NS_NAME_PREFIX.length());
-            }
-
-            AndroidTargetData data = mEditor.getTargetData();
-            if (data != null) {
-                IDescriptorProvider descriptorProvider =
-                    data.getDescriptorProvider(AndroidTargetData.DESCRIPTOR_LAYOUT);
-                if (descriptorProvider != null) {
-                    ElementDescriptor[] rootElementDescriptors =
-                        descriptorProvider.getRootElementDescriptors();
-                    Map<String, AttributeDescriptor> matches =
-                        new HashMap<String, AttributeDescriptor>(180);
-                    for (ElementDescriptor elementDesc : rootElementDescriptors) {
-                        for (AttributeDescriptor desc : elementDesc.getAttributes()) {
-                            if (desc instanceof SeparatorAttributeDescriptor) {
-                                continue;
-                            }
-                            String name = desc.getXmlLocalName();
-                            if (startsWith(name, attributePrefix)) {
-                                EnumSet<Format> formats = desc.getAttributeInfo().getFormats();
-                                if (formats.contains(Format.INTEGER)
-                                        || formats.contains(Format.FLOAT)) {
-                                    // TODO: Filter out some common properties
-                                    // that the user probably isn't trying to
-                                    // animate:
-                                    // num*, min*, max*, *Index, *Threshold,
-                                    // *Duration, *Id, *Limit
-                                    matches.put(name, desc);
-                                }
-                            }
-                        }
-                    }
-
-                    List<AttributeDescriptor> sorted =
-                        new ArrayList<AttributeDescriptor>(matches.size());
-                    sorted.addAll(matches.values());
-                    Collections.sort(sorted);
-                    // Extract just the name+description pairs, since we don't want to
-                    // use the full attribute descriptor (which forces the namespace
-                    // prefix to be included)
-                    List<Pair<String, String>> pairs =
-                        new ArrayList<Pair<String, String>>(sorted.size());
-                    for (AttributeDescriptor d : sorted) {
-                        pairs.add(Pair.of(d.getXmlLocalName(), d.getAttributeInfo().getJavaDoc()));
-                    }
-
-                    addMatchingProposals(proposals, pairs.toArray(), offset, node, wordPrefix,
-                            (char) 0 /* needTag */, true /* isAttribute */, false /* isNew */,
-                            skipEndTag /* skipEndTag */, replaceLength);
-                }
-            }
-
-            return false;
-        } else {
-            return super.computeAttributeValues(proposals, offset, parentTagName, attributeName,
-                    node, wordPrefix, skipEndTag, replaceLength);
-        }
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/animator/AnimationEditorDelegate.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/animator/AnimationEditorDelegate.java
deleted file mode 100644
index 7c7051d..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/animator/AnimationEditorDelegate.java
+++ /dev/null
@@ -1,173 +0,0 @@
-/*
- * Copyright (C) 2007 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.editors.animator;
-
-import static com.android.ide.eclipse.adt.AdtConstants.EDITORS_NAMESPACE;
-
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-import com.android.ide.eclipse.adt.AdtUtils;
-import com.android.ide.eclipse.adt.internal.editors.common.CommonXmlDelegate;
-import com.android.ide.eclipse.adt.internal.editors.common.CommonXmlEditor;
-import com.android.ide.eclipse.adt.internal.editors.descriptors.DocumentDescriptor;
-import com.android.ide.eclipse.adt.internal.editors.descriptors.ElementDescriptor;
-import com.android.ide.eclipse.adt.internal.sdk.AndroidTargetData;
-import com.android.resources.ResourceFolderType;
-
-import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-
-/**
- * Editor for /res/animator XML files.
- */
-@SuppressWarnings("restriction")
-public class AnimationEditorDelegate extends CommonXmlDelegate {
-
-    public static class Creator implements IDelegateCreator {
-        @Override
-        @SuppressWarnings("unchecked")
-        public AnimationEditorDelegate createForFile(
-                @NonNull CommonXmlEditor delegator,
-                @Nullable ResourceFolderType type) {
-            if (ResourceFolderType.ANIM == type || ResourceFolderType.ANIMATOR == type) {
-                return new AnimationEditorDelegate(delegator);
-            }
-
-            return null;
-        }
-    }
-
-    /**
-     * Old standalone-editor ID.
-     * Use {@link CommonXmlEditor#ID} instead.
-     */
-    public static final String LEGACY_EDITOR_ID =
-        EDITORS_NAMESPACE + ".animator.AnimationEditor"; //$NON-NLS-1$
-
-    /** The tag used at the root */
-    private String mRootTag;
-
-    private AnimationEditorDelegate(CommonXmlEditor editor) {
-        super(editor, new AnimationContentAssist());
-        editor.addDefaultTargetListener();
-    }
-
-    @Override
-    public void delegateCreateFormPages() {
-        /* Disabled for now; doesn't work quite right
-        try {
-            addPage(new AnimatorTreePage(this));
-        } catch (PartInitException e) {
-            AdtPlugin.log(IStatus.ERROR, "Error creating nested page"); //$NON-NLS-1$
-            AdtPlugin.getDefault().getLog().log(e.getStatus());
-        }
-        */
-    }
-
-    /**
-     * Processes the new XML Model.
-     *
-     * @param xmlDoc The XML document, if available, or null if none exists.
-     */
-    @Override
-    public void delegateXmlModelChanged(Document xmlDoc) {
-        Element rootElement = xmlDoc.getDocumentElement();
-        if (rootElement != null) {
-            mRootTag = rootElement.getTagName();
-        }
-
-        // create the ui root node on demand.
-        delegateInitUiRootNode(false /*force*/);
-
-        if (mRootTag != null
-                && !mRootTag.equals(getUiRootNode().getDescriptor().getXmlLocalName())) {
-            AndroidTargetData data = getEditor().getTargetData();
-            if (data != null) {
-                ElementDescriptor descriptor;
-                if (getFolderType() == ResourceFolderType.ANIM) {
-                    descriptor = data.getAnimDescriptors().getElementDescriptor(mRootTag);
-                } else {
-                    descriptor = data.getAnimatorDescriptors().getElementDescriptor(mRootTag);
-                }
-                // Replace top level node now that we know the actual type
-
-                // Disconnect from old
-                getUiRootNode().setEditor(null);
-                getUiRootNode().setXmlDocument(null);
-
-                // Create new
-                setUiRootNode(descriptor.createUiNode());
-                getUiRootNode().setXmlDocument(xmlDoc);
-                getUiRootNode().setEditor(getEditor());
-            }
-        }
-
-        if (getUiRootNode().getDescriptor() instanceof DocumentDescriptor) {
-            getUiRootNode().loadFromXmlNode(xmlDoc);
-        } else {
-            getUiRootNode().loadFromXmlNode(rootElement);
-        }
-    }
-
-    @Override
-    public void delegateInitUiRootNode(boolean force) {
-        // The manifest UI node is always created, even if there's no corresponding XML node.
-        if (getUiRootNode() == null || force) {
-            ElementDescriptor descriptor;
-            boolean reload = false;
-            AndroidTargetData data = getEditor().getTargetData();
-            if (data == null) {
-                descriptor = new DocumentDescriptor("temp", null /*children*/);
-            } else {
-                if (getFolderType() == ResourceFolderType.ANIM) {
-                    descriptor = data.getAnimDescriptors().getElementDescriptor(mRootTag);
-                } else {
-                    descriptor = data.getAnimatorDescriptors().getElementDescriptor(mRootTag);
-                }
-                reload = true;
-            }
-            setUiRootNode(descriptor.createUiNode());
-            getUiRootNode().setEditor(getEditor());
-
-            if (reload) {
-                onDescriptorsChanged();
-            }
-        }
-    }
-
-    private ResourceFolderType getFolderType() {
-        String folderName = AdtUtils.getParentFolderName(getEditor().getEditorInput());
-        if (folderName.length() > 0) {
-            return ResourceFolderType.getFolderType(folderName);
-        }
-        return ResourceFolderType.ANIMATOR;
-    }
-
-    private void onDescriptorsChanged() {
-        IStructuredModel model = getEditor().getModelForRead();
-        if (model != null) {
-            try {
-                Node node = getEditor().getXmlDocument(model).getDocumentElement();
-                getUiRootNode().reloadFromXmlNode(node);
-            } finally {
-                model.releaseFromRead();
-            }
-        }
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/animator/AnimatorDescriptors.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/animator/AnimatorDescriptors.java
deleted file mode 100644
index 713f6d9..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/animator/AnimatorDescriptors.java
+++ /dev/null
@@ -1,184 +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.eclipse.adt.internal.editors.animator;
-
-import static com.android.SdkConstants.ANDROID_NS_NAME;
-import static com.android.SdkConstants.ANDROID_URI;
-
-import com.android.ide.common.resources.platform.DeclareStyleableInfo;
-import com.android.ide.eclipse.adt.internal.editors.descriptors.AttributeDescriptor;
-import com.android.ide.eclipse.adt.internal.editors.descriptors.DescriptorsUtils;
-import com.android.ide.eclipse.adt.internal.editors.descriptors.ElementDescriptor;
-import com.android.ide.eclipse.adt.internal.editors.descriptors.IDescriptorProvider;
-import com.android.ide.eclipse.adt.internal.editors.descriptors.XmlnsAttributeDescriptor;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-/**
- * Descriptors for /res/animator XML files.
- */
-public class AnimatorDescriptors implements IDescriptorProvider {
-    /** The root element descriptor */
-    private ElementDescriptor mDescriptor;
-    /** The root element descriptors */
-    private ElementDescriptor[] mRootDescriptors;
-    private Map<String, ElementDescriptor> nameToDescriptor;
-
-    /** @return the root descriptor. */
-    @Override
-    public ElementDescriptor getDescriptor() {
-        if (mDescriptor == null) {
-            mDescriptor = new ElementDescriptor("", getRootElementDescriptors()); //$NON-NLS-1$
-        }
-
-        return mDescriptor;
-    }
-
-    @Override
-    public ElementDescriptor[] getRootElementDescriptors() {
-        return mRootDescriptors;
-    }
-
-    ElementDescriptor getElementDescriptor(String rootTag) {
-        if (nameToDescriptor == null) {
-            nameToDescriptor = new HashMap<String, ElementDescriptor>();
-            for (ElementDescriptor descriptor : getRootElementDescriptors()) {
-                nameToDescriptor.put(descriptor.getXmlName(), descriptor);
-            }
-        }
-
-        ElementDescriptor descriptor = nameToDescriptor.get(rootTag);
-        if (descriptor == null) {
-            descriptor = getDescriptor();
-        }
-        return descriptor;
-    }
-
-    public synchronized void updateDescriptors(Map<String, DeclareStyleableInfo> styleMap) {
-        if (styleMap == null) {
-            return;
-        }
-
-        XmlnsAttributeDescriptor xmlns = new XmlnsAttributeDescriptor(ANDROID_NS_NAME,
-                ANDROID_URI);
-
-        List<ElementDescriptor> descriptors = new ArrayList<ElementDescriptor>();
-
-        String sdkUrl =
-            "http://developer.android.com/guide/topics/graphics/animation.html"; //$NON-NLS-1$
-
-        ElementDescriptor set = addElement(descriptors, styleMap,
-                "set", "Animator Set", "AnimatorSet", null, //$NON-NLS-1$ //$NON-NLS-3$
-                null /* tooltip */, sdkUrl,
-                xmlns, null, true /*mandatory*/);
-
-        ElementDescriptor objectAnimator = addElement(descriptors, styleMap,
-                "objectAnimator", "Object Animator", //$NON-NLS-1$
-                "PropertyAnimator", "Animator", //$NON-NLS-1$ //$NON-NLS-2$
-                null /* tooltip */, sdkUrl,
-                xmlns, null, true /*mandatory*/);
-
-        ElementDescriptor animator = addElement(descriptors, styleMap,
-                "animator", "Animator", "Animator", null, //$NON-NLS-1$ //$NON-NLS-3$
-                null /* tooltip */, sdkUrl,
-                xmlns, null, true /*mandatory*/);
-
-        mRootDescriptors = descriptors.toArray(new ElementDescriptor[descriptors.size()]);
-
-        // Allow arbitrary nesting: the children of all of these element can include
-        // any of the others
-        if (objectAnimator != null) {
-            objectAnimator.setChildren(mRootDescriptors);
-        }
-        if (animator != null) {
-            animator.setChildren(mRootDescriptors);
-        }
-        if (set != null) {
-            set.setChildren(mRootDescriptors);
-        }
-    }
-
-    /**
-     * Looks up the given style, and if found creates a new {@link ElementDescriptor}
-     * corresponding to the style. It can optionally take an extra style to merge in
-     * additional attributes from, and an extra attribute to add in as well. The new
-     * element, if it exists, can also be optionally added into a list.
-     *
-     * @param descriptors an optional list to add the element into, or null
-     * @param styleMap The map style => attributes from the attrs.xml file
-     * @param xmlName the XML tag name to use for the element
-     * @param uiName the UI name to display the element as
-     * @param styleName the name of the style which must exist for this style
-     * @param extraStyle an optional extra style to merge in attributes from, or null
-     * @param tooltip the tooltip or documentation for this element, or null
-     * @param sdkUrl an optional SDK url to display for the element, or null
-     * @param extraAttribute an extra attribute to add to the attributes list, or null
-     * @param childrenElements an array of children allowed by this element, or null
-     * @param mandatory if true, this element is mandatory
-     * @return a newly created element, or null if the style does not exist
-     */
-    public static ElementDescriptor addElement(
-            List<ElementDescriptor> descriptors,
-            Map<String, DeclareStyleableInfo> styleMap,
-            String xmlName, String uiName, String styleName, String extraStyle,
-            String tooltip, String sdkUrl,
-            AttributeDescriptor extraAttribute,
-            ElementDescriptor[] childrenElements,
-            boolean mandatory) {
-        DeclareStyleableInfo style = styleMap.get(styleName);
-        if (style == null) {
-            return null;
-        }
-        ElementDescriptor element = new ElementDescriptor(xmlName, uiName, tooltip, sdkUrl,
-                null, childrenElements, mandatory);
-
-        ArrayList<AttributeDescriptor> descs = new ArrayList<AttributeDescriptor>();
-
-        DescriptorsUtils.appendAttributes(descs,
-                null,   // elementName
-                ANDROID_URI,
-                style.getAttributes(),
-                null,   // requiredAttributes
-                null);  // overrides
-        element.setTooltip(style.getJavaDoc());
-
-        if (extraStyle != null) {
-            style = styleMap.get(extraStyle);
-            if (style != null) {
-                DescriptorsUtils.appendAttributes(descs,
-                        null,   // elementName
-                        ANDROID_URI,
-                        style.getAttributes(),
-                        null,   // requiredAttributes
-                        null);  // overrides
-            }
-        }
-
-        if (extraAttribute != null) {
-            descs.add(extraAttribute);
-        }
-
-        element.setAttributes(descs.toArray(new AttributeDescriptor[descs.size()]));
-        if (descriptors != null) {
-            descriptors.add(element);
-        }
-
-        return element;
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/binaryxml/BinaryXMLDescriber.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/binaryxml/BinaryXMLDescriber.java
deleted file mode 100644
index 00bf7b0..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/binaryxml/BinaryXMLDescriber.java
+++ /dev/null
@@ -1,80 +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.eclipse.adt.internal.editors.binaryxml;
-
-import org.eclipse.core.runtime.QualifiedName;
-import org.eclipse.core.runtime.content.IContentDescriber;
-import org.eclipse.core.runtime.content.IContentDescription;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.nio.ByteBuffer;
-import java.nio.ByteOrder;
-
-/**
- * A content describer for Android binary xml files
- *
- * <p>
- * This class referenced by the "describer" configuration element in
- * extensions to the <code>org.eclipse.core.runtime.contentTypes</code>
- * extension point.
- * </p>
- *
- * References :
- * <a>http://android.git.kernel.org/?p=platform/frameworks/base.git;a=blob;
- * f=include/utils/ResourceTypes.h</a>
- *
- */
-public class BinaryXMLDescriber implements IContentDescriber {
-
-    private static final int RES_XML_HEADER_SIZE = 8;
-    private final static short RES_XML_TYPE = 0x0003;
-
-    /*
-     * (non-Javadoc)
-     * @see org.eclipse.core.runtime.content.IContentDescriber#describe(java.io.
-     * InputStream, org.eclipse.core.runtime.content.IContentDescription)
-     */
-    @Override
-    public int describe(InputStream contents, IContentDescription description) throws IOException {
-        int status = INVALID;
-        int length = 8;
-        byte[] bytes = new byte[length];
-        if (contents.read(bytes, 0, length) == length) {
-            ByteBuffer buf = ByteBuffer.wrap(bytes);
-            buf.order(ByteOrder.LITTLE_ENDIAN);
-            short type = buf.getShort();
-            short headerSize = buf.getShort();
-            int size = buf.getInt(); // chunk size
-            if (type == RES_XML_TYPE && headerSize == RES_XML_HEADER_SIZE) {
-                status = VALID;
-            }
-        }
-        return status;
-    }
-
-    /*
-     * (non-Javadoc)
-     * @see
-     * org.eclipse.core.runtime.content.IContentDescriber#getSupportedOptions()
-     */
-    @Override
-    public QualifiedName[] getSupportedOptions() {
-        return new QualifiedName[0];
-    }
-
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/binaryxml/BinaryXMLMultiPageEditorPart.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/binaryxml/BinaryXMLMultiPageEditorPart.java
deleted file mode 100644
index ae6a35d..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/binaryxml/BinaryXMLMultiPageEditorPart.java
+++ /dev/null
@@ -1,85 +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.eclipse.adt.internal.editors.binaryxml;
-
-import com.android.SdkConstants;
-import com.android.ide.eclipse.adt.AdtPlugin;
-
-import org.eclipse.core.resources.IStorage;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.jdt.core.IPackageFragmentRoot;
-import org.eclipse.jdt.internal.core.JarEntryFile;
-import org.eclipse.jdt.internal.ui.javaeditor.JarEntryEditorInput;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.wst.xml.ui.internal.tabletree.XMLMultiPageEditorPart;
-
-import java.io.File;
-
-/**
- * The XML editor is an editor that open Android xml files from the android.jar file
- * <p>
- * The editor checks if the file is contained in jar and is so,
- * convert editor input to XmlStorageEditorInput that handles
- * corresponding file from Android SDK.
- *
- */
-public class BinaryXMLMultiPageEditorPart extends XMLMultiPageEditorPart {
-
-    /*
-     * (non-Javadoc)
-     *
-     * @see org.eclipse.ui.part.EditorPart#setInput(org.eclipse.ui.IEditorInput)
-     */
-    @Override
-    protected void setInput(IEditorInput input) {
-        if (input instanceof JarEntryEditorInput) {
-            JarEntryEditorInput jarInput = (JarEntryEditorInput) input;
-            IStorage storage = jarInput.getStorage();
-            if (storage instanceof JarEntryFile) {
-                JarEntryFile jarEntryFile = (JarEntryFile) storage;
-                IPackageFragmentRoot fragmentRoot = jarEntryFile.getPackageFragmentRoot();
-                if (fragmentRoot == null) {
-                    super.setInput(input);
-                    return;
-                }
-                IPath path = fragmentRoot.getPath();
-                if (path == null) {
-                    super.setInput(input);
-                    return;
-                }
-                path = path.removeLastSegments(1);
-                IPath filePath = path.append(SdkConstants.FD_DATA).append(
-                        jarEntryFile.getFullPath().toPortableString());
-                File file = new File(filePath.toOSString());
-                if (!(file.isFile())) {
-                    super.setInput(input);
-                    return;
-                }
-                try {
-                    XmlStorageEditorInput newInput = new XmlStorageEditorInput(
-                            new FileStorage(file));
-                    super.setInput(newInput);
-                    return;
-                } catch (Exception e) {
-                    AdtPlugin.log(e, e.getMessage(), null);
-                }
-            }
-        }
-        super.setInput(input);
-    }
-
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/binaryxml/FileStorage.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/binaryxml/FileStorage.java
deleted file mode 100644
index a8c9182..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/binaryxml/FileStorage.java
+++ /dev/null
@@ -1,120 +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.eclipse.adt.internal.editors.binaryxml;
-
-import com.android.ide.eclipse.adt.AdtPlugin;
-
-import org.eclipse.core.resources.IStorage;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.core.runtime.Status;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.InputStream;
-
-/**
- * Implementation of storage for a local file
- * (<code>java.io.File</code>).
- *
- * @see org.eclipse.core.resources.IStorage
- */
-
-public class FileStorage implements IStorage {
-
-    /**
-     * The file this storage refers to.
-     */
-    private File mFile = null;
-
-    /**
-     * Constructs and returns storage for the given file.
-     *
-     * @param file a local file
-     */
-    public FileStorage(File file) {
-        mFile = file;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.core.resources.IStorage#getContents()
-     */
-    @Override
-    public InputStream getContents() throws CoreException {
-        InputStream stream = null;
-        try {
-            stream = new FileInputStream(mFile);
-        } catch (Exception e) {
-            throw new CoreException(new Status(IStatus.ERROR, AdtPlugin.getDefault().getBundle()
-                    .getSymbolicName(), IStatus.ERROR, mFile.getAbsolutePath(), e));
-        }
-        return stream;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.core.resources.IStorage#getFullPath()
-     */
-    @Override
-    public IPath getFullPath() {
-        return new Path(mFile.getAbsolutePath());
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.core.resources.IStorage#getName()
-     */
-    @Override
-    public String getName() {
-        return mFile.getName();
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.core.resources.IStorage#isReadOnly()
-     */
-    @Override
-    public boolean isReadOnly() {
-        return true;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.core.runtime.IAdaptable#getAdapter(Class)
-     */
-    @Override
-    public Object getAdapter(Class adapter) {
-        return null;
-    }
-
-    /* (non-Javadoc)
-     * @see java.lang.Object#equals(java.lang.Object)
-     */
-    @Override
-    public boolean equals(Object obj) {
-        if (obj instanceof FileStorage) {
-            return mFile.equals(((FileStorage) obj).mFile);
-        }
-        return super.equals(obj);
-    }
-
-    /* (non-Javadoc)
-     * @see java.lang.Object#hashCode()
-     */
-    @Override
-    public int hashCode() {
-        return mFile.hashCode();
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/binaryxml/XmlStorageEditorInput.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/binaryxml/XmlStorageEditorInput.java
deleted file mode 100644
index 646c675..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/binaryxml/XmlStorageEditorInput.java
+++ /dev/null
@@ -1,119 +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.eclipse.adt.internal.editors.binaryxml;
-
-import org.eclipse.core.resources.IStorage;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.ui.IPersistableElement;
-import org.eclipse.ui.IStorageEditorInput;
-
-/**
- * An editor input for a local file.
- */
-public class XmlStorageEditorInput implements IStorageEditorInput {
-
-    /**
-     * Storage associated with this editor input
-     */
-    IStorage mStorage = null;
-
-    /**
-     * Constructs an editor input on the given storage
-     *
-     * @param storage
-     */
-    public XmlStorageEditorInput(IStorage storage) {
-        mStorage = storage;
-    }
-
-    /* (non-Javadoc)
-     * @see IStorageEditorInput#getStorage()
-     */
-    @Override
-    public IStorage getStorage() throws CoreException {
-        return mStorage;
-    }
-
-    /* (non-Javadoc)
-     * @see IInput#getStorage()
-     */
-    @Override
-    public boolean exists() {
-        return mStorage != null;
-    }
-
-    /* (non-Javadoc)
-     * @see IEditorInput#getImageDescriptor()
-     */
-    @Override
-    public ImageDescriptor getImageDescriptor() {
-        return null;
-    }
-
-    /* (non-Javadoc)
-     * @see IEditorInput#getName()
-     */
-    @Override
-    public String getName() {
-        return mStorage.getName();
-    }
-
-    /* (non-Javadoc)
-     * @see IEditorInput#getPersistable()
-     */
-    @Override
-    public IPersistableElement getPersistable() {
-        return null;
-    }
-
-    /* (non-Javadoc)
-     * @see IEditorInput#getToolTipText()
-     */
-    @Override
-    public String getToolTipText() {
-        return mStorage.getFullPath() != null ? mStorage.getFullPath().toString() : mStorage
-                .getName();
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.core.runtime.IAdaptable#getAdapter(Class)
-     */
-    @Override
-    public Object getAdapter(Class adapter) {
-        return null;
-    }
-
-    /* (non-Javadoc)
-     * @see java.lang.Object#equals(java.lang.Object)
-     */
-    @Override
-    public boolean equals(Object obj) {
-        if (obj instanceof XmlStorageEditorInput) {
-            return mStorage.equals(((XmlStorageEditorInput) obj).mStorage);
-        }
-        return super.equals(obj);
-    }
-
-    /* (non-Javadoc)
-     * @see java.lang.Object#hashCode()
-     */
-    @Override
-    public int hashCode() {
-        return mStorage.hashCode();
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/color/ColorContentAssist.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/color/ColorContentAssist.java
deleted file mode 100644
index 1570439..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/color/ColorContentAssist.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Copyright (C) 2007 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.editors.color;
-
-import com.android.annotations.VisibleForTesting;
-import com.android.ide.eclipse.adt.internal.editors.AndroidContentAssist;
-import com.android.ide.eclipse.adt.internal.sdk.AndroidTargetData;
-
-/**
- * Content Assist Processor for /res/color XML files
- */
-@VisibleForTesting
-public final class ColorContentAssist extends AndroidContentAssist {
-    public ColorContentAssist() {
-        super(AndroidTargetData.DESCRIPTOR_COLOR);
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/color/ColorDescriptors.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/color/ColorDescriptors.java
deleted file mode 100644
index 16add3e..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/color/ColorDescriptors.java
+++ /dev/null
@@ -1,98 +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.eclipse.adt.internal.editors.color;
-
-import static com.android.SdkConstants.ANDROID_NS_NAME;
-import static com.android.SdkConstants.ANDROID_URI;
-
-import com.android.ide.common.api.IAttributeInfo.Format;
-import com.android.ide.common.resources.platform.AttributeInfo;
-import com.android.ide.common.resources.platform.DeclareStyleableInfo;
-import com.android.ide.eclipse.adt.internal.editors.animator.AnimatorDescriptors;
-import com.android.ide.eclipse.adt.internal.editors.descriptors.AttributeDescriptor;
-import com.android.ide.eclipse.adt.internal.editors.descriptors.ElementDescriptor;
-import com.android.ide.eclipse.adt.internal.editors.descriptors.IDescriptorProvider;
-import com.android.ide.eclipse.adt.internal.editors.descriptors.ReferenceAttributeDescriptor;
-import com.android.ide.eclipse.adt.internal.editors.descriptors.XmlnsAttributeDescriptor;
-import com.android.resources.ResourceType;
-
-import java.util.Map;
-
-/** Descriptors for /res/color XML files */
-public class ColorDescriptors implements IDescriptorProvider {
-    private static final String SDK_URL =
-        "http://d.android.com/guide/topics/resources/color-list-resource.html"; //$NON-NLS-1$
-
-    public static final String SELECTOR_TAG = "selector";               //$NON-NLS-1$
-    public static final String ATTR_COLOR = "color";                    //$NON-NLS-1$
-
-    /** The root element descriptor */
-    private ElementDescriptor mDescriptor = new ElementDescriptor(
-            SELECTOR_TAG, "Selector",
-            "Required. This must be the root element. Contains one or more <item> elements.",
-            SDK_URL,
-            new AttributeDescriptor[] {
-                    new XmlnsAttributeDescriptor(ANDROID_NS_NAME, ANDROID_URI) },
-            null /*children: added later*/, true /*mandatory*/);
-
-    /** @return the root descriptor. */
-    @Override
-    public ElementDescriptor getDescriptor() {
-        if (mDescriptor == null) {
-            mDescriptor = new ElementDescriptor("", getRootElementDescriptors()); //$NON-NLS-1$
-        }
-
-        return mDescriptor;
-    }
-
-    @Override
-    public ElementDescriptor[] getRootElementDescriptors() {
-        return new ElementDescriptor[] { mDescriptor };
-    }
-
-    public synchronized void updateDescriptors(Map<String, DeclareStyleableInfo> styleMap) {
-        if (styleMap == null) {
-            return;
-        }
-
-        // Selector children
-        ElementDescriptor selectorItem = AnimatorDescriptors.addElement(null, styleMap,
-            "item", "Item", "DrawableStates", null, //$NON-NLS-1$ //$NON-NLS-3$
-            "Defines a drawable to use during certain states, as described by "
-                 + "its attributes. Must be a child of a <selector> element.",
-            SDK_URL,
-            new ReferenceAttributeDescriptor(
-                    ResourceType.COLOR, ATTR_COLOR,
-                    ANDROID_URI,
-                    new AttributeInfo(ATTR_COLOR, Format.COLOR_SET)).setTooltip(
-                "Hexadeximal color. Required. The color is specified with an RGB value and "
-                    + "optional alpha channel.\n"
-                    + "The value always begins with a pound (#) character and then "
-                    + "followed by the Alpha-Red-Green-Blue information in one of "
-                    + "the following formats:\n"
-                    + "* RGB\n"
-                    + "* ARGB\n"
-                    + "* RRGGBB\n"
-                    + "* AARRGGBB"),
-            null, /* This is wrong -- we can now embed any above drawable
-                        (but without xmlns as extra) */
-            false /*mandatory*/);
-
-        if (selectorItem != null) {
-            mDescriptor.setChildren(new ElementDescriptor[] { selectorItem });
-        }
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/color/ColorEditorDelegate.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/color/ColorEditorDelegate.java
deleted file mode 100644
index 3389683..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/color/ColorEditorDelegate.java
+++ /dev/null
@@ -1,116 +0,0 @@
-/*
- * Copyright (C) 2007 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.editors.color;
-
-import static com.android.ide.eclipse.adt.AdtConstants.EDITORS_NAMESPACE;
-
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-import com.android.ide.eclipse.adt.internal.editors.common.CommonXmlDelegate;
-import com.android.ide.eclipse.adt.internal.editors.common.CommonXmlEditor;
-import com.android.ide.eclipse.adt.internal.editors.descriptors.ElementDescriptor;
-import com.android.ide.eclipse.adt.internal.sdk.AndroidTargetData;
-import com.android.resources.ResourceFolderType;
-
-import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-
-/**
- * Editor for /res/color XML files.
- */
-@SuppressWarnings("restriction")
-public class ColorEditorDelegate extends CommonXmlDelegate {
-
-    public static class Creator implements IDelegateCreator {
-        @Override
-        @SuppressWarnings("unchecked")
-        public ColorEditorDelegate createForFile(
-                @NonNull CommonXmlEditor delegator,
-                @Nullable ResourceFolderType type) {
-            if (ResourceFolderType.COLOR == type) {
-                return new ColorEditorDelegate(delegator);
-            }
-
-            return null;
-        }
-    }
-
-    /**
-     * Old standalone-editor ID.
-     * Use {@link CommonXmlEditor#ID} instead.
-     */
-    public static final String LEGACY_EDITOR_ID =
-        EDITORS_NAMESPACE + ".color.ColorEditor"; //$NON-NLS-1$
-
-
-    private ColorEditorDelegate(CommonXmlEditor editor) {
-        super(editor, new ColorContentAssist());
-        editor.addDefaultTargetListener();
-    }
-
-    @Override
-    public void delegateCreateFormPages() {
-        /* Disabled for now; doesn't work quite right
-        try {
-            addPage(new ColorTreePage(this));
-        } catch (PartInitException e) {
-            AdtPlugin.log(IStatus.ERROR, "Error creating nested page"); //$NON-NLS-1$
-            AdtPlugin.getDefault().getLog().log(e.getStatus());
-        }
-        */
-    }
-
-    @Override
-    public void delegateXmlModelChanged(Document xmlDoc) {
-        // create the ui root node on demand.
-        delegateInitUiRootNode(false /*force*/);
-
-        Element rootElement = xmlDoc.getDocumentElement();
-        getUiRootNode().loadFromXmlNode(rootElement);
-    }
-
-    @Override
-    public void delegateInitUiRootNode(boolean force) {
-        // The manifest UI node is always created, even if there's no corresponding XML node.
-        if (getUiRootNode() == null || force) {
-            ElementDescriptor descriptor;
-            AndroidTargetData data = getEditor().getTargetData();
-            if (data == null) {
-                descriptor = new ColorDescriptors().getDescriptor();
-            } else {
-                descriptor = data.getColorDescriptors().getDescriptor();
-            }
-            setUiRootNode(descriptor.createUiNode());
-            getUiRootNode().setEditor(getEditor());
-            onDescriptorsChanged();
-        }
-    }
-
-    private void onDescriptorsChanged() {
-        IStructuredModel model = getEditor().getModelForRead();
-        if (model != null) {
-            try {
-                Node node = getEditor().getXmlDocument(model).getDocumentElement();
-                getUiRootNode().reloadFromXmlNode(node);
-            } finally {
-                model.releaseFromRead();
-            }
-        }
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/common/CommonActionContributor.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/common/CommonActionContributor.java
deleted file mode 100755
index 5857b15..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/common/CommonActionContributor.java
+++ /dev/null
@@ -1,40 +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.ide.eclipse.adt.internal.editors.common;
-
-import com.android.ide.eclipse.adt.internal.editors.layout.LayoutEditorDelegate;
-
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.part.EditorActionBarContributor;
-
-/**
- * Action contributor for the editors.
- * This delegates to editor-specific action contributors.
- */
-public class CommonActionContributor extends EditorActionBarContributor {
-
-    public CommonActionContributor() {
-        super();
-    }
-
-    @Override
-    public void setActiveEditor(IEditorPart part) {
-        LayoutEditorDelegate delegate = LayoutEditorDelegate.fromEditor(part);
-        if (delegate != null) {
-            delegate.setActiveEditor(part, getActionBars());
-        }
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/common/CommonMatchingStrategy.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/common/CommonMatchingStrategy.java
deleted file mode 100755
index 224c28f..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/common/CommonMatchingStrategy.java
+++ /dev/null
@@ -1,84 +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.ide.eclipse.adt.internal.editors.common;
-
-import static com.android.SdkConstants.FD_RES_LAYOUT;
-
-import com.android.ide.common.resources.ResourceFolder;
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.ide.eclipse.adt.internal.editors.layout.LayoutEditorMatchingStrategy;
-import com.android.ide.eclipse.adt.internal.preferences.AdtPrefs;
-import com.android.ide.eclipse.adt.internal.resources.manager.ResourceManager;
-import com.android.resources.ResourceFolderType;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorMatchingStrategy;
-import org.eclipse.ui.IEditorReference;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.part.FileEditorInput;
-
-/**
- * Matching strategy for the editors.
- * This finds the right MatchingStrategy and delegates to it.
- */
-public class CommonMatchingStrategy implements IEditorMatchingStrategy {
-
-    @Override
-    public boolean matches(IEditorReference editorRef, IEditorInput input) {
-        if (input instanceof FileEditorInput) {
-            FileEditorInput fileInput = (FileEditorInput)input;
-
-            // get the IFile object and check it's in one of the layout folders.
-            IFile file = fileInput.getFile();
-            if (file.getParent().getName().startsWith(FD_RES_LAYOUT)) {
-                ResourceFolder resFolder = ResourceManager.getInstance().getResourceFolder(file);
-                if (resFolder != null && resFolder.getType() == ResourceFolderType.LAYOUT) {
-                    if (AdtPrefs.getPrefs().isSharedLayoutEditor()) {
-                        LayoutEditorMatchingStrategy m = new LayoutEditorMatchingStrategy();
-                        return m.matches(editorRef, fileInput);
-                    } else {
-                        // Skip files that don't match by name (see below). However, for
-                        // layout files we can't just use editorRef.getName(), since
-                        // the name sometimes includes the parent folder name (when the
-                        // files are in layout- folders.
-                        if (!(editorRef.getName().endsWith(file.getName()) &&
-                                editorRef.getId().equals(CommonXmlEditor.ID))) {
-                            return false;
-                        }
-                    }
-                }
-            } else {
-                // Per the IEditorMatchingStrategy documentation, editorRef.getEditorInput()
-                // is expensive so try exclude files that definitely don't match, such
-                // as those with the wrong extension or wrong file name
-                if (!(file.getName().equals(editorRef.getName()) &&
-                        editorRef.getId().equals(CommonXmlEditor.ID))) {
-                    return false;
-                }
-            }
-
-            try {
-                return input.equals(editorRef.getEditorInput());
-            } catch (PartInitException e) {
-                AdtPlugin.log(e, null);
-            }
-        }
-
-        return false;
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/common/CommonSourceViewerConfig.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/common/CommonSourceViewerConfig.java
deleted file mode 100755
index be31040..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/common/CommonSourceViewerConfig.java
+++ /dev/null
@@ -1,66 +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.ide.eclipse.adt.internal.editors.common;
-
-import com.android.ide.eclipse.adt.internal.editors.AndroidSourceViewerConfig;
-
-import org.eclipse.jface.text.contentassist.IContentAssistProcessor;
-import org.eclipse.jface.text.source.ISourceViewer;
-
-
-
-/**
- * Source Viewer Configuration for the Common XML editor.
- * Everything is already generic and done in the base class.
- * The base class will use the delegate to find out the proper content assist to use.
- */
-public final class CommonSourceViewerConfig extends AndroidSourceViewerConfig {
-
-    private final IContentAssistProcessor mContentAssist;
-
-    public CommonSourceViewerConfig() {
-        super();
-        mContentAssist = null;
-    }
-
-    public CommonSourceViewerConfig(IContentAssistProcessor contentAssist) {
-        super();
-        mContentAssist = contentAssist;
-    }
-
-
-    /**
-     * @return The {@link IContentAssistProcessor} passed to the constructor or null.
-     */
-    @Override
-    public IContentAssistProcessor getAndroidContentAssistProcessor(
-            ISourceViewer sourceViewer,
-            String partitionType) {
-        // You may think you could use AndroidXmlEditor.fromTextViewer(sourceViewer)
-        // to find the editor associated with the sourceViewer and then access the
-        // delegate and query the content assist specific to a given delegate.
-        // Unfortunately this is invoked whilst the editor part is being created
-        // so we can't match an existing editor to the source view -- since there
-        // is no such "existing" editor. It's just being created.
-        //
-        // As a workaround, CommonXmlEditor#addPages() will unconfigure the
-        // default sourceViewerConfig and reconfigure it with one that really
-        // knows which content assist it should be using.
-
-        return mContentAssist;
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/common/CommonXmlDelegate.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/common/CommonXmlDelegate.java
deleted file mode 100755
index d9ee8a5..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/common/CommonXmlDelegate.java
+++ /dev/null
@@ -1,249 +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.ide.eclipse.adt.internal.editors.common;
-
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-import com.android.ide.eclipse.adt.internal.editors.AndroidXmlEditor;
-import com.android.ide.eclipse.adt.internal.editors.uimodel.UiElementNode;
-import com.android.resources.ResourceFolderType;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.jobs.Job;
-import org.eclipse.jface.text.contentassist.IContentAssistProcessor;
-import org.eclipse.ui.IActionBars;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IURIEditorInput;
-import org.eclipse.ui.forms.editor.IFormPage;
-import org.eclipse.ui.part.EditorActionBarContributor;
-import org.eclipse.ui.part.FileEditorInput;
-import org.eclipse.ui.part.MultiPageEditorPart;
-import org.w3c.dom.Document;
-
-/**
- * Implementation of form editor for /res XML files.
- * <p/>
- * All delegates must have one {@link IDelegateCreator} instance
- * registered in the {@code DELEGATES[]} array of {@link CommonXmlEditor}.
- */
-public abstract class CommonXmlDelegate {
-
-    /** The editor that created the delegate. Never null. */
-    private final CommonXmlEditor mEditor;
-
-    /** Root node of the UI element hierarchy. Can be null. */
-    private UiElementNode mUiRootNode;
-
-    private IContentAssistProcessor mContentAssist;
-
-    /**
-     * Static creator for {@link CommonXmlDelegate}s. Delegates implement a method
-     * that will decide whether this delegate can be created for the given file input.
-     */
-    public interface IDelegateCreator {
-        /**
-         * Determines whether this delegate can handle the given file, typically
-         * based on its resource path (e.g. ResourceManager#getResourceFolder).
-         *
-         * @param delegator The non-null instance of {@link CommonXmlEditor}.
-         * @param type The {@link ResourceFolderType} of the folder containing the file,
-         *   if it can be determined. Null otherwise.
-         * @return A new delegate that can handle that file or null.
-         */
-        public @Nullable <T extends CommonXmlDelegate> T createForFile(
-                            @NonNull CommonXmlEditor delegator,
-                            @Nullable ResourceFolderType type);
-    }
-
-    /** Implemented by delegates that need to support {@link EditorActionBarContributor} */
-    public interface IActionContributorDelegate {
-        /** Called from {@link EditorActionBarContributor#setActiveEditor(IEditorPart)}. */
-        public void setActiveEditor(IEditorPart part, IActionBars bars);
-    }
-
-    protected CommonXmlDelegate(
-            CommonXmlEditor editor,
-            IContentAssistProcessor contentAssist) {
-        mEditor = editor;
-        mContentAssist = contentAssist;
-    }
-
-    public void dispose() {
-    }
-
-    /**
-     * Returns the editor that created this delegate.
-     *
-     * @return the editor that created this delegate. Never null.
-     */
-    public @NonNull CommonXmlEditor getEditor() {
-        return mEditor;
-    }
-
-    /**
-     * @return The root node of the UI element hierarchy
-     */
-    public UiElementNode getUiRootNode() {
-        return mUiRootNode;
-    }
-
-    protected void setUiRootNode(UiElementNode uiRootNode) {
-        mUiRootNode = uiRootNode;
-    }
-
-    /** Called to compute the initial {@code UiRootNode}. */
-    public abstract void delegateInitUiRootNode(boolean force);
-
-    /**
-     * Returns true, indicating the "save as" operation is supported by this editor.
-     */
-    public boolean isSaveAsAllowed() {
-        return true;
-    }
-
-    /**
-     * Create the various form pages.
-     */
-    public abstract void delegateCreateFormPages();
-
-    public void delegatePostCreatePages() {
-        // pass
-    }
-
-    /**
-     * Changes the tab/title name to include the project name.
-     */
-    public void delegateSetInput(IEditorInput input) {
-        if (input instanceof FileEditorInput) {
-            FileEditorInput fileInput = (FileEditorInput) input;
-            IFile file = fileInput.getFile();
-            getEditor().setPartName(file.getName());
-        } else if (input instanceof IURIEditorInput) {
-            IURIEditorInput uriInput = (IURIEditorInput) input;
-            String name = uriInput.getName();
-            getEditor().setPartName(name);
-        }
-    }
-
-    /**
-     * Processes the new XML Model, which XML root node is given.
-     *
-     * @param xml_doc The XML document, if available, or null if none exists.
-     */
-    public abstract void delegateXmlModelChanged(Document xml_doc);
-
-    public void delegatePageChange(int newPageIndex) {
-        // pass
-    }
-
-    public void delegatePostPageChange(int newPageIndex) {
-        // pass
-    }
-    /**
-     * Save the XML.
-     * <p/>
-     * The actual save operation is done in the super class by committing
-     * all data to the XML model and then having the Structured XML Editor
-     * save the XML.
-     * <p/>
-     * Here we just need to tell the graphical editor that the model has
-     * been saved.
-     */
-    public void delegateDoSave(IProgressMonitor monitor) {
-        // pass
-    }
-
-    /**
-     * Tells the editor to start a Lint check.
-     * It's up to the caller to check whether this should be done depending on preferences.
-     */
-    public Job delegateRunLint() {
-        return getEditor().startLintJob();
-    }
-
-
-    /**
-     * Returns the custom IContentOutlinePage or IPropertySheetPage when asked for it.
-     */
-    public Object delegateGetAdapter(Class<?> adapter) {
-        return null;
-    }
-
-    /**
-     * Returns the {@link IContentAssistProcessor} associated with this editor.
-     * Most implementations should lazily allocate one processor and always return the
-     * same instance.
-     * Must return null if there's no specific content assist processor for this editor.
-     */
-    public IContentAssistProcessor getAndroidContentAssistProcessor() {
-        return mContentAssist;
-    }
-
-    /**
-     * Does this editor participate in the "format GUI editor changes" option?
-     *
-     * @return false since editors do not support automatically formatting XML
-     *         affected by GUI changes unless they explicitly opt in to it.
-     */
-    public boolean delegateSupportsFormatOnGuiEdit() {
-        return false;
-    }
-
-    /**
-     * Called after the editor's active page has been set.
-     *
-     * @param superReturned the return value from
-     *            {@link MultiPageEditorPart#setActivePage(int)}
-     * @param pageIndex the index of the page to be activated; the index must be
-     *            valid
-     * @return the page, or null
-     * @see MultiPageEditorPart#setActivePage(int)
-     */
-    public IFormPage delegatePostSetActivePage(IFormPage superReturned, String pageIndex) {
-        return superReturned;
-    }
-
-    /** Called after an editor has been activated */
-    public void delegateActivated() {
-    }
-
-    /** Called after an editor has been deactivated */
-    public void delegateDeactivated() {
-    }
-
-    /**
-     * Returns the name of the editor to be shown in the editor tab etc. Return
-     * null to keep the default.
-     *
-     * @return the part name, or null to use the default
-     */
-    public String delegateGetPartName() {
-        return null;
-    }
-
-    /**
-     * Returns the persistence category, as described in
-     * {@link AndroidXmlEditor#getPersistenceCategory}.
-     *
-     * @return the persistence category to use for this editor
-     */
-    public int delegateGetPersistenceCategory() {
-        return AndroidXmlEditor.CATEGORY_OTHER;
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/common/CommonXmlEditor.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/common/CommonXmlEditor.java
deleted file mode 100755
index be06d38..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/common/CommonXmlEditor.java
+++ /dev/null
@@ -1,467 +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.ide.eclipse.adt.internal.editors.common;
-
-import com.android.ide.common.resources.ResourceFolder;
-import com.android.ide.eclipse.adt.AdtConstants;
-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.animator.AnimationEditorDelegate;
-import com.android.ide.eclipse.adt.internal.editors.color.ColorEditorDelegate;
-import com.android.ide.eclipse.adt.internal.editors.common.CommonXmlDelegate.IDelegateCreator;
-import com.android.ide.eclipse.adt.internal.editors.drawable.DrawableEditorDelegate;
-import com.android.ide.eclipse.adt.internal.editors.layout.LayoutEditorDelegate;
-import com.android.ide.eclipse.adt.internal.editors.menu.MenuEditorDelegate;
-import com.android.ide.eclipse.adt.internal.editors.otherxml.OtherXmlEditorDelegate;
-import com.android.ide.eclipse.adt.internal.editors.otherxml.PlainXmlEditorDelegate;
-import com.android.ide.eclipse.adt.internal.editors.uimodel.UiElementNode;
-import com.android.ide.eclipse.adt.internal.editors.values.ValuesEditorDelegate;
-import com.android.ide.eclipse.adt.internal.resources.manager.ResourceManager;
-import com.android.resources.ResourceFolderType;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.jobs.Job;
-import org.eclipse.jface.text.source.ISourceViewer;
-import org.eclipse.jface.text.source.ISourceViewerExtension2;
-import org.eclipse.ui.IEditorDescriptor;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IEditorSite;
-import org.eclipse.ui.IFileEditorInput;
-import org.eclipse.ui.IShowEditorInput;
-import org.eclipse.ui.IURIEditorInput;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.forms.editor.IFormPage;
-import org.eclipse.ui.ide.IDE;
-import org.w3c.dom.Document;
-
-/**
- * Multi-page form editor for ALL /res XML files.
- * <p/>
- * This editor doesn't actually do anything. Instead, it defers actual implementation
- * to {@link CommonXmlDelegate} instances.
- */
-public class CommonXmlEditor extends AndroidXmlEditor implements IShowEditorInput {
-
-    public static final String ID = AdtConstants.EDITORS_NAMESPACE + ".CommonXmlEditor"; //$NON-NLS-1$
-
-    /**
-     * Registered {@link CommonXmlDelegate}s.
-     * All delegates must have a {@code Creator} class which is instantiated
-     * once here statically. All the creators are invoked in the order they
-     * are defined and the first one to return a non-null delegate is used.
-     */
-    private static final IDelegateCreator[] DELEGATES = {
-            new LayoutEditorDelegate.Creator(),
-            new ValuesEditorDelegate.Creator(),
-            new AnimationEditorDelegate.Creator(),
-            new ColorEditorDelegate.Creator(),
-            new DrawableEditorDelegate.Creator(),
-            new MenuEditorDelegate.Creator(),
-            new OtherXmlEditorDelegate.Creator(),
-    };
-
-    /**
-     * IDs of legacy editors replaced by the {@link CommonXmlEditor}.
-     */
-    public static final String[] LEGACY_EDITOR_IDS = {
-        LayoutEditorDelegate.LEGACY_EDITOR_ID,
-        ValuesEditorDelegate.LEGACY_EDITOR_ID,
-        AnimationEditorDelegate.LEGACY_EDITOR_ID,
-        ColorEditorDelegate.LEGACY_EDITOR_ID,
-        DrawableEditorDelegate.LEGACY_EDITOR_ID,
-        MenuEditorDelegate.LEGACY_EDITOR_ID,
-        OtherXmlEditorDelegate.LEGACY_EDITOR_ID,
-    };
-
-    private CommonXmlDelegate mDelegate = null;
-
-    /**
-     * Creates the form editor for resources XML files.
-     */
-    public CommonXmlEditor() {
-        super();
-    }
-
-    @Override
-    public void init(IEditorSite site, final IEditorInput editorInput)
-            throws PartInitException {
-        if (editorInput instanceof IFileEditorInput) {
-
-            IFileEditorInput fileInput = (IFileEditorInput) editorInput;
-            IFile file = fileInput.getFile();
-
-            // Adjust the default file editor ID
-
-            IEditorDescriptor file_desc = IDE.getDefaultEditor(file);
-            String id = file_desc == null ? null : file_desc.getId();
-            boolean mustChange = id != null &&
-                                 !id.equals(ID) &&
-                                 id.startsWith(AdtConstants.EDITORS_NAMESPACE);
-            if (!mustChange) {
-                // Maybe this was opened by a manual Open With with a legacy ID?
-                id = site.getId();
-                mustChange = id != null &&
-                             !id.equals(ID) &&
-                             id.startsWith(AdtConstants.EDITORS_NAMESPACE);
-            }
-
-            if (mustChange) {
-                // It starts by our editor namespace but it's not the right ID.
-                // This is an old Android XML ID. Change it to our new ID.
-                IDE.setDefaultEditor(file, ID);
-                AdtPlugin.log(IStatus.INFO,
-                        "Changed legacy editor ID %s for %s",   //$NON-NLS-1$
-                        id,
-                        file.getFullPath());
-            }
-
-            // Now find the delegate for the file.
-
-            ResourceFolder resFolder = ResourceManager.getInstance().getResourceFolder(file);
-            ResourceFolderType type = resFolder == null ? null : resFolder.getType();
-
-            if (type == null) {
-                // We lack any real resource information about that file.
-                // Let's take a guess using the actual path.
-                String folderName = AdtUtils.getParentFolderName(editorInput);
-                type = ResourceFolderType.getFolderType(folderName);
-            }
-
-            if (type != null) {
-                for (IDelegateCreator creator : DELEGATES) {
-                    mDelegate = creator.createForFile(this, type);
-                    if (mDelegate != null) {
-                        break;
-                    }
-                }
-            }
-
-            if (mDelegate == null) {
-                // We didn't find any editor.
-                // We'll use the PlainXmlEditorDelegate as a catch-all editor.
-                AdtPlugin.log(IStatus.INFO,
-                        "No valid Android XML Editor Delegate found for file %1$s [Res %2$s, type %3$s]",
-                        file.getFullPath(),
-                        resFolder,
-                        type);
-                mDelegate = new PlainXmlEditorDelegate(this);
-            }
-        } else if (editorInput instanceof IURIEditorInput) {
-            String folderName = AdtUtils.getParentFolderName(editorInput);
-            ResourceFolderType type = ResourceFolderType.getFolderType(folderName);
-            if (type == ResourceFolderType.LAYOUT) {
-                // The layout editor has a lot of hardcoded requirements for real IFiles
-                // and IProjects so for now just use a plain XML editor for project-less layout
-                // files
-                mDelegate = new OtherXmlEditorDelegate(this);
-            } else if (type != null) {
-                for (IDelegateCreator creator : DELEGATES) {
-                    mDelegate = creator.createForFile(this, type);
-                    if (mDelegate != null) {
-                        break;
-                    }
-                }
-            }
-
-            if (mDelegate == null) {
-                // We didn't find any editor.
-                // We'll use the PlainXmlEditorDelegate as a catch-all editor.
-                AdtPlugin.log(IStatus.INFO,
-                        "No valid Android XML Editor Delegate found for file %1$s [Res %2$s, type %3$s]",
-                        ((IURIEditorInput) editorInput).getURI().toString(),
-                        folderName,
-                        type);
-                mDelegate = new PlainXmlEditorDelegate(this);
-            }
-        }
-
-        if (mDelegate == null) {
-            // We can't do anything if we don't have a valid file.
-            AdtPlugin.log(IStatus.INFO,
-                    "Android XML Editor cannot process non-file input %1$s",   //$NON-NLS-1$
-                    (editorInput == null ? "null" : editorInput.toString()));   //$NON-NLS-1$
-            throw new PartInitException("Android XML Editor cannot process this input.");
-        } else {
-            // Invoke the editor's init after setting up the delegate. This will call setInput().
-            super.init(site, editorInput);
-        }
-    }
-
-    /**
-     * @return The root node of the UI element hierarchy
-     */
-    @Override
-    public UiElementNode getUiRootNode() {
-        return mDelegate == null ? null : mDelegate.getUiRootNode();
-    }
-
-    public CommonXmlDelegate getDelegate() {
-        return mDelegate;
-    }
-
-    // ---- Base Class Overrides ----
-
-    @Override
-    public void dispose() {
-        if (mDelegate != null) {
-            mDelegate.dispose();
-        }
-
-        super.dispose();
-    }
-
-    /**
-     * Save the XML.
-     * <p/>
-     * The actual save operation is done in the super class by committing
-     * all data to the XML model and then having the Structured XML Editor
-     * save the XML.
-     * <p/>
-     * Here we just need to tell the delegate that the model has
-     * been saved.
-     */
-    @Override
-    public void doSave(IProgressMonitor monitor) {
-        super.doSave(monitor);
-        if (mDelegate != null) {
-            mDelegate.delegateDoSave(monitor);
-        }
-    }
-
-    /**
-     * Returns whether the "save as" operation is supported by this editor.
-     * <p/>
-     * Save-As is a valid operation for the ManifestEditor since it acts on a
-     * single source file.
-     *
-     * @see IEditorPart
-     */
-    @Override
-    public boolean isSaveAsAllowed() {
-        return mDelegate == null ? false : mDelegate.isSaveAsAllowed();
-    }
-
-    /**
-     * Create the various form pages.
-     */
-    @Override
-    protected void createFormPages() {
-        if (mDelegate != null) {
-            mDelegate.delegateCreateFormPages();
-        }
-    }
-
-    @Override
-    protected void postCreatePages() {
-        super.postCreatePages();
-
-        if (mDelegate != null) {
-            mDelegate.delegatePostCreatePages();
-        }
-    }
-
-    @Override
-    protected void addPages() {
-        // Create the editor pages.
-        // This will also create the EditorPart.
-        super.addPages();
-
-        // When the EditorPart is being created, it configures the SourceViewer
-        // and will try to use our CommonSourceViewerConfig. Our config needs to
-        // know which ContentAssist processor to use (since we have one per resource
-        // folder type) but it doesn't have the necessary info to do so.
-        // Consequently, once the part is created, we can now unconfigure the source
-        // viewer and reconfigure it with the right settings.
-        ISourceViewer ssv = getStructuredSourceViewer();
-        if (mDelegate != null && ssv instanceof ISourceViewerExtension2) {
-            ((ISourceViewerExtension2) ssv).unconfigure();
-            ssv.configure(new CommonSourceViewerConfig(
-                    mDelegate.getAndroidContentAssistProcessor()));
-        }
-    }
-
-    /* (non-java doc)
-     * Change the tab/title name to include the name of the layout.
-     */
-    @Override
-    protected void setInput(IEditorInput input) {
-        super.setInput(input);
-        assert mDelegate != null;
-        if (mDelegate != null) {
-            mDelegate.delegateSetInput(input);
-        }
-    }
-
-    @Override
-    public void setInputWithNotify(IEditorInput input) {
-        super.setInputWithNotify(input);
-        if (mDelegate instanceof LayoutEditorDelegate) {
-            ((LayoutEditorDelegate) mDelegate).delegateSetInputWithNotify(input);
-        }
-    }
-
-    /**
-     * Processes the new XML Model, which XML root node is given.
-     *
-     * @param xml_doc The XML document, if available, or null if none exists.
-     */
-    @Override
-    protected void xmlModelChanged(Document xml_doc) {
-        if (mDelegate != null) {
-            mDelegate.delegateXmlModelChanged(xml_doc);
-        }
-    }
-
-    @Override
-    protected Job runLint() {
-        if (mDelegate != null && getEditorInput() instanceof IFileEditorInput) {
-            return mDelegate.delegateRunLint();
-        }
-        return null;
-    }
-
-    /**
-     * Returns the custom IContentOutlinePage or IPropertySheetPage when asked for it.
-     */
-    @Override
-    public Object getAdapter(@SuppressWarnings("rawtypes") Class adapter) {
-        if (mDelegate != null) {
-            Object value = mDelegate.delegateGetAdapter(adapter);
-            if (value != null) {
-                return value;
-            }
-        }
-
-        // return default
-        return super.getAdapter(adapter);
-    }
-
-    @Override
-    protected void pageChange(int newPageIndex) {
-        if (mDelegate != null) {
-            mDelegate.delegatePageChange(newPageIndex);
-        }
-
-        super.pageChange(newPageIndex);
-
-        if (mDelegate != null) {
-            mDelegate.delegatePostPageChange(newPageIndex);
-        }
-    }
-
-    @Override
-    protected int getPersistenceCategory() {
-        if (mDelegate != null) {
-            return mDelegate.delegateGetPersistenceCategory();
-        }
-        return CATEGORY_OTHER;
-    }
-
-    @Override
-    public void initUiRootNode(boolean force) {
-        if (mDelegate != null) {
-            mDelegate.delegateInitUiRootNode(force);
-        }
-    }
-
-    @Override
-    public IFormPage setActivePage(String pageId) {
-        IFormPage page = super.setActivePage(pageId);
-
-        if (mDelegate != null) {
-            return mDelegate.delegatePostSetActivePage(page, pageId);
-        }
-
-        return page;
-    }
-
-    /* Implements showEditorInput(...) in IShowEditorInput */
-    @Override
-    public void showEditorInput(IEditorInput editorInput) {
-        if (mDelegate instanceof LayoutEditorDelegate) {
-            ((LayoutEditorDelegate) mDelegate).showEditorInput(editorInput);
-        }
-    }
-
-    @Override
-    public boolean supportsFormatOnGuiEdit() {
-        if (mDelegate != null) {
-            return mDelegate.delegateSupportsFormatOnGuiEdit();
-        }
-        return super.supportsFormatOnGuiEdit();
-    }
-
-    @Override
-    public void activated() {
-        super.activated();
-        if (mDelegate != null) {
-            mDelegate.delegateActivated();
-        }
-    }
-
-    @Override
-    public void deactivated() {
-        super.deactivated();
-        if (mDelegate != null) {
-            mDelegate.delegateDeactivated();
-        }
-    }
-
-    @Override
-    public String getPartName() {
-        if (mDelegate != null) {
-            String name = mDelegate.delegateGetPartName();
-            if (name != null) {
-                return name;
-            }
-        }
-
-        return super.getPartName();
-    }
-
-    // --------------------
-    // Base methods exposed so that XmlEditorDelegate can access them
-
-    @Override
-    public void setPartName(String partName) {
-        super.setPartName(partName);
-    }
-
-    @Override
-    public void setPageText(int pageIndex, String text) {
-        super.setPageText(pageIndex, text);
-    }
-
-    @Override
-    public void firePropertyChange(int propertyId) {
-        super.firePropertyChange(propertyId);
-    }
-
-    @Override
-    public int getPageCount() {
-        return super.getPageCount();
-    }
-
-    @Override
-    public int getCurrentPage() {
-        return super.getCurrentPage();
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/descriptors/AttributeDescriptor.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/descriptors/AttributeDescriptor.java
deleted file mode 100644
index 345a109..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/descriptors/AttributeDescriptor.java
+++ /dev/null
@@ -1,121 +0,0 @@
-/*
- * Copyright (C) 2007 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.editors.descriptors;
-
-import com.android.SdkConstants;
-import com.android.ide.common.api.IAttributeInfo;
-import com.android.ide.eclipse.adt.internal.editors.IconFactory;
-import com.android.ide.eclipse.adt.internal.editors.uimodel.UiAttributeNode;
-import com.android.ide.eclipse.adt.internal.editors.uimodel.UiElementNode;
-
-import org.eclipse.swt.graphics.Image;
-
-/**
- * {@link AttributeDescriptor} describes an XML attribute with its XML attribute name.
- * <p/>
- * An attribute descriptor also knows which UI node should be instantiated to represent
- * this particular attribute (e.g. text field, icon chooser, class selector, etc.)
- * Some attributes may be hidden and have no user interface at all.
- * <p/>
- * This is an abstract class. Derived classes must implement data description and return
- * the correct UiAttributeNode-derived class.
- */
-public abstract class AttributeDescriptor implements Comparable<AttributeDescriptor> {
-    public static final String ATTRIBUTE_ICON_FILENAME = "attribute"; //$NON-NLS-1$
-
-    private final String mXmlLocalName;
-    private final String mNsUri;
-    private final IAttributeInfo mAttrInfo;
-    private ElementDescriptor mParent;
-
-    /**
-     * Creates a new {@link AttributeDescriptor}
-     *
-     * @param xmlLocalName The XML name of the attribute (case sensitive)
-     * @param nsUri The URI of the attribute. Can be null if attribute has no namespace.
-     *              See {@link SdkConstants#NS_RESOURCES} for a common value.
-     * @param attrInfo The {@link IAttributeInfo} of this attribute. Can't be null for a "real"
-     *              attribute representing a View element's attribute. Can be null for some
-     *              specialized internal attribute descriptors (e.g. hidden descriptors, XMLNS,
-     *              or attribute separator, all of which do not represent any real attribute.)
-     */
-    public AttributeDescriptor(String xmlLocalName, String nsUri, IAttributeInfo attrInfo) {
-        assert xmlLocalName != null;
-        mXmlLocalName = xmlLocalName;
-        mNsUri = nsUri;
-        mAttrInfo = attrInfo;
-    }
-
-    /** Returns the XML local name of the attribute (case sensitive). */
-    public final String getXmlLocalName() {
-        return mXmlLocalName;
-    }
-
-    /** Returns the namespace URI of this attribute. */
-    public final String getNamespaceUri() {
-        return mNsUri;
-    }
-
-    /** Sets the element descriptor to which this attribute is attached. */
-    final void setParent(ElementDescriptor parent) {
-        mParent = parent;
-    }
-
-    /** Returns the element descriptor to which this attribute is attached. */
-    public final ElementDescriptor getParent() {
-        return mParent;
-    }
-
-    /** Returns whether this attribute is deprecated (based on its attrs.xml javadoc.) */
-    public boolean isDeprecated() {
-        return mAttrInfo == null ? false : mAttrInfo.getDeprecatedDoc() != null;
-    }
-
-    /**
-     * Returns the {@link IAttributeInfo} of this attribute.
-     * Can't be null for real attributes.
-     * Can be null for specialized internal attribute descriptors that do not correspond to
-     * any real XML attribute.
-     */
-    public IAttributeInfo getAttributeInfo() {
-        return mAttrInfo;
-    }
-
-    /**
-     * Returns an optional icon for the attribute.
-     * This icon is generic, that is all attribute descriptors have the same icon
-     * no matter what they represent.
-     *
-     * @return An icon for this element or null.
-     */
-    public Image getGenericIcon() {
-        return IconFactory.getInstance().getIcon(ATTRIBUTE_ICON_FILENAME);
-    }
-
-    /**
-     * @param uiParent The {@link UiElementNode} parent of this UI attribute.
-     * @return A new {@link UiAttributeNode} linked to this descriptor or null if this
-     *         attribute has no user interface.
-     */
-    public abstract UiAttributeNode createUiNode(UiElementNode uiParent);
-
-    // Implements Comparable<AttributeDescriptor>
-    @Override
-    public int compareTo(AttributeDescriptor other) {
-        return mXmlLocalName.compareTo(other.mXmlLocalName);
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/descriptors/AttributeDescriptorLabelProvider.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/descriptors/AttributeDescriptorLabelProvider.java
deleted file mode 100644
index 32def64..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/descriptors/AttributeDescriptorLabelProvider.java
+++ /dev/null
@@ -1,87 +0,0 @@
-/*
- * 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.editors.descriptors;
-
-import com.android.ide.eclipse.adt.internal.editors.IconFactory;
-import com.android.ide.eclipse.adt.internal.editors.uimodel.UiAbstractTextAttributeNode;
-
-import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.jface.viewers.ILabelProviderListener;
-import org.eclipse.swt.graphics.Image;
-
-/**
- * Label provider for {@link UiAbstractTextAttributeNode}.
- */
-public class AttributeDescriptorLabelProvider implements ILabelProvider {
-
-    private final static AttributeDescriptorLabelProvider sThis =
-        new AttributeDescriptorLabelProvider();
-
-    public static ILabelProvider getProvider() {
-        return sThis;
-    }
-
-    @Override
-    public Image getImage(Object element) {
-        if (element instanceof UiAbstractTextAttributeNode) {
-            UiAbstractTextAttributeNode node = (UiAbstractTextAttributeNode) element;
-            if (node.getDescriptor().isDeprecated()) {
-                String v = node.getCurrentValue();
-                if (v != null && v.length() > 0) {
-                    IconFactory factory = IconFactory.getInstance();
-                    return factory.getIcon("warning"); //$NON-NLS-1$
-                }
-            }
-        }
-
-        return null;
-    }
-
-    @Override
-    public String getText(Object element) {
-        if (element instanceof UiAbstractTextAttributeNode) {
-            return ((UiAbstractTextAttributeNode)element).getCurrentValue();
-        }
-
-        return null;
-    }
-
-    @Override
-    public void addListener(ILabelProviderListener listener) {
-        // TODO Auto-generated method stub
-
-    }
-
-    @Override
-    public void dispose() {
-        // TODO Auto-generated method stub
-
-    }
-
-    @Override
-    public boolean isLabelProperty(Object element, String property) {
-        // TODO Auto-generated method stub
-        return false;
-    }
-
-    @Override
-    public void removeListener(ILabelProviderListener listener) {
-        // TODO Auto-generated method stub
-
-    }
-
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/descriptors/BooleanAttributeDescriptor.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/descriptors/BooleanAttributeDescriptor.java
deleted file mode 100644
index 7d76687..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/descriptors/BooleanAttributeDescriptor.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Copyright (C) 2007 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.editors.descriptors;
-
-import com.android.ide.common.api.IAttributeInfo;
-import com.android.ide.eclipse.adt.internal.editors.uimodel.UiListAttributeNode;
-
-/**
- * Describes a text attribute that can only contain boolean values.
- * It is displayed by a {@link UiListAttributeNode}.
- */
-public class BooleanAttributeDescriptor extends ListAttributeDescriptor {
-    private static final String[] VALUES = new String[] { "true", "false" };  //$NON-NLS-1$ //$NON-NLS-2$
-
-    public BooleanAttributeDescriptor(String xmlLocalName, String nsUri, IAttributeInfo attrInfo) {
-        super(xmlLocalName, nsUri, attrInfo, VALUES);
-    }
-}
-
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/descriptors/DescriptorsUtils.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/descriptors/DescriptorsUtils.java
deleted file mode 100644
index da3a185..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/descriptors/DescriptorsUtils.java
+++ /dev/null
@@ -1,961 +0,0 @@
-/*
- * 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.editors.descriptors;
-
-import static com.android.SdkConstants.ANDROID_URI;
-import static com.android.SdkConstants.ATTR_ID;
-import static com.android.SdkConstants.ATTR_LAYOUT_BELOW;
-import static com.android.SdkConstants.ATTR_LAYOUT_HEIGHT;
-import static com.android.SdkConstants.ATTR_LAYOUT_WIDTH;
-import static com.android.SdkConstants.ATTR_TEXT;
-import static com.android.SdkConstants.EDIT_TEXT;
-import static com.android.SdkConstants.EXPANDABLE_LIST_VIEW;
-import static com.android.SdkConstants.FQCN_ADAPTER_VIEW;
-import static com.android.SdkConstants.GALLERY;
-import static com.android.SdkConstants.GRID_LAYOUT;
-import static com.android.SdkConstants.GRID_VIEW;
-import static com.android.SdkConstants.GT_ENTITY;
-import static com.android.SdkConstants.ID_PREFIX;
-import static com.android.SdkConstants.LIST_VIEW;
-import static com.android.SdkConstants.LT_ENTITY;
-import static com.android.SdkConstants.NEW_ID_PREFIX;
-import static com.android.SdkConstants.RELATIVE_LAYOUT;
-import static com.android.SdkConstants.REQUEST_FOCUS;
-import static com.android.SdkConstants.SPACE;
-import static com.android.SdkConstants.VALUE_FILL_PARENT;
-import static com.android.SdkConstants.VALUE_WRAP_CONTENT;
-import static com.android.SdkConstants.VIEW_INCLUDE;
-import static com.android.SdkConstants.VIEW_MERGE;
-
-import com.android.SdkConstants;
-import com.android.annotations.NonNull;
-import com.android.ide.common.api.IAttributeInfo.Format;
-import com.android.ide.common.resources.platform.AttributeInfo;
-import com.android.ide.eclipse.adt.AdtConstants;
-import com.android.ide.eclipse.adt.internal.editors.uimodel.UiDocumentNode;
-import com.android.ide.eclipse.adt.internal.editors.uimodel.UiElementNode;
-import com.android.resources.ResourceType;
-
-import org.eclipse.swt.graphics.Image;
-
-import java.util.ArrayList;
-import java.util.EnumSet;
-import java.util.HashSet;
-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.Matcher;
-import java.util.regex.Pattern;
-
-
-/**
- * Utility methods related to descriptors handling.
- */
-public final class DescriptorsUtils {
-    private static final String DEFAULT_WIDGET_PREFIX = "widget";
-
-    private static final int JAVADOC_BREAK_LENGTH = 60;
-
-    /**
-     * The path in the online documentation for the manifest description.
-     * <p/>
-     * This is NOT a complete URL. To be used, it needs to be appended
-     * to {@link AdtConstants#CODESITE_BASE_URL} or to the local SDK
-     * documentation.
-     */
-    public static final String MANIFEST_SDK_URL = "/reference/android/R.styleable.html#";  //$NON-NLS-1$
-
-    public static final String IMAGE_KEY = "image"; //$NON-NLS-1$
-
-    private static final String CODE  = "$code";  //$NON-NLS-1$
-    private static final String LINK  = "$link";  //$NON-NLS-1$
-    private static final String ELEM  = "$elem";  //$NON-NLS-1$
-    private static final String BREAK = "$break"; //$NON-NLS-1$
-
-    /**
-     * Add all {@link AttributeInfo} to the the array of {@link AttributeDescriptor}.
-     *
-     * @param attributes The list of {@link AttributeDescriptor} to append to
-     * @param elementXmlName Optional XML local name of the element to which attributes are
-     *              being added. When not null, this is used to filter overrides.
-     * @param nsUri The URI of the attribute. Can be null if attribute has no namespace.
-     *              See {@link SdkConstants#NS_RESOURCES} for a common value.
-     * @param infos The array of {@link AttributeInfo} to read and append to attributes
-     * @param requiredAttributes An optional set of attributes to mark as "required" (i.e. append
-     *        a "*" to their UI name as a hint for the user.) If not null, must contains
-     *        entries in the form "elem-name/attr-name". Elem-name can be "*".
-     * @param overrides A map [attribute name => ITextAttributeCreator creator].
-     */
-    public static void appendAttributes(List<AttributeDescriptor> attributes,
-            String elementXmlName,
-            String nsUri, AttributeInfo[] infos,
-            Set<String> requiredAttributes,
-            Map<String, ITextAttributeCreator> overrides) {
-        for (AttributeInfo info : infos) {
-            boolean required = false;
-            if (requiredAttributes != null) {
-                String attr_name = info.getName();
-                if (requiredAttributes.contains("*/" + attr_name) ||
-                        requiredAttributes.contains(elementXmlName + "/" + attr_name)) {
-                    required = true;
-                }
-            }
-            appendAttribute(attributes, elementXmlName, nsUri, info, required, overrides);
-        }
-    }
-
-    /**
-     * Add an {@link AttributeInfo} to the the array of {@link AttributeDescriptor}.
-     *
-     * @param attributes The list of {@link AttributeDescriptor} to append to
-     * @param elementXmlName Optional XML local name of the element to which attributes are
-     *              being added. When not null, this is used to filter overrides.
-     * @param info The {@link AttributeInfo} to append to attributes
-     * @param nsUri The URI of the attribute. Can be null if attribute has no namespace.
-     *              See {@link SdkConstants#NS_RESOURCES} for a common value.
-     * @param required True if the attribute is to be marked as "required" (i.e. append
-     *        a "*" to its UI name as a hint for the user.)
-     * @param overrides A map [attribute name => ITextAttributeCreator creator].
-     */
-    public static void appendAttribute(List<AttributeDescriptor> attributes,
-            String elementXmlName,
-            String nsUri,
-            AttributeInfo info, boolean required,
-            Map<String, ITextAttributeCreator> overrides) {
-        TextAttributeDescriptor attr = null;
-
-        String xmlLocalName = info.getName();
-
-        // Add the known types to the tooltip
-        EnumSet<Format> formats_set = info.getFormats();
-        int flen = formats_set.size();
-        if (flen > 0) {
-            // Create a specialized attribute if we can
-            if (overrides != null) {
-                for (Entry<String, ITextAttributeCreator> entry: overrides.entrySet()) {
-                    // The override key can have the following formats:
-                    //   */xmlLocalName
-                    //   element/xmlLocalName
-                    //   element1,element2,...,elementN/xmlLocalName
-                    String key = entry.getKey();
-                    String elements[] = key.split("/");          //$NON-NLS-1$
-                    String overrideAttrLocalName = null;
-                    if (elements.length < 1) {
-                        continue;
-                    } else if (elements.length == 1) {
-                        overrideAttrLocalName = elements[0];
-                        elements = null;
-                    } else {
-                        overrideAttrLocalName = elements[elements.length - 1];
-                        elements = elements[0].split(",");       //$NON-NLS-1$
-                    }
-
-                    if (overrideAttrLocalName == null ||
-                            !overrideAttrLocalName.equals(xmlLocalName)) {
-                        continue;
-                    }
-
-                    boolean ok_element = elements != null && elements.length < 1;
-                    if (!ok_element && elements != null) {
-                        for (String element : elements) {
-                            if (element.equals("*")              //$NON-NLS-1$
-                                    || element.equals(elementXmlName)) {
-                                ok_element = true;
-                                break;
-                            }
-                        }
-                    }
-
-                    if (!ok_element) {
-                        continue;
-                    }
-
-                    ITextAttributeCreator override = entry.getValue();
-                    if (override != null) {
-                        attr = override.create(xmlLocalName, nsUri, info);
-                    }
-                }
-            } // if overrides
-
-            // Create a specialized descriptor if we can, based on type
-            if (attr == null) {
-                if (formats_set.contains(Format.REFERENCE)) {
-                    // This is either a multi-type reference or a generic reference.
-                    attr = new ReferenceAttributeDescriptor(
-                            xmlLocalName, nsUri, info);
-                } else if (formats_set.contains(Format.ENUM)) {
-                    attr = new ListAttributeDescriptor(
-                            xmlLocalName, nsUri, info);
-                } else if (formats_set.contains(Format.FLAG)) {
-                    attr = new FlagAttributeDescriptor(
-                            xmlLocalName, nsUri, info);
-                } else if (formats_set.contains(Format.BOOLEAN)) {
-                    attr = new BooleanAttributeDescriptor(
-                            xmlLocalName, nsUri, info);
-                } else if (formats_set.contains(Format.STRING)) {
-                    attr = new ReferenceAttributeDescriptor(
-                            ResourceType.STRING, xmlLocalName, nsUri, info);
-                }
-            }
-        }
-
-        // By default a simple text field is used
-        if (attr == null) {
-            attr = new TextAttributeDescriptor(xmlLocalName, nsUri, info);
-        }
-
-        if (required) {
-            attr.setRequired(true);
-        }
-
-        attributes.add(attr);
-    }
-
-    /**
-     * Indicates the the given {@link AttributeInfo} already exists in the ArrayList of
-     * {@link AttributeDescriptor}. This test for the presence of a descriptor with the same
-     * XML name.
-     *
-     * @param attributes The list of {@link AttributeDescriptor} to compare to.
-     * @param nsUri The URI of the attribute. Can be null if attribute has no namespace.
-     *              See {@link SdkConstants#NS_RESOURCES} for a common value.
-     * @param info The {@link AttributeInfo} to know whether it is included in the above list.
-     * @return True if this {@link AttributeInfo} is already present in
-     *         the {@link AttributeDescriptor} list.
-     */
-    public static boolean containsAttribute(ArrayList<AttributeDescriptor> attributes,
-            String nsUri,
-            AttributeInfo info) {
-        String xmlLocalName = info.getName();
-        for (AttributeDescriptor desc : attributes) {
-            if (desc.getXmlLocalName().equals(xmlLocalName)) {
-                if (nsUri == desc.getNamespaceUri() ||
-                        (nsUri != null && nsUri.equals(desc.getNamespaceUri()))) {
-                    return true;
-                }
-            }
-        }
-        return false;
-    }
-
-    /**
-     * Create a pretty attribute UI name from an XML name.
-     * <p/>
-     * The original xml name starts with a lower case and is camel-case,
-     * e.g. "maxWidthForView". The pretty name starts with an upper case
-     * and has space separators, e.g. "Max width for view".
-     */
-    public static String prettyAttributeUiName(String name) {
-        if (name.length() < 1) {
-            return name;
-        }
-        StringBuilder buf = new StringBuilder(2 * name.length());
-
-        char c = name.charAt(0);
-        // Use upper case initial letter
-        buf.append(Character.toUpperCase(c));
-        int len = name.length();
-        for (int i = 1; i < len; i++) {
-            c = name.charAt(i);
-            if (Character.isUpperCase(c)) {
-                // Break camel case into separate words
-                buf.append(' ');
-                // Use a lower case initial letter for the next word, except if the
-                // word is solely X, Y or Z.
-                if (c >= 'X' && c <= 'Z' &&
-                        (i == len-1 ||
-                            (i < len-1 && Character.isUpperCase(name.charAt(i+1))))) {
-                    buf.append(c);
-                } else {
-                    buf.append(Character.toLowerCase(c));
-                }
-            } else if (c == '_') {
-                buf.append(' ');
-            } else {
-                buf.append(c);
-            }
-        }
-
-        name = buf.toString();
-
-        name = replaceAcronyms(name);
-
-        return name;
-    }
-
-    /**
-     * Similar to {@link #prettyAttributeUiName(String)}, but it will capitalize
-     * all words, not just the first one.
-     * <p/>
-     * The original xml name starts with a lower case and is camel-case, e.g.
-     * "maxWidthForView". The corresponding return value is
-     * "Max Width For View".
-     *
-     * @param name the attribute name, which should be a camel case name, e.g.
-     *            "maxWidth"
-     * @return the corresponding display name, e.g. "Max Width"
-     */
-    @NonNull
-    public static String capitalize(@NonNull String name) {
-        if (name.isEmpty()) {
-            return name;
-        }
-        StringBuilder buf = new StringBuilder(2 * name.length());
-
-        char c = name.charAt(0);
-        // Use upper case initial letter
-        buf.append(Character.toUpperCase(c));
-        int len = name.length();
-        for (int i = 1; i < len; i++) {
-            c = name.charAt(i);
-            if (Character.isUpperCase(c)) {
-                // Break camel case into separate words
-                buf.append(' ');
-                // Use a lower case initial letter for the next word, except if the
-                // word is solely X, Y or Z.
-                buf.append(c);
-            } else if (c == '_') {
-                buf.append(' ');
-                if (i < len -1 && Character.isLowerCase(name.charAt(i + 1))) {
-                    buf.append(Character.toUpperCase(name.charAt(i + 1)));
-                    i++;
-                }
-            } else {
-                buf.append(c);
-            }
-        }
-
-        name = buf.toString();
-
-        name = replaceAcronyms(name);
-
-        return name;
-    }
-
-    private static String replaceAcronyms(String name) {
-        // Replace these acronyms by upper-case versions
-        // - (?<=^| ) means "if preceded by a space or beginning of string"
-        // - (?=$| )  means "if followed by a space or end of string"
-        if (name.contains("sdk") || name.contains("Sdk")) {
-            name = name.replaceAll("(?<=^| )[sS]dk(?=$| )", "SDK");
-        }
-        if (name.contains("uri") || name.contains("Uri")) {
-            name = name.replaceAll("(?<=^| )[uU]ri(?=$| )", "URI");
-        }
-        if (name.contains("ime") || name.contains("Ime")) {
-            name = name.replaceAll("(?<=^| )[iI]me(?=$| )", "IME");
-        }
-        if (name.contains("vm") || name.contains("Vm")) {
-            name = name.replaceAll("(?<=^| )[vV]m(?=$| )", "VM");
-        }
-        if (name.contains("ui") || name.contains("Ui")) {
-            name = name.replaceAll("(?<=^| )[uU]i(?=$| )", "UI");
-        }
-        return name;
-    }
-
-    /**
-     * Formats the javadoc tooltip to be usable in a tooltip.
-     */
-    public static String formatTooltip(String javadoc) {
-        ArrayList<String> spans = scanJavadoc(javadoc);
-
-        StringBuilder sb = new StringBuilder();
-        boolean needBreak = false;
-
-        for (int n = spans.size(), i = 0; i < n; ++i) {
-            String s = spans.get(i);
-            if (CODE.equals(s)) {
-                s = spans.get(++i);
-                if (s != null) {
-                    sb.append('"').append(s).append('"');
-                }
-            } else if (LINK.equals(s)) {
-                String base   = spans.get(++i);
-                String anchor = spans.get(++i);
-                String text   = spans.get(++i);
-
-                if (base != null) {
-                    base = base.trim();
-                }
-                if (anchor != null) {
-                    anchor = anchor.trim();
-                }
-                if (text != null) {
-                    text = text.trim();
-                }
-
-                // If there's no text, use the anchor if there's one
-                if (text == null || text.length() == 0) {
-                    text = anchor;
-                }
-
-                if (base != null && base.length() > 0) {
-                    if (text == null || text.length() == 0) {
-                        // If we still have no text, use the base as text
-                        text = base;
-                    }
-                }
-
-                if (text != null) {
-                    sb.append(text);
-                }
-
-            } else if (ELEM.equals(s)) {
-                s = spans.get(++i);
-                if (s != null) {
-                    sb.append(s);
-                }
-            } else if (BREAK.equals(s)) {
-                needBreak = true;
-            } else if (s != null) {
-                if (needBreak && s.trim().length() > 0) {
-                    sb.append('\n');
-                }
-                sb.append(s);
-                needBreak = false;
-            }
-        }
-
-        return sb.toString();
-    }
-
-    /**
-     * Formats the javadoc tooltip to be usable in a FormText.
-     * <p/>
-     * If the descriptor can provide an icon, the caller should provide
-     * elementsDescriptor.getIcon() as "image" to FormText, e.g.:
-     * <code>formText.setImage(IMAGE_KEY, elementsDescriptor.getIcon());</code>
-     *
-     * @param javadoc The javadoc to format. Cannot be null.
-     * @param elementDescriptor The element descriptor parent of the javadoc. Cannot be null.
-     * @param androidDocBaseUrl The base URL for the documentation. Cannot be null. Should be
-     *   <code>FrameworkResourceManager.getInstance().getDocumentationBaseUrl()</code>
-     */
-    public static String formatFormText(String javadoc,
-            ElementDescriptor elementDescriptor,
-            String androidDocBaseUrl) {
-        ArrayList<String> spans = scanJavadoc(javadoc);
-
-        String fullSdkUrl = androidDocBaseUrl + MANIFEST_SDK_URL;
-        String sdkUrl = elementDescriptor.getSdkUrl();
-        if (sdkUrl != null && sdkUrl.startsWith(MANIFEST_SDK_URL)) {
-            fullSdkUrl = androidDocBaseUrl + sdkUrl;
-        }
-
-        StringBuilder sb = new StringBuilder();
-
-        Image icon = elementDescriptor.getCustomizedIcon();
-        if (icon != null) {
-            sb.append("<form><li style=\"image\" value=\"" +        //$NON-NLS-1$
-                    IMAGE_KEY + "\">");                             //$NON-NLS-1$
-        } else {
-            sb.append("<form><p>");                                 //$NON-NLS-1$
-        }
-
-        for (int n = spans.size(), i = 0; i < n; ++i) {
-            String s = spans.get(i);
-            if (CODE.equals(s)) {
-                s = spans.get(++i);
-                if (elementDescriptor.getXmlName().equals(s) && fullSdkUrl != null) {
-                    sb.append("<a href=\"");                        //$NON-NLS-1$
-                    sb.append(fullSdkUrl);
-                    sb.append("\">");                               //$NON-NLS-1$
-                    sb.append(s);
-                    sb.append("</a>");                              //$NON-NLS-1$
-                } else if (s != null) {
-                    sb.append('"').append(s).append('"');
-                }
-            } else if (LINK.equals(s)) {
-                String base   = spans.get(++i);
-                String anchor = spans.get(++i);
-                String text   = spans.get(++i);
-
-                if (base != null) {
-                    base = base.trim();
-                }
-                if (anchor != null) {
-                    anchor = anchor.trim();
-                }
-                if (text != null) {
-                    text = text.trim();
-                }
-
-                // If there's no text, use the anchor if there's one
-                if (text == null || text.length() == 0) {
-                    text = anchor;
-                }
-
-                // TODO specialize with a base URL for views, menus & other resources
-                // Base is empty for a local page anchor, in which case we'll replace it
-                // by the element SDK URL if it exists.
-                if ((base == null || base.length() == 0) && fullSdkUrl != null) {
-                    base = fullSdkUrl;
-                }
-
-                String url = null;
-                if (base != null && base.length() > 0) {
-                    if (base.startsWith("http")) {                  //$NON-NLS-1$
-                        // If base looks an URL, use it, with the optional anchor
-                        url = base;
-                        if (anchor != null && anchor.length() > 0) {
-                            // If the base URL already has an anchor, it needs to be
-                            // removed first. If there's no anchor, we need to add "#"
-                            int pos = url.lastIndexOf('#');
-                            if (pos < 0) {
-                                url += "#";                         //$NON-NLS-1$
-                            } else if (pos < url.length() - 1) {
-                                url = url.substring(0, pos + 1);
-                            }
-
-                            url += anchor;
-                        }
-                    } else if (text == null || text.length() == 0) {
-                        // If we still have no text, use the base as text
-                        text = base;
-                    }
-                }
-
-                if (url != null && text != null) {
-                    sb.append("<a href=\"");                        //$NON-NLS-1$
-                    sb.append(url);
-                    sb.append("\">");                               //$NON-NLS-1$
-                    sb.append(text);
-                    sb.append("</a>");                              //$NON-NLS-1$
-                } else if (text != null) {
-                    sb.append("<b>").append(text).append("</b>");   //$NON-NLS-1$ //$NON-NLS-2$
-                }
-
-            } else if (ELEM.equals(s)) {
-                s = spans.get(++i);
-                if (sdkUrl != null && s != null) {
-                    sb.append("<a href=\"");                        //$NON-NLS-1$
-                    sb.append(sdkUrl);
-                    sb.append("\">");                               //$NON-NLS-1$
-                    sb.append(s);
-                    sb.append("</a>");                              //$NON-NLS-1$
-                } else if (s != null) {
-                    sb.append("<b>").append(s).append("</b>");      //$NON-NLS-1$ //$NON-NLS-2$
-                }
-            } else if (BREAK.equals(s)) {
-                // ignore line breaks in pseudo-HTML rendering
-            } else if (s != null) {
-                sb.append(s);
-            }
-        }
-
-        if (icon != null) {
-            sb.append("</li></form>");                              //$NON-NLS-1$
-        } else {
-            sb.append("</p></form>");                               //$NON-NLS-1$
-        }
-        return sb.toString();
-    }
-
-    private static ArrayList<String> scanJavadoc(String javadoc) {
-        ArrayList<String> spans = new ArrayList<String>();
-
-        // Standardize all whitespace in the javadoc to single spaces.
-        if (javadoc != null) {
-            javadoc = javadoc.replaceAll("[ \t\f\r\n]+", " "); //$NON-NLS-1$ //$NON-NLS-2$
-        }
-
-        // Detects {@link <base>#<name> <text>} where all 3 are optional
-        Pattern p_link = Pattern.compile("\\{@link\\s+([^#\\}\\s]*)(?:#([^\\s\\}]*))?(?:\\s*([^\\}]*))?\\}(.*)"); //$NON-NLS-1$
-        // Detects <code>blah</code>
-        Pattern p_code = Pattern.compile("<code>(.+?)</code>(.*)");                 //$NON-NLS-1$
-        // Detects @blah@, used in hard-coded tooltip descriptors
-        Pattern p_elem = Pattern.compile("@([\\w -]+)@(.*)");                       //$NON-NLS-1$
-        // Detects a buffer that starts by @@ (request for a break)
-        Pattern p_break = Pattern.compile("@@(.*)");                                //$NON-NLS-1$
-        // Detects a buffer that starts by @ < or { (one that was not matched above)
-        Pattern p_open = Pattern.compile("([@<\\{])(.*)");                          //$NON-NLS-1$
-        // Detects everything till the next potential separator, i.e. @ < or {
-        Pattern p_text = Pattern.compile("([^@<\\{]+)(.*)");                        //$NON-NLS-1$
-
-        int currentLength = 0;
-        String text = null;
-
-        while(javadoc != null && javadoc.length() > 0) {
-            Matcher m;
-            String s = null;
-            if ((m = p_code.matcher(javadoc)).matches()) {
-                spans.add(CODE);
-                spans.add(text = cleanupJavadocHtml(m.group(1))); // <code> text
-                javadoc = m.group(2);
-                if (text != null) {
-                    currentLength += text.length();
-                }
-            } else if ((m = p_link.matcher(javadoc)).matches()) {
-                spans.add(LINK);
-                spans.add(m.group(1)); // @link base
-                spans.add(m.group(2)); // @link anchor
-                spans.add(text = cleanupJavadocHtml(m.group(3))); // @link text
-                javadoc = m.group(4);
-                if (text != null) {
-                    currentLength += text.length();
-                }
-            } else if ((m = p_elem.matcher(javadoc)).matches()) {
-                spans.add(ELEM);
-                spans.add(text = cleanupJavadocHtml(m.group(1))); // @text@
-                javadoc = m.group(2);
-                if (text != null) {
-                    currentLength += text.length() - 2;
-                }
-            } else if ((m = p_break.matcher(javadoc)).matches()) {
-                spans.add(BREAK);
-                currentLength = 0;
-                javadoc = m.group(1);
-            } else if ((m = p_open.matcher(javadoc)).matches()) {
-                s = m.group(1);
-                javadoc = m.group(2);
-            } else if ((m = p_text.matcher(javadoc)).matches()) {
-                s = m.group(1);
-                javadoc = m.group(2);
-            } else {
-                // This is not supposed to happen. In case of, just use everything.
-                s = javadoc;
-                javadoc = null;
-            }
-            if (s != null && s.length() > 0) {
-                s = cleanupJavadocHtml(s);
-
-                if (currentLength >= JAVADOC_BREAK_LENGTH) {
-                    spans.add(BREAK);
-                    currentLength = 0;
-                }
-                while (currentLength + s.length() > JAVADOC_BREAK_LENGTH) {
-                    int pos = s.indexOf(' ', JAVADOC_BREAK_LENGTH - currentLength);
-                    if (pos <= 0) {
-                        break;
-                    }
-                    spans.add(s.substring(0, pos + 1));
-                    spans.add(BREAK);
-                    currentLength = 0;
-                    s = s.substring(pos + 1);
-                }
-
-                spans.add(s);
-                currentLength += s.length();
-            }
-        }
-
-        return spans;
-    }
-
-    /**
-     * Remove anything that looks like HTML from a javadoc snippet, as it is supported
-     * neither by FormText nor a standard text tooltip.
-     */
-    private static String cleanupJavadocHtml(String s) {
-        if (s != null) {
-            s = s.replaceAll(LT_ENTITY, "\"");     //$NON-NLS-1$ $NON-NLS-2$
-            s = s.replaceAll(GT_ENTITY, "\"");     //$NON-NLS-1$ $NON-NLS-2$
-            s = s.replaceAll("<[^>]+>", "");    //$NON-NLS-1$ $NON-NLS-2$
-        }
-        return s;
-    }
-
-    /**
-     * Returns the basename for the given fully qualified class name. It is okay to pass
-     * a basename to this method which will just be returned back.
-     *
-     * @param fqcn The fully qualified class name to convert
-     * @return the basename of the class name
-     */
-    public static String getBasename(String fqcn) {
-        String name = fqcn;
-        int lastDot = name.lastIndexOf('.');
-        if (lastDot != -1) {
-            name = name.substring(lastDot + 1);
-        }
-
-        return name;
-    }
-
-    /**
-     * Sets the default layout attributes for the a new UiElementNode.
-     * <p/>
-     * Note that ideally the node should already be part of a hierarchy so that its
-     * parent layout and previous sibling can be determined, if any.
-     * <p/>
-     * This does not override attributes which are not empty.
-     */
-    public static void setDefaultLayoutAttributes(UiElementNode node, boolean updateLayout) {
-        // if this ui_node is a layout and we're adding it to a document, use match_parent for
-        // both W/H. Otherwise default to wrap_layout.
-        ElementDescriptor descriptor = node.getDescriptor();
-
-        String name = descriptor.getXmlLocalName();
-        if (name.equals(REQUEST_FOCUS)) {
-            // Don't add ids, widths and heights etc to <requestFocus>
-            return;
-        }
-
-        // Width and height are mandatory in all layouts except GridLayout
-        boolean setSize = !node.getUiParent().getDescriptor().getXmlName().equals(GRID_LAYOUT);
-        if (setSize) {
-            boolean fill = descriptor.hasChildren() &&
-                           node.getUiParent() instanceof UiDocumentNode;
-            node.setAttributeValue(
-                    ATTR_LAYOUT_WIDTH,
-                    ANDROID_URI,
-                    fill ? VALUE_FILL_PARENT : VALUE_WRAP_CONTENT,
-                    false /* override */);
-            node.setAttributeValue(
-                    ATTR_LAYOUT_HEIGHT,
-                    ANDROID_URI,
-                    fill ? VALUE_FILL_PARENT : VALUE_WRAP_CONTENT,
-                    false /* override */);
-        }
-
-        if (needsDefaultId(node.getDescriptor())) {
-            String freeId = getFreeWidgetId(node);
-            if (freeId != null) {
-                node.setAttributeValue(
-                        ATTR_ID,
-                        ANDROID_URI,
-                        freeId,
-                        false /* override */);
-            }
-        }
-
-        // Set a text attribute on textual widgets -- but only on those that define a text
-        // attribute
-        if (descriptor.definesAttribute(ANDROID_URI, ATTR_TEXT)
-                // Don't set default text value into edit texts - they typically start out blank
-                && !descriptor.getXmlLocalName().equals(EDIT_TEXT)) {
-            String type = getBasename(descriptor.getUiName());
-            node.setAttributeValue(
-                ATTR_TEXT,
-                ANDROID_URI,
-                type,
-                false /*override*/);
-        }
-
-        if (updateLayout) {
-            UiElementNode parent = node.getUiParent();
-            if (parent != null &&
-                    parent.getDescriptor().getXmlLocalName().equals(
-                            RELATIVE_LAYOUT)) {
-                UiElementNode previous = node.getUiPreviousSibling();
-                if (previous != null) {
-                    String id = previous.getAttributeValue(ATTR_ID);
-                    if (id != null && id.length() > 0) {
-                        id = id.replace("@+", "@");                     //$NON-NLS-1$ //$NON-NLS-2$
-                        node.setAttributeValue(
-                                ATTR_LAYOUT_BELOW,
-                                ANDROID_URI,
-                                id,
-                                false /* override */);
-                    }
-                }
-            }
-        }
-    }
-
-    /**
-     * Determines whether new views of the given type should be assigned a
-     * default id.
-     *
-     * @param descriptor a descriptor describing the view to look up
-     * @return true if new views of the given type should be assigned a default
-     *         id
-     */
-    public static boolean needsDefaultId(ElementDescriptor descriptor) {
-        // By default, layouts do not need ids.
-        String tag = descriptor.getXmlLocalName();
-        if (tag.endsWith("Layout")  //$NON-NLS-1$
-                || tag.equals(VIEW_INCLUDE)
-                || tag.equals(VIEW_MERGE)
-                || tag.equals(SPACE)
-                || tag.endsWith(SPACE) && tag.length() > SPACE.length() &&
-                    tag.charAt(tag.length() - SPACE.length()) == '.') {
-            return false;
-        }
-
-        return true;
-    }
-
-    /**
-     * Given a UI node, returns the first available id that matches the
-     * pattern "prefix%d".
-     * <p/>TabWidget is a special case and the method will always return "@android:id/tabs".
-     *
-     * @param uiNode The UI node that gives the prefix to match.
-     * @return A suitable generated id in the attribute form needed by the XML id tag
-     * (e.g. "@+id/something")
-     */
-    public static String getFreeWidgetId(UiElementNode uiNode) {
-        String name = getBasename(uiNode.getDescriptor().getXmlLocalName());
-        return getFreeWidgetId(uiNode.getUiRoot(), name);
-    }
-
-    /**
-     * Given a UI root node and a potential XML node name, returns the first available
-     * id that matches the pattern "prefix%d".
-     * <p/>TabWidget is a special case and the method will always return "@android:id/tabs".
-     *
-     * @param uiRoot The root UI node to search for name conflicts from
-     * @param name The XML node prefix name to look for
-     * @return A suitable generated id in the attribute form needed by the XML id tag
-     * (e.g. "@+id/something")
-     */
-    public static String getFreeWidgetId(UiElementNode uiRoot, String name) {
-        if ("TabWidget".equals(name)) {                        //$NON-NLS-1$
-            return "@android:id/tabs";                         //$NON-NLS-1$
-        }
-
-        return NEW_ID_PREFIX + getFreeWidgetId(uiRoot,
-                new Object[] { name, null, null, null });
-    }
-
-    /**
-     * Given a UI root node, returns the first available id that matches the
-     * pattern "prefix%d".
-     *
-     * For recursion purposes, a "context" is given. Since Java doesn't have in-out parameters
-     * in methods and we're not going to do a dedicated type, we just use an object array which
-     * must contain one initial item and several are built on the fly just for internal storage:
-     * <ul>
-     * <li> prefix(String): The prefix of the generated id, i.e. "widget". Cannot be null.
-     * <li> index(Integer): The minimum index of the generated id. Must start with null.
-     * <li> generated(String): The generated widget currently being searched. Must start with null.
-     * <li> map(Set<String>): A set of the ids collected so far when walking through the widget
-     *                        hierarchy. Must start with null.
-     * </ul>
-     *
-     * @param uiRoot The Ui root node where to start searching recursively. For the initial call
-     *               you want to pass the document root.
-     * @param params An in-out context of parameters used during recursion, as explained above.
-     * @return A suitable generated id
-     */
-    @SuppressWarnings("unchecked")
-    private static String getFreeWidgetId(UiElementNode uiRoot,
-            Object[] params) {
-
-        Set<String> map = (Set<String>)params[3];
-        if (map == null) {
-            params[3] = map = new HashSet<String>();
-        }
-
-        int num = params[1] == null ? 0 : ((Integer)params[1]).intValue();
-
-        String generated = (String) params[2];
-        String prefix = (String) params[0];
-        if (generated == null) {
-            int pos = prefix.indexOf('.');
-            if (pos >= 0) {
-                prefix = prefix.substring(pos + 1);
-            }
-            pos = prefix.indexOf('$');
-            if (pos >= 0) {
-                prefix = prefix.substring(pos + 1);
-            }
-            prefix = prefix.replaceAll("[^a-zA-Z]", "");                //$NON-NLS-1$ $NON-NLS-2$
-            if (prefix.length() == 0) {
-                prefix = DEFAULT_WIDGET_PREFIX;
-            } else {
-                // Lowercase initial character
-                prefix = Character.toLowerCase(prefix.charAt(0)) + prefix.substring(1);
-            }
-
-            // Note that we perform locale-independent lowercase checks; in "Image" we
-            // want the lowercase version to be "image", not "?mage" where ? is
-            // the char LATIN SMALL LETTER DOTLESS I.
-            do {
-                num++;
-                generated = String.format("%1$s%2$d", prefix, num);   //$NON-NLS-1$
-            } while (map.contains(generated.toLowerCase(Locale.US)));
-
-            params[0] = prefix;
-            params[1] = num;
-            params[2] = generated;
-        }
-
-        String id = uiRoot.getAttributeValue(ATTR_ID);
-        if (id != null) {
-            id = id.replace(NEW_ID_PREFIX, "");                            //$NON-NLS-1$
-            id = id.replace(ID_PREFIX, "");                                //$NON-NLS-1$
-            if (map.add(id.toLowerCase(Locale.US))
-                    && map.contains(generated.toLowerCase(Locale.US))) {
-
-                do {
-                    num++;
-                    generated = String.format("%1$s%2$d", prefix, num);   //$NON-NLS-1$
-                } while (map.contains(generated.toLowerCase(Locale.US)));
-
-                params[1] = num;
-                params[2] = generated;
-            }
-        }
-
-        for (UiElementNode uiChild : uiRoot.getUiChildren()) {
-            getFreeWidgetId(uiChild, params);
-        }
-
-        // Note: return params[2] (not "generated") since it could have changed during recursion.
-        return (String) params[2];
-    }
-
-    /**
-     * Returns true if the given descriptor represents a view that not only can have
-     * children but which allows us to <b>insert</b> children. Some views, such as
-     * ListView (and in general all AdapterViews), disallow children to be inserted except
-     * through the dedicated AdapterView interface to do it.
-     *
-     * @param descriptor the descriptor for the view in question
-     * @param viewObject an actual instance of the view, or null if not available
-     * @return true if the descriptor describes a view which allows insertion of child
-     *         views
-     */
-    public static boolean canInsertChildren(ElementDescriptor descriptor, Object viewObject) {
-        if (descriptor.hasChildren()) {
-            if (viewObject != null) {
-                // We have a view object; see if it derives from an AdapterView
-                Class<?> clz = viewObject.getClass();
-                while (clz != null) {
-                    if (clz.getName().equals(FQCN_ADAPTER_VIEW)) {
-                        return false;
-                    }
-                    clz = clz.getSuperclass();
-                }
-            } else {
-                // No view object, so we can't easily look up the class and determine
-                // whether it's an AdapterView; instead, look at the fixed list of builtin
-                // concrete subclasses of AdapterView
-                String viewName = descriptor.getXmlLocalName();
-                if (viewName.equals(LIST_VIEW) || viewName.equals(EXPANDABLE_LIST_VIEW)
-                        || viewName.equals(GALLERY) || viewName.equals(GRID_VIEW)) {
-
-                    // We should really also enforce that
-                    // XmlUtils.ANDROID_URI.equals(descriptor.getNameSpace())
-                    // here and if not, return true, but it turns out the getNameSpace()
-                    // for elements are often "".
-
-                    return false;
-                }
-            }
-
-            return true;
-        }
-
-        return false;
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/descriptors/DocumentDescriptor.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/descriptors/DocumentDescriptor.java
deleted file mode 100644
index 6953278..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/descriptors/DocumentDescriptor.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * 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.editors.descriptors;
-
-import com.android.ide.eclipse.adt.internal.editors.uimodel.UiDocumentNode;
-import com.android.ide.eclipse.adt.internal.editors.uimodel.UiElementNode;
-
-/**
- * {@link DocumentDescriptor} describes the properties expected for an XML document node.
- *
- * Compared to ElementDescriptor, {@link DocumentDescriptor} does not have XML name nor UI name,
- * tooltip, SDK url and attributes list.
- * <p/>
- * It has a children list which represent all the possible roots of the document.
- * <p/>
- * The document nodes are "mandatory", meaning the UI node is never deleted and it may lack
- * an actual XML node attached.
- */
-public class DocumentDescriptor extends ElementDescriptor {
-
-    /**
-     * Constructs a new {@link DocumentDescriptor} based on its XML name and children list.
-     * The UI name is build by capitalizing the XML name.
-     * The UI nodes will be non-mandatory.
-     * <p/>
-     * The XML name is never shown in the UI directly. It is however used when an icon
-     * needs to be found for the node.
-     *
-     * @param xml_name The XML element node name. Case sensitive.
-     * @param children The list of allowed children. Can be null or empty.
-     */
-    public DocumentDescriptor(String xml_name, ElementDescriptor[] children) {
-        super(xml_name, children, Mandatory.MANDATORY);
-    }
-
-    /**
-     * @return A new {@link UiElementNode} linked to this descriptor.
-     */
-    @Override
-    public UiElementNode createUiNode() {
-        return new UiDocumentNode(this);
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/descriptors/ElementDescriptor.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/descriptors/ElementDescriptor.java
deleted file mode 100644
index 0d62ec0..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/descriptors/ElementDescriptor.java
+++ /dev/null
@@ -1,485 +0,0 @@
-/*
- * Copyright (C) 2007 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.editors.descriptors;
-
-import static com.android.SdkConstants.ANDROID_NS_NAME_PREFIX;
-import static com.android.SdkConstants.ANDROID_URI;
-
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.ide.eclipse.adt.internal.editors.IconFactory;
-import com.android.ide.eclipse.adt.internal.editors.uimodel.UiElementNode;
-
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.swt.graphics.Image;
-
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.Set;
-
-/**
- * {@link ElementDescriptor} describes the properties expected for a given XML element node.
- *
- * {@link ElementDescriptor} have an XML name, UI name, a tooltip, an SDK url,
- * an attributes list and a children list.
- *
- * An UI node can be "mandatory", meaning the UI node is never deleted and it may lack
- * an actual XML node attached. A non-mandatory UI node MUST have an XML node attached
- * and it will cease to exist when the XML node ceases to exist.
- */
-public class ElementDescriptor implements Comparable<ElementDescriptor> {
-    private static final String ELEMENT_ICON_FILENAME = "element"; //$NON-NLS-1$
-
-    /** The XML element node name. Case sensitive. */
-    protected final String mXmlName;
-    /** The XML element name for the user interface, typically capitalized. */
-    private final String mUiName;
-    /** The list of allowed attributes. */
-    private AttributeDescriptor[] mAttributes;
-    /** The list of allowed children */
-    private ElementDescriptor[] mChildren;
-    /* An optional tooltip. Can be empty. */
-    private String mTooltip;
-    /** An optional SKD URL. Can be empty. */
-    private String mSdkUrl;
-    /** Whether this UI node must always exist (even for empty models). */
-    private final Mandatory mMandatory;
-
-    public enum Mandatory {
-        NOT_MANDATORY,
-        MANDATORY,
-        MANDATORY_LAST
-    }
-
-    /**
-     * Constructs a new {@link ElementDescriptor} based on its XML name, UI name,
-     * tooltip, SDK url, attributes list, children list and mandatory.
-     *
-     * @param xml_name The XML element node name. Case sensitive.
-     * @param ui_name The XML element name for the user interface, typically capitalized.
-     * @param tooltip An optional tooltip. Can be null or empty.
-     * @param sdk_url An optional SKD URL. Can be null or empty.
-     * @param attributes The list of allowed attributes. Can be null or empty.
-     * @param children The list of allowed children. Can be null or empty.
-     * @param mandatory Whether this node must always exist (even for empty models). A mandatory
-     *  UI node is never deleted and it may lack an actual XML node attached. A non-mandatory
-     *  UI node MUST have an XML node attached and it will cease to exist when the XML node
-     *  ceases to exist.
-     */
-    public ElementDescriptor(String xml_name, String ui_name, String tooltip, String sdk_url,
-            AttributeDescriptor[] attributes,
-            ElementDescriptor[] children,
-            Mandatory mandatory) {
-        mMandatory = mandatory;
-        mXmlName = xml_name;
-        mUiName = ui_name;
-        mTooltip = (tooltip != null && tooltip.length() > 0) ? tooltip : null;
-        mSdkUrl = (sdk_url != null && sdk_url.length() > 0) ? sdk_url : null;
-        setAttributes(attributes != null ? attributes : new AttributeDescriptor[]{});
-        mChildren = children != null ? children : new ElementDescriptor[]{};
-    }
-
-    /**
-     * Constructs a new {@link ElementDescriptor} based on its XML name, UI name,
-     * tooltip, SDK url, attributes list, children list and mandatory.
-     *
-     * @param xml_name The XML element node name. Case sensitive.
-     * @param ui_name The XML element name for the user interface, typically capitalized.
-     * @param tooltip An optional tooltip. Can be null or empty.
-     * @param sdk_url An optional SKD URL. Can be null or empty.
-     * @param attributes The list of allowed attributes. Can be null or empty.
-     * @param children The list of allowed children. Can be null or empty.
-     * @param mandatory Whether this node must always exist (even for empty models). A mandatory
-     *  UI node is never deleted and it may lack an actual XML node attached. A non-mandatory
-     *  UI node MUST have an XML node attached and it will cease to exist when the XML node
-     *  ceases to exist.
-     */
-    public ElementDescriptor(String xml_name, String ui_name, String tooltip, String sdk_url,
-            AttributeDescriptor[] attributes,
-            ElementDescriptor[] children,
-            boolean mandatory) {
-        mMandatory = mandatory ? Mandatory.MANDATORY : Mandatory.NOT_MANDATORY;
-        mXmlName = xml_name;
-        mUiName = ui_name;
-        mTooltip = (tooltip != null && tooltip.length() > 0) ? tooltip : null;
-        mSdkUrl = (sdk_url != null && sdk_url.length() > 0) ? sdk_url : null;
-        setAttributes(attributes != null ? attributes : new AttributeDescriptor[]{});
-        mChildren = children != null ? children : new ElementDescriptor[]{};
-    }
-
-    /**
-     * Constructs a new {@link ElementDescriptor} based on its XML name and children list.
-     * The UI name is build by capitalizing the XML name.
-     * The UI nodes will be non-mandatory.
-     *
-     * @param xml_name The XML element node name. Case sensitive.
-     * @param children The list of allowed children. Can be null or empty.
-     * @param mandatory Whether this node must always exist (even for empty models). A mandatory
-     *  UI node is never deleted and it may lack an actual XML node attached. A non-mandatory
-     *  UI node MUST have an XML node attached and it will cease to exist when the XML node
-     *  ceases to exist.
-     */
-    public ElementDescriptor(String xml_name, ElementDescriptor[] children, Mandatory mandatory) {
-        this(xml_name, prettyName(xml_name), null, null, null, children, mandatory);
-    }
-
-    /**
-     * Constructs a new {@link ElementDescriptor} based on its XML name and children list.
-     * The UI name is build by capitalizing the XML name.
-     * The UI nodes will be non-mandatory.
-     *
-     * @param xml_name The XML element node name. Case sensitive.
-     * @param children The list of allowed children. Can be null or empty.
-     */
-    public ElementDescriptor(String xml_name, ElementDescriptor[] children) {
-        this(xml_name, prettyName(xml_name), null, null, null, children, false);
-    }
-
-    /**
-     * Constructs a new {@link ElementDescriptor} based on its XML name.
-     * The UI name is build by capitalizing the XML name.
-     * The UI nodes will be non-mandatory.
-     *
-     * @param xml_name The XML element node name. Case sensitive.
-     */
-    public ElementDescriptor(String xml_name) {
-        this(xml_name, prettyName(xml_name), null, null, null, null, false);
-    }
-
-    /** Returns whether this node must always exist (even for empty models) */
-    public Mandatory getMandatory() {
-        return mMandatory;
-    }
-
-    @Override
-    public String toString() {
-        return String.format("%s [%s, attr %d, children %d%s]",    //$NON-NLS-1$
-                this.getClass().getSimpleName(),
-                mXmlName,
-                mAttributes != null ? mAttributes.length : 0,
-                mChildren != null ? mChildren.length : 0,
-                mMandatory != Mandatory.NOT_MANDATORY ? ", " + mMandatory.toString() : "" //$NON-NLS-1$ //$NON-NLS-2$
-                );
-    }
-
-    /**
-     * Returns the XML element node local name (case sensitive)
-     */
-    public final String getXmlLocalName() {
-        int pos = mXmlName.indexOf(':');
-        if (pos != -1) {
-            return mXmlName.substring(pos+1);
-        }
-        return mXmlName;
-    }
-
-    /**
-     * Returns the XML element node name, including the prefix.
-     * Case sensitive.
-     * <p/>
-     * In Android resources, the element node name for Android resources typically does not
-     * have a prefix and is typically the simple Java class name (e.g. "View"), whereas for
-     * custom views it is generally the fully qualified class name of the view (e.g.
-     * "com.mycompany.myapp.MyView").
-     * <p/>
-     * Most of the time you'll probably want to use {@link #getXmlLocalName()} to get a local
-     * name guaranteed without a prefix.
-     * <p/>
-     * Note that the prefix that <em>may</em> be available in this descriptor has nothing to
-     * do with the actual prefix the node might have (or needs to have) in the actual XML file
-     * since descriptors are fixed and do not depend on any current namespace defined in the
-     * target XML.
-     */
-    public String getXmlName() {
-        return mXmlName;
-    }
-
-    /**
-     * Returns the namespace of the attribute.
-     */
-    public final String getNamespace() {
-        // For now we hard-code the prefix as being "android"
-        if (mXmlName.startsWith(ANDROID_NS_NAME_PREFIX)) {
-            return ANDROID_URI;
-        }
-
-        return ""; //$NON-NLs-1$
-    }
-
-
-    /** Returns the XML element name for the user interface, typically capitalized. */
-    public String getUiName() {
-        return mUiName;
-    }
-
-    /**
-     * Returns an icon for the element.
-     * This icon is generic, that is all element descriptors have the same icon
-     * no matter what they represent.
-     *
-     * @return An icon for this element or null.
-     * @see #getCustomizedIcon()
-     */
-    public Image getGenericIcon() {
-        return IconFactory.getInstance().getIcon(ELEMENT_ICON_FILENAME);
-    }
-
-    /**
-     * Returns an optional icon for the element, typically to be used in XML form trees.
-     * <p/>
-     * This icon is customized to the given descriptor, that is different elements
-     * will have different icons.
-     * <p/>
-     * By default this tries to return an icon based on the XML name of the element.
-     * If this fails, it tries to return the default Android logo as defined in the
-     * plugin. If all fails, it returns null.
-     *
-     * @return An icon for this element. This is never null.
-     */
-    public Image getCustomizedIcon() {
-        IconFactory factory = IconFactory.getInstance();
-        int color = hasChildren() ? IconFactory.COLOR_BLUE
-                : IconFactory.COLOR_GREEN;
-        int shape = hasChildren() ? IconFactory.SHAPE_RECT
-                : IconFactory.SHAPE_CIRCLE;
-        String name = mXmlName;
-
-        int pos = name.lastIndexOf('.');
-        if (pos != -1) {
-            // If the user uses a fully qualified name, such as
-            // "android.gesture.GestureOverlayView" in their XML, we need to
-            // look up only by basename
-            name = name.substring(pos + 1);
-        }
-        Image icon = factory.getIcon(name, color, shape);
-        if (icon == null) {
-            icon = getGenericIcon();
-        }
-        if (icon == null) {
-            icon = AdtPlugin.getAndroidLogo();
-        }
-        return icon;
-    }
-
-    /**
-     * Returns an optional ImageDescriptor for the element.
-     * <p/>
-     * By default this tries to return an image based on the XML name of the element.
-     * If this fails, it tries to return the default Android logo as defined in the
-     * plugin. If all fails, it returns null.
-     *
-     * @return An ImageDescriptor for this element or null.
-     */
-    public ImageDescriptor getImageDescriptor() {
-        IconFactory factory = IconFactory.getInstance();
-        int color = hasChildren() ? IconFactory.COLOR_BLUE : IconFactory.COLOR_GREEN;
-        int shape = hasChildren() ? IconFactory.SHAPE_RECT : IconFactory.SHAPE_CIRCLE;
-        ImageDescriptor id = factory.getImageDescriptor(mXmlName, color, shape);
-        return id != null ? id : AdtPlugin.getAndroidLogoDesc();
-    }
-
-    /* Returns the list of allowed attributes. */
-    public AttributeDescriptor[] getAttributes() {
-        return mAttributes;
-    }
-
-    /** Sets the list of allowed attributes. */
-    public void setAttributes(AttributeDescriptor[] attributes) {
-        mAttributes = attributes;
-        for (AttributeDescriptor attribute : attributes) {
-            attribute.setParent(this);
-        }
-    }
-
-    /** Returns the list of allowed children */
-    public ElementDescriptor[] getChildren() {
-        return mChildren;
-    }
-
-    /** @return True if this descriptor has children available */
-    public boolean hasChildren() {
-        return mChildren.length > 0;
-    }
-
-    /**
-     * Checks whether this descriptor can accept the given descriptor type
-     * as a direct child.
-     *
-     * @return True if this descriptor can accept children of the given descriptor type.
-     *   False if not accepted, no children allowed, or target is null.
-     */
-    public boolean acceptChild(ElementDescriptor target) {
-        if (target != null && mChildren.length > 0) {
-            String targetXmlName = target.getXmlName();
-            for (ElementDescriptor child : mChildren) {
-                if (child.getXmlName().equals(targetXmlName)) {
-                    return true;
-                }
-            }
-        }
-
-        return false;
-    }
-
-    /** Sets the list of allowed children. */
-    public void setChildren(ElementDescriptor[] newChildren) {
-        mChildren = newChildren;
-    }
-
-    /**
-     * Sets the list of allowed children.
-     * <p/>
-     * This is just a convenience method that converts a Collection into an array and
-     * calls {@link #setChildren(ElementDescriptor[])}.
-     * <p/>
-     * This means a <em>copy</em> of the collection is made. The collection is not
-     * stored by the recipient and can thus be altered by the caller.
-     */
-    public void setChildren(Collection<ElementDescriptor> newChildren) {
-        setChildren(newChildren.toArray(new ElementDescriptor[newChildren.size()]));
-    }
-
-    /**
-     * Returns an optional tooltip. Will be null if not present.
-     * <p/>
-     * The tooltip is based on the Javadoc of the element and already processed via
-     * {@link DescriptorsUtils#formatTooltip(String)} to be displayed right away as
-     * a UI tooltip.
-     */
-    public String getTooltip() {
-        return mTooltip;
-    }
-
-    /** Returns an optional SKD URL. Will be null if not present. */
-    public String getSdkUrl() {
-        return mSdkUrl;
-    }
-
-    /** Sets the optional tooltip. Can be null or empty. */
-    public void setTooltip(String tooltip) {
-        mTooltip = tooltip;
-    }
-
-    /** Sets the optional SDK URL. Can be null or empty. */
-    public void setSdkUrl(String sdkUrl) {
-        mSdkUrl = sdkUrl;
-    }
-
-    /**
-     * @return A new {@link UiElementNode} linked to this descriptor.
-     */
-    public UiElementNode createUiNode() {
-        return new UiElementNode(this);
-    }
-
-    /**
-     * Returns the first children of this descriptor that describes the given XML element name.
-     * <p/>
-     * In recursive mode, searches the direct children first before descending in the hierarchy.
-     *
-     * @return The ElementDescriptor matching the requested XML node element name or null.
-     */
-    public ElementDescriptor findChildrenDescriptor(String element_name, boolean recursive) {
-        return findChildrenDescriptorInternal(element_name, recursive, null);
-    }
-
-    private ElementDescriptor findChildrenDescriptorInternal(String element_name,
-            boolean recursive,
-            Set<ElementDescriptor> visited) {
-        if (recursive && visited == null) {
-            visited = new HashSet<ElementDescriptor>();
-        }
-
-        for (ElementDescriptor e : getChildren()) {
-            if (e.getXmlName().equals(element_name)) {
-                return e;
-            }
-        }
-
-        if (visited != null) {
-            visited.add(this);
-        }
-
-        if (recursive) {
-            for (ElementDescriptor e : getChildren()) {
-                if (visited != null) {
-                    if (!visited.add(e)) {  // Set.add() returns false if element is already present
-                        continue;
-                    }
-                }
-                ElementDescriptor f = e.findChildrenDescriptorInternal(element_name,
-                        recursive, visited);
-                if (f != null) {
-                    return f;
-                }
-            }
-        }
-
-        return null;
-    }
-
-    /**
-     * Utility helper than pretty-formats an XML Name for the UI.
-     * This is used by the simplified constructor that takes only an XML element name.
-     *
-     * @param xml_name The XML name to convert.
-     * @return The XML name with dashes replaced by spaces and capitalized.
-     */
-    private static String prettyName(String xml_name) {
-        char c[] = xml_name.toCharArray();
-        if (c.length > 0) {
-            c[0] = Character.toUpperCase(c[0]);
-        }
-        return new String(c).replace("-", " ");  //$NON-NLS-1$  //$NON-NLS-2$
-    }
-
-    /**
-     * Returns true if this node defines the given attribute
-     *
-     * @param namespaceUri the namespace URI of the target attribute
-     * @param attributeName the attribute name
-     * @return true if this element defines an attribute of the given name and namespace
-     */
-    public boolean definesAttribute(String namespaceUri, String attributeName) {
-        for (AttributeDescriptor desc : mAttributes) {
-            if (desc.getXmlLocalName().equals(attributeName) &&
-                    desc.getNamespaceUri().equals(namespaceUri)) {
-                return true;
-            }
-        }
-
-        return false;
-    }
-
-    // Implements Comparable<ElementDescriptor>:
-    @Override
-    public int compareTo(ElementDescriptor o) {
-        return mUiName.compareToIgnoreCase(o.mUiName);
-    }
-
-    /**
-     * Ensures that this view descriptor's attribute list is up to date. This is
-     * always the case for all the builtin descriptors, but for example for a
-     * custom view, it could be changing dynamically so caches may have to be
-     * recomputed. This method will return true if nothing changed, and false if
-     * it recomputed its info.
-     *
-     * @return true if the attributes are already up to date and nothing changed
-     */
-    public boolean syncAttributes() {
-        return true;
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/descriptors/EnumAttributeDescriptor.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/descriptors/EnumAttributeDescriptor.java
deleted file mode 100644
index 2923357..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/descriptors/EnumAttributeDescriptor.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Copyright (C) 2007 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.editors.descriptors;
-
-import com.android.ide.common.api.IAttributeInfo;
-import com.android.ide.eclipse.adt.internal.editors.uimodel.UiAttributeNode;
-import com.android.ide.eclipse.adt.internal.editors.uimodel.UiElementNode;
-import com.android.ide.eclipse.adt.internal.editors.uimodel.UiListAttributeNode;
-
-/**
- * Describes a text attribute that can only contains some predefined values.
- * It is displayed by a {@link UiListAttributeNode}.
- */
-public class EnumAttributeDescriptor extends ListAttributeDescriptor {
-
-    public EnumAttributeDescriptor(String xmlLocalName, String uiName, String nsUri,
-            String tooltip, IAttributeInfo attrInfo) {
-        super(xmlLocalName, nsUri, attrInfo);
-    }
-
-    /**
-     * @return A new {@link UiListAttributeNode} linked to this descriptor.
-     */
-    @Override
-    public UiAttributeNode createUiNode(UiElementNode uiParent) {
-        return new UiListAttributeNode(this, uiParent);
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/descriptors/FlagAttributeDescriptor.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/descriptors/FlagAttributeDescriptor.java
deleted file mode 100644
index 4f4b215..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/descriptors/FlagAttributeDescriptor.java
+++ /dev/null
@@ -1,92 +0,0 @@
-/*
- * 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.editors.descriptors;
-
-import com.android.ide.common.api.IAttributeInfo;
-import com.android.ide.eclipse.adt.internal.editors.ui.FlagValueCellEditor;
-import com.android.ide.eclipse.adt.internal.editors.uimodel.UiAttributeNode;
-import com.android.ide.eclipse.adt.internal.editors.uimodel.UiElementNode;
-import com.android.ide.eclipse.adt.internal.editors.uimodel.UiFlagAttributeNode;
-import com.android.ide.eclipse.adt.internal.editors.uimodel.UiListAttributeNode;
-
-import org.eclipse.jface.viewers.CellEditor;
-import org.eclipse.swt.widgets.Composite;
-
-/**
- * Describes a text attribute that can only contains some predefined values.
- * It is displayed by a {@link UiListAttributeNode}.
- *
- * Note: in Android resources, a "flag" is a list of fixed values where one or
- * more values can be selected using an "or", e.g. "align='left|top'".
- * By contrast, an "enum" is a list of fixed values of which only one can be
- * selected at a given time, e.g. "gravity='right'".
- * <p/>
- * This class handles the "flag" case.
- * The "enum" case is done using {@link ListAttributeDescriptor}.
- */
-public class FlagAttributeDescriptor extends TextAttributeDescriptor {
-
-    private String[] mNames;
-
-    /**
-     * Creates a new {@link FlagAttributeDescriptor}.
-     * <p/>
-     * If <code>attrInfo</code> is not null and has non-null flag values, these will be
-     * used for the list.
-     * Otherwise values are automatically extracted from the FrameworkResourceManager.
-     */
-    public FlagAttributeDescriptor(String xmlLocalName, String nsUri, IAttributeInfo attrInfo) {
-        super(xmlLocalName, nsUri, attrInfo);
-        if (attrInfo != null) {
-            mNames = attrInfo.getFlagValues();
-        }
-    }
-
-    /**
-    * Creates a new {@link FlagAttributeDescriptor} which uses the provided values
-    * and does not lookup the content of <code>attrInfo</code>.
-    */
-    public FlagAttributeDescriptor(String xmlLocalName, String uiName, String nsUri,
-            String tooltip, IAttributeInfo attrInfo, String[] names) {
-       super(xmlLocalName, nsUri, attrInfo);
-       mNames = names;
-    }
-
-    /**
-     * @return The initial names of the flags. Can be null, in which case the Framework
-     *         resource parser should be checked.
-     */
-    public String[] getNames() {
-        return mNames;
-    }
-
-    /**
-     * @return A new {@link UiListAttributeNode} linked to this descriptor.
-     */
-    @Override
-    public UiAttributeNode createUiNode(UiElementNode uiParent) {
-        return new UiFlagAttributeNode(this, uiParent);
-    }
-
-    // ------- IPropertyDescriptor Methods
-
-    @Override
-    public CellEditor createPropertyEditor(Composite parent) {
-        return new FlagValueCellEditor(parent);
-    }
-
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/descriptors/IDescriptorProvider.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/descriptors/IDescriptorProvider.java
deleted file mode 100644
index 860ed39..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/descriptors/IDescriptorProvider.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * 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.editors.descriptors;
-
-public interface IDescriptorProvider {
-
-    ElementDescriptor[] getRootElementDescriptors();
-    
-    ElementDescriptor getDescriptor();
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/descriptors/ITextAttributeCreator.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/descriptors/ITextAttributeCreator.java
deleted file mode 100755
index 1fc6623..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/descriptors/ITextAttributeCreator.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Copyright (C) 2010 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.editors.descriptors;
-
-import com.android.SdkConstants;
-import com.android.ide.common.api.IAttributeInfo;
-
-
-/**
- * The {@link ITextAttributeCreator} interface is used by the appendAttribute(...) in
- * {@link DescriptorsUtils} to allows callers to override the kind of
- * {@link TextAttributeDescriptor} created for a given XML attribute name.
- * <p/>
- * The <code>create()</code> method must take arguments that are similar to the
- * single constructor for {@link TextAttributeDescriptor}.
- */
-public interface ITextAttributeCreator {
-
-    /**
-     * Creates a new {@link TextAttributeDescriptor} instance for the given XML name,
-     * UI name and tooltip.
-     *
-     * @param xmlLocalName The XML name of the attribute (case sensitive)
-     * @param nsUri The URI of the attribute. Can be null if attribute has no namespace.
-     *              See {@link SdkConstants#NS_RESOURCES} for a common value.
-     * @param attrInfo The {@link IAttributeInfo} of this attribute. Can't be null.
-     * @return A new {@link TextAttributeDescriptor} (or derived) instance.
-     */
-    public TextAttributeDescriptor create(
-            String xmlLocalName,
-            String nsUri,
-            IAttributeInfo attrInfo);
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/descriptors/IUnknownDescriptorProvider.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/descriptors/IUnknownDescriptorProvider.java
deleted file mode 100755
index 931c1b7..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/descriptors/IUnknownDescriptorProvider.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Copyright (C) 2010 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.editors.descriptors;
-
-import com.android.ide.eclipse.adt.internal.editors.values.uimodel.UiItemElementNode;
-
-/**
- * {@link UiItemElementNode} is the main class that creates the UI Model hierarchy based
- * on an XML DOM hierarchy, matching XML names to the {@link ElementDescriptor} names.
- * <p/>
- * This interface declares a provider that can provide an {@link ElementDescriptor}
- * for an unknown XML local name.
- */
-public interface IUnknownDescriptorProvider {
-
-    /**
-     * Returns an instance of {@link ElementDescriptor} matching the given XML Local Name.
-     *
-     * @param xmlLocalName The XML local name.
-     * @return A new or existing {@link ElementDescriptor} or derived instance. Must not be null.
-     */
-    ElementDescriptor getDescriptor(String xmlLocalName);
-
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/descriptors/ListAttributeDescriptor.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/descriptors/ListAttributeDescriptor.java
deleted file mode 100644
index 16b0d55..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/descriptors/ListAttributeDescriptor.java
+++ /dev/null
@@ -1,89 +0,0 @@
-/*
- * Copyright (C) 2007 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.editors.descriptors;
-
-import com.android.ide.common.api.IAttributeInfo;
-import com.android.ide.eclipse.adt.internal.editors.ui.ListValueCellEditor;
-import com.android.ide.eclipse.adt.internal.editors.uimodel.UiAttributeNode;
-import com.android.ide.eclipse.adt.internal.editors.uimodel.UiElementNode;
-import com.android.ide.eclipse.adt.internal.editors.uimodel.UiListAttributeNode;
-
-import org.eclipse.jface.viewers.CellEditor;
-import org.eclipse.swt.widgets.Composite;
-
-/**
- * Describes a text attribute that can contains some predefined values.
- * It is displayed by a {@link UiListAttributeNode}.
- */
-public class ListAttributeDescriptor extends TextAttributeDescriptor {
-
-    private String[] mValues = null;
-
-    /**
-     * Used by {@link DescriptorsUtils} to create instances of this descriptor.
-     */
-    public static final ITextAttributeCreator CREATOR = new ITextAttributeCreator() {
-        @Override
-        public TextAttributeDescriptor create(String xmlLocalName,
-                String nsUri, IAttributeInfo attrInfo) {
-            return new ListAttributeDescriptor(xmlLocalName, nsUri, attrInfo);
-        }
-    };
-
-    /**
-     * Creates a new {@link ListAttributeDescriptor}.
-     * <p/>
-     * If <code>attrInfo</code> is not null and has non-null enum values, these will be
-     * used for the list.
-     * Otherwise values are automatically extracted from the FrameworkResourceManager.
-     */
-    public ListAttributeDescriptor(String xmlLocalName, String nsUri, IAttributeInfo attrInfo) {
-        super(xmlLocalName, nsUri, attrInfo);
-        if (attrInfo != null) {
-            mValues = attrInfo.getEnumValues();
-        }
-    }
-
-     /**
-     * Creates a new {@link ListAttributeDescriptor} which uses the provided values
-     * and does not lookup the content of <code>attrInfo</code>.
-     */
-    public ListAttributeDescriptor(String xmlLocalName, String nsUri, IAttributeInfo attrInfo,
-            String[] values) {
-        super(xmlLocalName, nsUri, attrInfo);
-        mValues = values;
-    }
-
-    public String[] getValues() {
-        return mValues;
-    }
-
-    /**
-     * @return A new {@link UiListAttributeNode} linked to this descriptor.
-     */
-    @Override
-    public UiAttributeNode createUiNode(UiElementNode uiParent) {
-        return new UiListAttributeNode(this, uiParent);
-    }
-
-    // ------- IPropertyDescriptor Methods
-
-    @Override
-    public CellEditor createPropertyEditor(Composite parent) {
-        return new ListValueCellEditor(parent);
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/descriptors/ReferenceAttributeDescriptor.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/descriptors/ReferenceAttributeDescriptor.java
deleted file mode 100644
index 0f146c1..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/descriptors/ReferenceAttributeDescriptor.java
+++ /dev/null
@@ -1,108 +0,0 @@
-/*
- * 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.editors.descriptors;
-
-import com.android.SdkConstants;
-import com.android.ide.common.api.IAttributeInfo;
-import com.android.ide.common.api.IAttributeInfo.Format;
-import com.android.ide.common.resources.platform.AttributeInfo;
-import com.android.ide.eclipse.adt.internal.editors.ui.ResourceValueCellEditor;
-import com.android.ide.eclipse.adt.internal.editors.uimodel.UiAttributeNode;
-import com.android.ide.eclipse.adt.internal.editors.uimodel.UiElementNode;
-import com.android.ide.eclipse.adt.internal.editors.uimodel.UiResourceAttributeNode;
-import com.android.resources.ResourceType;
-
-import org.eclipse.jface.viewers.CellEditor;
-import org.eclipse.swt.widgets.Composite;
-
-/**
- * Describes an XML attribute displayed containing a value or a reference to a resource.
- * It is displayed by a {@link UiResourceAttributeNode}.
- */
-public final class ReferenceAttributeDescriptor extends TextAttributeDescriptor {
-
-    /**
-     * The {@link ResourceType} that this reference attribute can accept. It can be null,
-     * in which case any reference type can be used.
-     */
-    private ResourceType mResourceType;
-
-    /**
-     * Used by {@link DescriptorsUtils} to create instances of this descriptor.
-     */
-    public static final ITextAttributeCreator CREATOR = new ITextAttributeCreator() {
-        @Override
-        public TextAttributeDescriptor create(String xmlLocalName,
-                String nsUri, IAttributeInfo attrInfo) {
-            return new ReferenceAttributeDescriptor(
-                    ResourceType.DRAWABLE,
-                    xmlLocalName, nsUri,
-                    new AttributeInfo(xmlLocalName, Format.REFERENCE_SET));
-        }
-    };
-
-    /**
-     * Creates a reference attributes that can contain any type of resources.
-     * @param xmlLocalName The XML name of the attribute (case sensitive)
-     * @param nsUri The URI of the attribute. Can be null if attribute has no namespace.
-     *              See {@link SdkConstants#NS_RESOURCES} for a common value.
-     * @param attrInfo The {@link IAttributeInfo} of this attribute. Can't be null.
-     */
-    public ReferenceAttributeDescriptor(String xmlLocalName, String nsUri,
-            IAttributeInfo attrInfo) {
-        super(xmlLocalName, nsUri, attrInfo);
-    }
-
-    /**
-     * Creates a reference attributes that can contain a reference to a specific
-     * {@link ResourceType}.
-     * @param resourceType The specific {@link ResourceType} that this reference attribute supports.
-     * It can be <code>null</code>, in which case, all resource types are supported.
-     * @param xmlLocalName The XML name of the attribute (case sensitive)
-     * @param nsUri The URI of the attribute. Can be null if attribute has no namespace.
-     *              See {@link SdkConstants#NS_RESOURCES} for a common value.
-     * @param attrInfo The {@link IAttributeInfo} of this attribute. Can't be null.
-     */
-    public ReferenceAttributeDescriptor(ResourceType resourceType,
-            String xmlLocalName, String nsUri, IAttributeInfo attrInfo) {
-        super(xmlLocalName, nsUri, attrInfo);
-        mResourceType = resourceType;
-    }
-
-
-    /** Returns the {@link ResourceType} that this reference attribute can accept.
-     * It can be null, in which case any reference type can be used. */
-    public ResourceType getResourceType() {
-        return mResourceType;
-    }
-
-    /**
-     * @return A new {@link UiResourceAttributeNode} linked to this reference descriptor.
-     */
-    @Override
-    public UiAttributeNode createUiNode(UiElementNode uiParent) {
-        return new UiResourceAttributeNode(mResourceType, this, uiParent);
-    }
-
-    // ------- IPropertyDescriptor Methods
-
-    @Override
-    public CellEditor createPropertyEditor(Composite parent) {
-        return new ResourceValueCellEditor(parent);
-    }
-
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/descriptors/SeparatorAttributeDescriptor.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/descriptors/SeparatorAttributeDescriptor.java
deleted file mode 100644
index 034bf8e..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/descriptors/SeparatorAttributeDescriptor.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * 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.editors.descriptors;
-
-import com.android.ide.eclipse.adt.internal.editors.uimodel.UiAttributeNode;
-import com.android.ide.eclipse.adt.internal.editors.uimodel.UiElementNode;
-import com.android.ide.eclipse.adt.internal.editors.uimodel.UiSeparatorAttributeNode;
-
-/**
- * {@link SeparatorAttributeDescriptor} does not represent any real attribute.
- * <p/>
- * It is used to separate groups of attributes visually.
- */
-public class SeparatorAttributeDescriptor extends AttributeDescriptor {
-
-    /**
-     * Creates a new {@link SeparatorAttributeDescriptor}
-     */
-    public SeparatorAttributeDescriptor(String label) {
-        super(label /* xmlLocalName */, null /* nsUri */, null /* info */);
-    }
-
-    /**
-     * @return A new {@link UiAttributeNode} linked to this descriptor or null if this
-     *         attribute has no user interface.
-     */
-    @Override
-    public UiAttributeNode createUiNode(UiElementNode uiParent) {
-        return new UiSeparatorAttributeNode(this, uiParent);
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/descriptors/TextAttributeDescriptor.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/descriptors/TextAttributeDescriptor.java
deleted file mode 100644
index f8c7806..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/descriptors/TextAttributeDescriptor.java
+++ /dev/null
@@ -1,290 +0,0 @@
-/*
- * Copyright (C) 2007 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.editors.descriptors;
-
-import com.android.SdkConstants;
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-import com.android.ide.common.api.IAttributeInfo;
-import com.android.ide.common.api.IAttributeInfo.Format;
-import com.android.ide.eclipse.adt.internal.editors.ui.TextValueCellEditor;
-import com.android.ide.eclipse.adt.internal.editors.uimodel.UiAttributeNode;
-import com.android.ide.eclipse.adt.internal.editors.uimodel.UiElementNode;
-import com.android.ide.eclipse.adt.internal.editors.uimodel.UiTextAttributeNode;
-
-import org.eclipse.jface.viewers.CellEditor;
-import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.ui.views.properties.IPropertyDescriptor;
-
-import java.util.EnumSet;
-import java.util.Locale;
-
-
-/**
- * Describes a textual XML attribute.
- * <p/>
- * Such an attribute has a tooltip and would typically be displayed by
- * {@link UiTextAttributeNode} using a label widget and text field.
- * <p/>
- * This is the "default" kind of attribute. If in doubt, use this.
- */
-public class TextAttributeDescriptor extends AttributeDescriptor implements IPropertyDescriptor {
-    public static final String DEPRECATED_CATEGORY = "Deprecated";
-
-    private String mUiName;
-    private String mTooltip;
-    private boolean mRequired;
-
-    /**
-     * Creates a new {@link TextAttributeDescriptor}
-     *
-     * @param xmlLocalName The XML name of the attribute (case sensitive)
-     * @param nsUri The URI of the attribute. Can be null if attribute has no namespace.
-     *              See {@link SdkConstants#NS_RESOURCES} for a common value.
-     * @param attrInfo The {@link IAttributeInfo} of this attribute. Can't be null.
-     */
-    public TextAttributeDescriptor(
-            String xmlLocalName,
-            String nsUri,
-            IAttributeInfo attrInfo) {
-        super(xmlLocalName, nsUri, attrInfo);
-    }
-
-    /**
-     * @return The UI name of the attribute. Cannot be an empty string and cannot be null.
-     */
-    @NonNull
-    public String getUiName() {
-        if (mUiName == null) {
-            IAttributeInfo info = getAttributeInfo();
-            if (info != null) {
-                mUiName = DescriptorsUtils.prettyAttributeUiName(info.getName());
-                if (mRequired) {
-                    mUiName += "*"; //$NON-NLS-1$
-                }
-            } else {
-                mUiName = getXmlLocalName();
-            }
-        }
-
-        return mUiName;
-    }
-
-
-    /**
-     * Sets the UI name to be associated with this descriptor. This is usually
-     * computed lazily from the {@link #getAttributeInfo()} data, but for some
-     * hardcoded/builtin descriptor this is manually initialized.
-     *
-     * @param uiName the new UI name to be used
-     * @return this, for constructor setter chaining
-     */
-    public TextAttributeDescriptor setUiName(String uiName) {
-        mUiName = uiName;
-
-        return this;
-    }
-
-    /**
-     * Sets the tooltip to be associated with this descriptor. This is usually
-     * computed lazily from the {@link #getAttributeInfo()} data, but for some
-     * hardcoded/builtin descriptor this is manually initialized.
-     *
-     * @param tooltip the new tooltip to be used
-     * @return this, for constructor setter chaining
-     */
-    public TextAttributeDescriptor setTooltip(String tooltip) {
-        mTooltip = tooltip;
-
-        return this;
-    }
-
-    /**
-     * Sets whether this attribute is required
-     *
-     * @param required whether this attribute is required
-     * @return this, for constructor setter chaining
-     */
-    public TextAttributeDescriptor setRequired(boolean required) {
-        mRequired = required;
-
-        return this;
-    }
-
-    /**
-     * Returns whether this attribute is required
-     *
-     * @return whether this attribute is required
-     */
-    public boolean isRequired() {
-        return mRequired;
-    }
-
-    /**
-     * The tooltip string is either null or a non-empty string.
-     * <p/>
-     * The tooltip is based on the Javadoc of the attribute and already processed via
-     * {@link DescriptorsUtils#formatTooltip(String)} to be displayed right away as
-     * a UI tooltip.
-     * <p/>
-     * An empty string is converted to null, to match the behavior of setToolTipText() in
-     * {@link Control}.
-     *
-     * @return A non-empty tooltip string or null
-     */
-    @Nullable
-    public String getTooltip() {
-        if (mTooltip == null) {
-            IAttributeInfo info = getAttributeInfo();
-            if (info == null) {
-                mTooltip = "";
-                return mTooltip;
-            }
-
-            String tooltip = null;
-            String rawTooltip = info.getJavaDoc();
-            if (rawTooltip == null) {
-                rawTooltip = "";
-            }
-
-            String deprecated = info.getDeprecatedDoc();
-            if (deprecated != null) {
-                if (rawTooltip.length() > 0) {
-                    rawTooltip += "@@"; //$NON-NLS-1$ insert a break
-                }
-                rawTooltip += "* Deprecated";
-                if (deprecated.length() != 0) {
-                    rawTooltip += ": " + deprecated;                            //$NON-NLS-1$
-                }
-                if (deprecated.length() == 0 || !deprecated.endsWith(".")) {    //$NON-NLS-1$
-                    rawTooltip += ".";                                          //$NON-NLS-1$
-                }
-            }
-
-            // Add the known types to the tooltip
-            EnumSet<Format> formats_list = info.getFormats();
-            int flen = formats_list.size();
-            if (flen > 0) {
-                StringBuilder sb = new StringBuilder();
-                if (rawTooltip != null && rawTooltip.length() > 0) {
-                    sb.append(rawTooltip);
-                    sb.append(" ");     //$NON-NLS-1$
-                }
-                if (sb.length() > 0) {
-                    sb.append("@@");    //$NON-NLS-1$  @@ inserts a break before the types
-                }
-                sb.append("[");         //$NON-NLS-1$
-                boolean isFirst = true;
-                for (Format f : formats_list) {
-                    if (isFirst) {
-                        isFirst = false;
-                    } else {
-                        sb.append(", ");
-                    }
-                    sb.append(f.toString().toLowerCase(Locale.US));
-                }
-                // The extra space at the end makes the tooltip more readable on Windows.
-                sb.append("]"); //$NON-NLS-1$
-
-                if (mRequired) {
-                    // Note: this string is split in 2 to make it translatable.
-                    sb.append(".@@");          //$NON-NLS-1$ @@ inserts a break and is not translatable
-                    sb.append("* Required.");
-                }
-
-                // The extra space at the end makes the tooltip more readable on Windows.
-                sb.append(" "); //$NON-NLS-1$
-
-                rawTooltip = sb.toString();
-                tooltip = DescriptorsUtils.formatTooltip(rawTooltip);
-            }
-
-            if (tooltip == null) {
-                tooltip = DescriptorsUtils.formatTooltip(rawTooltip);
-            }
-            mTooltip = tooltip;
-        }
-
-        return mTooltip.isEmpty() ? null : mTooltip;
-    }
-
-    /**
-     * @return A new {@link UiTextAttributeNode} linked to this descriptor.
-     */
-    @Override
-    public UiAttributeNode createUiNode(UiElementNode uiParent) {
-        return new UiTextAttributeNode(this, uiParent);
-    }
-
-    // ------- IPropertyDescriptor Methods
-
-    @Override
-    public CellEditor createPropertyEditor(Composite parent) {
-        return new TextValueCellEditor(parent);
-    }
-
-    @Override
-    public String getCategory() {
-        if (isDeprecated()) {
-            return DEPRECATED_CATEGORY;
-        }
-
-        ElementDescriptor parent = getParent();
-        if (parent != null) {
-            return parent.getUiName();
-        }
-
-        return null;
-    }
-
-    @Override
-    public String getDescription() {
-        return getTooltip();
-    }
-
-    @Override
-    public String getDisplayName() {
-        return getUiName();
-    }
-
-    @Override
-    public String[] getFilterFlags() {
-        return null;
-    }
-
-    @Override
-    public Object getHelpContextIds() {
-        return null;
-    }
-
-    @Override
-    public Object getId() {
-        return this;
-    }
-
-    @Override
-    public ILabelProvider getLabelProvider() {
-        return AttributeDescriptorLabelProvider.getProvider();
-    }
-
-    @Override
-    public boolean isCompatibleWith(IPropertyDescriptor anotherProperty) {
-        return anotherProperty == this;
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/descriptors/TextValueDescriptor.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/descriptors/TextValueDescriptor.java
deleted file mode 100644
index 6bfe4c7..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/descriptors/TextValueDescriptor.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Copyright (C) 2007 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.editors.descriptors;
-
-import com.android.ide.eclipse.adt.internal.editors.uimodel.UiAttributeNode;
-import com.android.ide.eclipse.adt.internal.editors.uimodel.UiElementNode;
-import com.android.ide.eclipse.adt.internal.editors.uimodel.UiTextValueNode;
-
-
-/**
- * Describes the value of an XML element.
- * <p/>
- * The value is a simple text string, displayed by an {@link UiTextValueNode}.
- */
-public class TextValueDescriptor extends TextAttributeDescriptor {
-
-    /**
-     * Creates a new {@link TextValueDescriptor}
-     *
-     * @param uiName The UI name of the attribute. Cannot be an empty string and cannot be null.
-     * @param tooltip A non-empty tooltip string or null
-     */
-    public TextValueDescriptor(String uiName, String tooltip) {
-        super("#text" /* xmlLocalName */, null /* nsUri */, null /* info */);
-        setUiName(uiName);
-        setTooltip(tooltip);
-    }
-
-    /**
-     * @return A new {@link UiTextValueNode} linked to this descriptor.
-     */
-    @Override
-    public UiAttributeNode createUiNode(UiElementNode uiParent) {
-        return new UiTextValueNode(this, uiParent);
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/descriptors/XmlnsAttributeDescriptor.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/descriptors/XmlnsAttributeDescriptor.java
deleted file mode 100644
index 39bb0f5..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/descriptors/XmlnsAttributeDescriptor.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * Copyright (C) 2007 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.editors.descriptors;
-
-import static com.android.SdkConstants.XMLNS;
-import static com.android.SdkConstants.XMLNS_URI;
-
-import com.android.ide.eclipse.adt.internal.editors.uimodel.UiAttributeNode;
-import com.android.ide.eclipse.adt.internal.editors.uimodel.UiElementNode;
-
-
-/**
- * Describes an XMLNS attribute that is hidden.
- * <p/>
- * Such an attribute has no user interface and no corresponding {@link UiAttributeNode}.
- * It also has a single constant default value.
- * <p/>
- * When loading an XML, we'll ignore this attribute.
- * However when writing a new XML, we should always write this attribute.
- * <p/>
- * Currently this is used for the xmlns:android attribute in the manifest element.
- */
-public final class XmlnsAttributeDescriptor extends AttributeDescriptor {
-
-    private String mValue;
-
-    public XmlnsAttributeDescriptor(String defaultPrefix, String value) {
-        super(defaultPrefix, XMLNS_URI, null /* info */);
-        mValue = value;
-    }
-
-    /**
-     * Returns the value of this specialized attribute descriptor, which is the URI associated
-     * to the declared namespace prefix.
-     */
-    public String getValue() {
-        return mValue;
-    }
-
-    /**
-     * Returns the "xmlns" prefix that is always used by this node for its namespace URI.
-     * This is defined by the XML specification.
-     */
-    public String getXmlNsPrefix() {
-        return XMLNS;
-    }
-
-    /**
-     * Returns the fully-qualified attribute name, namely "xmlns:xxx" where xxx is
-     * the defaultPrefix passed in the constructor.
-     */
-    public String getXmlNsName() {
-        return getXmlNsPrefix() + ":" + getXmlLocalName(); //$NON-NLS-1$
-    }
-
-    /**
-     * @return Always returns null. {@link XmlnsAttributeDescriptor} has no user interface.
-     */
-    @Override
-    public UiAttributeNode createUiNode(UiElementNode uiParent) {
-        return null;
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/draw9patch/Draw9PatchEditor.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/draw9patch/Draw9PatchEditor.java
deleted file mode 100644
index 48ef7c3..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/draw9patch/Draw9PatchEditor.java
+++ /dev/null
@@ -1,233 +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.eclipse.adt.internal.editors.draw9patch;
-
-import static com.android.SdkConstants.DOT_9PNG;
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.ide.eclipse.adt.internal.editors.draw9patch.graphics.NinePatchedImage;
-import com.android.ide.eclipse.adt.internal.editors.draw9patch.ui.ImageViewer;
-import com.android.ide.eclipse.adt.internal.editors.draw9patch.ui.MainFrame;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.jface.window.Window;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.ImageData;
-import org.eclipse.swt.graphics.ImageLoader;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorSite;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.dialogs.SaveAsDialog;
-import org.eclipse.ui.part.EditorPart;
-import org.eclipse.ui.part.FileEditorInput;
-
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-
-/**
- * Draw9Patch editor part.
- */
-public class Draw9PatchEditor extends EditorPart implements ImageViewer.UpdateListener {
-
-    private IProject mProject = null;
-
-    private FileEditorInput mFileEditorInput = null;
-
-    private String mFileName = null;
-
-    private NinePatchedImage mNinePatchedImage = null;
-
-    private MainFrame mMainFrame = null;
-
-    @Override
-    public void init(IEditorSite site, IEditorInput input) throws PartInitException {
-        setSite(site);
-        setInput(input);
-        setPartName(input.getName());
-
-        // The contract of init() mentions we need to fail if we can't
-        // understand the input.
-        if (input instanceof FileEditorInput) {
-            // We try to open a file that is part of the current workspace
-            mFileEditorInput = (FileEditorInput) input;
-            mFileName = mFileEditorInput.getName();
-            mProject = mFileEditorInput.getFile().getProject();
-        } else {
-            throw new PartInitException("Input is not of type FileEditorInput " + //$NON-NLS-1$
-                    "nor FileStoreEditorInput: " + //$NON-NLS-1$
-                    input == null ? "null" : input.toString()); //$NON-NLS-1$
-        }
-
-    }
-
-    @Override
-    public boolean isSaveAsAllowed() {
-        return true;
-    }
-
-    @Override
-    public void doSaveAs() {
-        IPath relativePath = null;
-        if ((relativePath = showSaveAsDialog()) != null) {
-            mFileEditorInput = new FileEditorInput(ResourcesPlugin.getWorkspace().getRoot()
-                    .getFile(relativePath));
-            mFileName = mFileEditorInput.getName();
-            setInput(mFileEditorInput);
-
-            doSave(new NullProgressMonitor());
-        }
-    }
-
-    @Override
-    public void doSave(final IProgressMonitor monitor) {
-        boolean hasNinePatchExtension = mFileName.endsWith(DOT_9PNG);
-        boolean doConvert = false;
-
-        if (!hasNinePatchExtension) {
-            String patchedName = NinePatchedImage.getNinePatchedFileName(mFileName);
-            doConvert = MessageDialog
-                    .openQuestion(AdtPlugin.getDisplay().getActiveShell(),
-                            "Warning",
-                            String.format(
-                                    "The file \"%s\" doesn't seem to be a 9-patch file. \n"
-                                            + "Do you want to convert and save as \"%s\" ?",
-                                    mFileName, patchedName));
-
-            if (doConvert) {
-                IFile destFile = mProject.getFile(NinePatchedImage.getNinePatchedFileName(
-                        mFileEditorInput.getFile().getProjectRelativePath().toOSString()));
-                if (!destFile.exists()) {
-                    mFileEditorInput = new FileEditorInput(destFile);
-                    mFileName = mFileEditorInput.getName();
-                } else {
-                    IPath relativePath = null;
-                    if ((relativePath = showSaveAsDialog()) != null) {
-                        mFileEditorInput = new FileEditorInput(ResourcesPlugin.getWorkspace()
-                                .getRoot().getFile(relativePath));
-                        mFileName = mFileEditorInput.getName();
-                    } else {
-                        doConvert = false;
-                    }
-                }
-            }
-        }
-
-        if (hasNinePatchExtension || doConvert) {
-            ImageLoader loader = new ImageLoader();
-            loader.data = new ImageData[] {
-                mNinePatchedImage.getRawImageData()
-            };
-
-            IFile file = mFileEditorInput.getFile();
-
-            ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
-            loader.save(outputStream, SWT.IMAGE_PNG);
-            byte[] byteArray = outputStream.toByteArray();
-
-            try {
-                if (file.exists()) {
-                    file.setContents(new ByteArrayInputStream(byteArray), true, false, monitor);
-                } else {
-                    file.create(new ByteArrayInputStream(byteArray), true, monitor);
-                }
-
-                mNinePatchedImage.clearDirtyFlag();
-
-                AdtPlugin.getDisplay().asyncExec(new Runnable() {
-                    @Override
-                    public void run() {
-                        setPartName(mFileName);
-                        firePropertyChange(PROP_DIRTY);
-                    }
-                });
-            } catch (CoreException e) {
-                AdtPlugin.log(e, null);
-            }
-        }
-    }
-
-    @Override
-    public void createPartControl(Composite parent) {
-        mMainFrame = new MainFrame(parent, SWT.NULL);
-
-        ImageViewer imageViewer = mMainFrame.getImageEditorPanel().getImageViewer();
-        imageViewer.addUpdateListener(this);
-
-        mNinePatchedImage = imageViewer.loadFile(mFileEditorInput.getPath().toOSString());
-        if (mNinePatchedImage.hasNinePatchExtension()) {
-            if (!mNinePatchedImage.ensure9Patch() && showConvertMessageBox(mFileName)) {
-                // Reload image
-                mNinePatchedImage = imageViewer.loadFile(mFileEditorInput.getPath().toOSString());
-                mNinePatchedImage.convertToNinePatch();
-            }
-        } else {
-            mNinePatchedImage.convertToNinePatch();
-        }
-
-        imageViewer.startDisplay();
-
-        parent.layout();
-    }
-
-    @Override
-    public void setFocus() {
-        mMainFrame.forceFocus();
-    }
-
-    @Override
-    public boolean isDirty() {
-        return mNinePatchedImage.isDirty();
-    }
-
-    @Override
-    public void update(NinePatchedImage image) {
-        if (image.isDirty()) {
-            firePropertyChange(PROP_DIRTY);
-        }
-    }
-
-    private IPath showSaveAsDialog() {
-        SaveAsDialog dialog = new SaveAsDialog(AdtPlugin.getDisplay().getActiveShell());
-
-        IFile dest = mProject.getFile(NinePatchedImage.getNinePatchedFileName(
-                mFileEditorInput.getFile().getProjectRelativePath().toOSString()));
-        dialog.setOriginalFile(dest);
-
-        dialog.create();
-
-        if (dialog.open() == Window.CANCEL) {
-            return null;
-        }
-
-        return dialog.getResult();
-    }
-
-    private static boolean showConvertMessageBox(String fileName) {
-        return MessageDialog.openQuestion(
-                AdtPlugin.getDisplay().getActiveShell(),
-                "Warning",
-                String.format("The file \"%s\" doesn't seem to be a 9-patch file. \n"
-                        + "Do you want to convert?", fileName));
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/draw9patch/graphics/GraphicsUtilities.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/draw9patch/graphics/GraphicsUtilities.java
deleted file mode 100644
index 74c2f04..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/draw9patch/graphics/GraphicsUtilities.java
+++ /dev/null
@@ -1,169 +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.eclipse.adt.internal.editors.draw9patch.graphics;
-
-import org.eclipse.swt.graphics.ImageData;
-
-/**
- * The utility class for SWT Image and ImageData manipulation.
- */
-public class GraphicsUtilities {
-
-    /**
-     * Convert normal image to 9-patched.
-     * @return Returns 9-patched ImageData object. If image is null, returns null.
-     */
-    public static ImageData convertToNinePatch(ImageData image) {
-        if (image == null) {
-            return null;
-        }
-        ImageData result = new ImageData(image.width + 2, image.height + 2, image.depth,
-                image.palette);
-
-        final int[] colors = new int[image.width];
-        final byte[] alpha = new byte[image.width];
-
-        for (int y = 0; y < image.height; y++) {
-
-            // Copy pixels
-            image.getPixels(0, y, image.width, colors, 0);
-            result.setPixels(1, y + 1, image.width, colors, 0);
-
-            // Copy alpha
-            image.getAlphas(0, y, image.width, alpha, 0);
-            result.setAlphas(1, y + 1, image.width, alpha, 0);
-        }
-
-        return result;
-    }
-
-    /**
-     * Wipe all color and alpha pixels.
-     */
-    public static void clearImageData(ImageData imageData) {
-        if (imageData == null) {
-            throw new IllegalArgumentException("image data must not be null");
-        }
-        int width = imageData.width;
-        int height = imageData.height;
-        for (int y = 0; y < height; y++) {
-            for (int x = 0; x < width; x++) {
-                imageData.setPixel(x, y, 0x00000000);
-                imageData.setAlpha(x, y, 0x00);
-            }
-        }
-    }
-
-    /**
-     * Duplicate the image data.
-     * @return If image is null, return null.
-     */
-    public static ImageData copy(ImageData image) {
-        if (image == null) {
-            return null;
-        }
-        ImageData result = new ImageData(image.width, image.height, image.depth,
-                image.palette);
-
-        final int[] colors = new int[image.width];
-        final byte[] alpha = new byte[image.width];
-
-        for (int y = 0; y < image.height; y++) {
-
-            // Copy pixels
-            image.getPixels(0, y, image.width, colors, 0);
-            result.setPixels(0, y, image.width, colors, 0);
-
-            // Copy alpha
-            image.getAlphas(0, y, image.width, alpha, 0);
-            result.setAlphas(0, y, image.width, alpha, 0);
-        }
-
-        return result;
-    }
-
-    /**
-     * Get column pixels.
-     * @return length of obtained pixels.
-     */
-    public static int getVerticalPixels(ImageData data, int x, int y, int height, int[] out) {
-        if (data == null) {
-            throw new IllegalArgumentException("data must not be null");
-        }
-        if (out == null) {
-            throw new IllegalArgumentException("out array must not be null");
-        }
-        if (height > out.length) {
-            throw new IllegalArgumentException("out array length must be > height");
-        }
-        if (data.height < (y + height)) {
-            throw new IllegalArgumentException("image height must be > (y + height)");
-        }
-        if (x < 0 || y < 0) {
-            throw new IllegalArgumentException("argument x, y must be >= 0");
-        }
-        if (x >= data.width) {
-            throw new IllegalArgumentException("argument x must be < data.width");
-        }
-        if (y >= data.height) {
-            throw new IllegalArgumentException("argument y must be < data.height");
-        }
-        if (height <= 0) {
-            throw new IllegalArgumentException("argument height must be > 0");
-        }
-
-        int idx = 0;
-        while (idx < height) {
-            data.getPixels(x, (y + idx), 1, out, idx);
-            idx++;
-        }
-        return idx;
-    }
-
-    /**
-     * Get row pixels.
-     */
-    public static void getHorizontalPixels(ImageData data, int x, int y, int width, int[] out) {
-        if (data == null) {
-            throw new IllegalArgumentException("data must not be null");
-        }
-        if (out == null) {
-            throw new IllegalArgumentException("out array must not be null");
-        }
-        if (width > out.length) {
-            throw new IllegalArgumentException("out array length must be > width");
-        }
-        if (data.width < (x + width)) {
-            throw new IllegalArgumentException("image height must be > (x + width)");
-        }
-        if (x < 0 || y < 0) {
-            throw new IllegalArgumentException("argument x, y must be >= 0");
-        }
-        if (x >= data.width) {
-            throw new IllegalArgumentException("argument x must be < data.width");
-        }
-        if (y >= data.height) {
-            throw new IllegalArgumentException("argument y must be < data.height");
-        }
-        if (width <= 0) {
-            throw new IllegalArgumentException("argument width must be > 0");
-        }
-
-        data.getPixels(x, y, width, out, 0);
-    }
-
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/draw9patch/graphics/NinePatchedImage.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/draw9patch/graphics/NinePatchedImage.java
deleted file mode 100644
index f1022c3..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/draw9patch/graphics/NinePatchedImage.java
+++ /dev/null
@@ -1,882 +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.eclipse.adt.internal.editors.draw9patch.graphics;
-
-import static com.android.SdkConstants.DOT_9PNG;
-import static com.android.SdkConstants.DOT_PNG;
-import com.android.ide.eclipse.adt.AdtPlugin;
-
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.graphics.ImageData;
-import org.eclipse.swt.graphics.Rectangle;
-
-import java.io.InputStream;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
-/**
- * The model of 9-patched image.
- */
-public class NinePatchedImage {
-    private static final boolean DEBUG = false;
-
-    /**
-     * Get 9-patched filename as like image.9.png .
-     */
-    public static String getNinePatchedFileName(String fileName) {
-        if (fileName.endsWith(DOT_9PNG)) {
-            return fileName;
-        }
-        return fileName.substring(0, fileName.lastIndexOf(DOT_PNG)) + DOT_9PNG;
-    }
-
-    // For stretch regions and padding
-    public static final int BLACK_TICK = 0xFF000000;
-    // For Layout Bounds
-    public static final int RED_TICK = 0xFFFF0000;
-    // Blank
-    public static final int TRANSPARENT_TICK = 0x00000000;
-
-    private ImageData mBaseImageData;
-
-    private Image mBaseImage = null;
-
-    private boolean mHasNinePatchExtension = false;
-
-    private boolean mDirtyFlag = false;
-
-    private int[] mHorizontalPatchPixels = null;
-    private int[] mVerticalPatchPixels = null;
-
-    private int[] mHorizontalContentPixels = null;
-    private int[] mVerticalContentPixels = null;
-
-    // for Prevent unexpected stretch in StretchsView
-    private boolean mRedTickOnlyInHorizontalFlag = false;
-    private boolean mRedTickOnlyInVerticalFlag = false;
-
-    private final List<Tick> mHorizontalPatches = new ArrayList<Tick>();
-    private final List<Tick> mVerticalPatches = new ArrayList<Tick>();
-
-    private final List<Tick> mHorizontalContents = new ArrayList<Tick>();
-    private final List<Tick> mVerticalContents = new ArrayList<Tick>();
-
-
-    private static final int CHUNK_BIN_SIZE = 100;
-    private final List<Chunk> mChunkBin = new ArrayList<Chunk>(CHUNK_BIN_SIZE);
-
-    private int mHorizontalFixedPatchSum = 0;
-    private int mVerticalFixedPatchSum = 0;
-
-    private static final int PROJECTION_BIN_SIZE = 100;
-    private final List<Projection> mProjectionBin = new ArrayList<Projection>(PROJECTION_BIN_SIZE);
-
-    private Chunk[][] mPatchChunks = null;
-
-    public ImageData getImageData() {
-        return mBaseImageData;
-    }
-
-    public int getWidth() {
-        return mBaseImageData.width;
-    }
-
-    public int getHeight() {
-        return mBaseImageData.height;
-    }
-
-    public Image getImage() {
-        if (mBaseImage == null) {
-            mBaseImage = new Image(AdtPlugin.getDisplay(), mBaseImageData);
-        }
-        return mBaseImage;
-    }
-
-    public boolean hasNinePatchExtension() {
-        return mHasNinePatchExtension;
-    }
-
-    /**
-     * Get the image has/hasn't been edited flag.
-     * @return If has been edited, return true
-     */
-    public boolean isDirty() {
-        return mDirtyFlag;
-    }
-
-    /**
-     * Clear dirty(edited) flag.
-     */
-    public void clearDirtyFlag() {
-        mDirtyFlag = false;
-    }
-
-    public NinePatchedImage(String fileName) {
-        boolean hasNinePatchExtension = fileName.endsWith(DOT_9PNG);
-        ImageData data = new ImageData(fileName);
-
-        initNinePatchedImage(data, hasNinePatchExtension);
-    }
-
-    public NinePatchedImage(InputStream inputStream, String fileName) {
-        boolean hasNinePatchExtension = fileName.endsWith(DOT_9PNG);
-        ImageData data = new ImageData(inputStream);
-
-        initNinePatchedImage(data, hasNinePatchExtension);
-    }
-
-    private Chunk getChunk() {
-        if (mChunkBin.size() > 0) {
-            Chunk chunk = mChunkBin.remove(0);
-            chunk.init();
-            return chunk;
-        }
-        return new Chunk();
-    }
-
-    private static final void recycleChunks(Chunk[][] patchChunks, List<Chunk> bin) {
-        int yLen = patchChunks.length;
-        int xLen = patchChunks[0].length;
-
-        for (int y = 0; y < yLen; y++) {
-            for (int x = 0; x < xLen; x++) {
-                if (bin.size() < CHUNK_BIN_SIZE) {
-                    bin.add(patchChunks[y][x]);
-                }
-                patchChunks[y][x] = null;
-            }
-        }
-    }
-
-    private Projection getProjection() {
-        if (mProjectionBin.size() > 0) {
-            Projection projection = mProjectionBin.remove(0);
-            return projection;
-        }
-        return new Projection();
-    }
-
-    private static final void recycleProjections(Projection[][] projections, List<Projection> bin) {
-        int yLen = projections.length;
-        int xLen = 0;
-        if (yLen > 0) {
-            xLen = projections[0].length;
-        }
-
-        for (int y = 0; y < yLen; y++) {
-            for (int x = 0; x < xLen; x++) {
-                if (bin.size() < CHUNK_BIN_SIZE) {
-                    bin.add(projections[y][x]);
-                }
-                projections[y][x] = null;
-            }
-        }
-    }
-
-    private static final int[] initArray(int[] array) {
-        int len = array.length;
-        for (int i = 0; i < len; i++) {
-            array[i] = TRANSPARENT_TICK;
-        }
-        return array;
-    }
-
-    /**
-     * Get one pixel with alpha from the image.
-     * @return packed integer value as ARGB8888
-     */
-    private static final int getPixel(ImageData image, int x, int y) {
-        return (image.getAlpha(x, y) << 24) + image.getPixel(x, y);
-    }
-
-    private static final boolean isTransparentPixel(ImageData image, int x, int y) {
-        return image.getAlpha(x, y) == 0x0;
-    }
-
-    private static final boolean isValidTickColor(int pixel) {
-        return (pixel == BLACK_TICK || pixel == RED_TICK);
-    }
-
-    private void initNinePatchedImage(ImageData imageData, boolean hasNinePatchExtension) {
-        mBaseImageData = imageData;
-        mHasNinePatchExtension = hasNinePatchExtension;
-    }
-
-    private boolean ensurePixel(int x, int y, int[] pixels, int index) {
-        boolean isValid = true;
-        int pixel = getPixel(mBaseImageData, x, y);
-        if (!isTransparentPixel(mBaseImageData, x, y)) {
-            if (index == 0 || index == pixels.length - 1) {
-                isValid = false;
-            }
-            if (isValidTickColor(pixel)) {
-                pixels[index] = pixel;
-            } else {
-                isValid = false;
-            }
-            // clear pixel
-            mBaseImageData.setAlpha(x, y, 0x0);
-        }
-        return isValid;
-    }
-
-    private boolean ensureHorizontalPixel(int x, int y, int[] pixels) {
-        return ensurePixel(x, y, pixels, x);
-    }
-
-    private boolean ensureVerticalPixel(int x, int y, int[] pixels) {
-        return ensurePixel(x, y, pixels, y);
-    }
-
-    /**
-     * Ensure that image data is 9-patch.
-     */
-    public boolean ensure9Patch() {
-        boolean isValid = true;
-
-        int width = mBaseImageData.width;
-        int height = mBaseImageData.height;
-
-        createPatchArray();
-        createContentArray();
-
-        // horizontal
-        for (int x = 0; x < width; x++) {
-            // top row
-            if (!ensureHorizontalPixel(x, 0, mHorizontalPatchPixels)) {
-                isValid = false;
-            }
-            // bottom row
-            if (!ensureHorizontalPixel(x, height - 1, mHorizontalContentPixels)) {
-                isValid = false;
-            }
-        }
-        // vertical
-        for (int y = 0; y < height; y++) {
-            // left column
-            if (!ensureVerticalPixel(0, y, mVerticalPatchPixels)) {
-                isValid = false;
-            }
-            // right column
-            if (!ensureVerticalPixel(width -1, y, mVerticalContentPixels)) {
-                isValid = false;
-            }
-        }
-        findPatches();
-        findContentsArea();
-
-        return isValid;
-    }
-
-    private void createPatchArray() {
-        mHorizontalPatchPixels = initArray(new int[mBaseImageData.width]);
-        mVerticalPatchPixels = initArray(new int[mBaseImageData.height]);
-    }
-
-    private void createContentArray() {
-        mHorizontalContentPixels = initArray(new int[mBaseImageData.width]);
-        mVerticalContentPixels = initArray(new int[mBaseImageData.height]);
-    }
-
-    /**
-     * Convert to 9-patch image.
-     * <p>
-     * This method doesn't consider that target image is already 9-patched or
-     * not.
-     * </p>
-     */
-    public void convertToNinePatch() {
-        mBaseImageData = GraphicsUtilities.convertToNinePatch(mBaseImageData);
-        mHasNinePatchExtension = true;
-
-        createPatchArray();
-        createContentArray();
-
-        findPatches();
-        findContentsArea();
-    }
-
-    public boolean isValid(int x, int y) {
-        return (x == 0) ^ (y == 0)
-                ^ (x == mBaseImageData.width - 1) ^ (y == mBaseImageData.height - 1);
-    }
-
-    /**
-     * Set patch or content.
-     */
-    public void setPatch(int x, int y, int color) {
-        if (isValid(x, y)) {
-            if (x == 0) {
-                mVerticalPatchPixels[y] = color;
-            } else if (y == 0) {
-                mHorizontalPatchPixels[x] = color;
-            } else if (x == mBaseImageData.width - 1) {
-                mVerticalContentPixels[y] = color;
-            } else if (y == mBaseImageData.height - 1) {
-                mHorizontalContentPixels[x] = color;
-            }
-
-            // Mark as dirty
-            mDirtyFlag = true;
-        }
-    }
-
-    /**
-     * Erase the pixel.
-     */
-    public void erase(int x, int y) {
-        if (isValid(x, y)) {
-            int color = TRANSPARENT_TICK;
-            if (x == 0) {
-                mVerticalPatchPixels[y] = color;
-            } else if (y == 0) {
-                mHorizontalPatchPixels[x] = color;
-            } else if (x == mBaseImageData.width - 1) {
-                mVerticalContentPixels[y] = color;
-            } else if (y == mBaseImageData.height - 1) {
-                mHorizontalContentPixels[x] = color;
-            }
-
-            // Mark as dirty
-            mDirtyFlag = true;
-        }
-    }
-
-    public List<Tick> getHorizontalPatches() {
-        return mHorizontalPatches;
-    }
-
-    public List<Tick> getVerticalPatches() {
-        return mVerticalPatches;
-    }
-
-    /**
-     * Find patches from pixels array.
-     * @param pixels Target of seeking ticks.
-     * @param out Add the found ticks.
-     * @return If BlackTick is not found but only RedTick is found, returns true
-     */
-    private static boolean findPatches(int[] pixels, List<Tick> out) {
-        boolean redTickOnly = true;
-        Tick patch = null;
-        int len = 0;
-
-        // find patches
-        out.clear();
-        len = pixels.length - 1;
-        for (int i = 1; i < len; i++) {
-            int pixel = pixels[i];
-
-            if (redTickOnly && pixel != TRANSPARENT_TICK && pixel != RED_TICK) {
-                redTickOnly = false;
-            }
-
-            if (patch != null) {
-                if (patch.color != pixel) {
-                    patch.end = i;
-                    out.add(patch);
-                    patch = null;
-                }
-            }
-            if (patch == null) {
-                patch = new Tick(pixel);
-                patch.start = i;
-            }
-        }
-
-        if (patch != null) {
-            patch.end = len;
-            out.add(patch);
-        }
-        return redTickOnly;
-    }
-
-    public void findPatches() {
-
-        // find horizontal patches
-        mRedTickOnlyInHorizontalFlag = findPatches(mHorizontalPatchPixels, mHorizontalPatches);
-
-        // find vertical patches
-        mRedTickOnlyInVerticalFlag = findPatches(mVerticalPatchPixels, mVerticalPatches);
-    }
-
-    public Rectangle getContentArea() {
-        Tick horizontal = getContentArea(mHorizontalContents);
-        Tick vertical = getContentArea(mVerticalContents);
-
-        Rectangle rect = new Rectangle(0, 0, 0, 0);
-        rect.x = 1;
-        rect.width = mBaseImageData.width - 1;
-        rect.y = 1;
-        rect.height = mBaseImageData.height - 1;
-
-        if (horizontal != null) {
-            rect.x = horizontal.start;
-            rect.width = horizontal.getLength();
-        }
-        if (vertical != null) {
-            rect.y = vertical.start;
-            rect.height = vertical.getLength();
-        }
-
-        return rect;
-    }
-
-    private Tick getContentArea(List<Tick> list) {
-        int size = list.size();
-        if (size == 0) {
-            return null;
-        }
-        if (size == 1) {
-            return list.get(0);
-        }
-
-        Tick start = null;
-        Tick end = null;
-
-        for (int i = 0; i < size; i++) {
-            Tick t = list.get(i);
-            if (t.color == BLACK_TICK) {
-                if (start == null) {
-                    start = t;
-                    end = t;
-                } else {
-                    end = t;
-                }
-            }
-        }
-
-        // red tick only
-        if (start == null) {
-            return null;
-        }
-
-        Tick result = new Tick(start.color);
-        result.start = start.start;
-        result.end = end.end;
-
-        return result;
-    }
-
-    /**
-     * This is for unit test use only.
-     * @see com.android.ide.eclipse.adt.internal.editors.draw9patch.graphics.NinePatchedImageTest
-     */
-    public List<Tick> getHorizontalContents() {
-        return mHorizontalContents;
-    }
-
-    /**
-     * This is for unit test use only.
-     * @see com.android.ide.eclipse.adt.internal.editors.draw9patch.graphics.NinePatchedImageTest
-     */
-    public List<Tick> getVerticalContents() {
-        return mVerticalContents;
-    }
-
-    private static void findContentArea(int[] pixels, List<Tick> out) {
-        Tick contents = null;
-        int len = 0;
-
-        // find horizontal contents area
-        out.clear();
-        len = pixels.length - 1;
-        for (int x = 1; x < len; x++) {
-            if (contents != null) {
-                if (contents.color != pixels[x]) {
-                    contents.end = x;
-                    out.add(contents);
-                    contents = null;
-                }
-            }
-            if (contents == null) {
-                contents = new Tick(pixels[x]);
-                contents.start = x;
-            }
-        }
-
-        if (contents != null) {
-            contents.end = len;
-            out.add(contents);
-        }
-    }
-
-    public void findContentsArea() {
-
-        // find horizontal contents area
-        findContentArea(mHorizontalContentPixels, mHorizontalContents);
-
-        // find vertical contents area
-        findContentArea(mVerticalContentPixels, mVerticalContents);
-    }
-
-    /**
-     * Get raw image data.
-     * <p>
-     * The raw image data is applicable for save.
-     * </p>
-     */
-    public ImageData getRawImageData() {
-        ImageData image = GraphicsUtilities.copy(mBaseImageData);
-
-        final int width = image.width;
-        final int height = image.height;
-        int len = 0;
-
-        len = mHorizontalPatchPixels.length;
-        for (int x = 0; x < len; x++) {
-            int pixel = mHorizontalPatchPixels[x];
-            if (pixel != TRANSPARENT_TICK) {
-                image.setAlpha(x, 0, 0xFF);
-                image.setPixel(x, 0, pixel);
-            }
-        }
-
-        len = mVerticalPatchPixels.length;
-        for (int y = 0; y < len; y++) {
-            int pixel = mVerticalPatchPixels[y];
-            if (pixel != TRANSPARENT_TICK) {
-                image.setAlpha(0, y, 0xFF);
-                image.setPixel(0, y, pixel);
-            }
-        }
-
-        len = mHorizontalContentPixels.length;
-        for (int x = 0; x < len; x++) {
-            int pixel = mHorizontalContentPixels[x];
-            if (pixel != TRANSPARENT_TICK) {
-                image.setAlpha(x, height - 1, 0xFF);
-                image.setPixel(x, height - 1, pixel);
-            }
-        }
-
-        len = mVerticalContentPixels.length;
-        for (int y = 0; y < len; y++) {
-            int pixel = mVerticalContentPixels[y];
-            if (pixel != TRANSPARENT_TICK) {
-                image.setAlpha(width - 1, y, 0xFF);
-                image.setPixel(width - 1, y, pixel);
-            }
-        }
-
-        return image;
-    }
-
-    public Chunk[][] getChunks(Chunk[][] chunks) {
-        int lenY = mVerticalPatches.size();
-        int lenX = mHorizontalPatches.size();
-
-        if (lenY == 0 || lenX == 0) {
-            return null;
-        }
-
-        if (chunks == null) {
-            chunks = new Chunk[lenY][lenX];
-        } else {
-            int y = chunks.length;
-            int x = chunks[0].length;
-            if (lenY != y || lenX != x) {
-                recycleChunks(chunks, mChunkBin);
-                chunks = new Chunk[lenY][lenX];
-            }
-        }
-
-        // for calculate weights
-        float horizontalPatchSum = 0;
-        float verticalPatchSum = 0;
-
-        mVerticalFixedPatchSum = 0;
-        mHorizontalFixedPatchSum = 0;
-
-        for (int y = 0; y < lenY; y++) {
-            Tick yTick = mVerticalPatches.get(y);
-
-            for (int x = 0; x < lenX; x++) {
-                Tick xTick = mHorizontalPatches.get(x);
-                Chunk t = getChunk();
-                chunks[y][x] = t;
-
-                t.rect.x = xTick.start;
-                t.rect.width = xTick.getLength();
-                t.rect.y = yTick.start;
-                t.rect.height = yTick.getLength();
-
-                if (mRedTickOnlyInHorizontalFlag
-                        || xTick.color == BLACK_TICK || lenX == 1) {
-                    t.type += Chunk.TYPE_HORIZONTAL;
-                    if (y == 0) {
-                        horizontalPatchSum += t.rect.width;
-                    }
-                }
-                if (mRedTickOnlyInVerticalFlag
-                        || yTick.color == BLACK_TICK || lenY == 1) {
-                    t.type += Chunk.TYPE_VERTICAL;
-                    if (x == 0) {
-                        verticalPatchSum += t.rect.height;
-                    }
-                }
-
-                if ((t.type & Chunk.TYPE_HORIZONTAL) == 0 && lenX > 1 && y == 0) {
-                    mHorizontalFixedPatchSum += t.rect.width;
-                }
-                if ((t.type & Chunk.TYPE_VERTICAL) == 0 && lenY > 1 && x == 0) {
-                    mVerticalFixedPatchSum += t.rect.height;
-                }
-
-            }
-        }
-
-        // calc weights
-        for (int y = 0; y < lenY; y++) {
-            for (int x = 0; x < lenX; x++) {
-                Chunk chunk = chunks[y][x];
-                if ((chunk.type & Chunk.TYPE_HORIZONTAL) != 0) {
-                    chunk.horizontalWeight = chunk.rect.width / horizontalPatchSum;
-                }
-                if ((chunk.type & Chunk.TYPE_VERTICAL) != 0) {
-                    chunk.verticalWeight = chunk.rect.height / verticalPatchSum;
-
-                }
-            }
-        }
-
-        return chunks;
-    }
-
-    public Chunk[][] getCorruptedChunks(Chunk[][] chunks) {
-        chunks = getChunks(chunks);
-
-        if (chunks != null) {
-            int yLen = chunks.length;
-            int xLen = chunks[0].length;
-
-            for (int yPos = 0; yPos < yLen; yPos++) {
-                for (int xPos = 0; xPos < xLen; xPos++) {
-                    Chunk c = chunks[yPos][xPos];
-                    Rectangle r = c.rect;
-                    if ((c.type & Chunk.TYPE_HORIZONTAL) != 0
-                            && isHorizontalCorrupted(mBaseImageData, r)) {
-                        c.type |= Chunk.TYPE_CORRUPT;
-                    }
-                    if ((c.type & Chunk.TYPE_VERTICAL) != 0
-                            && isVerticalCorrupted(mBaseImageData, r)) {
-                        c.type |= Chunk.TYPE_CORRUPT;
-                    }
-                }
-            }
-        }
-        return chunks;
-    }
-
-    private static boolean isVerticalCorrupted(ImageData data, Rectangle r) {
-        int[] column = new int[r.width];
-        int[] sample = new int[r.width];
-
-        GraphicsUtilities.getHorizontalPixels(data, r.x, r.y, r.width, column);
-
-        int lenY = r.y + r.height;
-        for (int y = r.y; y < lenY; y++) {
-            GraphicsUtilities.getHorizontalPixels(data, r.x, y, r.width, sample);
-            if (!Arrays.equals(column, sample)) {
-                return true;
-            }
-        }
-        return false;
-    }
-
-    private static boolean isHorizontalCorrupted(ImageData data, Rectangle r) {
-        int[] column = new int[r.height];
-        int[] sample = new int[r.height];
-        GraphicsUtilities.getVerticalPixels(data, r.x, r.y, r.height, column);
-
-        int lenX = r.x + r.width;
-        for (int x = r.x; x < lenX; x++) {
-            GraphicsUtilities.getVerticalPixels(data, x, r.y, r.height, sample);
-            if (!Arrays.equals(column, sample)) {
-                return true;
-            }
-        }
-        return false;
-    }
-
-    public Projection[][] getProjections(int width, int height, Projection[][] projections) {
-        mPatchChunks = getChunks(mPatchChunks);
-        if (mPatchChunks == null) {
-            return null;
-        }
-
-        if (DEBUG) {
-            System.out.println(String.format("width:%d, height:%d", width, height));
-        }
-
-        int lenY = mPatchChunks.length;
-        int lenX = mPatchChunks[0].length;
-
-        if (projections == null) {
-            projections = new Projection[lenY][lenX];
-        } else {
-            int y = projections.length;
-            int x = projections[0].length;
-            if (lenY != y || lenX != x) {
-                recycleProjections(projections, mProjectionBin);
-                projections = new Projection[lenY][lenX];
-            }
-        }
-
-        float xZoom = ((float) width / mBaseImageData.width);
-        float yZoom = ((float) height / mBaseImageData.height);
-
-        if (DEBUG) {
-            System.out.println(String.format("xZoom:%f, yZoom:%f", xZoom, yZoom));
-        }
-
-        int destX = 0;
-        int destY = 0;
-        int streatchableWidth = width - mHorizontalFixedPatchSum;
-        streatchableWidth = streatchableWidth > 0 ? streatchableWidth : 1;
-
-        int streatchableHeight = height - mVerticalFixedPatchSum;
-        streatchableHeight = streatchableHeight > 0 ? streatchableHeight : 1;
-
-        if (DEBUG) {
-            System.out.println(String.format("streatchable %d %d", streatchableWidth,
-                    streatchableHeight));
-        }
-
-        for (int yPos = 0; yPos < lenY; yPos++) {
-            destX = 0;
-            Projection p = null;
-            for (int xPos = 0; xPos < lenX; xPos++) {
-                Chunk chunk = mPatchChunks[yPos][xPos];
-
-                if (DEBUG) {
-                    System.out.println(String.format("Tile[%d, %d] = %s",
-                            yPos, xPos, chunk.toString()));
-                }
-
-                p = getProjection();
-                projections[yPos][xPos] = p;
-
-                p.chunk = chunk;
-                p.src = chunk.rect;
-                p.dest.x = destX;
-                p.dest.y = destY;
-
-                // fixed size
-                p.dest.width = chunk.rect.width;
-                p.dest.height = chunk.rect.height;
-
-                // horizontal stretch
-                if ((chunk.type & Chunk.TYPE_HORIZONTAL) != 0) {
-                    p.dest.width = Math.round(streatchableWidth * chunk.horizontalWeight);
-                }
-                // vertical stretch
-                if ((chunk.type & Chunk.TYPE_VERTICAL) != 0) {
-                    p.dest.height = Math.round(streatchableHeight * chunk.verticalWeight);
-                }
-
-                destX += p.dest.width;
-            }
-            destY += p.dest.height;
-        }
-        return projections;
-    }
-
-    /**
-     * Projection class for make relation between chunked image and resized image.
-     */
-    public static class Projection {
-        public Chunk chunk = null;
-        public Rectangle src = null;
-        public final Rectangle dest = new Rectangle(0, 0, 0, 0);
-
-        @Override
-        public String toString() {
-            return String.format("src[%d, %d, %d, %d] => dest[%d, %d, %d, %d]",
-                    src.x, src.y, src.width, src.height,
-                    dest.x, dest.y, dest.width, dest.height);
-        }
-    }
-
-    public static class Chunk {
-        public static final int TYPE_FIXED = 0x0;
-        public static final int TYPE_HORIZONTAL = 0x1;
-        public static final int TYPE_VERTICAL = 0x2;
-        public static final int TYPE_CORRUPT = 0x80000000;
-
-        public int type = TYPE_FIXED;
-
-        public Rectangle rect = new Rectangle(0, 0, 0, 0);
-
-        public float horizontalWeight = 0.0f;
-        public float verticalWeight = 0.0f;
-
-        void init() {
-            type = Chunk.TYPE_FIXED;
-            horizontalWeight = 0.0f;
-            verticalWeight = 0.0f;
-            rect.x = 0;
-            rect.y = 0;
-            rect.width = 0;
-            rect.height = 0;
-        }
-
-        private String typeToString() {
-            switch (type) {
-                case TYPE_FIXED:
-                    return "FIXED";
-                case TYPE_HORIZONTAL:
-                    return "HORIZONTAL";
-                case TYPE_VERTICAL:
-                    return "VERTICAL";
-                case TYPE_HORIZONTAL + TYPE_VERTICAL:
-                    return "BOTH";
-                default:
-                    return "UNKNOWN";
-            }
-        }
-
-        @Override
-        public String toString() {
-            return String.format("%s %f/%f %s", typeToString(), horizontalWeight, verticalWeight,
-                    rect.toString());
-        }
-    }
-
-    public static class Tick {
-        public int start;
-        public int end;
-        public int color;
-
-        /**
-         * Get the tick length.
-         */
-        public int getLength() {
-            return end - start;
-        }
-
-        public Tick(int tickColor) {
-            color = tickColor;
-        }
-
-        @Override
-        public String toString() {
-            return String.format("%d tick: %d to %d", color, start, end);
-        }
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/draw9patch/ui/ImageEditorPanel.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/draw9patch/ui/ImageEditorPanel.java
deleted file mode 100644
index 7c45230..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/draw9patch/ui/ImageEditorPanel.java
+++ /dev/null
@@ -1,97 +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.eclipse.adt.internal.editors.draw9patch.ui;
-
-import com.android.ide.eclipse.adt.internal.editors.draw9patch.graphics.NinePatchedImage;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.SashForm;
-import org.eclipse.swt.dnd.DND;
-import org.eclipse.swt.dnd.DropTarget;
-import org.eclipse.swt.dnd.DropTargetListener;
-import org.eclipse.swt.dnd.FileTransfer;
-import org.eclipse.swt.dnd.Transfer;
-import org.eclipse.swt.layout.FillLayout;
-import org.eclipse.swt.widgets.Composite;
-
-/**
- * Image editor pane.
- */
-public class ImageEditorPanel extends Composite implements ImageViewer.UpdateListener,
-        StatusPanel.StatusChangedListener {
-
-    private static final int WEIGHT_VIEWER = 3;
-    private static final int WEIGHT_PREVIEW = 1;
-
-    private final ImageViewer mImageViewer;
-    private final StretchesViewer mStretchesViewer;
-
-    public ImageViewer getImageViewer() {
-        return mImageViewer;
-    }
-
-    public ImageEditorPanel(Composite parent, int style) {
-        super(parent, style);
-
-        setLayout(new FillLayout());
-        SashForm sashForm = new SashForm(this, SWT.HORIZONTAL);
-
-        mImageViewer = new ImageViewer(sashForm, SWT.BORDER | SWT.V_SCROLL | SWT.H_SCROLL);
-        mImageViewer.addUpdateListener(this);
-
-        mStretchesViewer = new StretchesViewer(sashForm, SWT.BORDER);
-
-        sashForm.setWeights(new int[] {
-                WEIGHT_VIEWER, WEIGHT_PREVIEW
-        });
-    }
-
-    @Override
-    public void zoomChanged(int zoom) {
-        mImageViewer.setZoom(zoom);
-    }
-
-    @Override
-    public void scaleChanged(int scale) {
-        mStretchesViewer.setScale(scale);
-    }
-
-    @Override
-    public void lockVisibilityChanged(boolean visible) {
-        mImageViewer.setShowLock(visible);
-    }
-
-    @Override
-    public void patchesVisibilityChanged(boolean visible) {
-        mImageViewer.setShowPatchesArea(visible);
-    }
-
-    @Override
-    public void badPatchesVisibilityChanged(boolean visible) {
-        mImageViewer.setShowBadPatchesArea(visible);
-    }
-
-    @Override
-    public void contentAreaVisibilityChanged(boolean visible) {
-        mStretchesViewer.setShowContentArea(visible);
-    }
-
-    @Override
-    public void update(NinePatchedImage image) {
-        mStretchesViewer.updatePreview(image);
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/draw9patch/ui/ImageViewer.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/draw9patch/ui/ImageViewer.java
deleted file mode 100644
index 2414a39..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/draw9patch/ui/ImageViewer.java
+++ /dev/null
@@ -1,774 +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.eclipse.adt.internal.editors.draw9patch.ui;
-
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.ide.eclipse.adt.internal.editors.draw9patch.graphics.NinePatchedImage;
-import com.android.ide.eclipse.adt.internal.editors.draw9patch.graphics.NinePatchedImage.Chunk;
-import com.android.ide.eclipse.adt.internal.editors.draw9patch.graphics.NinePatchedImage.Tick;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.KeyEvent;
-import org.eclipse.swt.events.KeyListener;
-import org.eclipse.swt.events.MouseEvent;
-import org.eclipse.swt.events.MouseListener;
-import org.eclipse.swt.events.MouseMoveListener;
-import org.eclipse.swt.events.PaintEvent;
-import org.eclipse.swt.events.PaintListener;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.GC;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.graphics.ImageData;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.graphics.RGB;
-import org.eclipse.swt.graphics.Rectangle;
-import org.eclipse.swt.widgets.Canvas;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.ScrollBar;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.concurrent.ArrayBlockingQueue;
-
-/**
- * View and edit Draw 9-patch image.
- */
-public class ImageViewer extends Canvas implements PaintListener, KeyListener, MouseListener,
-        MouseMoveListener {
-    private static final boolean DEBUG = false;
-
-    public static final String HELP_MESSAGE_KEY_TIPS = "Press Shift to erase pixels."
-            + " Press Control to draw layout bounds.";
-
-    public static final String HELP_MESSAGE_KEY_TIPS2 = "Release Shift to draw pixels.";
-
-    private static final Color BLACK_COLOR = AdtPlugin.getDisplay().getSystemColor(SWT.COLOR_BLACK);
-    private static final Color RED_COLOR = AdtPlugin.getDisplay().getSystemColor(SWT.COLOR_RED);
-
-    private static final Color BACK_COLOR
-            = new Color(AdtPlugin.getDisplay(), new RGB(0x00, 0xFF, 0x00));
-    private static final Color LOCK_COLOR
-            = new Color(AdtPlugin.getDisplay(), new RGB(0xFF, 0x00, 0x00));
-    private static final Color PATCH_COLOR
-            = new Color(AdtPlugin.getDisplay(), new RGB(0xFF, 0xFF, 0x00));
-    private static final Color PATCH_ONEWAY_COLOR
-            = new Color(AdtPlugin.getDisplay(), new RGB(0x00, 0x00, 0xFF));
-    private static final Color CORRUPTED_COLOR
-            = new Color(AdtPlugin.getDisplay(), new RGB(0xFF, 0x00, 0x00));
-
-    private static final int NONE_ALPHA = 0xFF;
-    private static final int LOCK_ALPHA = 50;
-    private static final int PATCH_ALPHA = 50;
-    private static final int GUIDE_ALPHA = 60;
-
-    private static final int MODE_NONE = 0x00;
-    private static final int MODE_BLACK_TICK = 0x01;
-    private static final int MODE_RED_TICK = 0x02;
-    private static final int MODE_ERASE = 0xFF;
-
-    private int mDrawMode = MODE_NONE;
-
-    private static final int MARGIN = 5;
-    private static final String CHECKER_PNG_PATH = "/icons/checker.png";
-
-    private Image mBackgroundLayer = null;
-
-    private NinePatchedImage mNinePatchedImage = null;
-
-    private Chunk[][] mChunks = null;
-    private Chunk[][] mBadChunks = null;
-
-    private boolean mIsLockShown = true;
-    private boolean mIsPatchesShown = false;
-    private boolean mIsBadPatchesShown = false;
-
-    private ScrollBar mHorizontalBar;
-    private ScrollBar mVerticalBar;
-
-    private int mZoom = 500;
-
-    private int mHorizontalScroll = 0;
-    private int mVerticalScroll = 0;
-
-    private final Rectangle mPadding = new Rectangle(0, 0, 0, 0);
-
-    // one pixel size that considered zoom
-    private int mZoomedPixelSize = 1;
-
-    private Image mBufferImage = null;
-
-    private boolean isCtrlPressed = false;
-    private boolean isShiftPressed = false;
-
-    private final List<UpdateListener> mUpdateListenerList
-            = new ArrayList<UpdateListener>();
-
-    private final Point mCursorPoint = new Point(0, 0);
-
-    private static final int DEFAULT_UPDATE_QUEUE_SIZE = 10;
-
-    private final ArrayBlockingQueue<NinePatchedImage> mUpdateQueue
-            = new ArrayBlockingQueue<NinePatchedImage>(DEFAULT_UPDATE_QUEUE_SIZE);
-
-    private final Runnable mUpdateRunnable = new Runnable() {
-        @Override
-        public void run() {
-            if (isDisposed()) {
-                return;
-            }
-
-            redraw();
-
-            fireUpdateEvent();
-        }
-    };
-
-    private final Thread mUpdateThread = new Thread() {
-        @Override
-        public void run() {
-            while (!isDisposed()) {
-                try {
-                    mUpdateQueue.take();
-                    mNinePatchedImage.findPatches();
-                    mNinePatchedImage.findContentsArea();
-
-                    mChunks = mNinePatchedImage.getChunks(mChunks);
-                    mBadChunks = mNinePatchedImage.getCorruptedChunks(mBadChunks);
-
-                    AdtPlugin.getDisplay().asyncExec(mUpdateRunnable);
-
-                } catch (InterruptedException e) {
-                }
-            }
-        }
-    };
-
-    private StatusChangedListener mStatusChangedListener = null;
-
-    public void addUpdateListener(UpdateListener l) {
-        mUpdateListenerList.add(l);
-    }
-
-    public void removeUpdateListener(UpdateListener l) {
-        mUpdateListenerList.remove(l);
-    }
-
-    private void fireUpdateEvent() {
-        int len = mUpdateListenerList.size();
-        for(int i=0; i < len; i++) {
-            mUpdateListenerList.get(i).update(mNinePatchedImage);
-        }
-    }
-
-    public void setStatusChangedListener(StatusChangedListener l) {
-        mStatusChangedListener = l;
-        if (mStatusChangedListener != null) {
-            mStatusChangedListener.helpTextChanged(HELP_MESSAGE_KEY_TIPS);
-        }
-    }
-
-    void setShowLock(boolean show) {
-        mIsLockShown = show;
-        redraw();
-    }
-
-    void setShowPatchesArea(boolean show) {
-        mIsPatchesShown = show;
-        redraw();
-    }
-
-    void setShowBadPatchesArea(boolean show) {
-        mIsBadPatchesShown = show;
-        redraw();
-    }
-
-    void setZoom(int zoom) {
-        mZoom = zoom;
-        mZoomedPixelSize = getZoomedPixelSize(1);
-        redraw();
-    }
-
-    public ImageViewer(Composite parent, int style) {
-        super(parent, style);
-
-        mUpdateThread.start();
-
-        mBackgroundLayer = AdtPlugin.getImageDescriptor(CHECKER_PNG_PATH).createImage();
-
-        addMouseListener(this);
-        addMouseMoveListener(this);
-        addPaintListener(this);
-
-        mHorizontalBar = getHorizontalBar();
-        mHorizontalBar.setThumb(1);
-        mHorizontalBar.addSelectionListener(new SelectionAdapter() {
-            @Override
-            public void widgetSelected(SelectionEvent event) {
-                super.widgetSelected(event);
-                ScrollBar bar = (ScrollBar) event.widget;
-                if (mHorizontalBar.isVisible()
-                        && mHorizontalScroll != bar.getSelection()) {
-                    mHorizontalScroll = bar.getSelection();
-                    redraw();
-                }
-            }
-        });
-
-        mVerticalBar = getVerticalBar();
-        mVerticalBar.setThumb(1);
-        mVerticalBar.addSelectionListener(new SelectionAdapter() {
-            @Override
-            public void widgetSelected(SelectionEvent event) {
-                super.widgetSelected(event);
-                ScrollBar bar = (ScrollBar) event.widget;
-                if (mVerticalBar.isVisible()
-                        && mVerticalScroll != bar.getSelection()) {
-                    mVerticalScroll = bar.getSelection();
-                    redraw();
-                }
-            }
-        });
-    }
-
-    /**
-     * Load the image file.
-     *
-     * @param fileName must be absolute path
-     */
-    public NinePatchedImage loadFile(String fileName) {
-        mNinePatchedImage = new NinePatchedImage(fileName);
-
-        return mNinePatchedImage;
-    }
-
-    /**
-     * Start displaying the image.
-     */
-    public void startDisplay() {
-        mZoomedPixelSize = getZoomedPixelSize(1);
-
-        scheduleUpdate();
-    }
-
-    private void draw(int x, int y, int drawMode) {
-        if (drawMode == MODE_ERASE) {
-            erase(x, y);
-        } else {
-            int color = (drawMode == MODE_RED_TICK) ? NinePatchedImage.RED_TICK
-                    : NinePatchedImage.BLACK_TICK;
-            mNinePatchedImage.setPatch(x, y, color);
-            redraw();
-
-            scheduleUpdate();
-        }
-    }
-
-    private void erase(int x, int y) {
-        mNinePatchedImage.erase(x, y);
-        redraw();
-
-        scheduleUpdate();
-    }
-
-    private void scheduleUpdate() {
-        try {
-            mUpdateQueue.put(mNinePatchedImage);
-        } catch (InterruptedException e) {
-        }
-    }
-
-    @Override
-    public void mouseDown(MouseEvent event) {
-        if (event.button == 1 && !isShiftPressed) {
-            mDrawMode = !isCtrlPressed ? MODE_BLACK_TICK : MODE_RED_TICK;
-            draw(mCursorPoint.x, mCursorPoint.y, mDrawMode);
-        } else if (event.button == 3 || isShiftPressed) {
-            mDrawMode = MODE_ERASE;
-            erase(mCursorPoint.x, mCursorPoint.y);
-        }
-    }
-
-    @Override
-    public void mouseUp(MouseEvent event) {
-        mDrawMode = MODE_NONE;
-    }
-
-    @Override
-    public void mouseDoubleClick(MouseEvent event) {
-    }
-
-    private int getLogicalPositionX(int x) {
-        return Math.round((x - mPadding.x + mHorizontalScroll) / ((float) mZoom / 100));
-    }
-
-    private int getLogicalPositionY(int y) {
-        return Math.round((y - mPadding.y + mVerticalScroll) / ((float) mZoom / 100));
-    }
-
-    @Override
-    public void mouseMove(MouseEvent event) {
-        int posX = getLogicalPositionX(event.x);
-        int posY = getLogicalPositionY(event.y);
-
-        int width = mNinePatchedImage.getWidth();
-        int height = mNinePatchedImage.getHeight();
-
-        if (posX < 0) {
-            posX = 0;
-        }
-        if (posX >= width) {
-            posX = width - 1;
-        }
-        if (posY < 0) {
-            posY = 0;
-        }
-        if (posY >= height) {
-            posY = height - 1;
-        }
-
-        if (mDrawMode != MODE_NONE) {
-            int drawMode = mDrawMode;
-            if (isShiftPressed) {
-                drawMode = MODE_ERASE;
-            } else if (mDrawMode != MODE_ERASE) {
-                drawMode = !isCtrlPressed ? MODE_BLACK_TICK : MODE_RED_TICK;
-            }
-
-            /*
-             * Consider the previous cursor position because mouseMove events are
-             * scatter.
-             */
-            int x = mCursorPoint.x;
-            int y = mCursorPoint.y;
-            for (; y != posY; y += (y > posY) ? -1 : 1) {
-                draw(x, y, drawMode);
-            }
-
-            x = mCursorPoint.x;
-            y = mCursorPoint.y;
-            for (; x != posX; x += (x > posX) ? -1 : 1) {
-                draw(x, y, drawMode);
-            }
-        }
-        mCursorPoint.x = posX;
-        mCursorPoint.y = posY;
-
-        redraw();
-
-        if (mStatusChangedListener != null) {
-            // Update position on status panel if position is in logical size.
-            if (posX >= 0 && posY >= 0
-                    && posX <= mNinePatchedImage.getWidth()
-                    && posY <= mNinePatchedImage.getHeight()) {
-                mStatusChangedListener.cursorPositionChanged(posX + 1, posY + 1);
-            }
-        }
-    }
-
-    private synchronized void calcPaddings(int width, int height) {
-        Point canvasSize = getSize();
-
-        mPadding.width = getZoomedPixelSize(width);
-        mPadding.height = getZoomedPixelSize(height);
-
-        int margin = getZoomedPixelSize(MARGIN);
-
-        if (mPadding.width < canvasSize.x) {
-            mPadding.x = (canvasSize.x - mPadding.width) / 2;
-        } else {
-            mPadding.x = margin;
-        }
-
-        if (mPadding.height < canvasSize.y) {
-            mPadding.y = (canvasSize.y - mPadding.height) / 2;
-        } else {
-            mPadding.y = margin;
-        }
-    }
-
-    private void calcScrollBarSettings() {
-        Point size = getSize();
-        int screenWidth = size.x;
-        int screenHeight = size.y;
-
-        int imageWidth = getZoomedPixelSize(mNinePatchedImage.getWidth() + 1);
-        int imageHeight = getZoomedPixelSize(mNinePatchedImage.getHeight() + 1);
-
-        // consider the scroll bar sizes
-        int verticalBarSize = mVerticalBar.getSize().x;
-        int horizontalBarSize = mHorizontalBar.getSize().y;
-
-        int horizontalScroll = imageWidth - (screenWidth - verticalBarSize);
-        int verticalScroll = imageHeight - (screenHeight - horizontalBarSize);
-
-        int margin = getZoomedPixelSize(MARGIN) * 2;
-
-        if (horizontalScroll > 0) {
-            mHorizontalBar.setVisible(true);
-
-            // horizontal maximum
-            int max = horizontalScroll + verticalBarSize + margin;
-            mHorizontalBar.setMaximum(max);
-
-            // set corrected scroll size
-            int value = mHorizontalBar.getSelection();
-            value = max < value ? max : value;
-
-            mHorizontalBar.setSelection(value);
-            mHorizontalScroll = value;
-
-        } else {
-            mHorizontalBar.setSelection(0);
-            mHorizontalBar.setMaximum(0);
-            mHorizontalBar.setVisible(false);
-        }
-
-        if (verticalScroll > 0) {
-            mVerticalBar.setVisible(true);
-
-            // vertical maximum
-            int max = verticalScroll + horizontalBarSize + margin;
-            mVerticalBar.setMaximum(max);
-
-            // set corrected scroll size
-            int value = mVerticalBar.getSelection();
-            value = max < value ? max : value;
-
-            mVerticalBar.setSelection(value);
-            mVerticalScroll = value;
-
-        } else {
-            mVerticalBar.setSelection(0);
-            mVerticalBar.setMaximum(0);
-            mVerticalBar.setVisible(false);
-        }
-    }
-
-    private int getZoomedPixelSize(int val) {
-        return Math.round(val * (float) mZoom / 100);
-    }
-
-    @Override
-    public void paintControl(PaintEvent pe) {
-        if (mNinePatchedImage == null) {
-            return;
-        }
-
-        // Use buffer
-        GC bufferGc = null;
-        if (mBufferImage == null) {
-            mBufferImage = new Image(AdtPlugin.getDisplay(), pe.width, pe.height);
-        } else {
-            int width = mBufferImage.getBounds().width;
-            int height = mBufferImage.getBounds().height;
-            if (width != pe.width || height != pe.height) {
-                mBufferImage = new Image(AdtPlugin.getDisplay(), pe.width, pe.height);
-            }
-        }
-
-        // Draw previous image once for prevent flicking
-        pe.gc.drawImage(mBufferImage, 0, 0);
-
-        bufferGc = new GC(mBufferImage);
-        bufferGc.setAdvanced(true);
-
-        // Make interpolation disable
-        bufferGc.setInterpolation(SWT.NONE);
-
-        // clear buffer
-        bufferGc.fillRectangle(0, 0, pe.width, pe.height);
-
-        calcScrollBarSettings();
-
-        // padding from current zoom
-        int width = mNinePatchedImage.getWidth();
-        int height = mNinePatchedImage.getHeight();
-        calcPaddings(width, height);
-
-        int baseX = mPadding.x - mHorizontalScroll;
-        int baseY = mPadding.y - mVerticalScroll;
-
-        // draw checker image
-        bufferGc.drawImage(mBackgroundLayer,
-                0, 0, mBackgroundLayer.getImageData().width,
-                mBackgroundLayer.getImageData().height,
-                baseX, baseY, mPadding.width, mPadding.height);
-
-        if (DEBUG) {
-            System.out.println(String.format("%d,%d %d,%d %d,%d",
-                    width, height, baseX, baseY, mPadding.width, mPadding.height));
-        }
-
-        // draw image
-        /* TODO: Do not draw invisible area, for better performance. */
-        bufferGc.drawImage(mNinePatchedImage.getImage(), 0, 0, width, height, baseX, baseY,
-                mPadding.width, mPadding.height);
-
-        bufferGc.setBackground(BLACK_COLOR);
-
-        // draw patch ticks
-        drawHorizontalPatches(bufferGc, baseX, baseY);
-        drawVerticalPatches(bufferGc, baseX, baseY);
-
-        // draw content ticks
-        drawHorizontalContentArea(bufferGc, baseX, baseY);
-        drawVerticalContentArea(bufferGc, baseX, baseY);
-
-        if (mNinePatchedImage.isValid(mCursorPoint.x, mCursorPoint.y)) {
-            bufferGc.setForeground(BLACK_COLOR);
-        } else if (mIsLockShown) {
-            drawLockArea(bufferGc, baseX, baseY);
-        }
-
-        // Patches
-        if (mIsPatchesShown) {
-            drawPatchAreas(bufferGc, baseX, baseY);
-        }
-
-        // Bad patches
-        if (mIsBadPatchesShown) {
-            drawBadPatchAreas(bufferGc, baseX, baseY);
-        }
-
-        if (mNinePatchedImage.isValid(mCursorPoint.x, mCursorPoint.y)) {
-            bufferGc.setForeground(BLACK_COLOR);
-        } else {
-            bufferGc.setForeground(RED_COLOR);
-        }
-
-        drawGuideLine(bufferGc, baseX, baseY);
-
-        bufferGc.dispose();
-
-        pe.gc.drawImage(mBufferImage, 0, 0);
-    }
-
-    private static final Color getColor(int color) {
-        switch (color) {
-            case NinePatchedImage.RED_TICK:
-                return RED_COLOR;
-            default:
-                return BLACK_COLOR;
-        }
-    }
-
-    private void drawVerticalPatches(GC gc, int baseX, int baseY) {
-        List<Tick> verticalPatches = mNinePatchedImage.getVerticalPatches();
-        for (Tick t : verticalPatches) {
-            if (t.color != NinePatchedImage.TRANSPARENT_TICK) {
-                gc.setBackground(getColor(t.color));
-                gc.fillRectangle(
-                        baseX,
-                        baseY + getZoomedPixelSize(t.start),
-                        mZoomedPixelSize,
-                        getZoomedPixelSize(t.getLength()));
-            }
-        }
-    }
-
-    private void drawHorizontalPatches(GC gc, int baseX, int baseY) {
-        List<Tick> horizontalPatches = mNinePatchedImage.getHorizontalPatches();
-        for (Tick t : horizontalPatches) {
-            if (t.color != NinePatchedImage.TRANSPARENT_TICK) {
-                gc.setBackground(getColor(t.color));
-                gc.fillRectangle(
-                        baseX + getZoomedPixelSize(t.start),
-                        baseY,
-                        getZoomedPixelSize(t.getLength()),
-                        mZoomedPixelSize);
-            }
-        }
-    }
-
-    private void drawHorizontalContentArea(GC gc, int baseX, int baseY) {
-        List<Tick> horizontalContentArea = mNinePatchedImage.getHorizontalContents();
-        for (Tick t : horizontalContentArea) {
-            if (t.color != NinePatchedImage.TRANSPARENT_TICK) {
-                gc.setBackground(getColor(t.color));
-                gc.fillRectangle(
-                        baseX + getZoomedPixelSize(t.start),
-                        baseY + getZoomedPixelSize(mNinePatchedImage.getHeight() - 1),
-                        getZoomedPixelSize(t.getLength()),
-                        mZoomedPixelSize);
-            }
-        }
-
-    }
-
-    private void drawVerticalContentArea(GC gc, int baseX, int baseY) {
-        List<Tick> verticalContentArea = mNinePatchedImage.getVerticalContents();
-        for (Tick t : verticalContentArea) {
-            if (t.color != NinePatchedImage.TRANSPARENT_TICK) {
-                gc.setBackground(getColor(t.color));
-                gc.fillRectangle(
-                        baseX + getZoomedPixelSize(mNinePatchedImage.getWidth() - 1),
-                        baseY + getZoomedPixelSize(t.start),
-                        mZoomedPixelSize,
-                        getZoomedPixelSize(t.getLength()));
-            }
-        }
-    }
-
-    private void drawLockArea(GC gc, int baseX, int baseY) {
-        gc.setAlpha(LOCK_ALPHA);
-        gc.setForeground(LOCK_COLOR);
-        gc.setBackground(LOCK_COLOR);
-
-        gc.fillRectangle(
-                baseX + mZoomedPixelSize,
-                baseY + mZoomedPixelSize,
-                getZoomedPixelSize(mNinePatchedImage.getWidth() - 2),
-                getZoomedPixelSize(mNinePatchedImage.getHeight() - 2));
-        gc.setAlpha(NONE_ALPHA);
-
-    }
-
-    private void drawPatchAreas(GC gc, int baseX, int baseY) {
-        if (mChunks != null) {
-            int yLen = mChunks.length;
-            int xLen = mChunks[0].length;
-
-            gc.setAlpha(PATCH_ALPHA);
-
-            for (int yPos = 0; yPos < yLen; yPos++) {
-                for (int xPos = 0; xPos < xLen; xPos++) {
-                    Chunk c = mChunks[yPos][xPos];
-
-                    if (c.type == Chunk.TYPE_FIXED) {
-                        gc.setBackground(BACK_COLOR);
-                    } else if (c.type == Chunk.TYPE_HORIZONTAL) {
-                        gc.setBackground(PATCH_ONEWAY_COLOR);
-                    } else if (c.type == Chunk.TYPE_VERTICAL) {
-                        gc.setBackground(PATCH_ONEWAY_COLOR);
-                    } else if (c.type == Chunk.TYPE_HORIZONTAL + Chunk.TYPE_VERTICAL) {
-                        gc.setBackground(PATCH_COLOR);
-                    }
-                    Rectangle r = c.rect;
-                    gc.fillRectangle(
-                            baseX + getZoomedPixelSize(r.x),
-                            baseY + getZoomedPixelSize(r.y),
-                            getZoomedPixelSize(r.width),
-                            getZoomedPixelSize(r.height));
-                }
-            }
-        }
-        gc.setAlpha(NONE_ALPHA);
-    }
-
-    private void drawBadPatchAreas(GC gc, int baseX, int baseY) {
-        if (mBadChunks != null) {
-            int yLen = mBadChunks.length;
-            int xLen = mBadChunks[0].length;
-
-            gc.setAlpha(NONE_ALPHA);
-            gc.setForeground(CORRUPTED_COLOR);
-            gc.setBackground(CORRUPTED_COLOR);
-
-            for (int yPos = 0; yPos < yLen; yPos++) {
-                for (int xPos = 0; xPos < xLen; xPos++) {
-                    Chunk c = mBadChunks[yPos][xPos];
-                    if ((c.type & Chunk.TYPE_CORRUPT) != 0) {
-                        Rectangle r = c.rect;
-                        gc.drawRectangle(
-                                baseX + getZoomedPixelSize(r.x),
-                                baseY + getZoomedPixelSize(r.y),
-                                getZoomedPixelSize(r.width),
-                                getZoomedPixelSize(r.height));
-                    }
-                }
-            }
-        }
-    }
-
-    private void drawGuideLine(GC gc, int baseX, int baseY) {
-        gc.setAntialias(SWT.ON);
-        gc.setInterpolation(SWT.HIGH);
-
-        int x = Math.round((mCursorPoint.x * ((float) mZoom / 100) + baseX)
-                + ((float) mZoom / 100 / 2));
-        int y = Math.round((mCursorPoint.y * ((float) mZoom / 100) + baseY)
-                + ((float) mZoom / 100 / 2));
-        gc.setAlpha(GUIDE_ALPHA);
-
-        Point size = getSize();
-        gc.drawLine(x, 0, x, size.y);
-        gc.drawLine(0, y, size.x, y);
-
-        gc.setAlpha(NONE_ALPHA);
-    }
-
-    @Override
-    public void keyPressed(KeyEvent event) {
-        int keycode = event.keyCode;
-        if (keycode == SWT.CTRL) {
-            isCtrlPressed = true;
-        }
-        if (keycode == SWT.SHIFT) {
-            isShiftPressed = true;
-            if (mStatusChangedListener != null) {
-                mStatusChangedListener.helpTextChanged(HELP_MESSAGE_KEY_TIPS2);
-            }
-        }
-    }
-
-    @Override
-    public void keyReleased(KeyEvent event) {
-        int keycode = event.keyCode;
-        if (keycode == SWT.CTRL) {
-            isCtrlPressed = false;
-        }
-        if (keycode == SWT.SHIFT) {
-            isShiftPressed = false;
-            if (mStatusChangedListener != null) {
-                mStatusChangedListener.helpTextChanged(HELP_MESSAGE_KEY_TIPS);
-            }
-        }
-    }
-
-    @Override
-    public void dispose() {
-        mBackgroundLayer.dispose();
-        super.dispose();
-    }
-
-    /**
-     * Listen image updated event.
-     */
-    public interface UpdateListener {
-        /**
-         * 9-patched image has been updated.
-         */
-        public void update(NinePatchedImage image);
-    }
-
-    /**
-     * Listen status changed event.
-     */
-    public interface StatusChangedListener {
-        /**
-         * Mouse cursor position has been changed.
-         */
-        public void cursorPositionChanged(int x, int y);
-
-        /**
-         * Help text has been changed.
-         */
-        public void helpTextChanged(String text);
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/draw9patch/ui/MainFrame.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/draw9patch/ui/MainFrame.java
deleted file mode 100644
index 71845c1..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/draw9patch/ui/MainFrame.java
+++ /dev/null
@@ -1,79 +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.eclipse.adt.internal.editors.draw9patch.ui;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.FormAttachment;
-import org.eclipse.swt.layout.FormData;
-import org.eclipse.swt.layout.FormLayout;
-import org.eclipse.swt.widgets.Composite;
-
-/**
- * Main frame.
- */
-public class MainFrame extends Composite implements ImageViewer.StatusChangedListener {
-
-    private final StatusPanel mStatusPanel;
-    private final ImageEditorPanel mImageEditorPanel;
-
-    public StatusPanel getStatusPanel() {
-        return mStatusPanel;
-    }
-
-    public ImageEditorPanel getImageEditorPanel() {
-        return mImageEditorPanel;
-    }
-
-    public MainFrame(Composite parent, int style) {
-        super(parent, style);
-        setLayout(new FormLayout());
-
-        mStatusPanel = new StatusPanel(this, SWT.NULL);
-
-        FormData bottom = new FormData();
-        bottom.bottom = new FormAttachment(100, 0);
-        bottom.left = new FormAttachment(0, 0);
-        bottom.right = new FormAttachment(100, 0);
-        mStatusPanel.setLayoutData(bottom);
-
-        mImageEditorPanel = new ImageEditorPanel(this, SWT.NULL);
-        mImageEditorPanel.getImageViewer().setStatusChangedListener(this);
-
-        mStatusPanel.setStatusChangedListener(mImageEditorPanel);
-
-        FormData top = new FormData();
-        top.top = new FormAttachment(0);
-        top.left = new FormAttachment(0);
-        top.right = new FormAttachment(100);
-        top.bottom = new FormAttachment(mStatusPanel);
-        mImageEditorPanel.setLayoutData(top);
-
-        addKeyListener(mStatusPanel);
-        addKeyListener(mImageEditorPanel.getImageViewer());
-    }
-
-    @Override
-    public void cursorPositionChanged(int x, int y) {
-        mStatusPanel.setPosition(x, y);
-    }
-
-    @Override
-    public void helpTextChanged(String text) {
-        mStatusPanel.setHelpText(text);
-    }
-
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/draw9patch/ui/StatusPanel.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/draw9patch/ui/StatusPanel.java
deleted file mode 100644
index 6ad258e..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/draw9patch/ui/StatusPanel.java
+++ /dev/null
@@ -1,357 +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.eclipse.adt.internal.editors.draw9patch.ui;
-
-import com.android.ide.eclipse.adt.AdtPlugin;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.ControlEvent;
-import org.eclipse.swt.events.ControlListener;
-import org.eclipse.swt.events.KeyEvent;
-import org.eclipse.swt.events.KeyListener;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.layout.FormAttachment;
-import org.eclipse.swt.layout.FormData;
-import org.eclipse.swt.layout.FormLayout;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Scale;
-
-/**
- * Status and control pane.
- */
-public class StatusPanel extends Composite implements KeyListener {
-
-    public static final int SCALE_MIN = 2;
-    public static final int SCALE_MAX = 6;
-
-    public static final int ZOOM_MIN = 100;
-    public static final int ZOOM_MAX = 800;
-
-    public static final int PADDING_TOP = 12;
-    public static final int PADDING_RIGHT = 0;
-    public static final int PADDING_BOTTOM = 5;
-    public static final int PADDING_LEFT = 10;
-
-    public static final int MIN_WIDTH = 800;
-
-    private Button mShowLock = null;
-    private Button mShowPatches = null;
-    private Button mShowBadPatches = null;
-    private Button mShowContent = null;
-
-    private Label mHelpLabel = null;
-
-    private Label mXPosLabel = null;
-    private Label mYPosLabel = null;
-
-    private ZoomControl mZoomControl = null;
-    private ZoomControl mScaleControl = null;
-
-    private StatusChangedListener mListener = null;
-
-    public void setStatusChangedListener(StatusChangedListener l) {
-        mListener = l;
-    }
-
-    public void setHelpText(String text) {
-        Point size = getSize();
-        // check window width
-        if (MIN_WIDTH < size.x) {
-            mHelpLabel.setText(text);
-            mHelpLabel.setVisible(true);
-        } else {
-            mHelpLabel.setText("N/A");
-            mHelpLabel.setVisible(false);
-        }
-    }
-
-    /**
-     * Set mouse cursor position.
-     */
-    public void setPosition(int x, int y) {
-        mXPosLabel.setText(String.format("X:  %4d px", x));
-        mYPosLabel.setText(String.format("Y:  %4d px", y));
-    }
-
-    public StatusPanel(Composite parent, int style) {
-        super(parent, style);
-        setLayout(new FormLayout());
-
-        final Composite container = new Composite(this, SWT.NULL);
-        container.setLayout(new FormLayout());
-
-        FormData innerForm = new FormData();
-        innerForm.left = new FormAttachment(0, PADDING_LEFT);
-        innerForm.top = new FormAttachment(0, PADDING_TOP);
-        innerForm.right = new FormAttachment(100, PADDING_RIGHT);
-        innerForm.bottom = new FormAttachment(100, -PADDING_BOTTOM);
-        container.setLayoutData(innerForm);
-
-        buildPosition(container);
-
-        Composite zoomPanels = new Composite(container, SWT.NULL);
-        zoomPanels.setLayout(new GridLayout(3, false));
-
-        buildZoomControl(zoomPanels);
-        buildScaleControl(zoomPanels);
-
-        Composite checkPanel = new Composite(container, SWT.NULL);
-        checkPanel.setLayout(new GridLayout(2, false));
-        FormData checkPanelForm = new FormData();
-        checkPanelForm.left = new FormAttachment(zoomPanels, 0);
-        checkPanelForm.bottom = new FormAttachment(100, -PADDING_BOTTOM);
-        checkPanel.setLayoutData(checkPanelForm);
-
-        buildCheckboxes(checkPanel);
-
-        mHelpLabel = new Label(container, SWT.BORDER_SOLID | SWT.BOLD | SWT.WRAP);
-        mHelpLabel.setBackground(new Color(AdtPlugin.getDisplay(), 0xFF, 0xFF, 0xFF));
-        FormData hintForm = new FormData();
-        hintForm.left = new FormAttachment(checkPanel, 5);
-        hintForm.right = new FormAttachment(mXPosLabel, -10);
-        hintForm.top = new FormAttachment(PADDING_TOP);
-        hintForm.bottom = new FormAttachment(100, -PADDING_BOTTOM);
-        mHelpLabel.setLayoutData(hintForm);
-
-        /*
-         * If the window width is not much, the "help label" will break the window.
-         * Because that is wrapped automatically.
-         *
-         * This listener catch resized events and reset help text.
-         *
-         * setHelpText method checks window width.
-         * If window is too narrow, help text will be set invisible.
-         */
-        container.addControlListener(new ControlListener() {
-            @Override
-            public void controlResized(ControlEvent event) {
-                // reset text
-                setHelpText(ImageViewer.HELP_MESSAGE_KEY_TIPS);
-            }
-            @Override
-            public void controlMoved(ControlEvent event) {
-            }
-        });
-
-    }
-
-    private void buildPosition(Composite parent) {
-        mXPosLabel = new Label(parent, SWT.NULL);
-        mYPosLabel = new Label(parent, SWT.NULL);
-
-        mXPosLabel.setText(String.format("X:  %4d px", 1000));
-        mYPosLabel.setText(String.format("Y:  %4d px", 1000));
-
-        FormData bottomRight = new FormData();
-        bottomRight.bottom = new FormAttachment(100, 0);
-        bottomRight.right = new FormAttachment(100, 0);
-        mYPosLabel.setLayoutData(bottomRight);
-
-        FormData aboveYPosLabel = new FormData();
-        aboveYPosLabel.bottom = new FormAttachment(mYPosLabel);
-        aboveYPosLabel.right = new FormAttachment(100, 0);
-        mXPosLabel.setLayoutData(aboveYPosLabel);
-    }
-
-    private void buildScaleControl(Composite parent) {
-        mScaleControl = new ZoomControl(parent);
-        mScaleControl.maxLabel.setText("6x");
-        mScaleControl.minLabel.setText("2x");
-        mScaleControl.scale.setMinimum(SCALE_MIN);
-        mScaleControl.scale.setMaximum(SCALE_MAX);
-        mScaleControl.scale.setSelection(2);
-        mScaleControl.scale.addSelectionListener(new SelectionAdapter() {
-            @Override
-            public void widgetSelected(SelectionEvent event) {
-                super.widgetSelected(event);
-                if (mListener != null) {
-                    Scale scale = (Scale) event.widget;
-                    mListener.scaleChanged(scale.getSelection());
-                }
-            }
-        });
-    }
-
-    private void buildZoomControl(Composite parent) {
-        mZoomControl = new ZoomControl(parent);
-        mZoomControl.maxLabel.setText("800%");
-        mZoomControl.minLabel.setText("100%");
-        mZoomControl.scale.setMinimum(ZOOM_MIN);
-        mZoomControl.scale.setMaximum(ZOOM_MAX - ZOOM_MIN);
-        mZoomControl.scale.setSelection(400);
-        mZoomControl.scale.addSelectionListener(new SelectionAdapter() {
-            @Override
-            public void widgetSelected(SelectionEvent event) {
-                super.widgetSelected(event);
-                if (mListener != null) {
-                    Scale scale = (Scale) event.widget;
-                    mListener.zoomChanged(scale.getSelection() + ZOOM_MIN);
-                }
-            }
-        });
-
-    }
-
-    private void buildCheckboxes(Composite parent) {
-        // check lock
-        mShowLock = new Button(parent, SWT.CHECK);
-        mShowLock.setText("show Lock");
-        mShowLock.setSelection(true);
-        mShowLock.addSelectionListener(new SelectionAdapter() {
-            @Override
-            public void widgetSelected(SelectionEvent event) {
-                super.widgetSelected(event);
-                if (mListener != null) {
-                    mListener.lockVisibilityChanged(mShowLock.getSelection());
-                }
-            }
-        });
-
-        // check patches
-        mShowPatches = new Button(parent, SWT.CHECK);
-        mShowPatches.setText("show Patches");
-        mShowPatches.addSelectionListener(new SelectionAdapter() {
-            @Override
-            public void widgetSelected(SelectionEvent event) {
-                super.widgetSelected(event);
-                if (mListener != null) {
-                    mListener.patchesVisibilityChanged(mShowPatches.getSelection());
-                }
-            }
-        });
-
-        // check patches
-        mShowBadPatches = new Button(parent, SWT.CHECK);
-        mShowBadPatches.setText("show Bad patches");
-        mShowBadPatches.addSelectionListener(new SelectionAdapter() {
-            @Override
-            public void widgetSelected(SelectionEvent event) {
-                super.widgetSelected(event);
-                if (mListener != null) {
-                    mListener.badPatchesVisibilityChanged(mShowBadPatches.getSelection());
-                }
-            }
-        });
-
-        // check contents(padding)
-        mShowContent = new Button(parent, SWT.CHECK);
-        mShowContent.setText("show Contents");
-        mShowContent.addSelectionListener(new SelectionAdapter() {
-            @Override
-            public void widgetSelected(SelectionEvent event) {
-                super.widgetSelected(event);
-                if (mListener != null) {
-                    mListener.contentAreaVisibilityChanged(mShowContent.getSelection());
-                }
-            }
-        });
-    }
-
-    @Override
-    public void keyPressed(KeyEvent event) {
-        switch (event.character) {
-            case 'c':
-                mShowContent.setSelection(!mShowContent.getSelection());
-                if (mListener != null) {
-                    mListener.contentAreaVisibilityChanged(mShowContent.getSelection());
-                }
-                break;
-            case 'l':
-                mShowLock.setSelection(!mShowLock.getSelection());
-                if (mListener != null) {
-                    mListener.lockVisibilityChanged(mShowLock.getSelection());
-                }
-                break;
-            case 'p':
-                mShowPatches.setSelection(!mShowPatches.getSelection());
-                if (mListener != null) {
-                    mListener.patchesVisibilityChanged(mShowPatches.getSelection());
-                }
-                break;
-            case 'b':
-                mShowBadPatches.setSelection(!mShowBadPatches.getSelection());
-                if (mListener != null) {
-                    mListener.badPatchesVisibilityChanged(mShowBadPatches.getSelection());
-                }
-                break;
-        }
-    }
-
-    @Override
-    public void keyReleased(KeyEvent event) {
-    }
-
-    private static class ZoomControl {
-
-        private Label minLabel;
-        private Label maxLabel;
-        Scale scale;
-
-        public ZoomControl(Composite composite) {
-            minLabel = new Label(composite, SWT.RIGHT);
-            scale = new Scale(composite, SWT.HORIZONTAL);
-            maxLabel = new Label(composite, SWT.LEFT);
-        }
-    }
-
-    /**
-     * Status changed events listener.
-     */
-    public interface StatusChangedListener {
-        /**
-         * Zoom level has been changed.
-         * @param zoom
-         */
-        public void zoomChanged(int zoom);
-
-        /**
-         * Scale has been changed.
-         * @param scale
-         */
-        public void scaleChanged(int scale);
-
-        /**
-         * Lock visibility has been changed.
-         * @param visible
-         */
-        public void lockVisibilityChanged(boolean visible);
-
-        /**
-         * Patches visibility has been changed.
-         * @param visible
-         */
-        public void patchesVisibilityChanged(boolean visible);
-
-        /**
-         * BadPatches visibility has been changed.
-         * @param visible
-         */
-        public void badPatchesVisibilityChanged(boolean visible);
-
-        /**
-         * Content visibility has been changed.
-         * @param visible
-         */
-        public void contentAreaVisibilityChanged(boolean visible);
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/draw9patch/ui/StretchesViewer.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/draw9patch/ui/StretchesViewer.java
deleted file mode 100644
index 353312c..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/draw9patch/ui/StretchesViewer.java
+++ /dev/null
@@ -1,267 +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.eclipse.adt.internal.editors.draw9patch.ui;
-
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.ide.eclipse.adt.internal.editors.draw9patch.graphics.GraphicsUtilities;
-import com.android.ide.eclipse.adt.internal.editors.draw9patch.graphics.NinePatchedImage;
-import com.android.ide.eclipse.adt.internal.editors.draw9patch.graphics.NinePatchedImage.Projection;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.PaintEvent;
-import org.eclipse.swt.events.PaintListener;
-import org.eclipse.swt.graphics.GC;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.graphics.ImageData;
-import org.eclipse.swt.graphics.PaletteData;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.graphics.RGB;
-import org.eclipse.swt.graphics.Rectangle;
-import org.eclipse.swt.layout.FillLayout;
-import org.eclipse.swt.widgets.Canvas;
-import org.eclipse.swt.widgets.Composite;
-
-/**
- * Preview 9-patched image pane.
- */
-public class StretchesViewer extends Composite {
-    private static final boolean DEBUG = false;
-
-    private static final int PADDING_COLOR = 0x0000CC;
-
-    private static final int PADDING_COLOR_ALPHA = 100;
-
-    private static final PaletteData PADDING_PALLET
-            = new PaletteData(new RGB[] {new RGB(0x00, 0x00, 0xCC)});
-
-    private static final String CHECKER_PNG_PATH = "/icons/checker.png";
-
-    private Image mBackgroundLayer = null;
-
-    private final StretchView mHorizontal;
-    private final StretchView mVertical;
-
-    private final StretchView mBoth;
-
-    private NinePatchedImage mNinePatchedImage = null;
-
-    private ImageData mContentAreaImageData = null;
-
-    private boolean mIsContentAreaShown = false;
-
-    private Image mContentAreaImage = null;
-
-    private int mScale = 2;
-
-    public StretchesViewer(Composite parent, int style) {
-        super(parent, style);
-
-        mBackgroundLayer = AdtPlugin.getImageDescriptor(CHECKER_PNG_PATH).createImage();
-
-        setLayout(new FillLayout(SWT.VERTICAL));
-
-        mHorizontal = new StretchView(this, SWT.NULL);
-        mVertical = new StretchView(this, SWT.NULL);
-        mBoth = new StretchView(this, SWT.NULL);
-    }
-
-    /**
-     * Set show/not show content area.
-     * @param If show, true
-     */
-    public void setShowContentArea(boolean show) {
-        mIsContentAreaShown = show;
-        redraw();
-    }
-
-    private static final boolean equalSize(ImageData image1, ImageData image2) {
-        return (image1.width == image2.width && image1.height == image2.height);
-    }
-
-    /**
-     * Update preview image.
-     */
-    public void updatePreview(NinePatchedImage image) {
-        mNinePatchedImage = image;
-        ImageData base = mNinePatchedImage.getImageData();
-
-        if (mContentAreaImageData == null
-                || (mContentAreaImageData != null && !equalSize(base, mContentAreaImageData))) {
-            mContentAreaImageData = new ImageData(
-                    base.width,
-                    base.height,
-                    1,
-                    PADDING_PALLET);
-        } else {
-            GraphicsUtilities.clearImageData(mContentAreaImageData);
-        }
-
-        mHorizontal.setImage(mNinePatchedImage);
-        mVertical.setImage(mNinePatchedImage);
-        mBoth.setImage(mNinePatchedImage);
-
-        mContentAreaImage = buildContentAreaPreview();
-
-        setScale(mScale);
-    }
-
-    private Image buildContentAreaPreview() {
-        if (mContentAreaImage != null) {
-            mContentAreaImage.dispose();
-        }
-
-        Rectangle rect = mNinePatchedImage.getContentArea();
-
-        int yLen = rect.y + rect.height;
-        for (int y = rect.y; y < yLen; y++) {
-            int xLen = rect.x + rect.width;
-            for (int x = rect.x; x < xLen; x++) {
-                mContentAreaImageData.setPixel(x, y, PADDING_COLOR);
-                mContentAreaImageData.setAlpha(x, y, PADDING_COLOR_ALPHA);
-            }
-        }
-        return new Image(AdtPlugin.getDisplay(), mContentAreaImageData);
-    }
-
-    public void setScale(int scale) {
-        if (DEBUG) {
-            System.out.println("scale = " + scale);
-        }
-
-        mScale = scale;
-        int imageWidth = mNinePatchedImage.getWidth();
-        int imageHeight = mNinePatchedImage.getHeight();
-
-        mHorizontal.setSize(imageWidth * scale, imageHeight);
-        mVertical.setSize(imageWidth, imageHeight * scale);
-        mBoth.setSize(imageWidth * scale, imageHeight * scale);
-
-        redraw();
-    }
-
-    @Override
-    public void dispose() {
-        mBackgroundLayer.dispose();
-        super.dispose();
-    }
-
-    private class StretchView extends Canvas implements PaintListener {
-
-        private final Point mSize = new Point(0, 0);
-        private final Rectangle mPadding = new Rectangle(0, 0, 0, 0);
-        private Projection[][] mProjection = null;
-
-        public StretchView(Composite parent, int style) {
-            super(parent, style);
-            addPaintListener(this);
-        }
-
-        private void setImage(NinePatchedImage image) {
-            setSize(image.getWidth(), image.getHeight());
-        }
-
-        @Override
-        public void setSize(int width, int heigh) {
-            mSize.x = width;
-            mSize.y = heigh;
-            mProjection = mNinePatchedImage.getProjections(mSize.x, mSize.y, mProjection);
-        }
-
-        private synchronized void calcPaddings(int width, int height) {
-            Point canvasSize = getSize();
-
-            mPadding.x = (canvasSize.x - width) / 2;
-            mPadding.y = (canvasSize.y - height) / 2;
-
-            mPadding.width = width;
-            mPadding.height = height;
-        }
-
-        @Override
-        public void paintControl(PaintEvent pe) {
-            if (mNinePatchedImage == null || mProjection == null) {
-                return;
-            }
-
-            Point size = getSize();
-
-            // relative scaling
-            float ratio = 1.0f;
-            float wRatio = ((float) size.x / mSize.x);
-            ratio = Math.min(wRatio, ratio);
-            float hRatio = ((float) size.y / mSize.y);
-            ratio = Math.min(hRatio, ratio);
-
-            int width = Math.round(mSize.x * ratio);
-            int height = Math.round(mSize.y * ratio);
-
-            calcPaddings(width, height);
-
-            Rectangle dest = new Rectangle(0, 0, 0, 0);
-
-            GC gc = pe.gc;
-
-            int backgroundLayerWidth = mBackgroundLayer.getImageData().width;
-            int backgroundLayerHeight = mBackgroundLayer.getImageData().height;
-
-            int yCount = size.y / backgroundLayerHeight
-                    + ((size.y % backgroundLayerHeight) > 0 ? 1 : 0);
-            int xCount = size.x / backgroundLayerWidth
-                    + ((size.x % backgroundLayerWidth) > 0 ? 1 : 0);
-
-            // draw background layer
-            for (int y = 0; y < yCount; y++) {
-                for (int x = 0; x < xCount; x++) {
-                    gc.drawImage(mBackgroundLayer,
-                            x * backgroundLayerWidth,
-                            y * backgroundLayerHeight);
-                }
-            }
-
-            // draw the border line
-            gc.setAlpha(0x88);
-            gc.drawRectangle(0, 0, size.x, size.y);
-            gc.setAlpha(0xFF);
-
-            int yLen = mProjection.length;
-            int xLen = mProjection[0].length;
-            for (int yPos = 0; yPos < yLen; yPos++) {
-                for (int xPos = 0; xPos < xLen; xPos++) {
-                    Projection p = mProjection[yPos][xPos];
-
-                    // consider the scale
-                    dest.x = (int) Math.ceil(p.dest.x * ratio);
-                    dest.y = (int) Math.ceil(p.dest.y * ratio);
-                    dest.width = (int) Math.ceil(p.dest.width * ratio);
-                    dest.height = (int) Math.ceil(p.dest.height * ratio);
-
-                    gc.drawImage(mNinePatchedImage.getImage(), p.src.x, p.src.y,
-                            p.src.width, p.src.height,
-                            (mPadding.x + dest.x), (mPadding.y + dest.y),
-                            dest.width, dest.height);
-
-                    if (mIsContentAreaShown) {
-                        gc.drawImage(mContentAreaImage, p.src.x, p.src.y,
-                                p.src.width, p.src.height,
-                                (mPadding.x + dest.x), (mPadding.y + dest.y),
-                                dest.width, dest.height);
-                    }
-                }
-            }
-        }
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/drawable/DrawableContentAssist.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/drawable/DrawableContentAssist.java
deleted file mode 100644
index b0bea51..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/drawable/DrawableContentAssist.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Copyright (C) 2007 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.editors.drawable;
-
-import com.android.annotations.VisibleForTesting;
-import com.android.ide.eclipse.adt.internal.editors.AndroidContentAssist;
-import com.android.ide.eclipse.adt.internal.sdk.AndroidTargetData;
-
-/**
- * Content Assist Processor for /res/drawable XML files
- */
-@VisibleForTesting
-public final class DrawableContentAssist extends AndroidContentAssist {
-    public DrawableContentAssist() {
-        super(AndroidTargetData.DESCRIPTOR_DRAWABLE);
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/drawable/DrawableDescriptors.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/drawable/DrawableDescriptors.java
deleted file mode 100644
index 4858ac7..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/drawable/DrawableDescriptors.java
+++ /dev/null
@@ -1,301 +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.eclipse.adt.internal.editors.drawable;
-
-import static com.android.SdkConstants.ANDROID_NS_NAME;
-import static com.android.SdkConstants.ANDROID_URI;
-
-import com.android.ide.common.api.IAttributeInfo.Format;
-import com.android.ide.common.resources.platform.AttributeInfo;
-import com.android.ide.common.resources.platform.DeclareStyleableInfo;
-import com.android.ide.eclipse.adt.internal.editors.animator.AnimatorDescriptors;
-import com.android.ide.eclipse.adt.internal.editors.descriptors.ElementDescriptor;
-import com.android.ide.eclipse.adt.internal.editors.descriptors.IDescriptorProvider;
-import com.android.ide.eclipse.adt.internal.editors.descriptors.ReferenceAttributeDescriptor;
-import com.android.ide.eclipse.adt.internal.editors.descriptors.XmlnsAttributeDescriptor;
-import com.android.resources.ResourceType;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-/**
- * Descriptors for /res/drawable files
- */
-public class DrawableDescriptors implements IDescriptorProvider {
-    private static final String SDK_URL_BASE =
-        "http://d.android.com/guide/topics/resources/"; //$NON-NLS-1$
-
-    /** The root element descriptor */
-    private ElementDescriptor mDescriptor;
-    /** The root element descriptors */
-    private ElementDescriptor[] mRootDescriptors;
-    private Map<String, ElementDescriptor> nameToDescriptor;
-
-    /** @return the root descriptor. */
-    @Override
-    public ElementDescriptor getDescriptor() {
-        if (mDescriptor == null) {
-            mDescriptor = new ElementDescriptor("", getRootElementDescriptors()); //$NON-NLS-1$
-        }
-
-        return mDescriptor;
-    }
-
-    @Override
-    public ElementDescriptor[] getRootElementDescriptors() {
-        return mRootDescriptors;
-    }
-
-    /**
-     * Returns a descriptor for the given root tag name
-     *
-     * @param tag the tag name to look up a descriptor for
-     * @return a descriptor with the given tag name
-     */
-    public ElementDescriptor getElementDescriptor(String tag) {
-        if (nameToDescriptor == null) {
-            nameToDescriptor = new HashMap<String, ElementDescriptor>();
-            for (ElementDescriptor descriptor : getRootElementDescriptors()) {
-                nameToDescriptor.put(descriptor.getXmlName(), descriptor);
-            }
-        }
-
-        ElementDescriptor descriptor = nameToDescriptor.get(tag);
-        if (descriptor == null) {
-            descriptor = getDescriptor();
-        }
-        return descriptor;
-    }
-
-    public synchronized void updateDescriptors(Map<String, DeclareStyleableInfo> styleMap) {
-        XmlnsAttributeDescriptor xmlns = new XmlnsAttributeDescriptor(ANDROID_NS_NAME,
-                ANDROID_URI);
-        List<ElementDescriptor> descriptors = new ArrayList<ElementDescriptor>();
-
-        AnimatorDescriptors.addElement(descriptors, styleMap,
-            "animation-list", "Animation List", "AnimationDrawable", null, //$NON-NLS-1$ //$NON-NLS-3$
-            "An animation defined in XML that shows a sequence of images in "
-                + "order (like a film)",
-            SDK_URL_BASE + "animation-resource.html#Frame",
-            xmlns, null, true /*mandatory*/);
-
-        /* For some reason, android.graphics.drawable.AnimatedRotateDrawable is marked with @hide
-         * so we should not register it and its attributes here. See issue #19248 for details.
-        AnimatorDescriptors.addElement(descriptors, styleMap,
-            "animated-rotate", "Animated Rotate", "AnimatedRotateDrawable", null, //$NON-NLS-1$ //$NON-NLS-3$
-            // Need docs
-            null, // tooltip
-            null, // sdk_url
-            xmlns, null, true);
-        */
-
-        AnimatorDescriptors.addElement(descriptors, styleMap,
-            "bitmap", "BitMap", "BitmapDrawable", null, //$NON-NLS-1$ //$NON-NLS-3$
-            "An XML bitmap is a resource defined in XML that points to a bitmap file. "
-                    + "The effect is an alias for a raw bitmap file. The XML can "
-                    + "specify additional properties for the bitmap such as "
-                    + "dithering and tiling.",
-            SDK_URL_BASE + "drawable-resource.html#Bitmap", //$NON-NLS-1$
-            xmlns, null, true /* mandatory */);
-
-        AnimatorDescriptors.addElement(descriptors, styleMap,
-            "clip", "Clip", "ClipDrawable", null, //$NON-NLS-1$ //$NON-NLS-3$
-            "An XML file that defines a drawable that clips another Drawable based on "
-                + "this Drawable's current level value.",
-            SDK_URL_BASE + "drawable-resource.html#Clip", //$NON-NLS-1$
-            xmlns, null, true /*mandatory*/);
-
-        AnimatorDescriptors.addElement(descriptors, styleMap,
-            "color", "Color", "ColorDrawable", null, //$NON-NLS-1$ //$NON-NLS-3$
-            "XML resource that carries a color value (a hexadecimal color)",
-            SDK_URL_BASE + "more-resources.html#Color",
-            xmlns, null, true /*mandatory*/);
-
-        AnimatorDescriptors.addElement(descriptors, styleMap,
-            "inset", "Inset", "InsetDrawable", null, //$NON-NLS-1$ //$NON-NLS-3$
-            "An XML file that defines a drawable that insets another drawable by a "
-                + "specified distance. This is useful when a View needs a background "
-                + "drawble that is smaller than the View's actual bounds.",
-            SDK_URL_BASE + "drawable-resource.html#Inset", //$NON-NLS-1$
-            xmlns, null, true /*mandatory*/);
-
-        // Layer list
-
-        // An <item> in a <selector> or <
-        ElementDescriptor layerItem = AnimatorDescriptors.addElement(null, styleMap,
-                "item", "Item", "LayerDrawableItem", null, //$NON-NLS-1$ //$NON-NLS-3$
-                "Defines a drawable to place in the layer drawable, in a position "
-                    + "defined by its attributes. Must be a child of a <selector> "
-                    + "element. Accepts child <bitmap> elements.",
-                SDK_URL_BASE + "drawable-resource.html#LayerList", //$NON-NLS-1$
-                null, /* extra attribute */
-                null, /* This is wrong -- we can now embed any above drawable
-                            (but without xmlns as extra) */
-                false /*mandatory*/);
-        ElementDescriptor[] layerChildren = layerItem != null
-            ? new ElementDescriptor[] { layerItem } : null;
-
-        AnimatorDescriptors.addElement(descriptors, styleMap,
-            "layer-list", "Layer List", "LayerDrawable", null, //$NON-NLS-1$ //$NON-NLS-3$
-            "A Drawable that manages an array of other Drawables. These are drawn in "
-                    + "array order, so the element with the largest index is be drawn on top.",
-            SDK_URL_BASE + "drawable-resource.html#LayerList", //$NON-NLS-1$
-            xmlns,
-            layerChildren,
-            true /*mandatory*/);
-
-        // Level list children
-        ElementDescriptor levelListItem = AnimatorDescriptors.addElement(null, styleMap,
-            "item", "Item", "LevelListDrawableItem", null, //$NON-NLS-1$ //$NON-NLS-3$
-            "Defines a drawable to use at a certain level.",
-            SDK_URL_BASE + "drawable-resource.html#LevelList", //$NON-NLS-1$
-            null, /* extra attribute */
-            null, /* no further children */
-            // TODO: The inflation code seems to show that all drawables can be nested here!
-            false /*mandatory*/);
-        AnimatorDescriptors.addElement(descriptors, styleMap,
-            "level-list", "Level List", "LevelListDrawable", null, //$NON-NLS-1$ //$NON-NLS-3$
-            "An XML file that defines a drawable that manages a number of alternate "
-                + "Drawables, each assigned a maximum numerical value",
-            SDK_URL_BASE + "drawable-resource.html#LevelList", //$NON-NLS-1$
-            xmlns,
-            levelListItem != null ? new ElementDescriptor[] { levelListItem } : null,
-            true /*mandatory*/);
-
-        // Not yet supported
-        //addElement(descriptors, styleMap, "mipmap", "Mipmap", "MipmapDrawable", null,
-        //        null /* tooltip */,
-        //        null /* sdk_url */,
-        //        xmlns, null, true /*mandatory*/);
-
-        AnimatorDescriptors.addElement(descriptors, styleMap,
-            "nine-patch", "Nine Patch", "NinePatchDrawable", null, //$NON-NLS-1$ //$NON-NLS-3$
-            "A PNG file with stretchable regions to allow image resizing "
-                    + "based on content (.9.png).",
-            SDK_URL_BASE + "drawable-resource.html#NinePatch", //$NON-NLS-1$
-            xmlns, null, true /*mandatory*/);
-
-        AnimatorDescriptors.addElement(descriptors, styleMap,
-            "rotate", "Rotate", "RotateDrawable", null, //$NON-NLS-1$ //$NON-NLS-3$
-            // Need docs
-            null /* tooltip */,
-            null /* sdk_url */,
-            xmlns, null, true /*mandatory*/);
-
-        AnimatorDescriptors.addElement(descriptors, styleMap,
-            "scale", "Shape", "ScaleDrawable", null, //$NON-NLS-1$ //$NON-NLS-3$
-            "An XML file that defines a drawable that changes the size of another Drawable "
-                + "based on its current level value.",
-            SDK_URL_BASE + "drawable-resource.html#Scale", //$NON-NLS-1$
-            xmlns, null, true /*mandatory*/);
-
-        // Selector children
-        ElementDescriptor selectorItem = AnimatorDescriptors.addElement(null, styleMap,
-            "item", "Item", "DrawableStates", null, //$NON-NLS-1$ //$NON-NLS-3$
-            "Defines a drawable to use during certain states, as described by "
-                 + "its attributes. Must be a child of a <selector> element.",
-            SDK_URL_BASE + "drawable-resource.html#StateList", //$NON-NLS-1$
-            new ReferenceAttributeDescriptor(
-                    ResourceType.DRAWABLE, "drawable", ANDROID_URI, //$NON-NLS-1$
-                    new AttributeInfo("drawable", Format.REFERENCE_SET))
-                    .setTooltip("Reference to a drawable resource."),
-            null, /* This is wrong -- we can now embed any above drawable
-                        (but without xmlns as extra) */
-            false /*mandatory*/);
-
-        AnimatorDescriptors.addElement(descriptors, styleMap,
-            "selector", "Selector", "StateListDrawable", null, //$NON-NLS-1$ //$NON-NLS-3$
-            "An XML file that references different bitmap graphics for different states "
-                + "(for example, to use a different image when a button is pressed).",
-            SDK_URL_BASE + "drawable-resource.html#StateList", //$NON-NLS-1$
-            xmlns,
-            selectorItem != null ? new ElementDescriptor[] { selectorItem } : null,
-            true /*mandatory*/);
-
-        // Shape
-        // Shape children
-        List<ElementDescriptor> shapeChildren = new ArrayList<ElementDescriptor>();
-        // Selector children
-        AnimatorDescriptors.addElement(shapeChildren, styleMap,
-            "size", "Size", "GradientDrawableSize", null, //$NON-NLS-1$ //$NON-NLS-3$
-            null /* tooltip */, null /* sdk_url */, null /* extra attribute */,
-            null /* children */, false /* mandatory */);
-        AnimatorDescriptors.addElement(shapeChildren, styleMap,
-            "gradient", "Gradient", "GradientDrawableGradient", null, //$NON-NLS-1$ //$NON-NLS-3$
-            null /* tooltip */, null /* sdk_url */, null /* extra attribute */,
-            null /* children */, false /* mandatory */);
-        AnimatorDescriptors.addElement(shapeChildren, styleMap,
-            "solid", "Solid", "GradientDrawableSolid", null, //$NON-NLS-1$ //$NON-NLS-3$
-            null /* tooltip */, null /* sdk_url */, null /* extra attribute */,
-            null /* children */, false /* mandatory */);
-        AnimatorDescriptors.addElement(shapeChildren, styleMap,
-            "stroke", "Stroke", "GradientDrawableStroke", null, //$NON-NLS-1$ //$NON-NLS-3$
-            null /* tooltip */, null /* sdk_url */, null /* extra attribute */,
-            null /* children */, false /* mandatory */);
-        AnimatorDescriptors.addElement(shapeChildren, styleMap,
-            "corners", "Corners", "DrawableCorners", null, //$NON-NLS-1$ //$NON-NLS-3$
-            null /* tooltip */, null /* sdk_url */, null /* extra attribute */,
-            null /* children */, false /* mandatory */);
-        AnimatorDescriptors.addElement(shapeChildren, styleMap,
-            "padding", "Padding", "GradientDrawablePadding", null, //$NON-NLS-1$ //$NON-NLS-3$
-            null /* tooltip */, null /* sdk_url */, null /* extra attribute */,
-            null /* children */, false /* mandatory */);
-
-        AnimatorDescriptors.addElement(descriptors, styleMap,
-            "shape", "Shape", //$NON-NLS-1$
-
-            // The documentation says that a <shape> element creates a ShapeDrawable,
-            // but ShapeDrawable isn't finished and the code currently creates
-            // a GradientDrawable.
-            //"ShapeDrawable", //$NON-NLS-1$
-            "GradientDrawable", //$NON-NLS-1$
-
-            null,
-            "An XML file that defines a geometric shape, including colors and gradients.",
-            SDK_URL_BASE + "drawable-resource.html#Shape", //$NON-NLS-1$
-            xmlns,
-
-            // These are the GradientDrawable children, not the ShapeDrawable children
-            shapeChildren.toArray(new ElementDescriptor[shapeChildren.size()]),
-            true /*mandatory*/);
-
-        AnimatorDescriptors.addElement(descriptors, styleMap,
-            "transition", "Transition", "TransitionDrawable", null, //$NON-NLS-1$ //$NON-NLS-3$
-            "An XML file that defines a drawable that can cross-fade between two "
-                + "drawable resources. Each drawable is represented by an <item> "
-                + "element inside a single <transition> element. No more than two "
-                + "items are supported. To transition forward, call startTransition(). "
-                + "To transition backward, call reverseTransition().",
-            SDK_URL_BASE + "drawable-resource.html#Transition", //$NON-NLS-1$
-            xmlns,
-            layerChildren, // children: a TransitionDrawable is a LayerDrawable
-            true /*mandatory*/);
-
-        mRootDescriptors = descriptors.toArray(new ElementDescriptor[descriptors.size()]);
-
-        // A <selector><item> can contain any of the top level drawables
-        if (selectorItem != null) {
-            selectorItem.setChildren(mRootDescriptors);
-        }
-        // Docs says it can accept <bitmap> but code comment suggests any is possible;
-        // test and either use this or just { bitmap }
-        if (layerItem != null) {
-            layerItem.setChildren(mRootDescriptors);
-        }
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/drawable/DrawableEditorDelegate.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/drawable/DrawableEditorDelegate.java
deleted file mode 100644
index a54fa8c..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/drawable/DrawableEditorDelegate.java
+++ /dev/null
@@ -1,153 +0,0 @@
-/*
- * Copyright (C) 2007 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.editors.drawable;
-
-import static com.android.ide.eclipse.adt.AdtConstants.EDITORS_NAMESPACE;
-
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-import com.android.ide.eclipse.adt.internal.editors.common.CommonXmlDelegate;
-import com.android.ide.eclipse.adt.internal.editors.common.CommonXmlEditor;
-import com.android.ide.eclipse.adt.internal.editors.descriptors.DocumentDescriptor;
-import com.android.ide.eclipse.adt.internal.editors.descriptors.ElementDescriptor;
-import com.android.ide.eclipse.adt.internal.sdk.AndroidTargetData;
-import com.android.resources.ResourceFolderType;
-
-import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-
-/**
- * Editor for /res/drawable XML files.
- */
-@SuppressWarnings("restriction")
-public class DrawableEditorDelegate extends CommonXmlDelegate {
-
-    public static class Creator implements IDelegateCreator {
-        @Override
-        @SuppressWarnings("unchecked")
-        public DrawableEditorDelegate createForFile(
-                @NonNull CommonXmlEditor delegator,
-                @Nullable ResourceFolderType type) {
-            if (ResourceFolderType.DRAWABLE == type) {
-                return new DrawableEditorDelegate(delegator);
-            }
-
-            return null;
-        }
-    }
-
-    /**
-     * Old standalone-editor ID.
-     * Use {@link CommonXmlEditor#ID} instead.
-     */
-    public static final String LEGACY_EDITOR_ID =
-        EDITORS_NAMESPACE + ".drawable.DrawableEditor"; //$NON-NLS-1$
-
-    /** The tag used at the root */
-    private String mRootTag;
-
-    /**
-     * Creates the form editor for resources XML files.
-     */
-    private DrawableEditorDelegate(CommonXmlEditor editor) {
-        super(editor, new DrawableContentAssist());
-        editor.addDefaultTargetListener();
-    }
-
-    @Override
-    public void delegateCreateFormPages() {
-        /* Disabled for now; doesn't work quite right
-        try {
-            addPage(new DrawableTreePage(this));
-        } catch (PartInitException e) {
-            AdtPlugin.log(IStatus.ERROR, "Error creating nested page"); //$NON-NLS-1$
-            AdtPlugin.getDefault().getLog().log(e.getStatus());
-        }
-        */
-     }
-
-    @Override
-    public void delegateXmlModelChanged(Document xmlDoc) {
-        Element rootElement = xmlDoc.getDocumentElement();
-        if (rootElement != null) {
-            mRootTag = rootElement.getTagName();
-        }
-
-        delegateInitUiRootNode(false /*force*/);
-
-        if (mRootTag != null
-                && !mRootTag.equals(getUiRootNode().getDescriptor().getXmlLocalName())) {
-            AndroidTargetData data = getEditor().getTargetData();
-            if (data != null) {
-                ElementDescriptor descriptor =
-                    data.getDrawableDescriptors().getElementDescriptor(mRootTag);
-                // Replace top level node now that we know the actual type
-
-                // Disconnect from old
-                getUiRootNode().setEditor(null);
-                getUiRootNode().setXmlDocument(null);
-
-                // Create new
-                setUiRootNode(descriptor.createUiNode());
-                getUiRootNode().setXmlDocument(xmlDoc);
-                getUiRootNode().setEditor(getEditor());
-            }
-        }
-
-        if (getUiRootNode().getDescriptor() instanceof DocumentDescriptor) {
-            getUiRootNode().loadFromXmlNode(xmlDoc);
-        } else {
-            getUiRootNode().loadFromXmlNode(rootElement);
-        }
-    }
-
-    @Override
-    public void delegateInitUiRootNode(boolean force) {
-        // The manifest UI node is always created, even if there's no corresponding XML node.
-        if (getUiRootNode() == null || force) {
-            ElementDescriptor descriptor;
-            boolean reload = false;
-            AndroidTargetData data = getEditor().getTargetData();
-            if (data == null) {
-                descriptor = new DocumentDescriptor("temp", null /*children*/);
-            } else {
-                descriptor = data.getDrawableDescriptors().getElementDescriptor(mRootTag);
-                reload = true;
-            }
-            setUiRootNode(descriptor.createUiNode());
-            getUiRootNode().setEditor(getEditor());
-
-            if (reload) {
-                onDescriptorsChanged();
-            }
-        }
-    }
-
-    private void onDescriptorsChanged() {
-        IStructuredModel model = getEditor().getModelForRead();
-        if (model != null) {
-            try {
-                Node node = getEditor().getXmlDocument(model).getDocumentElement();
-                getUiRootNode().reloadFromXmlNode(node);
-            } finally {
-                model.releaseFromRead();
-            }
-        }
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/export/AbstractPropertiesFieldsPart.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/export/AbstractPropertiesFieldsPart.java
deleted file mode 100755
index bc3051e..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/export/AbstractPropertiesFieldsPart.java
+++ /dev/null
@@ -1,356 +0,0 @@
-/*
- * Copyright (C) 2010 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.editors.export;
-
-import com.android.SdkConstants;
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.ide.eclipse.adt.internal.editors.ui.SectionHelper.ManifestSectionPart;
-
-import org.eclipse.jface.text.BadLocationException;
-import org.eclipse.jface.text.DocumentEvent;
-import org.eclipse.jface.text.IDocument;
-import org.eclipse.jface.text.IRegion;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-import org.eclipse.ui.forms.widgets.Section;
-
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-
-/**
- * Section part for editing fields of a properties file in an Export editor.
- * <p/>
- * This base class is intended to be derived and customized.
- */
-abstract class AbstractPropertiesFieldsPart extends ManifestSectionPart {
-
-    private final HashMap<String, Control> mNameToField = new HashMap<String, Control>();
-
-    private ExportEditor mEditor;
-
-    private boolean mInternalTextUpdate = false;
-
-    public AbstractPropertiesFieldsPart(Composite body, FormToolkit toolkit, ExportEditor editor) {
-        super(body, toolkit, Section.TWISTIE | Section.EXPANDED, true /* description */);
-        mEditor = editor;
-    }
-
-    protected HashMap<String, Control> getNameToField() {
-        return mNameToField;
-    }
-
-    protected ExportEditor getEditor() {
-        return mEditor;
-    }
-
-    protected void setInternalTextUpdate(boolean internalTextUpdate) {
-        mInternalTextUpdate = internalTextUpdate;
-    }
-
-    protected boolean isInternalTextUpdate() {
-        return mInternalTextUpdate;
-    }
-
-    /**
-     * Adds a modify listener to every text field that will mark the part as dirty.
-     *
-     * CONTRACT: Derived classes MUST call this at the end of their constructor.
-     *
-     * @see #setFieldModifyListener(Control, ModifyListener)
-     */
-    protected void addModifyListenerToFields() {
-        ModifyListener markDirtyListener = new ModifyListener() {
-            @Override
-            public void modifyText(ModifyEvent e) {
-                // Mark the part as dirty if a field has been changed.
-                // This will force a commit() operation to store the data in the model.
-                if (!mInternalTextUpdate) {
-                    markDirty();
-                }
-            }
-        };
-
-        for (Control field : mNameToField.values()) {
-            setFieldModifyListener(field, markDirtyListener);
-        }
-    }
-
-    /**
-     * Sets a listener that will mark the part as dirty when the control is modified.
-     * The base method only handles {@link Text} fields.
-     *
-     * CONTRACT: Derived classes CAN use this to add a listener to their own controls.
-     * The listener must call {@link #markDirty()} when the control is modified by the user.
-     *
-     * @param field A control previously registered with {@link #getNameToField()}.
-     * @param markDirtyListener A {@link ModifyListener} that invokes {@link #markDirty()}.
-     *
-     * @see #isInternalTextUpdate()
-     */
-    protected void setFieldModifyListener(Control field, ModifyListener markDirtyListener) {
-        if (field instanceof Text) {
-            ((Text) field).addModifyListener(markDirtyListener);
-        }
-    }
-
-    /**
-     * Updates the model based on the content of fields. This is invoked when a field
-     * has marked the document as dirty.
-     *
-     * CONTRACT: Derived classes do not need to override this.
-     */
-    @Override
-    public void commit(boolean onSave) {
-
-        // We didn't store any information indicating which field was dirty (we could).
-        // Since there are not many fields, just update all the document lines that
-        // match our field keywords.
-
-        if (isDirty()) {
-            mEditor.wrapRewriteSession(new Runnable() {
-                @Override
-                public void run() {
-                    saveFieldsToModel();
-                }
-            });
-        }
-
-        super.commit(onSave);
-    }
-
-    private void saveFieldsToModel() {
-        // Get a list of all keywords to process. Go thru the document, replacing in-place
-        // the ones we can find and remove them from this set. This will leave the list
-        // of new keywords to add at the end of the document.
-        HashSet<String> allKeywords = new HashSet<String>(mNameToField.keySet());
-
-        IDocument doc = mEditor.getDocument();
-        int numLines = doc.getNumberOfLines();
-
-        String delim = null;
-        try {
-            delim = numLines > 0 ? doc.getLineDelimiter(0) : null;
-        } catch (BadLocationException e1) {
-            // ignore
-        }
-        if (delim == null || delim.length() == 0) {
-            delim = SdkConstants.CURRENT_PLATFORM == SdkConstants.PLATFORM_WINDOWS ?
-                    "\r\n" : "\n"; //$NON-NLS-1$ //$NON-NLS-2#
-        }
-
-        for (int i = 0; i < numLines; i++) {
-            try {
-                IRegion info = doc.getLineInformation(i);
-                String line = doc.get(info.getOffset(), info.getLength());
-                line = line.trim();
-                if (line.startsWith("#")) {  //$NON-NLS-1$
-                    continue;
-                }
-
-                int pos = line.indexOf('=');
-                if (pos > 0 && pos < line.length() - 1) {
-                    String key = line.substring(0, pos).trim();
-
-                    Control field = mNameToField.get(key);
-                    if (field != null) {
-
-                        // This is the new line to inject
-                        line = key + "=" + getFieldText(field);
-
-                        try {
-                            // replace old line by new one. This doesn't change the
-                            // line delimiter.
-                            mInternalTextUpdate = true;
-                            doc.replace(info.getOffset(), info.getLength(), line);
-                            allKeywords.remove(key);
-                        } finally {
-                            mInternalTextUpdate = false;
-                        }
-                    }
-                }
-
-            } catch (BadLocationException e) {
-                // TODO log it
-                AdtPlugin.log(e, "Failed to replace in export.properties");
-            }
-        }
-
-        for (String key : allKeywords) {
-            Control field = mNameToField.get(key);
-            if (field != null) {
-                // This is the new line to inject
-                String line = key + "=" + getFieldText(field);
-
-                try {
-                    // replace old line by new one
-                    mInternalTextUpdate = true;
-
-                    numLines = doc.getNumberOfLines();
-
-                    IRegion info = numLines > 0 ? doc.getLineInformation(numLines - 1) : null;
-                    if (info != null && info.getLength() == 0) {
-                        // last line is empty. Insert right before there.
-                        doc.replace(info.getOffset(), info.getLength(), line);
-                    } else {
-                        if (numLines > 0) {
-                            String eofDelim = doc.getLineDelimiter(numLines - 1);
-                            if (eofDelim == null || eofDelim.length() == 0) {
-                                // The document doesn't end with a line delimiter, so add
-                                // one to the line to be written.
-                                line = delim + line;
-                            }
-                        }
-
-                        int len = doc.getLength();
-                        doc.replace(len, 0, line);
-                    }
-
-                    allKeywords.remove(key);
-                } catch (BadLocationException e) {
-                    // TODO log it
-                    AdtPlugin.log(e, "Failed to append to export.properties: %s", line);
-                } finally {
-                    mInternalTextUpdate = false;
-                }
-            }
-        }
-    }
-
-    /**
-     * Used when committing fields values to the model to retrieve the text
-     * associated with a field.
-     * <p/>
-     * The base method only handles {@link Text} controls.
-     *
-     * CONTRACT: Derived classes CAN use this to support their own controls.
-     *
-     * @param field A control previously registered with {@link #getNameToField()}.
-     * @return A non-null string to write to the properties files.
-     */
-    protected String getFieldText(Control field) {
-        if (field instanceof Text) {
-            return ((Text) field).getText();
-        }
-        return "";
-    }
-
-    /**
-     * Called after all pages have been created, to let the parts initialize their
-     * content based on the document's model.
-     * <p/>
-     * The model should be acceded via the {@link ExportEditor}.
-     *
-     * @param editor The {@link ExportEditor} instance.
-     */
-    public void onModelInit(ExportEditor editor) {
-
-        // Start with a set of all the possible keywords and remove those we
-        // found in the document as we read the lines.
-        HashSet<String> allKeywords = new HashSet<String>(mNameToField.keySet());
-
-        // Parse the lines in the document for patterns "keyword=value",
-        // trimming all whitespace and discarding lines that start with # (comments)
-        // then affect to the internal fields as appropriate.
-        IDocument doc = editor.getDocument();
-        int numLines = doc.getNumberOfLines();
-        for (int i = 0; i < numLines; i++) {
-            try {
-                IRegion info = doc.getLineInformation(i);
-                String line = doc.get(info.getOffset(), info.getLength());
-                line = line.trim();
-                if (line.startsWith("#")) {  //$NON-NLS-1$
-                    continue;
-                }
-
-                int pos = line.indexOf('=');
-                if (pos > 0 && pos < line.length() - 1) {
-                    String key = line.substring(0, pos).trim();
-
-                    Control field = mNameToField.get(key);
-                    if (field != null) {
-                        String value = line.substring(pos + 1).trim();
-                        try {
-                            mInternalTextUpdate = true;
-                            setFieldText(field, value);
-                            allKeywords.remove(key);
-                        } finally {
-                            mInternalTextUpdate = false;
-                        }
-                    }
-                }
-
-            } catch (BadLocationException e) {
-                // TODO log it
-                AdtPlugin.log(e, "Failed to set field to export.properties value");
-            }
-        }
-
-        // Clear the text of any keyword we didn't find in the document
-        Iterator<String> iterator = allKeywords.iterator();
-        while (iterator.hasNext()) {
-            String key = iterator.next();
-            Control field = mNameToField.get(key);
-            if (field != null) {
-                try {
-                    mInternalTextUpdate = true;
-                    setFieldText(field, "");
-                    iterator.remove();
-                } finally {
-                    mInternalTextUpdate = false;
-                }
-            }
-        }
-    }
-
-    /**
-     * Used when reading the model to set the field values.
-     * <p/>
-     * The base method only handles {@link Text} controls.
-     *
-     * CONTRACT: Derived classes CAN use this to support their own controls.
-     *
-     * @param field A control previously registered with {@link #getNameToField()}.
-     * @param value A non-null string to that was read from the properties files.
-     *              The value is an empty string if the property line is missing.
-     */
-    protected void setFieldText(Control field, String value) {
-        if (field instanceof Text) {
-            ((Text) field).setText(value);
-        }
-    }
-
-    /**
-     * Called after the document model has been changed. The model should be acceded via
-     * the {@link ExportEditor} (e.g. getDocument, wrapRewriteSession)
-     *
-     * @param editor The {@link ExportEditor} instance.
-     * @param event Specification of changes applied to document.
-     */
-    public void onModelChanged(ExportEditor editor, DocumentEvent event) {
-        // To simplify and since we don't have many fields, just reload all the values.
-        // A better way would to be to look at DocumentEvent which gives us the offset/length
-        // and text that has changed.
-        if (!mInternalTextUpdate) {
-            onModelInit(editor);
-        }
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/export/ExportEditor.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/export/ExportEditor.java
deleted file mode 100755
index 769f74e..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/export/ExportEditor.java
+++ /dev/null
@@ -1,107 +0,0 @@
-/*
- * Copyright (C) 2010 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.editors.export;
-
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.ide.eclipse.adt.AdtConstants;
-import com.android.ide.eclipse.adt.internal.editors.AndroidTextEditor;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.jface.text.DocumentEvent;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.part.FileEditorInput;
-
-/**
- * Multi-page form editor for export.properties in Export Projects.
- */
-public class ExportEditor extends AndroidTextEditor {
-
-    public static final String ID = AdtConstants.EDITORS_NAMESPACE + ".text.ExportEditor"; //$NON-NLS-1$
-
-    private ExportPropertiesPage mExportPropsPage;
-
-    /**
-     * Creates the form editor for resources XML files.
-     */
-    public ExportEditor() {
-        super();
-    }
-
-    // ---- Base Class Overrides ----
-
-    /**
-     * Returns whether the "save as" operation is supported by this editor.
-     * <p/>
-     * Save-As is a valid operation for the ManifestEditor since it acts on a
-     * single source file.
-     *
-     * @see IEditorPart
-     */
-    @Override
-    public boolean isSaveAsAllowed() {
-        return true;
-    }
-
-    /**
-     * Create the various form pages.
-     */
-    @Override
-    protected void createFormPages() {
-        try {
-            mExportPropsPage = new ExportPropertiesPage(this);
-            addPage(mExportPropsPage);
-        } catch (PartInitException e) {
-            AdtPlugin.log(e, "Error creating nested page"); //$NON-NLS-1$
-        }
-
-    }
-
-    /* (non-java doc)
-     * Change the tab/title name to include the project name.
-     */
-    @Override
-    protected void setInput(IEditorInput input) {
-        super.setInput(input);
-        if (input instanceof FileEditorInput) {
-            FileEditorInput fileInput = (FileEditorInput) input;
-            IFile file = fileInput.getFile();
-            setPartName(String.format("%1$s", file.getName()));
-        }
-    }
-
-    @Override
-    protected void postCreatePages() {
-        super.postCreatePages();
-        mExportPropsPage.onModelInit();
-    }
-
-    /**
-     * Indicates changes were made to the document.
-     *
-     * @param event Specification of changes applied to document.
-     */
-    @Override
-    protected void onDocumentChanged(DocumentEvent event) {
-        super.onDocumentChanged(event);
-        mExportPropsPage.onModelChanged(event);
-    }
-
-    // ---- Local Methods ----
-
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/export/ExportFieldsPart.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/export/ExportFieldsPart.java
deleted file mode 100755
index eff3e48..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/export/ExportFieldsPart.java
+++ /dev/null
@@ -1,100 +0,0 @@
-/*
- * Copyright (C) 2010 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.editors.export;
-
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-import org.eclipse.ui.forms.widgets.Section;
-
-import java.util.HashMap;
-
-/**
- * Section part for editing the properties in an Export editor.
- */
-final class ExportFieldsPart extends AbstractPropertiesFieldsPart {
-
-    public ExportFieldsPart(Composite body, FormToolkit toolkit, ExportEditor editor) {
-        super(body, toolkit, editor);
-        Section section = getSection();
-
-        section.setText("Export Properties");
-        section.setDescription("Properties of export.properties:");
-
-        Composite table = createTableLayout(toolkit, 2 /* numColumns */);
-
-        createLabel(table, toolkit,
-                "Available Properties", //label
-                "List of properties you can edit in export.properties");  //tooltip
-
-        Text packageField = createLabelAndText(table, toolkit,
-                "Package", //label,
-                "", //$NON-NLS-1$ value,
-                "TODO tooltip for Package");  //tooltip
-
-        Text projectsField = createLabelAndText(table, toolkit,
-                "Projects", //label,
-                "", //$NON-NLS-1$ value,
-                "TODO tooltip for Projects");  //tooltip
-
-        Text versionCodeField = createLabelAndText(table, toolkit,
-                "Version Code", //label,
-                "", //$NON-NLS-1$ value,
-                "TODO tooltip for Version Code");  //tooltip
-
-        Text keyStoreField = createLabelAndText(table, toolkit,
-                "Key Store", //label,
-                "", //$NON-NLS-1$ value,
-                "TODO tooltip for Key Store");  //tooltip
-
-        Text keyAliasField = createLabelAndText(table, toolkit,
-                "Key Alias", //label,
-                "", //$NON-NLS-1$ value,
-                "TODO tooltip for Key Alias");  //tooltip
-
-        // Associate each field with the keyword in the properties files.
-        // TODO there's probably some constant to reuse here.
-        HashMap<String, Control> map = getNameToField();
-        map.put("package", packageField);              //$NON-NLS-1$
-        map.put("projects", projectsField);            //$NON-NLS-1$
-        map.put("versionCode", versionCodeField);      //$NON-NLS-1$
-        map.put("_key.store", keyStoreField);          //$NON-NLS-1$
-        map.put("_key.alias", keyAliasField);          //$NON-NLS-1$
-
-        addModifyListenerToFields();
-    }
-
-    @Override
-    protected void setFieldModifyListener(Control field, ModifyListener markDirtyListener) {
-        super.setFieldModifyListener(field, markDirtyListener);
-        // TODO override for custom controls
-    }
-
-    @Override
-    protected String getFieldText(Control field) {
-        // TODO override for custom controls
-        return super.getFieldText(field);
-    }
-
-    @Override
-    protected void setFieldText(Control field, String value) {
-        // TODO override for custom controls
-        super.setFieldText(field, value);
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/export/ExportLinksPart.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/export/ExportLinksPart.java
deleted file mode 100644
index 85a2165..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/export/ExportLinksPart.java
+++ /dev/null
@@ -1,124 +0,0 @@
-/*
- * Copyright (C) 2010 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.editors.export;
-
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.ide.eclipse.adt.internal.editors.ui.SectionHelper.ManifestSectionPart;
-
-import org.eclipse.jface.text.DocumentEvent;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.MessageBox;
-import org.eclipse.ui.forms.events.HyperlinkEvent;
-import org.eclipse.ui.forms.events.IHyperlinkListener;
-import org.eclipse.ui.forms.widgets.FormText;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-import org.eclipse.ui.forms.widgets.Section;
-
-/**
- * Links section part for export properties page.
- * Displays some help and some links/actions for the user to use.
- */
-final class ExportLinksPart extends ManifestSectionPart {
-
-    private FormText mFormText;
-
-    public ExportLinksPart(Composite body, FormToolkit toolkit, ExportEditor editor) {
-        super(body, toolkit, Section.TWISTIE | Section.EXPANDED, true /* description */);
-        Section section = getSection();
-        section.setText("Links");
-        section.setDescription("TODO SOME TEXT HERE. You can also edit the XML directly.");
-
-        final Composite table = createTableLayout(toolkit, 2 /* numColumns */);
-
-        StringBuffer buf = new StringBuffer();
-        buf.append("<form>"); //$NON-NLS-1$
-
-        buf.append("<li style=\"image\" value=\"android_img\"><a href=\"action_dosomething\">");
-        buf.append("TODO Custom Action");
-        buf.append("</a>"); //$NON-NLS-1$
-        buf.append(": blah blah do something (like build/export).");
-        buf.append("</li>"); //$NON-NLS-1$
-
-        buf.append(String.format("<li style=\"image\" value=\"android_img\"><a href=\"page:%1$s\">", //$NON-NLS-1$
-                ExportEditor.TEXT_EDITOR_ID));
-        buf.append("XML Source");
-        buf.append("</a>"); //$NON-NLS-1$
-        buf.append(": Directly edit the AndroidManifest.xml file.");
-        buf.append("</li>"); //$NON-NLS-1$
-
-        buf.append("<li style=\"image\" value=\"android_img\">"); //$NON-NLS-1$
-        buf.append("<a href=\"http://code.google.com/android/devel/bblocks-manifest.html\">Documentation</a>: Documentation from the Android SDK for AndroidManifest.xml."); //$NON-NLS-1$
-        buf.append("</li>"); //$NON-NLS-1$
-        buf.append("</form>"); //$NON-NLS-1$
-
-        mFormText = createFormText(table, toolkit, true, buf.toString(),
-                false /* setupLayoutData */);
-
-        Image androidLogo = AdtPlugin.getAndroidLogo();
-        mFormText.setImage("android_img", androidLogo); //$NON-NLS-1$
-
-        // Listener for default actions (page change, URL web browser)
-        mFormText.addHyperlinkListener(editor.createHyperlinkListener());
-
-        mFormText.addHyperlinkListener(new IHyperlinkListener() {
-            @Override
-            public void linkExited(HyperlinkEvent e) {
-                // pass
-            }
-
-            @Override
-            public void linkEntered(HyperlinkEvent e) {
-                // pass
-            }
-
-            @Override
-            public void linkActivated(HyperlinkEvent e) {
-                String link = e.data.toString();
-                if ("action_dosomething".equals(link)) {
-                    MessageBox mb = new MessageBox(table.getShell(), SWT.OK);
-                    mb.setText("Custom Action Invoked");
-                    mb.open();
-                }
-            }
-        });
-    }
-
-    /**
-     * Called after all pages have been created, to let the parts initialize their
-     * content based on the document's model.
-     * <p/>
-     * The model should be acceded via the {@link ExportEditor}.
-     *
-     * @param editor The {@link ExportEditor} instance.
-     */
-    public void onModelInit(ExportEditor editor) {
-        // pass
-    }
-
-    /**
-     * Called after the document model has been changed. The model should be acceded via
-     * the {@link ExportEditor} (e.g. getDocument, wrapRewriteSession)
-     *
-     * @param editor The {@link ExportEditor} instance.
-     * @param event Specification of changes applied to document.
-     */
-    public void onModelChanged(ExportEditor editor, DocumentEvent event) {
-        // pass
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/export/ExportPropertiesPage.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/export/ExportPropertiesPage.java
deleted file mode 100755
index f3db5ee..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/export/ExportPropertiesPage.java
+++ /dev/null
@@ -1,113 +0,0 @@
-/*
- * Copyright (C) 2010 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.editors.export;
-
-import com.android.ide.eclipse.adt.AdtPlugin;
-
-import org.eclipse.jface.text.DocumentEvent;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.forms.IManagedForm;
-import org.eclipse.ui.forms.editor.FormPage;
-import org.eclipse.ui.forms.widgets.ColumnLayout;
-import org.eclipse.ui.forms.widgets.ColumnLayoutData;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-import org.eclipse.ui.forms.widgets.ScrolledForm;
-
-
-/**
- * Page for export properties, used by {@link ExportEditor}.
- * It displays a part to edit the properties and another part
- * to provide some links and actions.
- */
-public final class ExportPropertiesPage extends FormPage {
-
-    /** Page id used for switching tabs programmatically */
-    final static String PAGE_ID = "export_prop_page"; //$NON-NLS-1$
-
-    /** Container editor */
-    ExportEditor mEditor;
-    /** Export fields part */
-    private ExportFieldsPart mFieldsPart;
-    /** Export links part */
-    private ExportLinksPart mLinksPart;
-
-    public ExportPropertiesPage(ExportEditor editor) {
-        super(editor, PAGE_ID, "Export Properties");  // tab's label, user visible, keep it short
-        mEditor = editor;
-    }
-
-    /**
-     * Creates the content in the form hosted in this page.
-     *
-     * @param managedForm the form hosted in this page.
-     */
-    @Override
-    protected void createFormContent(IManagedForm managedForm) {
-        super.createFormContent(managedForm);
-        ScrolledForm form = managedForm.getForm();
-        form.setText("Android Export Properties");
-        form.setImage(AdtPlugin.getAndroidLogo());
-
-        Composite body = form.getBody();
-        FormToolkit toolkit = managedForm.getToolkit();
-
-        body.setLayout(new ColumnLayout());
-
-        mFieldsPart = new ExportFieldsPart(body, toolkit, mEditor);
-        mFieldsPart.getSection().setLayoutData(new ColumnLayoutData());
-        managedForm.addPart(mFieldsPart);
-
-        mLinksPart = new ExportLinksPart(body, toolkit, mEditor);
-        mLinksPart.getSection().setLayoutData(new ColumnLayoutData());
-        managedForm.addPart(mLinksPart);
-
-        mFieldsPart.onModelInit(mEditor);
-        mLinksPart.onModelInit(mEditor);
-    }
-
-    /**
-     * Called after all pages have been created, to let the parts initialize their
-     * content based on the document's model.
-     * <p/>
-     * The model should be acceded via the {@link ExportEditor}.
-     */
-    public void onModelInit() {
-        if (mFieldsPart != null) {
-            mFieldsPart.onModelInit(mEditor);
-        }
-
-        if (mLinksPart != null) {
-            mLinksPart.onModelInit(mEditor);
-        }
-    }
-
-    /**
-     * Called after the document model has been changed. The model should be acceded via
-     * the {@link ExportEditor}.
-     *
-     * @param event Specification of changes applied to document.
-     */
-    public void onModelChanged(DocumentEvent event) {
-        if (mFieldsPart != null) {
-            mFieldsPart.onModelChanged(mEditor, event);
-        }
-
-        if (mLinksPart != null) {
-            mLinksPart.onModelChanged(mEditor, event);
-        }
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/formatting/AndroidXmlFormatter.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/formatting/AndroidXmlFormatter.java
deleted file mode 100644
index 4030954..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/formatting/AndroidXmlFormatter.java
+++ /dev/null
@@ -1,83 +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.eclipse.adt.internal.editors.formatting;
-
-import com.android.ide.eclipse.adt.internal.preferences.AdtPrefs;
-
-import org.eclipse.jface.text.BadLocationException;
-import org.eclipse.jface.text.IDocument;
-import org.eclipse.jface.text.IRegion;
-import org.eclipse.jface.text.TypedPosition;
-import org.eclipse.jface.text.formatter.FormattingContext;
-import org.eclipse.jface.text.formatter.FormattingContextProperties;
-import org.eclipse.jface.text.formatter.IContentFormatter;
-import org.eclipse.jface.text.formatter.IContentFormatterExtension;
-import org.eclipse.jface.text.formatter.IFormattingContext;
-import org.eclipse.jface.text.formatter.IFormattingStrategy;
-import org.eclipse.wst.xml.core.text.IXMLPartitions;
-
-/**
- * Formatter which replaces the Eclipse formatter for the Android XML editors, and
- * delegates to it if the user has chosen to use the Eclipse formatter instead by turning
- * off {@link AdtPrefs#getUseCustomXmlFormatter()}
- */
-public class AndroidXmlFormatter implements IContentFormatter, IContentFormatterExtension {
-    @Override
-    public final void format(IDocument document, IRegion region) {
-        /**
-         * This method is probably not going to be called. It is part of the
-         * {@link IContentFormatter} but since we also implement
-         * {@link IContentFormatterExtension} Eclipse should /* be calling
-         * {@link #format(IDocument,IFormattingContext)} instead. However, for
-         * completeness (and because other implementations of {@link IContentFormatter}
-         * also do this we might as well make the method behave correctly
-         */
-        FormattingContext context = new FormattingContext();
-        context.setProperty(FormattingContextProperties.CONTEXT_DOCUMENT, Boolean.FALSE);
-        context.setProperty(FormattingContextProperties.CONTEXT_REGION, region);
-
-        format(document, context);
-    }
-
-    @Override
-    public IFormattingStrategy getFormattingStrategy(String contentType) {
-        return new AndroidXmlFormattingStrategy();
-    }
-
-    @Override
-    public void format(IDocument document, IFormattingContext context) {
-        context.setProperty(FormattingContextProperties.CONTEXT_MEDIUM, document);
-        formatMaster(context, document, 0, document.getLength());
-    }
-
-    protected void formatMaster(IFormattingContext context, IDocument document, int offset,
-            int length) {
-        try {
-            final int delta= offset - document.getLineInformationOfOffset(offset).getOffset();
-            offset -= delta;
-            length += delta;
-        } catch (BadLocationException exception) {
-            // Do nothing
-        }
-
-        AndroidXmlFormattingStrategy strategy = new AndroidXmlFormattingStrategy();
-        context.setProperty(FormattingContextProperties.CONTEXT_PARTITION,
-                new TypedPosition(offset, length, IXMLPartitions.XML_DEFAULT));
-        strategy.formatterStarts(context);
-        strategy.format();
-        strategy.formatterStops();
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/formatting/AndroidXmlFormattingStrategy.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/formatting/AndroidXmlFormattingStrategy.java
deleted file mode 100644
index 4cab419..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/formatting/AndroidXmlFormattingStrategy.java
+++ /dev/null
@@ -1,754 +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.eclipse.adt.internal.editors.formatting;
-
-import static com.android.SdkConstants.ANDROID_MANIFEST_XML;
-import static com.android.ide.eclipse.adt.internal.editors.AndroidXmlAutoEditStrategy.findLineStart;
-import static com.android.ide.eclipse.adt.internal.editors.AndroidXmlAutoEditStrategy.findTextStart;
-import static com.android.ide.eclipse.adt.internal.editors.color.ColorDescriptors.SELECTOR_TAG;
-import static org.eclipse.jface.text.formatter.FormattingContextProperties.CONTEXT_MEDIUM;
-import static org.eclipse.jface.text.formatter.FormattingContextProperties.CONTEXT_PARTITION;
-import static org.eclipse.jface.text.formatter.FormattingContextProperties.CONTEXT_REGION;
-import static org.eclipse.wst.xml.core.internal.regions.DOMRegionContext.XML_EMPTY_TAG_CLOSE;
-import static org.eclipse.wst.xml.core.internal.regions.DOMRegionContext.XML_END_TAG_OPEN;
-import static org.eclipse.wst.xml.core.internal.regions.DOMRegionContext.XML_TAG_CLOSE;
-import static org.eclipse.wst.xml.core.internal.regions.DOMRegionContext.XML_TAG_OPEN;
-
-import com.android.SdkConstants;
-import com.android.annotations.VisibleForTesting;
-import com.android.ide.common.xml.XmlFormatPreferences;
-import com.android.ide.common.xml.XmlFormatStyle;
-import com.android.ide.common.xml.XmlPrettyPrinter;
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.ide.eclipse.adt.AdtUtils;
-import com.android.ide.eclipse.adt.internal.editors.layout.gle2.DomUtilities;
-import com.android.ide.eclipse.adt.internal.preferences.AdtPrefs;
-import com.android.ide.eclipse.adt.internal.project.BaseProjectHelper;
-import com.android.resources.ResourceType;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IWorkspace;
-import org.eclipse.core.resources.IWorkspaceRoot;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.jface.text.BadLocationException;
-import org.eclipse.jface.text.IDocument;
-import org.eclipse.jface.text.IRegion;
-import org.eclipse.jface.text.TextUtilities;
-import org.eclipse.jface.text.TypedPosition;
-import org.eclipse.jface.text.formatter.ContextBasedFormattingStrategy;
-import org.eclipse.jface.text.formatter.IFormattingContext;
-import org.eclipse.text.edits.MultiTextEdit;
-import org.eclipse.text.edits.ReplaceEdit;
-import org.eclipse.text.edits.TextEdit;
-import org.eclipse.ui.texteditor.ITextEditor;
-import org.eclipse.wst.sse.core.StructuredModelManager;
-import org.eclipse.wst.sse.core.internal.provisional.IModelManager;
-import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
-import org.eclipse.wst.sse.core.internal.provisional.IndexedRegion;
-import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;
-import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocumentRegion;
-import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegion;
-import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegionList;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
-import org.eclipse.wst.xml.ui.internal.XMLFormattingStrategy;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-import org.w3c.dom.Text;
-
-import java.util.HashMap;
-import java.util.LinkedList;
-import java.util.Map;
-import java.util.Queue;
-
-/**
- * Formatter which formats XML content according to the established Android coding
- * conventions. It performs the format by computing the smallest set of DOM nodes
- * overlapping the formatted region, then it pretty-prints that XML region
- * using the {@link EclipseXmlPrettyPrinter}, and then it replaces the affected region
- * by the pretty-printed region.
- * <p>
- * This strategy is also used for delegation. If the user has chosen to use the
- * standard Eclipse XML formatter, this strategy simply delegates to the
- * default XML formatting strategy in WTP.
- */
-@SuppressWarnings("restriction")
-public class AndroidXmlFormattingStrategy extends ContextBasedFormattingStrategy {
-    private IRegion mRegion;
-    private final Queue<IDocument> mDocuments = new LinkedList<IDocument>();
-    private final LinkedList<TypedPosition> mPartitions = new LinkedList<TypedPosition>();
-    private ContextBasedFormattingStrategy mDelegate = null;
-    /** False if document is known not to be in an Android project, null until initialized */
-    private Boolean mIsAndroid;
-
-    /**
-     * Creates a new {@link AndroidXmlFormattingStrategy}
-     */
-    public AndroidXmlFormattingStrategy() {
-    }
-
-    private ContextBasedFormattingStrategy getDelegate() {
-        if (!AdtPrefs.getPrefs().getUseCustomXmlFormatter()
-                || mIsAndroid != null && !mIsAndroid.booleanValue()) {
-            if (mDelegate == null) {
-                mDelegate = new XMLFormattingStrategy();
-            }
-
-            return mDelegate;
-        }
-
-        return null;
-    }
-
-    @Override
-    public void format() {
-        // Use Eclipse XML formatter instead?
-        ContextBasedFormattingStrategy delegate = getDelegate();
-        if (delegate != null) {
-            delegate.format();
-            return;
-        }
-
-        super.format();
-
-        IDocument document = mDocuments.poll();
-        TypedPosition partition = mPartitions.poll();
-
-        if (document != null && partition != null && mRegion != null) {
-            try {
-                if (document instanceof IStructuredDocument) {
-                    IStructuredDocument structuredDocument = (IStructuredDocument) document;
-                    IModelManager modelManager = StructuredModelManager.getModelManager();
-                    IStructuredModel model = modelManager.getModelForEdit(structuredDocument);
-                    if (model != null) {
-                        try {
-                            TextEdit edit = format(model, mRegion.getOffset(),
-                                    mRegion.getLength());
-                            if (edit != null) {
-                                try {
-                                    model.aboutToChangeModel();
-                                    edit.apply(document);
-                                }
-                                finally {
-                                    model.changedModel();
-                                }
-                            }
-                        }
-                        finally {
-                            model.releaseFromEdit();
-                        }
-                    }
-                }
-            }
-            catch (BadLocationException e) {
-                AdtPlugin.log(e, "Formatting error");
-            }
-        }
-    }
-
-    /**
-     * Creates a {@link TextEdit} for formatting the given model's XML in the text range
-     * starting at offset start with the given length. Note that the exact formatting
-     * offsets may be adjusted to format a complete element.
-     *
-     * @param model the model to be formatted
-     * @param start the starting offset
-     * @param length the length of the text range to be formatted
-     * @return a {@link TextEdit} which edits the model into a formatted document
-     */
-    private static TextEdit format(IStructuredModel model, int start, int length) {
-        int end = start + length;
-
-        TextEdit edit = new MultiTextEdit();
-        IStructuredDocument document = model.getStructuredDocument();
-
-        Node startNode = null;
-        Node endNode = null;
-        Document domDocument = null;
-
-        if (model instanceof IDOMModel) {
-            IDOMModel domModel = (IDOMModel) model;
-            domDocument = domModel.getDocument();
-        } else {
-            // This should not happen
-            return edit;
-        }
-
-        IStructuredDocumentRegion startRegion = document.getRegionAtCharacterOffset(start);
-        if (startRegion != null) {
-            int startOffset = startRegion.getStartOffset();
-            IndexedRegion currentIndexedRegion = model.getIndexedRegion(startOffset);
-            if (currentIndexedRegion instanceof IDOMNode) {
-                IDOMNode currentDOMNode = (IDOMNode) currentIndexedRegion;
-                startNode = currentDOMNode;
-            }
-        }
-
-        boolean isOpenTagOnly = false;
-        int openTagEnd = -1;
-
-        IStructuredDocumentRegion endRegion = document.getRegionAtCharacterOffset(end);
-        if (endRegion != null) {
-            int endOffset = Math.max(endRegion.getStartOffset(),
-                    endRegion.getEndOffset() - 1);
-            IndexedRegion currentIndexedRegion = model.getIndexedRegion(endOffset);
-
-            // If you place the caret right on the right edge of an element, such as this:
-            //     <foo name="value">|
-            // then the DOM model will consider the region containing the caret to be
-            // whatever nodes FOLLOWS the element, usually a text node.
-            // Detect this case, and look into the previous range.
-            if (currentIndexedRegion instanceof Text
-                    && currentIndexedRegion.getStartOffset() == end && end > 0) {
-                end--;
-                currentIndexedRegion = model.getIndexedRegion(end);
-                endRegion = document.getRegionAtCharacterOffset(
-                        currentIndexedRegion.getStartOffset());
-            }
-
-            if (currentIndexedRegion instanceof IDOMNode) {
-                IDOMNode currentDOMNode = (IDOMNode) currentIndexedRegion;
-                endNode = currentDOMNode;
-
-                // See if this range is fully within the opening tag
-                if (endNode == startNode && endRegion == startRegion) {
-                    ITextRegion subRegion = endRegion.getRegionAtCharacterOffset(end);
-                    ITextRegionList regions = endRegion.getRegions();
-                    int index = regions.indexOf(subRegion);
-                    if (index != -1) {
-                        // Skip past initial occurrence of close tag if we place the caret
-                        // right on a >
-                        subRegion = regions.get(index);
-                        String type = subRegion.getType();
-                        if (type == XML_TAG_CLOSE || type == XML_EMPTY_TAG_CLOSE) {
-                            index--;
-                        }
-                    }
-                    for (; index >= 0; index--) {
-                        subRegion = regions.get(index);
-                        String type = subRegion.getType();
-                        if (type == XML_TAG_OPEN) {
-                            isOpenTagOnly = true;
-                        } else if (type == XML_EMPTY_TAG_CLOSE || type == XML_TAG_CLOSE
-                                || type == XML_END_TAG_OPEN) {
-                            break;
-                        }
-                    }
-
-                    int max = regions.size();
-                    for (index = Math.max(0, index); index < max; index++) {
-                        subRegion = regions.get(index);
-                        String type = subRegion.getType();
-                        if (type == XML_EMPTY_TAG_CLOSE || type == XML_TAG_CLOSE) {
-                            openTagEnd = subRegion.getEnd() + endRegion.getStartOffset();
-                        }
-                    }
-
-                    if (openTagEnd == -1) {
-                        isOpenTagOnly = false;
-                    }
-                }
-            }
-        }
-
-        String[] indentationLevels = null;
-        Node root = null;
-        int initialDepth = 0;
-        int replaceStart;
-        int replaceEnd;
-        boolean endWithNewline = false;
-        if (startNode == null || endNode == null) {
-            // Process the entire document
-            root = domDocument;
-            // both document and documentElement should be <= 0
-            initialDepth = -1;
-            startNode = root;
-            endNode = root;
-            replaceStart = 0;
-            replaceEnd = document.getLength();
-            try {
-                endWithNewline = replaceEnd > 0 && document.getChar(replaceEnd - 1) == '\n';
-            } catch (BadLocationException e) {
-                // Can't happen
-            }
-        } else {
-            root = DomUtilities.getCommonAncestor(startNode, endNode);
-            initialDepth = root != null ? DomUtilities.getDepth(root) - 1 : 0;
-
-            // Regions must be non-null since the DOM nodes are non null, but Eclipse null
-            // analysis doesn't realize it:
-            assert startRegion != null && endRegion != null;
-
-            replaceStart = ((IndexedRegion) startNode).getStartOffset();
-            if (isOpenTagOnly) {
-                replaceEnd = openTagEnd;
-            } else {
-                replaceEnd = ((IndexedRegion) endNode).getEndOffset();
-            }
-
-            // Look up the indentation level of the start node, if it is an element
-            // and it starts on its own line
-            if (startNode.getNodeType() == Node.ELEMENT_NODE) {
-                // Measure the indentation of the start node such that we can indent
-                // the reformatted version of the node exactly in place and it should blend
-                // in if the surrounding content does not use the same indentation size etc.
-                // However, it's possible for the start node to have deeper depth than other
-                // content we're formatting, as in the following scenario for example:
-                //      <foo>
-                //         <bar/>
-                //      </foo>
-                //   <baz/>
-                // If you select this text range, we want <foo> to be formatted at whatever
-                // level it is, and we also need to know the indentation level to use
-                // for </baz>. We don't measure the depth of <bar/>, a child of the start node,
-                // since from the initial indentation level and on down we want to normalize
-                // the output.
-                IndentationMeasurer m = new IndentationMeasurer(startNode, endNode, document);
-                indentationLevels = m.measure(initialDepth, root);
-
-                // Wipe out any levels deeper than the start node's level
-                // (which may not be the smallest level, e.g. where you select a child
-                // and the end of its parent etc).
-                // (Since we're ONLY measuring the node and its parents, you might wonder
-                // why this is doing a full subtree traversal instead of just walking up
-                // the parent chain and looking up the indentation for each. The reason for
-                // this is that some of theses nodes, which have not yet been formatted,
-                // may be sharing lines with other nodes, and we disregard indentation for
-                // any nodes that don't start a line since the indentation may only be correct
-                // for the first element, so therefore we look for other nodes at the same
-                // level that do have indentation info at the front of the line.
-                int depth = DomUtilities.getDepth(startNode) - 1;
-                for (int i = depth + 1; i < indentationLevels.length; i++) {
-                    indentationLevels[i] = null;
-                }
-            }
-        }
-
-        XmlFormatStyle style = guessStyle(model, domDocument);
-        XmlFormatPreferences prefs = EclipseXmlFormatPreferences.create();
-        String delimiter = TextUtilities.getDefaultLineDelimiter(document);
-        XmlPrettyPrinter printer = new EclipseXmlPrettyPrinter(prefs, style, delimiter);
-        printer.setEndWithNewline(endWithNewline);
-
-        if (indentationLevels != null) {
-            printer.setIndentationLevels(indentationLevels);
-        }
-
-        StringBuilder sb = new StringBuilder(length);
-        printer.prettyPrint(initialDepth, root, startNode, endNode, sb, isOpenTagOnly);
-
-        String formatted = sb.toString();
-        ReplaceEdit replaceEdit = createReplaceEdit(document, replaceStart, replaceEnd, formatted,
-                prefs);
-        if (replaceEdit != null) {
-            edit.addChild(replaceEdit);
-        }
-
-        // Attempt to fix the selection range since otherwise, with the document shifting
-        // under it, you end up selecting a "random" portion of text now shifted into the
-        // old positions of the formatted text:
-        if (replaceEdit != null && replaceStart != 0 && replaceEnd != document.getLength()) {
-            ITextEditor editor = AdtUtils.getActiveTextEditor();
-            if (editor != null) {
-                editor.setHighlightRange(replaceEdit.getOffset(), replaceEdit.getText().length(),
-                        false /*moveCursor*/);
-            }
-        }
-
-        return edit;
-    }
-
-    /**
-     * Create a {@link ReplaceEdit} which replaces the text in the given document with the
-     * given new formatted content. The replaceStart and replaceEnd parameters point to
-     * the equivalent unformatted text in the document, but the actual edit range may be
-     * adjusted (for example to make the edit smaller if the beginning and/or end is
-     * identical, and so on)
-     */
-    @VisibleForTesting
-    static ReplaceEdit createReplaceEdit(IDocument document, int replaceStart,
-            int replaceEnd, String formatted, XmlFormatPreferences prefs) {
-        // If replacing a node somewhere in the middle, start the replacement at the
-        // beginning of the current line
-        int index = replaceStart;
-        try {
-            while (index > 0) {
-                char c = document.getChar(index - 1);
-                if (c == '\n') {
-                    if (index < replaceStart) {
-                        replaceStart = index;
-                    }
-                    break;
-                } else if (!Character.isWhitespace(c)) {
-                    // The replaced node does not start on its own line; in that case,
-                    // remove the initial indentation in the reformatted element
-                    for (int i = 0; i < formatted.length(); i++) {
-                        if (!Character.isWhitespace(formatted.charAt(i))) {
-                            formatted = formatted.substring(i);
-                            break;
-                        }
-                    }
-                    break;
-                }
-                index--;
-            }
-        } catch (BadLocationException e) {
-            AdtPlugin.log(e, null);
-        }
-
-        // If there are multiple blank lines before the insert position, collapse them down
-        // to one
-        int prevNewlineIndex = -1;
-        boolean beginsWithNewline = false;
-        for (int i = 0, n = formatted.length(); i < n; i++) {
-            char c = formatted.charAt(i);
-            if (c == '\n') {
-                beginsWithNewline = true;
-                break;
-            } else if (!Character.isWhitespace(c)) { // \r is whitespace so is handled correctly
-                break;
-            }
-        }
-        try {
-            for (index = replaceStart - 1; index > 0; index--) {
-                char c = document.getChar(index);
-                if (c == '\n') {
-                    if (prevNewlineIndex != -1) {
-                        replaceStart = prevNewlineIndex;
-                    }
-                    prevNewlineIndex = index;
-                    if (index > 0 && document.getChar(index - 1) == '\r') {
-                        prevNewlineIndex--;
-                    }
-                } else if (!Character.isWhitespace(c)) {
-                    break;
-                }
-            }
-        } catch (BadLocationException e) {
-            AdtPlugin.log(e, null);
-        }
-        if (prefs.removeEmptyLines && prevNewlineIndex != -1 && beginsWithNewline) {
-            replaceStart = prevNewlineIndex + 1;
-        }
-
-        // Search forwards too
-        int nextNewlineIndex = -1;
-        try {
-            int max = document.getLength();
-            for (index = replaceEnd; index < max; index++) {
-                char c = document.getChar(index);
-                if (c == '\n') {
-                    if (nextNewlineIndex != -1) {
-                        replaceEnd = nextNewlineIndex + 1;
-                    }
-                    nextNewlineIndex = index;
-                } else if (!Character.isWhitespace(c)) {
-                    break;
-                }
-            }
-        } catch (BadLocationException e) {
-            AdtPlugin.log(e, null);
-        }
-        boolean endsWithNewline = false;
-        for (int i = formatted.length() - 1; i >= 0; i--) {
-            char c = formatted.charAt(i);
-            if (c == '\n') {
-                endsWithNewline = true;
-                break;
-            } else if (!Character.isWhitespace(c)) {
-                break;
-            }
-        }
-
-        if (prefs.removeEmptyLines && nextNewlineIndex != -1 && endsWithNewline) {
-            replaceEnd = nextNewlineIndex + 1;
-        }
-
-        // Figure out how much of the before and after strings are identical and narrow
-        // the replacement scope
-        boolean foundDifference = false;
-        int firstDifference = 0;
-        int lastDifference = formatted.length();
-        try {
-            for (int i = 0, j = replaceStart; i < formatted.length() && j < replaceEnd; i++, j++) {
-                if (formatted.charAt(i) != document.getChar(j)) {
-                    firstDifference = i;
-                    foundDifference = true;
-                    break;
-                }
-            }
-
-            if (!foundDifference) {
-                // No differences - the document is already formatted, nothing to do
-                return null;
-            }
-
-            lastDifference = firstDifference + 1;
-            for (int i = formatted.length() - 1, j = replaceEnd - 1;
-                    i > firstDifference && j > replaceStart;
-                    i--, j--) {
-                if (formatted.charAt(i) != document.getChar(j)) {
-                    lastDifference = i + 1;
-                    break;
-                }
-            }
-        } catch (BadLocationException e) {
-            AdtPlugin.log(e, null);
-        }
-
-        replaceStart += firstDifference;
-        replaceEnd -= (formatted.length() - lastDifference);
-        replaceEnd = Math.max(replaceStart, replaceEnd);
-        formatted = formatted.substring(firstDifference, lastDifference);
-
-        ReplaceEdit replaceEdit = new ReplaceEdit(replaceStart, replaceEnd - replaceStart,
-                formatted);
-        return replaceEdit;
-    }
-
-    /**
-     * Guess what style to use to edit the given document - layout, resource, manifest, ... ? */
-    static XmlFormatStyle guessStyle(IStructuredModel model, Document domDocument) {
-        // The "layout" style is used for most XML resource file types:
-        // layouts, color-lists and state-lists, animations, drawables, menus, etc
-        XmlFormatStyle style = XmlFormatStyle.get(domDocument);
-        if (style == XmlFormatStyle.FILE) {
-            style = XmlFormatStyle.LAYOUT;
-        }
-
-        // The "resource" style is used for most value-based XML files:
-        // strings, dimensions, booleans, colors, integers, plurals,
-        // integer-arrays, string-arrays, and typed-arrays
-        Element rootElement = domDocument.getDocumentElement();
-        if (rootElement != null
-                && SdkConstants.TAG_RESOURCES.equals(rootElement.getTagName())) {
-            style = XmlFormatStyle.RESOURCE;
-        }
-
-        // Selectors are also used similar to resources
-        if (rootElement != null && SELECTOR_TAG.equals(rootElement.getTagName())) {
-            return XmlFormatStyle.RESOURCE;
-        }
-
-        // The "manifest" style is used for manifest files
-        String baseLocation = model.getBaseLocation();
-        if (baseLocation != null) {
-            if (baseLocation.endsWith(SdkConstants.FN_ANDROID_MANIFEST_XML)) {
-                style = XmlFormatStyle.MANIFEST;
-            } else {
-                int lastSlash = baseLocation.lastIndexOf('/');
-                if (lastSlash != -1) {
-                    int end = baseLocation.lastIndexOf('/', lastSlash - 1); // -1 is okay
-                    String resourceFolder = baseLocation.substring(end + 1, lastSlash);
-                    String[] segments = resourceFolder.split("-"); //$NON-NLS-1$
-                    ResourceType type = ResourceType.getEnum(segments[0]);
-                    if (type != null) {
-                        // <resources> files found in res/xml/ should be formatted as
-                        // resource files!
-                        if (type == ResourceType.XML && style == XmlFormatStyle.RESOURCE) {
-                            return style;
-                        }
-                        style = EclipseXmlPrettyPrinter.get(type);
-                    }
-                }
-            }
-        }
-
-        return style;
-    }
-
-    private Boolean isAndroid(IDocument document) {
-        if (mIsAndroid == null) {
-            // Look up the corresponding IResource for this document. This isn't
-            // readily available, so take advantage of the structured model's base location
-            // string and convert it to an IResource to look up its project.
-            if (document instanceof IStructuredDocument) {
-                IStructuredDocument structuredDocument = (IStructuredDocument) document;
-                IModelManager modelManager = StructuredModelManager.getModelManager();
-
-                IStructuredModel model = modelManager.getModelForRead(structuredDocument);
-                if (model != null) {
-                    String location = model.getBaseLocation();
-                    model.releaseFromRead();
-                    if (location != null) {
-                        if (!location.endsWith(ANDROID_MANIFEST_XML)
-                                && !location.contains("/res/")) { //$NON-NLS-1$
-                            // See if it looks like a foreign document
-                            IWorkspace workspace = ResourcesPlugin.getWorkspace();
-                            IWorkspaceRoot root = workspace.getRoot();
-                            IResource member = root.findMember(location);
-                            if (member.exists()) {
-                                IProject project = member.getProject();
-                                if (project.isAccessible() &&
-                                        !BaseProjectHelper.isAndroidProject(project)) {
-                                    mIsAndroid = false;
-                                    return false;
-                                }
-                            }
-                        }
-                        // Ignore Maven POM files even in Android projects
-                        if (location.endsWith("/pom.xml")) { //$NON-NLS-1$
-                            mIsAndroid = false;
-                            return false;
-                        }
-                    }
-                }
-            }
-
-            mIsAndroid = true;
-        }
-
-        return mIsAndroid.booleanValue();
-    }
-
-    @Override
-    public void formatterStarts(final IFormattingContext context) {
-        // Use Eclipse XML formatter instead?
-        ContextBasedFormattingStrategy delegate = getDelegate();
-        if (delegate != null) {
-            delegate.formatterStarts(context);
-
-            // We also need the super implementation because it stores items into the
-            // map, and we can't override the getPreferences method, so we need for
-            // this delegating strategy to supply the correct values when it is called
-            // instead of the delegate
-            super.formatterStarts(context);
-
-            return;
-        }
-
-        super.formatterStarts(context);
-        mRegion = (IRegion) context.getProperty(CONTEXT_REGION);
-        TypedPosition partition = (TypedPosition) context.getProperty(CONTEXT_PARTITION);
-        IDocument document = (IDocument) context.getProperty(CONTEXT_MEDIUM);
-        mPartitions.offer(partition);
-        mDocuments.offer(document);
-
-        if (!isAndroid(document)) {
-            // It's some foreign type of project: use default
-            // formatter
-            delegate = getDelegate();
-            if (delegate != null) {
-                delegate.formatterStarts(context);
-            }
-        }
-    }
-
-    @Override
-    public void formatterStops() {
-        // Use Eclipse XML formatter instead?
-        ContextBasedFormattingStrategy delegate = getDelegate();
-        if (delegate != null) {
-            delegate.formatterStops();
-            // See formatterStarts for an explanation
-            super.formatterStops();
-
-            return;
-        }
-
-        super.formatterStops();
-        mRegion = null;
-        mDocuments.clear();
-        mPartitions.clear();
-    }
-
-    /**
-     * Utility class which can measure the indentation strings for various node levels in
-     * a given node range
-     */
-    static class IndentationMeasurer {
-        private final Map<Integer, String> mDepth = new HashMap<Integer, String>();
-        private final Node mStartNode;
-        private final Node mEndNode;
-        private final IStructuredDocument mDocument;
-        private boolean mDone = false;
-        private boolean mInRange = false;
-        private int mMaxDepth;
-
-        public IndentationMeasurer(Node mStartNode, Node mEndNode, IStructuredDocument document) {
-            super();
-            this.mStartNode = mStartNode;
-            this.mEndNode = mEndNode;
-            mDocument = document;
-        }
-
-        /**
-         * Measure the various depths found in the range (defined in the constructor)
-         * under the given node which should be a common ancestor of the start and end
-         * nodes. The result is a string array where each index corresponds to a depth,
-         * and the string is either empty, or the complete indentation string to be used
-         * to indent to the given depth (note that these strings are not cumulative)
-         *
-         * @param initialDepth the initial depth to use when visiting
-         * @param root the root node to look for depths under
-         * @return a string array containing nulls or indentation strings
-         */
-        public String[] measure(int initialDepth, Node root) {
-            visit(initialDepth, root);
-            String[] indentationLevels = new String[mMaxDepth + 1];
-            for (Map.Entry<Integer, String> entry : mDepth.entrySet()) {
-                int depth = entry.getKey();
-                String indentation = entry.getValue();
-                indentationLevels[depth] = indentation;
-            }
-
-            return indentationLevels;
-        }
-
-        private void visit(int depth, Node node) {
-            // Look up indentation for this level
-            if (node.getNodeType() == Node.ELEMENT_NODE && mDepth.get(depth) == null) {
-                // Look up the depth
-                try {
-                    IndexedRegion region = (IndexedRegion) node;
-                    int lineStart = findLineStart(mDocument, region.getStartOffset());
-                    int textStart = findTextStart(mDocument, lineStart, region.getEndOffset());
-
-                    // Ensure that the text which begins the line is this element, otherwise
-                    // we could be measuring the indentation of a parent element which begins
-                    // the line
-                    if (textStart == region.getStartOffset()) {
-                        String indent = mDocument.get(lineStart,
-                                Math.max(0, textStart - lineStart));
-                        mDepth.put(depth, indent);
-
-                        if (depth > mMaxDepth) {
-                            mMaxDepth = depth;
-                        }
-                    }
-                } catch (BadLocationException e) {
-                    AdtPlugin.log(e, null);
-                }
-            }
-
-            NodeList children = node.getChildNodes();
-            for (int i = 0, n = children.getLength(); i < n; i++) {
-                Node child = children.item(i);
-                visit(depth + 1, child);
-                if (mDone) {
-                    return;
-                }
-            }
-
-            if (node == mEndNode) {
-                mDone = true;
-            }
-        }
-    }
-}
\ No newline at end of file
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/formatting/EclipseXmlFormatPreferences.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/formatting/EclipseXmlFormatPreferences.java
deleted file mode 100644
index 6c00b8e..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/formatting/EclipseXmlFormatPreferences.java
+++ /dev/null
@@ -1,144 +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.eclipse.adt.internal.editors.formatting;
-
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-import com.android.annotations.VisibleForTesting;
-import com.android.ide.common.xml.XmlFormatPreferences;
-import com.android.ide.eclipse.adt.internal.preferences.AdtPrefs;
-import com.android.ide.common.xml.XmlAttributeSortOrder;
-
-import org.eclipse.core.runtime.Preferences;
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.ui.internal.editors.text.EditorsPlugin;
-import org.eclipse.ui.texteditor.AbstractDecoratedTextEditorPreferenceConstants;
-import org.eclipse.wst.sse.core.internal.provisional.IndexedRegion;
-import org.eclipse.wst.xml.core.internal.XMLCorePlugin;
-import org.eclipse.wst.xml.core.internal.preferences.XMLCorePreferenceNames;
-import org.w3c.dom.Attr;
-
-import java.util.Comparator;
-
-/**
- * Formatting preferences used by the Android XML formatter.
- */
-public class EclipseXmlFormatPreferences extends XmlFormatPreferences {
-    @VisibleForTesting
-    protected EclipseXmlFormatPreferences() {
-    }
-
-    /**
-     * Creates a new {@link EclipseXmlFormatPreferences} based on the current settings
-     * in {@link AdtPrefs}
-     *
-     * @return an {@link EclipseXmlFormatPreferences} object
-     */
-    @NonNull
-    public static EclipseXmlFormatPreferences create() {
-        EclipseXmlFormatPreferences p = new EclipseXmlFormatPreferences();
-        AdtPrefs prefs = AdtPrefs.getPrefs();
-
-        p.useEclipseIndent = prefs.isUseEclipseIndent();
-        p.removeEmptyLines = prefs.isRemoveEmptyLines();
-        p.oneAttributeOnFirstLine = prefs.isOneAttributeOnFirstLine();
-        p.sortAttributes = prefs.getAttributeSort();
-        p.spaceBeforeClose = prefs.isSpaceBeforeClose();
-
-        return p;
-    }
-
-    @Override
-    @Nullable
-    public Comparator<Attr> getAttributeComparator() {
-        // Can't just skip sorting; the attribute table moves attributes out of order
-        // due to hashing, so sort by node positions
-        if (sortAttributes == XmlAttributeSortOrder.NO_SORTING) {
-            return EXISTING_ORDER_COMPARATOR;
-        }
-        return sortAttributes.getAttributeComparator();
-    }
-
-    private static final Comparator<Attr> EXISTING_ORDER_COMPARATOR = new Comparator<Attr>() {
-        @Override
-        public int compare(Attr attr1, Attr attr2) {
-            IndexedRegion region1 = (IndexedRegion) attr1;
-            IndexedRegion region2 = (IndexedRegion) attr2;
-
-            return region1.getStartOffset() - region2.getStartOffset();
-        }
-    };
-
-    // The XML module settings do not have a public API. We should replace this with JDT
-    // settings anyway since that's more likely what users have configured and want applied
-    // to their XML files
-
-    /**
-     * Returns the string to use to indent one indentation level
-     *
-     * @return the string used to indent one indentation level
-     */
-    @Override
-    @SuppressWarnings({
-            "restriction", "deprecation"
-    })
-    public String getOneIndentUnit() {
-        if (useEclipseIndent) {
-            // Look up Eclipse indent preferences
-            // TODO: Use the JDT preferences instead, which make more sense
-            Preferences preferences = XMLCorePlugin.getDefault().getPluginPreferences();
-            int indentationWidth = preferences.getInt(XMLCorePreferenceNames.INDENTATION_SIZE);
-            String indentCharPref = preferences.getString(XMLCorePreferenceNames.INDENTATION_CHAR);
-            boolean useSpaces = XMLCorePreferenceNames.SPACE.equals(indentCharPref);
-
-            StringBuilder indentString = new StringBuilder();
-            for (int j = 0; j < indentationWidth; j++) {
-                if (useSpaces) {
-                    indentString.append(' ');
-                } else {
-                    indentString.append('\t');
-                }
-            }
-            mOneIndentUnit = indentString.toString();
-        }
-
-        return mOneIndentUnit;
-    }
-
-    /**
-     * Returns the number of spaces used to display a single tab character
-     *
-     * @return the number of spaces used to display a single tab character
-     */
-    @Override
-    @SuppressWarnings("restriction") // Editor settings
-    public int getTabWidth() {
-        if (mTabWidth == -1) {
-            String key = AbstractDecoratedTextEditorPreferenceConstants.EDITOR_TAB_WIDTH;
-            try {
-                IPreferenceStore prefs = EditorsPlugin.getDefault().getPreferenceStore();
-                mTabWidth = prefs.getInt(key);
-            } catch (Throwable t) {
-                // Pass: We'll pick a suitable default instead below
-            }
-            if (mTabWidth <= 0) {
-                mTabWidth = 4;
-            }
-        }
-
-        return mTabWidth;
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/formatting/EclipseXmlPrettyPrinter.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/formatting/EclipseXmlPrettyPrinter.java
deleted file mode 100644
index d3f7ec8..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/formatting/EclipseXmlPrettyPrinter.java
+++ /dev/null
@@ -1,249 +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.eclipse.adt.internal.editors.formatting;
-
-import com.android.SdkConstants;
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-import com.android.ide.common.xml.XmlFormatPreferences;
-import com.android.ide.common.xml.XmlFormatStyle;
-import com.android.ide.common.xml.XmlPrettyPrinter;
-import com.android.ide.eclipse.adt.internal.editors.layout.gle2.DomUtilities;
-import com.android.resources.ResourceFolderType;
-import com.android.resources.ResourceType;
-import com.android.utils.SdkUtils;
-import com.android.utils.XmlUtils;
-
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.jface.text.TextUtilities;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-
-/**
- * Eclipse customization of the {@link EclipseXmlPrettyPrinter} which takes advantage of the
- * Eclipse DOM Api to track additional information, such as whether an element with no children
- * was of the open form ({@code <foo></foo>}) or the closed form ({@code <foo/>}), the ability to
- * look up the original source (for proper entity handling), the ability to preserve attribute
- * source order, etc.
- */
-@SuppressWarnings("restriction") // WST XML API
-public class EclipseXmlPrettyPrinter extends XmlPrettyPrinter {
-
-    /**
-     * Creates a new {@link com.android.ide.common.xml.XmlPrettyPrinter}
-     *
-     * @param prefs         the preferences to format with
-     * @param style         the style to format with
-     * @param lineSeparator the line separator to use, such as "\n" (can be null, in which case the
-     *                      system default is looked up via the line.separator property)
-     */
-    public EclipseXmlPrettyPrinter(
-            XmlFormatPreferences prefs,
-            XmlFormatStyle style,
-            String lineSeparator) {
-        super(prefs, style, lineSeparator == null ? getDefaultLineSeparator() : lineSeparator);
-    }
-
-    /**
-     * Pretty-prints the given XML document, which must be well-formed. If it is not,
-     * the original unformatted XML document is returned
-     *
-     * @param xml the XML content to format
-     * @param prefs the preferences to format with
-     * @param style the style to format with
-     * @param lineSeparator the line separator to use, such as "\n" (can be null, in which
-     *     case the system default is looked up via the line.separator property)
-     * @return the formatted document (or if a parsing error occurred, returns the
-     *     unformatted document)
-     */
-    @NonNull
-    public static String prettyPrint(
-            @NonNull String xml,
-            @NonNull XmlFormatPreferences prefs,
-            @NonNull XmlFormatStyle style,
-            @Nullable String lineSeparator) {
-        Document document = DomUtilities.parseStructuredDocument(xml);
-        if (document != null) {
-            EclipseXmlPrettyPrinter printer = new EclipseXmlPrettyPrinter(prefs, style,
-                    lineSeparator);
-            if (xml.endsWith("\n")) { //$NON-NLS-1$
-                printer.setEndWithNewline(true);
-            }
-
-            StringBuilder sb = new StringBuilder(3 * xml.length() / 2);
-            printer.prettyPrint(-1, document, null, null, sb, false /*openTagOnly*/);
-            return sb.toString();
-        } else {
-            // Parser error: just return the unformatted content
-            return xml;
-        }
-    }
-
-    @NonNull
-    public static String prettyPrint(@NonNull Node node, boolean endWithNewline) {
-        return prettyPrint(node, EclipseXmlFormatPreferences.create(), XmlFormatStyle.get(node),
-                null, endWithNewline);
-    }
-
-    private static String getDefaultLineSeparator() {
-        org.eclipse.jface.text.Document blank = new org.eclipse.jface.text.Document();
-        String lineSeparator = TextUtilities.getDefaultLineDelimiter(blank);
-        if (lineSeparator == null) {
-            lineSeparator = SdkUtils.getLineSeparator();
-        }
-
-        return lineSeparator;
-    }
-
-    /**
-     * Pretty prints the given node
-     *
-     * @param node the node, usually a document, to be printed
-     * @param prefs the formatting preferences
-     * @param style the formatting style to use
-     * @param lineSeparator the line separator to use, or null to use the
-     *            default
-     * @return a formatted string
-     */
-    @NonNull
-    public static String prettyPrint(
-            @NonNull Node node,
-            @NonNull XmlFormatPreferences prefs,
-            @NonNull XmlFormatStyle style,
-            @Nullable String lineSeparator,
-            boolean endWithNewline) {
-        XmlPrettyPrinter printer = new EclipseXmlPrettyPrinter(prefs, style, lineSeparator);
-        printer.setEndWithNewline(endWithNewline);
-        StringBuilder sb = new StringBuilder(1000);
-        printer.prettyPrint(-1, node, null, null, sb, false /*openTagOnly*/);
-        String xml = sb.toString();
-        if (node.getNodeType() == Node.DOCUMENT_NODE && !xml.startsWith("<?")) { //$NON-NLS-1$
-            xml = XmlUtils.XML_PROLOG + xml;
-        }
-        return xml;
-    }
-
-    @Nullable
-    @Override
-    protected String getSource(@NonNull Node node) {
-        // In Eclipse, org.w3c.dom.DocumentType.getTextContent() returns null
-        if (node instanceof IDOMNode) {
-            // Get the original source string. This will contain the actual entities
-            // such as "&gt;" instead of ">" which it gets turned into for the DOM nodes.
-            // By operating on source we can preserve the user's entities rather than
-            // having &gt; for example always turned into >.
-            IDOMNode textImpl = (IDOMNode) node;
-            return textImpl.getSource();
-        }
-
-        return super.getSource(node);
-    }
-
-    @Override
-    protected boolean isEmptyTag(Element element) {
-        if (element instanceof IDOMElement) {
-            IDOMElement elementImpl = (IDOMElement) element;
-            if (elementImpl.isEmptyTag()) {
-                return true;
-            }
-        }
-
-        return false;
-    }
-
-    /**
-     * Returns the {@link XmlFormatStyle} to use for a resource of the given type
-     *
-     * @param resourceType the type of resource to be formatted
-     * @return the suitable format style to use
-     */
-    public static XmlFormatStyle get(ResourceType resourceType) {
-        switch (resourceType) {
-            case ARRAY:
-            case ATTR:
-            case BOOL:
-            case DECLARE_STYLEABLE:
-            case DIMEN:
-            case FRACTION:
-            case ID:
-            case INTEGER:
-            case STRING:
-            case PLURALS:
-            case STYLE:
-            case STYLEABLE:
-            case COLOR:
-                return XmlFormatStyle.RESOURCE;
-
-            case LAYOUT:
-                return XmlFormatStyle.LAYOUT;
-
-            case DRAWABLE:
-            case MENU:
-            case ANIM:
-            case ANIMATOR:
-            case INTERPOLATOR:
-            default:
-                return XmlFormatStyle.FILE;
-        }
-    }
-
-    /**
-     * Returns the {@link XmlFormatStyle} to use for resource files in the given resource
-     * folder
-     *
-     * @param folderType the type of folder containing the resource file
-     * @return the suitable format style to use
-     */
-    public static XmlFormatStyle getForFolderType(ResourceFolderType folderType) {
-        switch (folderType) {
-            case LAYOUT:
-                return XmlFormatStyle.LAYOUT;
-            case COLOR:
-            case VALUES:
-                return XmlFormatStyle.RESOURCE;
-            case ANIM:
-            case ANIMATOR:
-            case DRAWABLE:
-            case INTERPOLATOR:
-            case MENU:
-            default:
-                return XmlFormatStyle.FILE;
-        }
-    }
-
-    /**
-     * Returns the {@link XmlFormatStyle} to use for resource files of the given path.
-     *
-     * @param path the path to the resource file
-     * @return the suitable format style to use
-     */
-    public static XmlFormatStyle getForFile(IPath path) {
-        if (SdkConstants.FN_ANDROID_MANIFEST_XML.equals(path.lastSegment())) {
-            return XmlFormatStyle.MANIFEST;
-        }
-
-        if (path.segmentCount() > 2) {
-            String parentName = path.segment(path.segmentCount() - 2);
-            ResourceFolderType folderType = ResourceFolderType.getFolderType(parentName);
-            return getForFolderType(folderType);
-        }
-
-        return XmlFormatStyle.FILE;
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/formatting/XmlFormatProcessor.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/formatting/XmlFormatProcessor.java
deleted file mode 100644
index 3f83302..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/formatting/XmlFormatProcessor.java
+++ /dev/null
@@ -1,58 +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.eclipse.adt.internal.editors.formatting;
-
-import static org.eclipse.jface.text.formatter.FormattingContextProperties.CONTEXT_MEDIUM;
-import static org.eclipse.jface.text.formatter.FormattingContextProperties.CONTEXT_PARTITION;
-import static org.eclipse.jface.text.formatter.FormattingContextProperties.CONTEXT_REGION;
-
-import com.android.ide.eclipse.adt.internal.preferences.AdtPrefs;
-
-import org.eclipse.jface.text.TypedPosition;
-import org.eclipse.jface.text.formatter.FormattingContext;
-import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
-import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;
-import org.eclipse.wst.xml.core.internal.formatter.XMLFormatterFormatProcessor;
-import org.eclipse.wst.xml.core.text.IXMLPartitions;
-
-/**
- * Customized version of the builtin XML format processor which delegates to the
- * Android specific formatter such that applying format on IFiles work as
- * expected
- */
-@SuppressWarnings("restriction")
-public class XmlFormatProcessor extends XMLFormatterFormatProcessor {
-    /** Constructs a new {@link XmlFormatProcessor} */
-    public XmlFormatProcessor() {
-    }
-
-    @Override
-    public void formatModel(IStructuredModel structuredModel, int start, int length) {
-        if (!AdtPrefs.getPrefs().getUseCustomXmlFormatter()) {
-            super.formatModel(structuredModel, start, length);
-            return;
-        }
-
-        AndroidXmlFormatter formatter = new AndroidXmlFormatter();
-        IStructuredDocument document = structuredModel.getStructuredDocument();
-        FormattingContext context = new FormattingContext();
-        context.setProperty(CONTEXT_MEDIUM, document);
-        context.setProperty(CONTEXT_PARTITION, new TypedPosition(start, length,
-                IXMLPartitions.XML_DEFAULT));
-        context.setProperty(CONTEXT_REGION, new org.eclipse.jface.text.Region(start, length));
-        formatter.formatMaster(context, document, start, length);
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/formatting/XmlQuickAssistManager.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/formatting/XmlQuickAssistManager.java
deleted file mode 100644
index a979a80..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/formatting/XmlQuickAssistManager.java
+++ /dev/null
@@ -1,106 +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.eclipse.adt.internal.editors.formatting;
-
-import com.android.ide.eclipse.adt.internal.build.AaptQuickFix;
-import com.android.ide.eclipse.adt.internal.editors.layout.refactoring.RefactoringAssistant;
-import com.android.ide.eclipse.adt.internal.lint.LintFixGenerator;
-
-import org.eclipse.jface.text.contentassist.ICompletionProposal;
-import org.eclipse.jface.text.quickassist.IQuickAssistInvocationContext;
-import org.eclipse.jface.text.quickassist.IQuickAssistProcessor;
-import org.eclipse.jface.text.source.Annotation;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * This class implements Quick Assists for XML files. It does not perform any
- * quick assistance on its own, but it coordinates the various separate quick
- * assists available for XML such that the order is logical. This is necessary
- * because without it, the order of suggestions (when more than one assistant
- * provides suggestions) is not always optimal. There doesn't seem to be a way
- * from non-Java languages to set the sorting order (see
- * https://bugs.eclipse.org/bugs/show_bug.cgi?id=229983 ). So instead of
- * registering our multiple XML quick assistants via the plugin.xml file, we
- * register <b>just</b> this manager, which delegates to the various XML quick
- * assistants as appropriate.
- */
-public class XmlQuickAssistManager implements IQuickAssistProcessor {
-    private final IQuickAssistProcessor[] mProcessors;
-
-    /** Constructs a new {@link XmlQuickAssistManager} which orders the quick fixes */
-    public XmlQuickAssistManager() {
-        mProcessors = new IQuickAssistProcessor[] {
-                new AaptQuickFix(),
-                new LintFixGenerator(),
-                new RefactoringAssistant()
-        };
-    }
-
-    @Override
-    public String getErrorMessage() {
-        return null;
-    }
-
-    @Override
-    public boolean canFix(Annotation annotation) {
-        for (IQuickAssistProcessor processor : mProcessors) {
-            if (processor.canFix(annotation)) {
-                return true;
-            }
-        }
-
-        return false;
-    }
-
-    @Override
-    public boolean canAssist(IQuickAssistInvocationContext invocationContext) {
-        for (IQuickAssistProcessor processor : mProcessors) {
-            if (processor.canAssist(invocationContext)) {
-                return true;
-            }
-        }
-
-        return false;
-    }
-
-    @Override
-    public ICompletionProposal[] computeQuickAssistProposals(
-            IQuickAssistInvocationContext invocationContext) {
-        List<ICompletionProposal> allProposals = null;
-        for (IQuickAssistProcessor processor : mProcessors) {
-            if (processor.canAssist(invocationContext)) {
-                ICompletionProposal[] proposals =
-                        processor.computeQuickAssistProposals(invocationContext);
-                if (proposals != null && proposals.length > 0) {
-                    if (allProposals == null) {
-                        allProposals = new ArrayList<ICompletionProposal>();
-                    }
-                    for (ICompletionProposal proposal : proposals) {
-                        allProposals.add(proposal);
-                    }
-                }
-            }
-        }
-
-        if (allProposals != null) {
-            return allProposals.toArray(new ICompletionProposal[allProposals.size()]);
-        }
-
-        return null;
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/ActionBarHandler.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/ActionBarHandler.java
deleted file mode 100644
index 49585a3..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/ActionBarHandler.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/*
- * Copyright (C) 2014 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.editors.layout;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.w3c.dom.Element;
-
-import com.android.ide.common.rendering.api.ActionBarCallback;
-import com.android.ide.eclipse.adt.internal.editors.layout.gle2.GraphicalEditorPart;
-import com.android.ide.eclipse.adt.internal.editors.manifest.ManifestInfo;
-import com.android.ide.eclipse.adt.internal.editors.manifest.ManifestInfo.ActivityAttributes;
-import com.google.common.base.Splitter;
-import com.google.common.collect.Iterables;
-
-import static com.android.SdkConstants.TOOLS_URI;
-import static com.android.SdkConstants.VALUE_SPLIT_ACTION_BAR_WHEN_NARROW;
-
-public class ActionBarHandler extends ActionBarCallback {
-
-    private final GraphicalEditorPart mEditor;
-
-    ActionBarHandler(GraphicalEditorPart editor) {
-        mEditor = editor;
-    }
-
-    @Override
-    public List<String> getMenuIdNames() {
-        String commaSeparatedMenus = getXmlAttribute(ATTR_MENU);
-        List<String> menus = new ArrayList<String>();
-        Iterables.addAll(menus, Splitter.on(',').trimResults().omitEmptyStrings()
-                .split(commaSeparatedMenus));
-        return menus;
-    }
-
-    @Override
-    public boolean getSplitActionBarWhenNarrow() {
-        ActivityAttributes attributes = getActivityAttributes();
-        if (attributes != null) {
-          return VALUE_SPLIT_ACTION_BAR_WHEN_NARROW.equals(attributes.getUiOptions());
-        }
-        return false;
-    }
-
-    @Override
-    public int getNavigationMode() {
-        String navMode = getXmlAttribute(ATTR_NAV_MODE);
-        if (navMode.equalsIgnoreCase(VALUE_NAV_MODE_TABS)) {
-          return NAVIGATION_MODE_TABS;
-        }
-        if (navMode.equalsIgnoreCase(VALUE_NAV_MODE_LIST)) {
-          return NAVIGATION_MODE_LIST;
-        }
-        return NAVIGATION_MODE_STANDARD;
-    }
-
-    @Override
-    public HomeButtonStyle getHomeButtonStyle() {
-        ActivityAttributes attributes = getActivityAttributes();
-        if (attributes != null && attributes.getParentActivity() != null) {
-          return HomeButtonStyle.SHOW_HOME_AS_UP;
-        }
-        return HomeButtonStyle.NONE;
-    }
-
-    private ActivityAttributes getActivityAttributes() {
-        ManifestInfo manifest = ManifestInfo.get(mEditor.getProject());
-        String activity = mEditor.getConfigurationChooser().getConfiguration().getActivity();
-        return manifest.getActivityAttributes(activity);
-    }
-
-    private String getXmlAttribute(String name) {
-        Element element = mEditor.getModel().getUiRoot().getXmlDocument().getDocumentElement();
-        String value = element.getAttributeNS(TOOLS_URI, name);
-        if (value == null) {
-            return "";
-        }
-        return value.trim();
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/BasePullParser.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/BasePullParser.java
deleted file mode 100644
index 43fb1a5..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/BasePullParser.java
+++ /dev/null
@@ -1,244 +0,0 @@
-/*
- * 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.editors.layout;
-
-import com.android.ide.common.rendering.legacy.ILegacyPullParser;
-
-import org.xmlpull.v1.XmlPullParserException;
-
-import java.io.InputStream;
-import java.io.Reader;
-
-/**
- * Base implementation of an {@link ILegacyPullParser} for cases where the parser is not sitting
- * on top of an actual XML file.
- * <p/>It's designed to work on layout files, and will most likely not work on other resource
- * files.
- */
-public abstract class BasePullParser implements ILegacyPullParser {
-
-    protected int mParsingState = START_DOCUMENT;
-
-    public BasePullParser() {
-    }
-
-    // --- new methods to override ---
-
-    public abstract void onNextFromStartDocument();
-    public abstract void onNextFromStartTag();
-    public abstract void onNextFromEndTag();
-
-    // --- basic implementation of IXmlPullParser ---
-
-    @Override
-    public void setFeature(String name, boolean state) throws XmlPullParserException {
-        if (FEATURE_PROCESS_NAMESPACES.equals(name) && state) {
-            return;
-        }
-        if (FEATURE_REPORT_NAMESPACE_ATTRIBUTES.equals(name) && state) {
-            return;
-        }
-        throw new XmlPullParserException("Unsupported feature: " + name);
-    }
-
-    @Override
-    public boolean getFeature(String name) {
-        if (FEATURE_PROCESS_NAMESPACES.equals(name)) {
-            return true;
-        }
-        if (FEATURE_REPORT_NAMESPACE_ATTRIBUTES.equals(name)) {
-            return true;
-        }
-        return false;
-    }
-
-    @Override
-    public void setProperty(String name, Object value) throws XmlPullParserException {
-        throw new XmlPullParserException("setProperty() not supported");
-    }
-
-    @Override
-    public Object getProperty(String name) {
-        return null;
-    }
-
-    @Override
-    public void setInput(Reader in) throws XmlPullParserException {
-        throw new XmlPullParserException("setInput() not supported");
-    }
-
-    @Override
-    public void setInput(InputStream inputStream, String inputEncoding)
-            throws XmlPullParserException {
-        throw new XmlPullParserException("setInput() not supported");
-    }
-
-    @Override
-    public void defineEntityReplacementText(String entityName, String replacementText)
-            throws XmlPullParserException {
-        throw new XmlPullParserException("defineEntityReplacementText() not supported");
-    }
-
-    @Override
-    public String getNamespacePrefix(int pos) throws XmlPullParserException {
-        throw new XmlPullParserException("getNamespacePrefix() not supported");
-    }
-
-    @Override
-    public String getInputEncoding() {
-        return null;
-    }
-
-    @Override
-    public String getNamespace(String prefix) {
-        throw new RuntimeException("getNamespace() not supported");
-    }
-
-    @Override
-    public int getNamespaceCount(int depth) throws XmlPullParserException {
-        throw new XmlPullParserException("getNamespaceCount() not supported");
-    }
-
-    @Override
-    public String getNamespaceUri(int pos) throws XmlPullParserException {
-        throw new XmlPullParserException("getNamespaceUri() not supported");
-    }
-
-    @Override
-    public int getColumnNumber() {
-        return -1;
-    }
-
-    @Override
-    public int getLineNumber() {
-        return -1;
-    }
-
-    @Override
-    public String getAttributeType(int arg0) {
-        return "CDATA";
-    }
-
-    @Override
-    public int getEventType() {
-        return mParsingState;
-    }
-
-    @Override
-    public String getText() {
-        return null;
-    }
-
-    @Override
-    public char[] getTextCharacters(int[] arg0) {
-        return null;
-    }
-
-    @Override
-    public boolean isAttributeDefault(int arg0) {
-        return false;
-    }
-
-    @Override
-    public boolean isWhitespace() {
-        return false;
-    }
-
-    @Override
-    public int next() throws XmlPullParserException {
-        switch (mParsingState) {
-            case END_DOCUMENT:
-                throw new XmlPullParserException("Nothing after the end");
-            case START_DOCUMENT:
-                onNextFromStartDocument();
-                break;
-            case START_TAG:
-                onNextFromStartTag();
-                break;
-            case END_TAG:
-                onNextFromEndTag();
-                break;
-            case TEXT:
-                // not used
-                break;
-            case CDSECT:
-                // not used
-                break;
-            case ENTITY_REF:
-                // not used
-                break;
-            case IGNORABLE_WHITESPACE:
-                // not used
-                break;
-            case PROCESSING_INSTRUCTION:
-                // not used
-                break;
-            case COMMENT:
-                // not used
-                break;
-            case DOCDECL:
-                // not used
-                break;
-        }
-
-        return mParsingState;
-    }
-
-    @Override
-    public int nextTag() throws XmlPullParserException {
-        int eventType = next();
-        if (eventType != START_TAG && eventType != END_TAG) {
-            throw new XmlPullParserException("expected start or end tag", this, null);
-        }
-        return eventType;
-    }
-
-    @Override
-    public String nextText() throws XmlPullParserException {
-        if (getEventType() != START_TAG) {
-            throw new XmlPullParserException("parser must be on START_TAG to read next text", this,
-                    null);
-        }
-        int eventType = next();
-        if (eventType == TEXT) {
-            String result = getText();
-            eventType = next();
-            if (eventType != END_TAG) {
-                throw new XmlPullParserException(
-                        "event TEXT it must be immediately followed by END_TAG", this, null);
-            }
-            return result;
-        } else if (eventType == END_TAG) {
-            return "";
-        } else {
-            throw new XmlPullParserException("parser must be on START_TAG or TEXT to read text",
-                    this, null);
-        }
-    }
-
-    @Override
-    public int nextToken() throws XmlPullParserException {
-        return next();
-    }
-
-    @Override
-    public void require(int type, String namespace, String name) throws XmlPullParserException {
-        if (type != getEventType() || (namespace != null && !namespace.equals(getNamespace()))
-                || (name != null && !name.equals(getName())))
-            throw new XmlPullParserException("expected " + TYPES[type] + getPositionDescription());
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/ContextPullParser.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/ContextPullParser.java
deleted file mode 100644
index f304065..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/ContextPullParser.java
+++ /dev/null
@@ -1,166 +0,0 @@
-/*
- * Copyright (C) 2010 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.editors.layout;
-
-import static com.android.SdkConstants.ATTR_IGNORE;
-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.EXPANDABLE_LIST_VIEW;
-import static com.android.SdkConstants.GRID_VIEW;
-import static com.android.SdkConstants.LIST_VIEW;
-import static com.android.SdkConstants.SPINNER;
-import static com.android.SdkConstants.TOOLS_URI;
-import static com.android.SdkConstants.VALUE_FILL_PARENT;
-import static com.android.SdkConstants.VALUE_MATCH_PARENT;
-import static com.android.SdkConstants.VIEW_FRAGMENT;
-import static com.android.SdkConstants.VIEW_INCLUDE;
-import static com.android.ide.eclipse.adt.internal.editors.layout.gle2.LayoutMetadata.KEY_FRAGMENT_LAYOUT;
-
-import com.android.SdkConstants;
-import com.android.ide.common.rendering.api.ILayoutPullParser;
-import com.android.ide.common.rendering.api.IProjectCallback;
-import com.android.ide.common.res2.ValueXmlHelper;
-import com.android.ide.eclipse.adt.internal.editors.layout.gle2.LayoutMetadata;
-import com.google.common.collect.Maps;
-
-import org.kxml2.io.KXmlParser;
-
-import java.io.File;
-import java.util.Map;
-
-/**
- * Modified {@link KXmlParser} that adds the methods of {@link ILayoutPullParser}, and
- * performs other layout-specific parser behavior like translating fragment tags into
- * include tags.
- * <p/>
- * It will return a given parser when queried for one through
- * {@link ILayoutPullParser#getParser(String)} for a given name.
- *
- */
-public class ContextPullParser extends KXmlParser implements ILayoutPullParser {
-    private static final String COMMENT_PREFIX = "<!--"; //$NON-NLS-1$
-    private static final String COMMENT_SUFFIX = "-->"; //$NON-NLS-1$
-    /** The callback to request parsers from */
-    private final IProjectCallback mProjectCallback;
-    /** The {@link File} for the layout currently being parsed */
-    private File mFile;
-    /** The layout to be shown for the current {@code <fragment>} tag. Usually null. */
-    private String mFragmentLayout = null;
-
-    /**
-     * Creates a new {@link ContextPullParser}
-     *
-     * @param projectCallback the associated callback
-     * @param file the file to be parsed
-     */
-    public ContextPullParser(IProjectCallback projectCallback, File file) {
-        super();
-        mProjectCallback = projectCallback;
-        mFile = file;
-    }
-
-    // --- Layout lib API methods
-
-    @Override
-    /**
-     * this is deprecated but must still be implemented for older layout libraries.
-     * @deprecated use {@link IProjectCallback#getParser(String)}.
-     */
-    @Deprecated
-    public ILayoutPullParser getParser(String layoutName) {
-        return mProjectCallback.getParser(layoutName);
-    }
-
-    @Override
-    public Object getViewCookie() {
-        String name = super.getName();
-        if (name == null) {
-            return null;
-        }
-
-        // Store tools attributes if this looks like a layout we'll need adapter view
-        // bindings for in the ProjectCallback.
-        if (LIST_VIEW.equals(name)
-                || EXPANDABLE_LIST_VIEW.equals(name)
-                || GRID_VIEW.equals(name)
-                || SPINNER.equals(name)) {
-            Map<String, String> map = null;
-            int count = getAttributeCount();
-            for (int i = 0; i < count; i++) {
-                String namespace = getAttributeNamespace(i);
-                if (namespace != null && namespace.equals(TOOLS_URI)) {
-                    String attribute = getAttributeName(i);
-                    if (attribute.equals(ATTR_IGNORE)) {
-                        continue;
-                    }
-                    if (map == null) {
-                        map = Maps.newHashMapWithExpectedSize(4);
-                    }
-                    map.put(attribute, getAttributeValue(i));
-                }
-            }
-
-            return map;
-        }
-
-        return null;
-    }
-
-    // --- KXMLParser override
-
-    @Override
-    public String getName() {
-        String name = super.getName();
-
-        // At designtime, replace fragments with includes.
-        if (name.equals(VIEW_FRAGMENT)) {
-            mFragmentLayout = LayoutMetadata.getProperty(this, KEY_FRAGMENT_LAYOUT);
-            if (mFragmentLayout != null) {
-                return VIEW_INCLUDE;
-            }
-        } else {
-            mFragmentLayout = null;
-        }
-
-
-        return name;
-    }
-
-    @Override
-    public String getAttributeValue(String namespace, String localName) {
-        if (ATTR_LAYOUT.equals(localName) && mFragmentLayout != null) {
-            return mFragmentLayout;
-        }
-
-        String value = super.getAttributeValue(namespace, localName);
-
-        // on the fly convert match_parent to fill_parent for compatibility with older
-        // platforms.
-        if (VALUE_MATCH_PARENT.equals(value) &&
-                (ATTR_LAYOUT_WIDTH.equals(localName) ||
-                        ATTR_LAYOUT_HEIGHT.equals(localName)) &&
-                SdkConstants.NS_RESOURCES.equals(namespace)) {
-            return VALUE_FILL_PARENT;
-        }
-
-        // Handle unicode escapes etc
-        value = ValueXmlHelper.unescapeResourceString(value, false, false);
-
-        return value;
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/ExplodedRenderingHelper.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/ExplodedRenderingHelper.java
deleted file mode 100644
index 25fa3e9..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/ExplodedRenderingHelper.java
+++ /dev/null
@@ -1,421 +0,0 @@
-/*
- * Copyright (C) 2009 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.editors.layout;
-
-import com.android.SdkConstants;
-import com.android.ide.eclipse.adt.internal.editors.layout.descriptors.LayoutDescriptors;
-import com.android.ide.eclipse.adt.internal.editors.layout.descriptors.ViewElementDescriptor;
-import com.android.ide.eclipse.adt.internal.sdk.AndroidTargetData;
-import com.android.ide.eclipse.adt.internal.sdk.Sdk;
-import com.android.sdklib.IAndroidTarget;
-
-import org.eclipse.core.resources.IProject;
-import org.w3c.dom.NamedNodeMap;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Map.Entry;
-import java.util.Set;
-
-/**
- * This class computes the new screen size in "exploded rendering" mode.
- * It goes through the whole layout tree and figures out how many embedded layouts will have
- * extra padding and compute how that will affect the screen size.
- *
- * TODO
- * - find a better class name :)
- * - move the logic for each layout to the layout rule classes?
- * - support custom classes (by querying JDT for its super class and reverting to its behavior)
- */
-public final class ExplodedRenderingHelper {
-    /** value of the padding in pixel.
-     * TODO: make a preference?
-     */
-    public final static int PADDING_VALUE = 10;
-
-    private final int[] mPadding = new int[] { 0, 0 };
-    private Set<String> mLayoutNames;
-
-    /**
-     * Computes the padding. access the result through {@link #getWidthPadding()} and
-     * {@link #getHeightPadding()}.
-     * @param root the root node (ie the top layout).
-     * @param iProject the project to which the layout belong.
-     */
-    public ExplodedRenderingHelper(Node root, IProject iProject) {
-        // get the layout descriptors to get the name of all the layout classes.
-        IAndroidTarget target = Sdk.getCurrent().getTarget(iProject);
-        AndroidTargetData data = Sdk.getCurrent().getTargetData(target);
-        LayoutDescriptors descriptors = data.getLayoutDescriptors();
-
-        mLayoutNames = new HashSet<String>();
-        List<ViewElementDescriptor> layoutDescriptors = descriptors.getLayoutDescriptors();
-        for (ViewElementDescriptor desc : layoutDescriptors) {
-            mLayoutNames.add(desc.getXmlLocalName());
-        }
-
-        computePadding(root, mPadding);
-    }
-
-    /**
-     * (Unit tests only)
-     * Computes the padding. access the result through {@link #getWidthPadding()} and
-     * {@link #getHeightPadding()}.
-     * @param root the root node (ie the top layout).
-     * @param layoutNames the list of layout classes
-     */
-    public ExplodedRenderingHelper(Node root, Set<String> layoutNames) {
-        mLayoutNames = layoutNames;
-
-        computePadding(root, mPadding);
-    }
-
-    /**
-     * Returns the number of extra padding in the X axis. This doesn't return a number of pixel
-     * or dip, but how many paddings are pushing the screen dimension out.
-     */
-    public int getWidthPadding() {
-        return mPadding[0];
-    }
-
-    /**
-     * Returns the number of extra padding in the Y axis. This doesn't return a number of pixel
-     * or dip, but how many paddings are pushing the screen dimension out.
-     */
-    public int getHeightPadding() {
-        return mPadding[1];
-    }
-
-    /**
-     * Computes the number of padding for a given view, and fills the given array of int.
-     * <p/>index 0 is X axis, index 1 is Y axis
-     * @param view the view to compute
-     * @param padding the result padding (index 0 is X axis, index 1 is Y axis)
-     */
-    private void computePadding(Node view, int[] padding) {
-        String localName = view.getLocalName();
-
-        // first compute for each children
-        NodeList children = view.getChildNodes();
-        int count = children.getLength();
-        if (count > 0) {
-            // compute the padding for all the children.
-            Map<Node, int[]> childrenPadding = new HashMap<Node, int[]>(count);
-            for (int i = 0 ; i < count ; i++) {
-                Node child = children.item(i);
-                short type = child.getNodeType();
-                if (type == Node.ELEMENT_NODE) { // ignore TEXT/CDATA nodes.
-                    int[] p = new int[] { 0, 0 };
-                    childrenPadding.put(child, p);
-                    computePadding(child, p);
-                }
-            }
-
-            // since the non ELEMENT_NODE children were filtered out, count must be updated.
-            count = childrenPadding.size();
-
-            // now combine/compare based on the parent.
-            if (count == 1) {
-                int[] p = childrenPadding.get(childrenPadding.keySet().iterator().next());
-                padding[0] = p[0];
-                padding[1] = p[1];
-            } else {
-                if ("LinearLayout".equals(localName)) { //$NON-NLS-1$
-                    String orientation = getAttribute(view, "orientation", null);  //$NON-NLS-1$
-
-                    // default value is horizontal
-                    boolean horizontal = orientation == null ||
-                            "horizontal".equals("vertical");  //$NON-NLS-1$  //$NON-NLS-2$
-                    combineLinearLayout(childrenPadding.values(), padding, horizontal);
-                } else if ("TableLayout".equals(localName)) { //$NON-NLS-1$
-                    combineLinearLayout(childrenPadding.values(), padding, false /*horizontal*/);
-                } else if ("TableRow".equals(localName)) { //$NON-NLS-1$
-                    combineLinearLayout(childrenPadding.values(), padding, true /*true*/);
-                // TODO: properly support Relative Layouts.
-//                } else if ("RelativeLayout".equals(localName)) { //$NON-NLS-1$
-//                    combineRelativeLayout(childrenPadding, padding);
-                } else {
-                    // unknown layout. For now, let's consider it's better to add the children
-                    // margins in both dimensions than not at all.
-                    for (int[] p : childrenPadding.values()) {
-                        padding[0] += p[0];
-                        padding[1] += p[1];
-                    }
-                }
-            }
-        }
-
-        // if the view itself is a layout, add its padding
-        if (mLayoutNames.contains(localName)) {
-            padding[0]++;
-            padding[1]++;
-        }
-    }
-
-    /**
-     * Combines the padding of the children of a linear layout.
-     * <p/>For this layout, the padding of the children are added in the direction of
-     * the layout, while the max is taken for the other direction.
-     * @param paddings the list of the padding for the children.
-     * @param resultPadding the result padding array to fill.
-     * @param horizontal whether this layout is horizontal (<code>true</code>) or vertical
-     * (<code>false</code>)
-     */
-    private void combineLinearLayout(Collection<int[]> paddings, int[] resultPadding,
-            boolean horizontal) {
-        // The way the children are combined will depend on the direction.
-        // For instance in a vertical layout, we add the y padding as they all add to the length
-        // of the needed canvas, while we take the biggest x padding needed by the children
-
-        // the axis in which we take the sum of the padding of the children
-        int sumIndex = horizontal ? 0 : 1;
-        // the axis in which we take the max of the padding of the children
-        int maxIndex = horizontal ? 1 : 0;
-
-        int max = -1;
-        for (int[] p : paddings) {
-            resultPadding[sumIndex] += p[sumIndex];
-            if (max == -1 || max < p[maxIndex]) {
-                max = p[maxIndex];
-            }
-        }
-        resultPadding[maxIndex] = max;
-    }
-
-    /**
-     * Combine the padding of children of a relative layout.
-     * @param childrenPadding a map of the children. This is guaranteed that the node object
-     *  are of type ELEMENT_NODE
-     * @param padding
-     *
-     * TODO: Not used yet. Still need (lots of) work.
-     */
-    private void combineRelativeLayout(Map<Node, int[]> childrenPadding, int[] padding) {
-        /*
-         * Combines the children of the layout.
-         * The way this works: for each children, for each direction, look for all the chidrens
-         * connected and compute the combined margin in that direction.
-         *
-         * There's a chance the returned value will be too much. this is due to the layout sometimes
-         * dropping views which will not be dropped here. It's ok, as it's better to have too
-         * much than not enough.
-         * We could fix this by matching those UiElementNode with their bounds as returned
-         * by the rendering (ie if bounds is 0/0 in h/w, then ignore the child)
-         */
-
-        // list of the UiElementNode
-        Set<Node> nodeSet = childrenPadding.keySet();
-        // map of Id -> node
-        Map<String, Node> idNodeMap = computeIdNodeMap(nodeSet);
-
-        for (Entry<Node, int[]> entry : childrenPadding.entrySet()) {
-            Node node = entry.getKey();
-
-            // first horizontal, to the left.
-            int[] leftResult = getBiggestMarginInDirection(node, 0 /*horizontal*/,
-                    "layout_toRightOf", "layout_toLeftOf", //$NON-NLS-1$ //$NON-NLS-2$
-                    childrenPadding, nodeSet, idNodeMap,
-                    false /*includeThisPadding*/);
-
-            // then to the right
-            int[] rightResult = getBiggestMarginInDirection(node, 0 /*horizontal*/,
-                    "layout_toLeftOf", "layout_toRightOf", //$NON-NLS-1$ //$NON-NLS-2$
-                    childrenPadding, nodeSet, idNodeMap,
-                    false /*includeThisPadding*/);
-
-            // compute total horizontal margins
-            int[] thisPadding = childrenPadding.get(node);
-            int combinedMargin =
-                (thisPadding != null ? thisPadding[0] : 0) +
-                (leftResult != null ? leftResult[0] : 0) +
-                (rightResult != null ? rightResult[0] : 0);
-            if (combinedMargin > padding[0]) {
-                padding[0] = combinedMargin;
-            }
-
-            // first vertical, above.
-            int[] topResult = getBiggestMarginInDirection(node, 1 /*horizontal*/,
-                    "layout_below", "layout_above", //$NON-NLS-1$ //$NON-NLS-2$
-                    childrenPadding, nodeSet, idNodeMap,
-                    false /*includeThisPadding*/);
-
-            // then below
-            int[] bottomResult = getBiggestMarginInDirection(node, 1 /*horizontal*/,
-                    "layout_above", "layout_below", //$NON-NLS-1$ //$NON-NLS-2$
-                    childrenPadding, nodeSet, idNodeMap,
-                    false /*includeThisPadding*/);
-
-            // compute total horizontal margins
-            combinedMargin =
-                (thisPadding != null ? thisPadding[1] : 0) +
-                (topResult != null ? topResult[1] : 0) +
-                (bottomResult != null ? bottomResult[1] : 0);
-            if (combinedMargin > padding[1]) {
-                padding[1] = combinedMargin;
-            }
-        }
-    }
-
-    /**
-     * Computes the biggest margin in a given direction.
-     *
-     * TODO: Not used yet. Still need (lots of) work.
-     */
-    private int[] getBiggestMarginInDirection(Node node, int resIndex, String relativeTo,
-            String inverseRelation, Map<Node, int[]> childrenPadding,
-            Set<Node> nodeSet, Map<String, Node> idNodeMap,
-            boolean includeThisPadding) {
-        NamedNodeMap attributes = node.getAttributes();
-
-        String viewId = getAttribute(node, "id", attributes); //$NON-NLS-1$
-
-        // first get the item this one is positioned relative to.
-        String toLeftOfRef = getAttribute(node, relativeTo, attributes);
-        Node toLeftOf = null;
-        if (toLeftOfRef != null) {
-            toLeftOf = idNodeMap.get(cleanUpIdReference(toLeftOfRef));
-        }
-
-        ArrayList<Node> list = null;
-        if (viewId != null) {
-            // now to the left for items being placed to the left of this one.
-            list = getMatchingNode(nodeSet, cleanUpIdReference(viewId), inverseRelation);
-        }
-
-        // now process each children in the same direction.
-        if (toLeftOf != null) {
-            if (list == null) {
-                list = new ArrayList<Node>();
-            }
-
-            if (list.indexOf(toLeftOf) == -1) {
-                list.add(toLeftOf);
-            }
-        }
-
-        int[] thisPadding = childrenPadding.get(node);
-
-        if (list != null) {
-             // since there's a combination to do, we'll return a new result object
-            int[] result = null;
-            for (Node nodeOnLeft : list) {
-                int[] tempRes = getBiggestMarginInDirection(nodeOnLeft, resIndex, relativeTo,
-                        inverseRelation, childrenPadding, nodeSet, idNodeMap, true);
-                if (tempRes != null && (result == null || result[resIndex] < tempRes[resIndex])) {
-                    result = tempRes;
-                }
-            }
-
-            // return the combined padding
-            if (includeThisPadding == false || thisPadding[resIndex] == 0) {
-                // just return the one we got since this object adds no padding (or doesn't
-                // need to be comibined)
-                return result;
-            } else if (result != null) { // if result is null, the main return below is used.
-                // add the result we got with the padding from the current node
-                int[] realRes = new int [2];
-                realRes[resIndex] = thisPadding[resIndex] + result[resIndex];
-                return realRes;
-            }
-        }
-
-        // if we reach this, there were no other views to the left of this one, so just return
-        // the view padding.
-        return includeThisPadding ? thisPadding : null;
-    }
-
-    /**
-     * Computes and returns a map of (id, node) for each node of a given {@link Set}.
-     * <p/>
-     * Nodes with no id are ignored and not put in the map.
-     * @param nodes the nodes to fill the map with.
-     * @return a newly allocated, non-null, map of (id, node)
-     */
-    private Map<String, Node> computeIdNodeMap(Set<Node> nodes) {
-        Map<String, Node> map = new HashMap<String, Node>();
-        for (Node node : nodes) {
-            String viewId = getAttribute(node, "id", null); //$NON-NLS-1$
-            if (viewId != null) {
-                map.put(cleanUpIdReference(viewId), node);
-            }
-        }
-        return map;
-    }
-
-    /**
-     * Cleans up a reference to an ID to return the ID itself only.
-     * @param reference the reference to "clean up".
-     * @return the id string only.
-     */
-    private String cleanUpIdReference(String reference) {
-        // format is @id/foo or @+id/foo or @android:id/foo, or something similar.
-        int slash = reference.indexOf('/');
-        return reference.substring(slash);
-    }
-
-    /**
-     * Returns a list of nodes for which a given attribute contains a reference to a given ID.
-     *
-     * @param nodes the list of nodes to search through
-     * @param resId the requested ID
-     * @param attribute the name of the attribute to test.
-     * @return a newly allocated, non-null, list of nodes. Could be empty.
-     */
-    private ArrayList<Node> getMatchingNode(Set<Node> nodes, String resId,
-            String attribute) {
-        ArrayList<Node> list = new ArrayList<Node>();
-
-        for (Node node : nodes) {
-            String value = getAttribute(node, attribute, null);
-            if (value != null) {
-                value = cleanUpIdReference(value);
-                if (value.equals(resId)) {
-                    list.add(node);
-                }
-            }
-        }
-
-        return list;
-    }
-
-    /**
-     * Returns an attribute for a given node.
-     * @param node the node to query
-     * @param name the name of an attribute
-     * @param attributes the option {@link NamedNodeMap} object to use to read the attributes from.
-     */
-    private static String getAttribute(Node node, String name, NamedNodeMap attributes) {
-        if (attributes == null) {
-            attributes = node.getAttributes();
-        }
-
-        if (attributes != null) {
-            Node attribute = attributes.getNamedItemNS(SdkConstants.NS_RESOURCES, name);
-            if (attribute != null) {
-                return attribute.getNodeValue();
-            }
-        }
-
-        return null;
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/LayoutContentAssist.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/LayoutContentAssist.java
deleted file mode 100644
index 99549ab..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/LayoutContentAssist.java
+++ /dev/null
@@ -1,234 +0,0 @@
-/*
- * Copyright (C) 2007 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.editors.layout;
-
-import static com.android.SdkConstants.ANDROID_PKG_PREFIX;
-import static com.android.SdkConstants.ATTR_CLASS;
-import static com.android.SdkConstants.ATTR_CONTEXT;
-import static com.android.SdkConstants.ATTR_NAME;
-import static com.android.SdkConstants.CLASS_ACTIVITY;
-import static com.android.SdkConstants.CLASS_FRAGMENT;
-import static com.android.SdkConstants.CLASS_V4_FRAGMENT;
-import static com.android.SdkConstants.CLASS_VIEW;
-import static com.android.SdkConstants.VIEW_FRAGMENT;
-import static com.android.SdkConstants.VIEW_TAG;
-
-import com.android.annotations.Nullable;
-import com.android.annotations.VisibleForTesting;
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.ide.eclipse.adt.internal.editors.AndroidContentAssist;
-import com.android.ide.eclipse.adt.internal.editors.descriptors.ElementDescriptor;
-import com.android.ide.eclipse.adt.internal.editors.layout.descriptors.CustomViewDescriptorService;
-import com.android.ide.eclipse.adt.internal.editors.layout.descriptors.ViewElementDescriptor;
-import com.android.ide.eclipse.adt.internal.editors.layout.gle2.CustomViewFinder;
-import com.android.ide.eclipse.adt.internal.project.BaseProjectHelper;
-import com.android.ide.eclipse.adt.internal.sdk.AndroidTargetData;
-import com.google.common.collect.Lists;
-import com.google.common.collect.ObjectArrays;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.IType;
-import org.eclipse.jdt.core.ITypeHierarchy;
-import org.eclipse.jface.text.contentassist.ICompletionProposal;
-import org.w3c.dom.Node;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-/**
- * Content Assist Processor for /res/layout XML files
- */
-@VisibleForTesting
-public final class LayoutContentAssist extends AndroidContentAssist {
-
-    /**
-     * Constructor for LayoutContentAssist
-     */
-    public LayoutContentAssist() {
-        super(AndroidTargetData.DESCRIPTOR_LAYOUT);
-    }
-
-    @Override
-    protected Object[] getChoicesForElement(String parent, Node currentNode) {
-        Object[] choices = super.getChoicesForElement(parent, currentNode);
-        if (choices == null) {
-            if (currentNode.getParentNode().getNodeType() == Node.ELEMENT_NODE) {
-                String parentName = currentNode.getParentNode().getNodeName();
-                if (parentName.indexOf('.') != -1) {
-                    // Custom view with unknown children; just use the root descriptor
-                    // to get all eligible views instead
-                    ElementDescriptor[] children = getRootDescriptor().getChildren();
-                    for (ElementDescriptor e : children) {
-                        if (e.getXmlName().startsWith(parent)) {
-                            return sort(children);
-                        }
-                    }
-                }
-            }
-        }
-
-        if (choices == null && parent.length() >= 1 && Character.isLowerCase(parent.charAt(0))) {
-            // Custom view prefix?
-            List<ElementDescriptor> descriptors = getCustomViews();
-            if (descriptors != null && !descriptors.isEmpty()) {
-                List<ElementDescriptor> matches = Lists.newArrayList();
-                for (ElementDescriptor descriptor : descriptors) {
-                    if (descriptor.getXmlLocalName().startsWith(parent)) {
-                        matches.add(descriptor);
-                    }
-                }
-                if (!matches.isEmpty()) {
-                    return matches.toArray(new ElementDescriptor[matches.size()]);
-                }
-            }
-        }
-
-        return choices;
-    }
-
-    @Override
-    protected ElementDescriptor[] getElementChoicesForTextNode(Node parentNode) {
-        ElementDescriptor[] choices = super.getElementChoicesForTextNode(parentNode);
-
-        // Add in custom views, if any
-        List<ElementDescriptor> descriptors = getCustomViews();
-        if (descriptors != null && !descriptors.isEmpty()) {
-            ElementDescriptor[] array = descriptors.toArray(
-                    new ElementDescriptor[descriptors.size()]);
-            choices = ObjectArrays.concat(choices, array, ElementDescriptor.class);
-            choices = sort(choices);
-        }
-
-        return choices;
-    }
-
-    @Nullable
-    private List<ElementDescriptor> getCustomViews() {
-        // Add in custom views, if any
-        IProject project = mEditor.getProject();
-        CustomViewFinder finder = CustomViewFinder.get(project);
-        Collection<String> views = finder.getAllViews();
-        if (views == null) {
-            finder.refresh();
-            views = finder.getAllViews();
-        }
-        if (views != null && !views.isEmpty()) {
-            List<ElementDescriptor> descriptors = Lists.newArrayListWithExpectedSize(views.size());
-            CustomViewDescriptorService customViews = CustomViewDescriptorService.getInstance();
-            for (String fqcn : views) {
-                ViewElementDescriptor descriptor = customViews.getDescriptor(project, fqcn);
-                if (descriptor != null) {
-                    descriptors.add(descriptor);
-                }
-            }
-
-            return descriptors;
-        }
-
-        return null;
-    }
-
-    @Override
-    protected boolean computeAttributeValues(List<ICompletionProposal> proposals, int offset,
-            String parentTagName, String attributeName, Node node, String wordPrefix,
-            boolean skipEndTag, int replaceLength) {
-        super.computeAttributeValues(proposals, offset, parentTagName, attributeName, node,
-                wordPrefix, skipEndTag, replaceLength);
-
-        boolean projectOnly = false;
-        List<String> superClasses = null;
-        if (VIEW_FRAGMENT.equals(parentTagName) && (attributeName.endsWith(ATTR_NAME)
-                || attributeName.equals(ATTR_CLASS))) {
-            // Insert fragment class matches
-            superClasses = Arrays.asList(CLASS_V4_FRAGMENT, CLASS_FRAGMENT);
-        } else if (VIEW_TAG.equals(parentTagName) && attributeName.endsWith(ATTR_CLASS)) {
-            // Insert custom view matches
-            superClasses = Collections.singletonList(CLASS_VIEW);
-            projectOnly = true;
-        } else if (attributeName.endsWith(ATTR_CONTEXT)) {
-            // Insert activity matches
-            superClasses = Collections.singletonList(CLASS_ACTIVITY);
-        }
-
-        if (superClasses != null) {
-            IProject project = mEditor.getProject();
-            if (project == null) {
-                return false;
-            }
-            try {
-                IJavaProject javaProject = BaseProjectHelper.getJavaProject(project);
-                IType type = javaProject.findType(superClasses.get(0));
-                Set<IType> elements = new HashSet<IType>();
-                if (type != null) {
-                    ITypeHierarchy hierarchy = type.newTypeHierarchy(new NullProgressMonitor());
-                    IType[] allSubtypes = hierarchy.getAllSubtypes(type);
-                    for (IType subType : allSubtypes) {
-                        if (!projectOnly || subType.getResource() != null) {
-                            elements.add(subType);
-                        }
-                    }
-                }
-                assert superClasses.size() <= 2; // If more, need to do additional work below
-                if (superClasses.size() == 2) {
-                    type = javaProject.findType(superClasses.get(1));
-                    if (type != null) {
-                        ITypeHierarchy hierarchy = type.newTypeHierarchy(
-                                new NullProgressMonitor());
-                        IType[] allSubtypes = hierarchy.getAllSubtypes(type);
-                        for (IType subType : allSubtypes) {
-                            if (!projectOnly || subType.getResource() != null) {
-                                elements.add(subType);
-                            }
-                        }
-                    }
-                }
-
-                List<IType> sorted = new ArrayList<IType>(elements);
-                Collections.sort(sorted, new Comparator<IType>() {
-                    @Override
-                    public int compare(IType type1, IType type2) {
-                        String fqcn1 = type1.getFullyQualifiedName();
-                        String fqcn2 = type2.getFullyQualifiedName();
-                        int category1 = fqcn1.startsWith(ANDROID_PKG_PREFIX) ? 1 : -1;
-                        int category2 = fqcn2.startsWith(ANDROID_PKG_PREFIX) ? 1 : -1;
-                        if (category1 != category2) {
-                            return category1 - category2;
-                        }
-                        return fqcn1.compareTo(fqcn2);
-                    }
-                });
-                addMatchingProposals(proposals, sorted.toArray(), offset, node, wordPrefix,
-                        (char) 0, false /* isAttribute */, false /* isNew */,
-                        false /* skipEndTag */, replaceLength);
-                return true;
-            } catch (CoreException e) {
-                AdtPlugin.log(e, null);
-            }
-        }
-
-        return false;
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/LayoutEditorDelegate.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/LayoutEditorDelegate.java
deleted file mode 100644
index 1015d7d..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/LayoutEditorDelegate.java
+++ /dev/null
@@ -1,1001 +0,0 @@
-/*
- * Copyright (C) 2007 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.editors.layout;
-
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-import com.android.annotations.VisibleForTesting;
-import com.android.annotations.VisibleForTesting.Visibility;
-import com.android.ide.eclipse.adt.AdtConstants;
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.ide.eclipse.adt.internal.editors.AndroidXmlEditor;
-import com.android.ide.eclipse.adt.internal.editors.XmlEditorMultiOutline;
-import com.android.ide.eclipse.adt.internal.editors.common.CommonXmlDelegate;
-import com.android.ide.eclipse.adt.internal.editors.common.CommonXmlEditor;
-import com.android.ide.eclipse.adt.internal.editors.descriptors.DocumentDescriptor;
-import com.android.ide.eclipse.adt.internal.editors.descriptors.ElementDescriptor;
-import com.android.ide.eclipse.adt.internal.editors.descriptors.IUnknownDescriptorProvider;
-import com.android.ide.eclipse.adt.internal.editors.layout.descriptors.CustomViewDescriptorService;
-import com.android.ide.eclipse.adt.internal.editors.layout.descriptors.LayoutDescriptors;
-import com.android.ide.eclipse.adt.internal.editors.layout.descriptors.ViewElementDescriptor;
-import com.android.ide.eclipse.adt.internal.editors.layout.gle2.DomUtilities;
-import com.android.ide.eclipse.adt.internal.editors.layout.gle2.GraphicalEditorPart;
-import com.android.ide.eclipse.adt.internal.editors.layout.gle2.LayoutActionBar;
-import com.android.ide.eclipse.adt.internal.editors.layout.gle2.LayoutCanvas;
-import com.android.ide.eclipse.adt.internal.editors.layout.gle2.OutlinePage;
-import com.android.ide.eclipse.adt.internal.editors.layout.gle2.SelectionManager;
-import com.android.ide.eclipse.adt.internal.editors.layout.gre.RulesEngine;
-import com.android.ide.eclipse.adt.internal.editors.layout.properties.PropertySheetPage;
-import com.android.ide.eclipse.adt.internal.editors.layout.uimodel.UiViewElementNode;
-import com.android.ide.eclipse.adt.internal.editors.uimodel.UiDocumentNode;
-import com.android.ide.eclipse.adt.internal.lint.EclipseLintClient;
-import com.android.ide.eclipse.adt.internal.lint.EclipseLintRunner;
-import com.android.ide.eclipse.adt.internal.preferences.AdtPrefs;
-import com.android.ide.eclipse.adt.internal.sdk.AndroidTargetData;
-import com.android.ide.eclipse.adt.internal.sdk.Sdk;
-import com.android.resources.ResourceFolderType;
-import com.android.sdklib.IAndroidTarget;
-import com.android.tools.lint.client.api.IssueRegistry;
-
-import org.eclipse.core.resources.IContainer;
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.core.runtime.jobs.IJobChangeEvent;
-import org.eclipse.core.runtime.jobs.Job;
-import org.eclipse.core.runtime.jobs.JobChangeAdapter;
-import org.eclipse.jface.text.source.ISourceViewer;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.ui.IActionBars;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IFileEditorInput;
-import org.eclipse.ui.ISelectionListener;
-import org.eclipse.ui.ISelectionService;
-import org.eclipse.ui.IShowEditorInput;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.IWorkbenchPartSite;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.forms.editor.IFormPage;
-import org.eclipse.ui.part.FileEditorInput;
-import org.eclipse.ui.views.contentoutline.IContentOutlinePage;
-import org.eclipse.ui.views.properties.IPropertySheetPage;
-import org.eclipse.wst.sse.ui.StructuredTextEditor;
-import org.w3c.dom.Document;
-import org.w3c.dom.Node;
-
-import java.io.File;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-/**
- * Multi-page form editor for /res/layout XML files.
- */
-public class LayoutEditorDelegate extends CommonXmlDelegate
-         implements IShowEditorInput, CommonXmlDelegate.IActionContributorDelegate {
-
-    /** The prefix for layout folders that are not the default layout folder */
-    private static final String LAYOUT_FOLDER_PREFIX = "layout-"; //$NON-NLS-1$
-
-    public static class Creator implements IDelegateCreator {
-        @Override
-        @SuppressWarnings("unchecked")
-        public LayoutEditorDelegate createForFile(
-                @NonNull CommonXmlEditor delegator,
-                @Nullable ResourceFolderType type) {
-            if (ResourceFolderType.LAYOUT == type) {
-                return new LayoutEditorDelegate(delegator);
-            }
-
-            return null;
-        }
-    }
-
-    /**
-     * Old standalone-editor ID.
-     * Use {@link CommonXmlEditor#ID} instead.
-     */
-    public static final String LEGACY_EDITOR_ID =
-        AdtConstants.EDITORS_NAMESPACE + ".layout.LayoutEditor"; //$NON-NLS-1$
-
-    /** Root node of the UI element hierarchy */
-    private UiDocumentNode mUiDocRootNode;
-
-    private GraphicalEditorPart mGraphicalEditor;
-    private int mGraphicalEditorIndex;
-
-    /** Implementation of the {@link IContentOutlinePage} for this editor */
-    private OutlinePage mLayoutOutline;
-
-    /** The XML editor outline */
-    private IContentOutlinePage mEditorOutline;
-
-    /** Multiplexing outline, used for multi-page editors that have their own outline */
-    private XmlEditorMultiOutline mMultiOutline;
-
-    /**
-     * Temporary flag set by the editor caret listener which is used to cause
-     * the next getAdapter(IContentOutlinePage.class) call to return the editor
-     * outline rather than the multi-outline. See the {@link #delegateGetAdapter}
-     * method for details.
-     */
-    private boolean mCheckOutlineAdapter;
-
-    /** Custom implementation of {@link IPropertySheetPage} for this editor */
-    private IPropertySheetPage mPropertyPage;
-
-    private final HashMap<String, ElementDescriptor> mUnknownDescriptorMap =
-        new HashMap<String, ElementDescriptor>();
-
-    private EclipseLintClient mClient;
-
-    /**
-     * Flag indicating if the replacement file is due to a config change.
-     * If false, it means the new file is due to an "open action" from the user.
-     */
-    private boolean mNewFileOnConfigChange = false;
-
-    /**
-     * Checks whether an editor part is an instance of {@link CommonXmlEditor}
-     * with an associated {@link LayoutEditorDelegate} delegate.
-     *
-     * @param editorPart An editor part. Can be null.
-     * @return The {@link LayoutEditorDelegate} delegate associated with the editor or null.
-     */
-    public static @Nullable LayoutEditorDelegate fromEditor(@Nullable IEditorPart editorPart) {
-        if (editorPart instanceof CommonXmlEditor) {
-            CommonXmlDelegate delegate = ((CommonXmlEditor) editorPart).getDelegate();
-            if (delegate instanceof LayoutEditorDelegate) {
-                return ((LayoutEditorDelegate) delegate);
-            }
-        } else if (editorPart instanceof GraphicalEditorPart) {
-            GraphicalEditorPart part = (GraphicalEditorPart) editorPart;
-            return part.getEditorDelegate();
-        }
-        return null;
-    }
-
-    /**
-     * Creates the form editor for resources XML files.
-     */
-    @VisibleForTesting(visibility=Visibility.PRIVATE)
-    protected LayoutEditorDelegate(CommonXmlEditor editor) {
-        super(editor, new LayoutContentAssist());
-        // Note that LayoutEditor has its own listeners and does not
-        // need to call editor.addDefaultTargetListener().
-    }
-
-    /**
-     * Returns the {@link RulesEngine} associated with this editor
-     *
-     * @return the {@link RulesEngine} associated with this editor.
-     */
-    public RulesEngine getRulesEngine() {
-        return mGraphicalEditor.getRulesEngine();
-    }
-
-    /**
-     * Returns the {@link GraphicalEditorPart} associated with this editor
-     *
-     * @return the {@link GraphicalEditorPart} associated with this editor
-     */
-    public GraphicalEditorPart getGraphicalEditor() {
-        return mGraphicalEditor;
-    }
-
-    /**
-     * @return The root node of the UI element hierarchy
-     */
-    @Override
-    public UiDocumentNode getUiRootNode() {
-        return mUiDocRootNode;
-    }
-
-    public void setNewFileOnConfigChange(boolean state) {
-        mNewFileOnConfigChange = state;
-    }
-
-    // ---- Base Class Overrides ----
-
-    @Override
-    public void dispose() {
-        super.dispose();
-        if (mGraphicalEditor != null) {
-            mGraphicalEditor.dispose();
-            mGraphicalEditor = null;
-        }
-    }
-
-    /**
-     * Save the XML.
-     * <p/>
-     * Clients must NOT call this directly. Instead they should always
-     * call {@link CommonXmlEditor#doSave(IProgressMonitor)} so that th
-     * editor super class can commit the data properly.
-     * <p/>
-     * Here we just need to tell the graphical editor that the model has
-     * been saved.
-     */
-    @Override
-    public void delegateDoSave(IProgressMonitor monitor) {
-        super.delegateDoSave(monitor);
-        if (mGraphicalEditor != null) {
-            mGraphicalEditor.doSave(monitor);
-        }
-    }
-
-    /**
-     * Create the various form pages.
-     */
-    @Override
-    public void delegateCreateFormPages() {
-        try {
-            // get the file being edited so that it can be passed to the layout editor.
-            IFile editedFile = null;
-            IEditorInput input = getEditor().getEditorInput();
-            if (input instanceof FileEditorInput) {
-                FileEditorInput fileInput = (FileEditorInput)input;
-                editedFile = fileInput.getFile();
-                if (!editedFile.isAccessible()) {
-                    return;
-                }
-            } else {
-                AdtPlugin.log(IStatus.ERROR,
-                        "Input is not of type FileEditorInput: %1$s",  //$NON-NLS-1$
-                        input.toString());
-            }
-
-            // It is possible that the Layout Editor already exits if a different version
-            // of the same layout is being opened (either through "open" action from
-            // the user, or through a configuration change in the configuration selector.)
-            if (mGraphicalEditor == null) {
-
-                // Instantiate GLE v2
-                mGraphicalEditor = new GraphicalEditorPart(this);
-
-                mGraphicalEditorIndex = getEditor().addPage(mGraphicalEditor,
-                                                            getEditor().getEditorInput());
-                getEditor().setPageText(mGraphicalEditorIndex, mGraphicalEditor.getTitle());
-
-                mGraphicalEditor.openFile(editedFile);
-            } else {
-                if (mNewFileOnConfigChange) {
-                    mGraphicalEditor.changeFileOnNewConfig(editedFile);
-                    mNewFileOnConfigChange = false;
-                } else {
-                    mGraphicalEditor.replaceFile(editedFile);
-                }
-            }
-        } catch (PartInitException e) {
-            AdtPlugin.log(e, "Error creating nested page"); //$NON-NLS-1$
-        }
-    }
-
-    @Override
-    public void delegatePostCreatePages() {
-        // Optional: set the default page. Eventually a default page might be
-        // restored by selectDefaultPage() later based on the last page used by the user.
-        // For example, to make the last page the default one (rather than the first page),
-        // uncomment this line:
-        //   setActivePage(getPageCount() - 1);
-    }
-
-    /* (non-java doc)
-     * Change the tab/title name to include the name of the layout.
-     */
-    @Override
-    public void delegateSetInput(IEditorInput input) {
-        handleNewInput(input);
-    }
-
-    /*
-     * (non-Javadoc)
-     * @see org.eclipse.ui.part.EditorPart#setInputWithNotify(org.eclipse.ui.IEditorInput)
-     */
-    public void delegateSetInputWithNotify(IEditorInput input) {
-        handleNewInput(input);
-    }
-
-    /**
-     * Called to replace the current {@link IEditorInput} with another one.
-     * <p/>
-     * This is used when {@link LayoutEditorMatchingStrategy} returned
-     * <code>true</code> which means we're opening a different configuration of
-     * the same layout.
-     */
-    @Override
-    public void showEditorInput(IEditorInput editorInput) {
-        if (getEditor().getEditorInput().equals(editorInput)) {
-            return;
-        }
-
-        // Save the current editor input. This must be called on the editor itself
-        // since it's the base editor that commits pending changes.
-        getEditor().doSave(new NullProgressMonitor());
-
-        // Get the current page
-        int currentPage = getEditor().getActivePage();
-
-        // Remove the pages, except for the graphical editor, which will be dynamically adapted
-        // to the new model.
-        // page after the graphical editor:
-        int count = getEditor().getPageCount();
-        for (int i = count - 1 ; i > mGraphicalEditorIndex ; i--) {
-            getEditor().removePage(i);
-        }
-        // Pages before the graphical editor
-        for (int i = mGraphicalEditorIndex - 1 ; i >= 0 ; i--) {
-            getEditor().removePage(i);
-        }
-
-        // Set the current input. We're in the delegate, the input must
-        // be set into the actual editor instance.
-        getEditor().setInputWithNotify(editorInput);
-
-        // Re-create or reload the pages with the default page shown as the previous active page.
-        getEditor().createAndroidPages();
-        getEditor().selectDefaultPage(Integer.toString(currentPage));
-
-        // When changing an input file of an the editor, the titlebar is not refreshed to
-        // show the new path/to/file being edited. So we force a refresh
-        getEditor().firePropertyChange(IWorkbenchPart.PROP_TITLE);
-    }
-
-    /** Performs a complete refresh of the XML model */
-    public void refreshXmlModel() {
-        Document xmlDoc = mUiDocRootNode.getXmlDocument();
-
-        delegateInitUiRootNode(true /*force*/);
-        mUiDocRootNode.loadFromXmlNode(xmlDoc);
-
-        // Update the model first, since it is used by the viewers.
-        // No need to call AndroidXmlEditor.xmlModelChanged(xmlDoc) since it's
-        // a no-op. Instead call onXmlModelChanged on the graphical editor.
-
-        if (mGraphicalEditor != null) {
-            mGraphicalEditor.onXmlModelChanged();
-        }
-    }
-
-    /**
-     * Processes the new XML Model, which XML root node is given.
-     *
-     * @param xml_doc The XML document, if available, or null if none exists.
-     */
-    @Override
-    public void delegateXmlModelChanged(Document xml_doc) {
-        // init the ui root on demand
-        delegateInitUiRootNode(false /*force*/);
-
-        mUiDocRootNode.loadFromXmlNode(xml_doc);
-
-        // Update the model first, since it is used by the viewers.
-        // No need to call AndroidXmlEditor.xmlModelChanged(xmlDoc) since it's
-        // a no-op. Instead call onXmlModelChanged on the graphical editor.
-
-        if (mGraphicalEditor != null) {
-            mGraphicalEditor.onXmlModelChanged();
-        }
-    }
-
-    /**
-     * Tells the graphical editor to recompute its layout.
-     */
-    public void recomputeLayout() {
-        mGraphicalEditor.recomputeLayout();
-    }
-
-    /**
-     * Does this editor participate in the "format GUI editor changes" option?
-     *
-     * @return true since this editor supports automatically formatting XML
-     *         affected by GUI changes
-     */
-    @Override
-    public boolean delegateSupportsFormatOnGuiEdit() {
-        return true;
-    }
-
-    /**
-     * Returns one of the issues for the given node (there could be more than one)
-     *
-     * @param node the node to look up lint issues for
-     * @return the marker for one of the issues found for the given node
-     */
-    @Nullable
-    public IMarker getIssueForNode(@Nullable UiViewElementNode node) {
-        if (node == null) {
-            return null;
-        }
-
-        if (mClient != null) {
-            return mClient.getIssueForNode(node);
-        }
-
-        return null;
-    }
-
-    /**
-     * Returns a collection of nodes that have one or more lint warnings
-     * associated with them (retrievable via
-     * {@link #getIssueForNode(UiViewElementNode)})
-     *
-     * @return a collection of nodes, which should <b>not</b> be modified by the
-     *         caller
-     */
-    @Nullable
-    public Collection<Node> getLintNodes() {
-        if (mClient != null) {
-            return mClient.getIssueNodes();
-        }
-
-        return null;
-    }
-
-    @Override
-    public Job delegateRunLint() {
-        // We want to customize the {@link EclipseLintClient} created to run this
-        // single file lint, in particular such that we can set the mode which collects
-        // nodes on that lint job, such that we can quickly look up error nodes
-        //Job job = super.delegateRunLint();
-
-        Job job = null;
-        IFile file = getEditor().getInputFile();
-        if (file != null) {
-            IssueRegistry registry = EclipseLintClient.getRegistry();
-            List<IFile> resources = Collections.singletonList(file);
-            mClient = new EclipseLintClient(registry,
-                    resources, getEditor().getStructuredDocument(), false /*fatal*/);
-
-            mClient.setCollectNodes(true);
-
-            job = EclipseLintRunner.startLint(mClient, resources, file,
-                    false /*show*/);
-        }
-
-        if (job != null) {
-            GraphicalEditorPart graphicalEditor = getGraphicalEditor();
-            if (graphicalEditor != null) {
-                job.addJobChangeListener(new LintJobListener(graphicalEditor));
-            }
-        }
-        return job;
-    }
-
-    private class LintJobListener extends JobChangeAdapter implements Runnable {
-        private final GraphicalEditorPart mEditor;
-        private final LayoutCanvas mCanvas;
-
-        LintJobListener(GraphicalEditorPart editor) {
-            mEditor = editor;
-            mCanvas = editor.getCanvasControl();
-        }
-
-        @Override
-        public void done(IJobChangeEvent event) {
-            LayoutActionBar bar = mEditor.getLayoutActionBar();
-            if (!bar.isDisposed()) {
-                bar.updateErrorIndicator();
-            }
-
-            // Redraw
-            if (!mCanvas.isDisposed()) {
-                mCanvas.getDisplay().asyncExec(this);
-            }
-        }
-
-        @Override
-        public void run() {
-            if (!mCanvas.isDisposed()) {
-                mCanvas.redraw();
-
-                OutlinePage outlinePage = mCanvas.getOutlinePage();
-                if (outlinePage != null) {
-                    outlinePage.refreshIcons();
-                }
-            }
-        }
-    }
-
-    /**
-     * Returns the custom IContentOutlinePage or IPropertySheetPage when asked for it.
-     */
-    @Override
-    public Object delegateGetAdapter(Class<?> adapter) {
-        if (adapter == IContentOutlinePage.class) {
-            // Somebody has requested the outline. Eclipse can only have a single outline page,
-            // even for a multi-part editor:
-            //       https://bugs.eclipse.org/bugs/show_bug.cgi?id=1917
-            // To work around this we use PDE's workaround of having a single multiplexing
-            // outline which switches its contents between the outline pages we register
-            // for it, and then on page switch we notify it to update itself.
-
-            // There is one complication: The XML editor outline listens for the editor
-            // selection and uses this to automatically expand its tree children and show
-            // the current node containing the caret as selected. Unfortunately, this
-            // listener code contains this:
-            //
-            //     /* Bug 136310, unless this page is that part's
-            //      * IContentOutlinePage, ignore the selection change */
-            //     if (part.getAdapter(IContentOutlinePage.class) == this) {
-            //
-            // This means that when we return the multiplexing outline from this getAdapter
-            // method, the outline no longer updates to track the selection.
-            // To work around this, we use the following hack^H^H^H^H technique:
-            // - Add a selection listener *before* requesting the editor outline, such
-            //   that the selection listener is told about the impending selection event
-            //   right before the editor outline hears about it. Set the flag
-            //   mCheckOutlineAdapter to true. (We also only set it if the editor view
-            //   itself is active.)
-            // - In this getAdapter method, when somebody requests the IContentOutline.class,
-            //   see if mCheckOutlineAdapter to see if this request is *likely* coming
-            //   from the XML editor outline. If so, make sure it is by actually looking
-            //   at the signature of the caller. If it's the editor outline, then return
-            //   the editor outline instance itself rather than the multiplexing outline.
-            if (mCheckOutlineAdapter && mEditorOutline != null) {
-                mCheckOutlineAdapter = false;
-                // Make *sure* this is really the editor outline calling in case
-                // future versions of Eclipse changes the sequencing or dispatch of selection
-                // events:
-                StackTraceElement[] frames = new Throwable().fillInStackTrace().getStackTrace();
-                if (frames.length > 2) {
-                    StackTraceElement frame = frames[2];
-                    if (frame.getClassName().equals(
-                            "org.eclipse.wst.sse.ui.internal.contentoutline." + //$NON-NLS-1$
-                            "ConfigurableContentOutlinePage$PostSelectionServiceListener")) { //$NON-NLS-1$
-                        return mEditorOutline;
-                    }
-                }
-            }
-
-            // Use a multiplexing outline: workaround for
-            // https://bugs.eclipse.org/bugs/show_bug.cgi?id=1917
-            if (mMultiOutline == null || mMultiOutline.isDisposed()) {
-                mMultiOutline = new XmlEditorMultiOutline();
-                mMultiOutline.addSelectionChangedListener(new ISelectionChangedListener() {
-                    @Override
-                    public void selectionChanged(SelectionChangedEvent event) {
-                        ISelection selection = event.getSelection();
-                        getEditor().getSite().getSelectionProvider().setSelection(selection);
-                        if (getEditor().getIgnoreXmlUpdate()) {
-                            return;
-                        }
-                        SelectionManager manager =
-                                mGraphicalEditor.getCanvasControl().getSelectionManager();
-                        manager.setSelection(selection);
-                    }
-                });
-                updateOutline(getEditor().getActivePageInstance());
-            }
-
-            return mMultiOutline;
-        }
-
-        if (IPropertySheetPage.class == adapter && mGraphicalEditor != null) {
-            if (mPropertyPage == null) {
-                mPropertyPage = new PropertySheetPage(mGraphicalEditor);
-            }
-
-            return mPropertyPage;
-        }
-
-        // return default
-        return super.delegateGetAdapter(adapter);
-    }
-
-    /**
-     * Update the contents of the outline to show either the XML editor outline
-     * or the layout editor graphical outline depending on which tab is visible
-     */
-    private void updateOutline(IFormPage page) {
-        if (mMultiOutline == null) {
-            return;
-        }
-
-        IContentOutlinePage outline;
-        CommonXmlEditor editor = getEditor();
-        if (!editor.isEditorPageActive()) {
-            outline = getGraphicalOutline();
-        } else {
-            // Use plain XML editor outline instead
-            if (mEditorOutline == null) {
-                StructuredTextEditor structuredTextEditor = editor.getStructuredTextEditor();
-                if (structuredTextEditor != null) {
-                    IWorkbenchWindow window = editor.getSite().getWorkbenchWindow();
-                    ISelectionService service = window.getSelectionService();
-                    service.addPostSelectionListener(new ISelectionListener() {
-                        @Override
-                        public void selectionChanged(IWorkbenchPart part, ISelection selection) {
-                            if (getEditor().isEditorPageActive()) {
-                                mCheckOutlineAdapter = true;
-                            }
-                        }
-                    });
-
-                    mEditorOutline = (IContentOutlinePage) structuredTextEditor.getAdapter(
-                            IContentOutlinePage.class);
-                }
-            }
-
-            outline = mEditorOutline;
-        }
-
-        mMultiOutline.setPageActive(outline);
-    }
-
-    /**
-     * Returns the graphical outline associated with the layout editor
-     *
-     * @return the outline page, never null
-     */
-    @NonNull
-    public OutlinePage getGraphicalOutline() {
-        if (mLayoutOutline == null) {
-            mLayoutOutline = new OutlinePage(mGraphicalEditor);
-        }
-
-        return mLayoutOutline;
-    }
-
-    @Override
-    public void delegatePageChange(int newPageIndex) {
-        if (getEditor().getCurrentPage() == getEditor().getTextPageIndex() &&
-                newPageIndex == mGraphicalEditorIndex) {
-            // You're switching from the XML editor to the WYSIWYG editor;
-            // look at the caret position and figure out which node it corresponds to
-            // (if any) and if found, select the corresponding visual element.
-            ISourceViewer textViewer = getEditor().getStructuredSourceViewer();
-            int caretOffset = textViewer.getTextWidget().getCaretOffset();
-            if (caretOffset >= 0) {
-                Node node = DomUtilities.getNode(textViewer.getDocument(), caretOffset);
-                if (node != null && mGraphicalEditor != null) {
-                    mGraphicalEditor.select(node);
-                }
-            }
-        }
-
-        super.delegatePageChange(newPageIndex);
-
-        if (mGraphicalEditor != null) {
-            if (newPageIndex == mGraphicalEditorIndex) {
-                mGraphicalEditor.activated();
-            } else {
-                mGraphicalEditor.deactivated();
-            }
-        }
-    }
-
-    @Override
-    public int delegateGetPersistenceCategory() {
-        return AndroidXmlEditor.CATEGORY_LAYOUT;
-    }
-
-    @Override
-    public void delegatePostPageChange(int newPageIndex) {
-        super.delegatePostPageChange(newPageIndex);
-
-        if (mGraphicalEditor != null) {
-            LayoutCanvas canvas = mGraphicalEditor.getCanvasControl();
-            if (canvas != null) {
-                IActionBars bars = getEditor().getEditorSite().getActionBars();
-                if (bars != null) {
-                    canvas.updateGlobalActions(bars);
-                }
-            }
-        }
-
-        IFormPage page = getEditor().getActivePageInstance();
-        updateOutline(page);
-    }
-
-    @Override
-    public IFormPage delegatePostSetActivePage(IFormPage superReturned, String pageIndex) {
-        IFormPage page = superReturned;
-        if (page != null) {
-            updateOutline(page);
-        }
-
-        return page;
-    }
-
-    // ----- IActionContributorDelegate methods ----
-
-    @Override
-    public void setActiveEditor(IEditorPart part, IActionBars bars) {
-        if (mGraphicalEditor != null) {
-            LayoutCanvas canvas = mGraphicalEditor.getCanvasControl();
-            if (canvas != null) {
-                canvas.updateGlobalActions(bars);
-            }
-        }
-    }
-
-
-    @Override
-    public void delegateActivated() {
-        if (mGraphicalEditor != null) {
-            if (getEditor().getActivePage() == mGraphicalEditorIndex) {
-                mGraphicalEditor.activated();
-            } else {
-                mGraphicalEditor.deactivated();
-            }
-        }
-    }
-
-    @Override
-    public void delegateDeactivated() {
-        if (mGraphicalEditor != null && getEditor().getActivePage() == mGraphicalEditorIndex) {
-            mGraphicalEditor.deactivated();
-        }
-    }
-
-    @Override
-    public String delegateGetPartName() {
-        IEditorInput editorInput = getEditor().getEditorInput();
-        if (!AdtPrefs.getPrefs().isSharedLayoutEditor()
-              && editorInput instanceof IFileEditorInput) {
-            IFileEditorInput fileInput = (IFileEditorInput) editorInput;
-            IFile file = fileInput.getFile();
-            IContainer parent = file.getParent();
-            if (parent != null) {
-                String parentName = parent.getName();
-                if  (parentName.startsWith(LAYOUT_FOLDER_PREFIX)) {
-                    parentName = parentName.substring(LAYOUT_FOLDER_PREFIX.length());
-                    return parentName + File.separatorChar + file.getName();
-                }
-            }
-        }
-
-        return super.delegateGetPartName();
-    }
-
-    // ---- Local Methods ----
-
-    /**
-     * Returns true if the Graphics editor page is visible. This <b>must</b> be
-     * called from the UI thread.
-     */
-    public boolean isGraphicalEditorActive() {
-        IWorkbenchPartSite workbenchSite = getEditor().getSite();
-        IWorkbenchPage workbenchPage = workbenchSite.getPage();
-
-        // check if the editor is visible in the workbench page
-        if (workbenchPage.isPartVisible(getEditor())
-                && workbenchPage.getActiveEditor() == getEditor()) {
-            // and then if the page of the editor is visible (not to be confused with
-            // the workbench page)
-            return mGraphicalEditorIndex == getEditor().getActivePage();
-        }
-
-        return false;
-    }
-
-    @Override
-    public void delegateInitUiRootNode(boolean force) {
-        // The root UI node is always created, even if there's no corresponding XML node.
-        if (mUiDocRootNode == null || force) {
-            // get the target data from the opened file (and its project)
-            AndroidTargetData data = getEditor().getTargetData();
-
-            Document doc = null;
-            if (mUiDocRootNode != null) {
-                doc = mUiDocRootNode.getXmlDocument();
-            }
-
-            DocumentDescriptor desc;
-            if (data == null) {
-                desc = new DocumentDescriptor("temp", null /*children*/);
-            } else {
-                desc = data.getLayoutDescriptors().getDescriptor();
-            }
-
-            // get the descriptors from the data.
-            mUiDocRootNode = (UiDocumentNode) desc.createUiNode();
-            super.setUiRootNode(mUiDocRootNode);
-            mUiDocRootNode.setEditor(getEditor());
-
-            mUiDocRootNode.setUnknownDescriptorProvider(new IUnknownDescriptorProvider() {
-                @Override
-                public ElementDescriptor getDescriptor(String xmlLocalName) {
-                    ElementDescriptor unknown = mUnknownDescriptorMap.get(xmlLocalName);
-                    if (unknown == null) {
-                        unknown = createUnknownDescriptor(xmlLocalName);
-                        mUnknownDescriptorMap.put(xmlLocalName, unknown);
-                    }
-
-                    return unknown;
-                }
-            });
-
-            onDescriptorsChanged(doc);
-        }
-    }
-
-    /**
-     * Creates a new {@link ViewElementDescriptor} for an unknown XML local name
-     * (i.e. one that was not mapped by the current descriptors).
-     * <p/>
-     * Since we deal with layouts, we returns either a descriptor for a custom view
-     * or one for the base View.
-     *
-     * @param xmlLocalName The XML local name to match.
-     * @return A non-null {@link ViewElementDescriptor}.
-     */
-    private ViewElementDescriptor createUnknownDescriptor(String xmlLocalName) {
-        ViewElementDescriptor desc = null;
-        IEditorInput editorInput = getEditor().getEditorInput();
-        if (editorInput instanceof IFileEditorInput) {
-            IFileEditorInput fileInput = (IFileEditorInput)editorInput;
-            IProject project = fileInput.getFile().getProject();
-
-            // Check if we can find a custom view specific to this project.
-            // This only works if there's an actual matching custom class in the project.
-            if (xmlLocalName.indexOf('.') != -1) {
-                desc = CustomViewDescriptorService.getInstance().getDescriptor(project,
-                        xmlLocalName);
-            }
-
-            if (desc == null) {
-                // If we didn't find a custom view, create a synthetic one using the
-                // the base View descriptor as a model.
-                // This is a layout after all, so every XML node should represent
-                // a view.
-
-                Sdk currentSdk = Sdk.getCurrent();
-                if (currentSdk != null) {
-                    IAndroidTarget target = currentSdk.getTarget(project);
-                    if (target != null) {
-                        AndroidTargetData data = currentSdk.getTargetData(target);
-                        if (data != null) {
-                            // data can be null when the target is still loading
-                            ViewElementDescriptor viewDesc =
-                                data.getLayoutDescriptors().getBaseViewDescriptor();
-
-                            desc = new ViewElementDescriptor(
-                                    xmlLocalName, // xml local name
-                                    xmlLocalName, // ui_name
-                                    xmlLocalName, // canonical class name
-                                    null, // tooltip
-                                    null, // sdk_url
-                                    viewDesc.getAttributes(),
-                                    viewDesc.getLayoutAttributes(),
-                                    null, // children
-                                    false /* mandatory */);
-                            desc.setSuperClass(viewDesc);
-                        }
-                    }
-                }
-            }
-        }
-
-        if (desc == null) {
-            // We can only arrive here if the SDK's android target has not finished
-            // loading. Just create a dummy descriptor with no attributes to be able
-            // to continue.
-            desc = new ViewElementDescriptor(xmlLocalName, xmlLocalName);
-        }
-        return desc;
-    }
-
-    private void onDescriptorsChanged(Document document) {
-
-        mUnknownDescriptorMap.clear();
-
-        if (document != null) {
-            mUiDocRootNode.loadFromXmlNode(document);
-        } else {
-            mUiDocRootNode.reloadFromXmlNode(mUiDocRootNode.getXmlDocument());
-        }
-
-        if (mGraphicalEditor != null) {
-            mGraphicalEditor.onTargetChange();
-            mGraphicalEditor.reloadPalette();
-            mGraphicalEditor.getCanvasControl().syncPreviewMode();
-        }
-    }
-
-    /**
-     * Handles a new input, and update the part name.
-     * @param input the new input.
-     */
-    private void handleNewInput(IEditorInput input) {
-        if (input instanceof FileEditorInput) {
-            FileEditorInput fileInput = (FileEditorInput) input;
-            IFile file = fileInput.getFile();
-            getEditor().setPartName(String.format("%1$s", file.getName()));
-        }
-    }
-
-    /**
-     * Helper method that returns a {@link ViewElementDescriptor} for the requested FQCN.
-     * Will return null if we can't find that FQCN or we lack the editor/data/descriptors info.
-     */
-    public ViewElementDescriptor getFqcnViewDescriptor(String fqcn) {
-        ViewElementDescriptor desc = null;
-
-        AndroidTargetData data = getEditor().getTargetData();
-        if (data != null) {
-            LayoutDescriptors layoutDesc = data.getLayoutDescriptors();
-            if (layoutDesc != null) {
-                DocumentDescriptor docDesc = layoutDesc.getDescriptor();
-                if (docDesc != null) {
-                    desc = internalFindFqcnViewDescriptor(fqcn, docDesc.getChildren(), null);
-                }
-            }
-        }
-
-        if (desc == null) {
-            // We failed to find a descriptor for the given FQCN.
-            // Let's consider custom classes and create one as needed.
-            desc = createUnknownDescriptor(fqcn);
-        }
-
-        return desc;
-    }
-
-    /**
-     * Internal helper to recursively search for a {@link ViewElementDescriptor} that matches
-     * the requested FQCN.
-     *
-     * @param fqcn The target View FQCN to find.
-     * @param descriptors A list of children descriptors to iterate through.
-     * @param visited A set we use to remember which descriptors have already been visited,
-     *  necessary since the view descriptor hierarchy is cyclic.
-     * @return Either a matching {@link ViewElementDescriptor} or null.
-     */
-    private ViewElementDescriptor internalFindFqcnViewDescriptor(String fqcn,
-            ElementDescriptor[] descriptors,
-            Set<ElementDescriptor> visited) {
-        if (visited == null) {
-            visited = new HashSet<ElementDescriptor>();
-        }
-
-        if (descriptors != null) {
-            for (ElementDescriptor desc : descriptors) {
-                if (visited.add(desc)) {
-                    // Set.add() returns true if this a new element that was added to the set.
-                    // That means we haven't visited this descriptor yet.
-                    // We want a ViewElementDescriptor with a matching FQCN.
-                    if (desc instanceof ViewElementDescriptor &&
-                            fqcn.equals(((ViewElementDescriptor) desc).getFullClassName())) {
-                        return (ViewElementDescriptor) desc;
-                    }
-
-                    // Visit its children
-                    ViewElementDescriptor vd =
-                        internalFindFqcnViewDescriptor(fqcn, desc.getChildren(), visited);
-                    if (vd != null) {
-                        return vd;
-                    }
-                }
-            }
-        }
-
-        return null;
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/LayoutEditorMatchingStrategy.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/LayoutEditorMatchingStrategy.java
deleted file mode 100644
index c1c6068..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/LayoutEditorMatchingStrategy.java
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
- * 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.editors.layout;
-
-import com.android.ide.common.resources.ResourceFolder;
-import com.android.ide.eclipse.adt.internal.editors.common.CommonXmlEditor;
-import com.android.ide.eclipse.adt.internal.resources.manager.ResourceManager;
-import com.android.resources.ResourceFolderType;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorMatchingStrategy;
-import org.eclipse.ui.IEditorReference;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.part.FileEditorInput;
-
-/**
- * Matching strategy for the Layout Editor. This is used to open all configurations of a layout
- * in the same editor.
- */
-public class LayoutEditorMatchingStrategy implements IEditorMatchingStrategy {
-
-    @Override
-    public boolean matches(IEditorReference editorRef, IEditorInput input) {
-        // first check that the file being opened is a layout file.
-        if (input instanceof FileEditorInput) {
-            FileEditorInput fileInput = (FileEditorInput)input;
-
-            // get the IFile object and check it's in one of the layout folders.
-            IFile file = fileInput.getFile();
-            ResourceManager manager = ResourceManager.getInstance();
-            ResourceFolder resFolder = manager.getResourceFolder(file);
-
-            // Per the IEditorMatchingStrategy documentation, editorRef.getEditorInput()
-            // is expensive so try exclude files that definitely don't match, such
-            // as those with the wrong extension or wrong file name
-            if (!file.getName().equals(editorRef.getName()) ||
-                    !editorRef.getId().equals(CommonXmlEditor.ID)) {
-                return false;
-            }
-
-            // if it's a layout, we now check the name of the fileInput against the name of the
-            // file being currently edited by the editor since those are independent of the config.
-            if (resFolder != null && resFolder.getType() == ResourceFolderType.LAYOUT) {
-                try {
-                    IEditorInput editorInput = editorRef.getEditorInput();
-                    if (editorInput instanceof FileEditorInput) {
-                        FileEditorInput editorFileInput = (FileEditorInput)editorInput;
-                        IFile editorFile = editorFileInput.getFile();
-
-                        ResourceFolder editorFolder = manager.getResourceFolder(editorFile);
-                        if (editorFolder == null
-                                || editorFolder.getType() != ResourceFolderType.LAYOUT) {
-                            return false;
-                        }
-
-                        return editorFile.getProject().equals(file.getProject())
-                            && editorFile.getName().equals(file.getName());
-                    }
-                } catch (PartInitException e) {
-                    // we do nothing, we'll just return false.
-                }
-            }
-        }
-        return false;
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/LayoutReloadMonitor.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/LayoutReloadMonitor.java
deleted file mode 100644
index 4e4429d..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/LayoutReloadMonitor.java
+++ /dev/null
@@ -1,375 +0,0 @@
-/*
- * 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.editors.layout;
-
-import com.android.SdkConstants;
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-import com.android.ide.common.resources.ResourceFile;
-import com.android.ide.common.resources.ResourceFolder;
-import com.android.ide.eclipse.adt.AdtConstants;
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.ide.eclipse.adt.internal.resources.manager.GlobalProjectMonitor;
-import com.android.ide.eclipse.adt.internal.resources.manager.GlobalProjectMonitor.IFileListener;
-import com.android.ide.eclipse.adt.internal.resources.manager.GlobalProjectMonitor.IResourceEventListener;
-import com.android.ide.eclipse.adt.internal.resources.manager.ResourceManager;
-import com.android.ide.eclipse.adt.internal.resources.manager.ResourceManager.IResourceListener;
-import com.android.ide.eclipse.adt.internal.sdk.ProjectState;
-import com.android.ide.eclipse.adt.internal.sdk.Sdk;
-import com.android.resources.ResourceType;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IMarkerDelta;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResourceDelta;
-import org.eclipse.core.runtime.CoreException;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Map.Entry;
-import java.util.Set;
-
-/**
- * Monitor for file changes that could trigger a layout redraw, or a UI update
- */
-public final class LayoutReloadMonitor {
-
-    // singleton, enforced by private constructor.
-    private final static LayoutReloadMonitor sThis = new LayoutReloadMonitor();
-
-    /**
-     * Map of listeners by IProject.
-     */
-    private final Map<IProject, List<ILayoutReloadListener>> mListenerMap =
-        new HashMap<IProject, List<ILayoutReloadListener>>();
-
-    public final static class ChangeFlags {
-        public boolean code = false;
-        /** any non-layout resource changes */
-        public boolean resources = false;
-        public boolean rClass = false;
-        public boolean localeList = false;
-        public boolean manifest = false;
-
-        boolean isAllTrue() {
-            return code && resources && rClass && localeList && manifest;
-        }
-    }
-
-    /**
-     * List of projects having received a resource change.
-     */
-    private final Map<IProject, ChangeFlags> mProjectFlags = new HashMap<IProject, ChangeFlags>();
-
-    /**
-     * Classes which implement this interface provide a method to respond to resource changes
-     * triggering a layout redraw
-     */
-    public interface ILayoutReloadListener {
-        /**
-         * Sent when the layout needs to be redrawn
-         *
-         * @param flags a {@link ChangeFlags} object indicating what type of resource changed.
-         * @param libraryModified <code>true</code> if the changeFlags are not for the project
-         * associated with the listener, but instead correspond to a library.
-         */
-        void reloadLayout(ChangeFlags flags, boolean libraryModified);
-    }
-
-    /**
-     * Returns the single instance of {@link LayoutReloadMonitor}.
-     */
-    public static LayoutReloadMonitor getMonitor() {
-        return sThis;
-    }
-
-    private LayoutReloadMonitor() {
-        // listen to resource changes. Used for non-layout resource (trigger a redraw), or
-        // any resource folder (trigger a locale list refresh)
-        ResourceManager.getInstance().addListener(mResourceListener);
-
-        // also listen for .class file changed in case the layout has custom view classes.
-        GlobalProjectMonitor monitor = GlobalProjectMonitor.getMonitor();
-        monitor.addFileListener(mFileListener,
-                IResourceDelta.ADDED | IResourceDelta.CHANGED | IResourceDelta.REMOVED);
-
-        monitor.addResourceEventListener(mResourceEventListener);
-    }
-
-    /**
-     * Adds a listener for a given {@link IProject}.
-     * @param project
-     * @param listener
-     */
-    public void addListener(IProject project, ILayoutReloadListener listener) {
-        synchronized (mListenerMap) {
-            List<ILayoutReloadListener> list = mListenerMap.get(project);
-            if (list == null) {
-                list = new ArrayList<ILayoutReloadListener>();
-                mListenerMap.put(project, list);
-            }
-
-            list.add(listener);
-        }
-    }
-
-    /**
-     * Removes a listener for a given {@link IProject}.
-     */
-    public void removeListener(IProject project, ILayoutReloadListener listener) {
-        synchronized (mListenerMap) {
-            List<ILayoutReloadListener> list = mListenerMap.get(project);
-            if (list != null) {
-                list.remove(listener);
-            }
-        }
-    }
-
-    /**
-     * Removes a listener, no matter which {@link IProject} it was associated with.
-     */
-    public void removeListener(ILayoutReloadListener listener) {
-        synchronized (mListenerMap) {
-
-            for (List<ILayoutReloadListener> list : mListenerMap.values()) {
-                Iterator<ILayoutReloadListener> it = list.iterator();
-                while (it.hasNext()) {
-                    ILayoutReloadListener i = it.next();
-                    if (i == listener) {
-                        it.remove();
-                    }
-                }
-            }
-        }
-    }
-
-    /**
-     * Implementation of the {@link IFileListener} as an internal class so that the methods
-     * do not appear in the public API of {@link LayoutReloadMonitor}.
-     *
-     * This is only to detect code and manifest change. Resource changes (located in res/)
-     * is done through {@link #mResourceListener}.
-     */
-    private IFileListener mFileListener = new IFileListener() {
-        /*
-         * Callback for IFileListener. Called when a file changed.
-         * This records the changes for each project, but does not notify listeners.
-         */
-        @Override
-        public void fileChanged(@NonNull IFile file, @NonNull IMarkerDelta[] markerDeltas,
-                int kind, @Nullable String extension, int flags, boolean isAndroidProject) {
-            // This listener only cares about .class files and AndroidManifest.xml files
-            if (!(SdkConstants.EXT_CLASS.equals(extension)
-                    || SdkConstants.EXT_XML.equals(extension)
-                        && SdkConstants.FN_ANDROID_MANIFEST_XML.equals(file.getName()))) {
-                return;
-            }
-
-            // get the file's project
-            IProject project = file.getProject();
-
-            if (isAndroidProject) {
-                // project is an Android project, it's the one being affected
-                // directly by its own file change.
-                processFileChanged(file, project, extension);
-            } else {
-                // check the projects depending on it, if they are Android project, update them.
-                IProject[] referencingProjects = project.getReferencingProjects();
-
-                for (IProject p : referencingProjects) {
-                    try {
-                        boolean hasAndroidNature = p.hasNature(AdtConstants.NATURE_DEFAULT);
-                        if (hasAndroidNature) {
-                            // the changed project is a dependency on an Android project,
-                            // update the main project.
-                            processFileChanged(file, p, extension);
-                        }
-                    } catch (CoreException e) {
-                        // do nothing if the nature cannot be queried.
-                    }
-                }
-            }
-        }
-
-        /**
-         * Processes a file change for a given project which may or may not be the file's project.
-         * @param file the changed file
-         * @param project the project impacted by the file change.
-         */
-        private void processFileChanged(IFile file, IProject project, String extension) {
-            // if this project has already been marked as modified, we do nothing.
-            ChangeFlags changeFlags = mProjectFlags.get(project);
-            if (changeFlags != null && changeFlags.isAllTrue()) {
-                return;
-            }
-
-            // here we only care about code change (so change for .class files).
-            // Resource changes is handled by the IResourceListener.
-            if (SdkConstants.EXT_CLASS.equals(extension)) {
-                if (file.getName().matches("R[\\$\\.](.*)")) {
-                    // this is a R change!
-                    if (changeFlags == null) {
-                        changeFlags = new ChangeFlags();
-                        mProjectFlags.put(project, changeFlags);
-                    }
-
-                    changeFlags.rClass = true;
-                } else {
-                    // this is a code change!
-                    if (changeFlags == null) {
-                        changeFlags = new ChangeFlags();
-                        mProjectFlags.put(project, changeFlags);
-                    }
-
-                    changeFlags.code = true;
-                }
-            } else if (SdkConstants.FN_ANDROID_MANIFEST_XML.equals(file.getName()) &&
-                    file.getParent().equals(project)) {
-                // this is a manifest change!
-                if (changeFlags == null) {
-                    changeFlags = new ChangeFlags();
-                    mProjectFlags.put(project, changeFlags);
-                }
-
-                changeFlags.manifest = true;
-            }
-        }
-    };
-
-    /**
-     * Implementation of the {@link IResourceEventListener} as an internal class so that the methods
-     * do not appear in the public API of {@link LayoutReloadMonitor}.
-     */
-    private IResourceEventListener mResourceEventListener = new IResourceEventListener() {
-        /*
-         * Callback for ResourceMonitor.IResourceEventListener. Called at the beginning of a
-         * resource change event. This is called once, while fileChanged can be
-         * called several times.
-         *
-         */
-        @Override
-        public void resourceChangeEventStart() {
-            // nothing to be done here, it all happens in the resourceChangeEventEnd
-        }
-
-        /*
-         * Callback for ResourceMonitor.IResourceEventListener. Called at the end of a resource
-         * change event. This is where we notify the listeners.
-         */
-        @Override
-        public void resourceChangeEventEnd() {
-            // for each IProject that was changed, we notify all the listeners.
-            for (Entry<IProject, ChangeFlags> entry : mProjectFlags.entrySet()) {
-                IProject project = entry.getKey();
-
-                // notify the project itself.
-                notifyForProject(project, entry.getValue(), false);
-
-                // check if the project is a library, and if it is search for what other
-                // project depends on this one (directly or not)
-                ProjectState state = Sdk.getProjectState(project);
-                if (state != null && state.isLibrary()) {
-                    Set<ProjectState> mainProjects = Sdk.getMainProjectsFor(project);
-                    for (ProjectState mainProject : mainProjects) {
-                        // always give the changeflag of the modified project.
-                        notifyForProject(mainProject.getProject(), entry.getValue(), true);
-                    }
-                }
-            }
-
-            // empty the list.
-            mProjectFlags.clear();
-        }
-
-        /**
-         * Notifies the listeners for a given project.
-         * @param project the project for which the listeners must be notified
-         * @param flags the change flags to pass to the listener
-         * @param libraryChanged a flag indicating if the change flags are for the give project,
-         * or if they are for a library dependency.
-         */
-        private void notifyForProject(IProject project, ChangeFlags flags,
-                boolean libraryChanged) {
-            synchronized (mListenerMap) {
-                List<ILayoutReloadListener> listeners = mListenerMap.get(project);
-
-                if (listeners != null) {
-                    for (ILayoutReloadListener listener : listeners) {
-                        try {
-                            listener.reloadLayout(flags, libraryChanged);
-                        } catch (Throwable t) {
-                            AdtPlugin.log(t, "Failed to call ILayoutReloadListener.reloadLayout");
-                        }
-                    }
-                }
-            }
-        }
-    };
-
-    /**
-     * Implementation of the {@link IResourceListener} as an internal class so that the methods
-     * do not appear in the public API of {@link LayoutReloadMonitor}.
-     */
-    private IResourceListener mResourceListener = new IResourceListener() {
-
-        @Override
-        public void folderChanged(IProject project, ResourceFolder folder, int eventType) {
-            // if this project has already been marked as modified, we do nothing.
-            ChangeFlags changeFlags = mProjectFlags.get(project);
-            if (changeFlags != null && changeFlags.isAllTrue()) {
-                return;
-            }
-
-            // this means a new resource folder was added or removed, which can impact the
-            // locale list.
-            if (changeFlags == null) {
-                changeFlags = new ChangeFlags();
-                mProjectFlags.put(project, changeFlags);
-            }
-
-            changeFlags.localeList = true;
-        }
-
-        @Override
-        public void fileChanged(IProject project, ResourceFile file, int eventType) {
-            // if this project has already been marked as modified, we do nothing.
-            ChangeFlags changeFlags = mProjectFlags.get(project);
-            if (changeFlags != null && changeFlags.isAllTrue()) {
-                return;
-            }
-
-            // now check that the file is *NOT* a layout file (those automatically trigger a layout
-            // reload and we don't want to do it twice.)
-            Collection<ResourceType> resTypes = file.getResourceTypes();
-
-            // it's unclear why but there has been cases of resTypes being empty!
-            if (resTypes.size() > 0) {
-                // this is a resource change, that may require a layout redraw!
-                if (changeFlags == null) {
-                    changeFlags = new ChangeFlags();
-                    mProjectFlags.put(project, changeFlags);
-                }
-
-                changeFlags.resources = true;
-            }
-        }
-    };
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/ProjectCallback.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/ProjectCallback.java
deleted file mode 100644
index 020c666..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/ProjectCallback.java
+++ /dev/null
@@ -1,693 +0,0 @@
-/*
- * 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.editors.layout;
-
-import static com.android.SdkConstants.ANDROID_PKG_PREFIX;
-import static com.android.SdkConstants.CALENDAR_VIEW;
-import static com.android.SdkConstants.CLASS_VIEW;
-import static com.android.SdkConstants.EXPANDABLE_LIST_VIEW;
-import static com.android.SdkConstants.FQCN_GRID_VIEW;
-import static com.android.SdkConstants.FQCN_SPINNER;
-import static com.android.SdkConstants.GRID_VIEW;
-import static com.android.SdkConstants.LIST_VIEW;
-import static com.android.SdkConstants.SPINNER;
-import static com.android.SdkConstants.VIEW_FRAGMENT;
-import static com.android.SdkConstants.VIEW_INCLUDE;
-
-import com.android.SdkConstants;
-import com.android.ide.common.rendering.LayoutLibrary;
-import com.android.ide.common.rendering.RenderSecurityManager;
-import com.android.ide.common.rendering.api.ActionBarCallback;
-import com.android.ide.common.rendering.api.AdapterBinding;
-import com.android.ide.common.rendering.api.DataBindingItem;
-import com.android.ide.common.rendering.api.Features;
-import com.android.ide.common.rendering.api.ILayoutPullParser;
-import com.android.ide.common.rendering.api.IProjectCallback;
-import com.android.ide.common.rendering.api.LayoutlibCallback;
-import com.android.ide.common.rendering.api.LayoutLog;
-import com.android.ide.common.rendering.api.ResourceReference;
-import com.android.ide.common.rendering.api.ResourceValue;
-import com.android.ide.common.rendering.api.Result;
-import com.android.ide.common.resources.ResourceResolver;
-import com.android.ide.common.xml.ManifestData;
-import com.android.ide.eclipse.adt.AdtConstants;
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.ide.eclipse.adt.internal.editors.layout.gle2.GraphicalEditorPart;
-import com.android.ide.eclipse.adt.internal.editors.layout.gle2.LayoutMetadata;
-import com.android.ide.eclipse.adt.internal.editors.layout.gle2.RenderLogger;
-import com.android.ide.eclipse.adt.internal.editors.layout.uimodel.UiViewElementNode;
-import com.android.ide.eclipse.adt.internal.project.AndroidManifestHelper;
-import com.android.ide.eclipse.adt.internal.resources.manager.ProjectClassLoader;
-import com.android.ide.eclipse.adt.internal.resources.manager.ProjectResources;
-import com.android.resources.ResourceType;
-import com.android.util.Pair;
-import com.google.common.base.Charsets;
-import com.google.common.io.Files;
-
-import org.eclipse.core.resources.IProject;
-import org.xmlpull.v1.XmlPullParser;
-import org.xmlpull.v1.XmlPullParserException;
-
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.io.StringReader;
-import java.lang.reflect.Constructor;
-import java.lang.reflect.Field;
-import java.lang.reflect.Method;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Set;
-import java.util.TreeSet;
-
-/**
- * Loader for Android Project class in order to use them in the layout editor.
- * <p/>This implements {@link IProjectCallback} for the old and new API through
- * {@link LayoutlibCallback}
- */
-public final class ProjectCallback extends LayoutlibCallback {
-    private final HashMap<String, Class<?>> mLoadedClasses = new HashMap<String, Class<?>>();
-    private final Set<String> mMissingClasses = new TreeSet<String>();
-    private final Set<String> mBrokenClasses = new TreeSet<String>();
-    private final IProject mProject;
-    private final ClassLoader mParentClassLoader;
-    private final ProjectResources mProjectRes;
-    private final Object mCredential;
-    private boolean mUsed = false;
-    private String mNamespace;
-    private ProjectClassLoader mLoader = null;
-    private LayoutLog mLogger;
-    private LayoutLibrary mLayoutLib;
-    private String mLayoutName;
-    private ILayoutPullParser mLayoutEmbeddedParser;
-    private ResourceResolver mResourceResolver;
-    private GraphicalEditorPart mEditor;
-
-    /**
-     * Creates a new {@link ProjectCallback} to be used with the layout lib.
-     *
-     * @param layoutLib The layout library this callback is going to be invoked from
-     * @param projectRes the {@link ProjectResources} for the project.
-     * @param project the project.
-     * @param credential the sandbox credential
-     */
-    public ProjectCallback(LayoutLibrary layoutLib,
-            ProjectResources projectRes, IProject project, Object credential,
-            GraphicalEditorPart editor) {
-        mLayoutLib = layoutLib;
-        mParentClassLoader = layoutLib.getClassLoader();
-        mProjectRes = projectRes;
-        mProject = project;
-        mCredential = credential;
-        mEditor = editor;
-    }
-
-    public Set<String> getMissingClasses() {
-        return mMissingClasses;
-    }
-
-    public Set<String> getUninstantiatableClasses() {
-        return mBrokenClasses;
-    }
-
-    /**
-     * Sets the {@link LayoutLog} logger to use for error messages during problems
-     *
-     * @param logger the new logger to use, or null to clear it out
-     */
-    public void setLogger(LayoutLog logger) {
-        mLogger = logger;
-    }
-
-    /**
-     * Returns the {@link LayoutLog} logger used for error messages, or null
-     *
-     * @return the logger being used, or null if no logger is in use
-     */
-    public LayoutLog getLogger() {
-        return mLogger;
-    }
-
-    /**
-     * {@inheritDoc}
-     *
-     * This implementation goes through the output directory of the Eclipse project and loads the
-     * <code>.class</code> file directly.
-     */
-    @Override
-    @SuppressWarnings("unchecked")
-    public Object loadView(String className, Class[] constructorSignature,
-            Object[] constructorParameters)
-            throws Exception {
-        mUsed = true;
-
-        if (className == null) {
-            // Just make a plain <View> if you specify <view> without a class= attribute.
-            className = CLASS_VIEW;
-        }
-
-        // look for a cached version
-        Class<?> clazz = mLoadedClasses.get(className);
-        if (clazz != null) {
-            return instantiateClass(clazz, constructorSignature, constructorParameters);
-        }
-
-        // load the class.
-
-        try {
-            if (mLoader == null) {
-                // Allow creating class loaders during rendering; may be prevented by the
-                // RenderSecurityManager
-                boolean token = RenderSecurityManager.enterSafeRegion(mCredential);
-                try {
-                  mLoader = new ProjectClassLoader(mParentClassLoader, mProject);
-                } finally {
-                    RenderSecurityManager.exitSafeRegion(token);
-                }
-            }
-            clazz = mLoader.loadClass(className);
-        } catch (Exception e) {
-            // Add the missing class to the list so that the renderer can print them later.
-            // no need to log this.
-            if (!className.equals(VIEW_FRAGMENT) && !className.equals(VIEW_INCLUDE)) {
-                mMissingClasses.add(className);
-            }
-        }
-
-        try {
-            if (clazz != null) {
-                // first try to instantiate it because adding it the list of loaded class so that
-                // we don't add broken classes.
-                Object view = instantiateClass(clazz, constructorSignature, constructorParameters);
-                mLoadedClasses.put(className, clazz);
-
-                return view;
-            }
-        } catch (Throwable e) {
-            // Find root cause to log it.
-            while (e.getCause() != null) {
-                e = e.getCause();
-            }
-
-            appendToIdeLog(e, "%1$s failed to instantiate.", className); //$NON-NLS-1$
-
-            // Add the missing class to the list so that the renderer can print them later.
-            if (mLogger instanceof RenderLogger) {
-                RenderLogger renderLogger = (RenderLogger) mLogger;
-                renderLogger.recordThrowable(e);
-
-            }
-            mBrokenClasses.add(className);
-        }
-
-        // Create a mock view instead. We don't cache it in the mLoadedClasses map.
-        // If any exception is thrown, we'll return a CFN with the original class name instead.
-        try {
-            clazz = mLoader.loadClass(SdkConstants.CLASS_MOCK_VIEW);
-            Object view = instantiateClass(clazz, constructorSignature, constructorParameters);
-
-            // Set the text of the mock view to the simplified name of the custom class
-            Method m = view.getClass().getMethod("setText",
-                                                 new Class<?>[] { CharSequence.class });
-            String label = getShortClassName(className);
-            if (label.equals(VIEW_FRAGMENT)) {
-                label = "<fragment>\n"
-                        + "Pick preview layout from the \"Fragment Layout\" context menu";
-            } else if (label.equals(VIEW_INCLUDE)) {
-                label = "Text";
-            }
-
-            m.invoke(view, label);
-
-            // Call MockView.setGravity(Gravity.CENTER) to get the text centered in
-            // MockViews.
-            // TODO: Do this in layoutlib's MockView class instead.
-            try {
-                // Look up android.view.Gravity#CENTER - or can we just hard-code
-                // the value (17) here?
-                Class<?> gravity =
-                    Class.forName("android.view.Gravity", //$NON-NLS-1$
-                            true, view.getClass().getClassLoader());
-                Field centerField = gravity.getField("CENTER"); //$NON-NLS-1$
-                int center = centerField.getInt(null);
-                m = view.getClass().getMethod("setGravity",
-                        new Class<?>[] { Integer.TYPE });
-                // Center
-                //int center = (0x0001 << 4) | (0x0001 << 0);
-                m.invoke(view, Integer.valueOf(center));
-            } catch (Exception e) {
-                // Not important to center views
-            }
-
-            return view;
-        } catch (Exception e) {
-            // We failed to create and return a mock view.
-            // Just throw back a CNF with the original class name.
-            throw new ClassNotFoundException(className, e);
-        }
-    }
-
-    private String getShortClassName(String fqcn) {
-        // The name is typically a fully-qualified class name. Let's make it a tad shorter.
-
-        if (fqcn.startsWith("android.")) {                                      //$NON-NLS-1$
-            // For android classes, convert android.foo.Name to android...Name
-            int first = fqcn.indexOf('.');
-            int last = fqcn.lastIndexOf('.');
-            if (last > first) {
-                return fqcn.substring(0, first) + ".." + fqcn.substring(last);   //$NON-NLS-1$
-            }
-        } else {
-            // For custom non-android classes, it's best to keep the 2 first segments of
-            // the namespace, e.g. we want to get something like com.example...MyClass
-            int first = fqcn.indexOf('.');
-            first = fqcn.indexOf('.', first + 1);
-            int last = fqcn.lastIndexOf('.');
-            if (last > first) {
-                return fqcn.substring(0, first) + ".." + fqcn.substring(last);   //$NON-NLS-1$
-            }
-        }
-
-        return fqcn;
-    }
-
-    /**
-     * Returns the namespace for the project. The namespace contains a standard part + the
-     * application package.
-     *
-     * @return The package namespace of the project or null in case of error.
-     */
-    @Override
-    public String getNamespace() {
-        if (mNamespace == null) {
-            boolean token = RenderSecurityManager.enterSafeRegion(mCredential);
-            try {
-                ManifestData manifestData = AndroidManifestHelper.parseForData(mProject);
-                if (manifestData != null) {
-                    String javaPackage = manifestData.getPackage();
-                    mNamespace = String.format(AdtConstants.NS_CUSTOM_RESOURCES, javaPackage);
-                }
-            } finally {
-                RenderSecurityManager.exitSafeRegion(token);
-            }
-        }
-
-        return mNamespace;
-    }
-
-    @Override
-    public Pair<ResourceType, String> resolveResourceId(int id) {
-        if (mProjectRes != null) {
-            return mProjectRes.resolveResourceId(id);
-        }
-
-        return null;
-    }
-
-    @Override
-    public String resolveResourceId(int[] id) {
-        if (mProjectRes != null) {
-            return mProjectRes.resolveStyleable(id);
-        }
-
-        return null;
-    }
-
-    @Override
-    public Integer getResourceId(ResourceType type, String name) {
-        if (mProjectRes != null) {
-            return mProjectRes.getResourceId(type, name);
-        }
-
-        return null;
-    }
-
-    /**
-     * Returns whether the loader has received requests to load custom views. Note that
-     * the custom view loading may not actually have succeeded; this flag only records
-     * whether it was <b>requested</b>.
-     * <p/>
-     * This allows to efficiently only recreate when needed upon code change in the
-     * project.
-     *
-     * @return true if the loader has been asked to load custom views
-     */
-    public boolean isUsed() {
-        return mUsed;
-    }
-
-    /**
-     * Instantiate a class object, using a specific constructor and parameters.
-     * @param clazz the class to instantiate
-     * @param constructorSignature the signature of the constructor to use
-     * @param constructorParameters the parameters to use in the constructor.
-     * @return A new class object, created using a specific constructor and parameters.
-     * @throws Exception
-     */
-    @SuppressWarnings("unchecked")
-    private Object instantiateClass(Class<?> clazz,
-            Class[] constructorSignature,
-            Object[] constructorParameters) throws Exception {
-        Constructor<?> constructor = null;
-
-        try {
-            constructor = clazz.getConstructor(constructorSignature);
-
-        } catch (NoSuchMethodException e) {
-            // Custom views can either implement a 3-parameter, 2-parameter or a
-            // 1-parameter. Let's synthetically build and try all the alternatives.
-            // That's kind of like switching to the other box.
-            //
-            // The 3-parameter constructor takes the following arguments:
-            // ...(Context context, AttributeSet attrs, int defStyle)
-
-            int n = constructorSignature.length;
-            if (n == 0) {
-                // There is no parameter-less constructor. Nobody should ask for one.
-                throw e;
-            }
-
-            for (int i = 3; i >= 1; i--) {
-                if (i == n) {
-                    // Let's skip the one we know already fails
-                    continue;
-                }
-                Class[] sig = new Class[i];
-                Object[] params = new Object[i];
-
-                int k = i;
-                if (n < k) {
-                    k = n;
-                }
-                System.arraycopy(constructorSignature, 0, sig, 0, k);
-                System.arraycopy(constructorParameters, 0, params, 0, k);
-
-                for (k++; k <= i; k++) {
-                    if (k == 2) {
-                        // Parameter 2 is the AttributeSet
-                        sig[k-1] = clazz.getClassLoader().loadClass("android.util.AttributeSet");
-                        params[k-1] = null;
-
-                    } else if (k == 3) {
-                        // Parameter 3 is the int defstyle
-                        sig[k-1] = int.class;
-                        params[k-1] = 0;
-                    }
-                }
-
-                constructorSignature = sig;
-                constructorParameters = params;
-
-                try {
-                    // Try again...
-                    constructor = clazz.getConstructor(constructorSignature);
-                    if (constructor != null) {
-                        // Found a suitable constructor, now let's use it.
-                        // (But let's warn the user if the simple View constructor was found
-                        // since Unexpected Things may happen if the attribute set constructors
-                        // are not found)
-                        if (constructorSignature.length < 2 && mLogger != null) {
-                            mLogger.warning("wrongconstructor", //$NON-NLS-1$
-                                String.format("Custom view %1$s is not using the 2- or 3-argument "
-                                    + "View constructors; XML attributes will not work",
-                                    clazz.getSimpleName()), null /*data*/);
-                        }
-                        break;
-                    }
-                } catch (NoSuchMethodException e1) {
-                    // pass
-                }
-            }
-
-            // If all the alternatives failed, throw the initial exception.
-            if (constructor == null) {
-                throw e;
-            }
-        }
-
-        constructor.setAccessible(true);
-        return constructor.newInstance(constructorParameters);
-    }
-
-    public void setLayoutParser(String layoutName, ILayoutPullParser layoutParser) {
-        mLayoutName = layoutName;
-        mLayoutEmbeddedParser = layoutParser;
-    }
-
-    @Override
-    public ILayoutPullParser getParser(String layoutName) {
-        boolean token = RenderSecurityManager.enterSafeRegion(mCredential);
-        try {
-            // Try to compute the ResourceValue for this layout since layoutlib
-            // must be an older version which doesn't pass the value:
-            if (mResourceResolver != null) {
-                ResourceValue value = mResourceResolver.getProjectResource(ResourceType.LAYOUT,
-                        layoutName);
-                if (value != null) {
-                    return getParser(value);
-                }
-            }
-
-            return getParser(layoutName, null);
-        } finally {
-            RenderSecurityManager.exitSafeRegion(token);
-        }
-    }
-
-    @Override
-    public ILayoutPullParser getParser(ResourceValue layoutResource) {
-        boolean token = RenderSecurityManager.enterSafeRegion(mCredential);
-        try {
-            return getParser(layoutResource.getName(),
-                    new File(layoutResource.getValue()));
-        } finally {
-            RenderSecurityManager.exitSafeRegion(token);
-        }
-    }
-
-    private ILayoutPullParser getParser(String layoutName, File xml) {
-        if (layoutName.equals(mLayoutName)) {
-            ILayoutPullParser parser = mLayoutEmbeddedParser;
-            // The parser should only be used once!! If it is included more than once,
-            // subsequent includes should just use a plain pull parser that is not tied
-            // to the XML model
-            mLayoutEmbeddedParser = null;
-            return parser;
-        }
-
-        // For included layouts, create a ContextPullParser such that we get the
-        // layout editor behavior in included layouts as well - which for example
-        // replaces <fragment> tags with <include>.
-        if (xml != null && xml.isFile()) {
-            ContextPullParser parser = new ContextPullParser(this, xml);
-            try {
-                parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, true);
-                String xmlText = Files.toString(xml, Charsets.UTF_8);
-                parser.setInput(new StringReader(xmlText));
-                return parser;
-            } catch (XmlPullParserException e) {
-                appendToIdeLog(e, null);
-            } catch (FileNotFoundException e) {
-                // Shouldn't happen since we check isFile() above
-            } catch (IOException e) {
-                appendToIdeLog(e, null);
-            }
-        }
-
-        return null;
-    }
-
-    @Override
-    public Object getAdapterItemValue(ResourceReference adapterView, Object adapterCookie,
-            ResourceReference itemRef,
-            int fullPosition, int typePosition, int fullChildPosition, int typeChildPosition,
-            ResourceReference viewRef, ViewAttribute viewAttribute, Object defaultValue) {
-
-        // Special case for the palette preview
-        if (viewAttribute == ViewAttribute.TEXT
-                && adapterView.getName().startsWith("android_widget_")) { //$NON-NLS-1$
-            String name = adapterView.getName();
-            if (viewRef.getName().equals("text2")) { //$NON-NLS-1$
-                return "Sub Item";
-            }
-            if (fullPosition == 0) {
-                String viewName = name.substring("android_widget_".length());
-                if (viewName.equals(EXPANDABLE_LIST_VIEW)) {
-                    return "ExpandableList"; // ExpandableListView is too wide, character-wraps
-                }
-                return viewName;
-            } else {
-                return "Next Item";
-            }
-        }
-
-        if (itemRef.isFramework()) {
-            // Special case for list_view_item_2 and friends
-            if (viewRef.getName().equals("text2")) { //$NON-NLS-1$
-                return "Sub Item " + (fullPosition + 1);
-            }
-        }
-
-        if (viewAttribute == ViewAttribute.TEXT && ((String) defaultValue).length() == 0) {
-            return "Item " + (fullPosition + 1);
-        }
-
-        return null;
-    }
-
-    /**
-     * For the given class, finds and returns the nearest super class which is a ListView
-     * or an ExpandableListView or a GridView (which uses a list adapter), or returns null.
-     *
-     * @param clz the class of the view object
-     * @return the fully qualified class name of the list ancestor, or null if there
-     *         is no list view ancestor
-     */
-    public static String getListAdapterViewFqcn(Class<?> clz) {
-        String fqcn = clz.getName();
-        if (fqcn.endsWith(LIST_VIEW)) { // including EXPANDABLE_LIST_VIEW
-            return fqcn;
-        } else if (fqcn.equals(FQCN_GRID_VIEW)) {
-            return fqcn;
-        } else if (fqcn.equals(FQCN_SPINNER)) {
-            return fqcn;
-        } else if (fqcn.startsWith(ANDROID_PKG_PREFIX)) {
-            return null;
-        }
-        Class<?> superClass = clz.getSuperclass();
-        if (superClass != null) {
-            return getListAdapterViewFqcn(superClass);
-        } else {
-            // Should not happen; we would have encountered android.view.View first,
-            // and it should have been covered by the ANDROID_PKG_PREFIX case above.
-            return null;
-        }
-    }
-
-    /**
-     * Looks at the parent-chain of the view and if it finds a custom view, or a
-     * CalendarView, within the given distance then it returns true. A ListView within a
-     * CalendarView should not be assigned a custom list view type because it sets its own
-     * and then attempts to cast the layout to its own type which would fail if the normal
-     * default list item binding is used.
-     */
-    private boolean isWithinIllegalParent(Object viewObject, int depth) {
-        String fqcn = viewObject.getClass().getName();
-        if (fqcn.endsWith(CALENDAR_VIEW) || !fqcn.startsWith(ANDROID_PKG_PREFIX)) {
-            return true;
-        }
-
-        if (depth > 0) {
-            Result result = mLayoutLib.getViewParent(viewObject);
-            if (result.isSuccess()) {
-                Object parent = result.getData();
-                if (parent != null) {
-                    return isWithinIllegalParent(parent, depth -1);
-                }
-            }
-        }
-
-        return false;
-    }
-
-    @Override
-    public AdapterBinding getAdapterBinding(final ResourceReference adapterView,
-            final Object adapterCookie, final Object viewObject) {
-        // Look for user-recorded preference for layout to be used for previews
-        if (adapterCookie instanceof UiViewElementNode) {
-            UiViewElementNode uiNode = (UiViewElementNode) adapterCookie;
-            AdapterBinding binding = LayoutMetadata.getNodeBinding(viewObject, uiNode);
-            if (binding != null) {
-                return binding;
-            }
-        } else if (adapterCookie instanceof Map<?,?>) {
-            @SuppressWarnings("unchecked")
-            Map<String, String> map = (Map<String, String>) adapterCookie;
-            AdapterBinding binding = LayoutMetadata.getNodeBinding(viewObject, map);
-            if (binding != null) {
-                return binding;
-            }
-        }
-
-        if (viewObject == null) {
-            return null;
-        }
-
-        // Is this a ListView or ExpandableListView? If so, return its fully qualified
-        // class name, otherwise return null. This is used to filter out other types
-        // of AdapterViews (such as Spinners) where we don't want to use the list item
-        // binding.
-        String listFqcn = getListAdapterViewFqcn(viewObject.getClass());
-        if (listFqcn == null) {
-            return null;
-        }
-
-        // Is this ListView nested within an "illegal" container, such as a CalendarView?
-        // If so, don't change the bindings below. Some views, such as CalendarView, and
-        // potentially some custom views, might be doing specific things with the ListView
-        // that could break if we add our own list binding, so for these leave the list
-        // alone.
-        if (isWithinIllegalParent(viewObject, 2)) {
-            return null;
-        }
-
-        int count = listFqcn.endsWith(GRID_VIEW) ? 24 : 12;
-        AdapterBinding binding = new AdapterBinding(count);
-        if (listFqcn.endsWith(EXPANDABLE_LIST_VIEW)) {
-            binding.addItem(new DataBindingItem(LayoutMetadata.DEFAULT_EXPANDABLE_LIST_ITEM,
-                    true /* isFramework */, 1));
-        } else if (listFqcn.equals(SPINNER)) {
-            binding.addItem(new DataBindingItem(LayoutMetadata.DEFAULT_SPINNER_ITEM,
-                    true /* isFramework */, 1));
-        } else {
-            binding.addItem(new DataBindingItem(LayoutMetadata.DEFAULT_LIST_ITEM,
-                    true /* isFramework */, 1));
-        }
-
-        return binding;
-    }
-
-    /**
-     * Sets the {@link ResourceResolver} to be used when looking up resources
-     *
-     * @param resolver the resolver to use
-     */
-    public void setResourceResolver(ResourceResolver resolver) {
-        mResourceResolver = resolver;
-    }
-
-    // Append the given message to the ADT log. Bypass the sandbox if necessary
-    // such that we can write to the log file.
-    private void appendToIdeLog(Throwable exception, String format, Object ... args) {
-        boolean token = RenderSecurityManager.enterSafeRegion(mCredential);
-        try {
-            AdtPlugin.log(exception, format, args);
-        } finally {
-            RenderSecurityManager.exitSafeRegion(token);
-        }
-    }
-
-    @Override
-    public ActionBarCallback getActionBarCallback() {
-        return new ActionBarHandler(mEditor);
-    }
-
-    @Override
-    public boolean supports(int feature) {
-        return feature <= Features.LAST_CAPABILITY;
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/UiElementPullParser.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/UiElementPullParser.java
deleted file mode 100644
index 8581568..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/UiElementPullParser.java
+++ /dev/null
@@ -1,661 +0,0 @@
-/*
- * 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.editors.layout;
-
-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_PADDING;
-import static com.android.SdkConstants.AUTO_URI;
-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_PT;
-import static com.android.SdkConstants.UNIT_PX;
-import static com.android.SdkConstants.UNIT_SP;
-import static com.android.SdkConstants.VALUE_FILL_PARENT;
-import static com.android.SdkConstants.VALUE_MATCH_PARENT;
-import static com.android.SdkConstants.VIEW_FRAGMENT;
-import static com.android.SdkConstants.VIEW_INCLUDE;
-
-import com.android.ide.common.rendering.api.ILayoutPullParser;
-import com.android.ide.common.rendering.api.ViewInfo;
-import com.android.ide.common.res2.ValueXmlHelper;
-import com.android.ide.eclipse.adt.internal.editors.layout.descriptors.LayoutDescriptors;
-import com.android.ide.eclipse.adt.internal.editors.layout.descriptors.ViewElementDescriptor;
-import com.android.ide.eclipse.adt.internal.editors.layout.gle2.FragmentMenu;
-import com.android.ide.eclipse.adt.internal.editors.uimodel.UiAttributeNode;
-import com.android.ide.eclipse.adt.internal.editors.uimodel.UiElementNode;
-import com.android.ide.eclipse.adt.internal.sdk.AndroidTargetData;
-import com.android.ide.eclipse.adt.internal.sdk.Sdk;
-import com.android.resources.Density;
-import com.android.sdklib.IAndroidTarget;
-
-import org.eclipse.core.resources.IProject;
-import org.w3c.dom.Document;
-import org.w3c.dom.NamedNodeMap;
-import org.w3c.dom.Node;
-import org.xmlpull.v1.XmlPullParserException;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
-import java.util.Set;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-/**
- * {@link ILayoutPullParser} implementation on top of {@link UiElementNode}.
- * <p/>
- * It's designed to work on layout files, and will most likely not work on other resource files.
- * <p/>
- * This pull parser generates {@link ViewInfo}s which key is a {@link UiElementNode}.
- */
-public class UiElementPullParser extends BasePullParser {
-    private final static Pattern FLOAT_PATTERN = Pattern.compile("(-?[0-9]+(?:\\.[0-9]+)?)(.*)"); //$NON-NLS-1$
-
-    private final int[] sIntOut = new int[1];
-
-    private final ArrayList<UiElementNode> mNodeStack = new ArrayList<UiElementNode>();
-    private UiElementNode mRoot;
-    private final boolean mExplodedRendering;
-    private boolean mZeroAttributeIsPadding = false;
-    private boolean mIncreaseExistingPadding = false;
-    private LayoutDescriptors mDescriptors;
-    private final Density mDensity;
-
-    /**
-     * Number of pixels to pad views with in exploded-rendering mode.
-     */
-    private static final String DEFAULT_PADDING_VALUE =
-        ExplodedRenderingHelper.PADDING_VALUE + UNIT_PX;
-
-    /**
-     * Number of pixels to pad exploded individual views with. (This is HALF the width of the
-     * rectangle since padding is repeated on both sides of the empty content.)
-     */
-    private static final String FIXED_PADDING_VALUE = "20px"; //$NON-NLS-1$
-
-    /**
-     * Set of nodes that we want to auto-pad using {@link #FIXED_PADDING_VALUE} as the padding
-     * attribute value. Can be null, which is the case when we don't want to perform any
-     * <b>individual</b> node exploding.
-     */
-    private final Set<UiElementNode> mExplodeNodes;
-
-    /**
-     * Constructs a new {@link UiElementPullParser}, a parser dedicated to the special case of
-     * parsing a layout resource files, and handling "exploded rendering" - adding padding on views
-     * to make them easier to see and operate on.
-     *
-     * @param top The {@link UiElementNode} for the root node.
-     * @param explodeRendering When true, add padding to <b>all</b> nodes in the hierarchy. This
-     *            will add rather than replace padding of a node.
-     * @param explodeNodes A set of individual nodes that should be assigned a fixed amount of
-     *            padding ({@link #FIXED_PADDING_VALUE}). This is intended for use with nodes that
-     *            (without padding) would be invisible. This parameter can be null, in which case
-     *            nodes are not individually exploded (but they may all be exploded with the
-     *            explodeRendering parameter.
-     * @param density the density factor for the screen.
-     * @param project Project containing this layout.
-     */
-    public UiElementPullParser(UiElementNode top, boolean explodeRendering,
-            Set<UiElementNode> explodeNodes,
-            Density density, IProject project) {
-        super();
-        mRoot = top;
-        mExplodedRendering = explodeRendering;
-        mExplodeNodes = explodeNodes;
-        mDensity = density;
-        if (mExplodedRendering) {
-            // get the layout descriptor
-            IAndroidTarget target = Sdk.getCurrent().getTarget(project);
-            AndroidTargetData data = Sdk.getCurrent().getTargetData(target);
-            mDescriptors = data.getLayoutDescriptors();
-        }
-        push(mRoot);
-    }
-
-    protected UiElementNode getCurrentNode() {
-        if (mNodeStack.size() > 0) {
-            return mNodeStack.get(mNodeStack.size()-1);
-        }
-
-        return null;
-    }
-
-    private Node getAttribute(int i) {
-        if (mParsingState != START_TAG) {
-            throw new IndexOutOfBoundsException();
-        }
-
-        // get the current uiNode
-        UiElementNode uiNode = getCurrentNode();
-
-        // get its xml node
-        Node xmlNode = uiNode.getXmlNode();
-
-        if (xmlNode != null) {
-            return xmlNode.getAttributes().item(i);
-        }
-
-        return null;
-    }
-
-    private void push(UiElementNode node) {
-        mNodeStack.add(node);
-
-        mZeroAttributeIsPadding = false;
-        mIncreaseExistingPadding = false;
-
-        if (mExplodedRendering) {
-            // first get the node name
-            String xml = node.getDescriptor().getXmlLocalName();
-            ViewElementDescriptor descriptor = mDescriptors.findDescriptorByTag(xml);
-            if (descriptor != null) {
-                NamedNodeMap attributes = node.getXmlNode().getAttributes();
-                Node padding = attributes.getNamedItemNS(ANDROID_URI, ATTR_PADDING);
-                if (padding == null) {
-                    // we'll return an extra padding
-                    mZeroAttributeIsPadding = true;
-                } else {
-                    mIncreaseExistingPadding = true;
-                }
-            }
-        }
-    }
-
-    private UiElementNode pop() {
-        return mNodeStack.remove(mNodeStack.size()-1);
-    }
-
-    // ------------- IXmlPullParser --------
-
-    /**
-     * {@inheritDoc}
-     * <p/>
-     * This implementation returns the underlying DOM node of type {@link UiElementNode}.
-     * Note that the link between the GLE and the parsing code depends on this being the actual
-     * type returned, so you can't just randomly change it here.
-     * <p/>
-     * Currently used by:
-     * - private method GraphicalLayoutEditor#updateNodeWithBounds(ILayoutViewInfo).
-     * - private constructor of LayoutCanvas.CanvasViewInfo.
-     */
-    @Override
-    public Object getViewCookie() {
-        return getCurrentNode();
-    }
-
-    /**
-     * Legacy method required by {@link com.android.layoutlib.api.IXmlPullParser}
-     */
-    @Override
-    public Object getViewKey() {
-        return getViewCookie();
-    }
-
-    /**
-     * This implementation does nothing for now as all the embedded XML will use a normal KXML
-     * parser.
-     */
-    @Override
-    public ILayoutPullParser getParser(String layoutName) {
-        return null;
-    }
-
-    // ------------- XmlPullParser --------
-
-    @Override
-    public String getPositionDescription() {
-        return "XML DOM element depth:" + mNodeStack.size();
-    }
-
-    /*
-     * This does not seem to be called by the layoutlib, but we keep this (and maintain
-     * it) just in case.
-     */
-    @Override
-    public int getAttributeCount() {
-        UiElementNode node = getCurrentNode();
-
-        if (node != null) {
-            Collection<UiAttributeNode> attributes = node.getAllUiAttributes();
-            int count = attributes.size();
-
-            return count + (mZeroAttributeIsPadding ? 1 : 0);
-        }
-
-        return 0;
-    }
-
-    /*
-     * This does not seem to be called by the layoutlib, but we keep this (and maintain
-     * it) just in case.
-     */
-    @Override
-    public String getAttributeName(int i) {
-        if (mZeroAttributeIsPadding) {
-            if (i == 0) {
-                return ATTR_PADDING;
-            } else {
-                i--;
-            }
-        }
-
-        Node attribute = getAttribute(i);
-        if (attribute != null) {
-            return attribute.getLocalName();
-        }
-
-        return null;
-    }
-
-    /*
-     * This does not seem to be called by the layoutlib, but we keep this (and maintain
-     * it) just in case.
-     */
-    @Override
-    public String getAttributeNamespace(int i) {
-        if (mZeroAttributeIsPadding) {
-            if (i == 0) {
-                return ANDROID_URI;
-            } else {
-                i--;
-            }
-        }
-
-        Node attribute = getAttribute(i);
-        if (attribute != null) {
-            return attribute.getNamespaceURI();
-        }
-        return ""; //$NON-NLS-1$
-    }
-
-    /*
-     * This does not seem to be called by the layoutlib, but we keep this (and maintain
-     * it) just in case.
-     */
-    @Override
-    public String getAttributePrefix(int i) {
-        if (mZeroAttributeIsPadding) {
-            if (i == 0) {
-                // figure out the prefix associated with the android namespace.
-                Document doc = mRoot.getXmlDocument();
-                return doc.lookupPrefix(ANDROID_URI);
-            } else {
-                i--;
-            }
-        }
-
-        Node attribute = getAttribute(i);
-        if (attribute != null) {
-            return attribute.getPrefix();
-        }
-        return null;
-    }
-
-    /*
-     * This does not seem to be called by the layoutlib, but we keep this (and maintain
-     * it) just in case.
-     */
-    @Override
-    public String getAttributeValue(int i) {
-        if (mZeroAttributeIsPadding) {
-            if (i == 0) {
-                return DEFAULT_PADDING_VALUE;
-            } else {
-                i--;
-            }
-        }
-
-        Node attribute = getAttribute(i);
-        if (attribute != null) {
-            String value = attribute.getNodeValue();
-            if (mIncreaseExistingPadding && ATTR_PADDING.equals(attribute.getLocalName()) &&
-                    ANDROID_URI.equals(attribute.getNamespaceURI())) {
-                // add the padding and return the value
-                return addPaddingToValue(value);
-            }
-            return value;
-        }
-
-        return null;
-    }
-
-    /*
-     * This is the main method used by the LayoutInflater to query for attributes.
-     */
-    @Override
-    public String getAttributeValue(String namespace, String localName) {
-        if (mExplodeNodes != null && ATTR_PADDING.equals(localName) &&
-                ANDROID_URI.equals(namespace)) {
-            UiElementNode node = getCurrentNode();
-            if (node != null && mExplodeNodes.contains(node)) {
-                return FIXED_PADDING_VALUE;
-            }
-        }
-
-        if (mZeroAttributeIsPadding && ATTR_PADDING.equals(localName) &&
-                ANDROID_URI.equals(namespace)) {
-            return DEFAULT_PADDING_VALUE;
-        }
-
-        // get the current uiNode
-        UiElementNode uiNode = getCurrentNode();
-
-        // get its xml node
-        Node xmlNode = uiNode.getXmlNode();
-
-        if (xmlNode != null) {
-            if (ATTR_LAYOUT.equals(localName) && VIEW_FRAGMENT.equals(xmlNode.getNodeName())) {
-                String layout = FragmentMenu.getFragmentLayout(xmlNode);
-                if (layout != null) {
-                    return layout;
-                }
-            }
-
-            Node attribute = xmlNode.getAttributes().getNamedItemNS(namespace, localName);
-
-            // Auto-convert http://schemas.android.com/apk/res-auto resources. The lookup
-            // will be for the current application's resource package, e.g.
-            // http://schemas.android.com/apk/res/foo.bar, but the XML document will
-            // be using http://schemas.android.com/apk/res-auto in library projects:
-            if (attribute == null && namespace != null && !namespace.equals(ANDROID_URI)) {
-                attribute = xmlNode.getAttributes().getNamedItemNS(AUTO_URI, localName);
-            }
-
-            if (attribute != null) {
-                String value = attribute.getNodeValue();
-                if (mIncreaseExistingPadding && ATTR_PADDING.equals(localName) &&
-                        ANDROID_URI.equals(namespace)) {
-                    // add the padding and return the value
-                    return addPaddingToValue(value);
-                }
-
-                // on the fly convert match_parent to fill_parent for compatibility with older
-                // platforms.
-                if (VALUE_MATCH_PARENT.equals(value) &&
-                        (ATTR_LAYOUT_WIDTH.equals(localName) ||
-                                ATTR_LAYOUT_HEIGHT.equals(localName)) &&
-                        ANDROID_URI.equals(namespace)) {
-                    return VALUE_FILL_PARENT;
-                }
-
-                // Handle unicode escapes etc
-                value = ValueXmlHelper.unescapeResourceString(value, false, false);
-
-                return value;
-            }
-        }
-
-        return null;
-    }
-
-    @Override
-    public int getDepth() {
-        return mNodeStack.size();
-    }
-
-    @Override
-    public String getName() {
-        if (mParsingState == START_TAG || mParsingState == END_TAG) {
-            String name = getCurrentNode().getDescriptor().getXmlLocalName();
-
-            if (name.equals(VIEW_FRAGMENT)) {
-                // Temporarily translate <fragment> to <include> (and in getAttribute
-                // we will also provide a layout-attribute for the corresponding
-                // fragment name attribute)
-                String layout = FragmentMenu.getFragmentLayout(getCurrentNode().getXmlNode());
-                if (layout != null) {
-                    return VIEW_INCLUDE;
-                }
-            }
-
-            return name;
-        }
-
-        return null;
-    }
-
-    @Override
-    public String getNamespace() {
-        if (mParsingState == START_TAG || mParsingState == END_TAG) {
-            return getCurrentNode().getDescriptor().getNamespace();
-        }
-
-        return null;
-    }
-
-    @Override
-    public String getPrefix() {
-        if (mParsingState == START_TAG || mParsingState == END_TAG) {
-            Document doc = mRoot.getXmlDocument();
-            return doc.lookupPrefix(getCurrentNode().getDescriptor().getNamespace());
-        }
-
-        return null;
-    }
-
-    @Override
-    public boolean isEmptyElementTag() throws XmlPullParserException {
-        if (mParsingState == START_TAG) {
-            return getCurrentNode().getUiChildren().size() == 0;
-        }
-
-        throw new XmlPullParserException("Call to isEmptyElementTag while not in START_TAG",
-                this, null);
-    }
-
-    @Override
-    public void onNextFromStartDocument() {
-        onNextFromStartTag();
-    }
-
-    @Override
-    public void onNextFromStartTag() {
-        // get the current node, and look for text or children (children first)
-        UiElementNode node = getCurrentNode();
-        List<UiElementNode> children = node.getUiChildren();
-        if (children.size() > 0) {
-            // move to the new child, and don't change the state.
-            push(children.get(0));
-
-            // in case the current state is CURRENT_DOC, we set the proper state.
-            mParsingState = START_TAG;
-        } else {
-            if (mParsingState == START_DOCUMENT) {
-                // this handles the case where there's no node.
-                mParsingState = END_DOCUMENT;
-            } else {
-                mParsingState = END_TAG;
-            }
-        }
-    }
-
-    @Override
-    public void onNextFromEndTag() {
-        // look for a sibling. if no sibling, go back to the parent
-        UiElementNode node = getCurrentNode();
-        node = node.getUiNextSibling();
-        if (node != null) {
-            // to go to the sibling, we need to remove the current node,
-            pop();
-            // and add its sibling.
-            push(node);
-            mParsingState = START_TAG;
-        } else {
-            // move back to the parent
-            pop();
-
-            // we have only one element left (mRoot), then we're done with the document.
-            if (mNodeStack.size() == 1) {
-                mParsingState = END_DOCUMENT;
-            } else {
-                mParsingState = END_TAG;
-            }
-        }
-    }
-
-    // ------- TypedValue stuff
-    // This is adapted from com.android.layoutlib.bridge.ResourceHelper
-    // (but modified to directly take the parsed value and convert it into pixel instead of
-    // storing it into a TypedValue)
-    // this was originally taken from platform/frameworks/base/libs/utils/ResourceTypes.cpp
-
-    private static final class DimensionEntry {
-        String name;
-        int type;
-
-        DimensionEntry(String name, int unit) {
-            this.name = name;
-            this.type = unit;
-        }
-    }
-
-    /** {@link DimensionEntry} complex unit: Value is raw pixels. */
-    private static final int COMPLEX_UNIT_PX = 0;
-    /** {@link DimensionEntry} complex unit: Value is Device Independent
-     *  Pixels. */
-    private static final int COMPLEX_UNIT_DIP = 1;
-    /** {@link DimensionEntry} complex unit: Value is a scaled pixel. */
-    private static final int COMPLEX_UNIT_SP = 2;
-    /** {@link DimensionEntry} complex unit: Value is in points. */
-    private static final int COMPLEX_UNIT_PT = 3;
-    /** {@link DimensionEntry} complex unit: Value is in inches. */
-    private static final int COMPLEX_UNIT_IN = 4;
-    /** {@link DimensionEntry} complex unit: Value is in millimeters. */
-    private static final int COMPLEX_UNIT_MM = 5;
-
-    private final static DimensionEntry[] sDimensions = new DimensionEntry[] {
-        new DimensionEntry(UNIT_PX, COMPLEX_UNIT_PX),
-        new DimensionEntry(UNIT_DIP, COMPLEX_UNIT_DIP),
-        new DimensionEntry(UNIT_DP, COMPLEX_UNIT_DIP),
-        new DimensionEntry(UNIT_SP, COMPLEX_UNIT_SP),
-        new DimensionEntry(UNIT_PT, COMPLEX_UNIT_PT),
-        new DimensionEntry(UNIT_IN, COMPLEX_UNIT_IN),
-        new DimensionEntry(UNIT_MM, COMPLEX_UNIT_MM),
-    };
-
-    /**
-     * Adds padding to an existing dimension.
-     * <p/>This will resolve the attribute value (which can be px, dip, dp, sp, pt, in, mm) to
-     * a pixel value, add the padding value ({@link ExplodedRenderingHelper#PADDING_VALUE}),
-     * and then return a string with the new value as a px string ("42px");
-     * If the conversion fails, only the special padding is returned.
-     */
-    private String addPaddingToValue(String s) {
-        int padding = ExplodedRenderingHelper.PADDING_VALUE;
-        if (stringToPixel(s)) {
-            padding += sIntOut[0];
-        }
-
-        return padding + UNIT_PX;
-    }
-
-    /**
-     * Convert the string into a pixel value, and puts it in {@link #sIntOut}
-     * @param s the dimension value from an XML attribute
-     * @return true if success.
-     */
-    private boolean stringToPixel(String s) {
-        // remove the space before and after
-        s = s.trim();
-        int len = s.length();
-
-        if (len <= 0) {
-            return false;
-        }
-
-        // check that there's no non ASCII characters.
-        char[] buf = s.toCharArray();
-        for (int i = 0 ; i < len ; i++) {
-            if (buf[i] > 255) {
-                return false;
-            }
-        }
-
-        // check the first character
-        if (buf[0] < '0' && buf[0] > '9' && buf[0] != '.') {
-            return false;
-        }
-
-        // now look for the string that is after the float...
-        Matcher m = FLOAT_PATTERN.matcher(s);
-        if (m.matches()) {
-            String f_str = m.group(1);
-            String end = m.group(2);
-
-            float f;
-            try {
-                f = Float.parseFloat(f_str);
-            } catch (NumberFormatException e) {
-                // this shouldn't happen with the regexp above.
-                return false;
-            }
-
-            if (end.length() > 0 && end.charAt(0) != ' ') {
-                // We only support dimension-type values, so try to parse the unit for dimension
-                DimensionEntry dimension = parseDimension(end);
-                if (dimension != null) {
-                    // convert the value into pixel based on the dimention type
-                    // This is similar to TypedValue.applyDimension()
-                    switch (dimension.type) {
-                        case COMPLEX_UNIT_PX:
-                            // do nothing, value is already in px
-                            break;
-                        case COMPLEX_UNIT_DIP:
-                        case COMPLEX_UNIT_SP: // intended fall-through since we don't
-                                              // adjust for font size
-                            f *= (float)mDensity.getDpiValue() / Density.DEFAULT_DENSITY;
-                            break;
-                        case COMPLEX_UNIT_PT:
-                            f *= mDensity.getDpiValue() * (1.0f / 72);
-                            break;
-                        case COMPLEX_UNIT_IN:
-                            f *= mDensity.getDpiValue();
-                            break;
-                        case COMPLEX_UNIT_MM:
-                            f *= mDensity.getDpiValue() * (1.0f / 25.4f);
-                            break;
-                    }
-
-                    // store result (converted to int)
-                    sIntOut[0] = (int) (f + 0.5);
-
-                    return true;
-                }
-            }
-        }
-
-        return false;
-    }
-
-    private static DimensionEntry parseDimension(String str) {
-        str = str.trim();
-
-        for (DimensionEntry d : sDimensions) {
-            if (d.name.equals(str)) {
-                return d;
-            }
-        }
-
-        return null;
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/WidgetPullParser.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/WidgetPullParser.java
deleted file mode 100644
index dce2ccb..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/WidgetPullParser.java
+++ /dev/null
@@ -1,174 +0,0 @@
-/*
- * 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.editors.layout;
-
-import com.android.SdkConstants;
-import com.android.ide.common.rendering.api.ILayoutPullParser;
-import com.android.ide.eclipse.adt.AdtConstants;
-import com.android.ide.eclipse.adt.internal.editors.layout.descriptors.ViewElementDescriptor;
-import com.android.layoutlib.api.ILayoutResult.ILayoutViewInfo;
-
-import org.xmlpull.v1.XmlPullParserException;
-
-/**
- * {@link ILayoutPullParser} implementation to render android widget bitmap.
- * <p/>
- * The parser emulates a layout that contains just one widget, described by the
- * {@link ViewElementDescriptor} passed in the constructor.
- * <p/>
- * This pull parser generates {@link ILayoutViewInfo}s which key is a {@link ViewElementDescriptor}.
- */
-public class WidgetPullParser extends BasePullParser {
-
-    private final ViewElementDescriptor mDescriptor;
-    private String[][] mAttributes = new String[][] {
-            { "text", null },
-            { "layout_width", "wrap_content" },
-            { "layout_height", "wrap_content" },
-    };
-
-    public WidgetPullParser(ViewElementDescriptor descriptor) {
-        mDescriptor = descriptor;
-
-        String[] segments = mDescriptor.getFullClassName().split(AdtConstants.RE_DOT);
-        mAttributes[0][1] = segments[segments.length-1];
-    }
-
-    @Override
-    public Object getViewCookie() {
-        // we need a viewKey or the ILayoutResult will not contain any ILayoutViewInfo
-        return mDescriptor;
-    }
-
-    /**
-     * Legacy method required by {@link com.android.layoutlib.api.IXmlPullParser}
-     */
-    @Override
-    public Object getViewKey() {
-        return getViewCookie();
-    }
-
-    @Override
-    public ILayoutPullParser getParser(String layoutName) {
-        // there's no embedded layout for a single widget.
-        return null;
-    }
-
-    @Override
-    public int getAttributeCount() {
-        return mAttributes.length; // text attribute
-    }
-
-    @Override
-    public String getAttributeName(int index) {
-        if (index < mAttributes.length) {
-            return mAttributes[index][0];
-        }
-
-        return null;
-    }
-
-    @Override
-    public String getAttributeNamespace(int index) {
-        return SdkConstants.NS_RESOURCES;
-    }
-
-    @Override
-    public String getAttributePrefix(int index) {
-        // pass
-        return null;
-    }
-
-    @Override
-    public String getAttributeValue(int index) {
-        if (index < mAttributes.length) {
-            return mAttributes[index][1];
-        }
-
-        return null;
-    }
-
-    @Override
-    public String getAttributeValue(String ns, String name) {
-        if (SdkConstants.NS_RESOURCES.equals(ns)) {
-            for (String[] attribute : mAttributes) {
-                if (name.equals(attribute[0])) {
-                    return attribute[1];
-                }
-            }
-        }
-
-        return null;
-    }
-
-    @Override
-    public int getDepth() {
-        // pass
-        return 0;
-    }
-
-    @Override
-    public String getName() {
-        return mDescriptor.getXmlLocalName();
-    }
-
-    @Override
-    public String getNamespace() {
-        // pass
-        return null;
-    }
-
-    @Override
-    public String getPositionDescription() {
-        // pass
-        return null;
-    }
-
-    @Override
-    public String getPrefix() {
-        // pass
-        return null;
-    }
-
-    @Override
-    public boolean isEmptyElementTag() throws XmlPullParserException {
-        if (mParsingState == START_TAG) {
-            return true;
-        }
-
-        throw new XmlPullParserException("Call to isEmptyElementTag while not in START_TAG",
-                this, null);
-    }
-
-    @Override
-    public void onNextFromStartDocument() {
-        // just go to start_tag
-        mParsingState = START_TAG;
-    }
-
-    @Override
-    public void onNextFromStartTag() {
-        // since we have no children, just go to end_tag
-        mParsingState = END_TAG;
-    }
-
-    @Override
-    public void onNextFromEndTag() {
-        // just one tag. we are done.
-        mParsingState = END_DOCUMENT;
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/configuration/ActivityMenuListener.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/configuration/ActivityMenuListener.java
deleted file mode 100644
index 36cd0fb..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/configuration/ActivityMenuListener.java
+++ /dev/null
@@ -1,162 +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.ide.eclipse.adt.internal.editors.layout.configuration;
-
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.ide.eclipse.adt.internal.editors.manifest.ManifestInfo;
-import com.android.ide.eclipse.adt.internal.resources.ResourceHelper;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.jdt.ui.ISharedImages;
-import org.eclipse.jdt.ui.JavaUI;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.graphics.Rectangle;
-import org.eclipse.swt.widgets.Menu;
-import org.eclipse.swt.widgets.MenuItem;
-import org.eclipse.swt.widgets.ToolItem;
-
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-/**
- * The {@linkplain ActivityMenuListener} class is responsible for
- * generating the activity menu in the {@link ConfigurationChooser}.
- */
-class ActivityMenuListener extends SelectionAdapter {
-    private static final int ACTION_OPEN_ACTIVITY = 1;
-    private static final int ACTION_SELECT_ACTIVITY = 2;
-
-    private final ConfigurationChooser mConfigChooser;
-    private final int mAction;
-    private final String mFqcn;
-
-    ActivityMenuListener(
-            @NonNull ConfigurationChooser configChooser,
-            int action,
-            @Nullable String fqcn) {
-        mConfigChooser = configChooser;
-        mAction = action;
-        mFqcn = fqcn;
-    }
-
-    @Override
-    public void widgetSelected(SelectionEvent e) {
-        switch (mAction) {
-            case ACTION_OPEN_ACTIVITY: {
-                Configuration configuration = mConfigChooser.getConfiguration();
-                String fqcn = configuration.getActivity();
-                AdtPlugin.openJavaClass(mConfigChooser.getProject(), fqcn);
-                break;
-            }
-            case ACTION_SELECT_ACTIVITY: {
-                mConfigChooser.selectActivity(mFqcn);
-                mConfigChooser.onSelectActivity();
-                break;
-            }
-            default: assert false : mAction;
-        }
-    }
-
-    static void show(ConfigurationChooser chooser, ToolItem combo) {
-        // TODO: Allow using fragments here as well?
-        Menu menu = new Menu(chooser.getShell(), SWT.POP_UP);
-        ISharedImages sharedImages = JavaUI.getSharedImages();
-        Configuration configuration = chooser.getConfiguration();
-        String current = configuration.getActivity();
-
-        if (current != null) {
-            MenuItem item = new MenuItem(menu, SWT.PUSH);
-            String label = ConfigurationChooser.getActivityLabel(current, true);
-            item.setText( String.format("Open %1$s...", label));
-            Image image = sharedImages.getImage(ISharedImages.IMG_OBJS_CUNIT);
-            item.setImage(image);
-            item.addSelectionListener(
-                    new ActivityMenuListener(chooser, ACTION_OPEN_ACTIVITY, null));
-
-            @SuppressWarnings("unused")
-            MenuItem separator = new MenuItem(menu, SWT.SEPARATOR);
-        }
-
-        IProject project = chooser.getProject();
-        Image image = sharedImages.getImage(ISharedImages.IMG_OBJS_CLASS);
-
-        // Add activities found to be relevant to this layout
-        String layoutName = ResourceHelper.getLayoutName(chooser.getEditedFile());
-        String pkg = ManifestInfo.get(project).getPackage();
-        List<String> preferred = ManifestInfo.guessActivities(project, layoutName, pkg);
-        current = addActivities(chooser, menu, current, image, preferred);
-
-        // Add all activities
-        List<String> activities = ManifestInfo.getProjectActivities(project);
-        if (preferred.size() > 0) {
-            // Filter out the activities we've already listed above
-            List<String> filtered = new ArrayList<String>(activities.size());
-            Set<String> remove = new HashSet<String>(preferred);
-            for (String fqcn : activities) {
-                if (!remove.contains(fqcn)) {
-                    filtered.add(fqcn);
-                }
-            }
-            activities = filtered;
-        }
-
-        if (activities.size() > 0) {
-            if (preferred.size() > 0) {
-                @SuppressWarnings("unused")
-                MenuItem separator = new MenuItem(menu, SWT.SEPARATOR);
-            }
-
-            addActivities(chooser, menu, current, image, activities);
-        }
-
-        Rectangle bounds = combo.getBounds();
-        Point location = new Point(bounds.x, bounds.y + bounds.height);
-        location = combo.getParent().toDisplay(location);
-        menu.setLocation(location.x, location.y);
-        menu.setVisible(true);
-    }
-
-    private static String addActivities(ConfigurationChooser chooser, Menu menu, String current,
-            Image image, List<String> activities) {
-        for (final String fqcn : activities) {
-            String title = ConfigurationChooser.getActivityLabel(fqcn, false);
-            MenuItem item = new MenuItem(menu, SWT.CHECK);
-            item.setText(title);
-            item.setImage(image);
-
-            boolean selected = title.equals(current);
-            if (selected) {
-                item.setSelection(true);
-                current = null; // Only show the first occurrence as selected
-                // such that we don't show it selected again in the full activity list
-            }
-
-            item.addSelectionListener(new ActivityMenuListener(chooser,
-                    ACTION_SELECT_ACTIVITY, fqcn));
-        }
-
-        return current;
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/configuration/Configuration.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/configuration/Configuration.java
deleted file mode 100644
index c4253cd..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/configuration/Configuration.java
+++ /dev/null
@@ -1,1091 +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.ide.eclipse.adt.internal.editors.layout.configuration;
-
-import static com.android.SdkConstants.ANDROID_STYLE_RESOURCE_PREFIX;
-import static com.android.SdkConstants.PREFIX_RESOURCE_REF;
-import static com.android.SdkConstants.STYLE_RESOURCE_PREFIX;
-
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-import com.android.ide.common.rendering.LayoutLibrary;
-import com.android.ide.common.rendering.api.Capability;
-import com.android.ide.common.resources.ResourceFolder;
-import com.android.ide.common.resources.ResourceRepository;
-import com.android.ide.common.resources.configuration.DensityQualifier;
-import com.android.ide.common.resources.configuration.DeviceConfigHelper;
-import com.android.ide.common.resources.configuration.FolderConfiguration;
-import com.android.ide.common.resources.configuration.LayoutDirectionQualifier;
-import com.android.ide.common.resources.configuration.LocaleQualifier;
-import com.android.ide.common.resources.configuration.NightModeQualifier;
-import com.android.ide.common.resources.configuration.ScreenSizeQualifier;
-import com.android.ide.common.resources.configuration.UiModeQualifier;
-import com.android.ide.common.resources.configuration.VersionQualifier;
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.ide.eclipse.adt.internal.editors.layout.gle2.RenderService;
-import com.android.ide.eclipse.adt.internal.editors.manifest.ManifestInfo;
-import com.android.ide.eclipse.adt.internal.editors.manifest.ManifestInfo.ActivityAttributes;
-import com.android.ide.eclipse.adt.internal.preferences.AdtPrefs;
-import com.android.ide.eclipse.adt.internal.resources.ResourceHelper;
-import com.android.ide.eclipse.adt.internal.resources.manager.ProjectResources;
-import com.android.ide.eclipse.adt.internal.resources.manager.ResourceManager;
-import com.android.ide.eclipse.adt.internal.sdk.AndroidTargetData;
-import com.android.ide.eclipse.adt.internal.sdk.Sdk;
-import com.android.resources.Density;
-import com.android.resources.LayoutDirection;
-import com.android.resources.NightMode;
-import com.android.resources.ScreenSize;
-import com.android.resources.UiMode;
-import com.android.sdklib.AndroidVersion;
-import com.android.sdklib.IAndroidTarget;
-import com.android.sdklib.devices.Device;
-import com.android.sdklib.devices.State;
-import com.android.utils.Pair;
-import com.google.common.base.Objects;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.QualifiedName;
-
-import java.util.List;
-
-/**
- * A {@linkplain Configuration} is a selection of device, orientation, theme,
- * etc for use when rendering a layout.
- */
-public class Configuration {
-    /** The {@link FolderConfiguration} in change flags or override flags */
-    public static final int CFG_FOLDER       = 1 << 0;
-    /** The {@link Device} in change flags or override flags */
-    public static final int CFG_DEVICE       = 1 << 1;
-    /** The {@link State} in change flags or override flags */
-    public static final int CFG_DEVICE_STATE = 1 << 2;
-    /** The theme in change flags or override flags */
-    public static final int CFG_THEME        = 1 << 3;
-    /** The locale in change flags or override flags */
-    public static final int CFG_LOCALE       = 1 << 4;
-    /** The rendering {@link IAndroidTarget} in change flags or override flags */
-    public static final int CFG_TARGET       = 1 << 5;
-    /** The {@link NightMode} in change flags or override flags */
-    public static final int CFG_NIGHT_MODE   = 1 << 6;
-    /** The {@link UiMode} in change flags or override flags */
-    public static final int CFG_UI_MODE      = 1 << 7;
-    /** The {@link UiMode} in change flags or override flags */
-    public static final int CFG_ACTIVITY     = 1 << 8;
-
-    /** References all attributes */
-    public static final int MASK_ALL = 0xFFFF;
-
-    /** Attributes which affect which best-layout-file selection */
-    public static final int MASK_FILE_ATTRS =
-            CFG_DEVICE|CFG_DEVICE_STATE|CFG_LOCALE|CFG_TARGET|CFG_NIGHT_MODE|CFG_UI_MODE;
-
-    /** Attributes which affect rendering appearance */
-    public static final int MASK_RENDERING = MASK_FILE_ATTRS|CFG_THEME;
-
-    /**
-     * Setting name for project-wide setting controlling rendering target and locale which
-     * is shared for all files
-     */
-    public final static QualifiedName NAME_RENDER_STATE =
-        new QualifiedName(AdtPlugin.PLUGIN_ID, "render");          //$NON-NLS-1$
-
-    private final static String MARKER_FRAMEWORK = "-";            //$NON-NLS-1$
-    private final static String MARKER_PROJECT = "+";              //$NON-NLS-1$
-    private final static String SEP = ":";                         //$NON-NLS-1$
-    private final static String SEP_LOCALE = "-";                  //$NON-NLS-1$
-
-    @NonNull
-    protected ConfigurationChooser mConfigChooser;
-
-    /** The {@link FolderConfiguration} representing the state of the UI controls */
-    @NonNull
-    protected final FolderConfiguration mFullConfig = new FolderConfiguration();
-
-    /** The {@link FolderConfiguration} being edited. */
-    @Nullable
-    protected FolderConfiguration mEditedConfig;
-
-    /** The target of the project of the file being edited. */
-    @Nullable
-    private IAndroidTarget mTarget;
-
-    /** The theme style to render with */
-    @Nullable
-    private String mTheme;
-
-    /** The device to render with */
-    @Nullable
-    private Device mDevice;
-
-    /** The device state */
-    @Nullable
-    private State mState;
-
-    /**
-     * The activity associated with the layout. This is just a cached value of
-     * the true value stored on the layout.
-     */
-    @Nullable
-    private String mActivity;
-
-    /** The locale to use for this configuration */
-    @NonNull
-    private Locale mLocale = Locale.ANY;
-
-    /** UI mode */
-    @NonNull
-    private UiMode mUiMode = UiMode.NORMAL;
-
-    /** Night mode */
-    @NonNull
-    private NightMode mNightMode = NightMode.NOTNIGHT;
-
-    /** The display name */
-    private String mDisplayName;
-
-    /**
-     * Creates a new {@linkplain Configuration}
-     *
-     * @param chooser the associated chooser
-     */
-    protected Configuration(@NonNull ConfigurationChooser chooser) {
-        mConfigChooser = chooser;
-    }
-
-    /**
-     * Sets the associated configuration chooser
-     *
-     * @param chooser the chooser
-     */
-    void setChooser(@NonNull ConfigurationChooser chooser) {
-        // TODO: We should get rid of the binding between configurations
-        // and configuration choosers. This is currently needed because
-        // the choosers contain vital data such as the set of available
-        // rendering targets, the set of available locales etc, which
-        // also doesn't belong inside the configuration but is needed by it.
-        mConfigChooser = chooser;
-    }
-
-    /**
-     * Gets the associated configuration chooser
-     *
-     * @return the chooser
-     */
-    @NonNull
-    ConfigurationChooser getChooser() {
-        return mConfigChooser;
-    }
-
-    /**
-     * Creates a new {@linkplain Configuration}
-     *
-     * @param chooser the associated chooser
-     * @return a new configuration
-     */
-    @NonNull
-    public static Configuration create(@NonNull ConfigurationChooser chooser) {
-        return new Configuration(chooser);
-    }
-
-    /**
-     * Creates a configuration suitable for the given file
-     *
-     * @param base the base configuration to base the file configuration off of
-     * @param file the file to look up a configuration for
-     * @return a suitable configuration
-     */
-    @NonNull
-    public static Configuration create(
-            @NonNull Configuration base,
-            @NonNull IFile file) {
-        Configuration configuration = copy(base);
-        ConfigurationChooser chooser = base.getChooser();
-        ProjectResources resources = chooser.getResources();
-        ConfigurationMatcher matcher = new ConfigurationMatcher(chooser, configuration, file,
-                resources, false);
-
-        ResourceFolder resFolder = ResourceManager.getInstance().getResourceFolder(file);
-        configuration.mEditedConfig = new FolderConfiguration();
-        configuration.mEditedConfig.set(resFolder.getConfiguration());
-
-        matcher.adaptConfigSelection(true /*needBestMatch*/);
-        configuration.syncFolderConfig();
-
-        return configuration;
-    }
-
-    /**
-     * Creates a new {@linkplain Configuration} that is a copy from a different configuration
-     *
-     * @param original the original to copy from
-     * @return a new configuration copied from the original
-     */
-    @NonNull
-    public static Configuration copy(@NonNull Configuration original) {
-        Configuration copy = create(original.mConfigChooser);
-        copy.mFullConfig.set(original.mFullConfig);
-        if (original.mEditedConfig != null) {
-            copy.mEditedConfig = new FolderConfiguration();
-            copy.mEditedConfig.set(original.mEditedConfig);
-        }
-        copy.mTarget = original.getTarget();
-        copy.mTheme = original.getTheme();
-        copy.mDevice = original.getDevice();
-        copy.mState = original.getDeviceState();
-        copy.mActivity = original.getActivity();
-        copy.mLocale = original.getLocale();
-        copy.mUiMode = original.getUiMode();
-        copy.mNightMode = original.getNightMode();
-        copy.mDisplayName = original.getDisplayName();
-
-        return copy;
-    }
-
-    /**
-     * Returns the associated activity
-     *
-     * @return the activity
-     */
-    @Nullable
-    public String getActivity() {
-        return mActivity;
-    }
-
-    /**
-     * Returns the chosen device.
-     *
-     * @return the chosen device
-     */
-    @Nullable
-    public Device getDevice() {
-        return mDevice;
-    }
-
-    /**
-     * Returns the chosen device state
-     *
-     * @return the device state
-     */
-    @Nullable
-    public State getDeviceState() {
-        return mState;
-    }
-
-    /**
-     * Returns the chosen locale
-     *
-     * @return the locale
-     */
-    @NonNull
-    public Locale getLocale() {
-        return mLocale;
-    }
-
-    /**
-     * Returns the UI mode
-     *
-     * @return the UI mode
-     */
-    @NonNull
-    public UiMode getUiMode() {
-        return mUiMode;
-    }
-
-    /**
-     * Returns the day/night mode
-     *
-     * @return the night mode
-     */
-    @NonNull
-    public NightMode getNightMode() {
-        return mNightMode;
-    }
-
-    /**
-     * Returns the current theme style
-     *
-     * @return the theme style
-     */
-    @Nullable
-    public String getTheme() {
-        return mTheme;
-    }
-
-    /**
-     * Returns the rendering target
-     *
-     * @return the target
-     */
-    @Nullable
-    public IAndroidTarget getTarget() {
-        return mTarget;
-    }
-
-    /**
-     * Returns the display name to show for this configuration
-     *
-     * @return the display name, or null if none has been assigned
-     */
-    @Nullable
-    public String getDisplayName() {
-        return mDisplayName;
-    }
-
-    /**
-     * Returns whether the configuration's theme is a project theme.
-     * <p/>
-     * The returned value is meaningless if {@link #getTheme()} returns
-     * <code>null</code>.
-     *
-     * @return true for project a theme, false for a framework theme
-     */
-    public boolean isProjectTheme() {
-        String theme = getTheme();
-        if (theme != null) {
-            assert theme.startsWith(STYLE_RESOURCE_PREFIX)
-                || theme.startsWith(ANDROID_STYLE_RESOURCE_PREFIX);
-
-            return ResourceHelper.isProjectStyle(theme);
-        }
-
-        return false;
-    }
-
-    /**
-     * Returns true if the current layout is locale-specific
-     *
-     * @return if this configuration represents a locale-specific layout
-     */
-    public boolean isLocaleSpecificLayout() {
-        return mEditedConfig == null || mEditedConfig.getLocaleQualifier() != null;
-    }
-
-    /**
-     * Returns the full, complete {@link FolderConfiguration}
-     *
-     * @return the full configuration
-     */
-    @NonNull
-    public FolderConfiguration getFullConfig() {
-        return mFullConfig;
-    }
-
-    /**
-     * Copies the full, complete {@link FolderConfiguration} into the given
-     * folder config instance.
-     *
-     * @param dest the {@link FolderConfiguration} instance to copy into
-     */
-    public void copyFullConfig(FolderConfiguration dest) {
-        dest.set(mFullConfig);
-    }
-
-    /**
-     * Returns the edited {@link FolderConfiguration} (this is not a full
-     * configuration, so you can think of it as the "constraints" used by the
-     * {@link ConfigurationMatcher} to produce a full configuration.
-     *
-     * @return the constraints configuration
-     */
-    @NonNull
-    public FolderConfiguration getEditedConfig() {
-        return mEditedConfig;
-    }
-
-    /**
-     * Sets the edited {@link FolderConfiguration} (this is not a full
-     * configuration, so you can think of it as the "constraints" used by the
-     * {@link ConfigurationMatcher} to produce a full configuration.
-     *
-     * @param editedConfig the constraints configuration
-     */
-    public void setEditedConfig(@NonNull FolderConfiguration editedConfig) {
-        mEditedConfig = editedConfig;
-    }
-
-    /**
-     * Sets the associated activity
-     *
-     * @param activity the activity
-     */
-    public void setActivity(String activity) {
-        mActivity = activity;
-    }
-
-    /**
-     * Sets the device
-     *
-     * @param device the device
-     * @param skipSync if true, don't sync folder configuration (typically because
-     *   you are going to set other configuration parameters and you'll call
-     *   {@link #syncFolderConfig()} once at the end)
-     */
-    public void setDevice(Device device, boolean skipSync) {
-        mDevice = device;
-
-        if (!skipSync) {
-            syncFolderConfig();
-        }
-    }
-
-    /**
-     * Sets the device state
-     *
-     * @param state the device state
-     * @param skipSync if true, don't sync folder configuration (typically because
-     *   you are going to set other configuration parameters and you'll call
-     *   {@link #syncFolderConfig()} once at the end)
-     */
-    public void setDeviceState(State state, boolean skipSync) {
-        mState = state;
-
-        if (!skipSync) {
-            syncFolderConfig();
-        }
-    }
-
-    /**
-     * Sets the locale
-     *
-     * @param locale the locale
-     * @param skipSync if true, don't sync folder configuration (typically because
-     *   you are going to set other configuration parameters and you'll call
-     *   {@link #syncFolderConfig()} once at the end)
-     */
-    public void setLocale(@NonNull Locale locale, boolean skipSync) {
-        mLocale = locale;
-
-        if (!skipSync) {
-            syncFolderConfig();
-        }
-    }
-
-    /**
-     * Sets the rendering target
-     *
-     * @param target rendering target
-     * @param skipSync if true, don't sync folder configuration (typically because
-     *   you are going to set other configuration parameters and you'll call
-     *   {@link #syncFolderConfig()} once at the end)
-     */
-    public void setTarget(IAndroidTarget target, boolean skipSync) {
-        mTarget = target;
-
-        if (!skipSync) {
-            syncFolderConfig();
-        }
-    }
-
-    /**
-     * Sets the display name to be shown for this configuration.
-     *
-     * @param displayName the new display name
-     */
-    public void setDisplayName(@Nullable String displayName) {
-        mDisplayName = displayName;
-    }
-
-    /**
-     * Sets the night mode
-     *
-     * @param night the night mode
-     * @param skipSync if true, don't sync folder configuration (typically because
-     *   you are going to set other configuration parameters and you'll call
-     *   {@link #syncFolderConfig()} once at the end)
-     */
-    public void setNightMode(@NonNull NightMode night, boolean skipSync) {
-        mNightMode = night;
-
-        if (!skipSync) {
-            syncFolderConfig();
-        }
-    }
-
-    /**
-     * Sets the UI mode
-     *
-     * @param uiMode the UI mode
-     * @param skipSync if true, don't sync folder configuration (typically because
-     *   you are going to set other configuration parameters and you'll call
-     *   {@link #syncFolderConfig()} once at the end)
-     */
-    public void setUiMode(@NonNull UiMode uiMode, boolean skipSync) {
-        mUiMode = uiMode;
-
-        if (!skipSync) {
-            syncFolderConfig();
-        }
-    }
-
-    /**
-     * Sets the theme style
-     *
-     * @param theme the theme
-     */
-    public void setTheme(String theme) {
-        mTheme = theme;
-        checkThemePrefix();
-    }
-
-    /**
-     * Updates the folder configuration such that it reflects changes in
-     * configuration state such as the device orientation, the UI mode, the
-     * rendering target, etc.
-     */
-    public void syncFolderConfig() {
-        Device device = getDevice();
-        if (device == null) {
-            return;
-        }
-
-        // get the device config from the device/state combos.
-        FolderConfiguration config = DeviceConfigHelper.getFolderConfig(getDeviceState());
-
-        // replace the config with the one from the device
-        mFullConfig.set(config);
-
-        // sync the selected locale
-        Locale locale = getLocale();
-        mFullConfig.setLocaleQualifier(locale.qualifier);
-        if (!locale.hasLanguage()) {
-            // Avoid getting the layout library if the locale doesn't have any language.
-            mFullConfig.setLayoutDirectionQualifier(
-                    new LayoutDirectionQualifier(LayoutDirection.LTR));
-        } else {
-            Sdk currentSdk = Sdk.getCurrent();
-            if (currentSdk != null) {
-                AndroidTargetData targetData = currentSdk.getTargetData(getTarget());
-                if (targetData != null) {
-                    LayoutLibrary layoutLib = targetData.getLayoutLibrary();
-                    if (layoutLib != null) {
-                        if (layoutLib.isRtl(locale.toLocaleId())) {
-                            mFullConfig.setLayoutDirectionQualifier(
-                                    new LayoutDirectionQualifier(LayoutDirection.RTL));
-                        } else {
-                            mFullConfig.setLayoutDirectionQualifier(
-                                    new LayoutDirectionQualifier(LayoutDirection.LTR));
-                        }
-                    }
-                }
-            }
-        }
-
-        // Replace the UiMode with the selected one, if one is selected
-        UiMode uiMode = getUiMode();
-        if (uiMode != null) {
-            mFullConfig.setUiModeQualifier(new UiModeQualifier(uiMode));
-        }
-
-        // Replace the NightMode with the selected one, if one is selected
-        NightMode nightMode = getNightMode();
-        if (nightMode != null) {
-            mFullConfig.setNightModeQualifier(new NightModeQualifier(nightMode));
-        }
-
-        // replace the API level by the selection of the combo
-        IAndroidTarget target = getTarget();
-        if (target == null && mConfigChooser != null) {
-            target = mConfigChooser.getProjectTarget();
-        }
-        if (target != null) {
-            int apiLevel = target.getVersion().getApiLevel();
-            mFullConfig.setVersionQualifier(new VersionQualifier(apiLevel));
-        }
-    }
-
-    /**
-     * Creates a string suitable for persistence, which can be initialized back
-     * to a configuration via {@link #initialize(String)}
-     *
-     * @return a persistent string
-     */
-    @NonNull
-    public String toPersistentString() {
-        StringBuilder sb = new StringBuilder(32);
-        Device device = getDevice();
-        if (device != null) {
-            sb.append(device.getName());
-            sb.append(SEP);
-            State state = getDeviceState();
-            if (state != null) {
-                sb.append(state.getName());
-            }
-            sb.append(SEP);
-            Locale locale = getLocale();
-            if (isLocaleSpecificLayout() && locale != null && locale.qualifier.hasLanguage()) {
-                // locale[0]/[1] can be null sometimes when starting Eclipse
-                sb.append(locale.qualifier.getLanguage());
-                sb.append(SEP_LOCALE);
-                if (locale.qualifier.hasRegion()) {
-                    sb.append(locale.qualifier.getRegion());
-                }
-            }
-            sb.append(SEP);
-            // Need to escape the theme: if we write the full theme style, then
-            // we can end up with ":"'s in the string (as in @android:style/Theme) which
-            // can be mistaken for {@link #SEP}. Instead use {@link #MARKER_FRAMEWORK}.
-            String theme = getTheme();
-            if (theme != null) {
-                String themeName = ResourceHelper.styleToTheme(theme);
-                if (theme.startsWith(STYLE_RESOURCE_PREFIX)) {
-                    sb.append(MARKER_PROJECT);
-                } else if (theme.startsWith(ANDROID_STYLE_RESOURCE_PREFIX)) {
-                    sb.append(MARKER_FRAMEWORK);
-                }
-                sb.append(themeName);
-            }
-            sb.append(SEP);
-            UiMode uiMode = getUiMode();
-            if (uiMode != null) {
-                sb.append(uiMode.getResourceValue());
-            }
-            sb.append(SEP);
-            NightMode nightMode = getNightMode();
-            if (nightMode != null) {
-                sb.append(nightMode.getResourceValue());
-            }
-            sb.append(SEP);
-
-            // We used to store the render target here in R9. Leave a marker
-            // to ensure that we don't reuse this slot; add new extra fields after it.
-            sb.append(SEP);
-            String activity = getActivity();
-            if (activity != null) {
-                sb.append(activity);
-            }
-        }
-
-        return sb.toString();
-    }
-
-    /** Returns the preferred theme, or null */
-    @Nullable
-    String computePreferredTheme() {
-        IProject project = mConfigChooser.getProject();
-        ManifestInfo manifest = ManifestInfo.get(project);
-
-        // Look up the screen size for the current state
-        ScreenSize screenSize = null;
-        Device device = getDevice();
-        if (device != null) {
-            List<State> states = device.getAllStates();
-            for (State state : states) {
-                FolderConfiguration folderConfig = DeviceConfigHelper.getFolderConfig(state);
-                if (folderConfig != null) {
-                    ScreenSizeQualifier qualifier = folderConfig.getScreenSizeQualifier();
-                    screenSize = qualifier.getValue();
-                    break;
-                }
-            }
-        }
-
-        // Look up the default/fallback theme to use for this project (which
-        // depends on the screen size when no particular theme is specified
-        // in the manifest)
-        String defaultTheme = manifest.getDefaultTheme(getTarget(), screenSize);
-
-        String preferred = defaultTheme;
-        if (getTheme() == null) {
-            // If we are rendering a layout in included context, pick the theme
-            // from the outer layout instead
-
-            String activity = getActivity();
-            if (activity != null) {
-                ActivityAttributes attributes = manifest.getActivityAttributes(activity);
-                if (attributes != null) {
-                    preferred = attributes.getTheme();
-                }
-            }
-            if (preferred == null) {
-                preferred = defaultTheme;
-            }
-            setTheme(preferred);
-        }
-
-        return preferred;
-    }
-
-    private void checkThemePrefix() {
-        if (mTheme != null && !mTheme.startsWith(PREFIX_RESOURCE_REF)) {
-            if (mTheme.isEmpty()) {
-                computePreferredTheme();
-                return;
-            }
-            ResourceRepository frameworkRes = mConfigChooser.getClient().getFrameworkResources();
-            if (frameworkRes != null
-                    && frameworkRes.hasResourceItem(ANDROID_STYLE_RESOURCE_PREFIX + mTheme)) {
-                mTheme = ANDROID_STYLE_RESOURCE_PREFIX + mTheme;
-            } else {
-                mTheme = STYLE_RESOURCE_PREFIX + mTheme;
-            }
-        }
-    }
-
-    /**
-     * Initializes a string previously created with
-     * {@link #toPersistentString()}
-     *
-     * @param data the string to initialize back from
-     * @return true if the configuration was initialized
-     */
-    boolean initialize(String data) {
-        String[] values = data.split(SEP);
-        if (values.length >= 6 && values.length <= 8) {
-            for (Device d : mConfigChooser.getDevices()) {
-                if (d.getName().equals(values[0])) {
-                    mDevice = d;
-                    String stateName = null;
-                    FolderConfiguration config = null;
-                    if (!values[1].isEmpty() && !values[1].equals("null")) { //$NON-NLS-1$
-                        stateName = values[1];
-                        config = DeviceConfigHelper.getFolderConfig(mDevice, stateName);
-                    } else if (mDevice.getAllStates().size() > 0) {
-                        State first = mDevice.getAllStates().get(0);
-                        stateName = first.getName();
-                        config = DeviceConfigHelper.getFolderConfig(first);
-                    }
-                    mState = getState(mDevice, stateName);
-                    if (config != null) {
-                        // Load locale. Note that this can get overwritten by the
-                        // project-wide settings read below.
-                        LocaleQualifier locale = Locale.ANY_QUALIFIER;
-                        String locales[] = values[2].split(SEP_LOCALE);
-                        if (locales.length >= 2 && locales[0].length() > 0
-                                && !LocaleQualifier.FAKE_VALUE.equals(locales[0])) {
-                            String language = locales[0];
-                            String region = locales[1];
-                            if (region.length() > 0 && !LocaleQualifier.FAKE_VALUE.equals(region)) {
-                                locale = LocaleQualifier.getQualifier(language + "-r" + region);
-                            } else {
-                                locale = new LocaleQualifier(language);
-                            }
-                            mLocale = Locale.create(locale);
-                        }
-
-                        // Decode the theme name: See {@link #getData}
-                        mTheme = values[3];
-                        if (mTheme.startsWith(MARKER_FRAMEWORK)) {
-                            mTheme = ANDROID_STYLE_RESOURCE_PREFIX
-                                    + mTheme.substring(MARKER_FRAMEWORK.length());
-                        } else if (mTheme.startsWith(MARKER_PROJECT)) {
-                            mTheme = STYLE_RESOURCE_PREFIX
-                                    + mTheme.substring(MARKER_PROJECT.length());
-                        } else {
-                            checkThemePrefix();
-                        }
-
-                        mUiMode = UiMode.getEnum(values[4]);
-                        if (mUiMode == null) {
-                            mUiMode = UiMode.NORMAL;
-                        }
-                        mNightMode = NightMode.getEnum(values[5]);
-                        if (mNightMode == null) {
-                            mNightMode = NightMode.NOTNIGHT;
-                        }
-
-                        // element 7/values[6]: used to store render target in R9.
-                        // No longer stored here. If adding more data, make
-                        // sure you leave 7 alone.
-
-                        Pair<Locale, IAndroidTarget> pair = loadRenderState(mConfigChooser);
-                        if (pair != null) {
-                            // We only use the "global" setting
-                            if (!isLocaleSpecificLayout()) {
-                                mLocale = pair.getFirst();
-                            }
-                            mTarget = pair.getSecond();
-                        }
-
-                        if (values.length == 8) {
-                            mActivity = values[7];
-                        }
-
-                        return true;
-                    }
-                }
-            }
-        }
-
-        return false;
-    }
-
-    /**
-     * Loads the render state (the locale and the render target, which are shared among
-     * all the layouts meaning that changing it in one will change it in all) and returns
-     * the current project-wide locale and render target to be used.
-     *
-     * @param chooser the {@link ConfigurationChooser} providing information about
-     *     loaded targets
-     * @return a pair of a locale and a render target
-     */
-    @Nullable
-    static Pair<Locale, IAndroidTarget> loadRenderState(ConfigurationChooser chooser) {
-        IProject project = chooser.getProject();
-        if (project == null || !project.isAccessible()) {
-            return null;
-        }
-
-        try {
-            String data = project.getPersistentProperty(NAME_RENDER_STATE);
-            if (data != null) {
-                Locale locale = Locale.ANY;
-                IAndroidTarget target = null;
-
-                String[] values = data.split(SEP);
-                if (values.length == 2) {
-
-                    LocaleQualifier qualifier = Locale.ANY_QUALIFIER;
-                    String locales[] = values[0].split(SEP_LOCALE);
-                    if (locales.length >= 2 && locales[0].length() > 0
-                            && !LocaleQualifier.FAKE_VALUE.equals(locales[0])) {
-                        String language = locales[0];
-                        String region = locales[1];
-                        if (region.length() > 0 && !LocaleQualifier.FAKE_VALUE.equals(region)) {
-                            locale = Locale.create(LocaleQualifier.getQualifier(language + "-r" + region));
-                        } else {
-                            locale = Locale.create(new LocaleQualifier(language));
-                        }
-                    } else {
-                        locale = Locale.ANY;
-                    }
-                    if (AdtPrefs.getPrefs().isAutoPickRenderTarget()) {
-                        target = ConfigurationMatcher.findDefaultRenderTarget(chooser);
-                    } else {
-                        String targetString = values[1];
-                        target = stringToTarget(chooser, targetString);
-                        // See if we should "correct" the rendering target to a
-                        // better version. If you're using a pre-release version
-                        // of the render target, and a final release is
-                        // available and installed, we should switch to that
-                        // one instead.
-                        if (target != null) {
-                            AndroidVersion version = target.getVersion();
-                            List<IAndroidTarget> targetList = chooser.getTargetList();
-                            if (version.getCodename() != null && targetList != null) {
-                                int targetApiLevel = version.getApiLevel() + 1;
-                                for (IAndroidTarget t : targetList) {
-                                    if (t.getVersion().getApiLevel() == targetApiLevel
-                                            && t.isPlatform()) {
-                                        target = t;
-                                        break;
-                                    }
-                                }
-                            }
-                        } else {
-                            target = ConfigurationMatcher.findDefaultRenderTarget(chooser);
-                        }
-                    }
-                }
-
-                return Pair.of(locale, target);
-            }
-
-            return Pair.of(Locale.ANY, ConfigurationMatcher.findDefaultRenderTarget(chooser));
-        } catch (CoreException e) {
-            AdtPlugin.log(e, null);
-        }
-
-        return null;
-    }
-
-    /**
-     * Saves the render state (the current locale and render target settings) into the
-     * project wide settings storage
-     */
-    void saveRenderState() {
-        IProject project = mConfigChooser.getProject();
-        if (project == null) {
-            return;
-        }
-        try {
-            // Generate a persistent string from locale+target
-            StringBuilder sb = new StringBuilder(32);
-            Locale locale = getLocale();
-            if (locale != null) {
-                // locale[0]/[1] can be null sometimes when starting Eclipse
-                sb.append(locale.qualifier.getLanguage());
-                sb.append(SEP_LOCALE);
-                if (locale.qualifier.hasRegion()) {
-                    sb.append(locale.qualifier.getRegion());
-                }
-            }
-            sb.append(SEP);
-            IAndroidTarget target = getTarget();
-            if (target != null) {
-                sb.append(targetToString(target));
-                sb.append(SEP);
-            }
-
-            project.setPersistentProperty(NAME_RENDER_STATE, sb.toString());
-        } catch (CoreException e) {
-            AdtPlugin.log(e, null);
-        }
-    }
-
-    /**
-     * Returns a String id to represent an {@link IAndroidTarget} which can be translated
-     * back to an {@link IAndroidTarget} by the matching {@link #stringToTarget}. The id
-     * will never contain the {@link #SEP} character.
-     *
-     * @param target the target to return an id for
-     * @return an id for the given target; never null
-     */
-    @NonNull
-    public static String targetToString(@NonNull IAndroidTarget target) {
-        return target.getFullName().replace(SEP, "");  //$NON-NLS-1$
-    }
-
-    /**
-     * Returns an {@link IAndroidTarget} that corresponds to the given id that was
-     * originally returned by {@link #targetToString}. May be null, if the platform is no
-     * longer available, or if the platform list has not yet been initialized.
-     *
-     * @param chooser the {@link ConfigurationChooser} providing information about
-     *     loaded targets
-     * @param id the id that corresponds to the desired platform
-     * @return an {@link IAndroidTarget} that matches the given id, or null
-     */
-    @Nullable
-    public static IAndroidTarget stringToTarget(
-            @NonNull ConfigurationChooser chooser,
-            @NonNull String id) {
-        List<IAndroidTarget> targetList = chooser.getTargetList();
-        if (targetList != null && targetList.size() > 0) {
-            for (IAndroidTarget target : targetList) {
-                if (id.equals(targetToString(target))) {
-                    return target;
-                }
-            }
-        }
-
-        return null;
-    }
-
-    /**
-     * Returns an {@link IAndroidTarget} that corresponds to the given id that was
-     * originally returned by {@link #targetToString}. May be null, if the platform is no
-     * longer available, or if the platform list has not yet been initialized.
-     *
-     * @param id the id that corresponds to the desired platform
-     * @return an {@link IAndroidTarget} that matches the given id, or null
-     */
-    @Nullable
-    public static IAndroidTarget stringToTarget(
-            @NonNull String id) {
-        Sdk currentSdk = Sdk.getCurrent();
-        if (currentSdk != null) {
-            IAndroidTarget[] targets = currentSdk.getTargets();
-            for (IAndroidTarget target : targets) {
-                if (id.equals(targetToString(target))) {
-                    return target;
-                }
-            }
-        }
-
-        return null;
-    }
-
-    /**
-     * Returns the {@link State} by the given name for the given {@link Device}
-     *
-     * @param device the device
-     * @param name the name of the state
-     */
-    @Nullable
-    static State getState(@Nullable Device device, @Nullable String name) {
-        if (device == null) {
-            return null;
-        } else if (name != null) {
-            State state = device.getState(name);
-            if (state != null) {
-                return state;
-            }
-        }
-
-        return device.getDefaultState();
-    }
-
-    /**
-     * Returns the currently selected {@link Density}. This is guaranteed to be non null.
-     *
-     * @return the density
-     */
-    @NonNull
-    public Density getDensity() {
-        if (mFullConfig != null) {
-            DensityQualifier qual = mFullConfig.getDensityQualifier();
-            if (qual != null) {
-                // just a sanity check
-                Density d = qual.getValue();
-                if (d != Density.NODPI) {
-                    return d;
-                }
-            }
-        }
-
-        // no config? return medium as the default density.
-        return Density.MEDIUM;
-    }
-
-    /**
-     * Get the next cyclical state after the given state
-     *
-     * @param from the state to start with
-     * @return the following state following
-     */
-    @Nullable
-    public State getNextDeviceState(@Nullable State from) {
-        Device device = getDevice();
-        if (device == null) {
-            return null;
-        }
-        List<State> states = device.getAllStates();
-        for (int i = 0; i < states.size(); i++) {
-            if (states.get(i) == from) {
-                return states.get((i + 1) % states.size());
-            }
-        }
-
-        return null;
-    }
-
-    /**
-     * Returns true if this configuration supports the given rendering
-     * capability
-     *
-     * @param capability the capability to check
-     * @return true if the capability is supported
-     */
-    public boolean supports(Capability capability) {
-        IAndroidTarget target = getTarget();
-        if (target != null) {
-            return RenderService.supports(target, capability);
-        }
-
-        return false;
-    }
-
-    @Override
-    public String toString() {
-        return Objects.toStringHelper(this.getClass())
-                .add("display", getDisplayName())                 //$NON-NLS-1$
-                .add("persistent", toPersistentString())          //$NON-NLS-1$
-                .toString();
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/configuration/ConfigurationChooser.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/configuration/ConfigurationChooser.java
deleted file mode 100644
index 009b864..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/configuration/ConfigurationChooser.java
+++ /dev/null
@@ -1,2096 +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.ide.eclipse.adt.internal.editors.layout.configuration;
-
-import static com.android.SdkConstants.ANDROID_NS_NAME_PREFIX;
-import static com.android.SdkConstants.ANDROID_STYLE_RESOURCE_PREFIX;
-import static com.android.SdkConstants.ATTR_CONTEXT;
-import static com.android.SdkConstants.PREFIX_RESOURCE_REF;
-import static com.android.SdkConstants.RES_QUALIFIER_SEP;
-import static com.android.SdkConstants.STYLE_RESOURCE_PREFIX;
-import static com.android.SdkConstants.TOOLS_URI;
-import static com.android.ide.eclipse.adt.AdtUtils.isUiThread;
-import static com.android.ide.eclipse.adt.internal.editors.layout.configuration.Configuration.CFG_DEVICE;
-import static com.android.ide.eclipse.adt.internal.editors.layout.configuration.Configuration.CFG_DEVICE_STATE;
-import static com.android.ide.eclipse.adt.internal.editors.layout.configuration.Configuration.CFG_FOLDER;
-import static com.android.ide.eclipse.adt.internal.editors.layout.configuration.Configuration.CFG_LOCALE;
-import static com.android.ide.eclipse.adt.internal.editors.layout.configuration.Configuration.CFG_TARGET;
-import static com.android.ide.eclipse.adt.internal.editors.layout.configuration.Configuration.CFG_THEME;
-import static com.android.ide.eclipse.adt.internal.editors.layout.configuration.Configuration.MASK_ALL;
-import static com.google.common.base.Objects.equal;
-
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-import com.android.ide.common.rendering.api.ResourceValue;
-import com.android.ide.common.rendering.api.StyleResourceValue;
-import com.android.ide.common.resources.LocaleManager;
-import com.android.ide.common.resources.ResourceFile;
-import com.android.ide.common.resources.ResourceFolder;
-import com.android.ide.common.resources.ResourceRepository;
-import com.android.ide.common.resources.configuration.DeviceConfigHelper;
-import com.android.ide.common.resources.configuration.FolderConfiguration;
-import com.android.ide.common.resources.configuration.LocaleQualifier;
-import com.android.ide.common.resources.configuration.ResourceQualifier;
-import com.android.ide.common.sdk.LoadStatus;
-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.ide.eclipse.adt.internal.editors.common.CommonXmlDelegate;
-import com.android.ide.eclipse.adt.internal.editors.common.CommonXmlEditor;
-import com.android.ide.eclipse.adt.internal.editors.layout.LayoutEditorDelegate;
-import com.android.ide.eclipse.adt.internal.editors.layout.gle2.DomUtilities;
-import com.android.ide.eclipse.adt.internal.editors.layout.gle2.GraphicalEditorPart;
-import com.android.ide.eclipse.adt.internal.editors.layout.gle2.IncludeFinder.Reference;
-import com.android.ide.eclipse.adt.internal.editors.layout.gle2.LayoutCanvas;
-import com.android.ide.eclipse.adt.internal.editors.manifest.ManifestInfo;
-import com.android.ide.eclipse.adt.internal.editors.manifest.ManifestInfo.ActivityAttributes;
-import com.android.ide.eclipse.adt.internal.resources.ResourceHelper;
-import com.android.ide.eclipse.adt.internal.resources.manager.ProjectResources;
-import com.android.ide.eclipse.adt.internal.resources.manager.ResourceManager;
-import com.android.ide.eclipse.adt.internal.sdk.AndroidTargetData;
-import com.android.ide.eclipse.adt.internal.sdk.Sdk;
-import com.android.resources.ResourceType;
-import com.android.resources.ScreenOrientation;
-import com.android.sdklib.AndroidVersion;
-import com.android.sdklib.IAndroidTarget;
-import com.android.sdklib.devices.Device;
-import com.android.sdklib.devices.DeviceManager;
-import com.android.sdklib.devices.DeviceManager.DevicesChangedListener;
-import com.android.sdklib.devices.State;
-import com.android.utils.Pair;
-import com.google.common.base.Objects;
-import com.google.common.base.Strings;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IFolder;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.DisposeEvent;
-import org.eclipse.swt.events.DisposeListener;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.ToolBar;
-import org.eclipse.swt.widgets.ToolItem;
-import org.eclipse.ui.IEditorPart;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.IdentityHashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.SortedSet;
-
-/**
- * The {@linkplain ConfigurationChooser} allows the user to pick a
- * {@link Configuration} by configuring various constraints.
- */
-public class ConfigurationChooser extends Composite
-        implements DevicesChangedListener, DisposeListener {
-    private static final String ICON_SQUARE = "square";           //$NON-NLS-1$
-    private static final String ICON_LANDSCAPE = "landscape";     //$NON-NLS-1$
-    private static final String ICON_PORTRAIT = "portrait";       //$NON-NLS-1$
-    private static final String ICON_LANDSCAPE_FLIP = "flip_landscape";//$NON-NLS-1$
-    private static final String ICON_PORTRAIT_FLIP = "flip_portrait";//$NON-NLS-1$
-    private static final String ICON_DISPLAY = "display";         //$NON-NLS-1$
-    private static final String ICON_THEMES = "themes";           //$NON-NLS-1$
-    private static final String ICON_ACTIVITY = "activity";       //$NON-NLS-1$
-
-    /** The configuration state associated with this editor */
-    private @NonNull Configuration mConfiguration = Configuration.create(this);
-
-    /** Serialized state to use when initializing the configuration after the SDK is loaded */
-    private String mInitialState;
-
-    /** The client of the configuration editor */
-    private final ConfigurationClient mClient;
-
-    /** Counter for programmatic UI changes: if greater than 0, we're within a call */
-    private int mDisableUpdates = 0;
-
-    /** List of available devices */
-    private Collection<Device> mDevices = Collections.emptyList();
-
-    /** List of available targets */
-    private final List<IAndroidTarget> mTargetList = new ArrayList<IAndroidTarget>();
-
-    /** List of available themes */
-    private final List<String> mThemeList = new ArrayList<String>();
-
-    /** List of available locales */
-    private final List<Locale > mLocaleList = new ArrayList<Locale>();
-
-    /** The file being edited */
-    private IFile mEditedFile;
-
-    /** The {@link ProjectResources} for the edited file's project */
-    private ProjectResources mResources;
-
-    /** The target of the project of the file being edited. */
-    private IAndroidTarget mProjectTarget;
-
-    /** Dropdown for configurations */
-    private ToolItem mConfigCombo;
-
-    /** Dropdown for devices */
-    private ToolItem mDeviceCombo;
-
-    /** Dropdown for device states */
-    private ToolItem mOrientationCombo;
-
-    /** Dropdown for themes */
-    private ToolItem mThemeCombo;
-
-    /** Dropdown for locales */
-    private ToolItem mLocaleCombo;
-
-    /** Dropdown for activities */
-    private ToolItem mActivityCombo;
-
-    /** Dropdown for rendering targets */
-    private ToolItem mTargetCombo;
-
-    /** Whether the SDK has changed since the last model reload; if so we must reload targets */
-    private boolean mSdkChanged = true;
-
-    /**
-     * Creates a new {@linkplain ConfigurationChooser} and adds it to the
-     * parent. The method also receives custom buttons to set into the
-     * configuration composite. The list is organized as an array of arrays.
-     * Each array represents a group of buttons thematically grouped together.
-     *
-     * @param client the client embedding this configuration chooser
-     * @param parent The parent composite.
-     * @param initialState The initial state (serialized form) to use for the
-     *            configuration
-     */
-    public ConfigurationChooser(
-            @NonNull ConfigurationClient client,
-            Composite parent,
-            @Nullable String initialState) {
-        super(parent, SWT.NONE);
-        mClient = client;
-
-        setVisible(false); // Delayed until the targets are loaded
-
-        mInitialState = initialState;
-        setLayout(new GridLayout(1, false));
-
-        IconFactory icons = IconFactory.getInstance();
-
-        // TODO: Consider switching to a CoolBar instead
-        ToolBar toolBar = new ToolBar(this, SWT.WRAP | SWT.FLAT | SWT.RIGHT | SWT.HORIZONTAL);
-        toolBar.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
-
-        mConfigCombo = new ToolItem(toolBar, SWT.DROP_DOWN );
-        mConfigCombo.setImage(icons.getIcon("android_file")); //$NON-NLS-1$
-        mConfigCombo.setToolTipText("Configuration to render this layout with in Eclipse");
-
-        @SuppressWarnings("unused")
-        ToolItem separator2 = new ToolItem(toolBar, SWT.SEPARATOR);
-
-        mDeviceCombo = new ToolItem(toolBar, SWT.DROP_DOWN);
-        mDeviceCombo.setImage(icons.getIcon(ICON_DISPLAY));
-
-        @SuppressWarnings("unused")
-        ToolItem separator3 = new ToolItem(toolBar, SWT.SEPARATOR);
-
-        mOrientationCombo = new ToolItem(toolBar, SWT.DROP_DOWN);
-        mOrientationCombo.setImage(icons.getIcon(ICON_PORTRAIT));
-        mOrientationCombo.setToolTipText("Go to next state");
-
-        @SuppressWarnings("unused")
-        ToolItem separator4 = new ToolItem(toolBar, SWT.SEPARATOR);
-
-        mThemeCombo = new ToolItem(toolBar, SWT.DROP_DOWN);
-        mThemeCombo.setImage(icons.getIcon(ICON_THEMES));
-
-        @SuppressWarnings("unused")
-        ToolItem separator5 = new ToolItem(toolBar, SWT.SEPARATOR);
-
-        mActivityCombo = new ToolItem(toolBar, SWT.DROP_DOWN);
-        mActivityCombo.setToolTipText("Associated activity or fragment providing context");
-        // The JDT class icon is lopsided, presumably because they've left room in the
-        // bottom right corner for badges (for static, final etc). Unfortunately, this
-        // means that the icon looks out of place when sitting close to the language globe
-        // icon, the theme icon, etc so that it looks vertically misaligned:
-        //mActivityCombo.setImage(JavaUI.getSharedImages().getImage(ISharedImages.IMG_OBJS_CLASS));
-        // ...so use one that is centered instead:
-        mActivityCombo.setImage(icons.getIcon(ICON_ACTIVITY));
-
-        @SuppressWarnings("unused")
-        ToolItem separator6 = new ToolItem(toolBar, SWT.SEPARATOR);
-
-        //ToolBar rightToolBar = new ToolBar(this, SWT.WRAP | SWT.FLAT | SWT.RIGHT | SWT.HORIZONTAL);
-        //rightToolBar.setLayoutData(new GridData(SWT.LEFT, SWT.TOP, false, false, 1, 1));
-        ToolBar rightToolBar = toolBar;
-
-        mLocaleCombo = new ToolItem(rightToolBar, SWT.DROP_DOWN);
-        mLocaleCombo.setImage(FlagManager.getGlobeIcon());
-        mLocaleCombo.setToolTipText("Locale to use when rendering layouts in Eclipse");
-
-        @SuppressWarnings("unused")
-        ToolItem separator7 = new ToolItem(rightToolBar, SWT.SEPARATOR);
-
-        mTargetCombo = new ToolItem(rightToolBar, SWT.DROP_DOWN);
-        mTargetCombo.setImage(AdtPlugin.getAndroidLogo());
-        mTargetCombo.setToolTipText("Android version to use when rendering layouts in Eclipse");
-
-        SelectionListener listener = new SelectionAdapter() {
-            @Override
-            public void widgetSelected(SelectionEvent e) {
-                Object source = e.getSource();
-
-                if (source == mConfigCombo) {
-                    ConfigurationMenuListener.show(ConfigurationChooser.this, mConfigCombo);
-                } else if (source == mActivityCombo) {
-                    ActivityMenuListener.show(ConfigurationChooser.this, mActivityCombo);
-                } else if (source == mLocaleCombo) {
-                    LocaleMenuListener.show(ConfigurationChooser.this, mLocaleCombo);
-                } else if (source == mDeviceCombo) {
-                    DeviceMenuListener.show(ConfigurationChooser.this, mDeviceCombo);
-                } else if (source == mTargetCombo) {
-                    TargetMenuListener.show(ConfigurationChooser.this, mTargetCombo);
-                } else if (source == mThemeCombo) {
-                    ThemeMenuAction.showThemeMenu(ConfigurationChooser.this, mThemeCombo,
-                            mThemeList);
-                } else if (source == mOrientationCombo) {
-                    if (e.detail == SWT.ARROW) {
-                        OrientationMenuAction.showMenu(ConfigurationChooser.this,
-                                mOrientationCombo);
-                    } else {
-                        gotoNextState();
-                    }
-                }
-            }
-        };
-        mConfigCombo.addSelectionListener(listener);
-        mActivityCombo.addSelectionListener(listener);
-        mLocaleCombo.addSelectionListener(listener);
-        mDeviceCombo.addSelectionListener(listener);
-        mTargetCombo.addSelectionListener(listener);
-        mThemeCombo.addSelectionListener(listener);
-        mOrientationCombo.addSelectionListener(listener);
-
-        addDisposeListener(this);
-
-        initDevices();
-        initTargets();
-    }
-
-    /**
-     * Returns the edited file
-     *
-     * @return the file
-     */
-    @Nullable
-    public IFile getEditedFile() {
-        return mEditedFile;
-    }
-
-    /**
-     * Returns the project of the edited file
-     *
-     * @return the project
-     */
-    @Nullable
-    public IProject getProject() {
-        if (mEditedFile != null) {
-            return mEditedFile.getProject();
-        } else {
-            return null;
-        }
-    }
-
-    ConfigurationClient getClient() {
-        return mClient;
-    }
-
-    /**
-     * Returns the project resources for the project being configured by this
-     * chooser
-     *
-     * @return the project resources
-     */
-    @Nullable
-    public ProjectResources getResources() {
-        return mResources;
-    }
-
-    /**
-     * Returns the full, complete {@link FolderConfiguration}
-     *
-     * @return the full configuration
-     */
-    public FolderConfiguration getFullConfiguration() {
-        return mConfiguration.getFullConfig();
-    }
-
-    /**
-     * Returns the project target
-     *
-     * @return the project target
-     */
-    public IAndroidTarget getProjectTarget() {
-        return mProjectTarget;
-    }
-
-    /**
-     * Returns the configuration being edited by this {@linkplain ConfigurationChooser}
-     *
-     * @return the configuration
-     */
-    public Configuration getConfiguration() {
-        return mConfiguration;
-    }
-
-    /**
-     * Returns the list of locales
-     * @return a list of {@link ResourceQualifier} pairs
-     */
-    @NonNull
-    public List<Locale> getLocaleList() {
-        return mLocaleList;
-    }
-
-    /**
-     * Returns the list of available devices
-     *
-     * @return a list of {@link Device} objects
-     */
-    @NonNull
-    public Collection<Device> getDevices() {
-        return mDevices;
-    }
-
-    /**
-     * Returns the list of available render targets
-     *
-     * @return a list of {@link IAndroidTarget} objects
-     */
-    @NonNull
-    public List<IAndroidTarget> getTargetList() {
-        return mTargetList;
-    }
-
-    // ---- Configuration State Lookup ----
-
-    /**
-     * Returns the rendering target to be used
-     *
-     * @return the target
-     */
-    @NonNull
-    public IAndroidTarget getTarget() {
-        IAndroidTarget target = mConfiguration.getTarget();
-        if (target == null) {
-            target = mProjectTarget;
-        }
-
-        return target;
-    }
-
-    /**
-     * Returns the current device string, or null if no device is selected
-     *
-     * @return the device name, or null
-     */
-    @Nullable
-    public String getDeviceName() {
-        Device device = mConfiguration.getDevice();
-        if (device != null) {
-            return device.getName();
-        }
-
-        return null;
-    }
-
-    /**
-     * Returns the current theme, or null if none has been selected
-     *
-     * @return the theme name, or null
-     */
-    @Nullable
-    public String getThemeName() {
-        String theme = mConfiguration.getTheme();
-        if (theme != null) {
-            theme = ResourceHelper.styleToTheme(theme);
-        }
-
-        return theme;
-    }
-
-    /** Move to the next device state, changing the icon if it changes orientation */
-    private void gotoNextState() {
-        State state = mConfiguration.getDeviceState();
-        State flipped = mConfiguration.getNextDeviceState(state);
-        if (flipped != state) {
-            selectDeviceState(flipped);
-            onDeviceConfigChange();
-        }
-    }
-
-    // ---- Implements DisposeListener ----
-
-    @Override
-    public void widgetDisposed(DisposeEvent e) {
-        dispose();
-    }
-
-    @Override
-    public void dispose() {
-        if (!isDisposed()) {
-            super.dispose();
-
-            final Sdk sdk = Sdk.getCurrent();
-            if (sdk != null) {
-                DeviceManager manager = sdk.getDeviceManager();
-                manager.unregisterListener(this);
-            }
-        }
-    }
-
-    // ---- Init and reset/reload methods ----
-
-    /**
-     * Sets the reference to the file being edited.
-     * <p/>The UI is initialized in {@link #onXmlModelLoaded()} which is called as the XML model is
-     * loaded (or reloaded as the SDK/target changes).
-     *
-     * @param file the file being opened
-     *
-     * @see #onXmlModelLoaded()
-     * @see #replaceFile(IFile)
-     * @see #changeFileOnNewConfig(IFile)
-     */
-    public void setFile(IFile file) {
-        mEditedFile = file;
-        ensureInitialized();
-    }
-
-    /**
-     * Replaces the UI with a given file configuration. This is meant to answer the user
-     * explicitly opening a different version of the same layout from the Package Explorer.
-     * <p/>This attempts to keep the current config, but may change it if it's not compatible or
-     * not the best match
-     * @param file the file being opened.
-     */
-    public void replaceFile(IFile file) {
-        // if there is no previous selection, revert to default mode.
-        if (mConfiguration.getDevice() == null) {
-            setFile(file); // onTargetChanged will be called later.
-            return;
-        }
-
-        setFile(file);
-        IProject project = mEditedFile.getProject();
-        mResources = ResourceManager.getInstance().getProjectResources(project);
-
-        ResourceFolder resFolder = ResourceManager.getInstance().getResourceFolder(file);
-        mConfiguration.setEditedConfig(resFolder.getConfiguration());
-
-        mDisableUpdates++; // we do not want to trigger onXXXChange when setting
-                           // new values in the widgets.
-
-        try {
-            // only attempt to do anything if the SDK and targets are loaded.
-            LoadStatus sdkStatus = AdtPlugin.getDefault().getSdkLoadStatus();
-
-            if (sdkStatus == LoadStatus.LOADED) {
-                setVisible(true);
-
-                LoadStatus targetStatus = Sdk.getCurrent().checkAndLoadTargetData(mProjectTarget,
-                        null /*project*/);
-
-                if (targetStatus == LoadStatus.LOADED) {
-
-                    // update the current config selection to make sure it's
-                    // compatible with the new file
-                    ConfigurationMatcher matcher = new ConfigurationMatcher(this);
-                    matcher.adaptConfigSelection(true /*needBestMatch*/);
-                    mConfiguration.syncFolderConfig();
-
-                    // update the string showing the config value
-                    selectConfiguration(mConfiguration.getEditedConfig());
-                    updateActivity();
-                }
-            } else if (sdkStatus == LoadStatus.FAILED) {
-                setVisible(true);
-            }
-        } finally {
-            mDisableUpdates--;
-        }
-    }
-
-    /**
-     * Updates the UI with a new file that was opened in response to a config change.
-     * @param file the file being opened.
-     *
-     * @see #replaceFile(IFile)
-     */
-    public void changeFileOnNewConfig(IFile file) {
-        setFile(file);
-        IProject project = mEditedFile.getProject();
-        mResources = ResourceManager.getInstance().getProjectResources(project);
-
-        ResourceFolder resFolder = ResourceManager.getInstance().getResourceFolder(file);
-        FolderConfiguration config = resFolder.getConfiguration();
-        mConfiguration.setEditedConfig(config);
-
-        // All that's needed is to update the string showing the config value
-        // (since the config combo settings chosen by the user).
-        selectConfiguration(config);
-    }
-
-    /**
-     * Resets the configuration chooser to reflect the given file configuration. This is
-     * intended to be used by the "Show Included In" functionality where the user has
-     * picked a non-default configuration (such as a particular landscape layout) and the
-     * configuration chooser must be switched to a landscape layout. This method will
-     * trigger a model change.
-     * <p>
-     * This will NOT trigger a redraw event!
-     * <p>
-     * FIXME: We are currently setting the configuration file to be the configuration for
-     * the "outer" (the including) file, rather than the inner file, which is the file the
-     * user is actually editing. We need to refine this, possibly with a way for the user
-     * to choose which configuration they are editing. And in particular, we should be
-     * filtering the configuration chooser to only show options in the outer configuration
-     * that are compatible with the inner included file.
-     *
-     * @param file the file to be configured
-     */
-    public void resetConfigFor(IFile file) {
-        setFile(file);
-
-        IFolder parent = (IFolder) mEditedFile.getParent();
-        ResourceFolder resFolder = mResources.getResourceFolder(parent);
-        if (resFolder != null) {
-            mConfiguration.setEditedConfig(resFolder.getConfiguration());
-        } else {
-            FolderConfiguration config = FolderConfiguration.getConfig(
-                    parent.getName().split(RES_QUALIFIER_SEP));
-            if (config != null) {
-                mConfiguration.setEditedConfig(config);
-            } else {
-                mConfiguration.setEditedConfig(new FolderConfiguration());
-            }
-        }
-
-        onXmlModelLoaded();
-    }
-
-
-    /**
-     * Sets the current configuration to match the given folder configuration,
-     * the given theme name, the given device and device state.
-     *
-     * @param configuration new folder configuration to use
-     */
-    public void setConfiguration(@NonNull Configuration configuration) {
-        if (mClient != null) {
-            mClient.aboutToChange(MASK_ALL);
-        }
-
-        Configuration oldConfiguration = mConfiguration;
-        mConfiguration = configuration;
-        mConfiguration.setChooser(this);
-
-        selectTheme(configuration.getTheme());
-        selectLocale(configuration.getLocale());
-        selectDevice(configuration.getDevice());
-        selectDeviceState(configuration.getDeviceState());
-        selectTarget(configuration.getTarget());
-        selectActivity(configuration.getActivity());
-
-        // This may be a second refresh after triggered by theme above
-        if (mClient != null) {
-            LayoutCanvas canvas = mClient.getCanvas();
-            if (canvas != null) {
-                assert mConfiguration != oldConfiguration;
-                canvas.getPreviewManager().updateChooserConfig(oldConfiguration, mConfiguration);
-            }
-
-            boolean accepted = mClient.changed(MASK_ALL);
-            if (!accepted) {
-                configuration = oldConfiguration;
-                selectTheme(configuration.getTheme());
-                selectLocale(configuration.getLocale());
-                selectDevice(configuration.getDevice());
-                selectDeviceState(configuration.getDeviceState());
-                selectTarget(configuration.getTarget());
-                selectActivity(configuration.getActivity());
-                if (canvas != null && mConfiguration != oldConfiguration) {
-                    canvas.getPreviewManager().updateChooserConfig(mConfiguration,
-                            oldConfiguration);
-                }
-                return;
-            } else {
-                int changed = 0;
-                if (!equal(oldConfiguration.getTheme(), mConfiguration.getTheme())) {
-                    changed |= CFG_THEME;
-                }
-                if (!equal(oldConfiguration.getDevice(), mConfiguration.getDevice())) {
-                    changed |= CFG_DEVICE | CFG_DEVICE_STATE;
-                }
-                if (changed != 0) {
-                    syncToVariations(changed, mEditedFile, mConfiguration, false, true);
-                }
-            }
-        }
-
-        saveConstraints();
-    }
-
-    /**
-     * Responds to the event that the basic SDK information finished loading.
-     * @param target the possibly new target object associated with the file being edited (in case
-     * the SDK path was changed).
-     */
-    public void onSdkLoaded(IAndroidTarget target) {
-        // a change to the SDK means that we need to check for new/removed devices.
-        mSdkChanged = true;
-
-        // store the new target.
-        mProjectTarget = target;
-
-        mDisableUpdates++; // we do not want to trigger onXXXChange when setting
-                           // new values in the widgets.
-        try {
-            updateDevices();
-            updateTargets();
-            ensureInitialized();
-        } finally {
-            mDisableUpdates--;
-        }
-    }
-
-    /**
-     * Responds to the XML model being loaded, either the first time or when the
-     * Target/SDK changes.
-     * <p>
-     * This initializes the UI, either with the first compatible configuration
-     * found, or it will attempt to restore a configuration if one is found to
-     * have been saved in the file persistent storage.
-     * <p>
-     * If the SDK or target are not loaded, nothing will happen (but the method
-     * must be called back when they are.)
-     * <p>
-     * The method automatically handles being called the first time after editor
-     * creation, or being called after during SDK/Target changes (as long as
-     * {@link #onSdkLoaded(IAndroidTarget)} is properly called).
-     *
-     * @return the target data for the rendering target used to render the
-     *         layout
-     *
-     * @see #saveConstraints()
-     * @see #onSdkLoaded(IAndroidTarget)
-     */
-    public AndroidTargetData onXmlModelLoaded() {
-        AndroidTargetData targetData = null;
-
-        // only attempt to do anything if the SDK and targets are loaded.
-        LoadStatus sdkStatus = AdtPlugin.getDefault().getSdkLoadStatus();
-        if (sdkStatus == LoadStatus.LOADED) {
-            mDisableUpdates++; // we do not want to trigger onXXXChange when setting
-
-            try {
-                // init the devices if needed (new SDK or first time going through here)
-                if (mSdkChanged) {
-                    updateDevices();
-                    updateTargets();
-                    ensureInitialized();
-                    mSdkChanged = false;
-                }
-
-                IProject project = mEditedFile.getProject();
-
-                Sdk currentSdk = Sdk.getCurrent();
-                if (currentSdk != null) {
-                    mProjectTarget = currentSdk.getTarget(project);
-                }
-
-                LoadStatus targetStatus = LoadStatus.FAILED;
-                if (mProjectTarget != null) {
-                    targetStatus = Sdk.getCurrent().checkAndLoadTargetData(mProjectTarget, null);
-                    updateTargets();
-                    ensureInitialized();
-                }
-
-                if (targetStatus == LoadStatus.LOADED) {
-                    setVisible(true);
-                    if (mResources == null) {
-                        mResources = ResourceManager.getInstance().getProjectResources(project);
-                    }
-                    if (mConfiguration.getEditedConfig() == null) {
-                        IFolder parent = (IFolder) mEditedFile.getParent();
-                        ResourceFolder resFolder = mResources.getResourceFolder(parent);
-                        if (resFolder != null) {
-                            mConfiguration.setEditedConfig(resFolder.getConfiguration());
-                        } else {
-                            FolderConfiguration config = FolderConfiguration.getConfig(
-                                    parent.getName().split(RES_QUALIFIER_SEP));
-                            if (config != null) {
-                                mConfiguration.setEditedConfig(config);
-                            } else {
-                                mConfiguration.setEditedConfig(new FolderConfiguration());
-                            }
-                        }
-                    }
-
-                    targetData = Sdk.getCurrent().getTargetData(mProjectTarget);
-
-                    // get the file stored state
-                    ensureInitialized();
-                    boolean loadedConfigData = mConfiguration.getDevice() != null &&
-                            mConfiguration.getDeviceState() != null;
-
-                    // Load locale list. This must be run after we initialize the
-                    // configuration above, since it attempts to sync the UI with
-                    // the value loaded into the configuration.
-                    updateLocales();
-
-                    // If the current state was loaded from the persistent storage, we update the
-                    // UI with it and then try to adapt it (which will handle incompatible
-                    // configuration).
-                    // Otherwise, just look for the first compatible configuration.
-                    ConfigurationMatcher matcher = new ConfigurationMatcher(this);
-                    if (loadedConfigData) {
-                        // first make sure we have the config to adapt
-                        selectDevice(mConfiguration.getDevice());
-                        selectDeviceState(mConfiguration.getDeviceState());
-                        mConfiguration.syncFolderConfig();
-
-                        matcher.adaptConfigSelection(false);
-
-                        IAndroidTarget target = mConfiguration.getTarget();
-                        selectTarget(target);
-                        targetData = Sdk.getCurrent().getTargetData(target);
-                    } else {
-                        matcher.findAndSetCompatibleConfig(false);
-
-                        // Default to modern layout lib
-                        IAndroidTarget target = ConfigurationMatcher.findDefaultRenderTarget(this);
-                        if (target != null) {
-                            targetData = Sdk.getCurrent().getTargetData(target);
-                            selectTarget(target);
-                            mConfiguration.setTarget(target, true);
-                        }
-                    }
-
-                    // Update activity: This is done before updateThemes() since
-                    // the themes selection can depend on the currently selected activity
-                    // (e.g. when there are manifest registrations for the theme to use
-                    // for a given activity)
-                    updateActivity();
-
-                    // Update themes. This is done after updating the devices above,
-                    // since we want to look at the chosen device size to decide
-                    // what the default theme (for example, with Honeycomb we choose
-                    // Holo as the default theme but only if the screen size is XLARGE
-                    // (and of course only if the manifest does not specify another
-                    // default theme).
-                    updateThemes();
-
-                    // update the string showing the config value
-                    selectConfiguration(mConfiguration.getEditedConfig());
-
-                    // compute the final current config
-                    mConfiguration.syncFolderConfig();
-                } else if (targetStatus == LoadStatus.FAILED) {
-                    setVisible(true);
-                }
-            } finally {
-                mDisableUpdates--;
-            }
-        }
-
-        return targetData;
-    }
-
-    /**
-     * This is a temporary workaround for a infrequently happening bug; apparently
-     * there are cases where the configuration chooser isn't shown
-     */
-    public void ensureVisible() {
-        if (!isVisible()) {
-            LoadStatus sdkStatus = AdtPlugin.getDefault().getSdkLoadStatus();
-            if (sdkStatus == LoadStatus.LOADED) {
-                onXmlModelLoaded();
-            }
-        }
-    }
-
-    /**
-     * An alternate layout for this layout has been created. This means that the
-     * current layout may no longer be a best fit. However, since we support multiple
-     * layouts being open at the same time, we need to adjust the current configuration
-     * back to something where this layout <b>is</b> a best match.
-     */
-    public void onAlternateLayoutCreated() {
-        IFile best = ConfigurationMatcher.getBestFileMatch(this);
-        if (best != null && !best.equals(mEditedFile)) {
-            ConfigurationMatcher matcher = new ConfigurationMatcher(this);
-            matcher.adaptConfigSelection(true /*needBestMatch*/);
-            mConfiguration.syncFolderConfig();
-            if (mClient != null) {
-                mClient.changed(MASK_ALL);
-            }
-        }
-    }
-
-    /**
-     * Loads the list of {@link Device}s and inits the UI with it.
-     */
-    private void initDevices() {
-        final Sdk sdk = Sdk.getCurrent();
-        if (sdk != null) {
-            DeviceManager manager = sdk.getDeviceManager();
-            // This method can be called more than once, so avoid duplicate entries
-            manager.unregisterListener(this);
-            manager.registerListener(this);
-            mDevices = manager.getDevices(DeviceManager.ALL_DEVICES);
-        } else {
-            mDevices = new ArrayList<Device>();
-        }
-    }
-
-    /**
-     * Loads the list of {@link IAndroidTarget} and inits the UI with it.
-     */
-    private boolean initTargets() {
-        mTargetList.clear();
-
-        Sdk currentSdk = Sdk.getCurrent();
-        if (currentSdk != null) {
-            IAndroidTarget[] targets = currentSdk.getTargets();
-            for (int i = 0 ; i < targets.length; i++) {
-                if (targets[i].hasRenderingLibrary()) {
-                    mTargetList.add(targets[i]);
-                }
-            }
-
-            return true;
-        }
-
-        return false;
-    }
-
-    /** Ensures that the configuration has been initialized */
-    public void ensureInitialized() {
-        if (mConfiguration.getDevice() == null && mEditedFile != null) {
-            String data = ConfigurationDescription.getDescription(mEditedFile);
-            if (mInitialState != null) {
-                data = mInitialState;
-                mInitialState = null;
-            }
-            if (data != null) {
-                mConfiguration.initialize(data);
-                mConfiguration.syncFolderConfig();
-            }
-        }
-    }
-
-    private void updateDevices() {
-        if (mDevices.size() == 0) {
-            initDevices();
-        }
-    }
-
-    private void updateTargets() {
-        if (mTargetList.size() == 0) {
-            if (!initTargets()) {
-                return;
-            }
-        }
-
-        IAndroidTarget renderingTarget = mConfiguration.getTarget();
-
-        IAndroidTarget match = null;
-        for (IAndroidTarget target : mTargetList) {
-            if (renderingTarget != null) {
-                // use equals because the rendering could be from a previous SDK, so
-                // it may not be the same instance.
-                if (renderingTarget.equals(target)) {
-                    match = target;
-                }
-            } else if (mProjectTarget == target) {
-                match = target;
-            }
-
-        }
-
-        if (match == null) {
-            // the rendering target is the same as the project.
-            renderingTarget = mProjectTarget;
-        } else {
-            // set the rendering target to the new object.
-            renderingTarget = match;
-        }
-
-        mConfiguration.setTarget(renderingTarget, true);
-        selectTarget(renderingTarget);
-    }
-
-    /** Update the toolbar whenever a label has changed, to not only
-     * cause the layout in the current toolbar to update, but to possibly
-     * wrap the toolbars and update the layout of the surrounding area.
-     */
-    private void resizeToolBar() {
-        Point size = getSize();
-        Point newSize = computeSize(size.x, SWT.DEFAULT, true);
-        setSize(newSize);
-        Composite parent = getParent();
-        parent.layout();
-        parent.redraw();
-    }
-
-
-    Image getOrientationIcon(ScreenOrientation orientation, boolean flip) {
-        IconFactory icons = IconFactory.getInstance();
-        switch (orientation) {
-            case LANDSCAPE:
-                return icons.getIcon(flip ? ICON_LANDSCAPE_FLIP : ICON_LANDSCAPE);
-            case SQUARE:
-                return icons.getIcon(ICON_SQUARE);
-            case PORTRAIT:
-            default:
-                return icons.getIcon(flip ? ICON_PORTRAIT_FLIP : ICON_PORTRAIT);
-        }
-    }
-
-    ImageDescriptor getOrientationImage(ScreenOrientation orientation, boolean flip) {
-        IconFactory icons = IconFactory.getInstance();
-        switch (orientation) {
-            case LANDSCAPE:
-                return icons.getImageDescriptor(flip ? ICON_LANDSCAPE_FLIP : ICON_LANDSCAPE);
-            case SQUARE:
-                return icons.getImageDescriptor(ICON_SQUARE);
-            case PORTRAIT:
-            default:
-                return icons.getImageDescriptor(flip ? ICON_PORTRAIT_FLIP : ICON_PORTRAIT);
-        }
-    }
-
-    @NonNull
-    ScreenOrientation getOrientation(State state) {
-        FolderConfiguration config = DeviceConfigHelper.getFolderConfig(state);
-        ScreenOrientation orientation = null;
-        if (config != null && config.getScreenOrientationQualifier() != null) {
-            orientation = config.getScreenOrientationQualifier().getValue();
-        }
-
-        if (orientation == null) {
-            orientation = ScreenOrientation.PORTRAIT;
-        }
-
-        return orientation;
-    }
-
-    /**
-     * Stores the current config selection into the edited file such that we can
-     * bring it back the next time this layout is opened.
-     */
-    public void saveConstraints() {
-        String description = mConfiguration.toPersistentString();
-        if (description != null && !description.isEmpty()) {
-            ConfigurationDescription.setDescription(mEditedFile, description);
-        }
-    }
-
-    // ---- Setting the current UI state ----
-
-    void selectDeviceState(@Nullable State state) {
-        assert isUiThread();
-        try {
-            mDisableUpdates++;
-            mOrientationCombo.setData(state);
-
-            State nextState = mConfiguration.getNextDeviceState(state);
-            mOrientationCombo.setImage(getOrientationIcon(getOrientation(state),
-                    nextState != state));
-        } finally {
-            mDisableUpdates--;
-        }
-    }
-
-    void selectTarget(IAndroidTarget target) {
-        assert isUiThread();
-        try {
-            mDisableUpdates++;
-            mTargetCombo.setData(target);
-            String label = getRenderingTargetLabel(target, true);
-            mTargetCombo.setText(label);
-            resizeToolBar();
-        } finally {
-            mDisableUpdates--;
-        }
-    }
-
-    /**
-     * Selects a given {@link Device} in the device combo, if it is found.
-     * @param device the device to select
-     * @return true if the device was found.
-     */
-    boolean selectDevice(@Nullable Device device) {
-        assert isUiThread();
-        try {
-            mDisableUpdates++;
-            mDeviceCombo.setData(device);
-            if (device != null) {
-                mDeviceCombo.setText(getDeviceLabel(device, true));
-            } else {
-                mDeviceCombo.setText("Device");
-            }
-            resizeToolBar();
-        } finally {
-            mDisableUpdates--;
-        }
-
-        return false;
-    }
-
-    void selectActivity(@Nullable String fqcn) {
-        assert isUiThread();
-        try {
-            mDisableUpdates++;
-            if (fqcn != null) {
-                mActivityCombo.setData(fqcn);
-                String label = getActivityLabel(fqcn, true);
-                mActivityCombo.setText(label);
-            } else {
-                mActivityCombo.setText("(Select)");
-            }
-            resizeToolBar();
-        } finally {
-            mDisableUpdates--;
-        }
-    }
-
-    void selectTheme(@Nullable String theme) {
-        assert isUiThread();
-        try {
-            mDisableUpdates++;
-            assert theme == null ||  theme.startsWith(STYLE_RESOURCE_PREFIX)
-                    || theme.startsWith(ANDROID_STYLE_RESOURCE_PREFIX) : theme;
-            mThemeCombo.setData(theme);
-            if (theme != null) {
-                mThemeCombo.setText(getThemeLabel(theme, true));
-            } else {
-                // FIXME eclipse claims this is dead code.
-                mThemeCombo.setText("(Set Theme)");
-            }
-            resizeToolBar();
-        } finally {
-            mDisableUpdates--;
-        }
-    }
-
-    void selectLocale(@Nullable Locale locale) {
-        assert isUiThread();
-        try {
-            mDisableUpdates++;
-            mLocaleCombo.setData(locale);
-            String label = Strings.nullToEmpty(getLocaleLabel(this, locale, true));
-            mLocaleCombo.setText(label);
-
-            Image image = getFlagImage(locale);
-            mLocaleCombo.setImage(image);
-
-            resizeToolBar();
-        } finally {
-            mDisableUpdates--;
-        }
-    }
-
-    @NonNull
-    Image getFlagImage(@Nullable Locale locale) {
-        if (locale != null) {
-            return locale.getFlagImage();
-        }
-
-        return FlagManager.getGlobeIcon();
-    }
-
-    private void selectConfiguration(FolderConfiguration fileConfig) {
-        /* For now, don't show any text in the configuration combo, use just an
-           icon. This has the advantage that the configuration contents don't
-           shift around, so you can for example click back and forth between
-           portrait and landscape without the icon moving under the mouse.
-           If this works well, remove this whole method post ADT 21.
-        assert isUiThread();
-        try {
-            String current = mEditedFile.getParent().getName();
-            if (current.equals(FD_RES_LAYOUT)) {
-                current = "default";
-            }
-
-            // Pretty things up a bit
-            //if (current == null || current.equals("default")) {
-            //    current = "Default Configuration";
-            //}
-            mConfigCombo.setText(current);
-            resizeToolBar();
-        } finally {
-            mDisableUpdates--;
-        }
-         */
-    }
-
-    /**
-     * Finds a locale matching the config from a file.
-     *
-     * @param language the language qualifier or null if none is set.
-     * @param region the region qualifier or null if none is set.
-     * @return true if there was a change in the combobox as a result of
-     *         applying the locale
-     */
-    private boolean setLocale(@Nullable Locale locale) {
-        boolean changed = !Objects.equal(mConfiguration.getLocale(), locale);
-        selectLocale(locale);
-
-        return changed;
-    }
-
-    // ---- Creating UI labels ----
-
-    /**
-     * Returns a suitable label to use to display the given activity
-     *
-     * @param fqcn the activity class to look up a label for
-     * @param brief if true, generate a brief label (suitable for a toolbar
-     *            button), otherwise a fuller name (suitable for a menu item)
-     * @return the label
-     */
-    public static String getActivityLabel(String fqcn, boolean brief) {
-        if (brief) {
-            String label = fqcn;
-            int packageIndex = label.lastIndexOf('.');
-            if (packageIndex != -1) {
-                label = label.substring(packageIndex + 1);
-            }
-            int innerClass = label.lastIndexOf('$');
-            if (innerClass != -1) {
-                label = label.substring(innerClass + 1);
-            }
-
-            // Also strip out the "Activity" or "Fragment" common suffix
-            // if this is a long name
-            if (label.endsWith("Activity") && label.length() > 8 + 12) { // 12 chars + 8 in suffix
-                label = label.substring(0, label.length() - 8);
-            } else if (label.endsWith("Fragment") && label.length() > 8 + 12) {
-                label = label.substring(0, label.length() - 8);
-            }
-
-            return label;
-        }
-
-        return fqcn;
-    }
-
-    /**
-     * Returns a suitable label to use to display the given theme
-     *
-     * @param theme the theme to produce a label for
-     * @param brief if true, generate a brief label (suitable for a toolbar
-     *            button), otherwise a fuller name (suitable for a menu item)
-     * @return the label
-     */
-    public static String getThemeLabel(String theme, boolean brief) {
-        theme = ResourceHelper.styleToTheme(theme);
-
-        if (brief) {
-            int index = theme.lastIndexOf('.');
-            if (index < theme.length() - 1) {
-                return theme.substring(index + 1);
-            }
-        }
-        return theme;
-    }
-
-    /**
-     * Returns a suitable label to use to display the given rendering target
-     *
-     * @param target the target to produce a label for
-     * @param brief if true, generate a brief label (suitable for a toolbar
-     *            button), otherwise a fuller name (suitable for a menu item)
-     * @return the label
-     */
-    public static String getRenderingTargetLabel(IAndroidTarget target, boolean brief) {
-        if (target == null) {
-            return "<null>";
-        }
-
-        AndroidVersion version = target.getVersion();
-
-        if (brief) {
-            if (target.isPlatform()) {
-                return Integer.toString(version.getApiLevel());
-            } else {
-                return target.getName() + ':' + Integer.toString(version.getApiLevel());
-            }
-        }
-
-        String label = String.format("API %1$d: %2$s",
-                version.getApiLevel(),
-                target.getShortClasspathName());
-
-        return label;
-    }
-
-    /**
-     * Returns a suitable label to use to display the given device
-     *
-     * @param device the device to produce a label for
-     * @param brief if true, generate a brief label (suitable for a toolbar
-     *            button), otherwise a fuller name (suitable for a menu item)
-     * @return the label
-     */
-    public static String getDeviceLabel(@Nullable Device device, boolean brief) {
-        if (device == null) {
-            return "";
-        }
-        String name = device.getName();
-
-        if (brief) {
-            // Produce a really brief summary of the device name, suitable for
-            // use in the narrow space available in the toolbar for example
-            int nexus = name.indexOf("Nexus"); //$NON-NLS-1$
-            if (nexus != -1) {
-                int begin = name.indexOf('(');
-                if (begin != -1) {
-                    begin++;
-                    int end = name.indexOf(')', begin);
-                    if (end != -1) {
-                        return name.substring(begin, end).trim();
-                    }
-                }
-            }
-        }
-
-        return name;
-    }
-
-    /**
-     * Returns a suitable label to use to display the given locale
-     *
-     * @param chooser the chooser, if known
-     * @param locale the locale to look up a label for
-     * @param brief if true, generate a brief label (suitable for a toolbar
-     *            button), otherwise a fuller name (suitable for a menu item)
-     * @return the label
-     */
-    @Nullable
-    public static String getLocaleLabel(
-            @Nullable ConfigurationChooser chooser,
-            @Nullable Locale locale,
-            boolean brief) {
-        if (locale == null) {
-            return null;
-        }
-
-        if (!locale.hasLanguage()) {
-            if (brief) {
-                // Just use the icon
-                return "";
-            }
-
-            boolean hasLocale = false;
-            ResourceRepository projectRes = chooser != null ? chooser.mClient.getProjectResources()
-                    : null;
-            if (projectRes != null) {
-                hasLocale = projectRes.getLanguages().size() > 0;
-            }
-
-            if (hasLocale) {
-                return "Other";
-            } else {
-                return "Any";
-            }
-        }
-
-        String languageCode = locale.qualifier.getLanguage();
-        String languageName = LocaleManager.getLanguageName(languageCode);
-
-        if (!locale.hasRegion()) {
-            // TODO: Make the region string use "Other" instead of "Any" if
-            // there is more than one region for a given language
-            //if (regions.size() > 0) {
-            //    return String.format("%1$s / Other", language);
-            //} else {
-            //    return String.format("%1$s / Any", language);
-            //}
-            if (!brief && languageName != null) {
-                return String.format("%1$s (%2$s)", languageName, languageCode);
-            } else {
-                return languageCode;
-            }
-        } else {
-            String regionCode = locale.qualifier.getRegion();
-            if (!brief && languageName != null) {
-                String regionName = LocaleManager.getRegionName(regionCode);
-                if (regionName != null) {
-                    return String.format("%1$s (%2$s) in %3$s (%4$s)", languageName, languageCode,
-                            regionName, regionCode);
-                }
-                return String.format("%1$s (%2$s) in %3$s", languageName, languageCode,
-                        regionCode);
-            }
-            return String.format("%1$s / %2$s", languageCode, regionCode);
-        }
-    }
-
-    // ---- Implements DevicesChangedListener ----
-
-    @Override
-    public void onDevicesChanged() {
-        final Sdk sdk = Sdk.getCurrent();
-        if (sdk != null) {
-            mDevices = sdk.getDeviceManager().getDevices(DeviceManager.ALL_DEVICES);
-        } else {
-            mDevices = new ArrayList<Device>();
-        }
-    }
-
-    // ---- Reacting to UI changes ----
-
-    /**
-     * Called when the selection of the device combo changes.
-     */
-    void onDeviceChange() {
-        // because changing the content of a combo triggers a change event, respect the
-        // mDisableUpdates flag
-        if (mDisableUpdates > 0) {
-            return;
-        }
-
-        // Attempt to preserve the device state
-        String stateName = null;
-        Device prevDevice = mConfiguration.getDevice();
-        State prevState = mConfiguration.getDeviceState();
-        Device device = (Device) mDeviceCombo.getData();
-        if (prevDevice != null && prevState != null && device != null) {
-            // get the previous config, so that we can look for a close match
-            FolderConfiguration oldConfig = DeviceConfigHelper.getFolderConfig(prevState);
-            if (oldConfig != null) {
-                stateName = ConfigurationMatcher.getClosestMatch(oldConfig, device.getAllStates());
-            }
-        }
-        mConfiguration.setDevice(device, true);
-        State newState = Configuration.getState(device, stateName);
-        mConfiguration.setDeviceState(newState, true);
-        selectDeviceState(newState);
-        mConfiguration.syncFolderConfig();
-
-        // Notify
-        IFile file = mEditedFile;
-        boolean accepted = mClient.changed(CFG_DEVICE | CFG_DEVICE_STATE);
-        if (!accepted) {
-            mConfiguration.setDevice(prevDevice, true);
-            mConfiguration.setDeviceState(prevState, true);
-            mConfiguration.syncFolderConfig();
-            selectDevice(prevDevice);
-            selectDeviceState(prevState);
-            return;
-        } else {
-            syncToVariations(CFG_DEVICE | CFG_DEVICE_STATE, file, mConfiguration, false, true);
-        }
-
-        saveConstraints();
-    }
-
-    /**
-     * Synchronizes changes to the given attributes (indicated by the mask
-     * referencing the {@code CFG_} configuration attribute bit flags in
-     * {@link Configuration} to the layout variations of the given updated file.
-     *
-     * @param flags the attributes which were updated
-     * @param updatedFile the file which was updated
-     * @param base the base configuration to base the chooser off of
-     * @param includeSelf whether the updated file itself should be updated
-     * @param async whether the updates should be performed asynchronously
-     */
-    public void syncToVariations(
-            final int flags,
-            final @NonNull IFile updatedFile,
-            final @NonNull Configuration base,
-            final boolean includeSelf,
-            boolean async) {
-        if (async) {
-            getDisplay().asyncExec(new Runnable() {
-                @Override
-                public void run() {
-                    doSyncToVariations(flags, updatedFile, includeSelf, base);
-                }
-            });
-        } else {
-            doSyncToVariations(flags, updatedFile, includeSelf, base);
-        }
-    }
-
-    private void doSyncToVariations(int flags, IFile updatedFile, boolean includeSelf,
-            Configuration base) {
-        // Synchronize the given changes to other configurations as well
-        List<IFile> files = AdtUtils.getResourceVariations(updatedFile, includeSelf);
-        for (IFile file : files) {
-            Configuration configuration = Configuration.create(base, file);
-            configuration.setTheme(base.getTheme());
-            configuration.setActivity(base.getActivity());
-            Collection<IEditorPart> editors = AdtUtils.findEditorsFor(file, false);
-            boolean found = false;
-            for (IEditorPart editor : editors) {
-                if (editor instanceof CommonXmlEditor) {
-                    CommonXmlDelegate delegate = ((CommonXmlEditor) editor).getDelegate();
-                    if (delegate instanceof LayoutEditorDelegate) {
-                        editor = ((LayoutEditorDelegate) delegate).getGraphicalEditor();
-                    }
-                }
-                if (editor instanceof GraphicalEditorPart) {
-                    ConfigurationChooser chooser =
-                        ((GraphicalEditorPart) editor).getConfigurationChooser();
-                    chooser.setConfiguration(configuration);
-                    found = true;
-                }
-            }
-            if (!found) {
-                // Just update the file persistence
-                String description = configuration.toPersistentString();
-                ConfigurationDescription.setDescription(file, description);
-            }
-        }
-    }
-
-    /**
-     * Called when the device config selection changes.
-     */
-    void onDeviceConfigChange() {
-        // because changing the content of a combo triggers a change event, respect the
-        // mDisableUpdates flag
-        if (mDisableUpdates > 0) {
-            return;
-        }
-
-        State prev = mConfiguration.getDeviceState();
-        State state = (State) mOrientationCombo.getData();
-        mConfiguration.setDeviceState(state, false);
-
-        if (mClient != null) {
-            boolean accepted = mClient.changed(CFG_DEVICE | CFG_DEVICE_STATE);
-            if (!accepted) {
-                mConfiguration.setDeviceState(prev, false);
-                selectDeviceState(prev);
-                return;
-            }
-        }
-
-        saveConstraints();
-    }
-
-    /**
-     * Call back for language combo selection
-     */
-    void onLocaleChange() {
-        // because mLocaleList triggers onLocaleChange at each modification, the filling
-        // of the combo with data will trigger notifications, and we don't want that.
-        if (mDisableUpdates > 0) {
-            return;
-        }
-
-        Locale prev = mConfiguration.getLocale();
-        Locale locale = (Locale) mLocaleCombo.getData();
-        if (locale == null) {
-            locale = Locale.ANY;
-        }
-        mConfiguration.setLocale(locale, false);
-
-        if (mClient != null) {
-            boolean accepted = mClient.changed(CFG_LOCALE);
-            if (!accepted) {
-                mConfiguration.setLocale(prev, false);
-                selectLocale(prev);
-            }
-        }
-
-        // Store locale project-wide setting
-        mConfiguration.saveRenderState();
-    }
-
-
-    void onThemeChange() {
-        if (mDisableUpdates > 0) {
-            return;
-        }
-
-        String prev = mConfiguration.getTheme();
-        mConfiguration.setTheme((String) mThemeCombo.getData());
-
-        if (mClient != null) {
-            boolean accepted = mClient.changed(CFG_THEME);
-            if (!accepted) {
-                mConfiguration.setTheme(prev);
-                selectTheme(prev);
-                return;
-            } else {
-                syncToVariations(CFG_DEVICE|CFG_DEVICE_STATE, mEditedFile, mConfiguration,
-                        false, true);
-            }
-        }
-
-        saveConstraints();
-    }
-
-    void notifyFolderConfigChanged() {
-        if (mDisableUpdates > 0 || mClient == null) {
-            return;
-        }
-
-        if (mClient.changed(CFG_FOLDER)) {
-            saveConstraints();
-        }
-    }
-
-    void onSelectActivity() {
-        if (mDisableUpdates > 0) {
-            return;
-        }
-
-        String activity = (String) mActivityCombo.getData();
-        mConfiguration.setActivity(activity);
-
-        if (activity == null) {
-            return;
-        }
-
-        // See if there is a default theme assigned to this activity, and if so, use it
-        ManifestInfo manifest = ManifestInfo.get(mEditedFile.getProject());
-        String preferred = null;
-        ActivityAttributes attributes = manifest.getActivityAttributes(activity);
-        if (attributes != null) {
-            preferred = attributes.getTheme();
-        }
-        if (preferred != null && !Objects.equal(preferred, mConfiguration.getTheme())) {
-            // Yes, switch to it
-            selectTheme(preferred);
-            onThemeChange();
-        }
-
-        // Persist in XML
-        if (mClient != null) {
-            mClient.setActivity(activity);
-        }
-
-        saveConstraints();
-    }
-
-    /**
-     * Call back for api level combo selection
-     */
-    void onRenderingTargetChange() {
-        // because mApiCombo triggers onApiLevelChange at each modification, the filling
-        // of the combo with data will trigger notifications, and we don't want that.
-        if (mDisableUpdates > 0) {
-            return;
-        }
-
-        IAndroidTarget prevTarget = mConfiguration.getTarget();
-        String prevTheme = mConfiguration.getTheme();
-
-        int changeFlags = 0;
-
-        // tell the listener a new rendering target is being set. Need to do this before updating
-        // mRenderingTarget.
-        if (prevTarget != null) {
-            changeFlags |= CFG_TARGET;
-            mClient.aboutToChange(changeFlags);
-        }
-
-        IAndroidTarget target = (IAndroidTarget) mTargetCombo.getData();
-        mConfiguration.setTarget(target, true);
-
-        // force a theme update to reflect the new rendering target.
-        // This must be done after computeCurrentConfig since it'll depend on the currentConfig
-        // to figure out the theme list.
-        String oldTheme = mConfiguration.getTheme();
-        updateThemes();
-        // updateThemes may change the theme (based on theme availability in the new rendering
-        // target) so mark theme change if necessary
-        if (!Objects.equal(oldTheme, mConfiguration.getTheme())) {
-            changeFlags |= CFG_THEME;
-        }
-
-        if (target != null) {
-            changeFlags |= CFG_TARGET;
-            changeFlags |= CFG_FOLDER; // In case we added a -vNN qualifier
-        }
-
-        // Store project-wide render-target setting
-        mConfiguration.saveRenderState();
-
-        mConfiguration.syncFolderConfig();
-
-        if (mClient != null) {
-            boolean accepted = mClient.changed(changeFlags);
-            if (!accepted) {
-                mConfiguration.setTarget(prevTarget, true);
-                mConfiguration.setTheme(prevTheme);
-                mConfiguration.syncFolderConfig();
-                selectTheme(prevTheme);
-                selectTarget(prevTarget);
-            }
-        }
-    }
-
-    /**
-     * Syncs this configuration to the project wide locale and render target settings. The
-     * locale may ignore the project-wide setting if it is a locale-specific
-     * configuration.
-     *
-     * @return true if one or both of the toggles were changed, false if there were no
-     *         changes
-     */
-    public boolean syncRenderState() {
-        if (mConfiguration.getEditedConfig() == null) {
-            // Startup; ignore
-            return false;
-        }
-
-        boolean renderTargetChanged = false;
-
-        // When a page is re-activated, force the toggles to reflect the current project
-        // state
-
-        Pair<Locale, IAndroidTarget> pair = Configuration.loadRenderState(this);
-
-        int changeFlags = 0;
-        // Only sync the locale if this layout is not already a locale-specific layout!
-        if (pair != null && !mConfiguration.isLocaleSpecificLayout()) {
-            Locale locale = pair.getFirst();
-            if (locale != null) {
-                boolean localeChanged = setLocale(locale);
-                if (localeChanged) {
-                    changeFlags |= CFG_LOCALE;
-                }
-            } else {
-                locale = Locale.ANY;
-            }
-            mConfiguration.setLocale(locale, true);
-        }
-
-        // Sync render target
-        IAndroidTarget configurationTarget = mConfiguration.getTarget();
-        IAndroidTarget target = pair != null ? pair.getSecond() : configurationTarget;
-        if (target != null && configurationTarget != target) {
-            if (mClient != null && configurationTarget != null) {
-                changeFlags |= CFG_TARGET;
-                mClient.aboutToChange(changeFlags);
-            }
-
-            mConfiguration.setTarget(target, true);
-            selectTarget(target);
-            renderTargetChanged = true;
-        }
-
-        // Neither locale nor render target changed: nothing to do
-        if (changeFlags == 0) {
-            return false;
-        }
-
-        // Update the locale and/or the render target. This code contains a logical
-        // merge of the onRenderingTargetChange() and onLocaleChange() methods, combined
-        // such that we don't duplicate work.
-
-        // Compute the new configuration; we want to do this both for locale changes
-        // and for render targets.
-        mConfiguration.syncFolderConfig();
-        changeFlags |= CFG_FOLDER; // in case we added/remove a -v<NN> qualifier
-
-        if (renderTargetChanged) {
-            // force a theme update to reflect the new rendering target.
-            // This must be done after computeCurrentConfig since it'll depend on the currentConfig
-            // to figure out the theme list.
-            updateThemes();
-        }
-
-        if (mClient != null) {
-            mClient.changed(changeFlags);
-        }
-
-        return true;
-    }
-
-    // ---- Populate data structures with themes, locales, etc ----
-
-    /**
-     * Updates the internal list of themes.
-     */
-    private void updateThemes() {
-        if (mClient == null) {
-            return; // can't do anything without it.
-        }
-
-        ResourceRepository frameworkRes = mClient.getFrameworkResources(
-                mConfiguration.getTarget());
-
-        mDisableUpdates++;
-
-        try {
-            if (mEditedFile != null) {
-                String theme = mConfiguration.getTheme();
-                if (theme == null || theme.isEmpty() || mClient.getIncludedWithin() != null) {
-                    mConfiguration.setTheme(null);
-                    mConfiguration.computePreferredTheme();
-                }
-                assert mConfiguration.getTheme() != null;
-            }
-
-            mThemeList.clear();
-
-            ArrayList<String> themes = new ArrayList<String>();
-            ResourceRepository projectRes = mClient.getProjectResources();
-            // in cases where the opened file is not linked to a project, this could be null.
-            if (projectRes != null) {
-                // get the configured resources for the project
-                Map<ResourceType, Map<String, ResourceValue>> configuredProjectRes =
-                    mClient.getConfiguredProjectResources();
-
-                if (configuredProjectRes != null) {
-                    // get the styles.
-                    Map<String, ResourceValue> styleMap = configuredProjectRes.get(
-                            ResourceType.STYLE);
-
-                    if (styleMap != null) {
-                        // collect the themes out of all the styles, ie styles that extend,
-                        // directly or indirectly a platform theme.
-                        for (ResourceValue value : styleMap.values()) {
-                            if (isTheme(value, styleMap, null)) {
-                                String theme = value.getName();
-                                themes.add(theme);
-                            }
-                        }
-
-                        Collections.sort(themes);
-
-                        for (String theme : themes) {
-                            if (!theme.startsWith(PREFIX_RESOURCE_REF)) {
-                                theme = STYLE_RESOURCE_PREFIX + theme;
-                            }
-                            mThemeList.add(theme);
-                        }
-                    }
-                }
-                themes.clear();
-            }
-
-            // get the themes, and languages from the Framework.
-            if (frameworkRes != null) {
-                // get the configured resources for the framework
-                Map<ResourceType, Map<String, ResourceValue>> frameworResources =
-                    frameworkRes.getConfiguredResources(mConfiguration.getFullConfig());
-
-                if (frameworResources != null) {
-                    // get the styles.
-                    Map<String, ResourceValue> styles = frameworResources.get(ResourceType.STYLE);
-
-                    // collect the themes out of all the styles.
-                    for (ResourceValue value : styles.values()) {
-                        String name = value.getName();
-                        if (name.startsWith("Theme.") || name.equals("Theme")) { //$NON-NLS-1$ //$NON-NLS-2$
-                            themes.add(value.getName());
-                        }
-                    }
-
-                    // sort them and add them to the combo
-                    Collections.sort(themes);
-
-                    for (String theme : themes) {
-                        if (!theme.startsWith(PREFIX_RESOURCE_REF)) {
-                            theme = ANDROID_STYLE_RESOURCE_PREFIX + theme;
-                        }
-                        mThemeList.add(theme);
-                    }
-
-                    themes.clear();
-                }
-            }
-
-            // Migration: In the past we didn't store the style prefix in the settings;
-            // this meant we might lose track of whether the theme is a project style
-            // or a framework style. For now we need to migrate. Search through the
-            // theme list until we have a match
-            String theme = mConfiguration.getTheme();
-            if (theme != null && !theme.startsWith(PREFIX_RESOURCE_REF)) {
-                String projectStyle = STYLE_RESOURCE_PREFIX + theme;
-                String frameworkStyle = ANDROID_STYLE_RESOURCE_PREFIX + theme;
-                for (String t : mThemeList) {
-                    if (t.equals(projectStyle)) {
-                        mConfiguration.setTheme(projectStyle);
-                        break;
-                    } else if (t.equals(frameworkStyle)) {
-                        mConfiguration.setTheme(frameworkStyle);
-                        break;
-                    }
-                }
-                if (!theme.startsWith(PREFIX_RESOURCE_REF)) {
-                    // Arbitrary guess
-                    if (theme.startsWith("Theme.")) {
-                        theme = ANDROID_STYLE_RESOURCE_PREFIX + theme;
-                    } else {
-                        theme = STYLE_RESOURCE_PREFIX + theme;
-                    }
-                }
-            }
-
-            // TODO: Handle the case where you have a theme persisted that isn't available??
-            // We could look up mConfiguration.theme and make sure it appears in the list! And if
-            // not, picking one.
-            selectTheme(mConfiguration.getTheme());
-        } finally {
-            mDisableUpdates--;
-        }
-    }
-
-    private void updateActivity() {
-        if (mEditedFile != null) {
-            String preferred = getPreferredActivity(mEditedFile);
-            selectActivity(preferred);
-        }
-    }
-
-    /**
-     * Updates the locale combo.
-     * This must be called from the UI thread.
-     */
-    public void updateLocales() {
-        if (mClient == null) {
-            return; // can't do anything w/o it.
-        }
-
-        mDisableUpdates++;
-
-        try {
-            mLocaleList.clear();
-
-            SortedSet<String> languages = null;
-
-            // get the languages from the project.
-            ResourceRepository projectRes = mClient.getProjectResources();
-
-            // in cases where the opened file is not linked to a project, this could be null.
-            if (projectRes != null) {
-                // now get the languages from the project.
-                languages = projectRes.getLanguages();
-
-                for (String language : languages) {
-                    // find the matching regions and add them
-                    SortedSet<String> regions = projectRes.getRegions(language);
-                    for (String region : regions) {
-                        LocaleQualifier locale = LocaleQualifier.getQualifier(language + "-r" + region);
-                        if (locale != null) {
-                            mLocaleList.add(Locale.create(locale));
-                        }
-                    }
-
-                    // now the entry for the other regions the language alone
-                    // create a region qualifier that will never be matched by qualified resources.
-                    LocaleQualifier locale = new LocaleQualifier(language);
-                    mLocaleList.add(Locale.create(locale));
-                }
-            }
-
-            // create language/region qualifier that will never be matched by qualified resources.
-            mLocaleList.add(Locale.ANY);
-
-            Locale locale = mConfiguration.getLocale();
-            setLocale(locale);
-        } finally {
-            mDisableUpdates--;
-        }
-    }
-
-    @Nullable
-    private String getPreferredActivity(@NonNull IFile file) {
-        // Store/restore the activity context in the config state to help with
-        // performance if for some reason we can't write it into the XML file and to
-        // avoid having to open the model below
-        if (mConfiguration.getActivity() != null) {
-            return mConfiguration.getActivity();
-        }
-
-        IProject project = file.getProject();
-
-        // Look up from XML file
-        Document document = DomUtilities.getDocument(file);
-        if (document != null) {
-            Element element = document.getDocumentElement();
-            if (element != null) {
-                String activity = element.getAttributeNS(TOOLS_URI, ATTR_CONTEXT);
-                if (activity != null && !activity.isEmpty()) {
-                    if (activity.startsWith(".") || activity.indexOf('.') == -1) { //$NON-NLS-1$
-                        ManifestInfo manifest = ManifestInfo.get(project);
-                        String pkg = manifest.getPackage();
-                        if (!pkg.isEmpty()) {
-                            if (activity.startsWith(".")) { //$NON-NLS-1$
-                                activity = pkg + activity;
-                            } else {
-                                activity = activity + '.' + pkg;
-                            }
-                        }
-                    }
-
-                    mConfiguration.setActivity(activity);
-                    saveConstraints();
-                    return activity;
-                }
-            }
-        }
-
-        // No, not available there: try to infer it from the code index
-        String includedIn = null;
-        Reference includedWithin = mClient.getIncludedWithin();
-        if (mClient != null && includedWithin != null) {
-            includedIn = includedWithin.getName();
-        }
-
-        ManifestInfo manifest = ManifestInfo.get(project);
-        String pkg = manifest.getPackage();
-        String layoutName = ResourceHelper.getLayoutName(mEditedFile);
-
-        // If we are rendering a layout in included context, pick the theme
-        // from the outer layout instead
-        if (includedIn != null) {
-            layoutName = includedIn;
-        }
-
-        String activity = ManifestInfo.guessActivity(project, layoutName, pkg);
-
-        if (activity == null) {
-            List<String> activities = ManifestInfo.getProjectActivities(project);
-            if (activities.size() == 1) {
-                activity = activities.get(0);
-            }
-        }
-
-        if (activity != null) {
-            mConfiguration.setActivity(activity);
-            saveConstraints();
-            return activity;
-        }
-
-        // TODO: Do anything else, such as pick the first activity found?
-        // Or just leave some default label instead?
-        // Also, figure out what to store in the mState so I don't keep trying
-
-        return null;
-    }
-
-    /**
-     * Returns whether the given <var>style</var> is a theme.
-     * This is done by making sure the parent is a theme.
-     * @param value the style to check
-     * @param styleMap the map of styles for the current project. Key is the style name.
-     * @param seen the map of styles we have already processed (or null if not yet
-     *          initialized). Only the keys are significant (since there is no IdentityHashSet).
-     * @return True if the given <var>style</var> is a theme.
-     */
-    private static boolean isTheme(ResourceValue value, Map<String, ResourceValue> styleMap,
-            IdentityHashMap<ResourceValue, Boolean> seen) {
-        if (value instanceof StyleResourceValue) {
-            StyleResourceValue style = (StyleResourceValue)value;
-
-            boolean frameworkStyle = false;
-            String parentStyle = style.getParentStyle();
-            if (parentStyle == null) {
-                // if there is no specified parent style we look an implied one.
-                // For instance 'Theme.light' is implied child style of 'Theme',
-                // and 'Theme.light.fullscreen' is implied child style of 'Theme.light'
-                String name = style.getName();
-                int index = name.lastIndexOf('.');
-                if (index != -1) {
-                    parentStyle = name.substring(0, index);
-                }
-            } else {
-                // remove the useless @ if it's there
-                if (parentStyle.startsWith("@")) {
-                    parentStyle = parentStyle.substring(1);
-                }
-
-                // check for framework identifier.
-                if (parentStyle.startsWith(ANDROID_NS_NAME_PREFIX)) {
-                    frameworkStyle = true;
-                    parentStyle = parentStyle.substring(ANDROID_NS_NAME_PREFIX.length());
-                }
-
-                // at this point we could have the format style/<name>. we want only the name
-                if (parentStyle.startsWith("style/")) {
-                    parentStyle = parentStyle.substring("style/".length());
-                }
-            }
-
-            if (parentStyle != null) {
-                if (frameworkStyle) {
-                    // if the parent is a framework style, it has to be 'Theme' or 'Theme.*'
-                    return parentStyle.equals("Theme") || parentStyle.startsWith("Theme.");
-                } else {
-                    // if it's a project style, we check this is a theme.
-                    ResourceValue parentValue = styleMap.get(parentStyle);
-
-                    // also prevent stack overflow in case the dev mistakenly declared
-                    // the parent of the style as the style itself.
-                    if (parentValue != null && !parentValue.equals(value)) {
-                        if (seen == null) {
-                            seen = new IdentityHashMap<ResourceValue, Boolean>();
-                            seen.put(value, Boolean.TRUE);
-                        } else if (seen.containsKey(parentValue)) {
-                            return false;
-                        }
-                        seen.put(parentValue, Boolean.TRUE);
-                        return isTheme(parentValue, styleMap, seen);
-                    }
-                }
-            }
-        }
-
-        return false;
-    }
-
-    /**
-     * Returns true if this configuration chooser represents the best match for
-     * the given file
-     *
-     * @param file the file to test
-     * @param config the config to test
-     * @return true if the given config is the best match for the given file
-     */
-    public boolean isBestMatchFor(IFile file, FolderConfiguration config) {
-        ResourceFile match = mResources.getMatchingFile(mEditedFile.getName(),
-                ResourceType.LAYOUT, config);
-        if (match != null) {
-            return match.getFile().equals(mEditedFile);
-        }
-
-        return false;
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/configuration/ConfigurationClient.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/configuration/ConfigurationClient.java
deleted file mode 100644
index 3df2fed..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/configuration/ConfigurationClient.java
+++ /dev/null
@@ -1,129 +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.ide.eclipse.adt.internal.editors.layout.configuration;
-
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-import com.android.ide.common.rendering.api.ResourceValue;
-import com.android.ide.common.resources.ResourceRepository;
-import com.android.ide.eclipse.adt.internal.editors.layout.gle2.IncludeFinder.Reference;
-import com.android.ide.eclipse.adt.internal.editors.layout.gle2.LayoutCanvas;
-import com.android.resources.ResourceType;
-import com.android.sdklib.IAndroidTarget;
-
-import java.util.Map;
-
-/**
- * Interface implemented by clients who embed a {@link ConfigurationChooser}.
- */
-public interface ConfigurationClient {
-    /**
-     * The configuration is about to be changed.
-     *
-     * @param flags details about what changed; consult the {@code CFG_} flags
-     *            in {@link Configuration} such as
-     *            {@link Configuration#CFG_DEVICE},
-     *            {@link Configuration#CFG_LOCALE}, etc.
-     */
-    void aboutToChange(int flags);
-
-    /**
-     * The configuration has changed. If the client returns false, it means that
-     * the change was rejected. This typically means that changing the
-     * configuration in this particular way makes a configuration which has a
-     * better file match than the current client's file, so it will open that
-     * file to edit the new configuration -- and the current configuration
-     * should go back to editing the state prior to this change.
-     *
-     * @param flags details about what changed; consult the {@code CFG_} flags
-     *            such as {@link Configuration#CFG_DEVICE},
-     *            {@link Configuration#CFG_LOCALE}, etc.
-     * @return true if the change was accepted, false if it was rejected.
-     */
-    boolean changed(int flags);
-
-    /**
-     * Compute the project resources
-     *
-     * @return the project resources as a {@link ResourceRepository}
-     */
-    @Nullable
-    ResourceRepository getProjectResources();
-
-    /**
-     * Compute the framework resources
-     *
-     * @return the project resources as a {@link ResourceRepository}
-     */
-    @Nullable
-    ResourceRepository getFrameworkResources();
-
-    /**
-     * Compute the framework resources for the given Android API target
-     *
-     * @param target the target to look up framework resources for
-     * @return the project resources as a {@link ResourceRepository}
-     */
-    @Nullable
-    ResourceRepository getFrameworkResources(@Nullable IAndroidTarget target);
-
-    /**
-     * Returns the configured project resources for the current file and
-     * configuration
-     *
-     * @return resource type maps to names to resource values
-     */
-    @NonNull
-    Map<ResourceType, Map<String, ResourceValue>> getConfiguredProjectResources();
-
-    /**
-     * Returns the configured framework resources for the current file and
-     * configuration
-     *
-     * @return resource type maps to names to resource values
-     */
-    @NonNull
-    Map<ResourceType, Map<String, ResourceValue>> getConfiguredFrameworkResources();
-
-    /**
-     * If the current layout is an included layout rendered within an outer layout,
-     * returns the outer layout.
-     *
-     * @return the outer including layout, or null
-     */
-    @Nullable
-    Reference getIncludedWithin();
-
-    /**
-     * Called when the "Create" button is clicked.
-     */
-    void createConfigFile();
-
-    /**
-     * Called when an associated activity is picked
-     *
-     * @param fqcn the fully qualified class name for the associated activity context
-     */
-    void setActivity(@NonNull String fqcn);
-
-    /**
-     * Returns the associated layout canvas, if any
-     *
-     * @return the canvas, if any
-     */
-    @Nullable
-    LayoutCanvas getCanvas();
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/configuration/ConfigurationDescription.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/configuration/ConfigurationDescription.java
deleted file mode 100644
index 956ac18..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/configuration/ConfigurationDescription.java
+++ /dev/null
@@ -1,395 +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.ide.eclipse.adt.internal.editors.layout.configuration;
-
-import static com.android.SdkConstants.ANDROID_STYLE_RESOURCE_PREFIX;
-import static com.android.SdkConstants.ATTR_NAME;
-import static com.android.SdkConstants.ATTR_THEME;
-import static com.android.SdkConstants.PREFIX_RESOURCE_REF;
-import static com.android.SdkConstants.STYLE_RESOURCE_PREFIX;
-
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-import com.android.ide.common.resources.ResourceRepository;
-import com.android.ide.common.resources.configuration.DeviceConfigHelper;
-import com.android.ide.common.resources.configuration.FolderConfiguration;
-import com.android.ide.common.resources.configuration.LocaleQualifier;
-import com.android.ide.common.resources.configuration.ScreenSizeQualifier;
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.ide.eclipse.adt.internal.editors.manifest.ManifestInfo;
-import com.android.ide.eclipse.adt.internal.editors.manifest.ManifestInfo.ActivityAttributes;
-import com.android.ide.eclipse.adt.internal.sdk.AndroidTargetData;
-import com.android.ide.eclipse.adt.internal.sdk.Sdk;
-import com.android.resources.NightMode;
-import com.android.resources.ResourceFolderType;
-import com.android.resources.ScreenSize;
-import com.android.resources.UiMode;
-import com.android.sdklib.IAndroidTarget;
-import com.android.sdklib.devices.Device;
-import com.android.sdklib.devices.State;
-import com.google.common.base.Splitter;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.QualifiedName;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-
-import java.util.Collection;
-import java.util.List;
-
-/** A description of a configuration, used for persistence */
-public class ConfigurationDescription {
-    private static final String TAG_PREVIEWS = "previews";    //$NON-NLS-1$
-    private static final String TAG_PREVIEW = "preview";      //$NON-NLS-1$
-    private static final String ATTR_TARGET = "target";       //$NON-NLS-1$
-    private static final String ATTR_CONFIG = "config";       //$NON-NLS-1$
-    private static final String ATTR_LOCALE = "locale";       //$NON-NLS-1$
-    private static final String ATTR_ACTIVITY = "activity";   //$NON-NLS-1$
-    private static final String ATTR_DEVICE = "device";       //$NON-NLS-1$
-    private static final String ATTR_STATE = "devicestate";   //$NON-NLS-1$
-    private static final String ATTR_UIMODE = "ui";           //$NON-NLS-1$
-    private static final String ATTR_NIGHTMODE = "night";     //$NON-NLS-1$
-    private final static String SEP_LOCALE = "-";             //$NON-NLS-1$
-
-    /**
-     * Settings name for file-specific configuration preferences, such as which theme or
-     * device to render the current layout with
-     */
-    public final static QualifiedName NAME_CONFIG_STATE =
-        new QualifiedName(AdtPlugin.PLUGIN_ID, "state");//$NON-NLS-1$
-
-    /** The project corresponding to this configuration's description */
-    public final IProject project;
-
-    /** The display name */
-    public String displayName;
-
-    /** The theme */
-    public String theme;
-
-    /** The target */
-    public IAndroidTarget target;
-
-    /** The display name */
-    public FolderConfiguration folder;
-
-    /** The locale */
-    public Locale locale = Locale.ANY;
-
-    /** The device */
-    public Device device;
-
-    /** The device state */
-    public State state;
-
-    /** The activity */
-    public String activity;
-
-    /** UI mode */
-    @NonNull
-    public UiMode uiMode = UiMode.NORMAL;
-
-    /** Night mode */
-    @NonNull
-    public NightMode nightMode = NightMode.NOTNIGHT;
-
-    private ConfigurationDescription(@Nullable IProject project) {
-        this.project = project;
-    }
-
-    /**
-     * Returns the persistent configuration description from the given file
-     *
-     * @param file the file to look up a description from
-     * @return the description or null if never written
-     */
-    @Nullable
-    public static String getDescription(@NonNull IFile file) {
-        return AdtPlugin.getFileProperty(file, NAME_CONFIG_STATE);
-    }
-
-    /**
-     * Sets the persistent configuration description data for the given file
-     *
-     * @param file the file to associate the description with
-     * @param description the description
-     */
-    public static void setDescription(@NonNull IFile file, @NonNull String description) {
-        AdtPlugin.setFileProperty(file, NAME_CONFIG_STATE, description);
-    }
-
-    /**
-     * Creates a description from a given configuration
-     *
-     * @param project the project for this configuration's description
-     * @param configuration the configuration to describe
-     * @return a new configuration
-     */
-    public static ConfigurationDescription fromConfiguration(
-            @Nullable IProject project,
-            @NonNull Configuration configuration) {
-        ConfigurationDescription description = new ConfigurationDescription(project);
-        description.displayName = configuration.getDisplayName();
-        description.theme = configuration.getTheme();
-        description.target = configuration.getTarget();
-        description.folder = new FolderConfiguration();
-        description.folder.set(configuration.getFullConfig());
-        description.locale = configuration.getLocale();
-        description.device = configuration.getDevice();
-        description.state = configuration.getDeviceState();
-        description.activity = configuration.getActivity();
-        return description;
-    }
-
-    /**
-     * Initializes a string previously created with
-     * {@link #toXml(Document)}
-     *
-     * @param project the project for this configuration's description
-     * @param element the element to read back from
-     * @param deviceList list of available devices
-     * @return true if the configuration was initialized
-     */
-    @Nullable
-    public static ConfigurationDescription fromXml(
-            @Nullable IProject project,
-            @NonNull Element element,
-            @NonNull Collection<Device> deviceList) {
-        ConfigurationDescription description = new ConfigurationDescription(project);
-
-        if (!TAG_PREVIEW.equals(element.getTagName())) {
-            return null;
-        }
-
-        String displayName = element.getAttribute(ATTR_NAME);
-        if (!displayName.isEmpty()) {
-            description.displayName = displayName;
-        }
-
-        String config = element.getAttribute(ATTR_CONFIG);
-        Iterable<String> segments = Splitter.on('-').split(config);
-        description.folder = FolderConfiguration.getConfig(segments);
-
-        String theme = element.getAttribute(ATTR_THEME);
-        if (!theme.isEmpty()) {
-            description.theme = theme;
-        }
-
-        String targetId = element.getAttribute(ATTR_TARGET);
-        if (!targetId.isEmpty()) {
-            IAndroidTarget target = Configuration.stringToTarget(targetId);
-            description.target = target;
-        }
-
-        String localeString = element.getAttribute(ATTR_LOCALE);
-        if (!localeString.isEmpty()) {
-            // Load locale. Note that this can get overwritten by the
-            // project-wide settings read below.
-            String locales[] = localeString.split(SEP_LOCALE);
-            if (locales[0].length() > 0 && !LocaleQualifier.FAKE_VALUE.equals(locales[0])) {
-                String language = locales[0];
-                if (locales.length >= 2 && locales[1].length() > 0 && !LocaleQualifier.FAKE_VALUE.equals(locales[1])) {
-                    description.locale = Locale.create(LocaleQualifier.getQualifier(language + "-r" + locales[1]));
-                } else {
-                    description.locale = Locale.create(new LocaleQualifier(language));
-                }
-            } else {
-                description.locale = Locale.ANY;
-            }
-
-
-        }
-
-        String activity = element.getAttribute(ATTR_ACTIVITY);
-        if (activity.isEmpty()) {
-            activity = null;
-        }
-
-        String deviceString = element.getAttribute(ATTR_DEVICE);
-        if (!deviceString.isEmpty()) {
-            for (Device d : deviceList) {
-                if (d.getName().equals(deviceString)) {
-                    description.device = d;
-                    String stateName = element.getAttribute(ATTR_STATE);
-                    if (stateName.isEmpty() || stateName.equals("null")) {
-                        description.state = Configuration.getState(d, stateName);
-                    } else if (d.getAllStates().size() > 0) {
-                        description.state = d.getAllStates().get(0);
-                    }
-                    break;
-                }
-            }
-        }
-
-        String uiModeString = element.getAttribute(ATTR_UIMODE);
-        if (!uiModeString.isEmpty()) {
-            description.uiMode = UiMode.getEnum(uiModeString);
-            if (description.uiMode == null) {
-                description.uiMode = UiMode.NORMAL;
-            }
-        }
-
-        String nightModeString = element.getAttribute(ATTR_NIGHTMODE);
-        if (!nightModeString.isEmpty()) {
-            description.nightMode = NightMode.getEnum(nightModeString);
-            if (description.nightMode == null) {
-                description.nightMode = NightMode.NOTNIGHT;
-            }
-        }
-
-
-        // Should I really be storing the FULL configuration? Might be trouble if
-        // you bring a different device
-
-        return description;
-    }
-
-    /**
-     * Write this description into the given document as a new element.
-     *
-     * @param document the document to add the description to
-     * @return the newly inserted element
-     */
-    @NonNull
-    public Element toXml(Document document) {
-        Element element = document.createElement(TAG_PREVIEW);
-
-        element.setAttribute(ATTR_NAME, displayName);
-        FolderConfiguration fullConfig = folder;
-        String folderName = fullConfig.getFolderName(ResourceFolderType.LAYOUT);
-        element.setAttribute(ATTR_CONFIG, folderName);
-        if (theme != null) {
-            element.setAttribute(ATTR_THEME, theme);
-        }
-        if (target != null) {
-            element.setAttribute(ATTR_TARGET, Configuration.targetToString(target));
-        }
-
-        if (locale != null && (locale.hasLanguage() || locale.hasRegion())) {
-            String value;
-            if (locale.hasRegion()) {
-                value = locale.qualifier.getLanguage() + SEP_LOCALE + locale.qualifier.getRegion();
-            } else {
-                value = locale.qualifier.getLanguage();
-            }
-            element.setAttribute(ATTR_LOCALE, value);
-        }
-
-        if (device != null) {
-            element.setAttribute(ATTR_DEVICE, device.getName());
-            if (state != null) {
-                element.setAttribute(ATTR_STATE, state.getName());
-            }
-        }
-
-        if (activity != null) {
-            element.setAttribute(ATTR_ACTIVITY, activity);
-        }
-
-        if (uiMode != null && uiMode != UiMode.NORMAL) {
-            element.setAttribute(ATTR_UIMODE, uiMode.getResourceValue());
-        }
-
-        if (nightMode != null && nightMode != NightMode.NOTNIGHT) {
-            element.setAttribute(ATTR_NIGHTMODE, nightMode.getResourceValue());
-        }
-
-        Element parent = document.getDocumentElement();
-        if (parent == null) {
-            parent = document.createElement(TAG_PREVIEWS);
-            document.appendChild(parent);
-        }
-        parent.appendChild(element);
-
-        return element;
-    }
-
-    /** Returns the preferred theme, or null */
-    @Nullable
-    String computePreferredTheme() {
-        if (project == null) {
-            return "Theme";
-        }
-        ManifestInfo manifest = ManifestInfo.get(project);
-
-        // Look up the screen size for the current state
-        ScreenSize screenSize = null;
-        if (device != null) {
-            List<State> states = device.getAllStates();
-            for (State s : states) {
-                FolderConfiguration folderConfig = DeviceConfigHelper.getFolderConfig(s);
-                if (folderConfig != null) {
-                    ScreenSizeQualifier qualifier = folderConfig.getScreenSizeQualifier();
-                    screenSize = qualifier.getValue();
-                    break;
-                }
-            }
-        }
-
-        // Look up the default/fallback theme to use for this project (which
-        // depends on the screen size when no particular theme is specified
-        // in the manifest)
-        String defaultTheme = manifest.getDefaultTheme(target, screenSize);
-
-        String preferred = defaultTheme;
-        if (theme == null) {
-            // If we are rendering a layout in included context, pick the theme
-            // from the outer layout instead
-
-            if (activity != null) {
-                ActivityAttributes attributes = manifest.getActivityAttributes(activity);
-                if (attributes != null) {
-                    preferred = attributes.getTheme();
-                }
-            }
-            if (preferred == null) {
-                preferred = defaultTheme;
-            }
-            theme = preferred;
-        }
-
-        return preferred;
-    }
-
-    private void checkThemePrefix() {
-        if (theme != null && !theme.startsWith(PREFIX_RESOURCE_REF)) {
-            if (theme.isEmpty()) {
-                computePreferredTheme();
-                return;
-            }
-
-            if (target != null) {
-                Sdk sdk = Sdk.getCurrent();
-                if (sdk != null) {
-                    AndroidTargetData data = sdk.getTargetData(target);
-
-                    if (data != null) {
-                        ResourceRepository resources = data.getFrameworkResources();
-                        if (resources != null
-                            && resources.hasResourceItem(ANDROID_STYLE_RESOURCE_PREFIX + theme)) {
-                            theme = ANDROID_STYLE_RESOURCE_PREFIX + theme;
-                            return;
-                        }
-                    }
-                }
-            }
-
-            theme = STYLE_RESOURCE_PREFIX + theme;
-        }
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/configuration/ConfigurationMatcher.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/configuration/ConfigurationMatcher.java
deleted file mode 100644
index 9724d40..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/configuration/ConfigurationMatcher.java
+++ /dev/null
@@ -1,843 +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.ide.eclipse.adt.internal.editors.layout.configuration;
-
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-import com.android.ide.common.resources.ResourceFile;
-import com.android.ide.common.resources.configuration.DensityQualifier;
-import com.android.ide.common.resources.configuration.DeviceConfigHelper;
-import com.android.ide.common.resources.configuration.FolderConfiguration;
-import com.android.ide.common.resources.configuration.LocaleQualifier;
-import com.android.ide.common.resources.configuration.NightModeQualifier;
-import com.android.ide.common.resources.configuration.ResourceQualifier;
-import com.android.ide.common.resources.configuration.ScreenOrientationQualifier;
-import com.android.ide.common.resources.configuration.ScreenSizeQualifier;
-import com.android.ide.common.resources.configuration.UiModeQualifier;
-import com.android.ide.common.resources.configuration.VersionQualifier;
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.ide.eclipse.adt.AdtUtils;
-import com.android.ide.eclipse.adt.internal.editors.layout.LayoutEditorDelegate;
-import com.android.ide.eclipse.adt.internal.resources.manager.ProjectResources;
-import com.android.ide.eclipse.adt.internal.resources.manager.ResourceManager;
-import com.android.ide.eclipse.adt.internal.sdk.Sdk;
-import com.android.ide.eclipse.adt.io.IFileWrapper;
-import com.android.resources.Density;
-import com.android.resources.NightMode;
-import com.android.resources.ResourceType;
-import com.android.resources.ScreenOrientation;
-import com.android.resources.ScreenSize;
-import com.android.resources.UiMode;
-import com.android.sdklib.IAndroidTarget;
-import com.android.sdklib.devices.Device;
-import com.android.sdklib.devices.State;
-import com.android.sdklib.repository.PkgProps;
-import com.android.utils.Pair;
-import com.android.utils.SparseIntArray;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.ui.IEditorPart;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.List;
-
-/**
- * Produces matches for configurations
- * <p>
- * See algorithm described here:
- * http://developer.android.com/guide/topics/resources/providing-resources.html
- */
-public class ConfigurationMatcher {
-    private static final boolean PREFER_RECENT_RENDER_TARGETS = true;
-
-    private final ConfigurationChooser mConfigChooser;
-    private final Configuration mConfiguration;
-    private final IFile mEditedFile;
-    private final ProjectResources mResources;
-    private final boolean mUpdateUi;
-
-    ConfigurationMatcher(ConfigurationChooser chooser) {
-        this(chooser, chooser.getConfiguration(), chooser.getEditedFile(),
-                chooser.getResources(), true);
-    }
-
-    ConfigurationMatcher(
-            @NonNull ConfigurationChooser chooser,
-            @NonNull Configuration configuration,
-            @Nullable IFile editedFile,
-            @Nullable ProjectResources resources,
-            boolean updateUi) {
-        mConfigChooser = chooser;
-        mConfiguration = configuration;
-        mEditedFile = editedFile;
-        mResources = resources;
-        mUpdateUi = updateUi;
-    }
-
-    // ---- Finding matching configurations ----
-
-    private static class ConfigBundle {
-        private final FolderConfiguration config;
-        private int localeIndex;
-        private int dockModeIndex;
-        private int nightModeIndex;
-
-        private ConfigBundle() {
-            config = new FolderConfiguration();
-        }
-
-        private ConfigBundle(ConfigBundle bundle) {
-            config = new FolderConfiguration();
-            config.set(bundle.config);
-            localeIndex = bundle.localeIndex;
-            dockModeIndex = bundle.dockModeIndex;
-            nightModeIndex = bundle.nightModeIndex;
-        }
-    }
-
-    private static class ConfigMatch {
-        final FolderConfiguration testConfig;
-        final Device device;
-        final State state;
-        final ConfigBundle bundle;
-
-        public ConfigMatch(@NonNull FolderConfiguration testConfig, @NonNull Device device,
-                @NonNull State state, @NonNull ConfigBundle bundle) {
-            this.testConfig = testConfig;
-            this.device = device;
-            this.state = state;
-            this.bundle = bundle;
-        }
-
-        @Override
-        public String toString() {
-            return device.getName() + " - " + state.getName();
-        }
-    }
-
-    /**
-     * Checks whether the current edited file is the best match for a given config.
-     * <p>
-     * This tests against other versions of the same layout in the project.
-     * <p>
-     * The given config must be compatible with the current edited file.
-     * @param config the config to test.
-     * @return true if the current edited file is the best match in the project for the
-     * given config.
-     */
-    public boolean isCurrentFileBestMatchFor(FolderConfiguration config) {
-        ResourceFile match = mResources.getMatchingFile(mEditedFile.getName(),
-                ResourceType.LAYOUT, config);
-
-        if (match != null) {
-            return match.getFile().equals(mEditedFile);
-        } else {
-            // if we stop here that means the current file is not even a match!
-            AdtPlugin.log(IStatus.ERROR, "Current file is not a match for the given config.");
-        }
-
-        return false;
-    }
-
-    /**
-     * Adapts the current device/config selection so that it's compatible with
-     * the configuration.
-     * <p>
-     * If the current selection is compatible, nothing is changed.
-     * <p>
-     * If it's not compatible, configs from the current devices are tested.
-     * <p>
-     * If none are compatible, it reverts to
-     * {@link #findAndSetCompatibleConfig(boolean)}
-     */
-    void adaptConfigSelection(boolean needBestMatch) {
-        // check the device config (ie sans locale)
-        boolean needConfigChange = true; // if still true, we need to find another config.
-        boolean currentConfigIsCompatible = false;
-        State selectedState = mConfiguration.getDeviceState();
-        FolderConfiguration editedConfig = mConfiguration.getEditedConfig();
-        if (selectedState != null) {
-            FolderConfiguration currentConfig = DeviceConfigHelper.getFolderConfig(selectedState);
-            if (currentConfig != null && editedConfig.isMatchFor(currentConfig)) {
-                currentConfigIsCompatible = true; // current config is compatible
-                if (!needBestMatch || isCurrentFileBestMatchFor(currentConfig)) {
-                    needConfigChange = false;
-                }
-            }
-        }
-
-        if (needConfigChange) {
-            List<Locale> localeList = mConfigChooser.getLocaleList();
-
-            // if the current state/locale isn't a correct match, then
-            // look for another state/locale in the same device.
-            FolderConfiguration testConfig = new FolderConfiguration();
-
-            // first look in the current device.
-            State matchState = null;
-            int localeIndex = -1;
-            Device device = mConfiguration.getDevice();
-            if (device != null) {
-                mainloop: for (State state : device.getAllStates()) {
-                    testConfig.set(DeviceConfigHelper.getFolderConfig(state));
-
-                    // loop on the locales.
-                    for (int i = 0 ; i < localeList.size() ; i++) {
-                        Locale locale = localeList.get(i);
-
-                        // update the test config with the locale qualifiers
-                        testConfig.setLocaleQualifier(locale.qualifier);
-
-
-                        if (editedConfig.isMatchFor(testConfig) &&
-                                isCurrentFileBestMatchFor(testConfig)) {
-                            matchState = state;
-                            localeIndex = i;
-                            break mainloop;
-                        }
-                    }
-                }
-            }
-
-            if (matchState != null) {
-                mConfiguration.setDeviceState(matchState, true);
-                Locale locale = localeList.get(localeIndex);
-                mConfiguration.setLocale(locale, true);
-                if (mUpdateUi) {
-                    mConfigChooser.selectDeviceState(matchState);
-                    mConfigChooser.selectLocale(locale);
-                }
-                mConfiguration.syncFolderConfig();
-            } else {
-                // no match in current device with any state/locale
-                // attempt to find another device that can display this
-                // particular state.
-                findAndSetCompatibleConfig(currentConfigIsCompatible);
-            }
-        }
-    }
-
-    /**
-     * Finds a device/config that can display a configuration.
-     * <p>
-     * Once found the device and config combos are set to the config.
-     * <p>
-     * If there is no compatible configuration, a custom one is created.
-     *
-     * @param favorCurrentConfig if true, and no best match is found, don't
-     *            change the current config. This must only be true if the
-     *            current config is compatible.
-     */
-    void findAndSetCompatibleConfig(boolean favorCurrentConfig) {
-        List<Locale> localeList = mConfigChooser.getLocaleList();
-        Collection<Device> devices = mConfigChooser.getDevices();
-        FolderConfiguration editedConfig = mConfiguration.getEditedConfig();
-        FolderConfiguration currentConfig = mConfiguration.getFullConfig();
-
-        // list of compatible device/state/locale
-        List<ConfigMatch> anyMatches = new ArrayList<ConfigMatch>();
-
-        // list of actual best match (ie the file is a best match for the
-        // device/state)
-        List<ConfigMatch> bestMatches = new ArrayList<ConfigMatch>();
-
-        // get a locale that match the host locale roughly (may not be exact match on the region.)
-        int localeHostMatch = getLocaleMatch();
-
-        // build a list of combinations of non standard qualifiers to add to each device's
-        // qualifier set when testing for a match.
-        // These qualifiers are: locale, night-mode, car dock.
-        List<ConfigBundle> configBundles = new ArrayList<ConfigBundle>(200);
-
-        // If the edited file has locales, then we have to select a matching locale from
-        // the list.
-        // However, if it doesn't, we don't randomly take the first locale, we take one
-        // matching the current host locale (making sure it actually exist in the project)
-        int start, max;
-        if (editedConfig.getLocaleQualifier() != null || localeHostMatch == -1) {
-            // add all the locales
-            start = 0;
-            max = localeList.size();
-        } else {
-            // only add the locale host match
-            start = localeHostMatch;
-            max = localeHostMatch + 1; // test is <
-        }
-
-        for (int i = start ; i < max ; i++) {
-            Locale l = localeList.get(i);
-
-            ConfigBundle bundle = new ConfigBundle();
-            bundle.config.setLocaleQualifier(l.qualifier);
-
-            bundle.localeIndex = i;
-            configBundles.add(bundle);
-        }
-
-        // add the dock mode to the bundle combinations.
-        addDockModeToBundles(configBundles);
-
-        // add the night mode to the bundle combinations.
-        addNightModeToBundles(configBundles);
-
-        addRenderTargetToBundles(configBundles);
-
-        for (Device device : devices) {
-            for (State state : device.getAllStates()) {
-
-                // loop on the list of config bundles to create full
-                // configurations.
-                FolderConfiguration stateConfig = DeviceConfigHelper.getFolderConfig(state);
-                for (ConfigBundle bundle : configBundles) {
-                    // create a new config with device config
-                    FolderConfiguration testConfig = new FolderConfiguration();
-                    testConfig.set(stateConfig);
-
-                    // add on top of it, the extra qualifiers from the bundle
-                    testConfig.add(bundle.config);
-
-                    if (editedConfig.isMatchFor(testConfig)) {
-                        // this is a basic match. record it in case we don't
-                        // find a match
-                        // where the edited file is a best config.
-                        anyMatches.add(new ConfigMatch(testConfig, device, state, bundle));
-
-                        if (isCurrentFileBestMatchFor(testConfig)) {
-                            // this is what we want.
-                            bestMatches.add(new ConfigMatch(testConfig, device, state, bundle));
-                        }
-                    }
-                }
-            }
-        }
-
-        if (bestMatches.size() == 0) {
-            if (favorCurrentConfig) {
-                // quick check
-                if (!editedConfig.isMatchFor(currentConfig)) {
-                    AdtPlugin.log(IStatus.ERROR,
-                        "favorCurrentConfig can only be true if the current config is compatible");
-                }
-
-                // just display the warning
-                AdtPlugin.printErrorToConsole(mEditedFile.getProject(),
-                        String.format(
-                                "'%1$s' is not a best match for any device/locale combination.",
-                                editedConfig.toDisplayString()),
-                        String.format(
-                                "Displaying it with '%1$s'",
-                                currentConfig.toDisplayString()));
-            } else if (anyMatches.size() > 0) {
-                // select the best device anyway.
-                ConfigMatch match = selectConfigMatch(anyMatches);
-                mConfiguration.setDevice(match.device, true);
-                mConfiguration.setDeviceState(match.state, true);
-                mConfiguration.setLocale(localeList.get(match.bundle.localeIndex), true);
-                mConfiguration.setUiMode(UiMode.getByIndex(match.bundle.dockModeIndex), true);
-                mConfiguration.setNightMode(NightMode.getByIndex(match.bundle.nightModeIndex),
-                        true);
-
-                if (mUpdateUi) {
-                    mConfigChooser.selectDevice(mConfiguration.getDevice());
-                    mConfigChooser.selectDeviceState(mConfiguration.getDeviceState());
-                    mConfigChooser.selectLocale(mConfiguration.getLocale());
-                }
-
-                mConfiguration.syncFolderConfig();
-
-                // TODO: display a better warning!
-                AdtPlugin.printErrorToConsole(mEditedFile.getProject(),
-                        String.format(
-                                "'%1$s' is not a best match for any device/locale combination.",
-                                editedConfig.toDisplayString()),
-                        String.format(
-                                "Displaying it with '%1$s' which is compatible, but will " +
-                                "actually be displayed with another more specific version of " +
-                                "the layout.",
-                                currentConfig.toDisplayString()));
-
-            } else {
-                // TODO: there is no device/config able to display the layout, create one.
-                // For the base config values, we'll take the first device and state,
-                // and replace whatever qualifier required by the layout file.
-            }
-        } else {
-            ConfigMatch match = selectConfigMatch(bestMatches);
-            mConfiguration.setDevice(match.device, true);
-            mConfiguration.setDeviceState(match.state, true);
-            mConfiguration.setLocale(localeList.get(match.bundle.localeIndex), true);
-            mConfiguration.setUiMode(UiMode.getByIndex(match.bundle.dockModeIndex), true);
-            mConfiguration.setNightMode(NightMode.getByIndex(match.bundle.nightModeIndex), true);
-
-            mConfiguration.syncFolderConfig();
-
-            if (mUpdateUi) {
-                mConfigChooser.selectDevice(mConfiguration.getDevice());
-                mConfigChooser.selectDeviceState(mConfiguration.getDeviceState());
-                mConfigChooser.selectLocale(mConfiguration.getLocale());
-            }
-        }
-    }
-
-    private void addRenderTargetToBundles(List<ConfigBundle> configBundles) {
-        Pair<Locale, IAndroidTarget> state = Configuration.loadRenderState(mConfigChooser);
-        if (state != null) {
-            IAndroidTarget target = state.getSecond();
-            if (target != null) {
-                int apiLevel = target.getVersion().getApiLevel();
-                for (ConfigBundle bundle : configBundles) {
-                    bundle.config.setVersionQualifier(
-                            new VersionQualifier(apiLevel));
-                }
-            }
-        }
-    }
-
-    private void addDockModeToBundles(List<ConfigBundle> addConfig) {
-        ArrayList<ConfigBundle> list = new ArrayList<ConfigBundle>();
-
-        // loop on each item and for each, add all variations of the dock modes
-        for (ConfigBundle bundle : addConfig) {
-            int index = 0;
-            for (UiMode mode : UiMode.values()) {
-                ConfigBundle b = new ConfigBundle(bundle);
-                b.config.setUiModeQualifier(new UiModeQualifier(mode));
-                b.dockModeIndex = index++;
-                list.add(b);
-            }
-        }
-
-        addConfig.clear();
-        addConfig.addAll(list);
-    }
-
-    private void addNightModeToBundles(List<ConfigBundle> addConfig) {
-        ArrayList<ConfigBundle> list = new ArrayList<ConfigBundle>();
-
-        // loop on each item and for each, add all variations of the night modes
-        for (ConfigBundle bundle : addConfig) {
-            int index = 0;
-            for (NightMode mode : NightMode.values()) {
-                ConfigBundle b = new ConfigBundle(bundle);
-                b.config.setNightModeQualifier(new NightModeQualifier(mode));
-                b.nightModeIndex = index++;
-                list.add(b);
-            }
-        }
-
-        addConfig.clear();
-        addConfig.addAll(list);
-    }
-
-    private int getLocaleMatch() {
-        java.util.Locale defaultLocale = java.util.Locale.getDefault();
-        if (defaultLocale != null) {
-            String currentLanguage = defaultLocale.getLanguage();
-            String currentRegion = defaultLocale.getCountry();
-
-            List<Locale> localeList = mConfigChooser.getLocaleList();
-            final int count = localeList.size();
-            for (int l = 0; l < count; l++) {
-                Locale locale = localeList.get(l);
-                LocaleQualifier qualifier = locale.qualifier;
-
-                // there's always a ##/Other or ##/Any (which is the same, the region
-                // contains FAKE_REGION_VALUE). If we don't find a perfect region match
-                // we take the fake region. Since it's last in the list, this makes the
-                // test easy.
-                if (qualifier.getLanguage().equals(currentLanguage) &&
-                        (qualifier.getRegion() == null || qualifier.getRegion().equals(currentRegion))) {
-                      return l;
-                }
-            }
-
-            // if no locale match the current local locale, it's likely that it is
-            // the default one which is the last one.
-            return count - 1;
-        }
-
-        return -1;
-    }
-
-    private ConfigMatch selectConfigMatch(List<ConfigMatch> matches) {
-        // API 11-13: look for a x-large device
-        Comparator<ConfigMatch> comparator = null;
-        Sdk sdk = Sdk.getCurrent();
-        if (sdk != null) {
-            IAndroidTarget projectTarget = sdk.getTarget(mEditedFile.getProject());
-            if (projectTarget != null) {
-                int apiLevel = projectTarget.getVersion().getApiLevel();
-                if (apiLevel >= 11 && apiLevel < 14) {
-                    // TODO: Maybe check the compatible-screen tag in the manifest to figure out
-                    // what kind of device should be used for display.
-                    comparator = new TabletConfigComparator();
-                }
-            }
-        }
-        if (comparator == null) {
-            // lets look for a high density device
-            comparator = new PhoneConfigComparator();
-        }
-        Collections.sort(matches, comparator);
-
-        // Look at the currently active editor to see if it's a layout editor, and if so,
-        // look up its configuration and if the configuration is in our match list,
-        // use it. This means we "preserve" the current configuration when you open
-        // new layouts.
-        IEditorPart activeEditor = AdtUtils.getActiveEditor();
-        LayoutEditorDelegate delegate = LayoutEditorDelegate.fromEditor(activeEditor);
-        if (delegate != null
-                // (Only do this when the two files are in the same project)
-                && delegate.getEditor().getProject() == mEditedFile.getProject()) {
-            FolderConfiguration configuration = delegate.getGraphicalEditor().getConfiguration();
-            if (configuration != null) {
-                for (ConfigMatch match : matches) {
-                    if (configuration.equals(match.testConfig)) {
-                        return match;
-                    }
-                }
-            }
-        }
-
-        // the list has been sorted so that the first item is the best config
-        return matches.get(0);
-    }
-
-    /** Return the default render target to use, or null if no strong preference */
-    @Nullable
-    static IAndroidTarget findDefaultRenderTarget(ConfigurationChooser chooser) {
-        if (PREFER_RECENT_RENDER_TARGETS) {
-            // Use the most recent target
-            List<IAndroidTarget> targetList = chooser.getTargetList();
-            if (!targetList.isEmpty()) {
-                return targetList.get(targetList.size() - 1);
-            }
-        }
-
-        IProject project = chooser.getProject();
-        // Default to layoutlib version 5
-        Sdk current = Sdk.getCurrent();
-        if (current != null) {
-            IAndroidTarget projectTarget = current.getTarget(project);
-            int minProjectApi = Integer.MAX_VALUE;
-            if (projectTarget != null) {
-                if (!projectTarget.isPlatform() && projectTarget.hasRenderingLibrary()) {
-                    // Renderable non-platform targets are all going to be adequate (they
-                    // will have at least version 5 of layoutlib) so use the project
-                    // target as the render target.
-                    return projectTarget;
-                }
-
-                if (projectTarget.getVersion().isPreview()
-                        && projectTarget.hasRenderingLibrary()) {
-                    // If the project target is a preview version, then just use it
-                    return projectTarget;
-                }
-
-                minProjectApi = projectTarget.getVersion().getApiLevel();
-            }
-
-            // We want to pick a render target that contains at least version 5 (and
-            // preferably version 6) of the layout library. To do this, we go through the
-            // targets and pick the -smallest- API level that is both simultaneously at
-            // least as big as the project API level, and supports layoutlib level 5+.
-            IAndroidTarget best = null;
-            int bestApiLevel = Integer.MAX_VALUE;
-
-            for (IAndroidTarget target : current.getTargets()) {
-                // Non-platform targets are not chosen as the default render target
-                if (!target.isPlatform()) {
-                    continue;
-                }
-
-                int apiLevel = target.getVersion().getApiLevel();
-
-                // Ignore targets that have a lower API level than the minimum project
-                // API level:
-                if (apiLevel < minProjectApi) {
-                    continue;
-                }
-
-                // Look up the layout lib API level. This property is new so it will only
-                // be defined for version 6 or higher, which means non-null is adequate
-                // to see if this target is eligible:
-                String property = target.getProperty(PkgProps.LAYOUTLIB_API);
-                // In addition, Android 3.0 with API level 11 had version 5.0 which is adequate:
-                if (property != null || apiLevel >= 11) {
-                    if (apiLevel < bestApiLevel) {
-                        bestApiLevel = apiLevel;
-                        best = target;
-                    }
-                }
-            }
-
-            return best;
-        }
-
-        return null;
-    }
-
-    /**
-     * Attempts to find a close state among a list
-     *
-     * @param oldConfig the reference config.
-     * @param states the list of states to search through
-     * @return the name of the closest state match, or possibly null if no states are compatible
-     * (this can only happen if the states don't have a single qualifier that is the same).
-     */
-    @Nullable
-    static String getClosestMatch(@NonNull FolderConfiguration oldConfig,
-            @NonNull List<State> states) {
-
-        // create 2 lists as we're going to go through one and put the
-        // candidates in the other.
-        List<State> list1 = new ArrayList<State>(states.size());
-        List<State> list2 = new ArrayList<State>(states.size());
-
-        list1.addAll(states);
-
-        final int count = FolderConfiguration.getQualifierCount();
-        for (int i = 0 ; i < count ; i++) {
-            // compute the new candidate list by only taking states that have
-            // the same i-th qualifier as the old state
-            for (State s : list1) {
-                ResourceQualifier oldQualifier = oldConfig.getQualifier(i);
-
-                FolderConfiguration folderConfig = DeviceConfigHelper.getFolderConfig(s);
-                ResourceQualifier newQualifier =
-                        folderConfig != null ? folderConfig.getQualifier(i) : null;
-
-                if (oldQualifier == null) {
-                    if (newQualifier == null) {
-                        list2.add(s);
-                    }
-                } else if (oldQualifier.equals(newQualifier)) {
-                    list2.add(s);
-                }
-            }
-
-            // at any moment if the new candidate list contains only one match, its name
-            // is returned.
-            if (list2.size() == 1) {
-                return list2.get(0).getName();
-            }
-
-            // if the list is empty, then all the new states failed. It is considered ok, and
-            // we move to the next qualifier anyway. This way, if a qualifier is different for
-            // all new states it is simply ignored.
-            if (list2.size() != 0) {
-                // move the candidates back into list1.
-                list1.clear();
-                list1.addAll(list2);
-                list2.clear();
-            }
-        }
-
-        // the only way to reach this point is if there's an exact match.
-        // (if there are more than one, then there's a duplicate state and it doesn't matter,
-        // we take the first one).
-        if (list1.size() > 0) {
-            return list1.get(0).getName();
-        }
-
-        return null;
-    }
-
-    /**
-     * Returns the layout {@link IFile} which best matches the configuration
-     * selected in the given configuration chooser.
-     *
-     * @param chooser the associated configuration chooser holding project state
-     * @return the file which best matches the settings
-     */
-    @Nullable
-    public static IFile getBestFileMatch(ConfigurationChooser chooser) {
-        // get the resources of the file's project.
-        ResourceManager manager = ResourceManager.getInstance();
-        ProjectResources resources = manager.getProjectResources(chooser.getProject());
-        if (resources == null) {
-            return null;
-        }
-
-        // From the resources, look for a matching file
-        IFile editedFile = chooser.getEditedFile();
-        if (editedFile == null) {
-            return null;
-        }
-        String name = editedFile.getName();
-        FolderConfiguration config = chooser.getConfiguration().getFullConfig();
-        ResourceFile match = resources.getMatchingFile(name, ResourceType.LAYOUT, config);
-
-        if (match != null) {
-            // In Eclipse, the match's file is always an instance of IFileWrapper
-            return ((IFileWrapper) match.getFile()).getIFile();
-        }
-
-        return null;
-    }
-
-    /**
-     * Note: this comparator imposes orderings that are inconsistent with equals.
-     */
-    private static class TabletConfigComparator implements Comparator<ConfigMatch> {
-        @Override
-        public int compare(ConfigMatch o1, ConfigMatch o2) {
-            FolderConfiguration config1 = o1 != null ? o1.testConfig : null;
-            FolderConfiguration config2 = o2 != null ? o2.testConfig : null;
-            if (config1 == null) {
-                if (config2 == null) {
-                    return 0;
-                } else {
-                    return -1;
-                }
-            } else if (config2 == null) {
-                return 1;
-            }
-
-            ScreenSizeQualifier size1 = config1.getScreenSizeQualifier();
-            ScreenSizeQualifier size2 = config2.getScreenSizeQualifier();
-            ScreenSize ss1 = size1 != null ? size1.getValue() : ScreenSize.NORMAL;
-            ScreenSize ss2 = size2 != null ? size2.getValue() : ScreenSize.NORMAL;
-
-            // X-LARGE is better than all others (which are considered identical)
-            // if both X-LARGE, then LANDSCAPE is better than all others (which are identical)
-
-            if (ss1 == ScreenSize.XLARGE) {
-                if (ss2 == ScreenSize.XLARGE) {
-                    ScreenOrientationQualifier orientation1 =
-                            config1.getScreenOrientationQualifier();
-                    ScreenOrientation so1 = orientation1.getValue();
-                    if (so1 == null) {
-                        so1 = ScreenOrientation.PORTRAIT;
-                    }
-                    ScreenOrientationQualifier orientation2 =
-                            config2.getScreenOrientationQualifier();
-                    ScreenOrientation so2 = orientation2.getValue();
-                    if (so2 == null) {
-                        so2 = ScreenOrientation.PORTRAIT;
-                    }
-
-                    if (so1 == ScreenOrientation.LANDSCAPE) {
-                        if (so2 == ScreenOrientation.LANDSCAPE) {
-                            return 0;
-                        } else {
-                            return -1;
-                        }
-                    } else if (so2 == ScreenOrientation.LANDSCAPE) {
-                        return 1;
-                    } else {
-                        return 0;
-                    }
-                } else {
-                    return -1;
-                }
-            } else if (ss2 == ScreenSize.XLARGE) {
-                return 1;
-            } else {
-                return 0;
-            }
-        }
-    }
-
-    /**
-     * Note: this comparator imposes orderings that are inconsistent with equals.
-     */
-    private static class PhoneConfigComparator implements Comparator<ConfigMatch> {
-
-        private final SparseIntArray mDensitySort = new SparseIntArray(4);
-
-        public PhoneConfigComparator() {
-            // put the sort order for the density.
-            mDensitySort.put(Density.HIGH.getDpiValue(),   1);
-            mDensitySort.put(Density.MEDIUM.getDpiValue(), 2);
-            mDensitySort.put(Density.XHIGH.getDpiValue(),  3);
-            mDensitySort.put(Density.LOW.getDpiValue(),    4);
-        }
-
-        @Override
-        public int compare(ConfigMatch o1, ConfigMatch o2) {
-            FolderConfiguration config1 = o1 != null ? o1.testConfig : null;
-            FolderConfiguration config2 = o2 != null ? o2.testConfig : null;
-            if (config1 == null) {
-                if (config2 == null) {
-                    return 0;
-                } else {
-                    return -1;
-                }
-            } else if (config2 == null) {
-                return 1;
-            }
-
-            int dpi1 = Density.DEFAULT_DENSITY;
-            int dpi2 = Density.DEFAULT_DENSITY;
-
-            DensityQualifier dpiQualifier1 = config1.getDensityQualifier();
-            if (dpiQualifier1 != null) {
-                Density value = dpiQualifier1.getValue();
-                dpi1 = value != null ? value.getDpiValue() : Density.DEFAULT_DENSITY;
-            }
-            dpi1 = mDensitySort.get(dpi1, 100 /* valueIfKeyNotFound*/);
-
-            DensityQualifier dpiQualifier2 = config2.getDensityQualifier();
-            if (dpiQualifier2 != null) {
-                Density value = dpiQualifier2.getValue();
-                dpi2 = value != null ? value.getDpiValue() : Density.DEFAULT_DENSITY;
-            }
-            dpi2 = mDensitySort.get(dpi2, 100 /* valueIfKeyNotFound*/);
-
-            if (dpi1 == dpi2) {
-                // portrait is better
-                ScreenOrientation so1 = ScreenOrientation.PORTRAIT;
-                ScreenOrientationQualifier orientationQualifier1 =
-                        config1.getScreenOrientationQualifier();
-                if (orientationQualifier1 != null) {
-                    so1 = orientationQualifier1.getValue();
-                    if (so1 == null) {
-                        so1 = ScreenOrientation.PORTRAIT;
-                    }
-                }
-                ScreenOrientation so2 = ScreenOrientation.PORTRAIT;
-                ScreenOrientationQualifier orientationQualifier2 =
-                        config2.getScreenOrientationQualifier();
-                if (orientationQualifier2 != null) {
-                    so2 = orientationQualifier2.getValue();
-                    if (so2 == null) {
-                        so2 = ScreenOrientation.PORTRAIT;
-                    }
-                }
-
-                if (so1 == ScreenOrientation.PORTRAIT) {
-                    if (so2 == ScreenOrientation.PORTRAIT) {
-                        return 0;
-                    } else {
-                        return -1;
-                    }
-                } else if (so2 == ScreenOrientation.PORTRAIT) {
-                    return 1;
-                } else {
-                    return 0;
-                }
-            }
-
-            return dpi1 - dpi2;
-        }
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/configuration/ConfigurationMenuListener.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/configuration/ConfigurationMenuListener.java
deleted file mode 100644
index a791c63..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/configuration/ConfigurationMenuListener.java
+++ /dev/null
@@ -1,290 +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.ide.eclipse.adt.internal.editors.layout.configuration;
-
-import static com.android.ide.eclipse.adt.internal.editors.layout.gle2.RenderPreviewMode.CUSTOM;
-import static com.android.ide.eclipse.adt.internal.editors.layout.gle2.RenderPreviewMode.DEFAULT;
-import static com.android.ide.eclipse.adt.internal.editors.layout.gle2.RenderPreviewMode.INCLUDES;
-import static com.android.ide.eclipse.adt.internal.editors.layout.gle2.RenderPreviewMode.LOCALES;
-import static com.android.ide.eclipse.adt.internal.editors.layout.gle2.RenderPreviewMode.NONE;
-import static com.android.ide.eclipse.adt.internal.editors.layout.gle2.RenderPreviewMode.SCREENS;
-import static com.android.ide.eclipse.adt.internal.editors.layout.gle2.RenderPreviewMode.VARIATIONS;
-
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-import com.android.ide.common.resources.ResourceFolder;
-import com.android.ide.common.resources.configuration.FolderConfiguration;
-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.ide.eclipse.adt.internal.editors.layout.LayoutEditorDelegate;
-import com.android.ide.eclipse.adt.internal.editors.layout.gle2.IncludeFinder;
-import com.android.ide.eclipse.adt.internal.editors.layout.gle2.IncludeFinder.Reference;
-import com.android.ide.eclipse.adt.internal.editors.layout.gle2.LayoutCanvas;
-import com.android.ide.eclipse.adt.internal.editors.layout.gle2.RenderPreviewManager;
-import com.android.ide.eclipse.adt.internal.editors.layout.gle2.RenderPreviewMode;
-import com.android.ide.eclipse.adt.internal.preferences.AdtPrefs;
-import com.android.ide.eclipse.adt.internal.resources.manager.ResourceManager;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IFolder;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.graphics.Rectangle;
-import org.eclipse.swt.widgets.Menu;
-import org.eclipse.swt.widgets.MenuItem;
-import org.eclipse.swt.widgets.ToolItem;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.PartInitException;
-
-import java.util.List;
-
-/**
- * The {@linkplain ConfigurationMenuListener} class is responsible for
- * generating the configuration menu in the {@link ConfigurationChooser}.
- */
-class ConfigurationMenuListener extends SelectionAdapter {
-    private static final String ICON_NEW_CONFIG = "newConfig";    //$NON-NLS-1$
-    private static final int ACTION_SELECT_CONFIG = 1;
-    private static final int ACTION_CREATE_CONFIG_FILE = 2;
-    private static final int ACTION_ADD = 3;
-    private static final int ACTION_DELETE_ALL = 4;
-    private static final int ACTION_PREVIEW_MODE = 5;
-
-    private final ConfigurationChooser mConfigChooser;
-    private final int mAction;
-    private final IFile mResource;
-    private final RenderPreviewMode mMode;
-
-    ConfigurationMenuListener(
-            @NonNull ConfigurationChooser configChooser,
-            int action,
-            @Nullable IFile resource,
-            @Nullable RenderPreviewMode mode) {
-        mConfigChooser = configChooser;
-        mAction = action;
-        mResource = resource;
-        mMode = mode;
-    }
-
-    @Override
-    public void widgetSelected(SelectionEvent e) {
-        switch (mAction) {
-            case ACTION_SELECT_CONFIG: {
-                try {
-                    AdtPlugin.openFile(mResource, null, false);
-                } catch (PartInitException ex) {
-                    AdtPlugin.log(ex, null);
-                }
-                return;
-            }
-            case ACTION_CREATE_CONFIG_FILE: {
-                ConfigurationClient client = mConfigChooser.getClient();
-                if (client != null) {
-                    client.createConfigFile();
-                }
-                return;
-            }
-        }
-
-        IEditorPart activeEditor = AdtUtils.getActiveEditor();
-        LayoutEditorDelegate delegate = LayoutEditorDelegate.fromEditor(activeEditor);
-        IFile editedFile = mConfigChooser.getEditedFile();
-
-        if (delegate == null || editedFile == null) {
-            return;
-        }
-        // (Only do this when the two files are in the same project)
-        IProject project = delegate.getEditor().getProject();
-        if (project == null ||
-                !project.equals(editedFile.getProject())) {
-            return;
-        }
-        LayoutCanvas canvas = delegate.getGraphicalEditor().getCanvasControl();
-        RenderPreviewManager previewManager = canvas.getPreviewManager();
-
-        switch (mAction) {
-            case ACTION_ADD: {
-                previewManager.addAsThumbnail();
-                break;
-            }
-            case ACTION_PREVIEW_MODE: {
-                previewManager.selectMode(mMode);
-                break;
-            }
-            case ACTION_DELETE_ALL: {
-                previewManager.deleteManualPreviews();
-                break;
-            }
-            default: assert false : mAction;
-        }
-        canvas.setFitScale(true /*onlyZoomOut*/, false /*allowZoomIn*/);
-        canvas.redraw();
-    }
-
-    static void show(ConfigurationChooser chooser, ToolItem combo) {
-        Menu menu = new Menu(chooser.getShell(), SWT.POP_UP);
-        RenderPreviewMode mode = AdtPrefs.getPrefs().getRenderPreviewMode();
-
-        // Configuration Previews
-        create(menu, "Add As Thumbnail...",
-                new ConfigurationMenuListener(chooser, ACTION_ADD, null, null),
-                SWT.PUSH, false);
-        if (mode == RenderPreviewMode.CUSTOM) {
-            MenuItem item = create(menu, "Delete All Thumbnails",
-                new ConfigurationMenuListener(chooser, ACTION_DELETE_ALL, null, null),
-                SWT.PUSH, false);
-            IEditorPart activeEditor = AdtUtils.getActiveEditor();
-            LayoutEditorDelegate delegate = LayoutEditorDelegate.fromEditor(activeEditor);
-            if (delegate != null) {
-                LayoutCanvas canvas = delegate.getGraphicalEditor().getCanvasControl();
-                RenderPreviewManager previewManager = canvas.getPreviewManager();
-                if (!previewManager.hasManualPreviews()) {
-                    item.setEnabled(false);
-                }
-            }
-        }
-
-        @SuppressWarnings("unused")
-        MenuItem configSeparator = new MenuItem(menu, SWT.SEPARATOR);
-
-        create(menu, "Preview Representative Sample",
-                new ConfigurationMenuListener(chooser, ACTION_PREVIEW_MODE, null,
-                        DEFAULT), SWT.RADIO, mode == DEFAULT);
-        create(menu, "Preview All Screen Sizes",
-                new ConfigurationMenuListener(chooser, ACTION_PREVIEW_MODE, null,
-                        SCREENS), SWT.RADIO, mode == SCREENS);
-
-        MenuItem localeItem = create(menu, "Preview All Locales",
-                new ConfigurationMenuListener(chooser, ACTION_PREVIEW_MODE, null,
-                        LOCALES), SWT.RADIO, mode == LOCALES);
-        if (chooser.getLocaleList().size() <= 1) {
-            localeItem.setEnabled(false);
-        }
-
-        boolean canPreviewIncluded = false;
-        IProject project = chooser.getProject();
-        if (project != null) {
-            IncludeFinder finder = IncludeFinder.get(project);
-            final List<Reference> includedBy = finder.getIncludedBy(chooser.getEditedFile());
-            canPreviewIncluded = includedBy != null && !includedBy.isEmpty();
-        }
-        //if (!graphicalEditor.renderingSupports(Capability.EMBEDDED_LAYOUT)) {
-        //    canPreviewIncluded = false;
-        //}
-        MenuItem includedItem = create(menu, "Preview Included",
-                new ConfigurationMenuListener(chooser, ACTION_PREVIEW_MODE, null,
-                        INCLUDES), SWT.RADIO, mode == INCLUDES);
-        if (!canPreviewIncluded) {
-            includedItem.setEnabled(false);
-        }
-
-        IFile file = chooser.getEditedFile();
-        List<IFile> variations = AdtUtils.getResourceVariations(file, true);
-        MenuItem variationsItem = create(menu, "Preview Layout Versions",
-                new ConfigurationMenuListener(chooser, ACTION_PREVIEW_MODE, null,
-                        VARIATIONS), SWT.RADIO, mode == VARIATIONS);
-        if (variations.size() <= 1) {
-            variationsItem.setEnabled(false);
-        }
-
-        create(menu, "Manual Previews",
-                new ConfigurationMenuListener(chooser, ACTION_PREVIEW_MODE, null,
-                        CUSTOM), SWT.RADIO, mode == CUSTOM);
-        create(menu, "None",
-                new ConfigurationMenuListener(chooser, ACTION_PREVIEW_MODE, null,
-                        NONE), SWT.RADIO, mode == NONE);
-
-        if (variations.size() > 1) {
-            @SuppressWarnings("unused")
-            MenuItem separator = new MenuItem(menu, SWT.SEPARATOR);
-
-            ResourceManager manager = ResourceManager.getInstance();
-            for (final IFile resource : variations) {
-                IFolder parent = (IFolder) resource.getParent();
-                ResourceFolder parentResource = manager.getResourceFolder(parent);
-                FolderConfiguration configuration = parentResource.getConfiguration();
-                String title = configuration.toDisplayString();
-
-                MenuItem item = create(menu, title,
-                        new ConfigurationMenuListener(chooser, ACTION_SELECT_CONFIG,
-                                resource, null),
-                        SWT.CHECK, false);
-
-                if (file != null) {
-                    boolean selected = file.equals(resource);
-                    if (selected) {
-                        item.setSelection(true);
-                        item.setEnabled(false);
-                    }
-                }
-            }
-        }
-
-        Configuration configuration = chooser.getConfiguration();
-        if (configuration.getEditedConfig() != null &&
-                !configuration.getEditedConfig().equals(configuration.getFullConfig())) {
-            if (variations.size() > 0) {
-                @SuppressWarnings("unused")
-                MenuItem separator = new MenuItem(menu, SWT.SEPARATOR);
-            }
-
-            // Add action for creating a new configuration
-            MenuItem item = create(menu, "Create New...",
-                    new ConfigurationMenuListener(chooser, ACTION_CREATE_CONFIG_FILE,
-                            null, null),
-                    SWT.PUSH, false);
-            item.setImage(IconFactory.getInstance().getIcon(ICON_NEW_CONFIG));
-        }
-
-        Rectangle bounds = combo.getBounds();
-        Point location = new Point(bounds.x, bounds.y + bounds.height);
-        location = combo.getParent().toDisplay(location);
-        menu.setLocation(location.x, location.y);
-        menu.setVisible(true);
-    }
-
-    @NonNull
-    public static MenuItem create(@NonNull Menu menu, String title,
-            ConfigurationMenuListener listener, int style, boolean selected) {
-        MenuItem item = new MenuItem(menu, style);
-        item.setText(title);
-        item.addSelectionListener(listener);
-        if (selected) {
-            item.setSelection(true);
-        }
-        return item;
-    }
-
-    @NonNull
-    static MenuItem addTogglePreviewModeAction(
-            @NonNull Menu menu,
-            @NonNull String title,
-            @NonNull ConfigurationChooser chooser,
-            @NonNull RenderPreviewMode mode) {
-        boolean selected = AdtPrefs.getPrefs().getRenderPreviewMode() == mode;
-        if (selected) {
-            mode = RenderPreviewMode.NONE;
-        }
-        return create(menu, title,
-                new ConfigurationMenuListener(chooser, ACTION_PREVIEW_MODE, null, mode),
-                SWT.CHECK, selected);
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/configuration/DeviceMenuListener.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/configuration/DeviceMenuListener.java
deleted file mode 100644
index 72910f9..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/configuration/DeviceMenuListener.java
+++ /dev/null
@@ -1,199 +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.ide.eclipse.adt.internal.editors.layout.configuration;
-
-import static com.android.ide.common.rendering.HardwareConfigHelper.MANUFACTURER_GENERIC;
-import static com.android.ide.common.rendering.HardwareConfigHelper.getGenericLabel;
-import static com.android.ide.common.rendering.HardwareConfigHelper.getNexusLabel;
-import static com.android.ide.common.rendering.HardwareConfigHelper.isGeneric;
-import static com.android.ide.common.rendering.HardwareConfigHelper.isNexus;
-import static com.android.ide.common.rendering.HardwareConfigHelper.sortNexusList;
-
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-import com.android.ide.eclipse.adt.internal.editors.layout.gle2.RenderPreviewMode;
-import com.android.ide.eclipse.adt.internal.sdk.Sdk;
-import com.android.sdklib.devices.Device;
-import com.android.sdklib.internal.avd.AvdInfo;
-import com.android.sdklib.internal.avd.AvdManager;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.graphics.Rectangle;
-import org.eclipse.swt.widgets.Menu;
-import org.eclipse.swt.widgets.MenuItem;
-import org.eclipse.swt.widgets.ToolItem;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.List;
-import java.util.Map;
-import java.util.TreeMap;
-
-/**
- * The {@linkplain DeviceMenuListener} class is responsible for generating the device
- * menu in the {@link ConfigurationChooser}.
- */
-class DeviceMenuListener extends SelectionAdapter {
-    private final ConfigurationChooser mConfigChooser;
-    private final Device mDevice;
-
-    DeviceMenuListener(
-            @NonNull ConfigurationChooser configChooser,
-            @Nullable Device device) {
-        mConfigChooser = configChooser;
-        mDevice = device;
-    }
-
-    @Override
-    public void widgetSelected(SelectionEvent e) {
-        mConfigChooser.selectDevice(mDevice);
-        mConfigChooser.onDeviceChange();
-    }
-
-    static void show(final ConfigurationChooser chooser, ToolItem combo) {
-        Configuration configuration = chooser.getConfiguration();
-        Device current = configuration.getDevice();
-        Menu menu = new Menu(chooser.getShell(), SWT.POP_UP);
-
-        Collection<Device> deviceCollection = chooser.getDevices();
-        Sdk sdk = Sdk.getCurrent();
-        if (sdk != null) {
-            AvdManager avdManager = sdk.getAvdManager();
-            if (avdManager != null) {
-                boolean separatorNeeded = false;
-                AvdInfo[] avds = avdManager.getValidAvds();
-                for (AvdInfo avd : avds) {
-                    for (Device device : deviceCollection) {
-                        if (device.getManufacturer().equals(avd.getDeviceManufacturer())
-                                && device.getName().equals(avd.getDeviceName())) {
-                            separatorNeeded = true;
-                            MenuItem item = new MenuItem(menu, SWT.CHECK);
-                            item.setText(avd.getName());
-                            item.setSelection(current == device);
-
-                            item.addSelectionListener(new DeviceMenuListener(chooser, device));
-                        }
-                    }
-                }
-
-                if (separatorNeeded) {
-                    @SuppressWarnings("unused")
-                    MenuItem separator = new MenuItem(menu, SWT.SEPARATOR);
-                }
-            }
-        }
-
-        // Group the devices by manufacturer, then put them in the menu.
-        // If we don't have anything but Nexus devices, group them together rather than
-        // make many manufacturer submenus.
-        boolean haveNexus = false;
-        boolean haveNonNexus = false;
-        if (!deviceCollection.isEmpty()) {
-            Map<String, List<Device>> manufacturers = new TreeMap<String, List<Device>>();
-            for (Device device : deviceCollection) {
-                List<Device> devices;
-                if (isNexus(device)) {
-                    haveNexus = true;
-                } else if (!isGeneric(device)) {
-                    haveNonNexus = true;
-                }
-                if (manufacturers.containsKey(device.getManufacturer())) {
-                    devices = manufacturers.get(device.getManufacturer());
-                } else {
-                    devices = new ArrayList<Device>();
-                    manufacturers.put(device.getManufacturer(), devices);
-                }
-                devices.add(device);
-            }
-            if (haveNonNexus) {
-                for (List<Device> devices : manufacturers.values()) {
-                    Menu manufacturerMenu = menu;
-                    if (manufacturers.size() > 1) {
-                        MenuItem item = new MenuItem(menu, SWT.CASCADE);
-                        item.setText(devices.get(0).getManufacturer());
-                        manufacturerMenu = new Menu(menu);
-                        item.setMenu(manufacturerMenu);
-                    }
-                    for (final Device device : devices) {
-                        MenuItem deviceItem = new MenuItem(manufacturerMenu, SWT.CHECK);
-                        deviceItem.setText(getGenericLabel(device));
-                        deviceItem.setSelection(current == device);
-                        deviceItem.addSelectionListener(new DeviceMenuListener(chooser, device));
-                    }
-                }
-            } else {
-                List<Device> nexus = new ArrayList<Device>();
-                List<Device> generic = new ArrayList<Device>();
-                if (haveNexus) {
-                    // Nexus
-                    for (List<Device> devices : manufacturers.values()) {
-                        for (Device device : devices) {
-                            if (isNexus(device)) {
-                                if (device.getManufacturer().equals(MANUFACTURER_GENERIC)) {
-                                    generic.add(device);
-                                } else {
-                                    nexus.add(device);
-                                }
-                            } else {
-                                generic.add(device);
-                            }
-                        }
-                    }
-                }
-
-                if (!nexus.isEmpty()) {
-                    sortNexusList(nexus);
-                    for (final Device device : nexus) {
-                        MenuItem item = new MenuItem(menu, SWT.CHECK);
-                        item.setText(getNexusLabel(device));
-                        item.setSelection(current == device);
-                        item.addSelectionListener(new DeviceMenuListener(chooser, device));
-                    }
-
-                    @SuppressWarnings("unused")
-                    MenuItem separator = new MenuItem(menu, SWT.SEPARATOR);
-                }
-
-                // Generate the generic menu.
-                Collections.reverse(generic);
-                for (final Device device : generic) {
-                    MenuItem item = new MenuItem(menu, SWT.CHECK);
-                    item.setText(getGenericLabel(device));
-                    item.setSelection(current == device);
-                    item.addSelectionListener(new DeviceMenuListener(chooser, device));
-                }
-            }
-        }
-
-        @SuppressWarnings("unused")
-        MenuItem separator = new MenuItem(menu, SWT.SEPARATOR);
-
-        ConfigurationMenuListener.addTogglePreviewModeAction(menu,
-                "Preview All Screens", chooser, RenderPreviewMode.SCREENS);
-
-
-        Rectangle bounds = combo.getBounds();
-        Point location = new Point(bounds.x, bounds.y + bounds.height);
-        location = combo.getParent().toDisplay(location);
-        menu.setLocation(location.x, location.y);
-        menu.setVisible(true);
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/configuration/FlagManager.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/configuration/FlagManager.java
deleted file mode 100644
index 15623cf..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/configuration/FlagManager.java
+++ /dev/null
@@ -1,215 +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.ide.eclipse.adt.internal.editors.layout.configuration;
-
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-import com.android.ide.common.resources.LocaleManager;
-import com.android.ide.common.resources.configuration.FolderConfiguration;
-import com.android.ide.common.resources.configuration.LocaleQualifier;
-import com.android.ide.eclipse.adt.internal.editors.IconFactory;
-import com.google.common.collect.Maps;
-
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.wb.internal.core.DesignerPlugin;
-
-import java.util.Locale;
-import java.util.Map;
-
-/**
- * The {@linkplain FlagManager} provides access to flags for regions known
- * to {@link LocaleManager}. It also contains some locale related display
- * functions.
- * <p>
- * All the flag images came from the WindowBuilder subversion repository
- * http://dev.eclipse.org/svnroot/tools/org.eclipse.windowbuilder/trunk (and in
- * particular, a snapshot of revision 424). However, it appears that the icons
- * are from http://www.famfamfam.com/lab/icons/flags/ which states that "these
- * flag icons are available for free use for any purpose with no requirement for
- * attribution." Adding the URL here such that we can check back occasionally
- * and see if there are corrections or updates. Also note that the flag names
- * are in ISO 3166-1 alpha-2 country codes.
- */
-public class FlagManager {
-    private static final FlagManager sInstance = new FlagManager();
-
-    /**
-     * Returns the {@linkplain FlagManager} singleton
-     *
-     * @return the {@linkplain FlagManager} singleton, never null
-     */
-    @NonNull
-    public static FlagManager get() {
-        return sInstance;
-    }
-
-    /** Use the {@link #get()} factory method */
-    private FlagManager() {
-    }
-
-    /** Map from region to flag icon */
-    private final Map<String, Image> mImageMap = Maps.newHashMap();
-
-    /**
-     * Returns the empty flag icon used to indicate an unknown country
-     *
-     * @return the globe icon used to indicate an unknown country
-     */
-    public static Image getEmptyIcon() {
-      return DesignerPlugin.getImage("nls/flags/flag_empty.png"); //$NON-NLS-1$
-    }
-
-    /**
-     * Returns the globe icon used to indicate "any" language
-     *
-     * @return the globe icon used to indicate "any" language
-     */
-    public static Image getGlobeIcon() {
-        return IconFactory.getInstance().getIcon("globe"); //$NON-NLS-1$
-    }
-
-    /**
-     * Returns the flag for the given language and region.
-     *
-     * @param language the language, or null (if null, region must not be null),
-     *            the 2 letter language code (ISO 639-1), in lower case
-     * @param region the region, or null (if null, language must not be null),
-     *            the 2 letter region code (ISO 3166-1 alpha-2), in upper case
-     * @return a suitable flag icon, or null
-     */
-    @Nullable
-    public Image getFlag(@Nullable String language, @Nullable String region) {
-        assert region != null || language != null;
-        if (region == null || region.isEmpty()) {
-            // Look up the region for a given language
-            assert language != null;
-
-            // Special cases where we have a dedicated flag available:
-            if (language.equals("ca")) {        //$NON-NLS-1$
-              return getIcon("catalonia");      //$NON-NLS-1$
-            }
-            else if (language.equals("gd")) { //$NON-NLS-1$
-              return getIcon("scotland");     //$NON-NLS-1$
-            }
-            else if (language.equals("cy")) { //$NON-NLS-1$
-              return getIcon("wales");        //$NON-NLS-1$
-            }
-
-            // Prefer the local registration of the current locale; even if
-            // for example the default locale for English is the US, if the current
-            // default locale is English, then use its associated country, which could
-            // for example be Australia.
-            Locale locale = Locale.getDefault();
-            if (language.equals(locale.getLanguage())) {
-                Image flag = getFlag(locale.getCountry());
-                if (flag != null) {
-                    return flag;
-                }
-            }
-
-            region = LocaleManager.getLanguageRegion(language);
-        }
-
-        if (region == null || region.isEmpty()) {
-            // No country specified, and the language is for a country we
-            // don't have a flag for
-            return null;
-        }
-
-        return getIcon(region);
-    }
-
-    /**
-     * Returns the flag for the given language and region.
-     *
-     * @param language the language qualifier, or null (if null, region must not be null),
-     * @param region the region, or null (if null, language must not be null),
-     * @return a suitable flag icon, or null
-     */
-    public Image getFlag(@Nullable LocaleQualifier locale) {
-        if (locale == null) {
-            return null;
-          }
-          String languageCode = locale.getLanguage();
-          String regionCode = locale.getRegion();
-          if (LocaleQualifier.FAKE_VALUE.equals(languageCode)) {
-            languageCode = null;
-          }
-          return getFlag(languageCode, regionCode);
-    }
-
-    /**
-     * Returns a flag for a given resource folder name (such as
-     * {@code values-en-rUS}), or null
-     *
-     * @param folder the folder name
-     * @return a corresponding flag icon, or null if none was found
-     */
-    @Nullable
-    public Image getFlagForFolderName(@NonNull String folder) {
-        FolderConfiguration configuration = FolderConfiguration.getConfigForFolder(folder);
-        if (configuration != null) {
-          return get().getFlag(configuration);
-        }
-
-        return null;
-    }
-
-    /**
-     * Returns the flag for the given folder
-     *
-     * @param configuration the folder configuration
-     * @return a suitable flag icon, or null
-     */
-    @Nullable
-    public Image getFlag(@NonNull FolderConfiguration configuration) {
-        return getFlag(configuration.getLocaleQualifier());
-    }
-
-
-
-    /**
-     * Returns the flag for the given region.
-     *
-     * @param region the 2 letter region code (ISO 3166-1 alpha-2), in upper case
-     * @return a suitable flag icon, or null
-     */
-    @Nullable
-    public Image getFlag(@NonNull String region) {
-        assert region.length() == 2
-                && Character.isUpperCase(region.charAt(0))
-                && Character.isUpperCase(region.charAt(1)) : region;
-
-        return getIcon(region);
-    }
-
-    private Image getIcon(@NonNull String base) {
-        Image flagImage = mImageMap.get(base);
-          if (flagImage == null) {
-              // TODO: Special case locale currently running on system such
-              // that the current country matches the current locale
-              if (mImageMap.containsKey(base)) {
-                  // Already checked: there's just no image there
-                  return null;
-              }
-              String flagFileName = base.toLowerCase(Locale.US) + ".png"; //$NON-NLS-1$
-              flagImage = DesignerPlugin.getImage("nls/flags/" + flagFileName); //$NON-NLS-1$
-              mImageMap.put(base, flagImage);
-          }
-
-        return flagImage;
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/configuration/LayoutCreatorDialog.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/configuration/LayoutCreatorDialog.java
deleted file mode 100644
index 97ff668..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/configuration/LayoutCreatorDialog.java
+++ /dev/null
@@ -1,149 +0,0 @@
-/*
- * 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.editors.layout.configuration;
-
-import com.android.ide.common.resources.configuration.FolderConfiguration;
-import com.android.ide.common.resources.configuration.ResourceQualifier;
-import com.android.ide.eclipse.adt.internal.editors.IconFactory;
-import com.android.ide.eclipse.adt.internal.ui.ConfigurationSelector;
-import com.android.ide.eclipse.adt.internal.ui.ConfigurationSelector.ConfigurationState;
-import com.android.ide.eclipse.adt.internal.ui.ConfigurationSelector.SelectorMode;
-import com.android.resources.ResourceFolderType;
-import com.android.sdkuilib.ui.GridDialog;
-
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Shell;
-
-/**
- * Dialog to choose a non existing {@link FolderConfiguration}.
- */
-public final class LayoutCreatorDialog extends GridDialog {
-
-    private ConfigurationSelector mSelector;
-    private Composite mStatusComposite;
-    private Label mStatusLabel;
-    private Label mStatusImage;
-
-    private final FolderConfiguration mConfig = new FolderConfiguration();
-    private final String mFileName;
-
-    /**
-     * Creates a dialog, and init the UI from a {@link FolderConfiguration}.
-     * @param parentShell the parent {@link Shell}.
-     * @param fileName the filename associated with the configuration
-     * @param config The starting configuration.
-     */
-    public LayoutCreatorDialog(Shell parentShell, String fileName, FolderConfiguration config) {
-        super(parentShell, 1, false);
-
-        mFileName = fileName;
-
-        // FIXME: add some data to know what configurations already exist.
-        mConfig.set(config);
-    }
-
-    @Override
-    public void createDialogContent(Composite parent) {
-        new Label(parent, SWT.NONE).setText(
-                String.format("Configuration for the alternate version of %1$s", mFileName));
-
-        mSelector = new ConfigurationSelector(parent, SelectorMode.CONFIG_ONLY);
-        mSelector.setConfiguration(mConfig);
-
-        // because the ConfigSelector is running in CONFIG_ONLY mode, the current config
-        // displayed by it is not mConfig anymore, so get the current config.
-        mSelector.getConfiguration(mConfig);
-
-        // parent's layout is a GridLayout as specified in the javadoc.
-        GridData gd = new GridData();
-        gd.widthHint = ConfigurationSelector.WIDTH_HINT;
-        gd.heightHint = ConfigurationSelector.HEIGHT_HINT;
-        mSelector.setLayoutData(gd);
-
-        // add a listener to check on the validity of the FolderConfiguration as
-        // they are built.
-        mSelector.setOnChangeListener(new Runnable() {
-            @Override
-            public void run() {
-                ConfigurationState state = mSelector.getState();
-
-                switch (state) {
-                    case OK:
-                        mSelector.getConfiguration(mConfig);
-
-                        resetStatus();
-                        mStatusImage.setImage(null);
-                        getButton(IDialogConstants.OK_ID).setEnabled(true);
-                        break;
-                    case INVALID_CONFIG:
-                        ResourceQualifier invalidQualifier = mSelector.getInvalidQualifier();
-                        mStatusLabel.setText(String.format(
-                                "Invalid Configuration: %1$s has no filter set.",
-                                invalidQualifier.getName()));
-                        mStatusImage.setImage(IconFactory.getInstance().getIcon("warning")); //$NON-NLS-1$
-                        getButton(IDialogConstants.OK_ID).setEnabled(false);
-                        break;
-                    case REGION_WITHOUT_LANGUAGE:
-                        mStatusLabel.setText(
-                                "The Region qualifier requires the Language qualifier.");
-                        mStatusImage.setImage(IconFactory.getInstance().getIcon("warning")); //$NON-NLS-1$
-                        getButton(IDialogConstants.OK_ID).setEnabled(false);
-                        break;
-                }
-
-                // need to relayout, because of the change in size in mErrorImage.
-                mStatusComposite.layout();
-            }
-        });
-
-        mStatusComposite = new Composite(parent, SWT.NONE);
-        mStatusComposite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-        GridLayout gl = new GridLayout(2, false);
-        mStatusComposite.setLayout(gl);
-        gl.marginHeight = gl.marginWidth = 0;
-
-        mStatusImage = new Label(mStatusComposite, SWT.NONE);
-        mStatusLabel = new Label(mStatusComposite, SWT.NONE);
-        mStatusLabel.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-        resetStatus();
-    }
-
-    /**
-     * Sets the edited configuration on the given configuration parameter
-     *
-     * @param config the configuration to apply the current edits to
-     */
-    public void getConfiguration(FolderConfiguration config) {
-        config.set(mConfig);
-    }
-
-    /**
-     * resets the status label to show the file that will be created.
-     */
-    private void resetStatus() {
-        String displayString = Dialog.shortenText(String.format("New File: res/%1$s/%2$s",
-                mConfig.getFolderName(ResourceFolderType.LAYOUT), mFileName),
-                mStatusLabel);
-        mStatusLabel.setText(displayString);
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/configuration/Locale.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/configuration/Locale.java
deleted file mode 100644
index 6cb3963..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/configuration/Locale.java
+++ /dev/null
@@ -1,184 +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.ide.eclipse.adt.internal.editors.layout.configuration;
-
-import static com.android.ide.common.resources.configuration.LocaleQualifier.FAKE_VALUE;
-
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-import com.android.ide.common.resources.configuration.FolderConfiguration;
-import com.android.ide.common.resources.configuration.LocaleQualifier;
-
-import org.eclipse.swt.graphics.Image;
-
-/**
- * A language,region pair
- */
-public class Locale {
-    /**
-     * A special marker region qualifier representing any region
-     */
-    public static final LocaleQualifier ANY_QUALIFIER = new LocaleQualifier(FAKE_VALUE);
-
-    /**
-     * A locale which matches any language and region
-     */
-    public static final Locale ANY = new Locale(ANY_QUALIFIER);
-
-    /**
-     * The locale qualifier, or {@link #ANY_QUALIFIER} if this locale matches
-     * any locale
-     */
-    @NonNull
-    public final LocaleQualifier qualifier;
-
-    /**
-     * Constructs a new {@linkplain Locale} matching a given language in a given
-     * locale.
-     *
-     * @param locale the locale
-     */
-    private Locale(@NonNull
-    LocaleQualifier locale) {
-        qualifier = locale;
-    }
-
-    /**
-     * Constructs a new {@linkplain Locale} matching a given language in a given
-     * specific locale.
-     *
-     * @param locale the locale
-     * @return a locale with the given locale
-     */
-    @NonNull
-    public static Locale create(@NonNull
-    LocaleQualifier locale) {
-        return new Locale(locale);
-    }
-
-    /**
-     * Constructs a new {@linkplain Locale} for the given folder configuration
-     *
-     * @param folder the folder configuration
-     * @return a locale with the given language and region
-     */
-    public static Locale create(FolderConfiguration folder) {
-        LocaleQualifier locale = folder.getLocaleQualifier();
-        if (locale == null) {
-            return ANY;
-        } else {
-            return new Locale(locale);
-        }
-    }
-
-    /**
-     * Constructs a new {@linkplain Locale} for the given locale string, e.g.
-     * "zh", "en-rUS", or "b+eng+US".
-     *
-     * @param localeString the locale description
-     * @return the corresponding locale
-     */
-    @NonNull
-    public static Locale create(@NonNull
-    String localeString) {
-        // Load locale. Note that this can get overwritten by the
-        // project-wide settings read below.
-
-        LocaleQualifier qualifier = LocaleQualifier.getQualifier(localeString);
-        if (qualifier != null) {
-            return new Locale(qualifier);
-        } else {
-            return ANY;
-        }
-    }
-
-    /**
-     * Returns a flag image to use for this locale
-     *
-     * @return a flag image, or a default globe icon
-     */
-    @NonNull
-    public Image getFlagImage() {
-        String languageCode = qualifier.hasLanguage() ? qualifier.getLanguage() : null;
-        if (languageCode == null) {
-            return FlagManager.getGlobeIcon();
-        }
-        String regionCode = hasRegion() ? qualifier.getRegion() : null;
-        FlagManager icons = FlagManager.get();
-        Image image = icons.getFlag(languageCode, regionCode);
-        if (image != null) {
-            return image;
-        } else {
-            return FlagManager.getGlobeIcon();
-        }
-    }
-
-    /**
-     * Returns true if this locale specifies a specific language. This is true
-     * for all locales except {@link #ANY}.
-     *
-     * @return true if this locale specifies a specific language
-     */
-    public boolean hasLanguage() {
-        return !qualifier.hasFakeValue();
-    }
-
-    /**
-     * Returns true if this locale specifies a specific region
-     *
-     * @return true if this locale specifies a region
-     */
-    public boolean hasRegion() {
-        return qualifier.getRegion() != null && !FAKE_VALUE.equals(qualifier.getRegion());
-    }
-
-    /**
-     * Returns the locale formatted as language-region. If region is not set,
-     * language is returned. If language is not set, empty string is returned.
-     */
-    public String toLocaleId() {
-        return qualifier == ANY_QUALIFIER ? "" : qualifier.getTag();
-    }
-
-    @Override
-    public int hashCode() {
-        final int prime = 31;
-        int result = 1;
-        result = prime * result + qualifier.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;
-        Locale other = (Locale) obj;
-        if (!qualifier.equals(other.qualifier))
-            return false;
-        return true;
-    }
-
-    @Override
-    public String toString() {
-        return qualifier.getTag();
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/configuration/LocaleMenuListener.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/configuration/LocaleMenuListener.java
deleted file mode 100644
index 2bc5417..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/configuration/LocaleMenuListener.java
+++ /dev/null
@@ -1,124 +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.ide.eclipse.adt.internal.editors.layout.configuration;
-
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-import com.android.ide.eclipse.adt.internal.editors.layout.gle2.RenderPreviewMode;
-import com.android.ide.eclipse.adt.internal.wizards.newxmlfile.AddTranslationDialog;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.graphics.Rectangle;
-import org.eclipse.swt.widgets.Menu;
-import org.eclipse.swt.widgets.MenuItem;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.ToolItem;
-
-import java.util.List;
-
-/**
- * The {@linkplain LocaleMenuListener} class is responsible for generating the locale
- * menu in the {@link ConfigurationChooser}.
- */
-class LocaleMenuListener extends SelectionAdapter {
-    private static final int ACTION_SET_LOCALE = 1;
-    private static final int ACTION_ADD_TRANSLATION = 2;
-
-    private final ConfigurationChooser mConfigChooser;
-    private final int mAction;
-    private final Locale mLocale;
-
-    LocaleMenuListener(
-            @NonNull ConfigurationChooser configChooser,
-            int action,
-            @Nullable Locale locale) {
-        mConfigChooser = configChooser;
-        mAction = action;
-        mLocale = locale;
-    }
-
-    @Override
-    public void widgetSelected(SelectionEvent e) {
-        switch (mAction) {
-            case ACTION_SET_LOCALE: {
-                mConfigChooser.selectLocale(mLocale);
-                mConfigChooser.onLocaleChange();
-                break;
-            }
-            case ACTION_ADD_TRANSLATION: {
-                IProject project = mConfigChooser.getProject();
-                Shell shell = mConfigChooser.getShell();
-                AddTranslationDialog dialog = new AddTranslationDialog(shell, project);
-                dialog.open();
-                break;
-            }
-            default: assert false : mAction;
-        }
-    }
-
-    static void show(final ConfigurationChooser chooser, ToolItem combo) {
-        Menu menu = new Menu(chooser.getShell(), SWT.POP_UP);
-        Configuration configuration = chooser.getConfiguration();
-        List<Locale> locales = chooser.getLocaleList();
-        Locale current = configuration.getLocale();
-
-        for (Locale locale : locales) {
-            String title = ConfigurationChooser.getLocaleLabel(chooser, locale, false);
-            MenuItem item = new MenuItem(menu, SWT.CHECK);
-            item.setText(title);
-            Image image = locale.getFlagImage();
-            item.setImage(image);
-
-            boolean selected = current == locale;
-            if (selected) {
-                item.setSelection(true);
-            }
-
-            LocaleMenuListener listener = new LocaleMenuListener(chooser, ACTION_SET_LOCALE,
-                    locale);
-            item.addSelectionListener(listener);
-        }
-
-        if (locales.size() > 1) {
-            @SuppressWarnings("unused")
-            MenuItem separator = new MenuItem(menu, SWT.SEPARATOR);
-
-            ConfigurationMenuListener.addTogglePreviewModeAction(menu,
-                    "Preview All Locales", chooser, RenderPreviewMode.LOCALES);
-        }
-
-        @SuppressWarnings("unused")
-        MenuItem separator = new MenuItem(menu, SWT.SEPARATOR);
-
-        MenuItem item = new MenuItem(menu, SWT.PUSH);
-        item.setText("Add New Translation...");
-        LocaleMenuListener listener = new LocaleMenuListener(chooser,
-                ACTION_ADD_TRANSLATION, null);
-        item.addSelectionListener(listener);
-
-        Rectangle bounds = combo.getBounds();
-        Point location = new Point(bounds.x, bounds.y + bounds.height);
-        location = combo.getParent().toDisplay(location);
-        menu.setLocation(location.x, location.y);
-        menu.setVisible(true);
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/configuration/NestedConfiguration.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/configuration/NestedConfiguration.java
deleted file mode 100644
index 50778e2..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/configuration/NestedConfiguration.java
+++ /dev/null
@@ -1,506 +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.ide.eclipse.adt.internal.editors.layout.configuration;
-
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-import com.android.ide.common.resources.configuration.FolderConfiguration;
-import com.android.resources.NightMode;
-import com.android.resources.UiMode;
-import com.android.sdklib.IAndroidTarget;
-import com.android.sdklib.devices.Device;
-import com.android.sdklib.devices.State;
-import com.google.common.base.Objects;
-
-/**
- * An {@linkplain NestedConfiguration} is a {@link Configuration} which inherits
- * all of its values from a different configuration, except for one or more
- * attributes where it overrides a custom value.
- * <p>
- * Unlike a {@link VaryingConfiguration}, a {@linkplain NestedConfiguration}
- * will always return the same overridden value, regardless of the inherited
- * value.
- * <p>
- * For example, an {@linkplain NestedConfiguration} may fix the locale to always
- * be "en", but otherwise inherit everything else.
- */
-public class NestedConfiguration extends Configuration {
-    /** The configuration we are inheriting non-overridden values from */
-    protected Configuration mParent;
-
-    /** Bitmask of attributes to be overridden in this configuration */
-    private int mOverride;
-
-    /**
-     * Constructs a new {@linkplain NestedConfiguration}.
-     * Construct via
-     *
-     * @param chooser the associated chooser
-     * @param configuration the configuration to inherit from
-     */
-    protected NestedConfiguration(
-            @NonNull ConfigurationChooser chooser,
-            @NonNull Configuration configuration) {
-        super(chooser);
-        mParent = configuration;
-
-        mFullConfig.set(mParent.mFullConfig);
-        if (mParent.getEditedConfig() != null) {
-            mEditedConfig = new FolderConfiguration();
-            mEditedConfig.set(mParent.mEditedConfig);
-        }
-    }
-
-    /**
-     * Returns the override flags for this configuration. Corresponds to
-     * the {@code CFG_} flags in {@link ConfigurationClient}.
-     *
-     * @return the bitmask
-     */
-    public int getOverrideFlags() {
-        return mOverride;
-    }
-
-    /**
-     * Creates a new {@linkplain NestedConfiguration} that has the same overriding
-     * attributes as the given other {@linkplain NestedConfiguration}, and gets
-     * its values from the given {@linkplain Configuration}.
-     *
-     * @param other the configuration to copy overrides from
-     * @param values the configuration to copy values from
-     * @param parent the parent to tie the configuration to for inheriting values
-     * @return a new configuration
-     */
-    @NonNull
-    public static NestedConfiguration create(
-            @NonNull NestedConfiguration other,
-            @NonNull Configuration values,
-            @NonNull Configuration parent) {
-        NestedConfiguration configuration =
-                new NestedConfiguration(other.mConfigChooser, parent);
-        initFrom(configuration, other, values, true /*sync*/);
-        return configuration;
-    }
-
-    /**
-     * Initializes a new {@linkplain NestedConfiguration} with the overriding
-     * attributes as the given other {@linkplain NestedConfiguration}, and gets
-     * its values from the given {@linkplain Configuration}.
-     *
-     * @param configuration the configuration to initialize
-     * @param other the configuration to copy overrides from
-     * @param values the configuration to copy values from
-     * @param sync if true, sync the folder configuration from
-     */
-    protected static void initFrom(NestedConfiguration configuration,
-            NestedConfiguration other, Configuration values, boolean sync) {
-        configuration.mOverride = other.mOverride;
-        configuration.setDisplayName(values.getDisplayName());
-        configuration.setActivity(values.getActivity());
-
-        if (configuration.isOverridingLocale()) {
-            configuration.setLocale(values.getLocale(), true);
-        }
-        if (configuration.isOverridingTarget()) {
-            configuration.setTarget(values.getTarget(), true);
-        }
-        if (configuration.isOverridingDevice()) {
-            configuration.setDevice(values.getDevice(), true);
-        }
-        if (configuration.isOverridingDeviceState()) {
-            configuration.setDeviceState(values.getDeviceState(), true);
-        }
-        if (configuration.isOverridingNightMode()) {
-            configuration.setNightMode(values.getNightMode(), true);
-        }
-        if (configuration.isOverridingUiMode()) {
-            configuration.setUiMode(values.getUiMode(), true);
-        }
-        if (sync) {
-            configuration.syncFolderConfig();
-        }
-    }
-
-    /**
-     * Sets the parent configuration that this configuration is inheriting from.
-     *
-     * @param parent the parent configuration
-     */
-    public void setParent(@NonNull Configuration parent) {
-        mParent = parent;
-    }
-
-    /**
-     * Creates a new {@linkplain Configuration} which inherits values from the
-     * given parent {@linkplain Configuration}, possibly overriding some as
-     * well.
-     *
-     * @param chooser the associated chooser
-     * @param parent the configuration to inherit values from
-     * @return a new configuration
-     */
-    @NonNull
-    public static NestedConfiguration create(@NonNull ConfigurationChooser chooser,
-            @NonNull Configuration parent) {
-        return new NestedConfiguration(chooser, parent);
-    }
-
-    @Override
-    @Nullable
-    public String getTheme() {
-        // Never overridden: this is a static attribute of a layout, not something which
-        // varies by configuration or at runtime
-        return mParent.getTheme();
-    }
-
-    @Override
-    public void setTheme(String theme) {
-        // Never overridden
-        mParent.setTheme(theme);
-    }
-
-    /**
-     * Sets whether the locale should be overridden by this configuration
-     *
-     * @param override if true, override the inherited value
-     */
-    public void setOverrideLocale(boolean override) {
-        mOverride |= CFG_LOCALE;
-    }
-
-    /**
-     * Returns true if the locale is overridden
-     *
-     * @return true if the locale is overridden
-     */
-    public final boolean isOverridingLocale() {
-        return (mOverride & CFG_LOCALE) != 0;
-    }
-
-    @Override
-    @NonNull
-    public Locale getLocale() {
-        if (isOverridingLocale()) {
-            return super.getLocale();
-        } else {
-            return mParent.getLocale();
-        }
-    }
-
-    @Override
-    public void setLocale(@NonNull Locale locale, boolean skipSync) {
-        if (isOverridingLocale()) {
-            super.setLocale(locale, skipSync);
-        } else {
-            mParent.setLocale(locale, skipSync);
-        }
-    }
-
-    /**
-     * Sets whether the rendering target should be overridden by this configuration
-     *
-     * @param override if true, override the inherited value
-     */
-    public void setOverrideTarget(boolean override) {
-        mOverride |= CFG_TARGET;
-    }
-
-    /**
-     * Returns true if the target is overridden
-     *
-     * @return true if the target is overridden
-     */
-    public final boolean isOverridingTarget() {
-        return (mOverride & CFG_TARGET) != 0;
-    }
-
-    @Override
-    @Nullable
-    public IAndroidTarget getTarget() {
-        if (isOverridingTarget()) {
-            return super.getTarget();
-        } else {
-            return mParent.getTarget();
-        }
-    }
-
-    @Override
-    public void setTarget(IAndroidTarget target, boolean skipSync) {
-        if (isOverridingTarget()) {
-            super.setTarget(target, skipSync);
-        } else {
-            mParent.setTarget(target, skipSync);
-        }
-    }
-
-    /**
-     * Sets whether the device should be overridden by this configuration
-     *
-     * @param override if true, override the inherited value
-     */
-    public void setOverrideDevice(boolean override) {
-        mOverride |= CFG_DEVICE;
-    }
-
-    /**
-     * Returns true if the device is overridden
-     *
-     * @return true if the device is overridden
-     */
-    public final boolean isOverridingDevice() {
-        return (mOverride & CFG_DEVICE) != 0;
-    }
-
-    @Override
-    @Nullable
-    public Device getDevice() {
-        if (isOverridingDevice()) {
-            return super.getDevice();
-        } else {
-            return mParent.getDevice();
-        }
-    }
-
-    @Override
-    public void setDevice(Device device, boolean skipSync) {
-        if (isOverridingDevice()) {
-            super.setDevice(device, skipSync);
-        } else {
-            mParent.setDevice(device, skipSync);
-        }
-    }
-
-    /**
-     * Sets whether the device state should be overridden by this configuration
-     *
-     * @param override if true, override the inherited value
-     */
-    public void setOverrideDeviceState(boolean override) {
-        mOverride |= CFG_DEVICE_STATE;
-    }
-
-    /**
-     * Returns true if the device state is overridden
-     *
-     * @return true if the device state is overridden
-     */
-    public final boolean isOverridingDeviceState() {
-        return (mOverride & CFG_DEVICE_STATE) != 0;
-    }
-
-    @Override
-    @Nullable
-    public State getDeviceState() {
-        if (isOverridingDeviceState()) {
-            return super.getDeviceState();
-        } else {
-            State state = mParent.getDeviceState();
-            if (isOverridingDevice()) {
-                // If the device differs, I need to look up a suitable equivalent state
-                // on our device
-                if (state != null) {
-                    Device device = super.getDevice();
-                    if (device != null) {
-                        return device.getState(state.getName());
-                    }
-                }
-            }
-
-            return state;
-        }
-    }
-
-    @Override
-    public void setDeviceState(State state, boolean skipSync) {
-        if (isOverridingDeviceState()) {
-            super.setDeviceState(state, skipSync);
-        } else {
-            if (isOverridingDevice()) {
-                Device device = super.getDevice();
-                if (device != null) {
-                    State equivalentState = device.getState(state.getName());
-                    if (equivalentState != null) {
-                        state = equivalentState;
-                    }
-                }
-            }
-            mParent.setDeviceState(state, skipSync);
-        }
-    }
-
-    /**
-     * Sets whether the night mode should be overridden by this configuration
-     *
-     * @param override if true, override the inherited value
-     */
-    public void setOverrideNightMode(boolean override) {
-        mOverride |= CFG_NIGHT_MODE;
-    }
-
-    /**
-     * Returns true if the night mode is overridden
-     *
-     * @return true if the night mode is overridden
-     */
-    public final boolean isOverridingNightMode() {
-        return (mOverride & CFG_NIGHT_MODE) != 0;
-    }
-
-    @Override
-    @NonNull
-    public NightMode getNightMode() {
-        if (isOverridingNightMode()) {
-            return super.getNightMode();
-        } else {
-            return mParent.getNightMode();
-        }
-    }
-
-    @Override
-    public void setNightMode(@NonNull NightMode night, boolean skipSync) {
-        if (isOverridingNightMode()) {
-            super.setNightMode(night, skipSync);
-        } else {
-            mParent.setNightMode(night, skipSync);
-        }
-    }
-
-    /**
-     * Sets whether the UI mode should be overridden by this configuration
-     *
-     * @param override if true, override the inherited value
-     */
-    public void setOverrideUiMode(boolean override) {
-        mOverride |= CFG_UI_MODE;
-    }
-
-    /**
-     * Returns true if the UI mode is overridden
-     *
-     * @return true if the UI mode is overridden
-     */
-    public final boolean isOverridingUiMode() {
-        return (mOverride & CFG_UI_MODE) != 0;
-    }
-
-    @Override
-    @NonNull
-    public UiMode getUiMode() {
-        if (isOverridingUiMode()) {
-            return super.getUiMode();
-        } else {
-            return mParent.getUiMode();
-        }
-    }
-
-    @Override
-    public void setUiMode(@NonNull UiMode uiMode, boolean skipSync) {
-        if (isOverridingUiMode()) {
-            super.setUiMode(uiMode, skipSync);
-        } else {
-            mParent.setUiMode(uiMode, skipSync);
-        }
-    }
-
-    /**
-     * Returns the configuration this {@linkplain NestedConfiguration} is
-     * inheriting from
-     *
-     * @return the configuration this configuration is inheriting from
-     */
-    @NonNull
-    public Configuration getParent() {
-        return mParent;
-    }
-
-    @Override
-    @Nullable
-    public String getActivity() {
-        return mParent.getActivity();
-    }
-
-    @Override
-    public void setActivity(String activity) {
-        super.setActivity(activity);
-    }
-
-    /**
-     * Returns a computed display name (ignoring the value stored by
-     * {@link #setDisplayName(String)}) by looking at the override flags
-     * and picking a suitable name.
-     *
-     * @return a suitable display name
-     */
-    @Nullable
-    public String computeDisplayName() {
-        return computeDisplayName(mOverride, this);
-    }
-
-    /**
-     * Computes a display name for the given configuration, using the given
-     * override flags (which correspond to the {@code CFG_} constants in
-     * {@link ConfigurationClient}
-     *
-     * @param flags the override bitmask
-     * @param configuration the configuration to fetch values from
-     * @return a suitable display name
-     */
-    @Nullable
-    public static String computeDisplayName(int flags, @NonNull Configuration configuration) {
-        if ((flags & CFG_LOCALE) != 0) {
-            return ConfigurationChooser.getLocaleLabel(configuration.mConfigChooser,
-                    configuration.getLocale(), false);
-        }
-
-        if ((flags & CFG_TARGET) != 0) {
-            return ConfigurationChooser.getRenderingTargetLabel(configuration.getTarget(), false);
-        }
-
-        if ((flags & CFG_DEVICE) != 0) {
-            return ConfigurationChooser.getDeviceLabel(configuration.getDevice(), true);
-        }
-
-        if ((flags & CFG_DEVICE_STATE) != 0) {
-            State deviceState = configuration.getDeviceState();
-            if (deviceState != null) {
-                return deviceState.getName();
-            }
-        }
-
-        if ((flags & CFG_NIGHT_MODE) != 0) {
-            return configuration.getNightMode().getLongDisplayValue();
-        }
-
-        if ((flags & CFG_UI_MODE) != 0) {
-            configuration.getUiMode().getLongDisplayValue();
-        }
-
-        return null;
-    }
-
-    @Override
-    public String toString() {
-        return Objects.toStringHelper(this.getClass())
-                .add("parent", mParent.getDisplayName())          //$NON-NLS-1$
-                .add("display", getDisplayName())                 //$NON-NLS-1$
-                .add("overrideLocale", isOverridingLocale())           //$NON-NLS-1$
-                .add("overrideTarget", isOverridingTarget())           //$NON-NLS-1$
-                .add("overrideDevice", isOverridingDevice())           //$NON-NLS-1$
-                .add("overrideDeviceState", isOverridingDeviceState()) //$NON-NLS-1$
-                .add("persistent", toPersistentString())          //$NON-NLS-1$
-                .toString();
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/configuration/OrientationMenuAction.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/configuration/OrientationMenuAction.java
deleted file mode 100644
index 5cad29a..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/configuration/OrientationMenuAction.java
+++ /dev/null
@@ -1,180 +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.ide.eclipse.adt.internal.editors.layout.configuration;
-
-import com.android.ide.eclipse.adt.internal.editors.layout.gle2.SubmenuAction;
-import com.android.resources.NightMode;
-import com.android.resources.ScreenOrientation;
-import com.android.resources.UiMode;
-import com.android.sdklib.devices.Device;
-import com.android.sdklib.devices.State;
-
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.ActionContributionItem;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.action.MenuManager;
-import org.eclipse.jface.action.Separator;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.graphics.Rectangle;
-import org.eclipse.swt.widgets.Menu;
-import org.eclipse.swt.widgets.ToolItem;
-
-import java.util.List;
-
-/**
- * Action which creates a submenu that shows the available orientations as well
- * as some related options for night mode and dock mode
- */
-class OrientationMenuAction extends SubmenuAction {
-    // Constants used to indicate what type of menu is being shown, such that
-    // the submenus can lazily construct their contents
-    private static final int MENU_NIGHTMODE = 1;
-    private static final int MENU_UIMODE = 2;
-
-    private final ConfigurationChooser mConfigChooser;
-    /** Type of menu; one of the constants {@link #MENU_NIGHTMODE} etc */
-    private final int mType;
-
-    OrientationMenuAction(int type, String title, ConfigurationChooser configuration) {
-        super(title);
-        mType = type;
-        mConfigChooser = configuration;
-    }
-
-    static void showMenu(ConfigurationChooser configChooser, ToolItem combo) {
-        MenuManager manager = new MenuManager();
-
-        // Show toggles for all the available states
-
-        Configuration configuration = configChooser.getConfiguration();
-        Device device = configuration.getDevice();
-        State current = configuration.getDeviceState();
-        if (device != null) {
-            List<State> states = device.getAllStates();
-
-            if (states.size() > 1 && current != null) {
-                State flip = configuration.getNextDeviceState(current);
-                String flipName = flip != null ? flip.getName() : current.getName();
-                manager.add(new DeviceConfigAction(configChooser,
-                        String.format("Switch to %1$s", flipName), flip, false, true));
-                manager.add(new Separator());
-            }
-
-            for (State config : states) {
-                manager.add(new DeviceConfigAction(configChooser, config.getName(),
-                        config, config == current, false));
-            }
-            manager.add(new Separator());
-        }
-        manager.add(new OrientationMenuAction(MENU_UIMODE, "UI Mode", configChooser));
-        manager.add(new Separator());
-        manager.add(new OrientationMenuAction(MENU_NIGHTMODE, "Night Mode", configChooser));
-
-        Menu menu = manager.createContextMenu(configChooser.getShell());
-        Rectangle bounds = combo.getBounds();
-        Point location = new Point(bounds.x, bounds.y + bounds.height);
-        location = combo.getParent().toDisplay(location);
-        menu.setLocation(location.x, location.y);
-        menu.setVisible(true);
-    }
-
-    @Override
-    protected void addMenuItems(Menu menu) {
-        switch (mType) {
-            case MENU_NIGHTMODE: {
-                NightMode selected = mConfigChooser.getConfiguration().getNightMode();
-                for (NightMode mode : NightMode.values()) {
-                    boolean checked = mode == selected;
-                    SelectNightModeAction action = new SelectNightModeAction(mode, checked);
-                    new ActionContributionItem(action).fill(menu, -1);
-
-                }
-                break;
-            }
-            case MENU_UIMODE: {
-                UiMode selected = mConfigChooser.getConfiguration().getUiMode();
-                for (UiMode mode : UiMode.values()) {
-                    boolean checked = mode == selected;
-                    SelectUiModeAction action = new SelectUiModeAction(mode, checked);
-                    new ActionContributionItem(action).fill(menu, -1);
-                }
-                break;
-            }
-        }
-    }
-
-
-    private class SelectNightModeAction extends Action {
-        private final NightMode mMode;
-
-        private SelectNightModeAction(NightMode mode, boolean checked) {
-            super(mode.getLongDisplayValue(), IAction.AS_RADIO_BUTTON);
-            mMode = mode;
-            if (checked) {
-                setChecked(true);
-            }
-        }
-
-        @Override
-        public void run() {
-            Configuration configuration = mConfigChooser.getConfiguration();
-            configuration.setNightMode(mMode, false);
-            mConfigChooser.notifyFolderConfigChanged();
-        }
-    }
-
-    private class SelectUiModeAction extends Action {
-        private final UiMode mMode;
-
-        private SelectUiModeAction(UiMode mode, boolean checked) {
-            super(mode.getLongDisplayValue(), IAction.AS_RADIO_BUTTON);
-            mMode = mode;
-            if (checked) {
-                setChecked(true);
-            }
-        }
-
-        @Override
-        public void run() {
-            Configuration configuration = mConfigChooser.getConfiguration();
-            configuration.setUiMode(mMode, false);
-        }
-    }
-
-    private static class DeviceConfigAction extends Action {
-        private final ConfigurationChooser mConfiguration;
-        private final State mState;
-
-        private DeviceConfigAction(ConfigurationChooser configuration, String title,
-                State state, boolean checked, boolean flip) {
-            super(title, IAction.AS_RADIO_BUTTON);
-            mConfiguration = configuration;
-            mState = state;
-            if (checked) {
-                setChecked(true);
-            }
-            ScreenOrientation orientation = configuration.getOrientation(state);
-            setImageDescriptor(configuration.getOrientationImage(orientation, flip));
-        }
-
-        @Override
-        public void run() {
-            mConfiguration.selectDeviceState(mState);
-            mConfiguration.onDeviceConfigChange();
-        }
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/configuration/SelectThemeAction.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/configuration/SelectThemeAction.java
deleted file mode 100644
index d062849..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/configuration/SelectThemeAction.java
+++ /dev/null
@@ -1,50 +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.ide.eclipse.adt.internal.editors.layout.configuration;
-
-import static com.android.SdkConstants.ANDROID_STYLE_RESOURCE_PREFIX;
-import static com.android.SdkConstants.STYLE_RESOURCE_PREFIX;
-
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.IAction;
-
-/**
- * Action which brings up the "Create new XML File" wizard, pre-selected with the
- * animation category
- */
-class SelectThemeAction extends Action {
-    private final ConfigurationChooser mConfiguration;
-    private final String mTheme;
-
-    public SelectThemeAction(ConfigurationChooser configuration, String title, String theme,
-            boolean selected) {
-        super(title, IAction.AS_RADIO_BUTTON);
-        assert theme.startsWith(STYLE_RESOURCE_PREFIX)
-            || theme.startsWith(ANDROID_STYLE_RESOURCE_PREFIX) : theme;
-        mConfiguration = configuration;
-        mTheme = theme;
-        if (selected) {
-            setChecked(selected);
-        }
-    }
-
-    @Override
-    public void run() {
-        mConfiguration.selectTheme(mTheme);
-        mConfiguration.onThemeChange();
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/configuration/TargetMenuListener.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/configuration/TargetMenuListener.java
deleted file mode 100644
index 71905f7..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/configuration/TargetMenuListener.java
+++ /dev/null
@@ -1,126 +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.ide.eclipse.adt.internal.editors.layout.configuration;
-
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-import com.android.ide.eclipse.adt.internal.preferences.AdtPrefs;
-import com.android.sdklib.AndroidVersion;
-import com.android.sdklib.IAndroidTarget;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.graphics.Rectangle;
-import org.eclipse.swt.widgets.Menu;
-import org.eclipse.swt.widgets.MenuItem;
-import org.eclipse.swt.widgets.ToolItem;
-
-import java.util.List;
-import java.util.RandomAccess;
-
-/**
- * The {@linkplain TargetMenuListener} class is responsible for
- * generating the rendering target menu in the {@link ConfigurationChooser}.
- */
-class TargetMenuListener extends SelectionAdapter {
-    private final ConfigurationChooser mConfigChooser;
-    private final IAndroidTarget mTarget;
-    private final boolean mPickBest;
-
-    TargetMenuListener(
-            @NonNull ConfigurationChooser configChooser,
-            @Nullable IAndroidTarget target,
-            boolean pickBest) {
-        mConfigChooser = configChooser;
-        mTarget = target;
-        mPickBest = pickBest;
-    }
-
-    @Override
-    public void widgetSelected(SelectionEvent e) {
-        IAndroidTarget target = mTarget;
-        AdtPrefs prefs = AdtPrefs.getPrefs();
-        if (mPickBest) {
-            boolean autoPick = prefs.isAutoPickRenderTarget();
-            autoPick = !autoPick;
-            prefs.setAutoPickRenderTarget(autoPick);
-            if (autoPick) {
-                target = ConfigurationMatcher.findDefaultRenderTarget(mConfigChooser);
-            } else {
-                // Turn it off, but keep current target until another one is chosen
-                return;
-            }
-        } else {
-            // Manually picked some other target: turn off auto-pick
-            prefs.setAutoPickRenderTarget(false);
-        }
-        mConfigChooser.selectTarget(target);
-        mConfigChooser.onRenderingTargetChange();
-    }
-
-    static void show(ConfigurationChooser chooser, ToolItem combo) {
-        Menu menu = new Menu(chooser.getShell(), SWT.POP_UP);
-        Configuration configuration = chooser.getConfiguration();
-        IAndroidTarget current = configuration.getTarget();
-        List<IAndroidTarget> targets = chooser.getTargetList();
-        boolean haveRecent = false;
-
-        MenuItem menuItem = new MenuItem(menu, SWT.CHECK);
-        menuItem.setText("Automatically Pick Best");
-        menuItem.addSelectionListener(new TargetMenuListener(chooser, null, true));
-        if (AdtPrefs.getPrefs().isAutoPickRenderTarget()) {
-            menuItem.setSelection(true);
-        }
-
-        @SuppressWarnings("unused")
-        MenuItem separator = new MenuItem(menu, SWT.SEPARATOR);
-
-        // Process in reverse order: most important targets first
-        assert targets instanceof RandomAccess;
-        for (int i = targets.size() - 1; i >= 0; i--) {
-            IAndroidTarget target = targets.get(i);
-
-            AndroidVersion version = target.getVersion();
-            if (version.getApiLevel() >= 7) {
-                haveRecent = true;
-            } else if (haveRecent) {
-                // Don't show ancient rendering targets; they're pretty broken
-                // (unless of course all you have are ancient targets)
-                break;
-            }
-
-            String title = ConfigurationChooser.getRenderingTargetLabel(target, false);
-            MenuItem item = new MenuItem(menu, SWT.CHECK);
-            item.setText(title);
-
-            boolean selected = current == target;
-            if (selected) {
-                item.setSelection(true);
-            }
-
-            item.addSelectionListener(new TargetMenuListener(chooser, target, false));
-        }
-
-        Rectangle bounds = combo.getBounds();
-        Point location = new Point(bounds.x, bounds.y + bounds.height);
-        location = combo.getParent().toDisplay(location);
-        menu.setLocation(location.x, location.y);
-        menu.setVisible(true);
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/configuration/ThemeMenuAction.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/configuration/ThemeMenuAction.java
deleted file mode 100644
index b1ce21d..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/configuration/ThemeMenuAction.java
+++ /dev/null
@@ -1,318 +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.ide.eclipse.adt.internal.editors.layout.configuration;
-
-import static com.android.SdkConstants.ANDROID_STYLE_RESOURCE_PREFIX;
-
-import com.android.ide.eclipse.adt.internal.editors.Hyperlinks;
-import com.android.ide.eclipse.adt.internal.editors.layout.gle2.SubmenuAction;
-import com.android.ide.eclipse.adt.internal.editors.manifest.ManifestInfo;
-import com.android.ide.eclipse.adt.internal.editors.manifest.ManifestInfo.ActivityAttributes;
-import com.android.ide.eclipse.adt.internal.resources.ResourceHelper;
-import com.android.sdklib.IAndroidTarget;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.ActionContributionItem;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.action.MenuManager;
-import org.eclipse.jface.action.Separator;
-import org.eclipse.jface.text.hyperlink.IHyperlink;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.graphics.Rectangle;
-import org.eclipse.swt.widgets.Menu;
-import org.eclipse.swt.widgets.ToolItem;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-/**
- * Action which creates a submenu displaying available themes
- */
-class ThemeMenuAction extends SubmenuAction {
-    private static final String DEVICE_LIGHT_PREFIX =
-            ANDROID_STYLE_RESOURCE_PREFIX + "Theme.DeviceDefault.Light";  //$NON-NLS-1$
-    private static final String HOLO_LIGHT_PREFIX =
-            ANDROID_STYLE_RESOURCE_PREFIX + "Theme.Holo.Light";           //$NON-NLS-1$
-    private static final String DEVICE_PREFIX =
-            ANDROID_STYLE_RESOURCE_PREFIX + "Theme.DeviceDefault";        //$NON-NLS-1$
-    private static final String HOLO_PREFIX =
-            ANDROID_STYLE_RESOURCE_PREFIX + "Theme.Holo";                 //$NON-NLS-1$
-    private static final String LIGHT_PREFIX =
-            ANDROID_STYLE_RESOURCE_PREFIX +"Theme.Light";                 //$NON-NLS-1$
-    private static final String THEME_PREFIX =
-            ANDROID_STYLE_RESOURCE_PREFIX +"Theme";                       //$NON-NLS-1$
-
-    // Constants used to indicate what type of menu is being shown, such that
-    // the submenus can lazily construct their contents
-    private static final int MENU_MANIFEST = 1;
-    private static final int MENU_PROJECT = 2;
-    private static final int MENU_THEME = 3;
-    private static final int MENU_THEME_LIGHT = 4;
-    private static final int MENU_HOLO = 5;
-    private static final int MENU_HOLO_LIGHT = 6;
-    private static final int MENU_DEVICE = 7;
-    private static final int MENU_DEVICE_LIGHT = 8;
-    private static final int MENU_ALL = 9;
-
-    private final ConfigurationChooser mConfigChooser;
-    private final List<String> mThemeList;
-    /** Type of menu; one of the constants {@link #MENU_ALL} etc */
-    private final int mType;
-
-    ThemeMenuAction(int type, String title, ConfigurationChooser configuration,
-            List<String> themeList) {
-        super(title);
-        mType = type;
-        mConfigChooser = configuration;
-        mThemeList = themeList;
-    }
-
-    static void showThemeMenu(ConfigurationChooser configChooser, ToolItem combo,
-            List<String> themeList) {
-        MenuManager manager = new MenuManager();
-
-        // First show the currently selected theme (grayed out since you can't
-        // reselect it)
-        Configuration configuration = configChooser.getConfiguration();
-        String currentTheme = configuration.getTheme();
-        String currentName = null;
-        if (currentTheme != null) {
-            currentName = ResourceHelper.styleToTheme(currentTheme);
-            SelectThemeAction action = new SelectThemeAction(configChooser,
-                    currentName,
-                    currentTheme,
-                    true /* selected */);
-            action.setEnabled(false);
-            manager.add(action);
-            manager.add(new Separator());
-        }
-
-        String preferred = configuration.computePreferredTheme();
-        if (preferred != null && !preferred.equals(currentTheme)) {
-            manager.add(new SelectThemeAction(configChooser,
-                    ResourceHelper.styleToTheme(preferred),
-                    preferred, false /* selected */));
-            manager.add(new Separator());
-        }
-
-        IAndroidTarget target = configuration.getTarget();
-        int apiLevel = target != null ? target.getVersion().getApiLevel() : 1;
-        boolean hasHolo = apiLevel >= 11;   // Honeycomb
-        boolean hasDeviceDefault = apiLevel >= 14; // ICS
-
-        // TODO: Add variations of the current theme here, e.g.
-        // if you're using Theme.Holo, add Theme.Holo.Dialog, Theme.Holo.Panel,
-        // Theme.Holo.Wallpaper etc
-
-        manager.add(new ThemeMenuAction(MENU_PROJECT, "Project Themes",
-                configChooser, themeList));
-        manager.add(new ThemeMenuAction(MENU_MANIFEST, "Manifest Themes",
-                configChooser, themeList));
-
-        manager.add(new Separator());
-
-        if (hasHolo) {
-            manager.add(new ThemeMenuAction(MENU_HOLO, "Holo",
-                    configChooser, themeList));
-            manager.add(new ThemeMenuAction(MENU_HOLO_LIGHT, "Holo.Light",
-                    configChooser, themeList));
-        }
-        if (hasDeviceDefault) {
-            manager.add(new ThemeMenuAction(MENU_DEVICE, "DeviceDefault",
-                    configChooser, themeList));
-            manager.add(new ThemeMenuAction(MENU_DEVICE_LIGHT, "DeviceDefault.Light",
-                    configChooser, themeList));
-        }
-        manager.add(new ThemeMenuAction(MENU_THEME, "Theme",
-                configChooser, themeList));
-        manager.add(new ThemeMenuAction(MENU_THEME_LIGHT, "Theme.Light",
-                configChooser, themeList));
-
-        // TODO: Add generic types like Wallpaper, Dialog, Alert, etc here, with
-        // submenus for picking it within each theme category?
-
-        manager.add(new Separator());
-        manager.add(new ThemeMenuAction(MENU_ALL, "All",
-                configChooser, themeList));
-
-        if (currentTheme != null) {
-            assert currentName != null;
-            manager.add(new Separator());
-            String title = String.format("Open %1$s Declaration...", currentName);
-            manager.add(new OpenThemeAction(title, configChooser.getEditedFile(), currentTheme));
-        }
-
-        Menu menu = manager.createContextMenu(configChooser.getShell());
-
-        Rectangle bounds = combo.getBounds();
-        Point location = new Point(bounds.x, bounds.y + bounds.height);
-        location = combo.getParent().toDisplay(location);
-        menu.setLocation(location.x, location.y);
-        menu.setVisible(true);
-    }
-
-    @Override
-    protected void addMenuItems(Menu menu) {
-        switch (mType) {
-            case MENU_ALL:
-                addMenuItems(menu, mThemeList);
-                break;
-
-            case MENU_MANIFEST: {
-                IProject project = mConfigChooser.getEditedFile().getProject();
-                ManifestInfo manifest = ManifestInfo.get(project);
-                Configuration configuration = mConfigChooser.getConfiguration();
-                String activity = configuration.getActivity();
-                if (activity != null) {
-                    ActivityAttributes attributes = manifest.getActivityAttributes(activity);
-                    if (attributes != null) {
-                        String theme = attributes.getTheme();
-                        if (theme != null) {
-                            addMenuItem(menu, theme, isSelectedTheme(theme));
-                        }
-                    }
-                }
-
-                String manifestTheme = manifest.getManifestTheme();
-                boolean found = false;
-                Set<String> allThemes = new HashSet<String>();
-                if (manifestTheme != null) {
-                    found = true;
-                    allThemes.add(manifestTheme);
-                }
-                for (ActivityAttributes info : manifest.getActivityAttributesMap().values()) {
-                    if (info.getTheme() != null) {
-                        found = true;
-                        allThemes.add(info.getTheme());
-                    }
-                }
-                List<String> sorted = new ArrayList<String>(allThemes);
-                Collections.sort(sorted);
-                String current = configuration.getTheme();
-                for (String theme : sorted) {
-                    boolean selected = theme.equals(current);
-                    addMenuItem(menu, theme, selected);
-                }
-                if (!found) {
-                    addDisabledMessageItem("No themes are registered in the manifest");
-                }
-                break;
-            }
-            case MENU_PROJECT: {
-                int size = mThemeList.size();
-                List<String> themes = new ArrayList<String>(size);
-                for (int i = 0; i < size; i++) {
-                    String theme = mThemeList.get(i);
-                    if (ResourceHelper.isProjectStyle(theme)) {
-                        themes.add(theme);
-                    }
-                }
-                if (themes.isEmpty()) {
-                    addDisabledMessageItem("There are no local theme styles in the project");
-                } else {
-                    addMenuItems(menu, themes);
-                }
-                break;
-            }
-            case MENU_THEME: {
-                // Can't just use the usual filterThemes() call here because we need
-                // to exclude on multiple prefixes: Holo, DeviceDefault, Light, ...
-                List<String> themes = new ArrayList<String>(mThemeList.size());
-                for (String theme : mThemeList) {
-                    if (theme.startsWith(THEME_PREFIX)
-                            && !theme.startsWith(LIGHT_PREFIX)
-                            && !theme.startsWith(HOLO_PREFIX)
-                            && !theme.startsWith(DEVICE_PREFIX)) {
-                        themes.add(theme);
-                    }
-                }
-
-                addMenuItems(menu, themes);
-                break;
-            }
-            case MENU_THEME_LIGHT:
-                addMenuItems(menu, filterThemes(LIGHT_PREFIX, null));
-                break;
-            case MENU_HOLO:
-                addMenuItems(menu, filterThemes(HOLO_PREFIX, HOLO_LIGHT_PREFIX));
-                break;
-            case MENU_HOLO_LIGHT:
-                addMenuItems(menu, filterThemes(HOLO_LIGHT_PREFIX, null));
-                break;
-            case MENU_DEVICE:
-                addMenuItems(menu, filterThemes(DEVICE_PREFIX, DEVICE_LIGHT_PREFIX));
-                break;
-            case MENU_DEVICE_LIGHT:
-                addMenuItems(menu, filterThemes(DEVICE_LIGHT_PREFIX, null));
-                break;
-        }
-    }
-
-    private List<String> filterThemes(String include, String exclude) {
-        List<String> themes = new ArrayList<String>(mThemeList.size());
-        for (String theme : mThemeList) {
-            if (theme.startsWith(include) && (exclude == null || !theme.startsWith(exclude))) {
-                themes.add(theme);
-            }
-        }
-
-        return themes;
-    }
-
-    private void addMenuItems(Menu menu, List<String> themes) {
-        String current = mConfigChooser.getConfiguration().getTheme();
-        for (String theme : themes) {
-            addMenuItem(menu, theme, theme.equals(current));
-        }
-    }
-
-    private boolean isSelectedTheme(String theme) {
-        return theme.equals(mConfigChooser.getConfiguration().getTheme());
-    }
-
-    private void addMenuItem(Menu menu, String theme, boolean selected) {
-        String title = ResourceHelper.styleToTheme(theme);
-        SelectThemeAction action = new SelectThemeAction(mConfigChooser, title, theme, selected);
-        new ActionContributionItem(action).fill(menu, -1);
-    }
-
-    private static class OpenThemeAction extends Action {
-        private final String mTheme;
-        private final IFile mFile;
-
-        private OpenThemeAction(String title, IFile file, String theme) {
-            super(title, IAction.AS_PUSH_BUTTON);
-            mFile = file;
-            mTheme = theme;
-        }
-
-        @Override
-        public void run() {
-            IProject project = mFile.getProject();
-            IHyperlink[] links = Hyperlinks.getResourceLinks(null, mTheme, project, null);
-            if (links != null && links.length > 0) {
-                IHyperlink link = links[0];
-                link.open();
-            }
-        }
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/configuration/VaryingConfiguration.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/configuration/VaryingConfiguration.java
deleted file mode 100644
index f472cd6..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/configuration/VaryingConfiguration.java
+++ /dev/null
@@ -1,509 +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.ide.eclipse.adt.internal.editors.layout.configuration;
-
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-import com.android.ide.common.rendering.api.Capability;
-import com.android.ide.eclipse.adt.internal.editors.manifest.ManifestInfo;
-import com.android.resources.Density;
-import com.android.resources.NightMode;
-import com.android.resources.UiMode;
-import com.android.sdklib.IAndroidTarget;
-import com.android.sdklib.devices.Device;
-import com.android.sdklib.devices.Hardware;
-import com.android.sdklib.devices.Screen;
-import com.android.sdklib.devices.State;
-
-import java.util.Collection;
-import java.util.List;
-
-/**
- * An {@linkplain VaryingConfiguration} is a {@link Configuration} which
- * inherits all of its values from a different configuration, except for one or
- * more attributes where it overrides a custom value, and the overridden value
- * will always <b>differ</b> from the inherited value!
- * <p>
- * For example, a {@linkplain VaryingConfiguration} may state that it
- * overrides the locale, and if the inherited locale is "en", then the returned
- * locale from the {@linkplain VaryingConfiguration} may be for example "nb",
- * but never "en".
- * <p>
- * The configuration will attempt to make its changed inherited value to be as
- * different as possible from the inherited value. Thus, a configuration which
- * overrides the device will probably return a phone-sized screen if the
- * inherited device is a tablet, or vice versa.
- */
-public class VaryingConfiguration extends NestedConfiguration {
-    /** Variation version; see {@link #setVariation(int)} */
-    private int mVariation;
-
-    /** Variation version count; see {@link #setVariationCount(int)} */
-    private int mVariationCount;
-
-    /** Bitmask of attributes to be varied/alternated from the parent */
-    private int mAlternate;
-
-    /**
-     * Constructs a new {@linkplain VaryingConfiguration}.
-     * Construct via
-     *
-     * @param chooser the associated chooser
-     * @param configuration the configuration to inherit from
-     */
-    private VaryingConfiguration(
-            @NonNull ConfigurationChooser chooser,
-            @NonNull Configuration configuration) {
-        super(chooser, configuration);
-    }
-
-    /**
-     * Creates a new {@linkplain Configuration} which inherits values from the
-     * given parent {@linkplain Configuration}, possibly overriding some as
-     * well.
-     *
-     * @param chooser the associated chooser
-     * @param parent the configuration to inherit values from
-     * @return a new configuration
-     */
-    @NonNull
-    public static VaryingConfiguration create(@NonNull ConfigurationChooser chooser,
-            @NonNull Configuration parent) {
-        return new VaryingConfiguration(chooser, parent);
-    }
-
-    /**
-     * Creates a new {@linkplain VaryingConfiguration} that has the same overriding
-     * attributes as the given other {@linkplain VaryingConfiguration}.
-     *
-     * @param other the configuration to copy overrides from
-     * @param parent the parent to tie the configuration to for inheriting values
-     * @return a new configuration
-     */
-    @NonNull
-    public static VaryingConfiguration create(
-            @NonNull VaryingConfiguration other,
-            @NonNull Configuration parent) {
-        VaryingConfiguration configuration =
-                new VaryingConfiguration(other.mConfigChooser, parent);
-        initFrom(configuration, other, other, false);
-        configuration.mAlternate = other.mAlternate;
-        configuration.mVariation = other.mVariation;
-        configuration.mVariationCount = other.mVariationCount;
-        configuration.syncFolderConfig();
-
-        return configuration;
-    }
-
-    /**
-     * Returns the alternate flags for this configuration. Corresponds to
-     * the {@code CFG_} flags in {@link ConfigurationClient}.
-     *
-     * @return the bitmask
-     */
-    public int getAlternateFlags() {
-        return mAlternate;
-    }
-
-    @Override
-    public void syncFolderConfig() {
-        super.syncFolderConfig();
-        updateDisplayName();
-    }
-
-    /**
-     * Sets the variation version for this
-     * {@linkplain VaryingConfiguration}. There might be multiple
-     * {@linkplain VaryingConfiguration} instances inheriting from a
-     * {@link Configuration}. The variation version allows them to choose
-     * different complementing values, so they don't all flip to the same other
-     * (out of multiple choices) value. The {@link #setVariationCount(int)}
-     * value can be used to determine how to partition the buckets of values.
-     * Also updates the variation count if necessary.
-     *
-     * @param variation variation version
-     */
-    public void setVariation(int variation) {
-        mVariation = variation;
-        mVariationCount = Math.max(mVariationCount, variation + 1);
-    }
-
-    /**
-     * Sets the number of {@link VaryingConfiguration} variations mapped
-     * to the same parent configuration as this one. See
-     * {@link #setVariation(int)} for details.
-     *
-     * @param count the total number of variation versions
-     */
-    public void setVariationCount(int count) {
-        mVariationCount = count;
-    }
-
-    /**
-     * Updates the display name in this configuration based on the values and override settings
-     */
-    public void updateDisplayName() {
-        setDisplayName(computeDisplayName());
-    }
-
-    @Override
-    @NonNull
-    public Locale getLocale() {
-        if (isOverridingLocale()) {
-            return super.getLocale();
-        }
-        Locale locale = mParent.getLocale();
-        if (isAlternatingLocale() && locale != null) {
-            List<Locale> locales = mConfigChooser.getLocaleList();
-            for (Locale l : locales) {
-                // TODO: Try to be smarter about which one we pick; for example, try
-                // to pick a language that is substantially different from the inherited
-                // language, such as either with the strings of the largest or shortest
-                // length, or perhaps based on some geography or population metrics
-                if (!l.equals(locale)) {
-                    locale = l;
-                    break;
-                }
-            }
-        }
-
-        return locale;
-    }
-
-    @Override
-    @Nullable
-    public IAndroidTarget getTarget() {
-        if (isOverridingTarget()) {
-            return super.getTarget();
-        }
-        IAndroidTarget target = mParent.getTarget();
-        if (isAlternatingTarget() && target != null) {
-            List<IAndroidTarget> targets = mConfigChooser.getTargetList();
-            if (!targets.isEmpty()) {
-                // Pick a different target: if you're showing the most recent render target,
-                // then pick the lowest supported target, and vice versa
-                IAndroidTarget mostRecent = targets.get(targets.size() - 1);
-                if (target.equals(mostRecent)) {
-                    // Find oldest supported
-                    ManifestInfo info = ManifestInfo.get(mConfigChooser.getProject());
-                    int minSdkVersion = info.getMinSdkVersion();
-                    for (IAndroidTarget t : targets) {
-                        if (t.getVersion().getApiLevel() >= minSdkVersion) {
-                            target = t;
-                            break;
-                        }
-                    }
-                } else {
-                    target = mostRecent;
-                }
-            }
-        }
-
-        return target;
-    }
-
-    // Cached values, key=parent's device, cached value=device
-    private Device mPrevParentDevice;
-    private Device mPrevDevice;
-
-    @Override
-    @Nullable
-    public Device getDevice() {
-        if (isOverridingDevice()) {
-            return super.getDevice();
-        }
-        Device device = mParent.getDevice();
-        if (isAlternatingDevice() && device != null) {
-            if (device == mPrevParentDevice) {
-                return mPrevDevice;
-            }
-
-            mPrevParentDevice = device;
-
-            // Pick a different device
-            Collection<Device> devices = mConfigChooser.getDevices();
-
-            // Divide up the available devices into {@link #mVariationCount} + 1 buckets
-            // (the + 1 is for the bucket now taken up by the inherited value).
-            // Then assign buckets to each {@link #mVariation} version, and pick one
-            // from the bucket assigned to this current configuration's variation version.
-
-            // I could just divide up the device list count, but that would treat a lot of
-            // very similar phones as having the same kind of variety as the 7" and 10"
-            // tablets which are sitting right next to each other in the device list.
-            // Instead, do this by screen size.
-
-
-            double smallest = 100;
-            double biggest = 1;
-            for (Device d : devices) {
-                double size = getScreenSize(d);
-                if (size < 0) {
-                    continue; // no data
-                }
-                if (size >= biggest) {
-                    biggest = size;
-                }
-                if (size <= smallest) {
-                    smallest = size;
-                }
-            }
-
-            int bucketCount = mVariationCount + 1;
-            double inchesPerBucket = (biggest - smallest) / bucketCount;
-
-            double overriddenSize = getScreenSize(device);
-            int overriddenBucket = (int) ((overriddenSize - smallest) / inchesPerBucket);
-            int bucket = (mVariation < overriddenBucket) ? mVariation : mVariation + 1;
-            double from = inchesPerBucket * bucket + smallest;
-            double to = from + inchesPerBucket;
-            if (biggest - to < 0.1) {
-                to = biggest + 0.1;
-            }
-
-            boolean canScaleNinePatch = supports(Capability.FIXED_SCALABLE_NINE_PATCH);
-            for (Device d : devices) {
-                double size = getScreenSize(d);
-                if (size >= from && size < to) {
-                    if (!canScaleNinePatch) {
-                        Density density = getDensity(d);
-                        if (density == Density.TV || density == Density.LOW) {
-                            continue;
-                        }
-                    }
-
-                    device = d;
-                    break;
-                }
-            }
-
-            mPrevDevice = device;
-        }
-
-        return device;
-    }
-
-    /**
-     * Returns the density of the given device
-     *
-     * @param device the device to check
-     * @return the density or null
-     */
-    @Nullable
-    private static Density getDensity(@NonNull Device device) {
-        Hardware hardware = device.getDefaultHardware();
-        if (hardware != null) {
-            Screen screen = hardware.getScreen();
-            if (screen != null) {
-                return screen.getPixelDensity();
-            }
-        }
-
-        return null;
-    }
-
-    /**
-     * Returns the diagonal length of the given device
-     *
-     * @param device the device to check
-     * @return the diagonal length or -1
-     */
-    private static double getScreenSize(@NonNull Device device) {
-        Hardware hardware = device.getDefaultHardware();
-        if (hardware != null) {
-            Screen screen = hardware.getScreen();
-            if (screen != null) {
-                return screen.getDiagonalLength();
-            }
-        }
-
-        return -1;
-    }
-
-    @Override
-    @Nullable
-    public State getDeviceState() {
-        if (isOverridingDeviceState()) {
-            return super.getDeviceState();
-        }
-        State state = mParent.getDeviceState();
-        if (isAlternatingDeviceState() && state != null) {
-            State alternate = getNextDeviceState(state);
-
-            return alternate;
-        } else {
-            if ((isAlternatingDevice() || isOverridingDevice()) && state != null) {
-                // If the device differs, I need to look up a suitable equivalent state
-                // on our device
-                Device device = getDevice();
-                if (device != null) {
-                    return device.getState(state.getName());
-                }
-            }
-
-            return state;
-        }
-    }
-
-    @Override
-    @NonNull
-    public NightMode getNightMode() {
-        if (isOverridingNightMode()) {
-            return super.getNightMode();
-        }
-        NightMode nightMode = mParent.getNightMode();
-        if (isAlternatingNightMode() && nightMode != null) {
-            nightMode = nightMode == NightMode.NIGHT ? NightMode.NOTNIGHT : NightMode.NIGHT;
-            return nightMode;
-        } else {
-            return nightMode;
-        }
-    }
-
-    @Override
-    @NonNull
-    public UiMode getUiMode() {
-        if (isOverridingUiMode()) {
-            return super.getUiMode();
-        }
-        UiMode uiMode = mParent.getUiMode();
-        if (isAlternatingUiMode() && uiMode != null) {
-            // TODO: Use manifest's supports screen to decide which are most relevant
-            // (as well as which available configuration qualifiers are present in the
-            // layout)
-            UiMode[] values = UiMode.values();
-            uiMode = values[(uiMode.ordinal() + 1) % values.length];
-            return uiMode;
-        } else {
-            return uiMode;
-        }
-    }
-
-    @Override
-    @Nullable
-    public String computeDisplayName() {
-        return computeDisplayName(getOverrideFlags() | mAlternate, this);
-    }
-
-    /**
-     * Sets whether the locale should be alternated by this configuration
-     *
-     * @param alternate if true, alternate the inherited value
-     */
-    public void setAlternateLocale(boolean alternate) {
-        mAlternate |= CFG_LOCALE;
-    }
-
-    /**
-     * Returns true if the locale is alternated
-     *
-     * @return true if the locale is alternated
-     */
-    public final boolean isAlternatingLocale() {
-        return (mAlternate & CFG_LOCALE) != 0;
-    }
-
-    /**
-     * Sets whether the rendering target should be alternated by this configuration
-     *
-     * @param alternate if true, alternate the inherited value
-     */
-    public void setAlternateTarget(boolean alternate) {
-        mAlternate |= CFG_TARGET;
-    }
-
-    /**
-     * Returns true if the target is alternated
-     *
-     * @return true if the target is alternated
-     */
-    public final boolean isAlternatingTarget() {
-        return (mAlternate & CFG_TARGET) != 0;
-    }
-
-    /**
-     * Sets whether the device should be alternated by this configuration
-     *
-     * @param alternate if true, alternate the inherited value
-     */
-    public void setAlternateDevice(boolean alternate) {
-        mAlternate |= CFG_DEVICE;
-    }
-
-    /**
-     * Returns true if the device is alternated
-     *
-     * @return true if the device is alternated
-     */
-    public final boolean isAlternatingDevice() {
-        return (mAlternate & CFG_DEVICE) != 0;
-    }
-
-    /**
-     * Sets whether the device state should be alternated by this configuration
-     *
-     * @param alternate if true, alternate the inherited value
-     */
-    public void setAlternateDeviceState(boolean alternate) {
-        mAlternate |= CFG_DEVICE_STATE;
-    }
-
-    /**
-     * Returns true if the device state is alternated
-     *
-     * @return true if the device state is alternated
-     */
-    public final boolean isAlternatingDeviceState() {
-        return (mAlternate & CFG_DEVICE_STATE) != 0;
-    }
-
-    /**
-     * Sets whether the night mode should be alternated by this configuration
-     *
-     * @param alternate if true, alternate the inherited value
-     */
-    public void setAlternateNightMode(boolean alternate) {
-        mAlternate |= CFG_NIGHT_MODE;
-    }
-
-    /**
-     * Returns true if the night mode is alternated
-     *
-     * @return true if the night mode is alternated
-     */
-    public final boolean isAlternatingNightMode() {
-        return (mAlternate & CFG_NIGHT_MODE) != 0;
-    }
-
-    /**
-     * Sets whether the UI mode should be alternated by this configuration
-     *
-     * @param alternate if true, alternate the inherited value
-     */
-    public void setAlternateUiMode(boolean alternate) {
-        mAlternate |= CFG_UI_MODE;
-    }
-
-    /**
-     * Returns true if the UI mode is alternated
-     *
-     * @return true if the UI mode is alternated
-     */
-    public final boolean isAlternatingUiMode() {
-        return (mAlternate & CFG_UI_MODE) != 0;
-    }
-
-}
\ No newline at end of file
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/descriptors/CustomViewDescriptorService.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/descriptors/CustomViewDescriptorService.java
deleted file mode 100644
index 6df6929..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/descriptors/CustomViewDescriptorService.java
+++ /dev/null
@@ -1,621 +0,0 @@
-/*
- * 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.editors.layout.descriptors;
-
-import static com.android.SdkConstants.ANDROID_NS_NAME_PREFIX;
-import static com.android.SdkConstants.ANDROID_URI;
-import static com.android.SdkConstants.AUTO_URI;
-import static com.android.SdkConstants.CLASS_VIEWGROUP;
-import static com.android.SdkConstants.URI_PREFIX;
-
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-import com.android.ide.common.resources.ResourceFile;
-import com.android.ide.common.resources.ResourceItem;
-import com.android.ide.common.resources.platform.AttributeInfo;
-import com.android.ide.common.resources.platform.AttrsXmlParser;
-import com.android.ide.common.resources.platform.ViewClassInfo;
-import com.android.ide.common.resources.platform.ViewClassInfo.LayoutParamsInfo;
-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.ide.eclipse.adt.internal.editors.descriptors.AttributeDescriptor;
-import com.android.ide.eclipse.adt.internal.editors.descriptors.DescriptorsUtils;
-import com.android.ide.eclipse.adt.internal.editors.descriptors.ElementDescriptor;
-import com.android.ide.eclipse.adt.internal.editors.manifest.ManifestInfo;
-import com.android.ide.eclipse.adt.internal.resources.manager.ProjectResources;
-import com.android.ide.eclipse.adt.internal.resources.manager.ResourceManager;
-import com.android.ide.eclipse.adt.internal.sdk.AndroidTargetData;
-import com.android.ide.eclipse.adt.internal.sdk.ProjectState;
-import com.android.ide.eclipse.adt.internal.sdk.Sdk;
-import com.android.resources.ResourceType;
-import com.android.sdklib.IAndroidTarget;
-import com.google.common.collect.Maps;
-import com.google.common.collect.ObjectArrays;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IWorkspaceRoot;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.jdt.core.IClassFile;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.IType;
-import org.eclipse.jdt.core.ITypeHierarchy;
-import org.eclipse.jdt.core.JavaCore;
-import org.eclipse.jdt.core.JavaModelException;
-import org.eclipse.swt.graphics.Image;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-/**
- * Service responsible for creating/managing {@link ViewElementDescriptor} objects for custom
- * View classes per project.
- * <p/>
- * The service provides an on-demand monitoring of custom classes to check for changes. Monitoring
- * starts once a request for an {@link ViewElementDescriptor} object has been done for a specific
- * class.
- * <p/>
- * The monitoring will notify a listener of any changes in the class triggering a change in its
- * associated {@link ViewElementDescriptor} object.
- * <p/>
- * If the custom class does not exist, no monitoring is put in place to avoid having to listen
- * to all class changes in the projects.
- */
-public final class CustomViewDescriptorService {
-
-    private static CustomViewDescriptorService sThis = new CustomViewDescriptorService();
-
-    /**
-     * Map where keys are the project, and values are another map containing all the known
-     * custom View class for this project. The custom View class are stored in a map
-     * where the keys are the fully qualified class name, and the values are their associated
-     * {@link ViewElementDescriptor}.
-     */
-    private HashMap<IProject, HashMap<String, ViewElementDescriptor>> mCustomDescriptorMap =
-        new HashMap<IProject, HashMap<String, ViewElementDescriptor>>();
-
-    /**
-     * TODO will be used to update the ViewElementDescriptor of the custom view when it
-     * is modified (either the class itself or its attributes.xml)
-     */
-    @SuppressWarnings("unused")
-    private ICustomViewDescriptorListener mListener;
-
-    /**
-     * Classes which implements this interface provide a method that deal with modifications
-     * in custom View class triggering a change in its associated {@link ViewClassInfo} object.
-     */
-    public interface ICustomViewDescriptorListener {
-        /**
-         * Sent when a custom View class has changed and
-         * its {@link ViewElementDescriptor} was modified.
-         *
-         * @param project the project containing the class.
-         * @param className the fully qualified class name.
-         * @param descriptor the updated ElementDescriptor.
-         */
-        public void updatedClassInfo(IProject project,
-                                     String className,
-                                     ViewElementDescriptor descriptor);
-    }
-
-    /**
-     * Returns the singleton instance of {@link CustomViewDescriptorService}.
-     */
-    public static CustomViewDescriptorService getInstance() {
-        return sThis;
-    }
-
-    /**
-     * Sets the listener receiving custom View class modification notifications.
-     * @param listener the listener to receive the notifications.
-     *
-     * TODO will be used to update the ViewElementDescriptor of the custom view when it
-     * is modified (either the class itself or its attributes.xml)
-     */
-    public void setListener(ICustomViewDescriptorListener listener) {
-        mListener = listener;
-    }
-
-    /**
-     * Returns the {@link ViewElementDescriptor} for a particular project/class when the
-     * fully qualified class name actually matches a class from the given project.
-     * <p/>
-     * Custom descriptors are created as needed.
-     * <p/>
-     * If it is the first time the {@link ViewElementDescriptor} is requested, the method
-     * will check that the specified class is in fact a custom View class. Once this is
-     * established, a monitoring for that particular class is initiated. Any change will
-     * trigger a notification to the {@link ICustomViewDescriptorListener}.
-     *
-     * @param project the project containing the class.
-     * @param fqcn the fully qualified name of the class.
-     * @return a {@link ViewElementDescriptor} or <code>null</code> if the class was not
-     *         a custom View class.
-     */
-    public ViewElementDescriptor getDescriptor(IProject project, String fqcn) {
-        // look in the map first
-        synchronized (mCustomDescriptorMap) {
-            HashMap<String, ViewElementDescriptor> map = mCustomDescriptorMap.get(project);
-
-            if (map != null) {
-                ViewElementDescriptor descriptor = map.get(fqcn);
-                if (descriptor != null) {
-                    return descriptor;
-                }
-            }
-
-            // if we step here, it looks like we haven't created it yet.
-            // First lets check this is in fact a valid type in the project
-
-            try {
-                // We expect the project to be both opened and of java type (since it's an android
-                // project), so we can create a IJavaProject object from our IProject.
-                IJavaProject javaProject = JavaCore.create(project);
-
-                // replace $ by . in the class name
-                String javaClassName = fqcn.replaceAll("\\$", "\\."); //$NON-NLS-1$ //$NON-NLS-2$
-
-                // look for the IType object for this class
-                IType type = javaProject.findType(javaClassName);
-                if (type != null && type.exists()) {
-                    // the type exists. Let's get the parent class and its ViewClassInfo.
-
-                    // get the type hierarchy
-                    ITypeHierarchy hierarchy = type.newSupertypeHierarchy(
-                            new NullProgressMonitor());
-
-                    ViewElementDescriptor parentDescriptor = createViewDescriptor(
-                            hierarchy.getSuperclass(type), project, hierarchy);
-
-                    if (parentDescriptor != null) {
-                        // we have a valid parent, lets create a new ViewElementDescriptor.
-                        List<AttributeDescriptor> attrList = new ArrayList<AttributeDescriptor>();
-                        List<AttributeDescriptor> paramList = new ArrayList<AttributeDescriptor>();
-                        Map<ResourceFile, Long> files = findCustomDescriptors(project, type,
-                                attrList, paramList);
-
-                        AttributeDescriptor[] attributes =
-                                getAttributeDescriptor(type, parentDescriptor);
-                        if (!attrList.isEmpty()) {
-                            attributes = join(attrList, attributes);
-                        }
-                        AttributeDescriptor[] layoutAttributes =
-                                getLayoutAttributeDescriptors(type, parentDescriptor);
-                        if (!paramList.isEmpty()) {
-                            layoutAttributes = join(paramList, layoutAttributes);
-                        }
-                        String name = DescriptorsUtils.getBasename(fqcn);
-                        ViewElementDescriptor descriptor = new CustomViewDescriptor(name, fqcn,
-                                attributes,
-                                layoutAttributes,
-                                parentDescriptor.getChildren(),
-                                project, files);
-                        descriptor.setSuperClass(parentDescriptor);
-
-                        synchronized (mCustomDescriptorMap) {
-                            map = mCustomDescriptorMap.get(project);
-                            if (map == null) {
-                                map = new HashMap<String, ViewElementDescriptor>();
-                                mCustomDescriptorMap.put(project, map);
-                            }
-
-                            map.put(fqcn, descriptor);
-                        }
-
-                        //TODO setup listener on this resource change.
-
-                        return descriptor;
-                    }
-                }
-            } catch (JavaModelException e) {
-                // there was an error accessing any of the IType, we'll just return null;
-            }
-        }
-
-        return null;
-    }
-
-    private static AttributeDescriptor[] join(
-            @NonNull List<AttributeDescriptor> attributeList,
-            @NonNull AttributeDescriptor[] attributes) {
-        if (!attributeList.isEmpty()) {
-            return ObjectArrays.concat(
-                    attributeList.toArray(new AttributeDescriptor[attributeList.size()]),
-                    attributes,
-                    AttributeDescriptor.class);
-        } else {
-            return attributes;
-        }
-
-    }
-
-    /** Cache used by {@link #getParser(ResourceFile)} */
-    private Map<ResourceFile, AttrsXmlParser> mParserCache;
-
-    private AttrsXmlParser getParser(ResourceFile file) {
-        if (mParserCache == null) {
-            mParserCache = new HashMap<ResourceFile, AttrsXmlParser>();
-        }
-
-        AttrsXmlParser parser = mParserCache.get(file);
-        if (parser == null) {
-            parser = new AttrsXmlParser(
-                    file.getFile().getOsLocation(),
-                    AdtPlugin.getDefault(), 20);
-            parser.preload();
-            mParserCache.put(file, parser);
-        }
-
-        return parser;
-    }
-
-    /** Compute/find the styleable resources for the given type, if possible */
-    private Map<ResourceFile, Long> findCustomDescriptors(
-            IProject project,
-            IType type,
-            List<AttributeDescriptor> customAttributes,
-            List<AttributeDescriptor> customLayoutAttributes) {
-        // Look up the project where the type is declared (could be a library project;
-        // we cannot use type.getJavaProject().getProject())
-        IProject library = getProjectDeclaringType(type);
-        if (library == null) {
-            library = project;
-        }
-
-        String className = type.getElementName();
-        Set<ResourceFile> resourceFiles = findAttrsFiles(library, className);
-        if (resourceFiles != null && resourceFiles.size() > 0) {
-            String appUri = getAppResUri(project);
-            Map<ResourceFile, Long> timestamps =
-                    Maps.newHashMapWithExpectedSize(resourceFiles.size());
-            for (ResourceFile file : resourceFiles) {
-                AttrsXmlParser attrsXmlParser = getParser(file);
-                String fqcn = type.getFullyQualifiedName();
-
-                // Attributes
-                ViewClassInfo classInfo = new ViewClassInfo(true, fqcn, className);
-                attrsXmlParser.loadViewAttributes(classInfo);
-                appendAttributes(customAttributes, classInfo.getAttributes(), appUri);
-
-                // Layout params
-                LayoutParamsInfo layoutInfo = new ViewClassInfo.LayoutParamsInfo(
-                        classInfo, "Layout", null /*superClassInfo*/); //$NON-NLS-1$
-                attrsXmlParser.loadLayoutParamsAttributes(layoutInfo);
-                appendAttributes(customLayoutAttributes, layoutInfo.getAttributes(), appUri);
-
-                timestamps.put(file, file.getFile().getModificationStamp());
-            }
-
-            return timestamps;
-        }
-
-        return null;
-    }
-
-    /**
-     * Finds the set of XML files (if any) in the given library declaring
-     * attributes for the given class name
-     */
-    @Nullable
-    private static Set<ResourceFile> findAttrsFiles(IProject library, String className) {
-        Set<ResourceFile> resourceFiles = null;
-        ResourceManager manager = ResourceManager.getInstance();
-        ProjectResources resources = manager.getProjectResources(library);
-        if (resources != null) {
-            Collection<ResourceItem> items =
-                resources.getResourceItemsOfType(ResourceType.DECLARE_STYLEABLE);
-            for (ResourceItem item : items) {
-                String viewName = item.getName();
-                if (viewName.equals(className)
-                        || (viewName.startsWith(className)
-                            && viewName.equals(className + "_Layout"))) { //$NON-NLS-1$
-                    if (resourceFiles == null) {
-                        resourceFiles = new HashSet<ResourceFile>();
-                    }
-                    resourceFiles.addAll(item.getSourceFileList());
-                }
-            }
-        }
-        return resourceFiles;
-    }
-
-    /**
-     * Find the project containing this type declaration. We cannot use
-     * {@link IType#getJavaProject()} since that will return the including
-     * project and we're after the library project such that we can find the
-     * attrs.xml file in the same project.
-     */
-    @Nullable
-    private static IProject getProjectDeclaringType(IType type) {
-        IClassFile classFile = type.getClassFile();
-        if (classFile != null) {
-            IPath path = classFile.getPath();
-            IWorkspaceRoot workspace = ResourcesPlugin.getWorkspace().getRoot();
-            IResource resource;
-            if (path.isAbsolute()) {
-                resource = AdtUtils.fileToResource(path.toFile());
-            } else {
-                resource = workspace.findMember(path);
-            }
-            if (resource != null && resource.getProject() != null) {
-                return resource.getProject();
-            }
-        }
-
-        return null;
-    }
-
-    /** Returns the name space to use for application attributes */
-    private static String getAppResUri(IProject project) {
-        String appResource;
-        ProjectState projectState = Sdk.getProjectState(project);
-        if (projectState != null && projectState.isLibrary()) {
-            appResource = AUTO_URI;
-        } else {
-            ManifestInfo manifestInfo = ManifestInfo.get(project);
-            appResource = URI_PREFIX + manifestInfo.getPackage();
-        }
-        return appResource;
-    }
-
-
-    /** Append the {@link AttributeInfo} objects converted {@link AttributeDescriptor}
-     * objects into the given attribute list.
-     * <p>
-     * This is nearly identical to
-     *  {@link DescriptorsUtils#appendAttribute(List, String, String, AttributeInfo, boolean, Map)}
-     * but it handles namespace declarations in the attrs.xml file where the android:
-     * namespace is included in the names.
-     */
-    private static void appendAttributes(List<AttributeDescriptor> attributes,
-            AttributeInfo[] attributeInfos, String appResource) {
-        // Custom attributes
-        for (AttributeInfo info : attributeInfos) {
-            String nsUri;
-            if (info.getName().startsWith(ANDROID_NS_NAME_PREFIX)) {
-                info.setName(info.getName().substring(ANDROID_NS_NAME_PREFIX.length()));
-                nsUri = ANDROID_URI;
-            } else {
-                nsUri = appResource;
-            }
-
-            DescriptorsUtils.appendAttribute(attributes,
-                    null /*elementXmlName*/, nsUri, info, false /*required*/,
-                    null /*overrides*/);
-        }
-    }
-
-    /**
-     * Computes (if needed) and returns the {@link ViewElementDescriptor} for the specified type.
-     *
-     * @return A {@link ViewElementDescriptor} or null if type or typeHierarchy is null.
-     */
-    private ViewElementDescriptor createViewDescriptor(IType type, IProject project,
-            ITypeHierarchy typeHierarchy) {
-        // check if the type is a built-in View class.
-        List<ViewElementDescriptor> builtInList = null;
-
-        // give up if there's no type
-        if (type == null) {
-            return null;
-        }
-
-        String fqcn = type.getFullyQualifiedName();
-
-        Sdk currentSdk = Sdk.getCurrent();
-        if (currentSdk != null) {
-            IAndroidTarget target = currentSdk.getTarget(project);
-            if (target != null) {
-                AndroidTargetData data = currentSdk.getTargetData(target);
-                if (data != null) {
-                    LayoutDescriptors descriptors = data.getLayoutDescriptors();
-                    ViewElementDescriptor d = descriptors.findDescriptorByClass(fqcn);
-                    if (d != null) {
-                        return d;
-                    }
-                    builtInList = descriptors.getViewDescriptors();
-                }
-            }
-        }
-
-        // it's not a built-in class? Lets look if the superclass is built-in
-        // give up if there's no type
-        if (typeHierarchy == null) {
-            return null;
-        }
-
-        IType parentType = typeHierarchy.getSuperclass(type);
-        if (parentType != null) {
-            ViewElementDescriptor parentDescriptor = createViewDescriptor(parentType, project,
-                    typeHierarchy);
-
-            if (parentDescriptor != null) {
-                // parent class is a valid View class with a descriptor, so we create one
-                // for this class.
-                String name = DescriptorsUtils.getBasename(fqcn);
-                // A custom view accepts children if its parent descriptor also does.
-                // The only exception to this is ViewGroup, which accepts children even though
-                // its parent does not.
-                boolean isViewGroup = fqcn.equals(CLASS_VIEWGROUP);
-                boolean hasChildren = isViewGroup || parentDescriptor.hasChildren();
-                ViewElementDescriptor[] children = null;
-                if (hasChildren && builtInList != null) {
-                    // We can't figure out what the allowable children are by just
-                    // looking at the class, so assume any View is valid
-                    children = builtInList.toArray(new ViewElementDescriptor[builtInList.size()]);
-                }
-                ViewElementDescriptor descriptor = new CustomViewDescriptor(name, fqcn,
-                        getAttributeDescriptor(type, parentDescriptor),
-                        getLayoutAttributeDescriptors(type, parentDescriptor),
-                        children, project, null);
-                descriptor.setSuperClass(parentDescriptor);
-
-                // add it to the map
-                synchronized (mCustomDescriptorMap) {
-                    HashMap<String, ViewElementDescriptor> map = mCustomDescriptorMap.get(project);
-
-                    if (map == null) {
-                        map = new HashMap<String, ViewElementDescriptor>();
-                        mCustomDescriptorMap.put(project, map);
-                    }
-
-                    map.put(fqcn, descriptor);
-
-                }
-
-                //TODO setup listener on this resource change.
-
-                return descriptor;
-            }
-        }
-
-        // class is neither a built-in view class, nor extend one. return null.
-        return null;
-    }
-
-    /**
-     * Returns the array of {@link AttributeDescriptor} for the specified {@link IType}.
-     * <p/>
-     * The array should contain the descriptor for this type and all its supertypes.
-     *
-     * @param type the type for which the {@link AttributeDescriptor} are returned.
-     * @param parentDescriptor the {@link ViewElementDescriptor} of the direct superclass.
-     */
-    private static AttributeDescriptor[] getAttributeDescriptor(IType type,
-            ViewElementDescriptor parentDescriptor) {
-        // TODO add the class attribute descriptors to the parent descriptors.
-        return parentDescriptor.getAttributes();
-    }
-
-    private static AttributeDescriptor[] getLayoutAttributeDescriptors(IType type,
-            ViewElementDescriptor parentDescriptor) {
-        return parentDescriptor.getLayoutAttributes();
-    }
-
-    private class CustomViewDescriptor extends ViewElementDescriptor {
-        private Map<ResourceFile, Long> mTimeStamps;
-        private IProject mProject;
-
-        public CustomViewDescriptor(String name, String fqcn, AttributeDescriptor[] attributes,
-                AttributeDescriptor[] layoutAttributes,
-                ElementDescriptor[] children, IProject project,
-                Map<ResourceFile, Long> timestamps) {
-            super(
-                    fqcn, // xml name
-                    name, // ui name
-                    fqcn, // full class name
-                    fqcn, // tooltip
-                    null, // sdk_url
-                    attributes,
-                    layoutAttributes,
-                    children,
-                    false // mandatory
-            );
-            mTimeStamps = timestamps;
-            mProject = project;
-        }
-
-        @Override
-        public Image getGenericIcon() {
-            IconFactory iconFactory = IconFactory.getInstance();
-
-            int index = mXmlName.lastIndexOf('.');
-            if (index != -1) {
-                return iconFactory.getIcon(mXmlName.substring(index + 1),
-                        "customView"); //$NON-NLS-1$
-            }
-
-            return iconFactory.getIcon("customView"); //$NON-NLS-1$
-        }
-
-        @Override
-        public boolean syncAttributes() {
-            // Check if any of the descriptors
-            if (mTimeStamps != null) {
-                // Prevent checking actual file timestamps too frequently on rapid burst calls
-                long now = System.currentTimeMillis();
-                if (now - sLastCheck < 1000) {
-                    return true;
-                }
-                sLastCheck = now;
-
-                // Check whether the resource files (typically just one) which defined
-                // custom attributes for this custom view have changed, and if so,
-                // refresh the attribute descriptors.
-                // This doesn't work the cases where you add descriptors for a custom
-                // view after using it, or add attributes in a separate file, but those
-                // scenarios aren't quite as common (and would require a bit more expensive
-                // analysis.)
-                for (Map.Entry<ResourceFile, Long> entry : mTimeStamps.entrySet()) {
-                    ResourceFile file = entry.getKey();
-                    Long timestamp = entry.getValue();
-                    boolean recompute = false;
-                    if (file.getFile().getModificationStamp() > timestamp.longValue()) {
-                        // One or more attributes changed: recompute
-                        recompute = true;
-                        mParserCache.remove(file);
-                    }
-
-                    if (recompute) {
-                        IJavaProject javaProject = JavaCore.create(mProject);
-                        String fqcn = getFullClassName();
-                        IType type = null;
-                        try {
-                            type = javaProject.findType(fqcn);
-                        } catch (CoreException e) {
-                            AdtPlugin.log(e, null);
-                        }
-                        if (type == null || !type.exists()) {
-                            return true;
-                        }
-
-                        List<AttributeDescriptor> attrList = new ArrayList<AttributeDescriptor>();
-                        List<AttributeDescriptor> paramList = new ArrayList<AttributeDescriptor>();
-
-                        mTimeStamps = findCustomDescriptors(mProject, type, attrList, paramList);
-
-                        ViewElementDescriptor parentDescriptor = getSuperClassDesc();
-                        AttributeDescriptor[] attributes =
-                                getAttributeDescriptor(type, parentDescriptor);
-                        if (!attrList.isEmpty()) {
-                            attributes = join(attrList, attributes);
-                        }
-                        attributes = attrList.toArray(new AttributeDescriptor[attrList.size()]);
-                        setAttributes(attributes);
-
-                        return false;
-                    }
-                }
-            }
-
-            return true;
-        }
-    }
-
-    /** Timestamp of the most recent {@link CustomViewDescriptor#syncAttributes} check */
-    private static long sLastCheck;
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/descriptors/LayoutDescriptors.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/descriptors/LayoutDescriptors.java
deleted file mode 100644
index 7b2fe84..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/descriptors/LayoutDescriptors.java
+++ /dev/null
@@ -1,597 +0,0 @@
-/*
- * 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.editors.layout.descriptors;
-
-import static com.android.SdkConstants.ANDROID_URI;
-import static com.android.SdkConstants.ATTR_CLASS;
-import static com.android.SdkConstants.ATTR_LAYOUT;
-import static com.android.SdkConstants.ATTR_NAME;
-import static com.android.SdkConstants.ATTR_TAG;
-import static com.android.SdkConstants.CLASS_VIEW;
-import static com.android.SdkConstants.FQCN_GESTURE_OVERLAY_VIEW;
-import static com.android.SdkConstants.REQUEST_FOCUS;
-import static com.android.SdkConstants.VIEW_FRAGMENT;
-import static com.android.SdkConstants.VIEW_INCLUDE;
-import static com.android.SdkConstants.VIEW_MERGE;
-import static com.android.SdkConstants.VIEW_TAG;
-
-import com.android.SdkConstants;
-import com.android.ide.common.api.IAttributeInfo.Format;
-import com.android.ide.common.resources.platform.AttributeInfo;
-import com.android.ide.common.resources.platform.DeclareStyleableInfo;
-import com.android.ide.common.resources.platform.ViewClassInfo;
-import com.android.ide.common.resources.platform.ViewClassInfo.LayoutParamsInfo;
-import com.android.ide.eclipse.adt.internal.editors.descriptors.AttributeDescriptor;
-import com.android.ide.eclipse.adt.internal.editors.descriptors.DescriptorsUtils;
-import com.android.ide.eclipse.adt.internal.editors.descriptors.DocumentDescriptor;
-import com.android.ide.eclipse.adt.internal.editors.descriptors.ElementDescriptor;
-import com.android.ide.eclipse.adt.internal.editors.descriptors.IDescriptorProvider;
-import com.android.ide.eclipse.adt.internal.editors.descriptors.TextAttributeDescriptor;
-import com.android.ide.eclipse.adt.internal.editors.manifest.descriptors.ClassAttributeDescriptor;
-import com.android.sdklib.IAndroidTarget;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Map.Entry;
-
-
-/**
- * Complete description of the layout structure.
- */
-public final class LayoutDescriptors implements IDescriptorProvider {
-    /** The document descriptor. Contains all layouts and views linked together. */
-    private DocumentDescriptor mRootDescriptor =
-        new DocumentDescriptor("layout_doc", null); //$NON-NLS-1$
-
-    /** The list of all known ViewLayout descriptors. */
-    private List<ViewElementDescriptor> mLayoutDescriptors = Collections.emptyList();
-
-    /** Read-Only list of View Descriptors. */
-    private List<ViewElementDescriptor> mROLayoutDescriptors;
-
-    /** The list of all known View (not ViewLayout) descriptors. */
-    private List<ViewElementDescriptor> mViewDescriptors = Collections.emptyList();
-
-    /** Read-Only list of View Descriptors. */
-    private List<ViewElementDescriptor> mROViewDescriptors;
-
-    /** The descriptor matching android.view.View. */
-    private ViewElementDescriptor mBaseViewDescriptor;
-
-    /** Map from view full class name to view descriptor */
-    private Map<String, ViewElementDescriptor> mFqcnToDescriptor =
-        // As of 3.1 there are 58 items in this map
-        new HashMap<String, ViewElementDescriptor>(80);
-
-    /** Returns the document descriptor. Contains all layouts and views linked together. */
-    @Override
-    public DocumentDescriptor getDescriptor() {
-        return mRootDescriptor;
-    }
-
-    /** Returns the read-only list of all known ViewLayout descriptors. */
-    public List<ViewElementDescriptor> getLayoutDescriptors() {
-        return mROLayoutDescriptors;
-    }
-
-    /** Returns the read-only list of all known View (not ViewLayout) descriptors. */
-    public List<ViewElementDescriptor> getViewDescriptors() {
-        return mROViewDescriptors;
-    }
-
-    @Override
-    public ElementDescriptor[] getRootElementDescriptors() {
-        return mRootDescriptor.getChildren();
-    }
-
-    /**
-     * Returns the descriptor matching android.view.View, which is guaranteed
-     * to be a {@link ViewElementDescriptor}.
-     */
-    public ViewElementDescriptor getBaseViewDescriptor() {
-        if (mBaseViewDescriptor == null) {
-            mBaseViewDescriptor = findDescriptorByClass(SdkConstants.CLASS_VIEW);
-        }
-        return mBaseViewDescriptor;
-    }
-
-    /**
-     * Updates the document descriptor.
-     * <p/>
-     * It first computes the new children of the descriptor and then update them
-     * all at once.
-     * <p/>
-     *  TODO: differentiate groups from views in the tree UI? => rely on icons
-     * <p/>
-     *
-     * @param views The list of views in the framework.
-     * @param layouts The list of layouts in the framework.
-     * @param styleMap A map from style names to style information provided by the SDK
-     * @param target The android target being initialized
-     */
-    public synchronized void updateDescriptors(ViewClassInfo[] views, ViewClassInfo[] layouts,
-            Map<String, DeclareStyleableInfo> styleMap, IAndroidTarget target) {
-
-        // This map links every ViewClassInfo to the ElementDescriptor we created.
-        // It is filled by convertView() and used later to fix the super-class hierarchy.
-        HashMap<ViewClassInfo, ViewElementDescriptor> infoDescMap =
-            new HashMap<ViewClassInfo, ViewElementDescriptor>();
-
-        ArrayList<ViewElementDescriptor> newViews = new ArrayList<ViewElementDescriptor>(40);
-        if (views != null) {
-            for (ViewClassInfo info : views) {
-                ViewElementDescriptor desc = convertView(info, infoDescMap);
-                newViews.add(desc);
-                mFqcnToDescriptor.put(desc.getFullClassName(), desc);
-            }
-        }
-
-        // Create <include> as a synthetic regular view.
-        // Note: ViewStub is already described by attrs.xml
-        insertInclude(newViews);
-
-        List<ViewElementDescriptor> newLayouts = new ArrayList<ViewElementDescriptor>(30);
-        if (layouts != null) {
-            for (ViewClassInfo info : layouts) {
-                ViewElementDescriptor desc = convertView(info, infoDescMap);
-                newLayouts.add(desc);
-                mFqcnToDescriptor.put(desc.getFullClassName(), desc);
-            }
-        }
-
-        // Find View and inherit all its layout attributes
-        AttributeDescriptor[] frameLayoutAttrs = findViewLayoutAttributes(
-                SdkConstants.CLASS_FRAMELAYOUT);
-
-        if (target.getVersion().getApiLevel() >= 4) {
-            ViewElementDescriptor fragmentTag = createFragment(frameLayoutAttrs, styleMap);
-            newViews.add(fragmentTag);
-        }
-
-        List<ElementDescriptor> newDescriptors = new ArrayList<ElementDescriptor>(80);
-        newDescriptors.addAll(newLayouts);
-        newDescriptors.addAll(newViews);
-
-        ViewElementDescriptor viewTag = createViewTag(frameLayoutAttrs);
-        newViews.add(viewTag);
-        newDescriptors.add(viewTag);
-
-        ViewElementDescriptor requestFocus = createRequestFocus();
-        newViews.add(requestFocus);
-        newDescriptors.add(requestFocus);
-
-        // Link all layouts to everything else here.. recursively
-        for (ViewElementDescriptor layoutDesc : newLayouts) {
-            layoutDesc.setChildren(newDescriptors);
-        }
-
-        // The gesture overlay descriptor is really a layout but not included in the layouts list
-        // so handle it specially
-        ViewElementDescriptor gestureView = findDescriptorByClass(FQCN_GESTURE_OVERLAY_VIEW);
-        if (gestureView != null) {
-            gestureView.setChildren(newDescriptors);
-            // Inherit layout attributes from FrameLayout
-            gestureView.setLayoutAttributes(frameLayoutAttrs);
-        }
-
-        fixSuperClasses(infoDescMap);
-
-        // The <merge> tag can only be a root tag, so it is added at the end.
-        // It gets everything else as children but it is not made a child itself.
-        ViewElementDescriptor mergeTag = createMerge(frameLayoutAttrs);
-        mergeTag.setChildren(newDescriptors);  // mergeTag makes a copy of the list
-        newDescriptors.add(mergeTag);
-        newLayouts.add(mergeTag);
-
-        // Sort palette contents
-        Collections.sort(newViews);
-        Collections.sort(newLayouts);
-
-        mViewDescriptors = newViews;
-        mLayoutDescriptors  = newLayouts;
-        mRootDescriptor.setChildren(newDescriptors);
-
-        mBaseViewDescriptor = null;
-        mROLayoutDescriptors = Collections.unmodifiableList(mLayoutDescriptors);
-        mROViewDescriptors = Collections.unmodifiableList(mViewDescriptors);
-    }
-
-    /**
-     * Creates an element descriptor from a given {@link ViewClassInfo}.
-     *
-     * @param info The {@link ViewClassInfo} to convert into a new {@link ViewElementDescriptor}.
-     * @param infoDescMap This map links every ViewClassInfo to the ElementDescriptor it created.
-     *                    It is filled by here and used later to fix the super-class hierarchy.
-     */
-    private ViewElementDescriptor convertView(
-            ViewClassInfo info,
-            HashMap<ViewClassInfo, ViewElementDescriptor> infoDescMap) {
-        String xmlName = info.getShortClassName();
-        String uiName = xmlName;
-        String fqcn = info.getFullClassName();
-        if (ViewElementDescriptor.viewNeedsPackage(fqcn)) {
-            xmlName = fqcn;
-        }
-        String tooltip = info.getJavaDoc();
-
-        // Average is around 90, max (in 3.2) is 145
-        ArrayList<AttributeDescriptor> attributes = new ArrayList<AttributeDescriptor>(120);
-
-        // All views and groups have an implicit "style" attribute which is a reference.
-        AttributeInfo styleInfo = new AttributeInfo(
-                "style",    //$NON-NLS-1$ xmlLocalName
-                Format.REFERENCE_SET);
-        styleInfo.setJavaDoc("A reference to a custom style"); //tooltip
-        DescriptorsUtils.appendAttribute(attributes,
-                "style",    //$NON-NLS-1$
-                null,       //nsUri
-                styleInfo,
-                false,      //required
-                null);      // overrides
-        styleInfo.setDefinedBy(SdkConstants.CLASS_VIEW);
-
-        // Process all View attributes
-        DescriptorsUtils.appendAttributes(attributes,
-                null, // elementName
-                ANDROID_URI,
-                info.getAttributes(),
-                null, // requiredAttributes
-                null /* overrides */);
-
-        List<String> attributeSources = new ArrayList<String>();
-        if (info.getAttributes() != null && info.getAttributes().length > 0) {
-            attributeSources.add(fqcn);
-        }
-
-        for (ViewClassInfo link = info.getSuperClass();
-                link != null;
-                link = link.getSuperClass()) {
-            AttributeInfo[] attrList = link.getAttributes();
-            if (attrList.length > 0) {
-                attributeSources.add(link.getFullClassName());
-                DescriptorsUtils.appendAttributes(attributes,
-                        null, // elementName
-                        ANDROID_URI,
-                        attrList,
-                        null, // requiredAttributes
-                        null /* overrides */);
-            }
-        }
-
-        // Process all LayoutParams attributes
-        ArrayList<AttributeDescriptor> layoutAttributes = new ArrayList<AttributeDescriptor>();
-        LayoutParamsInfo layoutParams = info.getLayoutData();
-
-        for(; layoutParams != null; layoutParams = layoutParams.getSuperClass()) {
-            for (AttributeInfo attrInfo : layoutParams.getAttributes()) {
-                if (DescriptorsUtils.containsAttribute(layoutAttributes,
-                        ANDROID_URI, attrInfo)) {
-                    continue;
-                }
-                DescriptorsUtils.appendAttribute(layoutAttributes,
-                        null, // elementName
-                        ANDROID_URI,
-                        attrInfo,
-                        false, // required
-                        null /* overrides */);
-            }
-        }
-
-        ViewElementDescriptor desc = new ViewElementDescriptor(
-                xmlName,
-                uiName,
-                fqcn,
-                tooltip,
-                null, // sdk_url
-                attributes.toArray(new AttributeDescriptor[attributes.size()]),
-                layoutAttributes.toArray(new AttributeDescriptor[layoutAttributes.size()]),
-                null, // children
-                false /* mandatory */);
-        desc.setAttributeSources(Collections.unmodifiableList(attributeSources));
-        infoDescMap.put(info, desc);
-        return desc;
-    }
-
-    /**
-     * Creates a new {@code <include>} descriptor and adds it to the list of view descriptors.
-     *
-     * @param knownViews A list of view descriptors being populated. Also used to find the
-     *   View descriptor and extract its layout attributes.
-     */
-    private void insertInclude(List<ViewElementDescriptor> knownViews) {
-        String xmlName = VIEW_INCLUDE;
-
-        // Create the include custom attributes
-        ArrayList<AttributeDescriptor> attributes = new ArrayList<AttributeDescriptor>();
-
-        // Find View and inherit all its layout attributes
-        AttributeDescriptor[] viewLayoutAttribs;
-        AttributeDescriptor[] viewAttributes = null;
-        ViewElementDescriptor viewDesc = findDescriptorByClass(SdkConstants.CLASS_VIEW);
-        if (viewDesc != null) {
-            viewAttributes = viewDesc.getAttributes();
-            attributes = new ArrayList<AttributeDescriptor>(viewAttributes.length + 1);
-            viewLayoutAttribs = viewDesc.getLayoutAttributes();
-        } else {
-            viewLayoutAttribs = new AttributeDescriptor[0];
-        }
-
-        // Note that the "layout" attribute does NOT have the Android namespace
-        DescriptorsUtils.appendAttribute(attributes,
-                null, //elementXmlName
-                null, //nsUri
-                new AttributeInfo(
-                        ATTR_LAYOUT,
-                        Format.REFERENCE_SET ),
-                true,  //required
-                null); //overrides
-
-        if (viewAttributes != null) {
-            for (AttributeDescriptor descriptor : viewAttributes) {
-                attributes.add(descriptor);
-            }
-        }
-
-        // Create the include descriptor
-        ViewElementDescriptor desc = new ViewElementDescriptor(xmlName,
-                xmlName, // ui_name
-                VIEW_INCLUDE, // "class name"; the GLE only treats this as an element tag
-                "Lets you statically include XML layouts inside other XML layouts.",  // tooltip
-                null, // sdk_url
-                attributes.toArray(new AttributeDescriptor[attributes.size()]),
-                viewLayoutAttribs,  // layout attributes
-                null, // children
-                false /* mandatory */);
-
-        knownViews.add(desc);
-    }
-
-    /**
-     * Creates and returns a new {@code <merge>} descriptor.
-     * @param viewLayoutAttribs The layout attributes to use for the new descriptor
-     */
-    private ViewElementDescriptor createMerge(AttributeDescriptor[] viewLayoutAttribs) {
-        String xmlName = VIEW_MERGE;
-
-        // Create the include descriptor
-        ViewElementDescriptor desc = new ViewElementDescriptor(xmlName,
-                xmlName, // ui_name
-                VIEW_MERGE, // "class name"; the GLE only treats this as an element tag
-                "A root tag useful for XML layouts inflated using a ViewStub.",  // tooltip
-                null,  // sdk_url
-                null,  // attributes
-                viewLayoutAttribs,  // layout attributes
-                null,  // children
-                false  /* mandatory */);
-
-        return desc;
-    }
-
-    /**
-     * Creates and returns a new {@code <fragment>} descriptor.
-     * @param viewLayoutAttribs The layout attributes to use for the new descriptor
-     * @param styleMap The style map provided by the SDK
-     */
-    private ViewElementDescriptor createFragment(AttributeDescriptor[] viewLayoutAttribs,
-            Map<String, DeclareStyleableInfo> styleMap) {
-        String xmlName = VIEW_FRAGMENT;
-        final ViewElementDescriptor descriptor;
-
-        // First try to create the descriptor from metadata in attrs.xml:
-        DeclareStyleableInfo style = styleMap.get("Fragment"); //$NON-NLS-1$
-        String fragmentTooltip =
-            "A Fragment is a piece of an application's user interface or behavior that "
-            + "can be placed in an Activity";
-        String sdkUrl = "http://developer.android.com/guide/topics/fundamentals/fragments.html";
-        TextAttributeDescriptor classAttribute = new ClassAttributeDescriptor(
-                // Should accept both CLASS_V4_FRAGMENT and CLASS_FRAGMENT
-                null /*superClassName*/,
-                ATTR_CLASS, null /* namespace */,
-                new AttributeInfo(ATTR_CLASS, Format.STRING_SET),
-                true /*mandatory*/)
-                .setTooltip("Supply the name of the fragment class to instantiate");
-
-        if (style != null) {
-            descriptor = new ViewElementDescriptor(
-                    VIEW_FRAGMENT, VIEW_FRAGMENT, VIEW_FRAGMENT,
-                    fragmentTooltip,  // tooltip
-                    sdkUrl, //,
-                    null /* attributes */,
-                    viewLayoutAttribs, // layout attributes
-                    null /*childrenElements*/,
-                    false /*mandatory*/);
-            ArrayList<AttributeDescriptor> descs = new ArrayList<AttributeDescriptor>();
-            // The class attribute is not included in the attrs.xml
-            descs.add(classAttribute);
-            DescriptorsUtils.appendAttributes(descs,
-                    null,   // elementName
-                    ANDROID_URI,
-                    style.getAttributes(),
-                    null,   // requiredAttributes
-                    null);  // overrides
-            //descriptor.setTooltip(style.getJavaDoc());
-            descriptor.setAttributes(descs.toArray(new AttributeDescriptor[descs.size()]));
-        } else {
-            // The above will only work on API 11 and up. However, fragments are *also* available
-            // on older platforms, via the fragment support library, so add in a manual
-            // entry if necessary.
-            descriptor = new ViewElementDescriptor(xmlName,
-                xmlName, // ui_name
-                xmlName, // "class name"; the GLE only treats this as an element tag
-                fragmentTooltip,
-                sdkUrl,
-                new AttributeDescriptor[] {
-                    new ClassAttributeDescriptor(
-                            null /*superClassName*/,
-                            ATTR_NAME, ANDROID_URI,
-                            new AttributeInfo(ATTR_NAME, Format.STRING_SET),
-                            true /*mandatory*/)
-                            .setTooltip("Supply the name of the fragment class to instantiate"),
-                    classAttribute,
-                    new ClassAttributeDescriptor(
-                            null /*superClassName*/,
-                            ATTR_TAG, ANDROID_URI,
-                            new AttributeInfo(ATTR_TAG, Format.STRING_SET),
-                            true /*mandatory*/)
-                            .setTooltip("Supply a tag for the top-level view containing a String"),
-                }, // attributes
-                viewLayoutAttribs,  // layout attributes
-                null,  // children
-                false  /* mandatory */);
-        }
-
-        return descriptor;
-    }
-
-    /**
-     * Creates and returns a new {@code <view>} descriptor.
-     * @param viewLayoutAttribs The layout attributes to use for the new descriptor
-     * @param styleMap The style map provided by the SDK
-     */
-    private ViewElementDescriptor createViewTag(AttributeDescriptor[] viewLayoutAttribs) {
-        String xmlName = VIEW_TAG;
-
-        TextAttributeDescriptor classAttribute = new ClassAttributeDescriptor(
-                CLASS_VIEW,
-                ATTR_CLASS, null /* namespace */,
-                new AttributeInfo(ATTR_CLASS, Format.STRING_SET),
-                true /*mandatory*/)
-                .setTooltip("Supply the name of the view class to instantiate");
-
-        // Create the include descriptor
-        ViewElementDescriptor desc = new ViewElementDescriptor(xmlName,
-                xmlName, // ui_name
-                xmlName, // "class name"; the GLE only treats this as an element tag
-                "A view tag whose class attribute names the class to be instantiated", // tooltip
-                null,  // sdk_url
-                new AttributeDescriptor[] { // attributes
-                    classAttribute
-                },
-                viewLayoutAttribs,  // layout attributes
-                null,  // children
-                false  /* mandatory */);
-
-        return desc;
-    }
-
-    /**
-     * Creates and returns a new {@code <requestFocus>} descriptor.
-     */
-    private ViewElementDescriptor createRequestFocus() {
-        String xmlName = REQUEST_FOCUS;
-
-        // Create the include descriptor
-        return new ViewElementDescriptor(
-                xmlName,  // xml_name
-                xmlName, // ui_name
-                xmlName, // "class name"; the GLE only treats this as an element tag
-                "Requests focus for the parent element or one of its descendants", // tooltip
-                null,  // sdk_url
-                null,  // attributes
-                null,  // layout attributes
-                null,  // children
-                false  /* mandatory */);
-    }
-
-    /**
-     * Finds the descriptor and retrieves all its layout attributes.
-     */
-    private AttributeDescriptor[] findViewLayoutAttributes(
-            String viewFqcn) {
-        ViewElementDescriptor viewDesc = findDescriptorByClass(viewFqcn);
-        if (viewDesc != null) {
-            return viewDesc.getLayoutAttributes();
-        }
-
-        return null;
-    }
-
-    /**
-     * Set the super-class of each {@link ViewElementDescriptor} by using the super-class
-     * information available in the {@link ViewClassInfo}.
-     */
-    private void fixSuperClasses(Map<ViewClassInfo, ViewElementDescriptor> infoDescMap) {
-
-        for (Entry<ViewClassInfo, ViewElementDescriptor> entry : infoDescMap.entrySet()) {
-            ViewClassInfo info = entry.getKey();
-            ViewElementDescriptor desc = entry.getValue();
-
-            ViewClassInfo sup = info.getSuperClass();
-            if (sup != null) {
-                ViewElementDescriptor supDesc = infoDescMap.get(sup);
-                while (supDesc == null && sup != null) {
-                    // We don't have a descriptor for the super-class. That means the class is
-                    // probably abstract, so we just need to walk up the super-class chain till
-                    // we find one we have. All views derive from android.view.View so we should
-                    // surely find that eventually.
-                    sup = sup.getSuperClass();
-                    if (sup != null) {
-                        supDesc = infoDescMap.get(sup);
-                    }
-                }
-                if (supDesc != null) {
-                    desc.setSuperClass(supDesc);
-                }
-            }
-        }
-    }
-
-    /**
-     * Returns the {@link ViewElementDescriptor} with the given fully qualified class
-     * name, or null if not found. This is a quick map lookup.
-     *
-     * @param fqcn the fully qualified class name
-     * @return the corresponding {@link ViewElementDescriptor} or null
-     */
-    public ViewElementDescriptor findDescriptorByClass(String fqcn) {
-        return mFqcnToDescriptor.get(fqcn);
-    }
-
-    /**
-     * Returns the {@link ViewElementDescriptor} with the given XML tag name,
-     * which usually does not include the package (depending on the
-     * value of {@link ViewElementDescriptor#viewNeedsPackage(String)}).
-     *
-     * @param tag the XML tag name
-     * @return the corresponding {@link ViewElementDescriptor} or null
-     */
-    public ViewElementDescriptor findDescriptorByTag(String tag) {
-        // TODO: Consider whether we need to add a direct map lookup for this as well.
-        // Currently not done since this is not frequently needed (only needed for
-        // exploded rendering which was already performing list iteration.)
-        for (ViewElementDescriptor descriptor : mLayoutDescriptors) {
-            if (tag.equals(descriptor.getXmlLocalName())) {
-                return descriptor;
-            }
-        }
-
-        return null;
-    }
-
-    /**
-     * Returns a collection of all the view class names, including layouts
-     *
-     * @return a collection of all the view class names, never null
-     */
-    public Collection<String> getAllViewClassNames() {
-        return mFqcnToDescriptor.keySet();
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/descriptors/ViewElementDescriptor.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/descriptors/ViewElementDescriptor.java
deleted file mode 100644
index 7999524..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/descriptors/ViewElementDescriptor.java
+++ /dev/null
@@ -1,249 +0,0 @@
-/*
- * 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.editors.layout.descriptors;
-
-import static com.android.SdkConstants.ANDROID_VIEW_PKG;
-import static com.android.SdkConstants.ANDROID_WEBKIT_PKG;
-import static com.android.SdkConstants.ANDROID_WIDGET_PREFIX;
-import static com.android.SdkConstants.VIEW;
-import static com.android.SdkConstants.VIEW_TAG;
-
-import com.android.ide.common.resources.platform.AttributeInfo;
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.ide.eclipse.adt.internal.editors.IconFactory;
-import com.android.ide.eclipse.adt.internal.editors.descriptors.AttributeDescriptor;
-import com.android.ide.eclipse.adt.internal.editors.descriptors.ElementDescriptor;
-import com.android.ide.eclipse.adt.internal.editors.layout.uimodel.UiViewElementNode;
-import com.android.ide.eclipse.adt.internal.editors.uimodel.UiElementNode;
-
-import org.eclipse.swt.graphics.Image;
-
-import java.util.Collections;
-import java.util.List;
-
-/**
- * {@link ViewElementDescriptor} describes the properties expected for a given XML element node
- * representing a class in an XML Layout file.
- * <p/>
- * These descriptors describe Android views XML elements.
- * <p/>
- * The base class {@link ElementDescriptor} has a notion of "children", that is an XML element
- * can produce another set of XML elements. Because of the flat nature of Android's layout
- * XML files all possible views are children of the document and of themselves (that is any
- * view group can contain any other view). This is an implied contract of this class that is
- * enforces at construction by {@link LayoutDescriptors}. Note that by construction any code
- * that deals with the children hierarchy must also deal with potential infinite loops since views
- * <em>will</em> reference themselves (e.g. a ViewGroup can contain a ViewGroup).
- * <p/>
- * Since Views are also Java classes, they derive from each other. Here this is represented
- * as the "super class", which denotes the fact that a given View java class derives from
- * another class. These properties are also set at construction by {@link LayoutDescriptors}.
- * The super class hierarchy is very different from the descriptor's children hierarchy: the
- * later represents Java inheritance, the former represents an XML nesting capability.
- *
- * @see ElementDescriptor
- */
-public class ViewElementDescriptor extends ElementDescriptor {
-
-    /** The full class name (FQCN) of this view. */
-    private final String mFullClassName;
-
-    /** The list of layout attributes. Can be empty but not null. */
-    private AttributeDescriptor[] mLayoutAttributes;
-
-    /** The super-class descriptor. Can be null. */
-    private ViewElementDescriptor mSuperClassDesc;
-
-    /** List of attribute sources, classes that contribute attributes to {@link #mAttributes} */
-    private List<String> mAttributeSources;
-
-    /**
-     * Constructs a new {@link ViewElementDescriptor} based on its XML name, UI name,
-     * the canonical name of the class it represents, its tooltip, its SDK url, its attributes list,
-     * its children list and its mandatory flag.
-     *
-     * @param xml_name The XML element node name. Case sensitive.
-     * @param ui_name The XML element name for the user interface, typically capitalized.
-     * @param fullClassName The fully qualified class name the {@link ViewElementDescriptor} is
-     *          representing.
-     * @param tooltip An optional tooltip. Can be null or empty.
-     * @param sdk_url An optional SKD URL. Can be null or empty.
-     * @param attributes The list of allowed attributes. Can be null or empty.
-     * @param layoutAttributes The list of layout attributes. Can be null or empty.
-     * @param children The list of allowed children. Can be null or empty.
-     * @param mandatory Whether this node must always exist (even for empty models). A mandatory
-     *  UI node is never deleted and it may lack an actual XML node attached. A non-mandatory
-     *  UI node MUST have an XML node attached and it will cease to exist when the XML node
-     *  ceases to exist.
-     */
-    public ViewElementDescriptor(String xml_name, String ui_name,
-            String fullClassName,
-            String tooltip, String sdk_url,
-            AttributeDescriptor[] attributes, AttributeDescriptor[] layoutAttributes,
-            ElementDescriptor[] children, boolean mandatory) {
-        super(xml_name, ui_name, tooltip, sdk_url, attributes, children, mandatory);
-        mFullClassName = fullClassName;
-        mLayoutAttributes = layoutAttributes != null ? layoutAttributes : new AttributeDescriptor[0];
-    }
-
-    /**
-     * Constructs a new {@link ElementDescriptor} based on its XML name and on the canonical
-     * name of the class it represents.
-     * The UI name is build by capitalizing the XML name.
-     * The UI nodes will be non-mandatory.
-     *
-     * @param xml_name The XML element node name. Case sensitive.
-     * @param fullClassName The fully qualified class name the {@link ViewElementDescriptor} is
-     * representing.
-     */
-    public ViewElementDescriptor(String xml_name, String fullClassName) {
-        super(xml_name);
-        mFullClassName = fullClassName;
-        mLayoutAttributes = null;
-    }
-
-    /**
-     * Returns the fully qualified name of the View class represented by this element descriptor
-     * e.g. "android.view.View".
-     *
-     * @return the fully qualified class name, never null
-     */
-    public String getFullClassName() {
-        return mFullClassName;
-    }
-
-    /** Returns the list of layout attributes. Can be empty but not null.
-     *
-     * @return the list of layout attributes, never null
-     */
-    public AttributeDescriptor[] getLayoutAttributes() {
-        return mLayoutAttributes;
-    }
-
-    /**
-     * Sets the list of layout attribute attributes.
-     *
-     * @param attributes the new layout attributes, not null
-     */
-    public void setLayoutAttributes(AttributeDescriptor[] attributes) {
-        assert attributes != null;
-        mLayoutAttributes = attributes;
-    }
-
-    /**
-     * Returns a new {@link UiViewElementNode} linked to this descriptor.
-     */
-    @Override
-    public UiElementNode createUiNode() {
-        return new UiViewElementNode(this);
-    }
-
-    /**
-     * Returns the {@link ViewElementDescriptor} of the super-class of this View descriptor
-     * that matches the java View hierarchy. Can be null.
-     *
-     * @return the super class' descriptor or null
-     */
-    public ViewElementDescriptor getSuperClassDesc() {
-        return mSuperClassDesc;
-    }
-
-    /**
-     * Sets the {@link ViewElementDescriptor} of the super-class of this View descriptor
-     * that matches the java View hierarchy. Can be null.
-     *
-     * @param superClassDesc the descriptor for the super class, or null
-     */
-    public void setSuperClass(ViewElementDescriptor superClassDesc) {
-        mSuperClassDesc = superClassDesc;
-    }
-
-    /**
-     * Returns an optional icon for the element.
-     * <p/>
-     * By default this tries to return an icon based on the XML name of the element.
-     * If this fails, it tries to return the default element icon as defined in the
-     * plugin. If all fails, it returns null.
-     *
-     * @return An icon for this element or null.
-     */
-    @Override
-    public Image getGenericIcon() {
-        IconFactory factory = IconFactory.getInstance();
-        String name = mXmlName;
-        if (name.indexOf('.') != -1) {
-            // If the user uses a fully qualified name, such as
-            // "android.gesture.GestureOverlayView" in their XML, we need to look up
-            // only by basename
-            name = name.substring(name.lastIndexOf('.') + 1);
-        } else if (VIEW_TAG.equals(name)) {
-            // Can't have both view.png and View.png; issues on case sensitive vs
-            // case insensitive file systems
-            name = VIEW;
-        }
-
-        Image icon = factory.getIcon(name);
-        if (icon == null) {
-            icon = AdtPlugin.getAndroidLogo();
-        }
-
-        return icon;
-    }
-
-    /**
-     * Returns the list of attribute sources for the attributes provided by this
-     * descriptor. An attribute source is the fully qualified class name of the
-     * defining class for some of the properties. The specific attribute source
-     * of a given {@link AttributeInfo} can be found by calling
-     * {@link AttributeInfo#getDefinedBy()}.
-     * <p>
-     * The attribute sources are ordered from class to super class.
-     * <p>
-     * The list may <b>not</b> be modified by clients.
-     *
-     * @return a non null list of attribute sources for this view
-     */
-    public List<String> getAttributeSources() {
-        return mAttributeSources != null ? mAttributeSources : Collections.<String>emptyList();
-    }
-
-    /**
-     * Sets the attribute sources for this view. See {@link #getAttributes()}
-     * for details.
-     *
-     * @param attributeSources a non null list of attribute sources for this
-     *            view descriptor
-     * @see #getAttributeSources()
-     */
-    public void setAttributeSources(List<String> attributeSources) {
-        mAttributeSources = attributeSources;
-    }
-
-    /**
-     * Returns true if views with the given fully qualified class name need to include
-     * their package in the layout XML tag
-     *
-     * @param fqcn the fully qualified class name, such as android.widget.Button
-     * @return true if the full package path should be included in the layout XML element
-     *         tag
-     */
-    public static boolean viewNeedsPackage(String fqcn) {
-        return !(fqcn.startsWith(ANDROID_WIDGET_PREFIX)
-              || fqcn.startsWith(ANDROID_VIEW_PKG)
-              || fqcn.startsWith(ANDROID_WEBKIT_PKG));
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/AccordionControl.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/AccordionControl.java
deleted file mode 100644
index b3dce07..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/AccordionControl.java
+++ /dev/null
@@ -1,396 +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.eclipse.adt.internal.editors.layout.gle2;
-
-import com.android.ide.eclipse.adt.internal.editors.IconFactory;
-
-import org.eclipse.jface.resource.JFaceResources;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.CLabel;
-import org.eclipse.swt.custom.ScrolledComposite;
-import org.eclipse.swt.events.ControlAdapter;
-import org.eclipse.swt.events.ControlEvent;
-import org.eclipse.swt.events.MouseAdapter;
-import org.eclipse.swt.events.MouseEvent;
-import org.eclipse.swt.events.MouseTrackListener;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.graphics.Rectangle;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.layout.RowLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.ScrollBar;
-
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-/**
- * The accordion control allows a series of labels with associated content that can be
- * shown. For more details on accordions, see http://en.wikipedia.org/wiki/Accordion_(GUI)
- * <p>
- * This control allows the children to be created lazily. You can also customize the
- * composite which is created to hold the children items, to for example allow multiple
- * columns of items rather than just the default vertical stack.
- * <p>
- * The visual appearance of the headers is built in; it uses a mild gradient, with a
- * heavier gradient during mouse-overs. It also uses a bold label along with the eclipse
- * folder icons.
- * <p>
- * The control can be configured to enforce a single category open at any time (the
- * default), or allowing multiple categories open (where they share the available space).
- * The control can also be configured to fill the available vertical space for the open
- * category/categories.
- */
-public abstract class AccordionControl extends Composite {
-    /** Pixel spacing between header items */
-    private static final int HEADER_SPACING = 0;
-
-    /** Pixel spacing between items in the content area */
-    private static final int ITEM_SPACING = 0;
-
-    private static final String KEY_CONTENT = "content"; //$NON-NLS-1$
-    private static final String KEY_HEADER = "header"; //$NON-NLS-1$
-
-    private Image mClosed;
-    private Image mOpen;
-    private boolean mSingle = true;
-    private boolean mWrap;
-
-    /**
-     * Creates the container which will hold the items in a category; this can be
-     * overridden to lay out the children with a different layout than the default
-     * vertical RowLayout
-     */
-    protected Composite createChildContainer(Composite parent, Object header, int style) {
-        Composite composite = new Composite(parent, style);
-        if (mWrap) {
-            RowLayout layout = new RowLayout(SWT.HORIZONTAL);
-            layout.center = true;
-            composite.setLayout(layout);
-        } else {
-            RowLayout layout = new RowLayout(SWT.VERTICAL);
-            layout.spacing = ITEM_SPACING;
-            layout.marginHeight = 0;
-            layout.marginWidth = 0;
-            layout.marginLeft = 0;
-            layout.marginTop = 0;
-            layout.marginRight = 0;
-            layout.marginBottom = 0;
-            composite.setLayout(layout);
-        }
-
-        // TODO - maybe do multi-column arrangement for simple nodes
-        return composite;
-    }
-
-    /**
-     * Creates the children under a particular header
-     *
-     * @param parent the parent composite to add the SWT items to
-     * @param header the header object that is being opened for the first time
-     */
-    protected abstract void createChildren(Composite parent, Object header);
-
-    /**
-     * Set whether a single category should be enforced or not (default=true)
-     *
-     * @param single if true, enforce a single category open at a time
-     */
-    public void setAutoClose(boolean single) {
-        mSingle = single;
-    }
-
-    /**
-     * Returns whether a single category should be enforced or not (default=true)
-     *
-     * @return true if only a single category can be open at a time
-     */
-    public boolean isAutoClose() {
-        return mSingle;
-    }
-
-    /**
-     * Returns the labels used as header categories
-     *
-     * @return list of header labels
-     */
-    public List<CLabel> getHeaderLabels() {
-        List<CLabel> headers = new ArrayList<CLabel>();
-        for (Control c : getChildren()) {
-            if (c instanceof CLabel) {
-                headers.add((CLabel) c);
-            }
-        }
-
-        return headers;
-    }
-
-    /**
-     * Show all categories
-     *
-     * @param performLayout if true, call {@link #layout} and {@link #pack} when done
-     */
-    public void expandAll(boolean performLayout) {
-        for (Control c : getChildren()) {
-            if (c instanceof CLabel) {
-                if (!isOpen(c)) {
-                    toggle((CLabel) c, false, false);
-                }
-            }
-        }
-        if (performLayout) {
-            pack();
-            layout();
-        }
-    }
-
-    /**
-     * Hide all categories
-     *
-     * @param performLayout if true, call {@link #layout} and {@link #pack} when done
-     */
-    public void collapseAll(boolean performLayout) {
-        for (Control c : getChildren()) {
-            if (c instanceof CLabel) {
-                if (isOpen(c)) {
-                    toggle((CLabel) c, false, false);
-                }
-            }
-        }
-        if (performLayout) {
-            layout();
-        }
-    }
-
-    /**
-     * Create the composite.
-     *
-     * @param parent the parent widget to add the accordion to
-     * @param style the SWT style mask to use
-     * @param headers a list of headers, whose {@link Object#toString} method should
-     *            produce the heading label
-     * @param greedy if true, grow vertically as much as possible
-     * @param wrapChildren if true, configure the child area to be horizontally laid out
-     *            with wrapping
-     * @param expand Set of headers to expand initially
-     */
-    public AccordionControl(Composite parent, int style, List<?> headers,
-            boolean greedy, boolean wrapChildren, Set<String> expand) {
-        super(parent, style);
-        mWrap = wrapChildren;
-
-        GridLayout gridLayout = new GridLayout(1, false);
-        gridLayout.verticalSpacing = HEADER_SPACING;
-        gridLayout.horizontalSpacing = 0;
-        gridLayout.marginWidth = 0;
-        gridLayout.marginHeight = 0;
-        setLayout(gridLayout);
-
-        Font labelFont = null;
-
-        mOpen = IconFactory.getInstance().getIcon("open-folder");     //$NON-NLS-1$
-        mClosed = IconFactory.getInstance().getIcon("closed-folder"); //$NON-NLS-1$
-        List<CLabel> expandLabels = new ArrayList<CLabel>();
-
-        for (Object header : headers) {
-            final CLabel label = new CLabel(this, SWT.SHADOW_OUT);
-            label.setText(header.toString().replace("&", "&&")); //$NON-NLS-1$ //$NON-NLS-2$
-            updateBackground(label, false);
-            if (labelFont == null) {
-                labelFont = JFaceResources.getFontRegistry().getBold(JFaceResources.DEFAULT_FONT);
-            }
-            label.setFont(labelFont);
-            label.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
-            setHeader(header, label);
-            label.addMouseListener(new MouseAdapter() {
-                @Override
-                public void mouseUp(MouseEvent e) {
-                    if (e.button == 1 && (e.stateMask & SWT.MODIFIER_MASK) == 0) {
-                        toggle(label, true, mSingle);
-                    }
-                }
-            });
-            label.addMouseTrackListener(new MouseTrackListener() {
-                @Override
-                public void mouseEnter(MouseEvent e) {
-                    updateBackground(label, true);
-                }
-
-                @Override
-                public void mouseExit(MouseEvent e) {
-                    updateBackground(label, false);
-                }
-
-                @Override
-                public void mouseHover(MouseEvent e) {
-                }
-            });
-
-            // Turn off border?
-            final ScrolledComposite scrolledComposite = new ScrolledComposite(this, SWT.V_SCROLL);
-            ScrollBar verticalBar = scrolledComposite.getVerticalBar();
-            verticalBar.setIncrement(20);
-            verticalBar.setPageIncrement(100);
-
-            // Do we need the scrolled composite or can we just look at the next
-            // wizard in the hierarchy?
-
-            setContentArea(label, scrolledComposite);
-            scrolledComposite.setExpandHorizontal(true);
-            scrolledComposite.setExpandVertical(true);
-            GridData scrollGridData = new GridData(SWT.FILL,
-                    greedy ? SWT.FILL : SWT.TOP, false, greedy, 1, 1);
-            scrollGridData.exclude = true;
-            scrollGridData.grabExcessHorizontalSpace = wrapChildren;
-            scrolledComposite.setLayoutData(scrollGridData);
-
-            if (wrapChildren) {
-                scrolledComposite.addControlListener(new ControlAdapter() {
-                    @Override
-                    public void controlResized(ControlEvent e) {
-                        Rectangle r = scrolledComposite.getClientArea();
-                        Control content = scrolledComposite.getContent();
-                        if (content != null && r != null) {
-                            Point minSize = content.computeSize(r.width, SWT.DEFAULT);
-                            scrolledComposite.setMinSize(minSize);
-                            ScrollBar vBar = scrolledComposite.getVerticalBar();
-                            vBar.setPageIncrement(r.height);
-                        }
-                    }
-                  });
-            }
-
-            updateIcon(label);
-            if (expand != null && expand.contains(label.getText())) {
-                // Comparing "label.getText()" rather than "header" because we make some
-                // tweaks to the label (replacing & with && etc) and in the getExpandedCategories
-                // method we return the label texts
-                expandLabels.add(label);
-            }
-        }
-
-        // Expand the requested categories
-        for (CLabel label : expandLabels) {
-            toggle(label, false, false);
-        }
-    }
-
-    /** Updates the background gradient of the given header label */
-    private void updateBackground(CLabel label, boolean mouseOver) {
-        Display display = label.getDisplay();
-        label.setBackground(new Color[] {
-                display.getSystemColor(SWT.COLOR_WIDGET_HIGHLIGHT_SHADOW),
-                display.getSystemColor(SWT.COLOR_WIDGET_BACKGROUND),
-                display.getSystemColor(SWT.COLOR_WIDGET_LIGHT_SHADOW)
-        }, new int[] {
-                mouseOver ? 60 : 40, 100
-        }, true);
-    }
-
-    /**
-     * Updates the icon for a header label to be open/close based on the {@link #isOpen}
-     * state
-     */
-    private void updateIcon(CLabel label) {
-        label.setImage(isOpen(label) ? mOpen : mClosed);
-    }
-
-    /** Returns true if the content area for the given label is open/showing */
-    private boolean isOpen(Control label) {
-        return !((GridData) getContentArea(label).getLayoutData()).exclude;
-    }
-
-    /** Toggles the visibility of the children of the given label */
-    private void toggle(CLabel label, boolean performLayout, boolean autoClose) {
-        if (autoClose) {
-            collapseAll(true);
-        }
-        ScrolledComposite scrolledComposite = getContentArea(label);
-
-        GridData scrollGridData = (GridData) scrolledComposite.getLayoutData();
-        boolean close = !scrollGridData.exclude;
-        scrollGridData.exclude = close;
-        scrolledComposite.setVisible(!close);
-        updateIcon(label);
-
-        if (!scrollGridData.exclude && scrolledComposite.getContent() == null) {
-            Object header = getHeader(label);
-            Composite composite = createChildContainer(scrolledComposite, header, SWT.NONE);
-            createChildren(composite, header);
-            while (composite.getParent() != scrolledComposite) {
-                composite = composite.getParent();
-            }
-            scrolledComposite.setContent(composite);
-            scrolledComposite.setMinSize(composite.computeSize(SWT.DEFAULT, SWT.DEFAULT));
-        }
-
-        if (performLayout) {
-            layout(true);
-        }
-    }
-
-    /** Returns the header object for the given header label */
-    private Object getHeader(Control label) {
-        return label.getData(KEY_HEADER);
-    }
-
-    /** Sets the header object for the given header label */
-    private void setHeader(Object header, final CLabel label) {
-        label.setData(KEY_HEADER, header);
-    }
-
-    /** Returns the content area for the given header label */
-    private ScrolledComposite getContentArea(Control label) {
-        return (ScrolledComposite) label.getData(KEY_CONTENT);
-    }
-
-    /** Sets the content area for the given header label */
-    private void setContentArea(final CLabel label, ScrolledComposite scrolledComposite) {
-        label.setData(KEY_CONTENT, scrolledComposite);
-    }
-
-    @Override
-    protected void checkSubclass() {
-        // Disable the check that prevents subclassing of SWT components
-    }
-
-    /**
-     * Returns the set of expanded categories in the palette. Note: Header labels will have
-     * escaped ampersand characters with double ampersands.
-     *
-     * @return the set of expanded categories in the palette - never null
-     */
-    public Set<String> getExpandedCategories() {
-        Set<String> expanded = new HashSet<String>();
-        for (Control c : getChildren()) {
-            if (c instanceof CLabel) {
-                if (isOpen(c)) {
-                    expanded.add(((CLabel) c).getText());
-                }
-            }
-        }
-
-        return expanded;
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/BinPacker.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/BinPacker.java
deleted file mode 100644
index 9fc2e09..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/BinPacker.java
+++ /dev/null
@@ -1,352 +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.ide.eclipse.adt.internal.editors.layout.gle2;
-
-import com.android.annotations.Nullable;
-import com.android.ide.common.api.Rect;
-
-import java.awt.Color;
-import java.awt.Graphics2D;
-import java.awt.image.BufferedImage;
-import java.io.File;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-
-import javax.imageio.ImageIO;
-
-/**
- * This class implements 2D bin packing: packing rectangles into a given area as
- * tightly as "possible" (bin packing in general is NP hard, so this class uses
- * heuristics).
- * <p>
- * The algorithm implemented is to keep a set of (possibly overlapping)
- * available areas for placement. For each newly inserted rectangle, we first
- * pick which available space to occupy, and we then subdivide the
- * current rectangle into all the possible remaining unoccupied sub-rectangles.
- * We also remove any other space rectangles which are no longer eligible if
- * they are intersecting the newly placed rectangle.
- * <p>
- * This algorithm is not very fast, so should not be used for a large number of
- * rectangles.
- */
-class BinPacker {
-    /**
-     * When enabled, the successive passes are dumped as PNG images showing the
-     * various available and occupied rectangles)
-     */
-    private static final boolean DEBUG = false;
-
-    private final List<Rect> mSpace = new ArrayList<Rect>();
-    private final int mMinHeight;
-    private final int mMinWidth;
-
-    /**
-     * Creates a new {@linkplain BinPacker}. To use it, first add one or more
-     * initial available space rectangles with {@link #addSpace(Rect)}, and then
-     * place the rectangles with {@link #occupy(int, int)}. The returned
-     * {@link Rect} from {@link #occupy(int, int)} gives the coordinates of the
-     * positioned rectangle.
-     *
-     * @param minWidth the smallest width of any rectangle placed into this bin
-     * @param minHeight the smallest height of any rectangle placed into this bin
-     */
-    BinPacker(int minWidth, int minHeight) {
-        mMinWidth = minWidth;
-        mMinHeight = minHeight;
-
-        if (DEBUG) {
-            mAllocated = new ArrayList<Rect>();
-            sLayoutId++;
-            sRectId = 1;
-        }
-    }
-
-    /** Adds more available space */
-    void addSpace(Rect rect) {
-        if (rect.w >= mMinWidth && rect.h >= mMinHeight) {
-            mSpace.add(rect);
-        }
-    }
-
-    /** Attempts to place a rectangle of the given dimensions, if possible */
-    @Nullable
-    Rect occupy(int width, int height) {
-        int index = findBest(width, height);
-        if (index == -1) {
-            return null;
-        }
-
-        return split(index, width, height);
-    }
-
-    /**
-     * Finds the best available space rectangle to position a new rectangle of
-     * the given size in.
-     */
-    private int findBest(int width, int height) {
-        if (mSpace.isEmpty()) {
-            return -1;
-        }
-
-        // Try to pack as far up as possible first
-        int bestIndex = -1;
-        boolean multipleAtSameY = false;
-        int minY = Integer.MAX_VALUE;
-        for (int i = 0, n = mSpace.size(); i < n; i++) {
-            Rect rect = mSpace.get(i);
-            if (rect.y <= minY) {
-                if (rect.w >= width && rect.h >= height) {
-                    if (rect.y < minY) {
-                        minY = rect.y;
-                        multipleAtSameY = false;
-                        bestIndex = i;
-                    } else if (minY == rect.y) {
-                        multipleAtSameY = true;
-                    }
-                }
-            }
-        }
-
-        if (!multipleAtSameY) {
-            return bestIndex;
-        }
-
-        bestIndex = -1;
-
-        // Pick a rectangle. This currently tries to find the rectangle whose shortest
-        // side most closely matches the placed rectangle's size.
-        // Attempt to find the best short side fit
-        int bestShortDistance = Integer.MAX_VALUE;
-        int bestLongDistance = Integer.MAX_VALUE;
-
-        for (int i = 0, n = mSpace.size(); i < n; i++) {
-            Rect rect = mSpace.get(i);
-            if (rect.y != minY) { // Only comparing elements at same y
-                continue;
-            }
-            if (rect.w >= width && rect.h >= height) {
-                if (width < height) {
-                    int distance = rect.w - width;
-                    if (distance < bestShortDistance ||
-                            distance == bestShortDistance &&
-                            (rect.h - height) < bestLongDistance) {
-                        bestShortDistance = distance;
-                        bestLongDistance = rect.h - height;
-                        bestIndex = i;
-                    }
-                } else {
-                    int distance = rect.w - width;
-                    if (distance < bestShortDistance ||
-                            distance == bestShortDistance &&
-                            (rect.h - height) < bestLongDistance) {
-                        bestShortDistance = distance;
-                        bestLongDistance = rect.h - height;
-                        bestIndex = i;
-                    }
-                }
-            }
-        }
-
-        return bestIndex;
-    }
-
-    /**
-     * Removes the rectangle at the given index. Since the rectangles are in an
-     * {@link ArrayList}, removing a rectangle in the normal way is slow (it
-     * would involve shifting all elements), but since we don't care about
-     * order, this always swaps the to-be-deleted element to the last position
-     * in the array first, <b>then</b> it deletes it (which should be
-     * immediate).
-     *
-     * @param index the index in the {@link #mSpace} list to remove a rectangle
-     *            from
-     */
-    private void removeRect(int index) {
-        assert !mSpace.isEmpty();
-        int lastIndex = mSpace.size() - 1;
-        if (index != lastIndex) {
-            // Swap before remove to make deletion faster since we don't
-            // care about order
-            Rect temp = mSpace.get(index);
-            mSpace.set(index, mSpace.get(lastIndex));
-            mSpace.set(lastIndex, temp);
-        }
-
-        mSpace.remove(lastIndex);
-    }
-
-    /**
-     * Splits the rectangle at the given rectangle index such that it can contain
-     * a rectangle of the given width and height. */
-    private Rect split(int index, int width, int height) {
-        Rect rect = mSpace.get(index);
-        assert rect.w >= width && rect.h >= height : rect;
-
-        Rect r = new Rect(rect);
-        r.w = width;
-        r.h = height;
-
-        // Remove all rectangles that intersect my rectangle
-        for (int i = 0; i < mSpace.size(); i++) {
-            Rect other = mSpace.get(i);
-            if (other.intersects(r)) {
-                removeRect(i);
-                i--;
-            }
-        }
-
-
-        // Split along vertical line x = rect.x + width:
-        // (rect.x,rect.y)
-        //     +-------------+-------------------------+
-        //     |             |                         |
-        //     |             |                         |
-        //     |             | height                  |
-        //     |             |                         |
-        //     |             |                         |
-        //     +-------------+           B             | rect.h
-        //     |   width                               |
-        //     |             |                         |
-        //     |      A                                |
-        //     |             |                         |
-        //     |                                       |
-        //     +---------------------------------------+
-        //                    rect.w
-        int remainingHeight = rect.h - height;
-        int remainingWidth = rect.w - width;
-        if (remainingHeight >= mMinHeight) {
-            mSpace.add(new Rect(rect.x, rect.y + height, width, remainingHeight));
-        }
-        if (remainingWidth >= mMinWidth) {
-            mSpace.add(new Rect(rect.x + width, rect.y, remainingWidth, rect.h));
-        }
-
-        // Split along horizontal line y = rect.y + height:
-        //     +-------------+-------------------------+
-        //     |             |                         |
-        //     |             | height                  |
-        //     |             |          A              |
-        //     |             |                         |
-        //     |             |                         | rect.h
-        //     +-------------+ - - - - - - - - - - - - |
-        //     |  width                                |
-        //     |                                       |
-        //     |                B                      |
-        //     |                                       |
-        //     |                                       |
-        //     +---------------------------------------+
-        //                   rect.w
-        if (remainingHeight >= mMinHeight) {
-            mSpace.add(new Rect(rect.x, rect.y + height, rect.w, remainingHeight));
-        }
-        if (remainingWidth >= mMinWidth) {
-            mSpace.add(new Rect(rect.x + width, rect.y, remainingWidth, height));
-        }
-
-        // Remove redundant rectangles. This is not very efficient.
-        for (int i = 0; i < mSpace.size() - 1; i++) {
-            for (int j = i + 1; j < mSpace.size(); j++) {
-                Rect iRect = mSpace.get(i);
-                Rect jRect = mSpace.get(j);
-                if (jRect.contains(iRect)) {
-                    removeRect(i);
-                    i--;
-                    break;
-                }
-                if (iRect.contains(jRect)) {
-                    removeRect(j);
-                    j--;
-                }
-            }
-        }
-
-        if (DEBUG) {
-            mAllocated.add(r);
-            dumpImage();
-        }
-
-        return r;
-    }
-
-    // DEBUGGING CODE: Enable with DEBUG
-
-    private List<Rect> mAllocated;
-    private static int sLayoutId;
-    private static int sRectId;
-    private void dumpImage() {
-        if (DEBUG) {
-            int width = 100;
-            int height = 100;
-            for (Rect rect : mSpace) {
-                width = Math.max(width, rect.w);
-                height = Math.max(height, rect.h);
-            }
-            width += 10;
-            height += 10;
-
-            BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
-            Graphics2D g = image.createGraphics();
-            g.setColor(Color.BLACK);
-            g.fillRect(0, 0, image.getWidth(), image.getHeight());
-
-            Color[] colors = new Color[] {
-                    Color.blue, Color.cyan,
-                    Color.green, Color.magenta, Color.orange,
-                    Color.pink, Color.red, Color.white, Color.yellow, Color.darkGray,
-                    Color.lightGray, Color.gray,
-            };
-
-            char allocated = 'A';
-            for (Rect rect : mAllocated) {
-                Color color = new Color(0x9FFFFFFF, true);
-                g.setColor(color);
-                g.setBackground(color);
-                g.fillRect(rect.x, rect.y, rect.w, rect.h);
-                g.setColor(Color.WHITE);
-                g.drawRect(rect.x, rect.y, rect.w, rect.h);
-                g.drawString("" + (allocated++),
-                        rect.x + rect.w / 2, rect.y + rect.h / 2);
-            }
-
-            int colorIndex = 0;
-            for (Rect rect : mSpace) {
-                Color color = colors[colorIndex];
-                colorIndex = (colorIndex + 1) % colors.length;
-
-                color = new Color(color.getRed(), color.getGreen(), color.getBlue(), 128);
-                g.setColor(color);
-
-                g.fillRect(rect.x, rect.y, rect.w, rect.h);
-                g.setColor(Color.WHITE);
-                g.drawString(Integer.toString(colorIndex),
-                        rect.x + rect.w / 2, rect.y + rect.h / 2);
-            }
-
-
-            g.dispose();
-
-            File file = new File("/tmp/layout" + sLayoutId + "_pass" + sRectId + ".png");
-            try {
-                ImageIO.write(image, "PNG", file);
-                System.out.println("Wrote diagnostics image " + file);
-            } catch (IOException e) {
-                e.printStackTrace();
-            }
-            sRectId++;
-        }
-    }
-}
\ No newline at end of file
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/CanvasAlternateSelection.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/CanvasAlternateSelection.java
deleted file mode 100644
index c04061c..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/CanvasAlternateSelection.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * Copyright (C) 2009 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.editors.layout.gle2;
-
-import java.util.List;
-
-/**
- * Information for the current alternate selection, i.e. the possible selected items
- * that are located at the same x/y as the original view, either sibling or parents.
- */
-/* package */ class CanvasAlternateSelection {
-    private final CanvasViewInfo mOriginatingView;
-    private final List<CanvasViewInfo> mAltViews;
-    private int mIndex;
-
-    /**
-     * Creates a new alternate selection based on the given originating view and the
-     * given list of alternate views. Both cannot be null.
-     */
-    public CanvasAlternateSelection(CanvasViewInfo originatingView, List<CanvasViewInfo> altViews) {
-        assert originatingView != null;
-        assert altViews != null;
-        mOriginatingView = originatingView;
-        mAltViews = altViews;
-        mIndex = altViews.size() - 1;
-    }
-
-    /** Returns the list of alternate views. Cannot be null. */
-    public List<CanvasViewInfo> getAltViews() {
-        return mAltViews;
-    }
-
-    /** Returns the originating view. Cannot be null. */
-    public CanvasViewInfo getOriginatingView() {
-        return mOriginatingView;
-    }
-
-    /**
-     * Returns the current alternate view to select.
-     * Initially this is the top-most view.
-     */
-    public CanvasViewInfo getCurrent() {
-        return mIndex >= 0 ? mAltViews.get(mIndex) : null;
-    }
-
-    /**
-     * Changes the current view to be the next one and then returns it.
-     * This loops through the alternate views.
-     */
-    public CanvasViewInfo getNext() {
-        if (mIndex == 0) {
-            mIndex = mAltViews.size() - 1;
-        } else if (mIndex > 0) {
-            mIndex--;
-        }
-
-        return getCurrent();
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/CanvasTransform.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/CanvasTransform.java
deleted file mode 100644
index ad5bd52..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/CanvasTransform.java
+++ /dev/null
@@ -1,215 +0,0 @@
-/*
- * Copyright (C) 2009 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.editors.layout.gle2;
-
-import static com.android.ide.eclipse.adt.internal.editors.layout.gle2.ImageUtils.SHADOW_SIZE;
-
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.widgets.ScrollBar;
-
-/**
- * Helper class to convert between control pixel coordinates and canvas coordinates.
- * Takes care of the zooming and offset of the canvas.
- */
-public class CanvasTransform {
-    /**
-     * Default margin around the rendered image, reduced
-     * when the contents do not fit.
-     */
-    public static final int DEFAULT_MARGIN = 25;
-
-    /**
-     * The canvas which controls the zooming.
-     */
-    private final LayoutCanvas mCanvas;
-
-    /** Canvas image size (original, before zoom), in pixels. */
-    private int mImgSize;
-
-    /** Full size being scrolled (after zoom), in pixels */
-    private int mFullSize;;
-
-    /** Client size, in pixels. */
-    private int mClientSize;
-
-    /** Left-top offset in client pixel coordinates. */
-    private int mTranslate;
-
-    /** Current margin */
-    private int mMargin = DEFAULT_MARGIN;
-
-    /** Scaling factor, > 0. */
-    private double mScale;
-
-    /** Scrollbar widget. */
-    private ScrollBar mScrollbar;
-
-    public CanvasTransform(LayoutCanvas layoutCanvas, ScrollBar scrollbar) {
-        mCanvas = layoutCanvas;
-        mScrollbar = scrollbar;
-        mScale = 1.0;
-        mTranslate = 0;
-
-        mScrollbar.addSelectionListener(new SelectionAdapter() {
-            @Override
-            public void widgetSelected(SelectionEvent e) {
-                // User requested scrolling. Changes translation and redraw canvas.
-                mTranslate = mScrollbar.getSelection();
-                CanvasTransform.this.mCanvas.redraw();
-            }
-        });
-        mScrollbar.setIncrement(20);
-    }
-
-    /**
-     * Sets the new scaling factor. Recomputes scrollbars.
-     * @param scale Scaling factor, > 0.
-     */
-    public void setScale(double scale) {
-        if (mScale != scale) {
-            mScale = scale;
-            resizeScrollbar();
-        }
-    }
-
-    /** Recomputes the scrollbar and view port settings */
-    public void refresh() {
-        resizeScrollbar();
-    }
-
-    /**
-     * Returns current scaling factor.
-     *
-     * @return The current scaling factor
-     */
-    public double getScale() {
-        return mScale;
-    }
-
-    /**
-     * Returns Canvas image size (original, before zoom), in pixels.
-     *
-     * @return Canvas image size (original, before zoom), in pixels
-     */
-    public int getImgSize() {
-        return mImgSize;
-    }
-
-    /**
-     * Returns the scaled image size in pixels.
-     *
-     * @return The scaled image size in pixels.
-     */
-    public int getScaledImgSize() {
-        return (int) (mImgSize * mScale);
-    }
-
-    /**
-     * Changes the size of the canvas image and the client size. Recomputes
-     * scrollbars.
-     *
-     * @param imgSize the size of the image being scaled
-     * @param fullSize the size of the full view area being scrolled
-     * @param clientSize the size of the view port
-     */
-    public void setSize(int imgSize, int fullSize, int clientSize) {
-        mImgSize = imgSize;
-        mFullSize = fullSize;
-        mClientSize = clientSize;
-        mScrollbar.setPageIncrement(clientSize);
-        resizeScrollbar();
-    }
-
-    private void resizeScrollbar() {
-        // scaled image size
-        int sx = (int) (mScale * mFullSize);
-
-        // Adjust margin such that for zoomed out views
-        // we don't waste space (unless the viewport is
-        // large enough to accommodate it)
-        int delta = mClientSize - sx;
-        if (delta < 0) {
-            mMargin = 0;
-        } else if (delta < 2 * DEFAULT_MARGIN) {
-            mMargin = delta / 2;
-
-            ImageOverlay imageOverlay = mCanvas.getImageOverlay();
-            if (imageOverlay != null && imageOverlay.getShowDropShadow()
-                    && delta >= SHADOW_SIZE / 2) {
-                mMargin -= SHADOW_SIZE / 2;
-                // Add a little padding on the top too, if there's room. The shadow assets
-                // include enough padding on the bottom to not make this look clipped.
-                if (mMargin < 4) {
-                    mMargin += 4;
-                }
-            }
-        } else {
-            mMargin = DEFAULT_MARGIN;
-        }
-
-        if (mCanvas.getPreviewManager().hasPreviews()) {
-            // Make more room for the previews
-            mMargin = 2;
-        }
-
-        // actual client area is always reduced by the margins
-        int cx = mClientSize - 2 * mMargin;
-
-        if (sx < cx) {
-            mTranslate = 0;
-            mScrollbar.setEnabled(false);
-        } else {
-            mScrollbar.setEnabled(true);
-
-            int selection = mScrollbar.getSelection();
-            int thumb = cx;
-            int maximum = sx;
-
-            if (selection + thumb > maximum) {
-                selection = maximum - thumb;
-                if (selection < 0) {
-                    selection = 0;
-                }
-            }
-
-            mScrollbar.setValues(selection, mScrollbar.getMinimum(), maximum, thumb, mScrollbar
-                    .getIncrement(), mScrollbar.getPageIncrement());
-
-            mTranslate = selection;
-        }
-    }
-
-    public int getMargin() {
-        return mMargin;
-    }
-
-    public int translate(int canvasX) {
-        return mMargin - mTranslate + (int) (mScale * canvasX);
-    }
-
-    public int scale(int canwasW) {
-        return (int) (mScale * canwasW);
-    }
-
-    public int inverseTranslate(int screenX) {
-        return (int) ((screenX - mMargin + mTranslate) / mScale);
-    }
-
-    public int inverseScale(int canwasW) {
-        return (int) (canwasW / mScale);
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/CanvasViewInfo.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/CanvasViewInfo.java
deleted file mode 100644
index 03c6c39..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/CanvasViewInfo.java
+++ /dev/null
@@ -1,1178 +0,0 @@
-/*
- * Copyright (C) 2009 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.editors.layout.gle2;
-
-import static com.android.SdkConstants.FQCN_SPACE;
-import static com.android.SdkConstants.FQCN_SPACE_V7;
-import static com.android.SdkConstants.GESTURE_OVERLAY_VIEW;
-import static com.android.SdkConstants.VIEW_MERGE;
-
-import com.android.SdkConstants;
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-import com.android.ide.common.api.Margins;
-import com.android.ide.common.api.Rect;
-import com.android.ide.common.layout.GridLayoutRule;
-import com.android.ide.common.rendering.api.Capability;
-import com.android.ide.common.rendering.api.MergeCookie;
-import com.android.ide.common.rendering.api.ViewInfo;
-import com.android.ide.eclipse.adt.internal.editors.descriptors.AttributeDescriptor;
-import com.android.ide.eclipse.adt.internal.editors.layout.UiElementPullParser;
-import com.android.ide.eclipse.adt.internal.editors.layout.uimodel.UiViewElementNode;
-import com.android.ide.eclipse.adt.internal.editors.uimodel.UiAttributeNode;
-import com.android.ide.eclipse.adt.internal.editors.uimodel.UiElementNode;
-import com.android.utils.Pair;
-
-import org.eclipse.swt.graphics.Rectangle;
-import org.eclipse.ui.views.properties.IPropertyDescriptor;
-import org.eclipse.ui.views.properties.IPropertySheetPage;
-import org.eclipse.ui.views.properties.IPropertySource;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
-
-/**
- * Maps a {@link ViewInfo} in a structure more adapted to our needs.
- * The only large difference is that we keep both the original bounds of the view info
- * and we pre-compute the selection bounds which are absolute to the rendered image
- * (whereas the original bounds are relative to the parent view.)
- * <p/>
- * Each view also knows its parent and children.
- * <p/>
- * We can't alter {@link ViewInfo} as it is part of the LayoutBridge and needs to
- * have a fixed API.
- * <p/>
- * The view info also implements {@link IPropertySource}, which enables a linked
- * {@link IPropertySheetPage} to display the attributes of the selected element.
- * This class actually delegates handling of {@link IPropertySource} to the underlying
- * {@link UiViewElementNode}, if any.
- */
-public class CanvasViewInfo implements IPropertySource {
-
-    /**
-     * Minimal size of the selection, in case an empty view or layout is selected.
-     */
-    public static final int SELECTION_MIN_SIZE = 6;
-
-    private final Rectangle mAbsRect;
-    private final Rectangle mSelectionRect;
-    private final String mName;
-    private final Object mViewObject;
-    private final UiViewElementNode mUiViewNode;
-    private CanvasViewInfo mParent;
-    private ViewInfo mViewInfo;
-    private final List<CanvasViewInfo> mChildren = new ArrayList<CanvasViewInfo>();
-
-    /**
-     * Is this view info an individually exploded view? This is the case for views
-     * that were specially inflated by the {@link UiElementPullParser} and assigned
-     * fixed padding because they were invisible and somebody requested visibility.
-     */
-    private boolean mExploded;
-
-    /**
-     * Node sibling. This is usually null, but it's possible for a single node in the
-     * model to have <b>multiple</b> separate views in the canvas, for example
-     * when you {@code <include>} a view that has multiple widgets inside a
-     * {@code <merge>} tag. In this case, all the views have the same node model,
-     * the include tag, and selecting the include should highlight all the separate
-     * views that are linked to this node. That's what this field is all about: it is
-     * a <b>circular</b> list of all the siblings that share the same node.
-     */
-    private List<CanvasViewInfo> mNodeSiblings;
-
-    /**
-     * Constructs a {@link CanvasViewInfo} initialized with the given initial values.
-     */
-    private CanvasViewInfo(CanvasViewInfo parent, String name,
-            Object viewObject, UiViewElementNode node, Rectangle absRect,
-            Rectangle selectionRect, ViewInfo viewInfo) {
-        mParent = parent;
-        mName = name;
-        mViewObject = viewObject;
-        mViewInfo = viewInfo;
-        mUiViewNode  = node;
-        mAbsRect = absRect;
-        mSelectionRect = selectionRect;
-    }
-
-    /**
-     * Returns the original {@link ViewInfo} bounds in absolute coordinates
-     * over the whole graphic.
-     *
-     * @return the bounding box in absolute coordinates
-     */
-    @NonNull
-    public Rectangle getAbsRect() {
-        return mAbsRect;
-    }
-
-    /**
-     * Returns the absolute selection bounds of the view info as a rectangle.
-     * The selection bounds will always have a size greater or equal to
-     * {@link #SELECTION_MIN_SIZE}.
-     * The width/height is inclusive (i.e. width = right-left-1).
-     * This is in absolute "screen" coordinates (relative to the rendered bitmap).
-     *
-     * @return the absolute selection bounds
-     */
-    @NonNull
-    public Rectangle getSelectionRect() {
-        return mSelectionRect;
-    }
-
-    /**
-     * Returns the view node. Could be null, although unlikely.
-     * @return An {@link UiViewElementNode} that uniquely identifies the object in the XML model.
-     * @see ViewInfo#getCookie()
-     */
-    @Nullable
-    public UiViewElementNode getUiViewNode() {
-        return mUiViewNode;
-    }
-
-    /**
-     * Returns the parent {@link CanvasViewInfo}.
-     * It is null for the root and non-null for children.
-     *
-     * @return the parent {@link CanvasViewInfo}, which can be null
-     */
-    @Nullable
-    public CanvasViewInfo getParent() {
-        return mParent;
-    }
-
-    /**
-     * Returns the list of children of this {@link CanvasViewInfo}.
-     * The list is never null. It can be empty.
-     * By contract, this.getChildren().get(0..n-1).getParent() == this.
-     *
-     * @return the children, never null
-     */
-    @NonNull
-    public List<CanvasViewInfo> getChildren() {
-        return mChildren;
-    }
-
-    /**
-     * For nodes that have multiple views rendered from a single node, such as the
-     * children of a {@code <merge>} tag included into a separate layout, return the
-     * "primary" view, the first view that is rendered
-     */
-    @Nullable
-    private CanvasViewInfo getPrimaryNodeSibling() {
-        if (mNodeSiblings == null || mNodeSiblings.size() == 0) {
-            return null;
-        }
-
-        return mNodeSiblings.get(0);
-    }
-
-    /**
-     * Returns true if this view represents one view of many linked to a single node, and
-     * where this is the primary view. The primary view is the one that will be shown
-     * in the outline for example (since we only show nodes, not views, in the outline,
-     * and therefore don't want repetitions when a view has more than one view info.)
-     *
-     * @return true if this is the primary view among more than one linked to a single
-     *         node
-     */
-    private boolean isPrimaryNodeSibling() {
-        return getPrimaryNodeSibling() == this;
-    }
-
-    /**
-     * Returns the list of node sibling of this view (which <b>will include this
-     * view</b>). For most views this is going to be null, but for views that share a
-     * single node (such as widgets inside a {@code <merge>} tag included into another
-     * layout), this will provide all the views that correspond to the node.
-     *
-     * @return a non-empty list of siblings (including this), or null
-     */
-    @Nullable
-    public List<CanvasViewInfo> getNodeSiblings() {
-        return mNodeSiblings;
-    }
-
-    /**
-     * Returns all the children of the canvas view info where each child corresponds to a
-     * unique node that the user can see and select. This is intended for use by the
-     * outline for example, where only the actual nodes are displayed, not the views
-     * themselves.
-     * <p>
-     * Most views have their own nodes, so this is generally the same as
-     * {@link #getChildren}, except in the case where you for example include a view that
-     * has multiple widgets inside a {@code <merge>} tag, where all these widgets have the
-     * same node (the {@code <merge>} tag).
-     *
-     * @return list of {@link CanvasViewInfo} objects that are children of this view,
-     *         never null
-     */
-    @NonNull
-    public List<CanvasViewInfo> getUniqueChildren() {
-        boolean haveHidden = false;
-
-        for (CanvasViewInfo info : mChildren) {
-            if (info.mNodeSiblings != null) {
-                // We have secondary children; must create a new collection containing
-                // only non-secondary children
-                List<CanvasViewInfo> children = new ArrayList<CanvasViewInfo>();
-                for (CanvasViewInfo vi : mChildren) {
-                    if (vi.mNodeSiblings == null) {
-                        children.add(vi);
-                    } else if (vi.isPrimaryNodeSibling()) {
-                        children.add(vi);
-                    }
-                }
-                return children;
-            }
-
-            haveHidden |= info.isHidden();
-        }
-
-        if (haveHidden) {
-            List<CanvasViewInfo> children = new ArrayList<CanvasViewInfo>(mChildren.size());
-            for (CanvasViewInfo vi : mChildren) {
-                if (!vi.isHidden()) {
-                    children.add(vi);
-                }
-            }
-
-            return children;
-        }
-
-        return mChildren;
-    }
-
-    /**
-     * Returns true if the specific {@link CanvasViewInfo} is a parent
-     * of this {@link CanvasViewInfo}. It can be a direct parent or any
-     * grand-parent higher in the hierarchy.
-     *
-     * @param potentialParent the view info to check
-     * @return true if the given info is a parent of this view
-     */
-    public boolean isParent(@NonNull CanvasViewInfo potentialParent) {
-        CanvasViewInfo p = mParent;
-        while (p != null) {
-            if (p == potentialParent) {
-                return true;
-            }
-            p = p.getParent();
-        }
-        return false;
-    }
-
-    /**
-     * Returns the name of the {@link CanvasViewInfo}.
-     * Could be null, although unlikely.
-     * Experience shows this is the full qualified Java name of the View.
-     * TODO: Rename this method to getFqcn.
-     *
-     * @return the name of the view info
-     *
-     * @see ViewInfo#getClassName()
-     */
-    @NonNull
-    public String getName() {
-        return mName;
-    }
-
-    /**
-     * Returns the View object associated with the {@link CanvasViewInfo}.
-     * @return the view object or null.
-     */
-    @Nullable
-    public Object getViewObject() {
-        return mViewObject;
-    }
-
-    /**
-     * Returns the baseline of this object, or -1 if it does not support a baseline
-     *
-     * @return the baseline or -1
-     */
-    public int getBaseline() {
-        if (mViewInfo != null) {
-            int baseline = mViewInfo.getBaseLine();
-            if (baseline != Integer.MIN_VALUE) {
-                return baseline;
-            }
-        }
-
-        return -1;
-    }
-
-    /**
-     * Returns the {@link Margins} for this {@link CanvasViewInfo}
-     *
-     * @return the {@link Margins} for this {@link CanvasViewInfo}
-     */
-    @Nullable
-    public Margins getMargins() {
-        if (mViewInfo != null) {
-            int leftMargin = mViewInfo.getLeftMargin();
-            int topMargin = mViewInfo.getTopMargin();
-            int rightMargin = mViewInfo.getRightMargin();
-            int bottomMargin = mViewInfo.getBottomMargin();
-            return new Margins(
-                leftMargin != Integer.MIN_VALUE ? leftMargin : 0,
-                rightMargin != Integer.MIN_VALUE ? rightMargin : 0,
-                topMargin != Integer.MIN_VALUE ? topMargin : 0,
-                bottomMargin != Integer.MIN_VALUE ? bottomMargin : 0
-            );
-        }
-
-        return null;
-    }
-
-    // ---- Implementation of IPropertySource
-    // TODO: Get rid of this once the old propertysheet implementation is fully gone
-
-    @Override
-    public Object getEditableValue() {
-        UiViewElementNode uiView = getUiViewNode();
-        if (uiView != null) {
-            return ((IPropertySource) uiView).getEditableValue();
-        }
-        return null;
-    }
-
-    @Override
-    public IPropertyDescriptor[] getPropertyDescriptors() {
-        UiViewElementNode uiView = getUiViewNode();
-        if (uiView != null) {
-            return ((IPropertySource) uiView).getPropertyDescriptors();
-        }
-        return null;
-    }
-
-    @Override
-    public Object getPropertyValue(Object id) {
-        UiViewElementNode uiView = getUiViewNode();
-        if (uiView != null) {
-            return ((IPropertySource) uiView).getPropertyValue(id);
-        }
-        return null;
-    }
-
-    @Override
-    public boolean isPropertySet(Object id) {
-        UiViewElementNode uiView = getUiViewNode();
-        if (uiView != null) {
-            return ((IPropertySource) uiView).isPropertySet(id);
-        }
-        return false;
-    }
-
-    @Override
-    public void resetPropertyValue(Object id) {
-        UiViewElementNode uiView = getUiViewNode();
-        if (uiView != null) {
-            ((IPropertySource) uiView).resetPropertyValue(id);
-        }
-    }
-
-    @Override
-    public void setPropertyValue(Object id, Object value) {
-        UiViewElementNode uiView = getUiViewNode();
-        if (uiView != null) {
-            ((IPropertySource) uiView).setPropertyValue(id, value);
-        }
-    }
-
-    /**
-     * Returns the XML node corresponding to this info, or null if there is no
-     * such XML node.
-     *
-     * @return The XML node corresponding to this info object, or null
-     */
-    @Nullable
-    public Node getXmlNode() {
-        UiViewElementNode uiView = getUiViewNode();
-        if (uiView != null) {
-            return uiView.getXmlNode();
-        }
-
-        return null;
-    }
-
-    /**
-     * Returns true iff this view info corresponds to a root element.
-     *
-     * @return True iff this is a root view info.
-     */
-    public boolean isRoot() {
-        // Select the visual element -- unless it's the root.
-        // The root element is the one whose GRAND parent
-        // is null (because the parent will be a -document-
-        // node).
-
-        // Special case: a gesture overlay is sometimes added as the root, but for all intents
-        // and purposes it is its layout child that is the real root so treat that one as the
-        // root as well (such that the whole layout canvas does not highlight as part of hovers
-        // etc)
-        if (mParent != null
-                && mParent.mName.endsWith(GESTURE_OVERLAY_VIEW)
-                && mParent.isRoot()
-                && mParent.mChildren.size() == 1) {
-            return true;
-        }
-
-        return mUiViewNode == null || mUiViewNode.getUiParent() == null ||
-            mUiViewNode.getUiParent().getUiParent() == null;
-    }
-
-    /**
-     * Returns true if this {@link CanvasViewInfo} represents an invisible widget that
-     * should be highlighted when selected.  This is the case for any layout that is less than the minimum
-     * threshold ({@link #SELECTION_MIN_SIZE}), or any other view that has -0- bounds.
-     *
-     * @return True if this is a tiny layout or invisible view
-     */
-    public boolean isInvisible() {
-        if (isHidden()) {
-            // Don't expand and highlight hidden widgets
-            return false;
-        }
-
-        if (mAbsRect.width < SELECTION_MIN_SIZE || mAbsRect.height < SELECTION_MIN_SIZE) {
-            return mUiViewNode != null && (mUiViewNode.getDescriptor().hasChildren() ||
-                    mAbsRect.width <= 0 || mAbsRect.height <= 0);
-        }
-
-        return false;
-    }
-
-    /**
-     * Returns true if this {@link CanvasViewInfo} represents a widget that should be
-     * hidden, such as a {@code <Space>} which are typically not manipulated by the user
-     * through dragging etc.
-     *
-     * @return true if this is a hidden view
-     */
-    public boolean isHidden() {
-        if (GridLayoutRule.sDebugGridLayout) {
-            return false;
-        }
-
-        return FQCN_SPACE.equals(mName) || FQCN_SPACE_V7.equals(mName);
-    }
-
-    /**
-     * Is this {@link CanvasViewInfo} a view that has had its padding inflated in order to
-     * make it visible during selection or dragging? Note that this is NOT considered to
-     * be the case in the explode-all-views mode where all nodes have their padding
-     * increased; it's only used for views that individually exploded because they were
-     * requested visible and they returned true for {@link #isInvisible()}.
-     *
-     * @return True if this is an exploded node.
-     */
-    public boolean isExploded() {
-        return mExploded;
-    }
-
-    /**
-     * Mark this {@link CanvasViewInfo} as having been exploded or not. See the
-     * {@link #isExploded()} method for details on what this property means.
-     *
-     * @param exploded New value of the exploded property to mark this info with.
-     */
-    void setExploded(boolean exploded) {
-        mExploded = exploded;
-    }
-
-    /**
-     * Returns the info represented as a {@link SimpleElement}.
-     *
-     * @return A {@link SimpleElement} wrapping this info.
-     */
-    @NonNull
-    SimpleElement toSimpleElement() {
-
-        UiViewElementNode uiNode = getUiViewNode();
-
-        String fqcn = SimpleXmlTransfer.getFqcn(uiNode.getDescriptor());
-        String parentFqcn = null;
-        Rect bounds = SwtUtils.toRect(getAbsRect());
-        Rect parentBounds = null;
-
-        UiElementNode uiParent = uiNode.getUiParent();
-        if (uiParent != null) {
-            parentFqcn = SimpleXmlTransfer.getFqcn(uiParent.getDescriptor());
-        }
-        if (getParent() != null) {
-            parentBounds = SwtUtils.toRect(getParent().getAbsRect());
-        }
-
-        SimpleElement e = new SimpleElement(fqcn, parentFqcn, bounds, parentBounds);
-
-        for (UiAttributeNode attr : uiNode.getAllUiAttributes()) {
-            String value = attr.getCurrentValue();
-            if (value != null && value.length() > 0) {
-                AttributeDescriptor attrDesc = attr.getDescriptor();
-                SimpleAttribute a = new SimpleAttribute(
-                        attrDesc.getNamespaceUri(),
-                        attrDesc.getXmlLocalName(),
-                        value);
-                e.addAttribute(a);
-            }
-        }
-
-        for (CanvasViewInfo childVi : getChildren()) {
-            SimpleElement e2 = childVi.toSimpleElement();
-            if (e2 != null) {
-                e.addInnerElement(e2);
-            }
-        }
-
-        return e;
-    }
-
-    /**
-     * Returns the layout url attribute value for the closest surrounding include or
-     * fragment element parent, or null if this {@link CanvasViewInfo} is not rendered as
-     * part of an include or fragment tag.
-     *
-     * @return the layout url attribute value for the surrounding include tag, or null if
-     *         not applicable
-     */
-    @Nullable
-    public String getIncludeUrl() {
-        CanvasViewInfo curr = this;
-        while (curr != null) {
-            if (curr.mUiViewNode != null) {
-                Node node = curr.mUiViewNode.getXmlNode();
-                if (node != null && node.getNodeType() == Node.ELEMENT_NODE) {
-                    String nodeName = node.getNodeName();
-                    if (node.getNamespaceURI() == null
-                            && SdkConstants.VIEW_INCLUDE.equals(nodeName)) {
-                        // Note: the layout attribute is NOT in the Android namespace
-                        Element element = (Element) node;
-                        String url = element.getAttribute(SdkConstants.ATTR_LAYOUT);
-                        if (url.length() > 0) {
-                            return url;
-                        }
-                    } else if (SdkConstants.VIEW_FRAGMENT.equals(nodeName)) {
-                        String url = FragmentMenu.getFragmentLayout(node);
-                        if (url != null) {
-                            return url;
-                        }
-                    }
-                }
-            }
-            curr = curr.mParent;
-        }
-
-        return null;
-    }
-
-    /** Adds the given {@link CanvasViewInfo} as a new last child of this view */
-    private void addChild(@NonNull CanvasViewInfo child) {
-        mChildren.add(child);
-    }
-
-    /** Adds the given {@link CanvasViewInfo} as a child at the given index */
-    private void addChildAt(int index, @NonNull CanvasViewInfo child) {
-        mChildren.add(index, child);
-    }
-
-    /**
-     * Removes the given {@link CanvasViewInfo} from the child list of this view, and
-     * returns true if it was successfully removed
-     *
-     * @param child the child to be removed
-     * @return true if it was a child and was removed
-     */
-    public boolean removeChild(@NonNull CanvasViewInfo child) {
-        return mChildren.remove(child);
-    }
-
-    @Override
-    public String toString() {
-        return "CanvasViewInfo [name=" + mName + ", node=" + mUiViewNode + "]";
-    }
-
-    // ---- Factory functionality ----
-
-    /**
-     * Creates a new {@link CanvasViewInfo} hierarchy based on the given {@link ViewInfo}
-     * hierarchy. Note that this will not necessarily create one {@link CanvasViewInfo}
-     * for each {@link ViewInfo}. It will generally only create {@link CanvasViewInfo}
-     * objects for {@link ViewInfo} objects that contain a reference to an
-     * {@link UiViewElementNode}, meaning that it corresponds to an element in the XML
-     * file for this layout file. This is not always the case, such as in the following
-     * scenarios:
-     * <ul>
-     * <li>we link to other layouts with {@code <include>}
-     * <li>the current view is rendered within another view ("Show Included In") such that
-     * the outer file does not correspond to elements in the current included XML layout
-     * <li>on older platforms that don't support {@link Capability#EMBEDDED_LAYOUT} there
-     * is no reference to the {@code <include>} tag
-     * <li>with the {@code <merge>} tag we don't get a reference to the corresponding
-     * element
-     * <ul>
-     * <p>
-     * This method will build up a set of {@link CanvasViewInfo} that corresponds to the
-     * actual <b>selectable</b> views (which are also shown in the Outline).
-     *
-     * @param layoutlib5 if true, the {@link ViewInfo} hierarchy was created by layoutlib
-     *    version 5 or higher, which means this algorithm can make certain assumptions
-     *    (for example that {@code <merge>} siblings will provide {@link MergeCookie}
-     *    references, so we don't have to search for them.)
-     * @param root the root {@link ViewInfo} to build from
-     * @return a {@link CanvasViewInfo} hierarchy
-     */
-    @NonNull
-    public static Pair<CanvasViewInfo,List<Rectangle>> create(ViewInfo root, boolean layoutlib5) {
-        return new Builder(layoutlib5).create(root);
-    }
-
-    /** Builder object which walks over a tree of {@link ViewInfo} objects and builds
-     * up a corresponding {@link CanvasViewInfo} hierarchy. */
-    private static class Builder {
-        public Builder(boolean layoutlib5) {
-            mLayoutLib5 = layoutlib5;
-        }
-
-        /**
-         * The mapping from nodes that have a {@code <merge>} as a parent in the node
-         * model to their corresponding views
-         */
-        private Map<UiViewElementNode, List<CanvasViewInfo>> mMergeNodeMap;
-
-        /**
-         * Whether the ViewInfos are provided by a layout library that is version 5 or
-         * later, since that will allow us to take several shortcuts
-         */
-        private boolean mLayoutLib5;
-
-        /**
-         * Creates a hierarchy of {@link CanvasViewInfo} objects and merge bounding
-         * rectangles from the given {@link ViewInfo} hierarchy
-         */
-        private Pair<CanvasViewInfo,List<Rectangle>> create(ViewInfo root) {
-            Object cookie = root.getCookie();
-            if (cookie == null) {
-                // Special case: If the root-most view does not have a view cookie,
-                // then we are rendering some outer layout surrounding this layout, and in
-                // that case we must search down the hierarchy for the (possibly multiple)
-                // sub-roots that correspond to elements in this layout, and place them inside
-                // an outer view that has no node. In the outline this item will be used to
-                // show the inclusion-context.
-                CanvasViewInfo rootView = createView(null, root, 0, 0);
-                addKeyedSubtrees(rootView, root, 0, 0);
-
-                List<Rectangle> includedBounds = new ArrayList<Rectangle>();
-                for (CanvasViewInfo vi : rootView.getChildren()) {
-                    if (vi.getNodeSiblings() == null || vi.isPrimaryNodeSibling()) {
-                        includedBounds.add(vi.getAbsRect());
-                    }
-                }
-
-                // There are <merge> nodes here; see if we can insert it into the hierarchy
-                if (mMergeNodeMap != null) {
-                    // Locate all the nodes that have a <merge> as a parent in the node model,
-                    // and where the view sits at the top level inside the include-context node.
-                    UiViewElementNode merge = null;
-                    List<CanvasViewInfo> merged = new ArrayList<CanvasViewInfo>();
-                    for (Map.Entry<UiViewElementNode, List<CanvasViewInfo>> entry : mMergeNodeMap
-                            .entrySet()) {
-                        UiViewElementNode node = entry.getKey();
-                        if (!hasMergeParent(node)) {
-                            continue;
-                        }
-                        List<CanvasViewInfo> views = entry.getValue();
-                        assert views.size() > 0;
-                        CanvasViewInfo view = views.get(0); // primary
-                        if (view.getParent() != rootView) {
-                            continue;
-                        }
-                        UiElementNode parent = node.getUiParent();
-                        if (merge != null && parent != merge) {
-                            continue;
-                        }
-                        merge = (UiViewElementNode) parent;
-                        merged.add(view);
-                    }
-                    if (merged.size() > 0) {
-                        // Compute a bounding box for the merged views
-                        Rectangle absRect = null;
-                        for (CanvasViewInfo child : merged) {
-                            Rectangle rect = child.getAbsRect();
-                            if (absRect == null) {
-                                absRect = rect;
-                            } else {
-                                absRect = absRect.union(rect);
-                            }
-                        }
-
-                        CanvasViewInfo mergeView = new CanvasViewInfo(rootView, VIEW_MERGE, null,
-                                merge, absRect, absRect, null /* viewInfo */);
-                        for (CanvasViewInfo view : merged) {
-                            if (rootView.removeChild(view)) {
-                                mergeView.addChild(view);
-                            }
-                        }
-                        rootView.addChild(mergeView);
-                    }
-                }
-
-                return Pair.of(rootView, includedBounds);
-            } else {
-                // We have a view key at the top, so just go and create {@link CanvasViewInfo}
-                // objects for each {@link ViewInfo} until we run into a null key.
-                CanvasViewInfo rootView = addKeyedSubtrees(null, root, 0, 0);
-
-                // Special case: look to see if the root element is really a <merge>, and if so,
-                // manufacture a view for it such that we can target this root element
-                // in drag & drop operations, such that we can show it in the outline, etc
-                if (rootView != null && hasMergeParent(rootView.getUiViewNode())) {
-                    CanvasViewInfo merge = new CanvasViewInfo(null, VIEW_MERGE, null,
-                            (UiViewElementNode) rootView.getUiViewNode().getUiParent(),
-                            rootView.getAbsRect(), rootView.getSelectionRect(),
-                            null /* viewInfo */);
-                    // Insert the <merge> as the new real root
-                    rootView.mParent = merge;
-                    merge.addChild(rootView);
-                    rootView = merge;
-                }
-
-                return Pair.of(rootView, null);
-            }
-        }
-
-        private boolean hasMergeParent(UiViewElementNode rootNode) {
-            UiElementNode rootParent = rootNode.getUiParent();
-            return (rootParent instanceof UiViewElementNode
-                    && VIEW_MERGE.equals(rootParent.getDescriptor().getXmlName()));
-        }
-
-        /** Creates a {@link CanvasViewInfo} for a given {@link ViewInfo} but does not recurse */
-        private CanvasViewInfo createView(CanvasViewInfo parent, ViewInfo root, int parentX,
-                int parentY) {
-            Object cookie = root.getCookie();
-            UiViewElementNode node = null;
-            if (cookie instanceof UiViewElementNode) {
-                node = (UiViewElementNode) cookie;
-            } else if (cookie instanceof MergeCookie) {
-                cookie = ((MergeCookie) cookie).getCookie();
-                if (cookie instanceof UiViewElementNode) {
-                    node = (UiViewElementNode) cookie;
-                    CanvasViewInfo view = createView(parent, root, parentX, parentY, node);
-                    if (root.getCookie() instanceof MergeCookie && view.mNodeSiblings == null) {
-                        List<CanvasViewInfo> v = mMergeNodeMap == null ?
-                                null : mMergeNodeMap.get(node);
-                        if (v != null) {
-                            v.add(view);
-                        } else {
-                            v = new ArrayList<CanvasViewInfo>();
-                            v.add(view);
-                            if (mMergeNodeMap == null) {
-                                mMergeNodeMap =
-                                    new HashMap<UiViewElementNode, List<CanvasViewInfo>>();
-                            }
-                            mMergeNodeMap.put(node, v);
-                        }
-                        view.mNodeSiblings = v;
-                    }
-
-                    return view;
-                }
-            }
-
-            return createView(parent, root, parentX, parentY, node);
-        }
-
-        /**
-         * Creates a {@link CanvasViewInfo} for a given {@link ViewInfo} but does not recurse.
-         * This method specifies an explicit {@link UiViewElementNode} to use rather than
-         * relying on the view cookie in the info object.
-         */
-        private CanvasViewInfo createView(CanvasViewInfo parent, ViewInfo root, int parentX,
-                int parentY, UiViewElementNode node) {
-
-            int x = root.getLeft();
-            int y = root.getTop();
-            int w = root.getRight() - x;
-            int h = root.getBottom() - y;
-
-            x += parentX;
-            y += parentY;
-
-            Rectangle absRect = new Rectangle(x, y, w - 1, h - 1);
-
-            if (w < SELECTION_MIN_SIZE) {
-                int d = (SELECTION_MIN_SIZE - w) / 2;
-                x -= d;
-                w += SELECTION_MIN_SIZE - w;
-            }
-
-            if (h < SELECTION_MIN_SIZE) {
-                int d = (SELECTION_MIN_SIZE - h) / 2;
-                y -= d;
-                h += SELECTION_MIN_SIZE - h;
-            }
-
-            Rectangle selectionRect = new Rectangle(x, y, w - 1, h - 1);
-
-            return new CanvasViewInfo(parent, root.getClassName(), root.getViewObject(), node,
-                    absRect, selectionRect, root);
-        }
-
-        /** Create a subtree recursively until you run out of keys */
-        private CanvasViewInfo createSubtree(CanvasViewInfo parent, ViewInfo viewInfo,
-                int parentX, int parentY) {
-            assert viewInfo.getCookie() != null;
-
-            CanvasViewInfo view = createView(parent, viewInfo, parentX, parentY);
-            // Bug workaround: Ensure that we never have a child node identical
-            // to its parent node: this can happen for example when rendering a
-            // ZoomControls view where the merge cookies point to the parent.
-            if (parent != null && view.mUiViewNode == parent.mUiViewNode) {
-                return null;
-            }
-
-            // Process children:
-            parentX += viewInfo.getLeft();
-            parentY += viewInfo.getTop();
-
-            List<ViewInfo> children = viewInfo.getChildren();
-
-            if (mLayoutLib5) {
-                for (ViewInfo child : children) {
-                    Object cookie = child.getCookie();
-                    if (cookie instanceof UiViewElementNode || cookie instanceof MergeCookie) {
-                        CanvasViewInfo childView = createSubtree(view, child,
-                                parentX, parentY);
-                        if (childView != null) {
-                            view.addChild(childView);
-                        }
-                    } // else: null cookies, adapter item references, etc: No child views.
-                }
-
-                return view;
-            }
-
-            // See if we have any missing keys at this level
-            int missingNodes = 0;
-            int mergeNodes = 0;
-            for (ViewInfo child : children) {
-                // Only use children which have a ViewKey of the correct type.
-                // We can't interact with those when they have a null key or
-                // an incompatible type.
-                Object cookie = child.getCookie();
-                if (!(cookie instanceof UiViewElementNode)) {
-                    if (cookie instanceof MergeCookie) {
-                        mergeNodes++;
-                    } else {
-                        missingNodes++;
-                    }
-                }
-            }
-
-            if (missingNodes == 0 && mergeNodes == 0) {
-                // No missing nodes; this is the normal case, and we can just continue to
-                // recursively add our children
-                for (ViewInfo child : children) {
-                    CanvasViewInfo childView = createSubtree(view, child,
-                            parentX, parentY);
-                    view.addChild(childView);
-                }
-
-                // TBD: Emit placeholder views for keys that have no views?
-            } else {
-                // We don't have keys for one or more of the ViewInfos. There are many
-                // possible causes: we are on an SDK platform that does not support
-                // embedded_layout rendering, or we are including a view with a <merge>
-                // as the root element.
-
-                UiViewElementNode uiViewNode = view.getUiViewNode();
-                String containerName = uiViewNode != null
-                    ? uiViewNode.getDescriptor().getXmlLocalName() : ""; //$NON-NLS-1$
-                if (containerName.equals(SdkConstants.VIEW_INCLUDE)) {
-                    // This is expected -- we don't WANT to get node keys for the content
-                    // of an include since it's in a different file and should be treated
-                    // as a single unit that cannot be edited (hence, no CanvasViewInfo
-                    // children)
-                } else {
-                    // We are getting children with null keys where we don't expect it;
-                    // this usually means that we are dealing with an Android platform
-                    // that does not support {@link Capability#EMBEDDED_LAYOUT}, or
-                    // that there are <merge> tags which are doing surprising things
-                    // to the view hierarchy
-                    LinkedList<UiViewElementNode> unused = new LinkedList<UiViewElementNode>();
-                    if (uiViewNode != null) {
-                        for (UiElementNode child : uiViewNode.getUiChildren()) {
-                            if (child instanceof UiViewElementNode) {
-                                unused.addLast((UiViewElementNode) child);
-                            }
-                        }
-                    }
-                    for (ViewInfo child : children) {
-                        Object cookie = child.getCookie();
-                        if (mergeNodes > 0 && cookie instanceof MergeCookie) {
-                            cookie = ((MergeCookie) cookie).getCookie();
-                        }
-                        if (cookie != null) {
-                            unused.remove(cookie);
-                        }
-                    }
-
-                    if (unused.size() > 0 || mergeNodes > 0) {
-                        if (unused.size() == missingNodes) {
-                            // The number of unmatched elements and ViewInfos are identical;
-                            // it's very likely that they match one to one, so just use these
-                            for (ViewInfo child : children) {
-                                if (child.getCookie() == null) {
-                                    // Only create a flat (non-recursive) view
-                                    CanvasViewInfo childView = createView(view, child, parentX,
-                                            parentY, unused.removeFirst());
-                                    view.addChild(childView);
-                                } else {
-                                    CanvasViewInfo childView = createSubtree(view, child, parentX,
-                                            parentY);
-                                    view.addChild(childView);
-                                }
-                            }
-                        } else {
-                            // We have an uneven match. In this case we might be dealing
-                            // with <merge> etc.
-                            // We have no way to associate elements back with the
-                            // corresponding <include> tags if there are more than one of
-                            // them. That's not a huge tragedy since visually you are not
-                            // allowed to edit these anyway; we just need to make a visual
-                            // block for these for selection and outline purposes.
-                            addMismatched(view, parentX, parentY, children, unused);
-                        }
-                    } else {
-                        // No unused keys, but there are views without keys.
-                        // We can't represent these since all views must have node keys
-                        // such that you can operate on them. Just ignore these.
-                        for (ViewInfo child : children) {
-                            if (child.getCookie() != null) {
-                                CanvasViewInfo childView = createSubtree(view, child,
-                                        parentX, parentY);
-                                view.addChild(childView);
-                            }
-                        }
-                    }
-                }
-            }
-
-            return view;
-        }
-
-        /**
-         * We have various {@link ViewInfo} children with null keys, and/or nodes in
-         * the corresponding UI model that are not referenced by any of the {@link ViewInfo}
-         * objects. This method attempts to account for this, by matching the views in
-         * the right order.
-         */
-        private void addMismatched(CanvasViewInfo parentView, int parentX, int parentY,
-                List<ViewInfo> children, LinkedList<UiViewElementNode> unused) {
-            UiViewElementNode afterNode = null;
-            UiViewElementNode beforeNode = null;
-            // We have one important clue we can use when matching unused nodes
-            // with views: if we have a view V1 with node N1, and a view V2 with node N2,
-            // then we can only match unknown node UN with unknown node UV if
-            // V1 < UV < V2 and N1 < UN < N2.
-            // We can use these constraints to do the matching, for example by
-            // a simple DAG traversal. However, since the number of unmatched nodes
-            // will typically be very small, we'll just do a simple algorithm here
-            // which checks forwards/backwards whether a match is valid.
-            for (int index = 0, size = children.size(); index < size; index++) {
-                ViewInfo child = children.get(index);
-                if (child.getCookie() != null) {
-                    CanvasViewInfo childView = createSubtree(parentView, child, parentX, parentY);
-                    if (childView != null) {
-                        parentView.addChild(childView);
-                    }
-                    if (child.getCookie() instanceof UiViewElementNode) {
-                        afterNode = (UiViewElementNode) child.getCookie();
-                    }
-                } else {
-                    beforeNode = nextViewNode(children, index);
-
-                    // Find first eligible node from unused
-                    // TOD: What if there are more eligible? We need to process ALL views
-                    // and all nodes in one go here
-
-                    UiViewElementNode matching = null;
-                    for (UiViewElementNode candidate : unused) {
-                        if (afterNode == null || isAfter(afterNode, candidate)) {
-                            if (beforeNode == null || isBefore(beforeNode, candidate)) {
-                                matching = candidate;
-                                break;
-                            }
-                        }
-                    }
-
-                    if (matching != null) {
-                        unused.remove(matching);
-                        CanvasViewInfo childView = createView(parentView, child, parentX, parentY,
-                                matching);
-                        parentView.addChild(childView);
-                        afterNode = matching;
-                    } else {
-                        // We have no node for the view -- what do we do??
-                        // Nothing - we only represent stuff in the outline that is in the
-                        // source model, not in the render
-                    }
-                }
-            }
-
-            // Add zero-bounded boxes for all remaining nodes since they need to show
-            // up in the outline, need to be selectable so you can press Delete, etc.
-            if (unused.size() > 0) {
-                Map<UiViewElementNode, Integer> rankMap =
-                    new HashMap<UiViewElementNode, Integer>();
-                Map<UiViewElementNode, CanvasViewInfo> infoMap =
-                    new HashMap<UiViewElementNode, CanvasViewInfo>();
-                UiElementNode parent = unused.get(0).getUiParent();
-                if (parent != null) {
-                    int index = 0;
-                    for (UiElementNode child : parent.getUiChildren()) {
-                        UiViewElementNode node = (UiViewElementNode) child;
-                        rankMap.put(node, index++);
-                    }
-                    for (CanvasViewInfo child : parentView.getChildren()) {
-                        infoMap.put(child.getUiViewNode(), child);
-                    }
-                    List<Integer> usedIndexes = new ArrayList<Integer>();
-                    for (UiViewElementNode node : unused) {
-                        Integer rank = rankMap.get(node);
-                        if (rank != null) {
-                            usedIndexes.add(rank);
-                        }
-                    }
-                    Collections.sort(usedIndexes);
-                    for (int i = usedIndexes.size() - 1; i >= 0; i--) {
-                        Integer rank = usedIndexes.get(i);
-                        UiViewElementNode found = null;
-                        for (UiViewElementNode node : unused) {
-                            if (rankMap.get(node) == rank) {
-                                found = node;
-                                break;
-                            }
-                        }
-                        if (found != null) {
-                            Rectangle absRect = new Rectangle(parentX, parentY, 0, 0);
-                            String name = found.getDescriptor().getXmlLocalName();
-                            CanvasViewInfo v = new CanvasViewInfo(parentView, name, null, found,
-                                    absRect, absRect, null /* viewInfo */);
-                            // Find corresponding index in the parent view
-                            List<CanvasViewInfo> siblings = parentView.getChildren();
-                            int insertPosition = siblings.size();
-                            for (int j = siblings.size() - 1; j >= 0; j--) {
-                                CanvasViewInfo sibling = siblings.get(j);
-                                UiViewElementNode siblingNode = sibling.getUiViewNode();
-                                if (siblingNode != null) {
-                                    Integer siblingRank = rankMap.get(siblingNode);
-                                    if (siblingRank != null && siblingRank < rank) {
-                                        insertPosition = j + 1;
-                                        break;
-                                    }
-                                }
-                            }
-                            parentView.addChildAt(insertPosition, v);
-                            unused.remove(found);
-                        }
-                    }
-                }
-                // Add in any remaining
-                for (UiViewElementNode node : unused) {
-                    Rectangle absRect = new Rectangle(parentX, parentY, 0, 0);
-                    String name = node.getDescriptor().getXmlLocalName();
-                    CanvasViewInfo v = new CanvasViewInfo(parentView, name, null, node, absRect,
-                            absRect, null /* viewInfo */);
-                    parentView.addChild(v);
-                }
-            }
-        }
-
-        private boolean isBefore(UiViewElementNode beforeNode, UiViewElementNode candidate) {
-            UiElementNode parent = candidate.getUiParent();
-            if (parent != null) {
-                for (UiElementNode sibling : parent.getUiChildren()) {
-                    if (sibling == beforeNode) {
-                        return false;
-                    } else if (sibling == candidate) {
-                        return true;
-                    }
-                }
-            }
-            return false;
-        }
-
-        private boolean isAfter(UiViewElementNode afterNode, UiViewElementNode candidate) {
-            UiElementNode parent = candidate.getUiParent();
-            if (parent != null) {
-                for (UiElementNode sibling : parent.getUiChildren()) {
-                    if (sibling == afterNode) {
-                        return true;
-                    } else if (sibling == candidate) {
-                        return false;
-                    }
-                }
-            }
-            return false;
-        }
-
-        private UiViewElementNode nextViewNode(List<ViewInfo> children, int index) {
-            int size = children.size();
-            for (; index < size; index++) {
-                ViewInfo child = children.get(index);
-                if (child.getCookie() instanceof UiViewElementNode) {
-                    return (UiViewElementNode) child.getCookie();
-                }
-            }
-
-            return null;
-        }
-
-        /** Search for a subtree with valid keys and add those subtrees */
-        private CanvasViewInfo addKeyedSubtrees(CanvasViewInfo parent, ViewInfo viewInfo,
-                int parentX, int parentY) {
-            // We don't include MergeCookies when searching down for the first non-null key,
-            // since this means we are in a "Show Included In" context, and the include tag itself
-            // (which the merge cookie is pointing to) is still in the including-document rather
-            // than the included document. Therefore, we only accept real UiViewElementNodes here,
-            // not MergeCookies.
-            if (viewInfo.getCookie() != null) {
-                CanvasViewInfo subtree = createSubtree(parent, viewInfo, parentX, parentY);
-                if (parent != null && subtree != null) {
-                    parent.mChildren.add(subtree);
-                }
-                return subtree;
-            } else {
-                for (ViewInfo child : viewInfo.getChildren()) {
-                    addKeyedSubtrees(parent, child, parentX + viewInfo.getLeft(), parentY
-                            + viewInfo.getTop());
-                }
-
-                return null;
-            }
-        }
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/ClipboardSupport.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/ClipboardSupport.java
deleted file mode 100644
index 2634569..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/ClipboardSupport.java
+++ /dev/null
@@ -1,429 +0,0 @@
-/*
- * Copyright (C) 2010 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.editors.layout.gle2;
-
-import static com.android.SdkConstants.ANDROID_NS_NAME;
-import static com.android.SdkConstants.NS_RESOURCES;
-import static com.android.SdkConstants.XMLNS_URI;
-
-import com.android.ide.common.api.IDragElement;
-import com.android.ide.common.api.IDragElement.IDragAttribute;
-import com.android.ide.common.api.INode;
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.ide.eclipse.adt.internal.editors.descriptors.DescriptorsUtils;
-import com.android.ide.eclipse.adt.internal.editors.layout.LayoutEditorDelegate;
-import com.android.ide.eclipse.adt.internal.editors.layout.descriptors.ViewElementDescriptor;
-import com.android.ide.eclipse.adt.internal.editors.layout.gre.NodeProxy;
-import com.android.ide.eclipse.adt.internal.editors.layout.gre.RulesEngine;
-import com.android.ide.eclipse.adt.internal.editors.layout.uimodel.UiViewElementNode;
-import com.android.ide.eclipse.adt.internal.editors.uimodel.UiDocumentNode;
-import com.android.ide.eclipse.adt.internal.editors.uimodel.UiElementNode;
-
-import org.eclipse.jface.action.Action;
-import org.eclipse.swt.custom.StyledText;
-import org.eclipse.swt.dnd.Clipboard;
-import org.eclipse.swt.dnd.TextTransfer;
-import org.eclipse.swt.dnd.Transfer;
-import org.eclipse.swt.dnd.TransferData;
-import org.eclipse.swt.widgets.Composite;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-/**
- * The {@link ClipboardSupport} class manages the native clipboard, providing operations
- * to copy, cut and paste view items, and can answer whether the clipboard contains
- * a transferable we care about.
- */
-public class ClipboardSupport {
-    private static final boolean DEBUG = false;
-
-    /** SWT clipboard instance. */
-    private Clipboard mClipboard;
-    private LayoutCanvas mCanvas;
-
-    /**
-     * Constructs a new {@link ClipboardSupport} tied to the given
-     * {@link LayoutCanvas}.
-     *
-     * @param canvas The {@link LayoutCanvas} to provide clipboard support for.
-     * @param parent The parent widget in the SWT hierarchy of the canvas.
-     */
-    public ClipboardSupport(LayoutCanvas canvas, Composite parent) {
-        mCanvas = canvas;
-
-        mClipboard = new Clipboard(parent.getDisplay());
-    }
-
-    /**
-     * Frees up any resources held by the {@link ClipboardSupport}.
-     */
-    public void dispose() {
-        if (mClipboard != null) {
-            mClipboard.dispose();
-            mClipboard = null;
-        }
-    }
-
-    /**
-     * Perform the "Copy" action, either from the Edit menu or from the context
-     * menu.
-     * <p/>
-     * This sanitizes the selection, so it must be a copy. It then inserts the
-     * selection both as text and as {@link SimpleElement}s in the clipboard.
-     * (If there is selected text in the error label, then the error is used
-     * as the text portion of the transferable.)
-     *
-     * @param selection A list of selection items to add to the clipboard;
-     *            <b>this should be a copy already - this method will not make a
-     *            copy</b>
-     */
-    public void copySelectionToClipboard(List<SelectionItem> selection) {
-        SelectionManager.sanitize(selection);
-
-        // The error message area shares the copy action with the canvas. Invoking the
-        // copy action when there are errors visible *AND* the user has selected text there,
-        // should include the error message as the text transferable.
-        String message = null;
-        GraphicalEditorPart graphicalEditor = mCanvas.getEditorDelegate().getGraphicalEditor();
-        StyledText errorLabel = graphicalEditor.getErrorLabel();
-        if (errorLabel.getSelectionCount() > 0) {
-            message = errorLabel.getSelectionText();
-        }
-
-        if (selection.isEmpty()) {
-            if (message != null) {
-                mClipboard.setContents(
-                        new Object[] { message },
-                        new Transfer[] { TextTransfer.getInstance() }
-                );
-            }
-            return;
-        }
-
-        Object[] data = new Object[] {
-                SelectionItem.getAsElements(selection),
-                message != null ? message : SelectionItem.getAsText(mCanvas, selection)
-        };
-
-        Transfer[] types = new Transfer[] {
-                SimpleXmlTransfer.getInstance(),
-                TextTransfer.getInstance()
-        };
-
-        mClipboard.setContents(data, types);
-    }
-
-    /**
-     * Perform the "Cut" action, either from the Edit menu or from the context
-     * menu.
-     * <p/>
-     * This sanitizes the selection, so it must be a copy. It uses the
-     * {@link #copySelectionToClipboard(List)} method to copy the selection to
-     * the clipboard. Finally it uses {@link #deleteSelection(String, List)} to
-     * delete the selection with a "Cut" verb for the title.
-     *
-     * @param selection A list of selection items to add to the clipboard;
-     *            <b>this should be a copy already - this method will not make a
-     *            copy</b>
-     */
-    public void cutSelectionToClipboard(List<SelectionItem> selection) {
-        copySelectionToClipboard(selection);
-        deleteSelection(mCanvas.getCutLabel(), selection);
-    }
-
-    /**
-     * Deletes the given selection.
-     *
-     * @param verb A translated verb for the action. Will be used for the
-     *            undo/redo title. Typically this should be
-     *            {@link Action#getText()} for either the cut or the delete
-     *            actions in the canvas.
-     * @param selection The selection. Must not be null. Can be empty, in which
-     *            case nothing happens. The selection list will be sanitized so
-     *            the caller should pass in a copy.
-     */
-    public void deleteSelection(String verb, final List<SelectionItem> selection) {
-        SelectionManager.sanitize(selection);
-
-        if (selection.isEmpty()) {
-            return;
-        }
-
-        // If all selected items have the same *kind* of parent, display that in the undo title.
-        String title = null;
-        for (SelectionItem cs : selection) {
-            CanvasViewInfo vi = cs.getViewInfo();
-            if (vi != null && vi.getParent() != null) {
-                CanvasViewInfo parent = vi.getParent();
-                assert parent != null;
-                if (title == null) {
-                    title = parent.getName();
-                } else if (!title.equals(parent.getName())) {
-                    // More than one kind of parent selected.
-                    title = null;
-                    break;
-                }
-            }
-        }
-
-        if (title != null) {
-            // Typically the name is an FQCN. Just get the last segment.
-            int pos = title.lastIndexOf('.');
-            if (pos > 0 && pos < title.length() - 1) {
-                title = title.substring(pos + 1);
-            }
-        }
-        boolean multiple = mCanvas.getSelectionManager().hasMultiSelection();
-        if (title == null) {
-            title = String.format(
-                        multiple ? "%1$s elements" : "%1$s element",
-                        verb);
-        } else {
-            title = String.format(
-                        multiple ? "%1$s elements from %2$s" : "%1$s element from %2$s",
-                        verb, title);
-        }
-
-        // Implementation note: we don't clear the internal selection after removing
-        // the elements. An update XML model event should happen when the model gets released
-        // which will trigger a recompute of the layout, thus reloading the model thus
-        // resetting the selection.
-        mCanvas.getEditorDelegate().getEditor().wrapUndoEditXmlModel(title, new Runnable() {
-            @Override
-            public void run() {
-                // Segment the deleted nodes into clusters of siblings
-                Map<NodeProxy, List<INode>> clusters =
-                        new HashMap<NodeProxy, List<INode>>();
-                for (SelectionItem cs : selection) {
-                    NodeProxy node = cs.getNode();
-                    if (node == null) {
-                        continue;
-                    }
-                    INode parent = node.getParent();
-                    if (parent != null) {
-                        List<INode> children = clusters.get(parent);
-                        if (children == null) {
-                            children = new ArrayList<INode>();
-                            clusters.put((NodeProxy) parent, children);
-                        }
-                        children.add(node);
-                    }
-                }
-
-                // Notify parent views about children getting deleted
-                RulesEngine rulesEngine = mCanvas.getRulesEngine();
-                for (Map.Entry<NodeProxy, List<INode>> entry : clusters.entrySet()) {
-                    NodeProxy parent = entry.getKey();
-                    List<INode> children = entry.getValue();
-                    assert children != null && children.size() > 0;
-                    rulesEngine.callOnRemovingChildren(parent, children);
-                    parent.applyPendingChanges();
-                }
-
-                for (SelectionItem cs : selection) {
-                    CanvasViewInfo vi = cs.getViewInfo();
-                    // You can't delete the root element
-                    if (vi != null && !vi.isRoot()) {
-                        UiViewElementNode ui = vi.getUiViewNode();
-                        if (ui != null) {
-                            ui.deleteXmlNode();
-                        }
-                    }
-                }
-            }
-        });
-    }
-
-    /**
-     * Perform the "Paste" action, either from the Edit menu or from the context
-     * menu.
-     *
-     * @param selection A list of selection items to add to the clipboard;
-     *            <b>this should be a copy already - this method will not make a
-     *            copy</b>
-     */
-    public void pasteSelection(List<SelectionItem> selection) {
-
-        SimpleXmlTransfer sxt = SimpleXmlTransfer.getInstance();
-        final SimpleElement[] pasted = (SimpleElement[]) mClipboard.getContents(sxt);
-
-        if (pasted == null || pasted.length == 0) {
-            return;
-        }
-
-        CanvasViewInfo lastRoot = mCanvas.getViewHierarchy().getRoot();
-        if (lastRoot == null) {
-            // Pasting in an empty document. Only paste the first element.
-            pasteInEmptyDocument(pasted[0]);
-            return;
-        }
-
-        // Otherwise use the current selection, if any, as a guide where to paste
-        // using the first selected element only. If there's no selection use
-        // the root as the insertion point.
-        SelectionManager.sanitize(selection);
-        final CanvasViewInfo target;
-        if (selection.size() > 0) {
-            SelectionItem cs = selection.get(0);
-            target = cs.getViewInfo();
-        } else {
-            target = lastRoot;
-        }
-
-        final NodeProxy targetNode = mCanvas.getNodeFactory().create(target);
-        mCanvas.getEditorDelegate().getEditor().wrapUndoEditXmlModel("Paste", new Runnable() {
-            @Override
-            public void run() {
-                RulesEngine engine = mCanvas.getRulesEngine();
-                NodeProxy node = engine.callOnPaste(targetNode, target.getViewObject(), pasted);
-                node.applyPendingChanges();
-            }
-        });
-    }
-
-    /**
-     * Paste a new root into an empty XML layout.
-     * <p/>
-     * In case of error (unknown FQCN, document not empty), silently do nothing.
-     * In case of success, the new element will have some default attributes set (xmlns:android,
-     * layout_width and height). The edit is wrapped in a proper undo.
-     * <p/>
-     * Implementation is similar to {@link #createDocumentRoot} except we also
-     * copy all the attributes and inner elements recursively.
-     */
-    private void pasteInEmptyDocument(final IDragElement pastedElement) {
-        String rootFqcn = pastedElement.getFqcn();
-
-        // Need a valid empty document to create the new root
-        final LayoutEditorDelegate delegate = mCanvas.getEditorDelegate();
-        final UiDocumentNode uiDoc = delegate.getUiRootNode();
-        if (uiDoc == null || uiDoc.getUiChildren().size() > 0) {
-            debugPrintf("Failed to paste document root for %1$s: document is not empty", rootFqcn);
-            return;
-        }
-
-        // Find the view descriptor matching our FQCN
-        final ViewElementDescriptor viewDesc = delegate.getFqcnViewDescriptor(rootFqcn);
-        if (viewDesc == null) {
-            // TODO this could happen if pasting a custom view not known in this project
-            debugPrintf("Failed to paste document root, unknown FQCN %1$s", rootFqcn);
-            return;
-        }
-
-        // Get the last segment of the FQCN for the undo title
-        String title = rootFqcn;
-        int pos = title.lastIndexOf('.');
-        if (pos > 0 && pos < title.length() - 1) {
-            title = title.substring(pos + 1);
-        }
-        title = String.format("Paste root %1$s in document", title);
-
-        delegate.getEditor().wrapUndoEditXmlModel(title, new Runnable() {
-            @Override
-            public void run() {
-                UiElementNode uiNew = uiDoc.appendNewUiChild(viewDesc);
-
-                // A root node requires the Android XMLNS
-                uiNew.setAttributeValue(ANDROID_NS_NAME, XMLNS_URI, NS_RESOURCES,
-                        true /*override*/);
-
-                // Copy all the attributes from the pasted element
-                for (IDragAttribute attr : pastedElement.getAttributes()) {
-                    uiNew.setAttributeValue(
-                            attr.getName(),
-                            attr.getUri(),
-                            attr.getValue(),
-                            true /*override*/);
-                }
-
-                // Adjust the attributes, adding the default layout_width/height
-                // only if they are not present (the original element should have
-                // them though.)
-                DescriptorsUtils.setDefaultLayoutAttributes(uiNew, false /*updateLayout*/);
-
-                uiNew.createXmlNode();
-
-                // Now process all children
-                for (IDragElement childElement : pastedElement.getInnerElements()) {
-                    addChild(uiNew, childElement);
-                }
-            }
-
-            private void addChild(UiElementNode uiParent, IDragElement childElement) {
-                String childFqcn = childElement.getFqcn();
-                final ViewElementDescriptor childDesc =
-                    delegate.getFqcnViewDescriptor(childFqcn);
-                if (childDesc == null) {
-                    // TODO this could happen if pasting a custom view
-                    debugPrintf("Failed to paste element, unknown FQCN %1$s", childFqcn);
-                    return;
-                }
-
-                UiElementNode uiChild = uiParent.appendNewUiChild(childDesc);
-
-                // Copy all the attributes from the pasted element
-                for (IDragAttribute attr : childElement.getAttributes()) {
-                    uiChild.setAttributeValue(
-                            attr.getName(),
-                            attr.getUri(),
-                            attr.getValue(),
-                            true /*override*/);
-                }
-
-                // Adjust the attributes, adding the default layout_width/height
-                // only if they are not present (the original element should have
-                // them though.)
-                DescriptorsUtils.setDefaultLayoutAttributes(
-                        uiChild, false /*updateLayout*/);
-
-                uiChild.createXmlNode();
-
-                // Now process all grand children
-                for (IDragElement grandChildElement : childElement.getInnerElements()) {
-                    addChild(uiChild, grandChildElement);
-                }
-            }
-        });
-    }
-
-    /**
-     * Returns true if we have a a simple xml transfer data object on the
-     * clipboard.
-     *
-     * @return True if and only if the clipboard contains one of XML element
-     *         objects.
-     */
-    public boolean hasSxtOnClipboard() {
-        // The paste operation is only available if we can paste our custom type.
-        // We do not currently support pasting random text (e.g. XML). Maybe later.
-        SimpleXmlTransfer sxt = SimpleXmlTransfer.getInstance();
-        for (TransferData td : mClipboard.getAvailableTypes()) {
-            if (sxt.isSupportedType(td)) {
-                return true;
-            }
-        }
-
-        return false;
-    }
-
-    private void debugPrintf(String message, Object... params) {
-        if (DEBUG) AdtPlugin.printToConsole("Clipboard", String.format(message, params));
-    }
-
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/ControlPoint.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/ControlPoint.java
deleted file mode 100644
index 55930f6..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/ControlPoint.java
+++ /dev/null
@@ -1,195 +0,0 @@
-/*
- * Copyright (C) 2010 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.editors.layout.gle2;
-
-import org.eclipse.swt.dnd.DragSourceEvent;
-import org.eclipse.swt.dnd.DragSourceListener;
-import org.eclipse.swt.dnd.DropTargetEvent;
-import org.eclipse.swt.events.MenuDetectEvent;
-import org.eclipse.swt.events.MouseEvent;
-import org.eclipse.swt.events.MouseListener;
-import org.eclipse.swt.graphics.Point;
-
-/**
- * A {@link ControlPoint} is a coordinate in the canvas control which corresponds
- * exactly to (0,0) at the top left of the canvas. It is unaffected by canvas
- * zooming.
- */
-public final class ControlPoint {
-    /** Containing canvas which the point is relative to. */
-    private final LayoutCanvas mCanvas;
-
-    /** The X coordinate of the mouse coordinate. */
-    public final int x;
-
-    /** The Y coordinate of the mouse coordinate. */
-    public final int y;
-
-    /**
-     * Constructs a new {@link ControlPoint} from the given event. The event
-     * must be from a {@link MouseListener} associated with the
-     * {@link LayoutCanvas} such that the {@link MouseEvent#x} and
-     * {@link MouseEvent#y} fields are relative to the canvas.
-     *
-     * @param canvas The {@link LayoutCanvas} this point is within.
-     * @param event The mouse event to construct the {@link ControlPoint}
-     *            from.
-     * @return A {@link ControlPoint} which corresponds to the given
-     *         {@link MouseEvent}.
-     */
-    public static ControlPoint create(LayoutCanvas canvas, MouseEvent event) {
-        // The mouse event coordinates should already be relative to the canvas
-        // widget.
-        assert event.widget == canvas : event.widget;
-        return new ControlPoint(canvas, event.x, event.y);
-    }
-
-    /**
-     * Constructs a new {@link ControlPoint} from the given menu detect event.
-     *
-     * @param canvas The {@link LayoutCanvas} this point is within.
-     * @param event The menu detect event to construct the {@link ControlPoint} from.
-     * @return A {@link ControlPoint} which corresponds to the given
-     *         {@link MenuDetectEvent}.
-     */
-    public static ControlPoint create(LayoutCanvas canvas, MenuDetectEvent event) {
-        // The menu detect events are always display-relative.
-        org.eclipse.swt.graphics.Point p = canvas.toControl(event.x, event.y);
-        return new ControlPoint(canvas, p.x, p.y);
-    }
-
-    /**
-     * Constructs a new {@link ControlPoint} from the given event. The event
-     * must be from a {@link DragSourceListener} associated with the
-     * {@link LayoutCanvas} such that the {@link DragSourceEvent#x} and
-     * {@link DragSourceEvent#y} fields are relative to the canvas.
-     *
-     * @param canvas The {@link LayoutCanvas} this point is within.
-     * @param event The mouse event to construct the {@link ControlPoint}
-     *            from.
-     * @return A {@link ControlPoint} which corresponds to the given
-     *         {@link DragSourceEvent}.
-     */
-    public static ControlPoint create(LayoutCanvas canvas, DragSourceEvent event) {
-        // The drag source event coordinates should already be relative to the
-        // canvas widget.
-        return new ControlPoint(canvas, event.x, event.y);
-    }
-
-    /**
-     * Constructs a new {@link ControlPoint} from the given event.
-     *
-     * @param canvas The {@link LayoutCanvas} this point is within.
-     * @param event The mouse event to construct the {@link ControlPoint}
-     *            from.
-     * @return A {@link ControlPoint} which corresponds to the given
-     *         {@link DropTargetEvent}.
-     */
-    public static ControlPoint create(LayoutCanvas canvas, DropTargetEvent event) {
-        // The drop target events are always relative to the display, so we must
-        // first convert them to be canvas relative.
-        org.eclipse.swt.graphics.Point p = canvas.toControl(event.x, event.y);
-        return new ControlPoint(canvas, p.x, p.y);
-    }
-
-    /**
-     * Constructs a new {@link ControlPoint} from the given x,y coordinates,
-     * which must be relative to the given {@link LayoutCanvas}.
-     *
-     * @param canvas The {@link LayoutCanvas} this point is within.
-     * @param x The mouse event x coordinate relative to the canvas
-     * @param y The mouse event x coordinate relative to the canvas
-     * @return A {@link ControlPoint} which corresponds to the given
-     *         coordinates.
-     */
-    public static ControlPoint create(LayoutCanvas canvas, int x, int y) {
-        return new ControlPoint(canvas, x, y);
-    }
-
-    /**
-     * Constructs a new canvas control coordinate with the given X and Y
-     * coordinates. This is private; use one of the factory methods
-     * {@link #create(LayoutCanvas, MouseEvent)},
-     * {@link #create(LayoutCanvas, DragSourceEvent)} or
-     * {@link #create(LayoutCanvas, DropTargetEvent)} instead.
-     *
-     * @param canvas The canvas which contains this coordinate
-     * @param x The mouse x coordinate
-     * @param y The mouse y coordinate
-     */
-    private ControlPoint(LayoutCanvas canvas, int x, int y) {
-        mCanvas = canvas;
-        this.x = x;
-        this.y = y;
-    }
-
-    /**
-     * Returns the equivalent {@link LayoutPoint} to this
-     * {@link ControlPoint}.
-     *
-     * @return The equivalent {@link LayoutPoint} to this
-     *         {@link ControlPoint}.
-     */
-    public LayoutPoint toLayout() {
-        int lx = mCanvas.getHorizontalTransform().inverseTranslate(x);
-        int ly = mCanvas.getVerticalTransform().inverseTranslate(y);
-
-        return LayoutPoint.create(mCanvas, lx, ly);
-    }
-
-    @Override
-    public String toString() {
-        return "ControlPoint [x=" + x + ", y=" + y + "]"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-    }
-
-    @Override
-    public int hashCode() {
-        final int prime = 31;
-        int result = 1;
-        result = prime * result + x;
-        result = prime * result + y;
-        return result;
-    }
-
-    @Override
-    public boolean equals(Object obj) {
-        if (this == obj)
-            return true;
-        if (obj == null)
-            return false;
-        if (getClass() != obj.getClass())
-            return false;
-        ControlPoint other = (ControlPoint) obj;
-        if (x != other.x)
-            return false;
-        if (y != other.y)
-            return false;
-        if (mCanvas != other.mCanvas) {
-            return false;
-        }
-        return true;
-    }
-
-    /**
-     * Returns this point as an SWT point in the display coordinate system
-     *
-     * @return this point as an SWT point in the display coordinate system
-     */
-    public Point toDisplayPoint() {
-        return mCanvas.toDisplay(x, y);
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/CreateNewConfigJob.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/CreateNewConfigJob.java
deleted file mode 100644
index 44cd081..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/CreateNewConfigJob.java
+++ /dev/null
@@ -1,132 +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.ide.eclipse.adt.internal.editors.layout.gle2;
-
-import com.android.annotations.NonNull;
-import com.android.ide.common.resources.configuration.FolderConfiguration;
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.ide.eclipse.adt.AdtUtils;
-import com.android.ide.eclipse.adt.internal.editors.layout.configuration.ConfigurationChooser;
-import com.android.ide.eclipse.adt.internal.resources.manager.ResourceManager;
-import com.android.resources.ResourceFolderType;
-import com.google.common.base.Charsets;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IFolder;
-import org.eclipse.core.resources.IWorkspaceRoot;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.core.runtime.jobs.Job;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.ui.PartInitException;
-
-import java.io.ByteArrayInputStream;
-import java.io.IOException;
-
-/** Job which creates a new layout file for a given configuration */
-class CreateNewConfigJob extends Job {
-    private final GraphicalEditorPart mEditor;
-    private final IFile mFromFile;
-    private final FolderConfiguration mConfig;
-
-    CreateNewConfigJob(
-            @NonNull GraphicalEditorPart editor,
-            @NonNull IFile fromFile,
-            @NonNull FolderConfiguration config) {
-        super("Create Alternate Layout");
-        mEditor = editor;
-        mFromFile = fromFile;
-        mConfig = config;
-    }
-
-    @Override
-    protected IStatus run(IProgressMonitor monitor) {
-        // get the folder name
-        String folderName = mConfig.getFolderName(ResourceFolderType.LAYOUT);
-        try {
-            // look to see if it exists.
-            // get the res folder
-            IFolder res = (IFolder) mFromFile.getParent().getParent();
-
-            IFolder newParentFolder = res.getFolder(folderName);
-            AdtUtils.ensureExists(newParentFolder);
-            final IFile file = newParentFolder.getFile(mFromFile.getName());
-            if (file.exists()) {
-                String message = String.format("File 'res/%1$s/%2$s' already exists!",
-                        folderName, mFromFile.getName());
-                return new Status(IStatus.ERROR, AdtPlugin.PLUGIN_ID, message);
-            }
-
-            // Read current document contents instead of from file: mFromFile.getContents()
-            String text = mEditor.getEditorDelegate().getEditor().getStructuredDocument().get();
-            ByteArrayInputStream input = new ByteArrayInputStream(text.getBytes(Charsets.UTF_8));
-            file.create(input, false, monitor);
-            input.close();
-
-            // Ensure that the project resources updates itself to notice the new configuration.
-            // In theory, this shouldn't be necessary, but we need to make sure the
-            // resource manager knows about this immediately such that the call below
-            // to find the best configuration takes the new folder into account.
-            ResourceManager resourceManager = ResourceManager.getInstance();
-            IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
-            IFolder folder = root.getFolder(newParentFolder.getFullPath());
-            resourceManager.getResourceFolder(folder);
-
-            // Switch to the new file
-            Display display = mEditor.getConfigurationChooser().getDisplay();
-            display.asyncExec(new Runnable() {
-                @Override
-                public void run() {
-                    // The given old layout has been forked into a new layout
-                    // for a given configuration. This means that the old layout
-                    // is no longer a match for the configuration, which is
-                    // probably what it is still showing. We have to modify
-                    // its configuration to no longer be an impossible
-                    // configuration.
-                    ConfigurationChooser chooser = mEditor.getConfigurationChooser();
-                    chooser.onAlternateLayoutCreated();
-
-                    // Finally open the new layout
-                    try {
-                        AdtPlugin.openFile(file, null, false);
-                    } catch (PartInitException e) {
-                        AdtPlugin.log(e, null);
-                    }
-                }
-            });
-        } catch (IOException e2) {
-            String message = String.format(
-                    "Failed to create File 'res/%1$s/%2$s' : %3$s",
-                    folderName, mFromFile.getName(), e2.getMessage());
-            AdtPlugin.displayError("Layout Creation", message);
-
-            return new Status(IStatus.ERROR, AdtPlugin.PLUGIN_ID,
-                    message, e2);
-        } catch (CoreException e2) {
-            String message = String.format(
-                    "Failed to create File 'res/%1$s/%2$s' : %3$s",
-                    folderName, mFromFile.getName(), e2.getMessage());
-            AdtPlugin.displayError("Layout Creation", message);
-
-            return e2.getStatus();
-        }
-
-        return Status.OK_STATUS;
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/CustomViewFinder.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/CustomViewFinder.java
deleted file mode 100644
index 1f97c8c..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/CustomViewFinder.java
+++ /dev/null
@@ -1,395 +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.eclipse.adt.internal.editors.layout.gle2;
-
-import static com.android.SdkConstants.CLASS_VIEW;
-import static com.android.SdkConstants.CLASS_VIEWGROUP;
-import static com.android.SdkConstants.FN_FRAMEWORK_LIBRARY;
-
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.ide.eclipse.adt.internal.project.BaseProjectHelper;
-import com.android.ide.eclipse.adt.internal.sdk.ProjectState;
-import com.android.ide.eclipse.adt.internal.sdk.Sdk;
-import com.android.utils.Pair;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.core.runtime.QualifiedName;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.core.runtime.jobs.Job;
-import org.eclipse.jdt.core.Flags;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.IMethod;
-import org.eclipse.jdt.core.IPackageFragment;
-import org.eclipse.jdt.core.IType;
-import org.eclipse.jdt.core.JavaModelException;
-import org.eclipse.jdt.core.search.IJavaSearchConstants;
-import org.eclipse.jdt.core.search.IJavaSearchScope;
-import org.eclipse.jdt.core.search.SearchEngine;
-import org.eclipse.jdt.core.search.SearchMatch;
-import org.eclipse.jdt.core.search.SearchParticipant;
-import org.eclipse.jdt.core.search.SearchPattern;
-import org.eclipse.jdt.core.search.SearchRequestor;
-import org.eclipse.jdt.internal.core.ResolvedBinaryType;
-import org.eclipse.jdt.internal.core.ResolvedSourceType;
-import org.eclipse.swt.widgets.Display;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-/**
- * The {@link CustomViewFinder} can look up the custom views and third party views
- * available for a given project.
- */
-@SuppressWarnings("restriction") // JDT model access for custom-view class lookup
-public class CustomViewFinder {
-    /**
-     * Qualified name for the per-project non-persistent property storing the
-     * {@link CustomViewFinder} for this project
-     */
-    private final static QualifiedName CUSTOM_VIEW_FINDER = new QualifiedName(AdtPlugin.PLUGIN_ID,
-            "viewfinder"); //$NON-NLS-1$
-
-    /** Project that this view finder locates views for */
-    private final IProject mProject;
-
-    private final List<Listener> mListeners = new ArrayList<Listener>();
-
-    private List<String> mCustomViews;
-    private List<String> mThirdPartyViews;
-    private boolean mRefreshing;
-
-    /**
-     * Constructs an {@link CustomViewFinder} for the given project. Don't use this method;
-     * use the {@link #get} factory method instead.
-     *
-     * @param project project to create an {@link CustomViewFinder} for
-     */
-    private CustomViewFinder(IProject project) {
-        mProject = project;
-    }
-
-    /**
-     * Returns the {@link CustomViewFinder} for the given project
-     *
-     * @param project the project the finder is associated with
-     * @return a {@CustomViewFinder} for the given project, never null
-     */
-    public static CustomViewFinder get(IProject project) {
-        CustomViewFinder finder = null;
-        try {
-            finder = (CustomViewFinder) project.getSessionProperty(CUSTOM_VIEW_FINDER);
-        } catch (CoreException e) {
-            // Not a problem; we will just create a new one
-        }
-
-        if (finder == null) {
-            finder = new CustomViewFinder(project);
-            try {
-                project.setSessionProperty(CUSTOM_VIEW_FINDER, finder);
-            } catch (CoreException e) {
-                AdtPlugin.log(e, "Can't store CustomViewFinder");
-            }
-        }
-
-        return finder;
-    }
-
-    public void refresh() {
-        refresh(null /*listener*/, true /* sync */);
-    }
-
-    public void refresh(final Listener listener) {
-        refresh(listener, false /* sync */);
-    }
-
-    private void refresh(final Listener listener, boolean sync) {
-        // Add this listener to the list of listeners which should be notified when the
-        // search is done. (There could be more than one since multiple requests could
-        // arrive for a slow search since the search is run in a different thread).
-        if (listener != null) {
-            synchronized (this) {
-                mListeners.add(listener);
-            }
-        }
-        synchronized (this) {
-            if (listener != null) {
-                mListeners.add(listener);
-            }
-            if (mRefreshing) {
-                return;
-            }
-            mRefreshing = true;
-        }
-
-        FindViewsJob job = new FindViewsJob();
-        job.schedule();
-        if (sync) {
-            try {
-                job.join();
-            } catch (InterruptedException e) {
-                AdtPlugin.log(e, null);
-            }
-        }
-    }
-
-    public Collection<String> getCustomViews() {
-        return mCustomViews == null ? null : Collections.unmodifiableCollection(mCustomViews);
-    }
-
-    public Collection<String> getThirdPartyViews() {
-        return mThirdPartyViews == null
-            ? null : Collections.unmodifiableCollection(mThirdPartyViews);
-    }
-
-    public Collection<String> getAllViews() {
-        // Not yet initialized: return null
-        if (mCustomViews == null) {
-            return null;
-        }
-        List<String> all = new ArrayList<String>(mCustomViews.size() + mThirdPartyViews.size());
-        all.addAll(mCustomViews);
-        all.addAll(mThirdPartyViews);
-        return all;
-    }
-
-    /**
-     * Returns a pair of view lists - the custom views and the 3rd-party views.
-     * This method performs no caching; it is the same as asking the custom view finder
-     * to refresh itself and then waiting for the answer and returning it.
-     *
-     * @param project the Android project
-     * @param layoutsOnly if true, only search for layouts
-     * @return a pair of lists, the first containing custom views and the second
-     *         containing 3rd party views
-     */
-    public static Pair<List<String>,List<String>> findViews(
-            final IProject project, boolean layoutsOnly) {
-        CustomViewFinder finder = get(project);
-
-        return finder.findViews(layoutsOnly);
-    }
-
-    private Pair<List<String>,List<String>> findViews(final boolean layoutsOnly) {
-        final Set<String> customViews = new HashSet<String>();
-        final Set<String> thirdPartyViews = new HashSet<String>();
-
-        ProjectState state = Sdk.getProjectState(mProject);
-        final List<IProject> libraries = state != null
-            ? state.getFullLibraryProjects() : Collections.<IProject>emptyList();
-
-        SearchRequestor requestor = new SearchRequestor() {
-            @Override
-            public void acceptSearchMatch(SearchMatch match) throws CoreException {
-                // Ignore matches in comments
-                if (match.isInsideDocComment()) {
-                    return;
-                }
-
-                Object element = match.getElement();
-                if (element instanceof ResolvedBinaryType) {
-                    // Third party view
-                    ResolvedBinaryType type = (ResolvedBinaryType) element;
-                    IPackageFragment fragment = type.getPackageFragment();
-                    IPath path = fragment.getPath();
-                    String last = path.lastSegment();
-                    // Filter out android.jar stuff
-                    if (last.equals(FN_FRAMEWORK_LIBRARY)) {
-                        return;
-                    }
-                    if (!isValidView(type, layoutsOnly)) {
-                        return;
-                    }
-
-                    IProject matchProject = match.getResource().getProject();
-                    if (mProject == matchProject || libraries.contains(matchProject)) {
-                        String fqn = type.getFullyQualifiedName();
-                        thirdPartyViews.add(fqn);
-                    }
-                } else if (element instanceof ResolvedSourceType) {
-                    // User custom view
-                    IProject matchProject = match.getResource().getProject();
-                    if (mProject == matchProject || libraries.contains(matchProject)) {
-                        ResolvedSourceType type = (ResolvedSourceType) element;
-                        if (!isValidView(type, layoutsOnly)) {
-                            return;
-                        }
-                        String fqn = type.getFullyQualifiedName();
-                        fqn = fqn.replace('$', '.');
-                        customViews.add(fqn);
-                    }
-                }
-            }
-        };
-        try {
-            IJavaProject javaProject = BaseProjectHelper.getJavaProject(mProject);
-            if (javaProject != null) {
-                String className = layoutsOnly ? CLASS_VIEWGROUP : CLASS_VIEW;
-                IType viewType = javaProject.findType(className);
-                if (viewType != null) {
-                    IJavaSearchScope scope = SearchEngine.createHierarchyScope(viewType);
-                    SearchParticipant[] participants = new SearchParticipant[] {
-                        SearchEngine.getDefaultSearchParticipant()
-                    };
-                    int matchRule = SearchPattern.R_PATTERN_MATCH | SearchPattern.R_CASE_SENSITIVE;
-
-                    SearchPattern pattern = SearchPattern.createPattern("*",
-                            IJavaSearchConstants.CLASS, IJavaSearchConstants.IMPLEMENTORS,
-                            matchRule);
-                    SearchEngine engine = new SearchEngine();
-                    engine.search(pattern, participants, scope, requestor,
-                            new NullProgressMonitor());
-                }
-            }
-        } catch (CoreException e) {
-            AdtPlugin.log(e, null);
-        }
-
-
-        List<String> custom = new ArrayList<String>(customViews);
-        List<String> thirdParty = new ArrayList<String>(thirdPartyViews);
-
-        if (!layoutsOnly) {
-            // Update our cached answers (unless we were filtered on only layouts)
-            mCustomViews = custom;
-            mThirdPartyViews = thirdParty;
-        }
-
-        return Pair.of(custom, thirdParty);
-    }
-
-    /**
-     * Determines whether the given member is a valid android.view.View to be added to the
-     * list of custom views or third party views. It checks that the view is public and
-     * not abstract for example.
-     */
-    private static boolean isValidView(IType type, boolean layoutsOnly)
-            throws JavaModelException {
-        // Skip anonymous classes
-        if (type.isAnonymous()) {
-            return false;
-        }
-        int flags = type.getFlags();
-        if (Flags.isAbstract(flags) || !Flags.isPublic(flags)) {
-            return false;
-        }
-
-        // TODO: if (layoutsOnly) perhaps try to filter out AdapterViews and other ViewGroups
-        // not willing to accept children via XML
-
-        // See if the class has one of the acceptable constructors
-        // needed for XML instantiation:
-        //    View(Context context)
-        //    View(Context context, AttributeSet attrs)
-        //    View(Context context, AttributeSet attrs, int defStyle)
-        // We don't simply do three direct checks via type.getMethod() because the types
-        // are not resolved, so we don't know for each parameter if we will get the
-        // fully qualified or the unqualified class names.
-        // Instead, iterate over the methods and look for a match.
-        String typeName = type.getElementName();
-        for (IMethod method : type.getMethods()) {
-            // Only care about constructors
-            if (!method.getElementName().equals(typeName)) {
-                continue;
-            }
-
-            String[] parameterTypes = method.getParameterTypes();
-            if (parameterTypes == null || parameterTypes.length < 1 || parameterTypes.length > 3) {
-                continue;
-            }
-
-            String first = parameterTypes[0];
-            // Look for the parameter type signatures -- produced by
-            // JDT's Signature.createTypeSignature("Context", false /*isResolved*/);.
-            // This is not a typo; they were copy/pasted from the actual parameter names
-            // observed in the debugger examining these data structures.
-            if (first.equals("QContext;")                                   //$NON-NLS-1$
-                    || first.equals("Qandroid.content.Context;")) {         //$NON-NLS-1$
-                if (parameterTypes.length == 1) {
-                    return true;
-                }
-                String second = parameterTypes[1];
-                if (second.equals("QAttributeSet;")                         //$NON-NLS-1$
-                        || second.equals("Qandroid.util.AttributeSet;")) {  //$NON-NLS-1$
-                    if (parameterTypes.length == 2) {
-                        return true;
-                    }
-                    String third = parameterTypes[2];
-                    if (third.equals("I")) {                                //$NON-NLS-1$
-                        if (parameterTypes.length == 3) {
-                            return true;
-                        }
-                    }
-                }
-            }
-        }
-
-        return false;
-    }
-
-    /**
-     * Interface implemented by clients of the {@link CustomViewFinder} to be notified
-     * when a custom view search has completed. Will always be called on the SWT event
-     * dispatch thread.
-     */
-    public interface Listener {
-        void viewsUpdated(Collection<String> customViews, Collection<String> thirdPartyViews);
-    }
-
-    /**
-     * Job for performing class search off the UI thread. This is marked as a system job
-     * so that it won't show up in the progress monitor etc.
-     */
-    private class FindViewsJob extends Job {
-        FindViewsJob() {
-            super("Find Custom Views");
-            setSystem(true);
-        }
-        @Override
-        protected IStatus run(IProgressMonitor monitor) {
-            Pair<List<String>, List<String>> views = findViews(false);
-            mCustomViews = views.getFirst();
-            mThirdPartyViews = views.getSecond();
-
-            // Notify listeners on SWT's UI thread
-            Display.getDefault().asyncExec(new Runnable() {
-                @Override
-                public void run() {
-                    Collection<String> customViews =
-                        Collections.unmodifiableCollection(mCustomViews);
-                    Collection<String> thirdPartyViews =
-                        Collections.unmodifiableCollection(mThirdPartyViews);
-                    synchronized (this) {
-                        for (Listener l : mListeners) {
-                            l.viewsUpdated(customViews, thirdPartyViews);
-                        }
-                        mListeners.clear();
-                        mRefreshing = false;
-                    }
-                }
-            });
-            return Status.OK_STATUS;
-        }
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/DelegatingAction.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/DelegatingAction.java
deleted file mode 100644
index 7a41b5b..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/DelegatingAction.java
+++ /dev/null
@@ -1,203 +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.ide.eclipse.adt.internal.editors.layout.gle2;
-
-import com.android.annotations.NonNull;
-
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.action.IMenuCreator;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.util.IPropertyChangeListener;
-import org.eclipse.swt.events.HelpListener;
-import org.eclipse.swt.widgets.Event;
-
-/**
- * Implementation of {@link IAction} which delegates to a different
- * {@link IAction} which allows a subclass to wrap and customize some of the
- * behavior of a different action
- */
-public class DelegatingAction implements IAction {
-    private final IAction mAction;
-
-    /**
-     * Construct a new delegate of the given action
-     *
-     * @param action the action to be delegated
-     */
-    public DelegatingAction(@NonNull IAction action) {
-        mAction = action;
-    }
-
-    @Override
-    public void addPropertyChangeListener(IPropertyChangeListener listener) {
-        mAction.addPropertyChangeListener(listener);
-    }
-
-    @Override
-    public int getAccelerator() {
-        return mAction.getAccelerator();
-    }
-
-    @Override
-    public String getActionDefinitionId() {
-        return mAction.getActionDefinitionId();
-    }
-
-    @Override
-    public String getDescription() {
-        return mAction.getDescription();
-    }
-
-    @Override
-    public ImageDescriptor getDisabledImageDescriptor() {
-        return mAction.getDisabledImageDescriptor();
-    }
-
-    @Override
-    public HelpListener getHelpListener() {
-        return mAction.getHelpListener();
-    }
-
-    @Override
-    public ImageDescriptor getHoverImageDescriptor() {
-        return mAction.getHoverImageDescriptor();
-    }
-
-    @Override
-    public String getId() {
-        return mAction.getId();
-    }
-
-    @Override
-    public ImageDescriptor getImageDescriptor() {
-        return mAction.getImageDescriptor();
-    }
-
-    @Override
-    public IMenuCreator getMenuCreator() {
-        return mAction.getMenuCreator();
-    }
-
-    @Override
-    public int getStyle() {
-        return mAction.getStyle();
-    }
-
-    @Override
-    public String getText() {
-        return mAction.getText();
-    }
-
-    @Override
-    public String getToolTipText() {
-        return mAction.getToolTipText();
-    }
-
-    @Override
-    public boolean isChecked() {
-        return mAction.isChecked();
-    }
-
-    @Override
-    public boolean isEnabled() {
-        return mAction.isEnabled();
-    }
-
-    @Override
-    public boolean isHandled() {
-        return mAction.isHandled();
-    }
-
-    @Override
-    public void removePropertyChangeListener(IPropertyChangeListener listener) {
-        mAction.removePropertyChangeListener(listener);
-    }
-
-    @Override
-    public void run() {
-        mAction.run();
-    }
-
-    @Override
-    public void runWithEvent(Event event) {
-        mAction.runWithEvent(event);
-    }
-
-    @Override
-    public void setActionDefinitionId(String id) {
-        mAction.setActionDefinitionId(id);
-    }
-
-    @Override
-    public void setChecked(boolean checked) {
-        mAction.setChecked(checked);
-    }
-
-    @Override
-    public void setDescription(String text) {
-        mAction.setDescription(text);
-    }
-
-    @Override
-    public void setDisabledImageDescriptor(ImageDescriptor newImage) {
-        mAction.setDisabledImageDescriptor(newImage);
-    }
-
-    @Override
-    public void setEnabled(boolean enabled) {
-        mAction.setEnabled(enabled);
-    }
-
-    @Override
-    public void setHelpListener(HelpListener listener) {
-        mAction.setHelpListener(listener);
-    }
-
-    @Override
-    public void setHoverImageDescriptor(ImageDescriptor newImage) {
-        mAction.setHoverImageDescriptor(newImage);
-    }
-
-    @Override
-    public void setId(String id) {
-        mAction.setId(id);
-    }
-
-    @Override
-    public void setImageDescriptor(ImageDescriptor newImage) {
-        mAction.setImageDescriptor(newImage);
-    }
-
-    @Override
-    public void setMenuCreator(IMenuCreator creator) {
-        mAction.setMenuCreator(creator);
-    }
-
-    @Override
-    public void setText(String text) {
-        mAction.setText(text);
-    }
-
-    @Override
-    public void setToolTipText(String text) {
-        mAction.setToolTipText(text);
-    }
-
-    @Override
-    public void setAccelerator(int keycode) {
-        mAction.setAccelerator(keycode);
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/DomUtilities.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/DomUtilities.java
deleted file mode 100644
index 145036b..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/DomUtilities.java
+++ /dev/null
@@ -1,915 +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.eclipse.adt.internal.editors.layout.gle2;
-
-import static com.android.SdkConstants.ANDROID_URI;
-import static com.android.SdkConstants.ATTR_ID;
-import static com.android.SdkConstants.ID_PREFIX;
-import static com.android.SdkConstants.NEW_ID_PREFIX;
-import static com.android.SdkConstants.TOOLS_URI;
-import static org.eclipse.wst.xml.core.internal.provisional.contenttype.ContentTypeIdForXML.ContentTypeID_XML;
-
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.ide.eclipse.adt.internal.editors.AndroidXmlEditor;
-import com.android.ide.eclipse.adt.internal.editors.descriptors.DescriptorsUtils;
-import com.android.utils.Pair;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.jface.text.IDocument;
-import org.eclipse.wst.sse.core.StructuredModelManager;
-import org.eclipse.wst.sse.core.internal.provisional.IModelManager;
-import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
-import org.eclipse.wst.sse.core.internal.provisional.IndexedRegion;
-import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;
-import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocumentRegion;
-import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegion;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
-import org.eclipse.wst.xml.core.internal.regions.DOMRegionContext;
-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 org.xml.sax.InputSource;
-
-import java.io.StringReader;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Locale;
-import java.util.Set;
-
-import javax.xml.parsers.DocumentBuilder;
-import javax.xml.parsers.DocumentBuilderFactory;
-import javax.xml.parsers.ParserConfigurationException;
-
-/**
- * Various utility methods for manipulating DOM nodes.
- */
-@SuppressWarnings("restriction") // No replacement for restricted XML model yet
-public class DomUtilities {
-    /**
-     * Finds the nearest common parent of the two given nodes (which could be one of the
-     * two nodes as well)
-     *
-     * @param node1 the first node to test
-     * @param node2 the second node to test
-     * @return the nearest common parent of the two given nodes
-     */
-    @Nullable
-    public static Node getCommonAncestor(@NonNull Node node1, @NonNull Node node2) {
-        while (node2 != null) {
-            Node current = node1;
-            while (current != null && current != node2) {
-                current = current.getParentNode();
-            }
-            if (current == node2) {
-                return current;
-            }
-            node2 = node2.getParentNode();
-        }
-
-        return null;
-    }
-
-    /**
-     * Returns all elements below the given node (which can be a document,
-     * element, etc). This will include the node itself, if it is an element.
-     *
-     * @param node the node to search from
-     * @return all elements in the subtree formed by the node parameter
-     */
-    @NonNull
-    public static List<Element> getAllElements(@NonNull Node node) {
-        List<Element> elements = new ArrayList<Element>(64);
-        addElements(node, elements);
-        return elements;
-    }
-
-    private static void addElements(@NonNull Node node, @NonNull List<Element> elements) {
-        if (node instanceof Element) {
-            elements.add((Element) node);
-        }
-
-        NodeList childNodes = node.getChildNodes();
-        for (int i = 0, n = childNodes.getLength(); i < n; i++) {
-            addElements(childNodes.item(i), elements);
-        }
-    }
-
-    /**
-     * Returns the depth of the given node (with the document node having depth 0,
-     * and the document element having depth 1)
-     *
-     * @param node the node to test
-     * @return the depth in the document
-     */
-    public static int getDepth(@NonNull Node node) {
-        int depth = -1;
-        while (node != null) {
-            depth++;
-            node = node.getParentNode();
-        }
-
-        return depth;
-    }
-
-    /**
-     * Returns true if the given node has one or more element children
-     *
-     * @param node the node to test for element children
-     * @return true if the node has one or more element children
-     */
-    public static boolean hasElementChildren(@NonNull Node node) {
-        NodeList children = node.getChildNodes();
-        for (int i = 0, n = children.getLength(); i < n; i++) {
-            if (children.item(i).getNodeType() == Node.ELEMENT_NODE) {
-                return true;
-            }
-        }
-
-        return false;
-    }
-
-    /**
-     * Returns the DOM document for the given file
-     *
-     * @param file the XML file
-     * @return the document, or null if not found or not parsed properly (no
-     *         errors are generated/thrown)
-     */
-    @Nullable
-    public static Document getDocument(@NonNull IFile file) {
-        IModelManager modelManager = StructuredModelManager.getModelManager();
-        if (modelManager == null) {
-            return null;
-        }
-        try {
-            IStructuredModel model = modelManager.getExistingModelForRead(file);
-            if (model == null) {
-                model = modelManager.getModelForRead(file);
-            }
-            if (model != null) {
-                if (model instanceof IDOMModel) {
-                    IDOMModel domModel = (IDOMModel) model;
-                    return domModel.getDocument();
-                }
-                try {
-                } finally {
-                    model.releaseFromRead();
-                }
-            }
-        } catch (Exception e) {
-            // Ignore exceptions.
-        }
-
-        return null;
-    }
-
-    /**
-     * Returns the DOM document for the given editor
-     *
-     * @param editor the XML editor
-     * @return the document, or null if not found or not parsed properly (no
-     *         errors are generated/thrown)
-     */
-    @Nullable
-    public static Document getDocument(@NonNull AndroidXmlEditor editor) {
-        IStructuredModel model = editor.getModelForRead();
-        try {
-            if (model instanceof IDOMModel) {
-                IDOMModel domModel = (IDOMModel) model;
-                return domModel.getDocument();
-            }
-        } finally {
-            if (model != null) {
-                model.releaseFromRead();
-            }
-        }
-
-        return null;
-    }
-
-
-    /**
-     * Returns the XML DOM node corresponding to the given offset of the given
-     * document.
-     *
-     * @param document The document to look in
-     * @param offset The offset to look up the node for
-     * @return The node containing the offset, or null
-     */
-    @Nullable
-    public static Node getNode(@NonNull IDocument document, int offset) {
-        Node node = null;
-        IModelManager modelManager = StructuredModelManager.getModelManager();
-        if (modelManager == null) {
-            return null;
-        }
-        try {
-            IStructuredModel model = modelManager.getExistingModelForRead(document);
-            if (model != null) {
-                try {
-                    for (; offset >= 0 && node == null; --offset) {
-                        node = (Node) model.getIndexedRegion(offset);
-                    }
-                } finally {
-                    model.releaseFromRead();
-                }
-            }
-        } catch (Exception e) {
-            // Ignore exceptions.
-        }
-
-        return node;
-    }
-
-    /**
-     * Returns the editing context at the given offset, as a pair of parent node and child
-     * node. This is not the same as just calling {@link DomUtilities#getNode} and taking
-     * its parent node, because special care has to be taken to return content element
-     * positions.
-     * <p>
-     * For example, for the XML {@code <foo>^</foo>}, if the caret ^ is inside the foo
-     * element, between the opening and closing tags, then the foo element is the parent,
-     * and the child is null which represents a potential text node.
-     * <p>
-     * If the node is inside an element tag definition (between the opening and closing
-     * bracket) then the child node will be the element and whatever parent (element or
-     * document) will be its parent.
-     * <p>
-     * If the node is in a text node, then the text node will be the child and its parent
-     * element or document node its parent.
-     * <p>
-     * Finally, if the caret is on a boundary of a text node, then the text node will be
-     * considered the child, regardless of whether it is on the left or right of the
-     * caret. For example, in the XML {@code <foo>^ </foo>} and in the XML
-     * {@code <foo> ^</foo>}, in both cases the text node is preferred over the element.
-     *
-     * @param document the document to search in
-     * @param offset the offset to look up
-     * @return a pair of parent and child elements, where either the parent or the child
-     *         but not both can be null, and if non null the child.getParentNode() should
-     *         return the parent. Note that the method can also return null if no
-     *         document or model could be obtained or if the offset is invalid.
-     */
-    @Nullable
-    public static Pair<Node, Node> getNodeContext(@NonNull IDocument document, int offset) {
-        Node node = null;
-        IModelManager modelManager = StructuredModelManager.getModelManager();
-        if (modelManager == null) {
-            return null;
-        }
-        try {
-            IStructuredModel model = modelManager.getExistingModelForRead(document);
-            if (model != null) {
-                try {
-                    for (; offset >= 0 && node == null; --offset) {
-                        IndexedRegion indexedRegion = model.getIndexedRegion(offset);
-                        if (indexedRegion != null) {
-                            node = (Node) indexedRegion;
-
-                            if (node.getNodeType() == Node.TEXT_NODE) {
-                                return Pair.of(node.getParentNode(), node);
-                            }
-
-                            // Look at the structured document to see if
-                            // we have the special case where the caret is pointing at
-                            // a -potential- text node, e.g. <foo>^</foo>
-                            IStructuredDocument doc = model.getStructuredDocument();
-                            IStructuredDocumentRegion region =
-                                doc.getRegionAtCharacterOffset(offset);
-
-                            ITextRegion subRegion = region.getRegionAtCharacterOffset(offset);
-                            String type = subRegion.getType();
-                            if (DOMRegionContext.XML_END_TAG_OPEN.equals(type)) {
-                                // Try to return the text node if it's on the left
-                                // of this element node, such that replace strings etc
-                                // can be computed.
-                                Node lastChild = node.getLastChild();
-                                if (lastChild != null) {
-                                    IndexedRegion previousRegion = (IndexedRegion) lastChild;
-                                    if (previousRegion.getEndOffset() == offset) {
-                                        return Pair.of(node, lastChild);
-                                    }
-                                }
-                                return Pair.of(node, null);
-                            }
-
-                            return Pair.of(node.getParentNode(), node);
-                        }
-                    }
-                } finally {
-                    model.releaseFromRead();
-                }
-            }
-        } catch (Exception e) {
-            // Ignore exceptions.
-        }
-
-        return null;
-    }
-
-    /**
-     * Like {@link #getNode(IDocument, int)}, but has a bias parameter which lets you
-     * indicate whether you want the search to look forwards or backwards.
-     * This is vital when trying to compute a node range. Consider the following
-     * XML fragment:
-     * {@code
-     *    <a/><b/>[<c/><d/><e/>]<f/><g/>
-     * }
-     * Suppose we want to locate the nodes in the range indicated by the brackets above.
-     * If we want to search for the node corresponding to the start position, should
-     * we pick the node on its left or the node on its right? Similarly for the end
-     * position. Clearly, we'll need to bias the search towards the right when looking
-     * for the start position, and towards the left when looking for the end position.
-     * The following method lets us do just that. When passed an offset which sits
-     * on the edge of the computed node, it will pick the neighbor based on whether
-     * "forward" is true or false, where forward means searching towards the right
-     * and not forward is obviously towards the left.
-     * @param document the document to search in
-     * @param offset the offset to search for
-     * @param forward if true, search forwards, otherwise search backwards when on node boundaries
-     * @return the node which surrounds the given offset, or the node adjacent to the offset
-     *    where the side depends on the forward parameter
-     */
-    @Nullable
-    public static Node getNode(@NonNull IDocument document, int offset, boolean forward) {
-        Node node = getNode(document, offset);
-
-        if (node instanceof IndexedRegion) {
-            IndexedRegion region = (IndexedRegion) node;
-
-            if (!forward && offset <= region.getStartOffset()) {
-                Node left = node.getPreviousSibling();
-                if (left == null) {
-                    left = node.getParentNode();
-                }
-
-                node = left;
-            } else if (forward && offset >= region.getEndOffset()) {
-                Node right = node.getNextSibling();
-                if (right == null) {
-                    right = node.getParentNode();
-                }
-                node = right;
-            }
-        }
-
-        return node;
-    }
-
-    /**
-     * Returns a range of elements for the given caret range. Note that the two elements
-     * may not be at the same level so callers may want to perform additional input
-     * filtering.
-     *
-     * @param document the document to search in
-     * @param beginOffset the beginning offset of the range
-     * @param endOffset the ending offset of the range
-     * @return a pair of begin+end elements, or null
-     */
-    @Nullable
-    public static Pair<Element, Element> getElementRange(@NonNull IDocument document,
-            int beginOffset, int endOffset) {
-        Element beginElement = null;
-        Element endElement = null;
-        Node beginNode = getNode(document, beginOffset, true);
-        Node endNode = beginNode;
-        if (endOffset > beginOffset) {
-            endNode = getNode(document, endOffset, false);
-        }
-
-        if (beginNode == null || endNode == null) {
-            return null;
-        }
-
-        // Adjust offsets if you're pointing at text
-        if (beginNode.getNodeType() != Node.ELEMENT_NODE) {
-            // <foo> <bar1/> | <bar2/> </foo> => should pick <bar2/>
-            beginElement = getNextElement(beginNode);
-            if (beginElement == null) {
-                // Might be inside the end of a parent, e.g.
-                // <foo> <bar/> | </foo> => should pick <bar/>
-                beginElement = getPreviousElement(beginNode);
-                if (beginElement == null) {
-                    // We must be inside an empty element,
-                    // <foo> | </foo>
-                    // In that case just pick the parent.
-                    beginElement = getParentElement(beginNode);
-                }
-            }
-        } else {
-            beginElement = (Element) beginNode;
-        }
-
-        if (endNode.getNodeType() != Node.ELEMENT_NODE) {
-            // In the following, | marks the caret position:
-            // <foo> <bar1/> | <bar2/> </foo> => should pick <bar1/>
-            endElement = getPreviousElement(endNode);
-            if (endElement == null) {
-                // Might be inside the beginning of a parent, e.g.
-                // <foo> | <bar/></foo> => should pick <bar/>
-                endElement = getNextElement(endNode);
-                if (endElement == null) {
-                    // We must be inside an empty element,
-                    // <foo> | </foo>
-                    // In that case just pick the parent.
-                    endElement = getParentElement(endNode);
-                }
-            }
-        } else {
-            endElement = (Element) endNode;
-        }
-
-        if (beginElement != null && endElement != null) {
-            return Pair.of(beginElement, endElement);
-        }
-
-        return null;
-    }
-
-    /**
-     * Returns the next sibling element of the node, or null if there is no such element
-     *
-     * @param node the starting node
-     * @return the next sibling element, or null
-     */
-    @Nullable
-    public static Element getNextElement(@NonNull Node node) {
-        while (node != null && node.getNodeType() != Node.ELEMENT_NODE) {
-            node = node.getNextSibling();
-        }
-
-        return (Element) node; // may be null as well
-    }
-
-    /**
-     * Returns the previous sibling element of the node, or null if there is no such element
-     *
-     * @param node the starting node
-     * @return the previous sibling element, or null
-     */
-    @Nullable
-    public static Element getPreviousElement(@NonNull Node node) {
-        while (node != null && node.getNodeType() != Node.ELEMENT_NODE) {
-            node = node.getPreviousSibling();
-        }
-
-        return (Element) node; // may be null as well
-    }
-
-    /**
-     * Returns the closest ancestor element, or null if none
-     *
-     * @param node the starting node
-     * @return the closest parent element, or null
-     */
-    @Nullable
-    public static Element getParentElement(@NonNull Node node) {
-        while (node != null && node.getNodeType() != Node.ELEMENT_NODE) {
-            node = node.getParentNode();
-        }
-
-        return (Element) node; // may be null as well
-    }
-
-    /** Utility used by {@link #getFreeWidgetId(Element)} */
-    private static void addLowercaseIds(@NonNull Element root, @NonNull Set<String> seen) {
-        if (root.hasAttributeNS(ANDROID_URI, ATTR_ID)) {
-            String id = root.getAttributeNS(ANDROID_URI, ATTR_ID);
-            if (id.startsWith(NEW_ID_PREFIX)) {
-                // See getFreeWidgetId for details on locale
-                seen.add(id.substring(NEW_ID_PREFIX.length()).toLowerCase(Locale.US));
-            } else if (id.startsWith(ID_PREFIX)) {
-                seen.add(id.substring(ID_PREFIX.length()).toLowerCase(Locale.US));
-            } else {
-                seen.add(id.toLowerCase(Locale.US));
-            }
-        }
-    }
-
-    /**
-     * Returns a suitable new widget id (not including the {@code @id/} prefix) for the
-     * given element, which is guaranteed to be unique in this document
-     *
-     * @param element the element to compute a new widget id for
-     * @param reserved an optional set of extra, "reserved" set of ids that should be
-     *            considered taken
-     * @param prefix an optional prefix to use for the generated name, or null to get a
-     *            default (which is currently the tag name)
-     * @return a unique id, never null, which does not include the {@code @id/} prefix
-     * @see DescriptorsUtils#getFreeWidgetId
-     */
-    public static String getFreeWidgetId(
-            @NonNull Element element,
-            @Nullable Set<String> reserved,
-            @Nullable String prefix) {
-        Set<String> ids = new HashSet<String>();
-        if (reserved != null) {
-            for (String id : reserved) {
-                // Note that we perform locale-independent lowercase checks; in "Image" we
-                // want the lowercase version to be "image", not "?mage" where ? is
-                // the char LATIN SMALL LETTER DOTLESS I.
-
-                ids.add(id.toLowerCase(Locale.US));
-            }
-        }
-        addLowercaseIds(element.getOwnerDocument().getDocumentElement(), ids);
-
-        if (prefix == null) {
-            prefix = DescriptorsUtils.getBasename(element.getTagName());
-        }
-        String generated;
-        int num = 1;
-        do {
-            generated = String.format("%1$s%2$d", prefix, num++);   //$NON-NLS-1$
-        } while (ids.contains(generated.toLowerCase(Locale.US)));
-
-        return generated;
-    }
-
-    /**
-     * Returns the element children of the given element
-     *
-     * @param element the parent element
-     * @return a list of child elements, possibly empty but never null
-     */
-    @NonNull
-    public static List<Element> getChildren(@NonNull Element element) {
-        // Convenience to avoid lots of ugly DOM access casting
-        NodeList children = element.getChildNodes();
-        // An iterator would have been more natural (to directly drive the child list
-        // iteration) but iterators can't be used in enhanced for loops...
-        List<Element> result = new ArrayList<Element>(children.getLength());
-        for (int i = 0, n = children.getLength(); i < n; i++) {
-            Node node = children.item(i);
-            if (node.getNodeType() == Node.ELEMENT_NODE) {
-                Element child = (Element) node;
-                result.add(child);
-            }
-        }
-
-        return result;
-    }
-
-    /**
-     * Returns true iff the given elements are contiguous siblings
-     *
-     * @param elements the elements to be tested
-     * @return true if the elements are contiguous siblings with no gaps
-     */
-    public static boolean isContiguous(@NonNull List<Element> elements) {
-        if (elements.size() > 1) {
-            // All elements must be siblings (e.g. same parent)
-            Node parent = elements.get(0).getParentNode();
-            if (!(parent instanceof Element)) {
-                return false;
-            }
-            for (Element node : elements) {
-                if (parent != node.getParentNode()) {
-                    return false;
-                }
-            }
-
-            // Ensure that the siblings are contiguous; no gaps.
-            // If we've selected all the children of the parent then we don't need
-            // to look.
-            List<Element> siblings = DomUtilities.getChildren((Element) parent);
-            if (siblings.size() != elements.size()) {
-                Set<Element> nodeSet = new HashSet<Element>(elements);
-                boolean inRange = false;
-                int remaining = elements.size();
-                for (Element node : siblings) {
-                    boolean in = nodeSet.contains(node);
-                    if (in) {
-                        remaining--;
-                        if (remaining == 0) {
-                            break;
-                        }
-                        inRange = true;
-                    } else if (inRange) {
-                        return false;
-                    }
-                }
-            }
-        }
-
-        return true;
-    }
-
-    /**
-     * Determines whether two element trees are equivalent. Two element trees are
-     * equivalent if they represent the same DOM structure (elements, attributes, and
-     * children in order). This is almost the same as simply checking whether the String
-     * representations of the two nodes are identical, but this allows for minor
-     * variations that are not semantically significant, such as variations in formatting
-     * or ordering of the element attribute declarations, and the text children are
-     * ignored (this is such that in for example layout where content is only used for
-     * indentation the indentation differences are ignored). Null trees are never equal.
-     *
-     * @param element1 the first element to compare
-     * @param element2 the second element to compare
-     * @return true if the two element hierarchies are logically equal
-     */
-    public static boolean isEquivalent(@Nullable Element element1, @Nullable Element element2) {
-        if (element1 == null || element2 == null) {
-            return false;
-        }
-
-        if (!element1.getTagName().equals(element2.getTagName())) {
-            return false;
-        }
-
-        // Check attribute map
-        NamedNodeMap attributes1 = element1.getAttributes();
-        NamedNodeMap attributes2 = element2.getAttributes();
-
-        List<Attr> attributeNodes1 = new ArrayList<Attr>();
-        for (int i = 0, n = attributes1.getLength(); i < n; i++) {
-            Attr attribute = (Attr) attributes1.item(i);
-            // Ignore tools uri namespace attributes for equivalency test
-            if (TOOLS_URI.equals(attribute.getNamespaceURI())) {
-                continue;
-            }
-            attributeNodes1.add(attribute);
-        }
-        List<Attr> attributeNodes2 = new ArrayList<Attr>();
-        for (int i = 0, n = attributes2.getLength(); i < n; i++) {
-            Attr attribute = (Attr) attributes2.item(i);
-            // Ignore tools uri namespace attributes for equivalency test
-            if (TOOLS_URI.equals(attribute.getNamespaceURI())) {
-                continue;
-            }
-            attributeNodes2.add(attribute);
-        }
-
-        if (attributeNodes1.size() != attributeNodes2.size()) {
-            return false;
-        }
-
-        if (attributes1.getLength() > 0) {
-            Collections.sort(attributeNodes1, ATTRIBUTE_COMPARATOR);
-            Collections.sort(attributeNodes2, ATTRIBUTE_COMPARATOR);
-            for (int i = 0; i < attributeNodes1.size(); i++) {
-                Attr attr1 = attributeNodes1.get(i);
-                Attr attr2 = attributeNodes2.get(i);
-                if (attr1.getLocalName() == null || attr2.getLocalName() == null) {
-                    if (!attr1.getName().equals(attr2.getName())) {
-                        return false;
-                    }
-                } else if (!attr1.getLocalName().equals(attr2.getLocalName())) {
-                    return false;
-                }
-                if (!attr1.getValue().equals(attr2.getValue())) {
-                    return false;
-                }
-                if (attr1.getNamespaceURI() == null) {
-                    if (attr2.getNamespaceURI() != null) {
-                        return false;
-                    }
-                } else if (attr2.getNamespaceURI() == null) {
-                    return false;
-                } else if (!attr1.getNamespaceURI().equals(attr2.getNamespaceURI())) {
-                    return false;
-                }
-            }
-        }
-
-        NodeList children1 = element1.getChildNodes();
-        NodeList children2 = element2.getChildNodes();
-        int nextIndex1 = 0;
-        int nextIndex2 = 0;
-        while (true) {
-            while (nextIndex1 < children1.getLength() &&
-                    children1.item(nextIndex1).getNodeType() != Node.ELEMENT_NODE) {
-                nextIndex1++;
-            }
-
-            while (nextIndex2 < children2.getLength() &&
-                    children2.item(nextIndex2).getNodeType() != Node.ELEMENT_NODE) {
-                nextIndex2++;
-            }
-
-            Element nextElement1 = (Element) (nextIndex1 < children1.getLength()
-                    ? children1.item(nextIndex1) : null);
-            Element nextElement2 = (Element) (nextIndex2 < children2.getLength()
-                    ? children2.item(nextIndex2) : null);
-            if (nextElement1 == null) {
-                return nextElement2 == null;
-            } else if (nextElement2 == null) {
-                return false;
-            } else if (!isEquivalent(nextElement1, nextElement2)) {
-                return false;
-            }
-            nextIndex1++;
-            nextIndex2++;
-        }
-    }
-
-    /**
-     * Finds the corresponding element in a document to a given element in another
-     * document. Note that this does <b>not</b> do any kind of equivalence check
-     * (see {@link #isEquivalent(Element, Element)}), and currently the search
-     * is only by id; there is no structural search.
-     *
-     * @param element the element to find an equivalent for
-     * @param document the document to search for an equivalent element in
-     * @return an equivalent element, or null
-     */
-    @Nullable
-    public static Element findCorresponding(@NonNull Element element, @NonNull Document document) {
-        // Make sure the method is called correctly -- the element is for a different
-        // document than the one we are searching
-        assert element.getOwnerDocument() != document;
-
-        // First search by id. This allows us to find the corresponding
-        String id = element.getAttributeNS(ANDROID_URI, ATTR_ID);
-        if (id != null && id.length() > 0) {
-            if (id.startsWith(ID_PREFIX)) {
-                id = NEW_ID_PREFIX + id.substring(ID_PREFIX.length());
-            }
-
-            return findCorresponding(document.getDocumentElement(), id);
-        }
-
-        // TODO: Search by structure - look in the document and
-        // find a corresponding element in the same location in the structure,
-        // e.g. 4th child of root, 3rd child, 6th child, then pick node with tag "foo".
-
-        return null;
-    }
-
-    /** Helper method for {@link #findCorresponding(Element, Document)} */
-    @Nullable
-    private static Element findCorresponding(@NonNull Element element, @NonNull String targetId) {
-        String id = element.getAttributeNS(ANDROID_URI, ATTR_ID);
-        if (id != null) { // Work around DOM bug
-            if (id.equals(targetId)) {
-                return element;
-            } else if (id.startsWith(ID_PREFIX)) {
-                id = NEW_ID_PREFIX + id.substring(ID_PREFIX.length());
-                if (id.equals(targetId)) {
-                    return element;
-                }
-            }
-        }
-
-        NodeList children = element.getChildNodes();
-        for (int i = 0, n = children.getLength(); i < n; i++) {
-            Node node = children.item(i);
-            if (node.getNodeType() == Node.ELEMENT_NODE) {
-                Element child = (Element) node;
-                Element match = findCorresponding(child, targetId);
-                if (match != null) {
-                    return match;
-                }
-            }
-        }
-
-        return null;
-    }
-
-    /**
-     * Parses the given XML string as a DOM document, using Eclipse's structured
-     * XML model (which for example allows us to distinguish empty elements
-     * (<foo/>) from elements with no children (<foo></foo>).
-     *
-     * @param xml the XML content to be parsed (must be well formed)
-     * @return the DOM document, or null
-     */
-    @Nullable
-    public static Document parseStructuredDocument(@NonNull String xml) {
-        IStructuredModel model = createStructuredModel(xml);
-        if (model instanceof IDOMModel) {
-            IDOMModel domModel = (IDOMModel) model;
-            return domModel.getDocument();
-        }
-
-        return null;
-    }
-
-    /**
-     * Parses the given XML string and builds an Eclipse structured model for it.
-     *
-     * @param xml the XML content to be parsed (must be well formed)
-     * @return the structured model
-     */
-    @Nullable
-    public static IStructuredModel createStructuredModel(@NonNull String xml) {
-        IStructuredModel model = createEmptyModel();
-        IStructuredDocument document = model.getStructuredDocument();
-        model.aboutToChangeModel();
-        document.set(xml);
-        model.changedModel();
-
-        return model;
-    }
-
-    /**
-     * Creates an empty Eclipse XML model
-     *
-     * @return a new Eclipse XML model
-     */
-    @NonNull
-    public static IStructuredModel createEmptyModel() {
-        IModelManager modelManager = StructuredModelManager.getModelManager();
-        return modelManager.createUnManagedStructuredModelFor(ContentTypeID_XML);
-    }
-
-    /**
-     * Creates an empty Eclipse XML document
-     *
-     * @return an empty Eclipse XML document
-     */
-    @Nullable
-    public static Document createEmptyDocument() {
-        IStructuredModel model = createEmptyModel();
-        if (model instanceof IDOMModel) {
-            IDOMModel domModel = (IDOMModel) model;
-            return domModel.getDocument();
-        }
-
-        return null;
-    }
-
-    /**
-     * Creates an empty non-Eclipse XML document.
-     * This is used when you need to use XML operations not supported by
-     * the Eclipse XML model (such as serialization).
-     * <p>
-     * The new document will not validate, will ignore comments, and will
-     * support namespace.
-     *
-     * @return the new document
-     */
-    @Nullable
-    public static Document createEmptyPlainDocument() {
-        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
-        factory.setNamespaceAware(true);
-        factory.setValidating(false);
-        factory.setIgnoringComments(true);
-        DocumentBuilder builder;
-        try {
-            builder = factory.newDocumentBuilder();
-            return builder.newDocument();
-        } catch (ParserConfigurationException e) {
-            AdtPlugin.log(e, null);
-        }
-
-        return null;
-    }
-
-    /**
-     * Parses the given XML string as a DOM document, using the JDK parser.
-     * The parser does not validate, and is namespace aware.
-     *
-     * @param xml the XML content to be parsed (must be well formed)
-     * @param logParserErrors if true, log parser errors to the log, otherwise
-     *            silently return null
-     * @return the DOM document, or null
-     */
-    @Nullable
-    public static Document parseDocument(@NonNull String xml, boolean logParserErrors) {
-        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
-        InputSource is = new InputSource(new StringReader(xml));
-        factory.setNamespaceAware(true);
-        factory.setValidating(false);
-        try {
-            DocumentBuilder builder = factory.newDocumentBuilder();
-            return builder.parse(is);
-        } catch (Exception e) {
-            if (logParserErrors) {
-                AdtPlugin.log(e, null);
-            }
-        }
-
-        return null;
-    }
-
-    /** Can be used to sort attributes by name */
-    private static final Comparator<Attr> ATTRIBUTE_COMPARATOR = new Comparator<Attr>() {
-        @Override
-        public int compare(Attr a1, Attr a2) {
-            return a1.getName().compareTo(a2.getName());
-        }
-    };
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/DropGesture.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/DropGesture.java
deleted file mode 100644
index bb3be7f..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/DropGesture.java
+++ /dev/null
@@ -1,87 +0,0 @@
-/*
- * Copyright (C) 2010 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.editors.layout.gle2;
-
-import org.eclipse.swt.dnd.DropTargetEvent;
-import org.eclipse.swt.dnd.DropTargetListener;
-
-/**
- * A {@link DropGesture} is a {@link Gesture} which deals with drag and drop, so
- * it has additional hooks for indicating whether the current position is
- * "valid", and in general gets access to the system drag and drop data
- * structures. See the {@link Gesture} documentation for more details on whether
- * you should choose a plain {@link Gesture} or a {@link DropGesture}.
- */
-public abstract class DropGesture extends Gesture {
-    /**
-     * The cursor has entered the drop target boundaries.
-     *
-     * @param event The {@link DropTargetEvent} for this drag and drop event
-     * @see DropTargetListener#dragEnter(DropTargetEvent)
-     */
-    public void dragEnter(DropTargetEvent event) {
-    }
-
-    /**
-     * The cursor is moving over the drop target.
-     *
-     * @param event The {@link DropTargetEvent} for this drag and drop event
-     * @see DropTargetListener#dragOver(DropTargetEvent)
-     */
-    public void dragOver(DropTargetEvent event) {
-    }
-
-    /**
-     * The operation being performed has changed (usually due to the user
-     * changing the selected modifier key(s) while dragging).
-     *
-     * @param event The {@link DropTargetEvent} for this drag and drop event
-     * @see DropTargetListener#dragOperationChanged(DropTargetEvent)
-     */
-    public void dragOperationChanged(DropTargetEvent event) {
-    }
-
-    /**
-     * The cursor has left the drop target boundaries OR the drop has been
-     * canceled OR the data is about to be dropped.
-     *
-     * @param event The {@link DropTargetEvent} for this drag and drop event
-     * @see DropTargetListener#dragLeave(DropTargetEvent)
-     */
-    public void dragLeave(DropTargetEvent event) {
-    }
-
-    /**
-     * The drop is about to be performed. The drop target is given a last chance
-     * to change the nature of the drop.
-     *
-     * @param event The {@link DropTargetEvent} for this drag and drop event
-     * @see DropTargetListener#dropAccept(DropTargetEvent)
-     */
-    public void dropAccept(DropTargetEvent event) {
-    }
-
-    /**
-     * The data is being dropped. The data field contains java format of the
-     * data being dropped.
-     *
-     * @param event The {@link DropTargetEvent} for this drag and drop event
-     * @see DropTargetListener#drop(DropTargetEvent)
-     */
-    public void drop(final DropTargetEvent event) {
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/DynamicContextMenu.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/DynamicContextMenu.java
deleted file mode 100644
index fc71272..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/DynamicContextMenu.java
+++ /dev/null
@@ -1,654 +0,0 @@
-/*
- * Copyright (C) 2010 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.editors.layout.gle2;
-
-import static com.android.SdkConstants.ANDROID_URI;
-import static com.android.SdkConstants.ATTR_ID;
-import static com.android.SdkConstants.EXPANDABLE_LIST_VIEW;
-import static com.android.SdkConstants.FQCN_GESTURE_OVERLAY_VIEW;
-import static com.android.SdkConstants.FQCN_IMAGE_VIEW;
-import static com.android.SdkConstants.FQCN_LINEAR_LAYOUT;
-import static com.android.SdkConstants.FQCN_TEXT_VIEW;
-import static com.android.SdkConstants.GRID_VIEW;
-import static com.android.SdkConstants.LIST_VIEW;
-import static com.android.SdkConstants.SPINNER;
-import static com.android.SdkConstants.VIEW_FRAGMENT;
-
-import com.android.SdkConstants;
-import com.android.ide.common.api.INode;
-import com.android.ide.common.api.IViewRule;
-import com.android.ide.common.api.RuleAction;
-import com.android.ide.common.api.RuleAction.Choices;
-import com.android.ide.common.api.RuleAction.NestedAction;
-import com.android.ide.common.api.RuleAction.Toggle;
-import com.android.ide.common.layout.BaseViewRule;
-import com.android.ide.eclipse.adt.internal.editors.layout.LayoutEditorDelegate;
-import com.android.ide.eclipse.adt.internal.editors.layout.gre.NodeFactory;
-import com.android.ide.eclipse.adt.internal.editors.layout.gre.NodeProxy;
-import com.android.ide.eclipse.adt.internal.editors.layout.refactoring.ChangeLayoutAction;
-import com.android.ide.eclipse.adt.internal.editors.layout.refactoring.ChangeViewAction;
-import com.android.ide.eclipse.adt.internal.editors.layout.refactoring.ExtractIncludeAction;
-import com.android.ide.eclipse.adt.internal.editors.layout.refactoring.ExtractStyleAction;
-import com.android.ide.eclipse.adt.internal.editors.layout.refactoring.UnwrapAction;
-import com.android.ide.eclipse.adt.internal.editors.layout.refactoring.UseCompoundDrawableAction;
-import com.android.ide.eclipse.adt.internal.editors.layout.refactoring.WrapInAction;
-import com.android.ide.eclipse.adt.internal.editors.layout.uimodel.UiViewElementNode;
-
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.ActionContributionItem;
-import org.eclipse.jface.action.ContributionItem;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.action.IContributionItem;
-import org.eclipse.jface.action.IMenuListener;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.action.MenuManager;
-import org.eclipse.jface.action.Separator;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.Menu;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-/**
- * Helper class that is responsible for adding and managing the dynamic menu items
- * contributed by the {@link IViewRule} instances, based on the current selection
- * on the {@link LayoutCanvas}.
- * <p/>
- * This class is tied to a specific {@link LayoutCanvas} instance and a root {@link MenuManager}.
- * <p/>
- * Two instances of this are used: one created by {@link LayoutCanvas} and the other one
- * created by {@link OutlinePage}. Different root {@link MenuManager}s are populated, however
- * they are both linked to the current selection state of the {@link LayoutCanvas}.
- */
-class DynamicContextMenu {
-    public static String DEFAULT_ACTION_SHORTCUT = "F2"; //$NON-NLS-1$
-    public static int DEFAULT_ACTION_KEY = SWT.F2;
-
-    /** The XML layout editor that contains the canvas that uses this menu. */
-    private final LayoutEditorDelegate mEditorDelegate;
-
-    /** The layout canvas that displays this context menu. */
-    private final LayoutCanvas mCanvas;
-
-    /** The root menu manager of the context menu. */
-    private final MenuManager mMenuManager;
-
-    /**
-     * Creates a new helper responsible for adding and managing the dynamic menu items
-     * contributed by the {@link IViewRule} instances, based on the current selection
-     * on the {@link LayoutCanvas}.
-     * @param editorDelegate the editor owning the menu
-     * @param canvas The {@link LayoutCanvas} providing the selection, the node factory and
-     *   the rules engine.
-     * @param rootMenu The root of the context menu displayed. In practice this may be the
-     *   context menu manager of the {@link LayoutCanvas} or the one from {@link OutlinePage}.
-     */
-    public DynamicContextMenu(
-            LayoutEditorDelegate editorDelegate,
-            LayoutCanvas canvas,
-            MenuManager rootMenu) {
-        mEditorDelegate = editorDelegate;
-        mCanvas = canvas;
-        mMenuManager = rootMenu;
-
-        setupDynamicMenuActions();
-    }
-
-    /**
-     * Setups the menu manager to receive dynamic menu contributions from the {@link IViewRule}s
-     * when it's about to be shown.
-     */
-    private void setupDynamicMenuActions() {
-        // Remember how many static actions we have. Then each time the menu is
-        // shown, find dynamic contributions based on the current selection and insert
-        // them at the beginning of the menu.
-        final int numStaticActions = mMenuManager.getSize();
-        mMenuManager.addMenuListener(new IMenuListener() {
-            @Override
-            public void menuAboutToShow(IMenuManager manager) {
-
-                // Remove any previous dynamic contributions to keep only the
-                // default static items.
-                int n = mMenuManager.getSize() - numStaticActions;
-                if (n > 0) {
-                    IContributionItem[] items = mMenuManager.getItems();
-                    for (int i = 0; i < n; i++) {
-                        mMenuManager.remove(items[i]);
-                    }
-                }
-
-                // Now add all the dynamic menu actions depending on the current selection.
-                populateDynamicContextMenu();
-            }
-        });
-
-    }
-
-    /**
-     * This method is invoked by <code>menuAboutToShow</code> on {@link #mMenuManager}.
-     * All previous dynamic menu actions have been removed and this method can now insert
-     * any new actions that depend on the current selection.
-     */
-    private void populateDynamicContextMenu() {
-        //  Create the actual menu contributions
-        String endId = mMenuManager.getItems()[0].getId();
-
-        Separator sep = new Separator();
-        sep.setId("-dyn-gle-sep");  //$NON-NLS-1$
-        mMenuManager.insertBefore(endId, sep);
-        endId = sep.getId();
-
-        List<SelectionItem> selections = mCanvas.getSelectionManager().getSelections();
-        if (selections.size() == 0) {
-            return;
-        }
-        List<INode> nodes = new ArrayList<INode>(selections.size());
-        for (SelectionItem item : selections) {
-            nodes.add(item.getNode());
-        }
-
-        List<IContributionItem> menuItems = getMenuItems(nodes);
-        for (IContributionItem menuItem : menuItems) {
-            mMenuManager.insertBefore(endId, menuItem);
-        }
-
-        insertTagSpecificMenus(endId);
-        insertVisualRefactorings(endId);
-        insertParentItems(endId);
-    }
-
-    /**
-     * Returns the list of node-specific actions applicable to the given
-     * collection of nodes
-     *
-     * @param nodes the collection of nodes to look up actions for
-     * @return a list of contribution items applicable for all the nodes
-     */
-    private List<IContributionItem> getMenuItems(List<INode> nodes) {
-        Map<INode, List<RuleAction>> allActions = new HashMap<INode, List<RuleAction>>();
-        for (INode node : nodes) {
-            List<RuleAction> actionList = getMenuActions((NodeProxy) node);
-            allActions.put(node, actionList);
-        }
-
-        Set<String> availableIds = computeApplicableActionIds(allActions);
-
-        // +10: Make room for separators too
-        List<IContributionItem> items = new ArrayList<IContributionItem>(availableIds.size() + 10);
-
-        // We'll use the actions returned by the first node. Even when there
-        // are multiple items selected, we'll use the first action, but pass
-        // the set of all selected nodes to that first action. Actions are required
-        // to work this way to facilitate multi selection and actions which apply
-        // to multiple nodes.
-        NodeProxy first = (NodeProxy) nodes.get(0);
-        List<RuleAction> firstSelectedActions = allActions.get(first);
-        String defaultId = getDefaultActionId(first);
-        for (RuleAction action : firstSelectedActions) {
-            if (!availableIds.contains(action.getId())
-                    && !(action instanceof RuleAction.Separator)) {
-                // This action isn't supported by all selected items.
-                continue;
-            }
-
-            items.add(createContributionItem(action, nodes, defaultId));
-        }
-
-        return items;
-    }
-
-    private void insertParentItems(String endId) {
-        List<SelectionItem> selection = mCanvas.getSelectionManager().getSelections();
-        if (selection.size() == 1) {
-            mMenuManager.insertBefore(endId, new Separator());
-            INode parent = selection.get(0).getNode().getParent();
-            while (parent != null) {
-                String id = parent.getStringAttr(ANDROID_URI, ATTR_ID);
-                String label;
-                if (id != null && id.length() > 0) {
-                    label = BaseViewRule.stripIdPrefix(id);
-                } else {
-                    // Use the view name, such as "Button", as the label
-                    label = parent.getFqcn();
-                    // Strip off package
-                    label = label.substring(label.lastIndexOf('.') + 1);
-                }
-                mMenuManager.insertBefore(endId, new NestedParentMenu(label, parent));
-                parent = parent.getParent();
-            }
-            mMenuManager.insertBefore(endId, new Separator());
-        }
-    }
-
-    private void insertVisualRefactorings(String endId) {
-        // Extract As <include> refactoring, Wrap In Refactoring, etc.
-        List<SelectionItem> selection = mCanvas.getSelectionManager().getSelections();
-        if (selection.size() == 0) {
-            return;
-        }
-        // Only include the menu item if you are not right clicking on a root,
-        // or on an included view, or on a non-contiguous selection
-        mMenuManager.insertBefore(endId, new Separator());
-        if (selection.size() == 1 && selection.get(0).getViewInfo() != null
-                && selection.get(0).getViewInfo().getName().equals(FQCN_LINEAR_LAYOUT)) {
-            CanvasViewInfo info = selection.get(0).getViewInfo();
-            List<CanvasViewInfo> children = info.getChildren();
-            if (children.size() == 2) {
-                String first = children.get(0).getName();
-                String second = children.get(1).getName();
-                if ((first.equals(FQCN_IMAGE_VIEW) && second.equals(FQCN_TEXT_VIEW))
-                        || (first.equals(FQCN_TEXT_VIEW) && second.equals(FQCN_IMAGE_VIEW))) {
-                    mMenuManager.insertBefore(endId, UseCompoundDrawableAction.create(
-                            mEditorDelegate));
-                }
-            }
-        }
-        mMenuManager.insertBefore(endId, ExtractIncludeAction.create(mEditorDelegate));
-        mMenuManager.insertBefore(endId, ExtractStyleAction.create(mEditorDelegate));
-        mMenuManager.insertBefore(endId, WrapInAction.create(mEditorDelegate));
-        if (selection.size() == 1 && !(selection.get(0).isRoot())) {
-            mMenuManager.insertBefore(endId, UnwrapAction.create(mEditorDelegate));
-        }
-        if (selection.size() == 1 && (selection.get(0).isLayout() ||
-                selection.get(0).getViewInfo().getName().equals(FQCN_GESTURE_OVERLAY_VIEW))) {
-            mMenuManager.insertBefore(endId, ChangeLayoutAction.create(mEditorDelegate));
-        } else {
-            mMenuManager.insertBefore(endId, ChangeViewAction.create(mEditorDelegate));
-        }
-        mMenuManager.insertBefore(endId, new Separator());
-    }
-
-    /** "Preview List Content" pull-right menu for lists, "Preview Fragment" for fragments, etc. */
-    private void insertTagSpecificMenus(String endId) {
-
-        List<SelectionItem> selection = mCanvas.getSelectionManager().getSelections();
-        if (selection.size() == 0) {
-            return;
-        }
-        for (SelectionItem item : selection) {
-            UiViewElementNode node = item.getViewInfo().getUiViewNode();
-            String name = node.getDescriptor().getXmlLocalName();
-            boolean isGrid = name.equals(GRID_VIEW);
-            boolean isSpinner = name.equals(SPINNER);
-            if (name.equals(LIST_VIEW) || name.equals(EXPANDABLE_LIST_VIEW)
-                    || isGrid || isSpinner) {
-                mMenuManager.insertBefore(endId, new Separator());
-                mMenuManager.insertBefore(endId, new ListViewTypeMenu(mCanvas, isGrid, isSpinner));
-                return;
-            } else if (name.equals(VIEW_FRAGMENT) && selection.size() == 1) {
-                mMenuManager.insertBefore(endId, new Separator());
-                mMenuManager.insertBefore(endId, new FragmentMenu(mCanvas));
-                return;
-            }
-        }
-    }
-
-    /**
-     * Given a map from selection items to list of applicable actions (produced
-     * by {@link #computeApplicableActions()}) this method computes the set of
-     * common actions and returns the action ids of these actions.
-     *
-     * @param actions a map from selection item to list of actions applicable to
-     *            that selection item
-     * @return set of action ids for the actions that are present in the action
-     *         lists for all selected items
-     */
-    private Set<String> computeApplicableActionIds(Map<INode, List<RuleAction>> actions) {
-        if (actions.size() > 1) {
-            // More than one view is selected, so we have to filter down the available
-            // actions such that only those actions that are defined for all the views
-            // are shown
-            Map<String, Integer> idCounts = new HashMap<String, Integer>();
-            for (Map.Entry<INode, List<RuleAction>> entry : actions.entrySet()) {
-                List<RuleAction> actionList = entry.getValue();
-                for (RuleAction action : actionList) {
-                    if (!action.supportsMultipleNodes()) {
-                        continue;
-                    }
-                    String id = action.getId();
-                    if (id != null) {
-                        assert id != null : action;
-                        Integer count = idCounts.get(id);
-                        if (count == null) {
-                            idCounts.put(id, Integer.valueOf(1));
-                        } else {
-                            idCounts.put(id, count + 1);
-                        }
-                    }
-                }
-            }
-            Integer selectionCount = Integer.valueOf(actions.size());
-            Set<String> validIds = new HashSet<String>(idCounts.size());
-            for (Map.Entry<String, Integer> entry : idCounts.entrySet()) {
-                Integer count = entry.getValue();
-                if (selectionCount.equals(count)) {
-                    String id = entry.getKey();
-                    validIds.add(id);
-                }
-            }
-            return validIds;
-        } else {
-            List<RuleAction> actionList = actions.values().iterator().next();
-            Set<String> validIds = new HashSet<String>(actionList.size());
-            for (RuleAction action : actionList) {
-                String id = action.getId();
-                validIds.add(id);
-            }
-            return validIds;
-        }
-    }
-
-    /**
-     * Returns the menu actions computed by the rule associated with this node.
-     *
-     * @param node the canvas node we need menu actions for
-     * @return a list of {@link RuleAction} objects applicable to the node
-     */
-    private List<RuleAction> getMenuActions(NodeProxy node) {
-        List<RuleAction> actions = mCanvas.getRulesEngine().callGetContextMenu(node);
-        if (actions == null || actions.size() == 0) {
-            return null;
-        }
-
-        return actions;
-    }
-
-    /**
-     * Returns the default action id, or null
-     *
-     * @param node the node to look up the default action for
-     * @return the action id, or null
-     */
-    private String getDefaultActionId(NodeProxy node) {
-        return mCanvas.getRulesEngine().callGetDefaultActionId(node);
-    }
-
-    /**
-     * Creates a {@link ContributionItem} for the given {@link RuleAction}.
-     *
-     * @param action the action to create a {@link ContributionItem} for
-     * @param nodes the set of nodes the action should be applied to
-     * @param defaultId if not non null, the id of an action which should be considered default
-     * @return a new {@link ContributionItem} which implements the given action
-     *         on the given nodes
-     */
-    private ContributionItem createContributionItem(final RuleAction action,
-            final List<INode> nodes, final String defaultId) {
-        if (action instanceof RuleAction.Separator) {
-            return new Separator();
-        } else if (action instanceof NestedAction) {
-            NestedAction parentAction = (NestedAction) action;
-            return new ActionContributionItem(new NestedActionMenu(parentAction, nodes));
-        } else if (action instanceof Choices) {
-            Choices parentAction = (Choices) action;
-            return new ActionContributionItem(new NestedChoiceMenu(parentAction, nodes));
-        } else if (action instanceof Toggle) {
-            return new ActionContributionItem(createToggleAction(action, nodes));
-        } else {
-            return new ActionContributionItem(createPlainAction(action, nodes, defaultId));
-        }
-    }
-
-    private Action createToggleAction(final RuleAction action, final List<INode> nodes) {
-        Toggle toggleAction = (Toggle) action;
-        final boolean isChecked = toggleAction.isChecked();
-        Action a = new Action(action.getTitle(), IAction.AS_CHECK_BOX) {
-            @Override
-            public void run() {
-                String label = createActionLabel(action, nodes);
-                mEditorDelegate.getEditor().wrapUndoEditXmlModel(label, new Runnable() {
-                    @Override
-                    public void run() {
-                        action.getCallback().action(action, nodes,
-                                null/* no valueId for a toggle */, !isChecked);
-                        applyPendingChanges();
-                    }
-                });
-            }
-        };
-        a.setId(action.getId());
-        a.setChecked(isChecked);
-        return a;
-    }
-
-    private IAction createPlainAction(final RuleAction action, final List<INode> nodes,
-            final String defaultId) {
-        IAction a = new Action(action.getTitle(), IAction.AS_PUSH_BUTTON) {
-            @Override
-            public void run() {
-                String label = createActionLabel(action, nodes);
-                mEditorDelegate.getEditor().wrapUndoEditXmlModel(label, new Runnable() {
-                    @Override
-                    public void run() {
-                        action.getCallback().action(action, nodes, null,
-                                Boolean.TRUE);
-                        applyPendingChanges();
-                    }
-                });
-            }
-        };
-
-        String id = action.getId();
-        if (defaultId != null && id.equals(defaultId)) {
-            a.setAccelerator(DEFAULT_ACTION_KEY);
-            String text = a.getText();
-            text = text + '\t' + DEFAULT_ACTION_SHORTCUT;
-            a.setText(text);
-
-        } else if (ATTR_ID.equals(id)) {
-            // Keep in sync with {@link LayoutCanvas#handleKeyPressed}
-            if (SdkConstants.CURRENT_PLATFORM == SdkConstants.PLATFORM_DARWIN) {
-                a.setAccelerator('R' | SWT.MOD1 | SWT.MOD3);
-                // Option+Command
-                a.setText(a.getText().trim() + "\t\u2325\u2318R"); //$NON-NLS-1$
-            } else if (SdkConstants.CURRENT_PLATFORM == SdkConstants.PLATFORM_LINUX) {
-                a.setAccelerator('R' | SWT.MOD2 | SWT.MOD3);
-                a.setText(a.getText() + "\tShift+Alt+R"); //$NON-NLS-1$
-            } else {
-                a.setAccelerator('R' | SWT.MOD2 | SWT.MOD3);
-                a.setText(a.getText() + "\tAlt+Shift+R"); //$NON-NLS-1$
-            }
-        }
-        a.setId(id);
-        return a;
-    }
-
-    private static String createActionLabel(final RuleAction action, final List<INode> nodes) {
-        String label = action.getTitle();
-        if (nodes.size() > 1) {
-            label += String.format(" (%d elements)", nodes.size());
-        }
-        return label;
-    }
-
-    /**
-     * The {@link NestedParentMenu} provides submenu content which adds actions
-     * available on one of the selected node's parent nodes. This will be
-     * similar to the menu content for the selected node, except the parent
-     * menus will not be embedded within the nested menu.
-     */
-    private class NestedParentMenu extends SubmenuAction {
-        INode mParent;
-
-        NestedParentMenu(String title, INode parent) {
-            super(title);
-            mParent = parent;
-        }
-
-        @Override
-        protected void addMenuItems(Menu menu) {
-            List<SelectionItem> selection = mCanvas.getSelectionManager().getSelections();
-            if (selection.size() == 0) {
-                return;
-            }
-
-            List<IContributionItem> menuItems = getMenuItems(Collections.singletonList(mParent));
-            for (IContributionItem menuItem : menuItems) {
-                menuItem.fill(menu, -1);
-            }
-        }
-    }
-
-    /**
-     * The {@link NestedActionMenu} creates a lazily populated pull-right menu
-     * where the children are {@link RuleAction}'s themselves.
-     */
-    private class NestedActionMenu extends SubmenuAction {
-        private final NestedAction mParentAction;
-        private final List<INode> mNodes;
-
-        NestedActionMenu(NestedAction parentAction, List<INode> nodes) {
-            super(parentAction.getTitle());
-            mParentAction = parentAction;
-            mNodes = nodes;
-
-            assert mNodes.size() > 0;
-        }
-
-        @Override
-        protected void addMenuItems(Menu menu) {
-            Map<INode, List<RuleAction>> allActions = new HashMap<INode, List<RuleAction>>();
-            for (INode node : mNodes) {
-                List<RuleAction> actionList = mParentAction.getNestedActions(node);
-                allActions.put(node, actionList);
-            }
-
-            Set<String> availableIds = computeApplicableActionIds(allActions);
-
-            NodeProxy first = (NodeProxy) mNodes.get(0);
-            String defaultId = getDefaultActionId(first);
-            List<RuleAction> firstSelectedActions = allActions.get(first);
-
-            int count = 0;
-            for (RuleAction firstAction : firstSelectedActions) {
-                if (!availableIds.contains(firstAction.getId())
-                        && !(firstAction instanceof RuleAction.Separator)) {
-                    // This action isn't supported by all selected items.
-                    continue;
-                }
-
-                createContributionItem(firstAction, mNodes, defaultId).fill(menu, -1);
-                count++;
-            }
-
-            if (count == 0) {
-                addDisabledMessageItem("<Empty>");
-            }
-        }
-    }
-
-    private void applyPendingChanges() {
-        LayoutCanvas canvas = mEditorDelegate.getGraphicalEditor().getCanvasControl();
-        CanvasViewInfo root = canvas.getViewHierarchy().getRoot();
-        if (root != null) {
-            UiViewElementNode uiViewNode = root.getUiViewNode();
-            NodeFactory nodeFactory = canvas.getNodeFactory();
-            NodeProxy rootNode = nodeFactory.create(uiViewNode);
-            if (rootNode != null) {
-                rootNode.applyPendingChanges();
-            }
-        }
-    }
-
-    /**
-     * The {@link NestedChoiceMenu} creates a lazily populated pull-right menu
-     * where the items in the menu are strings
-     */
-    private class NestedChoiceMenu extends SubmenuAction {
-        private final Choices mParentAction;
-        private final List<INode> mNodes;
-
-        NestedChoiceMenu(Choices parentAction, List<INode> nodes) {
-            super(parentAction.getTitle());
-            mParentAction = parentAction;
-            mNodes = nodes;
-        }
-
-        @Override
-        protected void addMenuItems(Menu menu) {
-            List<String> titles = mParentAction.getTitles();
-            List<String> ids = mParentAction.getIds();
-            String current = mParentAction.getCurrent();
-            assert titles.size() == ids.size();
-            String[] currentValues = current != null
-                    && current.indexOf(RuleAction.CHOICE_SEP) != -1 ?
-                    current.split(RuleAction.CHOICE_SEP_PATTERN) : null;
-            for (int i = 0, n = Math.min(titles.size(), ids.size()); i < n; i++) {
-                final String id = ids.get(i);
-                if (id == null || id.equals(RuleAction.SEPARATOR)) {
-                    new Separator().fill(menu, -1);
-                    continue;
-                }
-
-                // Find out whether this item is selected
-                boolean select = false;
-                if (current != null) {
-                    // The current choice has a separator, so it's a flag with
-                    // multiple values selected. Compare keys with the split
-                    // values.
-                    if (currentValues != null) {
-                        if (current.indexOf(id) >= 0) {
-                            for (String value : currentValues) {
-                                if (id.equals(value)) {
-                                    select = true;
-                                    break;
-                                }
-                            }
-                        }
-                    } else {
-                        // current choice has no separator, simply compare to the key
-                        select = id.equals(current);
-                    }
-                }
-
-                String title = titles.get(i);
-                IAction a = new Action(title,
-                        current != null ? IAction.AS_CHECK_BOX : IAction.AS_PUSH_BUTTON) {
-                    @Override
-                    public void runWithEvent(Event event) {
-                        run();
-                    }
-                    @Override
-                    public void run() {
-                        String label = createActionLabel(mParentAction, mNodes);
-                        mEditorDelegate.getEditor().wrapUndoEditXmlModel(label, new Runnable() {
-                            @Override
-                            public void run() {
-                                mParentAction.getCallback().action(mParentAction, mNodes, id,
-                                        Boolean.TRUE);
-                                applyPendingChanges();
-                            }
-                        });
-                    }
-                };
-                a.setId(id);
-                a.setEnabled(true);
-                if (select) {
-                    a.setChecked(true);
-                }
-
-                new ActionContributionItem(a).fill(menu, -1);
-            }
-        }
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/EmptyViewsOverlay.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/EmptyViewsOverlay.java
deleted file mode 100644
index daa3e0e..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/EmptyViewsOverlay.java
+++ /dev/null
@@ -1,96 +0,0 @@
-/*
- * Copyright (C) 2010 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.editors.layout.gle2;
-
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Device;
-import org.eclipse.swt.graphics.GC;
-import org.eclipse.swt.graphics.Rectangle;
-
-/**
- * The {@link EmptyViewsOverlay} paints bounding rectangles for any of the empty and
- * invisible container views in the scene.
- */
-public class EmptyViewsOverlay extends Overlay {
-    /** The {@link ViewHierarchy} containing visible view information. */
-    private final ViewHierarchy mViewHierarchy;
-
-    /** Border color to paint the bounding boxes with. */
-    private Color mBorderColor;
-
-    /** Vertical scaling & scrollbar information. */
-    private CanvasTransform mVScale;
-
-    /** Horizontal scaling & scrollbar information. */
-    private CanvasTransform mHScale;
-
-    /**
-     * Constructs a new {@link EmptyViewsOverlay} linked to the given view hierarchy.
-     *
-     * @param viewHierarchy The {@link ViewHierarchy} to render.
-     * @param hScale The {@link CanvasTransform} to use to transfer horizontal layout
-     *            coordinates to screen coordinates.
-     * @param vScale The {@link CanvasTransform} to use to transfer vertical layout coordinates
-     *            to screen coordinates.
-     */
-    public EmptyViewsOverlay(
-            ViewHierarchy viewHierarchy,
-            CanvasTransform hScale,
-            CanvasTransform vScale) {
-        super();
-        mViewHierarchy = viewHierarchy;
-        mHScale = hScale;
-        mVScale = vScale;
-    }
-
-    @Override
-    public void create(Device device) {
-        mBorderColor = new Color(device, SwtDrawingStyle.EMPTY.getStrokeColor());
-    }
-
-    @Override
-    public void dispose() {
-        if (mBorderColor != null) {
-            mBorderColor.dispose();
-            mBorderColor = null;
-        }
-    }
-
-    @Override
-    public void paint(GC gc) {
-        gc.setForeground(mBorderColor);
-        gc.setLineDash(null);
-        gc.setLineStyle(SwtDrawingStyle.EMPTY.getLineStyle());
-        int oldAlpha = gc.getAlpha();
-        gc.setAlpha(SwtDrawingStyle.EMPTY.getStrokeAlpha());
-        gc.setLineWidth(SwtDrawingStyle.EMPTY.getLineWidth());
-
-        for (CanvasViewInfo info : mViewHierarchy.getInvisibleViews()) {
-            Rectangle r = info.getAbsRect();
-
-            int x = mHScale.translate(r.x);
-            int y = mVScale.translate(r.y);
-            int w = mHScale.scale(r.width);
-            int h = mVScale.scale(r.height);
-
-            // +1: See explanation in equivalent code in {@link OutlineOverlay#paint}
-            gc.drawRectangle(x, y, w + 1, h + 1);
-        }
-
-        gc.setAlpha(oldAlpha);
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/ExportScreenshotAction.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/ExportScreenshotAction.java
deleted file mode 100644
index ac3328d..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/ExportScreenshotAction.java
+++ /dev/null
@@ -1,82 +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.ide.eclipse.adt.internal.editors.layout.gle2;
-
-import static com.android.SdkConstants.DOT_PNG;
-
-import com.android.ide.eclipse.adt.AdtPlugin;
-
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.FileDialog;
-import org.eclipse.swt.widgets.Shell;
-
-import java.awt.image.BufferedImage;
-import java.io.File;
-import java.io.IOException;
-
-import javax.imageio.ImageIO;
-
-/** Saves the current layout editor's rendered image to disk */
-class ExportScreenshotAction extends Action {
-    private final LayoutCanvas mCanvas;
-
-    ExportScreenshotAction(LayoutCanvas canvas) {
-        super("Export Screenshot...");
-        mCanvas = canvas;
-    }
-
-    @Override
-    public void run() {
-        Shell shell = AdtPlugin.getShell();
-
-        ImageOverlay imageOverlay = mCanvas.getImageOverlay();
-        BufferedImage image = imageOverlay.getAwtImage();
-        if (image != null) {
-            FileDialog dialog = new FileDialog(shell, SWT.SAVE);
-            dialog.setFilterExtensions(new String[] { "*.png" }); //$NON-NLS-1$
-            String path = dialog.open();
-            if (path != null) {
-                if (!path.endsWith(DOT_PNG)) {
-                    path = path + DOT_PNG;
-                }
-                File file = new File(path);
-                if (file.exists()) {
-                    MessageDialog d = new MessageDialog(null, "File Already Exists", null,
-                            String.format(
-                                    "%1$s already exists.\nWould you like to replace it?",
-                                    path),
-                            MessageDialog.QUESTION, new String[] {
-                                    // Yes will be moved to the end because it's the default
-                                    "Yes", "No"
-                            }, 0);
-                    int result = d.open();
-                    if (result != 0) {
-                        return;
-                    }
-                }
-                try {
-                    ImageIO.write(image, "PNG", file); //$NON-NLS-1$
-                } catch (IOException e) {
-                    AdtPlugin.log(e, null);
-                }
-            }
-        } else {
-            MessageDialog.openError(shell, "Error", "Image not available");
-        }
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/FragmentMenu.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/FragmentMenu.java
deleted file mode 100644
index f7085fc..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/FragmentMenu.java
+++ /dev/null
@@ -1,304 +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.eclipse.adt.internal.editors.layout.gle2;
-
-import static com.android.SdkConstants.ANDROID_LAYOUT_RESOURCE_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.LAYOUT_RESOURCE_PREFIX;
-import static com.android.ide.eclipse.adt.internal.editors.layout.gle2.LayoutMetadata.KEY_FRAGMENT_LAYOUT;
-
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.ide.eclipse.adt.internal.editors.layout.LayoutEditorDelegate;
-import com.android.ide.eclipse.adt.internal.editors.layout.uimodel.UiViewElementNode;
-import com.android.ide.eclipse.adt.internal.project.BaseProjectHelper;
-import com.android.ide.eclipse.adt.internal.resources.CyclicDependencyValidator;
-import com.android.ide.eclipse.adt.internal.ui.ResourceChooser;
-import com.android.resources.ResourceType;
-import com.android.utils.Pair;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.IType;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.ActionContributionItem;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.action.Separator;
-import org.eclipse.jface.window.Window;
-import org.eclipse.swt.widgets.Menu;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * Fragment context menu allowing a layout to be chosen for previewing in the fragment frame.
- */
-public class FragmentMenu extends SubmenuAction {
-    private static final String R_LAYOUT_RESOURCE_PREFIX = "R.layout."; //$NON-NLS-1$
-    private static final String ANDROID_R_PREFIX = "android.R.layout"; //$NON-NLS-1$
-
-    /** Associated canvas */
-    private final LayoutCanvas mCanvas;
-
-    /**
-     * Creates a "Preview Fragment" menu
-     *
-     * @param canvas associated canvas
-     */
-    public FragmentMenu(LayoutCanvas canvas) {
-        super("Fragment Layout");
-        mCanvas = canvas;
-    }
-
-    @Override
-    protected void addMenuItems(Menu menu) {
-        IAction action = new PickLayoutAction("Choose Layout...");
-        new ActionContributionItem(action).fill(menu, -1);
-
-        SelectionManager selectionManager = mCanvas.getSelectionManager();
-        List<SelectionItem> selections = selectionManager.getSelections();
-        if (selections.size() == 0) {
-            return;
-        }
-
-        SelectionItem first = selections.get(0);
-        UiViewElementNode node = first.getViewInfo().getUiViewNode();
-        if (node == null) {
-            return;
-        }
-        Element element = (Element) node.getXmlNode();
-
-        String selected = getSelectedLayout();
-        if (selected != null) {
-            if (selected.startsWith(ANDROID_LAYOUT_RESOURCE_PREFIX)) {
-                selected = selected.substring(ANDROID_LAYOUT_RESOURCE_PREFIX.length());
-            }
-        }
-
-        String fqcn = getFragmentClass(element);
-        if (fqcn != null) {
-            // Look up the corresponding activity class and try to figure out
-            // which layouts it is referring to and list these here as reasonable
-            // guesses
-            IProject project = mCanvas.getEditorDelegate().getEditor().getProject();
-            String source = null;
-            try {
-                IJavaProject javaProject = BaseProjectHelper.getJavaProject(project);
-                IType type = javaProject.findType(fqcn);
-                if (type != null) {
-                    source = type.getSource();
-                }
-            } catch (CoreException e) {
-                AdtPlugin.log(e, null);
-            }
-            // Find layouts. This is based on just skimming the Fragment class and looking
-            // for layout references of the form R.layout.*.
-            if (source != null) {
-                String self = mCanvas.getLayoutResourceName();
-                // Pair of <title,layout> to be displayed to the user
-                List<Pair<String, String>> layouts = new ArrayList<Pair<String, String>>();
-
-                if (source.contains("extends ListFragment")) { //$NON-NLS-1$
-                    layouts.add(Pair.of("list_content", //$NON-NLS-1$
-                            "@android:layout/list_content")); //$NON-NLS-1$
-                }
-
-                int index = 0;
-                while (true) {
-                    index = source.indexOf(R_LAYOUT_RESOURCE_PREFIX, index);
-                    if (index == -1) {
-                        break;
-                    } else {
-                        index += R_LAYOUT_RESOURCE_PREFIX.length();
-                        int end = index;
-                        while (end < source.length()) {
-                            char c = source.charAt(end);
-                            if (!Character.isJavaIdentifierPart(c)) {
-                                break;
-                            }
-                            end++;
-                        }
-                        if (end > index) {
-                            String title = source.substring(index, end);
-                            String layout;
-                            // Is this R.layout part of an android.R.layout?
-                            int len = ANDROID_R_PREFIX.length() + 1; // prefix length to check
-                            if (index > len && source.startsWith(ANDROID_R_PREFIX, index - len)) {
-                                layout = ANDROID_LAYOUT_RESOURCE_PREFIX + title;
-                            } else {
-                                layout = LAYOUT_RESOURCE_PREFIX + title;
-                            }
-                            if (!self.equals(title)) {
-                                layouts.add(Pair.of(title, layout));
-                            }
-                        }
-                    }
-
-                    index++;
-                }
-
-                if (layouts.size() > 0) {
-                    new Separator().fill(menu, -1);
-                    for (Pair<String, String> layout : layouts) {
-                        action = new SetFragmentLayoutAction(layout.getFirst(),
-                                layout.getSecond(), selected);
-                        new ActionContributionItem(action).fill(menu, -1);
-                    }
-                }
-            }
-        }
-
-        if (selected != null) {
-            new Separator().fill(menu, -1);
-            action = new SetFragmentLayoutAction("Clear", null, null);
-            new ActionContributionItem(action).fill(menu, -1);
-        }
-    }
-
-    /**
-     * Returns the class name of the fragment associated with the given {@code <fragment>}
-     * element.
-     *
-     * @param element the element for the fragment tag
-     * @return the fully qualified fragment class name, or null
-     */
-    @Nullable
-    public static String getFragmentClass(@NonNull Element element) {
-        String fqcn = element.getAttribute(ATTR_CLASS);
-        if (fqcn == null || fqcn.length() == 0) {
-            fqcn = element.getAttributeNS(ANDROID_URI, ATTR_NAME);
-        }
-        if (fqcn != null && fqcn.length() > 0) {
-            return fqcn;
-        } else {
-            return null;
-        }
-    }
-
-    /**
-     * Returns the layout to be shown for the given {@code <fragment>} node.
-     *
-     * @param node the node corresponding to the {@code <fragment>} element
-     * @return the resource path to a layout to render for this fragment, or null
-     */
-    @Nullable
-    public static String getFragmentLayout(@NonNull Node node) {
-        String layout = LayoutMetadata.getProperty(
-                node, LayoutMetadata.KEY_FRAGMENT_LAYOUT);
-        if (layout != null) {
-            return layout;
-        }
-
-        return null;
-    }
-
-    /** Returns the name of the currently displayed layout in the fragment, or null */
-    @Nullable
-    private String getSelectedLayout() {
-        SelectionManager selectionManager = mCanvas.getSelectionManager();
-        for (SelectionItem item : selectionManager.getSelections()) {
-            UiViewElementNode node = item.getViewInfo().getUiViewNode();
-            if (node != null) {
-                String layout = getFragmentLayout(node.getXmlNode());
-                if (layout != null) {
-                    return layout;
-                }
-            }
-        }
-        return null;
-    }
-
-    /**
-     * Set the given layout as the new fragment layout
-     *
-     * @param layout the layout resource name to show in this fragment
-     */
-    public void setNewLayout(@Nullable String layout) {
-        LayoutEditorDelegate delegate = mCanvas.getEditorDelegate();
-        GraphicalEditorPart graphicalEditor = delegate.getGraphicalEditor();
-        SelectionManager selectionManager = mCanvas.getSelectionManager();
-
-        for (SelectionItem item : selectionManager.getSnapshot()) {
-            UiViewElementNode node = item.getViewInfo().getUiViewNode();
-            if (node != null) {
-                Node xmlNode = node.getXmlNode();
-                LayoutMetadata.setProperty(delegate.getEditor(), xmlNode, KEY_FRAGMENT_LAYOUT,
-                        layout);
-            }
-        }
-
-        // Refresh
-        graphicalEditor.recomputeLayout();
-        mCanvas.redraw();
-    }
-
-    /** Action to set the given layout as the new layout in a fragment */
-    private class SetFragmentLayoutAction extends Action {
-        private final String mLayout;
-
-        public SetFragmentLayoutAction(String title, String layout, String selected) {
-            super(title, IAction.AS_RADIO_BUTTON);
-            mLayout = layout;
-
-            if (layout != null && layout.equals(selected)) {
-                setChecked(true);
-            }
-        }
-
-        @Override
-        public void run() {
-            if (isChecked()) {
-                setNewLayout(mLayout);
-            }
-        }
-    }
-
-    /**
-     * Action which brings up the "Create new XML File" wizard, pre-selected with the
-     * animation category
-     */
-    private class PickLayoutAction extends Action {
-
-        public PickLayoutAction(String title) {
-            super(title, IAction.AS_PUSH_BUTTON);
-        }
-
-        @Override
-        public void run() {
-            LayoutEditorDelegate delegate = mCanvas.getEditorDelegate();
-            IFile file = delegate.getEditor().getInputFile();
-            GraphicalEditorPart editor = delegate.getGraphicalEditor();
-            ResourceChooser dlg = ResourceChooser.create(editor, ResourceType.LAYOUT)
-                .setInputValidator(CyclicDependencyValidator.create(file))
-                .setInitialSize(85, 10)
-                .setCurrentResource(getSelectedLayout());
-            int result = dlg.open();
-            if (result == ResourceChooser.CLEAR_RETURN_CODE) {
-                setNewLayout(null);
-            } else if (result == Window.OK) {
-                String newType = dlg.getCurrentResource();
-                setNewLayout(newType);
-            }
-        }
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/GCWrapper.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/GCWrapper.java
deleted file mode 100644
index 354517e..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/GCWrapper.java
+++ /dev/null
@@ -1,645 +0,0 @@
-/*
- * Copyright (C) 2010 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.editors.layout.gle2;
-
-import com.android.annotations.NonNull;
-import com.android.ide.common.api.DrawingStyle;
-import com.android.ide.common.api.IColor;
-import com.android.ide.common.api.IGraphics;
-import com.android.ide.common.api.IViewRule;
-import com.android.ide.common.api.Point;
-import com.android.ide.common.api.Rect;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.SWTException;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.FontMetrics;
-import org.eclipse.swt.graphics.GC;
-import org.eclipse.swt.graphics.RGB;
-
-import java.util.EnumMap;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-/**
- * Wraps an SWT {@link GC} into an {@link IGraphics} interface so that {@link IViewRule} objects
- * can directly draw on the canvas.
- * <p/>
- * The actual wrapped GC object is only non-null during the context of a paint operation.
- */
-public class GCWrapper implements IGraphics {
-
-    /**
-     * The actual SWT {@link GC} being wrapped. This can change during the lifetime of the
-     * object. It is generally set to something during an onPaint method and then changed
-     * to null when not in the context of a paint.
-     */
-    private GC mGc;
-
-    /**
-     * Current style being used for drawing.
-     */
-    private SwtDrawingStyle mCurrentStyle = SwtDrawingStyle.INVALID;
-
-    /**
-     * Implementation of IColor wrapping an SWT color.
-     */
-    private static class ColorWrapper implements IColor {
-        private final Color mColor;
-
-        public ColorWrapper(Color color) {
-            mColor = color;
-        }
-
-        public Color getColor() {
-            return mColor;
-        }
-    }
-
-    /** A map of registered colors. All these colors must be disposed at the end. */
-    private final HashMap<Integer, ColorWrapper> mColorMap = new HashMap<Integer, ColorWrapper>();
-
-    /**
-     * A map of the {@link SwtDrawingStyle} stroke colors that we have actually
-     * used (to be disposed)
-     */
-    private final Map<DrawingStyle, Color> mStyleStrokeMap = new EnumMap<DrawingStyle, Color>(
-            DrawingStyle.class);
-
-    /**
-     * A map of the {@link SwtDrawingStyle} fill colors that we have actually
-     * used (to be disposed)
-     */
-    private final Map<DrawingStyle, Color> mStyleFillMap = new EnumMap<DrawingStyle, Color>(
-            DrawingStyle.class);
-
-    /** The cached pixel height of the default current font. */
-    private int mFontHeight = 0;
-
-    /** The scaling of the canvas in X. */
-    private final CanvasTransform mHScale;
-    /** The scaling of the canvas in Y. */
-    private final CanvasTransform mVScale;
-
-    public GCWrapper(CanvasTransform hScale, CanvasTransform vScale) {
-        mHScale = hScale;
-        mVScale = vScale;
-        mGc = null;
-    }
-
-    void setGC(GC gc) {
-        mGc = gc;
-    }
-
-    private GC getGc() {
-        return mGc;
-    }
-
-    void checkGC() {
-        if (mGc == null) {
-            throw new RuntimeException("IGraphics used without a valid context.");
-        }
-    }
-
-    void dispose() {
-        for (ColorWrapper c : mColorMap.values()) {
-            c.getColor().dispose();
-        }
-        mColorMap.clear();
-
-        for (Color c : mStyleStrokeMap.values()) {
-            c.dispose();
-        }
-        mStyleStrokeMap.clear();
-
-        for (Color c : mStyleFillMap.values()) {
-            c.dispose();
-        }
-        mStyleFillMap.clear();
-    }
-
-    //-------------
-
-    @Override
-    public @NonNull IColor registerColor(int rgb) {
-        checkGC();
-
-        Integer key = Integer.valueOf(rgb);
-        ColorWrapper c = mColorMap.get(key);
-        if (c == null) {
-            c = new ColorWrapper(new Color(getGc().getDevice(),
-                    (rgb >> 16) & 0xFF,
-                    (rgb >>  8) & 0xFF,
-                    (rgb >>  0) & 0xFF));
-            mColorMap.put(key, c);
-        }
-
-        return c;
-    }
-
-    /** Returns the (cached) pixel height of the current font. */
-    @Override
-    public int getFontHeight() {
-        if (mFontHeight < 1) {
-            checkGC();
-            FontMetrics fm = getGc().getFontMetrics();
-            mFontHeight = fm.getHeight();
-        }
-        return mFontHeight;
-    }
-
-    @Override
-    public @NonNull IColor getForeground() {
-        Color c = getGc().getForeground();
-        return new ColorWrapper(c);
-    }
-
-    @Override
-    public @NonNull IColor getBackground() {
-        Color c = getGc().getBackground();
-        return new ColorWrapper(c);
-    }
-
-    @Override
-    public int getAlpha() {
-        return getGc().getAlpha();
-    }
-
-    @Override
-    public void setForeground(@NonNull IColor color) {
-        checkGC();
-        getGc().setForeground(((ColorWrapper) color).getColor());
-    }
-
-    @Override
-    public void setBackground(@NonNull IColor color) {
-        checkGC();
-        getGc().setBackground(((ColorWrapper) color).getColor());
-    }
-
-    @Override
-    public void setAlpha(int alpha) {
-        checkGC();
-        try {
-            getGc().setAlpha(alpha);
-        } catch (SWTException e) {
-            // This means that we cannot set the alpha on this platform; this is
-            // an acceptable no-op.
-        }
-    }
-
-    @Override
-    public void setLineStyle(@NonNull LineStyle style) {
-        int swtStyle = 0;
-        switch (style) {
-        case LINE_SOLID:
-            swtStyle = SWT.LINE_SOLID;
-            break;
-        case LINE_DASH:
-            swtStyle = SWT.LINE_DASH;
-            break;
-        case LINE_DOT:
-            swtStyle = SWT.LINE_DOT;
-            break;
-        case LINE_DASHDOT:
-            swtStyle = SWT.LINE_DASHDOT;
-            break;
-        case LINE_DASHDOTDOT:
-            swtStyle = SWT.LINE_DASHDOTDOT;
-            break;
-        default:
-            assert false : style;
-            break;
-        }
-
-        if (swtStyle != 0) {
-            checkGC();
-            getGc().setLineStyle(swtStyle);
-        }
-    }
-
-    @Override
-    public void setLineWidth(int width) {
-        checkGC();
-        if (width > 0) {
-            getGc().setLineWidth(width);
-        }
-    }
-
-    // lines
-
-    @Override
-    public void drawLine(int x1, int y1, int x2, int y2) {
-        checkGC();
-        useStrokeAlpha();
-        x1 = mHScale.translate(x1);
-        y1 = mVScale.translate(y1);
-        x2 = mHScale.translate(x2);
-        y2 = mVScale.translate(y2);
-        getGc().drawLine(x1, y1, x2, y2);
-    }
-
-    @Override
-    public void drawLine(@NonNull Point p1, @NonNull Point p2) {
-        drawLine(p1.x, p1.y, p2.x, p2.y);
-    }
-
-    // rectangles
-
-    @Override
-    public void drawRect(int x1, int y1, int x2, int y2) {
-        checkGC();
-        useStrokeAlpha();
-        int x = mHScale.translate(x1);
-        int y = mVScale.translate(y1);
-        int w = mHScale.scale(x2 - x1);
-        int h = mVScale.scale(y2 - y1);
-        getGc().drawRectangle(x, y, w, h);
-    }
-
-    @Override
-    public void drawRect(@NonNull Point p1, @NonNull Point p2) {
-        drawRect(p1.x, p1.y, p2.x, p2.y);
-    }
-
-    @Override
-    public void drawRect(@NonNull Rect r) {
-        checkGC();
-        useStrokeAlpha();
-        int x = mHScale.translate(r.x);
-        int y = mVScale.translate(r.y);
-        int w = mHScale.scale(r.w);
-        int h = mVScale.scale(r.h);
-        getGc().drawRectangle(x, y, w, h);
-    }
-
-    @Override
-    public void fillRect(int x1, int y1, int x2, int y2) {
-        checkGC();
-        useFillAlpha();
-        int x = mHScale.translate(x1);
-        int y = mVScale.translate(y1);
-        int w = mHScale.scale(x2 - x1);
-        int h = mVScale.scale(y2 - y1);
-        getGc().fillRectangle(x, y, w, h);
-    }
-
-    @Override
-    public void fillRect(@NonNull Point p1, @NonNull Point p2) {
-        fillRect(p1.x, p1.y, p2.x, p2.y);
-    }
-
-    @Override
-    public void fillRect(@NonNull Rect r) {
-        checkGC();
-        useFillAlpha();
-        int x = mHScale.translate(r.x);
-        int y = mVScale.translate(r.y);
-        int w = mHScale.scale(r.w);
-        int h = mVScale.scale(r.h);
-        getGc().fillRectangle(x, y, w, h);
-    }
-
-    // circles (actually ovals)
-
-    public void drawOval(int x1, int y1, int x2, int y2) {
-        checkGC();
-        useStrokeAlpha();
-        int x = mHScale.translate(x1);
-        int y = mVScale.translate(y1);
-        int w = mHScale.scale(x2 - x1);
-        int h = mVScale.scale(y2 - y1);
-        getGc().drawOval(x, y, w, h);
-    }
-
-    public void drawOval(Point p1, Point p2) {
-        drawOval(p1.x, p1.y, p2.x, p2.y);
-    }
-
-    public void drawOval(Rect r) {
-        checkGC();
-        useStrokeAlpha();
-        int x = mHScale.translate(r.x);
-        int y = mVScale.translate(r.y);
-        int w = mHScale.scale(r.w);
-        int h = mVScale.scale(r.h);
-        getGc().drawOval(x, y, w, h);
-    }
-
-    public void fillOval(int x1, int y1, int x2, int y2) {
-        checkGC();
-        useFillAlpha();
-        int x = mHScale.translate(x1);
-        int y = mVScale.translate(y1);
-        int w = mHScale.scale(x2 - x1);
-        int h = mVScale.scale(y2 - y1);
-        getGc().fillOval(x, y, w, h);
-    }
-
-    public void fillOval(Point p1, Point p2) {
-        fillOval(p1.x, p1.y, p2.x, p2.y);
-    }
-
-    public void fillOval(Rect r) {
-        checkGC();
-        useFillAlpha();
-        int x = mHScale.translate(r.x);
-        int y = mVScale.translate(r.y);
-        int w = mHScale.scale(r.w);
-        int h = mVScale.scale(r.h);
-        getGc().fillOval(x, y, w, h);
-    }
-
-
-    // strings
-
-    @Override
-    public void drawString(@NonNull String string, int x, int y) {
-        checkGC();
-        useStrokeAlpha();
-        x = mHScale.translate(x);
-        y = mVScale.translate(y);
-        // Background fill of text is not useful because it does not
-        // use the alpha; we instead supply a separate method (drawBoxedStrings) which
-        // first paints a semi-transparent mask for the text to sit on
-        // top of (this ensures that the text is readable regardless of
-        // colors of the pixels below the text)
-        getGc().drawString(string, x, y, true /*isTransparent*/);
-    }
-
-    @Override
-    public void drawBoxedStrings(int x, int y, @NonNull List<?> strings) {
-        checkGC();
-
-        x = mHScale.translate(x);
-        y = mVScale.translate(y);
-
-        // Compute bounds of the box by adding up the sum of the text heights
-        // and the max of the text widths
-        int width = 0;
-        int height = 0;
-        int lineHeight = getGc().getFontMetrics().getHeight();
-        for (Object s : strings) {
-            org.eclipse.swt.graphics.Point extent = getGc().stringExtent(s.toString());
-            height += extent.y;
-            width = Math.max(width, extent.x);
-        }
-
-        // Paint a box below the text
-        int padding = 2;
-        useFillAlpha();
-        getGc().fillRectangle(x - padding, y - padding, width + 2 * padding, height + 2 * padding);
-
-        // Finally draw strings on top
-        useStrokeAlpha();
-        int lineY = y;
-        for (Object s : strings) {
-            getGc().drawString(s.toString(), x, lineY, true /* isTransparent */);
-            lineY += lineHeight;
-        }
-    }
-
-    @Override
-    public void drawString(@NonNull String string, @NonNull Point topLeft) {
-        drawString(string, topLeft.x, topLeft.y);
-    }
-
-    // Styles
-
-    @Override
-    public void useStyle(@NonNull DrawingStyle style) {
-        checkGC();
-
-        // Look up the specific SWT style which defines the actual
-        // colors and attributes to be used for the logical drawing style.
-        SwtDrawingStyle swtStyle = SwtDrawingStyle.of(style);
-        RGB stroke = swtStyle.getStrokeColor();
-        if (stroke != null) {
-            Color color = getStrokeColor(style, stroke);
-            mGc.setForeground(color);
-        }
-        RGB fill = swtStyle.getFillColor();
-        if (fill != null) {
-            Color color = getFillColor(style, fill);
-            mGc.setBackground(color);
-        }
-        mGc.setLineWidth(swtStyle.getLineWidth());
-        mGc.setLineStyle(swtStyle.getLineStyle());
-        if (swtStyle.getLineStyle() == SWT.LINE_CUSTOM) {
-            mGc.setLineDash(new int[] {
-                    8, 4
-            });
-        }
-        mCurrentStyle = swtStyle;
-    }
-
-    /** Uses the stroke alpha for subsequent drawing operations. */
-    private void useStrokeAlpha() {
-        mGc.setAlpha(mCurrentStyle.getStrokeAlpha());
-    }
-
-    /** Uses the fill alpha for subsequent drawing operations. */
-    private void useFillAlpha() {
-        mGc.setAlpha(mCurrentStyle.getFillAlpha());
-    }
-
-    /**
-     * Get the SWT stroke color (foreground/border) to use for the given style,
-     * using the provided color description if we haven't seen this color yet.
-     * The color will also be placed in the {@link #mStyleStrokeMap} such that
-     * it can be disposed of at cleanup time.
-     *
-     * @param style The drawing style for which we want a color
-     * @param defaultColorDesc The RGB values to initialize the color to if we
-     *            haven't seen this color before
-     * @return The color object
-     */
-    private Color getStrokeColor(DrawingStyle style, RGB defaultColorDesc) {
-        return getStyleColor(style, defaultColorDesc, mStyleStrokeMap);
-    }
-
-    /**
-     * Get the SWT fill (background/interior) color to use for the given style,
-     * using the provided color description if we haven't seen this color yet.
-     * The color will also be placed in the {@link #mStyleStrokeMap} such that
-     * it can be disposed of at cleanup time.
-     *
-     * @param style The drawing style for which we want a color
-     * @param defaultColorDesc The RGB values to initialize the color to if we
-     *            haven't seen this color before
-     * @return The color object
-     */
-    private Color getFillColor(DrawingStyle style, RGB defaultColorDesc) {
-        return getStyleColor(style, defaultColorDesc, mStyleFillMap);
-    }
-
-    /**
-     * Get the SWT color to use for the given style, using the provided color
-     * description if we haven't seen this color yet. The color will also be
-     * placed in the map referenced by the map parameter such that it can be
-     * disposed of at cleanup time.
-     *
-     * @param style The drawing style for which we want a color
-     * @param defaultColorDesc The RGB values to initialize the color to if we
-     *            haven't seen this color before
-     * @param map The color map to use
-     * @return The color object
-     */
-    private Color getStyleColor(DrawingStyle style, RGB defaultColorDesc,
-            Map<DrawingStyle, Color> map) {
-        Color color = map.get(style);
-        if (color == null) {
-            color = new Color(getGc().getDevice(), defaultColorDesc);
-            map.put(style, color);
-        }
-
-        return color;
-    }
-
-    // dots
-
-    @Override
-    public void drawPoint(int x, int y) {
-        checkGC();
-        useStrokeAlpha();
-        x = mHScale.translate(x);
-        y = mVScale.translate(y);
-
-        getGc().drawPoint(x, y);
-    }
-
-    // arrows
-
-    private static final int MIN_LENGTH = 10;
-
-
-    @Override
-    public void drawArrow(int x1, int y1, int x2, int y2, int size) {
-        int arrowWidth = size;
-        int arrowHeight = size;
-
-        checkGC();
-        useStrokeAlpha();
-        x1 = mHScale.translate(x1);
-        y1 = mVScale.translate(y1);
-        x2 = mHScale.translate(x2);
-        y2 = mVScale.translate(y2);
-        GC graphics = getGc();
-
-        // Make size adjustments to ensure that the arrow has enough width to be visible
-        if (x1 == x2 && Math.abs(y1 - y2) < MIN_LENGTH) {
-            int delta = (MIN_LENGTH - Math.abs(y1 - y2)) / 2;
-            if (y1 < y2) {
-                y1 -= delta;
-                y2 += delta;
-            } else {
-                y1 += delta;
-                y2-= delta;
-            }
-
-        } else if (y1 == y2 && Math.abs(x1 - x2) < MIN_LENGTH) {
-            int delta = (MIN_LENGTH - Math.abs(x1 - x2)) / 2;
-            if (x1 < x2) {
-                x1 -= delta;
-                x2 += delta;
-            } else {
-                x1 += delta;
-                x2-= delta;
-            }
-        }
-
-        graphics.drawLine(x1, y1, x2, y2);
-
-        // Arrowhead:
-
-        if (x1 == x2) {
-            // Vertical
-            if (y2 > y1) {
-                graphics.drawLine(x2 - arrowWidth, y2 - arrowHeight, x2, y2);
-                graphics.drawLine(x2 + arrowWidth, y2 - arrowHeight, x2, y2);
-            } else {
-                graphics.drawLine(x2 - arrowWidth, y2 + arrowHeight, x2, y2);
-                graphics.drawLine(x2 + arrowWidth, y2 + arrowHeight, x2, y2);
-            }
-        } else if (y1 == y2) {
-            // Horizontal
-            if (x2 > x1) {
-                graphics.drawLine(x2 - arrowHeight, y2 - arrowWidth, x2, y2);
-                graphics.drawLine(x2 - arrowHeight, y2 + arrowWidth, x2, y2);
-            } else {
-                graphics.drawLine(x2 + arrowHeight, y2 - arrowWidth, x2, y2);
-                graphics.drawLine(x2 + arrowHeight, y2 + arrowWidth, x2, y2);
-            }
-        } else {
-            // Compute angle:
-            int dy = y2 - y1;
-            int dx = x2 - x1;
-            double angle = Math.atan2(dy, dx);
-            double lineLength = Math.sqrt(dy * dy + dx * dx);
-
-            // Imagine a line of the same length as the arrow, but with angle 0.
-            // Its two arrow lines are at (-arrowWidth, -arrowHeight) relative
-            // to the endpoint (x1 + lineLength, y1) stretching up to (x2,y2).
-            // We compute the positions of (ax,ay) for the point above and
-            // below this line and paint the lines to it:
-            double ax = x1 + lineLength - arrowHeight;
-            double ay = y1 - arrowWidth;
-            int rx = (int) (Math.cos(angle) * (ax-x1) - Math.sin(angle) * (ay-y1) + x1);
-            int ry = (int) (Math.sin(angle) * (ax-x1) + Math.cos(angle) * (ay-y1) + y1);
-            graphics.drawLine(x2, y2, rx, ry);
-
-            ay = y1 + arrowWidth;
-            rx = (int) (Math.cos(angle) * (ax-x1) - Math.sin(angle) * (ay-y1) + x1);
-            ry = (int) (Math.sin(angle) * (ax-x1) + Math.cos(angle) * (ay-y1) + y1);
-            graphics.drawLine(x2, y2, rx, ry);
-        }
-
-        /* TODO: Experiment with filled arrow heads?
-        if (x1 == x2) {
-            // Vertical
-            if (y2 > y1) {
-                for (int i = 0; i < arrowWidth; i++) {
-                    graphics.drawLine(x2 - arrowWidth + i, y2 - arrowWidth + i,
-                            x2 + arrowWidth - i, y2 - arrowWidth + i);
-                }
-            } else {
-                for (int i = 0; i < arrowWidth; i++) {
-                    graphics.drawLine(x2 - arrowWidth + i, y2 + arrowWidth - i,
-                            x2 + arrowWidth - i, y2 + arrowWidth - i);
-                }
-            }
-        } else if (y1 == y2) {
-            // Horizontal
-            if (x2 > x1) {
-                for (int i = 0; i < arrowHeight; i++) {
-                    graphics.drawLine(x2 - arrowHeight + i, y2 - arrowHeight + i, x2
-                            - arrowHeight + i, y2 + arrowHeight - i);
-                }
-            } else {
-                for (int i = 0; i < arrowHeight; i++) {
-                    graphics.drawLine(x2 + arrowHeight - i, y2 - arrowHeight + i, x2
-                            + arrowHeight - i, y2 + arrowHeight - i);
-                }
-            }
-        } else {
-            // Arbitrary angle -- need to use trig
-            // TODO: Implement this
-        }
-        */
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/Gesture.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/Gesture.java
deleted file mode 100644
index a35d190..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/Gesture.java
+++ /dev/null
@@ -1,156 +0,0 @@
-/*
- * Copyright (C) 2010 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.editors.layout.gle2;
-
-import com.android.utils.Pair;
-
-import org.eclipse.swt.events.KeyEvent;
-
-import java.util.Collections;
-import java.util.List;
-
-/**
- * A gesture is a mouse or keyboard driven user operation, such as a
- * swipe-select or a resize. It can be thought of as a session, since it is
- * initiated, updated during user manipulation, and finally completed or
- * canceled. A gesture is associated with a single undo transaction (although
- * some gestures don't actually edit anything, such as a selection), and a
- * gesture can have a number of graphics {@link Overlay}s which are added and
- * cleaned up on behalf of the gesture by the system.
- * <p/>
- * Gestures are typically mouse oriented. If a mouse wishes to integrate
- * with the native drag &amp; drop support, it should also implement
- * the {@link DropGesture} interface, which is a sub interface of this
- * {@link Gesture} interface. There are pros and cons to using native drag
- * &amp; drop, so various gestures will differ in whether they use it.
- * In particular, you should use drag &amp; drop if your gesture should:
- * <ul>
- * <li> Show a native drag &amp; drop cursor
- * <li> Copy or move data, especially if this applies outside the canvas
- *    control window or even the application itself
- * </ul>
- * You might want to avoid using native drag &amp; drop if your gesture should:
- * <ul>
- * <li> Continue updating itself even when the mouse cursor leaves the
- *    canvas window (in a drag &amp; gesture, as soon as you leave the canvas
- *    the drag source is no longer informed of mouse updates, whereas a regular
- *    mouse listener is)
- * <li> Respond to modifier keys (for example, if toggling the Shift key
- *    should constrain motion as is common during resizing, and so on)
- * <li> Use no special cursor (for example, during a marquee selection gesture we
- *     don't want a native drag &amp; drop cursor)
- *  </ul>
- * <p/>
- * Examples of gestures:
- * <ul>
- * <li>Move (dragging to reorder or change hierarchy of views or change visual
- * layout attributes)
- * <li>Marquee (swiping out a rectangle to make a selection)
- * <li>Resize (dragging some edge or corner of a widget to change its size, for
- * example to some new fixed size, or to "attach" it to some other edge.)
- * <li>Inline Editing (editing the text of some text-oriented widget like a
- * label or a button)
- * <li>Link (associate two or more widgets in some way, such as an
- *   "is required" widget linked to a text field)
- * </ul>
- */
-public abstract class Gesture {
-    /** Start mouse coordinate, in control coordinates. */
-    protected ControlPoint mStart;
-
-    /** Initial SWT mask when the gesture started. */
-    protected int mStartMask;
-
-    /**
-     * Returns a list of overlays, from bottom to top (where the later overlays
-     * are painted on top of earlier ones if they overlap).
-     *
-     * @return A list of overlays to paint for this gesture, if applicable.
-     *         Should not be null, but can be empty.
-     */
-    public List<Overlay> createOverlays() {
-        return Collections.emptyList();
-    }
-
-    /**
-     * Handles initialization of this gesture. Called when the gesture is
-     * starting.
-     *
-     * @param pos The most recent mouse coordinate applicable to this
-     *            gesture, relative to the canvas control.
-     * @param startMask The initial SWT mask for the gesture, if known, or
-     *            otherwise 0.
-     */
-    public void begin(ControlPoint pos, int startMask) {
-        mStart = pos;
-        mStartMask = startMask;
-    }
-
-    /**
-     * Handles updating of the gesture state for a new mouse position.
-     *
-     * @param pos The most recent mouse coordinate applicable to this
-     *            gesture, relative to the canvas control.
-     */
-    public void update(ControlPoint pos) {
-    }
-
-    /**
-     * Handles termination of the gesture. This method is called when the
-     * gesture has terminated (either through successful completion, or because
-     * it was canceled).
-     *
-     * @param pos The most recent mouse coordinate applicable to this
-     *            gesture, relative to the canvas control.
-     * @param canceled True if the gesture was canceled, and false otherwise.
-     */
-    public void end(ControlPoint pos, boolean canceled) {
-    }
-
-    /**
-     * Handles a key press during the gesture. May be called repeatedly when the
-     * user is holding the key for several seconds.
-     *
-     * @param event The SWT event for the key press,
-     * @return true if this gesture consumed the key press, otherwise return false
-     */
-    public boolean keyPressed(KeyEvent event) {
-        return false;
-    }
-
-    /**
-     * Handles a key release during the gesture.
-     *
-     * @param event The SWT event for the key release,
-     * @return true if this gesture consumed the key press, otherwise return false
-     */
-    public boolean keyReleased(KeyEvent event) {
-        return false;
-    }
-
-    /**
-     * Returns whether tooltips should be display below and to the right of the mouse
-     * cursor.
-     *
-     * @return a pair of booleans, the first indicating whether the tooltip should be
-     *         below and the second indicating whether the tooltip should be displayed to
-     *         the right of the mouse cursor.
-     */
-    public Pair<Boolean, Boolean> getTooltipPosition() {
-        return Pair.of(true, true);
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/GestureManager.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/GestureManager.java
deleted file mode 100644
index 98bc25e..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/GestureManager.java
+++ /dev/null
@@ -1,930 +0,0 @@
-/*
- * Copyright (C) 2010 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.editors.layout.gle2;
-
-import com.android.SdkConstants;
-import com.android.ide.common.api.DropFeedback;
-import com.android.ide.common.api.IViewRule;
-import com.android.ide.common.api.Rect;
-import com.android.ide.common.api.SegmentType;
-import com.android.ide.eclipse.adt.internal.editors.layout.gre.NodeProxy;
-import com.android.utils.Pair;
-
-import org.eclipse.jface.action.IStatusLineManager;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.dnd.DND;
-import org.eclipse.swt.dnd.DragSource;
-import org.eclipse.swt.dnd.DragSourceEvent;
-import org.eclipse.swt.dnd.DragSourceListener;
-import org.eclipse.swt.dnd.DropTarget;
-import org.eclipse.swt.dnd.DropTargetEvent;
-import org.eclipse.swt.dnd.DropTargetListener;
-import org.eclipse.swt.dnd.TextTransfer;
-import org.eclipse.swt.events.KeyEvent;
-import org.eclipse.swt.events.KeyListener;
-import org.eclipse.swt.events.MouseEvent;
-import org.eclipse.swt.events.MouseListener;
-import org.eclipse.swt.events.MouseMoveListener;
-import org.eclipse.swt.events.MouseTrackListener;
-import org.eclipse.swt.events.TypedEvent;
-import org.eclipse.swt.graphics.Cursor;
-import org.eclipse.swt.graphics.Device;
-import org.eclipse.swt.graphics.GC;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.graphics.ImageData;
-import org.eclipse.swt.graphics.Rectangle;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.ui.IEditorSite;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * The {@link GestureManager} is is the central manager of gestures; it is responsible
- * for recognizing when particular gestures should begin and terminate. It
- * listens to the drag, mouse and keyboard systems to find out when to start
- * gestures and in order to update the gestures along the way.
- */
-public class GestureManager {
-    /** The canvas which owns this GestureManager. */
-    private final LayoutCanvas mCanvas;
-
-    /** The currently executing gesture, or null. */
-    private Gesture mCurrentGesture;
-
-    /** A listener for drop target events. */
-    private final DropTargetListener mDropListener = new CanvasDropListener();
-
-    /** A listener for drag source events. */
-    private final DragSourceListener mDragSourceListener = new CanvasDragSourceListener();
-
-    /** Tooltip shown during the gesture, or null */
-    private GestureToolTip mTooltip;
-
-    /**
-     * The list of overlays associated with {@link #mCurrentGesture}. Will be
-     * null before it has been initialized lazily by the paint routine (the
-     * initialized value can never be null, but it can be an empty collection).
-     */
-    private List<Overlay> mOverlays;
-
-    /**
-     * Most recently seen mouse position (x coordinate). We keep a copy of this
-     * value since we sometimes need to know it when we aren't told about the
-     * mouse position (such as when a keystroke is received, such as an arrow
-     * key in order to tweak the current drop position)
-     */
-    protected int mLastMouseX;
-
-    /**
-     * Most recently seen mouse position (y coordinate). We keep a copy of this
-     * value since we sometimes need to know it when we aren't told about the
-     * mouse position (such as when a keystroke is received, such as an arrow
-     * key in order to tweak the current drop position)
-     */
-    protected int mLastMouseY;
-
-    /**
-     * Most recently seen mouse mask. We keep a copy of this since in some
-     * scenarios (such as on a drag gesture) we don't get access to it.
-     */
-    protected int mLastStateMask;
-
-    /**
-     * Listener for mouse motion, click and keyboard events.
-     */
-    private Listener mListener;
-
-    /**
-     * When we the drag leaves, we don't know if that's the last we'll see of
-     * this drag or if it's just temporarily outside the canvas and it will
-     * return. We want to restore it if it comes back. This is also necessary
-     * because even on a drop we'll receive a
-     * {@link DropTargetListener#dragLeave} right before the drop, and we need
-     * to restore it in the drop. Therefore, when we lose a {@link DropGesture}
-     * to a {@link DropTargetListener#dragLeave}, we store a reference to the
-     * current gesture as a {@link #mZombieGesture}, since the gesture is dead
-     * but might be brought back to life if we see a subsequent
-     * {@link DropTargetListener#dragEnter} before another gesture begins.
-     */
-    private DropGesture mZombieGesture;
-
-    /**
-     * Flag tracking whether we've set a message or error message on the global status
-     * line (since we only want to clear that message if we have set it ourselves).
-     * This is the actual message rather than a boolean such that (if we can get our
-     * hands on the global message) we can check to see if the current message is the
-     * one we set and only in that case clear it when it is no longer applicable.
-     */
-    private String mDisplayingMessage;
-
-    /**
-     * Constructs a new {@link GestureManager} for the given
-     * {@link LayoutCanvas}.
-     *
-     * @param canvas The canvas which controls this {@link GestureManager}
-     */
-    public GestureManager(LayoutCanvas canvas) {
-        mCanvas = canvas;
-    }
-
-    /**
-     * Returns the canvas associated with this GestureManager.
-     *
-     * @return The {@link LayoutCanvas} associated with this GestureManager.
-     *         Never null.
-     */
-    public LayoutCanvas getCanvas() {
-        return mCanvas;
-    }
-
-    /**
-     * Returns the current gesture, if one is in progress, and otherwise returns
-     * null.
-     *
-     * @return The current gesture or null.
-     */
-    public Gesture getCurrentGesture() {
-        return mCurrentGesture;
-    }
-
-    /**
-     * Paints the overlays associated with the current gesture, if any.
-     *
-     * @param gc The graphics object to paint into.
-     */
-    public void paint(GC gc) {
-        if (mCurrentGesture == null) {
-            return;
-        }
-
-        if (mOverlays == null) {
-            mOverlays = mCurrentGesture.createOverlays();
-            Device device = gc.getDevice();
-            for (Overlay overlay : mOverlays) {
-                overlay.create(device);
-            }
-        }
-        for (Overlay overlay : mOverlays) {
-            overlay.paint(gc);
-        }
-    }
-
-    /**
-     * Registers all the listeners needed by the {@link GestureManager}.
-     *
-     * @param dragSource The drag source in the {@link LayoutCanvas} to listen
-     *            to.
-     * @param dropTarget The drop target in the {@link LayoutCanvas} to listen
-     *            to.
-     */
-    public void registerListeners(DragSource dragSource, DropTarget dropTarget) {
-        assert mListener == null;
-        mListener = new Listener();
-        mCanvas.addMouseMoveListener(mListener);
-        mCanvas.addMouseListener(mListener);
-        mCanvas.addKeyListener(mListener);
-
-        if (dragSource != null) {
-            dragSource.addDragListener(mDragSourceListener);
-        }
-        if (dropTarget != null) {
-            dropTarget.addDropListener(mDropListener);
-        }
-    }
-
-    /**
-     * Unregisters all the listeners previously registered by
-     * {@link #registerListeners}.
-     *
-     * @param dragSource The drag source in the {@link LayoutCanvas} to stop
-     *            listening to.
-     * @param dropTarget The drop target in the {@link LayoutCanvas} to stop
-     *            listening to.
-     */
-    public void unregisterListeners(DragSource dragSource, DropTarget dropTarget) {
-        if (mCanvas.isDisposed()) {
-            // If the LayoutCanvas is already disposed, we shouldn't try to unregister
-            // the listeners; they are already not active and an attempt to remove the
-            // listener will throw a widget-is-disposed exception.
-            mListener = null;
-            return;
-        }
-
-        if (mListener != null) {
-            mCanvas.removeMouseMoveListener(mListener);
-            mCanvas.removeMouseListener(mListener);
-            mCanvas.removeKeyListener(mListener);
-            mListener = null;
-        }
-
-        if (dragSource != null) {
-            dragSource.removeDragListener(mDragSourceListener);
-        }
-        if (dropTarget != null) {
-            dropTarget.removeDropListener(mDropListener);
-        }
-    }
-
-    /**
-     * Starts the given gesture.
-     *
-     * @param mousePos The most recent mouse coordinate applicable to the new
-     *            gesture, in control coordinates.
-     * @param gesture The gesture to initiate
-     */
-    private void startGesture(ControlPoint mousePos, Gesture gesture, int mask) {
-        if (mCurrentGesture != null) {
-            finishGesture(mousePos, true);
-            assert mCurrentGesture == null;
-        }
-
-        if (gesture != null) {
-            mCurrentGesture = gesture;
-            mCurrentGesture.begin(mousePos, mask);
-        }
-    }
-
-    /**
-     * Updates the current gesture, if any, for the given event.
-     *
-     * @param mousePos The most recent mouse coordinate applicable to the new
-     *            gesture, in control coordinates.
-     * @param event The event corresponding to this update. May be null. Don't
-     *            make any assumptions about the type of this event - for
-     *            example, it may not always be a MouseEvent, it could be a
-     *            DragSourceEvent, etc.
-     */
-    private void updateMouse(ControlPoint mousePos, TypedEvent event) {
-        if (mCurrentGesture != null) {
-            mCurrentGesture.update(mousePos);
-        }
-    }
-
-    /**
-     * Finish the given gesture, either from successful completion or from
-     * cancellation.
-     *
-     * @param mousePos The most recent mouse coordinate applicable to the new
-     *            gesture, in control coordinates.
-     * @param canceled True if and only if the gesture was canceled.
-     */
-    private void finishGesture(ControlPoint mousePos, boolean canceled) {
-        if (mCurrentGesture != null) {
-            mCurrentGesture.end(mousePos, canceled);
-            if (mOverlays != null) {
-                for (Overlay overlay : mOverlays) {
-                    overlay.dispose();
-                }
-                mOverlays = null;
-            }
-            mCurrentGesture = null;
-            mZombieGesture = null;
-            mLastStateMask = 0;
-            updateMessage(null);
-            updateCursor(mousePos);
-            mCanvas.redraw();
-        }
-    }
-
-    /**
-     * Update the cursor to show the type of operation we expect on a mouse press:
-     * <ul>
-     * <li>Over a selection handle, show a directional cursor depending on the position of
-     * the selection handle
-     * <li>Over a widget, show a move (hand) cursor
-     * <li>Otherwise, show the default arrow cursor
-     * </ul>
-     */
-    void updateCursor(ControlPoint controlPoint) {
-        // We don't hover on the root since it's not a widget per see and it is always there.
-        SelectionManager selectionManager = mCanvas.getSelectionManager();
-
-        if (!selectionManager.isEmpty()) {
-            Display display = mCanvas.getDisplay();
-            Pair<SelectionItem, SelectionHandle> handlePair =
-                selectionManager.findHandle(controlPoint);
-            if (handlePair != null) {
-                SelectionHandle handle = handlePair.getSecond();
-                int cursorType = handle.getSwtCursorType();
-                Cursor cursor = display.getSystemCursor(cursorType);
-                if (cursor != mCanvas.getCursor()) {
-                    mCanvas.setCursor(cursor);
-                }
-                return;
-            }
-
-            // See if it's over a selected view
-            LayoutPoint layoutPoint = controlPoint.toLayout();
-            for (SelectionItem item : selectionManager.getSelections()) {
-                if (item.getRect().contains(layoutPoint.x, layoutPoint.y)
-                        && !item.isRoot()) {
-                    Cursor cursor = display.getSystemCursor(SWT.CURSOR_HAND);
-                    if (cursor != mCanvas.getCursor()) {
-                        mCanvas.setCursor(cursor);
-                    }
-                    return;
-                }
-            }
-        }
-
-        if (mCanvas.getCursor() != null) {
-            mCanvas.setCursor(null);
-        }
-    }
-
-    /**
-     * Update the Eclipse status message with any feedback messages from the given
-     * {@link DropFeedback} object, or clean up if there is no more feedback to process
-     * @param feedback the feedback whose message we want to display, or null to clear the
-     *            message if previously set
-     */
-    void updateMessage(DropFeedback feedback) {
-        IEditorSite editorSite = mCanvas.getEditorDelegate().getEditor().getEditorSite();
-        IStatusLineManager status = editorSite.getActionBars().getStatusLineManager();
-        if (feedback == null) {
-            if (mDisplayingMessage != null) {
-                status.setMessage(null);
-                status.setErrorMessage(null);
-                mDisplayingMessage = null;
-            }
-        } else if (feedback.errorMessage != null) {
-            if (!feedback.errorMessage.equals(mDisplayingMessage)) {
-                mDisplayingMessage = feedback.errorMessage;
-                status.setErrorMessage(mDisplayingMessage);
-            }
-        } else if (feedback.message != null) {
-            if (!feedback.message.equals(mDisplayingMessage)) {
-                mDisplayingMessage = feedback.message;
-                status.setMessage(mDisplayingMessage);
-            }
-        } else if (mDisplayingMessage != null) {
-            // TODO: Can we check the existing message and only clear it if it's the
-            // same as the one we set?
-            mDisplayingMessage = null;
-            status.setMessage(null);
-            status.setErrorMessage(null);
-        }
-
-        // Tooltip
-        if (feedback != null && feedback.tooltip != null) {
-            Pair<Boolean,Boolean> position = mCurrentGesture.getTooltipPosition();
-            boolean below = position.getFirst();
-            if (feedback.tooltipY != null) {
-                below = feedback.tooltipY == SegmentType.BOTTOM;
-            }
-            boolean toRightOf = position.getSecond();
-            if (feedback.tooltipX != null) {
-                toRightOf = feedback.tooltipX == SegmentType.RIGHT;
-            }
-            if (mTooltip == null) {
-                mTooltip = new GestureToolTip(mCanvas, below, toRightOf);
-            }
-            mTooltip.update(feedback.tooltip, below, toRightOf);
-        } else if (mTooltip != null) {
-            mTooltip.dispose();
-            mTooltip = null;
-        }
-    }
-
-    /**
-     * Returns the current mouse position as a {@link ControlPoint}
-     *
-     * @return the current mouse position as a {@link ControlPoint}
-     */
-    public ControlPoint getCurrentControlPoint() {
-        return ControlPoint.create(mCanvas, mLastMouseX, mLastMouseY);
-    }
-
-    /**
-     * Returns the current SWT modifier key mask as an {@link IViewRule} modifier mask
-     *
-     * @return the current SWT modifier key mask as an {@link IViewRule} modifier mask
-     */
-    public int getRuleModifierMask() {
-        int swtMask = mLastStateMask;
-        int modifierMask = 0;
-        if ((swtMask & SWT.MOD1) != 0) {
-            modifierMask |= DropFeedback.MODIFIER1;
-        }
-        if ((swtMask & SWT.MOD2) != 0) {
-            modifierMask |= DropFeedback.MODIFIER2;
-        }
-        if ((swtMask & SWT.MOD3) != 0) {
-            modifierMask |= DropFeedback.MODIFIER3;
-        }
-        return modifierMask;
-    }
-
-    /**
-     * Helper class which implements the {@link MouseMoveListener},
-     * {@link MouseListener} and {@link KeyListener} interfaces.
-     */
-    private class Listener implements MouseMoveListener, MouseListener, MouseTrackListener,
-            KeyListener {
-
-        // --- MouseMoveListener ---
-
-        @Override
-        public void mouseMove(MouseEvent e) {
-            mLastMouseX = e.x;
-            mLastMouseY = e.y;
-            mLastStateMask = e.stateMask;
-
-            ControlPoint controlPoint = ControlPoint.create(mCanvas, e);
-            if ((e.stateMask & SWT.BUTTON_MASK) != 0) {
-                if (mCurrentGesture != null) {
-                    updateMouse(controlPoint, e);
-                    mCanvas.redraw();
-                }
-            } else {
-                updateCursor(controlPoint);
-                mCanvas.hover(e);
-                mCanvas.getPreviewManager().moved(controlPoint);
-            }
-        }
-
-        // --- MouseListener ---
-
-        @Override
-        public void mouseUp(MouseEvent e) {
-            ControlPoint mousePos = ControlPoint.create(mCanvas, e);
-
-            if (mCurrentGesture == null) {
-                // If clicking on a configuration preview, just process it there
-                if (mCanvas.getPreviewManager().click(mousePos)) {
-                    return;
-                }
-
-                // Just a click, select
-                Pair<SelectionItem, SelectionHandle> handlePair =
-                    mCanvas.getSelectionManager().findHandle(mousePos);
-                if (handlePair == null) {
-                    mCanvas.getSelectionManager().select(e);
-                }
-            }
-            if (mCurrentGesture == null) {
-                updateCursor(mousePos);
-            } else if (mCurrentGesture instanceof DropGesture) {
-                // Mouse Up shouldn't be delivered in the middle of a drag & drop -
-                // but this can happen on some versions of Linux
-                // (see http://code.google.com/p/android/issues/detail?id=19057 )
-                // and if we process the mouseUp it will abort the remainder of
-                // the drag & drop operation, so ignore this event!
-            } else {
-                finishGesture(mousePos, false);
-            }
-            mCanvas.redraw();
-        }
-
-        @Override
-        public void mouseDown(MouseEvent e) {
-            mLastMouseX = e.x;
-            mLastMouseY = e.y;
-            mLastStateMask = e.stateMask;
-
-            // Not yet used. Should be, for Mac and Linux.
-        }
-
-        @Override
-        public void mouseDoubleClick(MouseEvent e) {
-            // SWT delivers a double click event even if you click two different buttons
-            // in rapid succession. In any case, we only want to let you double click the
-            // first button to warp to XML:
-            if (e.button == 1) {
-                // Warp to the text editor and show the corresponding XML for the
-                // double-clicked widget
-                LayoutPoint p = ControlPoint.create(mCanvas, e).toLayout();
-                CanvasViewInfo vi = mCanvas.getViewHierarchy().findViewInfoAt(p);
-                if (vi != null) {
-                    mCanvas.show(vi);
-                }
-            }
-        }
-
-        // --- MouseTrackListener ---
-
-        @Override
-        public void mouseEnter(MouseEvent e) {
-            ControlPoint mousePos = ControlPoint.create(mCanvas, e);
-            mCanvas.getPreviewManager().enter(mousePos);
-        }
-
-        @Override
-        public void mouseExit(MouseEvent e) {
-            ControlPoint mousePos = ControlPoint.create(mCanvas, e);
-            mCanvas.getPreviewManager().exit(mousePos);
-        }
-
-        @Override
-        public void mouseHover(MouseEvent e) {
-        }
-
-        // --- KeyListener ---
-
-        @Override
-        public void keyPressed(KeyEvent e) {
-            mLastStateMask = e.stateMask;
-            // Workaround for the fact that in keyPressed the current state
-            // mask is not yet updated
-            if (e.keyCode == SWT.SHIFT) {
-                mLastStateMask |= SWT.MOD2;
-            }
-            if (SdkConstants.CURRENT_PLATFORM == SdkConstants.PLATFORM_DARWIN) {
-                if (e.keyCode == SWT.COMMAND) {
-                    mLastStateMask |= SWT.MOD1;
-                }
-            } else {
-                if (e.keyCode == SWT.CTRL) {
-                    mLastStateMask |= SWT.MOD1;
-                }
-            }
-
-            // Give gestures a first chance to see and consume the key press
-            if (mCurrentGesture != null) {
-                // unless it's "Escape", which cancels the gesture
-                if (e.keyCode == SWT.ESC) {
-                    ControlPoint controlPoint = ControlPoint.create(mCanvas,
-                            mLastMouseX, mLastMouseY);
-                    finishGesture(controlPoint, true);
-                    return;
-                }
-
-                if (mCurrentGesture.keyPressed(e)) {
-                    return;
-                }
-            }
-
-            // Fall back to canvas actions for the key press
-            mCanvas.handleKeyPressed(e);
-        }
-
-        @Override
-        public void keyReleased(KeyEvent e) {
-            mLastStateMask = e.stateMask;
-            // Workaround for the fact that in keyPressed the current state
-            // mask is not yet updated
-            if (e.keyCode == SWT.SHIFT) {
-                mLastStateMask &= ~SWT.MOD2;
-            }
-            if (SdkConstants.CURRENT_PLATFORM == SdkConstants.PLATFORM_DARWIN) {
-                if (e.keyCode == SWT.COMMAND) {
-                    mLastStateMask &= ~SWT.MOD1;
-                }
-            } else {
-                if (e.keyCode == SWT.CTRL) {
-                    mLastStateMask &= ~SWT.MOD1;
-                }
-            }
-
-            if (mCurrentGesture != null) {
-                mCurrentGesture.keyReleased(e);
-            }
-        }
-    }
-
-    /** Listener for Drag &amp; Drop events. */
-    private class CanvasDropListener implements DropTargetListener {
-        public CanvasDropListener() {
-        }
-
-        /**
-         * The cursor has entered the drop target boundaries. {@inheritDoc}
-         */
-        @Override
-        public void dragEnter(DropTargetEvent event) {
-            mCanvas.showInvisibleViews(true);
-            mCanvas.getEditorDelegate().getGraphicalEditor().dismissHoverPalette();
-
-            if (mCurrentGesture == null) {
-                Gesture newGesture = mZombieGesture;
-                if (newGesture == null) {
-                    newGesture = new MoveGesture(mCanvas);
-                } else {
-                    mZombieGesture = null;
-                }
-                startGesture(ControlPoint.create(mCanvas, event),
-                        newGesture, 0);
-            }
-
-            if (mCurrentGesture instanceof DropGesture) {
-                ((DropGesture) mCurrentGesture).dragEnter(event);
-            }
-        }
-
-        /**
-         * The cursor is moving over the drop target. {@inheritDoc}
-         */
-        @Override
-        public void dragOver(DropTargetEvent event) {
-            if (mCurrentGesture instanceof DropGesture) {
-                ((DropGesture) mCurrentGesture).dragOver(event);
-            }
-        }
-
-        /**
-         * The cursor has left the drop target boundaries OR data is about to be
-         * dropped. {@inheritDoc}
-         */
-        @Override
-        public void dragLeave(DropTargetEvent event) {
-            if (mCurrentGesture instanceof DropGesture) {
-                DropGesture dropGesture = (DropGesture) mCurrentGesture;
-                dropGesture.dragLeave(event);
-                finishGesture(ControlPoint.create(mCanvas, event), true);
-                mZombieGesture = dropGesture;
-            }
-
-            mCanvas.showInvisibleViews(false);
-        }
-
-        /**
-         * The drop is about to be performed. The drop target is given a last
-         * chance to change the nature of the drop. {@inheritDoc}
-         */
-        @Override
-        public void dropAccept(DropTargetEvent event) {
-            Gesture gesture = mCurrentGesture != null ? mCurrentGesture : mZombieGesture;
-            if (gesture instanceof DropGesture) {
-                ((DropGesture) gesture).dropAccept(event);
-            }
-        }
-
-        /**
-         * The data is being dropped. {@inheritDoc}
-         */
-        @Override
-        public void drop(final DropTargetEvent event) {
-            // See if we had a gesture just prior to the drop (we receive a dragLeave
-            // right before the drop which we don't know whether means the cursor has
-            // left the canvas for good or just before a drop)
-            Gesture gesture = mCurrentGesture != null ? mCurrentGesture : mZombieGesture;
-            mZombieGesture = null;
-
-            if (gesture instanceof DropGesture) {
-                ((DropGesture) gesture).drop(event);
-
-                finishGesture(ControlPoint.create(mCanvas, event), true);
-            }
-        }
-
-        /**
-         * The operation being performed has changed (e.g. modifier key).
-         * {@inheritDoc}
-         */
-        @Override
-        public void dragOperationChanged(DropTargetEvent event) {
-            if (mCurrentGesture instanceof DropGesture) {
-                ((DropGesture) mCurrentGesture).dragOperationChanged(event);
-            }
-        }
-    }
-
-    /**
-     * Our canvas {@link DragSourceListener}. Handles drag being started and
-     * finished and generating the drag data.
-     */
-    private class CanvasDragSourceListener implements DragSourceListener {
-
-        /**
-         * The current selection being dragged. This may be a subset of the
-         * canvas selection due to the "sanitize" pass. Can be empty but never
-         * null.
-         */
-        private final ArrayList<SelectionItem> mDragSelection = new ArrayList<SelectionItem>();
-
-        private SimpleElement[] mDragElements;
-
-        /**
-         * The user has begun the actions required to drag the widget.
-         * <p/>
-         * Initiate a drag only if there is one or more item selected. If
-         * there's none, try to auto-select the one under the cursor.
-         * {@inheritDoc}
-         */
-        @Override
-        public void dragStart(DragSourceEvent e) {
-            LayoutPoint p = LayoutPoint.create(mCanvas, e);
-            ControlPoint controlPoint = ControlPoint.create(mCanvas, e);
-            SelectionManager selectionManager = mCanvas.getSelectionManager();
-
-            // See if the mouse is over a selection handle; if so, start a resizing
-            // gesture.
-            Pair<SelectionItem, SelectionHandle> handle =
-                selectionManager.findHandle(controlPoint);
-            if (handle != null) {
-                startGesture(controlPoint, new ResizeGesture(mCanvas, handle.getFirst(),
-                        handle.getSecond()), mLastStateMask);
-                e.detail = DND.DROP_NONE;
-                e.doit = false;
-                mCanvas.redraw();
-                return;
-            }
-
-            // We need a selection (simple or multiple) to do any transfer.
-            // If there's a selection *and* the cursor is over this selection,
-            // use all the currently selected elements.
-            // If there is no selection or the cursor is not over a selected
-            // element, *change* the selection to match the element under the
-            // cursor and use that. If nothing can be selected, abort the drag
-            // operation.
-            List<SelectionItem> selections = selectionManager.getSelections();
-            mDragSelection.clear();
-            SelectionItem primary = null;
-
-            if (!selections.isEmpty()) {
-                // Is the cursor on top of a selected element?
-                boolean insideSelection = false;
-
-                for (SelectionItem cs : selections) {
-                    if (!cs.isRoot() && cs.getRect().contains(p.x, p.y)) {
-                        primary = cs;
-                        insideSelection = true;
-                        break;
-                    }
-                }
-
-                if (!insideSelection) {
-                    CanvasViewInfo vi = mCanvas.getViewHierarchy().findViewInfoAt(p);
-                    if (vi != null && !vi.isRoot() && !vi.isHidden()) {
-                        primary = selectionManager.selectSingle(vi);
-                        insideSelection = true;
-                    }
-                }
-
-                if (insideSelection) {
-                    // We should now have a proper selection that matches the
-                    // cursor. Let's use this one. We make a copy of it since
-                    // the "sanitize" pass below might remove some of the
-                    // selected objects.
-                    if (selections.size() == 1) {
-                        // You are dragging just one element - this might or
-                        // might not be the root, but if it's the root that is
-                        // fine since we will let you drag the root if it is the
-                        // only thing you are dragging.
-                        mDragSelection.addAll(selections);
-                    } else {
-                        // Only drag non-root items.
-                        for (SelectionItem cs : selections) {
-                            if (!cs.isRoot() && !cs.isHidden()) {
-                                mDragSelection.add(cs);
-                            } else if (cs == primary) {
-                                primary = null;
-                            }
-                        }
-                    }
-                }
-            }
-
-            // If you are dragging a non-selected item, select it
-            if (mDragSelection.isEmpty()) {
-                CanvasViewInfo vi = mCanvas.getViewHierarchy().findViewInfoAt(p);
-                if (vi != null && !vi.isRoot() && !vi.isHidden()) {
-                    primary = selectionManager.selectSingle(vi);
-                    mDragSelection.addAll(selections);
-                }
-            }
-
-            SelectionManager.sanitize(mDragSelection);
-
-            e.doit = !mDragSelection.isEmpty();
-            int imageCount = mDragSelection.size();
-            if (e.doit) {
-                mDragElements = SelectionItem.getAsElements(mDragSelection, primary);
-                GlobalCanvasDragInfo.getInstance().startDrag(mDragElements,
-                        mDragSelection.toArray(new SelectionItem[imageCount]),
-                        mCanvas, new Runnable() {
-                            @Override
-                            public void run() {
-                                mCanvas.getClipboardSupport().deleteSelection("Remove",
-                                        mDragSelection);
-                            }
-                        });
-            }
-
-            // If you drag on the -background-, we make that into a marquee
-            // selection
-            if (!e.doit || (imageCount == 1
-                    && (mDragSelection.get(0).isRoot() || mDragSelection.get(0).isHidden()))) {
-                boolean toggle = (mLastStateMask & (SWT.CTRL | SWT.SHIFT | SWT.COMMAND)) != 0;
-                startGesture(controlPoint,
-                        new MarqueeGesture(mCanvas, toggle), mLastStateMask);
-                e.detail = DND.DROP_NONE;
-                e.doit = false;
-            } else {
-                // Otherwise, the drag means you are moving something
-                mCanvas.showInvisibleViews(true);
-                startGesture(controlPoint, new MoveGesture(mCanvas), 0);
-
-                // Render drag-images: Copy portions of the full screen render.
-                Image image = mCanvas.getImageOverlay().getImage();
-                if (image != null) {
-                    /**
-                     * Transparency of the dragged image ([0-255]). We're using 30%
-                     * translucency to make the image faint and not obscure the drag
-                     * feedback below it.
-                     */
-                    final byte DRAG_TRANSPARENCY = (byte) (0.3 * 255);
-
-                    List<Rectangle> rectangles = new ArrayList<Rectangle>(imageCount);
-                    if (imageCount > 0) {
-                        ImageData data = image.getImageData();
-                        Rectangle imageRectangle = new Rectangle(0, 0, data.width, data.height);
-                        for (SelectionItem item : mDragSelection) {
-                            Rectangle bounds = item.getRect();
-                            // Some bounds can be outside the rendered rectangle (for
-                            // example, in an absolute layout, you can have negative
-                            // coordinates), so create the intersection of these bounds.
-                            Rectangle clippedBounds = imageRectangle.intersection(bounds);
-                            rectangles.add(clippedBounds);
-                        }
-                        Rectangle boundingBox = ImageUtils.getBoundingRectangle(rectangles);
-                        double scale = mCanvas.getHorizontalTransform().getScale();
-                        e.image = SwtUtils.drawRectangles(image, rectangles, boundingBox, scale,
-                                DRAG_TRANSPARENCY);
-
-                        // Set the image offset such that we preserve the relative
-                        // distance between the mouse pointer and the top left corner of
-                        // the dragged view
-                        int deltaX = (int) (scale * (boundingBox.x - p.x));
-                        int deltaY = (int) (scale * (boundingBox.y - p.y));
-                        e.offsetX = -deltaX;
-                        e.offsetY = -deltaY;
-
-                        // View rules may need to know it as well
-                        GlobalCanvasDragInfo dragInfo = GlobalCanvasDragInfo.getInstance();
-                        Rect dragBounds = null;
-                        int width = (int) (scale * boundingBox.width);
-                        int height = (int) (scale * boundingBox.height);
-                        dragBounds = new Rect(deltaX, deltaY, width, height);
-                        dragInfo.setDragBounds(dragBounds);
-
-                        // Record the baseline such that we can perform baseline alignment
-                        // on the node as it's dragged around
-                        NodeProxy firstNode =
-                            mCanvas.getNodeFactory().create(mDragSelection.get(0).getViewInfo());
-                        dragInfo.setDragBaseline(firstNode.getBaseline());
-                    }
-                }
-            }
-
-            // No hover during drag (since no mouse over events are delivered
-            // during a drag to keep the hovers up to date anyway)
-            mCanvas.clearHover();
-
-            mCanvas.redraw();
-        }
-
-        /**
-         * Callback invoked when data is needed for the event, typically right
-         * before drop. The drop side decides what type of transfer to use and
-         * this side must now provide the adequate data. {@inheritDoc}
-         */
-        @Override
-        public void dragSetData(DragSourceEvent e) {
-            if (TextTransfer.getInstance().isSupportedType(e.dataType)) {
-                e.data = SelectionItem.getAsText(mCanvas, mDragSelection);
-                return;
-            }
-
-            if (SimpleXmlTransfer.getInstance().isSupportedType(e.dataType)) {
-                e.data = mDragElements;
-                return;
-            }
-
-            // otherwise we failed
-            e.detail = DND.DROP_NONE;
-            e.doit = false;
-        }
-
-        /**
-         * Callback invoked when the drop has been finished either way. On a
-         * successful move, remove the originating elements.
-         */
-        @Override
-        public void dragFinished(DragSourceEvent e) {
-            // Clear the selection
-            mDragSelection.clear();
-            mDragElements = null;
-            GlobalCanvasDragInfo.getInstance().stopDrag();
-
-            finishGesture(ControlPoint.create(mCanvas, e), e.detail == DND.DROP_NONE);
-            mCanvas.showInvisibleViews(false);
-            mCanvas.redraw();
-        }
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/GestureToolTip.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/GestureToolTip.java
deleted file mode 100644
index a49e79c..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/GestureToolTip.java
+++ /dev/null
@@ -1,217 +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.eclipse.adt.internal.editors.layout.gle2;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.CLabel;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.FontData;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.layout.FillLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Shell;
-
-/**
- * A dedicated tooltip used during gestures, for example to show the resize dimensions.
- * <p>
- * This is necessary because {@link org.eclipse.jface.window.ToolTip} causes flicker when
- * used to dynamically update the position and text of the tip, and it does not seem to
- * have setter methods to update the text or position without recreating the tip.
- */
-public class GestureToolTip {
-    /** Minimum number of milliseconds to wait between alignment changes */
-    private static final int TIMEOUT_MS = 750;
-
-    /**
-     * The alpha to use for the tooltip window (which sadly will apply to the tooltip text
-     * as well.)
-     */
-    private static final int SHELL_TRANSPARENCY = 220;
-
-    /** The size of the font displayed in the tooltip */
-    private static final int FONT_SIZE = 9;
-
-    /** Horizontal delta from the mouse cursor to shift the tooltip by */
-    private static final int OFFSET_X = 20;
-
-    /** Vertical delta from the mouse cursor to shift the tooltip by */
-    private static final int OFFSET_Y = 20;
-
-    /** The label which displays the tooltip */
-    private CLabel mLabel;
-
-    /** The shell holding the tooltip */
-    private Shell mShell;
-
-    /** The font shown in the label; held here such that it can be disposed of after use */
-    private Font mFont;
-
-    /** Is the tooltip positioned below the given anchor? */
-    private boolean mBelow;
-
-    /** Is the tooltip positioned to the right of the given anchor? */
-    private boolean mToRightOf;
-
-    /** Is an alignment change pending? */
-    private boolean mTimerPending;
-
-    /** The new value for {@link #mBelow} when the timer expires */
-    private boolean mPendingBelow;
-
-    /** The new value for {@link #mToRightOf} when the timer expires */
-    private boolean mPendingRight;
-
-    /** The time stamp (from {@link System#currentTimeMillis()} of the last alignment change */
-    private long mLastAlignmentTime;
-
-    /**
-     * Creates a new tooltip over the given parent with the given relative position.
-     *
-     * @param parent the parent control
-     * @param below if true, display the tooltip below the mouse cursor otherwise above
-     * @param toRightOf if true, display the tooltip to the right of the mouse cursor,
-     *            otherwise to the left
-     */
-    public GestureToolTip(Composite parent, boolean below, boolean toRightOf) {
-        mBelow = below;
-        mToRightOf = toRightOf;
-        mLastAlignmentTime = System.currentTimeMillis();
-
-        mShell = new Shell(parent.getShell(), SWT.ON_TOP | SWT.TOOL | SWT.NO_FOCUS);
-        mShell.setLayout(new FillLayout());
-        mShell.setAlpha(SHELL_TRANSPARENCY);
-
-        Display display = parent.getDisplay();
-        mLabel = new CLabel(mShell, SWT.SHADOW_NONE);
-        mLabel.setBackground(display.getSystemColor(SWT.COLOR_INFO_BACKGROUND));
-        mLabel.setForeground(display.getSystemColor(SWT.COLOR_INFO_FOREGROUND));
-
-        Font systemFont = display.getSystemFont();
-        FontData[] fd = systemFont.getFontData();
-        for (int i = 0; i < fd.length; i++) {
-            fd[i].setHeight(FONT_SIZE);
-        }
-        mFont = new Font(display, fd);
-        mLabel.setFont(mFont);
-
-        mShell.setVisible(false);
-    }
-
-    /**
-     * Show the tooltip at the given position and with the given text. Note that the
-     * position may not be applied immediately; to prevent flicker alignment changes
-     * are queued up with a timer (unless it's been a while since the last change, in
-     * which case the update is applied immediately.)
-     *
-     * @param text the new text to be displayed
-     * @param below if true, display the tooltip below the mouse cursor otherwise above
-     * @param toRightOf if true, display the tooltip to the right of the mouse cursor,
-     *            otherwise to the left
-     */
-    public void update(final String text, boolean below, boolean toRightOf) {
-        // If the alignment has not changed recently, just apply the change immediately
-        // instead of within a delay
-        if (!mTimerPending && (below != mBelow || toRightOf != mToRightOf)
-                && (System.currentTimeMillis() - mLastAlignmentTime >= TIMEOUT_MS)) {
-            mBelow = below;
-            mToRightOf = toRightOf;
-            mLastAlignmentTime = System.currentTimeMillis();
-        }
-
-        Point location = mShell.getDisplay().getCursorLocation();
-
-        mLabel.setText(text);
-
-        // Pack the label to its minimum size -- unless we are positioning the tooltip
-        // on the left. Because of the way SWT works (at least on the OSX) this sometimes
-        // creates flicker, because when we switch to a longer string (such as when
-        // switching from "52dp" to "wrap_content" during a resize) the window size will
-        // change first, and then the location will update later - so there will be a
-        // brief flash of the longer label before it is moved to the right position on the
-        // left. To work around this, we simply pass false to pack such that it will reuse
-        // its cached size, which in practice means that for labels on the right, the
-        // label will grow but not shrink.
-        // This workaround is disabled because it doesn't work well in Eclipse 3.5; the
-        // labels don't grow when they should. Re-enable when we drop 3.5 support.
-        //boolean changed = mToRightOf;
-        boolean changed = true;
-
-        mShell.pack(changed);
-        Point size = mShell.getSize();
-
-        // Position the tooltip to the left or right, and above or below, according
-        // to the saved state of these flags, not the current parameters. We don't want
-        // to flicker, instead we react on a timer to changes in alignment below.
-        if (mBelow) {
-            location.y += OFFSET_Y;
-        } else {
-            location.y -= OFFSET_Y;
-            location.y -= size.y;
-        }
-
-        if (mToRightOf) {
-            location.x += OFFSET_X;
-        } else {
-            location.x -= OFFSET_X;
-            location.x -= size.x;
-        }
-
-        mShell.setLocation(location);
-
-        if (!mShell.isVisible()) {
-            mShell.setVisible(true);
-        }
-
-        // Has the orientation changed?
-        mPendingBelow = below;
-        mPendingRight = toRightOf;
-        if (below != mBelow || toRightOf != mToRightOf) {
-            // Yes, so schedule a timer (unless one is already scheduled)
-            if (!mTimerPending) {
-                mTimerPending = true;
-                final Runnable timer = new Runnable() {
-                    @Override
-                    public void run() {
-                        mTimerPending = false;
-                        // Check whether the alignment is still different than the target
-                        // (since we may change back and forth repeatedly during the timeout)
-                        if (mBelow != mPendingBelow || mToRightOf != mPendingRight) {
-                            mBelow = mPendingBelow;
-                            mToRightOf = mPendingRight;
-                            mLastAlignmentTime = System.currentTimeMillis();
-                            if (mShell != null && mShell.isVisible()) {
-                                update(text, mBelow, mToRightOf);
-                            }
-                        }
-                    }
-                };
-                mShell.getDisplay().timerExec(TIMEOUT_MS, timer);
-            }
-        }
-    }
-
-    /** Hide the tooltip and dispose of any associated resources */
-    public void dispose() {
-        mShell.dispose();
-        mFont.dispose();
-
-        mShell = null;
-        mFont = null;
-        mLabel = null;
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/GlobalCanvasDragInfo.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/GlobalCanvasDragInfo.java
deleted file mode 100644
index b918b00..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/GlobalCanvasDragInfo.java
+++ /dev/null
@@ -1,182 +0,0 @@
-/*
- * Copyright (C) 2010 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.editors.layout.gle2;
-
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-import com.android.ide.common.api.IViewRule;
-import com.android.ide.common.api.Rect;
-
-
-/**
- * This singleton is used to keep track of drag'n'drops initiated within this
- * session of Eclipse. A drag can be initiated from a palette or from a canvas
- * and its content is an Android View fully-qualified class name.
- * <p/>
- * Overall this is a workaround: the issue is that the drag'n'drop SWT API does not
- * allow us to know the transfered data during the initial drag -- only when the
- * data is dropped do we know what it is about (and to be more exact there is a workaround
- * to do just that which works on Windows but not on Linux/Mac SWT).
- * <p/>
- * In the GLE we'd like to adjust drag feedback to the data being actually dropped.
- * The singleton instance of this class will be used to track the data currently dragged
- * off a canvas or its palette and then set back to null when the drag'n'drop is finished.
- * <p/>
- * Note that when a drag starts in one instance of Eclipse and the dragOver/drop is done
- * in a <em>separate</em> instance of Eclipse, the dragged FQCN won't be registered here
- * and will be null.
- */
-final class GlobalCanvasDragInfo {
-
-    private static final GlobalCanvasDragInfo sInstance = new GlobalCanvasDragInfo();
-
-    private SimpleElement[] mCurrentElements = null;
-    private SelectionItem[] mCurrentSelection;
-    private Object mSourceCanvas = null;
-    private Runnable mRemoveSourceHandler;
-    private Rect mDragBounds;
-    private int mDragBaseline = -1;
-
-    /** Private constructor. Use {@link #getInstance()} to retrieve the singleton. */
-    private GlobalCanvasDragInfo() {
-        // pass
-    }
-
-    /** Returns the singleton instance. */
-    public static GlobalCanvasDragInfo getInstance() {
-        return sInstance;
-    }
-
-    /**
-     * Registers the XML elements being dragged.
-     *
-     * @param elements The elements being dragged
-     * @param primary the "primary" element among the elements; when there is a
-     *            single item dragged this will be the same, but in
-     *            multi-selection it will be the element under the mouse as the
-     *            selection was initiated
-     * @param selection The selection (which can be null, for example when the
-     *            user drags from the palette)
-     * @param sourceCanvas An object representing the source we are dragging
-     *            from (used for identity comparisons only)
-     * @param removeSourceHandler A runnable (or null) which can clean up the
-     *            source. It should only be invoked if the drag operation is a
-     *            move, not a copy.
-     */
-    public void startDrag(
-            @NonNull SimpleElement[] elements,
-            @Nullable SelectionItem[] selection,
-            @Nullable Object sourceCanvas,
-            @Nullable Runnable removeSourceHandler) {
-        mCurrentElements = elements;
-        mCurrentSelection = selection;
-        mSourceCanvas = sourceCanvas;
-        mRemoveSourceHandler = removeSourceHandler;
-    }
-
-    /** Unregisters elements being dragged. */
-    public void stopDrag() {
-        mCurrentElements = null;
-        mCurrentSelection = null;
-        mSourceCanvas = null;
-        mRemoveSourceHandler = null;
-        mDragBounds = null;
-    }
-
-    public boolean isDragging() {
-        return mCurrentElements != null;
-    }
-
-    /** Returns the elements being dragged. */
-    @NonNull
-    public SimpleElement[] getCurrentElements() {
-        return mCurrentElements;
-    }
-
-    /** Returns the selection originally dragged.
-     * Can be null if the drag did not start in a canvas.
-     */
-    public SelectionItem[] getCurrentSelection() {
-        return mCurrentSelection;
-    }
-
-    /**
-     * Returns the object that call {@link #startDrag(SimpleElement[], SelectionItem[], Object)}.
-     * Can be null.
-     * This is not meant to access the object indirectly, it is just meant to compare if the
-     * source and the destination of the drag'n'drop are the same, so object identity
-     * is all what matters.
-     */
-    public Object getSourceCanvas() {
-        return mSourceCanvas;
-    }
-
-    /**
-     * Removes source of the drag. This should only be called when the drag and
-     * drop operation is a move (not a copy).
-     */
-    public void removeSource() {
-        if (mRemoveSourceHandler != null) {
-            mRemoveSourceHandler.run();
-            mRemoveSourceHandler = null;
-        }
-    }
-
-    /**
-     * Get the bounds of the drag, relative to the starting mouse position. For example,
-     * if you have a rectangular view of size 100x80, and you start dragging at position
-     * (15,20) from the top left corner of this rectangle, then the drag bounds would be
-     * (-15,-20, 100x80).
-     * <p>
-     * NOTE: The coordinate units will be in SWT/control pixels, not Android view pixels.
-     * In other words, they are affected by the canvas zoom: If you zoom the view and the
-     * bounds of a view grow, the drag bounds will be larger.
-     *
-     * @return the drag bounds, or null if there are no bounds for the current drag
-     */
-    public Rect getDragBounds() {
-        return mDragBounds;
-    }
-
-    /**
-     * Set the bounds of the drag, relative to the starting mouse position. See
-     * {@link #getDragBounds()} for details on the semantics of the drag bounds.
-     *
-     * @param dragBounds the new drag bounds, or null if there are no drag bounds
-     */
-    public void setDragBounds(Rect dragBounds) {
-        mDragBounds = dragBounds;
-    }
-
-    /**
-     * Returns the baseline of the drag, or -1 if not applicable
-     *
-     * @return the current SWT modifier key mask as an {@link IViewRule} modifier mask
-     */
-    public int getDragBaseline() {
-        return mDragBaseline;
-    }
-
-    /**
-     * Sets the baseline of the drag
-     *
-     * @param baseline the new baseline
-     */
-    public void setDragBaseline(int baseline) {
-        mDragBaseline = baseline;
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/GraphicalEditorPart.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/GraphicalEditorPart.java
deleted file mode 100644
index 0f5762d..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/GraphicalEditorPart.java
+++ /dev/null
@@ -1,2937 +0,0 @@
-/*
- * Copyright (C) 2009 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.editors.layout.gle2;
-
-import static com.android.SdkConstants.ANDROID_PKG;
-import static com.android.SdkConstants.ANDROID_STRING_PREFIX;
-import static com.android.SdkConstants.ANDROID_URI;
-import static com.android.SdkConstants.ATTR_CONTEXT;
-import static com.android.SdkConstants.ATTR_ID;
-import static com.android.SdkConstants.ATTR_LAYOUT_HEIGHT;
-import static com.android.SdkConstants.ATTR_LAYOUT_WIDTH;
-import static com.android.SdkConstants.FD_GEN_SOURCES;
-import static com.android.SdkConstants.GRID_LAYOUT;
-import static com.android.SdkConstants.SCROLL_VIEW;
-import static com.android.SdkConstants.STRING_PREFIX;
-import static com.android.SdkConstants.VALUE_FALSE;
-import static com.android.SdkConstants.VALUE_FILL_PARENT;
-import static com.android.SdkConstants.VALUE_MATCH_PARENT;
-import static com.android.SdkConstants.VALUE_WRAP_CONTENT;
-import static com.android.ide.common.rendering.RenderSecurityManager.ENABLED_PROPERTY;
-import static com.android.ide.eclipse.adt.internal.editors.layout.configuration.Configuration.CFG_DEVICE;
-import static com.android.ide.eclipse.adt.internal.editors.layout.configuration.Configuration.CFG_DEVICE_STATE;
-import static com.android.ide.eclipse.adt.internal.editors.layout.configuration.Configuration.CFG_FOLDER;
-import static com.android.ide.eclipse.adt.internal.editors.layout.configuration.Configuration.CFG_TARGET;
-import static com.android.ide.eclipse.adt.internal.editors.layout.descriptors.ViewElementDescriptor.viewNeedsPackage;
-import static org.eclipse.wb.core.controls.flyout.IFlyoutPreferences.DOCK_EAST;
-import static org.eclipse.wb.core.controls.flyout.IFlyoutPreferences.DOCK_WEST;
-import static org.eclipse.wb.core.controls.flyout.IFlyoutPreferences.STATE_COLLAPSED;
-import static org.eclipse.wb.core.controls.flyout.IFlyoutPreferences.STATE_OPEN;
-
-import com.android.SdkConstants;
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-import com.android.ide.common.layout.BaseLayoutRule;
-import com.android.ide.common.rendering.LayoutLibrary;
-import com.android.ide.common.rendering.RenderSecurityException;
-import com.android.ide.common.rendering.RenderSecurityManager;
-import com.android.ide.common.rendering.StaticRenderSession;
-import com.android.ide.common.rendering.api.Capability;
-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.SessionParams.RenderingMode;
-import com.android.ide.common.resources.ResourceRepository;
-import com.android.ide.common.resources.ResourceResolver;
-import com.android.ide.common.resources.configuration.FolderConfiguration;
-import com.android.ide.common.sdk.LoadStatus;
-import com.android.ide.eclipse.adt.AdtConstants;
-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.IPageImageProvider;
-import com.android.ide.eclipse.adt.internal.editors.IconFactory;
-import com.android.ide.eclipse.adt.internal.editors.common.CommonXmlDelegate;
-import com.android.ide.eclipse.adt.internal.editors.common.CommonXmlEditor;
-import com.android.ide.eclipse.adt.internal.editors.layout.LayoutEditorDelegate;
-import com.android.ide.eclipse.adt.internal.editors.layout.LayoutReloadMonitor;
-import com.android.ide.eclipse.adt.internal.editors.layout.LayoutReloadMonitor.ChangeFlags;
-import com.android.ide.eclipse.adt.internal.editors.layout.LayoutReloadMonitor.ILayoutReloadListener;
-import com.android.ide.eclipse.adt.internal.editors.layout.ProjectCallback;
-import com.android.ide.eclipse.adt.internal.editors.layout.configuration.Configuration;
-import com.android.ide.eclipse.adt.internal.editors.layout.configuration.ConfigurationChooser;
-import com.android.ide.eclipse.adt.internal.editors.layout.configuration.ConfigurationClient;
-import com.android.ide.eclipse.adt.internal.editors.layout.configuration.ConfigurationDescription;
-import com.android.ide.eclipse.adt.internal.editors.layout.configuration.ConfigurationMatcher;
-import com.android.ide.eclipse.adt.internal.editors.layout.configuration.LayoutCreatorDialog;
-import com.android.ide.eclipse.adt.internal.editors.layout.descriptors.LayoutDescriptors;
-import com.android.ide.eclipse.adt.internal.editors.layout.gle2.IncludeFinder.Reference;
-import com.android.ide.eclipse.adt.internal.editors.layout.gle2.PaletteControl.PalettePage;
-import com.android.ide.eclipse.adt.internal.editors.layout.gre.RulesEngine;
-import com.android.ide.eclipse.adt.internal.editors.layout.properties.PropertyFactory;
-import com.android.ide.eclipse.adt.internal.editors.manifest.ManifestInfo;
-import com.android.ide.eclipse.adt.internal.editors.uimodel.UiDocumentNode;
-import com.android.ide.eclipse.adt.internal.editors.uimodel.UiElementNode;
-import com.android.ide.eclipse.adt.internal.preferences.AdtPrefs;
-import com.android.ide.eclipse.adt.internal.resources.ResourceHelper;
-import com.android.ide.eclipse.adt.internal.resources.manager.ProjectResources;
-import com.android.ide.eclipse.adt.internal.resources.manager.ResourceManager;
-import com.android.ide.eclipse.adt.internal.sdk.AndroidTargetData;
-import com.android.ide.eclipse.adt.internal.sdk.Sdk;
-import com.android.ide.eclipse.adt.internal.sdk.Sdk.ITargetChangeListener;
-import com.android.resources.Density;
-import com.android.resources.ResourceFolderType;
-import com.android.resources.ResourceType;
-import com.android.sdklib.IAndroidTarget;
-import com.android.tools.lint.detector.api.LintUtils;
-import com.android.utils.Pair;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.core.runtime.QualifiedName;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.core.runtime.jobs.Job;
-import org.eclipse.jdt.core.IClasspathEntry;
-import org.eclipse.jdt.core.IJavaElement;
-import org.eclipse.jdt.core.IJavaModelMarker;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.IPackageFragment;
-import org.eclipse.jdt.core.IPackageFragmentRoot;
-import org.eclipse.jdt.core.JavaCore;
-import org.eclipse.jdt.core.JavaModelException;
-import org.eclipse.jdt.internal.ui.preferences.BuildPathsPropertyPage;
-import org.eclipse.jdt.ui.actions.OpenNewClassWizardAction;
-import org.eclipse.jdt.ui.wizards.NewClassWizardPage;
-import org.eclipse.jface.action.MenuManager;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.jface.text.BadLocationException;
-import org.eclipse.jface.text.IDocument;
-import org.eclipse.jface.text.source.ISourceViewer;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.ISelectionProvider;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.window.Window;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.SashForm;
-import org.eclipse.swt.custom.StyleRange;
-import org.eclipse.swt.custom.StyledText;
-import org.eclipse.swt.events.MouseAdapter;
-import org.eclipse.swt.events.MouseEvent;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.text.edits.MalformedTreeException;
-import org.eclipse.text.edits.MultiTextEdit;
-import org.eclipse.text.edits.ReplaceEdit;
-import org.eclipse.ui.IActionBars;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IEditorSite;
-import org.eclipse.ui.INullSelectionListener;
-import org.eclipse.ui.ISelectionListener;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.IWorkbenchPartSite;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.dialogs.PreferencesUtil;
-import org.eclipse.ui.ide.IDE;
-import org.eclipse.ui.part.EditorPart;
-import org.eclipse.ui.part.FileEditorInput;
-import org.eclipse.ui.part.IPageSite;
-import org.eclipse.ui.part.PageBookView;
-import org.eclipse.wb.core.controls.flyout.FlyoutControlComposite;
-import org.eclipse.wb.core.controls.flyout.IFlyoutListener;
-import org.eclipse.wb.core.controls.flyout.PluginFlyoutPreferences;
-import org.eclipse.wb.internal.core.editor.structure.PageSiteComposite;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-
-import java.io.File;
-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.Set;
-
-/**
- * Graphical layout editor part, version 2.
- * <p/>
- * The main component of the editor part is the {@link LayoutCanvasViewer}, which
- * actually delegates its work to the {@link LayoutCanvas} control.
- * <p/>
- * The {@link LayoutCanvasViewer} is set as the site's {@link ISelectionProvider}:
- * when the selection changes in the canvas, it is thus broadcasted to anyone listening
- * on the site's selection service.
- * <p/>
- * This part is also an {@link ISelectionListener}. It listens to the site's selection
- * service and thus receives selection changes from itself as well as the associated
- * outline and property sheet (these are registered by {@link LayoutEditorDelegate#delegateGetAdapter(Class)}).
- *
- * @since GLE2
- */
-public class GraphicalEditorPart extends EditorPart
-    implements IPageImageProvider, INullSelectionListener, IFlyoutListener,
-            ConfigurationClient {
-
-    /*
-     * Useful notes:
-     * To understand Drag & drop:
-     *   http://www.eclipse.org/articles/Article-Workbench-DND/drag_drop.html
-     *
-     * To understand the site's selection listener, selection provider, and the
-     * confusion of different-yet-similarly-named interfaces, consult this:
-     *   http://www.eclipse.org/articles/Article-WorkbenchSelections/article.html
-     *
-     * To summarize the selection mechanism:
-     * - The workbench site selection service can be seen as "centralized"
-     *   service that registers selection providers and selection listeners.
-     * - The editor part and the outline are selection providers.
-     * - The editor part, the outline and the property sheet are listeners
-     *   which all listen to each others indirectly.
-     */
-
-    /** Property key for the window preferences for the structure flyout */
-    private static final String PREF_STRUCTURE = "design.structure";     //$NON-NLS-1$
-
-    /** Property key for the window preferences for the palette flyout */
-    private static final String PREF_PALETTE = "design.palette";         //$NON-NLS-1$
-
-    /**
-     * Session-property on files which specifies the initial config state to be used on
-     * this file
-     */
-    public final static QualifiedName NAME_INITIAL_STATE =
-        new QualifiedName(AdtPlugin.PLUGIN_ID, "initialstate");//$NON-NLS-1$
-
-    /**
-     * Session-property on files which specifies the inclusion-context (reference to another layout
-     * which should be "including" this layout) when the file is opened
-     */
-    public final static QualifiedName NAME_INCLUDE =
-        new QualifiedName(AdtPlugin.PLUGIN_ID, "includer");//$NON-NLS-1$
-
-    /** Reference to the layout editor */
-    private final LayoutEditorDelegate mEditorDelegate;
-
-    /** Reference to the file being edited. Can also be used to access the {@link IProject}. */
-    private IFile mEditedFile;
-
-    /** The configuration chooser at the top of the layout editor. */
-    private ConfigurationChooser mConfigChooser;
-
-    /** The sash that splits the palette from the error view.
-     * The error view is shown only when needed. */
-    private SashForm mSashError;
-
-    /** The palette displayed on the left of the sash. */
-    private PaletteControl mPalette;
-
-    /** The layout canvas displayed to the right of the sash. */
-    private LayoutCanvasViewer mCanvasViewer;
-
-    /** The Rules Engine associated with this editor. It is project-specific. */
-    private RulesEngine mRulesEngine;
-
-    /** Styled text displaying the most recent error in the error view. */
-    private StyledText mErrorLabel;
-
-    /**
-     * The resource reference to a file that should surround this file (e.g. include this file
-     * visually), or null if not applicable
-     */
-    private Reference mIncludedWithin;
-
-    private Map<ResourceType, Map<String, ResourceValue>> mConfiguredFrameworkRes;
-    private Map<ResourceType, Map<String, ResourceValue>> mConfiguredProjectRes;
-    private ProjectCallback mProjectCallback;
-    private boolean mNeedsRecompute = false;
-    private TargetListener mTargetListener;
-    private ResourceResolver mResourceResolver;
-    private ReloadListener mReloadListener;
-    private int mMinSdkVersion;
-    private int mTargetSdkVersion;
-    private LayoutActionBar mActionBar;
-    private OutlinePage mOutlinePage;
-    private FlyoutControlComposite mStructureFlyout;
-    private FlyoutControlComposite mPaletteComposite;
-    private PropertyFactory mPropertyFactory;
-    private boolean mRenderedOnce;
-    private final Object mCredential = new Object();
-
-    /**
-     * Flags which tracks whether this editor is currently active which is set whenever
-     * {@link #activated()} is called and clear whenever {@link #deactivated()} is called.
-     * This is used to suppress repeated calls to {@link #activate()} to avoid doing
-     * unnecessary work.
-     */
-    private boolean mActive;
-
-    /**
-     * Constructs a new {@link GraphicalEditorPart}
-     *
-     * @param editorDelegate the associated XML editor delegate
-     */
-    public GraphicalEditorPart(@NonNull LayoutEditorDelegate editorDelegate) {
-        mEditorDelegate = editorDelegate;
-        setPartName("Graphical Layout");
-    }
-
-    // ------------------------------------
-    // Methods overridden from base classes
-    //------------------------------------
-
-    /**
-     * Initializes the editor part with a site and input.
-     * {@inheritDoc}
-     */
-    @Override
-    public void init(IEditorSite site, IEditorInput input) throws PartInitException {
-        setSite(site);
-        useNewEditorInput(input);
-
-        if (mTargetListener == null) {
-            mTargetListener = new TargetListener();
-            AdtPlugin.getDefault().addTargetListener(mTargetListener);
-
-            // Trigger a check to see if the SDK needs to be reloaded (which will
-            // invoke onSdkLoaded asynchronously as needed).
-            AdtPlugin.getDefault().refreshSdk();
-        }
-    }
-
-    private void useNewEditorInput(IEditorInput input) throws PartInitException {
-        // The contract of init() mentions we need to fail if we can't understand the input.
-        if (!(input instanceof FileEditorInput)) {
-            throw new PartInitException("Input is not of type FileEditorInput: " +  //$NON-NLS-1$
-                    input == null ? "null" : input.toString());                     //$NON-NLS-1$
-        }
-    }
-
-    @Override
-    public Image getPageImage() {
-        return IconFactory.getInstance().getIcon("editor_page_design");  //$NON-NLS-1$
-    }
-
-    @Override
-    public void createPartControl(Composite parent) {
-
-        Display d = parent.getDisplay();
-
-        GridLayout gl = new GridLayout(1, false);
-        parent.setLayout(gl);
-        gl.marginHeight = gl.marginWidth = 0;
-
-        // Check whether somebody has requested an initial state for the newly opened file.
-        // The initial state is a serialized version of the state compatible with
-        // {@link ConfigurationComposite#CONFIG_STATE}.
-        String initialState = null;
-        IFile file = mEditedFile;
-        if (file == null) {
-            IEditorInput input = mEditorDelegate.getEditor().getEditorInput();
-            if (input instanceof FileEditorInput) {
-                file = ((FileEditorInput) input).getFile();
-            }
-        }
-
-        if (file != null) {
-            try {
-                initialState = (String) file.getSessionProperty(NAME_INITIAL_STATE);
-                if (initialState != null) {
-                    // Only use once
-                    file.setSessionProperty(NAME_INITIAL_STATE, null);
-                }
-            } catch (CoreException e) {
-                AdtPlugin.log(e, "Can't read session property %1$s", NAME_INITIAL_STATE);
-            }
-        }
-
-        IPreferenceStore preferenceStore = AdtPlugin.getDefault().getPreferenceStore();
-        PluginFlyoutPreferences preferences;
-        preferences = new PluginFlyoutPreferences(preferenceStore, PREF_PALETTE);
-        preferences.initializeDefaults(DOCK_WEST, STATE_OPEN, 200);
-        mPaletteComposite = new FlyoutControlComposite(parent, SWT.NONE, preferences);
-        mPaletteComposite.setTitleText("Palette");
-        mPaletteComposite.setMinWidth(100);
-        Composite paletteParent = mPaletteComposite.getFlyoutParent();
-        Composite editorParent = mPaletteComposite.getClientParent();
-        mPaletteComposite.setListener(this);
-
-        mPaletteComposite.setLayoutData(new GridData(GridData.FILL_BOTH));
-
-        PageSiteComposite paletteComposite = new PageSiteComposite(paletteParent, SWT.BORDER);
-        paletteComposite.setTitleText("Palette");
-        paletteComposite.setTitleImage(IconFactory.getInstance().getIcon("palette"));
-        PalettePage decor = new PalettePage(this);
-        paletteComposite.setPage(decor);
-        mPalette = (PaletteControl) decor.getControl();
-        decor.createToolbarItems(paletteComposite.getToolBar());
-
-        // Create the shared structure+editor area
-        preferences = new PluginFlyoutPreferences(preferenceStore, PREF_STRUCTURE);
-        preferences.initializeDefaults(DOCK_EAST, STATE_OPEN, 300);
-        mStructureFlyout = new FlyoutControlComposite(editorParent, SWT.NONE, preferences);
-        mStructureFlyout.setTitleText("Structure");
-        mStructureFlyout.setMinWidth(150);
-        mStructureFlyout.setListener(this);
-
-        Composite layoutBarAndCanvas = new Composite(mStructureFlyout.getClientParent(), SWT.NONE);
-        GridLayout gridLayout = new GridLayout(1, false);
-        gridLayout.horizontalSpacing = 0;
-        gridLayout.verticalSpacing = 0;
-        gridLayout.marginWidth = 0;
-        gridLayout.marginHeight = 0;
-        layoutBarAndCanvas.setLayout(gridLayout);
-
-        mConfigChooser = new ConfigurationChooser(this, layoutBarAndCanvas, initialState);
-        mConfigChooser.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-
-        mActionBar = new LayoutActionBar(layoutBarAndCanvas, SWT.NONE, this);
-        GridData detailsData = new GridData(SWT.FILL, SWT.FILL, true, false, 1, 1);
-        mActionBar.setLayoutData(detailsData);
-        if (file != null) {
-            mActionBar.updateErrorIndicator(file);
-        }
-
-        mSashError = new SashForm(layoutBarAndCanvas, SWT.VERTICAL | SWT.BORDER);
-        mSashError.setLayoutData(new GridData(GridData.FILL_BOTH));
-
-        mCanvasViewer = new LayoutCanvasViewer(mEditorDelegate, mRulesEngine, mSashError, SWT.NONE);
-        mSashError.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));
-
-        mErrorLabel = new StyledText(mSashError, SWT.READ_ONLY | SWT.WRAP | SWT.V_SCROLL);
-        mErrorLabel.setEditable(false);
-        mErrorLabel.setBackground(d.getSystemColor(SWT.COLOR_INFO_BACKGROUND));
-        mErrorLabel.setForeground(d.getSystemColor(SWT.COLOR_INFO_FOREGROUND));
-        mErrorLabel.addMouseListener(new ErrorLabelListener());
-
-        mSashError.setWeights(new int[] { 80, 20 });
-        mSashError.setMaximizedControl(mCanvasViewer.getControl());
-
-        // Create the structure views. We really should do this *lazily*, but that
-        // seems to cause a bug: property sheet won't update. Track this down later.
-        createStructureViews(mStructureFlyout.getFlyoutParent(), false);
-        showStructureViews(false, false, false);
-
-        // Initialize the state
-        reloadPalette();
-
-        IWorkbenchPartSite site = getSite();
-        site.setSelectionProvider(mCanvasViewer);
-        site.getPage().addSelectionListener(this);
-    }
-
-    private void createStructureViews(Composite parent, boolean createPropertySheet) {
-        mOutlinePage = new OutlinePage(this);
-        mOutlinePage.setShowPropertySheet(createPropertySheet);
-        mOutlinePage.setShowHeader(true);
-
-        IPageSite pageSite = new IPageSite() {
-
-            @Override
-            public IWorkbenchPage getPage() {
-                return getSite().getPage();
-            }
-
-            @Override
-            public ISelectionProvider getSelectionProvider() {
-                return getSite().getSelectionProvider();
-            }
-
-            @Override
-            public Shell getShell() {
-                return getSite().getShell();
-            }
-
-            @Override
-            public IWorkbenchWindow getWorkbenchWindow() {
-                return getSite().getWorkbenchWindow();
-            }
-
-            @Override
-            public void setSelectionProvider(ISelectionProvider provider) {
-                getSite().setSelectionProvider(provider);
-            }
-
-            @Override
-            public Object getAdapter(Class adapter) {
-                return getSite().getAdapter(adapter);
-            }
-
-            @Override
-            public Object getService(Class api) {
-                return getSite().getService(api);
-            }
-
-            @Override
-            public boolean hasService(Class api) {
-                return getSite().hasService(api);
-            }
-
-            @Override
-            public void registerContextMenu(String menuId, MenuManager menuManager,
-                    ISelectionProvider selectionProvider) {
-            }
-
-            @Override
-            public IActionBars getActionBars() {
-                return null;
-            }
-        };
-        mOutlinePage.init(pageSite);
-        mOutlinePage.createControl(parent);
-        mOutlinePage.addSelectionChangedListener(new ISelectionChangedListener() {
-            @Override
-            public void selectionChanged(SelectionChangedEvent event) {
-                getCanvasControl().getSelectionManager().setSelection(event.getSelection());
-            }
-        });
-    }
-
-    /** Shows the embedded (within the layout editor) outline and or properties */
-    void showStructureViews(final boolean showOutline, final boolean showProperties,
-            final boolean updateLayout) {
-        Display display = mConfigChooser.getDisplay();
-        if (display.getThread() != Thread.currentThread()) {
-            display.asyncExec(new Runnable() {
-                @Override
-                public void run() {
-                    if (!mConfigChooser.isDisposed()) {
-                        showStructureViews(showOutline, showProperties, updateLayout);
-                    }
-                }
-
-            });
-            return;
-        }
-
-        boolean show = showOutline || showProperties;
-
-        Control[] children = mStructureFlyout.getFlyoutParent().getChildren();
-        if (children.length == 0) {
-            if (show) {
-                createStructureViews(mStructureFlyout.getFlyoutParent(), showProperties);
-            }
-            return;
-        }
-
-        mOutlinePage.setShowPropertySheet(showProperties);
-
-        Control control = children[0];
-        if (show != control.getVisible()) {
-            control.setVisible(show);
-            mOutlinePage.setActive(show); // disable/re-enable listeners etc
-            if (show) {
-                ISelection selection = getCanvasControl().getSelectionManager().getSelection();
-                mOutlinePage.selectionChanged(getEditorDelegate().getEditor(), selection);
-            }
-            if (updateLayout) {
-                mStructureFlyout.layout();
-            }
-            // TODO: *dispose* the non-showing widgets to save memory?
-        }
-    }
-
-    /**
-     * Returns the property factory associated with this editor
-     *
-     * @return the factory
-     */
-    @NonNull
-    public PropertyFactory getPropertyFactory() {
-        if (mPropertyFactory == null) {
-            mPropertyFactory = new PropertyFactory(this);
-        }
-
-        return mPropertyFactory;
-    }
-
-    /**
-     * Invoked by {@link LayoutCanvas} to set the model (a.k.a. the root view info).
-     *
-     * @param rootViewInfo The root of the view info hierarchy. Can be null.
-     */
-    public void setModel(CanvasViewInfo rootViewInfo) {
-        if (mOutlinePage != null) {
-            mOutlinePage.setModel(rootViewInfo);
-        }
-    }
-
-    /**
-     * Listens to workbench selections that does NOT come from {@link LayoutEditorDelegate}
-     * (those are generated by ourselves).
-     * <p/>
-     * Selection can be null, as indicated by this class implementing
-     * {@link INullSelectionListener}.
-     */
-    @Override
-    public void selectionChanged(IWorkbenchPart part, ISelection selection) {
-        Object delegate = part instanceof IEditorPart ?
-                LayoutEditorDelegate.fromEditor((IEditorPart) part) : null;
-        if (delegate == null) {
-            if (part instanceof PageBookView) {
-                PageBookView pbv = (PageBookView) part;
-                 org.eclipse.ui.part.IPage currentPage = pbv.getCurrentPage();
-                if (currentPage instanceof OutlinePage) {
-                    LayoutCanvas canvas = getCanvasControl();
-                    if (canvas != null && canvas.getOutlinePage() != currentPage) {
-                        // The notification is not for this view; ignore
-                        // (can happen when there are multiple pages simultaneously
-                        // visible)
-                        return;
-                    }
-                }
-            }
-            mCanvasViewer.setSelection(selection);
-        }
-    }
-
-    @Override
-    public void dispose() {
-        getSite().getPage().removeSelectionListener(this);
-        getSite().setSelectionProvider(null);
-
-        if (mTargetListener != null) {
-            AdtPlugin.getDefault().removeTargetListener(mTargetListener);
-            mTargetListener = null;
-        }
-
-        if (mReloadListener != null) {
-            LayoutReloadMonitor.getMonitor().removeListener(mReloadListener);
-            mReloadListener = null;
-        }
-
-        if (mCanvasViewer != null) {
-            mCanvasViewer.dispose();
-            mCanvasViewer = null;
-        }
-        super.dispose();
-    }
-
-    /**
-     * Select the visual element corresponding to the given XML node
-     * @param xmlNode The Node whose element we want to select
-     */
-    public void select(Node xmlNode) {
-        mCanvasViewer.getCanvas().getSelectionManager().select(xmlNode);
-    }
-
-    // ---- Implements ConfigurationClient ----
-    @Override
-    public void aboutToChange(int flags) {
-        if ((flags & CFG_TARGET) != 0) {
-            IAndroidTarget oldTarget = mConfigChooser.getConfiguration().getTarget();
-            preRenderingTargetChangeCleanUp(oldTarget);
-        }
-    }
-
-    @Override
-    public boolean changed(int flags) {
-        mConfiguredFrameworkRes = mConfiguredProjectRes = null;
-        mResourceResolver = null;
-
-        if (mEditedFile == null) {
-            return true;
-        }
-
-        // Before doing the normal process, test for the following case.
-        // - the editor is being opened (or reset for a new input)
-        // - the file being opened is not the best match for any possible configuration
-        // - another random compatible config was chosen in the config composite.
-        // The result is that 'match' will not be the file being edited, but because this is not
-        // due to a config change, we should not trigger opening the actual best match (also,
-        // because the editor is still opening the MatchingStrategy woudln't answer true
-        // and the best match file would open in a different editor).
-        // So the solution is that if the editor is being created, we just call recomputeLayout
-        // without looking for a better matching layout file.
-        if (mEditorDelegate.getEditor().isCreatingPages()) {
-            recomputeLayout();
-        } else {
-            boolean affectsFileSelection = (flags & Configuration.MASK_FILE_ATTRS) != 0;
-            IFile best = null;
-            // get the resources of the file's project.
-            if (affectsFileSelection) {
-                best = ConfigurationMatcher.getBestFileMatch(mConfigChooser);
-            }
-            if (best != null) {
-                if (!best.equals(mEditedFile)) {
-                    try {
-                        // tell the editor that the next replacement file is due to a config
-                        // change.
-                        mEditorDelegate.setNewFileOnConfigChange(true);
-
-                        boolean reuseEditor = AdtPrefs.getPrefs().isSharedLayoutEditor();
-                        if (!reuseEditor) {
-                            String data = ConfigurationDescription.getDescription(best);
-                            if (data == null) {
-                                // Not previously opened: duplicate the current state as
-                                // much as possible
-                                data = mConfigChooser.getConfiguration().toPersistentString();
-                                ConfigurationDescription.setDescription(best, data);
-                            }
-                        }
-
-                        // ask the IDE to open the replacement file.
-                        IDE.openEditor(getSite().getWorkbenchWindow().getActivePage(), best,
-                                CommonXmlEditor.ID);
-
-                        // we're done!
-                        return reuseEditor;
-                    } catch (PartInitException e) {
-                        // FIXME: do something!
-                    }
-                }
-
-                // at this point, we have not opened a new file.
-
-                // Store the state in the current file
-                mConfigChooser.saveConstraints();
-
-                // Even though the layout doesn't change, the config changed, and referenced
-                // resources need to be updated.
-                recomputeLayout();
-            } else if (affectsFileSelection) {
-                // display the error.
-                Configuration configuration = mConfigChooser.getConfiguration();
-                FolderConfiguration currentConfig = configuration.getFullConfig();
-                displayError(
-                        "No resources match the configuration\n" +
-                        " \n" +
-                        "\t%1$s\n" +
-                        " \n" +
-                        "Change the configuration or create:\n" +
-                        " \n" +
-                        "\tres/%2$s/%3$s\n" +
-                        " \n" +
-                        "You can also click the 'Create New...' item in the configuration " +
-                        "dropdown menu above.",
-                        currentConfig.toDisplayString(),
-                        currentConfig.getFolderName(ResourceFolderType.LAYOUT),
-                        mEditedFile.getName());
-            } else {
-                // Something else changed, such as the theme - just recompute existing
-                // layout
-                mConfigChooser.saveConstraints();
-                recomputeLayout();
-            }
-        }
-
-        if ((flags & CFG_TARGET) != 0) {
-            Configuration configuration = mConfigChooser.getConfiguration();
-            IAndroidTarget target = configuration.getTarget();
-            Sdk current = Sdk.getCurrent();
-            if (current != null) {
-                AndroidTargetData targetData = current.getTargetData(target);
-                updateCapabilities(targetData);
-            }
-        }
-
-        if ((flags & (CFG_DEVICE | CFG_DEVICE_STATE)) != 0) {
-            // When the device changes, zoom the view to fit, but only up to 100% (e.g. zoom
-            // out to fit the content, or zoom back in if we were zoomed out more from the
-            // previous view, but only up to 100% such that we never blow up pixels
-            if (mActionBar.isZoomingAllowed()) {
-                getCanvasControl().setFitScale(true,  true /*allowZoomIn*/);
-            }
-        }
-
-        reloadPalette();
-
-        getCanvasControl().getPreviewManager().configurationChanged(flags);
-
-        return true;
-    }
-
-    @Override
-    public void setActivity(@NonNull String activity) {
-        ManifestInfo manifest = ManifestInfo.get(mEditedFile.getProject());
-        String pkg = manifest.getPackage();
-        if (activity.startsWith(pkg) && activity.length() > pkg.length()
-                && activity.charAt(pkg.length()) == '.') {
-            activity = activity.substring(pkg.length());
-        }
-        CommonXmlEditor editor = getEditorDelegate().getEditor();
-        Element element = editor.getUiRootNode().getXmlDocument().getDocumentElement();
-        AdtUtils.setToolsAttribute(editor,
-                element, "Choose Activity", ATTR_CONTEXT,
-                activity, false /*reveal*/, false /*append*/);
-    }
-
-    /**
-     * Returns a {@link ProjectResources} for the framework resources based on the current
-     * configuration selection.
-     * @return the framework resources or null if not found.
-     */
-    @Override
-    @Nullable
-    public ResourceRepository getFrameworkResources() {
-        return getFrameworkResources(getRenderingTarget());
-    }
-
-    /**
-     * Returns a {@link ProjectResources} for the framework resources of a given
-     * target.
-     * @param target the target for which to return the framework resources.
-     * @return the framework resources or null if not found.
-     */
-    @Override
-    @Nullable
-    public ResourceRepository getFrameworkResources(@Nullable IAndroidTarget target) {
-        if (target != null) {
-            AndroidTargetData data = Sdk.getCurrent().getTargetData(target);
-
-            if (data != null) {
-                return data.getFrameworkResources();
-            }
-        }
-
-        return null;
-    }
-
-    @Override
-    @Nullable
-    public ProjectResources getProjectResources() {
-        if (mEditedFile != null) {
-            ResourceManager manager = ResourceManager.getInstance();
-            return manager.getProjectResources(mEditedFile.getProject());
-        }
-
-        return null;
-    }
-
-
-    @Override
-    @NonNull
-    public Map<ResourceType, Map<String, ResourceValue>> getConfiguredFrameworkResources() {
-        if (mConfiguredFrameworkRes == null && mConfigChooser != null) {
-            ResourceRepository frameworkRes = getFrameworkResources();
-
-            if (frameworkRes == null) {
-                AdtPlugin.log(IStatus.ERROR, "Failed to get ProjectResource for the framework");
-            } else {
-                // get the framework resource values based on the current config
-                mConfiguredFrameworkRes = frameworkRes.getConfiguredResources(
-                        mConfigChooser.getConfiguration().getFullConfig());
-            }
-        }
-
-        return mConfiguredFrameworkRes;
-    }
-
-    @Override
-    @NonNull
-    public Map<ResourceType, Map<String, ResourceValue>> getConfiguredProjectResources() {
-        if (mConfiguredProjectRes == null && mConfigChooser != null) {
-            ProjectResources project = getProjectResources();
-
-            // get the project resource values based on the current config
-            mConfiguredProjectRes = project.getConfiguredResources(
-                    mConfigChooser.getConfiguration().getFullConfig());
-        }
-
-        return mConfiguredProjectRes;
-    }
-
-    @Override
-    public void createConfigFile() {
-        LayoutCreatorDialog dialog = new LayoutCreatorDialog(mConfigChooser.getShell(),
-                mEditedFile.getName(), mConfigChooser.getConfiguration().getFullConfig());
-        if (dialog.open() != Window.OK) {
-            return;
-        }
-
-        FolderConfiguration config = new FolderConfiguration();
-        dialog.getConfiguration(config);
-
-        // Creates a new layout file from the specified {@link FolderConfiguration}.
-        CreateNewConfigJob job = new CreateNewConfigJob(this, mEditedFile, config);
-        job.schedule();
-    }
-
-    /**
-     * Returns the resource name of the file that is including this current layout, if any
-     * (may be null)
-     *
-     * @return the resource name of an including layout, or null
-     */
-    @Override
-    public Reference getIncludedWithin() {
-        return mIncludedWithin;
-    }
-
-    @Override
-    @Nullable
-    public LayoutCanvas getCanvas() {
-        return getCanvasControl();
-    }
-
-    /**
-     * Listens to target changed in the current project, to trigger a new layout rendering.
-     */
-    private class TargetListener implements ITargetChangeListener {
-
-        @Override
-        public void onProjectTargetChange(IProject changedProject) {
-            if (changedProject != null && changedProject.equals(getProject())) {
-                updateEditor();
-            }
-        }
-
-        @Override
-        public void onTargetLoaded(IAndroidTarget loadedTarget) {
-            IAndroidTarget target = getRenderingTarget();
-            if (target != null && target.equals(loadedTarget)) {
-                updateEditor();
-            }
-        }
-
-        @Override
-        public void onSdkLoaded() {
-            // get the current rendering target to unload it
-            IAndroidTarget oldTarget = getRenderingTarget();
-            preRenderingTargetChangeCleanUp(oldTarget);
-
-            computeSdkVersion();
-
-            // get the project target
-            Sdk currentSdk = Sdk.getCurrent();
-            if (currentSdk != null) {
-                IAndroidTarget target = currentSdk.getTarget(mEditedFile.getProject());
-                if (target != null) {
-                    mConfigChooser.onSdkLoaded(target);
-                    changed(CFG_FOLDER | CFG_TARGET);
-                }
-            }
-        }
-
-        private void updateEditor() {
-            mEditorDelegate.getEditor().commitPages(false /* onSave */);
-
-            // because the target changed we must reset the configured resources.
-            mConfiguredFrameworkRes = mConfiguredProjectRes = null;
-            mResourceResolver = null;
-
-            // make sure we remove the custom view loader, since its parent class loader is the
-            // bridge class loader.
-            mProjectCallback = null;
-
-            // recreate the ui root node always, this will also call onTargetChange
-            // on the config composite
-            mEditorDelegate.delegateInitUiRootNode(true /*force*/);
-        }
-
-        private IProject getProject() {
-            return getEditorDelegate().getEditor().getProject();
-        }
-    }
-
-    /** Refresh the configured project resources associated with this editor */
-    public void refreshProjectResources() {
-        mConfiguredProjectRes = null;
-        mResourceResolver = null;
-    }
-
-    /**
-     * Returns the currently edited file
-     *
-     * @return the currently edited file, or null
-     */
-    public IFile getEditedFile() {
-        return mEditedFile;
-    }
-
-    /**
-     * Returns the project for the currently edited file, or null
-     *
-     * @return the project containing the edited file, or null
-     */
-    public IProject getProject() {
-        if (mEditedFile != null) {
-            return mEditedFile.getProject();
-        } else {
-            return null;
-        }
-    }
-
-    // ----------------
-
-    /**
-     * Save operation in the Graphical Editor Part.
-     * <p/>
-     * In our workflow, the model is owned by the Structured XML Editor.
-     * The graphical layout editor just displays it -- thus we don't really
-     * save anything here.
-     * <p/>
-     * This must NOT call the parent editor part. At the contrary, the parent editor
-     * part will call this *after* having done the actual save operation.
-     * <p/>
-     * The only action this editor must do is mark the undo command stack as
-     * being no longer dirty.
-     */
-    @Override
-    public void doSave(IProgressMonitor monitor) {
-        // TODO implement a command stack
-//        getCommandStack().markSaveLocation();
-//        firePropertyChange(PROP_DIRTY);
-    }
-
-    /**
-     * Save operation in the Graphical Editor Part.
-     * <p/>
-     * In our workflow, the model is owned by the Structured XML Editor.
-     * The graphical layout editor just displays it -- thus we don't really
-     * save anything here.
-     */
-    @Override
-    public void doSaveAs() {
-        // pass
-    }
-
-    /**
-     * In our workflow, the model is owned by the Structured XML Editor.
-     * The graphical layout editor just displays it -- thus we don't really
-     * save anything here.
-     */
-    @Override
-    public boolean isDirty() {
-        return false;
-    }
-
-    /**
-     * In our workflow, the model is owned by the Structured XML Editor.
-     * The graphical layout editor just displays it -- thus we don't really
-     * save anything here.
-     */
-    @Override
-    public boolean isSaveAsAllowed() {
-        return false;
-    }
-
-    @Override
-    public void setFocus() {
-        // TODO Auto-generated method stub
-
-    }
-
-    /**
-     * Responds to a page change that made the Graphical editor page the activated page.
-     */
-    public void activated() {
-        if (!mActive) {
-            mActive = true;
-
-            syncDockingState();
-            mActionBar.updateErrorIndicator();
-
-            boolean changed = mConfigChooser.syncRenderState();
-            if (changed) {
-                // Will also force recomputeLayout()
-                return;
-            }
-
-            if (mNeedsRecompute) {
-                recomputeLayout();
-            }
-
-            mCanvasViewer.getCanvas().syncPreviewMode();
-        }
-    }
-
-    /**
-     * The global docking state version. This number is incremented each time
-     * the user customizes the window layout in any layout.
-     */
-    private static int sDockingStateVersion;
-
-    /**
-     * The window docking state version that this window is currently showing;
-     * when a different window is reconfigured, the global version number is
-     * incremented, and when this window is shown, and the current version is
-     * less than the global version, the window layout will be synced.
-     */
-    private int mDockingStateVersion;
-
-    /**
-     * Syncs the window docking state.
-     * <p>
-     * The layout editor lets you change the docking state -- e.g. you can minimize the
-     * palette, and drag the structure view to the bottom, and so on. When you restart
-     * the IDE, the window comes back up with your customized state.
-     * <p>
-     * <b>However</b>, when you have multiple editor files open, if you minimize the palette
-     * in one editor and then switch to another, the other editor will have the old window
-     * state. That's because each editor has its own set of windows.
-     * <p>
-     * This method fixes this. Whenever a window is shown, this method is called, and the
-     * docking state is synced such that the editor will match the current persistent docking
-     * state.
-     */
-    private void syncDockingState() {
-        if (mDockingStateVersion == sDockingStateVersion) {
-            // No changes to apply
-            return;
-        }
-        mDockingStateVersion = sDockingStateVersion;
-
-        IPreferenceStore preferenceStore = AdtPlugin.getDefault().getPreferenceStore();
-        PluginFlyoutPreferences preferences;
-        preferences = new PluginFlyoutPreferences(preferenceStore, PREF_PALETTE);
-        mPaletteComposite.apply(preferences);
-        preferences = new PluginFlyoutPreferences(preferenceStore, PREF_STRUCTURE);
-        mStructureFlyout.apply(preferences);
-        mPaletteComposite.layout();
-        mStructureFlyout.layout();
-        mPaletteComposite.redraw(); // the structure view is nested within the palette
-    }
-
-    /**
-     * Responds to a page change that made the Graphical editor page the deactivated page
-     */
-    public void deactivated() {
-        mActive = false;
-
-        LayoutCanvas canvas = getCanvasControl();
-        if (canvas != null) {
-            canvas.deactivated();
-        }
-    }
-
-    /**
-     * Opens and initialize the editor with a new file.
-     * @param file the file being edited.
-     */
-    public void openFile(IFile file) {
-        mEditedFile = file;
-        mConfigChooser.setFile(mEditedFile);
-
-        if (mReloadListener == null) {
-            mReloadListener = new ReloadListener();
-            LayoutReloadMonitor.getMonitor().addListener(mEditedFile.getProject(), mReloadListener);
-        }
-
-        if (mRulesEngine == null) {
-            mRulesEngine = new RulesEngine(this, mEditedFile.getProject());
-            if (mCanvasViewer != null) {
-                mCanvasViewer.getCanvas().setRulesEngine(mRulesEngine);
-            }
-        }
-
-        // Pick up hand-off data: somebody requesting this file to be opened may have
-        // requested that it should be opened as included within another file
-        if (mEditedFile != null) {
-            try {
-                mIncludedWithin = (Reference) mEditedFile.getSessionProperty(NAME_INCLUDE);
-                if (mIncludedWithin != null) {
-                    // Only use once
-                    mEditedFile.setSessionProperty(NAME_INCLUDE, null);
-                }
-            } catch (CoreException e) {
-                AdtPlugin.log(e, "Can't access session property %1$s", NAME_INCLUDE);
-            }
-        }
-
-        computeSdkVersion();
-    }
-
-    /**
-     * Resets the editor with a replacement file.
-     * @param file the replacement file.
-     */
-    public void replaceFile(IFile file) {
-        mEditedFile = file;
-        mConfigChooser.replaceFile(mEditedFile);
-        computeSdkVersion();
-    }
-
-    /**
-     * Resets the editor with a replacement file coming from a config change in the config
-     * selector.
-     * @param file the replacement file.
-     */
-    public void changeFileOnNewConfig(IFile file) {
-        mEditedFile = file;
-        mConfigChooser.changeFileOnNewConfig(mEditedFile);
-    }
-
-    /**
-     * Responds to a target change for the project of the edited file
-     */
-    public void onTargetChange() {
-        AndroidTargetData targetData = mConfigChooser.onXmlModelLoaded();
-        updateCapabilities(targetData);
-
-        changed(CFG_FOLDER | CFG_TARGET);
-    }
-
-    /** Updates the capabilities for the given target data (which may be null) */
-    private void updateCapabilities(AndroidTargetData targetData) {
-        if (targetData != null) {
-            LayoutLibrary layoutLib = targetData.getLayoutLibrary();
-            if (mIncludedWithin != null && !layoutLib.supports(Capability.EMBEDDED_LAYOUT)) {
-                showIn(null);
-            }
-        }
-    }
-
-    /**
-     * Returns the {@link CommonXmlDelegate} for this editor
-     *
-     * @return the {@link CommonXmlDelegate} for this editor
-     */
-    @NonNull
-    public LayoutEditorDelegate getEditorDelegate() {
-        return mEditorDelegate;
-    }
-
-    /**
-     * Returns the {@link RulesEngine} associated with this editor
-     *
-     * @return the {@link RulesEngine} associated with this editor, never null
-     */
-    public RulesEngine getRulesEngine() {
-        return mRulesEngine;
-    }
-
-    /**
-     * Return the {@link LayoutCanvas} associated with this editor
-     *
-     * @return the associated {@link LayoutCanvas}
-     */
-    public LayoutCanvas getCanvasControl() {
-        if (mCanvasViewer != null) {
-            return mCanvasViewer.getCanvas();
-        }
-        return null;
-    }
-
-    /**
-     * Returns the {@link UiDocumentNode} for the XML model edited by this editor
-     *
-     * @return the associated model
-     */
-    public UiDocumentNode getModel() {
-        return mEditorDelegate.getUiRootNode();
-    }
-
-    /**
-     * Callback for XML model changed. Only update/recompute the layout if the editor is visible
-     */
-    public void onXmlModelChanged() {
-        // To optimize the rendering when the user is editing in the XML pane, we don't
-        // refresh the editor if it's not the active part.
-        //
-        // This behavior is acceptable when the editor is the single "full screen" part
-        // (as in this case active means visible.)
-        // Unfortunately this breaks in 2 cases:
-        // - when performing a drag'n'drop from one editor to another, the target is not
-        //   properly refreshed before it becomes active.
-        // - when duplicating the editor window and placing both editors side by side (xml in one
-        //   and canvas in the other one), the canvas may not be refreshed when the XML is edited.
-        //
-        // TODO find a way to really query whether the pane is visible, not just active.
-
-        if (mEditorDelegate.isGraphicalEditorActive()) {
-            recomputeLayout();
-        } else {
-            // Remember we want to recompute as soon as the editor becomes active.
-            mNeedsRecompute = true;
-        }
-    }
-
-    /**
-     * Recomputes the layout
-     */
-    public void recomputeLayout() {
-        try {
-            if (!ensureFileValid()) {
-                return;
-            }
-
-            UiDocumentNode model = getModel();
-            LayoutCanvas canvas = mCanvasViewer.getCanvas();
-            if (!ensureModelValid(model)) {
-                // Although we display an error, we still treat an empty document as a
-                // successful layout result so that we can drop new elements in it.
-                //
-                // For that purpose, create a special LayoutScene that has no image,
-                // no root view yet indicates success and then update the canvas with it.
-
-                canvas.setSession(
-                        new StaticRenderSession(
-                                Result.Status.SUCCESS.createResult(),
-                                null /*rootViewInfo*/, null /*image*/),
-                        null /*explodeNodes*/, true /* layoutlib5 */);
-                return;
-            }
-
-            LayoutLibrary layoutLib = getReadyLayoutLib(true /*displayError*/);
-
-            if (layoutLib != null) {
-                // if drawing in real size, (re)set the scaling factor.
-                if (mActionBar.isZoomingRealSize()) {
-                    mActionBar.computeAndSetRealScale(false /* redraw */);
-                }
-
-                IProject project = mEditedFile.getProject();
-                renderWithBridge(project, model, layoutLib);
-
-                canvas.getPreviewManager().renderPreviews();
-            }
-        } finally {
-            // no matter the result, we are done doing the recompute based on the latest
-            // resource/code change.
-            mNeedsRecompute = false;
-        }
-    }
-
-    /**
-     * Reloads the palette
-     */
-    public void reloadPalette() {
-        if (mPalette != null) {
-            IAndroidTarget renderingTarget = getRenderingTarget();
-            if (renderingTarget != null) {
-                mPalette.reloadPalette(renderingTarget);
-            }
-        }
-    }
-
-    /**
-     * Returns the {@link LayoutLibrary} associated with this editor, if it has
-     * been initialized already. May return null if it has not been initialized (or has
-     * not finished initializing).
-     *
-     * @return The {@link LayoutLibrary}, or null
-     */
-    public LayoutLibrary getLayoutLibrary() {
-        return getReadyLayoutLib(false /*displayError*/);
-    }
-
-    /**
-     * Returns the scale to multiply pixels in the layout coordinate space with to obtain
-     * the corresponding dip (device independent pixel)
-     *
-     * @return the scale to multiple layout coordinates with to obtain the dip position
-     */
-    public float getDipScale() {
-        float dpi = mConfigChooser.getConfiguration().getDensity().getDpiValue();
-        return Density.DEFAULT_DENSITY / dpi;
-    }
-
-    // --- private methods ---
-
-    /**
-     * Ensure that the file associated with this editor is valid (exists and is
-     * synchronized). Any reasons why it is not are displayed in the editor's error area.
-     *
-     * @return True if the editor is valid, false otherwise.
-     */
-    private boolean ensureFileValid() {
-        // check that the resource exists. If the file is opened but the project is closed
-        // or deleted for some reason (changed from outside of eclipse), then this will
-        // return false;
-        if (mEditedFile.exists() == false) {
-            displayError("Resource '%1$s' does not exist.",
-                         mEditedFile.getFullPath().toString());
-            return false;
-        }
-
-        if (mEditedFile.isSynchronized(IResource.DEPTH_ZERO) == false) {
-            String message = String.format("%1$s is out of sync. Please refresh.",
-                    mEditedFile.getName());
-
-            displayError(message);
-
-            // also print it in the error console.
-            IProject iProject = mEditedFile.getProject();
-            AdtPlugin.printErrorToConsole(iProject.getName(), message);
-            return false;
-        }
-
-        return true;
-    }
-
-    /**
-     * Returns a {@link LayoutLibrary} that is ready for rendering, or null if the bridge
-     * is not available or not ready yet (due to SDK loading still being in progress etc).
-     * If enabled, any reasons preventing the bridge from being returned are displayed to the
-     * editor's error area.
-     *
-     * @param displayError whether to display the loading error or not.
-     *
-     * @return LayoutBridge the layout bridge for rendering this editor's scene
-     */
-    LayoutLibrary getReadyLayoutLib(boolean displayError) {
-        Sdk currentSdk = Sdk.getCurrent();
-        if (currentSdk != null) {
-            IAndroidTarget target = getRenderingTarget();
-
-            if (target != null) {
-                AndroidTargetData data = currentSdk.getTargetData(target);
-                if (data != null) {
-                    LayoutLibrary layoutLib = data.getLayoutLibrary();
-
-                    if (layoutLib.getStatus() == LoadStatus.LOADED) {
-                        return layoutLib;
-                    } else if (displayError) { // getBridge() == null
-                        // SDK is loaded but not the layout library!
-
-                        // check whether the bridge managed to load, or not
-                        if (layoutLib.getStatus() == LoadStatus.LOADING) {
-                            displayError("Eclipse is loading framework information and the layout library from the SDK folder.\n%1$s will refresh automatically once the process is finished.",
-                                         mEditedFile.getName());
-                        } else {
-                            String message = layoutLib.getLoadMessage();
-                            displayError("Eclipse failed to load the framework information and the layout library!" +
-                                    message != null ? "\n" + message : "");
-                        }
-                    }
-                } else { // data == null
-                    // It can happen that the workspace refreshes while the SDK is loading its
-                    // data, which could trigger a redraw of the opened layout if some resources
-                    // changed while Eclipse is closed.
-                    // In this case data could be null, but this is not an error.
-                    // We can just silently return, as all the opened editors are automatically
-                    // refreshed once the SDK finishes loading.
-                    LoadStatus targetLoadStatus = currentSdk.checkAndLoadTargetData(target, null);
-
-                    // display error is asked.
-                    if (displayError) {
-                        String targetName = target.getName();
-                        switch (targetLoadStatus) {
-                            case LOADING:
-                                String s;
-                                if (currentSdk.getTarget(getProject()) == target) {
-                                    s = String.format(
-                                            "The project target (%1$s) is still loading.",
-                                            targetName);
-                                } else {
-                                    s = String.format(
-                                            "The rendering target (%1$s) is still loading.",
-                                            targetName);
-                                }
-                                s += "\nThe layout will refresh automatically once the process is finished.";
-                                displayError(s);
-
-                                break;
-                            case FAILED: // known failure
-                            case LOADED: // success but data isn't loaded?!?!
-                                displayError("The project target (%s) was not properly loaded.",
-                                        targetName);
-                                break;
-                        }
-                    }
-                }
-
-            } else if (displayError) { // target == null
-                displayError("The project target is not set. Right click project, choose Properties | Android.");
-            }
-        } else if (displayError) { // currentSdk == null
-            displayError("Eclipse is loading the SDK.\n%1$s will refresh automatically once the process is finished.",
-                         mEditedFile.getName());
-        }
-
-        return null;
-    }
-
-    /**
-     * Returns the {@link IAndroidTarget} used for the rendering.
-     * <p/>
-     * This first looks for the rendering target setup in the config UI, and if nothing has
-     * been setup yet, returns the target of the project.
-     *
-     * @return an IAndroidTarget object or null if no target is setup and the project has no
-     * target set.
-     *
-     */
-    public IAndroidTarget getRenderingTarget() {
-        // if the SDK is null no targets are loaded.
-        Sdk currentSdk = Sdk.getCurrent();
-        if (currentSdk == null) {
-            return null;
-        }
-
-        // attempt to get a target from the configuration selector.
-        IAndroidTarget renderingTarget = mConfigChooser.getConfiguration().getTarget();
-        if (renderingTarget != null) {
-            return renderingTarget;
-        }
-
-        // fall back to the project target
-        if (mEditedFile != null) {
-            return currentSdk.getTarget(mEditedFile.getProject());
-        }
-
-        return null;
-    }
-
-    /**
-     * Returns whether the current rendering target supports the given capability
-     *
-     * @param capability the capability to be looked up
-     * @return true if the current rendering target supports the given capability
-     */
-    public boolean renderingSupports(Capability capability) {
-        IAndroidTarget target = getRenderingTarget();
-        if (target != null) {
-            AndroidTargetData targetData = Sdk.getCurrent().getTargetData(target);
-            LayoutLibrary layoutLib = targetData.getLayoutLibrary();
-            return layoutLib.supports(capability);
-        }
-
-        return false;
-    }
-
-    private boolean ensureModelValid(UiDocumentNode model) {
-        // check there is actually a model (maybe the file is empty).
-        if (model.getUiChildren().size() == 0) {
-            if (mEditorDelegate.getEditor().isCreatingPages()) {
-                displayError("Loading editor");
-                return false;
-            }
-            displayError(
-                    "No XML content. Please add a root view or layout to your document.");
-            return false;
-        }
-
-        return true;
-    }
-
-    /**
-     * Creates a {@link RenderService} associated with this editor
-     * @return the render service
-     */
-    @NonNull
-    public RenderService createRenderService() {
-        return RenderService.create(this, mCredential);
-    }
-
-    /**
-     * Creates a {@link RenderLogger} associated with this editor
-     * @param name the name of the logger
-     * @return the new logger
-     */
-    @NonNull
-    public RenderLogger createRenderLogger(String name) {
-        return new RenderLogger(name, mCredential);
-    }
-
-    /**
-     * Creates a {@link RenderService} associated with this editor
-     *
-     * @param configuration the configuration to use (and fallback to editor for the rest)
-     * @param resolver a resource resolver to use to look up resources
-     * @return the render service
-     */
-    @NonNull
-    public RenderService createRenderService(Configuration configuration,
-            ResourceResolver resolver) {
-        return RenderService.create(this, configuration, resolver, mCredential);
-    }
-
-    private void renderWithBridge(IProject iProject, UiDocumentNode model,
-            LayoutLibrary layoutLib) {
-        LayoutCanvas canvas = getCanvasControl();
-        Set<UiElementNode> explodeNodes = canvas.getNodesToExplode();
-        RenderLogger logger = createRenderLogger(mEditedFile.getName());
-        RenderingMode renderingMode = RenderingMode.NORMAL;
-        // FIXME set the rendering mode using ViewRule or something.
-        List<UiElementNode> children = model.getUiChildren();
-        if (children.size() > 0 &&
-                children.get(0).getDescriptor().getXmlLocalName().equals(SCROLL_VIEW)) {
-            renderingMode = RenderingMode.V_SCROLL;
-        }
-
-        RenderSession session = RenderService.create(this, mCredential)
-            .setModel(model)
-            .setLog(logger)
-            .setRenderingMode(renderingMode)
-            .setIncludedWithin(mIncludedWithin)
-            .setNodesToExpand(explodeNodes)
-            .createRenderSession();
-
-        boolean layoutlib5 = layoutLib.supports(Capability.EMBEDDED_LAYOUT);
-        canvas.setSession(session, explodeNodes, layoutlib5);
-
-        // update the UiElementNode with the layout info.
-        if (session != null && session.getResult().isSuccess() == false) {
-            // An error was generated. Print it (and any other accumulated warnings)
-            String errorMessage = session.getResult().getErrorMessage();
-            Throwable exception = session.getResult().getException();
-            if (exception != null && errorMessage == null) {
-                errorMessage = exception.toString();
-            }
-            if (exception != null || (errorMessage != null && errorMessage.length() > 0)) {
-                logger.error(null, errorMessage, exception, null /*data*/);
-            } else if (!logger.hasProblems()) {
-                logger.error(null, "Unexpected error in rendering, no details given",
-                        null /*data*/);
-            }
-            // These errors will be included in the log warnings which are
-            // displayed regardless of render success status below
-        }
-
-        // We might have detected some missing classes and swapped them by a mock view,
-        // or run into fidelity warnings or missing resources, so emit all these
-        // warnings
-        Set<String> missingClasses = mProjectCallback.getMissingClasses();
-        Set<String> brokenClasses = mProjectCallback.getUninstantiatableClasses();
-        if (logger.hasProblems()) {
-            displayLoggerProblems(iProject, logger);
-            displayFailingClasses(missingClasses, brokenClasses, true);
-            displayUserStackTrace(logger, true);
-        } else if (missingClasses.size() > 0 || brokenClasses.size() > 0) {
-            displayFailingClasses(missingClasses, brokenClasses, false);
-            displayUserStackTrace(logger, true);
-        } else if (session != null) {
-            // Nope, no missing or broken classes. Clear success, congrats!
-            hideError();
-
-            // First time this layout is opened, run lint on the file (after a delay)
-            if (!mRenderedOnce) {
-                mRenderedOnce = true;
-                Job job = new Job("Run Lint") {
-                    @Override
-                    protected IStatus run(IProgressMonitor monitor) {
-                        getEditorDelegate().delegateRunLint();
-                        return Status.OK_STATUS;
-                    }
-
-                };
-                job.setSystem(true);
-                job.schedule(3000); // 3 seconds
-            }
-
-            mConfigChooser.ensureInitialized();
-        }
-
-        model.refreshUi();
-    }
-
-    /**
-     * Returns the {@link ResourceResolver} for this editor
-     *
-     * @return the resolver used to resolve resources for the current configuration of
-     *         this editor, or null
-     */
-    public ResourceResolver getResourceResolver() {
-        if (mResourceResolver == null) {
-            String theme = mConfigChooser.getThemeName();
-            if (theme == null) {
-                displayError("Missing theme.");
-                return null;
-            }
-            boolean isProjectTheme = mConfigChooser.getConfiguration().isProjectTheme();
-
-            Map<ResourceType, Map<String, ResourceValue>> configuredProjectRes =
-                getConfiguredProjectResources();
-
-            // Get the framework resources
-            Map<ResourceType, Map<String, ResourceValue>> frameworkResources =
-                getConfiguredFrameworkResources();
-
-            if (configuredProjectRes == null) {
-                displayError("Missing project resources for current configuration.");
-                return null;
-            }
-
-            if (frameworkResources == null) {
-                displayError("Missing framework resources.");
-                return null;
-            }
-
-            mResourceResolver = ResourceResolver.create(
-                    configuredProjectRes, frameworkResources,
-                    theme, isProjectTheme);
-        }
-
-        return mResourceResolver;
-    }
-
-    /** Returns a project callback, and optionally resets it */
-    ProjectCallback getProjectCallback(boolean reset, LayoutLibrary layoutLibrary) {
-        // Lazily create the project callback the first time we need it
-        if (mProjectCallback == null) {
-            ResourceManager resManager = ResourceManager.getInstance();
-            IProject project = getProject();
-            ProjectResources projectRes = resManager.getProjectResources(project);
-            mProjectCallback = new ProjectCallback(layoutLibrary, projectRes, project,
-                    mCredential, this);
-        } else if (reset) {
-            // Also clears the set of missing/broken classes prior to rendering
-            mProjectCallback.getMissingClasses().clear();
-            mProjectCallback.getUninstantiatableClasses().clear();
-        }
-
-        return mProjectCallback;
-    }
-
-    /**
-     * Returns the resource name of this layout, NOT including the @layout/ prefix
-     *
-     * @return the resource name of this layout, NOT including the @layout/ prefix
-     */
-    public String getLayoutResourceName() {
-        return ResourceHelper.getLayoutName(mEditedFile);
-    }
-
-    /**
-     * Cleans up when the rendering target is about to change
-     * @param oldTarget the old rendering target.
-     */
-    private void preRenderingTargetChangeCleanUp(IAndroidTarget oldTarget) {
-        // first clear the caches related to this file in the old target
-        Sdk currentSdk = Sdk.getCurrent();
-        if (currentSdk != null) {
-            AndroidTargetData data = currentSdk.getTargetData(oldTarget);
-            if (data != null) {
-                LayoutLibrary layoutLib = data.getLayoutLibrary();
-
-                // layoutLib can never be null.
-                layoutLib.clearCaches(mEditedFile.getProject());
-            }
-        }
-
-        // Also remove the ProjectCallback as it caches custom views which must be reloaded
-        // with the classloader of the new LayoutLib. We also have to clear it out
-        // because it stores a reference to the layout library which could have changed.
-        mProjectCallback = null;
-
-        // FIXME: get rid of the current LayoutScene if any.
-    }
-
-    private class ReloadListener implements ILayoutReloadListener {
-        /**
-         * Called when the file changes triggered a redraw of the layout
-         */
-        @Override
-        public void reloadLayout(final ChangeFlags flags, final boolean libraryChanged) {
-            if (mConfigChooser.isDisposed()) {
-                return;
-            }
-            Display display = mConfigChooser.getDisplay();
-            display.asyncExec(new Runnable() {
-                @Override
-                public void run() {
-                    reloadLayoutSwt(flags, libraryChanged);
-                }
-            });
-        }
-
-        /** Reload layout. <b>Must be called on the SWT thread</b> */
-        private void reloadLayoutSwt(ChangeFlags flags, boolean libraryChanged) {
-            if (mConfigChooser.isDisposed()) {
-                return;
-            }
-            assert mConfigChooser.getDisplay().getThread() == Thread.currentThread();
-
-            boolean recompute = false;
-            // we only care about the r class of the main project.
-            if (flags.rClass && libraryChanged == false) {
-                recompute = true;
-                if (mEditedFile != null) {
-                    ResourceManager manager = ResourceManager.getInstance();
-                    ProjectResources projectRes = manager.getProjectResources(
-                            mEditedFile.getProject());
-
-                    if (projectRes != null) {
-                        projectRes.resetDynamicIds();
-                    }
-                }
-            }
-
-            if (flags.localeList) {
-                // the locale list *potentially* changed so we update the locale in the
-                // config composite.
-                // However there's no recompute, as it could not be needed
-                // (for instance a new layout)
-                // If a resource that's not a layout changed this will trigger a recompute anyway.
-                mConfigChooser.updateLocales();
-            }
-
-            // if a resources was modified.
-            if (flags.resources) {
-                recompute = true;
-
-                // TODO: differentiate between single and multi resource file changed, and whether
-                // the resource change affects the cache.
-
-                // force a reparse in case a value XML file changed.
-                mConfiguredProjectRes = null;
-                mResourceResolver = null;
-
-                // clear the cache in the bridge in case a bitmap/9-patch changed.
-                LayoutLibrary layoutLib = getReadyLayoutLib(true /*displayError*/);
-                if (layoutLib != null) {
-                    layoutLib.clearCaches(mEditedFile.getProject());
-                }
-            }
-
-            if (flags.code) {
-                // only recompute if the custom view loader was used to load some code.
-                if (mProjectCallback != null && mProjectCallback.isUsed()) {
-                    mProjectCallback = null;
-                    recompute = true;
-                }
-            }
-
-            if (flags.manifest) {
-                recompute |= computeSdkVersion();
-            }
-
-            if (recompute) {
-                if (mEditorDelegate.isGraphicalEditorActive()) {
-                    recomputeLayout();
-                } else {
-                    mNeedsRecompute = true;
-                }
-            }
-        }
-    }
-
-    // ---- Error handling ----
-
-    /**
-     * Switches the sash to display the error label.
-     *
-     * @param errorFormat The new error to display if not null.
-     * @param parameters String.format parameters for the error format.
-     */
-    private void displayError(String errorFormat, Object...parameters) {
-        if (errorFormat != null) {
-            mErrorLabel.setText(String.format(errorFormat, parameters));
-        } else {
-            mErrorLabel.setText("");
-        }
-        mSashError.setMaximizedControl(null);
-    }
-
-    /** Displays the canvas and hides the error label. */
-    private void hideError() {
-        mErrorLabel.setText("");
-        mSashError.setMaximizedControl(mCanvasViewer.getControl());
-    }
-
-    /** Display the problem list encountered during a render */
-    private void displayUserStackTrace(RenderLogger logger, boolean append) {
-        List<Throwable> throwables = logger.getFirstTrace();
-        if (throwables == null || throwables.isEmpty()) {
-            return;
-        }
-
-        Throwable throwable = throwables.get(0);
-
-        if (throwable instanceof RenderSecurityException) {
-            addActionLink(mErrorLabel, ActionLinkStyleRange.LINK_DISABLE_SANDBOX,
-                    "\nTurn off custom view rendering sandbox\n");
-
-            StringBuilder builder = new StringBuilder(200);
-            String lastFailedPath = RenderSecurityManager.getLastFailedPath();
-            if (lastFailedPath != null) {
-                builder.append("Diagnostic info for ADT bug report:\n");
-                builder.append("Failed path: ").append(lastFailedPath).append('\n');
-                String tempDir = System.getProperty("java.io.tmpdir");
-                builder.append("Normal temp dir: ").append(tempDir).append('\n');
-                File normalized = new File(tempDir);
-                builder.append("Normalized temp dir: ").append(normalized.getPath()).append('\n');
-                try {
-                    builder.append("Canonical temp dir: ").append(normalized.getCanonicalPath())
-                    .append('\n');
-                } catch (IOException e) {
-                    // ignore
-                }
-                builder.append("os.name: ").append(System.getProperty("os.name")).append('\n');
-                builder.append("os.version: ").append(System.getProperty("os.version"));
-                builder.append('\n');
-                builder.append("java.runtime.version: ");
-                builder.append(System.getProperty("java.runtime.version"));
-            }
-            if (throwable.getMessage().equals("Unable to create temporary file")) {
-                String javaVersion = System.getProperty("java.version");
-                if (javaVersion.startsWith("1.7.0_")) {
-                    int version = Integer
-                            .parseInt(javaVersion.substring(javaVersion.indexOf('_') + 1));
-                    if (version > 0 && version < 45) {
-                        builder.append('\n');
-                        builder.append("Tip: This may be caused by using an older version " +
-                                "of JDK 1.7.0; try using at least 1.7.0_45 (you are using " +
-                                javaVersion + ")");
-                    }
-                }
-            }
-            if (builder.length() > 0) {
-                addText(mErrorLabel, builder.toString());
-            }
-        }
-
-        StackTraceElement[] frames = throwable.getStackTrace();
-        int end = -1;
-        boolean haveInterestingFrame = false;
-        for (int i = 0; i < frames.length; i++) {
-            StackTraceElement frame = frames[i];
-            if (isInterestingFrame(frame)) {
-                haveInterestingFrame = true;
-            }
-            String className = frame.getClassName();
-            if (className.equals(
-                    "com.android.layoutlib.bridge.impl.RenderSessionImpl")) { //$NON-NLS-1$
-                end = i;
-                break;
-            }
-        }
-
-        if (end == -1 || !haveInterestingFrame) {
-            // Not a recognized stack trace range: just skip it
-            return;
-        }
-
-        if (!append) {
-            mErrorLabel.setText("\n");    //$NON-NLS-1$
-        } else {
-            addText(mErrorLabel, "\n\n"); //$NON-NLS-1$
-        }
-
-        addText(mErrorLabel, throwable.toString() + '\n');
-        for (int i = 0; i < end; i++) {
-            StackTraceElement frame = frames[i];
-            String className = frame.getClassName();
-            String methodName = frame.getMethodName();
-            addText(mErrorLabel, "    at " + className + '.' + methodName + '(');
-            String fileName = frame.getFileName();
-            if (fileName != null && !fileName.isEmpty()) {
-                int lineNumber = frame.getLineNumber();
-                String location = fileName + ':' + lineNumber;
-                if (isInterestingFrame(frame)) {
-                    addActionLink(mErrorLabel, ActionLinkStyleRange.LINK_OPEN_LINE,
-                            location, className, methodName, fileName, lineNumber);
-                } else {
-                    addText(mErrorLabel, location);
-                }
-                addText(mErrorLabel, ")\n"); //$NON-NLS-1$
-            }
-        }
-    }
-
-    private static boolean isInterestingFrame(StackTraceElement frame) {
-        String className = frame.getClassName();
-        return !(className.startsWith("android.")         //$NON-NLS-1$
-                || className.startsWith("com.android.")   //$NON-NLS-1$
-                || className.startsWith("java.")          //$NON-NLS-1$
-                || className.startsWith("javax.")         //$NON-NLS-1$
-                || className.startsWith("sun."));         //$NON-NLS-1$
-    }
-
-    /**
-     * Switches the sash to display the error label to show a list of
-     * missing classes and give options to create them.
-     */
-    private void displayFailingClasses(Set<String> missingClasses, Set<String> brokenClasses,
-            boolean append) {
-        if (missingClasses.size() == 0 && brokenClasses.size() == 0) {
-            return;
-        }
-
-        if (!append) {
-            mErrorLabel.setText("");    //$NON-NLS-1$
-        } else {
-            addText(mErrorLabel, "\n"); //$NON-NLS-1$
-        }
-
-        if (missingClasses.size() > 0) {
-            addText(mErrorLabel, "The following classes could not be found:\n");
-            for (String clazz : missingClasses) {
-                addText(mErrorLabel, "- ");
-                addText(mErrorLabel, clazz);
-                addText(mErrorLabel, " (");
-
-                IProject project = getProject();
-                Collection<String> customViews = getCustomViewClassNames(project);
-                addTypoSuggestions(clazz, customViews, false);
-                addTypoSuggestions(clazz, customViews, true);
-                addTypoSuggestions(clazz, getAndroidViewClassNames(project), false);
-
-                addActionLink(mErrorLabel,
-                        ActionLinkStyleRange.LINK_FIX_BUILD_PATH, "Fix Build Path", clazz);
-                addText(mErrorLabel, ", ");
-                addActionLink(mErrorLabel,
-                        ActionLinkStyleRange.LINK_EDIT_XML, "Edit XML", clazz);
-                if (clazz.indexOf('.') != -1) {
-                    // Add "Create Class" link, but only for custom views
-                    addText(mErrorLabel, ", ");
-                    addActionLink(mErrorLabel,
-                            ActionLinkStyleRange.LINK_CREATE_CLASS, "Create Class", clazz);
-                }
-                addText(mErrorLabel, ")\n");
-            }
-        }
-        if (brokenClasses.size() > 0) {
-            addText(mErrorLabel, "The following classes could not be instantiated:\n");
-
-            // Do we have a custom class (not an Android or add-ons class)
-            boolean haveCustomClass = false;
-
-            for (String clazz : brokenClasses) {
-                addText(mErrorLabel, "- ");
-                addText(mErrorLabel, clazz);
-                addText(mErrorLabel, " (");
-                addActionLink(mErrorLabel,
-                        ActionLinkStyleRange.LINK_OPEN_CLASS, "Open Class", clazz);
-                addText(mErrorLabel, ", ");
-                addActionLink(mErrorLabel,
-                        ActionLinkStyleRange.LINK_SHOW_LOG, "Show Error Log", clazz);
-                addText(mErrorLabel, ")\n");
-
-                if (!(clazz.startsWith("android.") || //$NON-NLS-1$
-                        clazz.startsWith("com.google."))) { //$NON-NLS-1$
-                    haveCustomClass = true;
-                }
-            }
-
-            addText(mErrorLabel, "See the Error Log (Window > Show View) for more details.\n");
-
-            if (haveCustomClass) {
-                addBoldText(mErrorLabel, "Tip: Use View.isInEditMode() in your custom views "
-                        + "to skip code when shown in Eclipse");
-            }
-        }
-
-        mSashError.setMaximizedControl(null);
-    }
-
-    private void addTypoSuggestions(String actual, Collection<String> views,
-            boolean compareWithPackage) {
-        if (views.size() == 0) {
-            return;
-        }
-
-        // Look for typos and try to match with custom views and android views
-        String actualBase = actual.substring(actual.lastIndexOf('.') + 1);
-        int maxDistance = actualBase.length() >= 4 ? 2 : 1;
-
-        if (views.size() > 0) {
-            for (String suggested : views) {
-                String suggestedBase = suggested.substring(suggested.lastIndexOf('.') + 1);
-
-                String matchWith = compareWithPackage ? suggested : suggestedBase;
-                if (Math.abs(actualBase.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;
-                }
-                if (LintUtils.editDistance(actualBase, matchWith) <= maxDistance) {
-                    // Suggest this class as a typo for the given class
-                    String labelClass = (suggestedBase.equals(actual) || actual.indexOf('.') != -1)
-                        ? suggested : suggestedBase;
-                    addActionLink(mErrorLabel,
-                            ActionLinkStyleRange.LINK_CHANGE_CLASS_TO,
-                            String.format("Change to %1$s",
-                                    // Only show full package name if class name
-                                    // is the same
-                                    labelClass),
-                            actual,
-                            viewNeedsPackage(suggested) ? suggested : suggestedBase);
-                    addText(mErrorLabel, ", ");
-                }
-            }
-        }
-    }
-
-    private static Collection<String> getCustomViewClassNames(IProject project) {
-        CustomViewFinder finder = CustomViewFinder.get(project);
-        Collection<String> views = finder.getAllViews();
-        if (views == null) {
-            finder.refresh();
-            views = finder.getAllViews();
-        }
-
-        return views;
-    }
-
-    private static Collection<String> getAndroidViewClassNames(IProject project) {
-        Sdk currentSdk = Sdk.getCurrent();
-        IAndroidTarget target = currentSdk.getTarget(project);
-        if (target != null) {
-            AndroidTargetData targetData = currentSdk.getTargetData(target);
-            if (targetData != null) {
-                LayoutDescriptors layoutDescriptors = targetData.getLayoutDescriptors();
-                return layoutDescriptors.getAllViewClassNames();
-            }
-        }
-
-        return Collections.emptyList();
-    }
-
-    /** Add a normal line of text to the styled text widget. */
-    private void addText(StyledText styledText, String...string) {
-        for (String s : string) {
-            styledText.append(s);
-        }
-    }
-
-    /** Display the problem list encountered during a render */
-    private void displayLoggerProblems(IProject project, RenderLogger logger) {
-        if (logger.hasProblems()) {
-            mErrorLabel.setText("");
-            // A common source of problems is attempting to open a layout when there are
-            // compilation errors. In this case, may not have run (or may not be up to date)
-            // so resources cannot be looked up etc. Explain this situation to the user.
-
-            boolean hasAaptErrors = false;
-            boolean hasJavaErrors = false;
-            try {
-                IMarker[] markers;
-                markers = project.findMarkers(IMarker.PROBLEM, true, IResource.DEPTH_INFINITE);
-                if (markers.length > 0) {
-                    for (IMarker marker : markers) {
-                        String markerType = marker.getType();
-                        if (markerType.equals(IJavaModelMarker.JAVA_MODEL_PROBLEM_MARKER)) {
-                            int severity = marker.getAttribute(IMarker.SEVERITY, -1);
-                            if (severity == IMarker.SEVERITY_ERROR) {
-                                hasJavaErrors = true;
-                            }
-                        } else if (markerType.equals(AdtConstants.MARKER_AAPT_COMPILE)) {
-                            int severity = marker.getAttribute(IMarker.SEVERITY, -1);
-                            if (severity == IMarker.SEVERITY_ERROR) {
-                                hasAaptErrors = true;
-                            }
-                        }
-                    }
-                }
-            } catch (CoreException e) {
-                AdtPlugin.log(e, null);
-            }
-
-            if (logger.seenTagPrefix(LayoutLog.TAG_RESOURCES_RESOLVE_THEME_ATTR)) {
-                addBoldText(mErrorLabel,
-                        "Missing styles. Is the correct theme chosen for this layout?\n");
-                addText(mErrorLabel,
-                        "Use the Theme combo box above the layout to choose a different layout, " +
-                        "or fix the theme style references.\n\n");
-            }
-
-            List<Throwable> trace = logger.getFirstTrace();
-            if (trace != null
-                    && trace.toString().contains(
-                            "java.lang.IndexOutOfBoundsException: Index: 2, Size: 2") //$NON-NLS-1$
-                    && mConfigChooser.getConfiguration().getDensity() == Density.TV) {
-                addBoldText(mErrorLabel,
-                        "It looks like you are using a render target where the layout library " +
-                        "does not support the tvdpi density.\n\n");
-                addText(mErrorLabel, "Please try either updating to " +
-                        "the latest available version (using the SDK manager), or if no updated " +
-                        "version is available for this specific version of Android, try using " +
-                        "a more recent render target version.\n\n");
-
-            }
-
-            if (hasAaptErrors && logger.seenTagPrefix(LayoutLog.TAG_RESOURCES_PREFIX)) {
-                // Text will automatically be wrapped by the error widget so no reason
-                // to insert linebreaks in this error message:
-                String message =
-                    "NOTE: This project contains resource errors, so aapt did not succeed, "
-                     + "which can cause rendering failures. "
-                     + "Fix resource problems first.\n\n";
-                 addBoldText(mErrorLabel, message);
-            } else if (hasJavaErrors && mProjectCallback != null && mProjectCallback.isUsed()) {
-                // Text will automatically be wrapped by the error widget so no reason
-                // to insert linebreaks in this error message:
-                String message =
-                   "NOTE: This project contains Java compilation errors, "
-                    + "which can cause rendering failures for custom views. "
-                    + "Fix compilation problems first.\n\n";
-                addBoldText(mErrorLabel, message);
-            }
-
-            if (logger.seenTag(RenderLogger.TAG_MISSING_DIMENSION)) {
-                List<UiElementNode> elements = UiDocumentNode.getAllElements(getModel());
-                for (UiElementNode element : elements) {
-                    String width = element.getAttributeValue(ATTR_LAYOUT_WIDTH);
-                    if (width == null || width.length() == 0) {
-                        addSetAttributeLink(element, ATTR_LAYOUT_WIDTH);
-                    }
-
-                    String height = element.getAttributeValue(ATTR_LAYOUT_HEIGHT);
-                    if (height == null || height.length() == 0) {
-                        addSetAttributeLink(element, ATTR_LAYOUT_HEIGHT);
-                    }
-                }
-            }
-
-            String problems = logger.getProblems(false /*includeFidelityWarnings*/);
-            addText(mErrorLabel, problems);
-
-            List<String> fidelityWarnings = logger.getFidelityWarnings();
-            if (fidelityWarnings != null && fidelityWarnings.size() > 0) {
-                addText(mErrorLabel,
-                        "The graphics preview in the layout editor may not be accurate:\n");
-                for (String warning : fidelityWarnings) {
-                    addText(mErrorLabel, warning + ' ');
-                    addActionLink(mErrorLabel,
-                            ActionLinkStyleRange.IGNORE_FIDELITY_WARNING,
-                            "(Ignore for this session)\n", warning);
-                }
-            }
-
-            mSashError.setMaximizedControl(null);
-        } else {
-            mSashError.setMaximizedControl(mCanvasViewer.getControl());
-        }
-    }
-
-    /** Appends an action link to set the given attribute on the given value */
-    private void addSetAttributeLink(UiElementNode element, String attribute) {
-        if (element.getXmlNode().getNodeName().equals(GRID_LAYOUT)) {
-            // GridLayout does not require a layout_width or layout_height to be defined
-            return;
-        }
-
-        String fill = VALUE_FILL_PARENT;
-        // See whether we should offer match_parent instead of fill_parent
-        Sdk currentSdk = Sdk.getCurrent();
-        if (currentSdk != null) {
-            IAndroidTarget target = currentSdk.getTarget(getProject());
-            if (target.getVersion().getApiLevel() >= 8) {
-                fill = VALUE_MATCH_PARENT;
-            }
-        }
-
-        String id = element.getAttributeValue(ATTR_ID);
-        if (id == null || id.length() == 0) {
-            id = '<' + element.getXmlNode().getNodeName() + '>';
-        } else {
-            id = BaseLayoutRule.stripIdPrefix(id);
-        }
-
-        addText(mErrorLabel, String.format("\"%1$s\" does not set the required %2$s attribute:\n",
-                id, attribute));
-        addText(mErrorLabel, " (1) ");
-        addActionLink(mErrorLabel,
-                ActionLinkStyleRange.SET_ATTRIBUTE,
-                String.format("Set to \"%1$s\"", VALUE_WRAP_CONTENT),
-                element, attribute, VALUE_WRAP_CONTENT);
-        addText(mErrorLabel, "\n (2) ");
-        addActionLink(mErrorLabel,
-                ActionLinkStyleRange.SET_ATTRIBUTE,
-                String.format("Set to \"%1$s\"\n", fill),
-                element, attribute, fill);
-    }
-
-    /** Appends the given text as a bold string in the given text widget */
-    private void addBoldText(StyledText styledText, String text) {
-        String s = styledText.getText();
-        int start = (s == null ? 0 : s.length());
-
-        styledText.append(text);
-        StyleRange sr = new StyleRange();
-        sr.start = start;
-        sr.length = text.length();
-        sr.fontStyle = SWT.BOLD;
-        styledText.setStyleRange(sr);
-    }
-
-    /**
-     * Add a URL-looking link to the styled text widget.
-     * <p/>
-     * A mouse-click listener is setup and it interprets the link based on the
-     * action, corresponding to the value fields in {@link ActionLinkStyleRange}.
-     */
-    private void addActionLink(StyledText styledText, int action, String label,
-            Object... data) {
-        String s = styledText.getText();
-        int start = (s == null ? 0 : s.length());
-        styledText.append(label);
-
-        StyleRange sr = new ActionLinkStyleRange(action, data);
-        sr.start = start;
-        sr.length = label.length();
-        sr.fontStyle = SWT.NORMAL;
-        sr.underlineStyle = SWT.UNDERLINE_LINK;
-        sr.underline = true;
-        styledText.setStyleRange(sr);
-    }
-
-    /**
-     * Looks up the resource file corresponding to the given type
-     *
-     * @param type The type of resource to look up, such as {@link ResourceType#LAYOUT}
-     * @param name The name of the resource (not including ".xml")
-     * @param isFrameworkResource if true, the resource is a framework resource, otherwise
-     *            it's a project resource
-     * @return the resource file defining the named resource, or null if not found
-     */
-    public IPath findResourceFile(ResourceType type, String name, boolean isFrameworkResource) {
-        // FIXME: This code does not handle theme value resolution.
-        // There is code to handle this, but it's in layoutlib; we should
-        // expose that and use it here.
-
-        Map<ResourceType, Map<String, ResourceValue>> map;
-        map = isFrameworkResource ? mConfiguredFrameworkRes : mConfiguredProjectRes;
-        if (map == null) {
-            // Not yet configured
-            return null;
-        }
-
-        Map<String, ResourceValue> layoutMap = map.get(type);
-        if (layoutMap != null) {
-            ResourceValue value = layoutMap.get(name);
-            if (value != null) {
-                String valueStr = value.getValue();
-                if (valueStr.startsWith("?")) { //$NON-NLS-1$
-                    // FIXME: It's a reference. We should resolve this properly.
-                    return null;
-                }
-                return new Path(valueStr);
-            }
-        }
-
-        return null;
-    }
-
-    /**
-     * Looks up the path to the file corresponding to the given attribute value, such as
-     * @layout/foo, which will return the foo.xml file in res/layout/. (The general format
-     * of the resource url is {@literal @[<package_name>:]<resource_type>/<resource_name>}.
-     *
-     * @param url the attribute url
-     * @return the path to the file defining this attribute, or null if not found
-     */
-    public IPath findResourceFile(String url) {
-        if (!url.startsWith("@")) { //$NON-NLS-1$
-            return null;
-        }
-        int typeEnd = url.indexOf('/', 1);
-        if (typeEnd == -1) {
-            return null;
-        }
-        int nameBegin = typeEnd + 1;
-        int typeBegin = 1;
-        int colon = url.lastIndexOf(':', typeEnd);
-        boolean isFrameworkResource = false;
-        if (colon != -1) {
-            // The URL contains a package name.
-            // While the url format technically allows other package names,
-            // the platform apparently only supports @android for now (or if it does,
-            // there are no usages in the current code base so this is not common).
-            String packageName = url.substring(typeBegin, colon);
-            if (ANDROID_PKG.equals(packageName)) {
-                isFrameworkResource = true;
-            }
-
-            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 findResourceFile(type, name, isFrameworkResource);
-    }
-
-    /**
-     * Resolve the given @string reference into a literal String using the current project
-     * configuration
-     *
-     * @param text the text resource reference to resolve
-     * @return the resolved string, or null
-     */
-    public String findString(String text) {
-        if (text.startsWith(STRING_PREFIX)) {
-            return findString(text.substring(STRING_PREFIX.length()), false);
-        } else if (text.startsWith(ANDROID_STRING_PREFIX)) {
-            return findString(text.substring(ANDROID_STRING_PREFIX.length()), true);
-        } else {
-            return text;
-        }
-    }
-
-    private String findString(String name, boolean isFrameworkResource) {
-        Map<ResourceType, Map<String, ResourceValue>> map;
-        map = isFrameworkResource ? mConfiguredFrameworkRes : mConfiguredProjectRes;
-        if (map == null) {
-            // Not yet configured
-            return null;
-        }
-
-        Map<String, ResourceValue> layoutMap = map.get(ResourceType.STRING);
-        if (layoutMap != null) {
-            ResourceValue value = layoutMap.get(name);
-            if (value != null) {
-                // FIXME: This code does not handle theme value resolution.
-                // There is code to handle this, but it's in layoutlib; we should
-                // expose that and use it here.
-                return value.getValue();
-            }
-        }
-
-        return null;
-    }
-
-    /**
-     * This StyleRange represents a clickable link in the render output, where various
-     * actions can be taken such as creating a class, opening the project chooser to
-     * adjust the build path, etc.
-     */
-    private class ActionLinkStyleRange extends StyleRange {
-        /** Create a view class */
-        private static final int LINK_CREATE_CLASS = 1;
-        /** Edit the build path for the current project */
-        private static final int LINK_FIX_BUILD_PATH = 2;
-        /** Show the XML tab */
-        private static final int LINK_EDIT_XML = 3;
-        /** Open the given class */
-        private static final int LINK_OPEN_CLASS = 4;
-        /** Show the error log */
-        private static final int LINK_SHOW_LOG = 5;
-        /** Change the class reference to the given fully qualified name */
-        private static final int LINK_CHANGE_CLASS_TO = 6;
-        /** Ignore the given fidelity warning */
-        private static final int IGNORE_FIDELITY_WARNING = 7;
-        /** Set an attribute on the given XML element to a given value  */
-        private static final int SET_ATTRIBUTE = 8;
-        /** Open the given file and line number */
-        private static final int LINK_OPEN_LINE = 9;
-        /** Disable sandbox */
-        private static final int LINK_DISABLE_SANDBOX = 10;
-
-        /** Client data: the contents depend on the specific action */
-        private final Object[] mData;
-        /** The action to be taken when the link is clicked */
-        private final int mAction;
-
-        private ActionLinkStyleRange(int action, Object... data) {
-            super();
-            mAction = action;
-            mData = data;
-        }
-
-        /** Performs the click action */
-        public void onClick() {
-            switch (mAction) {
-                case LINK_CREATE_CLASS:
-                    createNewClass((String) mData[0]);
-                    break;
-                case LINK_EDIT_XML:
-                    mEditorDelegate.getEditor().setActivePage(AndroidXmlEditor.TEXT_EDITOR_ID);
-                    break;
-                case LINK_FIX_BUILD_PATH:
-                    @SuppressWarnings("restriction")
-                    String id = BuildPathsPropertyPage.PROP_ID;
-                    PreferencesUtil.createPropertyDialogOn(
-                            AdtPlugin.getShell(),
-                            getProject(), id, null, null).open();
-                    break;
-                case LINK_OPEN_CLASS:
-                    AdtPlugin.openJavaClass(getProject(), (String) mData[0]);
-                    break;
-                case LINK_OPEN_LINE:
-                    boolean success = AdtPlugin.openStackTraceLine(
-                            (String) mData[0],   // class
-                            (String) mData[1],   // method
-                            (String) mData[2],   // file
-                            (Integer) mData[3]); // line
-                    if (!success) {
-                        MessageDialog.openError(mErrorLabel.getShell(), "Not Found",
-                                String.format("Could not find %1$s.%2$s", mData[0], mData[1]));
-                    }
-                    break;
-                case LINK_SHOW_LOG:
-                    IWorkbench workbench = PlatformUI.getWorkbench();
-                    IWorkbenchWindow workbenchWindow = workbench.getActiveWorkbenchWindow();
-                    try {
-                        IWorkbenchPage page = workbenchWindow.getActivePage();
-                        page.showView("org.eclipse.pde.runtime.LogView"); //$NON-NLS-1$
-                    } catch (PartInitException e) {
-                        AdtPlugin.log(e, null);
-                    }
-                    break;
-                case LINK_CHANGE_CLASS_TO:
-                    // Change class reference of mData[0] to mData[1]
-                    // TODO: run under undo lock
-                    MultiTextEdit edits = new MultiTextEdit();
-                    ISourceViewer textViewer =
-                        mEditorDelegate.getEditor().getStructuredSourceViewer();
-                    IDocument document = textViewer.getDocument();
-                    String xml = document.get();
-                    int index = 0;
-                    // Replace <old with <new and </old with </new
-                    String prefix = "<"; //$NON-NLS-1$
-                    String find = prefix + mData[0];
-                    String replaceWith = prefix + mData[1];
-                    while (true) {
-                        index = xml.indexOf(find, index);
-                        if (index == -1) {
-                            break;
-                        }
-                        edits.addChild(new ReplaceEdit(index, find.length(), replaceWith));
-                        index += find.length();
-                    }
-                    index = 0;
-                    prefix = "</"; //$NON-NLS-1$
-                    find = prefix + mData[0];
-                    replaceWith = prefix + mData[1];
-                    while (true) {
-                        index = xml.indexOf(find, index);
-                        if (index == -1) {
-                            break;
-                        }
-                        edits.addChild(new ReplaceEdit(index, find.length(), replaceWith));
-                        index += find.length();
-                    }
-                    // Handle <view class="old">
-                    index = 0;
-                    prefix = "\""; //$NON-NLS-1$
-                    String suffix = "\""; //$NON-NLS-1$
-                    find = prefix + mData[0] + suffix;
-                    replaceWith = prefix + mData[1] + suffix;
-                    while (true) {
-                        index = xml.indexOf(find, index);
-                        if (index == -1) {
-                            break;
-                        }
-                        edits.addChild(new ReplaceEdit(index, find.length(), replaceWith));
-                        index += find.length();
-                    }
-                    try {
-                        edits.apply(document);
-                    } catch (MalformedTreeException e) {
-                        AdtPlugin.log(e, null);
-                    } catch (BadLocationException e) {
-                        AdtPlugin.log(e, null);
-                    }
-                    break;
-                case IGNORE_FIDELITY_WARNING:
-                    RenderLogger.ignoreFidelityWarning((String) mData[0]);
-                    recomputeLayout();
-                    break;
-                case SET_ATTRIBUTE: {
-                    final UiElementNode element = (UiElementNode) mData[0];
-                    final String attribute = (String) mData[1];
-                    final String value = (String) mData[2];
-                    mEditorDelegate.getEditor().wrapUndoEditXmlModel(
-                            String.format("Set \"%1$s\" to \"%2$s\"", attribute, value),
-                            new Runnable() {
-                        @Override
-                        public void run() {
-                            element.setAttributeValue(attribute, ANDROID_URI, value, true);
-                            element.commitDirtyAttributesToXml();
-                        }
-                    });
-                    break;
-                }
-                case LINK_DISABLE_SANDBOX: {
-                    RenderSecurityManager.sEnabled = false;
-                    recomputeLayout();
-
-                    MessageDialog.openInformation(AdtPlugin.getShell(),
-                        "Disabled Rendering Sandbox",
-                        "The custom view rendering sandbox was disabled for this session.\n\n" +
-                        "You can turn it off permanently by adding\n" +
-                        "-D" + ENABLED_PROPERTY + "=" + VALUE_FALSE + "\n" +
-                        "as a new line in eclipse.ini.");
-
-                    break;
-                }
-                default:
-                    assert false : mAction;
-                    break;
-            }
-        }
-
-        @Override
-        public boolean similarTo(StyleRange style) {
-            // Prevent adjacent link ranges from getting merged
-            return false;
-        }
-    }
-
-    /**
-     * Returns the error label for the graphical editor (which may not be visible
-     * or showing errors)
-     *
-     * @return the error label, never null
-     */
-    StyledText getErrorLabel() {
-        return mErrorLabel;
-    }
-
-    /**
-     * Monitor clicks on the error label.
-     * If the click happens on a style range created by
-     * {@link GraphicalEditorPart#addClassLink(StyledText, String)}, we assume it's about
-     * a missing class and we then proceed to display the standard Eclipse class creator wizard.
-     */
-    private class ErrorLabelListener extends MouseAdapter {
-
-        @Override
-        public void mouseUp(MouseEvent event) {
-            super.mouseUp(event);
-
-            if (event.widget != mErrorLabel) {
-                return;
-            }
-
-            int offset = mErrorLabel.getCaretOffset();
-
-            StyleRange r = null;
-            StyleRange[] ranges = mErrorLabel.getStyleRanges();
-            if (ranges != null && ranges.length > 0) {
-                for (StyleRange sr : ranges) {
-                    if (sr.start <= offset && sr.start + sr.length > offset) {
-                        r = sr;
-                        break;
-                    }
-                }
-            }
-
-            if (r instanceof ActionLinkStyleRange) {
-                ActionLinkStyleRange range = (ActionLinkStyleRange) r;
-                range.onClick();
-            }
-
-            LayoutCanvas canvas = getCanvasControl();
-            canvas.updateMenuActionState();
-        }
-    }
-
-    private void createNewClass(String fqcn) {
-
-        int pos = fqcn.lastIndexOf('.');
-        String packageName = pos < 0 ? "" : fqcn.substring(0, pos);  //$NON-NLS-1$
-        String className = pos <= 0 || pos >= fqcn.length() ? "" : fqcn.substring(pos + 1); //$NON-NLS-1$
-
-        // create the wizard page for the class creation, and configure it
-        NewClassWizardPage page = new NewClassWizardPage();
-
-        // set the parent class
-        page.setSuperClass(SdkConstants.CLASS_VIEW, true /* canBeModified */);
-
-        // get the source folders as java elements.
-        IPackageFragmentRoot[] roots = getPackageFragmentRoots(
-                mEditorDelegate.getEditor().getProject(),
-                false /*includeContainers*/, true /*skipGenFolder*/);
-
-        IPackageFragmentRoot currentRoot = null;
-        IPackageFragment currentFragment = null;
-        int packageMatchCount = -1;
-
-        for (IPackageFragmentRoot root : roots) {
-            // Get the java element for the package.
-            // This method is said to always return a IPackageFragment even if the
-            // underlying folder doesn't exist...
-            IPackageFragment fragment = root.getPackageFragment(packageName);
-            if (fragment != null && fragment.exists()) {
-                // we have a perfect match! we use it.
-                currentRoot = root;
-                currentFragment = fragment;
-                packageMatchCount = -1;
-                break;
-            } else {
-                // we don't have a match. we look for the fragment with the best match
-                // (ie the closest parent package we can find)
-                try {
-                    IJavaElement[] children;
-                    children = root.getChildren();
-                    for (IJavaElement child : children) {
-                        if (child instanceof IPackageFragment) {
-                            fragment = (IPackageFragment)child;
-                            if (packageName.startsWith(fragment.getElementName())) {
-                                // its a match. get the number of segments
-                                String[] segments = fragment.getElementName().split("\\."); //$NON-NLS-1$
-                                if (segments.length > packageMatchCount) {
-                                    packageMatchCount = segments.length;
-                                    currentFragment = fragment;
-                                    currentRoot = root;
-                                }
-                            }
-                        }
-                    }
-                } catch (JavaModelException e) {
-                    // Couldn't get the children: we just ignore this package root.
-                }
-            }
-        }
-
-        ArrayList<IPackageFragment> createdFragments = null;
-
-        if (currentRoot != null) {
-            // if we have a perfect match, we set it and we're done.
-            if (packageMatchCount == -1) {
-                page.setPackageFragmentRoot(currentRoot, true /* canBeModified*/);
-                page.setPackageFragment(currentFragment, true /* canBeModified */);
-            } else {
-                // we have a partial match.
-                // create the package. We have to start with the first segment so that we
-                // know what to delete in case of a cancel.
-                try {
-                    createdFragments = new ArrayList<IPackageFragment>();
-
-                    int totalCount = packageName.split("\\.").length; //$NON-NLS-1$
-                    int count = 0;
-                    int index = -1;
-                    // skip the matching packages
-                    while (count < packageMatchCount) {
-                        index = packageName.indexOf('.', index+1);
-                        count++;
-                    }
-
-                    // create the rest of the segments, except for the last one as indexOf will
-                    // return -1;
-                    while (count < totalCount - 1) {
-                        index = packageName.indexOf('.', index+1);
-                        count++;
-                        createdFragments.add(currentRoot.createPackageFragment(
-                                packageName.substring(0, index),
-                                true /* force*/, new NullProgressMonitor()));
-                    }
-
-                    // create the last package
-                    createdFragments.add(currentRoot.createPackageFragment(
-                            packageName, true /* force*/, new NullProgressMonitor()));
-
-                    // set the root and fragment in the Wizard page
-                    page.setPackageFragmentRoot(currentRoot, true /* canBeModified*/);
-                    page.setPackageFragment(createdFragments.get(createdFragments.size()-1),
-                            true /* canBeModified */);
-                } catch (JavaModelException e) {
-                    // If we can't create the packages, there's a problem.
-                    // We revert to the default package
-                    for (IPackageFragmentRoot root : roots) {
-                        // Get the java element for the package.
-                        // This method is said to always return a IPackageFragment even if the
-                        // underlying folder doesn't exist...
-                        IPackageFragment fragment = root.getPackageFragment(packageName);
-                        if (fragment != null && fragment.exists()) {
-                            page.setPackageFragmentRoot(root, true /* canBeModified*/);
-                            page.setPackageFragment(fragment, true /* canBeModified */);
-                            break;
-                        }
-                    }
-                }
-            }
-        } else if (roots.length > 0) {
-            // if we haven't found a valid fragment, we set the root to the first source folder.
-            page.setPackageFragmentRoot(roots[0], true /* canBeModified*/);
-        }
-
-        // if we have a starting class name we use it
-        if (className != null) {
-            page.setTypeName(className, true /* canBeModified*/);
-        }
-
-        // create the action that will open it the wizard.
-        OpenNewClassWizardAction action = new OpenNewClassWizardAction();
-        action.setConfiguredWizardPage(page);
-        action.run();
-        IJavaElement element = action.getCreatedElement();
-
-        if (element == null) {
-            // lets delete the packages we created just for this.
-            // we need to start with the leaf and go up
-            if (createdFragments != null) {
-                try {
-                    for (int i = createdFragments.size() - 1 ; i >= 0 ; i--) {
-                        createdFragments.get(i).delete(true /* force*/,
-                                                       new NullProgressMonitor());
-                    }
-                } catch (JavaModelException e) {
-                    e.printStackTrace();
-                }
-            }
-        }
-    }
-
-    /**
-     * Computes and return the {@link IPackageFragmentRoot}s corresponding to the source
-     * folders of the specified project.
-     *
-     * @param project the project
-     * @param includeContainers True to include containers
-     * @param skipGenFolder True to skip the "gen" folder
-     * @return an array of IPackageFragmentRoot.
-     */
-    private IPackageFragmentRoot[] getPackageFragmentRoots(IProject project,
-            boolean includeContainers, boolean skipGenFolder) {
-        ArrayList<IPackageFragmentRoot> result = new ArrayList<IPackageFragmentRoot>();
-        try {
-            IJavaProject javaProject = JavaCore.create(project);
-            IPackageFragmentRoot[] roots = javaProject.getPackageFragmentRoots();
-            for (int i = 0; i < roots.length; i++) {
-                if (skipGenFolder) {
-                    IResource resource = roots[i].getResource();
-                    if (resource != null && resource.getName().equals(FD_GEN_SOURCES)) {
-                        continue;
-                    }
-                }
-                IClasspathEntry entry = roots[i].getRawClasspathEntry();
-                if (entry.getEntryKind() == IClasspathEntry.CPE_SOURCE ||
-                        (includeContainers &&
-                                entry.getEntryKind() == IClasspathEntry.CPE_CONTAINER)) {
-                    result.add(roots[i]);
-                }
-            }
-        } catch (JavaModelException e) {
-        }
-
-        return result.toArray(new IPackageFragmentRoot[result.size()]);
-    }
-
-    /**
-     * Reopens this file as included within the given file (this assumes that the given
-     * file has an include tag referencing this view, and the set of views that have this
-     * property can be found using the {@link IncludeFinder}.
-     *
-     * @param includeWithin reference to a file to include as a surrounding context,
-     *   or null to show the file standalone
-     */
-    public void showIn(Reference includeWithin) {
-        mIncludedWithin = includeWithin;
-
-        if (includeWithin != null) {
-            IFile file = includeWithin.getFile();
-
-            // Update configuration
-            if (file != null) {
-                mConfigChooser.resetConfigFor(file);
-            }
-        }
-        recomputeLayout();
-    }
-
-    /**
-     * Return all resource names of a given type, either in the project or in the
-     * framework.
-     *
-     * @param framework if true, return all the framework resource names, otherwise return
-     *            all the project resource names
-     * @param type the type of resource to look up
-     * @return a collection of resource names, never null but possibly empty
-     */
-    public Collection<String> getResourceNames(boolean framework, ResourceType type) {
-        Map<ResourceType, Map<String, ResourceValue>> map =
-            framework ? mConfiguredFrameworkRes : mConfiguredProjectRes;
-        Map<String, ResourceValue> animations = map.get(type);
-        if (animations != null) {
-            return animations.keySet();
-        } else {
-            return Collections.emptyList();
-        }
-    }
-
-    /**
-     * Return this editor's current configuration
-     *
-     * @return the current configuration
-     */
-    public FolderConfiguration getConfiguration() {
-        return mConfigChooser.getConfiguration().getFullConfig();
-    }
-
-    /**
-     * Figures out the project's minSdkVersion and targetSdkVersion and return whether the values
-     * have changed.
-     */
-    private boolean computeSdkVersion() {
-        int oldMinSdkVersion = mMinSdkVersion;
-        int oldTargetSdkVersion = mTargetSdkVersion;
-
-        Pair<Integer, Integer> v = ManifestInfo.computeSdkVersions(mEditedFile.getProject());
-        mMinSdkVersion = v.getFirst();
-        mTargetSdkVersion = v.getSecond();
-
-        return oldMinSdkVersion != mMinSdkVersion || oldTargetSdkVersion != mTargetSdkVersion;
-    }
-
-    /**
-     * Returns the associated configuration chooser
-     *
-     * @return the configuration chooser
-     */
-    @NonNull
-    public ConfigurationChooser getConfigurationChooser() {
-        return mConfigChooser;
-    }
-
-    /**
-     * Returns the associated layout actions bar
-     *
-     * @return the layout actions bar
-     */
-    @NonNull
-    public LayoutActionBar getLayoutActionBar() {
-        return mActionBar;
-    }
-
-    /**
-     * Returns the target SDK version
-     *
-     * @return the target SDK version
-     */
-    public int getTargetSdkVersion() {
-        return mTargetSdkVersion;
-    }
-
-    /**
-     * Returns the minimum SDK version
-     *
-     * @return the minimum SDK version
-     */
-    public int getMinSdkVersion() {
-        return mMinSdkVersion;
-    }
-
-    /** If the flyout hover is showing, dismiss it */
-    public void dismissHoverPalette() {
-        mPaletteComposite.dismissHover();
-    }
-
-    // ---- Implements IFlyoutListener ----
-
-    @Override
-    public void stateChanged(int oldState, int newState) {
-        // Auto zoom the surface if you open or close flyout windows such as the palette
-        // or the property/outline views
-        if (newState == STATE_OPEN || newState == STATE_COLLAPSED && oldState == STATE_OPEN) {
-            getCanvasControl().setFitScale(true /*onlyZoomOut*/, true /*allowZoomIn*/);
-        }
-
-        sDockingStateVersion++;
-        mDockingStateVersion = sDockingStateVersion;
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/HoverOverlay.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/HoverOverlay.java
deleted file mode 100644
index 2e7c559..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/HoverOverlay.java
+++ /dev/null
@@ -1,187 +0,0 @@
-/*
- * Copyright (C) 2010 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.editors.layout.gle2;
-
-import static com.android.ide.eclipse.adt.internal.editors.layout.gle2.SwtDrawingStyle.HOVER;
-import static com.android.ide.eclipse.adt.internal.editors.layout.gle2.SwtDrawingStyle.HOVER_SELECTION;
-
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Device;
-import org.eclipse.swt.graphics.GC;
-import org.eclipse.swt.graphics.Rectangle;
-
-import java.util.List;
-
-/**
- * The {@link HoverOverlay} paints an optional hover on top of the layout,
- * highlighting the currently hovered view.
- */
-public class HoverOverlay extends Overlay {
-    private final LayoutCanvas mCanvas;
-
-    /** Hover border color. Must be disposed, it's NOT a system color. */
-    private Color mHoverStrokeColor;
-
-    /** Hover fill color. Must be disposed, it's NOT a system color. */
-    private Color mHoverFillColor;
-
-    /** Hover border select color. Must be disposed, it's NOT a system color. */
-    private Color mHoverSelectStrokeColor;
-
-    /** Hover fill select color. Must be disposed, it's NOT a system color. */
-    private Color mHoverSelectFillColor;
-
-    /** Vertical scaling & scrollbar information. */
-    private CanvasTransform mVScale;
-
-    /** Horizontal scaling & scrollbar information. */
-    private CanvasTransform mHScale;
-
-    /**
-     * Current mouse hover border rectangle. Null when there's no mouse hover.
-     * The rectangle coordinates do not take account of the translation, which
-     * must be applied to the rectangle when drawing.
-     */
-    private Rectangle mHoverRect;
-
-    /**
-     * Constructs a new {@link HoverOverlay} linked to the given view hierarchy.
-     *
-     * @param canvas the associated canvas
-     * @param hScale The {@link CanvasTransform} to use to transfer horizontal layout
-     *            coordinates to screen coordinates.
-     * @param vScale The {@link CanvasTransform} to use to transfer vertical layout
-     *            coordinates to screen coordinates.
-     */
-    public HoverOverlay(LayoutCanvas canvas, CanvasTransform hScale, CanvasTransform vScale) {
-        mCanvas = canvas;
-        mHScale = hScale;
-        mVScale = vScale;
-    }
-
-    @Override
-    public void create(Device device) {
-        if (SwtDrawingStyle.HOVER.getStrokeColor() != null) {
-            mHoverStrokeColor = new Color(device, SwtDrawingStyle.HOVER.getStrokeColor());
-        }
-        if (SwtDrawingStyle.HOVER.getFillColor() != null) {
-            mHoverFillColor = new Color(device, SwtDrawingStyle.HOVER.getFillColor());
-        }
-
-        if (SwtDrawingStyle.HOVER_SELECTION.getStrokeColor() != null) {
-            mHoverSelectStrokeColor = new Color(device,
-                    SwtDrawingStyle.HOVER_SELECTION.getStrokeColor());
-        }
-        if (SwtDrawingStyle.HOVER_SELECTION.getFillColor() != null) {
-            mHoverSelectFillColor = new Color(device,
-                    SwtDrawingStyle.HOVER_SELECTION.getFillColor());
-        }
-    }
-
-    @Override
-    public void dispose() {
-        if (mHoverStrokeColor != null) {
-            mHoverStrokeColor.dispose();
-            mHoverStrokeColor = null;
-        }
-
-        if (mHoverFillColor != null) {
-            mHoverFillColor.dispose();
-            mHoverFillColor = null;
-        }
-
-        if (mHoverSelectStrokeColor != null) {
-            mHoverSelectStrokeColor.dispose();
-            mHoverSelectStrokeColor = null;
-        }
-
-        if (mHoverSelectFillColor != null) {
-            mHoverSelectFillColor.dispose();
-            mHoverSelectFillColor = null;
-        }
-    }
-
-    /**
-     * Sets the hover rectangle. The coordinates of the rectangle are in layout
-     * coordinates. The recipient is will own this rectangle.
-     * <p/>
-     * TODO: Consider switching input arguments to two {@link LayoutPoint}s so
-     * we don't have ambiguity about the coordinate system of these input
-     * parameters.
-     * <p/>
-     *
-     * @param x The top left x coordinate, in layout coordinates, of the hover.
-     * @param y The top left y coordinate, in layout coordinates, of the hover.
-     * @param w The width of the hover (in layout coordinates).
-     * @param h The height of the hover (in layout coordinates).
-     */
-    public void setHover(int x, int y, int w, int h) {
-        mHoverRect = new Rectangle(x, y, w, h);
-    }
-
-    /**
-     * Removes the hover for the next paint.
-     */
-    public void clearHover() {
-        mHoverRect = null;
-    }
-
-    @Override
-    public void paint(GC gc) {
-        if (mHoverRect != null) {
-            // Translate the hover rectangle (in canvas coordinates) to control
-            // coordinates
-            int x = mHScale.translate(mHoverRect.x);
-            int y = mVScale.translate(mHoverRect.y);
-            int w = mHScale.scale(mHoverRect.width);
-            int h = mVScale.scale(mHoverRect.height);
-
-
-            boolean hoverIsSelected = false;
-            List<SelectionItem> selections = mCanvas.getSelectionManager().getSelections();
-            for (SelectionItem item : selections) {
-                if (mHoverRect.equals(item.getViewInfo().getSelectionRect())) {
-                    hoverIsSelected = true;
-                    break;
-                }
-            }
-
-            Color stroke = hoverIsSelected ? mHoverSelectStrokeColor : mHoverStrokeColor;
-            Color fill = hoverIsSelected ? mHoverSelectFillColor : mHoverFillColor;
-
-            if (stroke != null) {
-                int oldAlpha = gc.getAlpha();
-                gc.setForeground(stroke);
-                gc.setLineStyle(hoverIsSelected ?
-                        HOVER_SELECTION.getLineStyle() : HOVER.getLineStyle());
-                gc.setAlpha(hoverIsSelected ?
-                        HOVER_SELECTION.getStrokeAlpha() : HOVER.getStrokeAlpha());
-                gc.drawRectangle(x, y, w, h);
-                gc.setAlpha(oldAlpha);
-            }
-
-            if (fill != null) {
-                int oldAlpha = gc.getAlpha();
-                gc.setAlpha(hoverIsSelected ?
-                        HOVER_SELECTION.getFillAlpha() : HOVER.getFillAlpha());
-                gc.setBackground(fill);
-                gc.fillRectangle(x, y, w, h);
-                gc.setAlpha(oldAlpha);
-            }
-        }
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/ImageControl.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/ImageControl.java
deleted file mode 100644
index 4447eeb..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/ImageControl.java
+++ /dev/null
@@ -1,241 +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.eclipse.adt.internal.editors.layout.gle2;
-
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.CLabel;
-import org.eclipse.swt.events.MouseEvent;
-import org.eclipse.swt.events.MouseTrackListener;
-import org.eclipse.swt.events.PaintEvent;
-import org.eclipse.swt.events.PaintListener;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.GC;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.graphics.Rectangle;
-import org.eclipse.swt.widgets.Canvas;
-import org.eclipse.swt.widgets.Composite;
-
-/**
- * An ImageControl which simply renders an image, with optional margins and tooltips. This
- * is useful since a {@link CLabel}, even without text, will hide the image when there is
- * not enough room to fully fit it.
- * <p>
- * The image is always rendered left and top aligned.
- */
-public class ImageControl extends Canvas implements MouseTrackListener {
-    private Image mImage;
-    private int mLeftMargin;
-    private int mTopMargin;
-    private int mRightMargin;
-    private int mBottomMargin;
-    private boolean mDisposeImage = true;
-    private boolean mMouseIn;
-    private Color mHoverColor;
-    private float mScale = 1.0f;
-
-    /**
-     * Creates an ImageControl rendering the given image, which will be disposed when this
-     * control is disposed (unless the {@link #setDisposeImage} method is called to turn
-     * off auto dispose).
-     *
-     * @param parent the parent to add the image control to
-     * @param style the SWT style to use
-     * @param image the image to be rendered, which must not be null and should be unique
-     *            for this image control since it will be disposed by this control when
-     *            the control is disposed (unless the {@link #setDisposeImage} method is
-     *            called to turn off auto dispose)
-     */
-    public ImageControl(@NonNull Composite parent, int style, @Nullable Image image) {
-        super(parent, style | SWT.NO_FOCUS | SWT.DOUBLE_BUFFERED);
-        mImage = image;
-
-        addPaintListener(new PaintListener() {
-            @Override
-            public void paintControl(PaintEvent event) {
-                onPaint(event);
-            }
-        });
-    }
-
-    @Nullable
-    public Image getImage() {
-        return mImage;
-    }
-
-    public void setImage(@Nullable Image image) {
-        if (mDisposeImage && mImage != null) {
-            mImage.dispose();
-        }
-        mImage = image;
-        redraw();
-    }
-
-    public void fitToWidth(int width) {
-        if (mImage == null) {
-            return;
-        }
-        Rectangle imageRect = mImage.getBounds();
-        int imageWidth = imageRect.width;
-        if (imageWidth <= width) {
-            mScale = 1.0f;
-            return;
-        }
-
-        mScale = width / (float) imageWidth;
-        redraw();
-    }
-
-    public void setScale(float scale) {
-        mScale = scale;
-    }
-
-    public float getScale() {
-        return mScale;
-    }
-
-    public void setHoverColor(@Nullable Color hoverColor) {
-        if (mHoverColor != null) {
-            removeMouseTrackListener(this);
-        }
-        mHoverColor = hoverColor;
-        if (hoverColor != null) {
-            addMouseTrackListener(this);
-        }
-    }
-
-    @Nullable
-    public Color getHoverColor() {
-        return mHoverColor;
-    }
-
-    @Override
-    public void dispose() {
-        super.dispose();
-
-        if (mDisposeImage && mImage != null && !mImage.isDisposed()) {
-            mImage.dispose();
-        }
-        mImage = null;
-    }
-
-    public void setDisposeImage(boolean disposeImage) {
-        mDisposeImage = disposeImage;
-    }
-
-    public boolean getDisposeImage() {
-        return mDisposeImage;
-    }
-
-    @Override
-    public Point computeSize(int wHint, int hHint, boolean changed) {
-        checkWidget();
-        Point e = new Point(0, 0);
-        if (mImage != null) {
-            Rectangle r = mImage.getBounds();
-            if (mScale != 1.0f) {
-                e.x += mScale * r.width;
-                e.y += mScale * r.height;
-            } else {
-                e.x += r.width;
-                e.y += r.height;
-            }
-        }
-        if (wHint == SWT.DEFAULT) {
-            e.x += mLeftMargin + mRightMargin;
-        } else {
-            e.x = wHint;
-        }
-        if (hHint == SWT.DEFAULT) {
-            e.y += mTopMargin + mBottomMargin;
-        } else {
-            e.y = hHint;
-        }
-
-        return e;
-    }
-
-    private void onPaint(PaintEvent event) {
-        Rectangle rect = getClientArea();
-        if (mImage == null || rect.width == 0 || rect.height == 0) {
-            return;
-        }
-
-        GC gc = event.gc;
-        Rectangle imageRect = mImage.getBounds();
-        int imageHeight = imageRect.height;
-        int imageWidth = imageRect.width;
-        int destWidth = imageWidth;
-        int destHeight = imageHeight;
-
-        int oldGcAlias = gc.getAntialias();
-        int oldGcInterpolation = gc.getInterpolation();
-        if (mScale != 1.0f) {
-            destWidth = (int) (mScale * destWidth);
-            destHeight = (int) (mScale * destHeight);
-            gc.setAntialias(SWT.ON);
-            gc.setInterpolation(SWT.HIGH);
-        }
-
-        gc.drawImage(mImage, 0, 0, imageWidth, imageHeight, rect.x + mLeftMargin, rect.y
-                + mTopMargin, destWidth, destHeight);
-
-        gc.setAntialias(oldGcAlias);
-        gc.setInterpolation(oldGcInterpolation);
-
-        if (mHoverColor != null && mMouseIn) {
-            gc.setAlpha(60);
-            gc.setBackground(mHoverColor);
-            gc.setLineWidth(1);
-            gc.fillRectangle(0, 0, destWidth, destHeight);
-        }
-    }
-
-    public void setMargins(int leftMargin, int topMargin, int rightMargin, int bottomMargin) {
-        checkWidget();
-        mLeftMargin = Math.max(0, leftMargin);
-        mTopMargin = Math.max(0, topMargin);
-        mRightMargin = Math.max(0, rightMargin);
-        mBottomMargin = Math.max(0, bottomMargin);
-        redraw();
-    }
-
-    // ---- Implements MouseTrackListener ----
-
-    @Override
-    public void mouseEnter(MouseEvent e) {
-        mMouseIn = true;
-        if (mHoverColor != null) {
-            redraw();
-        }
-    }
-
-    @Override
-    public void mouseExit(MouseEvent e) {
-        mMouseIn = false;
-        if (mHoverColor != null) {
-            redraw();
-        }
-    }
-
-    @Override
-    public void mouseHover(MouseEvent e) {
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/ImageOverlay.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/ImageOverlay.java
deleted file mode 100644
index a1363ec..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/ImageOverlay.java
+++ /dev/null
@@ -1,447 +0,0 @@
-/*
- * Copyright (C) 2010 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.editors.layout.gle2;
-
-import static com.android.ide.eclipse.adt.internal.editors.layout.gle2.ImageUtils.SHADOW_SIZE;
-
-import com.android.SdkConstants;
-import com.android.annotations.Nullable;
-import com.android.ide.common.api.Rect;
-import com.android.ide.common.rendering.api.IImageFactory;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.SWTException;
-import org.eclipse.swt.graphics.Device;
-import org.eclipse.swt.graphics.GC;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.graphics.ImageData;
-import org.eclipse.swt.graphics.PaletteData;
-
-import java.awt.image.BufferedImage;
-import java.awt.image.DataBufferInt;
-import java.awt.image.WritableRaster;
-import java.lang.ref.SoftReference;
-
-/**
- * The {@link ImageOverlay} class renders an image as an overlay.
- */
-public class ImageOverlay extends Overlay implements IImageFactory {
-    /**
-     * Whether the image should be pre-scaled (scaled to the zoom level) once
-     * instead of dynamically during each paint; this is necessary on some
-     * platforms (see issue #19447)
-     */
-    private static final boolean PRESCALE =
-            // Currently this is necessary on Linux because the "Cairo" library
-            // seems to be a bottleneck
-            SdkConstants.CURRENT_PLATFORM == SdkConstants.PLATFORM_LINUX
-                    && !(Boolean.getBoolean("adt.noprescale")); //$NON-NLS-1$
-
-    /** Current background image. Null when there's no image. */
-    private Image mImage;
-
-    /** A pre-scaled version of the image */
-    private Image mPreScaledImage;
-
-    /** Whether the rendered image should have a drop shadow */
-    private boolean mShowDropShadow;
-
-    /** Current background AWT image. This is created by {@link #getImage()}, which is called
-     * by the LayoutLib. */
-    private SoftReference<BufferedImage> mAwtImage = new SoftReference<BufferedImage>(null);
-
-    /**
-     * Strong reference to the image in the above soft reference, to prevent
-     * garbage collection when {@link PRESCALE} is set, until the scaled image
-     * is created (lazily as part of the next paint call, where this strong
-     * reference is nulled out and the above soft reference becomes eligible to
-     * be reclaimed when memory is low.)
-     */
-    @SuppressWarnings("unused") // Used by the garbage collector to keep mAwtImage non-soft
-    private BufferedImage mAwtImageStrongRef;
-
-    /** The associated {@link LayoutCanvas}. */
-    private LayoutCanvas mCanvas;
-
-    /** Vertical scaling & scrollbar information. */
-    private CanvasTransform mVScale;
-
-    /** Horizontal scaling & scrollbar information. */
-    private CanvasTransform mHScale;
-
-    /**
-     * Constructs an {@link ImageOverlay} tied to the given canvas.
-     *
-     * @param canvas The {@link LayoutCanvas} to paint the overlay over.
-     * @param hScale The horizontal scale information.
-     * @param vScale The vertical scale information.
-     */
-    public ImageOverlay(LayoutCanvas canvas, CanvasTransform hScale, CanvasTransform vScale) {
-        mCanvas = canvas;
-        mHScale = hScale;
-        mVScale = vScale;
-    }
-
-    @Override
-    public void create(Device device) {
-        super.create(device);
-    }
-
-    @Override
-    public void dispose() {
-        if (mImage != null) {
-            mImage.dispose();
-            mImage = null;
-        }
-        if (mPreScaledImage != null) {
-            mPreScaledImage.dispose();
-            mPreScaledImage = null;
-        }
-    }
-
-    /**
-     * Sets the image to be drawn as an overlay from the passed in AWT
-     * {@link BufferedImage} (which will be converted to an SWT image).
-     * <p/>
-     * The image <b>can</b> be null, which is the case when we are dealing with
-     * an empty document.
-     *
-     * @param awtImage The AWT image to be rendered as an SWT image.
-     * @param isAlphaChannelImage whether the alpha channel of the image is relevant
-     * @return The corresponding SWT image, or null.
-     */
-    public synchronized Image setImage(BufferedImage awtImage, boolean isAlphaChannelImage) {
-        mShowDropShadow = !isAlphaChannelImage;
-
-        BufferedImage oldAwtImage = mAwtImage.get();
-        if (awtImage != oldAwtImage || awtImage == null) {
-            mAwtImage.clear();
-            mAwtImageStrongRef = null;
-
-            if (mImage != null) {
-                mImage.dispose();
-            }
-
-            if (awtImage == null) {
-                mImage = null;
-            } else {
-                mImage = SwtUtils.convertToSwt(mCanvas.getDisplay(), awtImage,
-                        isAlphaChannelImage, -1);
-            }
-        } else {
-            assert awtImage instanceof SwtReadyBufferedImage;
-
-            if (isAlphaChannelImage) {
-                if (mImage != null) {
-                    mImage.dispose();
-                }
-
-                mImage = SwtUtils.convertToSwt(mCanvas.getDisplay(), awtImage, true, -1);
-            } else {
-                Image prev = mImage;
-                mImage = ((SwtReadyBufferedImage)awtImage).getSwtImage();
-                if (prev != mImage && prev != null) {
-                    prev.dispose();
-                }
-            }
-        }
-
-        if (mPreScaledImage != null) {
-            // Force refresh on next paint
-            mPreScaledImage.dispose();
-            mPreScaledImage = null;
-        }
-
-        return mImage;
-    }
-
-    /**
-     * Returns the currently painted image, or null if none has been set
-     *
-     * @return the currently painted image or null
-     */
-    public Image getImage() {
-        return mImage;
-    }
-
-    /**
-     * Returns the currently rendered image, or null if none has been set
-     *
-     * @return the currently rendered image or null
-     */
-    @Nullable
-    BufferedImage getAwtImage() {
-        BufferedImage awtImage = mAwtImage.get();
-        if (awtImage == null && mImage != null) {
-            awtImage = SwtUtils.convertToAwt(mImage);
-        }
-
-        return awtImage;
-    }
-
-    /**
-     * Returns whether this image overlay should be painted with a drop shadow.
-     * This is usually the case, but not for transparent themes like the dialog
-     * theme (Theme.*Dialog), which already provides its own shadow.
-     *
-     * @return true if the image overlay should be shown with a drop shadow.
-     */
-    public boolean getShowDropShadow() {
-        return mShowDropShadow;
-    }
-
-    @Override
-    public synchronized void paint(GC gc) {
-        if (mImage != null) {
-            boolean valid = mCanvas.getViewHierarchy().isValid();
-            mCanvas.ensureZoomed();
-            if (!valid) {
-                gc_setAlpha(gc, 128); // half-transparent
-            }
-
-            CanvasTransform hi = mHScale;
-            CanvasTransform vi = mVScale;
-
-            // On some platforms, dynamic image scaling is very slow (see issue #19447) so
-            // compute a pre-scaled version of the image once and render that instead.
-            // This is done lazily in paint rather than when the image changes because
-            // the image must be rescaled each time the zoom level changes, which varies
-            // independently from when the image changes.
-            BufferedImage awtImage = mAwtImage.get();
-            if (PRESCALE && awtImage != null) {
-                int imageWidth = (mPreScaledImage == null) ? 0
-                        : mPreScaledImage.getImageData().width
-                            - (mShowDropShadow ? SHADOW_SIZE : 0);
-                if (mPreScaledImage == null || imageWidth != hi.getScaledImgSize()) {
-                    double xScale = hi.getScaledImgSize() / (double) awtImage.getWidth();
-                    double yScale = vi.getScaledImgSize() / (double) awtImage.getHeight();
-                    BufferedImage scaledAwtImage;
-
-                    // NOTE: == comparison on floating point numbers is okay
-                    // here because we normalize the scaling factor
-                    // to an exact 1.0 in the zooming code when the value gets
-                    // near 1.0 to make painting more efficient in the presence
-                    // of rounding errors.
-                    if (xScale == 1.0 && yScale == 1.0) {
-                        // Scaling to 100% is easy!
-                        scaledAwtImage = awtImage;
-
-                        if (mShowDropShadow) {
-                            // Just need to draw drop shadows
-                            scaledAwtImage = ImageUtils.createRectangularDropShadow(awtImage);
-                        }
-                    } else {
-                        if (mShowDropShadow) {
-                            scaledAwtImage = ImageUtils.scale(awtImage, xScale, yScale,
-                                    SHADOW_SIZE, SHADOW_SIZE);
-                            ImageUtils.drawRectangleShadow(scaledAwtImage, 0, 0,
-                                    scaledAwtImage.getWidth() - SHADOW_SIZE,
-                                    scaledAwtImage.getHeight() - SHADOW_SIZE);
-                        } else {
-                            scaledAwtImage = ImageUtils.scale(awtImage, xScale, yScale);
-                        }
-                    }
-
-                    if (mPreScaledImage != null && !mPreScaledImage.isDisposed()) {
-                        mPreScaledImage.dispose();
-                    }
-                    mPreScaledImage = SwtUtils.convertToSwt(mCanvas.getDisplay(), scaledAwtImage,
-                            true /*transferAlpha*/, -1);
-                    // We can't just clear the mAwtImageStrongRef here, because if the
-                    // zooming factor changes, we may need to use it again
-                }
-
-                if (mPreScaledImage != null) {
-                    gc.drawImage(mPreScaledImage, hi.translate(0), vi.translate(0));
-                }
-                return;
-            }
-
-            // we only anti-alias when reducing the image size.
-            int oldAlias = -2;
-            if (hi.getScale() < 1.0) {
-                oldAlias = gc_setAntialias(gc, SWT.ON);
-            }
-
-            int srcX = 0;
-            int srcY = 0;
-            int srcWidth = hi.getImgSize();
-            int srcHeight = vi.getImgSize();
-            int destX = hi.translate(0);
-            int destY = vi.translate(0);
-            int destWidth = hi.getScaledImgSize();
-            int destHeight = vi.getScaledImgSize();
-
-            gc.drawImage(mImage,
-                    srcX, srcY, srcWidth, srcHeight,
-                    destX, destY, destWidth, destHeight);
-
-            if (mShowDropShadow) {
-                SwtUtils.drawRectangleShadow(gc, destX, destY, destWidth, destHeight);
-            }
-
-            if (oldAlias != -2) {
-                gc_setAntialias(gc, oldAlias);
-            }
-
-            if (!valid) {
-                gc_setAlpha(gc, 255); // opaque
-            }
-        }
-    }
-
-    /**
-     * Sets the alpha for the given GC.
-     * <p/>
-     * Alpha may not work on all platforms and may fail with an exception, which
-     * is hidden here (false is returned in that case).
-     *
-     * @param gc the GC to change
-     * @param alpha the new alpha, 0 for transparent, 255 for opaque.
-     * @return True if the operation worked, false if it failed with an
-     *         exception.
-     * @see GC#setAlpha(int)
-     */
-    private boolean gc_setAlpha(GC gc, int alpha) {
-        try {
-            gc.setAlpha(alpha);
-            return true;
-        } catch (SWTException e) {
-            return false;
-        }
-    }
-
-    /**
-     * Sets the non-text antialias flag for the given GC.
-     * <p/>
-     * Antialias may not work on all platforms and may fail with an exception,
-     * which is hidden here (-2 is returned in that case).
-     *
-     * @param gc the GC to change
-     * @param alias One of {@link SWT#DEFAULT}, {@link SWT#ON}, {@link SWT#OFF}.
-     * @return The previous aliasing mode if the operation worked, or -2 if it
-     *         failed with an exception.
-     * @see GC#setAntialias(int)
-     */
-    private int gc_setAntialias(GC gc, int alias) {
-        try {
-            int old = gc.getAntialias();
-            gc.setAntialias(alias);
-            return old;
-        } catch (SWTException e) {
-            return -2;
-        }
-    }
-
-    /**
-     * Custom {@link BufferedImage} class able to convert itself into an SWT {@link Image}
-     * efficiently.
-     *
-     * The BufferedImage also contains an instance of {@link ImageData} that's kept around
-     * and used to create new SWT {@link Image} objects in {@link #getSwtImage()}.
-     *
-     */
-    private static final class SwtReadyBufferedImage extends BufferedImage {
-
-        private final ImageData mImageData;
-        private final Device mDevice;
-
-        /**
-         * Creates the image with a given model, raster and SWT {@link ImageData}
-         * @param model the color model
-         * @param raster the image raster
-         * @param imageData the SWT image data.
-         * @param device the {@link Device} in which the SWT image will be painted.
-         */
-        private SwtReadyBufferedImage(int width, int height, ImageData imageData, Device device) {
-            super(width, height, BufferedImage.TYPE_INT_ARGB);
-            mImageData = imageData;
-            mDevice = device;
-        }
-
-        /**
-         * Returns a new {@link Image} object initialized with the content of the BufferedImage.
-         * @return the image object.
-         */
-        private Image getSwtImage() {
-            // transfer the content of the bufferedImage into the image data.
-            WritableRaster raster = getRaster();
-            int[] imageDataBuffer = ((DataBufferInt) raster.getDataBuffer()).getData();
-
-            mImageData.setPixels(0, 0, imageDataBuffer.length, imageDataBuffer, 0);
-
-            return new Image(mDevice, mImageData);
-        }
-
-        /**
-         * Creates a new {@link SwtReadyBufferedImage}.
-         * @param w the width of the image
-         * @param h the height of the image
-         * @param device the device in which the SWT image will be painted
-         * @return a new {@link SwtReadyBufferedImage} object
-         */
-        private static SwtReadyBufferedImage createImage(int w, int h, Device device) {
-            // NOTE: We can't make this image bigger to accommodate the drop shadow directly
-            // (such that we could paint one into the image after a layoutlib render)
-            // since this image is in the full resolution of the device, and gets scaled
-            // to fit in the layout editor. This would have the net effect of causing
-            // the drop shadow to get zoomed/scaled along with the scene, making a tiny
-            // drop shadow for tablet layouts, a huge drop shadow for tiny QVGA screens, etc.
-
-            ImageData imageData = new ImageData(w, h, 32,
-                    new PaletteData(0x00FF0000, 0x0000FF00, 0x000000FF));
-
-            SwtReadyBufferedImage swtReadyImage = new SwtReadyBufferedImage(w, h,
-                    imageData, device);
-
-            return swtReadyImage;
-        }
-    }
-
-    /**
-     * Implementation of {@link IImageFactory#getImage(int, int)}.
-     */
-    @Override
-    public BufferedImage getImage(int w, int h) {
-        BufferedImage awtImage = mAwtImage.get();
-        if (awtImage == null ||
-                awtImage.getWidth() != w ||
-                awtImage.getHeight() != h) {
-            mAwtImage.clear();
-            awtImage = SwtReadyBufferedImage.createImage(w, h, getDevice());
-            mAwtImage = new SoftReference<BufferedImage>(awtImage);
-            if (PRESCALE) {
-                mAwtImageStrongRef = awtImage;
-            }
-        }
-
-        return awtImage;
-    }
-
-    /**
-     * Returns the bounds of the current image, or null
-     *
-     * @return the bounds of the current image, or null
-     */
-    public Rect getImageBounds() {
-        if (mImage == null) {
-            return null;
-        }
-
-        return new Rect(0, 0, mImage.getImageData().width, mImage.getImageData().height);
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/ImageUtils.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/ImageUtils.java
deleted file mode 100644
index b5bc9aa..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/ImageUtils.java
+++ /dev/null
@@ -1,979 +0,0 @@
-/*
- * Copyright (C) 2010 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.editors.layout.gle2;
-
-import static com.android.SdkConstants.DOT_9PNG;
-import static com.android.SdkConstants.DOT_BMP;
-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.utils.SdkUtils.endsWithIgnoreCase;
-import static java.awt.RenderingHints.KEY_ANTIALIASING;
-import static java.awt.RenderingHints.KEY_INTERPOLATION;
-import static java.awt.RenderingHints.KEY_RENDERING;
-import static java.awt.RenderingHints.VALUE_ANTIALIAS_ON;
-import static java.awt.RenderingHints.VALUE_INTERPOLATION_BILINEAR;
-import static java.awt.RenderingHints.VALUE_RENDER_QUALITY;
-
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-import com.android.ide.common.api.Rect;
-import com.android.ide.eclipse.adt.AdtPlugin;
-
-import org.eclipse.swt.graphics.RGB;
-import org.eclipse.swt.graphics.Rectangle;
-
-import java.awt.AlphaComposite;
-import java.awt.Color;
-import java.awt.Graphics;
-import java.awt.Graphics2D;
-import java.awt.image.BufferedImage;
-import java.awt.image.DataBufferInt;
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.Iterator;
-import java.util.List;
-
-import javax.imageio.ImageIO;
-
-/**
- * Utilities related to image processing.
- */
-public class ImageUtils {
-    /**
-     * Returns true if the given image has no dark pixels
-     *
-     * @param image the image to be checked for dark pixels
-     * @return true if no dark pixels were found
-     */
-    public static boolean containsDarkPixels(BufferedImage image) {
-        for (int y = 0, height = image.getHeight(); y < height; y++) {
-            for (int x = 0, width = image.getWidth(); x < width; x++) {
-                int pixel = image.getRGB(x, y);
-                if ((pixel & 0xFF000000) != 0) {
-                    int r = (pixel & 0xFF0000) >> 16;
-                    int g = (pixel & 0x00FF00) >> 8;
-                    int b = (pixel & 0x0000FF);
-
-                    // One perceived luminance formula is (0.299*red + 0.587*green + 0.114*blue)
-                    // In order to keep this fast since we don't need a very accurate
-                    // measure, I'll just estimate this with integer math:
-                    long brightness = (299L*r + 587*g + 114*b) / 1000;
-                    if (brightness < 128) {
-                        return true;
-                    }
-                }
-            }
-        }
-        return false;
-    }
-
-    /**
-     * Returns the perceived brightness of the given RGB integer on a scale from 0 to 255
-     *
-     * @param rgb the RGB triplet, 8 bits each
-     * @return the perceived brightness, with 0 maximally dark and 255 maximally bright
-     */
-    public static int getBrightness(int rgb) {
-        if ((rgb & 0xFFFFFF) != 0) {
-            int r = (rgb & 0xFF0000) >> 16;
-            int g = (rgb & 0x00FF00) >> 8;
-            int b = (rgb & 0x0000FF);
-            // See the containsDarkPixels implementation for details
-            return (int) ((299L*r + 587*g + 114*b) / 1000);
-        }
-
-        return 0;
-    }
-
-    /**
-     * Converts an alpha-red-green-blue integer color into an {@link RGB} color.
-     * <p>
-     * <b>NOTE</b> - this will drop the alpha value since {@link RGB} objects do not
-     * contain transparency information.
-     *
-     * @param rgb the RGB integer to convert to a color description
-     * @return the color description corresponding to the integer
-     */
-    public static RGB intToRgb(int rgb) {
-        return new RGB((rgb & 0xFF0000) >>> 16, (rgb & 0xFF00) >>> 8, rgb & 0xFF);
-    }
-
-    /**
-     * Converts an {@link RGB} color into a alpha-red-green-blue integer
-     *
-     * @param rgb the RGB color descriptor to convert
-     * @param alpha the amount of alpha to add into the color integer (since the
-     *            {@link RGB} objects do not contain an alpha channel)
-     * @return an integer corresponding to the {@link RGB} color
-     */
-    public static int rgbToInt(RGB rgb, int alpha) {
-        return alpha << 24 | (rgb.red << 16) | (rgb.green << 8) | rgb.blue;
-    }
-
-    /**
-     * Crops blank pixels from the edges of the image and returns the cropped result. We
-     * crop off pixels that are blank (meaning they have an alpha value = 0). Note that
-     * this is not the same as pixels that aren't opaque (an alpha value other than 255).
-     *
-     * @param image the image to be cropped
-     * @param initialCrop If not null, specifies a rectangle which contains an initial
-     *            crop to continue. This can be used to crop an image where you already
-     *            know about margins in the image
-     * @return a cropped version of the source image, or null if the whole image was blank
-     *         and cropping completely removed everything
-     */
-    @Nullable
-    public static BufferedImage cropBlank(
-            @NonNull BufferedImage image,
-            @Nullable Rect initialCrop) {
-        return cropBlank(image, initialCrop, image.getType());
-    }
-
-    /**
-     * Crops blank pixels from the edges of the image and returns the cropped result. We
-     * crop off pixels that are blank (meaning they have an alpha value = 0). Note that
-     * this is not the same as pixels that aren't opaque (an alpha value other than 255).
-     *
-     * @param image the image to be cropped
-     * @param initialCrop If not null, specifies a rectangle which contains an initial
-     *            crop to continue. This can be used to crop an image where you already
-     *            know about margins in the image
-     * @param imageType the type of {@link BufferedImage} to create
-     * @return a cropped version of the source image, or null if the whole image was blank
-     *         and cropping completely removed everything
-     */
-    public static BufferedImage cropBlank(BufferedImage image, Rect initialCrop, int imageType) {
-        CropFilter filter = new CropFilter() {
-            @Override
-            public boolean crop(BufferedImage bufferedImage, int x, int y) {
-                int rgb = bufferedImage.getRGB(x, y);
-                return (rgb & 0xFF000000) == 0x00000000;
-                // TODO: Do a threshold of 80 instead of just 0? Might give better
-                // visual results -- e.g. check <= 0x80000000
-            }
-        };
-        return crop(image, filter, initialCrop, imageType);
-    }
-
-    /**
-     * Crops pixels of a given color from the edges of the image and returns the cropped
-     * result.
-     *
-     * @param image the image to be cropped
-     * @param blankArgb the color considered to be blank, as a 32 pixel integer with 8
-     *            bits of alpha, red, green and blue
-     * @param initialCrop If not null, specifies a rectangle which contains an initial
-     *            crop to continue. This can be used to crop an image where you already
-     *            know about margins in the image
-     * @return a cropped version of the source image, or null if the whole image was blank
-     *         and cropping completely removed everything
-     */
-    @Nullable
-    public static BufferedImage cropColor(
-            @NonNull BufferedImage image,
-            final int blankArgb,
-            @Nullable Rect initialCrop) {
-        return cropColor(image, blankArgb, initialCrop, image.getType());
-    }
-
-    /**
-     * Crops pixels of a given color from the edges of the image and returns the cropped
-     * result.
-     *
-     * @param image the image to be cropped
-     * @param blankArgb the color considered to be blank, as a 32 pixel integer with 8
-     *            bits of alpha, red, green and blue
-     * @param initialCrop If not null, specifies a rectangle which contains an initial
-     *            crop to continue. This can be used to crop an image where you already
-     *            know about margins in the image
-     * @param imageType the type of {@link BufferedImage} to create
-     * @return a cropped version of the source image, or null if the whole image was blank
-     *         and cropping completely removed everything
-     */
-    public static BufferedImage cropColor(BufferedImage image,
-            final int blankArgb, Rect initialCrop, int imageType) {
-        CropFilter filter = new CropFilter() {
-            @Override
-            public boolean crop(BufferedImage bufferedImage, int x, int y) {
-                return blankArgb == bufferedImage.getRGB(x, y);
-            }
-        };
-        return crop(image, filter, initialCrop, imageType);
-    }
-
-    /**
-     * Interface implemented by cropping functions that determine whether
-     * a pixel should be cropped or not.
-     */
-    private static interface CropFilter {
-        /**
-         * Returns true if the pixel is should be cropped.
-         *
-         * @param image the image containing the pixel in question
-         * @param x the x position of the pixel
-         * @param y the y position of the pixel
-         * @return true if the pixel should be cropped (for example, is blank)
-         */
-        boolean crop(BufferedImage image, int x, int y);
-    }
-
-    private static BufferedImage crop(BufferedImage image, CropFilter filter, Rect initialCrop,
-            int imageType) {
-        if (image == null) {
-            return null;
-        }
-
-        // First, determine the dimensions of the real image within the image
-        int x1, y1, x2, y2;
-        if (initialCrop != null) {
-            x1 = initialCrop.x;
-            y1 = initialCrop.y;
-            x2 = initialCrop.x + initialCrop.w;
-            y2 = initialCrop.y + initialCrop.h;
-        } else {
-            x1 = 0;
-            y1 = 0;
-            x2 = image.getWidth();
-            y2 = image.getHeight();
-        }
-
-        // Nothing left to crop
-        if (x1 == x2 || y1 == y2) {
-            return null;
-        }
-
-        // This algorithm is a bit dumb -- it just scans along the edges looking for
-        // a pixel that shouldn't be cropped. I could maybe try to make it smarter by
-        // for example doing a binary search to quickly eliminate large empty areas to
-        // the right and bottom -- but this is slightly tricky with components like the
-        // AnalogClock where I could accidentally end up finding a blank horizontal or
-        // vertical line somewhere in the middle of the rendering of the clock, so for now
-        // we do the dumb thing -- not a big deal since we tend to crop reasonably
-        // small images.
-
-        // First determine top edge
-        topEdge: for (; y1 < y2; y1++) {
-            for (int x = x1; x < x2; x++) {
-                if (!filter.crop(image, x, y1)) {
-                    break topEdge;
-                }
-            }
-        }
-
-        if (y1 == image.getHeight()) {
-            // The image is blank
-            return null;
-        }
-
-        // Next determine left edge
-        leftEdge: for (; x1 < x2; x1++) {
-            for (int y = y1; y < y2; y++) {
-                if (!filter.crop(image, x1, y)) {
-                    break leftEdge;
-                }
-            }
-        }
-
-        // Next determine right edge
-        rightEdge: for (; x2 > x1; x2--) {
-            for (int y = y1; y < y2; y++) {
-                if (!filter.crop(image, x2 - 1, y)) {
-                    break rightEdge;
-                }
-            }
-        }
-
-        // Finally determine bottom edge
-        bottomEdge: for (; y2 > y1; y2--) {
-            for (int x = x1; x < x2; x++) {
-                if (!filter.crop(image, x, y2 - 1)) {
-                    break bottomEdge;
-                }
-            }
-        }
-
-        // No need to crop?
-        if (x1 == 0 && y1 == 0 && x2 == image.getWidth() && y2 == image.getHeight()) {
-            return image;
-        }
-
-        if (x1 == x2 || y1 == y2) {
-            // Nothing left after crop -- blank image
-            return null;
-        }
-
-        int width = x2 - x1;
-        int height = y2 - y1;
-
-        // Now extract the sub-image
-        if (imageType == -1) {
-            imageType = image.getType();
-        }
-        if (imageType == BufferedImage.TYPE_CUSTOM) {
-            imageType = BufferedImage.TYPE_INT_ARGB;
-        }
-        BufferedImage cropped = new BufferedImage(width, height, imageType);
-        Graphics g = cropped.getGraphics();
-        g.drawImage(image, 0, 0, width, height, x1, y1, x2, y2, null);
-
-        g.dispose();
-
-        return cropped;
-    }
-
-    /**
-     * Creates a drop shadow of a given image and returns a new image which shows the
-     * input image on top of its drop shadow.
-     * <p>
-     * <b>NOTE: If the shape is rectangular and opaque, consider using
-     * {@link #drawRectangleShadow(Graphics, int, int, int, int)} instead.</b>
-     *
-     * @param source the source image to be shadowed
-     * @param shadowSize the size of the shadow in pixels
-     * @param shadowOpacity the opacity of the shadow, with 0=transparent and 1=opaque
-     * @param shadowRgb the RGB int to use for the shadow color
-     * @return a new image with the source image on top of its shadow
-     */
-    public static BufferedImage createDropShadow(BufferedImage source, int shadowSize,
-            float shadowOpacity, int shadowRgb) {
-
-        // This code is based on
-        //      http://www.jroller.com/gfx/entry/non_rectangular_shadow
-
-        BufferedImage image = new BufferedImage(source.getWidth() + shadowSize * 2,
-                source.getHeight() + shadowSize * 2,
-                BufferedImage.TYPE_INT_ARGB);
-
-        Graphics2D g2 = image.createGraphics();
-        g2.drawImage(source, null, shadowSize, shadowSize);
-
-        int dstWidth = image.getWidth();
-        int dstHeight = image.getHeight();
-
-        int left = (shadowSize - 1) >> 1;
-        int right = shadowSize - left;
-        int xStart = left;
-        int xStop = dstWidth - right;
-        int yStart = left;
-        int yStop = dstHeight - right;
-
-        shadowRgb = shadowRgb & 0x00FFFFFF;
-
-        int[] aHistory = new int[shadowSize];
-        int historyIdx = 0;
-
-        int aSum;
-
-        int[] dataBuffer = ((DataBufferInt) image.getRaster().getDataBuffer()).getData();
-        int lastPixelOffset = right * dstWidth;
-        float sumDivider = shadowOpacity / shadowSize;
-
-        // horizontal pass
-        for (int y = 0, bufferOffset = 0; y < dstHeight; y++, bufferOffset = y * dstWidth) {
-            aSum = 0;
-            historyIdx = 0;
-            for (int x = 0; x < shadowSize; x++, bufferOffset++) {
-                int a = dataBuffer[bufferOffset] >>> 24;
-                aHistory[x] = a;
-                aSum += a;
-            }
-
-            bufferOffset -= right;
-
-            for (int x = xStart; x < xStop; x++, bufferOffset++) {
-                int a = (int) (aSum * sumDivider);
-                dataBuffer[bufferOffset] = a << 24 | shadowRgb;
-
-                // subtract the oldest pixel from the sum
-                aSum -= aHistory[historyIdx];
-
-                // get the latest pixel
-                a = dataBuffer[bufferOffset + right] >>> 24;
-                aHistory[historyIdx] = a;
-                aSum += a;
-
-                if (++historyIdx >= shadowSize) {
-                    historyIdx -= shadowSize;
-                }
-            }
-        }
-        // vertical pass
-        for (int x = 0, bufferOffset = 0; x < dstWidth; x++, bufferOffset = x) {
-            aSum = 0;
-            historyIdx = 0;
-            for (int y = 0; y < shadowSize; y++, bufferOffset += dstWidth) {
-                int a = dataBuffer[bufferOffset] >>> 24;
-                aHistory[y] = a;
-                aSum += a;
-            }
-
-            bufferOffset -= lastPixelOffset;
-
-            for (int y = yStart; y < yStop; y++, bufferOffset += dstWidth) {
-                int a = (int) (aSum * sumDivider);
-                dataBuffer[bufferOffset] = a << 24 | shadowRgb;
-
-                // subtract the oldest pixel from the sum
-                aSum -= aHistory[historyIdx];
-
-                // get the latest pixel
-                a = dataBuffer[bufferOffset + lastPixelOffset] >>> 24;
-                aHistory[historyIdx] = a;
-                aSum += a;
-
-                if (++historyIdx >= shadowSize) {
-                    historyIdx -= shadowSize;
-                }
-            }
-        }
-
-        g2.drawImage(source, null, 0, 0);
-        g2.dispose();
-
-        return image;
-    }
-
-    /**
-     * Draws a rectangular drop shadow (of size {@link #SHADOW_SIZE} by
-     * {@link #SHADOW_SIZE} around the given source and returns a new image with
-     * both combined
-     *
-     * @param source the source image
-     * @return the source image with a drop shadow on the bottom and right
-     */
-    public static BufferedImage createRectangularDropShadow(BufferedImage source) {
-        int type = source.getType();
-        if (type == BufferedImage.TYPE_CUSTOM) {
-            type = BufferedImage.TYPE_INT_ARGB;
-        }
-
-        int width = source.getWidth();
-        int height = source.getHeight();
-        BufferedImage image = new BufferedImage(width + SHADOW_SIZE, height + SHADOW_SIZE, type);
-        Graphics g = image.getGraphics();
-        g.drawImage(source, 0, 0, width, height, null);
-        ImageUtils.drawRectangleShadow(image, 0, 0, width, height);
-        g.dispose();
-
-        return image;
-    }
-
-    /**
-     * Draws a drop shadow for the given rectangle into the given context. It
-     * will not draw anything if the rectangle is smaller than a minimum
-     * determined by the assets used to draw the shadow graphics.
-     * The size of the shadow is {@link #SHADOW_SIZE}.
-     *
-     * @param image the image to draw the shadow into
-     * @param x the left coordinate of the left hand side of the rectangle
-     * @param y the top coordinate of the top of the rectangle
-     * @param width the width of the rectangle
-     * @param height the height of the rectangle
-     */
-    public static final void drawRectangleShadow(BufferedImage image,
-            int x, int y, int width, int height) {
-        Graphics gc = image.getGraphics();
-        try {
-            drawRectangleShadow(gc, x, y, width, height);
-        } finally {
-            gc.dispose();
-        }
-    }
-
-    /**
-     * Draws a small drop shadow for the given rectangle into the given context. It
-     * will not draw anything if the rectangle is smaller than a minimum
-     * determined by the assets used to draw the shadow graphics.
-     * The size of the shadow is {@link #SMALL_SHADOW_SIZE}.
-     *
-     * @param image the image to draw the shadow into
-     * @param x the left coordinate of the left hand side of the rectangle
-     * @param y the top coordinate of the top of the rectangle
-     * @param width the width of the rectangle
-     * @param height the height of the rectangle
-     */
-    public static final void drawSmallRectangleShadow(BufferedImage image,
-            int x, int y, int width, int height) {
-        Graphics gc = image.getGraphics();
-        try {
-            drawSmallRectangleShadow(gc, x, y, width, height);
-        } finally {
-            gc.dispose();
-        }
-    }
-
-    /**
-     * The width and height of the drop shadow painted by
-     * {@link #drawRectangleShadow(Graphics, int, int, int, int)}
-     */
-    public static final int SHADOW_SIZE = 20; // DO NOT EDIT. This corresponds to bitmap graphics
-
-    /**
-     * The width and height of the drop shadow painted by
-     * {@link #drawSmallRectangleShadow(Graphics, int, int, int, int)}
-     */
-    public static final int SMALL_SHADOW_SIZE = 10; // DO NOT EDIT. Corresponds to bitmap graphics
-
-    /**
-     * Draws a drop shadow for the given rectangle into the given context. It
-     * will not draw anything if the rectangle is smaller than a minimum
-     * determined by the assets used to draw the shadow graphics.
-     * <p>
-     * This corresponds to
-     * {@link SwtUtils#drawRectangleShadow(org.eclipse.swt.graphics.GC, int, int, int, int)},
-     * but applied to an AWT graphics object instead, such that no image
-     * conversion has to be performed.
-     * <p>
-     * Make sure to keep changes in the visual appearance here in sync with the
-     * AWT version in
-     * {@link SwtUtils#drawRectangleShadow(org.eclipse.swt.graphics.GC, int, int, int, int)}.
-     *
-     * @param gc the graphics context to draw into
-     * @param x the left coordinate of the left hand side of the rectangle
-     * @param y the top coordinate of the top of the rectangle
-     * @param width the width of the rectangle
-     * @param height the height of the rectangle
-     */
-    public static final void drawRectangleShadow(Graphics gc,
-            int x, int y, int width, int height) {
-        if (sShadowBottomLeft == null) {
-            // Shadow graphics. This was generated by creating a drop shadow in
-            // Gimp, using the parameters x offset=10, y offset=10, blur radius=10,
-            // color=black, and opacity=51. These values attempt to make a shadow
-            // that is legible both for dark and light themes, on top of the
-            // canvas background (rgb(150,150,150). Darker shadows would tend to
-            // blend into the foreground for a dark holo screen, and lighter shadows
-            // would be hard to spot on the canvas background. If you make adjustments,
-            // make sure to check the shadow with both dark and light themes.
-            //
-            // After making the graphics, I cut out the top right, bottom left
-            // and bottom right corners as 20x20 images, and these are reproduced by
-            // painting them in the corresponding places in the target graphics context.
-            // I then grabbed a single horizontal gradient line from the middle of the
-            // right edge,and a single vertical gradient line from the bottom. These
-            // are then painted scaled/stretched in the target to fill the gaps between
-            // the three corner images.
-            //
-            // Filenames: bl=bottom left, b=bottom, br=bottom right, r=right, tr=top right
-            sShadowBottomLeft  = readImage("shadow-bl.png"); //$NON-NLS-1$
-            sShadowBottom      = readImage("shadow-b.png");  //$NON-NLS-1$
-            sShadowBottomRight = readImage("shadow-br.png"); //$NON-NLS-1$
-            sShadowRight       = readImage("shadow-r.png");  //$NON-NLS-1$
-            sShadowTopRight    = readImage("shadow-tr.png"); //$NON-NLS-1$
-            assert sShadowBottomLeft != null;
-            assert sShadowBottomRight.getWidth() == SHADOW_SIZE;
-            assert sShadowBottomRight.getHeight() == SHADOW_SIZE;
-        }
-
-        int blWidth = sShadowBottomLeft.getWidth();
-        int trHeight = sShadowTopRight.getHeight();
-        if (width < blWidth) {
-            return;
-        }
-        if (height < trHeight) {
-            return;
-        }
-
-        gc.drawImage(sShadowBottomLeft, x, y + height, null);
-        gc.drawImage(sShadowBottomRight, x + width, y + height, null);
-        gc.drawImage(sShadowTopRight, x + width, y, null);
-        gc.drawImage(sShadowBottom,
-                x + sShadowBottomLeft.getWidth(), y + height,
-                x + width, y + height + sShadowBottom.getHeight(),
-                0, 0, sShadowBottom.getWidth(), sShadowBottom.getHeight(),
-                null);
-        gc.drawImage(sShadowRight,
-                x + width, y + sShadowTopRight.getHeight(),
-                x + width + sShadowRight.getWidth(), y + height,
-                0, 0, sShadowRight.getWidth(), sShadowRight.getHeight(),
-                null);
-    }
-
-    /**
-     * Draws a small drop shadow for the given rectangle into the given context. It
-     * will not draw anything if the rectangle is smaller than a minimum
-     * determined by the assets used to draw the shadow graphics.
-     * <p>
-     *
-     * @param gc the graphics context to draw into
-     * @param x the left coordinate of the left hand side of the rectangle
-     * @param y the top coordinate of the top of the rectangle
-     * @param width the width of the rectangle
-     * @param height the height of the rectangle
-     */
-    public static final void drawSmallRectangleShadow(Graphics gc,
-            int x, int y, int width, int height) {
-        if (sShadow2BottomLeft == null) {
-            // Shadow graphics. This was generated by creating a drop shadow in
-            // Gimp, using the parameters x offset=5, y offset=%, blur radius=5,
-            // color=black, and opacity=51. These values attempt to make a shadow
-            // that is legible both for dark and light themes, on top of the
-            // canvas background (rgb(150,150,150). Darker shadows would tend to
-            // blend into the foreground for a dark holo screen, and lighter shadows
-            // would be hard to spot on the canvas background. If you make adjustments,
-            // make sure to check the shadow with both dark and light themes.
-            //
-            // After making the graphics, I cut out the top right, bottom left
-            // and bottom right corners as 20x20 images, and these are reproduced by
-            // painting them in the corresponding places in the target graphics context.
-            // I then grabbed a single horizontal gradient line from the middle of the
-            // right edge,and a single vertical gradient line from the bottom. These
-            // are then painted scaled/stretched in the target to fill the gaps between
-            // the three corner images.
-            //
-            // Filenames: bl=bottom left, b=bottom, br=bottom right, r=right, tr=top right
-            sShadow2BottomLeft  = readImage("shadow2-bl.png"); //$NON-NLS-1$
-            sShadow2Bottom      = readImage("shadow2-b.png");  //$NON-NLS-1$
-            sShadow2BottomRight = readImage("shadow2-br.png"); //$NON-NLS-1$
-            sShadow2Right       = readImage("shadow2-r.png");  //$NON-NLS-1$
-            sShadow2TopRight    = readImage("shadow2-tr.png"); //$NON-NLS-1$
-            assert sShadow2BottomLeft != null;
-            assert sShadow2TopRight != null;
-            assert sShadow2BottomRight.getWidth() == SMALL_SHADOW_SIZE;
-            assert sShadow2BottomRight.getHeight() == SMALL_SHADOW_SIZE;
-        }
-
-        int blWidth = sShadow2BottomLeft.getWidth();
-        int trHeight = sShadow2TopRight.getHeight();
-        if (width < blWidth) {
-            return;
-        }
-        if (height < trHeight) {
-            return;
-        }
-
-        gc.drawImage(sShadow2BottomLeft, x, y + height, null);
-        gc.drawImage(sShadow2BottomRight, x + width, y + height, null);
-        gc.drawImage(sShadow2TopRight, x + width, y, null);
-        gc.drawImage(sShadow2Bottom,
-                x + sShadow2BottomLeft.getWidth(), y + height,
-                x + width, y + height + sShadow2Bottom.getHeight(),
-                0, 0, sShadow2Bottom.getWidth(), sShadow2Bottom.getHeight(),
-                null);
-        gc.drawImage(sShadow2Right,
-                x + width, y + sShadow2TopRight.getHeight(),
-                x + width + sShadow2Right.getWidth(), y + height,
-                0, 0, sShadow2Right.getWidth(), sShadow2Right.getHeight(),
-                null);
-    }
-
-    /**
-     * Reads the given image from the plugin folder
-     *
-     * @param name the name of the image (including file extension)
-     * @return the corresponding image, or null if something goes wrong
-     */
-    @Nullable
-    public static BufferedImage readImage(@NonNull String name) {
-        InputStream stream = ImageUtils.class.getResourceAsStream("/icons/" + name); //$NON-NLS-1$
-        if (stream != null) {
-            try {
-                return ImageIO.read(stream);
-            } catch (IOException e) {
-                AdtPlugin.log(e, "Could not read %1$s", name);
-            } finally {
-                try {
-                    stream.close();
-                } catch (IOException e) {
-                    // Dumb API
-                }
-            }
-        }
-
-        return null;
-    }
-
-    // Normal drop shadow
-    private static BufferedImage sShadowBottomLeft;
-    private static BufferedImage sShadowBottom;
-    private static BufferedImage sShadowBottomRight;
-    private static BufferedImage sShadowRight;
-    private static BufferedImage sShadowTopRight;
-
-    // Small drop shadow
-    private static BufferedImage sShadow2BottomLeft;
-    private static BufferedImage sShadow2Bottom;
-    private static BufferedImage sShadow2BottomRight;
-    private static BufferedImage sShadow2Right;
-    private static BufferedImage sShadow2TopRight;
-
-    /**
-     * Returns a bounding rectangle for the given list of rectangles. If the list is
-     * empty, the bounding rectangle is null.
-     *
-     * @param items the list of rectangles to compute a bounding rectangle for (may not be
-     *            null)
-     * @return a bounding rectangle of the passed in rectangles, or null if the list is
-     *         empty
-     */
-    public static Rectangle getBoundingRectangle(List<Rectangle> items) {
-        Iterator<Rectangle> iterator = items.iterator();
-        if (!iterator.hasNext()) {
-            return null;
-        }
-
-        Rectangle bounds = iterator.next();
-        Rectangle union = new Rectangle(bounds.x, bounds.y, bounds.width, bounds.height);
-        while (iterator.hasNext()) {
-            union.add(iterator.next());
-        }
-
-        return union;
-    }
-
-    /**
-     * Returns a new image which contains of the sub image given by the rectangle (x1,y1)
-     * to (x2,y2)
-     *
-     * @param source the source image
-     * @param x1 top left X coordinate
-     * @param y1 top left Y coordinate
-     * @param x2 bottom right X coordinate
-     * @param y2 bottom right Y coordinate
-     * @return a new image containing the pixels in the given range
-     */
-    public static BufferedImage subImage(BufferedImage source, int x1, int y1, int x2, int y2) {
-        int width = x2 - x1;
-        int height = y2 - y1;
-        int imageType = source.getType();
-        if (imageType == BufferedImage.TYPE_CUSTOM) {
-            imageType = BufferedImage.TYPE_INT_ARGB;
-        }
-        BufferedImage sub = new BufferedImage(width, height, imageType);
-        Graphics g = sub.getGraphics();
-        g.drawImage(source, 0, 0, width, height, x1, y1, x2, y2, null);
-        g.dispose();
-
-        return sub;
-    }
-
-    /**
-     * Returns the color value represented by the given string value
-     * @param value the color value
-     * @return the color as an int
-     * @throw NumberFormatException if the conversion failed.
-     */
-    public static int getColor(String value) {
-        // Copied from ResourceHelper in layoutlib
-        if (value != null) {
-            if (value.startsWith("#") == false) { //$NON-NLS-1$
-                throw new NumberFormatException(
-                        String.format("Color value '%s' must start with #", value));
-            }
-
-            value = value.substring(1);
-
-            // make sure it's not longer than 32bit
-            if (value.length() > 8) {
-                throw new NumberFormatException(String.format(
-                        "Color value '%s' is too long. Format is either" +
-                        "#AARRGGBB, #RRGGBB, #RGB, or #ARGB",
-                        value));
-            }
-
-            if (value.length() == 3) { // RGB format
-                char[] color = new char[8];
-                color[0] = color[1] = 'F';
-                color[2] = color[3] = value.charAt(0);
-                color[4] = color[5] = value.charAt(1);
-                color[6] = color[7] = value.charAt(2);
-                value = new String(color);
-            } else if (value.length() == 4) { // ARGB format
-                char[] color = new char[8];
-                color[0] = color[1] = value.charAt(0);
-                color[2] = color[3] = value.charAt(1);
-                color[4] = color[5] = value.charAt(2);
-                color[6] = color[7] = value.charAt(3);
-                value = new String(color);
-            } else if (value.length() == 6) {
-                value = "FF" + value; //$NON-NLS-1$
-            }
-
-            // this is a RRGGBB or AARRGGBB value
-
-            // Integer.parseInt will fail to parse strings like "ff191919", so we use
-            // a Long, but cast the result back into an int, since we know that we're only
-            // dealing with 32 bit values.
-            return (int)Long.parseLong(value, 16);
-        }
-
-        throw new NumberFormatException();
-    }
-
-    /**
-     * Resize the given image
-     *
-     * @param source the image to be scaled
-     * @param xScale x scale
-     * @param yScale y scale
-     * @return the scaled image
-     */
-    public static BufferedImage scale(BufferedImage source, double xScale, double yScale) {
-       return scale(source, xScale, yScale, 0, 0);
-    }
-
-    /**
-     * Resize the given image
-     *
-     * @param source the image to be scaled
-     * @param xScale x scale
-     * @param yScale y scale
-     * @param rightMargin extra margin to add on the right
-     * @param bottomMargin extra margin to add on the bottom
-     * @return the scaled image
-     */
-    public static BufferedImage scale(BufferedImage source, double xScale, double yScale,
-            int rightMargin, int bottomMargin) {
-        int sourceWidth = source.getWidth();
-        int sourceHeight = source.getHeight();
-        int destWidth = Math.max(1, (int) (xScale * sourceWidth));
-        int destHeight = Math.max(1, (int) (yScale * sourceHeight));
-        int imageType = source.getType();
-        if (imageType == BufferedImage.TYPE_CUSTOM) {
-            imageType = BufferedImage.TYPE_INT_ARGB;
-        }
-        if (xScale > 0.5 && yScale > 0.5) {
-            BufferedImage scaled =
-                    new BufferedImage(destWidth + rightMargin, destHeight + bottomMargin, imageType);
-            Graphics2D g2 = scaled.createGraphics();
-            g2.setComposite(AlphaComposite.Src);
-            g2.setColor(new Color(0, true));
-            g2.fillRect(0, 0, destWidth + rightMargin, destHeight + bottomMargin);
-            g2.setRenderingHint(KEY_INTERPOLATION, VALUE_INTERPOLATION_BILINEAR);
-            g2.setRenderingHint(KEY_RENDERING, VALUE_RENDER_QUALITY);
-            g2.setRenderingHint(KEY_ANTIALIASING, VALUE_ANTIALIAS_ON);
-            g2.drawImage(source, 0, 0, destWidth, destHeight, 0, 0, sourceWidth, sourceHeight,
-                    null);
-            g2.dispose();
-            return scaled;
-        } else {
-            // When creating a thumbnail, using the above code doesn't work very well;
-            // you get some visible artifacts, especially for text. Instead use the
-            // technique of repeatedly scaling the image into half; this will cause
-            // proper averaging of neighboring pixels, and will typically (for the kinds
-            // of screen sizes used by this utility method in the layout editor) take
-            // about 3-4 iterations to get the result since we are logarithmically reducing
-            // the size. Besides, each successive pass in operating on much fewer pixels
-            // (a reduction of 4 in each pass).
-            //
-            // However, we may not be resizing to a size that can be reached exactly by
-            // successively diving in half. Therefore, once we're within a factor of 2 of
-            // the final size, we can do a resize to the exact target size.
-            // However, we can get even better results if we perform this final resize
-            // up front. Let's say we're going from width 1000 to a destination width of 85.
-            // The first approach would cause a resize from 1000 to 500 to 250 to 125, and
-            // then a resize from 125 to 85. That last resize can distort/blur a lot.
-            // Instead, we can start with the destination width, 85, and double it
-            // successfully until we're close to the initial size: 85, then 170,
-            // then 340, and finally 680. (The next one, 1360, is larger than 1000).
-            // So, now we *start* the thumbnail operation by resizing from width 1000 to
-            // width 680, which will preserve a lot of visual details such as text.
-            // Then we can successively resize the image in half, 680 to 340 to 170 to 85.
-            // We end up with the expected final size, but we've been doing an exact
-            // divide-in-half resizing operation at the end so there is less distortion.
-
-
-            int iterations = 0; // Number of halving operations to perform after the initial resize
-            int nearestWidth = destWidth; // Width closest to source width that = 2^x, x is integer
-            int nearestHeight = destHeight;
-            while (nearestWidth < sourceWidth / 2) {
-                nearestWidth *= 2;
-                nearestHeight *= 2;
-                iterations++;
-            }
-
-            // If we're supposed to add in margins, we need to do it in the initial resizing
-            // operation if we don't have any subsequent resizing operations.
-            if (iterations == 0) {
-                nearestWidth += rightMargin;
-                nearestHeight += bottomMargin;
-            }
-
-            BufferedImage scaled = new BufferedImage(nearestWidth, nearestHeight, imageType);
-            Graphics2D g2 = scaled.createGraphics();
-            g2.setRenderingHint(KEY_INTERPOLATION, VALUE_INTERPOLATION_BILINEAR);
-            g2.setRenderingHint(KEY_RENDERING, VALUE_RENDER_QUALITY);
-            g2.setRenderingHint(KEY_ANTIALIASING, VALUE_ANTIALIAS_ON);
-            g2.drawImage(source, 0, 0, nearestWidth, nearestHeight,
-                    0, 0, sourceWidth, sourceHeight, null);
-            g2.dispose();
-
-            sourceWidth = nearestWidth;
-            sourceHeight = nearestHeight;
-            source = scaled;
-
-            for (int iteration = iterations - 1; iteration >= 0; iteration--) {
-                int halfWidth = sourceWidth / 2;
-                int halfHeight = sourceHeight / 2;
-                if (iteration == 0) { // Last iteration: Add margins in final image
-                    scaled = new BufferedImage(halfWidth + rightMargin, halfHeight + bottomMargin,
-                            imageType);
-                } else {
-                    scaled = new BufferedImage(halfWidth, halfHeight, imageType);
-                }
-                g2 = scaled.createGraphics();
-                g2.setRenderingHint(KEY_INTERPOLATION,VALUE_INTERPOLATION_BILINEAR);
-                g2.setRenderingHint(KEY_RENDERING, VALUE_RENDER_QUALITY);
-                g2.setRenderingHint(KEY_ANTIALIASING, VALUE_ANTIALIAS_ON);
-                g2.drawImage(source, 0, 0,
-                        halfWidth, halfHeight, 0, 0,
-                        sourceWidth, sourceHeight,
-                        null);
-                g2.dispose();
-
-                sourceWidth = halfWidth;
-                sourceHeight = halfHeight;
-                source = scaled;
-                iterations--;
-            }
-            return scaled;
-        }
-    }
-
-    /**
-     * Returns true if the given file path points to an image file recognized by
-     * Android. See http://developer.android.com/guide/appendix/media-formats.html
-     * for details.
-     *
-     * @param path the filename to be tested
-     * @return true if the file represents an image file
-     */
-    public static boolean hasImageExtension(String path) {
-        return endsWithIgnoreCase(path, DOT_PNG)
-            || endsWithIgnoreCase(path, DOT_9PNG)
-            || endsWithIgnoreCase(path, DOT_GIF)
-            || endsWithIgnoreCase(path, DOT_JPG)
-            || endsWithIgnoreCase(path, DOT_BMP);
-    }
-
-    /**
-     * Creates a new image of the given size filled with the given color
-     *
-     * @param width the width of the image
-     * @param height the height of the image
-     * @param color the color of the image
-     * @return a new image of the given size filled with the given color
-     */
-    public static BufferedImage createColoredImage(int width, int height, RGB color) {
-        BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
-        Graphics g = image.getGraphics();
-        g.setColor(new Color(color.red, color.green, color.blue));
-        g.fillRect(0, 0, image.getWidth(), image.getHeight());
-        g.dispose();
-        return image;
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/IncludeFinder.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/IncludeFinder.java
deleted file mode 100644
index 7bab914..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/IncludeFinder.java
+++ /dev/null
@@ -1,1111 +0,0 @@
-/*
- * Copyright (C) 2010 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.editors.layout.gle2;
-
-import static com.android.SdkConstants.ATTR_LAYOUT;
-import static com.android.SdkConstants.EXT_XML;
-import static com.android.SdkConstants.FD_RESOURCES;
-import static com.android.SdkConstants.FD_RES_LAYOUT;
-import static com.android.SdkConstants.TOOLS_URI;
-import static com.android.SdkConstants.VIEW_FRAGMENT;
-import static com.android.SdkConstants.VIEW_INCLUDE;
-import static com.android.ide.eclipse.adt.AdtConstants.WS_LAYOUTS;
-import static com.android.ide.eclipse.adt.AdtConstants.WS_SEP;
-import static com.android.resources.ResourceType.LAYOUT;
-import static org.eclipse.core.resources.IResourceDelta.ADDED;
-import static org.eclipse.core.resources.IResourceDelta.CHANGED;
-import static org.eclipse.core.resources.IResourceDelta.CONTENT;
-import static org.eclipse.core.resources.IResourceDelta.REMOVED;
-
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-import com.android.annotations.VisibleForTesting;
-import com.android.ide.common.resources.ResourceFile;
-import com.android.ide.common.resources.ResourceFolder;
-import com.android.ide.common.resources.ResourceItem;
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.ide.eclipse.adt.internal.project.BaseProjectHelper;
-import com.android.ide.eclipse.adt.internal.resources.manager.ProjectResources;
-import com.android.ide.eclipse.adt.internal.resources.manager.ResourceManager;
-import com.android.ide.eclipse.adt.internal.resources.manager.ResourceManager.IResourceListener;
-import com.android.ide.eclipse.adt.io.IFileWrapper;
-import com.android.io.IAbstractFile;
-import com.android.resources.ResourceType;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.QualifiedName;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.wst.sse.core.StructuredModelManager;
-import org.eclipse.wst.sse.core.internal.provisional.IModelManager;
-import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
-import org.w3c.dom.Document;
-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.HashMap;
-import java.util.HashSet;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-/**
- * The include finder finds other XML files that are including a given XML file, and does
- * so efficiently (caching results across IDE sessions etc).
- */
-@SuppressWarnings("restriction") // XML model
-public class IncludeFinder {
-    /** Qualified name for the per-project persistent property include-map */
-    private final static QualifiedName CONFIG_INCLUDES = new QualifiedName(AdtPlugin.PLUGIN_ID,
-            "includes");//$NON-NLS-1$
-
-    /**
-     * Qualified name for the per-project non-persistent property storing the
-     * {@link IncludeFinder} for this project
-     */
-    private final static QualifiedName INCLUDE_FINDER = new QualifiedName(AdtPlugin.PLUGIN_ID,
-            "includefinder"); //$NON-NLS-1$
-
-    /** Project that the include finder locates includes for */
-    private final IProject mProject;
-
-    /** Map from a layout resource name to a set of layouts included by the given resource */
-    private Map<String, List<String>> mIncludes = null;
-
-    /**
-     * Reverse map of {@link #mIncludes}; points to other layouts that are including a
-     * given layouts
-     */
-    private Map<String, List<String>> mIncludedBy = null;
-
-    /** Flag set during a refresh; ignore updates when this is true */
-    private static boolean sRefreshing;
-
-    /** Global (cross-project) resource listener */
-    private static ResourceListener sListener;
-
-    /**
-     * Constructs an {@link IncludeFinder} for the given project. Don't use this method;
-     * use the {@link #get} factory method instead.
-     *
-     * @param project project to create an {@link IncludeFinder} for
-     */
-    private IncludeFinder(IProject project) {
-        mProject = project;
-    }
-
-    /**
-     * Returns the {@link IncludeFinder} for the given project
-     *
-     * @param project the project the finder is associated with
-     * @return an {@link IncludeFinder} for the given project, never null
-     */
-    @NonNull
-    public static IncludeFinder get(IProject project) {
-        IncludeFinder finder = null;
-        try {
-            finder = (IncludeFinder) project.getSessionProperty(INCLUDE_FINDER);
-        } catch (CoreException e) {
-            // Not a problem; we will just create a new one
-        }
-
-        if (finder == null) {
-            finder = new IncludeFinder(project);
-            try {
-                project.setSessionProperty(INCLUDE_FINDER, finder);
-            } catch (CoreException e) {
-                AdtPlugin.log(e, "Can't store IncludeFinder");
-            }
-        }
-
-        return finder;
-    }
-
-    /**
-     * Returns a list of resource names that are included by the given resource
-     *
-     * @param includer the resource name to return included layouts for
-     * @return the layouts included by the given resource
-     */
-    private List<String> getIncludesFrom(String includer) {
-        ensureInitialized();
-
-        return mIncludes.get(includer);
-    }
-
-    /**
-     * Gets the list of all other layouts that are including the given layout.
-     *
-     * @param included the file that is included
-     * @return the files that are including the given file, or null or empty
-     */
-    @Nullable
-    public List<Reference> getIncludedBy(IResource included) {
-        ensureInitialized();
-        String mapKey = getMapKey(included);
-        List<String> result = mIncludedBy.get(mapKey);
-        if (result == null) {
-            String name = getResourceName(included);
-            if (!name.equals(mapKey)) {
-                result = mIncludedBy.get(name);
-            }
-        }
-
-        if (result != null && result.size() > 0) {
-            List<Reference> references = new ArrayList<Reference>(result.size());
-            for (String s : result) {
-                references.add(new Reference(mProject, s));
-            }
-            return references;
-        } else {
-            return null;
-        }
-    }
-
-    /**
-     * Returns true if the given resource is included from some other layout in the
-     * project
-     *
-     * @param included the resource to check
-     * @return true if the file is included by some other layout
-     */
-    public boolean isIncluded(IResource included) {
-        ensureInitialized();
-        String mapKey = getMapKey(included);
-        List<String> result = mIncludedBy.get(mapKey);
-        if (result == null) {
-            String name = getResourceName(included);
-            if (!name.equals(mapKey)) {
-                result = mIncludedBy.get(name);
-            }
-        }
-
-        return result != null && result.size() > 0;
-    }
-
-    @VisibleForTesting
-    /* package */ List<String> getIncludedBy(String included) {
-        ensureInitialized();
-        return mIncludedBy.get(included);
-    }
-
-    /** Initialize the inclusion data structures, if not already done */
-    private void ensureInitialized() {
-        if (mIncludes == null) {
-            // Initialize
-            if (!readSettings()) {
-                // Couldn't read settings: probably the first time this code is running
-                // so there is no known data about includes.
-
-                // Yes, these should be multimaps! If we start using Guava replace
-                // these with multimaps.
-                mIncludes = new HashMap<String, List<String>>();
-                mIncludedBy = new HashMap<String, List<String>>();
-
-                scanProject();
-                saveSettings();
-            }
-        }
-    }
-
-    // ----- Persistence -----
-
-    /**
-     * Create a String serialization of the includes map. The map attempts to be compact;
-     * it strips out the @layout/ prefix, and eliminates the values for empty string
-     * values. The map can be restored by calling {@link #decodeMap}. The encoded String
-     * will have sorted keys.
-     *
-     * @param map the map to be serialized
-     * @return a serialization (never null) of the given map
-     */
-    @VisibleForTesting
-    public static String encodeMap(Map<String, List<String>> map) {
-        StringBuilder sb = new StringBuilder();
-
-        if (map != null) {
-            // Process the keys in sorted order rather than just
-            // iterating over the entry set to ensure stable output
-            List<String> keys = new ArrayList<String>(map.keySet());
-            Collections.sort(keys);
-            for (String key : keys) {
-                List<String> values = map.get(key);
-
-                if (sb.length() > 0) {
-                    sb.append(',');
-                }
-                sb.append(key);
-                if (values.size() > 0) {
-                    sb.append('=').append('>');
-                    sb.append('{');
-                    boolean first = true;
-                    for (String value : values) {
-                        if (first) {
-                            first = false;
-                        } else {
-                            sb.append(',');
-                        }
-                        sb.append(value);
-                    }
-                    sb.append('}');
-                }
-            }
-        }
-
-        return sb.toString();
-    }
-
-    /**
-     * Decodes the encoding (produced by {@link #encodeMap}) back into the original map,
-     * modulo any key sorting differences.
-     *
-     * @param encoded an encoding of a map created by {@link #encodeMap}
-     * @return a map corresponding to the encoded values, never null
-     */
-    @VisibleForTesting
-    public static Map<String, List<String>> decodeMap(String encoded) {
-        HashMap<String, List<String>> map = new HashMap<String, List<String>>();
-
-        if (encoded.length() > 0) {
-            int i = 0;
-            int end = encoded.length();
-
-            while (i < end) {
-
-                // Find key range
-                int keyBegin = i;
-                int keyEnd = i;
-                while (i < end) {
-                    char c = encoded.charAt(i);
-                    if (c == ',') {
-                        break;
-                    } else if (c == '=') {
-                        i += 2; // Skip =>
-                        break;
-                    }
-                    i++;
-                    keyEnd = i;
-                }
-
-                List<String> values = new ArrayList<String>();
-                // Find values
-                if (i < end && encoded.charAt(i) == '{') {
-                    i++;
-                    while (i < end) {
-                        int valueBegin = i;
-                        int valueEnd = i;
-                        char c = 0;
-                        while (i < end) {
-                            c = encoded.charAt(i);
-                            if (c == ',' || c == '}') {
-                                valueEnd = i;
-                                break;
-                            }
-                            i++;
-                        }
-                        if (valueEnd > valueBegin) {
-                            values.add(encoded.substring(valueBegin, valueEnd));
-                        }
-
-                        if (c == '}') {
-                            if (i < end-1 && encoded.charAt(i+1) == ',') {
-                                i++;
-                            }
-                            break;
-                        }
-                        assert c == ',';
-                        i++;
-                    }
-                }
-
-                String key = encoded.substring(keyBegin, keyEnd);
-                map.put(key, values);
-                i++;
-            }
-        }
-
-        return map;
-    }
-
-    /**
-     * Stores the settings in the persistent project storage.
-     */
-    private void saveSettings() {
-        // Serialize the mIncludes map into a compact String. The mIncludedBy map can be
-        // inferred from it.
-        String encoded = encodeMap(mIncludes);
-
-        try {
-            if (encoded.length() >= 2048) {
-                // The maximum length of a setting key is 2KB, according to the javadoc
-                // for the project class. It's unlikely that we'll
-                // hit this -- even with an average layout root name of 20 characters
-                // we can still store over a hundred names. But JUST IN CASE we run
-                // into this, we'll clear out the key in this name which means that the
-                // information will need to be recomputed in the next IDE session.
-                mProject.setPersistentProperty(CONFIG_INCLUDES, null);
-            } else {
-                String existing = mProject.getPersistentProperty(CONFIG_INCLUDES);
-                if (!encoded.equals(existing)) {
-                    mProject.setPersistentProperty(CONFIG_INCLUDES, encoded);
-                }
-            }
-        } catch (CoreException e) {
-            AdtPlugin.log(e, "Can't store include settings");
-        }
-    }
-
-    /**
-     * Reads previously stored settings from the persistent project storage
-     *
-     * @return true iff settings were restored from the project
-     */
-    private boolean readSettings() {
-        try {
-            String encoded = mProject.getPersistentProperty(CONFIG_INCLUDES);
-            if (encoded != null) {
-                mIncludes = decodeMap(encoded);
-
-                // Set up a reverse map, pointing from included files to the files that
-                // included them
-                mIncludedBy = new HashMap<String, List<String>>(2 * mIncludes.size());
-                for (Map.Entry<String, List<String>> entry : mIncludes.entrySet()) {
-                    // File containing the <include>
-                    String includer = entry.getKey();
-                    // Files being <include>'ed by the above file
-                    List<String> included = entry.getValue();
-                    setIncludedBy(includer, included);
-                }
-
-                return true;
-            }
-        } catch (CoreException e) {
-            AdtPlugin.log(e, "Can't read include settings");
-        }
-
-        return false;
-    }
-
-    // ----- File scanning -----
-
-    /**
-     * Scan the whole project for XML layout resources that are performing includes.
-     */
-    private void scanProject() {
-        ProjectResources resources = ResourceManager.getInstance().getProjectResources(mProject);
-        if (resources != null) {
-            Collection<ResourceItem> layouts = resources.getResourceItemsOfType(LAYOUT);
-            for (ResourceItem layout : layouts) {
-                List<ResourceFile> sources = layout.getSourceFileList();
-                for (ResourceFile source : sources) {
-                    updateFileIncludes(source, false);
-                }
-            }
-
-            return;
-        }
-    }
-
-    /**
-     * Scans the given {@link ResourceFile} and if it is a layout resource, updates the
-     * includes in it.
-     *
-     * @param resourceFile the {@link ResourceFile} to be scanned for includes (doesn't
-     *            have to be only layout XML files; this method will filter the type)
-     * @param singleUpdate true if this is a single file being updated, false otherwise
-     *            (e.g. during initial project scanning)
-     * @return true if we updated the includes for the resource file
-     */
-    private boolean updateFileIncludes(ResourceFile resourceFile, boolean singleUpdate) {
-        Collection<ResourceType> resourceTypes = resourceFile.getResourceTypes();
-        for (ResourceType type : resourceTypes) {
-            if (type == ResourceType.LAYOUT) {
-                ensureInitialized();
-
-                List<String> includes = Collections.emptyList();
-                if (resourceFile.getFile() instanceof IFileWrapper) {
-                    IFile file = ((IFileWrapper) resourceFile.getFile()).getIFile();
-
-                    // See if we have an existing XML model for this file; if so, we can
-                    // just look directly at the parse tree
-                    boolean hadXmlModel = false;
-                    IStructuredModel model = null;
-                    try {
-                        IModelManager modelManager = StructuredModelManager.getModelManager();
-                        model = modelManager.getExistingModelForRead(file);
-                        if (model instanceof IDOMModel) {
-                            IDOMModel domModel = (IDOMModel) model;
-                            Document document = domModel.getDocument();
-                            includes = findIncludesInDocument(document);
-                            hadXmlModel = true;
-                        }
-                    } finally {
-                        if (model != null) {
-                            model.releaseFromRead();
-                        }
-                    }
-
-                    // If no XML model we have to read the XML contents and (possibly) parse it.
-                    // The actual file may not exist anymore (e.g. when deleting a layout file
-                    // or when the workspace is out of sync.)
-                    if (!hadXmlModel) {
-                        String xml = AdtPlugin.readFile(file);
-                        if (xml != null) {
-                            includes = findIncludes(xml);
-                        }
-                    }
-                } else {
-                    String xml = AdtPlugin.readFile(resourceFile);
-                    if (xml != null) {
-                        includes = findIncludes(xml);
-                    }
-                }
-
-                String key = getMapKey(resourceFile);
-                if (includes.equals(getIncludesFrom(key))) {
-                    // Common case -- so avoid doing settings flush etc
-                    return false;
-                }
-
-                boolean detectCycles = singleUpdate;
-                setIncluded(key, includes, detectCycles);
-
-                if (singleUpdate) {
-                    saveSettings();
-                }
-
-                return true;
-            }
-        }
-
-        return false;
-    }
-
-    /**
-     * Finds the list of includes in the given XML content. It attempts quickly return
-     * empty if the file does not include any include tags; it does this by only parsing
-     * if it detects the string &lt;include in the file.
-     */
-    @VisibleForTesting
-    @NonNull
-    static List<String> findIncludes(@NonNull String xml) {
-        int index = xml.indexOf(ATTR_LAYOUT);
-        if (index != -1) {
-            return findIncludesInXml(xml);
-        }
-
-        return Collections.emptyList();
-    }
-
-    /**
-     * Parses the given XML content and extracts all the included URLs and returns them
-     *
-     * @param xml layout XML content to be parsed for includes
-     * @return a list of included urls, or null
-     */
-    @VisibleForTesting
-    @NonNull
-    static List<String> findIncludesInXml(@NonNull String xml) {
-        Document document = DomUtilities.parseDocument(xml, false /*logParserErrors*/);
-        if (document != null) {
-            return findIncludesInDocument(document);
-        }
-
-        return Collections.emptyList();
-    }
-
-    /** Searches the given DOM document and returns the list of includes, if any */
-    @NonNull
-    private static List<String> findIncludesInDocument(@NonNull Document document) {
-        List<String> includes = findIncludesInDocument(document, null);
-        if (includes == null) {
-            includes = Collections.emptyList();
-        }
-        return includes;
-    }
-
-    @Nullable
-    private static List<String> findIncludesInDocument(@NonNull Node node,
-            @Nullable List<String> urls) {
-        if (node.getNodeType() == Node.ELEMENT_NODE) {
-            String tag = node.getNodeName();
-            boolean isInclude = tag.equals(VIEW_INCLUDE);
-            boolean isFragment = tag.equals(VIEW_FRAGMENT);
-            if (isInclude || isFragment) {
-                Element element = (Element) node;
-                String url;
-                if (isInclude) {
-                    url = element.getAttribute(ATTR_LAYOUT);
-                } else {
-                    url = element.getAttributeNS(TOOLS_URI, ATTR_LAYOUT);
-                }
-                if (url.length() > 0) {
-                    String resourceName = urlToLocalResource(url);
-                    if (resourceName != null) {
-                        if (urls == null) {
-                            urls = new ArrayList<String>();
-                        }
-                        urls.add(resourceName);
-                    }
-                }
-
-            }
-        }
-
-        NodeList children = node.getChildNodes();
-        for (int i = 0, n = children.getLength(); i < n; i++) {
-            urls = findIncludesInDocument(children.item(i), urls);
-        }
-
-        return urls;
-    }
-
-
-    /**
-     * Returns the layout URL to a local resource name (provided the URL is a local
-     * resource, not something in @android etc.) Returns null otherwise.
-     */
-    private static String urlToLocalResource(String url) {
-        if (!url.startsWith("@")) { //$NON-NLS-1$
-            return null;
-        }
-        int typeEnd = url.indexOf('/', 1);
-        if (typeEnd == -1) {
-            return null;
-        }
-        int nameBegin = typeEnd + 1;
-        int typeBegin = 1;
-        int colon = url.lastIndexOf(':', typeEnd);
-        if (colon != -1) {
-            String packageName = url.substring(typeBegin, colon);
-            if ("android".equals(packageName)) { //$NON-NLS-1$
-                // Don't want to point to non-local resources
-                return null;
-            }
-
-            typeBegin = colon + 1;
-            assert "layout".equals(url.substring(typeBegin, typeEnd)); //$NON-NLS-1$
-        }
-
-        return url.substring(nameBegin);
-    }
-
-    /**
-     * Record the list of included layouts from the given layout
-     *
-     * @param includer the layout including other layouts
-     * @param included the layouts that were included by the including layout
-     * @param detectCycles if true, check for cycles and report them as project errors
-     */
-    @VisibleForTesting
-    /* package */ void setIncluded(String includer, List<String> included, boolean detectCycles) {
-        // Remove previously linked inverse mappings
-        List<String> oldIncludes = mIncludes.get(includer);
-        if (oldIncludes != null && oldIncludes.size() > 0) {
-            for (String includee : oldIncludes) {
-                List<String> includers = mIncludedBy.get(includee);
-                if (includers != null) {
-                    includers.remove(includer);
-                }
-            }
-        }
-
-        mIncludes.put(includer, included);
-        // Reverse mapping: for included items, point back to including file
-        setIncludedBy(includer, included);
-
-        if (detectCycles) {
-            detectCycles(includer);
-        }
-    }
-
-    /** Record the list of included layouts from the given layout */
-    private void setIncludedBy(String includer, List<String> included) {
-        for (String target : included) {
-            List<String> list = mIncludedBy.get(target);
-            if (list == null) {
-                list = new ArrayList<String>(2); // We don't expect many includes
-                mIncludedBy.put(target, list);
-            }
-            if (!list.contains(includer)) {
-                list.add(includer);
-            }
-        }
-    }
-
-    /** Start listening on project resources */
-    public static void start() {
-        assert sListener == null;
-        sListener = new ResourceListener();
-        ResourceManager.getInstance().addListener(sListener);
-    }
-
-    /** Stop listening on project resources */
-    public static void stop() {
-        assert sListener != null;
-        ResourceManager.getInstance().addListener(sListener);
-    }
-
-    private static String getMapKey(ResourceFile resourceFile) {
-        IAbstractFile file = resourceFile.getFile();
-        String name = file.getName();
-        String folderName = file.getParentFolder().getName();
-        return getMapKey(folderName, name);
-    }
-
-    private static String getMapKey(IResource resourceFile) {
-        String folderName = resourceFile.getParent().getName();
-        String name = resourceFile.getName();
-        return getMapKey(folderName, name);
-    }
-
-    private static String getResourceName(IResource resourceFile) {
-        String name = resourceFile.getName();
-        int baseEnd = name.length() - EXT_XML.length() - 1; // -1: the dot
-        if (baseEnd > 0) {
-            name = name.substring(0, baseEnd);
-        }
-
-        return name;
-    }
-
-    private static String getMapKey(String folderName, String name) {
-        int baseEnd = name.length() - EXT_XML.length() - 1; // -1: the dot
-        if (baseEnd > 0) {
-            name = name.substring(0, baseEnd);
-        }
-
-        // Create a map key for the given resource file
-        // This will map
-        //     /res/layout/foo.xml => "foo"
-        //     /res/layout-land/foo.xml => "-land/foo"
-
-        if (FD_RES_LAYOUT.equals(folderName)) {
-            // Normal case -- keep just the basename
-            return name;
-        } else {
-            // Store the relative path from res/ on down, so
-            // /res/layout-land/foo.xml becomes "layout-land/foo"
-            //if (folderName.startsWith(FD_LAYOUT)) {
-            //    folderName = folderName.substring(FD_LAYOUT.length());
-            //}
-
-            return folderName + WS_SEP + name;
-        }
-    }
-
-    /** Listener of resource file saves, used to update layout inclusion data structures */
-    private static class ResourceListener implements IResourceListener {
-        @Override
-        public void fileChanged(IProject project, ResourceFile file, int eventType) {
-            if (sRefreshing) {
-                return;
-            }
-
-            if ((eventType & (CHANGED | ADDED | REMOVED | CONTENT)) == 0) {
-                return;
-            }
-
-            IncludeFinder finder = get(project);
-            if (finder != null) {
-                if (finder.updateFileIncludes(file, true)) {
-                    finder.saveSettings();
-                }
-            }
-        }
-
-        @Override
-        public void folderChanged(IProject project, ResourceFolder folder, int eventType) {
-            // We only care about layout resource files
-        }
-    }
-
-    // ----- Cycle detection -----
-
-    private void detectCycles(String from) {
-        // Perform DFS on the include graph and look for a cycle; if we find one, produce
-        // a chain of includes on the way back to show to the user
-        if (mIncludes.size() > 0) {
-            Set<String> visiting = new HashSet<String>(mIncludes.size());
-            String chain = dfs(from, visiting);
-            if (chain != null) {
-                addError(from, chain);
-            } else {
-                // Is there an existing error for us to clean up?
-                removeErrors(from);
-            }
-        }
-    }
-
-    /** Format to chain include cycles in: a=>b=>c=>d etc */
-    private final String CHAIN_FORMAT = "%1$s=>%2$s"; //$NON-NLS-1$
-
-    private String dfs(String from, Set<String> visiting) {
-        visiting.add(from);
-
-        List<String> includes = mIncludes.get(from);
-        if (includes != null && includes.size() > 0) {
-            for (String include : includes) {
-                if (visiting.contains(include)) {
-                    return String.format(CHAIN_FORMAT, from, include);
-                }
-                String chain = dfs(include, visiting);
-                if (chain != null) {
-                    return String.format(CHAIN_FORMAT, from, chain);
-                }
-            }
-        }
-
-        visiting.remove(from);
-
-        return null;
-    }
-
-    private void removeErrors(String from) {
-        final IResource resource = findResource(from);
-        if (resource != null) {
-            try {
-                final String markerId = IMarker.PROBLEM;
-
-                IMarker[] markers = resource.findMarkers(markerId, true, IResource.DEPTH_ZERO);
-
-                for (final IMarker marker : markers) {
-                    String tmpMsg = marker.getAttribute(IMarker.MESSAGE, null);
-                    if (tmpMsg == null || tmpMsg.startsWith(MESSAGE)) {
-                        // Remove
-                        runLater(new Runnable() {
-                            @Override
-                            public void run() {
-                                try {
-                                    sRefreshing = true;
-                                    marker.delete();
-                                } catch (CoreException e) {
-                                    AdtPlugin.log(e, "Can't delete problem marker");
-                                } finally {
-                                    sRefreshing = false;
-                                }
-                            }
-                        });
-                    }
-                }
-            } catch (CoreException e) {
-                // if we couldn't get the markers, then we just mark the file again
-                // (since markerAlreadyExists is initialized to false, we do nothing)
-            }
-        }
-    }
-
-    /** Error message for cycles */
-    private static final String MESSAGE = "Found cyclical <include> chain";
-
-    private void addError(String from, String chain) {
-        final IResource resource = findResource(from);
-        if (resource != null) {
-            final String markerId = IMarker.PROBLEM;
-            final String message = String.format("%1$s: %2$s", MESSAGE, chain);
-            final int lineNumber = 1;
-            final int severity = IMarker.SEVERITY_ERROR;
-
-            // check if there's a similar marker already, since aapt is launched twice
-            boolean markerAlreadyExists = false;
-            try {
-                IMarker[] markers = resource.findMarkers(markerId, true, IResource.DEPTH_ZERO);
-
-                for (IMarker marker : markers) {
-                    int tmpLine = marker.getAttribute(IMarker.LINE_NUMBER, -1);
-                    if (tmpLine != lineNumber) {
-                        break;
-                    }
-
-                    int tmpSeverity = marker.getAttribute(IMarker.SEVERITY, -1);
-                    if (tmpSeverity != severity) {
-                        break;
-                    }
-
-                    String tmpMsg = marker.getAttribute(IMarker.MESSAGE, null);
-                    if (tmpMsg == null || tmpMsg.equals(message) == false) {
-                        break;
-                    }
-
-                    // if we're here, all the marker attributes are equals, we found it
-                    // and exit
-                    markerAlreadyExists = true;
-                    break;
-                }
-
-            } catch (CoreException e) {
-                // if we couldn't get the markers, then we just mark the file again
-                // (since markerAlreadyExists is initialized to false, we do nothing)
-            }
-
-            if (!markerAlreadyExists) {
-                runLater(new Runnable() {
-                    @Override
-                    public void run() {
-                        try {
-                            sRefreshing = true;
-
-                            // Adding a resource will force a refresh on the file;
-                            // ignore these updates
-                            BaseProjectHelper.markResource(resource, markerId, message, lineNumber,
-                                    severity);
-                        } finally {
-                            sRefreshing = false;
-                        }
-                    }
-                });
-            }
-        }
-    }
-
-    // FIXME: Find more standard Eclipse way to do this.
-    // We need to run marker registration/deletion "later", because when the include
-    // scanning is running it's in the middle of resource notification, so the IDE
-    // throws an exception
-    private static void runLater(Runnable runnable) {
-        Display display = Display.findDisplay(Thread.currentThread());
-        if (display != null) {
-            display.asyncExec(runnable);
-        } else {
-            AdtPlugin.log(IStatus.WARNING, "Could not find display");
-        }
-    }
-
-    /**
-     * Finds the project resource for the given layout path
-     *
-     * @param from the resource name
-     * @return the {@link IResource}, or null if not found
-     */
-    private IResource findResource(String from) {
-        final IResource resource = mProject.findMember(WS_LAYOUTS + WS_SEP + from + '.' + EXT_XML);
-        return resource;
-    }
-
-    /**
-     * Creates a blank, project-less {@link IncludeFinder} <b>for use by unit tests
-     * only</b>
-     */
-    @VisibleForTesting
-    /* package */ static IncludeFinder create() {
-        IncludeFinder finder = new IncludeFinder(null);
-        finder.mIncludes = new HashMap<String, List<String>>();
-        finder.mIncludedBy = new HashMap<String, List<String>>();
-        return finder;
-    }
-
-    /** A reference to a particular file in the project */
-    public static class Reference {
-        /** The unique id referencing the file, such as (for res/layout-land/main.xml)
-         * "layout-land/main") */
-        private final String mId;
-
-        /** The project containing the file */
-        private final IProject mProject;
-
-        /** The resource name of the file, such as (for res/layout/main.xml) "main" */
-        private String mName;
-
-        /** Creates a new include reference */
-        private Reference(IProject project, String id) {
-            super();
-            mProject = project;
-            mId = id;
-        }
-
-        /**
-         * Returns the id identifying the given file within the project
-         *
-         * @return the id identifying the given file within the project
-         */
-        public String getId() {
-            return mId;
-        }
-
-        /**
-         * Returns the {@link IFile} in the project for the given file. May return null if
-         * there is an error in locating the file or if the file no longer exists.
-         *
-         * @return the project file, or null
-         */
-        public IFile getFile() {
-            String reference = mId;
-            if (!reference.contains(WS_SEP)) {
-                reference = FD_RES_LAYOUT + WS_SEP + reference;
-            }
-
-            String projectPath = FD_RESOURCES + WS_SEP + reference + '.' + EXT_XML;
-            IResource member = mProject.findMember(projectPath);
-            if (member instanceof IFile) {
-                return (IFile) member;
-            }
-
-            return null;
-        }
-
-        /**
-         * Returns a description of this reference, suitable to be shown to the user
-         *
-         * @return a display name for the reference
-         */
-        public String getDisplayName() {
-            // The ID is deliberately kept in a pretty user-readable format but we could
-            // consider prepending layout/ on ids that don't have it (to make the display
-            // more uniform) or ripping out all layout[-constraint] prefixes out and
-            // instead prepending @ etc.
-            return mId;
-        }
-
-        /**
-         * Returns the name of the reference, suitable for resource lookup. For example,
-         * for "res/layout/main.xml", as well as for "res/layout-land/main.xml", this
-         * would be "main".
-         *
-         * @return the resource name of the reference
-         */
-        public String getName() {
-            if (mName == null) {
-                mName = mId;
-                int index = mName.lastIndexOf(WS_SEP);
-                if (index != -1) {
-                    mName = mName.substring(index + 1);
-                }
-            }
-
-            return mName;
-        }
-
-        @Override
-        public int hashCode() {
-            final int prime = 31;
-            int result = 1;
-            result = prime * result + ((mId == null) ? 0 : mId.hashCode());
-            return result;
-        }
-
-        @Override
-        public boolean equals(Object obj) {
-            if (this == obj)
-                return true;
-            if (obj == null)
-                return false;
-            if (getClass() != obj.getClass())
-                return false;
-            Reference other = (Reference) obj;
-            if (mId == null) {
-                if (other.mId != null)
-                    return false;
-            } else if (!mId.equals(other.mId))
-                return false;
-            return true;
-        }
-
-        @Override
-        public String toString() {
-            return "Reference [getId()=" + getId() //$NON-NLS-1$
-                    + ", getDisplayName()=" + getDisplayName() //$NON-NLS-1$
-                    + ", getName()=" + getName() //$NON-NLS-1$
-                    + ", getFile()=" + getFile() + "]"; //$NON-NLS-1$
-        }
-
-        /**
-         * Creates a reference to the given file
-         *
-         * @param file the file to create a reference for
-         * @return a reference to the given file
-         */
-        public static Reference create(IFile file) {
-            return new Reference(file.getProject(), getMapKey(file));
-        }
-
-        /**
-         * Returns the resource name of this layout, such as {@code @layout/foo}.
-         *
-         * @return the resource name
-         */
-        public String getResourceName() {
-            return '@' + FD_RES_LAYOUT + '/' + getName();
-        }
-    }
-
-    /**
-     * Returns a collection of layouts (expressed as resource names, such as
-     * {@code @layout/foo} which would be invalid includes in the given layout
-     * (because it would introduce a cycle)
-     *
-     * @param layout the layout file to check for cyclic dependencies from
-     * @return a collection of layout resources which cannot be included from
-     *         the given layout, never null
-     */
-    public Collection<String> getInvalidIncludes(IFile layout) {
-        IProject project = layout.getProject();
-        Reference self = Reference.create(layout);
-
-        // Add anyone who transitively can reach this file via includes.
-        LinkedList<Reference> queue = new LinkedList<Reference>();
-        List<Reference> invalid = new ArrayList<Reference>();
-        queue.add(self);
-        invalid.add(self);
-        Set<String> seen = new HashSet<String>();
-        seen.add(self.getId());
-        while (!queue.isEmpty()) {
-            Reference reference = queue.removeFirst();
-            String refId = reference.getId();
-
-            // Look up both configuration specific includes as well as includes in the
-            // base versions
-            List<String> included = getIncludedBy(refId);
-            if (refId.indexOf('/') != -1) {
-                List<String> baseIncluded = getIncludedBy(reference.getName());
-                if (included == null) {
-                    included = baseIncluded;
-                } else if (baseIncluded != null) {
-                    included = new ArrayList<String>(included);
-                    included.addAll(baseIncluded);
-                }
-            }
-
-            if (included != null && included.size() > 0) {
-                for (String id : included) {
-                    if (!seen.contains(id)) {
-                        seen.add(id);
-                        Reference ref = new Reference(project, id);
-                        invalid.add(ref);
-                        queue.addLast(ref);
-                    }
-                }
-            }
-        }
-
-        List<String> result = new ArrayList<String>();
-        for (Reference reference : invalid) {
-            result.add(reference.getResourceName());
-        }
-
-        return result;
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/IncludeOverlay.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/IncludeOverlay.java
deleted file mode 100644
index 81c03ed..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/IncludeOverlay.java
+++ /dev/null
@@ -1,150 +0,0 @@
-/*
- * Copyright (C) 2010 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.editors.layout.gle2;
-
-import com.android.annotations.VisibleForTesting;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.GC;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.graphics.Rectangle;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
-
-/**
- * The {@link IncludeOverlay} class renders masks to -partially- hide everything outside
- * an included file's own content. This overlay is in use when you are editing an included
- * file shown within a different file's context (e.g. "Show In > other").
- */
-public class IncludeOverlay extends Overlay {
-    /** Mask transparency - 0 is transparent, 255 is opaque */
-    private static final int MASK_TRANSPARENCY = 160;
-
-    /** The associated {@link LayoutCanvas}. */
-    private LayoutCanvas mCanvas;
-
-    /**
-     * Constructs an {@link IncludeOverlay} tied to the given canvas.
-     *
-     * @param canvas The {@link LayoutCanvas} to paint the overlay over.
-     */
-    public IncludeOverlay(LayoutCanvas canvas) {
-        mCanvas = canvas;
-    }
-
-    @Override
-    public void paint(GC gc) {
-        ViewHierarchy viewHierarchy = mCanvas.getViewHierarchy();
-        List<Rectangle> includedBounds = viewHierarchy.getIncludedBounds();
-        if (includedBounds == null || includedBounds.size() == 0) {
-            // We don't support multiple included children yet. When that works,
-            // this code should use a BSP tree to figure out which regions to paint
-            // to leave holes in the mask.
-            return;
-        }
-
-        Image image = mCanvas.getImageOverlay().getImage();
-        if (image == null) {
-            return;
-        }
-
-        int oldAlpha = gc.getAlpha();
-        gc.setAlpha(MASK_TRANSPARENCY);
-        Color bg = gc.getDevice().getSystemColor(SWT.COLOR_WIDGET_BACKGROUND);
-        gc.setBackground(bg);
-
-        CanvasViewInfo root = viewHierarchy.getRoot();
-        Rectangle whole = root.getAbsRect();
-        whole = new Rectangle(whole.x, whole.y, whole.width + 1, whole.height + 1);
-        Collection<Rectangle> masks = subtractRectangles(whole, includedBounds);
-
-        for (Rectangle mask : masks) {
-            ControlPoint topLeft = LayoutPoint.create(mCanvas, mask.x, mask.y).toControl();
-            ControlPoint bottomRight = LayoutPoint.create(mCanvas, mask.x + mask.width,
-                    mask.y + mask.height).toControl();
-            int x1 = topLeft.x;
-            int y1 = topLeft.y;
-            int x2 = bottomRight.x;
-            int y2 = bottomRight.y;
-
-            gc.fillRectangle(x1, y1, x2 - x1, y2 - y1);
-        }
-
-        gc.setAlpha(oldAlpha);
-    }
-
-    /**
-     * Given a Rectangle, remove holes from it (specified as a collection of Rectangles) such
-     * that the result is a list of rectangles that cover everything that is not a hole.
-     *
-     * @param rectangle the rectangle to subtract from
-     * @param holes the holes to subtract from the rectangle
-     * @return a list of sub rectangles that remain after subtracting out the given list of holes
-     */
-    @VisibleForTesting
-    static Collection<Rectangle> subtractRectangles(
-            Rectangle rectangle, Collection<Rectangle> holes) {
-        List<Rectangle> result = new ArrayList<Rectangle>();
-        result.add(rectangle);
-
-        for (Rectangle hole : holes) {
-            List<Rectangle> tempResult = new ArrayList<Rectangle>();
-            for (Rectangle r : result) {
-                if (hole.intersects(r)) {
-                    // Clip the hole to fit the rectangle bounds
-                    Rectangle h = hole.intersection(r);
-
-                    // Split the rectangle
-
-                    // Above (includes the NW and NE corners)
-                    if (h.y > r.y) {
-                        tempResult.add(new Rectangle(r.x, r.y, r.width, h.y - r.y));
-                    }
-
-                    // Left (not including corners)
-                    if (h.x > r.x) {
-                        tempResult.add(new Rectangle(r.x, h.y, h.x - r.x, h.height));
-                    }
-
-                    int hx2 = h.x + h.width;
-                    int hy2 = h.y + h.height;
-                    int rx2 = r.x + r.width;
-                    int ry2 = r.y + r.height;
-
-                    // Below (includes the SW and SE corners)
-                    if (hy2 < ry2) {
-                        tempResult.add(new Rectangle(r.x, hy2, r.width, ry2 - hy2));
-                    }
-
-                    // Right (not including corners)
-                    if (hx2 < rx2) {
-                        tempResult.add(new Rectangle(hx2, h.y, rx2 - hx2, h.height));
-                    }
-                } else {
-                    tempResult.add(r);
-                }
-            }
-
-            result = tempResult;
-        }
-
-        return result;
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/LayoutActionBar.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/LayoutActionBar.java
deleted file mode 100644
index 1b1bd23..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/LayoutActionBar.java
+++ /dev/null
@@ -1,732 +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.eclipse.adt.internal.editors.layout.gle2;
-
-import static com.android.SdkConstants.ANDROID_URI;
-import static com.android.SdkConstants.ATTR_ID;
-
-import com.android.annotations.NonNull;
-import com.android.ide.common.api.INode;
-import com.android.ide.common.api.RuleAction;
-import com.android.ide.common.api.RuleAction.Choices;
-import com.android.ide.common.api.RuleAction.Separator;
-import com.android.ide.common.api.RuleAction.Toggle;
-import com.android.ide.common.layout.BaseViewRule;
-import com.android.ide.eclipse.adt.internal.editors.IconFactory;
-import com.android.ide.eclipse.adt.internal.editors.common.CommonXmlEditor;
-import com.android.ide.eclipse.adt.internal.editors.layout.configuration.Configuration;
-import com.android.ide.eclipse.adt.internal.editors.layout.configuration.ConfigurationChooser;
-import com.android.ide.eclipse.adt.internal.editors.layout.gre.NodeProxy;
-import com.android.ide.eclipse.adt.internal.editors.layout.gre.RulesEngine;
-import com.android.ide.eclipse.adt.internal.lint.EclipseLintClient;
-import com.android.ide.eclipse.adt.internal.preferences.AdtPrefs;
-import com.android.sdklib.devices.Device;
-import com.android.sdklib.devices.Screen;
-import com.android.sdkuilib.internal.widgets.ResolutionChooserDialog;
-import com.google.common.base.Strings;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.jface.window.Window;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.graphics.Rectangle;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.Listener;
-import org.eclipse.swt.widgets.Menu;
-import org.eclipse.swt.widgets.MenuItem;
-import org.eclipse.swt.widgets.ToolBar;
-import org.eclipse.swt.widgets.ToolItem;
-import org.eclipse.ui.ISharedImages;
-import org.eclipse.ui.PlatformUI;
-
-import java.net.URL;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
-/**
- * Toolbar shown at the top of the layout editor, which adds a number of context-sensitive
- * layout actions (as well as zooming controls on the right).
- */
-public class LayoutActionBar extends Composite {
-    private GraphicalEditorPart mEditor;
-    private ToolBar mLayoutToolBar;
-    private ToolBar mLintToolBar;
-    private ToolBar mZoomToolBar;
-    private ToolItem mZoomRealSizeButton;
-    private ToolItem mZoomOutButton;
-    private ToolItem mZoomResetButton;
-    private ToolItem mZoomInButton;
-    private ToolItem mZoomFitButton;
-    private ToolItem mLintButton;
-    private List<RuleAction> mPrevActions;
-
-    /**
-     * Creates a new {@link LayoutActionBar} and adds it to the given parent.
-     *
-     * @param parent the parent composite to add the actions bar to
-     * @param style the SWT style to apply
-     * @param editor the associated layout editor
-     */
-    public LayoutActionBar(Composite parent, int style, GraphicalEditorPart editor) {
-        super(parent, style | SWT.NO_FOCUS);
-        mEditor = editor;
-
-        GridLayout layout = new GridLayout(3, false);
-        setLayout(layout);
-
-        mLayoutToolBar = new ToolBar(this, /*SWT.WRAP |*/ SWT.FLAT | SWT.RIGHT | SWT.HORIZONTAL);
-        mLayoutToolBar.setLayoutData(new GridData(SWT.FILL, SWT.BEGINNING, true, false));
-        mZoomToolBar = createZoomControls();
-        mZoomToolBar.setLayoutData(new GridData(SWT.END, SWT.BEGINNING, false, false));
-        mLintToolBar = createLintControls();
-
-        GridData lintData = new GridData(SWT.END, SWT.BEGINNING, false, false);
-        lintData.exclude = true;
-        mLintToolBar.setLayoutData(lintData);
-    }
-
-    @Override
-    public void dispose() {
-        super.dispose();
-        mPrevActions = null;
-    }
-
-    /** Updates the layout contents based on the current selection */
-    void updateSelection() {
-        NodeProxy parent = null;
-        LayoutCanvas canvas = mEditor.getCanvasControl();
-        SelectionManager selectionManager = canvas.getSelectionManager();
-        List<SelectionItem> selections = selectionManager.getSelections();
-        if (selections.size() > 0) {
-            // TODO: better handle multi-selection -- maybe we should disable it or
-            // something.
-            // What if you select children with different parents? Of different types?
-            // etc.
-            NodeProxy node = selections.get(0).getNode();
-            if (node != null && node.getParent() != null) {
-                parent = (NodeProxy) node.getParent();
-            }
-        }
-
-        if (parent == null) {
-            // Show the background's properties
-            CanvasViewInfo root = canvas.getViewHierarchy().getRoot();
-            if (root == null) {
-                return;
-            }
-            parent = canvas.getNodeFactory().create(root);
-            selections = Collections.emptyList();
-        }
-
-        RulesEngine engine = mEditor.getRulesEngine();
-        List<NodeProxy> selectedNodes = new ArrayList<NodeProxy>();
-        for (SelectionItem item : selections) {
-            selectedNodes.add(item.getNode());
-        }
-        List<RuleAction> actions = new ArrayList<RuleAction>();
-        engine.callAddLayoutActions(actions, parent, selectedNodes);
-
-        // Place actions in the correct order (the actions may come from different
-        // rules and should be merged properly via sorting keys)
-        Collections.sort(actions);
-
-        // Add in actions for the child as well, if there is exactly one.
-        // These are not merged into the parent list of actions; they are appended
-        // at the end.
-        int index = -1;
-        String label = null;
-        if (selectedNodes.size() == 1) {
-            List<RuleAction> itemActions = new ArrayList<RuleAction>();
-            NodeProxy selectedNode = selectedNodes.get(0);
-            engine.callAddLayoutActions(itemActions, selectedNode, null);
-            if (itemActions.size() > 0) {
-                Collections.sort(itemActions);
-
-                if (!(itemActions.get(0) instanceof RuleAction.Separator)) {
-                    actions.add(RuleAction.createSeparator(0));
-                }
-                label = selectedNode.getStringAttr(ANDROID_URI, ATTR_ID);
-                if (label != null) {
-                    label = BaseViewRule.stripIdPrefix(label);
-                    index = actions.size();
-                }
-                actions.addAll(itemActions);
-            }
-        }
-
-        if (!updateActions(actions)) {
-            updateToolbar(actions, index, label);
-        }
-        mPrevActions = actions;
-    }
-
-    /** Update the toolbar widgets */
-    private void updateToolbar(final List<RuleAction> actions, final int labelIndex,
-            final String label) {
-        if (mLayoutToolBar == null || mLayoutToolBar.isDisposed()) {
-            return;
-        }
-        for (ToolItem c : mLayoutToolBar.getItems()) {
-            c.dispose();
-        }
-        mLayoutToolBar.pack();
-        addActions(actions, labelIndex, label);
-        mLayoutToolBar.pack();
-        mLayoutToolBar.layout();
-    }
-
-    /**
-     * Attempts to update the existing toolbar actions, if the action list is
-     * similar to the current list. Returns false if this cannot be done and the
-     * contents must be replaced.
-     */
-    private boolean updateActions(@NonNull List<RuleAction> actions) {
-        List<RuleAction> before = mPrevActions;
-        List<RuleAction> after = actions;
-
-        if (before == null) {
-            return false;
-        }
-
-        if (!before.equals(after) || after.size() > mLayoutToolBar.getItemCount()) {
-            return false;
-        }
-
-        int actionIndex = 0;
-        for (int i = 0, max = mLayoutToolBar.getItemCount(); i < max; i++) {
-            ToolItem item = mLayoutToolBar.getItem(i);
-            int style = item.getStyle();
-            Object data = item.getData();
-            if (data != null) {
-                // One action can result in multiple toolbar items (e.g. a choice action
-                // can result in multiple radio buttons), so we've have to replace all of
-                // them with the corresponding new action
-                RuleAction prevAction = before.get(actionIndex);
-                while (prevAction != data) {
-                    actionIndex++;
-                    if (actionIndex == before.size()) {
-                        return false;
-                    }
-                    prevAction = before.get(actionIndex);
-                    if (prevAction == data) {
-                        break;
-                    } else if (!(prevAction instanceof RuleAction.Separator)) {
-                        return false;
-                    }
-                }
-                RuleAction newAction = after.get(actionIndex);
-                assert newAction.equals(prevAction); // Maybe I can do this lazily instead?
-
-                // Update action binding to the new action
-                item.setData(newAction);
-
-                // Sync button states: the checked state is not considered part of
-                // RuleAction equality
-                if ((style & SWT.CHECK) != 0) {
-                    assert newAction instanceof Toggle;
-                    Toggle toggle = (Toggle) newAction;
-                    item.setSelection(toggle.isChecked());
-                } else if ((style & SWT.RADIO) != 0) {
-                    assert newAction instanceof Choices;
-                    Choices choices = (Choices) newAction;
-                    String current = choices.getCurrent();
-                    String id = (String) item.getData(ATTR_ID);
-                    boolean selected = Strings.nullToEmpty(current).equals(id);
-                    item.setSelection(selected);
-                }
-            } else {
-                // Must be a separator, or a label (which we insert for nested widgets)
-                assert (style & SWT.SEPARATOR) != 0 || !item.getText().isEmpty() : item;
-            }
-        }
-
-        return true;
-    }
-
-    private void addActions(List<RuleAction> actions, int labelIndex, String label) {
-        if (actions.size() > 0) {
-            // Flag used to indicate that if there are any actions -after- this, it
-            // should be separated from this current action (we don't unconditionally
-            // add a separator at the end of these groups in case there are no more
-            // actions at the end so that we don't have a trailing separator)
-            boolean needSeparator = false;
-
-            int index = 0;
-            for (RuleAction action : actions) {
-                if (index == labelIndex) {
-                    final ToolItem button = new ToolItem(mLayoutToolBar, SWT.PUSH);
-                    button.setText(label);
-                    needSeparator = false;
-                }
-                index++;
-
-                if (action instanceof Separator) {
-                    addSeparator(mLayoutToolBar);
-                    needSeparator = false;
-                    continue;
-                } else if (needSeparator) {
-                    addSeparator(mLayoutToolBar);
-                    needSeparator = false;
-                }
-
-                if (action instanceof RuleAction.Choices) {
-                    RuleAction.Choices choices = (Choices) action;
-                    if (!choices.isRadio()) {
-                        addDropdown(choices);
-                    } else {
-                        addSeparator(mLayoutToolBar);
-                        addRadio(choices);
-                        needSeparator = true;
-                    }
-                } else if (action instanceof RuleAction.Toggle) {
-                    addToggle((Toggle) action);
-                } else {
-                    addPlainAction(action);
-                }
-            }
-        }
-    }
-
-    /** Add a separator to the toolbar, unless there already is one there at the end already */
-    private static void addSeparator(ToolBar toolBar) {
-        int n = toolBar.getItemCount();
-        if (n > 0 && (toolBar.getItem(n - 1).getStyle() & SWT.SEPARATOR) == 0) {
-            ToolItem separator = new ToolItem(toolBar, SWT.SEPARATOR);
-            separator.setWidth(15);
-        }
-    }
-
-    private void addToggle(Toggle toggle) {
-        final ToolItem button = new ToolItem(mLayoutToolBar, SWT.CHECK);
-
-        URL iconUrl = toggle.getIconUrl();
-        String title = toggle.getTitle();
-        if (iconUrl != null) {
-            button.setImage(IconFactory.getInstance().getIcon(iconUrl));
-            button.setToolTipText(title);
-        } else {
-            button.setText(title);
-        }
-        button.setData(toggle);
-
-        button.addSelectionListener(new SelectionAdapter() {
-            @Override
-            public void widgetSelected(SelectionEvent e) {
-                Toggle toggle = (Toggle) button.getData();
-                toggle.getCallback().action(toggle, getSelectedNodes(),
-                        toggle.getId(), button.getSelection());
-                updateSelection();
-            }
-        });
-        if (toggle.isChecked()) {
-            button.setSelection(true);
-        }
-    }
-
-    private List<INode> getSelectedNodes() {
-        List<SelectionItem> selections =
-                mEditor.getCanvasControl().getSelectionManager().getSelections();
-        List<INode> nodes = new ArrayList<INode>(selections.size());
-        for (SelectionItem item : selections) {
-            nodes.add(item.getNode());
-        }
-
-        return nodes;
-    }
-
-
-    private void addPlainAction(RuleAction menuAction) {
-        final ToolItem button = new ToolItem(mLayoutToolBar, SWT.PUSH);
-
-        URL iconUrl = menuAction.getIconUrl();
-        String title = menuAction.getTitle();
-        if (iconUrl != null) {
-            button.setImage(IconFactory.getInstance().getIcon(iconUrl));
-            button.setToolTipText(title);
-        } else {
-            button.setText(title);
-        }
-        button.setData(menuAction);
-
-        button.addSelectionListener(new SelectionAdapter() {
-            @Override
-            public void widgetSelected(SelectionEvent e) {
-                RuleAction menuAction = (RuleAction) button.getData();
-                menuAction.getCallback().action(menuAction, getSelectedNodes(), menuAction.getId(),
-                        false);
-                updateSelection();
-            }
-        });
-    }
-
-    private void addRadio(RuleAction.Choices choices) {
-        List<URL> icons = choices.getIconUrls();
-        List<String> titles = choices.getTitles();
-        List<String> ids = choices.getIds();
-        String current = choices.getCurrent() != null ? choices.getCurrent() : ""; //$NON-NLS-1$
-
-        assert icons != null;
-        assert icons.size() == titles.size();
-
-        for (int i = 0; i < icons.size(); i++) {
-            URL iconUrl = icons.get(i);
-            String title = titles.get(i);
-            final String id = ids.get(i);
-            final ToolItem item = new ToolItem(mLayoutToolBar, SWT.RADIO);
-            item.setToolTipText(title);
-            item.setImage(IconFactory.getInstance().getIcon(iconUrl));
-            item.setData(choices);
-            item.setData(ATTR_ID, id);
-            item.addSelectionListener(new SelectionAdapter() {
-                @Override
-                public void widgetSelected(SelectionEvent e) {
-                    if (item.getSelection()) {
-                        RuleAction.Choices choices = (Choices) item.getData();
-                        choices.getCallback().action(choices, getSelectedNodes(), id, null);
-                        updateSelection();
-                    }
-                }
-            });
-            boolean selected = current.equals(id);
-            if (selected) {
-                item.setSelection(true);
-            }
-        }
-    }
-
-    private void addDropdown(RuleAction.Choices choices) {
-        final ToolItem combo = new ToolItem(mLayoutToolBar, SWT.DROP_DOWN);
-        URL iconUrl = choices.getIconUrl();
-        if (iconUrl != null) {
-            combo.setImage(IconFactory.getInstance().getIcon(iconUrl));
-            combo.setToolTipText(choices.getTitle());
-        } else {
-            combo.setText(choices.getTitle());
-        }
-        combo.setData(choices);
-
-        Listener menuListener = new Listener() {
-            @Override
-            public void handleEvent(Event event) {
-                Menu menu = new Menu(mLayoutToolBar.getShell(), SWT.POP_UP);
-                RuleAction.Choices choices = (Choices) combo.getData();
-                List<URL> icons = choices.getIconUrls();
-                List<String> titles = choices.getTitles();
-                List<String> ids = choices.getIds();
-                String current = choices.getCurrent() != null ? choices.getCurrent() : ""; //$NON-NLS-1$
-
-                for (int i = 0; i < titles.size(); i++) {
-                    String title = titles.get(i);
-                    final String id = ids.get(i);
-                    URL itemIconUrl = icons != null && icons.size() > 0 ? icons.get(i) : null;
-                    MenuItem item = new MenuItem(menu, SWT.CHECK);
-                    item.setText(title);
-                    if (itemIconUrl != null) {
-                        Image itemIcon = IconFactory.getInstance().getIcon(itemIconUrl);
-                        item.setImage(itemIcon);
-                    }
-
-                    boolean selected = id.equals(current);
-                    if (selected) {
-                        item.setSelection(true);
-                    }
-
-                    item.addSelectionListener(new SelectionAdapter() {
-                        @Override
-                        public void widgetSelected(SelectionEvent e) {
-                            RuleAction.Choices choices = (Choices) combo.getData();
-                            choices.getCallback().action(choices, getSelectedNodes(), id, null);
-                            updateSelection();
-                        }
-                    });
-                }
-
-                Rectangle bounds = combo.getBounds();
-                Point location = new Point(bounds.x, bounds.y + bounds.height);
-                location = combo.getParent().toDisplay(location);
-                menu.setLocation(location.x, location.y);
-                menu.setVisible(true);
-            }
-        };
-        combo.addListener(SWT.Selection, menuListener);
-    }
-
-    // ---- Zoom Controls ----
-
-    @SuppressWarnings("unused") // SWT constructors have side effects, they are not unused
-    private ToolBar createZoomControls() {
-        ToolBar toolBar = new ToolBar(this, SWT.FLAT | SWT.RIGHT | SWT.HORIZONTAL);
-
-        IconFactory iconFactory = IconFactory.getInstance();
-        mZoomRealSizeButton = new ToolItem(toolBar, SWT.CHECK);
-        mZoomRealSizeButton.setToolTipText("Emulate Real Size");
-        mZoomRealSizeButton.setImage(iconFactory.getIcon("zoomreal")); //$NON-NLS-1$);
-        mZoomRealSizeButton.addSelectionListener(new SelectionAdapter() {
-            @Override
-            public void widgetSelected(SelectionEvent e) {
-                boolean newState = mZoomRealSizeButton.getSelection();
-                if (rescaleToReal(newState)) {
-                    mZoomOutButton.setEnabled(!newState);
-                    mZoomResetButton.setEnabled(!newState);
-                    mZoomInButton.setEnabled(!newState);
-                    mZoomFitButton.setEnabled(!newState);
-                } else {
-                    mZoomRealSizeButton.setSelection(!newState);
-                }
-            }
-        });
-
-        mZoomFitButton = new ToolItem(toolBar, SWT.PUSH);
-        mZoomFitButton.setToolTipText("Zoom to Fit (0)");
-        mZoomFitButton.setImage(iconFactory.getIcon("zoomfit")); //$NON-NLS-1$);
-        mZoomFitButton.addSelectionListener(new SelectionAdapter() {
-            @Override
-            public void widgetSelected(SelectionEvent e) {
-                rescaleToFit(true);
-            }
-        });
-
-        mZoomResetButton = new ToolItem(toolBar, SWT.PUSH);
-        mZoomResetButton.setToolTipText("Reset Zoom to 100% (1)");
-        mZoomResetButton.setImage(iconFactory.getIcon("zoom100")); //$NON-NLS-1$);
-        mZoomResetButton.addSelectionListener(new SelectionAdapter() {
-            @Override
-            public void widgetSelected(SelectionEvent e) {
-                resetScale();
-            }
-        });
-
-        // Group zoom in/out separately
-        new ToolItem(toolBar, SWT.SEPARATOR);
-
-        mZoomOutButton = new ToolItem(toolBar, SWT.PUSH);
-        mZoomOutButton.setToolTipText("Zoom Out (-)");
-        mZoomOutButton.setImage(iconFactory.getIcon("zoomminus")); //$NON-NLS-1$);
-        mZoomOutButton.addSelectionListener(new SelectionAdapter() {
-            @Override
-            public void widgetSelected(SelectionEvent e) {
-                rescale(-1);
-            }
-        });
-
-        mZoomInButton = new ToolItem(toolBar, SWT.PUSH);
-        mZoomInButton.setToolTipText("Zoom In (+)");
-        mZoomInButton.setImage(iconFactory.getIcon("zoomplus")); //$NON-NLS-1$);
-        mZoomInButton.addSelectionListener(new SelectionAdapter() {
-            @Override
-            public void widgetSelected(SelectionEvent e) {
-                rescale(+1);
-            }
-        });
-
-        return toolBar;
-    }
-
-    @SuppressWarnings("unused") // SWT constructors have side effects, they are not unused
-    private ToolBar createLintControls() {
-        ToolBar toolBar = new ToolBar(this, SWT.FLAT | SWT.RIGHT | SWT.HORIZONTAL);
-
-        // Separate from adjacent toolbar
-        new ToolItem(toolBar, SWT.SEPARATOR);
-
-        ISharedImages sharedImages = PlatformUI.getWorkbench().getSharedImages();
-        mLintButton = new ToolItem(toolBar, SWT.PUSH);
-        mLintButton.setToolTipText("Show Lint Warnings for this Layout");
-        mLintButton.setImage(sharedImages.getImage(ISharedImages.IMG_OBJS_WARN_TSK));
-        mLintButton.addSelectionListener(new SelectionAdapter() {
-            @Override
-            public void widgetSelected(SelectionEvent e) {
-                CommonXmlEditor editor = mEditor.getEditorDelegate().getEditor();
-                IFile file = editor.getInputFile();
-                if (file != null) {
-                    EclipseLintClient.showErrors(getShell(), file, editor);
-                }
-            }
-        });
-
-        return toolBar;
-    }
-
-    /**
-     * Updates the lint indicator state in the given layout editor
-     */
-    public void updateErrorIndicator() {
-        updateErrorIndicator(mEditor.getEditedFile());
-    }
-
-    /**
-     * Updates the lint indicator state for the given file
-     *
-     * @param file the file to show the indicator status for
-     */
-    public void updateErrorIndicator(IFile file) {
-        IMarker[] markers = EclipseLintClient.getMarkers(file);
-        updateErrorIndicator(markers.length);
-    }
-
-    /**
-     * Sets whether the action bar should show the "lint warnings" button
-     *
-     * @param hasLintWarnings whether there are lint errors to be shown
-     */
-    private void updateErrorIndicator(final int markerCount) {
-        Display display = getDisplay();
-        if (display.getThread() != Thread.currentThread()) {
-            display.asyncExec(new Runnable() {
-                @Override
-                public void run() {
-                    if (!isDisposed()) {
-                        updateErrorIndicator(markerCount);
-                    }
-                }
-            });
-            return;
-        }
-
-        GridData layoutData = (GridData) mLintToolBar.getLayoutData();
-        Integer existing = (Integer) mLintToolBar.getData();
-        Integer current = Integer.valueOf(markerCount);
-        if (!current.equals(existing)) {
-            mLintToolBar.setData(current);
-            boolean layout = false;
-            boolean hasLintWarnings = markerCount > 0 && AdtPrefs.getPrefs().isLintOnSave();
-            if (layoutData.exclude == hasLintWarnings) {
-                layoutData.exclude = !hasLintWarnings;
-                mLintToolBar.setVisible(hasLintWarnings);
-                layout = true;
-            }
-            if (markerCount > 0) {
-                String iconName = "";
-                switch (markerCount) {
-                    case 1: iconName = "lint1"; break;  //$NON-NLS-1$
-                    case 2: iconName = "lint2"; break;  //$NON-NLS-1$
-                    case 3: iconName = "lint3"; break;  //$NON-NLS-1$
-                    case 4: iconName = "lint4"; break;  //$NON-NLS-1$
-                    case 5: iconName = "lint5"; break;  //$NON-NLS-1$
-                    case 6: iconName = "lint6"; break;  //$NON-NLS-1$
-                    case 7: iconName = "lint7"; break;  //$NON-NLS-1$
-                    case 8: iconName = "lint8"; break;  //$NON-NLS-1$
-                    case 9: iconName = "lint9"; break;  //$NON-NLS-1$
-                    default: iconName = "lint9p"; break;//$NON-NLS-1$
-                }
-                mLintButton.setImage(IconFactory.getInstance().getIcon(iconName));
-            }
-            if (layout) {
-                layout();
-            }
-            redraw();
-        }
-    }
-
-    /**
-     * Returns true if zooming in/out/to-fit/etc is allowed (which is not the case while
-     * emulating real size)
-     *
-     * @return true if zooming is allowed
-     */
-    boolean isZoomingAllowed() {
-        return mZoomInButton.isEnabled();
-    }
-
-    boolean isZoomingRealSize() {
-        return mZoomRealSizeButton.getSelection();
-    }
-
-    /**
-     * Rescales canvas.
-     * @param direction +1 for zoom in, -1 for zoom out
-     */
-    void rescale(int direction) {
-        LayoutCanvas canvas = mEditor.getCanvasControl();
-        double s = canvas.getScale();
-
-        if (direction > 0) {
-            s = s * 1.2;
-        } else {
-            s = s / 1.2;
-        }
-
-        // Some operations are faster if the zoom is EXACTLY 1.0 rather than ALMOST 1.0.
-        // (This is because there is a fast-path when image copying and the scale is 1.0;
-        // in that case it does not have to do any scaling).
-        //
-        // If you zoom out 10 times and then back in 10 times, small rounding errors mean
-        // that you end up with a scale=1.0000000000000004. In the cases, when you get close
-        // to 1.0, just make the zoom an exact 1.0.
-        if (Math.abs(s-1.0) < 0.0001) {
-            s = 1.0;
-        }
-
-        canvas.setScale(s, true /*redraw*/);
-    }
-
-    /**
-     * Reset the canvas scale to 100%
-     */
-    void resetScale() {
-        mEditor.getCanvasControl().setScale(1, true /*redraw*/);
-    }
-
-    /**
-     * Reset the canvas scale to best fit (so content is as large as possible without scrollbars)
-     */
-    void rescaleToFit(boolean onlyZoomOut) {
-        mEditor.getCanvasControl().setFitScale(onlyZoomOut, true /*allowZoomIn*/);
-    }
-
-    boolean rescaleToReal(boolean real) {
-        if (real) {
-            return computeAndSetRealScale(true /*redraw*/);
-        } else {
-            // reset the scale to 100%
-            mEditor.getCanvasControl().setScale(1, true /*redraw*/);
-            return true;
-        }
-    }
-
-    boolean computeAndSetRealScale(boolean redraw) {
-        // compute average dpi of X and Y
-        ConfigurationChooser chooser = mEditor.getConfigurationChooser();
-        Configuration config = chooser.getConfiguration();
-        Device device = config.getDevice();
-        Screen screen = device.getDefaultHardware().getScreen();
-        double dpi = (screen.getXdpi() + screen.getYdpi()) / 2.;
-
-        // get the monitor dpi
-        float monitor = AdtPrefs.getPrefs().getMonitorDensity();
-        if (monitor == 0.f) {
-            ResolutionChooserDialog dialog = new ResolutionChooserDialog(chooser.getShell());
-            if (dialog.open() == Window.OK) {
-                monitor = dialog.getDensity();
-                AdtPrefs.getPrefs().setMonitorDensity(monitor);
-            } else {
-                return false;
-            }
-        }
-
-        mEditor.getCanvasControl().setScale(monitor / dpi, redraw);
-        return true;
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/LayoutCanvas.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/LayoutCanvas.java
deleted file mode 100644
index 814b82c..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/LayoutCanvas.java
+++ /dev/null
@@ -1,1720 +0,0 @@
-/*
- * Copyright (C) 2009 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.editors.layout.gle2;
-
-import com.android.SdkConstants;
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-import com.android.ide.common.api.IDragElement.IDragAttribute;
-import com.android.ide.common.api.INode;
-import com.android.ide.common.api.Margins;
-import com.android.ide.common.api.Point;
-import com.android.ide.common.rendering.api.Capability;
-import com.android.ide.common.rendering.api.RenderSession;
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.ide.eclipse.adt.internal.editors.descriptors.DescriptorsUtils;
-import com.android.ide.eclipse.adt.internal.editors.layout.LayoutEditorDelegate;
-import com.android.ide.eclipse.adt.internal.editors.layout.configuration.ConfigurationChooser;
-import com.android.ide.eclipse.adt.internal.editors.layout.configuration.ConfigurationDescription;
-import com.android.ide.eclipse.adt.internal.editors.layout.descriptors.ViewElementDescriptor;
-import com.android.ide.eclipse.adt.internal.editors.layout.gle2.IncludeFinder.Reference;
-import com.android.ide.eclipse.adt.internal.editors.layout.gre.NodeFactory;
-import com.android.ide.eclipse.adt.internal.editors.layout.gre.RulesEngine;
-import com.android.ide.eclipse.adt.internal.editors.layout.gre.ViewMetadataRepository;
-import com.android.ide.eclipse.adt.internal.editors.layout.uimodel.UiViewElementNode;
-import com.android.ide.eclipse.adt.internal.editors.uimodel.UiDocumentNode;
-import com.android.ide.eclipse.adt.internal.editors.uimodel.UiElementNode;
-import com.android.ide.eclipse.adt.internal.lint.LintEditAction;
-import com.android.resources.Density;
-
-import org.eclipse.core.filesystem.EFS;
-import org.eclipse.core.filesystem.IFileStore;
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IWorkspaceRoot;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.QualifiedName;
-import org.eclipse.jdt.internal.ui.javaeditor.EditorUtility;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.ActionContributionItem;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.action.IContributionItem;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.action.IStatusLineManager;
-import org.eclipse.jface.action.MenuManager;
-import org.eclipse.jface.action.Separator;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.StyledText;
-import org.eclipse.swt.dnd.DND;
-import org.eclipse.swt.dnd.DragSource;
-import org.eclipse.swt.dnd.DropTarget;
-import org.eclipse.swt.dnd.TextTransfer;
-import org.eclipse.swt.dnd.Transfer;
-import org.eclipse.swt.events.ControlAdapter;
-import org.eclipse.swt.events.ControlEvent;
-import org.eclipse.swt.events.KeyEvent;
-import org.eclipse.swt.events.MenuDetectEvent;
-import org.eclipse.swt.events.MenuDetectListener;
-import org.eclipse.swt.events.MouseEvent;
-import org.eclipse.swt.events.PaintEvent;
-import org.eclipse.swt.events.PaintListener;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.GC;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.graphics.ImageData;
-import org.eclipse.swt.graphics.Rectangle;
-import org.eclipse.swt.widgets.Canvas;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Menu;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.IActionBars;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IEditorSite;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.actions.ActionFactory;
-import org.eclipse.ui.actions.ActionFactory.IWorkbenchAction;
-import org.eclipse.ui.actions.ContributionItemFactory;
-import org.eclipse.ui.ide.IDE;
-import org.eclipse.ui.internal.ide.IDEWorkbenchMessages;
-import org.eclipse.ui.texteditor.ITextEditor;
-import org.w3c.dom.Node;
-
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-/**
- * Displays the image rendered by the {@link GraphicalEditorPart} and handles
- * the interaction with the widgets.
- * <p/>
- * {@link LayoutCanvas} implements the "Canvas" control. The editor part
- * actually uses the {@link LayoutCanvasViewer}, which is a JFace viewer wrapper
- * around this control.
- * <p/>
- * The LayoutCanvas contains the painting logic for the canvas. Selection,
- * clipboard, view management etc. is handled in separate helper classes.
- *
- * @since GLE2
- */
-@SuppressWarnings("restriction") // For WorkBench "Show In" support
-public class LayoutCanvas extends Canvas {
-    private final static QualifiedName NAME_ZOOM =
-        new QualifiedName(AdtPlugin.PLUGIN_ID, "zoom");//$NON-NLS-1$
-
-    private static final boolean DEBUG = false;
-
-    static final String PREFIX_CANVAS_ACTION = "canvas_action_"; //$NON-NLS-1$
-
-    /** The layout editor that uses this layout canvas. */
-    private final LayoutEditorDelegate mEditorDelegate;
-
-    /** The Rules Engine, associated with the current project. */
-    private RulesEngine mRulesEngine;
-
-    /** GC wrapper given to the IViewRule methods. The GC itself is only defined in the
-     *  context of {@link #onPaint(PaintEvent)}; otherwise it is null. */
-    private GCWrapper mGCWrapper;
-
-    /** Default font used on the canvas. Do not dispose, it's a system font. */
-    private Font mFont;
-
-    /** Current hover view info. Null when no mouse hover. */
-    private CanvasViewInfo mHoverViewInfo;
-
-    /** When true, always display the outline of all views. */
-    private boolean mShowOutline;
-
-    /** When true, display the outline of all empty parent views. */
-    private boolean mShowInvisible;
-
-    /** Drop target associated with this composite. */
-    private DropTarget mDropTarget;
-
-    /** Factory that can create {@link INode} proxies. */
-    private final @NonNull NodeFactory mNodeFactory = new NodeFactory(this);
-
-    /** Vertical scaling & scrollbar information. */
-    private final CanvasTransform mVScale;
-
-    /** Horizontal scaling & scrollbar information. */
-    private final CanvasTransform mHScale;
-
-    /** Drag source associated with this canvas. */
-    private DragSource mDragSource;
-
-    /**
-     * The current Outline Page, to set its model.
-     * It isn't possible to call OutlinePage2.dispose() in this.dispose().
-     * this.dispose() is called from GraphicalEditorPart.dispose(),
-     * when page's widget is already disposed.
-     * Added the DisposeListener to OutlinePage2 in order to correctly dispose this page.
-     **/
-    private OutlinePage mOutlinePage;
-
-    /** Delete action for the Edit or context menu. */
-    private Action mDeleteAction;
-
-    /** Select-All action for the Edit or context menu. */
-    private Action mSelectAllAction;
-
-    /** Paste action for the Edit or context menu. */
-    private Action mPasteAction;
-
-    /** Cut action for the Edit or context menu. */
-    private Action mCutAction;
-
-    /** Copy action for the Edit or context menu. */
-    private Action mCopyAction;
-
-    /** Undo action: delegates to the text editor */
-    private IAction mUndoAction;
-
-    /** Redo action: delegates to the text editor */
-    private IAction mRedoAction;
-
-    /** Root of the context menu. */
-    private MenuManager mMenuManager;
-
-    /** The view hierarchy associated with this canvas. */
-    private final ViewHierarchy mViewHierarchy = new ViewHierarchy(this);
-
-    /** The selection in the canvas. */
-    private final SelectionManager mSelectionManager = new SelectionManager(this);
-
-    /** The overlay which paints the optional outline. */
-    private OutlineOverlay mOutlineOverlay;
-
-    /** The overlay which paints outlines around empty children */
-    private EmptyViewsOverlay mEmptyOverlay;
-
-    /** The overlay which paints the mouse hover. */
-    private HoverOverlay mHoverOverlay;
-
-    /** The overlay which paints the lint warnings */
-    private LintOverlay mLintOverlay;
-
-    /** The overlay which paints the selection. */
-    private SelectionOverlay mSelectionOverlay;
-
-    /** The overlay which paints the rendered layout image. */
-    private ImageOverlay mImageOverlay;
-
-    /** The overlay which paints masks hiding everything but included content. */
-    private IncludeOverlay mIncludeOverlay;
-
-    /** Configuration previews shown next to the layout */
-    private final RenderPreviewManager mPreviewManager;
-
-    /**
-     * Gesture Manager responsible for identifying mouse, keyboard and drag and
-     * drop events.
-     */
-    private final GestureManager mGestureManager = new GestureManager(this);
-
-    /**
-     * When set, performs a zoom-to-fit when the next rendering image arrives.
-     */
-    private boolean mZoomFitNextImage;
-
-    /**
-     * Native clipboard support.
-     */
-    private ClipboardSupport mClipboardSupport;
-
-    /** Tooltip manager for lint warnings */
-    private LintTooltipManager mLintTooltipManager;
-
-    private Color mBackgroundColor;
-
-    /**
-     * Creates a new {@link LayoutCanvas} widget
-     *
-     * @param editorDelegate the associated editor delegate
-     * @param rulesEngine the rules engine
-     * @param parent parent SWT widget
-     * @param style the SWT style
-     */
-    public LayoutCanvas(LayoutEditorDelegate editorDelegate,
-            RulesEngine rulesEngine,
-            Composite parent,
-            int style) {
-        super(parent, style | SWT.DOUBLE_BUFFERED | SWT.V_SCROLL | SWT.H_SCROLL);
-        mEditorDelegate = editorDelegate;
-        mRulesEngine = rulesEngine;
-
-        mBackgroundColor = new Color(parent.getDisplay(), 150, 150, 150);
-        setBackground(mBackgroundColor);
-
-        mClipboardSupport = new ClipboardSupport(this, parent);
-        mHScale = new CanvasTransform(this, getHorizontalBar());
-        mVScale = new CanvasTransform(this, getVerticalBar());
-        mPreviewManager = new RenderPreviewManager(this);
-
-        // Unit test suite passes a null here; TODO: Replace with mocking
-        IFile file = editorDelegate != null ? editorDelegate.getEditor().getInputFile() : null;
-        if (file != null) {
-            String zoom = AdtPlugin.getFileProperty(file, NAME_ZOOM);
-            if (zoom != null) {
-                try {
-                    double initialScale = Double.parseDouble(zoom);
-                    if (initialScale > 0.1) {
-                        mHScale.setScale(initialScale);
-                        mVScale.setScale(initialScale);
-                    }
-                } catch (NumberFormatException nfe) {
-                    // Ignore - use zoom=100%
-                }
-            } else {
-                mZoomFitNextImage = true;
-            }
-        }
-
-        mGCWrapper = new GCWrapper(mHScale, mVScale);
-
-        Display display = getDisplay();
-        mFont = display.getSystemFont();
-
-        // --- Set up graphic overlays
-        // mOutlineOverlay and mEmptyOverlay are initialized lazily
-        mHoverOverlay = new HoverOverlay(this, mHScale, mVScale);
-        mHoverOverlay.create(display);
-        mSelectionOverlay = new SelectionOverlay(this);
-        mSelectionOverlay.create(display);
-        mImageOverlay = new ImageOverlay(this, mHScale, mVScale);
-        mIncludeOverlay = new IncludeOverlay(this);
-        mImageOverlay.create(display);
-        mLintOverlay = new LintOverlay(this);
-        mLintOverlay.create(display);
-
-        // --- Set up listeners
-        addPaintListener(new PaintListener() {
-            @Override
-            public void paintControl(PaintEvent e) {
-                onPaint(e);
-            }
-        });
-
-        addControlListener(new ControlAdapter() {
-            @Override
-            public void controlResized(ControlEvent e) {
-                super.controlResized(e);
-
-                // Check editor state:
-                LayoutWindowCoordinator coordinator = null;
-                IEditorSite editorSite = getEditorDelegate().getEditor().getEditorSite();
-                IWorkbenchWindow window = editorSite.getWorkbenchWindow();
-                if (window != null) {
-                    coordinator = LayoutWindowCoordinator.get(window, false);
-                    if (coordinator != null) {
-                        coordinator.syncMaximizedState(editorSite.getPage());
-                    }
-                }
-
-                updateScrollBars();
-
-                // Update the zoom level in the canvas when you toggle the zoom
-                if (coordinator != null) {
-                    mZoomCheck.run();
-                } else {
-                    // During startup, delay updates which can trigger further layout
-                    getDisplay().asyncExec(mZoomCheck);
-
-                }
-            }
-        });
-
-        // --- setup drag'n'drop ---
-        // DND Reference: http://www.eclipse.org/articles/Article-SWT-DND/DND-in-SWT.html
-
-        mDropTarget = createDropTarget(this);
-        mDragSource = createDragSource(this);
-        mGestureManager.registerListeners(mDragSource, mDropTarget);
-
-        if (mEditorDelegate == null) {
-            // TODO: In another CL we should use EasyMock/objgen to provide an editor.
-            return; // Unit test
-        }
-
-        // --- setup context menu ---
-        setupGlobalActionHandlers();
-        createContextMenu();
-
-        // --- setup outline ---
-        // Get the outline associated with this editor, if any and of the right type.
-        if (editorDelegate != null) {
-            mOutlinePage = editorDelegate.getGraphicalOutline();
-        }
-
-        mLintTooltipManager = new LintTooltipManager(this);
-        mLintTooltipManager.register();
-    }
-
-    void updateScrollBars() {
-        Rectangle clientArea = getClientArea();
-        Image image = mImageOverlay.getImage();
-        if (image != null) {
-            ImageData imageData = image.getImageData();
-            int clientWidth = clientArea.width;
-            int clientHeight = clientArea.height;
-
-            int imageWidth = imageData.width;
-            int imageHeight = imageData.height;
-
-            int fullWidth = imageWidth;
-            int fullHeight = imageHeight;
-
-            if (mPreviewManager.hasPreviews()) {
-                fullHeight = Math.max(fullHeight,
-                        (int) (mPreviewManager.getHeight() / mHScale.getScale()));
-            }
-
-            if (clientWidth == 0) {
-                clientWidth = imageWidth;
-                Shell shell = getShell();
-                if (shell != null) {
-                    org.eclipse.swt.graphics.Point size = shell.getSize();
-                    if (size.x > 0) {
-                        clientWidth = size.x * 70 / 100;
-                    }
-                }
-            }
-            if (clientHeight == 0) {
-                clientHeight = imageHeight;
-                Shell shell = getShell();
-                if (shell != null) {
-                    org.eclipse.swt.graphics.Point size = shell.getSize();
-                    if (size.y > 0) {
-                        clientWidth = size.y * 80 / 100;
-                    }
-                }
-            }
-
-            mHScale.setSize(imageWidth, fullWidth, clientWidth);
-            mVScale.setSize(imageHeight, fullHeight, clientHeight);
-        }
-    }
-
-    private Runnable mZoomCheck = new Runnable() {
-        private Boolean mWasZoomed;
-
-        @Override
-        public void run() {
-            if (isDisposed()) {
-                return;
-            }
-
-            IEditorSite editorSite = getEditorDelegate().getEditor().getEditorSite();
-            IWorkbenchWindow window = editorSite.getWorkbenchWindow();
-            if (window != null) {
-                LayoutWindowCoordinator coordinator = LayoutWindowCoordinator.get(window, false);
-                if (coordinator != null) {
-                    Boolean zoomed = coordinator.isEditorMaximized();
-                    if (mWasZoomed != zoomed) {
-                        if (mWasZoomed != null) {
-                            LayoutActionBar actionBar = getGraphicalEditor().getLayoutActionBar();
-                            if (actionBar.isZoomingAllowed()) {
-                                setFitScale(true /*onlyZoomOut*/, true /*allowZoomIn*/);
-                            }
-                        }
-                        mWasZoomed = zoomed;
-                    }
-                }
-            }
-        }
-    };
-
-    void handleKeyPressed(KeyEvent e) {
-        // Set up backspace as an alias for the delete action within the canvas.
-        // On most Macs there is no delete key - though there IS a key labeled
-        // "Delete" and it sends a backspace key code! In short, for Macs we should
-        // treat backspace as delete, and it's harmless (and probably useful) to
-        // handle backspace for other platforms as well.
-        if (e.keyCode == SWT.BS) {
-            mDeleteAction.run();
-        } else if (e.keyCode == SWT.ESC) {
-            mSelectionManager.selectParent();
-        } else if (e.keyCode == DynamicContextMenu.DEFAULT_ACTION_KEY) {
-            mSelectionManager.performDefaultAction();
-        } else if (e.keyCode == 'r') {
-            // Keep key bindings in sync with {@link DynamicContextMenu#createPlainAction}
-            // TODO: Find a way to look up the Eclipse key bindings and attempt
-            // to use the current keymap's rename action.
-            if (SdkConstants.CURRENT_PLATFORM == SdkConstants.PLATFORM_DARWIN) {
-                // Command+Option+R
-                if ((e.stateMask & (SWT.MOD1 | SWT.MOD3)) == (SWT.MOD1 | SWT.MOD3)) {
-                    mSelectionManager.performRename();
-                }
-            } else {
-                // Alt+Shift+R
-                if ((e.stateMask & (SWT.MOD2 | SWT.MOD3)) == (SWT.MOD2 | SWT.MOD3)) {
-                    mSelectionManager.performRename();
-                }
-            }
-        } else {
-            // Zooming actions
-            char c = e.character;
-            LayoutActionBar actionBar = getGraphicalEditor().getLayoutActionBar();
-            if (c == '1' && actionBar.isZoomingAllowed()) {
-                setScale(1, true);
-            } else if (c == '0' && actionBar.isZoomingAllowed()) {
-                setFitScale(true, true /*allowZoomIn*/);
-            } else if (e.keyCode == '0' && (e.stateMask & SWT.MOD2) != 0
-                    && actionBar.isZoomingAllowed()) {
-                setFitScale(false, true /*allowZoomIn*/);
-            } else if ((c == '+' || c == '=') && actionBar.isZoomingAllowed()) {
-                if ((e.stateMask & SWT.MOD1) != 0) {
-                    mPreviewManager.zoomIn();
-                } else {
-                    actionBar.rescale(1);
-                }
-            } else if (c == '-' && actionBar.isZoomingAllowed()) {
-                if ((e.stateMask & SWT.MOD1) != 0) {
-                    mPreviewManager.zoomOut();
-                } else {
-                    actionBar.rescale(-1);
-                }
-            }
-        }
-    }
-
-    @Override
-    public void dispose() {
-        super.dispose();
-
-        mGestureManager.unregisterListeners(mDragSource, mDropTarget);
-
-        if (mLintTooltipManager != null) {
-            mLintTooltipManager.unregister();
-            mLintTooltipManager = null;
-        }
-
-        if (mDropTarget != null) {
-            mDropTarget.dispose();
-            mDropTarget = null;
-        }
-
-        if (mRulesEngine != null) {
-            mRulesEngine.dispose();
-            mRulesEngine = null;
-        }
-
-        if (mDragSource != null) {
-            mDragSource.dispose();
-            mDragSource = null;
-        }
-
-        if (mClipboardSupport != null) {
-            mClipboardSupport.dispose();
-            mClipboardSupport = null;
-        }
-
-        if (mGCWrapper != null) {
-            mGCWrapper.dispose();
-            mGCWrapper = null;
-        }
-
-        if (mOutlineOverlay != null) {
-            mOutlineOverlay.dispose();
-            mOutlineOverlay = null;
-        }
-
-        if (mEmptyOverlay != null) {
-            mEmptyOverlay.dispose();
-            mEmptyOverlay = null;
-        }
-
-        if (mHoverOverlay != null) {
-            mHoverOverlay.dispose();
-            mHoverOverlay = null;
-        }
-
-        if (mSelectionOverlay != null) {
-            mSelectionOverlay.dispose();
-            mSelectionOverlay = null;
-        }
-
-        if (mImageOverlay != null) {
-            mImageOverlay.dispose();
-            mImageOverlay = null;
-        }
-
-        if (mIncludeOverlay != null) {
-            mIncludeOverlay.dispose();
-            mIncludeOverlay = null;
-        }
-
-        if (mLintOverlay != null) {
-            mLintOverlay.dispose();
-            mLintOverlay = null;
-        }
-
-        if (mBackgroundColor != null) {
-            mBackgroundColor.dispose();
-            mBackgroundColor = null;
-        }
-
-        mPreviewManager.disposePreviews();
-        mViewHierarchy.dispose();
-    }
-
-    /**
-     * Returns the configuration preview manager for this canvas
-     *
-     * @return the configuration preview manager for this canvas
-     */
-    @NonNull
-    public RenderPreviewManager getPreviewManager() {
-        return mPreviewManager;
-    }
-
-    /** Returns the Rules Engine, associated with the current project. */
-    RulesEngine getRulesEngine() {
-        return mRulesEngine;
-    }
-
-    /** Sets the Rules Engine, associated with the current project. */
-    void setRulesEngine(RulesEngine rulesEngine) {
-        mRulesEngine = rulesEngine;
-    }
-
-    /**
-     * Returns the factory to use to convert from {@link CanvasViewInfo} or from
-     * {@link UiViewElementNode} to {@link INode} proxies.
-     *
-     * @return the node factory
-     */
-    @NonNull
-    public NodeFactory getNodeFactory() {
-        return mNodeFactory;
-    }
-
-    /**
-     * Returns the GCWrapper used to paint view rules.
-     *
-     * @return The GCWrapper used to paint view rules
-     */
-    GCWrapper getGcWrapper() {
-        return mGCWrapper;
-    }
-
-    /**
-     * Returns the {@link LayoutEditorDelegate} associated with this canvas.
-     *
-     * @return the delegate
-     */
-    public LayoutEditorDelegate getEditorDelegate() {
-        return mEditorDelegate;
-    }
-
-    /**
-     * Returns the current {@link ImageOverlay} painting the rendered result
-     *
-     * @return the image overlay responsible for painting the rendered result, never null
-     */
-    ImageOverlay getImageOverlay() {
-        return mImageOverlay;
-    }
-
-    /**
-     * Returns the current {@link SelectionOverlay} painting the selection highlights
-     *
-     * @return the selection overlay responsible for painting the selection highlights,
-     *         never null
-     */
-    SelectionOverlay getSelectionOverlay() {
-        return mSelectionOverlay;
-    }
-
-    /**
-     * Returns the {@link GestureManager} associated with this canvas.
-     *
-     * @return the {@link GestureManager} associated with this canvas, never null.
-     */
-    GestureManager getGestureManager() {
-        return mGestureManager;
-    }
-
-    /**
-     * Returns the current {@link HoverOverlay} painting the mouse hover.
-     *
-     * @return the hover overlay responsible for painting the mouse hover,
-     *         never null
-     */
-    HoverOverlay getHoverOverlay() {
-        return mHoverOverlay;
-    }
-
-    /**
-     * Returns the horizontal {@link CanvasTransform} transform object, which can map
-     * a layout point into a control point.
-     *
-     * @return A {@link CanvasTransform} for mapping between layout and control
-     *         coordinates in the horizontal dimension.
-     */
-    CanvasTransform getHorizontalTransform() {
-        return mHScale;
-    }
-
-    /**
-     * Returns the vertical {@link CanvasTransform} transform object, which can map a
-     * layout point into a control point.
-     *
-     * @return A {@link CanvasTransform} for mapping between layout and control
-     *         coordinates in the vertical dimension.
-     */
-    CanvasTransform getVerticalTransform() {
-        return mVScale;
-    }
-
-    /**
-     * Returns the {@link OutlinePage} associated with this canvas
-     *
-     * @return the {@link OutlinePage} associated with this canvas
-     */
-    public OutlinePage getOutlinePage() {
-        return mOutlinePage;
-    }
-
-    /**
-     * Returns the {@link SelectionManager} associated with this canvas.
-     *
-     * @return The {@link SelectionManager} holding the selection for this
-     *         canvas. Never null.
-     */
-    public SelectionManager getSelectionManager() {
-        return mSelectionManager;
-    }
-
-    /**
-     * Returns the {@link ViewHierarchy} object associated with this canvas,
-     * holding the most recent rendered view of the scene, if valid.
-     *
-     * @return The {@link ViewHierarchy} object associated with this canvas.
-     *         Never null.
-     */
-    public ViewHierarchy getViewHierarchy() {
-        return mViewHierarchy;
-    }
-
-    /**
-     * Returns the {@link ClipboardSupport} object associated with this canvas.
-     *
-     * @return The {@link ClipboardSupport} object for this canvas. Null only after dispose.
-     */
-    public ClipboardSupport getClipboardSupport() {
-        return mClipboardSupport;
-    }
-
-    /** Returns the Select All action bound to this canvas */
-    Action getSelectAllAction() {
-        return mSelectAllAction;
-    }
-
-    /** Returns the associated {@link GraphicalEditorPart} */
-    GraphicalEditorPart getGraphicalEditor() {
-        return mEditorDelegate.getGraphicalEditor();
-    }
-
-    /**
-     * Sets the result of the layout rendering. The result object indicates if the layout
-     * rendering succeeded. If it did, it contains a bitmap and the objects rectangles.
-     *
-     * Implementation detail: the bridge's computeLayout() method already returns a newly
-     * allocated ILayourResult. That means we can keep this result and hold on to it
-     * when it is valid.
-     *
-     * @param session The new scene, either valid or not.
-     * @param explodedNodes The set of individual nodes the layout computer was asked to
-     *            explode. Note that these are independent of the explode-all mode where
-     *            all views are exploded; this is used only for the mode (
-     *            {@link #showInvisibleViews(boolean)}) where individual invisible nodes
-     *            are padded during certain interactions.
-     */
-    void setSession(RenderSession session, Set<UiElementNode> explodedNodes,
-            boolean layoutlib5) {
-        // disable any hover
-        clearHover();
-
-        mViewHierarchy.setSession(session, explodedNodes, layoutlib5);
-        if (mViewHierarchy.isValid() && session != null) {
-            Image image = mImageOverlay.setImage(session.getImage(),
-                    session.isAlphaChannelImage());
-
-            mOutlinePage.setModel(mViewHierarchy.getRoot());
-            getGraphicalEditor().setModel(mViewHierarchy.getRoot());
-
-            if (image != null) {
-                updateScrollBars();
-                if (mZoomFitNextImage) {
-                    // Must be run asynchronously because getClientArea() returns 0 bounds
-                    // when the editor is being initialized
-                    getDisplay().asyncExec(new Runnable() {
-                        @Override
-                        public void run() {
-                            if (!isDisposed()) {
-                                ensureZoomed();
-                            }
-                        }
-                    });
-                }
-
-                // Ensure that if we have a a preview mode enabled, it's shown
-                syncPreviewMode();
-            }
-        }
-
-        redraw();
-    }
-
-    void ensureZoomed() {
-        if (mZoomFitNextImage && getClientArea().height > 0) {
-            mZoomFitNextImage = false;
-            LayoutActionBar actionBar = getGraphicalEditor().getLayoutActionBar();
-            if (actionBar.isZoomingAllowed()) {
-                setFitScale(true, true /*allowZoomIn*/);
-            }
-        }
-    }
-
-    void setShowOutline(boolean newState) {
-        mShowOutline = newState;
-        redraw();
-    }
-
-    /**
-     * Returns the zoom scale factor of the canvas (the amount the full
-     * resolution render of the device is zoomed before being shown on the
-     * canvas)
-     *
-     * @return the image scale
-     */
-    public double getScale() {
-        return mHScale.getScale();
-    }
-
-    void setScale(double scale, boolean redraw) {
-        if (scale <= 0.0) {
-            scale = 1.0;
-        }
-
-        if (scale == getScale()) {
-            return;
-        }
-
-        mHScale.setScale(scale);
-        mVScale.setScale(scale);
-        if (redraw) {
-            redraw();
-        }
-
-        // Clear the zoom setting if it is almost identical to 1.0
-        String zoomValue = (Math.abs(scale - 1.0) < 0.0001) ? null : Double.toString(scale);
-        IFile file = mEditorDelegate.getEditor().getInputFile();
-        if (file != null) {
-            AdtPlugin.setFileProperty(file, NAME_ZOOM, zoomValue);
-        }
-    }
-
-    /**
-     * Scales the canvas to best fit
-     *
-     * @param onlyZoomOut if true, then the zooming factor will never be larger than 1,
-     *            which means that this function will zoom out if necessary to show the
-     *            rendered image, but it will never zoom in.
-     *            TODO: Rename this, it sounds like it conflicts with allowZoomIn,
-     *            even though one is referring to the zoom level and one is referring
-     *            to the overall act of scaling above/below 1.
-     * @param allowZoomIn if false, then if the computed zoom factor is smaller than
-     *            the current zoom factor, it will be ignored.
-     */
-    public void setFitScale(boolean onlyZoomOut, boolean allowZoomIn) {
-        ImageOverlay imageOverlay = getImageOverlay();
-        if (imageOverlay == null) {
-            return;
-        }
-        Image image = imageOverlay.getImage();
-        if (image != null) {
-            Rectangle canvasSize = getClientArea();
-            int canvasWidth = canvasSize.width;
-            int canvasHeight = canvasSize.height;
-
-            boolean hasPreviews = mPreviewManager.hasPreviews();
-            if (hasPreviews) {
-                canvasWidth = 2 * canvasWidth / 3;
-            } else {
-                canvasWidth -= 4;
-                canvasHeight -= 4;
-            }
-
-            ImageData imageData = image.getImageData();
-            int sceneWidth = imageData.width;
-            int sceneHeight = imageData.height;
-            if (sceneWidth == 0.0 || sceneHeight == 0.0) {
-                return;
-            }
-
-            if (imageOverlay.getShowDropShadow()) {
-                sceneWidth += 2 * ImageUtils.SHADOW_SIZE;
-                sceneHeight += 2 * ImageUtils.SHADOW_SIZE;
-            }
-
-            // Reduce the margins if necessary
-            int hDelta = canvasWidth - sceneWidth;
-            int hMargin = 0;
-            if (hDelta > 2 * CanvasTransform.DEFAULT_MARGIN) {
-                hMargin = CanvasTransform.DEFAULT_MARGIN;
-            } else if (hDelta > 0) {
-                hMargin = hDelta / 2;
-            }
-
-            int vDelta = canvasHeight - sceneHeight;
-            int vMargin = 0;
-            if (vDelta > 2 * CanvasTransform.DEFAULT_MARGIN) {
-                vMargin = CanvasTransform.DEFAULT_MARGIN;
-            } else if (vDelta > 0) {
-                vMargin = vDelta / 2;
-            }
-
-            double hScale = (canvasWidth - 2 * hMargin) / (double) sceneWidth;
-            double vScale = (canvasHeight - 2 * vMargin) / (double) sceneHeight;
-
-            double scale = Math.min(hScale, vScale);
-
-            if (onlyZoomOut) {
-                scale = Math.min(1.0, scale);
-            }
-
-            if (!allowZoomIn && scale > getScale()) {
-                return;
-            }
-
-            setScale(scale, true);
-        }
-    }
-
-    /**
-     * Transforms a point, expressed in layout coordinates, into "client" coordinates
-     * relative to the control (and not relative to the display).
-     *
-     * @param canvasX X in the canvas coordinates
-     * @param canvasY Y in the canvas coordinates
-     * @return A new {@link Point} in control client coordinates (not display coordinates)
-     */
-    Point layoutToControlPoint(int canvasX, int canvasY) {
-        int x = mHScale.translate(canvasX);
-        int y = mVScale.translate(canvasY);
-        return new Point(x, y);
-    }
-
-    /**
-     * Returns the action for the context menu corresponding to the given action id.
-     * <p/>
-     * For global actions such as copy or paste, the action id must be composed of
-     * the {@link #PREFIX_CANVAS_ACTION} followed by one of {@link ActionFactory}'s
-     * action ids.
-     * <p/>
-     * Returns null if there's no action for the given id.
-     */
-    IAction getAction(String actionId) {
-        String prefix = PREFIX_CANVAS_ACTION;
-        if (mMenuManager == null ||
-                actionId == null ||
-                !actionId.startsWith(prefix)) {
-            return null;
-        }
-
-        actionId = actionId.substring(prefix.length());
-
-        for (IContributionItem contrib : mMenuManager.getItems()) {
-            if (contrib instanceof ActionContributionItem &&
-                    actionId.equals(contrib.getId())) {
-                return ((ActionContributionItem) contrib).getAction();
-            }
-        }
-
-        return null;
-    }
-
-    //---------------
-
-    /**
-     * Paints the canvas in response to paint events.
-     */
-    private void onPaint(PaintEvent e) {
-        GC gc = e.gc;
-        gc.setFont(mFont);
-        mGCWrapper.setGC(gc);
-        try {
-            if (!mImageOverlay.isHiding()) {
-                mImageOverlay.paint(gc);
-            }
-
-            mPreviewManager.paint(gc);
-
-            if (mShowOutline) {
-                if (mOutlineOverlay == null) {
-                    mOutlineOverlay = new OutlineOverlay(mViewHierarchy, mHScale, mVScale);
-                    mOutlineOverlay.create(getDisplay());
-                }
-                if (!mOutlineOverlay.isHiding()) {
-                    mOutlineOverlay.paint(gc);
-                }
-            }
-
-            if (mShowInvisible) {
-                if (mEmptyOverlay == null) {
-                    mEmptyOverlay = new EmptyViewsOverlay(mViewHierarchy, mHScale, mVScale);
-                    mEmptyOverlay.create(getDisplay());
-                }
-                if (!mEmptyOverlay.isHiding()) {
-                    mEmptyOverlay.paint(gc);
-                }
-            }
-
-            if (!mHoverOverlay.isHiding()) {
-                mHoverOverlay.paint(gc);
-            }
-
-            if (!mLintOverlay.isHiding()) {
-                mLintOverlay.paint(gc);
-            }
-
-            if (!mIncludeOverlay.isHiding()) {
-                mIncludeOverlay.paint(gc);
-            }
-
-            if (!mSelectionOverlay.isHiding()) {
-                mSelectionOverlay.paint(mSelectionManager, mGCWrapper, gc, mRulesEngine);
-            }
-            mGestureManager.paint(gc);
-
-        } finally {
-            mGCWrapper.setGC(null);
-        }
-    }
-
-    /**
-     * Shows or hides invisible parent views, which are views which have empty bounds and
-     * no children. The nodes which will be shown are provided by
-     * {@link #getNodesToExplode()}.
-     *
-     * @param show When true, any invisible parent nodes are padded and highlighted
-     *            ("exploded"), and when false any formerly exploded nodes are hidden.
-     */
-    void showInvisibleViews(boolean show) {
-        if (mShowInvisible == show) {
-            return;
-        }
-        mShowInvisible = show;
-
-        // Optimization: Avoid doing work when we don't have invisible parents (on show)
-        // or formerly exploded nodes (on hide).
-        if (show && !mViewHierarchy.hasInvisibleParents()) {
-            return;
-        } else if (!show && !mViewHierarchy.hasExplodedParents()) {
-            return;
-        }
-
-        mEditorDelegate.recomputeLayout();
-    }
-
-    /**
-     * Returns a set of nodes that should be exploded (forced non-zero padding during render),
-     * or null if no nodes should be exploded. (Note that this is independent of the
-     * explode-all mode, where all nodes are padded -- that facility does not use this
-     * mechanism, which is only intended to be used to expose invisible parent nodes.
-     *
-     * @return The set of invisible parents, or null if no views should be expanded.
-     */
-    public Set<UiElementNode> getNodesToExplode() {
-        if (mShowInvisible) {
-            return mViewHierarchy.getInvisibleNodes();
-        }
-
-        // IF we have selection, and IF we have invisible nodes in the view,
-        // see if any of the selected items are among the invisible nodes, and if so
-        // add them to a lazily constructed set which we pass back for rendering.
-        Set<UiElementNode> result = null;
-        List<SelectionItem> selections = mSelectionManager.getSelections();
-        if (selections.size() > 0) {
-            List<CanvasViewInfo> invisibleParents = mViewHierarchy.getInvisibleViews();
-            if (invisibleParents.size() > 0) {
-                for (SelectionItem item : selections) {
-                    CanvasViewInfo viewInfo = item.getViewInfo();
-                    // O(n^2) here, but both the selection size and especially the
-                    // invisibleParents size are expected to be small
-                    if (invisibleParents.contains(viewInfo)) {
-                        UiViewElementNode node = viewInfo.getUiViewNode();
-                        if (node != null) {
-                            if (result == null) {
-                                result = new HashSet<UiElementNode>();
-                            }
-                            result.add(node);
-                        }
-                    }
-                }
-            }
-        }
-
-        return result;
-    }
-
-    /**
-     * Clears the hover.
-     */
-    void clearHover() {
-        mHoverOverlay.clearHover();
-    }
-
-    /**
-     * Hover on top of a known child.
-     */
-    void hover(MouseEvent e) {
-        // Check if a button is pressed; no hovers during drags
-        if ((e.stateMask & SWT.BUTTON_MASK) != 0) {
-            clearHover();
-            return;
-        }
-
-        LayoutPoint p = ControlPoint.create(this, e).toLayout();
-        CanvasViewInfo vi = mViewHierarchy.findViewInfoAt(p);
-
-        // We don't hover on the root since it's not a widget per see and it is always there.
-        // We also skip spacers...
-        if (vi != null && (vi.isRoot() || vi.isHidden())) {
-            vi = null;
-        }
-
-        boolean needsUpdate = vi != mHoverViewInfo;
-        mHoverViewInfo = vi;
-
-        if (vi == null) {
-            clearHover();
-        } else {
-            Rectangle r = vi.getSelectionRect();
-            mHoverOverlay.setHover(r.x, r.y, r.width, r.height);
-        }
-
-        if (needsUpdate) {
-            redraw();
-        }
-    }
-
-    /**
-     * Shows the given {@link CanvasViewInfo}, which can mean exposing its XML or if it's
-     * an included element, its corresponding file.
-     *
-     * @param vi the {@link CanvasViewInfo} to be shown
-     */
-    public void show(CanvasViewInfo vi) {
-        String url = vi.getIncludeUrl();
-        if (url != null) {
-            showInclude(url);
-        } else {
-            showXml(vi);
-        }
-    }
-
-    /**
-     * Shows the layout file referenced by the given url in the same project.
-     *
-     * @param url The layout attribute url of the form @layout/foo
-     */
-    private void showInclude(String url) {
-        GraphicalEditorPart graphicalEditor = getGraphicalEditor();
-        IPath filePath = graphicalEditor.findResourceFile(url);
-        if (filePath == null) {
-            // Should not be possible - if the URL had been bad, then we wouldn't
-            // have been able to render the scene and you wouldn't have been able
-            // to click on it
-            return;
-        }
-
-        // Save the including file, if necessary: without it, the "Show Included In"
-        // facility which is invoked automatically will not work properly if the <include>
-        // tag is not in the saved version of the file, since the outer file is read from
-        // disk rather than from memory.
-        IEditorSite editorSite = graphicalEditor.getEditorSite();
-        IWorkbenchPage page = editorSite.getPage();
-        page.saveEditor(mEditorDelegate.getEditor(), false);
-
-        IWorkspaceRoot workspace = ResourcesPlugin.getWorkspace().getRoot();
-        IFile xmlFile = null;
-        IPath workspacePath = workspace.getLocation();
-        if (workspacePath.isPrefixOf(filePath)) {
-            IPath relativePath = filePath.makeRelativeTo(workspacePath);
-            xmlFile = (IFile) workspace.findMember(relativePath);
-        } else if (filePath.isAbsolute()) {
-            xmlFile = workspace.getFileForLocation(filePath);
-        }
-        if (xmlFile != null) {
-            IFile leavingFile = graphicalEditor.getEditedFile();
-            Reference next = Reference.create(graphicalEditor.getEditedFile());
-
-            try {
-                IEditorPart openAlready = EditorUtility.isOpenInEditor(xmlFile);
-
-                // Show the included file as included within this click source?
-                if (openAlready != null) {
-                    LayoutEditorDelegate delegate = LayoutEditorDelegate.fromEditor(openAlready);
-                    if (delegate != null) {
-                        GraphicalEditorPart gEditor = delegate.getGraphicalEditor();
-                        if (gEditor != null &&
-                                gEditor.renderingSupports(Capability.EMBEDDED_LAYOUT)) {
-                            gEditor.showIn(next);
-                        }
-                    }
-                } else {
-                    try {
-                        // Set initial state of a new file
-                        // TODO: Only set rendering target portion of the state
-                        String state = ConfigurationDescription.getDescription(leavingFile);
-                        xmlFile.setSessionProperty(GraphicalEditorPart.NAME_INITIAL_STATE,
-                                state);
-                    } catch (CoreException e) {
-                        // pass
-                    }
-
-                    if (graphicalEditor.renderingSupports(Capability.EMBEDDED_LAYOUT)) {
-                        try {
-                            xmlFile.setSessionProperty(GraphicalEditorPart.NAME_INCLUDE, next);
-                        } catch (CoreException e) {
-                            // pass - worst that can happen is that we don't
-                            //start with inclusion
-                        }
-                    }
-                }
-
-                EditorUtility.openInEditor(xmlFile, true);
-                return;
-            } catch (PartInitException ex) {
-                AdtPlugin.log(ex, "Can't open %$1s", url); //$NON-NLS-1$
-            }
-        } else {
-            // It's not a path in the workspace; look externally
-            // (this is probably an @android: path)
-            if (filePath.isAbsolute()) {
-                IFileStore fileStore = EFS.getLocalFileSystem().getStore(filePath);
-                // fileStore = fileStore.getChild(names[i]);
-                if (!fileStore.fetchInfo().isDirectory() && fileStore.fetchInfo().exists()) {
-                    try {
-                        IDE.openEditorOnFileStore(page, fileStore);
-                        return;
-                    } catch (PartInitException ex) {
-                        AdtPlugin.log(ex, "Can't open %$1s", url); //$NON-NLS-1$
-                    }
-                }
-            }
-        }
-
-        // Failed: display message to the user
-        String message = String.format("Could not find resource %1$s", url);
-        IStatusLineManager status = editorSite.getActionBars().getStatusLineManager();
-        status.setErrorMessage(message);
-        getDisplay().beep();
-    }
-
-    /**
-     * Returns the layout resource name of this layout
-     *
-     * @return the layout resource name of this layout
-     */
-    public String getLayoutResourceName() {
-        GraphicalEditorPart graphicalEditor = getGraphicalEditor();
-        return graphicalEditor.getLayoutResourceName();
-    }
-
-    /**
-     * Returns the layout resource url of the current layout
-     *
-     * @return
-     */
-    /*
-    public String getMe() {
-        GraphicalEditorPart graphicalEditor = getGraphicalEditor();
-        IFile editedFile = graphicalEditor.getEditedFile();
-        return editedFile.getProjectRelativePath().toOSString();
-    }
-     */
-
-    /**
-     * Show the XML element corresponding to the given {@link CanvasViewInfo} (unless it's
-     * a root).
-     *
-     * @param vi The clicked {@link CanvasViewInfo} whose underlying XML element we want
-     *            to view
-     */
-    private void showXml(CanvasViewInfo vi) {
-        // Warp to the text editor and show the corresponding XML for the
-        // double-clicked widget
-        if (vi.isRoot()) {
-            return;
-        }
-
-        Node xmlNode = vi.getXmlNode();
-        if (xmlNode != null) {
-            boolean found = mEditorDelegate.getEditor().show(xmlNode);
-            if (!found) {
-                getDisplay().beep();
-            }
-        }
-    }
-
-    //---------------
-
-    /**
-     * Helper to create the drag source for the given control.
-     * <p/>
-     * This is static with package-access so that {@link OutlinePage} can also
-     * create an exact copy of the source with the same attributes.
-     */
-    /* package */static DragSource createDragSource(Control control) {
-        DragSource source = new DragSource(control, DND.DROP_COPY | DND.DROP_MOVE);
-        source.setTransfer(new Transfer[] {
-                TextTransfer.getInstance(),
-                SimpleXmlTransfer.getInstance()
-        });
-        return source;
-    }
-
-    /**
-     * Helper to create the drop target for the given control.
-     */
-    private static DropTarget createDropTarget(Control control) {
-        DropTarget dropTarget = new DropTarget(
-                control, DND.DROP_COPY | DND.DROP_MOVE | DND.DROP_DEFAULT);
-        dropTarget.setTransfer(new Transfer[] {
-            SimpleXmlTransfer.getInstance()
-        });
-        return dropTarget;
-    }
-
-    //---------------
-
-    /**
-     * Invoked by the constructor to add our cut/copy/paste/delete/select-all
-     * handlers in the global action handlers of this editor's site.
-     * <p/>
-     * This will enable the menu items under the global Edit menu and make them
-     * invoke our actions as needed. As a benefit, the corresponding shortcut
-     * accelerators will do what one would expect.
-     */
-    private void setupGlobalActionHandlers() {
-        mCutAction = new Action() {
-            @Override
-            public void run() {
-                mClipboardSupport.cutSelectionToClipboard(mSelectionManager.getSnapshot());
-                updateMenuActionState();
-            }
-        };
-
-        copyActionAttributes(mCutAction, ActionFactory.CUT);
-
-        mCopyAction = new Action() {
-            @Override
-            public void run() {
-                mClipboardSupport.copySelectionToClipboard(mSelectionManager.getSnapshot());
-                updateMenuActionState();
-            }
-        };
-
-        copyActionAttributes(mCopyAction, ActionFactory.COPY);
-
-        mPasteAction = new Action() {
-            @Override
-            public void run() {
-                mClipboardSupport.pasteSelection(mSelectionManager.getSnapshot());
-                updateMenuActionState();
-            }
-        };
-
-        copyActionAttributes(mPasteAction, ActionFactory.PASTE);
-
-        mDeleteAction = new Action() {
-            @Override
-            public void run() {
-                mClipboardSupport.deleteSelection(
-                        getDeleteLabel(),
-                        mSelectionManager.getSnapshot());
-            }
-        };
-
-        copyActionAttributes(mDeleteAction, ActionFactory.DELETE);
-
-        mSelectAllAction = new Action() {
-            @Override
-            public void run() {
-                GraphicalEditorPart graphicalEditor = getEditorDelegate().getGraphicalEditor();
-                StyledText errorLabel = graphicalEditor.getErrorLabel();
-                if (errorLabel.isFocusControl()) {
-                    errorLabel.selectAll();
-                    return;
-                }
-
-                mSelectionManager.selectAll();
-            }
-        };
-
-        copyActionAttributes(mSelectAllAction, ActionFactory.SELECT_ALL);
-    }
-
-    String getCutLabel() {
-        return mCutAction.getText();
-    }
-
-    String getDeleteLabel() {
-        // verb "Delete" from the DELETE action's title
-        return mDeleteAction.getText();
-    }
-
-    /**
-     * Updates menu actions that depends on the selection.
-     */
-    void updateMenuActionState() {
-        List<SelectionItem> selections = getSelectionManager().getSelections();
-        boolean hasSelection = !selections.isEmpty();
-        if (hasSelection && selections.size() == 1 && selections.get(0).isRoot()) {
-            hasSelection = false;
-        }
-
-        StyledText errorLabel = getGraphicalEditor().getErrorLabel();
-        mCutAction.setEnabled(hasSelection);
-        mCopyAction.setEnabled(hasSelection || errorLabel.getSelectionCount() > 0);
-        mDeleteAction.setEnabled(hasSelection);
-        // Select All should *always* be selectable, regardless of whether anything
-        // is currently selected.
-        mSelectAllAction.setEnabled(true);
-
-        // The paste operation is only available if we can paste our custom type.
-        // We do not currently support pasting random text (e.g. XML). Maybe later.
-        boolean hasSxt = mClipboardSupport.hasSxtOnClipboard();
-        mPasteAction.setEnabled(hasSxt);
-    }
-
-    /**
-     * Update the actions when this editor is activated
-     *
-     * @param bars the action bar for this canvas
-     */
-    public void updateGlobalActions(@NonNull IActionBars bars) {
-        updateMenuActionState();
-
-        ITextEditor editor = mEditorDelegate.getEditor().getStructuredTextEditor();
-        boolean graphical = getEditorDelegate().getEditor().getActivePage() == 0;
-        if (graphical) {
-            bars.setGlobalActionHandler(ActionFactory.CUT.getId(), mCutAction);
-            bars.setGlobalActionHandler(ActionFactory.COPY.getId(), mCopyAction);
-            bars.setGlobalActionHandler(ActionFactory.PASTE.getId(), mPasteAction);
-            bars.setGlobalActionHandler(ActionFactory.DELETE.getId(), mDeleteAction);
-            bars.setGlobalActionHandler(ActionFactory.SELECT_ALL.getId(), mSelectAllAction);
-
-            // Delegate the Undo and Redo actions to the text editor ones, but wrap them
-            // such that we run lint to update the results on the current page (this is
-            // normally done on each editor operation that goes through
-            // {@link AndroidXmlEditor#wrapUndoEditXmlModel}, but not undo/redo)
-            if (mUndoAction == null) {
-                IAction undoAction = editor.getAction(ActionFactory.UNDO.getId());
-                mUndoAction = new LintEditAction(undoAction, getEditorDelegate().getEditor());
-            }
-            bars.setGlobalActionHandler(ActionFactory.UNDO.getId(), mUndoAction);
-            if (mRedoAction == null) {
-                IAction redoAction = editor.getAction(ActionFactory.REDO.getId());
-                mRedoAction = new LintEditAction(redoAction, getEditorDelegate().getEditor());
-            }
-            bars.setGlobalActionHandler(ActionFactory.REDO.getId(), mRedoAction);
-        } else {
-            bars.setGlobalActionHandler(ActionFactory.CUT.getId(),
-                    editor.getAction(ActionFactory.CUT.getId()));
-            bars.setGlobalActionHandler(ActionFactory.COPY.getId(),
-                    editor.getAction(ActionFactory.COPY.getId()));
-            bars.setGlobalActionHandler(ActionFactory.PASTE.getId(),
-                    editor.getAction(ActionFactory.PASTE.getId()));
-            bars.setGlobalActionHandler(ActionFactory.DELETE.getId(),
-                    editor.getAction(ActionFactory.DELETE.getId()));
-            bars.setGlobalActionHandler(ActionFactory.SELECT_ALL.getId(),
-                    editor.getAction(ActionFactory.SELECT_ALL.getId()));
-            bars.setGlobalActionHandler(ActionFactory.UNDO.getId(),
-                    editor.getAction(ActionFactory.UNDO.getId()));
-            bars.setGlobalActionHandler(ActionFactory.REDO.getId(),
-                    editor.getAction(ActionFactory.REDO.getId()));
-        }
-
-        bars.updateActionBars();
-    }
-
-    /**
-     * Helper for {@link #setupGlobalActionHandlers()}.
-     * Copies the action attributes form the given {@link ActionFactory}'s action to
-     * our action.
-     * <p/>
-     * {@link ActionFactory} provides access to the standard global actions in Eclipse.
-     * <p/>
-     * This allows us to grab the standard labels and icons for the
-     * global actions such as copy, cut, paste, delete and select-all.
-     */
-    private void copyActionAttributes(Action action, ActionFactory factory) {
-        IWorkbenchAction wa = factory.create(
-                mEditorDelegate.getEditor().getEditorSite().getWorkbenchWindow());
-        action.setId(wa.getId());
-        action.setText(wa.getText());
-        action.setEnabled(wa.isEnabled());
-        action.setDescription(wa.getDescription());
-        action.setToolTipText(wa.getToolTipText());
-        action.setAccelerator(wa.getAccelerator());
-        action.setActionDefinitionId(wa.getActionDefinitionId());
-        action.setImageDescriptor(wa.getImageDescriptor());
-        action.setHoverImageDescriptor(wa.getHoverImageDescriptor());
-        action.setDisabledImageDescriptor(wa.getDisabledImageDescriptor());
-        action.setHelpListener(wa.getHelpListener());
-    }
-
-    /**
-     * Creates the context menu for the canvas. This is called once from the canvas' constructor.
-     * <p/>
-     * The menu has a static part with actions that are always available such as
-     * copy, cut, paste and show in > explorer. This is created by
-     * {@link #setupStaticMenuActions(IMenuManager)}.
-     * <p/>
-     * There's also a dynamic part that is populated by the rules of the
-     * selected elements, created by {@link DynamicContextMenu}.
-     */
-    @SuppressWarnings("unused")
-    private void createContextMenu() {
-
-        // This manager is the root of the context menu.
-        mMenuManager = new MenuManager() {
-            @Override
-            public boolean isDynamic() {
-                return true;
-            }
-        };
-
-        // Fill the menu manager with the static & dynamic actions
-        setupStaticMenuActions(mMenuManager);
-        new DynamicContextMenu(mEditorDelegate, this, mMenuManager);
-        Menu menu = mMenuManager.createContextMenu(this);
-        setMenu(menu);
-
-        // Add listener to detect when the menu is about to be posted, such that
-        // we can sync the selection. Without this, you can right click on something
-        // in the canvas which is NOT selected, and the context menu will show items related
-        // to the selection, NOT the item you clicked on!!
-        addMenuDetectListener(new MenuDetectListener() {
-            @Override
-            public void menuDetected(MenuDetectEvent e) {
-                mSelectionManager.menuClick(e);
-            }
-        });
-    }
-
-    /**
-     * Invoked by {@link #createContextMenu()} to create our *static* context menu once.
-     * <p/>
-     * The content of the menu itself does not change. However the state of the
-     * various items is controlled by their associated actions.
-     * <p/>
-     * For cut/copy/paste/delete/select-all, we explicitly reuse the actions
-     * created by {@link #setupGlobalActionHandlers()}, so this method must be
-     * invoked after that one.
-     */
-    private void setupStaticMenuActions(IMenuManager manager) {
-        manager.removeAll();
-
-        manager.add(new SelectionManager.SelectionMenu(getGraphicalEditor()));
-        manager.add(new Separator());
-        manager.add(mCutAction);
-        manager.add(mCopyAction);
-        manager.add(mPasteAction);
-        manager.add(new Separator());
-        manager.add(mDeleteAction);
-        manager.add(new Separator());
-        manager.add(new PlayAnimationMenu(this));
-        manager.add(new ExportScreenshotAction(this));
-        manager.add(new Separator());
-
-        // Group "Show Included In" and "Show In" together
-        manager.add(new ShowWithinMenu(mEditorDelegate));
-
-        // Create a "Show In" sub-menu and automatically populate it using standard
-        // actions contributed by the workbench.
-        String showInLabel = IDEWorkbenchMessages.Workbench_showIn;
-        MenuManager showInSubMenu = new MenuManager(showInLabel);
-        showInSubMenu.add(
-                ContributionItemFactory.VIEWS_SHOW_IN.create(
-                        mEditorDelegate.getEditor().getSite().getWorkbenchWindow()));
-        manager.add(showInSubMenu);
-    }
-
-    /**
-     * Deletes the selection. Equivalent to pressing the Delete key.
-     */
-    void delete() {
-        mDeleteAction.run();
-    }
-
-    /**
-     * Add new root in an existing empty XML layout.
-     * <p/>
-     * In case of error (unknown FQCN, document not empty), silently do nothing.
-     * In case of success, the new element will have some default attributes set
-     * (xmlns:android, layout_width and height). The edit is wrapped in a proper
-     * undo.
-     * <p/>
-     * This is invoked by
-     * {@link MoveGesture#drop(org.eclipse.swt.dnd.DropTargetEvent)}.
-     *
-     * @param root A non-null descriptor of the root element to create.
-     */
-    void createDocumentRoot(final @NonNull SimpleElement root) {
-        String rootFqcn = root.getFqcn();
-
-        // Need a valid empty document to create the new root
-        final UiDocumentNode uiDoc = mEditorDelegate.getUiRootNode();
-        if (uiDoc == null || uiDoc.getUiChildren().size() > 0) {
-            debugPrintf("Failed to create document root for %1$s: document is not empty",
-                    rootFqcn);
-            return;
-        }
-
-        // Find the view descriptor matching our FQCN
-        final ViewElementDescriptor viewDesc = mEditorDelegate.getFqcnViewDescriptor(rootFqcn);
-        if (viewDesc == null) {
-            // TODO this could happen if dropping a custom view not known in this project
-            debugPrintf("Failed to add document root, unknown FQCN %1$s", rootFqcn);
-            return;
-        }
-
-        // Get the last segment of the FQCN for the undo title
-        String title = rootFqcn;
-        int pos = title.lastIndexOf('.');
-        if (pos > 0 && pos < title.length() - 1) {
-            title = title.substring(pos + 1);
-        }
-        title = String.format("Create root %1$s in document", title);
-
-        mEditorDelegate.getEditor().wrapUndoEditXmlModel(title, new Runnable() {
-            @Override
-            public void run() {
-                UiElementNode uiNew = uiDoc.appendNewUiChild(viewDesc);
-
-                // A root node requires the Android XMLNS
-                uiNew.setAttributeValue(
-                        SdkConstants.ANDROID_NS_NAME,
-                        SdkConstants.XMLNS_URI,
-                        SdkConstants.NS_RESOURCES,
-                        true /*override*/);
-
-                IDragAttribute[] attributes = root.getAttributes();
-                if (attributes != null) {
-                    for (IDragAttribute attribute : attributes) {
-                        String uri = attribute.getUri();
-                        String name = attribute.getName();
-                        String value = attribute.getValue();
-                        uiNew.setAttributeValue(name, uri, value, false /*override*/);
-                    }
-                }
-
-                // Adjust the attributes
-                DescriptorsUtils.setDefaultLayoutAttributes(uiNew, false /*updateLayout*/);
-
-                uiNew.createXmlNode();
-            }
-        });
-    }
-
-    /**
-     * Returns the insets associated with views of the given fully qualified name, for the
-     * current theme and screen type.
-     *
-     * @param fqcn the fully qualified name to the widget type
-     * @return the insets, or null if unknown
-     */
-    public Margins getInsets(String fqcn) {
-        if (ViewMetadataRepository.INSETS_SUPPORTED) {
-            ConfigurationChooser configComposite = getGraphicalEditor().getConfigurationChooser();
-            String theme = configComposite.getThemeName();
-            Density density = configComposite.getConfiguration().getDensity();
-            return ViewMetadataRepository.getInsets(fqcn, density, theme);
-        } else {
-            return null;
-        }
-    }
-
-    private void debugPrintf(String message, Object... params) {
-        if (DEBUG) {
-            AdtPlugin.printToConsole("Canvas", String.format(message, params));
-        }
-    }
-
-    /** The associated editor has been deactivated */
-    public void deactivated() {
-        // Force the tooltip to be hidden. If you switch from the layout editor
-        // to a Java editor with the keyboard, the tooltip can stay open.
-        if (mLintTooltipManager != null) {
-            mLintTooltipManager.hide();
-        }
-    }
-
-    /** @see #setPreview(RenderPreview) */
-    private RenderPreview mPreview;
-
-    /**
-     * Sets the {@link RenderPreview} associated with the currently rendering
-     * configuration.
-     * <p>
-     * A {@link RenderPreview} has various additional state beyond its rendering,
-     * such as its display name (which can be edited by the user). When you click on
-     * previews, the layout editor switches to show the given configuration preview.
-     * The preview is then no longer shown in the list of previews and is instead rendered
-     * in the main editor. However, when you then switch away to some other preview, we
-     * want to be able to restore the preview with all its state.
-     *
-     * @param preview the preview associated with the current canvas
-     */
-    public void setPreview(@Nullable RenderPreview preview) {
-        mPreview = preview;
-    }
-
-    /**
-     * Returns the {@link RenderPreview} associated with this layout canvas.
-     *
-     * @see #setPreview(RenderPreview)
-     * @return the {@link RenderPreview}
-     */
-    @Nullable
-    public RenderPreview getPreview() {
-        return mPreview;
-    }
-
-    /** Ensures that the configuration previews are up to date for this canvas */
-    public void syncPreviewMode() {
-        if (mImageOverlay != null && mImageOverlay.getImage() != null &&
-            getGraphicalEditor().getConfigurationChooser().getResources() != null) {
-            if (mPreviewManager.recomputePreviews(false)) {
-                // Zoom when syncing modes
-                mZoomFitNextImage = true;
-                ensureZoomed();
-            }
-        }
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/LayoutCanvasViewer.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/LayoutCanvasViewer.java
deleted file mode 100644
index e349a1c..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/LayoutCanvasViewer.java
+++ /dev/null
@@ -1,165 +0,0 @@
-/*
- * Copyright (C) 2010 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.editors.layout.gle2;
-
-import com.android.ide.eclipse.adt.internal.editors.layout.LayoutEditorDelegate;
-import com.android.ide.eclipse.adt.internal.editors.layout.gre.RulesEngine;
-
-import org.eclipse.core.runtime.ListenerList;
-import org.eclipse.jface.util.SafeRunnable;
-import org.eclipse.jface.viewers.IPostSelectionProvider;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.ISelectionProvider;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.TreePath;
-import org.eclipse.jface.viewers.TreeSelection;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-
-
-/**
- * JFace {@link Viewer} wrapper around {@link LayoutCanvas}.
- * <p/>
- * The viewer is owned by {@link GraphicalEditorPart}.
- * <p/>
- * The viewer is an {@link ISelectionProvider} instance and is set as the
- * site's main {@link ISelectionProvider} by the editor part. Consequently
- * canvas' selection changes are broadcasted to anyone listening, which includes
- * the part itself as well as the associated outline and property sheet pages.
- */
-class LayoutCanvasViewer extends Viewer implements IPostSelectionProvider {
-
-    private LayoutCanvas mCanvas;
-    private final LayoutEditorDelegate mEditorDelegate;
-
-    public LayoutCanvasViewer(LayoutEditorDelegate editorDelegate,
-            RulesEngine rulesEngine,
-            Composite parent,
-            int style) {
-        mEditorDelegate = editorDelegate;
-        mCanvas = new LayoutCanvas(editorDelegate, rulesEngine, parent, style);
-
-        mCanvas.getSelectionManager().addSelectionChangedListener(mSelectionListener);
-    }
-
-    private ISelectionChangedListener mSelectionListener = new ISelectionChangedListener() {
-        @Override
-        public void selectionChanged(SelectionChangedEvent event) {
-            fireSelectionChanged(event);
-            firePostSelectionChanged(event);
-        }
-    };
-
-    @Override
-    public Control getControl() {
-        return mCanvas;
-    }
-
-    /**
-     * Returns the underlying {@link LayoutCanvas}.
-     * This is the same control as returned by {@link #getControl()} but clients
-     * have it already casted in the right type.
-     * <p/>
-     * This can never be null.
-     * @return The underlying {@link LayoutCanvas}.
-     */
-    public LayoutCanvas getCanvas() {
-        return mCanvas;
-    }
-
-    /**
-     * Returns the current layout editor's input.
-     */
-    @Override
-    public Object getInput() {
-        return mEditorDelegate.getEditor().getEditorInput();
-    }
-
-    /**
-     * Unused. We don't support switching the input.
-     */
-    @Override
-    public void setInput(Object input) {
-    }
-
-    /**
-     * Returns a new {@link TreeSelection} where each {@link TreePath} item
-     * is a {@link CanvasViewInfo}.
-     */
-    @Override
-    public ISelection getSelection() {
-        return mCanvas.getSelectionManager().getSelection();
-    }
-
-    /**
-     * Sets a new selection. <code>reveal</code> is ignored right now.
-     * <p/>
-     * The selection can be null, which is interpreted as an empty selection.
-     */
-    @Override
-    public void setSelection(ISelection selection, boolean reveal) {
-        if (mEditorDelegate.getEditor().getIgnoreXmlUpdate()) {
-            return;
-        }
-        mCanvas.getSelectionManager().setSelection(selection);
-    }
-
-    /** Unused. Refreshing is done solely by the owning {@link LayoutEditorDelegate}. */
-    @Override
-    public void refresh() {
-        // ignore
-    }
-
-    public void dispose() {
-        if (mSelectionListener != null) {
-            mCanvas.getSelectionManager().removeSelectionChangedListener(mSelectionListener);
-        }
-        if (mCanvas != null) {
-            mCanvas.dispose();
-            mCanvas = null;
-        }
-    }
-
-    // ---- Implements IPostSelectionProvider ----
-
-    private ListenerList mPostChangedListeners = new ListenerList();
-
-    @Override
-    public void addPostSelectionChangedListener(ISelectionChangedListener listener) {
-        mPostChangedListeners.add(listener);
-    }
-
-    @Override
-    public void removePostSelectionChangedListener(ISelectionChangedListener listener) {
-        mPostChangedListeners.remove(listener);
-    }
-
-    protected void firePostSelectionChanged(final SelectionChangedEvent event) {
-        Object[] listeners = mPostChangedListeners.getListeners();
-        for (int i = 0; i < listeners.length; i++) {
-            final ISelectionChangedListener l = (ISelectionChangedListener) listeners[i];
-            SafeRunnable.run(new SafeRunnable() {
-                @Override
-                public void run() {
-                    l.selectionChanged(event);
-                }
-            });
-        }
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/LayoutMetadata.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/LayoutMetadata.java
deleted file mode 100644
index b79e3b0..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/LayoutMetadata.java
+++ /dev/null
@@ -1,413 +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.eclipse.adt.internal.editors.layout.gle2;
-
-import static com.android.SdkConstants.ANDROID_LAYOUT_RESOURCE_PREFIX;
-import static com.android.SdkConstants.ANDROID_URI;
-import static com.android.SdkConstants.ATTR_NUM_COLUMNS;
-import static com.android.SdkConstants.EXPANDABLE_LIST_VIEW;
-import static com.android.SdkConstants.GRID_VIEW;
-import static com.android.SdkConstants.LAYOUT_RESOURCE_PREFIX;
-import static com.android.SdkConstants.TOOLS_URI;
-import static com.android.SdkConstants.VALUE_AUTO_FIT;
-
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-import com.android.ide.common.rendering.api.AdapterBinding;
-import com.android.ide.common.rendering.api.DataBindingItem;
-import com.android.ide.common.rendering.api.ResourceReference;
-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.layout.ProjectCallback;
-import com.android.ide.eclipse.adt.internal.editors.layout.uimodel.UiViewElementNode;
-import com.android.ide.eclipse.adt.internal.preferences.AdtPrefs;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.progress.WorkbenchJob;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-import org.xmlpull.v1.XmlPullParser;
-
-import java.util.Collection;
-import java.util.List;
-import java.util.Map;
-
-/**
- * Design-time metadata lookup for layouts, such as fragment and AdapterView bindings.
- */
-public class LayoutMetadata {
-    /** The default layout to use for list items in expandable list views */
-    public static final String DEFAULT_EXPANDABLE_LIST_ITEM = "simple_expandable_list_item_2"; //$NON-NLS-1$
-    /** The default layout to use for list items in plain list views */
-    public static final String DEFAULT_LIST_ITEM = "simple_list_item_2"; //$NON-NLS-1$
-    /** The default layout to use for list items in spinners */
-    public static final String DEFAULT_SPINNER_ITEM = "simple_spinner_item"; //$NON-NLS-1$
-
-    /** The string to start metadata comments with */
-    private static final String COMMENT_PROLOGUE = " Preview: ";
-    /** The property key, included in comments, which references a list item layout */
-    public static final String KEY_LV_ITEM = "listitem";        //$NON-NLS-1$
-    /** The property key, included in comments, which references a list header layout */
-    public static final String KEY_LV_HEADER = "listheader";    //$NON-NLS-1$
-    /** The property key, included in comments, which references a list footer layout */
-    public static final String KEY_LV_FOOTER = "listfooter";    //$NON-NLS-1$
-    /** The property key, included in comments, which references a fragment layout to show */
-    public static final String KEY_FRAGMENT_LAYOUT = "layout";        //$NON-NLS-1$
-    // NOTE: If you add additional keys related to resources, make sure you update the
-    // ResourceRenameParticipant
-
-    /** Utility class, do not create instances */
-    private LayoutMetadata() {
-    }
-
-    /**
-     * Returns the given property specified in the <b>current</b> element being
-     * processed by the given pull parser.
-     *
-     * @param parser the pull parser, which must be in the middle of processing
-     *            the target element
-     * @param name the property name to look up
-     * @return the property value, or null if not defined
-     */
-    @Nullable
-    public static String getProperty(@NonNull XmlPullParser parser, @NonNull String name) {
-        String value = parser.getAttributeValue(TOOLS_URI, name);
-        if (value != null && value.isEmpty()) {
-            value = null;
-        }
-
-        return value;
-    }
-
-    /**
-     * Clears the old metadata from the given node
-     *
-     * @param node the XML node to associate metadata with
-     * @deprecated this method clears metadata using the old comment-based style;
-     *             should only be used for migration at this point
-     */
-    @Deprecated
-    public static void clearLegacyComment(Node node) {
-        NodeList children = node.getChildNodes();
-        for (int i = 0, n = children.getLength(); i < n; i++) {
-            Node child = children.item(i);
-            if (child.getNodeType() == Node.COMMENT_NODE) {
-                String text = child.getNodeValue();
-                if (text.startsWith(COMMENT_PROLOGUE)) {
-                    Node commentNode = child;
-                    // Remove the comment, along with surrounding whitespace if applicable
-                    Node previous = commentNode.getPreviousSibling();
-                    if (previous != null && previous.getNodeType() == Node.TEXT_NODE) {
-                        if (previous.getNodeValue().trim().length() == 0) {
-                            node.removeChild(previous);
-                        }
-                    }
-                    node.removeChild(commentNode);
-                    Node first = node.getFirstChild();
-                    if (first != null && first.getNextSibling() == null
-                            && first.getNodeType() == Node.TEXT_NODE) {
-                        if (first.getNodeValue().trim().length() == 0) {
-                            node.removeChild(first);
-                        }
-                    }
-                }
-            }
-        }
-    }
-
-    /**
-     * Returns the given property of the given DOM node, or null
-     *
-     * @param node the XML node to associate metadata with
-     * @param name the name of the property to look up
-     * @return the value stored with the given node and name, or null
-     */
-    @Nullable
-    public static String getProperty(
-            @NonNull Node node,
-            @NonNull String name) {
-        if (node.getNodeType() == Node.ELEMENT_NODE) {
-            Element element = (Element) node;
-            String value = element.getAttributeNS(TOOLS_URI, name);
-            if (value != null && value.isEmpty()) {
-                value = null;
-            }
-
-            return value;
-        }
-
-        return null;
-    }
-
-    /**
-     * Sets the given property of the given DOM node to a given value, or if null clears
-     * the property.
-     *
-     * @param editor the editor associated with the property
-     * @param node the XML node to associate metadata with
-     * @param name the name of the property to set
-     * @param value the value to store for the given node and name, or null to remove it
-     */
-    public static void setProperty(
-            @NonNull final AndroidXmlEditor editor,
-            @NonNull final Node node,
-            @NonNull final String name,
-            @Nullable final String value) {
-        // Clear out the old metadata
-        clearLegacyComment(node);
-
-        if (node.getNodeType() == Node.ELEMENT_NODE) {
-            final Element element = (Element) node;
-            final String undoLabel = "Bind View";
-            AdtUtils.setToolsAttribute(editor, element, undoLabel, name, value,
-                    false /*reveal*/, false /*append*/);
-
-            // Also apply the same layout to any corresponding elements in other configurations
-            // of this layout.
-            final IFile file = editor.getInputFile();
-            if (file != null) {
-                final List<IFile> variations = AdtUtils.getResourceVariations(file, false);
-                if (variations.isEmpty()) {
-                    return;
-                }
-                Display display = AdtPlugin.getDisplay();
-                WorkbenchJob job = new WorkbenchJob(display, "Update alternate views") {
-                    @Override
-                    public IStatus runInUIThread(IProgressMonitor monitor) {
-                        for (IFile variation : variations) {
-                            if (variation.equals(file)) {
-                                continue;
-                            }
-                            try {
-                                // If the corresponding file is open in the IDE, use the
-                                // editor version instead
-                                if (!AdtPrefs.getPrefs().isSharedLayoutEditor()) {
-                                    if (setPropertyInEditor(undoLabel, variation, element, name,
-                                            value)) {
-                                        return Status.OK_STATUS;
-                                    }
-                                }
-
-                                boolean old = editor.getIgnoreXmlUpdate();
-                                try {
-                                    editor.setIgnoreXmlUpdate(true);
-                                    setPropertyInFile(undoLabel, variation, element, name, value);
-                                } finally {
-                                    editor.setIgnoreXmlUpdate(old);
-                                }
-                            } catch (Exception e) {
-                                AdtPlugin.log(e, variation.getFullPath().toOSString());
-                            }
-                        }
-                        return Status.OK_STATUS;
-                    }
-
-                };
-                job.setSystem(true);
-                job.schedule();
-            }
-        }
-    }
-
-    private static boolean setPropertyInEditor(
-            @NonNull String undoLabel,
-            @NonNull IFile variation,
-            @NonNull final Element equivalentElement,
-            @NonNull final String name,
-            @Nullable final String value) {
-        Collection<IEditorPart> editors =
-                AdtUtils.findEditorsFor(variation, false /*restore*/);
-        for (IEditorPart part : editors) {
-            AndroidXmlEditor editor = AdtUtils.getXmlEditor(part);
-            if (editor != null) {
-                Document doc = DomUtilities.getDocument(editor);
-                if (doc != null) {
-                    Element element = DomUtilities.findCorresponding(equivalentElement, doc);
-                    if (element != null) {
-                        AdtUtils.setToolsAttribute(editor, element, undoLabel, name,
-                                value, false /*reveal*/, false /*append*/);
-                        if (part instanceof GraphicalEditorPart) {
-                            GraphicalEditorPart g = (GraphicalEditorPart) part;
-                            g.recomputeLayout();
-                            g.getCanvasControl().redraw();
-                        }
-                        return true;
-                    }
-                }
-            }
-        }
-
-        return false;
-    }
-
-    private static boolean setPropertyInFile(
-            @NonNull String undoLabel,
-            @NonNull IFile variation,
-            @NonNull final Element element,
-            @NonNull final String name,
-            @Nullable final String value) {
-        Document doc = DomUtilities.getDocument(variation);
-        if (doc != null && element.getOwnerDocument() != doc) {
-            Element other = DomUtilities.findCorresponding(element, doc);
-            if (other != null) {
-                AdtUtils.setToolsAttribute(variation, other, undoLabel,
-                        name, value, false);
-
-                return true;
-            }
-        }
-
-        return false;
-    }
-
-    /** Strips out @layout/ or @android:layout/ from the given layout reference */
-    private static String stripLayoutPrefix(String layout) {
-        if (layout.startsWith(ANDROID_LAYOUT_RESOURCE_PREFIX)) {
-            layout = layout.substring(ANDROID_LAYOUT_RESOURCE_PREFIX.length());
-        } else if (layout.startsWith(LAYOUT_RESOURCE_PREFIX)) {
-            layout = layout.substring(LAYOUT_RESOURCE_PREFIX.length());
-        }
-
-        return layout;
-    }
-
-    /**
-     * Creates an {@link AdapterBinding} for the given view object, or null if the user
-     * has not yet chosen a target layout to use for the given AdapterView.
-     *
-     * @param viewObject the view object to create an adapter binding for
-     * @param map a map containing tools attribute metadata
-     * @return a binding, or null
-     */
-    @Nullable
-    public static AdapterBinding getNodeBinding(
-            @Nullable Object viewObject,
-            @NonNull Map<String, String> map) {
-        String header = map.get(KEY_LV_HEADER);
-        String footer = map.get(KEY_LV_FOOTER);
-        String layout = map.get(KEY_LV_ITEM);
-        if (layout != null || header != null || footer != null) {
-            int count = 12;
-            return getNodeBinding(viewObject, header, footer, layout, count);
-        }
-
-        return null;
-    }
-
-    /**
-     * Creates an {@link AdapterBinding} for the given view object, or null if the user
-     * has not yet chosen a target layout to use for the given AdapterView.
-     *
-     * @param viewObject the view object to create an adapter binding for
-     * @param uiNode the ui node corresponding to the view object
-     * @return a binding, or null
-     */
-    @Nullable
-    public static AdapterBinding getNodeBinding(
-            @Nullable Object viewObject,
-            @NonNull UiViewElementNode uiNode) {
-        Node xmlNode = uiNode.getXmlNode();
-
-        String header = getProperty(xmlNode, KEY_LV_HEADER);
-        String footer = getProperty(xmlNode, KEY_LV_FOOTER);
-        String layout = getProperty(xmlNode, KEY_LV_ITEM);
-        if (layout != null || header != null || footer != null) {
-            int count = 12;
-            // If we're dealing with a grid view, multiply the list item count
-            // by the number of columns to ensure we have enough items
-            if (xmlNode instanceof Element && xmlNode.getNodeName().endsWith(GRID_VIEW)) {
-                Element element = (Element) xmlNode;
-                String columns = element.getAttributeNS(ANDROID_URI, ATTR_NUM_COLUMNS);
-                int multiplier = 2;
-                if (columns != null && columns.length() > 0 &&
-                        !columns.equals(VALUE_AUTO_FIT)) {
-                    try {
-                        int c = Integer.parseInt(columns);
-                        if (c >= 1 && c <= 10) {
-                            multiplier = c;
-                        }
-                    } catch (NumberFormatException nufe) {
-                        // some unexpected numColumns value: just stick with 2 columns for
-                        // preview purposes
-                    }
-                }
-                count *= multiplier;
-            }
-
-            return getNodeBinding(viewObject, header, footer, layout, count);
-        }
-
-        return null;
-    }
-
-    private static AdapterBinding getNodeBinding(Object viewObject,
-            String header, String footer, String layout, int count) {
-        if (layout != null || header != null || footer != null) {
-            AdapterBinding binding = new AdapterBinding(count);
-
-            if (header != null) {
-                boolean isFramework = header.startsWith(ANDROID_LAYOUT_RESOURCE_PREFIX);
-                binding.addHeader(new ResourceReference(stripLayoutPrefix(header),
-                        isFramework));
-            }
-
-            if (footer != null) {
-                boolean isFramework = footer.startsWith(ANDROID_LAYOUT_RESOURCE_PREFIX);
-                binding.addFooter(new ResourceReference(stripLayoutPrefix(footer),
-                        isFramework));
-            }
-
-            if (layout != null) {
-                boolean isFramework = layout.startsWith(ANDROID_LAYOUT_RESOURCE_PREFIX);
-                if (isFramework) {
-                    layout = layout.substring(ANDROID_LAYOUT_RESOURCE_PREFIX.length());
-                } else if (layout.startsWith(LAYOUT_RESOURCE_PREFIX)) {
-                    layout = layout.substring(LAYOUT_RESOURCE_PREFIX.length());
-                }
-
-                binding.addItem(new DataBindingItem(layout, isFramework, 1));
-            } else if (viewObject != null) {
-                String listFqcn = ProjectCallback.getListAdapterViewFqcn(viewObject.getClass());
-                if (listFqcn != null) {
-                    if (listFqcn.endsWith(EXPANDABLE_LIST_VIEW)) {
-                        binding.addItem(
-                                new DataBindingItem(DEFAULT_EXPANDABLE_LIST_ITEM,
-                                true /* isFramework */, 1));
-                    } else {
-                        binding.addItem(
-                                new DataBindingItem(DEFAULT_LIST_ITEM,
-                                true /* isFramework */, 1));
-                    }
-                }
-            } else {
-                binding.addItem(
-                        new DataBindingItem(DEFAULT_LIST_ITEM,
-                        true /* isFramework */, 1));
-            }
-            return binding;
-        }
-
-        return null;
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/LayoutPoint.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/LayoutPoint.java
deleted file mode 100644
index 818b2c4..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/LayoutPoint.java
+++ /dev/null
@@ -1,156 +0,0 @@
-/*
- * Copyright (C) 2010 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.editors.layout.gle2;
-
-import com.android.ide.common.api.Point;
-
-import org.eclipse.swt.dnd.DragSourceEvent;
-import org.eclipse.swt.dnd.DragSourceListener;
-import org.eclipse.swt.events.MouseEvent;
-import org.eclipse.swt.events.MouseListener;
-
-/**
- * A {@link LayoutPoint} is a coordinate in the Android canvas (in other words,
- * it may differ from the canvas control mouse coordinate because the canvas may
- * be zoomed and scrolled.)
- */
-public final class LayoutPoint {
-    /** Containing canvas which the point is relative to. */
-    private final LayoutCanvas mCanvas;
-
-    /** The X coordinate of the canvas coordinate. */
-    public final int x;
-
-    /** The Y coordinate of the canvas coordinate. */
-    public final int y;
-
-    /**
-     * Constructs a new {@link LayoutPoint} from the given event. The event
-     * must be from a {@link MouseListener} associated with the
-     * {@link LayoutCanvas} such that the {@link MouseEvent#x} and
-     * {@link MouseEvent#y} fields are relative to the canvas.
-     *
-     * @param canvas The {@link LayoutCanvas} this point is within.
-     * @param event The mouse event to construct the {@link LayoutPoint}
-     *            from.
-     * @return A {@link LayoutPoint} which corresponds to the given
-     *         {@link MouseEvent}.
-     */
-    public static LayoutPoint create(LayoutCanvas canvas, MouseEvent event) {
-        // The mouse event coordinates should already be relative to the canvas
-        // widget.
-        assert event.widget == canvas : event.widget;
-        return ControlPoint.create(canvas, event).toLayout();
-    }
-
-    /**
-     * Constructs a new {@link LayoutPoint} from the given event. The event
-     * must be from a {@link DragSourceListener} associated with the
-     * {@link LayoutCanvas} such that the {@link DragSourceEvent#x} and
-     * {@link DragSourceEvent#y} fields are relative to the canvas.
-     *
-     * @param canvas The {@link LayoutCanvas} this point is within.
-     * @param event The mouse event to construct the {@link LayoutPoint}
-     *            from.
-     * @return A {@link LayoutPoint} which corresponds to the given
-     *         {@link DragSourceEvent}.
-     */
-    public static LayoutPoint create(LayoutCanvas canvas, DragSourceEvent event) {
-        // The drag source event coordinates should already be relative to the
-        // canvas widget.
-        return ControlPoint.create(canvas, event).toLayout();
-    }
-
-    /**
-     * Constructs a new {@link LayoutPoint} from the given x,y coordinates.
-     *
-     * @param canvas The {@link LayoutCanvas} this point is within.
-     * @param x The mouse event x coordinate relative to the canvas
-     * @param y The mouse event x coordinate relative to the canvas
-     * @return A {@link LayoutPoint} which corresponds to the given
-     *         layout coordinates.
-     */
-    public static LayoutPoint create(LayoutCanvas canvas, int x, int y) {
-        return new LayoutPoint(canvas, x, y);
-    }
-
-    /**
-     * Constructs a new {@link LayoutPoint} with the given X and Y coordinates.
-     *
-     * @param canvas The canvas which contains this coordinate
-     * @param x The canvas X coordinate
-     * @param y The canvas Y coordinate
-     */
-    private LayoutPoint(LayoutCanvas canvas, int x, int y) {
-        mCanvas = canvas;
-        this.x = x;
-        this.y = y;
-    }
-
-    /**
-     * Returns the equivalent {@link ControlPoint} to this
-     * {@link LayoutPoint}.
-     *
-     * @return The equivalent {@link ControlPoint} to this
-     *         {@link LayoutPoint}
-     */
-    public ControlPoint toControl() {
-        int cx = mCanvas.getHorizontalTransform().translate(x);
-        int cy = mCanvas.getVerticalTransform().translate(y);
-
-        return ControlPoint.create(mCanvas, cx, cy);
-    }
-
-    /**
-     * Returns this {@link LayoutPoint} as a {@link Point}, in the same coordinate space.
-     *
-     * @return a new {@link Point} in the same coordinate space
-     */
-    public Point toPoint() {
-        return new Point(x, y);
-    }
-
-    @Override
-    public String toString() {
-        return "LayoutPoint [x=" + x + ", y=" + y + "]"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-    }
-
-    @Override
-    public int hashCode() {
-        final int prime = 31;
-        int result = 1;
-        result = prime * result + x;
-        result = prime * result + y;
-        return result;
-    }
-
-    @Override
-    public boolean equals(Object obj) {
-        if (this == obj)
-            return true;
-        if (obj == null)
-            return false;
-        if (getClass() != obj.getClass())
-            return false;
-        LayoutPoint other = (LayoutPoint) obj;
-        if (x != other.x)
-            return false;
-        if (y != other.y)
-            return false;
-        return true;
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/LayoutWindowCoordinator.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/LayoutWindowCoordinator.java
deleted file mode 100644
index 56b86aa..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/LayoutWindowCoordinator.java
+++ /dev/null
@@ -1,394 +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.ide.eclipse.adt.internal.editors.layout.gle2;
-
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-import com.android.ide.eclipse.adt.internal.editors.AndroidXmlEditor;
-import com.android.ide.eclipse.adt.internal.editors.layout.LayoutEditorDelegate;
-import com.google.common.collect.Maps;
-
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IEditorReference;
-import org.eclipse.ui.IPartListener2;
-import org.eclipse.ui.IPartService;
-import org.eclipse.ui.IViewReference;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.IWorkbenchPartReference;
-import org.eclipse.ui.IWorkbenchWindow;
-
-import java.util.Map;
-
-/**
- * The {@link LayoutWindowCoordinator} keeps track of Eclipse window events (opening, closing,
- * fronting, etc) and uses this information to manage the propertysheet and outline
- * views such that they are always(*) showing:
- * <ul>
- *  <li> If the Property Sheet and Outline Eclipse views are showing, it does nothing.
- *       "Showing" means "is open", not necessary "is visible", e.g. in a tabbed view
- *       there could be a different view on top.
- *  <li> If just the outline is showing, then the property sheet is shown in a sashed
- *       pane below or to the right of the outline (depending on the dominant dimension
- *       of the window).
- *  <li> TBD: If just the property sheet is showing, should the outline be showed
- *       inside that window? Not yet done.
- *  <li> If the outline is *not* showing, then the outline is instead shown
- *       <b>inside</b> the editor area, in a right-docked view! This right docked view
- *       also includes the property sheet!
- *  <li> If the property sheet is not showing (which includes not showing in the outline
- *       view as well), then it will be shown inside the editor area, along with the outline
- *       which should also be there (since if the outline was showing outside the editor
- *       area, the property sheet would have docked there).
- *  <li> When the editor is maximized, then all views are temporarily hidden. In this
- *       case, the property sheet and outline will show up inside the editor.
- *       When the editor view is un-maximized, the view state will return to what it
- *       was before.
- * </ul>
- * </p>
- * There is one coordinator per workbench window, shared between all editors in that window.
- * <p>
- * TODO: Rename this class to AdtWindowCoordinator. It is used for more than just layout
- * window coordination now. For example, it's also used to dispatch {@code activated()} and
- * {@code deactivated()} events to all the XML editors, to ensure that key bindings are
- * properly dispatched to the right editors in Eclipse 4.x.
- */
-public class LayoutWindowCoordinator implements IPartListener2 {
-    static final String PROPERTY_SHEET_PART_ID = "org.eclipse.ui.views.PropertySheet"; //$NON-NLS-1$
-    static final String OUTLINE_PART_ID = "org.eclipse.ui.views.ContentOutline"; //$NON-NLS-1$
-    /** The workbench window */
-    private final IWorkbenchWindow mWindow;
-    /** Is the Eclipse property sheet ViewPart open? */
-    private boolean mPropertiesOpen;
-    /** Is the Eclipse outline ViewPart open? */
-    private boolean mOutlineOpen;
-    /** Is the editor maximized? */
-    private boolean mEditorMaximized;
-    /**
-     * Has the coordinator been initialized? We may have to delay initialization
-     * and perform it lazily if the workbench window does not have an active
-     * page when the coordinator is first started
-     */
-    private boolean mInitialized;
-
-    /** Map from workbench windows to each layout window coordinator instance for that window */
-    private static Map<IWorkbenchWindow, LayoutWindowCoordinator> sCoordinators =
-            Maps.newHashMapWithExpectedSize(2);
-
-    /**
-     * Returns the coordinator for the given window.
-     *
-     * @param window the associated window
-     * @param create whether to create the window if it does not already exist
-     * @return the new coordinator, never null if {@code create} is true
-     */
-    @Nullable
-    public static LayoutWindowCoordinator get(@NonNull IWorkbenchWindow window, boolean create) {
-        synchronized (LayoutWindowCoordinator.class){
-            LayoutWindowCoordinator coordinator = sCoordinators.get(window);
-            if (coordinator == null && create) {
-                coordinator = new LayoutWindowCoordinator(window);
-
-                IPartService service = window.getPartService();
-                if (service != null) {
-                    // What if the editor part is *already* open? How do I deal with that?
-                    service.addPartListener(coordinator);
-                }
-
-                sCoordinators.put(window, coordinator);
-            }
-
-            return coordinator;
-        }
-    }
-
-
-    /** Disposes this coordinator (when a window is closed) */
-    public void dispose() {
-        IPartService service = mWindow.getPartService();
-        if (service != null) {
-            service.removePartListener(this);
-        }
-
-        synchronized (LayoutWindowCoordinator.class){
-            sCoordinators.remove(mWindow);
-        }
-    }
-
-    /**
-     * Returns true if the main editor window is maximized
-     *
-     * @return true if the main editor window is maximized
-     */
-    public boolean isEditorMaximized() {
-        return mEditorMaximized;
-    }
-
-    private LayoutWindowCoordinator(@NonNull IWorkbenchWindow window) {
-        mWindow = window;
-
-        initialize();
-    }
-
-    private void initialize() {
-        if (mInitialized) {
-            return;
-        }
-
-        IWorkbenchPage activePage = mWindow.getActivePage();
-        if (activePage == null) {
-            return;
-        }
-
-        mInitialized = true;
-
-        // Look up current state of the properties and outline windows (in case
-        // they have already been opened before we added our part listener)
-        IViewReference ref = findPropertySheetView(activePage);
-        if (ref != null) {
-            IWorkbenchPart part = ref.getPart(false /*restore*/);
-            if (activePage.isPartVisible(part)) {
-                mPropertiesOpen = true;
-            }
-        }
-        ref = findOutlineView(activePage);
-        if (ref != null) {
-            IWorkbenchPart part = ref.getPart(false /*restore*/);
-            if (activePage.isPartVisible(part)) {
-                mOutlineOpen = true;
-            }
-        }
-        if (!syncMaximizedState(activePage)) {
-            syncActive();
-        }
-    }
-
-    static IViewReference findPropertySheetView(IWorkbenchPage activePage) {
-        return activePage.findViewReference(PROPERTY_SHEET_PART_ID);
-    }
-
-    static IViewReference findOutlineView(IWorkbenchPage activePage) {
-        return activePage.findViewReference(OUTLINE_PART_ID);
-    }
-
-    /**
-     * Checks the maximized state of the page and updates internal state if
-     * necessary.
-     * <p>
-     * This is used in Eclipse 4.x, where the {@link IPartListener2} does not
-     * fire {@link IPartListener2#partHidden(IWorkbenchPartReference)} when the
-     * editor is maximized anymore (see issue
-     * https://bugs.eclipse.org/bugs/show_bug.cgi?id=382120 for details).
-     * Instead, the layout editor listens for resize events, and upon resize it
-     * looks up the part state and calls this method to ensure that the right
-     * maximized state is known to the layout coordinator.
-     *
-     * @param page the active workbench page
-     * @return true if the state changed, false otherwise
-     */
-    public boolean syncMaximizedState(IWorkbenchPage page) {
-        boolean maximized = isPageZoomed(page);
-        if (mEditorMaximized != maximized) {
-            mEditorMaximized = maximized;
-            syncActive();
-            return true;
-        }
-        return false;
-    }
-
-    private boolean isPageZoomed(IWorkbenchPage page) {
-        IWorkbenchPartReference reference = page.getActivePartReference();
-        if (reference != null && reference instanceof IEditorReference) {
-            int state = page.getPartState(reference);
-            boolean maximized = (state & IWorkbenchPage.STATE_MAXIMIZED) != 0;
-            return maximized;
-        }
-
-        // If the active reference isn't the editor, then the editor can't be maximized
-        return false;
-    }
-
-    /**
-     * Syncs the given editor's view state such that the property sheet and or
-     * outline are shown or hidden according to the visibility of the global
-     * outline and property sheet views.
-     * <p>
-     * This is typically done when a layout editor is fronted. For view updates
-     * when the view is already showing, the {@link LayoutWindowCoordinator}
-     * will automatically handle the current fronted window.
-     *
-     * @param editor the editor to sync
-     */
-    private void sync(@Nullable GraphicalEditorPart editor) {
-        if (editor == null) {
-            return;
-        }
-        if (mEditorMaximized) {
-            editor.showStructureViews(true /*outline*/, true /*properties*/, true /*layout*/);
-        } else if (mOutlineOpen) {
-            editor.showStructureViews(false /*outline*/, false /*properties*/, true /*layout*/);
-            editor.getCanvasControl().getOutlinePage().setShowPropertySheet(!mPropertiesOpen);
-        } else {
-            editor.showStructureViews(true /*outline*/, !mPropertiesOpen /*properties*/,
-                    true /*layout*/);
-        }
-    }
-
-    private void sync(IWorkbenchPart part) {
-        if (part instanceof AndroidXmlEditor) {
-            LayoutEditorDelegate editor = LayoutEditorDelegate.fromEditor((IEditorPart) part);
-            if (editor != null) {
-                sync(editor.getGraphicalEditor());
-            }
-        }
-    }
-
-    private void syncActive() {
-        IWorkbenchPage activePage = mWindow.getActivePage();
-        if (activePage != null) {
-            IEditorPart editor = activePage.getActiveEditor();
-            sync(editor);
-        }
-    }
-
-    private void propertySheetClosed() {
-        mPropertiesOpen = false;
-        syncActive();
-    }
-
-    private void propertySheetOpened() {
-        mPropertiesOpen = true;
-        syncActive();
-    }
-
-    private void outlineClosed() {
-        mOutlineOpen = false;
-        syncActive();
-    }
-
-    private void outlineOpened() {
-        mOutlineOpen = true;
-        syncActive();
-    }
-
-    // ---- Implements IPartListener2 ----
-
-    @Override
-    public void partOpened(IWorkbenchPartReference partRef) {
-        // We ignore partOpened() and partClosed() because these methods are only
-        // called when a view is opened in the first perspective, and closed in the
-        // last perspective. The outline is typically used in multiple perspectives,
-        // so closing it in the Java perspective does *not* fire a partClosed event.
-        // There is no notification for "part closed in perspective" (see issue
-        // https://bugs.eclipse.org/bugs/show_bug.cgi?id=54559 for details).
-        // However, the workaround we can use is to listen to partVisible() and
-        // partHidden(). These will be called more often than we'd like (e.g.
-        // when the tab order causes a view to be obscured), however, we can use
-        // the workaround of looking up IWorkbenchPage.findViewReference(id) after
-        // partHidden(), which will return null if the view is closed in the current
-        // perspective. For partOpened, we simply look in partVisible() for whether
-        // our flags tracking the view state have been initialized already.
-    }
-
-    @Override
-    public void partClosed(IWorkbenchPartReference partRef) {
-        // partClosed() doesn't get called when a window is closed unless it has
-        // been closed in *all* perspectives. See partOpened() for more.
-    }
-
-    @Override
-    public void partHidden(IWorkbenchPartReference partRef) {
-        IWorkbenchPage activePage = mWindow.getActivePage();
-        if (activePage == null) {
-            return;
-        }
-        initialize();
-
-        // See if this looks like the window was closed in this workspace
-        // See partOpened() for an explanation.
-        String id = partRef.getId();
-        if (PROPERTY_SHEET_PART_ID.equals(id)) {
-            if (activePage.findViewReference(id) == null) {
-                propertySheetClosed();
-                return;
-            }
-        } else if (OUTLINE_PART_ID.equals(id)) {
-            if (activePage.findViewReference(id) == null) {
-                outlineClosed();
-                return;
-            }
-        }
-
-        // Does this look like a window getting maximized?
-        syncMaximizedState(activePage);
-    }
-
-    @Override
-    public void partVisible(IWorkbenchPartReference partRef) {
-        IWorkbenchPage activePage = mWindow.getActivePage();
-        if (activePage == null) {
-            return;
-        }
-        initialize();
-
-        String id = partRef.getId();
-        if (mEditorMaximized) {
-            // Return to their non-maximized state
-            mEditorMaximized = false;
-            syncActive();
-        }
-
-        IWorkbenchPart part = partRef.getPart(false /*restore*/);
-        sync(part);
-
-        // See partOpened() for an explanation
-        if (PROPERTY_SHEET_PART_ID.equals(id)) {
-            if (!mPropertiesOpen) {
-                propertySheetOpened();
-                assert mPropertiesOpen;
-            }
-        } else if (OUTLINE_PART_ID.equals(id)) {
-            if (!mOutlineOpen) {
-                outlineOpened();
-                assert mOutlineOpen;
-            }
-        }
-    }
-
-    @Override
-    public void partInputChanged(IWorkbenchPartReference partRef) {
-    }
-
-    @Override
-    public void partActivated(IWorkbenchPartReference partRef) {
-        IWorkbenchPart part = partRef.getPart(false);
-        if (part instanceof AndroidXmlEditor) {
-            ((AndroidXmlEditor)part).activated();
-        }
-    }
-
-    @Override
-    public void partBroughtToTop(IWorkbenchPartReference partRef) {
-    }
-
-    @Override
-    public void partDeactivated(IWorkbenchPartReference partRef) {
-        IWorkbenchPart part = partRef.getPart(false);
-        if (part instanceof AndroidXmlEditor) {
-            ((AndroidXmlEditor)part).deactivated();
-        }
-    }
-}
\ No newline at end of file
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/LintOverlay.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/LintOverlay.java
deleted file mode 100644
index ca74493..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/LintOverlay.java
+++ /dev/null
@@ -1,140 +0,0 @@
-/*
- * Copyright (C) 2010 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.editors.layout.gle2;
-
-import com.android.ide.eclipse.adt.internal.editors.IconFactory;
-import com.android.ide.eclipse.adt.internal.editors.layout.LayoutEditorDelegate;
-import com.android.ide.eclipse.adt.internal.preferences.AdtPrefs;
-import com.google.common.collect.Lists;
-
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.swt.graphics.GC;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.graphics.ImageData;
-import org.eclipse.swt.graphics.Rectangle;
-import org.w3c.dom.Node;
-
-import java.util.Collection;
-
-/**
- * The {@link LintOverlay} paints an icon over each view that contains at least one
- * lint error (unless the view is smaller than the icon)
- */
-public class LintOverlay extends Overlay {
-    /** Approximate size of lint overlay icons */
-    static final int ICON_SIZE = 8;
-    /** Alpha to draw lint overlay icons with */
-    private static final int ALPHA = 192;
-
-    private final LayoutCanvas mCanvas;
-    private Image mWarningImage;
-    private Image mErrorImage;
-
-    /**
-     * Constructs a new {@link LintOverlay}
-     *
-     * @param canvas the associated canvas
-     */
-    public LintOverlay(LayoutCanvas canvas) {
-        mCanvas = canvas;
-    }
-
-    @Override
-    public boolean isHiding() {
-        return super.isHiding() || !AdtPrefs.getPrefs().isLintOnSave();
-    }
-
-    @Override
-    public void paint(GC gc) {
-        LayoutEditorDelegate editor = mCanvas.getEditorDelegate();
-        Collection<Node> nodes = editor.getLintNodes();
-        if (nodes != null && !nodes.isEmpty()) {
-            // Copy list before iterating through it to avoid a concurrent list modification
-            // in case lint runs in the background while painting and updates this list
-            nodes = Lists.newArrayList(nodes);
-            ViewHierarchy hierarchy = mCanvas.getViewHierarchy();
-            Image icon = getWarningIcon();
-            ImageData imageData = icon.getImageData();
-            int iconWidth = imageData.width;
-            int iconHeight = imageData.height;
-            CanvasTransform mHScale = mCanvas.getHorizontalTransform();
-            CanvasTransform mVScale = mCanvas.getVerticalTransform();
-
-            // Right/bottom edges of the canvas image; don't paint overlays outside of
-            // that. (With for example RelativeLayouts with margins rendered on smaller
-            // screens than they are intended for this can happen.)
-            int maxX = mHScale.translate(0) + mHScale.getScaledImgSize();
-            int maxY = mVScale.translate(0) + mVScale.getScaledImgSize();
-
-            int oldAlpha = gc.getAlpha();
-            try {
-                gc.setAlpha(ALPHA);
-                for (Node node : nodes) {
-                    CanvasViewInfo vi = hierarchy.findViewInfoFor(node);
-                    if (vi != null) {
-                        Rectangle bounds = vi.getAbsRect();
-                        int x = mHScale.translate(bounds.x);
-                        int y = mVScale.translate(bounds.y);
-                        int w = mHScale.scale(bounds.width);
-                        int h = mVScale.scale(bounds.height);
-                        if (w < iconWidth || h < iconHeight) {
-                            // Don't draw badges on tiny widgets (including those
-                            // that aren't tiny but are zoomed out too far)
-                            continue;
-                        }
-
-                        x += w - iconWidth;
-                        y += h - iconHeight;
-
-                        if (x > maxX || y > maxY) {
-                            continue;
-                        }
-
-                        boolean isError = false;
-                        IMarker marker = editor.getIssueForNode(vi.getUiViewNode());
-                        if (marker != null) {
-                            int severity = marker.getAttribute(IMarker.SEVERITY, 0);
-                            isError = severity == IMarker.SEVERITY_ERROR;
-                        }
-
-                        icon = isError ? getErrorIcon() : getWarningIcon();
-
-                        gc.drawImage(icon, x, y);
-                    }
-                }
-            } finally {
-                gc.setAlpha(oldAlpha);
-            }
-        }
-    }
-
-    private Image getWarningIcon() {
-        if (mWarningImage == null) {
-            mWarningImage = IconFactory.getInstance().getIcon("warning-badge"); //$NON-NLS-1$
-        }
-
-        return mWarningImage;
-    }
-
-    private Image getErrorIcon() {
-        if (mErrorImage == null) {
-            mErrorImage = IconFactory.getInstance().getIcon("error-badge");     //$NON-NLS-1$
-        }
-
-        return mErrorImage;
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/LintTooltip.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/LintTooltip.java
deleted file mode 100644
index cedd436..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/LintTooltip.java
+++ /dev/null
@@ -1,94 +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.ide.eclipse.adt.internal.editors.layout.gle2;
-
-import static com.android.SdkConstants.ATTR_ID;
-
-import com.android.ide.common.layout.BaseLayoutRule;
-import com.android.ide.eclipse.adt.internal.editors.layout.LayoutEditorDelegate;
-import com.android.ide.eclipse.adt.internal.editors.layout.uimodel.UiViewElementNode;
-
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Shell;
-
-import java.util.List;
-
-/** Actual tooltip showing multiple lines for various widgets that have lint errors */
-class LintTooltip extends Shell {
-    private final LayoutCanvas mCanvas;
-    private final List<UiViewElementNode> mNodes;
-
-    LintTooltip(LayoutCanvas canvas, List<UiViewElementNode> nodes) {
-        super(canvas.getDisplay(), SWT.ON_TOP | SWT.NO_FOCUS | SWT.TOOL);
-        mCanvas = canvas;
-        mNodes = nodes;
-
-        createContents();
-    }
-
-    protected void createContents() {
-        Display display = getDisplay();
-        Color fg = display.getSystemColor(SWT.COLOR_INFO_FOREGROUND);
-        Color bg = display.getSystemColor(SWT.COLOR_INFO_BACKGROUND);
-        setBackground(bg);
-        GridLayout gridLayout = new GridLayout(2, false);
-        setLayout(gridLayout);
-
-        LayoutEditorDelegate delegate = mCanvas.getEditorDelegate();
-
-        boolean first = true;
-        for (UiViewElementNode node : mNodes) {
-            IMarker marker = delegate.getIssueForNode(node);
-            if (marker != null) {
-                String message = marker.getAttribute(IMarker.MESSAGE, null);
-                if (message != null) {
-                    Label icon = new Label(this, SWT.NONE);
-                    icon.setForeground(fg);
-                    icon.setBackground(bg);
-                    icon.setImage(node.getIcon());
-
-                    Label label = new Label(this, SWT.WRAP);
-                    if (first) {
-                        label.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, true, false, 1, 1));
-                        first = false;
-                    }
-
-                    String id = BaseLayoutRule.stripIdPrefix(node.getAttributeValue(ATTR_ID));
-                    if (id.isEmpty()) {
-                        if (node.getXmlNode() != null) {
-                            id = node.getXmlNode().getNodeName();
-                        } else {
-                            id = node.getDescriptor().getUiName();
-                        }
-                    }
-
-                    label.setText(String.format("%1$s: %2$s", id, message));
-                }
-            }
-        }
-    }
-
-    @Override
-    protected void checkSubclass() {
-        // Disable the check that prevents subclassing of SWT components
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/LintTooltipManager.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/LintTooltipManager.java
deleted file mode 100644
index f719358..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/LintTooltipManager.java
+++ /dev/null
@@ -1,181 +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.ide.eclipse.adt.internal.editors.layout.gle2;
-
-import static com.android.ide.eclipse.adt.internal.editors.layout.gle2.LintOverlay.ICON_SIZE;
-
-import com.android.annotations.Nullable;
-import com.android.ide.eclipse.adt.internal.editors.layout.LayoutEditorDelegate;
-import com.android.ide.eclipse.adt.internal.editors.layout.uimodel.UiViewElementNode;
-import com.android.ide.eclipse.adt.internal.preferences.AdtPrefs;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.graphics.Rectangle;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.Listener;
-import org.eclipse.swt.widgets.Shell;
-import org.w3c.dom.Node;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
-
-/** Tooltip in the layout editor showing lint errors under the cursor */
-class LintTooltipManager implements Listener {
-    private final LayoutCanvas mCanvas;
-    private Shell mTip = null;
-    private List<UiViewElementNode> mShowingNodes;
-
-    /**
-     * Sets up a custom tooltip when hovering over tree items. It currently displays the error
-     * message for the lint warning associated with each node, if any (and only if the hover
-     * is over the icon portion).
-     */
-    LintTooltipManager(LayoutCanvas canvas) {
-        mCanvas = canvas;
-    }
-
-    void register() {
-        mCanvas.addListener(SWT.Dispose, this);
-        mCanvas.addListener(SWT.KeyDown, this);
-        mCanvas.addListener(SWT.MouseMove, this);
-        mCanvas.addListener(SWT.MouseHover, this);
-    }
-
-    void unregister() {
-        if (!mCanvas.isDisposed()) {
-            mCanvas.removeListener(SWT.Dispose, this);
-            mCanvas.removeListener(SWT.KeyDown, this);
-            mCanvas.removeListener(SWT.MouseMove, this);
-            mCanvas.removeListener(SWT.MouseHover, this);
-        }
-    }
-
-    @Override
-    public void handleEvent(Event event) {
-        switch(event.type) {
-        case SWT.MouseMove:
-            // See if we're still overlapping this or *other* errors; if so, keep the
-            // tip up (or update it).
-            if (mShowingNodes != null) {
-                List<UiViewElementNode> nodes = computeNodes(event);
-                if (nodes != null && !nodes.isEmpty()) {
-                    if (nodes.equals(mShowingNodes)) {
-                        return;
-                    } else {
-                        show(nodes);
-                    }
-                    break;
-                }
-            }
-
-            // If not, fall through and hide the tooltip
-
-            //$FALL-THROUGH$
-        case SWT.Dispose:
-        case SWT.FocusOut:
-        case SWT.KeyDown:
-        case SWT.MouseExit:
-        case SWT.MouseDown:
-            hide();
-            break;
-        case SWT.MouseHover:
-            hide();
-            show(event);
-            break;
-        }
-    }
-
-    void hide() {
-        if (mTip != null) {
-            mTip.dispose();
-            mTip = null;
-        }
-        mShowingNodes = null;
-    }
-
-    private void show(Event event) {
-        List<UiViewElementNode> nodes = computeNodes(event);
-        if (nodes != null && !nodes.isEmpty()) {
-            show(nodes);
-        }
-    }
-
-    /** Show a tooltip listing the lint errors for the given nodes */
-    private void show(List<UiViewElementNode> nodes) {
-        hide();
-
-        if (!AdtPrefs.getPrefs().isLintOnSave()) {
-            return;
-        }
-
-        mTip = new LintTooltip(mCanvas, nodes);
-        Rectangle rect = mCanvas.getBounds();
-        Point size = mTip.computeSize(SWT.DEFAULT, SWT.DEFAULT);
-        Point pos = mCanvas.toDisplay(rect.x, rect.y + rect.height);
-        if (size.x > rect.width) {
-            size = mTip.computeSize(rect.width, SWT.DEFAULT);
-        }
-        mTip.setBounds(pos.x, pos.y, size.x, size.y);
-
-        mShowingNodes = nodes;
-        mTip.setVisible(true);
-    }
-
-    /**
-     * Compute the list of nodes which have lint warnings near the given mouse
-     * coordinates
-     *
-     * @param event the mouse cursor event
-     * @return a list of nodes, possibly empty
-     */
-    @Nullable
-    private List<UiViewElementNode> computeNodes(Event event) {
-        LayoutPoint p = ControlPoint.create(mCanvas, event.x, event.y).toLayout();
-        LayoutEditorDelegate delegate = mCanvas.getEditorDelegate();
-        ViewHierarchy viewHierarchy = mCanvas.getViewHierarchy();
-        CanvasTransform mHScale = mCanvas.getHorizontalTransform();
-        CanvasTransform mVScale = mCanvas.getVerticalTransform();
-
-        int layoutIconSize = mHScale.inverseScale(ICON_SIZE);
-        int slop = mVScale.inverseScale(10); // extra space around icon where tip triggers
-
-        Collection<Node> xmlNodes = delegate.getLintNodes();
-        if (xmlNodes == null) {
-            return null;
-        }
-        List<UiViewElementNode> nodes = new ArrayList<UiViewElementNode>();
-        for (Node xmlNode : xmlNodes) {
-            CanvasViewInfo v = viewHierarchy.findViewInfoFor(xmlNode);
-            if (v != null) {
-                Rectangle b = v.getAbsRect();
-                int x2 = b.x + b.width;
-                int y2 = b.y + b.height;
-                if (p.x < x2 - layoutIconSize - slop
-                        || p.x > x2 + slop
-                        || p.y < y2 - layoutIconSize - slop
-                        || p.y > y2 + slop) {
-                    continue;
-                }
-
-                nodes.add(v.getUiViewNode());
-            }
-        }
-
-        return nodes;
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/ListViewTypeMenu.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/ListViewTypeMenu.java
deleted file mode 100644
index 4577f8d..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/ListViewTypeMenu.java
+++ /dev/null
@@ -1,220 +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.eclipse.adt.internal.editors.layout.gle2;
-
-import static com.android.SdkConstants.ANDROID_LAYOUT_RESOURCE_PREFIX;
-import static com.android.ide.eclipse.adt.internal.editors.layout.gle2.LayoutMetadata.KEY_LV_FOOTER;
-import static com.android.ide.eclipse.adt.internal.editors.layout.gle2.LayoutMetadata.KEY_LV_HEADER;
-import static com.android.ide.eclipse.adt.internal.editors.layout.gle2.LayoutMetadata.KEY_LV_ITEM;
-
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-import com.android.ide.common.rendering.api.Capability;
-import com.android.ide.eclipse.adt.internal.editors.layout.LayoutEditorDelegate;
-import com.android.ide.eclipse.adt.internal.editors.layout.uimodel.UiViewElementNode;
-import com.android.ide.eclipse.adt.internal.resources.CyclicDependencyValidator;
-import com.android.ide.eclipse.adt.internal.ui.ResourceChooser;
-import com.android.resources.ResourceType;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.ActionContributionItem;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.action.Separator;
-import org.eclipse.jface.window.Window;
-import org.eclipse.swt.widgets.Menu;
-import org.w3c.dom.Node;
-
-/**
- * "Preview List Content" context menu which lists available data types and layouts
- * the user can choose to view the ListView as.
- */
-public class ListViewTypeMenu extends SubmenuAction {
-    /** Associated canvas */
-    private final LayoutCanvas mCanvas;
-    /** When true, this menu is for a grid rather than a simple list */
-    private boolean mGrid;
-    /** When true, this menu is for a spinner rather than a simple list */
-    private boolean mSpinner;
-
-    /**
-     * Creates a "Preview List Content" menu
-     *
-     * @param canvas associated canvas
-     * @param isGrid whether the menu is for a grid rather than a list
-     * @param isSpinner whether the menu is for a spinner rather than a list
-     */
-    public ListViewTypeMenu(LayoutCanvas canvas, boolean isGrid, boolean isSpinner) {
-        super(isGrid ? "Preview Grid Content" : isSpinner ? "Preview Spinner Layout"
-                : "Preview List Content");
-        mCanvas = canvas;
-        mGrid = isGrid;
-        mSpinner = isSpinner;
-    }
-
-    @Override
-    protected void addMenuItems(Menu menu) {
-        GraphicalEditorPart graphicalEditor = mCanvas.getEditorDelegate().getGraphicalEditor();
-        if (graphicalEditor.renderingSupports(Capability.ADAPTER_BINDING)) {
-            IAction action = new PickLayoutAction("Choose Layout...", KEY_LV_ITEM);
-            new ActionContributionItem(action).fill(menu, -1);
-            new Separator().fill(menu, -1);
-
-            String selected = getSelectedLayout();
-            if (selected != null) {
-                if (selected.startsWith(ANDROID_LAYOUT_RESOURCE_PREFIX)) {
-                    selected = selected.substring(ANDROID_LAYOUT_RESOURCE_PREFIX.length());
-                }
-            }
-
-            if (mSpinner) {
-                action = new SetListTypeAction("Spinner Item",
-                        "simple_spinner_item", selected); //$NON-NLS-1$
-                new ActionContributionItem(action).fill(menu, -1);
-                action = new SetListTypeAction("Spinner Dropdown Item",
-                        "simple_spinner_dropdown_item", selected); //$NON-NLS-1$
-                new ActionContributionItem(action).fill(menu, -1);
-                return;
-            }
-
-            action = new SetListTypeAction("Simple List Item",
-                    "simple_list_item_1", selected); //$NON-NLS-1$
-            new ActionContributionItem(action).fill(menu, -1);
-            action = new SetListTypeAction("Simple 2-Line List Item",
-                    "simple_list_item_2", //$NON-NLS-1$
-                    selected);
-            new ActionContributionItem(action).fill(menu, -1);
-            action = new SetListTypeAction("Checked List Item",
-                    "simple_list_item_checked", //$NON-NLS-1$
-                    selected);
-            new ActionContributionItem(action).fill(menu, -1);
-            action = new SetListTypeAction("Single Choice List Item",
-                    "simple_list_item_single_choice", //$NON-NLS-1$
-                    selected);
-            new ActionContributionItem(action).fill(menu, -1);
-            action = new SetListTypeAction("Multiple Choice List Item",
-                    "simple_list_item_multiple_choice", //$NON-NLS-1$
-                    selected);
-            if (!mGrid) {
-                new Separator().fill(menu, -1);
-                action = new SetListTypeAction("Simple Expandable List Item",
-                        "simple_expandable_list_item_1", selected); //$NON-NLS-1$
-                new ActionContributionItem(action).fill(menu, -1);
-                action = new SetListTypeAction("Simple 2-Line Expandable List Item",
-                        "simple_expandable_list_item_2", //$NON-NLS-1$
-                        selected);
-                new ActionContributionItem(action).fill(menu, -1);
-
-                new Separator().fill(menu, -1);
-                action = new PickLayoutAction("Choose Header...", KEY_LV_HEADER);
-                new ActionContributionItem(action).fill(menu, -1);
-                action = new PickLayoutAction("Choose Footer...", KEY_LV_FOOTER);
-                new ActionContributionItem(action).fill(menu, -1);
-            }
-        } else {
-            // Should we just hide the menu item instead?
-            addDisabledMessageItem(
-                    "Not supported for this SDK version; try changing the Render Target");
-        }
-    }
-
-    private class SetListTypeAction extends Action {
-        private final String mLayout;
-
-        public SetListTypeAction(String title, String layout, String selected) {
-            super(title, IAction.AS_RADIO_BUTTON);
-            mLayout = layout;
-
-            if (layout.equals(selected)) {
-                setChecked(true);
-            }
-        }
-
-        @Override
-        public void run() {
-            if (isChecked()) {
-                setNewType(KEY_LV_ITEM, ANDROID_LAYOUT_RESOURCE_PREFIX + mLayout);
-            }
-        }
-    }
-
-    /**
-     * Action which brings up a resource chooser to choose an arbitrary layout as the
-     * layout to be previewed in the list.
-     */
-    private class PickLayoutAction extends Action {
-        private final String mType;
-
-        public PickLayoutAction(String title, String type) {
-            super(title, IAction.AS_PUSH_BUTTON);
-            mType = type;
-        }
-
-        @Override
-        public void run() {
-            LayoutEditorDelegate delegate = mCanvas.getEditorDelegate();
-            IFile file = delegate.getEditor().getInputFile();
-            GraphicalEditorPart editor = delegate.getGraphicalEditor();
-            ResourceChooser dlg = ResourceChooser.create(editor, ResourceType.LAYOUT)
-                .setInputValidator(CyclicDependencyValidator.create(file))
-                .setInitialSize(85, 10)
-                .setCurrentResource(getSelectedLayout());
-            int result = dlg.open();
-            if (result == ResourceChooser.CLEAR_RETURN_CODE) {
-                setNewType(mType, null);
-            } else if (result == Window.OK) {
-                String newType = dlg.getCurrentResource();
-                setNewType(mType, newType);
-            }
-        }
-    }
-
-    @Nullable
-    private String getSelectedLayout() {
-        String layout = null;
-        SelectionManager selectionManager = mCanvas.getSelectionManager();
-        for (SelectionItem item : selectionManager.getSelections()) {
-            UiViewElementNode node = item.getViewInfo().getUiViewNode();
-            if (node != null) {
-                Node xmlNode = node.getXmlNode();
-                layout = LayoutMetadata.getProperty(xmlNode, KEY_LV_ITEM);
-                if (layout != null) {
-                    return layout;
-                }
-            }
-        }
-
-        return null;
-    }
-
-    private void setNewType(@NonNull String type, @Nullable String layout) {
-        LayoutEditorDelegate delegate = mCanvas.getEditorDelegate();
-        GraphicalEditorPart graphicalEditor = delegate.getGraphicalEditor();
-        SelectionManager selectionManager = mCanvas.getSelectionManager();
-
-        for (SelectionItem item : selectionManager.getSnapshot()) {
-            UiViewElementNode node = item.getViewInfo().getUiViewNode();
-            if (node != null) {
-                Node xmlNode = node.getXmlNode();
-                LayoutMetadata.setProperty(delegate.getEditor(), xmlNode, type, layout);
-            }
-        }
-
-        // Refresh
-        graphicalEditor.recomputeLayout();
-        mCanvas.redraw();
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/MarqueeGesture.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/MarqueeGesture.java
deleted file mode 100644
index 4cfd4fe..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/MarqueeGesture.java
+++ /dev/null
@@ -1,160 +0,0 @@
-/*
- * Copyright (C) 2010 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.editors.layout.gle2;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Device;
-import org.eclipse.swt.graphics.GC;
-import org.eclipse.swt.graphics.Rectangle;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.List;
-
-/**
- * A {@link MarqueeGesture} is a gesture for swiping out a selection rectangle.
- * With a modifier key, items that intersect the rectangle can be toggled
- * instead of added to the new selection set.
- */
-public class MarqueeGesture extends Gesture {
-    /** The {@link Overlay} drawn for the marquee. */
-    private MarqueeOverlay mOverlay;
-
-    /** The canvas associated with this gesture. */
-    private LayoutCanvas mCanvas;
-
-    /** A copy of the initial selection, when we're toggling the marquee. */
-    private Collection<CanvasViewInfo> mInitialSelection;
-
-    /**
-     * Creates a new marquee selection (selection swiping).
-     *
-     * @param canvas The canvas where selection is performed.
-     * @param toggle If true, toggle the membership of contained elements
-     *            instead of adding it.
-     */
-    public MarqueeGesture(LayoutCanvas canvas, boolean toggle) {
-        mCanvas = canvas;
-
-        if (toggle) {
-            List<SelectionItem> selection = canvas.getSelectionManager().getSelections();
-            mInitialSelection = new ArrayList<CanvasViewInfo>(selection.size());
-            for (SelectionItem item : selection) {
-                mInitialSelection.add(item.getViewInfo());
-            }
-        } else {
-            mInitialSelection = Collections.emptySet();
-        }
-    }
-
-    @Override
-    public void update(ControlPoint pos) {
-        if (mOverlay == null) {
-            return;
-        }
-
-        int x = Math.min(pos.x, mStart.x);
-        int y = Math.min(pos.y, mStart.y);
-        int w = Math.abs(pos.x - mStart.x);
-        int h = Math.abs(pos.y - mStart.y);
-
-        mOverlay.updateSize(x, y, w, h);
-
-        // Compute selection overlaps
-        LayoutPoint topLeft = ControlPoint.create(mCanvas, x, y).toLayout();
-        LayoutPoint bottomRight = ControlPoint.create(mCanvas, x + w, y + h).toLayout();
-        mCanvas.getSelectionManager().selectWithin(topLeft, bottomRight, mInitialSelection);
-    }
-
-    @Override
-    public List<Overlay> createOverlays() {
-        mOverlay = new MarqueeOverlay();
-        return Collections.<Overlay> singletonList(mOverlay);
-    }
-
-    /**
-     * An {@link Overlay} for the {@link MarqueeGesture}; paints a selection
-     * overlay rectangle matching the mouse coordinate delta between gesture
-     * start and the current position.
-     */
-    private static class MarqueeOverlay extends Overlay {
-        /** Rectangle border color. */
-        private Color mStroke;
-
-        /** Rectangle fill color. */
-        private Color mFill;
-
-        /** Current rectangle coordinates (in terms of control coordinates). */
-        private Rectangle mRectangle = new Rectangle(0, 0, 0, 0);
-
-        /** Alpha value of the fill. */
-        private int mFillAlpha;
-
-        /** Alpha value of the border. */
-        private int mStrokeAlpha;
-
-        /** Constructs a new {@link MarqueeOverlay}. */
-        public MarqueeOverlay() {
-        }
-
-        /**
-         * Updates the size of the marquee rectangle.
-         *
-         * @param x The top left corner of the rectangle, x coordinate.
-         * @param y The top left corner of the rectangle, y coordinate.
-         * @param w Rectangle width.
-         * @param h Rectangle height.
-         */
-        public void updateSize(int x, int y, int w, int h) {
-            mRectangle.x = x;
-            mRectangle.y = y;
-            mRectangle.width = w;
-            mRectangle.height = h;
-        }
-
-        @Override
-        public void create(Device device) {
-            // TODO: Integrate DrawingStyles with this?
-            mStroke = new Color(device, 255, 255, 255);
-            mFill = new Color(device, 128, 128, 128);
-            mFillAlpha = 64;
-            mStrokeAlpha = 255;
-        }
-
-        @Override
-        public void dispose() {
-            mStroke.dispose();
-            mFill.dispose();
-        }
-
-        @Override
-        public void paint(GC gc) {
-            if (mRectangle.width > 0 && mRectangle.height > 0) {
-                gc.setLineStyle(SWT.LINE_SOLID);
-                gc.setLineWidth(1);
-                gc.setForeground(mStroke);
-                gc.setBackground(mFill);
-                gc.setAlpha(mStrokeAlpha);
-                gc.drawRectangle(mRectangle);
-                gc.setAlpha(mFillAlpha);
-                gc.fillRectangle(mRectangle);
-            }
-        }
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/MoveGesture.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/MoveGesture.java
deleted file mode 100644
index 7cf3a64..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/MoveGesture.java
+++ /dev/null
@@ -1,852 +0,0 @@
-/*
- * Copyright (C) 2010 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.editors.layout.gle2;
-
-import com.android.ide.common.api.DropFeedback;
-import com.android.ide.common.api.INode;
-import com.android.ide.common.api.InsertType;
-import com.android.ide.common.api.Point;
-import com.android.ide.common.api.Rect;
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.ide.eclipse.adt.internal.editors.layout.gre.NodeFactory;
-import com.android.ide.eclipse.adt.internal.editors.layout.gre.NodeProxy;
-import com.android.ide.eclipse.adt.internal.editors.layout.gre.RulesEngine;
-import com.android.ide.eclipse.adt.internal.editors.layout.uimodel.UiViewElementNode;
-import com.android.ide.eclipse.adt.internal.editors.uimodel.UiElementNode;
-import com.android.ide.eclipse.adt.internal.editors.uimodel.UiElementNode.NodeCreationListener;
-
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.TreePath;
-import org.eclipse.jface.viewers.TreeSelection;
-import org.eclipse.swt.dnd.DND;
-import org.eclipse.swt.dnd.DropTargetEvent;
-import org.eclipse.swt.dnd.TransferData;
-import org.eclipse.swt.graphics.GC;
-import org.eclipse.swt.widgets.Display;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
-
-/**
- * The Move gesture provides the operation for moving widgets around in the canvas.
- */
-public class MoveGesture extends DropGesture {
-    /** The associated {@link LayoutCanvas}. */
-    private LayoutCanvas mCanvas;
-
-    /** Overlay which paints the drag &amp; drop feedback. */
-    private MoveOverlay mOverlay;
-
-    private static final boolean DEBUG = false;
-
-    /**
-     * The top view right under the drag'n'drop cursor.
-     * This can only be null during a drag'n'drop when there is no view under the cursor
-     * or after the state was all cleared.
-     */
-    private CanvasViewInfo mCurrentView;
-
-    /**
-     * The elements currently being dragged. This will always be non-null for a valid
-     * drag'n'drop that happens within the same instance of Eclipse.
-     * <p/>
-     * In the event that the drag and drop happens between different instances of Eclipse
-     * this will remain null.
-     */
-    private SimpleElement[] mCurrentDragElements;
-
-    /**
-     * The first view under the cursor that responded to onDropEnter is called the "target view".
-     * It can differ from mCurrentView, typically because a terminal View doesn't
-     * accept drag'n'drop so its parent layout became the target drag'n'drop receiver.
-     * <p/>
-     * The target node is the proxy node associated with the target view.
-     * This can be null if no view under the cursor accepted the drag'n'drop or if the node
-     * factory couldn't create a proxy for it.
-     */
-    private NodeProxy mTargetNode;
-
-    /**
-     * The latest drop feedback returned by IViewRule.onDropEnter/Move.
-     */
-    private DropFeedback mFeedback;
-
-    /**
-     * {@link #dragLeave(DropTargetEvent)} is unfortunately called right before data is
-     * about to be dropped (between the last {@link #dragOver(DropTargetEvent)} and the
-     * next {@link #dropAccept(DropTargetEvent)}). That means we can't just
-     * trash the current DropFeedback from the current view rule in dragLeave().
-     * Instead we preserve it in mLeaveTargetNode and mLeaveFeedback in case a dropAccept
-     * happens next.
-     */
-    private NodeProxy mLeaveTargetNode;
-
-    /**
-     * @see #mLeaveTargetNode
-     */
-    private DropFeedback mLeaveFeedback;
-
-    /**
-     * @see #mLeaveTargetNode
-     */
-    private CanvasViewInfo mLeaveView;
-
-    /** Singleton used to keep track of drag selection in the same Eclipse instance. */
-    private final GlobalCanvasDragInfo mGlobalDragInfo;
-
-    /**
-     * Constructs a new {@link MoveGesture}, tied to the given canvas.
-     *
-     * @param canvas The canvas to associate the {@link MoveGesture} with.
-     */
-    public MoveGesture(LayoutCanvas canvas) {
-        mCanvas = canvas;
-        mGlobalDragInfo = GlobalCanvasDragInfo.getInstance();
-    }
-
-    @Override
-    public List<Overlay> createOverlays() {
-        mOverlay = new MoveOverlay();
-        return Collections.<Overlay> singletonList(mOverlay);
-    }
-
-    @Override
-    public void begin(ControlPoint pos, int startMask) {
-        super.begin(pos, startMask);
-
-        // Hide selection overlays during a move drag
-        mCanvas.getSelectionOverlay().setHidden(true);
-    }
-
-    @Override
-    public void end(ControlPoint pos, boolean canceled) {
-        super.end(pos, canceled);
-
-        mCanvas.getSelectionOverlay().setHidden(false);
-
-        // Ensure that the outline is back to showing the current selection, since during
-        // a drag gesture we temporarily set it to show the current target node instead.
-        mCanvas.getSelectionManager().syncOutlineSelection();
-    }
-
-    /* TODO: Pass modifier mask to drag rules as well! This doesn't work yet since
-       the drag &amp; drop code seems to steal keyboard events.
-    @Override
-    public boolean keyPressed(KeyEvent event) {
-        update(mCanvas.getGestureManager().getCurrentControlPoint());
-        mCanvas.redraw();
-        return true;
-    }
-
-    @Override
-    public boolean keyReleased(KeyEvent event) {
-        update(mCanvas.getGestureManager().getCurrentControlPoint());
-        mCanvas.redraw();
-        return true;
-    }
-    */
-
-    /*
-     * The cursor has entered the drop target boundaries.
-     * {@inheritDoc}
-     */
-    @Override
-    public void dragEnter(DropTargetEvent event) {
-        if (DEBUG) AdtPlugin.printErrorToConsole("DEBUG", "drag enter", event);
-
-        // Make sure we don't have any residual data from an earlier operation.
-        clearDropInfo();
-        mLeaveTargetNode = null;
-        mLeaveFeedback = null;
-        mLeaveView = null;
-
-        // Get the dragged elements.
-        //
-        // The current transfered type can be extracted from the event.
-        // As described in dragOver(), this works basically works on Windows but
-        // not on Linux or Mac, in which case we can't get the type until we
-        // receive dropAccept/drop().
-        // For consistency we try to use the GlobalCanvasDragInfo instance first,
-        // and if it fails we use the event transfer type as a backup (but as said
-        // before it will most likely work only on Windows.)
-        // In any case this can be null even for a valid transfer.
-
-        mCurrentDragElements = mGlobalDragInfo.getCurrentElements();
-
-        if (mCurrentDragElements == null) {
-            SimpleXmlTransfer sxt = SimpleXmlTransfer.getInstance();
-            if (sxt.isSupportedType(event.currentDataType)) {
-                mCurrentDragElements = (SimpleElement[]) sxt.nativeToJava(event.currentDataType);
-            }
-        }
-
-        // if there is no data to transfer, invalidate the drag'n'drop.
-        // The assumption is that the transfer should have at least one element with a
-        // a non-null non-empty FQCN. Everything else is optional.
-        if (mCurrentDragElements == null ||
-                mCurrentDragElements.length == 0 ||
-                mCurrentDragElements[0] == null ||
-                mCurrentDragElements[0].getFqcn() == null ||
-                mCurrentDragElements[0].getFqcn().length() == 0) {
-            event.detail = DND.DROP_NONE;
-        }
-
-        dragOperationChanged(event);
-    }
-
-    /*
-     * The operation being performed has changed (e.g. modifier key).
-     * {@inheritDoc}
-     */
-    @Override
-    public void dragOperationChanged(DropTargetEvent event) {
-        if (DEBUG) AdtPlugin.printErrorToConsole("DEBUG", "drag changed", event);
-
-        checkDataType(event);
-        recomputeDragType(event);
-    }
-
-    private void recomputeDragType(DropTargetEvent event) {
-        if (event.detail == DND.DROP_DEFAULT) {
-            // Default means we can now choose the default operation, either copy or move.
-            // If the drag comes from the same canvas we default to move, otherwise we
-            // default to copy.
-
-            if (mGlobalDragInfo.getSourceCanvas() == mCanvas &&
-                    (event.operations & DND.DROP_MOVE) != 0) {
-                event.detail = DND.DROP_MOVE;
-            } else if ((event.operations & DND.DROP_COPY) != 0) {
-                event.detail = DND.DROP_COPY;
-            }
-        }
-
-        // We don't support other types than copy and move
-        if (event.detail != DND.DROP_COPY && event.detail != DND.DROP_MOVE) {
-            event.detail = DND.DROP_NONE;
-        }
-    }
-
-    /*
-     * The cursor has left the drop target boundaries OR data is about to be dropped.
-     * {@inheritDoc}
-     */
-    @Override
-    public void dragLeave(DropTargetEvent event) {
-        if (DEBUG) AdtPlugin.printErrorToConsole("DEBUG", "drag leave");
-
-        // dragLeave is unfortunately called right before data is about to be dropped
-        // (between the last dropMove and the next dropAccept). That means we can't just
-        // trash the current DropFeedback from the current view rule, we need to preserve
-        // it in case a dropAccept happens next.
-        // See the corresponding kludge in dropAccept().
-        mLeaveTargetNode = mTargetNode;
-        mLeaveFeedback = mFeedback;
-        mLeaveView = mCurrentView;
-
-        clearDropInfo();
-    }
-
-    /*
-     * The cursor is moving over the drop target.
-     * {@inheritDoc}
-     */
-    @Override
-    public void dragOver(DropTargetEvent event) {
-        processDropEvent(event);
-    }
-
-    /*
-     * The drop is about to be performed.
-     * The drop target is given a last chance to change the nature of the drop.
-     * {@inheritDoc}
-     */
-    @Override
-    public void dropAccept(DropTargetEvent event) {
-        if (DEBUG) AdtPlugin.printErrorToConsole("DEBUG", "drop accept");
-
-        checkDataType(event);
-
-        // If we have a valid target node and it matches the one we saved in
-        // dragLeave then we restore the DropFeedback that we saved in dragLeave.
-        if (mLeaveTargetNode != null) {
-            mTargetNode = mLeaveTargetNode;
-            mFeedback = mLeaveFeedback;
-            mCurrentView = mLeaveView;
-        }
-
-        if (mFeedback != null && mFeedback.invalidTarget) {
-            // The script said we can't drop here.
-            event.detail = DND.DROP_NONE;
-        }
-
-        if (mLeaveTargetNode == null || event.detail == DND.DROP_NONE) {
-            clearDropInfo();
-        }
-
-        mLeaveTargetNode = null;
-        mLeaveFeedback = null;
-        mLeaveView = null;
-    }
-
-    /*
-     * The data is being dropped.
-     * {@inheritDoc}
-     */
-    @Override
-    public void drop(final DropTargetEvent event) {
-        if (DEBUG) AdtPlugin.printErrorToConsole("DEBUG", "dropped");
-
-        SimpleElement[] elements = null;
-
-        SimpleXmlTransfer sxt = SimpleXmlTransfer.getInstance();
-
-        if (sxt.isSupportedType(event.currentDataType)) {
-            if (event.data instanceof SimpleElement[]) {
-                elements = (SimpleElement[]) event.data;
-            }
-        }
-
-        if (elements == null || elements.length < 1) {
-            if (DEBUG) AdtPlugin.printErrorToConsole("DEBUG", "drop missing drop data");
-            return;
-        }
-
-        if (mCurrentDragElements != null && Arrays.equals(elements, mCurrentDragElements)) {
-            elements = mCurrentDragElements;
-        }
-
-        if (mTargetNode == null) {
-            ViewHierarchy viewHierarchy = mCanvas.getViewHierarchy();
-            if (viewHierarchy.isValid() && viewHierarchy.isEmpty()) {
-                // There is no target node because the drop happens on an empty document.
-                // Attempt to create a root node accordingly.
-                createDocumentRoot(elements);
-            } else {
-                if (DEBUG) AdtPlugin.printErrorToConsole("DEBUG", "dropped on null targetNode");
-            }
-            return;
-        }
-
-        updateDropFeedback(mFeedback, event);
-
-        final SimpleElement[] elementsFinal = elements;
-        final LayoutPoint canvasPoint = getDropLocation(event).toLayout();
-        String label = computeUndoLabel(mTargetNode, elements, event.detail);
-
-        // Create node listener which (during the drop) listens for node additions
-        // and stores the list of added node such that they can be selected afterwards.
-        final List<UiElementNode> added = new ArrayList<UiElementNode>();
-        // List of "index within parent" for each node
-        final List<Integer> indices = new ArrayList<Integer>();
-        NodeCreationListener listener = new NodeCreationListener() {
-            @Override
-            public void nodeCreated(UiElementNode parent, UiElementNode child, int index) {
-                if (parent == mTargetNode.getNode()) {
-                    added.add(child);
-
-                    // Adjust existing indices
-                    for (int i = 0, n = indices.size(); i < n; i++) {
-                        int idx = indices.get(i);
-                        if (idx >= index) {
-                            indices.set(i, idx + 1);
-                        }
-                    }
-
-                    indices.add(index);
-                }
-            }
-
-            @Override
-            public void nodeDeleted(UiElementNode parent, UiElementNode child, int previousIndex) {
-                if (parent == mTargetNode.getNode()) {
-                    // Adjust existing indices
-                    for (int i = 0, n = indices.size(); i < n; i++) {
-                        int idx = indices.get(i);
-                        if (idx >= previousIndex) {
-                            indices.set(i, idx - 1);
-                        }
-                    }
-
-                    // Make sure we aren't removing the same nodes that are being added
-                    // No, that can happen when canceling out of a drop handler such as
-                    // when dropping an included layout, then canceling out of the
-                    // resource chooser.
-                    //assert !added.contains(child);
-                }
-            }
-        };
-
-        try {
-            UiElementNode.addNodeCreationListener(listener);
-            mCanvas.getEditorDelegate().getEditor().wrapUndoEditXmlModel(label, new Runnable() {
-                @Override
-                public void run() {
-                    InsertType insertType = getInsertType(event, mTargetNode);
-                    mCanvas.getRulesEngine().callOnDropped(mTargetNode,
-                            elementsFinal,
-                            mFeedback,
-                            new Point(canvasPoint.x, canvasPoint.y),
-                            insertType);
-                    mTargetNode.applyPendingChanges();
-                    // Clean up drag if applicable
-                    if (event.detail == DND.DROP_MOVE) {
-                        GlobalCanvasDragInfo.getInstance().removeSource();
-                    }
-                    mTargetNode.applyPendingChanges();
-                }
-            });
-        } finally {
-            UiElementNode.removeNodeCreationListener(listener);
-        }
-
-        final List<INode> nodes = new ArrayList<INode>();
-        NodeFactory nodeFactory = mCanvas.getNodeFactory();
-        for (UiElementNode uiNode : added) {
-            if (uiNode instanceof UiViewElementNode) {
-                NodeProxy node = nodeFactory.create((UiViewElementNode) uiNode);
-                if (node != null) {
-                    nodes.add(node);
-                }
-            }
-        }
-
-        // Select the newly dropped nodes:
-        // Find out which nodes were added, and look up their corresponding
-        // CanvasViewInfos.
-        final SelectionManager selectionManager = mCanvas.getSelectionManager();
-        // Don't use the indices to search for corresponding nodes yet, since a
-        // render may not have happened yet and we'd rather use an up to date
-        // view hierarchy than indices to look up the right view infos.
-        if (!selectionManager.selectDropped(nodes, null /* indices */)) {
-            // In some scenarios we can't find the actual view infos yet; this
-            // seems to happen when you drag from one canvas to another (see the
-            // related comment next to the setFocus() call below). In that case
-            // defer selection briefly until the view hierarchy etc is up to
-            // date.
-            Display.getDefault().asyncExec(new Runnable() {
-                @Override
-                public void run() {
-                    selectionManager.selectDropped(nodes, indices);
-                }
-            });
-        }
-
-        clearDropInfo();
-        mCanvas.redraw();
-        // Request focus: This is *necessary* when you are dragging from one canvas editor
-        // to another, because without it, the redraw does not seem to be processed (the change
-        // is invisible until you click on the target canvas to give it focus).
-        mCanvas.setFocus();
-    }
-
-    /**
-     * Returns the right {@link InsertType} to use for the given drop target event and the
-     * given target node
-     *
-     * @param event the drop target event
-     * @param mTargetNode the node targeted by the drop
-     * @return the {link InsertType} to use for the drop
-     */
-    public static InsertType getInsertType(DropTargetEvent event, NodeProxy mTargetNode) {
-        GlobalCanvasDragInfo dragInfo = GlobalCanvasDragInfo.getInstance();
-        if (event.detail == DND.DROP_MOVE) {
-            SelectionItem[] selection = dragInfo.getCurrentSelection();
-            if (selection != null) {
-                for (SelectionItem item : selection) {
-                    if (item.getNode() != null
-                            && item.getNode().getParent() == mTargetNode) {
-                        return InsertType.MOVE_WITHIN;
-                    }
-                }
-            }
-
-            return InsertType.MOVE_INTO;
-        } else if (dragInfo.getSourceCanvas() != null) {
-            return InsertType.PASTE;
-        } else {
-            return InsertType.CREATE;
-        }
-    }
-
-    /**
-     * Computes a suitable Undo label to use for a drop operation, such as
-     * "Drop Button in LinearLayout" and "Move Widgets in RelativeLayout".
-     *
-     * @param targetNode The target of the drop
-     * @param elements The dragged widgets
-     * @param detail The DnD mode, as used in {@link DropTargetEvent#detail}.
-     * @return A string suitable as an undo-label for the drop event
-     */
-    public static String computeUndoLabel(NodeProxy targetNode,
-            SimpleElement[] elements, int detail) {
-        // Decide whether it's a move or a copy; we'll label moves specifically
-        // as a move and consider everything else a "Drop"
-        String verb = (detail == DND.DROP_MOVE) ? "Move" : "Drop";
-
-        // Get the type of widget being dropped/moved, IF there is only one. If
-        // there is more than one, just reference it as "Widgets".
-        String object;
-        if (elements != null && elements.length == 1) {
-            object = getSimpleName(elements[0].getFqcn());
-        } else {
-            object = "Widgets";
-        }
-
-        String where = getSimpleName(targetNode.getFqcn());
-
-        // When we localize this: $1 is the verb (Move or Drop), $2 is the
-        // object (such as "Button"), and $3 is the place we are doing it (such
-        // as "LinearLayout").
-        return String.format("%1$s %2$s in %3$s", verb, object, where);
-    }
-
-    /**
-     * Returns simple name (basename, following last dot) of a fully qualified
-     * class name.
-     *
-     * @param fqcn The fqcn to reduce
-     * @return The base name of the fqcn
-     */
-    public static String getSimpleName(String fqcn) {
-        // Note that the following works even when there is no dot, since
-        // lastIndexOf will return -1 so we get fcqn.substring(-1+1) =
-        // fcqn.substring(0) = fqcn
-        return fqcn.substring(fqcn.lastIndexOf('.') + 1);
-    }
-
-    /**
-     * Updates the {@link DropFeedback#isCopy} and {@link DropFeedback#sameCanvas} fields
-     * of the given {@link DropFeedback}. This is generally called right before invoking
-     * one of the callOnXyz methods of GRE to refresh the fields.
-     *
-     * @param df The current {@link DropFeedback}.
-     * @param event An optional event to determine if the current operation is copy or move.
-     */
-    private void updateDropFeedback(DropFeedback df, DropTargetEvent event) {
-        if (event != null) {
-            df.isCopy = event.detail == DND.DROP_COPY;
-        }
-        df.sameCanvas = mCanvas == mGlobalDragInfo.getSourceCanvas();
-        df.invalidTarget = false;
-        df.dipScale = mCanvas.getEditorDelegate().getGraphicalEditor().getDipScale();
-        df.modifierMask = mCanvas.getGestureManager().getRuleModifierMask();
-
-        // Set the drag bounds, after converting it from control coordinates to
-        // layout coordinates
-        GlobalCanvasDragInfo dragInfo = GlobalCanvasDragInfo.getInstance();
-        Rect dragBounds = null;
-        Rect controlDragBounds = dragInfo.getDragBounds();
-        if (controlDragBounds != null) {
-            CanvasTransform ht = mCanvas.getHorizontalTransform();
-            CanvasTransform vt = mCanvas.getVerticalTransform();
-            double horizScale = ht.getScale();
-            double verticalScale = vt.getScale();
-            int x = (int) (controlDragBounds.x / horizScale);
-            int y = (int) (controlDragBounds.y / verticalScale);
-            int w = (int) (controlDragBounds.w / horizScale);
-            int h = (int) (controlDragBounds.h / verticalScale);
-            dragBounds = new Rect(x, y, w, h);
-        }
-        int baseline = dragInfo.getDragBaseline();
-        if (baseline != -1) {
-            df.dragBaseline = baseline;
-        }
-        df.dragBounds = dragBounds;
-    }
-
-    /**
-     * Verifies that event.currentDataType is of type {@link SimpleXmlTransfer}.
-     * If not, try to find a valid data type.
-     * Otherwise set the drop to {@link DND#DROP_NONE} to cancel it.
-     *
-     * @return True if the data type is accepted.
-     */
-    private static boolean checkDataType(DropTargetEvent event) {
-
-        SimpleXmlTransfer sxt = SimpleXmlTransfer.getInstance();
-
-        TransferData current = event.currentDataType;
-
-        if (sxt.isSupportedType(current)) {
-            return true;
-        }
-
-        // We only support SimpleXmlTransfer and the current data type is not right.
-        // Let's see if we can find another one.
-
-        for (TransferData td : event.dataTypes) {
-            if (td != current && sxt.isSupportedType(td)) {
-                // We like this type better.
-                event.currentDataType = td;
-                return true;
-            }
-        }
-
-        // We failed to find any good transfer type.
-        event.detail = DND.DROP_NONE;
-        return false;
-    }
-
-    /**
-     * Returns the mouse location of the drop target event.
-     *
-     * @param event the drop target event
-     * @return a {@link ControlPoint} location corresponding to the top left corner
-     */
-    private ControlPoint getDropLocation(DropTargetEvent event) {
-        return ControlPoint.create(mCanvas, event);
-    }
-
-    /**
-     * Called on both dragEnter and dragMove.
-     * Generates the onDropEnter/Move/Leave events depending on the currently
-     * selected target node.
-     */
-    private void processDropEvent(DropTargetEvent event) {
-        if (!mCanvas.getViewHierarchy().isValid()) {
-            // We don't allow drop on an invalid layout, even if we have some obsolete
-            // layout info for it.
-            event.detail = DND.DROP_NONE;
-            clearDropInfo();
-            return;
-        }
-
-        LayoutPoint p = getDropLocation(event).toLayout();
-
-        // Is the mouse currently captured by a DropFeedback.captureArea?
-        boolean isCaptured = false;
-        if (mFeedback != null) {
-            Rect r = mFeedback.captureArea;
-            isCaptured = r != null && r.contains(p.x, p.y);
-        }
-
-        // We can't switch views/nodes when the mouse is captured
-        CanvasViewInfo vi;
-        if (isCaptured) {
-            vi = mCurrentView;
-        } else {
-            vi = mCanvas.getViewHierarchy().findViewInfoAt(p);
-
-            // When dragging into the canvas, if you are not over any other view, target
-            // the root element (since it may not "fill" the screen, e.g. if you have a linear
-            // layout but have layout_height wrap_content, then the layout will only extend
-            // to cover the children in the layout, not the whole visible screen area, which
-            // may be surprising
-            if (vi == null) {
-                vi = mCanvas.getViewHierarchy().getRoot();
-            }
-        }
-
-        boolean isMove = true;
-        boolean needRedraw = false;
-
-        if (vi != mCurrentView) {
-            // Current view has changed. Does that also change the target node?
-            // Note that either mCurrentView or vi can be null.
-
-            if (vi == null) {
-                // vi is null but mCurrentView is not, no view is a target anymore
-                // We don't need onDropMove in this case
-                isMove = false;
-                needRedraw = true;
-                event.detail = DND.DROP_NONE;
-                clearDropInfo(); // this will call callDropLeave.
-
-            } else {
-                // vi is a new current view.
-                // Query GRE for onDropEnter on the ViewInfo hierarchy, starting from the child
-                // towards its parent, till we find one that returns a non-null drop feedback.
-
-                DropFeedback df = null;
-                NodeProxy targetNode = null;
-
-                for (CanvasViewInfo targetVi = vi;
-                     targetVi != null && df == null;
-                     targetVi = targetVi.getParent()) {
-                    targetNode = mCanvas.getNodeFactory().create(targetVi);
-                    df = mCanvas.getRulesEngine().callOnDropEnter(targetNode,
-                            targetVi.getViewObject(), mCurrentDragElements);
-
-                    if (df != null) {
-                        // We should also dispatch an onDropMove() call to the initial enter
-                        // position, such that the view is notified of the position where
-                        // we are within the node immediately (before we for example attempt
-                        // to draw feedback). This is necessary since most views perform the
-                        // guideline computations in onDropMove (since only onDropMove is handed
-                        // the -position- of the mouse), and we want this computation to happen
-                        // before we ask the view to draw its feedback.
-                        updateDropFeedback(df, event);
-                        df = mCanvas.getRulesEngine().callOnDropMove(targetNode,
-                                mCurrentDragElements, df, new Point(p.x, p.y));
-                    }
-
-                    if (df != null &&
-                            event.detail == DND.DROP_MOVE &&
-                            mCanvas == mGlobalDragInfo.getSourceCanvas()) {
-                        // You can't move an object into itself in the same canvas.
-                        // E.g. case of moving a layout and the node under the mouse is the
-                        // layout itself: a copy would be ok but not a move operation of the
-                        // layout into himself.
-
-                        SelectionItem[] selection = mGlobalDragInfo.getCurrentSelection();
-                        if (selection != null) {
-                            for (SelectionItem cs : selection) {
-                                if (cs.getViewInfo() == targetVi) {
-                                    // The node that responded is one of the selection roots.
-                                    // Simply invalidate the drop feedback and move on the
-                                    // parent in the ViewInfo chain.
-
-                                    updateDropFeedback(df, event);
-                                    mCanvas.getRulesEngine().callOnDropLeave(
-                                            targetNode, mCurrentDragElements, df);
-                                    df = null;
-                                    targetNode = null;
-                                }
-                            }
-                        }
-                    }
-                }
-
-                if (df == null) {
-                    // Provide visual feedback that we are refusing the drop
-                    event.detail = DND.DROP_NONE;
-                    clearDropInfo();
-
-                } else if (targetNode != mTargetNode) {
-                    // We found a new target node for the drag'n'drop.
-                    // Release the previous one, if any.
-                    callDropLeave();
-
-                    // And assign the new one
-                    mTargetNode = targetNode;
-                    mFeedback = df;
-
-                    // We don't need onDropMove in this case
-                    isMove = false;
-                }
-            }
-
-            mCurrentView = vi;
-        }
-
-        if (isMove && mTargetNode != null && mFeedback != null) {
-            // this is a move inside the same view
-            com.android.ide.common.api.Point p2 =
-                new com.android.ide.common.api.Point(p.x, p.y);
-            updateDropFeedback(mFeedback, event);
-            DropFeedback df = mCanvas.getRulesEngine().callOnDropMove(
-                    mTargetNode, mCurrentDragElements, mFeedback, p2);
-            mCanvas.getGestureManager().updateMessage(mFeedback);
-
-            if (df == null) {
-                // The target is no longer interested in the drop move.
-                event.detail = DND.DROP_NONE;
-                callDropLeave();
-
-            } else if (df != mFeedback) {
-                mFeedback = df;
-            }
-        }
-
-        if (mFeedback != null) {
-            if (event.detail == DND.DROP_NONE && !mFeedback.invalidTarget) {
-                // If we previously provided visual feedback that we were refusing
-                // the drop, we now need to change it to mean we're accepting it.
-                event.detail = DND.DROP_DEFAULT;
-                recomputeDragType(event);
-
-            } else if (mFeedback.invalidTarget) {
-                // Provide visual feedback that we are refusing the drop
-                event.detail = DND.DROP_NONE;
-            }
-        }
-
-        if (needRedraw || (mFeedback != null && mFeedback.requestPaint)) {
-            mCanvas.redraw();
-        }
-
-        // Update outline to show the target node there
-        OutlinePage outline = mCanvas.getOutlinePage();
-        TreeSelection newSelection = TreeSelection.EMPTY;
-        if (mCurrentView != null && mTargetNode != null) {
-            // Find the view corresponding to the target node. The current view can be a leaf
-            // view whereas the target node is always a parent layout.
-            if (mCurrentView.getUiViewNode() != mTargetNode.getNode()) {
-                mCurrentView = mCurrentView.getParent();
-            }
-            if (mCurrentView != null && mCurrentView.getUiViewNode() == mTargetNode.getNode()) {
-                TreePath treePath = SelectionManager.getTreePath(mCurrentView);
-                newSelection = new TreeSelection(treePath);
-            }
-        }
-
-        ISelection currentSelection = outline.getSelection();
-        if (currentSelection == null || !currentSelection.equals(newSelection)) {
-            outline.setSelection(newSelection);
-        }
-    }
-
-    /**
-     * Calls onDropLeave on mTargetNode with the current mFeedback. <br/>
-     * Then clears mTargetNode and mFeedback.
-     */
-    private void callDropLeave() {
-        if (mTargetNode != null && mFeedback != null) {
-            updateDropFeedback(mFeedback, null);
-            mCanvas.getRulesEngine().callOnDropLeave(mTargetNode, mCurrentDragElements, mFeedback);
-        }
-
-        mTargetNode = null;
-        mFeedback = null;
-    }
-
-    private void clearDropInfo() {
-        callDropLeave();
-        mCurrentView = null;
-        mCanvas.redraw();
-    }
-
-    /**
-     * Creates a root element in an empty document.
-     * Only the first element's FQCN of the dragged elements is used.
-     * <p/>
-     * Actual XML handling is done by {@link LayoutCanvas#createDocumentRoot(String)}.
-     */
-    private void createDocumentRoot(SimpleElement[] elements) {
-        if (elements == null || elements.length < 1 || elements[0] == null) {
-            return;
-        }
-
-        mCanvas.createDocumentRoot(elements[0]);
-    }
-
-    /**
-     * An {@link Overlay} to paint the move feedback. This just delegates to the
-     * layout rules.
-     */
-    private class MoveOverlay extends Overlay {
-        @Override
-        public void paint(GC gc) {
-            if (mTargetNode != null && mFeedback != null) {
-                RulesEngine rulesEngine = mCanvas.getRulesEngine();
-                rulesEngine.callDropFeedbackPaint(mCanvas.getGcWrapper(), mTargetNode, mFeedback);
-                mFeedback.requestPaint = false;
-            }
-        }
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/OutlineDragListener.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/OutlineDragListener.java
deleted file mode 100644
index 1af3053..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/OutlineDragListener.java
+++ /dev/null
@@ -1,129 +0,0 @@
-/*
- * Copyright (C) 2010 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.editors.layout.gle2;
-
-import org.eclipse.jface.viewers.TreeViewer;
-import org.eclipse.swt.dnd.DND;
-import org.eclipse.swt.dnd.DragSourceEvent;
-import org.eclipse.swt.dnd.DragSourceListener;
-import org.eclipse.swt.dnd.TextTransfer;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.widgets.Tree;
-import org.eclipse.swt.widgets.TreeItem;
-
-import java.util.ArrayList;
-
-/** Drag listener for the outline page */
-/* package */ class OutlineDragListener implements DragSourceListener {
-    private TreeViewer mTreeViewer;
-    private OutlinePage mOutlinePage;
-    private final ArrayList<SelectionItem> mDragSelection = new ArrayList<SelectionItem>();
-    private SimpleElement[] mDragElements;
-
-    public OutlineDragListener(OutlinePage outlinePage, TreeViewer treeViewer) {
-        super();
-        mOutlinePage = outlinePage;
-        mTreeViewer = treeViewer;
-    }
-
-    @Override
-    public void dragStart(DragSourceEvent e) {
-        Tree tree = mTreeViewer.getTree();
-
-        TreeItem overTreeItem = tree.getItem(new Point(e.x, e.y));
-        if (overTreeItem == null) {
-            // Not dragging over a tree item
-            e.doit = false;
-            return;
-        }
-        CanvasViewInfo over = getViewInfo(overTreeItem);
-        if (over == null) {
-            e.doit = false;
-            return;
-        }
-
-        // The selection logic for the outline is much simpler than in the canvas,
-        // because for one thing, the tree selection is updated synchronously on mouse
-        // down, so it's not possible to start dragging a non-selected item.
-        // We also don't deliberately disallow root-element dragging since you can
-        // drag it into another form.
-        final LayoutCanvas canvas = mOutlinePage.getEditor().getCanvasControl();
-        SelectionManager selectionManager = canvas.getSelectionManager();
-        TreeItem[] treeSelection = tree.getSelection();
-        mDragSelection.clear();
-        for (TreeItem item : treeSelection) {
-            CanvasViewInfo viewInfo = getViewInfo(item);
-            if (viewInfo != null) {
-                mDragSelection.add(selectionManager.createSelection(viewInfo));
-            }
-        }
-        SelectionManager.sanitize(mDragSelection);
-
-        e.doit = !mDragSelection.isEmpty();
-        int imageCount = mDragSelection.size();
-        if (e.doit) {
-            mDragElements = SelectionItem.getAsElements(mDragSelection);
-            GlobalCanvasDragInfo.getInstance().startDrag(mDragElements,
-                    mDragSelection.toArray(new SelectionItem[imageCount]),
-                    canvas, new Runnable() {
-                        @Override
-                        public void run() {
-                            canvas.getClipboardSupport().deleteSelection("Remove",
-                                    mDragSelection);
-                        }
-                    });
-            return;
-        }
-
-        e.detail = DND.DROP_NONE;
-    }
-
-    @Override
-    public void dragSetData(DragSourceEvent e) {
-        if (TextTransfer.getInstance().isSupportedType(e.dataType)) {
-            LayoutCanvas canvas = mOutlinePage.getEditor().getCanvasControl();
-            e.data = SelectionItem.getAsText(canvas, mDragSelection);
-            return;
-        }
-
-        if (SimpleXmlTransfer.getInstance().isSupportedType(e.dataType)) {
-            e.data = mDragElements;
-            return;
-        }
-
-        // otherwise we failed
-        e.detail = DND.DROP_NONE;
-        e.doit = false;
-    }
-
-    @Override
-    public void dragFinished(DragSourceEvent e) {
-        // Unregister the dragged data.
-        // Clear the selection
-        mDragSelection.clear();
-        mDragElements = null;
-        GlobalCanvasDragInfo.getInstance().stopDrag();
-    }
-
-    private CanvasViewInfo getViewInfo(TreeItem item) {
-        Object data = item.getData();
-        if (data != null) {
-            return OutlinePage.getViewInfo(data);
-        }
-
-        return null;
-    }
-}
\ No newline at end of file
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/OutlineDropListener.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/OutlineDropListener.java
deleted file mode 100644
index f4a826f..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/OutlineDropListener.java
+++ /dev/null
@@ -1,217 +0,0 @@
-/*
- * Copyright (C) 2010 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.editors.layout.gle2;
-
-import com.android.ide.common.api.INode;
-import com.android.ide.common.api.InsertType;
-import com.android.ide.common.layout.BaseLayoutRule;
-import com.android.ide.eclipse.adt.internal.editors.descriptors.DescriptorsUtils;
-import com.android.ide.eclipse.adt.internal.editors.layout.gre.NodeProxy;
-import com.android.ide.eclipse.adt.internal.editors.layout.uimodel.UiViewElementNode;
-import com.android.ide.eclipse.adt.internal.editors.uimodel.UiElementNode;
-
-import org.eclipse.jface.viewers.TreeViewer;
-import org.eclipse.jface.viewers.ViewerDropAdapter;
-import org.eclipse.swt.dnd.DND;
-import org.eclipse.swt.dnd.DropTargetEvent;
-import org.eclipse.swt.dnd.TransferData;
-
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-/** Drop listener for the outline page */
-/*package*/ class OutlineDropListener extends ViewerDropAdapter {
-    private final OutlinePage mOutlinePage;
-
-    public OutlineDropListener(OutlinePage outlinePage, TreeViewer treeViewer) {
-        super(treeViewer);
-        mOutlinePage = outlinePage;
-    }
-
-    @Override
-    public void dragEnter(DropTargetEvent event) {
-        if (event.detail == DND.DROP_NONE && GlobalCanvasDragInfo.getInstance().isDragging()) {
-            // For some inexplicable reason, we get DND.DROP_NONE from the palette
-            // even though in its drag start we set DND.DROP_COPY, so correct that here...
-            int operation = DND.DROP_COPY;
-            event.detail = operation;
-        }
-        super.dragEnter(event);
-    }
-
-    @Override
-    public boolean performDrop(Object data) {
-        final DropTargetEvent event = getCurrentEvent();
-        if (event == null) {
-            return false;
-        }
-        int location = determineLocation(event);
-        if (location == LOCATION_NONE) {
-            return false;
-        }
-
-        final SimpleElement[] elements;
-        SimpleXmlTransfer sxt = SimpleXmlTransfer.getInstance();
-        if (sxt.isSupportedType(event.currentDataType)) {
-            if (data instanceof SimpleElement[]) {
-                elements = (SimpleElement[]) data;
-            } else {
-                return false;
-            }
-        } else {
-            return false;
-        }
-        if (elements.length == 0) {
-            return false;
-        }
-
-        // Determine target:
-        CanvasViewInfo parent = OutlinePage.getViewInfo(event.item.getData());
-        if (parent == null) {
-            return false;
-        }
-
-        int index = -1;
-        UiViewElementNode parentNode = parent.getUiViewNode();
-        if (location == LOCATION_BEFORE || location == LOCATION_AFTER) {
-            UiViewElementNode node = parentNode;
-            parent = parent.getParent();
-            if (parent == null) {
-                return false;
-            }
-            parentNode = parent.getUiViewNode();
-
-            // Determine index
-            index = 0;
-            for (UiElementNode child : parentNode.getUiChildren()) {
-                if (child == node) {
-                    break;
-                }
-                index++;
-            }
-            if (location == LOCATION_AFTER) {
-                index++;
-            }
-        }
-
-        // Copy into new position.
-        final LayoutCanvas canvas = mOutlinePage.getEditor().getCanvasControl();
-        final NodeProxy targetNode = canvas.getNodeFactory().create(parentNode);
-
-        // Record children of the target right before the drop (such that we can
-        // find out after the drop which exact children were inserted)
-        Set<INode> children = new HashSet<INode>();
-        for (INode node : targetNode.getChildren()) {
-            children.add(node);
-        }
-
-        String label = MoveGesture.computeUndoLabel(targetNode, elements, event.detail);
-        final int indexFinal = index;
-        canvas.getEditorDelegate().getEditor().wrapUndoEditXmlModel(label, new Runnable() {
-            @Override
-            public void run() {
-                InsertType insertType = MoveGesture.getInsertType(event, targetNode);
-                canvas.getRulesEngine().setInsertType(insertType);
-
-                Object sourceCanvas = GlobalCanvasDragInfo.getInstance().getSourceCanvas();
-                boolean createNew = event.detail == DND.DROP_COPY || sourceCanvas != canvas;
-                BaseLayoutRule.insertAt(targetNode, elements, createNew, indexFinal);
-                targetNode.applyPendingChanges();
-
-                // Clean up drag if applicable
-                if (event.detail == DND.DROP_MOVE) {
-                    GlobalCanvasDragInfo.getInstance().removeSource();
-                }
-            }
-        });
-
-        // Now find out which nodes were added, and look up their corresponding
-        // CanvasViewInfos
-        final List<INode> added = new ArrayList<INode>();
-        for (INode node : targetNode.getChildren()) {
-            if (!children.contains(node)) {
-                added.add(node);
-            }
-        }
-        // Select the newly dropped nodes
-        final SelectionManager selectionManager = canvas.getSelectionManager();
-        selectionManager.setOutlineSelection(added);
-
-        canvas.redraw();
-
-        return true;
-    }
-
-    @Override
-    public boolean validateDrop(Object target, int operation,
-            TransferData transferType) {
-        DropTargetEvent event = getCurrentEvent();
-        if (event == null) {
-            return false;
-        }
-        int location = determineLocation(event);
-        if (location == LOCATION_NONE) {
-            return false;
-        }
-
-        SimpleXmlTransfer sxt = SimpleXmlTransfer.getInstance();
-        if (!sxt.isSupportedType(transferType)) {
-            return false;
-        }
-
-        CanvasViewInfo parent = OutlinePage.getViewInfo(event.item.getData());
-        if (parent == null) {
-            return false;
-        }
-
-        UiViewElementNode parentNode = parent.getUiViewNode();
-
-        if (location == LOCATION_ON) {
-            // Targeting the middle of an item means to add it as a new child
-            // of the given element. This is only allowed on some types of nodes.
-            if (!DescriptorsUtils.canInsertChildren(parentNode.getDescriptor(),
-                    parent.getViewObject())) {
-                return false;
-            }
-        }
-
-        // Check that the drop target position is not a child or identical to
-        // one of the dragged items
-        SelectionItem[] sel = GlobalCanvasDragInfo.getInstance().getCurrentSelection();
-        if (sel != null) {
-            for (SelectionItem item : sel) {
-                if (isAncestor(item.getViewInfo().getUiViewNode(), parentNode)) {
-                    return false;
-                }
-            }
-        }
-
-        return true;
-    }
-
-    /** Returns true if the given parent node is an ancestor of the given child node  */
-    private boolean isAncestor(UiElementNode parent, UiElementNode child) {
-        while (child != null) {
-            if (child == parent) {
-                return true;
-            }
-            child = child.getUiParent();
-        }
-        return false;
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/OutlineOverlay.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/OutlineOverlay.java
deleted file mode 100644
index e63fff7..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/OutlineOverlay.java
+++ /dev/null
@@ -1,107 +0,0 @@
-/*
- * Copyright (C) 2010 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.editors.layout.gle2;
-
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Device;
-import org.eclipse.swt.graphics.GC;
-import org.eclipse.swt.graphics.Rectangle;
-
-/**
- * The {@link OutlineOverlay} paints an optional outline on top of the layout,
- * showing the structure of the individual Android View elements.
- */
-public class OutlineOverlay extends Overlay {
-    /** The {@link ViewHierarchy} this outline visualizes */
-    private final ViewHierarchy mViewHierarchy;
-
-    /** Outline color. Must be disposed, it's NOT a system color. */
-    private Color mOutlineColor;
-
-    /** Vertical scaling & scrollbar information. */
-    private CanvasTransform mVScale;
-
-    /** Horizontal scaling & scrollbar information. */
-    private CanvasTransform mHScale;
-
-    /**
-     * Constructs a new {@link OutlineOverlay} linked to the given view
-     * hierarchy.
-     *
-     * @param viewHierarchy The {@link ViewHierarchy} to render
-     * @param hScale The {@link CanvasTransform} to use to transfer horizontal layout
-     *            coordinates to screen coordinates
-     * @param vScale The {@link CanvasTransform} to use to transfer vertical layout
-     *            coordinates to screen coordinates
-     */
-    public OutlineOverlay(
-            ViewHierarchy viewHierarchy,
-            CanvasTransform hScale,
-            CanvasTransform vScale) {
-        super();
-        mViewHierarchy = viewHierarchy;
-        mHScale = hScale;
-        mVScale = vScale;
-    }
-
-    @Override
-    public void create(Device device) {
-        mOutlineColor = new Color(device, SwtDrawingStyle.OUTLINE.getStrokeColor());
-    }
-
-    @Override
-    public void dispose() {
-        if (mOutlineColor != null) {
-            mOutlineColor.dispose();
-            mOutlineColor = null;
-        }
-    }
-
-    @Override
-    public void paint(GC gc) {
-        CanvasViewInfo lastRoot = mViewHierarchy.getRoot();
-        if (lastRoot != null) {
-            gc.setForeground(mOutlineColor);
-            gc.setLineStyle(SwtDrawingStyle.OUTLINE.getLineStyle());
-            int oldAlpha = gc.getAlpha();
-            gc.setAlpha(SwtDrawingStyle.OUTLINE.getStrokeAlpha());
-            drawOutline(gc, lastRoot);
-            gc.setAlpha(oldAlpha);
-        }
-    }
-
-    private void drawOutline(GC gc, CanvasViewInfo info) {
-        Rectangle r = info.getAbsRect();
-
-        int x = mHScale.translate(r.x);
-        int y = mVScale.translate(r.y);
-        int w = mHScale.scale(r.width);
-        int h = mVScale.scale(r.height);
-
-        // Add +1 to the width and +1 to the height such that when you have a
-        // series of boxes (in say a LinearLayout), instead of the bottom of one
-        // box and the top of the next box being -adjacent-, they -overlap-.
-        // This makes the outline nicer visually since you don't get
-        // "double thickness" lines for all adjacent boxes.
-        gc.drawRectangle(x, y, w + 1, h + 1);
-
-        for (CanvasViewInfo vi : info.getChildren()) {
-            drawOutline(gc, vi);
-        }
-    }
-
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/OutlinePage.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/OutlinePage.java
deleted file mode 100644
index 8178c68..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/OutlinePage.java
+++ /dev/null
@@ -1,1439 +0,0 @@
-/*
- * Copyright (C) 2010 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.editors.layout.gle2;
-
-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_COLUMN_SPAN;
-import static com.android.SdkConstants.ATTR_LAYOUT_GRAVITY;
-import static com.android.SdkConstants.ATTR_LAYOUT_ROW;
-import static com.android.SdkConstants.ATTR_LAYOUT_ROW_SPAN;
-import static com.android.SdkConstants.ATTR_ROW_COUNT;
-import static com.android.SdkConstants.ATTR_SRC;
-import static com.android.SdkConstants.ATTR_TEXT;
-import static com.android.SdkConstants.AUTO_URI;
-import static com.android.SdkConstants.DRAWABLE_PREFIX;
-import static com.android.SdkConstants.GRID_LAYOUT;
-import static com.android.SdkConstants.LAYOUT_RESOURCE_PREFIX;
-import static com.android.SdkConstants.URI_PREFIX;
-import static org.eclipse.jface.viewers.StyledString.COUNTER_STYLER;
-import static org.eclipse.jface.viewers.StyledString.QUALIFIER_STYLER;
-
-import com.android.SdkConstants;
-import com.android.annotations.VisibleForTesting;
-import com.android.ide.common.api.INode;
-import com.android.ide.common.api.InsertType;
-import com.android.ide.common.layout.BaseLayoutRule;
-import com.android.ide.common.layout.GridLayoutRule;
-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.ide.eclipse.adt.internal.editors.descriptors.DescriptorsUtils;
-import com.android.ide.eclipse.adt.internal.editors.layout.LayoutEditorDelegate;
-import com.android.ide.eclipse.adt.internal.editors.layout.gle2.IncludeFinder.Reference;
-import com.android.ide.eclipse.adt.internal.editors.layout.gre.NodeProxy;
-import com.android.ide.eclipse.adt.internal.editors.layout.properties.PropertySheetPage;
-import com.android.ide.eclipse.adt.internal.editors.layout.uimodel.UiViewElementNode;
-import com.android.ide.eclipse.adt.internal.editors.manifest.ManifestInfo;
-import com.android.ide.eclipse.adt.internal.editors.uimodel.UiElementNode;
-import com.android.ide.eclipse.adt.internal.sdk.ProjectState;
-import com.android.ide.eclipse.adt.internal.sdk.Sdk;
-import com.android.utils.Pair;
-
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.ActionContributionItem;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.action.IContributionItem;
-import org.eclipse.jface.action.IMenuListener;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.action.IToolBarManager;
-import org.eclipse.jface.action.MenuManager;
-import org.eclipse.jface.action.Separator;
-import org.eclipse.jface.preference.JFacePreferences;
-import org.eclipse.jface.viewers.DoubleClickEvent;
-import org.eclipse.jface.viewers.IDoubleClickListener;
-import org.eclipse.jface.viewers.IElementComparer;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.ITreeContentProvider;
-import org.eclipse.jface.viewers.ITreeSelection;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.StyledCellLabelProvider;
-import org.eclipse.jface.viewers.StyledString;
-import org.eclipse.jface.viewers.StyledString.Styler;
-import org.eclipse.jface.viewers.TreePath;
-import org.eclipse.jface.viewers.TreeSelection;
-import org.eclipse.jface.viewers.TreeViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerCell;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.dnd.DND;
-import org.eclipse.swt.dnd.Transfer;
-import org.eclipse.swt.events.DisposeEvent;
-import org.eclipse.swt.events.DisposeListener;
-import org.eclipse.swt.events.KeyEvent;
-import org.eclipse.swt.events.KeyListener;
-import org.eclipse.swt.events.MenuDetectEvent;
-import org.eclipse.swt.events.MenuDetectListener;
-import org.eclipse.swt.events.MouseEvent;
-import org.eclipse.swt.events.MouseListener;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.graphics.Rectangle;
-import org.eclipse.swt.layout.FillLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Listener;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.swt.widgets.Tree;
-import org.eclipse.swt.widgets.TreeItem;
-import org.eclipse.ui.IActionBars;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.INullSelectionListener;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.actions.ActionFactory;
-import org.eclipse.ui.views.contentoutline.ContentOutlinePage;
-import org.eclipse.wb.core.controls.SelfOrientingSashForm;
-import org.eclipse.wb.internal.core.editor.structure.IPage;
-import org.eclipse.wb.internal.core.editor.structure.PageSiteComposite;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-/**
- * An outline page for the layout canvas view.
- * <p/>
- * The page is created by {@link LayoutEditorDelegate#delegateGetAdapter(Class)}. This means
- * we have *one* instance of the outline page per open canvas editor.
- * <p/>
- * It sets itself as a listener on the site's selection service in order to be
- * notified of the canvas' selection changes.
- * The underlying page is also a selection provider (via IContentOutlinePage)
- * and as such it will broadcast selection changes to the site's selection service
- * (on which both the layout editor part and the property sheet page listen.)
- */
-public class OutlinePage extends ContentOutlinePage
-    implements INullSelectionListener, IPage {
-
-    /** Label which separates outline text from additional attributes like text prefix or url */
-    private static final String LABEL_SEPARATOR = " - ";
-
-    /** Max character count in labels, used for truncation */
-    private static final int LABEL_MAX_WIDTH = 50;
-
-    /**
-     * The graphical editor that created this outline.
-     */
-    private final GraphicalEditorPart mGraphicalEditorPart;
-
-    /**
-     * RootWrapper is a workaround: we can't set the input of the TreeView to its root
-     * element, so we introduce a fake parent.
-     */
-    private final RootWrapper mRootWrapper = new RootWrapper();
-
-    /**
-     * Menu manager for the context menu actions.
-     * The actions delegate to the current GraphicalEditorPart.
-     */
-    private MenuManager mMenuManager;
-
-    private Composite mControl;
-    private PropertySheetPage mPropertySheet;
-    private PageSiteComposite mPropertySheetComposite;
-    private boolean mShowPropertySheet;
-    private boolean mShowHeader;
-    private boolean mIgnoreSelection;
-    private boolean mActive = true;
-
-    /** Action to Select All in the tree */
-    private final Action mTreeSelectAllAction = new Action() {
-        @Override
-        public void run() {
-            getTreeViewer().getTree().selectAll();
-            OutlinePage.this.fireSelectionChanged(getSelection());
-        }
-
-        @Override
-        public String getId() {
-            return ActionFactory.SELECT_ALL.getId();
-        }
-    };
-
-    /** Action for moving items up in the tree */
-    private Action mMoveUpAction = new Action("Move Up\t-",
-            IconFactory.getInstance().getImageDescriptor("up")) { //$NON-NLS-1$
-
-        @Override
-        public String getId() {
-            return "adt.outline.moveup"; //$NON-NLS-1$
-        }
-
-        @Override
-        public boolean isEnabled() {
-            return canMove(false);
-        }
-
-        @Override
-        public void run() {
-            move(false);
-        }
-    };
-
-    /** Action for moving items down in the tree */
-    private Action mMoveDownAction = new Action("Move Down\t+",
-            IconFactory.getInstance().getImageDescriptor("down")) { //$NON-NLS-1$
-
-        @Override
-        public String getId() {
-            return "adt.outline.movedown"; //$NON-NLS-1$
-        }
-
-        @Override
-        public boolean isEnabled() {
-            return canMove(true);
-        }
-
-        @Override
-        public void run() {
-            move(true);
-        }
-    };
-
-    /**
-     * Creates a new {@link OutlinePage} associated with the given editor
-     *
-     * @param graphicalEditorPart the editor associated with this outline
-     */
-    public OutlinePage(GraphicalEditorPart graphicalEditorPart) {
-        super();
-        mGraphicalEditorPart = graphicalEditorPart;
-    }
-
-    @Override
-    public Control getControl() {
-        // We've injected some controls between the root of the outline page
-        // and the tree control, so return the actual root (a sash form) rather
-        // than the superclass' implementation which returns the tree. If we don't
-        // do this, various checks in the outline page which checks that getControl().getParent()
-        // is the outline window itself will ignore this page.
-        return mControl;
-    }
-
-    void setActive(boolean active) {
-        if (active != mActive) {
-            mActive = active;
-
-            // Outlines are by default active when they are created; this is intended
-            // for deactivating a hidden outline and later reactivating it
-            assert mControl != null;
-            if (active) {
-                getSite().getPage().addSelectionListener(this);
-                setModel(mGraphicalEditorPart.getCanvasControl().getViewHierarchy().getRoot());
-            } else {
-                getSite().getPage().removeSelectionListener(this);
-                mRootWrapper.setRoot(null);
-                if (mPropertySheet != null) {
-                    mPropertySheet.selectionChanged(null, TreeSelection.EMPTY);
-                }
-            }
-        }
-    }
-
-    /** Refresh all the icon state */
-    public void refreshIcons() {
-        TreeViewer treeViewer = getTreeViewer();
-        if (treeViewer != null) {
-            Tree tree = treeViewer.getTree();
-            if (tree != null && !tree.isDisposed()) {
-                treeViewer.refresh();
-            }
-        }
-    }
-
-    /**
-     * Set whether the outline should be shown in the header
-     *
-     * @param show whether a header should be shown
-     */
-    public void setShowHeader(boolean show) {
-        mShowHeader = show;
-    }
-
-    /**
-     * Set whether the property sheet should be shown within this outline
-     *
-     * @param show whether the property sheet should show
-     */
-    public void setShowPropertySheet(boolean show) {
-        if (show != mShowPropertySheet) {
-            mShowPropertySheet = show;
-            if (mControl == null) {
-                return;
-            }
-
-            if (show && mPropertySheet == null) {
-                createPropertySheet();
-            } else if (!show) {
-                mPropertySheetComposite.dispose();
-                mPropertySheetComposite = null;
-                mPropertySheet.dispose();
-                mPropertySheet = null;
-            }
-
-            mControl.layout();
-        }
-    }
-
-    @Override
-    public void createControl(Composite parent) {
-        mControl = new SelfOrientingSashForm(parent, SWT.VERTICAL);
-
-        if (mShowHeader) {
-            PageSiteComposite mOutlineComposite = new PageSiteComposite(mControl, SWT.BORDER);
-            mOutlineComposite.setTitleText("Outline");
-            mOutlineComposite.setTitleImage(IconFactory.getInstance().getIcon("components_view"));
-            mOutlineComposite.setPage(new IPage() {
-                @Override
-                public void createControl(Composite outlineParent) {
-                    createOutline(outlineParent);
-                }
-
-                @Override
-                public void dispose() {
-                }
-
-                @Override
-                public Control getControl() {
-                    return getTreeViewer().getTree();
-                }
-
-                @Override
-                public void setToolBar(IToolBarManager toolBarManager) {
-                    makeContributions(null, toolBarManager, null);
-                    toolBarManager.update(false);
-                }
-
-                @Override
-                public void setFocus() {
-                    getControl().setFocus();
-                }
-            });
-        } else {
-            createOutline(mControl);
-        }
-
-        if (mShowPropertySheet) {
-            createPropertySheet();
-        }
-    }
-
-    private void createOutline(Composite parent) {
-        if (AdtUtils.isEclipse4()) {
-            // This is a workaround for the focus behavior in Eclipse 4 where
-            // the framework ends up calling setFocus() on the first widget in the outline
-            // AFTER a mouse click has been received. Specifically, if the user clicks in
-            // the embedded property sheet to for example give a Text property editor focus,
-            // then after the mouse click, the Outline window activation event is processed,
-            // and this event causes setFocus() to be called first on the PageBookView (which
-            // ends up calling setFocus on the first control, normally the TreeViewer), and
-            // then on the Page itself. We're dealing with the page setFocus() in the override
-            // of that method in the class, such that it does nothing.
-            // However, we have to also disable the setFocus on the first control in the
-            // outline page. To deal with that, we create our *own* first control in the
-            // outline, and make its setFocus() a no-op. We also make it invisible, since we
-            // don't actually want anything but the tree viewer showing in the outline.
-            Text text = new Text(parent, SWT.NONE) {
-                @Override
-                public boolean setFocus() {
-                    // Focus no-op
-                    return true;
-                }
-
-                @Override
-                protected void checkSubclass() {
-                    // Disable the check that prevents subclassing of SWT components
-                }
-            };
-            text.setVisible(false);
-        }
-
-        super.createControl(parent);
-
-        TreeViewer tv = getTreeViewer();
-        tv.setAutoExpandLevel(2);
-        tv.setContentProvider(new ContentProvider());
-        tv.setLabelProvider(new LabelProvider());
-        tv.setInput(mRootWrapper);
-        tv.expandToLevel(mRootWrapper.getRoot(), 2);
-
-        int supportedOperations = DND.DROP_COPY | DND.DROP_MOVE;
-        Transfer[] transfers = new Transfer[] {
-            SimpleXmlTransfer.getInstance()
-        };
-
-        tv.addDropSupport(supportedOperations, transfers, new OutlineDropListener(this, tv));
-        tv.addDragSupport(supportedOperations, transfers, new OutlineDragListener(this, tv));
-
-        // The tree viewer will hold CanvasViewInfo instances, however these
-        // change each time the canvas is reloaded. OTOH layoutlib gives us
-        // constant UiView keys which we can use to perform tree item comparisons.
-        tv.setComparer(new IElementComparer() {
-            @Override
-            public int hashCode(Object element) {
-                if (element instanceof CanvasViewInfo) {
-                    UiViewElementNode key = ((CanvasViewInfo) element).getUiViewNode();
-                    if (key != null) {
-                        return key.hashCode();
-                    }
-                }
-                if (element != null) {
-                    return element.hashCode();
-                }
-                return 0;
-            }
-
-            @Override
-            public boolean equals(Object a, Object b) {
-                if (a instanceof CanvasViewInfo && b instanceof CanvasViewInfo) {
-                    UiViewElementNode keyA = ((CanvasViewInfo) a).getUiViewNode();
-                    UiViewElementNode keyB = ((CanvasViewInfo) b).getUiViewNode();
-                    if (keyA != null) {
-                        return keyA.equals(keyB);
-                    }
-                }
-                if (a != null) {
-                    return a.equals(b);
-                }
-                return false;
-            }
-        });
-        tv.addDoubleClickListener(new IDoubleClickListener() {
-            @Override
-            public void doubleClick(DoubleClickEvent event) {
-                // This used to open the property view, but now that properties are docked
-                // let's use it for something else -- such as showing the editor source
-                /*
-                // Front properties panel; its selection is already linked
-                IWorkbenchPage page = getSite().getPage();
-                try {
-                    page.showView(IPageLayout.ID_PROP_SHEET, null, IWorkbenchPage.VIEW_ACTIVATE);
-                } catch (PartInitException e) {
-                    AdtPlugin.log(e, "Could not activate property sheet");
-                }
-                */
-
-                TreeItem[] selection = getTreeViewer().getTree().getSelection();
-                if (selection.length > 0) {
-                    CanvasViewInfo vi = getViewInfo(selection[0].getData());
-                    if (vi != null) {
-                        LayoutCanvas canvas = mGraphicalEditorPart.getCanvasControl();
-                        canvas.show(vi);
-                    }
-                }
-            }
-        });
-
-        setupContextMenu();
-
-        // Listen to selection changes from the layout editor
-        getSite().getPage().addSelectionListener(this);
-        getControl().addDisposeListener(new DisposeListener() {
-
-            @Override
-            public void widgetDisposed(DisposeEvent e) {
-                dispose();
-            }
-        });
-
-        Tree tree = tv.getTree();
-        tree.addKeyListener(new KeyListener() {
-
-            @Override
-            public void keyPressed(KeyEvent e) {
-                if (e.character == '-') {
-                    if (mMoveUpAction.isEnabled()) {
-                        mMoveUpAction.run();
-                    }
-                } else if (e.character == '+') {
-                    if (mMoveDownAction.isEnabled()) {
-                        mMoveDownAction.run();
-                    }
-                }
-            }
-
-            @Override
-            public void keyReleased(KeyEvent e) {
-            }
-        });
-
-        setupTooltip();
-    }
-
-    /**
-     * This flag is true when the mouse button is being pressed somewhere inside
-     * the property sheet
-     */
-    private boolean mPressInPropSheet;
-
-    private void createPropertySheet() {
-        mPropertySheetComposite = new PageSiteComposite(mControl, SWT.BORDER);
-        mPropertySheetComposite.setTitleText("Properties");
-        mPropertySheetComposite.setTitleImage(IconFactory.getInstance().getIcon("properties_view"));
-        mPropertySheet = new PropertySheetPage(mGraphicalEditorPart);
-        mPropertySheetComposite.setPage(mPropertySheet);
-        if (AdtUtils.isEclipse4()) {
-            mPropertySheet.getControl().addMouseListener(new MouseListener() {
-                @Override
-                public void mouseDown(MouseEvent e) {
-                    mPressInPropSheet = true;
-                }
-
-                @Override
-                public void mouseUp(MouseEvent e) {
-                    mPressInPropSheet = false;
-                }
-
-                @Override
-                public void mouseDoubleClick(MouseEvent e) {
-                }
-            });
-        }
-    }
-
-    @Override
-    public void setFocus() {
-        // Only call setFocus on the tree viewer if the mouse click isn't in the property
-        // sheet area
-        if (!mPressInPropSheet) {
-            super.setFocus();
-        }
-    }
-
-    @Override
-    public void dispose() {
-        mRootWrapper.setRoot(null);
-
-        getSite().getPage().removeSelectionListener(this);
-        super.dispose();
-        if (mPropertySheet != null) {
-            mPropertySheet.dispose();
-            mPropertySheet = null;
-        }
-    }
-
-    /**
-     * Invoked by {@link LayoutCanvas} to set the model (a.k.a. the root view info).
-     *
-     * @param rootViewInfo The root of the view info hierarchy. Can be null.
-     */
-    public void setModel(CanvasViewInfo rootViewInfo) {
-        if (!mActive) {
-            return;
-        }
-
-        mRootWrapper.setRoot(rootViewInfo);
-
-        TreeViewer tv = getTreeViewer();
-        if (tv != null && !tv.getTree().isDisposed()) {
-            Object[] expanded = tv.getExpandedElements();
-            tv.refresh();
-            tv.setExpandedElements(expanded);
-            // Ensure that the root is expanded
-            tv.expandToLevel(rootViewInfo, 2);
-        }
-    }
-
-    /**
-     * Returns the current tree viewer selection. Shouldn't be null,
-     * although it can be {@link TreeSelection#EMPTY}.
-     */
-    @Override
-    public ISelection getSelection() {
-        return super.getSelection();
-    }
-
-    /**
-     * Sets the outline selection.
-     *
-     * @param selection Only {@link ITreeSelection} will be used, otherwise the
-     *   selection will be cleared (including a null selection).
-     */
-    @Override
-    public void setSelection(ISelection selection) {
-        // TreeViewer should be able to deal with a null selection, but let's make it safe
-        if (selection == null) {
-            selection = TreeSelection.EMPTY;
-        }
-        if (selection.equals(TreeSelection.EMPTY)) {
-            return;
-        }
-
-        super.setSelection(selection);
-
-        TreeViewer tv = getTreeViewer();
-        if (tv == null || !(selection instanceof ITreeSelection) || selection.isEmpty()) {
-            return;
-        }
-
-        // auto-reveal the selection
-        ITreeSelection treeSel = (ITreeSelection) selection;
-        for (TreePath p : treeSel.getPaths()) {
-            tv.expandToLevel(p, 1);
-        }
-    }
-
-    @Override
-    protected void fireSelectionChanged(ISelection selection) {
-        super.fireSelectionChanged(selection);
-        if (mPropertySheet != null && !mIgnoreSelection) {
-            mPropertySheet.selectionChanged(null, selection);
-        }
-    }
-
-    /**
-     * Listens to a workbench selection.
-     * Only listen on selection coming from {@link LayoutEditorDelegate}, which avoid
-     * picking up our own selections.
-     */
-    @Override
-    public void selectionChanged(IWorkbenchPart part, ISelection selection) {
-        if (mIgnoreSelection) {
-            return;
-        }
-
-        if (part instanceof IEditorPart) {
-            LayoutEditorDelegate delegate = LayoutEditorDelegate.fromEditor((IEditorPart) part);
-            if (delegate != null) {
-                try {
-                    mIgnoreSelection = true;
-                    setSelection(selection);
-
-                    if (mPropertySheet != null) {
-                        mPropertySheet.selectionChanged(part, selection);
-                    }
-                } finally {
-                    mIgnoreSelection = false;
-                }
-            }
-        }
-    }
-
-    @Override
-    public void selectionChanged(SelectionChangedEvent event) {
-        if (!mIgnoreSelection) {
-            super.selectionChanged(event);
-        }
-    }
-
-    // ----
-
-    /**
-     * In theory, the root of the model should be the input of the {@link TreeViewer},
-     * which would be the root {@link CanvasViewInfo}.
-     * That means in theory {@link ContentProvider#getElements(Object)} should return
-     * its own input as the single root node.
-     * <p/>
-     * However as described in JFace Bug 9262, this case is not properly handled by
-     * a {@link TreeViewer} and leads to an infinite recursion in the tree viewer.
-     * See https://bugs.eclipse.org/bugs/show_bug.cgi?id=9262
-     * <p/>
-     * The solution is to wrap the tree viewer input in a dummy root node that acts
-     * as a parent. This class does just that.
-     */
-    private static class RootWrapper {
-        private CanvasViewInfo mRoot;
-
-        public void setRoot(CanvasViewInfo root) {
-            mRoot = root;
-        }
-
-        public CanvasViewInfo getRoot() {
-            return mRoot;
-        }
-    }
-
-    /** Return the {@link CanvasViewInfo} associated with the given TreeItem's data field */
-    /* package */ static CanvasViewInfo getViewInfo(Object viewData) {
-        if (viewData instanceof RootWrapper) {
-            return ((RootWrapper) viewData).getRoot();
-        }
-        if (viewData instanceof CanvasViewInfo) {
-            return (CanvasViewInfo) viewData;
-        }
-        return null;
-    }
-
-    // --- Content and Label Providers ---
-
-    /**
-     * Content provider for the Outline model.
-     * Objects are going to be {@link CanvasViewInfo}.
-     */
-    private static class ContentProvider implements ITreeContentProvider {
-
-        @Override
-        public Object[] getChildren(Object element) {
-            if (element instanceof RootWrapper) {
-                CanvasViewInfo root = ((RootWrapper)element).getRoot();
-                if (root != null) {
-                    return new Object[] { root };
-                }
-            }
-            if (element instanceof CanvasViewInfo) {
-                List<CanvasViewInfo> children = ((CanvasViewInfo) element).getUniqueChildren();
-                if (children != null) {
-                    return children.toArray();
-                }
-            }
-            return new Object[0];
-        }
-
-        @Override
-        public Object getParent(Object element) {
-            if (element instanceof CanvasViewInfo) {
-                return ((CanvasViewInfo) element).getParent();
-            }
-            return null;
-        }
-
-        @Override
-        public boolean hasChildren(Object element) {
-            if (element instanceof CanvasViewInfo) {
-                List<CanvasViewInfo> children = ((CanvasViewInfo) element).getChildren();
-                if (children != null) {
-                    return children.size() > 0;
-                }
-            }
-            return false;
-        }
-
-        /**
-         * Returns the root element.
-         * Semantically, the root element is the single top-level XML element of the XML layout.
-         */
-        @Override
-        public Object[] getElements(Object inputElement) {
-            return getChildren(inputElement);
-        }
-
-        @Override
-        public void dispose() {
-            // pass
-        }
-
-        @Override
-        public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-            // pass
-        }
-    }
-
-    /**
-     * Label provider for the Outline model.
-     * Objects are going to be {@link CanvasViewInfo}.
-     */
-    private class LabelProvider extends StyledCellLabelProvider {
-        /**
-         * Returns the element's logo with a fallback on the android logo.
-         *
-         * @param element the tree element
-         * @return the image to be used as a logo
-         */
-        public Image getImage(Object element) {
-            if (element instanceof CanvasViewInfo) {
-                element = ((CanvasViewInfo) element).getUiViewNode();
-            }
-
-            if (element instanceof UiViewElementNode) {
-                UiViewElementNode v = (UiViewElementNode) element;
-                return v.getIcon();
-            }
-
-            return AdtPlugin.getAndroidLogo();
-        }
-
-        /**
-         * Uses {@link UiElementNode#getStyledDescription} for the label for this tree item.
-         */
-        @Override
-        public void update(ViewerCell cell) {
-            Object element = cell.getElement();
-            StyledString styledString = null;
-
-            CanvasViewInfo vi = null;
-            if (element instanceof CanvasViewInfo) {
-                vi = (CanvasViewInfo) element;
-                element = vi.getUiViewNode();
-            }
-
-            Image image = getImage(element);
-
-            if (element instanceof UiElementNode) {
-                UiElementNode node = (UiElementNode) element;
-                styledString = node.getStyledDescription();
-                Node xmlNode = node.getXmlNode();
-                if (xmlNode instanceof Element) {
-                    Element e = (Element) xmlNode;
-
-                    // Temporary diagnostics code when developing GridLayout
-                    if (GridLayoutRule.sDebugGridLayout) {
-
-                        String namespace;
-                        if (e.getNodeName().equals(GRID_LAYOUT) ||
-                                e.getParentNode() != null
-                                && e.getParentNode().getNodeName().equals(GRID_LAYOUT)) {
-                            namespace = ANDROID_URI;
-                        } else {
-                            // Else: probably a v7 gridlayout
-                            IProject project = mGraphicalEditorPart.getProject();
-                            ProjectState projectState = Sdk.getProjectState(project);
-                            if (projectState != null && projectState.isLibrary()) {
-                                namespace = AUTO_URI;
-                            } else {
-                                ManifestInfo info = ManifestInfo.get(project);
-                                namespace = URI_PREFIX + info.getPackage();
-                            }
-                        }
-
-                        if (e.getNodeName() != null && e.getNodeName().endsWith(GRID_LAYOUT)) {
-                            // Attach rowCount/columnCount info
-                            String rowCount = e.getAttributeNS(namespace, ATTR_ROW_COUNT);
-                            if (rowCount.length() == 0) {
-                                rowCount = "?";
-                            }
-                            String columnCount = e.getAttributeNS(namespace, ATTR_COLUMN_COUNT);
-                            if (columnCount.length() == 0) {
-                                columnCount = "?";
-                            }
-
-                            styledString.append(" - columnCount=", QUALIFIER_STYLER);
-                            styledString.append(columnCount, QUALIFIER_STYLER);
-                            styledString.append(", rowCount=", QUALIFIER_STYLER);
-                            styledString.append(rowCount, QUALIFIER_STYLER);
-                        } else if (e.getParentNode() != null
-                            && e.getParentNode().getNodeName() != null
-                            && e.getParentNode().getNodeName().endsWith(GRID_LAYOUT)) {
-                            // Attach row/column info
-                            String row = e.getAttributeNS(namespace, ATTR_LAYOUT_ROW);
-                            if (row.length() == 0) {
-                                row = "?";
-                            }
-                            Styler colStyle = QUALIFIER_STYLER;
-                            String column = e.getAttributeNS(namespace, ATTR_LAYOUT_COLUMN);
-                            if (column.length() == 0) {
-                                column = "?";
-                            } else {
-                                String colCount = ((Element) e.getParentNode()).getAttributeNS(
-                                        namespace, ATTR_COLUMN_COUNT);
-                                if (colCount.length() > 0 && Integer.parseInt(colCount) <=
-                                        Integer.parseInt(column)) {
-                                    colStyle = StyledString.createColorRegistryStyler(
-                                        JFacePreferences.ERROR_COLOR, null);
-                                }
-                            }
-                            String rowSpan = e.getAttributeNS(namespace, ATTR_LAYOUT_ROW_SPAN);
-                            String columnSpan = e.getAttributeNS(namespace,
-                                    ATTR_LAYOUT_COLUMN_SPAN);
-                            if (rowSpan.length() == 0) {
-                                rowSpan = "1";
-                            }
-                            if (columnSpan.length() == 0) {
-                                columnSpan = "1";
-                            }
-
-                            styledString.append(" - cell (row=", QUALIFIER_STYLER);
-                            styledString.append(row, QUALIFIER_STYLER);
-                            styledString.append(',', QUALIFIER_STYLER);
-                            styledString.append("col=", colStyle);
-                            styledString.append(column, colStyle);
-                            styledString.append(')', colStyle);
-                            styledString.append(", span=(", QUALIFIER_STYLER);
-                            styledString.append(columnSpan, QUALIFIER_STYLER);
-                            styledString.append(',', QUALIFIER_STYLER);
-                            styledString.append(rowSpan, QUALIFIER_STYLER);
-                            styledString.append(')', QUALIFIER_STYLER);
-
-                            String gravity = e.getAttributeNS(namespace, ATTR_LAYOUT_GRAVITY);
-                            if (gravity != null && gravity.length() > 0) {
-                                styledString.append(" : ", COUNTER_STYLER);
-                                styledString.append(gravity, COUNTER_STYLER);
-                            }
-
-                        }
-                    }
-
-                    if (e.hasAttributeNS(ANDROID_URI, ATTR_TEXT)) {
-                        // Show the text attribute
-                        String text = e.getAttributeNS(ANDROID_URI, ATTR_TEXT);
-                        if (text != null && text.length() > 0
-                                && !text.contains(node.getDescriptor().getUiName())) {
-                            if (text.charAt(0) == '@') {
-                                String resolved = mGraphicalEditorPart.findString(text);
-                                if (resolved != null) {
-                                    text = resolved;
-                                }
-                            }
-                            if (styledString.length() < LABEL_MAX_WIDTH - LABEL_SEPARATOR.length()
-                                    - 2) {
-                                styledString.append(LABEL_SEPARATOR, QUALIFIER_STYLER);
-
-                                styledString.append('"', QUALIFIER_STYLER);
-                                styledString.append(truncate(text, styledString), QUALIFIER_STYLER);
-                                styledString.append('"', QUALIFIER_STYLER);
-                            }
-                        }
-                    } else if (e.hasAttributeNS(ANDROID_URI, ATTR_SRC)) {
-                        // Show ImageView source attributes etc
-                        String src = e.getAttributeNS(ANDROID_URI, ATTR_SRC);
-                        if (src != null && src.length() > 0) {
-                            if (src.startsWith(DRAWABLE_PREFIX)) {
-                                src = src.substring(DRAWABLE_PREFIX.length());
-                            }
-                            styledString.append(LABEL_SEPARATOR, QUALIFIER_STYLER);
-                            styledString.append(truncate(src, styledString), QUALIFIER_STYLER);
-                        }
-                    } else if (e.getTagName().equals(SdkConstants.VIEW_INCLUDE)) {
-                        // Show the include reference.
-
-                        // Note: the layout attribute is NOT in the Android namespace
-                        String src = e.getAttribute(SdkConstants.ATTR_LAYOUT);
-                        if (src != null && src.length() > 0) {
-                            if (src.startsWith(LAYOUT_RESOURCE_PREFIX)) {
-                                src = src.substring(LAYOUT_RESOURCE_PREFIX.length());
-                            }
-                            styledString.append(LABEL_SEPARATOR, QUALIFIER_STYLER);
-                            styledString.append(truncate(src, styledString), QUALIFIER_STYLER);
-                        }
-                    }
-                }
-            } else if (element == null && vi != null) {
-                // It's an inclusion-context: display it
-                Reference includedWithin = mGraphicalEditorPart.getIncludedWithin();
-                if (includedWithin != null) {
-                    styledString = new StyledString();
-                    styledString.append(includedWithin.getDisplayName(), QUALIFIER_STYLER);
-                    image = IconFactory.getInstance().getIcon(SdkConstants.VIEW_INCLUDE);
-                }
-            }
-
-            if (styledString == null) {
-                styledString = new StyledString();
-                styledString.append(element == null ? "(null)" : element.toString());
-            }
-
-           cell.setText(styledString.toString());
-           cell.setStyleRanges(styledString.getStyleRanges());
-           cell.setImage(image);
-           super.update(cell);
-       }
-
-        @Override
-        public boolean isLabelProperty(Object element, String property) {
-            return super.isLabelProperty(element, property);
-        }
-    }
-
-    // --- Context Menu ---
-
-    /**
-     * This viewer uses its own actions that delegate to the ones given
-     * by the {@link LayoutCanvas}. All the processing is actually handled
-     * directly by the canvas and this viewer only gets refreshed as a
-     * consequence of the canvas changing the XML model.
-     */
-    private void setupContextMenu() {
-
-        mMenuManager = new MenuManager();
-        mMenuManager.removeAll();
-
-        mMenuManager.add(mMoveUpAction);
-        mMenuManager.add(mMoveDownAction);
-        mMenuManager.add(new Separator());
-
-        mMenuManager.add(new SelectionManager.SelectionMenu(mGraphicalEditorPart));
-        mMenuManager.add(new Separator());
-        final String prefix = LayoutCanvas.PREFIX_CANVAS_ACTION;
-        mMenuManager.add(new DelegateAction(prefix + ActionFactory.CUT.getId()));
-        mMenuManager.add(new DelegateAction(prefix + ActionFactory.COPY.getId()));
-        mMenuManager.add(new DelegateAction(prefix + ActionFactory.PASTE.getId()));
-
-        mMenuManager.add(new Separator());
-
-        mMenuManager.add(new DelegateAction(prefix + ActionFactory.DELETE.getId()));
-
-        mMenuManager.addMenuListener(new IMenuListener() {
-            @Override
-            public void menuAboutToShow(IMenuManager manager) {
-                // Update all actions to match their LayoutCanvas counterparts
-                for (IContributionItem contrib : manager.getItems()) {
-                    if (contrib instanceof ActionContributionItem) {
-                        IAction action = ((ActionContributionItem) contrib).getAction();
-                        if (action instanceof DelegateAction) {
-                            ((DelegateAction) action).updateFromEditorPart(mGraphicalEditorPart);
-                        }
-                    }
-                }
-            }
-        });
-
-        new DynamicContextMenu(
-                mGraphicalEditorPart.getEditorDelegate(),
-                mGraphicalEditorPart.getCanvasControl(),
-                mMenuManager);
-
-        getTreeViewer().getTree().setMenu(mMenuManager.createContextMenu(getControl()));
-
-        // Update Move Up/Move Down state only when the menu is opened
-        getTreeViewer().getTree().addMenuDetectListener(new MenuDetectListener() {
-            @Override
-            public void menuDetected(MenuDetectEvent e) {
-                mMenuManager.update(IAction.ENABLED);
-            }
-        });
-    }
-
-    /**
-     * An action that delegates its properties and behavior to a target action.
-     * The target action can be null or it can change overtime, typically as the
-     * layout canvas' editor part is activated or closed.
-     */
-    private static class DelegateAction extends Action {
-        private IAction mTargetAction;
-        private final String mCanvasActionId;
-
-        public DelegateAction(String canvasActionId) {
-            super(canvasActionId);
-            setId(canvasActionId);
-            mCanvasActionId = canvasActionId;
-        }
-
-        // --- Methods form IAction ---
-
-        /** Returns the target action's {@link #isEnabled()} if defined, or false. */
-        @Override
-        public boolean isEnabled() {
-            return mTargetAction == null ? false : mTargetAction.isEnabled();
-        }
-
-        /** Returns the target action's {@link #isChecked()} if defined, or false. */
-        @Override
-        public boolean isChecked() {
-            return mTargetAction == null ? false : mTargetAction.isChecked();
-        }
-
-        /** Returns the target action's {@link #isHandled()} if defined, or false. */
-        @Override
-        public boolean isHandled() {
-            return mTargetAction == null ? false : mTargetAction.isHandled();
-        }
-
-        /** Runs the target action if defined. */
-        @Override
-        public void run() {
-            if (mTargetAction != null) {
-                mTargetAction.run();
-            }
-            super.run();
-        }
-
-        /**
-         * Updates this action to delegate to its counterpart in the given editor part
-         *
-         * @param editorPart The editor being updated
-         */
-        public void updateFromEditorPart(GraphicalEditorPart editorPart) {
-            LayoutCanvas canvas = editorPart == null ? null : editorPart.getCanvasControl();
-            if (canvas == null) {
-                mTargetAction = null;
-            } else {
-                mTargetAction = canvas.getAction(mCanvasActionId);
-            }
-
-            if (mTargetAction != null) {
-                setText(mTargetAction.getText());
-                setId(mTargetAction.getId());
-                setDescription(mTargetAction.getDescription());
-                setImageDescriptor(mTargetAction.getImageDescriptor());
-                setHoverImageDescriptor(mTargetAction.getHoverImageDescriptor());
-                setDisabledImageDescriptor(mTargetAction.getDisabledImageDescriptor());
-                setToolTipText(mTargetAction.getToolTipText());
-                setActionDefinitionId(mTargetAction.getActionDefinitionId());
-                setHelpListener(mTargetAction.getHelpListener());
-                setAccelerator(mTargetAction.getAccelerator());
-                setChecked(mTargetAction.isChecked());
-                setEnabled(mTargetAction.isEnabled());
-            } else {
-                setEnabled(false);
-            }
-        }
-    }
-
-    /** Returns the associated editor with this outline */
-    /* package */GraphicalEditorPart getEditor() {
-        return mGraphicalEditorPart;
-    }
-
-    @Override
-    public void setActionBars(IActionBars actionBars) {
-        super.setActionBars(actionBars);
-
-        // Map Outline actions to canvas actions such that they share Undo context etc
-        LayoutCanvas canvas = mGraphicalEditorPart.getCanvasControl();
-        canvas.updateGlobalActions(actionBars);
-
-        // Special handling for Select All since it's different than the canvas (will
-        // include selecting the root etc)
-        actionBars.setGlobalActionHandler(mTreeSelectAllAction.getId(), mTreeSelectAllAction);
-        actionBars.updateActionBars();
-    }
-
-    // ---- Move Up/Down Support ----
-
-    /** Returns true if the current selected item can be moved */
-    private boolean canMove(boolean forward) {
-        CanvasViewInfo viewInfo = getSingleSelectedItem();
-        if (viewInfo != null) {
-            UiViewElementNode node = viewInfo.getUiViewNode();
-            if (forward) {
-                return findNext(node) != null;
-            } else {
-                return findPrevious(node) != null;
-            }
-        }
-
-        return false;
-    }
-
-    /** Moves the current selected item down (forward) or up (not forward) */
-    private void move(boolean forward) {
-        CanvasViewInfo viewInfo = getSingleSelectedItem();
-        if (viewInfo != null) {
-            final Pair<UiViewElementNode, Integer> target;
-            UiViewElementNode selected = viewInfo.getUiViewNode();
-            if (forward) {
-                target = findNext(selected);
-            } else {
-                target = findPrevious(selected);
-            }
-            if (target != null) {
-                final LayoutCanvas canvas = mGraphicalEditorPart.getCanvasControl();
-                final SelectionManager selectionManager = canvas.getSelectionManager();
-                final ArrayList<SelectionItem> dragSelection = new ArrayList<SelectionItem>();
-                dragSelection.add(selectionManager.createSelection(viewInfo));
-                SelectionManager.sanitize(dragSelection);
-
-                if (!dragSelection.isEmpty()) {
-                    final SimpleElement[] elements = SelectionItem.getAsElements(dragSelection);
-                    UiViewElementNode parentNode = target.getFirst();
-                    final NodeProxy targetNode = canvas.getNodeFactory().create(parentNode);
-
-                    // Record children of the target right before the drop (such that we
-                    // can find out after the drop which exact children were inserted)
-                    Set<INode> children = new HashSet<INode>();
-                    for (INode node : targetNode.getChildren()) {
-                        children.add(node);
-                    }
-
-                    String label = MoveGesture.computeUndoLabel(targetNode,
-                            elements, DND.DROP_MOVE);
-                    canvas.getEditorDelegate().getEditor().wrapUndoEditXmlModel(label, new Runnable() {
-                        @Override
-                        public void run() {
-                            InsertType insertType = InsertType.MOVE_INTO;
-                            if (dragSelection.get(0).getNode().getParent() == targetNode) {
-                                insertType = InsertType.MOVE_WITHIN;
-                            }
-                            canvas.getRulesEngine().setInsertType(insertType);
-                            int index = target.getSecond();
-                            BaseLayoutRule.insertAt(targetNode, elements, false, index);
-                            targetNode.applyPendingChanges();
-                            canvas.getClipboardSupport().deleteSelection("Remove", dragSelection);
-                        }
-                    });
-
-                    // Now find out which nodes were added, and look up their
-                    // corresponding CanvasViewInfos
-                    final List<INode> added = new ArrayList<INode>();
-                    for (INode node : targetNode.getChildren()) {
-                        if (!children.contains(node)) {
-                            added.add(node);
-                        }
-                    }
-
-                    selectionManager.setOutlineSelection(added);
-                }
-            }
-        }
-    }
-
-    /**
-     * Returns the {@link CanvasViewInfo} for the currently selected item, or null if
-     * there are no or multiple selected items
-     *
-     * @return the current selected item if there is exactly one item selected
-     */
-    private CanvasViewInfo getSingleSelectedItem() {
-        TreeItem[] selection = getTreeViewer().getTree().getSelection();
-        if (selection.length == 1) {
-            return getViewInfo(selection[0].getData());
-        }
-
-        return null;
-    }
-
-
-    /** Returns the pair [parent,index] of the next node (when iterating forward) */
-    @VisibleForTesting
-    /* package */ static Pair<UiViewElementNode, Integer> findNext(UiViewElementNode node) {
-        UiElementNode parent = node.getUiParent();
-        if (parent == null) {
-            return null;
-        }
-
-        UiElementNode next = node.getUiNextSibling();
-        if (next != null) {
-            if (DescriptorsUtils.canInsertChildren(next.getDescriptor(), null)) {
-                return getFirstPosition(next);
-            } else {
-                return getPositionAfter(next);
-            }
-        }
-
-        next = parent.getUiNextSibling();
-        if (next != null) {
-            return getPositionBefore(next);
-        } else {
-            UiElementNode grandParent = parent.getUiParent();
-            if (grandParent != null) {
-                return getLastPosition(grandParent);
-            }
-        }
-
-        return null;
-    }
-
-    /** Returns the pair [parent,index] of the previous node (when iterating backward) */
-    @VisibleForTesting
-    /* package */ static Pair<UiViewElementNode, Integer> findPrevious(UiViewElementNode node) {
-        UiElementNode prev = node.getUiPreviousSibling();
-        if (prev != null) {
-            UiElementNode curr = prev;
-            while (true) {
-                List<UiElementNode> children = curr.getUiChildren();
-                if (children.size() > 0) {
-                    curr = children.get(children.size() - 1);
-                    continue;
-                }
-                if (DescriptorsUtils.canInsertChildren(curr.getDescriptor(), null)) {
-                    return getFirstPosition(curr);
-                } else {
-                    if (curr == prev) {
-                        return getPositionBefore(curr);
-                    } else {
-                        return getPositionAfter(curr);
-                    }
-                }
-            }
-        }
-
-        return getPositionBefore(node.getUiParent());
-    }
-
-    /** Returns the pair [parent,index] of the position immediately before the given node  */
-    private static Pair<UiViewElementNode, Integer> getPositionBefore(UiElementNode node) {
-        if (node != null) {
-            UiElementNode parent = node.getUiParent();
-            if (parent != null && parent instanceof UiViewElementNode) {
-                return Pair.of((UiViewElementNode) parent, node.getUiSiblingIndex());
-            }
-        }
-
-        return null;
-    }
-
-    /** Returns the pair [parent,index] of the position immediately following the given node  */
-    private static Pair<UiViewElementNode, Integer> getPositionAfter(UiElementNode node) {
-        if (node != null) {
-            UiElementNode parent = node.getUiParent();
-            if (parent != null && parent instanceof UiViewElementNode) {
-                return Pair.of((UiViewElementNode) parent, node.getUiSiblingIndex() + 1);
-            }
-        }
-
-        return null;
-    }
-
-    /** Returns the pair [parent,index] of the first position inside the given parent */
-    private static Pair<UiViewElementNode, Integer> getFirstPosition(UiElementNode parent) {
-        if (parent != null && parent instanceof UiViewElementNode) {
-            return Pair.of((UiViewElementNode) parent, 0);
-        }
-
-        return null;
-    }
-
-    /**
-     * Returns the pair [parent,index] of the last position after the given node's
-     * children
-     */
-    private static Pair<UiViewElementNode, Integer> getLastPosition(UiElementNode parent) {
-        if (parent != null && parent instanceof UiViewElementNode) {
-            return Pair.of((UiViewElementNode) parent, parent.getUiChildren().size());
-        }
-
-        return null;
-    }
-
-    /**
-     * Truncates the given text such that it will fit into the given {@link StyledString}
-     * up to a maximum length of {@link #LABEL_MAX_WIDTH}.
-     *
-     * @param text the text to truncate
-     * @param string the existing string to be appended to
-     * @return the truncated string
-     */
-    private static String truncate(String text, StyledString string) {
-        int existingLength = string.length();
-
-        if (text.length() + existingLength > LABEL_MAX_WIDTH) {
-            int truncatedLength = LABEL_MAX_WIDTH - existingLength - 3;
-            if (truncatedLength > 0) {
-                return String.format("%1$s...", text.substring(0, truncatedLength));
-            } else {
-                return ""; //$NON-NLS-1$
-            }
-        }
-
-        return text;
-    }
-
-    @Override
-    public void setToolBar(IToolBarManager toolBarManager) {
-        makeContributions(null, toolBarManager, null);
-        toolBarManager.update(false);
-    }
-
-    /**
-     * Sets up a custom tooltip when hovering over tree items. It currently displays the error
-     * message for the lint warning associated with each node, if any (and only if the hover
-     * is over the icon portion).
-     */
-    private void setupTooltip() {
-        final Tree tree = getTreeViewer().getTree();
-
-        // This is based on SWT Snippet 125
-        final Listener listener = new Listener() {
-            Shell mTip = null;
-            Label mLabel  = null;
-
-            @Override
-            public void handleEvent(Event event) {
-                switch(event.type) {
-                case SWT.Dispose:
-                case SWT.KeyDown:
-                case SWT.MouseExit:
-                case SWT.MouseDown:
-                case SWT.MouseMove:
-                    if (mTip != null) {
-                        mTip.dispose();
-                        mTip = null;
-                        mLabel = null;
-                    }
-                    break;
-                case SWT.MouseHover:
-                    if (mTip != null) {
-                        mTip.dispose();
-                        mTip = null;
-                        mLabel = null;
-                    }
-
-                    String tooltip = null;
-
-                    TreeItem item = tree.getItem(new Point(event.x, event.y));
-                    if (item != null) {
-                        Rectangle rect = item.getBounds(0);
-                        if (event.x - rect.x > 16) { // 16: Standard width of our outline icons
-                            return;
-                        }
-
-                        Object data = item.getData();
-                        if (data != null && data instanceof CanvasViewInfo) {
-                            LayoutEditorDelegate editor = mGraphicalEditorPart.getEditorDelegate();
-                            CanvasViewInfo vi = (CanvasViewInfo) data;
-                            IMarker marker = editor.getIssueForNode(vi.getUiViewNode());
-                            if (marker != null) {
-                                tooltip = marker.getAttribute(IMarker.MESSAGE, null);
-                            }
-                        }
-
-                        if (tooltip != null) {
-                            Shell shell = tree.getShell();
-                            Display display = tree.getDisplay();
-
-                            Color fg = display.getSystemColor(SWT.COLOR_INFO_FOREGROUND);
-                            Color bg = display.getSystemColor(SWT.COLOR_INFO_BACKGROUND);
-                            mTip = new Shell(shell, SWT.ON_TOP | SWT.NO_FOCUS | SWT.TOOL);
-                            mTip.setBackground(bg);
-                            FillLayout layout = new FillLayout();
-                            layout.marginWidth = 1;
-                            layout.marginHeight = 1;
-                            mTip.setLayout(layout);
-                            mLabel = new Label(mTip, SWT.WRAP);
-                            mLabel.setForeground(fg);
-                            mLabel.setBackground(bg);
-                            mLabel.setText(tooltip);
-                            mLabel.addListener(SWT.MouseExit, this);
-                            mLabel.addListener(SWT.MouseDown, this);
-
-                            Point pt = tree.toDisplay(rect.x, rect.y + rect.height);
-                            Rectangle displayBounds = display.getBounds();
-                            // -10: Don't extend -all- the way to the edge of the screen
-                            // which would make it look like it has been cropped
-                            int availableWidth = displayBounds.x + displayBounds.width - pt.x - 10;
-                            if (availableWidth < 80) {
-                                availableWidth = 80;
-                            }
-                            Point size = mTip.computeSize(SWT.DEFAULT, SWT.DEFAULT);
-                            if (size.x > availableWidth) {
-                                size = mTip.computeSize(availableWidth, SWT.DEFAULT);
-                            }
-                            mTip.setBounds(pt.x, pt.y, size.x, size.y);
-
-                            mTip.setVisible(true);
-                        }
-                    }
-                }
-            }
-        };
-
-        tree.addListener(SWT.Dispose, listener);
-        tree.addListener(SWT.KeyDown, listener);
-        tree.addListener(SWT.MouseMove, listener);
-        tree.addListener(SWT.MouseHover, listener);
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/Overlay.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/Overlay.java
deleted file mode 100644
index 9b7e0eb..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/Overlay.java
+++ /dev/null
@@ -1,91 +0,0 @@
-/*
- * Copyright (C) 2010 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.editors.layout.gle2;
-
-import org.eclipse.swt.graphics.Device;
-import org.eclipse.swt.graphics.GC;
-
-/**
- * An Overlay is a set of graphics which can be painted on top of the visual
- * editor. Different {@link Gesture}s produce context specific overlays, such as
- * swiping rectangles from the {@link MarqueeGesture} and guidelines from the
- * {@link MoveGesture}.
- */
-public abstract class Overlay {
-    private Device mDevice;
-
-    /** Whether the hover is hidden */
-    private boolean mHiding;
-
-    /**
-     * Construct the overlay, using the given graphics context for painting.
-     */
-    public Overlay() {
-        super();
-    }
-
-    /**
-     * Initializes the overlay before the first use, if applicable. This is a
-     * good place to initialize resources like colors.
-     *
-     * @param device The device to allocate resources for; the parameter passed
-     *            to {@link #paint} will correspond to this device.
-     */
-    public void create(Device device) {
-        mDevice = device;
-    }
-
-    /**
-     * Releases resources held by the overlay. Called by the editor when an
-     * overlay has been removed.
-     */
-    public void dispose() {
-    }
-
-    /**
-     * Paints the overlay.
-     *
-     * @param gc The SWT {@link GC} object to draw into.
-     */
-    public void paint(GC gc) {
-        throw new IllegalArgumentException("paint() not implemented, probably done "
-                + "with specialized paint signature");
-    }
-
-    /** Returns the device associated with this overlay */
-    public Device getDevice() {
-        return mDevice;
-    }
-
-    /**
-     * Returns whether the overlay is hidden
-     *
-     * @return true if the selection overlay is hidden
-     */
-    public boolean isHiding() {
-        return mHiding;
-    }
-
-    /**
-     * Hides the overlay
-     *
-     * @param hiding true to hide the overlay, false to unhide it (default)
-     */
-    public void setHiding(boolean hiding) {
-        mHiding = hiding;
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/PaletteControl.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/PaletteControl.java
deleted file mode 100644
index 46168b7..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/PaletteControl.java
+++ /dev/null
@@ -1,1265 +0,0 @@
-/*
- * Copyright (C) 2009 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.editors.layout.gle2;
-
-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_TEXT;
-import static com.android.SdkConstants.VALUE_WRAP_CONTENT;
-import static com.android.SdkConstants.XMLNS_ANDROID;
-import static com.android.SdkConstants.XMLNS_URI;
-
-import com.android.ide.common.api.InsertType;
-import com.android.ide.common.api.Rect;
-import com.android.ide.common.api.RuleAction.Toggle;
-import com.android.ide.common.rendering.LayoutLibrary;
-import com.android.ide.common.rendering.api.Capability;
-import com.android.ide.common.rendering.api.LayoutLog;
-import com.android.ide.common.rendering.api.RenderSession;
-import com.android.ide.common.rendering.api.ViewInfo;
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.ide.eclipse.adt.internal.editors.IconFactory;
-import com.android.ide.eclipse.adt.internal.editors.descriptors.DescriptorsUtils;
-import com.android.ide.eclipse.adt.internal.editors.descriptors.DocumentDescriptor;
-import com.android.ide.eclipse.adt.internal.editors.descriptors.ElementDescriptor;
-import com.android.ide.eclipse.adt.internal.editors.layout.LayoutEditorDelegate;
-import com.android.ide.eclipse.adt.internal.editors.layout.configuration.ConfigurationChooser;
-import com.android.ide.eclipse.adt.internal.editors.layout.descriptors.CustomViewDescriptorService;
-import com.android.ide.eclipse.adt.internal.editors.layout.descriptors.ViewElementDescriptor;
-import com.android.ide.eclipse.adt.internal.editors.layout.gre.NodeFactory;
-import com.android.ide.eclipse.adt.internal.editors.layout.gre.NodeProxy;
-import com.android.ide.eclipse.adt.internal.editors.layout.gre.PaletteMetadataDescriptor;
-import com.android.ide.eclipse.adt.internal.editors.layout.gre.ViewMetadataRepository;
-import com.android.ide.eclipse.adt.internal.editors.layout.gre.ViewMetadataRepository.RenderMode;
-import com.android.ide.eclipse.adt.internal.editors.layout.uimodel.UiViewElementNode;
-import com.android.ide.eclipse.adt.internal.editors.uimodel.UiDocumentNode;
-import com.android.ide.eclipse.adt.internal.editors.uimodel.UiElementNode;
-import com.android.ide.eclipse.adt.internal.preferences.AdtPrefs;
-import com.android.ide.eclipse.adt.internal.sdk.AndroidTargetData;
-import com.android.ide.eclipse.adt.internal.sdk.Sdk;
-import com.android.sdklib.IAndroidTarget;
-import com.android.utils.Pair;
-
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.action.IToolBarManager;
-import org.eclipse.jface.action.MenuManager;
-import org.eclipse.jface.action.Separator;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.CLabel;
-import org.eclipse.swt.dnd.DND;
-import org.eclipse.swt.dnd.DragSource;
-import org.eclipse.swt.dnd.DragSourceEvent;
-import org.eclipse.swt.dnd.DragSourceListener;
-import org.eclipse.swt.dnd.Transfer;
-import org.eclipse.swt.events.DisposeEvent;
-import org.eclipse.swt.events.DisposeListener;
-import org.eclipse.swt.events.MenuDetectEvent;
-import org.eclipse.swt.events.MenuDetectListener;
-import org.eclipse.swt.events.MouseAdapter;
-import org.eclipse.swt.events.MouseEvent;
-import org.eclipse.swt.events.MouseTrackListener;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.GC;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.graphics.ImageData;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.graphics.RGB;
-import org.eclipse.swt.graphics.Rectangle;
-import org.eclipse.swt.layout.FillLayout;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Menu;
-import org.eclipse.swt.widgets.ToolBar;
-import org.eclipse.swt.widgets.ToolItem;
-import org.eclipse.wb.internal.core.editor.structure.IPage;
-import org.w3c.dom.Attr;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-
-import java.awt.image.BufferedImage;
-import java.io.IOException;
-import java.io.StringWriter;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-/**
- * A palette control for the {@link GraphicalEditorPart}.
- * <p/>
- * The palette contains several groups, each with a UI name (e.g. layouts and views) and each
- * with a list of element descriptors.
- * <p/>
- *
- * TODO list:
- *   - The available items should depend on the actual GLE2 Canvas selection. Selected android
- *     views should force filtering on what they accept can be dropped on them (e.g. TabHost,
- *     TableLayout). Should enable/disable them, not hide them, to avoid shuffling around.
- *   - Optional: a text filter
- *   - Optional: have context-sensitive tools items, e.g. selection arrow tool,
- *     group selection tool, alignment, etc.
- */
-public class PaletteControl extends Composite {
-
-    /**
-     * Wrapper to create a {@link PaletteControl}
-     */
-    static class PalettePage implements IPage {
-        private final GraphicalEditorPart mEditorPart;
-        private PaletteControl mControl;
-
-        PalettePage(GraphicalEditorPart editor) {
-            mEditorPart = editor;
-        }
-
-        @Override
-        public void createControl(Composite parent) {
-            mControl = new PaletteControl(parent, mEditorPart);
-        }
-
-        @Override
-        public Control getControl() {
-            return mControl;
-        }
-
-        @Override
-        public void dispose() {
-            mControl.dispose();
-        }
-
-        @Override
-        public void setToolBar(IToolBarManager toolBarManager) {
-        }
-
-        /**
-         * Add tool bar items to the given toolbar
-         *
-         * @param toolbar the toolbar to add items into
-         */
-        void createToolbarItems(final ToolBar toolbar) {
-            final ToolItem popupMenuItem = new ToolItem(toolbar, SWT.PUSH);
-            popupMenuItem.setToolTipText("View Menu");
-            popupMenuItem.setImage(IconFactory.getInstance().getIcon("view_menu"));
-            popupMenuItem.addSelectionListener(new SelectionAdapter() {
-                @Override
-                public void widgetSelected(SelectionEvent e) {
-                    Rectangle bounds = popupMenuItem.getBounds();
-                    // Align menu horizontally with the toolbar button and
-                    // vertically with the bottom of the toolbar
-                    Point point = toolbar.toDisplay(bounds.x, bounds.y + bounds.height);
-                    mControl.showMenu(point.x, point.y);
-                }
-            });
-        }
-
-        @Override
-        public void setFocus() {
-            mControl.setFocus();
-        }
-    }
-
-    /**
-     * The parent grid layout that contains all the {@link Toggle} and
-     * {@link IconTextItem} widgets.
-     */
-    private GraphicalEditorPart mEditor;
-    private Color mBackground;
-    private Color mForeground;
-
-    /** The palette modes control various ways to visualize and lay out the views */
-    private static enum PaletteMode {
-        /** Show rendered previews of the views */
-        PREVIEW("Show Previews", true),
-        /** Show rendered previews of the views, scaled down to 75% */
-        SMALL_PREVIEW("Show Small Previews", true),
-        /** Show rendered previews of the views, scaled down to 50% */
-        TINY_PREVIEW("Show Tiny Previews", true),
-        /** Show an icon + text label */
-        ICON_TEXT("Show Icon and Text", false),
-        /** Show only icons, packed multiple per row */
-        ICON_ONLY("Show Only Icons", true);
-
-        PaletteMode(String actionLabel, boolean wrap) {
-            mActionLabel = actionLabel;
-            mWrap = wrap;
-        }
-
-        public String getActionLabel() {
-            return mActionLabel;
-        }
-
-        public boolean getWrap() {
-            return mWrap;
-        }
-
-        public boolean isPreview() {
-            return this == PREVIEW || this == SMALL_PREVIEW || this == TINY_PREVIEW;
-        }
-
-        public boolean isScaledPreview() {
-            return this == SMALL_PREVIEW || this == TINY_PREVIEW;
-        }
-
-        private final String mActionLabel;
-        private final boolean mWrap;
-    };
-
-    /** Token used in preference string to record alphabetical sorting */
-    private static final String VALUE_ALPHABETICAL = "alpha";   //$NON-NLS-1$
-    /** Token used in preference string to record categories being turned off */
-    private static final String VALUE_NO_CATEGORIES = "nocat"; //$NON-NLS-1$
-    /** Token used in preference string to record auto close being turned off */
-    private static final String VALUE_NO_AUTOCLOSE = "noauto";      //$NON-NLS-1$
-
-    private final PreviewIconFactory mPreviewIconFactory = new PreviewIconFactory(this);
-    private PaletteMode mPaletteMode = null;
-    /** Use alphabetical sorting instead of natural order? */
-    private boolean mAlphabetical;
-    /** Use categories instead of a single large list of views? */
-    private boolean mCategories = true;
-    /** Auto-close the previous category when new categories are opened */
-    private boolean mAutoClose = true;
-    private AccordionControl mAccordion;
-    private String mCurrentTheme;
-    private String mCurrentDevice;
-    private IAndroidTarget mCurrentTarget;
-    private AndroidTargetData mCurrentTargetData;
-
-    /**
-     * Create the composite.
-     * @param parent The parent composite.
-     * @param editor An editor associated with this palette.
-     */
-    public PaletteControl(Composite parent, GraphicalEditorPart editor) {
-        super(parent, SWT.NONE);
-
-        mEditor = editor;
-    }
-
-    /** Reads UI mode from persistent store to preserve palette mode across IDE sessions */
-    private void loadPaletteMode() {
-        String paletteModes = AdtPrefs.getPrefs().getPaletteModes();
-        if (paletteModes.length() > 0) {
-            String[] tokens = paletteModes.split(","); //$NON-NLS-1$
-            try {
-                mPaletteMode = PaletteMode.valueOf(tokens[0]);
-            } catch (Throwable t) {
-                mPaletteMode = PaletteMode.values()[0];
-            }
-            mAlphabetical = paletteModes.contains(VALUE_ALPHABETICAL);
-            mCategories = !paletteModes.contains(VALUE_NO_CATEGORIES);
-            mAutoClose = !paletteModes.contains(VALUE_NO_AUTOCLOSE);
-        } else {
-            mPaletteMode = PaletteMode.SMALL_PREVIEW;
-        }
-    }
-
-    /**
-     * Returns the most recently stored version of auto-close-mode; this is the last
-     * user-initiated setting of the auto-close mode (we programmatically switch modes when
-     * you enter icons-only mode, and set it back to this when going to any other mode)
-     */
-    private boolean getSavedAutoCloseMode() {
-        return !AdtPrefs.getPrefs().getPaletteModes().contains(VALUE_NO_AUTOCLOSE);
-    }
-
-    /** Saves UI mode to persistent store to preserve palette mode across IDE sessions */
-    private void savePaletteMode() {
-        StringBuilder sb = new StringBuilder();
-        sb.append(mPaletteMode);
-        if (mAlphabetical) {
-            sb.append(',').append(VALUE_ALPHABETICAL);
-        }
-        if (!mCategories) {
-            sb.append(',').append(VALUE_NO_CATEGORIES);
-        }
-        if (!mAutoClose) {
-            sb.append(',').append(VALUE_NO_AUTOCLOSE);
-        }
-        AdtPrefs.getPrefs().setPaletteModes(sb.toString());
-    }
-
-    private void refreshPalette() {
-        IAndroidTarget oldTarget = mCurrentTarget;
-        mCurrentTarget = null;
-        mCurrentTargetData = null;
-        mCurrentTheme = null;
-        mCurrentDevice = null;
-        reloadPalette(oldTarget);
-    }
-
-    @Override
-    protected void checkSubclass() {
-        // Disable the check that prevents subclassing of SWT components
-    }
-
-    @Override
-    public void dispose() {
-        if (mBackground != null) {
-            mBackground.dispose();
-            mBackground = null;
-        }
-        if (mForeground != null) {
-            mForeground.dispose();
-            mForeground = null;
-        }
-
-        super.dispose();
-    }
-
-    /**
-     * Returns the currently displayed target
-     *
-     * @return the current target, or null
-     */
-    public IAndroidTarget getCurrentTarget() {
-        return mCurrentTarget;
-    }
-
-    /**
-     * Returns the currently displayed theme (in palette modes that support previewing)
-     *
-     * @return the current theme, or null
-     */
-    public String getCurrentTheme() {
-        return mCurrentTheme;
-    }
-
-    /**
-     * Returns the currently displayed device (in palette modes that support previewing)
-     *
-     * @return the current device, or null
-     */
-    public String getCurrentDevice() {
-        return mCurrentDevice;
-    }
-
-    /** Returns true if previews in the palette should be made available */
-    private boolean previewsAvailable() {
-        // Not layoutlib 5 -- we require custom background support to do
-        // a decent job with previews
-        LayoutLibrary layoutLibrary = mEditor.getLayoutLibrary();
-        return layoutLibrary != null && layoutLibrary.supports(Capability.CUSTOM_BACKGROUND_COLOR);
-    }
-
-    /**
-     * Loads or reloads the palette elements by using the layout and view descriptors from the
-     * given target data.
-     *
-     * @param target The target that has just been loaded
-     */
-    public void reloadPalette(IAndroidTarget target) {
-        ConfigurationChooser configChooser = mEditor.getConfigurationChooser();
-        String theme = configChooser.getThemeName();
-        String device = configChooser.getDeviceName();
-        if (device == null) {
-            return;
-        }
-        AndroidTargetData targetData =
-            target != null ? Sdk.getCurrent().getTargetData(target) : null;
-        if (target == mCurrentTarget && targetData == mCurrentTargetData
-                && mCurrentTheme != null && mCurrentTheme.equals(theme)
-                && mCurrentDevice != null && mCurrentDevice.equals(device)) {
-            return;
-        }
-        mCurrentTheme = theme;
-        mCurrentTarget = target;
-        mCurrentTargetData = targetData;
-        mCurrentDevice = device;
-        mPreviewIconFactory.reset();
-
-        if (targetData == null) {
-            return;
-        }
-
-        Set<String> expandedCategories = null;
-        if (mAccordion != null) {
-            expandedCategories = mAccordion.getExpandedCategories();
-            // We auto-expand all categories when showing icons-only. When returning to some
-            // other mode we don't want to retain all categories open.
-            if (expandedCategories.size() > 3) {
-                expandedCategories = null;
-            }
-        }
-
-        // Erase old content and recreate new
-        for (Control c : getChildren()) {
-            c.dispose();
-        }
-
-        if (mPaletteMode == null) {
-            loadPaletteMode();
-            assert mPaletteMode != null;
-        }
-
-        // Ensure that the palette mode is supported on this version of the layout library
-        if (!previewsAvailable()) {
-            if (mPaletteMode.isPreview()) {
-                mPaletteMode = PaletteMode.ICON_TEXT;
-            }
-        }
-
-        if (mPaletteMode.isPreview()) {
-            if (mForeground != null) {
-                mForeground.dispose();
-                mForeground = null;
-            }
-            if (mBackground != null) {
-                mBackground.dispose();
-                mBackground = null;
-            }
-            RGB background = mPreviewIconFactory.getBackgroundColor();
-            if (background != null) {
-                mBackground = new Color(getDisplay(), background);
-            }
-            RGB foreground = mPreviewIconFactory.getForegroundColor();
-            if (foreground != null) {
-                mForeground = new Color(getDisplay(), foreground);
-            }
-        }
-
-        List<String> headers = Collections.emptyList();
-        final Map<String, List<ViewElementDescriptor>> categoryToItems;
-        categoryToItems = new HashMap<String, List<ViewElementDescriptor>>();
-        headers = new ArrayList<String>();
-        List<Pair<String,List<ViewElementDescriptor>>> paletteEntries =
-            ViewMetadataRepository.get().getPaletteEntries(targetData,
-                    mAlphabetical, mCategories);
-        for (Pair<String,List<ViewElementDescriptor>> pair : paletteEntries) {
-            String category = pair.getFirst();
-            List<ViewElementDescriptor> categoryItems = pair.getSecond();
-            headers.add(category);
-            categoryToItems.put(category, categoryItems);
-        }
-
-        headers.add("Custom & Library Views");
-
-        // Set the categories to expand the first item if
-        //   (1) we don't have a previously selected category, or
-        //   (2) there's just one category anyway, or
-        //   (3) the set of categories have changed so our previously selected category
-        //       doesn't exist anymore (can happen when you toggle "Show Categories")
-        if ((expandedCategories == null && headers.size() > 0) || headers.size() == 1 ||
-                (expandedCategories != null && expandedCategories.size() >= 1
-                        && !headers.contains(
-                                expandedCategories.iterator().next().replace("&&", "&")))) { //$NON-NLS-1$ //$NON-NLS-2$
-            // Expand the first category if we don't have a previous selection (e.g. refresh)
-            expandedCategories = Collections.singleton(headers.get(0));
-        }
-
-        boolean wrap = mPaletteMode.getWrap();
-
-        // Pack icon-only view vertically; others stretch to fill palette region
-        boolean fillVertical = mPaletteMode != PaletteMode.ICON_ONLY;
-
-        mAccordion = new AccordionControl(this, SWT.NONE, headers, fillVertical, wrap,
-                expandedCategories) {
-            @Override
-            protected Composite createChildContainer(Composite parent, Object header, int style) {
-                assert categoryToItems != null;
-                List<ViewElementDescriptor> list = categoryToItems.get(header);
-                final Composite composite;
-                if (list == null) {
-                    assert header.equals("Custom & Library Views");
-
-                    Composite wrapper = new Composite(parent, SWT.NONE);
-                    GridLayout gridLayout = new GridLayout(1, false);
-                    gridLayout.marginWidth = gridLayout.marginHeight = 0;
-                    gridLayout.horizontalSpacing = gridLayout.verticalSpacing = 0;
-                    gridLayout.marginBottom = 3;
-                    wrapper.setLayout(gridLayout);
-                    if (mPaletteMode.isPreview() && mBackground != null) {
-                        wrapper.setBackground(mBackground);
-                    }
-                    composite = super.createChildContainer(wrapper, header, style);
-                    if (mPaletteMode.isPreview() && mBackground != null) {
-                        composite.setBackground(mBackground);
-                    }
-                    composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));
-
-                    Button refreshButton = new Button(wrapper, SWT.PUSH | SWT.FLAT);
-                    refreshButton.setLayoutData(new GridData(SWT.CENTER, SWT.CENTER,
-                            false, false, 1, 1));
-                    refreshButton.setText("Refresh");
-                    refreshButton.setImage(IconFactory.getInstance().getIcon("refresh")); //$NON-NLS-1$
-                    refreshButton.addSelectionListener(new SelectionAdapter() {
-                        @Override
-                        public void widgetSelected(SelectionEvent e) {
-                            CustomViewFinder finder = CustomViewFinder.get(mEditor.getProject());
-                            finder.refresh(new ViewFinderListener(composite));
-                        }
-                    });
-
-                    wrapper.layout(true);
-                } else {
-                    composite = super.createChildContainer(parent, header, style);
-                    if (mPaletteMode.isPreview() && mBackground != null) {
-                        composite.setBackground(mBackground);
-                    }
-                }
-                addMenu(composite);
-                return composite;
-            }
-            @Override
-            protected void createChildren(Composite parent, Object header) {
-                assert categoryToItems != null;
-                List<ViewElementDescriptor> list = categoryToItems.get(header);
-                if (list == null) {
-                    assert header.equals("Custom & Library Views");
-                    addCustomItems(parent);
-                    return;
-                } else {
-                    for (ViewElementDescriptor desc : list) {
-                        createItem(parent, desc);
-                    }
-                }
-            }
-        };
-        addMenu(mAccordion);
-        for (CLabel headerLabel : mAccordion.getHeaderLabels()) {
-            addMenu(headerLabel);
-        }
-        setLayout(new FillLayout());
-
-        // Expand All for icon-only mode, but don't store it as the persistent auto-close mode;
-        // when we enter other modes it will read back whatever persistent mode.
-        if (mPaletteMode == PaletteMode.ICON_ONLY) {
-            mAccordion.expandAll(true);
-            mAccordion.setAutoClose(false);
-        } else {
-            mAccordion.setAutoClose(getSavedAutoCloseMode());
-        }
-
-        layout(true);
-    }
-
-    protected void addCustomItems(final Composite parent) {
-        final CustomViewFinder finder = CustomViewFinder.get(mEditor.getProject());
-        Collection<String> allViews = finder.getAllViews();
-        if (allViews == null) { // Not yet initialized: trigger an async refresh
-            finder.refresh(new ViewFinderListener(parent));
-            return;
-        }
-
-        // Remove previous content
-        for (Control c : parent.getChildren()) {
-            c.dispose();
-        }
-
-        // Add new views
-        for (final String fqcn : allViews) {
-            CustomViewDescriptorService service = CustomViewDescriptorService.getInstance();
-            ViewElementDescriptor desc = service.getDescriptor(mEditor.getProject(), fqcn);
-            if (desc == null) {
-                // The descriptor lookup performs validation steps of the class, and may
-                // in some cases determine that this is not a view and will return null;
-                // guard against that.
-                continue;
-            }
-
-            Control item = createItem(parent, desc);
-
-            // Add control-click listener on custom view items to you can warp to
-            // (and double click listener too -- the more discoverable, the better.)
-            if (item instanceof IconTextItem) {
-                IconTextItem it = (IconTextItem) item;
-                it.addMouseListener(new MouseAdapter() {
-                    @Override
-                    public void mouseDoubleClick(MouseEvent e) {
-                        AdtPlugin.openJavaClass(mEditor.getProject(), fqcn);
-                    }
-
-                    @Override
-                    public void mouseDown(MouseEvent e) {
-                        if ((e.stateMask & SWT.MOD1) != 0) {
-                            AdtPlugin.openJavaClass(mEditor.getProject(), fqcn);
-                        }
-                    }
-                });
-            }
-        }
-    }
-
-    /* package */ GraphicalEditorPart getEditor() {
-        return mEditor;
-    }
-
-    private Control createItem(Composite parent, ViewElementDescriptor desc) {
-        Control item = null;
-        switch (mPaletteMode) {
-            case SMALL_PREVIEW:
-            case TINY_PREVIEW:
-            case PREVIEW: {
-                ImageDescriptor descriptor = mPreviewIconFactory.getImageDescriptor(desc);
-                if (descriptor != null) {
-                    Image image = descriptor.createImage();
-                    ImageControl imageControl = new ImageControl(parent, SWT.None, image);
-                    if (mPaletteMode.isScaledPreview()) {
-                        // Try to preserve the overall size since rendering sizes typically
-                        // vary with the dpi - so while the scaling factor for a 160 dpi
-                        // rendering the scaling factor should be 0.5, for a 320 dpi one the
-                        // scaling factor should be half that, 0.25.
-                        float scale = 1.0f;
-                        if (mPaletteMode == PaletteMode.SMALL_PREVIEW) {
-                            scale = 0.75f;
-                        } else if (mPaletteMode == PaletteMode.TINY_PREVIEW) {
-                            scale = 0.5f;
-                        }
-                        ConfigurationChooser chooser = mEditor.getConfigurationChooser();
-                        int dpi = chooser.getConfiguration().getDensity().getDpiValue();
-                        while (dpi > 160) {
-                            scale = scale / 2;
-                            dpi = dpi / 2;
-                        }
-                        imageControl.setScale(scale);
-                    }
-                    imageControl.setHoverColor(getDisplay().getSystemColor(SWT.COLOR_WHITE));
-                    if (mBackground != null) {
-                        imageControl.setBackground(mBackground);
-                    }
-                    String toolTip = desc.getUiName();
-                    // It appears pretty much none of the descriptors have tooltips
-                    //String descToolTip = desc.getTooltip();
-                    //if (descToolTip != null && descToolTip.length() > 0) {
-                    //    toolTip = toolTip + "\n" + descToolTip;
-                    //}
-                    imageControl.setToolTipText(toolTip);
-
-                    item = imageControl;
-                } else {
-                    // Just use an Icon+Text item for these for now
-                    item = new IconTextItem(parent, desc);
-                    if (mForeground != null) {
-                        item.setForeground(mForeground);
-                        item.setBackground(mBackground);
-                    }
-                }
-                break;
-            }
-            case ICON_TEXT: {
-                item = new IconTextItem(parent, desc);
-                break;
-            }
-            case ICON_ONLY: {
-                item = new ImageControl(parent, SWT.None, desc.getGenericIcon());
-                item.setToolTipText(desc.getUiName());
-                break;
-            }
-            default:
-                throw new IllegalArgumentException("Not yet implemented");
-        }
-
-        final DragSource source = new DragSource(item, DND.DROP_COPY);
-        source.setTransfer(new Transfer[] { SimpleXmlTransfer.getInstance() });
-        source.addDragListener(new DescDragSourceListener(desc));
-        item.addDisposeListener(new DisposeListener() {
-            @Override
-            public void widgetDisposed(DisposeEvent e) {
-                source.dispose();
-            }
-        });
-        addMenu(item);
-
-        return item;
-    }
-
-    /**
-     * An Item widget represents one {@link ElementDescriptor} that can be dropped on the
-     * GLE2 canvas using drag'n'drop.
-     */
-    private static class IconTextItem extends CLabel implements MouseTrackListener {
-
-        private boolean mMouseIn;
-
-        public IconTextItem(Composite parent, ViewElementDescriptor desc) {
-            super(parent, SWT.NONE);
-            mMouseIn = false;
-
-            setText(desc.getUiName());
-            setImage(desc.getGenericIcon());
-            setToolTipText(desc.getTooltip());
-            addMouseTrackListener(this);
-        }
-
-        @Override
-        public int getStyle() {
-            int style = super.getStyle();
-            if (mMouseIn) {
-                style |= SWT.SHADOW_IN;
-            }
-            return style;
-        }
-
-        @Override
-        public void mouseEnter(MouseEvent e) {
-            if (!mMouseIn) {
-                mMouseIn = true;
-                redraw();
-            }
-        }
-
-        @Override
-        public void mouseExit(MouseEvent e) {
-            if (mMouseIn) {
-                mMouseIn = false;
-                redraw();
-            }
-        }
-
-        @Override
-        public void mouseHover(MouseEvent e) {
-            // pass
-        }
-    }
-
-    /**
-     * A {@link DragSourceListener} that deals with drag'n'drop of
-     * {@link ElementDescriptor}s.
-     */
-    private class DescDragSourceListener implements DragSourceListener {
-        private final ViewElementDescriptor mDesc;
-        private SimpleElement[] mElements;
-
-        public DescDragSourceListener(ViewElementDescriptor desc) {
-            mDesc = desc;
-        }
-
-        @Override
-        public void dragStart(DragSourceEvent e) {
-            // See if we can find out the bounds of this element from a preview image.
-            // Preview images are created before the drag source listener is notified
-            // of the started drag.
-            Rect bounds = null;
-            Rect dragBounds = null;
-
-            createDragImage(e);
-            if (mImage != null && !mIsPlaceholder) {
-                int width = mImageLayoutBounds.width;
-                int height = mImageLayoutBounds.height;
-                assert mImageLayoutBounds.x == 0;
-                assert mImageLayoutBounds.y == 0;
-                bounds = new Rect(0, 0, width, height);
-                double scale = mEditor.getCanvasControl().getScale();
-                int scaledWidth = (int) (scale * width);
-                int scaledHeight = (int) (scale * height);
-                int x = -scaledWidth / 2;
-                int y = -scaledHeight / 2;
-                dragBounds = new Rect(x, y, scaledWidth, scaledHeight);
-            }
-
-            SimpleElement se = new SimpleElement(
-                    SimpleXmlTransfer.getFqcn(mDesc),
-                    null   /* parentFqcn */,
-                    bounds /* bounds */,
-                    null   /* parentBounds */);
-            if (mDesc instanceof PaletteMetadataDescriptor) {
-                PaletteMetadataDescriptor pm = (PaletteMetadataDescriptor) mDesc;
-                pm.initializeNew(se);
-            }
-            mElements = new SimpleElement[] { se };
-
-            // Register this as the current dragged data
-            GlobalCanvasDragInfo dragInfo = GlobalCanvasDragInfo.getInstance();
-            dragInfo.startDrag(
-                    mElements,
-                    null /* selection */,
-                    null /* canvas */,
-                    null /* removeSource */);
-            dragInfo.setDragBounds(dragBounds);
-            dragInfo.setDragBaseline(mBaseline);
-
-
-            e.doit = true;
-        }
-
-        @Override
-        public void dragSetData(DragSourceEvent e) {
-            // Provide the data for the drop when requested by the other side.
-            if (SimpleXmlTransfer.getInstance().isSupportedType(e.dataType)) {
-                e.data = mElements;
-            }
-        }
-
-        @Override
-        public void dragFinished(DragSourceEvent e) {
-            // Unregister the dragged data.
-            GlobalCanvasDragInfo.getInstance().stopDrag();
-            mElements = null;
-            if (mImage != null) {
-                mImage.dispose();
-                mImage = null;
-            }
-        }
-
-        // TODO: Figure out the right dimensions to use for rendering.
-        // We WILL crop this after rendering, but for performance reasons it would be good
-        // not to make it much larger than necessary since to crop this we rely on
-        // actually scanning pixels.
-
-        /**
-         * Width of the rendered preview image (before it is cropped), although the actual
-         * width may be smaller (since we also take the device screen's size into account)
-         */
-        private static final int MAX_RENDER_HEIGHT = 400;
-
-        /**
-         * Height of the rendered preview image (before it is cropped), although the
-         * actual width may be smaller (since we also take the device screen's size into
-         * account)
-         */
-        private static final int MAX_RENDER_WIDTH = 500;
-
-        /** Amount of alpha to multiply into the image (divided by 256) */
-        private static final int IMG_ALPHA = 128;
-
-        /** The image shown during the drag */
-        private Image mImage;
-        /** The non-effect bounds of the drag image */
-        private Rectangle mImageLayoutBounds;
-        private int mBaseline = -1;
-
-        /**
-         * If true, the image is a preview of the view, and if not it is a "fallback"
-         * image of some sort, such as a rendering of the palette item itself
-         */
-        private boolean mIsPlaceholder;
-
-        private void createDragImage(DragSourceEvent event) {
-            mBaseline = -1;
-            Pair<Image, Rectangle> preview = renderPreview();
-            if (preview != null) {
-                mImage = preview.getFirst();
-                mImageLayoutBounds = preview.getSecond();
-            } else {
-                mImage = null;
-                mImageLayoutBounds = null;
-            }
-
-            mIsPlaceholder = mImage == null;
-            if (mIsPlaceholder) {
-                // Couldn't render preview (or the preview is a blank image, such as for
-                // example the preview of an empty layout), so instead create a placeholder
-                // image
-                // Render the palette item itself as an image
-                Control control = ((DragSource) event.widget).getControl();
-                GC gc = new GC(control);
-                Point size = control.getSize();
-                Display display = getDisplay();
-                final Image image = new Image(display, size.x, size.y);
-                gc.copyArea(image, 0, 0);
-                gc.dispose();
-
-                BufferedImage awtImage = SwtUtils.convertToAwt(image);
-                if (awtImage != null) {
-                    awtImage = ImageUtils.createDropShadow(awtImage, 3 /* shadowSize */,
-                            0.7f /* shadowAlpha */, 0x000000 /* shadowRgb */);
-                    mImage = SwtUtils.convertToSwt(display, awtImage, true, IMG_ALPHA);
-                } else {
-                    ImageData data = image.getImageData();
-                    data.alpha = IMG_ALPHA;
-
-                    // Changing the ImageData -after- constructing an image on it
-                    // has no effect, so we have to construct a new image. Luckily these
-                    // are tiny images.
-                    mImage = new Image(display, data);
-                }
-                image.dispose();
-            }
-
-            event.image = mImage;
-
-            if (!mIsPlaceholder) {
-                // Shift the drag feedback image up such that it's centered under the
-                // mouse pointer
-                double scale = mEditor.getCanvasControl().getScale();
-                event.offsetX = (int) (scale * mImageLayoutBounds.width / 2);
-                event.offsetY = (int) (scale * mImageLayoutBounds.height / 2);
-            }
-        }
-
-        /**
-         * Performs the actual rendering of the descriptor into an image and returns the
-         * image as well as the layout bounds of the image (not including drop shadow etc)
-         */
-        private Pair<Image, Rectangle> renderPreview() {
-            ViewMetadataRepository repository = ViewMetadataRepository.get();
-            RenderMode renderMode = repository.getRenderMode(mDesc.getFullClassName());
-            if (renderMode == RenderMode.SKIP) {
-                return null;
-            }
-
-            // Create blank XML document
-            Document document = DomUtilities.createEmptyDocument();
-
-            // Insert our target view's XML into it as a node
-            GraphicalEditorPart editor = getEditor();
-            LayoutEditorDelegate layoutEditorDelegate = editor.getEditorDelegate();
-
-            String viewName = mDesc.getXmlLocalName();
-            Element element = document.createElement(viewName);
-
-            // Set up a proper name space
-            Attr attr = document.createAttributeNS(XMLNS_URI, XMLNS_ANDROID);
-            attr.setValue(ANDROID_URI);
-            element.getAttributes().setNamedItemNS(attr);
-
-            element.setAttributeNS(ANDROID_URI, ATTR_LAYOUT_WIDTH, VALUE_WRAP_CONTENT);
-            element.setAttributeNS(ANDROID_URI, ATTR_LAYOUT_HEIGHT, VALUE_WRAP_CONTENT);
-
-            // This doesn't apply to all, but doesn't seem to cause harm and makes for a
-            // better experience with text-oriented views like buttons and texts
-            element.setAttributeNS(ANDROID_URI, ATTR_TEXT,
-                    DescriptorsUtils.getBasename(mDesc.getUiName()));
-
-            // Is this a palette variation?
-            if (mDesc instanceof PaletteMetadataDescriptor) {
-                PaletteMetadataDescriptor pm = (PaletteMetadataDescriptor) mDesc;
-                pm.initializeNew(element);
-            }
-
-            document.appendChild(element);
-
-            // Construct UI model from XML
-            AndroidTargetData data = layoutEditorDelegate.getEditor().getTargetData();
-            DocumentDescriptor documentDescriptor;
-            if (data == null) {
-                documentDescriptor = new DocumentDescriptor("temp", null/*children*/);//$NON-NLS-1$
-            } else {
-                documentDescriptor = data.getLayoutDescriptors().getDescriptor();
-            }
-            UiDocumentNode model = (UiDocumentNode) documentDescriptor.createUiNode();
-            model.setEditor(layoutEditorDelegate.getEditor());
-            model.setUnknownDescriptorProvider(editor.getModel().getUnknownDescriptorProvider());
-            model.loadFromXmlNode(document);
-
-            // Call the create-hooks such that we for example insert mandatory
-            // children into views like the DialerFilter, apply image source attributes
-            // to ImageButtons, etc.
-            LayoutCanvas canvas = editor.getCanvasControl();
-            NodeFactory nodeFactory = canvas.getNodeFactory();
-            UiElementNode parent = model.getUiRoot();
-            UiElementNode child = parent.getUiChildren().get(0);
-            if (child instanceof UiViewElementNode) {
-                UiViewElementNode childUiNode = (UiViewElementNode) child;
-                NodeProxy childNode = nodeFactory.create(childUiNode);
-
-                // Applying create hooks as part of palette render should
-                // not trigger model updates
-                layoutEditorDelegate.getEditor().setIgnoreXmlUpdate(true);
-                try {
-                    canvas.getRulesEngine().callCreateHooks(layoutEditorDelegate.getEditor(),
-                            null, childNode, InsertType.CREATE_PREVIEW);
-                    childNode.applyPendingChanges();
-                } catch (Throwable t) {
-                    AdtPlugin.log(t, "Failed calling creation hooks for widget %1$s", viewName);
-                } finally {
-                    layoutEditorDelegate.getEditor().setIgnoreXmlUpdate(false);
-                }
-            }
-
-            Integer overrideBgColor = null;
-            boolean hasTransparency = false;
-            LayoutLibrary layoutLibrary = editor.getLayoutLibrary();
-            if (layoutLibrary != null &&
-                    layoutLibrary.supports(Capability.CUSTOM_BACKGROUND_COLOR)) {
-                // It doesn't matter what the background color is as long as the alpha
-                // is 0 (fully transparent). We're using red to make it more obvious if
-                // for some reason the background is painted when it shouldn't be.
-                overrideBgColor = new Integer(0x00FF0000);
-            }
-
-            RenderSession session = null;
-            try {
-                // Use at most the size of the screen for the preview render.
-                // This is important since when we fill the size of certain views (like
-                // a SeekBar), we want it to at most be the width of the screen, and for small
-                // screens the RENDER_WIDTH was wider.
-                LayoutLog silentLogger = new LayoutLog();
-
-                session = RenderService.create(editor)
-                    .setModel(model)
-                    .setMaxRenderSize(MAX_RENDER_WIDTH, MAX_RENDER_HEIGHT)
-                    .setLog(silentLogger)
-                    .setOverrideBgColor(overrideBgColor)
-                    .setDecorations(false)
-                    .createRenderSession();
-            } catch (Throwable t) {
-                // Previews can fail for a variety of reasons -- let's not bug
-                // the user with it
-                return null;
-            }
-
-            if (session != null) {
-                if (session.getResult().isSuccess()) {
-                    BufferedImage image = session.getImage();
-                    if (image != null) {
-                        BufferedImage cropped;
-                        Rect initialCrop = null;
-                        ViewInfo viewInfo = null;
-
-                        List<ViewInfo> viewInfoList = session.getRootViews();
-
-                        if (viewInfoList != null && viewInfoList.size() > 0) {
-                            viewInfo = viewInfoList.get(0);
-                            mBaseline = viewInfo.getBaseLine();
-                        }
-
-                        if (viewInfo != null) {
-                            int x1 = viewInfo.getLeft();
-                            int x2 = viewInfo.getRight();
-                            int y2 = viewInfo.getBottom();
-                            int y1 = viewInfo.getTop();
-                            initialCrop = new Rect(x1, y1, x2 - x1, y2 - y1);
-                        }
-
-                        if (hasTransparency) {
-                            cropped = ImageUtils.cropBlank(image, initialCrop);
-                        } else {
-                            // Find out what the "background" color is such that we can properly
-                            // crop it out of the image. To do this we pick out a pixel in the
-                            // bottom right unpainted area. Rather than pick the one in the far
-                            // bottom corner, we pick one as close to the bounds of the view as
-                            // possible (but still outside of the bounds), such that we can
-                            // deal with themes like the dialog theme.
-                            int edgeX = image.getWidth() -1;
-                            int edgeY = image.getHeight() -1;
-                            if (viewInfo != null) {
-                                if (viewInfo.getRight() < image.getWidth()-1) {
-                                    edgeX = viewInfo.getRight()+1;
-                                }
-                                if (viewInfo.getBottom() < image.getHeight()-1) {
-                                    edgeY = viewInfo.getBottom()+1;
-                                }
-                            }
-                            int edgeColor = image.getRGB(edgeX, edgeY);
-                            cropped = ImageUtils.cropColor(image, edgeColor, initialCrop);
-                        }
-
-                        if (cropped != null) {
-                            int width = initialCrop != null ? initialCrop.w : cropped.getWidth();
-                            int height = initialCrop != null ? initialCrop.h : cropped.getHeight();
-                            boolean needsContrast = hasTransparency
-                                    && !ImageUtils.containsDarkPixels(cropped);
-                            cropped = ImageUtils.createDropShadow(cropped,
-                                    hasTransparency ? 3 : 5 /* shadowSize */,
-                                    !hasTransparency ? 0.6f : needsContrast ? 0.8f : 0.7f/*alpha*/,
-                                    0x000000 /* shadowRgb */);
-
-                            double scale = canvas.getScale();
-                            if (scale != 1L) {
-                                cropped = ImageUtils.scale(cropped, scale, scale);
-                            }
-
-                            Display display = getDisplay();
-                            int alpha = (!hasTransparency || !needsContrast) ? IMG_ALPHA : -1;
-                            Image swtImage = SwtUtils.convertToSwt(display, cropped, true, alpha);
-                            Rectangle imageBounds = new Rectangle(0, 0, width, height);
-                            return Pair.of(swtImage, imageBounds);
-                        }
-                    }
-                }
-
-                session.dispose();
-            }
-
-            return null;
-        }
-
-        /**
-         * Utility method to print out the contents of the given XML document. This is
-         * really useful when working on the preview code above. I'm including all the
-         * code inside a constant false, which means the compiler will omit all the code,
-         * but I'd like to leave it in the code base and by doing it this way rather than
-         * as commented out code the code won't be accidentally broken.
-         */
-        @SuppressWarnings("all")
-        private void dumpDocument(Document document) {
-            // Diagnostics: print out the XML that we're about to render
-            if (false) { // Will be omitted by the compiler
-                org.apache.xml.serialize.OutputFormat outputFormat =
-                    new org.apache.xml.serialize.OutputFormat(
-                            "XML", "ISO-8859-1", true); //$NON-NLS-1$ //$NON-NLS-2$
-                outputFormat.setIndent(2);
-                outputFormat.setLineWidth(100);
-                outputFormat.setIndenting(true);
-                outputFormat.setOmitXMLDeclaration(true);
-                outputFormat.setOmitDocumentType(true);
-                StringWriter stringWriter = new StringWriter();
-                // Using FQN here to avoid having an import above, which will result
-                // in a deprecation warning, and there isn't a way to annotate a single
-                // import element with a SuppressWarnings.
-                org.apache.xml.serialize.XMLSerializer serializer =
-                    new org.apache.xml.serialize.XMLSerializer(stringWriter, outputFormat);
-                serializer.setNamespaces(true);
-                try {
-                    serializer.serialize(document.getDocumentElement());
-                    System.out.println(stringWriter.toString());
-                } catch (IOException e) {
-                    e.printStackTrace();
-                }
-            }
-        }
-    }
-
-    /** Action for switching view modes via radio buttons */
-    private class PaletteModeAction extends Action {
-        private final PaletteMode mMode;
-
-        PaletteModeAction(PaletteMode mode) {
-            super(mode.getActionLabel(), IAction.AS_RADIO_BUTTON);
-            mMode = mode;
-            boolean selected = mMode == mPaletteMode;
-            setChecked(selected);
-            setEnabled(!selected);
-        }
-
-        @Override
-        public void run() {
-            if (isEnabled()) {
-                mPaletteMode = mMode;
-                refreshPalette();
-                savePaletteMode();
-            }
-        }
-    }
-
-    /** Action for toggling various checkbox view modes - categories, sorting, etc */
-    private class ToggleViewOptionAction extends Action {
-        private final int mAction;
-        final static int TOGGLE_CATEGORY = 1;
-        final static int TOGGLE_ALPHABETICAL = 2;
-        final static int TOGGLE_AUTO_CLOSE = 3;
-        final static int REFRESH = 4;
-        final static int RESET = 5;
-
-        ToggleViewOptionAction(String title, int action, boolean checked) {
-            super(title, (action == REFRESH || action == RESET) ? IAction.AS_PUSH_BUTTON
-                    : IAction.AS_CHECK_BOX);
-            mAction = action;
-            if (checked) {
-                setChecked(checked);
-            }
-        }
-
-        @Override
-        public void run() {
-            switch (mAction) {
-                case TOGGLE_CATEGORY:
-                    mCategories = !mCategories;
-                    refreshPalette();
-                    break;
-                case TOGGLE_ALPHABETICAL:
-                    mAlphabetical = !mAlphabetical;
-                    refreshPalette();
-                    break;
-                case TOGGLE_AUTO_CLOSE:
-                    mAutoClose = !mAutoClose;
-                    mAccordion.setAutoClose(mAutoClose);
-                    break;
-                case REFRESH:
-                    mPreviewIconFactory.refresh();
-                    refreshPalette();
-                    break;
-                case RESET:
-                    mAlphabetical = false;
-                    mCategories = true;
-                    mAutoClose = true;
-                    mPaletteMode = PaletteMode.SMALL_PREVIEW;
-                    refreshPalette();
-                    break;
-            }
-            savePaletteMode();
-        }
-    }
-
-    private void addMenu(Control control) {
-        control.addMenuDetectListener(new MenuDetectListener() {
-            @Override
-            public void menuDetected(MenuDetectEvent e) {
-                showMenu(e.x, e.y);
-            }
-        });
-    }
-
-    private void showMenu(int x, int y) {
-        MenuManager manager = new MenuManager() {
-            @Override
-            public boolean isDynamic() {
-                return true;
-            }
-        };
-        boolean previews = previewsAvailable();
-        for (PaletteMode mode : PaletteMode.values()) {
-            if (mode.isPreview() && !previews) {
-                continue;
-            }
-            manager.add(new PaletteModeAction(mode));
-        }
-        if (mPaletteMode.isPreview()) {
-            manager.add(new Separator());
-            manager.add(new ToggleViewOptionAction("Refresh Previews",
-                    ToggleViewOptionAction.REFRESH,
-                    false));
-        }
-        manager.add(new Separator());
-        manager.add(new ToggleViewOptionAction("Show Categories",
-                ToggleViewOptionAction.TOGGLE_CATEGORY,
-                mCategories));
-        manager.add(new ToggleViewOptionAction("Sort Alphabetically",
-                ToggleViewOptionAction.TOGGLE_ALPHABETICAL,
-                mAlphabetical));
-        manager.add(new Separator());
-        manager.add(new ToggleViewOptionAction("Auto Close Previous",
-                ToggleViewOptionAction.TOGGLE_AUTO_CLOSE,
-                mAutoClose));
-        manager.add(new Separator());
-        manager.add(new ToggleViewOptionAction("Reset",
-                ToggleViewOptionAction.RESET,
-                false));
-
-        Menu menu = manager.createContextMenu(PaletteControl.this);
-        menu.setLocation(x, y);
-        menu.setVisible(true);
-    }
-
-    private final class ViewFinderListener implements CustomViewFinder.Listener {
-        private final Composite mParent;
-
-        private ViewFinderListener(Composite parent) {
-            mParent = parent;
-        }
-
-        @Override
-        public void viewsUpdated(Collection<String> customViews,
-                Collection<String> thirdPartyViews) {
-            addCustomItems(mParent);
-            mParent.layout(true);
-        }
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/PlayAnimationMenu.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/PlayAnimationMenu.java
deleted file mode 100644
index 629a42f..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/PlayAnimationMenu.java
+++ /dev/null
@@ -1,247 +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.eclipse.adt.internal.editors.layout.gle2;
-
-import static com.android.SdkConstants.FD_RESOURCES;
-import static com.android.SdkConstants.FD_RES_ANIMATOR;
-import static com.android.ide.eclipse.adt.AdtConstants.WS_SEP;
-
-import com.android.ide.common.rendering.api.Capability;
-import com.android.ide.common.rendering.api.IAnimationListener;
-import com.android.ide.common.rendering.api.RenderSession;
-import com.android.ide.common.rendering.api.Result;
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.ide.eclipse.adt.internal.editors.layout.LayoutEditorDelegate;
-import com.android.ide.eclipse.adt.internal.wizards.newxmlfile.NewXmlFileWizard;
-import com.android.resources.ResourceType;
-import com.android.utils.Pair;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.ActionContributionItem;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.action.Separator;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.wizard.WizardDialog;
-import org.eclipse.swt.widgets.Menu;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchWindow;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.List;
-
-/**
- * "Play Animation" context menu which lists available animations in the project and in
- * the framework, as well as a "Create Animation" shortcut, and allows the animation to be
- * run on the selection
- * <p/>
- * TODO: Add transport controls for play/rewind/pause/loop, and (if possible) scrubbing
- */
-public class PlayAnimationMenu extends SubmenuAction {
-    /** Associated canvas */
-    private final LayoutCanvas mCanvas;
-    /** Whether this menu is showing local animations or framework animations */
-    private boolean mFramework;
-
-    /**
-     * Creates a "Play Animation" menu
-     *
-     * @param canvas associated canvas
-     */
-    public PlayAnimationMenu(LayoutCanvas canvas) {
-        this(canvas, "Play Animation", false);
-    }
-
-    /**
-     * Creates an animation menu; this can be used either for the outer Play animation
-     * menu, or the inner frameworks-animations list
-     *
-     * @param canvas the associated canvas
-     * @param title menu item name
-     * @param framework true to show the framework animations, false for the project (and
-     *            nested framework-animation-menu) animations
-     */
-    private PlayAnimationMenu(LayoutCanvas canvas, String title, boolean framework) {
-        super(title);
-        mCanvas = canvas;
-        mFramework = framework;
-    }
-
-    @Override
-    protected void addMenuItems(Menu menu) {
-        SelectionManager selectionManager = mCanvas.getSelectionManager();
-        List<SelectionItem> selection = selectionManager.getSelections();
-        if (selection.size() != 1) {
-            addDisabledMessageItem("Select exactly one widget");
-            return;
-        }
-
-        GraphicalEditorPart graphicalEditor = mCanvas.getEditorDelegate().getGraphicalEditor();
-        if (graphicalEditor.renderingSupports(Capability.PLAY_ANIMATION)) {
-            // List of animations
-            Collection<String> animationNames = graphicalEditor.getResourceNames(mFramework,
-                    ResourceType.ANIMATOR);
-            if (animationNames.size() > 0) {
-                // Sort alphabetically
-                List<String> sortedNames = new ArrayList<String>(animationNames);
-                Collections.sort(sortedNames);
-
-                for (String animation : sortedNames) {
-                    String title = animation;
-                    IAction action = new PlayAnimationAction(title, animation, mFramework);
-                    new ActionContributionItem(action).fill(menu, -1);
-                }
-
-                new Separator().fill(menu, -1);
-            }
-
-            if (!mFramework) {
-                // Not in the framework submenu: include recent list and create new actions
-
-                // "Create New" action
-                new ActionContributionItem(new CreateAnimationAction()).fill(menu, -1);
-
-                // Framework resources submenu
-                new Separator().fill(menu, -1);
-                PlayAnimationMenu sub = new PlayAnimationMenu(mCanvas, "Android Builtin", true);
-                new ActionContributionItem(sub).fill(menu, -1);
-            }
-        } else {
-            addDisabledMessageItem(
-                    "Not supported for this SDK version; try changing the Render Target");
-        }
-    }
-
-    private class PlayAnimationAction extends Action {
-        private final String mAnimationName;
-        private final boolean mIsFrameworkAnim;
-
-        public PlayAnimationAction(String title, String animationName, boolean isFrameworkAnim) {
-            super(title, IAction.AS_PUSH_BUTTON);
-            mAnimationName = animationName;
-            mIsFrameworkAnim = isFrameworkAnim;
-        }
-
-        @Override
-        public void run() {
-            SelectionManager selectionManager = mCanvas.getSelectionManager();
-            List<SelectionItem> selection = selectionManager.getSelections();
-            SelectionItem canvasSelection = selection.get(0);
-            CanvasViewInfo info = canvasSelection.getViewInfo();
-
-            Object viewObject = info.getViewObject();
-            if (viewObject != null) {
-                ViewHierarchy viewHierarchy = mCanvas.getViewHierarchy();
-                RenderSession session = viewHierarchy.getSession();
-                Result r = session.animate(viewObject, mAnimationName, mIsFrameworkAnim,
-                        new IAnimationListener() {
-                            private boolean mPendingDrawing = false;
-
-                            @Override
-                            public void onNewFrame(RenderSession s) {
-                                SelectionOverlay selectionOverlay = mCanvas.getSelectionOverlay();
-                                if (!selectionOverlay.isHiding()) {
-                                    selectionOverlay.setHiding(true);
-                                }
-                                HoverOverlay hoverOverlay = mCanvas.getHoverOverlay();
-                                if (!hoverOverlay.isHiding()) {
-                                    hoverOverlay.setHiding(true);
-                                }
-
-                                ImageOverlay imageOverlay = mCanvas.getImageOverlay();
-                                imageOverlay.setImage(s.getImage(), s.isAlphaChannelImage());
-                                synchronized (this) {
-                                    if (mPendingDrawing == false) {
-                                        mCanvas.getDisplay().asyncExec(new Runnable() {
-                                            @Override
-                                            public void run() {
-                                                synchronized (this) {
-                                                    mPendingDrawing = false;
-                                                }
-                                                mCanvas.redraw();
-                                            }
-                                        });
-                                        mPendingDrawing = true;
-                                    }
-                                }
-                            }
-
-                            @Override
-                            public boolean isCanceled() {
-                                return false;
-                            }
-
-                            @Override
-                            public void done(Result result) {
-                                SelectionOverlay selectionOverlay = mCanvas.getSelectionOverlay();
-                                selectionOverlay.setHiding(false);
-                                HoverOverlay hoverOverlay = mCanvas.getHoverOverlay();
-                                hoverOverlay.setHiding(false);
-
-                                // Must refresh view hierarchy to force objects back to
-                                // their original positions in case animations have left
-                                // them elsewhere
-                                mCanvas.getDisplay().asyncExec(new Runnable() {
-                                    @Override
-                                    public void run() {
-                                        GraphicalEditorPart graphicalEditor = mCanvas
-                                                .getEditorDelegate().getGraphicalEditor();
-                                        graphicalEditor.recomputeLayout();
-                                    }
-                                });
-                            }
-                        });
-
-                if (!r.isSuccess()) {
-                    if (r.getErrorMessage() != null) {
-                        AdtPlugin.log(r.getException(), r.getErrorMessage());
-                    }
-                }
-            }
-        }
-    }
-
-    /**
-     * Action which brings up the "Create new XML File" wizard, pre-selected with the
-     * animation category
-     */
-    private class CreateAnimationAction extends Action {
-        public CreateAnimationAction() {
-            super("Create...", IAction.AS_PUSH_BUTTON);
-        }
-
-        @Override
-        public void run() {
-            Shell parent = mCanvas.getShell();
-            NewXmlFileWizard wizard = new NewXmlFileWizard();
-            LayoutEditorDelegate editor = mCanvas.getEditorDelegate();
-            IWorkbenchWindow workbenchWindow =
-                editor.getEditor().getEditorSite().getWorkbenchWindow();
-            IWorkbench workbench = workbenchWindow.getWorkbench();
-            String animationDir = FD_RESOURCES + WS_SEP + FD_RES_ANIMATOR;
-            Pair<IProject, String> pair = Pair.of(editor.getEditor().getProject(), animationDir);
-            IStructuredSelection selection = new StructuredSelection(pair);
-            wizard.init(workbench, selection);
-            WizardDialog dialog = new WizardDialog(parent, wizard);
-            dialog.create();
-            dialog.open();
-        }
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/PreviewIconFactory.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/PreviewIconFactory.java
deleted file mode 100644
index 5661b29..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/PreviewIconFactory.java
+++ /dev/null
@@ -1,642 +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.eclipse.adt.internal.editors.layout.gle2;
-
-import static com.android.SdkConstants.DOT_PNG;
-import static com.android.SdkConstants.FQCN_DATE_PICKER;
-import static com.android.SdkConstants.FQCN_EXPANDABLE_LIST_VIEW;
-import static com.android.SdkConstants.FQCN_LIST_VIEW;
-import static com.android.SdkConstants.FQCN_TIME_PICKER;
-
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-import com.android.ide.common.rendering.LayoutLibrary;
-import com.android.ide.common.rendering.api.Capability;
-import com.android.ide.common.rendering.api.RenderSession;
-import com.android.ide.common.rendering.api.ResourceValue;
-import com.android.ide.common.rendering.api.SessionParams.RenderingMode;
-import com.android.ide.common.rendering.api.StyleResourceValue;
-import com.android.ide.common.rendering.api.ViewInfo;
-import com.android.ide.common.resources.ResourceResolver;
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.ide.eclipse.adt.internal.editors.descriptors.DocumentDescriptor;
-import com.android.ide.eclipse.adt.internal.editors.descriptors.ElementDescriptor;
-import com.android.ide.eclipse.adt.internal.editors.layout.LayoutEditorDelegate;
-import com.android.ide.eclipse.adt.internal.editors.layout.gre.PaletteMetadataDescriptor;
-import com.android.ide.eclipse.adt.internal.editors.layout.gre.ViewMetadataRepository;
-import com.android.ide.eclipse.adt.internal.editors.layout.gre.ViewMetadataRepository.RenderMode;
-import com.android.ide.eclipse.adt.internal.editors.uimodel.UiDocumentNode;
-import com.android.ide.eclipse.adt.internal.editors.uimodel.UiElementNode;
-import com.android.ide.eclipse.adt.internal.resources.ResourceHelper;
-import com.android.ide.eclipse.adt.internal.sdk.AndroidTargetData;
-import com.android.sdklib.IAndroidTarget;
-import com.android.utils.Pair;
-
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.swt.graphics.RGB;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-
-import java.awt.image.BufferedImage;
-import java.io.BufferedInputStream;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.MalformedURLException;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-import java.util.Properties;
-
-import javax.imageio.ImageIO;
-
-/**
- * Factory which can provide preview icons for android views of a particular SDK and
- * editor's configuration chooser
- */
-public class PreviewIconFactory {
-    private PaletteControl mPalette;
-    private RGB mBackground;
-    private RGB mForeground;
-    private File mImageDir;
-
-    private static final String PREVIEW_INFO_FILE = "preview.properties"; //$NON-NLS-1$
-
-    public PreviewIconFactory(PaletteControl palette) {
-        mPalette = palette;
-    }
-
-    /**
-     * Resets the state in the preview icon factory such that it will re-fetch information
-     * like the theme and SDK (the icons themselves are cached in a directory across IDE
-     * session though)
-     */
-    public void reset() {
-        mImageDir = null;
-        mBackground = null;
-        mForeground = null;
-    }
-
-    /**
-     * Deletes all the persistent state for the current settings such that it will be regenerated
-     */
-    public void refresh() {
-        File imageDir = getImageDir(false);
-        if (imageDir != null && imageDir.exists()) {
-            File[] files = imageDir.listFiles();
-            for (File file : files) {
-                file.delete();
-            }
-            imageDir.delete();
-            reset();
-        }
-    }
-
-    /**
-     * Returns an image descriptor for the given element descriptor, or null if no image
-     * could be computed. The rendering parameters (SDK, theme etc) correspond to those
-     * stored in the associated palette.
-     *
-     * @param desc the element descriptor to get an image for
-     * @return an image descriptor, or null if no image could be rendered
-     */
-    public ImageDescriptor getImageDescriptor(ElementDescriptor desc) {
-        File imageDir = getImageDir(false);
-        if (!imageDir.exists()) {
-            render();
-        }
-        File file = new File(imageDir, getFileName(desc));
-        if (file.exists()) {
-            try {
-                return ImageDescriptor.createFromURL(file.toURI().toURL());
-            } catch (MalformedURLException e) {
-                AdtPlugin.log(e, "Could not create image descriptor for %s", file);
-            }
-        }
-
-        return null;
-    }
-
-    /**
-     * Partition the elements in the document according to their rendering preferences;
-     * elements that should be skipped are removed, elements that should be rendered alone
-     * are placed in their own list, etc
-     *
-     * @param document the document containing render fragments for the various elements
-     * @return
-     */
-    private List<List<Element>> partitionRenderElements(Document document) {
-        List<List<Element>> elements = new ArrayList<List<Element>>();
-
-        List<Element> shared = new ArrayList<Element>();
-        Element root = document.getDocumentElement();
-        elements.add(shared);
-
-        ViewMetadataRepository repository = ViewMetadataRepository.get();
-
-        NodeList children = root.getChildNodes();
-        for (int i = 0, n = children.getLength(); i < n; i++) {
-            Node node = children.item(i);
-            if (node.getNodeType() == Node.ELEMENT_NODE) {
-                Element element = (Element) node;
-                String fqn = repository.getFullClassName(element);
-                assert fqn.length() > 0 : element.getNodeName();
-                RenderMode renderMode = repository.getRenderMode(fqn);
-
-                // Temporary special cases
-                if (fqn.equals(FQCN_LIST_VIEW) || fqn.equals(FQCN_EXPANDABLE_LIST_VIEW)) {
-                    if (!mPalette.getEditor().renderingSupports(Capability.ADAPTER_BINDING)) {
-                        renderMode = RenderMode.SKIP;
-                    }
-                } else if (fqn.equals(FQCN_DATE_PICKER) || fqn.equals(FQCN_TIME_PICKER)) {
-                    IAndroidTarget renderingTarget = mPalette.getEditor().getRenderingTarget();
-                    // In Honeycomb, these widgets only render properly in the Holo themes.
-                    int apiLevel = renderingTarget.getVersion().getApiLevel();
-                    if (apiLevel == 11) {
-                        String themeName = mPalette.getCurrentTheme();
-                        if (themeName == null || !themeName.startsWith("Theme.Holo")) { //$NON-NLS-1$
-                            // Note - it's possible that the the theme is some other theme
-                            // such as a user theme which inherits from Theme.Holo and that
-                            // the render -would- have worked, but it's harder to detect that
-                            // scenario, so we err on the side of caution and just show an
-                            // icon + name for the time widgets.
-                            renderMode = RenderMode.SKIP;
-                        }
-                    } else if (apiLevel >= 12) {
-                        // Currently broken, even for Holo.
-                        renderMode = RenderMode.SKIP;
-                    } // apiLevel <= 10 is fine
-                }
-
-                if (renderMode == RenderMode.ALONE) {
-                    elements.add(Collections.singletonList(element));
-                } else if (renderMode == RenderMode.NORMAL) {
-                    shared.add(element);
-                } else {
-                    assert renderMode == RenderMode.SKIP;
-                }
-            }
-        }
-
-        return elements;
-    }
-
-    /**
-     * Renders ALL the widgets and then extracts image data for each view and saves it on
-     * disk
-     */
-    private boolean render() {
-        File imageDir = getImageDir(true);
-
-        GraphicalEditorPart editor = mPalette.getEditor();
-        LayoutEditorDelegate layoutEditorDelegate = editor.getEditorDelegate();
-        LayoutLibrary layoutLibrary = editor.getLayoutLibrary();
-        Integer overrideBgColor = null;
-        if (layoutLibrary != null) {
-            if (layoutLibrary.supports(Capability.CUSTOM_BACKGROUND_COLOR)) {
-                Pair<RGB, RGB> themeColors = getColorsFromTheme();
-                RGB bg = themeColors.getFirst();
-                RGB fg = themeColors.getSecond();
-                if (bg != null) {
-                    storeBackground(imageDir, bg, fg);
-                    overrideBgColor = Integer.valueOf(ImageUtils.rgbToInt(bg, 0xFF));
-                }
-            }
-        }
-
-        ViewMetadataRepository repository = ViewMetadataRepository.get();
-        Document document = repository.getRenderingConfigDoc();
-
-        if (document == null) {
-            return false;
-        }
-
-        // Construct UI model from XML
-        AndroidTargetData data = layoutEditorDelegate.getEditor().getTargetData();
-        DocumentDescriptor documentDescriptor;
-        if (data == null) {
-            documentDescriptor = new DocumentDescriptor("temp", null/*children*/);//$NON-NLS-1$
-        } else {
-            documentDescriptor = data.getLayoutDescriptors().getDescriptor();
-        }
-        UiDocumentNode model = (UiDocumentNode) documentDescriptor.createUiNode();
-        model.setEditor(layoutEditorDelegate.getEditor());
-        model.setUnknownDescriptorProvider(editor.getModel().getUnknownDescriptorProvider());
-
-        Element documentElement = document.getDocumentElement();
-        List<List<Element>> elements = partitionRenderElements(document);
-        for (List<Element> elementGroup : elements) {
-            // Replace the document elements with the current element group
-            while (documentElement.getFirstChild() != null) {
-                documentElement.removeChild(documentElement.getFirstChild());
-            }
-            for (Element element : elementGroup) {
-                documentElement.appendChild(element);
-            }
-
-            model.loadFromXmlNode(document);
-
-            RenderSession session = null;
-            NodeList childNodes = documentElement.getChildNodes();
-            try {
-                // Important to get these sizes large enough for clients that don't support
-                // RenderMode.FULL_EXPAND such as 1.6
-                int width = 200;
-                int height = childNodes.getLength() == 1 ? 400 : 1600;
-
-                session = RenderService.create(editor)
-                    .setModel(model)
-                    .setOverrideRenderSize(width, height)
-                    .setRenderingMode(RenderingMode.FULL_EXPAND)
-                    .setLog(editor.createRenderLogger("palette"))
-                    .setOverrideBgColor(overrideBgColor)
-                    .setDecorations(false)
-                    .createRenderSession();
-            } catch (Throwable t) {
-                // If there are internal errors previewing the components just revert to plain
-                // icons and labels
-                continue;
-            }
-
-            if (session != null) {
-                if (session.getResult().isSuccess()) {
-                    BufferedImage image = session.getImage();
-                    if (image != null && image.getWidth() > 0 && image.getHeight() > 0) {
-
-                        // Fallback for older platforms where we couldn't do background rendering
-                        // at the beginning of this method
-                        if (mBackground == null) {
-                            Pair<RGB, RGB> themeColors = getColorsFromTheme();
-                            RGB bg = themeColors.getFirst();
-                            RGB fg = themeColors.getSecond();
-
-                            if (bg == null) {
-                                // Just use a pixel from the rendering instead.
-                                int p = image.getRGB(image.getWidth() - 1, image.getHeight() - 1);
-                                // However, in this case we don't trust the foreground color
-                                // even if one was found in the themes; pick one that is guaranteed
-                                // to contrast with the background
-                                bg = ImageUtils.intToRgb(p);
-                                if (ImageUtils.getBrightness(ImageUtils.rgbToInt(bg, 255)) < 128) {
-                                    fg = new RGB(255, 255, 255);
-                                } else {
-                                    fg = new RGB(0, 0, 0);
-                                }
-                            }
-                            storeBackground(imageDir, bg, fg);
-                            assert mBackground != null;
-                        }
-
-                        List<ViewInfo> viewInfoList = session.getRootViews();
-                        if (viewInfoList != null && viewInfoList.size() > 0) {
-                            // We don't render previews under a <merge> so there should
-                            // only be one root.
-                            ViewInfo firstRoot = viewInfoList.get(0);
-                            int parentX = firstRoot.getLeft();
-                            int parentY = firstRoot.getTop();
-                            List<ViewInfo> infos = firstRoot.getChildren();
-                            for (ViewInfo info : infos) {
-                                Object cookie = info.getCookie();
-                                if (!(cookie instanceof UiElementNode)) {
-                                    continue;
-                                }
-                                UiElementNode node = (UiElementNode) cookie;
-                                String fileName = getFileName(node);
-                                File file = new File(imageDir, fileName);
-                                if (file.exists()) {
-                                    // On Windows, perhaps we need to rename instead?
-                                    file.delete();
-                                }
-                                int x1 = parentX + info.getLeft();
-                                int y1 = parentY + info.getTop();
-                                int x2 = parentX + info.getRight();
-                                int y2 = parentY + info.getBottom();
-                                if (x1 != x2 && y1 != y2) {
-                                    savePreview(file, image, x1, y1, x2, y2);
-                                }
-                            }
-                        }
-                    }
-                } else {
-                    StringBuilder sb = new StringBuilder();
-                    for (int i = 0, n = childNodes.getLength(); i < n; i++) {
-                        Node node = childNodes.item(i);
-                        if (node instanceof Element) {
-                            Element e = (Element) node;
-                            String fqn = repository.getFullClassName(e);
-                            fqn = fqn.substring(fqn.lastIndexOf('.') + 1);
-                            if (sb.length() > 0) {
-                                sb.append(", "); //$NON-NLS-1$
-                            }
-                            sb.append(fqn);
-                        }
-                    }
-                    AdtPlugin.log(IStatus.WARNING, "Failed to render set of icons for %1$s",
-                            sb.toString());
-
-                    if (session.getResult().getException() != null) {
-                        AdtPlugin.log(session.getResult().getException(),
-                                session.getResult().getErrorMessage());
-                    } else if (session.getResult().getErrorMessage() != null) {
-                        AdtPlugin.log(IStatus.WARNING, session.getResult().getErrorMessage());
-                    }
-                }
-
-                session.dispose();
-            }
-        }
-
-        mPalette.getEditor().recomputeLayout();
-
-        return true;
-    }
-
-    /**
-     * Look up the background and foreground colors from the theme. May not find either
-     * the background or foreground or both, but will always return a pair of possibly
-     * null colors.
-     *
-     * @return a pair of possibly null color descriptions
-     */
-    @NonNull
-    private Pair<RGB, RGB> getColorsFromTheme() {
-        RGB background = null;
-        RGB foreground = null;
-
-        ResourceResolver resources = mPalette.getEditor().getResourceResolver();
-        if (resources == null) {
-            return Pair.of(background, foreground);
-        }
-        StyleResourceValue theme = resources.getCurrentTheme();
-        if (theme != null) {
-            background = resolveThemeColor(resources, "windowBackground"); //$NON-NLS-1$
-            if (background == null) {
-                background = renderDrawableResource("windowBackground"); //$NON-NLS-1$
-                // This causes some harm with some themes: We'll find a color, say black,
-                // that isn't actually rendered in the theme. Better to use null here,
-                // which will cause the caller to pick a pixel from the observed background
-                // instead.
-                //if (background == null) {
-                //    background = resolveThemeColor(resources, "colorBackground"); //$NON-NLS-1$
-                //}
-            }
-            foreground = resolveThemeColor(resources, "textColorPrimary"); //$NON-NLS-1$
-        }
-
-        // Ensure that the foreground color is suitably distinct from the background color
-        if (background != null) {
-            int bgRgb = ImageUtils.rgbToInt(background, 0xFF);
-            int backgroundBrightness = ImageUtils.getBrightness(bgRgb);
-            if (foreground == null) {
-                if (backgroundBrightness < 128) {
-                    foreground = new RGB(255, 255, 255);
-                } else {
-                    foreground = new RGB(0, 0, 0);
-                }
-            } else {
-                int fgRgb = ImageUtils.rgbToInt(foreground, 0xFF);
-                int foregroundBrightness = ImageUtils.getBrightness(fgRgb);
-                if (Math.abs(backgroundBrightness - foregroundBrightness) < 64) {
-                    if (backgroundBrightness < 128) {
-                        foreground = new RGB(255, 255, 255);
-                    } else {
-                        foreground = new RGB(0, 0, 0);
-                    }
-                }
-            }
-        }
-
-        return Pair.of(background, foreground);
-    }
-
-    /**
-     * Renders the given resource which should refer to a drawable and returns a
-     * representative color value for the drawable (such as the color in the center)
-     *
-     * @param themeItemName the item in the theme to be looked up and rendered
-     * @return a color representing a typical color in the drawable
-     */
-    private RGB renderDrawableResource(String themeItemName) {
-        GraphicalEditorPart editor = mPalette.getEditor();
-        ResourceResolver resources = editor.getResourceResolver();
-        ResourceValue resourceValue = resources.findItemInTheme(themeItemName);
-        BufferedImage image = RenderService.create(editor)
-            .setOverrideRenderSize(100, 100)
-            .renderDrawable(resourceValue);
-        if (image != null) {
-            // Use the middle pixel as the color since that works better for gradients;
-            // solid colors work too.
-            int rgb = image.getRGB(image.getWidth() / 2, image.getHeight() / 2);
-            return ImageUtils.intToRgb(rgb);
-        }
-
-        return null;
-    }
-
-    private static RGB resolveThemeColor(ResourceResolver resources, String resourceName) {
-        ResourceValue textColor = resources.findItemInTheme(resourceName);
-        return ResourceHelper.resolveColor(resources, textColor);
-    }
-
-    private String getFileName(ElementDescriptor descriptor) {
-        if (descriptor instanceof PaletteMetadataDescriptor) {
-            PaletteMetadataDescriptor pmd = (PaletteMetadataDescriptor) descriptor;
-            StringBuilder sb = new StringBuilder();
-            String name = pmd.getUiName();
-            // Strip out whitespace, parentheses, etc.
-            for (int i = 0, n = name.length(); i < n; i++) {
-                char c = name.charAt(i);
-                if (Character.isLetter(c)) {
-                    sb.append(c);
-                }
-            }
-            return sb.toString() + DOT_PNG;
-        }
-        return descriptor.getUiName() + DOT_PNG;
-    }
-
-    private String getFileName(UiElementNode node) {
-        ViewMetadataRepository repository = ViewMetadataRepository.get();
-        String fqn = repository.getFullClassName((Element) node.getXmlNode());
-        return fqn.substring(fqn.lastIndexOf('.') + 1) + DOT_PNG;
-    }
-
-    /**
-     * Cleans up a name by removing punctuation and whitespace etc to make
-     * it a better filename
-     * @param name the name to clean
-     * @return a cleaned up name
-     */
-    @NonNull
-    private static String cleanup(@Nullable String name) {
-        if (name == null) {
-            return "";
-        }
-
-        // Extract just the characters (no whitespace, parentheses, punctuation etc)
-        // to ensure that the filename is pretty portable
-        StringBuilder sb = new StringBuilder(name.length());
-        for (int i = 0; i < name.length(); i++) {
-            char c = name.charAt(i);
-            if (Character.isJavaIdentifierPart(c)) {
-                sb.append(Character.toLowerCase(c));
-            }
-        }
-
-        return sb.toString();
-    }
-
-    /** Returns the location of a directory containing image previews (which may not exist) */
-    private File getImageDir(boolean create) {
-        if (mImageDir == null) {
-            // Location for plugin-related state data
-            IPath pluginState = AdtPlugin.getDefault().getStateLocation();
-
-            // We have multiple directories - one for each combination of SDK, theme and device
-            // (and later, possibly other qualifiers).
-            // These are created -lazily-.
-            String targetName = mPalette.getCurrentTarget().hashString();
-            String androidTargetNamePrefix = "android-";
-            String themeNamePrefix = "Theme.";
-            if (targetName.startsWith(androidTargetNamePrefix)) {
-                targetName = targetName.substring(androidTargetNamePrefix.length());
-            }
-            String themeName = mPalette.getCurrentTheme();
-            if (themeName == null) {
-                themeName = "Theme"; //$NON-NLS-1$
-            }
-            if (themeName.startsWith(themeNamePrefix)) {
-                themeName = themeName.substring(themeNamePrefix.length());
-            }
-            targetName = cleanup(targetName);
-            themeName = cleanup(themeName);
-            String deviceName = cleanup(mPalette.getCurrentDevice());
-            String dirName = String.format("palette-preview-r16b-%s-%s-%s", targetName,
-                    themeName, deviceName);
-            IPath dirPath = pluginState.append(dirName);
-
-            mImageDir = new File(dirPath.toOSString());
-        }
-
-        if (create && !mImageDir.exists()) {
-            mImageDir.mkdirs();
-        }
-
-        return mImageDir;
-    }
-
-    private void savePreview(File output, BufferedImage image,
-            int left, int top, int right, int bottom) {
-        try {
-            BufferedImage im = ImageUtils.subImage(image, left, top, right, bottom);
-            ImageIO.write(im, "PNG", output); //$NON-NLS-1$
-        } catch (IOException e) {
-            AdtPlugin.log(e, "Failed writing palette file");
-        }
-    }
-
-    private void storeBackground(File imageDir, RGB bg, RGB fg) {
-        mBackground = bg;
-        mForeground = fg;
-        File file = new File(imageDir, PREVIEW_INFO_FILE);
-        String colors = String.format(
-                "background=#%02x%02x%02x\nforeground=#%02x%02x%02x\n", //$NON-NLS-1$
-                bg.red, bg.green, bg.blue,
-                fg.red, fg.green, fg.blue);
-        AdtPlugin.writeFile(file, colors);
-    }
-
-    public RGB getBackgroundColor() {
-        if (mBackground == null) {
-            initColors();
-        }
-
-        return mBackground;
-    }
-
-    public RGB getForegroundColor() {
-        if (mForeground == null) {
-            initColors();
-        }
-
-        return mForeground;
-    }
-
-    public void initColors() {
-        try {
-            // Already initialized? Foreground can be null which would call
-            // initColors again and again, but background is never null after
-            // initialization so we use it as the have-initialized flag.
-            if (mBackground != null) {
-                return;
-            }
-
-            File imageDir = getImageDir(false);
-            if (!imageDir.exists()) {
-                render();
-
-                // Initialized as part of the render
-                if (mBackground != null) {
-                    return;
-                }
-            }
-
-            File file = new File(imageDir, PREVIEW_INFO_FILE);
-            if (file.exists()) {
-                Properties properties = new Properties();
-                InputStream is = null;
-                try {
-                    is = new BufferedInputStream(new FileInputStream(file));
-                    properties.load(is);
-                } catch (IOException e) {
-                    AdtPlugin.log(e, "Can't read preview properties");
-                } finally {
-                    if (is != null) {
-                        try {
-                            is.close();
-                        } catch (IOException e) {
-                            // Nothing useful can be done.
-                        }
-                    }
-                }
-
-                String colorString = (String) properties.get("background"); //$NON-NLS-1$
-                if (colorString != null) {
-                    int rgb = ImageUtils.getColor(colorString.trim());
-                    mBackground = ImageUtils.intToRgb(rgb);
-                }
-                colorString = (String) properties.get("foreground"); //$NON-NLS-1$
-                if (colorString != null) {
-                    int rgb = ImageUtils.getColor(colorString.trim());
-                    mForeground = ImageUtils.intToRgb(rgb);
-                }
-            }
-
-            if (mBackground == null) {
-                mBackground = new RGB(0, 0, 0);
-            }
-            // mForeground is allowed to be null.
-        } catch (Throwable t) {
-            AdtPlugin.log(t, "Cannot initialize preview color settings");
-        }
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/RenderLogger.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/RenderLogger.java
deleted file mode 100644
index 8548830..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/RenderLogger.java
+++ /dev/null
@@ -1,327 +0,0 @@
-/*
- * Copyright (C) 2010 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.editors.layout.gle2;
-
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-import com.android.ide.common.rendering.RenderSecurityManager;
-import com.android.ide.common.rendering.api.LayoutLog;
-import com.android.ide.eclipse.adt.AdtPlugin;
-
-import org.eclipse.core.runtime.IStatus;
-
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-/**
- * A {@link LayoutLog} which records the problems it encounters and offers them as a
- * single summary at the end
- */
-public class RenderLogger extends LayoutLog {
-    static final String TAG_MISSING_DIMENSION = "missing.dimension";     //$NON-NLS-1$
-
-    private final String mName;
-    private List<String> mFidelityWarnings;
-    private List<String> mWarnings;
-    private List<String> mErrors;
-    private boolean mHaveExceptions;
-    private List<String> mTags;
-    private List<Throwable> mTraces;
-    private static Set<String> sIgnoredFidelityWarnings;
-    private final Object mCredential;
-
-    /** Construct a logger for the given named layout */
-    RenderLogger(String name, Object credential) {
-        mName = name;
-        mCredential = credential;
-    }
-
-    /**
-     * Are there any logged errors or warnings during the render?
-     *
-     * @return true if there were problems during the render
-     */
-    public boolean hasProblems() {
-        return mFidelityWarnings != null || mErrors != null || mWarnings != null ||
-            mHaveExceptions;
-    }
-
-    /**
-     * Returns a list of traces encountered during rendering, or null if none
-     *
-     * @return a list of traces encountered during rendering, or null if none
-     */
-    @Nullable
-    public List<Throwable> getFirstTrace() {
-        return mTraces;
-    }
-
-    /**
-     * Returns a (possibly multi-line) description of all the problems
-     *
-     * @param includeFidelityWarnings if true, include fidelity warnings in the problem
-     *            summary
-     * @return a string describing the rendering problems
-     */
-    @NonNull
-    public String getProblems(boolean includeFidelityWarnings) {
-        StringBuilder sb = new StringBuilder();
-
-        if (mErrors != null) {
-            for (String error : mErrors) {
-                sb.append(error).append('\n');
-            }
-        }
-
-        if (mWarnings != null) {
-            for (String warning : mWarnings) {
-                sb.append(warning).append('\n');
-            }
-        }
-
-        if (includeFidelityWarnings && mFidelityWarnings != null) {
-            sb.append("The graphics preview in the layout editor may not be accurate:\n");
-            for (String warning : mFidelityWarnings) {
-                sb.append("* ");
-                sb.append(warning).append('\n');
-            }
-        }
-
-        if (mHaveExceptions) {
-            sb.append("Exception details are logged in Window > Show View > Error Log");
-        }
-
-        return sb.toString();
-    }
-
-    /**
-     * Returns the fidelity warnings
-     *
-     * @return the fidelity warnings
-     */
-    @Nullable
-    public List<String> getFidelityWarnings() {
-        return mFidelityWarnings;
-    }
-
-    // ---- extends LayoutLog ----
-
-    @Override
-    public void error(String tag, String message, Object data) {
-        String description = describe(message);
-
-        appendToIdeLog(null, IStatus.ERROR, description);
-
-        // Workaround: older layout libraries don't provide a tag for this error
-        if (tag == null && message != null
-                && message.startsWith("Failed to find style ")) { //$NON-NLS-1$
-            tag = LayoutLog.TAG_RESOURCES_RESOLVE_THEME_ATTR;
-        }
-
-        addError(tag, description);
-    }
-
-    @Override
-    public void error(String tag, String message, Throwable throwable, Object data) {
-        String description = describe(message);
-        appendToIdeLog(throwable, IStatus.ERROR, description);
-
-        if (throwable != null) {
-            if (throwable instanceof ClassNotFoundException) {
-                // The project callback is given a chance to resolve classes,
-                // and when it fails, it will record it in its own list which
-                // is displayed in a special way (with action hyperlinks etc).
-                // Therefore, include these messages in the visible render log,
-                // especially since the user message from a ClassNotFoundException
-                // is really not helpful (it just lists the class name without
-                // even mentioning that it is a class-not-found exception.)
-                return;
-            }
-
-            if (description.equals(throwable.getLocalizedMessage()) ||
-                    description.equals(throwable.getMessage())) {
-                description = "Exception raised during rendering: " + description;
-            }
-            recordThrowable(throwable);
-            mHaveExceptions = true;
-        }
-
-        addError(tag, description);
-    }
-
-    /**
-     * Record that the given exception was encountered during rendering
-     *
-     * @param throwable the exception that was raised
-     */
-    public void recordThrowable(@NonNull Throwable throwable) {
-        if (mTraces == null) {
-            mTraces = new ArrayList<Throwable>();
-        }
-        mTraces.add(throwable);
-    }
-
-    @Override
-    public void warning(String tag, String message, Object data) {
-        String description = describe(message);
-
-        boolean log = true;
-        if (TAG_RESOURCES_FORMAT.equals(tag)) {
-            if (description.equals("You must supply a layout_width attribute.")       //$NON-NLS-1$
-                || description.equals("You must supply a layout_height attribute.")) {//$NON-NLS-1$
-                tag = TAG_MISSING_DIMENSION;
-                log = false;
-            }
-        }
-
-        if (log) {
-            appendToIdeLog(null, IStatus.WARNING, description);
-        }
-
-        addWarning(tag, description);
-    }
-
-    @Override
-    public void fidelityWarning(String tag, String message, Throwable throwable, Object data) {
-        if (sIgnoredFidelityWarnings != null && sIgnoredFidelityWarnings.contains(message)) {
-            return;
-        }
-
-        String description = describe(message);
-        appendToIdeLog(throwable, IStatus.ERROR, description);
-
-        if (throwable != null) {
-            mHaveExceptions = true;
-        }
-
-        addFidelityWarning(tag, description);
-    }
-
-    /**
-     * Ignore the given render fidelity warning for the current session
-     *
-     * @param message the message to be ignored for this session
-     */
-    public static void ignoreFidelityWarning(String message) {
-        if (sIgnoredFidelityWarnings == null) {
-            sIgnoredFidelityWarnings = new HashSet<String>();
-        }
-        sIgnoredFidelityWarnings.add(message);
-    }
-
-    @NonNull
-    private String describe(@Nullable String message) {
-        if (message == null) {
-            return "";
-        } else {
-            return message;
-        }
-    }
-
-    private void addWarning(String tag, String description) {
-        if (mWarnings == null) {
-            mWarnings = new ArrayList<String>();
-        } else if (mWarnings.contains(description)) {
-            // Avoid duplicates
-            return;
-        }
-        mWarnings.add(description);
-        addTag(tag);
-    }
-
-    private void addError(String tag, String description) {
-        if (mErrors == null) {
-            mErrors = new ArrayList<String>();
-        } else if (mErrors.contains(description)) {
-            // Avoid duplicates
-            return;
-        }
-        mErrors.add(description);
-        addTag(tag);
-    }
-
-    private void addFidelityWarning(String tag, String description) {
-        if (mFidelityWarnings == null) {
-            mFidelityWarnings = new ArrayList<String>();
-        } else if (mFidelityWarnings.contains(description)) {
-            // Avoid duplicates
-            return;
-        }
-        mFidelityWarnings.add(description);
-        addTag(tag);
-    }
-
-    // ---- Tags ----
-
-    private void addTag(String tag) {
-        if (tag != null) {
-            if (mTags == null) {
-                mTags = new ArrayList<String>();
-            }
-            mTags.add(tag);
-        }
-    }
-
-    /**
-     * Returns true if the given tag prefix has been seen
-     *
-     * @param prefix the tag prefix to look for
-     * @return true iff any tags with the given prefix was seen during the render
-     */
-    public boolean seenTagPrefix(String prefix) {
-        if (mTags != null) {
-            for (String tag : mTags) {
-                if (tag.startsWith(prefix)) {
-                    return true;
-                }
-            }
-        }
-
-        return false;
-    }
-
-    /**
-     * Returns true if the given tag has been seen
-     *
-     * @param tag the tag to look for
-     * @return true iff the tag was seen during the render
-     */
-    public boolean seenTag(String tag) {
-        if (mTags != null) {
-            return mTags.contains(tag);
-        } else {
-            return false;
-        }
-    }
-
-    // Append the given message to the ADT log. Bypass the sandbox if necessary
-    // such that we can write to the log file.
-    private void appendToIdeLog(Throwable throwable, int severity, String description) {
-        boolean token = RenderSecurityManager.enterSafeRegion(mCredential);
-        try {
-            if (throwable != null) {
-                AdtPlugin.log(throwable, "%1$s: %2$s", mName, description);
-            } else {
-                AdtPlugin.log(severity, "%1$s: %2$s", mName, description);
-            }
-        } finally {
-            RenderSecurityManager.exitSafeRegion(token);
-        }
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/RenderPreview.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/RenderPreview.java
deleted file mode 100644
index 5621d5f..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/RenderPreview.java
+++ /dev/null
@@ -1,1333 +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.ide.eclipse.adt.internal.editors.layout.gle2;
-
-import static com.android.SdkConstants.ANDROID_STYLE_RESOURCE_PREFIX;
-import static com.android.SdkConstants.PREFIX_RESOURCE_REF;
-import static com.android.SdkConstants.STYLE_RESOURCE_PREFIX;
-import static com.android.ide.eclipse.adt.internal.editors.layout.configuration.Configuration.MASK_RENDERING;
-import static com.android.ide.eclipse.adt.internal.editors.layout.gle2.ImageUtils.SHADOW_SIZE;
-import static com.android.ide.eclipse.adt.internal.editors.layout.gle2.ImageUtils.SMALL_SHADOW_SIZE;
-import static com.android.ide.eclipse.adt.internal.editors.layout.gle2.RenderPreviewMode.DEFAULT;
-import static com.android.ide.eclipse.adt.internal.editors.layout.gle2.RenderPreviewMode.INCLUDES;
-
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-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.resources.ResourceFile;
-import com.android.ide.common.resources.ResourceRepository;
-import com.android.ide.common.resources.ResourceResolver;
-import com.android.ide.common.resources.configuration.FolderConfiguration;
-import com.android.ide.common.resources.configuration.ScreenOrientationQualifier;
-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.ide.eclipse.adt.internal.editors.descriptors.DocumentDescriptor;
-import com.android.ide.eclipse.adt.internal.editors.layout.configuration.Configuration;
-import com.android.ide.eclipse.adt.internal.editors.layout.configuration.ConfigurationChooser;
-import com.android.ide.eclipse.adt.internal.editors.layout.configuration.ConfigurationClient;
-import com.android.ide.eclipse.adt.internal.editors.layout.configuration.ConfigurationDescription;
-import com.android.ide.eclipse.adt.internal.editors.layout.configuration.Locale;
-import com.android.ide.eclipse.adt.internal.editors.layout.configuration.NestedConfiguration;
-import com.android.ide.eclipse.adt.internal.editors.layout.configuration.VaryingConfiguration;
-import com.android.ide.eclipse.adt.internal.editors.layout.gle2.IncludeFinder.Reference;
-import com.android.ide.eclipse.adt.internal.editors.uimodel.UiDocumentNode;
-import com.android.ide.eclipse.adt.internal.resources.ResourceHelper;
-import com.android.ide.eclipse.adt.internal.resources.manager.ProjectResources;
-import com.android.ide.eclipse.adt.internal.resources.manager.ResourceManager;
-import com.android.ide.eclipse.adt.internal.sdk.AndroidTargetData;
-import com.android.ide.eclipse.adt.internal.sdk.Sdk;
-import com.android.ide.eclipse.adt.io.IFileWrapper;
-import com.android.io.IAbstractFile;
-import com.android.resources.Density;
-import com.android.resources.ResourceType;
-import com.android.resources.ScreenOrientation;
-import com.android.sdklib.IAndroidTarget;
-import com.android.sdklib.devices.Device;
-import com.android.sdklib.devices.Screen;
-import com.android.sdklib.devices.State;
-import com.android.utils.SdkUtils;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.jobs.IJobChangeEvent;
-import org.eclipse.core.runtime.jobs.IJobChangeListener;
-import org.eclipse.core.runtime.jobs.Job;
-import org.eclipse.jface.dialogs.InputDialog;
-import org.eclipse.jface.window.Window;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.GC;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.graphics.ImageData;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.graphics.Region;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.ui.ISharedImages;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.progress.UIJob;
-import org.w3c.dom.Document;
-
-import java.awt.Graphics2D;
-import java.awt.image.BufferedImage;
-import java.io.File;
-import java.lang.ref.SoftReference;
-import java.util.Comparator;
-import java.util.Map;
-
-/**
- * Represents a preview rendering of a given configuration
- */
-public class RenderPreview implements IJobChangeListener {
-    /** Whether previews should use large shadows */
-    static final boolean LARGE_SHADOWS = false;
-
-    /**
-     * Still doesn't work; get exceptions from layoutlib:
-     * java.lang.IllegalStateException: After scene creation, #init() must be called
-     *   at com.android.layoutlib.bridge.impl.RenderAction.acquire(RenderAction.java:151)
-     * <p>
-     * TODO: Investigate.
-     */
-    private static final boolean RENDER_ASYNC = false;
-
-    /**
-     * Height of the toolbar shown over a preview during hover. Needs to be
-     * large enough to accommodate icons below.
-     */
-    private static final int HEADER_HEIGHT = 20;
-
-    /** Whether to dump out rendering failures of the previews to the log */
-    private static final boolean DUMP_RENDER_DIAGNOSTICS = false;
-
-    /** Extra error checking in debug mode */
-    private static final boolean DEBUG = false;
-
-    private static final Image EDIT_ICON;
-    private static final Image ZOOM_IN_ICON;
-    private static final Image ZOOM_OUT_ICON;
-    private static final Image CLOSE_ICON;
-    private static final int EDIT_ICON_WIDTH;
-    private static final int ZOOM_IN_ICON_WIDTH;
-    private static final int ZOOM_OUT_ICON_WIDTH;
-    private static final int CLOSE_ICON_WIDTH;
-    static {
-        ISharedImages sharedImages = PlatformUI.getWorkbench().getSharedImages();
-        IconFactory icons = IconFactory.getInstance();
-        CLOSE_ICON = sharedImages.getImage(ISharedImages.IMG_ETOOL_DELETE);
-        EDIT_ICON = icons.getIcon("editPreview");   //$NON-NLS-1$
-        ZOOM_IN_ICON = icons.getIcon("zoomplus");   //$NON-NLS-1$
-        ZOOM_OUT_ICON = icons.getIcon("zoomminus"); //$NON-NLS-1$
-        CLOSE_ICON_WIDTH = CLOSE_ICON.getImageData().width;
-        EDIT_ICON_WIDTH = EDIT_ICON.getImageData().width;
-        ZOOM_IN_ICON_WIDTH = ZOOM_IN_ICON.getImageData().width;
-        ZOOM_OUT_ICON_WIDTH = ZOOM_OUT_ICON.getImageData().width;
-    }
-
-    /** The configuration being previewed */
-    private @NonNull Configuration mConfiguration;
-
-    /** Configuration to use if we have an alternate input to be rendered */
-    private @NonNull Configuration mAlternateConfiguration;
-
-    /** The associated manager */
-    private final @NonNull RenderPreviewManager mManager;
-    private final @NonNull LayoutCanvas mCanvas;
-
-    private @NonNull SoftReference<ResourceResolver> mResourceResolver =
-            new SoftReference<ResourceResolver>(null);
-    private @Nullable Job mJob;
-    private @Nullable Image mThumbnail;
-    private @Nullable String mDisplayName;
-    private int mWidth;
-    private int mHeight;
-    private int mX;
-    private int mY;
-    private int mTitleHeight;
-    private double mScale = 1.0;
-    private double mAspectRatio;
-
-    /** If non null, points to a separate file containing the source */
-    private @Nullable IFile mAlternateInput;
-
-    /** If included within another layout, the name of that outer layout */
-    private @Nullable Reference mIncludedWithin;
-
-    /** Whether the mouse is actively hovering over this preview */
-    private boolean mActive;
-
-    /**
-     * Whether this preview cannot be rendered because of a model error - such
-     * as an invalid configuration, a missing resource, an error in the XML
-     * markup, etc. If non null, contains the error message (or a blank string
-     * if not known), and null if the render was successful.
-     */
-    private String mError;
-
-    /** Whether in the current layout, this preview is visible */
-    private boolean mVisible;
-
-    /** Whether the configuration has changed and needs to be refreshed the next time
-     * this preview made visible. This corresponds to the change flags in
-     * {@link ConfigurationClient}. */
-    private int mDirty;
-
-    /**
-     * Creates a new {@linkplain RenderPreview}
-     *
-     * @param manager the manager
-     * @param canvas canvas where preview is painted
-     * @param configuration the associated configuration
-     * @param width the initial width to use for the preview
-     * @param height the initial height to use for the preview
-     */
-    private RenderPreview(
-            @NonNull RenderPreviewManager manager,
-            @NonNull LayoutCanvas canvas,
-            @NonNull Configuration configuration) {
-        mManager = manager;
-        mCanvas = canvas;
-        mConfiguration = configuration;
-        updateSize();
-
-        // Should only attempt to create configurations for fully configured devices
-        assert mConfiguration.getDevice() != null
-                && mConfiguration.getDeviceState() != null
-                && mConfiguration.getLocale() != null
-                && mConfiguration.getTarget() != null
-                && mConfiguration.getTheme() != null
-                && mConfiguration.getFullConfig() != null
-                && mConfiguration.getFullConfig().getScreenSizeQualifier() != null :
-                    mConfiguration;
-    }
-
-    /**
-     * Sets the configuration to use for this preview
-     *
-     * @param configuration the new configuration
-     */
-    public void setConfiguration(@NonNull Configuration configuration) {
-        mConfiguration = configuration;
-    }
-
-    /**
-     * Gets the scale being applied to the thumbnail
-     *
-     * @return the scale being applied to the thumbnail
-     */
-    public double getScale() {
-        return mScale;
-    }
-
-    /**
-     * Sets the scale to apply to the thumbnail
-     *
-     * @param scale the factor to scale the thumbnail picture by
-     */
-    public void setScale(double scale) {
-        disposeThumbnail();
-        mScale = scale;
-    }
-
-    /**
-     * Returns the aspect ratio of this render preview
-     *
-     * @return the aspect ratio
-     */
-    public double getAspectRatio() {
-        return mAspectRatio;
-    }
-
-    /**
-     * Returns whether the preview is actively hovered
-     *
-     * @return whether the mouse is hovering over the preview
-     */
-    public boolean isActive() {
-        return mActive;
-    }
-
-    /**
-     * Sets whether the preview is actively hovered
-     *
-     * @param active if the mouse is hovering over the preview
-     */
-    public void setActive(boolean active) {
-        mActive = active;
-    }
-
-    /**
-     * Returns whether the preview is visible. Previews that are off
-     * screen are typically marked invisible during layout, which means we don't
-     * have to expend effort computing preview thumbnails etc
-     *
-     * @return true if the preview is visible
-     */
-    public boolean isVisible() {
-        return mVisible;
-    }
-
-    /**
-     * Returns whether this preview represents a forked layout
-     *
-     * @return true if this preview represents a separate file
-     */
-    public boolean isForked() {
-        return mAlternateInput != null || mIncludedWithin != null;
-    }
-
-    /**
-     * Returns the file to be used for this preview, or null if this is not a
-     * forked layout meaning that the file is the one used in the chooser
-     *
-     * @return the file or null for non-forked layouts
-     */
-    @Nullable
-    public IFile getAlternateInput() {
-        if (mAlternateInput != null) {
-            return mAlternateInput;
-        } else if (mIncludedWithin != null) {
-            return mIncludedWithin.getFile();
-        }
-
-        return null;
-    }
-
-    /**
-     * Returns the area of this render preview, PRIOR to scaling
-     *
-     * @return the area (width times height without scaling)
-     */
-    int getArea() {
-        return mWidth * mHeight;
-    }
-
-    /**
-     * Sets whether the preview is visible. Previews that are off
-     * screen are typically marked invisible during layout, which means we don't
-     * have to expend effort computing preview thumbnails etc
-     *
-     * @param visible whether this preview is visible
-     */
-    public void setVisible(boolean visible) {
-        if (visible != mVisible) {
-            mVisible = visible;
-            if (mVisible) {
-                if (mDirty != 0) {
-                    // Just made the render preview visible:
-                    configurationChanged(mDirty); // schedules render
-                } else {
-                    updateForkStatus();
-                    mManager.scheduleRender(this);
-                }
-            } else {
-                dispose();
-            }
-        }
-    }
-
-    /**
-     * Sets the layout position relative to the top left corner of the preview
-     * area, in control coordinates
-     */
-    void setPosition(int x, int y) {
-        mX = x;
-        mY = y;
-    }
-
-    /**
-     * Gets the layout X position relative to the top left corner of the preview
-     * area, in control coordinates
-     */
-    int getX() {
-        return mX;
-    }
-
-    /**
-     * Gets the layout Y position relative to the top left corner of the preview
-     * area, in control coordinates
-     */
-    int getY() {
-        return mY;
-    }
-
-    /** Determine whether this configuration has a better match in a different layout file */
-    private void updateForkStatus() {
-        ConfigurationChooser chooser = mManager.getChooser();
-        FolderConfiguration config = mConfiguration.getFullConfig();
-        if (mAlternateInput != null && chooser.isBestMatchFor(mAlternateInput, config)) {
-            return;
-        }
-
-        mAlternateInput = null;
-        IFile editedFile = chooser.getEditedFile();
-        if (editedFile != null) {
-            if (!chooser.isBestMatchFor(editedFile, config)) {
-                ProjectResources resources = chooser.getResources();
-                if (resources != null) {
-                    ResourceFile best = resources.getMatchingFile(editedFile.getName(),
-                            ResourceType.LAYOUT, config);
-                    if (best != null) {
-                        IAbstractFile file = best.getFile();
-                        if (file instanceof IFileWrapper) {
-                            mAlternateInput = ((IFileWrapper) file).getIFile();
-                        } else if (file instanceof File) {
-                            mAlternateInput = AdtUtils.fileToIFile(((File) file));
-                        }
-                    }
-                }
-                if (mAlternateInput != null) {
-                    mAlternateConfiguration = Configuration.create(mConfiguration,
-                            mAlternateInput);
-                }
-            }
-        }
-    }
-
-    /**
-     * Creates a new {@linkplain RenderPreview}
-     *
-     * @param manager the manager
-     * @param configuration the associated configuration
-     * @return a new configuration
-     */
-    @NonNull
-    public static RenderPreview create(
-            @NonNull RenderPreviewManager manager,
-            @NonNull Configuration configuration) {
-        LayoutCanvas canvas = manager.getCanvas();
-        return new RenderPreview(manager, canvas, configuration);
-    }
-
-    /**
-     * Throws away this preview: cancels any pending rendering jobs and disposes
-     * of image resources etc
-     */
-    public void dispose() {
-        disposeThumbnail();
-
-        if (mJob != null) {
-            mJob.cancel();
-            mJob = null;
-        }
-    }
-
-    /** Disposes the thumbnail rendering. */
-    void disposeThumbnail() {
-        if (mThumbnail != null) {
-            mThumbnail.dispose();
-            mThumbnail = null;
-        }
-    }
-
-    /**
-     * Returns the display name of this preview
-     *
-     * @return the name of the preview
-     */
-    @NonNull
-    public String getDisplayName() {
-        if (mDisplayName == null) {
-            String displayName = getConfiguration().getDisplayName();
-            if (displayName == null) {
-                // No display name: this must be the configuration used by default
-                // for the view which is originally displayed (before adding thumbnails),
-                // and you've switched away to something else; now we need to display a name
-                // for this original configuration. For now, just call it "Original"
-                return "Original";
-            }
-
-            return displayName;
-        }
-
-        return mDisplayName;
-    }
-
-    /**
-     * Sets the display name of this preview. By default, the display name is
-     * the display name of the configuration, but it can be overridden by calling
-     * this setter (which only sets the preview name, without editing the configuration.)
-     *
-     * @param displayName the new display name
-     */
-    public void setDisplayName(@NonNull String displayName) {
-        mDisplayName = displayName;
-    }
-
-    /**
-     * Sets an inclusion context to use for this layout, if any. This will render
-     * the configuration preview as the outer layout with the current layout
-     * embedded within.
-     *
-     * @param includedWithin a reference to a layout which includes this one
-     */
-    public void setIncludedWithin(Reference includedWithin) {
-        mIncludedWithin = includedWithin;
-    }
-
-    /**
-     * Request a new render after the given delay
-     *
-     * @param delay the delay to wait before starting the render job
-     */
-    public void render(long delay) {
-        Job job = mJob;
-        if (job != null) {
-            job.cancel();
-        }
-        if (RENDER_ASYNC) {
-            job = new AsyncRenderJob();
-        } else {
-            job = new RenderJob();
-        }
-        job.schedule(delay);
-        job.addJobChangeListener(this);
-        mJob = job;
-    }
-
-    /** Render immediately */
-    private void renderSync() {
-        GraphicalEditorPart editor = mCanvas.getEditorDelegate().getGraphicalEditor();
-        if (editor.getReadyLayoutLib(false /*displayError*/) == null) {
-            // Don't attempt to render when there is no ready layout library: most likely
-            // the targets are loading/reloading.
-            return;
-        }
-
-        disposeThumbnail();
-
-        Configuration configuration =
-                mAlternateInput != null && mAlternateConfiguration != null
-                ? mAlternateConfiguration : mConfiguration;
-        ResourceResolver resolver = getResourceResolver(configuration);
-        RenderService renderService = RenderService.create(editor, configuration, resolver);
-
-        if (mIncludedWithin != null) {
-            renderService.setIncludedWithin(mIncludedWithin);
-        }
-
-        if (mAlternateInput != null) {
-            IAndroidTarget target = editor.getRenderingTarget();
-            AndroidTargetData data = null;
-            if (target != null) {
-                Sdk sdk = Sdk.getCurrent();
-                if (sdk != null) {
-                    data = sdk.getTargetData(target);
-                }
-            }
-
-            // Construct UI model from XML
-            DocumentDescriptor documentDescriptor;
-            if (data == null) {
-                documentDescriptor = new DocumentDescriptor("temp", null);//$NON-NLS-1$
-            } else {
-                documentDescriptor = data.getLayoutDescriptors().getDescriptor();
-            }
-            UiDocumentNode model = (UiDocumentNode) documentDescriptor.createUiNode();
-            model.setEditor(mCanvas.getEditorDelegate().getEditor());
-            model.setUnknownDescriptorProvider(editor.getModel().getUnknownDescriptorProvider());
-
-            Document document = DomUtilities.getDocument(mAlternateInput);
-            if (document == null) {
-                mError = "No document";
-                createErrorThumbnail();
-                return;
-            }
-            model.loadFromXmlNode(document);
-            renderService.setModel(model);
-        } else {
-            renderService.setModel(editor.getModel());
-        }
-        RenderLogger log = editor.createRenderLogger(getDisplayName());
-        renderService.setLog(log);
-        RenderSession session = renderService.createRenderSession();
-        Result render = session.render(1000);
-
-        if (DUMP_RENDER_DIAGNOSTICS) {
-            if (log.hasProblems() || !render.isSuccess()) {
-                AdtPlugin.log(IStatus.ERROR, "Found problems rendering preview "
-                        + getDisplayName() + ": "
-                        + render.getErrorMessage() + " : "
-                        + log.getProblems(false));
-                Throwable exception = render.getException();
-                if (exception != null) {
-                    AdtPlugin.log(exception, "Failure rendering preview " + getDisplayName());
-                }
-            }
-        }
-
-        if (render.isSuccess()) {
-            mError = null;
-        } else {
-            mError = render.getErrorMessage();
-            if (mError == null) {
-                mError = "";
-            }
-        }
-
-        if (render.getStatus() == Status.ERROR_TIMEOUT) {
-            // TODO: Special handling? schedule update again later
-            return;
-        }
-        if (render.isSuccess()) {
-            BufferedImage image = session.getImage();
-            if (image != null) {
-                createThumbnail(image);
-            }
-        }
-
-        if (mError != null) {
-            createErrorThumbnail();
-        }
-    }
-
-    private ResourceResolver getResourceResolver(Configuration configuration) {
-        ResourceResolver resourceResolver = mResourceResolver.get();
-        if (resourceResolver != null) {
-            return resourceResolver;
-        }
-
-        GraphicalEditorPart graphicalEditor = mCanvas.getEditorDelegate().getGraphicalEditor();
-        String theme = configuration.getTheme();
-        if (theme == null) {
-            return null;
-        }
-
-        Map<ResourceType, Map<String, ResourceValue>> configuredFrameworkRes = null;
-        Map<ResourceType, Map<String, ResourceValue>> configuredProjectRes = null;
-
-        FolderConfiguration config = configuration.getFullConfig();
-        IAndroidTarget target = graphicalEditor.getRenderingTarget();
-        ResourceRepository frameworkRes = null;
-        if (target != null) {
-            Sdk sdk = Sdk.getCurrent();
-            if (sdk == null) {
-                return null;
-            }
-            AndroidTargetData data = sdk.getTargetData(target);
-
-            if (data != null) {
-                // TODO: SHARE if possible
-                frameworkRes = data.getFrameworkResources();
-                configuredFrameworkRes = frameworkRes.getConfiguredResources(config);
-            } else {
-                return null;
-            }
-        } else {
-            return null;
-        }
-        assert configuredFrameworkRes != null;
-
-
-        // get the resources of the file's project.
-        ProjectResources projectRes = ResourceManager.getInstance().getProjectResources(
-                graphicalEditor.getProject());
-        configuredProjectRes = projectRes.getConfiguredResources(config);
-
-        if (!theme.startsWith(PREFIX_RESOURCE_REF)) {
-            if (frameworkRes.hasResourceItem(ANDROID_STYLE_RESOURCE_PREFIX + theme)) {
-                theme = ANDROID_STYLE_RESOURCE_PREFIX + theme;
-            } else {
-                theme = STYLE_RESOURCE_PREFIX + theme;
-            }
-        }
-
-        resourceResolver = ResourceResolver.create(
-                configuredProjectRes, configuredFrameworkRes,
-                ResourceHelper.styleToTheme(theme),
-                ResourceHelper.isProjectStyle(theme));
-        mResourceResolver = new SoftReference<ResourceResolver>(resourceResolver);
-        return resourceResolver;
-    }
-
-    /**
-     * Sets the new image of the preview and generates a thumbnail
-     *
-     * @param image the full size image
-     */
-    void createThumbnail(BufferedImage image) {
-        if (image == null) {
-            mThumbnail = null;
-            return;
-        }
-
-        ImageOverlay imageOverlay = mCanvas.getImageOverlay();
-        boolean drawShadows = imageOverlay == null || imageOverlay.getShowDropShadow();
-        double scale = getWidth() / (double) image.getWidth();
-        int shadowSize;
-        if (LARGE_SHADOWS) {
-            shadowSize = drawShadows ? SHADOW_SIZE : 0;
-        } else {
-            shadowSize = drawShadows ? SMALL_SHADOW_SIZE : 0;
-        }
-        if (scale < 1.0) {
-            if (LARGE_SHADOWS) {
-                image = ImageUtils.scale(image, scale, scale,
-                        shadowSize, shadowSize);
-                if (drawShadows) {
-                    ImageUtils.drawRectangleShadow(image, 0, 0,
-                            image.getWidth() - shadowSize,
-                            image.getHeight() - shadowSize);
-                }
-            } else {
-                image = ImageUtils.scale(image, scale, scale,
-                        shadowSize, shadowSize);
-                if (drawShadows) {
-                    ImageUtils.drawSmallRectangleShadow(image, 0, 0,
-                            image.getWidth() - shadowSize,
-                            image.getHeight() - shadowSize);
-                }
-            }
-        }
-
-        mThumbnail = SwtUtils.convertToSwt(mCanvas.getDisplay(), image,
-                true /* transferAlpha */, -1);
-    }
-
-    void createErrorThumbnail() {
-        int shadowSize = LARGE_SHADOWS ? SHADOW_SIZE : SMALL_SHADOW_SIZE;
-        int width = getWidth();
-        int height = getHeight();
-        BufferedImage image = new BufferedImage(width + shadowSize, height + shadowSize,
-                BufferedImage.TYPE_INT_ARGB);
-
-        Graphics2D g = image.createGraphics();
-        g.setColor(new java.awt.Color(0xfffbfcc6));
-        g.fillRect(0, 0, width, height);
-
-        g.dispose();
-
-        ImageOverlay imageOverlay = mCanvas.getImageOverlay();
-        boolean drawShadows = imageOverlay == null || imageOverlay.getShowDropShadow();
-        if (drawShadows) {
-            if (LARGE_SHADOWS) {
-                ImageUtils.drawRectangleShadow(image, 0, 0,
-                        image.getWidth() - SHADOW_SIZE,
-                        image.getHeight() - SHADOW_SIZE);
-            } else {
-                ImageUtils.drawSmallRectangleShadow(image, 0, 0,
-                        image.getWidth() - SMALL_SHADOW_SIZE,
-                        image.getHeight() - SMALL_SHADOW_SIZE);
-            }
-        }
-
-        mThumbnail = SwtUtils.convertToSwt(mCanvas.getDisplay(), image,
-                true /* transferAlpha */, -1);
-    }
-
-    private static double getScale(int width, int height) {
-        int maxWidth = RenderPreviewManager.getMaxWidth();
-        int maxHeight = RenderPreviewManager.getMaxHeight();
-        if (width > 0 && height > 0
-                && (width > maxWidth || height > maxHeight)) {
-            if (width >= height) { // landscape
-                return maxWidth / (double) width;
-            } else { // portrait
-                return maxHeight / (double) height;
-            }
-        }
-
-        return 1.0;
-    }
-
-    /**
-     * Returns the width of the preview, in pixels
-     *
-     * @return the width in pixels
-     */
-    public int getWidth() {
-        return (int) (mWidth * mScale * RenderPreviewManager.getScale());
-    }
-
-    /**
-     * Returns the height of the preview, in pixels
-     *
-     * @return the height in pixels
-     */
-    public int getHeight() {
-        return (int) (mHeight * mScale * RenderPreviewManager.getScale());
-    }
-
-    /**
-     * Handles clicks within the preview (x and y are positions relative within the
-     * preview
-     *
-     * @param x the x coordinate within the preview where the click occurred
-     * @param y the y coordinate within the preview where the click occurred
-     * @return true if this preview handled (and therefore consumed) the click
-     */
-    public boolean click(int x, int y) {
-        if (y >= mTitleHeight && y < mTitleHeight + HEADER_HEIGHT) {
-            int left = 0;
-            left += CLOSE_ICON_WIDTH;
-            if (x <= left) {
-                // Delete
-                mManager.deletePreview(this);
-                return true;
-            }
-            left += ZOOM_IN_ICON_WIDTH;
-            if (x <= left) {
-                // Zoom in
-                mScale = mScale * (1 / 0.5);
-                if (Math.abs(mScale-1.0) < 0.0001) {
-                    mScale = 1.0;
-                }
-
-                render(0);
-                mManager.layout(true);
-                mCanvas.redraw();
-                return true;
-            }
-            left += ZOOM_OUT_ICON_WIDTH;
-            if (x <= left) {
-                // Zoom out
-                mScale = mScale * (0.5 / 1);
-                if (Math.abs(mScale-1.0) < 0.0001) {
-                    mScale = 1.0;
-                }
-                render(0);
-
-                mManager.layout(true);
-                mCanvas.redraw();
-                return true;
-            }
-            left += EDIT_ICON_WIDTH;
-            if (x <= left) {
-                // Edit. For now, just rename
-                InputDialog d = new InputDialog(
-                        AdtPlugin.getShell(),
-                        "Rename Preview",  // title
-                        "Name:",
-                        getDisplayName(),
-                        null);
-                if (d.open() == Window.OK) {
-                    String newName = d.getValue();
-                    mConfiguration.setDisplayName(newName);
-                    if (mDescription != null) {
-                        mManager.rename(mDescription, newName);
-                    }
-                    mCanvas.redraw();
-                }
-
-                return true;
-            }
-
-            // Clicked anywhere else on header
-            // Perhaps open Edit dialog here?
-        }
-
-        mManager.switchTo(this);
-        return true;
-    }
-
-    /**
-     * Paints the preview at the given x/y position
-     *
-     * @param gc the graphics context to paint it into
-     * @param x the x coordinate to paint the preview at
-     * @param y the y coordinate to paint the preview at
-     */
-    void paint(GC gc, int x, int y) {
-        mTitleHeight = paintTitle(gc, x, y, true /*showFile*/);
-        y += mTitleHeight;
-        y += 2;
-
-        int width = getWidth();
-        int height = getHeight();
-        if (mThumbnail != null && mError == null) {
-            gc.drawImage(mThumbnail, x, y);
-
-            if (mActive) {
-                int oldWidth = gc.getLineWidth();
-                gc.setLineWidth(3);
-                gc.setForeground(gc.getDevice().getSystemColor(SWT.COLOR_LIST_SELECTION));
-                gc.drawRectangle(x - 1, y - 1, width + 2, height + 2);
-                gc.setLineWidth(oldWidth);
-            }
-        } else if (mError != null) {
-            if (mThumbnail != null) {
-                gc.drawImage(mThumbnail, x, y);
-            } else {
-                gc.setBackground(gc.getDevice().getSystemColor(SWT.COLOR_WIDGET_BORDER));
-                gc.drawRectangle(x, y, width, height);
-            }
-
-            gc.setClipping(x, y, width, height);
-            Image icon = IconFactory.getInstance().getIcon("renderError"); //$NON-NLS-1$
-            ImageData data = icon.getImageData();
-            int prevAlpha = gc.getAlpha();
-            int alpha = 96;
-            if (mThumbnail != null) {
-                alpha -= 32;
-            }
-            gc.setAlpha(alpha);
-            gc.drawImage(icon, x + (width - data.width) / 2, y + (height - data.height) / 2);
-
-            String msg = mError;
-            Density density = mConfiguration.getDensity();
-            if (density == Density.TV || density == Density.LOW) {
-                msg = "Broken rendering library; unsupported DPI. Try using the SDK manager " +
-                        "to get updated layout libraries.";
-            }
-            int charWidth = gc.getFontMetrics().getAverageCharWidth();
-            int charsPerLine = (width - 10) / charWidth;
-            msg = SdkUtils.wrap(msg, charsPerLine, null);
-            gc.setAlpha(255);
-            gc.setForeground(gc.getDevice().getSystemColor(SWT.COLOR_BLACK));
-            gc.drawText(msg, x + 5, y + HEADER_HEIGHT, true);
-            gc.setAlpha(prevAlpha);
-            gc.setClipping((Region) null);
-        } else {
-            gc.setBackground(gc.getDevice().getSystemColor(SWT.COLOR_WIDGET_BORDER));
-            gc.drawRectangle(x, y, width, height);
-
-            Image icon = IconFactory.getInstance().getIcon("refreshPreview"); //$NON-NLS-1$
-            ImageData data = icon.getImageData();
-            int prevAlpha = gc.getAlpha();
-            gc.setAlpha(96);
-            gc.drawImage(icon, x + (width - data.width) / 2,
-                    y + (height - data.height) / 2);
-            gc.setAlpha(prevAlpha);
-        }
-
-        if (mActive) {
-            int left = x ;
-            int prevAlpha = gc.getAlpha();
-            gc.setAlpha(208);
-            Color bg = mCanvas.getDisplay().getSystemColor(SWT.COLOR_WHITE);
-            gc.setBackground(bg);
-            gc.fillRectangle(left, y, x + width - left, HEADER_HEIGHT);
-            gc.setAlpha(prevAlpha);
-
-            y += 2;
-
-            // Paint icons
-            gc.drawImage(CLOSE_ICON, left, y);
-            left += CLOSE_ICON_WIDTH;
-
-            gc.drawImage(ZOOM_IN_ICON, left, y);
-            left += ZOOM_IN_ICON_WIDTH;
-
-            gc.drawImage(ZOOM_OUT_ICON, left, y);
-            left += ZOOM_OUT_ICON_WIDTH;
-
-            gc.drawImage(EDIT_ICON, left, y);
-            left += EDIT_ICON_WIDTH;
-        }
-    }
-
-    /**
-     * Paints the preview title at the given position (and returns the required
-     * height)
-     *
-     * @param gc the graphics context to paint into
-     * @param x the left edge of the preview rectangle
-     * @param y the top edge of the preview rectangle
-     */
-    private int paintTitle(GC gc, int x, int y, boolean showFile) {
-        String displayName = getDisplayName();
-        return paintTitle(gc, x, y, showFile, displayName);
-    }
-
-    /**
-     * Paints the preview title at the given position (and returns the required
-     * height)
-     *
-     * @param gc the graphics context to paint into
-     * @param x the left edge of the preview rectangle
-     * @param y the top edge of the preview rectangle
-     * @param displayName the title string to be used
-     */
-    int paintTitle(GC gc, int x, int y, boolean showFile, String displayName) {
-        int titleHeight = 0;
-
-        if (showFile && mIncludedWithin != null) {
-            if (mManager.getMode() != INCLUDES) {
-                displayName = "<include>";
-            } else {
-                // Skip: just paint footer instead
-                displayName = null;
-            }
-        }
-
-        int width = getWidth();
-        int labelTop = y + 1;
-        gc.setClipping(x, labelTop, width, 100);
-
-        // Use font height rather than extent height since we want two adjacent
-        // previews (which may have different display names and therefore end
-        // up with slightly different extent heights) to have identical title
-        // heights such that they are aligned identically
-        int fontHeight = gc.getFontMetrics().getHeight();
-
-        if (displayName != null && displayName.length() > 0) {
-            gc.setForeground(gc.getDevice().getSystemColor(SWT.COLOR_WHITE));
-            Point extent = gc.textExtent(displayName);
-            int labelLeft = Math.max(x, x + (width - extent.x) / 2);
-            Image icon = null;
-            Locale locale = mConfiguration.getLocale();
-            if (locale != null && (locale.hasLanguage() || locale.hasRegion())
-                    && (!(mConfiguration instanceof NestedConfiguration)
-                            || ((NestedConfiguration) mConfiguration).isOverridingLocale())) {
-                icon = locale.getFlagImage();
-            }
-
-            if (icon != null) {
-                int flagWidth = icon.getImageData().width;
-                int flagHeight = icon.getImageData().height;
-                labelLeft = Math.max(x + flagWidth / 2, labelLeft);
-                gc.drawImage(icon, labelLeft - flagWidth / 2 - 1, labelTop);
-                labelLeft += flagWidth / 2 + 1;
-                gc.drawText(displayName, labelLeft,
-                        labelTop - (extent.y - flagHeight) / 2, true);
-            } else {
-                gc.drawText(displayName, labelLeft, labelTop, true);
-            }
-
-            labelTop += extent.y;
-            titleHeight += fontHeight;
-        }
-
-        if (showFile && (mAlternateInput != null || mIncludedWithin != null)) {
-            // Draw file flag, and parent folder name
-            IFile file = mAlternateInput != null
-                    ? mAlternateInput : mIncludedWithin.getFile();
-            String fileName = file.getParent().getName() + File.separator
-                    + file.getName();
-            Point extent = gc.textExtent(fileName);
-            Image icon = IconFactory.getInstance().getIcon("android_file"); //$NON-NLS-1$
-            int flagWidth = icon.getImageData().width;
-            int flagHeight = icon.getImageData().height;
-
-            int labelLeft = Math.max(x, x + (width - extent.x - flagWidth - 1) / 2);
-
-            gc.drawImage(icon, labelLeft, labelTop);
-
-            gc.setForeground(gc.getDevice().getSystemColor(SWT.COLOR_GRAY));
-            labelLeft += flagWidth + 1;
-            labelTop -= (extent.y - flagHeight) / 2;
-            gc.drawText(fileName, labelLeft, labelTop, true);
-
-            titleHeight += Math.max(titleHeight, icon.getImageData().height);
-        }
-
-        gc.setClipping((Region) null);
-
-        return titleHeight;
-    }
-
-    /**
-     * Notifies that the preview's configuration has changed.
-     *
-     * @param flags the change flags, a bitmask corresponding to the
-     *            {@code CHANGE_} constants in {@link ConfigurationClient}
-     */
-    public void configurationChanged(int flags) {
-        if (!mVisible) {
-            mDirty |= flags;
-            return;
-        }
-
-        if ((flags & MASK_RENDERING) != 0) {
-            mResourceResolver.clear();
-            // Handle inheritance
-            mConfiguration.syncFolderConfig();
-            updateForkStatus();
-            updateSize();
-        }
-
-        // Sanity check to make sure things are working correctly
-        if (DEBUG) {
-            RenderPreviewMode mode = mManager.getMode();
-            if (mode == DEFAULT) {
-                assert mConfiguration instanceof VaryingConfiguration;
-                VaryingConfiguration config = (VaryingConfiguration) mConfiguration;
-                int alternateFlags = config.getAlternateFlags();
-                switch (alternateFlags) {
-                    case Configuration.CFG_DEVICE_STATE: {
-                        State configState = config.getDeviceState();
-                        State chooserState = mManager.getChooser().getConfiguration()
-                                .getDeviceState();
-                        assert configState != null && chooserState != null;
-                        assert !configState.getName().equals(chooserState.getName())
-                                : configState.toString() + ':' + chooserState;
-
-                        Device configDevice = config.getDevice();
-                        Device chooserDevice = mManager.getChooser().getConfiguration()
-                                .getDevice();
-                        assert configDevice != null && chooserDevice != null;
-                        assert configDevice == chooserDevice
-                                : configDevice.toString() + ':' + chooserDevice;
-
-                        break;
-                    }
-                    case Configuration.CFG_DEVICE: {
-                        Device configDevice = config.getDevice();
-                        Device chooserDevice = mManager.getChooser().getConfiguration()
-                                .getDevice();
-                        assert configDevice != null && chooserDevice != null;
-                        assert configDevice != chooserDevice
-                                : configDevice.toString() + ':' + chooserDevice;
-
-                        State configState = config.getDeviceState();
-                        State chooserState = mManager.getChooser().getConfiguration()
-                                .getDeviceState();
-                        assert configState != null && chooserState != null;
-                        assert configState.getName().equals(chooserState.getName())
-                                : configState.toString() + ':' + chooserState;
-
-                        break;
-                    }
-                    case Configuration.CFG_LOCALE: {
-                        Locale configLocale = config.getLocale();
-                        Locale chooserLocale = mManager.getChooser().getConfiguration()
-                                .getLocale();
-                        assert configLocale != null && chooserLocale != null;
-                        assert configLocale != chooserLocale
-                                : configLocale.toString() + ':' + chooserLocale;
-                        break;
-                    }
-                    default: {
-                        // Some other type of override I didn't anticipate
-                        assert false : alternateFlags;
-                    }
-                }
-            }
-        }
-
-        mDirty = 0;
-        mManager.scheduleRender(this);
-    }
-
-    private void updateSize() {
-        Device device = mConfiguration.getDevice();
-        if (device == null) {
-            return;
-        }
-        Screen screen = device.getDefaultHardware().getScreen();
-        if (screen == null) {
-            return;
-        }
-
-        FolderConfiguration folderConfig = mConfiguration.getFullConfig();
-        ScreenOrientationQualifier qualifier = folderConfig.getScreenOrientationQualifier();
-        ScreenOrientation orientation = qualifier == null
-                ? ScreenOrientation.PORTRAIT : qualifier.getValue();
-
-        // compute width and height to take orientation into account.
-        int x = screen.getXDimension();
-        int y = screen.getYDimension();
-        int screenWidth, screenHeight;
-
-        if (x > y) {
-            if (orientation == ScreenOrientation.LANDSCAPE) {
-                screenWidth = x;
-                screenHeight = y;
-            } else {
-                screenWidth = y;
-                screenHeight = x;
-            }
-        } else {
-            if (orientation == ScreenOrientation.LANDSCAPE) {
-                screenWidth = y;
-                screenHeight = x;
-            } else {
-                screenWidth = x;
-                screenHeight = y;
-            }
-        }
-
-        int width = RenderPreviewManager.getMaxWidth();
-        int height = RenderPreviewManager.getMaxHeight();
-        if (screenWidth > 0) {
-            double scale = getScale(screenWidth, screenHeight);
-            width = (int) (screenWidth * scale);
-            height = (int) (screenHeight * scale);
-        }
-
-        if (width != mWidth || height != mHeight) {
-            mWidth = width;
-            mHeight = height;
-
-            Image thumbnail = mThumbnail;
-            mThumbnail = null;
-            if (thumbnail != null) {
-                thumbnail.dispose();
-            }
-            if (mHeight != 0) {
-                mAspectRatio = mWidth / (double) mHeight;
-            }
-        }
-    }
-
-    /**
-     * Returns the configuration associated with this preview
-     *
-     * @return the configuration
-     */
-    @NonNull
-    public Configuration getConfiguration() {
-        return mConfiguration;
-    }
-
-    // ---- Implements IJobChangeListener ----
-
-    @Override
-    public void aboutToRun(IJobChangeEvent event) {
-    }
-
-    @Override
-    public void awake(IJobChangeEvent event) {
-    }
-
-    @Override
-    public void done(IJobChangeEvent event) {
-        mJob = null;
-    }
-
-    @Override
-    public void running(IJobChangeEvent event) {
-    }
-
-    @Override
-    public void scheduled(IJobChangeEvent event) {
-    }
-
-    @Override
-    public void sleeping(IJobChangeEvent event) {
-    }
-
-    // ---- Delayed Rendering ----
-
-    private final class RenderJob extends UIJob {
-        public RenderJob() {
-            super("RenderPreview");
-            setSystem(true);
-            setUser(false);
-        }
-
-        @Override
-        public IStatus runInUIThread(IProgressMonitor monitor) {
-            mJob = null;
-            if (!mCanvas.isDisposed()) {
-                renderSync();
-                mCanvas.redraw();
-                return org.eclipse.core.runtime.Status.OK_STATUS;
-            }
-
-            return org.eclipse.core.runtime.Status.CANCEL_STATUS;
-        }
-
-        @Override
-        public Display getDisplay() {
-            if (mCanvas.isDisposed()) {
-                return null;
-            }
-            return mCanvas.getDisplay();
-        }
-    }
-
-    private final class AsyncRenderJob extends Job {
-        public AsyncRenderJob() {
-            super("RenderPreview");
-            setSystem(true);
-            setUser(false);
-        }
-
-        @Override
-        protected IStatus run(IProgressMonitor monitor) {
-            mJob = null;
-
-            if (mCanvas.isDisposed()) {
-                return org.eclipse.core.runtime.Status.CANCEL_STATUS;
-            }
-
-            renderSync();
-
-            // Update display
-            mCanvas.getDisplay().asyncExec(new Runnable() {
-                @Override
-                public void run() {
-                    mCanvas.redraw();
-                }
-            });
-
-            return org.eclipse.core.runtime.Status.OK_STATUS;
-        }
-    }
-
-    /**
-     * Sets the input file to use for rendering. If not set, this will just be
-     * the same file as the configuration chooser. This is used to render other
-     * layouts, such as variations of the currently edited layout, which are
-     * not kept in sync with the main layout.
-     *
-     * @param file the file to set as input
-     */
-    public void setAlternateInput(@Nullable IFile file) {
-        mAlternateInput = file;
-    }
-
-    /** Corresponding description for this preview if it is a manually added preview */
-    private @Nullable ConfigurationDescription mDescription;
-
-    /**
-     * Sets the description of this preview, if this preview is a manually added preview
-     *
-     * @param description the description of this preview
-     */
-    public void setDescription(@Nullable ConfigurationDescription description) {
-        mDescription = description;
-    }
-
-    /**
-     * Returns the description of this preview, if this preview is a manually added preview
-     *
-     * @return the description
-     */
-    @Nullable
-    public ConfigurationDescription getDescription() {
-        return mDescription;
-    }
-
-    @Override
-    public String toString() {
-        return getDisplayName() + ':' + mConfiguration;
-    }
-
-    /** Sorts render previews into increasing aspect ratio order */
-    static Comparator<RenderPreview> INCREASING_ASPECT_RATIO = new Comparator<RenderPreview>() {
-        @Override
-        public int compare(RenderPreview preview1, RenderPreview preview2) {
-            return (int) Math.signum(preview1.mAspectRatio - preview2.mAspectRatio);
-        }
-    };
-    /** Sorts render previews into visual order: row by row, column by column */
-    static Comparator<RenderPreview> VISUAL_ORDER = new Comparator<RenderPreview>() {
-        @Override
-        public int compare(RenderPreview preview1, RenderPreview preview2) {
-            int delta = preview1.mY - preview2.mY;
-            if (delta == 0) {
-                delta = preview1.mX - preview2.mX;
-            }
-            return delta;
-        }
-    };
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/RenderPreviewList.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/RenderPreviewList.java
deleted file mode 100644
index 2bcdba3..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/RenderPreviewList.java
+++ /dev/null
@@ -1,222 +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.ide.eclipse.adt.internal.editors.layout.gle2;
-
-import com.android.annotations.NonNull;
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.ide.eclipse.adt.AdtUtils;
-import com.android.ide.eclipse.adt.internal.editors.formatting.EclipseXmlPrettyPrinter;
-import com.android.ide.eclipse.adt.internal.editors.layout.configuration.Configuration;
-import com.android.ide.eclipse.adt.internal.editors.layout.configuration.ConfigurationChooser;
-import com.android.ide.eclipse.adt.internal.editors.layout.configuration.ConfigurationDescription;
-import com.android.sdklib.devices.Device;
-import com.google.common.base.Charsets;
-import com.google.common.collect.Lists;
-import com.google.common.io.Files;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.QualifiedName;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-
-import java.io.File;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
-
-/** A list of render previews */
-class RenderPreviewList {
-    /** Name of file saved in project directory storing previews */
-    private static final String PREVIEW_FILE_NAME = "previews.xml"; //$NON-NLS-1$
-
-    /** Qualified name for the per-project persistent property include-map */
-    private final static QualifiedName PREVIEW_LIST = new QualifiedName(AdtPlugin.PLUGIN_ID,
-            "previewlist");//$NON-NLS-1$
-
-    private final IProject mProject;
-    private final List<ConfigurationDescription> mList = Lists.newArrayList();
-
-    private RenderPreviewList(@NonNull IProject project) {
-        mProject = project;
-    }
-
-    /**
-     * Returns the {@link RenderPreviewList} for the given project
-     *
-     * @param project the project the list is associated with
-     * @return a {@link RenderPreviewList} for the given project, never null
-     */
-    @NonNull
-    public static RenderPreviewList get(@NonNull IProject project) {
-        RenderPreviewList list = null;
-        try {
-            list = (RenderPreviewList) project.getSessionProperty(PREVIEW_LIST);
-        } catch (CoreException e) {
-            // Not a problem; we will just create a new one
-        }
-
-        if (list == null) {
-            list = new RenderPreviewList(project);
-            try {
-                project.setSessionProperty(PREVIEW_LIST, list);
-            } catch (CoreException e) {
-                AdtPlugin.log(e, null);
-            }
-        }
-
-        return list;
-    }
-
-    private File getManualFile() {
-        return new File(AdtUtils.getAbsolutePath(mProject).toFile(), PREVIEW_FILE_NAME);
-    }
-
-    void load(Collection<Device> deviceList) throws IOException {
-        File file = getManualFile();
-        if (file.exists()) {
-            load(file, deviceList);
-        }
-    }
-
-    void save() throws IOException {
-        deleteFile();
-        if (!mList.isEmpty()) {
-            File file = getManualFile();
-            save(file);
-        }
-    }
-
-    private void save(File file) throws IOException {
-        //Document document = DomUtilities.createEmptyPlainDocument();
-        Document document = DomUtilities.createEmptyDocument();
-        if (document != null) {
-            for (ConfigurationDescription description : mList) {
-                description.toXml(document);
-            }
-            String xml = EclipseXmlPrettyPrinter.prettyPrint(document, true);
-            Files.write(xml, file, Charsets.UTF_8);
-        }
-    }
-
-    void load(File file, Collection<Device> deviceList) throws IOException {
-        mList.clear();
-
-        String xml = Files.toString(file, Charsets.UTF_8);
-        Document document = DomUtilities.parseDocument(xml, true);
-        if (document == null || document.getDocumentElement() == null) {
-            return;
-        }
-        List<Element> elements = DomUtilities.getChildren(document.getDocumentElement());
-        for (Element element : elements) {
-            ConfigurationDescription description = ConfigurationDescription.fromXml(
-                    mProject, element, deviceList);
-            if (description != null) {
-                mList.add(description);
-            }
-        }
-    }
-
-    /**
-     * Create a list of previews for the given canvas that matches the internal
-     * configuration preview list
-     *
-     * @param canvas the associated canvas
-     * @return a new list of previews linked to the given canvas
-     */
-    @NonNull
-    List<RenderPreview> createPreviews(LayoutCanvas canvas) {
-        if (mList.isEmpty()) {
-            return new ArrayList<RenderPreview>();
-        }
-        List<RenderPreview> previews = Lists.newArrayList();
-        RenderPreviewManager manager = canvas.getPreviewManager();
-        ConfigurationChooser chooser = canvas.getEditorDelegate().getGraphicalEditor()
-                .getConfigurationChooser();
-
-        Configuration chooserConfig = chooser.getConfiguration();
-        for (ConfigurationDescription description : mList) {
-            Configuration configuration = Configuration.create(chooser);
-            configuration.setDisplayName(description.displayName);
-            configuration.setActivity(description.activity);
-            configuration.setLocale(
-                    description.locale != null ? description.locale : chooserConfig.getLocale(),
-                            true);
-            // TODO: Make sure this layout isn't in some v-folder which is incompatible
-            // with this target!
-            configuration.setTarget(
-                    description.target != null ? description.target : chooserConfig.getTarget(),
-                            true);
-            configuration.setTheme(
-                description.theme != null ? description.theme : chooserConfig.getTheme());
-            configuration.setDevice(
-                description.device != null ? description.device : chooserConfig.getDevice(),
-                        true);
-            configuration.setDeviceState(
-                description.state != null ? description.state : chooserConfig.getDeviceState(),
-                        true);
-            configuration.setNightMode(
-                description.nightMode != null ? description.nightMode
-                        : chooserConfig.getNightMode(), true);
-            configuration.setUiMode(
-                description.uiMode != null ? description.uiMode : chooserConfig.getUiMode(), true);
-
-            //configuration.syncFolderConfig();
-            configuration.getFullConfig().set(description.folder);
-
-            RenderPreview preview = RenderPreview.create(manager, configuration);
-
-            preview.setDescription(description);
-            previews.add(preview);
-        }
-
-        return previews;
-    }
-
-    void remove(@NonNull RenderPreview preview) {
-        ConfigurationDescription description = preview.getDescription();
-        if (description != null) {
-            mList.remove(description);
-        }
-    }
-
-    boolean isEmpty() {
-        return mList.isEmpty();
-    }
-
-    void add(@NonNull RenderPreview preview) {
-        Configuration configuration = preview.getConfiguration();
-        ConfigurationDescription description =
-                ConfigurationDescription.fromConfiguration(mProject, configuration);
-        // RenderPreviews can have display names that aren't reflected in the configuration
-        description.displayName = preview.getDisplayName();
-        mList.add(description);
-        preview.setDescription(description);
-    }
-
-    void delete() {
-        mList.clear();
-        deleteFile();
-    }
-
-    private void deleteFile() {
-        File file = getManualFile();
-        if (file.exists()) {
-            file.delete();
-        }
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/RenderPreviewManager.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/RenderPreviewManager.java
deleted file mode 100644
index 98dde86..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/RenderPreviewManager.java
+++ /dev/null
@@ -1,1696 +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.ide.eclipse.adt.internal.editors.layout.gle2;
-
-import static com.android.ide.eclipse.adt.internal.editors.layout.configuration.Configuration.CFG_DEVICE;
-import static com.android.ide.eclipse.adt.internal.editors.layout.configuration.Configuration.CFG_DEVICE_STATE;
-import static com.android.ide.eclipse.adt.internal.editors.layout.configuration.Configuration.MASK_ALL;
-import static com.android.ide.eclipse.adt.internal.editors.layout.gle2.ImageUtils.SHADOW_SIZE;
-import static com.android.ide.eclipse.adt.internal.editors.layout.gle2.ImageUtils.SMALL_SHADOW_SIZE;
-import static com.android.ide.eclipse.adt.internal.editors.layout.gle2.RenderPreview.LARGE_SHADOWS;
-import static com.android.ide.eclipse.adt.internal.editors.layout.gle2.RenderPreviewMode.CUSTOM;
-import static com.android.ide.eclipse.adt.internal.editors.layout.gle2.RenderPreviewMode.NONE;
-import static com.android.ide.eclipse.adt.internal.editors.layout.gle2.RenderPreviewMode.SCREENS;
-
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-import com.android.ide.common.api.Rect;
-import com.android.ide.common.rendering.api.Capability;
-import com.android.ide.common.resources.configuration.DensityQualifier;
-import com.android.ide.common.resources.configuration.DeviceConfigHelper;
-import com.android.ide.common.resources.configuration.FolderConfiguration;
-import com.android.ide.common.resources.configuration.LocaleQualifier;
-import com.android.ide.common.resources.configuration.ScreenSizeQualifier;
-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.ide.eclipse.adt.internal.editors.common.CommonXmlEditor;
-import com.android.ide.eclipse.adt.internal.editors.layout.configuration.Configuration;
-import com.android.ide.eclipse.adt.internal.editors.layout.configuration.ConfigurationChooser;
-import com.android.ide.eclipse.adt.internal.editors.layout.configuration.ConfigurationClient;
-import com.android.ide.eclipse.adt.internal.editors.layout.configuration.ConfigurationDescription;
-import com.android.ide.eclipse.adt.internal.editors.layout.configuration.Locale;
-import com.android.ide.eclipse.adt.internal.editors.layout.configuration.NestedConfiguration;
-import com.android.ide.eclipse.adt.internal.editors.layout.configuration.VaryingConfiguration;
-import com.android.ide.eclipse.adt.internal.editors.layout.gle2.IncludeFinder.Reference;
-import com.android.ide.eclipse.adt.internal.preferences.AdtPrefs;
-import com.android.resources.Density;
-import com.android.resources.ScreenSize;
-import com.android.sdklib.devices.Device;
-import com.android.sdklib.devices.Screen;
-import com.android.sdklib.devices.State;
-import com.google.common.collect.Lists;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.jface.dialogs.InputDialog;
-import org.eclipse.jface.window.Window;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
-import org.eclipse.swt.graphics.GC;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.graphics.Rectangle;
-import org.eclipse.swt.widgets.ScrollBar;
-import org.eclipse.ui.IWorkbenchPartSite;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.ide.IDE;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Set;
-
-/**
- * Manager for the configuration previews, which handles layout computations,
- * managing the image buffer cache, etc
- */
-public class RenderPreviewManager {
-    private static double sScale = 1.0;
-    private static final int RENDER_DELAY = 150;
-    private static final int PREVIEW_VGAP = 18;
-    private static final int PREVIEW_HGAP = 12;
-    private static final int MAX_WIDTH = 200;
-    private static final int MAX_HEIGHT = MAX_WIDTH;
-    private static final int ZOOM_ICON_WIDTH = 16;
-    private static final int ZOOM_ICON_HEIGHT = 16;
-    private @Nullable List<RenderPreview> mPreviews;
-    private @Nullable RenderPreviewList mManualList;
-    private final @NonNull LayoutCanvas mCanvas;
-    private final @NonNull CanvasTransform mVScale;
-    private final @NonNull CanvasTransform mHScale;
-    private int mPrevCanvasWidth;
-    private int mPrevCanvasHeight;
-    private int mPrevImageWidth;
-    private int mPrevImageHeight;
-    private @NonNull RenderPreviewMode mMode = NONE;
-    private @Nullable RenderPreview mActivePreview;
-    private @Nullable ScrollBarListener mListener;
-    private int mLayoutHeight;
-    /** Last seen state revision in this {@link RenderPreviewManager}. If less
-     * than {@link #sRevision}, the previews need to be updated on next exposure */
-    private static int mRevision;
-    /** Current global revision count */
-    private static int sRevision;
-    private boolean mNeedLayout;
-    private boolean mNeedRender;
-    private boolean mNeedZoom;
-    private SwapAnimation mAnimation;
-
-    /**
-     * Creates a {@link RenderPreviewManager} associated with the given canvas
-     *
-     * @param canvas the canvas to manage previews for
-     */
-    public RenderPreviewManager(@NonNull LayoutCanvas canvas) {
-        mCanvas = canvas;
-        mHScale = canvas.getHorizontalTransform();
-        mVScale = canvas.getVerticalTransform();
-    }
-
-    /**
-     * Revise the global state revision counter. This will cause all layout
-     * preview managers to refresh themselves to the latest revision when they
-     * are next exposed.
-     */
-    public static void bumpRevision() {
-        sRevision++;
-    }
-
-    /**
-     * Returns the associated chooser
-     *
-     * @return the associated chooser
-     */
-    @NonNull
-    ConfigurationChooser getChooser() {
-        GraphicalEditorPart editor = mCanvas.getEditorDelegate().getGraphicalEditor();
-        return editor.getConfigurationChooser();
-    }
-
-    /**
-     * Returns the associated canvas
-     *
-     * @return the canvas
-     */
-    @NonNull
-    public LayoutCanvas getCanvas() {
-        return mCanvas;
-    }
-
-    /** Zooms in (grows all previews) */
-    public void zoomIn() {
-        sScale = sScale * (1 / 0.9);
-        if (Math.abs(sScale-1.0) < 0.0001) {
-            sScale = 1.0;
-        }
-
-        updatedZoom();
-    }
-
-    /** Zooms out (shrinks all previews) */
-    public void zoomOut() {
-        sScale = sScale * (0.9 / 1);
-        if (Math.abs(sScale-1.0) < 0.0001) {
-            sScale = 1.0;
-        }
-        updatedZoom();
-    }
-
-    /** Zooms to 100 (resets zoom) */
-    public void zoomReset() {
-        sScale = 1.0;
-        updatedZoom();
-        mNeedZoom = mNeedLayout = true;
-        mCanvas.redraw();
-    }
-
-    private void updatedZoom() {
-        if (hasPreviews()) {
-            for (RenderPreview preview : mPreviews) {
-                preview.disposeThumbnail();
-            }
-            RenderPreview preview = mCanvas.getPreview();
-            if (preview != null) {
-                preview.disposeThumbnail();
-            }
-        }
-
-        mNeedLayout = mNeedRender = true;
-        mCanvas.redraw();
-    }
-
-    static int getMaxWidth() {
-        return (int) (sScale * MAX_WIDTH);
-    }
-
-    static int getMaxHeight() {
-        return (int) (sScale * MAX_HEIGHT);
-    }
-
-    static double getScale() {
-        return sScale;
-    }
-
-    /**
-     * Returns whether there are any manual preview items (provided the current
-     * mode is manual previews
-     *
-     * @return true if there are items in the manual preview list
-     */
-    public boolean hasManualPreviews() {
-        assert mMode == CUSTOM;
-        return mManualList != null && !mManualList.isEmpty();
-    }
-
-    /** Delete all the previews */
-    public void deleteManualPreviews() {
-        disposePreviews();
-        selectMode(NONE);
-        mCanvas.setFitScale(true /* onlyZoomOut */, true /*allowZoomIn*/);
-
-        if (mManualList != null) {
-            mManualList.delete();
-        }
-    }
-
-    /** Dispose all the previews */
-    public void disposePreviews() {
-        if (mPreviews != null) {
-            List<RenderPreview> old = mPreviews;
-            mPreviews = null;
-            for (RenderPreview preview : old) {
-                preview.dispose();
-            }
-        }
-    }
-
-    /**
-     * Deletes the given preview
-     *
-     * @param preview the preview to be deleted
-     */
-    public void deletePreview(RenderPreview preview) {
-        mPreviews.remove(preview);
-        preview.dispose();
-        layout(true);
-        mCanvas.redraw();
-
-        if (mManualList != null) {
-            mManualList.remove(preview);
-            saveList();
-        }
-    }
-
-    /**
-     * Compute the total width required for the previews, including internal padding
-     *
-     * @return total width in pixels
-     */
-    public int computePreviewWidth() {
-        int maxPreviewWidth = 0;
-        if (hasPreviews()) {
-            for (RenderPreview preview : mPreviews) {
-                maxPreviewWidth = Math.max(maxPreviewWidth, preview.getWidth());
-            }
-
-            if (maxPreviewWidth > 0) {
-                maxPreviewWidth += 2 * PREVIEW_HGAP; // 2x for left and right side
-                maxPreviewWidth += LARGE_SHADOWS ? SHADOW_SIZE : SMALL_SHADOW_SIZE;
-            }
-
-            return maxPreviewWidth;
-        }
-
-        return 0;
-    }
-
-    /**
-     * Layout Algorithm. This sets the {@link RenderPreview#getX()} and
-     * {@link RenderPreview#getY()} coordinates of all the previews. It also
-     * marks previews as visible or invisible via
-     * {@link RenderPreview#setVisible(boolean)} according to their position and
-     * the current visible view port in the layout canvas. Finally, it also sets
-     * the {@code mLayoutHeight} field, such that the scrollbars can compute the
-     * right scrolled area, and that scrolling can cause render refreshes on
-     * views that are made visible.
-     * <p>
-     * This is not a traditional bin packing problem, because the objects to be
-     * packaged do not have a fixed size; we can scale them up and down in order
-     * to provide an "optimal" size.
-     * <p>
-     * See http://en.wikipedia.org/wiki/Packing_problem See
-     * http://en.wikipedia.org/wiki/Bin_packing_problem
-     */
-    void layout(boolean refresh) {
-        mNeedLayout = false;
-
-        if (mPreviews == null || mPreviews.isEmpty()) {
-            return;
-        }
-
-        int scaledImageWidth = mHScale.getScaledImgSize();
-        int scaledImageHeight = mVScale.getScaledImgSize();
-        Rectangle clientArea = mCanvas.getClientArea();
-
-        if (!refresh &&
-                (scaledImageWidth == mPrevImageWidth
-                && scaledImageHeight == mPrevImageHeight
-                && clientArea.width == mPrevCanvasWidth
-                && clientArea.height == mPrevCanvasHeight)) {
-            // No change
-            return;
-        }
-
-        mPrevImageWidth = scaledImageWidth;
-        mPrevImageHeight = scaledImageHeight;
-        mPrevCanvasWidth = clientArea.width;
-        mPrevCanvasHeight = clientArea.height;
-
-        if (mListener == null) {
-            mListener = new ScrollBarListener();
-            mCanvas.getVerticalBar().addSelectionListener(mListener);
-        }
-
-        beginRenderScheduling();
-
-        mLayoutHeight = 0;
-
-        if (previewsHaveIdenticalSize() || fixedOrder()) {
-            // If all the preview boxes are of identical sizes, or if the order is predetermined,
-            // just lay them out in rows.
-            rowLayout();
-        } else if (previewsFit()) {
-            layoutFullFit();
-        } else {
-            rowLayout();
-        }
-
-        mCanvas.updateScrollBars();
-    }
-
-    /**
-     * Performs a simple layout where the views are laid out in a row, wrapping
-     * around the top left canvas image.
-     */
-    private void rowLayout() {
-        // TODO: Separate layout heuristics for portrait and landscape orientations (though
-        // it also depends on the dimensions of the canvas window, which determines the
-        // shape of the leftover space)
-
-        int scaledImageWidth = mHScale.getScaledImgSize();
-        int scaledImageHeight = mVScale.getScaledImgSize();
-        Rectangle clientArea = mCanvas.getClientArea();
-
-        int availableWidth = clientArea.x + clientArea.width - getX();
-        int availableHeight = clientArea.y + clientArea.height - getY();
-        int maxVisibleY = clientArea.y + clientArea.height;
-
-        int bottomBorder = scaledImageHeight;
-        int rightHandSide = scaledImageWidth + PREVIEW_HGAP;
-        int nextY = 0;
-
-        // First lay out images across the top right hand side
-        int x = rightHandSide;
-        int y = 0;
-        boolean wrapped = false;
-
-        int vgap = PREVIEW_VGAP;
-        for (RenderPreview preview : mPreviews) {
-            // If we have forked previews, double the vgap to allow space for two labels
-            if (preview.isForked()) {
-                vgap *= 2;
-                break;
-            }
-        }
-
-        List<RenderPreview> aspectOrder;
-        if (!fixedOrder()) {
-            aspectOrder = new ArrayList<RenderPreview>(mPreviews);
-            Collections.sort(aspectOrder, RenderPreview.INCREASING_ASPECT_RATIO);
-        } else {
-            aspectOrder = mPreviews;
-        }
-
-        for (RenderPreview preview : aspectOrder) {
-            if (x > 0 && x + preview.getWidth() > availableWidth) {
-                x = rightHandSide;
-                int prevY = y;
-                y = nextY;
-                if ((prevY <= bottomBorder ||
-                        y <= bottomBorder)
-                            && Math.max(nextY, y + preview.getHeight()) > bottomBorder) {
-                    // If there's really no visible room below, don't bother
-                    // Similarly, don't wrap individually scaled views
-                    if (bottomBorder < availableHeight - 40 && preview.getScale() < 1.2) {
-                        // If it's closer to the top row than the bottom, just
-                        // mark the next row for left justify instead
-                        if (bottomBorder - y > y + preview.getHeight() - bottomBorder) {
-                            rightHandSide = 0;
-                            wrapped = true;
-                        } else if (!wrapped) {
-                            y = nextY = Math.max(nextY, bottomBorder + vgap);
-                            x = rightHandSide = 0;
-                            wrapped = true;
-                        }
-                    }
-                }
-            }
-            if (x > 0 && y <= bottomBorder
-                    && Math.max(nextY, y + preview.getHeight()) > bottomBorder) {
-                if (clientArea.height - bottomBorder < preview.getHeight()) {
-                    // No room below the device on the left; just continue on the
-                    // bottom row
-                } else if (preview.getScale() < 1.2) {
-                    if (bottomBorder - y > y + preview.getHeight() - bottomBorder) {
-                        rightHandSide = 0;
-                        wrapped = true;
-                    } else {
-                        y = nextY = Math.max(nextY, bottomBorder + vgap);
-                        x = rightHandSide = 0;
-                        wrapped = true;
-                    }
-                }
-            }
-
-            preview.setPosition(x, y);
-
-            if (y > maxVisibleY && maxVisibleY > 0) {
-                preview.setVisible(false);
-            } else if (!preview.isVisible()) {
-                preview.setVisible(true);
-            }
-
-            x += preview.getWidth();
-            x += PREVIEW_HGAP;
-            nextY = Math.max(nextY, y + preview.getHeight() + vgap);
-        }
-
-        mLayoutHeight = nextY;
-    }
-
-    private boolean fixedOrder() {
-        return mMode == SCREENS;
-    }
-
-    /** Returns true if all the previews have the same identical size */
-    private boolean previewsHaveIdenticalSize() {
-        if (!hasPreviews()) {
-            return true;
-        }
-
-        Iterator<RenderPreview> iterator = mPreviews.iterator();
-        RenderPreview first = iterator.next();
-        int width = first.getWidth();
-        int height = first.getHeight();
-
-        while (iterator.hasNext()) {
-            RenderPreview preview = iterator.next();
-            if (width != preview.getWidth() || height != preview.getHeight()) {
-                return false;
-            }
-        }
-
-        return true;
-    }
-
-    /** Returns true if all the previews can fully fit in the available space */
-    private boolean previewsFit() {
-        int scaledImageWidth = mHScale.getScaledImgSize();
-        int scaledImageHeight = mVScale.getScaledImgSize();
-        Rectangle clientArea = mCanvas.getClientArea();
-        int availableWidth = clientArea.x + clientArea.width - getX();
-        int availableHeight = clientArea.y + clientArea.height - getY();
-        int bottomBorder = scaledImageHeight;
-        int rightHandSide = scaledImageWidth + PREVIEW_HGAP;
-
-        // First see if we can fit everything; if so, we can try to make the layouts
-        // larger such that they fill up all the available space
-        long availableArea = rightHandSide * bottomBorder +
-                availableWidth * (Math.max(0, availableHeight - bottomBorder));
-
-        long requiredArea = 0;
-        for (RenderPreview preview : mPreviews) {
-            // Note: This does not include individual preview scale; the layout
-            // algorithm itself may be tweaking the scales to fit elements within
-            // the layout
-            requiredArea += preview.getArea();
-        }
-
-        return requiredArea * sScale < availableArea;
-    }
-
-    private void layoutFullFit() {
-        int scaledImageWidth = mHScale.getScaledImgSize();
-        int scaledImageHeight = mVScale.getScaledImgSize();
-        Rectangle clientArea = mCanvas.getClientArea();
-        int availableWidth = clientArea.x + clientArea.width - getX();
-        int availableHeight = clientArea.y + clientArea.height - getY();
-        int maxVisibleY = clientArea.y + clientArea.height;
-        int bottomBorder = scaledImageHeight;
-        int rightHandSide = scaledImageWidth + PREVIEW_HGAP;
-
-        int minWidth = Integer.MAX_VALUE;
-        int minHeight = Integer.MAX_VALUE;
-        for (RenderPreview preview : mPreviews) {
-            minWidth = Math.min(minWidth, preview.getWidth());
-            minHeight = Math.min(minHeight, preview.getHeight());
-        }
-
-        BinPacker packer = new BinPacker(minWidth, minHeight);
-
-        // TODO: Instead of this, just start with client area and occupy scaled image size!
-
-        // Add in gap on right and bottom since we'll add that requirement on the width and
-        // height rectangles too (for spacing)
-        packer.addSpace(new Rect(rightHandSide, 0,
-                availableWidth - rightHandSide + PREVIEW_HGAP,
-                availableHeight + PREVIEW_VGAP));
-        if (maxVisibleY > bottomBorder) {
-            packer.addSpace(new Rect(0, bottomBorder + PREVIEW_VGAP,
-                    availableWidth + PREVIEW_HGAP, maxVisibleY - bottomBorder + PREVIEW_VGAP));
-        }
-
-        // TODO: Sort previews first before attempting to position them?
-
-        ArrayList<RenderPreview> aspectOrder = new ArrayList<RenderPreview>(mPreviews);
-        Collections.sort(aspectOrder, RenderPreview.INCREASING_ASPECT_RATIO);
-
-        for (RenderPreview preview : aspectOrder) {
-            int previewWidth = preview.getWidth();
-            int previewHeight = preview.getHeight();
-            previewHeight += PREVIEW_VGAP;
-            if (preview.isForked()) {
-                previewHeight += PREVIEW_VGAP;
-            }
-            previewWidth += PREVIEW_HGAP;
-            // title height? how do I account for that?
-            Rect position = packer.occupy(previewWidth, previewHeight);
-            if (position != null) {
-                preview.setPosition(position.x, position.y);
-                preview.setVisible(true);
-            } else {
-                // Can't fit: give up and do plain row layout
-                rowLayout();
-                return;
-            }
-        }
-
-        mLayoutHeight = availableHeight;
-    }
-    /**
-     * Paints the configuration previews
-     *
-     * @param gc the graphics context to paint into
-     */
-    void paint(GC gc) {
-        if (hasPreviews()) {
-            // Ensure up to date at all times; consider moving if it's too expensive
-            layout(mNeedLayout);
-            if (mNeedRender) {
-                renderPreviews();
-            }
-            if (mNeedZoom) {
-                boolean allowZoomIn = true /*mMode == NONE*/;
-                mCanvas.setFitScale(false /*onlyZoomOut*/, allowZoomIn);
-                mNeedZoom = false;
-            }
-            int rootX = getX();
-            int rootY = getY();
-
-            for (RenderPreview preview : mPreviews) {
-                if (preview.isVisible()) {
-                    int x = rootX + preview.getX();
-                    int y = rootY + preview.getY();
-                    preview.paint(gc, x, y);
-                }
-            }
-
-            RenderPreview preview = mCanvas.getPreview();
-            if (preview != null) {
-                String displayName = null;
-                Configuration configuration = preview.getConfiguration();
-                if (configuration instanceof VaryingConfiguration) {
-                    // Use override flags from stashed preview, but configuration
-                    // data from live (not varying) configured configuration
-                    VaryingConfiguration cfg = (VaryingConfiguration) configuration;
-                    int flags = cfg.getAlternateFlags() | cfg.getOverrideFlags();
-                    displayName = NestedConfiguration.computeDisplayName(flags,
-                            getChooser().getConfiguration());
-                } else if (configuration instanceof NestedConfiguration) {
-                    int flags = ((NestedConfiguration) configuration).getOverrideFlags();
-                    displayName = NestedConfiguration.computeDisplayName(flags,
-                            getChooser().getConfiguration());
-                } else {
-                    displayName = configuration.getDisplayName();
-                }
-                if (displayName != null) {
-                    CanvasTransform hi = mHScale;
-                    CanvasTransform vi = mVScale;
-
-                    int destX = hi.translate(0);
-                    int destY = vi.translate(0);
-                    int destWidth = hi.getScaledImgSize();
-                    int destHeight = vi.getScaledImgSize();
-
-                    int x = destX + destWidth / 2 - preview.getWidth() / 2;
-                    int y = destY + destHeight;
-
-                    preview.paintTitle(gc, x, y, false /*showFile*/, displayName);
-                }
-            }
-
-            // Zoom overlay
-            int x = getZoomX();
-            if (x > 0) {
-                int y = getZoomY();
-                int oldAlpha = gc.getAlpha();
-
-                // Paint background oval rectangle behind the zoom and close icons
-                gc.setBackground(gc.getDevice().getSystemColor(SWT.COLOR_GRAY));
-                gc.setAlpha(128);
-                int padding = 3;
-                int arc = 5;
-                gc.fillRoundRectangle(x - padding, y - padding,
-                        ZOOM_ICON_WIDTH + 2 * padding,
-                        4 * ZOOM_ICON_HEIGHT + 2 * padding, arc, arc);
-
-                gc.setAlpha(255);
-                IconFactory iconFactory = IconFactory.getInstance();
-                Image zoomOut = iconFactory.getIcon("zoomminus"); //$NON-NLS-1$);
-                Image zoomIn = iconFactory.getIcon("zoomplus");   //$NON-NLS-1$);
-                Image zoom100 = iconFactory.getIcon("zoom100");   //$NON-NLS-1$);
-                Image close = iconFactory.getIcon("close");       //$NON-NLS-1$);
-
-                gc.drawImage(zoomIn, x, y);
-                y += ZOOM_ICON_HEIGHT;
-                gc.drawImage(zoomOut, x, y);
-                y += ZOOM_ICON_HEIGHT;
-                gc.drawImage(zoom100, x, y);
-                y += ZOOM_ICON_HEIGHT;
-                gc.drawImage(close, x, y);
-                y += ZOOM_ICON_HEIGHT;
-                gc.setAlpha(oldAlpha);
-            }
-        } else if (mMode == CUSTOM) {
-            int rootX = getX();
-            rootX += mHScale.getScaledImgSize();
-            rootX += 2 * PREVIEW_HGAP;
-            int rootY = getY();
-            rootY += 20;
-            gc.setFont(mCanvas.getFont());
-            gc.setForeground(mCanvas.getDisplay().getSystemColor(SWT.COLOR_BLACK));
-            gc.drawText("Add previews with \"Add as Thumbnail\"\nin the configuration menu",
-                    rootX, rootY, true);
-        }
-
-        if (mAnimation != null) {
-            mAnimation.tick(gc);
-        }
-    }
-
-    private void addPreview(@NonNull RenderPreview preview) {
-        if (mPreviews == null) {
-            mPreviews = Lists.newArrayList();
-        }
-        mPreviews.add(preview);
-    }
-
-    /** Adds the current configuration as a new configuration preview */
-    public void addAsThumbnail() {
-        ConfigurationChooser chooser = getChooser();
-        String name = chooser.getConfiguration().getDisplayName();
-        if (name == null || name.isEmpty()) {
-            name = getUniqueName();
-        }
-        InputDialog d = new InputDialog(
-                AdtPlugin.getShell(),
-                "Add as Thumbnail Preview",  // title
-                "Name of thumbnail:",
-                name,
-                null);
-        if (d.open() == Window.OK) {
-            selectMode(CUSTOM);
-
-            String newName = d.getValue();
-            // Create a new configuration from the current settings in the composite
-            Configuration configuration = Configuration.copy(chooser.getConfiguration());
-            configuration.setDisplayName(newName);
-
-            RenderPreview preview = RenderPreview.create(this, configuration);
-            addPreview(preview);
-
-            layout(true);
-            beginRenderScheduling();
-            scheduleRender(preview);
-            mCanvas.setFitScale(true /* onlyZoomOut */, false /*allowZoomIn*/);
-
-            if (mManualList == null) {
-                loadList();
-            }
-            if (mManualList != null) {
-                mManualList.add(preview);
-                saveList();
-            }
-        }
-    }
-
-    /**
-     * Computes a unique new name for a configuration preview that represents
-     * the current, default configuration
-     *
-     * @return a unique name
-     */
-    private String getUniqueName() {
-        if (mPreviews == null || mPreviews.isEmpty()) {
-            // NO, not for the first preview!
-            return "Config1";
-        }
-
-        Set<String> names = new HashSet<String>(mPreviews.size());
-        for (RenderPreview preview : mPreviews) {
-            names.add(preview.getDisplayName());
-        }
-
-        int index = 2;
-        while (true) {
-            String name = String.format("Config%1$d", index);
-            if (!names.contains(name)) {
-                return name;
-            }
-            index++;
-        }
-    }
-
-    /** Generates a bunch of default configuration preview thumbnails */
-    public void addDefaultPreviews() {
-        ConfigurationChooser chooser = getChooser();
-        Configuration parent = chooser.getConfiguration();
-        if (parent instanceof NestedConfiguration) {
-            parent = ((NestedConfiguration) parent).getParent();
-        }
-        if (mCanvas.getImageOverlay().getImage() != null) {
-            // Create Language variation
-            createLocaleVariation(chooser, parent);
-
-            // Vary screen size
-            // TODO: Be smarter here: Pick a screen that is both as differently as possible
-            // from the current screen as well as also supported. So consider
-            // things like supported screens, targetSdk etc.
-            createScreenVariations(parent);
-
-            // Vary orientation
-            createStateVariation(chooser, parent);
-
-            // Vary render target
-            createRenderTargetVariation(chooser, parent);
-        }
-
-        // Also add in include-context previews, if any
-        addIncludedInPreviews();
-
-        // Make a placeholder preview for the current screen, in case we switch from it
-        RenderPreview preview = RenderPreview.create(this, parent);
-        mCanvas.setPreview(preview);
-
-        sortPreviewsByOrientation();
-    }
-
-    private void createRenderTargetVariation(ConfigurationChooser chooser, Configuration parent) {
-        /* This is disabled for now: need to load multiple versions of layoutlib.
-        When I did this, there seemed to be some drug interactions between
-        them, and I would end up with NPEs in layoutlib code which normally works.
-        VaryingConfiguration configuration =
-                VaryingConfiguration.create(chooser, parent);
-        configuration.setAlternatingTarget(true);
-        configuration.syncFolderConfig();
-        addPreview(RenderPreview.create(this, configuration));
-        */
-    }
-
-    private void createStateVariation(ConfigurationChooser chooser, Configuration parent) {
-        State currentState = parent.getDeviceState();
-        State nextState = parent.getNextDeviceState(currentState);
-        if (nextState != currentState) {
-            VaryingConfiguration configuration =
-                    VaryingConfiguration.create(chooser, parent);
-            configuration.setAlternateDeviceState(true);
-            configuration.syncFolderConfig();
-            addPreview(RenderPreview.create(this, configuration));
-        }
-    }
-
-    private void createLocaleVariation(ConfigurationChooser chooser, Configuration parent) {
-        LocaleQualifier currentLanguage = parent.getLocale().qualifier;
-        for (Locale locale : chooser.getLocaleList()) {
-            LocaleQualifier qualifier = locale.qualifier;
-            if (!qualifier.getLanguage().equals(currentLanguage.getLanguage())) {
-                VaryingConfiguration configuration =
-                        VaryingConfiguration.create(chooser, parent);
-                configuration.setAlternateLocale(true);
-                configuration.syncFolderConfig();
-                addPreview(RenderPreview.create(this, configuration));
-                break;
-            }
-        }
-    }
-
-    private void createScreenVariations(Configuration parent) {
-        ConfigurationChooser chooser = getChooser();
-        VaryingConfiguration configuration;
-
-        configuration = VaryingConfiguration.create(chooser, parent);
-        configuration.setVariation(0);
-        configuration.setAlternateDevice(true);
-        configuration.syncFolderConfig();
-        addPreview(RenderPreview.create(this, configuration));
-
-        configuration = VaryingConfiguration.create(chooser, parent);
-        configuration.setVariation(1);
-        configuration.setAlternateDevice(true);
-        configuration.syncFolderConfig();
-        addPreview(RenderPreview.create(this, configuration));
-    }
-
-    /**
-     * Returns the current mode as seen by this {@link RenderPreviewManager}.
-     * Note that it may not yet have been synced with the global mode kept in
-     * {@link AdtPrefs#getRenderPreviewMode()}.
-     *
-     * @return the current preview mode
-     */
-    @NonNull
-    public RenderPreviewMode getMode() {
-        return mMode;
-    }
-
-    /**
-     * Update the set of previews for the current mode
-     *
-     * @param force force a refresh even if the preview type has not changed
-     * @return true if the views were recomputed, false if the previews were
-     *         already showing and the mode not changed
-     */
-    public boolean recomputePreviews(boolean force) {
-        RenderPreviewMode newMode = AdtPrefs.getPrefs().getRenderPreviewMode();
-        if (newMode == mMode && !force
-                && (mRevision == sRevision
-                    || mMode == NONE
-                    || mMode == CUSTOM)) {
-            return false;
-        }
-
-        RenderPreviewMode oldMode = mMode;
-        mMode = newMode;
-        mRevision = sRevision;
-
-        sScale = 1.0;
-        disposePreviews();
-
-        switch (mMode) {
-            case DEFAULT:
-                addDefaultPreviews();
-                break;
-            case INCLUDES:
-                addIncludedInPreviews();
-                break;
-            case LOCALES:
-                addLocalePreviews();
-                break;
-            case SCREENS:
-                addScreenSizePreviews();
-                break;
-            case VARIATIONS:
-                addVariationPreviews();
-                break;
-            case CUSTOM:
-                addManualPreviews();
-                break;
-            case NONE:
-                // Can't just set mNeedZoom because with no previews, the paint
-                // method does nothing
-                mCanvas.setFitScale(false /*onlyZoomOut*/, true /*allowZoomIn*/);
-                break;
-            default:
-                assert false : mMode;
-        }
-
-        // We schedule layout for the next redraw rather than process it here immediately;
-        // not only does this let us avoid doing work for windows where the tab is in the
-        // background, but when a file is opened we may not know the size of the canvas
-        // yet, and the layout methods need it in order to do a good job. By the time
-        // the canvas is painted, we have accurate bounds.
-        mNeedLayout = mNeedRender = true;
-        mCanvas.redraw();
-
-        if (oldMode != mMode && (oldMode == NONE || mMode == NONE)) {
-            // If entering or exiting preview mode: updating padding which is compressed
-            // only in preview mode.
-            mCanvas.getHorizontalTransform().refresh();
-            mCanvas.getVerticalTransform().refresh();
-        }
-
-        return true;
-    }
-
-    /**
-     * Sets the new render preview mode to use
-     *
-     * @param mode the new mode
-     */
-    public void selectMode(@NonNull RenderPreviewMode mode) {
-        if (mode != mMode) {
-            AdtPrefs.getPrefs().setPreviewMode(mode);
-            recomputePreviews(false);
-        }
-    }
-
-    /** Similar to {@link #addDefaultPreviews()} but for locales */
-    public void addLocalePreviews() {
-
-        ConfigurationChooser chooser = getChooser();
-        List<Locale> locales = chooser.getLocaleList();
-        Configuration parent = chooser.getConfiguration();
-
-        for (Locale locale : locales) {
-            if (!locale.hasLanguage() && !locale.hasRegion()) {
-                continue;
-            }
-            NestedConfiguration configuration = NestedConfiguration.create(chooser, parent);
-            configuration.setOverrideLocale(true);
-            configuration.setLocale(locale, false);
-
-            String displayName = ConfigurationChooser.getLocaleLabel(chooser, locale, false);
-            assert displayName != null; // it's never non null when locale is non null
-            configuration.setDisplayName(displayName);
-
-            addPreview(RenderPreview.create(this, configuration));
-        }
-
-        // Make a placeholder preview for the current screen, in case we switch from it
-        Configuration configuration = parent;
-        Locale locale = configuration.getLocale();
-        String label = ConfigurationChooser.getLocaleLabel(chooser, locale, false);
-        if (label == null) {
-            label = "default";
-        }
-        configuration.setDisplayName(label);
-        RenderPreview preview = RenderPreview.create(this, parent);
-        if (preview != null) {
-            mCanvas.setPreview(preview);
-        }
-
-        // No need to sort: they should all be identical
-    }
-
-    /** Similar to {@link #addDefaultPreviews()} but for screen sizes */
-    public void addScreenSizePreviews() {
-        ConfigurationChooser chooser = getChooser();
-        Collection<Device> devices = chooser.getDevices();
-        Configuration configuration = chooser.getConfiguration();
-        boolean canScaleNinePatch = configuration.supports(Capability.FIXED_SCALABLE_NINE_PATCH);
-
-        // Rearrange the devices a bit such that the most interesting devices bubble
-        // to the front
-        // 10" tablet, 7" tablet, reference phones, tiny phone, and in general the first
-        // version of each seen screen size
-        List<Device> sorted = new ArrayList<Device>(devices);
-        Set<ScreenSize> seenSizes = new HashSet<ScreenSize>();
-        State currentState = configuration.getDeviceState();
-        String currentStateName = currentState != null ? currentState.getName() : "";
-
-        for (int i = 0, n = sorted.size(); i < n; i++) {
-            Device device = sorted.get(i);
-            boolean interesting = false;
-
-            State state = device.getState(currentStateName);
-            if (state == null) {
-                state = device.getAllStates().get(0);
-            }
-
-            if (device.getName().startsWith("Nexus ")         //$NON-NLS-1$
-                    || device.getName().endsWith(" Nexus")) { //$NON-NLS-1$
-                // Not String#contains("Nexus") because that would also pick up all the generic
-                // entries ("3.7in WVGA (Nexus One)") so we'd have them duplicated
-                interesting = true;
-            }
-
-            FolderConfiguration c = DeviceConfigHelper.getFolderConfig(state);
-            if (c != null) {
-                ScreenSizeQualifier sizeQualifier = c.getScreenSizeQualifier();
-                if (sizeQualifier != null) {
-                    ScreenSize size = sizeQualifier.getValue();
-                    if (!seenSizes.contains(size)) {
-                        seenSizes.add(size);
-                        interesting = true;
-                    }
-                }
-
-                // Omit LDPI, not really used anymore
-                DensityQualifier density = c.getDensityQualifier();
-                if (density != null) {
-                    Density d = density.getValue();
-                    if (d == Density.LOW) {
-                        interesting = false;
-                    }
-
-                    if (!canScaleNinePatch && d == Density.TV) {
-                        interesting = false;
-                    }
-                }
-            }
-
-            if (interesting) {
-                NestedConfiguration screenConfig = NestedConfiguration.create(chooser,
-                        configuration);
-                screenConfig.setOverrideDevice(true);
-                screenConfig.setDevice(device, true);
-                screenConfig.syncFolderConfig();
-                screenConfig.setDisplayName(ConfigurationChooser.getDeviceLabel(device, true));
-                addPreview(RenderPreview.create(this, screenConfig));
-            }
-        }
-
-        // Sorted by screen size, in decreasing order
-        sortPreviewsByScreenSize();
-    }
-
-    /**
-     * Previews this layout as included in other layouts
-     */
-    public void addIncludedInPreviews() {
-        ConfigurationChooser chooser = getChooser();
-        IProject project = chooser.getProject();
-        if (project == null) {
-            return;
-        }
-        IncludeFinder finder = IncludeFinder.get(project);
-
-        final List<Reference> includedBy = finder.getIncludedBy(chooser.getEditedFile());
-
-        if (includedBy == null || includedBy.isEmpty()) {
-            // TODO: Generate some useful defaults, such as including it in a ListView
-            // as the list item layout?
-            return;
-        }
-
-        for (final Reference reference : includedBy) {
-            String title = reference.getDisplayName();
-            Configuration config = Configuration.create(chooser.getConfiguration(),
-                    reference.getFile());
-            RenderPreview preview = RenderPreview.create(this, config);
-            preview.setDisplayName(title);
-            preview.setIncludedWithin(reference);
-
-            addPreview(preview);
-        }
-
-        sortPreviewsByOrientation();
-    }
-
-    /**
-     * Previews this layout as included in other layouts
-     */
-    public void addVariationPreviews() {
-        ConfigurationChooser chooser = getChooser();
-
-        IFile file = chooser.getEditedFile();
-        List<IFile> variations = AdtUtils.getResourceVariations(file, false /*includeSelf*/);
-
-        // Sort by parent folder
-        Collections.sort(variations, new Comparator<IFile>() {
-            @Override
-            public int compare(IFile file1, IFile file2) {
-                return file1.getParent().getName().compareTo(file2.getParent().getName());
-            }
-        });
-
-        Configuration currentConfig = chooser.getConfiguration();
-
-        for (IFile variation : variations) {
-            String title = variation.getParent().getName();
-            Configuration config = Configuration.create(chooser.getConfiguration(), variation);
-            config.setTheme(currentConfig.getTheme());
-            config.setActivity(currentConfig.getActivity());
-            RenderPreview preview = RenderPreview.create(this, config);
-            preview.setDisplayName(title);
-            preview.setAlternateInput(variation);
-
-            addPreview(preview);
-        }
-
-        sortPreviewsByOrientation();
-    }
-
-    /**
-     * Previews this layout using a custom configured set of layouts
-     */
-    public void addManualPreviews() {
-        if (mManualList == null) {
-            loadList();
-        } else {
-            mPreviews = mManualList.createPreviews(mCanvas);
-        }
-    }
-
-    private void loadList() {
-        IProject project = getChooser().getProject();
-        if (project == null) {
-            return;
-        }
-
-        if (mManualList == null) {
-            mManualList = RenderPreviewList.get(project);
-        }
-
-        try {
-            mManualList.load(getChooser().getDevices());
-            mPreviews = mManualList.createPreviews(mCanvas);
-        } catch (IOException e) {
-            AdtPlugin.log(e, null);
-        }
-    }
-
-    private void saveList() {
-        if (mManualList != null) {
-            try {
-                mManualList.save();
-            } catch (IOException e) {
-                AdtPlugin.log(e, null);
-            }
-        }
-    }
-
-    void rename(ConfigurationDescription description, String newName) {
-        IProject project = getChooser().getProject();
-        if (project == null) {
-            return;
-        }
-
-        if (mManualList == null) {
-            mManualList = RenderPreviewList.get(project);
-        }
-        description.displayName = newName;
-        saveList();
-    }
-
-
-    /**
-     * Notifies that the main configuration has changed.
-     *
-     * @param flags the change flags, a bitmask corresponding to the
-     *            {@code CHANGE_} constants in {@link ConfigurationClient}
-     */
-    public void configurationChanged(int flags) {
-        // Similar to renderPreviews, but only acts on incomplete previews
-        if (hasPreviews()) {
-            // Do zoomed images first
-            beginRenderScheduling();
-            for (RenderPreview preview : mPreviews) {
-                if (preview.getScale() > 1.2) {
-                    preview.configurationChanged(flags);
-                }
-            }
-            for (RenderPreview preview : mPreviews) {
-                if (preview.getScale() <= 1.2) {
-                    preview.configurationChanged(flags);
-                }
-            }
-            RenderPreview preview = mCanvas.getPreview();
-            if (preview != null) {
-                preview.configurationChanged(flags);
-                preview.dispose();
-            }
-            mNeedLayout = true;
-            mCanvas.redraw();
-        }
-    }
-
-    /** Updates the configuration preview thumbnails */
-    public void renderPreviews() {
-        if (hasPreviews()) {
-            beginRenderScheduling();
-
-            // Process in visual order
-            ArrayList<RenderPreview> visualOrder = new ArrayList<RenderPreview>(mPreviews);
-            Collections.sort(visualOrder, RenderPreview.VISUAL_ORDER);
-
-            // Do zoomed images first
-            for (RenderPreview preview : visualOrder) {
-                if (preview.getScale() > 1.2 && preview.isVisible()) {
-                    scheduleRender(preview);
-                }
-            }
-            // Non-zoomed images
-            for (RenderPreview preview : visualOrder) {
-                if (preview.getScale() <= 1.2 && preview.isVisible()) {
-                    scheduleRender(preview);
-                }
-            }
-        }
-
-        mNeedRender = false;
-    }
-
-    private int mPendingRenderCount;
-
-    /**
-     * Reset rendering scheduling. The next render request will be scheduled
-     * after a single delay unit.
-     */
-    public void beginRenderScheduling() {
-        mPendingRenderCount = 0;
-    }
-
-    /**
-     * Schedule rendering the given preview. Each successive call will add an additional
-     * delay unit to the schedule from the previous {@link #scheduleRender(RenderPreview)}
-     * call, until {@link #beginRenderScheduling()} is called again.
-     *
-     * @param preview the preview to render
-     */
-    public void scheduleRender(@NonNull RenderPreview preview) {
-        mPendingRenderCount++;
-        preview.render(mPendingRenderCount * RENDER_DELAY);
-    }
-
-    /**
-     * Switch to the given configuration preview
-     *
-     * @param preview the preview to switch to
-     */
-    public void switchTo(@NonNull RenderPreview preview) {
-        IFile input = preview.getAlternateInput();
-        if (input != null) {
-            IWorkbenchPartSite site = mCanvas.getEditorDelegate().getEditor().getSite();
-            try {
-                // This switches to the given file, but the file might not have
-                // an identical configuration to what was shown in the preview.
-                // For example, while viewing a 10" layout-xlarge file, it might
-                // show a preview for a 5" version tied to the default layout. If
-                // you click on it, it will open the default layout file, but it might
-                // be using a different screen size; any of those that match the
-                // default layout, say a 3.8".
-                //
-                // Thus, we need to also perform a screen size sync first
-                Configuration configuration = preview.getConfiguration();
-                boolean setSize = false;
-                if (configuration instanceof NestedConfiguration) {
-                    NestedConfiguration nestedConfig = (NestedConfiguration) configuration;
-                    setSize = nestedConfig.isOverridingDevice();
-                    if (configuration instanceof VaryingConfiguration) {
-                        VaryingConfiguration c = (VaryingConfiguration) configuration;
-                        setSize |= c.isAlternatingDevice();
-                    }
-
-                    if (setSize) {
-                        ConfigurationChooser chooser = getChooser();
-                        IFile editedFile = chooser.getEditedFile();
-                        if (editedFile != null) {
-                            chooser.syncToVariations(CFG_DEVICE|CFG_DEVICE_STATE,
-                                    editedFile, configuration, false, false);
-                        }
-                    }
-                }
-
-                IDE.openEditor(site.getWorkbenchWindow().getActivePage(), input,
-                        CommonXmlEditor.ID);
-            } catch (PartInitException e) {
-                AdtPlugin.log(e, null);
-            }
-            return;
-        }
-
-        GraphicalEditorPart editor = mCanvas.getEditorDelegate().getGraphicalEditor();
-        ConfigurationChooser chooser = editor.getConfigurationChooser();
-
-        Configuration originalConfiguration = chooser.getConfiguration();
-
-        // The new configuration is the configuration which will become the configuration
-        // in the layout editor's chooser
-        Configuration previewConfiguration = preview.getConfiguration();
-        Configuration newConfiguration = previewConfiguration;
-        if (newConfiguration instanceof NestedConfiguration) {
-            // Should never use a complementing configuration for the main
-            // rendering's configuration; instead, create a new configuration
-            // with a snapshot of the configuration's current values
-            newConfiguration = Configuration.copy(previewConfiguration);
-
-            // Remap all the previews to be parented to this new copy instead
-            // of the old one (which is no longer controlled by the chooser)
-            for (RenderPreview p : mPreviews) {
-                Configuration configuration = p.getConfiguration();
-                if (configuration instanceof NestedConfiguration) {
-                    NestedConfiguration nested = (NestedConfiguration) configuration;
-                    nested.setParent(newConfiguration);
-                }
-            }
-        }
-
-        // Make a preview for the configuration which *was* showing in the
-        // chooser up until this point:
-        RenderPreview newPreview = mCanvas.getPreview();
-        if (newPreview == null) {
-            newPreview = RenderPreview.create(this, originalConfiguration);
-        }
-
-        // Update its configuration such that it is complementing or inheriting
-        // from the new chosen configuration
-        if (previewConfiguration instanceof VaryingConfiguration) {
-            VaryingConfiguration varying = VaryingConfiguration.create(
-                    (VaryingConfiguration) previewConfiguration,
-                    newConfiguration);
-            varying.updateDisplayName();
-            originalConfiguration = varying;
-            newPreview.setConfiguration(originalConfiguration);
-        } else if (previewConfiguration instanceof NestedConfiguration) {
-            NestedConfiguration nested = NestedConfiguration.create(
-                    (NestedConfiguration) previewConfiguration,
-                    originalConfiguration,
-                    newConfiguration);
-            nested.setDisplayName(nested.computeDisplayName());
-            originalConfiguration = nested;
-            newPreview.setConfiguration(originalConfiguration);
-        }
-
-        // Replace clicked preview with preview of the formerly edited main configuration
-        // This doesn't work yet because the image overlay has had its image
-        // replaced by the configuration previews! I should make a list of them
-        //newPreview.setFullImage(mImageOverlay.getAwtImage());
-        for (int i = 0, n = mPreviews.size(); i < n; i++) {
-            if (preview == mPreviews.get(i)) {
-                mPreviews.set(i, newPreview);
-                break;
-            }
-        }
-
-        // Stash the corresponding preview (not active) on the canvas so we can
-        // retrieve it if clicking to some other preview later
-        mCanvas.setPreview(preview);
-        preview.setVisible(false);
-
-        // Switch to the configuration from the clicked preview (though it's
-        // most likely a copy, see above)
-        chooser.setConfiguration(newConfiguration);
-        editor.changed(MASK_ALL);
-
-        // Scroll to the top again, if necessary
-        mCanvas.getVerticalBar().setSelection(mCanvas.getVerticalBar().getMinimum());
-
-        mNeedLayout = mNeedZoom = true;
-        mCanvas.redraw();
-        mAnimation = new SwapAnimation(preview, newPreview);
-    }
-
-    /**
-     * Gets the preview at the given location, or null if none. This is
-     * currently deeply tied to where things are painted in onPaint().
-     */
-    RenderPreview getPreview(ControlPoint mousePos) {
-        if (hasPreviews()) {
-            int rootX = getX();
-            if (mousePos.x < rootX) {
-                return null;
-            }
-            int rootY = getY();
-
-            for (RenderPreview preview : mPreviews) {
-                int x = rootX + preview.getX();
-                int y = rootY + preview.getY();
-                if (mousePos.x >= x && mousePos.x <= x + preview.getWidth()) {
-                    if (mousePos.y >= y && mousePos.y <= y + preview.getHeight()) {
-                        return preview;
-                    }
-                }
-            }
-        }
-
-        return null;
-    }
-
-    private int getX() {
-        return mHScale.translate(0);
-    }
-
-    private int getY() {
-        return mVScale.translate(0);
-    }
-
-    private int getZoomX() {
-        Rectangle clientArea = mCanvas.getClientArea();
-        int x = clientArea.x + clientArea.width - ZOOM_ICON_WIDTH;
-        if (x < mHScale.getScaledImgSize() + PREVIEW_HGAP) {
-            // No visible previews because the main image is zoomed too far
-            return -1;
-        }
-
-        return x - 6;
-    }
-
-    private int getZoomY() {
-        Rectangle clientArea = mCanvas.getClientArea();
-        return clientArea.y + 5;
-    }
-
-    /**
-     * Returns the height of the layout
-     *
-     * @return the height
-     */
-    public int getHeight() {
-        return mLayoutHeight;
-    }
-
-    /**
-     * Notifies that preview manager that the mouse cursor has moved to the
-     * given control position within the layout canvas
-     *
-     * @param mousePos the mouse position, relative to the layout canvas
-     */
-    public void moved(ControlPoint mousePos) {
-        RenderPreview hovered = getPreview(mousePos);
-        if (hovered != mActivePreview) {
-            if (mActivePreview != null) {
-                mActivePreview.setActive(false);
-            }
-            mActivePreview = hovered;
-            if (mActivePreview != null) {
-                mActivePreview.setActive(true);
-            }
-            mCanvas.redraw();
-        }
-    }
-
-    /**
-     * Notifies that preview manager that the mouse cursor has entered the layout canvas
-     *
-     * @param mousePos the mouse position, relative to the layout canvas
-     */
-    public void enter(ControlPoint mousePos) {
-        moved(mousePos);
-    }
-
-    /**
-     * Notifies that preview manager that the mouse cursor has exited the layout canvas
-     *
-     * @param mousePos the mouse position, relative to the layout canvas
-     */
-    public void exit(ControlPoint mousePos) {
-        if (mActivePreview != null) {
-            mActivePreview.setActive(false);
-        }
-        mActivePreview = null;
-        mCanvas.redraw();
-    }
-
-    /**
-     * Process a mouse click, and return true if it was handled by this manager
-     * (e.g. the click was on a preview)
-     *
-     * @param mousePos the mouse position where the click occurred
-     * @return true if the click occurred over a preview and was handled, false otherwise
-     */
-    public boolean click(ControlPoint mousePos) {
-        // Clicked zoom?
-        int x = getZoomX();
-        if (x > 0) {
-            if (mousePos.x >= x && mousePos.x <= x + ZOOM_ICON_WIDTH) {
-                int y = getZoomY();
-                if (mousePos.y >= y && mousePos.y <= y + 4 * ZOOM_ICON_HEIGHT) {
-                    if (mousePos.y < y + ZOOM_ICON_HEIGHT) {
-                        zoomIn();
-                    } else if (mousePos.y < y + 2 * ZOOM_ICON_HEIGHT) {
-                        zoomOut();
-                    } else if (mousePos.y < y + 3 * ZOOM_ICON_HEIGHT) {
-                        zoomReset();
-                    } else {
-                        selectMode(NONE);
-                    }
-                    return true;
-                }
-            }
-        }
-
-        RenderPreview preview = getPreview(mousePos);
-        if (preview != null) {
-            boolean handled = preview.click(mousePos.x - getX() - preview.getX(),
-                    mousePos.y - getY() - preview.getY());
-            if (handled) {
-                // In case layout was performed, there could be a new preview
-                // under this coordinate now, so make sure it's hover etc
-                // shows up
-                moved(mousePos);
-                return true;
-            }
-        }
-
-        return false;
-    }
-
-    /**
-     * Returns true if there are thumbnail previews
-     *
-     * @return true if thumbnails are being shown
-     */
-    public boolean hasPreviews() {
-        return mPreviews != null && !mPreviews.isEmpty();
-    }
-
-
-    private void sortPreviewsByScreenSize() {
-        if (mPreviews != null) {
-            Collections.sort(mPreviews, new Comparator<RenderPreview>() {
-                @Override
-                public int compare(RenderPreview preview1, RenderPreview preview2) {
-                    Configuration config1 = preview1.getConfiguration();
-                    Configuration config2 = preview2.getConfiguration();
-                    Device device1 = config1.getDevice();
-                    Device device2 = config1.getDevice();
-                    if (device1 != null && device2 != null) {
-                        Screen screen1 = device1.getDefaultHardware().getScreen();
-                        Screen screen2 = device2.getDefaultHardware().getScreen();
-                        if (screen1 != null && screen2 != null) {
-                            double delta = screen1.getDiagonalLength()
-                                    - screen2.getDiagonalLength();
-                            if (delta != 0.0) {
-                                return (int) Math.signum(delta);
-                            } else {
-                                if (screen1.getPixelDensity() != screen2.getPixelDensity()) {
-                                    return screen1.getPixelDensity().compareTo(
-                                            screen2.getPixelDensity());
-                                }
-                            }
-                        }
-
-                    }
-                    State state1 = config1.getDeviceState();
-                    State state2 = config2.getDeviceState();
-                    if (state1 != state2 && state1 != null && state2 != null) {
-                        return state1.getName().compareTo(state2.getName());
-                    }
-
-                    return preview1.getDisplayName().compareTo(preview2.getDisplayName());
-                }
-            });
-        }
-    }
-
-    private void sortPreviewsByOrientation() {
-        if (mPreviews != null) {
-            Collections.sort(mPreviews, new Comparator<RenderPreview>() {
-                @Override
-                public int compare(RenderPreview preview1, RenderPreview preview2) {
-                    Configuration config1 = preview1.getConfiguration();
-                    Configuration config2 = preview2.getConfiguration();
-                    State state1 = config1.getDeviceState();
-                    State state2 = config2.getDeviceState();
-                    if (state1 != state2 && state1 != null && state2 != null) {
-                        return state1.getName().compareTo(state2.getName());
-                    }
-
-                    return preview1.getDisplayName().compareTo(preview2.getDisplayName());
-                }
-            });
-        }
-    }
-
-    /**
-     * Vertical scrollbar listener which updates render previews which are not
-     * visible and triggers a redraw
-     */
-    private class ScrollBarListener implements SelectionListener {
-        @Override
-        public void widgetSelected(SelectionEvent e) {
-            if (mPreviews == null) {
-                return;
-            }
-
-            ScrollBar bar = mCanvas.getVerticalBar();
-            int selection = bar.getSelection();
-            int thumb = bar.getThumb();
-            int maxY = selection + thumb;
-            beginRenderScheduling();
-            for (RenderPreview preview : mPreviews) {
-                if (!preview.isVisible() && preview.getY() <= maxY) {
-                    preview.setVisible(true);
-                }
-            }
-        }
-
-        @Override
-        public void widgetDefaultSelected(SelectionEvent e) {
-        }
-    }
-
-    /** Animation overlay shown briefly after swapping two previews */
-    private class SwapAnimation implements Runnable {
-        private long begin;
-        private long end;
-        private static final long DURATION = 400; // ms
-        private Rect initialRect1;
-        private Rect targetRect1;
-        private Rect initialRect2;
-        private Rect targetRect2;
-        private RenderPreview preview;
-
-        SwapAnimation(RenderPreview preview1, RenderPreview preview2) {
-            begin = System.currentTimeMillis();
-            end = begin + DURATION;
-
-            initialRect1 = new Rect(preview1.getX(), preview1.getY(),
-                    preview1.getWidth(), preview1.getHeight());
-
-            CanvasTransform hi = mCanvas.getHorizontalTransform();
-            CanvasTransform vi = mCanvas.getVerticalTransform();
-            initialRect2 = new Rect(hi.translate(0), vi.translate(0),
-                    hi.getScaledImgSize(), vi.getScaledImgSize());
-            preview = preview2;
-        }
-
-        void tick(GC gc) {
-            long now = System.currentTimeMillis();
-            if (now > end || mCanvas.isDisposed()) {
-                mAnimation = null;
-                return;
-            }
-
-            CanvasTransform hi = mCanvas.getHorizontalTransform();
-            CanvasTransform vi = mCanvas.getVerticalTransform();
-            if (targetRect1 == null) {
-                targetRect1 = new Rect(hi.translate(0), vi.translate(0),
-                    hi.getScaledImgSize(), vi.getScaledImgSize());
-            }
-            double portion = (now - begin) / (double) DURATION;
-            Rect rect1 = new Rect(
-                    (int) (portion * (targetRect1.x - initialRect1.x) + initialRect1.x),
-                    (int) (portion * (targetRect1.y - initialRect1.y) + initialRect1.y),
-                    (int) (portion * (targetRect1.w - initialRect1.w) + initialRect1.w),
-                    (int) (portion * (targetRect1.h - initialRect1.h) + initialRect1.h));
-
-            if (targetRect2 == null) {
-                targetRect2 = new Rect(preview.getX(), preview.getY(),
-                        preview.getWidth(), preview.getHeight());
-            }
-            portion = (now - begin) / (double) DURATION;
-            Rect rect2 = new Rect(
-                (int) (portion * (targetRect2.x - initialRect2.x) + initialRect2.x),
-                (int) (portion * (targetRect2.y - initialRect2.y) + initialRect2.y),
-                (int) (portion * (targetRect2.w - initialRect2.w) + initialRect2.w),
-                (int) (portion * (targetRect2.h - initialRect2.h) + initialRect2.h));
-
-            gc.setForeground(gc.getDevice().getSystemColor(SWT.COLOR_GRAY));
-            gc.drawRectangle(rect1.x, rect1.y, rect1.w, rect1.h);
-            gc.drawRectangle(rect2.x, rect2.y, rect2.w, rect2.h);
-
-            mCanvas.getDisplay().timerExec(5, this);
-        }
-
-        @Override
-        public void run() {
-            mCanvas.redraw();
-        }
-    }
-
-    /**
-     * Notifies the {@linkplain RenderPreviewManager} that the configuration used
-     * in the main chooser has been changed. This may require updating parent references
-     * in the preview configurations inheriting from it.
-     *
-     * @param oldConfiguration the previous configuration
-     * @param newConfiguration the new configuration in the chooser
-     */
-    public void updateChooserConfig(
-            @NonNull Configuration oldConfiguration,
-            @NonNull Configuration newConfiguration) {
-        if (hasPreviews()) {
-            for (RenderPreview preview : mPreviews) {
-                Configuration configuration = preview.getConfiguration();
-                if (configuration instanceof NestedConfiguration) {
-                    NestedConfiguration nestedConfig = (NestedConfiguration) configuration;
-                    if (nestedConfig.getParent() == oldConfiguration) {
-                        nestedConfig.setParent(newConfiguration);
-                    }
-                }
-            }
-        }
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/RenderPreviewMode.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/RenderPreviewMode.java
deleted file mode 100644
index 0f06d7f..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/RenderPreviewMode.java
+++ /dev/null
@@ -1,43 +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.ide.eclipse.adt.internal.editors.layout.gle2;
-
-/**
- * The {@linkplain RenderPreviewMode} records what type of configurations to
- * render in the layout editor
- */
-public enum RenderPreviewMode {
-    /** Generate a set of default previews with maximum variation */
-    DEFAULT,
-
-    /** Preview all the locales */
-    LOCALES,
-
-    /** Preview all the screen sizes */
-    SCREENS,
-
-    /** Preview layout as included in other layouts */
-    INCLUDES,
-
-    /** Preview all the variations of this layout */
-    VARIATIONS,
-
-    /** Show a manually configured set of previews */
-    CUSTOM,
-
-    /** No previews */
-    NONE;
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/RenderService.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/RenderService.java
deleted file mode 100644
index 3b9e2fc..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/RenderService.java
+++ /dev/null
@@ -1,668 +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.eclipse.adt.internal.editors.layout.gle2;
-
-import static com.android.SdkConstants.LAYOUT_RESOURCE_PREFIX;
-
-import com.android.annotations.NonNull;
-import com.android.ide.common.api.IClientRulesEngine;
-import com.android.ide.common.api.INode;
-import com.android.ide.common.api.Rect;
-import com.android.ide.common.rendering.HardwareConfigHelper;
-import com.android.ide.common.rendering.LayoutLibrary;
-import com.android.ide.common.rendering.RenderSecurityManager;
-import com.android.ide.common.rendering.api.AssetRepository;
-import com.android.ide.common.rendering.api.Capability;
-import com.android.ide.common.rendering.api.DrawableParams;
-import com.android.ide.common.rendering.api.HardwareConfig;
-import com.android.ide.common.rendering.api.IImageFactory;
-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.SessionParams;
-import com.android.ide.common.rendering.api.SessionParams.RenderingMode;
-import com.android.ide.common.rendering.api.ViewInfo;
-import com.android.ide.common.resources.ResourceResolver;
-import com.android.ide.common.resources.configuration.FolderConfiguration;
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.ide.eclipse.adt.AdtUtils;
-import com.android.ide.eclipse.adt.internal.editors.layout.ContextPullParser;
-import com.android.ide.eclipse.adt.internal.editors.layout.ProjectCallback;
-import com.android.ide.eclipse.adt.internal.editors.layout.UiElementPullParser;
-import com.android.ide.eclipse.adt.internal.editors.layout.configuration.Configuration;
-import com.android.ide.eclipse.adt.internal.editors.layout.configuration.ConfigurationChooser;
-import com.android.ide.eclipse.adt.internal.editors.layout.configuration.Locale;
-import com.android.ide.eclipse.adt.internal.editors.layout.gle2.IncludeFinder.Reference;
-import com.android.ide.eclipse.adt.internal.editors.layout.gre.NodeFactory;
-import com.android.ide.eclipse.adt.internal.editors.layout.gre.NodeProxy;
-import com.android.ide.eclipse.adt.internal.editors.layout.uimodel.UiViewElementNode;
-import com.android.ide.eclipse.adt.internal.editors.manifest.ManifestInfo;
-import com.android.ide.eclipse.adt.internal.editors.manifest.ManifestInfo.ActivityAttributes;
-import com.android.ide.eclipse.adt.internal.editors.uimodel.UiDocumentNode;
-import com.android.ide.eclipse.adt.internal.editors.uimodel.UiElementNode;
-import com.android.ide.eclipse.adt.internal.sdk.AndroidTargetData;
-import com.android.ide.eclipse.adt.internal.sdk.Sdk;
-import com.android.sdklib.IAndroidTarget;
-import com.android.sdklib.devices.Device;
-import com.google.common.base.Charsets;
-import com.google.common.io.Files;
-
-import org.eclipse.core.resources.IProject;
-import org.xmlpull.v1.XmlPullParser;
-import org.xmlpull.v1.XmlPullParserException;
-
-import java.awt.Toolkit;
-import java.awt.image.BufferedImage;
-import java.io.File;
-import java.io.IOException;
-import java.io.StringReader;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-/**
- * The {@link RenderService} provides rendering and layout information for
- * Android layouts. This is a wrapper around the layout library.
- */
-public class RenderService {
-    private static final Object RENDERING_LOCK = new Object();
-
-    /** Reference to the file being edited. Can also be used to access the {@link IProject}. */
-    private final GraphicalEditorPart mEditor;
-
-    // The following fields are inferred from the editor and not customizable by the
-    // client of the render service:
-
-    private final IProject mProject;
-    private final ProjectCallback mProjectCallback;
-    private final ResourceResolver mResourceResolver;
-    private final int mMinSdkVersion;
-    private final int mTargetSdkVersion;
-    private final LayoutLibrary mLayoutLib;
-    private final IImageFactory mImageFactory;
-    private final HardwareConfigHelper mHardwareConfigHelper;
-    private final Locale mLocale;
-
-    // The following fields are optional or configurable using the various chained
-    // setters:
-
-    private UiDocumentNode mModel;
-    private Reference mIncludedWithin;
-    private RenderingMode mRenderingMode = RenderingMode.NORMAL;
-    private LayoutLog mLogger;
-    private Integer mOverrideBgColor;
-    private boolean mShowDecorations = true;
-    private Set<UiElementNode> mExpandNodes = Collections.<UiElementNode>emptySet();
-    private final Object mCredential;
-
-    /** Use the {@link #create} factory instead */
-    private RenderService(GraphicalEditorPart editor, Object credential) {
-        mEditor = editor;
-        mCredential = credential;
-
-        mProject = editor.getProject();
-        LayoutCanvas canvas = editor.getCanvasControl();
-        mImageFactory = canvas.getImageOverlay();
-        ConfigurationChooser chooser = editor.getConfigurationChooser();
-        Configuration config = chooser.getConfiguration();
-        FolderConfiguration folderConfig = config.getFullConfig();
-
-        Device device = config.getDevice();
-        assert device != null; // Should only attempt render with configuration that has device
-        mHardwareConfigHelper = new HardwareConfigHelper(device);
-        mHardwareConfigHelper.setOrientation(
-                folderConfig.getScreenOrientationQualifier().getValue());
-
-        mLayoutLib = editor.getReadyLayoutLib(true /*displayError*/);
-        mResourceResolver = editor.getResourceResolver();
-        mProjectCallback = editor.getProjectCallback(true /*reset*/, mLayoutLib);
-        mMinSdkVersion = editor.getMinSdkVersion();
-        mTargetSdkVersion = editor.getTargetSdkVersion();
-        mLocale = config.getLocale();
-    }
-
-    private RenderService(GraphicalEditorPart editor,
-            Configuration configuration, ResourceResolver resourceResolver,
-            Object credential) {
-        mEditor = editor;
-        mCredential = credential;
-
-        mProject = editor.getProject();
-        LayoutCanvas canvas = editor.getCanvasControl();
-        mImageFactory = canvas.getImageOverlay();
-        FolderConfiguration folderConfig = configuration.getFullConfig();
-
-        Device device = configuration.getDevice();
-        assert device != null;
-        mHardwareConfigHelper = new HardwareConfigHelper(device);
-        mHardwareConfigHelper.setOrientation(
-                folderConfig.getScreenOrientationQualifier().getValue());
-
-        mLayoutLib = editor.getReadyLayoutLib(true /*displayError*/);
-        mResourceResolver =  resourceResolver != null ? resourceResolver : editor.getResourceResolver();
-        mProjectCallback = editor.getProjectCallback(true /*reset*/, mLayoutLib);
-        mMinSdkVersion = editor.getMinSdkVersion();
-        mTargetSdkVersion = editor.getTargetSdkVersion();
-        mLocale = configuration.getLocale();
-    }
-
-    private RenderSecurityManager createSecurityManager() {
-        String projectPath = null;
-        String sdkPath = null;
-        if (RenderSecurityManager.RESTRICT_READS) {
-            projectPath = AdtUtils.getAbsolutePath(mProject).toFile().getPath();
-            Sdk sdk = Sdk.getCurrent();
-            sdkPath = sdk != null ? sdk.getSdkOsLocation() : null;
-        }
-        RenderSecurityManager securityManager = new RenderSecurityManager(sdkPath, projectPath);
-        securityManager.setLogger(AdtPlugin.getDefault());
-
-        // Make sure this is initialized before we attempt to use it from layoutlib
-        Toolkit.getDefaultToolkit();
-
-        return securityManager;
-      }
-
-    /**
-     * Returns true if this configuration supports the given rendering
-     * capability
-     *
-     * @param target the target to look up the layout library for
-     * @param capability the capability to check
-     * @return true if the capability is supported
-     */
-    public static boolean supports(
-            @NonNull IAndroidTarget target,
-            @NonNull Capability capability) {
-        Sdk sdk = Sdk.getCurrent();
-        if (sdk != null) {
-            AndroidTargetData targetData = sdk.getTargetData(target);
-            if (targetData != null) {
-                LayoutLibrary layoutLib = targetData.getLayoutLibrary();
-                if (layoutLib != null) {
-                    return layoutLib.supports(capability);
-                }
-            }
-        }
-
-        return false;
-    }
-
-    /**
-     * Creates a new {@link RenderService} associated with the given editor.
-     *
-     * @param editor the editor to provide configuration data such as the render target
-     * @return a {@link RenderService} which can perform rendering services
-     */
-    public static RenderService create(GraphicalEditorPart editor) {
-        // Delegate to editor such that it can pass its credential to the service
-        return editor.createRenderService();
-    }
-
-    /**
-     * Creates a new {@link RenderService} associated with the given editor.
-     *
-     * @param editor the editor to provide configuration data such as the render target
-     * @param credential the sandbox credential
-     * @return a {@link RenderService} which can perform rendering services
-     */
-    @NonNull
-    public static RenderService create(GraphicalEditorPart editor, Object credential) {
-        return new RenderService(editor, credential);
-    }
-
-    /**
-     * Creates a new {@link RenderService} associated with the given editor.
-     *
-     * @param editor the editor to provide configuration data such as the render target
-     * @param configuration the configuration to use (and fallback to editor for the rest)
-     * @param resolver a resource resolver to use to look up resources
-     * @return a {@link RenderService} which can perform rendering services
-     */
-    public static RenderService create(GraphicalEditorPart editor,
-            Configuration configuration, ResourceResolver resolver) {
-        // Delegate to editor such that it can pass its credential to the service
-        return editor.createRenderService(configuration, resolver);
-    }
-
-    /**
-     * Creates a new {@link RenderService} associated with the given editor.
-     *
-     * @param editor the editor to provide configuration data such as the render target
-     * @param configuration the configuration to use (and fallback to editor for the rest)
-     * @param resolver a resource resolver to use to look up resources
-     * @param credential the sandbox credential
-     * @return a {@link RenderService} which can perform rendering services
-     */
-    public static RenderService create(GraphicalEditorPart editor,
-            Configuration configuration, ResourceResolver resolver, Object credential) {
-        return new RenderService(editor, configuration, resolver, credential);
-    }
-
-    /**
-     * Renders the given model, using this editor's theme and screen settings, and returns
-     * the result as a {@link RenderSession}.
-     *
-     * @param model the model to be rendered, which can be different than the editor's own
-     *            {@link #getModel()}.
-     * @param width the width to use for the layout, or -1 to use the width of the screen
-     *            associated with this editor
-     * @param height the height to use for the layout, or -1 to use the height of the screen
-     *            associated with this editor
-     * @param explodeNodes a set of nodes to explode, or null for none
-     * @param overrideBgColor If non-null, use the given color as a background to render over
-     *        rather than the normal background requested by the theme
-     * @param noDecor If true, don't draw window decorations like the system bar
-     * @param logger a logger where rendering errors are reported
-     * @param renderingMode the {@link RenderingMode} to use for rendering
-     * @return the resulting rendered image wrapped in an {@link RenderSession}
-     */
-
-    /**
-     * Sets the {@link LayoutLog} to be used during rendering. If none is specified, a
-     * silent logger will be used.
-     *
-     * @param logger the log to be used
-     * @return this (such that chains of setters can be stringed together)
-     */
-    public RenderService setLog(LayoutLog logger) {
-        mLogger = logger;
-        return this;
-    }
-
-    /**
-     * Sets the model to be rendered, which can be different than the editor's own
-     * {@link GraphicalEditorPart#getModel()}.
-     *
-     * @param model the model to be rendered
-     * @return this (such that chains of setters can be stringed together)
-     */
-    public RenderService setModel(UiDocumentNode model) {
-        mModel = model;
-        return this;
-    }
-
-    /**
-     * Overrides the width and height to be used during rendering (which might be adjusted if
-     * the {@link #setRenderingMode(RenderingMode)} is {@link RenderingMode#FULL_EXPAND}.
-     *
-     * A value of -1 will make the rendering use the normal width and height coming from the
-     * {@link Configuration#getDevice()} 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)
-     */
-    public RenderService setOverrideRenderSize(int overrideRenderWidth, int overrideRenderHeight) {
-        mHardwareConfigHelper.setOverrideRenderSize(overrideRenderWidth, overrideRenderHeight);
-        return this;
-    }
-
-    /**
-     * Sets the max width and height to be used during rendering (which might be adjusted if
-     * the {@link #setRenderingMode(RenderingMode)} is {@link RenderingMode#FULL_EXPAND}.
-     *
-     * A value of -1 will make the rendering use the normal width and height coming from the
-     * {@link Configuration#getDevice()} 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)
-     */
-    public RenderService setMaxRenderSize(int maxRenderWidth, int maxRenderHeight) {
-        mHardwareConfigHelper.setMaxRenderSize(maxRenderWidth, maxRenderHeight);
-        return this;
-    }
-
-    /**
-     * Sets the {@link RenderingMode} to be used during rendering. If none is specified,
-     * the default is {@link RenderingMode#NORMAL}.
-     *
-     * @param renderingMode the rendering mode to be used
-     * @return this (such that chains of setters can be stringed together)
-     */
-    public RenderService setRenderingMode(RenderingMode renderingMode) {
-        mRenderingMode = renderingMode;
-        return this;
-    }
-
-    /**
-     * Sets the overriding background color to be used, if any. The color should be a
-     * bitmask of AARRGGBB. The default is null.
-     *
-     * @param overrideBgColor the overriding background color to be used in the rendering,
-     *            in the form of a AARRGGBB bitmask, or null to use no custom background.
-     * @return this (such that chains of setters can be stringed together)
-     */
-    public RenderService setOverrideBgColor(Integer overrideBgColor) {
-        mOverrideBgColor = overrideBgColor;
-        return this;
-    }
-
-    /**
-     * Sets whether the rendering should include decorations such as a system bar, an
-     * application bar etc depending on the SDK target and theme. The default is true.
-     *
-     * @param showDecorations true if the rendering should include system bars etc.
-     * @return this (such that chains of setters can be stringed together)
-     */
-    public RenderService setDecorations(boolean showDecorations) {
-        mShowDecorations = showDecorations;
-        return this;
-    }
-
-    /**
-     * Sets the nodes to expand during rendering. These will be padded with approximately
-     * 20 pixels and also highlighted by the {@link EmptyViewsOverlay}. The default is an
-     * empty collection.
-     *
-     * @param nodesToExpand the nodes to be expanded
-     * @return this (such that chains of setters can be stringed together)
-     */
-    public RenderService setNodesToExpand(Set<UiElementNode> nodesToExpand) {
-        mExpandNodes = nodesToExpand;
-        return this;
-    }
-
-    /**
-     * Sets the {@link Reference} to an outer layout that this layout should be rendered
-     * within. The outer layout <b>must</b> contain an include tag which points to this
-     * layout. The default is null.
-     *
-     * @param includedWithin a reference to an outer layout to render this layout within
-     * @return this (such that chains of setters can be stringed together)
-     */
-    public RenderService setIncludedWithin(Reference includedWithin) {
-        mIncludedWithin = includedWithin;
-        return this;
-    }
-
-    /** Initializes any remaining optional fields after all setters have been called */
-    private void finishConfiguration() {
-        if (mLogger == null) {
-            // Silent logging
-            mLogger = new LayoutLog();
-        }
-    }
-
-    /**
-     * Renders the model and returns the result as a {@link RenderSession}.
-     * @return the {@link RenderSession} resulting from rendering the current model
-     */
-    public RenderSession createRenderSession() {
-        assert mModel != null : "Incomplete service config";
-        finishConfiguration();
-
-        if (mResourceResolver == null) {
-            // Abort the rendering if the resources are not found.
-            return null;
-        }
-
-        HardwareConfig hardwareConfig = mHardwareConfigHelper.getConfig();
-
-        UiElementPullParser modelParser = new UiElementPullParser(mModel,
-                false, mExpandNodes, hardwareConfig.getDensity(), mProject);
-        ILayoutPullParser topParser = modelParser;
-
-        // Code to support editing included layout
-        // first reset the layout parser just in case.
-        mProjectCallback.setLayoutParser(null, null);
-
-        if (mIncludedWithin != null) {
-            // Outer layout name:
-            String contextLayoutName = mIncludedWithin.getName();
-
-            // Find the layout file.
-            ResourceValue contextLayout = mResourceResolver.findResValue(
-                    LAYOUT_RESOURCE_PREFIX + contextLayoutName, false  /* forceFrameworkOnly*/);
-            if (contextLayout != null) {
-                File layoutFile = new File(contextLayout.getValue());
-                if (layoutFile.isFile()) {
-                    try {
-                        // Get the name of the layout actually being edited, without the extension
-                        // as it's what IXmlPullParser.getParser(String) will receive.
-                        String queryLayoutName = mEditor.getLayoutResourceName();
-                        mProjectCallback.setLayoutParser(queryLayoutName, modelParser);
-                        topParser = new ContextPullParser(mProjectCallback, layoutFile);
-                        topParser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, true);
-                        String xmlText = Files.toString(layoutFile, Charsets.UTF_8);
-                        topParser.setInput(new StringReader(xmlText));
-                    } catch (IOException e) {
-                        AdtPlugin.log(e, null);
-                    } catch (XmlPullParserException e) {
-                        AdtPlugin.log(e, null);
-                    }
-                }
-            }
-        }
-
-        SessionParams params = new SessionParams(
-                topParser,
-                mRenderingMode,
-                mProject /* projectKey */,
-                hardwareConfig,
-                mResourceResolver,
-                mProjectCallback,
-                mMinSdkVersion,
-                mTargetSdkVersion,
-                mLogger);
-
-        // Request margin and baseline information.
-        // TODO: Be smarter about setting this; start without it, and on the first request
-        // for an extended view info, re-render in the same session, and then set a flag
-        // which will cause this to create extended view info each time from then on in the
-        // same session
-        params.setExtendedViewInfoMode(true);
-
-        params.setLocale(mLocale.toLocaleId());
-        params.setAssetRepository(new AssetRepository());
-
-        ManifestInfo manifestInfo = ManifestInfo.get(mProject);
-        try {
-            params.setRtlSupport(manifestInfo.isRtlSupported());
-        } catch (Exception e) {
-            // ignore.
-        }
-        if (!mShowDecorations) {
-            params.setForceNoDecor();
-        } else {
-            try {
-                params.setAppLabel(manifestInfo.getApplicationLabel());
-                params.setAppIcon(manifestInfo.getApplicationIcon());
-                String activity = mEditor.getConfigurationChooser().getConfiguration().getActivity();
-                if (activity != null) {
-                    ActivityAttributes info = manifestInfo.getActivityAttributes(activity);
-                    if (info != null) {
-                        if (info.getLabel() != null) {
-                            params.setAppLabel(info.getLabel());
-                        }
-                        if (info.getIcon() != null) {
-                            params.setAppIcon(info.getIcon());
-                        }
-                    }
-                }
-            } catch (Exception e) {
-                // ignore.
-            }
-        }
-
-        if (mOverrideBgColor != null) {
-            params.setOverrideBgColor(mOverrideBgColor.intValue());
-        }
-
-        // set the Image Overlay as the image factory.
-        params.setImageFactory(mImageFactory);
-
-        mProjectCallback.setLogger(mLogger);
-        mProjectCallback.setResourceResolver(mResourceResolver);
-        RenderSecurityManager securityManager = createSecurityManager();
-        try {
-            securityManager.setActive(true, mCredential);
-            synchronized (RENDERING_LOCK) {
-                return mLayoutLib.createSession(params);
-            }
-        } catch (RuntimeException t) {
-            // Exceptions from the bridge
-            mLogger.error(null, t.getLocalizedMessage(), t, null);
-            throw t;
-        } finally {
-            securityManager.dispose(mCredential);
-            mProjectCallback.setLogger(null);
-            mProjectCallback.setResourceResolver(null);
-        }
-    }
-
-    /**
-     * Renders the given resource value (which should refer to a drawable) and returns it
-     * as an image
-     *
-     * @param drawableResourceValue the drawable resource value to be rendered, or null
-     * @return the image, or null if something went wrong
-     */
-    public BufferedImage renderDrawable(ResourceValue drawableResourceValue) {
-        if (drawableResourceValue == null) {
-            return null;
-        }
-
-        finishConfiguration();
-
-        HardwareConfig hardwareConfig = mHardwareConfigHelper.getConfig();
-
-        DrawableParams params = new DrawableParams(drawableResourceValue, mProject, hardwareConfig,
-                mResourceResolver, mProjectCallback, mMinSdkVersion,
-                mTargetSdkVersion, mLogger);
-        params.setAssetRepository(new AssetRepository());
-        params.setForceNoDecor();
-        Result result = mLayoutLib.renderDrawable(params);
-        if (result != null && result.isSuccess()) {
-            Object data = result.getData();
-            if (data instanceof BufferedImage) {
-                return (BufferedImage) data;
-            }
-        }
-
-        return null;
-    }
-
-    /**
-     * Measure the children of the given parent node, applying the given filter to the
-     * pull parser's attribute values.
-     *
-     * @param parent the parent node to measure children for
-     * @param filter the filter to apply to the attribute values
-     * @return a map from node children of the parent to new bounds of the nodes
-     */
-    public Map<INode, Rect> measureChildren(INode parent,
-            final IClientRulesEngine.AttributeFilter filter) {
-        finishConfiguration();
-        HardwareConfig hardwareConfig = mHardwareConfigHelper.getConfig();
-
-        final NodeFactory mNodeFactory = mEditor.getCanvasControl().getNodeFactory();
-        UiElementNode parentNode = ((NodeProxy) parent).getNode();
-        UiElementPullParser topParser = new UiElementPullParser(parentNode,
-                false, Collections.<UiElementNode>emptySet(), hardwareConfig.getDensity(),
-                mProject) {
-            @Override
-            public String getAttributeValue(String namespace, String localName) {
-                if (filter != null) {
-                    Object cookie = getViewCookie();
-                    if (cookie instanceof UiViewElementNode) {
-                        NodeProxy node = mNodeFactory.create((UiViewElementNode) cookie);
-                        if (node != null) {
-                            String value = filter.getAttribute(node, namespace, localName);
-                            if (value != null) {
-                                return value;
-                            }
-                            // null means no preference, not "unset".
-                        }
-                    }
-                }
-
-                return super.getAttributeValue(namespace, localName);
-            }
-
-            /**
-             * The parser usually assumes that the top level node is a document node that
-             * should be skipped, and that's not the case when we render in the middle of
-             * the tree, so override {@link UiElementPullParser#onNextFromStartDocument}
-             * to change this behavior
-             */
-            @Override
-            public void onNextFromStartDocument() {
-                mParsingState = START_TAG;
-            }
-        };
-
-        SessionParams params = new SessionParams(
-                topParser,
-                RenderingMode.FULL_EXPAND,
-                mProject /* projectKey */,
-                hardwareConfig,
-                mResourceResolver,
-                mProjectCallback,
-                mMinSdkVersion,
-                mTargetSdkVersion,
-                mLogger);
-        params.setLayoutOnly();
-        params.setForceNoDecor();
-        params.setAssetRepository(new AssetRepository());
-
-        RenderSession session = null;
-        mProjectCallback.setLogger(mLogger);
-        mProjectCallback.setResourceResolver(mResourceResolver);
-        RenderSecurityManager securityManager = createSecurityManager();
-        try {
-            securityManager.setActive(true, mCredential);
-            synchronized (RENDERING_LOCK) {
-                session = mLayoutLib.createSession(params);
-            }
-            if (session.getResult().isSuccess()) {
-                assert session.getRootViews().size() == 1;
-                ViewInfo root = session.getRootViews().get(0);
-                List<ViewInfo> children = root.getChildren();
-                Map<INode, Rect> map = new HashMap<INode, Rect>(children.size());
-                for (ViewInfo info : children) {
-                    if (info.getCookie() instanceof UiViewElementNode) {
-                        UiViewElementNode uiNode = (UiViewElementNode) info.getCookie();
-                        NodeProxy node = mNodeFactory.create(uiNode);
-                        map.put(node, new Rect(info.getLeft(), info.getTop(),
-                                info.getRight() - info.getLeft(),
-                                info.getBottom() - info.getTop()));
-                    }
-                }
-
-                return map;
-            }
-        } catch (RuntimeException t) {
-            // Exceptions from the bridge
-            mLogger.error(null, t.getLocalizedMessage(), t, null);
-            throw t;
-        } finally {
-            securityManager.dispose(mCredential);
-            mProjectCallback.setLogger(null);
-            mProjectCallback.setResourceResolver(null);
-            if (session != null) {
-                session.dispose();
-            }
-        }
-
-        return null;
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/ResizeGesture.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/ResizeGesture.java
deleted file mode 100644
index 4d51c07..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/ResizeGesture.java
+++ /dev/null
@@ -1,279 +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.eclipse.adt.internal.editors.layout.gle2;
-
-import com.android.ide.common.api.DropFeedback;
-import com.android.ide.common.api.Rect;
-import com.android.ide.common.api.ResizePolicy;
-import com.android.ide.common.api.SegmentType;
-import com.android.ide.eclipse.adt.internal.editors.layout.gle2.SelectionHandle.Position;
-import com.android.ide.eclipse.adt.internal.editors.layout.gre.NodeProxy;
-import com.android.ide.eclipse.adt.internal.editors.layout.gre.RulesEngine;
-import com.android.utils.Pair;
-
-import org.eclipse.swt.events.KeyEvent;
-import org.eclipse.swt.graphics.GC;
-
-import java.util.Collections;
-import java.util.List;
-
-/**
- * A {@link ResizeGesture} is a gesture for resizing a selected widget. It is initiated
- * by a drag of a {@link SelectionHandle}.
- */
-public class ResizeGesture extends Gesture {
-    /** The {@link Overlay} drawn for the gesture feedback. */
-    private ResizeOverlay mOverlay;
-
-    /** The canvas associated with this gesture. */
-    private LayoutCanvas mCanvas;
-
-    /** The selection handle we're dragging to perform this resize */
-    private SelectionHandle mHandle;
-
-    private NodeProxy mParentNode;
-    private NodeProxy mChildNode;
-    private DropFeedback mFeedback;
-    private ResizePolicy mResizePolicy;
-    private SegmentType mHorizontalEdge;
-    private SegmentType mVerticalEdge;
-
-    /**
-     * Creates a new marquee selection (selection swiping).
-     *
-     * @param canvas The canvas where selection is performed.
-     * @param item The selected item the handle corresponds to
-     * @param handle The handle being dragged to perform the resize
-     */
-    public ResizeGesture(LayoutCanvas canvas, SelectionItem item, SelectionHandle handle) {
-        mCanvas = canvas;
-        mHandle = handle;
-
-        mChildNode = item.getNode();
-        mParentNode = (NodeProxy) mChildNode.getParent();
-        mResizePolicy = item.getResizePolicy();
-        mHorizontalEdge = getHorizontalEdgeType(mHandle);
-        mVerticalEdge = getVerticalEdgeType(mHandle);
-    }
-
-    @Override
-    public void begin(ControlPoint pos, int startMask) {
-        super.begin(pos, startMask);
-
-        mCanvas.getSelectionOverlay().setHidden(true);
-
-        RulesEngine rulesEngine = mCanvas.getRulesEngine();
-        Rect newBounds = getNewBounds(pos);
-        ViewHierarchy viewHierarchy = mCanvas.getViewHierarchy();
-        CanvasViewInfo childInfo = viewHierarchy.findViewInfoFor(mChildNode);
-        CanvasViewInfo parentInfo = viewHierarchy.findViewInfoFor(mParentNode);
-        Object childView = childInfo != null ? childInfo.getViewObject() : null;
-        Object parentView = parentInfo != null ? parentInfo.getViewObject() : null;
-        mFeedback = rulesEngine.callOnResizeBegin(mChildNode, mParentNode, newBounds,
-                mHorizontalEdge, mVerticalEdge, childView, parentView);
-        update(pos);
-        mCanvas.getGestureManager().updateMessage(mFeedback);
-    }
-
-    @Override
-    public boolean keyPressed(KeyEvent event) {
-        update(mCanvas.getGestureManager().getCurrentControlPoint());
-        mCanvas.redraw();
-        return true;
-    }
-
-    @Override
-    public boolean keyReleased(KeyEvent event) {
-        update(mCanvas.getGestureManager().getCurrentControlPoint());
-        mCanvas.redraw();
-        return true;
-    }
-
-    @Override
-    public void update(ControlPoint pos) {
-        super.update(pos);
-        RulesEngine rulesEngine = mCanvas.getRulesEngine();
-        Rect newBounds = getNewBounds(pos);
-        int modifierMask = mCanvas.getGestureManager().getRuleModifierMask();
-        rulesEngine.callOnResizeUpdate(mFeedback, mChildNode, mParentNode, newBounds,
-                modifierMask);
-        mCanvas.getGestureManager().updateMessage(mFeedback);
-    }
-
-    @Override
-    public void end(ControlPoint pos, boolean canceled) {
-        super.end(pos, canceled);
-
-        if (!canceled) {
-            RulesEngine rulesEngine = mCanvas.getRulesEngine();
-            Rect newBounds = getNewBounds(pos);
-            rulesEngine.callOnResizeEnd(mFeedback, mChildNode, mParentNode, newBounds);
-        }
-
-        mCanvas.getSelectionOverlay().setHidden(false);
-    }
-
-    @Override
-    public Pair<Boolean, Boolean> getTooltipPosition() {
-        return Pair.of(mHorizontalEdge != SegmentType.TOP, mVerticalEdge != SegmentType.LEFT);
-    }
-
-    /**
-     * For the new mouse position, compute the resized bounds (the bounding rectangle that
-     * the view should be resized to). This is not just a width or height, since in some
-     * cases resizing will change the x/y position of the view as well (for example, in
-     * RelativeLayout or in AbsoluteLayout).
-     */
-    private Rect getNewBounds(ControlPoint pos) {
-        LayoutPoint p = pos.toLayout();
-        LayoutPoint start = mStart.toLayout();
-        Rect b = mChildNode.getBounds();
-        Position direction = mHandle.getPosition();
-
-        int x = b.x;
-        int y = b.y;
-        int w = b.w;
-        int h = b.h;
-        int deltaX = p.x - start.x;
-        int deltaY = p.y - start.y;
-
-        if (deltaX == 0 && deltaY == 0) {
-            // No move - just use the existing bounds
-            return b;
-        }
-
-        if (mResizePolicy.isAspectPreserving() && w != 0 && h != 0) {
-            double aspectRatio = w / (double) h;
-            int newW = Math.abs(b.w + (direction.isLeft() ? -deltaX : deltaX));
-            int newH = Math.abs(b.h + (direction.isTop() ? -deltaY : deltaY));
-            double newAspectRatio = newW / (double) newH;
-            if (newH == 0 || newAspectRatio > aspectRatio) {
-                deltaY = (int) (deltaX / aspectRatio);
-            } else {
-                deltaX = (int) (deltaY * aspectRatio);
-            }
-        }
-        if (direction.isLeft()) {
-            // The user is dragging the left edge, so the position is anchored on the
-            // right.
-            int x2 = b.x + b.w;
-            int nx1 = b.x + deltaX;
-            if (nx1 <= x2) {
-                x = nx1;
-                w = x2 - x;
-            } else {
-                w = 0;
-                x = x2;
-            }
-        } else if (direction.isRight()) {
-            // The user is dragging the right edge, so the position is anchored on the
-            // left.
-            int nx2 = b.x + b.w + deltaX;
-            if (nx2 >= b.x) {
-                w = nx2 - b.x;
-            } else {
-                w = 0;
-            }
-        } else {
-            assert direction == Position.BOTTOM_MIDDLE || direction == Position.TOP_MIDDLE;
-        }
-
-        if (direction.isTop()) {
-            // The user is dragging the top edge, so the position is anchored on the
-            // bottom.
-            int y2 = b.y + b.h;
-            int ny1 = b.y + deltaY;
-            if (ny1 < y2) {
-                y = ny1;
-                h = y2 - y;
-            } else {
-                h = 0;
-                y = y2;
-            }
-        } else if (direction.isBottom()) {
-            // The user is dragging the bottom edge, so the position is anchored on the
-            // top.
-            int ny2 = b.y + b.h + deltaY;
-            if (ny2 >= b.y) {
-                h = ny2 - b.y;
-            } else {
-                h = 0;
-            }
-        } else {
-            assert direction == Position.LEFT_MIDDLE || direction == Position.RIGHT_MIDDLE;
-        }
-
-        return new Rect(x, y, w, h);
-    }
-
-    private static SegmentType getHorizontalEdgeType(SelectionHandle handle) {
-        switch (handle.getPosition()) {
-            case BOTTOM_LEFT:
-            case BOTTOM_RIGHT:
-            case BOTTOM_MIDDLE:
-                return SegmentType.BOTTOM;
-            case LEFT_MIDDLE:
-            case RIGHT_MIDDLE:
-                return null;
-            case TOP_LEFT:
-            case TOP_MIDDLE:
-            case TOP_RIGHT:
-                return SegmentType.TOP;
-            default: assert false : handle.getPosition();
-        }
-        return null;
-    }
-
-    private static SegmentType getVerticalEdgeType(SelectionHandle handle) {
-        switch (handle.getPosition()) {
-            case TOP_LEFT:
-            case LEFT_MIDDLE:
-            case BOTTOM_LEFT:
-                return SegmentType.LEFT;
-            case BOTTOM_MIDDLE:
-            case TOP_MIDDLE:
-                return null;
-            case TOP_RIGHT:
-            case RIGHT_MIDDLE:
-            case BOTTOM_RIGHT:
-                return SegmentType.RIGHT;
-            default: assert false : handle.getPosition();
-        }
-        return null;
-    }
-
-
-    @Override
-    public List<Overlay> createOverlays() {
-        mOverlay = new ResizeOverlay();
-        return Collections.<Overlay> singletonList(mOverlay);
-    }
-
-    /**
-     * An {@link Overlay} to paint the resize feedback. This just delegates to the
-     * layout rule for the parent which is handling the resizing.
-     */
-    private class ResizeOverlay extends Overlay {
-        @Override
-        public void paint(GC gc) {
-            if (mChildNode != null && mFeedback != null) {
-                RulesEngine rulesEngine = mCanvas.getRulesEngine();
-                rulesEngine.callDropFeedbackPaint(mCanvas.getGcWrapper(), mChildNode, mFeedback);
-            }
-        }
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/SelectionHandle.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/SelectionHandle.java
deleted file mode 100644
index c2db243..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/SelectionHandle.java
+++ /dev/null
@@ -1,141 +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.eclipse.adt.internal.editors.layout.gle2;
-
-import org.eclipse.swt.SWT;
-
-/**
- * A selection handle is a small rectangle on the border of a selected view which lets you
- * change the size of the view by dragging it.
- */
-public class SelectionHandle {
-    /**
-     * Size of the selection handle radius, in control coordinates. Note that this isn't
-     * necessarily a <b>circular</b> radius; in the case of a rectangular handle, the
-     * width and the height are both equal to this radius.
-     * Note also that this radius is in <b>control</b> coordinates, whereas the rest
-     * of the class operates in layout coordinates. This is because we do not want the
-     * selection handles to grow or shrink along with the screen zoom; they are always
-     * at the given pixel size in the control.
-     */
-    public final static int PIXEL_RADIUS = 3;
-
-    /**
-     * Extra number of pixels to look beyond the actual radius of the selection handle
-     * when matching mouse positions to handles
-     */
-    public final static int PIXEL_MARGIN = 2;
-
-    /** The position of the handle in the selection rectangle */
-    enum Position {
-        TOP_MIDDLE(SWT.CURSOR_SIZEN),
-        TOP_RIGHT(SWT.CURSOR_SIZENE),
-        RIGHT_MIDDLE(SWT.CURSOR_SIZEE),
-        BOTTOM_RIGHT(SWT.CURSOR_SIZESE),
-        BOTTOM_MIDDLE(SWT.CURSOR_SIZES),
-        BOTTOM_LEFT(SWT.CURSOR_SIZESW),
-        LEFT_MIDDLE(SWT.CURSOR_SIZEW),
-        TOP_LEFT(SWT.CURSOR_SIZENW);
-
-        /** Corresponding SWT cursor value */
-        private int mSwtCursor;
-
-        private Position(int swtCursor) {
-            mSwtCursor = swtCursor;
-        }
-
-        private int getCursorType() {
-            return mSwtCursor;
-        }
-
-        /** Is the {@link SelectionHandle} somewhere on the left edge? */
-        boolean isLeft() {
-            return this == TOP_LEFT || this == LEFT_MIDDLE || this == BOTTOM_LEFT;
-        }
-
-        /** Is the {@link SelectionHandle} somewhere on the right edge? */
-        boolean isRight() {
-            return this == TOP_RIGHT || this == RIGHT_MIDDLE || this == BOTTOM_RIGHT;
-        }
-
-        /** Is the {@link SelectionHandle} somewhere on the top edge? */
-        boolean isTop() {
-            return this == TOP_LEFT || this == TOP_MIDDLE || this == TOP_RIGHT;
-        }
-
-        /** Is the {@link SelectionHandle} somewhere on the bottom edge? */
-        boolean isBottom() {
-            return this == BOTTOM_LEFT || this == BOTTOM_MIDDLE || this == BOTTOM_RIGHT;
-        }
-    };
-
-    /** The x coordinate of the center of the selection handle */
-    public final int centerX;
-    /** The y coordinate of the center of the selection handle */
-    public final int centerY;
-    /** The position of the handle in the selection rectangle */
-    private final Position mPosition;
-
-    /**
-     * Constructs a new {@link SelectionHandle} at the given layout coordinate
-     * corresponding to a handle at the given {@link Position}.
-     *
-     * @param centerX the x coordinate of the center of the selection handle
-     * @param centerY y coordinate of the center of the selection handle
-     * @param position the position of the handle in the selection rectangle
-     */
-    public SelectionHandle(int centerX, int centerY, Position position) {
-        mPosition = position;
-        this.centerX = centerX;
-        this.centerY = centerY;
-    }
-
-    /**
-     * Determines whether the given {@link LayoutPoint} is within the given distance in
-     * layout coordinates. The distance should incorporate at least the equivalent
-     * distance to the control coordinate space {@link #PIXEL_RADIUS}, but usually with a
-     * few extra pixels added in to make the corners easier to target.
-     *
-     * @param point the mouse position in layout coordinates
-     * @param distance the distance from the center of the handle to check whether the
-     *            point fits within
-     * @return true if the given point is within the given distance of this handle
-     */
-    public boolean contains(LayoutPoint point, int distance) {
-        return (point.x >= centerX - distance
-              && point.x <= centerX + distance
-              && point.y >= centerY - distance
-              && point.y <= centerY + distance);
-    }
-
-    /**
-     * Returns the position of the handle in the selection rectangle
-     *
-     * @return the position of the handle in the selection rectangle
-     */
-    public Position getPosition() {
-        return mPosition;
-    }
-
-    /**
-     * Returns the SWT cursor type to use for this selection handle
-     *
-     * @return the position of the handle in the selection rectangle
-     */
-    public int getSwtCursorType() {
-        return mPosition.getCursorType();
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/SelectionHandles.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/SelectionHandles.java
deleted file mode 100644
index 6d7f34a..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/SelectionHandles.java
+++ /dev/null
@@ -1,140 +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.eclipse.adt.internal.editors.layout.gle2;
-
-import com.android.ide.common.api.Margins;
-import com.android.ide.common.api.Rect;
-import com.android.ide.common.api.ResizePolicy;
-import com.android.ide.eclipse.adt.internal.editors.layout.gle2.SelectionHandle.Position;
-import com.android.ide.eclipse.adt.internal.editors.layout.gre.NodeProxy;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-
-/**
- * The {@link SelectionHandles} of a {@link SelectionItem} are the set of
- * {@link SelectionHandle} objects (possibly empty, for non-resizable objects) the user
- * can manipulate to resize a widget.
- */
-public class SelectionHandles implements Iterable<SelectionHandle> {
-    private final SelectionItem mItem;
-    private List<SelectionHandle> mHandles;
-
-    /**
-     * Constructs a new {@link SelectionHandles} object for the given {link
-     * {@link SelectionItem}
-     * @param item the item to create {@link SelectionHandles} for
-     */
-    public SelectionHandles(SelectionItem item) {
-        mItem = item;
-
-        createHandles(item.getCanvas());
-    }
-
-    /**
-     * Find a specific {@link SelectionHandle} from this set of {@link SelectionHandles},
-     * which is within the given distance (in layout coordinates) from the center of the
-     * {@link SelectionHandle}.
-     *
-     * @param point the mouse position (in layout coordinates) to test
-     * @param distance the maximum distance from the handle center to accept
-     * @return a {@link SelectionHandle} under the point, or null if not found
-     */
-    public SelectionHandle findHandle(LayoutPoint point, int distance) {
-        for (SelectionHandle handle : mHandles) {
-            if (handle.contains(point, distance)) {
-                return handle;
-            }
-        }
-
-        return null;
-    }
-
-    /**
-     * Create the {@link SelectionHandle} objects for the selection item, according to its
-     * {@link ResizePolicy}.
-     */
-    private void createHandles(LayoutCanvas canvas) {
-        NodeProxy selectedNode = mItem.getNode();
-        Rect r = selectedNode.getBounds();
-        if (!r.isValid()) {
-            mHandles = Collections.emptyList();
-            return;
-        }
-
-        ResizePolicy resizability = mItem.getResizePolicy();
-        if (resizability.isResizable()) {
-            mHandles = new ArrayList<SelectionHandle>(8);
-            boolean left = resizability.leftAllowed();
-            boolean right = resizability.rightAllowed();
-            boolean top = resizability.topAllowed();
-            boolean bottom = resizability.bottomAllowed();
-            int x1 = r.x;
-            int y1 = r.y;
-            int w = r.w;
-            int h = r.h;
-            int x2 = x1 + w;
-            int y2 = y1 + h;
-
-            Margins insets = canvas.getInsets(mItem.getNode().getFqcn());
-            if (insets != null) {
-                x1 += insets.left;
-                x2 -= insets.right;
-                y1 += insets.top;
-                y2 -= insets.bottom;
-            }
-
-            int mx = (x1 + x2) / 2;
-            int my = (y1 + y2) / 2;
-
-            if (left) {
-                mHandles.add(new SelectionHandle(x1, my, Position.LEFT_MIDDLE));
-                if (top) {
-                    mHandles.add(new SelectionHandle(x1, y1, Position.TOP_LEFT));
-                }
-                if (bottom) {
-                    mHandles.add(new SelectionHandle(x1, y2, Position.BOTTOM_LEFT));
-                }
-            }
-            if (right) {
-                mHandles.add(new SelectionHandle(x2, my, Position.RIGHT_MIDDLE));
-                if (top) {
-                    mHandles.add(new SelectionHandle(x2, y1, Position.TOP_RIGHT));
-                }
-                if (bottom) {
-                    mHandles.add(new SelectionHandle(x2, y2, Position.BOTTOM_RIGHT));
-                }
-            }
-            if (top) {
-                mHandles.add(new SelectionHandle(mx, y1, Position.TOP_MIDDLE));
-            }
-            if (bottom) {
-                mHandles.add(new SelectionHandle(mx, y2, Position.BOTTOM_MIDDLE));
-            }
-        } else {
-            mHandles = Collections.emptyList();
-        }
-    }
-
-    // Implements Iterable<SelectionHandle>
-    @Override
-    public Iterator<SelectionHandle> iterator() {
-        return mHandles.iterator();
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/SelectionItem.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/SelectionItem.java
deleted file mode 100644
index d104e37..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/SelectionItem.java
+++ /dev/null
@@ -1,252 +0,0 @@
-/*
- * Copyright (C) 2009 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.editors.layout.gle2;
-
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-import com.android.ide.common.api.ResizePolicy;
-import com.android.ide.eclipse.adt.internal.editors.layout.LayoutEditorDelegate;
-import com.android.ide.eclipse.adt.internal.editors.layout.gre.NodeProxy;
-import com.android.ide.eclipse.adt.internal.editors.layout.gre.ViewMetadataRepository;
-import com.android.ide.eclipse.adt.internal.editors.layout.uimodel.UiViewElementNode;
-
-import org.eclipse.swt.graphics.Rectangle;
-import org.w3c.dom.Node;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * Represents one selection in {@link LayoutCanvas}.
- */
-class SelectionItem {
-
-    /** The associated {@link LayoutCanvas} */
-    private LayoutCanvas mCanvas;
-
-    /** Current selected view info. Can be null. */
-    private final CanvasViewInfo mCanvasViewInfo;
-
-    /** Current selection border rectangle. Null when mCanvasViewInfo is null . */
-    private final Rectangle mRect;
-
-    /** The node proxy for drawing the selection. Null when mCanvasViewInfo is null. */
-    private final NodeProxy mNodeProxy;
-
-    /** The resize policy for this selection item */
-    private ResizePolicy mResizePolicy;
-
-    /** The selection handles for this item */
-    private SelectionHandles mHandles;
-
-    /**
-     * Creates a new {@link SelectionItem} object.
-     * @param canvas the associated canvas
-     * @param canvasViewInfo The view info being selected. Must not be null.
-     */
-    public SelectionItem(LayoutCanvas canvas, CanvasViewInfo canvasViewInfo) {
-        assert canvasViewInfo != null;
-
-        mCanvas = canvas;
-        mCanvasViewInfo = canvasViewInfo;
-
-        if (canvasViewInfo == null) {
-            mRect = null;
-            mNodeProxy = null;
-        } else {
-            Rectangle r = canvasViewInfo.getSelectionRect();
-            mRect = new Rectangle(r.x, r.y, r.width, r.height);
-            mNodeProxy = mCanvas.getNodeFactory().create(canvasViewInfo);
-        }
-    }
-
-    /**
-     * Returns true when this selection item represents the root, the top level
-     * layout element in the editor.
-     *
-     * @return True if and only if this element is at the root of the hierarchy
-     */
-    public boolean isRoot() {
-        return mCanvasViewInfo.isRoot();
-    }
-
-    /**
-     * Returns true if this item represents a widget that should not be manipulated by the
-     * user.
-     *
-     * @return True if this widget should not be manipulated directly by the user
-     */
-    public boolean isHidden() {
-        return mCanvasViewInfo.isHidden();
-    }
-
-    /**
-     * Returns the selected view info. Cannot be null.
-     *
-     * @return the selected view info. Cannot be null.
-     */
-    @NonNull
-    public CanvasViewInfo getViewInfo() {
-        return mCanvasViewInfo;
-    }
-
-    /**
-     * Returns the selected node.
-     *
-     * @return the selected node, or null
-     */
-    @Nullable
-    public UiViewElementNode getUiNode() {
-        return mCanvasViewInfo.getUiViewNode();
-    }
-
-    /**
-     * Returns the selection border rectangle. Cannot be null.
-     *
-     * @return the selection border rectangle, never null
-     */
-    public Rectangle getRect() {
-        return mRect;
-    }
-
-    /** Returns the node associated with this selection (may be null) */
-    @Nullable
-    NodeProxy getNode() {
-        return mNodeProxy;
-    }
-
-    /** Returns the canvas associated with this selection (never null) */
-    @NonNull
-    LayoutCanvas getCanvas() {
-        return mCanvas;
-    }
-
-    //----
-
-    /**
-     * Gets the XML text from the given selection for a text transfer.
-     * The returned string can be empty but not null.
-     */
-    @NonNull
-    static String getAsText(LayoutCanvas canvas, List<SelectionItem> selection) {
-        StringBuilder sb = new StringBuilder();
-
-        LayoutEditorDelegate layoutEditorDelegate = canvas.getEditorDelegate();
-        for (SelectionItem cs : selection) {
-            CanvasViewInfo vi = cs.getViewInfo();
-            UiViewElementNode key = vi.getUiViewNode();
-            Node node = key.getXmlNode();
-            String t = layoutEditorDelegate.getEditor().getXmlText(node);
-            if (t != null) {
-                if (sb.length() > 0) {
-                    sb.append('\n');
-                }
-                sb.append(t);
-            }
-        }
-
-        return sb.toString();
-    }
-
-    /**
-     * Returns elements representing the given selection of canvas items.
-     *
-     * @param items Items to wrap in elements
-     * @return An array of wrapper elements. Never null.
-     */
-    @NonNull
-    static SimpleElement[] getAsElements(@NonNull List<SelectionItem> items) {
-        return getAsElements(items, null);
-    }
-
-    /**
-     * Returns elements representing the given selection of canvas items.
-     *
-     * @param items Items to wrap in elements
-     * @param primary The primary selected item which should be listed first
-     * @return An array of wrapper elements. Never null.
-     */
-    @NonNull
-    static SimpleElement[] getAsElements(
-            @NonNull List<SelectionItem> items,
-            @Nullable SelectionItem primary) {
-        List<SimpleElement> elements = new ArrayList<SimpleElement>();
-
-        if (primary != null) {
-            CanvasViewInfo vi = primary.getViewInfo();
-            SimpleElement e = vi.toSimpleElement();
-            e.setSelectionItem(primary);
-            elements.add(e);
-        }
-
-        for (SelectionItem cs : items) {
-            if (cs == primary) {
-                // Already handled
-                continue;
-            }
-
-            CanvasViewInfo vi = cs.getViewInfo();
-            SimpleElement e = vi.toSimpleElement();
-            e.setSelectionItem(cs);
-            elements.add(e);
-        }
-
-        return elements.toArray(new SimpleElement[elements.size()]);
-    }
-
-    /**
-     * Returns true if this selection item is a layout
-     *
-     * @return true if this selection item is a layout
-     */
-    public boolean isLayout() {
-        UiViewElementNode node = mCanvasViewInfo.getUiViewNode();
-        if (node != null) {
-            return node.getDescriptor().hasChildren();
-        } else {
-            return false;
-        }
-    }
-
-    /**
-     * Returns the {@link SelectionHandles} for this {@link SelectionItem}. Never null.
-     *
-     * @return the {@link SelectionHandles} for this {@link SelectionItem}, never null
-     */
-    @NonNull
-    public SelectionHandles getSelectionHandles() {
-        if (mHandles == null) {
-            mHandles = new SelectionHandles(this);
-        }
-
-        return mHandles;
-    }
-
-    /**
-     * Returns the {@link ResizePolicy} for this item
-     *
-     * @return the {@link ResizePolicy} for this item, never null
-     */
-    @NonNull
-    public ResizePolicy getResizePolicy() {
-        if (mResizePolicy == null && mNodeProxy != null) {
-            mResizePolicy = ViewMetadataRepository.get().getResizePolicy(mNodeProxy.getFqcn());
-        }
-
-        return mResizePolicy;
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/SelectionManager.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/SelectionManager.java
deleted file mode 100644
index eb3d6f2..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/SelectionManager.java
+++ /dev/null
@@ -1,1262 +0,0 @@
-/*
- * Copyright (C) 2010 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.editors.layout.gle2;
-
-import static com.android.SdkConstants.ANDROID_URI;
-import static com.android.SdkConstants.ATTR_ID;
-import static com.android.SdkConstants.FQCN_SPACE;
-import static com.android.SdkConstants.FQCN_SPACE_V7;
-import static com.android.SdkConstants.NEW_ID_PREFIX;
-import static com.android.ide.eclipse.adt.internal.editors.layout.gle2.SelectionHandle.PIXEL_MARGIN;
-import static com.android.ide.eclipse.adt.internal.editors.layout.gle2.SelectionHandle.PIXEL_RADIUS;
-
-import com.android.SdkConstants;
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-import com.android.ide.common.api.INode;
-import com.android.ide.common.api.RuleAction;
-import com.android.ide.common.layout.BaseViewRule;
-import com.android.ide.common.layout.GridLayoutRule;
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.ide.eclipse.adt.internal.editors.descriptors.ElementDescriptor;
-import com.android.ide.eclipse.adt.internal.editors.layout.LayoutEditorDelegate;
-import com.android.ide.eclipse.adt.internal.editors.layout.gre.NodeFactory;
-import com.android.ide.eclipse.adt.internal.editors.layout.gre.NodeProxy;
-import com.android.ide.eclipse.adt.internal.editors.layout.gre.RulesEngine;
-import com.android.ide.eclipse.adt.internal.editors.layout.uimodel.UiViewElementNode;
-import com.android.ide.eclipse.adt.internal.editors.uimodel.UiElementNode;
-import com.android.ide.eclipse.adt.internal.refactorings.core.RenameResourceWizard;
-import com.android.ide.eclipse.adt.internal.refactorings.core.RenameResult;
-import com.android.ide.eclipse.adt.internal.resources.ResourceNameValidator;
-import com.android.resources.ResourceType;
-import com.android.utils.Pair;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.ListenerList;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.ActionContributionItem;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.action.Separator;
-import org.eclipse.jface.dialogs.InputDialog;
-import org.eclipse.jface.util.SafeRunnable;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.ISelectionProvider;
-import org.eclipse.jface.viewers.ITreeSelection;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.TreePath;
-import org.eclipse.jface.viewers.TreeSelection;
-import org.eclipse.jface.window.Window;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.MenuDetectEvent;
-import org.eclipse.swt.events.MouseEvent;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Menu;
-import org.eclipse.ui.IWorkbenchPartSite;
-import org.w3c.dom.Node;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.ListIterator;
-import java.util.Set;
-
-/**
- * The {@link SelectionManager} manages the selection in the canvas editor.
- * It holds (and can be asked about) the set of selected items, and it also has
- * operations for manipulating the selection - such as toggling items, copying
- * the selection to the clipboard, etc.
- * <p/>
- * This class implements {@link ISelectionProvider} so that it can delegate
- * the selection provider from the {@link LayoutCanvasViewer}.
- * <p/>
- * Note that {@link LayoutCanvasViewer} sets a selection change listener on this
- * manager so that it can invoke its own fireSelectionChanged when the canvas'
- * selection changes.
- */
-public class SelectionManager implements ISelectionProvider {
-
-    private LayoutCanvas mCanvas;
-
-    /** The current selection list. The list is never null, however it can be empty. */
-    private final LinkedList<SelectionItem> mSelections = new LinkedList<SelectionItem>();
-
-    /** An unmodifiable view of {@link #mSelections}. */
-    private final List<SelectionItem> mUnmodifiableSelection =
-        Collections.unmodifiableList(mSelections);
-
-    /** Barrier set when updating the selection to prevent from recursively
-     * invoking ourselves. */
-    private boolean mInsideUpdateSelection;
-
-    /**
-     * The <em>current</em> alternate selection, if any, which changes when the Alt key is
-     * used during a selection. Can be null.
-     */
-    private CanvasAlternateSelection mAltSelection;
-
-    /** List of clients listening to selection changes. */
-    private final ListenerList mSelectionListeners = new ListenerList();
-
-    /**
-     * Constructs a new {@link SelectionManager} associated with the given layout canvas.
-     *
-     * @param layoutCanvas The layout canvas to create a {@link SelectionManager} for.
-     */
-    public SelectionManager(LayoutCanvas layoutCanvas) {
-        mCanvas = layoutCanvas;
-    }
-
-    @Override
-    public void addSelectionChangedListener(ISelectionChangedListener listener) {
-        mSelectionListeners.add(listener);
-    }
-
-    @Override
-    public void removeSelectionChangedListener(ISelectionChangedListener listener) {
-        mSelectionListeners.remove(listener);
-    }
-
-    /**
-     * Returns the native {@link SelectionItem} list.
-     *
-     * @return An immutable list of {@link SelectionItem}. Can be empty but not null.
-     */
-    @NonNull
-    List<SelectionItem> getSelections() {
-        return mUnmodifiableSelection;
-    }
-
-    /**
-     * Return a snapshot/copy of the selection. Useful for clipboards etc where we
-     * don't want the returned copy to be affected by future edits to the selection.
-     *
-     * @return A copy of the current selection. Never null.
-     */
-    @NonNull
-    public List<SelectionItem> getSnapshot() {
-        if (mSelectionListeners.isEmpty()) {
-            return Collections.emptyList();
-        }
-
-        return new ArrayList<SelectionItem>(mSelections);
-    }
-
-    /**
-     * Returns a {@link TreeSelection} where each {@link TreePath} item is
-     * actually a {@link CanvasViewInfo}.
-     */
-    @Override
-    public ISelection getSelection() {
-        if (mSelections.isEmpty()) {
-            return TreeSelection.EMPTY;
-        }
-
-        ArrayList<TreePath> paths = new ArrayList<TreePath>();
-
-        for (SelectionItem cs : mSelections) {
-            CanvasViewInfo vi = cs.getViewInfo();
-            if (vi != null) {
-                paths.add(getTreePath(vi));
-            }
-        }
-
-        return new TreeSelection(paths.toArray(new TreePath[paths.size()]));
-    }
-
-    /**
-     * Create a {@link TreePath} from the given view info
-     *
-     * @param viewInfo the view info to look up a tree path for
-     * @return a {@link TreePath} for the given view info
-     */
-    public static TreePath getTreePath(CanvasViewInfo viewInfo) {
-        ArrayList<Object> segments = new ArrayList<Object>();
-        while (viewInfo != null) {
-            segments.add(0, viewInfo);
-            viewInfo = viewInfo.getParent();
-        }
-
-        return new TreePath(segments.toArray());
-    }
-
-    /**
-     * Sets the selection. It must be an {@link ITreeSelection} where each segment
-     * of the tree path is a {@link CanvasViewInfo}. A null selection is considered
-     * as an empty selection.
-     * <p/>
-     * This method is invoked by {@link LayoutCanvasViewer#setSelection(ISelection)}
-     * in response to an <em>outside</em> selection (compatible with ours) that has
-     * changed. Typically it means the outline selection has changed and we're
-     * synchronizing ours to match.
-     */
-    @Override
-    public void setSelection(ISelection selection) {
-        if (mInsideUpdateSelection) {
-            return;
-        }
-
-        boolean changed = false;
-        try {
-            mInsideUpdateSelection = true;
-
-            if (selection == null) {
-                selection = TreeSelection.EMPTY;
-            }
-
-            if (selection instanceof ITreeSelection) {
-                ITreeSelection treeSel = (ITreeSelection) selection;
-
-                if (treeSel.isEmpty()) {
-                    // Clear existing selection, if any
-                    if (!mSelections.isEmpty()) {
-                        mSelections.clear();
-                        mAltSelection = null;
-                        updateActionsFromSelection();
-                        redraw();
-                    }
-                    return;
-                }
-
-                boolean redoLayout = false;
-
-                // Create a list of all currently selected view infos
-                Set<CanvasViewInfo> oldSelected = new HashSet<CanvasViewInfo>();
-                for (SelectionItem cs : mSelections) {
-                    oldSelected.add(cs.getViewInfo());
-                }
-
-                // Go thru new selection and take care of selecting new items
-                // or marking those which are the same as in the current selection
-                for (TreePath path : treeSel.getPaths()) {
-                    Object seg = path.getLastSegment();
-                    if (seg instanceof CanvasViewInfo) {
-                        CanvasViewInfo newVi = (CanvasViewInfo) seg;
-                        if (oldSelected.contains(newVi)) {
-                            // This view info is already selected. Remove it from the
-                            // oldSelected list so that we don't deselect it later.
-                            oldSelected.remove(newVi);
-                        } else {
-                            // This view info is not already selected. Select it now.
-
-                            // reset alternate selection if any
-                            mAltSelection = null;
-                            // otherwise add it.
-                            mSelections.add(createSelection(newVi));
-                            changed = true;
-                        }
-                        if (newVi.isInvisible()) {
-                            redoLayout = true;
-                        }
-                    } else {
-                        // Unrelated selection (e.g. user clicked in the Project Explorer
-                        // or something) -- just ignore these
-                        return;
-                    }
-                }
-
-                // Deselect old selected items that are not in the new one
-                for (CanvasViewInfo vi : oldSelected) {
-                    if (vi.isExploded()) {
-                        redoLayout = true;
-                    }
-                    deselect(vi);
-                    changed = true;
-                }
-
-                if (redoLayout) {
-                    mCanvas.getEditorDelegate().recomputeLayout();
-                }
-            }
-        } finally {
-            mInsideUpdateSelection = false;
-        }
-
-        if (changed) {
-            redraw();
-            fireSelectionChanged();
-            updateActionsFromSelection();
-        }
-    }
-
-    /**
-     * The menu has been activated; ensure that the menu click is over the existing
-     * selection, and if not, update the selection.
-     *
-     * @param e the {@link MenuDetectEvent} which triggered the menu
-     */
-    public void menuClick(MenuDetectEvent e) {
-        LayoutPoint p = ControlPoint.create(mCanvas, e).toLayout();
-
-        // Right click button is used to display a context menu.
-        // If there's an existing selection and the click is anywhere in this selection
-        // and there are no modifiers being used, we don't want to change the selection.
-        // Otherwise we select the item under the cursor.
-
-        for (SelectionItem cs : mSelections) {
-            if (cs.isRoot()) {
-                continue;
-            }
-            if (cs.getRect().contains(p.x, p.y)) {
-                // The cursor is inside the selection. Don't change anything.
-                return;
-            }
-        }
-
-        CanvasViewInfo vi = mCanvas.getViewHierarchy().findViewInfoAt(p);
-        selectSingle(vi);
-    }
-
-    /**
-     * Performs selection for a mouse event.
-     * <p/>
-     * Shift key (or Command on the Mac) is used to toggle in multi-selection.
-     * Alt key is used to cycle selection through objects at the same level than
-     * the one pointed at (i.e. click on an object then alt-click to cycle).
-     *
-     * @param e The mouse event which triggered the selection. Cannot be null.
-     *            The modifier key mask will be used to determine whether this
-     *            is a plain select or a toggle, etc.
-     */
-    public void select(MouseEvent e) {
-        boolean isMultiClick = (e.stateMask & SWT.SHIFT) != 0 ||
-            // On Mac, the Command key is the normal toggle accelerator
-            ((SdkConstants.CURRENT_PLATFORM == SdkConstants.PLATFORM_DARWIN) &&
-                    (e.stateMask & SWT.COMMAND) != 0);
-        boolean isCycleClick   = (e.stateMask & SWT.ALT)   != 0;
-
-        LayoutPoint p = ControlPoint.create(mCanvas, e).toLayout();
-
-        if (e.button == 3) {
-            // Right click button is used to display a context menu.
-            // If there's an existing selection and the click is anywhere in this selection
-            // and there are no modifiers being used, we don't want to change the selection.
-            // Otherwise we select the item under the cursor.
-
-            if (!isCycleClick && !isMultiClick) {
-                for (SelectionItem cs : mSelections) {
-                    if (cs.getRect().contains(p.x, p.y)) {
-                        // The cursor is inside the selection. Don't change anything.
-                        return;
-                    }
-                }
-            }
-
-        } else if (e.button != 1) {
-            // Click was done with something else than the left button for normal selection
-            // or the right button for context menu.
-            // We don't use mouse button 2 yet (middle mouse, or scroll wheel?) for
-            // anything, so let's not change the selection.
-            return;
-        }
-
-        CanvasViewInfo vi = mCanvas.getViewHierarchy().findViewInfoAt(p);
-
-        if (vi != null && vi.isHidden()) {
-            vi = vi.getParent();
-        }
-
-        if (isMultiClick && !isCycleClick) {
-            // Case where shift is pressed: pointed object is toggled.
-
-            // reset alternate selection if any
-            mAltSelection = null;
-
-            // If nothing has been found at the cursor, assume it might be a user error
-            // and avoid clearing the existing selection.
-
-            if (vi != null) {
-                // toggle this selection on-off: remove it if already selected
-                if (deselect(vi)) {
-                    if (vi.isExploded()) {
-                        mCanvas.getEditorDelegate().recomputeLayout();
-                    }
-
-                    redraw();
-                    return;
-                }
-
-                // otherwise add it.
-                mSelections.add(createSelection(vi));
-                fireSelectionChanged();
-                redraw();
-            }
-
-        } else if (isCycleClick) {
-            // Case where alt is pressed: select or cycle the object pointed at.
-
-            // Note: if shift and alt are pressed, shift is ignored. The alternate selection
-            // mechanism does not reset the current multiple selection unless they intersect.
-
-            // We need to remember the "origin" of the alternate selection, to be
-            // able to continue cycling through it later. If there's no alternate selection,
-            // create one. If there's one but not for the same origin object, create a new
-            // one too.
-            if (mAltSelection == null || mAltSelection.getOriginatingView() != vi) {
-                mAltSelection = new CanvasAlternateSelection(
-                        vi, mCanvas.getViewHierarchy().findAltViewInfoAt(p));
-
-                // deselect them all, in case they were partially selected
-                deselectAll(mAltSelection.getAltViews());
-
-                // select the current one
-                CanvasViewInfo vi2 = mAltSelection.getCurrent();
-                if (vi2 != null) {
-                    mSelections.addFirst(createSelection(vi2));
-                    fireSelectionChanged();
-                }
-            } else {
-                // We're trying to cycle through the current alternate selection.
-                // First remove the current object.
-                CanvasViewInfo vi2 = mAltSelection.getCurrent();
-                deselect(vi2);
-
-                // Now select the next one.
-                vi2 = mAltSelection.getNext();
-                if (vi2 != null) {
-                    mSelections.addFirst(createSelection(vi2));
-                    fireSelectionChanged();
-                }
-            }
-            redraw();
-
-        } else {
-            // Case where no modifier is pressed: either select or reset the selection.
-            selectSingle(vi);
-        }
-    }
-
-    /**
-     * Removes all the currently selected item and only select the given item.
-     * Issues a redraw() if the selection changes.
-     *
-     * @param vi The new selected item if non-null. Selection becomes empty if null.
-     * @return the item selected, or null if the selection was cleared (e.g. vi was null)
-     */
-    @Nullable
-    SelectionItem selectSingle(CanvasViewInfo vi) {
-        SelectionItem item = null;
-
-        // reset alternate selection if any
-        mAltSelection = null;
-
-        if (vi == null) {
-            // The user clicked outside the bounds of the root element; in that case, just
-            // select the root element.
-            vi = mCanvas.getViewHierarchy().getRoot();
-        }
-
-        boolean redoLayout = hasExplodedItems();
-
-        // reset (multi)selection if any
-        if (!mSelections.isEmpty()) {
-            if (mSelections.size() == 1 && mSelections.getFirst().getViewInfo() == vi) {
-                // CanvasSelection remains the same, don't touch it.
-                return mSelections.getFirst();
-            }
-            mSelections.clear();
-        }
-
-        if (vi != null) {
-            item = createSelection(vi);
-            mSelections.add(item);
-            if (vi.isInvisible()) {
-                redoLayout = true;
-            }
-        }
-        fireSelectionChanged();
-
-        if (redoLayout) {
-            mCanvas.getEditorDelegate().recomputeLayout();
-        }
-
-        redraw();
-
-        return item;
-    }
-
-    /** Returns true if the view hierarchy is showing exploded items. */
-    private boolean hasExplodedItems() {
-        for (SelectionItem item : mSelections) {
-            if (item.getViewInfo().isExploded()) {
-                return true;
-            }
-        }
-
-        return false;
-    }
-
-    /**
-     * Selects the given set of {@link CanvasViewInfo}s. This is similar to
-     * {@link #selectSingle} but allows you to make a multi-selection. Issues a
-     * {@link #redraw()}.
-     *
-     * @param viewInfos A collection of {@link CanvasViewInfo} objects to be
-     *            selected, or null or empty to clear the selection.
-     */
-    /* package */ void selectMultiple(Collection<CanvasViewInfo> viewInfos) {
-        // reset alternate selection if any
-        mAltSelection = null;
-
-        boolean redoLayout = hasExplodedItems();
-
-        mSelections.clear();
-        if (viewInfos != null) {
-            for (CanvasViewInfo viewInfo : viewInfos) {
-                mSelections.add(createSelection(viewInfo));
-                if (viewInfo.isInvisible()) {
-                    redoLayout = true;
-                }
-            }
-        }
-
-        fireSelectionChanged();
-
-        if (redoLayout) {
-            mCanvas.getEditorDelegate().recomputeLayout();
-        }
-
-        redraw();
-    }
-
-    public void select(Collection<INode> nodes) {
-        List<CanvasViewInfo> infos = new ArrayList<CanvasViewInfo>(nodes.size());
-        for (INode node : nodes) {
-            CanvasViewInfo info = mCanvas.getViewHierarchy().findViewInfoFor(node);
-            if (info != null) {
-                infos.add(info);
-            }
-        }
-        selectMultiple(infos);
-    }
-
-    /**
-     * Selects the visual element corresponding to the given XML node
-     * @param xmlNode The Node whose element we want to select.
-     */
-    /* package */ void select(Node xmlNode) {
-        if (xmlNode == null) {
-            return;
-        } else if (xmlNode.getNodeType() == Node.TEXT_NODE) {
-            xmlNode = xmlNode.getParentNode();
-        }
-
-        CanvasViewInfo vi = mCanvas.getViewHierarchy().findViewInfoFor(xmlNode);
-        if (vi != null && !vi.isRoot()) {
-            selectSingle(vi);
-        }
-    }
-
-    /**
-     * Selects any views that overlap the given selection rectangle.
-     *
-     * @param topLeft The top left corner defining the selection rectangle.
-     * @param bottomRight The bottom right corner defining the selection
-     *            rectangle.
-     * @param toggled A set of {@link CanvasViewInfo}s that should be toggled
-     *            rather than just added.
-     */
-    public void selectWithin(LayoutPoint topLeft, LayoutPoint bottomRight,
-            Collection<CanvasViewInfo> toggled) {
-        // reset alternate selection if any
-        mAltSelection = null;
-
-        ViewHierarchy viewHierarchy = mCanvas.getViewHierarchy();
-        Collection<CanvasViewInfo> viewInfos = viewHierarchy.findWithin(topLeft, bottomRight);
-
-        if (toggled.size() > 0) {
-            // Copy; we're not allowed to touch the passed in collection
-            Set<CanvasViewInfo> result = new HashSet<CanvasViewInfo>(toggled);
-            for (CanvasViewInfo viewInfo : viewInfos) {
-                if (toggled.contains(viewInfo)) {
-                    result.remove(viewInfo);
-                } else {
-                    result.add(viewInfo);
-                }
-            }
-            viewInfos = result;
-        }
-
-        mSelections.clear();
-        for (CanvasViewInfo viewInfo : viewInfos) {
-            if (viewInfo.isHidden()) {
-                continue;
-            }
-            mSelections.add(createSelection(viewInfo));
-        }
-
-        fireSelectionChanged();
-        redraw();
-    }
-
-    /**
-     * Clears the selection and then selects everything (all views and all their
-     * children).
-     */
-    public void selectAll() {
-        // First clear the current selection, if any.
-        mSelections.clear();
-        mAltSelection = null;
-
-        // Now select everything if there's a valid layout
-        for (CanvasViewInfo vi : mCanvas.getViewHierarchy().findAllViewInfos(false)) {
-            mSelections.add(createSelection(vi));
-        }
-
-        fireSelectionChanged();
-        redraw();
-    }
-
-    /** Clears the selection */
-    public void selectNone() {
-        mSelections.clear();
-        mAltSelection = null;
-        fireSelectionChanged();
-        redraw();
-    }
-
-    /** Selects the parent of the current selection */
-    public void selectParent() {
-        if (mSelections.size() == 1) {
-            CanvasViewInfo parent = mSelections.get(0).getViewInfo().getParent();
-            if (parent != null) {
-                selectSingle(parent);
-            }
-        }
-    }
-
-    /** Finds all widgets in the layout that have the same type as the primary */
-    public void selectSameType() {
-        // Find all
-        if (mSelections.size() == 1) {
-            CanvasViewInfo viewInfo = mSelections.get(0).getViewInfo();
-            ElementDescriptor descriptor = viewInfo.getUiViewNode().getDescriptor();
-            mSelections.clear();
-            mAltSelection = null;
-            addSameType(mCanvas.getViewHierarchy().getRoot(), descriptor);
-            fireSelectionChanged();
-            redraw();
-        }
-    }
-
-    /** Helper for {@link #selectSameType} */
-    private void addSameType(CanvasViewInfo root, ElementDescriptor descriptor) {
-        if (root.getUiViewNode().getDescriptor() == descriptor) {
-            mSelections.add(createSelection(root));
-        }
-
-        for (CanvasViewInfo child : root.getChildren()) {
-            addSameType(child, descriptor);
-        }
-    }
-
-    /** Selects the siblings of the primary */
-    public void selectSiblings() {
-        // Find all
-        if (mSelections.size() == 1) {
-            CanvasViewInfo vi = mSelections.get(0).getViewInfo();
-            mSelections.clear();
-            mAltSelection = null;
-            CanvasViewInfo parent = vi.getParent();
-            if (parent == null) {
-                selectNone();
-            } else {
-                for (CanvasViewInfo child : parent.getChildren()) {
-                    mSelections.add(createSelection(child));
-                }
-                fireSelectionChanged();
-                redraw();
-            }
-        }
-    }
-
-    /**
-     * Returns true if and only if there is currently more than one selected
-     * item.
-     *
-     * @return True if more than one item is selected
-     */
-    public boolean hasMultiSelection() {
-        return mSelections.size() > 1;
-    }
-
-    /**
-     * Deselects a view info. Returns true if the object was actually selected.
-     * Callers are responsible for calling redraw() and updateOulineSelection()
-     * after.
-     * @param canvasViewInfo The item to deselect.
-     * @return  True if the object was successfully removed from the selection.
-     */
-    public boolean deselect(CanvasViewInfo canvasViewInfo) {
-        if (canvasViewInfo == null) {
-            return false;
-        }
-
-        for (ListIterator<SelectionItem> it = mSelections.listIterator(); it.hasNext(); ) {
-            SelectionItem s = it.next();
-            if (canvasViewInfo == s.getViewInfo()) {
-                it.remove();
-                return true;
-            }
-        }
-
-        return false;
-    }
-
-    /**
-     * Deselects multiple view infos.
-     * Callers are responsible for calling redraw() and updateOulineSelection() after.
-     */
-    private void deselectAll(List<CanvasViewInfo> canvasViewInfos) {
-        for (ListIterator<SelectionItem> it = mSelections.listIterator(); it.hasNext(); ) {
-            SelectionItem s = it.next();
-            if (canvasViewInfos.contains(s.getViewInfo())) {
-                it.remove();
-            }
-        }
-    }
-
-    /** Sync the selection with an updated view info tree */
-    void sync() {
-        // Check if the selection is still the same (based on the object keys)
-        // and eventually recompute their bounds.
-        for (ListIterator<SelectionItem> it = mSelections.listIterator(); it.hasNext(); ) {
-            SelectionItem s = it.next();
-
-            // Check if the selected object still exists
-            ViewHierarchy viewHierarchy = mCanvas.getViewHierarchy();
-            UiViewElementNode key = s.getViewInfo().getUiViewNode();
-            CanvasViewInfo vi = viewHierarchy.findViewInfoFor(key);
-
-            // Remove the previous selection -- if the selected object still exists
-            // we need to recompute its bounds in case it moved so we'll insert a new one
-            // at the same place.
-            it.remove();
-            if (vi == null) {
-                vi = findCorresponding(s.getViewInfo(), viewHierarchy.getRoot());
-            }
-            if (vi != null) {
-                it.add(createSelection(vi));
-            }
-        }
-        fireSelectionChanged();
-
-        // remove the current alternate selection views
-        mAltSelection = null;
-    }
-
-    /** Finds the corresponding {@link CanvasViewInfo} in the new hierarchy */
-    private CanvasViewInfo findCorresponding(CanvasViewInfo old, CanvasViewInfo newRoot) {
-        CanvasViewInfo oldParent = old.getParent();
-        if (oldParent != null) {
-            CanvasViewInfo newParent = findCorresponding(oldParent, newRoot);
-            if (newParent == null) {
-                return null;
-            }
-
-            List<CanvasViewInfo> oldSiblings = oldParent.getChildren();
-            List<CanvasViewInfo> newSiblings = newParent.getChildren();
-            Iterator<CanvasViewInfo> oldIterator = oldSiblings.iterator();
-            Iterator<CanvasViewInfo> newIterator = newSiblings.iterator();
-            while (oldIterator.hasNext() && newIterator.hasNext()) {
-                CanvasViewInfo oldSibling = oldIterator.next();
-                CanvasViewInfo newSibling = newIterator.next();
-
-                if (oldSibling.getName().equals(newSibling.getName())) {
-                    // Structure has changed: can't do a proper search
-                    return null;
-                }
-
-                if (oldSibling == old) {
-                    return newSibling;
-                }
-            }
-        } else {
-            return newRoot;
-        }
-
-        return null;
-    }
-
-    /**
-     * Notifies listeners that the selection has changed.
-     */
-    private void fireSelectionChanged() {
-        if (mInsideUpdateSelection) {
-            return;
-        }
-        try {
-            mInsideUpdateSelection = true;
-
-            final SelectionChangedEvent event = new SelectionChangedEvent(this, getSelection());
-
-            SafeRunnable.run(new SafeRunnable() {
-                @Override
-                public void run() {
-                    for (Object listener : mSelectionListeners.getListeners()) {
-                        ((ISelectionChangedListener) listener).selectionChanged(event);
-                    }
-                }
-            });
-
-            updateActionsFromSelection();
-        } finally {
-            mInsideUpdateSelection = false;
-        }
-    }
-
-    /**
-     * Updates menu actions and the layout action bar after a selection change - these are
-     * actions that depend on the selection
-     */
-    private void updateActionsFromSelection() {
-        LayoutEditorDelegate editor = mCanvas.getEditorDelegate();
-        if (editor != null) {
-            // Update menu actions that depend on the selection
-            mCanvas.updateMenuActionState();
-
-            // Update the layout actions bar
-            LayoutActionBar layoutActionBar = editor.getGraphicalEditor().getLayoutActionBar();
-            layoutActionBar.updateSelection();
-        }
-    }
-
-    /**
-     * Sanitizes the selection for a copy/cut or drag operation.
-     * <p/>
-     * Sanitizes the list to make sure all elements have a valid XML attached to it,
-     * that is remove element that have no XML to avoid having to make repeated such
-     * checks in various places after.
-     * <p/>
-     * In case of multiple selection, we also need to remove all children when their
-     * parent is already selected since parents will always be added with all their
-     * children.
-     * <p/>
-     *
-     * @param selection The selection list to be sanitized <b>in-place</b>.
-     *      The <code>selection</code> argument should not be {@link #mSelections} -- the
-     *      given list is going to be altered and we should never alter the user-made selection.
-     *      Instead the caller should provide its own copy.
-     */
-    /* package */ static void sanitize(List<SelectionItem> selection) {
-        if (selection.isEmpty()) {
-            return;
-        }
-
-        for (Iterator<SelectionItem> it = selection.iterator(); it.hasNext(); ) {
-            SelectionItem cs = it.next();
-            CanvasViewInfo vi = cs.getViewInfo();
-            UiViewElementNode key = vi == null ? null : vi.getUiViewNode();
-            Node node = key == null ? null : key.getXmlNode();
-            if (node == null) {
-                // Missing ViewInfo or view key or XML, discard this.
-                it.remove();
-                continue;
-            }
-
-            if (vi != null) {
-                for (Iterator<SelectionItem> it2 = selection.iterator();
-                     it2.hasNext(); ) {
-                    SelectionItem cs2 = it2.next();
-                    if (cs != cs2) {
-                        CanvasViewInfo vi2 = cs2.getViewInfo();
-                        if (vi.isParent(vi2)) {
-                            // vi2 is a parent for vi. Remove vi.
-                            it.remove();
-                            break;
-                        }
-                    }
-                }
-            }
-        }
-    }
-
-    /**
-     * Selects the given list of nodes in the canvas, and returns true iff the
-     * attempt to select was successful.
-     *
-     * @param nodes The collection of nodes to be selected
-     * @param indices A list of indices within the parent for each node, or null
-     * @return True if and only if all nodes were successfully selected
-     */
-    public boolean selectDropped(List<INode> nodes, List<Integer> indices) {
-        assert indices == null || nodes.size() == indices.size();
-
-        ViewHierarchy viewHierarchy = mCanvas.getViewHierarchy();
-
-        // Look up a list of view infos which correspond to the nodes.
-        final Collection<CanvasViewInfo> newChildren = new ArrayList<CanvasViewInfo>();
-        for (int i = 0, n = nodes.size(); i < n; i++) {
-            INode node = nodes.get(i);
-
-            CanvasViewInfo viewInfo = viewHierarchy.findViewInfoFor(node);
-
-            // There are two scenarios where looking up a view info fails.
-            // The first one is that the node was just added and the render has not yet
-            // happened, so the ViewHierarchy has no record of the node. In this case
-            // there is nothing we can do, and the method will return false (which the
-            // caller will use to schedule a second attempt later).
-            // The second scenario is where the nodes *change identity*. This isn't
-            // common, but when a drop handler makes a lot of changes to its children,
-            // for example when dropping into a GridLayout where attributes are adjusted
-            // on nearly all the other children to update row or column attributes
-            // etc, then in some cases Eclipse's DOM model changes the identities of
-            // the nodes when applying all the edits, so the new Node we created (as
-            // well as possibly other nodes) are no longer the children we observe
-            // after the edit, and there are new copies there instead. In this case
-            // the UiViewModel also fails to map the nodes. To work around this,
-            // we track the *indices* (within the parent) during a drop, such that we
-            // know which children (according to their positions) the given nodes
-            // are supposed to map to, and then we use these view infos instead.
-            if (viewInfo == null && node instanceof NodeProxy && indices != null) {
-                INode parent = node.getParent();
-                CanvasViewInfo parentViewInfo = viewHierarchy.findViewInfoFor(parent);
-                if (parentViewInfo != null) {
-                    UiViewElementNode parentUiNode = parentViewInfo.getUiViewNode();
-                    if (parentUiNode != null) {
-                        List<UiElementNode> children = parentUiNode.getUiChildren();
-                        int index = indices.get(i);
-                        if (index >= 0 && index < children.size()) {
-                            UiElementNode replacedNode = children.get(index);
-                            viewInfo = viewHierarchy.findViewInfoFor(replacedNode);
-                        }
-                    }
-                }
-            }
-
-            if (viewInfo != null) {
-                if (nodes.size() > 1 && viewInfo.isHidden()) {
-                    // Skip spacers - unless you're dropping just one
-                    continue;
-                }
-                if (GridLayoutRule.sDebugGridLayout && (viewInfo.getName().equals(FQCN_SPACE)
-                        || viewInfo.getName().equals(FQCN_SPACE_V7))) {
-                    // In debug mode they might not be marked as hidden but we never never
-                    // want to select these guys
-                    continue;
-                }
-                newChildren.add(viewInfo);
-            }
-        }
-        boolean found = nodes.size() == newChildren.size();
-
-        if (found || newChildren.size() > 0) {
-            mCanvas.getSelectionManager().selectMultiple(newChildren);
-        }
-
-        return found;
-    }
-
-    /**
-     * Update the outline selection to select the given nodes, asynchronously.
-     * @param nodes The nodes to be selected
-     */
-    public void setOutlineSelection(final List<INode> nodes) {
-        Display.getDefault().asyncExec(new Runnable() {
-            @Override
-            public void run() {
-                selectDropped(nodes, null /* indices */);
-                syncOutlineSelection();
-            }
-        });
-    }
-
-    /**
-     * Syncs the current selection to the outline, synchronously.
-     */
-    public void syncOutlineSelection() {
-        OutlinePage outlinePage = mCanvas.getOutlinePage();
-        IWorkbenchPartSite site = outlinePage.getEditor().getSite();
-        ISelectionProvider selectionProvider = site.getSelectionProvider();
-        ISelection selection = selectionProvider.getSelection();
-        if (selection != null) {
-            outlinePage.setSelection(selection);
-        }
-    }
-
-    private void redraw() {
-        mCanvas.redraw();
-    }
-
-    SelectionItem createSelection(CanvasViewInfo vi) {
-        return new SelectionItem(mCanvas, vi);
-    }
-
-    /**
-     * Returns true if there is nothing selected
-     *
-     * @return true if there is nothing selected
-     */
-    public boolean isEmpty() {
-        return mSelections.size() == 0;
-    }
-
-    /**
-     * "Select" context menu which lists various menu options related to selection:
-     * <ul>
-     * <li> Select All
-     * <li> Select Parent
-     * <li> Select None
-     * <li> Select Siblings
-     * <li> Select Same Type
-     * </ul>
-     * etc.
-     */
-    public static class SelectionMenu extends SubmenuAction {
-        private final GraphicalEditorPart mEditor;
-
-        public SelectionMenu(GraphicalEditorPart editor) {
-            super("Select");
-            mEditor = editor;
-        }
-
-        @Override
-        public String getId() {
-            return "-selectionmenu"; //$NON-NLS-1$
-        }
-
-        @Override
-        protected void addMenuItems(Menu menu) {
-            LayoutCanvas canvas = mEditor.getCanvasControl();
-            SelectionManager selectionManager = canvas.getSelectionManager();
-            List<SelectionItem> selections = selectionManager.getSelections();
-            boolean selectedOne = selections.size() == 1;
-            boolean notRoot = selectedOne && !selections.get(0).isRoot();
-            boolean haveSelection = selections.size() > 0;
-
-            Action a;
-            a = selectionManager.new SelectAction("Select Parent\tEsc", SELECT_PARENT);
-            new ActionContributionItem(a).fill(menu, -1);
-            a.setEnabled(notRoot);
-            a.setAccelerator(SWT.ESC);
-
-            a = selectionManager.new SelectAction("Select Siblings", SELECT_SIBLINGS);
-            new ActionContributionItem(a).fill(menu, -1);
-            a.setEnabled(notRoot);
-
-            a = selectionManager.new SelectAction("Select Same Type", SELECT_SAME_TYPE);
-            new ActionContributionItem(a).fill(menu, -1);
-            a.setEnabled(selectedOne);
-
-            new Separator().fill(menu, -1);
-
-            // Special case for Select All: Use global action
-            a = canvas.getSelectAllAction();
-            new ActionContributionItem(a).fill(menu, -1);
-            a.setEnabled(true);
-
-            a = selectionManager.new SelectAction("Deselect All", SELECT_NONE);
-            new ActionContributionItem(a).fill(menu, -1);
-            a.setEnabled(haveSelection);
-        }
-    }
-
-    private static final int SELECT_PARENT = 1;
-    private static final int SELECT_SIBLINGS = 2;
-    private static final int SELECT_SAME_TYPE = 3;
-    private static final int SELECT_NONE = 4; // SELECT_ALL is handled separately
-
-    private class SelectAction extends Action {
-        private final int mType;
-
-        public SelectAction(String title, int type) {
-            super(title, IAction.AS_PUSH_BUTTON);
-            mType = type;
-        }
-
-        @Override
-        public void run() {
-            switch (mType) {
-                case SELECT_NONE:
-                    selectNone();
-                    break;
-                case SELECT_PARENT:
-                    selectParent();
-                    break;
-                case SELECT_SAME_TYPE:
-                    selectSameType();
-                    break;
-                case SELECT_SIBLINGS:
-                    selectSiblings();
-                    break;
-            }
-
-            List<INode> nodes = new ArrayList<INode>();
-            for (SelectionItem item : getSelections()) {
-                nodes.add(item.getNode());
-            }
-            setOutlineSelection(nodes);
-        }
-    }
-
-    public Pair<SelectionItem, SelectionHandle> findHandle(ControlPoint controlPoint) {
-        if (!isEmpty()) {
-            LayoutPoint layoutPoint = controlPoint.toLayout();
-            int distance = (int) ((PIXEL_MARGIN + PIXEL_RADIUS) / mCanvas.getScale());
-
-            for (SelectionItem item : getSelections()) {
-                SelectionHandles handles = item.getSelectionHandles();
-                // See if it's over the selection handles
-                SelectionHandle handle = handles.findHandle(layoutPoint, distance);
-                if (handle != null) {
-                    return Pair.of(item, handle);
-                }
-            }
-
-        }
-        return null;
-    }
-
-    /** Performs the default action provided by the currently selected view */
-    public void performDefaultAction() {
-        final List<SelectionItem> selections = getSelections();
-        if (selections.size() > 0) {
-            NodeProxy primary = selections.get(0).getNode();
-            if (primary != null) {
-                RulesEngine rulesEngine = mCanvas.getRulesEngine();
-                final String id = rulesEngine.callGetDefaultActionId(primary);
-                if (id == null) {
-                    return;
-                }
-                final List<RuleAction> actions = rulesEngine.callGetContextMenu(primary);
-                if (actions == null) {
-                    return;
-                }
-                RuleAction matching = null;
-                for (RuleAction a : actions) {
-                    if (id.equals(a.getId())) {
-                        matching = a;
-                        break;
-                    }
-                }
-                if (matching == null) {
-                    return;
-                }
-                final List<INode> selectedNodes = new ArrayList<INode>();
-                for (SelectionItem item : selections) {
-                    NodeProxy n = item.getNode();
-                    if (n != null) {
-                        selectedNodes.add(n);
-                    }
-                }
-                final RuleAction action = matching;
-                mCanvas.getEditorDelegate().getEditor().wrapUndoEditXmlModel(action.getTitle(),
-                    new Runnable() {
-                        @Override
-                        public void run() {
-                            action.getCallback().action(action, selectedNodes,
-                                    action.getId(), null);
-                            LayoutCanvas canvas = mCanvas;
-                            CanvasViewInfo root = canvas.getViewHierarchy().getRoot();
-                            if (root != null) {
-                                UiViewElementNode uiViewNode = root.getUiViewNode();
-                                NodeFactory nodeFactory = canvas.getNodeFactory();
-                                NodeProxy rootNode = nodeFactory.create(uiViewNode);
-                                if (rootNode != null) {
-                                    rootNode.applyPendingChanges();
-                                }
-                            }
-                        }
-                });
-            }
-        }
-    }
-
-    /** Performs renaming the selected views */
-    public void performRename() {
-        final List<SelectionItem> selections = getSelections();
-        if (selections.size() > 0) {
-            NodeProxy primary = selections.get(0).getNode();
-            if (primary != null) {
-                performRename(primary, selections);
-            }
-        }
-    }
-
-    /**
-     * Performs renaming the given node.
-     *
-     * @param primary the node to be renamed, or the primary node (to get the
-     *            current value from if more than one node should be renamed)
-     * @param selections if not null, a list of nodes to apply the setting to
-     *            (which should include the primary)
-     * @return the result of the renaming operation
-     */
-    @NonNull
-    public RenameResult performRename(
-            final @NonNull INode primary,
-            final @Nullable List<SelectionItem> selections) {
-        String id = primary.getStringAttr(ANDROID_URI, ATTR_ID);
-        if (id != null && !id.isEmpty()) {
-            RenameResult result = RenameResourceWizard.renameResource(
-                    mCanvas.getShell(),
-                    mCanvas.getEditorDelegate().getGraphicalEditor().getProject(),
-                    ResourceType.ID, BaseViewRule.stripIdPrefix(id), null, true /*canClear*/);
-            if (result.isCanceled()) {
-                return result;
-            } else if (!result.isUnavailable()) {
-                return result;
-            }
-        }
-        String currentId = primary.getStringAttr(ANDROID_URI, ATTR_ID);
-        currentId = BaseViewRule.stripIdPrefix(currentId);
-        InputDialog d = new InputDialog(
-                    AdtPlugin.getDisplay().getActiveShell(),
-                    "Set ID",
-                    "New ID:",
-                    currentId,
-                    ResourceNameValidator.create(false, (IProject) null, ResourceType.ID));
-        if (d.open() == Window.OK) {
-            final String s = d.getValue();
-            mCanvas.getEditorDelegate().getEditor().wrapUndoEditXmlModel("Set ID",
-                    new Runnable() {
-                @Override
-                public void run() {
-                    String newId = s;
-                    newId = NEW_ID_PREFIX + BaseViewRule.stripIdPrefix(s);
-                    if (selections != null) {
-                        for (SelectionItem item : selections) {
-                            NodeProxy node = item.getNode();
-                            if (node != null) {
-                                node.setAttribute(ANDROID_URI, ATTR_ID, newId);
-                            }
-                        }
-                    } else {
-                        primary.setAttribute(ANDROID_URI, ATTR_ID, newId);
-                    }
-
-                    LayoutCanvas canvas = mCanvas;
-                    CanvasViewInfo root = canvas.getViewHierarchy().getRoot();
-                    if (root != null) {
-                        UiViewElementNode uiViewNode = root.getUiViewNode();
-                        NodeFactory nodeFactory = canvas.getNodeFactory();
-                        NodeProxy rootNode = nodeFactory.create(uiViewNode);
-                        if (rootNode != null) {
-                            rootNode.applyPendingChanges();
-                        }
-                    }
-                }
-            });
-            return RenameResult.name(BaseViewRule.stripIdPrefix(s));
-        } else {
-            return RenameResult.canceled();
-        }
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/SelectionOverlay.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/SelectionOverlay.java
deleted file mode 100644
index 97d0481..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/SelectionOverlay.java
+++ /dev/null
@@ -1,247 +0,0 @@
-/*
- * Copyright (C) 2010 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.editors.layout.gle2;
-
-import com.android.ide.common.api.DrawingStyle;
-import com.android.ide.common.api.IGraphics;
-import com.android.ide.common.api.INode;
-import com.android.ide.common.api.Margins;
-import com.android.ide.common.api.Rect;
-import com.android.ide.eclipse.adt.internal.editors.layout.gre.NodeProxy;
-import com.android.ide.eclipse.adt.internal.editors.layout.gre.RulesEngine;
-
-import org.eclipse.swt.graphics.GC;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-/**
- * The {@link SelectionOverlay} paints the current selection as an overlay.
- */
-public class SelectionOverlay extends Overlay {
-    private final LayoutCanvas mCanvas;
-    private boolean mHidden;
-
-    /**
-     * Constructs a new {@link SelectionOverlay} tied to the given canvas.
-     *
-     * @param canvas the associated canvas
-     */
-    public SelectionOverlay(LayoutCanvas canvas) {
-        mCanvas = canvas;
-    }
-
-    /**
-     * Set whether the selection overlay should be hidden. This is done during some
-     * gestures like resize where the new bounds could be confused with the current
-     * selection bounds.
-     *
-     * @param hidden when true, hide the selection bounds, when false, unhide.
-     */
-    public void setHidden(boolean hidden) {
-        mHidden = hidden;
-    }
-
-    /**
-     * Paints the selection.
-     *
-     * @param selectionManager The {@link SelectionManager} holding the
-     *            selection.
-     * @param gcWrapper The graphics context wrapper for the layout rules to use.
-     * @param gc The SWT graphics object
-     * @param rulesEngine The {@link RulesEngine} holding the rules.
-     */
-    public void paint(SelectionManager selectionManager, GCWrapper gcWrapper,
-            GC gc, RulesEngine rulesEngine) {
-        if (mHidden) {
-            return;
-        }
-
-        List<SelectionItem> selections = selectionManager.getSelections();
-        int n = selections.size();
-        if (n > 0) {
-            List<NodeProxy> selectedNodes = new ArrayList<NodeProxy>();
-            boolean isMultipleSelection = n > 1;
-            for (SelectionItem s : selections) {
-                if (s.isRoot()) {
-                    // The root selection is never painted
-                    continue;
-                }
-
-                NodeProxy node = s.getNode();
-                if (node != null) {
-                    paintSelection(gcWrapper, gc, s, isMultipleSelection);
-                    selectedNodes.add(node);
-                }
-            }
-
-            if (selectedNodes.size() > 0) {
-                paintSelectionFeedback(gcWrapper, selectedNodes, rulesEngine);
-            } else {
-                CanvasViewInfo root = mCanvas.getViewHierarchy().getRoot();
-                if (root != null) {
-                    NodeProxy parent = mCanvas.getNodeFactory().create(root);
-                    rulesEngine.callPaintSelectionFeedback(gcWrapper,
-                            parent, Collections.<INode>emptyList(), root.getViewObject());
-                }
-            }
-
-            if (n == 1) {
-                NodeProxy node = selections.get(0).getNode();
-                if (node != null) {
-                    paintHints(gcWrapper, node, rulesEngine);
-                }
-            }
-        } else {
-            CanvasViewInfo root = mCanvas.getViewHierarchy().getRoot();
-            if (root != null) {
-                NodeProxy parent = mCanvas.getNodeFactory().create(root);
-                rulesEngine.callPaintSelectionFeedback(gcWrapper,
-                        parent, Collections.<INode>emptyList(), root.getViewObject());
-            }
-        }
-    }
-
-    /** Paint hint for current selection */
-    private void paintHints(GCWrapper gcWrapper, NodeProxy node, RulesEngine rulesEngine) {
-        INode parent = node.getParent();
-        if (parent instanceof NodeProxy) {
-            NodeProxy parentNode = (NodeProxy) parent;
-            List<String> infos = rulesEngine.callGetSelectionHint(parentNode, node);
-            if (infos != null && infos.size() > 0) {
-                gcWrapper.useStyle(DrawingStyle.HELP);
-
-                Rect b = mCanvas.getImageOverlay().getImageBounds();
-                if (b == null) {
-                    return;
-                }
-
-                // Compute the location to display the help. This is done in
-                // layout coordinates, so we need to apply the scale in reverse
-                // when making pixel margins
-                // TODO: We could take the Canvas dimensions into account to see
-                // where there is more room.
-                // TODO: The scrollbars should take the presence of hint text
-                // into account.
-                double scale = mCanvas.getScale();
-                int x, y;
-                if (b.w > b.h) {
-                    x = (int) (b.x + 3 / scale);
-                    y = (int) (b.y + b.h + 6 / scale);
-                } else {
-                    x = (int) (b.x + b.w + 6 / scale);
-                    y = (int) (b.y + 3 / scale);
-                }
-                gcWrapper.drawBoxedStrings(x, y, infos);
-            }
-        }
-    }
-
-    private void paintSelectionFeedback(GCWrapper gcWrapper, List<NodeProxy> nodes,
-            RulesEngine rulesEngine) {
-        // Add fastpath for n=1
-
-        // Group nodes into parent/child groups
-        Set<INode> parents = new HashSet<INode>();
-        for (INode node : nodes) {
-            INode parent = node.getParent();
-            if (/*parent == null || */parent instanceof NodeProxy) {
-                NodeProxy parentNode = (NodeProxy) parent;
-                parents.add(parentNode);
-            }
-        }
-        ViewHierarchy viewHierarchy = mCanvas.getViewHierarchy();
-        for (INode parent : parents) {
-            List<INode> children = new ArrayList<INode>();
-            for (INode node : nodes) {
-                INode nodeParent = node.getParent();
-                if (nodeParent == parent) {
-                    children.add(node);
-                }
-            }
-            CanvasViewInfo viewInfo = viewHierarchy.findViewInfoFor((NodeProxy) parent);
-            Object view = viewInfo != null ? viewInfo.getViewObject() : null;
-
-            rulesEngine.callPaintSelectionFeedback(gcWrapper,
-                    (NodeProxy) parent, children, view);
-        }
-    }
-
-    /** Called by the canvas when a view is being selected. */
-    private void paintSelection(IGraphics gc, GC swtGc, SelectionItem item,
-            boolean isMultipleSelection) {
-        CanvasViewInfo view = item.getViewInfo();
-        if (view.isHidden()) {
-            return;
-        }
-
-        NodeProxy selectedNode = item.getNode();
-        Rect r = selectedNode.getBounds();
-        if (!r.isValid()) {
-            return;
-        }
-
-        gc.useStyle(DrawingStyle.SELECTION);
-
-        Margins insets = mCanvas.getInsets(selectedNode.getFqcn());
-        int x1 = r.x;
-        int y1 = r.y;
-        int x2 = r.x2() + 1;
-        int y2 = r.y2() + 1;
-
-        if (insets != null) {
-            x1 += insets.left;
-            x2 -= insets.right;
-            y1 += insets.top;
-            y2 -= insets.bottom;
-        }
-
-        gc.drawRect(x1, y1, x2, y2);
-
-        // Paint sibling rectangles, if applicable
-        List<CanvasViewInfo> siblings = view.getNodeSiblings();
-        if (siblings != null) {
-            for (CanvasViewInfo sibling : siblings) {
-                if (sibling != view) {
-                    r = SwtUtils.toRect(sibling.getSelectionRect());
-                    gc.fillRect(r);
-                    gc.drawRect(r);
-                }
-            }
-        }
-
-        // Paint selection handles. These are painted in control coordinates on the
-        // real SWT GC object rather than in layout coordinates on the GCWrapper,
-        // since we want them to have a fixed size that is independent of the
-        // screen zoom.
-        CanvasTransform horizontalTransform = mCanvas.getHorizontalTransform();
-        CanvasTransform verticalTransform = mCanvas.getVerticalTransform();
-        int radius = SelectionHandle.PIXEL_RADIUS;
-        int doubleRadius = 2 * radius;
-        for (SelectionHandle handle : item.getSelectionHandles()) {
-            int cx = horizontalTransform.translate(handle.centerX);
-            int cy = verticalTransform.translate(handle.centerY);
-
-            SwtDrawingStyle style = SwtDrawingStyle.of(DrawingStyle.SELECTION);
-            gc.setAlpha(style.getStrokeAlpha());
-            swtGc.fillRectangle(cx - radius, cy - radius, doubleRadius, doubleRadius);
-        }
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/ShowWithinMenu.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/ShowWithinMenu.java
deleted file mode 100644
index d1d529e..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/ShowWithinMenu.java
+++ /dev/null
@@ -1,82 +0,0 @@
-
-package com.android.ide.eclipse.adt.internal.editors.layout.gle2;
-
-import com.android.ide.common.rendering.api.Capability;
-import com.android.ide.eclipse.adt.internal.editors.layout.LayoutEditorDelegate;
-import com.android.ide.eclipse.adt.internal.editors.layout.gle2.IncludeFinder.Reference;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.ActionContributionItem;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.action.Separator;
-import org.eclipse.swt.widgets.Menu;
-
-import java.util.List;
-
-/**
- * Action which creates a submenu for the "Show Included In" action
- */
-class ShowWithinMenu extends SubmenuAction {
-    private LayoutEditorDelegate mEditorDelegate;
-
-    ShowWithinMenu(LayoutEditorDelegate editorDelegate) {
-        super("Show Included In");
-        mEditorDelegate = editorDelegate;
-    }
-
-    @Override
-    protected void addMenuItems(Menu menu) {
-        GraphicalEditorPart graphicalEditor = mEditorDelegate.getGraphicalEditor();
-        IFile file = graphicalEditor.getEditedFile();
-        if (graphicalEditor.renderingSupports(Capability.EMBEDDED_LAYOUT)) {
-            IProject project = file.getProject();
-            IncludeFinder finder = IncludeFinder.get(project);
-            final List<Reference> includedBy = finder.getIncludedBy(file);
-
-            if (includedBy != null && includedBy.size() > 0) {
-                for (final Reference reference : includedBy) {
-                    String title = reference.getDisplayName();
-                    IAction action = new ShowWithinAction(title, reference);
-                    new ActionContributionItem(action).fill(menu, -1);
-                }
-                new Separator().fill(menu, -1);
-            }
-            IAction action = new ShowWithinAction("Nothing", null);
-            if (includedBy == null || includedBy.size() == 0) {
-                action.setEnabled(false);
-            }
-            new ActionContributionItem(action).fill(menu, -1);
-        } else {
-            addDisabledMessageItem("Not supported on platform");
-        }
-    }
-
-    /** Action to select one particular include-context */
-    private class ShowWithinAction extends Action {
-        private Reference mReference;
-
-        public ShowWithinAction(String title, Reference reference) {
-            super(title, IAction.AS_RADIO_BUTTON);
-            mReference = reference;
-        }
-
-        @Override
-        public boolean isChecked() {
-            Reference within = mEditorDelegate.getGraphicalEditor().getIncludedWithin();
-            if (within == null) {
-                return mReference == null;
-            } else {
-                return within.equals(mReference);
-            }
-        }
-
-        @Override
-        public void run() {
-            if (!isChecked()) {
-                mEditorDelegate.getGraphicalEditor().showIn(mReference);
-            }
-        }
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/SimpleAttribute.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/SimpleAttribute.java
deleted file mode 100644
index 198c164..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/SimpleAttribute.java
+++ /dev/null
@@ -1,124 +0,0 @@
-/*
- * Copyright (C) 2009 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.editors.layout.gle2;
-
-import com.android.annotations.NonNull;
-import com.android.ide.common.api.INode.IAttribute;
-
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-/**
- * Represents one XML attribute in a {@link SimpleElement}.
- * <p/>
- * The attribute is always represented by a namespace URI, a name and a value.
- * The name cannot be empty.
- * The namespace URI can be empty for an attribute without a namespace but is never null.
- * The value can be empty but cannot be null.
- * <p/>
- * For a more detailed explanation of the purpose of this class,
- * please see {@link SimpleXmlTransfer}.
- */
-public class SimpleAttribute implements IAttribute {
-    private final String mName;
-    private final String mValue;
-    private final String mUri;
-
-    /**
-     * Creates a new {@link SimpleAttribute}.
-     * <p/>
-     * Any null value will be converted to an empty non-null string.
-     * However it is a semantic error to use an empty name -- no assertion is done though.
-     *
-     * @param uri The URI of the attribute.
-     * @param name The XML local name of the attribute.
-     * @param value The value of the attribute.
-     */
-    public SimpleAttribute(String uri, String name, String value) {
-        mUri = uri == null ? "" : uri;
-        mName = name == null ? "" : name;
-        mValue = value == null ? "" : value;
-    }
-
-    /**
-     * Returns the namespace URI of the attribute.
-     * Can be empty for an attribute without a namespace but is never null.
-     */
-    @Override
-    public @NonNull String getUri() {
-        return mUri;
-    }
-
-    /** Returns the XML local name of the attribute. Cannot be null nor empty. */
-    @Override
-    public @NonNull String getName() {
-        return mName;
-    }
-
-    /** Returns the value of the attribute. Cannot be null. Can be empty. */
-    @Override
-    public @NonNull String getValue() {
-        return mValue;
-    }
-
-    // reader and writer methods
-
-    @Override
-    public String toString() {
-        return String.format("@%s:%s=%s\n", //$NON-NLS-1$
-                mName,
-                mUri,
-                mValue);
-    }
-
-    private static final Pattern REGEXP =
-        Pattern.compile("[^@]*@([^:]+):([^=]*)=([^\n]*)\n*");       //$NON-NLS-1$
-
-    static SimpleAttribute parseString(String value) {
-        Matcher m = REGEXP.matcher(value);
-        if (m.matches()) {
-            return new SimpleAttribute(m.group(2), m.group(1), m.group(3));
-        }
-
-        return null;
-    }
-
-    @Override
-    public boolean equals(Object obj) {
-        if (obj instanceof SimpleAttribute) {
-            SimpleAttribute sa = (SimpleAttribute) obj;
-
-            return mName.equals(sa.mName) &&
-                    mUri.equals(sa.mUri) &&
-                    mValue.equals(sa.mValue);
-        }
-        return false;
-    }
-
-    @Override
-    public int hashCode() {
-        long c = mName.hashCode();
-        // uses the formula defined in java.util.List.hashCode()
-        c = 31*c + mUri.hashCode();
-        c = 31*c + mValue.hashCode();
-        if (c > 0x0FFFFFFFFL) {
-            // wrap any overflow
-            c = c ^ (c >> 32);
-        }
-        return (int)(c & 0x0FFFFFFFFL);
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/SimpleElement.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/SimpleElement.java
deleted file mode 100644
index 9acc8c2..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/SimpleElement.java
+++ /dev/null
@@ -1,370 +0,0 @@
-/*
- * Copyright (C) 2009 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.editors.layout.gle2;
-
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-import com.android.ide.common.api.IDragElement;
-import com.android.ide.common.api.INode;
-import com.android.ide.common.api.Rect;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * Represents an XML element with a name, attributes and inner elements.
- * <p/>
- * The semantic of the element name is to be a fully qualified class name of a View to inflate.
- * The element name is not expected to have a name space.
- * <p/>
- * For a more detailed explanation of the purpose of this class,
- * please see {@link SimpleXmlTransfer}.
- */
-public class SimpleElement implements IDragElement {
-
-    /** Version number of the internal serialized string format. */
-    private static final String FORMAT_VERSION = "3";
-
-    private final String mFqcn;
-    private final String mParentFqcn;
-    private final Rect mBounds;
-    private final Rect mParentBounds;
-    private final List<IDragAttribute> mAttributes = new ArrayList<IDragAttribute>();
-    private final List<IDragElement> mElements = new ArrayList<IDragElement>();
-
-    private IDragAttribute[] mCachedAttributes = null;
-    private IDragElement[] mCachedElements = null;
-    private SelectionItem mSelectionItem;
-
-    /**
-     * Creates a new {@link SimpleElement} with the specified element name.
-     *
-     * @param fqcn A fully qualified class name of a View to inflate, e.g.
-     *             "android.view.Button". Must not be null nor empty.
-     * @param parentFqcn The fully qualified class name of the parent of this element.
-     *                   Can be null but not empty.
-     * @param bounds The canvas bounds of the originating canvas node of the element.
-     *               If null, a non-null invalid rectangle will be assigned.
-     * @param parentBounds The canvas bounds of the parent of this element. Can be null.
-     */
-    public SimpleElement(String fqcn, String parentFqcn, Rect bounds, Rect parentBounds) {
-        mFqcn = fqcn;
-        mParentFqcn = parentFqcn;
-        mBounds = bounds == null ? new Rect() : bounds.copy();
-        mParentBounds = parentBounds == null ? new Rect() : parentBounds.copy();
-    }
-
-    /**
-     * Returns the element name, which must match a fully qualified class name of
-     * a View to inflate.
-     */
-    @Override
-    public @NonNull String getFqcn() {
-        return mFqcn;
-    }
-
-    /**
-     * Returns the bounds of the element's node, if it originated from an existing
-     * canvas. The rectangle is invalid and non-null when the element originated
-     * from the object palette (unless it successfully rendered a preview)
-     */
-    @Override
-    public @NonNull Rect getBounds() {
-        return mBounds;
-    }
-
-    /**
-     * Returns the fully qualified class name of the parent, if the element originated
-     * from an existing canvas. Returns null if the element has no parent, such as a top
-     * level element or an element originating from the object palette.
-     */
-    @Override
-    public String getParentFqcn() {
-        return mParentFqcn;
-    }
-
-    /**
-     * Returns the bounds of the element's parent, absolute for the canvas, or null if there
-     * is no suitable parent. This is null when {@link #getParentFqcn()} is null.
-     */
-    @Override
-    public @NonNull Rect getParentBounds() {
-        return mParentBounds;
-    }
-
-    @Override
-    public @NonNull IDragAttribute[] getAttributes() {
-        if (mCachedAttributes == null) {
-            mCachedAttributes = mAttributes.toArray(new IDragAttribute[mAttributes.size()]);
-        }
-        return mCachedAttributes;
-    }
-
-    @Override
-    public IDragAttribute getAttribute(@Nullable String uri, @NonNull String localName) {
-        for (IDragAttribute attr : mAttributes) {
-            if (attr.getUri().equals(uri) && attr.getName().equals(localName)) {
-                return attr;
-            }
-        }
-
-        return null;
-    }
-
-    @Override
-    public @NonNull IDragElement[] getInnerElements() {
-        if (mCachedElements == null) {
-            mCachedElements = mElements.toArray(new IDragElement[mElements.size()]);
-        }
-        return mCachedElements;
-    }
-
-    public void addAttribute(SimpleAttribute attr) {
-        mCachedAttributes = null;
-        mAttributes.add(attr);
-    }
-
-    public void addInnerElement(SimpleElement e) {
-        mCachedElements = null;
-        mElements.add(e);
-    }
-
-    @Override
-    public boolean isSame(@NonNull INode node) {
-        if (mSelectionItem != null) {
-            return node == mSelectionItem.getNode();
-        } else {
-            return node.getBounds().equals(mBounds);
-        }
-    }
-
-    void setSelectionItem(@Nullable SelectionItem selectionItem) {
-        mSelectionItem = selectionItem;
-    }
-
-    @Nullable
-    SelectionItem getSelectionItem() {
-        return mSelectionItem;
-    }
-
-    @Nullable
-    static SimpleElement findPrimary(SimpleElement[] elements, SelectionItem primary) {
-        if (elements == null || elements.length == 0) {
-            return null;
-        }
-
-        if (elements.length == 1 || primary == null) {
-            return elements[0];
-        }
-
-        for (SimpleElement element : elements) {
-            if (element.getSelectionItem() == primary) {
-                return element;
-            }
-        }
-
-        return elements[0];
-    }
-
-    // reader and writer methods
-
-    @Override
-    public String toString() {
-        StringBuilder sb = new StringBuilder();
-        sb.append("{V=").append(FORMAT_VERSION);
-        sb.append(",N=").append(mFqcn);
-        if (mParentFqcn != null) {
-            sb.append(",P=").append(mParentFqcn);
-        }
-        if (mBounds != null && mBounds.isValid()) {
-            sb.append(String.format(",R=%d %d %d %d", mBounds.x, mBounds.y, mBounds.w, mBounds.h));
-        }
-        if (mParentBounds != null && mParentBounds.isValid()) {
-            sb.append(String.format(",Q=%d %d %d %d",
-                    mParentBounds.x, mParentBounds.y, mParentBounds.w, mParentBounds.h));
-        }
-        sb.append('\n');
-        for (IDragAttribute a : mAttributes) {
-            sb.append(a.toString());
-        }
-        for (IDragElement e : mElements) {
-            sb.append(e.toString());
-        }
-        sb.append("}\n"); //$NON-NLS-1$
-        return sb.toString();
-    }
-
-    /** Parses a string containing one or more elements. */
-    static SimpleElement[] parseString(String value) {
-        ArrayList<SimpleElement> elements = new ArrayList<SimpleElement>();
-        String[] lines = value.split("\n");
-        int[] index = new int[] { 0 };
-        SimpleElement element = null;
-        while ((element = parseLines(lines, index)) != null) {
-            elements.add(element);
-        }
-        return elements.toArray(new SimpleElement[elements.size()]);
-    }
-
-    /**
-     * Parses one element from the input lines array, starting at the inOutIndex
-     * and updating the inOutIndex to match the next unread line on output.
-     */
-    private static SimpleElement parseLines(String[] lines, int[] inOutIndex) {
-        SimpleElement e = null;
-        int index = inOutIndex[0];
-        while (index < lines.length) {
-            String line = lines[index++];
-            String s = line.trim();
-            if (s.startsWith("{")) {                                //$NON-NLS-1$
-                if (e == null) {
-                    // This is the element's header, it should have
-                    // the format "key=value,key=value,..."
-                    String version = null;
-                    String fqcn = null;
-                    String parent = null;
-                    Rect bounds = null;
-                    Rect pbounds = null;
-
-                    for (String s2 : s.substring(1).split(",")) {   //$NON-NLS-1$
-                        int pos = s2.indexOf('=');
-                        if (pos <= 0 || pos == s2.length() - 1) {
-                            continue;
-                        }
-                        String key = s2.substring(0, pos).trim();
-                        String value = s2.substring(pos + 1).trim();
-
-                        if (key.equals("V")) {                      //$NON-NLS-1$
-                            version = value;
-                            if (!value.equals(FORMAT_VERSION)) {
-                                // Wrong format version. Don't even try to process anything
-                                // else and just give up everything.
-                                inOutIndex[0] = index;
-                                return null;
-                            }
-
-                        } else if (key.equals("N")) {               //$NON-NLS-1$
-                            fqcn = value;
-
-                        } else if (key.equals("P")) {               //$NON-NLS-1$
-                            parent = value;
-
-                        } else if (key.equals("R") || key.equals("Q")) { //$NON-NLS-1$ //$NON-NLS-2$
-                            // Parse the canvas bounds
-                            String[] sb = value.split(" +");        //$NON-NLS-1$
-                            if (sb != null && sb.length == 4) {
-                                Rect r = null;
-                                try {
-                                    r = new Rect();
-                                    r.x = Integer.parseInt(sb[0]);
-                                    r.y = Integer.parseInt(sb[1]);
-                                    r.w = Integer.parseInt(sb[2]);
-                                    r.h = Integer.parseInt(sb[3]);
-
-                                    if (key.equals("R")) {
-                                        bounds = r;
-                                    } else {
-                                        pbounds = r;
-                                    }
-                                } catch (NumberFormatException ignore) {
-                                }
-                            }
-                        }
-                    }
-
-                    // We need at least a valid name to recreate an element
-                    if (version != null && fqcn != null && fqcn.length() > 0) {
-                        e = new SimpleElement(fqcn, parent, bounds, pbounds);
-                    }
-                } else {
-                    // This is an inner element... need to parse the { line again.
-                    inOutIndex[0] = index - 1;
-                    SimpleElement e2 = SimpleElement.parseLines(lines, inOutIndex);
-                    if (e2 != null) {
-                        e.addInnerElement(e2);
-                    }
-                    index = inOutIndex[0];
-                }
-
-            } else if (e != null && s.startsWith("@")) {    //$NON-NLS-1$
-                SimpleAttribute a = SimpleAttribute.parseString(line);
-                if (a != null) {
-                    e.addAttribute(a);
-                }
-
-            } else if (e != null && s.startsWith("}")) {     //$NON-NLS-1$
-                // We're done with this element
-                inOutIndex[0] = index;
-                return e;
-            }
-        }
-        inOutIndex[0] = index;
-        return null;
-    }
-
-    @Override
-    public boolean equals(Object obj) {
-        if (obj instanceof SimpleElement) {
-            SimpleElement se = (SimpleElement) obj;
-
-            // Bounds and parentFqcn must be null on both sides or equal.
-            if ((mBounds == null && se.mBounds != null) ||
-                    (mBounds != null && !mBounds.equals(se.mBounds))) {
-                return false;
-            }
-            if ((mParentFqcn == null && se.mParentFqcn != null) ||
-                    (mParentFqcn != null && !mParentFqcn.equals(se.mParentFqcn))) {
-                return false;
-            }
-            if ((mParentBounds == null && se.mParentBounds != null) ||
-                    (mParentBounds != null && !mParentBounds.equals(se.mParentBounds))) {
-                return false;
-            }
-
-            return mFqcn.equals(se.mFqcn) &&
-                    mAttributes.size() == se.mAttributes.size() &&
-                    mElements.size() == se.mElements.size() &&
-                    mAttributes.equals(se.mAttributes) &&
-                    mElements.equals(se.mElements);
-        }
-        return false;
-    }
-
-    @Override
-    public int hashCode() {
-        long c = mFqcn.hashCode();
-        // uses the formula defined in java.util.List.hashCode()
-        c = 31*c + mAttributes.hashCode();
-        c = 31*c + mElements.hashCode();
-        if (mParentFqcn != null) {
-            c = 31*c + mParentFqcn.hashCode();
-        }
-        if (mBounds != null && mBounds.isValid()) {
-            c = 31*c + mBounds.hashCode();
-        }
-        if (mParentBounds != null && mParentBounds.isValid()) {
-            c = 31*c + mParentBounds.hashCode();
-        }
-
-        if (c > 0x0FFFFFFFFL) {
-            // wrap any overflow
-            c = c ^ (c >> 32);
-        }
-        return (int)(c & 0x0FFFFFFFFL);
-    }
-}
-
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/SimpleXmlTransfer.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/SimpleXmlTransfer.java
deleted file mode 100644
index 20ac203..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/SimpleXmlTransfer.java
+++ /dev/null
@@ -1,154 +0,0 @@
-/*
- * Copyright (C) 2009 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.editors.layout.gle2;
-
-import com.android.ide.eclipse.adt.internal.editors.descriptors.ElementDescriptor;
-import com.android.ide.eclipse.adt.internal.editors.layout.descriptors.ViewElementDescriptor;
-
-import org.eclipse.swt.dnd.ByteArrayTransfer;
-import org.eclipse.swt.dnd.TransferData;
-
-import java.io.UnsupportedEncodingException;
-
-/**
- * A d'n'd {@link Transfer} class that can transfer a <em>simplified</em> XML fragment
- * to transfer elements and their attributes between {@link LayoutCanvas}.
- * <p/>
- * The implementation is based on the {@link ByteArrayTransfer} and what we transfer
- * is text with the following fixed format:
- * <p/>
- * <pre>
- * {element-name element-property ...
- *  attrib_name="attrib_value"
- *  attrib2="..."
- *  {...inner elements...
- *  }
- * }
- * {...next element...
- * }
- *
- * </pre>
- * The format has nothing to do with XML per se, except for the fact that the
- * transfered content represents XML elements and XML attributes.
- *
- * <p/>
- * The detailed syntax is:
- * <pre>
- * - ELEMENT     := {NAME PROPERTY*\nATTRIB_LINE*ELEMENT*}\n
- * - PROPERTY    := $[A-Z]=[^ ]*
- * - NAME        := [^\n=]+
- * - ATTRIB_LINE := @URI:NAME=[^\n]*\n
- * </pre>
- *
- * Elements are represented by {@link SimpleElement}s and their attributes by
- * {@link SimpleAttribute}s, all of which have very specific properties that are
- * specifically limited to our needs for drag'n'drop.
- */
-final class SimpleXmlTransfer extends ByteArrayTransfer {
-
-    // Reference: http://www.eclipse.org/articles/Article-SWT-DND/DND-in-SWT.html
-
-    private static final String TYPE_NAME = "android.ADT.simple.xml.transfer.1";    //$NON-NLS-1$
-    private static final int TYPE_ID = registerType(TYPE_NAME);
-    private static final SimpleXmlTransfer sInstance = new SimpleXmlTransfer();
-
-    /** Private constructor. Use {@link #getInstance()} to retrieve the singleton instance. */
-    private SimpleXmlTransfer() {
-        // pass
-    }
-
-    /** Returns the singleton instance. */
-    public static SimpleXmlTransfer getInstance() {
-        return sInstance;
-    }
-
-    /**
-     * Helper method that returns the FQCN transfered for the given {@link ElementDescriptor}.
-     * <p/>
-     * If the descriptor is a {@link ViewElementDescriptor}, the transfered data is the FQCN
-     * of the Android View class represented (e.g. "android.widget.Button").
-     * For any other non-null descriptor, the XML name is used.
-     * Otherwise it is null.
-     *
-     * @param desc The {@link ElementDescriptor} to transfer.
-     * @return The FQCN, XML name or null.
-     */
-    public static String getFqcn(ElementDescriptor desc) {
-        if (desc instanceof ViewElementDescriptor) {
-            return ((ViewElementDescriptor) desc).getFullClassName();
-        } else if (desc != null) {
-            return desc.getXmlName();
-        }
-
-        return null;
-    }
-
-    @Override
-    protected int[] getTypeIds() {
-        return new int[] { TYPE_ID };
-    }
-
-    @Override
-    protected String[] getTypeNames() {
-        return new String[] { TYPE_NAME };
-    }
-
-    /** Transforms a array of {@link SimpleElement} into a native data transfer. */
-    @Override
-    protected void javaToNative(Object object, TransferData transferData) {
-        if (object == null || !(object instanceof SimpleElement[])) {
-            return;
-        }
-
-        if (isSupportedType(transferData)) {
-            StringBuilder sb = new StringBuilder();
-            for (SimpleElement e : (SimpleElement[]) object) {
-                sb.append(e.toString());
-            }
-            String data = sb.toString();
-
-            try {
-                byte[] buf = data.getBytes("UTF-8");  //$NON-NLS-1$
-                super.javaToNative(buf, transferData);
-            } catch (UnsupportedEncodingException e) {
-                // unlikely; ignore
-            }
-        }
-    }
-
-    /**
-     * Recreates an array of {@link SimpleElement} from a native data transfer.
-     *
-     * @return An array of {@link SimpleElement} or null. The array may be empty.
-     */
-    @Override
-    protected Object nativeToJava(TransferData transferData) {
-        if (isSupportedType(transferData)) {
-            byte[] buf = (byte[]) super.nativeToJava(transferData);
-            if (buf != null && buf.length > 0) {
-                try {
-                    String s = new String(buf, "UTF-8"); //$NON-NLS-1$
-                    return SimpleElement.parseString(s);
-                } catch (UnsupportedEncodingException e) {
-                    // unlikely to happen, but still possible
-                }
-            }
-        }
-
-        return null;
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/SubmenuAction.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/SubmenuAction.java
deleted file mode 100644
index 0923dda..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/SubmenuAction.java
+++ /dev/null
@@ -1,75 +0,0 @@
-
-package com.android.ide.eclipse.adt.internal.editors.layout.gle2;
-
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.ActionContributionItem;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.action.IMenuCreator;
-import org.eclipse.swt.events.MenuEvent;
-import org.eclipse.swt.events.MenuListener;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Menu;
-import org.eclipse.swt.widgets.MenuItem;
-
-/**
- * Action which creates a submenu that is dynamically populated by subclasses
- */
-public abstract class SubmenuAction extends Action implements MenuListener, IMenuCreator {
-    private Menu mMenu;
-
-    public SubmenuAction(String title) {
-        super(title, IAction.AS_DROP_DOWN_MENU);
-    }
-
-    @Override
-    public IMenuCreator getMenuCreator() {
-        return this;
-    }
-
-    @Override
-    public void dispose() {
-        if (mMenu != null) {
-            mMenu.dispose();
-            mMenu = null;
-        }
-    }
-
-    @Override
-    public Menu getMenu(Control parent) {
-        return null;
-    }
-
-    @Override
-    public Menu getMenu(Menu parent) {
-        mMenu = new Menu(parent);
-        mMenu.addMenuListener(this);
-        return mMenu;
-    }
-
-    @Override
-    public void menuHidden(MenuEvent e) {
-    }
-
-    protected abstract void addMenuItems(Menu menu);
-
-    @Override
-    public void menuShown(MenuEvent e) {
-        // TODO: Replace this stuff with manager.setRemoveAllWhenShown(true);
-        MenuItem[] menuItems = mMenu.getItems();
-        for (int i = 0; i < menuItems.length; i++) {
-            menuItems[i].dispose();
-        }
-        addMenuItems(mMenu);
-    }
-
-    protected void addDisabledMessageItem(String message) {
-        IAction action = new Action(message, IAction.AS_PUSH_BUTTON) {
-            @Override
-            public void run() {
-            }
-        };
-        action.setEnabled(false);
-        new ActionContributionItem(action).fill(mMenu, -1);
-
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/SwtDrawingStyle.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/SwtDrawingStyle.java
deleted file mode 100644
index 93a3328..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/SwtDrawingStyle.java
+++ /dev/null
@@ -1,319 +0,0 @@
-/*
- * Copyright (C) 2010 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.editors.layout.gle2;
-
-import com.android.ide.common.api.DrawingStyle;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.RGB;
-
-/**
- * Description of the drawing styles with specific color, line style and alpha
- * definitions. This class corresponds to the more generic {@link DrawingStyle}
- * class which defines the drawing styles but does not introduce any specific
- * SWT values to the API clients.
- * <p>
- * TODO: This class should eventually be replaced by a scheme where the color
- * constants are instead coming from the theme.
- */
-public enum SwtDrawingStyle {
-    /**
-     * The style definition corresponding to {@link DrawingStyle#SELECTION}
-     */
-    SELECTION(new RGB(0x00, 0x99, 0xFF), 192, new RGB(0x00, 0x99, 0xFF), 192, 1, SWT.LINE_SOLID),
-
-    /**
-     * The style definition corresponding to {@link DrawingStyle#GUIDELINE}
-     */
-    GUIDELINE(new RGB(0x00, 0xAA, 0x00), 192, SWT.LINE_SOLID),
-
-    /**
-     * The style definition corresponding to {@link DrawingStyle#GUIDELINE}
-     */
-    GUIDELINE_SHADOW(new RGB(0x00, 0xAA, 0x00), 192, SWT.LINE_SOLID),
-
-    /**
-     * The style definition corresponding to {@link DrawingStyle#GUIDELINE_DASHED}
-     */
-    GUIDELINE_DASHED(new RGB(0x00, 0xAA, 0x00), 192, SWT.LINE_CUSTOM),
-
-    /**
-     * The style definition corresponding to {@link DrawingStyle#DISTANCE}
-     */
-    DISTANCE(new RGB(0xFF, 0x00, 0x00), 192 - 32, SWT.LINE_SOLID),
-
-    /**
-     * The style definition corresponding to {@link DrawingStyle#GRID}
-     */
-    GRID(new RGB(0xAA, 0xAA, 0xAA), 128, SWT.LINE_SOLID),
-
-    /**
-     * The style definition corresponding to {@link DrawingStyle#HOVER}
-     */
-    HOVER(null, 0, new RGB(0xFF, 0xFF, 0xFF), 40, 1, SWT.LINE_DOT),
-
-    /**
-     * The style definition corresponding to {@link DrawingStyle#HOVER}
-     */
-    HOVER_SELECTION(null, 0, new RGB(0xFF, 0xFF, 0xFF), 10, 1, SWT.LINE_DOT),
-
-    /**
-     * The style definition corresponding to {@link DrawingStyle#ANCHOR}
-     */
-    ANCHOR(new RGB(0x00, 0x99, 0xFF), 96, SWT.LINE_SOLID),
-
-    /**
-     * The style definition corresponding to {@link DrawingStyle#OUTLINE}
-     */
-    OUTLINE(new RGB(0x88, 0xFF, 0x88), 160, SWT.LINE_SOLID),
-
-    /**
-     * The style definition corresponding to {@link DrawingStyle#DROP_RECIPIENT}
-     */
-    DROP_RECIPIENT(new RGB(0xFF, 0x99, 0x00), 255, new RGB(0xFF, 0x99, 0x00), 160, 2,
-            SWT.LINE_SOLID),
-
-    /**
-     * The style definition corresponding to {@link DrawingStyle#DROP_ZONE}
-     */
-    DROP_ZONE(new RGB(0x00, 0xAA, 0x00), 220, new RGB(0x55, 0xAA, 0x00), 200, 1, SWT.LINE_SOLID),
-
-    /**
-     * The style definition corresponding to
-     * {@link DrawingStyle#DROP_ZONE_ACTIVE}
-     */
-    DROP_ZONE_ACTIVE(new RGB(0x00, 0xAA, 0x00), 220, new RGB(0x00, 0xAA, 0x00), 128, 2,
-            SWT.LINE_SOLID),
-
-    /**
-     * The style definition corresponding to {@link DrawingStyle#DROP_PREVIEW}
-     */
-    DROP_PREVIEW(new RGB(0xFF, 0x99, 0x00), 255, null, 0, 2, SWT.LINE_CUSTOM),
-
-    /**
-     * The style definition corresponding to {@link DrawingStyle#RESIZE_PREVIEW}
-     */
-    RESIZE_PREVIEW(new RGB(0xFF, 0x99, 0x00), 255, null, 0, 2, SWT.LINE_SOLID),
-
-    /**
-     * The style used to show a proposed resize bound which is being rejected (for example,
-     * because there is no near edge to attach to in a RelativeLayout).
-     */
-    RESIZE_FAIL(new RGB(0xFF, 0x99, 0x00), 255, null, 0, 2, SWT.LINE_CUSTOM),
-
-    /**
-     * The style definition corresponding to {@link DrawingStyle#HELP}
-     */
-    HELP(new RGB(0xFF, 0xFF, 0xFF), 255, new RGB(0x00, 0x00, 0x00), 128, 1, SWT.LINE_SOLID),
-
-    /**
-     * The style definition corresponding to {@link DrawingStyle#INVALID}
-     */
-    INVALID(new RGB(0xFF, 0xFF, 0xFF), 255, new RGB(0xFF, 0x00, 0x00), 64, 2, SWT.LINE_SOLID),
-
-    /**
-     * The style definition corresponding to {@link DrawingStyle#DEPENDENCY}
-     */
-    DEPENDENCY(new RGB(0xFF, 0xFF, 0xFF), 255, new RGB(0xFF, 0xFF, 0x00), 24, 2, SWT.LINE_SOLID),
-
-    /**
-     * The style definition corresponding to {@link DrawingStyle#CYCLE}
-     */
-    CYCLE(new RGB(0xFF, 0x00, 0x00), 192, null, 0, 1, SWT.LINE_SOLID),
-
-    /**
-     * The style definition corresponding to {@link DrawingStyle#DRAGGED}
-     */
-    DRAGGED(new RGB(0xFF, 0xFF, 0xFF), 255, new RGB(0x00, 0xFF, 0x00), 16, 2, SWT.LINE_SOLID),
-
-    /**
-     * The style definition corresponding to {@link DrawingStyle#EMPTY}
-     */
-    EMPTY(new RGB(0xFF, 0xFF, 0x55), 255, new RGB(0xFF, 0xFF, 0x55), 255, 1, SWT.LINE_DASH),
-
-    /**
-     * The style definition corresponding to {@link DrawingStyle#CUSTOM1}
-     */
-    CUSTOM1(new RGB(0xFF, 0x00, 0xFF), 255, null, 0, 1, SWT.LINE_SOLID),
-
-    /**
-     * The style definition corresponding to {@link DrawingStyle#CUSTOM2}
-     */
-    CUSTOM2(new RGB(0x00, 0xFF, 0xFF), 255, null, 0, 1, SWT.LINE_DOT);
-
-    /**
-     * Construct a new style value with the given foreground, background, width,
-     * linestyle and transparency.
-     *
-     * @param stroke A color descriptor for the foreground color, or null if no
-     *            foreground color should be set
-     * @param fill A color descriptor for the background color, or null if no
-     *            foreground color should be set
-     * @param lineWidth The line width, in pixels, or 0 if no line width should
-     *            be set
-     * @param lineStyle The SWT line style - such as {@link SWT#LINE_SOLID}.
-     * @param strokeAlpha The alpha value of the stroke, an integer in the range 0 to 255
-     *            where 0 is fully transparent and 255 is fully opaque.
-     * @param fillAlpha The alpha value of the fill, an integer in the range 0 to 255
-     *            where 0 is fully transparent and 255 is fully opaque.
-     */
-    private SwtDrawingStyle(RGB stroke, int strokeAlpha, RGB fill, int fillAlpha, int lineWidth,
-            int lineStyle) {
-        mStroke = stroke;
-        mFill = fill;
-        mLineWidth = lineWidth;
-        mLineStyle = lineStyle;
-        mStrokeAlpha = strokeAlpha;
-        mFillAlpha = fillAlpha;
-    }
-
-    /**
-     * Convenience constructor for typical drawing styles, which do not specify
-     * a fill and use a standard thickness line
-     *
-     * @param stroke Stroke color to be used (e.g. for the border/foreground)
-     * @param strokeAlpha Transparency to use for the stroke; 0 is transparent
-     *            and 255 is fully opaque.
-     * @param lineStyle The SWT line style - such as {@link SWT#LINE_SOLID}.
-     */
-    private SwtDrawingStyle(RGB stroke, int strokeAlpha, int lineStyle) {
-        this(stroke, strokeAlpha, null, 255, 1, lineStyle);
-    }
-
-    /**
-     * Return the stroke/foreground/border RGB color description to be used for
-     * this style, or null if none
-     */
-    public RGB getStrokeColor() {
-        return mStroke;
-    }
-
-    /**
-     * Return the fill/background/interior RGB color description to be used for
-     * this style, or null if none
-     */
-    public RGB getFillColor() {
-        return mFill;
-    }
-
-    /** Return the line width to be used for this style */
-    public int getLineWidth() {
-        return mLineWidth;
-    }
-
-    /** Return the SWT line style to be used for this style */
-    public int getLineStyle() {
-        return mLineStyle;
-    }
-
-    /**
-     * Return the stroke alpha value (in the range 0,255) to be used for this
-     * style
-     */
-    public int getStrokeAlpha() {
-        return mStrokeAlpha;
-    }
-
-    /**
-     * Return the fill alpha value (in the range 0,255) to be used for this
-     * style
-     */
-    public int getFillAlpha() {
-        return mFillAlpha;
-    }
-
-    /**
-     * Return the corresponding SwtDrawingStyle for the given
-     * {@link DrawingStyle}
-     * @param style The style to convert from a {@link DrawingStyle} to a {@link SwtDrawingStyle}.
-     * @return A corresponding {@link SwtDrawingStyle}.
-     */
-    public static SwtDrawingStyle of(DrawingStyle style) {
-        switch (style) {
-            case SELECTION:
-                return SELECTION;
-            case GUIDELINE:
-                return GUIDELINE;
-            case GUIDELINE_SHADOW:
-                return GUIDELINE_SHADOW;
-            case GUIDELINE_DASHED:
-                return GUIDELINE_DASHED;
-            case DISTANCE:
-                return DISTANCE;
-            case GRID:
-                return GRID;
-            case HOVER:
-                return HOVER;
-            case HOVER_SELECTION:
-                return HOVER_SELECTION;
-            case ANCHOR:
-                return ANCHOR;
-            case OUTLINE:
-                return OUTLINE;
-            case DROP_ZONE:
-                return DROP_ZONE;
-            case DROP_ZONE_ACTIVE:
-                return DROP_ZONE_ACTIVE;
-            case DROP_RECIPIENT:
-                return DROP_RECIPIENT;
-            case DROP_PREVIEW:
-                return DROP_PREVIEW;
-            case RESIZE_PREVIEW:
-                return RESIZE_PREVIEW;
-            case RESIZE_FAIL:
-                return RESIZE_FAIL;
-            case HELP:
-                return HELP;
-            case INVALID:
-                return INVALID;
-            case DEPENDENCY:
-                return DEPENDENCY;
-            case CYCLE:
-                return CYCLE;
-            case DRAGGED:
-                return DRAGGED;
-            case EMPTY:
-                return EMPTY;
-            case CUSTOM1:
-                return CUSTOM1;
-            case CUSTOM2:
-                return CUSTOM2;
-
-                // Internal error
-            default:
-                throw new IllegalArgumentException("Unknown style " + style);
-        }
-    }
-
-    /** RGB description of the stroke/foreground/border color */
-    private final RGB mStroke;
-
-    /** RGB description of the fill/foreground/interior color */
-    private final RGB mFill;
-
-    /** Pixel thickness of the stroke/border */
-    private final int mLineWidth;
-
-    /** SWT line style of the border/stroke */
-    private final int mLineStyle;
-
-    /** Alpha (in the range 0-255) of the stroke/border */
-    private final int mStrokeAlpha;
-
-    /** Alpha (in the range 0-255) of the fill/interior */
-    private final int mFillAlpha;
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/SwtUtils.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/SwtUtils.java
deleted file mode 100644
index 64e91be..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/SwtUtils.java
+++ /dev/null
@@ -1,457 +0,0 @@
-/*
- * Copyright (C) 2010 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.editors.layout.gle2;
-
-import static com.android.ide.eclipse.adt.internal.editors.layout.gle2.ImageUtils.SHADOW_SIZE;
-
-import com.android.ide.common.api.Rect;
-import com.android.ide.eclipse.adt.internal.editors.IconFactory;
-
-import org.eclipse.swt.SWTException;
-import org.eclipse.swt.graphics.Device;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.FontMetrics;
-import org.eclipse.swt.graphics.GC;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.graphics.ImageData;
-import org.eclipse.swt.graphics.PaletteData;
-import org.eclipse.swt.graphics.Rectangle;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Display;
-
-import java.awt.Graphics;
-import java.awt.image.BufferedImage;
-import java.awt.image.DataBuffer;
-import java.awt.image.DataBufferByte;
-import java.awt.image.DataBufferInt;
-import java.awt.image.WritableRaster;
-import java.util.List;
-
-/**
- * Various generic SWT utilities such as image conversion.
- */
-public class SwtUtils {
-
-    private SwtUtils() {
-    }
-
-    /**
-     * Returns the {@link PaletteData} describing the ARGB ordering expected from integers
-     * representing pixels for AWT {@link BufferedImage}.
-     *
-     * @param imageType the {@link BufferedImage#getType()} type
-     * @return A new {@link PaletteData} suitable for AWT images.
-     */
-    public static PaletteData getAwtPaletteData(int imageType) {
-        switch (imageType) {
-            case BufferedImage.TYPE_INT_RGB:
-            case BufferedImage.TYPE_INT_ARGB:
-            case BufferedImage.TYPE_INT_ARGB_PRE:
-                return new PaletteData(0x00FF0000, 0x0000FF00, 0x000000FF);
-
-            case BufferedImage.TYPE_3BYTE_BGR:
-            case BufferedImage.TYPE_4BYTE_ABGR:
-            case BufferedImage.TYPE_4BYTE_ABGR_PRE:
-                return new PaletteData(0x000000FF, 0x0000FF00, 0x00FF0000);
-
-            default:
-                throw new UnsupportedOperationException("RGB type not supported yet.");
-        }
-    }
-
-    /**
-     * Returns true if the given type of {@link BufferedImage} is supported for
-     * conversion. For unsupported formats, use
-     * {@link #convertToCompatibleFormat(BufferedImage)} first.
-     *
-     * @param imageType the {@link BufferedImage#getType()}
-     * @return true if we can convert the given buffered image format
-     */
-    private static boolean isSupportedPaletteType(int imageType) {
-        switch (imageType) {
-            case BufferedImage.TYPE_INT_RGB:
-            case BufferedImage.TYPE_INT_ARGB:
-            case BufferedImage.TYPE_INT_ARGB_PRE:
-            case BufferedImage.TYPE_3BYTE_BGR:
-            case BufferedImage.TYPE_4BYTE_ABGR:
-            case BufferedImage.TYPE_4BYTE_ABGR_PRE:
-                return true;
-            default:
-                return false;
-        }
-    }
-
-    /** Converts the given arbitrary {@link BufferedImage} to another {@link BufferedImage}
-     * in a format that is supported (see {@link #isSupportedPaletteType(int)})
-     *
-     * @param image the image to be converted
-     * @return a new image that is in a guaranteed compatible format
-     */
-    private static BufferedImage convertToCompatibleFormat(BufferedImage image) {
-        BufferedImage converted = new BufferedImage(image.getWidth(), image.getHeight(),
-                BufferedImage.TYPE_INT_ARGB);
-        Graphics graphics = converted.getGraphics();
-        graphics.drawImage(image, 0, 0, null);
-        graphics.dispose();
-
-        return converted;
-    }
-
-    /**
-     * Converts an AWT {@link BufferedImage} into an equivalent SWT {@link Image}. Whether
-     * the transparency data is transferred is optional, and this method can also apply an
-     * alpha adjustment during the conversion.
-     * <p/>
-     * Implementation details: on Windows, the returned {@link Image} will have an ordering
-     * matching the Windows DIB (e.g. RGBA, not ARGB). Callers must make sure to use
-     * <code>Image.getImageData().paletteData</code> to get the right pixels out of the image.
-     *
-     * @param display The display where the SWT image will be shown
-     * @param awtImage The AWT {@link BufferedImage}
-     * @param transferAlpha If true, copy alpha data out of the source image
-     * @param globalAlpha If -1, do nothing, otherwise adjust the alpha of the final image
-     *            by the given amount in the range [0,255]
-     * @return A new SWT {@link Image} with the same contents as the source
-     *         {@link BufferedImage}
-     */
-    public static Image convertToSwt(Device display, BufferedImage awtImage,
-            boolean transferAlpha, int globalAlpha) {
-        if (!isSupportedPaletteType(awtImage.getType())) {
-            awtImage = convertToCompatibleFormat(awtImage);
-        }
-
-        int width = awtImage.getWidth();
-        int height = awtImage.getHeight();
-
-        WritableRaster raster = awtImage.getRaster();
-        DataBuffer dataBuffer = raster.getDataBuffer();
-        ImageData imageData =
-            new ImageData(width, height, 32, getAwtPaletteData(awtImage.getType()));
-
-        if (dataBuffer instanceof DataBufferInt) {
-            int[] imageDataBuffer = ((DataBufferInt) dataBuffer).getData();
-            imageData.setPixels(0, 0, imageDataBuffer.length, imageDataBuffer, 0);
-        } else if (dataBuffer instanceof DataBufferByte) {
-            byte[] imageDataBuffer = ((DataBufferByte) dataBuffer).getData();
-            try {
-                imageData.setPixels(0, 0, imageDataBuffer.length, imageDataBuffer, 0);
-            } catch (SWTException se) {
-                // Unsupported depth
-                return convertToSwt(display, convertToCompatibleFormat(awtImage),
-                        transferAlpha, globalAlpha);
-            }
-        }
-
-        if (transferAlpha) {
-            byte[] alphaData = new byte[height * width];
-            for (int y = 0; y < height; y++) {
-                byte[] alphaRow = new byte[width];
-                for (int x = 0; x < width; x++) {
-                    int alpha = awtImage.getRGB(x, y) >>> 24;
-
-                    // We have to multiply in the alpha now since if we
-                    // set ImageData.alpha, it will ignore the alphaData.
-                    if (globalAlpha != -1) {
-                        alpha = alpha * globalAlpha >> 8;
-                    }
-
-                    alphaRow[x] = (byte) alpha;
-                }
-                System.arraycopy(alphaRow, 0, alphaData, y * width, width);
-            }
-
-            imageData.alphaData = alphaData;
-        } else if (globalAlpha != -1) {
-            imageData.alpha = globalAlpha;
-        }
-
-        return new Image(display, imageData);
-    }
-
-    /**
-     * Converts a direct-color model SWT image to an equivalent AWT image. If the image
-     * does not have a supported color model, returns null. This method does <b>NOT</b>
-     * preserve alpha in the source image.
-     *
-     * @param swtImage the SWT image to be converted to AWT
-     * @return an AWT image representing the source SWT image
-     */
-    public static BufferedImage convertToAwt(Image swtImage) {
-        ImageData swtData = swtImage.getImageData();
-        BufferedImage awtImage =
-            new BufferedImage(swtData.width, swtData.height, BufferedImage.TYPE_INT_ARGB);
-        PaletteData swtPalette = swtData.palette;
-        if (swtPalette.isDirect) {
-            PaletteData awtPalette = getAwtPaletteData(awtImage.getType());
-
-            if (swtPalette.equals(awtPalette)) {
-                // No color conversion needed.
-                for (int y = 0; y < swtData.height; y++) {
-                    for (int x = 0; x < swtData.width; x++) {
-                      int pixel = swtData.getPixel(x, y);
-                      awtImage.setRGB(x, y, 0xFF000000 | pixel);
-                    }
-                }
-            } else {
-                // We need to remap the colors
-                int sr = -awtPalette.redShift   + swtPalette.redShift;
-                int sg = -awtPalette.greenShift + swtPalette.greenShift;
-                int sb = -awtPalette.blueShift  + swtPalette.blueShift;
-
-                for (int y = 0; y < swtData.height; y++) {
-                    for (int x = 0; x < swtData.width; x++) {
-                      int pixel = swtData.getPixel(x, y);
-
-                      int r = pixel & swtPalette.redMask;
-                      int g = pixel & swtPalette.greenMask;
-                      int b = pixel & swtPalette.blueMask;
-                      r = (sr < 0) ? r >>> -sr : r << sr;
-                      g = (sg < 0) ? g >>> -sg : g << sg;
-                      b = (sb < 0) ? b >>> -sb : b << sb;
-
-                      pixel = 0xFF000000 | r | g | b;
-                      awtImage.setRGB(x, y, pixel);
-                    }
-                }
-            }
-        } else {
-            return null;
-        }
-
-        return awtImage;
-    }
-
-    /**
-     * Creates a new image from a source image where the contents from a given set of
-     * bounding boxes are copied into the new image and the rest is left transparent. A
-     * scale can be applied to make the resulting image larger or smaller than the source
-     * image. Note that the alpha channel in the original image is ignored, and the alpha
-     * values for the painted rectangles will be set to a specific value passed into this
-     * function.
-     *
-     * @param image the source image
-     * @param rectangles the set of rectangles (bounding boxes) to copy from the source
-     *            image
-     * @param boundingBox the bounding rectangle of the rectangle list, which can be
-     *            computed by {@link ImageUtils#getBoundingRectangle}
-     * @param scale a scale factor to apply to the result, e.g. 0.5 to shrink the
-     *            destination down 50%, 1.0 to leave it alone and 2.0 to zoom in by
-     *            doubling the image size
-     * @param alpha the alpha (in the range 0-255) that painted bits should be set to
-     * @return a pair of the rendered cropped image, and the location within the source
-     *         image that the crop begins (multiplied by the scale). May return null if
-     *         there are no selected items.
-     */
-    public static Image drawRectangles(Image image,
-            List<Rectangle> rectangles, Rectangle boundingBox, double scale, byte alpha) {
-
-        if (rectangles.size() == 0 || boundingBox == null || boundingBox.isEmpty()) {
-            return null;
-        }
-
-        ImageData srcData = image.getImageData();
-        int destWidth = (int) (scale * boundingBox.width);
-        int destHeight = (int) (scale * boundingBox.height);
-
-        ImageData destData = new ImageData(destWidth, destHeight, srcData.depth, srcData.palette);
-        byte[] alphaData = new byte[destHeight * destWidth];
-        destData.alphaData = alphaData;
-
-        for (Rectangle bounds : rectangles) {
-            int dx1 = bounds.x - boundingBox.x;
-            int dy1 = bounds.y - boundingBox.y;
-            int dx2 = dx1 + bounds.width;
-            int dy2 = dy1 + bounds.height;
-
-            dx1 *= scale;
-            dy1 *= scale;
-            dx2 *= scale;
-            dy2 *= scale;
-
-            int sx1 = bounds.x;
-            int sy1 = bounds.y;
-            int sx2 = sx1 + bounds.width;
-            int sy2 = sy1 + bounds.height;
-
-            if (scale == 1.0d) {
-                for (int dy = dy1, sy = sy1; dy < dy2; dy++, sy++) {
-                    for (int dx = dx1, sx = sx1; dx < dx2; dx++, sx++) {
-                        destData.setPixel(dx, dy, srcData.getPixel(sx, sy));
-                        alphaData[dy * destWidth + dx] = alpha;
-                    }
-                }
-            } else {
-                // Scaled copy.
-                int sxDelta = sx2 - sx1;
-                int dxDelta = dx2 - dx1;
-                int syDelta = sy2 - sy1;
-                int dyDelta = dy2 - dy1;
-                for (int dy = dy1, sy = sy1; dy < dy2; dy++, sy = (dy - dy1) * syDelta / dyDelta
-                        + sy1) {
-                    for (int dx = dx1, sx = sx1; dx < dx2; dx++, sx = (dx - dx1) * sxDelta
-                            / dxDelta + sx1) {
-                        assert sx < sx2 && sy < sy2;
-                        destData.setPixel(dx, dy, srcData.getPixel(sx, sy));
-                        alphaData[dy * destWidth + dx] = alpha;
-                    }
-                }
-            }
-        }
-
-        return new Image(image.getDevice(), destData);
-    }
-
-    /**
-     * Creates a new empty/blank image of the given size
-     *
-     * @param display the display to associate the image with
-     * @param width the width of the image
-     * @param height the height of the image
-     * @return a new blank image of the given size
-     */
-    public static Image createEmptyImage(Display display, int width, int height) {
-        BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
-        return SwtUtils.convertToSwt(display, image, false, 0);
-    }
-
-    /**
-     * Converts the given SWT {@link Rectangle} into an ADT {@link Rect}
-     *
-     * @param swtRect the SWT {@link Rectangle}
-     * @return an equivalent {@link Rect}
-     */
-    public static Rect toRect(Rectangle swtRect) {
-        return new Rect(swtRect.x, swtRect.y, swtRect.width, swtRect.height);
-    }
-
-    /**
-     * Sets the values of the given ADT {@link Rect} to the values of the given SWT
-     * {@link Rectangle}
-     *
-     * @param target the ADT {@link Rect} to modify
-     * @param source the SWT {@link Rectangle} to read values from
-     */
-    public static void set(Rect target, Rectangle source) {
-        target.set(source.x, source.y, source.width, source.height);
-    }
-
-    /**
-     * Compares an ADT {@link Rect} with an SWT {@link Rectangle} and returns true if they
-     * are equivalent
-     *
-     * @param r1 the ADT {@link Rect}
-     * @param r2 the SWT {@link Rectangle}
-     * @return true if the two rectangles are equivalent
-     */
-    public static boolean equals(Rect r1, Rectangle r2) {
-        return r1.x == r2.x && r1.y == r2.y && r1.w == r2.width && r1.h == r2.height;
-
-    }
-
-    /**
-     * Get the average width of the font used by the given control
-     *
-     * @param display the display associated with the font usage
-     * @param font the font to look up the average character width for
-     * @return the average width, in pixels, of the given font
-     */
-    public static final int getAverageCharWidth(Display display, Font font) {
-        GC gc = new GC(display);
-        gc.setFont(font);
-        FontMetrics fontMetrics = gc.getFontMetrics();
-        int width = fontMetrics.getAverageCharWidth();
-        gc.dispose();
-        return width;
-    }
-
-    /**
-     * Get the average width of the given font
-     *
-     * @param control the control to look up the default font for
-     * @return the average width, in pixels, of the current font in the control
-     */
-    public static final int getAverageCharWidth(Control control) {
-        GC gc = new GC(control.getDisplay());
-        int width = gc.getFontMetrics().getAverageCharWidth();
-        gc.dispose();
-        return width;
-    }
-
-    /**
-     * Draws a drop shadow for the given rectangle into the given context. It
-     * will not draw anything if the rectangle is smaller than a minimum
-     * determined by the assets used to draw the shadow graphics.
-     * <p>
-     * This corresponds to {@link ImageUtils#drawRectangleShadow(Graphics, int, int, int, int)},
-     * but applied directly to an SWT graphics context instead, such that no image conversion
-     * has to be performed.
-     * <p>
-     * Make sure to keep changes in the visual appearance here in sync with the
-     * AWT version in {@link ImageUtils#drawRectangleShadow(Graphics, int, int, int, int)}.
-     *
-     * @param gc the graphics context to draw into
-     * @param x the left coordinate of the left hand side of the rectangle
-     * @param y the top coordinate of the top of the rectangle
-     * @param width the width of the rectangle
-     * @param height the height of the rectangle
-     */
-    public static final void drawRectangleShadow(GC gc, int x, int y, int width, int height) {
-        if (sShadowBottomLeft == null) {
-            IconFactory icons = IconFactory.getInstance();
-            // See ImageUtils.drawRectangleShadow for an explanation of the assets.
-            sShadowBottomLeft  = icons.getIcon("shadow-bl"); //$NON-NLS-1$
-            sShadowBottom      = icons.getIcon("shadow-b");  //$NON-NLS-1$
-            sShadowBottomRight = icons.getIcon("shadow-br"); //$NON-NLS-1$
-            sShadowRight       = icons.getIcon("shadow-r");  //$NON-NLS-1$
-            sShadowTopRight    = icons.getIcon("shadow-tr"); //$NON-NLS-1$
-            assert sShadowBottomRight.getImageData().width == SHADOW_SIZE;
-            assert sShadowBottomRight.getImageData().height == SHADOW_SIZE;
-        }
-
-        ImageData bottomLeftData = sShadowBottomLeft.getImageData();
-        ImageData topRightData = sShadowTopRight.getImageData();
-        ImageData bottomData = sShadowBottom.getImageData();
-        ImageData rightData = sShadowRight.getImageData();
-        int blWidth = bottomLeftData.width;
-        int trHeight = topRightData.height;
-        if (width < blWidth) {
-            return;
-        }
-        if (height < trHeight) {
-            return;
-        }
-
-        gc.drawImage(sShadowBottomLeft, x, y + height);
-        gc.drawImage(sShadowBottomRight, x + width, y + height);
-        gc.drawImage(sShadowTopRight, x + width, y);
-        gc.drawImage(sShadowBottom,
-                0, 0,
-                bottomData.width, bottomData.height,
-                x + bottomLeftData.width, y + height,
-                width - bottomLeftData.width, bottomData.height);
-        gc.drawImage(sShadowRight,
-                0, 0,
-                rightData.width, rightData.height,
-                x + width, y + topRightData.height,
-                rightData.width, height - topRightData.height);
-    }
-
-    private static Image sShadowBottomLeft;
-    private static Image sShadowBottom;
-    private static Image sShadowBottomRight;
-    private static Image sShadowRight;
-    private static Image sShadowTopRight;
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/ViewHierarchy.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/ViewHierarchy.java
deleted file mode 100644
index d247e28..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/ViewHierarchy.java
+++ /dev/null
@@ -1,771 +0,0 @@
-/*
- * Copyright (C) 2010 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.editors.layout.gle2;
-
-import static com.android.SdkConstants.ATTR_ID;
-import static com.android.SdkConstants.VIEW_MERGE;
-
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-import com.android.ide.common.api.INode;
-import com.android.ide.common.rendering.api.RenderSession;
-import com.android.ide.common.rendering.api.ViewInfo;
-import com.android.ide.eclipse.adt.internal.editors.layout.gre.NodeProxy;
-import com.android.ide.eclipse.adt.internal.editors.layout.uimodel.UiViewElementNode;
-import com.android.ide.eclipse.adt.internal.editors.uimodel.UiDocumentNode;
-import com.android.ide.eclipse.adt.internal.editors.uimodel.UiElementNode;
-import com.android.utils.Pair;
-
-import org.eclipse.swt.graphics.Rectangle;
-import org.w3c.dom.Attr;
-import org.w3c.dom.Document;
-import org.w3c.dom.Node;
-
-import java.awt.image.BufferedImage;
-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.RandomAccess;
-import java.util.Set;
-
-/**
- * The view hierarchy class manages a set of view info objects and performs find
- * operations on this set.
- */
-public class ViewHierarchy {
-    private static final boolean DUMP_INFO = false;
-
-    private LayoutCanvas mCanvas;
-
-    /**
-     * Constructs a new {@link ViewHierarchy} tied to the given
-     * {@link LayoutCanvas}.
-     *
-     * @param canvas The {@link LayoutCanvas} to create a {@link ViewHierarchy}
-     *            for.
-     */
-    public ViewHierarchy(LayoutCanvas canvas) {
-        mCanvas = canvas;
-    }
-
-    /**
-     * The CanvasViewInfo root created by the last call to {@link #setSession}
-     * with a valid layout.
-     * <p/>
-     * This <em>can</em> be null to indicate we're dealing with an empty document with
-     * no root node. Null here does not mean the result was invalid, merely that the XML
-     * had no content to display -- we need to treat an empty document as valid so that
-     * we can drop new items in it.
-     */
-    private CanvasViewInfo mLastValidViewInfoRoot;
-
-    /**
-     * True when the last {@link #setSession} provided a valid {@link LayoutScene}.
-     * <p/>
-     * When false this means the canvas is displaying an out-dated result image & bounds and some
-     * features should be disabled accordingly such a drag'n'drop.
-     * <p/>
-     * Note that an empty document (with a null {@link #mLastValidViewInfoRoot}) is considered
-     * valid since it is an acceptable drop target.
-     */
-    private boolean mIsResultValid;
-
-    /**
-     * A list of invisible parents (see {@link CanvasViewInfo#isInvisible()} for
-     * details) in the current view hierarchy.
-     */
-    private final List<CanvasViewInfo> mInvisibleParents = new ArrayList<CanvasViewInfo>();
-
-    /**
-     * A read-only view of {@link #mInvisibleParents}; note that this is NOT a copy so it
-     * reflects updates to the underlying {@link #mInvisibleParents} list.
-     */
-    private final List<CanvasViewInfo> mInvisibleParentsReadOnly =
-        Collections.unmodifiableList(mInvisibleParents);
-
-    /**
-     * Flag which records whether or not we have any exploded parent nodes in this
-     * view hierarchy. This is used to track whether or not we need to recompute the
-     * layout when we exit show-all-invisible-parents mode (see
-     * {@link LayoutCanvas#showInvisibleViews}).
-     */
-    private boolean mExplodedParents;
-
-    /**
-     * Bounds of included views in the current view hierarchy when rendered in other context
-     */
-    private List<Rectangle> mIncludedBounds;
-
-    /** The render session for the current view hierarchy */
-    private RenderSession mSession;
-
-    /** Map from nodes to canvas view infos */
-    private Map<UiViewElementNode, CanvasViewInfo> mNodeToView = Collections.emptyMap();
-
-    /** Map from DOM nodes to canvas view infos */
-    private Map<Node, CanvasViewInfo> mDomNodeToView = Collections.emptyMap();
-
-    /**
-     * Disposes the view hierarchy content.
-     */
-    public void dispose() {
-        if (mSession != null) {
-            mSession.dispose();
-            mSession = null;
-        }
-    }
-
-
-    /**
-     * Sets the result of the layout rendering. The result object indicates if the layout
-     * rendering succeeded. If it did, it contains a bitmap and the objects rectangles.
-     *
-     * Implementation detail: the bridge's computeLayout() method already returns a newly
-     * allocated ILayourResult. That means we can keep this result and hold on to it
-     * when it is valid.
-     *
-     * @param session The new session, either valid or not.
-     * @param explodedNodes The set of individual nodes the layout computer was asked to
-     *            explode. Note that these are independent of the explode-all mode where
-     *            all views are exploded; this is used only for the mode (
-     *            {@link LayoutCanvas#showInvisibleViews}) where individual invisible
-     *            nodes are padded during certain interactions.
-     */
-    /* package */ void setSession(RenderSession session, Set<UiElementNode> explodedNodes,
-            boolean layoutlib5) {
-        // replace the previous scene, so the previous scene must be disposed.
-        if (mSession != null) {
-            mSession.dispose();
-        }
-
-        mSession = session;
-        mIsResultValid = (session != null && session.getResult().isSuccess());
-        mExplodedParents = false;
-        mNodeToView = new HashMap<UiViewElementNode, CanvasViewInfo>(50);
-        if (mIsResultValid && session != null) {
-            List<ViewInfo> rootList = session.getRootViews();
-
-            Pair<CanvasViewInfo,List<Rectangle>> infos = null;
-
-            if (rootList == null || rootList.size() == 0) {
-                // Special case: Look to see if this is really an empty <merge> view,
-                // which shows up without any ViewInfos in the merge. In that case we
-                // want to manufacture an empty view, such that we can target the view
-                // via drag & drop, etc.
-                if (hasMergeRoot()) {
-                    ViewInfo mergeRoot = createMergeInfo(session);
-                    infos = CanvasViewInfo.create(mergeRoot, layoutlib5);
-                } else {
-                    infos = null;
-                }
-            } else {
-                if (rootList.size() > 1 && hasMergeRoot()) {
-                    ViewInfo mergeRoot = createMergeInfo(session);
-                    mergeRoot.setChildren(rootList);
-                    infos = CanvasViewInfo.create(mergeRoot, layoutlib5);
-                } else {
-                    ViewInfo root = rootList.get(0);
-
-                    if (root != null) {
-                        infos = CanvasViewInfo.create(root, layoutlib5);
-                        if (DUMP_INFO) {
-                            dump(session, root, 0);
-                        }
-                    } else {
-                        infos = null;
-                    }
-                }
-            }
-            if (infos != null) {
-                mLastValidViewInfoRoot = infos.getFirst();
-                mIncludedBounds = infos.getSecond();
-
-                if (mLastValidViewInfoRoot.getUiViewNode() == null &&
-                        mLastValidViewInfoRoot.getChildren().isEmpty()) {
-                    GraphicalEditorPart editor = mCanvas.getEditorDelegate().getGraphicalEditor();
-                    if (editor.getIncludedWithin() != null) {
-                        // Somehow, this view was supposed to be rendered within another
-                        // view, yet this view was rendered as part of the other view.
-                        // In that case, abort attempting to show included in; clear the
-                        // include context and trigger a standalone re-render.
-                        editor.showIn(null);
-                        return;
-                    }
-                }
-
-            } else {
-                mLastValidViewInfoRoot = null;
-                mIncludedBounds = null;
-            }
-
-            updateNodeProxies(mLastValidViewInfoRoot);
-
-            // Update the data structures related to tracking invisible and exploded nodes.
-            // We need to find the {@link CanvasViewInfo} objects that correspond to
-            // the passed in {@link UiElementNode} keys that were re-rendered, and mark
-            // them as exploded and store them in a list for rendering.
-            mExplodedParents = false;
-            mInvisibleParents.clear();
-            addInvisibleParents(mLastValidViewInfoRoot, explodedNodes);
-
-            mDomNodeToView = new HashMap<Node, CanvasViewInfo>(mNodeToView.size());
-            for (Map.Entry<UiViewElementNode, CanvasViewInfo> entry : mNodeToView.entrySet()) {
-                mDomNodeToView.put(entry.getKey().getXmlNode(), entry.getValue());
-            }
-
-            // Update the selection
-            mCanvas.getSelectionManager().sync();
-        } else {
-            mIncludedBounds = null;
-            mInvisibleParents.clear();
-            mDomNodeToView = Collections.emptyMap();
-        }
-    }
-
-    private ViewInfo createMergeInfo(RenderSession session) {
-        BufferedImage image = session.getImage();
-        ControlPoint imageSize = ControlPoint.create(mCanvas,
-                mCanvas.getHorizontalTransform().getMargin() + image.getWidth(),
-                mCanvas.getVerticalTransform().getMargin() + image.getHeight());
-        LayoutPoint layoutSize = imageSize.toLayout();
-        UiDocumentNode model = mCanvas.getEditorDelegate().getUiRootNode();
-        List<UiElementNode> children = model.getUiChildren();
-        return new ViewInfo(VIEW_MERGE, children.get(0), 0, 0, layoutSize.x, layoutSize.y);
-    }
-
-    /**
-     * Returns true if this view hierarchy corresponds to an editor that has a {@code
-     * <merge>} tag at the root
-     *
-     * @return true if there is a {@code <merge>} at the root of this editor's document
-     */
-    private boolean hasMergeRoot() {
-        UiDocumentNode model = mCanvas.getEditorDelegate().getUiRootNode();
-        if (model != null) {
-            List<UiElementNode> children = model.getUiChildren();
-            if (children != null && children.size() > 0
-                    && VIEW_MERGE.equals(children.get(0).getDescriptor().getXmlName())) {
-                return true;
-            }
-        }
-
-        return false;
-    }
-
-    /**
-     * Creates or updates the node proxy for this canvas view info.
-     * <p/>
-     * Since proxies are reused, this will update the bounds of an existing proxy when the
-     * canvas is refreshed and a view changes position or size.
-     * <p/>
-     * This is a recursive call that updates the whole hierarchy starting at the given
-     * view info.
-     */
-    private void updateNodeProxies(CanvasViewInfo vi) {
-        if (vi == null) {
-            return;
-        }
-
-        UiViewElementNode key = vi.getUiViewNode();
-
-        if (key != null) {
-            mCanvas.getNodeFactory().create(vi);
-            mNodeToView.put(key, vi);
-        }
-
-        for (CanvasViewInfo child : vi.getChildren()) {
-            updateNodeProxies(child);
-        }
-    }
-
-    /**
-     * Make a pass over the view hierarchy and look for two things:
-     * <ol>
-     * <li>Invisible parents. These are nodes that can hold children and have empty
-     * bounds. These are then added to the {@link #mInvisibleParents} list.
-     * <li>Exploded nodes. These are nodes that were previously marked as invisible, and
-     * subsequently rendered by a recomputed layout. They now no longer have empty bounds,
-     * but should be specially marked via {@link CanvasViewInfo#setExploded} such that we
-     * for example in selection operations can determine if we need to recompute the
-     * layout.
-     * </ol>
-     *
-     * @param vi
-     * @param invisibleNodes
-     */
-    private void addInvisibleParents(CanvasViewInfo vi, Set<UiElementNode> invisibleNodes) {
-        if (vi == null) {
-            return;
-        }
-
-        if (vi.isInvisible()) {
-            mInvisibleParents.add(vi);
-        } else if (invisibleNodes != null) {
-            UiViewElementNode key = vi.getUiViewNode();
-
-            if (key != null && invisibleNodes.contains(key)) {
-                vi.setExploded(true);
-                mExplodedParents = true;
-                mInvisibleParents.add(vi);
-            }
-        }
-
-        for (CanvasViewInfo child : vi.getChildren()) {
-            addInvisibleParents(child, invisibleNodes);
-        }
-    }
-
-    /**
-     * Returns the current {@link RenderSession}.
-     * @return the session or null if none have been set.
-     */
-    public RenderSession getSession() {
-        return mSession;
-    }
-
-    /**
-     * Returns true when the last {@link #setSession} provided a valid
-     * {@link RenderSession}.
-     * <p/>
-     * When false this means the canvas is displaying an out-dated result image & bounds and some
-     * features should be disabled accordingly such a drag'n'drop.
-     * <p/>
-     * Note that an empty document (with a null {@link #getRoot()}) is considered
-     * valid since it is an acceptable drop target.
-     * @return True when this {@link ViewHierarchy} contains a valid hierarchy of views.
-    */
-    public boolean isValid() {
-        return mIsResultValid;
-    }
-
-    /**
-     * Returns true if the last valid content of the canvas represents an empty document.
-     * @return True if the last valid content of the canvas represents an empty document.
-     */
-    public boolean isEmpty() {
-        return mLastValidViewInfoRoot == null;
-    }
-
-    /**
-     * Returns true if we have parents in this hierarchy that are invisible (e.g. because
-     * they have no children and zero layout bounds).
-     *
-     * @return True if we have invisible parents.
-     */
-    public boolean hasInvisibleParents() {
-        return mInvisibleParents.size() > 0;
-    }
-
-    /**
-     * Returns true if we have views that were exploded during rendering
-     * @return True if we have exploded parents
-     */
-    public boolean hasExplodedParents() {
-        return mExplodedParents;
-    }
-
-    /** Locates and return any views that overlap the given selection rectangle.
-     * @param topLeft The top left corner of the selection rectangle.
-     * @param bottomRight The bottom right corner of the selection rectangle.
-     * @return A collection of {@link CanvasViewInfo} objects that overlap the
-     *   rectangle.
-     */
-    public Collection<CanvasViewInfo> findWithin(
-            LayoutPoint topLeft,
-            LayoutPoint bottomRight) {
-        Rectangle selectionRectangle = new Rectangle(topLeft.x, topLeft.y, bottomRight.x
-                - topLeft.x, bottomRight.y - topLeft.y);
-        List<CanvasViewInfo> infos = new ArrayList<CanvasViewInfo>();
-        addWithin(mLastValidViewInfoRoot, selectionRectangle, infos);
-        return infos;
-    }
-
-    /**
-     * Recursive internal version of {@link #findViewInfoAt(int, int)}. Please don't use directly.
-     * <p/>
-     * Tries to find the inner most child matching the given x,y coordinates in the view
-     * info sub-tree. This uses the potentially-expanded selection bounds.
-     *
-     * Returns null if not found.
-     */
-    private void addWithin(
-            CanvasViewInfo canvasViewInfo,
-            Rectangle canvasRectangle,
-            List<CanvasViewInfo> infos) {
-        if (canvasViewInfo == null) {
-            return;
-        }
-        Rectangle r = canvasViewInfo.getSelectionRect();
-        if (canvasRectangle.intersects(r)) {
-
-            // try to find a matching child first
-            for (CanvasViewInfo child : canvasViewInfo.getChildren()) {
-                addWithin(child, canvasRectangle, infos);
-            }
-
-            if (canvasViewInfo != mLastValidViewInfoRoot) {
-                infos.add(canvasViewInfo);
-            }
-        }
-    }
-
-    /**
-     * Locates and returns the {@link CanvasViewInfo} corresponding to the given
-     * node, or null if it cannot be found.
-     *
-     * @param node The node we want to find a corresponding
-     *            {@link CanvasViewInfo} for.
-     * @return The {@link CanvasViewInfo} corresponding to the given node, or
-     *         null if no match was found.
-     */
-    @Nullable
-    public CanvasViewInfo findViewInfoFor(@Nullable Node node) {
-        CanvasViewInfo vi = mDomNodeToView.get(node);
-
-        if (vi == null) {
-            if (node == null) {
-                return null;
-            } else if (node.getNodeType() == Node.TEXT_NODE) {
-                return mDomNodeToView.get(node.getParentNode());
-            } else if (node.getNodeType() == Node.ATTRIBUTE_NODE) {
-                return mDomNodeToView.get(((Attr) node).getOwnerElement());
-            } else if (node.getNodeType() == Node.DOCUMENT_NODE) {
-                return mDomNodeToView.get(((Document) node).getDocumentElement());
-            }
-        }
-
-        return vi;
-    }
-
-    /**
-     * Tries to find the inner most child matching the given x,y coordinates in
-     * the view info sub-tree, starting at the last know view info root. This
-     * uses the potentially-expanded selection bounds.
-     * <p/>
-     * Returns null if not found or if there's no view info root.
-     *
-     * @param p The point at which to look for the deepest match in the view
-     *            hierarchy
-     * @return A {@link CanvasViewInfo} that intersects the given point, or null
-     *         if nothing was found.
-     */
-    public CanvasViewInfo findViewInfoAt(LayoutPoint p) {
-        if (mLastValidViewInfoRoot == null) {
-            return null;
-        }
-
-        return findViewInfoAt_Recursive(p, mLastValidViewInfoRoot);
-    }
-
-    /**
-     * Recursive internal version of {@link #findViewInfoAt(int, int)}. Please don't use directly.
-     * <p/>
-     * Tries to find the inner most child matching the given x,y coordinates in the view
-     * info sub-tree. This uses the potentially-expanded selection bounds.
-     *
-     * Returns null if not found.
-     */
-    private CanvasViewInfo findViewInfoAt_Recursive(LayoutPoint p, CanvasViewInfo canvasViewInfo) {
-        if (canvasViewInfo == null) {
-            return null;
-        }
-        Rectangle r = canvasViewInfo.getSelectionRect();
-        if (r.contains(p.x, p.y)) {
-
-            // try to find a matching child first
-            // Iterate in REVERSE z order such that siblings on top
-            // are checked before earlier siblings (this matters in layouts like
-            // FrameLayout and in <merge> contexts where the views are sitting on top
-            // of each other and we want to select the same view as the one drawn
-            // on top of the others
-            List<CanvasViewInfo> children = canvasViewInfo.getChildren();
-            assert children instanceof RandomAccess;
-            for (int i = children.size() - 1; i >= 0; i--) {
-                CanvasViewInfo child = children.get(i);
-                CanvasViewInfo v = findViewInfoAt_Recursive(p, child);
-                if (v != null) {
-                    return v;
-                }
-            }
-
-            // if no children matched, this is the view that we're looking for
-            return canvasViewInfo;
-        }
-
-        return null;
-    }
-
-    /**
-     * Returns a list of all the possible alternatives for a given view at the given
-     * position. This is used to build and manage the "alternate" selection that cycles
-     * around the parents or children of the currently selected element.
-     */
-    /* package */ List<CanvasViewInfo> findAltViewInfoAt(LayoutPoint p) {
-        if (mLastValidViewInfoRoot != null) {
-            return findAltViewInfoAt_Recursive(p, mLastValidViewInfoRoot, null);
-        }
-
-        return null;
-    }
-
-    /**
-     * Internal recursive version of {@link #findAltViewInfoAt(int, int, CanvasViewInfo)}.
-     * Please don't use directly.
-     */
-    private List<CanvasViewInfo> findAltViewInfoAt_Recursive(
-            LayoutPoint p, CanvasViewInfo parent, List<CanvasViewInfo> outList) {
-        Rectangle r;
-
-        if (outList == null) {
-            outList = new ArrayList<CanvasViewInfo>();
-
-            if (parent != null) {
-                // add the parent root only once
-                r = parent.getSelectionRect();
-                if (r.contains(p.x, p.y)) {
-                    outList.add(parent);
-                }
-            }
-        }
-
-        if (parent != null && !parent.getChildren().isEmpty()) {
-            // then add all children that match the position
-            for (CanvasViewInfo child : parent.getChildren()) {
-                r = child.getSelectionRect();
-                if (r.contains(p.x, p.y)) {
-                    outList.add(child);
-                }
-            }
-
-            // finally recurse in the children
-            for (CanvasViewInfo child : parent.getChildren()) {
-                r = child.getSelectionRect();
-                if (r.contains(p.x, p.y)) {
-                    findAltViewInfoAt_Recursive(p, child, outList);
-                }
-            }
-        }
-
-        return outList;
-    }
-
-    /**
-     * Locates and returns the {@link CanvasViewInfo} corresponding to the given
-     * node, or null if it cannot be found.
-     *
-     * @param node The node we want to find a corresponding
-     *            {@link CanvasViewInfo} for.
-     * @return The {@link CanvasViewInfo} corresponding to the given node, or
-     *         null if no match was found.
-     */
-    public CanvasViewInfo findViewInfoFor(INode node) {
-        return findViewInfoFor((NodeProxy) node);
-    }
-
-    /**
-     * Tries to find a child with the same view key in the view info sub-tree.
-     * Returns null if not found.
-     *
-     * @param viewKey The view key that a matching {@link CanvasViewInfo} should
-     *            have as its key.
-     * @return A {@link CanvasViewInfo} matching the given key, or null if not
-     *         found.
-     */
-    public CanvasViewInfo findViewInfoFor(UiElementNode viewKey) {
-        return mNodeToView.get(viewKey);
-    }
-
-    /**
-     * Tries to find a child with the given node proxy as the view key.
-     * Returns null if not found.
-     *
-     * @param proxy The view key that a matching {@link CanvasViewInfo} should
-     *            have as its key.
-     * @return A {@link CanvasViewInfo} matching the given key, or null if not
-     *         found.
-     */
-    @Nullable
-    public CanvasViewInfo findViewInfoFor(@Nullable NodeProxy proxy) {
-        if (proxy == null) {
-            return null;
-        }
-        return mNodeToView.get(proxy.getNode());
-    }
-
-    /**
-     * Returns a list of ALL ViewInfos (possibly excluding the root, depending
-     * on the parameter for that).
-     *
-     * @param includeRoot If true, include the root in the list, otherwise
-     *            exclude it (but include all its children)
-     * @return A list of canvas view infos.
-     */
-    public List<CanvasViewInfo> findAllViewInfos(boolean includeRoot) {
-        List<CanvasViewInfo> infos = new ArrayList<CanvasViewInfo>();
-        if (mIsResultValid && mLastValidViewInfoRoot != null) {
-            findAllViewInfos(infos, mLastValidViewInfoRoot, includeRoot);
-        }
-
-        return infos;
-    }
-
-    private void findAllViewInfos(List<CanvasViewInfo> result, CanvasViewInfo canvasViewInfo,
-            boolean includeRoot) {
-        if (canvasViewInfo != null) {
-            if (includeRoot || !canvasViewInfo.isRoot()) {
-                result.add(canvasViewInfo);
-            }
-            for (CanvasViewInfo child : canvasViewInfo.getChildren()) {
-                findAllViewInfos(result, child, true);
-            }
-        }
-    }
-
-    /**
-     * Returns the root of the view hierarchy, if any (could be null, for example
-     * on rendering failure).
-     *
-     * @return The current view hierarchy, or null
-     */
-    public CanvasViewInfo getRoot() {
-        return mLastValidViewInfoRoot;
-    }
-
-    /**
-     * Returns a collection of views that have zero bounds and that correspond to empty
-     * parents. Note that the views may not actually have zero bounds; in particular, if
-     * they are exploded ({@link CanvasViewInfo#isExploded()}, then they will have the
-     * bounds of a shown invisible node. Therefore, this method returns the views that
-     * would be invisible in a real rendering of the scene.
-     *
-     * @return A collection of empty parent views.
-     */
-    public List<CanvasViewInfo> getInvisibleViews() {
-        return mInvisibleParentsReadOnly;
-    }
-
-    /**
-     * Returns the invisible nodes (the {@link UiElementNode} objects corresponding
-     * to the {@link CanvasViewInfo} objects returned from {@link #getInvisibleViews()}.
-     * We are pulling out the nodes since they preserve their identity across layout
-     * rendering, and in particular we return it as a set such that the layout renderer
-     * can perform quick identity checks when looking up attribute values during the
-     * rendering process.
-     *
-     * @return A set of the invisible nodes.
-     */
-    public Set<UiElementNode> getInvisibleNodes() {
-        if (mInvisibleParents.size() == 0) {
-            return Collections.emptySet();
-        }
-
-        Set<UiElementNode> nodes = new HashSet<UiElementNode>(mInvisibleParents.size());
-        for (CanvasViewInfo info : mInvisibleParents) {
-            UiViewElementNode node = info.getUiViewNode();
-            if (node != null) {
-                nodes.add(node);
-            }
-        }
-
-        return nodes;
-    }
-
-    /**
-     * Returns the list of bounds for included views in the current view hierarchy. Can be null
-     * when there are no included views.
-     *
-     * @return a list of included view bounds, or null
-     */
-    public List<Rectangle> getIncludedBounds() {
-        return mIncludedBounds;
-    }
-
-    /**
-     * Returns a map of the default properties for the given view object in this session
-     *
-     * @param viewObject the object to look up the properties map for
-     * @return the map of properties, or null if not found
-     */
-    @Nullable
-    public Map<String, String> getDefaultProperties(@NonNull Object viewObject) {
-        if (mSession != null) {
-            return mSession.getDefaultProperties(viewObject);
-        }
-
-        return null;
-    }
-
-    /**
-     * Dumps a {@link ViewInfo} hierarchy to stdout
-     *
-     * @param session the corresponding session, if any
-     * @param info the {@link ViewInfo} object to dump
-     * @param depth the depth to indent it to
-     */
-    public static void dump(RenderSession session, ViewInfo info, int depth) {
-        if (DUMP_INFO) {
-            StringBuilder sb = new StringBuilder();
-            for (int i = 0; i < depth; i++) {
-                sb.append("    "); //$NON-NLS-1$
-            }
-            sb.append(info.getClassName());
-            sb.append(" ["); //$NON-NLS-1$
-            sb.append(info.getLeft());
-            sb.append(","); //$NON-NLS-1$
-            sb.append(info.getTop());
-            sb.append(","); //$NON-NLS-1$
-            sb.append(info.getRight());
-            sb.append(","); //$NON-NLS-1$
-            sb.append(info.getBottom());
-            sb.append("]"); //$NON-NLS-1$
-            Object cookie = info.getCookie();
-            if (cookie instanceof UiViewElementNode) {
-                sb.append(" "); //$NON-NLS-1$
-                UiViewElementNode node = (UiViewElementNode) cookie;
-                sb.append("<"); //$NON-NLS-1$
-                sb.append(node.getDescriptor().getXmlName());
-                sb.append(">"); //$NON-NLS-1$
-
-                String id = node.getAttributeValue(ATTR_ID);
-                if (id != null && !id.isEmpty()) {
-                    sb.append(" ");
-                    sb.append(id);
-                }
-            } else if (cookie != null) {
-                sb.append(" " + cookie); //$NON-NLS-1$
-            }
-            /* Display defaults?
-            if (info.getViewObject() != null) {
-                Map<String, String> defaults = session.getDefaultProperties(info.getCookie());
-                sb.append(" - defaults: "); //$NON-NLS-1$
-                sb.append(defaults);
-                sb.append('\n');
-            }
-            */
-
-            System.out.println(sb.toString());
-
-            for (ViewInfo child : info.getChildren()) {
-                dump(session, child, depth + 1);
-            }
-        }
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gre/ClientRulesEngine.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gre/ClientRulesEngine.java
deleted file mode 100644
index 388907a..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gre/ClientRulesEngine.java
+++ /dev/null
@@ -1,762 +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.eclipse.adt.internal.editors.layout.gre;
-
-import static com.android.SdkConstants.ANDROID_URI;
-import static com.android.SdkConstants.ATTR_ID;
-import static com.android.SdkConstants.AUTO_URI;
-import static com.android.SdkConstants.CLASS_FRAGMENT;
-import static com.android.SdkConstants.CLASS_V4_FRAGMENT;
-import static com.android.SdkConstants.CLASS_VIEW;
-import static com.android.SdkConstants.NEW_ID_PREFIX;
-import static com.android.SdkConstants.URI_PREFIX;
-
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-import com.android.ide.common.api.IClientRulesEngine;
-import com.android.ide.common.api.INode;
-import com.android.ide.common.api.IValidator;
-import com.android.ide.common.api.IViewMetadata;
-import com.android.ide.common.api.IViewRule;
-import com.android.ide.common.api.Margins;
-import com.android.ide.common.api.Rect;
-import com.android.ide.common.layout.BaseViewRule;
-import com.android.ide.common.resources.ResourceRepository;
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.ide.eclipse.adt.internal.actions.AddSupportJarAction;
-import com.android.ide.eclipse.adt.internal.editors.AndroidXmlEditor;
-import com.android.ide.eclipse.adt.internal.editors.descriptors.DescriptorsUtils;
-import com.android.ide.eclipse.adt.internal.editors.layout.LayoutEditorDelegate;
-import com.android.ide.eclipse.adt.internal.editors.layout.configuration.ConfigurationChooser;
-import com.android.ide.eclipse.adt.internal.editors.layout.gle2.CanvasViewInfo;
-import com.android.ide.eclipse.adt.internal.editors.layout.gle2.GraphicalEditorPart;
-import com.android.ide.eclipse.adt.internal.editors.layout.gle2.LayoutCanvas;
-import com.android.ide.eclipse.adt.internal.editors.layout.gle2.RenderService;
-import com.android.ide.eclipse.adt.internal.editors.layout.gle2.SelectionManager;
-import com.android.ide.eclipse.adt.internal.editors.layout.gle2.ViewHierarchy;
-import com.android.ide.eclipse.adt.internal.editors.manifest.ManifestInfo;
-import com.android.ide.eclipse.adt.internal.editors.uimodel.UiDocumentNode;
-import com.android.ide.eclipse.adt.internal.project.BaseProjectHelper;
-import com.android.ide.eclipse.adt.internal.refactorings.core.RenameResult;
-import com.android.ide.eclipse.adt.internal.resources.CyclicDependencyValidator;
-import com.android.ide.eclipse.adt.internal.resources.ResourceNameValidator;
-import com.android.ide.eclipse.adt.internal.resources.manager.ResourceManager;
-import com.android.ide.eclipse.adt.internal.sdk.AndroidTargetData;
-import com.android.ide.eclipse.adt.internal.sdk.ProjectState;
-import com.android.ide.eclipse.adt.internal.sdk.Sdk;
-import com.android.ide.eclipse.adt.internal.ui.MarginChooser;
-import com.android.ide.eclipse.adt.internal.ui.ReferenceChooserDialog;
-import com.android.ide.eclipse.adt.internal.ui.ResourceChooser;
-import com.android.ide.eclipse.adt.internal.ui.ResourcePreviewHelper;
-import com.android.resources.ResourceType;
-import com.android.sdklib.IAndroidTarget;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.jdt.core.Flags;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.IPackageFragment;
-import org.eclipse.jdt.core.IPackageFragmentRoot;
-import org.eclipse.jdt.core.IType;
-import org.eclipse.jdt.core.ITypeHierarchy;
-import org.eclipse.jdt.core.JavaModelException;
-import org.eclipse.jdt.core.search.IJavaSearchScope;
-import org.eclipse.jdt.core.search.SearchEngine;
-import org.eclipse.jdt.ui.IJavaElementSearchConstants;
-import org.eclipse.jdt.ui.JavaUI;
-import org.eclipse.jdt.ui.actions.OpenNewClassWizardAction;
-import org.eclipse.jdt.ui.dialogs.ITypeInfoFilterExtension;
-import org.eclipse.jdt.ui.dialogs.ITypeInfoRequestor;
-import org.eclipse.jdt.ui.dialogs.TypeSelectionExtension;
-import org.eclipse.jdt.ui.wizards.NewClassWizardPage;
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.jface.dialogs.IInputValidator;
-import org.eclipse.jface.dialogs.InputDialog;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.jface.dialogs.ProgressMonitorDialog;
-import org.eclipse.jface.window.Window;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.dialogs.SelectionDialog;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.concurrent.atomic.AtomicReference;
-
-/**
- * Implementation of {@link IClientRulesEngine}. This provides {@link IViewRule} clients
- * with a few methods they can use to access functionality from this {@link RulesEngine}.
- */
-class ClientRulesEngine implements IClientRulesEngine {
-    /** The return code from the dialog for the user choosing "Clear" */
-    public static final int CLEAR_RETURN_CODE = -5;
-    /** The dialog button ID for the user choosing "Clear" */
-    private static final int CLEAR_BUTTON_ID = CLEAR_RETURN_CODE;
-
-    private final RulesEngine mRulesEngine;
-    private final String mFqcn;
-
-    public ClientRulesEngine(RulesEngine rulesEngine, String fqcn) {
-        mRulesEngine = rulesEngine;
-        mFqcn = fqcn;
-    }
-
-    @Override
-    public @NonNull String getFqcn() {
-        return mFqcn;
-    }
-
-    @Override
-    public void debugPrintf(@NonNull String msg, Object... params) {
-        AdtPlugin.printToConsole(
-                mFqcn == null ? "<unknown>" : mFqcn,
-                String.format(msg, params)
-                );
-    }
-
-    @Override
-    public IViewRule loadRule(@NonNull String fqcn) {
-        return mRulesEngine.loadRule(fqcn, fqcn);
-    }
-
-    @Override
-    public void displayAlert(@NonNull String message) {
-        MessageDialog.openInformation(
-                AdtPlugin.getShell(),
-                mFqcn,  // title
-                message);
-    }
-
-    @Override
-    public boolean rename(INode node) {
-        GraphicalEditorPart editor = mRulesEngine.getEditor();
-        SelectionManager manager = editor.getCanvasControl().getSelectionManager();
-        RenameResult result = manager.performRename(node, null);
-
-        return !result.isCanceled() && !result.isUnavailable();
-    }
-
-    @Override
-    public String displayInput(@NonNull String message, @Nullable String value,
-            final @Nullable IValidator filter) {
-        IInputValidator validator = null;
-        if (filter != null) {
-            validator = new IInputValidator() {
-                @Override
-                public String isValid(String newText) {
-                    // IValidator has the same interface as SWT's IInputValidator
-                    try {
-                        return filter.validate(newText);
-                    } catch (Exception e) {
-                        AdtPlugin.log(e, "Custom validator failed: %s", e.toString());
-                        return ""; //$NON-NLS-1$
-                    }
-                }
-            };
-        }
-
-        InputDialog d = new InputDialog(
-                    AdtPlugin.getShell(),
-                    mFqcn,  // title
-                    message,
-                    value == null ? "" : value, //$NON-NLS-1$
-                    validator) {
-            @Override
-            protected void createButtonsForButtonBar(Composite parent) {
-                createButton(parent, CLEAR_BUTTON_ID, "Clear", false /*defaultButton*/);
-                super.createButtonsForButtonBar(parent);
-            }
-
-            @Override
-            protected void buttonPressed(int buttonId) {
-                super.buttonPressed(buttonId);
-
-                if (buttonId == CLEAR_BUTTON_ID) {
-                    assert CLEAR_RETURN_CODE != Window.OK && CLEAR_RETURN_CODE != Window.CANCEL;
-                    setReturnCode(CLEAR_RETURN_CODE);
-                    close();
-                }
-            }
-        };
-        int result = d.open();
-        if (result == ResourceChooser.CLEAR_RETURN_CODE) {
-            return "";
-        } else if (result == Window.OK) {
-            return d.getValue();
-        }
-        return null;
-    }
-
-    @Override
-    @Nullable
-    public Object getViewObject(@NonNull INode node) {
-        ViewHierarchy views = mRulesEngine.getEditor().getCanvasControl().getViewHierarchy();
-        CanvasViewInfo vi = views.findViewInfoFor(node);
-        if (vi != null) {
-            return vi.getViewObject();
-        }
-
-        return null;
-    }
-
-    @Override
-    public @NonNull IViewMetadata getMetadata(final @NonNull String fqcn) {
-        return new IViewMetadata() {
-            @Override
-            public @NonNull String getDisplayName() {
-                // This also works when there is no "."
-                return fqcn.substring(fqcn.lastIndexOf('.') + 1);
-            }
-
-            @Override
-            public @NonNull FillPreference getFillPreference() {
-                return ViewMetadataRepository.get().getFillPreference(fqcn);
-            }
-
-            @Override
-            public @NonNull Margins getInsets() {
-                return mRulesEngine.getEditor().getCanvasControl().getInsets(fqcn);
-            }
-
-            @Override
-            public @NonNull List<String> getTopAttributes() {
-                return ViewMetadataRepository.get().getTopAttributes(fqcn);
-            }
-        };
-    }
-
-    @Override
-    public int getMinApiLevel() {
-        Sdk currentSdk = Sdk.getCurrent();
-        if (currentSdk != null) {
-            IAndroidTarget target = currentSdk.getTarget(mRulesEngine.getEditor().getProject());
-            if (target != null) {
-                return target.getVersion().getApiLevel();
-            }
-        }
-
-        return -1;
-    }
-
-    @Override
-    public IValidator getResourceValidator(
-            @NonNull final String resourceTypeName, final boolean uniqueInProject,
-            final boolean uniqueInLayout, final boolean exists, final String... allowed) {
-        return new IValidator() {
-            private ResourceNameValidator mValidator;
-
-            @Override
-            public String validate(@NonNull String text) {
-                if (mValidator == null) {
-                    ResourceType type = ResourceType.getEnum(resourceTypeName);
-                    if (uniqueInLayout) {
-                        assert !uniqueInProject;
-                        assert !exists;
-                        Set<String> existing = new HashSet<String>();
-                        Document doc = mRulesEngine.getEditor().getModel().getXmlDocument();
-                        if (doc != null) {
-                            addIds(doc, existing);
-                        }
-                        for (String s : allowed) {
-                            existing.remove(s);
-                        }
-                        mValidator = ResourceNameValidator.create(false, existing, type);
-                    } else {
-                        assert allowed.length == 0;
-                        IProject project = mRulesEngine.getEditor().getProject();
-                        mValidator = ResourceNameValidator.create(false, project, type);
-                        if (uniqueInProject) {
-                            mValidator.unique();
-                        }
-                    }
-                    if (exists) {
-                        mValidator.exist();
-                    }
-                }
-
-                return mValidator.isValid(text);
-            }
-        };
-    }
-
-    /** Find declared ids under the given DOM node */
-    private static void addIds(Node node, Set<String> ids) {
-        if (node.getNodeType() == Node.ELEMENT_NODE) {
-            Element element = (Element) node;
-            String id = element.getAttributeNS(ANDROID_URI, ATTR_ID);
-            if (id != null && id.startsWith(NEW_ID_PREFIX)) {
-                ids.add(BaseViewRule.stripIdPrefix(id));
-            }
-        }
-
-        NodeList children = node.getChildNodes();
-        for (int i = 0, n = children.getLength(); i < n; i++) {
-            Node child = children.item(i);
-            addIds(child, ids);
-        }
-    }
-
-    @Override
-    public String displayReferenceInput(@Nullable String currentValue) {
-        GraphicalEditorPart graphicalEditor = mRulesEngine.getEditor();
-        LayoutEditorDelegate delegate = graphicalEditor.getEditorDelegate();
-        IProject project = delegate.getEditor().getProject();
-        if (project != null) {
-            // get the resource repository for this project and the system resources.
-            ResourceRepository projectRepository =
-                ResourceManager.getInstance().getProjectResources(project);
-            Shell shell = AdtPlugin.getShell();
-            if (shell == null) {
-                return null;
-            }
-            ReferenceChooserDialog dlg = new ReferenceChooserDialog(
-                    project,
-                    projectRepository,
-                    shell);
-            dlg.setPreviewHelper(new ResourcePreviewHelper(dlg, graphicalEditor));
-
-            dlg.setCurrentResource(currentValue);
-
-            if (dlg.open() == Window.OK) {
-                return dlg.getCurrentResource();
-            }
-        }
-
-        return null;
-    }
-
-    @Override
-    public String displayResourceInput(@NonNull String resourceTypeName,
-            @Nullable String currentValue) {
-        return displayResourceInput(resourceTypeName, currentValue, null);
-    }
-
-    private String displayResourceInput(String resourceTypeName, String currentValue,
-            IInputValidator validator) {
-        ResourceType type = ResourceType.getEnum(resourceTypeName);
-        GraphicalEditorPart graphicalEditor = mRulesEngine.getEditor();
-        return ResourceChooser.chooseResource(graphicalEditor, type, currentValue, validator);
-    }
-
-    @Override
-    public String[] displayMarginInput(@Nullable String all, @Nullable String left,
-            @Nullable String right, @Nullable String top, @Nullable String bottom) {
-        GraphicalEditorPart editor = mRulesEngine.getEditor();
-        IProject project = editor.getProject();
-        if (project != null) {
-            Shell shell = AdtPlugin.getShell();
-            if (shell == null) {
-                return null;
-            }
-            AndroidTargetData data = editor.getEditorDelegate().getEditor().getTargetData();
-            MarginChooser dialog = new MarginChooser(shell, editor, data, all, left, right,
-                    top, bottom);
-            if (dialog.open() == Window.OK) {
-                return dialog.getMargins();
-            }
-        }
-
-        return null;
-    }
-
-    @Override
-    public String displayIncludeSourceInput() {
-        AndroidXmlEditor editor = mRulesEngine.getEditor().getEditorDelegate().getEditor();
-        IInputValidator validator = CyclicDependencyValidator.create(editor.getInputFile());
-        return displayResourceInput(ResourceType.LAYOUT.getName(), null, validator);
-    }
-
-    @Override
-    public void select(final @NonNull Collection<INode> nodes) {
-        LayoutCanvas layoutCanvas = mRulesEngine.getEditor().getCanvasControl();
-        final SelectionManager selectionManager = layoutCanvas.getSelectionManager();
-        selectionManager.select(nodes);
-        // ALSO run an async select since immediately after nodes are created they
-        // may not be selectable. We can't ONLY run an async exec since
-        // code may depend on operating on the selection.
-        layoutCanvas.getDisplay().asyncExec(new Runnable() {
-            @Override
-            public void run() {
-                selectionManager.select(nodes);
-            }
-        });
-    }
-
-    @Override
-    public String displayFragmentSourceInput() {
-        try {
-            // Compute a search scope: We need to merge all the subclasses
-            // android.app.Fragment and android.support.v4.app.Fragment
-            IJavaSearchScope scope = SearchEngine.createWorkspaceScope();
-            IProject project = mRulesEngine.getProject();
-            final IJavaProject javaProject = BaseProjectHelper.getJavaProject(project);
-            if (javaProject != null) {
-                IType oldFragmentType = javaProject.findType(CLASS_V4_FRAGMENT);
-
-                // First check to make sure fragments are available, and if not,
-                // warn the user.
-                IAndroidTarget target = Sdk.getCurrent().getTarget(project);
-                // No, this should be using the min SDK instead!
-                if (target.getVersion().getApiLevel() < 11 && oldFragmentType == null) {
-                    // Compatibility library must be present
-                    MessageDialog dialog =
-                        new MessageDialog(
-                                Display.getCurrent().getActiveShell(),
-                          "Fragment Warning",
-                          null,
-                          "Fragments require API level 11 or higher, or a compatibility "
-                          + "library for older versions.\n\n"
-                          + " Do you want to install the compatibility library?",
-                          MessageDialog.QUESTION,
-                          new String[] { "Install", "Cancel" },
-                          1 /* default button: Cancel */);
-                      int answer = dialog.open();
-                      if (answer == 0) {
-                          if (!AddSupportJarAction.install(project)) {
-                              return null;
-                          }
-                      } else {
-                          return null;
-                      }
-                }
-
-                // Look up sub-types of each (new fragment class and compatibility fragment
-                // class, if any) and merge the two arrays - then create a scope from these
-                // elements.
-                IType[] fragmentTypes = new IType[0];
-                IType[] oldFragmentTypes = new IType[0];
-                if (oldFragmentType != null) {
-                    ITypeHierarchy hierarchy =
-                        oldFragmentType.newTypeHierarchy(new NullProgressMonitor());
-                    oldFragmentTypes = hierarchy.getAllSubtypes(oldFragmentType);
-                }
-                IType fragmentType = javaProject.findType(CLASS_FRAGMENT);
-                if (fragmentType != null) {
-                    ITypeHierarchy hierarchy =
-                        fragmentType.newTypeHierarchy(new NullProgressMonitor());
-                    fragmentTypes = hierarchy.getAllSubtypes(fragmentType);
-                }
-                IType[] subTypes = new IType[fragmentTypes.length + oldFragmentTypes.length];
-                System.arraycopy(fragmentTypes, 0, subTypes, 0, fragmentTypes.length);
-                System.arraycopy(oldFragmentTypes, 0, subTypes, fragmentTypes.length,
-                        oldFragmentTypes.length);
-                scope = SearchEngine.createJavaSearchScope(subTypes, IJavaSearchScope.SOURCES);
-            }
-
-            Shell parent = AdtPlugin.getShell();
-            final AtomicReference<String> returnValue =
-                new AtomicReference<String>();
-            final AtomicReference<SelectionDialog> dialogHolder =
-                new AtomicReference<SelectionDialog>();
-            final SelectionDialog dialog = JavaUI.createTypeDialog(
-                    parent,
-                    new ProgressMonitorDialog(parent),
-                    scope,
-                    IJavaElementSearchConstants.CONSIDER_CLASSES, false,
-                    // Use ? as a default filter to fill dialog with matches
-                    "?", //$NON-NLS-1$
-                    new TypeSelectionExtension() {
-                        @Override
-                        public Control createContentArea(Composite parentComposite) {
-                            Composite composite = new Composite(parentComposite, SWT.NONE);
-                            composite.setLayout(new GridLayout(1, false));
-                            Button button = new Button(composite, SWT.PUSH);
-                            button.setText("Create New...");
-                            button.addSelectionListener(new SelectionAdapter() {
-                                @Override
-                                public void widgetSelected(SelectionEvent e) {
-                                    String fqcn = createNewFragmentClass(javaProject);
-                                    if (fqcn != null) {
-                                        returnValue.set(fqcn);
-                                        dialogHolder.get().close();
-                                    }
-                                }
-                            });
-                            return composite;
-                        }
-
-                        @Override
-                        public ITypeInfoFilterExtension getFilterExtension() {
-                            return new ITypeInfoFilterExtension() {
-                                @Override
-                                public boolean select(ITypeInfoRequestor typeInfoRequestor) {
-                                    int modifiers = typeInfoRequestor.getModifiers();
-                                    if (!Flags.isPublic(modifiers)
-                                            || Flags.isInterface(modifiers)
-                                            || Flags.isEnum(modifiers)
-                                            || Flags.isAbstract(modifiers)) {
-                                        return false;
-                                    }
-                                    return true;
-                                }
-                            };
-                        }
-                    });
-            dialogHolder.set(dialog);
-
-            dialog.setTitle("Choose Fragment Class");
-            dialog.setMessage("Select a Fragment class (? = any character, * = any string):");
-            if (dialog.open() == IDialogConstants.CANCEL_ID) {
-                return null;
-            }
-            if (returnValue.get() != null) {
-                return returnValue.get();
-            }
-
-            Object[] types = dialog.getResult();
-            if (types != null && types.length > 0) {
-                return ((IType) types[0]).getFullyQualifiedName();
-            }
-        } catch (JavaModelException e) {
-            AdtPlugin.log(e, null);
-        } catch (CoreException e) {
-            AdtPlugin.log(e, null);
-        }
-        return null;
-    }
-
-    @Override
-    public String displayCustomViewClassInput() {
-        try {
-            IJavaSearchScope scope = SearchEngine.createWorkspaceScope();
-            IProject project = mRulesEngine.getProject();
-            final IJavaProject javaProject = BaseProjectHelper.getJavaProject(project);
-            if (javaProject != null) {
-                // Look up sub-types of each (new fragment class and compatibility fragment
-                // class, if any) and merge the two arrays - then create a scope from these
-                // elements.
-                IType[] viewTypes = new IType[0];
-                IType fragmentType = javaProject.findType(CLASS_VIEW);
-                if (fragmentType != null) {
-                    ITypeHierarchy hierarchy =
-                        fragmentType.newTypeHierarchy(new NullProgressMonitor());
-                    viewTypes = hierarchy.getAllSubtypes(fragmentType);
-                }
-                scope = SearchEngine.createJavaSearchScope(viewTypes, IJavaSearchScope.SOURCES);
-            }
-
-            Shell parent = AdtPlugin.getShell();
-            final AtomicReference<String> returnValue =
-                new AtomicReference<String>();
-            final AtomicReference<SelectionDialog> dialogHolder =
-                new AtomicReference<SelectionDialog>();
-            final SelectionDialog dialog = JavaUI.createTypeDialog(
-                    parent,
-                    new ProgressMonitorDialog(parent),
-                    scope,
-                    IJavaElementSearchConstants.CONSIDER_CLASSES, false,
-                    // Use ? as a default filter to fill dialog with matches
-                    "?", //$NON-NLS-1$
-                    new TypeSelectionExtension() {
-                        @Override
-                        public Control createContentArea(Composite parentComposite) {
-                            Composite composite = new Composite(parentComposite, SWT.NONE);
-                            composite.setLayout(new GridLayout(1, false));
-                            Button button = new Button(composite, SWT.PUSH);
-                            button.setText("Create New...");
-                            button.addSelectionListener(new SelectionAdapter() {
-                                @Override
-                                public void widgetSelected(SelectionEvent e) {
-                                    String fqcn = createNewCustomViewClass(javaProject);
-                                    if (fqcn != null) {
-                                        returnValue.set(fqcn);
-                                        dialogHolder.get().close();
-                                    }
-                                }
-                            });
-                            return composite;
-                        }
-
-                        @Override
-                        public ITypeInfoFilterExtension getFilterExtension() {
-                            return new ITypeInfoFilterExtension() {
-                                @Override
-                                public boolean select(ITypeInfoRequestor typeInfoRequestor) {
-                                    int modifiers = typeInfoRequestor.getModifiers();
-                                    if (!Flags.isPublic(modifiers)
-                                            || Flags.isInterface(modifiers)
-                                            || Flags.isEnum(modifiers)
-                                            || Flags.isAbstract(modifiers)) {
-                                        return false;
-                                    }
-                                    return true;
-                                }
-                            };
-                        }
-                    });
-            dialogHolder.set(dialog);
-
-            dialog.setTitle("Choose Custom View Class");
-            dialog.setMessage("Select a Custom View class (? = any character, * = any string):");
-            if (dialog.open() == IDialogConstants.CANCEL_ID) {
-                return null;
-            }
-            if (returnValue.get() != null) {
-                return returnValue.get();
-            }
-
-            Object[] types = dialog.getResult();
-            if (types != null && types.length > 0) {
-                return ((IType) types[0]).getFullyQualifiedName();
-            }
-        } catch (JavaModelException e) {
-            AdtPlugin.log(e, null);
-        } catch (CoreException e) {
-            AdtPlugin.log(e, null);
-        }
-        return null;
-    }
-
-    @Override
-    public void redraw() {
-        mRulesEngine.getEditor().getCanvasControl().redraw();
-    }
-
-    @Override
-    public void layout() {
-        mRulesEngine.getEditor().recomputeLayout();
-    }
-
-    @Override
-    public Map<INode, Rect> measureChildren(@NonNull INode parent,
-            @Nullable IClientRulesEngine.AttributeFilter filter) {
-        RenderService renderService = RenderService.create(mRulesEngine.getEditor());
-        Map<INode, Rect> map = renderService.measureChildren(parent, filter);
-        if (map == null) {
-            map = Collections.emptyMap();
-        }
-        return map;
-    }
-
-    @Override
-    public int pxToDp(int px) {
-        ConfigurationChooser chooser = mRulesEngine.getEditor().getConfigurationChooser();
-        float dpi = chooser.getConfiguration().getDensity().getDpiValue();
-        return (int) (px * 160 / dpi);
-    }
-
-    @Override
-    public int dpToPx(int dp) {
-        ConfigurationChooser chooser = mRulesEngine.getEditor().getConfigurationChooser();
-        float dpi = chooser.getConfiguration().getDensity().getDpiValue();
-        return (int) (dp * dpi / 160);
-    }
-
-    @Override
-    public int screenToLayout(int pixels) {
-        return (int) (pixels / mRulesEngine.getEditor().getCanvasControl().getScale());
-    }
-
-    private String createNewFragmentClass(IJavaProject javaProject) {
-        NewClassWizardPage page = new NewClassWizardPage();
-
-        IProject project = mRulesEngine.getProject();
-        Sdk sdk = Sdk.getCurrent();
-        if (sdk == null) {
-            return null;
-        }
-        IAndroidTarget target = sdk.getTarget(project);
-        String superClass;
-        if (target == null || target.getVersion().getApiLevel() < 11) {
-            superClass = CLASS_V4_FRAGMENT;
-        } else {
-            superClass = CLASS_FRAGMENT;
-        }
-        page.setSuperClass(superClass, true /* canBeModified */);
-        IPackageFragmentRoot root = ManifestInfo.getSourcePackageRoot(javaProject);
-        if (root != null) {
-            page.setPackageFragmentRoot(root, true /* canBeModified */);
-        }
-        ManifestInfo manifestInfo = ManifestInfo.get(project);
-        IPackageFragment pkg = manifestInfo.getPackageFragment();
-        if (pkg != null) {
-            page.setPackageFragment(pkg, true /* canBeModified */);
-        }
-        OpenNewClassWizardAction action = new OpenNewClassWizardAction();
-        action.setConfiguredWizardPage(page);
-        action.run();
-        IType createdType = page.getCreatedType();
-        if (createdType != null) {
-            return createdType.getFullyQualifiedName();
-        } else {
-            return null;
-        }
-    }
-
-    private String createNewCustomViewClass(IJavaProject javaProject) {
-        NewClassWizardPage page = new NewClassWizardPage();
-
-        IProject project = mRulesEngine.getProject();
-        String superClass = CLASS_VIEW;
-        page.setSuperClass(superClass, true /* canBeModified */);
-        IPackageFragmentRoot root = ManifestInfo.getSourcePackageRoot(javaProject);
-        if (root != null) {
-            page.setPackageFragmentRoot(root, true /* canBeModified */);
-        }
-        ManifestInfo manifestInfo = ManifestInfo.get(project);
-        IPackageFragment pkg = manifestInfo.getPackageFragment();
-        if (pkg != null) {
-            page.setPackageFragment(pkg, true /* canBeModified */);
-        }
-        OpenNewClassWizardAction action = new OpenNewClassWizardAction();
-        action.setConfiguredWizardPage(page);
-        action.run();
-        IType createdType = page.getCreatedType();
-        if (createdType != null) {
-            return createdType.getFullyQualifiedName();
-        } else {
-            return null;
-        }
-    }
-
-    @Override
-    public @NonNull String getUniqueId(@NonNull String fqcn) {
-        UiDocumentNode root = mRulesEngine.getEditor().getModel();
-        String prefix = fqcn.substring(fqcn.lastIndexOf('.') + 1);
-        prefix = Character.toLowerCase(prefix.charAt(0)) + prefix.substring(1);
-        return DescriptorsUtils.getFreeWidgetId(root, prefix);
-    }
-
-    @Override
-    public @NonNull String getAppNameSpace() {
-        IProject project = mRulesEngine.getEditor().getProject();
-
-        ProjectState projectState = Sdk.getProjectState(project);
-        if (projectState != null && projectState.isLibrary()) {
-            return AUTO_URI;
-        }
-
-        ManifestInfo info = ManifestInfo.get(project);
-        return URI_PREFIX + info.getPackage();
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gre/NodeFactory.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gre/NodeFactory.java
deleted file mode 100644
index b0b9971..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gre/NodeFactory.java
+++ /dev/null
@@ -1,86 +0,0 @@
-/*
- * Copyright (C) 2010 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.editors.layout.gre;
-
-import com.android.ide.common.api.INode;
-import com.android.ide.eclipse.adt.internal.editors.layout.gle2.CanvasViewInfo;
-import com.android.ide.eclipse.adt.internal.editors.layout.gle2.LayoutCanvas;
-import com.android.ide.eclipse.adt.internal.editors.layout.gle2.SwtUtils;
-import com.android.ide.eclipse.adt.internal.editors.layout.uimodel.UiViewElementNode;
-
-import org.eclipse.swt.graphics.Rectangle;
-
-import java.util.Map;
-import java.util.WeakHashMap;
-
-/**
- * An object that can create {@link INode} proxies.
- * This also keeps references to objects already created and tries to reuse them.
- */
-public class NodeFactory {
-
-    private final Map<UiViewElementNode, NodeProxy> mNodeMap =
-        new WeakHashMap<UiViewElementNode, NodeProxy>();
-    private LayoutCanvas mCanvas;
-
-    public NodeFactory(LayoutCanvas canvas) {
-        mCanvas = canvas;
-    }
-
-    /**
-     * Returns an {@link INode} proxy based on the view key of the given
-     * {@link CanvasViewInfo}. The bounds of the node are set to the canvas view bounds.
-     */
-    public NodeProxy create(CanvasViewInfo canvasViewInfo) {
-        return create(canvasViewInfo.getUiViewNode(), canvasViewInfo.getAbsRect());
-    }
-
-    /**
-     * Returns an {@link INode} proxy based on a given {@link UiViewElementNode} that
-     * is not yet part of the canvas, typically those created by layout rules
-     * when generating new XML.
-     */
-    public NodeProxy create(UiViewElementNode uiNode) {
-        return create(uiNode, null /*bounds*/);
-    }
-
-    public void clear() {
-        mNodeMap.clear();
-    }
-
-    public LayoutCanvas getCanvas() {
-        return mCanvas;
-    }
-
-    //----
-
-    private NodeProxy create(UiViewElementNode uiNode, Rectangle bounds) {
-        NodeProxy proxy = mNodeMap.get(uiNode);
-
-        if (proxy == null) {
-            // Create a new proxy if the key doesn't exist
-            proxy = new NodeProxy(uiNode, bounds, this);
-            mNodeMap.put(uiNode, proxy);
-
-        } else if (bounds != null && !SwtUtils.equals(proxy.getBounds(), bounds)) {
-            // Update the bounds if necessary
-            proxy.setBounds(bounds);
-        }
-
-        return proxy;
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gre/NodeProxy.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gre/NodeProxy.java
deleted file mode 100644
index 19d5e16..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gre/NodeProxy.java
+++ /dev/null
@@ -1,517 +0,0 @@
-/*
- * Copyright (C) 2009 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.editors.layout.gre;
-
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-import com.android.ide.common.api.IAttributeInfo;
-import com.android.ide.common.api.INode;
-import com.android.ide.common.api.INodeHandler;
-import com.android.ide.common.api.Margins;
-import com.android.ide.common.api.Rect;
-import com.android.ide.common.resources.platform.AttributeInfo;
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.ide.eclipse.adt.internal.editors.AndroidXmlEditor;
-import com.android.ide.eclipse.adt.internal.editors.descriptors.AttributeDescriptor;
-import com.android.ide.eclipse.adt.internal.editors.descriptors.DescriptorsUtils;
-import com.android.ide.eclipse.adt.internal.editors.descriptors.ElementDescriptor;
-import com.android.ide.eclipse.adt.internal.editors.layout.LayoutEditorDelegate;
-import com.android.ide.eclipse.adt.internal.editors.layout.descriptors.ViewElementDescriptor;
-import com.android.ide.eclipse.adt.internal.editors.layout.gle2.CanvasViewInfo;
-import com.android.ide.eclipse.adt.internal.editors.layout.gle2.SimpleAttribute;
-import com.android.ide.eclipse.adt.internal.editors.layout.gle2.SwtUtils;
-import com.android.ide.eclipse.adt.internal.editors.layout.gle2.ViewHierarchy;
-import com.android.ide.eclipse.adt.internal.editors.layout.uimodel.UiViewElementNode;
-import com.android.ide.eclipse.adt.internal.editors.uimodel.UiAttributeNode;
-import com.android.ide.eclipse.adt.internal.editors.uimodel.UiDocumentNode;
-import com.android.ide.eclipse.adt.internal.editors.uimodel.UiElementNode;
-import com.android.ide.eclipse.adt.internal.project.SupportLibraryHelper;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.swt.graphics.Rectangle;
-import org.w3c.dom.NamedNodeMap;
-import org.w3c.dom.Node;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-/**
- *
- */
-public class NodeProxy implements INode {
-    private static final Margins NO_MARGINS = new Margins(0, 0, 0, 0);
-    private final UiViewElementNode mNode;
-    private final Rect mBounds;
-    private final NodeFactory mFactory;
-    /** Map from URI to Map(key=>value) (where no namespace uses "" as a key) */
-    private Map<String, Map<String, String>> mPendingAttributes;
-
-    /**
-     * Creates a new {@link INode} that wraps an {@link UiViewElementNode} that is
-     * actually valid in the current UI/XML model. The view may not be part of the canvas
-     * yet (e.g. if it has just been dynamically added and the canvas hasn't reloaded yet.)
-     * <p/>
-     * This method is package protected. To create a node, please use {@link NodeFactory} instead.
-     *
-     * @param uiNode The node to wrap.
-     * @param bounds The bounds of a the view in the canvas. Must be either: <br/>
-     *   - a valid rect for a view that is actually in the canvas <br/>
-     *   - <b>*or*</b> null (or an invalid rect) for a view that has just been added dynamically
-     *   to the model. We never store a null bounds rectangle in the node, a null rectangle
-     *   will be converted to an invalid rectangle.
-     * @param factory A {@link NodeFactory} to create unique children nodes.
-     */
-    /*package*/ NodeProxy(UiViewElementNode uiNode, Rectangle bounds, NodeFactory factory) {
-        mNode = uiNode;
-        mFactory = factory;
-        if (bounds == null) {
-            mBounds = new Rect();
-        } else {
-            mBounds = SwtUtils.toRect(bounds);
-        }
-    }
-
-    @Override
-    public @NonNull Rect getBounds() {
-        return mBounds;
-    }
-
-    @Override
-    public @NonNull Margins getMargins() {
-        ViewHierarchy viewHierarchy = mFactory.getCanvas().getViewHierarchy();
-        CanvasViewInfo view = viewHierarchy.findViewInfoFor(this);
-        if (view != null) {
-            Margins margins = view.getMargins();
-            if (margins != null) {
-                return margins;
-            }
-        }
-
-        return NO_MARGINS;
-    }
-
-
-    @Override
-    public int getBaseline() {
-        ViewHierarchy viewHierarchy = mFactory.getCanvas().getViewHierarchy();
-        CanvasViewInfo view = viewHierarchy.findViewInfoFor(this);
-        if (view != null) {
-            return view.getBaseline();
-        }
-
-        return -1;
-    }
-
-    /**
-     * Updates the bounds of this node proxy. Bounds cannot be null, but it can be invalid.
-     * This is a package-protected method, only the {@link NodeFactory} uses this method.
-     */
-    /*package*/ void setBounds(Rectangle bounds) {
-        SwtUtils.set(mBounds, bounds);
-    }
-
-    /**
-     * Returns the {@link UiViewElementNode} corresponding to this
-     * {@link NodeProxy}.
-     *
-     * @return The {@link UiViewElementNode} corresponding to this
-     *         {@link NodeProxy}
-     */
-    public UiViewElementNode getNode() {
-        return mNode;
-    }
-
-    @Override
-    public @NonNull String getFqcn() {
-        if (mNode != null) {
-            ElementDescriptor desc = mNode.getDescriptor();
-            if (desc instanceof ViewElementDescriptor) {
-                return ((ViewElementDescriptor) desc).getFullClassName();
-            }
-        }
-
-        return "";
-    }
-
-
-    // ---- Hierarchy handling ----
-
-
-    @Override
-    public INode getRoot() {
-        if (mNode != null) {
-            UiElementNode p = mNode.getUiRoot();
-            // The node root should be a document. Instead what we really mean to
-            // return is the top level view element.
-            if (p instanceof UiDocumentNode) {
-                List<UiElementNode> children = p.getUiChildren();
-                if (children.size() > 0) {
-                    p = children.get(0);
-                }
-            }
-
-            // Cope with a badly structured XML layout
-            while (p != null && !(p instanceof UiViewElementNode)) {
-                p = p.getUiNextSibling();
-            }
-
-            if (p == mNode) {
-                return this;
-            }
-            if (p instanceof UiViewElementNode) {
-                return mFactory.create((UiViewElementNode) p);
-            }
-        }
-
-        return null;
-    }
-
-    @Override
-    public INode getParent() {
-        if (mNode != null) {
-            UiElementNode p = mNode.getUiParent();
-            if (p instanceof UiViewElementNode) {
-                return mFactory.create((UiViewElementNode) p);
-            }
-        }
-
-        return null;
-    }
-
-    @Override
-    public @NonNull INode[] getChildren() {
-        if (mNode != null) {
-            List<UiElementNode> uiChildren = mNode.getUiChildren();
-            List<INode> nodes = new ArrayList<INode>(uiChildren.size());
-            for (UiElementNode uiChild : uiChildren) {
-                if (uiChild instanceof UiViewElementNode) {
-                    nodes.add(mFactory.create((UiViewElementNode) uiChild));
-                }
-            }
-
-            return nodes.toArray(new INode[nodes.size()]);
-        }
-
-        return new INode[0];
-    }
-
-
-    // ---- XML Editing ---
-
-    @Override
-    public void editXml(@NonNull String undoName, final @NonNull INodeHandler c) {
-        final AndroidXmlEditor editor = mNode.getEditor();
-
-        if (editor != null) {
-            // Create an undo edit XML wrapper, which takes a runnable
-            editor.wrapUndoEditXmlModel(
-                    undoName,
-                    new Runnable() {
-                        @Override
-                        public void run() {
-                            // Here editor.isEditXmlModelPending returns true and it
-                            // is safe to edit the model using any method from INode.
-
-                            // Finally execute the closure that will act on the XML
-                            c.handle(NodeProxy.this);
-                            applyPendingChanges();
-                        }
-                    });
-        }
-    }
-
-    private void checkEditOK() {
-        final AndroidXmlEditor editor = mNode.getEditor();
-        if (!editor.isEditXmlModelPending()) {
-            throw new RuntimeException("Error: XML edit call without using INode.editXml!");
-        }
-    }
-
-    @Override
-    public @NonNull INode appendChild(@NonNull String viewFqcn) {
-        return insertOrAppend(viewFqcn, -1);
-    }
-
-    @Override
-    public @NonNull INode insertChildAt(@NonNull String viewFqcn, int index) {
-        return insertOrAppend(viewFqcn, index);
-    }
-
-    @Override
-    public void removeChild(@NonNull INode node) {
-        checkEditOK();
-
-        ((NodeProxy) node).mNode.deleteXmlNode();
-    }
-
-    private INode insertOrAppend(String viewFqcn, int index) {
-        checkEditOK();
-
-        AndroidXmlEditor editor = mNode.getEditor();
-        if (editor != null) {
-            // Possibly replace the tag with a compatibility version if the
-            // minimum SDK requires it
-            IProject project = editor.getProject();
-            if (project != null) {
-                viewFqcn = SupportLibraryHelper.getTagFor(project, viewFqcn);
-            }
-        }
-
-        // Find the descriptor for this FQCN
-        ViewElementDescriptor vd = getFqcnViewDescriptor(viewFqcn);
-        if (vd == null) {
-            warnPrintf("Can't create a new %s element", viewFqcn);
-            return null;
-        }
-
-        final UiElementNode uiNew;
-        if (index == -1) {
-            // Append at the end.
-            uiNew = mNode.appendNewUiChild(vd);
-        } else {
-            // Insert at the requested position or at the end.
-            int n = mNode.getUiChildren().size();
-            if (index < 0 || index >= n) {
-                uiNew = mNode.appendNewUiChild(vd);
-            } else {
-                uiNew = mNode.insertNewUiChild(index, vd);
-            }
-        }
-
-        // Set default attributes -- but only for new widgets (not when moving or copying)
-        RulesEngine engine = null;
-        LayoutEditorDelegate delegate = LayoutEditorDelegate.fromEditor(editor);
-        if (delegate != null) {
-            engine = delegate.getRulesEngine();
-        }
-        if (engine == null || engine.getInsertType().isCreate()) {
-            // TODO: This should probably use IViewRule#getDefaultAttributes() at some point
-            DescriptorsUtils.setDefaultLayoutAttributes(uiNew, false /*updateLayout*/);
-        }
-
-        Node xmlNode = uiNew.createXmlNode();
-
-        if (!(uiNew instanceof UiViewElementNode) || xmlNode == null) {
-            // Both things are not supposed to happen. When they do, we're in big trouble.
-            // We don't really know how to revert the state at this point and the UI model is
-            // now out of sync with the XML model.
-            // Panic ensues.
-            // The best bet is to abort now. The edit wrapper will release the edit and the
-            // XML/UI should get reloaded properly (with a likely invalid XML.)
-            warnPrintf("Failed to create a new %s element", viewFqcn);
-            throw new RuntimeException("XML node creation failed."); //$NON-NLS-1$
-        }
-
-        UiViewElementNode uiNewView = (UiViewElementNode) uiNew;
-        NodeProxy newNode = mFactory.create(uiNewView);
-
-        if (engine != null) {
-            engine.callCreateHooks(editor, this, newNode, null);
-        }
-
-        return newNode;
-    }
-
-    @Override
-    public boolean setAttribute(
-            @Nullable String uri,
-            @NonNull String name,
-            @Nullable String value) {
-        checkEditOK();
-        UiAttributeNode attr = mNode.setAttributeValue(name, uri, value, true /* override */);
-
-        if (uri == null) {
-            uri = ""; //$NON-NLS-1$
-        }
-
-        Map<String, String> map = null;
-        if (mPendingAttributes == null) {
-            // Small initial size: we don't expect many different namespaces
-            mPendingAttributes = new HashMap<String, Map<String, String>>(3);
-        } else {
-            map = mPendingAttributes.get(uri);
-        }
-        if (map == null) {
-            map = new HashMap<String, String>();
-            mPendingAttributes.put(uri, map);
-        }
-        map.put(name, value);
-
-        return attr != null;
-    }
-
-    @Override
-    public String getStringAttr(@Nullable String uri, @NonNull String attrName) {
-        UiElementNode uiNode = mNode;
-
-        if (attrName == null) {
-            return null;
-        }
-
-        if (mPendingAttributes != null) {
-            Map<String, String> map = mPendingAttributes.get(uri == null ? "" : uri); //$NON-NLS-1$
-            if (map != null) {
-                String value = map.get(attrName);
-                if (value != null) {
-                    return value;
-                }
-            }
-        }
-
-        if (uiNode.getXmlNode() != null) {
-            Node xmlNode = uiNode.getXmlNode();
-            if (xmlNode != null) {
-                NamedNodeMap nodeAttributes = xmlNode.getAttributes();
-                if (nodeAttributes != null) {
-                    Node attr = nodeAttributes.getNamedItemNS(uri, attrName);
-                    if (attr != null) {
-                        return attr.getNodeValue();
-                    }
-                }
-            }
-        }
-        return null;
-    }
-
-    @Override
-    public IAttributeInfo getAttributeInfo(@Nullable String uri, @NonNull String attrName) {
-        UiElementNode uiNode = mNode;
-
-        if (attrName == null) {
-            return null;
-        }
-
-        for (AttributeDescriptor desc : uiNode.getAttributeDescriptors()) {
-            String dUri = desc.getNamespaceUri();
-            String dName = desc.getXmlLocalName();
-            if ((uri == null && dUri == null) || (uri != null && uri.equals(dUri))) {
-                if (attrName.equals(dName)) {
-                    return desc.getAttributeInfo();
-                }
-            }
-        }
-
-        return null;
-    }
-
-    @Override
-    public @NonNull IAttributeInfo[] getDeclaredAttributes() {
-
-        AttributeDescriptor[] descs = mNode.getAttributeDescriptors();
-        int n = descs.length;
-        IAttributeInfo[] infos = new AttributeInfo[n];
-
-        for (int i = 0; i < n; i++) {
-            infos[i] = descs[i].getAttributeInfo();
-        }
-
-        return infos;
-    }
-
-    @Override
-    public @NonNull List<String> getAttributeSources() {
-        ElementDescriptor descriptor = mNode.getDescriptor();
-        if (descriptor instanceof ViewElementDescriptor) {
-            return ((ViewElementDescriptor) descriptor).getAttributeSources();
-        } else {
-            return Collections.emptyList();
-        }
-    }
-
-    @Override
-    public @NonNull IAttribute[] getLiveAttributes() {
-        UiElementNode uiNode = mNode;
-
-        if (uiNode.getXmlNode() != null) {
-            Node xmlNode = uiNode.getXmlNode();
-            if (xmlNode != null) {
-                NamedNodeMap nodeAttributes = xmlNode.getAttributes();
-                if (nodeAttributes != null) {
-
-                    int n = nodeAttributes.getLength();
-                    IAttribute[] result = new IAttribute[n];
-                    for (int i = 0; i < n; i++) {
-                        Node attr = nodeAttributes.item(i);
-                        String uri = attr.getNamespaceURI();
-                        String name = attr.getLocalName();
-                        String value = attr.getNodeValue();
-
-                        result[i] = new SimpleAttribute(uri, name, value);
-                    }
-                    return result;
-                }
-            }
-        }
-
-        return new IAttribute[0];
-
-    }
-
-    @Override
-    public String toString() {
-        return "NodeProxy [node=" + mNode + ", bounds=" + mBounds + "]";
-    }
-
-    // --- internal helpers ---
-
-    /**
-     * Helper methods that returns a {@link ViewElementDescriptor} for the requested FQCN.
-     * Will return null if we can't find that FQCN or we lack the editor/data/descriptors info
-     * (which shouldn't really happen since at this point the SDK should be fully loaded and
-     * isn't reloading, or we wouldn't be here editing XML for a layout rule.)
-     */
-    private ViewElementDescriptor getFqcnViewDescriptor(String fqcn) {
-        LayoutEditorDelegate delegate = LayoutEditorDelegate.fromEditor(mNode.getEditor());
-        if (delegate != null) {
-            return delegate.getFqcnViewDescriptor(fqcn);
-        }
-
-        return null;
-    }
-
-    private void warnPrintf(String msg, Object...params) {
-        AdtPlugin.printToConsole(
-                mNode == null ? "" : mNode.getDescriptor().getXmlLocalName(),
-                String.format(msg, params)
-                );
-    }
-
-    /**
-     * If there are any pending changes in these nodes, apply them now
-     *
-     * @return true if any modifications were made
-     */
-    public boolean applyPendingChanges() {
-        boolean modified = false;
-
-        // Flush all pending attributes
-        if (mPendingAttributes != null) {
-            mNode.commitDirtyAttributesToXml();
-            modified = true;
-            mPendingAttributes = null;
-
-        }
-        for (INode child : getChildren()) {
-            modified |= ((NodeProxy) child).applyPendingChanges();
-        }
-
-        return modified;
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gre/PaletteMetadataDescriptor.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gre/PaletteMetadataDescriptor.java
deleted file mode 100644
index 884cb07..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gre/PaletteMetadataDescriptor.java
+++ /dev/null
@@ -1,120 +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.eclipse.adt.internal.editors.layout.gre;
-
-import static com.android.SdkConstants.ANDROID_NS_NAME_PREFIX;
-import static com.android.SdkConstants.ANDROID_URI;
-
-import com.android.ide.eclipse.adt.internal.editors.IconFactory;
-import com.android.ide.eclipse.adt.internal.editors.layout.descriptors.ViewElementDescriptor;
-import com.android.ide.eclipse.adt.internal.editors.layout.gle2.SimpleAttribute;
-import com.android.ide.eclipse.adt.internal.editors.layout.gle2.SimpleElement;
-
-import org.eclipse.swt.graphics.Image;
-import org.w3c.dom.Element;
-
-/**
- * Special version of {@link ViewElementDescriptor} which is initialized by the palette
- * with specific metadata for how to instantiate particular variations of an existing
- * {@link ViewElementDescriptor} with initial values.
- */
-public class PaletteMetadataDescriptor extends ViewElementDescriptor {
-    private String mInitString;
-    private String mIconName;
-
-    public PaletteMetadataDescriptor(ViewElementDescriptor descriptor, String displayName,
-            String initString, String iconName) {
-        super(descriptor.getXmlName(),
-                displayName,
-                descriptor.getFullClassName(),
-                descriptor.getTooltip(),
-                descriptor.getSdkUrl(),
-                descriptor.getAttributes(),
-                descriptor.getLayoutAttributes(),
-                descriptor.getChildren(), descriptor.getMandatory() == Mandatory.MANDATORY);
-        mInitString = initString;
-        mIconName = iconName;
-        setSuperClass(descriptor.getSuperClassDesc());
-    }
-
-    /**
-     * Returns a String which contains a comma separated list of name=value tokens,
-     * where the name can start with "android:" to indicate a property in the android namespace,
-     * or no prefix for plain attributes.
-     *
-     * @return the initialization string, which can be empty but never null
-     */
-    public String getInitializedAttributes() {
-        return mInitString != null ? mInitString : ""; //$NON-NLS-1$
-    }
-
-    @Override
-    public Image getGenericIcon() {
-        if (mIconName != null) {
-            IconFactory factory = IconFactory.getInstance();
-            Image icon = factory.getIcon(mIconName);
-            if (icon != null) {
-                return icon;
-            }
-        }
-
-        return super.getGenericIcon();
-    }
-
-    /**
-     * Initializes a new {@link SimpleElement} with the palette initialization
-     * configuration
-     *
-     * @param element the new element to initialize
-     */
-    public void initializeNew(SimpleElement element) {
-        initializeNew(element, null);
-    }
-
-    /**
-     * Initializes a new {@link Element} with the palette initialization configuration
-     *
-     * @param element the new element to initialize
-     */
-    public void initializeNew(Element element) {
-        initializeNew(null, element);
-    }
-
-    private void initializeNew(SimpleElement simpleElement, Element domElement) {
-        String initializedAttributes = mInitString;
-        if (initializedAttributes != null && initializedAttributes.length() > 0) {
-            for (String s : initializedAttributes.split(",")) { //$NON-NLS-1$
-                String[] nameValue = s.split("="); //$NON-NLS-1$
-                String name = nameValue[0];
-                String value = nameValue[1];
-                String nameSpace = ""; //$NON-NLS-1$
-                if (name.startsWith(ANDROID_NS_NAME_PREFIX)) {
-                    name = name.substring(ANDROID_NS_NAME_PREFIX.length());
-                    nameSpace = ANDROID_URI;
-                }
-
-                if (simpleElement != null) {
-                    SimpleAttribute attr = new SimpleAttribute(nameSpace, name, value);
-                    simpleElement.addAttribute(attr);
-                }
-
-                if (domElement != null) {
-                    domElement.setAttributeNS(nameSpace, name, value);
-                }
-            }
-        }
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gre/RuleLoader.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gre/RuleLoader.java
deleted file mode 100644
index 4f49a75..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gre/RuleLoader.java
+++ /dev/null
@@ -1,192 +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.eclipse.adt.internal.editors.layout.gre;
-
-import com.android.ide.common.api.IViewRule;
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.ide.eclipse.adt.internal.sdk.ProjectState;
-import com.android.ide.eclipse.adt.internal.sdk.Sdk;
-import com.android.sdklib.internal.project.ProjectProperties;
-import com.android.utils.Pair;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.QualifiedName;
-
-import java.io.File;
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.net.URLClassLoader;
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * The {@link RuleLoader} is responsible for loading (and unloading)
- * {@link IViewRule} classes. There is typically one {@link RuleLoader}
- * per project.
- */
-public class RuleLoader {
-    /**
-     * Qualified name for the per-project non-persistent property storing the
-     * {@link RuleLoader} for this project
-     */
-    private final static QualifiedName RULE_LOADER = new QualifiedName(AdtPlugin.PLUGIN_ID,
-            "ruleloader"); //$NON-NLS-1$
-
-    private final IProject mProject;
-    private ClassLoader mUserClassLoader;
-    private List<Pair<File, Long>> mUserJarTimeStamps;
-    private long mLastCheckTimeStamp;
-
-    /**
-     * Flag set when we've attempted to initialize the {@link #mUserClassLoader}
-     * already
-     */
-    private boolean mUserClassLoaderInited;
-
-    /**
-     * Returns the {@link RuleLoader} for the given project
-     *
-     * @param project the project the loader is associated with
-     * @return an {@RuleLoader} for the given project,
-     *         never null
-     */
-    public static RuleLoader get(IProject project) {
-        RuleLoader loader = null;
-        try {
-            loader = (RuleLoader) project.getSessionProperty(RULE_LOADER);
-        } catch (CoreException e) {
-            // Not a problem; we will just create a new one
-        }
-        if (loader == null) {
-            loader = new RuleLoader(project);
-            try {
-                project.setSessionProperty(RULE_LOADER, loader);
-            } catch (CoreException e) {
-                AdtPlugin.log(e, "Can't store RuleLoader");
-            }
-        }
-        return loader;
-    }
-
-    /** Do not call; use the {@link #get} factory method instead. */
-    private RuleLoader(IProject project) {
-        mProject = project;
-    }
-
-    /**
-     * Find out whether the given project has 3rd party ViewRules, and if so
-     * return a ClassLoader which can locate them. If not, return null.
-     * @param project The project to load user rules from
-     * @return A class loader which can user view rules, or otherwise null
-     */
-    private ClassLoader computeUserClassLoader(IProject project) {
-        // Default place to locate layout rules. The user may also add to this
-        // path by defining a config property specifying
-        // additional .jar files to search via a the layoutrules.jars property.
-        ProjectState state = Sdk.getProjectState(project);
-        ProjectProperties projectProperties = state.getProperties();
-
-        // Ensure we have the latest & greatest version of the properties.
-        // This allows users to reopen editors in a running Eclipse instance
-        // to get updated view rule jars
-        projectProperties.reload();
-
-        String path = projectProperties.getProperty(
-                ProjectProperties.PROPERTY_RULES_PATH);
-
-        if (path != null && path.length() > 0) {
-
-            mUserJarTimeStamps = new ArrayList<Pair<File, Long>>();
-            mLastCheckTimeStamp = System.currentTimeMillis();
-
-            List<URL> urls = new ArrayList<URL>();
-            String[] pathElements = path.split(File.pathSeparator);
-            for (String pathElement : pathElements) {
-                pathElement = pathElement.trim(); // Avoid problems with trailing whitespace etc
-                File pathFile = new File(pathElement);
-                if (!pathFile.isAbsolute()) {
-                    pathFile = new File(project.getLocation().toFile(), pathElement);
-                }
-                // Directories and jar files are okay. Do we need to
-                // validate the files here as .jar files?
-                if (pathFile.isFile() || pathFile.isDirectory()) {
-                    URL url;
-                    try {
-                        url = pathFile.toURI().toURL();
-                        urls.add(url);
-
-                        mUserJarTimeStamps.add(Pair.of(pathFile, pathFile.lastModified()));
-                    } catch (MalformedURLException e) {
-                        AdtPlugin.log(IStatus.WARNING,
-                                "Invalid URL: %1$s", //$NON-NLS-1$
-                                e.toString());
-                    }
-                }
-            }
-
-            if (urls.size() > 0) {
-                return new URLClassLoader(urls.toArray(new URL[urls.size()]),
-                        RulesEngine.class.getClassLoader());
-            }
-        }
-
-        return null;
-    }
-
-    /**
-     * Return the class loader to use for custom views, or null if no custom
-     * view rules are registered for the project. Note that this class loader
-     * can change over time (if the jar files are updated), so callers should be
-     * prepared to unload previous instances.
-     *
-     * @return a class loader to use for custom view rules, or null
-     */
-    public ClassLoader getClassLoader() {
-        if (mUserClassLoader == null) {
-            // Only attempt to load rule paths once.
-            // TODO: Check the timestamp on the project.properties file so we can dynamically
-            // pick up cases where the user edits the path
-            if (!mUserClassLoaderInited) {
-                mUserClassLoaderInited = true;
-                mUserClassLoader = computeUserClassLoader(mProject);
-            }
-        } else {
-            // Check the timestamp on the jar files in the custom view path to see if we
-            // need to reload the classes (but only do this at most every 3 seconds)
-            if (mUserJarTimeStamps != null) {
-                long time = System.currentTimeMillis();
-                if (time - mLastCheckTimeStamp > 3000) {
-                    mLastCheckTimeStamp = time;
-                    for (Pair<File, Long> pair : mUserJarTimeStamps) {
-                        File file = pair.getFirst();
-                        Long prevModified = pair.getSecond();
-                        long modified = file.lastModified();
-                        if (prevModified.longValue() != modified) {
-                            mUserClassLoaderInited = true;
-                            mUserJarTimeStamps = null;
-                            mUserClassLoader = computeUserClassLoader(mProject);
-                        }
-                    }
-                }
-            }
-        }
-
-        return mUserClassLoader;
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gre/RulesEngine.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gre/RulesEngine.java
deleted file mode 100644
index 8f99237..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gre/RulesEngine.java
+++ /dev/null
@@ -1,876 +0,0 @@
-/*
- * Copyright (C) 2009 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.editors.layout.gre;
-
-import static com.android.SdkConstants.ANDROID_WIDGET_PREFIX;
-import static com.android.SdkConstants.VIEW_MERGE;
-import static com.android.SdkConstants.VIEW_TAG;
-
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-import com.android.ide.common.api.DropFeedback;
-import com.android.ide.common.api.IDragElement;
-import com.android.ide.common.api.IGraphics;
-import com.android.ide.common.api.INode;
-import com.android.ide.common.api.IViewRule;
-import com.android.ide.common.api.InsertType;
-import com.android.ide.common.api.Point;
-import com.android.ide.common.api.Rect;
-import com.android.ide.common.api.RuleAction;
-import com.android.ide.common.api.SegmentType;
-import com.android.ide.common.layout.ViewRule;
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.ide.eclipse.adt.internal.editors.AndroidXmlEditor;
-import com.android.ide.eclipse.adt.internal.editors.descriptors.ElementDescriptor;
-import com.android.ide.eclipse.adt.internal.editors.layout.descriptors.ViewElementDescriptor;
-import com.android.ide.eclipse.adt.internal.editors.layout.gle2.GCWrapper;
-import com.android.ide.eclipse.adt.internal.editors.layout.gle2.GraphicalEditorPart;
-import com.android.ide.eclipse.adt.internal.editors.layout.gle2.SimpleElement;
-import com.android.ide.eclipse.adt.internal.editors.layout.uimodel.UiViewElementNode;
-import com.android.ide.eclipse.adt.internal.sdk.AndroidTargetData;
-import com.android.ide.eclipse.adt.internal.sdk.Sdk;
-import com.android.sdklib.IAndroidTarget;
-
-import org.eclipse.core.resources.IProject;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-
-/**
- * The rule engine manages the layout rules and interacts with them.
- * There's one {@link RulesEngine} instance per layout editor.
- * Each instance has 2 sets of rules: the static ADT rules (shared across all instances)
- * and the project specific rules (local to the current instance / layout editor).
- */
-public class RulesEngine {
-    private final IProject mProject;
-    private final Map<Object, IViewRule> mRulesCache = new HashMap<Object, IViewRule>();
-
-    /**
-     * The type of any upcoming node manipulations performed by the {@link IViewRule}s.
-     * When actions are performed in the tool (like a paste action, or a drag from palette,
-     * or a drag move within the canvas, etc), these are different types of inserts,
-     * and we don't want to have the rules track them closely (and pass them back to us
-     * in the {@link INode#insertChildAt} methods etc), so instead we track the state
-     * here on behalf of the currently executing rule.
-     */
-    private InsertType mInsertType = InsertType.CREATE;
-
-    /**
-     * Per-project loader for custom view rules
-     */
-    private RuleLoader mRuleLoader;
-    private ClassLoader mUserClassLoader;
-
-    /**
-     * The editor which owns this {@link RulesEngine}
-     */
-    private final GraphicalEditorPart mEditor;
-
-    /**
-     * Creates a new {@link RulesEngine} associated with the selected project.
-     * <p/>
-     * The rules engine will look in the project for a tools jar to load custom view rules.
-     *
-     * @param editor the editor which owns this {@link RulesEngine}
-     * @param project A non-null open project.
-     */
-    public RulesEngine(GraphicalEditorPart editor, IProject project) {
-        mProject = project;
-        mEditor = editor;
-
-        mRuleLoader = RuleLoader.get(project);
-    }
-
-     /**
-     * Returns the {@link IProject} on which the {@link RulesEngine} was created.
-     */
-    public IProject getProject() {
-        return mProject;
-    }
-
-    /**
-     * Returns the {@link GraphicalEditorPart} for which the {@link RulesEngine} was
-     * created.
-     *
-     * @return the associated editor
-     */
-    public GraphicalEditorPart getEditor() {
-        return mEditor;
-    }
-
-    /**
-     * Called by the owner of the {@link RulesEngine} when it is going to be disposed.
-     * This frees some resources, such as the project's folder monitor.
-     */
-    public void dispose() {
-        clearCache();
-    }
-
-    /**
-     * Invokes {@link IViewRule#getDisplayName()} on the rule matching the specified element.
-     *
-     * @param element The view element to target. Can be null.
-     * @return Null if the rule failed, there's no rule or the rule does not want to override
-     *   the display name. Otherwise, a string as returned by the rule.
-     */
-    public String callGetDisplayName(UiViewElementNode element) {
-        // try to find a rule for this element's FQCN
-        IViewRule rule = loadRule(element);
-
-        if (rule != null) {
-            try {
-                return rule.getDisplayName();
-
-            } catch (Exception e) {
-                AdtPlugin.log(e, "%s.getDisplayName() failed: %s",
-                        rule.getClass().getSimpleName(),
-                        e.toString());
-            }
-        }
-
-        return null;
-    }
-
-    /**
-     * Invokes {@link IViewRule#addContextMenuActions(List, INode)} on the rule matching the specified element.
-     *
-     * @param selectedNode The node selected. Never null.
-     * @return Null if the rule failed, there's no rule or the rule does not provide
-     *   any custom menu actions. Otherwise, a list of {@link RuleAction}.
-     */
-    @Nullable
-    public List<RuleAction> callGetContextMenu(NodeProxy selectedNode) {
-        // try to find a rule for this element's FQCN
-        IViewRule rule = loadRule(selectedNode.getNode());
-
-        if (rule != null) {
-            try {
-                mInsertType = InsertType.CREATE;
-                List<RuleAction> actions = new ArrayList<RuleAction>();
-                rule.addContextMenuActions(actions, selectedNode);
-                Collections.sort(actions);
-
-                return actions;
-            } catch (Exception e) {
-                AdtPlugin.log(e, "%s.getContextMenu() failed: %s",
-                        rule.getClass().getSimpleName(),
-                        e.toString());
-            }
-        }
-
-        return null;
-    }
-
-    /**
-     * Calls the selected node to return its default action
-     *
-     * @param selectedNode the node to apply the action to
-     * @return the default action id
-     */
-    public String callGetDefaultActionId(@NonNull NodeProxy selectedNode) {
-        // try to find a rule for this element's FQCN
-        IViewRule rule = loadRule(selectedNode.getNode());
-
-        if (rule != null) {
-            try {
-                mInsertType = InsertType.CREATE;
-                return rule.getDefaultActionId(selectedNode);
-            } catch (Exception e) {
-                AdtPlugin.log(e, "%s.getDefaultAction() failed: %s",
-                        rule.getClass().getSimpleName(),
-                        e.toString());
-            }
-        }
-
-        return null;
-    }
-
-    /**
-     * Invokes {@link IViewRule#addLayoutActions(List, INode, List)} on the rule
-     * matching the specified element.
-     *
-     * @param actions The list of actions to add layout actions into
-     * @param parentNode The layout node
-     * @param children The selected children of the node, if any (used to
-     *            initialize values of child layout controls, if applicable)
-     * @return Null if the rule failed, there's no rule or the rule does not
-     *         provide any custom menu actions. Otherwise, a list of
-     *         {@link RuleAction}.
-     */
-    public List<RuleAction> callAddLayoutActions(List<RuleAction> actions,
-            NodeProxy parentNode, List<NodeProxy> children ) {
-        // try to find a rule for this element's FQCN
-        IViewRule rule = loadRule(parentNode.getNode());
-
-        if (rule != null) {
-            try {
-                mInsertType = InsertType.CREATE;
-                rule.addLayoutActions(actions, parentNode, children);
-            } catch (Exception e) {
-                AdtPlugin.log(e, "%s.getContextMenu() failed: %s",
-                        rule.getClass().getSimpleName(),
-                        e.toString());
-            }
-        }
-
-        return null;
-    }
-
-    /**
-     * Invokes {@link IViewRule#getSelectionHint(INode, INode)}
-     * on the rule matching the specified element.
-     *
-     * @param parentNode The parent of the node selected. Never null.
-     * @param childNode The child node that was selected. Never null.
-     * @return a list of strings to be displayed, or null or empty to display nothing
-     */
-    public List<String> callGetSelectionHint(NodeProxy parentNode, NodeProxy childNode) {
-        // try to find a rule for this element's FQCN
-        IViewRule rule = loadRule(parentNode.getNode());
-
-        if (rule != null) {
-            try {
-                return rule.getSelectionHint(parentNode, childNode);
-
-            } catch (Exception e) {
-                AdtPlugin.log(e, "%s.getSelectionHint() failed: %s",
-                        rule.getClass().getSimpleName(),
-                        e.toString());
-            }
-        }
-
-        return null;
-    }
-
-    public void callPaintSelectionFeedback(GCWrapper gcWrapper, NodeProxy parentNode,
-            List<? extends INode> childNodes, Object view) {
-        // try to find a rule for this element's FQCN
-        IViewRule rule = loadRule(parentNode.getNode());
-
-        if (rule != null) {
-            try {
-                rule.paintSelectionFeedback(gcWrapper, parentNode, childNodes, view);
-
-            } catch (Exception e) {
-                AdtPlugin.log(e, "%s.callPaintSelectionFeedback() failed: %s",
-                        rule.getClass().getSimpleName(),
-                        e.toString());
-            }
-        }
-    }
-
-    /**
-     * Called when the d'n'd starts dragging over the target node.
-     * If interested, returns a DropFeedback passed to onDrop/Move/Leave/Paint.
-     * If not interested in drop, return false.
-     * Followed by a paint.
-     */
-    public DropFeedback callOnDropEnter(NodeProxy targetNode,
-            Object targetView, IDragElement[] elements) {
-        // try to find a rule for this element's FQCN
-        IViewRule rule = loadRule(targetNode.getNode());
-
-        if (rule != null) {
-            try {
-                return rule.onDropEnter(targetNode, targetView, elements);
-
-            } catch (Exception e) {
-                AdtPlugin.log(e, "%s.onDropEnter() failed: %s",
-                        rule.getClass().getSimpleName(),
-                        e.toString());
-            }
-        }
-
-        return null;
-    }
-
-    /**
-     * Called after onDropEnter.
-     * Returns a DropFeedback passed to onDrop/Move/Leave/Paint (typically same
-     * as input one).
-     */
-    public DropFeedback callOnDropMove(NodeProxy targetNode,
-            IDragElement[] elements,
-            DropFeedback feedback,
-            Point where) {
-        // try to find a rule for this element's FQCN
-        IViewRule rule = loadRule(targetNode.getNode());
-
-        if (rule != null) {
-            try {
-                return rule.onDropMove(targetNode, elements, feedback, where);
-
-            } catch (Exception e) {
-                AdtPlugin.log(e, "%s.onDropMove() failed: %s",
-                        rule.getClass().getSimpleName(),
-                        e.toString());
-            }
-        }
-
-        return null;
-    }
-
-    /**
-     * Called when drop leaves the target without actually dropping
-     */
-    public void callOnDropLeave(NodeProxy targetNode,
-            IDragElement[] elements,
-            DropFeedback feedback) {
-        // try to find a rule for this element's FQCN
-        IViewRule rule = loadRule(targetNode.getNode());
-
-        if (rule != null) {
-            try {
-                rule.onDropLeave(targetNode, elements, feedback);
-
-            } catch (Exception e) {
-                AdtPlugin.log(e, "%s.onDropLeave() failed: %s",
-                        rule.getClass().getSimpleName(),
-                        e.toString());
-            }
-        }
-    }
-
-    /**
-     * Called when drop is released over the target to perform the actual drop.
-     */
-    public void callOnDropped(NodeProxy targetNode,
-            IDragElement[] elements,
-            DropFeedback feedback,
-            Point where,
-            InsertType insertType) {
-        // try to find a rule for this element's FQCN
-        IViewRule rule = loadRule(targetNode.getNode());
-
-        if (rule != null) {
-            try {
-                mInsertType = insertType;
-                rule.onDropped(targetNode, elements, feedback, where);
-
-            } catch (Exception e) {
-                AdtPlugin.log(e, "%s.onDropped() failed: %s",
-                        rule.getClass().getSimpleName(),
-                        e.toString());
-            }
-        }
-    }
-
-    /**
-     * Called when a paint has been requested via DropFeedback.
-     */
-    public void callDropFeedbackPaint(IGraphics gc,
-            NodeProxy targetNode,
-            DropFeedback feedback) {
-        if (gc != null && feedback != null && feedback.painter != null) {
-            try {
-                feedback.painter.paint(gc, targetNode, feedback);
-            } catch (Exception e) {
-                AdtPlugin.log(e, "DropFeedback.painter failed: %s",
-                        e.toString());
-            }
-        }
-    }
-
-    /**
-     * Called when pasting elements in an existing document on the selected target.
-     *
-     * @param targetNode The first node selected.
-     * @param targetView The view object for the target node, or null if not known
-     * @param pastedElements The elements being pasted.
-     * @return the parent node the paste was applied into
-     */
-    public NodeProxy callOnPaste(NodeProxy targetNode, Object targetView,
-            SimpleElement[] pastedElements) {
-
-        // Find a target which accepts children. If you for example select a button
-        // and attempt to paste, this will reselect the parent of the button as the paste
-        // target. (This is a loop rather than just checking the direct parent since
-        // we will soon ask each child whether they are *willing* to accept the new child.
-        // A ScrollView for example, which only accepts one child, might also say no
-        // and delegate to its parent in turn.
-        INode parent = targetNode;
-        while (parent instanceof NodeProxy) {
-            NodeProxy np = (NodeProxy) parent;
-            if (np.getNode() != null && np.getNode().getDescriptor() != null) {
-                ElementDescriptor descriptor = np.getNode().getDescriptor();
-                if (descriptor.hasChildren()) {
-                    targetNode = np;
-                    break;
-                }
-            }
-            parent = parent.getParent();
-        }
-
-        // try to find a rule for this element's FQCN
-        IViewRule rule = loadRule(targetNode.getNode());
-
-        if (rule != null) {
-            try {
-                mInsertType = InsertType.PASTE;
-                rule.onPaste(targetNode, targetView, pastedElements);
-
-            } catch (Exception e) {
-                AdtPlugin.log(e, "%s.onPaste() failed: %s",
-                        rule.getClass().getSimpleName(),
-                        e.toString());
-            }
-        }
-
-        return targetNode;
-    }
-
-    // ---- Resize operations ----
-
-    public DropFeedback callOnResizeBegin(NodeProxy child, NodeProxy parent, Rect newBounds,
-            SegmentType horizontalEdge, SegmentType verticalEdge, Object childView,
-            Object parentView) {
-        IViewRule rule = loadRule(parent.getNode());
-
-        if (rule != null) {
-            try {
-                return rule.onResizeBegin(child, parent, horizontalEdge, verticalEdge,
-                        childView, parentView);
-            } catch (Exception e) {
-                AdtPlugin.log(e, "%s.onResizeBegin() failed: %s", rule.getClass().getSimpleName(),
-                        e.toString());
-            }
-        }
-
-        return null;
-    }
-
-    public void callOnResizeUpdate(DropFeedback feedback, NodeProxy child, NodeProxy parent,
-            Rect newBounds, int modifierMask) {
-        IViewRule rule = loadRule(parent.getNode());
-
-        if (rule != null) {
-            try {
-                rule.onResizeUpdate(feedback, child, parent, newBounds, modifierMask);
-            } catch (Exception e) {
-                AdtPlugin.log(e, "%s.onResizeUpdate() failed: %s", rule.getClass().getSimpleName(),
-                        e.toString());
-            }
-        }
-    }
-
-    public void callOnResizeEnd(DropFeedback feedback, NodeProxy child, NodeProxy parent,
-            Rect newBounds) {
-        IViewRule rule = loadRule(parent.getNode());
-
-        if (rule != null) {
-            try {
-                rule.onResizeEnd(feedback, child, parent, newBounds);
-            } catch (Exception e) {
-                AdtPlugin.log(e, "%s.onResizeEnd() failed: %s", rule.getClass().getSimpleName(),
-                        e.toString());
-            }
-        }
-    }
-
-    // ---- Creation customizations ----
-
-    /**
-     * Invokes the create hooks ({@link IViewRule#onCreate},
-     * {@link IViewRule#onChildInserted} when a new child has been created/pasted/moved, and
-     * is inserted into a given parent. The parent may be null (for example when rendering
-     * top level items for preview).
-     *
-     * @param editor the XML editor to apply edits to the model for (performed by view
-     *            rules)
-     * @param parentNode the parent XML node, or null if unknown
-     * @param childNode the XML node of the new node, never null
-     * @param overrideInsertType If not null, specifies an explicit insert type to use for
-     *            edits made during the customization
-     */
-    public void callCreateHooks(
-        AndroidXmlEditor editor,
-        NodeProxy parentNode, NodeProxy childNode,
-        InsertType overrideInsertType) {
-        IViewRule parentRule = null;
-
-        if (parentNode != null) {
-            UiViewElementNode parentUiNode = parentNode.getNode();
-            parentRule = loadRule(parentUiNode);
-        }
-
-        if (overrideInsertType != null) {
-            mInsertType = overrideInsertType;
-        }
-
-        UiViewElementNode newUiNode = childNode.getNode();
-        IViewRule childRule = loadRule(newUiNode);
-        if (childRule != null || parentRule != null) {
-            callCreateHooks(editor, mInsertType, parentRule, parentNode,
-                    childRule, childNode);
-        }
-    }
-
-    private static void callCreateHooks(
-            final AndroidXmlEditor editor, final InsertType insertType,
-            final IViewRule parentRule, final INode parentNode,
-            final IViewRule childRule, final INode newNode) {
-        // Notify the parent about the new child in case it wants to customize it
-        // (For example, a ScrollView parent can go and set all its children's layout params to
-        // fill the parent.)
-        if (!editor.isEditXmlModelPending()) {
-            editor.wrapEditXmlModel(new Runnable() {
-                @Override
-                public void run() {
-                    callCreateHooks(editor, insertType,
-                            parentRule, parentNode, childRule, newNode);
-                }
-            });
-            return;
-        }
-
-        if (parentRule != null) {
-            parentRule.onChildInserted(newNode, parentNode, insertType);
-        }
-
-        // Look up corresponding IViewRule, and notify the rule about
-        // this create action in case it wants to customize the new object.
-        // (For example, a rule for TabHosts can go and create a default child tab
-        // when you create it.)
-        if (childRule != null) {
-            childRule.onCreate(newNode, parentNode, insertType);
-        }
-
-        if (parentNode != null) {
-            ((NodeProxy) parentNode).applyPendingChanges();
-        }
-    }
-
-    /**
-     * Set the type of insert currently in progress
-     *
-     * @param insertType the insert type to use for the next operation
-     */
-    public void setInsertType(InsertType insertType) {
-        mInsertType = insertType;
-    }
-
-    /**
-     * Return the type of insert currently in progress
-     *
-     * @return the type of insert currently in progress
-     */
-    public InsertType getInsertType() {
-        return mInsertType;
-    }
-
-    // ---- Deletion ----
-
-    public void callOnRemovingChildren(NodeProxy parentNode,
-            List<INode> children) {
-        if (parentNode != null) {
-            UiViewElementNode parentUiNode = parentNode.getNode();
-            IViewRule parentRule = loadRule(parentUiNode);
-            if (parentRule != null) {
-                try {
-                    parentRule.onRemovingChildren(children, parentNode,
-                            mInsertType == InsertType.MOVE_WITHIN);
-                } catch (Exception e) {
-                    AdtPlugin.log(e, "%s.onDispose() failed: %s",
-                            parentRule.getClass().getSimpleName(),
-                            e.toString());
-                }
-            }
-        }
-    }
-
-    // ---- private ---
-
-    /**
-     * Returns the descriptor for the base View class.
-     * This could be null if the SDK or the given platform target hasn't loaded yet.
-     */
-    private ViewElementDescriptor getBaseViewDescriptor() {
-        Sdk currentSdk = Sdk.getCurrent();
-        if (currentSdk != null) {
-            IAndroidTarget target = currentSdk.getTarget(mProject);
-            if (target != null) {
-                AndroidTargetData data = currentSdk.getTargetData(target);
-                return data.getLayoutDescriptors().getBaseViewDescriptor();
-            }
-        }
-        return null;
-    }
-
-    /**
-     * Clear the Rules cache. Calls onDispose() on each rule.
-     */
-    private void clearCache() {
-        // The cache can contain multiple times the same rule instance for different
-        // keys (e.g. the UiViewElementNode key vs. the FQCN string key.) So transfer
-        // all values to a unique set.
-        HashSet<IViewRule> rules = new HashSet<IViewRule>(mRulesCache.values());
-
-        mRulesCache.clear();
-
-        for (IViewRule rule : rules) {
-            if (rule != null) {
-                try {
-                    rule.onDispose();
-                } catch (Exception e) {
-                    AdtPlugin.log(e, "%s.onDispose() failed: %s",
-                            rule.getClass().getSimpleName(),
-                            e.toString());
-                }
-            }
-        }
-    }
-
-    /**
-     * Checks whether the project class loader has changed, and if so
-     * unregisters any view rules that use classes from the old class loader. It
-     * then returns the class loader to be used.
-     */
-    private ClassLoader updateClassLoader() {
-        ClassLoader classLoader = mRuleLoader.getClassLoader();
-        if (mUserClassLoader != null && classLoader != mUserClassLoader) {
-            // We have to unload all the IViewRules from the old class
-            List<Object> dispose = new ArrayList<Object>();
-            for (Map.Entry<Object, IViewRule> entry : mRulesCache.entrySet()) {
-                IViewRule rule = entry.getValue();
-                if (rule.getClass().getClassLoader() == mUserClassLoader) {
-                    dispose.add(entry.getKey());
-                }
-            }
-            for (Object object : dispose) {
-                mRulesCache.remove(object);
-            }
-        }
-
-        mUserClassLoader = classLoader;
-        return mUserClassLoader;
-    }
-
-    /**
-     * Load a rule using its descriptor. This will try to first load the rule using its
-     * actual FQCN and if that fails will find the first parent that works in the view
-     * hierarchy.
-     */
-    private IViewRule loadRule(UiViewElementNode element) {
-        if (element == null) {
-            return null;
-        }
-
-        String targetFqcn = null;
-        ViewElementDescriptor targetDesc = null;
-
-        ElementDescriptor d = element.getDescriptor();
-        if (d instanceof ViewElementDescriptor) {
-            targetDesc = (ViewElementDescriptor) d;
-        }
-        if (d == null || !(d instanceof ViewElementDescriptor)) {
-            // This should not happen. All views should have some kind of *view* element
-            // descriptor. Maybe the project is not complete and doesn't build or something.
-            // In this case, we'll use the descriptor of the base android View class.
-            targetDesc = getBaseViewDescriptor();
-        }
-
-        // Check whether any of the custom view .jar files have changed and if so
-        // unregister previously cached view rules to force a new view rule to be loaded.
-        updateClassLoader();
-
-        // Return the rule if we find it in the cache, even if it was stored as null
-        // (which means we didn't find it earlier, so don't look for it again)
-        IViewRule rule = mRulesCache.get(targetDesc);
-        if (rule != null || mRulesCache.containsKey(targetDesc)) {
-            return rule;
-        }
-
-        // Get the descriptor and loop through the super class hierarchy
-        for (ViewElementDescriptor desc = targetDesc;
-                desc != null;
-                desc = desc.getSuperClassDesc()) {
-
-            // Get the FQCN of this View
-            String fqcn = desc.getFullClassName();
-            if (fqcn == null) {
-                // Shouldn't be happening.
-                return null;
-            }
-
-            // The first time we keep the FQCN around as it's the target class we were
-            // initially trying to load. After, as we move through the hierarchy, the
-            // target FQCN remains constant.
-            if (targetFqcn == null) {
-                targetFqcn = fqcn;
-            }
-
-            if (fqcn.indexOf('.') == -1) {
-                // Deal with unknown descriptors; these lack the full qualified path and
-                // elements in the layout without a package are taken to be in the
-                // android.widget package.
-                fqcn = ANDROID_WIDGET_PREFIX + fqcn;
-            }
-
-            // Try to find a rule matching the "real" FQCN. If we find it, we're done.
-            // If not, the for loop will move to the parent descriptor.
-            rule = loadRule(fqcn, targetFqcn);
-            if (rule != null) {
-                // We found one.
-                // As a side effect, loadRule() also cached the rule using the target FQCN.
-                return rule;
-            }
-        }
-
-        // Memorize in the cache that we couldn't find a rule for this descriptor
-        mRulesCache.put(targetDesc, null);
-        return null;
-    }
-
-    /**
-     * Try to load a rule given a specific FQCN. This looks for an exact match in either
-     * the ADT scripts or the project scripts and does not look at parent hierarchy.
-     * <p/>
-     * Once a rule is found (or not), it is stored in a cache using its target FQCN
-     * so we don't try to reload it.
-     * <p/>
-     * The real FQCN is the actual rule class we're loading, e.g. "android.view.View"
-     * where target FQCN is the class we were initially looking for, which might be the same as
-     * the real FQCN or might be a derived class, e.g. "android.widget.TextView".
-     *
-     * @param realFqcn The FQCN of the rule class actually being loaded.
-     * @param targetFqcn The FQCN of the class actually processed, which might be different from
-     *          the FQCN of the rule being loaded.
-     */
-    IViewRule loadRule(String realFqcn, String targetFqcn) {
-        if (realFqcn == null || targetFqcn == null) {
-            return null;
-        }
-
-        // Return the rule if we find it in the cache, even if it was stored as null
-        // (which means we didn't find it earlier, so don't look for it again)
-        IViewRule rule = mRulesCache.get(realFqcn);
-        if (rule != null || mRulesCache.containsKey(realFqcn)) {
-            return rule;
-        }
-
-        // Look for class via reflection
-        try {
-            // For now, we package view rules for the builtin Android views and
-            // widgets with the tool in a special package, so look there rather
-            // than in the same package as the widgets.
-            String ruleClassName;
-            ClassLoader classLoader;
-            if (realFqcn.startsWith("android.") || //$NON-NLS-1$
-                    realFqcn.equals(VIEW_MERGE) ||
-                    realFqcn.endsWith(".GridLayout") || //$NON-NLS-1$ // Temporary special case
-                    // FIXME: Remove this special case as soon as we pull
-                    // the MapViewRule out of this code base and bundle it
-                    // with the add ons
-                    realFqcn.startsWith("com.google.android.maps.")) { //$NON-NLS-1$
-                // This doesn't handle a case where there are name conflicts
-                // (e.g. where there are multiple different views with the same
-                // class name and only differing in package names, but that's a
-                // really bad practice in the first place, and if that situation
-                // should come up in the API we can enhance this algorithm.
-                String packageName = ViewRule.class.getName();
-                packageName = packageName.substring(0, packageName.lastIndexOf('.'));
-                classLoader = RulesEngine.class.getClassLoader();
-                int dotIndex = realFqcn.lastIndexOf('.');
-                String baseName = realFqcn.substring(dotIndex+1);
-                // Capitalize rule class name to match naming conventions, if necessary (<merge>)
-                if (Character.isLowerCase(baseName.charAt(0))) {
-                    if (baseName.equals(VIEW_TAG)) {
-                        // Hack: ViewRule is generic for the "View" class, so we can't use it
-                        // for the special XML "view" tag (lowercase); instead, the rule is
-                        // named "ViewTagRule" instead.
-                        baseName = "ViewTag"; //$NON-NLS-1$
-                    }
-                    baseName = Character.toUpperCase(baseName.charAt(0)) + baseName.substring(1);
-                }
-                ruleClassName = packageName + "." + //$NON-NLS-1$
-                    baseName + "Rule"; //$NON-NLS-1$
-            } else {
-                // Initialize the user-classpath for 3rd party IViewRules, if necessary
-                classLoader = updateClassLoader();
-                if (classLoader == null) {
-                    // The mUserClassLoader can be null; this is the typical scenario,
-                    // when the user is only using builtin layout rules.
-                    // This means however we can't resolve this fqcn since it's not
-                    // in the name space of the builtin rules.
-                    mRulesCache.put(realFqcn, null);
-                    return null;
-                }
-
-                // For other (3rd party) widgets, look in the same package (though most
-                // likely not in the same jar!)
-                ruleClassName = realFqcn + "Rule"; //$NON-NLS-1$
-            }
-
-            Class<?> clz = Class.forName(ruleClassName, true, classLoader);
-            rule = (IViewRule) clz.newInstance();
-            return initializeRule(rule, targetFqcn);
-        } catch (ClassNotFoundException ex) {
-            // Not an unexpected error - this means that there isn't a helper for this
-            // class.
-        } catch (InstantiationException e) {
-            // This is NOT an expected error: fail.
-            AdtPlugin.log(e, "load rule error (%s): %s", realFqcn, e.toString());
-        } catch (IllegalAccessException e) {
-            // This is NOT an expected error: fail.
-            AdtPlugin.log(e, "load rule error (%s): %s", realFqcn, e.toString());
-        }
-
-        // Memorize in the cache that we couldn't find a rule for this real FQCN
-        mRulesCache.put(realFqcn, null);
-        return null;
-    }
-
-    /**
-     * Initialize a rule we just loaded. The rule has a chance to examine the target FQCN
-     * and bail out.
-     * <p/>
-     * Contract: the rule is not in the {@link #mRulesCache} yet and this method will
-     * cache it using the target FQCN if the rule is accepted.
-     * <p/>
-     * The real FQCN is the actual rule class we're loading, e.g. "android.view.View"
-     * where target FQCN is the class we were initially looking for, which might be the same as
-     * the real FQCN or might be a derived class, e.g. "android.widget.TextView".
-     *
-     * @param rule A rule freshly loaded.
-     * @param targetFqcn The FQCN of the class actually processed, which might be different from
-     *          the FQCN of the rule being loaded.
-     * @return The rule if accepted, or null if the rule can't handle that FQCN.
-     */
-    private IViewRule initializeRule(IViewRule rule, String targetFqcn) {
-
-        try {
-            if (rule.onInitialize(targetFqcn, new ClientRulesEngine(this, targetFqcn))) {
-                // Add it to the cache and return it
-                mRulesCache.put(targetFqcn, rule);
-                return rule;
-            } else {
-                rule.onDispose();
-            }
-        } catch (Exception e) {
-            AdtPlugin.log(e, "%s.onInit() failed: %s",
-                    rule.getClass().getSimpleName(),
-                    e.toString());
-        }
-
-        return null;
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gre/ViewMetadataRepository.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gre/ViewMetadataRepository.java
deleted file mode 100644
index 5f2659e..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gre/ViewMetadataRepository.java
+++ /dev/null
@@ -1,856 +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.eclipse.adt.internal.editors.layout.gre;
-
-import static com.android.SdkConstants.ANDROID_URI;
-import static com.android.SdkConstants.ATTR_ID;
-import static com.android.SdkConstants.FQCN_BUTTON;
-import static com.android.SdkConstants.FQCN_SPINNER;
-import static com.android.SdkConstants.FQCN_TOGGLE_BUTTON;
-import static com.android.SdkConstants.ID_PREFIX;
-import static com.android.SdkConstants.NEW_ID_PREFIX;
-import static com.android.SdkConstants.VIEW_FRAGMENT;
-import static com.android.SdkConstants.VIEW_INCLUDE;
-
-import com.android.annotations.VisibleForTesting;
-import com.android.ide.common.api.IViewMetadata.FillPreference;
-import com.android.ide.common.api.Margins;
-import com.android.ide.common.api.ResizePolicy;
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.ide.eclipse.adt.internal.editors.IconFactory;
-import com.android.ide.eclipse.adt.internal.editors.layout.descriptors.LayoutDescriptors;
-import com.android.ide.eclipse.adt.internal.editors.layout.descriptors.ViewElementDescriptor;
-import com.android.ide.eclipse.adt.internal.sdk.AndroidTargetData;
-import com.android.resources.Density;
-import com.android.utils.Pair;
-import com.google.common.base.Splitter;
-import com.google.common.io.Closeables;
-
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-import org.xml.sax.InputSource;
-
-import java.io.BufferedInputStream;
-import java.io.InputStream;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-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.Set;
-
-import javax.xml.parsers.DocumentBuilder;
-import javax.xml.parsers.DocumentBuilderFactory;
-
-/**
- * The {@link ViewMetadataRepository} contains additional metadata for Android view
- * classes
- */
-public class ViewMetadataRepository {
-    private static final String PREVIEW_CONFIG_FILENAME = "rendering-configs.xml";  //$NON-NLS-1$
-    private static final String METADATA_FILENAME = "extra-view-metadata.xml";  //$NON-NLS-1$
-
-    /** Singleton instance */
-    private static ViewMetadataRepository sInstance = new ViewMetadataRepository();
-
-    /**
-     * Returns the singleton instance
-     *
-     * @return the {@link ViewMetadataRepository}
-     */
-    public static ViewMetadataRepository get() {
-        return sInstance;
-    }
-
-    /**
-     * Ever increasing counter used to assign natural ordering numbers to views and
-     * categories
-     */
-    private static int sNextOrdinal = 0;
-
-    /**
-     * List of categories (which contain views); constructed lazily so use
-     * {@link #getCategories()}
-     */
-    private List<CategoryData> mCategories;
-
-    /**
-     * Map from class names to view data objects; constructed lazily so use
-     * {@link #getClassToView}
-     */
-    private Map<String, ViewData> mClassToView;
-
-    /** Hidden constructor: Create via factory {@link #get()} instead */
-    private ViewMetadataRepository() {
-    }
-
-    /** Returns a map from class fully qualified names to {@link ViewData} objects */
-    private Map<String, ViewData> getClassToView() {
-        if (mClassToView == null) {
-            int initialSize = 75;
-            mClassToView = new HashMap<String, ViewData>(initialSize);
-            List<CategoryData> categories = getCategories();
-            for (CategoryData category : categories) {
-                for (ViewData view : category) {
-                    mClassToView.put(view.getFcqn(), view);
-                }
-            }
-            assert mClassToView.size() <= initialSize;
-        }
-
-        return mClassToView;
-    }
-
-    /**
-     * Returns an XML document containing rendering configurations for the various Android
-     * views. The FQN of each view can be obtained via the
-     * {@link #getFullClassName(Element)} method
-     *
-     * @return an XML document containing rendering elements
-     */
-    public Document getRenderingConfigDoc() {
-        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
-        Class<ViewMetadataRepository> clz = ViewMetadataRepository.class;
-        InputStream paletteStream = clz.getResourceAsStream(PREVIEW_CONFIG_FILENAME);
-        InputSource is = new InputSource(paletteStream);
-        try {
-            factory.setNamespaceAware(true);
-            factory.setValidating(false);
-            factory.setIgnoringComments(true);
-            DocumentBuilder builder = factory.newDocumentBuilder();
-            return builder.parse(is);
-        } catch (Exception e) {
-            AdtPlugin.log(e, "Parsing palette file failed");
-            return null;
-        } finally {
-            Closeables.closeQuietly(paletteStream);
-        }
-    }
-
-    /**
-     * Returns a fully qualified class name for an element in the rendering document
-     * returned by {@link #getRenderingConfigDoc()}
-     *
-     * @param element the element to look up the fqcn for
-     * @return the fqcn of the view the element represents a preview for
-     */
-    public String getFullClassName(Element element) {
-        // We don't use the element tag name, because in some cases we have
-        // an outer element to render some interesting inner element, such as a tab widget
-        // (which must be rendered inside a tab host).
-        //
-        // Therefore, we instead use the convention that the id is the fully qualified
-        // class name, with .'s replaced with _'s.
-
-        // Special case: for tab host we aren't allowed to mess with the id
-        String id = element.getAttributeNS(ANDROID_URI, ATTR_ID);
-
-        if ("@android:id/tabhost".equals(id)) {
-            // Special case to distinguish TabHost and TabWidget
-            NodeList children = element.getChildNodes();
-            if (children.getLength() > 1 && (children.item(1) instanceof Element)) {
-                Element child = (Element) children.item(1);
-                String childId = child.getAttributeNS(ANDROID_URI, ATTR_ID);
-                if ("@+id/android_widget_TabWidget".equals(childId)) {
-                    return "android.widget.TabWidget"; // TODO: Tab widget!
-                }
-            }
-            return "android.widget.TabHost"; // TODO: Tab widget!
-        }
-
-        StringBuilder sb = new StringBuilder();
-        int i = 0;
-        if (id.startsWith(NEW_ID_PREFIX)) {
-            i = NEW_ID_PREFIX.length();
-        } else if (id.startsWith(ID_PREFIX)) {
-            i = ID_PREFIX.length();
-        }
-
-        for (; i < id.length(); i++) {
-            char c = id.charAt(i);
-            if (c == '_') {
-                sb.append('.');
-            } else {
-                sb.append(c);
-            }
-        }
-
-        return sb.toString();
-    }
-
-    /** Returns an ordered list of categories and views, parsed from a metadata file */
-    @SuppressWarnings("resource") // streams passed to parser InputSource closed by parser
-    private List<CategoryData> getCategories() {
-        if (mCategories == null) {
-            mCategories = new ArrayList<CategoryData>();
-
-            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
-            Class<ViewMetadataRepository> clz = ViewMetadataRepository.class;
-            InputStream inputStream = clz.getResourceAsStream(METADATA_FILENAME);
-            InputSource is = new InputSource(new BufferedInputStream(inputStream));
-            try {
-                factory.setNamespaceAware(true);
-                factory.setValidating(false);
-                factory.setIgnoringComments(true);
-                DocumentBuilder builder = factory.newDocumentBuilder();
-                Document document = builder.parse(is);
-                Map<String, FillPreference> fillTypes = new HashMap<String, FillPreference>();
-                for (FillPreference pref : FillPreference.values()) {
-                    fillTypes.put(pref.toString().toLowerCase(Locale.US), pref);
-                }
-
-                NodeList categoryNodes = document.getDocumentElement().getChildNodes();
-                for (int i = 0, n = categoryNodes.getLength(); i < n; i++) {
-                    Node node = categoryNodes.item(i);
-                    if (node.getNodeType() == Node.ELEMENT_NODE) {
-                        Element element = (Element) node;
-                        if (element.getNodeName().equals("category")) { //$NON-NLS-1$
-                            String name = element.getAttribute("name"); //$NON-NLS-1$
-                            CategoryData category = new CategoryData(name);
-                            NodeList children = element.getChildNodes();
-                            for (int j = 0, m = children.getLength(); j < m; j++) {
-                                Node childNode = children.item(j);
-                                if (childNode.getNodeType() == Node.ELEMENT_NODE) {
-                                    Element child = (Element) childNode;
-                                    ViewData view = createViewData(fillTypes, child,
-                                            null, FillPreference.NONE, RenderMode.NORMAL, null);
-                                    category.addView(view);
-                                }
-                            }
-                            mCategories.add(category);
-                        }
-                    }
-                }
-            } catch (Exception e) {
-                AdtPlugin.log(e, "Invalid palette metadata"); //$NON-NLS-1$
-            }
-        }
-
-        return mCategories;
-    }
-
-    private ViewData createViewData(Map<String, FillPreference> fillTypes,
-            Element child, String defaultFqcn, FillPreference defaultFill,
-            RenderMode defaultRender, String defaultSize) {
-        String fqcn = child.getAttribute("class"); //$NON-NLS-1$
-        if (fqcn.length() == 0) {
-            fqcn = defaultFqcn;
-        }
-        String fill = child.getAttribute("fill"); //$NON-NLS-1$
-        FillPreference fillPreference = null;
-        if (fill.length() > 0) {
-            fillPreference = fillTypes.get(fill);
-        }
-        if (fillPreference == null) {
-            fillPreference = defaultFill;
-        }
-        String skip = child.getAttribute("skip"); //$NON-NLS-1$
-        RenderMode renderMode = defaultRender;
-        String render = child.getAttribute("render"); //$NON-NLS-1$
-        if (render.length() > 0) {
-            renderMode = RenderMode.get(render);
-        }
-        String displayName = child.getAttribute("name"); //$NON-NLS-1$
-        if (displayName.length() == 0) {
-            displayName = null;
-        }
-
-        String relatedTo = child.getAttribute("relatedTo"); //$NON-NLS-1$
-        String topAttrs = child.getAttribute("topAttrs"); //$NON-NLS-1$
-        String resize = child.getAttribute("resize"); //$NON-NLS-1$
-        ViewData view = new ViewData(fqcn, displayName, fillPreference,
-                skip.length() == 0 ? false : Boolean.valueOf(skip),
-                renderMode, relatedTo, resize, topAttrs);
-
-        String init = child.getAttribute("init"); //$NON-NLS-1$
-        String icon = child.getAttribute("icon"); //$NON-NLS-1$
-
-        view.setInitString(init);
-        if (icon.length() > 0) {
-            view.setIconName(icon);
-        }
-
-        // Nested variations?
-        if (child.hasChildNodes()) {
-            // Palette variations
-            NodeList childNodes = child.getChildNodes();
-            for (int k = 0, kl = childNodes.getLength(); k < kl; k++) {
-                Node variationNode = childNodes.item(k);
-                if (variationNode.getNodeType() == Node.ELEMENT_NODE) {
-                    Element variation = (Element) variationNode;
-                    ViewData variationView = createViewData(fillTypes, variation,
-                            fqcn, fillPreference, renderMode, resize);
-                    view.addVariation(variationView);
-                }
-            }
-        }
-
-        return view;
-    }
-
-    /**
-     * Computes the palette entries for the given {@link AndroidTargetData}, looking up the
-     * available node descriptors, categorizing and sorting them.
-     *
-     * @param targetData the target data for which to compute palette entries
-     * @param alphabetical if true, sort all items in alphabetical order
-     * @param createCategories if true, organize the items into categories
-     * @return a list of pairs where each pair contains of the category label and an
-     *         ordered list of elements to be included in that category
-     */
-    public List<Pair<String, List<ViewElementDescriptor>>> getPaletteEntries(
-            AndroidTargetData targetData, boolean alphabetical, boolean createCategories) {
-        List<Pair<String, List<ViewElementDescriptor>>> result =
-            new ArrayList<Pair<String, List<ViewElementDescriptor>>>();
-
-        List<List<ViewElementDescriptor>> lists = new ArrayList<List<ViewElementDescriptor>>(2);
-        LayoutDescriptors layoutDescriptors = targetData.getLayoutDescriptors();
-        lists.add(layoutDescriptors.getViewDescriptors());
-        lists.add(layoutDescriptors.getLayoutDescriptors());
-
-        // First record map of FQCN to ViewElementDescriptor such that we can quickly
-        // determine if a particular palette entry is available
-        Map<String, ViewElementDescriptor> fqcnToDescriptor =
-            new HashMap<String, ViewElementDescriptor>();
-        for (List<ViewElementDescriptor> list : lists) {
-            for (ViewElementDescriptor view : list) {
-                String fqcn = view.getFullClassName();
-                if (fqcn == null) {
-                    // <view> and <merge> tags etc
-                    fqcn = view.getUiName();
-                }
-                fqcnToDescriptor.put(fqcn, view);
-            }
-        }
-
-        Set<ViewElementDescriptor> remaining = new HashSet<ViewElementDescriptor>(
-                layoutDescriptors.getViewDescriptors().size()
-                + layoutDescriptors.getLayoutDescriptors().size());
-        remaining.addAll(layoutDescriptors.getViewDescriptors());
-        remaining.addAll(layoutDescriptors.getLayoutDescriptors());
-
-        // Now iterate in palette metadata order over the items in the palette and include
-        // any that also appear as a descriptor
-        List<ViewElementDescriptor> categoryItems = new ArrayList<ViewElementDescriptor>();
-        for (CategoryData category : getCategories()) {
-            if (createCategories) {
-                categoryItems = new ArrayList<ViewElementDescriptor>();
-            }
-            for (ViewData view : category) {
-                String fqcn = view.getFcqn();
-                ViewElementDescriptor descriptor = fqcnToDescriptor.get(fqcn);
-                if (descriptor != null) {
-                    remaining.remove(descriptor);
-                    if (view.getSkip()) {
-                        continue;
-                    }
-
-                    if (view.getDisplayName() != null || view.getInitString().length() > 0) {
-                        categoryItems.add(new PaletteMetadataDescriptor(descriptor,
-                                view.getDisplayName(), view.getInitString(), view.getIconName()));
-                    } else {
-                        categoryItems.add(descriptor);
-                    }
-
-                    if (view.hasVariations()) {
-                        for (ViewData variation : view.getVariations()) {
-                            String init = variation.getInitString();
-                            String icon = variation.getIconName();
-                            ViewElementDescriptor desc = new PaletteMetadataDescriptor(descriptor,
-                                    variation.getDisplayName(), init, icon);
-                            categoryItems.add(desc);
-                        }
-                    }
-                }
-            }
-
-            if (createCategories && categoryItems.size() > 0) {
-                if (alphabetical) {
-                    Collections.sort(categoryItems);
-                }
-                result.add(Pair.of(category.getName(), categoryItems));
-            }
-        }
-
-        if (remaining.size() > 0) {
-            List<ViewElementDescriptor> otherItems =
-                    new ArrayList<ViewElementDescriptor>(remaining);
-            // Always sorted, we don't have a natural order for these unknowns
-            Collections.sort(otherItems);
-            if (createCategories) {
-                result.add(Pair.of("Other", otherItems));
-            } else {
-                categoryItems.addAll(otherItems);
-            }
-        }
-
-        if (!createCategories) {
-            if (alphabetical) {
-                Collections.sort(categoryItems);
-            }
-            result.add(Pair.of("Views", categoryItems));
-        }
-
-        return result;
-    }
-
-    @VisibleForTesting
-    Collection<String> getAllFqcns() {
-        return getClassToView().keySet();
-    }
-
-    /**
-     * Metadata holder for a particular category - contains the name of the category, its
-     * ordinal (for natural/logical sorting order) and views contained in the category
-     */
-    private static class CategoryData implements Iterable<ViewData>, Comparable<CategoryData> {
-        /** Category name */
-        private final String mName;
-        /** Views included in this category */
-        private final List<ViewData> mViews = new ArrayList<ViewData>();
-        /** Natural ordering rank */
-        private final int mOrdinal = sNextOrdinal++;
-
-        /** Constructs a new category with the given name */
-        private CategoryData(String name) {
-            super();
-            mName = name;
-        }
-
-        /** Adds a new view into this category */
-        private void addView(ViewData view) {
-            mViews.add(view);
-        }
-
-        private String getName() {
-            return mName;
-        }
-
-        // Implements Iterable<ViewData> such that we can use for-each on the category to
-        // enumerate its views
-        @Override
-        public Iterator<ViewData> iterator() {
-            return mViews.iterator();
-        }
-
-        // Implements Comparable<CategoryData> such that categories can be naturally sorted
-        @Override
-        public int compareTo(CategoryData other) {
-            return mOrdinal - other.mOrdinal;
-        }
-    }
-
-    /** Metadata holder for a view of a given fully qualified class name */
-    private static class ViewData implements Comparable<ViewData> {
-        /** The fully qualified class name of the view */
-        private final String mFqcn;
-        /** Fill preference of the view */
-        private final FillPreference mFillPreference;
-        /** Skip this item in the palette? */
-        private final boolean mSkip;
-        /** Must this item be rendered alone? skipped? etc */
-        private final RenderMode mRenderMode;
-        /** Related views */
-        private final String mRelatedTo;
-        /** The relative rank of the view for natural ordering */
-        private final int mOrdinal = sNextOrdinal++;
-        /** List of optional variations */
-        private List<ViewData> mVariations;
-        /** Display name. Can be null. */
-        private String mDisplayName;
-        /**
-         * Optional initialization string - a comma separate set of name/value pairs to
-         * initialize the element with
-         */
-        private String mInitString;
-        /** The name of an icon (known to the {@link IconFactory} to show for this view */
-        private String mIconName;
-        /** The resize preference of this view */
-        private String mResize;
-        /** The most commonly set attributes of this view */
-        private String mTopAttrs;
-
-        /** Constructs a new view data for the given class */
-        private ViewData(String fqcn, String displayName,
-                FillPreference fillPreference, boolean skip, RenderMode renderMode,
-                String relatedTo, String resize, String topAttrs) {
-            super();
-            mFqcn = fqcn;
-            mDisplayName = displayName;
-            mFillPreference = fillPreference;
-            mSkip = skip;
-            mRenderMode = renderMode;
-            mRelatedTo = relatedTo;
-            mResize = resize;
-            mTopAttrs = topAttrs;
-        }
-
-        /** Returns the {@link FillPreference} for views of this type */
-        private FillPreference getFillPreference() {
-            return mFillPreference;
-        }
-
-        /** Fully qualified class name of views of this type */
-        private String getFcqn() {
-            return mFqcn;
-        }
-
-        private String getDisplayName() {
-            return mDisplayName;
-        }
-
-        private String getResize() {
-            return mResize;
-        }
-
-        // Implements Comparable<ViewData> such that views can be sorted naturally
-        @Override
-        public int compareTo(ViewData other) {
-            return mOrdinal - other.mOrdinal;
-        }
-
-        public RenderMode getRenderMode() {
-            return mRenderMode;
-        }
-
-        public boolean getSkip() {
-            return mSkip;
-        }
-
-        public List<String> getRelatedTo() {
-            if (mRelatedTo == null || mRelatedTo.length() == 0) {
-                return Collections.emptyList();
-            } else {
-                List<String> result = new ArrayList<String>();
-                ViewMetadataRepository repository = ViewMetadataRepository.get();
-                Map<String, ViewData> classToView = repository.getClassToView();
-
-                List<String> fqns = new ArrayList<String>(classToView.keySet());
-                for (String basename : Splitter.on(',').split(mRelatedTo)) {
-                    boolean found = false;
-                    for (String fqcn : fqns) {
-                        String suffix = '.' + basename;
-                        if (fqcn.endsWith(suffix)) {
-                            result.add(fqcn);
-                            found = true;
-                            break;
-                        }
-                    }
-                    if (basename.equals(VIEW_FRAGMENT) || basename.equals(VIEW_INCLUDE)) {
-                        result.add(basename);
-                    } else {
-                        assert found : basename;
-                    }
-                }
-
-                return result;
-            }
-        }
-
-        public List<String> getTopAttributes() {
-            // "id" is a top attribute for all views, so it is not included in the XML, we just
-            // add it in dynamically here
-            if (mTopAttrs == null || mTopAttrs.length() == 0) {
-                return Collections.singletonList(ATTR_ID);
-            } else {
-                String[] split = mTopAttrs.split(","); //$NON-NLS-1$
-                List<String> topAttributes = new ArrayList<String>(split.length + 1);
-                topAttributes.add(ATTR_ID);
-                for (int i = 0, n = split.length; i < n; i++) {
-                    topAttributes.add(split[i]);
-                }
-                return Collections.<String>unmodifiableList(topAttributes);
-            }
-        }
-
-        void addVariation(ViewData variation) {
-            if (mVariations == null) {
-                mVariations = new ArrayList<ViewData>(4);
-            }
-            mVariations.add(variation);
-        }
-
-        List<ViewData> getVariations() {
-            return mVariations;
-        }
-
-        boolean hasVariations() {
-            return mVariations != null && mVariations.size() > 0;
-        }
-
-        private void setInitString(String initString) {
-            this.mInitString = initString;
-        }
-
-        private String getInitString() {
-            return mInitString;
-        }
-
-        private void setIconName(String iconName) {
-            this.mIconName = iconName;
-        }
-
-        private String getIconName() {
-            return mIconName;
-        }
-    }
-
-    /**
-     * Returns the {@link FillPreference} for classes with the given fully qualified class
-     * name
-     *
-     * @param fqcn the fully qualified class name of the view
-     * @return a suitable {@link FillPreference} for the given view type
-     */
-    public FillPreference getFillPreference(String fqcn) {
-        ViewData view = getClassToView().get(fqcn);
-        if (view != null) {
-            return view.getFillPreference();
-        }
-
-        return FillPreference.NONE;
-    }
-
-    /**
-     * Returns the {@link RenderMode} for classes with the given fully qualified class
-     * name
-     *
-     * @param fqcn the fully qualified class name
-     * @return the {@link RenderMode} to use for previews of the given view type
-     */
-    public RenderMode getRenderMode(String fqcn) {
-        ViewData view = getClassToView().get(fqcn);
-        if (view != null) {
-            return view.getRenderMode();
-        }
-
-        return RenderMode.NORMAL;
-    }
-
-    /**
-     * Returns the {@link ResizePolicy} for the given class.
-     *
-     * @param fqcn the fully qualified class name of the target widget
-     * @return the {@link ResizePolicy} for the widget, which will never be null (but may
-     *         be the default of {@link ResizePolicy#full()} if no metadata is found for
-     *         the given widget)
-     */
-    public ResizePolicy getResizePolicy(String fqcn) {
-        ViewData view = getClassToView().get(fqcn);
-        if (view != null) {
-            String resize = view.getResize();
-            if (resize != null && resize.length() > 0) {
-                if ("full".equals(resize)) { //$NON-NLS-1$
-                    return ResizePolicy.full();
-                } else if ("none".equals(resize)) { //$NON-NLS-1$
-                    return ResizePolicy.none();
-                } else if ("horizontal".equals(resize)) { //$NON-NLS-1$
-                    return ResizePolicy.horizontal();
-                } else if ("vertical".equals(resize)) { //$NON-NLS-1$
-                    return ResizePolicy.vertical();
-                } else if ("scaled".equals(resize)) { //$NON-NLS-1$
-                    return ResizePolicy.scaled();
-                } else {
-                    assert false : resize;
-                }
-            }
-        }
-
-        return ResizePolicy.full();
-    }
-
-    /**
-     * Returns true if classes with the given fully qualified class name should be hidden
-     * or skipped from the palette
-     *
-     * @param fqcn the fully qualified class name
-     * @return true if views of the given type should be hidden from the palette
-     */
-    public boolean getSkip(String fqcn) {
-        ViewData view = getClassToView().get(fqcn);
-        if (view != null) {
-            return view.getSkip();
-        }
-
-        return false;
-    }
-
-    /**
-     * Returns a list of the top (most commonly set) attributes of the given
-     * view.
-     *
-     * @param fqcn the fully qualified class name
-     * @return a list, never null but possibly empty, of popular attribute names
-     *         (not including a namespace prefix)
-     */
-    public List<String> getTopAttributes(String fqcn) {
-        ViewData view = getClassToView().get(fqcn);
-        if (view != null) {
-            return view.getTopAttributes();
-        }
-
-        return Collections.singletonList(ATTR_ID);
-    }
-
-    /**
-     * Returns a set of fully qualified names for views that are closely related to the
-     * given view
-     *
-     * @param fqcn the fully qualified class name
-     * @return a list, never null but possibly empty, of views that are related to the
-     *         view of the given type
-     */
-    public List<String> getRelatedTo(String fqcn) {
-        ViewData view = getClassToView().get(fqcn);
-        if (view != null) {
-            return view.getRelatedTo();
-        }
-
-        return Collections.emptyList();
-    }
-
-    /** Render mode for palette preview */
-    public enum RenderMode {
-        /**
-         * Render previews, and it can be rendered as a sibling of many other views in a
-         * big linear layout
-         */
-        NORMAL,
-        /** This view needs to be rendered alone */
-        ALONE,
-        /**
-         * Skip this element; it doesn't work or does not produce any visible artifacts
-         * (such as the basic layouts)
-         */
-        SKIP;
-
-        /**
-         * Returns the {@link RenderMode} for the given render XML attribute
-         * value
-         *
-         * @param render the attribute value in the metadata XML file
-         * @return a corresponding {@link RenderMode}, never null
-         */
-        public static RenderMode get(String render) {
-            if ("alone".equals(render)) {       //$NON-NLS-1$
-                return ALONE;
-            } else if ("skip".equals(render)) { //$NON-NLS-1$
-                return SKIP;
-            } else {
-                return NORMAL;
-            }
-        }
-    }
-
-    /**
-     * Are insets supported yet? This flag indicates whether the {@link #getInsets} method
-     * can return valid data, such that clients can avoid doing any work computing the
-     * current theme or density if there's no chance that valid insets will be returned
-     */
-    public static final boolean INSETS_SUPPORTED = false;
-
-    /**
-     * Returns the insets of widgets with the given fully qualified name, in the given
-     * theme and the given screen density.
-     *
-     * @param fqcn the fully qualified name of the view
-     * @param density the screen density
-     * @param theme the theme name
-     * @return the insets of the visual bounds relative to the view info bounds, or null
-     *         if not known or if there are no insets
-     */
-    public static Margins getInsets(String fqcn, Density density, String theme) {
-        if (INSETS_SUPPORTED) {
-            // Some sample data measured manually for common themes and widgets.
-            if (fqcn.equals(FQCN_BUTTON)) {
-                if (density == Density.HIGH) {
-                    if (theme.startsWith(HOLO_PREFIX)) {
-                        // Theme.Holo, Theme.Holo.Light, WVGA
-                        return new Margins(5, 5, 5, 5);
-                    } else {
-                        // Theme.Light, WVGA
-                        return new Margins(4, 4, 0, 7);
-                    }
-                } else if (density == Density.MEDIUM) {
-                    if (theme.startsWith(HOLO_PREFIX)) {
-                        // Theme.Holo, Theme.Holo.Light, WVGA
-                        return new Margins(3, 3, 3, 3);
-                    } else {
-                        // Theme.Light, HVGA
-                        return new Margins(2, 2, 0, 4);
-                    }
-                } else if (density == Density.LOW) {
-                    if (theme.startsWith(HOLO_PREFIX)) {
-                        // Theme.Holo, Theme.Holo.Light, QVGA
-                        return new Margins(2, 2, 2, 2);
-                    } else {
-                        // Theme.Light, QVGA
-                        return new Margins(1, 3, 0, 4);
-                    }
-                }
-            } else if (fqcn.equals(FQCN_TOGGLE_BUTTON)) {
-                if (density == Density.HIGH) {
-                    if (theme.startsWith(HOLO_PREFIX)) {
-                        // Theme.Holo, Theme.Holo.Light, WVGA
-                        return new Margins(5, 5, 5, 5);
-                    } else {
-                        // Theme.Light, WVGA
-                        return new Margins(2, 2, 0, 5);
-                    }
-                } else if (density == Density.MEDIUM) {
-                    if (theme.startsWith(HOLO_PREFIX)) {
-                        // Theme.Holo, Theme.Holo.Light, WVGA
-                        return new Margins(3, 3, 3, 3);
-                    } else {
-                        // Theme.Light, HVGA
-                        return new Margins(0, 1, 0, 3);
-                    }
-                } else if (density == Density.LOW) {
-                    if (theme.startsWith(HOLO_PREFIX)) {
-                        // Theme.Holo, Theme.Holo.Light, QVGA
-                        return new Margins(2, 2, 2, 2);
-                    } else {
-                        // Theme.Light, QVGA
-                        return new Margins(2, 2, 0, 4);
-                    }
-                }
-            } else if (fqcn.equals(FQCN_SPINNER)) {
-                if (density == Density.HIGH) {
-                    if (!theme.startsWith(HOLO_PREFIX)) {
-                        // Theme.Light, WVGA
-                        return new Margins(3, 4, 2, 8);
-                    } // Doesn't render on Holo!
-                } else if (density == Density.MEDIUM) {
-                    if (!theme.startsWith(HOLO_PREFIX)) {
-                        // Theme.Light, HVGA
-                        return new Margins(1, 1, 0, 4);
-                    }
-                }
-            }
-        }
-
-        return null;
-    }
-
-    private static final String HOLO_PREFIX = "Theme.Holo"; //$NON-NLS-1$
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gre/extra-view-metadata.xml b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gre/extra-view-metadata.xml
deleted file mode 100644
index 6a67b1d..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gre/extra-view-metadata.xml
+++ /dev/null
@@ -1,452 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-    <!--
-        Palette Metadata
-
-        This document provides additional designtime metadata for various Android views, such as
-        logical palette categories (as well as a natural ordering of the views within their
-        categories, fill-preferences (how a view will sets its width and height attributes when
-        dropped into other views), and so on.
-    -->
-<!DOCTYPE metadata [
-<!--- The metadata consists of a series of category definitions -->
-<!ELEMENT metadata (category)*>
-<!--- Each category has a name and contains a list of views in order -->
-<!ELEMENT category (view)*>
-<!ATTLIST category name CDATA #IMPLIED>
-<!--- Each view is identified by its full class name and has various
-      other attributes such as a fill preference  -->
-<!ELEMENT view (view)*>
-<!ATTLIST view
-    class CDATA #IMPLIED
-    name CDATA #IMPLIED
-    init CDATA #IMPLIED
-    icon CDATA #IMPLIED
-    relatedTo CDATA #IMPLIED
-    skip (true|false) "false"
-    render (alone|skip|normal) "normal"
-    fill (none|both|width|height|opposite|width_in_vertical|height_in_horizontal) "none"
-    resize (full|none|horizontal|vertical|scaled) "full"
-    topAttrs CDATA #IMPLIED
->
-]>
-<metadata>
-    <category
-        name="Form Widgets">
-        <view
-            class="android.widget.TextView"
-            topAttrs="text,textAppearance,textColor,textSize"
-            name="TextView"
-            init=""
-            relatedTo="EditText,AutoCompleteTextView,MultiAutoCompleteTextView">
-            <view
-                name="Large Text"
-                init="android:textAppearance=?android:attr/textAppearanceLarge,android:text=Large Text" />
-            <view
-                name="Medium Text"
-                init="android:textAppearance=?android:attr/textAppearanceMedium,android:text=Medium Text" />
-            <view
-                name="Small Text"
-                init="android:textAppearance=?android:attr/textAppearanceSmall,android:text=Small Text" />
-        </view>
-        <view
-            class="android.widget.Button"
-            topAttrs="text,style"
-            name="Button"
-            init=""
-            relatedTo="ImageButton">
-            <view
-                name="Small Button"
-                init="style=?android:attr/buttonStyleSmall,android:text=Button" />
-        </view>
-        <view
-            class="android.widget.ToggleButton"
-            topAttrs="textOff,textOn,style,background"
-            relatedTo="CheckBox" />
-        <view
-            class="android.widget.CheckBox"
-            topAttrs="text"
-            relatedTo="RadioButton,ToggleButton,CheckedTextView" />
-        <view
-            class="android.widget.RadioButton"
-            topAttrs="text,style"
-            relatedTo="CheckBox,ToggleButton" />
-        <view
-            class="android.widget.CheckedTextView"
-            topAttrs="gravity,paddingLeft,paddingRight,checkMark,textAppearance"
-            relatedTo="TextView,CheckBox" />
-        <view
-            class="android.widget.Spinner"
-            topAttrs="prompt,entries,style"
-            relatedTo="EditText"
-            fill="width_in_vertical" />
-        <view
-            class="android.widget.ProgressBar"
-            topAttrs="style,visibility,indeterminate,max"
-            relatedTo="SeekBar"
-            name="ProgressBar (Large)"
-            init="style=?android:attr/progressBarStyleLarge"
-            resize="scaled" >
-            <view
-                name="ProgressBar (Normal)"
-                init=""
-                resize="scaled" />
-            <view
-                name="ProgressBar (Small)"
-                init="style=?android:attr/progressBarStyleSmall"
-                resize="scaled" />
-            <view
-                name="ProgressBar (Horizontal)"
-                init="style=?android:attr/progressBarStyleHorizontal"
-                resize="horizontal" />
-        </view>
-        <view
-            class="android.widget.SeekBar"
-            topAttrs="paddingLeft,paddingRight,progressDrawable,thumb"
-            relatedTo="ProgressBar"
-            resize="horizontal"
-            fill="width_in_vertical" />
-        <view
-            class="android.widget.QuickContactBadge"
-            topAttrs="src,style,gravity"
-            resize="scaled" />
-        <view
-            class="android.widget.RadioGroup"
-            topAttrs="orientation,paddingBottom,paddingTop,style" />
-        <view
-            class="android.widget.RatingBar"
-            topAttrs="numStars,stepSize,style,isIndicator"
-            resize="horizontal" />
-        <view
-            class="android.widget.Switch"
-            topAttrs="text,textOff,textOn,style,checked"
-            relatedTo="CheckBox,ToggleButton"
-            render="alone" />
-    </category>
-    <category
-        name="Text Fields">
-        <view
-            class="android.widget.EditText"
-            topAttrs="hint,inputType,singleLine"
-            name="Plain Text"
-            init=""
-            resize="full"
-            relatedTo="Spinner,TextView,AutoCompleteTextView,MultiAutoCompleteTextView"
-            fill="width_in_vertical">
-            <view
-                name="Person Name"
-                init="android:inputType=textPersonName" />
-            <view
-                name="Password"
-                init="android:inputType=textPassword" />
-            <view
-                name="Password (Numeric)"
-                init="android:inputType=numberPassword" />
-            <view
-                name="E-mail"
-                init="android:inputType=textEmailAddress" />
-            <view
-                name="Phone"
-                init="android:inputType=phone" />
-            <view
-                name="Postal Address"
-                resize="full"
-                init="android:inputType=textPostalAddress" />
-            <view
-                name="Multiline Text"
-                resize="full"
-                init="android:inputType=textMultiLine" />
-            <view
-                name="Time"
-                init="android:inputType=time" />
-            <view
-                name="Date"
-                init="android:inputType=date" />
-            <view
-                name="Number"
-                init="android:inputType=number" />
-            <view
-                name="Number (Signed)"
-                init="android:inputType=numberSigned" />
-            <view
-                name="Number (Decimal)"
-                init="android:inputType=numberDecimal" />
-        </view>
-        <view
-            class="android.widget.AutoCompleteTextView"
-            topAttrs="singleLine,autoText"
-            fill="width_in_vertical" />
-        <view
-            class="android.widget.MultiAutoCompleteTextView"
-            topAttrs="background,hint,imeOptions,inputType,style,textColor"
-            fill="width_in_vertical" />
-    </category>
-    <category
-        name="Layouts">
-        <view
-            class="android.widget.GridLayout"
-            fill="opposite"
-            render="skip" />
-        <view
-            class="android.widget.LinearLayout"
-            topAttrs="orientation,gravity"
-            name="LinearLayout (Vertical)"
-            init="android:orientation=vertical"
-            icon="VerticalLinearLayout"
-            fill="opposite"
-            render="skip">
-            <view
-                name="LinearLayout (Horizontal)" />
-        </view>
-        <view
-            class="android.widget.RelativeLayout"
-            topAttrs="background,orientation,paddingLeft"
-            fill="opposite"
-            render="skip" />
-        <view
-            class="android.widget.FrameLayout"
-            topAttrs="background"
-            fill="opposite"
-            render="skip" />
-        <view
-            class="include"
-            topAttrs="layout"
-            name="Include Other Layout"
-            render="skip"
-            relatedTo="fragment" />
-        <view
-            class="fragment"
-            topAttrs="class,name"
-            name="Fragment"
-            fill="opposite"
-            render="skip"
-            relatedTo="include" />
-        <view
-            class="android.widget.TableLayout"
-            topAttrs="stretchColumns,shrinkColumns,orientation"
-            fill="opposite"
-            render="skip" />
-        <view
-            class="android.widget.TableRow"
-            topAttrs="paddingTop,focusable,gravity,visibility"
-            fill="opposite"
-            resize="vertical"
-            render="skip" />
-        <view
-            class="android.widget.Space"
-            fill="opposite"
-            render="skip" />
-    </category>
-    <category
-        name="Composite">
-        <view
-            class="android.widget.ListView"
-            topAttrs="drawSelectorOnTop,cacheColorHint,divider,background"
-            relatedTo="ExpandableListView"
-            fill="width_in_vertical" />
-        <view
-            class="android.widget.ExpandableListView"
-            topAttrs="drawSelectorOnTop,cacheColorHint,indicatorLeft,indicatorRight,scrollbars,textSize"
-            relatedTo="ListView"
-            fill="width_in_vertical" />
-        <view
-            class="android.widget.GridView"
-            topAttrs="numColumns,verticalSpacing,horizontalSpacing"
-            fill="opposite"
-            render="skip" />
-        <view
-            class="android.widget.ScrollView"
-            topAttrs="fillViewport,orientation,scrollbars"
-            relatedTo="HorizontalScrollView"
-            fill="opposite"
-            render="skip" />
-        <view
-            class="android.widget.HorizontalScrollView"
-            topAttrs="scrollbars,fadingEdgeLength,fadingEdge"
-            relatedTo="ScrollView"
-            render="skip" />
-        <view
-            class="android.widget.SearchView"
-            topAttrs="iconifiedByDefault,queryHint,maxWidth,minWidth,visibility"
-            render="skip" />
-        <view
-            class="android.widget.SlidingDrawer"
-            render="skip"
-            topAttrs="allowSingleTap,bottomOffset,content,handle,topOffset,visibility" />
-        <view
-            class="android.widget.TabHost"
-            topAttrs="paddingTop,background,duplicateParentState,visibility"
-            fill="width_in_vertical"
-            render="alone" />
-        <view
-            class="android.widget.TabWidget"
-            topAttrs="background,paddingLeft,tabStripEnabled,gravity"
-            render="alone" />
-        <view
-            class="android.webkit.WebView"
-            topAttrs="background,visibility,textAppearance"
-            fill="opposite"
-            render="skip" />
-    </category>
-    <category
-        name="Images &amp; Media">
-        <view
-            class="android.widget.ImageView"
-            topAttrs="src,scaleType"
-            resize="scaled"
-            render="skip"
-            relatedTo="ImageButton,VideoView" />
-        <view
-            class="android.widget.ImageButton"
-            topAttrs="src,background,style"
-            resize="scaled"
-            render="skip"
-            relatedTo="Button,ImageView" />
-        <view
-            class="android.widget.Gallery"
-            topAttrs="gravity,spacing,background"
-            fill="width_in_vertical"
-            render="skip" />
-        <view
-            class="android.widget.MediaController"
-            render="skip" />
-        <view
-            class="android.widget.VideoView"
-            relatedTo="ImageView"
-            fill="opposite"
-            render="skip" />
-    </category>
-    <category
-        name="Time &amp; Date">
-        <view
-            class="android.widget.TimePicker"
-            topAttrs="visibility"
-            relatedTo="DatePicker,CalendarView"
-            render="alone" />
-        <view
-            class="android.widget.DatePicker"
-            relatedTo="TimePicker"
-            render="alone" />
-        <view
-            class="android.widget.CalendarView"
-            topAttrs="focusable,focusableInTouchMode,visibility"
-            fill="both"
-            relatedTo="TimePicker,DatePicker" />
-        <view
-            class="android.widget.Chronometer"
-            topAttrs="textSize,gravity,visibility"
-            render="skip" />
-        <view
-            class="android.widget.AnalogClock"
-            topAttrs="dial,hand_hour,hand_minute"
-            relatedTo="DigitalClock" />
-        <view
-            class="android.widget.DigitalClock"
-            relatedTo="AnalogClock" />
-    </category>
-    <category
-        name="Transitions">
-        <view
-            class="android.widget.ImageSwitcher"
-            topAttrs="inAnimation,outAnimation,cropToPadding,padding,scaleType"
-            relatedTo="ViewFlipper,ViewSwitcher,TextSwitcher"
-            render="skip" />
-        <view
-            class="android.widget.AdapterViewFlipper"
-            topAttrs="autoStart,flipInterval,inAnimation,outAnimation"
-            fill="opposite"
-            render="skip" />
-        <view
-            class="android.widget.StackView"
-            topAttrs="loopViews,gravity"
-            fill="opposite"
-            render="skip" />
-        <view
-            class="android.widget.TextSwitcher"
-            relatedTo="ViewFlipper,ImageSwitcher,ViewSwitcher"
-            fill="opposite"
-            render="skip" />
-        <view
-            class="android.widget.ViewAnimator"
-            topAttrs="inAnimation,outAnimation"
-            fill="opposite"
-            render="skip" />
-        <view
-            class="android.widget.ViewFlipper"
-            topAttrs="flipInterval,inAnimation,outAnimation,addStatesFromChildren,measureAllChildren"
-            relatedTo="ViewSwitcher,ImageSwitcher,TextSwitcher"
-            fill="opposite"
-            render="skip" />
-        <view
-            class="android.widget.ViewSwitcher"
-            topAttrs="inAnimation,outAnimation"
-            relatedTo="ViewFlipper,ImageSwitcher,TextSwitcher"
-            fill="opposite"
-            render="skip" />
-    </category>
-    <category
-        name="Advanced">
-        <view
-            class="requestFocus"
-            render="skip" />
-        <view
-            class="android.view.View"
-            topAttrs="background,visibility,style"
-            render="skip" />
-        <view
-            class="android.view.ViewStub"
-            topAttrs="layout,inflatedId,visibility"
-            render="skip" />
-        <view
-            class="view"
-            topAttrs="class"
-            render="skip" />
-        <view
-            class="android.gesture.GestureOverlayView"
-            topAttrs="gestureStrokeType,uncertainGestureColor,eventsInterceptionEnabled,gestureColor,orientation"
-            render="skip" />
-        <view
-            class="android.view.TextureView"
-            render="skip" />
-        <view
-            class="android.view.SurfaceView"
-            render="skip" />
-        <view
-            class="android.widget.NumberPicker"
-            topAttrs="focusable,focusableInTouchMode"
-            relatedTo="TimePicker,DatePicker"
-            render="alone" />
-        <view
-            class="android.widget.ZoomButton"
-            topAttrs="background"
-            relatedTo="Button,ZoomControls" />
-        <view
-            class="android.widget.ZoomControls"
-            topAttrs="style,background,gravity"
-            relatedTo="ZoomButton"
-            resize="none" />
-        <view
-            class="merge"
-            topAttrs="orientation,gravity,style"
-            skip="true"
-            render="skip" />
-        <view
-            class="android.widget.DialerFilter"
-            fill="width_in_vertical"
-            render="skip" />
-        <view
-            class="android.widget.TwoLineListItem"
-            topAttrs="mode,paddingBottom,paddingTop,minHeight,paddingLeft"
-            render="skip" />
-        <view
-            class="android.widget.AbsoluteLayout"
-            topAttrs="background,orientation,paddingBottom,paddingLeft,paddingRight,paddingTop"
-            name="AbsoluteLayout (Deprecated)"
-            fill="opposite"
-            render="skip" />
-    </category>
-    <category
-        name="Other">
-        <!--  This is the catch-all category which contains unknown views if we encounter any -->
-    </category>
-    <!--  TODO: Add-ons? -->
-</metadata>
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gre/rendering-configs.xml b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gre/rendering-configs.xml
deleted file mode 100644
index 96c7fe7..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gre/rendering-configs.xml
+++ /dev/null
@@ -1,382 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-    Default configuration for various views to be rendered
-    TODO: Remove views that don't have custom configuration
-    TODO: Parameterize the custom width (200dip) in the below?
--->
-<LinearLayout
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    android:orientation="vertical">
-    <AnalogClock
-        android:layout_width="wrap_content"
-        android:id="@+id/android_widget_AnalogClock"
-        android:layout_height="75dip">
-    </AnalogClock>
-    <AutoCompleteTextView
-        android:layout_height="wrap_content"
-        android:layout_width="200dip"
-        android:text="AutoComplete"
-        android:id="@+id/android_widget_AutoCompleteTextView">
-    </AutoCompleteTextView>
-    <Button
-        android:text="Button"
-        android:id="@+id/android_widget_Button"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content">
-    </Button>
-    <Button
-        android:text="Small"
-        style="?android:attr/buttonStyleSmall"
-        android:id="@+id/android_widget_SmallButton"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content">
-    </Button>
-    <CheckBox
-        android:layout_height="wrap_content"
-        android:layout_width="wrap_content"
-        android:text="CheckBox"
-        android:id="@+id/android_widget_CheckBox"
-        android:checked="true">
-    </CheckBox>
-    <CheckedTextView
-        android:text="CheckedTextView"
-        android:id="@+id/android_widget_CheckedTextView"
-        android:layout_height="wrap_content"
-        android:layout_width="wrap_content">
-    </CheckedTextView>
-    <!--
-    <Chronometer
-        android:text="Chronometer"
-        android:id="@+id/android_widget_Chronometer"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content">
-    </Chronometer>
-     -->
-    <DigitalClock
-        android:text="DigitalClock"
-        android:id="@+id/android_widget_DigitalClock"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content">
-    </DigitalClock>
-
-    <EditText
-        android:id="@+id/PlainText"
-        android:text="abc"
-        android:layout_width="200dip"
-        android:layout_height="wrap_content">
-    </EditText>
-
-    <EditText
-        android:id="@+id/Password"
-        android:inputType="textPassword"
-        android:text="••••••••"
-        android:layout_width="200dip"
-        android:layout_height="wrap_content">
-    </EditText>
-
-    <!-- android:inputType="numberPassword" not used here to allow digits in preview only -->
-    <EditText
-        android:id="@+id/PasswordNumeric"
-        android:text="1•••2•••3"
-        android:layout_width="200dip"
-        android:layout_height="wrap_content">
-    </EditText>
-
-    <EditText
-        android:id="@+id/PersonName"
-        android:inputType="textPersonName"
-        android:text="Firstname Lastname"
-        android:layout_width="200dip"
-        android:layout_height="wrap_content">
-    </EditText>
-
-    <EditText
-        android:id="@+id/Phone"
-        android:inputType="phone"
-        android:text="(555) 0100"
-        android:layout_width="200dip"
-        android:layout_height="wrap_content">
-    </EditText>
-
-    <EditText
-        android:id="@+id/PostalAddress"
-        android:inputType="textPostalAddress"
-        android:text="Address"
-        android:layout_width="200dip"
-        android:layout_height="100dip">
-    </EditText>
-
-    <EditText
-        android:id="@+id/MultilineText"
-        android:inputType="textMultiLine"
-        android:text="Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor"
-        android:layout_width="200dip"
-        android:layout_height="100dip">
-    </EditText>
-
-    <EditText
-        android:id="@+id/Date"
-        android:inputType="date"
-        android:text="1/1/2011"
-        android:layout_width="200dip"
-        android:layout_height="wrap_content">
-    </EditText>
-
-    <EditText
-        android:id="@+id/Time"
-        android:inputType="time"
-        android:text="12:00am"
-        android:layout_width="200dip"
-        android:layout_height="wrap_content">
-    </EditText>
-
-    <EditText
-        android:id="@+id/Email"
-        android:inputType="textEmailAddress"
-        android:text="user@domain"
-        android:layout_width="200dip"
-        android:layout_height="wrap_content">
-    </EditText>
-
-    <EditText
-        android:id="@+id/Number"
-        android:inputType="number"
-        android:text="42"
-        android:layout_width="200dip"
-        android:layout_height="wrap_content">
-    </EditText>
-
-    <EditText
-        android:id="@+id/NumberSigned"
-        android:inputType="numberSigned"
-        android:text="-42"
-        android:layout_width="200dip"
-        android:layout_height="wrap_content">
-    </EditText>
-
-    <EditText
-        android:id="@+id/NumberDecimal"
-        android:inputType="numberDecimal"
-        android:text="42.0"
-        android:layout_width="200dip"
-        android:layout_height="wrap_content">
-    </EditText>
-
-    <TextView
-        android:text="Large"
-        android:id="@+id/LargeText"
-        android:textAppearance="?android:attr/textAppearanceLarge"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content">
-    </TextView>
-
-    <TextView
-        android:text="Medium"
-        android:id="@+id/MediumText"
-        android:textAppearance="?android:attr/textAppearanceMedium"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content">
-    </TextView>
-
-    <TextView
-        android:text="Small"
-        android:id="@+id/SmallText"
-        android:textAppearance="?android:attr/textAppearanceSmall"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content">
-    </TextView>
-
-    <MultiAutoCompleteTextView
-        android:layout_height="wrap_content"
-        android:layout_width="200dip"
-        android:text="MultiAutoComplete"
-        android:id="@+id/android_widget_MultiAutoCompleteTextView">
-    </MultiAutoCompleteTextView>
-    <ProgressBar
-        android:id="@+id/android_widget_ProgressBarNormal"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content">
-    </ProgressBar>
-    <ProgressBar
-        android:id="@+id/android_widget_ProgressBarHorizontal"
-        android:layout_width="200dip"
-        android:layout_height="wrap_content"
-        android:progress="30"
-        style="?android:attr/progressBarStyleHorizontal">
-    </ProgressBar>
-    <ProgressBar
-        android:id="@+id/android_widget_ProgressBarLarge"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        style="?android:attr/progressBarStyleLarge">
-    </ProgressBar>
-    <ProgressBar
-        android:id="@+id/android_widget_ProgressBarSmall"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        style="?android:attr/progressBarStyleSmall">
-    </ProgressBar>
-    <QuickContactBadge
-        android:layout_height="wrap_content"
-        android:layout_width="wrap_content"
-        android:id="@+id/android_widget_QuickContactBadge">
-    </QuickContactBadge>
-    <RadioButton
-        android:layout_height="wrap_content"
-        android:layout_width="wrap_content"
-        android:id="@+id/android_widget_RadioButton"
-        android:text="RadioButton"
-        android:checked="true">
-    </RadioButton>
-    <RatingBar
-        android:layout_height="wrap_content"
-        android:layout_width="wrap_content"
-        android:id="@+id/android_widget_RatingBar"
-        android:rating="1">
-    </RatingBar>
-    <SeekBar
-        android:layout_height="wrap_content"
-        android:id="@+id/android_widget_SeekBar"
-        android:layout_width="200dip"
-        android:progress="30">
-    </SeekBar>
-    <ListView
-        android:id="@+id/android_widget_ListView"
-        android:layout_width="200dip"
-        android:layout_height="60dip"
-        android:divider="#333333"
-        android:dividerHeight="1px"
-        >
-    </ListView>
-    <ExpandableListView
-        android:id="@+id/android_widget_ExpandableListView"
-        android:layout_width="200dip"
-        android:layout_height="60dip"
-        android:divider="#333333"
-        android:dividerHeight="1px"
-        >
-    </ExpandableListView>
-    <Spinner
-        android:layout_height="wrap_content"
-        android:id="@+id/android_widget_Spinner"
-        android:layout_width="200dip">
-    </Spinner>
-    <TextView
-        android:text="TextView"
-        android:id="@+id/android_widget_TextView"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content">
-    </TextView>
-    <ToggleButton
-        android:layout_height="wrap_content"
-        android:layout_width="wrap_content"
-        android:checked="false"
-        android:id="@+id/android_widget_ToggleButton"
-        android:text="ToggleButton">
-    </ToggleButton>
-    <ZoomButton
-        android:id="@+id/android_widget_ZoomButton"
-        android:layout_height="wrap_content"
-        android:layout_width="wrap_content"
-        android:src="@android:drawable/btn_plus">
-    </ZoomButton>
-    <ZoomControls
-        android:id="@+id/android_widget_ZoomControls"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content">
-    </ZoomControls>
-    <Switch
-        android:id="@+id/android_widget_Switch"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content" />
-    <TimePicker
-        android:id="@+id/android_widget_TimePicker"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content">
-    </TimePicker>
-    <DatePicker
-        android:id="@+id/android_widget_DatePicker"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content">
-    </DatePicker>
-    <CalendarView
-        android:id="@+id/android_widget_CalendarView"
-        android:layout_width="200dip"
-        android:layout_height="200dip">
-    </CalendarView>
-    <RadioGroup
-        android:layout_height="wrap_content"
-        android:layout_width="wrap_content"
-        android:orientation="horizontal"
-        android:id="@+id/android_widget_RadioGroup">
-        <RadioButton
-            android:checked="true">
-        </RadioButton>
-        <RadioButton></RadioButton>
-        <RadioButton></RadioButton>
-    </RadioGroup>
-    <TabHost
-        android:id="@android:id/tabhost"
-        android:layout_width="200dip"
-        android:layout_height="100dip">
-        <LinearLayout
-            android:id="@+id/linearLayout1"
-            android:layout_width="match_parent"
-            android:layout_height="match_parent"
-            android:orientation="vertical">
-            <TabWidget
-                android:layout_width="match_parent"
-                android:layout_height="wrap_content"
-                android:id="@android:id/tabs">
-            </TabWidget>
-            <FrameLayout
-                android:layout_width="match_parent"
-                android:layout_height="match_parent"
-                android:id="@android:id/tabcontent">
-                <LinearLayout
-                    android:layout_width="match_parent"
-                    android:layout_height="match_parent"
-                    android:id="@+id/Tab1">
-                </LinearLayout>
-                <LinearLayout
-                    android:layout_width="match_parent"
-                    android:layout_height="match_parent"
-                    android:id="@+id/Tab2">
-                </LinearLayout>
-                <LinearLayout
-                    android:layout_width="match_parent"
-                    android:layout_height="match_parent"
-                    android:id="@+id/Tab3">
-                </LinearLayout>
-            </FrameLayout>
-        </LinearLayout>
-    </TabHost>
-    <TabHost
-        android:id="@android:id/tabhost"
-        android:layout_width="70dip"
-        android:layout_height="100dip">
-        <LinearLayout
-            android:id="@+id/android_widget_TabWidget"
-            android:layout_width="match_parent"
-            android:layout_height="match_parent"
-            android:orientation="vertical">
-            <TabWidget
-                android:layout_width="match_parent"
-                android:layout_height="wrap_content"
-                android:id="@android:id/tabs">
-            </TabWidget>
-            <FrameLayout
-                android:layout_width="match_parent"
-                android:layout_height="match_parent"
-                android:id="@android:id/tabcontent">
-                <LinearLayout
-                    android:layout_width="match_parent"
-                    android:layout_height="match_parent"
-                    android:id="@+id/Tab1">
-                </LinearLayout>
-            </FrameLayout>
-        </LinearLayout>
-    </TabHost>
-</LinearLayout>
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/properties/BooleanXmlPropertyEditor.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/properties/BooleanXmlPropertyEditor.java
deleted file mode 100644
index d6ff4d5..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/properties/BooleanXmlPropertyEditor.java
+++ /dev/null
@@ -1,118 +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.ide.eclipse.adt.internal.editors.layout.properties;
-
-import static com.android.SdkConstants.VALUE_FALSE;
-import static com.android.SdkConstants.VALUE_TRUE;
-
-import org.eclipse.swt.graphics.GC;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.wb.internal.core.DesignerPlugin;
-import org.eclipse.wb.internal.core.model.property.Property;
-import org.eclipse.wb.internal.core.model.property.table.PropertyTable;
-import org.eclipse.wb.internal.core.utils.ui.DrawUtils;
-
-/**
- * Handle an XML property which represents booleans.
- *
- * Similar to the WindowBuilder PropertyEditor, but operates on Strings rather
- * than Booleans (which means it is a tri-state boolean: true, false, not set)
- */
-public class BooleanXmlPropertyEditor extends XmlPropertyEditor {
-    public static final BooleanXmlPropertyEditor INSTANCE = new BooleanXmlPropertyEditor();
-
-    private static final Image mTrueImage = DesignerPlugin.getImage("properties/true.png");
-    private static final Image mFalseImage = DesignerPlugin.getImage("properties/false.png");
-    private static final Image mNullImage =
-            DesignerPlugin.getImage("properties/BooleanNull.png");
-    private static final Image mUnknownImage =
-            DesignerPlugin.getImage("properties/BooleanUnknown.png");
-
-    private BooleanXmlPropertyEditor() {
-    }
-
-    @Override
-    public void paint(Property property, GC gc, int x, int y, int width, int height)
-            throws Exception {
-        Object value = property.getValue();
-        assert value == null || value instanceof String;
-        if (value == null || value instanceof String) {
-            String text = (String) value;
-            Image image;
-            if (VALUE_TRUE.equals(text)) {
-                image = mTrueImage;
-            } else if (VALUE_FALSE.equals(text)) {
-                image = mFalseImage;
-            } else if (text == null) {
-                image = mNullImage;
-            } else {
-                // Probably something like a reference, e.g. @boolean/foo
-                image = mUnknownImage;
-            }
-
-            // draw image
-            DrawUtils.drawImageCV(gc, image, x, y, height);
-
-            // prepare new position/width
-            int imageWidth = image.getBounds().width + 2;
-            width -= imageWidth;
-
-            // draw text
-            if (text != null) {
-                x += imageWidth;
-                DrawUtils.drawStringCV(gc, text, x, y, width, height);
-            }
-        }
-    }
-
-    @Override
-    public boolean activate(PropertyTable propertyTable, Property property, Point location)
-            throws Exception {
-        // check that user clicked on image
-        if (location == null || location.x < mTrueImage.getBounds().width + 2) {
-            cycleValue(property);
-        }
-        // don't activate
-        return false;
-    }
-
-    @Override
-    public void doubleClick(Property property, Point location) throws Exception {
-        cycleValue(property);
-    }
-
-    /**
-     * Cycles through the values
-     */
-    private void cycleValue(Property property) throws Exception {
-        Object value = property.getValue();
-        if (value == null || value instanceof String) {
-            // Cycle null => true => false => null
-            String text = (String) value;
-            if (VALUE_TRUE.equals(text)) {
-                property.setValue(VALUE_FALSE);
-            } else if (VALUE_FALSE.equals(text)) {
-                property.setValue(null);
-            } else {
-                property.setValue(VALUE_TRUE);
-            }
-        } else {
-            assert false;
-        }
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/properties/EnumXmlPropertyEditor.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/properties/EnumXmlPropertyEditor.java
deleted file mode 100644
index f1a3f2a..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/properties/EnumXmlPropertyEditor.java
+++ /dev/null
@@ -1,77 +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.ide.eclipse.adt.internal.editors.layout.properties;
-
-import com.android.ide.eclipse.adt.internal.editors.descriptors.AttributeDescriptor;
-import com.android.ide.eclipse.adt.internal.editors.descriptors.ListAttributeDescriptor;
-
-import org.eclipse.wb.core.controls.CCombo3;
-import org.eclipse.wb.internal.core.model.property.Property;
-import org.eclipse.wb.internal.core.model.property.editor.AbstractComboPropertyEditor;
-import org.eclipse.wb.internal.core.model.property.editor.ITextValuePropertyEditor;
-
-class EnumXmlPropertyEditor extends AbstractComboPropertyEditor implements
-        ITextValuePropertyEditor {
-    public static final EnumXmlPropertyEditor INSTANCE = new EnumXmlPropertyEditor();
-
-    private EnumXmlPropertyEditor() {
-    }
-
-    @Override
-    protected String getText(Property property) throws Exception {
-        Object value = property.getValue();
-        if (value == null) {
-            return "";
-        } else if (value instanceof String) {
-            return (String) value;
-        } else if (value == Property.UNKNOWN_VALUE) {
-            return "<varies>";
-        } else {
-            return "";
-        }
-    }
-
-    private String[] getItems(Property property) {
-        XmlProperty xmlProperty = (XmlProperty) property;
-        AttributeDescriptor descriptor = xmlProperty.getDescriptor();
-        assert descriptor instanceof ListAttributeDescriptor;
-        ListAttributeDescriptor list = (ListAttributeDescriptor) descriptor;
-        return list.getValues();
-    }
-
-    @Override
-    protected void addItems(Property property, CCombo3 combo) throws Exception {
-        for (String item : getItems(property)) {
-            combo.add(item);
-        }
-    }
-
-    @Override
-    protected void selectItem(Property property, CCombo3 combo) throws Exception {
-        combo.setText(getText(property));
-    }
-
-    @Override
-    protected void toPropertyEx(Property property, CCombo3 combo, int index) throws Exception {
-        property.setValue(getItems(property)[index]);
-    }
-
-    @Override
-    public void setText(Property property, String text) throws Exception {
-        property.setValue(text);
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/properties/FlagXmlPropertyDialog.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/properties/FlagXmlPropertyDialog.java
deleted file mode 100644
index 5e1e702..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/properties/FlagXmlPropertyDialog.java
+++ /dev/null
@@ -1,217 +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.ide.eclipse.adt.internal.editors.layout.properties;
-
-import com.android.annotations.NonNull;
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.google.common.base.Splitter;
-
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.jface.viewers.CheckStateChangedEvent;
-import org.eclipse.jface.viewers.CheckboxTableViewer;
-import org.eclipse.jface.viewers.ICheckStateListener;
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.KeyEvent;
-import org.eclipse.swt.events.KeyListener;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.swt.widgets.TableItem;
-import org.eclipse.wb.internal.core.utils.execution.ExecutionUtils;
-import org.eclipse.wb.internal.core.utils.execution.RunnableEx;
-import org.eclipse.wb.internal.core.utils.ui.dialogs.ResizableDialog;
-
-import java.util.ArrayList;
-import java.util.List;
-
-class FlagXmlPropertyDialog extends ResizableDialog
-implements IStructuredContentProvider, ICheckStateListener, SelectionListener, KeyListener {
-    private final String mTitle;
-    private final XmlProperty mProperty;
-    private final String[] mFlags;
-    private final boolean mIsRadio;
-
-    private Table mTable;
-    private CheckboxTableViewer mViewer;
-
-    FlagXmlPropertyDialog(
-            @NonNull Shell parentShell,
-            @NonNull String title,
-            boolean isRadio,
-            @NonNull String[] flags,
-            @NonNull XmlProperty property) {
-        super(parentShell, AdtPlugin.getDefault());
-        mTitle = title;
-        mIsRadio = isRadio;
-        mFlags = flags;
-        mProperty = property;
-    }
-
-    @Override
-    protected void configureShell(Shell newShell) {
-        super.configureShell(newShell);
-        newShell.setText(mTitle);
-    }
-
-    @Override
-    protected Control createDialogArea(Composite parent) {
-        Composite container = (Composite) super.createDialogArea(parent);
-
-        mViewer = CheckboxTableViewer.newCheckList(container,
-                SWT.BORDER | SWT.FULL_SELECTION | SWT.HIDE_SELECTION);
-        mTable = mViewer.getTable();
-        mTable.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));
-
-        Composite workaround = PropertyFactory.addWorkaround(container);
-        if (workaround != null) {
-            workaround.setLayoutData(new GridData(SWT.LEFT, SWT.TOP, false, false, 1, 1));
-        }
-
-        mViewer.setContentProvider(this);
-        mViewer.setInput(mFlags);
-
-        String current = mProperty.getStringValue();
-        if (current != null) {
-            Object[] checked = null;
-            if (mIsRadio) {
-                checked = new String[] { current };
-            } else {
-                List<String> flags = new ArrayList<String>();
-                for (String s : Splitter.on('|').omitEmptyStrings().trimResults().split(current)) {
-                    flags.add(s);
-                }
-                checked = flags.toArray(new String[flags.size()]);
-            }
-            mViewer.setCheckedElements(checked);
-        }
-        if (mFlags.length > 0) {
-            mTable.setSelection(0);
-        }
-
-        if (mIsRadio) {
-            // Enforce single-item selection
-            mViewer.addCheckStateListener(this);
-        }
-        mTable.addSelectionListener(this);
-        mTable.addKeyListener(this);
-
-        return container;
-    }
-
-    @Override
-    protected void createButtonsForButtonBar(Composite parent) {
-        createButton(parent, IDialogConstants.OK_ID, IDialogConstants.OK_LABEL, true);
-        createButton(parent, IDialogConstants.CANCEL_ID, IDialogConstants.CANCEL_LABEL, false);
-    }
-
-    @Override
-    protected Point getDefaultSize() {
-        return new Point(450, 400);
-    }
-
-    @Override
-    protected void okPressed() {
-        // Apply the value
-        ExecutionUtils.runLog(new RunnableEx() {
-            @Override
-            public void run() throws Exception {
-                StringBuilder sb = new StringBuilder(30);
-                for (Object o : mViewer.getCheckedElements()) {
-                    if (sb.length() > 0) {
-                        sb.append('|');
-                    }
-                    sb.append((String) o);
-                }
-                String value = sb.length() > 0 ? sb.toString() : null;
-                mProperty.setValue(value);
-            }
-        });
-
-        // close dialog
-        super.okPressed();
-    }
-
-    // ---- Implements IStructuredContentProvider ----
-
-    @Override
-    public Object[] getElements(Object inputElement) {
-        return (Object []) inputElement;
-    }
-
-    @Override
-    public void dispose() {
-    }
-
-    @Override
-    public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-    }
-
-    // ---- Implements ICheckStateListener ----
-
-    @Override
-    public void checkStateChanged(CheckStateChangedEvent event) {
-        // Try to disable other elements that conflict with this
-        boolean isChecked = event.getChecked();
-        if (isChecked) {
-            Object selected = event.getElement();
-            for (Object other : mViewer.getCheckedElements()) {
-                if (other != selected) {
-                    mViewer.setChecked(other, false);
-                }
-            }
-        } else {
-
-        }
-    }
-
-    // ---- Implements SelectionListener ----
-
-    @Override
-    public void widgetSelected(SelectionEvent e) {
-    }
-
-    @Override
-    public void widgetDefaultSelected(SelectionEvent e) {
-        if (e.item instanceof TableItem) {
-            TableItem item = (TableItem) e.item;
-            item.setChecked(!item.getChecked());
-        }
-    }
-
-    // ---- Implements KeyListener ----
-
-    @Override
-    public void keyPressed(KeyEvent e) {
-        // Let space toggle checked state
-        if (e.keyCode == ' ' /* SWT.SPACE requires Eclipse 3.7 */) {
-            if (mTable.getSelectionCount() == 1) {
-                TableItem item = mTable.getSelection()[0];
-                item.setChecked(!item.getChecked());
-            }
-        }
-    }
-
-    @Override
-    public void keyReleased(KeyEvent e) {
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/properties/PropertyFactory.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/properties/PropertyFactory.java
deleted file mode 100644
index 2b8cfbf..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/properties/PropertyFactory.java
+++ /dev/null
@@ -1,750 +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.ide.eclipse.adt.internal.editors.layout.properties;
-
-import static com.android.SdkConstants.ATTR_ID;
-import static com.android.SdkConstants.ATTR_LAYOUT_MARGIN;
-import static com.android.SdkConstants.ATTR_LAYOUT_RESOURCE_PREFIX;
-
-import com.android.annotations.Nullable;
-import com.android.ide.common.api.IAttributeInfo;
-import com.android.ide.common.api.IAttributeInfo.Format;
-import com.android.ide.eclipse.adt.internal.editors.descriptors.AttributeDescriptor;
-import com.android.ide.eclipse.adt.internal.editors.descriptors.DescriptorsUtils;
-import com.android.ide.eclipse.adt.internal.editors.descriptors.SeparatorAttributeDescriptor;
-import com.android.ide.eclipse.adt.internal.editors.descriptors.XmlnsAttributeDescriptor;
-import com.android.ide.eclipse.adt.internal.editors.layout.descriptors.ViewElementDescriptor;
-import com.android.ide.eclipse.adt.internal.editors.layout.gle2.CanvasViewInfo;
-import com.android.ide.eclipse.adt.internal.editors.layout.gle2.GraphicalEditorPart;
-import com.android.ide.eclipse.adt.internal.editors.layout.gre.ViewMetadataRepository;
-import com.android.ide.eclipse.adt.internal.editors.layout.uimodel.UiViewElementNode;
-import com.android.tools.lint.detector.api.LintUtils;
-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 org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Link;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.browser.IWebBrowser;
-import org.eclipse.wb.internal.core.editor.structure.property.PropertyListIntersector;
-import org.eclipse.wb.internal.core.model.property.ComplexProperty;
-import org.eclipse.wb.internal.core.model.property.Property;
-import org.eclipse.wb.internal.core.model.property.category.PropertyCategory;
-import org.eclipse.wb.internal.core.model.property.editor.PropertyEditor;
-import org.eclipse.wb.internal.core.model.property.editor.presentation.ButtonPropertyEditorPresentation;
-
-import java.net.URL;
-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 java.util.WeakHashMap;
-
-/**
- * The {@link PropertyFactory} creates (and caches) the set of {@link Property}
- * instances applicable to a given node. It's also responsible for ordering
- * these, and sometimes combining them into {@link ComplexProperty} category
- * nodes.
- * <p>
- * TODO: For any properties that are *set* in XML, they should NOT be labeled as
- * advanced (which would make them disappear)
- */
-public class PropertyFactory {
-    /** Disable cache during development only */
-    @SuppressWarnings("unused")
-    private static final boolean CACHE_ENABLED = true || !LintUtils.assertionsEnabled();
-    static {
-        if (!CACHE_ENABLED) {
-            System.err.println("WARNING: The property cache is disabled");
-        }
-    }
-
-    private static final Property[] NO_PROPERTIES = new Property[0];
-
-    private static final int PRIO_FIRST = -100000;
-    private static final int PRIO_SECOND = PRIO_FIRST + 10;
-    private static final int PRIO_LAST = 100000;
-
-    private final GraphicalEditorPart mGraphicalEditorPart;
-    private Map<UiViewElementNode, Property[]> mCache =
-            new WeakHashMap<UiViewElementNode, Property[]>();
-    private UiViewElementNode mCurrentViewCookie;
-
-    /** Sorting orders for the properties */
-    public enum SortingMode {
-        NATURAL,
-        BY_ORIGIN,
-        ALPHABETICAL;
-    }
-
-    /** The default sorting mode */
-    public static final SortingMode DEFAULT_MODE = SortingMode.BY_ORIGIN;
-
-    private SortingMode mSortMode = DEFAULT_MODE;
-    private SortingMode mCacheSortMode;
-
-    public PropertyFactory(GraphicalEditorPart graphicalEditorPart) {
-        mGraphicalEditorPart = graphicalEditorPart;
-    }
-
-    /**
-     * Get the properties for the given list of selection items.
-     *
-     * @param items the {@link CanvasViewInfo} instances to get an intersected
-     *            property list for
-     * @return the properties for the given items
-     */
-    public Property[] getProperties(List<CanvasViewInfo> items) {
-        mCurrentViewCookie = null;
-
-        if (items == null || items.size() == 0) {
-            return NO_PROPERTIES;
-        } else if (items.size() == 1) {
-            CanvasViewInfo item = items.get(0);
-            mCurrentViewCookie = item.getUiViewNode();
-
-            return getProperties(item);
-        } else {
-            // intersect properties
-            PropertyListIntersector intersector = new PropertyListIntersector();
-            for (CanvasViewInfo node : items) {
-                intersector.intersect(getProperties(node));
-            }
-
-            return intersector.getProperties();
-        }
-    }
-
-    private Property[] getProperties(CanvasViewInfo item) {
-        UiViewElementNode node = item.getUiViewNode();
-        if (node == null) {
-            return NO_PROPERTIES;
-        }
-
-        if (mCacheSortMode != mSortMode) {
-            mCacheSortMode = mSortMode;
-            mCache.clear();
-        }
-
-        Property[] properties = mCache.get(node);
-        if (!CACHE_ENABLED) {
-            properties = null;
-        }
-        if (properties == null) {
-            Collection<? extends Property> propertyList = getProperties(node);
-            if (propertyList == null) {
-                properties = new Property[0];
-            } else {
-                properties = propertyList.toArray(new Property[propertyList.size()]);
-            }
-            mCache.put(node, properties);
-        }
-        return properties;
-    }
-
-
-    protected Collection<? extends Property> getProperties(UiViewElementNode node) {
-        ViewMetadataRepository repository = ViewMetadataRepository.get();
-        ViewElementDescriptor viewDescriptor = (ViewElementDescriptor) node.getDescriptor();
-        String fqcn = viewDescriptor.getFullClassName();
-        Set<String> top = new HashSet<String>(repository.getTopAttributes(fqcn));
-        AttributeDescriptor[] attributeDescriptors = node.getAttributeDescriptors();
-
-        List<XmlProperty> properties = new ArrayList<XmlProperty>(attributeDescriptors.length);
-        int priority = 0;
-        for (final AttributeDescriptor descriptor : attributeDescriptors) {
-            // TODO: Filter out non-public properties!!
-            // (They shouldn't be in the descriptors at all)
-
-            assert !(descriptor instanceof SeparatorAttributeDescriptor); // No longer inserted
-            if (descriptor instanceof XmlnsAttributeDescriptor) {
-                continue;
-            }
-
-            PropertyEditor editor = XmlPropertyEditor.INSTANCE;
-            IAttributeInfo info = descriptor.getAttributeInfo();
-            if (info != null) {
-                EnumSet<Format> formats = info.getFormats();
-                if (formats.contains(Format.BOOLEAN)) {
-                    editor = BooleanXmlPropertyEditor.INSTANCE;
-                } else if (formats.contains(Format.ENUM)) {
-                    // We deliberately don't use EnumXmlPropertyEditor.INSTANCE here,
-                    // since some attributes (such as layout_width) can have not just one
-                    // of the enum values but custom values such as "42dp" as well. And
-                    // furthermore, we don't even bother limiting this to formats.size()==1,
-                    // since the editing experience with the enum property editor is
-                    // more limited than the text editor plus enum completer anyway
-                    // (for example, you can't type to filter the values, and clearing
-                    // the value is harder.)
-                }
-            }
-
-            XmlProperty property = new XmlProperty(editor, this, node, descriptor);
-            // Assign ids sequentially. This ensures that the properties will mostly keep their
-            // relative order (such as placing width before height), even though we will regroup
-            // some (such as properties in the same category, and the layout params etc)
-            priority += 10;
-
-            PropertyCategory category = PropertyCategory.NORMAL;
-            String name = descriptor.getXmlLocalName();
-            if (top.contains(name) || PropertyMetadata.isPreferred(name)) {
-                category = PropertyCategory.PREFERRED;
-                property.setPriority(PRIO_FIRST + priority);
-            } else {
-                property.setPriority(priority);
-
-                // Prefer attributes defined on the specific type of this
-                // widget
-                // NOTE: This doesn't work very well for TextViews
-               /* IAttributeInfo attributeInfo = descriptor.getAttributeInfo();
-                if (attributeInfo != null && fqcn.equals(attributeInfo.getDefinedBy())) {
-                    category = PropertyCategory.PREFERRED;
-                } else*/ if (PropertyMetadata.isAdvanced(name)) {
-                    category = PropertyCategory.ADVANCED;
-                }
-            }
-            if (category != null) {
-                property.setCategory(category);
-            }
-            properties.add(property);
-        }
-
-        switch (mSortMode) {
-            case BY_ORIGIN:
-                return sortByOrigin(node, properties);
-
-            case ALPHABETICAL:
-                return sortAlphabetically(node, properties);
-
-            default:
-            case NATURAL:
-                return sortNatural(node, properties);
-        }
-    }
-
-    protected Collection<? extends Property> sortAlphabetically(
-            UiViewElementNode node,
-            List<XmlProperty> properties) {
-        Collections.sort(properties, Property.ALPHABETICAL);
-        return properties;
-    }
-
-    protected Collection<? extends Property> sortByOrigin(
-            UiViewElementNode node,
-            List<XmlProperty> properties) {
-        List<Property> collapsed = new ArrayList<Property>(properties.size());
-        List<Property> layoutProperties = Lists.newArrayListWithExpectedSize(20);
-        List<Property> marginProperties = null;
-        List<Property> deprecatedProperties = null;
-        Map<String, ComplexProperty> categoryToProperty = new HashMap<String, ComplexProperty>();
-        Multimap<String, Property> categoryToProperties = ArrayListMultimap.create();
-
-        if (properties.isEmpty()) {
-            return properties;
-        }
-
-        ViewElementDescriptor parent = (ViewElementDescriptor) properties.get(0).getDescriptor()
-                .getParent();
-        Map<String, Integer> categoryPriorities = Maps.newHashMap();
-        int nextCategoryPriority = 100;
-        while (parent != null) {
-            categoryPriorities.put(parent.getFullClassName(), nextCategoryPriority += 100);
-            parent = parent.getSuperClassDesc();
-        }
-
-        for (int i = 0, max = properties.size(); i < max; i++) {
-            XmlProperty property = properties.get(i);
-
-            AttributeDescriptor descriptor = property.getDescriptor();
-            if (descriptor.isDeprecated()) {
-                if (deprecatedProperties == null) {
-                    deprecatedProperties = Lists.newArrayListWithExpectedSize(10);
-                }
-                deprecatedProperties.add(property);
-                continue;
-            }
-
-            String firstName = descriptor.getXmlLocalName();
-            if (firstName.startsWith(ATTR_LAYOUT_RESOURCE_PREFIX)) {
-                if (firstName.startsWith(ATTR_LAYOUT_MARGIN)) {
-                    if (marginProperties == null) {
-                        marginProperties = Lists.newArrayListWithExpectedSize(5);
-                    }
-                    marginProperties.add(property);
-                } else {
-                    layoutProperties.add(property);
-                }
-                continue;
-            }
-
-            if (firstName.equals(ATTR_ID)) {
-                // Add id to the front (though the layout parameters will be added to
-                // the front of this at the end)
-                property.setPriority(PRIO_FIRST);
-                collapsed.add(property);
-                continue;
-            }
-
-            if (property.getCategory() == PropertyCategory.PREFERRED) {
-                collapsed.add(property);
-                // Fall through: these are *duplicated* inside their defining categories!
-                // However, create a new instance of the property, such that the propertysheet
-                // doesn't see the same property instance twice (when selected, it will highlight
-                // both, etc.) Also, set the category to Normal such that we don't draw attention
-                // to it again. We want it to appear in both places such that somebody looking
-                // within a category will always find it there, even if for this specific
-                // view type it's a common attribute and replicated up at the top.
-                XmlProperty oldProperty = property;
-                property = new XmlProperty(oldProperty.getEditor(), this, node,
-                        oldProperty.getDescriptor());
-                property.setPriority(oldProperty.getPriority());
-            }
-
-            IAttributeInfo attributeInfo = descriptor.getAttributeInfo();
-            if (attributeInfo != null && attributeInfo.getDefinedBy() != null) {
-                String category = attributeInfo.getDefinedBy();
-                ComplexProperty complex = categoryToProperty.get(category);
-                if (complex == null) {
-                    complex = new ComplexProperty(
-                            category.substring(category.lastIndexOf('.') + 1),
-                            "[]",
-                            null /* properties */);
-                    categoryToProperty.put(category, complex);
-                    Integer categoryPriority = categoryPriorities.get(category);
-                    if (categoryPriority != null) {
-                        complex.setPriority(categoryPriority);
-                    } else {
-                        // Descriptor for an attribute whose definedBy does *not*
-                        // correspond to one of the known superclasses of this widget.
-                        // This sometimes happens; for example, a RatingBar will pull in
-                        // an ImageView's minWidth attribute. Probably an error in the
-                        // metadata, but deal with it gracefully here.
-                        categoryPriorities.put(category, nextCategoryPriority += 100);
-                        complex.setPriority(nextCategoryPriority);
-                    }
-                }
-                categoryToProperties.put(category, property);
-                continue;
-            } else {
-                collapsed.add(property);
-            }
-        }
-
-        // Update the complex properties
-        for (String category : categoryToProperties.keySet()) {
-            Collection<Property> subProperties = categoryToProperties.get(category);
-            if (subProperties.size() > 1) {
-                ComplexProperty complex = categoryToProperty.get(category);
-                assert complex != null : category;
-                Property[] subArray = new Property[subProperties.size()];
-                complex.setProperties(subProperties.toArray(subArray));
-                //complex.setPriority(subArray[0].getPriority());
-
-                collapsed.add(complex);
-
-                boolean allAdvanced = true;
-                boolean isPreferred = false;
-                for (Property p : subProperties) {
-                    PropertyCategory c = p.getCategory();
-                    if (c != PropertyCategory.ADVANCED) {
-                        allAdvanced = false;
-                    }
-                    if (c == PropertyCategory.PREFERRED) {
-                        isPreferred = true;
-                    }
-                }
-                if (isPreferred) {
-                    complex.setCategory(PropertyCategory.PREFERRED);
-                } else if (allAdvanced) {
-                    complex.setCategory(PropertyCategory.ADVANCED);
-                }
-            } else if (subProperties.size() == 1) {
-                collapsed.add(subProperties.iterator().next());
-            }
-        }
-
-        if (layoutProperties.size() > 0 || marginProperties != null) {
-            if (marginProperties != null) {
-                XmlProperty[] m =
-                        marginProperties.toArray(new XmlProperty[marginProperties.size()]);
-                Property marginProperty = new ComplexProperty(
-                        "Margins",
-                        "[]",
-                        m);
-                layoutProperties.add(marginProperty);
-                marginProperty.setPriority(PRIO_LAST);
-
-                for (XmlProperty p : m) {
-                    p.setParent(marginProperty);
-                }
-            }
-            Property[] l = layoutProperties.toArray(new Property[layoutProperties.size()]);
-            Arrays.sort(l, Property.PRIORITY);
-            Property property = new ComplexProperty(
-                    "Layout Parameters",
-                    "[]",
-                    l);
-            for (Property p : l) {
-                if (p instanceof XmlProperty) {
-                    ((XmlProperty) p).setParent(property);
-                }
-            }
-            property.setCategory(PropertyCategory.PREFERRED);
-            collapsed.add(property);
-            property.setPriority(PRIO_SECOND);
-        }
-
-        if (deprecatedProperties != null && deprecatedProperties.size() > 0) {
-            Property property = new ComplexProperty(
-                    "Deprecated",
-                    "(Deprecated Properties)",
-                    deprecatedProperties.toArray(new Property[deprecatedProperties.size()]));
-            property.setPriority(PRIO_LAST);
-            collapsed.add(property);
-        }
-
-        Collections.sort(collapsed, Property.PRIORITY);
-
-        return collapsed;
-    }
-
-    protected Collection<? extends Property> sortNatural(
-            UiViewElementNode node,
-            List<XmlProperty> properties) {
-        Collections.sort(properties, Property.ALPHABETICAL);
-        List<Property> collapsed = new ArrayList<Property>(properties.size());
-        List<Property> layoutProperties = Lists.newArrayListWithExpectedSize(20);
-        List<Property> marginProperties = null;
-        List<Property> deprecatedProperties = null;
-        Map<String, ComplexProperty> categoryToProperty = new HashMap<String, ComplexProperty>();
-        Multimap<String, Property> categoryToProperties = ArrayListMultimap.create();
-
-        for (int i = 0, max = properties.size(); i < max; i++) {
-            XmlProperty property = properties.get(i);
-
-            AttributeDescriptor descriptor = property.getDescriptor();
-            if (descriptor.isDeprecated()) {
-                if (deprecatedProperties == null) {
-                    deprecatedProperties = Lists.newArrayListWithExpectedSize(10);
-                }
-                deprecatedProperties.add(property);
-                continue;
-            }
-
-            String firstName = descriptor.getXmlLocalName();
-            if (firstName.startsWith(ATTR_LAYOUT_RESOURCE_PREFIX)) {
-                if (firstName.startsWith(ATTR_LAYOUT_MARGIN)) {
-                    if (marginProperties == null) {
-                        marginProperties = Lists.newArrayListWithExpectedSize(5);
-                    }
-                    marginProperties.add(property);
-                } else {
-                    layoutProperties.add(property);
-                }
-                continue;
-            }
-
-            if (firstName.equals(ATTR_ID)) {
-                // Add id to the front (though the layout parameters will be added to
-                // the front of this at the end)
-                property.setPriority(PRIO_FIRST);
-                collapsed.add(property);
-                continue;
-            }
-
-            String category = PropertyMetadata.getCategory(firstName);
-            if (category != null) {
-                ComplexProperty complex = categoryToProperty.get(category);
-                if (complex == null) {
-                    complex = new ComplexProperty(
-                            category,
-                            "[]",
-                            null /* properties */);
-                    categoryToProperty.put(category, complex);
-                    complex.setPriority(property.getPriority());
-                }
-                categoryToProperties.put(category, property);
-                continue;
-            }
-
-            // Index of second word in the first name, so in fooBar it's 3 (index of 'B')
-            int firstNameIndex = firstName.length();
-            for (int k = 0, kn = firstName.length(); k < kn; k++) {
-                if (Character.isUpperCase(firstName.charAt(k))) {
-                    firstNameIndex = k;
-                    break;
-                }
-            }
-
-            // Scout forwards and see how many properties we can combine
-            int j = i + 1;
-            if (property.getCategory() != PropertyCategory.PREFERRED
-                    && !property.getDescriptor().isDeprecated()) {
-                for (; j < max; j++) {
-                    XmlProperty next = properties.get(j);
-                    String nextName = next.getName();
-                    if (nextName.regionMatches(0, firstName, 0, firstNameIndex)
-                            // Also make sure we begin the second word at the next
-                            // character; if not, we could have something like
-                            // scrollBar
-                            // scrollingBehavior
-                            && nextName.length() > firstNameIndex
-                            && Character.isUpperCase(nextName.charAt(firstNameIndex))) {
-
-                        // Deprecated attributes, and preferred attributes, should not
-                        // be pushed into normal clusters (preferred stay top-level
-                        // and sort to the top, deprecated are all put in the same cluster at
-                        // the end)
-
-                        if (next.getCategory() == PropertyCategory.PREFERRED) {
-                            break;
-                        }
-                        if (next.getDescriptor().isDeprecated()) {
-                            break;
-                        }
-
-                        // This property should be combined with the previous
-                        // property
-                    } else {
-                        break;
-                    }
-                }
-            }
-            if (j - i > 1) {
-                // Combining multiple properties: all the properties from i
-                // through j inclusive
-                XmlProperty[] subprops = new XmlProperty[j - i];
-                for (int k = i, index = 0; k < j; k++, index++) {
-                    subprops[index] = properties.get(k);
-                }
-                Arrays.sort(subprops, Property.PRIORITY);
-
-                // See if we can compute a LONGER base than just the first word.
-                // For example, if we have "lineSpacingExtra" and "lineSpacingMultiplier"
-                // we'd like the base to be "lineSpacing", not "line".
-                int common = firstNameIndex;
-                for (int k = firstNameIndex + 1, n = firstName.length(); k < n; k++) {
-                    if (Character.isUpperCase(firstName.charAt(k))) {
-                        common = k;
-                        break;
-                    }
-                }
-                if (common > firstNameIndex) {
-                    for (int k = 0, n = subprops.length; k < n; k++) {
-                        String nextName = subprops[k].getName();
-                        if (nextName.regionMatches(0, firstName, 0, common)
-                                // Also make sure we begin the second word at the next
-                                // character; if not, we could have something like
-                                // scrollBar
-                                // scrollingBehavior
-                                && nextName.length() > common
-                                && Character.isUpperCase(nextName.charAt(common))) {
-                            // New prefix is okay
-                        } else {
-                            common = firstNameIndex;
-                            break;
-                        }
-                    }
-                    firstNameIndex = common;
-                }
-
-                String base = firstName.substring(0, firstNameIndex);
-                base = DescriptorsUtils.capitalize(base);
-                Property complexProperty = new ComplexProperty(
-                        base,
-                        "[]",
-                        subprops);
-                complexProperty.setPriority(subprops[0].getPriority());
-                //complexProperty.setCategory(PropertyCategory.PREFERRED);
-                collapsed.add(complexProperty);
-                boolean allAdvanced = true;
-                boolean isPreferred = false;
-                for (XmlProperty p : subprops) {
-                    p.setParent(complexProperty);
-                    PropertyCategory c = p.getCategory();
-                    if (c != PropertyCategory.ADVANCED) {
-                        allAdvanced = false;
-                    }
-                    if (c == PropertyCategory.PREFERRED) {
-                        isPreferred = true;
-                    }
-                }
-                if (isPreferred) {
-                    complexProperty.setCategory(PropertyCategory.PREFERRED);
-                } else if (allAdvanced) {
-                    complexProperty.setCategory(PropertyCategory.PREFERRED);
-                }
-            } else {
-                // Add the individual properties (usually 1, sometimes 2
-                for (int k = i; k < j; k++) {
-                    collapsed.add(properties.get(k));
-                }
-            }
-
-            i = j - 1; // -1: compensate in advance for the for-loop adding 1
-        }
-
-        // Update the complex properties
-        for (String category : categoryToProperties.keySet()) {
-            Collection<Property> subProperties = categoryToProperties.get(category);
-            if (subProperties.size() > 1) {
-                ComplexProperty complex = categoryToProperty.get(category);
-                assert complex != null : category;
-                Property[] subArray = new Property[subProperties.size()];
-                complex.setProperties(subProperties.toArray(subArray));
-                complex.setPriority(subArray[0].getPriority());
-                collapsed.add(complex);
-
-                boolean allAdvanced = true;
-                boolean isPreferred = false;
-                for (Property p : subProperties) {
-                    PropertyCategory c = p.getCategory();
-                    if (c != PropertyCategory.ADVANCED) {
-                        allAdvanced = false;
-                    }
-                    if (c == PropertyCategory.PREFERRED) {
-                        isPreferred = true;
-                    }
-                }
-                if (isPreferred) {
-                    complex.setCategory(PropertyCategory.PREFERRED);
-                } else if (allAdvanced) {
-                    complex.setCategory(PropertyCategory.ADVANCED);
-                }
-            } else if (subProperties.size() == 1) {
-                collapsed.add(subProperties.iterator().next());
-            }
-        }
-
-        if (layoutProperties.size() > 0 || marginProperties != null) {
-            if (marginProperties != null) {
-                XmlProperty[] m =
-                        marginProperties.toArray(new XmlProperty[marginProperties.size()]);
-                Property marginProperty = new ComplexProperty(
-                        "Margins",
-                        "[]",
-                        m);
-                layoutProperties.add(marginProperty);
-                marginProperty.setPriority(PRIO_LAST);
-
-                for (XmlProperty p : m) {
-                    p.setParent(marginProperty);
-                }
-            }
-            Property[] l = layoutProperties.toArray(new Property[layoutProperties.size()]);
-            Arrays.sort(l, Property.PRIORITY);
-            Property property = new ComplexProperty(
-                    "Layout Parameters",
-                    "[]",
-                    l);
-            for (Property p : l) {
-                if (p instanceof XmlProperty) {
-                    ((XmlProperty) p).setParent(property);
-                }
-            }
-            property.setCategory(PropertyCategory.PREFERRED);
-            collapsed.add(property);
-            property.setPriority(PRIO_SECOND);
-        }
-
-        if (deprecatedProperties != null && deprecatedProperties.size() > 0) {
-            Property property = new ComplexProperty(
-                    "Deprecated",
-                    "(Deprecated Properties)",
-                    deprecatedProperties.toArray(new Property[deprecatedProperties.size()]));
-            property.setPriority(PRIO_LAST);
-            collapsed.add(property);
-        }
-
-        Collections.sort(collapsed, Property.PRIORITY);
-
-        return collapsed;
-    }
-
-    @Nullable
-    GraphicalEditorPart getGraphicalEditor() {
-        return mGraphicalEditorPart;
-    }
-
-    // HACK: This should be passed into each property instead
-    public Object getCurrentViewObject() {
-        return mCurrentViewCookie;
-    }
-
-    public void setSortingMode(SortingMode sortingMode) {
-        mSortMode = sortingMode;
-    }
-
-    // https://bugs.eclipse.org/bugs/show_bug.cgi?id=388574
-    public static Composite addWorkaround(Composite parent) {
-        if (ButtonPropertyEditorPresentation.isInWorkaround) {
-            Composite top = new Composite(parent, SWT.NONE);
-            top.setLayout(new GridLayout(1, false));
-            Label label = new Label(top, SWT.WRAP);
-            label.setText(
-                    "This dialog is shown instead of an inline text editor as a\n" +
-                    "workaround for an Eclipse bug specific to OSX Mountain Lion.\n" +
-                    "It should be fixed in Eclipse 4.3.");
-            label.setForeground(top.getDisplay().getSystemColor(SWT.COLOR_RED));
-            GridData data = new GridData();
-            data.grabExcessVerticalSpace = false;
-            data.grabExcessHorizontalSpace = false;
-            data.horizontalAlignment = GridData.FILL;
-            data.verticalAlignment = GridData.BEGINNING;
-            label.setLayoutData(data);
-
-            Link link = new Link(top, SWT.NO_FOCUS);
-            link.setLayoutData(new GridData(SWT.LEFT, SWT.TOP, false, false, 1, 1));
-            link.setText("<a>https://bugs.eclipse.org/bugs/show_bug.cgi?id=388574</a>");
-            link.addSelectionListener(new SelectionAdapter() {
-                @Override
-                public void widgetSelected(SelectionEvent event) {
-                    try {
-                        IWorkbench workbench = PlatformUI.getWorkbench();
-                        IWebBrowser browser = workbench.getBrowserSupport().getExternalBrowser();
-                        browser.openURL(new URL(event.text));
-                    } catch (Exception e) {
-                        String message = String.format(
-                                "Could not open browser. Vist\n%1$s\ninstead.",
-                                event.text);
-                        MessageDialog.openError(((Link)event.getSource()).getShell(),
-                                "Browser Error", message);
-                    }
-                }
-            });
-
-            return top;
-        }
-
-        return null;
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/properties/PropertyMetadata.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/properties/PropertyMetadata.java
deleted file mode 100644
index b230aa9..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/properties/PropertyMetadata.java
+++ /dev/null
@@ -1,329 +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.ide.eclipse.adt.internal.editors.layout.properties;
-
-import static com.android.SdkConstants.ATTR_CONTENT_DESCRIPTION;
-import static com.android.SdkConstants.ATTR_HINT;
-import static com.android.SdkConstants.ATTR_TEXT;
-
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-
-import java.util.HashSet;
-import java.util.Set;
-
-/** Extra metadata about properties not available from the descriptors (yet) */
-class PropertyMetadata {
-    static boolean isAdvanced(@NonNull String name) {
-        return sAdvanced.contains(name);
-    }
-
-    static boolean isPreferred(@NonNull String name) {
-        return sPreferred.contains(name);
-    }
-
-    @Nullable
-    static String getCategory(@NonNull String name) {
-        //return sCategories.get(name);
-        assert false : "Disabled to save memory since this method is not currently used.";
-        return null;
-    }
-
-    private static final int ADVANCED_MAP_SIZE = 134;
-    private static final Set<String> sAdvanced = new HashSet<String>(ADVANCED_MAP_SIZE);
-    static {
-        // This metadata about which attributes are "advanced" was generated as follows:
-        // First, I ran the sdk/attribute_stats project with the --list argument to dump out
-        // *all* referenced XML attributes found in layouts, run against a bunch of
-        // sample Android code (development/samples, packages/apps, vendor, etc.
-        //
-        // Then I iterated over the LayoutDescriptors' ViewElementDescriptors'
-        // AttributeDescriptors, and basically diffed the two: any attribute descriptor name
-        // which was *not* found in any of the representative layouts is added here
-        // as an advanced property.
-        //
-        // Then I manually edited in some attributes that were referenced in the sample
-        // layouts but which I still consider to be advanced:
-        // -- nothing right now
-
-        // I also manually *removed* some entries from the below list:
-        //     drawableBottom   (the others, drawableTop, drawableLeft and drawableRight were all
-        //                       NOT on the list so keep bottom off for symmetry)
-        //     rating     (useful when you deal with a RatingsBar component)
-
-
-        // Automatically generated, see above:
-        sAdvanced.add("alwaysDrawnWithCache");
-        sAdvanced.add("animationCache");
-        sAdvanced.add("animationDuration");
-        sAdvanced.add("animationResolution");
-        sAdvanced.add("baseline");
-        sAdvanced.add("bufferType");
-        sAdvanced.add("calendarViewShown");
-        sAdvanced.add("completionHint");
-        sAdvanced.add("completionHintView");
-        sAdvanced.add("completionThreshold");
-        sAdvanced.add("cursorVisible");
-        sAdvanced.add("dateTextAppearance");
-        sAdvanced.add("dial");
-        sAdvanced.add("digits");
-        sAdvanced.add("disableChildrenWhenDisabled");
-        sAdvanced.add("disabledAlpha");
-        sAdvanced.add("drawableAlpha");
-        sAdvanced.add("drawableEnd");
-        sAdvanced.add("drawableStart");
-        sAdvanced.add("drawingCacheQuality");
-        sAdvanced.add("dropDownAnchor");
-        sAdvanced.add("dropDownHeight");
-        sAdvanced.add("dropDownHorizontalOffset");
-        sAdvanced.add("dropDownSelector");
-        sAdvanced.add("dropDownVerticalOffset");
-        sAdvanced.add("dropDownWidth");
-        sAdvanced.add("editorExtras");
-        sAdvanced.add("ems");
-        sAdvanced.add("endYear");
-        sAdvanced.add("eventsInterceptionEnabled");
-        sAdvanced.add("fadeDuration");
-        sAdvanced.add("fadeEnabled");
-        sAdvanced.add("fadeOffset");
-        sAdvanced.add("fadeScrollbars");
-        sAdvanced.add("filterTouchesWhenObscured");
-        sAdvanced.add("firstDayOfWeek");
-        sAdvanced.add("flingable");
-        sAdvanced.add("focusedMonthDateColor");
-        sAdvanced.add("foregroundInsidePadding");
-        sAdvanced.add("format");
-        sAdvanced.add("gestureColor");
-        sAdvanced.add("gestureStrokeAngleThreshold");
-        sAdvanced.add("gestureStrokeLengthThreshold");
-        sAdvanced.add("gestureStrokeSquarenessThreshold");
-        sAdvanced.add("gestureStrokeType");
-        sAdvanced.add("gestureStrokeWidth");
-        sAdvanced.add("hand_hour");
-        sAdvanced.add("hand_minute");
-        sAdvanced.add("hapticFeedbackEnabled");
-        sAdvanced.add("id");
-        sAdvanced.add("imeActionId");
-        sAdvanced.add("imeActionLabel");
-        sAdvanced.add("indeterminateDrawable");
-        sAdvanced.add("indeterminateDuration");
-        sAdvanced.add("inputMethod");
-        sAdvanced.add("interpolator");
-        sAdvanced.add("isScrollContainer");
-        sAdvanced.add("keepScreenOn");
-        sAdvanced.add("layerType");
-        sAdvanced.add("layoutDirection");
-        sAdvanced.add("maxDate");
-        sAdvanced.add("minDate");
-        sAdvanced.add("mode");
-        sAdvanced.add("numeric");
-        sAdvanced.add("paddingEnd");
-        sAdvanced.add("paddingStart");
-        sAdvanced.add("persistentDrawingCache");
-        sAdvanced.add("phoneNumber");
-        sAdvanced.add("popupBackground");
-        sAdvanced.add("popupPromptView");
-        sAdvanced.add("privateImeOptions");
-        sAdvanced.add("quickContactWindowSize");
-        //sAdvanced.add("rating");
-        sAdvanced.add("requiresFadingEdge");
-        sAdvanced.add("rotation");
-        sAdvanced.add("rotationX");
-        sAdvanced.add("rotationY");
-        sAdvanced.add("saveEnabled");
-        sAdvanced.add("scaleX");
-        sAdvanced.add("scaleY");
-        sAdvanced.add("scrollX");
-        sAdvanced.add("scrollY");
-        sAdvanced.add("scrollbarAlwaysDrawHorizontalTrack");
-        sAdvanced.add("scrollbarDefaultDelayBeforeFade");
-        sAdvanced.add("scrollbarFadeDuration");
-        sAdvanced.add("scrollbarSize");
-        sAdvanced.add("scrollbarThumbHorizontal");
-        sAdvanced.add("scrollbarThumbVertical");
-        sAdvanced.add("scrollbarTrackHorizontal");
-        sAdvanced.add("scrollbarTrackVertical");
-        sAdvanced.add("secondaryProgress");
-        sAdvanced.add("selectedDateVerticalBar");
-        sAdvanced.add("selectedWeekBackgroundColor");
-        sAdvanced.add("selectionDivider");
-        sAdvanced.add("selectionDividerHeight");
-        sAdvanced.add("showWeekNumber");
-        sAdvanced.add("shownWeekCount");
-        sAdvanced.add("solidColor");
-        sAdvanced.add("soundEffectsEnabled");
-        sAdvanced.add("spinnerMode");
-        sAdvanced.add("spinnersShown");
-        sAdvanced.add("startYear");
-        sAdvanced.add("switchMinWidth");
-        sAdvanced.add("switchPadding");
-        sAdvanced.add("switchTextAppearance");
-        sAdvanced.add("textColorHighlight");
-        sAdvanced.add("textCursorDrawable");
-        sAdvanced.add("textDirection");
-        sAdvanced.add("textEditNoPasteWindowLayout");
-        sAdvanced.add("textEditPasteWindowLayout");
-        sAdvanced.add("textEditSideNoPasteWindowLayout");
-        sAdvanced.add("textEditSidePasteWindowLayout");
-        sAdvanced.add("textEditSuggestionItemLayout");
-        sAdvanced.add("textIsSelectable");
-        sAdvanced.add("textOff");
-        sAdvanced.add("textOn");
-        sAdvanced.add("textScaleX");
-        sAdvanced.add("textSelectHandle");
-        sAdvanced.add("textSelectHandleLeft");
-        sAdvanced.add("textSelectHandleRight");
-        sAdvanced.add("thumbOffset");
-        sAdvanced.add("thumbTextPadding");
-        sAdvanced.add("tint");
-        sAdvanced.add("track");
-        sAdvanced.add("transformPivotX");
-        sAdvanced.add("transformPivotY");
-        sAdvanced.add("translationX");
-        sAdvanced.add("translationY");
-        sAdvanced.add("uncertainGestureColor");
-        sAdvanced.add("unfocusedMonthDateColor");
-        sAdvanced.add("unselectedAlpha");
-        sAdvanced.add("verticalScrollbarPosition");
-        sAdvanced.add("weekDayTextAppearance");
-        sAdvanced.add("weekNumberColor");
-        sAdvanced.add("weekSeparatorLineColor");
-
-        assert sAdvanced.size() == ADVANCED_MAP_SIZE : sAdvanced.size();
-
-    }
-
-    private static final int PREFERRED_MAP_SIZE = 7;
-    private static final Set<String> sPreferred = new HashSet<String>(PREFERRED_MAP_SIZE);
-    static {
-        // Manual registrations of attributes that should be treated as preferred if
-        // they are available on a widget even if they don't show up in the top 10% of
-        // usages (which the view metadata provides)
-        sPreferred.add(ATTR_TEXT);
-        sPreferred.add(ATTR_CONTENT_DESCRIPTION);
-        sPreferred.add(ATTR_HINT);
-        sPreferred.add("indeterminate");
-        sPreferred.add("progress");
-        sPreferred.add("rating");
-        sPreferred.add("max");
-        assert sPreferred.size() == PREFERRED_MAP_SIZE : sPreferred.size();
-    }
-
-    /*
-    private static final int CATEGORY_MAP_SIZE = 62;
-    private static final Map<String, String> sCategories =
-            new HashMap<String, String>(CATEGORY_MAP_SIZE);
-    static {
-        sCategories.put("requiresFadingEdge", "Scrolling");
-        sCategories.put("fadingEdgeLength", "Scrolling");
-        sCategories.put("scrollbarSize", "Scrolling");
-        sCategories.put("scrollbarThumbVertical", "Scrolling");
-        sCategories.put("scrollbarThumbHorizontal", "Scrolling");
-        sCategories.put("scrollbarTrackHorizontal", "Scrolling");
-        sCategories.put("scrollbarTrackVertical", "Scrolling");
-        sCategories.put("scrollbarAlwaysDrawHorizontalTrack", "Scrolling");
-        sCategories.put("scrollbarAlwaysDrawVerticalTrack", "Scrolling");
-        sCategories.put("scrollViewStyle", "Scrolling");
-        sCategories.put("scrollbars", "Scrolling");
-        sCategories.put("scrollingCache", "Scrolling");
-        sCategories.put("scrollHorizontally", "Scrolling");
-        sCategories.put("scrollbarFadeDuration", "Scrolling");
-        sCategories.put("scrollbarDefaultDelayBeforeFade", "Scrolling");
-        sCategories.put("fastScrollEnabled", "Scrolling");
-        sCategories.put("smoothScrollbar", "Scrolling");
-        sCategories.put("isScrollContainer", "Scrolling");
-        sCategories.put("fadeScrollbars", "Scrolling");
-        sCategories.put("overScrollMode", "Scrolling");
-        sCategories.put("overScrollHeader", "Scrolling");
-        sCategories.put("overScrollFooter", "Scrolling");
-        sCategories.put("verticalScrollbarPosition", "Scrolling");
-        sCategories.put("fastScrollAlwaysVisible", "Scrolling");
-        sCategories.put("fastScrollThumbDrawable", "Scrolling");
-        sCategories.put("fastScrollPreviewBackgroundLeft", "Scrolling");
-        sCategories.put("fastScrollPreviewBackgroundRight", "Scrolling");
-        sCategories.put("fastScrollTrackDrawable", "Scrolling");
-        sCategories.put("fastScrollOverlayPosition", "Scrolling");
-        sCategories.put("horizontalScrollViewStyle", "Scrolling");
-        sCategories.put("fastScrollTextColor", "Scrolling");
-        sCategories.put("scrollbarSize", "Scrolling");
-        sCategories.put("scrollbarSize", "Scrolling");
-        sCategories.put("scrollbarSize", "Scrolling");
-        sCategories.put("scrollbarSize", "Scrolling");
-        sCategories.put("scrollbarSize", "Scrolling");
-
-        // TODO: All the styles: radioButtonStyle, ratingBarStyle, progressBarStyle, ...
-
-        sCategories.put("focusable", "Focus");
-        sCategories.put("focusableInTouchMode", "Focus");
-        sCategories.put("nextFocusLeft", "Focus");
-        sCategories.put("nextFocusRight", "Focus");
-        sCategories.put("nextFocusUp", "Focus");
-        sCategories.put("nextFocusDown", "Focus");
-        sCategories.put("descendantFocusability", "Focus");
-        sCategories.put("selectAllOnFocus", "Focus");
-        sCategories.put("nextFocusForward", "Focus");
-        sCategories.put("colorFocusedHighlight", "Focus");
-
-        sCategories.put("rotation", "Transforms");
-        sCategories.put("scrollX", "Transforms");
-        sCategories.put("scrollY", "Transforms");
-        sCategories.put("rotationX", "Transforms");
-        sCategories.put("rotationY", "Transforms");
-        sCategories.put("transformPivotX", "Transforms");
-        sCategories.put("transformPivotY", "Transforms");
-        sCategories.put("translationX", "Transforms");
-        sCategories.put("translationY", "Transforms");
-        sCategories.put("scaleX", "Transforms");
-        sCategories.put("scaleY", "Transforms");
-
-        sCategories.put("width", "Size");
-        sCategories.put("height", "Size");
-        sCategories.put("minWidth", "Size");
-        sCategories.put("minHeight", "Size");
-
-        sCategories.put("longClickable", "Clicks");
-        sCategories.put("onClick", "Clicks");
-        sCategories.put("clickable", "Clicks");
-        sCategories.put("hapticFeedbackEnabled", "Clicks");
-
-        sCategories.put("duplicateParentState", "State");
-        sCategories.put("addStatesFromChildren", "State");
-
-        assert sCategories.size() == CATEGORY_MAP_SIZE : sCategories.size();
-    }
-    */
-
-//    private static final int PRIO_CLZ_LAYOUT = 1000;
-//    private static final int PRIO_CLZ_TEXT = 2000;
-//    private static final int PRIO_CLZ_DRAWABLE = 3000;
-//    private static final int PRIO_CLZ_ANIMATION = 4000;
-//    private static final int PRIO_CLZ_FOCUS = 5000;
-//
-//    private static final int PRIORITY_MAP_SIZE = 100;
-//    private static final Map<String, Integer> sPriorities =
-//            new HashMap<String, Integer>(PRIORITY_MAP_SIZE);
-//    static {
-//        // TODO: I should put all the properties roughly based on their original order: this
-//        // will correspond to the rough order they came in with
-//        // TODO: How can I make similar complex properties show up adjacent; e.g. min and max
-//        sPriorities.put("min", PRIO_CLZ_LAYOUT);
-//        sPriorities.put("max", PRIO_CLZ_LAYOUT);
-//
-//        assert sPriorities.size() == PRIORITY_MAP_SIZE : sPriorities.size();
-//    }
-
-    // TODO: Emit metadata into a file
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/properties/PropertySheetPage.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/properties/PropertySheetPage.java
deleted file mode 100644
index 58fddc0..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/properties/PropertySheetPage.java
+++ /dev/null
@@ -1,403 +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.ide.eclipse.adt.internal.editors.layout.properties;
-
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.ide.eclipse.adt.internal.editors.IconFactory;
-import com.android.ide.eclipse.adt.internal.editors.layout.gle2.CanvasViewInfo;
-import com.android.ide.eclipse.adt.internal.editors.layout.gle2.GraphicalEditorPart;
-import com.android.ide.eclipse.adt.internal.editors.layout.properties.PropertyFactory.SortingMode;
-import com.android.ide.eclipse.adt.internal.editors.layout.uimodel.UiViewElementNode;
-import com.android.ide.eclipse.adt.internal.editors.uimodel.IUiUpdateListener;
-import com.android.ide.eclipse.adt.internal.editors.uimodel.UiElementNode;
-
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.action.IMenuListener;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.action.IStatusLineManager;
-import org.eclipse.jface.action.IToolBarManager;
-import org.eclipse.jface.action.MenuManager;
-import org.eclipse.jface.action.Separator;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.viewers.TreeSelection;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.MenuItem;
-import org.eclipse.ui.ISharedImages;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.part.Page;
-import org.eclipse.ui.views.properties.IPropertySheetPage;
-import org.eclipse.wb.internal.core.editor.structure.IPage;
-import org.eclipse.wb.internal.core.model.property.Property;
-import org.eclipse.wb.internal.core.model.property.table.IPropertyExceptionHandler;
-import org.eclipse.wb.internal.core.model.property.table.PropertyTable;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-
-/**
- * Property sheet page used when the graphical layout editor is chosen
- */
-public class PropertySheetPage extends Page
-        implements IPropertySheetPage, IUiUpdateListener, IPage {
-    private PropertyTable mPropertyTable;
-    private final GraphicalEditorPart mEditor;
-    private Property mActiveProperty;
-    private Action mDefaultValueAction;
-    private Action mShowAdvancedPropertiesAction;
-    private Action mSortAlphaAction;
-    private Action mCollapseAll;
-    private Action mExpandAll;
-    private List<CanvasViewInfo> mSelection;
-
-    private static final String EXPAND_DISABLED_ICON = "expandall-disabled";          //$NON-NLS-1$
-    private static final String EXPAND_ICON = "expandall";                            //$NON-NLS-1$
-    private static final String DEFAULT_ICON = "properties_default";                  //$NON-NLS-1$
-    private static final String ADVANCED_ICON = "filter_advanced_properties";         //$NON-NLS-1$
-    private static final String ALPHA_ICON = "sort_alpha";                            //$NON-NLS-1$
-    // TODO: goto-definition.png
-
-    /**
-     * Constructs a new {@link PropertySheetPage} associated with the given
-     * editor
-     *
-     * @param editor the editor associated with this property sheet page
-     */
-    public PropertySheetPage(GraphicalEditorPart editor) {
-        mEditor = editor;
-    }
-
-    private PropertyFactory getPropertyFactory() {
-        return mEditor.getPropertyFactory();
-    }
-
-    @Override
-    public void createControl(Composite parent) {
-        assert parent != null;
-        mPropertyTable = new PropertyTable(parent, SWT.NONE);
-        mPropertyTable.setExceptionHandler(new IPropertyExceptionHandler() {
-            @Override
-            public void handle(Throwable e) {
-                AdtPlugin.log(e, null);
-            }
-        });
-        mPropertyTable.setDefaultCollapsedNames(Arrays.asList(
-                "Deprecated",
-                "Layout Parameters",
-                "Layout Parameters|Margins"));
-
-        createActions();
-        setPropertyTableContextMenu();
-    }
-
-    @Override
-    public void selectionChanged(IWorkbenchPart part, ISelection selection) {
-        if (selection instanceof TreeSelection
-                && mPropertyTable != null && !mPropertyTable.isDisposed()) {
-            TreeSelection treeSelection = (TreeSelection) selection;
-
-            // We get a lot of repeated selection requests for the same selection
-            // as before, so try to eliminate these
-            if (mSelection != null) {
-                if (mSelection.isEmpty()) {
-                    if (treeSelection.isEmpty()) {
-                        return;
-                    }
-                } else {
-                    int selectionCount = treeSelection.size();
-                    if (selectionCount == mSelection.size()) {
-                        boolean same = true;
-                        Iterator<?> iterator = treeSelection.iterator();
-                        for (int i = 0, n = selectionCount; i < n && iterator.hasNext(); i++) {
-                            Object next = iterator.next();
-                            if (next instanceof CanvasViewInfo) {
-                                CanvasViewInfo info = (CanvasViewInfo) next;
-                                if (info != mSelection.get(i)) {
-                                    same = false;
-                                    break;
-                                }
-                            } else {
-                                same = false;
-                                break;
-                            }
-                        }
-                        if (same) {
-                            return;
-                        }
-                    }
-                }
-            }
-
-            stopTrackingSelection();
-
-            if (treeSelection.isEmpty()) {
-                mSelection = Collections.emptyList();
-            } else {
-                int selectionCount = treeSelection.size();
-                List<CanvasViewInfo> newSelection = new ArrayList<CanvasViewInfo>(selectionCount);
-                Iterator<?> iterator = treeSelection.iterator();
-                while (iterator.hasNext()) {
-                    Object next = iterator.next();
-                    if (next instanceof CanvasViewInfo) {
-                        CanvasViewInfo info = (CanvasViewInfo) next;
-                        newSelection.add(info);
-                    }
-                }
-                mSelection = newSelection;
-            }
-
-            startTrackingSelection();
-
-            refreshProperties();
-        }
-    }
-
-    @Override
-    public void dispose() {
-        stopTrackingSelection();
-        super.dispose();
-    }
-
-    private void startTrackingSelection() {
-        if (mSelection != null && !mSelection.isEmpty()) {
-            for (CanvasViewInfo item : mSelection) {
-                UiViewElementNode node = item.getUiViewNode();
-                if (node != null) {
-                    node.addUpdateListener(this);
-                }
-            }
-        }
-    }
-
-    private void stopTrackingSelection() {
-        if (mSelection != null && !mSelection.isEmpty()) {
-            for (CanvasViewInfo item : mSelection) {
-                UiViewElementNode node = item.getUiViewNode();
-                if (node != null) {
-                    node.removeUpdateListener(this);
-                }
-            }
-        }
-        mSelection = null;
-    }
-
-    // Implements IUiUpdateListener
-    @Override
-    public void uiElementNodeUpdated(UiElementNode node, UiUpdateState state) {
-        refreshProperties();
-    }
-
-    @Override
-    public Control getControl() {
-        return mPropertyTable;
-    }
-
-    @Override
-    public void setFocus() {
-        mPropertyTable.setFocus();
-    }
-
-    @Override
-    public void makeContributions(IMenuManager menuManager,
-            IToolBarManager toolBarManager, IStatusLineManager statusLineManager) {
-        toolBarManager.add(mShowAdvancedPropertiesAction);
-        toolBarManager.add(new Separator());
-        toolBarManager.add(mSortAlphaAction);
-        toolBarManager.add(new Separator());
-        toolBarManager.add(mDefaultValueAction);
-        toolBarManager.add(new Separator());
-        toolBarManager.add(mExpandAll);
-        toolBarManager.add(mCollapseAll);
-        toolBarManager.add(new Separator());
-    }
-
-    private void createActions() {
-        ISharedImages sharedImages = PlatformUI.getWorkbench().getSharedImages();
-        IconFactory iconFactory = IconFactory.getInstance();
-
-        mExpandAll = new PropertySheetAction(
-                IAction.AS_PUSH_BUTTON,
-                "Expand All",
-                ACTION_EXPAND,
-                iconFactory.getImageDescriptor(EXPAND_ICON),
-                iconFactory.getImageDescriptor(EXPAND_DISABLED_ICON));
-
-        mCollapseAll = new PropertySheetAction(
-                IAction.AS_PUSH_BUTTON,
-                "Collapse All",
-                ACTION_COLLAPSE,
-                sharedImages.getImageDescriptor(ISharedImages.IMG_ELCL_COLLAPSEALL),
-                sharedImages.getImageDescriptor(ISharedImages.IMG_ELCL_COLLAPSEALL_DISABLED));
-
-        mShowAdvancedPropertiesAction = new PropertySheetAction(
-                IAction.AS_CHECK_BOX,
-                "Show Advanced Properties",
-                ACTION_SHOW_ADVANCED,
-                iconFactory.getImageDescriptor(ADVANCED_ICON),
-                null);
-
-        mSortAlphaAction = new PropertySheetAction(
-                IAction.AS_CHECK_BOX,
-                "Sort Alphabetically",
-                ACTION_SORT_ALPHA,
-                iconFactory.getImageDescriptor(ALPHA_ICON),
-                null);
-
-        mDefaultValueAction = new PropertySheetAction(
-                IAction.AS_PUSH_BUTTON,
-                "Restore Default Value",
-                ACTION_DEFAULT_VALUE,
-                iconFactory.getImageDescriptor(DEFAULT_ICON),
-                null);
-
-        // Listen on the selection in the property sheet so we can update the
-        // Restore Default Value action
-        ISelectionChangedListener listener = new ISelectionChangedListener() {
-            @Override
-            public void selectionChanged(SelectionChangedEvent event) {
-                StructuredSelection selection = (StructuredSelection) event.getSelection();
-                mActiveProperty = (Property) selection.getFirstElement();
-                updateDefaultValueAction();
-            }
-        };
-        mPropertyTable.addSelectionChangedListener(listener);
-    }
-
-    /**
-     * Updates the state of {@link #mDefaultValueAction}.
-     */
-    private void updateDefaultValueAction() {
-        if (mActiveProperty != null) {
-            try {
-                mDefaultValueAction.setEnabled(mActiveProperty.isModified());
-            } catch (Exception e) {
-                AdtPlugin.log(e, null);
-            }
-        } else {
-            mDefaultValueAction.setEnabled(false);
-        }
-    }
-
-    /**
-     * Sets the context menu for {@link #mPropertyTable}.
-     */
-    private void setPropertyTableContextMenu() {
-        final MenuManager manager = new MenuManager();
-        manager.setRemoveAllWhenShown(true);
-        manager.addMenuListener(new IMenuListener() {
-            @Override
-            public void menuAboutToShow(IMenuManager m) {
-                // dispose items to avoid caching
-                for (MenuItem item : manager.getMenu().getItems()) {
-                    item.dispose();
-                }
-                // apply new items
-                fillContextMenu();
-            }
-
-            private void fillContextMenu() {
-                manager.add(mDefaultValueAction);
-                manager.add(mSortAlphaAction);
-                manager.add(mShowAdvancedPropertiesAction);
-            }
-        });
-
-        mPropertyTable.setMenu(manager.createContextMenu(mPropertyTable));
-    }
-
-    /**
-     * Shows {@link Property}'s of current objects.
-     */
-    private void refreshProperties() {
-        PropertyFactory factory = getPropertyFactory();
-        mPropertyTable.setInput(factory.getProperties(mSelection));
-        updateDefaultValueAction();
-    }
-
-    // ---- Actions ----
-
-    private static final int ACTION_DEFAULT_VALUE = 1;
-    private static final int ACTION_SHOW_ADVANCED = 2;
-    private static final int ACTION_COLLAPSE = 3;
-    private static final int ACTION_EXPAND = 4;
-    private static final int ACTION_SORT_ALPHA = 5;
-
-    private class PropertySheetAction extends Action {
-        private final int mAction;
-
-        private PropertySheetAction(int style, String label, int action,
-                ImageDescriptor imageDesc, ImageDescriptor disabledImageDesc) {
-            super(label, style);
-            mAction = action;
-            setImageDescriptor(imageDesc);
-            if (disabledImageDesc != null) {
-                setDisabledImageDescriptor(disabledImageDesc);
-            }
-            setToolTipText(label);
-        }
-
-        @Override
-        public void run() {
-            switch (mAction) {
-                case ACTION_COLLAPSE: {
-                    mPropertyTable.collapseAll();
-                    break;
-                }
-                case ACTION_EXPAND: {
-                    mPropertyTable.expandAll();
-                    break;
-                }
-                case ACTION_SHOW_ADVANCED: {
-                    boolean show = mShowAdvancedPropertiesAction.isChecked();
-                    mPropertyTable.setShowAdvancedProperties(show);
-                    break;
-                }
-                case ACTION_SORT_ALPHA: {
-                    boolean isAlphabetical = mSortAlphaAction.isChecked();
-                    getPropertyFactory().setSortingMode(
-                        isAlphabetical ? SortingMode.ALPHABETICAL : PropertyFactory.DEFAULT_MODE);
-                    refreshProperties();
-                    break;
-                }
-                case ACTION_DEFAULT_VALUE:
-                    try {
-                        mActiveProperty.setValue(Property.UNKNOWN_VALUE);
-                    } catch (Exception e) {
-                        // Ignore warnings from setters
-                    }
-                    break;
-                default:
-                    assert false : mAction;
-            }
-        }
-    }
-
-    @Override
-    public void setToolBar(IToolBarManager toolBarManager) {
-        makeContributions(null, toolBarManager, null);
-        toolBarManager.update(false);
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/properties/PropertyValueCompleter.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/properties/PropertyValueCompleter.java
deleted file mode 100644
index f2bf073..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/properties/PropertyValueCompleter.java
+++ /dev/null
@@ -1,41 +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.ide.eclipse.adt.internal.editors.layout.properties;
-
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-import com.android.ide.eclipse.adt.internal.editors.common.CommonXmlEditor;
-import com.android.ide.eclipse.adt.internal.editors.descriptors.AttributeDescriptor;
-
-class PropertyValueCompleter extends ValueCompleter {
-    private final XmlProperty mProperty;
-
-    PropertyValueCompleter(XmlProperty property) {
-        mProperty = property;
-    }
-
-    @Override
-    @Nullable
-    protected CommonXmlEditor getEditor() {
-        return mProperty.getXmlEditor();
-    }
-
-    @Override
-    @NonNull
-    protected AttributeDescriptor getDescriptor() {
-        return mProperty.getDescriptor();
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/properties/ResourceValueCompleter.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/properties/ResourceValueCompleter.java
deleted file mode 100644
index 081ec80..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/properties/ResourceValueCompleter.java
+++ /dev/null
@@ -1,182 +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.ide.eclipse.adt.internal.editors.layout.properties;
-
-import static com.android.SdkConstants.ANDROID_PKG;
-import static com.android.SdkConstants.ANDROID_PREFIX;
-import static com.android.SdkConstants.ANDROID_THEME_PREFIX;
-import static com.android.SdkConstants.NEW_ID_PREFIX;
-import static com.android.SdkConstants.PREFIX_RESOURCE_REF;
-import static com.android.SdkConstants.PREFIX_THEME_REF;
-
-import com.android.ide.common.resources.ResourceItem;
-import com.android.ide.common.resources.ResourceRepository;
-import com.android.ide.eclipse.adt.internal.editors.AndroidXmlEditor;
-import com.android.ide.eclipse.adt.internal.editors.common.CommonXmlEditor;
-import com.android.ide.eclipse.adt.internal.editors.descriptors.AttributeDescriptor;
-import com.android.ide.eclipse.adt.internal.editors.uimodel.UiResourceAttributeNode;
-import com.android.ide.eclipse.adt.internal.resources.manager.ResourceManager;
-import com.android.ide.eclipse.adt.internal.sdk.AndroidTargetData;
-import com.android.resources.ResourceType;
-import com.android.utils.SdkUtils;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.jface.fieldassist.ContentProposal;
-import org.eclipse.jface.fieldassist.IContentProposal;
-import org.eclipse.jface.fieldassist.IContentProposalProvider;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
-/**
- * Resource value completion for the given property
- * <p>
- * TODO:
- * <ul>
- * <li>also offer other values seen in the app
- * <li>also offer previously set values for this property
- * <li>also complete on properties
- * </ul>
- */
-class ResourceValueCompleter implements IContentProposalProvider {
-    protected final XmlProperty xmlProperty;
-
-    ResourceValueCompleter(XmlProperty xmlProperty) {
-        this.xmlProperty = xmlProperty;
-    }
-
-    @Override
-    public IContentProposal[] getProposals(String contents, int position) {
-        if (contents.startsWith(PREFIX_RESOURCE_REF)) {
-            CommonXmlEditor editor = this.xmlProperty.getXmlEditor();
-            if (editor != null) {
-                String[] matches = computeResourceStringMatches(
-                        editor,
-                        this.xmlProperty.mDescriptor, contents.substring(0, position));
-                List<IContentProposal> proposals = null;
-                if (matches != null && matches.length > 0) {
-                    proposals = new ArrayList<IContentProposal>(matches.length);
-                    for (String match : matches) {
-                        proposals.add(new ContentProposal(match));
-                    }
-                    return proposals.toArray(new IContentProposal[proposals.size()]);
-                }
-            }
-        }
-
-        return new IContentProposal[0];
-    }
-
-    /**
-     * Similar to {@link UiResourceAttributeNode#computeResourceStringMatches}
-     * but computes complete results up front rather than dividing it up into
-     * smaller chunks like @{code @android:}, {@code string/}, and {@code ok}.
-     */
-    static String[] computeResourceStringMatches(AndroidXmlEditor editor,
-            AttributeDescriptor attributeDescriptor, String prefix) {
-        List<String> results = new ArrayList<String>(200);
-
-        // System matches: only do this if the value already matches at least @a,
-        // and doesn't start with something that can't possibly be @android
-        if (prefix.startsWith("@a") && //$NON-NLS-1$
-                prefix.regionMatches(true /* ignoreCase */, 0, ANDROID_PREFIX, 0,
-                        Math.min(prefix.length() - 1, ANDROID_PREFIX.length()))) {
-            AndroidTargetData data = editor.getTargetData();
-            if (data != null) {
-                ResourceRepository repository = data.getFrameworkResources();
-                addMatches(repository, prefix, true /* isSystem */, results);
-            }
-        } else if (prefix.startsWith("?") && //$NON-NLS-1$
-                prefix.regionMatches(true /* ignoreCase */, 0, ANDROID_THEME_PREFIX, 0,
-                        Math.min(prefix.length() - 1, ANDROID_THEME_PREFIX.length()))) {
-            AndroidTargetData data = editor.getTargetData();
-            if (data != null) {
-                ResourceRepository repository = data.getFrameworkResources();
-                addMatches(repository, prefix, true /* isSystem */, results);
-            }
-        }
-
-
-        // When completing project resources skip framework resources unless
-        // the prefix possibly completes both, such as "@an" which can match
-        // both the project resource @animator as well as @android:string
-        if (!prefix.startsWith("@and") && !prefix.startsWith("?and")) { //$NON-NLS-1$ //$NON-NLS-2$
-            IProject project = editor.getProject();
-            if (project != null) {
-                // get the resource repository for this project and the system resources.
-                ResourceManager manager = ResourceManager.getInstance();
-                ResourceRepository repository = manager.getProjectResources(project);
-                if (repository != null) {
-                    // We have a style name and a repository. Find all resources that match this
-                    // type and recreate suggestions out of them.
-                    addMatches(repository, prefix, false /* isSystem */, results);
-                }
-
-            }
-        }
-
-        if (attributeDescriptor != null) {
-            UiResourceAttributeNode.sortAttributeChoices(attributeDescriptor, results);
-        } else {
-            Collections.sort(results);
-        }
-
-        return results.toArray(new String[results.size()]);
-    }
-
-    private static void addMatches(ResourceRepository repository, String prefix, boolean isSystem,
-            List<String> results) {
-        int typeStart = isSystem
-                ? ANDROID_PREFIX.length() : PREFIX_RESOURCE_REF.length();
-
-        for (ResourceType type : repository.getAvailableResourceTypes()) {
-            if (prefix.regionMatches(typeStart, type.getName(), 0,
-                    Math.min(type.getName().length(), prefix.length() - typeStart))) {
-                StringBuilder sb = new StringBuilder();
-                if (prefix.length() == 0 || prefix.startsWith(PREFIX_RESOURCE_REF)) {
-                    sb.append(PREFIX_RESOURCE_REF);
-                } else {
-                    if (type != ResourceType.ATTR) {
-                        continue;
-                    }
-                    sb.append(PREFIX_THEME_REF);
-                }
-
-                if (type == ResourceType.ID && prefix.startsWith(NEW_ID_PREFIX)) {
-                    sb.append('+');
-                }
-
-                if (isSystem) {
-                    sb.append(ANDROID_PKG).append(':');
-                }
-
-                sb.append(type.getName()).append('/');
-                String base = sb.toString();
-
-                int nameStart = typeStart + type.getName().length() + 1; // +1: add "/" divider
-                String namePrefix =
-                        prefix.length() <= nameStart ? "" : prefix.substring(nameStart);
-                for (ResourceItem item : repository.getResourceItemsOfType(type)) {
-                    String name = item.getName();
-                    if (SdkUtils.startsWithIgnoreCase(name, namePrefix)) {
-                        results.add(base + name);
-                    }
-                }
-            }
-        }
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/properties/StringXmlPropertyDialog.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/properties/StringXmlPropertyDialog.java
deleted file mode 100644
index fb7e459..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/properties/StringXmlPropertyDialog.java
+++ /dev/null
@@ -1,47 +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.ide.eclipse.adt.internal.editors.layout.properties;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.wb.internal.core.model.property.Property;
-import org.eclipse.wb.internal.core.model.property.editor.string.StringPropertyDialog;
-
-class StringXmlPropertyDialog extends StringPropertyDialog {
-    StringXmlPropertyDialog(Shell parentShell, Property property) throws Exception {
-        super(parentShell, property);
-    }
-
-    @Override
-    protected boolean isMultiLine() {
-        return false;
-    }
-
-    @Override
-    protected Control createDialogArea(Composite parent) {
-        Composite area = (Composite) super.createDialogArea(parent);
-
-        Composite workaround = PropertyFactory.addWorkaround(area);
-        if (workaround != null) {
-            workaround.setLayoutData(new GridData(SWT.LEFT, SWT.TOP, false, false, 1, 1));
-        }
-
-        return area;
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/properties/ValueCompleter.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/properties/ValueCompleter.java
deleted file mode 100644
index 5559349..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/properties/ValueCompleter.java
+++ /dev/null
@@ -1,186 +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.ide.eclipse.adt.internal.editors.layout.properties;
-
-import static com.android.SdkConstants.ATTR_TEXT_SIZE;
-import static com.android.SdkConstants.PREFIX_RESOURCE_REF;
-import static com.android.SdkConstants.PREFIX_THEME_REF;
-import static com.android.SdkConstants.UNIT_DP;
-import static com.android.SdkConstants.UNIT_SP;
-import static com.android.SdkConstants.VALUE_FALSE;
-import static com.android.SdkConstants.VALUE_TRUE;
-import static com.android.ide.common.api.IAttributeInfo.Format.BOOLEAN;
-import static com.android.ide.common.api.IAttributeInfo.Format.DIMENSION;
-import static com.android.ide.common.api.IAttributeInfo.Format.ENUM;
-import static com.android.ide.common.api.IAttributeInfo.Format.FLAG;
-import static com.android.ide.common.api.IAttributeInfo.Format.FLOAT;
-import static com.android.ide.common.api.IAttributeInfo.Format.INTEGER;
-import static com.android.ide.common.api.IAttributeInfo.Format.REFERENCE;
-import static com.android.ide.common.api.IAttributeInfo.Format.STRING;
-
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-import com.android.ide.common.api.IAttributeInfo;
-import com.android.ide.common.api.IAttributeInfo.Format;
-import com.android.ide.eclipse.adt.internal.editors.common.CommonXmlEditor;
-import com.android.ide.eclipse.adt.internal.editors.descriptors.AttributeDescriptor;
-import com.android.utils.SdkUtils;
-
-import org.eclipse.jface.fieldassist.ContentProposal;
-import org.eclipse.jface.fieldassist.IContentProposal;
-import org.eclipse.jface.fieldassist.IContentProposalProvider;
-
-import java.util.ArrayList;
-import java.util.EnumSet;
-import java.util.List;
-
-/**
- * An {@link IContentProposalProvider} which completes possible property values
- * for Android properties, completing resource strings, flag values, enum
- * values, as well as dimension units.
- */
-abstract class ValueCompleter implements IContentProposalProvider {
-    @Nullable
-    protected abstract CommonXmlEditor getEditor();
-
-    @NonNull
-    protected abstract AttributeDescriptor getDescriptor();
-
-    @Override
-    public IContentProposal[] getProposals(String contents, int position) {
-        AttributeDescriptor descriptor = getDescriptor();
-        IAttributeInfo info = descriptor.getAttributeInfo();
-        EnumSet<Format> formats = info.getFormats();
-
-        List<IContentProposal> proposals = new ArrayList<IContentProposal>();
-
-        String prefix = contents; // TODO: Go back to position inside the array?
-
-        // TODO: If the user is typing in a number, or a number plus a prefix of a dimension unit,
-        // then propose that number plus the completed dimension unit (using sp for text, dp
-        // for other properties and maybe both if I'm not sure)
-        if (formats.contains(STRING)
-                && !contents.isEmpty()
-                && (formats.size() > 1 && formats.contains(REFERENCE) ||
-                        formats.size() > 2)
-                && !contents.startsWith(PREFIX_RESOURCE_REF)
-                && !contents.startsWith(PREFIX_THEME_REF)) {
-            proposals.add(new ContentProposal(contents));
-        }
-
-        if (!contents.isEmpty() && Character.isDigit(contents.charAt(0))
-                && (formats.contains(DIMENSION)
-                        || formats.contains(INTEGER)
-                        || formats.contains(FLOAT))) {
-            StringBuilder sb = new StringBuilder();
-            for (int i = 0, n = contents.length(); i < n; i++) {
-                char c = contents.charAt(i);
-                if (Character.isDigit(c)) {
-                    sb.append(c);
-                } else {
-                    break;
-                }
-            }
-
-            String number = sb.toString();
-            if (formats.contains(Format.DIMENSION)) {
-                if (descriptor.getXmlLocalName().equals(ATTR_TEXT_SIZE)) {
-                    proposals.add(new ContentProposal(number + UNIT_SP));
-                }
-                proposals.add(new ContentProposal(number + UNIT_DP));
-            } else if (formats.contains(Format.INTEGER)) {
-                proposals.add(new ContentProposal(number));
-            }
-            // Perhaps offer other units too -- see AndroidContentAssist.sDimensionUnits
-        }
-
-        if (formats.contains(REFERENCE) || contents.startsWith(PREFIX_RESOURCE_REF)
-                || contents.startsWith(PREFIX_THEME_REF)) {
-            CommonXmlEditor editor = getEditor();
-            if (editor != null) {
-                String[] matches = ResourceValueCompleter.computeResourceStringMatches(
-                        editor,
-                        descriptor, contents.substring(0, position));
-                for (String match : matches) {
-                    proposals.add(new ContentProposal(match));
-                }
-            }
-        }
-
-        if (formats.contains(FLAG)) {
-            String[] values = info.getFlagValues();
-            if (values != null) {
-                // Flag completion
-                int flagStart = prefix.lastIndexOf('|');
-                String prepend = null;
-                if (flagStart != -1) {
-                    prepend = prefix.substring(0, flagStart + 1);
-                    prefix = prefix.substring(flagStart + 1).trim();
-                }
-
-                boolean exactMatch = false;
-                for (String value : values) {
-                    if (prefix.equals(value)) {
-                        exactMatch = true;
-                        proposals.add(new ContentProposal(contents));
-
-                        break;
-                    }
-                }
-
-                if (exactMatch) {
-                    prepend = contents + '|';
-                    prefix = "";
-                }
-
-                for (String value : values) {
-                    if (SdkUtils.startsWithIgnoreCase(value, prefix)) {
-                        if (prepend != null && prepend.contains(value)) {
-                            continue;
-                        }
-                        String match;
-                        if (prepend != null) {
-                            match = prepend + value;
-                        } else {
-                            match = value;
-                        }
-                        proposals.add(new ContentProposal(match));
-                    }
-                }
-            }
-        } else if (formats.contains(ENUM)) {
-            String[] values = info.getEnumValues();
-            if (values != null) {
-                for (String value : values) {
-                    if (SdkUtils.startsWithIgnoreCase(value, prefix)) {
-                        proposals.add(new ContentProposal(value));
-                    }
-                }
-
-                for (String value : values) {
-                    if (!SdkUtils.startsWithIgnoreCase(value, prefix)) {
-                        proposals.add(new ContentProposal(value));
-                    }
-                }
-            }
-        } else if (formats.contains(BOOLEAN)) {
-            proposals.add(new ContentProposal(VALUE_TRUE));
-            proposals.add(new ContentProposal(VALUE_FALSE));
-        }
-
-        return proposals.toArray(new IContentProposal[proposals.size()]);
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/properties/XmlProperty.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/properties/XmlProperty.java
deleted file mode 100644
index a320b68..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/properties/XmlProperty.java
+++ /dev/null
@@ -1,278 +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.ide.eclipse.adt.internal.editors.layout.properties;
-
-import static com.android.SdkConstants.ATTR_LAYOUT_MARGIN;
-import static com.android.SdkConstants.ATTR_LAYOUT_RESOURCE_PREFIX;
-
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-import com.android.ide.common.api.IAttributeInfo;
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.ide.eclipse.adt.internal.editors.common.CommonXmlEditor;
-import com.android.ide.eclipse.adt.internal.editors.descriptors.AttributeDescriptor;
-import com.android.ide.eclipse.adt.internal.editors.descriptors.DescriptorsUtils;
-import com.android.ide.eclipse.adt.internal.editors.layout.gle2.GraphicalEditorPart;
-import com.android.ide.eclipse.adt.internal.editors.layout.gle2.ViewHierarchy;
-import com.android.ide.eclipse.adt.internal.editors.layout.uimodel.UiViewElementNode;
-
-import org.eclipse.jface.fieldassist.IContentProposal;
-import org.eclipse.jface.fieldassist.IContentProposalProvider;
-import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.jface.viewers.LabelProvider;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.ui.views.properties.IPropertyDescriptor;
-import org.eclipse.wb.internal.core.model.property.Property;
-import org.eclipse.wb.internal.core.model.property.editor.PropertyEditor;
-import org.eclipse.wb.internal.core.model.property.table.PropertyTooltipProvider;
-import org.eclipse.wb.internal.core.model.property.table.PropertyTooltipTextProvider;
-import org.w3c.dom.Attr;
-import org.w3c.dom.Element;
-
-import java.util.Map;
-
-/**
- * An Android XML property
- */
-class XmlProperty extends Property {
-    private PropertyFactory mFactory;
-    final AttributeDescriptor mDescriptor;
-    private UiViewElementNode mNode;
-    private Property mParent;
-
-    XmlProperty(
-            @NonNull PropertyEditor editor,
-            @NonNull PropertyFactory factory,
-            @NonNull UiViewElementNode node,
-            @NonNull AttributeDescriptor descriptor) {
-        super(editor);
-        mFactory = factory;
-        mNode = node;
-        mDescriptor = descriptor;
-    }
-
-    @NonNull
-    public PropertyFactory getFactory() {
-        return mFactory;
-    }
-
-    @NonNull
-    public UiViewElementNode getNode() {
-        return mNode;
-    }
-
-    @NonNull
-    public AttributeDescriptor getDescriptor() {
-        return mDescriptor;
-    }
-
-    @Override
-    @NonNull
-    public String getName() {
-        return mDescriptor.getXmlLocalName();
-    }
-
-    @Override
-    @NonNull
-    public String getTitle() {
-        String name = mDescriptor.getXmlLocalName();
-        int nameLength = name.length();
-
-        if (name.startsWith(ATTR_LAYOUT_RESOURCE_PREFIX)) {
-            if (name.startsWith(ATTR_LAYOUT_MARGIN)
-                    && nameLength > ATTR_LAYOUT_MARGIN.length()) {
-                name = name.substring(ATTR_LAYOUT_MARGIN.length());
-            } else {
-                name = name.substring(ATTR_LAYOUT_RESOURCE_PREFIX.length());
-            }
-        }
-
-        // Capitalize
-        name = DescriptorsUtils.capitalize(name);
-
-        // If we're nested within a complex property, say "Line Spacing", don't
-        // include "Line Spacing " as a prefix for each property here
-        if (mParent != null) {
-            String parentTitle = mParent.getTitle();
-            if (name.startsWith(parentTitle)) {
-                int parentTitleLength = parentTitle.length();
-                if (parentTitleLength < nameLength) {
-                    if (nameLength > parentTitleLength &&
-                            Character.isWhitespace(name.charAt(parentTitleLength))) {
-                        parentTitleLength++;
-                    }
-                    name = name.substring(parentTitleLength);
-                }
-            }
-        }
-
-        return name;
-    }
-
-    @Override
-    public <T> T getAdapter(Class<T> adapter) {
-        // tooltip
-        if (adapter == PropertyTooltipProvider.class) {
-            return adapter.cast(new PropertyTooltipTextProvider() {
-                @Override
-                protected String getText(Property p) throws Exception {
-                    if (mDescriptor instanceof IPropertyDescriptor) {
-                        IPropertyDescriptor d = (IPropertyDescriptor) mDescriptor;
-                        return d.getDescription();
-                    }
-
-                    return null;
-                }
-            });
-        } else if (adapter == IContentProposalProvider.class) {
-            IAttributeInfo info = mDescriptor.getAttributeInfo();
-            if (info != null) {
-                return adapter.cast(new PropertyValueCompleter(this));
-            }
-            // Fallback: complete values on resource values
-            return adapter.cast(new ResourceValueCompleter(this));
-        } else if (adapter == ILabelProvider.class) {
-            return adapter.cast(new LabelProvider() {
-                @Override
-              public Image getImage(Object element) {
-                  return AdtPlugin.getAndroidLogo();
-              }
-
-              @Override
-              public String getText(Object element) {
-                  return ((IContentProposal) element).getLabel();
-              }
-            });
-        }
-        return super.getAdapter(adapter);
-    }
-
-    @Override
-    public boolean isModified() throws Exception {
-        Object s = null;
-        try {
-            Element element = (Element) mNode.getXmlNode();
-            if (element == null) {
-                return false;
-            }
-            String name = mDescriptor.getXmlLocalName();
-            String uri = mDescriptor.getNamespaceUri();
-            if (uri != null) {
-                return element.hasAttributeNS(uri, name);
-            } else {
-                return element.hasAttribute(name);
-            }
-        } catch (Exception e) {
-            // pass
-        }
-        return s != null && s.toString().length() > 0;
-    }
-
-    @Nullable
-    public String getStringValue() {
-        Element element = (Element) mNode.getXmlNode();
-        if (element == null) {
-            return null;
-        }
-        String name = mDescriptor.getXmlLocalName();
-        String uri = mDescriptor.getNamespaceUri();
-        Attr attr;
-        if (uri != null) {
-            attr = element.getAttributeNodeNS(uri, name);
-        } else {
-            attr = element.getAttributeNode(name);
-        }
-        if (attr != null) {
-            return attr.getValue();
-        }
-
-        Object viewObject = getFactory().getCurrentViewObject();
-        if (viewObject != null) {
-            GraphicalEditorPart graphicalEditor = getGraphicalEditor();
-            if (graphicalEditor == null) {
-                return null;
-            }
-            ViewHierarchy views = graphicalEditor.getCanvasControl().getViewHierarchy();
-            Map<String, String> defaultProperties = views.getDefaultProperties(viewObject);
-            if (defaultProperties != null) {
-                return defaultProperties.get(name);
-            }
-        }
-
-        return null;
-    }
-
-    @Override
-    @Nullable
-    public Object getValue() throws Exception {
-        return getStringValue();
-    }
-
-    @Override
-    public void setValue(Object value) throws Exception {
-        CommonXmlEditor editor = getXmlEditor();
-        if (editor == null) {
-            return;
-        }
-        final String attribute = mDescriptor.getXmlLocalName();
-        final String xmlValue = value != null && value != UNKNOWN_VALUE ? value.toString() : null;
-        editor.wrapUndoEditXmlModel(
-                String.format("Set \"%1$s\" to \"%2$s\"", attribute, xmlValue),
-                new Runnable() {
-            @Override
-            public void run() {
-                mNode.setAttributeValue(attribute,
-                        mDescriptor.getNamespaceUri(), xmlValue, true /*override*/);
-                mNode.commitDirtyAttributesToXml();
-            }
-        });
-    }
-
-    @Override
-    @NonNull
-    public Property getComposite(Property[] properties) {
-        return XmlPropertyComposite.create(properties);
-    }
-
-    @Nullable
-    GraphicalEditorPart getGraphicalEditor() {
-        return mFactory.getGraphicalEditor();
-    }
-
-    @Nullable
-    CommonXmlEditor getXmlEditor() {
-        GraphicalEditorPart graphicalEditor = getGraphicalEditor();
-        if (graphicalEditor != null) {
-            return graphicalEditor.getEditorDelegate().getEditor();
-        }
-
-        return null;
-    }
-
-    @Nullable
-    public Property getParent() {
-        return mParent;
-    }
-
-    public void setParent(@Nullable Property parent) {
-        mParent = parent;
-    }
-
-    @Override
-    public String toString() {
-        return getName() + ":" + getPriority();
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/properties/XmlPropertyComposite.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/properties/XmlPropertyComposite.java
deleted file mode 100644
index af9e13b..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/properties/XmlPropertyComposite.java
+++ /dev/null
@@ -1,121 +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.ide.eclipse.adt.internal.editors.layout.properties;
-
-import com.android.annotations.NonNull;
-import com.google.common.base.Objects;
-
-import org.eclipse.wb.internal.core.model.property.Property;
-
-import java.util.Arrays;
-
-/**
- * Property holding multiple instances of the same {@link XmlProperty} (but
- * bound to difference objects. This is used when multiple objects are selected
- * in the layout editor and the common properties are shown; editing a value
- * will (via {@link #setValue(Object)}) set it on all selected objects.
- * <p>
- * Similar to
- * org.eclipse.wb.internal.core.model.property.GenericPropertyComposite
- */
-class XmlPropertyComposite extends XmlProperty {
-    private static final Object NO_VALUE = new Object();
-
-    private final XmlProperty[] mProperties;
-
-    public XmlPropertyComposite(XmlProperty primary, XmlProperty[] properties) {
-        super(
-            primary.getEditor(),
-            primary.getFactory(),
-            primary.getNode(),
-            primary.getDescriptor());
-        mProperties = properties;
-    }
-
-    @Override
-    @NonNull
-    public String getTitle() {
-        return mProperties[0].getTitle();
-    }
-
-    @Override
-    public int hashCode() {
-        return mProperties.length;
-    }
-
-    @Override
-    public boolean equals(Object obj) {
-        if (obj == this) {
-            return true;
-        }
-
-        if (obj instanceof XmlPropertyComposite) {
-            XmlPropertyComposite property = (XmlPropertyComposite) obj;
-            return Arrays.equals(mProperties, property.mProperties);
-        }
-
-        return false;
-    }
-
-    @Override
-    public boolean isModified() throws Exception {
-        for (Property property : mProperties) {
-            if (property.isModified()) {
-                return true;
-            }
-        }
-
-        return false;
-    }
-
-    @Override
-    public Object getValue() throws Exception {
-        Object value = NO_VALUE;
-        for (Property property : mProperties) {
-            Object propertyValue = property.getValue();
-            if (value == NO_VALUE) {
-                value = propertyValue;
-            } else if (!Objects.equal(value, propertyValue)) {
-                return UNKNOWN_VALUE;
-            }
-        }
-
-        return value;
-    }
-
-    @Override
-    public void setValue(final Object value) throws Exception {
-        // TBD: Wrap in ExecutionUtils.run?
-        for (Property property : mProperties) {
-            property.setValue(value);
-        }
-    }
-
-    @NonNull
-    public static XmlPropertyComposite create(Property... properties) {
-        // Cast from Property into XmlProperty
-        XmlProperty[] xmlProperties = new XmlProperty[properties.length];
-        for (int i = 0; i < properties.length; i++) {
-            Property property = properties[i];
-            xmlProperties[i] = (XmlProperty) property;
-        }
-
-        XmlPropertyComposite composite = new XmlPropertyComposite(xmlProperties[0], xmlProperties);
-        composite.setCategory(xmlProperties[0].getCategory());
-        return composite;
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/properties/XmlPropertyEditor.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/properties/XmlPropertyEditor.java
deleted file mode 100644
index 87fb0e6..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/properties/XmlPropertyEditor.java
+++ /dev/null
@@ -1,548 +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.ide.eclipse.adt.internal.editors.layout.properties;
-
-import static com.android.SdkConstants.ANDROID_PREFIX;
-import static com.android.SdkConstants.ANDROID_THEME_PREFIX;
-import static com.android.SdkConstants.ATTR_ID;
-import static com.android.SdkConstants.DOT_PNG;
-import static com.android.SdkConstants.DOT_XML;
-import static com.android.SdkConstants.NEW_ID_PREFIX;
-import static com.android.SdkConstants.PREFIX_RESOURCE_REF;
-import static com.android.SdkConstants.PREFIX_THEME_REF;
-import static com.android.ide.common.layout.BaseViewRule.stripIdPrefix;
-
-import com.android.annotations.NonNull;
-import com.android.ide.common.api.IAttributeInfo;
-import com.android.ide.common.api.IAttributeInfo.Format;
-import com.android.ide.common.layout.BaseViewRule;
-import com.android.ide.common.rendering.api.ResourceValue;
-import com.android.ide.common.resources.ResourceRepository;
-import com.android.ide.common.resources.ResourceResolver;
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.ide.eclipse.adt.internal.editors.common.CommonXmlEditor;
-import com.android.ide.eclipse.adt.internal.editors.layout.LayoutEditorDelegate;
-import com.android.ide.eclipse.adt.internal.editors.layout.gle2.GraphicalEditorPart;
-import com.android.ide.eclipse.adt.internal.editors.layout.gle2.ImageUtils;
-import com.android.ide.eclipse.adt.internal.editors.layout.gle2.LayoutCanvas;
-import com.android.ide.eclipse.adt.internal.editors.layout.gle2.RenderService;
-import com.android.ide.eclipse.adt.internal.editors.layout.gle2.SelectionManager;
-import com.android.ide.eclipse.adt.internal.editors.layout.gle2.SwtUtils;
-import com.android.ide.eclipse.adt.internal.editors.layout.gre.NodeProxy;
-import com.android.ide.eclipse.adt.internal.preferences.AdtPrefs;
-import com.android.ide.eclipse.adt.internal.refactorings.core.RenameResourceWizard;
-import com.android.ide.eclipse.adt.internal.refactorings.core.RenameResult;
-import com.android.ide.eclipse.adt.internal.resources.ResourceHelper;
-import com.android.ide.eclipse.adt.internal.resources.manager.ResourceManager;
-import com.android.ide.eclipse.adt.internal.ui.ReferenceChooserDialog;
-import com.android.ide.eclipse.adt.internal.ui.ResourceChooser;
-import com.android.ide.eclipse.adt.internal.ui.ResourcePreviewHelper;
-import com.android.resources.ResourceType;
-import com.google.common.collect.Maps;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.QualifiedName;
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.jface.dialogs.MessageDialogWithToggle;
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.jface.window.Window;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.GC;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.graphics.ImageData;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.graphics.RGB;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.wb.draw2d.IColorConstants;
-import org.eclipse.wb.internal.core.model.property.Property;
-import org.eclipse.wb.internal.core.model.property.editor.AbstractTextPropertyEditor;
-import org.eclipse.wb.internal.core.model.property.editor.presentation.ButtonPropertyEditorPresentation;
-import org.eclipse.wb.internal.core.model.property.editor.presentation.PropertyEditorPresentation;
-import org.eclipse.wb.internal.core.model.property.table.PropertyTable;
-import org.eclipse.wb.internal.core.utils.ui.DrawUtils;
-
-import java.awt.image.BufferedImage;
-import java.io.File;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.EnumSet;
-import java.util.List;
-import java.util.Map;
-
-import javax.imageio.ImageIO;
-
-/**
- * Special property editor used for the {@link XmlProperty} instances which handles
- * editing the XML properties, rendering defaults by looking up the actual colors and images,
- */
-class XmlPropertyEditor extends AbstractTextPropertyEditor {
-    public static final XmlPropertyEditor INSTANCE = new XmlPropertyEditor();
-    private static final int SAMPLE_SIZE = 10;
-    private static final int SAMPLE_MARGIN = 3;
-
-    protected XmlPropertyEditor() {
-    }
-
-    private final PropertyEditorPresentation mPresentation =
-            new ButtonPropertyEditorPresentation() {
-        @Override
-        protected void onClick(PropertyTable propertyTable, Property property) throws Exception {
-            openDialog(propertyTable, property);
-        }
-    };
-
-    @Override
-    public PropertyEditorPresentation getPresentation() {
-        return mPresentation;
-    }
-
-    @Override
-    public String getText(Property property) throws Exception {
-        Object value = property.getValue();
-        if (value instanceof String) {
-            return (String) value;
-        }
-        return null;
-    }
-
-    @Override
-    protected String getEditorText(Property property) throws Exception {
-        return getText(property);
-    }
-
-    @Override
-    public void paint(Property property, GC gc, int x, int y, int width, int height)
-            throws Exception {
-        String text = getText(property);
-        if (text != null) {
-            ResourceValue resValue = null;
-            String resolvedText = null;
-
-            // TODO: Use the constants for @, ?, @android: etc
-            if (text.startsWith("@") || text.startsWith("?")) { //$NON-NLS-1$ //$NON-NLS-2$
-                // Yes, try to resolve it in order to show better info
-                XmlProperty xmlProperty = (XmlProperty) property;
-                GraphicalEditorPart graphicalEditor = xmlProperty.getGraphicalEditor();
-                if (graphicalEditor != null) {
-                    ResourceResolver resolver = graphicalEditor.getResourceResolver();
-                    boolean isFramework = text.startsWith(ANDROID_PREFIX)
-                            || text.startsWith(ANDROID_THEME_PREFIX);
-                    resValue = resolver.findResValue(text, isFramework);
-                    while (resValue != null && resValue.getValue() != null) {
-                        String value = resValue.getValue();
-                        if (value.startsWith(PREFIX_RESOURCE_REF)
-                                || value.startsWith(PREFIX_THEME_REF)) {
-                            // TODO: do I have to strip off the @ too?
-                            isFramework = isFramework
-                                    || value.startsWith(ANDROID_PREFIX)
-                                    || value.startsWith(ANDROID_THEME_PREFIX);
-                            ResourceValue v = resolver.findResValue(text, isFramework);
-                            if (v != null && !value.equals(v.getValue())) {
-                                resValue = v;
-                            } else {
-                                break;
-                            }
-                        } else {
-                            break;
-                        }
-                    }
-                }
-            } else if (text.startsWith("#") && text.matches("#\\p{XDigit}+")) { //$NON-NLS-1$
-                resValue = new ResourceValue(ResourceType.COLOR, property.getName(), text, false);
-            }
-
-            if (resValue != null && resValue.getValue() != null) {
-                String value = resValue.getValue();
-                // Decide whether it's a color, an image, a nine patch etc
-                // and decide how to render it
-                if (value.startsWith("#") || value.endsWith(DOT_XML) //$NON-NLS-1$
-                        && value.contains("res/color")) { //$NON-NLS-1$ // TBD: File.separator?
-                    XmlProperty xmlProperty = (XmlProperty) property;
-                    GraphicalEditorPart graphicalEditor = xmlProperty.getGraphicalEditor();
-                    if (graphicalEditor != null) {
-                        ResourceResolver resolver = graphicalEditor.getResourceResolver();
-                        RGB rgb = ResourceHelper.resolveColor(resolver, resValue);
-                        if (rgb != null) {
-                            Color color = new Color(gc.getDevice(), rgb);
-                            // draw color sample
-                            Color oldBackground = gc.getBackground();
-                            Color oldForeground = gc.getForeground();
-                            try {
-                                int width_c = SAMPLE_SIZE;
-                                int height_c = SAMPLE_SIZE;
-                                int x_c = x;
-                                int y_c = y + (height - height_c) / 2;
-                                // update rest bounds
-                                int delta = SAMPLE_SIZE + SAMPLE_MARGIN;
-                                x += delta;
-                                width -= delta;
-                                // fill
-                                gc.setBackground(color);
-                                gc.fillRectangle(x_c, y_c, width_c, height_c);
-                                // draw line
-                                gc.setForeground(IColorConstants.gray);
-                                gc.drawRectangle(x_c, y_c, width_c, height_c);
-                            } finally {
-                                gc.setBackground(oldBackground);
-                                gc.setForeground(oldForeground);
-                            }
-                            color.dispose();
-                        }
-                    }
-                } else {
-                    Image swtImage = null;
-                    if (value.endsWith(DOT_XML) && value.contains("res/drawable")) { // TBD: Filesep?
-                        Map<String, Image> cache = getImageCache(property);
-                        swtImage = cache.get(value);
-                        if (swtImage == null) {
-                            XmlProperty xmlProperty = (XmlProperty) property;
-                            GraphicalEditorPart graphicalEditor = xmlProperty.getGraphicalEditor();
-                            RenderService service = RenderService.create(graphicalEditor);
-                            service.setOverrideRenderSize(SAMPLE_SIZE, SAMPLE_SIZE);
-                            BufferedImage drawable = service.renderDrawable(resValue);
-                            if (drawable != null) {
-                                swtImage = SwtUtils.convertToSwt(gc.getDevice(), drawable,
-                                        true /*transferAlpha*/, -1);
-                                cache.put(value, swtImage);
-                            }
-                        }
-                    } else if (value.endsWith(DOT_PNG)) {
-                        // TODO: 9-patch handling?
-                        //if (text.endsWith(DOT_9PNG)) {
-                        //    // 9-patch image: How do we paint this?
-                        //    URL url = new File(text).toURI().toURL();
-                        //    NinePatch ninepatch = NinePatch.load(url, false /* ?? */);
-                        //    BufferedImage image = ninepatch.getImage();
-                        //}
-                        Map<String, Image> cache = getImageCache(property);
-                        swtImage = cache.get(value);
-                        if (swtImage == null) {
-                            File file = new File(value);
-                            if (file.exists()) {
-                                try {
-                                    BufferedImage awtImage = ImageIO.read(file);
-                                    if (awtImage != null && awtImage.getWidth() > 0
-                                            && awtImage.getHeight() > 0) {
-                                        awtImage = ImageUtils.cropBlank(awtImage, null);
-                                        if (awtImage != null) {
-                                            // Scale image
-                                            int imageWidth = awtImage.getWidth();
-                                            int imageHeight = awtImage.getHeight();
-                                            int maxWidth = 3 * height;
-
-                                            if (imageWidth > maxWidth || imageHeight > height) {
-                                                double scale = height / (double) imageHeight;
-                                                int scaledWidth = (int) (imageWidth * scale);
-                                                if (scaledWidth > maxWidth) {
-                                                    scale = maxWidth / (double) imageWidth;
-                                                }
-                                                awtImage = ImageUtils.scale(awtImage, scale,
-                                                        scale);
-                                            }
-                                            swtImage = SwtUtils.convertToSwt(gc.getDevice(),
-                                                    awtImage, true /*transferAlpha*/, -1);
-                                        }
-                                    }
-                                } catch (IOException e) {
-                                    AdtPlugin.log(e, value);
-                                }
-                            }
-                            cache.put(value, swtImage);
-                        }
-
-                    } else if (value != null) {
-                        // It's a normal string: if different from the text, paint
-                        // it in parentheses, e.g.
-                        //   @string/foo: Foo Bar (probably cropped)
-                        if (!value.equals(text) && !value.equals("@null")) { //$NON-NLS-1$
-                            resolvedText = value;
-                        }
-                    }
-
-                    if (swtImage != null) {
-                        // Make a square the size of the height
-                        ImageData imageData = swtImage.getImageData();
-                        int imageWidth = imageData.width;
-                        int imageHeight = imageData.height;
-                        if (imageWidth > 0 && imageHeight > 0) {
-                            gc.drawImage(swtImage, x, y + (height - imageHeight) / 2);
-                            int delta = imageWidth + SAMPLE_MARGIN;
-                            x += delta;
-                            width -= delta;
-                        }
-                    }
-                }
-            }
-
-            DrawUtils.drawStringCV(gc, text, x, y, width, height);
-
-            if (resolvedText != null && resolvedText.length() > 0) {
-                Point size = gc.stringExtent(text);
-                x += size.x;
-                width -= size.x;
-
-                x += SAMPLE_MARGIN;
-                width -= SAMPLE_MARGIN;
-
-                if (width > 0) {
-                    Color oldForeground = gc.getForeground();
-                    try {
-                        gc.setForeground(PropertyTable.COLOR_PROPERTY_FG_DEFAULT);
-                        DrawUtils.drawStringCV(gc, '(' + resolvedText + ')', x, y, width, height);
-                    } finally {
-                        gc.setForeground(oldForeground);
-                    }
-                }
-            }
-        }
-    }
-
-    @Override
-    protected boolean setEditorText(Property property, String text) throws Exception {
-        Object oldValue = property.getValue();
-        String old = oldValue != null ? oldValue.toString() : null;
-
-        // If users enters a new id without specifying the @id/@+id prefix, insert it
-        boolean isId = isIdProperty(property);
-        if (isId && !text.startsWith(PREFIX_RESOURCE_REF)) {
-            text = NEW_ID_PREFIX + text;
-        }
-
-        // Handle id refactoring: if you change an id, may want to update references too.
-        // Ask user.
-        if (isId && property instanceof XmlProperty
-                && old != null && !old.isEmpty()
-                && text != null && !text.isEmpty()
-                && !text.equals(old)) {
-            XmlProperty xmlProperty = (XmlProperty) property;
-            IPreferenceStore store = AdtPlugin.getDefault().getPreferenceStore();
-            String refactorPref = store.getString(AdtPrefs.PREFS_REFACTOR_IDS);
-            boolean performRefactor = false;
-            Shell shell = AdtPlugin.getShell();
-            if (refactorPref == null
-                    || refactorPref.isEmpty()
-                    || refactorPref.equals(MessageDialogWithToggle.PROMPT)) {
-                MessageDialogWithToggle dialog =
-                        MessageDialogWithToggle.openYesNoCancelQuestion(
-                    shell,
-                    "Update References?",
-                    "Update all references as well? " +
-                    "This will update all XML references and Java R field references.",
-                    "Do not show again",
-                    false,
-                    store,
-                    AdtPrefs.PREFS_REFACTOR_IDS);
-                switch (dialog.getReturnCode()) {
-                    case IDialogConstants.CANCEL_ID:
-                        return false;
-                    case IDialogConstants.YES_ID:
-                        performRefactor = true;
-                        break;
-                    case IDialogConstants.NO_ID:
-                        performRefactor = false;
-                        break;
-                }
-            } else {
-                performRefactor = refactorPref.equals(MessageDialogWithToggle.ALWAYS);
-            }
-            if (performRefactor) {
-                CommonXmlEditor xmlEditor = xmlProperty.getXmlEditor();
-                if (xmlEditor != null) {
-                    IProject project = xmlEditor.getProject();
-                    if (project != null && shell != null) {
-                        RenameResourceWizard.renameResource(shell, project,
-                                ResourceType.ID, stripIdPrefix(old), stripIdPrefix(text), false);
-                    }
-                }
-            }
-        }
-
-        property.setValue(text);
-
-        return true;
-    }
-
-    private static boolean isIdProperty(Property property) {
-        XmlProperty xmlProperty = (XmlProperty) property;
-        return xmlProperty.getDescriptor().getXmlLocalName().equals(ATTR_ID);
-    }
-
-    private void openDialog(PropertyTable propertyTable, Property property) throws Exception {
-        XmlProperty xmlProperty = (XmlProperty) property;
-        IAttributeInfo attributeInfo = xmlProperty.getDescriptor().getAttributeInfo();
-
-        if (isIdProperty(property)) {
-            Object value = xmlProperty.getValue();
-            if (value != null && !value.toString().isEmpty()) {
-                GraphicalEditorPart editor = xmlProperty.getGraphicalEditor();
-                if (editor != null) {
-                    LayoutCanvas canvas = editor.getCanvasControl();
-                    SelectionManager manager = canvas.getSelectionManager();
-
-                    NodeProxy primary = canvas.getNodeFactory().create(xmlProperty.getNode());
-                    if (primary != null) {
-                        RenameResult result = manager.performRename(primary, null);
-                        if (result.isCanceled()) {
-                            return;
-                        } else if (!result.isUnavailable()) {
-                            String name = result.getName();
-                            String id = NEW_ID_PREFIX + BaseViewRule.stripIdPrefix(name);
-                            xmlProperty.setValue(id);
-                            return;
-                        }
-                    }
-                }
-            }
-
-            // When editing the id attribute, don't offer a resource chooser: usually
-            // you want to enter a *new* id here
-            attributeInfo = null;
-        }
-
-        boolean referenceAllowed = false;
-        if (attributeInfo != null) {
-            EnumSet<Format> formats = attributeInfo.getFormats();
-            ResourceType type = null;
-            List<ResourceType> types = null;
-            if (formats.contains(Format.FLAG)) {
-                String[] flagValues = attributeInfo.getFlagValues();
-                if (flagValues != null) {
-                    FlagXmlPropertyDialog dialog =
-                        new FlagXmlPropertyDialog(propertyTable.getShell(),
-                                "Select Flag Values", false /* radio */,
-                                flagValues, xmlProperty);
-
-                    dialog.open();
-                    return;
-                }
-            } else if (formats.contains(Format.ENUM)) {
-                String[] enumValues = attributeInfo.getEnumValues();
-                if (enumValues != null) {
-                    FlagXmlPropertyDialog dialog =
-                        new FlagXmlPropertyDialog(propertyTable.getShell(),
-                                "Select Enum Value", true /* radio */,
-                                enumValues, xmlProperty);
-                    dialog.open();
-                    return;
-                }
-            } else {
-                for (Format format : formats) {
-                    ResourceType t = format.getResourceType();
-                    if (t != null) {
-                        if (type != null) {
-                            if (types == null) {
-                                types = new ArrayList<ResourceType>();
-                                types.add(type);
-                            }
-                            types.add(t);
-                        }
-                        type = t;
-                    } else if (format == Format.REFERENCE) {
-                        referenceAllowed = true;
-                    }
-                }
-            }
-            if (types != null || referenceAllowed) {
-                // Multiple resource types (such as string *and* boolean):
-                // just use a reference chooser
-                GraphicalEditorPart graphicalEditor = xmlProperty.getGraphicalEditor();
-                if (graphicalEditor != null) {
-                    LayoutEditorDelegate delegate = graphicalEditor.getEditorDelegate();
-                    IProject project = delegate.getEditor().getProject();
-                    if (project != null) {
-                        // get the resource repository for this project and the system resources.
-                        ResourceRepository projectRepository =
-                            ResourceManager.getInstance().getProjectResources(project);
-                        Shell shell = AdtPlugin.getShell();
-                        ReferenceChooserDialog dlg = new ReferenceChooserDialog(
-                                project,
-                                projectRepository,
-                                shell);
-                        dlg.setPreviewHelper(new ResourcePreviewHelper(dlg, graphicalEditor));
-
-                        String currentValue = (String) property.getValue();
-                        dlg.setCurrentResource(currentValue);
-
-                        if (dlg.open() == Window.OK) {
-                            String resource = dlg.getCurrentResource();
-                            if (resource != null) {
-                                // Returns null for cancel, "" for clear and otherwise a new value
-                                if (resource.length() > 0) {
-                                    property.setValue(resource);
-                                } else {
-                                    property.setValue(null);
-                                }
-                            }
-                        }
-
-                        return;
-                    }
-                }
-            } else if (type != null) {
-                // Single resource type: use a resource chooser
-                GraphicalEditorPart graphicalEditor = xmlProperty.getGraphicalEditor();
-                if (graphicalEditor != null) {
-                    String currentValue = (String) property.getValue();
-                    // TODO: Add validator factory?
-                    String resource = ResourceChooser.chooseResource(graphicalEditor,
-                            type, currentValue, null /* validator */);
-                    // Returns null for cancel, "" for clear and otherwise a new value
-                    if (resource != null) {
-                        if (resource.length() > 0) {
-                            property.setValue(resource);
-                        } else {
-                            property.setValue(null);
-                        }
-                    }
-                }
-
-                return;
-            }
-        }
-
-        // Fallback: Just use a plain string editor
-        StringXmlPropertyDialog dialog =
-                new StringXmlPropertyDialog(propertyTable.getShell(), property);
-        if (dialog.open() == Window.OK) {
-            // TODO: Do I need to activate?
-        }
-    }
-
-    /** Qualified name for the per-project persistent property include-map */
-    private final static QualifiedName CACHE_NAME = new QualifiedName(AdtPlugin.PLUGIN_ID,
-            "property-images");//$NON-NLS-1$
-
-    @NonNull
-    private static Map<String, Image> getImageCache(@NonNull Property property) {
-        XmlProperty xmlProperty = (XmlProperty) property;
-        GraphicalEditorPart graphicalEditor = xmlProperty.getGraphicalEditor();
-        IProject project = graphicalEditor.getProject();
-        try {
-            Map<String, Image> cache = (Map<String, Image>) project.getSessionProperty(CACHE_NAME);
-            if (cache == null) {
-                cache = Maps.newHashMap();
-                project.setSessionProperty(CACHE_NAME, cache);
-            }
-
-            return cache;
-        } catch (CoreException e) {
-            AdtPlugin.log(e, null);
-            return Maps.newHashMap();
-        }
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/ChangeLayoutAction.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/ChangeLayoutAction.java
deleted file mode 100644
index 306dd68..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/ChangeLayoutAction.java
+++ /dev/null
@@ -1,47 +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.eclipse.adt.internal.editors.layout.refactoring;
-
-import com.android.ide.eclipse.adt.internal.editors.layout.LayoutEditorDelegate;
-
-import org.eclipse.jface.action.IAction;
-import org.eclipse.ltk.ui.refactoring.RefactoringWizard;
-import org.eclipse.ltk.ui.refactoring.RefactoringWizardOpenOperation;
-
-/**
- * Action executed when the "Convert Layout" menu item is invoked.
- */
-public class ChangeLayoutAction extends VisualRefactoringAction {
-    @Override
-    public void run(IAction action) {
-        if ((mTextSelection != null || mTreeSelection != null) && mFile != null) {
-            ChangeLayoutRefactoring ref = new ChangeLayoutRefactoring(mFile, mDelegate,
-                    mTextSelection, mTreeSelection);
-            RefactoringWizard wizard = new ChangeLayoutWizard(ref, mDelegate);
-            RefactoringWizardOpenOperation op = new RefactoringWizardOpenOperation(wizard);
-            try {
-                op.run(mWindow.getShell(), wizard.getDefaultPageTitle());
-            } catch (InterruptedException e) {
-                // Interrupted. Pass.
-            }
-        }
-    }
-
-    public static IAction create(LayoutEditorDelegate editorDelegate) {
-        return create("Change Layout...", editorDelegate, ChangeLayoutAction.class);
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/ChangeLayoutContribution.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/ChangeLayoutContribution.java
deleted file mode 100644
index c508b7e..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/ChangeLayoutContribution.java
+++ /dev/null
@@ -1,40 +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.eclipse.adt.internal.editors.layout.refactoring;
-
-import org.eclipse.ltk.core.refactoring.RefactoringContribution;
-import org.eclipse.ltk.core.refactoring.RefactoringDescriptor;
-
-import java.util.Map;
-
-public class ChangeLayoutContribution extends RefactoringContribution {
-
-    @SuppressWarnings("unchecked")
-    @Override
-    public RefactoringDescriptor createDescriptor(String id, String project, String description,
-            String comment, Map arguments, int flags) throws IllegalArgumentException {
-        return new ChangeLayoutRefactoring.Descriptor(project, description, comment, arguments);
-    }
-
-    @SuppressWarnings("unchecked")
-    @Override
-    public Map retrieveArgumentMap(RefactoringDescriptor descriptor) {
-        if (descriptor instanceof ChangeLayoutRefactoring.Descriptor) {
-            return ((ChangeLayoutRefactoring.Descriptor) descriptor).getArguments();
-        }
-        return super.retrieveArgumentMap(descriptor);
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/ChangeLayoutRefactoring.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/ChangeLayoutRefactoring.java
deleted file mode 100644
index d8c85aa..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/ChangeLayoutRefactoring.java
+++ /dev/null
@@ -1,657 +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.eclipse.adt.internal.editors.layout.refactoring;
-
-import static com.android.SdkConstants.ANDROID_URI;
-import static com.android.SdkConstants.ANDROID_WIDGET_PREFIX;
-import static com.android.SdkConstants.ATTR_BASELINE_ALIGNED;
-import static com.android.SdkConstants.ATTR_LAYOUT_ALIGN_BASELINE;
-import static com.android.SdkConstants.ATTR_LAYOUT_BELOW;
-import static com.android.SdkConstants.ATTR_LAYOUT_HEIGHT;
-import static com.android.SdkConstants.ATTR_LAYOUT_RESOURCE_PREFIX;
-import static com.android.SdkConstants.ATTR_LAYOUT_TO_RIGHT_OF;
-import static com.android.SdkConstants.ATTR_LAYOUT_WIDTH;
-import static com.android.SdkConstants.ATTR_ORIENTATION;
-import static com.android.SdkConstants.EXT_XML;
-import static com.android.SdkConstants.FQCN_GESTURE_OVERLAY_VIEW;
-import static com.android.SdkConstants.FQCN_GRID_LAYOUT;
-import static com.android.SdkConstants.FQCN_LINEAR_LAYOUT;
-import static com.android.SdkConstants.FQCN_RELATIVE_LAYOUT;
-import static com.android.SdkConstants.FQCN_TABLE_LAYOUT;
-import static com.android.SdkConstants.GESTURE_OVERLAY_VIEW;
-import static com.android.SdkConstants.LINEAR_LAYOUT;
-import static com.android.SdkConstants.TABLE_ROW;
-import static com.android.SdkConstants.VALUE_FALSE;
-import static com.android.SdkConstants.VALUE_VERTICAL;
-import static com.android.SdkConstants.VALUE_WRAP_CONTENT;
-
-import com.android.SdkConstants;
-import com.android.annotations.NonNull;
-import com.android.annotations.VisibleForTesting;
-import com.android.ide.common.xml.XmlFormatStyle;
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.ide.eclipse.adt.internal.editors.descriptors.AttributeDescriptor;
-import com.android.ide.eclipse.adt.internal.editors.layout.LayoutEditorDelegate;
-import com.android.ide.eclipse.adt.internal.editors.layout.descriptors.ViewElementDescriptor;
-import com.android.ide.eclipse.adt.internal.editors.layout.gle2.CanvasViewInfo;
-import com.android.ide.eclipse.adt.internal.editors.layout.gle2.DomUtilities;
-import com.android.ide.eclipse.adt.internal.editors.layout.gle2.LayoutCanvas;
-import com.android.ide.eclipse.adt.internal.editors.layout.gle2.ViewHierarchy;
-import com.android.ide.eclipse.adt.internal.preferences.AdtPrefs;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.OperationCanceledException;
-import org.eclipse.jface.text.ITextSelection;
-import org.eclipse.jface.viewers.ITreeSelection;
-import org.eclipse.ltk.core.refactoring.Change;
-import org.eclipse.ltk.core.refactoring.Refactoring;
-import org.eclipse.ltk.core.refactoring.RefactoringStatus;
-import org.eclipse.ltk.core.refactoring.TextFileChange;
-import org.eclipse.text.edits.MalformedTreeException;
-import org.eclipse.text.edits.MultiTextEdit;
-import org.eclipse.text.edits.ReplaceEdit;
-import org.eclipse.text.edits.TextEdit;
-import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
-import org.eclipse.wst.sse.core.internal.provisional.IndexedRegion;
-import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;
-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.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-/**
- * Converts the selected layout into a layout of a different type.
- */
-@SuppressWarnings("restriction") // XML model
-public class ChangeLayoutRefactoring extends VisualRefactoring {
-    private static final String KEY_TYPE = "type";       //$NON-NLS-1$
-    private static final String KEY_FLATTEN = "flatten"; //$NON-NLS-1$
-
-    private String mTypeFqcn;
-    private String mInitializedAttributes;
-    private boolean mFlatten;
-
-    /**
-     * This constructor is solely used by {@link Descriptor},
-     * to replay a previous refactoring.
-     * @param arguments argument map created by #createArgumentMap.
-     */
-    ChangeLayoutRefactoring(Map<String, String> arguments) {
-        super(arguments);
-        mTypeFqcn = arguments.get(KEY_TYPE);
-        mFlatten = Boolean.parseBoolean(arguments.get(KEY_FLATTEN));
-    }
-
-    @VisibleForTesting
-    ChangeLayoutRefactoring(List<Element> selectedElements, LayoutEditorDelegate delegate) {
-        super(selectedElements, delegate);
-    }
-
-    public ChangeLayoutRefactoring(
-            IFile file,
-            LayoutEditorDelegate delegate,
-            ITextSelection selection,
-            ITreeSelection treeSelection) {
-        super(file, delegate, selection, treeSelection);
-    }
-
-    @Override
-    public RefactoringStatus checkInitialConditions(IProgressMonitor pm) throws CoreException,
-            OperationCanceledException {
-        RefactoringStatus status = new RefactoringStatus();
-
-        try {
-            pm.beginTask("Checking preconditions...", 2);
-
-            if (mSelectionStart == -1 || mSelectionEnd == -1) {
-                status.addFatalError("No selection to convert");
-                return status;
-            }
-
-            if (mElements.size() != 1) {
-                status.addFatalError("Select precisely one layout to convert");
-                return status;
-            }
-
-            pm.worked(1);
-            return status;
-
-        } finally {
-            pm.done();
-        }
-    }
-
-    @Override
-    protected VisualRefactoringDescriptor createDescriptor() {
-        String comment = getName();
-        return new Descriptor(
-                mProject.getName(), //project
-                comment, //description
-                comment, //comment
-                createArgumentMap());
-    }
-
-    @Override
-    protected Map<String, String> createArgumentMap() {
-        Map<String, String> args = super.createArgumentMap();
-        args.put(KEY_TYPE, mTypeFqcn);
-        args.put(KEY_FLATTEN, Boolean.toString(mFlatten));
-
-        return args;
-    }
-
-    @Override
-    public String getName() {
-        return "Change Layout";
-    }
-
-    void setType(String typeFqcn) {
-        mTypeFqcn = typeFqcn;
-    }
-
-    void setInitializedAttributes(String initializedAttributes) {
-        mInitializedAttributes = initializedAttributes;
-    }
-
-    void setFlatten(boolean flatten) {
-        mFlatten = flatten;
-    }
-
-    @Override
-    protected List<Element> initElements() {
-        List<Element> elements = super.initElements();
-
-        // Don't convert a root GestureOverlayView; convert its child. This looks for
-        // gesture overlays, and if found, it generates a new child list where the gesture
-        // overlay children are replaced by their first element children
-        for (Element element : elements) {
-            String tagName = element.getTagName();
-            if (tagName.equals(GESTURE_OVERLAY_VIEW)
-                    || tagName.equals(FQCN_GESTURE_OVERLAY_VIEW)) {
-                List<Element> replacement = new ArrayList<Element>(elements.size());
-                for (Element e : elements) {
-                    tagName = e.getTagName();
-                    if (tagName.equals(GESTURE_OVERLAY_VIEW)
-                            || tagName.equals(FQCN_GESTURE_OVERLAY_VIEW)) {
-                        NodeList children = e.getChildNodes();
-                        Element first = null;
-                        for (int i = 0, n = children.getLength(); i < n; i++) {
-                            Node node = children.item(i);
-                            if (node.getNodeType() == Node.ELEMENT_NODE) {
-                                first = (Element) node;
-                                break;
-                            }
-                        }
-                        if (first != null) {
-                            e = first;
-                        }
-                    }
-                    replacement.add(e);
-                }
-                return replacement;
-            }
-        }
-
-        return elements;
-    }
-
-    @Override
-    protected @NonNull List<Change> computeChanges(IProgressMonitor monitor) {
-        String name = getViewClass(mTypeFqcn);
-
-        IFile file = mDelegate.getEditor().getInputFile();
-        List<Change> changes = new ArrayList<Change>();
-        if (file == null) {
-            return changes;
-        }
-        TextFileChange change = new TextFileChange(file.getName(), file);
-        MultiTextEdit rootEdit = new MultiTextEdit();
-        change.setTextType(EXT_XML);
-        changes.add(change);
-
-        String text = getText(mSelectionStart, mSelectionEnd);
-        Element layout = getPrimaryElement();
-        String oldName = layout.getNodeName();
-        int open = text.indexOf(oldName);
-        int close = text.lastIndexOf(oldName);
-
-        if (open != -1 && close != -1) {
-            int oldLength = oldName.length();
-            rootEdit.addChild(new ReplaceEdit(mSelectionStart + open, oldLength, name));
-            if (close != open) { // Gracefully handle <FooLayout/>
-                rootEdit.addChild(new ReplaceEdit(mSelectionStart + close, oldLength, name));
-            }
-        }
-
-        String oldId = getId(layout);
-        String newId = ensureIdMatchesType(layout, mTypeFqcn, rootEdit);
-        // Update any layout references to the old id with the new id
-        if (oldId != null && newId != null) {
-            IStructuredModel model = mDelegate.getEditor().getModelForRead();
-            try {
-                IStructuredDocument doc = model.getStructuredDocument();
-                if (doc != null) {
-                    List<TextEdit> replaceIds = replaceIds(getAndroidNamespacePrefix(), doc,
-                            mSelectionStart,
-                            mSelectionEnd, oldId, newId);
-                    for (TextEdit edit : replaceIds) {
-                        rootEdit.addChild(edit);
-                    }
-                }
-            } finally {
-                model.releaseFromRead();
-            }
-        }
-
-        String oldType = getOldType();
-        String newType = mTypeFqcn;
-
-        if (newType.equals(FQCN_RELATIVE_LAYOUT)) {
-            if (oldType.equals(FQCN_LINEAR_LAYOUT) && !mFlatten) {
-                // Hand-coded conversion specifically tailored for linear to relative, provided
-                // there is no hierarchy flattening
-                // TODO: use the RelativeLayoutConversionHelper for this; it does a better job
-                // analyzing gravities etc.
-                convertLinearToRelative(rootEdit);
-                removeUndefinedAttrs(rootEdit, layout);
-                addMissingWrapContentAttributes(rootEdit, layout, oldType, newType, null);
-            } else {
-                // Generic conversion to relative - can also flatten the hierarchy
-                convertAnyToRelative(rootEdit, oldType, newType);
-                // This already handles removing undefined layout attributes -- right?
-                //removeUndefinedLayoutAttrs(rootEdit, layout);
-            }
-        } else if (newType.equals(FQCN_GRID_LAYOUT)) {
-            convertAnyToGridLayout(rootEdit);
-            // Layout attributes on children have already been removed as part of conversion
-            // during the flattening
-            removeUndefinedAttrs(rootEdit, layout, false /*removeLayoutAttrs*/);
-        } else if (oldType.equals(FQCN_RELATIVE_LAYOUT) && newType.equals(FQCN_LINEAR_LAYOUT)) {
-            convertRelativeToLinear(rootEdit);
-            removeUndefinedAttrs(rootEdit, layout);
-            addMissingWrapContentAttributes(rootEdit, layout, oldType, newType, null);
-        } else if (oldType.equals(FQCN_LINEAR_LAYOUT) && newType.equals(FQCN_TABLE_LAYOUT)) {
-            convertLinearToTable(rootEdit);
-            removeUndefinedAttrs(rootEdit, layout);
-            addMissingWrapContentAttributes(rootEdit, layout, oldType, newType, null);
-        } else {
-            convertGeneric(rootEdit, oldType, newType, layout);
-        }
-
-        if (mInitializedAttributes != null && mInitializedAttributes.length() > 0) {
-            String namespace = getAndroidNamespacePrefix();
-            for (String s : mInitializedAttributes.split(",")) { //$NON-NLS-1$
-                String[] nameValue = s.split("="); //$NON-NLS-1$
-                String attribute = nameValue[0];
-                String value = nameValue[1];
-                String prefix = null;
-                String namespaceUri = null;
-                if (attribute.startsWith(SdkConstants.ANDROID_NS_NAME_PREFIX)) {
-                    prefix = namespace;
-                    namespaceUri = ANDROID_URI;
-                    attribute = attribute.substring(SdkConstants.ANDROID_NS_NAME_PREFIX.length());
-                }
-                setAttribute(rootEdit, layout, namespaceUri,
-                        prefix, attribute, value);
-            }
-        }
-
-        if (AdtPrefs.getPrefs().getFormatGuiXml()) {
-            MultiTextEdit formatted = reformat(rootEdit, XmlFormatStyle.LAYOUT);
-            if (formatted != null) {
-                rootEdit = formatted;
-            }
-        }
-        change.setEdit(rootEdit);
-
-        return changes;
-    }
-
-    /** Checks whether we need to add any missing attributes on the elements */
-    private void addMissingWrapContentAttributes(MultiTextEdit rootEdit, Element layout,
-            String oldType, String newType, Set<Element> skip) {
-        if (oldType.equals(FQCN_GRID_LAYOUT) && !newType.equals(FQCN_GRID_LAYOUT)) {
-            String namespace = getAndroidNamespacePrefix();
-
-            for (Element child : DomUtilities.getChildren(layout)) {
-                if (skip != null && skip.contains(child)) {
-                    continue;
-                }
-
-                if (!child.hasAttributeNS(ANDROID_URI, ATTR_LAYOUT_WIDTH)) {
-                    setAttribute(rootEdit, child, ANDROID_URI,
-                            namespace, ATTR_LAYOUT_WIDTH, VALUE_WRAP_CONTENT);
-                }
-                if (!child.hasAttributeNS(ANDROID_URI, ATTR_LAYOUT_HEIGHT)) {
-                    setAttribute(rootEdit, child, ANDROID_URI,
-                            namespace, ATTR_LAYOUT_HEIGHT, VALUE_WRAP_CONTENT);
-                }
-            }
-        }
-    }
-
-    /** Hand coded conversion from a LinearLayout to a TableLayout */
-    private void convertLinearToTable(MultiTextEdit rootEdit) {
-        // This is pretty easy; just switch the root tag (already done by the initial generic
-        // conversion) and then convert all the children into <TableRow> elements.
-        // Finally, get rid of the orientation attribute, if any.
-        Element layout = getPrimaryElement();
-        removeOrientationAttribute(rootEdit, layout);
-
-        NodeList children = layout.getChildNodes();
-        for (int i = 0, n = children.getLength(); i < n; i++) {
-            Node node = children.item(i);
-            if (node.getNodeType() == Node.ELEMENT_NODE) {
-                Element child = (Element) node;
-                if (node instanceof IndexedRegion) {
-                    IndexedRegion region = (IndexedRegion) node;
-                    int start = region.getStartOffset();
-                    int end = region.getEndOffset();
-                    String text = getText(start, end);
-                    String oldName = child.getNodeName();
-                    if (oldName.equals(LINEAR_LAYOUT)) {
-                        removeOrientationAttribute(rootEdit, child);
-                        int open = text.indexOf(oldName);
-                        int close = text.lastIndexOf(oldName);
-
-                        if (open != -1 && close != -1) {
-                            int oldLength = oldName.length();
-                            rootEdit.addChild(new ReplaceEdit(mSelectionStart + open, oldLength,
-                                    TABLE_ROW));
-                            if (close != open) { // Gracefully handle <FooLayout/>
-                                rootEdit.addChild(new ReplaceEdit(mSelectionStart + close,
-                                        oldLength, TABLE_ROW));
-                            }
-                        }
-                    } // else: WRAP in TableLayout!
-                }
-            }
-        }
-    }
-
-     /** Hand coded conversion from a LinearLayout to a RelativeLayout */
-    private void convertLinearToRelative(MultiTextEdit rootEdit) {
-        // This can be done accurately.
-        Element layout = getPrimaryElement();
-        // Horizontal is the default, so if no value is specified it is horizontal.
-        boolean isVertical = VALUE_VERTICAL.equals(layout.getAttributeNS(ANDROID_URI,
-                ATTR_ORIENTATION));
-
-        String attributePrefix = getAndroidNamespacePrefix();
-
-        // TODO: Consider gravity of each element
-        // TODO: Consider weight of each element
-        // Right now it simply makes a single attachment to keep the order.
-
-        if (isVertical) {
-            // Align each child to the bottom and left of its parent
-            NodeList children = layout.getChildNodes();
-            String prevId = null;
-            for (int i = 0, n = children.getLength(); i < n; i++) {
-                Node node = children.item(i);
-                if (node.getNodeType() == Node.ELEMENT_NODE) {
-                    Element child = (Element) node;
-                    String id = ensureHasId(rootEdit, child, null);
-                    if (prevId != null) {
-                        setAttribute(rootEdit, child, ANDROID_URI, attributePrefix,
-                                ATTR_LAYOUT_BELOW, prevId);
-                    }
-                    prevId = id;
-                }
-            }
-        } else {
-            // Align each child to the left
-            NodeList children = layout.getChildNodes();
-            boolean isBaselineAligned =
-                !VALUE_FALSE.equals(layout.getAttributeNS(ANDROID_URI, ATTR_BASELINE_ALIGNED));
-
-            String prevId = null;
-            for (int i = 0, n = children.getLength(); i < n; i++) {
-                Node node = children.item(i);
-                if (node.getNodeType() == Node.ELEMENT_NODE) {
-                    Element child = (Element) node;
-                    String id = ensureHasId(rootEdit, child, null);
-                    if (prevId != null) {
-                        setAttribute(rootEdit, child, ANDROID_URI, attributePrefix,
-                                ATTR_LAYOUT_TO_RIGHT_OF, prevId);
-                        if (isBaselineAligned) {
-                            setAttribute(rootEdit, child, ANDROID_URI, attributePrefix,
-                                    ATTR_LAYOUT_ALIGN_BASELINE, prevId);
-                        }
-                    }
-                    prevId = id;
-                }
-            }
-        }
-    }
-
-    /** Strips out the android:orientation attribute from the given linear layout element */
-    private void removeOrientationAttribute(MultiTextEdit rootEdit, Element layout) {
-        assert layout.getTagName().equals(LINEAR_LAYOUT);
-        removeAttribute(rootEdit, layout, ANDROID_URI, ATTR_ORIENTATION);
-    }
-
-    /**
-     * Hand coded conversion from a RelativeLayout to a LinearLayout
-     *
-     * @param rootEdit the root multi text edit to add edits to
-     */
-    private void convertRelativeToLinear(MultiTextEdit rootEdit) {
-        // This is going to be lossy...
-        // TODO: Attempt to "order" the items based on their visual positions
-        // and insert them in that order in the LinearLayout.
-        // TODO: Possibly use nesting if necessary, by spatial subdivision,
-        // to accomplish roughly the same layout as the relative layout specifies.
-    }
-
-    /**
-     * Hand coded -generic- conversion from one layout to another. This is not going to be
-     * an accurate layout transformation; instead it simply migrates the layout attributes
-     * that are supported, and adds defaults for any new required layout attributes. In
-     * addition, it attempts to order the children visually based on where they fit in a
-     * rendering. (Unsupported layout attributes will be removed by the caller at the
-     * end.)
-     * <ul>
-     * <li>Try to handle nesting. Converting a *hierarchy* of layouts into a flatter
-     * layout for powerful layouts that support it, like RelativeLayout.
-     * <li>Try to do automatic "inference" about the layout. I can render it and look at
-     * the ViewInfo positions and sizes. I can render it multiple times, at different
-     * sizes, to infer "stretchiness" and "weight" properties of the children.
-     * <li>Try to do indirect transformations. E.g. if I can go from A to B, and B to C,
-     * then an attempt to go from A to C should perform conversions A to B and then B to
-     * C.
-     * </ul>
-     *
-     * @param rootEdit the root multi text edit to add edits to
-     * @param oldType the fully qualified class name of the layout type we are converting
-     *            from
-     * @param newType the fully qualified class name of the layout type we are converting
-     *            to
-     * @param layout the layout to be converted
-     */
-    private void convertGeneric(MultiTextEdit rootEdit, String oldType, String newType,
-            Element layout) {
-        // TODO: Add hooks for 3rd party conversions getting registered through the
-        // IViewRule interface.
-
-        // For now we simply go with the default behavior, which is to just strip the
-        // layout attributes that aren't supported.
-        removeUndefinedAttrs(rootEdit, layout);
-        addMissingWrapContentAttributes(rootEdit, layout, oldType, newType, null);
-    }
-
-    /**
-     * Removes all the unavailable attributes after a conversion, both on the
-     * layout element itself as well as the layout attributes of any of the
-     * children
-     */
-    private void removeUndefinedAttrs(MultiTextEdit rootEdit, Element layout) {
-        removeUndefinedAttrs(rootEdit, layout, true /*removeLayoutAttrs*/);
-    }
-
-    private void removeUndefinedAttrs(MultiTextEdit rootEdit, Element layout,
-            boolean removeLayoutAttrs) {
-        ViewElementDescriptor descriptor = getElementDescriptor(mTypeFqcn);
-        if (descriptor == null) {
-            return;
-        }
-
-        if (removeLayoutAttrs) {
-            Set<String> defined = new HashSet<String>();
-            AttributeDescriptor[] layoutAttributes = descriptor.getLayoutAttributes();
-            for (AttributeDescriptor attribute : layoutAttributes) {
-                defined.add(attribute.getXmlLocalName());
-            }
-
-            NodeList children = layout.getChildNodes();
-            for (int i = 0, n = children.getLength(); i < n; i++) {
-                Node node = children.item(i);
-                if (node.getNodeType() == Node.ELEMENT_NODE) {
-                    Element child = (Element) node;
-
-                    List<Attr> attributes = findLayoutAttributes(child);
-                    for (Attr attribute : attributes) {
-                        String name = attribute.getLocalName();
-                        if (!defined.contains(name)) {
-                            // Remove it
-                            try {
-                                removeAttribute(rootEdit, child, attribute.getNamespaceURI(), name);
-                            } catch (MalformedTreeException mte) {
-                                // Sometimes refactoring has modified attribute; not removing
-                                // it is non-fatal so just warn instead of letting refactoring
-                                // operation abort
-                                AdtPlugin.log(IStatus.WARNING,
-                                        "Could not remove unsupported attribute %1$s; " + //$NON-NLS-1$
-                                        "already modified during refactoring?", //$NON-NLS-1$
-                                        attribute.getLocalName());
-                            }
-                        }
-                    }
-                }
-            }
-        }
-
-        // Also remove the unavailable attributes (not layout attributes) on the
-        // converted element
-        Set<String> defined = new HashSet<String>();
-        AttributeDescriptor[] attributes = descriptor.getAttributes();
-        for (AttributeDescriptor attribute : attributes) {
-            defined.add(attribute.getXmlLocalName());
-        }
-
-        // Remove undefined attributes on the layout element itself
-        NamedNodeMap attributeMap = layout.getAttributes();
-        for (int i = 0, n = attributeMap.getLength(); i < n; i++) {
-            Node attributeNode = attributeMap.item(i);
-
-            String name = attributeNode.getLocalName();
-            if (!name.startsWith(ATTR_LAYOUT_RESOURCE_PREFIX)
-                    && ANDROID_URI.equals(attributeNode.getNamespaceURI())) {
-                if (!defined.contains(name)) {
-                    // Remove it
-                    removeAttribute(rootEdit, layout, ANDROID_URI, name);
-                }
-            }
-        }
-    }
-
-    /** Hand coded conversion from any layout to a RelativeLayout */
-    private void convertAnyToRelative(MultiTextEdit rootEdit, String oldType, String newType) {
-        // To perform a conversion from any other layout type, including nested conversion,
-        Element layout = getPrimaryElement();
-        CanvasViewInfo rootView = mRootView;
-        if (rootView == null) {
-            LayoutCanvas canvas = mDelegate.getGraphicalEditor().getCanvasControl();
-            ViewHierarchy viewHierarchy = canvas.getViewHierarchy();
-            rootView = viewHierarchy.getRoot();
-        }
-
-        RelativeLayoutConversionHelper helper =
-            new RelativeLayoutConversionHelper(this, layout, mFlatten, rootEdit, rootView);
-        helper.convertToRelative();
-        List<Element> deletedElements = helper.getDeletedElements();
-        Set<Element> deleted = null;
-        if (deletedElements != null && deletedElements.size() > 0) {
-            deleted = new HashSet<Element>(deletedElements);
-        }
-        addMissingWrapContentAttributes(rootEdit, layout, oldType, newType, deleted);
-    }
-
-    /** Hand coded conversion from any layout to a GridLayout */
-    private void convertAnyToGridLayout(MultiTextEdit rootEdit) {
-        // To perform a conversion from any other layout type, including nested conversion,
-        Element layout = getPrimaryElement();
-        CanvasViewInfo rootView = mRootView;
-        if (rootView == null) {
-            LayoutCanvas canvas = mDelegate.getGraphicalEditor().getCanvasControl();
-            ViewHierarchy viewHierarchy = canvas.getViewHierarchy();
-            rootView = viewHierarchy.getRoot();
-        }
-
-        GridLayoutConverter converter = new GridLayoutConverter(this, layout, mFlatten,
-                rootEdit, rootView);
-        converter.convertToGridLayout();
-    }
-
-    public static class Descriptor extends VisualRefactoringDescriptor {
-        public Descriptor(String project, String description, String comment,
-                Map<String, String> arguments) {
-            super("com.android.ide.eclipse.adt.refactoring.convert", //$NON-NLS-1$
-                    project, description, comment, arguments);
-        }
-
-        @Override
-        protected Refactoring createRefactoring(Map<String, String> args) {
-            return new ChangeLayoutRefactoring(args);
-        }
-    }
-
-    String getOldType() {
-        Element primary = getPrimaryElement();
-        if (primary != null) {
-            String oldType = primary.getTagName();
-            if (oldType.indexOf('.') == -1) {
-                oldType = ANDROID_WIDGET_PREFIX + oldType;
-            }
-            return oldType;
-        }
-
-        return null;
-    }
-
-    @VisibleForTesting
-    protected CanvasViewInfo mRootView;
-
-    @VisibleForTesting
-    public void setRootView(CanvasViewInfo rootView) {
-        mRootView = rootView;
-    }
-
-    @Override
-    VisualRefactoringWizard createWizard() {
-        return new ChangeLayoutWizard(this, mDelegate);
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/ChangeLayoutWizard.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/ChangeLayoutWizard.java
deleted file mode 100644
index f558271..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/ChangeLayoutWizard.java
+++ /dev/null
@@ -1,195 +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.eclipse.adt.internal.editors.layout.refactoring;
-
-import static com.android.SdkConstants.FQCN_GRID_LAYOUT;
-import static com.android.SdkConstants.FQCN_RELATIVE_LAYOUT;
-import static com.android.SdkConstants.GRID_LAYOUT;
-import static com.android.SdkConstants.RELATIVE_LAYOUT;
-import static com.android.SdkConstants.VIEW_FRAGMENT;
-import static com.android.SdkConstants.VIEW_INCLUDE;
-import static com.android.SdkConstants.VIEW_MERGE;
-
-import com.android.ide.eclipse.adt.internal.editors.layout.LayoutEditorDelegate;
-import com.android.ide.eclipse.adt.internal.editors.layout.descriptors.ViewElementDescriptor;
-import com.android.ide.eclipse.adt.internal.editors.layout.gre.PaletteMetadataDescriptor;
-import com.android.utils.Pair;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Combo;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Label;
-
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-class ChangeLayoutWizard extends VisualRefactoringWizard {
-
-    public ChangeLayoutWizard(ChangeLayoutRefactoring ref, LayoutEditorDelegate editor) {
-        super(ref, editor);
-        setDefaultPageTitle("Change Layout");
-    }
-
-    @Override
-    protected void addUserInputPages() {
-        ChangeLayoutRefactoring ref = (ChangeLayoutRefactoring) getRefactoring();
-        String oldType = ref.getOldType();
-        addPage(new InputPage(mDelegate.getEditor().getProject(), oldType));
-    }
-
-    /** Wizard page which inputs parameters for the {@link ChangeLayoutRefactoring} operation */
-    private static class InputPage extends VisualRefactoringInputPage {
-        private final IProject mProject;
-        private final String mOldType;
-        private Combo mTypeCombo;
-        private Button mFlatten;
-        private List<Pair<String, ViewElementDescriptor>> mClassNames;
-
-        public InputPage(IProject project, String oldType) {
-            super("ChangeLayoutInputPage");  //$NON-NLS-1$
-            mProject = project;
-            mOldType = oldType;
-        }
-
-        @Override
-        public void createControl(Composite parent) {
-            Composite composite = new Composite(parent, SWT.NONE);
-            composite.setLayout(new GridLayout(2, false));
-
-            Label fromLabel = new Label(composite, SWT.NONE);
-            fromLabel.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false, 2, 1));
-            String oldTypeBase = mOldType.substring(mOldType.lastIndexOf('.') + 1);
-            fromLabel.setText(String.format("Change from %1$s", oldTypeBase));
-
-            Label typeLabel = new Label(composite, SWT.NONE);
-            typeLabel.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1));
-            typeLabel.setText("New Layout Type:");
-
-            mTypeCombo = new Combo(composite, SWT.READ_ONLY);
-            mTypeCombo.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
-            SelectionAdapter selectionListener = new SelectionAdapter() {
-                @Override
-                public void widgetSelected(SelectionEvent e) {
-                    validatePage();
-                    // Hierarchy flattening only works for relative layout (and any future
-                    // layouts that can also support arbitrary layouts).
-                    String text = mTypeCombo.getText();
-                    mFlatten.setVisible(text.equals(RELATIVE_LAYOUT) || text.equals(GRID_LAYOUT));
-                }
-            };
-            mTypeCombo.addSelectionListener(selectionListener);
-            mTypeCombo.addSelectionListener(mSelectionValidateListener);
-
-            mFlatten = new Button(composite, SWT.CHECK);
-            mFlatten.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER,
-                    false, false, 2, 1));
-            mFlatten.setText("Flatten hierarchy");
-            mFlatten.addSelectionListener(selectionListener);
-            // Should flattening be selected by default?
-            mFlatten.setSelection(true);
-            mFlatten.addSelectionListener(mSelectionValidateListener);
-
-            // We don't exclude RelativeLayout even if the current layout is RelativeLayout,
-            // in case you are trying to flatten the hierarchy for a hierarchy that has a
-            // RelativeLayout at the root.
-            Set<String> exclude = new HashSet<String>();
-            exclude.add(VIEW_INCLUDE);
-            exclude.add(VIEW_MERGE);
-            exclude.add(VIEW_FRAGMENT);
-            boolean oldIsRelativeLayout = mOldType.equals(FQCN_RELATIVE_LAYOUT);
-            boolean oldIsGridLayout = mOldType.equals(FQCN_GRID_LAYOUT);
-            if (oldIsRelativeLayout || oldIsGridLayout) {
-                exclude.add(mOldType);
-            }
-            mClassNames = WrapInWizard.addLayouts(mProject, mOldType, mTypeCombo, exclude, false);
-
-            boolean gridLayoutAvailable = false;
-            for (int i = 0; i < mTypeCombo.getItemCount(); i++) {
-                if (mTypeCombo.getItem(i).equals(GRID_LAYOUT)) {
-                    gridLayoutAvailable = true;
-                    break;
-                }
-            }
-
-            mTypeCombo.select(0);
-            // The default should be GridLayout (if available) and if not RelativeLayout,
-            // if available (and not the old Type)
-            if (gridLayoutAvailable && !oldIsGridLayout) {
-                for (int i = 0; i < mTypeCombo.getItemCount(); i++) {
-                    if (mTypeCombo.getItem(i).equals(GRID_LAYOUT)) {
-                        mTypeCombo.select(i);
-                        break;
-                    }
-                }
-            } else if (!oldIsRelativeLayout) {
-                for (int i = 0; i < mTypeCombo.getItemCount(); i++) {
-                    if (mTypeCombo.getItem(i).equals(RELATIVE_LAYOUT)) {
-                        mTypeCombo.select(i);
-                        break;
-                    }
-                }
-            }
-            mFlatten.setVisible(mTypeCombo.getText().equals(RELATIVE_LAYOUT)
-                    || mTypeCombo.getText().equals(GRID_LAYOUT));
-
-            setControl(composite);
-            validatePage();
-        }
-
-        @Override
-        protected boolean validatePage() {
-            boolean ok = true;
-
-            int selectionIndex = mTypeCombo.getSelectionIndex();
-            String type = selectionIndex != -1 ? mClassNames.get(selectionIndex).getFirst() : null;
-            if (type == null) {
-                setErrorMessage("Select a layout type");
-                ok = false; // The user has chosen a separator
-            } else {
-                setErrorMessage(null);
-
-                // Record state
-                ChangeLayoutRefactoring refactoring =
-                    (ChangeLayoutRefactoring) getRefactoring();
-                refactoring.setType(type);
-                refactoring.setFlatten(mFlatten.getSelection());
-
-                ViewElementDescriptor descriptor = mClassNames.get(selectionIndex).getSecond();
-                if (descriptor instanceof PaletteMetadataDescriptor) {
-                    PaletteMetadataDescriptor paletteDescriptor =
-                        (PaletteMetadataDescriptor) descriptor;
-                    String initializedAttributes = paletteDescriptor.getInitializedAttributes();
-                    if (initializedAttributes != null && initializedAttributes.length() > 0) {
-                        refactoring.setInitializedAttributes(initializedAttributes);
-                    }
-                } else {
-                    refactoring.setInitializedAttributes(null);
-                }
-            }
-
-            setPageComplete(ok);
-            return ok;
-        }
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/ChangeViewAction.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/ChangeViewAction.java
deleted file mode 100644
index fa14e52..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/ChangeViewAction.java
+++ /dev/null
@@ -1,47 +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.eclipse.adt.internal.editors.layout.refactoring;
-
-import com.android.ide.eclipse.adt.internal.editors.layout.LayoutEditorDelegate;
-
-import org.eclipse.jface.action.IAction;
-import org.eclipse.ltk.ui.refactoring.RefactoringWizard;
-import org.eclipse.ltk.ui.refactoring.RefactoringWizardOpenOperation;
-
-/**
- * Action executed when the "Change View Type" menu item is invoked.
- */
-public class ChangeViewAction extends VisualRefactoringAction {
-    @Override
-    public void run(IAction action) {
-        if ((mTextSelection != null || mTreeSelection != null) && mFile != null) {
-            ChangeViewRefactoring ref = new ChangeViewRefactoring(mFile, mDelegate,
-                    mTextSelection, mTreeSelection);
-            RefactoringWizard wizard = new ChangeViewWizard(ref, mDelegate);
-            RefactoringWizardOpenOperation op = new RefactoringWizardOpenOperation(wizard);
-            try {
-                op.run(mWindow.getShell(), wizard.getDefaultPageTitle());
-            } catch (InterruptedException e) {
-                // Interrupted. Pass.
-            }
-        }
-    }
-
-    public static IAction create(LayoutEditorDelegate editorDelegate) {
-        return create("Change Widget Type...", editorDelegate, ChangeViewAction.class);
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/ChangeViewContribution.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/ChangeViewContribution.java
deleted file mode 100644
index 7705ed8..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/ChangeViewContribution.java
+++ /dev/null
@@ -1,40 +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.eclipse.adt.internal.editors.layout.refactoring;
-
-import org.eclipse.ltk.core.refactoring.RefactoringContribution;
-import org.eclipse.ltk.core.refactoring.RefactoringDescriptor;
-
-import java.util.Map;
-
-public class ChangeViewContribution extends RefactoringContribution {
-
-    @SuppressWarnings("unchecked")
-    @Override
-    public RefactoringDescriptor createDescriptor(String id, String project, String description,
-            String comment, Map arguments, int flags) throws IllegalArgumentException {
-        return new ChangeViewRefactoring.Descriptor(project, description, comment, arguments);
-    }
-
-    @SuppressWarnings("unchecked")
-    @Override
-    public Map retrieveArgumentMap(RefactoringDescriptor descriptor) {
-        if (descriptor instanceof ChangeViewRefactoring.Descriptor) {
-            return ((ChangeViewRefactoring.Descriptor) descriptor).getArguments();
-        }
-        return super.retrieveArgumentMap(descriptor);
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/ChangeViewRefactoring.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/ChangeViewRefactoring.java
deleted file mode 100644
index 73f5eb1..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/ChangeViewRefactoring.java
+++ /dev/null
@@ -1,298 +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.eclipse.adt.internal.editors.layout.refactoring;
-
-import static com.android.SdkConstants.ANDROID_URI;
-import static com.android.SdkConstants.ANDROID_WIDGET_PREFIX;
-import static com.android.SdkConstants.ATTR_LAYOUT_RESOURCE_PREFIX;
-import static com.android.SdkConstants.ATTR_TEXT;
-import static com.android.SdkConstants.EXT_XML;
-import static com.android.SdkConstants.VIEW_FRAGMENT;
-import static com.android.SdkConstants.VIEW_INCLUDE;
-
-import com.android.annotations.NonNull;
-import com.android.annotations.VisibleForTesting;
-import com.android.ide.eclipse.adt.internal.editors.descriptors.AttributeDescriptor;
-import com.android.ide.eclipse.adt.internal.editors.layout.LayoutEditorDelegate;
-import com.android.ide.eclipse.adt.internal.editors.layout.descriptors.ViewElementDescriptor;
-import com.android.ide.eclipse.adt.internal.editors.layout.gle2.CanvasViewInfo;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.OperationCanceledException;
-import org.eclipse.jface.text.ITextSelection;
-import org.eclipse.jface.viewers.ITreeSelection;
-import org.eclipse.ltk.core.refactoring.Change;
-import org.eclipse.ltk.core.refactoring.Refactoring;
-import org.eclipse.ltk.core.refactoring.RefactoringStatus;
-import org.eclipse.ltk.core.refactoring.TextFileChange;
-import org.eclipse.text.edits.MultiTextEdit;
-import org.eclipse.text.edits.ReplaceEdit;
-import org.eclipse.text.edits.TextEdit;
-import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
-import org.eclipse.wst.sse.core.internal.provisional.IndexedRegion;
-import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;
-import org.eclipse.wst.xml.core.internal.document.ElementImpl;
-import org.w3c.dom.Attr;
-import org.w3c.dom.Element;
-import org.w3c.dom.NamedNodeMap;
-import org.w3c.dom.Node;
-
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-/**
- * Changes the type of the given widgets to the given target type
- * and updates the attributes if necessary
- */
-@SuppressWarnings("restriction") // XML model
-public class ChangeViewRefactoring extends VisualRefactoring {
-    private static final String KEY_TYPE = "type"; //$NON-NLS-1$
-    private String mTypeFqcn;
-
-    /**
-     * This constructor is solely used by {@link Descriptor},
-     * to replay a previous refactoring.
-     * @param arguments argument map created by #createArgumentMap.
-     */
-    ChangeViewRefactoring(Map<String, String> arguments) {
-        super(arguments);
-        mTypeFqcn = arguments.get(KEY_TYPE);
-    }
-
-    public ChangeViewRefactoring(
-            IFile file,
-            LayoutEditorDelegate delegate,
-            ITextSelection selection,
-            ITreeSelection treeSelection) {
-        super(file, delegate, selection, treeSelection);
-    }
-
-    @VisibleForTesting
-    ChangeViewRefactoring(List<Element> selectedElements, LayoutEditorDelegate editor) {
-        super(selectedElements, editor);
-    }
-
-    @Override
-    public RefactoringStatus checkInitialConditions(IProgressMonitor pm) throws CoreException,
-            OperationCanceledException {
-        RefactoringStatus status = new RefactoringStatus();
-
-        try {
-            pm.beginTask("Checking preconditions...", 6);
-
-            if (mSelectionStart == -1 || mSelectionEnd == -1) {
-                status.addFatalError("No selection to convert");
-                return status;
-            }
-
-            // Make sure the selection is contiguous
-            if (mTreeSelection != null) {
-                List<CanvasViewInfo> infos = getSelectedViewInfos();
-                if (!validateNotEmpty(infos, status)) {
-                    return status;
-                }
-            }
-
-            // Ensures that we have a valid DOM model:
-            if (mElements.size() == 0) {
-                status.addFatalError("Nothing to convert");
-                return status;
-            }
-
-            pm.worked(1);
-            return status;
-
-        } finally {
-            pm.done();
-        }
-    }
-
-    @Override
-    protected VisualRefactoringDescriptor createDescriptor() {
-        String comment = getName();
-        return new Descriptor(
-                mProject.getName(), //project
-                comment, //description
-                comment, //comment
-                createArgumentMap());
-    }
-
-    @Override
-    protected Map<String, String> createArgumentMap() {
-        Map<String, String> args = super.createArgumentMap();
-        args.put(KEY_TYPE, mTypeFqcn);
-
-        return args;
-    }
-
-    @Override
-    public String getName() {
-        return "Change Widget Type";
-    }
-
-    void setType(String typeFqcn) {
-        mTypeFqcn = typeFqcn;
-    }
-
-    @Override
-    protected @NonNull List<Change> computeChanges(IProgressMonitor monitor) {
-        String name = getViewClass(mTypeFqcn);
-
-        IFile file = mDelegate.getEditor().getInputFile();
-        List<Change> changes = new ArrayList<Change>();
-        if (file == null) {
-            return changes;
-        }
-        TextFileChange change = new TextFileChange(file.getName(), file);
-        MultiTextEdit rootEdit = new MultiTextEdit();
-        change.setEdit(rootEdit);
-        change.setTextType(EXT_XML);
-        changes.add(change);
-
-        for (Element element : getElements()) {
-            IndexedRegion region = getRegion(element);
-            String text = getText(region.getStartOffset(), region.getEndOffset());
-            String oldName = element.getNodeName();
-            int open = text.indexOf(oldName);
-            int close = text.lastIndexOf(oldName);
-            if (element instanceof ElementImpl && ((ElementImpl) element).isEmptyTag()) {
-                close = -1;
-            }
-
-            if (open != -1) {
-                int oldLength = oldName.length();
-                rootEdit.addChild(new ReplaceEdit(region.getStartOffset() + open,
-                        oldLength, name));
-            }
-            if (close != -1 && close != open) {
-                int oldLength = oldName.length();
-                rootEdit.addChild(new ReplaceEdit(region.getStartOffset() + close, oldLength,
-                        name));
-            }
-
-            // Change tag type
-            String oldId = getId(element);
-            String newId = ensureIdMatchesType(element, mTypeFqcn, rootEdit);
-            // Update any layout references to the old id with the new id
-            if (oldId != null && newId != null) {
-                IStructuredModel model = mDelegate.getEditor().getModelForRead();
-                try {
-                    IStructuredDocument doc = model.getStructuredDocument();
-                    if (doc != null) {
-                        IndexedRegion range = getRegion(element);
-                        int skipStart = range.getStartOffset();
-                        int skipEnd = range.getEndOffset();
-                        List<TextEdit> replaceIds = replaceIds(getAndroidNamespacePrefix(), doc,
-                                skipStart, skipEnd,
-                                oldId, newId);
-                        for (TextEdit edit : replaceIds) {
-                            rootEdit.addChild(edit);
-                        }
-                    }
-                } finally {
-                    model.releaseFromRead();
-                }
-            }
-
-            // Strip out attributes that no longer make sense
-            removeUndefinedAttrs(rootEdit, element);
-        }
-
-        return changes;
-    }
-
-    /** Removes all the unused attributes after a conversion */
-    private void removeUndefinedAttrs(MultiTextEdit rootEdit, Element element) {
-        ViewElementDescriptor descriptor = getElementDescriptor(mTypeFqcn);
-        if (descriptor == null) {
-            return;
-        }
-
-        Set<String> defined = new HashSet<String>();
-        AttributeDescriptor[] layoutAttributes = descriptor.getAttributes();
-        for (AttributeDescriptor attribute : layoutAttributes) {
-            defined.add(attribute.getXmlLocalName());
-        }
-
-        List<Attr> attributes = findAttributes(element);
-        for (Attr attribute : attributes) {
-            String name = attribute.getLocalName();
-            if (!defined.contains(name)) {
-                // Remove it
-                removeAttribute(rootEdit, element, attribute.getNamespaceURI(), name);
-            }
-        }
-
-        // Set text attribute if it's defined
-        if (defined.contains(ATTR_TEXT) && !element.hasAttributeNS(ANDROID_URI, ATTR_TEXT)) {
-            setAttribute(rootEdit, element, ANDROID_URI, getAndroidNamespacePrefix(),
-                    ATTR_TEXT, descriptor.getUiName());
-        }
-    }
-
-    protected List<Attr> findAttributes(Node root) {
-        List<Attr> result = new ArrayList<Attr>();
-        NamedNodeMap attributes = root.getAttributes();
-        for (int i = 0, n = attributes.getLength(); i < n; i++) {
-            Node attributeNode = attributes.item(i);
-
-            String name = attributeNode.getLocalName();
-            if (!name.startsWith(ATTR_LAYOUT_RESOURCE_PREFIX)
-                    && ANDROID_URI.equals(attributeNode.getNamespaceURI())) {
-                result.add((Attr) attributeNode);
-            }
-        }
-
-        return result;
-    }
-
-    List<String> getOldTypes() {
-        List<String> types = new ArrayList<String>();
-        for (Element primary : getElements()) {
-            String oldType = primary.getTagName();
-            if (oldType.indexOf('.') == -1
-                    && !oldType.equals(VIEW_INCLUDE) && !oldType.equals(VIEW_FRAGMENT)) {
-                oldType = ANDROID_WIDGET_PREFIX + oldType;
-            }
-            types.add(oldType);
-        }
-
-        return types;
-    }
-
-    @Override
-    VisualRefactoringWizard createWizard() {
-        return new ChangeViewWizard(this, mDelegate);
-    }
-
-    public static class Descriptor extends VisualRefactoringDescriptor {
-        public Descriptor(String project, String description, String comment,
-                Map<String, String> arguments) {
-            super("com.android.ide.eclipse.adt.refactoring.changeview", //$NON-NLS-1$
-                    project, description, comment, arguments);
-        }
-
-        @Override
-        protected Refactoring createRefactoring(Map<String, String> args) {
-            return new ChangeViewRefactoring(args);
-        }
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/ChangeViewWizard.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/ChangeViewWizard.java
deleted file mode 100644
index 0ac7106..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/ChangeViewWizard.java
+++ /dev/null
@@ -1,199 +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.eclipse.adt.internal.editors.layout.refactoring;
-
-import static com.android.SdkConstants.REQUEST_FOCUS;
-import static com.android.SdkConstants.VIEW_FRAGMENT;
-import static com.android.SdkConstants.VIEW_INCLUDE;
-
-import com.android.ide.eclipse.adt.internal.editors.layout.LayoutEditorDelegate;
-import com.android.ide.eclipse.adt.internal.editors.layout.descriptors.ViewElementDescriptor;
-import com.android.ide.eclipse.adt.internal.editors.layout.gle2.CustomViewFinder;
-import com.android.ide.eclipse.adt.internal.editors.layout.gre.ViewMetadataRepository;
-import com.android.ide.eclipse.adt.internal.sdk.AndroidTargetData;
-import com.android.ide.eclipse.adt.internal.sdk.Sdk;
-import com.android.sdklib.IAndroidTarget;
-import com.android.utils.Pair;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Combo;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Label;
-
-import java.util.ArrayList;
-import java.util.List;
-
-class ChangeViewWizard extends VisualRefactoringWizard {
-    private static final String SEPARATOR_LABEL =
-        "----------------------------------------"; //$NON-NLS-1$
-
-    public ChangeViewWizard(ChangeViewRefactoring ref, LayoutEditorDelegate editor) {
-        super(ref, editor);
-        setDefaultPageTitle("Change Widget Type");
-    }
-
-    @Override
-    protected void addUserInputPages() {
-        ChangeViewRefactoring ref = (ChangeViewRefactoring) getRefactoring();
-        List<String> oldTypes = ref.getOldTypes();
-        String oldType = null;
-        for (String type : oldTypes) {
-            if (oldType == null) {
-                oldType = type;
-            } else if (!oldType.equals(type)) {
-                // If the types differ, don't offer related categories
-                oldType = null;
-                break;
-            }
-        }
-        addPage(new InputPage(mDelegate.getEditor().getProject(), oldType));
-    }
-
-    /** Wizard page which inputs parameters for the {@link ChangeViewRefactoring} operation */
-    private static class InputPage extends VisualRefactoringInputPage {
-        private final IProject mProject;
-        private Combo mTypeCombo;
-        private final String mOldType;
-        private List<String> mClassNames;
-
-        public InputPage(IProject project, String oldType) {
-            super("ChangeViewInputPage");  //$NON-NLS-1$
-            mProject = project;
-            mOldType = oldType;
-        }
-
-        @Override
-        public void createControl(Composite parent) {
-            Composite composite = new Composite(parent, SWT.NONE);
-            composite.setLayout(new GridLayout(2, false));
-
-            Label typeLabel = new Label(composite, SWT.NONE);
-            typeLabel.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1));
-            typeLabel.setText("New Widget Type:");
-
-            mTypeCombo = new Combo(composite, SWT.READ_ONLY);
-            mTypeCombo.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
-            mTypeCombo.addSelectionListener(mSelectionValidateListener);
-
-            mClassNames = getWidgetTypes(mOldType, mTypeCombo);
-            mTypeCombo.select(0);
-
-            setControl(composite);
-            validatePage();
-
-            mTypeCombo.setFocus();
-        }
-
-        private List<String> getWidgetTypes(String oldType, Combo combo) {
-            List<String> classNames = new ArrayList<String>();
-
-            // Populate type combo
-            Sdk currentSdk = Sdk.getCurrent();
-            if (currentSdk != null) {
-                IAndroidTarget target = currentSdk.getTarget(mProject);
-                if (target != null) {
-                    // Try to pick "related" widgets to the one you have selected.
-                    // For example, for an AnalogClock, display DigitalClock first.
-                    // For a Text, offer EditText, AutoComplete, etc.
-                    if (oldType != null) {
-                        ViewMetadataRepository repository = ViewMetadataRepository.get();
-                        List<String> relatedTo = repository.getRelatedTo(oldType);
-                        if (relatedTo.size() > 0) {
-                            for (String className : relatedTo) {
-                                String base = className.substring(className.lastIndexOf('.') + 1);
-                                combo.add(base);
-                                classNames.add(className);
-                            }
-                            combo.add(SEPARATOR_LABEL);
-                            classNames.add(null);
-                        }
-                    }
-
-                    Pair<List<String>,List<String>> result =
-                        CustomViewFinder.findViews(mProject, false);
-                    List<String> customViews = result.getFirst();
-                    List<String> thirdPartyViews = result.getSecond();
-                    if (customViews.size() > 0) {
-                        for (String view : customViews) {
-                            combo.add(view);
-                            classNames.add(view);
-                        }
-                        combo.add(SEPARATOR_LABEL);
-                        classNames.add(null);
-                    }
-
-                    if (thirdPartyViews.size() > 0) {
-                        for (String view : thirdPartyViews) {
-                            combo.add(view);
-                            classNames.add(view);
-                        }
-                        combo.add(SEPARATOR_LABEL);
-                        classNames.add(null);
-                    }
-
-                    AndroidTargetData targetData = currentSdk.getTargetData(target);
-                    if (targetData != null) {
-                        // Now add ALL known layout descriptors in case the user has
-                        // a special case
-                        List<ViewElementDescriptor> descriptors =
-                            targetData.getLayoutDescriptors().getViewDescriptors();
-                        for (ViewElementDescriptor d : descriptors) {
-                            String className = d.getFullClassName();
-                            if (className.equals(VIEW_INCLUDE)
-                                    || className.equals(VIEW_FRAGMENT)
-                                    || className.equals(REQUEST_FOCUS)) {
-                                continue;
-                            }
-                            combo.add(d.getUiName());
-                            classNames.add(className);
-
-                        }
-                    }
-                }
-            } else {
-                combo.add("SDK not initialized");
-                classNames.add(null);
-            }
-
-            return classNames;
-        }
-
-        @Override
-        protected boolean validatePage() {
-            boolean ok = true;
-            int selectionIndex = mTypeCombo.getSelectionIndex();
-            String type = selectionIndex != -1 ? mClassNames.get(selectionIndex) : null;
-            if (type == null) {
-                setErrorMessage("Select a widget type to convert to");
-                ok = false; // The user has chosen a separator
-            } else {
-                setErrorMessage(null);
-            }
-
-            // Record state
-            ChangeViewRefactoring refactoring =
-                (ChangeViewRefactoring) getRefactoring();
-            refactoring.setType(type);
-
-            setPageComplete(ok);
-            return ok;
-        }
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/ExtractIncludeAction.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/ExtractIncludeAction.java
deleted file mode 100644
index 6f96fe4..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/ExtractIncludeAction.java
+++ /dev/null
@@ -1,47 +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.eclipse.adt.internal.editors.layout.refactoring;
-
-import com.android.ide.eclipse.adt.internal.editors.layout.LayoutEditorDelegate;
-
-import org.eclipse.jface.action.IAction;
-import org.eclipse.ltk.ui.refactoring.RefactoringWizard;
-import org.eclipse.ltk.ui.refactoring.RefactoringWizardOpenOperation;
-
-/**
- * Action executed when the "Extract as Include" menu item is invoked.
- */
-public class ExtractIncludeAction extends VisualRefactoringAction {
-    @Override
-    public void run(IAction action) {
-        if ((mTextSelection != null || mTreeSelection != null) && mFile != null) {
-            ExtractIncludeRefactoring ref = new ExtractIncludeRefactoring(mFile, mDelegate,
-                    mTextSelection, mTreeSelection);
-            RefactoringWizard wizard = new ExtractIncludeWizard(ref, mDelegate);
-            RefactoringWizardOpenOperation op = new RefactoringWizardOpenOperation(wizard);
-            try {
-                op.run(mWindow.getShell(), wizard.getDefaultPageTitle());
-            } catch (InterruptedException e) {
-                // Interrupted. Pass.
-            }
-        }
-    }
-
-    public static IAction create(LayoutEditorDelegate editorDelegate) {
-        return create("Extract Include...", editorDelegate, ExtractIncludeAction.class);
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/ExtractIncludeContribution.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/ExtractIncludeContribution.java
deleted file mode 100644
index 5903812..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/ExtractIncludeContribution.java
+++ /dev/null
@@ -1,40 +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.eclipse.adt.internal.editors.layout.refactoring;
-
-import org.eclipse.ltk.core.refactoring.RefactoringContribution;
-import org.eclipse.ltk.core.refactoring.RefactoringDescriptor;
-
-import java.util.Map;
-
-public class ExtractIncludeContribution extends RefactoringContribution {
-
-    @SuppressWarnings("unchecked")
-    @Override
-    public RefactoringDescriptor createDescriptor(String id, String project, String description,
-            String comment, Map arguments, int flags) throws IllegalArgumentException {
-        return new ExtractIncludeRefactoring.Descriptor(project, description, comment, arguments);
-    }
-
-    @SuppressWarnings("unchecked")
-    @Override
-    public Map retrieveArgumentMap(RefactoringDescriptor descriptor) {
-        if (descriptor instanceof ExtractIncludeRefactoring.Descriptor) {
-            return ((ExtractIncludeRefactoring.Descriptor) descriptor).getArguments();
-        }
-        return super.retrieveArgumentMap(descriptor);
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/ExtractIncludeRefactoring.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/ExtractIncludeRefactoring.java
deleted file mode 100644
index f58ac55..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/ExtractIncludeRefactoring.java
+++ /dev/null
@@ -1,670 +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.eclipse.adt.internal.editors.layout.refactoring;
-
-import static com.android.SdkConstants.ANDROID_NS_NAME;
-import static com.android.SdkConstants.ANDROID_URI;
-import static com.android.SdkConstants.ATTR_ID;
-import static com.android.SdkConstants.ATTR_LAYOUT_HEIGHT;
-import static com.android.SdkConstants.ATTR_LAYOUT_RESOURCE_PREFIX;
-import static com.android.SdkConstants.ATTR_LAYOUT_WIDTH;
-import static com.android.SdkConstants.DOT_XML;
-import static com.android.SdkConstants.EXT_XML;
-import static com.android.SdkConstants.FD_RES;
-import static com.android.SdkConstants.FD_RESOURCES;
-import static com.android.SdkConstants.FD_RES_LAYOUT;
-import static com.android.SdkConstants.ID_PREFIX;
-import static com.android.SdkConstants.NEW_ID_PREFIX;
-import static com.android.SdkConstants.VALUE_WRAP_CONTENT;
-import static com.android.SdkConstants.VIEW_INCLUDE;
-import static com.android.SdkConstants.XMLNS;
-import static com.android.SdkConstants.XMLNS_PREFIX;
-import static com.android.ide.eclipse.adt.AdtConstants.WS_SEP;
-import static com.android.resources.ResourceType.LAYOUT;
-
-import com.android.annotations.NonNull;
-import com.android.annotations.VisibleForTesting;
-import com.android.ide.common.xml.XmlFormatStyle;
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.ide.eclipse.adt.internal.editors.formatting.EclipseXmlFormatPreferences;
-import com.android.ide.eclipse.adt.internal.editors.formatting.EclipseXmlPrettyPrinter;
-import com.android.ide.eclipse.adt.internal.editors.layout.LayoutEditorDelegate;
-import com.android.ide.eclipse.adt.internal.editors.layout.gle2.CanvasViewInfo;
-import com.android.ide.eclipse.adt.internal.editors.layout.gle2.DomUtilities;
-import com.android.ide.eclipse.adt.internal.editors.layout.uimodel.UiViewElementNode;
-import com.android.ide.eclipse.adt.internal.preferences.AdtPrefs;
-import com.android.ide.eclipse.adt.internal.resources.ResourceNameValidator;
-import com.android.utils.XmlUtils;
-
-import org.eclipse.core.resources.IContainer;
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IFolder;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.OperationCanceledException;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.jface.dialogs.IInputValidator;
-import org.eclipse.jface.text.ITextSelection;
-import org.eclipse.jface.viewers.ITreeSelection;
-import org.eclipse.ltk.core.refactoring.Change;
-import org.eclipse.ltk.core.refactoring.NullChange;
-import org.eclipse.ltk.core.refactoring.Refactoring;
-import org.eclipse.ltk.core.refactoring.RefactoringStatus;
-import org.eclipse.ltk.core.refactoring.TextFileChange;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.text.edits.InsertEdit;
-import org.eclipse.text.edits.MultiTextEdit;
-import org.eclipse.text.edits.ReplaceEdit;
-import org.eclipse.text.edits.TextEdit;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.wst.sse.core.StructuredModelManager;
-import org.eclipse.wst.sse.core.internal.provisional.IModelManager;
-import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
-import org.eclipse.wst.sse.core.internal.provisional.IndexedRegion;
-import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMDocument;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
-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 java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Locale;
-import java.util.Map;
-
-/**
- * Extracts the selection and writes it out as a separate layout file, then adds an
- * include to that new layout file. Interactively asks the user for a new name for the
- * layout.
- */
-@SuppressWarnings("restriction") // XML model
-public class ExtractIncludeRefactoring extends VisualRefactoring {
-    private static final String KEY_NAME = "name";                      //$NON-NLS-1$
-    private static final String KEY_OCCURRENCES = "all-occurrences";    //$NON-NLS-1$
-    private String mLayoutName;
-    private boolean mReplaceOccurrences;
-
-    /**
-     * This constructor is solely used by {@link Descriptor},
-     * to replay a previous refactoring.
-     * @param arguments argument map created by #createArgumentMap.
-     */
-    ExtractIncludeRefactoring(Map<String, String> arguments) {
-        super(arguments);
-        mLayoutName = arguments.get(KEY_NAME);
-        mReplaceOccurrences  = Boolean.parseBoolean(arguments.get(KEY_OCCURRENCES));
-    }
-
-    public ExtractIncludeRefactoring(
-            IFile file,
-            LayoutEditorDelegate delegate,
-            ITextSelection selection,
-            ITreeSelection treeSelection) {
-        super(file, delegate, selection, treeSelection);
-    }
-
-    @VisibleForTesting
-    ExtractIncludeRefactoring(List<Element> selectedElements, LayoutEditorDelegate editor) {
-        super(selectedElements, editor);
-    }
-
-    @Override
-    public RefactoringStatus checkInitialConditions(IProgressMonitor pm) throws CoreException,
-            OperationCanceledException {
-        RefactoringStatus status = new RefactoringStatus();
-
-        try {
-            pm.beginTask("Checking preconditions...", 6);
-
-            if (mSelectionStart == -1 || mSelectionEnd == -1) {
-                status.addFatalError("No selection to extract");
-                return status;
-            }
-
-            // Make sure the selection is contiguous
-            if (mTreeSelection != null) {
-                // TODO - don't do this if we based the selection on text. In this case,
-                // make sure we're -balanced-.
-                List<CanvasViewInfo> infos = getSelectedViewInfos();
-                if (!validateNotEmpty(infos, status)) {
-                    return status;
-                }
-
-                if (!validateNotRoot(infos, status)) {
-                    return status;
-                }
-
-                // Disable if you've selected a single include tag
-                if (infos.size() == 1) {
-                    UiViewElementNode uiNode = infos.get(0).getUiViewNode();
-                    if (uiNode != null) {
-                        Node xmlNode = uiNode.getXmlNode();
-                        if (xmlNode.getLocalName().equals(VIEW_INCLUDE)) {
-                            status.addWarning("No point in refactoring a single include tag");
-                        }
-                    }
-                }
-
-                // Enforce that the selection is -contiguous-
-                if (!validateContiguous(infos, status)) {
-                    return status;
-                }
-            }
-
-            // This also ensures that we have a valid DOM model:
-            if (mElements.size() == 0) {
-                status.addFatalError("Nothing to extract");
-                return status;
-            }
-
-            pm.worked(1);
-            return status;
-
-        } finally {
-            pm.done();
-        }
-    }
-
-    @Override
-    protected VisualRefactoringDescriptor createDescriptor() {
-        String comment = getName();
-        return new Descriptor(
-                mProject.getName(), //project
-                comment, //description
-                comment, //comment
-                createArgumentMap());
-    }
-
-    @Override
-    protected Map<String, String> createArgumentMap() {
-        Map<String, String> args = super.createArgumentMap();
-        args.put(KEY_NAME, mLayoutName);
-        args.put(KEY_OCCURRENCES, Boolean.toString(mReplaceOccurrences));
-
-        return args;
-    }
-
-    @Override
-    public String getName() {
-        return "Extract as Include";
-    }
-
-    void setLayoutName(String layoutName) {
-        mLayoutName = layoutName;
-    }
-
-    void setReplaceOccurrences(boolean selection) {
-        mReplaceOccurrences = selection;
-    }
-
-    // ---- Actual implementation of Extract as Include modification computation ----
-
-    @Override
-    protected @NonNull List<Change> computeChanges(IProgressMonitor monitor) {
-        String extractedText = getExtractedText();
-
-        String namespaceDeclarations = computeNamespaceDeclarations();
-
-        // Insert namespace:
-        extractedText = insertNamespace(extractedText, namespaceDeclarations);
-
-        StringBuilder sb = new StringBuilder();
-        sb.append("<?xml version=\"1.0\" encoding=\"utf-8\"?>\n"); //$NON-NLS-1$
-        sb.append(extractedText);
-        sb.append('\n');
-
-        List<Change> changes = new ArrayList<Change>();
-
-        String newFileName = mLayoutName + DOT_XML;
-        IProject project = mDelegate.getEditor().getProject();
-        IFile sourceFile = mDelegate.getEditor().getInputFile();
-        if (sourceFile == null) {
-            return changes;
-        }
-
-        // Replace extracted elements by <include> tag
-        handleIncludingFile(changes, sourceFile, mSelectionStart, mSelectionEnd,
-                getDomDocument(), getPrimaryElement());
-
-        // Also extract in other variations of the same file (landscape/portrait, etc)
-        boolean haveVariations = false;
-        if (mReplaceOccurrences) {
-            List<IFile> layouts = getOtherLayouts(sourceFile);
-            for (IFile file : layouts) {
-                IModelManager modelManager = StructuredModelManager.getModelManager();
-                IStructuredModel model = null;
-                // We could enhance this with a SubMonitor to make the progress bar move as
-                // well.
-                monitor.subTask(String.format("Looking for duplicates in %1$s",
-                        file.getProjectRelativePath()));
-                if (monitor.isCanceled()) {
-                    throw new OperationCanceledException();
-                }
-
-                try {
-                    model = modelManager.getModelForRead(file);
-                    if (model instanceof IDOMModel) {
-                        IDOMModel domModel = (IDOMModel) model;
-                        IDOMDocument otherDocument = domModel.getDocument();
-                        List<Element> otherElements = new ArrayList<Element>();
-                        Element otherPrimary = null;
-
-                        for (Element element : getElements()) {
-                            Element other = DomUtilities.findCorresponding(element,
-                                    otherDocument);
-                            if (other != null) {
-                                // See if the structure is similar to what we have in this
-                                // document
-                                if (DomUtilities.isEquivalent(element, other)) {
-                                    otherElements.add(other);
-                                    if (element == getPrimaryElement()) {
-                                        otherPrimary = other;
-                                    }
-                                }
-                            }
-                        }
-
-                        // Only perform extract in the other file if we find a match for
-                        // ALL of elements being extracted, and if they too are contiguous
-                        if (otherElements.size() == getElements().size() &&
-                                DomUtilities.isContiguous(otherElements)) {
-                            // Find the range
-                            int begin = Integer.MAX_VALUE;
-                            int end = Integer.MIN_VALUE;
-                            for (Element element : otherElements) {
-                                // Yes!! Extract this one as well!
-                                IndexedRegion region = getRegion(element);
-                                end = Math.max(end, region.getEndOffset());
-                                begin = Math.min(begin, region.getStartOffset());
-                            }
-                            handleIncludingFile(changes, file, begin,
-                                    end, otherDocument, otherPrimary);
-                            haveVariations = true;
-                        }
-                    }
-                } catch (IOException e) {
-                    AdtPlugin.log(e, null);
-                } catch (CoreException e) {
-                    AdtPlugin.log(e, null);
-                } finally {
-                    if (model != null) {
-                        model.releaseFromRead();
-                    }
-                }
-            }
-        }
-
-        // Add change to create the new file
-        IContainer parent = sourceFile.getParent();
-        if (haveVariations) {
-            // If we're extracting from multiple configuration folders, then we need to
-            // place the extracted include in the base layout folder (if not it goes next to
-            // the including file)
-            parent = mProject.getFolder(FD_RES).getFolder(FD_RES_LAYOUT);
-        }
-        IPath parentPath = parent.getProjectRelativePath();
-        final IFile file = project.getFile(new Path(parentPath + WS_SEP + newFileName));
-        TextFileChange addFile = new TextFileChange("Create new separate layout", file);
-        addFile.setTextType(EXT_XML);
-        changes.add(addFile);
-
-        String newFile = sb.toString();
-        if (AdtPrefs.getPrefs().getFormatGuiXml()) {
-            newFile = EclipseXmlPrettyPrinter.prettyPrint(newFile,
-                    EclipseXmlFormatPreferences.create(), XmlFormatStyle.LAYOUT,
-                    null /*lineSeparator*/);
-        }
-        addFile.setEdit(new InsertEdit(0, newFile));
-
-        Change finishHook = createFinishHook(file);
-        changes.add(finishHook);
-
-        return changes;
-    }
-
-    private void handleIncludingFile(List<Change> changes,
-            IFile sourceFile, int begin, int end, Document document, Element primary) {
-        TextFileChange change = new TextFileChange(sourceFile.getName(), sourceFile);
-        MultiTextEdit rootEdit = new MultiTextEdit();
-        change.setTextType(EXT_XML);
-        changes.add(change);
-
-        String referenceId = getReferenceId();
-        // Replace existing elements in the source file and insert <include>
-        String androidNsPrefix = getAndroidNamespacePrefix(document);
-        String include = computeIncludeString(primary, mLayoutName, androidNsPrefix, referenceId);
-        int length = end - begin;
-        ReplaceEdit replace = new ReplaceEdit(begin, length, include);
-        rootEdit.addChild(replace);
-
-        // Update any layout references to the old id with the new id
-        if (referenceId != null && primary != null) {
-            String rootId = getId(primary);
-            IStructuredModel model = null;
-            try {
-                model = StructuredModelManager.getModelManager().getModelForRead(sourceFile);
-                IStructuredDocument doc = model.getStructuredDocument();
-                if (doc != null && rootId != null) {
-                    List<TextEdit> replaceIds = replaceIds(androidNsPrefix, doc, begin,
-                            end, rootId, referenceId);
-                    for (TextEdit edit : replaceIds) {
-                        rootEdit.addChild(edit);
-                    }
-
-                    if (AdtPrefs.getPrefs().getFormatGuiXml()) {
-                        MultiTextEdit formatted = reformat(doc.get(), rootEdit,
-                                XmlFormatStyle.LAYOUT);
-                        if (formatted != null) {
-                            rootEdit = formatted;
-                        }
-                    }
-                }
-            } catch (IOException e) {
-                AdtPlugin.log(e, null);
-            } catch (CoreException e) {
-                AdtPlugin.log(e, null);
-            } finally {
-                if (model != null) {
-                    model.releaseFromRead();
-                }
-            }
-        }
-
-        change.setEdit(rootEdit);
-    }
-
-    /**
-     * Returns a list of all the other layouts (in all configurations) in the project other
-     * than the given source layout where the refactoring was initiated. Never null.
-     */
-    private List<IFile> getOtherLayouts(IFile sourceFile) {
-        List<IFile> layouts = new ArrayList<IFile>(100);
-        IPath sourcePath = sourceFile.getProjectRelativePath();
-        IFolder resources = mProject.getFolder(FD_RESOURCES);
-        try {
-            for (IResource folder : resources.members()) {
-                if (folder.getName().startsWith(FD_RES_LAYOUT) &&
-                        folder instanceof IFolder) {
-                    IFolder layoutFolder = (IFolder) folder;
-                    for (IResource file : layoutFolder.members()) {
-                        if (file.getName().endsWith(EXT_XML)
-                                && file instanceof IFile) {
-                            if (!file.getProjectRelativePath().equals(sourcePath)) {
-                                layouts.add((IFile) file);
-                            }
-                        }
-                    }
-                }
-            }
-        } catch (CoreException e) {
-            AdtPlugin.log(e, null);
-        }
-
-        return layouts;
-    }
-
-    String getInitialName() {
-        String defaultName = ""; //$NON-NLS-1$
-        Element primary = getPrimaryElement();
-        if (primary != null) {
-            String id = primary.getAttributeNS(ANDROID_URI, ATTR_ID);
-            // id null check for https://bugs.eclipse.org/bugs/show_bug.cgi?id=272378
-            if (id != null && (id.startsWith(ID_PREFIX) || id.startsWith(NEW_ID_PREFIX))) {
-                // Use everything following the id/, and make it lowercase since that is
-                // the convention for layouts (and use Locale.US to ensure that "Image" becomes
-                // "image" etc)
-                defaultName = id.substring(id.indexOf('/') + 1).toLowerCase(Locale.US);
-
-                IInputValidator validator = ResourceNameValidator.create(true, mProject, LAYOUT);
-
-                if (validator.isValid(defaultName) != null) { // Already exists?
-                    defaultName = ""; //$NON-NLS-1$
-                }
-            }
-        }
-
-        return defaultName;
-    }
-
-    IFile getSourceFile() {
-        return mFile;
-    }
-
-    private Change createFinishHook(final IFile file) {
-        return new NullChange("Open extracted layout and refresh resources") {
-            @Override
-            public Change perform(IProgressMonitor pm) throws CoreException {
-                Display display = AdtPlugin.getDisplay();
-                display.asyncExec(new Runnable() {
-                    @Override
-                    public void run() {
-                        openFile(file);
-                        mDelegate.getGraphicalEditor().refreshProjectResources();
-                        // Save file to trigger include finder scanning (as well as making
-                        // the
-                        // actual show-include feature work since it relies on reading
-                        // files from
-                        // disk, not a live buffer)
-                        IWorkbenchPage page = mDelegate.getEditor().getEditorSite().getPage();
-                        page.saveEditor(mDelegate.getEditor(), false);
-                    }
-                });
-
-                // Not undoable: just return null instead of an undo-change.
-                return null;
-            }
-        };
-    }
-
-    private String computeNamespaceDeclarations() {
-        String androidNsPrefix = null;
-        String namespaceDeclarations = null;
-
-        StringBuilder sb = new StringBuilder();
-        List<Attr> attributeNodes = findNamespaceAttributes();
-        for (Node attributeNode : attributeNodes) {
-            String prefix = attributeNode.getPrefix();
-            if (XMLNS.equals(prefix)) {
-                sb.append(' ');
-                String name = attributeNode.getNodeName();
-                sb.append(name);
-                sb.append('=').append('"');
-
-                String value = attributeNode.getNodeValue();
-                if (value.equals(ANDROID_URI)) {
-                    androidNsPrefix = name;
-                    if (androidNsPrefix.startsWith(XMLNS_PREFIX)) {
-                        androidNsPrefix = androidNsPrefix.substring(XMLNS_PREFIX.length());
-                    }
-                }
-                sb.append(XmlUtils.toXmlAttributeValue(value));
-                sb.append('"');
-            }
-        }
-        namespaceDeclarations = sb.toString();
-
-        if (androidNsPrefix == null) {
-            androidNsPrefix = ANDROID_NS_NAME;
-        }
-
-        if (namespaceDeclarations.length() == 0) {
-            sb.setLength(0);
-            sb.append(' ');
-            sb.append(XMLNS_PREFIX);
-            sb.append(androidNsPrefix);
-            sb.append('=').append('"');
-            sb.append(ANDROID_URI);
-            sb.append('"');
-            namespaceDeclarations = sb.toString();
-        }
-
-        return namespaceDeclarations;
-    }
-
-    /** Returns the id to be used for the include tag itself (may be null) */
-    private String getReferenceId() {
-        String rootId = getRootId();
-        if (rootId != null) {
-            return rootId + "_ref";
-        }
-
-        return null;
-    }
-
-    /**
-     * Compute the actual {@code <include>} string to be inserted in place of the old
-     * selection
-     */
-    private static String computeIncludeString(Element primaryNode, String newName,
-            String androidNsPrefix, String referenceId) {
-        StringBuilder sb = new StringBuilder();
-        sb.append("<include layout=\"@layout/"); //$NON-NLS-1$
-        sb.append(newName);
-        sb.append('"');
-        sb.append(' ');
-
-        // Create new id for the include itself
-        if (referenceId != null) {
-            sb.append(androidNsPrefix);
-            sb.append(':');
-            sb.append(ATTR_ID);
-            sb.append('=').append('"');
-            sb.append(referenceId);
-            sb.append('"').append(' ');
-        }
-
-        // Add id string, unless it's a <merge>, since we may need to adjust any layout
-        // references to apply to the <include> tag instead
-
-        // I should move all the layout_ attributes as well
-        // I also need to duplicate and modify the id and then replace
-        // everything else in the file with this new id...
-
-        // HACK: see issue 13494: We must duplicate the width/height attributes on the
-        // <include> statement for designtime rendering only
-        String width = null;
-        String height = null;
-        if (primaryNode == null) {
-            // Multiple selection - in that case we will be creating an outer <merge>
-            // so we need to set our own width/height on it
-            width = height = VALUE_WRAP_CONTENT;
-        } else {
-            if (!primaryNode.hasAttributeNS(ANDROID_URI, ATTR_LAYOUT_WIDTH)) {
-                width = VALUE_WRAP_CONTENT;
-            } else {
-                width = primaryNode.getAttributeNS(ANDROID_URI, ATTR_LAYOUT_WIDTH);
-            }
-            if (!primaryNode.hasAttributeNS(ANDROID_URI, ATTR_LAYOUT_HEIGHT)) {
-                height = VALUE_WRAP_CONTENT;
-            } else {
-                height = primaryNode.getAttributeNS(ANDROID_URI, ATTR_LAYOUT_HEIGHT);
-            }
-        }
-        if (width != null) {
-            sb.append(' ');
-            sb.append(androidNsPrefix);
-            sb.append(':');
-            sb.append(ATTR_LAYOUT_WIDTH);
-            sb.append('=').append('"');
-            sb.append(XmlUtils.toXmlAttributeValue(width));
-            sb.append('"');
-        }
-        if (height != null) {
-            sb.append(' ');
-            sb.append(androidNsPrefix);
-            sb.append(':');
-            sb.append(ATTR_LAYOUT_HEIGHT);
-            sb.append('=').append('"');
-            sb.append(XmlUtils.toXmlAttributeValue(height));
-            sb.append('"');
-        }
-
-        // Duplicate all the other layout attributes as well
-        if (primaryNode != null) {
-            NamedNodeMap attributes = primaryNode.getAttributes();
-            for (int i = 0, n = attributes.getLength(); i < n; i++) {
-                Node attr = attributes.item(i);
-                String name = attr.getLocalName();
-                if (name.startsWith(ATTR_LAYOUT_RESOURCE_PREFIX)
-                        && ANDROID_URI.equals(attr.getNamespaceURI())) {
-                    if (name.equals(ATTR_LAYOUT_WIDTH) || name.equals(ATTR_LAYOUT_HEIGHT)) {
-                        // Already handled
-                        continue;
-                    }
-
-                    sb.append(' ');
-                    sb.append(androidNsPrefix);
-                    sb.append(':');
-                    sb.append(name);
-                    sb.append('=').append('"');
-                    sb.append(XmlUtils.toXmlAttributeValue(attr.getNodeValue()));
-                    sb.append('"');
-                }
-            }
-        }
-
-        sb.append("/>");
-        return sb.toString();
-    }
-
-    /** Return the text in the document in the range start to end */
-    private String getExtractedText() {
-        String xml = getText(mSelectionStart, mSelectionEnd);
-        Element primaryNode = getPrimaryElement();
-        xml = stripTopLayoutAttributes(primaryNode, mSelectionStart, xml);
-        xml = dedent(xml);
-
-        // Wrap siblings in <merge>?
-        if (primaryNode == null) {
-            StringBuilder sb = new StringBuilder();
-            sb.append("<merge>\n"); //$NON-NLS-1$
-            // indent an extra level
-            for (String line : xml.split("\n")) { //$NON-NLS-1$
-                sb.append("    "); //$NON-NLS-1$
-                sb.append(line).append('\n');
-            }
-            sb.append("</merge>\n"); //$NON-NLS-1$
-            xml = sb.toString();
-        }
-
-        return xml;
-    }
-
-    @Override
-    VisualRefactoringWizard createWizard() {
-        return new ExtractIncludeWizard(this, mDelegate);
-    }
-
-    public static class Descriptor extends VisualRefactoringDescriptor {
-        public Descriptor(String project, String description, String comment,
-                Map<String, String> arguments) {
-            super("com.android.ide.eclipse.adt.refactoring.extract.include", //$NON-NLS-1$
-                    project, description, comment, arguments);
-        }
-
-        @Override
-        protected Refactoring createRefactoring(Map<String, String> args) {
-            return new ExtractIncludeRefactoring(args);
-        }
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/ExtractIncludeWizard.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/ExtractIncludeWizard.java
deleted file mode 100644
index f3ac3f1..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/ExtractIncludeWizard.java
+++ /dev/null
@@ -1,126 +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.eclipse.adt.internal.editors.layout.refactoring;
-
-import com.android.ide.eclipse.adt.internal.editors.layout.LayoutEditorDelegate;
-import com.android.ide.eclipse.adt.internal.resources.ResourceNameValidator;
-import com.android.resources.ResourceType;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Text;
-
-class ExtractIncludeWizard extends VisualRefactoringWizard {
-    public ExtractIncludeWizard(ExtractIncludeRefactoring ref, LayoutEditorDelegate editor) {
-        super(ref, editor);
-        setDefaultPageTitle(ref.getName());
-    }
-
-    @Override
-    protected void addUserInputPages() {
-        ExtractIncludeRefactoring ref = (ExtractIncludeRefactoring) getRefactoring();
-        String initialName = ref.getInitialName();
-        IFile sourceFile = ref.getSourceFile();
-        addPage(new InputPage(mDelegate.getEditor().getProject(), sourceFile, initialName));
-    }
-
-    /** Wizard page which inputs parameters for the {@link ExtractIncludeRefactoring} operation */
-    private static class InputPage extends VisualRefactoringInputPage {
-        private final IProject mProject;
-        private final IFile mSourceFile;
-        private final String mSuggestedName;
-        private Text mNameText;
-        private Button mReplaceAllOccurrences;
-
-        public InputPage(IProject project, IFile sourceFile, String suggestedName) {
-            super("ExtractIncludeInputPage");
-            mProject = project;
-            mSourceFile = sourceFile;
-            mSuggestedName = suggestedName;
-        }
-
-        @Override
-        public void createControl(Composite parent) {
-            Composite composite = new Composite(parent, SWT.NONE);
-            composite.setLayout(new GridLayout(2, false));
-
-            Label nameLabel = new Label(composite, SWT.NONE);
-            nameLabel.setText("New Layout Name:");
-            nameLabel.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1));
-
-            mNameText = new Text(composite, SWT.BORDER);
-            mNameText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
-            mNameText.addModifyListener(mModifyValidateListener);
-
-            mReplaceAllOccurrences = new Button(composite, SWT.CHECK);
-            mReplaceAllOccurrences.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER,
-                    false, false, 2, 1));
-            mReplaceAllOccurrences.setText(
-                    "Replace occurrences in all layouts with include to new layout");
-            mReplaceAllOccurrences.setEnabled(true);
-            mReplaceAllOccurrences.setSelection(true);
-            mReplaceAllOccurrences.addSelectionListener(mSelectionValidateListener);
-
-            // Initialize UI:
-            if (mSuggestedName != null) {
-                mNameText.setText(mSuggestedName);
-            }
-
-            setControl(composite);
-            validatePage();
-        }
-
-        @Override
-        protected boolean validatePage() {
-            boolean ok = true;
-
-            String text = mNameText.getText().trim();
-
-            if (text.length() == 0) {
-                setErrorMessage("Provide a name for the new layout");
-                ok = false;
-            } else {
-                ResourceNameValidator validator = ResourceNameValidator.create(false, mProject,
-                        ResourceType.LAYOUT);
-                String message = validator.isValid(text);
-                if (message != null) {
-                    setErrorMessage(message);
-                    ok = false;
-                }
-            }
-
-            if (ok) {
-                setErrorMessage(null);
-
-                // Record state
-                ExtractIncludeRefactoring refactoring =
-                    (ExtractIncludeRefactoring) getRefactoring();
-                refactoring.setLayoutName(text);
-                refactoring.setReplaceOccurrences(mReplaceAllOccurrences.getSelection());
-            }
-
-            setPageComplete(ok);
-            return ok;
-        }
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/ExtractStyleAction.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/ExtractStyleAction.java
deleted file mode 100644
index 4a49863..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/ExtractStyleAction.java
+++ /dev/null
@@ -1,47 +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.eclipse.adt.internal.editors.layout.refactoring;
-
-import com.android.ide.eclipse.adt.internal.editors.layout.LayoutEditorDelegate;
-
-import org.eclipse.jface.action.IAction;
-import org.eclipse.ltk.ui.refactoring.RefactoringWizard;
-import org.eclipse.ltk.ui.refactoring.RefactoringWizardOpenOperation;
-
-/**
- * Action executed when the "Extract Style" menu item is invoked.
- */
-public class ExtractStyleAction extends VisualRefactoringAction {
-    @Override
-    public void run(IAction action) {
-        if ((mTextSelection != null || mTreeSelection != null) && mFile != null) {
-            ExtractStyleRefactoring ref = new ExtractStyleRefactoring(mFile, mDelegate,
-                    mTextSelection, mTreeSelection);
-            RefactoringWizard wizard = new ExtractStyleWizard(ref, mDelegate);
-            RefactoringWizardOpenOperation op = new RefactoringWizardOpenOperation(wizard);
-            try {
-                op.run(mWindow.getShell(), wizard.getDefaultPageTitle());
-            } catch (InterruptedException e) {
-                // Interrupted. Pass.
-            }
-        }
-    }
-
-    public static IAction create(LayoutEditorDelegate editorDelegate) {
-        return create("Extract Style...", editorDelegate, ExtractStyleAction.class);
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/ExtractStyleContribution.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/ExtractStyleContribution.java
deleted file mode 100644
index 95fbdbc..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/ExtractStyleContribution.java
+++ /dev/null
@@ -1,40 +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.eclipse.adt.internal.editors.layout.refactoring;
-
-import org.eclipse.ltk.core.refactoring.RefactoringContribution;
-import org.eclipse.ltk.core.refactoring.RefactoringDescriptor;
-
-import java.util.Map;
-
-public class ExtractStyleContribution extends RefactoringContribution {
-
-    @SuppressWarnings("unchecked")
-    @Override
-    public RefactoringDescriptor createDescriptor(String id, String project, String description,
-            String comment, Map arguments, int flags) throws IllegalArgumentException {
-        return new ExtractStyleRefactoring.Descriptor(project, description, comment, arguments);
-    }
-
-    @SuppressWarnings("unchecked")
-    @Override
-    public Map retrieveArgumentMap(RefactoringDescriptor descriptor) {
-        if (descriptor instanceof ExtractStyleRefactoring.Descriptor) {
-            return ((ExtractStyleRefactoring.Descriptor) descriptor).getArguments();
-        }
-        return super.retrieveArgumentMap(descriptor);
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/ExtractStyleRefactoring.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/ExtractStyleRefactoring.java
deleted file mode 100644
index 9b1770d..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/ExtractStyleRefactoring.java
+++ /dev/null
@@ -1,579 +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.eclipse.adt.internal.editors.layout.refactoring;
-
-import static com.android.SdkConstants.ANDROID_NS_NAME;
-import static com.android.SdkConstants.ANDROID_NS_NAME_PREFIX;
-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_LAYOUT_MARGIN;
-import static com.android.SdkConstants.ATTR_LAYOUT_RESOURCE_PREFIX;
-import static com.android.SdkConstants.ATTR_NAME;
-import static com.android.SdkConstants.ATTR_ON_CLICK;
-import static com.android.SdkConstants.ATTR_PARENT;
-import static com.android.SdkConstants.ATTR_SRC;
-import static com.android.SdkConstants.ATTR_STYLE;
-import static com.android.SdkConstants.ATTR_TEXT;
-import static com.android.SdkConstants.EXT_XML;
-import static com.android.SdkConstants.FD_RESOURCES;
-import static com.android.SdkConstants.FD_RES_VALUES;
-import static com.android.SdkConstants.PREFIX_ANDROID;
-import static com.android.SdkConstants.PREFIX_RESOURCE_REF;
-import static com.android.SdkConstants.REFERENCE_STYLE;
-import static com.android.SdkConstants.TAG_ITEM;
-import static com.android.SdkConstants.TAG_RESOURCES;
-import static com.android.SdkConstants.XMLNS_PREFIX;
-import static com.android.ide.eclipse.adt.AdtConstants.WS_SEP;
-
-import com.android.annotations.NonNull;
-import com.android.annotations.VisibleForTesting;
-import com.android.ide.common.rendering.api.ResourceValue;
-import com.android.ide.common.resources.ResourceResolver;
-import com.android.ide.common.xml.XmlFormatStyle;
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.ide.eclipse.adt.internal.editors.AndroidXmlEditor;
-import com.android.ide.eclipse.adt.internal.editors.descriptors.DescriptorsUtils;
-import com.android.ide.eclipse.adt.internal.editors.layout.LayoutEditorDelegate;
-import com.android.ide.eclipse.adt.internal.preferences.AdtPrefs;
-import com.android.ide.eclipse.adt.internal.wizards.newxmlfile.NewXmlFileWizard;
-import com.android.utils.Pair;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.OperationCanceledException;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.jface.text.ITextSelection;
-import org.eclipse.jface.viewers.ITreeSelection;
-import org.eclipse.ltk.core.refactoring.Change;
-import org.eclipse.ltk.core.refactoring.Refactoring;
-import org.eclipse.ltk.core.refactoring.RefactoringStatus;
-import org.eclipse.ltk.core.refactoring.TextFileChange;
-import org.eclipse.text.edits.InsertEdit;
-import org.eclipse.text.edits.MultiTextEdit;
-import org.eclipse.wst.sse.core.StructuredModelManager;
-import org.eclipse.wst.sse.core.internal.provisional.IModelManager;
-import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
-import org.eclipse.wst.sse.core.internal.provisional.IndexedRegion;
-import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMDocument;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
-import org.w3c.dom.Attr;
-import org.w3c.dom.Element;
-import org.w3c.dom.NamedNodeMap;
-import org.w3c.dom.Node;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.TreeMap;
-
-/**
- * Extracts the selection and writes it out as a separate layout file, then adds an
- * include to that new layout file. Interactively asks the user for a new name for the
- * layout.
- * <p>
- * Remaining work to do / Possible enhancements:
- * <ul>
- * <li>Optionally look in other files in the project and attempt to set style attributes
- * in other cases where the style attributes match?
- * <li>If the elements we are extracting from already contain a style attribute, set that
- * style as the parent style of the current style?
- * <li>Add a parent-style picker to the wizard (initialized with the above if applicable)
- * <li>Pick up indentation settings from the XML module
- * <li>Integrate with themes somehow -- make an option to have the extracted style go into
- *    the theme instead
- * </ul>
- */
-@SuppressWarnings("restriction") // XML model
-public class ExtractStyleRefactoring extends VisualRefactoring {
-    private static final String KEY_NAME = "name";                        //$NON-NLS-1$
-    private static final String KEY_REMOVE_EXTRACTED = "removeextracted"; //$NON-NLS-1$
-    private static final String KEY_REMOVE_ALL = "removeall";             //$NON-NLS-1$
-    private static final String KEY_APPLY_STYLE = "applystyle";           //$NON-NLS-1$
-    private static final String KEY_PARENT = "parent";           //$NON-NLS-1$
-    private String mStyleName;
-    /** The name of the file in res/values/ that the style will be added to. Normally
-     * res/values/styles.xml - but unit tests pick other names */
-    private String mStyleFileName = "styles.xml";
-    /** Set a style reference on the extracted elements? */
-    private boolean mApplyStyle;
-    /** Remove the attributes that were extracted? */
-    private boolean mRemoveExtracted;
-    /** List of attributes chosen by the user to be extracted */
-    private List<Attr> mChosenAttributes = new ArrayList<Attr>();
-    /** Remove all attributes that match the extracted attributes names, regardless of value */
-    private boolean mRemoveAll;
-    /** The parent style to extend */
-    private String mParent;
-    /** The full list of available attributes in the refactoring */
-    private Map<String, List<Attr>> mAvailableAttributes;
-
-    /**
-     * This constructor is solely used by {@link Descriptor},
-     * to replay a previous refactoring.
-     * @param arguments argument map created by #createArgumentMap.
-     */
-    ExtractStyleRefactoring(Map<String, String> arguments) {
-        super(arguments);
-        mStyleName = arguments.get(KEY_NAME);
-        mRemoveExtracted = Boolean.parseBoolean(arguments.get(KEY_REMOVE_EXTRACTED));
-        mRemoveAll = Boolean.parseBoolean(arguments.get(KEY_REMOVE_ALL));
-        mApplyStyle = Boolean.parseBoolean(arguments.get(KEY_APPLY_STYLE));
-        mParent = arguments.get(KEY_PARENT);
-        if (mParent != null && mParent.length() == 0) {
-            mParent = null;
-        }
-    }
-
-    public ExtractStyleRefactoring(
-            IFile file,
-            LayoutEditorDelegate delegate,
-            ITextSelection selection,
-            ITreeSelection treeSelection) {
-        super(file, delegate, selection, treeSelection);
-    }
-
-    @VisibleForTesting
-    ExtractStyleRefactoring(List<Element> selectedElements, LayoutEditorDelegate editor) {
-        super(selectedElements, editor);
-    }
-
-    @Override
-    public RefactoringStatus checkInitialConditions(IProgressMonitor pm) throws CoreException,
-            OperationCanceledException {
-        RefactoringStatus status = new RefactoringStatus();
-
-        try {
-            pm.beginTask("Checking preconditions...", 6);
-
-            if (mSelectionStart == -1 || mSelectionEnd == -1) {
-                status.addFatalError("No selection to extract");
-                return status;
-            }
-
-            // This also ensures that we have a valid DOM model:
-            if (mElements.size() == 0) {
-                status.addFatalError("Nothing to extract");
-                return status;
-            }
-
-            pm.worked(1);
-            return status;
-
-        } finally {
-            pm.done();
-        }
-    }
-
-    @Override
-    protected VisualRefactoringDescriptor createDescriptor() {
-        String comment = getName();
-        return new Descriptor(
-                mProject.getName(), //project
-                comment,            //description
-                comment,            //comment
-                createArgumentMap());
-    }
-
-    @Override
-    protected Map<String, String> createArgumentMap() {
-        Map<String, String> args = super.createArgumentMap();
-        args.put(KEY_NAME, mStyleName);
-        args.put(KEY_REMOVE_EXTRACTED, Boolean.toString(mRemoveExtracted));
-        args.put(KEY_REMOVE_ALL, Boolean.toString(mRemoveAll));
-        args.put(KEY_APPLY_STYLE, Boolean.toString(mApplyStyle));
-        args.put(KEY_PARENT, mParent != null ? mParent : "");
-
-        return args;
-    }
-
-    @Override
-    public String getName() {
-        return "Extract Style";
-    }
-
-    void setStyleName(String styleName) {
-        mStyleName = styleName;
-    }
-
-    void setStyleFileName(String styleFileName) {
-        mStyleFileName = styleFileName;
-    }
-
-    void setChosenAttributes(List<Attr> attributes) {
-        mChosenAttributes = attributes;
-    }
-
-    void setRemoveExtracted(boolean removeExtracted) {
-        mRemoveExtracted = removeExtracted;
-    }
-
-    void setApplyStyle(boolean applyStyle) {
-        mApplyStyle = applyStyle;
-    }
-
-    void setRemoveAll(boolean removeAll) {
-        mRemoveAll = removeAll;
-    }
-
-    void setParent(String parent) {
-        mParent = parent;
-    }
-
-    // ---- Actual implementation of Extract Style modification computation ----
-
-    /**
-     * Returns two items: a map from attribute name to a list of attribute nodes of that
-     * name, and a subset of these attributes that fall within the text selection
-     * (used to drive initial selection in the wizard)
-     */
-    Pair<Map<String, List<Attr>>, Set<Attr>> getAvailableAttributes() {
-        mAvailableAttributes = new TreeMap<String, List<Attr>>();
-        Set<Attr> withinSelection = new HashSet<Attr>();
-        for (Element element : getElements()) {
-            IndexedRegion elementRegion = getRegion(element);
-            boolean allIncluded =
-                (mOriginalSelectionStart <= elementRegion.getStartOffset() &&
-                 mOriginalSelectionEnd >= elementRegion.getEndOffset());
-
-            NamedNodeMap attributeMap = element.getAttributes();
-            for (int i = 0, n = attributeMap.getLength(); i < n; i++) {
-                Attr attribute = (Attr) attributeMap.item(i);
-
-                String name = attribute.getLocalName();
-                if (!isStylableAttribute(name)) {
-                    // Don't offer to extract attributes that don't make sense in
-                    // styles (like "id" or "style"), or attributes that the user
-                    // probably does not want to define in styles (like layout
-                    // attributes such as layout_width, or the label of a button etc).
-                    // This makes the options offered listed in the wizard simpler.
-                    // In special cases where the user *does* want to set one of these
-                    // attributes, they can always do it manually so optimize for
-                    // the common case here.
-                    continue;
-                }
-
-                // Skip attributes that are in a namespace other than the Android one
-                String namespace = attribute.getNamespaceURI();
-                if (namespace != null && !ANDROID_URI.equals(namespace)) {
-                    continue;
-                }
-
-                if (!allIncluded) {
-                    IndexedRegion region = getRegion(attribute);
-                    boolean attributeIncluded = mOriginalSelectionStart < region.getEndOffset() &&
-                        mOriginalSelectionEnd >= region.getStartOffset();
-                    if (attributeIncluded) {
-                        withinSelection.add(attribute);
-                    }
-                } else {
-                    withinSelection.add(attribute);
-                }
-
-                List<Attr> list = mAvailableAttributes.get(name);
-                if (list == null) {
-                    list = new ArrayList<Attr>();
-                    mAvailableAttributes.put(name, list);
-                }
-                list.add(attribute);
-            }
-        }
-
-        return Pair.of(mAvailableAttributes, withinSelection);
-    }
-
-    /**
-     * Returns whether the given local attribute name is one the style wizard
-     * should present as a selectable attribute to be extracted.
-     *
-     * @param name the attribute name, not including a namespace prefix
-     * @return true if the name is one that the user can extract
-     */
-    public static boolean isStylableAttribute(String name) {
-        return !(name == null
-                || name.equals(ATTR_ID)
-                || name.startsWith(ATTR_STYLE)
-                || (name.startsWith(ATTR_LAYOUT_RESOURCE_PREFIX) &&
-                        !name.startsWith(ATTR_LAYOUT_MARGIN))
-                || name.equals(ATTR_TEXT)
-                || name.equals(ATTR_HINT)
-                || name.equals(ATTR_SRC)
-                || name.equals(ATTR_ON_CLICK));
-    }
-
-    IFile getStyleFile(IProject project) {
-        return project.getFile(new Path(FD_RESOURCES + WS_SEP + FD_RES_VALUES + WS_SEP
-                + mStyleFileName));
-    }
-
-    @Override
-    protected @NonNull List<Change> computeChanges(IProgressMonitor monitor) {
-        List<Change> changes = new ArrayList<Change>();
-        if (mChosenAttributes.size() == 0) {
-            return changes;
-        }
-
-        IFile file = getStyleFile(mDelegate.getEditor().getProject());
-        boolean createFile = !file.exists();
-        int insertAtIndex;
-        String initialIndent = null;
-        if (!createFile) {
-            Pair<Integer, String> context = computeInsertContext(file);
-            insertAtIndex = context.getFirst();
-            initialIndent = context.getSecond();
-        } else {
-            insertAtIndex = 0;
-        }
-
-        TextFileChange addFile = new TextFileChange("Create new separate style declaration", file);
-        addFile.setTextType(EXT_XML);
-        changes.add(addFile);
-        String styleString = computeStyleDeclaration(createFile, initialIndent);
-        addFile.setEdit(new InsertEdit(insertAtIndex, styleString));
-
-        // Remove extracted attributes?
-        MultiTextEdit rootEdit = new MultiTextEdit();
-        if (mRemoveExtracted || mRemoveAll) {
-            for (Attr attribute : mChosenAttributes) {
-                List<Attr> list = mAvailableAttributes.get(attribute.getLocalName());
-                for (Attr attr : list) {
-                    if (mRemoveAll || attr.getValue().equals(attribute.getValue())) {
-                        removeAttribute(rootEdit, attr);
-                    }
-                }
-            }
-        }
-
-        // Set the style attribute?
-        if (mApplyStyle) {
-            for (Element element : getElements()) {
-                String value = PREFIX_RESOURCE_REF + REFERENCE_STYLE + mStyleName;
-                setAttribute(rootEdit, element, null, null, ATTR_STYLE, value);
-            }
-        }
-
-        if (rootEdit.hasChildren()) {
-            IFile sourceFile = mDelegate.getEditor().getInputFile();
-            if (sourceFile == null) {
-                return changes;
-            }
-            TextFileChange change = new TextFileChange(sourceFile.getName(), sourceFile);
-            change.setTextType(EXT_XML);
-            changes.add(change);
-
-            if (AdtPrefs.getPrefs().getFormatGuiXml()) {
-                MultiTextEdit formatted = reformat(rootEdit, XmlFormatStyle.LAYOUT);
-                if (formatted != null) {
-                    rootEdit = formatted;
-                }
-            }
-
-            change.setEdit(rootEdit);
-        }
-
-        return changes;
-    }
-
-    private String computeStyleDeclaration(boolean createFile, String initialIndent) {
-        StringBuilder sb = new StringBuilder();
-        if (createFile) {
-            sb.append(NewXmlFileWizard.XML_HEADER_LINE);
-            sb.append('<').append(TAG_RESOURCES).append(' ');
-            sb.append(XMLNS_PREFIX).append(ANDROID_NS_NAME).append('=').append('"');
-            sb.append(ANDROID_URI);
-            sb.append('"').append('>').append('\n');
-        }
-
-        // Indent. Use the existing indent found for previous <style> elements in
-        // the resource file - but if that indent was 0 (e.g. <style> elements are
-        // at the left margin) only use it to indent the style elements and use a real
-        // nonzero indent for its children.
-        String indent = "    "; //$NON-NLS-1$
-        if (initialIndent == null) {
-            initialIndent = indent;
-        } else if (initialIndent.length() > 0) {
-            indent = initialIndent;
-        }
-        sb.append(initialIndent);
-        String styleTag = "style"; //$NON-NLS-1$ // TODO - use constant in parallel changeset
-        sb.append('<').append(styleTag).append(' ').append(ATTR_NAME).append('=').append('"');
-        sb.append(mStyleName);
-        sb.append('"');
-        if (mParent != null) {
-            sb.append(' ').append(ATTR_PARENT).append('=').append('"');
-            sb.append(mParent);
-            sb.append('"');
-        }
-        sb.append('>').append('\n');
-
-        for (Attr attribute : mChosenAttributes) {
-            sb.append(initialIndent).append(indent);
-            sb.append('<').append(TAG_ITEM).append(' ').append(ATTR_NAME).append('=').append('"');
-            // We've already enforced that regardless of prefix, only attributes with
-            // an Android namespace can be in the set of chosen attributes. Rewrite the
-            // prefix to android here.
-            if (attribute.getPrefix() != null) {
-                sb.append(ANDROID_NS_NAME_PREFIX);
-            }
-            sb.append(attribute.getLocalName());
-            sb.append('"').append('>');
-            sb.append(attribute.getValue());
-            sb.append('<').append('/').append(TAG_ITEM).append('>').append('\n');
-        }
-        sb.append(initialIndent).append('<').append('/').append(styleTag).append('>').append('\n');
-
-        if (createFile) {
-            sb.append('<').append('/').append(TAG_RESOURCES).append('>').append('\n');
-        }
-        String styleString = sb.toString();
-        return styleString;
-    }
-
-    /** Computes the location in the file to insert the new style element at, as well as
-     * the exact indent string to use to indent the {@code <style>} element.
-     * @param file the styles.xml file to insert into
-     * @return a pair of an insert offset and an indent string
-     */
-    private Pair<Integer, String> computeInsertContext(final IFile file) {
-        int insertAtIndex = -1;
-        // Find the insert of the final </resources> item where we will insert
-        // the new style elements.
-        String indent = null;
-        IModelManager modelManager = StructuredModelManager.getModelManager();
-        IStructuredModel model = null;
-        try {
-            model = modelManager.getModelForRead(file);
-            if (model instanceof IDOMModel) {
-                IDOMModel domModel = (IDOMModel) model;
-                IDOMDocument otherDocument = domModel.getDocument();
-                Element root = otherDocument.getDocumentElement();
-                Node lastChild = root.getLastChild();
-                if (lastChild != null) {
-                    if (lastChild instanceof IndexedRegion) {
-                        IndexedRegion region = (IndexedRegion) lastChild;
-                        insertAtIndex = region.getStartOffset() + region.getLength();
-                    }
-
-                    // Compute indent
-                    while (lastChild != null) {
-                        if (lastChild.getNodeType() == Node.ELEMENT_NODE) {
-                            IStructuredDocument document = model.getStructuredDocument();
-                            indent = AndroidXmlEditor.getIndent(document, lastChild);
-                            break;
-                        }
-                        lastChild = lastChild.getPreviousSibling();
-                    }
-                }
-            }
-        } catch (IOException e) {
-            AdtPlugin.log(e, null);
-        } catch (CoreException e) {
-            AdtPlugin.log(e, null);
-        } finally {
-            if (model != null) {
-                model.releaseFromRead();
-            }
-        }
-
-        if (insertAtIndex == -1) {
-            String contents = AdtPlugin.readFile(file);
-            insertAtIndex = contents.indexOf("</" + TAG_RESOURCES + ">"); //$NON-NLS-1$
-            if (insertAtIndex == -1) {
-                insertAtIndex = contents.length();
-            }
-        }
-
-        return Pair.of(insertAtIndex, indent);
-    }
-
-    @Override
-    VisualRefactoringWizard createWizard() {
-        return new ExtractStyleWizard(this, mDelegate);
-    }
-
-    public static class Descriptor extends VisualRefactoringDescriptor {
-        public Descriptor(String project, String description, String comment,
-                Map<String, String> arguments) {
-            super("com.android.ide.eclipse.adt.refactoring.extract.style", //$NON-NLS-1$
-                    project, description, comment, arguments);
-        }
-
-        @Override
-        protected Refactoring createRefactoring(Map<String, String> args) {
-            return new ExtractStyleRefactoring(args);
-        }
-    }
-
-    /**
-     * Determines the parent style to be used for this refactoring
-     *
-     * @return the parent style to be used for this refactoring
-     */
-    public String getParentStyle() {
-        Set<String> styles = new HashSet<String>();
-        for (Element element : getElements()) {
-            // Includes "" for elements not setting the style
-            styles.add(element.getAttribute(ATTR_STYLE));
-        }
-
-        if (styles.size() > 1) {
-            // The elements differ in what style attributes they are set to
-            return null;
-        }
-
-        String style = styles.iterator().next();
-        if (style != null && style.length() > 0) {
-            return style;
-        }
-
-        // None of the elements set the style -- see if they have the same widget types
-        // and if so offer to extend the theme style for that widget type
-
-        Set<String> types = new HashSet<String>();
-        for (Element element : getElements()) {
-            types.add(element.getTagName());
-        }
-
-        if (types.size() == 1) {
-            String view = DescriptorsUtils.getBasename(types.iterator().next());
-
-            ResourceResolver resolver = mDelegate.getGraphicalEditor().getResourceResolver();
-            // Look up the theme item name, which for a Button would be "buttonStyle", and so on.
-            String n = Character.toLowerCase(view.charAt(0)) + view.substring(1)
-                + "Style"; //$NON-NLS-1$
-            ResourceValue value = resolver.findItemInTheme(n);
-            if (value != null) {
-                ResourceValue resolvedValue = resolver.resolveResValue(value);
-                String name = resolvedValue.getName();
-                if (name != null) {
-                    if (resolvedValue.isFramework()) {
-                        return PREFIX_ANDROID + name;
-                    } else {
-                        return name;
-                    }
-                }
-            }
-        }
-
-        return null;
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/ExtractStyleWizard.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/ExtractStyleWizard.java
deleted file mode 100644
index 187452d..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/ExtractStyleWizard.java
+++ /dev/null
@@ -1,440 +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.eclipse.adt.internal.editors.layout.refactoring;
-
-import static org.eclipse.jface.viewers.StyledString.DECORATIONS_STYLER;
-import static org.eclipse.jface.viewers.StyledString.QUALIFIER_STYLER;
-
-import com.android.ide.eclipse.adt.internal.editors.layout.LayoutEditorDelegate;
-import com.android.ide.eclipse.adt.internal.resources.ResourceNameValidator;
-import com.android.resources.ResourceType;
-import com.android.utils.Pair;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.jface.viewers.CheckStateChangedEvent;
-import org.eclipse.jface.viewers.CheckboxTableViewer;
-import org.eclipse.jface.viewers.ICheckStateListener;
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-import org.eclipse.jface.viewers.StyledCellLabelProvider;
-import org.eclipse.jface.viewers.StyledString;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerCell;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.layout.RowLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.swt.widgets.Text;
-import org.w3c.dom.Attr;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-class ExtractStyleWizard extends VisualRefactoringWizard {
-    public ExtractStyleWizard(ExtractStyleRefactoring ref, LayoutEditorDelegate editor) {
-        super(ref, editor);
-        setDefaultPageTitle(ref.getName());
-    }
-
-    @Override
-    protected void addUserInputPages() {
-        String initialName = "styleName";
-        addPage(new InputPage(mDelegate.getEditor().getProject(), initialName));
-    }
-
-    /**
-     * Wizard page which inputs parameters for the {@link ExtractStyleRefactoring}
-     * operation
-     */
-    private static class InputPage extends VisualRefactoringInputPage {
-        private final IProject mProject;
-        private final String mSuggestedName;
-        private Text mNameText;
-        private Table mTable;
-        private Button mRemoveExtracted;
-        private Button mSetStyle;
-        private Button mRemoveAll;
-        private Button mExtend;
-        private CheckboxTableViewer mCheckedView;
-
-        private String mParentStyle;
-        private Set<Attr> mInSelection;
-        private List<Attr> mAllAttributes;
-        private int mElementCount;
-        private Map<Attr, Integer> mFrequencyCount;
-        private Set<Attr> mShown;
-        private List<Attr> mInitialChecked;
-        private List<Attr> mAllChecked;
-        private List<Map.Entry<String, List<Attr>>> mRoot;
-        private Map<String, List<Attr>> mAvailableAttributes;
-
-        public InputPage(IProject project, String suggestedName) {
-            super("ExtractStyleInputPage");
-            mProject = project;
-            mSuggestedName = suggestedName;
-        }
-
-        @Override
-        public void createControl(Composite parent) {
-            initialize();
-
-            Composite composite = new Composite(parent, SWT.NONE);
-            composite.setLayout(new GridLayout(2, false));
-
-            Label nameLabel = new Label(composite, SWT.NONE);
-            nameLabel.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1));
-            nameLabel.setText("Style Name:");
-
-            mNameText = new Text(composite, SWT.BORDER);
-            mNameText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
-            mNameText.addModifyListener(mModifyValidateListener);
-
-            mRemoveExtracted = new Button(composite, SWT.CHECK);
-            mRemoveExtracted.setSelection(true);
-            mRemoveExtracted.setLayoutData(new GridData(SWT.LEFT, SWT.TOP, false, false, 2, 1));
-            mRemoveExtracted.setText("Remove extracted attributes");
-            mRemoveExtracted.addSelectionListener(mSelectionValidateListener);
-
-            mRemoveAll = new Button(composite, SWT.CHECK);
-            mRemoveAll.setSelection(false);
-            mRemoveAll.setLayoutData(new GridData(SWT.LEFT, SWT.TOP, false, false, 2, 1));
-            mRemoveAll.setText("Remove all extracted attributes regardless of value");
-            mRemoveAll.addSelectionListener(mSelectionValidateListener);
-
-            boolean defaultSetStyle = false;
-            if (mParentStyle != null) {
-                mExtend = new Button(composite, SWT.CHECK);
-                mExtend.setSelection(true);
-                mExtend.setLayoutData(new GridData(SWT.LEFT, SWT.TOP, false, false, 2, 1));
-                mExtend.setText(String.format("Extend %1$s", mParentStyle));
-                mExtend.addSelectionListener(mSelectionValidateListener);
-                defaultSetStyle = true;
-            }
-
-            mSetStyle = new Button(composite, SWT.CHECK);
-            mSetStyle.setSelection(defaultSetStyle);
-            mSetStyle.setLayoutData(new GridData(SWT.LEFT, SWT.TOP, false, false, 2, 1));
-            mSetStyle.setText("Set style attribute on extracted elements");
-            mSetStyle.addSelectionListener(mSelectionValidateListener);
-
-            new Label(composite, SWT.NONE);
-            new Label(composite, SWT.NONE);
-
-            Label tableLabel = new Label(composite, SWT.NONE);
-            tableLabel.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false, 2, 1));
-            tableLabel.setText("Choose style attributes to extract:");
-
-            mCheckedView = CheckboxTableViewer.newCheckList(composite, SWT.BORDER
-                    | SWT.FULL_SELECTION | SWT.HIDE_SELECTION);
-            mTable = mCheckedView.getTable();
-            mTable.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 2, 2));
-            ((GridData) mTable.getLayoutData()).heightHint = 200;
-
-            mCheckedView.setContentProvider(new ArgumentContentProvider());
-            mCheckedView.setLabelProvider(new ArgumentLabelProvider());
-            mCheckedView.setInput(mRoot);
-            final Object[] initialSelection = mInitialChecked.toArray();
-            mCheckedView.setCheckedElements(initialSelection);
-
-            mCheckedView.addCheckStateListener(new ICheckStateListener() {
-                @Override
-                public void checkStateChanged(CheckStateChangedEvent event) {
-                    // Try to disable other elements that conflict with this
-                    boolean isChecked = event.getChecked();
-                    if (isChecked) {
-                        Attr attribute = (Attr) event.getElement();
-                        List<Attr> list = mAvailableAttributes.get(attribute.getLocalName());
-                        for (Attr other : list) {
-                            if (other != attribute && mShown.contains(other)) {
-                                mCheckedView.setChecked(other, false);
-                            }
-                        }
-                    }
-
-                    validatePage();
-                }
-            });
-
-            // Select All / Deselect All
-            Composite buttonForm = new Composite(composite, SWT.NONE);
-            buttonForm.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false, 2, 1));
-            RowLayout rowLayout = new RowLayout(SWT.HORIZONTAL);
-            rowLayout.marginTop = 0;
-            rowLayout.marginLeft = 0;
-            buttonForm.setLayout(rowLayout);
-            Button checkAllButton = new Button(buttonForm, SWT.FLAT);
-            checkAllButton.setText("Select All");
-            checkAllButton.addSelectionListener(new SelectionAdapter() {
-                @Override
-                public void widgetSelected(SelectionEvent e) {
-                    // Select "all" (but not conflicting settings)
-                    mCheckedView.setCheckedElements(mAllChecked.toArray());
-                    validatePage();
-                }
-            });
-            Button uncheckAllButton = new Button(buttonForm, SWT.FLAT);
-            uncheckAllButton.setText("Deselect All");
-            uncheckAllButton.addSelectionListener(new SelectionAdapter() {
-                @Override
-                public void widgetSelected(SelectionEvent e) {
-                    mCheckedView.setAllChecked(false);
-                    validatePage();
-                }
-            });
-
-            // Initialize UI:
-            if (mSuggestedName != null) {
-                mNameText.setText(mSuggestedName);
-            }
-
-            setControl(composite);
-            validatePage();
-        }
-
-        private void initialize() {
-            ExtractStyleRefactoring ref = (ExtractStyleRefactoring) getRefactoring();
-
-            mElementCount = ref.getElements().size();
-
-            mParentStyle = ref.getParentStyle();
-
-            // Set up data structures needed by the wizard -- to compute the actual
-            // attributes to list in the wizard (there could be multiple attributes
-            // of the same name (on different elements) and we only want to show one, etc.)
-
-            Pair<Map<String, List<Attr>>, Set<Attr>> result = ref.getAvailableAttributes();
-            // List of all available attributes on the selected elements
-            mAvailableAttributes = result.getFirst();
-            // Set of attributes that overlap the text selection, or all attributes if
-            // wizard is invoked from GUI context
-            mInSelection = result.getSecond();
-
-            // The root data structure, which we set as the table root. The content provider
-            // will produce children from it. This is the entry set of a map from
-            // attribute name to list of attribute nodes for that attribute name.
-            mRoot = new ArrayList<Map.Entry<String, List<Attr>>>(
-                mAvailableAttributes.entrySet());
-
-            // Sort the items by attribute name -- the attribute name is the key
-            // in the entry set above.
-            Collections.sort(mRoot, new Comparator<Map.Entry<String, List<Attr>>>() {
-                @Override
-                public int compare(Map.Entry<String, List<Attr>> e1,
-                        Map.Entry<String, List<Attr>> e2) {
-                    return e1.getKey().compareTo(e2.getKey());
-                }
-            });
-
-            // Set of attributes actually included in the list shown to the user.
-            // (There could be many additional "aliasing" nodes on other elements
-            // with the same name.) Note however that we DO show multiple attribute
-            // occurrences of the same attribute name: precisely one for each unique -value-
-            // of that attribute.
-            mShown = new HashSet<Attr>();
-
-            // The list of initially checked attributes.
-            mInitialChecked = new ArrayList<Attr>();
-
-            // The list of attributes to be checked if "Select All" is chosen (this is not
-            // the same as *all* attributes, since we need to exclude any conflicts)
-            mAllChecked = new ArrayList<Attr>();
-
-            // All attributes.
-            mAllAttributes = new ArrayList<Attr>();
-
-            // Frequency count, from attribute to integer. Attributes that do not
-            // appear in the list have frequency 1, not 0.
-            mFrequencyCount = new HashMap<Attr, Integer>();
-
-            for (Map.Entry<String, List<Attr>> entry : mRoot) {
-                // Iterate over all attributes of the same name, and sort them
-                // by value. This will make it easy to list each -unique- value in the
-                // wizard.
-                List<Attr> attrList = entry.getValue();
-                Collections.sort(attrList, new Comparator<Attr>() {
-                    @Override
-                    public int compare(Attr a1, Attr a2) {
-                        return a1.getValue().compareTo(a2.getValue());
-                    }
-                });
-
-                // We need to compute a couple of things: the frequency for all identical
-                // values (and stash them in the frequency map), and record the first
-                // attribute with a particular value into the list of attributes to
-                // be shown.
-                Attr prevAttr = null;
-                String prev = null;
-                List<Attr> uniqueValueAttrs = new ArrayList<Attr>();
-                for (Attr attr : attrList) {
-                    String value = attr.getValue();
-                    if (value.equals(prev)) {
-                        Integer count = mFrequencyCount.get(prevAttr);
-                        if (count == null) {
-                            count = Integer.valueOf(2);
-                        } else {
-                            count = Integer.valueOf(count.intValue() + 1);
-                        }
-                        mFrequencyCount.put(prevAttr, count);
-                    } else {
-                        uniqueValueAttrs.add(attr);
-                        prev = value;
-                        prevAttr = attr;
-                    }
-                }
-
-                // Sort the values by frequency (and for equal frequencies, alphabetically
-                // by value)
-                Collections.sort(uniqueValueAttrs, new Comparator<Attr>() {
-                    @Override
-                    public int compare(Attr a1, Attr a2) {
-                        Integer f1 = mFrequencyCount.get(a1);
-                        Integer f2 = mFrequencyCount.get(a2);
-                        if (f1 == null) {
-                            f1 = Integer.valueOf(1);
-                        }
-                        if (f2 == null) {
-                            f2 = Integer.valueOf(1);
-                        }
-                        int delta = f2.intValue() - f1.intValue();
-                        if (delta != 0) {
-                            return delta;
-                        } else {
-                            return a1.getValue().compareTo(a2.getValue());
-                        }
-                    }
-                });
-
-                // Add the items in order, and select those attributes that overlap
-                // the selection
-                mAllAttributes.addAll(uniqueValueAttrs);
-                mShown.addAll(uniqueValueAttrs);
-                Attr first = uniqueValueAttrs.get(0);
-                mAllChecked.add(first);
-                if (mInSelection.contains(first)) {
-                    mInitialChecked.add(first);
-                }
-            }
-        }
-
-        @Override
-        protected boolean validatePage() {
-            boolean ok = true;
-
-            String text = mNameText.getText().trim();
-
-            if (text.length() == 0) {
-                setErrorMessage("Provide a name for the new style");
-                ok = false;
-            } else {
-                ResourceNameValidator validator = ResourceNameValidator.create(false, mProject,
-                        ResourceType.STYLE);
-                String message = validator.isValid(text);
-                if (message != null) {
-                    setErrorMessage(message);
-                    ok = false;
-                }
-            }
-
-            Object[] checkedElements = mCheckedView.getCheckedElements();
-            if (checkedElements.length == 0) {
-                setErrorMessage("Choose at least one attribute to extract");
-                ok = false;
-            }
-
-            if (ok) {
-                setErrorMessage(null);
-
-                // Record state
-                ExtractStyleRefactoring refactoring = (ExtractStyleRefactoring) getRefactoring();
-                refactoring.setStyleName(text);
-                refactoring.setRemoveExtracted(mRemoveExtracted.getSelection());
-                refactoring.setRemoveAll(mRemoveAll.getSelection());
-                refactoring.setApplyStyle(mSetStyle.getSelection());
-                if (mExtend != null && mExtend.getSelection()) {
-                    refactoring.setParent(mParentStyle);
-                }
-                List<Attr> attributes = new ArrayList<Attr>();
-                for (Object o : checkedElements) {
-                    attributes.add((Attr) o);
-                }
-                refactoring.setChosenAttributes(attributes);
-            }
-
-            setPageComplete(ok);
-            return ok;
-        }
-
-        private class ArgumentLabelProvider extends StyledCellLabelProvider {
-            public ArgumentLabelProvider() {
-            }
-
-            @Override
-            public void update(ViewerCell cell) {
-                Object element = cell.getElement();
-                Attr attribute = (Attr) element;
-
-                StyledString styledString = new StyledString();
-                styledString.append(attribute.getLocalName());
-                styledString.append(" = ", QUALIFIER_STYLER);
-                styledString.append(attribute.getValue());
-
-                if (mElementCount > 1) {
-                    Integer f = mFrequencyCount.get(attribute);
-                    String s = String.format(" (in %d/%d elements)",
-                            f != null ? f.intValue(): 1, mElementCount);
-                    styledString.append(s, DECORATIONS_STYLER);
-                }
-                cell.setText(styledString.toString());
-                cell.setStyleRanges(styledString.getStyleRanges());
-                super.update(cell);
-            }
-        }
-
-        private class ArgumentContentProvider implements IStructuredContentProvider {
-            public ArgumentContentProvider() {
-            }
-
-            @Override
-            public Object[] getElements(Object inputElement) {
-                if (inputElement == mRoot) {
-                    return mAllAttributes.toArray();
-                }
-
-                return new Object[0];
-            }
-
-            @Override
-            public void dispose() {
-            }
-
-            @Override
-            public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-            }
-        }
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/GridLayoutConverter.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/GridLayoutConverter.java
deleted file mode 100644
index fe673a5..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/GridLayoutConverter.java
+++ /dev/null
@@ -1,988 +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.eclipse.adt.internal.editors.layout.refactoring;
-
-import static com.android.SdkConstants.ANDROID_URI;
-import static com.android.SdkConstants.ATTR_BACKGROUND;
-import static com.android.SdkConstants.ATTR_COLUMN_COUNT;
-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_RIGHT;
-import static com.android.SdkConstants.ATTR_LAYOUT_ALIGN_TOP;
-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_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_WIDTH;
-import static com.android.SdkConstants.ATTR_ORIENTATION;
-import static com.android.SdkConstants.FQCN_GRID_LAYOUT;
-import static com.android.SdkConstants.FQCN_SPACE;
-import static com.android.SdkConstants.GRAVITY_VALUE_FILL;
-import static com.android.SdkConstants.GRAVITY_VALUE_FILL_HORIZONTAL;
-import static com.android.SdkConstants.GRAVITY_VALUE_FILL_VERTICAL;
-import static com.android.SdkConstants.ID_PREFIX;
-import static com.android.SdkConstants.LINEAR_LAYOUT;
-import static com.android.SdkConstants.NEW_ID_PREFIX;
-import static com.android.SdkConstants.RADIO_GROUP;
-import static com.android.SdkConstants.RELATIVE_LAYOUT;
-import static com.android.SdkConstants.SPACE;
-import static com.android.SdkConstants.TABLE_LAYOUT;
-import static com.android.SdkConstants.TABLE_ROW;
-import static com.android.SdkConstants.VALUE_FILL_PARENT;
-import static com.android.SdkConstants.VALUE_HORIZONTAL;
-import static com.android.SdkConstants.VALUE_MATCH_PARENT;
-import static com.android.SdkConstants.VALUE_VERTICAL;
-import static com.android.SdkConstants.VALUE_WRAP_CONTENT;
-import static com.android.ide.common.layout.GravityHelper.GRAVITY_HORIZ_MASK;
-import static com.android.ide.common.layout.GravityHelper.GRAVITY_VERT_MASK;
-
-import com.android.ide.common.api.IViewMetadata.FillPreference;
-import com.android.ide.common.layout.BaseLayoutRule;
-import com.android.ide.common.layout.GravityHelper;
-import com.android.ide.common.layout.GridLayoutRule;
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.ide.eclipse.adt.internal.editors.descriptors.AttributeDescriptor;
-import com.android.ide.eclipse.adt.internal.editors.descriptors.ElementDescriptor;
-import com.android.ide.eclipse.adt.internal.editors.layout.descriptors.ViewElementDescriptor;
-import com.android.ide.eclipse.adt.internal.editors.layout.gle2.CanvasViewInfo;
-import com.android.ide.eclipse.adt.internal.editors.layout.gle2.DomUtilities;
-import com.android.ide.eclipse.adt.internal.editors.layout.gre.ViewMetadataRepository;
-import com.android.ide.eclipse.adt.internal.project.SupportLibraryHelper;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.swt.graphics.Rectangle;
-import org.eclipse.text.edits.InsertEdit;
-import org.eclipse.text.edits.MalformedTreeException;
-import org.eclipse.text.edits.MultiTextEdit;
-import org.eclipse.wst.sse.core.internal.provisional.IndexedRegion;
-import org.w3c.dom.Attr;
-import org.w3c.dom.Element;
-import org.w3c.dom.NamedNodeMap;
-import org.w3c.dom.Node;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-/**
- * Helper class which performs the bulk of the layout conversion to grid layout
- * <p>
- * Future enhancements:
- * <ul>
- * <li>Render the layout at multiple screen sizes and analyze how the widget bounds
- *  change and use this to infer gravity
- *  <li> Use the layout_width and layout_height attributes on views to infer column and
- *  row flexibility (and as mentioned above, possibly layout_weight).
- * move and stretch and use that to add in additional constraints
- *  <li> Take into account existing margins and add/subtract those from the
- *  bounds computations and either clear or update them.
- * <li>Try to reorder elements into their natural order
- * <li> Try to preserve spacing? Right now everything gets converted into a compact
- *   grid with no spacing between the views; consider inserting {@code <Space>} views
- *   with dimensions based on existing distances.
- * </ul>
- */
-@SuppressWarnings("restriction") // DOM model access
-class GridLayoutConverter {
-    private final MultiTextEdit mRootEdit;
-    private final boolean mFlatten;
-    private final Element mLayout;
-    private final ChangeLayoutRefactoring mRefactoring;
-    private final CanvasViewInfo mRootView;
-
-    private List<View> mViews;
-    private String mNamespace;
-    private int mColumnCount;
-
-    /** Creates a new {@link GridLayoutConverter} */
-    GridLayoutConverter(ChangeLayoutRefactoring refactoring,
-            Element layout, boolean flatten, MultiTextEdit rootEdit, CanvasViewInfo rootView) {
-        mRefactoring = refactoring;
-        mLayout = layout;
-        mFlatten = flatten;
-        mRootEdit = rootEdit;
-        mRootView = rootView;
-    }
-
-    /** Performs conversion from any layout to a RelativeLayout */
-    public void convertToGridLayout() {
-        if (mRootView == null) {
-            return;
-        }
-
-        // Locate the view for the layout
-        CanvasViewInfo layoutView = findViewForElement(mRootView, mLayout);
-        if (layoutView == null || layoutView.getChildren().size() == 0) {
-            // No children. THAT was an easy conversion!
-            return;
-        }
-
-        // Study the layout and get information about how to place individual elements
-        GridModel gridModel = new GridModel(layoutView, mLayout, mFlatten);
-        mViews = gridModel.getViews();
-        mColumnCount = gridModel.computeColumnCount();
-
-        deleteRemovedElements(gridModel.getDeletedElements());
-        mNamespace = mRefactoring.getAndroidNamespacePrefix();
-
-        processGravities();
-
-        // Insert space views if necessary
-        insertStretchableSpans();
-
-        // Create/update relative layout constraints
-        assignGridAttributes();
-
-        removeUndefinedAttrs();
-
-        if (mColumnCount > 0) {
-            mRefactoring.setAttribute(mRootEdit, mLayout, ANDROID_URI,
-                mNamespace, ATTR_COLUMN_COUNT, Integer.toString(mColumnCount));
-        }
-    }
-
-    private void insertStretchableSpans() {
-        // Look at the rows and columns and determine if we need to have a stretchable
-        // row and/or a stretchable column in the layout.
-        // In a GridLayout, a row or column is stretchable if it defines a gravity (regardless
-        // of what the gravity is -- in other words, a column is not just stretchable if it
-        // has gravity=fill but also if it has gravity=left). Furthermore, ALL the elements
-        // in the row/column have to be stretchable for the overall row/column to be
-        // considered stretchable.
-
-        // Map from row index to boolean for "is the row fixed/inflexible?"
-        Map<Integer, Boolean> rowFixed = new HashMap<Integer, Boolean>();
-        Map<Integer, Boolean> columnFixed = new HashMap<Integer, Boolean>();
-        for (View view : mViews) {
-            if (view.mElement == mLayout) {
-                continue;
-            }
-
-            int gravity = GravityHelper.getGravity(view.mGravity, 0);
-            if ((gravity & GRAVITY_HORIZ_MASK) == 0) {
-                columnFixed.put(view.mCol, true);
-            } else if (!columnFixed.containsKey(view.mCol)) {
-                columnFixed.put(view.mCol, false);
-            }
-            if ((gravity & GRAVITY_VERT_MASK) == 0) {
-                rowFixed.put(view.mRow, true);
-            } else if (!rowFixed.containsKey(view.mRow)) {
-                rowFixed.put(view.mRow, false);
-            }
-        }
-
-        boolean hasStretchableRow = false;
-        boolean hasStretchableColumn = false;
-        for (boolean fixed : rowFixed.values()) {
-            if (!fixed) {
-                hasStretchableRow = true;
-            }
-        }
-        for (boolean fixed : columnFixed.values()) {
-            if (!fixed) {
-                hasStretchableColumn = true;
-            }
-        }
-
-        if (!hasStretchableRow || !hasStretchableColumn) {
-            // Insert <Space> to hold stretchable space
-            // TODO: May also have to increment column count!
-            int offset = 0; // WHERE?
-
-            String gridLayout = mLayout.getTagName();
-            if (mLayout instanceof IndexedRegion) {
-                IndexedRegion region = (IndexedRegion) mLayout;
-                int end = region.getEndOffset();
-                // TODO: Look backwards for the "</"
-                // (and can it ever be <foo/>) ?
-                end -= (gridLayout.length() + 3); // 3: <, /, >
-                offset = end;
-            }
-
-            int row = rowFixed.size();
-            int column = columnFixed.size();
-            StringBuilder sb = new StringBuilder(64);
-            String spaceTag = SPACE;
-            IFile file = mRefactoring.getFile();
-            if (file != null) {
-                spaceTag = SupportLibraryHelper.getTagFor(file.getProject(), FQCN_SPACE);
-                if (spaceTag.equals(FQCN_SPACE)) {
-                    spaceTag = SPACE;
-                }
-            }
-
-            sb.append('<').append(spaceTag).append(' ');
-            String gravity;
-            if (!hasStretchableRow && !hasStretchableColumn) {
-                gravity = GRAVITY_VALUE_FILL;
-            } else if (!hasStretchableRow) {
-                gravity = GRAVITY_VALUE_FILL_VERTICAL;
-            } else {
-                assert !hasStretchableColumn;
-                gravity = GRAVITY_VALUE_FILL_HORIZONTAL;
-            }
-
-            sb.append(mNamespace).append(':');
-            sb.append(ATTR_LAYOUT_GRAVITY).append('=').append('"').append(gravity);
-            sb.append('"').append(' ');
-
-            sb.append(mNamespace).append(':');
-            sb.append(ATTR_LAYOUT_ROW).append('=').append('"').append(Integer.toString(row));
-            sb.append('"').append(' ');
-
-            sb.append(mNamespace).append(':');
-            sb.append(ATTR_LAYOUT_COLUMN).append('=').append('"').append(Integer.toString(column));
-            sb.append('"').append('/').append('>');
-
-            String space = sb.toString();
-            InsertEdit replace = new InsertEdit(offset, space);
-            mRootEdit.addChild(replace);
-
-            mColumnCount++;
-        }
-    }
-
-    private void removeUndefinedAttrs() {
-        ViewElementDescriptor descriptor = mRefactoring.getElementDescriptor(FQCN_GRID_LAYOUT);
-        if (descriptor == null) {
-            return;
-        }
-
-        Set<String> defined = new HashSet<String>();
-        AttributeDescriptor[] layoutAttributes = descriptor.getLayoutAttributes();
-        for (AttributeDescriptor attribute : layoutAttributes) {
-            defined.add(attribute.getXmlLocalName());
-        }
-
-        for (View view : mViews) {
-            Element child = view.mElement;
-
-            List<Attr> attributes = mRefactoring.findLayoutAttributes(child);
-            for (Attr attribute : attributes) {
-                String name = attribute.getLocalName();
-                if (!defined.contains(name)) {
-                    // Remove it
-                    try {
-                        mRefactoring.removeAttribute(mRootEdit, child, attribute.getNamespaceURI(),
-                                name);
-                    } catch (MalformedTreeException mte) {
-                        // Sometimes refactoring has modified attribute; not
-                        // removing
-                        // it is non-fatal so just warn instead of letting
-                        // refactoring
-                        // operation abort
-                        AdtPlugin.log(IStatus.WARNING,
-                                "Could not remove unsupported attribute %1$s; " + //$NON-NLS-1$
-                                        "already modified during refactoring?", //$NON-NLS-1$
-                                attribute.getLocalName());
-                    }
-                }
-            }
-        }
-    }
-
-    /** Removes any elements targeted for deletion */
-    private void deleteRemovedElements(List<Element> delete) {
-        if (mFlatten && delete.size() > 0) {
-            for (Element element : delete) {
-                mRefactoring.removeElementTags(mRootEdit, element, delete,
-                        false /*changeIndentation*/);
-            }
-        }
-    }
-
-    /**
-     * Creates refactoring edits which adds or updates the grid attributes
-     */
-    private void assignGridAttributes() {
-        // We always convert to horizontal grid layouts for now
-        mRefactoring.setAttribute(mRootEdit, mLayout, ANDROID_URI,
-                mNamespace, ATTR_ORIENTATION, VALUE_HORIZONTAL);
-
-        assignCellAttributes();
-    }
-
-    /**
-     * Assign cell attributes to the table, skipping those that will be implied
-     * by the grid model
-     */
-    private void assignCellAttributes() {
-        int implicitRow = 0;
-        int implicitColumn = 0;
-        int nextRow = 0;
-        for (View view : mViews) {
-            Element element = view.getElement();
-            if (element == mLayout) {
-                continue;
-            }
-
-            int row = view.getRow();
-            int column = view.getColumn();
-
-            if (column != implicitColumn && (implicitColumn > 0 || implicitRow > 0)) {
-                mRefactoring.setAttribute(mRootEdit, element, ANDROID_URI,
-                        mNamespace, ATTR_LAYOUT_COLUMN, Integer.toString(column));
-                if (column < implicitColumn) {
-                    implicitRow++;
-                }
-                implicitColumn = column;
-            }
-            if (row != implicitRow) {
-                mRefactoring.setAttribute(mRootEdit, element, ANDROID_URI,
-                        mNamespace, ATTR_LAYOUT_ROW, Integer.toString(row));
-                implicitRow = row;
-            }
-
-            int rowSpan = view.getRowSpan();
-            int columnSpan = view.getColumnSpan();
-            assert columnSpan >= 1;
-
-            if (rowSpan > 1) {
-                mRefactoring.setAttribute(mRootEdit, element, ANDROID_URI,
-                        mNamespace, ATTR_LAYOUT_ROW_SPAN, Integer.toString(rowSpan));
-            }
-            if (columnSpan > 1) {
-                mRefactoring.setAttribute(mRootEdit, element, ANDROID_URI,
-                        mNamespace, ATTR_LAYOUT_COLUMN_SPAN,
-                        Integer.toString(columnSpan));
-            }
-            nextRow = Math.max(nextRow, row + rowSpan);
-
-            // wrap_content is redundant in GridLayouts
-            Attr width = element.getAttributeNodeNS(ANDROID_URI, ATTR_LAYOUT_WIDTH);
-            if (width != null && VALUE_WRAP_CONTENT.equals(width.getValue())) {
-                mRefactoring.removeAttribute(mRootEdit, width);
-            }
-            Attr height = element.getAttributeNodeNS(ANDROID_URI, ATTR_LAYOUT_HEIGHT);
-            if (height != null && VALUE_WRAP_CONTENT.equals(height.getValue())) {
-                mRefactoring.removeAttribute(mRootEdit, height);
-            }
-
-            // Fix up children moved from LinearLayouts that have "invalid" sizes that
-            // was intended for layout weight handling in their old parent
-            if (LINEAR_LAYOUT.equals(element.getParentNode().getNodeName())) {
-                convert0dipToWrapContent(element);
-            }
-
-            implicitColumn += columnSpan;
-            if (implicitColumn >= mColumnCount) {
-                implicitColumn = 0;
-                assert nextRow > implicitRow;
-                implicitRow = nextRow;
-            }
-        }
-    }
-
-    private void processGravities() {
-        for (View view : mViews) {
-            Element element = view.getElement();
-            if (element == mLayout) {
-                continue;
-            }
-
-            Attr width = element.getAttributeNodeNS(ANDROID_URI, ATTR_LAYOUT_WIDTH);
-            Attr height = element.getAttributeNodeNS(ANDROID_URI, ATTR_LAYOUT_HEIGHT);
-            String gravity = element.getAttributeNS(ANDROID_URI, ATTR_LAYOUT_GRAVITY);
-            String newGravity = null;
-            if (width != null && (VALUE_MATCH_PARENT.equals(width.getValue()) ||
-                    VALUE_FILL_PARENT.equals(width.getValue()))) {
-                mRefactoring.removeAttribute(mRootEdit, width);
-                newGravity = gravity = GRAVITY_VALUE_FILL_HORIZONTAL;
-            }
-            if (height != null && (VALUE_MATCH_PARENT.equals(height.getValue()) ||
-                    VALUE_FILL_PARENT.equals(height.getValue()))) {
-                mRefactoring.removeAttribute(mRootEdit, height);
-                if (newGravity == GRAVITY_VALUE_FILL_HORIZONTAL) {
-                    newGravity = GRAVITY_VALUE_FILL;
-                } else {
-                    newGravity = GRAVITY_VALUE_FILL_VERTICAL;
-                }
-                gravity = newGravity;
-            }
-
-            if (gravity == null || gravity.length() == 0) {
-                ElementDescriptor descriptor = view.mInfo.getUiViewNode().getDescriptor();
-                if (descriptor instanceof ViewElementDescriptor) {
-                    ViewElementDescriptor viewDescriptor = (ViewElementDescriptor) descriptor;
-                    String fqcn = viewDescriptor.getFullClassName();
-                    FillPreference fill = ViewMetadataRepository.get().getFillPreference(fqcn);
-                    gravity = GridLayoutRule.computeDefaultGravity(fill);
-                    if (gravity != null) {
-                        newGravity = gravity;
-                    }
-                }
-            }
-
-            if (newGravity != null) {
-                mRefactoring.setAttribute(mRootEdit, element, ANDROID_URI,
-                        mNamespace, ATTR_LAYOUT_GRAVITY, newGravity);
-            }
-
-            view.mGravity = newGravity != null ? newGravity : gravity;
-        }
-    }
-
-
-    /** Converts 0dip values in layout_width and layout_height to wrap_content instead */
-    private void convert0dipToWrapContent(Element child) {
-        // Must convert layout_height="0dip" to layout_height="wrap_content".
-        // (And since wrap_content is the default, what we really do is remove
-        // the attribute completely.)
-        // 0dip is a special trick used in linear layouts in the presence of
-        // weights where 0dip ensures that the height of the view is not taken
-        // into account when distributing the weights. However, when converted
-        // to RelativeLayout this will instead cause the view to actually be assigned
-        // 0 height.
-        Attr height = child.getAttributeNodeNS(ANDROID_URI, ATTR_LAYOUT_HEIGHT);
-        // 0dip, 0dp, 0px, etc
-        if (height != null && height.getValue().startsWith("0")) { //$NON-NLS-1$
-            mRefactoring.removeAttribute(mRootEdit, height);
-        }
-        Attr width = child.getAttributeNodeNS(ANDROID_URI, ATTR_LAYOUT_WIDTH);
-        if (width != null && width.getValue().startsWith("0")) { //$NON-NLS-1$
-            mRefactoring.removeAttribute(mRootEdit, width);
-        }
-    }
-
-    /**
-     * Searches a view hierarchy and locates the {@link CanvasViewInfo} for the given
-     * {@link Element}
-     *
-     * @param info the root {@link CanvasViewInfo} to search below
-     * @param element the target element
-     * @return the {@link CanvasViewInfo} which corresponds to the given element
-     */
-    private CanvasViewInfo findViewForElement(CanvasViewInfo info, Element element) {
-        if (getElement(info) == element) {
-            return info;
-        }
-
-        for (CanvasViewInfo child : info.getChildren()) {
-            CanvasViewInfo result = findViewForElement(child, element);
-            if (result != null) {
-                return result;
-            }
-        }
-
-        return null;
-    }
-
-    /** Returns the {@link Element} for the given {@link CanvasViewInfo} */
-    private static Element getElement(CanvasViewInfo info) {
-        Node node = info.getUiViewNode().getXmlNode();
-        if (node instanceof Element) {
-            return (Element) node;
-        }
-
-        return null;
-    }
-
-
-    /** Holds layout information about an individual view */
-    private static class View {
-        private final Element mElement;
-        private int mRow = -1;
-        private int mCol = -1;
-        private int mRowSpan = -1;
-        private int mColSpan = -1;
-        private int mX1;
-        private int mY1;
-        private int mX2;
-        private int mY2;
-        private CanvasViewInfo mInfo;
-        private String mGravity;
-
-        public View(CanvasViewInfo view, Element element) {
-            mInfo = view;
-            mElement = element;
-
-            Rectangle b = mInfo.getAbsRect();
-            mX1 = b.x;
-            mX2 = b.x + b.width;
-            mY1 = b.y;
-            mY2 = b.y + b.height;
-        }
-
-        /**
-         * Returns the element for this view
-         *
-         * @return the element for the view
-         */
-        public Element getElement() {
-            return mElement;
-        }
-
-        /**
-         * The assigned row for this view
-         *
-         * @return the assigned row
-         */
-        public int getRow() {
-            return mRow;
-        }
-
-        /**
-         * The assigned column for this view
-         *
-         * @return the assigned column
-         */
-        public int getColumn() {
-            return mCol;
-        }
-
-        /**
-         * The assigned row span for this view
-         *
-         * @return the assigned row span
-         */
-        public int getRowSpan() {
-            return mRowSpan;
-        }
-
-        /**
-         * The assigned column span for this view
-         *
-         * @return the assigned column span
-         */
-        public int getColumnSpan() {
-            return mColSpan;
-        }
-
-        /**
-         * The left edge of the view to be used for placement
-         *
-         * @return the left edge x coordinate
-         */
-        public int getLeftEdge() {
-            return mX1;
-        }
-
-        /**
-         * The top edge of the view to be used for placement
-         *
-         * @return the top edge y coordinate
-         */
-        public int getTopEdge() {
-            return mY1;
-        }
-
-        /**
-         * The right edge of the view to be used for placement
-         *
-         * @return the right edge x coordinate
-         */
-        public int getRightEdge() {
-            return mX2;
-        }
-
-        /**
-         * The bottom edge of the view to be used for placement
-         *
-         * @return the bottom edge y coordinate
-         */
-        public int getBottomEdge() {
-            return mY2;
-        }
-
-        @Override
-        public String toString() {
-            return "View(" + VisualRefactoring.getId(mElement) + ": " + mX1 + "," + mY1 + ")";
-        }
-    }
-
-    /** Grid model for the views found in the view hierarchy, partitioned into rows and columns */
-    private static class GridModel {
-        private final List<View> mViews = new ArrayList<View>();
-        private final List<Element> mDelete = new ArrayList<Element>();
-        private final Map<Element, View> mElementToView = new HashMap<Element, View>();
-        private Element mLayout;
-        private boolean mFlatten;
-
-        GridModel(CanvasViewInfo view, Element layout, boolean flatten) {
-            mLayout = layout;
-            mFlatten = flatten;
-
-            scan(view, true);
-            analyzeKnownLayouts();
-            initializeColumns();
-            initializeRows();
-            mDelete.remove(getElement(view));
-        }
-
-        /**
-         * Returns the {@link View} objects to be placed in the grid
-         *
-         * @return list of {@link View} objects, never null but possibly empty
-         */
-        public List<View> getViews() {
-            return mViews;
-        }
-
-        /**
-         * Returns the list of elements that are scheduled for deletion in the
-         * flattening operation
-         *
-         * @return elements to be deleted, never null but possibly empty
-         */
-        public List<Element> getDeletedElements() {
-            return mDelete;
-        }
-
-        /**
-         * Compute and return column count
-         *
-         * @return the column count
-         */
-        public int computeColumnCount() {
-            int columnCount = 0;
-            for (View view : mViews) {
-                if (view.getElement() == mLayout) {
-                    continue;
-                }
-
-                int column = view.getColumn();
-                int columnSpan = view.getColumnSpan();
-                if (column + columnSpan > columnCount) {
-                    columnCount = column + columnSpan;
-                }
-            }
-            return columnCount;
-        }
-
-        /**
-         * Initializes the column and columnSpan attributes of the views
-         */
-        private void initializeColumns() {
-            // Now initialize table view row, column and spans
-            Map<Integer, List<View>> mColumnViews = new HashMap<Integer, List<View>>();
-            for (View view : mViews) {
-                if (view.mElement == mLayout) {
-                    continue;
-                }
-                int x = view.getLeftEdge();
-                List<View> list = mColumnViews.get(x);
-                if (list == null) {
-                    list = new ArrayList<View>();
-                    mColumnViews.put(x, list);
-                }
-                list.add(view);
-            }
-
-            List<Integer> columnOffsets = new ArrayList<Integer>(mColumnViews.keySet());
-            Collections.sort(columnOffsets);
-
-            int columnIndex = 0;
-            for (Integer column : columnOffsets) {
-                List<View> views = mColumnViews.get(column);
-                if (views != null) {
-                    for (View view : views) {
-                        view.mCol = columnIndex;
-                    }
-                }
-                columnIndex++;
-            }
-            // Initialize column spans
-            for (View view : mViews) {
-                if (view.mElement == mLayout) {
-                    continue;
-                }
-                int index = Collections.binarySearch(columnOffsets, view.getRightEdge());
-                int column;
-                if (index == -1) {
-                    // Smaller than the first element; just use the first column
-                    column = 0;
-                } else if (index < 0) {
-                    column = -(index + 2);
-                } else {
-                    column = index;
-                }
-
-                if (column < view.mCol) {
-                    column = view.mCol;
-                }
-
-                view.mColSpan = column - view.mCol + 1;
-            }
-        }
-
-        /**
-         * Initializes the row and rowSpan attributes of the views
-         */
-        private void initializeRows() {
-            Map<Integer, List<View>> mRowViews = new HashMap<Integer, List<View>>();
-            for (View view : mViews) {
-                if (view.mElement == mLayout) {
-                    continue;
-                }
-                int y = view.getTopEdge();
-                List<View> list = mRowViews.get(y);
-                if (list == null) {
-                    list = new ArrayList<View>();
-                    mRowViews.put(y, list);
-                }
-                list.add(view);
-            }
-
-            List<Integer> rowOffsets = new ArrayList<Integer>(mRowViews.keySet());
-            Collections.sort(rowOffsets);
-
-            int rowIndex = 0;
-            for (Integer row : rowOffsets) {
-                List<View> views = mRowViews.get(row);
-                if (views != null) {
-                    for (View view : views) {
-                        view.mRow = rowIndex;
-                    }
-                }
-                rowIndex++;
-            }
-
-            // Initialize row spans
-            for (View view : mViews) {
-                if (view.mElement == mLayout) {
-                    continue;
-                }
-                int index = Collections.binarySearch(rowOffsets, view.getBottomEdge());
-                int row;
-                if (index == -1) {
-                    // Smaller than the first element; just use the first row
-                    row = 0;
-                } else if (index < 0) {
-                    row = -(index + 2);
-                } else {
-                    row = index;
-                }
-
-                if (row < view.mRow) {
-                    row = view.mRow;
-                }
-
-                view.mRowSpan = row - view.mRow + 1;
-            }
-        }
-
-        /**
-         * Walks over a given view hierarchy and locates views to be placed in
-         * the grid layout (or deleted if we are flattening the hierarchy)
-         *
-         * @param view the view to analyze
-         * @param isRoot whether this view is the root (which cannot be removed)
-         * @return the {@link View} object for the {@link CanvasViewInfo}
-         *         hierarchy we just analyzed, or null
-         */
-        private View scan(CanvasViewInfo view, boolean isRoot) {
-            View added = null;
-            if (!mFlatten || !isRemovableLayout(view)) {
-                added = add(view);
-                if (!isRoot) {
-                    return added;
-                }
-            } else {
-                mDelete.add(getElement(view));
-            }
-
-            // Build up a table model of the view
-            for (CanvasViewInfo child : view.getChildren()) {
-                Element childElement = getElement(child);
-
-                // See if this view shares the edge with the removed
-                // parent layout, and if so, record that such that we can
-                // later handle attachments to the removed parent edges
-
-                if (mFlatten && isRemovableLayout(child)) {
-                    // When flattening, we want to disregard all layouts and instead
-                    // add their children!
-                    for (CanvasViewInfo childView : child.getChildren()) {
-                        scan(childView, false);
-                    }
-                    mDelete.add(childElement);
-                } else {
-                    scan(child, false);
-                }
-            }
-
-            return added;
-        }
-
-        /** Adds the given {@link CanvasViewInfo} into our internal view list */
-        private View add(CanvasViewInfo info) {
-            Element element = getElement(info);
-            View view = new View(info, element);
-            mViews.add(view);
-            mElementToView.put(element, view);
-            return view;
-        }
-
-        private void analyzeKnownLayouts() {
-            Set<Element> parents = new HashSet<Element>();
-            for (View view : mViews) {
-                Node parent = view.getElement().getParentNode();
-                if (parent instanceof Element) {
-                    parents.add((Element) parent);
-                }
-            }
-
-            List<Collection<View>> rowGroups = new ArrayList<Collection<View>>();
-            List<Collection<View>> columnGroups = new ArrayList<Collection<View>>();
-            for (Element parent : parents) {
-                String tagName = parent.getTagName();
-                if (tagName.equals(LINEAR_LAYOUT) || tagName.equals(TABLE_LAYOUT) ||
-                        tagName.equals(TABLE_ROW) || tagName.equals(RADIO_GROUP)) {
-                    Set<View> group = new HashSet<View>();
-                    for (Element child : DomUtilities.getChildren(parent)) {
-                        View view = mElementToView.get(child);
-                        if (view != null) {
-                            group.add(view);
-                        }
-                    }
-                    if (group.size() > 1) {
-                        boolean isVertical = VALUE_VERTICAL.equals(parent.getAttributeNS(
-                                ANDROID_URI, ATTR_ORIENTATION));
-                        if (tagName.equals(TABLE_LAYOUT)) {
-                            isVertical = true;
-                        } else if (tagName.equals(TABLE_ROW)) {
-                            isVertical = false;
-                        }
-                        if (isVertical) {
-                            columnGroups.add(group);
-                        } else {
-                            rowGroups.add(group);
-                        }
-                    }
-                } else if (tagName.equals(RELATIVE_LAYOUT)) {
-                    List<Element> children = DomUtilities.getChildren(parent);
-                    for (Element child : children) {
-                        View view = mElementToView.get(child);
-                        if (view == null) {
-                            continue;
-                        }
-                        NamedNodeMap attributes = child.getAttributes();
-                        for (int i = 0, n = attributes.getLength(); i < n; i++) {
-                            Attr attr = (Attr) attributes.item(i);
-                            String name = attr.getLocalName();
-                            if (name.startsWith(ATTR_LAYOUT_RESOURCE_PREFIX)) {
-                                boolean alignVertical =
-                                        name.equals(ATTR_LAYOUT_ALIGN_TOP) ||
-                                        name.equals(ATTR_LAYOUT_ALIGN_BOTTOM) ||
-                                        name.equals(ATTR_LAYOUT_ALIGN_BASELINE);
-                                boolean alignHorizontal =
-                                        name.equals(ATTR_LAYOUT_ALIGN_LEFT) ||
-                                        name.equals(ATTR_LAYOUT_ALIGN_RIGHT);
-                                if (!alignVertical && !alignHorizontal) {
-                                    continue;
-                                }
-                                String value = attr.getValue();
-                                if (value.startsWith(ID_PREFIX)
-                                        || value.startsWith(NEW_ID_PREFIX)) {
-                                    String targetName = BaseLayoutRule.stripIdPrefix(value);
-                                    Element target = null;
-                                    for (Element c : children) {
-                                        String id = VisualRefactoring.getId(c);
-                                        if (targetName.equals(BaseLayoutRule.stripIdPrefix(id))) {
-                                            target = c;
-                                            break;
-                                        }
-                                    }
-                                    View targetView = mElementToView.get(target);
-                                    if (targetView != null) {
-                                        List<View> group = new ArrayList<View>(2);
-                                        group.add(view);
-                                        group.add(targetView);
-                                        if (alignHorizontal) {
-                                            columnGroups.add(group);
-                                        } else {
-                                            assert alignVertical;
-                                            rowGroups.add(group);
-                                        }
-                                    }
-                                }
-                            }
-                        }
-                    }
-                } else {
-                    // TODO: Consider looking for interesting metadata from other layouts
-                }
-            }
-
-            // Assign the same top or left coordinates to the groups to ensure that they
-            // all get positioned in the same row or column
-            for (Collection<View> rowGroup : rowGroups) {
-                // Find the smallest one
-                Iterator<View> iterator = rowGroup.iterator();
-                int smallest = iterator.next().mY1;
-                while (iterator.hasNext()) {
-                    smallest = Math.min(smallest, iterator.next().mY1);
-                }
-                for (View view : rowGroup) {
-                   view.mY2 -= (view.mY1 - smallest);
-                   view.mY1 = smallest;
-                }
-            }
-            for (Collection<View> columnGroup : columnGroups) {
-                Iterator<View> iterator = columnGroup.iterator();
-                int smallest = iterator.next().mX1;
-                while (iterator.hasNext()) {
-                    smallest = Math.min(smallest, iterator.next().mX1);
-                }
-                for (View view : columnGroup) {
-                   view.mX2 -= (view.mX1 - smallest);
-                   view.mX1 = smallest;
-                }
-            }
-        }
-
-        /**
-         * Returns true if the given {@link CanvasViewInfo} represents an element we
-         * should remove in a flattening conversion. We don't want to remove non-layout
-         * views, or layout views that for example contain drawables on their own.
-         */
-        private boolean isRemovableLayout(CanvasViewInfo child) {
-            // The element being converted is NOT removable!
-            Element element = getElement(child);
-            if (element == mLayout) {
-                return false;
-            }
-
-            ElementDescriptor descriptor = child.getUiViewNode().getDescriptor();
-            String name = descriptor.getXmlLocalName();
-            if (name.equals(LINEAR_LAYOUT) || name.equals(RELATIVE_LAYOUT)
-                    || name.equals(TABLE_LAYOUT) || name.equals(TABLE_ROW)) {
-                // Don't delete layouts that provide a background image or gradient
-                if (element.hasAttributeNS(ANDROID_URI, ATTR_BACKGROUND)) {
-                    AdtPlugin.log(IStatus.WARNING,
-                            "Did not flatten layout %1$s because it defines a '%2$s' attribute",
-                            VisualRefactoring.getId(element), ATTR_BACKGROUND);
-                    return false;
-                }
-
-                return true;
-            }
-
-            return false;
-        }
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/JavaQuickAssistant.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/JavaQuickAssistant.java
deleted file mode 100644
index df5d9ea..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/JavaQuickAssistant.java
+++ /dev/null
@@ -1,73 +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.eclipse.adt.internal.editors.layout.refactoring;
-
-import com.android.ide.eclipse.adt.internal.project.BaseProjectHelper;
-import com.android.ide.eclipse.adt.internal.refactorings.extractstring.ExtractStringProposal;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.jdt.core.dom.ASTNode;
-import org.eclipse.jdt.ui.text.java.IInvocationContext;
-import org.eclipse.jdt.ui.text.java.IJavaCompletionProposal;
-import org.eclipse.jdt.ui.text.java.IProblemLocation;
-
-/**
- * Quick Assistant for Java files in Android projects
- */
-public class JavaQuickAssistant implements org.eclipse.jdt.ui.text.java.IQuickAssistProcessor {
-    public JavaQuickAssistant() {
-    }
-
-    @Override
-    public boolean hasAssists(IInvocationContext context) throws CoreException {
-        return true;
-    }
-
-    @Override
-    public IJavaCompletionProposal[] getAssists(IInvocationContext context,
-            IProblemLocation[] locations) throws CoreException {
-        // We should only offer Android quick assists within Android projects.
-        // This can be done by adding this logic to the extension registration:
-        //
-        //    <enablement>
-        //        <with variable="projectNatures">
-        //            <iterate operator="or">
-        //                <equals value="com.android.ide.eclipse.adt.AndroidNature"/>
-        //            </iterate>
-        //        </with>
-        //    </enablement>
-        //
-        // However, this causes some errors to be dumped to the log, so instead we filter
-        // out non Android projects programmatically:
-
-        IProject project = context.getCompilationUnit().getJavaProject().getProject();
-        if (project == null || !BaseProjectHelper.isAndroidProject(project)) {
-            return null;
-        }
-
-        ASTNode coveringNode = context.getCoveringNode();
-        if (coveringNode != null && coveringNode.getNodeType() == ASTNode.STRING_LITERAL
-                && coveringNode.getLength() > 2) { // don't extract empty strings (includes quotes)
-            return new IJavaCompletionProposal[] {
-                new ExtractStringProposal(context)
-            };
-        }
-
-        return null;
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/RefactoringAssistant.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/RefactoringAssistant.java
deleted file mode 100644
index aa8c119..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/RefactoringAssistant.java
+++ /dev/null
@@ -1,336 +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.eclipse.adt.internal.editors.layout.refactoring;
-
-import com.android.ide.common.resources.ResourceUrl;
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.ide.eclipse.adt.internal.editors.AndroidXmlEditor;
-import com.android.ide.eclipse.adt.internal.editors.layout.LayoutEditorDelegate;
-import com.android.ide.eclipse.adt.internal.editors.layout.gle2.DomUtilities;
-import com.android.ide.eclipse.adt.internal.refactorings.core.RenameResourceProcessor;
-import com.android.ide.eclipse.adt.internal.refactorings.core.RenameResourceWizard;
-import com.android.ide.eclipse.adt.internal.refactorings.core.RenameResourceXmlTextAction;
-import com.android.ide.eclipse.adt.internal.refactorings.extractstring.ExtractStringRefactoring;
-import com.android.ide.eclipse.adt.internal.refactorings.extractstring.ExtractStringWizard;
-import com.android.resources.ResourceType;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.jface.text.IDocument;
-import org.eclipse.jface.text.ITextSelection;
-import org.eclipse.jface.text.TextSelection;
-import org.eclipse.jface.text.contentassist.ICompletionProposal;
-import org.eclipse.jface.text.contentassist.IContextInformation;
-import org.eclipse.jface.text.quickassist.IQuickAssistInvocationContext;
-import org.eclipse.jface.text.quickassist.IQuickAssistProcessor;
-import org.eclipse.jface.text.source.Annotation;
-import org.eclipse.jface.text.source.ISourceViewer;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.ISelectionProvider;
-import org.eclipse.ltk.core.refactoring.Refactoring;
-import org.eclipse.ltk.core.refactoring.participants.RenameRefactoring;
-import org.eclipse.ltk.ui.refactoring.RefactoringWizard;
-import org.eclipse.ltk.ui.refactoring.RefactoringWizardOpenOperation;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
-import org.eclipse.wst.sse.core.internal.provisional.IndexedRegion;
-import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;
-import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocumentRegion;
-import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegion;
-import org.eclipse.wst.sse.ui.StructuredTextEditor;
-import org.eclipse.wst.xml.core.internal.regions.DOMRegionContext;
-import org.w3c.dom.Node;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * QuickAssistProcessor which helps invoke refactoring operations on text elements.
- */
-@SuppressWarnings("restriction") // XML model
-public class RefactoringAssistant implements IQuickAssistProcessor {
-
-    /**
-     * Creates a new {@link RefactoringAssistant}
-     */
-    public RefactoringAssistant() {
-    }
-
-    @Override
-    public boolean canAssist(IQuickAssistInvocationContext invocationContext) {
-        return true;
-    }
-
-    @Override
-    public boolean canFix(Annotation annotation) {
-        return true;
-    }
-
-    @Override
-    public ICompletionProposal[] computeQuickAssistProposals(
-            IQuickAssistInvocationContext invocationContext) {
-
-        ISourceViewer sourceViewer = invocationContext.getSourceViewer();
-        AndroidXmlEditor xmlEditor = AndroidXmlEditor.fromTextViewer(sourceViewer);
-        if (xmlEditor == null) {
-            return null;
-        }
-
-        IFile file = xmlEditor.getInputFile();
-        if (file == null) {
-            return null;
-        }
-        int offset = invocationContext.getOffset();
-
-        // Ensure that we are over a tag name (for element-based refactoring
-        // operations) or a value (for the extract include refactoring)
-
-        boolean isValue = false;
-        boolean isReferenceValue = false;
-        boolean isTagName = false;
-        boolean isAttributeName = false;
-        boolean isStylableAttribute = false;
-        ResourceUrl resource = null;
-        IStructuredModel model = null;
-        try {
-            model = xmlEditor.getModelForRead();
-            IStructuredDocument doc = model.getStructuredDocument();
-            IStructuredDocumentRegion region = doc.getRegionAtCharacterOffset(offset);
-            ITextRegion subRegion = region.getRegionAtCharacterOffset(offset);
-            if (subRegion != null) {
-                String type = subRegion.getType();
-                if (type.equals(DOMRegionContext.XML_TAG_ATTRIBUTE_VALUE)) {
-                    String value = region.getText(subRegion);
-                    // Only extract values that aren't already resources
-                    // (and value includes leading ' or ")
-                    isValue = true;
-                    if (value.startsWith("'@") || value.startsWith("\"@")) { //$NON-NLS-1$ //$NON-NLS-2$
-                        isReferenceValue = true;
-                        resource = RenameResourceXmlTextAction.findResource(doc, offset);
-                    }
-                } else if (type.equals(DOMRegionContext.XML_TAG_NAME)
-                        || type.equals(DOMRegionContext.XML_TAG_OPEN)
-                        || type.equals(DOMRegionContext.XML_TAG_CLOSE)) {
-                    isTagName = true;
-                } else if (type.equals(DOMRegionContext.XML_TAG_ATTRIBUTE_NAME) ) {
-                    isAttributeName = true;
-                    String name = region.getText(subRegion);
-                    int index = name.indexOf(':');
-                    if (index != -1) {
-                        name = name.substring(index + 1);
-                    }
-                    isStylableAttribute = ExtractStyleRefactoring.isStylableAttribute(name);
-                } else if (type.equals(DOMRegionContext.XML_TAG_ATTRIBUTE_EQUALS)) {
-                    // On the edge of an attribute name and an attribute value
-                    isAttributeName = true;
-                    isStylableAttribute = true;
-                } else if (type.equals(DOMRegionContext.XML_CONTENT)) {
-                    resource = RenameResourceXmlTextAction.findResource(doc, offset);
-                }
-            }
-        } finally {
-            if (model != null) {
-                model.releaseFromRead();
-            }
-        }
-
-        List<ICompletionProposal> proposals = new ArrayList<ICompletionProposal>();
-        if (isTagName || isAttributeName || isValue || resource != null) {
-            StructuredTextEditor structuredEditor = xmlEditor.getStructuredTextEditor();
-            ISelectionProvider provider = structuredEditor.getSelectionProvider();
-            ISelection selection = provider.getSelection();
-            if (selection instanceof ITextSelection) {
-                ITextSelection textSelection = (ITextSelection) selection;
-
-                ITextSelection originalSelection = textSelection;
-
-                // Most of the visual refactorings do not work on text ranges
-                // ...except for Extract Style where the actual attributes overlapping
-                // the selection is going to be the set of eligible attributes
-                boolean selectionOkay = false;
-
-                if (textSelection.getLength() == 0 && !isValue) {
-                    selectionOkay = true;
-                    ISourceViewer textViewer = xmlEditor.getStructuredSourceViewer();
-                    int caretOffset = textViewer.getTextWidget().getCaretOffset();
-                    if (caretOffset >= 0) {
-                        Node node = DomUtilities.getNode(textViewer.getDocument(), caretOffset);
-                        if (node instanceof IndexedRegion) {
-                            IndexedRegion region = (IndexedRegion) node;
-                            int startOffset = region.getStartOffset();
-                            int length = region.getEndOffset() - region.getStartOffset();
-                            textSelection = new TextSelection(startOffset, length);
-                        }
-                    }
-                }
-
-                if (isValue && !isReferenceValue) {
-                    proposals.add(new RefactoringProposal(xmlEditor,
-                            new ExtractStringRefactoring(file, xmlEditor, textSelection)));
-                } else if (resource != null) {
-                    RenameResourceProcessor processor = new RenameResourceProcessor(
-                            file.getProject(), resource.type, resource.name, null);
-                    RenameRefactoring refactoring = new RenameRefactoring(processor);
-                    proposals.add(new RefactoringProposal(xmlEditor, refactoring));
-                }
-
-                LayoutEditorDelegate delegate = LayoutEditorDelegate.fromEditor(xmlEditor);
-                if (delegate != null) {
-                    boolean showStyleFirst = isValue || (isAttributeName && isStylableAttribute);
-                    if (showStyleFirst) {
-                        proposals.add(new RefactoringProposal(
-                                xmlEditor,
-                                new ExtractStyleRefactoring(
-                                        file,
-                                        delegate,
-                                        originalSelection,
-                                        null)));
-                    }
-
-                    if (selectionOkay) {
-                        proposals.add(new RefactoringProposal(
-                                xmlEditor,
-                                new WrapInRefactoring(
-                                        file,
-                                        delegate,
-                                        textSelection,
-                                        null)));
-                        proposals.add(new RefactoringProposal(
-                                xmlEditor,
-                                new UnwrapRefactoring(
-                                        file,
-                                        delegate,
-                                        textSelection,
-                                        null)));
-                        proposals.add(new RefactoringProposal(
-                                xmlEditor,
-                                new ChangeViewRefactoring(
-                                        file,
-                                        delegate,
-                                        textSelection,
-                                        null)));
-                        proposals.add(new RefactoringProposal(
-                                xmlEditor,
-                                new ChangeLayoutRefactoring(
-                                        file,
-                                        delegate,
-                                        textSelection,
-                                        null)));
-                    }
-
-                    // Extract Include must always have an actual block to be extracted
-                    if (textSelection.getLength() > 0) {
-                        proposals.add(new RefactoringProposal(
-                                xmlEditor,
-                                new ExtractIncludeRefactoring(
-                                        file,
-                                        delegate,
-                                        textSelection,
-                                        null)));
-                    }
-
-                    // If it's not a value or attribute name, don't place it on top
-                    if (!showStyleFirst) {
-                        proposals.add(new RefactoringProposal(
-                                xmlEditor,
-                                new ExtractStyleRefactoring(
-                                        file,
-                                        delegate,
-                                        originalSelection,
-                                        null)));
-                    }
-                }
-            }
-        }
-
-        if (proposals.size() == 0) {
-            return null;
-        } else {
-            return proposals.toArray(new ICompletionProposal[proposals.size()]);
-        }
-    }
-
-    @Override
-    public String getErrorMessage() {
-        return null;
-    }
-
-    private static class RefactoringProposal
-            implements ICompletionProposal {
-        private final AndroidXmlEditor mEditor;
-        private final Refactoring mRefactoring;
-
-        RefactoringProposal(AndroidXmlEditor editor, Refactoring refactoring) {
-            super();
-            mEditor = editor;
-            mRefactoring = refactoring;
-        }
-
-        @Override
-        public void apply(IDocument document) {
-            RefactoringWizard wizard = null;
-            if (mRefactoring instanceof VisualRefactoring) {
-                wizard = ((VisualRefactoring) mRefactoring).createWizard();
-            } else if (mRefactoring instanceof ExtractStringRefactoring) {
-                wizard = new ExtractStringWizard((ExtractStringRefactoring) mRefactoring,
-                        mEditor.getProject());
-            } else if (mRefactoring instanceof RenameRefactoring) {
-                RenameRefactoring refactoring = (RenameRefactoring) mRefactoring;
-                RenameResourceProcessor processor =
-                        (RenameResourceProcessor) refactoring.getProcessor();
-                ResourceType type = processor.getType();
-                wizard = new RenameResourceWizard((RenameRefactoring) mRefactoring, type, false);
-            } else {
-                throw new IllegalArgumentException();
-            }
-
-            RefactoringWizardOpenOperation op = new RefactoringWizardOpenOperation(wizard);
-            try {
-                IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
-                op.run(window.getShell(), wizard.getDefaultPageTitle());
-            } catch (InterruptedException e) {
-            }
-        }
-
-        @Override
-        public String getAdditionalProposalInfo() {
-            return String.format("Initiates the \"%1$s\" refactoring", mRefactoring.getName());
-        }
-
-        @Override
-        public IContextInformation getContextInformation() {
-            return null;
-        }
-
-        @Override
-        public String getDisplayString() {
-            return mRefactoring.getName();
-        }
-
-        @Override
-        public Image getImage() {
-            return AdtPlugin.getAndroidLogo();
-        }
-
-        @Override
-        public Point getSelection(IDocument document) {
-            return null;
-        }
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/RelativeLayoutConversionHelper.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/RelativeLayoutConversionHelper.java
deleted file mode 100644
index e0d6313..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/RelativeLayoutConversionHelper.java
+++ /dev/null
@@ -1,1633 +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.eclipse.adt.internal.editors.layout.refactoring;
-
-import static com.android.SdkConstants.ANDROID_URI;
-import static com.android.SdkConstants.ATTR_BACKGROUND;
-import static com.android.SdkConstants.ATTR_BASELINE_ALIGNED;
-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_VERTICAL;
-import static com.android.SdkConstants.ATTR_LAYOUT_HEIGHT;
-import static com.android.SdkConstants.ATTR_LAYOUT_MARGIN_LEFT;
-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_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_ORIENTATION;
-import static com.android.SdkConstants.ID_PREFIX;
-import static com.android.SdkConstants.LINEAR_LAYOUT;
-import static com.android.SdkConstants.NEW_ID_PREFIX;
-import static com.android.SdkConstants.RELATIVE_LAYOUT;
-import static com.android.SdkConstants.VALUE_FALSE;
-import static com.android.SdkConstants.VALUE_N_DP;
-import static com.android.SdkConstants.VALUE_TRUE;
-import static com.android.SdkConstants.VALUE_VERTICAL;
-import static com.android.SdkConstants.VALUE_WRAP_CONTENT;
-import static com.android.ide.common.layout.GravityHelper.GRAVITY_BOTTOM;
-import static com.android.ide.common.layout.GravityHelper.GRAVITY_CENTER_HORIZ;
-import static com.android.ide.common.layout.GravityHelper.GRAVITY_CENTER_VERT;
-import static com.android.ide.common.layout.GravityHelper.GRAVITY_FILL_HORIZ;
-import static com.android.ide.common.layout.GravityHelper.GRAVITY_FILL_VERT;
-import static com.android.ide.common.layout.GravityHelper.GRAVITY_LEFT;
-import static com.android.ide.common.layout.GravityHelper.GRAVITY_RIGHT;
-import static com.android.ide.common.layout.GravityHelper.GRAVITY_TOP;
-import static com.android.ide.common.layout.GravityHelper.GRAVITY_VERT_MASK;
-
-import com.android.ide.common.layout.GravityHelper;
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.ide.eclipse.adt.internal.editors.descriptors.ElementDescriptor;
-import com.android.ide.eclipse.adt.internal.editors.layout.gle2.CanvasViewInfo;
-import com.android.ide.eclipse.adt.internal.editors.layout.gle2.DomUtilities;
-import com.android.ide.eclipse.adt.internal.preferences.AdtPrefs;
-import com.android.utils.Pair;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.swt.graphics.Rectangle;
-import org.eclipse.text.edits.MultiTextEdit;
-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.PrintWriter;
-import java.io.StringWriter;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-/**
- * Helper class which performs the bulk of the layout conversion to relative layout
- * <p>
- * Future enhancements:
- * <ul>
- * <li>Render the layout at multiple screen sizes and analyze how the widgets move and
- * stretch and use that to add in additional constraints
- * <li> Adapt the LinearLayout analysis code to work with TableLayouts and TableRows as well
- * (just need to tweak the "isVertical" interpretation to account for the different defaults,
- * and perhaps do something about column size properties.
- * <li> We need to take into account existing margins and clear/update them
- * </ul>
- */
-class RelativeLayoutConversionHelper {
-    private final MultiTextEdit mRootEdit;
-    private final boolean mFlatten;
-    private final Element mLayout;
-    private final ChangeLayoutRefactoring mRefactoring;
-    private final CanvasViewInfo mRootView;
-    private List<Element> mDeletedElements;
-
-    RelativeLayoutConversionHelper(ChangeLayoutRefactoring refactoring,
-            Element layout, boolean flatten, MultiTextEdit rootEdit, CanvasViewInfo rootView) {
-        mRefactoring = refactoring;
-        mLayout = layout;
-        mFlatten = flatten;
-        mRootEdit = rootEdit;
-        mRootView = rootView;
-    }
-
-    /** Performs conversion from any layout to a RelativeLayout */
-    public void convertToRelative() {
-        if (mRootView == null) {
-            return;
-        }
-
-        // Locate the view for the layout
-        CanvasViewInfo layoutView = findViewForElement(mRootView, mLayout);
-        if (layoutView == null || layoutView.getChildren().size() == 0) {
-            // No children. THAT was an easy conversion!
-            return;
-        }
-
-        // Study the layout and get information about how to place individual elements
-        List<View> views = analyzeLayout(layoutView);
-
-        // Create/update relative layout constraints
-        createAttachments(views);
-    }
-
-    /** Returns the elements that were deleted, or null */
-    List<Element> getDeletedElements() {
-        return mDeletedElements;
-    }
-
-    /**
-     * Analyzes the given view hierarchy and produces a list of {@link View} objects which
-     * contain placement information for each element
-     */
-    private List<View> analyzeLayout(CanvasViewInfo layoutView) {
-        EdgeList edgeList = new EdgeList(layoutView);
-        mDeletedElements = edgeList.getDeletedElements();
-        deleteRemovedElements(mDeletedElements);
-
-        List<Integer> columnOffsets = edgeList.getColumnOffsets();
-        List<Integer> rowOffsets = edgeList.getRowOffsets();
-
-        // Compute x/y offsets for each row/column index
-        int[] left = new int[columnOffsets.size()];
-        int[] top = new int[rowOffsets.size()];
-
-        Map<Integer, Integer> xToCol = new HashMap<Integer, Integer>();
-        int columnIndex = 0;
-        for (Integer offset : columnOffsets) {
-            left[columnIndex] = offset;
-            xToCol.put(offset, columnIndex++);
-        }
-        Map<Integer, Integer> yToRow = new HashMap<Integer, Integer>();
-        int rowIndex = 0;
-        for (Integer offset : rowOffsets) {
-            top[rowIndex] = offset;
-            yToRow.put(offset, rowIndex++);
-        }
-
-        // Create a complete list of view objects
-        List<View> views = createViews(edgeList, columnOffsets);
-        initializeSpans(edgeList, columnOffsets, rowOffsets, xToCol, yToRow);
-
-        // Sanity check
-        for (View view : views) {
-            assert view.getLeftEdge() == left[view.mCol];
-            assert view.getTopEdge() == top[view.mRow];
-            assert view.getRightEdge() == left[view.mCol+view.mColSpan];
-            assert view.getBottomEdge() == top[view.mRow+view.mRowSpan];
-        }
-
-        // Ensure that every view has a proper id such that it can be referred to
-        // with a constraint
-        initializeIds(edgeList, views);
-
-        // Attempt to lay the views out in a grid with constraints (though not that widgets
-        // can overlap as well)
-        Grid grid = new Grid(views, left, top);
-        computeKnownConstraints(views, edgeList);
-        computeHorizontalConstraints(grid);
-        computeVerticalConstraints(grid);
-
-        return views;
-    }
-
-    /** Produces a list of {@link View} objects from an {@link EdgeList} */
-    private List<View> createViews(EdgeList edgeList, List<Integer> columnOffsets) {
-        List<View> views = new ArrayList<View>();
-        for (Integer offset : columnOffsets) {
-            List<View> leftEdgeViews = edgeList.getLeftEdgeViews(offset);
-            if (leftEdgeViews == null) {
-                // must have been a right edge
-                continue;
-            }
-            for (View view : leftEdgeViews) {
-                views.add(view);
-            }
-        }
-        return views;
-    }
-
-    /** Removes any elements targeted for deletion */
-    private void deleteRemovedElements(List<Element> delete) {
-        if (mFlatten && delete.size() > 0) {
-            for (Element element : delete) {
-                mRefactoring.removeElementTags(mRootEdit, element, delete,
-                        !AdtPrefs.getPrefs().getFormatGuiXml() /*changeIndentation*/);
-            }
-        }
-    }
-
-    /** Ensures that every element has an id such that it can be referenced from a constraint */
-    private void initializeIds(EdgeList edgeList, List<View> views) {
-        // Ensure that all views have a valid id
-        for (View view : views) {
-            String id = mRefactoring.ensureHasId(mRootEdit, view.mElement, null);
-            edgeList.setIdAttributeValue(view, id);
-        }
-    }
-
-    /**
-     * Initializes the column and row indices, as well as any column span and row span
-     * values
-     */
-    private void initializeSpans(EdgeList edgeList, List<Integer> columnOffsets,
-            List<Integer> rowOffsets, Map<Integer, Integer> xToCol, Map<Integer, Integer> yToRow) {
-        // Now initialize table view row, column and spans
-        for (Integer offset : columnOffsets) {
-            List<View> leftEdgeViews = edgeList.getLeftEdgeViews(offset);
-            if (leftEdgeViews == null) {
-                // must have been a right edge
-                continue;
-            }
-            for (View view : leftEdgeViews) {
-                Integer col = xToCol.get(view.getLeftEdge());
-                assert col != null;
-                Integer end = xToCol.get(view.getRightEdge());
-                assert end != null;
-
-                view.mCol = col;
-                view.mColSpan = end - col;
-            }
-        }
-
-        for (Integer offset : rowOffsets) {
-            List<View> topEdgeViews = edgeList.getTopEdgeViews(offset);
-            if (topEdgeViews == null) {
-                // must have been a bottom edge
-                continue;
-            }
-            for (View view : topEdgeViews) {
-                Integer row = yToRow.get(view.getTopEdge());
-                assert row != null;
-                Integer end = yToRow.get(view.getBottomEdge());
-                assert end != null;
-
-                view.mRow = row;
-                view.mRowSpan = end - row;
-            }
-        }
-    }
-
-    /**
-     * Creates refactoring edits which adds or updates constraints for the given list of
-     * views
-     */
-    private void createAttachments(List<View> views) {
-        // Make the attachments
-        String namespace = mRefactoring.getAndroidNamespacePrefix();
-        for (View view : views) {
-            for (Pair<String, String> constraint : view.getHorizConstraints()) {
-                mRefactoring.setAttribute(mRootEdit, view.mElement, ANDROID_URI,
-                        namespace, constraint.getFirst(), constraint.getSecond());
-            }
-            for (Pair<String, String> constraint : view.getVerticalConstraints()) {
-                mRefactoring.setAttribute(mRootEdit, view.mElement, ANDROID_URI,
-                        namespace, constraint.getFirst(), constraint.getSecond());
-            }
-        }
-    }
-
-    /**
-     * Analyzes the existing layouts and layout parameter objects in the document to infer
-     * constraints for layout types that we know about - such as LinearLayout baseline
-     * alignment, weights, gravity, etc.
-     */
-    private void computeKnownConstraints(List<View> views, EdgeList edgeList) {
-        // List of parent layout elements we've already processed. We iterate through all
-        // the -children-, and we ask each for its element parent (which won't have a view)
-        // and we look at the parent's layout attributes and its children layout constraints,
-        // and then we stash away constraints that we can infer. This means that we will
-        // encounter the same parent for every sibling, so that's why there's a map to
-        // prevent duplicate work.
-        Set<Node> seen = new HashSet<Node>();
-
-        for (View view : views) {
-            Element element = view.getElement();
-            Node parent = element.getParentNode();
-            if (seen.contains(parent)) {
-                continue;
-            }
-            seen.add(parent);
-
-            if (parent.getNodeType() != Node.ELEMENT_NODE) {
-                continue;
-            }
-            Element layout = (Element) parent;
-            String layoutName = layout.getTagName();
-
-            if (LINEAR_LAYOUT.equals(layoutName)) {
-                analyzeLinearLayout(edgeList, layout);
-            } else if (RELATIVE_LAYOUT.equals(layoutName)) {
-                analyzeRelativeLayout(edgeList, layout);
-            } else {
-                // Some other layout -- add more conditional handling here
-                // for framelayout, tables, etc.
-            }
-        }
-    }
-
-    /**
-     * Returns the layout weight of of the given child of a LinearLayout, or 0.0 if it
-     * does not define a weight
-     */
-    private float getWeight(Element linearLayoutChild) {
-        String weight = linearLayoutChild.getAttributeNS(ANDROID_URI, ATTR_LAYOUT_WEIGHT);
-        if (weight != null && weight.length() > 0) {
-            try {
-                return Float.parseFloat(weight);
-            } catch (NumberFormatException nfe) {
-                AdtPlugin.log(nfe, "Invalid weight %1$s", weight);
-            }
-        }
-
-        return 0.0f;
-    }
-
-    /**
-     * Returns the sum of all the layout weights of the children in the given LinearLayout
-     *
-     * @param linearLayout the layout to compute the total sum for
-     * @return the total sum of all the layout weights in the given layout
-     */
-    private float getWeightSum(Element linearLayout) {
-        float sum = 0;
-        for (Element child : DomUtilities.getChildren(linearLayout)) {
-            sum += getWeight(child);
-        }
-
-        return sum;
-    }
-
-    /**
-     * Analyzes the given LinearLayout and updates the constraints to reflect
-     * relationships it can infer - based on baseline alignment, gravity, order and
-     * weights. This method also removes "0dip" as a special width/height used in
-     * LinearLayouts with weight distribution.
-     */
-    private void analyzeLinearLayout(EdgeList edgeList, Element layout) {
-        boolean isVertical = VALUE_VERTICAL.equals(layout.getAttributeNS(ANDROID_URI,
-                ATTR_ORIENTATION));
-        View baselineRef = null;
-        if (!isVertical &&
-            !VALUE_FALSE.equals(layout.getAttributeNS(ANDROID_URI, ATTR_BASELINE_ALIGNED))) {
-            // Baseline alignment. Find the tallest child and set it as the baseline reference.
-            int tallestHeight = 0;
-            View tallest = null;
-            for (Element child : DomUtilities.getChildren(layout)) {
-                View view = edgeList.getView(child);
-                if (view != null && view.getHeight() > tallestHeight) {
-                    tallestHeight = view.getHeight();
-                    tallest = view;
-                }
-            }
-            if (tallest != null) {
-                baselineRef = tallest;
-            }
-        }
-
-        float weightSum = getWeightSum(layout);
-        float cumulativeWeight = 0;
-
-        List<Element> children = DomUtilities.getChildren(layout);
-        String prevId = null;
-        boolean isFirstChild = true;
-        boolean linkBackwards = true;
-        boolean linkForwards = false;
-
-        for (int index = 0, childCount = children.size(); index < childCount; index++) {
-            Element child = children.get(index);
-
-            View childView = edgeList.getView(child);
-            if (childView == null) {
-                // Could be a nested layout that is being removed etc
-                prevId = null;
-                isFirstChild = false;
-                continue;
-            }
-
-            // Look at the layout_weight attributes and determine whether we should be
-            // attached on the bottom/right or on the top/left
-            if (weightSum > 0.0f) {
-                float weight = getWeight(child);
-
-                // We can't emulate a LinearLayout where multiple children have positive
-                // weights. However, we CAN support the common scenario where a single
-                // child has a non-zero weight, and all children after it are pushed
-                // to the end and the weighted child fills the remaining space.
-                if (cumulativeWeight == 0 && weight > 0) {
-                    // See if we have a bottom/right edge to attach the forwards link to
-                    // (at the end of the forwards chains). Only if so can we link forwards.
-                    View referenced;
-                    if (isVertical) {
-                        referenced = edgeList.getSharedBottomEdge(layout);
-                    } else {
-                        referenced = edgeList.getSharedRightEdge(layout);
-                    }
-                    if (referenced != null) {
-                        linkForwards = true;
-                    }
-                } else if (cumulativeWeight > 0) {
-                    linkBackwards = false;
-                }
-
-                cumulativeWeight += weight;
-            }
-
-            analyzeGravity(edgeList, layout, isVertical, child, childView);
-            convert0dipToWrapContent(child);
-
-            // Chain elements together in the flow direction of the linear layout
-            if (prevId != null) { // No constraint for first child
-                if (linkBackwards) {
-                    if (isVertical) {
-                        childView.addVerticalConstraint(ATTR_LAYOUT_BELOW, prevId);
-                    } else {
-                        childView.addHorizConstraint(ATTR_LAYOUT_TO_RIGHT_OF, prevId);
-                    }
-                }
-            } else if (isFirstChild) {
-                assert linkBackwards;
-
-                // First element; attach it to the parent if we can
-                if (isVertical) {
-                    View referenced = edgeList.getSharedTopEdge(layout);
-                    if (referenced != null) {
-                        if (isAncestor(referenced.getElement(), child)) {
-                            childView.addVerticalConstraint(ATTR_LAYOUT_ALIGN_PARENT_TOP,
-                                VALUE_TRUE);
-                        } else {
-                            childView.addVerticalConstraint(ATTR_LAYOUT_ALIGN_TOP,
-                                    referenced.getId());
-                        }
-                    }
-                } else {
-                    View referenced = edgeList.getSharedLeftEdge(layout);
-                    if (referenced != null) {
-                        if (isAncestor(referenced.getElement(), child)) {
-                            childView.addHorizConstraint(ATTR_LAYOUT_ALIGN_PARENT_LEFT,
-                                    VALUE_TRUE);
-                        } else {
-                            childView.addHorizConstraint(
-                                    ATTR_LAYOUT_ALIGN_LEFT, referenced.getId());
-                        }
-                    }
-                }
-            }
-
-            if (linkForwards) {
-                if (index < (childCount - 1)) {
-                    Element nextChild = children.get(index + 1);
-                    String nextId = mRefactoring.ensureHasId(mRootEdit, nextChild, null);
-                    if (nextId != null) {
-                        if (isVertical) {
-                            childView.addVerticalConstraint(ATTR_LAYOUT_ABOVE, nextId);
-                        } else {
-                            childView.addHorizConstraint(ATTR_LAYOUT_TO_LEFT_OF, nextId);
-                        }
-                    }
-                } else {
-                    // Attach to right/bottom edge of the layout
-                    if (isVertical) {
-                        View referenced = edgeList.getSharedBottomEdge(layout);
-                        if (referenced != null) {
-                            if (isAncestor(referenced.getElement(), child)) {
-                                childView.addVerticalConstraint(ATTR_LAYOUT_ALIGN_PARENT_BOTTOM,
-                                    VALUE_TRUE);
-                            } else {
-                                childView.addVerticalConstraint(ATTR_LAYOUT_ALIGN_BOTTOM,
-                                        referenced.getId());
-                            }
-                        }
-                    } else {
-                        View referenced = edgeList.getSharedRightEdge(layout);
-                        if (referenced != null) {
-                            if (isAncestor(referenced.getElement(), child)) {
-                                childView.addHorizConstraint(ATTR_LAYOUT_ALIGN_PARENT_RIGHT,
-                                        VALUE_TRUE);
-                            } else {
-                                childView.addHorizConstraint(
-                                        ATTR_LAYOUT_ALIGN_RIGHT, referenced.getId());
-                            }
-                        }
-                    }
-                }
-            }
-
-            if (baselineRef != null && baselineRef.getId() != null
-                    && !baselineRef.getId().equals(childView.getId())) {
-                assert !isVertical;
-                // Only align if they share the same gravity
-                if ((childView.getGravity() & GRAVITY_VERT_MASK) ==
-                        (baselineRef.getGravity() & GRAVITY_VERT_MASK)) {
-                    childView.addHorizConstraint(ATTR_LAYOUT_ALIGN_BASELINE, baselineRef.getId());
-                }
-            }
-
-            prevId = mRefactoring.ensureHasId(mRootEdit, child, null);
-            isFirstChild = false;
-        }
-    }
-
-    /**
-     * Checks the layout "gravity" value for the given child and updates the constraints
-     * to account for the gravity
-     */
-    private int analyzeGravity(EdgeList edgeList, Element layout, boolean isVertical,
-            Element child, View childView) {
-        // Use gravity to constrain elements in the axis orthogonal to the
-        // direction of the layout
-        int gravity = childView.getGravity();
-        if (isVertical) {
-            if ((gravity & GRAVITY_RIGHT) != 0) {
-                View referenced = edgeList.getSharedRightEdge(layout);
-                if (referenced != null) {
-                    if (isAncestor(referenced.getElement(), child)) {
-                        childView.addHorizConstraint(ATTR_LAYOUT_ALIGN_PARENT_RIGHT,
-                                VALUE_TRUE);
-                    } else {
-                        childView.addHorizConstraint(ATTR_LAYOUT_ALIGN_RIGHT,
-                                referenced.getId());
-                    }
-                }
-            } else if ((gravity & GRAVITY_CENTER_HORIZ) != 0) {
-                View referenced1 = edgeList.getSharedLeftEdge(layout);
-                View referenced2 = edgeList.getSharedRightEdge(layout);
-                if (referenced1 != null && referenced2 == referenced1) {
-                    if (isAncestor(referenced1.getElement(), child)) {
-                        childView.addHorizConstraint(ATTR_LAYOUT_CENTER_HORIZONTAL,
-                                VALUE_TRUE);
-                    }
-                }
-            } else if ((gravity & GRAVITY_FILL_HORIZ) != 0) {
-                View referenced1 = edgeList.getSharedLeftEdge(layout);
-                View referenced2 = edgeList.getSharedRightEdge(layout);
-                if (referenced1 != null && referenced2 == referenced1) {
-                    if (isAncestor(referenced1.getElement(), child)) {
-                        childView.addHorizConstraint(ATTR_LAYOUT_ALIGN_PARENT_LEFT,
-                                VALUE_TRUE);
-                        childView.addHorizConstraint(ATTR_LAYOUT_ALIGN_PARENT_RIGHT,
-                                VALUE_TRUE);
-                    } else {
-                        childView.addHorizConstraint(ATTR_LAYOUT_ALIGN_LEFT,
-                                referenced1.getId());
-                        childView.addHorizConstraint(ATTR_LAYOUT_ALIGN_RIGHT,
-                                referenced2.getId());
-                    }
-                }
-            } else if ((gravity & GRAVITY_LEFT) != 0) {
-                View referenced = edgeList.getSharedLeftEdge(layout);
-                if (referenced != null) {
-                    if (isAncestor(referenced.getElement(), child)) {
-                        childView.addHorizConstraint(ATTR_LAYOUT_ALIGN_PARENT_LEFT,
-                                VALUE_TRUE);
-                    } else {
-                        childView.addHorizConstraint(ATTR_LAYOUT_ALIGN_LEFT,
-                                referenced.getId());
-                    }
-                }
-            }
-        } else {
-            // Handle horizontal layout: perform vertical gravity attachments
-            if ((gravity & GRAVITY_BOTTOM) != 0) {
-                View referenced = edgeList.getSharedBottomEdge(layout);
-                if (referenced != null) {
-                    if (isAncestor(referenced.getElement(), child)) {
-                        childView.addVerticalConstraint(ATTR_LAYOUT_ALIGN_PARENT_BOTTOM,
-                                VALUE_TRUE);
-                    } else {
-                        childView.addVerticalConstraint(ATTR_LAYOUT_ALIGN_BOTTOM,
-                                referenced.getId());
-                    }
-                }
-            } else if ((gravity & GRAVITY_CENTER_VERT) != 0) {
-                View referenced1 = edgeList.getSharedTopEdge(layout);
-                View referenced2 = edgeList.getSharedBottomEdge(layout);
-                if (referenced1 != null && referenced2 == referenced1) {
-                    if (isAncestor(referenced1.getElement(), child)) {
-                        childView.addVerticalConstraint(ATTR_LAYOUT_CENTER_VERTICAL,
-                                VALUE_TRUE);
-                    }
-                }
-            } else if ((gravity & GRAVITY_FILL_VERT) != 0) {
-                View referenced1 = edgeList.getSharedTopEdge(layout);
-                View referenced2 = edgeList.getSharedBottomEdge(layout);
-                if (referenced1 != null && referenced2 == referenced1) {
-                    if (isAncestor(referenced1.getElement(), child)) {
-                        childView.addVerticalConstraint(ATTR_LAYOUT_ALIGN_PARENT_TOP,
-                                VALUE_TRUE);
-                        childView.addVerticalConstraint(ATTR_LAYOUT_ALIGN_PARENT_BOTTOM,
-                                VALUE_TRUE);
-                    } else {
-                        childView.addVerticalConstraint(ATTR_LAYOUT_ALIGN_TOP,
-                                referenced1.getId());
-                        childView.addVerticalConstraint(ATTR_LAYOUT_ALIGN_BOTTOM,
-                                referenced2.getId());
-                    }
-                }
-            } else if ((gravity & GRAVITY_TOP) != 0) {
-                View referenced = edgeList.getSharedTopEdge(layout);
-                if (referenced != null) {
-                    if (isAncestor(referenced.getElement(), child)) {
-                        childView.addVerticalConstraint(ATTR_LAYOUT_ALIGN_PARENT_TOP,
-                                VALUE_TRUE);
-                    } else {
-                        childView.addVerticalConstraint(ATTR_LAYOUT_ALIGN_TOP,
-                                referenced.getId());
-                    }
-                }
-            }
-        }
-        return gravity;
-    }
-
-    /** Converts 0dip values in layout_width and layout_height to wrap_content instead */
-    private void convert0dipToWrapContent(Element child) {
-        // Must convert layout_height="0dip" to layout_height="wrap_content".
-        // 0dip is a special trick used in linear layouts in the presence of
-        // weights where 0dip ensures that the height of the view is not taken
-        // into account when distributing the weights. However, when converted
-        // to RelativeLayout this will instead cause the view to actually be assigned
-        // 0 height.
-        String height = child.getAttributeNS(ANDROID_URI, ATTR_LAYOUT_HEIGHT);
-        // 0dip, 0dp, 0px, etc
-        if (height != null && height.startsWith("0")) { //$NON-NLS-1$
-            mRefactoring.setAttribute(mRootEdit, child, ANDROID_URI,
-                    mRefactoring.getAndroidNamespacePrefix(), ATTR_LAYOUT_HEIGHT,
-                    VALUE_WRAP_CONTENT);
-        }
-        String width = child.getAttributeNS(ANDROID_URI, ATTR_LAYOUT_WIDTH);
-        if (width != null && width.startsWith("0")) { //$NON-NLS-1$
-            mRefactoring.setAttribute(mRootEdit, child, ANDROID_URI,
-                    mRefactoring.getAndroidNamespacePrefix(), ATTR_LAYOUT_WIDTH,
-                    VALUE_WRAP_CONTENT);
-        }
-    }
-
-    /**
-     * Analyzes an embedded RelativeLayout within a layout hierarchy and updates the
-     * constraints in the EdgeList with those relationships which can continue in the
-     * outer single RelativeLayout.
-     */
-    private void analyzeRelativeLayout(EdgeList edgeList, Element layout) {
-        NodeList children = layout.getChildNodes();
-        for (int i = 0, n = children.getLength(); i < n; i++) {
-            Node node = children.item(i);
-            if (node.getNodeType() == Node.ELEMENT_NODE) {
-                Element child = (Element) node;
-                View childView = edgeList.getView(child);
-                if (childView == null) {
-                    // Could be a nested layout that is being removed etc
-                    continue;
-                }
-
-                NamedNodeMap attributes = child.getAttributes();
-                for (int j = 0, m = attributes.getLength(); j < m; j++) {
-                    Attr attribute = (Attr) attributes.item(j);
-                    String name = attribute.getLocalName();
-                    String value = attribute.getValue();
-                    if (name.equals(ATTR_LAYOUT_WIDTH)
-                            || name.equals(ATTR_LAYOUT_HEIGHT)) {
-                        // Ignore these for now
-                    } else if (name.startsWith(ATTR_LAYOUT_RESOURCE_PREFIX)
-                            && ANDROID_URI.equals(attribute.getNamespaceURI())) {
-                        // Determine if the reference is to a known edge
-                        String id = getIdBasename(value);
-                        if (id != null) {
-                            View referenced = edgeList.getView(id);
-                            if (referenced != null) {
-                                // This is a valid reference, so preserve
-                                // the attribute
-                                if (name.equals(ATTR_LAYOUT_BELOW) ||
-                                        name.equals(ATTR_LAYOUT_ABOVE) ||
-                                        name.equals(ATTR_LAYOUT_ALIGN_TOP) ||
-                                        name.equals(ATTR_LAYOUT_ALIGN_BOTTOM) ||
-                                        name.equals(ATTR_LAYOUT_ALIGN_BASELINE)) {
-                                    // Vertical constraint
-                                    childView.addVerticalConstraint(name, value);
-                                } else if (name.equals(ATTR_LAYOUT_ALIGN_LEFT) ||
-                                        name.equals(ATTR_LAYOUT_TO_LEFT_OF) ||
-                                        name.equals(ATTR_LAYOUT_TO_RIGHT_OF) ||
-                                        name.equals(ATTR_LAYOUT_ALIGN_RIGHT)) {
-                                    // Horizontal constraint
-                                    childView.addHorizConstraint(name, value);
-                                } else {
-                                    // We don't expect this
-                                    assert false : name;
-                                }
-                            } else {
-                                // Reference to some layout that is not included here.
-                                // TODO: See if the given layout has an edge
-                                // that corresponds to one of our known views
-                                // so we can adjust the constraints and keep it after all.
-                            }
-                        } else {
-                            // It's a parent-relative constraint (such
-                            // as aligning with a parent edge, or centering
-                            // in the parent view)
-                            boolean remove = true;
-                            if (name.equals(ATTR_LAYOUT_ALIGN_PARENT_LEFT)) {
-                                View referenced = edgeList.getSharedLeftEdge(layout);
-                                if (referenced != null) {
-                                    if (isAncestor(referenced.getElement(), child)) {
-                                        childView.addHorizConstraint(name, VALUE_TRUE);
-                                    } else {
-                                        childView.addHorizConstraint(
-                                                ATTR_LAYOUT_ALIGN_LEFT, referenced.getId());
-                                    }
-                                    remove = false;
-                                }
-                            } else if (name.equals(ATTR_LAYOUT_ALIGN_PARENT_RIGHT)) {
-                                View referenced = edgeList.getSharedRightEdge(layout);
-                                if (referenced != null) {
-                                    if (isAncestor(referenced.getElement(), child)) {
-                                        childView.addHorizConstraint(name, VALUE_TRUE);
-                                    } else {
-                                        childView.addHorizConstraint(
-                                            ATTR_LAYOUT_ALIGN_RIGHT, referenced.getId());
-                                    }
-                                    remove = false;
-                                }
-                            } else if (name.equals(ATTR_LAYOUT_ALIGN_PARENT_TOP)) {
-                                View referenced = edgeList.getSharedTopEdge(layout);
-                                if (referenced != null) {
-                                    if (isAncestor(referenced.getElement(), child)) {
-                                        childView.addVerticalConstraint(name, VALUE_TRUE);
-                                    } else {
-                                        childView.addVerticalConstraint(ATTR_LAYOUT_ALIGN_TOP,
-                                                referenced.getId());
-                                    }
-                                    remove = false;
-                                }
-                            } else if (name.equals(ATTR_LAYOUT_ALIGN_PARENT_BOTTOM)) {
-                                View referenced = edgeList.getSharedBottomEdge(layout);
-                                if (referenced != null) {
-                                    if (isAncestor(referenced.getElement(), child)) {
-                                        childView.addVerticalConstraint(name, VALUE_TRUE);
-                                    } else {
-                                        childView.addVerticalConstraint(ATTR_LAYOUT_ALIGN_BOTTOM,
-                                                referenced.getId());
-                                    }
-                                    remove = false;
-                                }
-                            }
-
-                            boolean alignWithParent =
-                                    name.equals(ATTR_LAYOUT_ALIGN_WITH_PARENT_MISSING);
-                            if (remove && alignWithParent) {
-                                // TODO - look for this one AFTER we have processed
-                                // everything else, and then set constraints as necessary
-                                // IF there are no other conflicting constraints!
-                            }
-
-                            // Otherwise it's some kind of centering which we don't support
-                            // yet.
-
-                            // TODO: Find a way to determine whether we have
-                            // a corresponding edge for the parent (e.g. if
-                            // the ViewInfo bounds match our outer parent or
-                            // some other edge) and if so, substitute for that
-                            // id.
-                            // For example, if this element was centered
-                            // horizontally in a RelativeLayout that actually
-                            // occupies the entire width of our outer layout,
-                            // then it can be preserved after all!
-
-                            if (remove) {
-                                if (name.startsWith("layout_margin")) { //$NON-NLS-1$
-                                    continue;
-                                }
-
-                                // Remove unknown attributes?
-                                // It's too early to do this, because we may later want
-                                // to *set* this value and it would result in an overlapping edits
-                                // exception. Therefore, we need to RECORD which attributes should
-                                // be removed, which lines should have its indentation adjusted
-                                // etc and finally process it all at the end!
-                                //mRefactoring.removeAttribute(mRootEdit, child,
-                                //        attribute.getNamespaceURI(), name);
-                            }
-                        }
-                    }
-                }
-            }
-        }
-    }
-
-    /**
-     * Given {@code @id/foo} or {@code @+id/foo}, returns foo. Note that given foo it will
-     * return null.
-     */
-    private static String getIdBasename(String id) {
-        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 null;
-    }
-
-    /** Returns true if the given second argument is a descendant of the first argument */
-    private static boolean isAncestor(Node ancestor, Node node) {
-        while (node != null) {
-            if (node == ancestor) {
-                return true;
-            }
-            node = node.getParentNode();
-        }
-        return false;
-    }
-
-    /**
-     * Computes horizontal constraints for the views in the grid for any remaining views
-     * that do not have constraints (as the result of the analysis of known layouts). This
-     * will look at the rendered layout coordinates and attempt to connect elements based
-     * on a spatial layout in the grid.
-     */
-    private void computeHorizontalConstraints(Grid grid) {
-        int columns = grid.getColumns();
-
-        String attachLeftProperty = ATTR_LAYOUT_ALIGN_PARENT_LEFT;
-        String attachLeftValue = VALUE_TRUE;
-        int marginLeft = 0;
-        for (int col = 0; col < columns; col++) {
-            if (!grid.colContainsTopLeftCorner(col)) {
-                // Just accumulate margins for the next column
-                marginLeft += grid.getColumnWidth(col);
-            } else {
-                // Add horizontal attachments
-                String firstId = null;
-                for (View view : grid.viewsStartingInCol(col, true)) {
-                    assert view.getId() != null;
-                    if (firstId == null) {
-                        firstId = view.getId();
-                        if (view.isConstrainedHorizontally()) {
-                            // Nothing to do -- we already have an accurate position for
-                            // this view
-                        } else if (attachLeftProperty != null) {
-                            view.addHorizConstraint(attachLeftProperty, attachLeftValue);
-                            if (marginLeft > 0) {
-                                view.addHorizConstraint(ATTR_LAYOUT_MARGIN_LEFT,
-                                        String.format(VALUE_N_DP, marginLeft));
-                                marginLeft = 0;
-                            }
-                        } else {
-                            assert false;
-                        }
-                    } else if (!view.isConstrainedHorizontally()) {
-                        view.addHorizConstraint(ATTR_LAYOUT_ALIGN_LEFT, firstId);
-                    }
-                }
-            }
-
-            // Figure out edge for the next column
-            View view = grid.findRightEdgeView(col);
-            if (view != null) {
-                assert view.getId() != null;
-                attachLeftProperty = ATTR_LAYOUT_TO_RIGHT_OF;
-                attachLeftValue = view.getId();
-
-                marginLeft = 0;
-            } else if (marginLeft == 0) {
-                marginLeft = grid.getColumnWidth(col);
-            }
-        }
-    }
-
-    /**
-     * Performs vertical layout just like the {@link #computeHorizontalConstraints} method
-     * did horizontally
-     */
-    private void computeVerticalConstraints(Grid grid) {
-        int rows = grid.getRows();
-
-        String attachTopProperty = ATTR_LAYOUT_ALIGN_PARENT_TOP;
-        String attachTopValue = VALUE_TRUE;
-        int marginTop = 0;
-        for (int row = 0; row < rows; row++) {
-            if (!grid.rowContainsTopLeftCorner(row)) {
-                // Just accumulate margins for the next column
-                marginTop += grid.getRowHeight(row);
-            } else {
-                // Add horizontal attachments
-                String firstId = null;
-                for (View view : grid.viewsStartingInRow(row, true)) {
-                    assert view.getId() != null;
-                    if (firstId == null) {
-                        firstId = view.getId();
-                        if (view.isConstrainedVertically()) {
-                            // Nothing to do -- we already have an accurate position for
-                            // this view
-                        } else if (attachTopProperty != null) {
-                            view.addVerticalConstraint(attachTopProperty, attachTopValue);
-                            if (marginTop > 0) {
-                                view.addVerticalConstraint(ATTR_LAYOUT_MARGIN_TOP,
-                                        String.format(VALUE_N_DP, marginTop));
-                                marginTop = 0;
-                            }
-                        } else {
-                            assert false;
-                        }
-                    } else if (!view.isConstrainedVertically()) {
-                        view.addVerticalConstraint(ATTR_LAYOUT_ALIGN_TOP, firstId);
-                    }
-                }
-            }
-
-            // Figure out edge for the next row
-            View view = grid.findBottomEdgeView(row);
-            if (view != null) {
-                assert view.getId() != null;
-                attachTopProperty = ATTR_LAYOUT_BELOW;
-                attachTopValue = view.getId();
-                marginTop = 0;
-            } else if (marginTop == 0) {
-                marginTop = grid.getRowHeight(row);
-            }
-        }
-    }
-
-    /**
-     * Searches a view hierarchy and locates the {@link CanvasViewInfo} for the given
-     * {@link Element}
-     *
-     * @param info the root {@link CanvasViewInfo} to search below
-     * @param element the target element
-     * @return the {@link CanvasViewInfo} which corresponds to the given element
-     */
-    private CanvasViewInfo findViewForElement(CanvasViewInfo info, Element element) {
-        if (getElement(info) == element) {
-            return info;
-        }
-
-        for (CanvasViewInfo child : info.getChildren()) {
-            CanvasViewInfo result = findViewForElement(child, element);
-            if (result != null) {
-                return result;
-            }
-        }
-
-        return null;
-    }
-
-    /** Returns the {@link Element} for the given {@link CanvasViewInfo} */
-    private static Element getElement(CanvasViewInfo info) {
-        Node node = info.getUiViewNode().getXmlNode();
-        if (node instanceof Element) {
-            return (Element) node;
-        }
-
-        return null;
-    }
-
-    /**
-     * A grid of cells which can contain views, used to infer spatial relationships when
-     * computing constraints. Note that a view can appear in than one cell; they will
-     * appear in all cells that their bounds overlap with!
-     */
-    private class Grid {
-        private final int[] mLeft;
-        private final int[] mTop;
-        // A list from row to column to cell, where a cell is a list of views
-        private final List<List<List<View>>> mRowList;
-        private int mRowCount;
-        private int mColCount;
-
-        Grid(List<View> views, int[] left, int[] top) {
-            mLeft = left;
-            mTop = top;
-
-            // The left/top arrays should include the ending point too
-            mColCount = left.length - 1;
-            mRowCount = top.length - 1;
-
-            // Using nested lists rather than arrays to avoid lack of typed arrays
-            // (can't create List<View>[row][column] arrays)
-            mRowList = new ArrayList<List<List<View>>>(top.length);
-            for (int row = 0; row < top.length; row++) {
-                List<List<View>> columnList = new ArrayList<List<View>>(left.length);
-                for (int col = 0; col < left.length; col++) {
-                    columnList.add(new ArrayList<View>(4));
-                }
-                mRowList.add(columnList);
-            }
-
-            for (View view : views) {
-                // Get rid of the root view; we don't want that in the attachments logic;
-                // it was there originally such that it would contribute the outermost
-                // edges.
-                if (view.mElement == mLayout) {
-                    continue;
-                }
-
-                for (int i = 0; i < view.mRowSpan; i++) {
-                    for (int j = 0; j < view.mColSpan; j++) {
-                        mRowList.get(view.mRow + i).get(view.mCol + j).add(view);
-                    }
-                }
-            }
-        }
-
-        /**
-         * Returns the number of rows in the grid
-         *
-         * @return the row count
-         */
-        public int getRows() {
-            return mRowCount;
-        }
-
-        /**
-         * Returns the number of columns in the grid
-         *
-         * @return the column count
-         */
-        public int getColumns() {
-            return mColCount;
-        }
-
-        /**
-         * Returns the list of views overlapping the given cell
-         *
-         * @param row the row of the target cell
-         * @param col the column of the target cell
-         * @return a list of views overlapping the given column
-         */
-        public List<View> get(int row, int col) {
-            return mRowList.get(row).get(col);
-        }
-
-        /**
-         * Returns true if the given column contains a top left corner of a view
-         *
-         * @param column the column to check
-         * @return true if one or more views have their top left corner in this column
-         */
-        public boolean colContainsTopLeftCorner(int column) {
-            for (int row = 0; row < mRowCount; row++) {
-                View view = getTopLeftCorner(row, column);
-                if (view != null) {
-                    return true;
-                }
-            }
-
-            return false;
-        }
-
-        /**
-         * Returns true if the given row contains a top left corner of a view
-         *
-         * @param row the row to check
-         * @return true if one or more views have their top left corner in this row
-         */
-        public boolean rowContainsTopLeftCorner(int row) {
-            for (int col = 0; col < mColCount; col++) {
-                View view = getTopLeftCorner(row, col);
-                if (view != null) {
-                    return true;
-                }
-            }
-
-            return false;
-        }
-
-        /**
-         * Returns a list of views (optionally sorted by increasing row index) that have
-         * their left edge starting in the given column
-         *
-         * @param col the column to look up views for
-         * @param sort whether to sort the result in increasing row order
-         * @return a list of views starting in the given column
-         */
-        public List<View> viewsStartingInCol(int col, boolean sort) {
-            List<View> views = new ArrayList<View>();
-            for (int row = 0; row < mRowCount; row++) {
-                View view = getTopLeftCorner(row, col);
-                if (view != null) {
-                    views.add(view);
-                }
-            }
-
-            if (sort) {
-                View.sortByRow(views);
-            }
-
-            return views;
-        }
-
-        /**
-         * Returns a list of views (optionally sorted by increasing column index) that have
-         * their top edge starting in the given row
-         *
-         * @param row the row to look up views for
-         * @param sort whether to sort the result in increasing column order
-         * @return a list of views starting in the given row
-         */
-        public List<View> viewsStartingInRow(int row, boolean sort) {
-            List<View> views = new ArrayList<View>();
-            for (int col = 0; col < mColCount; col++) {
-                View view = getTopLeftCorner(row, col);
-                if (view != null) {
-                    views.add(view);
-                }
-            }
-
-            if (sort) {
-                View.sortByColumn(views);
-            }
-
-            return views;
-        }
-
-        /**
-         * Returns the pixel width of the given column
-         *
-         * @param col the column to look up the width of
-         * @return the width of the column
-         */
-        public int getColumnWidth(int col) {
-            return mLeft[col + 1] - mLeft[col];
-        }
-
-        /**
-         * Returns the pixel height of the given row
-         *
-         * @param row the row to look up the height of
-         * @return the height of the row
-         */
-        public int getRowHeight(int row) {
-            return mTop[row + 1] - mTop[row];
-        }
-
-        /**
-         * Returns the first view found that has its top left corner in the cell given by
-         * the row and column indexes, or null if not found.
-         *
-         * @param row the row of the target cell
-         * @param col the column of the target cell
-         * @return a view with its top left corner in the given cell, or null if not found
-         */
-        View getTopLeftCorner(int row, int col) {
-            List<View> views = get(row, col);
-            if (views.size() > 0) {
-                for (View view : views) {
-                    if (view.mRow == row && view.mCol == col) {
-                        return view;
-                    }
-                }
-            }
-
-            return null;
-        }
-
-        public View findRightEdgeView(int col) {
-            for (int row = 0; row < mRowCount; row++) {
-                List<View> views = get(row, col);
-                if (views.size() > 0) {
-                    List<View> result = new ArrayList<View>();
-                    for (View view : views) {
-                        // Ends on the right edge of this column?
-                        if (view.mCol + view.mColSpan == col + 1) {
-                            result.add(view);
-                        }
-                    }
-                    if (result.size() > 1) {
-                        View.sortByColumn(result);
-                    }
-                    if (result.size() > 0) {
-                        return result.get(0);
-                    }
-                }
-            }
-
-            return null;
-        }
-
-        public View findBottomEdgeView(int row) {
-            for (int col = 0; col < mColCount; col++) {
-                List<View> views = get(row, col);
-                if (views.size() > 0) {
-                    List<View> result = new ArrayList<View>();
-                    for (View view : views) {
-                        // Ends on the bottom edge of this column?
-                        if (view.mRow + view.mRowSpan == row + 1) {
-                            result.add(view);
-                        }
-                    }
-                    if (result.size() > 1) {
-                        View.sortByRow(result);
-                    }
-                    if (result.size() > 0) {
-                        return result.get(0);
-                    }
-
-                }
-            }
-
-            return null;
-        }
-
-        /**
-         * Produces a display of view contents along with the pixel positions of each row/column,
-         * like the following (used for diagnostics only)
-         * <pre>
-         *          |0                  |49                 |143                |192           |240
-         *        36|                   |                   |button2            |
-         *        72|                   |radioButton1       |button2            |
-         *        74|button1            |radioButton1       |button2            |
-         *       108|button1            |                   |button2            |
-         *       110|                   |                   |button2            |
-         *       149|                   |                   |                   |
-         *       320
-         * </pre>
-         */
-        @Override
-        public String toString() {
-            // Dump out the view table
-            int cellWidth = 20;
-
-            StringWriter stringWriter = new StringWriter();
-            PrintWriter out = new PrintWriter(stringWriter);
-            out.printf("%" + cellWidth + "s", ""); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-            for (int col = 0; col < mColCount + 1; col++) {
-                out.printf("|%-" + (cellWidth - 1) + "d", mLeft[col]); //$NON-NLS-1$ //$NON-NLS-2$
-            }
-            out.printf("\n"); //$NON-NLS-1$
-            for (int row = 0; row < mRowCount + 1; row++) {
-                out.printf("%" + cellWidth + "d", mTop[row]); //$NON-NLS-1$ //$NON-NLS-2$
-                if (row == mRowCount) {
-                    break;
-                }
-                for (int col = 0; col < mColCount; col++) {
-                    List<View> views = get(row, col);
-                    StringBuilder sb = new StringBuilder();
-                    for (View view : views) {
-                        String id = view != null ? view.getId() : ""; //$NON-NLS-1$
-                        if (id.startsWith(NEW_ID_PREFIX)) {
-                            id = id.substring(NEW_ID_PREFIX.length());
-                        }
-                        if (id.length() > cellWidth - 2) {
-                            id = id.substring(0, cellWidth - 2);
-                        }
-                        if (sb.length() > 0) {
-                            sb.append(',');
-                        }
-                        sb.append(id);
-                    }
-                    String cellString = sb.toString();
-                    if (cellString.contains(",") && cellString.length() > cellWidth - 2) { //$NON-NLS-1$
-                        cellString = cellString.substring(0, cellWidth - 6) + "...,"; //$NON-NLS-1$
-                    }
-                    out.printf("|%-" + (cellWidth - 2) + "s ", cellString); //$NON-NLS-1$ //$NON-NLS-2$
-                }
-                out.printf("\n"); //$NON-NLS-1$
-            }
-
-            out.flush();
-            return stringWriter.toString();
-        }
-    }
-
-    /** Holds layout information about an individual view. */
-    private static class View {
-        private final Element mElement;
-        private int mRow = -1;
-        private int mCol = -1;
-        private int mRowSpan = -1;
-        private int mColSpan = -1;
-        private CanvasViewInfo mInfo;
-        private String mId;
-        private List<Pair<String, String>> mHorizConstraints =
-            new ArrayList<Pair<String, String>>(4);
-        private List<Pair<String, String>> mVerticalConstraints =
-            new ArrayList<Pair<String, String>>(4);
-        private int mGravity;
-
-        public View(CanvasViewInfo view, Element element) {
-            mInfo = view;
-            mElement = element;
-            mGravity = GravityHelper.getGravity(element);
-        }
-
-        public int getHeight() {
-            return mInfo.getAbsRect().height;
-        }
-
-        public int getGravity() {
-            return mGravity;
-        }
-
-        public String getId() {
-            return mId;
-        }
-
-        public Element getElement() {
-            return mElement;
-        }
-
-        public List<Pair<String, String>> getHorizConstraints() {
-            return mHorizConstraints;
-        }
-
-        public List<Pair<String, String>> getVerticalConstraints() {
-            return mVerticalConstraints;
-        }
-
-        public boolean isConstrainedHorizontally() {
-            return mHorizConstraints.size() > 0;
-        }
-
-        public boolean isConstrainedVertically() {
-            return mVerticalConstraints.size() > 0;
-        }
-
-        public void addHorizConstraint(String property, String value) {
-            assert property != null && value != null;
-            // TODO - look for duplicates?
-            mHorizConstraints.add(Pair.of(property, value));
-        }
-
-        public void addVerticalConstraint(String property, String value) {
-            assert property != null && value != null;
-            mVerticalConstraints.add(Pair.of(property, value));
-        }
-
-        public int getLeftEdge() {
-            return mInfo.getAbsRect().x;
-        }
-
-        public int getTopEdge() {
-            return mInfo.getAbsRect().y;
-        }
-
-        public int getRightEdge() {
-            Rectangle bounds = mInfo.getAbsRect();
-            // +1: make the bounds overlap, so the right edge is the same as the
-            // left edge of the neighbor etc. Otherwise we end up with lots of 1-pixel wide
-            // columns between adjacent items.
-            return bounds.x + bounds.width + 1;
-        }
-
-        public int getBottomEdge() {
-            Rectangle bounds = mInfo.getAbsRect();
-            return bounds.y + bounds.height + 1;
-        }
-
-        @Override
-        public String toString() {
-            return "View [mId=" + mId + "]"; //$NON-NLS-1$ //$NON-NLS-2$
-        }
-
-        public static void sortByRow(List<View> views) {
-            Collections.sort(views, new ViewComparator(true/*rowSort*/));
-        }
-
-        public static void sortByColumn(List<View> views) {
-            Collections.sort(views, new ViewComparator(false/*rowSort*/));
-        }
-
-        /** Comparator to help sort views by row or column index */
-        private static class ViewComparator implements Comparator<View> {
-            boolean mRowSort;
-
-            public ViewComparator(boolean rowSort) {
-                mRowSort = rowSort;
-            }
-
-            @Override
-            public int compare(View view1, View view2) {
-                if (mRowSort) {
-                    return view1.mRow - view2.mRow;
-                } else {
-                    return view1.mCol - view2.mCol;
-                }
-            }
-        }
-    }
-
-    /**
-     * An edge list takes a hierarchy of elements and records the bounds of each element
-     * into various lists such that it can answer queries about shared edges, about which
-     * particular pixels occur as a boundary edge, etc.
-     */
-    private class EdgeList {
-        private final Map<Element, View> mElementToViewMap = new HashMap<Element, View>(100);
-        private final Map<String, View> mIdToViewMap = new HashMap<String, View>(100);
-        private final Map<Integer, List<View>> mLeft = new HashMap<Integer, List<View>>();
-        private final Map<Integer, List<View>> mTop = new HashMap<Integer, List<View>>();
-        private final Map<Integer, List<View>> mRight = new HashMap<Integer, List<View>>();
-        private final Map<Integer, List<View>> mBottom = new HashMap<Integer, List<View>>();
-        private final Map<Element, Element> mSharedLeftEdge = new HashMap<Element, Element>();
-        private final Map<Element, Element> mSharedTopEdge = new HashMap<Element, Element>();
-        private final Map<Element, Element> mSharedRightEdge = new HashMap<Element, Element>();
-        private final Map<Element, Element> mSharedBottomEdge = new HashMap<Element, Element>();
-        private final List<Element> mDelete = new ArrayList<Element>();
-
-        EdgeList(CanvasViewInfo view) {
-            analyze(view, true);
-            mDelete.remove(getElement(view));
-        }
-
-        public void setIdAttributeValue(View view, String id) {
-            assert id.startsWith(NEW_ID_PREFIX) || id.startsWith(ID_PREFIX);
-            view.mId = id;
-            mIdToViewMap.put(getIdBasename(id), view);
-        }
-
-        public View getView(Element element) {
-            return mElementToViewMap.get(element);
-        }
-
-        public View getView(String id) {
-            return mIdToViewMap.get(id);
-        }
-
-        public List<View> getTopEdgeViews(Integer topOffset) {
-            return mTop.get(topOffset);
-        }
-
-        public List<View> getLeftEdgeViews(Integer leftOffset) {
-            return mLeft.get(leftOffset);
-        }
-
-        void record(Map<Integer, List<View>> map, Integer edge, View info) {
-            List<View> list = map.get(edge);
-            if (list == null) {
-                list = new ArrayList<View>();
-                map.put(edge, list);
-            }
-            list.add(info);
-        }
-
-        private List<Integer> getOffsets(Set<Integer> first, Set<Integer> second) {
-            Set<Integer> joined = new HashSet<Integer>(first.size() + second.size());
-            joined.addAll(first);
-            joined.addAll(second);
-            List<Integer> unique = new ArrayList<Integer>(joined);
-            Collections.sort(unique);
-
-            return unique;
-        }
-
-        public List<Element> getDeletedElements() {
-            return mDelete;
-        }
-
-        public List<Integer> getColumnOffsets() {
-            return getOffsets(mLeft.keySet(), mRight.keySet());
-        }
-        public List<Integer> getRowOffsets() {
-            return getOffsets(mTop.keySet(), mBottom.keySet());
-        }
-
-        private View analyze(CanvasViewInfo view, boolean isRoot) {
-            View added = null;
-            if (!mFlatten || !isRemovableLayout(view)) {
-                added = add(view);
-                if (!isRoot) {
-                    return added;
-                }
-            } else {
-                mDelete.add(getElement(view));
-            }
-
-            Element parentElement = getElement(view);
-            Rectangle parentBounds = view.getAbsRect();
-
-            // Build up a table model of the view
-            for (CanvasViewInfo child : view.getChildren()) {
-                Rectangle childBounds = child.getAbsRect();
-                Element childElement = getElement(child);
-
-                // See if this view shares the edge with the removed
-                // parent layout, and if so, record that such that we can
-                // later handle attachments to the removed parent edges
-                if (parentBounds.x == childBounds.x) {
-                    mSharedLeftEdge.put(childElement, parentElement);
-                }
-                if (parentBounds.y == childBounds.y) {
-                    mSharedTopEdge.put(childElement, parentElement);
-                }
-                if (parentBounds.x + parentBounds.width == childBounds.x + childBounds.width) {
-                    mSharedRightEdge.put(childElement, parentElement);
-                }
-                if (parentBounds.y + parentBounds.height == childBounds.y + childBounds.height) {
-                    mSharedBottomEdge.put(childElement, parentElement);
-                }
-
-                if (mFlatten && isRemovableLayout(child)) {
-                    // When flattening, we want to disregard all layouts and instead
-                    // add their children!
-                    for (CanvasViewInfo childView : child.getChildren()) {
-                        analyze(childView, false);
-
-                        Element childViewElement = getElement(childView);
-                        Rectangle childViewBounds = childView.getAbsRect();
-
-                        // See if this view shares the edge with the removed
-                        // parent layout, and if so, record that such that we can
-                        // later handle attachments to the removed parent edges
-                        if (parentBounds.x == childViewBounds.x) {
-                            mSharedLeftEdge.put(childViewElement, parentElement);
-                        }
-                        if (parentBounds.y == childViewBounds.y) {
-                            mSharedTopEdge.put(childViewElement, parentElement);
-                        }
-                        if (parentBounds.x + parentBounds.width == childViewBounds.x
-                                + childViewBounds.width) {
-                            mSharedRightEdge.put(childViewElement, parentElement);
-                        }
-                        if (parentBounds.y + parentBounds.height == childViewBounds.y
-                                + childViewBounds.height) {
-                            mSharedBottomEdge.put(childViewElement, parentElement);
-                        }
-                    }
-                    mDelete.add(childElement);
-                } else {
-                    analyze(child, false);
-                }
-            }
-
-            return added;
-        }
-
-        public View getSharedLeftEdge(Element element) {
-            return getSharedEdge(element, mSharedLeftEdge);
-        }
-
-        public View getSharedRightEdge(Element element) {
-            return getSharedEdge(element, mSharedRightEdge);
-        }
-
-        public View getSharedTopEdge(Element element) {
-            return getSharedEdge(element, mSharedTopEdge);
-        }
-
-        public View getSharedBottomEdge(Element element) {
-            return getSharedEdge(element, mSharedBottomEdge);
-        }
-
-        private View getSharedEdge(Element element, Map<Element, Element> sharedEdgeMap) {
-            Element original = element;
-
-            while (element != null) {
-                View view = getView(element);
-                if (view != null) {
-                    assert isAncestor(element, original);
-                    return view;
-                }
-                element = sharedEdgeMap.get(element);
-            }
-
-            return null;
-        }
-
-        private View add(CanvasViewInfo info) {
-            Rectangle bounds = info.getAbsRect();
-            Element element = getElement(info);
-            View view = new View(info, element);
-            mElementToViewMap.put(element, view);
-            record(mLeft, Integer.valueOf(bounds.x), view);
-            record(mTop, Integer.valueOf(bounds.y), view);
-            record(mRight, Integer.valueOf(view.getRightEdge()), view);
-            record(mBottom, Integer.valueOf(view.getBottomEdge()), view);
-            return view;
-        }
-
-        /**
-         * Returns true if the given {@link CanvasViewInfo} represents an element we
-         * should remove in a flattening conversion. We don't want to remove non-layout
-         * views, or layout views that for example contain drawables on their own.
-         */
-        private boolean isRemovableLayout(CanvasViewInfo child) {
-            // The element being converted is NOT removable!
-            Element element = getElement(child);
-            if (element == mLayout) {
-                return false;
-            }
-
-            ElementDescriptor descriptor = child.getUiViewNode().getDescriptor();
-            String name = descriptor.getXmlLocalName();
-            if (name.equals(LINEAR_LAYOUT) || name.equals(RELATIVE_LAYOUT)) {
-                // Don't delete layouts that provide a background image or gradient
-                if (element.hasAttributeNS(ANDROID_URI, ATTR_BACKGROUND)) {
-                    AdtPlugin.log(IStatus.WARNING,
-                            "Did not flatten layout %1$s because it defines a '%2$s' attribute",
-                            VisualRefactoring.getId(element), ATTR_BACKGROUND);
-                    return false;
-                }
-
-                return true;
-            }
-
-            return false;
-        }
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/UnwrapAction.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/UnwrapAction.java
deleted file mode 100644
index 02c2a27..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/UnwrapAction.java
+++ /dev/null
@@ -1,47 +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.eclipse.adt.internal.editors.layout.refactoring;
-
-import com.android.ide.eclipse.adt.internal.editors.layout.LayoutEditorDelegate;
-
-import org.eclipse.jface.action.IAction;
-import org.eclipse.ltk.ui.refactoring.RefactoringWizard;
-import org.eclipse.ltk.ui.refactoring.RefactoringWizardOpenOperation;
-
-/**
- * Action executed when the "Remove Container" menu item is invoked.
- */
-public class UnwrapAction extends VisualRefactoringAction {
-    @Override
-    public void run(IAction action) {
-        if ((mTextSelection != null || mTreeSelection != null) && mFile != null) {
-            UnwrapRefactoring ref = new UnwrapRefactoring(mFile, mDelegate,
-                    mTextSelection, mTreeSelection);
-            RefactoringWizard wizard = new UnwrapWizard(ref, mDelegate);
-            RefactoringWizardOpenOperation op = new RefactoringWizardOpenOperation(wizard);
-            try {
-                op.run(mWindow.getShell(), wizard.getDefaultPageTitle());
-            } catch (InterruptedException e) {
-                // Interrupted. Pass.
-            }
-        }
-    }
-
-    public static IAction create(LayoutEditorDelegate editorDelegate) {
-        return create("Remove Container...", editorDelegate, UnwrapAction.class);
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/UnwrapContribution.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/UnwrapContribution.java
deleted file mode 100644
index 0869fd6..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/UnwrapContribution.java
+++ /dev/null
@@ -1,40 +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.eclipse.adt.internal.editors.layout.refactoring;
-
-import org.eclipse.ltk.core.refactoring.RefactoringContribution;
-import org.eclipse.ltk.core.refactoring.RefactoringDescriptor;
-
-import java.util.Map;
-
-public class UnwrapContribution extends RefactoringContribution {
-
-    @SuppressWarnings("unchecked")
-    @Override
-    public RefactoringDescriptor createDescriptor(String id, String project, String description,
-            String comment, Map arguments, int flags) throws IllegalArgumentException {
-        return new UnwrapRefactoring.Descriptor(project, description, comment, arguments);
-    }
-
-    @SuppressWarnings("unchecked")
-    @Override
-    public Map retrieveArgumentMap(RefactoringDescriptor descriptor) {
-        if (descriptor instanceof UnwrapRefactoring.Descriptor) {
-            return ((UnwrapRefactoring.Descriptor) descriptor).getArguments();
-        }
-        return super.retrieveArgumentMap(descriptor);
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/UnwrapRefactoring.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/UnwrapRefactoring.java
deleted file mode 100644
index 4eff2cd..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/UnwrapRefactoring.java
+++ /dev/null
@@ -1,246 +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.eclipse.adt.internal.editors.layout.refactoring;
-
-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.EXT_XML;
-
-import com.android.annotations.NonNull;
-import com.android.annotations.VisibleForTesting;
-import com.android.ide.common.xml.XmlFormatStyle;
-import com.android.ide.eclipse.adt.internal.editors.layout.LayoutEditorDelegate;
-import com.android.ide.eclipse.adt.internal.editors.layout.gle2.DomUtilities;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.OperationCanceledException;
-import org.eclipse.jface.text.ITextSelection;
-import org.eclipse.jface.viewers.ITreeSelection;
-import org.eclipse.ltk.core.refactoring.Change;
-import org.eclipse.ltk.core.refactoring.Refactoring;
-import org.eclipse.ltk.core.refactoring.RefactoringStatus;
-import org.eclipse.ltk.core.refactoring.TextFileChange;
-import org.eclipse.text.edits.MultiTextEdit;
-import org.eclipse.wst.sse.core.internal.provisional.IndexedRegion;
-import org.w3c.dom.Attr;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-import java.util.Map;
-
-/**
- * Removes the layout surrounding the current selection (or if the current selection has
- * children, removes the current layout), and migrates namespace and layout attributes.
- */
-@SuppressWarnings("restriction") // XML model
-public class UnwrapRefactoring extends VisualRefactoring {
-    private Element mContainer;
-
-    /**
-     * This constructor is solely used by {@link Descriptor},
-     * to replay a previous refactoring.
-     * @param arguments argument map created by #createArgumentMap.
-     */
-    UnwrapRefactoring(Map<String, String> arguments) {
-        super(arguments);
-    }
-
-    public UnwrapRefactoring(
-            IFile file,
-            LayoutEditorDelegate delegate,
-            ITextSelection selection,
-            ITreeSelection treeSelection) {
-        super(file, delegate, selection, treeSelection);
-    }
-
-    @VisibleForTesting
-    UnwrapRefactoring(List<Element> selectedElements, LayoutEditorDelegate editor) {
-        super(selectedElements, editor);
-    }
-
-    @Override
-    public RefactoringStatus checkInitialConditions(IProgressMonitor pm) throws CoreException,
-            OperationCanceledException {
-        RefactoringStatus status = new RefactoringStatus();
-
-        try {
-            pm.beginTask("Checking preconditions...", 6);
-
-            if (mSelectionStart == -1 || mSelectionEnd == -1) {
-                status.addFatalError("No selection to wrap");
-                return status;
-            }
-
-            // Make sure that the selection all has the same parent?
-            if (mElements.size() == 0) {
-                status.addFatalError("Nothing to unwrap");
-                return status;
-            }
-
-            Element first = mElements.get(0);
-
-            // Determine the element of the container to be removed.
-            // If you've selected a non-container, or you've selected multiple
-            // elements, then it's the parent which should be removed. Otherwise,
-            // it's the selection itself which represents the container.
-            boolean useParent = mElements.size() > 1;
-            if (!useParent) {
-                if (DomUtilities.getChildren(first).size() == 0) {
-                    useParent = true;
-                }
-            }
-            Node parent = first.getParentNode();
-            if (parent instanceof Document) {
-                mContainer = first;
-                List<Element> elements = DomUtilities.getChildren(mContainer);
-                if (elements.size() == 0) {
-                    status.addFatalError(
-                            "Cannot remove container when it has no children");
-                        return status;
-                }
-            } else if (useParent && (parent instanceof Element)) {
-                mContainer = (Element) parent;
-            } else {
-                mContainer = first;
-            }
-
-            for (Element element : mElements) {
-                if (element.getParentNode() != parent) {
-                    status.addFatalError(
-                            "All unwrapped elements must share the same parent element");
-                    return status;
-                }
-            }
-
-            // Ensure that if we are removing the root, that it has only one child
-            // such that there is a new single root
-            if (mContainer.getParentNode() instanceof Document) {
-                if (DomUtilities.getChildren(mContainer).size() > 1) {
-                    status.addFatalError(
-                        "Cannot remove root: it has more than one child "
-                            + "which would result in multiple new roots");
-                    return status;
-                }
-            }
-
-            pm.worked(1);
-            return status;
-
-        } finally {
-            pm.done();
-        }
-    }
-
-    @Override
-    protected VisualRefactoringDescriptor createDescriptor() {
-        String comment = getName();
-        return new Descriptor(
-                mProject.getName(), //project
-                comment, //description
-                comment, //comment
-                createArgumentMap());
-    }
-
-    @Override
-    public String getName() {
-        return "Remove Container";
-    }
-
-    @Override
-    protected @NonNull List<Change> computeChanges(IProgressMonitor monitor) {
-        // (1) If the removed parent is the root container, transfer its
-        //   namespace declarations
-        // (2) Remove the root element completely
-        // (3) Transfer layout attributes?
-        // (4) Check for Java R.file usages?
-
-        IFile file = mDelegate.getEditor().getInputFile();
-        List<Change> changes = new ArrayList<Change>();
-        if (file == null) {
-            return changes;
-        }
-        MultiTextEdit rootEdit = new MultiTextEdit();
-
-        // Transfer namespace elements?
-        if (mContainer.getParentNode() instanceof Document) {
-            List<Element> elements = DomUtilities.getChildren(mContainer);
-            assert elements.size() == 1;
-            Element newRoot = elements.get(0);
-
-            List<Attr> declarations = findNamespaceAttributes(mContainer);
-            for (Attr attribute : declarations) {
-                if (attribute instanceof IndexedRegion) {
-                    setAttribute(rootEdit, newRoot, attribute.getNamespaceURI(),
-                            attribute.getPrefix(), attribute.getLocalName(), attribute.getValue());
-                }
-            }
-        }
-
-        // Transfer layout_ attributes (other than width and height)
-         List<Element> children = DomUtilities.getChildren(mContainer);
-         if (children.size() == 1) {
-            List<Attr> layoutAttributes = findLayoutAttributes(mContainer);
-            for (Attr attribute : layoutAttributes) {
-                String name = attribute.getLocalName();
-                if ((name.equals(ATTR_LAYOUT_WIDTH) || name.equals(ATTR_LAYOUT_HEIGHT))
-                        && ANDROID_URI.equals(attribute.getNamespaceURI())) {
-                    // Already handled specially
-                    continue;
-                }
-            }
-        }
-
-         // Remove the root
-         removeElementTags(rootEdit, mContainer, Collections.<Element>emptyList() /* skip */,
-                 false /*changeIndentation*/);
-
-         MultiTextEdit formatted = reformat(rootEdit, XmlFormatStyle.LAYOUT);
-         if (formatted != null) {
-             rootEdit = formatted;
-         }
-
-         TextFileChange change = new TextFileChange(file.getName(), file);
-         change.setEdit(rootEdit);
-         change.setTextType(EXT_XML);
-         changes.add(change);
-         return changes;
-    }
-
-    @Override
-    public VisualRefactoringWizard createWizard() {
-        return new UnwrapWizard(this, mDelegate);
-    }
-
-    public static class Descriptor extends VisualRefactoringDescriptor {
-        public Descriptor(String project, String description, String comment,
-                Map<String, String> arguments) {
-            super("com.android.ide.eclipse.adt.refactoring.unwrap", //$NON-NLS-1$
-                    project, description, comment, arguments);
-        }
-
-        @Override
-        protected Refactoring createRefactoring(Map<String, String> args) {
-            return new UnwrapRefactoring(args);
-        }
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/UnwrapWizard.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/UnwrapWizard.java
deleted file mode 100644
index 6e3bcf1..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/UnwrapWizard.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.ide.eclipse.adt.internal.editors.layout.refactoring;
-
-import com.android.ide.eclipse.adt.internal.editors.layout.LayoutEditorDelegate;
-
-public class UnwrapWizard extends VisualRefactoringWizard {
-    public UnwrapWizard(UnwrapRefactoring ref, LayoutEditorDelegate editor) {
-        super(ref, editor);
-        setDefaultPageTitle("Remove Container");
-    }
-
-    @Override
-    protected void addUserInputPages() {
-        // This refactoring takes no parameters
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/UseCompoundDrawableAction.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/UseCompoundDrawableAction.java
deleted file mode 100644
index 84d3e7e..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/UseCompoundDrawableAction.java
+++ /dev/null
@@ -1,48 +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.eclipse.adt.internal.editors.layout.refactoring;
-
-import com.android.ide.eclipse.adt.internal.editors.layout.LayoutEditorDelegate;
-
-import org.eclipse.jface.action.IAction;
-import org.eclipse.ltk.ui.refactoring.RefactoringWizard;
-import org.eclipse.ltk.ui.refactoring.RefactoringWizardOpenOperation;
-
-/**
- * Action executed when the "Convert Layout" menu item is invoked.
- */
-public class UseCompoundDrawableAction extends VisualRefactoringAction {
-    @Override
-    public void run(IAction action) {
-        if ((mTextSelection != null || mTreeSelection != null) && mFile != null) {
-            UseCompoundDrawableRefactoring ref = new UseCompoundDrawableRefactoring(
-                    mFile, mDelegate, mTextSelection, mTreeSelection);
-            RefactoringWizard wizard = new UseCompoundDrawableWizard(ref, mDelegate);
-            RefactoringWizardOpenOperation op = new RefactoringWizardOpenOperation(wizard);
-            try {
-                op.run(mWindow.getShell(), wizard.getDefaultPageTitle());
-            } catch (InterruptedException e) {
-                // Interrupted. Pass.
-            }
-        }
-    }
-
-    public static IAction create(LayoutEditorDelegate editorDelegate) {
-        return create("Convert to a Compound Drawable...", editorDelegate,
-                UseCompoundDrawableAction.class);
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/UseCompoundDrawableRefactoring.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/UseCompoundDrawableRefactoring.java
deleted file mode 100644
index 0e56bdf..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/UseCompoundDrawableRefactoring.java
+++ /dev/null
@@ -1,452 +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.ide.eclipse.adt.internal.editors.layout.refactoring;
-
-import static com.android.SdkConstants.ANDROID_URI;
-import static com.android.SdkConstants.ATTR_DRAWABLE_BOTTOM;
-import static com.android.SdkConstants.ATTR_DRAWABLE_LEFT;
-import static com.android.SdkConstants.ATTR_DRAWABLE_PADDING;
-import static com.android.SdkConstants.ATTR_DRAWABLE_RIGHT;
-import static com.android.SdkConstants.ATTR_DRAWABLE_TOP;
-import static com.android.SdkConstants.ATTR_GRAVITY;
-import static com.android.SdkConstants.ATTR_ID;
-import static com.android.SdkConstants.ATTR_LAYOUT_HEIGHT;
-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_WIDTH;
-import static com.android.SdkConstants.ATTR_ORIENTATION;
-import static com.android.SdkConstants.ATTR_SRC;
-import static com.android.SdkConstants.EXT_XML;
-import static com.android.SdkConstants.IMAGE_VIEW;
-import static com.android.SdkConstants.LINEAR_LAYOUT;
-import static com.android.SdkConstants.PREFIX_RESOURCE_REF;
-import static com.android.SdkConstants.TEXT_VIEW;
-import static com.android.SdkConstants.VALUE_VERTICAL;
-
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-import com.android.annotations.VisibleForTesting;
-import com.android.ide.common.xml.XmlFormatStyle;
-import com.android.ide.eclipse.adt.AdtUtils;
-import com.android.ide.eclipse.adt.internal.editors.formatting.EclipseXmlFormatPreferences;
-import com.android.ide.eclipse.adt.internal.editors.formatting.EclipseXmlPrettyPrinter;
-import com.android.ide.eclipse.adt.internal.editors.layout.LayoutEditorDelegate;
-import com.android.ide.eclipse.adt.internal.editors.layout.gle2.CanvasViewInfo;
-import com.android.ide.eclipse.adt.internal.editors.layout.gle2.DomUtilities;
-import com.android.ide.eclipse.adt.internal.preferences.AdtPrefs;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.OperationCanceledException;
-import org.eclipse.jface.text.ITextSelection;
-import org.eclipse.jface.viewers.ITreeSelection;
-import org.eclipse.ltk.core.refactoring.Change;
-import org.eclipse.ltk.core.refactoring.Refactoring;
-import org.eclipse.ltk.core.refactoring.RefactoringStatus;
-import org.eclipse.ltk.core.refactoring.TextFileChange;
-import org.eclipse.text.edits.MultiTextEdit;
-import org.eclipse.text.edits.ReplaceEdit;
-import org.eclipse.text.edits.TextEdit;
-import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
-import org.eclipse.wst.sse.core.internal.provisional.IndexedRegion;
-import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;
-import org.w3c.dom.Attr;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-import org.w3c.dom.NamedNodeMap;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-/**
- * Converts a LinearLayout with exactly a TextView child and an ImageView child into
- * a single TextView with a compound drawable.
- */
-@SuppressWarnings("restriction") // XML model
-public class UseCompoundDrawableRefactoring extends VisualRefactoring {
-    /**
-     * Constructs a new {@link UseCompoundDrawableRefactoring}
-     *
-     * @param file the file to refactor in
-     * @param editor the corresponding editor
-     * @param selection the editor selection, or null
-     * @param treeSelection the canvas selection, or null
-     */
-    public UseCompoundDrawableRefactoring(IFile file, LayoutEditorDelegate editor,
-            ITextSelection selection, ITreeSelection treeSelection) {
-        super(file, editor, selection, treeSelection);
-    }
-
-    /**
-     * This constructor is solely used by {@link Descriptor}, to replay a
-     * previous refactoring.
-     *
-     * @param arguments argument map created by #createArgumentMap.
-     */
-    private UseCompoundDrawableRefactoring(Map<String, String> arguments) {
-        super(arguments);
-    }
-
-    @VisibleForTesting
-    UseCompoundDrawableRefactoring(List<Element> selectedElements, LayoutEditorDelegate editor) {
-        super(selectedElements, editor);
-    }
-
-    @Override
-    public RefactoringStatus checkInitialConditions(IProgressMonitor pm) throws CoreException,
-            OperationCanceledException {
-        RefactoringStatus status = new RefactoringStatus();
-
-        try {
-            pm.beginTask("Checking preconditions...", 6);
-
-            if (mSelectionStart == -1 || mSelectionEnd == -1) {
-                status.addFatalError("Nothing to convert");
-                return status;
-            }
-
-            // Make sure the selection is contiguous
-            if (mTreeSelection != null) {
-                List<CanvasViewInfo> infos = getSelectedViewInfos();
-                if (!validateNotEmpty(infos, status)) {
-                    return status;
-                }
-
-                // Enforce that the selection is -contiguous-
-                if (!validateContiguous(infos, status)) {
-                    return status;
-                }
-            }
-
-            // Ensures that we have a valid DOM model:
-            if (mElements.size() == 0) {
-                status.addFatalError("Nothing to convert");
-                return status;
-            }
-
-            // Ensure that we have selected precisely one LinearLayout
-            if (mElements.size() != 1 ||
-                    !(mElements.get(0).getTagName().equals(LINEAR_LAYOUT))) {
-                status.addFatalError("Must select exactly one LinearLayout");
-                return status;
-            }
-
-            Element layout = mElements.get(0);
-            List<Element> children = DomUtilities.getChildren(layout);
-            if (children.size() != 2) {
-                status.addFatalError("The LinearLayout must have exactly two children");
-                return status;
-            }
-            Element first = children.get(0);
-            Element second = children.get(1);
-            boolean haveTextView =
-                    first.getTagName().equals(TEXT_VIEW)
-                    || second.getTagName().equals(TEXT_VIEW);
-            boolean haveImageView =
-                    first.getTagName().equals(IMAGE_VIEW)
-                    || second.getTagName().equals(IMAGE_VIEW);
-            if (!(haveTextView && haveImageView)) {
-                status.addFatalError("The LinearLayout must have exactly one TextView child " +
-                        "and one ImageView child");
-                return status;
-            }
-
-            pm.worked(1);
-            return status;
-
-        } finally {
-            pm.done();
-        }
-    }
-
-    @Override
-    protected VisualRefactoringDescriptor createDescriptor() {
-        String comment = getName();
-        return new Descriptor(
-                mProject.getName(), //project
-                comment, //description
-                comment, //comment
-                createArgumentMap());
-    }
-
-    @Override
-    protected Map<String, String> createArgumentMap() {
-        return super.createArgumentMap();
-    }
-
-    @Override
-    public String getName() {
-        return "Convert to Compound Drawable";
-    }
-
-    @Override
-    protected @NonNull List<Change> computeChanges(IProgressMonitor monitor) {
-        String androidNsPrefix = getAndroidNamespacePrefix();
-        IFile file = mDelegate.getEditor().getInputFile();
-        List<Change> changes = new ArrayList<Change>();
-        if (file == null) {
-            return changes;
-        }
-        TextFileChange change = new TextFileChange(file.getName(), file);
-        MultiTextEdit rootEdit = new MultiTextEdit();
-        change.setTextType(EXT_XML);
-
-        // (1) Build up the contents of the new TextView. This is identical
-        //     to the old contents, but with the addition of a drawableTop/Left/Right/Bottom
-        //     attribute (depending on the orientation and order), as well as any layout
-        //     params from the LinearLayout.
-        // (2) Delete the linear layout and replace with the text view.
-        // (3) Reformat.
-
-        // checkInitialConditions has already validated that we have exactly a LinearLayout
-        // with an ImageView and a TextView child (in either order)
-        Element layout = mElements.get(0);
-        List<Element> children = DomUtilities.getChildren(layout);
-        Element first = children.get(0);
-        Element second = children.get(1);
-        final Element text;
-        final Element image;
-        if (first.getTagName().equals(TEXT_VIEW)) {
-            text = first;
-            image = second;
-        } else {
-            text = second;
-            image = first;
-        }
-
-        // Horizontal is the default, so if no value is specified it is horizontal.
-        boolean isVertical = VALUE_VERTICAL.equals(layout.getAttributeNS(ANDROID_URI,
-                ATTR_ORIENTATION));
-
-        // The WST DOM implementation doesn't correctly implement cloneNode: this returns
-        // an empty document instead:
-        //   text.getOwnerDocument().cloneNode(false/*deep*/);
-        // Luckily we just need to clone a single element, not a nested structure, so it's
-        // easy enough to do this manually:
-        Document tempDocument = DomUtilities.createEmptyDocument();
-        if (tempDocument == null) {
-            return changes;
-        }
-        Element newTextElement = tempDocument.createElement(text.getTagName());
-        tempDocument.appendChild(newTextElement);
-
-        NamedNodeMap attributes =  text.getAttributes();
-        for (int i = 0, n = attributes.getLength(); i < n; i++) {
-            Attr attribute = (Attr) attributes.item(i);
-            String name = attribute.getLocalName();
-            if (name.startsWith(ATTR_LAYOUT_RESOURCE_PREFIX)
-                    && ANDROID_URI.equals(attribute.getNamespaceURI())
-                    && !(name.equals(ATTR_LAYOUT_WIDTH) || name.equals(ATTR_LAYOUT_HEIGHT))) {
-                // Ignore layout params: the parent layout is going away
-            } else {
-                newTextElement.setAttribute(attribute.getName(), attribute.getValue());
-            }
-        }
-
-        // Apply all layout params from the parent (except width and height),
-        // as well as android:gravity
-        List<Attr> layoutAttributes = findLayoutAttributes(layout);
-        for (Attr attribute : layoutAttributes) {
-            String name = attribute.getLocalName();
-            if ((name.equals(ATTR_LAYOUT_WIDTH) || name.equals(ATTR_LAYOUT_HEIGHT))
-                    && ANDROID_URI.equals(attribute.getNamespaceURI())) {
-                // Already handled specially
-                continue;
-            }
-            newTextElement.setAttribute(attribute.getName(), attribute.getValue());
-        }
-        String gravity = layout.getAttributeNS(ANDROID_URI, ATTR_GRAVITY);
-        if (gravity.length() > 0) {
-            setAndroidAttribute(newTextElement, androidNsPrefix, ATTR_GRAVITY, gravity);
-        }
-
-        String src = image.getAttributeNS(ANDROID_URI, ATTR_SRC);
-
-        // Set the drawable
-        String drawableAttribute;
-        // The space between the image and the text can have margins/padding, both
-        // from the text's perspective and from the image's perspective. We need to
-        // combine these.
-        String padding1 = null;
-        String padding2 = null;
-        if (isVertical) {
-            if (first == image) {
-                drawableAttribute = ATTR_DRAWABLE_TOP;
-                padding1 = getPadding(image, ATTR_LAYOUT_MARGIN_BOTTOM);
-                padding2 = getPadding(text, ATTR_LAYOUT_MARGIN_TOP);
-            } else {
-                drawableAttribute = ATTR_DRAWABLE_BOTTOM;
-                padding1 = getPadding(text, ATTR_LAYOUT_MARGIN_BOTTOM);
-                padding2 = getPadding(image, ATTR_LAYOUT_MARGIN_TOP);
-            }
-        } else {
-            if (first == image) {
-                drawableAttribute = ATTR_DRAWABLE_LEFT;
-                padding1 = getPadding(image, ATTR_LAYOUT_MARGIN_RIGHT);
-                padding2 = getPadding(text, ATTR_LAYOUT_MARGIN_LEFT);
-            } else {
-                drawableAttribute = ATTR_DRAWABLE_RIGHT;
-                padding1 = getPadding(text, ATTR_LAYOUT_MARGIN_RIGHT);
-                padding2 = getPadding(image, ATTR_LAYOUT_MARGIN_LEFT);
-            }
-        }
-
-        setAndroidAttribute(newTextElement, androidNsPrefix, drawableAttribute, src);
-
-        String padding = combine(padding1, padding2);
-        if (padding != null) {
-            setAndroidAttribute(newTextElement, androidNsPrefix, ATTR_DRAWABLE_PADDING, padding);
-        }
-
-        // If the removed LinearLayout is the root container, transfer its namespace
-        // declaration to the TextView
-        if (layout.getParentNode() instanceof Document) {
-            List<Attr> declarations = findNamespaceAttributes(layout);
-            for (Attr attribute : declarations) {
-                if (attribute instanceof IndexedRegion) {
-                    newTextElement.setAttribute(attribute.getName(), attribute.getValue());
-                }
-            }
-        }
-
-        // Update any layout references to the layout to point to the text view
-        String layoutId = getId(layout);
-        if (layoutId.length() > 0) {
-            String id = getId(text);
-            if (id.length() == 0) {
-                id = ensureHasId(rootEdit, text, null, false);
-                setAndroidAttribute(newTextElement, androidNsPrefix, ATTR_ID, id);
-            }
-
-            IStructuredModel model = mDelegate.getEditor().getModelForRead();
-            try {
-                IStructuredDocument doc = model.getStructuredDocument();
-                if (doc != null) {
-                    List<TextEdit> replaceIds = replaceIds(androidNsPrefix,
-                            doc, mSelectionStart, mSelectionEnd, layoutId, id);
-                    for (TextEdit edit : replaceIds) {
-                        rootEdit.addChild(edit);
-                    }
-                }
-            } finally {
-                model.releaseFromRead();
-            }
-        }
-
-        String xml = EclipseXmlPrettyPrinter.prettyPrint(
-                tempDocument.getDocumentElement(),
-                EclipseXmlFormatPreferences.create(),
-                XmlFormatStyle.LAYOUT, null, false);
-
-        TextEdit replace = new ReplaceEdit(mSelectionStart, mSelectionEnd - mSelectionStart, xml);
-        rootEdit.addChild(replace);
-
-        if (AdtPrefs.getPrefs().getFormatGuiXml()) {
-            MultiTextEdit formatted = reformat(rootEdit, XmlFormatStyle.LAYOUT);
-            if (formatted != null) {
-                rootEdit = formatted;
-            }
-        }
-
-        change.setEdit(rootEdit);
-        changes.add(change);
-        return changes;
-    }
-
-    @Nullable
-    private static String getPadding(@NonNull Element element, @NonNull String attribute) {
-        String padding = element.getAttributeNS(ANDROID_URI, attribute);
-        if (padding != null && padding.isEmpty()) {
-            padding = null;
-        }
-        return padding;
-    }
-
-    @VisibleForTesting
-    @Nullable
-    static String combine(@Nullable String dimension1, @Nullable String dimension2) {
-        if (dimension1 == null || dimension1.isEmpty()) {
-            if (dimension2 != null && dimension2.isEmpty()) {
-                return null;
-            }
-            return dimension2;
-        } else if (dimension2 == null || dimension2.isEmpty()) {
-            if (dimension1 != null && dimension1.isEmpty()) {
-                return null;
-            }
-            return dimension1;
-        } else {
-            // Two dimensions are specified (e.g. marginRight for the left one and marginLeft
-            // for the right one); we have to add these together. We can only do that if
-            // they use the same units, and do not use resources.
-            if (dimension1.startsWith(PREFIX_RESOURCE_REF)
-                    || dimension2.startsWith(PREFIX_RESOURCE_REF)) {
-                return null;
-            }
-
-            Pattern p = Pattern.compile("([\\d\\.]+)(.+)"); //$NON-NLS-1$
-            Matcher matcher1 = p.matcher(dimension1);
-            Matcher matcher2 = p.matcher(dimension2);
-            if (matcher1.matches() && matcher2.matches()) {
-                String unit = matcher1.group(2);
-                if (unit.equals(matcher2.group(2))) {
-                    float value1 = Float.parseFloat(matcher1.group(1));
-                    float value2 = Float.parseFloat(matcher2.group(1));
-                    return AdtUtils.formatFloatAttribute(value1 + value2) + unit;
-                }
-            }
-        }
-
-        return null;
-    }
-
-    /**
-     * Sets an Android attribute (in the Android namespace) on an element
-     * without a given namespace prefix. This is done when building a new Element
-     * in a temporary document such that the namespace prefix matches when the element is
-     * formatted and replaced in the target document.
-     */
-    private static void setAndroidAttribute(Element element, String prefix, String name,
-            String value) {
-        element.setAttribute(prefix + ':' + name, value);
-    }
-
-    @Override
-    public VisualRefactoringWizard createWizard() {
-        return new UseCompoundDrawableWizard(this, mDelegate);
-    }
-
-    @SuppressWarnings("javadoc")
-    public static class Descriptor extends VisualRefactoringDescriptor {
-        public Descriptor(String project, String description, String comment,
-                Map<String, String> arguments) {
-            super("com.android.ide.eclipse.adt.refactoring.usecompound", //$NON-NLS-1$
-                    project, description, comment, arguments);
-        }
-
-        @Override
-        protected Refactoring createRefactoring(Map<String, String> args) {
-            return new UseCompoundDrawableRefactoring(args);
-        }
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/UseCompoundDrawableWizard.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/UseCompoundDrawableWizard.java
deleted file mode 100644
index 3ffd6b5..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/UseCompoundDrawableWizard.java
+++ /dev/null
@@ -1,31 +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.ide.eclipse.adt.internal.editors.layout.refactoring;
-
-import com.android.ide.eclipse.adt.internal.editors.layout.LayoutEditorDelegate;
-
-class UseCompoundDrawableWizard extends VisualRefactoringWizard {
-    UseCompoundDrawableWizard(UseCompoundDrawableRefactoring ref, LayoutEditorDelegate editor) {
-        super(ref, editor);
-        setDefaultPageTitle("Use Compound Drawable");
-    }
-
-    @Override
-    protected void addUserInputPages() {
-        // This refactoring takes no parameters
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/VisualRefactoring.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/VisualRefactoring.java
deleted file mode 100644
index 904a3a0..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/VisualRefactoring.java
+++ /dev/null
@@ -1,1403 +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.eclipse.adt.internal.editors.layout.refactoring;
-
-import static com.android.SdkConstants.ANDROID_NS_NAME;
-import static com.android.SdkConstants.ANDROID_URI;
-import static com.android.SdkConstants.ANDROID_WIDGET_PREFIX;
-import static com.android.SdkConstants.ATTR_ID;
-import static com.android.SdkConstants.ATTR_LAYOUT_HEIGHT;
-import static com.android.SdkConstants.ATTR_LAYOUT_RESOURCE_PREFIX;
-import static com.android.SdkConstants.ATTR_LAYOUT_WIDTH;
-import static com.android.SdkConstants.ID_PREFIX;
-import static com.android.SdkConstants.NEW_ID_PREFIX;
-import static com.android.SdkConstants.XMLNS;
-import static com.android.SdkConstants.XMLNS_PREFIX;
-
-import com.android.annotations.NonNull;
-import com.android.annotations.VisibleForTesting;
-import com.android.ide.common.xml.XmlFormatStyle;
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.ide.eclipse.adt.internal.editors.AndroidXmlEditor;
-import com.android.ide.eclipse.adt.internal.editors.formatting.EclipseXmlFormatPreferences;
-import com.android.ide.eclipse.adt.internal.editors.formatting.EclipseXmlPrettyPrinter;
-import com.android.ide.eclipse.adt.internal.editors.layout.LayoutEditorDelegate;
-import com.android.ide.eclipse.adt.internal.editors.layout.configuration.ConfigurationDescription;
-import com.android.ide.eclipse.adt.internal.editors.layout.descriptors.ViewElementDescriptor;
-import com.android.ide.eclipse.adt.internal.editors.layout.gle2.CanvasViewInfo;
-import com.android.ide.eclipse.adt.internal.editors.layout.gle2.DomUtilities;
-import com.android.ide.eclipse.adt.internal.editors.layout.gle2.GraphicalEditorPart;
-import com.android.ide.eclipse.adt.internal.editors.layout.uimodel.UiViewElementNode;
-import com.android.ide.eclipse.adt.internal.editors.uimodel.UiElementNode;
-import com.android.ide.eclipse.adt.internal.preferences.AdtPrefs;
-import com.android.ide.eclipse.adt.internal.sdk.AndroidTargetData;
-import com.android.utils.Pair;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.OperationCanceledException;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.jface.text.BadLocationException;
-import org.eclipse.jface.text.IDocument;
-import org.eclipse.jface.text.IRegion;
-import org.eclipse.jface.text.ITextSelection;
-import org.eclipse.jface.viewers.ITreeSelection;
-import org.eclipse.jface.viewers.TreePath;
-import org.eclipse.ltk.core.refactoring.Change;
-import org.eclipse.ltk.core.refactoring.ChangeDescriptor;
-import org.eclipse.ltk.core.refactoring.CompositeChange;
-import org.eclipse.ltk.core.refactoring.Refactoring;
-import org.eclipse.ltk.core.refactoring.RefactoringChangeDescriptor;
-import org.eclipse.ltk.core.refactoring.RefactoringDescriptor;
-import org.eclipse.ltk.core.refactoring.RefactoringStatus;
-import org.eclipse.text.edits.DeleteEdit;
-import org.eclipse.text.edits.InsertEdit;
-import org.eclipse.text.edits.MalformedTreeException;
-import org.eclipse.text.edits.MultiTextEdit;
-import org.eclipse.text.edits.ReplaceEdit;
-import org.eclipse.text.edits.TextEdit;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.ide.IDE;
-import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
-import org.eclipse.wst.sse.core.internal.provisional.IndexedRegion;
-import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;
-import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocumentRegion;
-import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegion;
-import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegionList;
-import org.eclipse.wst.xml.core.internal.regions.DOMRegionContext;
-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 java.util.ArrayList;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Locale;
-import java.util.Map;
-import java.util.Set;
-
-/**
- * Parent class for the various visual refactoring operations; contains shared
- * implementations needed by most of them
- */
-@SuppressWarnings("restriction") // XML model
-public abstract class VisualRefactoring extends Refactoring {
-    private static final String KEY_FILE = "file";                      //$NON-NLS-1$
-    private static final String KEY_PROJECT = "proj";                   //$NON-NLS-1$
-    private static final String KEY_SEL_START = "sel-start";            //$NON-NLS-1$
-    private static final String KEY_SEL_END = "sel-end";                //$NON-NLS-1$
-
-    protected final IFile mFile;
-    protected final LayoutEditorDelegate mDelegate;
-    protected final IProject mProject;
-    protected int mSelectionStart = -1;
-    protected int mSelectionEnd = -1;
-    protected final List<Element> mElements;
-    protected final ITreeSelection mTreeSelection;
-    protected final ITextSelection mSelection;
-    /** Same as {@link #mSelectionStart} but not adjusted to element edges */
-    protected int mOriginalSelectionStart = -1;
-    /** Same as {@link #mSelectionEnd} but not adjusted to element edges */
-    protected int mOriginalSelectionEnd = -1;
-
-    protected final Map<Element, String> mGeneratedIdMap = new HashMap<Element, String>();
-    protected final Set<String> mGeneratedIds = new HashSet<String>();
-
-    protected List<Change> mChanges;
-    private String mAndroidNamespacePrefix;
-
-    /**
-     * This constructor is solely used by {@link VisualRefactoringDescriptor},
-     * to replay a previous refactoring.
-     * @param arguments argument map created by #createArgumentMap.
-     */
-    VisualRefactoring(Map<String, String> arguments) {
-        IPath path = Path.fromPortableString(arguments.get(KEY_PROJECT));
-        mProject = (IProject) ResourcesPlugin.getWorkspace().getRoot().findMember(path);
-        path = Path.fromPortableString(arguments.get(KEY_FILE));
-        mFile = (IFile) ResourcesPlugin.getWorkspace().getRoot().findMember(path);
-        mSelectionStart = Integer.parseInt(arguments.get(KEY_SEL_START));
-        mSelectionEnd = Integer.parseInt(arguments.get(KEY_SEL_END));
-        mOriginalSelectionStart = mSelectionStart;
-        mOriginalSelectionEnd = mSelectionEnd;
-        mDelegate = null;
-        mElements = null;
-        mSelection = null;
-        mTreeSelection = null;
-    }
-
-    @VisibleForTesting
-    VisualRefactoring(List<Element> elements, LayoutEditorDelegate delegate) {
-        mElements = elements;
-        mDelegate = delegate;
-
-        mFile = delegate != null ? delegate.getEditor().getInputFile() : null;
-        mProject = delegate != null ? delegate.getEditor().getProject() : null;
-        mSelectionStart = 0;
-        mSelectionEnd = 0;
-        mOriginalSelectionStart = 0;
-        mOriginalSelectionEnd = 0;
-        mSelection = null;
-        mTreeSelection = null;
-
-        int end = Integer.MIN_VALUE;
-        int start = Integer.MAX_VALUE;
-        for (Element element : elements) {
-            if (element instanceof IndexedRegion) {
-                IndexedRegion region = (IndexedRegion) element;
-                start = Math.min(start, region.getStartOffset());
-                end = Math.max(end, region.getEndOffset());
-            }
-        }
-        if (start >= 0) {
-            mSelectionStart = start;
-            mSelectionEnd = end;
-            mOriginalSelectionStart = start;
-            mOriginalSelectionEnd = end;
-        }
-    }
-
-    public VisualRefactoring(IFile file, LayoutEditorDelegate editor, ITextSelection selection,
-            ITreeSelection treeSelection) {
-        mFile = file;
-        mDelegate = editor;
-        mProject = file.getProject();
-        mSelection = selection;
-        mTreeSelection = treeSelection;
-
-        // Initialize mSelectionStart and mSelectionEnd based on the selection context, which
-        // is either a treeSelection (when invoked from the layout editor or the outline), or
-        // a selection (when invoked from an XML editor)
-        if (treeSelection != null) {
-            int end = Integer.MIN_VALUE;
-            int start = Integer.MAX_VALUE;
-            for (TreePath path : treeSelection.getPaths()) {
-                Object lastSegment = path.getLastSegment();
-                if (lastSegment instanceof CanvasViewInfo) {
-                    CanvasViewInfo viewInfo = (CanvasViewInfo) lastSegment;
-                    UiViewElementNode uiNode = viewInfo.getUiViewNode();
-                    if (uiNode == null) {
-                        continue;
-                    }
-                    Node xmlNode = uiNode.getXmlNode();
-                    if (xmlNode instanceof IndexedRegion) {
-                        IndexedRegion region = (IndexedRegion) xmlNode;
-
-                        start = Math.min(start, region.getStartOffset());
-                        end = Math.max(end, region.getEndOffset());
-                    }
-                }
-            }
-            if (start >= 0) {
-                mSelectionStart = start;
-                mSelectionEnd = end;
-                mOriginalSelectionStart = mSelectionStart;
-                mOriginalSelectionEnd = mSelectionEnd;
-            }
-            if (selection != null) {
-                mOriginalSelectionStart = selection.getOffset();
-                mOriginalSelectionEnd = mOriginalSelectionStart + selection.getLength();
-            }
-        } else if (selection != null) {
-            // TODO: update selection to boundaries!
-            mSelectionStart = selection.getOffset();
-            mSelectionEnd = mSelectionStart + selection.getLength();
-            mOriginalSelectionStart = mSelectionStart;
-            mOriginalSelectionEnd = mSelectionEnd;
-        }
-
-        mElements = initElements();
-    }
-
-    @NonNull
-    protected abstract List<Change> computeChanges(IProgressMonitor monitor);
-
-    @Override
-    public RefactoringStatus checkFinalConditions(IProgressMonitor monitor) throws CoreException,
-            OperationCanceledException {
-        RefactoringStatus status = new RefactoringStatus();
-        mChanges = new ArrayList<Change>();
-        try {
-            monitor.beginTask("Checking post-conditions...", 5);
-
-            // Reset state for each computeChanges call, in case the user goes back
-            // and forth in the refactoring wizard
-            mGeneratedIdMap.clear();
-            mGeneratedIds.clear();
-            List<Change> changes = computeChanges(monitor);
-            mChanges.addAll(changes);
-
-            monitor.worked(1);
-        } finally {
-            monitor.done();
-        }
-
-        return status;
-    }
-
-    @Override
-    public Change createChange(IProgressMonitor monitor) throws CoreException,
-            OperationCanceledException {
-        try {
-            monitor.beginTask("Applying changes...", 1);
-
-            CompositeChange change = new CompositeChange(
-                    getName(),
-                    mChanges.toArray(new Change[mChanges.size()])) {
-                @Override
-                public ChangeDescriptor getDescriptor() {
-                    VisualRefactoringDescriptor desc = createDescriptor();
-                    return new RefactoringChangeDescriptor(desc);
-                }
-            };
-
-            monitor.worked(1);
-            return change;
-
-        } finally {
-            monitor.done();
-        }
-    }
-
-    protected abstract VisualRefactoringDescriptor createDescriptor();
-
-    protected Map<String, String> createArgumentMap() {
-        HashMap<String, String> args = new HashMap<String, String>();
-        args.put(KEY_PROJECT, mProject.getFullPath().toPortableString());
-        args.put(KEY_FILE, mFile.getFullPath().toPortableString());
-        args.put(KEY_SEL_START, Integer.toString(mSelectionStart));
-        args.put(KEY_SEL_END, Integer.toString(mSelectionEnd));
-
-        return args;
-    }
-
-    IFile getFile() {
-        return mFile;
-    }
-
-    // ---- Shared functionality ----
-
-
-    protected void openFile(IFile file) {
-        GraphicalEditorPart graphicalEditor = mDelegate.getGraphicalEditor();
-        IFile leavingFile = graphicalEditor.getEditedFile();
-
-        try {
-            // Duplicate the current state into the newly created file
-            String state = ConfigurationDescription.getDescription(leavingFile);
-
-            // TODO: Look for a ".NoTitleBar.Fullscreen" theme version of the current
-            // theme to show.
-
-            file.setSessionProperty(GraphicalEditorPart.NAME_INITIAL_STATE, state);
-        } catch (CoreException e) {
-            // pass
-        }
-
-        /* TBD: "Show Included In" if supported.
-         * Not sure if this is a good idea.
-        if (graphicalEditor.renderingSupports(Capability.EMBEDDED_LAYOUT)) {
-            try {
-                Reference include = Reference.create(graphicalEditor.getEditedFile());
-                file.setSessionProperty(GraphicalEditorPart.NAME_INCLUDE, include);
-            } catch (CoreException e) {
-                // pass - worst that can happen is that we don't start with inclusion
-            }
-        }
-        */
-
-        try {
-            IEditorPart part =
-                IDE.openEditor(mDelegate.getEditor().getEditorSite().getPage(), file);
-            if (part instanceof AndroidXmlEditor && AdtPrefs.getPrefs().getFormatGuiXml()) {
-                AndroidXmlEditor newEditor = (AndroidXmlEditor) part;
-                newEditor.reformatDocument();
-            }
-        } catch (PartInitException e) {
-            AdtPlugin.log(e, "Can't open new included layout");
-        }
-    }
-
-
-    /** Produce a list of edits to replace references to the given id with the given new id */
-    protected static List<TextEdit> replaceIds(String androidNamePrefix,
-            IStructuredDocument doc, int skipStart, int skipEnd,
-            String rootId, String referenceId) {
-        if (rootId == null) {
-            return Collections.emptyList();
-        }
-
-        // We need to search for either @+id/ or @id/
-        String match1 = rootId;
-        String match2;
-        if (match1.startsWith(ID_PREFIX)) {
-            match2 = '"' + NEW_ID_PREFIX + match1.substring(ID_PREFIX.length()) + '"';
-            match1 = '"' + match1 + '"';
-        } else if (match1.startsWith(NEW_ID_PREFIX)) {
-            match2 = '"' + ID_PREFIX + match1.substring(NEW_ID_PREFIX.length()) + '"';
-            match1 = '"' + match1 + '"';
-        } else {
-            return Collections.emptyList();
-        }
-
-        String namePrefix = androidNamePrefix + ':' + ATTR_LAYOUT_RESOURCE_PREFIX;
-        List<TextEdit> edits = new ArrayList<TextEdit>();
-
-        IStructuredDocumentRegion region = doc.getFirstStructuredDocumentRegion();
-        for (; region != null; region = region.getNext()) {
-            ITextRegionList list = region.getRegions();
-            int regionStart = region.getStart();
-
-            // Look at all attribute values and look for an id reference match
-            String attributeName = ""; //$NON-NLS-1$
-            for (int j = 0; j < region.getNumberOfRegions(); j++) {
-                ITextRegion subRegion = list.get(j);
-                String type = subRegion.getType();
-                if (DOMRegionContext.XML_TAG_ATTRIBUTE_NAME.equals(type)) {
-                    attributeName = region.getText(subRegion);
-                } else if (DOMRegionContext.XML_TAG_ATTRIBUTE_VALUE.equals(type)) {
-                    // Only replace references in layout attributes
-                    if (!attributeName.startsWith(namePrefix)) {
-                        continue;
-                    }
-                    // Skip occurrences in the given skip range
-                    int subRegionStart = regionStart + subRegion.getStart();
-                    if (subRegionStart >= skipStart && subRegionStart <= skipEnd) {
-                        continue;
-                    }
-
-                    String attributeValue = region.getText(subRegion);
-                    if (attributeValue.equals(match1) || attributeValue.equals(match2)) {
-                        int start = subRegionStart + 1; // skip quote
-                        int end = start + rootId.length();
-
-                        edits.add(new ReplaceEdit(start, end - start, referenceId));
-                    }
-                }
-            }
-        }
-
-        return edits;
-    }
-
-    /** Get the id of the root selected element, if any */
-    protected String getRootId() {
-        Element primary = getPrimaryElement();
-        if (primary != null) {
-            String oldId = primary.getAttributeNS(ANDROID_URI, ATTR_ID);
-            // id null check for https://bugs.eclipse.org/bugs/show_bug.cgi?id=272378
-            if (oldId != null && oldId.length() > 0) {
-                return oldId;
-            }
-        }
-
-        return null;
-    }
-
-    protected String getAndroidNamespacePrefix() {
-        if (mAndroidNamespacePrefix == null) {
-            List<Attr> attributeNodes = findNamespaceAttributes();
-            for (Node attributeNode : attributeNodes) {
-                String prefix = attributeNode.getPrefix();
-                if (XMLNS.equals(prefix)) {
-                    String name = attributeNode.getNodeName();
-                    String value = attributeNode.getNodeValue();
-                    if (value.equals(ANDROID_URI)) {
-                        mAndroidNamespacePrefix = name;
-                        if (mAndroidNamespacePrefix.startsWith(XMLNS_PREFIX)) {
-                            mAndroidNamespacePrefix =
-                                mAndroidNamespacePrefix.substring(XMLNS_PREFIX.length());
-                        }
-                    }
-                }
-            }
-
-            if (mAndroidNamespacePrefix == null) {
-                mAndroidNamespacePrefix = ANDROID_NS_NAME;
-            }
-        }
-
-        return mAndroidNamespacePrefix;
-    }
-
-    protected static String getAndroidNamespacePrefix(Document document) {
-        String nsPrefix = null;
-        List<Attr> attributeNodes = findNamespaceAttributes(document);
-        for (Node attributeNode : attributeNodes) {
-            String prefix = attributeNode.getPrefix();
-            if (XMLNS.equals(prefix)) {
-                String name = attributeNode.getNodeName();
-                String value = attributeNode.getNodeValue();
-                if (value.equals(ANDROID_URI)) {
-                    nsPrefix = name;
-                    if (nsPrefix.startsWith(XMLNS_PREFIX)) {
-                        nsPrefix =
-                            nsPrefix.substring(XMLNS_PREFIX.length());
-                    }
-                }
-            }
-        }
-
-        if (nsPrefix == null) {
-            nsPrefix = ANDROID_NS_NAME;
-        }
-
-        return nsPrefix;
-    }
-
-    protected List<Attr> findNamespaceAttributes() {
-        Document document = getDomDocument();
-        return findNamespaceAttributes(document);
-    }
-
-    protected static List<Attr> findNamespaceAttributes(Document document) {
-        if (document != null) {
-            Element root = document.getDocumentElement();
-            return findNamespaceAttributes(root);
-        }
-
-        return Collections.emptyList();
-    }
-
-    protected static List<Attr> findNamespaceAttributes(Node root) {
-        List<Attr> result = new ArrayList<Attr>();
-        NamedNodeMap attributes = root.getAttributes();
-        for (int i = 0, n = attributes.getLength(); i < n; i++) {
-            Node attributeNode = attributes.item(i);
-
-            String prefix = attributeNode.getPrefix();
-            if (XMLNS.equals(prefix)) {
-                result.add((Attr) attributeNode);
-            }
-        }
-
-        return result;
-    }
-
-    protected List<Attr> findLayoutAttributes(Node root) {
-        List<Attr> result = new ArrayList<Attr>();
-        NamedNodeMap attributes = root.getAttributes();
-        for (int i = 0, n = attributes.getLength(); i < n; i++) {
-            Node attributeNode = attributes.item(i);
-
-            String name = attributeNode.getLocalName();
-            if (name.startsWith(ATTR_LAYOUT_RESOURCE_PREFIX)
-                    && ANDROID_URI.equals(attributeNode.getNamespaceURI())) {
-                result.add((Attr) attributeNode);
-            }
-        }
-
-        return result;
-    }
-
-    protected String insertNamespace(String xmlText, String namespaceDeclarations) {
-        // Insert namespace declarations into the extracted XML fragment
-        int firstSpace = xmlText.indexOf(' ');
-        int elementEnd = xmlText.indexOf('>');
-        int insertAt;
-        if (firstSpace != -1 && firstSpace < elementEnd) {
-            insertAt = firstSpace;
-        } else {
-            insertAt = elementEnd;
-        }
-        xmlText = xmlText.substring(0, insertAt) + namespaceDeclarations
-                + xmlText.substring(insertAt);
-
-        return xmlText;
-    }
-
-    /** Remove sections of the document that correspond to top level layout attributes;
-     * these are placed on the include element instead */
-    protected String stripTopLayoutAttributes(Element primary, int start, String xml) {
-        if (primary != null) {
-            // List of attributes to remove
-            List<IndexedRegion> skip = new ArrayList<IndexedRegion>();
-            NamedNodeMap attributes = primary.getAttributes();
-            for (int i = 0, n = attributes.getLength(); i < n; i++) {
-                Node attr = attributes.item(i);
-                String name = attr.getLocalName();
-                if (name.startsWith(ATTR_LAYOUT_RESOURCE_PREFIX)
-                        && ANDROID_URI.equals(attr.getNamespaceURI())) {
-                    if (name.equals(ATTR_LAYOUT_WIDTH) || name.equals(ATTR_LAYOUT_HEIGHT)) {
-                        // These are special and are left in
-                        continue;
-                    }
-
-                    if (attr instanceof IndexedRegion) {
-                        skip.add((IndexedRegion) attr);
-                    }
-                }
-            }
-            if (skip.size() > 0) {
-                Collections.sort(skip, new Comparator<IndexedRegion>() {
-                    // Sort in start order
-                    @Override
-                    public int compare(IndexedRegion r1, IndexedRegion r2) {
-                        return r1.getStartOffset() - r2.getStartOffset();
-                    }
-                });
-
-                // Successively cut out the various layout attributes
-                // TODO remove adjacent whitespace too (but not newlines, unless they
-                // are newly adjacent)
-                StringBuilder sb = new StringBuilder(xml.length());
-                int nextStart = 0;
-
-                // Copy out all the sections except the skip sections
-                for (IndexedRegion r : skip) {
-                    int regionStart = r.getStartOffset();
-                    // Adjust to string offsets since we've copied the string out of
-                    // the document
-                    regionStart -= start;
-
-                    sb.append(xml.substring(nextStart, regionStart));
-
-                    nextStart = regionStart + r.getLength();
-                }
-                if (nextStart < xml.length()) {
-                    sb.append(xml.substring(nextStart));
-                }
-
-                return sb.toString();
-            }
-        }
-
-        return xml;
-    }
-
-    protected static String getIndent(String line, int max) {
-        int i = 0;
-        int n = Math.min(max, line.length());
-        for (; i < n; i++) {
-            char c = line.charAt(i);
-            if (!Character.isWhitespace(c)) {
-                return line.substring(0, i);
-            }
-        }
-
-        if (n < line.length()) {
-            return line.substring(0, n);
-        } else {
-            return line;
-        }
-    }
-
-    protected static String dedent(String xml) {
-        String[] lines = xml.split("\n"); //$NON-NLS-1$
-        if (lines.length < 2) {
-            // The first line never has any indentation since we copy it out from the
-            // element start index
-            return xml;
-        }
-
-        String indentPrefix = getIndent(lines[1], lines[1].length());
-        for (int i = 2, n = lines.length; i < n; i++) {
-            String line = lines[i];
-
-            // Ignore blank lines
-            if (line.trim().length() == 0) {
-                continue;
-            }
-
-            indentPrefix = getIndent(line, indentPrefix.length());
-
-            if (indentPrefix.length() == 0) {
-                return xml;
-            }
-        }
-
-        StringBuilder sb = new StringBuilder();
-        for (String line : lines) {
-            if (line.startsWith(indentPrefix)) {
-                sb.append(line.substring(indentPrefix.length()));
-            } else {
-                sb.append(line);
-            }
-            sb.append('\n');
-        }
-        return sb.toString();
-    }
-
-    protected String getText(int start, int end) {
-        try {
-            IStructuredDocument document = mDelegate.getEditor().getStructuredDocument();
-            return document.get(start, end - start);
-        } catch (BadLocationException e) {
-            // the region offset was invalid. ignore.
-            return null;
-        }
-    }
-
-    protected List<Element> getElements() {
-        return mElements;
-    }
-
-    protected List<Element> initElements() {
-        List<Element> nodes = new ArrayList<Element>();
-
-        assert mTreeSelection == null || mSelection == null :
-            "treeSel= " + mTreeSelection + ", sel=" + mSelection;
-
-        // Initialize mSelectionStart and mSelectionEnd based on the selection context, which
-        // is either a treeSelection (when invoked from the layout editor or the outline), or
-        // a selection (when invoked from an XML editor)
-        if (mTreeSelection != null) {
-            int end = Integer.MIN_VALUE;
-            int start = Integer.MAX_VALUE;
-            for (TreePath path : mTreeSelection.getPaths()) {
-                Object lastSegment = path.getLastSegment();
-                if (lastSegment instanceof CanvasViewInfo) {
-                    CanvasViewInfo viewInfo = (CanvasViewInfo) lastSegment;
-                    UiViewElementNode uiNode = viewInfo.getUiViewNode();
-                    if (uiNode == null) {
-                        continue;
-                    }
-                    Node xmlNode = uiNode.getXmlNode();
-                    if (xmlNode instanceof Element) {
-                        Element element = (Element) xmlNode;
-                        nodes.add(element);
-                        IndexedRegion region = getRegion(element);
-                        start = Math.min(start, region.getStartOffset());
-                        end = Math.max(end, region.getEndOffset());
-                    }
-                }
-            }
-            if (start >= 0) {
-                mSelectionStart = start;
-                mSelectionEnd = end;
-            }
-        } else if (mSelection != null) {
-            mSelectionStart = mSelection.getOffset();
-            mSelectionEnd = mSelectionStart + mSelection.getLength();
-            mOriginalSelectionStart = mSelectionStart;
-            mOriginalSelectionEnd = mSelectionEnd;
-
-            // Figure out the range of selected nodes from the document offsets
-            IStructuredDocument doc = mDelegate.getEditor().getStructuredDocument();
-            Pair<Element, Element> range = DomUtilities.getElementRange(doc,
-                    mSelectionStart, mSelectionEnd);
-            if (range != null) {
-                Element first = range.getFirst();
-                Element last = range.getSecond();
-
-                // Adjust offsets to get rid of surrounding text nodes (if you happened
-                // to select a text range and included whitespace on either end etc)
-                mSelectionStart = getRegion(first).getStartOffset();
-                mSelectionEnd = getRegion(last).getEndOffset();
-
-                if (mSelectionStart > mSelectionEnd) {
-                    int tmp = mSelectionStart;
-                    mSelectionStart = mSelectionEnd;
-                    mSelectionEnd = tmp;
-                }
-
-                if (first == last) {
-                    nodes.add(first);
-                } else if (first.getParentNode() == last.getParentNode()) {
-                    // Add the range
-                    Node node = first;
-                    while (node != null) {
-                        if (node instanceof Element) {
-                            nodes.add((Element) node);
-                        }
-                        if (node == last) {
-                            break;
-                        }
-                        node = node.getNextSibling();
-                    }
-                } else {
-                    // Different parents: this means we have an uneven selection, selecting
-                    // elements from different levels. We can't extract ranges like that.
-                }
-            }
-        } else {
-            assert false;
-        }
-
-        // Make sure that the list of elements is unique
-        //Set<Element> seen = new HashSet<Element>();
-        //for (Element element : nodes) {
-        //   assert !seen.contains(element) : element;
-        //   seen.add(element);
-        //}
-
-        return nodes;
-    }
-
-    protected Element getPrimaryElement() {
-        List<Element> elements = getElements();
-        if (elements != null && elements.size() == 1) {
-            return elements.get(0);
-        }
-
-        return null;
-    }
-
-    protected Document getDomDocument() {
-        if (mDelegate.getUiRootNode() != null) {
-            return mDelegate.getUiRootNode().getXmlDocument();
-        } else {
-            return getElements().get(0).getOwnerDocument();
-        }
-    }
-
-    protected List<CanvasViewInfo> getSelectedViewInfos() {
-        List<CanvasViewInfo> infos = new ArrayList<CanvasViewInfo>();
-        if (mTreeSelection != null) {
-            for (TreePath path : mTreeSelection.getPaths()) {
-                Object lastSegment = path.getLastSegment();
-                if (lastSegment instanceof CanvasViewInfo) {
-                    infos.add((CanvasViewInfo) lastSegment);
-                }
-            }
-        }
-        return infos;
-    }
-
-    protected boolean validateNotEmpty(List<CanvasViewInfo> infos, RefactoringStatus status) {
-        if (infos.size() == 0) {
-            status.addFatalError("No selection to extract");
-            return false;
-        }
-
-        return true;
-    }
-
-    protected boolean validateNotRoot(List<CanvasViewInfo> infos, RefactoringStatus status) {
-        for (CanvasViewInfo info : infos) {
-            if (info.isRoot()) {
-                status.addFatalError("Cannot refactor the root");
-                return false;
-            }
-        }
-
-        return true;
-    }
-
-    protected boolean validateContiguous(List<CanvasViewInfo> infos, RefactoringStatus status) {
-        if (infos.size() > 1) {
-            // All elements must be siblings (e.g. same parent)
-            List<UiViewElementNode> nodes = new ArrayList<UiViewElementNode>(infos
-                    .size());
-            for (CanvasViewInfo info : infos) {
-                UiViewElementNode node = info.getUiViewNode();
-                if (node != null) {
-                    nodes.add(node);
-                }
-            }
-            if (nodes.size() == 0) {
-                status.addFatalError("No selected views");
-                return false;
-            }
-
-            UiElementNode parent = nodes.get(0).getUiParent();
-            for (UiViewElementNode node : nodes) {
-                if (parent != node.getUiParent()) {
-                    status.addFatalError("The selected elements must be adjacent");
-                    return false;
-                }
-            }
-            // Ensure that the siblings are contiguous; no gaps.
-            // If we've selected all the children of the parent then we don't need
-            // to look.
-            List<UiElementNode> siblings = parent.getUiChildren();
-            if (siblings.size() != nodes.size()) {
-                Set<UiViewElementNode> nodeSet = new HashSet<UiViewElementNode>(nodes);
-                boolean inRange = false;
-                int remaining = nodes.size();
-                for (UiElementNode node : siblings) {
-                    boolean in = nodeSet.contains(node);
-                    if (in) {
-                        remaining--;
-                        if (remaining == 0) {
-                            break;
-                        }
-                        inRange = true;
-                    } else if (inRange) {
-                        status.addFatalError("The selected elements must be adjacent");
-                        return false;
-                    }
-                }
-            }
-        }
-
-        return true;
-    }
-
-    /**
-     * Updates the given element with a new name if the current id reflects the old
-     * element type. If the name was changed, it will return the new name.
-     */
-    protected String ensureIdMatchesType(Element element, String newType, MultiTextEdit rootEdit) {
-        String oldType = element.getTagName();
-        if (oldType.indexOf('.') == -1) {
-            oldType = ANDROID_WIDGET_PREFIX + oldType;
-        }
-        String oldTypeBase = oldType.substring(oldType.lastIndexOf('.') + 1);
-        String id = getId(element);
-        if (id == null || id.length() == 0
-                || id.toLowerCase(Locale.US).contains(oldTypeBase.toLowerCase(Locale.US))) {
-            String newTypeBase = newType.substring(newType.lastIndexOf('.') + 1);
-            return ensureHasId(rootEdit, element, newTypeBase);
-        }
-
-        return null;
-    }
-
-    /**
-     * Returns the {@link IndexedRegion} for the given node
-     *
-     * @param node the node to look up the region for
-     * @return the corresponding region, or null
-     */
-    public static IndexedRegion getRegion(Node node) {
-        if (node instanceof IndexedRegion) {
-            return (IndexedRegion) node;
-        }
-
-        return null;
-    }
-
-    protected String ensureHasId(MultiTextEdit rootEdit, Element element, String prefix) {
-        return ensureHasId(rootEdit, element, prefix, true);
-    }
-
-    protected String ensureHasId(MultiTextEdit rootEdit, Element element, String prefix,
-            boolean apply) {
-        String id = mGeneratedIdMap.get(element);
-        if (id != null) {
-            return NEW_ID_PREFIX + id;
-        }
-
-        if (!element.hasAttributeNS(ANDROID_URI, ATTR_ID)
-                || (prefix != null && !getId(element).startsWith(prefix))) {
-            id = DomUtilities.getFreeWidgetId(element, mGeneratedIds, prefix);
-            // Make sure we don't use this one again
-            mGeneratedIds.add(id);
-            mGeneratedIdMap.put(element, id);
-            id = NEW_ID_PREFIX + id;
-            if (apply) {
-                setAttribute(rootEdit, element,
-                        ANDROID_URI, getAndroidNamespacePrefix(), ATTR_ID, id);
-            }
-            return id;
-        }
-
-        return getId(element);
-    }
-
-    protected int getFirstAttributeOffset(Element element) {
-        IndexedRegion region = getRegion(element);
-        if (region != null) {
-            int startOffset = region.getStartOffset();
-            int endOffset = region.getEndOffset();
-            String text = getText(startOffset, endOffset);
-            String name = element.getLocalName();
-            int nameOffset = text.indexOf(name);
-            if (nameOffset != -1) {
-                return startOffset + nameOffset + name.length();
-            }
-        }
-
-        return -1;
-    }
-
-    /**
-     * Returns the id of the given element
-     *
-     * @param element the element to look up the id for
-     * @return the corresponding id, or an empty string (should not be null
-     *         according to the DOM API, but has been observed to be null on
-     *         some versions of Eclipse)
-     */
-    public static String getId(Element element) {
-        return element.getAttributeNS(ANDROID_URI, ATTR_ID);
-    }
-
-    protected String ensureNewId(String id) {
-        if (id != null && id.length() > 0) {
-            if (id.startsWith(ID_PREFIX)) {
-                id = NEW_ID_PREFIX + id.substring(ID_PREFIX.length());
-            } else if (!id.startsWith(NEW_ID_PREFIX)) {
-                id = NEW_ID_PREFIX + id;
-            }
-        } else {
-            id = null;
-        }
-
-        return id;
-    }
-
-    protected String getViewClass(String fqcn) {
-        // Don't include android.widget. as a package prefix in layout files
-        if (fqcn.startsWith(ANDROID_WIDGET_PREFIX)) {
-            fqcn = fqcn.substring(ANDROID_WIDGET_PREFIX.length());
-        }
-
-        return fqcn;
-    }
-
-    protected void setAttribute(MultiTextEdit rootEdit, Element element,
-            String attributeUri,
-            String attributePrefix, String attributeName, String attributeValue) {
-        int offset = getFirstAttributeOffset(element);
-        if (offset != -1) {
-            if (element.hasAttributeNS(attributeUri, attributeName)) {
-                replaceAttributeDeclaration(rootEdit, offset, element, attributePrefix,
-                        attributeUri, attributeName, attributeValue);
-            } else {
-                addAttributeDeclaration(rootEdit, offset, attributePrefix, attributeName,
-                        attributeValue);
-            }
-        }
-    }
-
-    private void addAttributeDeclaration(MultiTextEdit rootEdit, int offset,
-            String attributePrefix, String attributeName, String attributeValue) {
-        StringBuilder sb = new StringBuilder();
-        sb.append(' ');
-
-        if (attributePrefix != null) {
-            sb.append(attributePrefix).append(':');
-        }
-        sb.append(attributeName).append('=').append('"');
-        sb.append(attributeValue).append('"');
-
-        InsertEdit setAttribute = new InsertEdit(offset, sb.toString());
-        rootEdit.addChild(setAttribute);
-    }
-
-    /** Replaces the value declaration of the given attribute */
-    private void replaceAttributeDeclaration(MultiTextEdit rootEdit, int offset,
-            Element element, String attributePrefix, String attributeUri,
-            String attributeName, String attributeValue) {
-        // Find attribute value and replace it
-        IStructuredModel model = mDelegate.getEditor().getModelForRead();
-        try {
-            IStructuredDocument doc = model.getStructuredDocument();
-
-            IStructuredDocumentRegion region = doc.getRegionAtCharacterOffset(offset);
-            ITextRegionList list = region.getRegions();
-            int regionStart = region.getStart();
-
-            int valueStart = -1;
-            boolean useNextValue = false;
-            String targetName = attributePrefix != null
-                ? attributePrefix + ':' + attributeName : attributeName;
-
-            // Look at all attribute values and look for an id reference match
-            for (int j = 0; j < region.getNumberOfRegions(); j++) {
-                ITextRegion subRegion = list.get(j);
-                String type = subRegion.getType();
-                if (DOMRegionContext.XML_TAG_ATTRIBUTE_NAME.equals(type)) {
-                    // What about prefix?
-                    if (targetName.equals(region.getText(subRegion))) {
-                        useNextValue = true;
-                    }
-                } else if (DOMRegionContext.XML_TAG_ATTRIBUTE_VALUE.equals(type)) {
-                    if (useNextValue) {
-                        valueStart = regionStart + subRegion.getStart();
-                        break;
-                    }
-                }
-            }
-
-            if (valueStart != -1) {
-                String oldValue = element.getAttributeNS(attributeUri, attributeName);
-                int start = valueStart + 1; // Skip opening "
-                ReplaceEdit setAttribute = new ReplaceEdit(start, oldValue.length(),
-                        attributeValue);
-                try {
-                    rootEdit.addChild(setAttribute);
-                } catch (MalformedTreeException mte) {
-                    AdtPlugin.log(mte, "Could not replace attribute %1$s with %2$s",
-                            attributeName, attributeValue);
-                    throw mte;
-                }
-            }
-        } finally {
-            model.releaseFromRead();
-        }
-    }
-
-    /** Strips out the given attribute, if defined */
-    protected void removeAttribute(MultiTextEdit rootEdit, Element element, String uri,
-            String attributeName) {
-        if (element.hasAttributeNS(uri, attributeName)) {
-            Attr attribute = element.getAttributeNodeNS(uri, attributeName);
-            removeAttribute(rootEdit, attribute);
-        }
-    }
-
-    /** Strips out the given attribute, if defined */
-    protected void removeAttribute(MultiTextEdit rootEdit, Attr attribute) {
-        IndexedRegion region = getRegion(attribute);
-        if (region != null) {
-            int startOffset = region.getStartOffset();
-            int endOffset = region.getEndOffset();
-            DeleteEdit deletion = new DeleteEdit(startOffset, endOffset - startOffset);
-            rootEdit.addChild(deletion);
-        }
-    }
-
-
-    /**
-     * Removes the given element's opening and closing tags (including all of its
-     * attributes) but leaves any children alone
-     *
-     * @param rootEdit the multi edit to add the removal operation to
-     * @param element the element to delete the open and closing tags for
-     * @param skip a list of elements that should not be modified (for example because they
-     *    are targeted for deletion)
-     *
-     * TODO: Rename this to "unwrap" ? And allow for handling nested deletions.
-     */
-    protected void removeElementTags(MultiTextEdit rootEdit, Element element, List<Element> skip,
-            boolean changeIndentation) {
-        IndexedRegion elementRegion = getRegion(element);
-        if (elementRegion == null) {
-            return;
-        }
-
-        // Look for the opening tag
-        IStructuredModel model = mDelegate.getEditor().getModelForRead();
-        try {
-            int startLineInclusive = -1;
-            int endLineInclusive = -1;
-            IStructuredDocument doc = model.getStructuredDocument();
-            if (doc != null) {
-                int start = elementRegion.getStartOffset();
-                IStructuredDocumentRegion region = doc.getRegionAtCharacterOffset(start);
-                ITextRegionList list = region.getRegions();
-                int regionStart = region.getStart();
-                int startOffset = regionStart;
-                for (int j = 0; j < region.getNumberOfRegions(); j++) {
-                    ITextRegion subRegion = list.get(j);
-                    String type = subRegion.getType();
-                    if (DOMRegionContext.XML_TAG_OPEN.equals(type)) {
-                        startOffset = regionStart + subRegion.getStart();
-                    } else if (DOMRegionContext.XML_TAG_CLOSE.equals(type)) {
-                        int endOffset = regionStart + subRegion.getStart() + subRegion.getLength();
-
-                        DeleteEdit deletion = createDeletion(doc, startOffset, endOffset);
-                        rootEdit.addChild(deletion);
-                        startLineInclusive = doc.getLineOfOffset(endOffset) + 1;
-                        break;
-                    }
-                }
-
-                // Find the close tag
-                // Look at all attribute values and look for an id reference match
-                region = doc.getRegionAtCharacterOffset(elementRegion.getEndOffset()
-                        - element.getTagName().length() - 1);
-                list = region.getRegions();
-                regionStart = region.getStartOffset();
-                startOffset = -1;
-                for (int j = 0; j < region.getNumberOfRegions(); j++) {
-                    ITextRegion subRegion = list.get(j);
-                    String type = subRegion.getType();
-                    if (DOMRegionContext.XML_END_TAG_OPEN.equals(type)) {
-                        startOffset = regionStart + subRegion.getStart();
-                    } else if (DOMRegionContext.XML_TAG_CLOSE.equals(type)) {
-                        int endOffset = regionStart + subRegion.getStart() + subRegion.getLength();
-                        if (startOffset != -1) {
-                            DeleteEdit deletion = createDeletion(doc, startOffset, endOffset);
-                            rootEdit.addChild(deletion);
-                            endLineInclusive = doc.getLineOfOffset(startOffset) - 1;
-                        }
-                        break;
-                    }
-                }
-            }
-
-            // Dedent the contents
-            if (changeIndentation && startLineInclusive != -1 && endLineInclusive != -1) {
-                String indent = AndroidXmlEditor.getIndentAtOffset(doc, getRegion(element)
-                        .getStartOffset());
-                setIndentation(rootEdit, indent, doc, startLineInclusive, endLineInclusive,
-                        element, skip);
-            }
-        } finally {
-            model.releaseFromRead();
-        }
-    }
-
-    protected void removeIndentation(MultiTextEdit rootEdit, String removeIndent,
-            IStructuredDocument doc, int startLineInclusive, int endLineInclusive,
-            Element element, List<Element> skip) {
-        if (startLineInclusive > endLineInclusive) {
-            return;
-        }
-        int indentLength = removeIndent.length();
-        if (indentLength == 0) {
-            return;
-        }
-
-        try {
-            for (int line = startLineInclusive; line <= endLineInclusive; line++) {
-                IRegion info = doc.getLineInformation(line);
-                int lineStart = info.getOffset();
-                int lineLength = info.getLength();
-                int lineEnd = lineStart + lineLength;
-                if (overlaps(lineStart, lineEnd, element, skip)) {
-                    continue;
-                }
-                String lineText = getText(lineStart,
-                        lineStart + Math.min(lineLength, indentLength));
-                if (lineText.startsWith(removeIndent)) {
-                    rootEdit.addChild(new DeleteEdit(lineStart, indentLength));
-                }
-            }
-        } catch (BadLocationException e) {
-            AdtPlugin.log(e, null);
-        }
-    }
-
-    protected void setIndentation(MultiTextEdit rootEdit, String indent,
-            IStructuredDocument doc, int startLineInclusive, int endLineInclusive,
-            Element element, List<Element> skip) {
-        if (startLineInclusive > endLineInclusive) {
-            return;
-        }
-        int indentLength = indent.length();
-        if (indentLength == 0) {
-            return;
-        }
-
-        try {
-            for (int line = startLineInclusive; line <= endLineInclusive; line++) {
-                IRegion info = doc.getLineInformation(line);
-                int lineStart = info.getOffset();
-                int lineLength = info.getLength();
-                int lineEnd = lineStart + lineLength;
-                if (overlaps(lineStart, lineEnd, element, skip)) {
-                    continue;
-                }
-                String lineText = getText(lineStart, lineStart + lineLength);
-                int indentEnd = getFirstNonSpace(lineText);
-                rootEdit.addChild(new ReplaceEdit(lineStart, indentEnd, indent));
-            }
-        } catch (BadLocationException e) {
-            AdtPlugin.log(e, null);
-        }
-    }
-
-    private int getFirstNonSpace(String s) {
-        for (int i = 0; i < s.length(); i++) {
-            if (!Character.isWhitespace(s.charAt(i))) {
-                return i;
-            }
-        }
-
-        return s.length();
-    }
-
-    /** Returns true if the given line overlaps any of the given elements */
-    private static boolean overlaps(int startOffset, int endOffset,
-            Element element, List<Element> overlaps) {
-        for (Element e : overlaps) {
-            if (e == element) {
-                continue;
-            }
-
-            IndexedRegion region = getRegion(e);
-            if (region.getEndOffset() >= startOffset && region.getStartOffset() <= endOffset) {
-                return true;
-            }
-        }
-        return false;
-    }
-
-    protected DeleteEdit createDeletion(IStructuredDocument doc, int startOffset, int endOffset) {
-        // Expand to delete the whole line?
-        try {
-            IRegion info = doc.getLineInformationOfOffset(startOffset);
-            int lineBegin = info.getOffset();
-            // Is the text on the line leading up to the deletion region,
-            // and the text following it, all whitespace?
-            boolean deleteLine = true;
-            if (lineBegin < startOffset) {
-                String prefix = getText(lineBegin, startOffset);
-                if (prefix.trim().length() > 0) {
-                    deleteLine = false;
-                }
-            }
-            info = doc.getLineInformationOfOffset(endOffset);
-            int lineEnd = info.getOffset() + info.getLength();
-            if (lineEnd > endOffset) {
-                String suffix = getText(endOffset, lineEnd);
-                if (suffix.trim().length() > 0) {
-                    deleteLine = false;
-                }
-            }
-            if (deleteLine) {
-                startOffset = lineBegin;
-                endOffset = Math.min(doc.getLength(), lineEnd + 1);
-            }
-        } catch (BadLocationException e) {
-            AdtPlugin.log(e, null);
-        }
-
-
-        return new DeleteEdit(startOffset, endOffset - startOffset);
-    }
-
-    /**
-     * Rewrite the edits in the given {@link MultiTextEdit} such that same edits are
-     * applied, but the resulting range is also formatted
-     */
-    protected MultiTextEdit reformat(MultiTextEdit edit, XmlFormatStyle style) {
-        String xml = mDelegate.getEditor().getStructuredDocument().get();
-        return reformat(xml, edit, style);
-    }
-
-    /**
-     * Rewrite the edits in the given {@link MultiTextEdit} such that same edits are
-     * applied, but the resulting range is also formatted
-     *
-     * @param oldContents the original contents that should be edited by a
-     *            {@link MultiTextEdit}
-     * @param edit the {@link MultiTextEdit} to be applied to some string
-     * @param style the formatting style to use
-     * @return a new {@link MultiTextEdit} which performs the same edits as the input edit
-     *         but also reformats the text
-     */
-    public static MultiTextEdit reformat(String oldContents, MultiTextEdit edit,
-            XmlFormatStyle style) {
-        IDocument document = new org.eclipse.jface.text.Document();
-        document.set(oldContents);
-
-        try {
-            edit.apply(document);
-        } catch (MalformedTreeException e) {
-            AdtPlugin.log(e, null);
-            return null; // Abort formatting
-        } catch (BadLocationException e) {
-            AdtPlugin.log(e, null);
-            return null; // Abort formatting
-        }
-
-        String actual = document.get();
-
-        // TODO: Try to format only the affected portion of the document.
-        // To do that we need to find out what the affected offsets are; we know
-        // the MultiTextEdit's affected range, but that is referring to offsets
-        // in the old document. Use that to compute offsets in the new document.
-        //int distanceFromEnd = actual.length() - edit.getExclusiveEnd();
-        //IStructuredModel model = DomUtilities.createStructuredModel(actual);
-        //int start = edit.getOffset();
-        //int end = actual.length() - distanceFromEnd;
-        //int length = end - start;
-        //TextEdit format = AndroidXmlFormattingStrategy.format(model, start, length);
-        EclipseXmlFormatPreferences formatPrefs = EclipseXmlFormatPreferences.create();
-        String formatted = EclipseXmlPrettyPrinter.prettyPrint(actual, formatPrefs, style,
-                null /*lineSeparator*/);
-
-
-        // Figure out how much of the before and after strings are identical and narrow
-        // the replacement scope
-        boolean foundDifference = false;
-        int firstDifference = 0;
-        int lastDifference = formatted.length();
-        int start = 0;
-        int end = oldContents.length();
-
-        for (int i = 0, j = start; i < formatted.length() && j < end; i++, j++) {
-            if (formatted.charAt(i) != oldContents.charAt(j)) {
-                firstDifference = i;
-                foundDifference = true;
-                break;
-            }
-        }
-
-        if (!foundDifference) {
-            // No differences - the document is already formatted, nothing to do
-            return null;
-        }
-
-        lastDifference = firstDifference + 1;
-        for (int i = formatted.length() - 1, j = end - 1;
-                i > firstDifference && j > start;
-                i--, j--) {
-            if (formatted.charAt(i) != oldContents.charAt(j)) {
-                lastDifference = i + 1;
-                break;
-            }
-        }
-
-        start += firstDifference;
-        end -= (formatted.length() - lastDifference);
-        end = Math.max(start, end);
-        formatted = formatted.substring(firstDifference, lastDifference);
-
-        ReplaceEdit format = new ReplaceEdit(start, end - start,
-                formatted);
-
-        MultiTextEdit newEdit = new MultiTextEdit();
-        newEdit.addChild(format);
-
-        return newEdit;
-    }
-
-    protected ViewElementDescriptor getElementDescriptor(String fqcn) {
-        AndroidTargetData data = mDelegate.getEditor().getTargetData();
-        if (data != null) {
-            return data.getLayoutDescriptors().findDescriptorByClass(fqcn);
-        }
-
-        return null;
-    }
-
-    /** Create a wizard for this refactoring */
-    abstract VisualRefactoringWizard createWizard();
-
-    public abstract static class VisualRefactoringDescriptor extends RefactoringDescriptor {
-        private final Map<String, String> mArguments;
-
-        public VisualRefactoringDescriptor(
-                String id, String project, String description, String comment,
-                Map<String, String> arguments) {
-            super(id, project, description, comment, STRUCTURAL_CHANGE | MULTI_CHANGE);
-            mArguments = arguments;
-        }
-
-        public Map<String, String> getArguments() {
-            return mArguments;
-        }
-
-        protected abstract Refactoring createRefactoring(Map<String, String> args);
-
-        @Override
-        public Refactoring createRefactoring(RefactoringStatus status) throws CoreException {
-            try {
-                return createRefactoring(mArguments);
-            } catch (NullPointerException e) {
-                status.addFatalError("Failed to recreate refactoring from descriptor");
-                return null;
-            }
-        }
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/VisualRefactoringAction.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/VisualRefactoringAction.java
deleted file mode 100644
index f1cc988..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/VisualRefactoringAction.java
+++ /dev/null
@@ -1,170 +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.eclipse.adt.internal.editors.layout.refactoring;
-
-import com.android.ide.eclipse.adt.AdtConstants;
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.ide.eclipse.adt.AdtUtils;
-import com.android.ide.eclipse.adt.internal.editors.layout.LayoutEditorDelegate;
-import com.android.ide.eclipse.adt.internal.editors.layout.gle2.CanvasViewInfo;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.text.ITextSelection;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.ITreeSelection;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IEditorSite;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.IWorkbenchWindowActionDelegate;
-import org.eclipse.ui.part.FileEditorInput;
-
-abstract class VisualRefactoringAction implements IWorkbenchWindowActionDelegate {
-    protected IWorkbenchWindow mWindow;
-    protected ITextSelection mTextSelection;
-    protected ITreeSelection mTreeSelection;
-    protected LayoutEditorDelegate mDelegate;
-    protected IFile mFile;
-
-    /**
-     * Keep track of the current workbench window.
-     */
-    @Override
-    public void init(IWorkbenchWindow window) {
-        mWindow = window;
-    }
-
-    @Override
-    public void dispose() {
-    }
-
-    /**
-     * Examine the selection to determine if the action should be enabled or not.
-     * <p/>
-     * Keep a link to the relevant selection structure
-     */
-    @Override
-    public void selectionChanged(IAction action, ISelection selection) {
-        // Look for selections in XML and in the layout UI editor
-
-        // Note, two kinds of selections are returned here:
-        // ITextSelection on a Java source window
-        // IStructuredSelection in the outline or navigator
-        // This simply deals with the refactoring based on a non-empty selection.
-        // At that point, just enable the action and later decide if it's valid when it actually
-        // runs since we don't have access to the AST yet.
-
-        mTextSelection = null;
-        mTreeSelection = null;
-        mFile = null;
-
-        IEditorPart editor = null;
-
-        if (selection instanceof ITextSelection) {
-            mTextSelection = (ITextSelection) selection;
-            editor = AdtUtils.getActiveEditor();
-            mFile = getSelectedFile(editor);
-        } else if (selection instanceof ITreeSelection) {
-             Object firstElement = ((ITreeSelection)selection).getFirstElement();
-             if (firstElement instanceof CanvasViewInfo) {
-                 mTreeSelection = (ITreeSelection) selection;
-                 editor = AdtUtils.getActiveEditor();
-                 mFile = getSelectedFile(editor);
-             }
-        }
-
-        mDelegate = LayoutEditorDelegate.fromEditor(editor);
-
-        action.setEnabled((mTextSelection != null || mTreeSelection != null)
-                && mFile != null && mDelegate != null);
-    }
-
-    /**
-     * Create a new instance of our refactoring and a wizard to configure it.
-     */
-    @Override
-    public abstract void run(IAction action);
-
-    /**
-     * Returns the active {@link IFile} (hopefully matching our selection) or null.
-     * The file is only returned if it's a file from a project with an Android nature.
-     * <p/>
-     * At that point we do not try to analyze if the selection nor the file is suitable
-     * for the refactoring. This check is performed when the refactoring is invoked since
-     * it can then produce meaningful error messages as needed.
-     */
-    private IFile getSelectedFile(IEditorPart editor) {
-        if (editor != null) {
-            IEditorInput input = editor.getEditorInput();
-
-            if (input instanceof FileEditorInput) {
-                FileEditorInput fi = (FileEditorInput) input;
-                IFile file = fi.getFile();
-                if (file.exists()) {
-                    IProject proj = file.getProject();
-                    try {
-                        if (proj != null && proj.hasNature(AdtConstants.NATURE_DEFAULT)) {
-                            return file;
-                        }
-                    } catch (CoreException e) {
-                        // ignore
-                    }
-                }
-            }
-        }
-
-        return null;
-    }
-
-    public static IAction create(String title, LayoutEditorDelegate editorDelegate,
-            Class<? extends VisualRefactoringAction> clz) {
-        return new ActionWrapper(title, editorDelegate, clz);
-    }
-
-    private static class ActionWrapper extends Action {
-        private Class<? extends VisualRefactoringAction> mClass;
-        private LayoutEditorDelegate mEditorDelegate;
-
-        ActionWrapper(String title, LayoutEditorDelegate editorDelegate,
-                Class<? extends VisualRefactoringAction> clz) {
-            super(title);
-            mEditorDelegate = editorDelegate;
-            mClass = clz;
-        }
-
-        @Override
-        public void run() {
-            VisualRefactoringAction action;
-            try {
-                action = mClass.newInstance();
-            } catch (Exception e) {
-                AdtPlugin.log(e, null);
-                return;
-            }
-            IEditorSite site = mEditorDelegate.getEditor().getEditorSite();
-            action.init(site.getWorkbenchWindow());
-            ISelection selection = site.getSelectionProvider().getSelection();
-            action.selectionChanged(ActionWrapper.this, selection);
-            if (isEnabled()) {
-                action.run(ActionWrapper.this);
-            }
-        }
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/VisualRefactoringWizard.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/VisualRefactoringWizard.java
deleted file mode 100644
index c103e47..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/VisualRefactoringWizard.java
+++ /dev/null
@@ -1,76 +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.eclipse.adt.internal.editors.layout.refactoring;
-
-import com.android.ide.eclipse.adt.internal.editors.layout.LayoutEditorDelegate;
-
-import org.eclipse.ltk.core.refactoring.Refactoring;
-import org.eclipse.ltk.ui.refactoring.RefactoringWizard;
-import org.eclipse.ltk.ui.refactoring.UserInputWizardPage;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-
-public abstract class VisualRefactoringWizard extends RefactoringWizard {
-    protected final LayoutEditorDelegate mDelegate;
-
-    public VisualRefactoringWizard(Refactoring refactoring, LayoutEditorDelegate editor) {
-        super(refactoring, DIALOG_BASED_USER_INTERFACE | PREVIEW_EXPAND_FIRST_NODE);
-        mDelegate = editor;
-    }
-
-    @Override
-    public boolean performFinish() {
-        mDelegate.getEditor().setIgnoreXmlUpdate(true);
-        try {
-            return super.performFinish();
-        } finally {
-            mDelegate.getEditor().setIgnoreXmlUpdate(false);
-            mDelegate.refreshXmlModel();
-        }
-    }
-
-    protected abstract static class VisualRefactoringInputPage extends UserInputWizardPage {
-        public VisualRefactoringInputPage(String name) {
-            super(name);
-        }
-
-        /**
-         * Listener which can be attached on any widget in the wizard page to force
-         * modifications of the associated widget to validate the page again
-         */
-        protected ModifyListener mModifyValidateListener = new ModifyListener() {
-            @Override
-            public void modifyText(ModifyEvent e) {
-                validatePage();
-            }
-        };
-
-        /**
-         * Listener which can be attached on any widget in the wizard page to force
-         * selection changes of the associated widget to validate the page again
-         */
-        protected SelectionAdapter mSelectionValidateListener = new SelectionAdapter() {
-            @Override
-            public void widgetSelected(SelectionEvent e) {
-                validatePage();
-            }
-        };
-
-        protected abstract boolean validatePage();
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/WrapInAction.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/WrapInAction.java
deleted file mode 100644
index 1cd6659..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/WrapInAction.java
+++ /dev/null
@@ -1,47 +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.eclipse.adt.internal.editors.layout.refactoring;
-
-import com.android.ide.eclipse.adt.internal.editors.layout.LayoutEditorDelegate;
-
-import org.eclipse.jface.action.IAction;
-import org.eclipse.ltk.ui.refactoring.RefactoringWizard;
-import org.eclipse.ltk.ui.refactoring.RefactoringWizardOpenOperation;
-
-/**
- * Action executed when the "Wrap In" menu item is invoked.
- */
-public class WrapInAction extends VisualRefactoringAction {
-    @Override
-    public void run(IAction action) {
-        if ((mTextSelection != null || mTreeSelection != null) && mFile != null) {
-            WrapInRefactoring ref = new WrapInRefactoring(mFile, mDelegate,
-                    mTextSelection, mTreeSelection);
-            RefactoringWizard wizard = new WrapInWizard(ref, mDelegate);
-            RefactoringWizardOpenOperation op = new RefactoringWizardOpenOperation(wizard);
-            try {
-                op.run(mWindow.getShell(), wizard.getDefaultPageTitle());
-            } catch (InterruptedException e) {
-                // Interrupted. Pass.
-            }
-        }
-    }
-
-    public static IAction create(LayoutEditorDelegate editorDelegate) {
-        return create("Wrap in Container...", editorDelegate, WrapInAction.class);
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/WrapInContribution.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/WrapInContribution.java
deleted file mode 100644
index 61d7987..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/WrapInContribution.java
+++ /dev/null
@@ -1,40 +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.eclipse.adt.internal.editors.layout.refactoring;
-
-import org.eclipse.ltk.core.refactoring.RefactoringContribution;
-import org.eclipse.ltk.core.refactoring.RefactoringDescriptor;
-
-import java.util.Map;
-
-public class WrapInContribution extends RefactoringContribution {
-
-    @SuppressWarnings("unchecked")
-    @Override
-    public RefactoringDescriptor createDescriptor(String id, String project, String description,
-            String comment, Map arguments, int flags) throws IllegalArgumentException {
-        return new WrapInRefactoring.Descriptor(project, description, comment, arguments);
-    }
-
-    @SuppressWarnings("unchecked")
-    @Override
-    public Map retrieveArgumentMap(RefactoringDescriptor descriptor) {
-        if (descriptor instanceof WrapInRefactoring.Descriptor) {
-            return ((WrapInRefactoring.Descriptor) descriptor).getArguments();
-        }
-        return super.retrieveArgumentMap(descriptor);
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/WrapInRefactoring.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/WrapInRefactoring.java
deleted file mode 100644
index 07b00b8..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/WrapInRefactoring.java
+++ /dev/null
@@ -1,439 +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.eclipse.adt.internal.editors.layout.refactoring;
-
-import static com.android.SdkConstants.ANDROID_NS_NAME_PREFIX;
-import static com.android.SdkConstants.ANDROID_URI;
-import static com.android.SdkConstants.ANDROID_WIDGET_PREFIX;
-import static com.android.SdkConstants.ATTR_ID;
-import static com.android.SdkConstants.ATTR_LAYOUT_HEIGHT;
-import static com.android.SdkConstants.ATTR_LAYOUT_WIDTH;
-import static com.android.SdkConstants.EXT_XML;
-import static com.android.SdkConstants.VALUE_FILL_PARENT;
-import static com.android.SdkConstants.VALUE_MATCH_PARENT;
-import static com.android.SdkConstants.VALUE_WRAP_CONTENT;
-
-import com.android.annotations.NonNull;
-import com.android.annotations.VisibleForTesting;
-import com.android.ide.common.xml.XmlFormatStyle;
-import com.android.ide.eclipse.adt.internal.editors.AndroidXmlEditor;
-import com.android.ide.eclipse.adt.internal.editors.layout.LayoutEditorDelegate;
-import com.android.ide.eclipse.adt.internal.editors.layout.gle2.CanvasViewInfo;
-import com.android.ide.eclipse.adt.internal.preferences.AdtPrefs;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.OperationCanceledException;
-import org.eclipse.jface.text.ITextSelection;
-import org.eclipse.jface.viewers.ITreeSelection;
-import org.eclipse.ltk.core.refactoring.Change;
-import org.eclipse.ltk.core.refactoring.Refactoring;
-import org.eclipse.ltk.core.refactoring.RefactoringStatus;
-import org.eclipse.ltk.core.refactoring.TextFileChange;
-import org.eclipse.text.edits.DeleteEdit;
-import org.eclipse.text.edits.InsertEdit;
-import org.eclipse.text.edits.MultiTextEdit;
-import org.eclipse.text.edits.TextEdit;
-import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
-import org.eclipse.wst.sse.core.internal.provisional.IndexedRegion;
-import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;
-import org.w3c.dom.Attr;
-import org.w3c.dom.Element;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-
-/**
- * Inserts a new layout surrounding the current selection, migrates namespace
- * attributes (if wrapping the root node), and optionally migrates layout
- * attributes and updates references elsewhere.
- */
-@SuppressWarnings("restriction") // XML model
-public class WrapInRefactoring extends VisualRefactoring {
-    private static final String KEY_ID = "name";                           //$NON-NLS-1$
-    private static final String KEY_TYPE = "type";                         //$NON-NLS-1$
-
-    private String mId;
-    private String mTypeFqcn;
-    private String mInitializedAttributes;
-
-    /**
-     * This constructor is solely used by {@link Descriptor},
-     * to replay a previous refactoring.
-     * @param arguments argument map created by #createArgumentMap.
-     */
-    WrapInRefactoring(Map<String, String> arguments) {
-        super(arguments);
-        mId = arguments.get(KEY_ID);
-        mTypeFqcn = arguments.get(KEY_TYPE);
-    }
-
-    public WrapInRefactoring(
-            IFile file,
-            LayoutEditorDelegate delegate,
-            ITextSelection selection,
-            ITreeSelection treeSelection) {
-        super(file, delegate, selection, treeSelection);
-    }
-
-    @VisibleForTesting
-    WrapInRefactoring(List<Element> selectedElements, LayoutEditorDelegate editor) {
-        super(selectedElements, editor);
-    }
-
-    @Override
-    public RefactoringStatus checkInitialConditions(IProgressMonitor pm) throws CoreException,
-            OperationCanceledException {
-        RefactoringStatus status = new RefactoringStatus();
-
-        try {
-            pm.beginTask("Checking preconditions...", 6);
-
-            if (mSelectionStart == -1 || mSelectionEnd == -1) {
-                status.addFatalError("No selection to wrap");
-                return status;
-            }
-
-            // Make sure the selection is contiguous
-            if (mTreeSelection != null) {
-                // TODO - don't do this if we based the selection on text. In this case,
-                // make sure we're -balanced-.
-
-                List<CanvasViewInfo> infos = getSelectedViewInfos();
-                if (!validateNotEmpty(infos, status)) {
-                    return status;
-                }
-
-                // Enforce that the selection is -contiguous-
-                if (!validateContiguous(infos, status)) {
-                    return status;
-                }
-            }
-
-            // Ensures that we have a valid DOM model:
-            if (mElements.size() == 0) {
-                status.addFatalError("Nothing to wrap");
-                return status;
-            }
-
-            pm.worked(1);
-            return status;
-
-        } finally {
-            pm.done();
-        }
-    }
-
-    @Override
-    protected VisualRefactoringDescriptor createDescriptor() {
-        String comment = getName();
-        return new Descriptor(
-                mProject.getName(), //project
-                comment, //description
-                comment, //comment
-                createArgumentMap());
-    }
-
-    @Override
-    protected Map<String, String> createArgumentMap() {
-        Map<String, String> args = super.createArgumentMap();
-        args.put(KEY_TYPE, mTypeFqcn);
-        args.put(KEY_ID, mId);
-
-        return args;
-    }
-
-    @Override
-    public String getName() {
-        return "Wrap in Container";
-    }
-
-    void setId(String id) {
-        mId = id;
-    }
-
-    void setType(String typeFqcn) {
-        mTypeFqcn = typeFqcn;
-    }
-
-    void setInitializedAttributes(String initializedAttributes) {
-        mInitializedAttributes = initializedAttributes;
-    }
-
-    @Override
-    protected @NonNull List<Change> computeChanges(IProgressMonitor monitor) {
-        // (1) Insert the new container in front of the beginning of the
-        //      first wrapped view
-        // (2) If the container is the new root, transfer namespace declarations
-        //      to it
-        // (3) Insert the closing tag of the new container at the end of the
-        //      last wrapped view
-        // (4) Reindent the wrapped views
-        // (5) If the user requested it, update all layout references to the
-        //      wrapped views with the new container?
-        //   For that matter, does RelativeLayout even require it? Probably not,
-        //   it can point inside the current layout...
-
-        // Add indent to all lines between mSelectionStart and mEnd
-        // TODO: Figure out the indentation amount?
-        // For now, use 4 spaces
-        String indentUnit = "    "; //$NON-NLS-1$
-        boolean separateAttributes = true;
-        IStructuredDocument document = mDelegate.getEditor().getStructuredDocument();
-        String startIndent = AndroidXmlEditor.getIndentAtOffset(document, mSelectionStart);
-
-        String viewClass = getViewClass(mTypeFqcn);
-        String androidNsPrefix = getAndroidNamespacePrefix();
-
-
-        IFile file = mDelegate.getEditor().getInputFile();
-        List<Change> changes = new ArrayList<Change>();
-        if (file == null) {
-            return changes;
-        }
-        TextFileChange change = new TextFileChange(file.getName(), file);
-        MultiTextEdit rootEdit = new MultiTextEdit();
-        change.setTextType(EXT_XML);
-
-        String id = ensureNewId(mId);
-
-        // Update any layout references to the old id with the new id
-        if (id != null) {
-            String rootId = getRootId();
-            IStructuredModel model = mDelegate.getEditor().getModelForRead();
-            try {
-                IStructuredDocument doc = model.getStructuredDocument();
-                if (doc != null) {
-                    List<TextEdit> replaceIds = replaceIds(androidNsPrefix,
-                            doc, mSelectionStart, mSelectionEnd, rootId, id);
-                    for (TextEdit edit : replaceIds) {
-                        rootEdit.addChild(edit);
-                    }
-                }
-            } finally {
-                model.releaseFromRead();
-            }
-        }
-
-        // Insert namespace elements?
-        StringBuilder namespace = null;
-        List<DeleteEdit> deletions = new ArrayList<DeleteEdit>();
-        Element primary = getPrimaryElement();
-        if (primary != null && getDomDocument().getDocumentElement() == primary) {
-            namespace = new StringBuilder();
-
-            List<Attr> declarations = findNamespaceAttributes(primary);
-            for (Attr attribute : declarations) {
-                if (attribute instanceof IndexedRegion) {
-                    // Delete the namespace declaration in the node which is no longer the root
-                    IndexedRegion region = (IndexedRegion) attribute;
-                    int startOffset = region.getStartOffset();
-                    int endOffset = region.getEndOffset();
-                    String text = getText(startOffset, endOffset);
-                    DeleteEdit deletion = new DeleteEdit(startOffset, endOffset - startOffset);
-                    deletions.add(deletion);
-                    rootEdit.addChild(deletion);
-                    text = text.trim();
-
-                    // Insert the namespace declaration in the new root
-                    if (separateAttributes) {
-                        namespace.append('\n').append(startIndent).append(indentUnit);
-                    } else {
-                        namespace.append(' ');
-                    }
-                    namespace.append(text);
-                }
-            }
-        }
-
-        // Insert begin tag: <type ...>
-        StringBuilder sb = new StringBuilder();
-        sb.append('<');
-        sb.append(viewClass);
-
-        if (namespace != null) {
-            sb.append(namespace);
-        }
-
-        // Set the ID if any
-        if (id != null) {
-            if (separateAttributes) {
-                sb.append('\n').append(startIndent).append(indentUnit);
-            } else {
-                sb.append(' ');
-            }
-            sb.append(androidNsPrefix).append(':');
-            sb.append(ATTR_ID).append('=').append('"').append(id).append('"');
-        }
-
-        // If any of the elements are fill/match parent, use that instead
-        String width = VALUE_WRAP_CONTENT;
-        String height = VALUE_WRAP_CONTENT;
-
-        for (Element element : getElements()) {
-            String oldWidth = element.getAttributeNS(ANDROID_URI, ATTR_LAYOUT_WIDTH);
-            String oldHeight = element.getAttributeNS(ANDROID_URI, ATTR_LAYOUT_HEIGHT);
-
-            if (VALUE_MATCH_PARENT.equals(oldWidth) || VALUE_FILL_PARENT.equals(oldWidth)) {
-                width = oldWidth;
-            }
-            if (VALUE_MATCH_PARENT.equals(oldHeight) || VALUE_FILL_PARENT.equals(oldHeight)) {
-                height = oldHeight;
-            }
-        }
-
-        // Add in width/height.
-        if (separateAttributes) {
-            sb.append('\n').append(startIndent).append(indentUnit);
-        } else {
-            sb.append(' ');
-        }
-        sb.append(androidNsPrefix).append(':');
-        sb.append(ATTR_LAYOUT_WIDTH).append('=').append('"').append(width).append('"');
-
-        if (separateAttributes) {
-            sb.append('\n').append(startIndent).append(indentUnit);
-        } else {
-            sb.append(' ');
-        }
-        sb.append(androidNsPrefix).append(':');
-        sb.append(ATTR_LAYOUT_HEIGHT).append('=').append('"').append(height).append('"');
-
-        if (mInitializedAttributes != null && mInitializedAttributes.length() > 0) {
-            for (String s : mInitializedAttributes.split(",")) { //$NON-NLS-1$
-                sb.append(' ');
-                String[] nameValue = s.split("="); //$NON-NLS-1$
-                String name = nameValue[0];
-                String value = nameValue[1];
-                if (name.startsWith(ANDROID_NS_NAME_PREFIX)) {
-                    name = name.substring(ANDROID_NS_NAME_PREFIX.length());
-                    sb.append(androidNsPrefix).append(':');
-                }
-                sb.append(name).append('=').append('"').append(value).append('"');
-            }
-        }
-
-        // Transfer layout_ attributes (other than width and height)
-        if (primary != null) {
-            List<Attr> layoutAttributes = findLayoutAttributes(primary);
-            for (Attr attribute : layoutAttributes) {
-                String name = attribute.getLocalName();
-                if ((name.equals(ATTR_LAYOUT_WIDTH) || name.equals(ATTR_LAYOUT_HEIGHT))
-                        && ANDROID_URI.equals(attribute.getNamespaceURI())) {
-                    // Already handled specially
-                    continue;
-                }
-
-                if (attribute instanceof IndexedRegion) {
-                    IndexedRegion region = (IndexedRegion) attribute;
-                    int startOffset = region.getStartOffset();
-                    int endOffset = region.getEndOffset();
-                    String text = getText(startOffset, endOffset);
-                    DeleteEdit deletion = new DeleteEdit(startOffset, endOffset - startOffset);
-                    rootEdit.addChild(deletion);
-                    deletions.add(deletion);
-
-                    if (separateAttributes) {
-                        sb.append('\n').append(startIndent).append(indentUnit);
-                    } else {
-                        sb.append(' ');
-                    }
-                    sb.append(text.trim());
-                }
-            }
-        }
-
-        // Finish open tag:
-        sb.append('>');
-        sb.append('\n').append(startIndent).append(indentUnit);
-
-        InsertEdit beginEdit = new InsertEdit(mSelectionStart, sb.toString());
-        rootEdit.addChild(beginEdit);
-
-        String nested = getText(mSelectionStart, mSelectionEnd);
-        int index = 0;
-        while (index != -1) {
-            index = nested.indexOf('\n', index);
-            if (index != -1) {
-                index++;
-                InsertEdit newline = new InsertEdit(mSelectionStart + index, indentUnit);
-                // Some of the deleted namespaces may have had newlines - be careful
-                // not to overlap edits
-                boolean covered = false;
-                for (DeleteEdit deletion : deletions) {
-                    if (deletion.covers(newline)) {
-                        covered = true;
-                        break;
-                    }
-                }
-                if (!covered) {
-                    rootEdit.addChild(newline);
-                }
-            }
-        }
-
-        // Insert end tag: </type>
-        sb.setLength(0);
-        sb.append('\n').append(startIndent);
-        sb.append('<').append('/').append(viewClass).append('>');
-        InsertEdit endEdit = new InsertEdit(mSelectionEnd, sb.toString());
-        rootEdit.addChild(endEdit);
-
-        if (AdtPrefs.getPrefs().getFormatGuiXml()) {
-            MultiTextEdit formatted = reformat(rootEdit, XmlFormatStyle.LAYOUT);
-            if (formatted != null) {
-                rootEdit = formatted;
-            }
-        }
-
-        change.setEdit(rootEdit);
-        changes.add(change);
-        return changes;
-    }
-
-    String getOldType() {
-        Element primary = getPrimaryElement();
-        if (primary != null) {
-            String oldType = primary.getTagName();
-            if (oldType.indexOf('.') == -1) {
-                oldType = ANDROID_WIDGET_PREFIX + oldType;
-            }
-            return oldType;
-        }
-
-        return null;
-    }
-
-    @Override
-    VisualRefactoringWizard createWizard() {
-        return new WrapInWizard(this, mDelegate);
-    }
-
-    public static class Descriptor extends VisualRefactoringDescriptor {
-        public Descriptor(String project, String description, String comment,
-                Map<String, String> arguments) {
-            super("com.android.ide.eclipse.adt.refactoring.wrapin", //$NON-NLS-1$
-                    project, description, comment, arguments);
-        }
-
-        @Override
-        protected Refactoring createRefactoring(Map<String, String> args) {
-            return new WrapInRefactoring(args);
-        }
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/WrapInWizard.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/WrapInWizard.java
deleted file mode 100644
index 2e06a3b..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/WrapInWizard.java
+++ /dev/null
@@ -1,268 +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.eclipse.adt.internal.editors.layout.refactoring;
-
-import static com.android.SdkConstants.FQCN_GESTURE_OVERLAY_VIEW;
-import static com.android.SdkConstants.FQCN_LINEAR_LAYOUT;
-import static com.android.SdkConstants.FQCN_RADIO_BUTTON;
-import static com.android.SdkConstants.GESTURE_OVERLAY_VIEW;
-import static com.android.SdkConstants.RADIO_GROUP;
-import static com.android.SdkConstants.VIEW_INCLUDE;
-
-import com.android.ide.eclipse.adt.internal.editors.layout.LayoutEditorDelegate;
-import com.android.ide.eclipse.adt.internal.editors.layout.descriptors.ViewElementDescriptor;
-import com.android.ide.eclipse.adt.internal.editors.layout.gle2.CustomViewFinder;
-import com.android.ide.eclipse.adt.internal.editors.layout.gre.PaletteMetadataDescriptor;
-import com.android.ide.eclipse.adt.internal.editors.layout.gre.ViewMetadataRepository;
-import com.android.ide.eclipse.adt.internal.resources.ResourceNameValidator;
-import com.android.ide.eclipse.adt.internal.sdk.AndroidTargetData;
-import com.android.ide.eclipse.adt.internal.sdk.Sdk;
-import com.android.resources.ResourceType;
-import com.android.sdklib.IAndroidTarget;
-import com.android.utils.Pair;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Combo;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Text;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-import java.util.Set;
-
-public class WrapInWizard extends VisualRefactoringWizard {
-    private static final String SEPARATOR_LABEL =
-        "----------------------------------------"; //$NON-NLS-1$
-
-    public WrapInWizard(WrapInRefactoring ref, LayoutEditorDelegate editor) {
-        super(ref, editor);
-        setDefaultPageTitle("Wrap in Container");
-    }
-
-    @Override
-    protected void addUserInputPages() {
-        WrapInRefactoring ref = (WrapInRefactoring) getRefactoring();
-        String oldType = ref.getOldType();
-        addPage(new InputPage(mDelegate.getEditor().getProject(), oldType));
-    }
-
-    /** Wizard page which inputs parameters for the {@link WrapInRefactoring} operation */
-    private static class InputPage extends VisualRefactoringInputPage {
-        private final IProject mProject;
-        private final String mOldType;
-        private Text mIdText;
-        private Combo mTypeCombo;
-        private List<Pair<String, ViewElementDescriptor>> mClassNames;
-
-        public InputPage(IProject project, String oldType) {
-            super("WrapInInputPage");  //$NON-NLS-1$
-            mProject = project;
-            mOldType = oldType;
-        }
-
-        @Override
-        public void createControl(Composite parent) {
-            Composite composite = new Composite(parent, SWT.NONE);
-            composite.setLayout(new GridLayout(2, false));
-
-            Label typeLabel = new Label(composite, SWT.NONE);
-            typeLabel.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1));
-            typeLabel.setText("Type of Container:");
-
-            mTypeCombo = new Combo(composite, SWT.READ_ONLY);
-            mTypeCombo.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
-            mTypeCombo.addSelectionListener(mSelectionValidateListener);
-
-            Label idLabel = new Label(composite, SWT.NONE);
-            idLabel.setText("New Layout Id:");
-            idLabel.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1));
-
-            mIdText = new Text(composite, SWT.BORDER);
-            mIdText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
-            mIdText.addModifyListener(mModifyValidateListener);
-
-            Set<String> exclude = Collections.singleton(VIEW_INCLUDE);
-            mClassNames = addLayouts(mProject, mOldType, mTypeCombo, exclude, true);
-            mTypeCombo.select(0);
-
-            setControl(composite);
-            validatePage();
-
-            mTypeCombo.setFocus();
-        }
-
-        @Override
-        protected boolean validatePage() {
-            boolean ok = true;
-
-            String id = mIdText.getText().trim();
-
-            if (id.length() == 0) {
-                setErrorMessage("ID required");
-                ok = false;
-            } else {
-                // ...but if you do, it has to be valid!
-                ResourceNameValidator validator = ResourceNameValidator.create(false, mProject,
-                        ResourceType.ID);
-                String message = validator.isValid(id);
-                if (message != null) {
-                    setErrorMessage(message);
-                    ok = false;
-                }
-            }
-
-            int selectionIndex = mTypeCombo.getSelectionIndex();
-            String type = selectionIndex != -1 ? mClassNames.get(selectionIndex).getFirst() : null;
-            if (type == null) {
-                setErrorMessage("Select a container type");
-                ok = false; // The user has chosen a separator
-            }
-
-            if (ok) {
-                setErrorMessage(null);
-
-                // Record state
-                WrapInRefactoring refactoring =
-                    (WrapInRefactoring) getRefactoring();
-                refactoring.setId(id);
-                refactoring.setType(type);
-
-                ViewElementDescriptor descriptor = mClassNames.get(selectionIndex).getSecond();
-                if (descriptor instanceof PaletteMetadataDescriptor) {
-                    PaletteMetadataDescriptor paletteDescriptor =
-                        (PaletteMetadataDescriptor) descriptor;
-                    String initializedAttributes = paletteDescriptor.getInitializedAttributes();
-                    refactoring.setInitializedAttributes(initializedAttributes);
-                } else {
-                    refactoring.setInitializedAttributes(null);
-                }
-            }
-
-            setPageComplete(ok);
-            return ok;
-        }
-    }
-
-    static List<Pair<String, ViewElementDescriptor>> addLayouts(IProject project,
-            String oldType, Combo combo,
-            Set<String> exclude, boolean addGestureOverlay) {
-        List<Pair<String, ViewElementDescriptor>> classNames =
-            new ArrayList<Pair<String, ViewElementDescriptor>>();
-
-        if (oldType != null && oldType.equals(FQCN_RADIO_BUTTON)) {
-            combo.add(RADIO_GROUP);
-            // NOT a fully qualified name since android widgets do not include the package
-            classNames.add(Pair.of(RADIO_GROUP, (ViewElementDescriptor) null));
-
-            combo.add(SEPARATOR_LABEL);
-            classNames.add(Pair.<String,ViewElementDescriptor>of(null, null));
-        }
-
-        Pair<List<String>,List<String>> result = CustomViewFinder.findViews(project, true);
-        List<String> customViews = result.getFirst();
-        List<String> thirdPartyViews = result.getSecond();
-        if (customViews.size() > 0) {
-            for (String view : customViews) {
-                combo.add(view);
-                classNames.add(Pair.of(view, (ViewElementDescriptor) null));
-            }
-            combo.add(SEPARATOR_LABEL);
-            classNames.add(Pair.<String,ViewElementDescriptor>of(null, null));
-        }
-
-        // Populate type combo
-        Sdk currentSdk = Sdk.getCurrent();
-        if (currentSdk != null) {
-            IAndroidTarget target = currentSdk.getTarget(project);
-            if (target != null) {
-                AndroidTargetData targetData = currentSdk.getTargetData(target);
-                if (targetData != null) {
-                    ViewMetadataRepository repository = ViewMetadataRepository.get();
-                    List<Pair<String,List<ViewElementDescriptor>>> entries =
-                        repository.getPaletteEntries(targetData, false, true);
-                    // Find the layout category - it contains LinearLayout
-                    List<ViewElementDescriptor> layoutDescriptors = null;
-
-                    search: for (Pair<String,List<ViewElementDescriptor>> pair : entries) {
-                        List<ViewElementDescriptor> list = pair.getSecond();
-                        for (ViewElementDescriptor d : list) {
-                            if (d.getFullClassName().equals(FQCN_LINEAR_LAYOUT)) {
-                                // Found - use this list
-                                layoutDescriptors = list;
-                                break search;
-                            }
-                        }
-                    }
-                    if (layoutDescriptors != null) {
-                        for (ViewElementDescriptor d : layoutDescriptors) {
-                            String className = d.getFullClassName();
-                            if (exclude == null || !exclude.contains(className)) {
-                                combo.add(d.getUiName());
-                                classNames.add(Pair.of(className, d));
-                            }
-                        }
-
-                        // SWT does not support separators in combo boxes
-                        combo.add(SEPARATOR_LABEL);
-                        classNames.add(null);
-
-                        if (thirdPartyViews.size() > 0) {
-                            for (String view : thirdPartyViews) {
-                                combo.add(view);
-                                classNames.add(Pair.of(view, (ViewElementDescriptor) null));
-                            }
-                            combo.add(SEPARATOR_LABEL);
-                            classNames.add(null);
-                        }
-
-                        if (addGestureOverlay) {
-                            combo.add(GESTURE_OVERLAY_VIEW);
-                            classNames.add(Pair.<String, ViewElementDescriptor> of(
-                                    FQCN_GESTURE_OVERLAY_VIEW, null));
-
-                            combo.add(SEPARATOR_LABEL);
-                            classNames.add(Pair.<String,ViewElementDescriptor>of(null, null));
-                        }
-                    }
-
-                    // Now add ALL known layout descriptors in case the user has
-                    // a special case
-                    layoutDescriptors =
-                        targetData.getLayoutDescriptors().getLayoutDescriptors();
-
-                    for (ViewElementDescriptor d : layoutDescriptors) {
-                        String className = d.getFullClassName();
-                        if (exclude == null || !exclude.contains(className)) {
-                            combo.add(d.getUiName());
-                            classNames.add(Pair.of(className, d));
-                        }
-                    }
-                }
-            }
-        } else {
-            combo.add("SDK not initialized");
-            classNames.add(Pair.<String,ViewElementDescriptor>of(null, null));
-        }
-
-        return classNames;
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/uimodel/UiViewElementNode.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/uimodel/UiViewElementNode.java
deleted file mode 100644
index d9d2722..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/uimodel/UiViewElementNode.java
+++ /dev/null
@@ -1,208 +0,0 @@
-/*
- * 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.editors.layout.uimodel;
-
-import static com.android.SdkConstants.ANDROID_NS_NAME;
-import static com.android.SdkConstants.ANDROID_URI;
-import static com.android.SdkConstants.ATTR_CLASS;
-import static com.android.SdkConstants.ATTR_ORIENTATION;
-import static com.android.SdkConstants.FQCN_FRAME_LAYOUT;
-import static com.android.SdkConstants.LINEAR_LAYOUT;
-import static com.android.SdkConstants.VALUE_VERTICAL;
-import static com.android.SdkConstants.VIEW_TAG;
-
-import com.android.ide.eclipse.adt.AdtPlugin;
-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.descriptors.AttributeDescriptor;
-import com.android.ide.eclipse.adt.internal.editors.descriptors.ElementDescriptor;
-import com.android.ide.eclipse.adt.internal.editors.descriptors.XmlnsAttributeDescriptor;
-import com.android.ide.eclipse.adt.internal.editors.layout.LayoutEditorDelegate;
-import com.android.ide.eclipse.adt.internal.editors.layout.descriptors.LayoutDescriptors;
-import com.android.ide.eclipse.adt.internal.editors.layout.descriptors.ViewElementDescriptor;
-import com.android.ide.eclipse.adt.internal.editors.uimodel.UiDocumentNode;
-import com.android.ide.eclipse.adt.internal.editors.uimodel.UiElementNode;
-import com.android.ide.eclipse.adt.internal.sdk.AndroidTargetData;
-import com.android.ide.eclipse.adt.internal.sdk.Sdk;
-import com.android.sdklib.IAndroidTarget;
-
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.swt.graphics.Image;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-
-/**
- * Specialized version of {@link UiElementNode} for the {@link ViewElementDescriptor}s.
- */
-public class UiViewElementNode extends UiElementNode {
-
-    /** An AttributeDescriptor array that depends on the current UiParent. */
-    private AttributeDescriptor[] mCachedAttributeDescriptors;
-
-    public UiViewElementNode(ViewElementDescriptor elementDescriptor) {
-        super(elementDescriptor);
-    }
-
-    /**
-     * Returns an AttributeDescriptor array that depends on the current UiParent.
-     * <p/>
-     * The array merges both "direct" attributes with the descriptor layout attributes.
-     * The array instance is cached and cleared if the UiParent is changed.
-     */
-    @Override
-    public AttributeDescriptor[] getAttributeDescriptors() {
-        if (!getDescriptor().syncAttributes()) {
-            mCachedAttributeDescriptors = null;
-        }
-        if (mCachedAttributeDescriptors != null) {
-            return mCachedAttributeDescriptors;
-        }
-
-        UiElementNode ui_parent = getUiParent();
-        AttributeDescriptor[] direct_attrs = super.getAttributeDescriptors();
-        mCachedAttributeDescriptors = direct_attrs;
-
-        // Compute layout attributes: These depend on the *parent* this widget is within
-        AttributeDescriptor[] layout_attrs = null;
-        boolean need_xmlns = false;
-
-        if (ui_parent instanceof UiDocumentNode) {
-            // Limitation: right now the layout behaves as if everything was
-            // owned by a FrameLayout.
-            // TODO replace by something user-configurable.
-
-            IProject project = getEditor().getProject();
-            if (project != null) {
-                Sdk currentSdk = Sdk.getCurrent();
-                if (currentSdk != null) {
-                    IAndroidTarget target = currentSdk.getTarget(project);
-                    if (target != null) {
-                        AndroidTargetData data = currentSdk.getTargetData(target);
-                        if (data != null) {
-                            LayoutDescriptors descriptors = data.getLayoutDescriptors();
-                            ViewElementDescriptor desc =
-                                descriptors.findDescriptorByClass(FQCN_FRAME_LAYOUT);
-                            if (desc != null) {
-                                layout_attrs = desc.getLayoutAttributes();
-                                need_xmlns = true;
-                            }
-                        }
-                    }
-                }
-            }
-        } else if (ui_parent instanceof UiViewElementNode) {
-            layout_attrs =
-                ((ViewElementDescriptor) ui_parent.getDescriptor()).getLayoutAttributes();
-        }
-
-        if (layout_attrs == null || layout_attrs.length == 0) {
-            return mCachedAttributeDescriptors;
-        }
-
-        mCachedAttributeDescriptors =
-            new AttributeDescriptor[direct_attrs.length +
-                                    layout_attrs.length +
-                                    (need_xmlns ? 1 : 0)];
-        System.arraycopy(direct_attrs, 0,
-                mCachedAttributeDescriptors, 0,
-                direct_attrs.length);
-        System.arraycopy(layout_attrs, 0,
-                mCachedAttributeDescriptors, direct_attrs.length,
-                layout_attrs.length);
-        if (need_xmlns) {
-            AttributeDescriptor desc = new XmlnsAttributeDescriptor(ANDROID_NS_NAME, ANDROID_URI);
-            mCachedAttributeDescriptors[direct_attrs.length + layout_attrs.length] = desc;
-        }
-
-        return mCachedAttributeDescriptors;
-    }
-
-    public Image getIcon() {
-        ElementDescriptor desc = getDescriptor();
-        if (desc != null) {
-            Image img = null;
-            // Special case for the common case of vertical linear layouts:
-            // show vertical linear icon (the default icon shows horizontal orientation)
-            String uiName = desc.getUiName();
-            IconFactory icons = IconFactory.getInstance();
-            if (uiName.equals(LINEAR_LAYOUT)) {
-                Element e = (Element) getXmlNode();
-                if (VALUE_VERTICAL.equals(e.getAttributeNS(ANDROID_URI, ATTR_ORIENTATION))) {
-                    IconFactory factory = icons;
-                    img = factory.getIcon("VerticalLinearLayout"); //$NON-NLS-1$
-                }
-            } else if (uiName.equals(VIEW_TAG)) {
-                Node xmlNode = getXmlNode();
-                if (xmlNode instanceof Element) {
-                    String className = ((Element) xmlNode).getAttribute(ATTR_CLASS);
-                    if (className != null && className.length() > 0) {
-                        int index = className.lastIndexOf('.');
-                        if (index != -1) {
-                            className = "customView"; //$NON-NLS-1$
-                        }
-                        img = icons.getIcon(className);
-                    }
-                }
-
-                if (img == null) {
-                    // Can't have both view.png and View.png; issues on case sensitive vs
-                    // case insensitive file systems
-                    img = icons.getIcon("View"); //$NON-NLS-1$
-                }
-            }
-            if (img == null) {
-                img = desc.getGenericIcon();
-            }
-
-            if (img != null) {
-                AndroidXmlEditor editor = getEditor();
-                if (editor != null) {
-                    LayoutEditorDelegate delegate = LayoutEditorDelegate.fromEditor(editor);
-                    if (delegate != null) {
-                        IMarker marker = delegate.getIssueForNode(this);
-                        if (marker != null) {
-                            int severity = marker.getAttribute(IMarker.SEVERITY, 0);
-                            if (severity == IMarker.SEVERITY_ERROR) {
-                                return icons.addErrorIcon(img);
-                            } else {
-                                return icons.addWarningIcon(img);
-                            }
-                        }
-                    }
-                }
-
-                return img;
-            }
-
-            return img;
-        }
-
-        return AdtPlugin.getAndroidLogo();
-    }
-
-    /**
-     * Sets the parent of this UI node.
-     * <p/>
-     * Also removes the cached AttributeDescriptor array that depends on the current UiParent.
-     */
-    @Override
-    protected void setUiParent(UiElementNode parent) {
-        super.setUiParent(parent);
-        mCachedAttributeDescriptors = null;
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/manifest/ManifestContentAssist.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/manifest/ManifestContentAssist.java
deleted file mode 100644
index 1492adb..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/manifest/ManifestContentAssist.java
+++ /dev/null
@@ -1,94 +0,0 @@
-/*
- * Copyright (C) 2007 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.editors.manifest;
-
-import static com.android.xml.AndroidManifest.ATTRIBUTE_MIN_SDK_VERSION;
-import static com.android.xml.AndroidManifest.ATTRIBUTE_TARGET_SDK_VERSION;
-
-import com.android.annotations.VisibleForTesting;
-import com.android.ide.eclipse.adt.AdtUtils;
-import com.android.ide.eclipse.adt.internal.editors.AndroidContentAssist;
-import com.android.ide.eclipse.adt.internal.sdk.AndroidTargetData;
-import com.android.ide.eclipse.adt.internal.sdk.Sdk;
-import com.android.sdklib.AndroidVersion;
-import com.android.sdklib.IAndroidTarget;
-import com.android.utils.Pair;
-
-import org.eclipse.jface.text.contentassist.ICompletionProposal;
-import org.w3c.dom.Node;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * Content Assist Processor for AndroidManifest.xml
- */
-@VisibleForTesting
-public final class ManifestContentAssist extends AndroidContentAssist {
-
-    /**
-     * Constructor for ManifestContentAssist
-     */
-    public ManifestContentAssist() {
-        super(AndroidTargetData.DESCRIPTOR_MANIFEST);
-    }
-
-    @Override
-    protected boolean computeAttributeValues(List<ICompletionProposal> proposals, int offset,
-            String parentTagName, String attributeName, Node node, String wordPrefix,
-            boolean skipEndTag, int replaceLength) {
-        if (attributeName.endsWith(ATTRIBUTE_MIN_SDK_VERSION)
-                || attributeName.endsWith(ATTRIBUTE_TARGET_SDK_VERSION)) {
-            // The user is completing the minSdkVersion attribute: it should be
-            // an integer for the API version, but we'll add full Android version
-            // names to make it more obvious what they're selecting
-
-            List<Pair<String, String>> choices = new ArrayList<Pair<String, String>>();
-            int max = AdtUtils.getHighestKnownApiLevel();
-            // Look for any more recent installed versions the user may have
-            Sdk sdk = Sdk.getCurrent();
-            if (sdk == null) {
-                return false;
-            }
-            IAndroidTarget[] targets = sdk.getTargets();
-            for (IAndroidTarget target : targets) {
-                AndroidVersion version = target.getVersion();
-                int apiLevel = version.getApiLevel();
-                if (apiLevel > max) {
-                    if (version.isPreview()) {
-                        // Use codename, not API level, as version string for preview versions
-                        choices.add(Pair.of(version.getCodename(), version.getCodename()));
-                    } else {
-                        choices.add(Pair.of(Integer.toString(apiLevel), target.getFullName()));
-                    }
-                }
-            }
-            for (int api = max; api >= 1; api--) {
-                String name = AdtUtils.getAndroidName(api);
-                choices.add(Pair.of(Integer.toString(api), name));
-            }
-            char needTag = 0;
-            addMatchingProposals(proposals, choices.toArray(), offset, node, wordPrefix,
-                    needTag, true /* isAttribute */, false /* isNew */,
-                    skipEndTag /* skipEndTag */, replaceLength);
-            return true;
-        } else {
-            return super.computeAttributeValues(proposals, offset, parentTagName, attributeName,
-                    node, wordPrefix, skipEndTag, replaceLength);
-        }
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/manifest/ManifestEditor.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/manifest/ManifestEditor.java
deleted file mode 100644
index 55ebf59..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/manifest/ManifestEditor.java
+++ /dev/null
@@ -1,578 +0,0 @@
-/*
- * Copyright (C) 2007 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.editors.manifest;
-
-import static com.android.SdkConstants.ANDROID_URI;
-import static com.android.SdkConstants.ATTR_NAME;
-import static com.android.ide.eclipse.adt.internal.editors.manifest.descriptors.AndroidManifestDescriptors.USES_PERMISSION;
-
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-import com.android.ide.eclipse.adt.AdtConstants;
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.ide.eclipse.adt.internal.editors.AndroidXmlEditor;
-import com.android.ide.eclipse.adt.internal.editors.descriptors.ElementDescriptor;
-import com.android.ide.eclipse.adt.internal.editors.manifest.descriptors.AndroidManifestDescriptors;
-import com.android.ide.eclipse.adt.internal.editors.manifest.pages.ApplicationPage;
-import com.android.ide.eclipse.adt.internal.editors.manifest.pages.InstrumentationPage;
-import com.android.ide.eclipse.adt.internal.editors.manifest.pages.OverviewPage;
-import com.android.ide.eclipse.adt.internal.editors.manifest.pages.PermissionPage;
-import com.android.ide.eclipse.adt.internal.editors.uimodel.UiAttributeNode;
-import com.android.ide.eclipse.adt.internal.editors.uimodel.UiElementNode;
-import com.android.ide.eclipse.adt.internal.lint.EclipseLintClient;
-import com.android.ide.eclipse.adt.internal.resources.manager.GlobalProjectMonitor;
-import com.android.ide.eclipse.adt.internal.resources.manager.GlobalProjectMonitor.IFileListener;
-import com.android.ide.eclipse.adt.internal.sdk.AndroidTargetData;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.resources.IMarkerDelta;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IResourceDelta;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.jface.text.IRegion;
-import org.eclipse.jface.text.Region;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
-import org.eclipse.wst.sse.core.internal.provisional.IndexedRegion;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-
-import java.util.Collection;
-import java.util.List;
-
-/**
- * Multi-page form editor for AndroidManifest.xml.
- */
-@SuppressWarnings("restriction")
-public final class ManifestEditor extends AndroidXmlEditor {
-
-    public static final String ID = AdtConstants.EDITORS_NAMESPACE + ".manifest.ManifestEditor"; //$NON-NLS-1$
-
-    private final static String EMPTY = ""; //$NON-NLS-1$
-
-    /** Root node of the UI element hierarchy */
-    private UiElementNode mUiManifestNode;
-    /** The Application Page tab */
-    private ApplicationPage mAppPage;
-    /** The Overview Manifest Page tab */
-    private OverviewPage mOverviewPage;
-    /** The Permission Page tab */
-    private PermissionPage mPermissionPage;
-    /** The Instrumentation Page tab */
-    private InstrumentationPage mInstrumentationPage;
-
-    private IFileListener mMarkerMonitor;
-
-
-    /**
-     * Creates the form editor for AndroidManifest.xml.
-     */
-    public ManifestEditor() {
-        super();
-        addDefaultTargetListener();
-    }
-
-    @Override
-    public void dispose() {
-        super.dispose();
-
-        GlobalProjectMonitor.getMonitor().removeFileListener(mMarkerMonitor);
-    }
-
-    @Override
-    public void activated() {
-        super.activated();
-        clearActionBindings(false);
-    }
-
-    @Override
-    public void deactivated() {
-        super.deactivated();
-        updateActionBindings();
-    }
-
-    @Override
-    protected void pageChange(int newPageIndex) {
-        super.pageChange(newPageIndex);
-        if (newPageIndex == mTextPageIndex) {
-            updateActionBindings();
-        } else {
-            clearActionBindings(false);
-        }
-    }
-
-    @Override
-    protected int getPersistenceCategory() {
-        return CATEGORY_MANIFEST;
-    }
-
-    /**
-     * Return the root node of the UI element hierarchy, which here
-     * is the "manifest" node.
-     */
-    @Override
-    public UiElementNode getUiRootNode() {
-        return mUiManifestNode;
-    }
-
-    /**
-     * Returns the Manifest descriptors for the file being edited.
-     */
-    public AndroidManifestDescriptors getManifestDescriptors() {
-        AndroidTargetData data = getTargetData();
-        if (data != null) {
-            return data.getManifestDescriptors();
-        }
-
-        return null;
-    }
-
-    // ---- Base Class Overrides ----
-
-    /**
-     * Returns whether the "save as" operation is supported by this editor.
-     * <p/>
-     * Save-As is a valid operation for the ManifestEditor since it acts on a
-     * single source file.
-     *
-     * @see IEditorPart
-     */
-    @Override
-    public boolean isSaveAsAllowed() {
-        return true;
-    }
-
-    @Override
-    public void doSave(IProgressMonitor monitor) {
-        // Look up the current (pre-save) values of minSdkVersion and targetSdkVersion
-        int prevMinSdkVersion = -1;
-        int prevTargetSdkVersion = -1;
-        IProject project = null;
-        ManifestInfo info = null;
-        try {
-            project = getProject();
-            if (project != null) {
-                info = ManifestInfo.get(project);
-                prevMinSdkVersion = info.getMinSdkVersion();
-                prevTargetSdkVersion = info.getTargetSdkVersion();
-                info.clear();
-            }
-        } catch (Throwable t) {
-            // We don't expect exceptions from the above calls, but we *really*
-            // need to make sure that nothing can prevent the save function from
-            // getting called!
-            AdtPlugin.log(t, null);
-        }
-
-        // Actually save
-        super.doSave(monitor);
-
-        // If the target/minSdkVersion has changed, clear all lint warnings (since many
-        // of them are tied to the min/target sdk levels), in order to avoid showing stale
-        // results
-        try {
-            if (info != null) {
-                int newMinSdkVersion = info.getMinSdkVersion();
-                int newTargetSdkVersion = info.getTargetSdkVersion();
-                if (newMinSdkVersion != prevMinSdkVersion
-                        || newTargetSdkVersion != prevTargetSdkVersion) {
-                    assert project != null;
-                    EclipseLintClient.clearMarkers(project);
-                }
-            }
-        } catch (Throwable t) {
-            AdtPlugin.log(t, null);
-        }
-    }
-
-    /**
-     * Creates the various form pages.
-     */
-    @Override
-    protected void createFormPages() {
-        try {
-            addPage(mOverviewPage = new OverviewPage(this));
-            addPage(mAppPage = new ApplicationPage(this));
-            addPage(mPermissionPage = new PermissionPage(this));
-            addPage(mInstrumentationPage = new InstrumentationPage(this));
-        } catch (PartInitException e) {
-            AdtPlugin.log(e, "Error creating nested page"); //$NON-NLS-1$
-        }
-    }
-
-    /* (non-java doc)
-     * Change the tab/title name to include the project name.
-     */
-    @Override
-    protected void setInput(IEditorInput input) {
-        super.setInput(input);
-        IFile inputFile = getInputFile();
-        if (inputFile != null) {
-            startMonitoringMarkers();
-            setPartName(String.format("%1$s Manifest", inputFile.getProject().getName()));
-        }
-    }
-
-    /**
-     * Processes the new XML Model, which XML root node is given.
-     *
-     * @param xml_doc The XML document, if available, or null if none exists.
-     */
-    @Override
-    protected void xmlModelChanged(Document xml_doc) {
-        // create the ui root node on demand.
-        initUiRootNode(false /*force*/);
-
-        loadFromXml(xml_doc);
-    }
-
-    private void loadFromXml(Document xmlDoc) {
-        mUiManifestNode.setXmlDocument(xmlDoc);
-        Node node = getManifestXmlNode(xmlDoc);
-
-        if (node != null) {
-            // Refresh the manifest UI node and all its descendants
-            mUiManifestNode.loadFromXmlNode(node);
-        }
-    }
-
-    private Node getManifestXmlNode(Document xmlDoc) {
-        if (xmlDoc != null) {
-            ElementDescriptor manifestDesc = mUiManifestNode.getDescriptor();
-            String manifestXmlName = manifestDesc == null ? null : manifestDesc.getXmlName();
-            assert manifestXmlName != null;
-
-            if (manifestXmlName != null) {
-                Node node = xmlDoc.getDocumentElement();
-                if (node != null && manifestXmlName.equals(node.getNodeName())) {
-                    return node;
-                }
-
-                for (node = xmlDoc.getFirstChild();
-                     node != null;
-                     node = node.getNextSibling()) {
-                    if (node.getNodeType() == Node.ELEMENT_NODE &&
-                            manifestXmlName.equals(node.getNodeName())) {
-                        return node;
-                    }
-                }
-            }
-        }
-
-        return null;
-    }
-
-    private void onDescriptorsChanged() {
-        IStructuredModel model = getModelForRead();
-        if (model != null) {
-            try {
-                Node node = getManifestXmlNode(getXmlDocument(model));
-                mUiManifestNode.reloadFromXmlNode(node);
-            } finally {
-                model.releaseFromRead();
-            }
-        }
-
-        if (mOverviewPage != null) {
-            mOverviewPage.refreshUiApplicationNode();
-        }
-
-        if (mAppPage != null) {
-            mAppPage.refreshUiApplicationNode();
-        }
-
-        if (mPermissionPage != null) {
-            mPermissionPage.refreshUiNode();
-        }
-
-        if (mInstrumentationPage != null) {
-            mInstrumentationPage.refreshUiNode();
-        }
-    }
-
-    /**
-     * Reads and processes the current markers and adds a listener for marker changes.
-     */
-    private void startMonitoringMarkers() {
-        final IFile inputFile = getInputFile();
-        if (inputFile != null) {
-            updateFromExistingMarkers(inputFile);
-
-            mMarkerMonitor = new IFileListener() {
-                @Override
-                public void fileChanged(@NonNull IFile file, @NonNull IMarkerDelta[] markerDeltas,
-                        int kind, @Nullable String extension, int flags, boolean isAndroidProject) {
-                    if (isAndroidProject && file.equals(inputFile)) {
-                        processMarkerChanges(markerDeltas);
-                    }
-                }
-            };
-
-            GlobalProjectMonitor.getMonitor().addFileListener(
-                    mMarkerMonitor, IResourceDelta.CHANGED);
-        }
-    }
-
-    /**
-     * Processes the markers of the specified {@link IFile} and updates the error status of
-     * {@link UiElementNode}s and {@link UiAttributeNode}s.
-     * @param inputFile the file being edited.
-     */
-    private void updateFromExistingMarkers(IFile inputFile) {
-        try {
-            // get the markers for the file
-            IMarker[] markers = inputFile.findMarkers(
-                    AdtConstants.MARKER_ANDROID, true, IResource.DEPTH_ZERO);
-
-            AndroidManifestDescriptors desc = getManifestDescriptors();
-            if (desc != null) {
-                ElementDescriptor appElement = desc.getApplicationElement();
-
-                if (appElement != null && mUiManifestNode != null) {
-                    UiElementNode appUiNode = mUiManifestNode.findUiChildNode(
-                            appElement.getXmlName());
-                    List<UiElementNode> children = appUiNode.getUiChildren();
-
-                    for (IMarker marker : markers) {
-                        processMarker(marker, children, IResourceDelta.ADDED);
-                    }
-                }
-            }
-
-        } catch (CoreException e) {
-            // findMarkers can throw an exception, in which case, we'll do nothing.
-        }
-    }
-
-    /**
-     * Processes a {@link IMarker} change.
-     * @param markerDeltas the list of {@link IMarkerDelta}
-     */
-    private void processMarkerChanges(IMarkerDelta[] markerDeltas) {
-        AndroidManifestDescriptors descriptors = getManifestDescriptors();
-        if (descriptors != null && descriptors.getApplicationElement() != null) {
-            UiElementNode app_ui_node = mUiManifestNode.findUiChildNode(
-                    descriptors.getApplicationElement().getXmlName());
-            List<UiElementNode> children = app_ui_node.getUiChildren();
-
-            for (IMarkerDelta markerDelta : markerDeltas) {
-                processMarker(markerDelta.getMarker(), children, markerDelta.getKind());
-            }
-        }
-    }
-
-    /**
-     * Processes a new/old/updated marker.
-     * @param marker The marker being added/removed/changed
-     * @param nodeList the list of activity/service/provider/receiver nodes.
-     * @param kind the change kind. Can be {@link IResourceDelta#ADDED},
-     * {@link IResourceDelta#REMOVED}, or {@link IResourceDelta#CHANGED}
-     */
-    private void processMarker(IMarker marker, List<UiElementNode> nodeList, int kind) {
-        // get the data from the marker
-        String nodeType = marker.getAttribute(AdtConstants.MARKER_ATTR_TYPE, EMPTY);
-        if (nodeType == EMPTY) {
-            return;
-        }
-
-        String className = marker.getAttribute(AdtConstants.MARKER_ATTR_CLASS, EMPTY);
-        if (className == EMPTY) {
-            return;
-        }
-
-        for (UiElementNode ui_node : nodeList) {
-            if (ui_node.getDescriptor().getXmlName().equals(nodeType)) {
-                for (UiAttributeNode attr : ui_node.getAllUiAttributes()) {
-                    if (attr.getDescriptor().getXmlLocalName().equals(
-                            AndroidManifestDescriptors.ANDROID_NAME_ATTR)) {
-                        if (attr.getCurrentValue().equals(className)) {
-                            if (kind == IResourceDelta.REMOVED) {
-                                attr.setHasError(false);
-                            } else {
-                                attr.setHasError(true);
-                            }
-                            return;
-                        }
-                    }
-                }
-            }
-        }
-    }
-
-    /**
-     * Creates the initial UI Root Node, including the known mandatory elements.
-     * @param force if true, a new UiManifestNode is recreated even if it already exists.
-     */
-    @Override
-    protected void initUiRootNode(boolean force) {
-        // The manifest UI node is always created, even if there's no corresponding XML node.
-        if (mUiManifestNode != null && force == false) {
-            return;
-        }
-
-        AndroidManifestDescriptors manifestDescriptor = getManifestDescriptors();
-
-        if (manifestDescriptor != null) {
-            ElementDescriptor manifestElement = manifestDescriptor.getManifestElement();
-            mUiManifestNode = manifestElement.createUiNode();
-            mUiManifestNode.setEditor(this);
-
-            // Similarly, always create the /manifest/uses-sdk followed by /manifest/application
-            // (order of the elements now matters)
-            ElementDescriptor element = manifestDescriptor.getUsesSdkElement();
-            boolean present = false;
-            for (UiElementNode ui_node : mUiManifestNode.getUiChildren()) {
-                if (ui_node.getDescriptor() == element) {
-                    present = true;
-                    break;
-                }
-            }
-            if (!present) {
-                mUiManifestNode.appendNewUiChild(element);
-            }
-
-            element = manifestDescriptor.getApplicationElement();
-            present = false;
-            for (UiElementNode ui_node : mUiManifestNode.getUiChildren()) {
-                if (ui_node.getDescriptor() == element) {
-                    present = true;
-                    break;
-                }
-            }
-            if (!present) {
-                mUiManifestNode.appendNewUiChild(element);
-            }
-
-            onDescriptorsChanged();
-        } else {
-            // create a dummy descriptor/uinode until we have real descriptors
-            ElementDescriptor desc = new ElementDescriptor("manifest", //$NON-NLS-1$
-                    "temporary descriptors due to missing decriptors", //$NON-NLS-1$
-                    null /*tooltip*/, null /*sdk_url*/, null /*attributes*/,
-                    null /*children*/, false /*mandatory*/);
-            mUiManifestNode = desc.createUiNode();
-            mUiManifestNode.setEditor(this);
-        }
-    }
-
-    /**
-     * Adds the given set of permissions into the manifest file in the suitable
-     * location
-     *
-     * @param permissions permission fqcn's to be added
-     * @param show if true, show one or more of the newly added permissions
-     */
-    public void addPermissions(@NonNull final List<String> permissions, final boolean show) {
-        wrapUndoEditXmlModel("Add permissions", new Runnable() {
-            @Override
-            public void run() {
-                // Ensure that the model is current:
-                initUiRootNode(true /*force*/);
-                UiElementNode root = getUiRootNode();
-
-                ElementDescriptor descriptor = getManifestDescriptors().getUsesPermissionElement();
-                boolean shown = false;
-                for (String permission : permissions) {
-                    // Find the first permission which sorts alphabetically laster than
-                    // this permission (or the last permission, if none are after in the alphabet)
-                    // and insert it there
-                    int lastPermissionIndex = -1;
-                    int nextPermissionIndex = -1;
-                    int index = 0;
-                    for (UiElementNode sibling : root.getUiChildren()) {
-                        Node node = sibling.getXmlNode();
-                        if (node.getNodeName().equals(USES_PERMISSION)) {
-                            lastPermissionIndex = index;
-                            String name = ((Element) node).getAttributeNS(ANDROID_URI, ATTR_NAME);
-                            if (permission.compareTo(name) < 0) {
-                                nextPermissionIndex = index;
-                                break;
-                            }
-                        } else if (node.getNodeName().equals("application")) { //$NON-NLS-1$
-                            // permissions should come before the application element
-                            nextPermissionIndex = index;
-                            break;
-                        }
-                        index++;
-                    }
-
-                    if (nextPermissionIndex != -1) {
-                        index = nextPermissionIndex;
-                    } else if (lastPermissionIndex != -1) {
-                        index = lastPermissionIndex + 1;
-                    } else {
-                        index = root.getUiChildren().size();
-                    }
-                    UiElementNode usesPermission = root.insertNewUiChild(index, descriptor);
-                    usesPermission.setAttributeValue(ATTR_NAME, ANDROID_URI, permission,
-                            true /*override*/);
-                    Node node = usesPermission.createXmlNode();
-                    if (show && !shown) {
-                        shown = true;
-                        if (node instanceof IndexedRegion && getInputFile() != null) {
-                            IndexedRegion indexedRegion = (IndexedRegion) node;
-                            IRegion region = new Region(indexedRegion.getStartOffset(),
-                                    indexedRegion.getEndOffset() - indexedRegion.getStartOffset());
-                            try {
-                                AdtPlugin.openFile(getInputFile(), region, true /*show*/);
-                            } catch (PartInitException e) {
-                                AdtPlugin.log(e, null);
-                            }
-                        } else {
-                            show(node);
-                        }
-                    }
-                }
-            }
-        });
-    }
-
-    /**
-     * Removes the permissions from the manifest editor
-     *
-     * @param permissions the permission fqcn's to be removed
-     */
-    public void removePermissions(@NonNull final Collection<String> permissions) {
-        wrapUndoEditXmlModel("Remove permissions", new Runnable() {
-            @Override
-            public void run() {
-                // Ensure that the model is current:
-                initUiRootNode(true /*force*/);
-                UiElementNode root = getUiRootNode();
-
-                for (String permission : permissions) {
-                    for (UiElementNode sibling : root.getUiChildren()) {
-                        Node node = sibling.getXmlNode();
-                        if (node.getNodeName().equals(USES_PERMISSION)) {
-                            String name = ((Element) node).getAttributeNS(ANDROID_URI, ATTR_NAME);
-                            if (name.equals(permission)) {
-                                sibling.deleteXmlNode();
-                                break;
-                            }
-                        }
-                    }
-                }
-            }
-        });
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/manifest/ManifestEditorContributor.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/manifest/ManifestEditorContributor.java
deleted file mode 100644
index 8beca30..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/manifest/ManifestEditorContributor.java
+++ /dev/null
@@ -1,100 +0,0 @@
-/*
- * Copyright (C) 2007 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.editors.manifest;
-
-import org.eclipse.jface.action.IAction;
-import org.eclipse.ui.IActionBars;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.actions.ActionFactory;
-import org.eclipse.ui.ide.IDEActionFactory;
-import org.eclipse.ui.part.MultiPageEditorActionBarContributor;
-import org.eclipse.ui.texteditor.ITextEditor;
-import org.eclipse.ui.texteditor.ITextEditorActionConstants;
-
-/**
- * Manages the installation/deinstallation of global actions for multi-page
- * editors. Responsible for the redirection of global actions to the active
- * editor. Multi-page contributor replaces the contributors for the individual
- * editors in the multi-page editor.
- * 
- * TODO: Doesn't look like we need this. Remove it if not needed.
- * @deprecated
- */
-final class ManifestEditorContributor extends MultiPageEditorActionBarContributor {
-    private IEditorPart mActiveEditorPart;
-
-    /**
-     * Creates a multi-page contributor.
-     * 
-     * Marked as Private so it can't be instanciated. This is a cheap way to make sure
-     * it's not being used. As noted in constructor, should be removed if not used.
-     * @deprecated
-     */
-    private ManifestEditorContributor() {
-        super();
-    }
-
-    /**
-     * Returns the action registed with the given text editor.
-     *
-     * @return IAction or null if editor is null.
-     */
-    protected IAction getAction(ITextEditor editor, String actionID) {
-        return (editor == null ? null : editor.getAction(actionID));
-    }
-
-    /*
-     * (non-JavaDoc) Method declared in
-     * AbstractMultiPageEditorActionBarContributor.
-     */
-
-    @Override
-    public void setActivePage(IEditorPart part) {
-        if (mActiveEditorPart == part)
-            return;
-
-        mActiveEditorPart = part;
-
-        IActionBars actionBars = getActionBars();
-        if (actionBars != null) {
-
-            ITextEditor editor =
-                (part instanceof ITextEditor) ? (ITextEditor)part : null;
-
-            actionBars.setGlobalActionHandler(ActionFactory.DELETE.getId(),
-                    getAction(editor, ITextEditorActionConstants.DELETE));
-            actionBars.setGlobalActionHandler(ActionFactory.UNDO.getId(),
-                    getAction(editor, ITextEditorActionConstants.UNDO));
-            actionBars.setGlobalActionHandler(ActionFactory.REDO.getId(),
-                    getAction(editor, ITextEditorActionConstants.REDO));
-            actionBars.setGlobalActionHandler(ActionFactory.CUT.getId(),
-                    getAction(editor, ITextEditorActionConstants.CUT));
-            actionBars.setGlobalActionHandler(ActionFactory.COPY.getId(),
-                    getAction(editor, ITextEditorActionConstants.COPY));
-            actionBars.setGlobalActionHandler(ActionFactory.PASTE.getId(),
-                    getAction(editor, ITextEditorActionConstants.PASTE));
-            actionBars.setGlobalActionHandler(ActionFactory.SELECT_ALL.getId(),
-                    getAction(editor, ITextEditorActionConstants.SELECT_ALL));
-            actionBars.setGlobalActionHandler(ActionFactory.FIND.getId(),
-                    getAction(editor, ITextEditorActionConstants.FIND));
-            actionBars.setGlobalActionHandler(
-                    IDEActionFactory.BOOKMARK.getId(), getAction(editor,
-                            IDEActionFactory.BOOKMARK.getId()));
-            actionBars.updateActionBars();
-        }
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/manifest/ManifestInfo.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/manifest/ManifestInfo.java
deleted file mode 100644
index 6d2d1c1..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/manifest/ManifestInfo.java
+++ /dev/null
@@ -1,957 +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.eclipse.adt.internal.editors.manifest;
-
-import static com.android.SdkConstants.ANDROID_STYLE_RESOURCE_PREFIX;
-import static com.android.SdkConstants.CLASS_ACTIVITY;
-import static com.android.SdkConstants.NS_RESOURCES;
-import static com.android.xml.AndroidManifest.ATTRIBUTE_ICON;
-import static com.android.xml.AndroidManifest.ATTRIBUTE_LABEL;
-import static com.android.xml.AndroidManifest.ATTRIBUTE_MIN_SDK_VERSION;
-import static com.android.xml.AndroidManifest.ATTRIBUTE_NAME;
-import static com.android.xml.AndroidManifest.ATTRIBUTE_PACKAGE;
-import static com.android.xml.AndroidManifest.ATTRIBUTE_PARENT_ACTIVITY_NAME;
-import static com.android.xml.AndroidManifest.ATTRIBUTE_SUPPORTS_RTL;
-import static com.android.xml.AndroidManifest.ATTRIBUTE_TARGET_SDK_VERSION;
-import static com.android.xml.AndroidManifest.ATTRIBUTE_THEME;
-import static com.android.xml.AndroidManifest.ATTRIBUTE_UI_OPTIONS;
-import static com.android.xml.AndroidManifest.ATTRIBUTE_VALUE;
-import static com.android.xml.AndroidManifest.NODE_ACTIVITY;
-import static com.android.xml.AndroidManifest.NODE_METADATA;
-import static com.android.xml.AndroidManifest.NODE_USES_SDK;
-import static com.android.xml.AndroidManifest.VALUE_PARENT_ACTIVITY;
-import static org.eclipse.jdt.core.search.IJavaSearchConstants.REFERENCES;
-
-import com.android.SdkConstants;
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.ide.eclipse.adt.internal.project.BaseProjectHelper;
-import com.android.ide.eclipse.adt.internal.sdk.Sdk;
-import com.android.ide.eclipse.adt.io.IFolderWrapper;
-import com.android.io.IAbstractFile;
-import com.android.io.StreamException;
-import com.android.resources.ScreenSize;
-import com.android.sdklib.IAndroidTarget;
-import com.android.utils.Pair;
-import com.android.xml.AndroidManifest;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IWorkspace;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.core.runtime.OperationCanceledException;
-import org.eclipse.core.runtime.QualifiedName;
-import org.eclipse.jdt.core.IField;
-import org.eclipse.jdt.core.IJavaElement;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.IMethod;
-import org.eclipse.jdt.core.IPackageFragment;
-import org.eclipse.jdt.core.IPackageFragmentRoot;
-import org.eclipse.jdt.core.IType;
-import org.eclipse.jdt.core.ITypeHierarchy;
-import org.eclipse.jdt.core.search.IJavaSearchScope;
-import org.eclipse.jdt.core.search.SearchEngine;
-import org.eclipse.jdt.core.search.SearchMatch;
-import org.eclipse.jdt.core.search.SearchParticipant;
-import org.eclipse.jdt.core.search.SearchPattern;
-import org.eclipse.jdt.core.search.SearchRequestor;
-import org.eclipse.jdt.internal.core.BinaryType;
-import org.eclipse.jface.text.IDocument;
-import org.eclipse.ui.editors.text.TextFileDocumentProvider;
-import org.eclipse.ui.texteditor.IDocumentProvider;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-import org.w3c.dom.NodeList;
-import org.xml.sax.InputSource;
-import org.xml.sax.SAXException;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-import javax.xml.parsers.DocumentBuilder;
-import javax.xml.parsers.DocumentBuilderFactory;
-import javax.xml.xpath.XPathExpressionException;
-
-/**
- * Retrieves and caches manifest information such as the themes to be used for
- * a given activity.
- *
- * @see AndroidManifest
- */
-public class ManifestInfo {
-
-    public static class ActivityAttributes {
-        @Nullable
-        private final String mIcon;
-        @Nullable
-        private final String mLabel;
-        @NonNull
-        private final String mName;
-        @Nullable
-        private final String mParentActivity;
-        @Nullable
-        private final String mTheme;
-        @Nullable
-        private final String mUiOptions;
-
-        public ActivityAttributes(Element activity, String packageName) {
-
-            // Get activity name.
-            String name = activity.getAttributeNS(NS_RESOURCES, ATTRIBUTE_NAME);
-            if (name == null || name.length() == 0) {
-                throw new RuntimeException("Activity name cannot be empty");
-            }
-            int index = name.indexOf('.');
-            if (index <= 0 && packageName != null && !packageName.isEmpty()) {
-              name =  packageName + (index == -1 ? "." : "") + name;
-            }
-            mName = name;
-
-            // Get activity icon.
-            String value = activity.getAttributeNS(NS_RESOURCES, ATTRIBUTE_ICON);
-            if (value != null && value.length() > 0) {
-                mIcon = value;
-            } else {
-                mIcon = null;
-            }
-
-            // Get activity label.
-            value = activity.getAttributeNS(NS_RESOURCES, ATTRIBUTE_LABEL);
-            if (value != null && value.length() > 0) {
-                mLabel = value;
-            } else {
-                mLabel = null;
-            }
-
-            // Get activity parent. Also search the meta-data for parent info.
-            value = activity.getAttributeNS(NS_RESOURCES, ATTRIBUTE_PARENT_ACTIVITY_NAME);
-            if (value == null || value.length() == 0) {
-                // TODO: Not sure if meta data can be used for API Level > 16
-                NodeList metaData = activity.getElementsByTagName(NODE_METADATA);
-                for (int j = 0, m = metaData.getLength(); j < m; j++) {
-                    Element data = (Element) metaData.item(j);
-                    String metadataName = data.getAttributeNS(NS_RESOURCES, ATTRIBUTE_NAME);
-                    if (VALUE_PARENT_ACTIVITY.equals(metadataName)) {
-                        value = data.getAttributeNS(NS_RESOURCES, ATTRIBUTE_VALUE);
-                        if (value != null) {
-                            index = value.indexOf('.');
-                            if (index <= 0 && packageName != null && !packageName.isEmpty()) {
-                                value = packageName + (index == -1 ? "." : "") + value;
-                                break;
-                            }
-                        }
-                    }
-                }
-            }
-            if (value != null && value.length() > 0) {
-                mParentActivity = value;
-            } else {
-                mParentActivity = null;
-            }
-
-            // Get activity theme.
-            value = activity.getAttributeNS(NS_RESOURCES, ATTRIBUTE_THEME);
-            if (value != null && value.length() > 0) {
-                mTheme = value;
-            } else {
-                mTheme = null;
-            }
-
-            // Get UI options.
-            value = activity.getAttributeNS(NS_RESOURCES, ATTRIBUTE_UI_OPTIONS);
-            if (value != null && value.length() > 0) {
-                mUiOptions = value;
-            } else {
-                mUiOptions = null;
-            }
-        }
-
-        @Nullable
-        public String getIcon() {
-            return mIcon;
-        }
-
-        @Nullable
-        public String getLabel() {
-            return mLabel;
-        }
-
-        public String getName() {
-            return mName;
-        }
-
-        @Nullable
-        public String getParentActivity() {
-            return mParentActivity;
-        }
-
-        @Nullable
-        public String getTheme() {
-            return mTheme;
-        }
-
-        @Nullable
-        public String getUiOptions() {
-            return mUiOptions;
-        }
-    }
-
-    /**
-     * The maximum number of milliseconds to search for an activity in the codebase when
-     * attempting to associate layouts with activities in
-     * {@link #guessActivity(IFile, String)}
-     */
-    private static final int SEARCH_TIMEOUT_MS = 3000;
-
-    private final IProject mProject;
-    private String mPackage;
-    private String mManifestTheme;
-    private Map<String, ActivityAttributes> mActivityAttributes;
-    private IAbstractFile mManifestFile;
-    private long mLastModified;
-    private long mLastChecked;
-    private String mMinSdkName;
-    private int mMinSdk;
-    private int mTargetSdk;
-    private String mApplicationIcon;
-    private String mApplicationLabel;
-    private boolean mApplicationSupportsRtl;
-
-    /**
-     * Qualified name for the per-project non-persistent property storing the
-     * {@link ManifestInfo} for this project
-     */
-    final static QualifiedName MANIFEST_FINDER = new QualifiedName(AdtPlugin.PLUGIN_ID,
-            "manifest"); //$NON-NLS-1$
-
-    /**
-     * Constructs an {@link ManifestInfo} for the given project. Don't use this method;
-     * use the {@link #get} factory method instead.
-     *
-     * @param project project to create an {@link ManifestInfo} for
-     */
-    private ManifestInfo(IProject project) {
-        mProject = project;
-    }
-
-    /**
-     * Clears the cached manifest information. The next get call on one of the
-     * properties will cause the information to be refreshed.
-     */
-    public void clear() {
-        mLastChecked = 0;
-    }
-
-    /**
-     * Returns the {@link ManifestInfo} for the given project
-     *
-     * @param project the project the finder is associated with
-     * @return a {@ManifestInfo} for the given project, never null
-     */
-    @NonNull
-    public static ManifestInfo get(IProject project) {
-        ManifestInfo finder = null;
-        try {
-            finder = (ManifestInfo) project.getSessionProperty(MANIFEST_FINDER);
-        } catch (CoreException e) {
-            // Not a problem; we will just create a new one
-        }
-
-        if (finder == null) {
-            finder = new ManifestInfo(project);
-            try {
-                project.setSessionProperty(MANIFEST_FINDER, finder);
-            } catch (CoreException e) {
-                AdtPlugin.log(e, "Can't store ManifestInfo");
-            }
-        }
-
-        return finder;
-    }
-
-    /**
-     * Ensure that the package, theme and activity maps are initialized and up to date
-     * with respect to the manifest file
-     */
-    private void sync() {
-        // Since each of the accessors call sync(), allow a bunch of immediate
-        // accessors to all bypass the file stat() below
-        long now = System.currentTimeMillis();
-        if (now - mLastChecked < 50 && mManifestFile != null) {
-            return;
-        }
-        mLastChecked = now;
-
-        if (mManifestFile == null) {
-            IFolderWrapper projectFolder = new IFolderWrapper(mProject);
-            mManifestFile = AndroidManifest.getManifest(projectFolder);
-            if (mManifestFile == null) {
-                return;
-            }
-        }
-
-        // Check to see if our data is up to date
-        long fileModified = mManifestFile.getModificationStamp();
-        if (fileModified == mLastModified) {
-            // Already have up to date data
-            return;
-        }
-        mLastModified = fileModified;
-
-        mActivityAttributes = new HashMap<String, ActivityAttributes>();
-        mManifestTheme = null;
-        mTargetSdk = 1; // Default when not specified
-        mMinSdk = 1; // Default when not specified
-        mMinSdkName = "1"; // Default when not specified
-        mPackage = ""; //$NON-NLS-1$
-        mApplicationIcon = null;
-        mApplicationLabel = null;
-        mApplicationSupportsRtl = false;
-
-        Document document = null;
-        try {
-            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
-            InputSource is = new InputSource(mManifestFile.getContents());
-
-            factory.setNamespaceAware(true);
-            factory.setValidating(false);
-            DocumentBuilder builder = factory.newDocumentBuilder();
-            document = builder.parse(is);
-
-            Element root = document.getDocumentElement();
-            mPackage = root.getAttribute(ATTRIBUTE_PACKAGE);
-            NodeList activities = document.getElementsByTagName(NODE_ACTIVITY);
-            for (int i = 0, n = activities.getLength(); i < n; i++) {
-                Element activity = (Element) activities.item(i);
-                ActivityAttributes info = new ActivityAttributes(activity, mPackage);
-                mActivityAttributes.put(info.getName(), info);
-            }
-
-            NodeList applications = root.getElementsByTagName(AndroidManifest.NODE_APPLICATION);
-            if (applications.getLength() > 0) {
-                assert applications.getLength() == 1;
-                Element application = (Element) applications.item(0);
-                if (application.hasAttributeNS(NS_RESOURCES, ATTRIBUTE_ICON)) {
-                    mApplicationIcon = application.getAttributeNS(NS_RESOURCES, ATTRIBUTE_ICON);
-                }
-                if (application.hasAttributeNS(NS_RESOURCES, ATTRIBUTE_LABEL)) {
-                    mApplicationLabel = application.getAttributeNS(NS_RESOURCES, ATTRIBUTE_LABEL);
-                }
-                if (SdkConstants.VALUE_TRUE.equals(application.getAttributeNS(NS_RESOURCES,
-                        ATTRIBUTE_SUPPORTS_RTL))) {
-                    mApplicationSupportsRtl = true;
-                }
-
-                String defaultTheme = application.getAttributeNS(NS_RESOURCES, ATTRIBUTE_THEME);
-                if (defaultTheme != null && !defaultTheme.isEmpty()) {
-                    // From manifest theme documentation:
-                    // "If that attribute is also not set, the default system theme is used."
-                    mManifestTheme = defaultTheme;
-                }
-            }
-
-            // Look up target SDK
-            NodeList usesSdks = root.getElementsByTagName(NODE_USES_SDK);
-            if (usesSdks.getLength() > 0) {
-                Element usesSdk = (Element) usesSdks.item(0);
-                mMinSdk = getApiVersion(usesSdk, ATTRIBUTE_MIN_SDK_VERSION, 1);
-                mTargetSdk = getApiVersion(usesSdk, ATTRIBUTE_TARGET_SDK_VERSION, mMinSdk);
-            }
-
-        } catch (SAXException e) {
-            AdtPlugin.log(e, "Malformed manifest");
-        } catch (Exception e) {
-            AdtPlugin.log(e, "Could not read Manifest data");
-        }
-    }
-
-    private int getApiVersion(Element usesSdk, String attribute, int defaultApiLevel) {
-        String valueString = null;
-        if (usesSdk.hasAttributeNS(NS_RESOURCES, attribute)) {
-            valueString = usesSdk.getAttributeNS(NS_RESOURCES, attribute);
-            if (attribute.equals(ATTRIBUTE_MIN_SDK_VERSION)) {
-                mMinSdkName = valueString;
-            }
-        }
-
-        if (valueString != null) {
-            int apiLevel = -1;
-            try {
-                apiLevel = Integer.valueOf(valueString);
-            } catch (NumberFormatException e) {
-                // Handle codename
-                if (Sdk.getCurrent() != null) {
-                    IAndroidTarget target = Sdk.getCurrent().getTargetFromHashString(
-                            "android-" + valueString); //$NON-NLS-1$
-                    if (target != null) {
-                        // codename future API level is current api + 1
-                        apiLevel = target.getVersion().getApiLevel() + 1;
-                    }
-                }
-            }
-
-            return apiLevel;
-        }
-
-        return defaultApiLevel;
-    }
-
-    /**
-     * Returns the default package registered in the Android manifest
-     *
-     * @return the default package registered in the manifest
-     */
-    @NonNull
-    public String getPackage() {
-        sync();
-        return mPackage;
-    }
-
-    /**
-     * Returns a map from activity full class names to the corresponding {@link ActivityAttributes}.
-     *
-     * @return a map from activity fqcn to ActivityAttributes
-     */
-    @NonNull
-    public Map<String, ActivityAttributes> getActivityAttributesMap() {
-        sync();
-        return mActivityAttributes;
-    }
-
-    /**
-     * Returns the attributes of an activity given its full class name.
-     */
-    @Nullable
-    public ActivityAttributes getActivityAttributes(String activity) {
-        return getActivityAttributesMap().get(activity);
-    }
-
-    /**
-     * Returns the manifest theme registered on the application, if any
-     *
-     * @return a manifest theme, or null if none was registered
-     */
-    @Nullable
-    public String getManifestTheme() {
-        sync();
-        return mManifestTheme;
-    }
-
-    /**
-     * Returns the default theme for this project, by looking at the manifest default
-     * theme registration, target SDK, rendering target, etc.
-     *
-     * @param renderingTarget the rendering target use to render the theme, or null
-     * @param screenSize the screen size to obtain a default theme for, or null if unknown
-     * @return the theme to use for this project, never null
-     */
-    @NonNull
-    public String getDefaultTheme(IAndroidTarget renderingTarget, ScreenSize screenSize) {
-        sync();
-
-        if (mManifestTheme != null) {
-            return mManifestTheme;
-        }
-
-        int renderingTargetSdk = mTargetSdk;
-        if (renderingTarget != null) {
-            renderingTargetSdk = renderingTarget.getVersion().getApiLevel();
-        }
-
-        int apiLevel = Math.min(mTargetSdk, renderingTargetSdk);
-        // For now this theme works only on XLARGE screens. When it works for all sizes,
-        // add that new apiLevel to this check.
-        if (apiLevel >= 11 && screenSize == ScreenSize.XLARGE || apiLevel >= 14) {
-            return ANDROID_STYLE_RESOURCE_PREFIX + "Theme.Holo"; //$NON-NLS-1$
-        } else {
-            return ANDROID_STYLE_RESOURCE_PREFIX + "Theme"; //$NON-NLS-1$
-        }
-    }
-
-    /**
-     * Returns the application icon, or null
-     *
-     * @return the application icon, or null
-     */
-    @Nullable
-    public String getApplicationIcon() {
-        sync();
-        return mApplicationIcon;
-    }
-
-    /**
-     * Returns the application label, or null
-     *
-     * @return the application label, or null
-     */
-    @Nullable
-    public String getApplicationLabel() {
-        sync();
-        return mApplicationLabel;
-    }
-
-    /**
-     * Returns true if the application has RTL support.
-     *
-     * @return true if the application has RTL support.
-     */
-    public boolean isRtlSupported() {
-        sync();
-        return mApplicationSupportsRtl;
-    }
-
-    /**
-     * Returns the target SDK version
-     *
-     * @return the target SDK version
-     */
-    public int getTargetSdkVersion() {
-        sync();
-        return mTargetSdk;
-    }
-
-    /**
-     * Returns the minimum SDK version
-     *
-     * @return the minimum SDK version
-     */
-    public int getMinSdkVersion() {
-        sync();
-        return mMinSdk;
-    }
-
-    /**
-     * Returns the minimum SDK version name (which may not be a numeric string, e.g.
-     * it could be a codename). It will never be null or empty; if no min sdk version
-     * was specified in the manifest, the return value will be "1". Use
-     * {@link #getMinSdkCodeName()} instead if you want to look up whether there is a code name.
-     *
-     * @return the minimum SDK version
-     */
-    @NonNull
-    public String getMinSdkName() {
-        sync();
-        if (mMinSdkName == null || mMinSdkName.isEmpty()) {
-            mMinSdkName = "1"; //$NON-NLS-1$
-        }
-
-        return mMinSdkName;
-    }
-
-    /**
-     * Returns the code name used for the minimum SDK version, if any.
-     *
-     * @return the minSdkVersion codename or null
-     */
-    @Nullable
-    public String getMinSdkCodeName() {
-        String minSdkName = getMinSdkName();
-        if (!Character.isDigit(minSdkName.charAt(0))) {
-            return minSdkName;
-        }
-
-        return null;
-    }
-
-    /**
-     * Returns the {@link IPackageFragment} for the package registered in the manifest
-     *
-     * @return the {@link IPackageFragment} for the package registered in the manifest
-     */
-    @Nullable
-    public IPackageFragment getPackageFragment() {
-        sync();
-        try {
-            IJavaProject javaProject = BaseProjectHelper.getJavaProject(mProject);
-            if (javaProject != null) {
-                IPackageFragmentRoot root = ManifestInfo.getSourcePackageRoot(javaProject);
-                if (root != null) {
-                    return root.getPackageFragment(mPackage);
-                }
-            }
-        } catch (CoreException e) {
-            AdtPlugin.log(e, null);
-        }
-
-        return null;
-    }
-
-    /**
-     * Returns the activity associated with the given layout file. Makes an educated guess
-     * by peeking at the usages of the R.layout.name field corresponding to the layout and
-     * if it finds a usage.
-     *
-     * @param project the project containing the layout
-     * @param layoutName the layout whose activity we want to look up
-     * @param pkg the package containing activities
-     * @return the activity name
-     */
-    @Nullable
-    public static String guessActivity(IProject project, String layoutName, String pkg) {
-        List<String> activities = guessActivities(project, layoutName, pkg);
-        if (activities.size() > 0) {
-            return activities.get(0);
-        } else {
-            return null;
-        }
-    }
-
-    /**
-     * Returns the activities associated with the given layout file. Makes an educated guess
-     * by peeking at the usages of the R.layout.name field corresponding to the layout and
-     * if it finds a usage.
-     *
-     * @param project the project containing the layout
-     * @param layoutName the layout whose activity we want to look up
-     * @param pkg the package containing activities
-     * @return the activity name
-     */
-    @NonNull
-    public static List<String> guessActivities(IProject project, String layoutName, String pkg) {
-        final LinkedList<String> activities = new LinkedList<String>();
-        SearchRequestor requestor = new SearchRequestor() {
-            @Override
-            public void acceptSearchMatch(SearchMatch match) throws CoreException {
-                Object element = match.getElement();
-                if (element instanceof IMethod) {
-                    IMethod method = (IMethod) element;
-                    IType declaringType = method.getDeclaringType();
-                    String fqcn = declaringType.getFullyQualifiedName();
-
-                    if ((declaringType.getSuperclassName() != null &&
-                            declaringType.getSuperclassName().endsWith("Activity")) //$NON-NLS-1$
-                        || method.getElementName().equals("onCreate")) { //$NON-NLS-1$
-                        activities.addFirst(fqcn);
-                    } else {
-                        activities.addLast(fqcn);
-                    }
-                }
-            }
-        };
-        try {
-            IJavaProject javaProject = BaseProjectHelper.getJavaProject(project);
-            if (javaProject == null) {
-                return Collections.emptyList();
-            }
-            // TODO - look around a bit more and see if we can figure out whether the
-            // call if from within a setContentView call!
-
-            // Search for which java classes call setContentView(R.layout.layoutname);
-            String typeFqcn = "R.layout"; //$NON-NLS-1$
-            if (pkg != null) {
-                typeFqcn = pkg + '.' + typeFqcn;
-            }
-
-            IType type = javaProject.findType(typeFqcn);
-            if (type != null) {
-                IField field = type.getField(layoutName);
-                if (field.exists()) {
-                    SearchPattern pattern = SearchPattern.createPattern(field, REFERENCES);
-                    try {
-                        search(requestor, javaProject, pattern);
-                    } catch (OperationCanceledException canceled) {
-                        // pass
-                    }
-                }
-            }
-        } catch (CoreException e) {
-            AdtPlugin.log(e, null);
-        }
-
-        return activities;
-    }
-
-    /**
-     * Returns all activities found in the given project (including those in libraries,
-     * except for android.jar itself)
-     *
-     * @param project the project
-     * @return a list of activity classes as fully qualified class names
-     */
-    @SuppressWarnings("restriction") // BinaryType
-    @NonNull
-    public static List<String> getProjectActivities(IProject project) {
-        final List<String> activities = new ArrayList<String>();
-        try {
-            final IJavaProject javaProject = BaseProjectHelper.getJavaProject(project);
-            if (javaProject != null) {
-                IType[] activityTypes = new IType[0];
-                IType activityType = javaProject.findType(CLASS_ACTIVITY);
-                if (activityType != null) {
-                    ITypeHierarchy hierarchy =
-                        activityType.newTypeHierarchy(javaProject, new NullProgressMonitor());
-                    activityTypes = hierarchy.getAllSubtypes(activityType);
-                    for (IType type : activityTypes) {
-                        if (type instanceof BinaryType && (type.getClassFile() == null
-                                    || type.getClassFile().getResource() == null)) {
-                            continue;
-                        }
-                        activities.add(type.getFullyQualifiedName());
-                    }
-                }
-            }
-        } catch (CoreException e) {
-            AdtPlugin.log(e, null);
-        }
-
-        return activities;
-    }
-
-
-    /**
-     * Returns the activity associated with the given layout file.
-     * <p>
-     * This is an alternative to {@link #guessActivity(IFile, String)}. Whereas
-     * guessActivity simply looks for references to "R.layout.foo", this method searches
-     * for all usages of Activity#setContentView(int), and for each match it looks up the
-     * corresponding call text (such as "setContentView(R.layout.foo)"). From this it uses
-     * a regexp to pull out "foo" from this, and stores the association that layout "foo"
-     * is associated with the activity class that contained the setContentView call.
-     * <p>
-     * This has two potential advantages:
-     * <ol>
-     * <li>It can be faster. We do the reference search -once-, and we've built a map of
-     * all the layout-to-activity mappings which we can then immediately look up other
-     * layouts for, which is particularly useful at startup when we have to compute the
-     * layout activity associations to populate the theme choosers.
-     * <li>It can be more accurate. Just because an activity references an "R.layout.foo"
-     * field doesn't mean it's setting it as a content view.
-     * </ol>
-     * However, this second advantage is also its chief problem. There are some common
-     * code constructs which means that the associated layout is not explicitly referenced
-     * in a direct setContentView call; on a couple of sample projects I tested I found
-     * patterns like for example "setContentView(v)" where "v" had been computed earlier.
-     * Therefore, for now we're going to stick with the more general approach of just
-     * looking up each field when needed. We're keeping the code around, though statically
-     * compiled out with the "if (false)" construct below in case we revisit this.
-     *
-     * @param layoutFile the layout whose activity we want to look up
-     * @return the activity name
-     */
-    @SuppressWarnings("all")
-    @Nullable
-    public String guessActivityBySetContentView(String layoutName) {
-        if (false) {
-            // These should be fields
-            final Pattern LAYOUT_FIELD_PATTERN =
-                Pattern.compile("R\\.layout\\.([a-z0-9_]+)"); //$NON-NLS-1$
-            Map<String, String> mUsages = null;
-
-            sync();
-            if (mUsages == null) {
-                final Map<String, String> usages = new HashMap<String, String>();
-                mUsages = usages;
-                SearchRequestor requestor = new SearchRequestor() {
-                    @Override
-                    public void acceptSearchMatch(SearchMatch match) throws CoreException {
-                        Object element = match.getElement();
-                        if (element instanceof IMethod) {
-                            IMethod method = (IMethod) element;
-                            IType declaringType = method.getDeclaringType();
-                            String fqcn = declaringType.getFullyQualifiedName();
-                            IDocumentProvider provider = new TextFileDocumentProvider();
-                            IResource resource = match.getResource();
-                            try {
-                                provider.connect(resource);
-                                IDocument document = provider.getDocument(resource);
-                                if (document != null) {
-                                    String matchText = document.get(match.getOffset(),
-                                            match.getLength());
-                                    Matcher matcher = LAYOUT_FIELD_PATTERN.matcher(matchText);
-                                    if (matcher.find()) {
-                                        usages.put(matcher.group(1), fqcn);
-                                    }
-                                }
-                            } catch (Exception e) {
-                                AdtPlugin.log(e, "Can't find range information for %1$s",
-                                        resource.getName());
-                            } finally {
-                                provider.disconnect(resource);
-                            }
-                        }
-                    }
-                };
-                try {
-                    IJavaProject javaProject = BaseProjectHelper.getJavaProject(mProject);
-                    if (javaProject == null) {
-                        return null;
-                    }
-
-                    // Search for which java classes call setContentView(R.layout.layoutname);
-                    String typeFqcn = "R.layout"; //$NON-NLS-1$
-                    if (mPackage != null) {
-                        typeFqcn = mPackage + '.' + typeFqcn;
-                    }
-
-                    IType activityType = javaProject.findType(CLASS_ACTIVITY);
-                    if (activityType != null) {
-                        IMethod method = activityType.getMethod(
-                                "setContentView", new String[] {"I"}); //$NON-NLS-1$ //$NON-NLS-2$
-                        if (method.exists()) {
-                            SearchPattern pattern = SearchPattern.createPattern(method,
-                                    REFERENCES);
-                            search(requestor, javaProject, pattern);
-                        }
-                    }
-                } catch (CoreException e) {
-                    AdtPlugin.log(e, null);
-                }
-            }
-
-            return mUsages.get(layoutName);
-        }
-
-        return null;
-    }
-
-    /**
-     * Performs a search using the given pattern, scope and handler. The search will abort
-     * if it takes longer than {@link #SEARCH_TIMEOUT_MS} milliseconds.
-     */
-    private static void search(SearchRequestor requestor, IJavaProject javaProject,
-            SearchPattern pattern) throws CoreException {
-        // Find the package fragment specified in the manifest; the activities should
-        // live there.
-        IJavaSearchScope scope = createPackageScope(javaProject);
-
-        SearchParticipant[] participants = new SearchParticipant[] {
-            SearchEngine.getDefaultSearchParticipant()
-        };
-        SearchEngine engine = new SearchEngine();
-
-        final long searchStart = System.currentTimeMillis();
-        NullProgressMonitor monitor = new NullProgressMonitor() {
-            private boolean mCancelled;
-            @Override
-            public void internalWorked(double work) {
-                long searchEnd = System.currentTimeMillis();
-                if (searchEnd - searchStart > SEARCH_TIMEOUT_MS) {
-                    mCancelled = true;
-                }
-            }
-
-            @Override
-            public boolean isCanceled() {
-                return mCancelled;
-            }
-        };
-        engine.search(pattern, participants, scope, requestor, monitor);
-    }
-
-    /** Creates a package search scope for the first package root in the given java project */
-    private static IJavaSearchScope createPackageScope(IJavaProject javaProject) {
-        IPackageFragmentRoot packageRoot = getSourcePackageRoot(javaProject);
-
-        IJavaSearchScope scope;
-        if (packageRoot != null) {
-            IJavaElement[] scopeElements = new IJavaElement[] { packageRoot };
-            scope = SearchEngine.createJavaSearchScope(scopeElements);
-        } else {
-            scope = SearchEngine.createWorkspaceScope();
-        }
-        return scope;
-    }
-
-    /**
-     * Returns the first package root for the given java project
-     *
-     * @param javaProject the project to search in
-     * @return the first package root, or null
-     */
-    @Nullable
-    public static IPackageFragmentRoot getSourcePackageRoot(IJavaProject javaProject) {
-        IPackageFragmentRoot packageRoot = null;
-        List<IPath> sources = BaseProjectHelper.getSourceClasspaths(javaProject);
-
-        IWorkspace workspace = ResourcesPlugin.getWorkspace();
-        for (IPath path : sources) {
-            IResource firstSource = workspace.getRoot().findMember(path);
-            if (firstSource != null) {
-                packageRoot = javaProject.getPackageFragmentRoot(firstSource);
-                if (packageRoot != null) {
-                    break;
-                }
-            }
-        }
-        return packageRoot;
-    }
-
-    /**
-     * Computes the minimum SDK and target SDK versions for the project
-     *
-     * @param project the project to look up the versions for
-     * @return a pair of (minimum SDK, target SDK) versions, never null
-     */
-    @NonNull
-    public static Pair<Integer, Integer> computeSdkVersions(IProject project) {
-        int mMinSdkVersion = 1;
-        int mTargetSdkVersion = 1;
-
-        IAbstractFile manifestFile = AndroidManifest.getManifest(new IFolderWrapper(project));
-        if (manifestFile != null) {
-            try {
-                Object value = AndroidManifest.getMinSdkVersion(manifestFile);
-                mMinSdkVersion = 1; // Default case if missing
-                if (value instanceof Integer) {
-                    mMinSdkVersion = ((Integer) value).intValue();
-                } else if (value instanceof String) {
-                    // handle codename, only if we can resolve it.
-                    if (Sdk.getCurrent() != null) {
-                        IAndroidTarget target = Sdk.getCurrent().getTargetFromHashString(
-                                "android-" + value); //$NON-NLS-1$
-                        if (target != null) {
-                            // codename future API level is current api + 1
-                            mMinSdkVersion = target.getVersion().getApiLevel() + 1;
-                        }
-                    }
-                }
-
-                value = AndroidManifest.getTargetSdkVersion(manifestFile);
-                if (value == null) {
-                    mTargetSdkVersion = mMinSdkVersion;
-                } else if (value instanceof String) {
-                    // handle codename, only if we can resolve it.
-                    if (Sdk.getCurrent() != null) {
-                        IAndroidTarget target = Sdk.getCurrent().getTargetFromHashString(
-                                "android-" + value); //$NON-NLS-1$
-                        if (target != null) {
-                            // codename future API level is current api + 1
-                        	mTargetSdkVersion = target.getVersion().getApiLevel() + 1;
-                        }
-                    }
-                }
-            } catch (XPathExpressionException e) {
-                // do nothing we'll use 1 below.
-            } catch (StreamException e) {
-                // do nothing we'll use 1 below.
-            }
-        }
-
-        return Pair.of(mMinSdkVersion, mTargetSdkVersion);
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/manifest/ManifestSourceViewerConfig.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/manifest/ManifestSourceViewerConfig.java
deleted file mode 100644
index a3d3986..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/manifest/ManifestSourceViewerConfig.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Copyright (C) 2007 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.editors.manifest;
-
-
-import com.android.ide.eclipse.adt.internal.editors.AndroidSourceViewerConfig;
-
-import org.eclipse.jface.text.contentassist.IContentAssistProcessor;
-import org.eclipse.jface.text.source.ISourceViewer;
-
-/**
- * Source Viewer Configuration that calls in ManifestContentAssist.
- */
-public final class ManifestSourceViewerConfig extends AndroidSourceViewerConfig {
-
-    private ManifestContentAssist mAndroidContentAssist;
-
-    public ManifestSourceViewerConfig() {
-        super();
-        mAndroidContentAssist = new ManifestContentAssist();
-    }
-
-    @Override
-    public IContentAssistProcessor getAndroidContentAssistProcessor(
-            ISourceViewer sourceViewer,
-            String partitionType) {
-        return mAndroidContentAssist;
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/manifest/descriptors/AndroidManifestDescriptors.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/manifest/descriptors/AndroidManifestDescriptors.java
deleted file mode 100644
index 3429e43..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/manifest/descriptors/AndroidManifestDescriptors.java
+++ /dev/null
@@ -1,628 +0,0 @@
-/*
- * Copyright (C) 2007 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.editors.manifest.descriptors;
-
-import com.android.SdkConstants;
-import com.android.ide.common.api.IAttributeInfo;
-import com.android.ide.common.api.IAttributeInfo.Format;
-import com.android.ide.common.resources.platform.AttributeInfo;
-import com.android.ide.common.resources.platform.AttrsXmlParser;
-import com.android.ide.common.resources.platform.DeclareStyleableInfo;
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.ide.eclipse.adt.internal.editors.descriptors.AttributeDescriptor;
-import com.android.ide.eclipse.adt.internal.editors.descriptors.DescriptorsUtils;
-import com.android.ide.eclipse.adt.internal.editors.descriptors.ElementDescriptor;
-import com.android.ide.eclipse.adt.internal.editors.descriptors.ElementDescriptor.Mandatory;
-import com.android.ide.eclipse.adt.internal.editors.descriptors.IDescriptorProvider;
-import com.android.ide.eclipse.adt.internal.editors.descriptors.ITextAttributeCreator;
-import com.android.ide.eclipse.adt.internal.editors.descriptors.ListAttributeDescriptor;
-import com.android.ide.eclipse.adt.internal.editors.descriptors.ReferenceAttributeDescriptor;
-import com.android.ide.eclipse.adt.internal.editors.descriptors.TextAttributeDescriptor;
-import com.android.ide.eclipse.adt.internal.editors.descriptors.XmlnsAttributeDescriptor;
-
-import org.eclipse.core.runtime.IStatus;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.Map.Entry;
-import java.util.Set;
-import java.util.TreeSet;
-
-
-/**
- * Complete description of the AndroidManifest.xml structure.
- * <p/>
- * The root element are static instances which always exists.
- * However their sub-elements and attributes are created only when the SDK changes or is
- * loaded the first time.
- */
-public final class AndroidManifestDescriptors implements IDescriptorProvider {
-    /** Name of the {@code <uses-permission>} */
-    public static final String USES_PERMISSION = "uses-permission";             //$NON-NLS-1$
-    private static final String MANIFEST_NODE_NAME = "manifest";                //$NON-NLS-1$
-    private static final String ANDROID_MANIFEST_STYLEABLE =
-        AttrsXmlParser.ANDROID_MANIFEST_STYLEABLE;
-
-    // Public attributes names, attributes descriptors and elements descriptors
-
-    public static final String ANDROID_LABEL_ATTR = "label";    //$NON-NLS-1$
-    public static final String ANDROID_NAME_ATTR  = "name";     //$NON-NLS-1$
-    public static final String PACKAGE_ATTR       = "package";  //$NON-NLS-1$
-
-    /** The {@link ElementDescriptor} for the root Manifest element. */
-    private final ElementDescriptor MANIFEST_ELEMENT;
-    /** The {@link ElementDescriptor} for the root Application element. */
-    private final ElementDescriptor APPLICATION_ELEMENT;
-
-    /** The {@link ElementDescriptor} for the root Instrumentation element. */
-    private final ElementDescriptor INTRUMENTATION_ELEMENT;
-    /** The {@link ElementDescriptor} for the root Permission element. */
-    private final ElementDescriptor PERMISSION_ELEMENT;
-    /** The {@link ElementDescriptor} for the root UsesPermission element. */
-    private final ElementDescriptor USES_PERMISSION_ELEMENT;
-    /** The {@link ElementDescriptor} for the root UsesSdk element. */
-    private final ElementDescriptor USES_SDK_ELEMENT;
-
-    /** The {@link ElementDescriptor} for the root PermissionGroup element. */
-    private final ElementDescriptor PERMISSION_GROUP_ELEMENT;
-    /** The {@link ElementDescriptor} for the root PermissionTree element. */
-    private final ElementDescriptor PERMISSION_TREE_ELEMENT;
-
-    /** Private package attribute for the manifest element. Needs to be handled manually. */
-    private final TextAttributeDescriptor PACKAGE_ATTR_DESC;
-
-    public AndroidManifestDescriptors() {
-        APPLICATION_ELEMENT = createElement("application", null, Mandatory.MANDATORY_LAST); //$NON-NLS-1$ + no child & mandatory
-        INTRUMENTATION_ELEMENT = createElement("instrumentation"); //$NON-NLS-1$
-
-        PERMISSION_ELEMENT = createElement("permission"); //$NON-NLS-1$
-        USES_PERMISSION_ELEMENT = createElement(USES_PERMISSION);
-        USES_SDK_ELEMENT = createElement("uses-sdk", null, Mandatory.MANDATORY); //$NON-NLS-1$ + no child & mandatory
-
-        PERMISSION_GROUP_ELEMENT = createElement("permission-group"); //$NON-NLS-1$
-        PERMISSION_TREE_ELEMENT = createElement("permission-tree"); //$NON-NLS-1$
-
-        MANIFEST_ELEMENT = createElement(
-                        MANIFEST_NODE_NAME, // xml name
-                        new ElementDescriptor[] {
-                                        APPLICATION_ELEMENT,
-                                        INTRUMENTATION_ELEMENT,
-                                        PERMISSION_ELEMENT,
-                                        USES_PERMISSION_ELEMENT,
-                                        PERMISSION_GROUP_ELEMENT,
-                                        PERMISSION_TREE_ELEMENT,
-                                        USES_SDK_ELEMENT,
-                        },
-                        Mandatory.MANDATORY);
-
-        // The "package" attribute is treated differently as it doesn't have the standard
-        // Android XML namespace.
-        PACKAGE_ATTR_DESC = new PackageAttributeDescriptor(PACKAGE_ATTR,
-                null /* nsUri */,
-                new AttributeInfo(PACKAGE_ATTR, Format.REFERENCE_SET)).setTooltip(
-                    "This attribute gives a unique name for the package, using a Java-style " +
-                    "naming convention to avoid name collisions.\nFor example, applications " +
-                    "published by Google could have names of the form com.google.app.appname");
-    }
-
-    @Override
-    public ElementDescriptor[] getRootElementDescriptors() {
-        return new ElementDescriptor[] { MANIFEST_ELEMENT };
-    }
-
-    @Override
-    public ElementDescriptor getDescriptor() {
-        return getManifestElement();
-    }
-
-    public ElementDescriptor getApplicationElement() {
-        return APPLICATION_ELEMENT;
-    }
-
-    public ElementDescriptor getManifestElement() {
-        return MANIFEST_ELEMENT;
-    }
-
-    public ElementDescriptor getUsesSdkElement() {
-        return USES_SDK_ELEMENT;
-    }
-
-    public ElementDescriptor getInstrumentationElement() {
-        return INTRUMENTATION_ELEMENT;
-    }
-
-    public ElementDescriptor getPermissionElement() {
-        return PERMISSION_ELEMENT;
-    }
-
-    public ElementDescriptor getUsesPermissionElement() {
-        return USES_PERMISSION_ELEMENT;
-    }
-
-    public ElementDescriptor getPermissionGroupElement() {
-        return PERMISSION_GROUP_ELEMENT;
-    }
-
-    public ElementDescriptor getPermissionTreeElement() {
-        return PERMISSION_TREE_ELEMENT;
-    }
-
-    /**
-     * Updates the document descriptor.
-     * <p/>
-     * It first computes the new children of the descriptor and then updates them
-     * all at once.
-     *
-     * @param manifestMap The map style => attributes from the attrs_manifest.xml file
-     */
-    public synchronized void updateDescriptors(
-            Map<String, DeclareStyleableInfo> manifestMap) {
-
-        // -- setup the required attributes overrides --
-
-        Set<String> required = new HashSet<String>();
-        required.add("provider/authorities");  //$NON-NLS-1$
-
-        // -- setup the various attribute format overrides --
-
-        // The key for each override is "element1,element2,.../attr-xml-local-name" or
-        // "*/attr-xml-local-name" to match the attribute in any element.
-
-        Map<String, ITextAttributeCreator> overrides = new HashMap<String, ITextAttributeCreator>();
-
-        overrides.put("*/icon",             ReferenceAttributeDescriptor.CREATOR);  //$NON-NLS-1$
-
-        overrides.put("*/theme",            ThemeAttributeDescriptor.CREATOR);      //$NON-NLS-1$
-        overrides.put("*/permission",       ListAttributeDescriptor.CREATOR);       //$NON-NLS-1$
-        overrides.put("*/targetPackage",    ManifestPkgAttrDescriptor.CREATOR);     //$NON-NLS-1$
-
-        overrides.put("uses-library/name",  ListAttributeDescriptor.CREATOR);       //$NON-NLS-1$
-        overrides.put("action,category,uses-permission/" + ANDROID_NAME_ATTR,       //$NON-NLS-1$
-                                            ListAttributeDescriptor.CREATOR);
-
-        overrideClassName(overrides, "application",                                    //$NON-NLS-1$
-                                     SdkConstants.CLASS_APPLICATION,
-                                     false /*mandatory*/);
-        overrideClassName(overrides, "application/backupAgent",                        //$NON-NLS-1$
-                                     "android.app.backup.BackupAgent",                 //$NON-NLS-1$
-                                     false /*mandatory*/);
-        overrideClassName(overrides, "activity", SdkConstants.CLASS_ACTIVITY);         //$NON-NLS-1$
-        overrideClassName(overrides, "receiver", SdkConstants.CLASS_BROADCASTRECEIVER);//$NON-NLS-1$
-        overrideClassName(overrides, "service",  SdkConstants.CLASS_SERVICE);          //$NON-NLS-1$
-        overrideClassName(overrides, "provider", SdkConstants.CLASS_CONTENTPROVIDER);  //$NON-NLS-1$
-        overrideClassName(overrides, "instrumentation",
-                                                 SdkConstants.CLASS_INSTRUMENTATION);  //$NON-NLS-1$
-
-        // -- list element nodes already created --
-        // These elements are referenced by already opened editors, so we want to update them
-        // but not re-create them when reloading an SDK on the fly.
-
-        HashMap<String, ElementDescriptor> elementDescs =
-            new HashMap<String, ElementDescriptor>();
-        elementDescs.put(MANIFEST_ELEMENT.getXmlLocalName(),         MANIFEST_ELEMENT);
-        elementDescs.put(APPLICATION_ELEMENT.getXmlLocalName(),      APPLICATION_ELEMENT);
-        elementDescs.put(INTRUMENTATION_ELEMENT.getXmlLocalName(),   INTRUMENTATION_ELEMENT);
-        elementDescs.put(PERMISSION_ELEMENT.getXmlLocalName(),       PERMISSION_ELEMENT);
-        elementDescs.put(USES_PERMISSION_ELEMENT.getXmlLocalName(),  USES_PERMISSION_ELEMENT);
-        elementDescs.put(USES_SDK_ELEMENT.getXmlLocalName(),         USES_SDK_ELEMENT);
-        elementDescs.put(PERMISSION_GROUP_ELEMENT.getXmlLocalName(), PERMISSION_GROUP_ELEMENT);
-        elementDescs.put(PERMISSION_TREE_ELEMENT.getXmlLocalName(),  PERMISSION_TREE_ELEMENT);
-
-        // --
-
-        inflateElement(manifestMap,
-                overrides,
-                required,
-                elementDescs,
-                MANIFEST_ELEMENT,
-                "AndroidManifest"); //$NON-NLS-1$
-        insertAttribute(MANIFEST_ELEMENT, PACKAGE_ATTR_DESC);
-
-        XmlnsAttributeDescriptor xmlns = new XmlnsAttributeDescriptor(
-                SdkConstants.ANDROID_NS_NAME, SdkConstants.ANDROID_URI);
-        insertAttribute(MANIFEST_ELEMENT, xmlns);
-
-        /*
-         *
-         *
-         */
-        assert sanityCheck(manifestMap, MANIFEST_ELEMENT);
-    }
-
-    /**
-     * Sets up a mandatory attribute override using a ClassAttributeDescriptor
-     * with the specified class name.
-     *
-     * @param overrides The current map of overrides.
-     * @param elementName The element name to override, e.g. "application".
-     *  If this name does NOT have a slash (/), the ANDROID_NAME_ATTR attribute will be overriden.
-     *  Otherwise, if it contains a (/) the format is "element/attribute", for example
-     *  "application/name" vs "application/backupAgent".
-     * @param className The fully qualified name of the base class of the attribute.
-     */
-    private static void overrideClassName(
-            Map<String, ITextAttributeCreator> overrides,
-            String elementName,
-            final String className) {
-        overrideClassName(overrides, elementName, className, true);
-    }
-
-    /**
-     * Sets up an attribute override using a ClassAttributeDescriptor
-     * with the specified class name.
-     *
-     * @param overrides The current map of overrides.
-     * @param elementName The element name to override, e.g. "application".
-     *  If this name does NOT have a slash (/), the ANDROID_NAME_ATTR attribute will be overriden.
-     *  Otherwise, if it contains a (/) the format is "element/attribute", for example
-     *  "application/name" vs "application/backupAgent".
-     * @param className The fully qualified name of the base class of the attribute.
-     * @param mandatory True if this attribute is mandatory, false if optional.
-     */
-    private static void overrideClassName(
-            Map<String, ITextAttributeCreator> overrides,
-            String elementName,
-            final String className,
-            final boolean mandatory) {
-        if (elementName.indexOf('/') == -1) {
-            elementName = elementName + '/' + ANDROID_NAME_ATTR;
-        }
-        overrides.put(elementName,
-                new ITextAttributeCreator() {
-            @Override
-            public TextAttributeDescriptor create(String xmlName, String nsUri,
-                    IAttributeInfo attrInfo) {
-                if (attrInfo == null) {
-                    attrInfo = new AttributeInfo(xmlName, Format.STRING_SET );
-                }
-
-                if (SdkConstants.CLASS_ACTIVITY.equals(className)) {
-                    return new ClassAttributeDescriptor(
-                            className,
-                            PostActivityCreationAction.getAction(),
-                            xmlName,
-                            nsUri,
-                            attrInfo,
-                            mandatory,
-                            true /*defaultToProjectOnly*/);
-                } else if (SdkConstants.CLASS_BROADCASTRECEIVER.equals(className)) {
-                    return new ClassAttributeDescriptor(
-                            className,
-                            PostReceiverCreationAction.getAction(),
-                            xmlName,
-                            nsUri,
-                            attrInfo,
-                            mandatory,
-                            true /*defaultToProjectOnly*/);
-                } else if (SdkConstants.CLASS_INSTRUMENTATION.equals(className)) {
-                    return new ClassAttributeDescriptor(
-                            className,
-                            null, // no post action
-                            xmlName,
-                            nsUri,
-                            attrInfo,
-                            mandatory,
-                            false /*defaultToProjectOnly*/);
-                } else {
-                    return new ClassAttributeDescriptor(
-                            className,
-                            xmlName,
-                            nsUri,
-                            attrInfo,
-                            mandatory);
-                }
-            }
-        });
-    }
-
-    /**
-     * Returns a new ElementDescriptor constructed from the information given here
-     * and the javadoc & attributes extracted from the style map if any.
-     * <p/>
-     * Creates an element with no attribute overrides.
-     */
-    private ElementDescriptor createElement(
-            String xmlName,
-            ElementDescriptor[] childrenElements,
-            Mandatory mandatory) {
-        // Creates an element with no attribute overrides.
-        String styleName = guessStyleName(xmlName);
-        String sdkUrl = DescriptorsUtils.MANIFEST_SDK_URL + styleName;
-        String uiName = getUiName(xmlName);
-
-        ElementDescriptor element = new ManifestElementDescriptor(xmlName, uiName, null, sdkUrl,
-                null, childrenElements, mandatory);
-
-        return element;
-    }
-
-    /**
-     * Returns a new ElementDescriptor constructed from its XML local name.
-     * <p/>
-     * This version creates an element not mandatory.
-     */
-    private ElementDescriptor createElement(String xmlName) {
-        // Creates an element with no child and not mandatory
-        return createElement(xmlName, null, Mandatory.NOT_MANDATORY);
-    }
-
-    /**
-     * Inserts an attribute in this element attribute list if it is not present there yet
-     * (based on the attribute XML name.)
-     * The attribute is inserted at the beginning of the attribute list.
-     */
-    private void insertAttribute(ElementDescriptor element, AttributeDescriptor newAttr) {
-        AttributeDescriptor[] attributes = element.getAttributes();
-        for (AttributeDescriptor attr : attributes) {
-            if (attr.getXmlLocalName().equals(newAttr.getXmlLocalName())) {
-                return;
-            }
-        }
-
-        AttributeDescriptor[] newArray = new AttributeDescriptor[attributes.length + 1];
-        newArray[0] = newAttr;
-        System.arraycopy(attributes, 0, newArray, 1, attributes.length);
-        element.setAttributes(newArray);
-    }
-
-    /**
-     * "Inflates" the properties of an {@link ElementDescriptor} from the styleable declaration.
-     * <p/>
-     * This first creates all the attributes for the given ElementDescriptor.
-     * It then finds all children of the descriptor, inflates them recursively and sets them
-     * as child to this ElementDescriptor.
-     *
-     * @param styleMap The input styleable map for manifest elements & attributes.
-     * @param overrides A list of attribute overrides (to customize the type of the attribute
-     *          descriptors).
-     * @param requiredAttributes Set of attributes to be marked as required.
-     * @param existingElementDescs A map of already created element descriptors, keyed by
-     *          XML local name. This is used to use the static elements created initially by this
-     *          class, which are referenced directly by editors (so that reloading an SDK won't
-     *          break these references).
-     * @param elemDesc The current {@link ElementDescriptor} to inflate.
-     * @param styleName The name of the {@link ElementDescriptor} to inflate. Its XML local name
-     *          will be guessed automatically from the style name.
-     */
-    private void inflateElement(
-            Map<String, DeclareStyleableInfo> styleMap,
-            Map<String, ITextAttributeCreator> overrides,
-            Set<String> requiredAttributes,
-            HashMap<String, ElementDescriptor> existingElementDescs,
-            ElementDescriptor elemDesc,
-            String styleName) {
-        assert elemDesc != null;
-        assert styleName != null;
-        assert styleMap != null;
-
-        if (styleMap == null) {
-            return;
-        }
-
-        // define attributes
-        DeclareStyleableInfo style = styleMap.get(styleName);
-        if (style != null) {
-            ArrayList<AttributeDescriptor> attrDescs = new ArrayList<AttributeDescriptor>();
-            DescriptorsUtils.appendAttributes(attrDescs,
-                    elemDesc.getXmlLocalName(),
-                    SdkConstants.NS_RESOURCES,
-                    style.getAttributes(),
-                    requiredAttributes,
-                    overrides);
-            elemDesc.setTooltip(style.getJavaDoc());
-            elemDesc.setAttributes(attrDescs.toArray(new AttributeDescriptor[attrDescs.size()]));
-        }
-
-        // find all elements that have this one as parent
-        ArrayList<ElementDescriptor> children = new ArrayList<ElementDescriptor>();
-        for (Entry<String, DeclareStyleableInfo> entry : styleMap.entrySet()) {
-            DeclareStyleableInfo childStyle = entry.getValue();
-            boolean isParent = false;
-            String[] parents = childStyle.getParents();
-            if (parents != null) {
-                for (String parent: parents) {
-                    if (styleName.equals(parent)) {
-                        isParent = true;
-                        break;
-                    }
-                }
-            }
-            if (isParent) {
-                String childStyleName = entry.getKey();
-                String childXmlName = guessXmlName(childStyleName);
-
-                // create or re-use element
-                ElementDescriptor child = existingElementDescs.get(childXmlName);
-                if (child == null) {
-                    child = createElement(childXmlName);
-                    existingElementDescs.put(childXmlName, child);
-                }
-                children.add(child);
-
-                inflateElement(styleMap,
-                        overrides,
-                        requiredAttributes,
-                        existingElementDescs,
-                        child,
-                        childStyleName);
-            }
-        }
-        elemDesc.setChildren(children.toArray(new ElementDescriptor[children.size()]));
-    }
-
-    /**
-     * Get an UI name from the element XML name.
-     * <p/>
-     * Capitalizes the first letter and replace non-alphabet by a space followed by a capital.
-     */
-    private static String getUiName(String xmlName) {
-        StringBuilder sb = new StringBuilder();
-
-        boolean capitalize = true;
-        for (char c : xmlName.toCharArray()) {
-            if (capitalize && c >= 'a' && c <= 'z') {
-                sb.append((char)(c + 'A' - 'a'));
-                capitalize = false;
-            } else if ((c < 'A' || c > 'Z') && (c < 'a' || c > 'z')) {
-                sb.append(' ');
-                capitalize = true;
-            } else {
-                sb.append(c);
-            }
-        }
-
-        return sb.toString();
-    }
-
-    /**
-     * Guesses the style name for a given XML element name.
-     * <p/>
-     * The rules are:
-     * - capitalize the first letter:
-     * - if there's a dash, skip it and capitalize the next one
-     * - prefix AndroidManifest
-     * The exception is "manifest" which just becomes AndroidManifest.
-     * <p/>
-     * Examples:
-     * - manifest        => AndroidManifest
-     * - application     => AndroidManifestApplication
-     * - uses-permission => AndroidManifestUsesPermission
-     */
-    private String guessStyleName(String xmlName) {
-        StringBuilder sb = new StringBuilder();
-
-        if (!xmlName.equals(MANIFEST_NODE_NAME)) {
-            boolean capitalize = true;
-            for (char c : xmlName.toCharArray()) {
-                if (capitalize && c >= 'a' && c <= 'z') {
-                    sb.append((char)(c + 'A' - 'a'));
-                    capitalize = false;
-                } else if ((c < 'A' || c > 'Z') && (c < 'a' || c > 'z')) {
-                    // not a letter -- skip the character and capitalize the next one
-                    capitalize = true;
-                } else {
-                    sb.append(c);
-                }
-            }
-        }
-
-        sb.insert(0, ANDROID_MANIFEST_STYLEABLE);
-        return sb.toString();
-    }
-
-    /**
-     * This method performs a sanity check to make sure all the styles declared in the
-     * manifestMap are actually defined in the actual element descriptors and reachable from
-     * the manifestElement root node.
-     */
-    private boolean sanityCheck(Map<String, DeclareStyleableInfo> manifestMap,
-            ElementDescriptor manifestElement) {
-        TreeSet<String> elementsDeclared = new TreeSet<String>();
-        findAllElementNames(manifestElement, elementsDeclared);
-
-        TreeSet<String> stylesDeclared = new TreeSet<String>();
-        for (String styleName : manifestMap.keySet()) {
-            if (styleName.startsWith(ANDROID_MANIFEST_STYLEABLE)) {
-                stylesDeclared.add(styleName);
-            }
-        }
-
-        for (Iterator<String> it = elementsDeclared.iterator(); it.hasNext();) {
-            String xmlName = it.next();
-            String styleName = guessStyleName(xmlName);
-            if (stylesDeclared.remove(styleName)) {
-                it.remove();
-            }
-        }
-
-        StringBuilder sb = new StringBuilder();
-        if (!stylesDeclared.isEmpty()) {
-            sb.append("Warning, ADT/SDK Mismatch! The following elements are declared by the SDK but unknown to ADT: ");
-            for (String name : stylesDeclared) {
-                sb.append(guessXmlName(name));
-
-                if (!name.equals(stylesDeclared.last())) {
-                    sb.append(", ");    //$NON-NLS-1$
-                }
-            }
-
-            AdtPlugin.log(IStatus.WARNING, "%s", sb.toString());
-            AdtPlugin.printToConsole((String)null, sb);
-            sb.setLength(0);
-        }
-
-        if (!elementsDeclared.isEmpty()) {
-            sb.append("Warning, ADT/SDK Mismatch! The following elements are declared by ADT but not by the SDK: ");
-            for (String name : elementsDeclared) {
-                sb.append(name);
-                if (!name.equals(elementsDeclared.last())) {
-                    sb.append(", ");    //$NON-NLS-1$
-                }
-            }
-
-            AdtPlugin.log(IStatus.WARNING, "%s", sb.toString());
-            AdtPlugin.printToConsole((String)null, sb);
-        }
-
-        return true;
-    }
-
-    /**
-     * Performs an approximate translation of the style name into a potential
-     * xml name. This is more or less the reverse from guessStyleName().
-     *
-     * @return The XML local name for a given style name.
-     */
-    private String guessXmlName(String name) {
-        StringBuilder sb = new StringBuilder();
-        if (ANDROID_MANIFEST_STYLEABLE.equals(name)) {
-            sb.append(MANIFEST_NODE_NAME);
-        } else {
-            name = name.replace(ANDROID_MANIFEST_STYLEABLE, "");                //$NON-NLS-1$
-            boolean first_char = true;
-            for (char c : name.toCharArray()) {
-                if (c >= 'A' && c <= 'Z') {
-                    if (!first_char) {
-                        sb.append('-');
-                    }
-                    c = (char) (c - 'A' + 'a');
-                }
-                sb.append(c);
-                first_char = false;
-            }
-        }
-        return sb.toString();
-    }
-
-    /**
-     * Helper method used by {@link #sanityCheck(Map, ElementDescriptor)} to find all the
-     * {@link ElementDescriptor} names defined by the tree of descriptors.
-     * <p/>
-     * Note: this assumes no circular reference in the tree of {@link ElementDescriptor}s.
-     */
-    private void findAllElementNames(ElementDescriptor element, TreeSet<String> declared) {
-        declared.add(element.getXmlName());
-        for (ElementDescriptor desc : element.getChildren()) {
-            findAllElementNames(desc, declared);
-        }
-    }
-
-
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/manifest/descriptors/ClassAttributeDescriptor.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/manifest/descriptors/ClassAttributeDescriptor.java
deleted file mode 100644
index 1a27f8d..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/manifest/descriptors/ClassAttributeDescriptor.java
+++ /dev/null
@@ -1,106 +0,0 @@
-/*
- * Copyright (C) 2007 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.editors.manifest.descriptors;
-
-import com.android.SdkConstants;
-import com.android.ide.common.api.IAttributeInfo;
-import com.android.ide.eclipse.adt.internal.editors.descriptors.TextAttributeDescriptor;
-import com.android.ide.eclipse.adt.internal.editors.manifest.model.UiClassAttributeNode;
-import com.android.ide.eclipse.adt.internal.editors.manifest.model.UiClassAttributeNode.IPostTypeCreationAction;
-import com.android.ide.eclipse.adt.internal.editors.uimodel.UiAttributeNode;
-import com.android.ide.eclipse.adt.internal.editors.uimodel.UiElementNode;
-
-/**
- * Describes an XML attribute representing a class name.
- * It is displayed by a {@link UiClassAttributeNode}.
- */
-public class ClassAttributeDescriptor extends TextAttributeDescriptor {
-
-    /** Superclass of the class value. */
-    private String mSuperClassName;
-
-    private IPostTypeCreationAction mPostCreationAction;
-
-    /** indicates if the class parameter is mandatory */
-    boolean mMandatory;
-
-    private final boolean mDefaultToProjectOnly;
-
-    /**
-     * Creates a new {@link ClassAttributeDescriptor}
-     * @param superClassName the fully qualified name of the superclass of the class represented
-     * by the attribute.
-     * @param xmlLocalName The XML name of the attribute (case sensitive, with android: prefix).
-     * @param nsUri The URI of the attribute. Can be null if attribute has no namespace.
-     *              See {@link SdkConstants#NS_RESOURCES} for a common value.
-     * @param attrInfo The {@link IAttributeInfo} of this attribute. Can't be null.
-     * @param mandatory indicates if the class attribute is mandatory.
-     */
-    public ClassAttributeDescriptor(String superClassName,
-            String xmlLocalName,
-            String nsUri,
-            IAttributeInfo attrInfo,
-            boolean mandatory) {
-        super(xmlLocalName, nsUri, attrInfo);
-        mSuperClassName = superClassName;
-        mDefaultToProjectOnly = true;
-        if (mandatory) {
-            mMandatory = true;
-            setRequired(true);
-        }
-    }
-
-    /**
-     * Creates a new {@link ClassAttributeDescriptor}
-     * @param superClassName the fully qualified name of the superclass of the class represented
-     * by the attribute.
-     * @param postCreationAction the {@link IPostTypeCreationAction} to be executed on the
-     *        newly created class.
-     * @param xmlLocalName The XML local name of the attribute (case sensitive).
-     * @param nsUri The URI of the attribute. Can be null if attribute has no namespace.
-     *              See {@link SdkConstants#NS_RESOURCES} for a common value.
-     * @param attrInfo The {@link IAttributeInfo} of this attribute. Can't be null.
-     * @param mandatory indicates if the class attribute is mandatory.
-     * @param defaultToProjectOnly True if only classes from the sources of this project should
-     *         be shown by default in the class browser.
-     */
-    public ClassAttributeDescriptor(String superClassName,
-            IPostTypeCreationAction postCreationAction,
-            String xmlLocalName,
-            String nsUri,
-            IAttributeInfo attrInfo,
-            boolean mandatory,
-            boolean defaultToProjectOnly) {
-        super(xmlLocalName, nsUri, attrInfo);
-        mSuperClassName = superClassName;
-        mPostCreationAction = postCreationAction;
-        mDefaultToProjectOnly = defaultToProjectOnly;
-        if (mandatory) {
-            mMandatory = true;
-            setRequired(true);
-        }
-    }
-
-    /**
-     * @return A new {@link UiClassAttributeNode} linked to this descriptor.
-     */
-    @Override
-    public UiAttributeNode createUiNode(UiElementNode uiParent) {
-        return new UiClassAttributeNode(mSuperClassName, mPostCreationAction,
-                mMandatory, this, uiParent, mDefaultToProjectOnly);
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/manifest/descriptors/ManifestElementDescriptor.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/manifest/descriptors/ManifestElementDescriptor.java
deleted file mode 100644
index deb815e..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/manifest/descriptors/ManifestElementDescriptor.java
+++ /dev/null
@@ -1,123 +0,0 @@
-/*
- * Copyright (C) 2007 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.editors.manifest.descriptors;
-
-import com.android.ide.eclipse.adt.internal.editors.descriptors.AttributeDescriptor;
-import com.android.ide.eclipse.adt.internal.editors.descriptors.ElementDescriptor;
-import com.android.ide.eclipse.adt.internal.editors.manifest.model.UiManifestElementNode;
-import com.android.ide.eclipse.adt.internal.editors.uimodel.UiElementNode;
-
-/**
- * {@link ManifestElementDescriptor} describes an XML element node, with its
- * element name, its possible attributes, its possible child elements but also
- * its display name and tooltip.
- *
- * This {@link ElementDescriptor} is specialized to create {@link UiManifestElementNode} UI nodes.
- */
-public class ManifestElementDescriptor extends ElementDescriptor {
-
-    /**
-     * Constructs a new {@link ManifestElementDescriptor}.
-     *
-     * @param xml_name The XML element node name. Case sensitive.
-     * @param ui_name The XML element name for the user interface, typically capitalized.
-     * @param tooltip An optional tooltip. Can be null or empty.
-     * @param sdk_url An optional SKD URL. Can be null or empty.
-     * @param attributes The list of allowed attributes. Can be null or empty.
-     * @param children The list of allowed children. Can be null or empty.
-     * @param mandatory Whether this node must always exist (even for empty models).
-     */
-    public ManifestElementDescriptor(String xml_name,
-            String ui_name,
-            String tooltip,
-            String sdk_url,
-            AttributeDescriptor[] attributes,
-            ElementDescriptor[] children,
-            Mandatory mandatory) {
-        super(xml_name, ui_name, tooltip, sdk_url, attributes, children, mandatory);
-    }
-
-    /**
-     * Constructs a new {@link ManifestElementDescriptor}.
-     *
-     * @param xml_name The XML element node name. Case sensitive.
-     * @param ui_name The XML element name for the user interface, typically capitalized.
-     * @param tooltip An optional tooltip. Can be null or empty.
-     * @param sdk_url An optional SKD URL. Can be null or empty.
-     * @param attributes The list of allowed attributes. Can be null or empty.
-     * @param children The list of allowed children. Can be null or empty.
-     * @param mandatory Whether this node must always exist (even for empty models).
-     */
-    public ManifestElementDescriptor(String xml_name,
-            String ui_name,
-            String tooltip,
-            String sdk_url,
-            AttributeDescriptor[] attributes,
-            ElementDescriptor[] children,
-            boolean mandatory) {
-        super(xml_name, ui_name, tooltip, sdk_url, attributes, children, mandatory);
-    }
-
-    /**
-     * Constructs a new {@link ManifestElementDescriptor}.
-     *
-     * @param xml_name The XML element node name. Case sensitive.
-     * @param ui_name The XML element name for the user interface, typically capitalized.
-     * @param tooltip An optional tooltip. Can be null or empty.
-     * @param sdk_url An optional SKD URL. Can be null or empty.
-     * @param attributes The list of allowed attributes. Can be null or empty.
-     * @param children The list of allowed children. Can be null or empty.
-     */
-    public ManifestElementDescriptor(String xml_name,
-            String ui_name,
-            String tooltip,
-            String sdk_url,
-            AttributeDescriptor[] attributes,
-            ElementDescriptor[] children) {
-        super(xml_name, ui_name, tooltip, sdk_url, attributes, children, false);
-    }
-
-    /**
-     * This is a shortcut for
-     * ManifestElementDescriptor(xml_name, xml_name.capitalize(), null, null, null, children).
-     * This constructor is mostly used for unit tests.
-     *
-     * @param xml_name The XML element node name. Case sensitive.
-     */
-    public ManifestElementDescriptor(String xml_name, ElementDescriptor[] children) {
-        super(xml_name, children);
-    }
-
-    /**
-     * This is a shortcut for
-     * ManifestElementDescriptor(xml_name, xml_name.capitalize(), null, null, null, null).
-     * This constructor is mostly used for unit tests.
-     *
-     * @param xml_name The XML element node name. Case sensitive.
-     */
-    public ManifestElementDescriptor(String xml_name) {
-        super(xml_name, null);
-    }
-
-    /**
-     * @return A new {@link UiElementNode} linked to this descriptor.
-     */
-    @Override
-    public UiElementNode createUiNode() {
-        return new UiManifestElementNode(this);
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/manifest/descriptors/ManifestPkgAttrDescriptor.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/manifest/descriptors/ManifestPkgAttrDescriptor.java
deleted file mode 100755
index 74b7894..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/manifest/descriptors/ManifestPkgAttrDescriptor.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * Copyright (C) 2009 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.editors.manifest.descriptors;
-
-import com.android.ide.common.api.IAttributeInfo;
-import com.android.ide.eclipse.adt.internal.editors.descriptors.DescriptorsUtils;
-import com.android.ide.eclipse.adt.internal.editors.descriptors.ITextAttributeCreator;
-import com.android.ide.eclipse.adt.internal.editors.descriptors.TextAttributeDescriptor;
-import com.android.ide.eclipse.adt.internal.editors.manifest.model.UiManifestPkgAttrNode;
-import com.android.ide.eclipse.adt.internal.editors.uimodel.UiAttributeNode;
-import com.android.ide.eclipse.adt.internal.editors.uimodel.UiElementNode;
-
-/**
- * Describes a package XML attribute. It is displayed by a {@link UiManifestPkgAttrNode}.
- * <p/>
- * Used by the override for .../targetPackage in {@link AndroidManifestDescriptors}.
- */
-public class ManifestPkgAttrDescriptor extends TextAttributeDescriptor {
-
-    /**
-     * Used by {@link DescriptorsUtils} to create instances of this descriptor.
-     */
-    public static final ITextAttributeCreator CREATOR = new ITextAttributeCreator() {
-        @Override
-        public TextAttributeDescriptor create(String xmlLocalName,
-                String nsUri, IAttributeInfo attrInfo) {
-            return new ManifestPkgAttrDescriptor(xmlLocalName, nsUri, attrInfo);
-        }
-    };
-
-    public ManifestPkgAttrDescriptor(String xmlLocalName, String nsUri, IAttributeInfo attrInfo) {
-        super(xmlLocalName, nsUri, attrInfo);
-    }
-
-    /**
-     * @return A new {@link UiManifestPkgAttrNode} linked to this descriptor.
-     */
-    @Override
-    public UiAttributeNode createUiNode(UiElementNode uiParent) {
-        return new UiManifestPkgAttrNode(this, uiParent);
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/manifest/descriptors/PackageAttributeDescriptor.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/manifest/descriptors/PackageAttributeDescriptor.java
deleted file mode 100644
index e8395ac..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/manifest/descriptors/PackageAttributeDescriptor.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Copyright (C) 2007 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.editors.manifest.descriptors;
-
-import com.android.ide.common.api.IAttributeInfo;
-import com.android.ide.eclipse.adt.internal.editors.descriptors.TextAttributeDescriptor;
-import com.android.ide.eclipse.adt.internal.editors.manifest.model.UiPackageAttributeNode;
-import com.android.ide.eclipse.adt.internal.editors.uimodel.UiAttributeNode;
-import com.android.ide.eclipse.adt.internal.editors.uimodel.UiElementNode;
-
-/**
- * Describes a package XML attribute. It is displayed by a {@link UiPackageAttributeNode}.
- */
-public class PackageAttributeDescriptor extends TextAttributeDescriptor {
-
-    public PackageAttributeDescriptor(String xmlLocalName, String nsUri, IAttributeInfo attrInfo) {
-        super(xmlLocalName, nsUri, attrInfo);
-    }
-
-    /**
-     * @return A new {@link UiPackageAttributeNode} linked to this descriptor.
-     */
-    @Override
-    public UiAttributeNode createUiNode(UiElementNode uiParent) {
-        return new UiPackageAttributeNode(this, uiParent);
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/manifest/descriptors/PostActivityCreationAction.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/manifest/descriptors/PostActivityCreationAction.java
deleted file mode 100644
index 60c663d..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/manifest/descriptors/PostActivityCreationAction.java
+++ /dev/null
@@ -1,89 +0,0 @@
-/*
- * Copyright (C) 2007 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.editors.manifest.descriptors;
-
-import com.android.SdkConstants;
-import com.android.ide.eclipse.adt.internal.editors.manifest.model.UiClassAttributeNode.IPostTypeCreationAction;
-
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.jdt.core.ICompilationUnit;
-import org.eclipse.jdt.core.IJavaElement;
-import org.eclipse.jdt.core.IType;
-import org.eclipse.jdt.core.JavaModelException;
-
-/**
- * Action to be executed after an Activity class is created.
- */
-class PostActivityCreationAction implements IPostTypeCreationAction {
-
-    private final static PostActivityCreationAction sAction = new PostActivityCreationAction();
-
-    private PostActivityCreationAction() {
-        // private constructor to enforce singleton.
-    }
-
-
-    /**
-     * Returns the action.
-     */
-    public static IPostTypeCreationAction getAction() {
-        return sAction;
-    }
-
-    /**
-     * Processes a newly created Activity.
-     *
-     */
-    @Override
-    public void processNewType(IType newType) {
-        try {
-            String methodContent =
-                "    /** Called when the activity is first created. */\n" +
-                "    @Override\n" +
-                "    public void onCreate(Bundle savedInstanceState) {\n" +
-                "        super.onCreate(savedInstanceState);\n" +
-                "\n" +
-                "        // TODO Auto-generated method stub\n" +
-                "    }";
-            newType.createMethod(methodContent, null /* sibling*/, false /* force */,
-                    new NullProgressMonitor());
-
-            // we need to add the import for Bundle, so we need the compilation unit.
-            // Since the type could be enclosed in other types, we loop till we find it.
-            ICompilationUnit compilationUnit = null;
-            IJavaElement element = newType;
-            do {
-                IJavaElement parentElement = element.getParent();
-                if (parentElement !=  null) {
-                    if (parentElement.getElementType() == IJavaElement.COMPILATION_UNIT) {
-                        compilationUnit = (ICompilationUnit)parentElement;
-                    }
-
-                    element = parentElement;
-                } else {
-                    break;
-                }
-            } while (compilationUnit == null);
-
-            if (compilationUnit != null) {
-                compilationUnit.createImport(SdkConstants.CLASS_BUNDLE,
-                        null /* sibling */, new NullProgressMonitor());
-            }
-        } catch (JavaModelException e) {
-        }
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/manifest/descriptors/PostReceiverCreationAction.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/manifest/descriptors/PostReceiverCreationAction.java
deleted file mode 100644
index 8b2c361..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/manifest/descriptors/PostReceiverCreationAction.java
+++ /dev/null
@@ -1,89 +0,0 @@
-/*
- * Copyright (C) 2007 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.editors.manifest.descriptors;
-
-import com.android.SdkConstants;
-import com.android.ide.eclipse.adt.internal.editors.manifest.model.UiClassAttributeNode.IPostTypeCreationAction;
-
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.jdt.core.ICompilationUnit;
-import org.eclipse.jdt.core.IJavaElement;
-import org.eclipse.jdt.core.IType;
-import org.eclipse.jdt.core.JavaModelException;
-
-/**
- * Action to be executed after an BroadcastReceiver class is created.
- */
-class PostReceiverCreationAction implements IPostTypeCreationAction {
-
-    private final static PostReceiverCreationAction sAction = new PostReceiverCreationAction();
-
-    private PostReceiverCreationAction() {
-        // private constructor to enforce singleton.
-    }
-
-    /**
-     * Returns the action.
-     */
-    public static IPostTypeCreationAction getAction() {
-        return sAction;
-    }
-
-    /**
-     * Processes a newly created Activity.
-     *
-     */
-    @Override
-    public void processNewType(IType newType) {
-        try {
-            String methodContent =
-                "    @Override\n" +
-                "    public void onReceive(Context context, Intent intent) {\n" +
-                "        // TODO Auto-generated method stub\n" +
-                "    }";
-            newType.createMethod(methodContent, null /* sibling*/, false /* force */,
-                    new NullProgressMonitor());
-
-            // we need to add the import for Bundle, so we need the compilation unit.
-            // Since the type could be enclosed in other types, we loop till we find it.
-            ICompilationUnit compilationUnit = null;
-            IJavaElement element = newType;
-            do {
-                IJavaElement parentElement = element.getParent();
-                if (parentElement !=  null) {
-                    if (parentElement.getElementType() == IJavaElement.COMPILATION_UNIT) {
-                        compilationUnit = (ICompilationUnit)parentElement;
-                    }
-
-                    element = parentElement;
-                } else {
-                    break;
-                }
-            } while (compilationUnit == null);
-
-            if (compilationUnit != null) {
-                compilationUnit.createImport(SdkConstants.CLASS_CONTEXT,
-                        null /* sibling */, new NullProgressMonitor());
-                compilationUnit.createImport(SdkConstants.CLASS_INTENT,
-                        null /* sibling */, new NullProgressMonitor());
-            }
-        } catch (JavaModelException e) {
-            // looks like the class already existed (this happens when the user check to create
-            // inherited abstract methods).
-        }
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/manifest/descriptors/ThemeAttributeDescriptor.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/manifest/descriptors/ThemeAttributeDescriptor.java
deleted file mode 100644
index 881d753..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/manifest/descriptors/ThemeAttributeDescriptor.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * Copyright (C) 2007 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.editors.manifest.descriptors;
-
-import com.android.ide.common.api.IAttributeInfo;
-import com.android.ide.eclipse.adt.internal.editors.descriptors.DescriptorsUtils;
-import com.android.ide.eclipse.adt.internal.editors.descriptors.ITextAttributeCreator;
-import com.android.ide.eclipse.adt.internal.editors.descriptors.TextAttributeDescriptor;
-import com.android.ide.eclipse.adt.internal.editors.uimodel.UiAttributeNode;
-import com.android.ide.eclipse.adt.internal.editors.uimodel.UiElementNode;
-import com.android.ide.eclipse.adt.internal.editors.uimodel.UiResourceAttributeNode;
-import com.android.resources.ResourceType;
-
-/**
- * Describes a Theme/Style XML attribute displayed by a {@link UiResourceAttributeNode}
- * <p/>
- * Used by the override for .../theme in {@link AndroidManifestDescriptors}.
- */
-public final class ThemeAttributeDescriptor extends TextAttributeDescriptor {
-
-    /**
-     * Used by {@link DescriptorsUtils} to create instances of this descriptor.
-     */
-    public static final ITextAttributeCreator CREATOR = new ITextAttributeCreator() {
-        @Override
-        public TextAttributeDescriptor create(String xmlLocalName,
-                String nsUri, IAttributeInfo attrInfo) {
-            return new ThemeAttributeDescriptor(xmlLocalName, nsUri, attrInfo);
-        }
-    };
-
-    public ThemeAttributeDescriptor(String xmlLocalName, String nsUri, IAttributeInfo attrInfo) {
-        super(xmlLocalName, nsUri, attrInfo);
-    }
-
-    /**
-     * @return A new {@link UiResourceAttributeNode} linked to this theme descriptor.
-     */
-    @Override
-    public UiAttributeNode createUiNode(UiElementNode uiParent) {
-        return new UiResourceAttributeNode(ResourceType.STYLE, this, uiParent);
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/manifest/model/UiClassAttributeNode.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/manifest/model/UiClassAttributeNode.java
deleted file mode 100644
index 4c829d9..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/manifest/model/UiClassAttributeNode.java
+++ /dev/null
@@ -1,736 +0,0 @@
-/*
- * Copyright (C) 2007 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.editors.manifest.model;
-
-import com.android.SdkConstants;
-import com.android.ide.eclipse.adt.AdtConstants;
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.ide.eclipse.adt.internal.editors.AndroidXmlEditor;
-import com.android.ide.eclipse.adt.internal.editors.descriptors.AttributeDescriptor;
-import com.android.ide.eclipse.adt.internal.editors.descriptors.TextAttributeDescriptor;
-import com.android.ide.eclipse.adt.internal.editors.manifest.descriptors.AndroidManifestDescriptors;
-import com.android.ide.eclipse.adt.internal.editors.ui.SectionHelper;
-import com.android.ide.eclipse.adt.internal.editors.uimodel.UiElementNode;
-import com.android.ide.eclipse.adt.internal.editors.uimodel.UiTextAttributeNode;
-import com.android.ide.eclipse.adt.internal.project.BaseProjectHelper;
-import com.android.xml.AndroidManifest;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.jdt.core.Flags;
-import org.eclipse.jdt.core.IClasspathEntry;
-import org.eclipse.jdt.core.IJavaElement;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.IPackageFragment;
-import org.eclipse.jdt.core.IPackageFragmentRoot;
-import org.eclipse.jdt.core.IType;
-import org.eclipse.jdt.core.ITypeHierarchy;
-import org.eclipse.jdt.core.JavaCore;
-import org.eclipse.jdt.core.JavaModelException;
-import org.eclipse.jdt.core.search.IJavaSearchScope;
-import org.eclipse.jdt.core.search.SearchEngine;
-import org.eclipse.jdt.ui.IJavaElementSearchConstants;
-import org.eclipse.jdt.ui.JavaUI;
-import org.eclipse.jdt.ui.actions.OpenNewClassWizardAction;
-import org.eclipse.jdt.ui.dialogs.ITypeInfoFilterExtension;
-import org.eclipse.jdt.ui.dialogs.ITypeInfoRequestor;
-import org.eclipse.jdt.ui.dialogs.ITypeSelectionComponent;
-import org.eclipse.jdt.ui.dialogs.TypeSelectionExtension;
-import org.eclipse.jdt.ui.wizards.NewClassWizardPage;
-import org.eclipse.jface.dialogs.IMessageProvider;
-import org.eclipse.jface.window.Window;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.DisposeEvent;
-import org.eclipse.swt.events.DisposeListener;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IFileEditorInput;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.dialogs.SelectionDialog;
-import org.eclipse.ui.forms.IManagedForm;
-import org.eclipse.ui.forms.events.HyperlinkAdapter;
-import org.eclipse.ui.forms.events.HyperlinkEvent;
-import org.eclipse.ui.forms.widgets.FormText;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-import org.eclipse.ui.forms.widgets.TableWrapData;
-import org.w3c.dom.Element;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-/**
- * Represents an XML attribute for a class, that can be modified using a simple text field or
- * a dialog to choose an existing class. Also, there's a link to create a new class.
- * <p/>
- * See {@link UiTextAttributeNode} for more information.
- */
-public class UiClassAttributeNode extends UiTextAttributeNode {
-
-    private String mReferenceClass;
-    private IPostTypeCreationAction mPostCreationAction;
-    private boolean mMandatory;
-    private final boolean mDefaultToProjectOnly;
-
-    private class HierarchyTypeSelection extends TypeSelectionExtension {
-
-        private IJavaProject mJavaProject;
-        private IType mReferenceType;
-        private Button mProjectOnly;
-        private boolean mUseProjectOnly;
-
-        public HierarchyTypeSelection(IProject project, String referenceClass)
-                throws JavaModelException {
-            mJavaProject = JavaCore.create(project);
-            mReferenceType = mJavaProject.findType(referenceClass);
-        }
-
-        @Override
-        public ITypeInfoFilterExtension getFilterExtension() {
-            return new ITypeInfoFilterExtension() {
-                @Override
-                public boolean select(ITypeInfoRequestor typeInfoRequestor) {
-
-                    boolean projectOnly = mUseProjectOnly;
-
-                    String packageName = typeInfoRequestor.getPackageName();
-                    String typeName = typeInfoRequestor.getTypeName();
-                    String enclosingType = typeInfoRequestor.getEnclosingName();
-
-                    // build the full class name.
-                    StringBuilder sb = new StringBuilder(packageName);
-                    sb.append('.');
-                    if (enclosingType.length() > 0) {
-                        sb.append(enclosingType);
-                        sb.append('.');
-                    }
-                    sb.append(typeName);
-
-                    String className = sb.toString();
-
-                    try {
-                        IType type = mJavaProject.findType(className);
-
-                        if (type == null) {
-                            return false;
-                        }
-
-                        // don't display abstract classes
-                        if ((type.getFlags() & Flags.AccAbstract) != 0) {
-                            return false;
-                        }
-
-                        // if project-only is selected, make sure the package fragment is
-                        // an actual source (thus "from this project").
-                        if (projectOnly) {
-                            IPackageFragment frag = type.getPackageFragment();
-                            if (frag == null || frag.getKind() != IPackageFragmentRoot.K_SOURCE) {
-                                return false;
-                            }
-                        }
-
-                        // get the type hierarchy and reference type is one of the super classes.
-                        ITypeHierarchy hierarchy = type.newSupertypeHierarchy(
-                                new NullProgressMonitor());
-
-                        IType[] supertypes = hierarchy.getAllSupertypes(type);
-                        int n = supertypes.length;
-                        for (int i = 0; i < n; i++) {
-                            IType st = supertypes[i];
-                            if (mReferenceType.equals(st)) {
-                                return true;
-                            }
-                        }
-                    } catch (JavaModelException e) {
-                    }
-
-                    return false;
-                }
-            };
-        }
-
-        @Override
-        public Control createContentArea(Composite parent) {
-
-            mProjectOnly = new Button(parent, SWT.CHECK);
-            mProjectOnly.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-            mProjectOnly.setText(String.format("Display classes from sources of project '%s' only",
-                    mJavaProject.getProject().getName()));
-
-            mUseProjectOnly = mDefaultToProjectOnly;
-            mProjectOnly.setSelection(mUseProjectOnly);
-
-            mProjectOnly.addSelectionListener(new SelectionAdapter() {
-                @Override
-                public void widgetSelected(SelectionEvent e) {
-                    super.widgetSelected(e);
-                    mUseProjectOnly = mProjectOnly.getSelection();
-                    getTypeSelectionComponent().triggerSearch();
-                }
-            });
-
-            return super.createContentArea(parent);
-        }
-    }
-
-    /**
-     * Classes which implement this interface provide a method processing newly created classes.
-     */
-    public static interface IPostTypeCreationAction {
-        /**
-         * Sent to process a newly created class.
-         * @param newType the IType representing the newly created class.
-         */
-        public void processNewType(IType newType);
-    }
-
-    /**
-     * Creates a {@link UiClassAttributeNode} object that will display ui to select or create
-     * classes.
-     * @param referenceClass The allowed supertype of the classes that are to be selected
-     * or created. Can be null.
-     * @param postCreationAction a {@link IPostTypeCreationAction} object handling post creation
-     * modification of the class.
-     * @param mandatory indicates if the class value is mandatory
-     * @param attributeDescriptor the {@link AttributeDescriptor} object linked to the Ui Node.
-     * @param defaultToProjectOnly When true display classes of this project only by default.
-     *         When false any class path will be considered. The user can always toggle this.
-     */
-    public UiClassAttributeNode(String referenceClass, IPostTypeCreationAction postCreationAction,
-            boolean mandatory, AttributeDescriptor attributeDescriptor, UiElementNode uiParent,
-            boolean defaultToProjectOnly) {
-        super(attributeDescriptor, uiParent);
-
-        mReferenceClass = referenceClass;
-        mPostCreationAction = postCreationAction;
-        mMandatory = mandatory;
-        mDefaultToProjectOnly = defaultToProjectOnly;
-    }
-
-    /* (non-java doc)
-     * Creates a label widget and an associated text field.
-     * <p/>
-     * As most other parts of the android manifest editor, this assumes the
-     * parent uses a table layout with 2 columns.
-     */
-    @Override
-    public void createUiControl(final Composite parent, IManagedForm managedForm) {
-        setManagedForm(managedForm);
-        FormToolkit toolkit = managedForm.getToolkit();
-        TextAttributeDescriptor desc = (TextAttributeDescriptor) getDescriptor();
-
-        StringBuilder label = new StringBuilder();
-        label.append("<form><p><a href='unused'>");
-        label.append(desc.getUiName());
-        label.append("</a></p></form>");
-        FormText formText = SectionHelper.createFormText(parent, toolkit, true /* isHtml */,
-                label.toString(), true /* setupLayoutData */);
-        formText.addHyperlinkListener(new HyperlinkAdapter() {
-            @Override
-            public void linkActivated(HyperlinkEvent e) {
-                super.linkActivated(e);
-                handleLabelClick();
-            }
-        });
-        formText.setLayoutData(new TableWrapData(TableWrapData.LEFT, TableWrapData.MIDDLE));
-        SectionHelper.addControlTooltip(formText, desc.getTooltip());
-
-        Composite composite = toolkit.createComposite(parent);
-        composite.setLayoutData(new TableWrapData(TableWrapData.FILL_GRAB, TableWrapData.MIDDLE));
-        GridLayout gl = new GridLayout(2, false);
-        gl.marginHeight = gl.marginWidth = 0;
-        composite.setLayout(gl);
-        // Fixes missing text borders under GTK... also requires adding a 1-pixel margin
-        // for the text field below
-        toolkit.paintBordersFor(composite);
-
-        final Text text = toolkit.createText(composite, getCurrentValue());
-        GridData gd = new GridData(GridData.FILL_HORIZONTAL);
-        gd.horizontalIndent = 1;  // Needed by the fixed composite borders under GTK
-        text.setLayoutData(gd);
-        Button browseButton = toolkit.createButton(composite, "Browse...", SWT.PUSH);
-
-        setTextWidget(text);
-
-        browseButton.addSelectionListener(new SelectionAdapter() {
-            @Override
-            public void widgetSelected(SelectionEvent e) {
-                super.widgetSelected(e);
-                handleBrowseClick();
-            }
-        });
-    }
-
-    /* (non-java doc)
-     *
-     * Add a modify listener that will check the validity of the class
-     */
-    @Override
-    protected void onAddValidators(final Text text) {
-        ModifyListener listener = new ModifyListener() {
-            @Override
-            public void modifyText(ModifyEvent e) {
-                try {
-                    String textValue = text.getText().trim();
-                    if (textValue.length() == 0) {
-                        if (mMandatory) {
-                            setErrorMessage("Value is mandatory", text);
-                        } else {
-                            setErrorMessage(null, text);
-                        }
-                        return;
-                    }
-                    // first we need the current java package.
-                    String javaPackage = getManifestPackage();
-
-                    // build the fully qualified name of the class
-                    String className = AndroidManifest.combinePackageAndClassName(
-                            javaPackage, textValue);
-
-                    // only test the vilibility for activities.
-                    boolean testVisibility = SdkConstants.CLASS_ACTIVITY.equals(
-                            mReferenceClass);
-
-                    // test the class
-                    setErrorMessage(BaseProjectHelper.testClassForManifest(
-                            BaseProjectHelper.getJavaProject(getProject()), className,
-                            mReferenceClass, testVisibility), text);
-                } catch (CoreException ce) {
-                    setErrorMessage(ce.getMessage(), text);
-                }
-            }
-        };
-
-        text.addModifyListener(listener);
-
-        // Make sure the validator removes its message(s) when the widget is disposed
-        text.addDisposeListener(new DisposeListener() {
-            @Override
-            public void widgetDisposed(DisposeEvent e) {
-                // we don't want to use setErrorMessage, because we don't want to reset
-                // the error flag in the UiAttributeNode
-                getManagedForm().getMessageManager().removeMessage(text, text);
-            }
-        });
-
-        // Finally call the validator once to make sure the initial value is processed
-        listener.modifyText(null);
-    }
-
-    private void handleBrowseClick() {
-        Text text = getTextWidget();
-
-        // we need to get the project of the manifest.
-        IProject project = getProject();
-        if (project != null) {
-
-            // Create a search scope including only the source folder of the current
-            // project.
-            IPackageFragmentRoot[] packageFragmentRoots = getPackageFragmentRoots(project,
-                    true /*include_containers*/);
-            IJavaSearchScope scope = SearchEngine.createJavaSearchScope(
-                    packageFragmentRoots,
-                    false);
-
-            try {
-                SelectionDialog dlg = JavaUI.createTypeDialog(text.getShell(),
-                    PlatformUI.getWorkbench().getProgressService(),
-                    scope,
-                    IJavaElementSearchConstants.CONSIDER_CLASSES,  // style
-                    false, // no multiple selection
-                    "**",  //$NON-NLS-1$ //filter
-                    new HierarchyTypeSelection(project, mReferenceClass));
-                dlg.setMessage(String.format("Select class name for element %1$s:",
-                        getUiParent().getBreadcrumbTrailDescription(false /* include_root */)));
-                if (dlg instanceof ITypeSelectionComponent) {
-                    ((ITypeSelectionComponent)dlg).triggerSearch();
-                }
-
-                if (dlg.open() == Window.OK) {
-                    Object[] results = dlg.getResult();
-                    if (results.length == 1) {
-                        handleNewType((IType)results[0]);
-                    }
-                }
-            } catch (JavaModelException e1) {
-                AdtPlugin.log(e1, "UiClassAttributeNode HandleBrowser failed");
-            }
-        }
-    }
-
-    private void handleLabelClick() {
-        // get the current value
-        String className = getTextWidget().getText().trim();
-
-        // get the package name from the manifest.
-        String packageName = getManifestPackage();
-
-        if (className.length() == 0) {
-            createNewClass(packageName, null /* className */);
-        } else {
-            // build back the fully qualified class name.
-            String fullClassName = className;
-            if (className.startsWith(".")) { //$NON-NLS-1$
-                fullClassName = packageName + className;
-            } else {
-                String[] segments = className.split(AdtConstants.RE_DOT);
-                if (segments.length == 1) {
-                    fullClassName = packageName + "." + className; //$NON-NLS-1$
-                }
-            }
-
-            // in case the type is enclosed, we need to replace the $ with .
-            fullClassName = fullClassName.replaceAll("\\$", "\\."); //$NON-NLS-1$ //$NON-NLS2$
-
-            // now we try to find the file that contains this class and we open it in the editor.
-            IProject project = getProject();
-            IJavaProject javaProject = JavaCore.create(project);
-
-            try {
-                IType result = javaProject.findType(fullClassName);
-                if (result != null) {
-                    JavaUI.openInEditor(result);
-                } else {
-                    // split the last segment from the fullClassname
-                    int index = fullClassName.lastIndexOf('.');
-                    if (index != -1) {
-                        createNewClass(fullClassName.substring(0, index),
-                                fullClassName.substring(index+1));
-                    } else {
-                        createNewClass(packageName, className);
-                    }
-                }
-            } catch (JavaModelException e) {
-                AdtPlugin.log(e, "UiClassAttributeNode HandleLabel failed");
-            } catch (PartInitException e) {
-                AdtPlugin.log(e, "UiClassAttributeNode HandleLabel failed");
-            }
-        }
-    }
-
-    private IProject getProject() {
-        UiElementNode uiNode = getUiParent();
-        AndroidXmlEditor editor = uiNode.getEditor();
-        IEditorInput input = editor.getEditorInput();
-        if (input instanceof IFileEditorInput) {
-            // from the file editor we can get the IFile object, and from it, the IProject.
-            IFile file = ((IFileEditorInput)input).getFile();
-            return file.getProject();
-        }
-
-        return null;
-    }
-
-
-    /**
-     * Returns the current value of the /manifest/package attribute.
-     * @return the package or an empty string if not found
-     */
-    private String getManifestPackage() {
-        // get the root uiNode to get the 'package' attribute value.
-        UiElementNode rootNode = getUiParent().getUiRoot();
-
-        Element xmlElement = (Element) rootNode.getXmlNode();
-
-        if (xmlElement != null) {
-            return xmlElement.getAttribute(AndroidManifestDescriptors.PACKAGE_ATTR);
-        }
-        return ""; //$NON-NLS-1$
-    }
-
-
-    /**
-     * Computes and return the {@link IPackageFragmentRoot}s corresponding to the source folders of
-     * the specified project.
-     * @param project the project
-     * @param include_containers True to include containers
-     * @return an array of IPackageFragmentRoot.
-     */
-    private IPackageFragmentRoot[] getPackageFragmentRoots(IProject project,
-            boolean include_containers) {
-        ArrayList<IPackageFragmentRoot> result = new ArrayList<IPackageFragmentRoot>();
-        try {
-            IJavaProject javaProject = JavaCore.create(project);
-            IPackageFragmentRoot[] roots = javaProject.getPackageFragmentRoots();
-            for (int i = 0; i < roots.length; i++) {
-                IClasspathEntry entry = roots[i].getRawClasspathEntry();
-                if (entry.getEntryKind() == IClasspathEntry.CPE_SOURCE ||
-                        (include_containers &&
-                                entry.getEntryKind() == IClasspathEntry.CPE_CONTAINER)) {
-                    result.add(roots[i]);
-                }
-            }
-        } catch (JavaModelException e) {
-        }
-
-        return result.toArray(new IPackageFragmentRoot[result.size()]);
-    }
-
-    private void handleNewType(IType type) {
-        Text text = getTextWidget();
-
-        // get the fully qualified name with $ to properly detect the enclosing types.
-        String name = type.getFullyQualifiedName('$');
-
-        String packageValue = getManifestPackage();
-
-        // check if the class doesn't start with the package.
-        if (packageValue.length() > 0 && name.startsWith(packageValue)) {
-            // if it does, we remove the package and the first dot.
-            name = name.substring(packageValue.length() + 1);
-
-            // look for how many segments we have left.
-            // if one, just write it that way.
-            // if more than one, write it with a leading dot.
-            String[] packages = name.split(AdtConstants.RE_DOT);
-            if (packages.length == 1) {
-                text.setText(name);
-            } else {
-                text.setText("." + name); //$NON-NLS-1$
-            }
-        } else {
-            text.setText(name);
-        }
-    }
-
-    private void createNewClass(String packageName, String className) {
-        // create the wizard page for the class creation, and configure it
-        NewClassWizardPage page = new NewClassWizardPage();
-
-        // set the parent class
-        page.setSuperClass(mReferenceClass, true /* canBeModified */);
-
-        // get the source folders as java elements.
-        IPackageFragmentRoot[] roots = getPackageFragmentRoots(getProject(),
-                true /*include_containers*/);
-
-        IPackageFragmentRoot currentRoot = null;
-        IPackageFragment currentFragment = null;
-        int packageMatchCount = -1;
-
-        for (IPackageFragmentRoot root : roots) {
-            // Get the java element for the package.
-            // This method is said to always return a IPackageFragment even if the
-            // underlying folder doesn't exist...
-            IPackageFragment fragment = root.getPackageFragment(packageName);
-            if (fragment != null && fragment.exists()) {
-                // we have a perfect match! we use it.
-                currentRoot = root;
-                currentFragment = fragment;
-                packageMatchCount = -1;
-                break;
-            } else {
-                // we don't have a match. we look for the fragment with the best match
-                // (ie the closest parent package we can find)
-                try {
-                    IJavaElement[] children;
-                    children = root.getChildren();
-                    for (IJavaElement child : children) {
-                        if (child instanceof IPackageFragment) {
-                            fragment = (IPackageFragment)child;
-                            if (packageName.startsWith(fragment.getElementName())) {
-                                // its a match. get the number of segments
-                                String[] segments = fragment.getElementName().split("\\."); //$NON-NLS-1$
-                                if (segments.length > packageMatchCount) {
-                                    packageMatchCount = segments.length;
-                                    currentFragment = fragment;
-                                    currentRoot = root;
-                                }
-                            }
-                        }
-                    }
-                } catch (JavaModelException e) {
-                    // Couldn't get the children: we just ignore this package root.
-                }
-            }
-        }
-
-        ArrayList<IPackageFragment> createdFragments = null;
-
-        if (currentRoot != null) {
-            // if we have a perfect match, we set it and we're done.
-            if (packageMatchCount == -1) {
-                page.setPackageFragmentRoot(currentRoot, true /* canBeModified*/);
-                page.setPackageFragment(currentFragment, true /* canBeModified */);
-            } else {
-                // we have a partial match.
-                // create the package. We have to start with the first segment so that we
-                // know what to delete in case of a cancel.
-                try {
-                    createdFragments = new ArrayList<IPackageFragment>();
-
-                    int totalCount = packageName.split("\\.").length; //$NON-NLS-1$
-                    int count = 0;
-                    int index = -1;
-                    // skip the matching packages
-                    while (count < packageMatchCount) {
-                        index = packageName.indexOf('.', index+1);
-                        count++;
-                    }
-
-                    // create the rest of the segments, except for the last one as indexOf will
-                    // return -1;
-                    while (count < totalCount - 1) {
-                        index = packageName.indexOf('.', index+1);
-                        count++;
-                        createdFragments.add(currentRoot.createPackageFragment(
-                                packageName.substring(0, index),
-                                true /* force*/, new NullProgressMonitor()));
-                    }
-
-                    // create the last package
-                    createdFragments.add(currentRoot.createPackageFragment(
-                            packageName, true /* force*/, new NullProgressMonitor()));
-
-                    // set the root and fragment in the Wizard page
-                    page.setPackageFragmentRoot(currentRoot, true /* canBeModified*/);
-                    page.setPackageFragment(createdFragments.get(createdFragments.size()-1),
-                            true /* canBeModified */);
-                } catch (JavaModelException e) {
-                    // if we can't create the packages, there's a problem. we revert to the default
-                    // package
-                    for (IPackageFragmentRoot root : roots) {
-                        // Get the java element for the package.
-                        // This method is said to always return a IPackageFragment even if the
-                        // underlying folder doesn't exist...
-                        IPackageFragment fragment = root.getPackageFragment(packageName);
-                        if (fragment != null && fragment.exists()) {
-                            page.setPackageFragmentRoot(root, true /* canBeModified*/);
-                            page.setPackageFragment(fragment, true /* canBeModified */);
-                            break;
-                        }
-                    }
-                }
-            }
-        } else if (roots.length > 0) {
-            // if we haven't found a valid fragment, we set the root to the first source folder.
-            page.setPackageFragmentRoot(roots[0], true /* canBeModified*/);
-        }
-
-        // if we have a starting class name we use it
-        if (className != null) {
-            page.setTypeName(className, true /* canBeModified*/);
-        }
-
-        // create the action that will open it the wizard.
-        OpenNewClassWizardAction action = new OpenNewClassWizardAction();
-        action.setConfiguredWizardPage(page);
-        action.run();
-        IJavaElement element = action.getCreatedElement();
-
-        if (element != null) {
-            if (element.getElementType() == IJavaElement.TYPE) {
-
-                IType type = (IType)element;
-
-                if (mPostCreationAction != null) {
-                    mPostCreationAction.processNewType(type);
-                }
-
-                handleNewType(type);
-            }
-        } else {
-            // lets delete the packages we created just for this.
-            // we need to start with the leaf and go up
-            if (createdFragments != null) {
-                try {
-                    for (int i = createdFragments.size() - 1 ; i >= 0 ; i--) {
-                        createdFragments.get(i).delete(true /* force*/, new NullProgressMonitor());
-                    }
-                } catch (JavaModelException e) {
-                    e.printStackTrace();
-                }
-            }
-        }
-    }
-
-    /**
-     * Sets the error messages. If message is <code>null</code>, the message is removed.
-     * @param message the message to set, or <code>null</code> to remove the current message
-     * @param textWidget the {@link Text} widget associated to the message.
-     */
-    private final void setErrorMessage(String message, Text textWidget) {
-        if (message != null) {
-            setHasError(true);
-            getManagedForm().getMessageManager().addMessage(textWidget, message, null /* data */,
-                    IMessageProvider.ERROR, textWidget);
-        } else {
-            setHasError(false);
-            getManagedForm().getMessageManager().removeMessage(textWidget, textWidget);
-        }
-    }
-
-    @Override
-    public String[] getPossibleValues(String prefix) {
-        // Compute a list of existing classes for content assist completion
-        IProject project = getProject();
-        if (project == null || mReferenceClass == null) {
-            return null;
-        }
-
-        try {
-            IJavaProject javaProject = BaseProjectHelper.getJavaProject(project);
-            IType type = javaProject.findType(mReferenceClass);
-            // Use sets because query sometimes repeats the same class
-            Set<String> libraryTypes = new HashSet<String>(80);
-            Set<String> localTypes = new HashSet<String>(30);
-            if (type != null) {
-                ITypeHierarchy hierarchy = type.newTypeHierarchy(new NullProgressMonitor());
-                IType[] allSubtypes = hierarchy.getAllSubtypes(type);
-                for (IType subType : allSubtypes) {
-                    int flags = subType.getFlags();
-                    if (Flags.isPublic(flags) && !Flags.isAbstract(flags)) {
-                        String fqcn = subType.getFullyQualifiedName();
-                        if (subType.getResource() != null) {
-                            localTypes.add(fqcn);
-                        } else {
-                            libraryTypes.add(fqcn);
-                        }
-                    }
-                }
-            }
-
-            List<String> local = new ArrayList<String>(localTypes);
-            List<String> library = new ArrayList<String>(libraryTypes);
-            Collections.sort(local);
-            Collections.sort(library);
-            List<String> combined = new ArrayList<String>(local.size() + library.size());
-            combined.addAll(local);
-            combined.addAll(library);
-            return combined.toArray(new String[combined.size()]);
-        } catch (Exception e) {
-            AdtPlugin.log(e, null);
-        }
-
-        return null;
-    }
-}
-
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/manifest/model/UiManifestElementNode.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/manifest/model/UiManifestElementNode.java
deleted file mode 100644
index 0151d4d..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/manifest/model/UiManifestElementNode.java
+++ /dev/null
@@ -1,132 +0,0 @@
-/*
- * Copyright (C) 2007 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.editors.manifest.model;
-
-import com.android.SdkConstants;
-import com.android.ide.eclipse.adt.internal.editors.descriptors.ElementDescriptor;
-import com.android.ide.eclipse.adt.internal.editors.manifest.descriptors.AndroidManifestDescriptors;
-import com.android.ide.eclipse.adt.internal.editors.manifest.descriptors.ManifestElementDescriptor;
-import com.android.ide.eclipse.adt.internal.editors.uimodel.UiAttributeNode;
-import com.android.ide.eclipse.adt.internal.editors.uimodel.UiElementNode;
-import com.android.ide.eclipse.adt.internal.sdk.AndroidTargetData;
-
-import org.w3c.dom.Element;
-
-/**
- * Represents an XML node that can be modified by the user interface in the XML editor.
- * <p/>
- * Each tree viewer used in the application page's parts needs to keep a model representing
- * each underlying node in the tree. This interface represents the base type for such a node.
- * <p/>
- * Each node acts as an intermediary model between the actual XML model (the real data support)
- * and the tree viewers or the corresponding page parts.
- * <p/>
- * Element nodes don't contain data per se. Their data is contained in their attributes
- * as well as their children's attributes, see {@link UiAttributeNode}.
- * <p/>
- * The structure of a given {@link UiElementNode} is declared by a corresponding
- * {@link ElementDescriptor}.
- */
-public final class UiManifestElementNode extends UiElementNode {
-
-    /**
-     * Creates a new {@link UiElementNode} described by a given {@link ElementDescriptor}.
-     *
-     * @param elementDescriptor The {@link ElementDescriptor} for the XML node. Cannot be null.
-     */
-    public UiManifestElementNode(ManifestElementDescriptor elementDescriptor) {
-        super(elementDescriptor);
-    }
-
-    /**
-     * Computes a short string describing the UI node suitable for tree views.
-     * Uses the element's attribute "android:name" if present, or the "android:label" one
-     * followed by the element's name if not repeated.
-     *
-     * @return A short string describing the UI node suitable for tree views.
-     */
-    @Override
-    public String getShortDescription() {
-        AndroidTargetData target = getAndroidTarget();
-        AndroidManifestDescriptors manifestDescriptors = null;
-        if (target != null) {
-            manifestDescriptors = target.getManifestDescriptors();
-        }
-
-        String name = getDescriptor().getUiName();
-
-        if (manifestDescriptors != null &&
-                getXmlNode() != null &&
-                getXmlNode() instanceof Element &&
-                getXmlNode().hasAttributes()) {
-
-            // Application and Manifest nodes have a special treatment: they are unique nodes
-            // so we don't bother trying to differentiate their strings and we fall back to
-            // just using the UI name below.
-            ElementDescriptor desc = getDescriptor();
-            if (desc != manifestDescriptors.getManifestElement() &&
-                    desc != manifestDescriptors.getApplicationElement()) {
-                Element elem = (Element) getXmlNode();
-                String attr = _Element_getAttributeNS(elem,
-                                    SdkConstants.NS_RESOURCES,
-                                    AndroidManifestDescriptors.ANDROID_NAME_ATTR);
-                if (attr == null || attr.length() == 0) {
-                    attr = _Element_getAttributeNS(elem,
-                                    SdkConstants.NS_RESOURCES,
-                                    AndroidManifestDescriptors.ANDROID_LABEL_ATTR);
-                }
-                if (attr != null && attr.length() > 0) {
-                    // If the ui name is repeated in the attribute value, don't use it.
-                    // Typical case is to avoid ".pkg.MyActivity (Activity)".
-                    if (attr.contains(name)) {
-                        return attr;
-                    } else {
-                        return String.format("%1$s (%2$s)", attr, name);
-                    }
-                }
-            }
-        }
-
-        return String.format("%1$s", name);
-    }
-
-    /**
-     * Retrieves an attribute value by local name and namespace URI.
-     * <br>Per [<a href='http://www.w3.org/TR/1999/REC-xml-names-19990114/'>XML Namespaces</a>]
-     * , applications must use the value <code>null</code> as the
-     * <code>namespaceURI</code> parameter for methods if they wish to have
-     * no namespace.
-     * <p/>
-     * Note: This is a wrapper around {@link Element#getAttributeNS(String, String)}.
-     * In some versions of webtools, the getAttributeNS implementation crashes with an NPE.
-     * This wrapper will return null instead.
-     *
-     * @see Element#getAttributeNS(String, String)
-     * @see <a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=318108">https://bugs.eclipse.org/bugs/show_bug.cgi?id=318108</a>
-     * @return The result from {@link Element#getAttributeNS(String, String)} or or an empty string.
-     */
-    private String _Element_getAttributeNS(Element element,
-            String namespaceURI,
-            String localName) {
-        try {
-            return element.getAttributeNS(namespaceURI, localName);
-        } catch (Exception ignore) {
-            return "";
-        }
-    }
-}
-
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/manifest/model/UiManifestPkgAttrNode.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/manifest/model/UiManifestPkgAttrNode.java
deleted file mode 100755
index 60d9125..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/manifest/model/UiManifestPkgAttrNode.java
+++ /dev/null
@@ -1,331 +0,0 @@
-/*
- * Copyright (C) 2009 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.editors.manifest.model;
-
-import com.android.ide.common.xml.ManifestData;
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.ide.eclipse.adt.internal.editors.descriptors.AttributeDescriptor;
-import com.android.ide.eclipse.adt.internal.editors.descriptors.TextAttributeDescriptor;
-import com.android.ide.eclipse.adt.internal.editors.manifest.ManifestEditor;
-import com.android.ide.eclipse.adt.internal.editors.ui.SectionHelper;
-import com.android.ide.eclipse.adt.internal.editors.uimodel.UiElementNode;
-import com.android.ide.eclipse.adt.internal.editors.uimodel.UiTextAttributeNode;
-import com.android.ide.eclipse.adt.internal.project.AndroidManifestHelper;
-import com.android.ide.eclipse.adt.internal.project.BaseProjectHelper;
-import com.android.ide.eclipse.adt.internal.project.ProjectHelper;
-import com.android.ide.eclipse.adt.internal.wizards.actions.NewProjectAction;
-import com.android.ide.eclipse.adt.internal.wizards.newproject.NewProjectWizard;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.jface.dialogs.IMessageProvider;
-import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.jface.viewers.ILabelProviderListener;
-import org.eclipse.jface.window.Window;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.DisposeEvent;
-import org.eclipse.swt.events.DisposeListener;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.dialogs.ElementListSelectionDialog;
-import org.eclipse.ui.forms.IManagedForm;
-import org.eclipse.ui.forms.events.HyperlinkAdapter;
-import org.eclipse.ui.forms.events.HyperlinkEvent;
-import org.eclipse.ui.forms.widgets.FormText;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-import org.eclipse.ui.forms.widgets.TableWrapData;
-import org.eclipse.ui.part.FileEditorInput;
-
-import java.util.TreeSet;
-
-/**
- * Represents an XML attribute to select an existing manifest package, that can be modified using
- * a simple text field or a dialog to choose an existing package.
- * <p/>
- * See {@link UiTextAttributeNode} for more information.
- */
-public class UiManifestPkgAttrNode extends UiTextAttributeNode {
-
-    /**
-     * Creates a {@link UiManifestPkgAttrNode} object that will display ui to select or create
-     * a manifest package.
-     * @param attributeDescriptor the {@link AttributeDescriptor} object linked to the Ui Node.
-     */
-    public UiManifestPkgAttrNode(AttributeDescriptor attributeDescriptor, UiElementNode uiParent) {
-        super(attributeDescriptor, uiParent);
-    }
-
-    /* (non-java doc)
-     * Creates a label widget and an associated text field.
-     * <p/>
-     * As most other parts of the android manifest editor, this assumes the
-     * parent uses a table layout with 2 columns.
-     */
-    @Override
-    public void createUiControl(final Composite parent, final IManagedForm managedForm) {
-        setManagedForm(managedForm);
-        FormToolkit toolkit = managedForm.getToolkit();
-        TextAttributeDescriptor desc = (TextAttributeDescriptor) getDescriptor();
-
-        StringBuilder label = new StringBuilder();
-        label.append("<form><p><a href='unused'>");  //$NON-NLS-1$
-        label.append(desc.getUiName());
-        label.append("</a></p></form>");  //$NON-NLS-1$
-        FormText formText = SectionHelper.createFormText(parent, toolkit, true /* isHtml */,
-                label.toString(), true /* setupLayoutData */);
-        formText.addHyperlinkListener(new HyperlinkAdapter() {
-            @Override
-            public void linkActivated(HyperlinkEvent e) {
-                super.linkActivated(e);
-                doLabelClick();
-            }
-        });
-        formText.setLayoutData(new TableWrapData(TableWrapData.LEFT, TableWrapData.MIDDLE));
-        SectionHelper.addControlTooltip(formText, desc.getTooltip());
-
-        Composite composite = toolkit.createComposite(parent);
-        composite.setLayoutData(new TableWrapData(TableWrapData.FILL_GRAB, TableWrapData.MIDDLE));
-        GridLayout gl = new GridLayout(2, false);
-        gl.marginHeight = gl.marginWidth = 0;
-        composite.setLayout(gl);
-        // Fixes missing text borders under GTK... also requires adding a 1-pixel margin
-        // for the text field below
-        toolkit.paintBordersFor(composite);
-
-        final Text text = toolkit.createText(composite, getCurrentValue());
-        GridData gd = new GridData(GridData.FILL_HORIZONTAL);
-        gd.horizontalIndent = 1;  // Needed by the fixed composite borders under GTK
-        text.setLayoutData(gd);
-
-        setTextWidget(text);
-
-        Button browseButton = toolkit.createButton(composite, "Browse...", SWT.PUSH);
-
-        browseButton.addSelectionListener(new SelectionAdapter() {
-            @Override
-            public void widgetSelected(SelectionEvent e) {
-                super.widgetSelected(e);
-                doBrowseClick();
-            }
-        });
-
-    }
-
-    /* (non-java doc)
-     * Adds a validator to the text field that calls managedForm.getMessageManager().
-     */
-    @Override
-    protected void onAddValidators(final Text text) {
-        ModifyListener listener = new ModifyListener() {
-            @Override
-            public void modifyText(ModifyEvent e) {
-                String package_name = text.getText();
-                if (package_name.indexOf('.') < 1) {
-                    getManagedForm().getMessageManager().addMessage(text,
-                            "Package name should contain at least two identifiers.",
-                            null /* data */, IMessageProvider.ERROR, text);
-                } else {
-                    getManagedForm().getMessageManager().removeMessage(text, text);
-                }
-            }
-        };
-
-        text.addModifyListener(listener);
-
-        // Make sure the validator removes its message(s) when the widget is disposed
-        text.addDisposeListener(new DisposeListener() {
-            @Override
-            public void widgetDisposed(DisposeEvent e) {
-                getManagedForm().getMessageManager().removeMessage(text, text);
-            }
-        });
-
-        // Finally call the validator once to make sure the initial value is processed
-        listener.modifyText(null);
-    }
-
-    /**
-     * Handles response to the Browse button by creating a Package dialog.
-     * */
-    private void doBrowseClick() {
-
-        // Display the list of AndroidManifest packages in a selection dialog
-        ElementListSelectionDialog dialog = new ElementListSelectionDialog(
-                getTextWidget().getShell(),
-                new ILabelProvider() {
-                    @Override
-                    public Image getImage(Object element) {
-                        return null;
-                    }
-
-                    @Override
-                    public String getText(Object element) {
-                        return element.toString();
-                    }
-
-                    @Override
-                    public void addListener(ILabelProviderListener listener) {
-                    }
-
-                    @Override
-                    public void dispose() {
-                    }
-
-                    @Override
-                    public boolean isLabelProperty(Object element, String property) {
-                        return false;
-                    }
-
-                    @Override
-                    public void removeListener(ILabelProviderListener listener) {
-                    }
-                });
-
-        dialog.setTitle("Android Manifest Package Selection");
-        dialog.setMessage("Select the Android Manifest package to target.");
-
-        dialog.setElements(getPossibleValues(null));
-
-        // open the dialog and use the object selected if OK was clicked, or null otherwise
-        if (dialog.open() == Window.OK) {
-            String result = (String) dialog.getFirstResult();
-            if (result != null && result.length() > 0) {
-                getTextWidget().setText(result);
-            }
-        }
-    }
-
-    /**
-     * Handles response to the Label hyper link being activated.
-     */
-    private void doLabelClick() {
-        // get the current package name
-        String package_name = getTextWidget().getText().trim();
-
-        if (package_name.length() == 0) {
-            createNewProject();
-        } else {
-            displayExistingManifest(package_name);
-        }
-    }
-
-    /**
-     * When the label is clicked and there's already a package name, this method
-     * attempts to find the project matching the android package name and it attempts
-     * to open the manifest editor.
-     *
-     * @param package_name The android package name to find. Must not be null.
-     */
-    private void displayExistingManifest(String package_name) {
-
-        // Look for the first project that uses this package name
-        for (IJavaProject project : BaseProjectHelper.getAndroidProjects(null /*filter*/)) {
-            // check that there is indeed a manifest file.
-            IFile manifestFile = ProjectHelper.getManifest(project.getProject());
-            if (manifestFile == null) {
-                // no file? skip this project.
-                continue;
-            }
-
-            ManifestData manifestData = AndroidManifestHelper.parseForData(manifestFile);
-            if (manifestData == null) {
-                // skip this project.
-                continue;
-            }
-
-            if (package_name.equals(manifestData.getPackage())) {
-                // Found the project.
-
-                IWorkbenchWindow win = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
-                if (win != null) {
-                    IWorkbenchPage page = win.getActivePage();
-                    if (page != null) {
-                        try {
-                            page.openEditor(
-                                    new FileEditorInput(manifestFile),
-                                    ManifestEditor.ID,
-                                    true, /* activate */
-                                    IWorkbenchPage.MATCH_INPUT);
-                        } catch (PartInitException e) {
-                            AdtPlugin.log(e,
-                                    "Opening editor failed for %s",  //$NON-NLS-1$
-                                    manifestFile.getFullPath());
-                        }
-                    }
-                }
-
-                // We found the project; even if we failed there's no need to keep looking.
-                return;
-            }
-        }
-    }
-
-    /**
-     * Displays the New Project Wizard to create a new project.
-     * If one is successfully created, use the Android Package name.
-     */
-    private void createNewProject() {
-
-        NewProjectAction npwAction = new NewProjectAction();
-        npwAction.run(null /*action*/);
-        if (npwAction.getDialogResult() == Dialog.OK) {
-            NewProjectWizard npw = (NewProjectWizard) npwAction.getWizard();
-            String name = npw.getPackageName();
-            if (name != null && name.length() > 0) {
-                getTextWidget().setText(name);
-            }
-        }
-    }
-
-    /**
-     * Returns all the possible android package names that could be used.
-     * The prefix is not used.
-     *
-     * {@inheritDoc}
-     */
-    @Override
-    public String[] getPossibleValues(String prefix) {
-        TreeSet<String> packages = new TreeSet<String>();
-
-        for (IJavaProject project : BaseProjectHelper.getAndroidProjects(null /*filter*/)) {
-            // check that there is indeed a manifest file.
-            ManifestData manifestData = AndroidManifestHelper.parseForData(project.getProject());
-            if (manifestData == null) {
-                // skip this project.
-                continue;
-            }
-
-            packages.add(manifestData.getPackage());
-        }
-
-        return packages.toArray(new String[packages.size()]);
-    }
-}
-
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/manifest/model/UiPackageAttributeNode.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/manifest/model/UiPackageAttributeNode.java
deleted file mode 100644
index e6a2007..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/manifest/model/UiPackageAttributeNode.java
+++ /dev/null
@@ -1,321 +0,0 @@
-/*
- * Copyright (C) 2007 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.editors.manifest.model;
-
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.ide.eclipse.adt.internal.editors.AndroidXmlEditor;
-import com.android.ide.eclipse.adt.internal.editors.descriptors.AttributeDescriptor;
-import com.android.ide.eclipse.adt.internal.editors.descriptors.TextAttributeDescriptor;
-import com.android.ide.eclipse.adt.internal.editors.ui.SectionHelper;
-import com.android.ide.eclipse.adt.internal.editors.uimodel.UiElementNode;
-import com.android.ide.eclipse.adt.internal.editors.uimodel.UiTextAttributeNode;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.jdt.core.IClasspathEntry;
-import org.eclipse.jdt.core.IJavaElement;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.IPackageFragment;
-import org.eclipse.jdt.core.IPackageFragmentRoot;
-import org.eclipse.jdt.core.JavaCore;
-import org.eclipse.jdt.core.JavaModelException;
-import org.eclipse.jdt.ui.JavaUI;
-import org.eclipse.jdt.ui.actions.OpenNewPackageWizardAction;
-import org.eclipse.jdt.ui.actions.ShowInPackageViewAction;
-import org.eclipse.jface.dialogs.IMessageProvider;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.window.Window;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.DisposeEvent;
-import org.eclipse.swt.events.DisposeListener;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IFileEditorInput;
-import org.eclipse.ui.IWorkbenchPartSite;
-import org.eclipse.ui.dialogs.SelectionDialog;
-import org.eclipse.ui.forms.IManagedForm;
-import org.eclipse.ui.forms.events.HyperlinkAdapter;
-import org.eclipse.ui.forms.events.HyperlinkEvent;
-import org.eclipse.ui.forms.widgets.FormText;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-import org.eclipse.ui.forms.widgets.TableWrapData;
-
-import java.util.ArrayList;
-
-/**
- * Represents an XML attribute for a package, that can be modified using a simple text field or
- * a dialog to choose an existing package. Also, there's a link to create a new package.
- * <p/>
- * See {@link UiTextAttributeNode} for more information.
- */
-public class UiPackageAttributeNode extends UiTextAttributeNode {
-
-    /**
-     * Creates a {@link UiPackageAttributeNode} object that will display ui to select or create
-     * a package.
-     * @param attributeDescriptor the {@link AttributeDescriptor} object linked to the Ui Node.
-     */
-    public UiPackageAttributeNode(AttributeDescriptor attributeDescriptor, UiElementNode uiParent) {
-        super(attributeDescriptor, uiParent);
-    }
-
-    /* (non-java doc)
-     * Creates a label widget and an associated text field.
-     * <p/>
-     * As most other parts of the android manifest editor, this assumes the
-     * parent uses a table layout with 2 columns.
-     */
-    @Override
-    public void createUiControl(final Composite parent, final IManagedForm managedForm) {
-        setManagedForm(managedForm);
-        FormToolkit toolkit = managedForm.getToolkit();
-        TextAttributeDescriptor desc = (TextAttributeDescriptor) getDescriptor();
-
-        StringBuilder label = new StringBuilder();
-        label.append("<form><p><a href='unused'>");  //$NON-NLS-1$
-        label.append(desc.getUiName());
-        label.append("</a></p></form>");  //$NON-NLS-1$
-        FormText formText = SectionHelper.createFormText(parent, toolkit, true /* isHtml */,
-                label.toString(), true /* setupLayoutData */);
-        formText.addHyperlinkListener(new HyperlinkAdapter() {
-            @Override
-            public void linkActivated(HyperlinkEvent e) {
-                super.linkActivated(e);
-                doLabelClick();
-            }
-        });
-        formText.setLayoutData(new TableWrapData(TableWrapData.LEFT, TableWrapData.MIDDLE));
-        SectionHelper.addControlTooltip(formText, desc.getTooltip());
-
-        Composite composite = toolkit.createComposite(parent);
-        composite.setLayoutData(new TableWrapData(TableWrapData.FILL_GRAB, TableWrapData.MIDDLE));
-        GridLayout gl = new GridLayout(2, false);
-        gl.marginHeight = gl.marginWidth = 0;
-        composite.setLayout(gl);
-        // Fixes missing text borders under GTK... also requires adding a 1-pixel margin
-        // for the text field below
-        toolkit.paintBordersFor(composite);
-
-        final Text text = toolkit.createText(composite, getCurrentValue());
-        GridData gd = new GridData(GridData.FILL_HORIZONTAL);
-        gd.horizontalIndent = 1;  // Needed by the fixed composite borders under GTK
-        text.setLayoutData(gd);
-
-        setTextWidget(text);
-
-        Button browseButton = toolkit.createButton(composite, "Browse...", SWT.PUSH);
-
-        browseButton.addSelectionListener(new SelectionAdapter() {
-            @Override
-            public void widgetSelected(SelectionEvent e) {
-                super.widgetSelected(e);
-                doBrowseClick();
-            }
-        });
-
-    }
-
-    /* (non-java doc)
-     * Adds a validator to the text field that calls managedForm.getMessageManager().
-     */
-    @Override
-    protected void onAddValidators(final Text text) {
-        ModifyListener listener = new ModifyListener() {
-            @Override
-            public void modifyText(ModifyEvent e) {
-                String package_name = text.getText();
-                if (package_name.indexOf('.') < 1) {
-                    getManagedForm().getMessageManager().addMessage(text,
-                            "Package name should contain at least two identifiers.",
-                            null /* data */, IMessageProvider.ERROR, text);
-                } else {
-                    getManagedForm().getMessageManager().removeMessage(text, text);
-                }
-            }
-        };
-
-        text.addModifyListener(listener);
-
-        // Make sure the validator removes its message(s) when the widget is disposed
-        text.addDisposeListener(new DisposeListener() {
-            @Override
-            public void widgetDisposed(DisposeEvent e) {
-                getManagedForm().getMessageManager().removeMessage(text, text);
-            }
-        });
-
-        // Finally call the validator once to make sure the initial value is processed
-        listener.modifyText(null);
-    }
-
-    /**
-     * Handles response to the Browse button by creating a Package dialog.
-     * */
-    private void doBrowseClick() {
-        Text text = getTextWidget();
-
-        // we need to get the project of the manifest.
-        IProject project = getProject();
-        if (project != null) {
-
-            try {
-                SelectionDialog dlg = JavaUI.createPackageDialog(text.getShell(),
-                        JavaCore.create(project), 0);
-                dlg.setTitle("Select Android Package");
-                dlg.setMessage("Select the package for the Android project.");
-                SelectionDialog.setDefaultImage(AdtPlugin.getAndroidLogo());
-
-                if (dlg.open() == Window.OK) {
-                    Object[] results = dlg.getResult();
-                    if (results.length == 1) {
-                        setPackageTextField((IPackageFragment)results[0]);
-                    }
-                }
-            } catch (JavaModelException e1) {
-            }
-        }
-    }
-
-    /**
-     * Handles response to the Label hyper link being activated.
-     */
-    private void doLabelClick() {
-        // get the current package name
-        String package_name = getTextWidget().getText().trim();
-
-        if (package_name.length() == 0) {
-            createNewPackage();
-        } else {
-            // Try to select the package in the Package Explorer for the current
-            // project and the current editor's site.
-
-            IProject project = getProject();
-            if (project == null) {
-                AdtPlugin.log(IStatus.ERROR, "Failed to get project for UiPackageAttribute"); //$NON-NLS-1$
-                return;
-            }
-
-            IWorkbenchPartSite site = getUiParent().getEditor().getSite();
-            if (site == null) {
-                AdtPlugin.log(IStatus.ERROR, "Failed to get editor site for UiPackageAttribute"); //$NON-NLS-1$
-                return;
-            }
-
-            for (IPackageFragmentRoot root : getPackageFragmentRoots(project)) {
-                IPackageFragment fragment = root.getPackageFragment(package_name);
-                if (fragment != null && fragment.exists()) {
-                    ShowInPackageViewAction action = new ShowInPackageViewAction(site);
-                    action.run(fragment);
-                    // This action's run() doesn't provide the status (although internally it could)
-                    // so we just assume it worked.
-                    return;
-                }
-            }
-        }
-    }
-
-    /**
-     * Utility method that returns the project for the current file being edited.
-     *
-     * @return The IProject for the current file being edited or null.
-     */
-    private IProject getProject() {
-        UiElementNode uiNode = getUiParent();
-        AndroidXmlEditor editor = uiNode.getEditor();
-        IEditorInput input = editor.getEditorInput();
-        if (input instanceof IFileEditorInput) {
-            // from the file editor we can get the IFile object, and from it, the IProject.
-            IFile file = ((IFileEditorInput)input).getFile();
-            return file.getProject();
-        }
-
-        return null;
-    }
-
-    /**
-     * Utility method that computes and returns the list of {@link IPackageFragmentRoot}
-     * corresponding to the source folder of the specified project.
-     *
-     * @param project the project
-     * @return an array of IPackageFragmentRoot. Can be empty but not null.
-     */
-    private IPackageFragmentRoot[] getPackageFragmentRoots(IProject project) {
-        ArrayList<IPackageFragmentRoot> result = new ArrayList<IPackageFragmentRoot>();
-        try {
-            IJavaProject javaProject = JavaCore.create(project);
-            IPackageFragmentRoot[] roots = javaProject.getPackageFragmentRoots();
-            for (int i = 0; i < roots.length; i++) {
-                IClasspathEntry entry = roots[i].getRawClasspathEntry();
-                if (entry.getEntryKind() == IClasspathEntry.CPE_SOURCE) {
-                    result.add(roots[i]);
-                }
-            }
-        } catch (JavaModelException e) {
-        }
-
-        return result.toArray(new IPackageFragmentRoot[result.size()]);
-    }
-
-    /**
-     * Utility method that sets the package's text field to the package fragment's name.
-     * */
-    private void setPackageTextField(IPackageFragment type) {
-        Text text = getTextWidget();
-
-        String name = type.getElementName();
-
-        text.setText(name);
-    }
-
-
-    /**
-     * Displays and handles a "Create Package Wizard".
-     *
-     * This is invoked by doLabelClick() when clicking on the hyperlink label with an
-     * empty package text field.
-     */
-    private void createNewPackage() {
-        OpenNewPackageWizardAction action = new OpenNewPackageWizardAction();
-
-        IProject project = getProject();
-        action.setSelection(new StructuredSelection(project));
-        action.run();
-
-        IJavaElement element = action.getCreatedElement();
-        if (element != null &&
-                element.exists() &&
-                element.getElementType() == IJavaElement.PACKAGE_FRAGMENT) {
-            setPackageTextField((IPackageFragment) element);
-        }
-    }
-
-    @Override
-    public String[] getPossibleValues(String prefix) {
-        // TODO: compute a list of existing packages for content assist completion
-        return null;
-    }
-}
-
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/manifest/pages/ApplicationAttributesPart.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/manifest/pages/ApplicationAttributesPart.java
deleted file mode 100644
index 7d3f6a8..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/manifest/pages/ApplicationAttributesPart.java
+++ /dev/null
@@ -1,175 +0,0 @@
-/*
- * Copyright (C) 2007 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.editors.manifest.pages;
-
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.ide.eclipse.adt.internal.editors.descriptors.AttributeDescriptor;
-import com.android.ide.eclipse.adt.internal.editors.descriptors.XmlnsAttributeDescriptor;
-import com.android.ide.eclipse.adt.internal.editors.manifest.ManifestEditor;
-import com.android.ide.eclipse.adt.internal.editors.ui.UiElementPart;
-import com.android.ide.eclipse.adt.internal.editors.uimodel.IUiUpdateListener;
-import com.android.ide.eclipse.adt.internal.editors.uimodel.UiAttributeNode;
-import com.android.ide.eclipse.adt.internal.editors.uimodel.UiElementNode;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.ui.forms.IManagedForm;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-import org.eclipse.ui.forms.widgets.Section;
-
-/**
- * Application's attributes section part for Application page.
- * <p/>
- * This part is displayed at the top of the application page and displays all the possible
- * attributes of an application node in the AndroidManifest (icon, class name, label, etc.)
- */
-final class ApplicationAttributesPart extends UiElementPart {
-
-    /** Listen to changes to the UI node for <application> and updates the UI */
-    private AppNodeUpdateListener mAppNodeUpdateListener;
-    /** ManagedForm needed to create the UI controls */
-    private IManagedForm mManagedForm;
-
-    public ApplicationAttributesPart(Composite body, FormToolkit toolkit, ManifestEditor editor,
-            UiElementNode applicationUiNode) {
-        super(body, toolkit, editor, applicationUiNode,
-                "Application Attributes", // section title
-                "Defines the attributes specific to the application.", // section description
-                Section.TWISTIE | Section.EXPANDED);
-    }
-
-    /**
-     * Changes and refreshes the Application UI node handle by the this part.
-     */
-    @Override
-    public void setUiElementNode(UiElementNode uiElementNode) {
-        super.setUiElementNode(uiElementNode);
-
-        createUiAttributes(mManagedForm);
-    }
-
-    /* (non-java doc)
-     * Create the controls to edit the attributes for the given ElementDescriptor.
-     * <p/>
-     * This MUST not be called by the constructor. Instead it must be called from
-     * <code>initialize</code> (i.e. right after the form part is added to the managed form.)
-     * <p/>
-     * Derived classes can override this if necessary.
-     *
-     * @param managedForm The owner managed form
-     */
-    @Override
-    protected void createFormControls(final IManagedForm managedForm) {
-        mManagedForm = managedForm;
-        setTable(createTableLayout(managedForm.getToolkit(), 4 /* numColumns */));
-
-        mAppNodeUpdateListener = new AppNodeUpdateListener();
-        getUiElementNode().addUpdateListener(mAppNodeUpdateListener);
-
-        createUiAttributes(mManagedForm);
-    }
-
-    @Override
-    public void dispose() {
-        super.dispose();
-        if (getUiElementNode() != null && mAppNodeUpdateListener != null) {
-            getUiElementNode().removeUpdateListener(mAppNodeUpdateListener);
-            mAppNodeUpdateListener = null;
-        }
-    }
-
-    @Override
-    protected void createUiAttributes(IManagedForm managedForm) {
-        Composite table = getTable();
-        if (table == null || managedForm == null) {
-            return;
-        }
-
-        // Remove any old UI controls
-        for (Control c : table.getChildren()) {
-            c.dispose();
-        }
-
-        UiElementNode uiElementNode = getUiElementNode();
-        AttributeDescriptor[] attr_desc_list = uiElementNode.getAttributeDescriptors();
-
-        // Display the attributes in 2 columns:
-        // attr 0 | attr 4
-        // attr 1 | attr 5
-        // attr 2 | attr 6
-        // attr 3 | attr 7
-        // that is we have to fill the grid in order 0, 4, 1, 5, 2, 6, 3, 7
-        // thus index = i/2 + (i is odd * n/2)
-        int n = attr_desc_list.length;
-        int n2 = (int) Math.ceil(n / 2.0);
-        for (int i = 0; i < n; i++) {
-            AttributeDescriptor attr_desc = attr_desc_list[i / 2 + (i & 1) * n2];
-            if (attr_desc instanceof XmlnsAttributeDescriptor) {
-                // Do not show hidden attributes
-                continue;
-            }
-
-            UiAttributeNode ui_attr = uiElementNode.findUiAttribute(attr_desc);
-            if (ui_attr != null) {
-                ui_attr.createUiControl(table, managedForm);
-            } else {
-                // The XML has an extra attribute which wasn't declared in
-                // AndroidManifestDescriptors. This is not a problem, we just ignore it.
-                AdtPlugin.log(IStatus.WARNING,
-                        "Attribute %1$s not declared in node %2$s, ignored.", //$NON-NLS-1$
-                        attr_desc.getXmlLocalName(),
-                        uiElementNode.getDescriptor().getXmlName());
-            }
-        }
-
-        if (n == 0) {
-            createLabel(table, managedForm.getToolkit(),
-                    "No attributes to display, waiting for SDK to finish loading...",
-                    null /* tooltip */ );
-        }
-
-        // Initialize the enabled/disabled state
-        if (mAppNodeUpdateListener != null) {
-            mAppNodeUpdateListener.uiElementNodeUpdated(uiElementNode, null /* state, not used */);
-        }
-
-        // Tell the section that the layout has changed.
-        layoutChanged();
-    }
-
-    /**
-     * This listener synchronizes the UI with the actual presence of the application XML node.
-     */
-    private class AppNodeUpdateListener implements IUiUpdateListener {
-        @Override
-        public void uiElementNodeUpdated(UiElementNode ui_node, UiUpdateState state) {
-            // The UiElementNode for the application XML node always exists, even
-            // if there is no corresponding XML node in the XML file.
-            //
-            // We enable the UI here if the XML node is not null.
-            Composite table = getTable();
-            boolean exists = (ui_node.getXmlNode() != null);
-            if (table != null && table.getEnabled() != exists) {
-                table.setEnabled(exists);
-                for (Control c : table.getChildren()) {
-                    c.setEnabled(exists);
-                }
-            }
-        }
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/manifest/pages/ApplicationPage.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/manifest/pages/ApplicationPage.java
deleted file mode 100644
index 06a3d3f..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/manifest/pages/ApplicationPage.java
+++ /dev/null
@@ -1,136 +0,0 @@
-/*
- * Copyright (C) 2007 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.editors.manifest.pages;
-
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.ide.eclipse.adt.internal.editors.IPageImageProvider;
-import com.android.ide.eclipse.adt.internal.editors.IconFactory;
-import com.android.ide.eclipse.adt.internal.editors.descriptors.ElementDescriptor;
-import com.android.ide.eclipse.adt.internal.editors.manifest.ManifestEditor;
-import com.android.ide.eclipse.adt.internal.editors.manifest.descriptors.AndroidManifestDescriptors;
-import com.android.ide.eclipse.adt.internal.editors.ui.tree.UiTreeBlock;
-import com.android.ide.eclipse.adt.internal.editors.uimodel.UiElementNode;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.forms.IManagedForm;
-import org.eclipse.ui.forms.editor.FormPage;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-import org.eclipse.ui.forms.widgets.ScrolledForm;
-
-
-/**
- * Page for "Application" settings, part of the AndroidManifest form editor.
- * <p/>
- * Useful reference:
- * <a href="http://www.eclipse.org/articles/Article-Forms/article.html">
- *   http://www.eclipse.org/articles/Article-Forms/article.html</a>
- */
-public final class ApplicationPage extends FormPage implements IPageImageProvider {
-    /** Page id used for switching tabs programmatically */
-    public final static String PAGE_ID = "application_page"; //$NON-NLS-1$
-
-    /** Container editor */
-    ManifestEditor mEditor;
-    /** The Application Toogle part */
-    private ApplicationToggle mTooglePart;
-    /** The Application Attributes part */
-    private ApplicationAttributesPart mAttrPart;
-    /** The tree view block */
-    private UiTreeBlock mTreeBlock;
-
-    public ApplicationPage(ManifestEditor editor) {
-        super(editor, PAGE_ID, "Application"); // tab's label, keep it short
-        mEditor = editor;
-    }
-
-    @Override
-    public Image getPageImage() {
-        return IconFactory.getInstance().getIcon(getTitle(),
-                                                 IconFactory.COLOR_BLUE,
-                                                 IconFactory.SHAPE_RECT);
-    }
-
-    /**
-     * Creates the content in the form hosted in this page.
-     *
-     * @param managedForm the form hosted in this page.
-     */
-    @Override
-    protected void createFormContent(IManagedForm managedForm) {
-        super.createFormContent(managedForm);
-        ScrolledForm form = managedForm.getForm();
-        form.setText("Android Manifest Application");
-        form.setImage(AdtPlugin.getAndroidLogo());
-
-        UiElementNode appUiNode = getUiApplicationNode();
-
-        Composite body = form.getBody();
-        FormToolkit toolkit = managedForm.getToolkit();
-
-        // We usually prefer to have a ColumnLayout here. However
-        // MasterDetailsBlock.createContent() below will reset the body's layout to a grid layout.
-        mTooglePart = new ApplicationToggle(body, toolkit, mEditor, appUiNode);
-        mTooglePart.getSection().setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false));
-        managedForm.addPart(mTooglePart);
-        mAttrPart = new ApplicationAttributesPart(body, toolkit, mEditor, appUiNode);
-        mAttrPart.getSection().setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false));
-        managedForm.addPart(mAttrPart);
-
-        mTreeBlock = new UiTreeBlock(mEditor, appUiNode,
-                false /* autoCreateRoot */,
-                null /* element filters */,
-                "Application Nodes",
-                "List of all elements in the application");
-        mTreeBlock.createContent(managedForm);
-    }
-
-    /**
-     * Retrieves the application UI node. Since this is a mandatory node, it *always*
-     * exists, even if there is no matching XML node.
-     */
-    private UiElementNode getUiApplicationNode() {
-        AndroidManifestDescriptors manifestDescriptor = mEditor.getManifestDescriptors();
-        if (manifestDescriptor != null) {
-            ElementDescriptor desc = manifestDescriptor.getApplicationElement();
-            return mEditor.getUiRootNode().findUiChildNode(desc.getXmlName());
-        } else {
-            // return the ui root node, as a dummy application root node.
-            return mEditor.getUiRootNode();
-        }
-    }
-
-    /**
-     * Changes and refreshes the Application UI node handled by the sub parts.
-     */
-    public void refreshUiApplicationNode() {
-        UiElementNode appUiNode = getUiApplicationNode();
-        if (mTooglePart != null) {
-            mTooglePart.setUiElementNode(appUiNode);
-        }
-        if (mAttrPart != null) {
-            mAttrPart.setUiElementNode(appUiNode);
-        }
-        if (mTreeBlock != null) {
-            mTreeBlock.changeRootAndDescriptors(appUiNode,
-                    null /* element filters */,
-                    true /* refresh */);
-        }
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/manifest/pages/ApplicationToggle.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/manifest/pages/ApplicationToggle.java
deleted file mode 100644
index 159f089..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/manifest/pages/ApplicationToggle.java
+++ /dev/null
@@ -1,312 +0,0 @@
-/*
- * Copyright (C) 2007 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.editors.manifest.pages;
-
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.ide.eclipse.adt.internal.editors.descriptors.DescriptorsUtils;
-import com.android.ide.eclipse.adt.internal.editors.manifest.ManifestEditor;
-import com.android.ide.eclipse.adt.internal.editors.ui.UiElementPart;
-import com.android.ide.eclipse.adt.internal.editors.uimodel.IUiUpdateListener;
-import com.android.ide.eclipse.adt.internal.editors.uimodel.IUiUpdateListener.UiUpdateState;
-import com.android.ide.eclipse.adt.internal.editors.uimodel.UiElementNode;
-import com.android.ide.eclipse.adt.internal.sdk.Sdk;
-import com.android.utils.SdkUtils;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.forms.IManagedForm;
-import org.eclipse.ui.forms.widgets.FormText;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-import org.eclipse.ui.forms.widgets.Section;
-import org.eclipse.ui.forms.widgets.TableWrapData;
-import org.w3c.dom.Document;
-import org.w3c.dom.Node;
-import org.w3c.dom.Text;
-
-/**
- * Appllication Toogle section part for application page.
- */
-final class ApplicationToggle extends UiElementPart {
-
-    /** Checkbox indicating whether an application node is present */
-    private Button mCheckbox;
-    /** Listen to changes to the UI node for <application> and updates the checkbox */
-    private AppNodeUpdateListener mAppNodeUpdateListener;
-    /** Internal flag to know where we're programmatically modifying the checkbox and we want to
-     *  avoid triggering the checkbox's callback. */
-    public boolean mInternalModification;
-    private FormText mTooltipFormText;
-
-    public ApplicationToggle(Composite body, FormToolkit toolkit, ManifestEditor editor,
-            UiElementNode applicationUiNode) {
-        super(body, toolkit, editor, applicationUiNode,
-                "Application Toggle",
-                null, /* description */
-                Section.TWISTIE | Section.EXPANDED);
-    }
-
-    @Override
-    public void dispose() {
-        super.dispose();
-        if (getUiElementNode() != null && mAppNodeUpdateListener != null) {
-            getUiElementNode().removeUpdateListener(mAppNodeUpdateListener);
-            mAppNodeUpdateListener = null;
-        }
-    }
-
-    /**
-     * Changes and refreshes the Application UI node handle by the this part.
-     */
-    @Override
-    public void setUiElementNode(UiElementNode uiElementNode) {
-        super.setUiElementNode(uiElementNode);
-
-        updateTooltip();
-
-        // Set the state of the checkbox
-        mAppNodeUpdateListener.uiElementNodeUpdated(getUiElementNode(),
-                UiUpdateState.CHILDREN_CHANGED);
-    }
-
-    /**
-     * Create the controls to edit the attributes for the given ElementDescriptor.
-     * <p/>
-     * This MUST not be called by the constructor. Instead it must be called from
-     * <code>initialize</code> (i.e. right after the form part is added to the managed form.)
-     *
-     * @param managedForm The owner managed form
-     */
-    @Override
-    protected void createFormControls(IManagedForm managedForm) {
-        FormToolkit toolkit = managedForm.getToolkit();
-        Composite table = createTableLayout(toolkit, 1 /* numColumns */);
-
-        mTooltipFormText = createFormText(table, toolkit, true, "<form></form>",
-                false /* setupLayoutData */);
-        updateTooltip();
-
-        mCheckbox = toolkit.createButton(table,
-                "Define an <application> tag in the AndroidManifest.xml",
-                SWT.CHECK);
-        mCheckbox.setLayoutData(new TableWrapData(TableWrapData.FILL_GRAB, TableWrapData.TOP));
-        mCheckbox.setSelection(false);
-        mCheckbox.addSelectionListener(new CheckboxSelectionListener());
-
-        mAppNodeUpdateListener = new AppNodeUpdateListener();
-        getUiElementNode().addUpdateListener(mAppNodeUpdateListener);
-
-        // Initialize the state of the checkbox
-        mAppNodeUpdateListener.uiElementNodeUpdated(getUiElementNode(),
-                UiUpdateState.CHILDREN_CHANGED);
-
-        // Tell the section that the layout has changed.
-        layoutChanged();
-    }
-
-    /**
-     * Updates the application tooltip in the form text.
-     * If there is no tooltip, the form text is hidden.
-     */
-    private void updateTooltip() {
-        boolean isVisible = false;
-
-        String tooltip = getUiElementNode().getDescriptor().getTooltip();
-        if (tooltip != null) {
-            tooltip = DescriptorsUtils.formatFormText(tooltip,
-                    getUiElementNode().getDescriptor(),
-                    Sdk.getCurrent().getDocumentationBaseUrl());
-
-            mTooltipFormText.setText(tooltip, true /* parseTags */, true /* expandURLs */);
-            mTooltipFormText.setImage(DescriptorsUtils.IMAGE_KEY, AdtPlugin.getAndroidLogo());
-            mTooltipFormText.addHyperlinkListener(getEditor().createHyperlinkListener());
-            isVisible = true;
-        }
-
-        mTooltipFormText.setVisible(isVisible);
-    }
-
-    /**
-     * This listener synchronizes the XML application node when the checkbox
-     * is changed by the user.
-     */
-    private class CheckboxSelectionListener extends SelectionAdapter {
-        private Node mUndoXmlNode;
-        private Node mUndoXmlParent;
-        private Node mUndoXmlNextNode;
-        private Node mUndoXmlNextElement;
-        private Document mUndoXmlDocument;
-
-        @Override
-        public void widgetSelected(SelectionEvent e) {
-            super.widgetSelected(e);
-            if (!mInternalModification && getUiElementNode() != null) {
-                getUiElementNode().getEditor().wrapUndoEditXmlModel(
-                        mCheckbox.getSelection()
-                            ? "Create or restore Application node"
-                            : "Remove Application node",
-                        new Runnable() {
-                            @Override
-                            public void run() {
-                                if (mCheckbox.getSelection()) {
-                                    // The user wants an <application> node.
-                                    // Either restore a previous one
-                                    // or create a full new one.
-                                    boolean create = true;
-                                    if (mUndoXmlNode != null) {
-                                        create = !restoreApplicationNode();
-                                    }
-                                    if (create) {
-                                        getUiElementNode().createXmlNode();
-                                    }
-                                } else {
-                                    // Users no longer wants the <application> node.
-                                    removeApplicationNode();
-                                }
-                            }
-                });
-            }
-        }
-
-        /**
-         * Restore a previously "saved" application node.
-         *
-         * @return True if the node could be restored, false otherwise.
-         */
-        private boolean restoreApplicationNode() {
-            if (mUndoXmlDocument == null || mUndoXmlNode == null) {
-                return false;
-            }
-
-            // Validate node references...
-            mUndoXmlParent = validateNode(mUndoXmlDocument, mUndoXmlParent);
-            mUndoXmlNextNode = validateNode(mUndoXmlDocument, mUndoXmlNextNode);
-            mUndoXmlNextElement = validateNode(mUndoXmlDocument, mUndoXmlNextElement);
-
-            if (mUndoXmlParent == null){
-                // If the parent node doesn't exist, try to find a new manifest node.
-                // If it doesn't exist, create it.
-                mUndoXmlParent = getUiElementNode().getUiParent().prepareCommit();
-                mUndoXmlNextNode = null;
-                mUndoXmlNextElement = null;
-            }
-
-            boolean success = false;
-            if (mUndoXmlParent != null) {
-                // If the parent is still around, reuse the same node.
-
-                // Ideally we want to insert the node before what used to be its next sibling.
-                // If that's not possible, we try to insert it before its next sibling element.
-                // If that's not possible either, it will be inserted at the end of the parent's.
-                Node next = mUndoXmlNextNode;
-                if (next == null) {
-                    next = mUndoXmlNextElement;
-                }
-                mUndoXmlParent.insertBefore(mUndoXmlNode, next);
-                if (next == null) {
-                    Text sep = mUndoXmlDocument.createTextNode(SdkUtils.getLineSeparator());
-                    mUndoXmlParent.insertBefore(sep, null);  // insert separator before end tag
-                }
-                success = true;
-            }
-
-            // Remove internal references to avoid using them twice
-            mUndoXmlParent = null;
-            mUndoXmlNextNode = null;
-            mUndoXmlNextElement = null;
-            mUndoXmlNode = null;
-            mUndoXmlDocument = null;
-            return success;
-        }
-
-        /**
-         * Validates that the given xml_node is still either the root node or one of its
-         * direct descendants.
-         *
-         * @param root_node The root of the node hierarchy to examine.
-         * @param xml_node The XML node to find.
-         * @return Returns xml_node if it is, otherwise returns null.
-         */
-        private Node validateNode(Node root_node, Node xml_node) {
-            if (root_node == xml_node) {
-                return xml_node;
-            } else {
-                for (Node node = root_node.getFirstChild(); node != null;
-                        node = node.getNextSibling()) {
-                    if (root_node == xml_node || validateNode(node, xml_node) != null) {
-                        return xml_node;
-                    }
-                }
-            }
-            return null;
-        }
-
-        /**
-         * Removes the <application> node from the hierarchy.
-         * Before doing that, we try to remember where it was so that we can put it back
-         * in the same place.
-         */
-        private void removeApplicationNode() {
-            // Make sure the node actually exists...
-            Node xml_node = getUiElementNode().getXmlNode();
-            if (xml_node == null) {
-                return;
-            }
-
-            // Save its parent, next sibling and next element
-            mUndoXmlDocument = xml_node.getOwnerDocument();
-            mUndoXmlParent = xml_node.getParentNode();
-            mUndoXmlNextNode = xml_node.getNextSibling();
-            mUndoXmlNextElement = mUndoXmlNextNode;
-            while (mUndoXmlNextElement != null &&
-                    mUndoXmlNextElement.getNodeType() != Node.ELEMENT_NODE) {
-                mUndoXmlNextElement = mUndoXmlNextElement.getNextSibling();
-            }
-
-            // Actually remove the node from the hierarchy and keep it here.
-            // The returned node looses its parents/siblings pointers.
-            mUndoXmlNode = getUiElementNode().deleteXmlNode();
-        }
-    }
-
-    /**
-     * This listener synchronizes the UI (i.e. the checkbox) with the
-     * actual presence of the application XML node.
-     */
-    private class AppNodeUpdateListener implements IUiUpdateListener {
-        @Override
-        public void uiElementNodeUpdated(UiElementNode ui_node, UiUpdateState state) {
-            // The UiElementNode for the application XML node always exists, even
-            // if there is no corresponding XML node in the XML file.
-            //
-            // To update the checkbox to reflect the actual state, we just need
-            // to check if the XML node is null.
-            try {
-                mInternalModification = true;
-                boolean exists = ui_node.getXmlNode() != null;
-                if (mCheckbox.getSelection() != exists) {
-                    mCheckbox.setSelection(exists);
-                }
-            } finally {
-                mInternalModification = false;
-            }
-
-        }
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/manifest/pages/InstrumentationPage.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/manifest/pages/InstrumentationPage.java
deleted file mode 100644
index a8bb346..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/manifest/pages/InstrumentationPage.java
+++ /dev/null
@@ -1,102 +0,0 @@
-/*
- * Copyright (C) 2007 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.editors.manifest.pages;
-
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.ide.eclipse.adt.internal.editors.IPageImageProvider;
-import com.android.ide.eclipse.adt.internal.editors.IconFactory;
-import com.android.ide.eclipse.adt.internal.editors.descriptors.ElementDescriptor;
-import com.android.ide.eclipse.adt.internal.editors.manifest.ManifestEditor;
-import com.android.ide.eclipse.adt.internal.editors.manifest.descriptors.AndroidManifestDescriptors;
-import com.android.ide.eclipse.adt.internal.editors.ui.tree.UiTreeBlock;
-import com.android.ide.eclipse.adt.internal.editors.uimodel.UiElementNode;
-
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.ui.forms.IManagedForm;
-import org.eclipse.ui.forms.editor.FormPage;
-import org.eclipse.ui.forms.widgets.ScrolledForm;
-
-/**
- * Page for instrumentation settings, part of the AndroidManifest form editor.
- */
-public final class InstrumentationPage extends FormPage implements IPageImageProvider {
-    /** Page id used for switching tabs programmatically */
-    public final static String PAGE_ID = "instrumentation_page"; //$NON-NLS-1$
-
-    /** Container editor */
-    ManifestEditor mEditor;
-
-    private UiTreeBlock mTreeBlock;
-
-    public InstrumentationPage(ManifestEditor editor) {
-        super(editor, PAGE_ID, "Instrumentation");  // tab's label, keep it short
-        mEditor = editor;
-    }
-
-    @Override
-    public Image getPageImage() {
-        return IconFactory.getInstance().getIcon(getTitle(),
-                                                 IconFactory.COLOR_GREEN,
-                                                 IconFactory.SHAPE_RECT);
-    }
-
-    /**
-     * Creates the content in the form hosted in this page.
-     *
-     * @param managedForm the form hosted in this page.
-     */
-    @Override
-    protected void createFormContent(IManagedForm managedForm) {
-        super.createFormContent(managedForm);
-        ScrolledForm form = managedForm.getForm();
-        form.setText("Android Manifest Instrumentation");
-        form.setImage(AdtPlugin.getAndroidLogo());
-
-        UiElementNode manifest = mEditor.getUiRootNode();
-        AndroidManifestDescriptors manifestDescriptor = mEditor.getManifestDescriptors();
-
-        ElementDescriptor[] descriptorFilters = null;
-        if (manifestDescriptor != null) {
-            descriptorFilters = new ElementDescriptor[] {
-                    manifestDescriptor.getInstrumentationElement(),
-            };
-        }
-
-        mTreeBlock = new UiTreeBlock(mEditor, manifest,
-                true /* autoCreateRoot */,
-                descriptorFilters,
-                "Instrumentation",
-                "List of instrumentations defined in the manifest");
-        mTreeBlock.createContent(managedForm);
-    }
-
-    /**
-     * Changes and refreshes the Application UI node handled by the sub parts.
-     */
-    public void refreshUiNode() {
-        if (mTreeBlock != null) {
-            UiElementNode manifest = mEditor.getUiRootNode();
-            AndroidManifestDescriptors manifestDescriptor = mEditor.getManifestDescriptors();
-
-            mTreeBlock.changeRootAndDescriptors(manifest,
-                    new ElementDescriptor[] {
-                        manifestDescriptor.getInstrumentationElement()
-                    },
-                    true /* refresh */);
-        }
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/manifest/pages/OverviewExportPart.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/manifest/pages/OverviewExportPart.java
deleted file mode 100644
index b0eb75a..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/manifest/pages/OverviewExportPart.java
+++ /dev/null
@@ -1,123 +0,0 @@
-/*
- * Copyright (C) 2007 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.editors.manifest.pages;
-
-import com.android.ide.eclipse.adt.internal.editors.manifest.ManifestEditor;
-import com.android.ide.eclipse.adt.internal.editors.ui.SectionHelper.ManifestSectionPart;
-import com.android.ide.eclipse.adt.internal.project.ExportHelper;
-import com.android.ide.eclipse.adt.internal.sdk.ProjectState;
-import com.android.ide.eclipse.adt.internal.sdk.Sdk;
-import com.android.ide.eclipse.adt.internal.wizards.export.ExportWizard;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.wizard.WizardDialog;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.forms.events.HyperlinkAdapter;
-import org.eclipse.ui.forms.events.HyperlinkEvent;
-import org.eclipse.ui.forms.widgets.FormText;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-import org.eclipse.ui.forms.widgets.Section;
-import org.eclipse.ui.part.FileEditorInput;
-
-/**
- * Export section part for overview page.
- */
-final class OverviewExportPart extends ManifestSectionPart {
-
-    private final OverviewPage mOverviewPage;
-
-    public OverviewExportPart(OverviewPage overviewPage, final Composite body, FormToolkit toolkit,
-            ManifestEditor editor) {
-        super(body, toolkit, Section.TWISTIE | Section.EXPANDED, true /* description */);
-        mOverviewPage = overviewPage;
-        Section section = getSection();
-        section.setText("Exporting");
-
-        final IProject project = getProject();
-        boolean isLibrary = false;
-        if (project != null) {
-            ProjectState state = Sdk.getProjectState(project);
-            if (state != null) {
-                isLibrary = state.isLibrary();
-            }
-        }
-
-        if (isLibrary) {
-            section.setDescription("Library project cannot be exported.");
-            Composite table = createTableLayout(toolkit, 2 /* numColumns */);
-            createFormText(table, toolkit, true, "<form></form>", false /* setupLayoutData */);
-        } else {
-            section.setDescription("To export the application for distribution, you have the following options:");
-
-            Composite table = createTableLayout(toolkit, 2 /* numColumns */);
-
-            StringBuffer buf = new StringBuffer();
-            buf.append("<form><li><a href=\"wizard\">"); //$NON-NLS-1$
-            buf.append("Use the Export Wizard");
-            buf.append("</a>"); //$NON-NLS-1$
-            buf.append(" to export and sign an APK");
-            buf.append("</li>"); //$NON-NLS-1$
-            buf.append("<li><a href=\"manual\">"); //$NON-NLS-1$
-            buf.append("Export an unsigned APK");
-            buf.append("</a>"); //$NON-NLS-1$
-            buf.append(" and sign it manually");
-            buf.append("</li></form>"); //$NON-NLS-1$
-
-            FormText text = createFormText(table, toolkit, true, buf.toString(),
-                    false /* setupLayoutData */);
-            text.addHyperlinkListener(new HyperlinkAdapter() {
-                @Override
-                public void linkActivated(HyperlinkEvent e) {
-                    if (project != null) {
-                        if ("manual".equals(e.data)) { //$NON-NLS-1$
-                            // now we can export an unsigned apk for the project.
-                            ExportHelper.exportUnsignedReleaseApk(project);
-                        } else {
-                            // call the export wizard
-                            StructuredSelection selection = new StructuredSelection(project);
-
-                            ExportWizard wizard = new ExportWizard();
-                            wizard.init(PlatformUI.getWorkbench(), selection);
-                            WizardDialog dialog = new WizardDialog(body.getShell(), wizard);
-                            dialog.open();
-                        }
-                    }
-                }
-            });
-        }
-
-        layoutChanged();
-    }
-
-    /**
-     * Returns the project of the edited file.
-     */
-    private IProject getProject() {
-        IEditorInput input = mOverviewPage.mEditor.getEditorInput();
-        if (input instanceof FileEditorInput) {
-            FileEditorInput fileInput = (FileEditorInput)input;
-            IFile file = fileInput.getFile();
-            return file.getProject();
-        }
-
-        return null;
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/manifest/pages/OverviewInfoPart.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/manifest/pages/OverviewInfoPart.java
deleted file mode 100644
index 98f2f9c..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/manifest/pages/OverviewInfoPart.java
+++ /dev/null
@@ -1,87 +0,0 @@
-/*
- * Copyright (C) 2007 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.editors.manifest.pages;
-
-import com.android.ide.eclipse.adt.internal.editors.descriptors.ElementDescriptor;
-import com.android.ide.eclipse.adt.internal.editors.manifest.ManifestEditor;
-import com.android.ide.eclipse.adt.internal.editors.manifest.descriptors.AndroidManifestDescriptors;
-import com.android.ide.eclipse.adt.internal.editors.ui.UiElementPart;
-import com.android.ide.eclipse.adt.internal.editors.uimodel.UiElementNode;
-
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.forms.IManagedForm;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-import org.eclipse.ui.forms.widgets.Section;
-
-/**
- * Generic info section part for overview page: it displays all the attributes from
- * the manifest element.
- */
-final class OverviewInfoPart extends UiElementPart {
-
-    private IManagedForm mManagedForm;
-
-    public OverviewInfoPart(Composite body, FormToolkit toolkit, ManifestEditor editor) {
-        super(body, toolkit, editor,
-                getManifestUiNode(editor),  // uiElementNode
-                "Manifest General Attributes", // section title
-                "Defines general information about the AndroidManifest.xml", // section description
-                Section.TWISTIE | Section.EXPANDED);
-    }
-
-    /**
-     * Retrieves the UiElementNode that this part will edit. The node must exist
-     * and can't be null, by design, because it's a mandatory node.
-     */
-    private static UiElementNode getManifestUiNode(ManifestEditor editor) {
-        AndroidManifestDescriptors manifestDescriptors = editor.getManifestDescriptors();
-        if (manifestDescriptors != null) {
-            ElementDescriptor desc = manifestDescriptors.getManifestElement();
-            if (editor.getUiRootNode().getDescriptor() == desc) {
-                return editor.getUiRootNode();
-            } else {
-                return editor.getUiRootNode().findUiChildNode(desc.getXmlName());
-            }
-        }
-        
-        // No manifest descriptor: we have a dummy UiRootNode, so we return that.
-        // The editor will be reloaded once we have the proper descriptors anyway.
-        return editor.getUiRootNode();
-    }
-
-    /**
-     * Overridden in order to capture the current managed form.
-     * 
-     * {@inheritDoc}
-     */
-    @Override
-    protected void createFormControls(final IManagedForm managedForm) {
-        mManagedForm = managedForm; 
-        super.createFormControls(managedForm);
-    }
-
-    /**
-     * Removes any existing Attribute UI widgets and recreate them if the SDK has changed.
-     * <p/>
-     * This is called by {@link OverviewPage#refreshUiApplicationNode()} when the
-     * SDK has changed.
-     */
-    public void onSdkChanged() {
-        setUiElementNode(getManifestUiNode(getEditor()));
-        createUiAttributes(mManagedForm);
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/manifest/pages/OverviewLinksPart.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/manifest/pages/OverviewLinksPart.java
deleted file mode 100644
index f821375..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/manifest/pages/OverviewLinksPart.java
+++ /dev/null
@@ -1,124 +0,0 @@
-/*
- * Copyright (C) 2007 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.editors.manifest.pages;
-
-import com.android.ide.eclipse.adt.AdtPlugin;
-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.descriptors.ElementDescriptor;
-import com.android.ide.eclipse.adt.internal.editors.manifest.ManifestEditor;
-import com.android.ide.eclipse.adt.internal.editors.manifest.descriptors.AndroidManifestDescriptors;
-import com.android.ide.eclipse.adt.internal.editors.ui.SectionHelper.ManifestSectionPart;
-
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.forms.widgets.FormText;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-import org.eclipse.ui.forms.widgets.Section;
-
-/**
- * Links section part for overview page.
- */
-final class OverviewLinksPart extends ManifestSectionPart {
-
-    private final ManifestEditor mEditor;
-    private FormText mFormText;
-
-    public OverviewLinksPart(Composite body, FormToolkit toolkit, ManifestEditor editor) {
-        super(body, toolkit, Section.TWISTIE | Section.EXPANDED, true /* description */);
-        mEditor = editor;
-        Section section = getSection();
-        section.setText("Links");
-        section.setDescription("The content of the Android Manifest is made up of three sections. You can also edit the XML directly.");
-
-        Composite table = createTableLayout(toolkit, 2 /* numColumns */);
-
-        StringBuffer buf = new StringBuffer();
-        buf.append(String.format("<form><li style=\"image\" value=\"app_img\"><a href=\"page:%1$s\">", //$NON-NLS-1$
-                ApplicationPage.PAGE_ID));
-        buf.append("Application");
-        buf.append("</a>");  //$NON-NLS-1$
-        buf.append(": Activities, intent filters, providers, services and receivers.");
-        buf.append("</li>"); //$NON-NLS-1$
-
-        buf.append(String.format("<li style=\"image\" value=\"perm_img\"><a href=\"page:%1$s\">", //$NON-NLS-1$
-                PermissionPage.PAGE_ID));
-        buf.append("Permission");
-        buf.append("</a>"); //$NON-NLS-1$
-        buf.append(": Permissions defined and permissions used.");
-        buf.append("</li>"); //$NON-NLS-1$
-
-        buf.append(String.format("<li style=\"image\" value=\"inst_img\"><a href=\"page:%1$s\">", //$NON-NLS-1$
-                InstrumentationPage.PAGE_ID));
-        buf.append("Instrumentation");
-        buf.append("</a>"); //$NON-NLS-1$
-        buf.append(": Instrumentation defined.");
-        buf.append("</li>"); //$NON-NLS-1$
-
-        buf.append(String.format("<li style=\"image\" value=\"srce_img\"><a href=\"page:%1$s\">", //$NON-NLS-1$
-                ManifestEditor.TEXT_EDITOR_ID));
-        buf.append("XML Source");
-        buf.append("</a>"); //$NON-NLS-1$
-        buf.append(": Directly edit the AndroidManifest.xml file.");
-        buf.append("</li>"); //$NON-NLS-1$
-
-        buf.append("<li style=\"image\" value=\"android_img\">"); //$NON-NLS-1$
-        buf.append("<a href=\"http://code.google.com/android/devel/bblocks-manifest.html\">Documentation</a>: Documentation from the Android SDK for AndroidManifest.xml."); //$NON-NLS-1$
-        buf.append("</li>"); //$NON-NLS-1$
-        buf.append("</form>"); //$NON-NLS-1$
-
-        mFormText = createFormText(table, toolkit, true, buf.toString(),
-                false /* setupLayoutData */);
-
-        AndroidManifestDescriptors manifestDescriptor = editor.getManifestDescriptors();
-
-        Image androidLogo = AdtPlugin.getAndroidLogo();
-        mFormText.setImage("android_img", androidLogo); //$NON-NLS-1$
-        mFormText.setImage("srce_img", IconFactory.getInstance().getIcon(AndroidXmlEditor.ICON_XML_PAGE));
-
-        if (manifestDescriptor != null) {
-            mFormText.setImage("app_img", getIcon(manifestDescriptor.getApplicationElement())); //$NON-NLS-1$
-            mFormText.setImage("perm_img", getIcon(manifestDescriptor.getPermissionElement())); //$NON-NLS-1$
-            mFormText.setImage("inst_img", getIcon(manifestDescriptor.getInstrumentationElement())); //$NON-NLS-1$
-        } else {
-            mFormText.setImage("app_img", androidLogo); //$NON-NLS-1$
-            mFormText.setImage("perm_img", androidLogo); //$NON-NLS-1$
-            mFormText.setImage("inst_img", androidLogo); //$NON-NLS-1$
-        }
-        mFormText.addHyperlinkListener(editor.createHyperlinkListener());
-    }
-
-    /**
-     * Update the UI with information from the new descriptors.
-     * <p/>At this point, this only refreshes the icons.
-     * <p/>
-     * This is called by {@link OverviewPage#refreshUiApplicationNode()} when the
-     * SDK has changed.
-     */
-    public void onSdkChanged() {
-        AndroidManifestDescriptors manifestDescriptor = mEditor.getManifestDescriptors();
-        if (manifestDescriptor != null) {
-            mFormText.setImage("app_img", getIcon(manifestDescriptor.getApplicationElement())); //$NON-NLS-1$
-            mFormText.setImage("perm_img", getIcon(manifestDescriptor.getPermissionElement())); //$NON-NLS-1$
-            mFormText.setImage("inst_img", getIcon(manifestDescriptor.getInstrumentationElement())); //$NON-NLS-1$
-        }
-    }
-
-    private Image getIcon(ElementDescriptor desc) {
-        return desc.getCustomizedIcon();
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/manifest/pages/OverviewPage.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/manifest/pages/OverviewPage.java
deleted file mode 100644
index 7464f6a..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/manifest/pages/OverviewPage.java
+++ /dev/null
@@ -1,165 +0,0 @@
-/*
- * Copyright (C) 2007 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.editors.manifest.pages;
-
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.ide.eclipse.adt.internal.editors.IPageImageProvider;
-import com.android.ide.eclipse.adt.internal.editors.IconFactory;
-import com.android.ide.eclipse.adt.internal.editors.descriptors.ElementDescriptor;
-import com.android.ide.eclipse.adt.internal.editors.manifest.ManifestEditor;
-import com.android.ide.eclipse.adt.internal.editors.manifest.descriptors.AndroidManifestDescriptors;
-import com.android.ide.eclipse.adt.internal.editors.ui.tree.UiTreeBlock;
-import com.android.ide.eclipse.adt.internal.editors.uimodel.UiElementNode;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.forms.IManagedForm;
-import org.eclipse.ui.forms.editor.FormPage;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-import org.eclipse.ui.forms.widgets.ScrolledForm;
-
-import java.util.ArrayList;
-import java.util.HashSet;
-
-
-/**
- * Page for overview settings, part of the AndroidManifest form editor.
- * <p/>
- * Useful reference:
- * <a href="http://www.eclipse.org/articles/Article-Forms/article.html">
- *   http://www.eclipse.org/articles/Article-Forms/article.html</a>
- */
-public final class OverviewPage extends FormPage implements IPageImageProvider {
-
-    /** Page id used for switching tabs programmatically */
-    final static String PAGE_ID = "overview_page"; //$NON-NLS-1$
-
-    /** Container editor */
-    ManifestEditor mEditor;
-    /** Overview part (attributes for manifest) */
-    private OverviewInfoPart mOverviewPart;
-    /** Overview link part */
-    private OverviewLinksPart mOverviewLinkPart;
-
-    private UiTreeBlock mTreeBlock;
-
-    public OverviewPage(ManifestEditor editor) {
-        super(editor, PAGE_ID, "Manifest");  // tab's label, user visible, keep it short
-        mEditor = editor;
-    }
-
-    @Override
-    public Image getPageImage() {
-        return IconFactory.getInstance().getIcon("editor_page_design");  //$NON-NLS-1$
-    }
-
-    /**
-     * Creates the content in the form hosted in this page.
-     *
-     * @param managedForm the form hosted in this page.
-     */
-    @Override
-    protected void createFormContent(IManagedForm managedForm) {
-        super.createFormContent(managedForm);
-        ScrolledForm form = managedForm.getForm();
-        form.setText("Android Manifest");
-        form.setImage(AdtPlugin.getAndroidLogo());
-
-        Composite body = form.getBody();
-        FormToolkit toolkit = managedForm.getToolkit();
-
-        // Usually we would set a ColumnLayout on body here. However the presence of the
-        // UiTreeBlock forces a GridLayout with one column so we comply with it.
-
-        mOverviewPart = new OverviewInfoPart(body, toolkit, mEditor);
-        mOverviewPart.getSection().setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false));
-        managedForm.addPart(mOverviewPart);
-
-        newManifestExtrasPart(managedForm);
-
-        OverviewExportPart exportPart = new OverviewExportPart(this, body, toolkit, mEditor);
-        exportPart.getSection().setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false));
-        managedForm.addPart(exportPart);
-
-        mOverviewLinkPart = new OverviewLinksPart(body, toolkit, mEditor);
-        mOverviewLinkPart.getSection().setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false));
-        managedForm.addPart(mOverviewLinkPart);
-    }
-
-    private void newManifestExtrasPart(IManagedForm managedForm) {
-        UiElementNode manifest = mEditor.getUiRootNode();
-        mTreeBlock = new UiTreeBlock(mEditor, manifest,
-                true /* autoCreateRoot */,
-                computeManifestExtraFilters(),
-                "Manifest Extras",
-                "Extra manifest elements");
-        mTreeBlock.createContent(managedForm);
-    }
-
-    /**
-     * Changes and refreshes the Application UI node handled by the sub parts.
-     */
-    public void refreshUiApplicationNode() {
-        if (mOverviewPart != null) {
-            mOverviewPart.onSdkChanged();
-        }
-
-        if (mOverviewLinkPart != null) {
-            mOverviewLinkPart.onSdkChanged();
-        }
-
-        if (mTreeBlock != null) {
-            UiElementNode manifest = mEditor.getUiRootNode();
-            mTreeBlock.changeRootAndDescriptors(manifest,
-                    computeManifestExtraFilters(),
-                    true /* refresh */);
-        }
-    }
-
-    private ElementDescriptor[] computeManifestExtraFilters() {
-        UiElementNode manifest = mEditor.getUiRootNode();
-        AndroidManifestDescriptors manifestDescriptor = mEditor.getManifestDescriptors();
-
-        if (manifestDescriptor == null) {
-            return null;
-        }
-
-        // get the elements we want to exclude
-        HashSet<ElementDescriptor> excludes = new HashSet<ElementDescriptor>();
-        excludes.add(manifestDescriptor.getApplicationElement());
-        excludes.add(manifestDescriptor.getInstrumentationElement());
-        excludes.add(manifestDescriptor.getPermissionElement());
-        excludes.add(manifestDescriptor.getPermissionGroupElement());
-        excludes.add(manifestDescriptor.getPermissionTreeElement());
-        excludes.add(manifestDescriptor.getUsesPermissionElement());
-
-        // walk through the known children of the manifest descriptor and keep what's not excluded
-        ArrayList<ElementDescriptor> descriptorFilters = new ArrayList<ElementDescriptor>();
-        for (ElementDescriptor child : manifest.getDescriptor().getChildren()) {
-            if (!excludes.contains(child)) {
-                descriptorFilters.add(child);
-            }
-        }
-
-        if (descriptorFilters.size() == 0) {
-            return null;
-        }
-        return descriptorFilters.toArray(new ElementDescriptor[descriptorFilters.size()]);
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/manifest/pages/PermissionPage.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/manifest/pages/PermissionPage.java
deleted file mode 100644
index 2f65577..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/manifest/pages/PermissionPage.java
+++ /dev/null
@@ -1,111 +0,0 @@
-/*
- * Copyright (C) 2007 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.editors.manifest.pages;
-
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.ide.eclipse.adt.internal.editors.IPageImageProvider;
-import com.android.ide.eclipse.adt.internal.editors.IconFactory;
-import com.android.ide.eclipse.adt.internal.editors.descriptors.ElementDescriptor;
-import com.android.ide.eclipse.adt.internal.editors.manifest.ManifestEditor;
-import com.android.ide.eclipse.adt.internal.editors.manifest.descriptors.AndroidManifestDescriptors;
-import com.android.ide.eclipse.adt.internal.editors.ui.tree.UiTreeBlock;
-import com.android.ide.eclipse.adt.internal.editors.uimodel.UiElementNode;
-
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.ui.forms.IManagedForm;
-import org.eclipse.ui.forms.editor.FormPage;
-import org.eclipse.ui.forms.widgets.ScrolledForm;
-
-/**
- * Page for permissions settings, part of the AndroidManifest form editor.
- * <p/>
- * Useful reference:
- * <a href="http://www.eclipse.org/articles/Article-Forms/article.html">
- *   http://www.eclipse.org/articles/Article-Forms/article.html</a>
- */
-public final class PermissionPage extends FormPage implements IPageImageProvider {
-    /** Page id used for switching tabs programmatically */
-    public final static String PAGE_ID = "permission_page"; //$NON-NLS-1$
-
-    /** Container editor */
-    ManifestEditor mEditor;
-
-    private UiTreeBlock mTreeBlock;
-
-    public PermissionPage(ManifestEditor editor) {
-        super(editor, PAGE_ID, "Permissions");  // tab label, keep it short
-        mEditor = editor;
-    }
-
-    @Override
-    public Image getPageImage() {
-        return IconFactory.getInstance().getIcon(getTitle(),
-                                                 IconFactory.COLOR_RED,
-                                                 IconFactory.SHAPE_RECT);
-    }
-
-    /**
-     * Creates the content in the form hosted in this page.
-     *
-     * @param managedForm the form hosted in this page.
-     */
-    @Override
-    protected void createFormContent(IManagedForm managedForm) {
-        super.createFormContent(managedForm);
-        ScrolledForm form = managedForm.getForm();
-        form.setText("Android Manifest Permissions");
-        form.setImage(AdtPlugin.getAndroidLogo());
-
-        UiElementNode manifest = mEditor.getUiRootNode();
-        AndroidManifestDescriptors manifestDescriptor = mEditor.getManifestDescriptors();
-
-        ElementDescriptor[] descriptorFilters = null;
-        if (manifestDescriptor != null) {
-            descriptorFilters = new ElementDescriptor[] {
-                    manifestDescriptor.getPermissionElement(),
-                    manifestDescriptor.getUsesPermissionElement(),
-                    manifestDescriptor.getPermissionGroupElement(),
-                    manifestDescriptor.getPermissionTreeElement()
-            };
-        }
-        mTreeBlock = new UiTreeBlock(mEditor, manifest,
-                true /* autoCreateRoot */,
-                descriptorFilters,
-                "Permissions",
-                "List of permissions defined and used by the manifest");
-        mTreeBlock.createContent(managedForm);
-    }
-
-    /**
-     * Changes and refreshes the Application UI node handled by the sub parts.
-     */
-    public void refreshUiNode() {
-        if (mTreeBlock != null) {
-            UiElementNode manifest = mEditor.getUiRootNode();
-            AndroidManifestDescriptors manifestDescriptor = mEditor.getManifestDescriptors();
-
-            mTreeBlock.changeRootAndDescriptors(manifest,
-                    new ElementDescriptor[] {
-                        manifestDescriptor.getPermissionElement(),
-                        manifestDescriptor.getUsesPermissionElement(),
-                        manifestDescriptor.getPermissionGroupElement(),
-                        manifestDescriptor.getPermissionTreeElement()
-                    },
-                    true /* refresh */);
-        }
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/menu/MenuContentAssist.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/menu/MenuContentAssist.java
deleted file mode 100644
index 59068e9..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/menu/MenuContentAssist.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * 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.editors.menu;
-
-import com.android.ide.eclipse.adt.internal.editors.AndroidContentAssist;
-import com.android.ide.eclipse.adt.internal.sdk.AndroidTargetData;
-
-/**
- * Content Assist Processor for /res/menu XML files
- */
-class MenuContentAssist extends AndroidContentAssist {
-
-    /**
-     * Constructor for LayoutContentAssist 
-     */
-    public MenuContentAssist() {
-        super(AndroidTargetData.DESCRIPTOR_MENU);
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/menu/MenuEditorDelegate.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/menu/MenuEditorDelegate.java
deleted file mode 100644
index bfde86a..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/menu/MenuEditorDelegate.java
+++ /dev/null
@@ -1,175 +0,0 @@
-/*
- * 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.editors.menu;
-
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-import com.android.ide.eclipse.adt.AdtConstants;
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.ide.eclipse.adt.internal.editors.common.CommonXmlDelegate;
-import com.android.ide.eclipse.adt.internal.editors.common.CommonXmlEditor;
-import com.android.ide.eclipse.adt.internal.editors.descriptors.ElementDescriptor;
-import com.android.ide.eclipse.adt.internal.editors.descriptors.ElementDescriptor.Mandatory;
-import com.android.ide.eclipse.adt.internal.sdk.AndroidTargetData;
-import com.android.resources.ResourceFolderType;
-import com.android.xml.AndroidXPathFactory;
-
-import org.eclipse.ui.PartInitException;
-import org.w3c.dom.Document;
-import org.w3c.dom.Node;
-
-import javax.xml.xpath.XPath;
-import javax.xml.xpath.XPathConstants;
-import javax.xml.xpath.XPathExpressionException;
-
-/**
- * Multi-page form editor for /res/menu XML files.
- */
-public class MenuEditorDelegate extends CommonXmlDelegate {
-
-    public static class Creator implements IDelegateCreator {
-        @Override
-        @SuppressWarnings("unchecked")
-        public MenuEditorDelegate createForFile(
-                @NonNull CommonXmlEditor delegator,
-                @Nullable ResourceFolderType type) {
-            if (ResourceFolderType.MENU == type) {
-                return new MenuEditorDelegate(delegator);
-            }
-
-            return null;
-        }
-    }
-
-    /**
-     * Old standalone-editor ID.
-     * Use {@link CommonXmlEditor#ID} instead.
-     */
-    public static final String LEGACY_EDITOR_ID =
-        AdtConstants.EDITORS_NAMESPACE + ".menu.MenuEditor"; //$NON-NLS-1$
-
-    /**
-     * Creates the form editor for resources XML files.
-     */
-    private MenuEditorDelegate(CommonXmlEditor editor) {
-        super(editor, new MenuContentAssist());
-        editor.addDefaultTargetListener();
-    }
-
-    /**
-     * Create the various form pages.
-     */
-    @Override
-    public void delegateCreateFormPages() {
-        try {
-            getEditor().addPage(new MenuTreePage(getEditor()));
-        } catch (PartInitException e) {
-            AdtPlugin.log(e, "Error creating nested page"); //$NON-NLS-1$
-        }
-
-     }
-
-    private boolean mUpdatingModel;
-
-    /**
-     * Processes the new XML Model, which XML root node is given.
-     *
-     * @param xml_doc The XML document, if available, or null if none exists.
-     */
-    @Override
-    public void delegateXmlModelChanged(Document xml_doc) {
-        if (mUpdatingModel) {
-            return;
-        }
-
-        try {
-            mUpdatingModel = true;
-
-            // init the ui root on demand
-            delegateInitUiRootNode(false /*force*/);
-
-            getUiRootNode().setXmlDocument(xml_doc);
-            if (xml_doc != null) {
-                ElementDescriptor root_desc = getUiRootNode().getDescriptor();
-                try {
-                    XPath xpath = AndroidXPathFactory.newXPath();
-                    Node node = (Node) xpath.evaluate("/" + root_desc.getXmlName(),  //$NON-NLS-1$
-                            xml_doc,
-                            XPathConstants.NODE);
-                    if (node == null && root_desc.getMandatory() != Mandatory.NOT_MANDATORY) {
-                        // Create the root element if it doesn't exist yet (for empty new documents)
-                        node = getUiRootNode().createXmlNode();
-                    }
-
-                    // Refresh the manifest UI node and all its descendants
-                    getUiRootNode().loadFromXmlNode(node);
-
-                    // TODO ? startMonitoringMarkers();
-                } catch (XPathExpressionException e) {
-                    AdtPlugin.log(e, "XPath error when trying to find '%s' element in XML.", //$NON-NLS-1$
-                            root_desc.getXmlName());
-                }
-            }
-
-        } finally {
-            mUpdatingModel = false;
-        }
-    }
-
-    /**
-     * Creates the initial UI Root Node, including the known mandatory elements.
-     * @param force if true, a new UiRootNode is recreated even if it already exists.
-     */
-    @Override
-    public void delegateInitUiRootNode(boolean force) {
-        // The root UI node is always created, even if there's no corresponding XML node.
-        if (getUiRootNode() == null || force) {
-            Document doc = null;
-            if (getUiRootNode() != null) {
-                doc = getUiRootNode().getXmlDocument();
-            }
-
-            // get the target data from the opened file (and its project)
-            AndroidTargetData data = getEditor().getTargetData();
-
-            ElementDescriptor desc;
-            if (data == null) {
-                desc = new ElementDescriptor("temp", null /*children*/);
-            } else {
-                desc = data.getMenuDescriptors().getDescriptor();
-            }
-
-            setUiRootNode(desc.createUiNode());
-            getUiRootNode().setEditor(getEditor());
-
-            onDescriptorsChanged(doc);
-        }
-    }
-
-    // ---- Local Methods ----
-
-    /**
-     * Reloads the UI manifest node from the XML, and calls the pages to update.
-     */
-    private void onDescriptorsChanged(Document document) {
-        if (document != null) {
-            getUiRootNode().loadFromXmlNode(document);
-        } else {
-            getUiRootNode().reloadFromXmlNode(getUiRootNode().getXmlNode());
-        }
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/menu/MenuTreePage.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/menu/MenuTreePage.java
deleted file mode 100644
index e241885..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/menu/MenuTreePage.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * 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.editors.menu;
-
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.ide.eclipse.adt.internal.editors.IPageImageProvider;
-import com.android.ide.eclipse.adt.internal.editors.IconFactory;
-import com.android.ide.eclipse.adt.internal.editors.common.CommonXmlEditor;
-import com.android.ide.eclipse.adt.internal.editors.ui.tree.UiTreeBlock;
-import com.android.ide.eclipse.adt.internal.editors.uimodel.UiElementNode;
-
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.ui.forms.IManagedForm;
-import org.eclipse.ui.forms.editor.FormPage;
-import org.eclipse.ui.forms.widgets.ScrolledForm;
-
-/**
- * Page for the menu form editor.
- */
-public final class MenuTreePage extends FormPage implements IPageImageProvider {
-    /** Page id used for switching tabs programmatically */
-    public final static String PAGE_ID = "layout_tree_page"; //$NON-NLS-1$
-
-    /** Container editor */
-    CommonXmlEditor mEditor;
-
-    public MenuTreePage(CommonXmlEditor editor) {
-        super(editor, PAGE_ID, "Layout");  // tab's label, keep it short
-        mEditor = editor;
-    }
-
-    @Override
-    public Image getPageImage() {
-        return IconFactory.getInstance().getIcon("editor_page_design");  //$NON-NLS-1$
-    }
-
-    /**
-     * Creates the content in the form hosted in this page.
-     *
-     * @param managedForm the form hosted in this page.
-     */
-    @Override
-    protected void createFormContent(IManagedForm managedForm) {
-        super.createFormContent(managedForm);
-        ScrolledForm form = managedForm.getForm();
-        form.setText("Android Menu");
-        form.setImage(AdtPlugin.getAndroidLogo());
-
-        UiElementNode rootNode = mEditor.getUiRootNode();
-        UiTreeBlock block = new UiTreeBlock(mEditor, rootNode,
-                true /* autoCreateRoot */,
-                null /* no element filters */,
-                "Menu Elements",
-                "List of all menu elements in this XML file.");
-        block.createContent(managedForm);
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/menu/descriptors/MenuDescriptors.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/menu/descriptors/MenuDescriptors.java
deleted file mode 100644
index b7bab1b..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/menu/descriptors/MenuDescriptors.java
+++ /dev/null
@@ -1,199 +0,0 @@
-/*
- * 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.editors.menu.descriptors;
-
-import static com.android.SdkConstants.ANDROID_NS_NAME;
-import static com.android.SdkConstants.ANDROID_URI;
-import static com.android.SdkConstants.TAG_MENU;
-
-import com.android.ide.common.resources.platform.DeclareStyleableInfo;
-import com.android.ide.eclipse.adt.AdtUtils;
-import com.android.ide.eclipse.adt.internal.editors.descriptors.AttributeDescriptor;
-import com.android.ide.eclipse.adt.internal.editors.descriptors.DescriptorsUtils;
-import com.android.ide.eclipse.adt.internal.editors.descriptors.ElementDescriptor;
-import com.android.ide.eclipse.adt.internal.editors.descriptors.IDescriptorProvider;
-import com.android.ide.eclipse.adt.internal.editors.descriptors.XmlnsAttributeDescriptor;
-
-import java.util.ArrayList;
-import java.util.Map;
-
-/**
- * Complete description of the menu structure.
- */
-public final class MenuDescriptors implements IDescriptorProvider {
-
-    /** The root element descriptor. */
-    private ElementDescriptor mDescriptor = null;
-
-    /** @return the root descriptor. */
-    @Override
-    public ElementDescriptor getDescriptor() {
-        return mDescriptor;
-    }
-
-    @Override
-    public ElementDescriptor[] getRootElementDescriptors() {
-        return mDescriptor.getChildren();
-    }
-
-    /**
-     * Updates the document descriptor.
-     * <p/>
-     * It first computes the new children of the descriptor and then updates them
-     * all at once.
-     *
-     * @param styleMap The map style => attributes from the attrs.xml file
-     */
-    public synchronized void updateDescriptors(Map<String, DeclareStyleableInfo> styleMap) {
-
-        // There are 3 elements: menu, item and group.
-        // The root element MUST be a menu.
-        // A top menu can contain items or group:
-        //  - top groups can contain top items
-        //  - top items can contain sub-menus
-        // A sub menu can contains sub items or sub groups:
-        //  - sub groups can contain sub items
-        //  - sub items cannot contain anything
-
-        if (mDescriptor == null) {
-            mDescriptor = createElement(styleMap,
-                TAG_MENU, // xmlName
-                "Menu", // uiName,
-                null, // TODO SDK URL
-                null, // extraAttribute
-                null, // childrenElements,
-                true /* mandatory */);
-        }
-
-        // -- sub menu can have sub_items, sub_groups but not sub_menus
-
-        ElementDescriptor sub_item = createElement(styleMap,
-                "item", // xmlName //$NON-NLS-1$
-                "Item", // uiName,
-                null, // TODO SDK URL
-                null, // extraAttribute
-                null, // childrenElements,
-                false /* mandatory */);
-
-        ElementDescriptor sub_group = createElement(styleMap,
-                "group", // xmlName //$NON-NLS-1$
-                "Group", // uiName,
-                null, // TODO SDK URL
-                null, // extraAttribute
-                new ElementDescriptor[] { sub_item }, // childrenElements,
-                false /* mandatory */);
-
-        ElementDescriptor sub_menu = createElement(styleMap,
-                TAG_MENU, // xmlName
-                "Sub-Menu", // uiName,
-                null, // TODO SDK URL
-                null, // extraAttribute
-                new ElementDescriptor[] { sub_item, sub_group }, // childrenElements,
-                true /* mandatory */);
-
-        // -- top menu can have all top groups and top items (which can have sub menus)
-
-        ElementDescriptor top_item = createElement(styleMap,
-                "item", // xmlName //$NON-NLS-1$
-                "Item", // uiName,
-                null, // TODO SDK URL
-                null, // extraAttribute
-                new ElementDescriptor[] { sub_menu }, // childrenElements,
-                false /* mandatory */);
-
-        ElementDescriptor top_group = createElement(styleMap,
-                "group", // xmlName //$NON-NLS-1$
-                "Group", // uiName,
-                null, // TODO SDK URL
-                null, // extraAttribute
-                new ElementDescriptor[] { top_item }, // childrenElements,
-                false /* mandatory */);
-
-        XmlnsAttributeDescriptor xmlns = new XmlnsAttributeDescriptor(ANDROID_NS_NAME,
-                ANDROID_URI);
-
-        updateElement(mDescriptor, styleMap, "Menu", xmlns); //$NON-NLS-1$
-        mDescriptor.setChildren(new ElementDescriptor[] { top_item, top_group });
-    }
-
-    /**
-     * Returns a new ElementDescriptor constructed from the information given here
-     * and the javadoc & attributes extracted from the style map if any.
-     */
-    private ElementDescriptor createElement(
-            Map<String, DeclareStyleableInfo> styleMap,
-            String xmlName, String uiName, String sdkUrl,
-            AttributeDescriptor extraAttribute,
-            ElementDescriptor[] childrenElements, boolean mandatory) {
-
-        ElementDescriptor element = new ElementDescriptor(xmlName, uiName, null, sdkUrl,
-                null, childrenElements, mandatory);
-
-        return updateElement(element, styleMap,
-                getStyleName(xmlName),
-                extraAttribute);
-    }
-
-    /**
-     * Updates an ElementDescriptor with the javadoc & attributes extracted from the style
-     * map if any.
-     */
-    private ElementDescriptor updateElement(ElementDescriptor element,
-            Map<String, DeclareStyleableInfo> styleMap,
-            String styleName,
-            AttributeDescriptor extraAttribute) {
-        ArrayList<AttributeDescriptor> descs = new ArrayList<AttributeDescriptor>();
-
-        DeclareStyleableInfo style = styleMap != null ? styleMap.get(styleName) : null;
-        if (style != null) {
-            DescriptorsUtils.appendAttributes(descs,
-                    null,   // elementName
-                    ANDROID_URI,
-                    style.getAttributes(),
-                    null,   // requiredAttributes
-                    null);  // overrides
-            element.setTooltip(style.getJavaDoc());
-        }
-
-        if (extraAttribute != null) {
-            descs.add(extraAttribute);
-        }
-
-        element.setAttributes(descs.toArray(new AttributeDescriptor[descs.size()]));
-        return element;
-    }
-
-    /**
-     * Returns the style name (i.e. the <declare-styleable> name found in attrs.xml)
-     * for a given XML element name.
-     * <p/>
-     * The rule is that all elements have for style name:
-     * - their xml name capitalized
-     * - a "Menu" prefix, except for <menu> itself which is just "Menu".
-     */
-    private String getStyleName(String xmlName) {
-        String styleName = AdtUtils.capitalize(xmlName);
-
-        // This is NOT the UI Name but the expected internal style name
-        final String MENU_STYLE_BASE_NAME = "Menu"; //$NON-NLS-1$
-
-        if (!styleName.equals(MENU_STYLE_BASE_NAME)) {
-            styleName = MENU_STYLE_BASE_NAME + styleName;
-        }
-        return styleName;
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/otherxml/OtherXmlContentAssist.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/otherxml/OtherXmlContentAssist.java
deleted file mode 100644
index 19a8d85..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/otherxml/OtherXmlContentAssist.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * 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.editors.otherxml;
-
-import com.android.ide.eclipse.adt.internal.editors.AndroidContentAssist;
-import com.android.ide.eclipse.adt.internal.sdk.AndroidTargetData;
-
-/**
- * Content Assist Processor for /res/xml XML files
- */
-class OtherXmlContentAssist extends AndroidContentAssist {
-
-    /**
-     * Constructor for LayoutContentAssist 
-     */
-    public OtherXmlContentAssist() {
-        super(AndroidTargetData.DESCRIPTOR_OTHER_XML);
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/otherxml/OtherXmlEditorDelegate.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/otherxml/OtherXmlEditorDelegate.java
deleted file mode 100644
index 7d74516..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/otherxml/OtherXmlEditorDelegate.java
+++ /dev/null
@@ -1,135 +0,0 @@
-/*
- * 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.editors.otherxml;
-
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-import com.android.ide.eclipse.adt.AdtConstants;
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.ide.eclipse.adt.internal.editors.common.CommonXmlDelegate;
-import com.android.ide.eclipse.adt.internal.editors.common.CommonXmlEditor;
-import com.android.ide.eclipse.adt.internal.editors.descriptors.DocumentDescriptor;
-import com.android.ide.eclipse.adt.internal.sdk.AndroidTargetData;
-import com.android.resources.ResourceFolderType;
-
-import org.eclipse.ui.PartInitException;
-import org.w3c.dom.Document;
-
-/**
- * Multi-page form editor for /res/xml XML files.
- */
-public class OtherXmlEditorDelegate extends CommonXmlDelegate {
-
-    public static class Creator implements IDelegateCreator {
-        @Override
-        @SuppressWarnings("unchecked")
-        public OtherXmlEditorDelegate createForFile(
-                @NonNull CommonXmlEditor delegator,
-                @Nullable ResourceFolderType type) {
-            if (ResourceFolderType.XML == type) {
-                return new OtherXmlEditorDelegate(delegator);
-            }
-
-            return null;
-        }
-    }
-
-    /**
-     * Old standalone-editor ID.
-     * Use {@link CommonXmlEditor#ID} instead.
-     */
-    public static final String LEGACY_EDITOR_ID =
-        AdtConstants.EDITORS_NAMESPACE + ".xml.XmlEditor"; //$NON-NLS-1$
-
-    /**
-     * Creates the form editor for resources XML files.
-     */
-    public OtherXmlEditorDelegate(CommonXmlEditor editor) {
-        super(editor, new OtherXmlContentAssist());
-        editor.addDefaultTargetListener();
-    }
-
-    // ---- Base Class Overrides ----
-
-    /**
-     * Create the various form pages.
-     */
-    @Override
-    public void delegateCreateFormPages() {
-        try {
-            getEditor().addPage(new OtherXmlTreePage(getEditor()));
-        } catch (PartInitException e) {
-            AdtPlugin.log(e, "Error creating nested page"); //$NON-NLS-1$
-        }
-
-    }
-    /**
-     * Processes the new XML Model, which XML root node is given.
-     *
-     * @param xml_doc The XML document, if available, or null if none exists.
-     */
-    @Override
-    public void delegateXmlModelChanged(Document xml_doc) {
-        // init the ui root on demand
-        delegateInitUiRootNode(false /*force*/);
-
-        getUiRootNode().loadFromXmlNode(xml_doc);
-    }
-
-    /**
-     * Creates the initial UI Root Node, including the known mandatory elements.
-     * @param force if true, a new UiRootNode is recreated even if it already exists.
-     */
-    @Override
-    public void delegateInitUiRootNode(boolean force) {
-        // The root UI node is always created, even if there's no corresponding XML node.
-        if (getUiRootNode() == null || force) {
-            Document doc = null;
-            if (getUiRootNode() != null) {
-                doc = getUiRootNode().getXmlDocument();
-            }
-
-            // get the target data from the opened file (and its project)
-            AndroidTargetData data = getEditor().getTargetData();
-
-            DocumentDescriptor desc;
-            if (data == null) {
-                desc = new DocumentDescriptor("temp", null /*children*/);
-            } else {
-                desc = data.getXmlDescriptors().getDescriptor();
-            }
-
-            setUiRootNode(desc.createUiNode());
-            getUiRootNode().setEditor(getEditor());
-
-            onDescriptorsChanged(doc);
-        }
-    }
-
-    // ---- Local Methods ----
-
-    /**
-     * Reloads the UI manifest node from the XML, and calls the pages to update.
-     */
-    private void onDescriptorsChanged(Document document) {
-        if (document != null) {
-            getUiRootNode().loadFromXmlNode(document);
-        } else {
-            getUiRootNode().reloadFromXmlNode(getUiRootNode().getXmlNode());
-        }
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/otherxml/OtherXmlTreePage.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/otherxml/OtherXmlTreePage.java
deleted file mode 100644
index ce81b0e..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/otherxml/OtherXmlTreePage.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * 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.editors.otherxml;
-
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.ide.eclipse.adt.internal.editors.IPageImageProvider;
-import com.android.ide.eclipse.adt.internal.editors.IconFactory;
-import com.android.ide.eclipse.adt.internal.editors.common.CommonXmlEditor;
-import com.android.ide.eclipse.adt.internal.editors.ui.tree.UiTreeBlock;
-import com.android.ide.eclipse.adt.internal.editors.uimodel.UiElementNode;
-
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.ui.forms.IManagedForm;
-import org.eclipse.ui.forms.editor.FormPage;
-import org.eclipse.ui.forms.widgets.ScrolledForm;
-
-/**
- * Page for the xml form editor.
- */
-public final class OtherXmlTreePage extends FormPage implements IPageImageProvider {
-    /** Page id used for switching tabs programmatically */
-    public final static String PAGE_ID = "xml_tree_page"; //$NON-NLS-1$
-
-    /** Container editor */
-    CommonXmlEditor mEditor;
-
-    public OtherXmlTreePage(CommonXmlEditor editor) {
-        super(editor, PAGE_ID, "Structure");  // tab's label, keep it short
-        mEditor = editor;
-    }
-
-    @Override
-    public Image getPageImage() {
-        return IconFactory.getInstance().getIcon("editor_page_design");  //$NON-NLS-1$
-    }
-
-    /**
-     * Creates the content in the form hosted in this page.
-     *
-     * @param managedForm the form hosted in this page.
-     */
-    @Override
-    protected void createFormContent(IManagedForm managedForm) {
-        super.createFormContent(managedForm);
-        ScrolledForm form = managedForm.getForm();
-        form.setText("Android Xml");
-        form.setImage(AdtPlugin.getAndroidLogo());
-
-        UiElementNode rootNode = mEditor.getUiRootNode();
-        UiTreeBlock block = new UiTreeBlock(mEditor, rootNode,
-                true /* autoCreateRoot */,
-                null /* no element filters */,
-                "Xml Elements",
-                "List of all xml elements in this XML file.");
-        block.createContent(managedForm);
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/otherxml/PlainXmlEditorDelegate.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/otherxml/PlainXmlEditorDelegate.java
deleted file mode 100644
index 5366988..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/otherxml/PlainXmlEditorDelegate.java
+++ /dev/null
@@ -1,50 +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.ide.eclipse.adt.internal.editors.otherxml;
-
-import com.android.ide.eclipse.adt.internal.editors.common.CommonXmlDelegate;
-import com.android.ide.eclipse.adt.internal.editors.common.CommonXmlEditor;
-
-import org.w3c.dom.Document;
-
-/**
- * Plain XML editor with no form for files that have no associated descriptor data
- */
-public class PlainXmlEditorDelegate extends CommonXmlDelegate {
-
-    /**
-     * Creates the form editor for plain XML files.
-     */
-    public PlainXmlEditorDelegate(CommonXmlEditor editor) {
-        super(editor, new OtherXmlContentAssist());
-        editor.addDefaultTargetListener();
-    }
-
-    // ---- Base Class Overrides ----
-
-    @Override
-    public void delegateCreateFormPages() {
-    }
-
-    @Override
-    public void delegateXmlModelChanged(Document xml_doc) {
-    }
-
-    @Override
-    public void delegateInitUiRootNode(boolean force) {
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/otherxml/descriptors/OtherXmlDescriptors.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/otherxml/descriptors/OtherXmlDescriptors.java
deleted file mode 100644
index 7f3ed09..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/otherxml/descriptors/OtherXmlDescriptors.java
+++ /dev/null
@@ -1,373 +0,0 @@
-/*
- * 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.editors.otherxml.descriptors;
-
-import static com.android.SdkConstants.ANDROID_NS_NAME;
-import static com.android.SdkConstants.ANDROID_URI;
-
-import com.android.SdkConstants;
-import com.android.ide.common.resources.platform.AttributeInfo;
-import com.android.ide.common.resources.platform.DeclareStyleableInfo;
-import com.android.ide.common.resources.platform.ViewClassInfo;
-import com.android.ide.eclipse.adt.internal.editors.descriptors.AttributeDescriptor;
-import com.android.ide.eclipse.adt.internal.editors.descriptors.DescriptorsUtils;
-import com.android.ide.eclipse.adt.internal.editors.descriptors.DocumentDescriptor;
-import com.android.ide.eclipse.adt.internal.editors.descriptors.ElementDescriptor;
-import com.android.ide.eclipse.adt.internal.editors.descriptors.IDescriptorProvider;
-import com.android.ide.eclipse.adt.internal.editors.descriptors.SeparatorAttributeDescriptor;
-import com.android.ide.eclipse.adt.internal.editors.descriptors.XmlnsAttributeDescriptor;
-import com.android.ide.eclipse.adt.internal.editors.layout.descriptors.ViewElementDescriptor;
-
-import java.util.ArrayList;
-import java.util.Map;
-
-
-/**
- * Description of the /res/xml structure.
- * Currently supports the <searchable> and <preferences> root nodes.
- */
-public final class OtherXmlDescriptors implements IDescriptorProvider {
-
-    // Public attributes names, attributes descriptors and elements descriptors referenced
-    // elsewhere.
-    public static final String PREF_KEY_ATTR = "key"; //$NON-NLS-1$
-
-    /** The root document descriptor for both searchable and preferences. */
-    private DocumentDescriptor mDescriptor = new DocumentDescriptor("xml_doc", null /* children */); //$NON-NLS-1$
-
-    /** The root document descriptor for searchable. */
-    private DocumentDescriptor mSearchDescriptor = new DocumentDescriptor("xml_doc", null /* children */); //$NON-NLS-1$
-
-    /** The root document descriptor for preferences. */
-    private DocumentDescriptor mPrefDescriptor = new DocumentDescriptor("xml_doc", null /* children */); //$NON-NLS-1$
-
-    /** The root document descriptor for widget provider. */
-    private DocumentDescriptor mAppWidgetDescriptor = new DocumentDescriptor("xml_doc", null /* children */); //$NON-NLS-1$
-
-    /** @return the root descriptor for both searchable and preferences. */
-    @Override
-    public DocumentDescriptor getDescriptor() {
-        return mDescriptor;
-    }
-
-    @Override
-    public ElementDescriptor[] getRootElementDescriptors() {
-        return mDescriptor.getChildren();
-    }
-
-    /** @return the root descriptor for searchable. */
-    public DocumentDescriptor getSearchableDescriptor() {
-        return mSearchDescriptor;
-    }
-
-    /** @return the root descriptor for preferences. */
-    public DocumentDescriptor getPreferencesDescriptor() {
-        return mPrefDescriptor;
-    }
-
-    /** @return the root descriptor for widget providers. */
-    public DocumentDescriptor getAppWidgetDescriptor() {
-        return mAppWidgetDescriptor;
-    }
-
-    public IDescriptorProvider getSearchableProvider() {
-        return new IDescriptorProvider() {
-            @Override
-            public ElementDescriptor getDescriptor() {
-                return mSearchDescriptor;
-            }
-
-            @Override
-            public ElementDescriptor[] getRootElementDescriptors() {
-                return mSearchDescriptor.getChildren();
-            }
-        };
-    }
-
-    public IDescriptorProvider getPreferencesProvider() {
-        return new IDescriptorProvider() {
-            @Override
-            public ElementDescriptor getDescriptor() {
-                return mPrefDescriptor;
-            }
-
-            @Override
-            public ElementDescriptor[] getRootElementDescriptors() {
-                return mPrefDescriptor.getChildren();
-            }
-        };
-    }
-
-    public IDescriptorProvider getAppWidgetProvider() {
-        return new IDescriptorProvider() {
-            @Override
-            public ElementDescriptor getDescriptor() {
-                return mAppWidgetDescriptor;
-            }
-
-            @Override
-            public ElementDescriptor[] getRootElementDescriptors() {
-                return mAppWidgetDescriptor.getChildren();
-            }
-        };
-    }
-
-    /**
-     * Updates the document descriptor.
-     * <p/>
-     * It first computes the new children of the descriptor and then updates them
-     * all at once.
-     *
-     * @param searchableStyleMap The map style=>attributes for <searchable> from the attrs.xml file
-     * @param appWidgetStyleMap The map style=>attributes for <appwidget-provider> from the attrs.xml file
-     * @param prefs The list of non-group preference descriptions
-     * @param prefGroups The list of preference group descriptions
-     */
-    public synchronized void updateDescriptors(
-            Map<String, DeclareStyleableInfo> searchableStyleMap,
-            Map<String, DeclareStyleableInfo> appWidgetStyleMap,
-            ViewClassInfo[] prefs, ViewClassInfo[] prefGroups) {
-
-        XmlnsAttributeDescriptor xmlns = new XmlnsAttributeDescriptor(ANDROID_NS_NAME,
-                ANDROID_URI);
-
-        ElementDescriptor searchable = createSearchable(searchableStyleMap, xmlns);
-        ElementDescriptor appWidget = createAppWidgetProviderInfo(appWidgetStyleMap, xmlns);
-        ElementDescriptor preferences = createPreference(prefs, prefGroups, xmlns);
-        ArrayList<ElementDescriptor> list =  new ArrayList<ElementDescriptor>();
-        if (searchable != null) {
-            list.add(searchable);
-            mSearchDescriptor.setChildren(new ElementDescriptor[]{ searchable });
-        }
-        if (appWidget != null) {
-            list.add(appWidget);
-            mAppWidgetDescriptor.setChildren(new ElementDescriptor[]{ appWidget });
-        }
-        if (preferences != null) {
-            list.add(preferences);
-            mPrefDescriptor.setChildren(new ElementDescriptor[]{ preferences });
-        }
-
-        if (list.size() > 0) {
-            mDescriptor.setChildren(list.toArray(new ElementDescriptor[list.size()]));
-        }
-    }
-
-    //-------------------------
-    // Creation of <searchable>
-    //-------------------------
-
-    /**
-     * Returns the new ElementDescriptor for <searchable>
-     */
-    private ElementDescriptor createSearchable(
-            Map<String, DeclareStyleableInfo> searchableStyleMap,
-            XmlnsAttributeDescriptor xmlns) {
-
-        ElementDescriptor action_key = createElement(searchableStyleMap,
-                "SearchableActionKey", //$NON-NLS-1$ styleName
-                "actionkey", //$NON-NLS-1$ xmlName
-                "Action Key", // uiName
-                null, // sdk url
-                null, // extraAttribute
-                null, // childrenElements
-                false /* mandatory */ );
-
-        ElementDescriptor searchable = createElement(searchableStyleMap,
-                "Searchable", //$NON-NLS-1$ styleName
-                "searchable", //$NON-NLS-1$ xmlName
-                "Searchable", // uiName
-                null, // sdk url
-                xmlns, // extraAttribute
-                new ElementDescriptor[] { action_key }, // childrenElements
-                false /* mandatory */ );
-        return searchable;
-    }
-
-    /**
-     * Returns the new ElementDescriptor for <appwidget-provider>
-     */
-    private ElementDescriptor createAppWidgetProviderInfo(
-            Map<String, DeclareStyleableInfo> appWidgetStyleMap,
-            XmlnsAttributeDescriptor xmlns) {
-
-        if (appWidgetStyleMap == null) {
-            return null;
-        }
-
-        ElementDescriptor appWidget = createElement(appWidgetStyleMap,
-                "AppWidgetProviderInfo", //$NON-NLS-1$ styleName
-                "appwidget-provider", //$NON-NLS-1$ xmlName
-                "AppWidget Provider", // uiName
-                null, // sdk url
-                xmlns, // extraAttribute
-                null, // childrenElements
-                false /* mandatory */ );
-        return appWidget;
-    }
-
-    /**
-     * Returns a new ElementDescriptor constructed from the information given here
-     * and the javadoc & attributes extracted from the style map if any.
-     */
-    private ElementDescriptor createElement(
-            Map<String, DeclareStyleableInfo> styleMap, String styleName,
-            String xmlName, String uiName, String sdkUrl,
-            AttributeDescriptor extraAttribute,
-            ElementDescriptor[] childrenElements, boolean mandatory) {
-
-        ElementDescriptor element = new ElementDescriptor(xmlName, uiName, null, sdkUrl,
-                null, childrenElements, mandatory);
-
-        return updateElement(element, styleMap, styleName, extraAttribute);
-    }
-
-    /**
-     * Updates an ElementDescriptor with the javadoc & attributes extracted from the style
-     * map if any.
-     */
-    private ElementDescriptor updateElement(ElementDescriptor element,
-            Map<String, DeclareStyleableInfo> styleMap,
-            String styleName,
-            AttributeDescriptor extraAttribute) {
-        ArrayList<AttributeDescriptor> descs = new ArrayList<AttributeDescriptor>();
-
-        DeclareStyleableInfo style = styleMap != null ? styleMap.get(styleName) : null;
-        if (style != null) {
-            DescriptorsUtils.appendAttributes(descs,
-                    null,   // elementName
-                    SdkConstants.NS_RESOURCES,
-                    style.getAttributes(),
-                    null,   // requiredAttributes
-                    null);  // overrides
-            element.setTooltip(style.getJavaDoc());
-        }
-
-        if (extraAttribute != null) {
-            descs.add(extraAttribute);
-        }
-
-        element.setAttributes(descs.toArray(new AttributeDescriptor[descs.size()]));
-        return element;
-    }
-
-    //--------------------------
-    // Creation of <Preferences>
-    //--------------------------
-
-    /**
-     * Returns the new ElementDescriptor for <Preferences>
-     */
-    private ElementDescriptor createPreference(ViewClassInfo[] prefs,
-            ViewClassInfo[] prefGroups, XmlnsAttributeDescriptor xmlns) {
-
-        ArrayList<ElementDescriptor> newPrefs = new ArrayList<ElementDescriptor>();
-        if (prefs != null) {
-            for (ViewClassInfo info : prefs) {
-                ElementDescriptor desc = convertPref(info);
-                newPrefs.add(desc);
-            }
-        }
-
-        ElementDescriptor topPreferences = null;
-
-        ArrayList<ElementDescriptor> newGroups = new ArrayList<ElementDescriptor>();
-        if (prefGroups != null) {
-            for (ViewClassInfo info : prefGroups) {
-                ElementDescriptor desc = convertPref(info);
-                newGroups.add(desc);
-
-                if (info.getFullClassName() == SdkConstants.CLASS_PREFERENCES) {
-                    topPreferences = desc;
-                }
-            }
-        }
-
-        ArrayList<ElementDescriptor> everything = new ArrayList<ElementDescriptor>();
-        everything.addAll(newGroups);
-        everything.addAll(newPrefs);
-        ElementDescriptor[] newArray = everything.toArray(new ElementDescriptor[everything.size()]);
-
-        // Link all groups to everything else here.. recursively
-        for (ElementDescriptor layoutDesc : newGroups) {
-            layoutDesc.setChildren(newArray);
-        }
-
-        // The "top" element to be returned corresponds to the class "Preferences".
-        // Its descriptor has already been created. However the root one also needs
-        // the hidden xmlns:android definition..
-        if (topPreferences != null) {
-            AttributeDescriptor[] attrs = topPreferences.getAttributes();
-            AttributeDescriptor[] newAttrs = new AttributeDescriptor[attrs.length + 1];
-            System.arraycopy(attrs, 0, newAttrs, 0, attrs.length);
-            newAttrs[attrs.length] = xmlns;
-            return new ElementDescriptor(
-                    topPreferences.getXmlName(),
-                    topPreferences.getUiName(),
-                    topPreferences.getTooltip(),
-                    topPreferences.getSdkUrl(),
-                    newAttrs,
-                    topPreferences.getChildren(),
-                    false /* mandatory */);
-        } else {
-            return null;
-        }
-    }
-
-    /**
-     * Creates an element descriptor from a given {@link ViewClassInfo}.
-     */
-    private ElementDescriptor convertPref(ViewClassInfo info) {
-        String xml_name = info.getShortClassName();
-        String tooltip = info.getJavaDoc();
-
-        // Process all Preference attributes
-        ArrayList<AttributeDescriptor> attributes = new ArrayList<AttributeDescriptor>();
-        DescriptorsUtils.appendAttributes(attributes,
-                null,   // elementName
-                SdkConstants.NS_RESOURCES,
-                info.getAttributes(),
-                null,   // requiredAttributes
-                null);  // overrides
-
-        for (ViewClassInfo link = info.getSuperClass();
-                link != null;
-                link = link.getSuperClass()) {
-            AttributeInfo[] attrList = link.getAttributes();
-            if (attrList.length > 0) {
-                attributes.add(new SeparatorAttributeDescriptor(
-                        String.format("Attributes from %1$s", link.getShortClassName())));
-                DescriptorsUtils.appendAttributes(attributes,
-                        null,   // elementName
-                        SdkConstants.NS_RESOURCES,
-                        attrList,
-                        null,   // requiredAttributes
-                        null);  // overrides
-            }
-        }
-
-        return new ViewElementDescriptor(xml_name,
-                xml_name, // ui_name
-                info.getFullClassName(),
-                tooltip,
-                null, // sdk_url
-                attributes.toArray(new AttributeDescriptor[attributes.size()]),
-                null,
-                null, // children
-                false /* mandatory */);
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/ui/EditableDialogCellEditor.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/ui/EditableDialogCellEditor.java
deleted file mode 100644
index baf8a10..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/ui/EditableDialogCellEditor.java
+++ /dev/null
@@ -1,490 +0,0 @@
-/*
- * 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.editors.ui;
-
-import com.android.SdkConstants;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.jface.viewers.DialogCellEditor;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.FocusAdapter;
-import org.eclipse.swt.events.FocusEvent;
-import org.eclipse.swt.events.KeyAdapter;
-import org.eclipse.swt.events.KeyEvent;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.events.MouseAdapter;
-import org.eclipse.swt.events.MouseEvent;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.TraverseEvent;
-import org.eclipse.swt.events.TraverseListener;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Text;
-
-import java.text.MessageFormat;
-
-/**
- * Custom DialogCellEditor, replacing the Label with an editable {@link Text} widget.
- * <p/>Also set the button to {@link SWT#FLAT} to make sure it looks good on MacOS X.
- * <p/>Most of the code comes from TextCellEditor.
- */
-public abstract class EditableDialogCellEditor extends DialogCellEditor {
-
-    private Text text;
-
-    private ModifyListener modifyListener;
-
-    /**
-     * State information for updating action enablement
-     */
-    private boolean isSelection = false;
-
-    private boolean isDeleteable = false;
-
-    private boolean isSelectable = false;
-
-    EditableDialogCellEditor(Composite parent) {
-        super(parent);
-    }
-
-    /*
-     * Re-implement this method only to properly set the style in the button, or it won't look
-     * good in MacOS X
-     */
-    @Override
-    protected Button createButton(Composite parent) {
-        Button result = new Button(parent, SWT.DOWN | SWT.FLAT);
-        result.setText("..."); //$NON-NLS-1$
-        return result;
-    }
-
-
-    @Override
-    protected Control createContents(Composite cell) {
-        text = new Text(cell, SWT.SINGLE);
-        text.addSelectionListener(new SelectionAdapter() {
-            @Override
-            public void widgetDefaultSelected(SelectionEvent e) {
-                handleDefaultSelection(e);
-            }
-        });
-        text.addKeyListener(new KeyAdapter() {
-            // hook key pressed - see PR 14201
-            @Override
-            public void keyPressed(KeyEvent e) {
-                keyReleaseOccured(e);
-
-                // as a result of processing the above call, clients may have
-                // disposed this cell editor
-                if ((getControl() == null) || getControl().isDisposed()) {
-                    return;
-                }
-                checkSelection(); // see explanation below
-                checkDeleteable();
-                checkSelectable();
-            }
-        });
-        text.addTraverseListener(new TraverseListener() {
-            @Override
-            public void keyTraversed(TraverseEvent e) {
-                if (e.detail == SWT.TRAVERSE_ESCAPE
-                        || e.detail == SWT.TRAVERSE_RETURN) {
-                    e.doit = false;
-                }
-            }
-        });
-        // We really want a selection listener but it is not supported so we
-        // use a key listener and a mouse listener to know when selection changes
-        // may have occurred
-        text.addMouseListener(new MouseAdapter() {
-            @Override
-            public void mouseUp(MouseEvent e) {
-                checkSelection();
-                checkDeleteable();
-                checkSelectable();
-            }
-        });
-        text.addFocusListener(new FocusAdapter() {
-            @Override
-            public void focusLost(FocusEvent e) {
-                EditableDialogCellEditor.this.focusLost();
-            }
-        });
-        text.setFont(cell.getFont());
-        text.setBackground(cell.getBackground());
-        text.setText("");//$NON-NLS-1$
-        text.addModifyListener(getModifyListener());
-        return text;
-    }
-
-   /**
-     * Checks to see if the "deletable" state (can delete/
-     * nothing to delete) has changed and if so fire an
-     * enablement changed notification.
-     */
-    private void checkDeleteable() {
-        boolean oldIsDeleteable = isDeleteable;
-        isDeleteable = isDeleteEnabled();
-        if (oldIsDeleteable != isDeleteable) {
-            fireEnablementChanged(DELETE);
-        }
-    }
-
-    /**
-     * Checks to see if the "selectable" state (can select)
-     * has changed and if so fire an enablement changed notification.
-     */
-    private void checkSelectable() {
-        boolean oldIsSelectable = isSelectable;
-        isSelectable = isSelectAllEnabled();
-        if (oldIsSelectable != isSelectable) {
-            fireEnablementChanged(SELECT_ALL);
-        }
-    }
-
-    /**
-     * Checks to see if the selection state (selection /
-     * no selection) has changed and if so fire an
-     * enablement changed notification.
-     */
-    private void checkSelection() {
-        boolean oldIsSelection = isSelection;
-        isSelection = text.getSelectionCount() > 0;
-        if (oldIsSelection != isSelection) {
-            fireEnablementChanged(COPY);
-            fireEnablementChanged(CUT);
-        }
-    }
-
-    /* (non-Javadoc)
-     * Method declared on CellEditor.
-     */
-    @Override
-    protected void doSetFocus() {
-        if (text != null) {
-            text.selectAll();
-            text.setFocus();
-            checkSelection();
-            checkDeleteable();
-            checkSelectable();
-        }
-    }
-
-    /*
-     * (non-Javadoc)
-     * @see org.eclipse.jface.viewers.DialogCellEditor#updateContents(java.lang.Object)
-     */
-    @Override
-    protected void updateContents(Object value) {
-        Assert.isTrue(text != null && (value == null || (value instanceof String)));
-        if (value != null) {
-            text.removeModifyListener(getModifyListener());
-            text.setText((String) value);
-            text.addModifyListener(getModifyListener());
-        }
-    }
-
-    /**
-     * The <code>TextCellEditor</code> implementation of
-     * this <code>CellEditor</code> framework method returns
-     * the text string.
-     *
-     * @return the text string
-     */
-    @Override
-    protected Object doGetValue() {
-        return text.getText();
-    }
-
-
-    /**
-     * Processes a modify event that occurred in this text cell editor.
-     * This framework method performs validation and sets the error message
-     * accordingly, and then reports a change via <code>fireEditorValueChanged</code>.
-     * Subclasses should call this method at appropriate times. Subclasses
-     * may extend or reimplement.
-     *
-     * @param e the SWT modify event
-     */
-    protected void editOccured(ModifyEvent e) {
-        String value = text.getText();
-        if (value == null) {
-            value = "";//$NON-NLS-1$
-        }
-        Object typedValue = value;
-        boolean oldValidState = isValueValid();
-        boolean newValidState = isCorrect(typedValue);
-
-        if (!newValidState) {
-            // try to insert the current value into the error message.
-            setErrorMessage(MessageFormat.format(getErrorMessage(),
-                    new Object[] { value }));
-        }
-        valueChanged(oldValidState, newValidState);
-    }
-
-    /**
-     * Return the modify listener.
-     */
-    private ModifyListener getModifyListener() {
-        if (modifyListener == null) {
-            modifyListener = new ModifyListener() {
-                @Override
-                public void modifyText(ModifyEvent e) {
-                    editOccured(e);
-                }
-            };
-        }
-        return modifyListener;
-    }
-
-    /**
-     * Handles a default selection event from the text control by applying the editor
-     * value and deactivating this cell editor.
-     *
-     * @param event the selection event
-     *
-     * @since 3.0
-     */
-    protected void handleDefaultSelection(SelectionEvent event) {
-        // same with enter-key handling code in keyReleaseOccured(e);
-        fireApplyEditorValue();
-        deactivate();
-    }
-
-    /**
-     * The <code>TextCellEditor</code>  implementation of this
-     * <code>CellEditor</code> method returns <code>true</code> if
-     * the current selection is not empty.
-     */
-    @Override
-    public boolean isCopyEnabled() {
-        if (text == null || text.isDisposed()) {
-            return false;
-        }
-        return text.getSelectionCount() > 0;
-    }
-
-    /**
-     * The <code>TextCellEditor</code>  implementation of this
-     * <code>CellEditor</code> method returns <code>true</code> if
-     * the current selection is not empty.
-     */
-    @Override
-    public boolean isCutEnabled() {
-        if (text == null || text.isDisposed()) {
-            return false;
-        }
-        return text.getSelectionCount() > 0;
-    }
-
-    /**
-     * The <code>TextCellEditor</code>  implementation of this
-     * <code>CellEditor</code> method returns <code>true</code>
-     * if there is a selection or if the caret is not positioned
-     * at the end of the text.
-     */
-    @Override
-    public boolean isDeleteEnabled() {
-        if (text == null || text.isDisposed()) {
-            return false;
-        }
-        return text.getSelectionCount() > 0
-                || text.getCaretPosition() < text.getCharCount();
-    }
-
-    /**
-     * The <code>TextCellEditor</code>  implementation of this
-     * <code>CellEditor</code> method always returns <code>true</code>.
-     */
-    @Override
-    public boolean isPasteEnabled() {
-        if (text == null || text.isDisposed()) {
-            return false;
-        }
-        return true;
-    }
-
-    /**
-     * Check if save all is enabled
-     * @return true if it is
-     */
-    public boolean isSaveAllEnabled() {
-        if (text == null || text.isDisposed()) {
-            return false;
-        }
-        return true;
-    }
-
-    /**
-     * Returns <code>true</code> if this cell editor is
-     * able to perform the select all action.
-     * <p>
-     * This default implementation always returns
-     * <code>false</code>.
-     * </p>
-     * <p>
-     * Subclasses may override
-     * </p>
-     * @return <code>true</code> if select all is possible,
-     *  <code>false</code> otherwise
-     */
-    @Override
-    public boolean isSelectAllEnabled() {
-        if (text == null || text.isDisposed()) {
-            return false;
-        }
-        return text.getCharCount() > 0;
-    }
-
-    /**
-     * Processes a key release event that occurred in this cell editor.
-     * <p>
-     * The <code>TextCellEditor</code> implementation of this framework method
-     * ignores when the RETURN key is pressed since this is handled in
-     * <code>handleDefaultSelection</code>.
-     * An exception is made for Ctrl+Enter for multi-line texts, since
-     * a default selection event is not sent in this case.
-     * </p>
-     *
-     * @param keyEvent the key event
-     */
-    @Override
-    protected void keyReleaseOccured(KeyEvent keyEvent) {
-        if (keyEvent.character == '\r') { // Return key
-            // Enter is handled in handleDefaultSelection.
-            // Do not apply the editor value in response to an Enter key event
-            // since this can be received from the IME when the intent is -not-
-            // to apply the value.
-            // See bug 39074 [CellEditors] [DBCS] canna input mode fires bogus event from Text Control
-            //
-            // An exception is made for Ctrl+Enter for multi-line texts, since
-            // a default selection event is not sent in this case.
-            if (text != null && !text.isDisposed()
-                    && (text.getStyle() & SWT.MULTI) != 0) {
-                if ((keyEvent.stateMask & SWT.CTRL) != 0) {
-                    super.keyReleaseOccured(keyEvent);
-                }
-            }
-            return;
-        }
-        super.keyReleaseOccured(keyEvent);
-    }
-
-    /**
-     * The <code>TextCellEditor</code> implementation of this
-     * <code>CellEditor</code> method copies the
-     * current selection to the clipboard.
-     */
-    @Override
-    public void performCopy() {
-        text.copy();
-    }
-
-    /**
-     * The <code>TextCellEditor</code> implementation of this
-     * <code>CellEditor</code> method cuts the
-     * current selection to the clipboard.
-     */
-    @Override
-    public void performCut() {
-        text.cut();
-        checkSelection();
-        checkDeleteable();
-        checkSelectable();
-    }
-
-    /**
-     * The <code>TextCellEditor</code> implementation of this
-     * <code>CellEditor</code> method deletes the
-     * current selection or, if there is no selection,
-     * the character next character from the current position.
-     */
-    @Override
-    public void performDelete() {
-        if (text.getSelectionCount() > 0) {
-            // remove the contents of the current selection
-            text.insert(""); //$NON-NLS-1$
-        } else {
-            // remove the next character
-            int pos = text.getCaretPosition();
-            if (pos < text.getCharCount()) {
-                text.setSelection(pos, pos + 1);
-                text.insert(""); //$NON-NLS-1$
-            }
-        }
-        checkSelection();
-        checkDeleteable();
-        checkSelectable();
-    }
-
-    /**
-     * The <code>TextCellEditor</code> implementation of this
-     * <code>CellEditor</code> method pastes the
-     * the clipboard contents over the current selection.
-     */
-    @Override
-    public void performPaste() {
-        text.paste();
-        checkSelection();
-        checkDeleteable();
-        checkSelectable();
-    }
-
-    /**
-     * The <code>TextCellEditor</code> implementation of this
-     * <code>CellEditor</code> method selects all of the
-     * current text.
-     */
-    @Override
-    public void performSelectAll() {
-        text.selectAll();
-        checkSelection();
-        checkDeleteable();
-    }
-
-    @Override
-    protected void focusLost() {
-        if (SdkConstants.currentPlatform() == SdkConstants.PLATFORM_LINUX) {
-            // On Linux, something about the order of focus event delivery prevents the
-            // callback on the "..." button to be invoked, which means the
-            // customizer dialog never shows up (see issue #18348).
-            // (Note that simply trying to Display.asyncRun() the super.focusLost()
-            // method does not work.)
-            //
-            // We can work around this by not deactivating on a focus loss.
-            // This means that in some cases the cell editor will still be
-            // shown in the property sheet, but I've tested that the values
-            // are all committed as before. This is better than having a non-operational
-            // customizer, but since this issue only happens on Linux the workaround
-            // is only done on Linux such that on other platforms we deactivate
-            // immediately on focus loss.
-            //
-            if (isActivated()) {
-                fireApplyEditorValue();
-                // super.focusLost calls the following which we're deliberately
-                // suppressing here:
-                //    deactivate();
-            }
-        } else {
-            super.focusLost();
-        }
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/ui/ErrorImageComposite.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/ui/ErrorImageComposite.java
deleted file mode 100644
index 7085e5d..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/ui/ErrorImageComposite.java
+++ /dev/null
@@ -1,72 +0,0 @@
-package com.android.ide.eclipse.adt.internal.editors.ui;
-
-import static org.eclipse.ui.ISharedImages.IMG_DEC_FIELD_ERROR;
-import static org.eclipse.ui.ISharedImages.IMG_DEC_FIELD_WARNING;
-import static org.eclipse.ui.ISharedImages.IMG_OBJS_ERROR_TSK;
-import static org.eclipse.ui.ISharedImages.IMG_OBJS_WARN_TSK;
-
-import org.eclipse.jface.resource.CompositeImageDescriptor;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.viewers.DecorationOverlayIcon;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.graphics.ImageData;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.ui.ISharedImages;
-import org.eclipse.ui.PlatformUI;
-
-/**
- * ImageDescriptor that adds a error marker.
- * Based on {@link DecorationOverlayIcon} only available in Eclipse 3.3
- */
-public class ErrorImageComposite extends CompositeImageDescriptor {
-
-    private Image mBaseImage;
-    private ImageDescriptor mErrorImageDescriptor;
-    private Point mSize;
-
-    /**
-     * Creates a new {@link ErrorImageComposite}
-     *
-     * @param baseImage the base image to overlay an icon on top of
-     */
-    public ErrorImageComposite(Image baseImage) {
-        this(baseImage, false);
-    }
-
-    /**
-     * Creates a new {@link ErrorImageComposite}
-     *
-     * @param baseImage the base image to overlay an icon on top of
-     * @param warning if true, add a warning icon, otherwise an error icon
-     */
-    public ErrorImageComposite(Image baseImage, boolean warning) {
-        mBaseImage = baseImage;
-        ISharedImages sharedImages = PlatformUI.getWorkbench().getSharedImages();
-        mErrorImageDescriptor = sharedImages.getImageDescriptor(
-                warning ? IMG_DEC_FIELD_WARNING : IMG_DEC_FIELD_ERROR);
-        if (mErrorImageDescriptor == null) {
-            mErrorImageDescriptor = sharedImages.getImageDescriptor(
-                    warning ? IMG_OBJS_WARN_TSK : IMG_OBJS_ERROR_TSK);
-        }
-        mSize = new Point(baseImage.getBounds().width, baseImage.getBounds().height);
-    }
-
-    @Override
-    protected void drawCompositeImage(int width, int height) {
-        ImageData baseData = mBaseImage.getImageData();
-        drawImage(baseData, 0, 0);
-
-        ImageData overlayData = mErrorImageDescriptor.getImageData();
-        if (overlayData.width == baseData.width && overlayData.height == baseData.height) {
-            overlayData = overlayData.scaledTo(14, 14);
-            drawImage(overlayData, -3, mSize.y - overlayData.height + 3);
-        } else {
-            drawImage(overlayData, 0, mSize.y - overlayData.height);
-        }
-    }
-
-    @Override
-    protected Point getSize() {
-        return mSize;
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/ui/FlagValueCellEditor.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/ui/FlagValueCellEditor.java
deleted file mode 100644
index 2a1bc36..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/ui/FlagValueCellEditor.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * 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.editors.ui;
-
-import com.android.ide.eclipse.adt.internal.editors.uimodel.UiFlagAttributeNode;
-
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-
-/**
- * DialogCellEditor able to receive a {@link UiFlagAttributeNode} in the {@link #setValue(Object)}
- * method.
- * <p/>The dialog box opened is the same as the one in the ui created by
- * {@link UiFlagAttributeNode#createUiControl(Composite, org.eclipse.ui.forms.IManagedForm)}
- */
-public class FlagValueCellEditor extends EditableDialogCellEditor {
-    
-    private UiFlagAttributeNode mUiFlagAttribute;
-
-    public FlagValueCellEditor(Composite parent) {
-        super(parent);
-    }
-    
-    @Override
-    protected Object openDialogBox(Control cellEditorWindow) {
-        if (mUiFlagAttribute != null) {
-            String currentValue = (String)getValue();
-            return mUiFlagAttribute.showDialog(cellEditorWindow.getShell(), currentValue);
-        }
-        
-        return null;
-    }
-    
-    @Override
-    protected void doSetValue(Object value) {
-        if (value instanceof UiFlagAttributeNode) {
-            mUiFlagAttribute = (UiFlagAttributeNode)value;
-            super.doSetValue(mUiFlagAttribute.getCurrentValue());
-            return;
-        }
-        
-        super.doSetValue(value);
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/ui/ListValueCellEditor.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/ui/ListValueCellEditor.java
deleted file mode 100644
index 0c780a8..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/ui/ListValueCellEditor.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- * 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.editors.ui;
-
-import com.android.ide.eclipse.adt.internal.editors.uimodel.UiListAttributeNode;
-
-import org.eclipse.jface.viewers.ComboBoxCellEditor;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.CCombo;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-
-/**
- * ComboBoxCellEditor able to receive a {@link UiListAttributeNode} in the {@link #setValue(Object)}
- * method, and returning a {@link String} in {@link #getValue()} instead of an {@link Integer}.
- */
-public class ListValueCellEditor extends ComboBoxCellEditor {
-    private String[] mItems;
-    private CCombo mCombo;
-    
-    public ListValueCellEditor(Composite parent) {
-        super(parent, new String[0], SWT.DROP_DOWN);
-    }
-    
-    @Override
-    protected Control createControl(Composite parent) {
-        mCombo = (CCombo) super.createControl(parent);
-        return mCombo;
-    }
-    
-    @Override
-    protected void doSetValue(Object value) {
-        if (value instanceof UiListAttributeNode) {
-            UiListAttributeNode uiListAttribute = (UiListAttributeNode)value;
-            
-            // set the possible values in the combo
-            String[] items = uiListAttribute.getPossibleValues(null);
-            mItems = new String[items.length];
-            System.arraycopy(items, 0, mItems, 0, items.length);
-            setItems(mItems);
-            
-            // now edit the current value of the attribute
-            String attrValue = uiListAttribute.getCurrentValue();
-            mCombo.setText(attrValue);
-            
-            return;
-        }
-        
-        // default behavior
-        super.doSetValue(value);
-    }
-    
-    @Override
-    protected Object doGetValue() {
-        String comboText = mCombo.getText();
-        if (comboText == null) {
-            return ""; //$NON-NLS-1$
-        }
-        return comboText;
-    }
-
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/ui/ResourceValueCellEditor.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/ui/ResourceValueCellEditor.java
deleted file mode 100644
index 8efe294..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/ui/ResourceValueCellEditor.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * 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.editors.ui;
-
-import com.android.ide.eclipse.adt.internal.editors.uimodel.UiFlagAttributeNode;
-import com.android.ide.eclipse.adt.internal.editors.uimodel.UiResourceAttributeNode;
-
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-
-/**
- * DialogCellEditor able to receive a {@link UiFlagAttributeNode} in the {@link #setValue(Object)}
- * method.
- * <p/>The dialog box opened is the same as the one in the ui created by
- * {@link UiFlagAttributeNode#createUiControl(Composite, org.eclipse.ui.forms.IManagedForm)}
- */
-public class ResourceValueCellEditor extends EditableDialogCellEditor {
-
-    private UiResourceAttributeNode mUiResourceAttribute;
-
-    public ResourceValueCellEditor(Composite parent) {
-        super(parent);
-    }
-
-    @Override
-    protected Object openDialogBox(Control cellEditorWindow) {
-        if (mUiResourceAttribute != null) {
-            String currentValue = (String)getValue();
-            return mUiResourceAttribute.showDialog(cellEditorWindow.getShell(), currentValue);
-        }
-        
-        return null;
-    }
-    
-    @Override
-    protected void doSetValue(Object value) {
-        if (value instanceof UiResourceAttributeNode) {
-            mUiResourceAttribute = (UiResourceAttributeNode)value;
-            super.doSetValue(mUiResourceAttribute.getCurrentValue());
-            return;
-        }
-        
-        super.doSetValue(value);
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/ui/SectionHelper.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/ui/SectionHelper.java
deleted file mode 100644
index fdb5d82..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/ui/SectionHelper.java
+++ /dev/null
@@ -1,364 +0,0 @@
-/*
- * Copyright (C) 2007 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.editors.ui;
-
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.ide.eclipse.adt.internal.editors.AndroidXmlEditor;
-
-import org.eclipse.jface.text.DefaultInformationControl;
-import org.eclipse.swt.events.DisposeEvent;
-import org.eclipse.swt.events.DisposeListener;
-import org.eclipse.swt.events.MouseEvent;
-import org.eclipse.swt.events.MouseTrackListener;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.ui.forms.SectionPart;
-import org.eclipse.ui.forms.widgets.FormText;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-import org.eclipse.ui.forms.widgets.Section;
-import org.eclipse.ui.forms.widgets.TableWrapData;
-import org.eclipse.ui.forms.widgets.TableWrapLayout;
-
-import java.lang.reflect.Method;
-
-/**
- * Helper for the AndroidManifest form editor.
- *
- * Helps create a new SectionPart with sensible default parameters,
- * create default layout or add typical widgets.
- *
- * IMPORTANT: This is NOT a generic class. It makes a lot of assumptions on the
- * UI as used by the form editor for the AndroidManifest.
- *
- * TODO: Consider moving to a common package.
- */
-public final class SectionHelper {
-
-    /**
-     * Utility class that derives from SectionPart, constructs the Section with
-     * sensible defaults (with a title and a description) and provide some shorthand
-     * methods for creating typically UI (label and text, form text.)
-     */
-    static public class ManifestSectionPart extends SectionPart {
-
-        /**
-         * Construct a SectionPart that uses a title bar and a description.
-         * It's up to the caller to call setText() and setDescription().
-         * <p/>
-         * The section style includes a description and a title bar by default.
-         *
-         * @param body The parent (e.g. FormPage body)
-         * @param toolkit Form Toolkit
-         */
-        public ManifestSectionPart(Composite body, FormToolkit toolkit) {
-            this(body, toolkit, 0, false);
-        }
-
-        /**
-         * Construct a SectionPart that uses a title bar and a description.
-         * It's up to the caller to call setText() and setDescription().
-         * <p/>
-         * The section style includes a description and a title bar by default.
-         * You can add extra styles, like Section.TWISTIE.
-         *
-         * @param body The parent (e.g. FormPage body).
-         * @param toolkit Form Toolkit.
-         * @param extra_style Extra styles (on top of description and title bar).
-         * @param use_description True if the Section.DESCRIPTION style should be added.
-         */
-        public ManifestSectionPart(Composite body, FormToolkit toolkit,
-                int extra_style, boolean use_description) {
-            super(body, toolkit, extra_style |
-                    Section.TITLE_BAR |
-                    (use_description ? Section.DESCRIPTION : 0));
-        }
-
-        // Create non-static methods of helpers just for convenience
-
-        /**
-         * Creates a new composite with a TableWrapLayout set with a given number of columns.
-         *
-         * If the parent composite is a Section, the new composite is set as a client.
-         *
-         * @param toolkit Form Toolkit
-         * @param numColumns Desired number of columns.
-         * @return The new composite.
-         */
-        public Composite createTableLayout(FormToolkit toolkit, int numColumns) {
-            return SectionHelper.createTableLayout(getSection(), toolkit, numColumns);
-        }
-
-        /**
-         * Creates a label widget.
-         * If the parent layout if a TableWrapLayout, maximize it to span over all columns.
-         *
-         * @param parent The parent (e.g. composite from CreateTableLayout())
-         * @param toolkit Form Toolkit
-         * @param label The string for the label.
-         * @param tooltip An optional tooltip for the label and text. Can be null.
-         * @return The new created label
-         */
-        public Label createLabel(Composite parent, FormToolkit toolkit, String label,
-                String tooltip) {
-            return SectionHelper.createLabel(parent, toolkit, label, tooltip);
-        }
-
-        /**
-         * Creates two widgets: a label and a text field.
-         *
-         * This expects the parent composite to have a TableWrapLayout with 2 columns.
-         *
-         * @param parent The parent (e.g. composite from CreateTableLayout())
-         * @param toolkit Form Toolkit
-         * @param label The string for the label.
-         * @param value The initial value of the text field. Can be null.
-         * @param tooltip An optional tooltip for the label and text. Can be null.
-         * @return The new created Text field (the label is not returned)
-         */
-        public Text createLabelAndText(Composite parent, FormToolkit toolkit, String label,
-                String value, String tooltip) {
-            return SectionHelper.createLabelAndText(parent, toolkit, label, value, tooltip);
-        }
-
-        /**
-         * Creates a FormText widget.
-         *
-         * This expects the parent composite to have a TableWrapLayout with 2 columns.
-         *
-         * @param parent The parent (e.g. composite from CreateTableLayout())
-         * @param toolkit Form Toolkit
-         * @param isHtml True if the form text will contain HTML that must be interpreted as
-         *               rich text (i.e. parse tags & expand URLs).
-         * @param label The string for the label.
-         * @param setupLayoutData indicates whether the created form text receives a TableWrapData
-         * through the setLayoutData method. In some case, creating it will make the table parent
-         * huge, which we don't want.
-         * @return The new created FormText.
-         */
-        public FormText createFormText(Composite parent, FormToolkit toolkit, boolean isHtml,
-                String label, boolean setupLayoutData) {
-            return SectionHelper.createFormText(parent, toolkit, isHtml, label, setupLayoutData);
-        }
-
-        /**
-         * Forces the section to recompute its layout and redraw.
-         * This is needed after the content of the section has been changed at runtime.
-         */
-        public void layoutChanged() {
-            Section section = getSection();
-
-            // Calls getSection().reflow(), which is the same that Section calls
-            // when the expandable state is changed and the height changes.
-            // Since this is protected, some reflection is needed to invoke it.
-            try {
-                Method reflow;
-                reflow = section.getClass().getDeclaredMethod("reflow", (Class<?>[])null);
-                reflow.setAccessible(true);
-                reflow.invoke(section);
-            } catch (Exception e) {
-                AdtPlugin.log(e, "Error when invoking Section.reflow");
-            }
-
-            section.layout(true /* changed */, true /* all */);
-        }
-    }
-
-    /**
-     * Creates a new composite with a TableWrapLayout set with a given number of columns.
-     *
-     * If the parent composite is a Section, the new composite is set as a client.
-     *
-     * @param composite The parent (e.g. a Section or SectionPart)
-     * @param toolkit Form Toolkit
-     * @param numColumns Desired number of columns.
-     * @return The new composite.
-     */
-    static public Composite createTableLayout(Composite composite, FormToolkit toolkit,
-            int numColumns) {
-        Composite table = toolkit.createComposite(composite);
-        TableWrapLayout layout = new TableWrapLayout();
-        layout.numColumns = numColumns;
-        table.setLayout(layout);
-        toolkit.paintBordersFor(table);
-        if (composite instanceof Section) {
-            ((Section) composite).setClient(table);
-        }
-        return table;
-    }
-
-    /**
-     * Creates a new composite with a GridLayout set with a given number of columns.
-     *
-     * If the parent composite is a Section, the new composite is set as a client.
-     *
-     * @param composite The parent (e.g. a Section or SectionPart)
-     * @param toolkit Form Toolkit
-     * @param numColumns Desired number of columns.
-     * @return The new composite.
-     */
-    static public Composite createGridLayout(Composite composite, FormToolkit toolkit,
-            int numColumns) {
-        Composite grid = toolkit.createComposite(composite);
-        GridLayout layout = new GridLayout();
-        layout.numColumns = numColumns;
-        grid.setLayout(layout);
-        toolkit.paintBordersFor(grid);
-        if (composite instanceof Section) {
-            ((Section) composite).setClient(grid);
-        }
-        return grid;
-    }
-
-    /**
-     * Creates two widgets: a label and a text field.
-     *
-     * This expects the parent composite to have a TableWrapLayout with 2 columns.
-     *
-     * @param parent The parent (e.g. composite from CreateTableLayout())
-     * @param toolkit Form Toolkit
-     * @param label_text The string for the label.
-     * @param value The initial value of the text field. Can be null.
-     * @param tooltip An optional tooltip for the label and text. Can be null.
-     * @return The new created Text field (the label is not returned)
-     */
-    static public Text createLabelAndText(Composite parent, FormToolkit toolkit, String label_text,
-            String value, String tooltip) {
-        Label label = toolkit.createLabel(parent, label_text);
-        label.setLayoutData(new TableWrapData(TableWrapData.LEFT, TableWrapData.MIDDLE));
-        Text text = toolkit.createText(parent, value);
-        text.setLayoutData(new TableWrapData(TableWrapData.FILL_GRAB, TableWrapData.MIDDLE));
-
-        addControlTooltip(label, tooltip);
-        return text;
-    }
-
-    /**
-     * Creates a label widget.
-     * If the parent layout if a TableWrapLayout, maximize it to span over all columns.
-     *
-     * @param parent The parent (e.g. composite from CreateTableLayout())
-     * @param toolkit Form Toolkit
-     * @param label_text The string for the label.
-     * @param tooltip An optional tooltip for the label and text. Can be null.
-     * @return The new created label
-     */
-    static public Label createLabel(Composite parent, FormToolkit toolkit, String label_text,
-            String tooltip) {
-        Label label = toolkit.createLabel(parent, label_text);
-
-        TableWrapData twd = new TableWrapData(TableWrapData.FILL_GRAB);
-        if (parent.getLayout() instanceof TableWrapLayout) {
-            twd.colspan = ((TableWrapLayout) parent.getLayout()).numColumns;
-        }
-        label.setLayoutData(twd);
-
-        addControlTooltip(label, tooltip);
-        return label;
-    }
-
-    /**
-     * Associates a tooltip with a control.
-     *
-     * This mirrors the behavior from org.eclipse.pde.internal.ui.editor.text.PDETextHover
-     *
-     * @param control The control to which associate the tooltip.
-     * @param tooltip The tooltip string. Can use \n for multi-lines. Will not display if null.
-     */
-    static public void addControlTooltip(final Control control, String tooltip) {
-        if (control == null || tooltip == null || tooltip.length() == 0) {
-            return;
-        }
-
-        // Some kinds of controls already properly implement tooltip display.
-        if (control instanceof Button) {
-            control.setToolTipText(tooltip);
-            return;
-        }
-
-        control.setToolTipText(null);
-
-        final DefaultInformationControl ic = new DefaultInformationControl(control.getShell());
-        ic.setInformation(tooltip);
-        Point sz = ic.computeSizeHint();
-        ic.setSize(sz.x, sz.y);
-        ic.setVisible(false); // initially hidden
-
-        control.addMouseTrackListener(new MouseTrackListener() {
-            @Override
-            public void mouseEnter(MouseEvent e) {
-            }
-
-            @Override
-            public void mouseExit(MouseEvent e) {
-                ic.setVisible(false);
-            }
-
-            @Override
-            public void mouseHover(MouseEvent e) {
-                ic.setLocation(control.toDisplay(10, 25));  // same offset as in PDETextHover
-                ic.setVisible(true);
-            }
-        });
-        control.addDisposeListener(new DisposeListener() {
-            @Override
-            public void widgetDisposed(DisposeEvent e) {
-                ic.dispose();
-            }
-        });
-    }
-
-    /**
-     * Creates a FormText widget.
-     *
-     * This expects the parent composite to have a TableWrapLayout with 2 columns.
-     *
-     * @param parent The parent (e.g. composite from CreateTableLayout())
-     * @param toolkit Form Toolkit
-     * @param isHtml True if the form text will contain HTML that must be interpreted as
-     *               rich text (i.e. parse tags & expand URLs).
-     * @param label The string for the label.
-     * @param setupLayoutData indicates whether the created form text receives a TableWrapData
-     * through the setLayoutData method. In some case, creating it will make the table parent
-     * huge, which we don't want.
-     * @return The new created FormText.
-     */
-    static public FormText createFormText(Composite parent, FormToolkit toolkit,
-            boolean isHtml, String label, boolean setupLayoutData) {
-        FormText text = toolkit.createFormText(parent, true /* track focus */);
-        if (setupLayoutData) {
-            TableWrapData twd = new TableWrapData(TableWrapData.FILL_GRAB);
-            twd.maxWidth = AndroidXmlEditor.TEXT_WIDTH_HINT;
-            if (parent.getLayout() instanceof TableWrapLayout) {
-                twd.colspan = ((TableWrapLayout) parent.getLayout()).numColumns;
-            }
-            text.setLayoutData(twd);
-        }
-        text.setWhitespaceNormalized(true);
-        if (isHtml && !label.startsWith("<form>")) {          //$NON-NLS-1$
-            // This assertion is violated, for example by the Class attribute for an activity
-            //assert label.startsWith("<form>") : "HTML for FormText must be wrapped in <form>...</form>"; //$NON-NLS-1$
-            label = "<form>" + label + "</form>";   //$NON-NLS-1$ //$NON-NLS-2$
-        }
-        text.setText(label, isHtml /* parseTags */, isHtml /* expandURLs */);
-        return text;
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/ui/TextValueCellEditor.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/ui/TextValueCellEditor.java
deleted file mode 100644
index 3750c34..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/ui/TextValueCellEditor.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * 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.editors.ui;
-
-import com.android.ide.eclipse.adt.internal.editors.uimodel.UiAttributeNode;
-
-import org.eclipse.jface.viewers.TextCellEditor;
-import org.eclipse.swt.widgets.Composite;
-
-/**
- * TextCellEditor able to receive a {@link UiAttributeNode} in the {@link #setValue(Object)}
- * method.
- */
-public class TextValueCellEditor extends TextCellEditor {
-    
-    public TextValueCellEditor(Composite parent) {
-        super(parent);
-    }
-
-    @Override
-    protected void doSetValue(Object value) {
-        if (value instanceof UiAttributeNode) {
-            super.doSetValue(((UiAttributeNode)value).getCurrentValue());
-            return;
-        }
-        
-        super.doSetValue(value);
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/ui/UiElementPart.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/ui/UiElementPart.java
deleted file mode 100644
index db9fa06..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/ui/UiElementPart.java
+++ /dev/null
@@ -1,284 +0,0 @@
-/*
- * Copyright (C) 2007 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.editors.ui;
-
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.ide.eclipse.adt.internal.editors.descriptors.AttributeDescriptor;
-import com.android.ide.eclipse.adt.internal.editors.descriptors.XmlnsAttributeDescriptor;
-import com.android.ide.eclipse.adt.internal.editors.manifest.ManifestEditor;
-import com.android.ide.eclipse.adt.internal.editors.ui.SectionHelper.ManifestSectionPart;
-import com.android.ide.eclipse.adt.internal.editors.uimodel.UiAttributeNode;
-import com.android.ide.eclipse.adt.internal.editors.uimodel.UiElementNode;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.ui.forms.IManagedForm;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-import org.eclipse.ui.forms.widgets.Section;
-
-/**
- * Generic page's section part that displays all attributes of a given {@link UiElementNode}.
- * <p/>
- * This part is designed to be displayed in a page that has a table column layout.
- * It is linked to a specific {@link UiElementNode} and automatically displays all of its
- * attributes, manages its dirty state and commits the attributes when necessary.
- * <p/>
- * No derivation is needed unless the UI or workflow needs to be extended.
- */
-public class UiElementPart extends ManifestSectionPart {
-
-    /** A reference to the container editor */
-    private ManifestEditor mEditor;
-    /** The {@link UiElementNode} manipulated by this SectionPart. It can be null. */
-    private UiElementNode mUiElementNode;
-    /** Table that contains all the attributes */
-    private Composite mTable;
-
-    public UiElementPart(Composite body, FormToolkit toolkit, ManifestEditor editor,
-            UiElementNode uiElementNode, String sectionTitle, String sectionDescription,
-            int extra_style) {
-        super(body, toolkit, extra_style, sectionDescription != null);
-        mEditor = editor;
-        mUiElementNode = uiElementNode;
-        setupSection(sectionTitle, sectionDescription);
-
-        if (uiElementNode == null) {
-            // This is serious and should never happen. Instead of crashing, simply abort.
-            // There will be no UI, which will prevent further damage.
-            AdtPlugin.log(IStatus.ERROR, "Missing node to edit!"); //$NON-NLS-1$
-            return;
-        }
-    }
-
-    /**
-     * Returns the Editor associated with this part.
-     */
-    public ManifestEditor getEditor() {
-        return mEditor;
-    }
-
-    /**
-     * Returns the {@link UiElementNode} associated with this part.
-     */
-    public UiElementNode getUiElementNode() {
-        return mUiElementNode;
-    }
-
-    /**
-     * Changes the element node handled by this part.
-     *
-     * @param uiElementNode The new element node for the part.
-     */
-    public void setUiElementNode(UiElementNode uiElementNode) {
-        mUiElementNode = uiElementNode;
-    }
-
-    /**
-     * Initializes the form part.
-     * <p/>
-     * This is called by the owning managed form as soon as the part is added to the form,
-     * which happens right after the part is actually created.
-     */
-    @Override
-    public void initialize(IManagedForm form) {
-        super.initialize(form);
-        createFormControls(form);
-    }
-
-    /**
-     * Setup the section that contains this part.
-     * <p/>
-     * This is called by the constructor to set the section's title and description
-     * with parameters given in the constructor.
-     * <br/>
-     * Derived class override this if needed, however in most cases the default
-     * implementation should be enough.
-     *
-     * @param sectionTitle The section part's title
-     * @param sectionDescription The section part's description
-     */
-    protected void setupSection(String sectionTitle, String sectionDescription) {
-        Section section = getSection();
-        section.setText(sectionTitle);
-        section.setDescription(sectionDescription);
-    }
-
-    /**
-     * Create the controls to edit the attributes for the given ElementDescriptor.
-     * <p/>
-     * This MUST not be called by the constructor. Instead it must be called from
-     * <code>initialize</code> (i.e. right after the form part is added to the managed form.)
-     * <p/>
-     * Derived classes can override this if necessary.
-     *
-     * @param managedForm The owner managed form
-     */
-    protected void createFormControls(IManagedForm managedForm) {
-        setTable(createTableLayout(managedForm.getToolkit(), 2 /* numColumns */));
-
-        createUiAttributes(managedForm);
-    }
-
-    /**
-     * Sets the table where the attribute UI needs to be created.
-     */
-    protected void setTable(Composite table) {
-        mTable = table;
-    }
-
-    /**
-     * Returns the table where the attribute UI needs to be created.
-     */
-    protected Composite getTable() {
-        return mTable;
-    }
-
-    /**
-     * Add all the attribute UI widgets into the underlying table layout.
-     *
-     * @param managedForm The owner managed form
-     */
-    protected void createUiAttributes(IManagedForm managedForm) {
-        Composite table = getTable();
-        if (table == null || managedForm == null) {
-            return;
-        }
-
-        // Remove any old UI controls
-        for (Control c : table.getChildren()) {
-            c.dispose();
-        }
-
-        fillTable(table, managedForm);
-
-        // Tell the section that the layout has changed.
-        layoutChanged();
-    }
-
-    /**
-     * Actually fills the table.
-     * This is called by {@link #createUiAttributes(IManagedForm)} to populate the new
-     * table. The default implementation is to use
-     * {@link #insertUiAttributes(UiElementNode, Composite, IManagedForm)} to actually
-     * place the attributes of the default {@link UiElementNode} in the table.
-     * <p/>
-     * Derived classes can override this to add controls in the table before or after.
-     *
-     * @param table The table to fill. It must have 2 columns.
-     * @param managedForm The managed form for new controls.
-     */
-    protected void fillTable(Composite table, IManagedForm managedForm) {
-        int inserted = insertUiAttributes(mUiElementNode, table, managedForm);
-
-        if (inserted == 0) {
-            createLabel(table, managedForm.getToolkit(),
-                    "No attributes to display, waiting for SDK to finish loading...",
-                    null /* tooltip */ );
-        }
-    }
-
-    /**
-     * Insert the UI attributes of the given {@link UiElementNode} in the given table.
-     *
-     * @param uiNode The {@link UiElementNode} that contains the attributes to display.
-     *               Must not be null.
-     * @param table The table to fill. It must have 2 columns.
-     * @param managedForm The managed form for new controls.
-     * @return The number of UI attributes inserted. It is >= 0.
-     */
-    protected int insertUiAttributes(UiElementNode uiNode, Composite table, IManagedForm managedForm) {
-        if (uiNode == null || table == null || managedForm == null) {
-            return 0;
-        }
-
-        // To iterate over all attributes, we use the {@link ElementDescriptor} instead
-        // of the {@link UiElementNode} because the attributes' order is guaranteed in the
-        // descriptor but not in the node itself.
-        AttributeDescriptor[] attr_desc_list = uiNode.getAttributeDescriptors();
-        for (AttributeDescriptor attr_desc : attr_desc_list) {
-            if (attr_desc instanceof XmlnsAttributeDescriptor) {
-                // Do not show hidden attributes
-                continue;
-            }
-
-            UiAttributeNode ui_attr = uiNode.findUiAttribute(attr_desc);
-            if (ui_attr != null) {
-                ui_attr.createUiControl(table, managedForm);
-            } else {
-                // The XML has an extra attribute which wasn't declared in
-                // AndroidManifestDescriptors. This is not a problem, we just ignore it.
-                AdtPlugin.log(IStatus.WARNING,
-                        "Attribute %1$s not declared in node %2$s, ignored.", //$NON-NLS-1$
-                        attr_desc.getXmlLocalName(),
-                        uiNode.getDescriptor().getXmlName());
-            }
-        }
-        return attr_desc_list.length;
-    }
-
-    /**
-     * Tests whether the part is dirty i.e. its widgets have state that is
-     * newer than the data in the model.
-     * <p/>
-     * This is done by iterating over all attributes and updating the super's
-     * internal dirty flag. Stop once at least one attribute is dirty.
-     *
-     * @return <code>true</code> if the part is dirty, <code>false</code>
-     *         otherwise.
-     */
-    @Override
-    public boolean isDirty() {
-        if (mUiElementNode != null && !super.isDirty()) {
-            for (UiAttributeNode ui_attr : mUiElementNode.getAllUiAttributes()) {
-                if (ui_attr.isDirty()) {
-                    markDirty();
-                    break;
-                }
-            }
-        }
-        return super.isDirty();
-    }
-
-    /**
-     * If part is displaying information loaded from a model, this method
-     * instructs it to commit the new (modified) data back into the model.
-     *
-     * @param onSave
-     *            indicates if commit is called during 'save' operation or for
-     *            some other reason (for example, if form is contained in a
-     *            wizard or a multi-page editor and the user is about to leave
-     *            the page).
-     */
-    @Override
-    public void commit(boolean onSave) {
-        if (mUiElementNode != null) {
-            mEditor.wrapEditXmlModel(new Runnable() {
-                @Override
-                public void run() {
-                    for (UiAttributeNode ui_attr : mUiElementNode.getAllUiAttributes()) {
-                        ui_attr.commit();
-                    }
-                }
-            });
-        }
-
-        // We need to call super's commit after we synchronized the nodes to make sure we
-        // reset the dirty flag after all the side effects from committing have occurred.
-        super.commit(onSave);
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/ui/tree/CopyCutAction.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/ui/tree/CopyCutAction.java
deleted file mode 100644
index 3fe98bb..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/ui/tree/CopyCutAction.java
+++ /dev/null
@@ -1,221 +0,0 @@
-/*
- * 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.editors.ui.tree;
-
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.ide.eclipse.adt.internal.editors.AndroidXmlEditor;
-import com.android.ide.eclipse.adt.internal.editors.uimodel.UiElementNode;
-
-import org.apache.xml.serialize.Method;
-import org.apache.xml.serialize.OutputFormat;
-import org.apache.xml.serialize.XMLSerializer;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.text.BadLocationException;
-import org.eclipse.swt.dnd.Clipboard;
-import org.eclipse.swt.dnd.TextTransfer;
-import org.eclipse.swt.dnd.Transfer;
-import org.eclipse.ui.ISharedImages;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
-import org.eclipse.wst.sse.core.internal.provisional.IndexedRegion;
-import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;
-import org.eclipse.wst.xml.core.internal.document.NodeContainer;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-
-import java.io.IOException;
-import java.io.StringWriter;
-import java.util.ArrayList;
-import java.util.List;
-
-
-/**
- * Provides Cut and Copy actions for the tree nodes.
- */
-@SuppressWarnings({"restriction", "deprecation"})
-public class CopyCutAction extends Action {
-    private List<UiElementNode> mUiNodes;
-    private boolean mPerformCut;
-    private final AndroidXmlEditor mEditor;
-    private final Clipboard mClipboard;
-    private final ICommitXml mXmlCommit;
-
-    /**
-     * Creates a new Copy or Cut action.
-     *
-     * @param selected The UI node to cut or copy. It *must* have a non-null XML node.
-     * @param performCut True if the operation is cut, false if it is copy.
-     */
-    public CopyCutAction(AndroidXmlEditor editor, Clipboard clipboard, ICommitXml xmlCommit,
-            UiElementNode selected, boolean performCut) {
-        this(editor, clipboard, xmlCommit, toList(selected), performCut);
-    }
-
-    /**
-     * Creates a new Copy or Cut action.
-     *
-     * @param selected The UI nodes to cut or copy. They *must* have a non-null XML node.
-     *                 The list becomes owned by the {@link CopyCutAction}.
-     * @param performCut True if the operation is cut, false if it is copy.
-     */
-    public CopyCutAction(AndroidXmlEditor editor, Clipboard clipboard, ICommitXml xmlCommit,
-            List<UiElementNode> selected, boolean performCut) {
-        super(performCut ? "Cut" : "Copy");
-        mEditor = editor;
-        mClipboard = clipboard;
-        mXmlCommit = xmlCommit;
-
-        ISharedImages images = PlatformUI.getWorkbench().getSharedImages();
-        if (performCut) {
-            setImageDescriptor(images.getImageDescriptor(ISharedImages.IMG_TOOL_CUT));
-            setHoverImageDescriptor(images.getImageDescriptor(ISharedImages.IMG_TOOL_CUT_HOVER));
-            setDisabledImageDescriptor(
-                    images.getImageDescriptor(ISharedImages.IMG_TOOL_CUT_DISABLED));
-        } else {
-            setImageDescriptor(images.getImageDescriptor(ISharedImages.IMG_TOOL_COPY));
-            setHoverImageDescriptor(images.getImageDescriptor(ISharedImages.IMG_TOOL_COPY_HOVER));
-            setDisabledImageDescriptor(
-                    images.getImageDescriptor(ISharedImages.IMG_TOOL_COPY_DISABLED));
-        }
-
-        mUiNodes = selected;
-        mPerformCut = performCut;
-    }
-
-    /**
-     * Performs the cut or copy action.
-     * First an XML serializer is used to turn the existing XML node into a valid
-     * XML fragment, which is added as text to the clipboard.
-     */
-    @Override
-    public void run() {
-        super.run();
-        if (mUiNodes == null || mUiNodes.size() < 1) {
-            return;
-        }
-
-        // Commit the current pages first, to make sure the XML is in sync.
-        // Committing may change the XML structure.
-        if (mXmlCommit != null) {
-            mXmlCommit.commitPendingXmlChanges();
-        }
-
-        StringBuilder allText = new StringBuilder();
-        ArrayList<UiElementNode> nodesToCut = mPerformCut ? new ArrayList<UiElementNode>() : null;
-
-        for (UiElementNode uiNode : mUiNodes) {
-            try {
-                Node xml_node = uiNode.getXmlNode();
-                if (xml_node == null) {
-                    return;
-                }
-
-                String data = getXmlTextFromEditor(xml_node);
-
-                // In the unlikely event that IStructuredDocument failed to extract the text
-                // directly from the editor, try to fall back on a direct XML serialization
-                // of the XML node. This uses the generic Node interface with no SSE tricks.
-                if (data == null) {
-                    data = getXmlTextFromSerialization(xml_node);
-                }
-
-                if (data != null) {
-                    allText.append(data);
-                    if (mPerformCut) {
-                        // only remove notes to cut if we actually got some XML text from them
-                        nodesToCut.add(uiNode);
-                    }
-                }
-
-            } catch (Exception e) {
-                AdtPlugin.log(e, "CopyCutAction failed for UI node %1$s", //$NON-NLS-1$
-                        uiNode.getBreadcrumbTrailDescription(true));
-            }
-        } // for uiNode
-
-        if (allText != null && allText.length() > 0) {
-            mClipboard.setContents(
-                    new Object[] { allText.toString() },
-                    new Transfer[] { TextTransfer.getInstance() });
-            if (mPerformCut) {
-                for (UiElementNode uiNode : nodesToCut) {
-                    uiNode.deleteXmlNode();
-                }
-            }
-        }
-    }
-
-    /** Get the data directly from the editor. */
-    private String getXmlTextFromEditor(Node xml_node) {
-        String data = null;
-        IStructuredModel model = mEditor.getModelForRead();
-        try {
-            IStructuredDocument sse_doc = mEditor.getStructuredDocument();
-            if (xml_node instanceof NodeContainer) {
-                // The easy way to get the source of an SSE XML node.
-                data = ((NodeContainer) xml_node).getSource();
-            } else  if (xml_node instanceof IndexedRegion && sse_doc != null) {
-                // Try harder.
-                IndexedRegion region = (IndexedRegion) xml_node;
-                int start = region.getStartOffset();
-                int end = region.getEndOffset();
-
-                if (end > start) {
-                    data = sse_doc.get(start, end - start);
-                }
-            }
-        } catch (BadLocationException e) {
-            // the region offset was invalid. ignore.
-        } finally {
-            model.releaseFromRead();
-        }
-        return data;
-    }
-
-    /**
-     * Direct XML serialization of the XML node.
-     * <p/>
-     * This uses the generic Node interface with no SSE tricks. It's however slower
-     * and doesn't respect formatting (since serialization is involved instead of reading
-     * the actual text buffer.)
-     */
-    private String getXmlTextFromSerialization(Node xml_node) throws IOException {
-        String data;
-        StringWriter sw = new StringWriter();
-        XMLSerializer serializer = new XMLSerializer(sw,
-                new OutputFormat(Method.XML,
-                        OutputFormat.Defaults.Encoding /* utf-8 */,
-                        true /* indent */));
-        // Serialize will throw an IOException if it fails.
-        serializer.serialize((Element) xml_node);
-        data = sw.toString();
-        return data;
-    }
-
-    /**
-     * Static helper class to wrap on node into a list for the constructors.
-     */
-    private static ArrayList<UiElementNode> toList(UiElementNode selected) {
-        ArrayList<UiElementNode> list = null;
-        if (selected != null) {
-            list = new ArrayList<UiElementNode>(1);
-            list.add(selected);
-        }
-        return list;
-    }
-}
-
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/ui/tree/ICommitXml.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/ui/tree/ICommitXml.java
deleted file mode 100644
index 067d145..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/ui/tree/ICommitXml.java
+++ /dev/null
@@ -1,28 +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.eclipse.adt.internal.editors.ui.tree;
-
-/**
- * Interface for an object that can commit its changes to the underlying XML model
- */
-public interface ICommitXml {
-
-    /** Commits pending data to the underlying XML model. */
-    public void commitPendingXmlChanges();
-
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/ui/tree/NewItemSelectionDialog.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/ui/tree/NewItemSelectionDialog.java
deleted file mode 100644
index 385a53a..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/ui/tree/NewItemSelectionDialog.java
+++ /dev/null
@@ -1,415 +0,0 @@
-/*
- * Copyright (C) 2007 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.editors.ui.tree;
-
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.ide.eclipse.adt.internal.editors.AndroidXmlEditor;
-import com.android.ide.eclipse.adt.internal.editors.descriptors.ElementDescriptor;
-import com.android.ide.eclipse.adt.internal.editors.layout.descriptors.ViewElementDescriptor;
-import com.android.ide.eclipse.adt.internal.editors.uimodel.UiElementNode;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.dialogs.AbstractElementListSelectionDialog;
-import org.eclipse.ui.dialogs.ISelectionStatusValidator;
-import org.eclipse.ui.part.FileEditorInput;
-
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.Locale;
-import java.util.Map;
-import java.util.Map.Entry;
-import java.util.TreeMap;
-
-/**
- * A selection dialog to select the type of the new element node to
- * create, either in the application node or the selected sub node.
- */
-public class NewItemSelectionDialog extends AbstractElementListSelectionDialog {
-
-    /** The UI node selected in the tree view before creating the new item selection dialog.
-     *  Can be null -- which means new items must be created in the root_node. */
-    private UiElementNode mSelectedUiNode;
-    /** The root node chosen by the user, either root_node or the one passed
-     *  to the constructor if not null */
-    private UiElementNode mChosenRootNode;
-    private UiElementNode mLocalRootNode;
-    /** The descriptor of the elements to be displayed as root in this tree view. All elements
-     *  of the same type in the root will be displayed. Can be null. */
-    private ElementDescriptor[] mDescriptorFilters;
-    /** The key for the {@link #setLastUsedXmlName(Object[])}. It corresponds to the full
-     * workspace path of the currently edited file, if this can be computed. This is computed
-     * by {@link #getLastUsedXmlName(UiElementNode)}, called from the constructor. */
-    private String mLastUsedKey;
-    /** A static map of known XML Names used for a given file. The map has full workspace
-     * paths as key and XML names as values. */
-    private static final Map<String, String> sLastUsedXmlName = new HashMap<String, String>();
-    /** The potential XML Name to initially select in the selection dialog. This is computed
-     * in the constructor and set by {@link #setInitialSelection(UiElementNode)}. */
-    private String mInitialXmlName;
-
-    /**
-     * Creates the new item selection dialog.
-     *
-     * @param shell The parent shell for the list.
-     * @param labelProvider ILabelProvider for the list.
-     * @param descriptorFilters The element allows at the root of the tree. Can be null.
-     * @param ui_node The selected node, or null if none is selected.
-     * @param root_node The root of the Ui Tree, either the UiDocumentNode or a sub-node.
-     */
-    public NewItemSelectionDialog(Shell shell, ILabelProvider labelProvider,
-            ElementDescriptor[] descriptorFilters,
-            UiElementNode ui_node,
-            UiElementNode root_node) {
-        super(shell, labelProvider);
-        mDescriptorFilters = descriptorFilters;
-        mLocalRootNode = root_node;
-
-        // Only accept the UI node if it is not the UI root node and it can have children.
-        // If the node cannot have children, select its parent as a potential target.
-        if (ui_node != null && ui_node != mLocalRootNode) {
-            if (ui_node.getDescriptor().hasChildren()) {
-                mSelectedUiNode = ui_node;
-            } else {
-                UiElementNode parent = ui_node.getUiParent();
-                if (parent != null && parent != mLocalRootNode) {
-                    mSelectedUiNode = parent;
-                }
-            }
-        }
-
-        setHelpAvailable(false);
-        setMultipleSelection(false);
-
-        setValidator(new ISelectionStatusValidator() {
-            @Override
-            public IStatus validate(Object[] selection) {
-                if (selection.length == 1 && selection[0] instanceof ViewElementDescriptor) {
-                    return new Status(IStatus.OK, // severity
-                            AdtPlugin.PLUGIN_ID, //plugin id
-                            IStatus.OK, // code
-                            ((ViewElementDescriptor) selection[0]).getFullClassName(), //msg
-                            null); // exception
-                } else if (selection.length == 1 && selection[0] instanceof ElementDescriptor) {
-                    return new Status(IStatus.OK, // severity
-                            AdtPlugin.PLUGIN_ID, //plugin id
-                            IStatus.OK, // code
-                            "", //$NON-NLS-1$ // msg
-                            null); // exception
-                } else {
-                    return new Status(IStatus.ERROR, // severity
-                            AdtPlugin.PLUGIN_ID, //plugin id
-                            IStatus.ERROR, // code
-                            "Invalid selection", // msg, translatable
-                            null); // exception
-                }
-            }
-        });
-
-        // Determine the initial selection using a couple heuristics.
-
-        // First check if we can get the last used node type for this file.
-        // The heuristic is that generally one keeps adding the same kind of items to the
-        // same file, so reusing the last used item type makes most sense.
-        String xmlName = getLastUsedXmlName(root_node);
-        if (xmlName == null) {
-            // Another heuristic is to find the most used item and default to that.
-            xmlName = getMostUsedXmlName(root_node);
-        }
-        if (xmlName == null) {
-            // Finally the last heuristic is to see if there's an item with a name
-            // similar to the edited file name.
-            xmlName = getLeafFileName(root_node);
-        }
-        // Set the potential name. Selecting the right item is done later by setInitialSelection().
-        mInitialXmlName = xmlName;
-    }
-
-    /**
-     * Returns a potential XML name based on the file name.
-     * The item name is marked with an asterisk to identify it as a partial match.
-     */
-    private String getLeafFileName(UiElementNode ui_node) {
-        if (ui_node != null) {
-            AndroidXmlEditor editor = ui_node.getEditor();
-            if (editor != null) {
-                IEditorInput editorInput = editor.getEditorInput();
-                if (editorInput instanceof FileEditorInput) {
-                    IFile f = ((FileEditorInput) editorInput).getFile();
-                    if (f != null) {
-                        String leafName = f.getFullPath().removeFileExtension().lastSegment();
-                        return "*" + leafName; //$NON-NLS-1$
-                    }
-                }
-            }
-        }
-
-        return null;
-    }
-
-    /**
-     * Given a potential non-null root node, this method looks for the currently edited
-     * file path and uses it as a key to retrieve the last used item for this file by this
-     * selection dialog. Returns null if nothing can be found, otherwise returns the string
-     * name of the item.
-     */
-    private String getLastUsedXmlName(UiElementNode ui_node) {
-        if (ui_node != null) {
-            AndroidXmlEditor editor = ui_node.getEditor();
-            if (editor != null) {
-                IEditorInput editorInput = editor.getEditorInput();
-                if (editorInput instanceof FileEditorInput) {
-                    IFile f = ((FileEditorInput) editorInput).getFile();
-                    if (f != null) {
-                        mLastUsedKey = f.getFullPath().toPortableString();
-
-                        return sLastUsedXmlName.get(mLastUsedKey);
-                    }
-                }
-            }
-        }
-
-        return null;
-    }
-
-    /**
-     * Sets the last used item for this selection dialog for this file.
-     * @param objects The currently selected items. Only the first one is used if it is an
-     *                {@link ElementDescriptor}.
-     */
-    private void setLastUsedXmlName(Object[] objects) {
-        if (mLastUsedKey != null &&
-                objects != null &&
-                objects.length > 0 &&
-                objects[0] instanceof ElementDescriptor) {
-            ElementDescriptor desc = (ElementDescriptor) objects[0];
-            sLastUsedXmlName.put(mLastUsedKey, desc.getXmlName());
-        }
-    }
-
-    /**
-     * Returns the most used sub-element name, if any, or null.
-     */
-    private String getMostUsedXmlName(UiElementNode ui_node) {
-        if (ui_node != null) {
-            TreeMap<String, Integer> counts = new TreeMap<String, Integer>();
-            int max = -1;
-
-            for (UiElementNode child : ui_node.getUiChildren()) {
-                String name = child.getDescriptor().getXmlName();
-                Integer i = counts.get(name);
-                int count = i == null ? 1 : i.intValue() + 1;
-                counts.put(name, count);
-                max = Math.max(max, count);
-            }
-
-            if (max > 0) {
-                // Find first key with this max and return it
-                for (Entry<String, Integer> entry : counts.entrySet()) {
-                    if (entry.getValue().intValue() == max) {
-                        return entry.getKey();
-                    }
-                }
-            }
-        }
-        return null;
-    }
-
-    /**
-     * @return The root node selected by the user, either root node or the
-     *         one passed to the constructor if not null.
-     */
-    public UiElementNode getChosenRootNode() {
-        return mChosenRootNode;
-    }
-
-    /**
-     * Internal helper to compute the result. Returns the selection from
-     * the list view, if any.
-     */
-    @Override
-    protected void computeResult() {
-        setResult(Arrays.asList(getSelectedElements()));
-        setLastUsedXmlName(getSelectedElements());
-    }
-
-    /**
-     * Creates the dialog area.
-     *
-     * First add a radio area, which may be either 2 radio controls or
-     * just a message area if there's only one choice (the app root node).
-     *
-     * Then uses the default from the AbstractElementListSelectionDialog
-     * which is to add both a filter text and a filtered list. Adding both
-     * is necessary (since the base class accesses both internal directly
-     * fields without checking for null pointers.)
-     *
-     * Finally sets the initial selection list.
-     */
-    @Override
-    protected Control createDialogArea(Composite parent) {
-        Composite contents = (Composite) super.createDialogArea(parent);
-
-        createRadioControl(contents);
-        createFilterText(contents);
-        createFilteredList(contents);
-
-        // We don't want the builtin message area label (we use a radio control
-        // instead), but if we don't create it, Bad Stuff happens on
-        // Eclipse 3.8 and later (see issue 32527).
-        Label label = createMessageArea(contents);
-        if (label != null) {
-            GridData data = (GridData) label.getLayoutData();
-            data.exclude = true;
-        }
-
-        // Initialize the list state.
-        // This must be done after the filtered list as been created.
-        chooseNode(mChosenRootNode);
-
-        // Set the initial selection
-        setInitialSelection(mChosenRootNode);
-        return contents;
-    }
-
-    /**
-     * Tries to set the initial selection based on the {@link #mInitialXmlName} computed
-     * in the constructor. The selection is only set if there's an element descriptor
-     * that matches the same exact XML name. When {@link #mInitialXmlName} starts with an
-     * asterisk, it means to do a partial case-insensitive match on the start of the
-     * strings.
-     */
-    private void setInitialSelection(UiElementNode rootNode) {
-        ElementDescriptor initialElement = null;
-
-        if (mInitialXmlName != null && mInitialXmlName.length() > 0) {
-            String name = mInitialXmlName;
-            boolean partial = name.startsWith("*");   //$NON-NLS-1$
-            if (partial) {
-                name = name.substring(1).toLowerCase(Locale.US);
-            }
-
-            for (ElementDescriptor desc : getAllowedDescriptors(rootNode)) {
-                if (!partial && desc.getXmlName().equals(name)) {
-                    initialElement = desc;
-                    break;
-                } else if (partial) {
-                    String name2 = desc.getXmlLocalName().toLowerCase(Locale.US);
-                    if (name.startsWith(name2) || name2.startsWith(name)) {
-                        initialElement = desc;
-                        break;
-                    }
-                }
-            }
-        }
-
-        setSelection(initialElement == null ? null : new ElementDescriptor[] { initialElement });
-    }
-
-    /**
-     * Creates the message text widget and sets layout data.
-     * @param content the parent composite of the message area.
-     */
-    private Composite createRadioControl(Composite content) {
-
-        if (mSelectedUiNode != null) {
-            Button radio1 = new Button(content, SWT.RADIO);
-            radio1.setText(String.format("Create a new element at the top level, in %1$s.",
-                    mLocalRootNode.getShortDescription()));
-
-            Button radio2 = new Button(content, SWT.RADIO);
-            radio2.setText(String.format("Create a new element in the selected element, %1$s.",
-                    mSelectedUiNode.getBreadcrumbTrailDescription(false /* include_root */)));
-
-            // Set the initial selection before adding the listeners
-            // (they can't be run till the filtered list has been created)
-            radio1.setSelection(false);
-            radio2.setSelection(true);
-            mChosenRootNode = mSelectedUiNode;
-
-            radio1.addSelectionListener(new SelectionAdapter() {
-                @Override
-                public void widgetSelected(SelectionEvent e) {
-                    super.widgetSelected(e);
-                    chooseNode(mLocalRootNode);
-                }
-            });
-
-            radio2.addSelectionListener(new SelectionAdapter() {
-                @Override
-                public void widgetSelected(SelectionEvent e) {
-                    super.widgetSelected(e);
-                    chooseNode(mSelectedUiNode);
-                }
-            });
-        } else {
-            setMessage(String.format("Create a new element at the top level, in %1$s.",
-                    mLocalRootNode.getShortDescription()));
-            createMessageArea(content);
-
-            mChosenRootNode = mLocalRootNode;
-        }
-
-        return content;
-    }
-
-    /**
-     * Internal helper to remember the root node choosen by the user.
-     * It also sets the list view to the adequate list of children that can
-     * be added to the chosen root node.
-     *
-     * If the chosen root node is mLocalRootNode and a descriptor filter was specified
-     * when creating the master-detail part, we use this as the set of nodes that
-     * can be created on the root node.
-     *
-     * @param ui_node The chosen root node, either mLocalRootNode or
-     *                mSelectedUiNode.
-     */
-    private void chooseNode(UiElementNode ui_node) {
-        mChosenRootNode = ui_node;
-        setListElements(getAllowedDescriptors(ui_node));
-    }
-
-    /**
-     * Returns the list of {@link ElementDescriptor}s that can be added to the given
-     * UI node.
-     *
-     * @param ui_node The UI node to which element should be added. Cannot be null.
-     * @return A non-null array of {@link ElementDescriptor}. The array might be empty.
-     */
-    private ElementDescriptor[] getAllowedDescriptors(UiElementNode ui_node) {
-        if (ui_node == mLocalRootNode &&
-                mDescriptorFilters != null &&
-                mDescriptorFilters.length != 0) {
-            return mDescriptorFilters;
-        } else {
-            return ui_node.getDescriptor().getChildren();
-        }
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/ui/tree/PasteAction.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/ui/tree/PasteAction.java
deleted file mode 100644
index 6674ba9..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/ui/tree/PasteAction.java
+++ /dev/null
@@ -1,129 +0,0 @@
-/*
- * 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.editors.ui.tree;
-
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.ide.eclipse.adt.internal.editors.AndroidXmlEditor;
-import com.android.ide.eclipse.adt.internal.editors.uimodel.UiDocumentNode;
-import com.android.ide.eclipse.adt.internal.editors.uimodel.UiElementNode;
-
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.text.BadLocationException;
-import org.eclipse.swt.dnd.Clipboard;
-import org.eclipse.swt.dnd.TextTransfer;
-import org.eclipse.ui.ISharedImages;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.wst.sse.core.internal.provisional.IndexedRegion;
-import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;
-import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocumentRegion;
-import org.eclipse.wst.xml.core.internal.document.NodeContainer;
-import org.w3c.dom.Node;
-
-
-/**
- * Provides Paste operation for the tree nodes
- */
-@SuppressWarnings("restriction")
-public class PasteAction extends Action {
-    private UiElementNode mUiNode;
-    private final AndroidXmlEditor mEditor;
-    private final Clipboard mClipboard;
-
-    public PasteAction(AndroidXmlEditor editor, Clipboard clipboard, UiElementNode ui_node) {
-        super("Paste");
-        mEditor = editor;
-        mClipboard = clipboard;
-
-        ISharedImages images = PlatformUI.getWorkbench().getSharedImages();
-        setImageDescriptor(images.getImageDescriptor(ISharedImages.IMG_TOOL_PASTE));
-        setHoverImageDescriptor(images.getImageDescriptor(ISharedImages.IMG_TOOL_PASTE));
-        setDisabledImageDescriptor(
-                images.getImageDescriptor(ISharedImages.IMG_TOOL_PASTE_DISABLED));
-
-        mUiNode = ui_node;
-    }
-
-    /**
-     * Performs the paste operation.
-     */
-    @Override
-    public void run() {
-        super.run();
-
-        final String data = (String) mClipboard.getContents(TextTransfer.getInstance());
-        if (data != null) {
-            mEditor.wrapEditXmlModel(new Runnable() {
-                @Override
-                public void run() {
-                    try {
-                        IStructuredDocument sse_doc = mEditor.getStructuredDocument();
-                        if (sse_doc != null) {
-                            if (mUiNode.getDescriptor().hasChildren()) {
-                                // This UI Node can have children. The new XML is
-                                // inserted as the first child.
-
-                                if (mUiNode.getUiChildren().size() > 0) {
-                                    // There's already at least one child,
-                                    // so insert right before it.
-                                    Node xml_node = mUiNode.getUiChildren().get(0).getXmlNode();
-
-                                    if (xml_node instanceof IndexedRegion) {
-                                        IndexedRegion region = (IndexedRegion) xml_node;
-                                        sse_doc.replace(region.getStartOffset(), 0, data);
-                                        return; // we're done, no need to try the other cases
-                                    }
-                                }
-
-                                // If there's no first XML node child. Create one by
-                                // inserting at the end of the *start* tag.
-                                Node xml_node = mUiNode.getXmlNode();
-                                if (xml_node instanceof NodeContainer) {
-                                    NodeContainer container = (NodeContainer) xml_node;
-                                    IStructuredDocumentRegion start_tag =
-                                        container.getStartStructuredDocumentRegion();
-                                    if (start_tag != null) {
-                                        sse_doc.replace(start_tag.getEndOffset(), 0, data);
-                                        return; // we're done, no need to try the other case
-                                    }
-                                }
-                            }
-
-                            // This UI Node doesn't accept children. The new XML is inserted as the
-                            // next sibling. This also serves as a fallback if all the previous
-                            // attempts failed. However, this is not possible if the current node
-                            // has for parent a document -- an XML document can only have one root,
-                            // with no siblings.
-                            if (!(mUiNode.getUiParent() instanceof UiDocumentNode)) {
-                                Node xml_node = mUiNode.getXmlNode();
-                                if (xml_node instanceof IndexedRegion) {
-                                    IndexedRegion region = (IndexedRegion) xml_node;
-                                    sse_doc.replace(region.getEndOffset(), 0, data);
-                                }
-                            }
-                        }
-
-                    } catch (BadLocationException e) {
-                        AdtPlugin.log(e,
-                                "ParseAction failed for UI Node %2$s, content '%1$s'", //$NON-NLS-1$
-                                mUiNode.getBreadcrumbTrailDescription(true), data);
-                    }
-                }
-            });
-        }
-    }
-}
-
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/ui/tree/UiActions.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/ui/tree/UiActions.java
deleted file mode 100644
index 92ccf2e..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/ui/tree/UiActions.java
+++ /dev/null
@@ -1,598 +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.eclipse.adt.internal.editors.ui.tree;
-
-import com.android.ide.eclipse.adt.internal.editors.descriptors.DescriptorsUtils;
-import com.android.ide.eclipse.adt.internal.editors.descriptors.ElementDescriptor;
-import com.android.ide.eclipse.adt.internal.editors.descriptors.ElementDescriptor.Mandatory;
-import com.android.ide.eclipse.adt.internal.editors.uimodel.UiDocumentNode;
-import com.android.ide.eclipse.adt.internal.editors.uimodel.UiElementNode;
-
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.swt.widgets.Shell;
-import org.w3c.dom.Document;
-import org.w3c.dom.Node;
-
-import java.util.List;
-
-/**
- * Performs basic actions on an XML tree: add node, remove node, move up/down.
- */
-public abstract class UiActions implements ICommitXml {
-
-    public UiActions() {
-    }
-
-    //---------------------
-    // Actual implementations must override these to provide specific hooks
-
-    /** Returns the UiDocumentNode for the current model. */
-    abstract protected UiElementNode getRootNode();
-
-    /** Commits pending data before the XML model is modified. */
-    @Override
-    abstract public void commitPendingXmlChanges();
-
-    /**
-     * Utility method to select an outline item based on its model node
-     *
-     * @param uiNode The node to select. Can be null (in which case nothing should happen)
-     */
-    abstract protected void selectUiNode(UiElementNode uiNode);
-
-    //---------------------
-
-    /**
-     * Called when the "Add..." button next to the tree view is selected.
-     * <p/>
-     * This simplified version of doAdd does not support descriptor filters and creates
-     * a new {@link UiModelTreeLabelProvider} for each call.
-     */
-    public void doAdd(UiElementNode uiNode, Shell shell) {
-        doAdd(uiNode, null /* descriptorFilters */, shell, new UiModelTreeLabelProvider());
-    }
-
-    /**
-     * Called when the "Add..." button next to the tree view is selected.
-     *
-     * Displays a selection dialog that lets the user select which kind of node
-     * to create, depending on the current selection.
-     */
-    public void doAdd(UiElementNode uiNode,
-            ElementDescriptor[] descriptorFilters,
-            Shell shell, ILabelProvider labelProvider) {
-        // If the root node is a document with already a root, use it as the root node
-        UiElementNode rootNode = getRootNode();
-        if (rootNode instanceof UiDocumentNode && rootNode.getUiChildren().size() > 0) {
-            rootNode = rootNode.getUiChildren().get(0);
-        }
-
-        NewItemSelectionDialog dlg = new NewItemSelectionDialog(
-                shell,
-                labelProvider,
-                descriptorFilters,
-                uiNode, rootNode);
-        dlg.open();
-        Object[] results = dlg.getResult();
-        if (results != null && results.length > 0) {
-            addElement(dlg.getChosenRootNode(), null, (ElementDescriptor) results[0],
-                    true /*updateLayout*/);
-        }
-    }
-
-    /**
-     * Adds a new XML element based on the {@link ElementDescriptor} to the given parent
-     * {@link UiElementNode}, and then select it.
-     * <p/>
-     * If the parent is a document root which already contains a root element, the inner
-     * root element is used as the actual parent. This ensure you can't create a broken
-     * XML file with more than one root element.
-     * <p/>
-     * If a sibling is given and that sibling has the same parent, the new node is added
-     * right after that sibling. Otherwise the new node is added at the end of the parent
-     * child list.
-     *
-     * @param uiParent An existing UI node or null to add to the tree root
-     * @param uiSibling An existing UI node before which to insert the new node. Can be null.
-     * @param descriptor The descriptor of the element to add
-     * @param updateLayout True if layout attributes should be set
-     * @return The new {@link UiElementNode} or null.
-     */
-    public UiElementNode addElement(UiElementNode uiParent,
-            UiElementNode uiSibling,
-            ElementDescriptor descriptor,
-            boolean updateLayout) {
-        if (uiParent instanceof UiDocumentNode && uiParent.getUiChildren().size() > 0) {
-            uiParent = uiParent.getUiChildren().get(0);
-        }
-        if (uiSibling != null && uiSibling.getUiParent() != uiParent) {
-            uiSibling = null;
-        }
-
-        UiElementNode uiNew = addNewTreeElement(uiParent, uiSibling, descriptor, updateLayout);
-        selectUiNode(uiNew);
-
-        return uiNew;
-    }
-
-    /**
-     * Called when the "Remove" button is selected.
-     *
-     * If the tree has a selection, remove it.
-     * This simply deletes the XML node attached to the UI node: when the XML model fires the
-     * update event, the tree will get refreshed.
-     */
-    public void doRemove(final List<UiElementNode> nodes, Shell shell) {
-
-        if (nodes == null || nodes.size() == 0) {
-            return;
-        }
-
-        final int len = nodes.size();
-
-        StringBuilder sb = new StringBuilder();
-        for (UiElementNode node : nodes) {
-            sb.append("\n- "); //$NON-NLS-1$
-            sb.append(node.getBreadcrumbTrailDescription(false /* include_root */));
-        }
-
-        if (MessageDialog.openQuestion(shell,
-                len > 1 ? "Remove elements from Android XML"  // title
-                        : "Remove element from Android XML",
-                String.format("Do you really want to remove %1$s?", sb.toString()))) {
-            commitPendingXmlChanges();
-            getRootNode().getEditor().wrapEditXmlModel(new Runnable() {
-                @Override
-                public void run() {
-                    UiElementNode previous = null;
-                    UiElementNode parent = null;
-
-                    for (int i = len - 1; i >= 0; i--) {
-                        UiElementNode node = nodes.get(i);
-                        previous = node.getUiPreviousSibling();
-                        parent = node.getUiParent();
-
-                        // delete node
-                        node.deleteXmlNode();
-                    }
-
-                    // try to select the last previous sibling or the last parent
-                    if (previous != null) {
-                        selectUiNode(previous);
-                    } else if (parent != null) {
-                        selectUiNode(parent);
-                    }
-                }
-            });
-        }
-    }
-
-    /**
-     * Called when the "Up" button is selected.
-     * <p/>
-     * If the tree has a selection, move it up, either in the child list or as the last child
-     * of the previous parent.
-     */
-    public void doUp(
-            final List<UiElementNode> uiNodes,
-            final ElementDescriptor[] descriptorFilters) {
-        if (uiNodes == null || uiNodes.size() < 1) {
-            return;
-        }
-
-        final Node[]          selectXmlNode = { null };
-        final UiElementNode[] uiLastNode    = { null };
-        final UiElementNode[] uiSearchRoot  = { null };
-
-        commitPendingXmlChanges();
-        getRootNode().getEditor().wrapEditXmlModel(new Runnable() {
-            @Override
-            public void run() {
-                for (int i = 0; i < uiNodes.size(); i++) {
-                    UiElementNode uiNode = uiLastNode[0] = uiNodes.get(i);
-                    doUpInternal(
-                            uiNode,
-                            descriptorFilters,
-                            selectXmlNode,
-                            uiSearchRoot,
-                            false /*testOnly*/);
-                }
-            }
-        });
-
-        assert uiLastNode[0] != null; // tell Eclipse this can't be null below
-
-        if (selectXmlNode[0] == null) {
-            // The XML node has not been moved, we can just select the same UI node
-            selectUiNode(uiLastNode[0]);
-        } else {
-            // The XML node has moved. At this point the UI model has been reloaded
-            // and the XML node has been affected to a new UI node. Find that new UI
-            // node and select it.
-            if (uiSearchRoot[0] == null) {
-                uiSearchRoot[0] = uiLastNode[0].getUiRoot();
-            }
-            if (uiSearchRoot[0] != null) {
-                selectUiNode(uiSearchRoot[0].findXmlNode(selectXmlNode[0]));
-            }
-        }
-    }
-
-    /**
-     * Checks whether the "up" action can be performed on all items.
-     *
-     * @return True if the up action can be carried on *all* items.
-     */
-    public boolean canDoUp(
-            List<UiElementNode> uiNodes,
-            ElementDescriptor[] descriptorFilters) {
-        if (uiNodes == null || uiNodes.size() < 1) {
-            return false;
-        }
-
-        final Node[]          selectXmlNode = { null };
-        final UiElementNode[] uiSearchRoot  = { null };
-
-        commitPendingXmlChanges();
-
-        for (int i = 0; i < uiNodes.size(); i++) {
-            if (!doUpInternal(
-                    uiNodes.get(i),
-                    descriptorFilters,
-                    selectXmlNode,
-                    uiSearchRoot,
-                    true /*testOnly*/)) {
-                return false;
-            }
-        }
-
-        return true;
-    }
-
-    private boolean doUpInternal(
-            UiElementNode uiNode,
-            ElementDescriptor[] descriptorFilters,
-            Node[] outSelectXmlNode,
-            UiElementNode[] outUiSearchRoot,
-            boolean testOnly) {
-        // the node will move either up to its parent or grand-parent
-        outUiSearchRoot[0] = uiNode.getUiParent();
-        if (outUiSearchRoot[0] != null && outUiSearchRoot[0].getUiParent() != null) {
-            outUiSearchRoot[0] = outUiSearchRoot[0].getUiParent();
-        }
-        Node xmlNode = uiNode.getXmlNode();
-        ElementDescriptor nodeDesc = uiNode.getDescriptor();
-        if (xmlNode == null || nodeDesc == null) {
-            return false;
-        }
-        UiElementNode uiParentNode = uiNode.getUiParent();
-        Node xmlParent = uiParentNode == null ? null : uiParentNode.getXmlNode();
-        if (xmlParent == null) {
-            return false;
-        }
-
-        UiElementNode uiPrev = uiNode.getUiPreviousSibling();
-
-        // Only accept a sibling that has an XML attached and
-        // is part of the allowed descriptor filters.
-        while (uiPrev != null &&
-                (uiPrev.getXmlNode() == null || !matchDescFilter(descriptorFilters, uiPrev))) {
-            uiPrev = uiPrev.getUiPreviousSibling();
-        }
-
-        if (uiPrev != null && uiPrev.getXmlNode() != null) {
-            // This node is not the first one of the parent.
-            Node xmlPrev = uiPrev.getXmlNode();
-            if (uiPrev.getDescriptor().acceptChild(nodeDesc)) {
-                // If the previous sibling can accept this child, then it
-                // is inserted at the end of the children list.
-                if (testOnly) {
-                    return true;
-                }
-                xmlPrev.appendChild(xmlParent.removeChild(xmlNode));
-                outSelectXmlNode[0] = xmlNode;
-            } else {
-                // This node is not the first one of the parent, so it can be
-                // removed and then inserted before its previous sibling.
-                if (testOnly) {
-                    return true;
-                }
-                xmlParent.insertBefore(
-                        xmlParent.removeChild(xmlNode),
-                        xmlPrev);
-                outSelectXmlNode[0] = xmlNode;
-            }
-        } else if (uiParentNode != null && !(xmlParent instanceof Document)) {
-            UiElementNode uiGrandParent = uiParentNode.getUiParent();
-            Node xmlGrandParent = uiGrandParent == null ? null : uiGrandParent.getXmlNode();
-            ElementDescriptor grandDesc =
-                uiGrandParent == null ? null : uiGrandParent.getDescriptor();
-
-            if (xmlGrandParent != null &&
-                    !(xmlGrandParent instanceof Document) &&
-                    grandDesc != null &&
-                    grandDesc.acceptChild(nodeDesc)) {
-                // If the node is the first one of the child list of its
-                // parent, move it up in the hierarchy as previous sibling
-                // to the parent. This is only possible if the parent of the
-                // parent is not a document.
-                // The parent node must actually accept this kind of child.
-
-                if (testOnly) {
-                    return true;
-                }
-                xmlGrandParent.insertBefore(
-                        xmlParent.removeChild(xmlNode),
-                        xmlParent);
-                outSelectXmlNode[0] = xmlNode;
-            }
-        }
-
-        return false;
-    }
-
-    private boolean matchDescFilter(
-            ElementDescriptor[] descriptorFilters,
-            UiElementNode uiNode) {
-        if (descriptorFilters == null || descriptorFilters.length < 1) {
-            return true;
-        }
-
-        ElementDescriptor desc = uiNode.getDescriptor();
-
-        for (ElementDescriptor filter : descriptorFilters) {
-            if (filter.equals(desc)) {
-                return true;
-            }
-        }
-        return false;
-    }
-
-    /**
-     * Called when the "Down" button is selected.
-     *
-     * If the tree has a selection, move it down, either in the same child list or as the
-     * first child of the next parent.
-     */
-    public void doDown(
-            final List<UiElementNode> nodes,
-            final ElementDescriptor[] descriptorFilters) {
-        if (nodes == null || nodes.size() < 1) {
-            return;
-        }
-
-        final Node[]          selectXmlNode = { null };
-        final UiElementNode[] uiLastNode    = { null };
-        final UiElementNode[] uiSearchRoot  = { null };
-
-        commitPendingXmlChanges();
-        getRootNode().getEditor().wrapEditXmlModel(new Runnable() {
-            @Override
-            public void run() {
-                for (int i = nodes.size() - 1; i >= 0; i--) {
-                    final UiElementNode node = uiLastNode[0] = nodes.get(i);
-                    doDownInternal(
-                            node,
-                            descriptorFilters,
-                            selectXmlNode,
-                            uiSearchRoot,
-                            false /*testOnly*/);
-                }
-            }
-        });
-
-        assert uiLastNode[0] != null; // tell Eclipse this can't be null below
-
-        if (selectXmlNode[0] == null) {
-            // The XML node has not been moved, we can just select the same UI node
-            selectUiNode(uiLastNode[0]);
-        } else {
-            // The XML node has moved. At this point the UI model has been reloaded
-            // and the XML node has been affected to a new UI node. Find that new UI
-            // node and select it.
-            if (uiSearchRoot[0] == null) {
-                uiSearchRoot[0] = uiLastNode[0].getUiRoot();
-            }
-            if (uiSearchRoot[0] != null) {
-                selectUiNode(uiSearchRoot[0].findXmlNode(selectXmlNode[0]));
-            }
-        }
-    }
-
-    /**
-     * Checks whether the "down" action can be performed on all items.
-     *
-     * @return True if the down action can be carried on *all* items.
-     */
-    public boolean canDoDown(
-            List<UiElementNode> uiNodes,
-            ElementDescriptor[] descriptorFilters) {
-        if (uiNodes == null || uiNodes.size() < 1) {
-            return false;
-        }
-
-        final Node[]          selectXmlNode = { null };
-        final UiElementNode[] uiSearchRoot  = { null };
-
-        commitPendingXmlChanges();
-
-        for (int i = 0; i < uiNodes.size(); i++) {
-            if (!doDownInternal(
-                    uiNodes.get(i),
-                    descriptorFilters,
-                    selectXmlNode,
-                    uiSearchRoot,
-                    true /*testOnly*/)) {
-                return false;
-            }
-        }
-
-        return true;
-    }
-
-    private boolean doDownInternal(
-            UiElementNode uiNode,
-            ElementDescriptor[] descriptorFilters,
-            Node[] outSelectXmlNode,
-            UiElementNode[] outUiSearchRoot,
-            boolean testOnly) {
-        // the node will move either down to its parent or grand-parent
-        outUiSearchRoot[0] = uiNode.getUiParent();
-        if (outUiSearchRoot[0] != null && outUiSearchRoot[0].getUiParent() != null) {
-            outUiSearchRoot[0] = outUiSearchRoot[0].getUiParent();
-        }
-
-        Node xmlNode = uiNode.getXmlNode();
-        ElementDescriptor nodeDesc = uiNode.getDescriptor();
-        if (xmlNode == null || nodeDesc == null) {
-            return false;
-        }
-        UiElementNode uiParentNode = uiNode.getUiParent();
-        Node xmlParent = uiParentNode == null ? null : uiParentNode.getXmlNode();
-        if (xmlParent == null) {
-            return false;
-        }
-
-        UiElementNode uiNext = uiNode.getUiNextSibling();
-
-        // Only accept a sibling that has an XML attached and
-        // is part of the allowed descriptor filters.
-        while (uiNext != null &&
-                (uiNext.getXmlNode() == null || !matchDescFilter(descriptorFilters, uiNext))) {
-            uiNext = uiNext.getUiNextSibling();
-        }
-
-        if (uiNext != null && uiNext.getXmlNode() != null) {
-            // This node is not the last one of the parent.
-            Node xmlNext = uiNext.getXmlNode();
-            // If the next sibling is a node that can have children, though,
-            // then the node is inserted as the first child.
-            if (uiNext.getDescriptor().acceptChild(nodeDesc)) {
-                if (testOnly) {
-                    return true;
-                }
-                // Note: insertBefore works as append if the ref node is
-                // null, i.e. when the node doesn't have children yet.
-                xmlNext.insertBefore(
-                        xmlParent.removeChild(xmlNode),
-                        xmlNext.getFirstChild());
-                outSelectXmlNode[0] = xmlNode;
-            } else {
-                // This node is not the last one of the parent, so it can be
-                // removed and then inserted after its next sibling.
-
-                if (testOnly) {
-                    return true;
-                }
-                // Insert "before after next" ;-)
-                xmlParent.insertBefore(
-                        xmlParent.removeChild(xmlNode),
-                        xmlNext.getNextSibling());
-                outSelectXmlNode[0] = xmlNode;
-            }
-        } else if (uiParentNode != null && !(xmlParent instanceof Document)) {
-            UiElementNode uiGrandParent = uiParentNode.getUiParent();
-            Node xmlGrandParent = uiGrandParent == null ? null : uiGrandParent.getXmlNode();
-            ElementDescriptor grandDesc =
-                uiGrandParent == null ? null : uiGrandParent.getDescriptor();
-
-            if (xmlGrandParent != null &&
-                    !(xmlGrandParent instanceof Document) &&
-                    grandDesc != null &&
-                    grandDesc.acceptChild(nodeDesc)) {
-                // This node is the last node of its parent.
-                // If neither the parent nor the grandparent is a document,
-                // then the node can be inserted right after the parent.
-                // The parent node must actually accept this kind of child.
-                if (testOnly) {
-                    return true;
-                }
-                xmlGrandParent.insertBefore(
-                        xmlParent.removeChild(xmlNode),
-                        xmlParent.getNextSibling());
-                outSelectXmlNode[0] = xmlNode;
-            }
-        }
-
-        return false;
-    }
-
-    //---------------------
-
-    /**
-     * Adds a new element of the given descriptor's type to the given UI parent node.
-     *
-     * This actually creates the corresponding XML node in the XML model, which in turn
-     * will refresh the current tree view.
-     *
-     * @param uiParent An existing UI node or null to add to the tree root
-     * @param uiSibling An existing UI node to insert right before. Can be null.
-     * @param descriptor The descriptor of the element to add
-     * @param updateLayout True if layout attributes should be set
-     * @return The {@link UiElementNode} that has been added to the UI tree.
-     */
-    private UiElementNode addNewTreeElement(UiElementNode uiParent,
-            UiElementNode uiSibling,
-            ElementDescriptor descriptor,
-            final boolean updateLayout) {
-        commitPendingXmlChanges();
-
-        List<UiElementNode> uiChildren = uiParent.getUiChildren();
-        int n = uiChildren.size();
-
-        // The default is to append at the end of the list.
-        int index = n;
-
-        if (uiSibling != null) {
-            // Try to find the requested sibling.
-            index = uiChildren.indexOf(uiSibling);
-            if (index < 0) {
-                // This sibling didn't exist. Should not happen but compensate
-                // by simply adding to the end of the list.
-                uiSibling = null;
-                index = n;
-            }
-        }
-
-        if (uiSibling == null) {
-            // If we don't require any specific position, make sure to insert before the
-            // first mandatory_last descriptor's position, if any.
-
-            for (int i = 0; i < n; i++) {
-                UiElementNode uiChild = uiChildren.get(i);
-                if (uiChild.getDescriptor().getMandatory() == Mandatory.MANDATORY_LAST) {
-                    index = i;
-                    break;
-                }
-            }
-        }
-
-        final UiElementNode uiNew = uiParent.insertNewUiChild(index, descriptor);
-        UiElementNode rootNode = getRootNode();
-
-        rootNode.getEditor().wrapEditXmlModel(new Runnable() {
-            @Override
-            public void run() {
-                DescriptorsUtils.setDefaultLayoutAttributes(uiNew, updateLayout);
-                uiNew.createXmlNode();
-            }
-        });
-        return uiNew;
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/ui/tree/UiElementDetail.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/ui/tree/UiElementDetail.java
deleted file mode 100644
index 2aa56a8..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/ui/tree/UiElementDetail.java
+++ /dev/null
@@ -1,494 +0,0 @@
-/*
- * Copyright (C) 2007 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.editors.ui.tree;
-
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.ide.eclipse.adt.internal.editors.AndroidXmlEditor;
-import com.android.ide.eclipse.adt.internal.editors.descriptors.AttributeDescriptor;
-import com.android.ide.eclipse.adt.internal.editors.descriptors.DescriptorsUtils;
-import com.android.ide.eclipse.adt.internal.editors.descriptors.ElementDescriptor;
-import com.android.ide.eclipse.adt.internal.editors.descriptors.SeparatorAttributeDescriptor;
-import com.android.ide.eclipse.adt.internal.editors.descriptors.XmlnsAttributeDescriptor;
-import com.android.ide.eclipse.adt.internal.editors.ui.SectionHelper;
-import com.android.ide.eclipse.adt.internal.editors.ui.SectionHelper.ManifestSectionPart;
-import com.android.ide.eclipse.adt.internal.editors.uimodel.IUiUpdateListener;
-import com.android.ide.eclipse.adt.internal.editors.uimodel.UiAttributeNode;
-import com.android.ide.eclipse.adt.internal.editors.uimodel.UiElementNode;
-import com.android.ide.eclipse.adt.internal.sdk.Sdk;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.ITreeSelection;
-import org.eclipse.swt.events.DisposeEvent;
-import org.eclipse.swt.events.DisposeListener;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.ui.forms.IDetailsPage;
-import org.eclipse.ui.forms.IFormPart;
-import org.eclipse.ui.forms.IManagedForm;
-import org.eclipse.ui.forms.events.ExpansionEvent;
-import org.eclipse.ui.forms.events.IExpansionListener;
-import org.eclipse.ui.forms.widgets.FormText;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-import org.eclipse.ui.forms.widgets.Section;
-import org.eclipse.ui.forms.widgets.SharedScrolledComposite;
-import org.eclipse.ui.forms.widgets.TableWrapData;
-import org.eclipse.ui.forms.widgets.TableWrapLayout;
-
-import java.util.Collection;
-import java.util.HashSet;
-
-/**
- * Details page for the {@link UiElementNode} nodes in the tree view.
- * <p/>
- * See IDetailsBase for more details.
- */
-class UiElementDetail implements IDetailsPage {
-
-    /** The master-detail part, composed of a main tree and an auxiliary detail part */
-    private ManifestSectionPart mMasterPart;
-
-    private Section mMasterSection;
-    private UiElementNode mCurrentUiElementNode;
-    private Composite mCurrentTable;
-    private boolean mIsDirty;
-
-    private IManagedForm mManagedForm;
-
-    private final UiTreeBlock mTree;
-
-    public UiElementDetail(UiTreeBlock tree) {
-        mTree = tree;
-        mMasterPart = mTree.getMasterPart();
-        mManagedForm = mMasterPart.getManagedForm();
-    }
-
-    /* (non-java doc)
-     * Initializes the part.
-     */
-    @Override
-    public void initialize(IManagedForm form) {
-        mManagedForm = form;
-    }
-
-    /* (non-java doc)
-     * Creates the contents of the page in the provided parent.
-     */
-    @Override
-    public void createContents(Composite parent) {
-        mMasterSection = createMasterSection(parent);
-    }
-
-    /* (non-java doc)
-     * Called when the provided part has changed selection state.
-     * <p/>
-     * Only reply when our master part originates the selection.
-     */
-    @Override
-    public void selectionChanged(IFormPart part, ISelection selection) {
-        if (part == mMasterPart &&
-                !selection.isEmpty() &&
-                selection instanceof ITreeSelection) {
-            ITreeSelection tree_selection = (ITreeSelection) selection;
-
-            Object first = tree_selection.getFirstElement();
-            if (first instanceof UiElementNode) {
-                UiElementNode ui_node = (UiElementNode) first;
-                createUiAttributeControls(mManagedForm, ui_node);
-            }
-        }
-    }
-
-    /* (non-java doc)
-     * Instructs it to commit the new (modified) data back into the model.
-     */
-    @Override
-    public void commit(boolean onSave) {
-
-        mTree.getEditor().wrapEditXmlModel(new Runnable() {
-            @Override
-            public void run() {
-                try {
-                    if (mCurrentUiElementNode != null) {
-                        mCurrentUiElementNode.commit();
-                    }
-
-                    // Finally reset the dirty flag if everything was saved properly
-                    mIsDirty = false;
-                } catch (Exception e) {
-                    AdtPlugin.log(e, "Detail node failed to commit XML attribute!"); //$NON-NLS-1$
-                }
-            }
-        });
-    }
-
-    @Override
-    public void dispose() {
-        // pass
-    }
-
-
-    /* (non-java doc)
-     * Returns true if the part has been modified with respect to the data
-     * loaded from the model.
-     */
-    @Override
-    public boolean isDirty() {
-        if (mCurrentUiElementNode != null && mCurrentUiElementNode.isDirty()) {
-            markDirty();
-        }
-        return mIsDirty;
-    }
-
-    @Override
-    public boolean isStale() {
-        // pass
-        return false;
-    }
-
-    /**
-     * Called by the master part when the tree is refreshed after the framework resources
-     * have been reloaded.
-     */
-    @Override
-    public void refresh() {
-        if (mCurrentTable != null) {
-            mCurrentTable.dispose();
-            mCurrentTable = null;
-        }
-        mCurrentUiElementNode = null;
-        mMasterSection.getParent().pack(true /* changed */);
-    }
-
-    @Override
-    public void setFocus() {
-        // pass
-    }
-
-    @Override
-    public boolean setFormInput(Object input) {
-        // pass
-        return false;
-    }
-
-    /**
-     * Creates a TableWrapLayout in the DetailsPage, which in turns contains a Section.
-     *
-     * All the UI should be created in a layout which parent is the mSection itself.
-     * The hierarchy is:
-     * <pre>
-     * DetailPage
-     * + TableWrapLayout
-     *   + Section (with title/description && fill_grab horizontal)
-     *     + TableWrapLayout [*]
-     *       + Labels/Forms/etc... [*]
-     * </pre>
-     * Both items marked with [*] are created by the derived classes to fit their needs.
-     *
-     * @param parent Parent of the mSection (from createContents)
-     * @return The new Section
-     */
-    private Section createMasterSection(Composite parent) {
-        TableWrapLayout layout = new TableWrapLayout();
-        layout.topMargin = 0;
-        parent.setLayout(layout);
-
-        FormToolkit toolkit = mManagedForm.getToolkit();
-        Section section = toolkit.createSection(parent, Section.TITLE_BAR);
-        section.setLayoutData(new TableWrapData(TableWrapData.FILL_GRAB, TableWrapData.TOP));
-        return section;
-    }
-
-    /**
-     * Create the ui attribute controls to edit the attributes for the given
-     * ElementDescriptor.
-     * <p/>
-     * This is called by the constructor.
-     * Derived classes can override this if necessary.
-     *
-     * @param managedForm The managed form
-     */
-    private void createUiAttributeControls(
-            final IManagedForm managedForm,
-            final UiElementNode ui_node) {
-
-        final ElementDescriptor elem_desc = ui_node.getDescriptor();
-        mMasterSection.setText(String.format("Attributes for %1$s", ui_node.getShortDescription()));
-
-        if (mCurrentUiElementNode != ui_node) {
-            // Before changing the table, commit all dirty state.
-            if (mIsDirty) {
-                commit(false);
-            }
-            if (mCurrentTable != null) {
-                mCurrentTable.dispose();
-                mCurrentTable = null;
-            }
-
-            // To iterate over all attributes, we use the {@link ElementDescriptor} instead
-            // of the {@link UiElementNode} because the attributes order is guaranteed in the
-            // descriptor but not in the node itself.
-            AttributeDescriptor[] attr_desc_list = ui_node.getAttributeDescriptors();
-
-            // If the attribute list contains at least one SeparatorAttributeDescriptor,
-            // sub-sections will be used. This needs to be known early as it influences the
-            // creation of the master table.
-            boolean useSubsections = false;
-            for (AttributeDescriptor attr_desc : attr_desc_list) {
-                if (attr_desc instanceof SeparatorAttributeDescriptor) {
-                    // Sub-sections will be used. The default sections should no longer be
-                    useSubsections = true;
-                    break;
-                }
-            }
-
-            FormToolkit toolkit = managedForm.getToolkit();
-            Composite masterTable = SectionHelper.createTableLayout(mMasterSection,
-                    toolkit, useSubsections ? 1 : 2 /* numColumns */);
-            mCurrentTable = masterTable;
-
-            mCurrentUiElementNode = ui_node;
-
-            if (elem_desc.getTooltip() != null) {
-                String tooltip;
-                if (Sdk.getCurrent() != null &&
-                        Sdk.getCurrent().getDocumentationBaseUrl() != null) {
-                    tooltip = DescriptorsUtils.formatFormText(elem_desc.getTooltip(),
-                            elem_desc,
-                            Sdk.getCurrent().getDocumentationBaseUrl());
-                } else {
-                    tooltip = elem_desc.getTooltip();
-                }
-
-                try {
-                    FormText text = SectionHelper.createFormText(masterTable, toolkit,
-                            true /* isHtml */, tooltip, true /* setupLayoutData */);
-                    text.addHyperlinkListener(mTree.getEditor().createHyperlinkListener());
-                    Image icon = elem_desc.getCustomizedIcon();
-                    if (icon != null) {
-                        text.setImage(DescriptorsUtils.IMAGE_KEY, icon);
-                    }
-                } catch(Exception e) {
-                    // The FormText parser is really really basic and will fail as soon as the
-                    // HTML javadoc is ever so slightly malformatted.
-                    AdtPlugin.log(e,
-                            "Malformed javadoc, rejected by FormText for node %1$s: '%2$s'", //$NON-NLS-1$
-                            ui_node.getDescriptor().getXmlName(),
-                            tooltip);
-
-                    // Fallback to a pure text tooltip, no fancy HTML
-                    tooltip = DescriptorsUtils.formatTooltip(elem_desc.getTooltip());
-                    SectionHelper.createLabel(masterTable, toolkit, tooltip, tooltip);
-                }
-            }
-
-            Composite table = useSubsections ? null : masterTable;
-
-            for (AttributeDescriptor attr_desc : attr_desc_list) {
-                if (attr_desc instanceof XmlnsAttributeDescriptor) {
-                    // Do not show hidden attributes
-                    continue;
-                } else if (table == null || attr_desc instanceof SeparatorAttributeDescriptor) {
-                    String title = null;
-                    if (attr_desc instanceof SeparatorAttributeDescriptor) {
-                        // xmlName is actually the label of the separator
-                        title = attr_desc.getXmlLocalName();
-                    } else {
-                        title = String.format("Attributes from %1$s", elem_desc.getUiName());
-                    }
-
-                    table = createSubSectionTable(toolkit, masterTable, title);
-                    if (attr_desc instanceof SeparatorAttributeDescriptor) {
-                        continue;
-                    }
-                }
-
-                UiAttributeNode ui_attr = ui_node.findUiAttribute(attr_desc);
-
-                if (ui_attr != null) {
-                    ui_attr.createUiControl(table, managedForm);
-
-                    if (ui_attr.getCurrentValue() != null &&
-                            ui_attr.getCurrentValue().length() > 0) {
-                        ((Section) table.getParent()).setExpanded(true);
-                    }
-                } else {
-                    // The XML has an extra unknown attribute.
-                    // This is not expected to happen so it is ignored.
-                    AdtPlugin.log(IStatus.INFO,
-                            "Attribute %1$s not declared in node %2$s, ignored.", //$NON-NLS-1$
-                            attr_desc.getXmlLocalName(),
-                            ui_node.getDescriptor().getXmlName());
-                }
-            }
-
-            // Create a sub-section for the unknown attributes.
-            // It is initially hidden till there are some attributes to show here.
-            final Composite unknownTable = createSubSectionTable(toolkit, masterTable,
-                    "Unknown XML Attributes");
-            unknownTable.getParent().setVisible(false); // set section to not visible
-            final HashSet<UiAttributeNode> reference = new HashSet<UiAttributeNode>();
-
-            final IUiUpdateListener updateListener = new IUiUpdateListener() {
-                @Override
-                public void uiElementNodeUpdated(UiElementNode uiNode, UiUpdateState state) {
-                    if (state == UiUpdateState.ATTR_UPDATED) {
-                        updateUnknownAttributesSection(uiNode, unknownTable, managedForm,
-                                reference);
-                    }
-                }
-            };
-            ui_node.addUpdateListener(updateListener);
-
-            // remove the listener when the UI is disposed
-            unknownTable.addDisposeListener(new DisposeListener() {
-                @Override
-                public void widgetDisposed(DisposeEvent e) {
-                    ui_node.removeUpdateListener(updateListener);
-                }
-            });
-
-            updateUnknownAttributesSection(ui_node, unknownTable, managedForm, reference);
-
-            mMasterSection.getParent().pack(true /* changed */);
-        }
-    }
-
-    /**
-     * Create a sub Section and its embedding wrapper table with 2 columns.
-     * @return The table, child of a new section.
-     */
-    private Composite createSubSectionTable(FormToolkit toolkit,
-            Composite masterTable, String title) {
-
-        // The Section composite seems to ignore colspan when assigned a TableWrapData so
-        // if the parent is a table with more than one column an extra table with one column
-        // is inserted to respect colspan.
-        int parentNumCol = ((TableWrapLayout) masterTable.getLayout()).numColumns;
-        if (parentNumCol > 1) {
-            masterTable = SectionHelper.createTableLayout(masterTable, toolkit, 1);
-            TableWrapData twd = new TableWrapData(TableWrapData.FILL_GRAB);
-            twd.maxWidth = AndroidXmlEditor.TEXT_WIDTH_HINT;
-            twd.colspan = parentNumCol;
-            masterTable.setLayoutData(twd);
-        }
-
-        Composite table;
-        Section section = toolkit.createSection(masterTable,
-                Section.TITLE_BAR | Section.TWISTIE);
-
-        // Add an expansion listener that will trigger a reflow on the parent
-        // ScrolledPageBook (which is actually a SharedScrolledComposite). This will
-        // recompute the correct size and adjust the scrollbar as needed.
-        section.addExpansionListener(new IExpansionListener() {
-            @Override
-            public void expansionStateChanged(ExpansionEvent e) {
-                reflowMasterSection();
-            }
-
-            @Override
-            public void expansionStateChanging(ExpansionEvent e) {
-                // pass
-            }
-        });
-
-        section.setText(title);
-        section.setLayoutData(new TableWrapData(TableWrapData.FILL_GRAB,
-                                                TableWrapData.TOP));
-        table = SectionHelper.createTableLayout(section, toolkit, 2 /* numColumns */);
-        return table;
-    }
-
-    /**
-     * Reflow the parent ScrolledPageBook (which is actually a SharedScrolledComposite).
-     * This will recompute the correct size and adjust the scrollbar as needed.
-     */
-    private void reflowMasterSection() {
-        for(Composite c = mMasterSection; c != null; c = c.getParent()) {
-            if (c instanceof SharedScrolledComposite) {
-                ((SharedScrolledComposite) c).reflow(true /* flushCache */);
-                break;
-            }
-        }
-    }
-
-    /**
-     * Updates the unknown attributes section for the UI Node.
-     */
-    private void updateUnknownAttributesSection(UiElementNode ui_node,
-            final Composite unknownTable, final IManagedForm managedForm,
-            HashSet<UiAttributeNode> reference) {
-        Collection<UiAttributeNode> ui_attrs = ui_node.getUnknownUiAttributes();
-        Section section = ((Section) unknownTable.getParent());
-        boolean needs_reflow = false;
-
-        // The table was created hidden, show it if there are unknown attributes now
-        if (ui_attrs.size() > 0 && !section.isVisible()) {
-            section.setVisible(true);
-            needs_reflow = true;
-        }
-
-        // Compare the new attribute set with the old "reference" one
-        boolean has_differences = ui_attrs.size() != reference.size();
-        if (!has_differences) {
-            for (UiAttributeNode ui_attr : ui_attrs) {
-                if (!reference.contains(ui_attr)) {
-                    has_differences = true;
-                    break;
-                }
-            }
-        }
-
-        if (has_differences) {
-            needs_reflow = true;
-            reference.clear();
-
-            // Remove all children of the table
-            for (Control c : unknownTable.getChildren()) {
-                c.dispose();
-            }
-
-            // Recreate all attributes UI
-            for (UiAttributeNode ui_attr : ui_attrs) {
-                reference.add(ui_attr);
-                ui_attr.createUiControl(unknownTable, managedForm);
-
-                if (ui_attr.getCurrentValue() != null && ui_attr.getCurrentValue().length() > 0) {
-                    section.setExpanded(true);
-                }
-            }
-        }
-
-        if (needs_reflow) {
-            reflowMasterSection();
-        }
-    }
-
-    /**
-     * Marks the part dirty. Called as a result of user interaction with the widgets in the
-     * section.
-     */
-    private void markDirty() {
-        if (!mIsDirty) {
-            mIsDirty = true;
-            mManagedForm.dirtyStateChanged();
-        }
-    }
-}
-
-
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/ui/tree/UiModelTreeContentProvider.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/ui/tree/UiModelTreeContentProvider.java
deleted file mode 100644
index 14049cf..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/ui/tree/UiModelTreeContentProvider.java
+++ /dev/null
@@ -1,120 +0,0 @@
-/*
- * Copyright (C) 2007 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.editors.ui.tree;
-
-import com.android.ide.eclipse.adt.internal.editors.descriptors.ElementDescriptor;
-import com.android.ide.eclipse.adt.internal.editors.uimodel.UiElementNode;
-
-import org.eclipse.jface.viewers.ITreeContentProvider;
-import org.eclipse.jface.viewers.Viewer;
-
-import java.util.ArrayList;
-
-/**
- * UiModelTreeContentProvider is a trivial implementation of {@link ITreeContentProvider}
- * where elements are expected to be instances of {@link UiElementNode}.
- */
-class UiModelTreeContentProvider implements ITreeContentProvider {
-
-    /** The descriptor of the elements to be displayed as root in this tree view. All elements
-     *  of the same type in the root will be displayed. */
-    private ElementDescriptor[] mDescriptorFilters;
-    /** The uiRootNode of the model. */
-    private final UiElementNode mUiRootNode;
-
-    public UiModelTreeContentProvider(UiElementNode uiRootNode,
-            ElementDescriptor[] descriptorFilters) {
-        mUiRootNode = uiRootNode;
-        mDescriptorFilters = descriptorFilters;
-    }
-
-    /* (non-java doc)
-     * Returns all the UI node children of the given element or null if not the right kind
-     * of object. */
-    @Override
-    public Object[] getChildren(Object parentElement) {
-        if (parentElement instanceof UiElementNode) {
-            UiElementNode node = (UiElementNode) parentElement;
-            return node.getUiChildren().toArray();
-        }
-        return null;
-    }
-
-    /* (non-java doc)
-     * Returns the parent of a given UI node or null if it's a root node or it's not the
-     * right kind of node. */
-    @Override
-    public Object getParent(Object element) {
-        if (element instanceof UiElementNode) {
-            UiElementNode node = (UiElementNode) element;
-            return node.getUiParent();
-        }
-        return null;
-    }
-
-    /* (non-java doc)
-     * Returns true if the UI node has any UI children nodes. */
-    @Override
-    public boolean hasChildren(Object element) {
-        if (element instanceof UiElementNode) {
-            UiElementNode node = (UiElementNode) element;
-            return node.getUiChildren().size() > 0;
-        }
-        return false;
-    }
-
-    /* (non-java doc)
-     * Get root elements for the tree. These are all the UI nodes that
-     * match the filter descriptor in the current root node.
-     * <p/>
-     * Although not documented, it seems this method should not return null.
-     * At worse, it should return new Object[0].
-     * <p/>
-     * inputElement is not currently used. The root node and the filter are given
-     * by the enclosing class.
-     */
-    @Override
-    public Object[] getElements(Object inputElement) {
-        ArrayList<UiElementNode> roots = new ArrayList<UiElementNode>();
-        if (mUiRootNode != null) {
-            for (UiElementNode ui_node : mUiRootNode.getUiChildren()) {
-                if (mDescriptorFilters == null || mDescriptorFilters.length == 0) {
-                    roots.add(ui_node);
-                } else {
-                    for (ElementDescriptor filter : mDescriptorFilters) {
-                        if (ui_node.getDescriptor() == filter) {
-                            roots.add(ui_node);
-                        }
-                    }
-                }
-            }
-        }
-
-        return roots.toArray();
-    }
-
-    @Override
-    public void dispose() {
-        // pass
-    }
-
-    @Override
-    public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-        // pass
-    }
-}
-
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/ui/tree/UiModelTreeLabelProvider.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/ui/tree/UiModelTreeLabelProvider.java
deleted file mode 100644
index 3373197..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/ui/tree/UiModelTreeLabelProvider.java
+++ /dev/null
@@ -1,106 +0,0 @@
-/*
- * Copyright (C) 2007 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.editors.ui.tree;
-
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.ide.eclipse.adt.internal.editors.IconFactory;
-import com.android.ide.eclipse.adt.internal.editors.descriptors.ElementDescriptor;
-import com.android.ide.eclipse.adt.internal.editors.uimodel.UiElementNode;
-
-import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.jface.viewers.ILabelProviderListener;
-import org.eclipse.swt.graphics.Image;
-
-/**
- * UiModelTreeLabelProvider is a trivial implementation of {@link ILabelProvider}
- * where elements are expected to derive from {@link UiElementNode} or
- * from {@link ElementDescriptor}.
- *
- * It is used by both the master tree viewer and by the list in the Add... selection dialog.
- */
-public class UiModelTreeLabelProvider implements ILabelProvider {
-
-    public UiModelTreeLabelProvider() {
-    }
-
-    /**
-     * Returns the element's logo with a fallback on the android logo.
-     */
-    @Override
-    public Image getImage(Object element) {
-        ElementDescriptor desc = null;
-        UiElementNode node = null;
-
-        if (element instanceof ElementDescriptor) {
-            desc = (ElementDescriptor) element;
-        } else if (element instanceof UiElementNode) {
-            node = (UiElementNode) element;
-            desc = node.getDescriptor();
-        }
-
-        if (desc != null) {
-            Image img = desc.getCustomizedIcon();
-            if (img != null) {
-                if (node != null && node.hasError()) {
-                    return IconFactory.getInstance().addErrorIcon(img);
-                } else {
-                    return img;
-                }
-            }
-        }
-
-        return AdtPlugin.getAndroidLogo();
-    }
-
-    /**
-     * Uses UiElementNode.shortDescription for the label for this tree item.
-     */
-    @Override
-    public String getText(Object element) {
-        if (element instanceof ElementDescriptor) {
-            ElementDescriptor desc = (ElementDescriptor) element;
-            return desc.getUiName();
-        } else if (element instanceof UiElementNode) {
-            UiElementNode node = (UiElementNode) element;
-            return node.getShortDescription();
-        }
-        return element.toString();
-    }
-
-    @Override
-    public void addListener(ILabelProviderListener listener) {
-        // pass
-    }
-
-    @Override
-    public void dispose() {
-        // pass
-    }
-
-    @Override
-    public boolean isLabelProperty(Object element, String property) {
-        // pass
-        return false;
-    }
-
-    @Override
-    public void removeListener(ILabelProviderListener listener) {
-        // pass
-    }
-}
-
-
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/ui/tree/UiTreeBlock.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/ui/tree/UiTreeBlock.java
deleted file mode 100644
index d11b8a4..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/ui/tree/UiTreeBlock.java
+++ /dev/null
@@ -1,946 +0,0 @@
-/*
- * Copyright (C) 2007 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.editors.ui.tree;
-
-import com.android.ide.eclipse.adt.AdtPlugin;
-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.descriptors.ElementDescriptor;
-import com.android.ide.eclipse.adt.internal.editors.ui.SectionHelper;
-import com.android.ide.eclipse.adt.internal.editors.ui.SectionHelper.ManifestSectionPart;
-import com.android.ide.eclipse.adt.internal.editors.uimodel.IUiUpdateListener;
-import com.android.ide.eclipse.adt.internal.editors.uimodel.UiDocumentNode;
-import com.android.ide.eclipse.adt.internal.editors.uimodel.UiElementNode;
-import com.android.ide.eclipse.adt.internal.sdk.Sdk.ITargetChangeListener;
-import com.android.ide.eclipse.adt.internal.sdk.Sdk.TargetChangeListener;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.IMenuListener;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.action.MenuManager;
-import org.eclipse.jface.action.Separator;
-import org.eclipse.jface.action.ToolBarManager;
-import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.ITreeSelection;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.TreePath;
-import org.eclipse.jface.viewers.TreeSelection;
-import org.eclipse.jface.viewers.TreeViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerComparator;
-import org.eclipse.jface.viewers.ViewerFilter;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.dnd.Clipboard;
-import org.eclipse.swt.events.DisposeEvent;
-import org.eclipse.swt.events.DisposeListener;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Menu;
-import org.eclipse.swt.widgets.ToolBar;
-import org.eclipse.swt.widgets.Tree;
-import org.eclipse.ui.forms.DetailsPart;
-import org.eclipse.ui.forms.IDetailsPage;
-import org.eclipse.ui.forms.IDetailsPageProvider;
-import org.eclipse.ui.forms.IManagedForm;
-import org.eclipse.ui.forms.MasterDetailsBlock;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-import org.eclipse.ui.forms.widgets.Section;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.LinkedList;
-
-/**
- * {@link UiTreeBlock} is a {@link MasterDetailsBlock} which displays a tree view for
- * a specific set of {@link UiElementNode}.
- * <p/>
- * For a given UI element node, the tree view displays all first-level children that
- * match a given type (given by an {@link ElementDescriptor}. All children from these
- * nodes are also displayed.
- * <p/>
- * In the middle next to the tree are some controls to add or delete tree nodes.
- * On the left is a details part that displays all the visible UI attributes for a given
- * selected UI element node.
- */
-public final class UiTreeBlock extends MasterDetailsBlock implements ICommitXml {
-
-    /** Height hint for the tree view. Helps the grid layout resize properly on smaller screens. */
-    private static final int TREE_HEIGHT_HINT = 50;
-
-    /** Container editor */
-    AndroidXmlEditor mEditor;
-    /** The root {@link UiElementNode} which contains all the elements that are to be
-     *  manipulated by this tree view. In general this is the manifest UI node. */
-    private UiElementNode mUiRootNode;
-    /** The descriptor of the elements to be displayed as root in this tree view. All elements
-     *  of the same type in the root will be displayed. Can be null or empty to mean everything
-     *  can be displayed. */
-    private ElementDescriptor[] mDescriptorFilters;
-    /** The title for the master-detail part (displayed on the top "tab" on top of the tree) */
-    private String mTitle;
-    /** The description for the master-detail part (displayed on top of the tree view) */
-    private String mDescription;
-    /** The master-detail part, composed of a main tree and an auxiliary detail part */
-    private ManifestSectionPart mMasterPart;
-    /** The tree viewer in the master-detail part */
-    private TreeViewer mTreeViewer;
-    /** The "add" button for the tree view */
-    private Button mAddButton;
-    /** The "remove" button for the tree view */
-    private Button mRemoveButton;
-    /** The "up" button for the tree view */
-    private Button mUpButton;
-    /** The "down" button for the tree view */
-    private Button mDownButton;
-    /** The Managed Form used to create the master part */
-    private IManagedForm mManagedForm;
-    /** Reference to the details part of the tree master block. */
-    private DetailsPart mDetailsPart;
-    /** Reference to the clipboard for copy-paste */
-    private Clipboard mClipboard;
-    /** Listener to refresh the tree viewer when the parent's node has been updated */
-    private IUiUpdateListener mUiRefreshListener;
-    /** Listener to enable/disable the UI based on the application node's presence */
-    private IUiUpdateListener mUiEnableListener;
-    /** An adapter/wrapper to use the add/remove/up/down tree edit actions. */
-    private UiTreeActions mUiTreeActions;
-    /**
-     * True if the root node can be created on-demand (i.e. as needed as
-     * soon as children exist). False if an external entity controls the existence of the
-     * root node. In practise, this is false for the manifest application page (the actual
-     * "application" node is managed by the ApplicationToggle part) whereas it is true
-     * for all other tree pages.
-     */
-    private final boolean mAutoCreateRoot;
-
-
-    /**
-     * Creates a new {@link MasterDetailsBlock} that will display all UI nodes matching the
-     * given filter in the given root node.
-     *
-     * @param editor The parent manifest editor.
-     * @param uiRootNode The root {@link UiElementNode} which contains all the elements that are
-     *        to be manipulated by this tree view. In general this is the manifest UI node or the
-     *        application UI node. This cannot be null.
-     * @param autoCreateRoot True if the root node can be created on-demand (i.e. as needed as
-     *        soon as children exist). False if an external entity controls the existence of the
-     *        root node. In practise, this is false for the manifest application page (the actual
-     *        "application" node is managed by the ApplicationToggle part) whereas it is true
-     *        for all other tree pages.
-     * @param descriptorFilters A list of descriptors of the elements to be displayed as root in
-     *        this tree view. Use null or an empty list to accept any kind of node.
-     * @param title Title for the section
-     * @param description Description for the section
-     */
-    public UiTreeBlock(AndroidXmlEditor editor,
-            UiElementNode uiRootNode,
-            boolean autoCreateRoot,
-            ElementDescriptor[] descriptorFilters,
-            String title,
-            String description) {
-        mEditor = editor;
-        mUiRootNode = uiRootNode;
-        mAutoCreateRoot = autoCreateRoot;
-        mDescriptorFilters = descriptorFilters;
-        mTitle = title;
-        mDescription = description;
-    }
-
-    /** @returns The container editor */
-    AndroidXmlEditor getEditor() {
-        return mEditor;
-    }
-
-    /** @returns The reference to the clipboard for copy-paste */
-    Clipboard getClipboard() {
-        return mClipboard;
-    }
-
-    /** @returns The master-detail part, composed of a main tree and an auxiliary detail part */
-    ManifestSectionPart getMasterPart() {
-        return mMasterPart;
-    }
-
-    /**
-     * Returns the {@link UiElementNode} for the current model.
-     * <p/>
-     * This is used by the content provider attached to {@link #mTreeViewer} since
-     * the uiRootNode changes after each call to
-     * {@link #changeRootAndDescriptors(UiElementNode, ElementDescriptor[], boolean)}.
-     */
-    public UiElementNode getRootNode() {
-        return mUiRootNode;
-    }
-
-    @Override
-    protected void createMasterPart(final IManagedForm managedForm, Composite parent) {
-        FormToolkit toolkit = managedForm.getToolkit();
-
-        mManagedForm = managedForm;
-        mMasterPart = new ManifestSectionPart(parent, toolkit);
-        Section section = mMasterPart.getSection();
-        section.setText(mTitle);
-        section.setDescription(mDescription);
-        section.setLayout(new GridLayout());
-        section.setLayoutData(new GridData(GridData.FILL_BOTH));
-
-        Composite grid = SectionHelper.createGridLayout(section, toolkit, 2);
-
-        Tree tree = createTreeViewer(toolkit, grid, managedForm);
-        createButtons(toolkit, grid);
-        createTreeContextMenu(tree);
-        createSectionActions(section, toolkit);
-    }
-
-    private void createSectionActions(Section section, FormToolkit toolkit) {
-        ToolBarManager manager = new ToolBarManager(SWT.FLAT);
-        manager.removeAll();
-
-        ToolBar toolbar = manager.createControl(section);
-        section.setTextClient(toolbar);
-
-        ElementDescriptor[] descs = mDescriptorFilters;
-        if (descs == null && mUiRootNode != null) {
-            descs = mUiRootNode.getDescriptor().getChildren();
-        }
-
-        if (descs != null && descs.length > 1) {
-            for (ElementDescriptor desc : descs) {
-                manager.add(new DescriptorFilterAction(desc));
-            }
-        }
-
-        manager.add(new TreeSortAction());
-
-        manager.update(true /*force*/);
-    }
-
-    /**
-     * Creates the tree and its viewer
-     * @return The tree control
-     */
-    private Tree createTreeViewer(FormToolkit toolkit, Composite grid,
-            final IManagedForm managedForm) {
-        // Note: we *could* use a FilteredTree instead of the Tree+TreeViewer here.
-        // However the class must be adapted to create an adapted toolkit tree.
-        final Tree tree = toolkit.createTree(grid, SWT.MULTI);
-        GridData gd = new GridData(GridData.FILL_BOTH);
-        gd.widthHint = AndroidXmlEditor.TEXT_WIDTH_HINT;
-        gd.heightHint = TREE_HEIGHT_HINT;
-        tree.setLayoutData(gd);
-
-        mTreeViewer = new TreeViewer(tree);
-        mTreeViewer.setContentProvider(new UiModelTreeContentProvider(mUiRootNode, mDescriptorFilters));
-        mTreeViewer.setLabelProvider(new UiModelTreeLabelProvider());
-        mTreeViewer.setInput("unused"); //$NON-NLS-1$
-
-        // Create a listener that reacts to selections on the tree viewer.
-        // When a selection is made, ask the managed form to propagate an event to
-        // all parts in the managed form.
-        // This is picked up by UiElementDetail.selectionChanged().
-        mTreeViewer.addSelectionChangedListener(new ISelectionChangedListener() {
-            @Override
-            public void selectionChanged(SelectionChangedEvent event) {
-                managedForm.fireSelectionChanged(mMasterPart, event.getSelection());
-                adjustTreeButtons(event.getSelection());
-            }
-        });
-
-        // Create three listeners:
-        // - One to refresh the tree viewer when the parent's node has been updated
-        // - One to refresh the tree viewer when the framework resources have changed
-        // - One to enable/disable the UI based on the application node's presence.
-        mUiRefreshListener = new IUiUpdateListener() {
-            @Override
-            public void uiElementNodeUpdated(UiElementNode ui_node, UiUpdateState state) {
-                mTreeViewer.refresh();
-            }
-        };
-
-        mUiEnableListener = new IUiUpdateListener() {
-            @Override
-            public void uiElementNodeUpdated(UiElementNode ui_node, UiUpdateState state) {
-                // The UiElementNode for the application XML node always exists, even
-                // if there is no corresponding XML node in the XML file.
-                //
-                // Normally, we enable the UI here if the XML node is not null.
-                //
-                // However if mAutoCreateRoot is true, the root node will be created on-demand
-                // so the tree/block is always enabled.
-                boolean exists = mAutoCreateRoot || (ui_node.getXmlNode() != null);
-                if (mMasterPart != null) {
-                    Section section = mMasterPart.getSection();
-                    if (section.getEnabled() != exists) {
-                        section.setEnabled(exists);
-                        for (Control c : section.getChildren()) {
-                            c.setEnabled(exists);
-                        }
-                    }
-                }
-            }
-        };
-
-        /** Listener to update the root node if the target of the file is changed because of a
-         * SDK location change or a project target change */
-        final ITargetChangeListener targetListener = new TargetChangeListener() {
-            @Override
-            public IProject getProject() {
-                if (mEditor != null) {
-                    return mEditor.getProject();
-                }
-
-                return null;
-            }
-
-            @Override
-            public void reload() {
-                // If a details part has been created, we need to "refresh" it too.
-                if (mDetailsPart != null) {
-                    // The details part does not directly expose access to its internal
-                    // page book. Instead it is possible to resize the page book to 0 and then
-                    // back to its original value, which has the side effect of removing all
-                    // existing cached pages.
-                    int limit = mDetailsPart.getPageLimit();
-                    mDetailsPart.setPageLimit(0);
-                    mDetailsPart.setPageLimit(limit);
-                }
-                // Refresh the tree, preserving the selection if possible.
-                mTreeViewer.refresh();
-            }
-        };
-
-        // Setup the listeners
-        changeRootAndDescriptors(mUiRootNode, mDescriptorFilters, false /* refresh */);
-
-        // Listen on resource framework changes to refresh the tree
-        AdtPlugin.getDefault().addTargetListener(targetListener);
-
-        // Remove listeners when the tree widget gets disposed.
-        tree.addDisposeListener(new DisposeListener() {
-            @Override
-            public void widgetDisposed(DisposeEvent e) {
-                if (mUiRootNode != null) {
-                    UiElementNode node = mUiRootNode.getUiParent() != null ?
-                                            mUiRootNode.getUiParent() :
-                                            mUiRootNode;
-
-                    if (node != null) {
-                        node.removeUpdateListener(mUiRefreshListener);
-                    }
-                    mUiRootNode.removeUpdateListener(mUiEnableListener);
-                }
-
-                AdtPlugin.getDefault().removeTargetListener(targetListener);
-                if (mClipboard != null) {
-                    mClipboard.dispose();
-                    mClipboard = null;
-                }
-            }
-        });
-
-        // Get a new clipboard reference. It is disposed when the tree is disposed.
-        mClipboard = new Clipboard(tree.getDisplay());
-
-        return tree;
-    }
-
-    /**
-     * Changes the UI root node and the descriptor filters of the tree.
-     * <p/>
-     * This removes the listeners attached to the old root node and reattaches them to the
-     * new one.
-     *
-     * @param uiRootNode The root {@link UiElementNode} which contains all the elements that are
-     *        to be manipulated by this tree view. In general this is the manifest UI node or the
-     *        application UI node. This cannot be null.
-     * @param descriptorFilters A list of descriptors of the elements to be displayed as root in
-     *        this tree view. Use null or an empty list to accept any kind of node.
-     * @param forceRefresh If tree, forces the tree to refresh
-     */
-    public void changeRootAndDescriptors(UiElementNode uiRootNode,
-            ElementDescriptor[] descriptorFilters, boolean forceRefresh) {
-        UiElementNode node;
-
-        // Remove previous listeners if any
-        if (mUiRootNode != null) {
-            node = mUiRootNode.getUiParent() != null ? mUiRootNode.getUiParent() : mUiRootNode;
-            node.removeUpdateListener(mUiRefreshListener);
-            mUiRootNode.removeUpdateListener(mUiEnableListener);
-        }
-
-        mUiRootNode = uiRootNode;
-        mDescriptorFilters = descriptorFilters;
-
-        mTreeViewer.setContentProvider(
-                new UiModelTreeContentProvider(mUiRootNode, mDescriptorFilters));
-
-        // Listen on structural changes on the root node of the tree
-        // If the node has a parent, listen on the parent instead.
-        if (mUiRootNode != null) {
-            node = mUiRootNode.getUiParent() != null ? mUiRootNode.getUiParent() : mUiRootNode;
-
-            if (node != null) {
-                node.addUpdateListener(mUiRefreshListener);
-            }
-
-            // Use the root node to listen to its presence.
-            mUiRootNode.addUpdateListener(mUiEnableListener);
-
-            // Initialize the enabled/disabled state
-            mUiEnableListener.uiElementNodeUpdated(mUiRootNode, null /* state, not used */);
-        }
-
-        if (forceRefresh) {
-            mTreeViewer.refresh();
-        }
-
-        createSectionActions(mMasterPart.getSection(), mManagedForm.getToolkit());
-    }
-
-    /**
-     * Creates the buttons next to the tree.
-     */
-    private void createButtons(FormToolkit toolkit, Composite grid) {
-
-        mUiTreeActions = new UiTreeActions();
-
-        Composite button_grid = SectionHelper.createGridLayout(grid, toolkit, 1);
-        button_grid.setLayoutData(new GridData(GridData.VERTICAL_ALIGN_BEGINNING));
-        mAddButton = toolkit.createButton(button_grid, "Add...", SWT.PUSH);
-        SectionHelper.addControlTooltip(mAddButton, "Adds a new element.");
-        mAddButton.setLayoutData(new GridData(GridData.FILL_HORIZONTAL |
-                GridData.VERTICAL_ALIGN_BEGINNING));
-
-        mAddButton.addSelectionListener(new SelectionAdapter() {
-            @Override
-            public void widgetSelected(SelectionEvent e) {
-                super.widgetSelected(e);
-                doTreeAdd();
-            }
-        });
-
-        mRemoveButton = toolkit.createButton(button_grid, "Remove...", SWT.PUSH);
-        SectionHelper.addControlTooltip(mRemoveButton, "Removes an existing selected element.");
-        mRemoveButton.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-
-        mRemoveButton.addSelectionListener(new SelectionAdapter() {
-            @Override
-            public void widgetSelected(SelectionEvent e) {
-                super.widgetSelected(e);
-                doTreeRemove();
-            }
-        });
-
-        mUpButton = toolkit.createButton(button_grid, "Up", SWT.PUSH);
-        SectionHelper.addControlTooltip(mRemoveButton, "Moves the selected element up.");
-        mUpButton.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-
-        mUpButton.addSelectionListener(new SelectionAdapter() {
-            @Override
-            public void widgetSelected(SelectionEvent e) {
-                super.widgetSelected(e);
-                doTreeUp();
-            }
-        });
-
-        mDownButton = toolkit.createButton(button_grid, "Down", SWT.PUSH);
-        SectionHelper.addControlTooltip(mRemoveButton, "Moves the selected element down.");
-        mDownButton.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-
-        mDownButton.addSelectionListener(new SelectionAdapter() {
-            @Override
-            public void widgetSelected(SelectionEvent e) {
-                super.widgetSelected(e);
-                doTreeDown();
-            }
-        });
-
-        adjustTreeButtons(TreeSelection.EMPTY);
-    }
-
-    private void createTreeContextMenu(Tree tree) {
-        MenuManager menuManager = new MenuManager();
-        menuManager.setRemoveAllWhenShown(true);
-        menuManager.addMenuListener(new IMenuListener() {
-            /**
-             * The menu is about to be shown. The menu manager has already been
-             * requested to remove any existing menu item. This method gets the
-             * tree selection and if it is of the appropriate type it re-creates
-             * the necessary actions.
-             */
-           @Override
-        public void menuAboutToShow(IMenuManager manager) {
-               ISelection selection = mTreeViewer.getSelection();
-               if (!selection.isEmpty() && selection instanceof ITreeSelection) {
-                   ArrayList<UiElementNode> selected = filterSelection((ITreeSelection) selection);
-                   doCreateMenuAction(manager, selected);
-                   return;
-               }
-               doCreateMenuAction(manager, null /* ui_node */);
-            }
-        });
-        Menu contextMenu = menuManager.createContextMenu(tree);
-        tree.setMenu(contextMenu);
-    }
-
-    /**
-     * Adds the menu actions to the context menu when the given UI node is selected in
-     * the tree view.
-     *
-     * @param manager The context menu manager
-     * @param selected The UI nodes selected in the tree. Can be null, in which case the root
-     *                is to be modified.
-     */
-    private void doCreateMenuAction(IMenuManager manager, ArrayList<UiElementNode> selected) {
-        if (selected != null) {
-            boolean hasXml = false;
-            for (UiElementNode uiNode : selected) {
-                if (uiNode.getXmlNode() != null) {
-                    hasXml = true;
-                    break;
-                }
-            }
-
-            if (hasXml) {
-                manager.add(new CopyCutAction(getEditor(), getClipboard(),
-                        null, selected, true /* cut */));
-                manager.add(new CopyCutAction(getEditor(), getClipboard(),
-                        null, selected, false /* cut */));
-
-                // Can't paste with more than one element selected (the selection is the target)
-                if (selected.size() <= 1) {
-                    // Paste is not valid if it would add a second element on a terminal element
-                    // which parent is a document -- an XML document can only have one child. This
-                    // means paste is valid if the current UI node can have children or if the
-                    // parent is not a document.
-                    UiElementNode ui_root = selected.get(0).getUiRoot();
-                    if (ui_root.getDescriptor().hasChildren() ||
-                            !(ui_root.getUiParent() instanceof UiDocumentNode)) {
-                        manager.add(new PasteAction(getEditor(), getClipboard(), selected.get(0)));
-                    }
-                }
-                manager.add(new Separator());
-            }
-        }
-
-        // Append "add" and "remove" actions. They do the same thing as the add/remove
-        // buttons on the side.
-        IconFactory factory = IconFactory.getInstance();
-
-        // "Add" makes sense only if there's 0 or 1 item selected since the
-        // one selected item becomes the target.
-        if (selected == null || selected.size() <= 1) {
-            manager.add(new Action("Add...", factory.getImageDescriptor("add")) { //$NON-NLS-1$
-                @Override
-                public void run() {
-                    super.run();
-                    doTreeAdd();
-                }
-            });
-        }
-
-        if (selected != null) {
-            if (selected != null) {
-                manager.add(new Action("Remove", factory.getImageDescriptor("delete")) { //$NON-NLS-1$
-                    @Override
-                    public void run() {
-                        super.run();
-                        doTreeRemove();
-                    }
-                });
-            }
-            manager.add(new Separator());
-
-            manager.add(new Action("Up", factory.getImageDescriptor("up")) { //$NON-NLS-1$
-                @Override
-                public void run() {
-                    super.run();
-                    doTreeUp();
-                }
-            });
-            manager.add(new Action("Down", factory.getImageDescriptor("down")) { //$NON-NLS-1$
-                @Override
-                public void run() {
-                    super.run();
-                    doTreeDown();
-                }
-            });
-        }
-    }
-
-
-    /**
-     * This is called by the tree when a selection is made.
-     * It enables/disables the buttons associated with the tree depending on the current
-     * selection.
-     *
-     * @param selection The current tree selection (same as mTreeViewer.getSelection())
-     */
-    private void adjustTreeButtons(ISelection selection) {
-        mRemoveButton.setEnabled(!selection.isEmpty() && selection instanceof ITreeSelection);
-        mUpButton.setEnabled(canDoTreeUp(selection));
-        mDownButton.setEnabled(canDoTreeDown(selection));
-    }
-
-    /**
-     * An adapter/wrapper to use the add/remove/up/down tree edit actions.
-     */
-    private class UiTreeActions extends UiActions {
-        @Override
-        protected UiElementNode getRootNode() {
-            return mUiRootNode;
-        }
-
-        @Override
-        protected void selectUiNode(UiElementNode uiNodeToSelect) {
-            // Select the new item
-            if (uiNodeToSelect != null) {
-                LinkedList<UiElementNode> segments = new LinkedList<UiElementNode>();
-                for (UiElementNode ui_node = uiNodeToSelect; ui_node != mUiRootNode;
-                        ui_node = ui_node.getUiParent()) {
-                    segments.add(0, ui_node);
-                }
-                if (segments.size() > 0) {
-                    mTreeViewer.setSelection(new TreeSelection(new TreePath(segments.toArray())));
-                } else {
-                    mTreeViewer.setSelection(null);
-                }
-            }
-        }
-
-        @Override
-        public void commitPendingXmlChanges() {
-            commitManagedForm();
-        }
-    }
-
-    /**
-     * Filters an ITreeSelection to only keep the {@link UiElementNode}s (in case there's
-     * something else in there).
-     *
-     * @return A new list of {@link UiElementNode} with at least one item or null.
-     */
-    private ArrayList<UiElementNode> filterSelection(ITreeSelection selection) {
-        ArrayList<UiElementNode> selected = new ArrayList<UiElementNode>();
-
-        for (Iterator<Object> it = selection.iterator(); it.hasNext(); ) {
-            Object selectedObj = it.next();
-
-            if (selectedObj instanceof UiElementNode) {
-                selected.add((UiElementNode) selectedObj);
-            }
-        }
-
-        return selected.size() > 0 ? selected : null;
-    }
-
-    /**
-     * Called when the "Add..." button next to the tree view is selected.
-     *
-     * Displays a selection dialog that lets the user select which kind of node
-     * to create, depending on the current selection.
-     */
-    private void doTreeAdd() {
-        UiElementNode ui_node = mUiRootNode;
-        ISelection selection = mTreeViewer.getSelection();
-        if (!selection.isEmpty() && selection instanceof ITreeSelection) {
-            ITreeSelection tree_selection = (ITreeSelection) selection;
-            Object first = tree_selection.getFirstElement();
-            if (first != null && first instanceof UiElementNode) {
-                ui_node = (UiElementNode) first;
-            }
-        }
-
-        mUiTreeActions.doAdd(
-                ui_node,
-                mDescriptorFilters,
-                mTreeViewer.getControl().getShell(),
-                (ILabelProvider) mTreeViewer.getLabelProvider());
-    }
-
-    /**
-     * Called when the "Remove" button is selected.
-     *
-     * If the tree has a selection, remove it.
-     * This simply deletes the XML node attached to the UI node: when the XML model fires the
-     * update event, the tree will get refreshed.
-     */
-    protected void doTreeRemove() {
-        ISelection selection = mTreeViewer.getSelection();
-        if (!selection.isEmpty() && selection instanceof ITreeSelection) {
-            ArrayList<UiElementNode> selected = filterSelection((ITreeSelection) selection);
-            mUiTreeActions.doRemove(selected, mTreeViewer.getControl().getShell());
-        }
-    }
-
-    /**
-     * Called when the "Up" button is selected.
-     * <p/>
-     * If the tree has a selection, move it up, either in the child list or as the last child
-     * of the previous parent.
-     */
-    protected void doTreeUp() {
-        ISelection selection = mTreeViewer.getSelection();
-        if (!selection.isEmpty() && selection instanceof ITreeSelection) {
-            ArrayList<UiElementNode> selected = filterSelection((ITreeSelection) selection);
-            mUiTreeActions.doUp(selected, mDescriptorFilters);
-        }
-    }
-
-    /**
-     * Checks whether the "up" action can be done on the current selection.
-     *
-     * @param selection The current tree selection.
-     * @return True if all the selected nodes can be moved up.
-     */
-    protected boolean canDoTreeUp(ISelection selection) {
-        if (!selection.isEmpty() && selection instanceof ITreeSelection) {
-            ArrayList<UiElementNode> selected = filterSelection((ITreeSelection) selection);
-            return mUiTreeActions.canDoUp(selected, mDescriptorFilters);
-        }
-
-        return false;
-    }
-
-    /**
-     * Called when the "Down" button is selected.
-     *
-     * If the tree has a selection, move it down, either in the same child list or as the
-     * first child of the next parent.
-     */
-    protected void doTreeDown() {
-        ISelection selection = mTreeViewer.getSelection();
-        if (!selection.isEmpty() && selection instanceof ITreeSelection) {
-            ArrayList<UiElementNode> selected = filterSelection((ITreeSelection) selection);
-            mUiTreeActions.doDown(selected, mDescriptorFilters);
-        }
-    }
-
-    /**
-     * Checks whether the "down" action can be done on the current selection.
-     *
-     * @param selection The current tree selection.
-     * @return True if all the selected nodes can be moved down.
-     */
-    protected boolean canDoTreeDown(ISelection selection) {
-        if (!selection.isEmpty() && selection instanceof ITreeSelection) {
-            ArrayList<UiElementNode> selected = filterSelection((ITreeSelection) selection);
-            return mUiTreeActions.canDoDown(selected, mDescriptorFilters);
-        }
-
-        return false;
-    }
-
-    /**
-     * Commits the current managed form (the one associated with our master part).
-     * As a side effect, this will commit the current UiElementDetails page.
-     */
-    void commitManagedForm() {
-        if (mManagedForm != null) {
-            mManagedForm.commit(false /* onSave */);
-        }
-    }
-
-    /* Implements ICommitXml for CopyCutAction */
-    @Override
-    public void commitPendingXmlChanges() {
-        commitManagedForm();
-    }
-
-    @Override
-    protected void createToolBarActions(IManagedForm managedForm) {
-        // Pass. Not used, toolbar actions are defined by createSectionActions().
-    }
-
-    @Override
-    protected void registerPages(DetailsPart inDetailsPart) {
-        // Keep a reference on the details part (the super class doesn't provide a getter
-        // for it.)
-        mDetailsPart = inDetailsPart;
-
-        // The page selection mechanism does not use pages registered by association with
-        // a node class. Instead it uses a custom details page provider that provides a
-        // new UiElementDetail instance for each node instance. A limit of 5 pages is
-        // then set (the value is arbitrary but should be reasonable) for the internal
-        // page book.
-        inDetailsPart.setPageLimit(5);
-
-        final UiTreeBlock tree = this;
-
-        inDetailsPart.setPageProvider(new IDetailsPageProvider() {
-            @Override
-            public IDetailsPage getPage(Object key) {
-                if (key instanceof UiElementNode) {
-                    return new UiElementDetail(tree);
-                }
-                return null;
-            }
-
-            @Override
-            public Object getPageKey(Object object) {
-                return object;  // use node object as key
-            }
-        });
-    }
-
-    /**
-     * An alphabetic sort action for the tree viewer.
-     */
-    private class TreeSortAction extends Action {
-
-        private ViewerComparator mComparator;
-
-        public TreeSortAction() {
-            super("Sorts elements alphabetically.", AS_CHECK_BOX);
-            setImageDescriptor(IconFactory.getInstance().getImageDescriptor("az_sort")); //$NON-NLS-1$
-
-            if (mTreeViewer != null) {
-                boolean is_sorted = mTreeViewer.getComparator() != null;
-                setChecked(is_sorted);
-            }
-        }
-
-        /**
-         * Called when the button is selected. Toggles the tree viewer comparator.
-         */
-        @Override
-        public void run() {
-            if (mTreeViewer == null) {
-                notifyResult(false /*success*/);
-                return;
-            }
-
-            ViewerComparator comp = mTreeViewer.getComparator();
-            if (comp != null) {
-                // Tree is currently sorted.
-                // Save currently comparator and remove it
-                mComparator = comp;
-                mTreeViewer.setComparator(null);
-            } else {
-                // Tree is not currently sorted.
-                // Reuse or add a new comparator.
-                if (mComparator == null) {
-                    mComparator = new ViewerComparator();
-                }
-                mTreeViewer.setComparator(mComparator);
-            }
-
-            notifyResult(true /*success*/);
-        }
-    }
-
-    /**
-     * A filter on descriptor for the tree viewer.
-     * <p/>
-     * The tree viewer will contain many of these actions and only one can be enabled at a
-     * given time. When no action is selected, everything is displayed.
-     * <p/>
-     * Since "radio"-like actions do not allow for unselecting all of them, we manually
-     * handle the exclusive radio button-like property: when an action is selected, it manually
-     * removes all other actions as needed.
-     */
-    private class DescriptorFilterAction extends Action {
-
-        private final ElementDescriptor mDescriptor;
-        private ViewerFilter mFilter;
-
-        public DescriptorFilterAction(ElementDescriptor descriptor) {
-            super(String.format("Displays only %1$s elements.", descriptor.getUiName()),
-                    AS_CHECK_BOX);
-
-            mDescriptor = descriptor;
-            setImageDescriptor(descriptor.getImageDescriptor());
-        }
-
-        /**
-         * Called when the button is selected.
-         * <p/>
-         * Find any existing {@link DescriptorFilter}s and remove them. Install ours.
-         */
-        @Override
-        public void run() {
-            super.run();
-
-            if (isChecked()) {
-                if (mFilter == null) {
-                    // create filter when required
-                    mFilter = new DescriptorFilter(this);
-                }
-
-                // we add our filter first, otherwise the UI might show the full list
-                mTreeViewer.addFilter(mFilter);
-
-                // Then remove the any other filters except ours. There should be at most
-                // one other filter, since that's how the actions are made to look like
-                // exclusive radio buttons.
-                for (ViewerFilter filter : mTreeViewer.getFilters()) {
-                    if (filter instanceof DescriptorFilter && filter != mFilter) {
-                        DescriptorFilterAction action = ((DescriptorFilter) filter).getAction();
-                        action.setChecked(false);
-                        mTreeViewer.removeFilter(filter);
-                    }
-                }
-            } else if (mFilter != null){
-                mTreeViewer.removeFilter(mFilter);
-            }
-        }
-
-        /**
-         * Filters the tree viewer for the given descriptor.
-         * <p/>
-         * The filter is linked to the action so that an action can iterate through the list
-         * of filters and un-select the actions.
-         */
-        private class DescriptorFilter extends ViewerFilter {
-
-            private final DescriptorFilterAction mAction;
-
-            public DescriptorFilter(DescriptorFilterAction action) {
-                mAction = action;
-            }
-
-            public DescriptorFilterAction getAction() {
-                return mAction;
-            }
-
-            /**
-             * Returns true if an element should be displayed, that if the element or
-             * any of its parent matches the requested descriptor.
-             */
-            @Override
-            public boolean select(Viewer viewer, Object parentElement, Object element) {
-                while (element instanceof UiElementNode) {
-                    UiElementNode uiNode = (UiElementNode)element;
-                    if (uiNode.getDescriptor() == mDescriptor) {
-                        return true;
-                    }
-                    element = uiNode.getUiParent();
-                }
-                return false;
-            }
-        }
-    }
-
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/uimodel/IUiSettableAttributeNode.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/uimodel/IUiSettableAttributeNode.java
deleted file mode 100644
index dd908ad..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/uimodel/IUiSettableAttributeNode.java
+++ /dev/null
@@ -1,32 +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.eclipse.adt.internal.editors.uimodel;
-
-/**
- * This interface decoration indicates that a given UiAttributeNode can both
- * set and get its current value.
- */
-public interface IUiSettableAttributeNode {
-
-    /** Returns the current value of the node. */
-    public String getCurrentValue();
-    
-    /** Sets the current value of the node. Cannot be null (use an empty string). */
-    public void setCurrentValue(String value);
-
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/uimodel/IUiUpdateListener.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/uimodel/IUiUpdateListener.java
deleted file mode 100644
index a4f1f74..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/uimodel/IUiUpdateListener.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Copyright (C) 2007 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.editors.uimodel;
-
-
-/**
- * Listen to update notifications in UI nodes.
- */
-public interface IUiUpdateListener {
-
-    /** Update state of the UI node */
-    public enum UiUpdateState {
-        /** The node's attributes have been updated. They may or may not actually have changed. */
-        ATTR_UPDATED,
-        /** The node sub-structure (i.e. child nodes) has changed */
-        CHILDREN_CHANGED,
-        /** The XML counterpart for the UI node has just been created. */
-        CREATED,
-        /** The XML counterpart for the UI node has just been deleted.
-         *  Note that mandatory UI nodes are never actually deleted. */
-        DELETED
-    }
-
-    /**
-     * Indicates that an UiElementNode has been updated.
-     * <p/>
-     * This happens when an {@link UiElementNode} is refreshed to match the
-     * XML model. The actual UI element node may or may not have changed.
-     * 
-     * @param ui_node The {@link UiElementNode} being updated.
-     */
-    public void uiElementNodeUpdated(UiElementNode ui_node, UiUpdateState state);
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/uimodel/UiAbstractTextAttributeNode.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/uimodel/UiAbstractTextAttributeNode.java
deleted file mode 100644
index 4f79590..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/uimodel/UiAbstractTextAttributeNode.java
+++ /dev/null
@@ -1,120 +0,0 @@
-/*
- * Copyright (C) 2007 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.editors.uimodel;
-
-import com.android.ide.eclipse.adt.internal.editors.descriptors.AttributeDescriptor;
-
-import org.w3c.dom.Node;
-
-/**
- * Represents an XML attribute in that can be modified using a simple text field
- * in the XML editor's user interface.
- * <p/>
- * The XML attribute has no default value. When unset, the text field is blank.
- * When updating the XML, if the field is empty, the attribute will be removed
- * from the XML element.
- * <p/>
- * See {@link UiAttributeNode} for more information.
- */
-public abstract class UiAbstractTextAttributeNode extends UiAttributeNode
-    implements IUiSettableAttributeNode {
-
-    protected static final String DEFAULT_VALUE = "";  //$NON-NLS-1$
-
-    /** Prevent internal listener from firing when internally modifying the text */
-    private boolean mInternalTextModification;
-    /** Last value read from the XML model. Cannot be null. */
-    private String mCurrentValue = DEFAULT_VALUE;
-
-    public UiAbstractTextAttributeNode(AttributeDescriptor attributeDescriptor,
-            UiElementNode uiParent) {
-        super(attributeDescriptor, uiParent);
-    }
-
-    /** Returns the current value of the node. */
-    @Override
-    public final String getCurrentValue() {
-        return mCurrentValue;
-    }
-
-    /** Sets the current value of the node. Cannot be null (use an empty string). */
-    @Override
-    public final void setCurrentValue(String value) {
-        mCurrentValue = value;
-    }
-
-    /** Returns if the attribute node is valid, and its UI has been created. */
-    public abstract boolean isValid();
-
-    /** Returns the text value present in the UI. */
-    public abstract String getTextWidgetValue();
-
-    /** Sets the text value to be displayed in the UI. */
-    public abstract void setTextWidgetValue(String value);
-
-
-    /**
-     * Updates the current text field's value when the XML has changed.
-     * <p/>
-     * The caller doesn't really know if attributes have changed,
-     * so it will call this to refresh the attribute anyway. The value
-     * is only set if it has changed.
-     * <p/>
-     * This also resets the "dirty" flag.
-    */
-    @Override
-    public void updateValue(Node xml_attribute_node) {
-        mCurrentValue = DEFAULT_VALUE;
-        if (xml_attribute_node != null) {
-            mCurrentValue = xml_attribute_node.getNodeValue();
-        }
-
-        if (isValid() && !getTextWidgetValue().equals(mCurrentValue)) {
-            try {
-                mInternalTextModification = true;
-                setTextWidgetValue(mCurrentValue);
-                setDirty(false);
-            } finally {
-                mInternalTextModification = false;
-            }
-        }
-    }
-
-    /* (non-java doc)
-     * Called by the user interface when the editor is saved or its state changed
-     * and the modified attributes must be committed (i.e. written) to the XML model.
-     */
-    @Override
-    public void commit() {
-        UiElementNode parent = getUiParent();
-        if (parent != null && isValid() && isDirty()) {
-            String value = getTextWidgetValue();
-            if (parent.commitAttributeToXml(this, value)) {
-                mCurrentValue = value;
-                setDirty(false);
-            }
-        }
-    }
-
-    protected final boolean isInInternalTextModification() {
-        return mInternalTextModification;
-    }
-
-    protected final void setInInternalTextModification(boolean internalTextModification) {
-        mInternalTextModification = internalTextModification;
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/uimodel/UiAttributeNode.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/uimodel/UiAttributeNode.java
deleted file mode 100644
index ffe637c..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/uimodel/UiAttributeNode.java
+++ /dev/null
@@ -1,174 +0,0 @@
-/*
- * Copyright (C) 2007 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.editors.uimodel;
-
-import com.android.ide.common.xml.XmlAttributeSortOrder;
-import com.android.ide.eclipse.adt.internal.editors.AndroidXmlEditor;
-import com.android.ide.eclipse.adt.internal.editors.descriptors.AttributeDescriptor;
-
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.forms.IManagedForm;
-import org.w3c.dom.Node;
-
-/**
- * Represents an XML attribute that can be modified by the XML editor's user interface.
- * <p/>
- * The characteristics of an {@link UiAttributeNode} are declared by a
- * corresponding {@link AttributeDescriptor}.
- * <p/>
- * This is an abstract class. Derived classes must implement the creation of the UI
- * and manage its synchronization with the XML.
- */
-public abstract class UiAttributeNode implements Comparable<UiAttributeNode> {
-
-    private AttributeDescriptor mDescriptor;
-    private UiElementNode mUiParent;
-    private boolean mIsDirty;
-    private boolean mHasError;
-
-    /** Creates a new {@link UiAttributeNode} linked to a specific {@link AttributeDescriptor}
-     * and the corresponding runtime {@link UiElementNode} parent. */
-    public UiAttributeNode(AttributeDescriptor attributeDescriptor, UiElementNode uiParent) {
-        mDescriptor = attributeDescriptor;
-        mUiParent = uiParent;
-    }
-
-    /** Returns the {@link AttributeDescriptor} specific to this UI attribute node */
-    public final AttributeDescriptor getDescriptor() {
-        return mDescriptor;
-    }
-
-    /** Returns the {@link UiElementNode} that owns this {@link UiAttributeNode} */
-    public final UiElementNode getUiParent() {
-        return mUiParent;
-    }
-
-    /** Returns the current value of the node. */
-    public abstract String getCurrentValue();
-
-    /**
-     * @return True if the attribute has been changed since it was last loaded
-     *         from the XML model.
-     */
-    public final boolean isDirty() {
-        return mIsDirty;
-    }
-
-    /**
-     * Sets whether the attribute is dirty and also notifies the editor some part's dirty
-     * flag as changed.
-     * <p/>
-     * Subclasses should set the to true as a result of user interaction with the widgets in
-     * the section and then should set to false when the commit() method completed.
-     *
-     * @param isDirty the new value to set the dirty-flag to
-     */
-    public void setDirty(boolean isDirty) {
-        boolean wasDirty = mIsDirty;
-        mIsDirty = isDirty;
-        // TODO: for unknown attributes, getParent() != null && getParent().getEditor() != null
-        if (wasDirty != isDirty) {
-            AndroidXmlEditor editor = getUiParent().getEditor();
-            if (editor != null) {
-                editor.editorDirtyStateChanged();
-            }
-        }
-    }
-
-    /**
-     * Sets the error flag value.
-     * @param errorFlag the error flag
-     */
-    public final void setHasError(boolean errorFlag) {
-        mHasError = errorFlag;
-    }
-
-    /**
-     * Returns whether this node has errors.
-     */
-    public final boolean hasError() {
-        return mHasError;
-    }
-
-    /**
-     * Called once by the parent user interface to creates the necessary
-     * user interface to edit this attribute.
-     * <p/>
-     * This method can be called more than once in the life cycle of an UI node,
-     * typically when the UI is part of a master-detail tree, as pages are swapped.
-     *
-     * @param parent The composite where to create the user interface.
-     * @param managedForm The managed form owning this part.
-     */
-    public abstract void createUiControl(Composite parent, IManagedForm managedForm);
-
-    /**
-     * Used to get a list of all possible values for this UI attribute.
-     * <p/>
-     * This is used, among other things, by the XML Content Assists to complete values
-     * for an attribute.
-     * <p/>
-     * Implementations that do not have any known values should return null.
-     *
-     * @param prefix An optional prefix string, which is whatever the user has already started
-     *   typing. Can be null or an empty string. The implementation can use this to filter choices
-     *   and only return strings that match this prefix. A lazy or default implementation can
-     *   simply ignore this and return everything.
-     * @return A list of possible completion values, and empty array or null.
-     */
-    public abstract String[] getPossibleValues(String prefix);
-
-    /**
-     * Called when the XML is being loaded or has changed to
-     * update the value held by this user interface attribute node.
-     * <p/>
-     * The XML Node <em>may</em> be null, which denotes that the attribute is not
-     * specified in the XML model. In general, this means the "default" value of the
-     * attribute should be used.
-     * <p/>
-     * The caller doesn't really know if attributes have changed,
-     * so it will call this to refresh the attribute anyway. It's up to the
-     * UI implementation to minimize refreshes.
-     *
-     * @param node the node to read the value from
-     */
-    public abstract void updateValue(Node node);
-
-    /**
-     * Called by the user interface when the editor is saved or its state changed
-     * and the modified attributes must be committed (i.e. written) to the XML model.
-     * <p/>
-     * Important behaviors:
-     * <ul>
-     * <li>The caller *must* have called IStructuredModel.aboutToChangeModel before.
-     *     The implemented methods must assume it is safe to modify the XML model.
-     * <li>On success, the implementation *must* call setDirty(false).
-     * <li>On failure, the implementation can fail with an exception, which
-     *     is trapped and logged by the caller, or do nothing, whichever is more
-     *     appropriate.
-     * </ul>
-     */
-    public abstract void commit();
-
-    // ---- Implements Comparable ----
-
-    @Override
-    public int compareTo(UiAttributeNode o) {
-        return XmlAttributeSortOrder.compareAttributes(mDescriptor.getXmlLocalName(),
-                o.mDescriptor.getXmlLocalName());
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/uimodel/UiDocumentNode.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/uimodel/UiDocumentNode.java
deleted file mode 100644
index 1a85ea6..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/uimodel/UiDocumentNode.java
+++ /dev/null
@@ -1,160 +0,0 @@
-/*
- * 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.editors.uimodel;
-
-import com.android.ide.eclipse.adt.internal.editors.descriptors.DocumentDescriptor;
-import com.android.ide.eclipse.adt.internal.editors.uimodel.IUiUpdateListener.UiUpdateState;
-
-import org.w3c.dom.Document;
-import org.w3c.dom.Node;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * Represents an XML document node that can be modified by the user interface in the XML editor.
- * <p/>
- * The structure of a given {@link UiDocumentNode} is declared by a corresponding
- * {@link DocumentDescriptor}.
- */
-public class UiDocumentNode extends UiElementNode {
-
-    /**
-     * Creates a new {@link UiDocumentNode} described by a given {@link DocumentDescriptor}.
-     *
-     * @param documentDescriptor The {@link DocumentDescriptor} for the XML node. Cannot be null.
-     */
-    public UiDocumentNode(DocumentDescriptor documentDescriptor) {
-        super(documentDescriptor);
-    }
-
-    /**
-     * Computes a short string describing the UI node suitable for tree views.
-     * Uses the element's attribute "android:name" if present, or the "android:label" one
-     * followed by the element's name.
-     *
-     * @return A short string describing the UI node suitable for tree views.
-     */
-    @Override
-    public String getShortDescription() {
-        return "Document"; //$NON-NLS-1$
-    }
-
-    /**
-     * Computes a "breadcrumb trail" description for this node.
-     *
-     * @param include_root Whether to include the root (e.g. "Manifest") or not. Has no effect
-     *                     when called on the root node itself.
-     * @return The "breadcrumb trail" description for this node.
-     */
-    @Override
-    public String getBreadcrumbTrailDescription(boolean include_root) {
-        return "Document"; //$NON-NLS-1$
-    }
-
-    /**
-     * This method throws an exception when attempted to assign a parent, since XML documents
-     * cannot have a parent. It is OK to assign null.
-     */
-    @Override
-    protected void setUiParent(UiElementNode parent) {
-        if (parent != null) {
-            // DEBUG. Change to log warning.
-            throw new UnsupportedOperationException("Documents can't have UI parents"); //$NON-NLS-1$
-        }
-        super.setUiParent(null);
-    }
-
-    /**
-     * Populate this element node with all values from the given XML node.
-     *
-     * This fails if the given XML node has a different element name -- it won't change the
-     * type of this ui node.
-     *
-     * This method can be both used for populating values the first time and updating values
-     * after the XML model changed.
-     *
-     * @param xml_node The XML node to mirror
-     * @return Returns true if the XML structure has changed (nodes added, removed or replaced)
-     */
-    @Override
-    public boolean loadFromXmlNode(Node xml_node) {
-        boolean structure_changed = (getXmlDocument() != xml_node);
-        setXmlDocument((Document) xml_node);
-        structure_changed |= super.loadFromXmlNode(xml_node);
-        if (structure_changed) {
-            invokeUiUpdateListeners(UiUpdateState.CHILDREN_CHANGED);
-        }
-        return structure_changed;
-    }
-
-    /**
-     * This method throws an exception if there is no underlying XML document.
-     * <p/>
-     * XML documents cannot be created per se -- they are a by-product of the StructuredEditor
-     * XML parser.
-     *
-     * @return The current value of getXmlDocument().
-     */
-    @Override
-    public Node createXmlNode() {
-        if (getXmlDocument() == null) {
-            // By design, a document node cannot be created, it is owned by the XML parser.
-            // By "design" this should never happen since the XML parser always creates an XML
-            // document container, even for an empty file.
-            throw new UnsupportedOperationException("Documents cannot be created"); //$NON-NLS-1$
-        }
-        return getXmlDocument();
-    }
-
-    /**
-     * This method throws an exception and does not even try to delete the XML document.
-     * <p/>
-     * XML documents cannot be deleted per se -- they are a by-product of the StructuredEditor
-     * XML parser.
-     *
-     * @return The removed node or null if it didn't exist in the first place.
-     */
-    @Override
-    public Node deleteXmlNode() {
-        // DEBUG. Change to log warning.
-        throw new UnsupportedOperationException("Documents cannot be deleted"); //$NON-NLS-1$
-    }
-
-    /**
-     * Returns all elements in this document.
-     *
-     * @param document the document
-     * @return all elements in the document
-     */
-    public static List<UiElementNode> getAllElements(UiDocumentNode document) {
-        List<UiElementNode> elements = new ArrayList<UiElementNode>(64);
-        for (UiElementNode child : document.getUiChildren()) {
-            addElements(child, elements);
-        }
-        return elements;
-    }
-
-    private static void addElements(UiElementNode node, List<UiElementNode> elements) {
-        elements.add(node);
-
-        for (UiElementNode child : node.getUiChildren()) {
-            addElements(child, elements);
-        }
-    }
-}
-
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/uimodel/UiElementNode.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/uimodel/UiElementNode.java
deleted file mode 100644
index ed447c6..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/uimodel/UiElementNode.java
+++ /dev/null
@@ -1,2160 +0,0 @@
-/*
- * Copyright (C) 2007 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.editors.uimodel;
-
-import static com.android.SdkConstants.ANDROID_PKG_PREFIX;
-import static com.android.SdkConstants.ANDROID_SUPPORT_PKG_PREFIX;
-import static com.android.SdkConstants.ATTR_CLASS;
-import static com.android.SdkConstants.ID_PREFIX;
-import static com.android.SdkConstants.NEW_ID_PREFIX;
-
-import com.android.SdkConstants;
-import com.android.annotations.VisibleForTesting;
-import com.android.ide.common.api.IAttributeInfo.Format;
-import com.android.ide.common.resources.platform.AttributeInfo;
-import com.android.ide.common.xml.XmlAttributeSortOrder;
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.ide.eclipse.adt.internal.editors.AndroidXmlEditor;
-import com.android.ide.eclipse.adt.internal.editors.descriptors.AttributeDescriptor;
-import com.android.ide.eclipse.adt.internal.editors.descriptors.ElementDescriptor;
-import com.android.ide.eclipse.adt.internal.editors.descriptors.ElementDescriptor.Mandatory;
-import com.android.ide.eclipse.adt.internal.editors.descriptors.IUnknownDescriptorProvider;
-import com.android.ide.eclipse.adt.internal.editors.descriptors.SeparatorAttributeDescriptor;
-import com.android.ide.eclipse.adt.internal.editors.descriptors.TextAttributeDescriptor;
-import com.android.ide.eclipse.adt.internal.editors.descriptors.XmlnsAttributeDescriptor;
-import com.android.ide.eclipse.adt.internal.editors.layout.descriptors.CustomViewDescriptorService;
-import com.android.ide.eclipse.adt.internal.editors.manifest.descriptors.AndroidManifestDescriptors;
-import com.android.ide.eclipse.adt.internal.editors.otherxml.descriptors.OtherXmlDescriptors;
-import com.android.ide.eclipse.adt.internal.editors.uimodel.IUiUpdateListener.UiUpdateState;
-import com.android.ide.eclipse.adt.internal.preferences.AdtPrefs;
-import com.android.ide.eclipse.adt.internal.sdk.AndroidTargetData;
-import com.android.utils.SdkUtils;
-import com.android.utils.XmlUtils;
-
-import org.eclipse.jface.text.TextUtilities;
-import org.eclipse.jface.viewers.StyledString;
-import org.eclipse.ui.views.properties.IPropertyDescriptor;
-import org.eclipse.ui.views.properties.IPropertySource;
-import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;
-import org.eclipse.wst.xml.core.internal.document.ElementImpl;
-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.Text;
-
-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.Locale;
-import java.util.Map;
-import java.util.Map.Entry;
-import java.util.Set;
-
-/**
- * Represents an XML node that can be modified by the user interface in the XML editor.
- * <p/>
- * Each tree viewer used in the application page's parts needs to keep a model representing
- * each underlying node in the tree. This interface represents the base type for such a node.
- * <p/>
- * Each node acts as an intermediary model between the actual XML model (the real data support)
- * and the tree viewers or the corresponding page parts.
- * <p/>
- * Element nodes don't contain data per se. Their data is contained in their attributes
- * as well as their children's attributes, see {@link UiAttributeNode}.
- * <p/>
- * The structure of a given {@link UiElementNode} is declared by a corresponding
- * {@link ElementDescriptor}.
- * <p/>
- * The class implements {@link IPropertySource}, in order to fill the Eclipse property tab when
- * an element is selected. The {@link AttributeDescriptor} are used property descriptors.
- */
-@SuppressWarnings("restriction") // XML model
-public class UiElementNode implements IPropertySource {
-
-    /** List of prefixes removed from android:id strings when creating short descriptions. */
-    private static String[] ID_PREFIXES = {
-        "@android:id/", //$NON-NLS-1$
-        NEW_ID_PREFIX, ID_PREFIX, "@+", "@" }; //$NON-NLS-1$ //$NON-NLS-2$
-
-    /** The element descriptor for the node. Always present, never null. */
-    private ElementDescriptor mDescriptor;
-    /** The parent element node in the UI model. It is null for a root element or until
-     *  the node is attached to its parent. */
-    private UiElementNode mUiParent;
-    /** The {@link AndroidXmlEditor} handling the UI hierarchy. This is defined only for the
-     *  root node. All children have the value set to null and query their parent. */
-    private AndroidXmlEditor mEditor;
-    /** The XML {@link Document} model that is being mirror by the UI model. This is defined
-     *  only for the root node. All children have the value set to null and query their parent. */
-    private Document mXmlDocument;
-    /** The XML {@link Node} mirror by this UI node. This can be null for mandatory UI node which
-     *  have no corresponding XML node or for new UI nodes before their XML node is set. */
-    private Node mXmlNode;
-    /** The list of all UI children nodes. Can be empty but never null. There's one UI children
-     *  node per existing XML children node. */
-    private ArrayList<UiElementNode> mUiChildren;
-    /** The list of <em>all</em> UI attributes, as declared in the {@link ElementDescriptor}.
-     *  The list is always defined and never null. Unlike the UiElementNode children list, this
-     *  is always defined, even for attributes that do not exist in the XML model - that's because
-     *  "missing" attributes in the XML model simply mean a default value is used. Also note that
-     *  the underlying collection is a map, so order is not respected. To get the desired attribute
-     *  order, iterate through the {@link ElementDescriptor}'s attribute list. */
-    private HashMap<AttributeDescriptor, UiAttributeNode> mUiAttributes;
-    private HashSet<UiAttributeNode> mUnknownUiAttributes;
-    /** A read-only view of the UI children node collection. */
-    private List<UiElementNode> mReadOnlyUiChildren;
-    /** A read-only view of the UI attributes collection. */
-    private Collection<UiAttributeNode> mCachedAllUiAttributes;
-    /** A map of hidden attribute descriptors. Key is the XML name. */
-    private Map<String, AttributeDescriptor> mCachedHiddenAttributes;
-    /** An optional list of {@link IUiUpdateListener}. Most element nodes will not have any
-     *  listeners attached, so the list is only created on demand and can be null. */
-    private List<IUiUpdateListener> mUiUpdateListeners;
-    /** A provider that knows how to create {@link ElementDescriptor} from unmapped XML names.
-     *  The default is to have one that creates new {@link ElementDescriptor}. */
-    private IUnknownDescriptorProvider mUnknownDescProvider;
-    /** Error Flag */
-    private boolean mHasError;
-
-    /**
-     * Creates a new {@link UiElementNode} described by a given {@link ElementDescriptor}.
-     *
-     * @param elementDescriptor The {@link ElementDescriptor} for the XML node. Cannot be null.
-     */
-    public UiElementNode(ElementDescriptor elementDescriptor) {
-        mDescriptor = elementDescriptor;
-        clearContent();
-    }
-
-    @Override
-    public String toString() {
-      return String.format("%s [desc: %s, parent: %s, children: %d]",         //$NON-NLS-1$
-              this.getClass().getSimpleName(),
-              mDescriptor,
-              mUiParent != null ? mUiParent.toString() : "none",              //$NON-NLS-1$
-                      mUiChildren != null ? mUiChildren.size() : 0
-      );
-    }
-
-    /**
-     * Clears the {@link UiElementNode} by resetting the children list and
-     * the {@link UiAttributeNode}s list.
-     * Also resets the attached XML node, document, editor if any.
-     * <p/>
-     * The parent {@link UiElementNode} node is not reset so that it's position
-     * in the hierarchy be left intact, if any.
-     */
-    /* package */ void clearContent() {
-        mXmlNode = null;
-        mXmlDocument = null;
-        mEditor = null;
-        clearAttributes();
-        mReadOnlyUiChildren = null;
-        if (mUiChildren == null) {
-            mUiChildren = new ArrayList<UiElementNode>();
-        } else {
-            // We can't remove mandatory nodes, we just clear them.
-            for (int i = mUiChildren.size() - 1; i >= 0; --i) {
-                removeUiChildAtIndex(i);
-            }
-        }
-    }
-
-    /**
-     * Clears the internal list of attributes, the read-only cached version of it
-     * and the read-only cached hidden attribute list.
-     */
-    private void clearAttributes() {
-        mUiAttributes = null;
-        mCachedAllUiAttributes = null;
-        mCachedHiddenAttributes = null;
-        mUnknownUiAttributes = new HashSet<UiAttributeNode>();
-    }
-
-    /**
-     * Gets or creates the internal UiAttributes list.
-     * <p/>
-     * When the descriptor derives from ViewElementDescriptor, this list depends on the
-     * current UiParent node.
-     *
-     * @return A new set of {@link UiAttributeNode} that matches the expected
-     *         attributes for this node.
-     */
-    private HashMap<AttributeDescriptor, UiAttributeNode> getInternalUiAttributes() {
-        if (mUiAttributes == null) {
-            AttributeDescriptor[] attrList = getAttributeDescriptors();
-            mUiAttributes = new HashMap<AttributeDescriptor, UiAttributeNode>(attrList.length);
-            for (AttributeDescriptor desc : attrList) {
-                UiAttributeNode uiNode = desc.createUiNode(this);
-                if (uiNode != null) {  // Some AttributeDescriptors do not have UI associated
-                    mUiAttributes.put(desc, uiNode);
-                }
-            }
-        }
-        return mUiAttributes;
-    }
-
-    /**
-     * Computes a short string describing the UI node suitable for tree views.
-     * Uses the element's attribute "android:name" if present, or the "android:label" one
-     * followed by the element's name if not repeated.
-     *
-     * @return A short string describing the UI node suitable for tree views.
-     */
-    public String getShortDescription() {
-        String name = mDescriptor.getUiName();
-        String attr = getDescAttribute();
-        if (attr != null) {
-            // If the ui name is repeated in the attribute value, don't use it.
-            // Typical case is to avoid ".pkg.MyActivity (Activity)".
-            if (attr.contains(name)) {
-                return attr;
-            } else {
-                return String.format("%1$s (%2$s)", attr, name);
-            }
-        }
-
-        return name;
-    }
-
-    /** Returns the key attribute that can be used to describe this node, or null */
-    private String getDescAttribute() {
-        if (mXmlNode != null && mXmlNode instanceof Element && mXmlNode.hasAttributes()) {
-            // Application and Manifest nodes have a special treatment: they are unique nodes
-            // so we don't bother trying to differentiate their strings and we fall back to
-            // just using the UI name below.
-            Element elem = (Element) mXmlNode;
-
-            String attr = _Element_getAttributeNS(elem,
-                                SdkConstants.NS_RESOURCES,
-                                AndroidManifestDescriptors.ANDROID_NAME_ATTR);
-            if (attr == null || attr.length() == 0) {
-                attr = _Element_getAttributeNS(elem,
-                                SdkConstants.NS_RESOURCES,
-                                AndroidManifestDescriptors.ANDROID_LABEL_ATTR);
-            } else if (mXmlNode.getNodeName().equals(SdkConstants.VIEW_FRAGMENT)) {
-                attr = attr.substring(attr.lastIndexOf('.') + 1);
-            }
-            if (attr == null || attr.length() == 0) {
-                attr = _Element_getAttributeNS(elem,
-                                SdkConstants.NS_RESOURCES,
-                                OtherXmlDescriptors.PREF_KEY_ATTR);
-            }
-            if (attr == null || attr.length() == 0) {
-                attr = _Element_getAttributeNS(elem,
-                                null, // no namespace
-                                SdkConstants.ATTR_NAME);
-            }
-            if (attr == null || attr.length() == 0) {
-                attr = _Element_getAttributeNS(elem,
-                                SdkConstants.NS_RESOURCES,
-                                SdkConstants.ATTR_ID);
-
-                if (attr != null && attr.length() > 0) {
-                    for (String prefix : ID_PREFIXES) {
-                        if (attr.startsWith(prefix)) {
-                            attr = attr.substring(prefix.length());
-                            break;
-                        }
-                    }
-                }
-            }
-            if (attr != null && attr.length() > 0) {
-                return attr;
-            }
-        }
-
-        return null;
-    }
-
-    /**
-     * Computes a styled string describing the UI node suitable for tree views.
-     * Similar to {@link #getShortDescription()} but styles the Strings.
-     *
-     * @return A styled string describing the UI node suitable for tree views.
-     */
-    public StyledString getStyledDescription() {
-        String uiName = mDescriptor.getUiName();
-
-        // Special case: for <view>, show the class attribute value instead.
-        // This is done here rather than in the descriptor since this depends on
-        // node instance data.
-        if (SdkConstants.VIEW_TAG.equals(uiName) && mXmlNode instanceof Element) {
-            Element element = (Element) mXmlNode;
-            String cls = element.getAttribute(ATTR_CLASS);
-            if (cls != null) {
-                uiName = cls.substring(cls.lastIndexOf('.') + 1);
-            }
-        }
-
-        StyledString styledString = new StyledString();
-        String attr = getDescAttribute();
-        if (attr != null) {
-            // Don't append the two when it's a repeat, e.g. Button01 (Button),
-            // only when the ui name is not part of the attribute
-            if (attr.toLowerCase(Locale.US).indexOf(uiName.toLowerCase(Locale.US)) == -1) {
-                styledString.append(attr);
-                styledString.append(String.format(" (%1$s)", uiName),
-                        StyledString.DECORATIONS_STYLER);
-            } else {
-                styledString.append(attr);
-            }
-        }
-
-        if (styledString.length() == 0) {
-            styledString.append(uiName);
-        }
-
-        return styledString;
-    }
-
-    /**
-     * Retrieves an attribute value by local name and namespace URI.
-     * <br>Per [<a href='http://www.w3.org/TR/1999/REC-xml-names-19990114/'>XML Namespaces</a>]
-     * , applications must use the value <code>null</code> as the
-     * <code>namespaceURI</code> parameter for methods if they wish to have
-     * no namespace.
-     * <p/>
-     * Note: This is a wrapper around {@link Element#getAttributeNS(String, String)}.
-     * In some versions of webtools, the getAttributeNS implementation crashes with an NPE.
-     * This wrapper will return an empty string instead.
-     *
-     * @see Element#getAttributeNS(String, String)
-     * @see <a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=318108">https://bugs.eclipse.org/bugs/show_bug.cgi?id=318108</a>
-     * @return The result from {@link Element#getAttributeNS(String, String)} or an empty string.
-     */
-    private String _Element_getAttributeNS(Element element,
-            String namespaceURI,
-            String localName) {
-        try {
-            return element.getAttributeNS(namespaceURI, localName);
-        } catch (Exception ignore) {
-            return "";
-        }
-    }
-
-    /**
-     * Computes a "breadcrumb trail" description for this node.
-     * It will look something like "Manifest > Application > .myactivity (Activity) > Intent-Filter"
-     *
-     * @param includeRoot Whether to include the root (e.g. "Manifest") or not. Has no effect
-     *                     when called on the root node itself.
-     * @return The "breadcrumb trail" description for this node.
-     */
-    public String getBreadcrumbTrailDescription(boolean includeRoot) {
-        StringBuilder sb = new StringBuilder(getShortDescription());
-
-        for (UiElementNode uiNode = getUiParent();
-                uiNode != null;
-                uiNode = uiNode.getUiParent()) {
-            if (!includeRoot && uiNode.getUiParent() == null) {
-                break;
-            }
-            sb.insert(0, String.format("%1$s > ", uiNode.getShortDescription())); //$NON-NLS-1$
-        }
-
-        return sb.toString();
-    }
-
-    /**
-     * Sets the XML {@link Document}.
-     * <p/>
-     * The XML {@link Document} is initially null. The XML {@link Document} must be set only on the
-     * UI root element node (this method takes care of that.)
-     * @param xmlDoc The new XML document to associate this node with.
-     */
-    public void setXmlDocument(Document xmlDoc) {
-        if (mUiParent == null) {
-            mXmlDocument = xmlDoc;
-        } else {
-            mUiParent.setXmlDocument(xmlDoc);
-        }
-    }
-
-    /**
-     * Returns the XML {@link Document}.
-     * <p/>
-     * The value is initially null until the UI node is attached to its UI parent -- the value
-     * of the document is then propagated.
-     *
-     * @return the XML {@link Document} or the parent's XML {@link Document} or null.
-     */
-    public Document getXmlDocument() {
-        if (mXmlDocument != null) {
-            return mXmlDocument;
-        } else if (mUiParent != null) {
-            return mUiParent.getXmlDocument();
-        }
-        return null;
-    }
-
-    /**
-     * Returns the XML node associated with this UI node.
-     * <p/>
-     * Some {@link ElementDescriptor} are declared as being "mandatory". This means the
-     * corresponding UI node will exist even if there is no corresponding XML node. Such structure
-     * is created and enforced by the parent of the tree, not the element themselves. However
-     * such nodes will likely not have an XML node associated, so getXmlNode() can return null.
-     *
-     * @return The associated XML node. Can be null for mandatory nodes.
-     */
-    public Node getXmlNode() {
-        return mXmlNode;
-    }
-
-    /**
-     * Returns the {@link ElementDescriptor} for this node. This is never null.
-     * <p/>
-     * Do not use this to call getDescriptor().getAttributes(), instead call
-     * getAttributeDescriptors() which can be overridden by derived classes.
-     * @return The {@link ElementDescriptor} for this node. This is never null.
-     */
-    public ElementDescriptor getDescriptor() {
-        return mDescriptor;
-    }
-
-    /**
-     * Returns the {@link AttributeDescriptor} array for the descriptor of this node.
-     * <p/>
-     * Use this instead of getDescriptor().getAttributes() -- derived classes can override
-     * this to manipulate the attribute descriptor list depending on the current UI node.
-     * @return The {@link AttributeDescriptor} array for the descriptor of this node.
-     */
-    public AttributeDescriptor[] getAttributeDescriptors() {
-        return mDescriptor.getAttributes();
-    }
-
-    /**
-     * Returns the hidden {@link AttributeDescriptor} array for the descriptor of this node.
-     * This is a subset of the getAttributeDescriptors() list.
-     * <p/>
-     * Use this instead of getDescriptor().getHiddenAttributes() -- potentially derived classes
-     * could override this to manipulate the attribute descriptor list depending on the current
-     * UI node. There's no need for it right now so keep it private.
-     */
-    private Map<String, AttributeDescriptor> getHiddenAttributeDescriptors() {
-        if (mCachedHiddenAttributes == null) {
-            mCachedHiddenAttributes = new HashMap<String, AttributeDescriptor>();
-            for (AttributeDescriptor attrDesc : getAttributeDescriptors()) {
-                if (attrDesc instanceof XmlnsAttributeDescriptor) {
-                    mCachedHiddenAttributes.put(
-                            ((XmlnsAttributeDescriptor) attrDesc).getXmlNsName(),
-                            attrDesc);
-                }
-            }
-        }
-        return mCachedHiddenAttributes;
-    }
-
-    /**
-     * Sets the parent of this UiElementNode.
-     * <p/>
-     * The root node has no parent.
-     */
-    protected void setUiParent(UiElementNode parent) {
-        mUiParent = parent;
-        // Invalidate the internal UiAttributes list, as it may depend on the actual UiParent.
-        clearAttributes();
-    }
-
-    /**
-     * @return The parent {@link UiElementNode} or null if this is the root node.
-     */
-    public UiElementNode getUiParent() {
-        return mUiParent;
-    }
-
-    /**
-     * Returns the root {@link UiElementNode}.
-     *
-     * @return The root {@link UiElementNode}.
-     */
-    public UiElementNode getUiRoot() {
-        UiElementNode root = this;
-        while (root.mUiParent != null) {
-            root = root.mUiParent;
-        }
-
-        return root;
-    }
-
-    /**
-     * Returns the index of this sibling (where the first child has index 0, the second child
-     * has index 1, and so on.)
-     *
-     * @return The sibling index of this node
-     */
-    public int getUiSiblingIndex() {
-        if (mUiParent != null) {
-            int index = 0;
-            for (UiElementNode node : mUiParent.getUiChildren()) {
-                if (node == this) {
-                    break;
-                }
-                index++;
-            }
-            return index;
-        }
-
-        return 0;
-    }
-
-    /**
-     * Returns the previous UI sibling of this UI node. If the node does not have a previous
-     * sibling, returns null.
-     *
-     * @return The previous UI sibling of this UI node, or null if not applicable.
-     */
-    public UiElementNode getUiPreviousSibling() {
-        if (mUiParent != null) {
-            List<UiElementNode> childlist = mUiParent.getUiChildren();
-            if (childlist != null && childlist.size() > 1 && childlist.get(0) != this) {
-                int index = childlist.indexOf(this);
-                return index > 0 ? childlist.get(index - 1) : null;
-            }
-        }
-        return null;
-    }
-
-    /**
-     * Returns the next UI sibling of this UI node.
-     * If the node does not have a next sibling, returns null.
-     *
-     * @return The next UI sibling of this UI node, or null.
-     */
-    public UiElementNode getUiNextSibling() {
-        if (mUiParent != null) {
-            List<UiElementNode> childlist = mUiParent.getUiChildren();
-            if (childlist != null) {
-                int size = childlist.size();
-                if (size > 1 && childlist.get(size - 1) != this) {
-                    int index = childlist.indexOf(this);
-                    return index >= 0 && index < size - 1 ? childlist.get(index + 1) : null;
-                }
-            }
-        }
-        return null;
-    }
-
-    /**
-     * Sets the {@link AndroidXmlEditor} handling this {@link UiElementNode} hierarchy.
-     * <p/>
-     * The editor must always be set on the root node. This method takes care of that.
-     *
-     * @param editor The editor to associate this node with.
-     */
-    public void setEditor(AndroidXmlEditor editor) {
-        if (mUiParent == null) {
-            mEditor = editor;
-        } else {
-            mUiParent.setEditor(editor);
-        }
-    }
-
-    /**
-     * Returns the {@link AndroidXmlEditor} that embeds this {@link UiElementNode}.
-     * <p/>
-     * The value is initially null until the node is attached to its parent -- the value
-     * of the root node is then propagated.
-     *
-     * @return The embedding {@link AndroidXmlEditor} or null.
-     */
-    public AndroidXmlEditor getEditor() {
-        return mUiParent == null ? mEditor : mUiParent.getEditor();
-    }
-
-    /**
-     * Returns the Android target data for the file being edited.
-     *
-     * @return The Android target data for the file being edited.
-     */
-    public AndroidTargetData getAndroidTarget() {
-        return getEditor().getTargetData();
-    }
-
-    /**
-     * @return A read-only version of the children collection.
-     */
-    public List<UiElementNode> getUiChildren() {
-        if (mReadOnlyUiChildren == null) {
-            mReadOnlyUiChildren = Collections.unmodifiableList(mUiChildren);
-        }
-        return mReadOnlyUiChildren;
-    }
-
-    /**
-     * Returns a collection containing all the known attributes as well as
-     * all the unknown ui attributes.
-     *
-     * @return A read-only version of the attributes collection.
-     */
-    public Collection<UiAttributeNode> getAllUiAttributes() {
-        if (mCachedAllUiAttributes == null) {
-
-            List<UiAttributeNode> allValues =
-                new ArrayList<UiAttributeNode>(getInternalUiAttributes().values());
-            allValues.addAll(mUnknownUiAttributes);
-
-            mCachedAllUiAttributes = Collections.unmodifiableCollection(allValues);
-        }
-        return mCachedAllUiAttributes;
-    }
-
-    /**
-     * Returns all the unknown ui attributes, that is those we found defined in the
-     * actual XML but that we don't have descriptors for.
-     *
-     * @return A read-only version of the unknown attributes collection.
-     */
-    public Collection<UiAttributeNode> getUnknownUiAttributes() {
-        return Collections.unmodifiableCollection(mUnknownUiAttributes);
-    }
-
-    /**
-     * Sets the error flag value.
-     *
-     * @param errorFlag the error flag
-     */
-    public final void setHasError(boolean errorFlag) {
-        mHasError = errorFlag;
-    }
-
-    /**
-     * Returns whether this node, its attributes, or one of the children nodes (and attributes)
-     * has errors.
-     *
-     * @return True if this node, its attributes, or one of the children nodes (and attributes)
-     * has errors.
-     */
-    public final boolean hasError() {
-        if (mHasError) {
-            return true;
-        }
-
-        // get the error value from the attributes.
-        for (UiAttributeNode attribute : getAllUiAttributes()) {
-            if (attribute.hasError()) {
-                return true;
-            }
-        }
-
-        // and now from the children.
-        for (UiElementNode child : mUiChildren) {
-            if (child.hasError()) {
-                return true;
-            }
-        }
-
-        return false;
-    }
-
-    /**
-     * Returns the provider that knows how to create {@link ElementDescriptor} from unmapped
-     * XML names.
-     * <p/>
-     * The default is to have one that creates new {@link ElementDescriptor}.
-     * <p/>
-     * There is only one such provider in any UI model tree, attached to the root node.
-     *
-     * @return An instance of {@link IUnknownDescriptorProvider}. Can never be null.
-     */
-    public IUnknownDescriptorProvider getUnknownDescriptorProvider() {
-        if (mUiParent != null) {
-            return mUiParent.getUnknownDescriptorProvider();
-        }
-        if (mUnknownDescProvider == null) {
-            // Create the default one on demand.
-            mUnknownDescProvider = new IUnknownDescriptorProvider() {
-
-                private final HashMap<String, ElementDescriptor> mMap =
-                    new HashMap<String, ElementDescriptor>();
-
-                /**
-                 * The default is to create a new ElementDescriptor wrapping
-                 * the unknown XML local name and reuse previously created descriptors.
-                 */
-                @Override
-                public ElementDescriptor getDescriptor(String xmlLocalName) {
-
-                    ElementDescriptor desc = mMap.get(xmlLocalName);
-
-                    if (desc == null) {
-                        desc = new ElementDescriptor(xmlLocalName);
-                        mMap.put(xmlLocalName, desc);
-                    }
-
-                    return desc;
-                }
-            };
-        }
-        return mUnknownDescProvider;
-    }
-
-    /**
-     * Sets the provider that knows how to create {@link ElementDescriptor} from unmapped
-     * XML names.
-     * <p/>
-     * The default is to have one that creates new {@link ElementDescriptor}.
-     * <p/>
-     * There is only one such provider in any UI model tree, attached to the root node.
-     *
-     * @param unknownDescProvider The new provider to use. Must not be null.
-     */
-    public void setUnknownDescriptorProvider(IUnknownDescriptorProvider unknownDescProvider) {
-        if (mUiParent == null) {
-            mUnknownDescProvider = unknownDescProvider;
-        } else {
-            mUiParent.setUnknownDescriptorProvider(unknownDescProvider);
-        }
-    }
-
-    /**
-     * Adds a new {@link IUiUpdateListener} to the internal update listener list.
-     *
-     * @param listener The listener to add.
-     */
-    public void addUpdateListener(IUiUpdateListener listener) {
-       if (mUiUpdateListeners == null) {
-           mUiUpdateListeners = new ArrayList<IUiUpdateListener>();
-       }
-       if (!mUiUpdateListeners.contains(listener)) {
-           mUiUpdateListeners.add(listener);
-       }
-    }
-
-    /**
-     * Removes an existing {@link IUiUpdateListener} from the internal update listener list.
-     * Does nothing if the list is empty or the listener is not registered.
-     *
-     * @param listener The listener to remove.
-     */
-    public void removeUpdateListener(IUiUpdateListener listener) {
-       if (mUiUpdateListeners != null) {
-           mUiUpdateListeners.remove(listener);
-       }
-    }
-
-    /**
-     * Finds a child node relative to this node using a path-like expression.
-     * F.ex. "node1/node2" would find a child "node1" that contains a child "node2" and
-     * returns the latter. If there are multiple nodes with the same name at the same
-     * level, always uses the first one found.
-     *
-     * @param path The path like expression to select a child node.
-     * @return The ui node found or null.
-     */
-    public UiElementNode findUiChildNode(String path) {
-        String[] items = path.split("/");  //$NON-NLS-1$
-        UiElementNode uiNode = this;
-        for (String item : items) {
-            boolean nextSegment = false;
-            for (UiElementNode c : uiNode.mUiChildren) {
-                if (c.getDescriptor().getXmlName().equals(item)) {
-                    uiNode = c;
-                    nextSegment = true;
-                    break;
-                }
-            }
-            if (!nextSegment) {
-                return null;
-            }
-        }
-        return uiNode;
-    }
-
-    /**
-     * Finds an {@link UiElementNode} which contains the give XML {@link Node}.
-     * Looks recursively in all children UI nodes.
-     *
-     * @param xmlNode The XML node to look for.
-     * @return The {@link UiElementNode} that contains xmlNode or null if not found,
-     */
-    public UiElementNode findXmlNode(Node xmlNode) {
-        if (xmlNode == null) {
-            return null;
-        }
-        if (getXmlNode() == xmlNode) {
-            return this;
-        }
-
-        for (UiElementNode uiChild : mUiChildren) {
-            UiElementNode found = uiChild.findXmlNode(xmlNode);
-            if (found != null) {
-                return found;
-            }
-        }
-
-        return null;
-    }
-
-    /**
-     * Returns the {@link UiAttributeNode} matching this attribute descriptor or
-     * null if not found.
-     *
-     * @param attrDesc The {@link AttributeDescriptor} to match.
-     * @return the {@link UiAttributeNode} matching this attribute descriptor or null
-     *         if not found.
-     */
-    public UiAttributeNode findUiAttribute(AttributeDescriptor attrDesc) {
-        return getInternalUiAttributes().get(attrDesc);
-    }
-
-    /**
-     * Populate this element node with all values from the given XML node.
-     *
-     * This fails if the given XML node has a different element name -- it won't change the
-     * type of this ui node.
-     *
-     * This method can be both used for populating values the first time and updating values
-     * after the XML model changed.
-     *
-     * @param xmlNode The XML node to mirror
-     * @return Returns true if the XML structure has changed (nodes added, removed or replaced)
-     */
-    public boolean loadFromXmlNode(Node xmlNode) {
-        boolean structureChanged = (mXmlNode != xmlNode);
-        mXmlNode = xmlNode;
-        if (xmlNode != null) {
-            updateAttributeList(xmlNode);
-            structureChanged |= updateElementList(xmlNode);
-            invokeUiUpdateListeners(structureChanged ? UiUpdateState.CHILDREN_CHANGED
-                                                      : UiUpdateState.ATTR_UPDATED);
-        }
-        return structureChanged;
-    }
-
-    /**
-     * Clears the UI node and reload it from the given XML node.
-     * <p/>
-     * This works by clearing all references to any previous XML or UI nodes and
-     * then reloads the XML document from scratch. The editor reference is kept.
-     * <p/>
-     * This is used in the special case where the ElementDescriptor structure has changed.
-     * Rather than try to diff inflated UI nodes (as loadFromXmlNode does), we don't bother
-     * and reload everything. This is not subtle and should be used very rarely.
-     *
-     * @param xmlNode The XML node or document to reload. Can be null.
-     */
-    public void reloadFromXmlNode(Node xmlNode) {
-        // The editor needs to be preserved, it is not affected by an XML change.
-        AndroidXmlEditor editor = getEditor();
-        clearContent();
-        setEditor(editor);
-        if (xmlNode != null) {
-            setXmlDocument(xmlNode.getOwnerDocument());
-        }
-        // This will reload all the XML and recreate the UI structure from scratch.
-        loadFromXmlNode(xmlNode);
-    }
-
-    /**
-     * Called by attributes when they want to commit their value
-     * to an XML node.
-     * <p/>
-     * For mandatory nodes, this makes sure the underlying XML element node
-     * exists in the model. If not, it is created and assigned as the underlying
-     * XML node.
-     * </br>
-     * For non-mandatory nodes, simply return the underlying XML node, which
-     * must always exists.
-     *
-     * @return The XML node matching this {@link UiElementNode} or null.
-     */
-    public Node prepareCommit() {
-        if (getDescriptor().getMandatory() != Mandatory.NOT_MANDATORY) {
-            createXmlNode();
-            // The new XML node has been created.
-            // We don't need to refresh using loadFromXmlNode() since there are
-            // no attributes or elements that need to be loading into this node.
-        }
-        return getXmlNode();
-    }
-
-    /**
-     * Commits the attributes (all internal, inherited from UI parent & unknown attributes).
-     * This is called by the UI when the embedding part needs to be committed.
-     */
-    public void commit() {
-        for (UiAttributeNode uiAttr : getAllUiAttributes()) {
-            uiAttr.commit();
-        }
-    }
-
-    /**
-     * Returns true if the part has been modified with respect to the data
-     * loaded from the model.
-     * @return True if the part has been modified with respect to the data
-     * loaded from the model.
-     */
-    public boolean isDirty() {
-        for (UiAttributeNode uiAttr : getAllUiAttributes()) {
-            if (uiAttr.isDirty()) {
-                return true;
-            }
-        }
-
-        return false;
-    }
-
-    /**
-     * Creates the underlying XML element node for this UI node if it doesn't already
-     * exists.
-     *
-     * @return The new value of getXmlNode() (can be null if creation failed)
-     */
-    public Node createXmlNode() {
-        if (mXmlNode != null) {
-            return null;
-        }
-        Node parentXmlNode = null;
-        if (mUiParent != null) {
-            parentXmlNode = mUiParent.prepareCommit();
-            if (parentXmlNode == null) {
-                // The parent failed to create its own backing XML node. Abort.
-                // No need to throw an exception, the parent will most likely
-                // have done so itself.
-                return null;
-            }
-        }
-
-        String elementName = getDescriptor().getXmlName();
-        Document doc = getXmlDocument();
-
-        // We *must* have a root node. If not, we need to abort.
-        if (doc == null) {
-            throw new RuntimeException(
-                    String.format("Missing XML document for %1$s XML node.", elementName));
-        }
-
-        // If we get here and parentXmlNode is null, the node is to be created
-        // as the root node of the document (which can't be null, cf. check above).
-        if (parentXmlNode == null) {
-            parentXmlNode = doc;
-        }
-
-        mXmlNode = doc.createElement(elementName);
-
-        // If this element does not have children, mark it as an empty tag
-        // such that the XML looks like <tag/> instead of <tag></tag>
-        if (!mDescriptor.hasChildren()) {
-            if (mXmlNode instanceof ElementImpl) {
-                ElementImpl element = (ElementImpl) mXmlNode;
-                element.setEmptyTag(true);
-            }
-        }
-
-        Node xmlNextSibling = null;
-
-        UiElementNode uiNextSibling = getUiNextSibling();
-        if (uiNextSibling != null) {
-            xmlNextSibling = uiNextSibling.getXmlNode();
-        }
-
-        Node previousTextNode = null;
-        if (xmlNextSibling != null) {
-            Node previousNode = xmlNextSibling.getPreviousSibling();
-            if (previousNode != null && previousNode.getNodeType() == Node.TEXT_NODE) {
-                previousTextNode = previousNode;
-            }
-        } else {
-            Node lastChild = parentXmlNode.getLastChild();
-            if (lastChild != null && lastChild.getNodeType() == Node.TEXT_NODE) {
-                previousTextNode = lastChild;
-            }
-        }
-
-        String insertAfter = null;
-
-        // Try to figure out the indentation node to insert. Even in auto-formatting
-        // we need to do this, because it turns out the XML editor's formatter does
-        // not do a very good job with completely botched up XML; it does a much better
-        // job if the new XML is already mostly well formatted. Thus, the main purpose
-        // of applying the real XML formatter after our own indentation attempts here is
-        // to make it apply its own tab-versus-spaces indentation properties, have it
-        // insert line breaks before attributes (if the user has configured that), etc.
-
-        // First figure out the indentation level of the newly inserted element;
-        // this is either the same as the previous sibling, or if there is no sibling,
-        // it's the indentation of the parent plus one indentation level.
-        boolean isFirstChild = getUiPreviousSibling() == null
-                || parentXmlNode.getFirstChild() == null;
-        AndroidXmlEditor editor = getEditor();
-        String indent;
-        String parentIndent = ""; //$NON-NLS-1$
-        if (isFirstChild) {
-            indent = parentIndent = editor.getIndent(parentXmlNode);
-            // We need to add one level of indentation. Are we using tabs?
-            // Can't get to formatting settings so let's just look at the
-            // parent indentation and see if we can guess
-            if (indent.length() > 0 && indent.charAt(indent.length()-1) == '\t') {
-                indent = indent + '\t';
-            } else {
-                // Not using tabs, or we can't figure it out (because parent had no
-                // indentation). In that case, indent with 4 spaces, as seems to
-                // be the Android default.
-                indent = indent + "    "; //$NON-NLS-1$
-            }
-        } else {
-            // Find out the indent of the previous sibling
-            indent = editor.getIndent(getUiPreviousSibling().getXmlNode());
-        }
-
-        // We want to insert the new element BEFORE the text node which precedes
-        // the next element, since that text node is the next element's indentation!
-        if (previousTextNode != null) {
-            xmlNextSibling = previousTextNode;
-        } else {
-            // If there's no previous text node, we are probably inside an
-            // empty element (<LinearLayout>|</LinearLayout>) and in that case we need
-            // to not only insert a newline and indentation before the new element, but
-            // after it as well.
-            insertAfter = parentIndent;
-        }
-
-        // Insert indent text node before the new element
-        IStructuredDocument document = editor.getStructuredDocument();
-        String newLine;
-        if (document != null) {
-            newLine = TextUtilities.getDefaultLineDelimiter(document);
-        } else {
-            newLine = SdkUtils.getLineSeparator();
-        }
-        Text indentNode = doc.createTextNode(newLine + indent);
-        parentXmlNode.insertBefore(indentNode, xmlNextSibling);
-
-        // Insert the element itself
-        parentXmlNode.insertBefore(mXmlNode, xmlNextSibling);
-
-        // Insert a separator after the tag. We only do this when we've inserted
-        // a tag into an area where there was no whitespace before
-        // (e.g. a new child of <LinearLayout></LinearLayout>).
-        if (insertAfter != null) {
-            Text sep = doc.createTextNode(newLine + insertAfter);
-            parentXmlNode.insertBefore(sep, xmlNextSibling);
-        }
-
-        // Set all initial attributes in the XML node if they are not empty.
-        // Iterate on the descriptor list to get the desired order and then use the
-        // internal values, if any.
-        List<UiAttributeNode> addAttributes = new ArrayList<UiAttributeNode>();
-
-        for (AttributeDescriptor attrDesc : getAttributeDescriptors()) {
-            if (attrDesc instanceof XmlnsAttributeDescriptor) {
-                XmlnsAttributeDescriptor desc = (XmlnsAttributeDescriptor) attrDesc;
-                Attr attr = doc.createAttributeNS(SdkConstants.XMLNS_URI,
-                        desc.getXmlNsName());
-                attr.setValue(desc.getValue());
-                attr.setPrefix(desc.getXmlNsPrefix());
-                mXmlNode.getAttributes().setNamedItemNS(attr);
-            } else {
-                UiAttributeNode uiAttr = getInternalUiAttributes().get(attrDesc);
-
-                // Don't apply the attribute immediately, instead record this attribute
-                // such that we can gather all attributes and sort them first.
-                // This is necessary because the XML model will *append* all attributes
-                // so we want to add them in a particular order.
-                // (Note that we only have to worry about UiAttributeNodes with non null
-                // values, since this is a new node and we therefore don't need to attempt
-                // to remove existing attributes)
-                String value = uiAttr.getCurrentValue();
-                if (value != null && value.length() > 0) {
-                    addAttributes.add(uiAttr);
-                }
-            }
-        }
-
-        // Sort and apply the attributes in order, because the Eclipse XML model will always
-        // append the XML attributes, so by inserting them in our desired order they will
-        // appear that way in the XML
-        Collections.sort(addAttributes);
-
-        for (UiAttributeNode node : addAttributes) {
-            commitAttributeToXml(node, node.getCurrentValue());
-            node.setDirty(false);
-        }
-
-        getEditor().scheduleNodeReformat(this, false);
-
-        // Notify per-node listeners
-        invokeUiUpdateListeners(UiUpdateState.CREATED);
-        // Notify global listeners
-        fireNodeCreated(this, getUiSiblingIndex());
-
-        return mXmlNode;
-    }
-
-    /**
-     * Removes the XML node corresponding to this UI node if it exists
-     * and also removes all mirrored information in this UI node (i.e. children, attributes)
-     *
-     * @return The removed node or null if it didn't exist in the first place.
-     */
-    public Node deleteXmlNode() {
-        if (mXmlNode == null) {
-            return null;
-        }
-
-        int previousIndex = getUiSiblingIndex();
-
-        // First clear the internals of the node and *then* actually deletes the XML
-        // node (because doing so will generate an update even and this node may be
-        // revisited via loadFromXmlNode).
-        Node oldXmlNode = mXmlNode;
-        clearContent();
-
-        Node xmlParent = oldXmlNode.getParentNode();
-        if (xmlParent == null) {
-            xmlParent = getXmlDocument();
-        }
-        Node previousSibling = oldXmlNode.getPreviousSibling();
-        oldXmlNode = xmlParent.removeChild(oldXmlNode);
-
-        // We need to remove the text node BEFORE the removed element, since THAT's the
-        // indentation node for the removed element.
-        if (previousSibling != null && previousSibling.getNodeType() == Node.TEXT_NODE
-                && previousSibling.getNodeValue().trim().length() == 0) {
-            xmlParent.removeChild(previousSibling);
-        }
-
-        invokeUiUpdateListeners(UiUpdateState.DELETED);
-        fireNodeDeleted(this, previousIndex);
-
-        return oldXmlNode;
-    }
-
-    /**
-     * Updates the element list for this UiElementNode.
-     * At the end, the list of children UiElementNode here will match the one from the
-     * provided XML {@link Node}:
-     * <ul>
-     * <li> Walk both the current ui children list and the xml children list at the same time.
-     * <li> If we have a new xml child but already reached the end of the ui child list, add the
-     *      new xml node.
-     * <li> Otherwise, check if the xml node is referenced later in the ui child list and if so,
-     *      move it here. It means the XML child list has been reordered.
-     * <li> Otherwise, this is a new XML node that we add in the middle of the ui child list.
-     * <li> At the end, we may have finished walking the xml child list but still have remaining
-     *      ui children, simply delete them as they matching trailing xml nodes that have been
-     *      removed unless they are mandatory ui nodes.
-     * </ul>
-     * Note that only the first case is used when populating the ui list the first time.
-     *
-     * @param xmlNode The XML node to mirror
-     * @return True when the XML structure has changed.
-     */
-    protected boolean updateElementList(Node xmlNode) {
-        boolean structureChanged = false;
-        boolean hasMandatoryLast = false;
-        int uiIndex = 0;
-        Node xmlChild = xmlNode.getFirstChild();
-        while (xmlChild != null) {
-            if (xmlChild.getNodeType() == Node.ELEMENT_NODE) {
-                String elementName = xmlChild.getNodeName();
-                UiElementNode uiNode = null;
-                CustomViewDescriptorService service = CustomViewDescriptorService.getInstance();
-                if (mUiChildren.size() <= uiIndex) {
-                    // A new node is being added at the end of the list
-                    ElementDescriptor desc = mDescriptor.findChildrenDescriptor(elementName,
-                            false /* recursive */);
-                    if (desc == null && elementName.indexOf('.') != -1 &&
-                            (!elementName.startsWith(ANDROID_PKG_PREFIX)
-                                    || elementName.startsWith(ANDROID_SUPPORT_PKG_PREFIX))) {
-                        AndroidXmlEditor editor = getEditor();
-                        if (editor != null && editor.getProject() != null) {
-                            desc = service.getDescriptor(editor.getProject(), elementName);
-                        }
-                    }
-                    if (desc == null) {
-                        // Unknown node. Create a temporary descriptor for it.
-                        // We'll add unknown attributes to it later.
-                        IUnknownDescriptorProvider p = getUnknownDescriptorProvider();
-                        desc = p.getDescriptor(elementName);
-                    }
-                    structureChanged = true;
-                    uiNode = appendNewUiChild(desc);
-                    uiIndex++;
-                } else {
-                    // A new node is being inserted or moved.
-                    // Note: mandatory nodes can be created without an XML node in which case
-                    // getXmlNode() is null.
-                    UiElementNode uiChild;
-                    int n = mUiChildren.size();
-                    for (int j = uiIndex; j < n; j++) {
-                        uiChild = mUiChildren.get(j);
-                        if (uiChild.getXmlNode() != null && uiChild.getXmlNode() == xmlChild) {
-                            if (j > uiIndex) {
-                                // Found the same XML node at some later index, now move it here.
-                                mUiChildren.remove(j);
-                                mUiChildren.add(uiIndex, uiChild);
-                                structureChanged = true;
-                            }
-                            uiNode = uiChild;
-                            uiIndex++;
-                            break;
-                        }
-                    }
-
-                    if (uiNode == null) {
-                        // Look for an unused mandatory node with no XML node attached
-                        // referencing the same XML element name
-                        for (int j = uiIndex; j < n; j++) {
-                            uiChild = mUiChildren.get(j);
-                            if (uiChild.getXmlNode() == null &&
-                                    uiChild.getDescriptor().getMandatory() !=
-                                                                Mandatory.NOT_MANDATORY &&
-                                    uiChild.getDescriptor().getXmlName().equals(elementName)) {
-
-                                if (j > uiIndex) {
-                                    // Found it, now move it here
-                                    mUiChildren.remove(j);
-                                    mUiChildren.add(uiIndex, uiChild);
-                                }
-                                // Assign the XML node to this empty mandatory element.
-                                uiChild.mXmlNode = xmlChild;
-                                structureChanged = true;
-                                uiNode = uiChild;
-                                uiIndex++;
-                            }
-                        }
-                    }
-
-                    if (uiNode == null) {
-                        // Inserting new node
-                        ElementDescriptor desc = mDescriptor.findChildrenDescriptor(elementName,
-                                false /* recursive */);
-                        if (desc == null && elementName.indexOf('.') != -1 &&
-                                (!elementName.startsWith(ANDROID_PKG_PREFIX)
-                                        || elementName.startsWith(ANDROID_SUPPORT_PKG_PREFIX))) {
-                            AndroidXmlEditor editor = getEditor();
-                            if (editor != null && editor.getProject() != null) {
-                                desc = service.getDescriptor(editor.getProject(), elementName);
-                            }
-                        }
-                        if (desc == null) {
-                            // Unknown node. Create a temporary descriptor for it.
-                            // We'll add unknown attributes to it later.
-                            IUnknownDescriptorProvider p = getUnknownDescriptorProvider();
-                            desc = p.getDescriptor(elementName);
-                        } else {
-                            structureChanged = true;
-                            uiNode = insertNewUiChild(uiIndex, desc);
-                            uiIndex++;
-                        }
-                    }
-                }
-                if (uiNode != null) {
-                    // If we touched an UI Node, even an existing one, refresh its content.
-                    // For new nodes, this will populate them recursively.
-                    structureChanged |= uiNode.loadFromXmlNode(xmlChild);
-
-                    // Remember if there are any mandatory-last nodes to reorder.
-                    hasMandatoryLast |=
-                        uiNode.getDescriptor().getMandatory() == Mandatory.MANDATORY_LAST;
-                }
-            }
-            xmlChild = xmlChild.getNextSibling();
-        }
-
-        // There might be extra UI nodes at the end if the XML node list got shorter.
-        for (int index = mUiChildren.size() - 1; index >= uiIndex; --index) {
-             structureChanged |= removeUiChildAtIndex(index);
-        }
-
-        if (hasMandatoryLast) {
-            // At least one mandatory-last uiNode was moved. Let's see if we can
-            // move them back to the last position. That's possible if the only
-            // thing between these and the end are other mandatory empty uiNodes
-            // (mandatory uiNodes with no XML attached are pure "virtual" reserved
-            // slots and it's ok to reorganize them but other can't.)
-            int n = mUiChildren.size() - 1;
-            for (int index = n; index >= 0; index--) {
-                UiElementNode uiChild = mUiChildren.get(index);
-                Mandatory mand = uiChild.getDescriptor().getMandatory();
-                if (mand == Mandatory.MANDATORY_LAST && index < n) {
-                    // Remove it from index and move it back at the end of the list.
-                    mUiChildren.remove(index);
-                    mUiChildren.add(uiChild);
-                } else if (mand == Mandatory.NOT_MANDATORY || uiChild.getXmlNode() != null) {
-                    // We found at least one non-mandatory or a mandatory node with an actual
-                    // XML attached, so there's nothing we can reorganize past this point.
-                    break;
-                }
-            }
-        }
-
-        return structureChanged;
-    }
-
-    /**
-     * Internal helper to remove an UI child node given by its index in the
-     * internal child list.
-     *
-     * Also invokes the update listener on the node to be deleted *after* the node has
-     * been removed.
-     *
-     * @param uiIndex The index of the UI child to remove, range 0 .. mUiChildren.size()-1
-     * @return True if the structure has changed
-     * @throws IndexOutOfBoundsException if index is out of mUiChildren's bounds. Of course you
-     *         know that could never happen unless the computer is on fire or something.
-     */
-    private boolean removeUiChildAtIndex(int uiIndex) {
-        UiElementNode uiNode = mUiChildren.get(uiIndex);
-        ElementDescriptor desc = uiNode.getDescriptor();
-
-        try {
-            if (uiNode.getDescriptor().getMandatory() != Mandatory.NOT_MANDATORY) {
-                // This is a mandatory node. Such a node must exist in the UiNode hierarchy
-                // even if there's no XML counterpart. However we only need to keep one.
-
-                // Check if the parent (e.g. this node) has another similar ui child node.
-                boolean keepNode = true;
-                for (UiElementNode child : mUiChildren) {
-                    if (child != uiNode && child.getDescriptor() == desc) {
-                        // We found another child with the same descriptor that is not
-                        // the node we want to remove. This means we have one mandatory
-                        // node so we can safely remove uiNode.
-                        keepNode = false;
-                        break;
-                    }
-                }
-
-                if (keepNode) {
-                    // We can't remove a mandatory node as we need to keep at least one
-                    // mandatory node in the parent. Instead we just clear its content
-                    // (including its XML Node reference).
-
-                    // A mandatory node with no XML means it doesn't really exist, so it can't be
-                    // deleted. So the structure will change only if the ui node is actually
-                    // associated to an XML node.
-                    boolean xmlExists = (uiNode.getXmlNode() != null);
-
-                    uiNode.clearContent();
-                    return xmlExists;
-                }
-            }
-
-            mUiChildren.remove(uiIndex);
-
-            return true;
-        } finally {
-            // Tell listeners that a node has been removed.
-            // The model has already been modified.
-            invokeUiUpdateListeners(UiUpdateState.DELETED);
-        }
-    }
-
-    /**
-     * Creates a new {@link UiElementNode} from the given {@link ElementDescriptor}
-     * and appends it to the end of the element children list.
-     *
-     * @param descriptor The {@link ElementDescriptor} that knows how to create the UI node.
-     * @return The new UI node that has been appended
-     */
-    public UiElementNode appendNewUiChild(ElementDescriptor descriptor) {
-        UiElementNode uiNode;
-        uiNode = descriptor.createUiNode();
-        mUiChildren.add(uiNode);
-        uiNode.setUiParent(this);
-        uiNode.invokeUiUpdateListeners(UiUpdateState.CREATED);
-        return uiNode;
-    }
-
-    /**
-     * Creates a new {@link UiElementNode} from the given {@link ElementDescriptor}
-     * and inserts it in the element children list at the specified position.
-     *
-     * @param index The position where to insert in the element children list.
-     *              Shifts the element currently at that position (if any) and any
-     *              subsequent elements to the right (adds one to their indices).
-     *              Index must >= 0 and <= getUiChildren.size().
-     *              Using size() means to append to the end of the list.
-     * @param descriptor The {@link ElementDescriptor} that knows how to create the UI node.
-     * @return The new UI node.
-     */
-    public UiElementNode insertNewUiChild(int index, ElementDescriptor descriptor) {
-        UiElementNode uiNode;
-        uiNode = descriptor.createUiNode();
-        mUiChildren.add(index, uiNode);
-        uiNode.setUiParent(this);
-        uiNode.invokeUiUpdateListeners(UiUpdateState.CREATED);
-        return uiNode;
-    }
-
-    /**
-     * Updates the {@link UiAttributeNode} list for this {@link UiElementNode}
-     * using the values from the XML element.
-     * <p/>
-     * For a given {@link UiElementNode}, the attribute list always exists in
-     * full and is totally independent of whether the XML model actually
-     * has the corresponding attributes.
-     * <p/>
-     * For each attribute declared in this {@link UiElementNode}, get
-     * the corresponding XML attribute. It may not exist, in which case the
-     * value will be null. We don't really know if a value has changed, so
-     * the updateValue() is called on the UI attribute in all cases.
-     *
-     * @param xmlNode The XML node to mirror
-     */
-    protected void updateAttributeList(Node xmlNode) {
-        NamedNodeMap xmlAttrMap = xmlNode.getAttributes();
-        HashSet<Node> visited = new HashSet<Node>();
-
-        // For all known (i.e. expected) UI attributes, find an existing XML attribute of
-        // same (uri, local name) and update the internal Ui attribute value.
-        for (UiAttributeNode uiAttr : getInternalUiAttributes().values()) {
-            AttributeDescriptor desc = uiAttr.getDescriptor();
-            if (!(desc instanceof SeparatorAttributeDescriptor)) {
-                Node xmlAttr = xmlAttrMap == null ? null :
-                    xmlAttrMap.getNamedItemNS(desc.getNamespaceUri(), desc.getXmlLocalName());
-                uiAttr.updateValue(xmlAttr);
-                visited.add(xmlAttr);
-            }
-        }
-
-        // Clone the current list of unknown attributes. We'll then remove from this list when
-        // we find attributes which are still unknown. What will be left are the old unknown
-        // attributes that have been deleted in the current XML attribute list.
-        @SuppressWarnings("unchecked")
-        HashSet<UiAttributeNode> deleted = (HashSet<UiAttributeNode>) mUnknownUiAttributes.clone();
-
-        // We need to ignore hidden attributes.
-        Map<String, AttributeDescriptor> hiddenAttrDesc = getHiddenAttributeDescriptors();
-
-        // Traverse the actual XML attribute list to find unknown attributes
-        if (xmlAttrMap != null) {
-            for (int i = 0; i < xmlAttrMap.getLength(); i++) {
-                Node xmlAttr = xmlAttrMap.item(i);
-                // Ignore attributes which have actual descriptors
-                if (visited.contains(xmlAttr)) {
-                    continue;
-                }
-
-                String xmlFullName = xmlAttr.getNodeName();
-
-                // Ignore attributes which are hidden (based on the prefix:localName key)
-                if (hiddenAttrDesc.containsKey(xmlFullName)) {
-                    continue;
-                }
-
-                String xmlAttrLocalName = xmlAttr.getLocalName();
-                String xmlNsUri = xmlAttr.getNamespaceURI();
-
-                UiAttributeNode uiAttr = null;
-                for (UiAttributeNode a : mUnknownUiAttributes) {
-                    String aLocalName = a.getDescriptor().getXmlLocalName();
-                    String aNsUri = a.getDescriptor().getNamespaceUri();
-                    if (aLocalName.equals(xmlAttrLocalName) &&
-                            (aNsUri == xmlNsUri || (aNsUri != null && aNsUri.equals(xmlNsUri)))) {
-                        // This attribute is still present in the unknown list
-                        uiAttr = a;
-                        // It has not been deleted
-                        deleted.remove(a);
-                        break;
-                    }
-                }
-                if (uiAttr == null) {
-                    uiAttr = addUnknownAttribute(xmlFullName, xmlAttrLocalName, xmlNsUri);
-                }
-
-                uiAttr.updateValue(xmlAttr);
-            }
-
-            // Remove from the internal list unknown attributes that have been deleted from the xml
-            for (UiAttributeNode a : deleted) {
-                mUnknownUiAttributes.remove(a);
-                mCachedAllUiAttributes = null;
-            }
-        }
-    }
-
-    /**
-     * Create a new temporary text attribute descriptor for the unknown attribute
-     * and returns a new {@link UiAttributeNode} associated to this descriptor.
-     * <p/>
-     * The attribute is not marked as dirty, doing so is up to the caller.
-     */
-    private UiAttributeNode addUnknownAttribute(String xmlFullName,
-            String xmlAttrLocalName, String xmlNsUri) {
-        // Create a new unknown attribute of format string
-        TextAttributeDescriptor desc = new TextAttributeDescriptor(
-                xmlAttrLocalName,           // xml name
-                xmlNsUri,                // ui name
-                new AttributeInfo(xmlAttrLocalName, Format.STRING_SET)
-                );
-        UiAttributeNode uiAttr = desc.createUiNode(this);
-        mUnknownUiAttributes.add(uiAttr);
-        mCachedAllUiAttributes = null;
-        return uiAttr;
-    }
-
-    /**
-     * Invoke all registered {@link IUiUpdateListener} listening on this UI update for this node.
-     */
-    protected void invokeUiUpdateListeners(UiUpdateState state) {
-        if (mUiUpdateListeners != null) {
-            for (IUiUpdateListener listener : mUiUpdateListeners) {
-                try {
-                    listener.uiElementNodeUpdated(this, state);
-                } catch (Exception e) {
-                    // prevent a crashing listener from crashing the whole invocation chain
-                    AdtPlugin.log(e, "UIElement Listener failed: %s, state=%s",  //$NON-NLS-1$
-                            getBreadcrumbTrailDescription(true),
-                            state.toString());
-                }
-            }
-        }
-    }
-
-    // --- for derived implementations only ---
-
-    @VisibleForTesting
-    public void setXmlNode(Node xmlNode) {
-        mXmlNode = xmlNode;
-    }
-
-    public void refreshUi() {
-        invokeUiUpdateListeners(UiUpdateState.ATTR_UPDATED);
-    }
-
-
-    // ------------- Helpers
-
-    /**
-     * Helper method to commit a single attribute value to XML.
-     * <p/>
-     * This method updates the XML regardless of the current XML value.
-     * Callers should check first if an update is needed.
-     * If the new value is empty, the XML attribute will be actually removed.
-     * <p/>
-     * Note that the caller MUST ensure that modifying the underlying XML model is
-     * safe and must take care of marking the model as dirty if necessary.
-     *
-     * @see AndroidXmlEditor#wrapEditXmlModel(Runnable)
-     *
-     * @param uiAttr The attribute node to commit. Must be a child of this UiElementNode.
-     * @param newValue The new value to set.
-     * @return True if the XML attribute was modified or removed, false if nothing changed.
-     */
-    public boolean commitAttributeToXml(UiAttributeNode uiAttr, String newValue) {
-        // Get (or create) the underlying XML element node that contains the attributes.
-        Node element = prepareCommit();
-        if (element != null && uiAttr != null) {
-            String attrLocalName = uiAttr.getDescriptor().getXmlLocalName();
-            String attrNsUri = uiAttr.getDescriptor().getNamespaceUri();
-
-            NamedNodeMap attrMap = element.getAttributes();
-            if (newValue == null || newValue.length() == 0) {
-                // Remove attribute if it's empty
-                if (attrMap.getNamedItemNS(attrNsUri, attrLocalName) != null) {
-                    attrMap.removeNamedItemNS(attrNsUri, attrLocalName);
-                    return true;
-                }
-            } else {
-                // Add or replace an attribute
-                Document doc = element.getOwnerDocument();
-                if (doc != null) {
-                    Attr attr;
-                    if (attrNsUri != null && attrNsUri.length() > 0) {
-                        attr = (Attr) attrMap.getNamedItemNS(attrNsUri, attrLocalName);
-                        if (attr == null) {
-                            attr = doc.createAttributeNS(attrNsUri, attrLocalName);
-                            attr.setPrefix(XmlUtils.lookupNamespacePrefix(element, attrNsUri));
-                            attrMap.setNamedItemNS(attr);
-                        }
-                    } else {
-                        attr = (Attr) attrMap.getNamedItem(attrLocalName);
-                        if (attr == null) {
-                            attr = doc.createAttribute(attrLocalName);
-                            attrMap.setNamedItem(attr);
-                        }
-                    }
-                    attr.setValue(newValue);
-                    return true;
-                }
-            }
-        }
-        return false;
-    }
-
-    /**
-     * Helper method to commit all dirty attributes values to XML.
-     * <p/>
-     * This method is useful if {@link #setAttributeValue(String, String, String, boolean)} has
-     * been called more than once and all the attributes marked as dirty must be committed to
-     * the XML. It calls {@link #commitAttributeToXml(UiAttributeNode, String)} on each dirty
-     * attribute.
-     * <p/>
-     * Note that the caller MUST ensure that modifying the underlying XML model is
-     * safe and must take care of marking the model as dirty if necessary.
-     *
-     * @see AndroidXmlEditor#wrapEditXmlModel(Runnable)
-     *
-     * @return True if one or more values were actually modified or removed,
-     *         false if nothing changed.
-     */
-    @SuppressWarnings("null") // Eclipse is confused by the logic and gets it wrong
-    public boolean commitDirtyAttributesToXml() {
-        boolean result = false;
-        List<UiAttributeNode> dirtyAttributes = new ArrayList<UiAttributeNode>();
-        for (UiAttributeNode uiAttr : getAllUiAttributes()) {
-            if (uiAttr.isDirty()) {
-                String value = uiAttr.getCurrentValue();
-                if (value != null && value.length() > 0) {
-                    // Defer the new attributes: set these last and in order
-                    dirtyAttributes.add(uiAttr);
-                } else {
-                    result |= commitAttributeToXml(uiAttr, value);
-                    uiAttr.setDirty(false);
-                }
-            }
-        }
-        if (dirtyAttributes.size() > 0) {
-            result = true;
-
-            Collections.sort(dirtyAttributes);
-
-            // The Eclipse XML model will *always* append new attributes.
-            // Therefore, if any of the dirty attributes are new, they will appear
-            // after any existing, clean attributes on the element. To fix this,
-            // we need to first remove any of these attributes, then insert them
-            // back in the right order.
-            Node element = prepareCommit();
-            if (element == null) {
-                return result;
-            }
-
-            if (AdtPrefs.getPrefs().getFormatGuiXml() && getEditor().supportsFormatOnGuiEdit()) {
-                // If auto formatting, don't bother with attribute sorting here since the
-                // order will be corrected as soon as the edit is committed anyway
-                for (UiAttributeNode uiAttribute : dirtyAttributes) {
-                    commitAttributeToXml(uiAttribute, uiAttribute.getCurrentValue());
-                    uiAttribute.setDirty(false);
-                }
-
-                return result;
-            }
-
-            AttributeDescriptor descriptor = dirtyAttributes.get(0).getDescriptor();
-            String firstName = descriptor.getXmlLocalName();
-            String firstNamePrefix = null;
-            String namespaceUri = descriptor.getNamespaceUri();
-            if (namespaceUri != null) {
-                firstNamePrefix = XmlUtils.lookupNamespacePrefix(element, namespaceUri);
-            }
-            NamedNodeMap attributes = ((Element) element).getAttributes();
-            List<Attr> move = new ArrayList<Attr>();
-            for (int i = 0, n = attributes.getLength(); i < n; i++) {
-                Attr attribute = (Attr) attributes.item(i);
-                if (XmlAttributeSortOrder.compareAttributes(
-                        attribute.getPrefix(), attribute.getLocalName(),
-                        firstNamePrefix, firstName) > 0) {
-                    move.add(attribute);
-                }
-            }
-
-            for (Attr attribute : move) {
-                if (attribute.getNamespaceURI() != null) {
-                    attributes.removeNamedItemNS(attribute.getNamespaceURI(),
-                            attribute.getLocalName());
-                } else {
-                    attributes.removeNamedItem(attribute.getName());
-                }
-            }
-
-            // Merge back the removed DOM attribute nodes and the new UI attribute nodes.
-            // In cases where the attribute DOM name and the UI attribute names equal,
-            // skip the DOM nodes and just apply the UI attributes.
-            int domAttributeIndex = 0;
-            int domAttributeIndexMax = move.size();
-            int uiAttributeIndex = 0;
-            int uiAttributeIndexMax = dirtyAttributes.size();
-
-            while (true) {
-                Attr domAttribute;
-                UiAttributeNode uiAttribute;
-
-                int compare;
-                if (uiAttributeIndex < uiAttributeIndexMax) {
-                    if (domAttributeIndex < domAttributeIndexMax) {
-                        domAttribute = move.get(domAttributeIndex);
-                        uiAttribute = dirtyAttributes.get(uiAttributeIndex);
-
-                        String domAttributeName = domAttribute.getLocalName();
-                        String uiAttributeName = uiAttribute.getDescriptor().getXmlLocalName();
-                        compare = XmlAttributeSortOrder.compareAttributes(domAttributeName,
-                                uiAttributeName);
-                    } else {
-                        compare = 1;
-                        uiAttribute = dirtyAttributes.get(uiAttributeIndex);
-                        domAttribute = null;
-                    }
-                } else if (domAttributeIndex < domAttributeIndexMax) {
-                    compare = -1;
-                    domAttribute = move.get(domAttributeIndex);
-                    uiAttribute = null;
-                } else {
-                    break;
-                }
-
-                if (compare < 0) {
-                    if (domAttribute.getNamespaceURI() != null) {
-                        attributes.setNamedItemNS(domAttribute);
-                    } else {
-                        attributes.setNamedItem(domAttribute);
-                    }
-                    domAttributeIndex++;
-                } else {
-                    assert compare >= 0;
-                    if (compare == 0) {
-                        domAttributeIndex++;
-                    }
-                    commitAttributeToXml(uiAttribute, uiAttribute.getCurrentValue());
-                    uiAttribute.setDirty(false);
-                    uiAttributeIndex++;
-                }
-            }
-        }
-
-        return result;
-    }
-
-    /**
-     * Utility method to internally set the value of a text attribute for the current
-     * UiElementNode.
-     * <p/>
-     * This method is a helper. It silently ignores the errors such as the requested
-     * attribute not being present in the element or attribute not being settable.
-     * It accepts inherited attributes (such as layout).
-     * <p/>
-     * This does not commit to the XML model. It does mark the attribute node as dirty.
-     * This is up to the caller.
-     *
-     * @see #commitAttributeToXml(UiAttributeNode, String)
-     * @see #commitDirtyAttributesToXml()
-     *
-     * @param attrXmlName The XML <em>local</em> name of the attribute to modify
-     * @param attrNsUri The namespace URI of the attribute.
-     *                  Can be null if the attribute uses the global namespace.
-     * @param value The new value for the attribute. If set to null, the attribute is removed.
-     * @param override True if the value must be set even if one already exists.
-     * @return The {@link UiAttributeNode} that has been modified or null.
-     */
-    public UiAttributeNode setAttributeValue(
-            String attrXmlName,
-            String attrNsUri,
-            String value,
-            boolean override) {
-        if (value == null) {
-            value = ""; //$NON-NLS-1$ -- this removes an attribute
-        }
-
-        getEditor().scheduleNodeReformat(this, true);
-
-        // Try with all internal attributes
-        UiAttributeNode uiAttr = setInternalAttrValue(
-                getAllUiAttributes(), attrXmlName, attrNsUri, value, override);
-        if (uiAttr != null) {
-            return uiAttr;
-        }
-
-        if (uiAttr == null) {
-            // Failed to find the attribute. For non-android attributes that is mostly expected,
-            // in which case we just create a new custom one. As a side effect, we'll find the
-            // attribute descriptor via getAllUiAttributes().
-            addUnknownAttribute(attrXmlName, attrXmlName, attrNsUri);
-
-            // We've created the attribute, but not actually set the value on it, so let's do it.
-            // Try with the updated internal attributes.
-            // Implementation detail: we could just do a setCurrentValue + setDirty on the
-            // uiAttr returned by addUnknownAttribute(); however going through setInternalAttrValue
-            // means we won't duplicate the logic, at the expense of doing one more lookup.
-            uiAttr = setInternalAttrValue(
-                    getAllUiAttributes(), attrXmlName, attrNsUri, value, override);
-        }
-
-        return uiAttr;
-    }
-
-    private UiAttributeNode setInternalAttrValue(
-            Collection<UiAttributeNode> attributes,
-            String attrXmlName,
-            String attrNsUri,
-            String value,
-            boolean override) {
-
-        // For namespace less attributes (like the "layout" attribute of an <include> tag
-        // we may be passed "" as the namespace (during an attribute copy), and it
-        // should really be null instead.
-        if (attrNsUri != null && attrNsUri.length() == 0) {
-            attrNsUri = null;
-        }
-
-        for (UiAttributeNode uiAttr : attributes) {
-            AttributeDescriptor uiDesc = uiAttr.getDescriptor();
-
-            if (uiDesc.getXmlLocalName().equals(attrXmlName)) {
-                // Both NS URI must be either null or equal.
-                if ((attrNsUri == null && uiDesc.getNamespaceUri() == null) ||
-                        (attrNsUri != null && attrNsUri.equals(uiDesc.getNamespaceUri()))) {
-
-                    // Not all attributes are editable, ignore those which are not.
-                    if (uiAttr instanceof IUiSettableAttributeNode) {
-                        String current = uiAttr.getCurrentValue();
-                        // Only update (and mark as dirty) if the attribute did not have any
-                        // value or if the value was different.
-                        if (override || current == null || !current.equals(value)) {
-                            ((IUiSettableAttributeNode) uiAttr).setCurrentValue(value);
-                            // mark the attribute as dirty since their internal content
-                            // as been modified, but not the underlying XML model
-                            uiAttr.setDirty(true);
-                            return uiAttr;
-                        }
-                    }
-
-                    // We found the attribute but it's not settable. Since attributes are
-                    // not duplicated, just abandon here.
-                    break;
-                }
-            }
-        }
-
-        return null;
-    }
-
-    /**
-     * Utility method to retrieve the internal value of an attribute.
-     * <p/>
-     * Note that this retrieves the *field* value if the attribute has some UI, and
-     * not the actual XML value. They may differ if the attribute is dirty.
-     *
-     * @param attrXmlName The XML name of the attribute to modify
-     * @return The current internal value for the attribute or null in case of error.
-     */
-    public String getAttributeValue(String attrXmlName) {
-        HashMap<AttributeDescriptor, UiAttributeNode> attributeMap = getInternalUiAttributes();
-
-        for (Entry<AttributeDescriptor, UiAttributeNode> entry : attributeMap.entrySet()) {
-            AttributeDescriptor uiDesc = entry.getKey();
-            if (uiDesc.getXmlLocalName().equals(attrXmlName)) {
-                UiAttributeNode uiAttr = entry.getValue();
-                return uiAttr.getCurrentValue();
-            }
-        }
-        return null;
-    }
-
-    // ------ IPropertySource methods
-
-    @Override
-    public Object getEditableValue() {
-        return null;
-    }
-
-    /*
-     * (non-Javadoc)
-     * @see org.eclipse.ui.views.properties.IPropertySource#getPropertyDescriptors()
-     *
-     * Returns the property descriptor for this node. Since the descriptors are not linked to the
-     * data, the AttributeDescriptor are used directly.
-     */
-    @Override
-    public IPropertyDescriptor[] getPropertyDescriptors() {
-        List<IPropertyDescriptor> propDescs = new ArrayList<IPropertyDescriptor>();
-
-        // get the standard descriptors
-        HashMap<AttributeDescriptor, UiAttributeNode> attributeMap = getInternalUiAttributes();
-        Set<AttributeDescriptor> keys = attributeMap.keySet();
-
-
-        // we only want the descriptor that do implement the IPropertyDescriptor interface.
-        for (AttributeDescriptor key : keys) {
-            if (key instanceof IPropertyDescriptor) {
-                propDescs.add((IPropertyDescriptor)key);
-            }
-        }
-
-        // now get the descriptor from the unknown attributes
-        for (UiAttributeNode unknownNode : mUnknownUiAttributes) {
-            if (unknownNode.getDescriptor() instanceof IPropertyDescriptor) {
-                propDescs.add((IPropertyDescriptor)unknownNode.getDescriptor());
-            }
-        }
-
-        // TODO cache this maybe, as it's not going to change (except for unknown descriptors)
-        return propDescs.toArray(new IPropertyDescriptor[propDescs.size()]);
-    }
-
-    /*
-     * (non-Javadoc)
-     * @see org.eclipse.ui.views.properties.IPropertySource#getPropertyValue(java.lang.Object)
-     *
-     * Returns the value of a given property. The id is the result of IPropertyDescriptor.getId(),
-     * which return the AttributeDescriptor itself.
-     */
-    @Override
-    public Object getPropertyValue(Object id) {
-        HashMap<AttributeDescriptor, UiAttributeNode> attributeMap = getInternalUiAttributes();
-
-        UiAttributeNode attribute = attributeMap.get(id);
-
-        if (attribute == null) {
-            // look for the id in the unknown attributes.
-            for (UiAttributeNode unknownAttr : mUnknownUiAttributes) {
-                if (id == unknownAttr.getDescriptor()) {
-                    return unknownAttr;
-                }
-            }
-        }
-
-        return attribute;
-    }
-
-    /*
-     * (non-Javadoc)
-     * @see org.eclipse.ui.views.properties.IPropertySource#isPropertySet(java.lang.Object)
-     *
-     * Returns whether the property is set. In our case this is if the string is non empty.
-     */
-    @Override
-    public boolean isPropertySet(Object id) {
-        HashMap<AttributeDescriptor, UiAttributeNode> attributeMap = getInternalUiAttributes();
-
-        UiAttributeNode attribute = attributeMap.get(id);
-
-        if (attribute != null) {
-            return attribute.getCurrentValue().length() > 0;
-        }
-
-        // look for the id in the unknown attributes.
-        for (UiAttributeNode unknownAttr : mUnknownUiAttributes) {
-            if (id == unknownAttr.getDescriptor()) {
-                return unknownAttr.getCurrentValue().length() > 0;
-            }
-        }
-
-        return false;
-    }
-
-    /*
-     * (non-Javadoc)
-     * @see org.eclipse.ui.views.properties.IPropertySource#resetPropertyValue(java.lang.Object)
-     *
-     * Reset the property to its default value. For now we simply empty it.
-     */
-    @Override
-    public void resetPropertyValue(Object id) {
-        HashMap<AttributeDescriptor, UiAttributeNode> attributeMap = getInternalUiAttributes();
-
-        UiAttributeNode attribute = attributeMap.get(id);
-        if (attribute != null) {
-            // TODO: reset the value of the attribute
-
-            return;
-        }
-
-        // look for the id in the unknown attributes.
-        for (UiAttributeNode unknownAttr : mUnknownUiAttributes) {
-            if (id == unknownAttr.getDescriptor()) {
-                // TODO: reset the value of the attribute
-
-                return;
-            }
-        }
-    }
-
-    /*
-     * (non-Javadoc)
-     * @see org.eclipse.ui.views.properties.IPropertySource#setPropertyValue(java.lang.Object, java.lang.Object)
-     *
-     * Set the property value. id is the result of IPropertyDescriptor.getId(), which is the
-     * AttributeDescriptor itself. Value should be a String.
-     */
-    @Override
-    public void setPropertyValue(Object id, Object value) {
-        HashMap<AttributeDescriptor, UiAttributeNode> attributeMap = getInternalUiAttributes();
-
-        UiAttributeNode attribute = attributeMap.get(id);
-
-        if (attribute == null) {
-            // look for the id in the unknown attributes.
-            for (UiAttributeNode unknownAttr : mUnknownUiAttributes) {
-                if (id == unknownAttr.getDescriptor()) {
-                    attribute = unknownAttr;
-                    break;
-                }
-            }
-        }
-
-        if (attribute != null) {
-
-            // get the current value and compare it to the new value
-            String oldValue = attribute.getCurrentValue();
-            final String newValue = (String)value;
-
-            if (oldValue.equals(newValue)) {
-                return;
-            }
-
-            final UiAttributeNode fAttribute = attribute;
-            AndroidXmlEditor editor = getEditor();
-            editor.wrapEditXmlModel(new Runnable() {
-                @Override
-                public void run() {
-                    commitAttributeToXml(fAttribute, newValue);
-                }
-            });
-        }
-    }
-
-    /**
-     * Returns true if this node is an ancestor (parent, grandparent, and so on)
-     * of the given node. Note that a node is not considered an ancestor of
-     * itself.
-     *
-     * @param node the node to test
-     * @return true if this node is an ancestor of the given node
-     */
-    public boolean isAncestorOf(UiElementNode node) {
-        node = node.getUiParent();
-        while (node != null) {
-            if (node == this) {
-                return true;
-            }
-            node = node.getUiParent();
-        }
-        return false;
-    }
-
-    /**
-     * Finds the nearest common parent of the two given nodes (which could be one of the
-     * two nodes as well)
-     *
-     * @param node1 the first node to test
-     * @param node2 the second node to test
-     * @return the nearest common parent of the two given nodes
-     */
-    public static UiElementNode getCommonAncestor(UiElementNode node1, UiElementNode node2) {
-        while (node2 != null) {
-            UiElementNode current = node1;
-            while (current != null && current != node2) {
-                current = current.getUiParent();
-            }
-            if (current == node2) {
-                return current;
-            }
-            node2 = node2.getUiParent();
-        }
-
-        return null;
-    }
-
-    // ---- Global node create/delete Listeners ----
-
-    /** List of listeners to be notified of newly created nodes, or null */
-    private static List<NodeCreationListener> sListeners;
-
-    /** Notify listeners that a new node has been created */
-    private void fireNodeCreated(UiElementNode newChild, int index) {
-        // Nothing to do if there aren't any listeners. We don't need to worry about
-        // the case where one thread is firing node changes while another is adding a listener
-        // (in that case it's still okay for this node firing not to be heard) so perform
-        // the check outside of synchronization.
-        if (sListeners == null) {
-            return;
-        }
-        synchronized (UiElementNode.class) {
-            if (sListeners != null) {
-                UiElementNode parent = newChild.getUiParent();
-                for (NodeCreationListener listener : sListeners) {
-                    listener.nodeCreated(parent, newChild, index);
-                }
-            }
-        }
-    }
-
-    /** Notify listeners that a new node has been deleted */
-    private void fireNodeDeleted(UiElementNode oldChild, int index) {
-        if (sListeners == null) {
-            return;
-        }
-        synchronized (UiElementNode.class) {
-            if (sListeners != null) {
-                UiElementNode parent = oldChild.getUiParent();
-                for (NodeCreationListener listener : sListeners) {
-                    listener.nodeDeleted(parent, oldChild, index);
-                }
-            }
-        }
-    }
-
-    /**
-     * Adds a {@link NodeCreationListener} to be notified when new nodes are created
-     *
-     * @param listener the listener to be notified
-     */
-    public static void addNodeCreationListener(NodeCreationListener listener) {
-        synchronized (UiElementNode.class) {
-            if (sListeners == null) {
-                sListeners = new ArrayList<NodeCreationListener>(1);
-            }
-            sListeners.add(listener);
-        }
-    }
-
-    /**
-     * Removes a {@link NodeCreationListener} from the set of listeners such that it is
-     * no longer notified when nodes are created.
-     *
-     * @param listener the listener to be removed from the notification list
-     */
-    public static void removeNodeCreationListener(NodeCreationListener listener) {
-        synchronized (UiElementNode.class) {
-            sListeners.remove(listener);
-            if (sListeners.size() == 0) {
-                sListeners = null;
-            }
-        }
-    }
-
-    /** Interface implemented by listeners to be notified of newly created nodes */
-    public interface NodeCreationListener {
-        /**
-         * Called when a new child node is created and added to the given parent
-         *
-         * @param parent the parent of the created node
-         * @param child the newly node
-         * @param index the index among the siblings of the child <b>after</b>
-         *            insertion
-         */
-        void nodeCreated(UiElementNode parent, UiElementNode child, int index);
-
-        /**
-         * Called when a child node is removed from the given parent
-         *
-         * @param parent the parent of the removed node
-         * @param child the removed node
-         * @param previousIndex the index among the siblings of the child
-         *            <b>before</b> removal
-         */
-        void nodeDeleted(UiElementNode parent, UiElementNode child, int previousIndex);
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/uimodel/UiFlagAttributeNode.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/uimodel/UiFlagAttributeNode.java
deleted file mode 100644
index 13fcdb6..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/uimodel/UiFlagAttributeNode.java
+++ /dev/null
@@ -1,310 +0,0 @@
-/*
- * 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.editors.uimodel;
-
-import com.android.ide.eclipse.adt.internal.editors.AndroidXmlEditor;
-import com.android.ide.eclipse.adt.internal.editors.descriptors.DescriptorsUtils;
-import com.android.ide.eclipse.adt.internal.editors.descriptors.FlagAttributeDescriptor;
-import com.android.ide.eclipse.adt.internal.editors.descriptors.TextAttributeDescriptor;
-import com.android.ide.eclipse.adt.internal.editors.ui.SectionHelper;
-import com.android.ide.eclipse.adt.internal.sdk.AndroidTargetData;
-
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.jface.resource.FontDescriptor;
-import org.eclipse.jface.resource.JFaceResources;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.ControlAdapter;
-import org.eclipse.swt.events.ControlEvent;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.Rectangle;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.swt.widgets.TableColumn;
-import org.eclipse.swt.widgets.TableItem;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.ui.dialogs.SelectionStatusDialog;
-import org.eclipse.ui.forms.IManagedForm;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-import org.eclipse.ui.forms.widgets.TableWrapData;
-
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.Set;
-
-/**
- * Represents an XML attribute that is defined by a set of flag values,
- * i.e. enum names separated by pipe (|) characters.
- *
- * Note: in Android resources, a "flag" is a list of fixed values where one or
- * more values can be selected using an "or", e.g. "align='left|top'".
- * By contrast, an "enum" is a list of fixed values of which only one can be
- * selected at a given time, e.g. "gravity='right'".
- * <p/>
- * This class handles the "flag" case.
- * The "enum" case is done using {@link UiListAttributeNode}.
- */
-public class UiFlagAttributeNode extends UiTextAttributeNode {
-
-    public UiFlagAttributeNode(FlagAttributeDescriptor attributeDescriptor,
-            UiElementNode uiParent) {
-        super(attributeDescriptor, uiParent);
-    }
-
-    /* (non-java doc)
-     * Creates a label widget and an associated text field.
-     * <p/>
-     * As most other parts of the android manifest editor, this assumes the
-     * parent uses a table layout with 2 columns.
-     */
-    @Override
-    public void createUiControl(Composite parent, IManagedForm managedForm) {
-        setManagedForm(managedForm);
-        FormToolkit toolkit = managedForm.getToolkit();
-        TextAttributeDescriptor desc = (TextAttributeDescriptor) getDescriptor();
-
-        Label label = toolkit.createLabel(parent, desc.getUiName());
-        label.setLayoutData(new TableWrapData(TableWrapData.LEFT, TableWrapData.MIDDLE));
-        SectionHelper.addControlTooltip(label, DescriptorsUtils.formatTooltip(desc.getTooltip()));
-
-        Composite composite = toolkit.createComposite(parent);
-        composite.setLayoutData(new TableWrapData(TableWrapData.FILL_GRAB, TableWrapData.MIDDLE));
-        GridLayout gl = new GridLayout(2, false);
-        gl.marginHeight = gl.marginWidth = 0;
-        composite.setLayout(gl);
-        // Fixes missing text borders under GTK... also requires adding a 1-pixel margin
-        // for the text field below
-        toolkit.paintBordersFor(composite);
-
-        final Text text = toolkit.createText(composite, getCurrentValue());
-        GridData gd = new GridData(GridData.FILL_HORIZONTAL);
-        gd.horizontalIndent = 1;  // Needed by the fixed composite borders under GTK
-        text.setLayoutData(gd);
-        final Button selectButton = toolkit.createButton(composite, "Select...", SWT.PUSH);
-
-        setTextWidget(text);
-
-        selectButton.addSelectionListener(new SelectionAdapter() {
-            @Override
-            public void widgetSelected(SelectionEvent e) {
-                super.widgetSelected(e);
-
-                String currentText = getTextWidgetValue();
-
-                String result = showDialog(selectButton.getShell(), currentText);
-
-                if (result != null) {
-                    setTextWidgetValue(result);
-                }
-            }
-        });
-    }
-
-    /**
-     * Get the flag names, either from the initial names set in the attribute
-     * or by querying the framework resource parser.
-     *
-     * {@inheritDoc}
-     */
-    @Override
-    public String[] getPossibleValues(String prefix) {
-        String attr_name = getDescriptor().getXmlLocalName();
-        String element_name = getUiParent().getDescriptor().getXmlName();
-
-        String[] values = null;
-
-        if (getDescriptor() instanceof FlagAttributeDescriptor &&
-                ((FlagAttributeDescriptor) getDescriptor()).getNames() != null) {
-            // Get enum values from the descriptor
-            values = ((FlagAttributeDescriptor) getDescriptor()).getNames();
-        }
-
-        if (values == null) {
-            // or from the AndroidTargetData
-            UiElementNode uiNode = getUiParent();
-            AndroidXmlEditor editor = uiNode.getEditor();
-            AndroidTargetData data = editor.getTargetData();
-            if (data != null) {
-                values = data.getAttributeValues(element_name, attr_name);
-            }
-        }
-
-        return values;
-    }
-
-    /**
-     * Shows a dialog letting the user choose a set of enum, and returns a string
-     * containing the result.
-     */
-    public String showDialog(Shell shell, String currentValue) {
-        FlagSelectionDialog dlg = new FlagSelectionDialog(
-                shell, currentValue.trim().split("\\s*\\|\\s*")); //$NON-NLS-1$
-        dlg.open();
-        Object[] result = dlg.getResult();
-        if (result != null) {
-            StringBuilder buf = new StringBuilder();
-            for (Object name : result) {
-                if (name instanceof String) {
-                    if (buf.length() > 0) {
-                        buf.append('|');
-                    }
-                    buf.append(name);
-                }
-            }
-
-            return buf.toString();
-        }
-
-        return null;
-
-    }
-
-    /**
-     * Displays a list of flag names with checkboxes.
-     */
-    private class FlagSelectionDialog extends SelectionStatusDialog {
-
-        private Set<String> mCurrentSet;
-        private Table mTable;
-
-        public FlagSelectionDialog(Shell parentShell, String[] currentNames) {
-            super(parentShell);
-
-            mCurrentSet = new HashSet<String>();
-            for (String name : currentNames) {
-                if (name.length() > 0) {
-                    mCurrentSet.add(name);
-                }
-            }
-
-            int shellStyle = getShellStyle();
-            setShellStyle(shellStyle | SWT.MAX | SWT.RESIZE);
-        }
-
-        @Override
-        protected void computeResult() {
-            if (mTable != null) {
-                ArrayList<String> results = new ArrayList<String>();
-
-                for (TableItem item : mTable.getItems()) {
-                    if (item.getChecked()) {
-                        results.add((String)item.getData());
-                    }
-                }
-
-                setResult(results);
-            }
-        }
-
-        @Override
-        protected Control createDialogArea(Composite parent) {
-            Composite composite= new Composite(parent, SWT.NONE);
-            composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
-            composite.setLayout(new GridLayout(1, true));
-            composite.setFont(parent.getFont());
-
-            Label label = new Label(composite, SWT.NONE);
-            label.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
-            label.setText(String.format("Select the flag values for attribute %1$s:",
-                    ((FlagAttributeDescriptor) getDescriptor()).getUiName()));
-
-            mTable = new Table(composite, SWT.CHECK | SWT.BORDER);
-            GridData data = new GridData();
-            // The 60,18 hints are the ones used by AbstractElementListSelectionDialog
-            data.widthHint = convertWidthInCharsToPixels(60);
-            data.heightHint = convertHeightInCharsToPixels(18);
-            data.grabExcessVerticalSpace = true;
-            data.grabExcessHorizontalSpace = true;
-            data.horizontalAlignment = GridData.FILL;
-            data.verticalAlignment = GridData.FILL;
-            mTable.setLayoutData(data);
-
-            mTable.setHeaderVisible(false);
-            final TableColumn column = new TableColumn(mTable, SWT.NONE);
-
-            // List all the expected flag names and check those which are currently used
-            String[] names = getPossibleValues(null);
-            if (names != null) {
-                for (String name : names) {
-                    TableItem item = new TableItem(mTable, SWT.NONE);
-                    item.setText(name);
-                    item.setData(name);
-
-                    boolean hasName = mCurrentSet.contains(name);
-                    item.setChecked(hasName);
-                    if (hasName) {
-                        mCurrentSet.remove(name);
-                    }
-                }
-            }
-
-            // If there are unknown flag names currently used, display them at the end if the
-            // table already checked.
-            if (!mCurrentSet.isEmpty()) {
-                FontDescriptor fontDesc = JFaceResources.getDialogFontDescriptor();
-                fontDesc = fontDesc.withStyle(SWT.ITALIC);
-                Font font = fontDesc.createFont(JFaceResources.getDialogFont().getDevice());
-
-                for (String name : mCurrentSet) {
-                    TableItem item = new TableItem(mTable, SWT.NONE);
-                    item.setText(String.format("%1$s (unknown flag)", name));
-                    item.setData(name);
-                    item.setChecked(true);
-                    item.setFont(font);
-                }
-            }
-
-            // Add a listener that will resize the column to the full width of the table
-            // so that only one column appears in the table even if the dialog is resized.
-            ControlAdapter listener = new ControlAdapter() {
-                @Override
-                public void controlResized(ControlEvent e) {
-                    Rectangle r = mTable.getClientArea();
-                    column.setWidth(r.width);
-                }
-            };
-
-            mTable.addControlListener(listener);
-            listener.controlResized(null /* event not used */);
-
-            // Add a selection listener that will check/uncheck items when they are double-clicked
-            mTable.addSelectionListener(new SelectionAdapter() {
-                /** Default selection means double-click on "most" platforms */
-                @Override
-                public void widgetDefaultSelected(SelectionEvent e) {
-                    if (e.item instanceof TableItem) {
-                        TableItem i = (TableItem) e.item;
-                        i.setChecked(!i.getChecked());
-                    }
-                    super.widgetDefaultSelected(e);
-                }
-            });
-
-            Dialog.applyDialogFont(composite);
-            setHelpAvailable(false);
-
-            return composite;
-        }
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/uimodel/UiListAttributeNode.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/uimodel/UiListAttributeNode.java
deleted file mode 100644
index 0fd317c..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/uimodel/UiListAttributeNode.java
+++ /dev/null
@@ -1,220 +0,0 @@
-/*
- * Copyright (C) 2007 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.editors.uimodel;
-
-import com.android.SdkConstants;
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.ide.eclipse.adt.internal.editors.AndroidXmlEditor;
-import com.android.ide.eclipse.adt.internal.editors.descriptors.AttributeDescriptor;
-import com.android.ide.eclipse.adt.internal.editors.descriptors.DescriptorsUtils;
-import com.android.ide.eclipse.adt.internal.editors.descriptors.ListAttributeDescriptor;
-import com.android.ide.eclipse.adt.internal.editors.descriptors.TextAttributeDescriptor;
-import com.android.ide.eclipse.adt.internal.editors.ui.SectionHelper;
-import com.android.ide.eclipse.adt.internal.sdk.AndroidTargetData;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.DisposeEvent;
-import org.eclipse.swt.events.DisposeListener;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.widgets.Combo;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.ui.forms.IManagedForm;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-import org.eclipse.ui.forms.widgets.TableWrapData;
-
-/**
- * Represents an XML attribute which has possible built-in values, and can be modified by
- * an editable Combo box.
- * <p/>
- * See {@link UiTextAttributeNode} for more information.
- */
-public class UiListAttributeNode extends UiAbstractTextAttributeNode {
-
-    protected Combo mCombo;
-
-    public UiListAttributeNode(ListAttributeDescriptor attributeDescriptor,
-            UiElementNode uiParent) {
-        super(attributeDescriptor, uiParent);
-    }
-
-    /* (non-java doc)
-     * Creates a label widget and an associated text field.
-     * <p/>
-     * As most other parts of the android manifest editor, this assumes the
-     * parent uses a table layout with 2 columns.
-     */
-    @Override
-    public final void createUiControl(final Composite parent, IManagedForm managedForm) {
-        FormToolkit toolkit = managedForm.getToolkit();
-        TextAttributeDescriptor desc = (TextAttributeDescriptor) getDescriptor();
-
-        Label label = toolkit.createLabel(parent, desc.getUiName());
-        label.setLayoutData(new TableWrapData(TableWrapData.LEFT, TableWrapData.MIDDLE));
-        SectionHelper.addControlTooltip(label, DescriptorsUtils.formatTooltip(desc.getTooltip()));
-
-        int style = SWT.DROP_DOWN;
-        mCombo = new Combo(parent, style);
-        TableWrapData twd = new TableWrapData(TableWrapData.FILL_GRAB, TableWrapData.MIDDLE);
-        twd.maxWidth = 100;
-        mCombo.setLayoutData(twd);
-
-        fillCombo();
-
-        setTextWidgetValue(getCurrentValue());
-
-        mCombo.addModifyListener(new ModifyListener() {
-            /**
-             * Sent when the text is modified, whether by the user via manual
-             * input or programmatic input via setText().
-             */
-            @Override
-            public void modifyText(ModifyEvent e) {
-                onComboChange();
-            }
-        });
-
-        mCombo.addSelectionListener(new SelectionAdapter() {
-            /** Sent when the text is changed from a list selection. */
-            @Override
-            public void widgetSelected(SelectionEvent e) {
-                onComboChange();
-            }
-        });
-
-        // Remove self-reference when the widget is disposed
-        mCombo.addDisposeListener(new DisposeListener() {
-            @Override
-            public void widgetDisposed(DisposeEvent e) {
-                mCombo = null;
-            }
-        });
-    }
-
-    protected void fillCombo() {
-        String[] values = getPossibleValues(null);
-
-        if (values == null) {
-            AdtPlugin.log(IStatus.ERROR,
-                    "FrameworkResourceManager did not provide values yet for %1$s",
-                    getDescriptor().getXmlLocalName());
-        } else {
-            for (String value : values) {
-                mCombo.add(value);
-            }
-        }
-    }
-
-    /**
-     * Get the list values, either from the initial values set in the attribute
-     * or by querying the framework resource parser.
-     *
-     * {@inheritDoc}
-     */
-    @Override
-    public String[] getPossibleValues(String prefix) {
-        AttributeDescriptor descriptor = getDescriptor();
-        UiElementNode uiParent = getUiParent();
-
-        String attr_name = descriptor.getXmlLocalName();
-        String element_name = uiParent.getDescriptor().getXmlName();
-
-        // FrameworkResourceManager expects a specific prefix for the attribute.
-        String nsPrefix = "";
-        if (SdkConstants.NS_RESOURCES.equals(descriptor.getNamespaceUri())) {
-            nsPrefix = SdkConstants.ANDROID_NS_NAME + ':';
-        } else if (SdkConstants.XMLNS_URI.equals(descriptor.getNamespaceUri())) {
-            nsPrefix = SdkConstants.XMLNS_PREFIX;
-        }
-        attr_name = nsPrefix + attr_name;
-
-        String[] values = null;
-
-        if (descriptor instanceof ListAttributeDescriptor &&
-                ((ListAttributeDescriptor) descriptor).getValues() != null) {
-            // Get enum values from the descriptor
-            values = ((ListAttributeDescriptor) descriptor).getValues();
-        }
-
-        if (values == null) {
-            // or from the AndroidTargetData
-            UiElementNode uiNode = getUiParent();
-            AndroidXmlEditor editor = uiNode.getEditor();
-            AndroidTargetData data = editor.getTargetData();
-            if (data != null) {
-                // get the great-grand-parent descriptor.
-
-                // the parent should always exist.
-                UiElementNode grandParentNode = uiParent.getUiParent();
-
-                String greatGrandParentNodeName = null;
-                if (grandParentNode != null) {
-                    UiElementNode greatGrandParentNode = grandParentNode.getUiParent();
-                    if (greatGrandParentNode != null) {
-                        greatGrandParentNodeName =
-                            greatGrandParentNode.getDescriptor().getXmlName();
-                    }
-                }
-
-                values = data.getAttributeValues(element_name, attr_name, greatGrandParentNodeName);
-            }
-        }
-
-        return values;
-    }
-
-    @Override
-    public String getTextWidgetValue() {
-        if (mCombo != null) {
-            return mCombo.getText();
-        }
-
-        return null;
-    }
-
-    @Override
-    public final boolean isValid() {
-        return mCombo != null;
-    }
-
-    @Override
-    public void setTextWidgetValue(String value) {
-        if (mCombo != null) {
-            mCombo.setText(value);
-        }
-    }
-
-    /**
-     * Handles Combo change, either from text edit or from selection change.
-     * <p/>
-     * Simply mark the attribute as dirty if it really changed.
-     * The container SectionPart will collect these flag and manage them.
-     */
-    private void onComboChange() {
-        if (!isInInternalTextModification() &&
-                !isDirty() &&
-                mCombo != null &&
-                getCurrentValue() != null &&
-                !mCombo.getText().equals(getCurrentValue())) {
-            setDirty(true);
-        }
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/uimodel/UiResourceAttributeNode.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/uimodel/UiResourceAttributeNode.java
deleted file mode 100644
index eb51d3f..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/uimodel/UiResourceAttributeNode.java
+++ /dev/null
@@ -1,523 +0,0 @@
-/*
- * Copyright (C) 2007 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.editors.uimodel;
-
-import static com.android.SdkConstants.ANDROID_PKG;
-import static com.android.SdkConstants.ANDROID_PREFIX;
-import static com.android.SdkConstants.ANDROID_THEME_PREFIX;
-import static com.android.SdkConstants.ATTR_ID;
-import static com.android.SdkConstants.ATTR_LAYOUT;
-import static com.android.SdkConstants.ATTR_STYLE;
-import static com.android.SdkConstants.PREFIX_RESOURCE_REF;
-import static com.android.SdkConstants.PREFIX_THEME_REF;
-
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-import com.android.ide.common.api.IAttributeInfo;
-import com.android.ide.common.api.IAttributeInfo.Format;
-import com.android.ide.common.resources.ResourceItem;
-import com.android.ide.common.resources.ResourceRepository;
-import com.android.ide.eclipse.adt.internal.editors.AndroidXmlEditor;
-import com.android.ide.eclipse.adt.internal.editors.descriptors.AttributeDescriptor;
-import com.android.ide.eclipse.adt.internal.editors.descriptors.DescriptorsUtils;
-import com.android.ide.eclipse.adt.internal.editors.descriptors.TextAttributeDescriptor;
-import com.android.ide.eclipse.adt.internal.editors.ui.SectionHelper;
-import com.android.ide.eclipse.adt.internal.resources.manager.ResourceManager;
-import com.android.ide.eclipse.adt.internal.sdk.AndroidTargetData;
-import com.android.ide.eclipse.adt.internal.sdk.ProjectState;
-import com.android.ide.eclipse.adt.internal.sdk.Sdk;
-import com.android.ide.eclipse.adt.internal.ui.ReferenceChooserDialog;
-import com.android.ide.eclipse.adt.internal.ui.ResourceChooser;
-import com.android.resources.ResourceType;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.jface.window.Window;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.ui.forms.IManagedForm;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-import org.eclipse.ui.forms.widgets.TableWrapData;
-
-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.HashSet;
-import java.util.List;
-import java.util.Set;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-/**
- * Represents an XML attribute for a resource that can be modified using a simple text field or
- * a dialog to choose an existing resource.
- * <p/>
- * It can be configured to represent any kind of resource, by providing the desired
- * {@link ResourceType} in the constructor.
- * <p/>
- * See {@link UiTextAttributeNode} for more information.
- */
-public class UiResourceAttributeNode extends UiTextAttributeNode {
-    private ResourceType mType;
-
-    /**
-     * Creates a new {@linkplain UiResourceAttributeNode}
-     *
-     * @param type the associated resource type
-     * @param attributeDescriptor the attribute descriptor for this attribute
-     * @param uiParent the parent ui node, if any
-     */
-    public UiResourceAttributeNode(ResourceType type,
-            AttributeDescriptor attributeDescriptor, UiElementNode uiParent) {
-        super(attributeDescriptor, uiParent);
-
-        mType = type;
-    }
-
-    /* (non-java doc)
-     * Creates a label widget and an associated text field.
-     * <p/>
-     * As most other parts of the android manifest editor, this assumes the
-     * parent uses a table layout with 2 columns.
-     */
-    @Override
-    public void createUiControl(final Composite parent, IManagedForm managedForm) {
-        setManagedForm(managedForm);
-        FormToolkit toolkit = managedForm.getToolkit();
-        TextAttributeDescriptor desc = (TextAttributeDescriptor) getDescriptor();
-
-        Label label = toolkit.createLabel(parent, desc.getUiName());
-        label.setLayoutData(new TableWrapData(TableWrapData.LEFT, TableWrapData.MIDDLE));
-        SectionHelper.addControlTooltip(label, DescriptorsUtils.formatTooltip(desc.getTooltip()));
-
-        Composite composite = toolkit.createComposite(parent);
-        composite.setLayoutData(new TableWrapData(TableWrapData.FILL_GRAB, TableWrapData.MIDDLE));
-        GridLayout gl = new GridLayout(2, false);
-        gl.marginHeight = gl.marginWidth = 0;
-        composite.setLayout(gl);
-        // Fixes missing text borders under GTK... also requires adding a 1-pixel margin
-        // for the text field below
-        toolkit.paintBordersFor(composite);
-
-        final Text text = toolkit.createText(composite, getCurrentValue());
-        GridData gd = new GridData(GridData.FILL_HORIZONTAL);
-        gd.horizontalIndent = 1;  // Needed by the fixed composite borders under GTK
-        text.setLayoutData(gd);
-        Button browseButton = toolkit.createButton(composite, "Browse...", SWT.PUSH);
-
-        setTextWidget(text);
-
-        // TODO Add a validator using onAddModifyListener
-
-        browseButton.addSelectionListener(new SelectionAdapter() {
-            @Override
-            public void widgetSelected(SelectionEvent e) {
-                String result = showDialog(parent.getShell(), text.getText().trim());
-                if (result != null) {
-                    text.setText(result);
-                }
-            }
-        });
-    }
-
-    /**
-     * Shows a dialog letting the user choose a set of enum, and returns a
-     * string containing the result.
-     *
-     * @param shell the parent shell
-     * @param currentValue an initial value, if any
-     * @return the chosen string, or null
-     */
-    @Nullable
-    public String showDialog(@NonNull Shell shell, @Nullable String currentValue) {
-        // we need to get the project of the file being edited.
-        UiElementNode uiNode = getUiParent();
-        AndroidXmlEditor editor = uiNode.getEditor();
-        IProject project = editor.getProject();
-        if (project != null) {
-            // get the resource repository for this project and the system resources.
-            ResourceRepository projectRepository =
-                ResourceManager.getInstance().getProjectResources(project);
-
-            if (mType != null) {
-                // get the Target Data to get the system resources
-                AndroidTargetData data = editor.getTargetData();
-                ResourceChooser dlg = ResourceChooser.create(project, mType, data, shell)
-                    .setCurrentResource(currentValue);
-                if (dlg.open() == Window.OK) {
-                    return dlg.getCurrentResource();
-                }
-            } else {
-                ReferenceChooserDialog dlg = new ReferenceChooserDialog(
-                        project,
-                        projectRepository,
-                        shell);
-
-                dlg.setCurrentResource(currentValue);
-
-                if (dlg.open() == Window.OK) {
-                    return dlg.getCurrentResource();
-                }
-            }
-        }
-
-        return null;
-    }
-
-    /**
-     * Gets all the values one could use to auto-complete a "resource" value in an XML
-     * content assist.
-     * <p/>
-     * Typically the user is editing the value of an attribute in a resource XML, e.g.
-     *   <pre> "&lt;Button android:test="@string/my_[caret]_string..." </pre>
-     * <p/>
-     *
-     * "prefix" is the value that the user has typed so far (or more exactly whatever is on the
-     * left side of the insertion point). In the example above it would be "@style/my_".
-     * <p/>
-     *
-     * To avoid a huge long list of values, the completion works on two levels:
-     * <ul>
-     * <li> If a resource type as been typed so far (e.g. "@style/"), then limit the values to
-     *      the possible completions that match this type.
-     * <li> If no resource type as been typed so far, then return the various types that could be
-     *      completed. So if the project has only strings and layouts resources, for example,
-     *      the returned list will only include "@string/" and "@layout/".
-     * </ul>
-     *
-     * Finally if anywhere in the string we find the special token "android:", we use the
-     * current framework system resources rather than the project resources.
-     * This works for both "@android:style/foo" and "@style/android:foo" conventions even though
-     * the reconstructed name will always be of the former form.
-     *
-     * Note that "android:" here is a keyword specific to Android resources and should not be
-     * mixed with an XML namespace for an XML attribute name.
-     */
-    @Override
-    public String[] getPossibleValues(String prefix) {
-        return computeResourceStringMatches(getUiParent().getEditor(), getDescriptor(), prefix);
-    }
-
-    /**
-     * Computes the set of resource string matches for a given resource prefix in a given editor
-     *
-     * @param editor the editor context
-     * @param descriptor the attribute descriptor, if any
-     * @param prefix the prefix, if any
-     * @return an array of resource string matches
-     */
-    @Nullable
-    public static String[] computeResourceStringMatches(
-            @NonNull AndroidXmlEditor editor,
-            @Nullable AttributeDescriptor descriptor,
-            @Nullable String prefix) {
-
-        if (prefix == null || !prefix.regionMatches(1, ANDROID_PKG, 0, ANDROID_PKG.length())) {
-            IProject project = editor.getProject();
-            if (project != null) {
-                // get the resource repository for this project and the system resources.
-                ResourceManager resourceManager = ResourceManager.getInstance();
-                ResourceRepository repository = resourceManager.getProjectResources(project);
-
-                List<IProject> libraries = null;
-                ProjectState projectState = Sdk.getProjectState(project);
-                if (projectState != null) {
-                    libraries = projectState.getFullLibraryProjects();
-                }
-
-                String[] projectMatches = computeResourceStringMatches(descriptor, prefix,
-                        repository, false);
-
-                if (libraries == null || libraries.isEmpty()) {
-                    return projectMatches;
-                }
-
-                // Also compute matches for each of the libraries, and combine them
-                Set<String> matches = new HashSet<String>(200);
-                for (String s : projectMatches) {
-                    matches.add(s);
-                }
-
-                for (IProject library : libraries) {
-                    repository = resourceManager.getProjectResources(library);
-                    projectMatches = computeResourceStringMatches(descriptor, prefix,
-                            repository, false);
-                    for (String s : projectMatches) {
-                        matches.add(s);
-                    }
-                }
-
-                String[] sorted = matches.toArray(new String[matches.size()]);
-                Arrays.sort(sorted);
-                return sorted;
-            }
-        } else {
-            // If there's a prefix with "android:" in it, use the system resources
-            // Non-public framework resources are filtered out later.
-            AndroidTargetData data = editor.getTargetData();
-            if (data != null) {
-                ResourceRepository repository = data.getFrameworkResources();
-                return computeResourceStringMatches(descriptor, prefix, repository, true);
-            }
-        }
-
-        return null;
-    }
-
-    /**
-     * Computes the set of resource string matches for a given prefix and a
-     * given resource repository
-     *
-     * @param attributeDescriptor the attribute descriptor, if any
-     * @param prefix the prefix, if any
-     * @param repository the repository to seaerch in
-     * @param isSystem if true, the repository contains framework repository,
-     *            otherwise it contains project repositories
-     * @return an array of resource string matches
-     */
-    @NonNull
-    public static String[] computeResourceStringMatches(
-            @Nullable AttributeDescriptor attributeDescriptor,
-            @Nullable String prefix,
-            @NonNull ResourceRepository repository,
-            boolean isSystem) {
-        // Get list of potential resource types, either specific to this project
-        // or the generic list.
-        Collection<ResourceType> resTypes = (repository != null) ?
-                    repository.getAvailableResourceTypes() :
-                    EnumSet.allOf(ResourceType.class);
-
-        // Get the type name from the prefix, if any. It's any word before the / if there's one
-        String typeName = null;
-        if (prefix != null) {
-            Matcher m = Pattern.compile(".*?([a-z]+)/.*").matcher(prefix);      //$NON-NLS-1$
-            if (m.matches()) {
-                typeName = m.group(1);
-            }
-        }
-
-        // Now collect results
-        List<String> results = new ArrayList<String>();
-
-        if (typeName == null) {
-            // This prefix does not have a / in it, so the resource string is either empty
-            // or does not have the resource type in it. Simply offer the list of potential
-            // resource types.
-            if (prefix != null && prefix.startsWith(PREFIX_THEME_REF)) {
-                results.add(ANDROID_THEME_PREFIX + ResourceType.ATTR.getName() + '/');
-                if (resTypes.contains(ResourceType.ATTR)
-                        || resTypes.contains(ResourceType.STYLE)) {
-                    results.add(PREFIX_THEME_REF + ResourceType.ATTR.getName() + '/');
-                    if (prefix != null && prefix.startsWith(ANDROID_THEME_PREFIX)) {
-                        // including attr isn't required
-                        for (ResourceItem item : repository.getResourceItemsOfType(
-                                ResourceType.ATTR)) {
-                            results.add(ANDROID_THEME_PREFIX + item.getName());
-                        }
-                    }
-                }
-                return results.toArray(new String[results.size()]);
-            }
-
-            for (ResourceType resType : resTypes) {
-                if (isSystem) {
-                    results.add(ANDROID_PREFIX + resType.getName() + '/');
-                } else {
-                    results.add('@' + resType.getName() + '/');
-                }
-                if (resType == ResourceType.ID) {
-                    // Also offer the + version to create an id from scratch
-                    results.add("@+" + resType.getName() + '/');    //$NON-NLS-1$
-                }
-            }
-
-            // Also add in @android: prefix to completion such that if user has typed
-            // "@an" we offer to complete it.
-            if (prefix == null ||
-                    ANDROID_PKG.regionMatches(0, prefix, 1, prefix.length() - 1)) {
-                results.add(ANDROID_PREFIX);
-            }
-        } else if (repository != null) {
-            // We have a style name and a repository. Find all resources that match this
-            // type and recreate suggestions out of them.
-
-            String initial = prefix != null && prefix.startsWith(PREFIX_THEME_REF)
-                    ? PREFIX_THEME_REF : PREFIX_RESOURCE_REF;
-            ResourceType resType = ResourceType.getEnum(typeName);
-            if (resType != null) {
-                StringBuilder sb = new StringBuilder();
-                sb.append(initial);
-                if (prefix != null && prefix.indexOf('+') >= 0) {
-                    sb.append('+');
-                }
-
-                if (isSystem) {
-                    sb.append(ANDROID_PKG).append(':');
-                }
-
-                sb.append(typeName).append('/');
-                String base = sb.toString();
-
-                for (ResourceItem item : repository.getResourceItemsOfType(resType)) {
-                    results.add(base + item.getName());
-                }
-
-                if (!isSystem && resType == ResourceType.ATTR) {
-                    for (ResourceItem item : repository.getResourceItemsOfType(
-                            ResourceType.STYLE)) {
-                        results.add(base + item.getName());
-                    }
-                }
-            }
-        }
-
-        if (attributeDescriptor != null) {
-            sortAttributeChoices(attributeDescriptor, results);
-        } else {
-            Collections.sort(results);
-        }
-
-        return results.toArray(new String[results.size()]);
-    }
-
-    /**
-     * Attempts to sort the attribute values to bubble up the most likely choices to
-     * the top.
-     * <p>
-     * For example, if you are editing a style attribute, it's likely that among the
-     * resource values you would rather see @style or @android than @string.
-     * @param descriptor the descriptor that the resource values are being completed for,
-     *          used to prioritize some of the resource types
-     * @param choices the set of string resource values
-     */
-    public static void sortAttributeChoices(AttributeDescriptor descriptor,
-            List<String> choices) {
-        final IAttributeInfo attributeInfo = descriptor.getAttributeInfo();
-        Collections.sort(choices, new Comparator<String>() {
-            @Override
-            public int compare(String s1, String s2) {
-                int compare = score(attributeInfo, s1) - score(attributeInfo, s2);
-                if (compare == 0) {
-                    // Sort alphabetically as a fallback
-                    compare = s1.compareToIgnoreCase(s2);
-                }
-                return compare;
-            }
-        });
-    }
-
-    /** Compute a suitable sorting score for the given  */
-    private static final int score(IAttributeInfo attributeInfo, String value) {
-        if (value.equals(ANDROID_PREFIX)) {
-            return -1;
-        }
-
-        for (Format format : attributeInfo.getFormats()) {
-            String type = null;
-            switch (format) {
-                case BOOLEAN:
-                    type = "bool"; //$NON-NLS-1$
-                    break;
-                case COLOR:
-                    type = "color"; //$NON-NLS-1$
-                    break;
-                case DIMENSION:
-                    type = "dimen"; //$NON-NLS-1$
-                    break;
-                case INTEGER:
-                    type = "integer"; //$NON-NLS-1$
-                    break;
-                case STRING:
-                    type = "string"; //$NON-NLS-1$
-                    break;
-                // default: REFERENCE, FLAG, ENUM, etc - don't have type info about individual
-                // elements to help make a decision
-            }
-
-            if (type != null) {
-                if (value.startsWith(PREFIX_RESOURCE_REF)) {
-                    if (value.startsWith(PREFIX_RESOURCE_REF + type + '/')) {
-                        return -2;
-                    }
-
-                    if (value.startsWith(ANDROID_PREFIX + type + '/')) {
-                        return -2;
-                    }
-                }
-                if (value.startsWith(PREFIX_THEME_REF)) {
-                    if (value.startsWith(PREFIX_THEME_REF + type + '/')) {
-                        return -2;
-                    }
-
-                    if (value.startsWith(ANDROID_THEME_PREFIX + type + '/')) {
-                        return -2;
-                    }
-                }
-            }
-        }
-
-        // Handle a few more cases not covered by the Format metadata check
-        String type = null;
-
-        String attribute = attributeInfo.getName();
-        if (attribute.equals(ATTR_ID)) {
-            type = "id"; //$NON-NLS-1$
-        } else if (attribute.equals(ATTR_STYLE)) {
-            type = "style"; //$NON-NLS-1$
-        } else if (attribute.equals(ATTR_LAYOUT)) {
-            type = "layout"; //$NON-NLS-1$
-        } else if (attribute.equals("drawable")) { //$NON-NLS-1$
-            type = "drawable"; //$NON-NLS-1$
-        } else if (attribute.equals("entries")) { //$NON-NLS-1$
-            // Spinner
-            type = "array";    //$NON-NLS-1$
-        }
-
-        if (type != null) {
-            if (value.startsWith(PREFIX_RESOURCE_REF)) {
-                if (value.startsWith(PREFIX_RESOURCE_REF + type + '/')) {
-                    return -2;
-                }
-
-                if (value.startsWith(ANDROID_PREFIX + type + '/')) {
-                    return -2;
-                }
-            }
-            if (value.startsWith(PREFIX_THEME_REF)) {
-                if (value.startsWith(PREFIX_THEME_REF + type + '/')) {
-                    return -2;
-                }
-
-                if (value.startsWith(ANDROID_THEME_PREFIX + type + '/')) {
-                    return -2;
-                }
-            }
-        }
-
-        return 0;
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/uimodel/UiSeparatorAttributeNode.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/uimodel/UiSeparatorAttributeNode.java
deleted file mode 100644
index 3d20062..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/uimodel/UiSeparatorAttributeNode.java
+++ /dev/null
@@ -1,146 +0,0 @@
-/*
- * 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.editors.uimodel;
-
-import com.android.ide.eclipse.adt.internal.editors.descriptors.AttributeDescriptor;
-import com.android.ide.eclipse.adt.internal.editors.descriptors.SeparatorAttributeDescriptor;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.ui.forms.IManagedForm;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-import org.eclipse.ui.forms.widgets.TableWrapData;
-import org.eclipse.ui.forms.widgets.TableWrapLayout;
-import org.w3c.dom.Node;
-
-/**
- * {@link UiSeparatorAttributeNode} does not represent any real attribute.
- * <p/>
- * It is used to separate groups of attributes visually.
- */
-public class UiSeparatorAttributeNode extends UiAttributeNode {
-
-    /** Creates a new {@link UiAttributeNode} linked to a specific {@link AttributeDescriptor} */
-    public UiSeparatorAttributeNode(SeparatorAttributeDescriptor attrDesc,
-            UiElementNode uiParent) {
-        super(attrDesc, uiParent);
-    }
-
-    /** Returns the current value of the node. */
-    @Override
-    public String getCurrentValue() {
-        // There is no value here.
-        return null;
-    }
-
-    /**
-     * Sets whether the attribute is dirty and also notifies the editor some part's dirty
-     * flag as changed.
-     * <p/>
-     * Subclasses should set the to true as a result of user interaction with the widgets in
-     * the section and then should set to false when the commit() method completed.
-     */
-    @Override
-    public void setDirty(boolean isDirty) {
-        // This is never dirty.
-    }
-    
-    /**
-     * Called once by the parent user interface to creates the necessary
-     * user interface to edit this attribute.
-     * <p/>
-     * This method can be called more than once in the life cycle of an UI node,
-     * typically when the UI is part of a master-detail tree, as pages are swapped.
-     * 
-     * @param parent The composite where to create the user interface.
-     * @param managedForm The managed form owning this part.
-     */
-    @Override
-    public void createUiControl(Composite parent, IManagedForm managedForm) {
-        FormToolkit toolkit = managedForm.getToolkit();
-        Composite row = toolkit.createComposite(parent);
-        
-        TableWrapData twd = new TableWrapData(TableWrapData.FILL_GRAB);
-        if (parent.getLayout() instanceof TableWrapLayout) {
-            twd.colspan = ((TableWrapLayout) parent.getLayout()).numColumns;
-        }
-        row.setLayoutData(twd);
-        row.setLayout(new GridLayout(3, false /* equal width */));
-
-        Label sep = toolkit.createSeparator(row, SWT.HORIZONTAL);
-        GridData gd = new GridData(SWT.LEFT, SWT.CENTER, false, false);
-        gd.widthHint = 16;
-        sep.setLayoutData(gd);
-
-        Label label = toolkit.createLabel(row, getDescriptor().getXmlLocalName());
-        label.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false));
-
-        sep = toolkit.createSeparator(row, SWT.HORIZONTAL);
-        sep.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
-    }
-    
-    /**
-     * No completion values for this UI attribute.
-     * 
-     * {@inheritDoc}
-     */
-    @Override
-    public String[] getPossibleValues(String prefix) {
-        return null;
-    }
-    
-    /**
-     * Called when the XML is being loaded or has changed to
-     * update the value held by this user interface attribute node.
-     * <p/>
-     * The XML Node <em>may</em> be null, which denotes that the attribute is not
-     * specified in the XML model. In general, this means the "default" value of the
-     * attribute should be used.
-     * <p/>
-     * The caller doesn't really know if attributes have changed,
-     * so it will call this to refresh the attribute anyway. It's up to the
-     * UI implementation to minimize refreshes.
-     * 
-     * @param xml_attribute_node
-     */
-    @Override
-    public void updateValue(Node xml_attribute_node) {
-        // No value to update.
-    }
-
-    /**
-     * Called by the user interface when the editor is saved or its state changed
-     * and the modified attributes must be committed (i.e. written) to the XML model.
-     * <p/>
-     * Important behaviors:
-     * <ul>
-     * <li>The caller *must* have called IStructuredModel.aboutToChangeModel before.
-     *     The implemented methods must assume it is safe to modify the XML model.
-     * <li>On success, the implementation *must* call setDirty(false).
-     * <li>On failure, the implementation can fail with an exception, which
-     *     is trapped and logged by the caller, or do nothing, whichever is more
-     *     appropriate.
-     * </ul>
-     */
-    @Override
-    public void commit() {
-        // No value to commit.
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/uimodel/UiTextAttributeNode.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/uimodel/UiTextAttributeNode.java
deleted file mode 100644
index 504ac31..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/uimodel/UiTextAttributeNode.java
+++ /dev/null
@@ -1,196 +0,0 @@
-/*
- * Copyright (C) 2007 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.editors.uimodel;
-
-import com.android.ide.eclipse.adt.internal.editors.AndroidXmlEditor;
-import com.android.ide.eclipse.adt.internal.editors.descriptors.AttributeDescriptor;
-import com.android.ide.eclipse.adt.internal.editors.descriptors.DescriptorsUtils;
-import com.android.ide.eclipse.adt.internal.editors.descriptors.TextAttributeDescriptor;
-import com.android.ide.eclipse.adt.internal.editors.ui.SectionHelper;
-
-import org.eclipse.swt.events.DisposeEvent;
-import org.eclipse.swt.events.DisposeListener;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.ui.forms.IManagedForm;
-import org.eclipse.ui.forms.widgets.TableWrapData;
-
-/**
- * Represents an XML attribute in that can be modified using a simple text field
- * in the XML editor's user interface.
- * <p/>
- * The XML attribute has no default value. When unset, the text field is blank.
- * When updating the XML, if the field is empty, the attribute will be removed
- * from the XML element.
- * <p/>
- * See {@link UiAttributeNode} for more information.
- */
-public class UiTextAttributeNode extends UiAbstractTextAttributeNode {
-
-    /** Text field */
-    private Text mText;
-    /** The managed form, set only once createUiControl has been called. */
-    private IManagedForm mManagedForm;
-
-    public UiTextAttributeNode(AttributeDescriptor attributeDescriptor, UiElementNode uiParent) {
-        super(attributeDescriptor, uiParent);
-    }
-
-    /* (non-java doc)
-     * Creates a label widget and an associated text field.
-     * <p/>
-     * As most other parts of the android manifest editor, this assumes the
-     * parent uses a table layout with 2 columns.
-     */
-    @Override
-    public void createUiControl(Composite parent, IManagedForm managedForm) {
-        setManagedForm(managedForm);
-        TextAttributeDescriptor desc = (TextAttributeDescriptor) getDescriptor();
-        Text text = SectionHelper.createLabelAndText(parent, managedForm.getToolkit(),
-                desc.getUiName(), getCurrentValue(),
-                DescriptorsUtils.formatTooltip(desc.getTooltip()));
-
-        setTextWidget(text);
-    }
-
-    /**
-     * No completion values for this UI attribute.
-     *
-     * {@inheritDoc}
-     */
-    @Override
-    public String[] getPossibleValues(String prefix) {
-        return null;
-    }
-
-    /**
-     * Sets the internal managed form.
-     * This is usually set by createUiControl.
-     */
-    protected void setManagedForm(IManagedForm managedForm) {
-         mManagedForm = managedForm;
-    }
-
-    /**
-     * @return The managed form, set only once createUiControl has been called.
-     */
-    protected IManagedForm getManagedForm() {
-        return mManagedForm;
-    }
-
-    /* (non-java doc)
-     * Returns if the attribute node is valid, and its UI has been created.
-     */
-    @Override
-    public boolean isValid() {
-        return mText != null;
-    }
-
-    @Override
-    public String getTextWidgetValue() {
-        if (mText != null) {
-            return mText.getText();
-        }
-
-        return null;
-    }
-
-    @Override
-    public void setTextWidgetValue(String value) {
-        if (mText != null) {
-            mText.setText(value);
-        }
-    }
-
-    /**
-     * Sets the Text widget object, and prepares it to handle modification and synchronization
-     * with the XML node.
-     * @param textWidget
-     */
-    protected final void setTextWidget(Text textWidget) {
-        mText = textWidget;
-
-        if (textWidget != null) {
-            // Sets the with hint for the text field. Derived classes can always override it.
-            // This helps the grid layout to resize correctly on smaller screen sizes.
-            Object data = textWidget.getLayoutData();
-            if (data == null) {
-            } else if (data instanceof GridData) {
-                ((GridData)data).widthHint = AndroidXmlEditor.TEXT_WIDTH_HINT;
-            } else if (data instanceof TableWrapData) {
-                ((TableWrapData)data).maxWidth = 100;
-            }
-
-            mText.addModifyListener(new ModifyListener() {
-                /**
-                 * Sent when the text is modified, whether by the user via manual
-                 * input or programmatic input via setText().
-                 * <p/>
-                 * Simply mark the attribute as dirty if it really changed.
-                 * The container SectionPart will collect these flag and manage them.
-                 */
-                @Override
-                public void modifyText(ModifyEvent e) {
-                    if (!isInInternalTextModification() &&
-                            !isDirty() &&
-                            mText != null &&
-                            getCurrentValue() != null &&
-                            !mText.getText().equals(getCurrentValue())) {
-                        setDirty(true);
-                    }
-                }
-            });
-
-            // Remove self-reference when the widget is disposed
-            mText.addDisposeListener(new DisposeListener() {
-                @Override
-                public void widgetDisposed(DisposeEvent e) {
-                    mText = null;
-                }
-            });
-        }
-
-        onAddValidators(mText);
-    }
-
-    /**
-     * Called after the text widget as been created.
-     * <p/>
-     * Derived classes typically want to:
-     * <li> Create a new {@link ModifyListener} and attach it to the given {@link Text} widget.
-     * <li> In the modify listener, call getManagedForm().getMessageManager().addMessage()
-     *      and getManagedForm().getMessageManager().removeMessage() as necessary.
-     * <li> Call removeMessage in a new text.addDisposeListener.
-     * <li> Call the validator once to setup the initial messages as needed.
-     * <p/>
-     * The base implementation does nothing.
-     *
-     * @param text The {@link Text} widget to validate.
-     */
-    protected void onAddValidators(Text text) {
-    }
-
-    /**
-     * Returns the text widget.
-     */
-    protected final Text getTextWidget() {
-        return mText;
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/uimodel/UiTextValueNode.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/uimodel/UiTextValueNode.java
deleted file mode 100644
index 33fa9fc..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/uimodel/UiTextValueNode.java
+++ /dev/null
@@ -1,118 +0,0 @@
-/*
- * Copyright (C) 2007 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.editors.uimodel;
-
-import com.android.ide.eclipse.adt.internal.editors.descriptors.TextValueDescriptor;
-
-import org.w3c.dom.Document;
-import org.w3c.dom.Node;
-import org.w3c.dom.Text;
-
-/**
- * Represents an XML element value in that can be modified using a simple text field
- * in the XML editor's user interface.
- */
-public class UiTextValueNode extends UiTextAttributeNode {
-
-    public UiTextValueNode(TextValueDescriptor attributeDescriptor, UiElementNode uiParent) {
-        super(attributeDescriptor, uiParent);
-    }
-
-    /**
-     * Updates the current text field's value when the XML has changed.
-     * <p/>
-     * The caller doesn't really know if value of the element has changed,
-     * so it will call this to refresh the value anyway. The value
-     * is only set if it has changed.
-     * <p/>
-     * This also resets the "dirty" flag.
-    */
-    @Override
-    public void updateValue(Node xml_attribute_node) {
-        setCurrentValue(DEFAULT_VALUE);
-
-        // The argument xml_attribute_node is not used here. It should always be
-        // null since this is not an attribute. What we want is the "text value" of
-        // the parent element, which is actually the first text node of the element.
-        
-        UiElementNode parent = getUiParent();
-        if (parent != null) {
-            Node xml_node = parent.getXmlNode();
-            if (xml_node != null) {
-                for (Node xml_child = xml_node.getFirstChild();
-                    xml_child != null;
-                    xml_child = xml_child.getNextSibling()) {
-                    if (xml_child.getNodeType() == Node.TEXT_NODE) {
-                        setCurrentValue(xml_child.getNodeValue());
-                        break;
-                    }
-                }
-            }
-        }
-
-        if (isValid() && !getTextWidgetValue().equals(getCurrentValue())) {
-            try {
-                setInInternalTextModification(true);
-                setTextWidgetValue(getCurrentValue());
-                setDirty(false);
-            } finally {
-                setInInternalTextModification(false);
-            }
-        }
-    }
-
-    /* (non-java doc)
-     * Called by the user interface when the editor is saved or its state changed
-     * and the modified "attributes" must be committed (i.e. written) to the XML model.
-     */
-    @Override
-    public void commit() {
-        UiElementNode parent = getUiParent();
-        if (parent != null && isValid() && isDirty()) {
-            // Get (or create) the underlying XML element node that contains the value.
-            Node element = parent.prepareCommit();
-            if (element != null) {
-                String value = getTextWidgetValue();
-
-                // Try to find an existing text child to update.
-                boolean updated = false;
-
-                for (Node xml_child = element.getFirstChild();
-                        xml_child != null;
-                        xml_child = xml_child.getNextSibling()) {
-                    if (xml_child.getNodeType() == Node.TEXT_NODE) {
-                        xml_child.setNodeValue(value);
-                        updated = true;
-                        break;
-                    }
-                }
-
-                // If we didn't find a text child to update, we need to create one.
-                if (!updated) {
-                    Document doc = element.getOwnerDocument();
-                    if (doc != null) {
-                        Text text = doc.createTextNode(value);
-                        element.appendChild(text);
-                    }
-                }
-                
-                setCurrentValue(value);
-            }
-        }
-        setDirty(false);
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/values/ValuesContentAssist.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/values/ValuesContentAssist.java
deleted file mode 100644
index d0ee92c..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/values/ValuesContentAssist.java
+++ /dev/null
@@ -1,242 +0,0 @@
-/*
- * Copyright (C) 2007 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.editors.values;
-
-import static com.android.SdkConstants.ANDROID_NS_NAME_PREFIX;
-import static com.android.SdkConstants.ANDROID_PREFIX;
-import static com.android.SdkConstants.ATTR_NAME;
-import static com.android.SdkConstants.ATTR_TYPE;
-import static com.android.SdkConstants.PREFIX_RESOURCE_REF;
-import static com.android.SdkConstants.TAG_ITEM;
-import static com.android.SdkConstants.TAG_STYLE;
-import static com.android.ide.eclipse.adt.internal.editors.descriptors.AttributeDescriptor.ATTRIBUTE_ICON_FILENAME;
-import static com.android.ide.eclipse.adt.internal.sdk.AndroidTargetData.DESCRIPTOR_LAYOUT;
-
-import com.android.annotations.VisibleForTesting;
-import com.android.ide.eclipse.adt.internal.editors.AndroidContentAssist;
-import com.android.ide.eclipse.adt.internal.editors.IconFactory;
-import com.android.ide.eclipse.adt.internal.editors.descriptors.AttributeDescriptor;
-import com.android.ide.eclipse.adt.internal.editors.descriptors.DocumentDescriptor;
-import com.android.ide.eclipse.adt.internal.editors.descriptors.ElementDescriptor;
-import com.android.ide.eclipse.adt.internal.editors.descriptors.IDescriptorProvider;
-import com.android.ide.eclipse.adt.internal.editors.descriptors.SeparatorAttributeDescriptor;
-import com.android.ide.eclipse.adt.internal.editors.uimodel.UiAttributeNode;
-import com.android.ide.eclipse.adt.internal.editors.uimodel.UiElementNode;
-import com.android.ide.eclipse.adt.internal.editors.uimodel.UiResourceAttributeNode;
-import com.android.ide.eclipse.adt.internal.sdk.AndroidTargetData;
-
-import org.eclipse.jface.text.contentassist.CompletionProposal;
-import org.eclipse.jface.text.contentassist.ICompletionProposal;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-/**
- * Content Assist Processor for /res/values and /res/drawable XML files
- * <p>
- * Further enhancements:
- * <ul>
- *   <li> Complete prefixes in the style element itself for the name attribute
- *   <li> Complete parent names
- * </ul>
- */
-@VisibleForTesting
-public class ValuesContentAssist extends AndroidContentAssist {
-
-    /**
-     * Constructor for ResourcesContentAssist
-     */
-    public ValuesContentAssist() {
-        super(AndroidTargetData.DESCRIPTOR_RESOURCES);
-    }
-
-    @Override
-    protected boolean computeAttributeValues(List<ICompletionProposal> proposals, int offset,
-            String parentTagName, String attributeName, Node node, String wordPrefix,
-            boolean skipEndTag, int replaceLength) {
-        super.computeAttributeValues(proposals, offset, parentTagName, attributeName, node,
-                wordPrefix, skipEndTag, replaceLength);
-
-        if (parentTagName.equals(TAG_ITEM) && ATTR_NAME.equals(attributeName)) {
-
-            // Special case: the user is code completing inside
-            //    <style><item name="^"/></style>
-            // In this case, ALL attributes are valid so we need to synthesize
-            // a choice list from all the layout descriptors
-
-            // Add in android: as a completion item?
-            if (startsWith(ANDROID_NS_NAME_PREFIX, wordPrefix)) {
-                proposals.add(new CompletionProposal(ANDROID_NS_NAME_PREFIX,
-                        offset - wordPrefix.length(), // replacementOffset
-                        wordPrefix.length() + replaceLength, // replacementLength
-                        ANDROID_NS_NAME_PREFIX.length(), // cursorPosition
-                        IconFactory.getInstance().getIcon(ATTRIBUTE_ICON_FILENAME),
-                        null, null, null));
-            }
-
-
-            String attributePrefix = wordPrefix;
-            if (startsWith(attributePrefix, ANDROID_NS_NAME_PREFIX)) {
-                attributePrefix = attributePrefix.substring(ANDROID_NS_NAME_PREFIX.length());
-            }
-
-            AndroidTargetData data = mEditor.getTargetData();
-            if (data != null) {
-                IDescriptorProvider descriptorProvider =
-                    data.getDescriptorProvider(
-                            AndroidTargetData.DESCRIPTOR_LAYOUT);
-                if (descriptorProvider != null) {
-                    ElementDescriptor[] rootElementDescriptors =
-                        descriptorProvider.getRootElementDescriptors();
-                    Map<String, AttributeDescriptor> matches =
-                        new HashMap<String, AttributeDescriptor>(180);
-                    for (ElementDescriptor elementDesc : rootElementDescriptors) {
-                        for (AttributeDescriptor desc : elementDesc.getAttributes()) {
-                            if (desc instanceof SeparatorAttributeDescriptor) {
-                                continue;
-                            }
-                            String name = desc.getXmlLocalName();
-                            if (startsWith(name, attributePrefix)) {
-                                matches.put(name, desc);
-                            }
-                        }
-                    }
-
-                    List<AttributeDescriptor> sorted =
-                        new ArrayList<AttributeDescriptor>(matches.size());
-                    sorted.addAll(matches.values());
-                    Collections.sort(sorted);
-                    char needTag = 0;
-                    addMatchingProposals(proposals, sorted.toArray(), offset, node, wordPrefix,
-                            needTag, true /* isAttribute */, false /* isNew */,
-                            skipEndTag /* skipEndTag */, replaceLength);
-                    return true;
-                }
-            }
-        }
-
-        return false;
-    }
-
-    @Override
-    protected void computeTextValues(List<ICompletionProposal> proposals, int offset,
-            Node parentNode, Node currentNode, UiElementNode uiParent,
-            String prefix) {
-        super.computeTextValues(proposals, offset, parentNode, currentNode, uiParent,
-                prefix);
-
-        if (parentNode.getNodeName().equals(TAG_ITEM) &&
-            parentNode.getParentNode() != null &&
-            TAG_STYLE.equals(parentNode.getParentNode().getNodeName())) {
-
-            // Special case: the user is code completing inside
-            //    <style><item name="android:foo"/>|</style>
-            // In this case, we need to find the right AttributeDescriptor
-            // for the given attribute and offer its values
-
-            AndroidTargetData data = mEditor.getTargetData();
-            if (data != null) {
-                IDescriptorProvider descriptorProvider =
-                    data.getDescriptorProvider(DESCRIPTOR_LAYOUT);
-                if (descriptorProvider != null) {
-
-                    Element element = (Element) parentNode;
-                    String attrName = element.getAttribute(ATTR_NAME);
-                    int pos = attrName.indexOf(':');
-                    if (pos >= 0) {
-                        attrName = attrName.substring(pos + 1);
-                    }
-
-                    // Search for an attribute match
-                    ElementDescriptor[] rootElementDescriptors =
-                        descriptorProvider.getRootElementDescriptors();
-                    for (ElementDescriptor elementDesc : rootElementDescriptors) {
-                        for (AttributeDescriptor desc : elementDesc.getAttributes()) {
-                            if (desc.getXmlLocalName().equals(attrName)) {
-                                // Make a ui parent node such that we can attach our
-                                // newfound attribute node to something (the code we delegate
-                                // to for looking up attribute completions will look at the
-                                // parent node and ask for its editor etc.)
-                                if (uiParent == null) {
-                                    DocumentDescriptor documentDescriptor =
-                                        data.getLayoutDescriptors().getDescriptor();
-                                    uiParent = documentDescriptor.createUiNode();
-                                    uiParent.setEditor(mEditor);
-                                }
-
-                                UiAttributeNode currAttrNode = desc.createUiNode(uiParent);
-                                AttribInfo attrInfo = new AttribInfo();
-                                Object[] values = getAttributeValueChoices(currAttrNode, attrInfo,
-                                        prefix);
-                                char needTag = attrInfo.needTag;
-                                if (attrInfo.correctedPrefix != null) {
-                                    prefix = attrInfo.correctedPrefix;
-                                }
-                                boolean isAttribute = true;
-                                boolean isNew = false;
-                                int replaceLength = computeTextReplaceLength(currentNode, offset);
-                                addMatchingProposals(proposals, values, offset, currentNode,
-                                        prefix, needTag, isAttribute, isNew,
-                                        false /* skipEndTag */, replaceLength);
-                                return;
-                            }
-                        }
-                    }
-                }
-            }
-        }
-
-        if (parentNode.getNodeName().equals(TAG_ITEM)) {
-            // Completing text content inside an <item> tag: offer @resource completion.
-            if (prefix.startsWith(PREFIX_RESOURCE_REF) || prefix.trim().length() == 0) {
-                String[] choices = UiResourceAttributeNode.computeResourceStringMatches(
-                        mEditor, null /*attributeDescriptor*/, prefix);
-                if (choices == null || choices.length == 0) {
-                    return;
-                }
-
-                // If the parent item tag specifies a type, filter the results
-                Node typeNode = parentNode.getAttributes().getNamedItem(ATTR_TYPE);
-                if (typeNode != null) {
-                    String value = typeNode.getNodeValue();
-                    List<String> filtered = new ArrayList<String>();
-                    for (String s : choices) {
-                        if (s.startsWith(ANDROID_PREFIX) ||
-                                s.startsWith(PREFIX_RESOURCE_REF+ value)) {
-                            filtered.add(s);
-                        }
-                    }
-                    if (filtered.size() > 0) {
-                        choices = filtered.toArray(new String[filtered.size()]);
-                    }
-                }
-
-                int replaceLength = computeTextReplaceLength(currentNode, offset);
-                addMatchingProposals(proposals, choices, offset, currentNode,
-                        prefix, (char) 0 /*needTag*/, true /* isAttribute */, false /*isNew*/,
-                        false /* skipEndTag*/,
-                        replaceLength);
-
-            }
-        }
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/values/ValuesEditorDelegate.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/values/ValuesEditorDelegate.java
deleted file mode 100644
index 10f105f..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/values/ValuesEditorDelegate.java
+++ /dev/null
@@ -1,144 +0,0 @@
-/*
- * Copyright (C) 2007 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.editors.values;
-
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-import com.android.ide.eclipse.adt.AdtConstants;
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.ide.eclipse.adt.internal.editors.common.CommonXmlDelegate;
-import com.android.ide.eclipse.adt.internal.editors.common.CommonXmlEditor;
-import com.android.ide.eclipse.adt.internal.editors.descriptors.ElementDescriptor;
-import com.android.ide.eclipse.adt.internal.editors.values.descriptors.ValuesDescriptors;
-import com.android.resources.ResourceFolderType;
-import com.android.xml.AndroidXPathFactory;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.ui.PartInitException;
-import org.w3c.dom.Document;
-import org.w3c.dom.Node;
-
-import javax.xml.xpath.XPath;
-import javax.xml.xpath.XPathConstants;
-import javax.xml.xpath.XPathExpressionException;
-
-/**
- * Multi-page form editor for /res/values XML files.
- */
-public class ValuesEditorDelegate extends CommonXmlDelegate {
-
-    public static class Creator implements IDelegateCreator {
-        @Override
-        @SuppressWarnings("unchecked")
-        public ValuesEditorDelegate createForFile(
-                @NonNull CommonXmlEditor delegator,
-                @Nullable ResourceFolderType type) {
-            if (ResourceFolderType.VALUES == type) {
-                return new ValuesEditorDelegate(delegator);
-            }
-
-            return null;
-        }
-    }
-
-    /**
-     * Old standalone-editor ID.
-     * Use {@link CommonXmlEditor#ID} instead.
-     */
-    public static final String LEGACY_EDITOR_ID =
-        AdtConstants.EDITORS_NAMESPACE + ".resources.ResourcesEditor"; //$NON-NLS-1$
-
-
-    /**
-     * Creates the form editor for resources XML files.
-     */
-    private ValuesEditorDelegate(CommonXmlEditor editor) {
-        super(editor, new ValuesContentAssist());
-        editor.addDefaultTargetListener();
-    }
-
-    // ---- Base Class Overrides ----
-
-    /**
-     * Create the various form pages.
-     */
-    @Override
-    public void delegateCreateFormPages() {
-        try {
-            getEditor().addPage(new ValuesTreePage(getEditor()));
-        } catch (PartInitException e) {
-            AdtPlugin.log(IStatus.ERROR, "Error creating nested page"); //$NON-NLS-1$
-            AdtPlugin.getDefault().getLog().log(e.getStatus());
-        }
-     }
-
-    /**
-     * Processes the new XML Model, which XML root node is given.
-     *
-     * @param xml_doc The XML document, if available, or null if none exists.
-     */
-    @Override
-    public void delegateXmlModelChanged(Document xml_doc) {
-        // init the ui root on demand
-        delegateInitUiRootNode(false /*force*/);
-
-        getUiRootNode().setXmlDocument(xml_doc);
-        if (xml_doc != null) {
-            ElementDescriptor resources_desc =
-                    ValuesDescriptors.getInstance().getElementDescriptor();
-            try {
-                XPath xpath = AndroidXPathFactory.newXPath();
-                Node node = (Node) xpath.evaluate("/" + resources_desc.getXmlName(),  //$NON-NLS-1$
-                        xml_doc,
-                        XPathConstants.NODE);
-                // Node can be null _or_ it must be the element we searched for.
-                assert node == null || node.getNodeName().equals(resources_desc.getXmlName());
-
-                // Refresh the manifest UI node and all its descendants
-                getUiRootNode().loadFromXmlNode(node);
-            } catch (XPathExpressionException e) {
-                AdtPlugin.log(e, "XPath error when trying to find '%s' element in XML.", //$NON-NLS-1$
-                        resources_desc.getXmlName());
-            }
-        }
-    }
-
-    /**
-     * Creates the initial UI Root Node, including the known mandatory elements.
-     * @param force if true, a new UiRootNode is recreated even if it already exists.
-     */
-    @Override
-    public void delegateInitUiRootNode(boolean force) {
-        // The manifest UI node is always created, even if there's no corresponding XML node.
-        if (getUiRootNode() == null || force) {
-            ElementDescriptor resources_desc =
-                    ValuesDescriptors.getInstance().getElementDescriptor();
-            setUiRootNode(resources_desc.createUiNode());
-            getUiRootNode().setEditor(getEditor());
-
-            onDescriptorsChanged();
-        }
-    }
-
-    // ---- Local methods ----
-
-    private void onDescriptorsChanged() {
-        // nothing to be done, as the descriptor are static for now.
-        // FIXME Update when the descriptors are not static
-    }
-}
-
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/values/ValuesTreePage.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/values/ValuesTreePage.java
deleted file mode 100644
index 224eb73..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/values/ValuesTreePage.java
+++ /dev/null
@@ -1,108 +0,0 @@
-/*
- * Copyright (C) 2007 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.editors.values;
-
-import com.android.ide.common.resources.ResourceFolder;
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.ide.eclipse.adt.internal.editors.IPageImageProvider;
-import com.android.ide.eclipse.adt.internal.editors.IconFactory;
-import com.android.ide.eclipse.adt.internal.editors.common.CommonXmlEditor;
-import com.android.ide.eclipse.adt.internal.editors.layout.configuration.FlagManager;
-import com.android.ide.eclipse.adt.internal.editors.ui.tree.UiTreeBlock;
-import com.android.ide.eclipse.adt.internal.editors.uimodel.UiElementNode;
-import com.android.ide.eclipse.adt.internal.resources.manager.ResourceManager;
-
-import org.eclipse.core.resources.IContainer;
-import org.eclipse.core.resources.IFile;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.forms.IManagedForm;
-import org.eclipse.ui.forms.editor.FormPage;
-import org.eclipse.ui.forms.widgets.ScrolledForm;
-import org.eclipse.ui.part.FileEditorInput;
-
-/**
- * Page for instrumentation settings, part of the AndroidManifest form editor.
- */
-public final class ValuesTreePage extends FormPage implements IPageImageProvider {
-    /** Page id used for switching tabs programmatically */
-    public final static String PAGE_ID = "res_tree_page"; //$NON-NLS-1$
-
-    /** Container editor */
-    CommonXmlEditor mEditor;
-
-    public ValuesTreePage(CommonXmlEditor editor) {
-        super(editor, PAGE_ID, "Resources");  // tab's label, keep it short
-        mEditor = editor;
-    }
-
-    @Override
-    public Image getPageImage() {
-        // See if we should use a flag icon if this is a language-specific configuration
-        IFile file = mEditor.getInputFile();
-        if (file != null) {
-            IContainer parent = file.getParent();
-            if (parent != null) {
-                Image flag = FlagManager.get().getFlagForFolderName(parent.getName());
-                if (flag != null) {
-                    return flag;
-                }
-            }
-        }
-
-        return IconFactory.getInstance().getIcon("editor_page_design");  //$NON-NLS-1$
-    }
-
-    /**
-     * Creates the content in the form hosted in this page.
-     *
-     * @param managedForm the form hosted in this page.
-     */
-    @Override
-    protected void createFormContent(IManagedForm managedForm) {
-        super.createFormContent(managedForm);
-        ScrolledForm form = managedForm.getForm();
-
-        String configText = null;
-        IEditorInput input = mEditor.getEditorInput();
-        if (input instanceof FileEditorInput) {
-            FileEditorInput fileInput = (FileEditorInput)input;
-            IFile iFile = fileInput.getFile();
-
-            ResourceFolder resFolder = ResourceManager.getInstance().getResourceFolder(iFile);
-            if (resFolder != null) {
-                configText = resFolder.getConfiguration().toDisplayString();
-            }
-        }
-
-        if (configText != null) {
-            form.setText(String.format("Android Resources (%1$s)", configText));
-        } else {
-            form.setText("Android Resources");
-        }
-
-        form.setImage(AdtPlugin.getAndroidLogo());
-
-        UiElementNode resources = mEditor.getUiRootNode();
-        UiTreeBlock block = new UiTreeBlock(mEditor, resources,
-                true /* autoCreateRoot */,
-                null /* no element filters */,
-                "Resources Elements",
-                "List of all resources elements in this XML file.");
-        block.createContent(managedForm);
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/values/descriptors/ColorValueDescriptor.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/values/descriptors/ColorValueDescriptor.java
deleted file mode 100644
index 0127850..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/values/descriptors/ColorValueDescriptor.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Copyright (C) 2007 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.editors.values.descriptors;
-
-import com.android.ide.eclipse.adt.internal.editors.descriptors.TextValueDescriptor;
-import com.android.ide.eclipse.adt.internal.editors.uimodel.UiAttributeNode;
-import com.android.ide.eclipse.adt.internal.editors.uimodel.UiElementNode;
-import com.android.ide.eclipse.adt.internal.editors.uimodel.UiResourceAttributeNode;
-import com.android.ide.eclipse.adt.internal.editors.values.uimodel.UiColorValueNode;
-
-/**
- * Describes a Color XML element value displayed by an {@link UiColorValueNode}.
- */
-public final class ColorValueDescriptor extends TextValueDescriptor {
-
-    public ColorValueDescriptor(String uiName, String tooltip) {
-        super(uiName, tooltip);
-    }
-
-    /**
-     * @return A new {@link UiResourceAttributeNode} linked to this theme descriptor.
-     */
-    @Override
-    public UiAttributeNode createUiNode(UiElementNode uiParent) {
-        return new UiColorValueNode(this, uiParent);
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/values/descriptors/ItemElementDescriptor.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/values/descriptors/ItemElementDescriptor.java
deleted file mode 100644
index 58ed36e..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/values/descriptors/ItemElementDescriptor.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * 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.editors.values.descriptors;
-
-import com.android.ide.eclipse.adt.internal.editors.descriptors.AttributeDescriptor;
-import com.android.ide.eclipse.adt.internal.editors.descriptors.ElementDescriptor;
-import com.android.ide.eclipse.adt.internal.editors.uimodel.UiElementNode;
-import com.android.ide.eclipse.adt.internal.editors.values.uimodel.UiItemElementNode;
-
-/**
- * {@link ItemElementDescriptor} is a special version of {@link ElementDescriptor} that
- * uses a specialized {@link UiItemElementNode} for display.
- */
-public class ItemElementDescriptor extends ElementDescriptor {
-
-    /**
-     * Constructs a new {@link ItemElementDescriptor} based on its XML name, UI name,
-     * tooltip, SDK url, attributes list, children list and mandatory.
-     * 
-     * @param xml_name The XML element node name. Case sensitive.
-     * @param ui_name The XML element name for the user interface, typically capitalized.
-     * @param tooltip An optional tooltip. Can be null or empty.
-     * @param sdk_url An optional SKD URL. Can be null or empty.
-     * @param attributes The list of allowed attributes. Can be null or empty.
-     * @param children The list of allowed children. Can be null or empty.
-     * @param mandatory Whether this node must always exist (even for empty models). A mandatory
-     *  UI node is never deleted and it may lack an actual XML node attached. A non-mandatory
-     *  UI node MUST have an XML node attached and it will cease to exist when the XML node
-     *  ceases to exist.
-     */
-    public ItemElementDescriptor(String xml_name, String ui_name,
-            String tooltip, String sdk_url, AttributeDescriptor[] attributes,
-            ElementDescriptor[] children, boolean mandatory) {
-        super(xml_name, ui_name, tooltip, sdk_url, attributes, children, mandatory);
-    }
-
-    @Override
-    public UiElementNode createUiNode() {
-        return new UiItemElementNode(this);
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/values/descriptors/ValuesDescriptors.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/values/descriptors/ValuesDescriptors.java
deleted file mode 100644
index 724e019..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/values/descriptors/ValuesDescriptors.java
+++ /dev/null
@@ -1,337 +0,0 @@
-/*
- * Copyright (C) 2007 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.editors.values.descriptors;
-
-import static com.android.SdkConstants.ATTR_NAME;
-import static com.android.SdkConstants.ATTR_TYPE;
-import static com.android.SdkConstants.TAG_COLOR;
-import static com.android.SdkConstants.TAG_DIMEN;
-import static com.android.SdkConstants.TAG_DRAWABLE;
-import static com.android.SdkConstants.TAG_INTEGER_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;
-import static com.android.SdkConstants.TAG_STRING_ARRAY;
-import static com.android.SdkConstants.TAG_STYLE;
-
-import com.android.ide.common.api.IAttributeInfo.Format;
-import com.android.ide.common.resources.platform.AttributeInfo;
-import com.android.ide.eclipse.adt.internal.editors.descriptors.AttributeDescriptor;
-import com.android.ide.eclipse.adt.internal.editors.descriptors.ElementDescriptor;
-import com.android.ide.eclipse.adt.internal.editors.descriptors.EnumAttributeDescriptor;
-import com.android.ide.eclipse.adt.internal.editors.descriptors.FlagAttributeDescriptor;
-import com.android.ide.eclipse.adt.internal.editors.descriptors.IDescriptorProvider;
-import com.android.ide.eclipse.adt.internal.editors.descriptors.ListAttributeDescriptor;
-import com.android.ide.eclipse.adt.internal.editors.descriptors.TextAttributeDescriptor;
-import com.android.ide.eclipse.adt.internal.editors.descriptors.TextValueDescriptor;
-import com.android.resources.ResourceType;
-
-import java.util.EnumSet;
-
-
-/**
- * Complete description of the structure for resources XML files (under res/values/)
- */
-public final class ValuesDescriptors implements IDescriptorProvider {
-    private static final ValuesDescriptors sThis = new ValuesDescriptors();
-
-    /** The {@link ElementDescriptor} for the root Resources element. */
-    public final ElementDescriptor mResourcesElement;
-
-    public static ValuesDescriptors getInstance() {
-        return sThis;
-    }
-
-    /*
-     * @see com.android.ide.eclipse.editors.descriptors.IDescriptorProvider#getRootElementDescriptors()
-     */
-    @Override
-    public ElementDescriptor[] getRootElementDescriptors() {
-        return new ElementDescriptor[] { mResourcesElement };
-    }
-
-    @Override
-    public ElementDescriptor getDescriptor() {
-        return mResourcesElement;
-    }
-
-    public ElementDescriptor getElementDescriptor() {
-        return mResourcesElement;
-    }
-
-    private ValuesDescriptors() {
-
-        // Common attributes used in many placed
-
-        // Elements
-
-        AttributeInfo nameAttrInfo = new AttributeInfo(ATTR_NAME, Format.STRING_SET);
-
-        ElementDescriptor color_element = new ElementDescriptor(
-                TAG_COLOR,
-                "Color",
-                "A @color@ value specifies an RGB value with an alpha channel, which can be used in various places such as specifying a solid color for a Drawable or the color to use for text.  It always begins with a # character and then is followed by the alpha-red-green-blue information in one of the following formats: #RGB, #ARGB, #RRGGBB or #AARRGGBB.",
-                "http://code.google.com/android/reference/available-resources.html#colorvals",  //$NON-NLS-1$
-                new AttributeDescriptor[] {
-                        new TextAttributeDescriptor(ATTR_NAME,
-                                null /* nsUri */,
-                                nameAttrInfo),
-                        new ColorValueDescriptor(
-                                "Value*",
-                                "A mandatory color value.")
-                        .setTooltip("The mandatory name used in referring to this color.")
-                },
-                null,  // no child nodes
-                false /* not mandatory */);
-
-        ElementDescriptor string_element = new ElementDescriptor(
-                TAG_STRING,
-                "String",
-                "@Strings@, with optional simple formatting, can be stored and retrieved as resources. You can add formatting to your string by using three standard HTML tags: b, i, and u. If you use an apostrophe or a quote in your string, you must either escape it or enclose the whole string in the other kind of enclosing quotes.",
-                "http://code.google.com/android/reference/available-resources.html#stringresources",  //$NON-NLS-1$
-                new AttributeDescriptor[] {
-                        new TextAttributeDescriptor(ATTR_NAME,
-                                null /* nsUri */,
-                                nameAttrInfo)
-                        .setTooltip("The mandatory name used in referring to this string."),
-                        new TextValueDescriptor(
-                                "Value*",
-                                "A mandatory string value.")
-                },
-                null,  // no child nodes
-                false /* not mandatory */);
-
-        ElementDescriptor item_element = new ItemElementDescriptor(
-                 TAG_ITEM,
-                 "Item",
-                 null,  // TODO find javadoc
-                 null,  // TODO find link to javadoc
-                 new AttributeDescriptor[] {
-                         new TextAttributeDescriptor(ATTR_NAME,
-                                 null /* nsUri */,
-                                 nameAttrInfo)
-                         .setTooltip("The mandatory name used in referring to this resource."),
-                         new ListAttributeDescriptor(ATTR_TYPE,
-                                 null /* nsUri */,
-                                 new AttributeInfo(ATTR_TYPE,
-                                         EnumSet.of(Format.STRING, Format.ENUM)
-                                 ).setEnumValues(ResourceType.getNames())
-                         ).setTooltip("The mandatory type of this resource."),
-                         new FlagAttributeDescriptor("format",      //$NON-NLS-1$
-                                 null /* nsUri */,
-                                 new AttributeInfo("format",
-                                         EnumSet.of(Format.STRING, Format.FLAG)
-                                 ).setFlagValues(
-                                     new String[] {
-                                         "boolean",     //$NON-NLS-1$
-                                         TAG_COLOR,
-                                         "dimension",   //$NON-NLS-1$
-                                         "float",       //$NON-NLS-1$
-                                         "fraction",    //$NON-NLS-1$
-                                         "integer",     //$NON-NLS-1$
-                                         "reference",   //$NON-NLS-1$
-                                         "string"       //$NON-NLS-1$
-                                     } )
-                         ).setTooltip("The optional format of this resource."),
-                         new TextValueDescriptor(
-                                 "Value",
-                                 "A standard string, hex color value, or reference to any other resource type.")
-                 },
-                 null,  // no child nodes
-                 false /* not mandatory */);
-
-        ElementDescriptor drawable_element = new ElementDescriptor(
-                TAG_DRAWABLE,
-                "Drawable",
-                "A @drawable@ defines a rectangle of color. Android accepts color values written in various web-style formats -- a hexadecimal constant in any of the following forms: #RGB, #ARGB, #RRGGBB, #AARRGGBB. Zero in the alpha channel means transparent. The default value is opaque.",
-                "http://code.google.com/android/reference/available-resources.html#colordrawableresources",  //$NON-NLS-1$
-                new AttributeDescriptor[] {
-                        new TextAttributeDescriptor(ATTR_NAME,
-                                null /* nsUri */,
-                                nameAttrInfo)
-                        .setTooltip("The mandatory name used in referring to this drawable."),
-                        new TextValueDescriptor(
-                                "Value*",
-                                "A mandatory color value in the form #RGB, #ARGB, #RRGGBB or #AARRGGBB.")
-                },
-                null,  // no child nodes
-                false /* not mandatory */);
-
-        ElementDescriptor dimen_element = new ElementDescriptor(
-                TAG_DIMEN,
-                "Dimension",
-                "You can create common dimensions to use for various screen elements by defining @dimension@ values in XML. A dimension resource is a number followed by a unit of measurement. Supported units are px (pixels), in (inches), mm (millimeters), pt (points at 72 DPI), dp (density-independent pixels) and sp (scale-independent pixels)",
-                "http://code.google.com/android/reference/available-resources.html#dimension",  //$NON-NLS-1$
-                new AttributeDescriptor[] {
-                        new TextAttributeDescriptor(ATTR_NAME,
-                                null /* nsUri */,
-                                nameAttrInfo)
-                        .setTooltip("The mandatory name used in referring to this dimension."),
-                        new TextValueDescriptor(
-                                "Value*",
-                                "A mandatory dimension value is a number followed by a unit of measurement. For example: 10px, 2in, 5sp.")
-                },
-                null,  // no child nodes
-                false /* not mandatory */);
-
-         ElementDescriptor style_element = new ElementDescriptor(
-                TAG_STYLE,
-                "Style/Theme",
-                "Both @styles and themes@ are defined in a style block containing one or more string or numerical values (typically color values), or references to other resources (drawables and so on).",
-                "http://code.google.com/android/reference/available-resources.html#stylesandthemes",  //$NON-NLS-1$
-                new AttributeDescriptor[] {
-                        new TextAttributeDescriptor(ATTR_NAME,
-                                null /* nsUri */,
-                                nameAttrInfo)
-                        .setTooltip("The mandatory name used in referring to this theme."),
-                        new TextAttributeDescriptor("parent", //$NON-NLS-1$
-                                null /* nsUri */,
-                                new AttributeInfo("parent",  //$NON-NLS-1$
-                                        Format.STRING_SET))
-                        .setTooltip("An optional parent theme. All values from the specified theme will be inherited into this theme. Any values with identical names that you specify will override inherited values."),
-                },
-                new ElementDescriptor[] {
-                    new ElementDescriptor(
-                        TAG_ITEM,
-                        "Item",
-                        "A value to use in this @theme@. It can be a standard string, a hex color value, or a reference to any other resource type.",
-                        "http://code.google.com/android/reference/available-resources.html#stylesandthemes",  //$NON-NLS-1$
-                        new AttributeDescriptor[] {
-                            new TextAttributeDescriptor(ATTR_NAME,
-                                null /* nsUri */,
-                                nameAttrInfo)
-                            .setTooltip("The mandatory name used in referring to this item."),
-                            new TextValueDescriptor(
-                                "Value*",
-                                "A mandatory standard string, hex color value, or reference to any other resource type.")
-                        },
-                        null,  // no child nodes
-                        false /* not mandatory */)
-                },
-                false /* not mandatory */);
-
-         ElementDescriptor string_array_element = new ElementDescriptor(
-                 TAG_STRING_ARRAY,
-                 "String Array",
-                 "An array of strings. Strings are added as underlying item elements to the array.",
-                 null, // tooltips
-                 new AttributeDescriptor[] {
-                         new TextAttributeDescriptor(ATTR_NAME,
-                                 null /* nsUri */,
-                                 nameAttrInfo)
-                         .setTooltip("The mandatory name used in referring to this string array."),
-                 },
-                 new ElementDescriptor[] {
-                     new ElementDescriptor(
-                         TAG_ITEM,
-                         "Item",
-                         "A string value to use in this string array.",
-                         null, // tooltip
-                         new AttributeDescriptor[] {
-                             new TextValueDescriptor(
-                                 "Value*",
-                                 "A mandatory string.")
-                         },
-                         null,  // no child nodes
-                         false /* not mandatory */)
-                 },
-                 false /* not mandatory */);
-
-         ElementDescriptor plurals_element = new ElementDescriptor(
-                 TAG_PLURALS,
-                 "Quantity Strings (Plurals)",
-                 "A quantity string",
-                 null, // tooltips
-                 new AttributeDescriptor[] {
-                         new TextAttributeDescriptor(ATTR_NAME,
-                                 null /* nsUri */,
-                                 nameAttrInfo)
-                         .setTooltip("A name for the pair of strings. This name will be used as the resource ID."),
-                 },
-                 new ElementDescriptor[] {
-                     new ElementDescriptor(
-                         TAG_ITEM,
-                         "Item",
-                         "A plural or singular string",
-                         null, // tooltip
-                         new AttributeDescriptor[] {
-                             new EnumAttributeDescriptor(
-                                 "quantity", "Quantity", null,
-                                 "A keyword value indicating when this string should be used",
-                                 new AttributeInfo("quantity", Format.ENUM_SET)
-                                 .setEnumValues(new String[] {
-                                         "zero", //$NON-NLS-1$
-                                         "one",  //$NON-NLS-1$
-                                         "two",  //$NON-NLS-1$
-                                         "few",  //$NON-NLS-1$
-                                         "many", //$NON-NLS-1$
-                                         "other" //$NON-NLS-1$
-                                 }))
-                         },
-                         null,  // no child nodes
-                         false /* not mandatory */)
-                 },
-                 false /* not mandatory */);
-
-         ElementDescriptor integer_array_element = new ElementDescriptor(
-                 TAG_INTEGER_ARRAY,
-                 "Integer Array",
-                 "An array of integers. Integers are added as underlying item elements to the array.",
-                 null, // tooltips
-                 new AttributeDescriptor[] {
-                         new TextAttributeDescriptor(ATTR_NAME,
-                                 null /* nsUri */,
-                                 nameAttrInfo)
-                         .setTooltip("The mandatory name used in referring to this integer array.")
-                 },
-                 new ElementDescriptor[] {
-                     new ElementDescriptor(
-                         TAG_ITEM,
-                         "Item",
-                         "An integer value to use in this integer array.",
-                         null, // tooltip
-                         new AttributeDescriptor[] {
-                             new TextValueDescriptor(
-                                 "Value*",
-                                 "A mandatory integer.")
-                         },
-                         null,  // no child nodes
-                         false /* not mandatory */)
-                 },
-                 false /* not mandatory */);
-
-         mResourcesElement = new ElementDescriptor(
-                        TAG_RESOURCES,
-                        "Resources",
-                        null,
-                        "http://code.google.com/android/reference/available-resources.html",  //$NON-NLS-1$
-                        null,  // no attributes
-                        new ElementDescriptor[] {
-                                string_element,
-                                color_element,
-                                dimen_element,
-                                drawable_element,
-                                style_element,
-                                item_element,
-                                string_array_element,
-                                integer_array_element,
-                                plurals_element,
-                        },
-                        true /* mandatory */);
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/values/uimodel/UiColorValueNode.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/values/uimodel/UiColorValueNode.java
deleted file mode 100644
index 9c84b36..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/values/uimodel/UiColorValueNode.java
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- * Copyright (C) 2007 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.editors.values.uimodel;
-
-import com.android.ide.eclipse.adt.internal.editors.descriptors.TextValueDescriptor;
-import com.android.ide.eclipse.adt.internal.editors.uimodel.UiAttributeNode;
-import com.android.ide.eclipse.adt.internal.editors.uimodel.UiElementNode;
-import com.android.ide.eclipse.adt.internal.editors.uimodel.UiTextValueNode;
-
-import org.eclipse.jface.dialogs.IMessageProvider;
-import org.eclipse.swt.events.DisposeEvent;
-import org.eclipse.swt.events.DisposeListener;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.widgets.Text;
-
-import java.util.regex.Pattern;
-
-/**
- * Displays and edits a color XML element value with a custom validator.
- * <p/>
- * See {@link UiAttributeNode} for more information.
- */
-public class UiColorValueNode extends UiTextValueNode {
-
-    /** Accepted RGBA formats are one of #RGB, #ARGB, #RRGGBB or #AARRGGBB. */
-    private static final Pattern RGBA_REGEXP = Pattern.compile(
-            "#(?:[0-9a-fA-F]{3,4}|[0-9a-fA-F]{6}|[0-9a-fA-F]{8})"); //$NON-NLS-1$
-
-    public UiColorValueNode(TextValueDescriptor attributeDescriptor, UiElementNode uiParent) {
-        super(attributeDescriptor, uiParent);
-    }
-
-    /* (non-java doc)
-     *
-     * Add a modify listener that will check colors have the proper format,
-     * that is one of #RGB, #ARGB, #RRGGBB or #AARRGGBB.
-     */
-    @Override
-    protected void onAddValidators(final Text text) {
-        ModifyListener listener = new ModifyListener() {
-            @Override
-            public void modifyText(ModifyEvent e) {
-                String color = text.getText();
-                if (RGBA_REGEXP.matcher(color).matches()) {
-                    getManagedForm().getMessageManager().removeMessage(text, text);
-                } else {
-                    getManagedForm().getMessageManager().addMessage(text,
-                            "Accepted color formats are one of #RGB, #ARGB, #RRGGBB or #AARRGGBB.",
-                            null /* data */, IMessageProvider.ERROR, text);
-                }
-            }
-        };
-
-        text.addModifyListener(listener);
-
-        // Make sure the validator removes its message(s) when the widget is disposed
-        text.addDisposeListener(new DisposeListener() {
-            @Override
-            public void widgetDisposed(DisposeEvent e) {
-                getManagedForm().getMessageManager().removeMessage(text, text);
-            }
-        });
-
-        // Finally call the validator once to make sure the initial value is processed
-        listener.modifyText(null);
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/values/uimodel/UiItemElementNode.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/values/uimodel/UiItemElementNode.java
deleted file mode 100644
index 88ac3e1..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/values/uimodel/UiItemElementNode.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * 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.editors.values.uimodel;
-
-import com.android.SdkConstants;
-import com.android.ide.eclipse.adt.AdtUtils;
-import com.android.ide.eclipse.adt.internal.editors.uimodel.UiElementNode;
-import com.android.ide.eclipse.adt.internal.editors.values.descriptors.ItemElementDescriptor;
-
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-
-/**
- * {@link UiItemElementNode} is a special version of {@link UiElementNode} that
- * customizes the element display to include the item type attribute if present.
- */
-public class UiItemElementNode extends UiElementNode {
-
-    /**
-     * Creates a new {@link UiElementNode} described by a given {@link ItemElementDescriptor}.
-     *
-     * @param elementDescriptor The {@link ItemElementDescriptor} for the XML node. Cannot be null.
-     */
-    public UiItemElementNode(ItemElementDescriptor elementDescriptor) {
-        super(elementDescriptor);
-    }
-
-    @Override
-    public String getShortDescription() {
-        Node xmlNode = getXmlNode();
-        if (xmlNode != null && xmlNode instanceof Element && xmlNode.hasAttributes()) {
-
-            Element elem = (Element) xmlNode;
-            String type = elem.getAttribute(SdkConstants.ATTR_TYPE);
-            String name = elem.getAttribute(SdkConstants.ATTR_NAME);
-            if (type != null && name != null && type.length() > 0 && name.length() > 0) {
-                type = AdtUtils.capitalize(type);
-                return String.format("%1$s (%2$s %3$s)", name, type, getDescriptor().getUiName());
-            }
-        }
-
-        return super.getShortDescription();
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/launch/AMReceiver.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/launch/AMReceiver.java
deleted file mode 100644
index ea61945..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/launch/AMReceiver.java
+++ /dev/null
@@ -1,161 +0,0 @@
-/*
- * Copyright (C) 2009 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.launch;
-
-import com.android.ddmlib.IDevice;
-import com.android.ddmlib.MultiLineReceiver;
-import com.android.ide.eclipse.adt.AdtPlugin;
-
-import java.util.ArrayList;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-
-/**
- * Output receiver for am process (Activity Manager)
- *
- * Monitors adb output for am errors, and retries launch as appropriate.
- */
-public class AMReceiver extends MultiLineReceiver {
-
-    private static final int MAX_ATTEMPT_COUNT = 5;
-    private static final Pattern sAmErrorType = Pattern.compile("Error type (\\d+)"); //$NON-NLS-1$
-
-    private final DelayedLaunchInfo mLaunchInfo;
-    private final IDevice mDevice;
-    private final ILaunchController mLaunchController;
-
-    /**
-     * Basic constructor.
-     *
-     * @param launchInfo the {@link DelayedLaunchInfo} associated with the am process.
-     * @param device the Android device on which the launch is done.
-     * @param launchController the {@link ILaunchController} that is managing the launch
-     */
-    public AMReceiver(DelayedLaunchInfo launchInfo, IDevice device,
-            ILaunchController launchController) {
-        mLaunchInfo = launchInfo;
-        mDevice = device;
-        mLaunchController = launchController;
-    }
-
-    /**
-     * Monitors the am process for error messages. If an error occurs, will reattempt launch up to
-     * <code>MAX_ATTEMPT_COUNT</code> times.
-     *
-     * @param lines a portion of the am output
-     *
-     * @see MultiLineReceiver#processNewLines(String[])
-     */
-    @Override
-    public void processNewLines(String[] lines) {
-        // first we check if one starts with error
-        ArrayList<String> array = new ArrayList<String>();
-        boolean error = false;
-        boolean warning = false;
-        for (String s : lines) {
-            // ignore empty lines.
-            if (s.length() == 0) {
-                continue;
-            }
-
-            // check for errors that output an error type, if the attempt count is still
-            // valid. If not the whole text will be output in the console
-            if (mLaunchInfo.getAttemptCount() < MAX_ATTEMPT_COUNT &&
-                    mLaunchInfo.isCancelled() == false) {
-                Matcher m = sAmErrorType.matcher(s);
-                if (m.matches()) {
-                    // get the error type
-                    int type = Integer.parseInt(m.group(1));
-
-                    final int waitTime = 3;
-                    String msg;
-
-                    switch (type) {
-                        case 1:
-                            /* Intended fall through */
-                        case 2:
-                            msg = String.format(
-                                    "Device not ready. Waiting %1$d seconds before next attempt.",
-                                    waitTime);
-                            break;
-                        case 3:
-                            msg = String.format(
-                                    "New package not yet registered with the system. Waiting %1$d seconds before next attempt.",
-                                    waitTime);
-                            break;
-                        default:
-                            msg = String.format(
-                                    "Device not ready (%2$d). Waiting %1$d seconds before next attempt.",
-                                    waitTime, type);
-                        break;
-
-                    }
-
-                    AdtPlugin.printToConsole(mLaunchInfo.getProject(), msg);
-
-                    // launch another thread, that waits a bit and attempts another launch
-                    new Thread("Delayed Launch attempt") {
-                        @Override
-                        public void run() {
-                            try {
-                                sleep(waitTime * 1000);
-                            } catch (InterruptedException e) {
-                                // ignore
-                            }
-
-                            mLaunchController.launchApp(mLaunchInfo, mDevice);
-                        }
-                    }.start();
-
-                    // no need to parse the rest
-                    return;
-                }
-            }
-
-            // check for error if needed
-            if (error == false && s.startsWith("Error:")) { //$NON-NLS-1$
-                error = true;
-            }
-            if (warning == false && s.startsWith("Warning:")) { //$NON-NLS-1$
-                warning = true;
-            }
-
-            // add the line to the list
-            array.add("ActivityManager: " + s); //$NON-NLS-1$
-        }
-
-        // then we display them in the console
-        if (warning || error) {
-            AdtPlugin.printErrorToConsole(mLaunchInfo.getProject(), array.toArray());
-        } else {
-            AdtPlugin.printToConsole(mLaunchInfo.getProject(), array.toArray());
-        }
-
-        // if error then we cancel the launch, and remove the delayed info
-        if (error) {
-            mLaunchController.stopLaunch(mLaunchInfo);
-        }
-    }
-
-    /**
-     * Returns true if launch has been cancelled
-     */
-    @Override
-    public boolean isCancelled() {
-        return mLaunchInfo.isCancelled();
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/launch/ActivityLaunchAction.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/launch/ActivityLaunchAction.java
deleted file mode 100644
index 311b19a..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/launch/ActivityLaunchAction.java
+++ /dev/null
@@ -1,124 +0,0 @@
-/*
- * Copyright (C) 2009 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.launch;
-
-import com.android.ddmlib.AdbCommandRejectedException;
-import com.android.ddmlib.IDevice;
-import com.android.ddmlib.ShellCommandUnresponsiveException;
-import com.android.ddmlib.TimeoutException;
-import com.android.ide.eclipse.adt.AdtPlugin;
-
-import java.io.IOException;
-import java.util.Collection;
-
-/**
- * Launches the given activity
- */
-public class ActivityLaunchAction implements IAndroidLaunchAction {
-
-    private final String mActivity;
-    private final ILaunchController mLaunchController;
-
-    /**
-     * Creates a ActivityLaunchAction
-     *
-     * @param activity fully qualified activity name to launch
-     * @param controller the {@link ILaunchController} that performs launch
-     */
-    public ActivityLaunchAction(String activity, ILaunchController controller) {
-        mActivity = activity;
-        mLaunchController = controller;
-    }
-
-    public boolean doLaunchAction(DelayedLaunchInfo info, IDevice device) {
-        String command = "am start" //$NON-NLS-1$
-            + (info.isDebugMode() ? " -D" //$NON-NLS-1$
-                    : "") //$NON-NLS-1$
-            + " -n " //$NON-NLS-1$
-            + info.getPackageName() + "/" //$NON-NLS-1$
-            + mActivity.replaceAll("\\$", "\\\\\\$") //$NON-NLS-1$ //$NON-NLS-2$
-            + " -a android.intent.action.MAIN"  //$NON-NLS-1$
-            + " -c android.intent.category.LAUNCHER";
-        try {
-            String msg = String.format("Starting activity %1$s on device %2$s", mActivity,
-                    device);
-            AdtPlugin.printToConsole(info.getProject(), msg);
-
-            // In debug mode, we need to add the info to the list of application monitoring
-            // client changes.
-            // increment launch attempt count, to handle retries and timeouts
-            info.incrementAttemptCount();
-
-            // now we actually launch the app.
-            device.executeShellCommand(command, new AMReceiver(info, device, mLaunchController));
-
-            // if the app is not a debug app, we need to do some clean up, as
-            // the process is done!
-            if (info.isDebugMode() == false) {
-                // stop the launch object, since there's no debug, and it can't
-                // provide any control over the app
-                return false;
-            }
-        } catch (TimeoutException e) {
-            AdtPlugin.printErrorToConsole(info.getProject(), "Launch error: timeout");
-            return false;
-        } catch (AdbCommandRejectedException e) {
-            AdtPlugin.printErrorToConsole(info.getProject(), String.format(
-                    "Launch error: adb rejected command: %1$s", e.getMessage()));
-            return false;
-        } catch (ShellCommandUnresponsiveException e) {
-            // we didn't get the output but that's ok, just log it
-            AdtPlugin.log(e, "No command output when running: '%1$s' on device %2$s", command,
-                    device);
-        } catch (IOException e) {
-            // something went wrong trying to launch the app.
-            // lets stop the Launch
-            AdtPlugin.printErrorToConsole(info.getProject(),
-                    String.format("Launch error: %s", e.getMessage()));
-            return false;
-        }
-        return true;
-    }
-
-    /**
-     * Launches the activity on targeted device
-     *
-     * @param info the {@link DelayedLaunchInfo} that contains launch details
-     * @param devices list of Android devices on which the activity will be launched
-     */
-    @Override
-    public boolean doLaunchAction(DelayedLaunchInfo info, Collection<IDevice> devices) {
-        boolean result = true;
-        for (IDevice d : devices) {
-            // Note that this expression should not short circuit - even if an action fails
-            // on a device, it should still be performed on all other devices.
-            result = doLaunchAction(info, d) && result;
-        }
-
-        return result;
-    }
-
-    /**
-     * Returns a description of the activity being launched
-     *
-     * @see IAndroidLaunchAction#getLaunchDescription()
-     */
-    @Override
-    public String getLaunchDescription() {
-       return String.format("%1$s activity launch", mActivity);
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/launch/AndroidLaunch.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/launch/AndroidLaunch.java
deleted file mode 100644
index 8e2c133..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/launch/AndroidLaunch.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * Copyright (C) 2007 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.launch;
-
-import org.eclipse.debug.core.DebugException;
-import org.eclipse.debug.core.ILaunchConfiguration;
-import org.eclipse.debug.core.ILaunchManager;
-import org.eclipse.debug.core.Launch;
-import org.eclipse.debug.core.model.ISourceLocator;
-
-/**
- * Custom implementation of Launch to allow access to the LaunchManager
- *
- */
-public class AndroidLaunch extends Launch {
-
-    /**
-     * Basic constructor does nothing special
-     * @param launchConfiguration
-     * @param mode
-     * @param locator
-     */
-    public AndroidLaunch(ILaunchConfiguration launchConfiguration, String mode,
-            ISourceLocator locator) {
-        super(launchConfiguration, mode, locator);
-    }
-
-    /** Stops the launch, and removes it from the launch manager */
-    public void stopLaunch() {
-        ILaunchManager mgr = getLaunchManager();
-
-        if (canTerminate()) {
-            try {
-                terminate();
-            } catch (DebugException e) {
-                // well looks like we couldn't stop it. nothing else to be
-                // done really
-            }
-        }
-        // remove the launch
-        mgr.removeLaunch(this);
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/launch/AndroidLaunchConfiguration.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/launch/AndroidLaunchConfiguration.java
deleted file mode 100644
index 580bbbe..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/launch/AndroidLaunchConfiguration.java
+++ /dev/null
@@ -1,192 +0,0 @@
-/*
- * Copyright (C) 2009 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.launch;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.debug.core.ILaunchConfiguration;
-
-/**
- * Launch configuration data. This stores the result of querying the
- * {@link ILaunchConfiguration} so that it's only done once.
- */
-public class AndroidLaunchConfiguration {
-
-    /**
-     * Launch action. See {@link LaunchConfigDelegate#ACTION_DEFAULT},
-     * {@link LaunchConfigDelegate#ACTION_ACTIVITY},
-     * {@link LaunchConfigDelegate#ACTION_DO_NOTHING}
-     */
-    public int mLaunchAction = LaunchConfigDelegate.DEFAULT_LAUNCH_ACTION;
-
-    /** Target selection mode for the configuration. */
-    public enum TargetMode {
-        /** Automatic target selection mode. */
-        AUTO,
-        /** Manual target selection mode. */
-        MANUAL,
-        /** All active devices */
-        ALL_DEVICES,
-        /** All active emulators */
-        ALL_EMULATORS,
-        /** All active devices and emulators */
-        ALL_DEVICES_AND_EMULATORS;
-
-        public static TargetMode getMode(String s) {
-            for (TargetMode m: values()) {
-                if (m.toString().equals(s)) {
-                    return m;
-                }
-            }
-
-            throw new IllegalArgumentException(String.format(
-                    "Invalid representation (%s) for TargetMode", s));
-        }
-
-        public boolean isMultiDevice() {
-            return this == ALL_DEVICES
-                    || this == ALL_EMULATORS
-                    || this == ALL_DEVICES_AND_EMULATORS;
-        }
-    }
-
-    /**
-     * Target selection mode.
-     * @see TargetMode
-     */
-    public TargetMode mTargetMode = LaunchConfigDelegate.DEFAULT_TARGET_MODE;
-
-    /**
-     * Indicates whether the emulator should be called with -wipe-data
-     */
-    public boolean mWipeData = LaunchConfigDelegate.DEFAULT_WIPE_DATA;
-
-    /**
-     * Indicates whether the emulator should be called with -no-boot-anim
-     */
-    public boolean mNoBootAnim = LaunchConfigDelegate.DEFAULT_NO_BOOT_ANIM;
-
-    /**
-     * AVD Name.
-     */
-    public String mAvdName = null;
-
-    public String mNetworkSpeed = EmulatorConfigTab.getSpeed(
-            LaunchConfigDelegate.DEFAULT_SPEED);
-    public String mNetworkDelay = EmulatorConfigTab.getDelay(
-            LaunchConfigDelegate.DEFAULT_DELAY);
-
-    /**
-     * Optional custom command line parameter to launch the emulator
-     */
-    public String mEmulatorCommandLine;
-
-    /** Flag indicating whether the same device should be used for future launches. */
-    public boolean mReuseLastUsedDevice = false;
-
-    /** Serial number of the device used in the last launch of this config. */
-    public String mLastUsedDevice = null;
-
-    /**
-     * Initialized the structure from an ILaunchConfiguration object.
-     * @param config
-     */
-    public void set(ILaunchConfiguration config) {
-        try {
-            mLaunchAction = config.getAttribute(LaunchConfigDelegate.ATTR_LAUNCH_ACTION,
-                    mLaunchAction);
-        } catch (CoreException e1) {
-            // nothing to be done here, we'll use the default value
-        }
-
-        mTargetMode = parseTargetMode(config, mTargetMode);
-
-        try {
-            mReuseLastUsedDevice = config.getAttribute(
-                    LaunchConfigDelegate.ATTR_REUSE_LAST_USED_DEVICE, false);
-            mLastUsedDevice = config.getAttribute(
-                    LaunchConfigDelegate.ATTR_LAST_USED_DEVICE, (String)null);
-        } catch (CoreException e) {
-         // nothing to be done here, we'll use the default value
-        }
-
-        try {
-            mAvdName = config.getAttribute(LaunchConfigDelegate.ATTR_AVD_NAME, mAvdName);
-        } catch (CoreException e) {
-            // ignore
-        }
-
-        int index = LaunchConfigDelegate.DEFAULT_SPEED;
-        try {
-            index = config.getAttribute(LaunchConfigDelegate.ATTR_SPEED, index);
-        } catch (CoreException e) {
-            // nothing to be done here, we'll use the default value
-        }
-        mNetworkSpeed = EmulatorConfigTab.getSpeed(index);
-
-        index = LaunchConfigDelegate.DEFAULT_DELAY;
-        try {
-            index = config.getAttribute(LaunchConfigDelegate.ATTR_DELAY, index);
-        } catch (CoreException e) {
-            // nothing to be done here, we'll use the default value
-        }
-        mNetworkDelay = EmulatorConfigTab.getDelay(index);
-
-        try {
-            mEmulatorCommandLine = config.getAttribute(
-                    LaunchConfigDelegate.ATTR_COMMANDLINE, ""); //$NON-NLS-1$
-        } catch (CoreException e) {
-            // lets not do anything here, we'll use the default value
-        }
-
-        try {
-            mWipeData = config.getAttribute(LaunchConfigDelegate.ATTR_WIPE_DATA, mWipeData);
-        } catch (CoreException e) {
-            // nothing to be done here, we'll use the default value
-        }
-
-        try {
-            mNoBootAnim = config.getAttribute(LaunchConfigDelegate.ATTR_NO_BOOT_ANIM,
-                                              mNoBootAnim);
-        } catch (CoreException e) {
-            // nothing to be done here, we'll use the default value
-        }
-    }
-
-    /**
-     * Retrieve the {@link TargetMode} saved in the provided launch configuration.
-     * Returns defaultMode if there are any errors while retrieving or parsing the saved setting.
-     */
-    public static TargetMode parseTargetMode(ILaunchConfiguration config, TargetMode defaultMode) {
-        try {
-            String value = config.getAttribute(LaunchConfigDelegate.ATTR_TARGET_MODE,
-                    defaultMode.toString());
-            return TargetMode.getMode(value);
-        } catch (CoreException e) {
-            // ADT R20 changes the attribute type of ATTR_TARGET_MODE to be a string from a bool.
-            // So if parsing as a string fails, attempt parsing as a boolean.
-            try {
-                boolean value = config.getAttribute(LaunchConfigDelegate.ATTR_TARGET_MODE, true);
-                return value ? TargetMode.AUTO : TargetMode.MANUAL;
-            } catch (CoreException e1) {
-                return defaultMode;
-            }
-        } catch (IllegalArgumentException e) {
-            return defaultMode;
-        }
-    }
-}
-
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
deleted file mode 100644
index a95ed68..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/launch/AndroidLaunchController.java
+++ /dev/null
@@ -1,1872 +0,0 @@
-/*
- * Copyright (C) 2007 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.launch;
-
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-import com.android.ddmlib.AdbCommandRejectedException;
-import com.android.ddmlib.AndroidDebugBridge;
-import com.android.ddmlib.AndroidDebugBridge.IClientChangeListener;
-import com.android.ddmlib.AndroidDebugBridge.IDebugBridgeChangeListener;
-import com.android.ddmlib.AndroidDebugBridge.IDeviceChangeListener;
-import com.android.ddmlib.CanceledException;
-import com.android.ddmlib.Client;
-import com.android.ddmlib.ClientData;
-import com.android.ddmlib.ClientData.DebuggerStatus;
-import com.android.ddmlib.IDevice;
-import com.android.ddmlib.InstallException;
-import com.android.ddmlib.Log;
-import com.android.ddmlib.TimeoutException;
-import com.android.ide.common.xml.ManifestData;
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.ide.eclipse.adt.internal.actions.AvdManagerAction;
-import com.android.ide.eclipse.adt.internal.editors.manifest.ManifestInfo;
-import com.android.ide.eclipse.adt.internal.launch.AndroidLaunchConfiguration.TargetMode;
-import com.android.ide.eclipse.adt.internal.launch.DelayedLaunchInfo.InstallRetryMode;
-import com.android.ide.eclipse.adt.internal.launch.DeviceChooserDialog.DeviceChooserResponse;
-import com.android.ide.eclipse.adt.internal.preferences.AdtPrefs;
-import com.android.ide.eclipse.adt.internal.project.AndroidManifestHelper;
-import com.android.ide.eclipse.adt.internal.project.ApkInstallManager;
-import com.android.ide.eclipse.adt.internal.project.BaseProjectHelper;
-import com.android.ide.eclipse.adt.internal.project.ProjectHelper;
-import com.android.ide.eclipse.adt.internal.sdk.Sdk;
-import com.android.ide.eclipse.ddms.DdmsPlugin;
-import com.android.prefs.AndroidLocation.AndroidLocationException;
-import com.android.sdklib.AndroidVersion;
-import com.android.sdklib.IAndroidTarget;
-import com.android.sdklib.internal.avd.AvdInfo;
-import com.android.sdklib.internal.avd.AvdManager;
-import com.android.utils.NullLogger;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.debug.core.DebugPlugin;
-import org.eclipse.debug.core.ILaunchConfiguration;
-import org.eclipse.debug.core.ILaunchConfigurationType;
-import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
-import org.eclipse.debug.core.ILaunchManager;
-import org.eclipse.debug.core.model.IDebugTarget;
-import org.eclipse.debug.ui.DebugUITools;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.JavaModelException;
-import org.eclipse.jdt.launching.IJavaLaunchConfigurationConstants;
-import org.eclipse.jdt.launching.IVMConnector;
-import org.eclipse.jdt.launching.JavaRuntime;
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Shell;
-
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.io.InputStreamReader;
-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.Entry;
-import java.util.Set;
-import java.util.concurrent.atomic.AtomicBoolean;
-
-/**
- * Controls the launch of Android application either on a device or on the
- * emulator. If an emulator is already running, this class will attempt to reuse
- * it.
- */
-public final class AndroidLaunchController implements IDebugBridgeChangeListener,
-        IDeviceChangeListener, IClientChangeListener, ILaunchController {
-
-    private static final String FLAG_AVD = "-avd"; //$NON-NLS-1$
-    private static final String FLAG_NETDELAY = "-netdelay"; //$NON-NLS-1$
-    private static final String FLAG_NETSPEED = "-netspeed"; //$NON-NLS-1$
-    private static final String FLAG_WIPE_DATA = "-wipe-data"; //$NON-NLS-1$
-    private static final String FLAG_NO_BOOT_ANIM = "-no-boot-anim"; //$NON-NLS-1$
-
-    /**
-     * Map to store {@link ILaunchConfiguration} objects that must be launched as simple connection
-     * to running application. The integer is the port on which to connect.
-     * <b>ALL ACCESS MUST BE INSIDE A <code>synchronized (sListLock)</code> block!</b>
-     */
-    private static final HashMap<ILaunchConfiguration, Integer> sRunningAppMap =
-        new HashMap<ILaunchConfiguration, Integer>();
-
-    private static final Object sListLock = sRunningAppMap;
-
-    /**
-     * List of {@link DelayedLaunchInfo} waiting for an emulator to connect.
-     * <p>Once an emulator has connected, {@link DelayedLaunchInfo#getDevice()} is set and the
-     * DelayedLaunchInfo object is moved to
-     * {@link AndroidLaunchController#mWaitingForReadyEmulatorList}.
-     * <b>ALL ACCESS MUST BE INSIDE A <code>synchronized (sListLock)</code> block!</b>
-     */
-    private final ArrayList<DelayedLaunchInfo> mWaitingForEmulatorLaunches =
-        new ArrayList<DelayedLaunchInfo>();
-
-    /**
-     * List of application waiting to be launched on a device/emulator.<br>
-     * <b>ALL ACCESS MUST BE INSIDE A <code>synchronized (sListLock)</code> block!</b>
-     * */
-    private final ArrayList<DelayedLaunchInfo> mWaitingForReadyEmulatorList =
-        new ArrayList<DelayedLaunchInfo>();
-
-    /**
-     * Application waiting to show up as waiting for debugger.
-     * <b>ALL ACCESS MUST BE INSIDE A <code>synchronized (sListLock)</code> block!</b>
-     */
-    private final ArrayList<DelayedLaunchInfo> mWaitingForDebuggerApplications =
-        new ArrayList<DelayedLaunchInfo>();
-
-    /**
-     * List of clients that have appeared as waiting for debugger before their name was available.
-     * <b>ALL ACCESS MUST BE INSIDE A <code>synchronized (sListLock)</code> block!</b>
-     */
-    private final ArrayList<Client> mUnknownClientsWaitingForDebugger = new ArrayList<Client>();
-
-    /** static instance for singleton */
-    private static AndroidLaunchController sThis = new AndroidLaunchController();
-
-    /** private constructor to enforce singleton */
-    private AndroidLaunchController() {
-        AndroidDebugBridge.addDebugBridgeChangeListener(this);
-        AndroidDebugBridge.addDeviceChangeListener(this);
-        AndroidDebugBridge.addClientChangeListener(this);
-    }
-
-    /**
-     * Returns the singleton reference.
-     */
-    public static AndroidLaunchController getInstance() {
-        return sThis;
-    }
-
-
-    /**
-     * Launches a remote java debugging session on an already running application
-     * @param project The project of the application to debug.
-     * @param debugPort The port to connect the debugger to.
-     */
-    public static void debugRunningApp(IProject project, int debugPort) {
-        // get an existing or new launch configuration
-        ILaunchConfiguration config = AndroidLaunchController.getLaunchConfig(project,
-                LaunchConfigDelegate.ANDROID_LAUNCH_TYPE_ID);
-
-        if (config != null) {
-            setPortLaunchConfigAssociation(config, debugPort);
-
-            // and launch
-            DebugUITools.launch(config, ILaunchManager.DEBUG_MODE);
-        }
-    }
-
-    /**
-     * Returns an {@link ILaunchConfiguration} for the specified {@link IProject}.
-     * @param project the project
-     * @param launchTypeId launch delegate type id
-     * @return a new or already existing <code>ILaunchConfiguration</code> or null if there was
-     * an error when creating a new one.
-     */
-    public static ILaunchConfiguration getLaunchConfig(IProject project, String launchTypeId) {
-        // get the launch manager
-        ILaunchManager manager = DebugPlugin.getDefault().getLaunchManager();
-
-        // now get the config type for our particular android type.
-        ILaunchConfigurationType configType = manager.getLaunchConfigurationType(launchTypeId);
-
-        String name = project.getName();
-
-        // search for an existing launch configuration
-        ILaunchConfiguration config = findConfig(manager, configType, name);
-
-        // test if we found one or not
-        if (config == null) {
-            // Didn't find a matching config, so we make one.
-            // It'll be made in the "working copy" object first.
-            ILaunchConfigurationWorkingCopy wc = null;
-
-            try {
-                // make the working copy object
-                wc = configType.newInstance(null,
-                        manager.generateLaunchConfigurationName(name));
-
-                // set the project name
-                wc.setAttribute(IJavaLaunchConfigurationConstants.ATTR_PROJECT_NAME, name);
-
-                // set the launch mode to default.
-                wc.setAttribute(LaunchConfigDelegate.ATTR_LAUNCH_ACTION,
-                        LaunchConfigDelegate.DEFAULT_LAUNCH_ACTION);
-
-                // set default target mode
-                wc.setAttribute(LaunchConfigDelegate.ATTR_TARGET_MODE,
-                        LaunchConfigDelegate.DEFAULT_TARGET_MODE.toString());
-
-                // default AVD: None
-                wc.setAttribute(LaunchConfigDelegate.ATTR_AVD_NAME, (String) null);
-
-                // set the default network speed
-                wc.setAttribute(LaunchConfigDelegate.ATTR_SPEED,
-                        LaunchConfigDelegate.DEFAULT_SPEED);
-
-                // and delay
-                wc.setAttribute(LaunchConfigDelegate.ATTR_DELAY,
-                        LaunchConfigDelegate.DEFAULT_DELAY);
-
-                // default wipe data mode
-                wc.setAttribute(LaunchConfigDelegate.ATTR_WIPE_DATA,
-                        LaunchConfigDelegate.DEFAULT_WIPE_DATA);
-
-                // default disable boot animation option
-                wc.setAttribute(LaunchConfigDelegate.ATTR_NO_BOOT_ANIM,
-                        LaunchConfigDelegate.DEFAULT_NO_BOOT_ANIM);
-
-                // set default emulator options
-                IPreferenceStore store = AdtPlugin.getDefault().getPreferenceStore();
-                String emuOptions = store.getString(AdtPrefs.PREFS_EMU_OPTIONS);
-                wc.setAttribute(LaunchConfigDelegate.ATTR_COMMANDLINE, emuOptions);
-
-                // map the config and the project
-                wc.setMappedResources(getResourcesToMap(project));
-
-                // save the working copy to get the launch config object which we return.
-                return wc.doSave();
-
-            } catch (CoreException e) {
-                String msg = String.format(
-                        "Failed to create a Launch config for project '%1$s': %2$s",
-                        project.getName(), e.getMessage());
-                AdtPlugin.printErrorToConsole(project, msg);
-
-                // no launch!
-                return null;
-            }
-        }
-
-        return config;
-    }
-
-    /**
-     * Returns the list of resources to map to a Launch Configuration.
-     * @param project the project associated to the launch configuration.
-     */
-    public static IResource[] getResourcesToMap(IProject project) {
-        ArrayList<IResource> array = new ArrayList<IResource>(2);
-        array.add(project);
-
-        IFile manifest = ProjectHelper.getManifest(project);
-        if (manifest != null) {
-            array.add(manifest);
-        }
-
-        return array.toArray(new IResource[array.size()]);
-    }
-
-    /**
-     * Launches an android app on the device or emulator
-     *
-     * @param project The project we're launching
-     * @param mode the mode in which to launch, one of the mode constants
-     *      defined by <code>ILaunchManager</code> - <code>RUN_MODE</code> or
-     *      <code>DEBUG_MODE</code>.
-     * @param apk the resource to the apk to launch.
-     * @param packageName the Android package name of the app
-     * @param debugPackageName the Android package name to debug
-     * @param debuggable the debuggable value of the app's manifest, or null if not set.
-     * @param requiredApiVersionNumber the api version required by the app, or null if none.
-     * @param launchAction the action to perform after app sync
-     * @param config the launch configuration
-     * @param launch the launch object
-     */
-    public void launch(final IProject project, String mode, IFile apk,
-            String packageName, String debugPackageName, Boolean debuggable,
-            String requiredApiVersionNumber, final IAndroidLaunchAction launchAction,
-            final AndroidLaunchConfiguration config, final AndroidLaunch launch,
-            IProgressMonitor monitor) {
-
-        String message = String.format("Performing %1$s", launchAction.getLaunchDescription());
-        AdtPlugin.printToConsole(project, message);
-
-        // create the launch info
-        final DelayedLaunchInfo launchInfo = new DelayedLaunchInfo(project, packageName,
-                debugPackageName, launchAction, apk, debuggable, requiredApiVersionNumber, launch,
-                monitor);
-
-        // set the debug mode
-        launchInfo.setDebugMode(mode.equals(ILaunchManager.DEBUG_MODE));
-
-        // get the SDK
-        Sdk currentSdk = Sdk.getCurrent();
-        AvdManager avdManager = currentSdk.getAvdManager();
-
-        // reload the AVDs to make sure we are up to date
-        try {
-            avdManager.reloadAvds(NullLogger.getLogger());
-        } catch (AndroidLocationException e1) {
-            // this happens if the AVD Manager failed to find the folder in which the AVDs are
-            // stored. This is unlikely to happen, but if it does, we should force to go manual
-            // to allow using physical devices.
-            config.mTargetMode = TargetMode.MANUAL;
-        }
-
-        // get the sdk against which the project is built
-        IAndroidTarget projectTarget = currentSdk.getTarget(project);
-
-        // get the min required android version
-        ManifestInfo mi = ManifestInfo.get(project);
-        final int minApiLevel = mi.getMinSdkVersion();
-        final String minApiCodeName = mi.getMinSdkCodeName();
-        final AndroidVersion minApiVersion = new AndroidVersion(minApiLevel, minApiCodeName);
-
-        // FIXME: check errors on missing sdk, AVD manager, or project target.
-
-        // device chooser response object.
-        final DeviceChooserResponse response = new DeviceChooserResponse();
-
-        /*
-         * Launch logic:
-         * - Use Last Launched Device/AVD set.
-         *       If user requested to use same device for future launches, and the last launched
-         *       device/avd is still present, then simply launch on the same device/avd.
-         * - Manual Mode
-         *       Always display a UI that lets a user see the current running emulators/devices.
-         *       The UI must show which devices are compatibles, and allow launching new emulators
-         *       with compatible (and not yet running) AVD.
-         * - Automatic Way
-         *     * Preferred AVD set.
-         *           If Preferred AVD is not running: launch it.
-         *           Launch the application on the preferred AVD.
-         *     * No preferred AVD.
-         *           Count the number of compatible emulators/devices.
-         *           If != 1, display a UI similar to manual mode.
-         *           If == 1, launch the application on this AVD/device.
-         * - Launch on multiple devices:
-         *     From the currently active devices & emulators, filter out those that cannot run
-         *     the app (by api level), and launch on all the others.
-         */
-        IDevice[] devices = AndroidDebugBridge.getBridge().getDevices();
-        if (config.mReuseLastUsedDevice) {
-            // check to see if the last used device is still online
-            IDevice lastUsedDevice = getDeviceIfOnline(config.mLastUsedDevice,
-                    devices);
-            if (lastUsedDevice != null) {
-                response.setDeviceToUse(lastUsedDevice);
-                continueLaunch(response, project, launch, launchInfo, config);
-                return;
-            }
-        }
-
-        if (config.mTargetMode == TargetMode.AUTO) {
-            // first check if we have a preferred AVD name, and if it actually exists, and is valid
-            // (ie able to run the project).
-            // We need to check this in case the AVD was recreated with a different target that is
-            // not compatible.
-            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)) {
-                    preferredAvd = null;
-
-                    AdtPlugin.printErrorToConsole(project, String.format(
-                            "Preferred AVD '%1$s' (API Level: %2$d) cannot run application with minApi %3$s. Looking for a compatible AVD...",
-                            config.mAvdName,
-                            preferredAvdTarget.getVersion().getApiLevel(),
-                            minApiVersion));
-                }
-            }
-
-            if (preferredAvd != null) {
-                // We have a preferred avd that can actually run the application.
-                // Now see if the AVD is running, and if so use it, otherwise launch it.
-
-                for (IDevice d : devices) {
-                    String deviceAvd = d.getAvdName();
-                    if (deviceAvd != null && deviceAvd.equals(config.mAvdName)) {
-                        response.setDeviceToUse(d);
-
-                        AdtPlugin.printToConsole(project, String.format(
-                                "Automatic Target Mode: Preferred AVD '%1$s' is available on emulator '%2$s'",
-                                config.mAvdName, d));
-
-                        continueLaunch(response, project, launch, launchInfo, config);
-                        return;
-                    }
-                }
-
-                // at this point we have a valid preferred AVD that is not running.
-                // We need to start it.
-                response.setAvdToLaunch(preferredAvd);
-
-                AdtPlugin.printToConsole(project, String.format(
-                        "Automatic Target Mode: Preferred AVD '%1$s' is not available. Launching new emulator.",
-                        config.mAvdName));
-
-                continueLaunch(response, project, launch, launchInfo, config);
-                return;
-            }
-
-            // no (valid) preferred AVD? look for one.
-
-            // If the API level requested in the manifest is lower than the current project
-            // target, when we will iterate devices/avds later ideally we will want to find
-            // a device/avd which target is as close to the manifest as possible (instead of
-            // a device which target is the same as the project's target) and use it as the
-            // new default.
-
-            if (minApiCodeName != null && minApiLevel < projectTarget.getVersion().getApiLevel()) {
-                int maxDist = projectTarget.getVersion().getApiLevel() - minApiLevel;
-                IAndroidTarget candidate = null;
-
-                for (IAndroidTarget target : currentSdk.getTargets()) {
-                    if (target.canRunOn(projectTarget)) {
-                        int currDist = target.getVersion().getApiLevel() - minApiLevel;
-                        if (currDist >= 0 && currDist < maxDist) {
-                            maxDist = currDist;
-                            candidate = target;
-                            if (maxDist == 0) {
-                                // Found a perfect match
-                                break;
-                            }
-                        }
-                    }
-                }
-
-                if (candidate != null) {
-                    // We found a better SDK target candidate, that is closer to the
-                    // API level from minSdkVersion than the one currently used by the
-                    // project. Below (in the for...devices loop) we'll try to find
-                    // a device/AVD for it.
-                    projectTarget = candidate;
-                }
-            }
-
-            HashMap<IDevice, AvdInfo> compatibleRunningAvds = new HashMap<IDevice, AvdInfo>();
-            boolean hasDevice = false; // if there's 1+ device running, we may force manual mode,
-                                       // as we cannot always detect proper compatibility with
-                                       // devices. This is the case if the project target is not
-                                       // a standard platform
-            for (IDevice d : devices) {
-                String deviceAvd = d.getAvdName();
-                if (deviceAvd != null) { // physical devices return null.
-                    AvdInfo info = avdManager.getAvd(deviceAvd, true /*validAvdOnly*/);
-                    if (AvdCompatibility.canRun(info, projectTarget, minApiVersion)
-                            == AvdCompatibility.Compatibility.YES) {
-                        compatibleRunningAvds.put(d, info);
-                    }
-                } else {
-                    if (projectTarget.isPlatform()) { // means this can run on any device as long
-                                                      // as api level is high enough
-                        AndroidVersion deviceVersion = Sdk.getDeviceVersion(d);
-                        // the deviceVersion may be null if it wasn't yet queried (device just
-                        // plugged in or emulator just booting up.
-                        if (deviceVersion != null &&
-                                deviceVersion.canRun(projectTarget.getVersion())) {
-                            // device is compatible with project
-                            compatibleRunningAvds.put(d, null);
-                            continue;
-                        }
-                    } else {
-                        // for non project platform, we can't be sure if a device can
-                        // run an application or not, since we don't query the device
-                        // for the list of optional libraries that it supports.
-                    }
-                    hasDevice = true;
-                }
-            }
-
-            // depending on the number of devices, we'll simulate an automatic choice
-            // from the device chooser or simply show up the device chooser.
-            if (hasDevice == false && compatibleRunningAvds.size() == 0) {
-                // if zero emulators/devices, we launch an emulator.
-                // We need to figure out which AVD first.
-
-                // we are going to take the closest AVD. ie a compatible AVD that has the API level
-                // closest to the project target.
-                AvdInfo defaultAvd = findMatchingAvd(avdManager, projectTarget, minApiVersion);
-
-                if (defaultAvd != null) {
-                    response.setAvdToLaunch(defaultAvd);
-
-                    AdtPlugin.printToConsole(project, String.format(
-                            "Automatic Target Mode: launching new emulator with compatible AVD '%1$s'",
-                            defaultAvd.getName()));
-
-                    continueLaunch(response, project, launch, launchInfo, config);
-                    return;
-                } else {
-                    AdtPlugin.printToConsole(project, String.format(
-                            "Failed to find an AVD compatible with target '%1$s'.",
-                            projectTarget.getName()));
-
-                    final Display display = AdtPlugin.getDisplay();
-                    final boolean[] searchAgain = new boolean[] { false };
-                    // ask the user to create a new one.
-                    display.syncExec(new Runnable() {
-                        @Override
-                        public void run() {
-                            Shell shell = display.getActiveShell();
-                            if (MessageDialog.openQuestion(shell, "Android AVD Error",
-                                    "No compatible targets were found. Do you wish to add a new Android Virtual Device?")) {
-                                AvdManagerAction action = new AvdManagerAction();
-                                action.run(null /*action*/);
-                                searchAgain[0] = true;
-                            }
-                        }
-                    });
-                    if (searchAgain[0]) {
-                        // attempt to reload the AVDs and find one compatible.
-                        defaultAvd = findMatchingAvd(avdManager, projectTarget, minApiVersion);
-
-                        if (defaultAvd == null) {
-                            AdtPlugin.printErrorToConsole(project, String.format(
-                                    "Still no compatible AVDs with target '%1$s': Aborting launch.",
-                                    projectTarget.getName()));
-                            stopLaunch(launchInfo);
-                        } else {
-                            response.setAvdToLaunch(defaultAvd);
-
-                            AdtPlugin.printToConsole(project, String.format(
-                                    "Launching new emulator with compatible AVD '%1$s'",
-                                    defaultAvd.getName()));
-
-                            continueLaunch(response, project, launch, launchInfo, config);
-                            return;
-                        }
-                    }
-                }
-            } else if (hasDevice == false && compatibleRunningAvds.size() == 1) {
-                Entry<IDevice, AvdInfo> e = compatibleRunningAvds.entrySet().iterator().next();
-                response.setDeviceToUse(e.getKey());
-
-                // get the AvdInfo, if null, the device is a physical device.
-                AvdInfo avdInfo = e.getValue();
-                if (avdInfo != null) {
-                    message = String.format("Automatic Target Mode: using existing emulator '%1$s' running compatible AVD '%2$s'",
-                            response.getDeviceToUse(), e.getValue().getName());
-                } else {
-                    message = String.format("Automatic Target Mode: using device '%1$s'",
-                            response.getDeviceToUse());
-                }
-                AdtPlugin.printToConsole(project, message);
-
-                continueLaunch(response, project, launch, launchInfo, config);
-                return;
-            }
-
-            // if more than one device, we'll bring up the DeviceChooser dialog below.
-            if (compatibleRunningAvds.size() >= 2) {
-                message = "Automatic Target Mode: Several compatible targets. Please select a target device.";
-            } else if (hasDevice) {
-                message = "Automatic Target Mode: Unable to detect device compatibility. Please select a target device.";
-            }
-
-            AdtPlugin.printToConsole(project, message);
-        } else if ((config.mTargetMode == TargetMode.ALL_DEVICES_AND_EMULATORS
-                || config.mTargetMode == TargetMode.ALL_DEVICES
-                || config.mTargetMode == TargetMode.ALL_EMULATORS)
-                && ILaunchManager.RUN_MODE.equals(mode)) {
-            // if running on multiple devices, identify all compatible devices
-            boolean includeDevices = config.mTargetMode != TargetMode.ALL_EMULATORS;
-            boolean includeAvds = config.mTargetMode != TargetMode.ALL_DEVICES;
-            Collection<IDevice> compatibleDevices = findCompatibleDevices(devices,
-                    minApiVersion, includeDevices, includeAvds);
-            if (compatibleDevices.size() == 0) {
-                AdtPlugin.printErrorToConsole(project,
-                      "No active compatible AVD's or devices found. "
-                    + "Relaunch this configuration after connecting a device or starting an AVD.");
-                stopLaunch(launchInfo);
-            } else {
-                multiLaunch(launchInfo, compatibleDevices);
-            }
-            return;
-        }
-
-        // bring up the device chooser.
-        final IAndroidTarget desiredProjectTarget = projectTarget;
-        final AtomicBoolean continueLaunch = new AtomicBoolean(false);
-        AdtPlugin.getDisplay().syncExec(new Runnable() {
-            @Override
-            public void run() {
-                try {
-                    // open the chooser dialog. It'll fill 'response' with the device to use
-                    // or the AVD to launch.
-                    DeviceChooserDialog dialog = new DeviceChooserDialog(
-                            AdtPlugin.getShell(),
-                            response, launchInfo.getPackageName(),
-                            desiredProjectTarget, minApiVersion,
-                            config.mReuseLastUsedDevice);
-                    if (dialog.open() == Dialog.OK) {
-                        updateLaunchConfigWithLastUsedDevice(launch.getLaunchConfiguration(),
-                                response);
-                        continueLaunch.set(true);
-                    } else {
-                        AdtPlugin.printErrorToConsole(project, "Launch canceled!");
-                        stopLaunch(launchInfo);
-                        return;
-                    }
-                } catch (Exception e) {
-                    // there seems to be some case where the shell will be null. (might be
-                    // an OS X bug). Because of this the creation of the dialog will throw
-                    // and IllegalArg exception interrupting the launch with no user feedback.
-                    // So we trap all the exception and display something.
-                    String msg = e.getMessage();
-                    if (msg == null) {
-                        msg = e.getClass().getCanonicalName();
-                    }
-                    AdtPlugin.printErrorToConsole(project,
-                            String.format("Error during launch: %s", msg));
-                    stopLaunch(launchInfo);
-                }
-            }
-        });
-
-        if (continueLaunch.get()) {
-            continueLaunch(response, project, launch, launchInfo, config);
-        }
-    }
-
-    /**
-     * Returns devices that can run a app of provided API level.
-     * @param devices list of devices to filter from
-     * @param requiredVersion minimum required API that should be supported
-     * @param includeDevices include physical devices in the filtered list
-     * @param includeAvds include emulators in the filtered list
-     * @return set of compatible devices, may be an empty set
-     */
-    private Collection<IDevice> findCompatibleDevices(IDevice[] devices,
-            AndroidVersion requiredVersion, boolean includeDevices, boolean includeAvds) {
-        Set<IDevice> compatibleDevices = new HashSet<IDevice>(devices.length);
-        AvdManager avdManager = Sdk.getCurrent().getAvdManager();
-        for (IDevice d: devices) {
-            boolean isEmulator = d.isEmulator();
-            boolean canRun = false;
-
-            if (isEmulator) {
-                if (!includeAvds) {
-                    continue;
-                }
-
-                AvdInfo avdInfo = avdManager.getAvd(d.getAvdName(), true);
-                if (avdInfo != null && avdInfo.getTarget() != null) {
-                    canRun = avdInfo.getTarget().getVersion().canRun(requiredVersion);
-                }
-            } else {
-                if (!includeDevices) {
-                    continue;
-                }
-
-                AndroidVersion deviceVersion = Sdk.getDeviceVersion(d);
-                if (deviceVersion != null) {
-                    canRun = deviceVersion.canRun(requiredVersion);
-                }
-            }
-
-            if (canRun) {
-                compatibleDevices.add(d);
-            }
-        }
-
-        return compatibleDevices;
-    }
-
-    /**
-     * Find a matching AVD.
-     * @param minApiVersion
-     */
-    private AvdInfo findMatchingAvd(AvdManager avdManager, final IAndroidTarget projectTarget,
-            AndroidVersion minApiVersion) {
-        AvdInfo[] avds = avdManager.getValidAvds();
-        AvdInfo bestAvd = null;
-        for (AvdInfo avd : avds) {
-            if (AvdCompatibility.canRun(avd, projectTarget, minApiVersion)
-                    == AvdCompatibility.Compatibility.YES) {
-                // at this point we can ignore the code name issue since
-                // AvdCompatibility.canRun() will already have filtered out the non compatible AVDs.
-                if (bestAvd == null ||
-                        avd.getTarget().getVersion().getApiLevel() <
-                            bestAvd.getTarget().getVersion().getApiLevel()) {
-                    bestAvd = avd;
-                }
-            }
-        }
-        return bestAvd;
-    }
-
-    /**
-     * Continues the launch based on the DeviceChooser response.
-     * @param response the device chooser response
-     * @param project The project being launched
-     * @param launch The eclipse launch info
-     * @param launchInfo The {@link DelayedLaunchInfo}
-     * @param config The config needed to start a new emulator.
-     */
-    private void continueLaunch(final DeviceChooserResponse response, final IProject project,
-            final AndroidLaunch launch, final DelayedLaunchInfo launchInfo,
-            final AndroidLaunchConfiguration config) {
-        if (response.getAvdToLaunch() != null) {
-            // there was no selected device, we start a new emulator.
-            synchronized (sListLock) {
-                AvdInfo info = response.getAvdToLaunch();
-                mWaitingForEmulatorLaunches.add(launchInfo);
-                AdtPlugin.printToConsole(project, String.format(
-                        "Launching a new emulator with Virtual Device '%1$s'",
-                        info.getName()));
-                boolean status = launchEmulator(config, info);
-
-                if (status == false) {
-                    // launching the emulator failed!
-                    AdtPlugin.displayError("Emulator Launch",
-                            "Couldn't launch the emulator! Make sure the SDK directory is properly setup and the emulator is not missing.");
-
-                    // stop the launch and return
-                    mWaitingForEmulatorLaunches.remove(launchInfo);
-                    AdtPlugin.printErrorToConsole(project, "Launch canceled!");
-                    stopLaunch(launchInfo);
-                    return;
-                }
-
-                return;
-            }
-        } else if (response.getDeviceToUse() != null) {
-            launchInfo.setDevice(response.getDeviceToUse());
-            simpleLaunch(launchInfo, launchInfo.getDevice());
-        }
-    }
-
-    /**
-     * Queries for a debugger port for a specific {@link ILaunchConfiguration}.
-     * <p/>
-     * If the configuration and a debugger port where added through
-     * {@link #setPortLaunchConfigAssociation(ILaunchConfiguration, int)}, then this method
-     * will return the debugger port, and remove the configuration from the list.
-     * @param launchConfig the {@link ILaunchConfiguration}
-     * @return the debugger port or {@link LaunchConfigDelegate#INVALID_DEBUG_PORT} if the
-     * configuration was not setup.
-     */
-    static int getPortForConfig(ILaunchConfiguration launchConfig) {
-        synchronized (sListLock) {
-            Integer port = sRunningAppMap.get(launchConfig);
-            if (port != null) {
-                sRunningAppMap.remove(launchConfig);
-                return port;
-            }
-        }
-
-        return LaunchConfigDelegate.INVALID_DEBUG_PORT;
-    }
-
-    /**
-     * Set a {@link ILaunchConfiguration} and its associated debug port, in the list of
-     * launch config to connect directly to a running app instead of doing full launch (sync,
-     * launch, and connect to).
-     * @param launchConfig the {@link ILaunchConfiguration} object.
-     * @param port The debugger port to connect to.
-     */
-    private static void setPortLaunchConfigAssociation(ILaunchConfiguration launchConfig,
-            int port) {
-        synchronized (sListLock) {
-            sRunningAppMap.put(launchConfig, port);
-        }
-    }
-
-    /**
-     * Checks the build information, and returns whether the launch should continue.
-     * <p/>The value tested are:
-     * <ul>
-     * <li>Minimum API version requested by the application. If the target device does not match,
-     * the launch is canceled.</li>
-     * <li>Debuggable attribute of the application and whether or not the device requires it. If
-     * the device requires it and it is not set in the manifest, the launch will be forced to
-     * "release" mode instead of "debug"</li>
-     * <ul>
-     */
-    private boolean checkBuildInfo(DelayedLaunchInfo launchInfo, IDevice device) {
-        if (device != null) {
-            // check the app required API level versus the target device API level
-
-            String deviceVersion = device.getProperty(IDevice.PROP_BUILD_VERSION);
-            String deviceApiLevelString = device.getProperty(IDevice.PROP_BUILD_API_LEVEL);
-            String deviceCodeName = device.getProperty(IDevice.PROP_BUILD_CODENAME);
-
-            int deviceApiLevel = -1;
-            try {
-                deviceApiLevel = Integer.parseInt(deviceApiLevelString);
-            } catch (NumberFormatException e) {
-                // pass, we'll keep the apiLevel value at -1.
-            }
-
-            String requiredApiString = launchInfo.getRequiredApiVersionNumber();
-            if (requiredApiString != null) {
-                int requiredApi = -1;
-                try {
-                    requiredApi = Integer.parseInt(requiredApiString);
-                } catch (NumberFormatException e) {
-                    // pass, we'll keep requiredApi value at -1.
-                }
-
-                if (requiredApi == -1) {
-                    // this means the manifest uses a codename for minSdkVersion
-                    // check that the device is using the same codename
-                    if (requiredApiString.equals(deviceCodeName) == false) {
-                        AdtPlugin.printErrorToConsole(launchInfo.getProject(), String.format(
-                            "ERROR: Application requires a device running '%1$s'!",
-                            requiredApiString));
-                        return false;
-                    }
-                } else {
-                    // app requires a specific API level
-                    if (deviceApiLevel == -1) {
-                        AdtPlugin.printToConsole(launchInfo.getProject(),
-                                "WARNING: Unknown device API version!");
-                    } else if (deviceApiLevel < requiredApi) {
-                        String msg = String.format(
-                                "ERROR: Application requires API version %1$d. Device API version is %2$d (Android %3$s).",
-                                requiredApi, deviceApiLevel, deviceVersion);
-                        AdtPlugin.printErrorToConsole(launchInfo.getProject(), msg);
-
-                        // abort the launch
-                        return false;
-                    }
-                }
-            } else {
-                // warn the application API level requirement is not set.
-                AdtPlugin.printErrorToConsole(launchInfo.getProject(),
-                        "WARNING: Application does not specify an API level requirement!");
-
-                // and display the target device API level (if known)
-                if (deviceApiLevel == -1) {
-                    AdtPlugin.printErrorToConsole(launchInfo.getProject(),
-                            "WARNING: Unknown device API version!");
-                } else {
-                    AdtPlugin.printErrorToConsole(launchInfo.getProject(), String.format(
-                            "Device API version is %1$d (Android %2$s)", deviceApiLevel,
-                            deviceVersion));
-                }
-            }
-
-            // now checks that the device/app can be debugged (if needed)
-            if (device.isEmulator() == false && launchInfo.isDebugMode()) {
-                String debuggableDevice = device.getProperty(IDevice.PROP_DEBUGGABLE);
-                if (debuggableDevice != null && debuggableDevice.equals("0")) { //$NON-NLS-1$
-                    // the device is "secure" and requires apps to declare themselves as debuggable!
-                    // launchInfo.getDebuggable() will return null if the manifest doesn't declare
-                    // anything. In this case this is fine since the build system does insert
-                    // debuggable=true. The only case to look for is if false is manually set
-                    // in the manifest.
-                    if (launchInfo.getDebuggable() == Boolean.FALSE) {
-                        String message = String.format("Application '%1$s' has its 'debuggable' attribute set to FALSE and cannot be debugged.",
-                                launchInfo.getPackageName());
-                        AdtPlugin.printErrorToConsole(launchInfo.getProject(), message);
-
-                        // because am -D does not check for ro.debuggable and the
-                        // 'debuggable' attribute, it is important we do not use the -D option
-                        // in this case or the app will wait for a debugger forever and never
-                        // really launch.
-                        launchInfo.setDebugMode(false);
-                    }
-                }
-            }
-        }
-
-        return true;
-    }
-
-    /**
-     * Do a simple launch on the specified device, attempting to sync the new
-     * package, and then launching the application. Failed sync/launch will
-     * stop the current AndroidLaunch and return false;
-     * @param launchInfo
-     * @param device
-     * @return true if succeed
-     */
-    private boolean simpleLaunch(DelayedLaunchInfo launchInfo, IDevice device) {
-        if (!doPreLaunchActions(launchInfo, device)) {
-            AdtPlugin.printErrorToConsole(launchInfo.getProject(), "Launch canceled!");
-            stopLaunch(launchInfo);
-            return false;
-        }
-
-        // launch the app
-        launchApp(launchInfo, device);
-
-        return true;
-    }
-
-    private boolean doPreLaunchActions(DelayedLaunchInfo launchInfo, IDevice device) {
-        // API level check
-        if (!checkBuildInfo(launchInfo, device)) {
-            return false;
-        }
-
-        // sync app
-        if (!syncApp(launchInfo, device)) {
-            return false;
-        }
-
-        return true;
-    }
-
-    private void multiLaunch(DelayedLaunchInfo launchInfo, Collection<IDevice> devices) {
-        for (IDevice d: devices) {
-            boolean success = doPreLaunchActions(launchInfo, d);
-            if (!success) {
-                String deviceName = d.isEmulator() ? d.getAvdName() : d.getSerialNumber();
-                AdtPlugin.printErrorToConsole(launchInfo.getProject(),
-                        "Launch failed on device: " + deviceName);
-                continue;
-            }
-        }
-
-        doLaunchAction(launchInfo, devices);
-
-        // multiple launches are only supported for run configuration, so we can terminate
-        // the launch itself
-        stopLaunch(launchInfo);
-    }
-
-    /**
-     * If needed, syncs the application and all its dependencies on the device/emulator.
-     *
-     * @param launchInfo The Launch information object.
-     * @param device the device on which to sync the application
-     * @return true if the install succeeded.
-     */
-    private boolean syncApp(DelayedLaunchInfo launchInfo, IDevice device) {
-        boolean alreadyInstalled = ApkInstallManager.getInstance().isApplicationInstalled(
-                launchInfo.getProject(), launchInfo.getPackageName(), device);
-
-        if (alreadyInstalled) {
-            AdtPlugin.printToConsole(launchInfo.getProject(),
-            "Application already deployed. No need to reinstall.");
-        } else {
-            if (doSyncApp(launchInfo, device) == false) {
-                return false;
-            }
-        }
-
-        // The app is now installed, now try the dependent projects
-        for (DelayedLaunchInfo dependentLaunchInfo : getDependenciesLaunchInfo(launchInfo)) {
-            String msg = String.format("Project dependency found, installing: %s",
-                    dependentLaunchInfo.getProject().getName());
-            AdtPlugin.printToConsole(launchInfo.getProject(), msg);
-            if (syncApp(dependentLaunchInfo, device) == false) {
-                return false;
-            }
-        }
-
-        return true;
-    }
-
-    /**
-     * Syncs the application on the device/emulator.
-     *
-     * @param launchInfo The Launch information object.
-     * @param device the device on which to sync the application
-     * @return true if the install succeeded.
-     */
-    private boolean doSyncApp(DelayedLaunchInfo launchInfo, IDevice device) {
-        IPath path = launchInfo.getPackageFile().getLocation();
-        String fileName = path.lastSegment();
-        try {
-            String message = String.format("Uploading %1$s onto device '%2$s'",
-                    fileName, device.getSerialNumber());
-            AdtPlugin.printToConsole(launchInfo.getProject(), message);
-
-            String remotePackagePath = device.syncPackageToDevice(path.toOSString());
-            boolean installResult = installPackage(launchInfo, remotePackagePath, device);
-            device.removeRemotePackage(remotePackagePath);
-
-            // if the installation succeeded, we register it.
-            if (installResult) {
-               ApkInstallManager.getInstance().registerInstallation(
-                       launchInfo.getProject(), launchInfo.getPackageName(), device);
-            }
-            return installResult;
-        }
-        catch (IOException e) {
-            String msg = String.format("Failed to install %1$s on device '%2$s': %3$s", fileName,
-                    device.getSerialNumber(), e.getMessage());
-            AdtPlugin.printErrorToConsole(launchInfo.getProject(), msg, e);
-        } catch (TimeoutException e) {
-            String msg = String.format("Failed to install %1$s on device '%2$s': timeout", fileName,
-                    device.getSerialNumber());
-            AdtPlugin.printErrorToConsole(launchInfo.getProject(), msg);
-        } catch (AdbCommandRejectedException e) {
-            String msg = String.format(
-                    "Failed to install %1$s on device '%2$s': adb rejected install command with: %3$s",
-                    fileName, device.getSerialNumber(), e.getMessage());
-            AdtPlugin.printErrorToConsole(launchInfo.getProject(), msg, e);
-        } catch (CanceledException e) {
-            if (e.wasCanceled()) {
-                AdtPlugin.printToConsole(launchInfo.getProject(),
-                        String.format("Install of %1$s canceled", fileName));
-            } else {
-                String msg = String.format("Failed to install %1$s on device '%2$s': %3$s",
-                        fileName, device.getSerialNumber(), e.getMessage());
-                AdtPlugin.printErrorToConsole(launchInfo.getProject(), msg, e);
-            }
-        }
-
-        return false;
-    }
-
-    /**
-     * For the current launchInfo, create additional DelayedLaunchInfo that should be used to
-     * sync APKs that we are dependent on to the device.
-     *
-     * @param launchInfo the original launch info that we want to find the
-     * @return a list of DelayedLaunchInfo (may be empty if no dependencies were found or error)
-     */
-    public List<DelayedLaunchInfo> getDependenciesLaunchInfo(DelayedLaunchInfo launchInfo) {
-        List<DelayedLaunchInfo> dependencies = new ArrayList<DelayedLaunchInfo>();
-
-        // Convert to equivalent JavaProject
-        IJavaProject javaProject;
-        try {
-            //assuming this is an Android (and Java) project since it is attached to the launchInfo.
-            javaProject = BaseProjectHelper.getJavaProject(launchInfo.getProject());
-        } catch (CoreException e) {
-            // return empty dependencies
-            AdtPlugin.printErrorToConsole(launchInfo.getProject(), e);
-            return dependencies;
-        }
-
-        // Get all projects that this depends on
-        List<IJavaProject> androidProjectList;
-        try {
-            androidProjectList = ProjectHelper.getAndroidProjectDependencies(javaProject);
-        } catch (JavaModelException e) {
-            // return empty dependencies
-            AdtPlugin.printErrorToConsole(launchInfo.getProject(), e);
-            return dependencies;
-        }
-
-        // for each project, parse manifest and create launch information
-        for (IJavaProject androidProject : androidProjectList) {
-            // Parse the Manifest to get various required information
-            // copied from LaunchConfigDelegate
-            ManifestData manifestData = AndroidManifestHelper.parseForData(
-                    androidProject.getProject());
-
-            if (manifestData == null) {
-                continue;
-            }
-
-            // Get the APK location (can return null)
-            IFile apk = ProjectHelper.getApplicationPackage(androidProject.getProject());
-            if (apk == null) {
-                // getApplicationPackage will have logged an error message
-                continue;
-            }
-
-            // Create new launchInfo as an hybrid between parent and dependency information
-            DelayedLaunchInfo delayedLaunchInfo = new DelayedLaunchInfo(
-                    androidProject.getProject(),
-                    manifestData.getPackage(),
-                    manifestData.getPackage(),
-                    launchInfo.getLaunchAction(),
-                    apk,
-                    manifestData.getDebuggable(),
-                    manifestData.getMinSdkVersionString(),
-                    launchInfo.getLaunch(),
-                    launchInfo.getMonitor());
-
-            // Add to the list
-            dependencies.add(delayedLaunchInfo);
-        }
-
-        return dependencies;
-    }
-
-    /**
-     * Installs the application package on the device, and handles return result
-     * @param launchInfo The launch information
-     * @param remotePath The remote path of the package.
-     * @param device The device on which the launch is done.
-     */
-    private boolean installPackage(DelayedLaunchInfo launchInfo, final String remotePath,
-            final IDevice device) {
-        String message = String.format("Installing %1$s...", launchInfo.getPackageFile().getName());
-        AdtPlugin.printToConsole(launchInfo.getProject(), message);
-        try {
-            // try a reinstall first, because the most common case is the app is already installed
-            String result = doInstall(launchInfo, remotePath, device, true /* reinstall */);
-
-            /* For now we force to retry the install (after uninstalling) because there's no
-             * other way around it: adb install does not want to update a package w/o uninstalling
-             * the old one first!
-             */
-            return checkInstallResult(result, device, launchInfo, remotePath,
-                    InstallRetryMode.ALWAYS);
-        } catch (Exception e) {
-            String msg = String.format(
-                    "Failed to install %1$s on device '%2$s!",
-                    launchInfo.getPackageFile().getName(), device.getSerialNumber());
-            AdtPlugin.printErrorToConsole(launchInfo.getProject(), msg, e.getMessage());
-        }
-
-        return false;
-    }
-
-    /**
-     * Checks the result of an installation, and takes optional actions based on it.
-     * @param result the result string from the installation
-     * @param device the device on which the installation occured.
-     * @param launchInfo the {@link DelayedLaunchInfo}
-     * @param remotePath the temporary path of the package on the device
-     * @param retryMode indicates what to do in case, a package already exists.
-     * @return <code>true<code> if success, <code>false</code> otherwise.
-     * @throws InstallException
-     */
-    private boolean checkInstallResult(String result, IDevice device, DelayedLaunchInfo launchInfo,
-            String remotePath, InstallRetryMode retryMode) throws InstallException {
-        if (result == null) {
-            AdtPlugin.printToConsole(launchInfo.getProject(), "Success!");
-            return true;
-        }
-        else if (result.equals("INSTALL_FAILED_ALREADY_EXISTS")) { //$NON-NLS-1$
-            // this should never happen, since reinstall mode is used on the first attempt
-            if (retryMode == InstallRetryMode.PROMPT) {
-                boolean prompt = AdtPlugin.displayPrompt("Application Install",
-                        "A previous installation needs to be uninstalled before the new package can be installed.\nDo you want to uninstall?");
-                if (prompt) {
-                    retryMode = InstallRetryMode.ALWAYS;
-                } else {
-                    AdtPlugin.printErrorToConsole(launchInfo.getProject(),
-                        "Installation error! The package already exists.");
-                    return false;
-                }
-            }
-
-            if (retryMode == InstallRetryMode.ALWAYS) {
-                /*
-                 * TODO: create a UI that gives the dev the choice to:
-                 * - clean uninstall on launch
-                 * - full uninstall if application exists.
-                 * - soft uninstall if application exists (keeps the app data around).
-                 * - always ask (choice of soft-reinstall, full reinstall)
-                AdtPlugin.printErrorToConsole(launchInfo.mProject,
-                        "Application already exists, uninstalling...");
-                String res = doUninstall(device, launchInfo);
-                if (res == null) {
-                    AdtPlugin.printToConsole(launchInfo.mProject, "Success!");
-                } else {
-                    AdtPlugin.printErrorToConsole(launchInfo.mProject,
-                            String.format("Failed to uninstall: %1$s", res));
-                    return false;
-                }
-                */
-
-                AdtPlugin.printToConsole(launchInfo.getProject(),
-                        "Application already exists. Attempting to re-install instead...");
-                String res = doInstall(launchInfo, remotePath, device, true /* reinstall */ );
-                return checkInstallResult(res, device, launchInfo, remotePath,
-                        InstallRetryMode.NEVER);
-            }
-            AdtPlugin.printErrorToConsole(launchInfo.getProject(),
-                    "Installation error! The package already exists.");
-        } else if (result.equals("INSTALL_FAILED_INVALID_APK")) { //$NON-NLS-1$
-            AdtPlugin.printErrorToConsole(launchInfo.getProject(),
-                "Installation failed due to invalid APK file!",
-                "Please check logcat output for more details.");
-        } else if (result.equals("INSTALL_FAILED_INVALID_URI")) { //$NON-NLS-1$
-            AdtPlugin.printErrorToConsole(launchInfo.getProject(),
-                "Installation failed due to invalid URI!",
-                "Please check logcat output for more details.");
-        } else if (result.equals("INSTALL_FAILED_COULDNT_COPY")) { //$NON-NLS-1$
-            AdtPlugin.printErrorToConsole(launchInfo.getProject(),
-                String.format("Installation failed: Could not copy %1$s to its final location!",
-                        launchInfo.getPackageFile().getName()),
-                "Please check logcat output for more details.");
-        } else if (result.equals("INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES")) { //$NON-NLS-1$
-            if (retryMode != InstallRetryMode.NEVER) {
-                boolean prompt = AdtPlugin.displayPrompt("Application Install",
-                                "Re-installation failed due to different application signatures. You must perform a full uninstall of the application. WARNING: This will remove the application data!\nDo you want to uninstall?");
-                if (prompt) {
-                    doUninstall(device, launchInfo);
-                    String res = doInstall(launchInfo, remotePath, device, false);
-                    return checkInstallResult(res, device, launchInfo, remotePath,
-                            InstallRetryMode.NEVER);
-                }
-            }
-            AdtPlugin.printErrorToConsole(launchInfo.getProject(),
-                    "Re-installation failed due to different application signatures.",
-                    "You must perform a full uninstall of the application. WARNING: This will remove the application data!",
-                    String.format("Please execute 'adb uninstall %1$s' in a shell.", launchInfo.getPackageName()));
-        } else {
-            AdtPlugin.printErrorToConsole(launchInfo.getProject(),
-                String.format("Installation error: %1$s", result),
-                "Please check logcat output for more details.");
-        }
-
-        return false;
-    }
-
-    /**
-     * Performs the uninstallation of an application.
-     * @param device the device on which to install the application.
-     * @param launchInfo the {@link DelayedLaunchInfo}.
-     * @return a {@link String} with an error code, or <code>null</code> if success.
-     * @throws InstallException if the installation failed.
-     */
-    private String doUninstall(IDevice device, DelayedLaunchInfo launchInfo)
-            throws InstallException {
-        try {
-            return device.uninstallPackage(launchInfo.getPackageName());
-        } catch (InstallException e) {
-            String msg = String.format(
-                    "Failed to uninstall %1$s: %2$s", launchInfo.getPackageName(), e.getMessage());
-            AdtPlugin.printErrorToConsole(launchInfo.getProject(), msg);
-            throw e;
-        }
-    }
-
-    /**
-     * Performs the installation of an application whose package has been uploaded on the device.
-     *
-     * @param launchInfo the {@link DelayedLaunchInfo}.
-     * @param remotePath the path of the application package in the device tmp folder.
-     * @param device the device on which to install the application.
-     * @param reinstall
-     * @return a {@link String} with an error code, or <code>null</code> if success.
-     * @throws InstallException if the uninstallation failed.
-     */
-    private String doInstall(DelayedLaunchInfo launchInfo, final String remotePath,
-            final IDevice device, boolean reinstall) throws InstallException {
-        return device.installRemotePackage(remotePath, reinstall);
-    }
-
-    /**
-     * launches an application on a device or emulator
-     *
-     * @param info the {@link DelayedLaunchInfo} that indicates the launch action
-     * @param device the device or emulator to launch the application on
-     */
-    @Override
-    public void launchApp(final DelayedLaunchInfo info, IDevice device) {
-        if (info.isDebugMode()) {
-            synchronized (sListLock) {
-                if (mWaitingForDebuggerApplications.contains(info) == false) {
-                    mWaitingForDebuggerApplications.add(info);
-                }
-            }
-        }
-        if (doLaunchAction(info, device)) {
-            // if the app is not a debug app, we need to do some clean up, as
-            // the process is done!
-            if (info.isDebugMode() == false) {
-                // stop the launch object, since there's no debug, and it can't
-                // provide any control over the app
-                stopLaunch(info);
-            }
-        } else {
-            // something went wrong or no further launch action needed
-            // lets stop the Launch
-            stopLaunch(info);
-        }
-    }
-
-    private boolean doLaunchAction(final DelayedLaunchInfo info, Collection<IDevice> devices) {
-        boolean result = info.getLaunchAction().doLaunchAction(info, devices);
-
-        // Monitor the logcat output on the launched device to notify
-        // the user if any significant error occurs that is visible from logcat
-        for (IDevice d : devices) {
-            DdmsPlugin.getDefault().startLogCatMonitor(d);
-        }
-
-        return result;
-    }
-
-    private boolean doLaunchAction(final DelayedLaunchInfo info, IDevice device) {
-        return doLaunchAction(info, Collections.singletonList(device));
-    }
-
-    private boolean launchEmulator(AndroidLaunchConfiguration config, AvdInfo avdToLaunch) {
-
-        // split the custom command line in segments
-        ArrayList<String> customArgs = new ArrayList<String>();
-        boolean hasWipeData = false;
-        if (config.mEmulatorCommandLine != null && config.mEmulatorCommandLine.length() > 0) {
-            String[] segments = config.mEmulatorCommandLine.split("\\s+"); //$NON-NLS-1$
-
-            // we need to remove the empty strings
-            for (String s : segments) {
-                if (s.length() > 0) {
-                    customArgs.add(s);
-                    if (!hasWipeData && s.equals(FLAG_WIPE_DATA)) {
-                        hasWipeData = true;
-                    }
-                }
-            }
-        }
-
-        boolean needsWipeData = config.mWipeData && !hasWipeData;
-        if (needsWipeData) {
-            if (!AdtPlugin.displayPrompt("Android Launch", "Are you sure you want to wipe all user data when starting this emulator?")) {
-                needsWipeData = false;
-            }
-        }
-
-        // build the command line based on the available parameters.
-        ArrayList<String> list = new ArrayList<String>();
-
-        String path = AdtPlugin.getOsAbsoluteEmulator();
-
-        list.add(path);
-
-        list.add(FLAG_AVD);
-        list.add(avdToLaunch.getName());
-
-        if (config.mNetworkSpeed != null) {
-            list.add(FLAG_NETSPEED);
-            list.add(config.mNetworkSpeed);
-        }
-
-        if (config.mNetworkDelay != null) {
-            list.add(FLAG_NETDELAY);
-            list.add(config.mNetworkDelay);
-        }
-
-        if (needsWipeData) {
-            list.add(FLAG_WIPE_DATA);
-        }
-
-        if (config.mNoBootAnim) {
-            list.add(FLAG_NO_BOOT_ANIM);
-        }
-
-        list.addAll(customArgs);
-
-        // convert the list into an array for the call to exec.
-        String[] command = list.toArray(new String[list.size()]);
-
-        // launch the emulator
-        try {
-            Process process = Runtime.getRuntime().exec(command);
-            grabEmulatorOutput(process);
-        } catch (IOException e) {
-            return false;
-        }
-
-        return true;
-    }
-
-    /**
-     * Looks for and returns an existing {@link ILaunchConfiguration} object for a
-     * specified project.
-     * @param manager The {@link ILaunchManager}.
-     * @param type The {@link ILaunchConfigurationType}.
-     * @param projectName The name of the project
-     * @return an existing <code>ILaunchConfiguration</code> object matching the project, or
-     *      <code>null</code>.
-     */
-    private static ILaunchConfiguration findConfig(ILaunchManager manager,
-            ILaunchConfigurationType type, String projectName) {
-        try {
-            ILaunchConfiguration[] configs = manager.getLaunchConfigurations(type);
-
-            for (ILaunchConfiguration config : configs) {
-                if (config.getAttribute(IJavaLaunchConfigurationConstants.ATTR_PROJECT_NAME,
-                        "").equals(projectName)) {  //$NON-NLS-1$
-                    return config;
-                }
-            }
-        } catch (CoreException e) {
-            MessageDialog.openError(AdtPlugin.getShell(),
-                    "Launch Error", e.getStatus().getMessage());
-        }
-
-        // didn't find anything that matches. Return null
-        return null;
-    }
-
-
-    /**
-     * Connects a remote debugger on the specified port.
-     * @param debugPort The port to connect the debugger to
-     * @param launch The associated AndroidLaunch object.
-     * @param monitor A Progress monitor
-     * @return false if cancelled by the monitor
-     * @throws CoreException
-     */
-    @SuppressWarnings("deprecation")
-    public static boolean connectRemoteDebugger(int debugPort,
-            AndroidLaunch launch, IProgressMonitor monitor)
-                throws CoreException {
-        // get some default parameters.
-        int connectTimeout = JavaRuntime.getPreferences().getInt(JavaRuntime.PREF_CONNECT_TIMEOUT);
-
-        HashMap<String, String> newMap = new HashMap<String, String>();
-
-        newMap.put("hostname", "localhost");  //$NON-NLS-1$ //$NON-NLS-2$
-
-        newMap.put("port", Integer.toString(debugPort)); //$NON-NLS-1$
-
-        newMap.put("timeout", Integer.toString(connectTimeout));
-
-        // get the default VM connector
-        IVMConnector connector = JavaRuntime.getDefaultVMConnector();
-
-        // connect to remote VM
-        connector.connect(newMap, monitor, launch);
-
-        // check for cancellation
-        if (monitor.isCanceled()) {
-            IDebugTarget[] debugTargets = launch.getDebugTargets();
-            for (IDebugTarget target : debugTargets) {
-                if (target.canDisconnect()) {
-                    target.disconnect();
-                }
-            }
-            return false;
-        }
-
-        return true;
-    }
-
-    /**
-     * Launch a new thread that connects a remote debugger on the specified port.
-     * @param debugPort The port to connect the debugger to
-     * @param androidLaunch The associated AndroidLaunch object.
-     * @param monitor A Progress monitor
-     * @see #connectRemoteDebugger(int, AndroidLaunch, IProgressMonitor)
-     */
-    public static void launchRemoteDebugger(final int debugPort, final AndroidLaunch androidLaunch,
-            final IProgressMonitor monitor) {
-        new Thread("Debugger connection") { //$NON-NLS-1$
-            @Override
-            public void run() {
-                try {
-                    connectRemoteDebugger(debugPort, androidLaunch, monitor);
-                } catch (CoreException e) {
-                    androidLaunch.stopLaunch();
-                }
-                monitor.done();
-            }
-        }.start();
-    }
-
-    /**
-     * Sent when a new {@link AndroidDebugBridge} is started.
-     * <p/>
-     * This is sent from a non UI thread.
-     * @param bridge the new {@link AndroidDebugBridge} object.
-     *
-     * @see IDebugBridgeChangeListener#bridgeChanged(AndroidDebugBridge)
-     */
-    @Override
-    public void bridgeChanged(AndroidDebugBridge bridge) {
-        // The adb server has changed. We cancel any pending launches.
-        String message = "adb server change: cancelling '%1$s'!";
-        synchronized (sListLock) {
-            for (DelayedLaunchInfo launchInfo : mWaitingForReadyEmulatorList) {
-                AdtPlugin.printErrorToConsole(launchInfo.getProject(),
-                    String.format(message, launchInfo.getLaunchAction().getLaunchDescription()));
-                stopLaunch(launchInfo);
-            }
-            for (DelayedLaunchInfo launchInfo : mWaitingForDebuggerApplications) {
-                AdtPlugin.printErrorToConsole(launchInfo.getProject(),
-                        String.format(message,
-                                launchInfo.getLaunchAction().getLaunchDescription()));
-                stopLaunch(launchInfo);
-            }
-
-            mWaitingForReadyEmulatorList.clear();
-            mWaitingForDebuggerApplications.clear();
-        }
-    }
-
-    /**
-     * Sent when the a device is connected to the {@link AndroidDebugBridge}.
-     * <p/>
-     * This is sent from a non UI thread.
-     * @param device the new device.
-     *
-     * @see IDeviceChangeListener#deviceConnected(IDevice)
-     */
-    @Override
-    public void deviceConnected(IDevice device) {
-        synchronized (sListLock) {
-            // look if there's an app waiting for a device
-            if (mWaitingForEmulatorLaunches.size() > 0) {
-                // get/remove first launch item from the list
-                // FIXME: what if we have multiple launches waiting?
-                DelayedLaunchInfo launchInfo = mWaitingForEmulatorLaunches.get(0);
-                mWaitingForEmulatorLaunches.remove(0);
-
-                // give the launch item its device for later use.
-                launchInfo.setDevice(device);
-
-                // and move it to the other list
-                mWaitingForReadyEmulatorList.add(launchInfo);
-
-                // and tell the user about it
-                AdtPlugin.printToConsole(launchInfo.getProject(),
-                        String.format("New emulator found: %1$s", device.getSerialNumber()));
-                AdtPlugin.printToConsole(launchInfo.getProject(),
-                        String.format("Waiting for HOME ('%1$s') to be launched...",
-                            AdtPlugin.getDefault().getPreferenceStore().getString(
-                                    AdtPrefs.PREFS_HOME_PACKAGE)));
-            }
-        }
-    }
-
-    /**
-     * Sent when the a device is connected to the {@link AndroidDebugBridge}.
-     * <p/>
-     * This is sent from a non UI thread.
-     * @param device the new device.
-     *
-     * @see IDeviceChangeListener#deviceDisconnected(IDevice)
-     */
-    @Override
-    public void deviceDisconnected(IDevice device) {
-        // any pending launch on this device must be canceled.
-        String message = "%1$s disconnected! Cancelling '%2$s'!";
-        synchronized (sListLock) {
-            ArrayList<DelayedLaunchInfo> copyList =
-                (ArrayList<DelayedLaunchInfo>) mWaitingForReadyEmulatorList.clone();
-            for (DelayedLaunchInfo launchInfo : copyList) {
-                if (launchInfo.getDevice() == device) {
-                    AdtPlugin.printErrorToConsole(launchInfo.getProject(),
-                            String.format(message, device.getSerialNumber(),
-                                    launchInfo.getLaunchAction().getLaunchDescription()));
-                    stopLaunch(launchInfo);
-                }
-            }
-            copyList = (ArrayList<DelayedLaunchInfo>) mWaitingForDebuggerApplications.clone();
-            for (DelayedLaunchInfo launchInfo : copyList) {
-                if (launchInfo.getDevice() == device) {
-                    AdtPlugin.printErrorToConsole(launchInfo.getProject(),
-                            String.format(message, device.getSerialNumber(),
-                                    launchInfo.getLaunchAction().getLaunchDescription()));
-                    stopLaunch(launchInfo);
-                }
-            }
-        }
-    }
-
-    /**
-     * Sent when a device data changed, or when clients are started/terminated on the device.
-     * <p/>
-     * This is sent from a non UI thread.
-     * @param device the device that was updated.
-     * @param changeMask the mask indicating what changed.
-     *
-     * @see IDeviceChangeListener#deviceChanged(IDevice, int)
-     */
-    @Override
-    public void deviceChanged(IDevice device, int changeMask) {
-        // We could check if any starting device we care about is now ready, but we can wait for
-        // its home app to show up, so...
-    }
-
-    /**
-     * Sent when an existing client information changed.
-     * <p/>
-     * This is sent from a non UI thread.
-     * @param client the updated client.
-     * @param changeMask the bit mask describing the changed properties. It can contain
-     * any of the following values: {@link Client#CHANGE_INFO}, {@link Client#CHANGE_NAME}
-     * {@link Client#CHANGE_DEBUGGER_STATUS}, {@link Client#CHANGE_THREAD_MODE},
-     * {@link Client#CHANGE_THREAD_DATA}, {@link Client#CHANGE_HEAP_MODE},
-     * {@link Client#CHANGE_HEAP_DATA}, {@link Client#CHANGE_NATIVE_HEAP_DATA}
-     *
-     * @see IClientChangeListener#clientChanged(Client, int)
-     */
-    @Override
-    public void clientChanged(final Client client, int changeMask) {
-        boolean connectDebugger = false;
-        if ((changeMask & Client.CHANGE_NAME) == Client.CHANGE_NAME) {
-            String applicationName = client.getClientData().getClientDescription();
-            if (applicationName != null) {
-                IPreferenceStore store = AdtPlugin.getDefault().getPreferenceStore();
-                String home = store.getString(AdtPrefs.PREFS_HOME_PACKAGE);
-
-                if (home.equals(applicationName)) {
-
-                    // looks like home is up, get its device
-                    IDevice device = client.getDevice();
-
-                    // look for application waiting for home
-                    synchronized (sListLock) {
-                        for (int i = 0; i < mWaitingForReadyEmulatorList.size(); ) {
-                            DelayedLaunchInfo launchInfo = mWaitingForReadyEmulatorList.get(i);
-                            if (launchInfo.getDevice() == device) {
-                                // it's match, remove from the list
-                                mWaitingForReadyEmulatorList.remove(i);
-
-                                // We couldn't check earlier the API level of the device
-                                // (it's asynchronous when the device boot, and usually
-                                // deviceConnected is called before it's queried for its build info)
-                                // so we check now
-                                if (checkBuildInfo(launchInfo, device) == false) {
-                                    // device is not the proper API!
-                                    AdtPlugin.printErrorToConsole(launchInfo.getProject(),
-                                            "Launch canceled!");
-                                    stopLaunch(launchInfo);
-                                    return;
-                                }
-
-                                AdtPlugin.printToConsole(launchInfo.getProject(),
-                                        String.format("HOME is up on device '%1$s'",
-                                                device.getSerialNumber()));
-
-                                // attempt to sync the new package onto the device.
-                                if (syncApp(launchInfo, device)) {
-                                    // application package is sync'ed, lets attempt to launch it.
-                                    launchApp(launchInfo, device);
-                                } else {
-                                    // failure! Cancel and return
-                                    AdtPlugin.printErrorToConsole(launchInfo.getProject(),
-                                    "Launch canceled!");
-                                    stopLaunch(launchInfo);
-                                }
-
-                                break;
-                            } else {
-                                i++;
-                            }
-                        }
-                    }
-                }
-
-                // check if it's already waiting for a debugger, and if so we connect to it.
-                if (client.getClientData().getDebuggerConnectionStatus() == DebuggerStatus.WAITING) {
-                    // search for this client in the list;
-                    synchronized (sListLock) {
-                        int index = mUnknownClientsWaitingForDebugger.indexOf(client);
-                        if (index != -1) {
-                            connectDebugger = true;
-                            mUnknownClientsWaitingForDebugger.remove(client);
-                        }
-                    }
-                }
-            }
-        }
-
-        // if it's not home, it could be an app that is now in debugger mode that we're waiting for
-        // lets check it
-
-        if ((changeMask & Client.CHANGE_DEBUGGER_STATUS) == Client.CHANGE_DEBUGGER_STATUS) {
-            ClientData clientData = client.getClientData();
-            String applicationName = client.getClientData().getClientDescription();
-            if (clientData.getDebuggerConnectionStatus() == DebuggerStatus.WAITING) {
-                // Get the application name, and make sure its valid.
-                if (applicationName == null) {
-                    // looks like we don't have the client yet, so we keep it around for when its
-                    // name becomes available.
-                    synchronized (sListLock) {
-                        mUnknownClientsWaitingForDebugger.add(client);
-                    }
-                    return;
-                } else {
-                    connectDebugger = true;
-                }
-            }
-        }
-
-        if (connectDebugger) {
-            Log.d("adt", "Debugging " + client);
-            // now check it against the apps waiting for a debugger
-            String applicationName = client.getClientData().getClientDescription();
-            Log.d("adt", "App Name: " + applicationName);
-            synchronized (sListLock) {
-                for (int i = 0; i < mWaitingForDebuggerApplications.size(); ) {
-                    final DelayedLaunchInfo launchInfo = mWaitingForDebuggerApplications.get(i);
-                    if (client.getDevice() == launchInfo.getDevice() &&
-                            applicationName.equals(launchInfo.getDebugPackageName())) {
-                        // this is a match. We remove the launch info from the list
-                        mWaitingForDebuggerApplications.remove(i);
-
-                        // and connect the debugger.
-                        String msg = String.format(
-                                "Attempting to connect debugger to '%1$s' on port %2$d",
-                                launchInfo.getDebugPackageName(), client.getDebuggerListenPort());
-                        AdtPlugin.printToConsole(launchInfo.getProject(), msg);
-
-                        new Thread("Debugger Connection") { //$NON-NLS-1$
-                            @Override
-                            public void run() {
-                                try {
-                                    if (connectRemoteDebugger(
-                                            client.getDebuggerListenPort(),
-                                            launchInfo.getLaunch(),
-                                            launchInfo.getMonitor()) == false) {
-                                        return;
-                                    }
-                                } catch (CoreException e) {
-                                    // well something went wrong.
-                                    AdtPlugin.printErrorToConsole(launchInfo.getProject(),
-                                            String.format("Launch error: %s", e.getMessage()));
-                                    // stop the launch
-                                    stopLaunch(launchInfo);
-                                }
-
-                                launchInfo.getMonitor().done();
-                            }
-                        }.start();
-
-                        // we're done processing this client.
-                        return;
-
-                    } else {
-                        i++;
-                    }
-                }
-            }
-
-            // if we get here, we haven't found an app that we were launching, so we look
-            // for opened android projects that contains the app asking for a debugger.
-            // If we find one, we automatically connect to it.
-            IProject project = ProjectHelper.findAndroidProjectByAppName(applicationName);
-
-            if (project != null) {
-                debugRunningApp(project, client.getDebuggerListenPort());
-            }
-        }
-    }
-
-    /**
-     * Get the stderr/stdout outputs of a process and return when the process is done.
-     * Both <b>must</b> be read or the process will block on windows.
-     * @param process The process to get the output from
-     */
-    private void grabEmulatorOutput(final Process process) {
-        // read the lines as they come. if null is returned, it's
-        // because the process finished
-        new Thread("") { //$NON-NLS-1$
-            @Override
-            public void run() {
-                // create a buffer to read the stderr output
-                InputStreamReader is = new InputStreamReader(process.getErrorStream());
-                BufferedReader errReader = new BufferedReader(is);
-
-                try {
-                    while (true) {
-                        String line = errReader.readLine();
-                        if (line != null) {
-                            AdtPlugin.printErrorToConsole("Emulator", line);
-                        } else {
-                            break;
-                        }
-                    }
-                } catch (IOException e) {
-                    // do nothing.
-                }
-            }
-        }.start();
-
-        new Thread("") { //$NON-NLS-1$
-            @Override
-            public void run() {
-                InputStreamReader is = new InputStreamReader(process.getInputStream());
-                BufferedReader outReader = new BufferedReader(is);
-
-                try {
-                    while (true) {
-                        String line = outReader.readLine();
-                        if (line != null) {
-                            AdtPlugin.printToConsole("Emulator", line);
-                        } else {
-                            break;
-                        }
-                    }
-                } catch (IOException e) {
-                    // do nothing.
-                }
-            }
-        }.start();
-    }
-
-    /* (non-Javadoc)
-     * @see com.android.ide.eclipse.adt.launch.ILaunchController#stopLaunch(com.android.ide.eclipse.adt.launch.AndroidLaunchController.DelayedLaunchInfo)
-     */
-    @Override
-    public void stopLaunch(DelayedLaunchInfo launchInfo) {
-        launchInfo.getLaunch().stopLaunch();
-        synchronized (sListLock) {
-            mWaitingForReadyEmulatorList.remove(launchInfo);
-            mWaitingForDebuggerApplications.remove(launchInfo);
-        }
-    }
-
-    public static void updateLaunchConfigWithLastUsedDevice(
-            ILaunchConfiguration launchConfiguration, DeviceChooserResponse response) {
-        try {
-            boolean configModified = false;
-            boolean reuse = launchConfiguration.getAttribute(
-                    LaunchConfigDelegate.ATTR_REUSE_LAST_USED_DEVICE, false);
-            String serial = launchConfiguration.getAttribute(
-                    LaunchConfigDelegate.ATTR_LAST_USED_DEVICE, (String)null);
-
-            ILaunchConfigurationWorkingCopy wc = launchConfiguration.getWorkingCopy();
-            if (reuse != response.useDeviceForFutureLaunches()) {
-                reuse = response.useDeviceForFutureLaunches();
-                wc.setAttribute(LaunchConfigDelegate.ATTR_REUSE_LAST_USED_DEVICE, reuse);
-                configModified = true;
-            }
-
-            if (reuse) {
-                String selected = getSerial(response);
-                if (selected != null && !selected.equalsIgnoreCase(serial)) {
-                    wc.setAttribute(LaunchConfigDelegate.ATTR_LAST_USED_DEVICE, selected);
-                    configModified = true;
-                }
-            }
-
-            if (configModified) {
-                wc.doSave();
-            }
-        } catch (CoreException e) {
-            // in such a case, users just won't see this setting take effect
-            return;
-        }
-    }
-
-    private static String getSerial(DeviceChooserResponse response) {
-        AvdInfo avd = response.getAvdToLaunch();
-        return (avd != null) ? avd.getName() : response.getDeviceToUse().getSerialNumber();
-    }
-
-    @Nullable
-    public static IDevice getDeviceIfOnline(@Nullable String serial,
-            @NonNull IDevice[] onlineDevices) {
-        if (serial == null) {
-            return null;
-        }
-
-        for (IDevice device : onlineDevices) {
-            if (serial.equals(device.getAvdName()) ||
-                    serial.equals(device.getSerialNumber())) {
-                return device;
-            }
-        }
-
-        return null;
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/launch/AvdCompatibility.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/launch/AvdCompatibility.java
deleted file mode 100644
index 6133002..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/launch/AvdCompatibility.java
+++ /dev/null
@@ -1,58 +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.eclipse.adt.internal.launch;
-
-import com.android.sdklib.AndroidVersion;
-import com.android.sdklib.IAndroidTarget;
-import com.android.sdklib.internal.avd.AvdInfo;
-
-public class AvdCompatibility {
-    public enum Compatibility {
-        YES,
-        NO,
-        UNKNOWN,
-    };
-
-    /**
-     * Returns whether the specified AVD can run the given project that is built against
-     * a particular SDK and has the specified minApiLevel.
-     * @param avd AVD to check compatibility for
-     * @param projectTarget project build target
-     * @param minApiVersion project min api level
-     * @return whether the given AVD can run the given application
-     */
-    public static Compatibility canRun(AvdInfo avd, IAndroidTarget projectTarget,
-            AndroidVersion minApiVersion) {
-        if (avd == null) {
-            return Compatibility.UNKNOWN;
-        }
-
-        IAndroidTarget avdTarget = avd.getTarget();
-        if (avdTarget == null) {
-            return Compatibility.UNKNOWN;
-        }
-
-        // for platform targets, we only need to check the min api version
-        if (projectTarget.isPlatform()) {
-            return avdTarget.getVersion().canRun(minApiVersion) ?
-                    Compatibility.YES : Compatibility.NO;
-        }
-
-        // for add-on targets, delegate to the add on target to check for compatibility
-        return projectTarget.canRunOn(avdTarget) ? Compatibility.YES : Compatibility.NO;
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/launch/DelayedLaunchInfo.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/launch/DelayedLaunchInfo.java
deleted file mode 100644
index b0a6dda..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/launch/DelayedLaunchInfo.java
+++ /dev/null
@@ -1,244 +0,0 @@
-/*
- * Copyright (C) 2009 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.launch;
-
-import com.android.ddmlib.IDevice;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.IProgressMonitor;
-
-/**
- * A delayed launch waiting for a device to be present or ready before the
- * application is launched.
- */
-public final class DelayedLaunchInfo {
-
-    /**
-     * Used to indicate behavior when Android app already exists
-     */
-    enum InstallRetryMode {
-        NEVER, ALWAYS, PROMPT;
-    }
-
-    /** The device on which to launch the app */
-    private IDevice mDevice = null;
-
-    /** The eclipse project */
-    private final IProject mProject;
-
-    /** Package name */
-    private final String mPackageName;
-
-    /** Debug package name */
-    private final String mDebugPackageName;
-
-    /** IFile to the package (.apk) file */
-    private final IFile mPackageFile;
-
-    /** debuggable attribute of the manifest file. */
-    private final Boolean mDebuggable;
-
-    /** Required Api level by the app. null means no requirements */
-    private final String mRequiredApiVersionNumber;
-
-    private InstallRetryMode mRetryMode = InstallRetryMode.NEVER;
-
-    /** Launch action. */
-    private final IAndroidLaunchAction mLaunchAction;
-
-    /** the launch object */
-    private final AndroidLaunch mLaunch;
-
-    /** the monitor object */
-    private final IProgressMonitor mMonitor;
-
-    /** debug mode flag */
-    private boolean mDebugMode;
-
-    /** current number of launch attempts */
-    private int mAttemptCount = 0;
-
-    /** cancellation state of launch */
-    private boolean mCancelled = false;
-
-    /**
-     * Basic constructor with activity and package info.
-     *
-     * @param project the eclipse project that corresponds to Android app
-     * @param packageName package name of Android app
-     * @param debugPackageName the package name of the Andriod app to debug
-     * @param launchAction action to perform after app install
-     * @param pack IFile to the package (.apk) file
-     * @param debuggable the debuggable value of the app's manifest, or null if not set.
-     * @param requiredApiVersionNumber required SDK version by the app. null means no requirements.
-     * @param launch the launch object
-     * @param monitor progress monitor for launch
-     */
-    public DelayedLaunchInfo(IProject project, String packageName, String debugPackageName,
-            IAndroidLaunchAction launchAction, IFile pack, Boolean debuggable,
-            String requiredApiVersionNumber, AndroidLaunch launch, IProgressMonitor monitor) {
-        mProject = project;
-        mPackageName = packageName;
-        mDebugPackageName = debugPackageName;
-        mPackageFile = pack;
-        mLaunchAction = launchAction;
-        mLaunch = launch;
-        mMonitor = monitor;
-        mDebuggable = debuggable;
-        mRequiredApiVersionNumber = requiredApiVersionNumber;
-    }
-
-    /**
-     * @return the device on which to launch the app
-     */
-    public IDevice getDevice() {
-        return mDevice;
-    }
-
-    /**
-     * Set the device on which to launch the app
-     */
-    public void setDevice(IDevice device) {
-        mDevice = device;
-    }
-
-    /**
-     * @return the eclipse project that corresponds to Android app
-     */
-    public IProject getProject() {
-        return mProject;
-    }
-
-    /**
-     * @return the package name of the Android app
-     */
-    public String getPackageName() {
-        return mPackageName;
-    }
-
-    /**
-     * Returns the Android app process name that the debugger should connect to. Typically this is
-     * the same value as {@link #getPackageName()}.
-     */
-    public String getDebugPackageName() {
-        if (mDebugPackageName == null) {
-            return getPackageName();
-        }
-        return mDebugPackageName;
-    }
-
-    /**
-     * @return the application package file
-     */
-    public IFile getPackageFile() {
-        return mPackageFile;
-    }
-
-    /**
-     * Returns the value of the manifest debuggable attribute. If the attribute was not set,
-     * then the method returns null.
-     * @return the manifest debuggable attribute.
-     */
-    public Boolean getDebuggable() {
-        return mDebuggable;
-    }
-
-    /**
-     * @return the required api version number for the Android app.
-     */
-    public String getRequiredApiVersionNumber() {
-        return mRequiredApiVersionNumber;
-    }
-
-    /**
-     * @param retryMode the install retry mode to set
-     */
-    public void setRetryMode(InstallRetryMode retryMode) {
-        this.mRetryMode = retryMode;
-    }
-
-    /**
-     * @return the installation retry mode
-     */
-    public InstallRetryMode getRetryMode() {
-        return mRetryMode;
-    }
-
-    /**
-     * @return the launch action
-     */
-    public IAndroidLaunchAction getLaunchAction() {
-        return mLaunchAction;
-    }
-
-    /**
-     * @return the launch
-     */
-    public AndroidLaunch getLaunch() {
-        return mLaunch;
-    }
-
-    /**
-     * @return the launch progress monitor
-     */
-    public IProgressMonitor getMonitor() {
-        return mMonitor;
-    }
-
-    /**
-     * @param debugMode the debug mode to set
-     */
-    public void setDebugMode(boolean debugMode) {
-        this.mDebugMode = debugMode;
-    }
-
-    /**
-     * @return true if this is a debug launch
-     */
-    public boolean isDebugMode() {
-        return mDebugMode;
-    }
-
-    /**
-     * Increases the number of launch attempts
-     */
-    public void incrementAttemptCount() {
-        mAttemptCount++;
-    }
-
-    /**
-     * @return the number of launch attempts made
-     */
-    public int getAttemptCount() {
-        return mAttemptCount;
-    }
-
-    /**
-     * Set if launch has been cancelled
-     */
-    public void setCancelled(boolean cancelled) {
-        this.mCancelled = cancelled;
-    }
-
-    /**
-     * @return true if launch has been cancelled
-     */
-    public boolean isCancelled() {
-        return mCancelled;
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/launch/DeviceChooserDialog.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/launch/DeviceChooserDialog.java
deleted file mode 100644
index 995ccdf..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/launch/DeviceChooserDialog.java
+++ /dev/null
@@ -1,824 +0,0 @@
-/*
- * Copyright (C) 2007 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.launch;
-
-import com.android.ddmlib.AndroidDebugBridge;
-import com.android.ddmlib.AndroidDebugBridge.IDeviceChangeListener;
-import com.android.ddmlib.Client;
-import com.android.ddmlib.IDevice;
-import com.android.ddmlib.IDevice.DeviceState;
-import com.android.ddmuilib.ImageLoader;
-import com.android.ddmuilib.TableHelper;
-import com.android.ide.eclipse.adt.internal.editors.IconFactory;
-import com.android.ide.eclipse.adt.internal.sdk.AdtConsoleSdkLog;
-import com.android.ide.eclipse.adt.internal.sdk.Sdk;
-import com.android.ide.eclipse.ddms.DdmsPlugin;
-import com.android.sdklib.AndroidVersion;
-import com.android.sdklib.IAndroidTarget;
-import com.android.sdklib.internal.avd.AvdInfo;
-import com.android.sdkuilib.internal.widgets.AvdSelector;
-import com.android.sdkuilib.internal.widgets.AvdSelector.DisplayMode;
-import com.android.sdkuilib.internal.widgets.AvdSelector.IAvdFilter;
-
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.jface.viewers.ILabelProviderListener;
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-import org.eclipse.jface.viewers.ITableLabelProvider;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.SWTException;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Table;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * A dialog that lets the user choose a device to deploy an application.
- * The user can either choose an exiting running device (including running emulators)
- * or start a new emulator using an Android Virtual Device configuration that matches
- * the current project.
- */
-public class DeviceChooserDialog extends Dialog implements IDeviceChangeListener {
-
-    private final static int ICON_WIDTH = 16;
-
-    private Table mDeviceTable;
-    private TableViewer mViewer;
-    private AvdSelector mPreferredAvdSelector;
-
-    private Image mDeviceImage;
-    private Image mEmulatorImage;
-    private Image mMatchImage;
-    private Image mNoMatchImage;
-    private Image mWarningImage;
-
-    private final DeviceChooserResponse mResponse;
-    private final String mPackageName;
-    private final IAndroidTarget mProjectTarget;
-    private final AndroidVersion mMinApiVersion;
-    private final Sdk mSdk;
-
-    private Button mDeviceRadioButton;
-    private Button mUseDeviceForFutureLaunchesCheckbox;
-    private boolean mUseDeviceForFutureLaunches;
-
-    private boolean mDisableAvdSelectionChange = false;
-
-    /**
-     * Basic Content Provider for a table full of {@link IDevice} objects. The input is
-     * a {@link AndroidDebugBridge}.
-     */
-    private class ContentProvider implements IStructuredContentProvider {
-        @Override
-        public Object[] getElements(Object inputElement) {
-            if (inputElement instanceof AndroidDebugBridge) {
-                return findCompatibleDevices(((AndroidDebugBridge)inputElement).getDevices());
-            }
-
-            return new Object[0];
-        }
-
-        private Object[] findCompatibleDevices(IDevice[] devices) {
-            if (devices == null) {
-                return null;
-            }
-
-            List<IDevice> compatibleDevices = new ArrayList<IDevice>(devices.length);
-            for (IDevice device : devices) {
-                AndroidVersion deviceVersion = Sdk.getDeviceVersion(device);
-                if (deviceVersion == null || deviceVersion.canRun(mMinApiVersion)) {
-                    compatibleDevices.add(device);
-                }
-            }
-
-            return compatibleDevices.toArray();
-        }
-
-        @Override
-        public void dispose() {
-            // pass
-        }
-
-        @Override
-        public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-            // pass
-        }
-    }
-
-    /**
-     * A Label Provider for the {@link TableViewer} in {@link DeviceChooserDialog}.
-     * It provides labels and images for {@link IDevice} objects.
-     */
-    private class LabelProvider implements ITableLabelProvider {
-
-        @Override
-        public Image getColumnImage(Object element, int columnIndex) {
-            if (element instanceof IDevice) {
-                IDevice device = (IDevice)element;
-                switch (columnIndex) {
-                    case 0:
-                        return device.isEmulator() ? mEmulatorImage : mDeviceImage;
-
-                    case 2:
-                        // check for compatibility.
-                        if (device.isEmulator() == false) { // physical device
-                            // get the version of the device
-                            AndroidVersion deviceVersion = Sdk.getDeviceVersion(device);
-                            if (deviceVersion == null) {
-                                return mWarningImage;
-                            } else {
-                                if (!deviceVersion.canRun(mMinApiVersion)) {
-                                    return mNoMatchImage;
-                                }
-
-                                // if the project is compiling against an add-on,
-                                // the optional API may be missing from the device.
-                                return mProjectTarget.isPlatform() ?
-                                        mMatchImage : mWarningImage;
-                            }
-                        } else {
-                            // get the AvdInfo
-                            AvdInfo info = mSdk.getAvdManager().getAvd(device.getAvdName(),
-                                    true /*validAvdOnly*/);
-                            AvdCompatibility.Compatibility c =
-                                    AvdCompatibility.canRun(info, mProjectTarget,
-                                            mMinApiVersion);
-                            switch (c) {
-                                case YES:
-                                    return mMatchImage;
-                                case NO:
-                                    return mNoMatchImage;
-                                case UNKNOWN:
-                                    return mWarningImage;
-                            }
-                        }
-                }
-            }
-
-            return null;
-        }
-
-        @Override
-        public String getColumnText(Object element, int columnIndex) {
-            if (element instanceof IDevice) {
-                IDevice device = (IDevice)element;
-                switch (columnIndex) {
-                    case 0:
-                        return device.getName();
-                    case 1:
-                        if (device.isEmulator()) {
-                            return device.getAvdName();
-                        } else {
-                            return "N/A"; // devices don't have AVD names.
-                        }
-                    case 2:
-                        if (device.isEmulator()) {
-                            AvdInfo info = mSdk.getAvdManager().getAvd(device.getAvdName(),
-                                    true /*validAvdOnly*/);
-                            if (info == null) {
-                                return "?";
-                            }
-                            return info.getTarget().getFullName();
-                        } else {
-                            String deviceBuild = device.getProperty(IDevice.PROP_BUILD_VERSION);
-                            if (deviceBuild == null) {
-                                return "unknown";
-                            }
-                            return deviceBuild;
-                        }
-                    case 3:
-                        String debuggable = device.getProperty(IDevice.PROP_DEBUGGABLE);
-                        if (debuggable != null && debuggable.equals("1")) { //$NON-NLS-1$
-                            return "Yes";
-                        } else {
-                            return "";
-                        }
-                    case 4:
-                        return getStateString(device);
-                }
-            }
-
-            return null;
-        }
-
-        @Override
-        public void addListener(ILabelProviderListener listener) {
-            // pass
-        }
-
-        @Override
-        public void dispose() {
-            // pass
-        }
-
-        @Override
-        public boolean isLabelProperty(Object element, String property) {
-            // pass
-            return false;
-        }
-
-        @Override
-        public void removeListener(ILabelProviderListener listener) {
-            // pass
-        }
-    }
-
-    public static class DeviceChooserResponse {
-        private AvdInfo mAvdToLaunch;
-        private IDevice mDeviceToUse;
-        private boolean mUseDeviceForFutureLaunches;
-
-        public void setDeviceToUse(IDevice d) {
-            mDeviceToUse = d;
-            mAvdToLaunch = null;
-        }
-
-        public void setAvdToLaunch(AvdInfo avd) {
-            mAvdToLaunch = avd;
-            mDeviceToUse = null;
-        }
-
-        public IDevice getDeviceToUse() {
-            return mDeviceToUse;
-        }
-
-        public AvdInfo getAvdToLaunch() {
-            return mAvdToLaunch;
-        }
-
-        public void setUseDeviceForFutureLaunches(boolean en) {
-            mUseDeviceForFutureLaunches = en;
-        }
-
-        public boolean useDeviceForFutureLaunches() {
-            return mUseDeviceForFutureLaunches;
-        }
-    }
-
-    public DeviceChooserDialog(Shell parent, DeviceChooserResponse response, String packageName,
-            IAndroidTarget projectTarget, AndroidVersion minApiVersion,
-            boolean useDeviceForFutureLaunches) {
-        super(parent);
-
-        mResponse = response;
-        mPackageName = packageName;
-        mProjectTarget = projectTarget;
-        mMinApiVersion = minApiVersion;
-        mSdk = Sdk.getCurrent();
-        mUseDeviceForFutureLaunches = useDeviceForFutureLaunches;
-
-        AndroidDebugBridge.addDeviceChangeListener(this);
-        loadImages();
-    }
-
-    private void cleanup() {
-        // done listening.
-        AndroidDebugBridge.removeDeviceChangeListener(this);
-    }
-
-    @Override
-    protected void okPressed() {
-        cleanup();
-        super.okPressed();
-    }
-
-    @Override
-    protected void cancelPressed() {
-        cleanup();
-        super.cancelPressed();
-    }
-
-    @Override
-    protected Control createContents(Composite parent) {
-        Control content = super.createContents(parent);
-
-        // this must be called after createContents() has happened so that the
-        // ok button has been created (it's created after the call to createDialogArea)
-        updateDefaultSelection();
-
-        return content;
-    }
-
-    /**
-     * Create the button bar: We override the Dialog implementation of this method
-     * so that we can create the checkbox at the same level as the 'Cancel' and 'OK' buttons.
-     */
-    @Override
-    protected Control createButtonBar(Composite parent) {
-        Composite composite = new Composite(parent, SWT.NONE);
-
-        GridLayout layout = new GridLayout(1, false);
-        layout.marginHeight = convertVerticalDLUsToPixels(IDialogConstants.VERTICAL_MARGIN);
-        composite.setLayout(layout);
-        composite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-
-        mUseDeviceForFutureLaunchesCheckbox = new Button(composite, SWT.CHECK);
-        mUseDeviceForFutureLaunchesCheckbox.setSelection(mUseDeviceForFutureLaunches);
-        mResponse.setUseDeviceForFutureLaunches(mUseDeviceForFutureLaunches);
-        mUseDeviceForFutureLaunchesCheckbox.setText("Use same device for future launches");
-        mUseDeviceForFutureLaunchesCheckbox.addSelectionListener(new SelectionAdapter() {
-            @Override
-            public void widgetSelected(SelectionEvent e) {
-                mUseDeviceForFutureLaunches =
-                        mUseDeviceForFutureLaunchesCheckbox.getSelection();
-                mResponse.setUseDeviceForFutureLaunches(mUseDeviceForFutureLaunches);
-            }
-        });
-        mUseDeviceForFutureLaunchesCheckbox.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-
-        createButton(composite, IDialogConstants.OK_ID, IDialogConstants.OK_LABEL, true);
-        createButton(composite, IDialogConstants.CANCEL_ID, IDialogConstants.CANCEL_LABEL, false);
-
-        return composite;
-    }
-
-    @Override
-    protected Control createDialogArea(Composite parent) {
-        // set dialog title
-        getShell().setText("Android Device Chooser");
-
-        Composite top = new Composite(parent, SWT.NONE);
-        top.setLayout(new GridLayout(1, true));
-
-        String msg;
-        if (mProjectTarget.isPlatform()) {
-            msg = String.format("Select a device with min API level %s.",
-                    mMinApiVersion.getApiString());
-        } else {
-            msg = String.format("Select a device compatible with target %s.",
-                    mProjectTarget.getFullName());
-        }
-        Label label = new Label(top, SWT.NONE);
-        label.setText(msg);
-
-        mDeviceRadioButton = new Button(top, SWT.RADIO);
-        mDeviceRadioButton.setText("Choose a running Android device");
-        mDeviceRadioButton.addSelectionListener(new SelectionAdapter() {
-            @Override
-            public void widgetSelected(SelectionEvent e) {
-                boolean deviceMode = mDeviceRadioButton.getSelection();
-
-                mDeviceTable.setEnabled(deviceMode);
-                mPreferredAvdSelector.setEnabled(!deviceMode);
-
-                if (deviceMode) {
-                    handleDeviceSelection();
-                } else {
-                    mResponse.setAvdToLaunch(mPreferredAvdSelector.getSelected());
-                }
-
-                enableOkButton();
-            }
-        });
-        mDeviceRadioButton.setSelection(true);
-
-
-        // offset the selector from the radio button
-        Composite offsetComp = new Composite(top, SWT.NONE);
-        offsetComp.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-        GridLayout layout = new GridLayout(1, false);
-        layout.marginRight = layout.marginHeight = 0;
-        layout.marginLeft = 30;
-        offsetComp.setLayout(layout);
-
-        mDeviceTable = new Table(offsetComp, SWT.SINGLE | SWT.FULL_SELECTION | SWT.BORDER);
-        GridData gd;
-        mDeviceTable.setLayoutData(gd = new GridData(GridData.FILL_BOTH));
-        gd.heightHint = 100;
-
-        mDeviceTable.setHeaderVisible(true);
-        mDeviceTable.setLinesVisible(true);
-
-        TableHelper.createTableColumn(mDeviceTable, "Serial Number",
-                SWT.LEFT, "AAA+AAAAAAAAAAAAAAAAAAA", //$NON-NLS-1$
-                null /* prefs name */, null /* prefs store */);
-
-        TableHelper.createTableColumn(mDeviceTable, "AVD Name",
-                SWT.LEFT, "AAAAAAAAAAAAAAAAAAA", //$NON-NLS-1$
-                null /* prefs name */, null /* prefs store */);
-
-        TableHelper.createTableColumn(mDeviceTable, "Target",
-                SWT.LEFT, "AAA+Android 9.9.9", //$NON-NLS-1$
-                null /* prefs name */, null /* prefs store */);
-
-        TableHelper.createTableColumn(mDeviceTable, "Debug",
-                SWT.LEFT, "Debug", //$NON-NLS-1$
-                null /* prefs name */, null /* prefs store */);
-
-        TableHelper.createTableColumn(mDeviceTable, "State",
-                SWT.LEFT, "bootloader", //$NON-NLS-1$
-                null /* prefs name */, null /* prefs store */);
-
-        // create the viewer for it
-        mViewer = new TableViewer(mDeviceTable);
-        mViewer.setContentProvider(new ContentProvider());
-        mViewer.setLabelProvider(new LabelProvider());
-        mViewer.setInput(AndroidDebugBridge.getBridge());
-
-        mDeviceTable.addSelectionListener(new SelectionAdapter() {
-            /**
-             * Handles single-click selection on the device selector.
-             * {@inheritDoc}
-             */
-            @Override
-            public void widgetSelected(SelectionEvent e) {
-                handleDeviceSelection();
-            }
-
-            /**
-             * Handles double-click selection on the device selector.
-             * Note that the single-click handler will probably already have been called.
-             * {@inheritDoc}
-             */
-            @Override
-            public void widgetDefaultSelected(SelectionEvent e) {
-                handleDeviceSelection();
-                if (isOkButtonEnabled()) {
-                    okPressed();
-                }
-            }
-        });
-
-        Button radio2 = new Button(top, SWT.RADIO);
-        radio2.setText("Launch a new Android Virtual Device");
-
-        // offset the selector from the radio button
-        offsetComp = new Composite(top, SWT.NONE);
-        offsetComp.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-        layout = new GridLayout(1, false);
-        layout.marginRight = layout.marginHeight = 0;
-        layout.marginLeft = 30;
-        offsetComp.setLayout(layout);
-
-        mPreferredAvdSelector = new AvdSelector(offsetComp,
-                mSdk.getSdkOsLocation(),
-                mSdk.getAvdManager(),
-                new NonRunningAvdFilter(),
-                DisplayMode.SIMPLE_SELECTION,
-                new AdtConsoleSdkLog());
-        mPreferredAvdSelector.setTableHeightHint(100);
-        mPreferredAvdSelector.setEnabled(false);
-        mPreferredAvdSelector.setSelectionListener(new SelectionAdapter() {
-            /**
-             * Handles single-click selection on the AVD selector.
-             * {@inheritDoc}
-             */
-            @Override
-            public void widgetSelected(SelectionEvent e) {
-                if (mDisableAvdSelectionChange == false) {
-                    mResponse.setAvdToLaunch(mPreferredAvdSelector.getSelected());
-                    enableOkButton();
-                }
-            }
-
-            /**
-             * Handles double-click selection on the AVD selector.
-             *
-             * Note that the single-click handler will probably already have been called
-             * but the selected item can have changed in between.
-             *
-             * {@inheritDoc}
-             */
-            @Override
-            public void widgetDefaultSelected(SelectionEvent e) {
-                widgetSelected(e);
-                if (isOkButtonEnabled()) {
-                    okPressed();
-                }
-            }
-        });
-
-        return top;
-    }
-
-    private void loadImages() {
-        ImageLoader ddmUiLibLoader = ImageLoader.getDdmUiLibLoader();
-        Display display = DdmsPlugin.getDisplay();
-        IconFactory factory = IconFactory.getInstance();
-
-        if (mDeviceImage == null) {
-            mDeviceImage = ddmUiLibLoader.loadImage(display,
-                    "device.png", //$NON-NLS-1$
-                    ICON_WIDTH, ICON_WIDTH,
-                    display.getSystemColor(SWT.COLOR_RED));
-        }
-        if (mEmulatorImage == null) {
-            mEmulatorImage = ddmUiLibLoader.loadImage(display,
-                    "emulator.png", ICON_WIDTH, ICON_WIDTH, //$NON-NLS-1$
-                    display.getSystemColor(SWT.COLOR_BLUE));
-        }
-
-        if (mMatchImage == null) {
-            mMatchImage = factory.getIcon("match", //$NON-NLS-1$
-                    IconFactory.COLOR_GREEN,
-                    IconFactory.SHAPE_DEFAULT);
-        }
-
-        if (mNoMatchImage == null) {
-            mNoMatchImage = factory.getIcon("error", //$NON-NLS-1$
-                    IconFactory.COLOR_RED,
-                    IconFactory.SHAPE_DEFAULT);
-        }
-
-        if (mWarningImage == null) {
-            mWarningImage = factory.getIcon("warning", //$NON-NLS-1$
-                    SWT.COLOR_YELLOW,
-                    IconFactory.SHAPE_DEFAULT);
-        }
-
-    }
-
-    /**
-     * Returns a display string representing the state of the device.
-     * @param d the device
-     */
-    private static String getStateString(IDevice d) {
-        DeviceState deviceState = d.getState();
-        if (deviceState == DeviceState.ONLINE) {
-            return "Online";
-        } else if (deviceState == DeviceState.OFFLINE) {
-            return "Offline";
-        } else if (deviceState == DeviceState.BOOTLOADER) {
-            return "Bootloader";
-        }
-
-        return "??";
-    }
-
-    /**
-     * Sent when the a device is connected to the {@link AndroidDebugBridge}.
-     * <p/>
-     * This is sent from a non UI thread.
-     * @param device the new device.
-     *
-     * @see IDeviceChangeListener#deviceConnected(IDevice)
-     */
-    @Override
-    public void deviceConnected(IDevice device) {
-        final DeviceChooserDialog dialog = this;
-        exec(new Runnable() {
-            @Override
-            public void run() {
-                if (mDeviceTable.isDisposed() == false) {
-                    // refresh all
-                    mViewer.refresh();
-
-                    // update the selection
-                    updateDefaultSelection();
-
-                    // update the display of AvdInfo (since it's filtered to only display
-                    // non running AVD.)
-                    refillAvdList(false /*reloadAvds*/);
-                } else {
-                    // table is disposed, we need to do something.
-                    // lets remove ourselves from the listener.
-                    AndroidDebugBridge.removeDeviceChangeListener(dialog);
-                }
-
-            }
-        });
-    }
-
-    /**
-     * Sent when the a device is connected to the {@link AndroidDebugBridge}.
-     * <p/>
-     * This is sent from a non UI thread.
-     * @param device the new device.
-     *
-     * @see IDeviceChangeListener#deviceDisconnected(IDevice)
-     */
-    @Override
-    public void deviceDisconnected(IDevice device) {
-        deviceConnected(device);
-    }
-
-    /**
-     * Sent when a device data changed, or when clients are started/terminated on the device.
-     * <p/>
-     * This is sent from a non UI thread.
-     * @param device the device that was updated.
-     * @param changeMask the mask indicating what changed.
-     *
-     * @see IDeviceChangeListener#deviceChanged(IDevice, int)
-     */
-    @Override
-    public void deviceChanged(final IDevice device, int changeMask) {
-        if ((changeMask & (IDevice.CHANGE_STATE | IDevice.CHANGE_BUILD_INFO)) != 0) {
-            final DeviceChooserDialog dialog = this;
-            exec(new Runnable() {
-                @Override
-                public void run() {
-                    if (mDeviceTable.isDisposed() == false) {
-                        // refresh the device
-                        mViewer.refresh(device);
-
-                        // update the defaultSelection.
-                        updateDefaultSelection();
-
-                        // update the display of AvdInfo (since it's filtered to only display
-                        // non running AVD). This is done on deviceChanged because the avd name
-                        // of a (emulator) device may be updated as the emulator boots.
-
-                        refillAvdList(false /*reloadAvds*/);
-
-                        // if the changed device is the current selection,
-                        // we update the OK button based on its state.
-                        if (device == mResponse.getDeviceToUse()) {
-                            enableOkButton();
-                        }
-
-                    } else {
-                        // table is disposed, we need to do something.
-                        // lets remove ourselves from the listener.
-                        AndroidDebugBridge.removeDeviceChangeListener(dialog);
-                    }
-                }
-            });
-        }
-    }
-
-    /**
-     * Returns whether the dialog is in "device" mode (true), or in "avd" mode (false).
-     */
-    private boolean isDeviceMode() {
-        return mDeviceRadioButton.getSelection();
-    }
-
-    /**
-     * Enables or disables the OK button of the dialog based on various selections in the dialog.
-     */
-    private void enableOkButton() {
-        Button okButton = getButton(IDialogConstants.OK_ID);
-
-        if (isDeviceMode()) {
-            okButton.setEnabled(mResponse.getDeviceToUse() != null &&
-                    mResponse.getDeviceToUse().isOnline());
-        } else {
-            okButton.setEnabled(mResponse.getAvdToLaunch() != null);
-        }
-    }
-
-    /**
-     * Returns true if the ok button is enabled.
-     */
-    private boolean isOkButtonEnabled() {
-        Button okButton = getButton(IDialogConstants.OK_ID);
-        return okButton.isEnabled();
-    }
-
-    /**
-     * Executes the {@link Runnable} in the UI thread.
-     * @param runnable the runnable to execute.
-     */
-    private void exec(Runnable runnable) {
-        try {
-            Display display = mDeviceTable.getDisplay();
-            display.asyncExec(runnable);
-        } catch (SWTException e) {
-            // tree is disposed, we need to do something. lets remove ourselves from the listener.
-            AndroidDebugBridge.removeDeviceChangeListener(this);
-        }
-    }
-
-    private void handleDeviceSelection() {
-        int count = mDeviceTable.getSelectionCount();
-        if (count != 1) {
-            handleSelection(null);
-        } else {
-            int index = mDeviceTable.getSelectionIndex();
-            Object data = mViewer.getElementAt(index);
-            if (data instanceof IDevice) {
-                handleSelection((IDevice)data);
-            } else {
-                handleSelection(null);
-            }
-        }
-    }
-
-    private void handleSelection(IDevice device) {
-        mResponse.setDeviceToUse(device);
-        enableOkButton();
-    }
-
-    /**
-     * Look for a default device to select. This is done by looking for the running
-     * clients on each device and finding one similar to the one being launched.
-     * <p/>
-     * This is done every time the device list changed unless there is a already selection.
-     */
-    private void updateDefaultSelection() {
-        if (mDeviceTable.getSelectionCount() == 0) {
-            AndroidDebugBridge bridge = AndroidDebugBridge.getBridge();
-
-            IDevice[] devices = bridge.getDevices();
-
-            for (IDevice device : devices) {
-                Client[] clients = device.getClients();
-
-                for (Client client : clients) {
-
-                    if (mPackageName.equals(client.getClientData().getClientDescription())) {
-                        // found a match! Select it.
-                        mViewer.setSelection(new StructuredSelection(device));
-                        handleSelection(device);
-
-                        // and we're done.
-                        return;
-                    }
-                }
-            }
-        }
-
-        handleDeviceSelection();
-    }
-
-    private final class NonRunningAvdFilter implements IAvdFilter {
-
-        private IDevice[] mDevices;
-
-        @Override
-        public void prepare() {
-            mDevices = AndroidDebugBridge.getBridge().getDevices();
-        }
-
-        @Override
-        public boolean accept(AvdInfo avd) {
-            if (mDevices != null) {
-                for (IDevice d : mDevices) {
-                    // do not accept running avd's
-                    if (avd.getName().equals(d.getAvdName())) {
-                        return false;
-                    }
-
-                    // only accept avd's that can actually run the project
-                    AvdCompatibility.Compatibility c =
-                            AvdCompatibility.canRun(avd, mProjectTarget, mMinApiVersion);
-                    return (c == AvdCompatibility.Compatibility.NO) ? false : true;
-                }
-            }
-
-            return true;
-        }
-
-        @Override
-        public void cleanup() {
-            mDevices = null;
-        }
-    }
-
-    /**
-     * Refills the AVD list keeping the current selection.
-     */
-    private void refillAvdList(boolean reloadAvds) {
-        // save the current selection
-        AvdInfo selected = mPreferredAvdSelector.getSelected();
-
-        // disable selection change.
-        mDisableAvdSelectionChange = true;
-
-        // refresh the list
-        mPreferredAvdSelector.refresh(false);
-
-        // attempt to reselect the proper avd if needed
-        if (selected != null) {
-            if (mPreferredAvdSelector.setSelection(selected) == false) {
-                // looks like the selection is lost. this can happen if an emulator
-                // running the AVD that was selected was launched from outside of Eclipse).
-                mResponse.setAvdToLaunch(null);
-                enableOkButton();
-            }
-        }
-
-        // enable the selection change
-        mDisableAvdSelectionChange = false;
-    }
-}
-
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/launch/EmptyLaunchAction.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/launch/EmptyLaunchAction.java
deleted file mode 100644
index a8bb414..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/launch/EmptyLaunchAction.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Copyright (C) 2009 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.launch;
-
-import com.android.ddmlib.IDevice;
-import com.android.ide.eclipse.adt.AdtPlugin;
-
-import java.util.Collection;
-
-/**
- * A launch action that does nothing after the application has been installed
- */
-public class EmptyLaunchAction implements IAndroidLaunchAction {
-    @Override
-    public boolean doLaunchAction(DelayedLaunchInfo info, Collection<IDevice> devices) {
-        for (IDevice d : devices) {
-            doLaunchAction(info, d);
-        }
-
-        return false;
-    }
-
-    public boolean doLaunchAction(DelayedLaunchInfo info, IDevice device) {
-        // we're not supposed to do anything, just return;
-        String msg = String.format("%1$s installed on device",
-                info.getPackageFile().getFullPath().toOSString());
-        AdtPlugin.printToConsole(info.getProject(), msg, "Done!");
-        // return false so launch controller will not wait for debugger to attach
-        return false;
-    }
-
-    @Override
-    public String getLaunchDescription() {
-        return "sync";
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/launch/EmulatorConfigTab.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/launch/EmulatorConfigTab.java
deleted file mode 100644
index 779dfa1..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/launch/EmulatorConfigTab.java
+++ /dev/null
@@ -1,596 +0,0 @@
-/*
- * Copyright (C) 2007 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.launch;
-
-import com.android.ddmuilib.ImageLoader;
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.ide.eclipse.adt.internal.editors.manifest.ManifestInfo;
-import com.android.ide.eclipse.adt.internal.launch.AndroidLaunchConfiguration.TargetMode;
-import com.android.ide.eclipse.adt.internal.launch.AvdCompatibility.Compatibility;
-import com.android.ide.eclipse.adt.internal.preferences.AdtPrefs;
-import com.android.ide.eclipse.adt.internal.project.BaseProjectHelper;
-import com.android.ide.eclipse.adt.internal.sdk.AdtConsoleSdkLog;
-import com.android.ide.eclipse.adt.internal.sdk.Sdk;
-import com.android.prefs.AndroidLocation.AndroidLocationException;
-import com.android.sdklib.AndroidVersion;
-import com.android.sdklib.IAndroidTarget;
-import com.android.sdklib.internal.avd.AvdInfo;
-import com.android.sdklib.internal.avd.AvdManager;
-import com.android.sdkuilib.internal.widgets.AvdSelector;
-import com.android.sdkuilib.internal.widgets.AvdSelector.DisplayMode;
-import com.android.sdkuilib.internal.widgets.AvdSelector.IAvdFilter;
-import com.android.utils.NullLogger;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.debug.core.ILaunchConfiguration;
-import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
-import org.eclipse.debug.ui.AbstractLaunchConfigurationTab;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.launching.IJavaLaunchConfigurationConstants;
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Combo;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Group;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Text;
-
-/**
- * Launch configuration tab to control the parameters of the Emulator
- */
-public class EmulatorConfigTab extends AbstractLaunchConfigurationTab {
-
-    private final static String[][] NETWORK_SPEEDS = new String[][] {
-        { "Full", "full" }, //$NON-NLS-2$
-        { "GSM", "gsm" }, //$NON-NLS-2$
-        { "HSCSD", "hscsd" }, //$NON-NLS-2$
-        { "GPRS", "gprs" }, //$NON-NLS-2$
-        { "EDGE", "edge" }, //$NON-NLS-2$
-        { "UMTS", "umts" }, //$NON-NLS-2$
-        { "HSPDA", "hsdpa" }, //$NON-NLS-2$
-    };
-
-    private final static String[][] NETWORK_LATENCIES = new String[][] {
-        { "None", "none" }, //$NON-NLS-2$
-        { "GPRS", "gprs" }, //$NON-NLS-2$
-        { "EDGE", "edge" }, //$NON-NLS-2$
-        { "UMTS", "umts" }, //$NON-NLS-2$
-    };
-
-    private Button mAutoTargetButton;
-    private Button mManualTargetButton;
-    private AvdSelector mPreferredAvdSelector;
-    private Combo mSpeedCombo;
-    private Combo mDelayCombo;
-    private Group mEmulatorOptionsGroup;
-    private Text mEmulatorCLOptions;
-    private Button mWipeDataButton;
-    private Button mNoBootAnimButton;
-    private Label mPreferredAvdLabel;
-    private IAndroidTarget mProjectTarget;
-    private AndroidVersion mProjectMinApiVersion;
-    private Button mFutureLaunchesOnSameDevice;
-    private boolean mSupportMultiDeviceLaunch;
-    private Button mAllDevicesTargetButton;
-    private Combo mDeviceTypeCombo;
-
-    private static final String DEVICES_AND_EMULATORS = "Active devices and AVD's";
-    private static final String EMULATORS_ONLY = "Active AVD's";
-    private static final String DEVICES_ONLY = "Active devices";
-
-    /**
-     * Returns the emulator ready speed option value.
-     * @param value The index of the combo selection.
-     */
-    public static String getSpeed(int value) {
-        try {
-            return NETWORK_SPEEDS[value][1];
-        } catch (ArrayIndexOutOfBoundsException e) {
-            return NETWORK_SPEEDS[LaunchConfigDelegate.DEFAULT_SPEED][1];
-        }
-    }
-
-    /**
-     * Returns the emulator ready network latency value.
-     * @param value The index of the combo selection.
-     */
-    public static String getDelay(int value) {
-        try {
-            return NETWORK_LATENCIES[value][1];
-        } catch (ArrayIndexOutOfBoundsException e) {
-            return NETWORK_LATENCIES[LaunchConfigDelegate.DEFAULT_DELAY][1];
-        }
-    }
-
-    /**
-     *
-     */
-    public EmulatorConfigTab(boolean supportMultiDeviceLaunch) {
-        mSupportMultiDeviceLaunch = supportMultiDeviceLaunch;
-    }
-
-    /**
-     * @wbp.parser.entryPoint
-     */
-    @Override
-    public void createControl(Composite parent) {
-        Font font = parent.getFont();
-
-        // Reload the AVDs to make sure we are up to date
-        try {
-            // SDK can be null if the user opens the dialog before ADT finished
-            // initializing the SDK itself. In this case just don't reload anything
-            // so there's nothing obsolete yet.
-            Sdk sdk = Sdk.getCurrent();
-            if (sdk != null) {
-                AvdManager avdMan = sdk.getAvdManager();
-                assert avdMan != null;
-                avdMan.reloadAvds(NullLogger.getLogger());
-            }
-        } catch (AndroidLocationException e1) {
-            // this happens if the AVD Manager failed to find the folder in which the AVDs are
-            // stored. There isn't much we can do at this point.
-        }
-
-        Composite topComp = new Composite(parent, SWT.NONE);
-        setControl(topComp);
-        GridLayout topLayout = new GridLayout();
-        topLayout.numColumns = 1;
-        topLayout.verticalSpacing = 0;
-        topComp.setLayout(topLayout);
-        topComp.setFont(font);
-
-        GridData gd;
-        GridLayout layout;
-
-        // radio button for the target mode
-        Group targetModeGroup = new Group(topComp, SWT.NONE);
-        targetModeGroup.setText("Deployment Target Selection Mode");
-        gd = new GridData(GridData.FILL_HORIZONTAL);
-        targetModeGroup.setLayoutData(gd);
-        layout = new GridLayout();
-        layout.numColumns = 1;
-        targetModeGroup.setLayout(layout);
-        targetModeGroup.setFont(font);
-
-        mManualTargetButton = new Button(targetModeGroup, SWT.RADIO);
-        mManualTargetButton.setText("Always prompt to pick device");
-
-        mAllDevicesTargetButton = new Button(targetModeGroup, SWT.RADIO);
-        mAllDevicesTargetButton.setText("Launch on all compatible devices/AVD's");
-        mAllDevicesTargetButton.setEnabled(mSupportMultiDeviceLaunch);
-
-        Composite deviceTypeOffsetComp = new Composite(targetModeGroup, SWT.NONE);
-        deviceTypeOffsetComp.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-        layout = new GridLayout(1, false);
-        layout.marginRight = layout.marginHeight = 0;
-        layout.marginLeft = 30;
-        deviceTypeOffsetComp.setLayout(layout);
-
-        mDeviceTypeCombo = new Combo(deviceTypeOffsetComp, SWT.READ_ONLY);
-        mDeviceTypeCombo.setItems(new String[] {
-                DEVICES_AND_EMULATORS,
-                EMULATORS_ONLY,
-                DEVICES_ONLY,
-        });
-        mDeviceTypeCombo.select(0);
-        mDeviceTypeCombo.setEnabled(false);
-
-        // add the radio button
-        mAutoTargetButton = new Button(targetModeGroup, SWT.RADIO);
-        mAutoTargetButton.setText("Automatically pick compatible device: "
-                + "Always uses preferred AVD if set below, "
-                + "launches on compatible device/AVD otherwise.");
-        mAutoTargetButton.setSelection(true);
-
-        SelectionListener targetModeChangeListener = new SelectionAdapter() {
-            @Override
-            public void widgetSelected(SelectionEvent e) {
-                targetModeChanged();
-            }
-        };
-
-        mAutoTargetButton.addSelectionListener(targetModeChangeListener);
-        mAllDevicesTargetButton.addSelectionListener(targetModeChangeListener);
-        mManualTargetButton.addSelectionListener(targetModeChangeListener);
-
-        Composite avdOffsetComp = new Composite(targetModeGroup, SWT.NONE);
-        avdOffsetComp.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-        layout = new GridLayout(1, false);
-        layout.marginRight = layout.marginHeight = 0;
-        layout.marginLeft = 30;
-        avdOffsetComp.setLayout(layout);
-
-        mPreferredAvdLabel = new Label(avdOffsetComp, SWT.NONE);
-        mPreferredAvdLabel.setText("Select a preferred Android Virtual Device for deployment:");
-
-        // create the selector with no manager, we'll reset the manager every time this is
-        // displayed to ensure we have the latest one (dialog is reused but SDK could have
-        // been changed in between.
-        mPreferredAvdSelector = new AvdSelector(avdOffsetComp,
-                Sdk.getCurrent().getSdkOsLocation(),
-                null /* avd manager */,
-                DisplayMode.SIMPLE_CHECK,
-                new AdtConsoleSdkLog());
-        mPreferredAvdSelector.setTableHeightHint(100);
-        SelectionListener listener = new SelectionAdapter() {
-            @Override
-            public void widgetSelected(SelectionEvent e) {
-                updateLaunchConfigurationDialog();
-            }
-        };
-        mPreferredAvdSelector.setSelectionListener(listener);
-        mDeviceTypeCombo.addSelectionListener(listener);
-
-        mFutureLaunchesOnSameDevice = new Button(targetModeGroup, SWT.CHECK);
-        mFutureLaunchesOnSameDevice.setText("Use same device for future launches");
-        mFutureLaunchesOnSameDevice.addSelectionListener(listener);
-
-        // emulator size
-        mEmulatorOptionsGroup = new Group(topComp, SWT.NONE);
-        mEmulatorOptionsGroup.setText("Emulator launch parameters:");
-        mEmulatorOptionsGroup.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-        layout = new GridLayout();
-        layout.numColumns = 2;
-        mEmulatorOptionsGroup.setLayout(layout);
-        mEmulatorOptionsGroup.setFont(font);
-
-        // Explanation
-        Label l = new Label(mEmulatorOptionsGroup, SWT.NONE);
-        l.setText("If no compatible and active devices or AVD's are found, then an AVD "
-                 + "might be launched. Provide options for the AVD launch below.");
-        gd = new GridData();
-        gd.horizontalSpan = 2;
-        l.setLayoutData(gd);
-
-        // network options
-        new Label(mEmulatorOptionsGroup, SWT.NONE).setText("Network Speed:");
-
-        mSpeedCombo = new Combo(mEmulatorOptionsGroup, SWT.READ_ONLY);
-        for (String[] speed : NETWORK_SPEEDS) {
-            mSpeedCombo.add(speed[0]);
-        }
-        mSpeedCombo.addSelectionListener(listener);
-        mSpeedCombo.pack();
-
-        new Label(mEmulatorOptionsGroup, SWT.NONE).setText("Network Latency:");
-
-        mDelayCombo = new Combo(mEmulatorOptionsGroup, SWT.READ_ONLY);
-
-        for (String[] delay : NETWORK_LATENCIES) {
-            mDelayCombo.add(delay[0]);
-        }
-        mDelayCombo.addSelectionListener(listener);
-        mDelayCombo.pack();
-
-        // wipe data option
-        mWipeDataButton = new Button(mEmulatorOptionsGroup, SWT.CHECK);
-        mWipeDataButton.setText("Wipe User Data");
-        mWipeDataButton.setToolTipText("Check this if you want to wipe your user data each time you start the emulator. You will be prompted for confirmation when the emulator starts.");
-        gd = new GridData(GridData.FILL_HORIZONTAL);
-        gd.horizontalSpan = 2;
-        mWipeDataButton.setLayoutData(gd);
-        mWipeDataButton.addSelectionListener(listener);
-
-        // no boot anim option
-        mNoBootAnimButton = new Button(mEmulatorOptionsGroup, SWT.CHECK);
-        mNoBootAnimButton.setText("Disable Boot Animation");
-        mNoBootAnimButton.setToolTipText("Check this if you want to disable the boot animation. This can help the emulator start faster on slow machines.");
-        gd = new GridData(GridData.FILL_HORIZONTAL);
-        gd.horizontalSpan = 2;
-        mNoBootAnimButton.setLayoutData(gd);
-        mNoBootAnimButton.addSelectionListener(listener);
-
-        // custom command line option for emulator
-        l = new Label(mEmulatorOptionsGroup, SWT.NONE);
-        l.setText("Additional Emulator Command Line Options");
-        gd = new GridData(GridData.FILL_HORIZONTAL);
-        gd.horizontalSpan = 2;
-        l.setLayoutData(gd);
-
-        mEmulatorCLOptions = new Text(mEmulatorOptionsGroup, SWT.BORDER);
-        gd = new GridData(GridData.FILL_HORIZONTAL);
-        gd.horizontalSpan = 2;
-        mEmulatorCLOptions.setLayoutData(gd);
-        mEmulatorCLOptions.addModifyListener(new ModifyListener() {
-            @Override
-            public void modifyText(ModifyEvent e) {
-                updateLaunchConfigurationDialog();
-            }
-        });
-    }
-
-    private void targetModeChanged() {
-        updateLaunchConfigurationDialog();
-
-        boolean auto = mAutoTargetButton.getSelection();
-        mPreferredAvdSelector.setEnabled(auto);
-        mPreferredAvdLabel.setEnabled(auto);
-
-        boolean all = mAllDevicesTargetButton.getSelection();
-        mDeviceTypeCombo.setEnabled(all);
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.debug.ui.ILaunchConfigurationTab#getName()
-     */
-    @Override
-    public String getName() {
-        return "Target";
-    }
-
-    @Override
-    public Image getImage() {
-        return ImageLoader.getDdmUiLibLoader().loadImage("emulator.png", null); //$NON-NLS-1$
-    }
-
-    private void updateAvdList(AvdManager avdManager) {
-        if (avdManager == null) {
-            avdManager = Sdk.getCurrent().getAvdManager();
-        }
-
-        mPreferredAvdSelector.setManager(avdManager);
-        mPreferredAvdSelector.refresh(false);
-
-        mPreferredAvdSelector.setFilter(new IAvdFilter() {
-            @Override
-            public void prepare() {
-            }
-
-            @Override
-            public void cleanup() {
-            }
-
-            @Override
-            public boolean accept(AvdInfo avd) {
-                AvdCompatibility.Compatibility c =
-                        AvdCompatibility.canRun(avd, mProjectTarget, mProjectMinApiVersion);
-                return (c == Compatibility.NO) ? false : true;
-            }
-        });
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.debug.ui.ILaunchConfigurationTab#initializeFrom(org.eclipse.debug.core.ILaunchConfiguration)
-     */
-    @Override
-    public void initializeFrom(ILaunchConfiguration configuration) {
-        AvdManager avdManager = Sdk.getCurrent().getAvdManager();
-
-        TargetMode mode = AndroidLaunchConfiguration.parseTargetMode(configuration,
-                LaunchConfigDelegate.DEFAULT_TARGET_MODE);
-
-        boolean multipleDevices = mode.isMultiDevice();
-        if (multipleDevices && !mSupportMultiDeviceLaunch) {
-            // The launch config says to run on multiple devices, but this launch type does not
-            // suppport multiple devices. In such a case, switch back to default mode.
-            // This could happen if a launch config used for Run is then used for Debug.
-            multipleDevices = false;
-            mode = LaunchConfigDelegate.DEFAULT_TARGET_MODE;
-        }
-
-        mAutoTargetButton.setSelection(mode == TargetMode.AUTO);
-        mManualTargetButton.setSelection(mode == TargetMode.MANUAL);
-        mAllDevicesTargetButton.setSelection(multipleDevices);
-
-        targetModeChanged();
-
-        boolean reuseLastUsedDevice;
-        try {
-            reuseLastUsedDevice = configuration.getAttribute(
-                    LaunchConfigDelegate.ATTR_REUSE_LAST_USED_DEVICE, false);
-        } catch (CoreException ex) {
-            reuseLastUsedDevice = false;
-        }
-        mFutureLaunchesOnSameDevice.setSelection(reuseLastUsedDevice);
-
-        mDeviceTypeCombo.setEnabled(multipleDevices);
-        if (multipleDevices) {
-            int index = 0;
-            if (mode == TargetMode.ALL_EMULATORS) {
-                index = 1;
-            } else if (mode == TargetMode.ALL_DEVICES) {
-                index = 2;
-            }
-            mDeviceTypeCombo.select(index);
-        }
-
-        // look for the project name to get its target.
-        String stringValue = "";
-        try {
-            stringValue = configuration.getAttribute(
-                    IJavaLaunchConfigurationConstants.ATTR_PROJECT_NAME, stringValue);
-        } catch (CoreException ce) {
-            // let's not do anything here, we'll use the default value
-        }
-
-        IProject project = null;
-
-        // get the list of existing Android projects from the workspace.
-        IJavaProject[] projects = BaseProjectHelper.getAndroidProjects(null /*filter*/);
-        if (projects != null) {
-            // look for the project whose name we read from the configuration.
-            for (IJavaProject p : projects) {
-                if (p.getElementName().equals(stringValue)) {
-                    project = p.getProject();
-                    break;
-                }
-            }
-        }
-
-        // update the AVD list
-        if (project != null) {
-            mProjectTarget = Sdk.getCurrent().getTarget(project);
-
-            ManifestInfo mi = ManifestInfo.get(project);
-            final int minApiLevel = mi.getMinSdkVersion();
-            final String minApiCodeName = mi.getMinSdkCodeName();
-            mProjectMinApiVersion = new AndroidVersion(minApiLevel, minApiCodeName);
-        }
-
-        updateAvdList(avdManager);
-
-        stringValue = "";
-        try {
-            stringValue = configuration.getAttribute(LaunchConfigDelegate.ATTR_AVD_NAME,
-                    stringValue);
-        } catch (CoreException e) {
-            // let's not do anything here, we'll use the default value
-        }
-
-        if (stringValue != null && stringValue.length() > 0 && avdManager != null) {
-            AvdInfo targetAvd = avdManager.getAvd(stringValue, true /*validAvdOnly*/);
-            mPreferredAvdSelector.setSelection(targetAvd);
-        } else {
-            mPreferredAvdSelector.setSelection(null);
-        }
-
-        boolean value = LaunchConfigDelegate.DEFAULT_WIPE_DATA;
-        try {
-            value = configuration.getAttribute(LaunchConfigDelegate.ATTR_WIPE_DATA, value);
-        } catch (CoreException e) {
-            // let's not do anything here, we'll use the default value
-        }
-        mWipeDataButton.setSelection(value);
-
-        value = LaunchConfigDelegate.DEFAULT_NO_BOOT_ANIM;
-        try {
-            value = configuration.getAttribute(LaunchConfigDelegate.ATTR_NO_BOOT_ANIM, value);
-        } catch (CoreException e) {
-            // let's not do anything here, we'll use the default value
-        }
-        mNoBootAnimButton.setSelection(value);
-
-        int index = -1;
-
-        index = LaunchConfigDelegate.DEFAULT_SPEED;
-        try {
-            index = configuration.getAttribute(LaunchConfigDelegate.ATTR_SPEED,
-                    index);
-        } catch (CoreException e) {
-            // let's not do anything here, we'll use the default value
-        }
-        if (index == -1) {
-            mSpeedCombo.clearSelection();
-        } else {
-            mSpeedCombo.select(index);
-        }
-
-        index = LaunchConfigDelegate.DEFAULT_DELAY;
-        try {
-            index = configuration.getAttribute(LaunchConfigDelegate.ATTR_DELAY,
-                    index);
-        } catch (CoreException e) {
-            // let's not do anything here, we'll put a proper value in
-            // performApply anyway
-        }
-        if (index == -1) {
-            mDelayCombo.clearSelection();
-        } else {
-            mDelayCombo.select(index);
-        }
-
-        String commandLine = null;
-        try {
-            commandLine = configuration.getAttribute(
-                    LaunchConfigDelegate.ATTR_COMMANDLINE, ""); //$NON-NLS-1$
-        } catch (CoreException e) {
-            // let's not do anything here, we'll use the default value
-        }
-        if (commandLine != null) {
-            mEmulatorCLOptions.setText(commandLine);
-        }
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.debug.ui.ILaunchConfigurationTab#performApply(org.eclipse.debug.core.ILaunchConfigurationWorkingCopy)
-     */
-    @Override
-    public void performApply(ILaunchConfigurationWorkingCopy configuration) {
-        configuration.setAttribute(LaunchConfigDelegate.ATTR_TARGET_MODE,
-                getCurrentTargetMode().toString());
-        configuration.setAttribute(LaunchConfigDelegate.ATTR_REUSE_LAST_USED_DEVICE,
-                mFutureLaunchesOnSameDevice.getSelection());
-        AvdInfo avd = mPreferredAvdSelector.getSelected();
-        if (avd != null) {
-            configuration.setAttribute(LaunchConfigDelegate.ATTR_AVD_NAME, avd.getName());
-        } else {
-            configuration.setAttribute(LaunchConfigDelegate.ATTR_AVD_NAME, (String)null);
-        }
-        configuration.setAttribute(LaunchConfigDelegate.ATTR_SPEED,
-                mSpeedCombo.getSelectionIndex());
-        configuration.setAttribute(LaunchConfigDelegate.ATTR_DELAY,
-                mDelayCombo.getSelectionIndex());
-        configuration.setAttribute(LaunchConfigDelegate.ATTR_COMMANDLINE,
-                mEmulatorCLOptions.getText());
-        configuration.setAttribute(LaunchConfigDelegate.ATTR_WIPE_DATA,
-                mWipeDataButton.getSelection());
-        configuration.setAttribute(LaunchConfigDelegate.ATTR_NO_BOOT_ANIM,
-                mNoBootAnimButton.getSelection());
-   }
-
-    private TargetMode getCurrentTargetMode() {
-        if (mAutoTargetButton.getSelection()) {
-            return TargetMode.AUTO;
-        } else if (mManualTargetButton.getSelection()) {
-            return TargetMode.MANUAL;
-        } else {
-            String selection = mDeviceTypeCombo.getText();
-            if (DEVICES_AND_EMULATORS.equals(selection)) {
-                return TargetMode.ALL_DEVICES_AND_EMULATORS;
-            } else if (DEVICES_ONLY.equals(selection)) {
-                return TargetMode.ALL_DEVICES;
-            } else if (EMULATORS_ONLY.equals(selection)) {
-                return TargetMode.ALL_EMULATORS;
-            }
-        }
-
-        return TargetMode.AUTO;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.debug.ui.ILaunchConfigurationTab#setDefaults(org.eclipse.debug.core.ILaunchConfigurationWorkingCopy)
-     */
-    @Override
-    public void setDefaults(ILaunchConfigurationWorkingCopy configuration) {
-        configuration.setAttribute(LaunchConfigDelegate.ATTR_TARGET_MODE,
-                LaunchConfigDelegate.DEFAULT_TARGET_MODE.toString());
-        configuration.setAttribute(LaunchConfigDelegate.ATTR_SPEED,
-                LaunchConfigDelegate.DEFAULT_SPEED);
-        configuration.setAttribute(LaunchConfigDelegate.ATTR_DELAY,
-                LaunchConfigDelegate.DEFAULT_DELAY);
-        configuration.setAttribute(LaunchConfigDelegate.ATTR_WIPE_DATA,
-                LaunchConfigDelegate.DEFAULT_WIPE_DATA);
-        configuration.setAttribute(LaunchConfigDelegate.ATTR_NO_BOOT_ANIM,
-                LaunchConfigDelegate.DEFAULT_NO_BOOT_ANIM);
-
-        IPreferenceStore store = AdtPlugin.getDefault().getPreferenceStore();
-        String emuOptions = store.getString(AdtPrefs.PREFS_EMU_OPTIONS);
-        configuration.setAttribute(LaunchConfigDelegate.ATTR_COMMANDLINE, emuOptions);
-   }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/launch/IAndroidLaunchAction.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/launch/IAndroidLaunchAction.java
deleted file mode 100644
index 1ec46b6..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/launch/IAndroidLaunchAction.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Copyright (C) 2009 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.launch;
-
-import com.android.ddmlib.IDevice;
-
-import java.util.Collection;
-
-/**
- * An action to perform after performing a launch of an Android application
- */
-public interface IAndroidLaunchAction {
-
-    /**
-     * Do the launch
-     *
-     * @param info the {@link DelayedLaunchInfo} that contains launch details
-     * @param devices Android devices on which the action will be performed
-     * @returns true if launch was successfully, and controller should wait for debugger to attach
-     *     (if applicable)
-     */
-    boolean doLaunchAction(DelayedLaunchInfo info, Collection<IDevice> devices);
-
-    /**
-     * Return a description of launch, to be used for logging and error messages
-     */
-    String getLaunchDescription();
-
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/launch/ILaunchController.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/launch/ILaunchController.java
deleted file mode 100644
index 6a5c009..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/launch/ILaunchController.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * Copyright (C) 2009 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.launch;
-
-import com.android.ddmlib.IDevice;
-
-/**
- * Interface for managing Android launches
- */
-public interface ILaunchController {
-
-   /**
-    * Launches an application on a device or emulator
-    *
-    * @param launchInfo the {@link DelayedLaunchInfo} that indicates the launch action
-    * @param device the device or emulator to launch the application on
-    */
-    public void launchApp(DelayedLaunchInfo launchInfo, IDevice device);
-    
-    /**
-     * Cancels a launch
-     * 
-     * @param launchInfo the {@link DelayedLaunchInfo} to cancel
-     */
-    void stopLaunch(DelayedLaunchInfo launchInfo);
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/launch/JUnitLaunchConfigDelegate.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/launch/JUnitLaunchConfigDelegate.java
deleted file mode 100644
index fdb1b30..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/launch/JUnitLaunchConfigDelegate.java
+++ /dev/null
@@ -1,156 +0,0 @@
-/*
- * Copyright (C) 2009 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.launch;
-
-import com.android.SdkConstants;
-import com.android.ide.eclipse.adt.AdtConstants;
-import com.android.ide.eclipse.adt.AdtPlugin;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.FileLocator;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.debug.core.ILaunchConfiguration;
-import org.eclipse.jdt.junit.launcher.JUnitLaunchConfigurationDelegate;
-import org.osgi.framework.Bundle;
-
-import java.io.IOException;
-import java.net.URL;
-
-/**
- * <p>
- * For Android projects, android.jar gets added to the launch configuration of
- * JUnit tests as a bootstrap entry. This breaks JUnit tests as android.jar
- * contains a skeleton version of JUnit classes and the JVM will stop with an error similar
- * to: <blockquote> Error occurred during initialization of VM
- * java/lang/NoClassDefFoundError: java/lang/ref/FinalReference </blockquote>
- * <p>
- * At compile time, Eclipse does not know that there is no valid junit.jar in
- * the classpath since it can find a correct reference to all the necessary
- * org.junit.* classes in the android.jar so it does not prompt the user to add
- * the JUnit3 or JUnit4 jar.
- * <p>
- * This delegates removes the android.jar from the bootstrap path and if
- * necessary also puts back the junit.jar in the user classpath.
- * <p>
- * This delegate will be present for both Java and Android projects (delegates
- * setting instead of only the current project) but the behavior for Java
- * projects should be neutral since:
- * <ol>
- * <li>Java tests can only compile (and then run) when a valid junit.jar is
- * present
- * <li>There is no android.jar in Java projects
- * </ol>
- */
-public class JUnitLaunchConfigDelegate extends JUnitLaunchConfigurationDelegate {
-
-    private static final String JUNIT_JAR = "junit.jar"; //$NON-NLS-1$
-
-    @Override
-    public String[][] getBootpathExt(ILaunchConfiguration configuration) throws CoreException {
-        String[][] bootpath = super.getBootpathExt(configuration);
-        return fixBootpathExt(bootpath);
-    }
-
-    @Override
-    public String[] getClasspath(ILaunchConfiguration configuration) throws CoreException {
-        String[] classpath = super.getClasspath(configuration);
-        return fixClasspath(classpath, getJavaProjectName(configuration));
-    }
-
-    /**
-     * Removes the android.jar from the bootstrap path if present.
-     *
-     * @param bootpath Array of Arrays of bootstrap class paths
-     * @return a new modified (if applicable) bootpath
-     */
-    public static String[][] fixBootpathExt(String[][] bootpath) {
-        for (int i = 0; i < bootpath.length; i++) {
-            if (bootpath[i] != null && bootpath[i].length > 0) {
-                // we assume that the android.jar can only be present in the
-                // bootstrap path of android tests
-                if (bootpath[i][0].endsWith(SdkConstants.FN_FRAMEWORK_LIBRARY)) {
-                    bootpath[i] = null;
-                }
-            }
-        }
-        return bootpath;
-    }
-
-    /**
-     * Add the junit.jar to the user classpath; since Eclipse was relying on
-     * android.jar to provide the appropriate org.junit classes, it does not
-     * know it actually needs the junit.jar.
-     *
-     * @param classpath Array containing classpath
-     * @param projectName The name of the project (for logging purposes)
-     *
-     * @return a new modified (if applicable) classpath
-     */
-    public static String[] fixClasspath(String[] classpath, String projectName) {
-        // search for junit.jar; if any are found return immediately
-        for (int i = 0; i < classpath.length; i++) {
-            if (classpath[i].endsWith(JUNIT_JAR)) {
-                return classpath;
-            }
-        }
-
-        // This delegate being called without a junit.jar present is only
-        // possible for Android projects. In a non-Android project, the test
-        // would not compile and would be unable to run.
-        try {
-            // junit4 is backward compatible with junit3 and they uses the
-            // same junit.jar from bundle org.junit:
-            // When a project has mixed JUnit3 and JUnit4 tests, if JUnit3 jar
-            // is added first it is then replaced by the JUnit4 jar when user is
-            // prompted to fix the JUnit4 test failure
-            String jarLocation = getJunitJarLocation();
-            // we extend the classpath by one element and append junit.jar
-            String[] newClasspath = new String[classpath.length + 1];
-            System.arraycopy(classpath, 0, newClasspath, 0, classpath.length);
-            newClasspath[newClasspath.length - 1] = jarLocation;
-            classpath = newClasspath;
-        } catch (IOException e) {
-            // This should not happen as we depend on the org.junit
-            // plugin explicitly; the error is logged here so that the user can
-            // trace back the cause when the test fails to run
-            AdtPlugin.log(e, "Could not find a valid junit.jar");
-            AdtPlugin.printErrorToConsole(projectName,
-                    "Could not find a valid junit.jar");
-            // Return the classpath as-is (with no junit.jar) anyway because we
-            // will let the actual launch config fails.
-        }
-
-        return classpath;
-    }
-
-    /**
-     * Returns the path of the junit jar in the highest version bundle.
-     *
-     * (This is public only so that the test can call it)
-     *
-     * @return the path as a string
-     * @throws IOException
-     */
-    public static String getJunitJarLocation() throws IOException {
-        Bundle bundle = Platform.getBundle("org.junit"); //$NON-NLS-1$
-        if (bundle == null) {
-            throw new IOException("Cannot find org.junit bundle");
-        }
-        URL jarUrl = bundle.getEntry(AdtConstants.WS_SEP + JUNIT_JAR);
-        return FileLocator.resolve(jarUrl).getFile();
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/launch/LaunchConfigDelegate.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/launch/LaunchConfigDelegate.java
deleted file mode 100644
index 86fc2ff..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/launch/LaunchConfigDelegate.java
+++ /dev/null
@@ -1,424 +0,0 @@
-/*
- * Copyright (C) 2007 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.launch;
-
-import com.android.ddmlib.AndroidDebugBridge;
-import com.android.ide.common.xml.ManifestData;
-import com.android.ide.common.xml.ManifestData.Activity;
-import com.android.ide.eclipse.adt.AdtConstants;
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.ide.eclipse.adt.internal.launch.AndroidLaunchConfiguration.TargetMode;
-import com.android.ide.eclipse.adt.internal.project.AndroidManifestHelper;
-import com.android.ide.eclipse.adt.internal.project.ProjectHelper;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IWorkspace;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.debug.core.ILaunch;
-import org.eclipse.debug.core.ILaunchConfiguration;
-import org.eclipse.debug.core.model.LaunchConfigurationDelegate;
-import org.eclipse.jdt.core.JavaCore;
-import org.eclipse.jdt.launching.IJavaLaunchConfigurationConstants;
-
-/**
- * Implementation of an eclipse LauncConfigurationDelegate to launch android
- * application in debug.
- */
-public class LaunchConfigDelegate extends LaunchConfigurationDelegate {
-    final static int INVALID_DEBUG_PORT = -1;
-
-    public final static String ANDROID_LAUNCH_TYPE_ID =
-        "com.android.ide.eclipse.adt.debug.LaunchConfigType"; //$NON-NLS-1$
-
-    /** Target mode parameters: true is automatic, false is manual */
-    public static final String ATTR_TARGET_MODE = AdtPlugin.PLUGIN_ID + ".target"; //$NON-NLS-1$
-    public static final TargetMode DEFAULT_TARGET_MODE = TargetMode.AUTO;
-
-    /** Flag indicating whether the last used device should be used for future launches. */
-    public static final String ATTR_REUSE_LAST_USED_DEVICE =
-            AdtPlugin.PLUGIN_ID + ".reuse.last.used.device"; //$NON-NLS-1$
-
-    /** Device on which the last launch happened. */
-    public static final String ATTR_LAST_USED_DEVICE =
-            AdtPlugin.PLUGIN_ID + ".last.used.device"; //$NON-NLS-1$
-
-    /**
-     * Launch action:
-     * <ul>
-     * <li>0: launch default activity</li>
-     * <li>1: launch specified activity. See {@link #ATTR_ACTIVITY}</li>
-     * <li>2: Do Nothing</li>
-     * </ul>
-     */
-    public final static String ATTR_LAUNCH_ACTION = AdtPlugin.PLUGIN_ID + ".action"; //$NON-NLS-1$
-
-    /** Default launch action. This launches the activity that is setup to be found in the HOME
-     * screen.
-     */
-    public final static int ACTION_DEFAULT = 0;
-    /** Launch action starting a specific activity. */
-    public final static int ACTION_ACTIVITY = 1;
-    /** Launch action that does nothing. */
-    public final static int ACTION_DO_NOTHING = 2;
-    /** Default launch action value. */
-    public final static int DEFAULT_LAUNCH_ACTION = ACTION_DEFAULT;
-
-    /**
-     * Activity to be launched if {@link #ATTR_LAUNCH_ACTION} is 1
-     */
-    public static final String ATTR_ACTIVITY = AdtPlugin.PLUGIN_ID + ".activity"; //$NON-NLS-1$
-
-    public static final String ATTR_AVD_NAME = AdtPlugin.PLUGIN_ID + ".avd"; //$NON-NLS-1$
-
-    public static final String ATTR_SPEED = AdtPlugin.PLUGIN_ID + ".speed"; //$NON-NLS-1$
-
-    /**
-     * Index of the default network speed setting for the emulator.<br>
-     * Get the emulator option with <code>EmulatorConfigTab.getSpeed(index)</code>
-     */
-    public static final int DEFAULT_SPEED = 0;
-
-    public static final String ATTR_DELAY = AdtPlugin.PLUGIN_ID + ".delay"; //$NON-NLS-1$
-
-    /**
-     * Index of the default network latency setting for the emulator.<br>
-     * Get the emulator option with <code>EmulatorConfigTab.getDelay(index)</code>
-     */
-    public static final int DEFAULT_DELAY = 0;
-
-    public static final String ATTR_COMMANDLINE = AdtPlugin.PLUGIN_ID + ".commandline"; //$NON-NLS-1$
-
-    public static final String ATTR_WIPE_DATA = AdtPlugin.PLUGIN_ID + ".wipedata"; //$NON-NLS-1$
-    public static final boolean DEFAULT_WIPE_DATA = false;
-
-    public static final String ATTR_NO_BOOT_ANIM = AdtPlugin.PLUGIN_ID + ".nobootanim"; //$NON-NLS-1$
-    public static final boolean DEFAULT_NO_BOOT_ANIM = false;
-
-    public static final String ATTR_DEBUG_PORT =
-        AdtPlugin.PLUGIN_ID + ".debugPort"; //$NON-NLS-1$
-
-    @Override
-    public void launch(ILaunchConfiguration configuration, String mode,
-            ILaunch launch, IProgressMonitor monitor) throws CoreException {
-        // We need to check if it's a standard launch or if it's a launch
-        // to debug an application already running.
-        int debugPort = AndroidLaunchController.getPortForConfig(configuration);
-
-        // get the project
-        IProject project = getProject(configuration);
-
-        // first we make sure the launch is of the proper type
-        AndroidLaunch androidLaunch = null;
-        if (launch instanceof AndroidLaunch) {
-            androidLaunch = (AndroidLaunch)launch;
-        } else {
-            // wrong type, not sure how we got there, but we don't do
-            // anything else
-            AdtPlugin.printErrorToConsole(project, "Wrong Launch Type!");
-            return;
-        }
-
-        // if we have a valid debug port, this means we're debugging an app
-        // that's already launched.
-        if (debugPort != INVALID_DEBUG_PORT) {
-            AndroidLaunchController.launchRemoteDebugger(debugPort, androidLaunch, monitor);
-            return;
-        }
-
-        if (project == null) {
-            AdtPlugin.printErrorToConsole("Couldn't get project object!");
-            androidLaunch.stopLaunch();
-            return;
-        }
-
-        // make sure the project and its dependencies are built
-        // and PostCompilerBuilder runs.
-        // This is a synchronous call which returns when the
-        // build is done.
-        ProjectHelper.doFullIncrementalDebugBuild(project, monitor);
-
-        // check if the project has errors, and abort in this case.
-        if (ProjectHelper.hasError(project, true)) {
-            AdtPlugin.displayError("Android Launch",
-                    "Your project contains error(s), please fix them before running your application.");
-            return;
-        }
-
-        AdtPlugin.printToConsole(project, "------------------------------"); //$NON-NLS-1$
-        AdtPlugin.printToConsole(project, "Android Launch!");
-
-        // check if the project is using the proper sdk.
-        // if that throws an exception, we simply let it propagate to the caller.
-        if (checkAndroidProject(project) == false) {
-            AdtPlugin.printErrorToConsole(project, "Project is not an Android Project. Aborting!");
-            androidLaunch.stopLaunch();
-            return;
-        }
-
-        // Check adb status and abort if needed.
-        AndroidDebugBridge bridge = AndroidDebugBridge.getBridge();
-        if (bridge == null || bridge.isConnected() == false) {
-            try {
-                int connections = -1;
-                int restarts = -1;
-                if (bridge != null) {
-                    connections = bridge.getConnectionAttemptCount();
-                    restarts = bridge.getRestartAttemptCount();
-                }
-
-                // if we get -1, the device monitor is not even setup (anymore?).
-                // We need to ask the user to restart eclipse.
-                // This shouldn't happen, but it's better to let the user know in case it does.
-                if (connections == -1 || restarts == -1) {
-                    AdtPlugin.printErrorToConsole(project,
-                            "The connection to adb is down, and a severe error has occured.",
-                            "You must restart adb and Eclipse.",
-                            String.format(
-                                    "Please ensure that adb is correctly located at '%1$s' and can be executed.",
-                                    AdtPlugin.getOsAbsoluteAdb()));
-                    return;
-                }
-
-                if (restarts == 0) {
-                    AdtPlugin.printErrorToConsole(project,
-                            "Connection with adb was interrupted.",
-                            String.format("%1$s attempts have been made to reconnect.", connections),
-                            "You may want to manually restart adb from the Devices view.");
-                } else {
-                    AdtPlugin.printErrorToConsole(project,
-                            "Connection with adb was interrupted, and attempts to reconnect have failed.",
-                            String.format("%1$s attempts have been made to restart adb.", restarts),
-                            "You may want to manually restart adb from the Devices view.");
-
-                }
-                return;
-            } finally {
-                androidLaunch.stopLaunch();
-            }
-        }
-
-        // since adb is working, we let the user know
-        // TODO have a verbose mode for launch with more info (or some of the less useful info we now have).
-        AdtPlugin.printToConsole(project, "adb is running normally.");
-
-        // make a config class
-        AndroidLaunchConfiguration config = new AndroidLaunchConfiguration();
-
-        // fill it with the config coming from the ILaunchConfiguration object
-        config.set(configuration);
-
-        // get the launch controller singleton
-        AndroidLaunchController controller = AndroidLaunchController.getInstance();
-
-        // get the application package
-        IFile applicationPackage = ProjectHelper.getApplicationPackage(project);
-        if (applicationPackage == null) {
-            androidLaunch.stopLaunch();
-            return;
-        }
-
-        // we need some information from the manifest
-        ManifestData manifestData = AndroidManifestHelper.parseForData(project);
-
-        if (manifestData == null) {
-            AdtPlugin.printErrorToConsole(project, "Failed to parse AndroidManifest: aborting!");
-            androidLaunch.stopLaunch();
-            return;
-        }
-
-        doLaunch(configuration, mode, monitor, project, androidLaunch, config, controller,
-                applicationPackage, manifestData);
-    }
-
-    protected void doLaunch(ILaunchConfiguration configuration, String mode,
-            IProgressMonitor monitor, IProject project, AndroidLaunch androidLaunch,
-            AndroidLaunchConfiguration config, AndroidLaunchController controller,
-            IFile applicationPackage, ManifestData manifestData) {
-
-       String activityName = null;
-
-        if (config.mLaunchAction == ACTION_ACTIVITY) {
-            // Get the activity name defined in the config
-            activityName = getActivityName(configuration);
-
-            // Get the full activity list and make sure the one we got matches.
-            Activity[] activities = manifestData.getActivities();
-
-            // first we check that there are, in fact, activities.
-            if (activities.length == 0) {
-                // if the activities list is null, then the manifest is empty
-                // and we can't launch the app. We'll revert to a sync-only launch
-                AdtPlugin.printErrorToConsole(project,
-                        "The Manifest defines no activity!",
-                        "The launch will only sync the application package on the device!");
-                config.mLaunchAction = ACTION_DO_NOTHING;
-            } else if (activityName == null) {
-                // if the activity we got is null, we look for the default one.
-                AdtPlugin.printErrorToConsole(project,
-                        "No activity specified! Getting the launcher activity.");
-                Activity launcherActivity = manifestData.getLauncherActivity();
-                if (launcherActivity != null) {
-                    activityName = launcherActivity.getName();
-                }
-
-                // if there's no default activity. We revert to a sync-only launch.
-                if (activityName == null) {
-                    revertToNoActionLaunch(project, config);
-                }
-            } else {
-
-                // check the one we got from the config matches any from the list
-                boolean match = false;
-                for (Activity a : activities) {
-                    if (a != null && a.getName().equals(activityName)) {
-                        match = true;
-                        break;
-                    }
-                }
-
-                // if we didn't find a match, we revert to the default activity if any.
-                if (match == false) {
-                    AdtPlugin.printErrorToConsole(project,
-                            "The specified activity does not exist! Getting the launcher activity.");
-                    Activity launcherActivity = manifestData.getLauncherActivity();
-                    if (launcherActivity != null) {
-                        activityName = launcherActivity.getName();
-                    } else {
-                        // if there's no default activity. We revert to a sync-only launch.
-                        revertToNoActionLaunch(project, config);
-                    }
-                }
-            }
-        } else if (config.mLaunchAction == ACTION_DEFAULT) {
-            Activity launcherActivity = manifestData.getLauncherActivity();
-            if (launcherActivity != null) {
-                activityName = launcherActivity.getName();
-            }
-
-            // if there's no default activity. We revert to a sync-only launch.
-            if (activityName == null) {
-                revertToNoActionLaunch(project, config);
-            }
-        }
-
-        IAndroidLaunchAction launchAction = null;
-        if (config.mLaunchAction == ACTION_DO_NOTHING || activityName == null) {
-            launchAction = new EmptyLaunchAction();
-        } else {
-            launchAction = new ActivityLaunchAction(activityName, controller);
-        }
-
-        // everything seems fine, we ask the launch controller to handle
-        // the rest
-        controller.launch(project, mode, applicationPackage,manifestData.getPackage(),
-                manifestData.getPackage(), manifestData.getDebuggable(),
-                manifestData.getMinSdkVersionString(), launchAction, config, androidLaunch,
-                monitor);
-    }
-
-    @Override
-    public boolean buildForLaunch(ILaunchConfiguration configuration,
-            String mode, IProgressMonitor monitor) throws CoreException {
-        // if this returns true, this forces a full workspace rebuild which is not
-        // what we want.
-        // Instead in the #launch method, we'll rebuild only the launching project.
-        return false;
-    }
-
-    /**
-     * {@inheritDoc}
-     * @throws CoreException
-     */
-    @Override
-    public ILaunch getLaunch(ILaunchConfiguration configuration, String mode)
-            throws CoreException {
-        return new AndroidLaunch(configuration, mode, null);
-    }
-
-    /**
-     * Returns the IProject object matching the name found in the configuration
-     * object under the name
-     * <code>IJavaLaunchConfigurationConstants.ATTR_PROJECT_NAME</code>
-     * @param configuration
-     * @return The IProject object or null
-     */
-    private IProject getProject(ILaunchConfiguration configuration){
-        // get the project name from the config
-        String projectName;
-        try {
-            projectName = configuration.getAttribute(
-                    IJavaLaunchConfigurationConstants.ATTR_PROJECT_NAME, "");
-        } catch (CoreException e) {
-            return null;
-        }
-
-        // get the current workspace
-        IWorkspace workspace = ResourcesPlugin.getWorkspace();
-
-        // and return the project with the name from the config
-        return workspace.getRoot().getProject(projectName);
-    }
-
-    /**
-     * Checks the project is an android project.
-     * @param project The project to check
-     * @return true if the project is an android SDK.
-     * @throws CoreException
-     */
-    private boolean checkAndroidProject(IProject project) throws CoreException {
-        // check if the project is a java and an android project.
-        if (project.hasNature(JavaCore.NATURE_ID) == false) {
-            String msg = String.format("%1$s is not a Java project!", project.getName());
-            AdtPlugin.displayError("Android Launch", msg);
-            return false;
-        }
-
-        if (project.hasNature(AdtConstants.NATURE_DEFAULT) == false) {
-            String msg = String.format("%1$s is not an Android project!", project.getName());
-            AdtPlugin.displayError("Android Launch", msg);
-            return false;
-        }
-
-        return true;
-    }
-
-
-    /**
-     * Returns the name of the activity.
-     */
-    private String getActivityName(ILaunchConfiguration configuration) {
-        String empty = "";
-        String activityName;
-        try {
-            activityName = configuration.getAttribute(ATTR_ACTIVITY, empty);
-        } catch (CoreException e) {
-            return null;
-        }
-
-        return (activityName != empty) ? activityName : null;
-    }
-
-    private final void revertToNoActionLaunch(IProject project, AndroidLaunchConfiguration config) {
-        AdtPlugin.printErrorToConsole(project,
-                "No Launcher activity found!",
-                "The launch will only sync the application package on the device!");
-        config.mLaunchAction = ACTION_DO_NOTHING;
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/launch/LaunchConfigTabGroup.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/launch/LaunchConfigTabGroup.java
deleted file mode 100644
index fbf17ce..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/launch/LaunchConfigTabGroup.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Copyright (C) 2007 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.launch;
-
-import org.eclipse.debug.core.ILaunchManager;
-import org.eclipse.debug.ui.AbstractLaunchConfigurationTabGroup;
-import org.eclipse.debug.ui.CommonTab;
-import org.eclipse.debug.ui.ILaunchConfigurationDialog;
-import org.eclipse.debug.ui.ILaunchConfigurationTab;
-
-/**
- * Tab group object for Android Launch Config type.
- */
-public class LaunchConfigTabGroup extends AbstractLaunchConfigurationTabGroup {
-
-    public LaunchConfigTabGroup() {
-    }
-
-    @Override
-    public void createTabs(ILaunchConfigurationDialog dialog, String mode) {
-        ILaunchConfigurationTab[] tabs = new ILaunchConfigurationTab[] {
-                new MainLaunchConfigTab(),
-                new EmulatorConfigTab(ILaunchManager.RUN_MODE.equals(mode)),
-                new CommonTab()
-            };
-            setTabs(tabs);
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/launch/LaunchMessages.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/launch/LaunchMessages.java
deleted file mode 100644
index 1fd2b5a..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/launch/LaunchMessages.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * Copyright (C) 2010 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.launch;
-
-import org.eclipse.osgi.util.NLS;
-
-public class LaunchMessages extends NLS {
-    private static final String BUNDLE_NAME = "com.android.ide.eclipse.adt.internal.launch.messages"; //$NON-NLS-1$
-
-    // generic messages that could be used by multiple classes
-    public static String LaunchDialogTitle;
-    public static String NonAndroidProjectError;
-    public static String ParseFileFailure_s;
-
-    // specialized, class-specific messages
-    public static String AndroidJUnitLaunchAction_LaunchDesc_s;
-    public static String AndroidJUnitLaunchAction_LaunchFail;
-    public static String AndroidJUnitLaunchAction_LaunchInstr_2s;
-    public static String AndroidJUnitDelegate_NoRunnerConfigMsg_s;
-    public static String AndroidJUnitDelegate_NoRunnerConsoleMsg_4s;
-    public static String AndroidJUnitDelegate_NoRunnerMsg_s;
-    public static String AndroidJUnitDelegate_NoTargetMsg_3s;
-    public static String AndroidJUnitTab_LoaderLabel;
-    public static String AndroidJUnitTab_LoadInstrError_s;
-    public static String AndroidJUnitTab_NoRunnerError;
-    public static String AndroidJUnitTab_SizeLabel;
-    public static String AndroidJUnitTab_TestContainerText;
-    public static String InstrValidator_NoTestLibMsg_s;
-    public static String InstrValidator_WrongRunnerTypeMsg_s;
-    public static String RemoteAdtTestRunner_RunCompleteMsg;
-    public static String RemoteAdtTestRunner_RunFailedMsg_s;
-
-    public static String RemoteAdtTestRunner_RunIOException_s;
-    public static String RemoteAdtTestRunner_RunTimeoutException;
-    public static String RemoteAdtTestRunner_RunAdbCommandRejectedException_s;
-    public static String RemoteAdtTestRunner_RunShellCommandUnresponsiveException;
-    public static String RemoteAdtTestRunner_RunStoppedMsg;
-
-    static {
-        // initialize resource bundle
-        NLS.initializeMessages(BUNDLE_NAME, LaunchMessages.class);
-    }
-
-    private LaunchMessages() {
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/launch/LaunchShortcut.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/launch/LaunchShortcut.java
deleted file mode 100644
index bb02b29..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/launch/LaunchShortcut.java
+++ /dev/null
@@ -1,104 +0,0 @@
-/*
- * Copyright (C) 2007 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.launch;
-
-import com.android.ide.eclipse.adt.internal.sdk.ProjectState;
-import com.android.ide.eclipse.adt.internal.sdk.Sdk;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.debug.core.ILaunchConfiguration;
-import org.eclipse.debug.ui.DebugUITools;
-import org.eclipse.debug.ui.ILaunchShortcut;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.PlatformUI;
-
-/**
- * Launch shortcut to launch debug/run configuration directly.
- */
-public class LaunchShortcut implements ILaunchShortcut {
-
-
-    /* (non-Javadoc)
-     * @see org.eclipse.debug.ui.ILaunchShortcut#launch(
-     * org.eclipse.jface.viewers.ISelection, java.lang.String)
-     */
-    @Override
-    public void launch(ISelection selection, String mode) {
-        if (selection instanceof IStructuredSelection) {
-
-            // get the object and the project from it
-            IStructuredSelection structSelect = (IStructuredSelection)selection;
-            Object o = structSelect.getFirstElement();
-
-            // get the first (and normally only) element
-            if (o instanceof IAdaptable) {
-                IResource r = (IResource)((IAdaptable)o).getAdapter(IResource.class);
-
-                // get the project from the resource
-                if (r != null) {
-                    IProject project = r.getProject();
-
-                    if (project != null)  {
-                        ProjectState state = Sdk.getProjectState(project);
-                        if (state != null && state.isLibrary()) {
-
-                            MessageDialog.openError(
-                                    PlatformUI.getWorkbench().getDisplay().getActiveShell(),
-                                    "Android Launch",
-                                    "Android library projects cannot be launched.");
-                        } else{
-                            // and launch
-                            launch(project, mode);
-                        }
-                    }
-                }
-            }
-        }
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.debug.ui.ILaunchShortcut#launch(
-     * org.eclipse.ui.IEditorPart, java.lang.String)
-     */
-    @Override
-    public void launch(IEditorPart editor, String mode) {
-        // since we force the shortcut to only work on selection in the
-        // package explorer, this will never be called.
-    }
-
-
-    /**
-     * Launch a config for the specified project.
-     * @param project The project to launch
-     * @param mode The launch mode ("debug", "run" or "profile")
-     */
-    private void launch(IProject project, String mode) {
-        // get an existing or new launch configuration
-        ILaunchConfiguration config = AndroidLaunchController.getLaunchConfig(project,
-                LaunchConfigDelegate.ANDROID_LAUNCH_TYPE_ID);
-
-        if (config != null) {
-            // and launch!
-            DebugUITools.launch(config, mode);
-        }
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/launch/MainLaunchConfigTab.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/launch/MainLaunchConfigTab.java
deleted file mode 100644
index c66458f..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/launch/MainLaunchConfigTab.java
+++ /dev/null
@@ -1,494 +0,0 @@
-/*
- * Copyright (C) 2007 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.launch;
-
-import com.android.ide.common.xml.ManifestData;
-import com.android.ide.common.xml.ManifestData.Activity;
-import com.android.ide.eclipse.adt.internal.editors.IconFactory;
-import com.android.ide.eclipse.adt.internal.project.AndroidManifestHelper;
-import com.android.ide.eclipse.adt.internal.project.ProjectChooserHelper;
-import com.android.ide.eclipse.adt.internal.project.ProjectChooserHelper.IProjectChooserFilter;
-import com.android.ide.eclipse.adt.internal.project.ProjectChooserHelper.NonLibraryProjectOnlyFilter;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IWorkspaceRoot;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.debug.core.ILaunchConfiguration;
-import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
-import org.eclipse.debug.ui.AbstractLaunchConfigurationTab;
-import org.eclipse.debug.ui.ILaunchConfigurationTab;
-import org.eclipse.jdt.core.IJavaModel;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.JavaCore;
-import org.eclipse.jdt.launching.IJavaLaunchConfigurationConstants;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Combo;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Group;
-import org.eclipse.swt.widgets.Text;
-
-import java.util.ArrayList;
-
-/**
- * Class for the main launch configuration tab.
- */
-public class MainLaunchConfigTab extends AbstractLaunchConfigurationTab {
-
-    /**
-     *
-     */
-    public static final String LAUNCH_TAB_IMAGE = "mainLaunchTab"; //$NON-NLS-1$
-
-    protected static final String EMPTY_STRING = ""; //$NON-NLS-1$
-
-    protected Text mProjText;
-    private Button mProjButton;
-
-    private Combo mActivityCombo;
-    private final ArrayList<Activity> mActivities = new ArrayList<Activity>();
-
-    private WidgetListener mListener = new WidgetListener();
-
-    private Button mDefaultActionButton;
-    private Button mActivityActionButton;
-    private Button mDoNothingActionButton;
-    private int mLaunchAction = LaunchConfigDelegate.DEFAULT_LAUNCH_ACTION;
-
-    private ProjectChooserHelper mProjectChooserHelper;
-
-    /**
-     * A listener which handles widget change events for the controls in this
-     * tab.
-     */
-    private class WidgetListener implements ModifyListener, SelectionListener {
-
-        @Override
-        public void modifyText(ModifyEvent e) {
-            IProject project = checkParameters();
-            loadActivities(project);
-            setDirty(true);
-        }
-
-        @Override
-        public void widgetDefaultSelected(SelectionEvent e) {/* do nothing */
-        }
-
-        @Override
-        public void widgetSelected(SelectionEvent e) {
-            Object source = e.getSource();
-            if (source == mProjButton) {
-                handleProjectButtonSelected();
-            } else {
-                checkParameters();
-            }
-        }
-    }
-
-    public MainLaunchConfigTab() {
-    }
-
-    protected IProjectChooserFilter getProjectFilter() {
-        return new NonLibraryProjectOnlyFilter();
-    }
-
-    @Override
-    public void createControl(Composite parent) {
-        mProjectChooserHelper = new ProjectChooserHelper(parent.getShell(), getProjectFilter());
-
-        Font font = parent.getFont();
-        Composite comp = new Composite(parent, SWT.NONE);
-        setControl(comp);
-        GridLayout topLayout = new GridLayout();
-        topLayout.verticalSpacing = 0;
-        comp.setLayout(topLayout);
-        comp.setFont(font);
-        createProjectEditor(comp);
-        createVerticalSpacer(comp, 1);
-
-        // create the combo for the activity chooser
-        Group group = new Group(comp, SWT.NONE);
-        group.setText("Launch Action:");
-        GridData gd = new GridData(GridData.FILL_HORIZONTAL);
-        group.setLayoutData(gd);
-        GridLayout layout = new GridLayout();
-        layout.numColumns = 2;
-        group.setLayout(layout);
-        group.setFont(font);
-
-        mDefaultActionButton = new Button(group, SWT.RADIO);
-        gd = new GridData(GridData.FILL_HORIZONTAL);
-        gd.horizontalSpan = 2;
-        mDefaultActionButton.setLayoutData(gd);
-        mDefaultActionButton.setText("Launch Default Activity");
-        mDefaultActionButton.addSelectionListener(new SelectionAdapter() {
-            @Override
-            public void widgetSelected(SelectionEvent e) {
-                // event are received for both selection and deselection, so we only process
-                // the selection event to avoid doing it twice.
-                if (mDefaultActionButton.getSelection() == true) {
-                    mLaunchAction = LaunchConfigDelegate.ACTION_DEFAULT;
-                    mActivityCombo.setEnabled(false);
-                    checkParameters();
-                }
-            }
-        });
-
-        mActivityActionButton = new Button(group, SWT.RADIO);
-        mActivityActionButton.setText("Launch:");
-        mActivityActionButton.addSelectionListener(new SelectionAdapter() {
-            @Override
-            public void widgetSelected(SelectionEvent e) {
-                // event are received for both selection and deselection, so we only process
-                // the selection event to avoid doing it twice.
-                if (mActivityActionButton.getSelection() == true) {
-                    mLaunchAction = LaunchConfigDelegate.ACTION_ACTIVITY;
-                    mActivityCombo.setEnabled(true);
-                    checkParameters();
-                }
-            }
-        });
-
-        mActivityCombo = new Combo(group, SWT.DROP_DOWN | SWT.READ_ONLY);
-        gd = new GridData(GridData.FILL_HORIZONTAL);
-        mActivityCombo.setLayoutData(gd);
-        mActivityCombo.clearSelection();
-        mActivityCombo.setEnabled(false);
-        mActivityCombo.addSelectionListener(new SelectionAdapter() {
-            @Override
-            public void widgetSelected(SelectionEvent e) {
-                checkParameters();
-            }
-        });
-
-        mDoNothingActionButton = new Button(group, SWT.RADIO);
-        gd = new GridData(GridData.FILL_HORIZONTAL);
-        gd.horizontalSpan = 2;
-        mDoNothingActionButton.setLayoutData(gd);
-        mDoNothingActionButton.setText("Do Nothing");
-        mDoNothingActionButton.addSelectionListener(new SelectionAdapter() {
-            @Override
-            public void widgetSelected(SelectionEvent e) {
-                // event are received for both selection and deselection, so we only process
-                // the selection event to avoid doing it twice.
-                if (mDoNothingActionButton.getSelection() == true) {
-                    mLaunchAction = LaunchConfigDelegate.ACTION_DO_NOTHING;
-                    mActivityCombo.setEnabled(false);
-                    checkParameters();
-                }
-            }
-        });
-
-    }
-
-    @Override
-    public String getName() {
-        return "Android";
-    }
-
-    @Override
-    public Image getImage() {
-        return IconFactory.getInstance().getIcon(LAUNCH_TAB_IMAGE);
-    }
-
-    @Override
-    public void performApply(ILaunchConfigurationWorkingCopy configuration) {
-        configuration.setAttribute(
-                IJavaLaunchConfigurationConstants.ATTR_PROJECT_NAME, mProjText.getText());
-        configuration.setAttribute(
-                IJavaLaunchConfigurationConstants.ATTR_ALLOW_TERMINATE, true);
-
-        // add the launch mode
-        configuration.setAttribute(LaunchConfigDelegate.ATTR_LAUNCH_ACTION, mLaunchAction);
-
-        // add the activity
-        int selection = mActivityCombo.getSelectionIndex();
-        if (mActivities != null && selection >=0 && selection < mActivities.size()) {
-            configuration.setAttribute(LaunchConfigDelegate.ATTR_ACTIVITY,
-                    mActivities.get(selection).getName());
-        }
-
-        // link the project and the launch config.
-        mapResources(configuration);
-    }
-
-    @Override
-    public void setDefaults(ILaunchConfigurationWorkingCopy configuration) {
-        configuration.setAttribute(LaunchConfigDelegate.ATTR_LAUNCH_ACTION,
-                LaunchConfigDelegate.DEFAULT_LAUNCH_ACTION);
-    }
-
-    /**
-     * Creates the widgets for specifying a main type.
-     *
-     * @param parent the parent composite
-     */
-    protected void createProjectEditor(Composite parent) {
-        Font font = parent.getFont();
-        Group group = new Group(parent, SWT.NONE);
-        group.setText("Project:");
-        GridData gd = new GridData(GridData.FILL_HORIZONTAL);
-        group.setLayoutData(gd);
-        GridLayout layout = new GridLayout();
-        layout.numColumns = 2;
-        group.setLayout(layout);
-        group.setFont(font);
-        mProjText = new Text(group, SWT.SINGLE | SWT.BORDER);
-        gd = new GridData(GridData.FILL_HORIZONTAL);
-        mProjText.setLayoutData(gd);
-        mProjText.setFont(font);
-        mProjText.addModifyListener(mListener);
-        mProjButton = createPushButton(group, "Browse...", null);
-        mProjButton.addSelectionListener(mListener);
-    }
-
-    /**
-     * returns the default listener from this class. For all subclasses this
-     * listener will only provide the functi Jaonality of updating the current
-     * tab
-     *
-     * @return a widget listener
-     */
-    protected WidgetListener getDefaultListener() {
-        return mListener;
-    }
-
-    /**
-     * Return the {@link IJavaProject} corresponding to the project name in the project
-     * name text field, or null if the text does not match a project name.
-     * @param javaModel the Java Model object corresponding for the current workspace root.
-     * @return a IJavaProject object or null.
-     */
-    protected IJavaProject getJavaProject(IJavaModel javaModel) {
-        String projectName = mProjText.getText().trim();
-        if (projectName.length() < 1) {
-            return null;
-        }
-        return javaModel.getJavaProject(projectName);
-    }
-
-    /**
-     * Show a dialog that lets the user select a project. This in turn provides
-     * context for the main type, allowing the user to key a main type name, or
-     * constraining the search for main types to the specified project.
-     */
-    protected void handleProjectButtonSelected() {
-        IJavaProject javaProject = mProjectChooserHelper.chooseJavaProject(
-                mProjText.getText().trim(),
-                "Please select a project to launch");
-        if (javaProject == null) {
-            return;
-        }// end if
-        String projectName = javaProject.getElementName();
-        mProjText.setText(projectName);
-
-        // get the list of activities and fill the combo
-        IProject project = javaProject.getProject();
-        loadActivities(project);
-    }// end handle selected
-
-    /**
-     * Initializes this tab's controls with values from the given
-     * launch configuration. This method is called when
-     * a configuration is selected to view or edit, after this
-     * tab's control has been created.
-     *
-     * @param config launch configuration
-     *
-     * @see ILaunchConfigurationTab
-     */
-    @Override
-    public void initializeFrom(ILaunchConfiguration config) {
-        String projectName = EMPTY_STRING;
-        try {
-            projectName = config.getAttribute(IJavaLaunchConfigurationConstants.ATTR_PROJECT_NAME,
-                    EMPTY_STRING);
-        }// end try
-        catch (CoreException ce) {
-        }
-        mProjText.setText(projectName);
-
-        IProject proj = mProjectChooserHelper.getAndroidProject(projectName);
-        loadActivities(proj);
-
-        // load the launch action.
-        mLaunchAction = LaunchConfigDelegate.DEFAULT_LAUNCH_ACTION;
-        try {
-            mLaunchAction = config.getAttribute(LaunchConfigDelegate.ATTR_LAUNCH_ACTION,
-                    mLaunchAction);
-        } catch (CoreException e) {
-            // nothing to be done really. launchAction will keep its default value.
-        }
-
-        mDefaultActionButton.setSelection(mLaunchAction == LaunchConfigDelegate.ACTION_DEFAULT);
-        mActivityActionButton.setSelection(mLaunchAction == LaunchConfigDelegate.ACTION_ACTIVITY);
-        mDoNothingActionButton.setSelection(
-                mLaunchAction == LaunchConfigDelegate.ACTION_DO_NOTHING);
-
-        // now look for the activity and load it if present, otherwise, revert
-        // to the current one.
-        String activityName = EMPTY_STRING;
-        try {
-            activityName = config.getAttribute(LaunchConfigDelegate.ATTR_ACTIVITY, EMPTY_STRING);
-        }// end try
-        catch (CoreException ce) {
-            // nothing to be done really. activityName will stay empty
-        }
-
-        if (mLaunchAction != LaunchConfigDelegate.ACTION_ACTIVITY) {
-            mActivityCombo.setEnabled(false);
-            mActivityCombo.clearSelection();
-        } else {
-            mActivityCombo.setEnabled(true);
-            if (activityName == null || activityName.equals(EMPTY_STRING)) {
-                mActivityCombo.clearSelection();
-            } else if (mActivities != null && mActivities.size() > 0) {
-                // look for the name of the activity in the combo.
-                boolean found = false;
-                for (int i = 0 ; i < mActivities.size() ; i++) {
-                    if (activityName.equals(mActivities.get(i).getName())) {
-                        found = true;
-                        mActivityCombo.select(i);
-                        break;
-                    }
-                }
-
-                // if we haven't found a matching activity we clear the combo selection
-                if (found == false) {
-                    mActivityCombo.clearSelection();
-                }
-            }
-        }
-    }
-
-    /**
-     * Associates the launch config and the project. This allows Eclipse to delete the launch
-     * config when the project is deleted.
-     *
-     * @param config the launch config working copy.
-     */
-    protected void mapResources(ILaunchConfigurationWorkingCopy config) {
-        // get the java model
-        IWorkspaceRoot workspaceRoot = ResourcesPlugin.getWorkspace().getRoot();
-        IJavaModel javaModel = JavaCore.create(workspaceRoot);
-
-        // get the IJavaProject described by the text field.
-        IJavaProject javaProject = getJavaProject(javaModel);
-        IResource[] resources = null;
-        if (javaProject != null) {
-            resources = AndroidLaunchController.getResourcesToMap(javaProject.getProject());
-        }
-        config.setMappedResources(resources);
-    }
-
-    /**
-     * Loads the ui with the activities of the specified project, and stores the
-     * activities in <code>mActivities</code>.
-     * <p/>
-     * First activity is selected by default if present.
-     *
-     * @param project The project to load the activities from.
-     */
-    private void loadActivities(IProject project) {
-        if (project != null) {
-            // parse the manifest for the list of activities.
-            ManifestData manifestData = AndroidManifestHelper.parseForData(project);
-            if (manifestData != null) {
-                Activity[] activities = manifestData.getActivities();
-
-                mActivities.clear();
-                mActivityCombo.removeAll();
-
-                for (Activity activity : activities) {
-                    if (activity.isExported() && activity.hasAction()) {
-                        mActivities.add(activity);
-                        mActivityCombo.add(activity.getName());
-                    }
-                }
-
-                if (mActivities.size() > 0) {
-                    if (mLaunchAction == LaunchConfigDelegate.ACTION_ACTIVITY) {
-                        mActivityCombo.setEnabled(true);
-                    }
-                } else {
-                    mActivityCombo.setEnabled(false);
-                }
-
-                // the selection will be set when we update the ui from the current
-                // config object.
-                mActivityCombo.clearSelection();
-
-                return;
-            }
-        }
-
-        // if we reach this point, either project is null, or we got an exception during
-        // the parsing. In either case, we empty the activity list.
-        mActivityCombo.removeAll();
-        mActivities.clear();
-    }
-
-    /**
-     * Checks the parameters for correctness, and update the error message and buttons.
-     * @return the current IProject of this launch config.
-     */
-    private IProject checkParameters() {
-        try {
-            //test the project name first!
-            String text = mProjText.getText();
-            if (text.length() == 0) {
-                setErrorMessage("Project Name is required!");
-            } else if (text.matches("[a-zA-Z0-9_ \\.-]+") == false) {
-                setErrorMessage("Project name contains unsupported characters!");
-            } else {
-                IJavaProject[] projects = mProjectChooserHelper.getAndroidProjects(null);
-                IProject found = null;
-                for (IJavaProject javaProject : projects) {
-                    if (javaProject.getProject().getName().equals(text)) {
-                        found = javaProject.getProject();
-                        break;
-                    }
-
-                }
-
-                if (found != null) {
-                    setErrorMessage(null);
-                } else {
-                    setErrorMessage(String.format("There is no android project named '%1$s'",
-                            text));
-                }
-
-                return found;
-            }
-        } finally {
-            updateLaunchConfigurationDialog();
-        }
-
-        return null;
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/launch/junit/AndroidJUnitLaunchAction.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/launch/junit/AndroidJUnitLaunchAction.java
deleted file mode 100644
index c773ab9..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/launch/junit/AndroidJUnitLaunchAction.java
+++ /dev/null
@@ -1,293 +0,0 @@
-/*
- * Copyright (C) 2009 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.launch.junit;
-
-import com.android.ddmlib.IDevice;
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.ide.eclipse.adt.internal.launch.DelayedLaunchInfo;
-import com.android.ide.eclipse.adt.internal.launch.IAndroidLaunchAction;
-import com.android.ide.eclipse.adt.internal.launch.LaunchMessages;
-import com.android.ide.eclipse.adt.internal.launch.junit.runtime.AndroidJUnitLaunchInfo;
-import com.android.ide.eclipse.adt.internal.launch.junit.runtime.RemoteAdtTestRunner;
-import com.google.common.base.Joiner;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.debug.core.ILaunch;
-import org.eclipse.debug.core.ILaunchConfiguration;
-import org.eclipse.debug.core.ILaunchManager;
-import org.eclipse.debug.core.model.IProcess;
-import org.eclipse.debug.core.model.IStreamsProxy;
-import org.eclipse.jdt.junit.launcher.JUnitLaunchConfigurationDelegate;
-import org.eclipse.jdt.launching.IVMRunner;
-import org.eclipse.jdt.launching.VMRunnerConfiguration;
-import org.eclipse.swt.widgets.Display;
-
-import java.util.Collection;
-
-/**
- * A launch action that executes a instrumentation test run on an Android device.
- */
-class AndroidJUnitLaunchAction implements IAndroidLaunchAction {
-    private static final Joiner JOINER = Joiner.on(',').skipNulls();
-    private final AndroidJUnitLaunchInfo mLaunchInfo;
-
-    /**
-     * Creates a AndroidJUnitLaunchAction.
-     *
-     * @param launchInfo the {@link AndroidJUnitLaunchInfo} for the JUnit run
-     */
-    public AndroidJUnitLaunchAction(AndroidJUnitLaunchInfo launchInfo) {
-        mLaunchInfo = launchInfo;
-    }
-
-    /**
-     * Launch a instrumentation test run on given Android devices.
-     * Reuses JDT JUnit launch delegate so results can be communicated back to JDT JUnit UI.
-     * <p/>
-     * Note: Must be executed on non-UI thread.
-     *
-     * @see IAndroidLaunchAction#doLaunchActions(DelayedLaunchInfo, IDevice)
-     */
-    @Override
-    public boolean doLaunchAction(DelayedLaunchInfo info, Collection<IDevice> devices) {
-        String msg = String.format(LaunchMessages.AndroidJUnitLaunchAction_LaunchInstr_2s,
-                mLaunchInfo.getRunner(), JOINER.join(devices));
-        AdtPlugin.printToConsole(info.getProject(), msg);
-
-        try {
-           mLaunchInfo.setDebugMode(info.isDebugMode());
-           mLaunchInfo.setDevices(devices);
-           JUnitLaunchDelegate junitDelegate = new JUnitLaunchDelegate(mLaunchInfo);
-           final String mode = info.isDebugMode() ? ILaunchManager.DEBUG_MODE :
-               ILaunchManager.RUN_MODE;
-
-           junitDelegate.launch(info.getLaunch().getLaunchConfiguration(), mode, info.getLaunch(),
-                   info.getMonitor());
-
-           // TODO: need to add AMReceiver-type functionality somewhere
-        } catch (CoreException e) {
-            AdtPlugin.printErrorToConsole(info.getProject(),
-                    LaunchMessages.AndroidJUnitLaunchAction_LaunchFail);
-        }
-        return true;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public String getLaunchDescription() {
-        return String.format(LaunchMessages.AndroidJUnitLaunchAction_LaunchDesc_s,
-                mLaunchInfo.getRunner());
-    }
-
-    /**
-     * Extends the JDT JUnit launch delegate to allow for JUnit UI reuse.
-     */
-    private static class JUnitLaunchDelegate extends JUnitLaunchConfigurationDelegate {
-
-        private AndroidJUnitLaunchInfo mLaunchInfo;
-
-        public JUnitLaunchDelegate(AndroidJUnitLaunchInfo launchInfo) {
-            mLaunchInfo = launchInfo;
-        }
-
-        /* (non-Javadoc)
-         * @see org.eclipse.jdt.junit.launcher.JUnitLaunchConfigurationDelegate#launch(org.eclipse.debug.core.ILaunchConfiguration, java.lang.String, org.eclipse.debug.core.ILaunch, org.eclipse.core.runtime.IProgressMonitor)
-         */
-        @Override
-        public synchronized void launch(ILaunchConfiguration configuration, String mode,
-                ILaunch launch, IProgressMonitor monitor) throws CoreException {
-            // TODO: is progress monitor adjustment needed here?
-            super.launch(configuration, mode, launch, monitor);
-        }
-
-        /**
-         * {@inheritDoc}
-         * @see org.eclipse.jdt.junit.launcher.JUnitLaunchConfigurationDelegate#verifyMainTypeName(org.eclipse.debug.core.ILaunchConfiguration)
-         */
-        @Override
-        public String verifyMainTypeName(ILaunchConfiguration configuration) {
-            return "com.android.ide.eclipse.adt.junit.internal.runner.RemoteAndroidTestRunner"; //$NON-NLS-1$
-        }
-
-        /**
-         * Overrides parent to return a VM Runner implementation which launches a thread, rather
-         * than a separate VM process
-         */
-        @Override
-        public IVMRunner getVMRunner(ILaunchConfiguration configuration, String mode) {
-            return new VMTestRunner(mLaunchInfo);
-        }
-
-        /**
-         * {@inheritDoc}
-         * @see org.eclipse.debug.core.model.LaunchConfigurationDelegate#getLaunch(org.eclipse.debug.core.ILaunchConfiguration, java.lang.String)
-         */
-        @Override
-        public ILaunch getLaunch(ILaunchConfiguration configuration, String mode) {
-            return mLaunchInfo.getLaunch();
-        }
-    }
-
-    /**
-     * Provides a VM runner implementation which starts a inline implementation of a launch process
-     */
-    private static class VMTestRunner implements IVMRunner {
-
-        private final AndroidJUnitLaunchInfo mJUnitInfo;
-
-        VMTestRunner(AndroidJUnitLaunchInfo info) {
-            mJUnitInfo = info;
-        }
-
-        /**
-         * {@inheritDoc}
-         * @throws CoreException
-         */
-        @Override
-        public void run(final VMRunnerConfiguration config, ILaunch launch,
-                IProgressMonitor monitor) throws CoreException {
-
-            TestRunnerProcess runnerProcess =
-                new TestRunnerProcess(config, mJUnitInfo);
-            launch.addProcess(runnerProcess);
-            runnerProcess.run();
-        }
-    }
-
-    /**
-     * Launch process that executes the tests.
-     */
-    private static class TestRunnerProcess implements IProcess  {
-
-        private final VMRunnerConfiguration mRunConfig;
-        private final AndroidJUnitLaunchInfo mJUnitInfo;
-        private RemoteAdtTestRunner mTestRunner = null;
-        private boolean mIsTerminated = false;
-
-        TestRunnerProcess(VMRunnerConfiguration runConfig, AndroidJUnitLaunchInfo info) {
-            mRunConfig = runConfig;
-            mJUnitInfo = info;
-        }
-
-        /* (non-Javadoc)
-         * @see org.eclipse.debug.core.model.IProcess#getAttribute(java.lang.String)
-         */
-        @Override
-        public String getAttribute(String key) {
-            return null;
-        }
-
-        /**
-         * {@inheritDoc}
-         * @see org.eclipse.debug.core.model.IProcess#getExitValue()
-         */
-        @Override
-        public int getExitValue() {
-            return 0;
-        }
-
-        /* (non-Javadoc)
-         * @see org.eclipse.debug.core.model.IProcess#getLabel()
-         */
-        @Override
-        public String getLabel() {
-            return mJUnitInfo.getLaunch().getLaunchMode();
-        }
-
-        /* (non-Javadoc)
-         * @see org.eclipse.debug.core.model.IProcess#getLaunch()
-         */
-        @Override
-        public ILaunch getLaunch() {
-            return mJUnitInfo.getLaunch();
-        }
-
-        /* (non-Javadoc)
-         * @see org.eclipse.debug.core.model.IProcess#getStreamsProxy()
-         */
-        @Override
-        public IStreamsProxy getStreamsProxy() {
-            return null;
-        }
-
-        /* (non-Javadoc)
-         * @see org.eclipse.debug.core.model.IProcess#setAttribute(java.lang.String,
-         * java.lang.String)
-         */
-        @Override
-        public void setAttribute(String key, String value) {
-            // ignore
-        }
-
-        /* (non-Javadoc)
-         * @see org.eclipse.core.runtime.IAdaptable#getAdapter(java.lang.Class)
-         */
-        @Override
-        public Object getAdapter(Class adapter) {
-            return null;
-        }
-
-        /* (non-Javadoc)
-         * @see org.eclipse.debug.core.model.ITerminate#canTerminate()
-         */
-        @Override
-        public boolean canTerminate() {
-            return true;
-        }
-
-        /* (non-Javadoc)
-         * @see org.eclipse.debug.core.model.ITerminate#isTerminated()
-         */
-        @Override
-        public boolean isTerminated() {
-            return mIsTerminated;
-        }
-
-        /**
-         * {@inheritDoc}
-         * @see org.eclipse.debug.core.model.ITerminate#terminate()
-         */
-        @Override
-        public void terminate() {
-            if (mTestRunner != null) {
-                mTestRunner.terminate();
-            }
-            mIsTerminated = true;
-        }
-
-        /**
-         * Launches a test runner that will communicate results back to JDT JUnit UI.
-         * <p/>
-         * Must be executed on a non-UI thread.
-         */
-        public void run() {
-            if (Display.getCurrent() != null) {
-                AdtPlugin.log(IStatus.ERROR, "Adt test runner executed on UI thread");
-                AdtPlugin.printErrorToConsole(mJUnitInfo.getProject(),
-                        "Test launch failed due to internal error: Running tests on UI thread");
-                terminate();
-                return;
-            }
-            mTestRunner = new RemoteAdtTestRunner();
-            mTestRunner.runTests(mRunConfig.getProgramArguments(), mJUnitInfo);
-        }
-    }
-}
-
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/launch/junit/AndroidJUnitLaunchConfigDelegate.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/launch/junit/AndroidJUnitLaunchConfigDelegate.java
deleted file mode 100755
index 6e47ce9..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/launch/junit/AndroidJUnitLaunchConfigDelegate.java
+++ /dev/null
@@ -1,286 +0,0 @@
-/*
- * Copyright (C) 2009 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.launch.junit;
-
-import com.android.SdkConstants;
-import com.android.ddmlib.testrunner.IRemoteAndroidTestRunner.TestSize;
-import com.android.ide.common.xml.ManifestData;
-import com.android.ide.common.xml.ManifestData.Instrumentation;
-import com.android.ide.eclipse.adt.AdtConstants;
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.ide.eclipse.adt.internal.launch.AndroidLaunch;
-import com.android.ide.eclipse.adt.internal.launch.AndroidLaunchConfiguration;
-import com.android.ide.eclipse.adt.internal.launch.AndroidLaunchController;
-import com.android.ide.eclipse.adt.internal.launch.IAndroidLaunchAction;
-import com.android.ide.eclipse.adt.internal.launch.LaunchConfigDelegate;
-import com.android.ide.eclipse.adt.internal.launch.LaunchMessages;
-import com.android.ide.eclipse.adt.internal.launch.junit.runtime.AndroidJUnitLaunchInfo;
-import com.android.ide.eclipse.adt.internal.project.BaseProjectHelper;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.core.runtime.jobs.Job;
-import org.eclipse.debug.core.ILaunchConfiguration;
-import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
-import org.eclipse.jdt.core.IJavaElement;
-import org.eclipse.jdt.core.JavaCore;
-import org.eclipse.jdt.internal.junit.launcher.JUnitLaunchConfigurationConstants;
-import org.eclipse.jdt.internal.junit.launcher.TestKindRegistry;
-import org.eclipse.jdt.launching.IJavaLaunchConfigurationConstants;
-import org.eclipse.swt.widgets.Display;
-
-/**
- * Run configuration that can execute JUnit tests on an Android platform.
- * <p/>
- * Will deploy apps on target Android platform by reusing functionality from ADT
- * LaunchConfigDelegate, and then run JUnits tests by reusing functionality from JDT
- * JUnitLaunchConfigDelegate.
- */
-@SuppressWarnings("restriction")
-public class AndroidJUnitLaunchConfigDelegate extends LaunchConfigDelegate {
-
-    /** Launch config attribute that stores instrumentation runner. */
-    static final String ATTR_INSTR_NAME = AdtPlugin.PLUGIN_ID + ".instrumentation"; //$NON-NLS-1$
-
-    /** Launch config attribute that stores the test size annotation to run. */
-    static final String ATTR_TEST_SIZE = AdtPlugin.PLUGIN_ID + ".testSize"; //$NON-NLS-1$
-
-    private static final String EMPTY_STRING = ""; //$NON-NLS-1$
-
-    @Override
-    protected void doLaunch(final ILaunchConfiguration configuration, final String mode,
-            final IProgressMonitor monitor, final IProject project,
-            final AndroidLaunch androidLaunch, final AndroidLaunchConfiguration config,
-            final AndroidLaunchController controller, final IFile applicationPackage,
-            final ManifestData manifestData) {
-
-        String runner = getRunner(project, configuration, manifestData);
-        if (runner == null) {
-            AdtPlugin.displayError(LaunchMessages.LaunchDialogTitle,
-                    String.format(LaunchMessages.AndroidJUnitDelegate_NoRunnerMsg_s,
-                            project.getName()));
-            androidLaunch.stopLaunch();
-            return;
-        }
-        // get the target app's package
-        final String targetAppPackage = getTargetPackage(manifestData, runner);
-        if (targetAppPackage == null) {
-            AdtPlugin.displayError(LaunchMessages.LaunchDialogTitle,
-                    String.format(LaunchMessages.AndroidJUnitDelegate_NoTargetMsg_3s,
-                            project.getName(), runner, SdkConstants.FN_ANDROID_MANIFEST_XML));
-            androidLaunch.stopLaunch();
-            return;
-        }
-        final String testAppPackage = manifestData.getPackage();
-        AndroidJUnitLaunchInfo junitLaunchInfo = new AndroidJUnitLaunchInfo(project,
-                testAppPackage, runner);
-        junitLaunchInfo.setTestClass(getTestClass(configuration));
-        junitLaunchInfo.setTestPackage(getTestPackage(configuration));
-        junitLaunchInfo.setTestMethod(getTestMethod(configuration));
-        junitLaunchInfo.setLaunch(androidLaunch);
-        junitLaunchInfo.setTestSize(getTestSize(configuration));
-        final IAndroidLaunchAction junitLaunch = new AndroidJUnitLaunchAction(junitLaunchInfo);
-
-        // launch on a separate thread if currently on the display thread
-        if (Display.getCurrent() != null) {
-            Job job = new Job("Junit Launch") {     //$NON-NLS-1$
-                @Override
-                protected IStatus run(IProgressMonitor m) {
-                    controller.launch(project, mode, applicationPackage, testAppPackage,
-                            targetAppPackage, manifestData.getDebuggable(),
-                            manifestData.getMinSdkVersionString(),
-                            junitLaunch, config, androidLaunch, monitor);
-                    return Status.OK_STATUS;
-                }
-            };
-            job.setPriority(Job.INTERACTIVE);
-            job.schedule();
-        } else {
-            controller.launch(project, mode, applicationPackage, testAppPackage, targetAppPackage,
-                    manifestData.getDebuggable(), manifestData.getMinSdkVersionString(),
-                    junitLaunch, config, androidLaunch, monitor);
-        }
-    }
-
-    /**
-     * Get the target Android application's package for the given instrumentation runner, or
-     * <code>null</code> if it could not be found.
-     *
-     * @param manifestParser the {@link ManifestData} for the test project
-     * @param runner the instrumentation runner class name
-     * @return the target package or <code>null</code>
-     */
-    private String getTargetPackage(ManifestData manifestParser, String runner) {
-        for (Instrumentation instr : manifestParser.getInstrumentations()) {
-            if (instr.getName().equals(runner)) {
-                return instr.getTargetPackage();
-            }
-        }
-        return null;
-    }
-
-    /**
-     * Returns the test package stored in the launch configuration, or <code>null</code> if not
-     * specified.
-     *
-     * @param configuration the {@link ILaunchConfiguration} to retrieve the test package info from
-     * @return the test package or <code>null</code>.
-     */
-    private String getTestPackage(ILaunchConfiguration configuration) {
-        // try to retrieve a package name from the JUnit container attribute
-        String containerHandle = getStringLaunchAttribute(
-                JUnitLaunchConfigurationConstants.ATTR_TEST_CONTAINER, configuration);
-        if (containerHandle != null && containerHandle.length() > 0) {
-            IJavaElement element = JavaCore.create(containerHandle);
-            // containerHandle could be a IProject, check if its a java package
-            if (element.getElementType() == IJavaElement.PACKAGE_FRAGMENT) {
-                return element.getElementName();
-            }
-        }
-        return null;
-    }
-
-    /**
-     * Returns the test class stored in the launch configuration.
-     *
-     * @param configuration the {@link ILaunchConfiguration} to retrieve the test class info from
-     * @return the test class. <code>null</code> if not specified.
-     */
-    private String getTestClass(ILaunchConfiguration configuration) {
-        return getStringLaunchAttribute(IJavaLaunchConfigurationConstants.ATTR_MAIN_TYPE_NAME,
-                configuration);
-    }
-
-    /**
-     * Returns the test method stored in the launch configuration.
-     *
-     * @param configuration the {@link ILaunchConfiguration} to retrieve the test method info from
-     * @return the test method. <code>null</code> if not specified.
-     */
-    private String getTestMethod(ILaunchConfiguration configuration) {
-        return getStringLaunchAttribute(JUnitLaunchConfigurationConstants.ATTR_TEST_METHOD_NAME,
-                configuration);
-    }
-
-    /**
-     * Returns the test sizes to run as saved in the launch configuration.
-     * @return {@link TestSize} if only tests of specific sizes should be run,
-     *         null if all tests should be run
-     */
-    private TestSize getTestSize(ILaunchConfiguration configuration) {
-        String testSizeAnnotation = getStringLaunchAttribute(
-                AndroidJUnitLaunchConfigDelegate.ATTR_TEST_SIZE,
-                configuration);
-        if (AndroidJUnitLaunchConfigurationTab.SMALL_TEST_ANNOTATION.equals(
-                    testSizeAnnotation)){
-            return TestSize.SMALL;
-        } else if (AndroidJUnitLaunchConfigurationTab.MEDIUM_TEST_ANNOTATION.equals(
-                    testSizeAnnotation)) {
-            return TestSize.MEDIUM;
-        } else if (AndroidJUnitLaunchConfigurationTab.LARGE_TEST_ANNOTATION.equals(
-                    testSizeAnnotation)) {
-            return TestSize.LARGE;
-        } else {
-            return null;
-        }
-    }
-
-    /**
-     * Gets a instrumentation runner for the launch.
-     * <p/>
-     * If a runner is stored in the given <code>configuration</code>, will return that.
-     * Otherwise, will try to find the first valid runner for the project.
-     * If a runner can still not be found, will return <code>null</code>, and will log an error
-     * to the console.
-     *
-     * @param project the {@link IProject} for the app
-     * @param configuration the {@link ILaunchConfiguration} for the launch
-     * @param manifestData the {@link ManifestData} for the project
-     *
-     * @return <code>null</code> if no instrumentation runner can be found, otherwise return
-     *   the fully qualified runner name.
-     */
-    private String getRunner(IProject project, ILaunchConfiguration configuration,
-            ManifestData manifestData) {
-        try {
-            String runner = getRunnerFromConfig(configuration);
-            if (runner != null) {
-                return runner;
-            }
-            final InstrumentationRunnerValidator instrFinder = new InstrumentationRunnerValidator(
-                    BaseProjectHelper.getJavaProject(project), manifestData);
-            runner = instrFinder.getValidInstrumentationTestRunner();
-            if (runner != null) {
-                AdtPlugin.printErrorToConsole(project, String.format(
-                        LaunchMessages.AndroidJUnitDelegate_NoRunnerConfigMsg_s, runner));
-                return runner;
-            }
-            AdtPlugin.printErrorToConsole(project, String.format(
-                    LaunchMessages.AndroidJUnitDelegate_NoRunnerConsoleMsg_4s,
-                    project.getName(),
-                    SdkConstants.CLASS_INSTRUMENTATION_RUNNER,
-                    AdtConstants.LIBRARY_TEST_RUNNER,
-                    SdkConstants.FN_ANDROID_MANIFEST_XML));
-            return null;
-        } catch (CoreException e) {
-            AdtPlugin.log(e, "Error when retrieving instrumentation info"); //$NON-NLS-1$
-        }
-
-        return null;
-    }
-
-    private String getRunnerFromConfig(ILaunchConfiguration configuration) {
-        return getStringLaunchAttribute(ATTR_INSTR_NAME, configuration);
-    }
-
-    /**
-     * Helper method to retrieve a string attribute from the launch configuration
-     *
-     * @param attributeName name of the launch attribute
-     * @param configuration the {@link ILaunchConfiguration} to retrieve the attribute from
-     * @return the attribute's value. <code>null</code> if not found.
-     */
-    private String getStringLaunchAttribute(String attributeName,
-            ILaunchConfiguration configuration) {
-        try {
-            String attrValue = configuration.getAttribute(attributeName, EMPTY_STRING);
-            if (attrValue.length() < 1) {
-                return null;
-            }
-            return attrValue;
-        } catch (CoreException e) {
-            AdtPlugin.log(e, String.format("Error when retrieving launch info %1$s",  //$NON-NLS-1$
-                    attributeName));
-        }
-        return null;
-    }
-
-    /**
-     * Helper method to set JUnit-related attributes expected by JDT JUnit runner
-     *
-     * @param config the launch configuration to modify
-     */
-    static void setJUnitDefaults(ILaunchConfigurationWorkingCopy config) {
-        // set the test runner to JUnit3 to placate JDT JUnit runner logic
-        config.setAttribute(JUnitLaunchConfigurationConstants.ATTR_TEST_RUNNER_KIND,
-                TestKindRegistry.JUNIT3_TEST_KIND_ID);
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/launch/junit/AndroidJUnitLaunchConfigurationTab.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/launch/junit/AndroidJUnitLaunchConfigurationTab.java
deleted file mode 100644
index 038f0b9..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/launch/junit/AndroidJUnitLaunchConfigurationTab.java
+++ /dev/null
@@ -1,1061 +0,0 @@
-/*
- * Copyright (C) 2009 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.launch.junit;
-
-import com.android.SdkConstants;
-import com.android.ide.eclipse.adt.AdtConstants;
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.ide.eclipse.adt.internal.editors.IconFactory;
-import com.android.ide.eclipse.adt.internal.launch.LaunchMessages;
-import com.android.ide.eclipse.adt.internal.launch.MainLaunchConfigTab;
-import com.android.ide.eclipse.adt.internal.project.BaseProjectHelper;
-import com.android.ide.eclipse.adt.internal.project.ProjectChooserHelper;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IWorkspaceRoot;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.debug.core.ILaunchConfiguration;
-import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
-import org.eclipse.debug.ui.AbstractLaunchConfigurationTab;
-import org.eclipse.jdt.core.IJavaElement;
-import org.eclipse.jdt.core.IJavaModel;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.IPackageFragment;
-import org.eclipse.jdt.core.IPackageFragmentRoot;
-import org.eclipse.jdt.core.ISourceReference;
-import org.eclipse.jdt.core.IType;
-import org.eclipse.jdt.core.JavaCore;
-import org.eclipse.jdt.core.JavaModelException;
-import org.eclipse.jdt.internal.junit.Messages;
-import org.eclipse.jdt.internal.junit.launcher.ITestKind;
-import org.eclipse.jdt.internal.junit.launcher.JUnitLaunchConfigurationConstants;
-import org.eclipse.jdt.internal.junit.launcher.JUnitMigrationDelegate;
-import org.eclipse.jdt.internal.junit.launcher.TestKindRegistry;
-import org.eclipse.jdt.internal.junit.launcher.TestSelectionDialog;
-import org.eclipse.jdt.internal.junit.ui.JUnitMessages;
-import org.eclipse.jdt.internal.junit.util.LayoutUtil;
-import org.eclipse.jdt.internal.junit.util.TestSearchEngine;
-import org.eclipse.jdt.internal.ui.wizards.TypedElementSelectionValidator;
-import org.eclipse.jdt.internal.ui.wizards.TypedViewerFilter;
-import org.eclipse.jdt.launching.IJavaLaunchConfigurationConstants;
-import org.eclipse.jdt.ui.JavaElementComparator;
-import org.eclipse.jdt.ui.JavaElementLabelProvider;
-import org.eclipse.jdt.ui.StandardJavaElementContentProvider;
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.jface.layout.GridDataFactory;
-import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerFilter;
-import org.eclipse.jface.window.Window;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Combo;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.dialogs.ElementTreeSelectionDialog;
-import org.eclipse.ui.dialogs.SelectionDialog;
-
-import java.lang.reflect.InvocationTargetException;
-import java.util.Arrays;
-import java.util.List;
-
-/**
- * The launch config UI tab for Android JUnit
- * <p/>
- * Based on org.eclipse.jdt.junit.launcher.JUnitLaunchConfigurationTab
- */
-@SuppressWarnings("restriction")
-public class AndroidJUnitLaunchConfigurationTab extends AbstractLaunchConfigurationTab {
-
-    // Project UI widgets
-    private Label mProjLabel;
-    private Text mProjText;
-    private Button mProjButton;
-
-    // Test class UI widgets
-    private Text mTestText;
-    private Button mSearchButton;
-    private String mOriginalTestMethodName;
-    private Label mTestMethodLabel;
-    private Text mContainerText;
-    private IJavaElement mContainerElement;
-    private final ILabelProvider mJavaElementLabelProvider = new JavaElementLabelProvider();
-
-    private Button mContainerSearchButton;
-    private Button mTestContainerRadioButton;
-    private Button mTestRadioButton;
-    private Label mTestLabel;
-
-    // Android specific members
-    private Image mTabIcon = null;
-    private Combo mInstrumentationCombo;
-    private Combo mTestSizeCombo;
-    private static final String EMPTY_STRING = ""; //$NON-NLS-1$
-    private static final String TAG = "AndroidJUnitLaunchConfigurationTab"; //$NON-NLS-1$
-    private String[] mInstrumentations = null;
-    private InstrumentationRunnerValidator mInstrValidator = null;
-    private ProjectChooserHelper mProjectChooserHelper;
-
-    public static final String SMALL_TEST_ANNOTATION = "@SmallTest";        //$NON-NLS-1$
-    public static final String MEDIUM_TEST_ANNOTATION = "@MediumTest";      //$NON-NLS-1$
-    public static final String LARGE_TEST_ANNOTATION = "@LargeTest";        //$NON-NLS-1$
-    private static final List<String> TEST_SIZE_OPTIONS = Arrays.asList(
-            "All Tests",
-            SMALL_TEST_ANNOTATION,
-            MEDIUM_TEST_ANNOTATION,
-            LARGE_TEST_ANNOTATION
-    );
-
-    /* (non-Javadoc)
-     * @see org.eclipse.debug.ui.ILaunchConfigurationTab#createControl(org.eclipse.swt.widgets.Composite)
-     */
-    @Override
-    public void createControl(Composite parent) {
-        mProjectChooserHelper = new ProjectChooserHelper(parent.getShell(), null /*filter*/);
-
-        Composite comp = new Composite(parent, SWT.NONE);
-        setControl(comp);
-
-        GridLayout topLayout = new GridLayout();
-        topLayout.numColumns = 3;
-        comp.setLayout(topLayout);
-
-        createSingleTestSection(comp);
-        createTestContainerSelectionGroup(comp);
-
-        createSpacer(comp);
-
-        createInstrumentationGroup(comp);
-        createSizeSelector(comp);
-
-        Dialog.applyDialogFont(comp);
-        // TODO: add help link here when available
-        //PlatformUI.getWorkbench().getHelpSystem().setHelp(getControl(),
-        //      IJUnitHelpContextIds.LAUNCH_CONFIGURATION_DIALOG_JUNIT_MAIN_TAB);
-        validatePage();
-    }
-
-
-    private void createSpacer(Composite comp) {
-        Label label = new Label(comp, SWT.NONE);
-        GridData gd = new GridData();
-        gd.horizontalSpan = 3;
-        label.setLayoutData(gd);
-    }
-
-    private void createSingleTestSection(Composite comp) {
-        mTestRadioButton = new Button(comp, SWT.RADIO);
-        mTestRadioButton.setText(JUnitMessages.JUnitLaunchConfigurationTab_label_oneTest);
-        GridData gd = new GridData();
-        gd.horizontalSpan = 3;
-        mTestRadioButton.setLayoutData(gd);
-        mTestRadioButton.addSelectionListener(new SelectionAdapter() {
-            @Override
-            public void widgetSelected(SelectionEvent e) {
-                if (mTestRadioButton.getSelection()) {
-                    testModeChanged();
-                }
-            }
-        });
-
-        mProjLabel = new Label(comp, SWT.NONE);
-        mProjLabel.setText(JUnitMessages.JUnitLaunchConfigurationTab_label_project);
-        gd = new GridData();
-        gd.horizontalIndent = 25;
-        mProjLabel.setLayoutData(gd);
-
-        mProjText = new Text(comp, SWT.SINGLE | SWT.BORDER);
-        mProjText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-        mProjText.addModifyListener(new ModifyListener() {
-            @Override
-            public void modifyText(ModifyEvent evt) {
-                validatePage();
-                updateLaunchConfigurationDialog();
-                mSearchButton.setEnabled(mTestRadioButton.getSelection() &&
-                        mProjText.getText().length() > 0);
-            }
-        });
-
-        mProjButton = new Button(comp, SWT.PUSH);
-        mProjButton.setText(JUnitMessages.JUnitLaunchConfigurationTab_label_browse);
-        mProjButton.addSelectionListener(new SelectionAdapter() {
-            @Override
-            public void widgetSelected(SelectionEvent evt) {
-                handleProjectButtonSelected();
-            }
-        });
-        setButtonGridData(mProjButton);
-
-        mTestLabel = new Label(comp, SWT.NONE);
-        gd = new GridData();
-        gd.horizontalIndent = 25;
-        mTestLabel.setLayoutData(gd);
-        mTestLabel.setText(JUnitMessages.JUnitLaunchConfigurationTab_label_test);
-
-
-        mTestText = new Text(comp, SWT.SINGLE | SWT.BORDER);
-        mTestText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-        mTestText.addModifyListener(new ModifyListener() {
-            @Override
-            public void modifyText(ModifyEvent evt) {
-                validatePage();
-                updateLaunchConfigurationDialog();
-            }
-        });
-
-        mSearchButton = new Button(comp, SWT.PUSH);
-        mSearchButton.setEnabled(mProjText.getText().length() > 0);
-        mSearchButton.setText(JUnitMessages.JUnitLaunchConfigurationTab_label_search);
-        mSearchButton.addSelectionListener(new SelectionAdapter() {
-            @Override
-            public void widgetSelected(SelectionEvent evt) {
-                handleSearchButtonSelected();
-            }
-        });
-        setButtonGridData(mSearchButton);
-
-        new Label(comp, SWT.NONE);
-
-        mTestMethodLabel = new Label(comp, SWT.NONE);
-        mTestMethodLabel.setText("");  //$NON-NLS-1$
-        gd = new GridData();
-        gd.horizontalSpan = 2;
-        mTestMethodLabel.setLayoutData(gd);
-    }
-
-    private void createTestContainerSelectionGroup(Composite comp) {
-        mTestContainerRadioButton = new Button(comp, SWT.RADIO);
-        mTestContainerRadioButton.setText(
-                LaunchMessages.AndroidJUnitTab_TestContainerText);
-        GridData gd = new GridData();
-        gd.horizontalSpan = 3;
-        mTestContainerRadioButton.setLayoutData(gd);
-        mTestContainerRadioButton.addSelectionListener(new SelectionAdapter() {
-            @Override
-            public void widgetSelected(SelectionEvent e) {
-                if (mTestContainerRadioButton.getSelection()) {
-                    testModeChanged();
-                }
-            }
-        });
-
-        mContainerText = new Text(comp, SWT.SINGLE | SWT.BORDER | SWT.READ_ONLY);
-        gd = new GridData(GridData.FILL_HORIZONTAL);
-        gd.horizontalIndent = 25;
-        gd.horizontalSpan = 2;
-        mContainerText.setLayoutData(gd);
-        mContainerText.addModifyListener(new ModifyListener() {
-            @Override
-            public void modifyText(ModifyEvent evt) {
-                updateLaunchConfigurationDialog();
-            }
-        });
-
-        mContainerSearchButton = new Button(comp, SWT.PUSH);
-        mContainerSearchButton.setText(JUnitMessages.JUnitLaunchConfigurationTab_label_search);
-        mContainerSearchButton.addSelectionListener(new SelectionAdapter() {
-            @Override
-            public void widgetSelected(SelectionEvent evt) {
-                handleContainerSearchButtonSelected();
-            }
-        });
-        setButtonGridData(mContainerSearchButton);
-    }
-
-    private void createInstrumentationGroup(Composite comp) {
-        Label loaderLabel = new Label(comp, SWT.NONE);
-        loaderLabel.setText(LaunchMessages.AndroidJUnitTab_LoaderLabel);
-        GridData gd = new GridData();
-        gd.horizontalIndent = 0;
-        loaderLabel.setLayoutData(gd);
-
-        mInstrumentationCombo = new Combo(comp, SWT.DROP_DOWN | SWT.READ_ONLY);
-        GridDataFactory.defaultsFor(mInstrumentationCombo)
-            .span(2, 1)
-            .applyTo(mInstrumentationCombo);
-        mInstrumentationCombo.clearSelection();
-        mInstrumentationCombo.addSelectionListener(new SelectionAdapter() {
-            @Override
-            public void widgetSelected(SelectionEvent e) {
-                validatePage();
-                updateLaunchConfigurationDialog();
-            }
-        });
-    }
-
-    private void createSizeSelector(Composite comp) {
-        Label l = new Label(comp, SWT.NONE);
-        l.setText(LaunchMessages.AndroidJUnitTab_SizeLabel);
-        GridData gd = new GridData();
-        gd.horizontalIndent = 0;
-        l.setLayoutData(gd);
-
-        mTestSizeCombo = new Combo(comp, SWT.DROP_DOWN | SWT.READ_ONLY);
-        mTestSizeCombo.setItems(TEST_SIZE_OPTIONS.toArray(new String[TEST_SIZE_OPTIONS.size()]));
-        mTestSizeCombo.select(0);
-        mTestSizeCombo.addSelectionListener(new SelectionAdapter() {
-            @Override
-            public void widgetSelected(SelectionEvent e) {
-                updateLaunchConfigurationDialog();
-            }
-        });
-    }
-
-    private void handleContainerSearchButtonSelected() {
-        IJavaElement javaElement = chooseContainer(mContainerElement);
-        if (javaElement != null) {
-            setContainerElement(javaElement);
-        }
-    }
-
-    private void setContainerElement(IJavaElement javaElement) {
-        mContainerElement = javaElement;
-        mContainerText.setText(getPresentationName(javaElement));
-        validatePage();
-        updateLaunchConfigurationDialog();
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.debug.ui.ILaunchConfigurationTab#initializeFrom(org.eclipse.debug.core.ILaunchConfiguration)
-     */
-    @Override
-    public void initializeFrom(ILaunchConfiguration config) {
-        String projectName = updateProjectFromConfig(config);
-        String containerHandle = EMPTY_STRING;
-        try {
-            containerHandle = config.getAttribute(
-                    JUnitLaunchConfigurationConstants.ATTR_TEST_CONTAINER, EMPTY_STRING);
-        } catch (CoreException ce) {
-            // ignore
-        }
-
-        if (containerHandle.length() > 0) {
-            updateTestContainerFromConfig(config);
-        } else {
-            updateTestTypeFromConfig(config);
-        }
-
-        IProject proj = mProjectChooserHelper.getAndroidProject(projectName);
-        loadInstrumentations(proj);
-        updateInstrumentationFromConfig(config);
-        updateTestSizeFromConfig(config);
-
-        validatePage();
-    }
-
-    private void updateInstrumentationFromConfig(ILaunchConfiguration config) {
-        boolean found = false;
-        try {
-            String currentInstrumentation = config.getAttribute(
-                    AndroidJUnitLaunchConfigDelegate.ATTR_INSTR_NAME, EMPTY_STRING);
-            if (mInstrumentations != null) {
-                // look for the name of the instrumentation in the combo.
-                for (int i = 0; i < mInstrumentations.length; i++) {
-                   if (currentInstrumentation.equals(mInstrumentations[i])) {
-                       found = true;
-                       mInstrumentationCombo.select(i);
-                       break;
-                    }
-                }
-            }
-        } catch (CoreException ce) {
-            // ignore
-        }
-        if (!found) {
-            mInstrumentationCombo.clearSelection();
-        }
-    }
-
-    private void updateTestSizeFromConfig(ILaunchConfiguration config) {
-        try {
-            String testSize = config.getAttribute(
-                    AndroidJUnitLaunchConfigDelegate.ATTR_TEST_SIZE, EMPTY_STRING);
-            int index = TEST_SIZE_OPTIONS.indexOf(testSize);
-            if (index >= 0 && mTestSizeCombo != null) {
-                mTestSizeCombo.select(index);
-            }
-        } catch (CoreException e) {
-            // ignore
-        }
-    }
-
-    private String updateProjectFromConfig(ILaunchConfiguration config) {
-        String projectName = EMPTY_STRING;
-        try {
-            projectName = config.getAttribute(IJavaLaunchConfigurationConstants.ATTR_PROJECT_NAME,
-                    EMPTY_STRING);
-        } catch (CoreException ce) {
-            // ignore
-        }
-        mProjText.setText(projectName);
-        return projectName;
-    }
-
-    private void updateTestTypeFromConfig(ILaunchConfiguration config) {
-        String testTypeName = EMPTY_STRING;
-        mOriginalTestMethodName = EMPTY_STRING;
-        try {
-            testTypeName = config.getAttribute(
-                    IJavaLaunchConfigurationConstants.ATTR_MAIN_TYPE_NAME, ""); //$NON-NLS-1$
-            mOriginalTestMethodName = config.getAttribute(
-                    JUnitLaunchConfigurationConstants.ATTR_TEST_METHOD_NAME, ""); //$NON-NLS-1$
-        } catch (CoreException ce) {
-            // ignore
-        }
-        mTestRadioButton.setSelection(true);
-        setEnableSingleTestGroup(true);
-        setEnableContainerTestGroup(false);
-        mTestContainerRadioButton.setSelection(false);
-        mTestText.setText(testTypeName);
-        mContainerText.setText(EMPTY_STRING);
-        setTestMethodLabel(mOriginalTestMethodName);
-    }
-
-    private void setTestMethodLabel(String testMethodName) {
-        if (!EMPTY_STRING.equals(testMethodName)) {
-            mTestMethodLabel.setText(
-                    JUnitMessages.JUnitLaunchConfigurationTab_label_method +
-                    mOriginalTestMethodName);
-        } else {
-            mTestMethodLabel.setText(EMPTY_STRING);
-        }
-    }
-
-    private void updateTestContainerFromConfig(ILaunchConfiguration config) {
-        String containerHandle = EMPTY_STRING;
-        IJavaElement containerElement = null;
-        try {
-            containerHandle = config.getAttribute(
-                    JUnitLaunchConfigurationConstants.ATTR_TEST_CONTAINER, EMPTY_STRING);
-            if (containerHandle.length() > 0) {
-                containerElement = JavaCore.create(containerHandle);
-            }
-        } catch (CoreException ce) {
-            // ignore
-        }
-        if (containerElement != null) {
-            mContainerElement = containerElement;
-        }
-        mTestContainerRadioButton.setSelection(true);
-        setEnableSingleTestGroup(false);
-        setEnableContainerTestGroup(true);
-        mTestRadioButton.setSelection(false);
-        if (mContainerElement != null) {
-            mContainerText.setText(getPresentationName(mContainerElement));
-        }
-        mTestText.setText(EMPTY_STRING);
-    }
-
-    /*
-     * (non-Javadoc)
-     * @see org.eclipse.debug.ui.ILaunchConfigurationTab#performApply(org.eclipse.debug.core.ILaunchConfigurationWorkingCopy)
-     */
-    @Override
-    public void performApply(ILaunchConfigurationWorkingCopy config) {
-        if (mTestContainerRadioButton.getSelection() && mContainerElement != null) {
-            config.setAttribute(IJavaLaunchConfigurationConstants.ATTR_PROJECT_NAME,
-                    mContainerElement.getJavaProject().getElementName());
-            config.setAttribute(JUnitLaunchConfigurationConstants.ATTR_TEST_CONTAINER,
-                    mContainerElement.getHandleIdentifier());
-            config.setAttribute(IJavaLaunchConfigurationConstants.ATTR_MAIN_TYPE_NAME,
-                    EMPTY_STRING);
-             //workaround for Eclipse bug 65399
-            config.setAttribute(JUnitLaunchConfigurationConstants.ATTR_TEST_METHOD_NAME,
-                    EMPTY_STRING);
-        } else {
-            config.setAttribute(IJavaLaunchConfigurationConstants.ATTR_PROJECT_NAME,
-                    mProjText.getText());
-            config.setAttribute(IJavaLaunchConfigurationConstants.ATTR_MAIN_TYPE_NAME,
-                    mTestText.getText());
-            config.setAttribute(JUnitLaunchConfigurationConstants.ATTR_TEST_CONTAINER,
-                    EMPTY_STRING);
-            config.setAttribute(JUnitLaunchConfigurationConstants.ATTR_TEST_METHOD_NAME,
-                    mOriginalTestMethodName);
-        }
-        try {
-            mapResources(config);
-        } catch (CoreException e) {
-            // TODO: does the real error need to be extracted out of CoreException
-            AdtPlugin.log(e, "Error occurred saving configuration"); //$NON-NLS-1$
-        }
-        AndroidJUnitLaunchConfigDelegate.setJUnitDefaults(config);
-
-        config.setAttribute(AndroidJUnitLaunchConfigDelegate.ATTR_INSTR_NAME,
-                getSelectedInstrumentation());
-        config.setAttribute(AndroidJUnitLaunchConfigDelegate.ATTR_TEST_SIZE,
-                getSelectedTestSize());
-    }
-
-    private void mapResources(ILaunchConfigurationWorkingCopy config)  throws CoreException {
-        JUnitMigrationDelegate.mapResources(config);
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.debug.ui.AbstractLaunchConfigurationTab#dispose()
-     */
-    @Override
-    public void dispose() {
-        super.dispose();
-        mTabIcon = null;
-        mJavaElementLabelProvider.dispose();
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.debug.ui.AbstractLaunchConfigurationTab#getImage()
-     */
-    @Override
-    public Image getImage() {
-        // reuse icon from the Android App Launch config tab
-        if (mTabIcon == null) {
-            mTabIcon = IconFactory.getInstance().getIcon(MainLaunchConfigTab.LAUNCH_TAB_IMAGE);
-        }
-        return mTabIcon;
-    }
-
-    /**
-     * Show a dialog that lists all main types
-     */
-    private void handleSearchButtonSelected() {
-        Shell shell = getShell();
-
-        IJavaProject javaProject = getJavaProject();
-
-        IType[] types = new IType[0];
-        boolean[] radioSetting = new boolean[2];
-        try {
-            // fix for Eclipse bug 66922 Wrong radio behaviour when switching
-            // remember the selected radio button
-            radioSetting[0] = mTestRadioButton.getSelection();
-            radioSetting[1] = mTestContainerRadioButton.getSelection();
-
-            types = TestSearchEngine.findTests(getLaunchConfigurationDialog(), javaProject,
-                    getTestKind());
-        } catch (InterruptedException e) {
-            setErrorMessage(e.getMessage());
-            return;
-        } catch (InvocationTargetException e) {
-            AdtPlugin.log(e.getTargetException(), "Error finding test types"); //$NON-NLS-1$
-            return;
-        } finally {
-            mTestRadioButton.setSelection(radioSetting[0]);
-            mTestContainerRadioButton.setSelection(radioSetting[1]);
-        }
-
-        SelectionDialog dialog = new TestSelectionDialog(shell, types);
-        dialog.setTitle(JUnitMessages.JUnitLaunchConfigurationTab_testdialog_title);
-        dialog.setMessage(JUnitMessages.JUnitLaunchConfigurationTab_testdialog_message);
-        if (dialog.open() == Window.CANCEL) {
-            return;
-        }
-
-        Object[] results = dialog.getResult();
-        if ((results == null) || (results.length < 1)) {
-            return;
-        }
-        IType type = (IType) results[0];
-
-        if (type != null) {
-            mTestText.setText(type.getFullyQualifiedName('.'));
-            javaProject = type.getJavaProject();
-            mProjText.setText(javaProject.getElementName());
-        }
-    }
-
-    private ITestKind getTestKind() {
-        // harddcode this to JUnit 3
-        return TestKindRegistry.getDefault().getKind(TestKindRegistry.JUNIT3_TEST_KIND_ID);
-    }
-
-    /**
-     * Show a dialog that lets the user select a Android project.  This in turn provides
-     * context for the main type, allowing the user to key a main type name, or
-     * constraining the search for main types to the specified project.
-     */
-    private void handleProjectButtonSelected() {
-        IJavaProject project = mProjectChooserHelper.chooseJavaProject(getProjectName(),
-                "Please select a project to launch");
-        if (project == null) {
-            return;
-        }
-
-        String projectName = project.getElementName();
-        mProjText.setText(projectName);
-        loadInstrumentations(project.getProject());
-    }
-
-    /**
-     * Return the IJavaProject corresponding to the project name in the project name
-     * text field, or null if the text does not match a Android project name.
-     */
-    private IJavaProject getJavaProject() {
-        String projectName = getProjectName();
-        return getJavaModel().getJavaProject(projectName);
-    }
-
-    /**
-     * Returns the name of the currently specified project. Null if no project is selected.
-     */
-    private String getProjectName() {
-        String projectName = mProjText.getText().trim();
-        if (projectName.length() < 1) {
-            return null;
-        }
-        return projectName;
-    }
-
-    /**
-     * Convenience method to get the workspace root.
-     */
-    private IWorkspaceRoot getWorkspaceRoot() {
-        return ResourcesPlugin.getWorkspace().getRoot();
-    }
-
-    /**
-     * Convenience method to get access to the java model.
-     */
-    private IJavaModel getJavaModel() {
-        return JavaCore.create(getWorkspaceRoot());
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.debug.ui.AbstractLaunchConfigurationTab#isValid(org.eclipse.debug.core.ILaunchConfiguration)
-     */
-    @Override
-    public boolean isValid(ILaunchConfiguration config) {
-        validatePage();
-        return getErrorMessage() == null;
-    }
-
-    private void testModeChanged() {
-        boolean isSingleTestMode = mTestRadioButton.getSelection();
-        setEnableSingleTestGroup(isSingleTestMode);
-        setEnableContainerTestGroup(!isSingleTestMode);
-        if (!isSingleTestMode && mContainerText.getText().length() == 0) {
-            String projText = mProjText.getText();
-            if (Path.EMPTY.isValidSegment(projText)) {
-                IJavaProject javaProject = getJavaModel().getJavaProject(projText);
-                if (javaProject != null && javaProject.exists()) {
-                    setContainerElement(javaProject);
-                }
-            }
-        }
-        validatePage();
-        updateLaunchConfigurationDialog();
-    }
-
-    private void validatePage() {
-        setErrorMessage(null);
-        setMessage(null);
-
-        if (mTestContainerRadioButton.getSelection()) {
-            if (mContainerElement == null) {
-                setErrorMessage(JUnitMessages.JUnitLaunchConfigurationTab_error_noContainer);
-                return;
-            }
-            validateJavaProject(mContainerElement.getJavaProject());
-            return;
-        }
-
-        String projectName = mProjText.getText().trim();
-        if (projectName.length() == 0) {
-            setErrorMessage(JUnitMessages.JUnitLaunchConfigurationTab_error_projectnotdefined);
-            return;
-        }
-
-        IStatus status = ResourcesPlugin.getWorkspace().validatePath(IPath.SEPARATOR + projectName,
-                IResource.PROJECT);
-        if (!status.isOK() || !Path.ROOT.isValidSegment(projectName)) {
-            setErrorMessage(Messages.format(
-                    JUnitMessages.JUnitLaunchConfigurationTab_error_invalidProjectName,
-                    projectName));
-            return;
-        }
-
-        IProject project = getWorkspaceRoot().getProject(projectName);
-        if (!project.exists()) {
-            setErrorMessage(JUnitMessages.JUnitLaunchConfigurationTab_error_projectnotexists);
-            return;
-        }
-        IJavaProject javaProject = JavaCore.create(project);
-        validateJavaProject(javaProject);
-
-        try {
-            if (!project.hasNature(AdtConstants.NATURE_DEFAULT)) {
-                setErrorMessage(
-                        LaunchMessages.NonAndroidProjectError);
-                return;
-            }
-            String className = mTestText.getText().trim();
-            if (className.length() == 0) {
-                setErrorMessage(JUnitMessages.JUnitLaunchConfigurationTab_error_testnotdefined);
-                return;
-            }
-            if (javaProject.findType(className) == null) {
-                setErrorMessage(Messages.format(
-                        JUnitMessages.JUnitLaunchConfigurationTab_error_test_class_not_found,
-                        new String[] { className, projectName }));
-                return;
-            }
-        } catch (CoreException e) {
-            AdtPlugin.log(e, "validatePage failed"); //$NON-NLS-1$
-        }
-
-        validateInstrumentation();
-    }
-
-    private void validateJavaProject(IJavaProject javaProject) {
-        if (!TestSearchEngine.hasTestCaseType(javaProject)) {
-            setErrorMessage(JUnitMessages.JUnitLaunchConfigurationTab_error_testcasenotonpath);
-            return;
-        }
-    }
-
-    private void validateInstrumentation() {
-        String instrumentation = getSelectedInstrumentation();
-        if (instrumentation == null) {
-            setErrorMessage(LaunchMessages.AndroidJUnitTab_NoRunnerError);
-            return;
-        }
-        String result = mInstrValidator.validateInstrumentationRunner(instrumentation);
-        if (result != InstrumentationRunnerValidator.INSTRUMENTATION_OK) {
-            setErrorMessage(result);
-            return;
-        }
-    }
-
-    private String getSelectedInstrumentation() {
-        int selectionIndex = mInstrumentationCombo.getSelectionIndex();
-        if (mInstrumentations != null && selectionIndex >= 0 &&
-                selectionIndex < mInstrumentations.length) {
-            return mInstrumentations[selectionIndex];
-        }
-        return null;
-    }
-
-    private String getSelectedTestSize() {
-        if (mTestSizeCombo != null) {
-            int index = mTestSizeCombo.getSelectionIndex();
-            return TEST_SIZE_OPTIONS.get(index);
-        } else {
-            return null;
-        }
-    }
-
-    private void setEnableContainerTestGroup(boolean enabled) {
-        mContainerSearchButton.setEnabled(enabled);
-        mContainerText.setEnabled(enabled);
-    }
-
-    private void setEnableSingleTestGroup(boolean enabled) {
-        mProjLabel.setEnabled(enabled);
-        mProjText.setEnabled(enabled);
-        mProjButton.setEnabled(enabled);
-        mTestLabel.setEnabled(enabled);
-        mTestText.setEnabled(enabled);
-        mSearchButton.setEnabled(enabled && mProjText.getText().length() > 0);
-        mTestMethodLabel.setEnabled(enabled);
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.debug.ui.ILaunchConfigurationTab#setDefaults(org.eclipse.debug.core.ILaunchConfigurationWorkingCopy)
-     */
-    @Override
-    public void setDefaults(ILaunchConfigurationWorkingCopy config) {
-        IJavaElement javaElement = getContext();
-        if (javaElement != null) {
-            initializeJavaProject(javaElement, config);
-        } else {
-            // We set empty attributes for project & main type so that when one config is
-            // compared to another, the existence of empty attributes doesn't cause an
-            // incorrect result (the performApply() method can result in empty values
-            // for these attributes being set on a config if there is nothing in the
-            // corresponding text boxes)
-            config.setAttribute(IJavaLaunchConfigurationConstants.ATTR_PROJECT_NAME, EMPTY_STRING);
-            config.setAttribute(JUnitLaunchConfigurationConstants.ATTR_TEST_CONTAINER,
-                    EMPTY_STRING);
-        }
-        initializeTestAttributes(javaElement, config);
-    }
-
-    private void initializeTestAttributes(IJavaElement javaElement,
-            ILaunchConfigurationWorkingCopy config) {
-        if (javaElement != null && javaElement.getElementType() < IJavaElement.COMPILATION_UNIT) {
-            initializeTestContainer(javaElement, config);
-        } else {
-            initializeTestType(javaElement, config);
-        }
-    }
-
-    private void initializeTestContainer(IJavaElement javaElement,
-            ILaunchConfigurationWorkingCopy config) {
-        config.setAttribute(JUnitLaunchConfigurationConstants.ATTR_TEST_CONTAINER,
-                javaElement.getHandleIdentifier());
-        initializeName(config, javaElement.getElementName());
-    }
-
-    private void initializeName(ILaunchConfigurationWorkingCopy config, String name) {
-        if (name == null) {
-            name = EMPTY_STRING;
-        }
-        if (name.length() > 0) {
-            int index = name.lastIndexOf('.');
-            if (index > 0) {
-                name = name.substring(index + 1);
-            }
-            name = getLaunchConfigurationDialog().generateName(name);
-            config.rename(name);
-        }
-    }
-
-    /**
-     * Sets the main type & name attributes on the working copy based on the IJavaElement
-     */
-    private void initializeTestType(IJavaElement javaElement,
-            ILaunchConfigurationWorkingCopy config) {
-        String name = EMPTY_STRING;
-        String testKindId = null;
-        try {
-            // only do a search for compilation units or class files or source references
-            if (javaElement instanceof ISourceReference) {
-                ITestKind testKind = TestKindRegistry.getContainerTestKind(javaElement);
-                testKindId = testKind.getId();
-
-                IType[] types = TestSearchEngine.findTests(getLaunchConfigurationDialog(),
-                        javaElement, testKind);
-                if ((types == null) || (types.length < 1)) {
-                    return;
-                }
-                // Simply grab the first main type found in the searched element
-                name = types[0].getFullyQualifiedName('.');
-
-            }
-        } catch (InterruptedException ie) {
-            // ignore
-        } catch (InvocationTargetException ite) {
-            // ignore
-        }
-        config.setAttribute(IJavaLaunchConfigurationConstants.ATTR_MAIN_TYPE_NAME, name);
-        if (testKindId != null) {
-            config.setAttribute(JUnitLaunchConfigurationConstants.ATTR_TEST_RUNNER_KIND,
-                    testKindId);
-        }
-        initializeName(config, name);
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.debug.ui.ILaunchConfigurationTab#getName()
-     */
-    @Override
-    public String getName() {
-        return JUnitMessages.JUnitLaunchConfigurationTab_tab_label;
-    }
-
-    private IJavaElement chooseContainer(IJavaElement initElement) {
-        @SuppressWarnings("rawtypes")
-        Class[] acceptedClasses = new Class[] { IJavaProject.class,
-                IPackageFragment.class };
-        TypedElementSelectionValidator validator = new TypedElementSelectionValidator(
-                acceptedClasses, false) {
-            @Override
-            public boolean isSelectedValid(Object element) {
-                return true;
-            }
-        };
-
-        acceptedClasses = new Class[] { IJavaModel.class, IPackageFragmentRoot.class,
-                IJavaProject.class, IPackageFragment.class };
-        ViewerFilter filter = new TypedViewerFilter(acceptedClasses) {
-            @Override
-            public boolean select(Viewer viewer, Object parent, Object element) {
-                if (element instanceof IPackageFragmentRoot &&
-                        ((IPackageFragmentRoot) element).isArchive()) {
-                    return false;
-                }
-                try {
-                    if (element instanceof IPackageFragment &&
-                            !((IPackageFragment) element).hasChildren()) {
-                        return false;
-                    }
-                } catch (JavaModelException e) {
-                    return false;
-                }
-                return super.select(viewer, parent, element);
-            }
-        };
-
-        AndroidJavaElementContentProvider provider = new AndroidJavaElementContentProvider();
-        ILabelProvider labelProvider = new JavaElementLabelProvider(
-                JavaElementLabelProvider.SHOW_DEFAULT);
-        ElementTreeSelectionDialog dialog = new ElementTreeSelectionDialog(getShell(),
-                labelProvider, provider);
-        dialog.setValidator(validator);
-        dialog.setComparator(new JavaElementComparator());
-        dialog.setTitle(JUnitMessages.JUnitLaunchConfigurationTab_folderdialog_title);
-        dialog.setMessage(JUnitMessages.JUnitLaunchConfigurationTab_folderdialog_message);
-        dialog.addFilter(filter);
-        dialog.setInput(JavaCore.create(getWorkspaceRoot()));
-        dialog.setInitialSelection(initElement);
-        dialog.setAllowMultiple(false);
-
-        if (dialog.open() == Window.OK) {
-            Object element = dialog.getFirstResult();
-            return (IJavaElement) element;
-        }
-        return null;
-    }
-
-    private String getPresentationName(IJavaElement element) {
-        return mJavaElementLabelProvider.getText(element);
-    }
-
-    /**
-     * Returns the current Java element context from which to initialize
-     * default settings, or <code>null</code> if none.
-     *
-     * @return Java element context.
-     */
-    private IJavaElement getContext() {
-        IWorkbenchWindow activeWorkbenchWindow =
-            PlatformUI.getWorkbench().getActiveWorkbenchWindow();
-        if (activeWorkbenchWindow == null) {
-            return null;
-        }
-        IWorkbenchPage page = activeWorkbenchWindow.getActivePage();
-        if (page != null) {
-            ISelection selection = page.getSelection();
-            if (selection instanceof IStructuredSelection) {
-                IStructuredSelection ss = (IStructuredSelection) selection;
-                if (!ss.isEmpty()) {
-                    Object obj = ss.getFirstElement();
-                    if (obj instanceof IJavaElement) {
-                        return (IJavaElement) obj;
-                    }
-                    if (obj instanceof IResource) {
-                        IJavaElement je = JavaCore.create((IResource) obj);
-                        if (je == null) {
-                            IProject pro = ((IResource) obj).getProject();
-                            je = JavaCore.create(pro);
-                        }
-                        if (je != null) {
-                            return je;
-                        }
-                    }
-                }
-            }
-            IEditorPart part = page.getActiveEditor();
-            if (part != null) {
-                IEditorInput input = part.getEditorInput();
-                return (IJavaElement) input.getAdapter(IJavaElement.class);
-            }
-        }
-        return null;
-    }
-
-    private void initializeJavaProject(IJavaElement javaElement,
-            ILaunchConfigurationWorkingCopy config) {
-        IJavaProject javaProject = javaElement.getJavaProject();
-        String name = null;
-        if (javaProject != null && javaProject.exists()) {
-            name = javaProject.getElementName();
-        }
-        config.setAttribute(IJavaLaunchConfigurationConstants.ATTR_PROJECT_NAME, name);
-    }
-
-    private void setButtonGridData(Button button) {
-        GridData gridData = new GridData();
-        button.setLayoutData(gridData);
-        LayoutUtil.setButtonDimensionHint(button);
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.debug.ui.AbstractLaunchConfigurationTab#getId()
-     */
-    @Override
-    public String getId() {
-        return "com.android.ide.eclipse.adt.launch.AndroidJUnitLaunchConfigurationTab"; //$NON-NLS-1$
-    }
-
-    /**
-     * Loads the UI with the instrumentations of the specified project, and stores the
-     * instrumentations in <code>mInstrumentations</code>.
-     *
-     * @param project the {@link IProject} to load the instrumentations from.
-     */
-    private void loadInstrumentations(IProject project) {
-        try {
-            mInstrValidator = new InstrumentationRunnerValidator(project);
-            mInstrumentations = mInstrValidator.getInstrumentationNames();
-            if (mInstrumentations.length > 0) {
-                mInstrumentationCombo.removeAll();
-                for (String instrumentation : mInstrumentations) {
-                    mInstrumentationCombo.add(instrumentation);
-                }
-                // the selection will be set when we update the ui from the current
-                // config object.
-                return;
-            }
-        } catch (CoreException e) {
-            AdtPlugin.logAndPrintError(e, project.getName(),
-                    LaunchMessages.AndroidJUnitTab_LoadInstrError_s,
-                    SdkConstants.FN_ANDROID_MANIFEST_XML);
-        }
-        // if we reach this point, either project is null, or we got an exception during
-        // the parsing. In either case, we empty the instrumentation list.
-        mInstrValidator = null;
-        mInstrumentations = null;
-        mInstrumentationCombo.removeAll();
-    }
-
-    /**
-     * Overrides the {@link StandardJavaElementContentProvider} to only display Android projects
-     */
-    private static class AndroidJavaElementContentProvider
-            extends StandardJavaElementContentProvider {
-
-        /**
-         * Override parent to return only Android projects if at the root. Otherwise, use parent
-         * functionality.
-         */
-        @Override
-        public Object[] getChildren(Object element) {
-            if (element instanceof IJavaModel) {
-                return BaseProjectHelper.getAndroidProjects((IJavaModel) element, null /*filter*/);
-            }
-            return super.getChildren(element);
-        }
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/launch/junit/AndroidJUnitLaunchShortcut.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/launch/junit/AndroidJUnitLaunchShortcut.java
deleted file mode 100755
index b94ced8..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/launch/junit/AndroidJUnitLaunchShortcut.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * Copyright (C) 2009 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.launch.junit;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
-import org.eclipse.jdt.core.IJavaElement;
-import org.eclipse.jdt.junit.launcher.JUnitLaunchShortcut;
-
-/**
- * Launch shortcut to launch debug/run Android JUnit configuration directly.
- */
-public class AndroidJUnitLaunchShortcut extends JUnitLaunchShortcut {
-
-    @Override
-    protected String getLaunchConfigurationTypeId() {
-        return "com.android.ide.eclipse.adt.junit.launchConfigurationType"; //$NON-NLS-1$
-    }
-
-    /**
-     * Creates a default Android JUnit launch configuration. Sets the instrumentation runner to the
-     * first instrumentation found in the AndroidManifest.
-     */
-    @Override
-    protected ILaunchConfigurationWorkingCopy createLaunchConfiguration(IJavaElement element)
-            throws CoreException {
-        ILaunchConfigurationWorkingCopy config = super.createLaunchConfiguration(element);
-        // just get first valid instrumentation runner
-        String instrumentation = new InstrumentationRunnerValidator(element.getJavaProject()).
-                getValidInstrumentationTestRunner();
-        if (instrumentation != null) {
-            config.setAttribute(AndroidJUnitLaunchConfigDelegate.ATTR_INSTR_NAME, 
-                    instrumentation);
-        }
-        // if a valid runner is not found, rely on launch delegate to log error.
-        // This method is called without explicit user action to launch Android JUnit, so avoid
-        // logging an error here.
-
-        AndroidJUnitLaunchConfigDelegate.setJUnitDefaults(config);
-        return config;
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/launch/junit/AndroidJUnitPropertyTester.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/launch/junit/AndroidJUnitPropertyTester.java
deleted file mode 100644
index 5172e09..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/launch/junit/AndroidJUnitPropertyTester.java
+++ /dev/null
@@ -1,131 +0,0 @@
-/*
- * Copyright (C) 2009 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.launch.junit;
-
-import org.eclipse.core.expressions.PropertyTester;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.jdt.core.IClassFile;
-import org.eclipse.jdt.core.ICompilationUnit;
-import org.eclipse.jdt.core.IJavaElement;
-import org.eclipse.jdt.core.IMember;
-import org.eclipse.jdt.core.IPackageFragment;
-import org.eclipse.jdt.core.IType;
-import org.eclipse.jdt.core.JavaCore;
-import org.eclipse.jdt.core.JavaModelException;
-import org.eclipse.jdt.internal.junit.util.TestSearchEngine;
-
-/**
- * A {@link PropertyTester} that checks if selected elements can be run as Android
- * JUnit tests.
- * <p/>
- * Based on org.eclipse.jdt.internal.junit.JUnitPropertyTester. The only substantial difference in
- * this implementation is source folders cannot be run as Android JUnit.
- */
-@SuppressWarnings("restriction")
-public class AndroidJUnitPropertyTester extends PropertyTester {
-    private static final String PROPERTY_IS_TEST = "isTest";  //$NON-NLS-1$
-
-    private static final String PROPERTY_CAN_LAUNCH_AS_JUNIT_TEST = "canLaunchAsJUnit"; //$NON-NLS-1$
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jdt.internal.corext.refactoring.participants.properties.IPropertyEvaluator#test(java.lang.Object, java.lang.String, java.lang.String)
-     */
-    @Override
-    public boolean test(Object receiver, String property, Object[] args, Object expectedValue) {
-        if (!(receiver instanceof IAdaptable)) {
-            final String elementName = (receiver == null ? "null" : //$NON-NLS-1$
-                receiver.getClass().getName());
-            throw new IllegalArgumentException(
-                    String.format("Element must be of type IAdaptable, is %s", //$NON-NLS-1$
-                            elementName));
-        }
-
-        IJavaElement element;
-        if (receiver instanceof IJavaElement) {
-            element = (IJavaElement) receiver;
-        } else if (receiver instanceof IResource) {
-            element = JavaCore.create((IResource) receiver);
-            if (element == null) {
-                return false;
-            }
-        } else { // is IAdaptable
-            element= (IJavaElement) ((IAdaptable) receiver).getAdapter(IJavaElement.class);
-            if (element == null) {
-                IResource resource = (IResource) ((IAdaptable) receiver).getAdapter(
-                        IResource.class);
-                element = JavaCore.create(resource);
-                if (element == null) {
-                    return false;
-                }
-            }
-        }
-        if (PROPERTY_IS_TEST.equals(property)) {
-            return isJUnitTest(element);
-        } else if (PROPERTY_CAN_LAUNCH_AS_JUNIT_TEST.equals(property)) {
-            return canLaunchAsJUnitTest(element);
-        }
-        throw new IllegalArgumentException(
-                String.format("Unknown test property '%s'", property)); //$NON-NLS-1$
-    }
-
-    private boolean canLaunchAsJUnitTest(IJavaElement element) {
-        try {
-            switch (element.getElementType()) {
-                case IJavaElement.JAVA_PROJECT:
-                    return true; // can run, let JDT detect if there are tests
-                case IJavaElement.PACKAGE_FRAGMENT_ROOT:
-                    return false; // not supported by Android test runner
-                case IJavaElement.PACKAGE_FRAGMENT:
-                    return ((IPackageFragment) element).hasChildren();
-                case IJavaElement.COMPILATION_UNIT:
-                case IJavaElement.CLASS_FILE:
-                case IJavaElement.TYPE:
-                case IJavaElement.METHOD:
-                    return isJUnitTest(element);
-                default:
-                    return false;
-            }
-        } catch (JavaModelException e) {
-            return false;
-        }
-    }
-
-    /**
-     * Return whether the target resource is a JUnit test.
-     */
-    private boolean isJUnitTest(IJavaElement element) {
-        try {
-            IType testType = null;
-            if (element instanceof ICompilationUnit) {
-                testType = (((ICompilationUnit) element)).findPrimaryType();
-            } else if (element instanceof IClassFile) {
-                testType = (((IClassFile) element)).getType();
-            } else if (element instanceof IType) {
-                testType = (IType) element;
-            } else if (element instanceof IMember) {
-                testType = ((IMember) element).getDeclaringType();
-            }
-            if (testType != null && testType.exists()) {
-                return TestSearchEngine.isTestOrTestSuite(testType);
-            }
-        } catch (CoreException e) {
-            // ignore, return false
-        }
-        return false;
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/launch/junit/AndroidJUnitTabGroup.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/launch/junit/AndroidJUnitTabGroup.java
deleted file mode 100644
index deb30de..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/launch/junit/AndroidJUnitTabGroup.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Copyright (C) 2009 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.launch.junit;
-
-import com.android.ide.eclipse.adt.internal.launch.EmulatorConfigTab;
-
-import org.eclipse.debug.core.ILaunchManager;
-import org.eclipse.debug.ui.AbstractLaunchConfigurationTabGroup;
-import org.eclipse.debug.ui.CommonTab;
-import org.eclipse.debug.ui.ILaunchConfigurationDialog;
-import org.eclipse.debug.ui.ILaunchConfigurationTab;
-
-/**
- * Tab group object for Android JUnit launch configuration type.
- */
-public class AndroidJUnitTabGroup extends AbstractLaunchConfigurationTabGroup {
-
-    /**
-     * Creates the UI tabs for the Android JUnit configuration
-     */
-    @Override
-    public void createTabs(ILaunchConfigurationDialog dialog, String mode) {
-        ILaunchConfigurationTab[] tabs = new ILaunchConfigurationTab[] {
-                new AndroidJUnitLaunchConfigurationTab(),
-                new EmulatorConfigTab(ILaunchManager.RUN_MODE.equals(mode)),
-                new CommonTab()
-        };
-        setTabs(tabs);
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/launch/junit/InstrumentationRunnerValidator.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/launch/junit/InstrumentationRunnerValidator.java
deleted file mode 100644
index 820fed7..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/launch/junit/InstrumentationRunnerValidator.java
+++ /dev/null
@@ -1,159 +0,0 @@
-/*
- * Copyright (C) 2009 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.launch.junit;
-
-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.common.xml.ManifestData.Instrumentation;
-import com.android.ide.common.xml.ManifestData.UsesLibrary;
-import com.android.ide.eclipse.adt.AdtConstants;
-import com.android.ide.eclipse.adt.internal.launch.LaunchMessages;
-import com.android.ide.eclipse.adt.internal.project.AndroidManifestHelper;
-import com.android.ide.eclipse.adt.internal.project.BaseProjectHelper;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.jdt.core.IJavaProject;
-
-/**
- * Provides validation for Android instrumentation test runner
- */
-class InstrumentationRunnerValidator {
-    private final IJavaProject mJavaProject;
-    private String[] mInstrumentationNames = null;
-    private boolean mHasRunnerLibrary = false;
-
-    static final String INSTRUMENTATION_OK = null;
-
-    /**
-     * Initializes the InstrumentationRunnerValidator.
-     *
-     * @param javaProject the {@link IJavaProject} for the Android project to validate
-     */
-    InstrumentationRunnerValidator(IJavaProject javaProject) {
-        mJavaProject = javaProject;
-        ManifestData manifestData = AndroidManifestHelper.parseForData(javaProject.getProject());
-        init(manifestData);
-    }
-
-    /**
-     * Initializes the InstrumentationRunnerValidator.
-     *
-     * @param project the {@link IProject} for the Android project to validate
-     * @throws CoreException if a fatal error occurred in initialization
-     */
-    InstrumentationRunnerValidator(IProject project) throws CoreException {
-        this(BaseProjectHelper.getJavaProject(project));
-    }
-
-    /**
-     * Initializes the InstrumentationRunnerValidator with an existing {@link AndroidManifestHelper}
-     *
-     * @param javaProject the {@link IJavaProject} for the Android project to validate
-     * @param manifestData the {@link ManifestData} for the Android project
-     */
-    InstrumentationRunnerValidator(IJavaProject javaProject, ManifestData manifestData) {
-        mJavaProject = javaProject;
-        init(manifestData);
-    }
-
-    private void init(ManifestData manifestData) {
-        if (manifestData == null) {
-            mInstrumentationNames = new String[0];
-            mHasRunnerLibrary = false;
-            return;
-        }
-
-        Instrumentation[] instrumentations = manifestData.getInstrumentations();
-        mInstrumentationNames = new String[instrumentations.length];
-        for (int i = 0; i < instrumentations.length; i++) {
-            mInstrumentationNames[i] = instrumentations[i].getName();
-        }
-        mHasRunnerLibrary = hasTestRunnerLibrary(manifestData);
-    }
-
-    /**
-     * Helper method to determine if given manifest has a <code>SdkConstants.LIBRARY_TEST_RUNNER
-     * </code> library reference
-     *
-     * @param manifestParser the {@link ManifestData} to search
-     * @return true if test runner library found, false otherwise
-     */
-    private boolean hasTestRunnerLibrary(ManifestData manifestData) {
-       for (UsesLibrary lib : manifestData.getUsesLibraries()) {
-           if (AdtConstants.LIBRARY_TEST_RUNNER.equals(lib.getName())) {
-               return true;
-           }
-       }
-       return false;
-    }
-
-    /**
-     * Return the set of instrumentation names for the Android project.
-     *
-     * @return array of instrumentation class names, possibly empty
-     */
-    @NonNull
-    String[] getInstrumentationNames() {
-        return mInstrumentationNames;
-    }
-
-    /**
-     * Helper method to get the first instrumentation that can be used as a test runner.
-     *
-     * @return fully qualified instrumentation class name. <code>null</code> if no valid
-     * instrumentation can be found.
-     */
-    @Nullable
-    String getValidInstrumentationTestRunner() {
-        for (String instrumentation : getInstrumentationNames()) {
-            if (validateInstrumentationRunner(instrumentation) == INSTRUMENTATION_OK) {
-                return instrumentation;
-            }
-        }
-        return null;
-    }
-
-    /**
-     * Helper method to determine if specified instrumentation can be used as a test runner
-     *
-     * @param instrumentation the instrumentation class name to validate. Assumes this
-     *   instrumentation is one of {@link #getInstrumentationNames()}
-     * @return <code>INSTRUMENTATION_OK</code> if valid, otherwise returns error message
-     */
-    String validateInstrumentationRunner(String instrumentation) {
-        if (!mHasRunnerLibrary) {
-            return String.format(LaunchMessages.InstrValidator_NoTestLibMsg_s,
-                    AdtConstants.LIBRARY_TEST_RUNNER);
-        }
-        // check if this instrumentation is the standard test runner
-        if (!instrumentation.equals(SdkConstants.CLASS_INSTRUMENTATION_RUNNER)) {
-            // Ideally, we'd check if the class extends instrumentation test runner.
-            // However, the Google Instrumentation Test Runner extends Google Instrumentation, and not a test runner,
-            // so we just check that the super class is Instrumentation.
-            String result = BaseProjectHelper.testClassForManifest(mJavaProject,
-                    instrumentation, SdkConstants.CLASS_INSTRUMENTATION, true);
-             if (result != BaseProjectHelper.TEST_CLASS_OK) {
-                return String.format(
-                        LaunchMessages.InstrValidator_WrongRunnerTypeMsg_s,
-                        SdkConstants.CLASS_INSTRUMENTATION);
-             }
-        }
-        return INSTRUMENTATION_OK;
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/launch/junit/runtime/AndroidJUnitLaunchInfo.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/launch/junit/runtime/AndroidJUnitLaunchInfo.java
deleted file mode 100644
index 08702f4..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/launch/junit/runtime/AndroidJUnitLaunchInfo.java
+++ /dev/null
@@ -1,148 +0,0 @@
-/*
- * Copyright (C) 2009 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.launch.junit.runtime;
-
-import com.android.ddmlib.IDevice;
-import com.android.ddmlib.testrunner.IRemoteAndroidTestRunner.TestSize;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.debug.core.ILaunch;
-
-import java.util.Collection;
-import java.util.Collections;
-
-/**
- * Contains info about Android JUnit launch
- */
-public class AndroidJUnitLaunchInfo {
-    private final IProject mProject;
-    private final String mAppPackage;
-    private final String mRunner;
-
-    private boolean mDebugMode = false;
-    private Collection<IDevice> mDevices = Collections.EMPTY_LIST;
-    private String mTestPackage = null;
-    private String mTestClass = null;
-    private String mTestMethod = null;
-    private ILaunch mLaunch = null;
-    private TestSize mTestSize = null;
-
-    public AndroidJUnitLaunchInfo(IProject project, String appPackage, String runner) {
-        mProject = project;
-        mAppPackage = appPackage;
-        mRunner = runner;
-    }
-
-    public IProject getProject() {
-        return mProject;
-    }
-
-    public String getAppPackage() {
-        return mAppPackage;
-    }
-
-    public String getRunner() {
-        return mRunner;
-    }
-
-    public boolean isDebugMode() {
-        return mDebugMode;
-    }
-
-    public void setDebugMode(boolean debugMode) {
-        mDebugMode = debugMode;
-    }
-
-    public TestSize getTestSize() {
-        return mTestSize;
-    }
-
-    public void setTestSize(TestSize size) {
-        mTestSize = size;
-    }
-
-    public Collection<IDevice> getDevices() {
-        return mDevices;
-    }
-
-    public void setDevices(Collection<IDevice> devices) {
-        mDevices = devices;
-    }
-
-    /**
-     * Specify to run all tests within given package.
-     *
-     * @param testPackage fully qualified java package
-     */
-    public void setTestPackage(String testPackage) {
-        mTestPackage = testPackage;
-    }
-
-    /**
-     * Return the package of tests to run.
-     *
-     * @return fully qualified java package. <code>null</code> if not specified.
-     */
-    public String getTestPackage() {
-        return mTestPackage;
-    }
-
-    /**
-     * Sets the test class to run.
-     *
-     * @param testClass fully qualfied test class to run
-     *    Expected format: x.y.x.testclass
-     */
-    public void setTestClass(String testClass) {
-        mTestClass = testClass;
-    }
-
-    /**
-     * Returns the test class to run.
-     *
-     * @return fully qualfied test class to run.
-     *   <code>null</code> if not specified.
-     */
-    public String getTestClass() {
-        return mTestClass;
-    }
-
-    /**
-     * Sets the test method to run. testClass must also be set.
-     *
-     * @param testMethod test method to run
-     */
-    public void setTestMethod(String testMethod) {
-        mTestMethod = testMethod;
-    }
-
-    /**
-     * Returns the test method to run.
-     *
-     * @return test method to run. <code>null</code> if not specified.
-     */
-    public String getTestMethod() {
-        return mTestMethod;
-    }
-
-    public ILaunch getLaunch() {
-        return mLaunch;
-    }
-
-    public void setLaunch(ILaunch launch) {
-        mLaunch = launch;
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/launch/junit/runtime/AndroidTestReference.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/launch/junit/runtime/AndroidTestReference.java
deleted file mode 100644
index ec3104d..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/launch/junit/runtime/AndroidTestReference.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * Copyright (C) 2009 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.launch.junit.runtime;
-
-import org.eclipse.jdt.internal.junit.runner.ITestIdentifier;
-import org.eclipse.jdt.internal.junit.runner.ITestReference;
-import org.eclipse.jdt.internal.junit.runner.TestExecution;
-
-/**
- * Base implementation of the Eclipse {@link ITestReference} and {@link ITestIdentifier} interfaces
- * for Android tests.
- * <p/>
- * Provides generic equality/hashcode services
- */
-@SuppressWarnings("restriction")
-abstract class AndroidTestReference implements ITestReference, ITestIdentifier {
-
-    /**
-     * Gets the {@link ITestIdentifier} for this test reference.
-     */
-    @Override
-    public ITestIdentifier getIdentifier() {
-        // this class serves as its own test identifier
-        return this;
-    }
-
-    /**
-     * Not supported.
-     */
-    @Override
-    public void run(TestExecution execution) {
-        throw new UnsupportedOperationException();
-    }
-
-    /**
-     * Compares {@link ITestIdentifier} using names
-     */
-    @Override
-    public boolean equals(Object obj) {
-        if (obj instanceof ITestIdentifier) {
-            ITestIdentifier testid = (ITestIdentifier) obj;
-            return getName().equals(testid.getName());
-        }
-        return false;
-    }
-
-    @Override
-    public int hashCode() {
-        return getName().hashCode();
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/launch/junit/runtime/RemoteAdtTestRunner.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/launch/junit/runtime/RemoteAdtTestRunner.java
deleted file mode 100755
index a48acd3..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/launch/junit/runtime/RemoteAdtTestRunner.java
+++ /dev/null
@@ -1,524 +0,0 @@
-/*
- * Copyright (C) 2009 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.launch.junit.runtime;
-
-import com.android.ddmlib.AdbCommandRejectedException;
-import com.android.ddmlib.IDevice;
-import com.android.ddmlib.ShellCommandUnresponsiveException;
-import com.android.ddmlib.TimeoutException;
-import com.android.ddmlib.testrunner.IRemoteAndroidTestRunner.TestSize;
-import com.android.ddmlib.testrunner.ITestRunListener;
-import com.android.ddmlib.testrunner.RemoteAndroidTestRunner;
-import com.android.ddmlib.testrunner.TestIdentifier;
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.ide.eclipse.adt.internal.launch.LaunchMessages;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.core.runtime.jobs.Job;
-import org.eclipse.jdt.internal.junit.runner.IListensToTestExecutions;
-import org.eclipse.jdt.internal.junit.runner.ITestReference;
-import org.eclipse.jdt.internal.junit.runner.MessageIds;
-import org.eclipse.jdt.internal.junit.runner.RemoteTestRunner;
-import org.eclipse.jdt.internal.junit.runner.TestExecution;
-import org.eclipse.jdt.internal.junit.runner.TestReferenceFailure;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-
-/**
- * Supports Eclipse JUnit execution of Android tests.
- * <p/>
- * Communicates back to a Eclipse JDT JUnit client via a socket connection.
- *
- * @see org.eclipse.jdt.internal.junit.runner.RemoteTestRunner for more details on the protocol
- */
-@SuppressWarnings("restriction")
-public class RemoteAdtTestRunner extends RemoteTestRunner {
-
-    private static final String DELAY_MSEC_KEY = "delay_msec";
-    /** the delay between each test execution when in collecting test info */
-    private static final String COLLECT_TEST_DELAY_MS = "15";
-
-    private AndroidJUnitLaunchInfo mLaunchInfo;
-    private TestExecution mExecution;
-
-    /**
-     * Initialize the JDT JUnit test runner parameters from the {@code args}.
-     *
-     * @param args name-value pair of arguments to pass to parent JUnit runner.
-     * @param launchInfo the Android specific test launch info
-     */
-    protected void init(String[] args, AndroidJUnitLaunchInfo launchInfo) {
-        defaultInit(args);
-        mLaunchInfo = launchInfo;
-    }
-
-    /**
-     * Runs a set of tests, and reports back results using parent class.
-     * <p/>
-     * JDT Unit expects to be sent data in the following sequence:
-     * <ol>
-     *   <li>The total number of tests to be executed.</li>
-     *   <li>The test 'tree' data about the tests to be executed, which is composed of the set of
-     *   test class names, the number of tests in each class, and the names of each test in the
-     *   class.</li>
-     *   <li>The test execution result for each test method. Expects individual notifications of
-     *   the test execution start, any failures, and the end of the test execution.</li>
-     *   <li>The end of the test run, with its elapsed time.</li>
-     * </ol>
-     * <p/>
-     * In order to satisfy this, this method performs two actual Android instrumentation runs.
-     * The first is a 'log only' run that will collect the test tree data, without actually
-     * executing the tests,  and send it back to JDT JUnit. The second is the actual test execution,
-     * whose results will be communicated back in real-time to JDT JUnit.
-     *
-     * The tests are run concurrently on all devices. The overall structure is as follows:
-     * <ol>
-     *   <li> First, a separate job per device is run to collect test tree data. A per device
-     *        {@link TestCollector} records information regarding the tests run on the device.
-     *        </li>
-     *   <li> Once all the devices have finished collecting the test tree data, the tree info is
-     *        collected from all of them and passed to the Junit UI </li>
-     *   <li> A job per device is again launched to do the actual test run. A per device
-     *        {@link TestRunListener} notifies the shared {@link TestResultsNotifier} of test
-     *        status. </li>
-     *   <li> As tests complete, the test run listener updates the Junit UI </li>
-     * </ol>
-     *
-     * @param testClassNames ignored - the AndroidJUnitLaunchInfo will be used to determine which
-     *     tests to run.
-     * @param testName ignored
-     * @param execution used to report test progress
-     */
-    @Override
-    public void runTests(String[] testClassNames, String testName, TestExecution execution) {
-        // hold onto this execution reference so it can be used to report test progress
-        mExecution = execution;
-
-        List<IDevice> devices = new ArrayList<IDevice>(mLaunchInfo.getDevices());
-        List<RemoteAndroidTestRunner> runners =
-                new ArrayList<RemoteAndroidTestRunner>(devices.size());
-
-        for (IDevice device : devices) {
-            RemoteAndroidTestRunner runner = new RemoteAndroidTestRunner(
-                    mLaunchInfo.getAppPackage(), mLaunchInfo.getRunner(), device);
-
-            if (mLaunchInfo.getTestClass() != null) {
-                if (mLaunchInfo.getTestMethod() != null) {
-                    runner.setMethodName(mLaunchInfo.getTestClass(), mLaunchInfo.getTestMethod());
-                } else {
-                    runner.setClassName(mLaunchInfo.getTestClass());
-                }
-            }
-
-            if (mLaunchInfo.getTestPackage() != null) {
-                runner.setTestPackageName(mLaunchInfo.getTestPackage());
-            }
-
-            TestSize size = mLaunchInfo.getTestSize();
-            if (size != null) {
-                runner.setTestSize(size);
-            }
-
-            runners.add(runner);
-        }
-
-        // Launch all test info collector jobs
-        List<TestTreeCollectorJob> collectorJobs =
-                new ArrayList<TestTreeCollectorJob>(devices.size());
-        List<TestCollector> perDeviceCollectors = new ArrayList<TestCollector>(devices.size());
-        for (int i = 0; i < devices.size(); i++) {
-            RemoteAndroidTestRunner runner = runners.get(i);
-            String deviceName = devices.get(i).getName();
-            TestCollector collector = new TestCollector(deviceName);
-            perDeviceCollectors.add(collector);
-
-            TestTreeCollectorJob job = new TestTreeCollectorJob(
-                    "Test Tree Collector for " + deviceName,
-                    runner, mLaunchInfo.isDebugMode(), collector);
-            job.setPriority(Job.INTERACTIVE);
-            job.schedule();
-
-            collectorJobs.add(job);
-        }
-
-        // wait for all test info collector jobs to complete
-        int totalTests = 0;
-        for (TestTreeCollectorJob job : collectorJobs) {
-            try {
-                job.join();
-            } catch (InterruptedException e) {
-                endTestRunWithError(e.getMessage());
-                return;
-            }
-
-            if (!job.getResult().isOK()) {
-                endTestRunWithError(job.getResult().getMessage());
-                return;
-            }
-
-            TestCollector collector = job.getCollector();
-            String err = collector.getErrorMessage();
-            if (err != null) {
-                endTestRunWithError(err);
-                return;
-            }
-
-            totalTests += collector.getTestCaseCount();
-        }
-
-        AdtPlugin.printToConsole(mLaunchInfo.getProject(), "Sending test information to Eclipse");
-        notifyTestRunStarted(totalTests);
-        sendTestTrees(perDeviceCollectors);
-
-        List<TestRunnerJob> instrumentationRunnerJobs =
-                new ArrayList<TestRunnerJob>(devices.size());
-
-        TestResultsNotifier notifier = new TestResultsNotifier(mExecution.getListener(),
-                devices.size());
-
-        // Spawn all instrumentation runner jobs
-        for (int i = 0; i < devices.size(); i++) {
-            RemoteAndroidTestRunner runner = runners.get(i);
-            String deviceName = devices.get(i).getName();
-            TestRunListener testRunListener = new TestRunListener(deviceName, notifier);
-            InstrumentationRunJob job = new InstrumentationRunJob(
-                    "Test Tree Collector for " + deviceName,
-                    runner, mLaunchInfo.isDebugMode(), testRunListener);
-            job.setPriority(Job.INTERACTIVE);
-            job.schedule();
-
-            instrumentationRunnerJobs.add(job);
-        }
-
-        // Wait for all jobs to complete
-        for (TestRunnerJob job : instrumentationRunnerJobs) {
-            try {
-                job.join();
-            } catch (InterruptedException e) {
-                endTestRunWithError(e.getMessage());
-                return;
-            }
-
-            if (!job.getResult().isOK()) {
-                endTestRunWithError(job.getResult().getMessage());
-                return;
-            }
-        }
-    }
-
-    /** Sends info about the test tree to be executed (ie the suites and their enclosed tests) */
-    private void sendTestTrees(List<TestCollector> perDeviceCollectors) {
-        for (TestCollector c : perDeviceCollectors) {
-            ITestReference ref = c.getDeviceSuite();
-            ref.sendTree(this);
-        }
-    }
-
-    private static abstract class TestRunnerJob extends Job {
-        private ITestRunListener mListener;
-        private RemoteAndroidTestRunner mRunner;
-        private boolean mIsDebug;
-
-        public TestRunnerJob(String name, RemoteAndroidTestRunner runner,
-                boolean isDebug, ITestRunListener listener) {
-            super(name);
-
-            mRunner = runner;
-            mIsDebug = isDebug;
-            mListener = listener;
-        }
-
-        @Override
-        protected IStatus run(IProgressMonitor monitor) {
-            try {
-                setupRunner();
-                mRunner.run(mListener);
-            } catch (TimeoutException e) {
-                return new Status(Status.ERROR, AdtPlugin.PLUGIN_ID,
-                        LaunchMessages.RemoteAdtTestRunner_RunTimeoutException,
-                        e);
-            } catch (IOException e) {
-                return new Status(Status.ERROR, AdtPlugin.PLUGIN_ID,
-                        String.format(LaunchMessages.RemoteAdtTestRunner_RunIOException_s,
-                                e.getMessage()),
-                        e);
-            } catch (AdbCommandRejectedException e) {
-                return new Status(Status.ERROR, AdtPlugin.PLUGIN_ID,
-                        String.format(
-                                LaunchMessages.RemoteAdtTestRunner_RunAdbCommandRejectedException_s,
-                                e.getMessage()),
-                        e);
-            } catch (ShellCommandUnresponsiveException e) {
-                return new Status(Status.ERROR, AdtPlugin.PLUGIN_ID,
-                        LaunchMessages.RemoteAdtTestRunner_RunTimeoutException,
-                        e);
-            }
-
-            return Status.OK_STATUS;
-        }
-
-        public RemoteAndroidTestRunner getRunner() {
-            return mRunner;
-        }
-
-        public boolean isDebug() {
-            return mIsDebug;
-        }
-
-        public ITestRunListener getListener() {
-            return mListener;
-        }
-
-        protected abstract void setupRunner();
-    }
-
-    private static class TestTreeCollectorJob extends TestRunnerJob {
-        public TestTreeCollectorJob(String name, RemoteAndroidTestRunner runner, boolean isDebug,
-                TestCollector listener) {
-            super(name, runner, isDebug, listener);
-        }
-
-        @Override
-        protected void setupRunner() {
-            RemoteAndroidTestRunner runner = getRunner();
-
-            // set log only to just collect test case info,
-            // so Eclipse has correct test case count/tree info
-            runner.setLogOnly(true);
-
-            // add a small delay between each test. Otherwise for large test suites framework may
-            // report Binder transaction failures
-            runner.addInstrumentationArg(DELAY_MSEC_KEY, COLLECT_TEST_DELAY_MS);
-        }
-
-        public TestCollector getCollector() {
-            return (TestCollector) getListener();
-        }
-    }
-
-    private static class InstrumentationRunJob extends TestRunnerJob {
-        public InstrumentationRunJob(String name, RemoteAndroidTestRunner runner, boolean isDebug,
-                ITestRunListener listener) {
-            super(name, runner, isDebug, listener);
-        }
-
-        @Override
-        protected void setupRunner() {
-            RemoteAndroidTestRunner runner = getRunner();
-            runner.setLogOnly(false);
-            runner.removeInstrumentationArg(DELAY_MSEC_KEY);
-            if (isDebug()) {
-                runner.setDebug(true);
-            }
-        }
-    }
-
-    /**
-     * Main entry method to run tests
-     *
-     * @param programArgs JDT JUnit program arguments to be processed by parent
-     * @param junitInfo the {@link AndroidJUnitLaunchInfo} containing info about this test ru
-     */
-    public void runTests(String[] programArgs, AndroidJUnitLaunchInfo junitInfo) {
-        init(programArgs, junitInfo);
-        run();
-    }
-
-    /**
-     * Stop the current test run.
-     */
-    public void terminate() {
-        stop();
-    }
-
-    @Override
-    protected void stop() {
-        if (mExecution != null) {
-            mExecution.stop();
-        }
-    }
-
-    private void notifyTestRunEnded(long elapsedTime) {
-        // copy from parent - not ideal, but method is private
-        sendMessage(MessageIds.TEST_RUN_END + elapsedTime);
-        flush();
-        //shutDown();
-    }
-
-    /**
-     * @param errorMessage
-     */
-    private void reportError(String errorMessage) {
-        AdtPlugin.printErrorToConsole(mLaunchInfo.getProject(),
-                String.format(LaunchMessages.RemoteAdtTestRunner_RunFailedMsg_s, errorMessage));
-        // is this needed?
-        //notifyTestRunStopped(-1);
-    }
-
-    private void endTestRunWithError(String message) {
-        reportError(message);
-        notifyTestRunEnded(0);
-    }
-
-    /**
-     * This class provides the interface to notify the JDT UI regarding the status of tests.
-     * When running tests on multiple devices, there is a {@link TestRunListener} that listens
-     * to results from each device. Rather than all such listeners directly notifying JDT
-     * from different threads, they all notify this class which notifies JDT. In addition,
-     * the {@link #testRunEnded(String, long)} method make sure that JDT is notified that the
-     * test run has completed only when tests on all devices have completed.
-     * */
-    private class TestResultsNotifier {
-        private final IListensToTestExecutions mListener;
-        private final int mDeviceCount;
-
-        private int mCompletedRuns;
-        private long mMaxElapsedTime;
-
-        public TestResultsNotifier(IListensToTestExecutions listener, int nDevices) {
-            mListener = listener;
-            mDeviceCount = nDevices;
-        }
-
-        public synchronized void testEnded(TestCaseReference ref) {
-            mListener.notifyTestEnded(ref);
-        }
-
-        public synchronized void testFailed(TestReferenceFailure ref) {
-            mListener.notifyTestFailed(ref);
-        }
-
-        public synchronized void testRunEnded(String mDeviceName, long elapsedTime) {
-            mCompletedRuns++;
-
-            if (elapsedTime > mMaxElapsedTime) {
-                mMaxElapsedTime = elapsedTime;
-            }
-
-            if (mCompletedRuns == mDeviceCount) {
-                notifyTestRunEnded(mMaxElapsedTime);
-            }
-        }
-
-        public synchronized void testStarted(TestCaseReference testId) {
-            mListener.notifyTestStarted(testId);
-        }
-    }
-
-    /**
-     * TestRunListener that communicates results in real-time back to JDT JUnit via the
-     * {@link TestResultsNotifier}.
-     * */
-    private class TestRunListener implements ITestRunListener {
-        private final String mDeviceName;
-        private TestResultsNotifier mNotifier;
-
-        /**
-         * Constructs a {@link ITestRunListener} that listens for test results on given device.
-         * @param deviceName device on which the tests are being run
-         * @param notifier notifier to inform of test status
-         */
-        public TestRunListener(String deviceName, TestResultsNotifier notifier) {
-            mDeviceName = deviceName;
-            mNotifier = notifier;
-        }
-
-        @Override
-        public void testEnded(TestIdentifier test, Map<String, String> ignoredTestMetrics) {
-            mNotifier.testEnded(new TestCaseReference(mDeviceName, test));
-        }
-
-        @Override
-        public void testFailed(TestIdentifier test, String trace) {
-            TestReferenceFailure failure =
-                new TestReferenceFailure(new TestCaseReference(mDeviceName, test),
-                        MessageIds.TEST_FAILED, trace, null);
-            mNotifier.testFailed(failure);
-        }
-
-        @Override
-        public void testAssumptionFailure(TestIdentifier test, String trace) {
-            TestReferenceFailure failure =
-                new TestReferenceFailure(new TestCaseReference(mDeviceName, test),
-                        MessageIds.TEST_FAILED, trace, null);
-            mNotifier.testFailed(failure);
-        }
-
-        @Override
-        public void testIgnored(TestIdentifier test) {
-            // TODO: implement me?
-        }
-
-        @Override
-        public synchronized void testRunEnded(long elapsedTime, Map<String, String> runMetrics) {
-            mNotifier.testRunEnded(mDeviceName, elapsedTime);
-            AdtPlugin.printToConsole(mLaunchInfo.getProject(),
-                    LaunchMessages.RemoteAdtTestRunner_RunCompleteMsg);
-        }
-
-        @Override
-        public synchronized void testRunFailed(String errorMessage) {
-            reportError(errorMessage);
-        }
-
-        @Override
-        public synchronized void testRunStarted(String runName, int testCount) {
-            // ignore
-        }
-
-        @Override
-        public synchronized void testRunStopped(long elapsedTime) {
-            notifyTestRunStopped(elapsedTime);
-            AdtPlugin.printToConsole(mLaunchInfo.getProject(),
-                    LaunchMessages.RemoteAdtTestRunner_RunStoppedMsg);
-        }
-
-        @Override
-        public synchronized void testStarted(TestIdentifier test) {
-            TestCaseReference testId = new TestCaseReference(mDeviceName, test);
-            mNotifier.testStarted(testId);
-        }
-    }
-
-    /** Override parent to get extra logs. */
-    @Override
-    protected boolean connect() {
-        boolean result = super.connect();
-        if (!result) {
-            AdtPlugin.printErrorToConsole(mLaunchInfo.getProject(),
-                    "Connect to Eclipse test result listener failed");
-        }
-        return result;
-    }
-
-    /** Override parent to dump error message to console. */
-    @Override
-    public void runFailed(String message, Exception exception) {
-        if (exception != null) {
-            AdtPlugin.logAndPrintError(exception, mLaunchInfo.getProject().getName(),
-                    "Test launch failed: %s", message);
-        } else {
-            AdtPlugin.printErrorToConsole(mLaunchInfo.getProject(), "Test launch failed: %s",
-                    message);
-        }
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/launch/junit/runtime/TestCaseReference.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/launch/junit/runtime/TestCaseReference.java
deleted file mode 100644
index e05e9b8..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/launch/junit/runtime/TestCaseReference.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- * Copyright (C) 2009 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.launch.junit.runtime;
-
-import com.android.ddmlib.testrunner.TestIdentifier;
-
-import org.eclipse.jdt.internal.junit.runner.IVisitsTestTrees;
-
-/**
- * Reference for a single Android test method.
- */
-@SuppressWarnings("restriction")
-class TestCaseReference extends AndroidTestReference {
-    private final String mClassName;
-    private final String mTestName;
-    private final String mDeviceName;
-
-    /**
-     * Creates a TestCaseReference from a {@link TestIdentifier}
-     * @param test
-     */
-    TestCaseReference(String deviceName, TestIdentifier test) {
-        mDeviceName = deviceName;
-        mClassName = test.getClassName();
-        mTestName = test.getTestName();
-    }
-
-    /**
-     * Returns a count of the number of test cases referenced. Is always one for this class.
-     */
-    @Override
-    public int countTestCases() {
-        return 1;
-    }
-
-    /**
-     * Sends test identifier and test count information for this test
-     *
-     * @param notified the {@link IVisitsTestTrees} to send test info to
-     */
-    @Override
-    public void sendTree(IVisitsTestTrees notified) {
-        notified.visitTreeEntry(getIdentifier(), false, countTestCases());
-    }
-
-    /**
-     * Returns the identifier of this test, in a format expected by JDT JUnit
-     */
-    @Override
-    public String getName() {
-        return String.format("%s (%s) [%s]", mTestName, mClassName, mDeviceName);
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/launch/junit/runtime/TestCollector.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/launch/junit/runtime/TestCollector.java
deleted file mode 100644
index 32c5ef8..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/launch/junit/runtime/TestCollector.java
+++ /dev/null
@@ -1,136 +0,0 @@
-/*
- * Copyright (C) 2009 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.launch.junit.runtime;
-
-import com.android.ddmlib.testrunner.ITestRunListener;
-import com.android.ddmlib.testrunner.TestIdentifier;
-
-import java.util.Map;
-
-/**
- * Collects info about tests to be executed by listening to the results of an Android test run.
- */
-class TestCollector implements ITestRunListener {
-    private final String mDeviceName;
-    private final TestSuiteReference mDeviceSuiteRef;
-
-    private int mTotalTestCount;
-    /** test name to test suite reference map. */
-
-    private String mErrorMessage = null;
-
-    TestCollector(String deviceName) {
-        mDeviceName = deviceName;
-        mDeviceSuiteRef = new TestSuiteReference(deviceName);
-
-        mTotalTestCount = 0;
-    }
-
-    @Override
-    public synchronized void testEnded(TestIdentifier test, Map<String, String> testMetrics) {
-        // ignore
-    }
-
-    /* (non-Javadoc)
-     * @see com.android.ddmlib.testrunner.ITestRunListener#testFailed(com.android.ddmlib.testrunner.TestIdentifier, java.lang.String)
-     */
-    @Override
-    public synchronized void testFailed(TestIdentifier test, String trace) {
-        // ignore - should be impossible since this is only collecting test information
-    }
-
-    /* (non-Javadoc)
-     * @see com.android.ddmlib.testrunner.ITestRunListener#testIgnored(com.android.ddmlib.testrunner.TestIdentifier)
-     */
-    @Override
-    public synchronized void testIgnored(TestIdentifier test) {
-        // ignore - should be impossible since this is only collecting test information
-    }
-
-    /* (non-Javadoc)
-     * @see com.android.ddmlib.testrunner.ITestRunListener#testAssumptionFailure(com.android.ddmlib.testrunner.TestIdentifier, java.lang.String)
-     */
-    @Override
-    public synchronized void testAssumptionFailure(TestIdentifier test, String trace) {
-        // ignore - should be impossible since this is only collecting test information
-    }
-
-    /* (non-Javadoc)
-     * @see com.android.ddmlib.testrunner.ITestRunListener#testRunEnded(long, Map<String, String>)
-     */
-    @Override
-    public synchronized void testRunEnded(long elapsedTime, Map<String, String> runMetrics) {
-        // ignore
-    }
-
-    /* (non-Javadoc)
-     * @see com.android.ddmlib.testrunner.ITestRunListener#testRunFailed(java.lang.String)
-     */
-    @Override
-    public synchronized void testRunFailed(String errorMessage) {
-        mErrorMessage = errorMessage;
-    }
-
-    /* (non-Javadoc)
-     * @see com.android.ddmlib.testrunner.ITestRunListener#testRunStarted(int)
-     */
-    @Override
-    public synchronized void testRunStarted(String ignoredRunName, int testCount) {
-        mTotalTestCount = testCount;
-    }
-
-    /* (non-Javadoc)
-     * @see com.android.ddmlib.testrunner.ITestRunListener#testRunStopped(long)
-     */
-    @Override
-    public synchronized void testRunStopped(long elapsedTime) {
-        // ignore
-    }
-
-    /* (non-Javadoc)
-     * @see com.android.ddmlib.testrunner.ITestRunListener#testStarted(com.android.ddmlib.testrunner.TestIdentifier)
-     */
-    @Override
-    public synchronized void testStarted(TestIdentifier test) {
-        TestSuiteReference suiteRef = mDeviceSuiteRef.getTestSuite(test.getClassName());
-        if (suiteRef == null) {
-            suiteRef = new TestSuiteReference(test.getClassName());
-            mDeviceSuiteRef.addTest(suiteRef);
-        }
-
-        suiteRef.addTest(new TestCaseReference(mDeviceName, test));
-    }
-
-    /**
-     * Returns the total test count in the test run.
-     */
-    public synchronized int getTestCaseCount() {
-        return mTotalTestCount;
-    }
-
-    /**
-     * Returns the error message that was reported when collecting test info.
-     * Returns <code>null</code> if no error occurred.
-     */
-    public synchronized String getErrorMessage() {
-        return mErrorMessage;
-    }
-
-    public TestSuiteReference getDeviceSuite() {
-        return mDeviceSuiteRef;
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/launch/junit/runtime/TestSuiteReference.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/launch/junit/runtime/TestSuiteReference.java
deleted file mode 100644
index dcc9f10..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/launch/junit/runtime/TestSuiteReference.java
+++ /dev/null
@@ -1,92 +0,0 @@
-/*
- * Copyright (C) 2009 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.launch.junit.runtime;
-
-import org.eclipse.jdt.internal.junit.runner.IVisitsTestTrees;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * Reference for an Android test suite aka class.
- */
-@SuppressWarnings("restriction")
-class TestSuiteReference extends AndroidTestReference {
-
-    private final String mClassName;
-    private List<AndroidTestReference> mTests;
-
-    /**
-     * Creates a TestSuiteReference
-     *
-     * @param className the fully qualified name of the test class
-     */
-    TestSuiteReference(String className) {
-         mClassName = className;
-         mTests = new ArrayList<AndroidTestReference>();
-    }
-
-    /**
-     * Returns a count of the number of test cases included in this suite.
-     */
-    @Override
-    public int countTestCases() {
-        return mTests.size();
-    }
-
-    /**
-     * Sends test identifier and test count information for this test class, and all its included
-     * test methods.
-     *
-     * @param notified the {@link IVisitsTestTrees} to send test info too
-     */
-    @Override
-    public void sendTree(IVisitsTestTrees notified) {
-        notified.visitTreeEntry(getIdentifier(), true, countTestCases());
-        for (AndroidTestReference ref: mTests) {
-            ref.sendTree(notified);
-        }
-    }
-
-    /**
-     * Return the name of this test class.
-     */
-    @Override
-    public String getName() {
-        return mClassName;
-    }
-
-    /**
-     * Adds a test method to this suite.
-     *
-     * @param testRef the {@link TestCaseReference} to add
-     */
-    void addTest(AndroidTestReference testRef) {
-        mTests.add(testRef);
-    }
-
-    /** Returns the test suite of given name, null if no such test suite exists */
-    public TestSuiteReference getTestSuite(String name) {
-        for (AndroidTestReference ref: mTests) {
-            if (ref instanceof TestSuiteReference && ref.getName().equals(name)) {
-                return (TestSuiteReference) ref;
-            }
-        }
-
-        return null;
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/launch/messages.properties b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/launch/messages.properties
deleted file mode 100644
index b27a365..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/launch/messages.properties
+++ /dev/null
@@ -1,43 +0,0 @@
-#
-# Copyright (C) 2010 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.
-#
-
-# generic messages that could be used by multiple classes
-LaunchDialogTitle=Android Launch
-NonAndroidProjectError=Specified project is not an Android project
-ParseFileFailure_s=Failed to parse %1$s file
-
-# specialized, class-specific messages
-AndroidJUnitLaunchAction_LaunchDesc_s=%1$s JUnit launch
-AndroidJUnitLaunchAction_LaunchFail=Failed to launch test
-AndroidJUnitLaunchAction_LaunchInstr_2s=Launching instrumentation %1$s on %2$s
-AndroidJUnitDelegate_NoRunnerConfigMsg_s=Warning: No instrumentation runner found for the launch, using %1$s
-AndroidJUnitDelegate_NoRunnerConsoleMsg_4s=%1$s does not specify a %2$s instrumentation or does not declare uses-library %3$s in its %4$s
-AndroidJUnitDelegate_NoRunnerMsg_s=%1$s is not configured correctly for running tests. See Console for details.
-AndroidJUnitDelegate_NoTargetMsg_3s=%1$s is not configured correctly for running tests:\nA targetPackage attribute for instrumentation %2$s in its %3$s could not be found\!
-AndroidJUnitTab_LoaderLabel=Instrumentation runner:
-AndroidJUnitTab_LoadInstrError_s=Failed to load instrumentations from %1$s
-AndroidJUnitTab_NoRunnerError=Instrumentation runner not specified
-AndroidJUnitTab_SizeLabel=Only run test methods annotated with:
-AndroidJUnitTab_TestContainerText=Run all tests in the selected project, or package
-InstrValidator_NoTestLibMsg_s=The application does not declare uses-library %1$s
-InstrValidator_WrongRunnerTypeMsg_s=The instrumentation runner must be of type %1$s
-RemoteAdtTestRunner_RunCompleteMsg=Test run finished
-RemoteAdtTestRunner_RunFailedMsg_s=Test run failed: %1$s
-RemoteAdtTestRunner_RunTimeoutException=Connection with device timed out.
-RemoteAdtTestRunner_RunIOException_s=Lost connection with device: %s
-RemoteAdtTestRunner_RunStoppedMsg=Test run stopped
-RemoteAdtTestRunner_RunAdbCommandRejectedException_s=Adb rejected command: %s
-RemoteAdtTestRunner_RunShellCommandUnresponsiveException=Device stopped sending output
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/lint/AddPrefixFix.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/lint/AddPrefixFix.java
deleted file mode 100644
index d8ce657..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/lint/AddPrefixFix.java
+++ /dev/null
@@ -1,69 +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.ide.eclipse.adt.internal.lint;
-
-import static com.android.SdkConstants.ANDROID_URI;
-
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.utils.XmlUtils;
-
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.jface.text.BadLocationException;
-import org.eclipse.jface.text.IDocument;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.ui.ISharedImages;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
-import org.w3c.dom.Node;
-
-@SuppressWarnings("restriction") // DOM model
-final class AddPrefixFix extends DocumentFix {
-    private AddPrefixFix(String id, IMarker marker) {
-        super(id, marker);
-    }
-
-    @Override
-    public boolean needsFocus() {
-        return false;
-    }
-
-    @Override
-    public boolean isCancelable() {
-        return false;
-    }
-
-    @Override
-    protected void apply(IDocument document, IStructuredModel model, Node node, int start,
-            int end) {
-        String prefix = XmlUtils.lookupNamespacePrefix(node, ANDROID_URI);
-        try {
-            document.replace(start, 0, prefix + ':');
-        } catch (BadLocationException e) {
-            AdtPlugin.log(e, null);
-        }
-    }
-
-    @Override
-    public String getDisplayString() {
-        return "Add in an Android namespace prefix";
-    }
-
-    @Override
-    public Image getImage() {
-        ISharedImages sharedImages = PlatformUI.getWorkbench().getSharedImages();
-        return sharedImages.getImage(ISharedImages.IMG_OBJ_ADD);
-    }
-}
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
deleted file mode 100644
index 1a7fe56..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/lint/AddSuppressAnnotation.java
+++ /dev/null
@@ -1,424 +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.ide.eclipse.adt.internal.lint;
-
-import static com.android.SdkConstants.FQCN_SUPPRESS_LINT;
-import static com.android.SdkConstants.FQCN_TARGET_API;
-import static com.android.SdkConstants.SUPPRESS_LINT;
-import static com.android.SdkConstants.TARGET_API;
-import static org.eclipse.jdt.core.dom.ArrayInitializer.EXPRESSIONS_PROPERTY;
-import static org.eclipse.jdt.core.dom.SingleMemberAnnotation.VALUE_PROPERTY;
-
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-import com.android.sdklib.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.Scope;
-
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.jdt.core.ICompilationUnit;
-import org.eclipse.jdt.core.dom.AST;
-import org.eclipse.jdt.core.dom.ASTNode;
-import org.eclipse.jdt.core.dom.AnonymousClassDeclaration;
-import org.eclipse.jdt.core.dom.ArrayInitializer;
-import org.eclipse.jdt.core.dom.BodyDeclaration;
-import org.eclipse.jdt.core.dom.CompilationUnit;
-import org.eclipse.jdt.core.dom.Expression;
-import org.eclipse.jdt.core.dom.FieldDeclaration;
-import org.eclipse.jdt.core.dom.MethodDeclaration;
-import org.eclipse.jdt.core.dom.NodeFinder;
-import org.eclipse.jdt.core.dom.SingleMemberAnnotation;
-import org.eclipse.jdt.core.dom.StringLiteral;
-import org.eclipse.jdt.core.dom.TypeDeclaration;
-import org.eclipse.jdt.core.dom.VariableDeclarationFragment;
-import org.eclipse.jdt.core.dom.rewrite.ASTRewrite;
-import org.eclipse.jdt.core.dom.rewrite.ImportRewrite;
-import org.eclipse.jdt.core.dom.rewrite.ListRewrite;
-import org.eclipse.jdt.ui.IWorkingCopyManager;
-import org.eclipse.jdt.ui.JavaUI;
-import org.eclipse.jdt.ui.SharedASTProvider;
-import org.eclipse.jface.text.IDocument;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.text.edits.MultiTextEdit;
-import org.eclipse.text.edits.TextEdit;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IMarkerResolution;
-import org.eclipse.ui.IMarkerResolution2;
-import org.eclipse.ui.texteditor.IDocumentProvider;
-import org.eclipse.ui.texteditor.ITextEditor;
-
-import java.util.List;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-/**
- * Marker resolution for adding {@code @SuppressLint} annotations in Java files.
- * It can also add {@code @TargetApi} annotations.
- */
-class AddSuppressAnnotation implements IMarkerResolution2 {
-    private final IMarker mMarker;
-    private final String mId;
-    private final BodyDeclaration mNode;
-    private final String mDescription;
-    /**
-     * Should it create a {@code @TargetApi} annotation instead of
-     * {@code SuppressLint} ? If so pass a non null API level
-     */
-    private final String mTargetApi;
-
-    private AddSuppressAnnotation(
-            @NonNull String id,
-            @NonNull IMarker marker,
-            @NonNull BodyDeclaration node,
-            @NonNull String description,
-            @Nullable String targetApi) {
-        mId = id;
-        mMarker = marker;
-        mNode = node;
-        mDescription = description;
-        mTargetApi = targetApi;
-    }
-
-    @Override
-    public String getLabel() {
-        return mDescription;
-    }
-
-    @Override
-    public String getDescription() {
-        return null;
-    }
-
-    @Override
-    public Image getImage() {
-        return IconFactory.getInstance().getIcon("newannotation"); //$NON-NLS-1$
-    }
-
-    @Override
-    public void run(IMarker marker) {
-        ITextEditor textEditor = AdtUtils.getActiveTextEditor();
-        IDocumentProvider provider = textEditor.getDocumentProvider();
-        IEditorInput editorInput = textEditor.getEditorInput();
-        IDocument document = provider.getDocument(editorInput);
-        if (document == null) {
-            return;
-        }
-        IWorkingCopyManager manager = JavaUI.getWorkingCopyManager();
-        ICompilationUnit compilationUnit = manager.getWorkingCopy(editorInput);
-        try {
-            MultiTextEdit edit;
-            if (mTargetApi == null) {
-                edit = addSuppressAnnotation(document, compilationUnit, mNode);
-            } else {
-                edit = addTargetApiAnnotation(document, compilationUnit, mNode);
-            }
-            if (edit != null) {
-                edit.apply(document);
-
-                // Remove the marker now that the suppress annotation has been added
-                // (so the user doesn't have to re-run lint just to see it disappear,
-                // and besides we don't want to keep offering marker resolutions on this
-                // marker which could lead to duplicate annotations since the above code
-                // assumes that the current id isn't in the list of values, since otherwise
-                // lint shouldn't have complained here.
-                mMarker.delete();
-            }
-        } catch (Exception ex) {
-            AdtPlugin.log(ex, "Could not add suppress annotation");
-        }
-    }
-
-    @SuppressWarnings({"rawtypes"}) // Java AST API has raw types
-    private MultiTextEdit addSuppressAnnotation(
-            IDocument document,
-            ICompilationUnit compilationUnit,
-            BodyDeclaration declaration) throws CoreException {
-        List modifiers = declaration.modifiers();
-        SingleMemberAnnotation existing = null;
-        for (Object o : modifiers) {
-            if (o instanceof SingleMemberAnnotation) {
-                SingleMemberAnnotation annotation = (SingleMemberAnnotation) o;
-                String type = annotation.getTypeName().getFullyQualifiedName();
-                if (type.equals(FQCN_SUPPRESS_LINT) || type.endsWith(SUPPRESS_LINT)) {
-                    existing = annotation;
-                    break;
-                }
-            }
-        }
-
-        ImportRewrite importRewrite = ImportRewrite.create(compilationUnit, true);
-        String local = importRewrite.addImport(FQCN_SUPPRESS_LINT);
-        AST ast = declaration.getAST();
-        ASTRewrite rewriter = ASTRewrite.create(ast);
-        if (existing == null) {
-            SingleMemberAnnotation newAnnotation = ast.newSingleMemberAnnotation();
-            newAnnotation.setTypeName(ast.newSimpleName(local));
-            StringLiteral value = ast.newStringLiteral();
-            value.setLiteralValue(mId);
-            newAnnotation.setValue(value);
-            ListRewrite listRewrite = rewriter.getListRewrite(declaration,
-                    declaration.getModifiersProperty());
-            listRewrite.insertFirst(newAnnotation, null);
-        } else {
-            Expression existingValue = existing.getValue();
-            if (existingValue instanceof StringLiteral) {
-                StringLiteral stringLiteral = (StringLiteral) existingValue;
-                if (mId.equals(stringLiteral.getLiteralValue())) {
-                    // Already contains the id
-                    return null;
-                }
-                // Create a new array initializer holding the old string plus the new id
-                ArrayInitializer array = ast.newArrayInitializer();
-                StringLiteral old = ast.newStringLiteral();
-                old.setLiteralValue(stringLiteral.getLiteralValue());
-                array.expressions().add(old);
-                StringLiteral value = ast.newStringLiteral();
-                value.setLiteralValue(mId);
-                array.expressions().add(value);
-                rewriter.set(existing, VALUE_PROPERTY, array, null);
-            } else if (existingValue instanceof ArrayInitializer) {
-                // Existing array: just append the new string
-                ArrayInitializer array = (ArrayInitializer) existingValue;
-                List expressions = array.expressions();
-                if (expressions != null) {
-                    for (Object o : expressions) {
-                        if (o instanceof StringLiteral) {
-                            if (mId.equals(((StringLiteral)o).getLiteralValue())) {
-                                // Already contains the id
-                                return null;
-                            }
-                        }
-                    }
-                }
-                StringLiteral value = ast.newStringLiteral();
-                value.setLiteralValue(mId);
-                ListRewrite listRewrite = rewriter.getListRewrite(array, EXPRESSIONS_PROPERTY);
-                listRewrite.insertLast(value, null);
-            } else {
-                assert false : existingValue;
-                return null;
-            }
-        }
-
-        TextEdit importEdits = importRewrite.rewriteImports(new NullProgressMonitor());
-        TextEdit annotationEdits = rewriter.rewriteAST(document, null);
-
-        // Apply to the document
-        MultiTextEdit edit = new MultiTextEdit();
-        // Create the edit to change the imports, only if
-        // anything changed
-        if (importEdits.hasChildren()) {
-            edit.addChild(importEdits);
-        }
-        edit.addChild(annotationEdits);
-
-        return edit;
-    }
-
-    @SuppressWarnings({"rawtypes"}) // Java AST API has raw types
-    private MultiTextEdit addTargetApiAnnotation(
-            IDocument document,
-            ICompilationUnit compilationUnit,
-            BodyDeclaration declaration) throws CoreException {
-        List modifiers = declaration.modifiers();
-        SingleMemberAnnotation existing = null;
-        for (Object o : modifiers) {
-            if (o instanceof SingleMemberAnnotation) {
-                SingleMemberAnnotation annotation = (SingleMemberAnnotation) o;
-                String type = annotation.getTypeName().getFullyQualifiedName();
-                if (type.equals(FQCN_TARGET_API) || type.endsWith(TARGET_API)) {
-                    existing = annotation;
-                    break;
-                }
-            }
-        }
-
-        ImportRewrite importRewrite = ImportRewrite.create(compilationUnit, true);
-        importRewrite.addImport("android.os.Build"); //$NON-NLS-1$
-        String local = importRewrite.addImport(FQCN_TARGET_API);
-        AST ast = declaration.getAST();
-        ASTRewrite rewriter = ASTRewrite.create(ast);
-        if (existing == null) {
-            SingleMemberAnnotation newAnnotation = ast.newSingleMemberAnnotation();
-            newAnnotation.setTypeName(ast.newSimpleName(local));
-            Expression value = createLiteral(ast);
-            newAnnotation.setValue(value);
-            ListRewrite listRewrite = rewriter.getListRewrite(declaration,
-                    declaration.getModifiersProperty());
-            listRewrite.insertFirst(newAnnotation, null);
-        } else {
-            Expression value = createLiteral(ast);
-            rewriter.set(existing, VALUE_PROPERTY, value, null);
-        }
-
-        TextEdit importEdits = importRewrite.rewriteImports(new NullProgressMonitor());
-        TextEdit annotationEdits = rewriter.rewriteAST(document, null);
-        MultiTextEdit edit = new MultiTextEdit();
-        if (importEdits.hasChildren()) {
-            edit.addChild(importEdits);
-        }
-        edit.addChild(annotationEdits);
-
-        return edit;
-    }
-
-    private Expression createLiteral(AST ast) {
-        Expression value;
-        if (!isCodeName()) {
-            value = ast.newQualifiedName(
-                    ast.newQualifiedName(ast.newSimpleName("Build"), //$NON-NLS-1$
-                                ast.newSimpleName("VERSION_CODES")), //$NON-NLS-1$
-                    ast.newSimpleName(mTargetApi));
-        } else {
-            value = ast.newNumberLiteral(mTargetApi);
-        }
-        return value;
-    }
-
-    private boolean isCodeName() {
-        return Character.isDigit(mTargetApi.charAt(0));
-    }
-
-    /**
-     * Adds any applicable suppress lint fix resolutions into the given list
-     *
-     * @param marker the marker to create fixes for
-     * @param id the issue id
-     * @param resolutions a list to add the created resolutions into, if any
-     */
-    public static void createFixes(IMarker marker, String id,
-            List<IMarkerResolution> resolutions) {
-        ITextEditor textEditor = AdtUtils.getActiveTextEditor();
-        IDocumentProvider provider = textEditor.getDocumentProvider();
-        IEditorInput editorInput = textEditor.getEditorInput();
-        IDocument document = provider.getDocument(editorInput);
-        if (document == null) {
-            return;
-        }
-
-        IWorkingCopyManager manager = JavaUI.getWorkingCopyManager();
-        ICompilationUnit compilationUnit = manager.getWorkingCopy(editorInput);
-        int offset = 0;
-        int length = 0;
-        int start = marker.getAttribute(IMarker.CHAR_START, -1);
-        int end = marker.getAttribute(IMarker.CHAR_END, -1);
-        offset = start;
-        length = end - start;
-        CompilationUnit root = SharedASTProvider.getAST(compilationUnit,
-                SharedASTProvider.WAIT_YES, null);
-        if (root == null) {
-            return;
-        }
-
-        int api = -1;
-        if (id.equals(ApiDetector.UNSUPPORTED.getId()) ||
-                id.equals(ApiDetector.INLINED.getId())) {
-            String message = marker.getAttribute(IMarker.MESSAGE, null);
-            if (message != null) {
-                Pattern pattern = Pattern.compile("\\s(\\d+)\\s"); //$NON-NLS-1$
-                Matcher matcher = pattern.matcher(message);
-                if (matcher.find()) {
-                    api = Integer.parseInt(matcher.group(1));
-                }
-            }
-        }
-
-        Issue issue = EclipseLintClient.getRegistry().getIssue(id);
-        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) {
-            return;
-        }
-
-        NodeFinder nodeFinder = new NodeFinder(root, offset, length);
-        ASTNode coveringNode;
-        if (offset <= 0) {
-            // Error added on the first line of a Java class: typically from a class-based
-            // detector which lacks line information. Map this to the top level class
-            // in the file instead.
-            coveringNode = root;
-            if (root.types() != null && root.types().size() > 0) {
-                Object type = root.types().get(0);
-                if (type instanceof ASTNode) {
-                    coveringNode = (ASTNode) type;
-                }
-            }
-        } else {
-            coveringNode = nodeFinder.getCoveringNode();
-        }
-        for (ASTNode body = coveringNode; body != null; body = body.getParent()) {
-            if (body instanceof BodyDeclaration) {
-                BodyDeclaration declaration = (BodyDeclaration) body;
-
-                String target = null;
-                if (body instanceof MethodDeclaration) {
-                    target = ((MethodDeclaration) body).getName().toString() + "()"; //$NON-NLS-1$
-                } else if (body instanceof FieldDeclaration) {
-                    target = "field";
-                    FieldDeclaration field = (FieldDeclaration) body;
-                    if (field.fragments() != null && field.fragments().size() > 0) {
-                        ASTNode first = (ASTNode) field.fragments().get(0);
-                        if (first instanceof VariableDeclarationFragment) {
-                            VariableDeclarationFragment decl = (VariableDeclarationFragment) first;
-                            target = decl.getName().toString();
-                        }
-                    }
-                } else if (body instanceof AnonymousClassDeclaration) {
-                    target = "anonymous class";
-                } else if (body instanceof TypeDeclaration) {
-                    target = ((TypeDeclaration) body).getName().toString();
-                } else {
-                    target = body.getClass().getSimpleName();
-                }
-
-                // In class files, detectors can only find annotations on methods
-                // and on classes, not on variable declarations
-                if (isClassDetector && !(body instanceof MethodDeclaration
-                            || body instanceof TypeDeclaration
-                            || body instanceof AnonymousClassDeclaration
-                            || body instanceof FieldDeclaration)) {
-                    continue;
-                }
-
-                String desc = String.format("Add @SuppressLint '%1$s\' to '%2$s'", id, target);
-                resolutions.add(new AddSuppressAnnotation(id, marker, declaration, desc, null));
-
-                if (api != -1
-                        // @TargetApi is only valid on methods and classes, not fields etc
-                        && (body instanceof MethodDeclaration
-                                || body instanceof TypeDeclaration)) {
-                    String apiString = SdkVersionInfo.getBuildCode(api);
-                    if (apiString == null) {
-                        apiString = Integer.toString(api);
-                    }
-                    desc = String.format("Add @TargetApi(%1$s) to '%2$s'", apiString, target);
-                    resolutions.add(new AddSuppressAnnotation(id, marker, declaration, desc,
-                            apiString));
-                }
-            }
-        }
-    }
-}
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
deleted file mode 100644
index 88e0880..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/lint/AddSuppressAttribute.java
+++ /dev/null
@@ -1,237 +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.ide.eclipse.adt.internal.lint;
-
-import static com.android.SdkConstants.ATTR_IGNORE;
-import static com.android.SdkConstants.ATTR_TARGET_API;
-import static com.android.SdkConstants.DOT_XML;
-
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-import com.android.sdklib.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.google.common.collect.Lists;
-
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.jface.text.IDocument;
-import org.eclipse.jface.text.contentassist.ICompletionProposal;
-import org.eclipse.jface.text.contentassist.IContextInformation;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.graphics.Point;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-
-import java.util.Collections;
-import java.util.List;
-import java.util.Locale;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-/**
- * Fix for adding {@code tools:ignore="id"} attributes in XML files.
- */
-class AddSuppressAttribute implements ICompletionProposal {
-    private final AndroidXmlEditor mEditor;
-    private final String mId;
-    private final IMarker mMarker;
-    private final Element mElement;
-    private final String mDescription;
-    /**
-     * Should it create a {@code tools:targetApi} attribute instead of a
-     * {@code tools:ignore} attribute? If so pass a non null API level
-     */
-    private final String mTargetApi;
-
-
-    private AddSuppressAttribute(
-            @NonNull AndroidXmlEditor editor,
-            @NonNull String id,
-            @NonNull IMarker marker,
-            @NonNull Element element,
-            @NonNull String description,
-            @Nullable String targetApi) {
-        mEditor = editor;
-        mId = id;
-        mMarker = marker;
-        mElement = element;
-        mDescription = description;
-        mTargetApi = targetApi;
-    }
-
-    @Override
-    public Point getSelection(IDocument document) {
-        return null;
-    }
-
-    @Override
-    public String getAdditionalProposalInfo() {
-        return null;
-    }
-
-    @Override
-    public String getDisplayString() {
-        return mDescription;
-    }
-
-    @Override
-    public IContextInformation getContextInformation() {
-        return null;
-    }
-
-    @Override
-    public Image getImage() {
-        return IconFactory.getInstance().getIcon("newannotation"); //$NON-NLS-1$
-    }
-
-    @Override
-    public void apply(IDocument document) {
-        String attribute;
-        String value;
-        if (mTargetApi != null) {
-            attribute = ATTR_TARGET_API;
-            value = mTargetApi;
-        } else {
-            attribute = ATTR_IGNORE;
-            value = mId;
-        }
-        AdtUtils.setToolsAttribute(mEditor, mElement, mDescription, attribute, value,
-                true /*reveal*/, true /*append*/);
-
-        try {
-            // Remove the marker now that the suppress attribute has been added
-            // (so the user doesn't have to re-run lint just to see it disappear)
-            mMarker.delete();
-        } catch (CoreException e) {
-            AdtPlugin.log(e, "Could not remove marker");
-        }
-    }
-
-    /**
-     * Returns a quickfix to suppress a specific lint issue id on the node corresponding to
-     * the given marker.
-     *
-     * @param editor the associated editor containing the marker
-     * @param marker the marker to create fixes for
-     * @param id the issue id
-     * @return a list of fixes for this marker, possibly empty
-     */
-    @NonNull
-    public static List<AddSuppressAttribute> createFixes(
-            @NonNull AndroidXmlEditor editor,
-            @NonNull IMarker marker,
-            @NonNull String id) {
-        // This only applies to XML files:
-        String fileName = marker.getResource().getName();
-        if (!fileName.endsWith(DOT_XML)) {
-            return Collections.emptyList();
-        }
-
-        int offset = marker.getAttribute(IMarker.CHAR_START, -1);
-        Node node;
-        if (offset == -1) {
-            node = DomUtilities.getNode(editor.getStructuredDocument(), 0);
-            if (node != null) {
-                node = node.getOwnerDocument().getDocumentElement();
-            }
-        } else {
-            node = DomUtilities.getNode(editor.getStructuredDocument(), offset);
-        }
-        if (node == null) {
-            return Collections.emptyList();
-        }
-        Document document = node.getOwnerDocument();
-        while (node != null && node.getNodeType() != Node.ELEMENT_NODE) {
-            node = node.getParentNode();
-        }
-        if (node == null) {
-            node = document.getDocumentElement();
-            if (node == null) {
-                return Collections.emptyList();
-            }
-        }
-
-        String desc = String.format("Add ignore '%1$s\' to element", id);
-        Element element = (Element) node;
-        List<AddSuppressAttribute> fixes = Lists.newArrayListWithExpectedSize(2);
-        fixes.add(new AddSuppressAttribute(editor, id, marker, element, desc, null));
-
-        int api = -1;
-        if (id.equals(ApiDetector.UNSUPPORTED.getId())
-                || id.equals(ApiDetector.INLINED.getId())) {
-            String message = marker.getAttribute(IMarker.MESSAGE, null);
-            if (message != null) {
-                Pattern pattern = Pattern.compile("\\s(\\d+)\\s"); //$NON-NLS-1$
-                Matcher matcher = pattern.matcher(message);
-                if (matcher.find()) {
-                    api = Integer.parseInt(matcher.group(1));
-                    String targetApi;
-                    String buildCode = SdkVersionInfo.getBuildCode(api);
-                    if (buildCode != null) {
-                        targetApi = buildCode.toLowerCase(Locale.US);
-                        fixes.add(new AddSuppressAttribute(editor, id, marker, element,
-                                String.format("Add targetApi '%1$s\' to element", targetApi),
-                                targetApi));
-                    }
-                    targetApi = Integer.toString(api);
-                    fixes.add(new AddSuppressAttribute(editor, id, marker, element,
-                            String.format("Add targetApi '%1$s\' to element", targetApi),
-                            targetApi));
-                }
-            }
-        }
-
-        return fixes;
-    }
-
-    /**
-     * Returns a quickfix to suppress a given issue type on the <b>root element</b>
-     * of the given editor.
-     *
-     * @param editor the associated editor containing the marker
-     * @param marker the marker to create fixes for
-     * @param id the issue id
-     * @return a fix for this marker, or null if unable
-     */
-    @Nullable
-    public static AddSuppressAttribute createFixForAll(
-            @NonNull AndroidXmlEditor editor,
-            @NonNull IMarker marker,
-            @NonNull String id) {
-        // This only applies to XML files:
-        String fileName = marker.getResource().getName();
-        if (!fileName.endsWith(DOT_XML)) {
-            return null;
-        }
-
-        Node node = DomUtilities.getNode(editor.getStructuredDocument(), 0);
-        if (node != null) {
-            node = node.getOwnerDocument().getDocumentElement();
-            String desc = String.format("Add ignore '%1$s\' to element", id);
-            Element element = (Element) node;
-            return new AddSuppressAttribute(editor, id, marker, element, desc, null);
-        }
-
-        return null;
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/lint/ClearLintMarkersAction.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/lint/ClearLintMarkersAction.java
deleted file mode 100644
index a10d394..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/lint/ClearLintMarkersAction.java
+++ /dev/null
@@ -1,44 +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.eclipse.adt.internal.lint;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.ui.IActionDelegate;
-
-import java.util.List;
-
-/** Action which clear lint markers from the current project */
-public class ClearLintMarkersAction implements IActionDelegate {
-
-    private ISelection mSelection;
-
-    @Override
-    public void selectionChanged(IAction action, ISelection selection) {
-        mSelection = selection;
-    }
-
-    @Override
-    public void run(IAction action) {
-        List<IProject> projects = RunLintAction.getProjects(mSelection, false /*warn*/);
-        if (projects != null) {
-            EclipseLintRunner.cancelCurrentJobs(false);
-            EclipseLintClient.clearMarkers(projects);
-        }
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/lint/ColumnDialog.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/lint/ColumnDialog.java
deleted file mode 100644
index be987d4..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/lint/ColumnDialog.java
+++ /dev/null
@@ -1,124 +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.eclipse.adt.internal.lint;
-
-import com.android.ide.eclipse.adt.AdtPlugin;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.jface.viewers.CheckboxTableViewer;
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Listener;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.ui.dialogs.SelectionStatusDialog;
-
-/**
- * Dialog for editing visible columns in the {@link LintList}
- */
-class ColumnDialog extends SelectionStatusDialog implements Listener, IStructuredContentProvider {
-    private LintColumn[] mColumns;
-    private LintColumn[] mSelectedColumns;
-    private CheckboxTableViewer mViewer;
-
-        public ColumnDialog(Shell parent, LintColumn[] fields, LintColumn[] selected) {
-            super(parent);
-            mColumns = fields;
-            mSelectedColumns = selected;
-            setTitle("Select Visible Columns");
-            setHelpAvailable(false);
-        }
-
-        @Override
-        protected Control createDialogArea(Composite parent) {
-            Composite container = new Composite(parent, SWT.NONE);
-            container.setLayout(new GridLayout(1, false));
-            GridData gridData = new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1);
-            // Wide enough to accommodate the error label
-            gridData.widthHint = 500;
-            container.setLayoutData(gridData);
-
-            Label lblSelectVisibleColumns = new Label(container, SWT.NONE);
-            lblSelectVisibleColumns.setText("Select visible columns:");
-
-            mViewer = CheckboxTableViewer.newCheckList(container,
-                    SWT.BORDER | SWT.FULL_SELECTION | SWT.HIDE_SELECTION);
-            Table table = mViewer.getTable();
-            table.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));
-            mViewer.setContentProvider(this);
-
-            mViewer.setInput(mColumns);
-            mViewer.setCheckedElements(mSelectedColumns);
-
-            validate();
-
-            return container;
-        }
-
-        @Override
-        protected void computeResult() {
-            Object[] checked = mViewer.getCheckedElements();
-            mSelectedColumns = new LintColumn[checked.length];
-            for (int i = 0, n = checked.length; i < n; i++) {
-                mSelectedColumns[i] = (LintColumn) checked[i];
-            }
-        }
-
-        public LintColumn[] getSelectedColumns() {
-            return mSelectedColumns;
-        }
-
-        @Override
-        public void handleEvent(Event event) {
-            validate();
-        }
-
-        private void validate() {
-            IStatus status;
-            computeResult();
-
-            if (mViewer.getCheckedElements().length <= 1) {
-                status = new Status(IStatus.ERROR, AdtPlugin.PLUGIN_ID,
-                        "Must selected at least one column");
-            } else {
-                status = new Status(IStatus.OK, AdtPlugin.PLUGIN_ID, null);
-            }
-            updateStatus(status);
-        }
-
-        // ---- Implements IStructuredContentProvider ----
-
-        @Override
-        public void dispose() {
-        }
-
-        @Override
-        public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-        }
-
-        @Override
-        public Object[] getElements(Object inputElement) {
-            return mColumns;
-        }
-    }
\ No newline at end of file
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/lint/ConvertToDpFix.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/lint/ConvertToDpFix.java
deleted file mode 100644
index 628972f..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/lint/ConvertToDpFix.java
+++ /dev/null
@@ -1,113 +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.ide.eclipse.adt.internal.lint;
-
-import static com.android.SdkConstants.UNIT_PX;
-import static com.android.SdkConstants.VALUE_N_DP;
-
-import com.android.ide.eclipse.adt.AdtPlugin;
-
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.jface.dialogs.IInputValidator;
-import org.eclipse.jface.text.IDocument;
-import org.eclipse.jface.window.Window;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
-import org.w3c.dom.Attr;
-import org.w3c.dom.Element;
-import org.w3c.dom.NamedNodeMap;
-import org.w3c.dom.Node;
-
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-@SuppressWarnings("restriction") // DOM model
-final class ConvertToDpFix extends DocumentFix implements IInputValidator {
-    private ConvertToDpFix(String id, IMarker marker) {
-        super(id, marker);
-    }
-
-    @Override
-    public boolean needsFocus() {
-        return false;
-    }
-
-    @Override
-    public boolean isCancelable() {
-        return true;
-    }
-
-    @Override
-    protected void apply(IDocument document, IStructuredModel model, Node node, int start,
-            int end) {
-        Shell shell = AdtPlugin.getShell();
-        InputDensityDialog densityDialog = new InputDensityDialog(shell);
-        if (densityDialog.open() == Window.OK) {
-            int dpi = densityDialog.getDensity();
-            Element element = (Element) node;
-            Pattern pattern = Pattern.compile("(\\d+)px"); //$NON-NLS-1$
-            NamedNodeMap attributes = element.getAttributes();
-            for (int i = 0, n = attributes.getLength(); i < n; i++) {
-                Attr attribute = (Attr) attributes.item(i);
-                String value = attribute.getValue();
-                if (value.endsWith(UNIT_PX)) {
-                    Matcher matcher = pattern.matcher(value);
-                    if (matcher.matches()) {
-                        String numberString = matcher.group(1);
-                        try {
-                            int px = Integer.parseInt(numberString);
-                            int dp = px * 160 / dpi;
-                            String newValue = String.format(VALUE_N_DP, dp);
-                            attribute.setNodeValue(newValue);
-                        } catch (NumberFormatException nufe) {
-                            AdtPlugin.log(nufe, null);
-                        }
-                    }
-                }
-            }
-        }
-    }
-
-    @Override
-    public String getDisplayString() {
-        return "Convert to \"dp\"...";
-    }
-
-    @Override
-    public Image getImage() {
-        return AdtPlugin.getAndroidLogo();
-    }
-
-    // ---- Implements IInputValidator ----
-
-    @Override
-    public String isValid(String input) {
-        if (input == null || input.length() == 0)
-            return " "; //$NON-NLS-1$
-
-        try {
-            int i = Integer.parseInt(input);
-            if (i <= 0 || i > 1000) {
-                return "Invalid range";
-            }
-        } catch (NumberFormatException x) {
-            return "Enter a valid number";
-        }
-
-        return null;
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/lint/DocumentFix.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/lint/DocumentFix.java
deleted file mode 100644
index e17d5ec..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/lint/DocumentFix.java
+++ /dev/null
@@ -1,63 +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.ide.eclipse.adt.internal.lint;
-
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.ide.eclipse.adt.internal.editors.layout.gle2.DomUtilities;
-
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.jface.text.IDocument;
-import org.eclipse.wst.sse.core.StructuredModelManager;
-import org.eclipse.wst.sse.core.internal.provisional.IModelManager;
-import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
-import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;
-import org.w3c.dom.Node;
-
-@SuppressWarnings("restriction") // DOM model
-abstract class DocumentFix extends LintFix {
-
-    protected DocumentFix(String id, IMarker marker) {
-        super(id, marker);
-    }
-
-    protected abstract void apply(IDocument document, IStructuredModel model, Node node,
-            int start, int end);
-
-    @Override
-    public void apply(IDocument document) {
-        if (!(document instanceof IStructuredDocument)) {
-            AdtPlugin.log(null, "Unexpected document type: %1$s. Can't fix.",
-                    document.getClass().getName());
-            return;
-        }
-        int start = mMarker.getAttribute(IMarker.CHAR_START, -1);
-        int end = mMarker.getAttribute(IMarker.CHAR_END, -1);
-        if (start != -1 && end != -1) {
-            IModelManager manager = StructuredModelManager.getModelManager();
-            IStructuredModel model = manager.getModelForEdit((IStructuredDocument) document);
-            Node node = DomUtilities.getNode(document, start);
-            try {
-                apply(document, model, node, start, end);
-            } finally {
-                model.releaseFromEdit();
-            }
-
-            if (!isCancelable()) {
-                deleteMarker();
-            }
-        }
-    }
-}
\ No newline at end of file
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/lint/DosLineEndingsFix.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/lint/DosLineEndingsFix.java
deleted file mode 100644
index 9a5456b..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/lint/DosLineEndingsFix.java
+++ /dev/null
@@ -1,64 +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.ide.eclipse.adt.internal.lint;
-
-import com.android.ide.eclipse.adt.AdtPlugin;
-
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.jface.text.BadLocationException;
-import org.eclipse.jface.text.IDocument;
-
-/** Quickfix for correcting line endings in the file */
-class DosLineEndingsFix extends LintFix {
-
-    protected DosLineEndingsFix(String id, IMarker marker) {
-        super(id, marker);
-    }
-
-    @Override
-    public boolean needsFocus() {
-        return false;
-    }
-
-    @Override
-    public boolean isCancelable() {
-        return false;
-    }
-
-    @Override
-    public String getDisplayString() {
-        return "Fix line endings";
-    }
-
-    @Override
-    public void apply(IDocument document) {
-        char next = 0;
-        for (int i = document.getLength() - 1; i >= 0; i--) {
-            try {
-                char c = document.getChar(i);
-                if (c == '\r' && next != '\n') {
-                    document.replace(i, 1, "\n"); //$NON-NLS-1$
-                }
-                next = c;
-            } catch (BadLocationException e) {
-                AdtPlugin.log(e, null);
-                return;
-            }
-        }
-
-        deleteMarker();
-    }
-}
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
deleted file mode 100644
index 3dd4240..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/lint/EclipseLintClient.java
+++ /dev/null
@@ -1,1306 +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.eclipse.adt.internal.lint;
-
-import static com.android.SdkConstants.DOT_JAR;
-import static com.android.SdkConstants.DOT_XML;
-import static com.android.SdkConstants.FD_NATIVE_LIBS;
-import static com.android.ide.eclipse.adt.AdtConstants.MARKER_LINT;
-import static com.android.ide.eclipse.adt.AdtUtils.workspacePathToFile;
-
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.ide.eclipse.adt.AdtUtils;
-import com.android.ide.eclipse.adt.internal.editors.layout.LayoutEditorDelegate;
-import com.android.ide.eclipse.adt.internal.editors.layout.uimodel.UiViewElementNode;
-import com.android.ide.eclipse.adt.internal.preferences.AdtPrefs;
-import com.android.ide.eclipse.adt.internal.project.BaseProjectHelper;
-import com.android.ide.eclipse.adt.internal.sdk.Sdk;
-import com.android.sdklib.IAndroidTarget;
-import com.android.tools.lint.checks.BuiltinIssueRegistry;
-import com.android.tools.lint.client.api.Configuration;
-import com.android.tools.lint.client.api.IssueRegistry;
-import com.android.tools.lint.client.api.JavaParser;
-import com.android.tools.lint.client.api.LintClient;
-import com.android.tools.lint.client.api.LintDriver;
-import com.android.tools.lint.client.api.XmlParser;
-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.Handle;
-import com.android.tools.lint.detector.api.Position;
-import com.android.tools.lint.detector.api.Project;
-import com.android.tools.lint.detector.api.Severity;
-import com.android.tools.lint.detector.api.TextFormat;
-import com.android.tools.lint.detector.api.XmlContext;
-import com.android.utils.Pair;
-import com.android.utils.SdkUtils;
-import com.google.common.collect.Maps;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.jdt.core.IClasspathEntry;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.IType;
-import org.eclipse.jdt.core.ITypeHierarchy;
-import org.eclipse.jdt.core.JavaCore;
-import org.eclipse.jdt.core.JavaModelException;
-import org.eclipse.jdt.internal.compiler.CompilationResult;
-import org.eclipse.jdt.internal.compiler.DefaultErrorHandlingPolicies;
-import org.eclipse.jdt.internal.compiler.ast.CompilationUnitDeclaration;
-import org.eclipse.jdt.internal.compiler.batch.CompilationUnit;
-import org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants;
-import org.eclipse.jdt.internal.compiler.impl.CompilerOptions;
-import org.eclipse.jdt.internal.compiler.parser.Parser;
-import org.eclipse.jdt.internal.compiler.problem.AbortCompilation;
-import org.eclipse.jdt.internal.compiler.problem.DefaultProblemFactory;
-import org.eclipse.jdt.internal.compiler.problem.ProblemReporter;
-import org.eclipse.jface.text.BadLocationException;
-import org.eclipse.jface.text.IDocument;
-import org.eclipse.jface.text.IRegion;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.editors.text.TextFileDocumentProvider;
-import org.eclipse.ui.ide.IDE;
-import org.eclipse.ui.texteditor.IDocumentProvider;
-import org.eclipse.wst.sse.core.StructuredModelManager;
-import org.eclipse.wst.sse.core.internal.provisional.IModelManager;
-import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
-import org.eclipse.wst.sse.core.internal.provisional.IndexedRegion;
-import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
-import org.w3c.dom.Attr;
-import org.w3c.dom.Document;
-import org.w3c.dom.Node;
-
-import java.io.File;
-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.WeakHashMap;
-
-import lombok.ast.ecj.EcjTreeConverter;
-import lombok.ast.grammar.ParseProblem;
-import lombok.ast.grammar.Source;
-
-/**
- * Eclipse implementation for running lint on workspace files and projects.
- */
-@SuppressWarnings("restriction") // DOM model
-public class EclipseLintClient extends LintClient {
-    static final String MARKER_CHECKID_PROPERTY = "checkid";    //$NON-NLS-1$
-    private static final String MODEL_PROPERTY = "model";       //$NON-NLS-1$
-    private final List<? extends IResource> mResources;
-    private final IDocument mDocument;
-    private boolean mWasFatal;
-    private boolean mFatalOnly;
-    private EclipseJavaParser mJavaParser;
-    private boolean mCollectNodes;
-    private Map<Node, IMarker> mNodeMap;
-
-    /**
-     * Creates a new {@link EclipseLintClient}.
-     *
-     * @param registry the associated detector registry
-     * @param resources the associated resources (project, file or null)
-     * @param document the associated document, or null if the {@code resource}
-     *            param is not a file
-     * @param fatalOnly whether only fatal issues should be reported (and therefore checked)
-     */
-    public EclipseLintClient(IssueRegistry registry, List<? extends IResource> resources,
-            IDocument document, boolean fatalOnly) {
-        mResources = resources;
-        mDocument = document;
-        mFatalOnly = fatalOnly;
-    }
-
-    /**
-     * Returns true if lint should only check fatal issues
-     *
-     * @return true if lint should only check fatal issues
-     */
-    public boolean isFatalOnly() {
-        return mFatalOnly;
-    }
-
-    /**
-     * Sets whether the lint client should store associated XML nodes for each
-     * reported issue
-     *
-     * @param collectNodes if true, collect node positions for errors in XML
-     *            files, retrievable via the {@link #getIssueForNode} method
-     */
-    public void setCollectNodes(boolean collectNodes) {
-        mCollectNodes = collectNodes;
-    }
-
-    /**
-     * Returns one of the issues for the given node (there could be more than one)
-     *
-     * @param node the node to look up lint issues for
-     * @return the marker for one of the issues found for the given node
-     */
-    @Nullable
-    public IMarker getIssueForNode(@NonNull UiViewElementNode node) {
-        if (mNodeMap != null) {
-            return mNodeMap.get(node.getXmlNode());
-        }
-
-        return null;
-    }
-
-    /**
-     * Returns a collection of nodes that have one or more lint warnings
-     * associated with them (retrievable via
-     * {@link #getIssueForNode(UiViewElementNode)})
-     *
-     * @return a collection of nodes, which should <b>not</b> be modified by the
-     *         caller
-     */
-    @Nullable
-    public Collection<Node> getIssueNodes() {
-        if (mNodeMap != null) {
-            return mNodeMap.keySet();
-        }
-
-        return null;
-    }
-
-    // ----- Extends LintClient -----
-
-    @Override
-    public void log(@NonNull Severity severity, @Nullable Throwable exception,
-            @Nullable String format, @Nullable Object... args) {
-        if (exception == null) {
-            AdtPlugin.log(IStatus.WARNING, format, args);
-        } else {
-            AdtPlugin.log(exception, format, args);
-        }
-    }
-
-    @Override
-    public XmlParser getXmlParser() {
-        return new XmlParser() {
-            @Override
-            public Document parseXml(@NonNull XmlContext context) {
-                // Map File to IFile
-                IFile file = AdtUtils.fileToIFile(context.file);
-                if (file == null || !file.exists()) {
-                    String path = context.file.getPath();
-                    AdtPlugin.log(IStatus.ERROR, "Can't find file %1$s in workspace", path);
-                    return null;
-                }
-
-                IStructuredModel model = null;
-                try {
-                    IModelManager modelManager = StructuredModelManager.getModelManager();
-                    if (modelManager == null) {
-                        // This can happen if incremental lint is running right as Eclipse is
-                        // shutting down
-                        return null;
-                    }
-                    model = modelManager.getModelForRead(file);
-                    if (model instanceof IDOMModel) {
-                        context.setProperty(MODEL_PROPERTY, model);
-                        IDOMModel domModel = (IDOMModel) model;
-                        return domModel.getDocument();
-                    }
-                } catch (IOException e) {
-                    AdtPlugin.log(e, "Cannot read XML file");
-                } catch (CoreException e) {
-                    AdtPlugin.log(e, null);
-                }
-
-                return null;
-            }
-
-            @Override
-            public @NonNull Location getLocation(@NonNull XmlContext context, @NonNull Node node) {
-                IStructuredModel model = (IStructuredModel) context.getProperty(MODEL_PROPERTY);
-                return new LazyLocation(context.file, model.getStructuredDocument(),
-                        (IndexedRegion) node);
-            }
-
-            @Override
-            public @NonNull Location getLocation(@NonNull XmlContext context, @NonNull Node node,
-                    int start, int end) {
-                IndexedRegion region = (IndexedRegion) node;
-                int nodeStart = region.getStartOffset();
-
-                IStructuredModel model = (IStructuredModel) context.getProperty(MODEL_PROPERTY);
-                // Get line number
-                LazyLocation location = new LazyLocation(context.file,
-                        model.getStructuredDocument(), region);
-                int line = location.getStart().getLine();
-
-                Position startPos = new DefaultPosition(line, -1, nodeStart + start);
-                Position endPos = new DefaultPosition(line, -1, nodeStart + end);
-                return Location.create(context.file, startPos, endPos);
-            }
-
-            @Override
-            public int getNodeStartOffset(@NonNull XmlContext context, @NonNull Node node) {
-                IndexedRegion region = (IndexedRegion) node;
-                return region.getStartOffset();
-            }
-
-            @Override
-            public int getNodeEndOffset(@NonNull XmlContext context, @NonNull Node node) {
-                IndexedRegion region = (IndexedRegion) node;
-                return region.getEndOffset();
-            }
-
-            @Override
-            public @NonNull Handle createLocationHandle(final @NonNull XmlContext context,
-                    final @NonNull Node node) {
-                IStructuredModel model = (IStructuredModel) context.getProperty(MODEL_PROPERTY);
-                return new LazyLocation(context.file, model.getStructuredDocument(),
-                        (IndexedRegion) node);
-            }
-
-            @Override
-            public void dispose(@NonNull XmlContext context, @NonNull Document document) {
-                IStructuredModel model = (IStructuredModel) context.getProperty(MODEL_PROPERTY);
-                assert model != null : context.file;
-                if (model != null) {
-                    model.releaseFromRead();
-                }
-            }
-
-            @Override
-            @NonNull
-            public Location getNameLocation(@NonNull XmlContext context, @NonNull Node node) {
-                return getLocation(context, node);
-            }
-
-            @Override
-            @NonNull
-            public Location getValueLocation(@NonNull XmlContext context, @NonNull Attr node) {
-                return getLocation(context, node);
-            }
-
-        };
-    }
-
-    @Override
-    public JavaParser getJavaParser(@Nullable Project project) {
-        if (mJavaParser == null) {
-            mJavaParser = new EclipseJavaParser();
-        }
-
-        return mJavaParser;
-    }
-
-    // Cache for {@link getProject}
-    private IProject mLastEclipseProject;
-    private Project mLastLintProject;
-
-    private IProject getProject(Project project) {
-        if (project == mLastLintProject) {
-            return mLastEclipseProject;
-        }
-
-        mLastLintProject = project;
-        mLastEclipseProject = null;
-
-        if (mResources != null) {
-            if (mResources.size() == 1) {
-                IProject p = mResources.get(0).getProject();
-                mLastEclipseProject = p;
-                return p;
-            }
-
-            IProject last = null;
-            for (IResource resource : mResources) {
-                IProject p = resource.getProject();
-                if (p != last) {
-                    if (project.getDir().equals(AdtUtils.getAbsolutePath(p).toFile())) {
-                        mLastEclipseProject = p;
-                        return p;
-                    }
-                    last = p;
-                }
-            }
-        }
-
-        return null;
-    }
-
-    @Override
-    @NonNull
-    public String getProjectName(@NonNull Project project) {
-        // Initialize the lint project's name to the name of the Eclipse project,
-        // which might differ from the directory name
-        IProject eclipseProject = getProject(project);
-        if (eclipseProject != null) {
-            return eclipseProject.getName();
-        }
-
-        return super.getProjectName(project);
-    }
-
-    @NonNull
-    @Override
-    public Configuration getConfiguration(@NonNull Project project, @Nullable LintDriver driver) {
-        return getConfigurationFor(project);
-    }
-
-    /**
-     * Same as {@link #getConfiguration(Project)}, but {@code project} can be
-     * null in which case the global configuration is returned.
-     *
-     * @param project the project to look up
-     * @return a corresponding configuration
-     */
-    @NonNull
-    public Configuration getConfigurationFor(@Nullable Project project) {
-        if (project != null) {
-            IProject eclipseProject = getProject(project);
-            if (eclipseProject != null) {
-                return ProjectLintConfiguration.get(this, eclipseProject, mFatalOnly);
-            }
-        }
-
-        return GlobalLintConfiguration.get();
-    }
-    @Override
-    public void report(@NonNull Context context, @NonNull Issue issue, @NonNull Severity s,
-            @Nullable Location location,
-            @NonNull String message, @NonNull TextFormat format) {
-        message = format.toText(message);
-        int severity = getMarkerSeverity(s);
-        IMarker marker = null;
-        if (location != null) {
-            Position startPosition = location.getStart();
-            if (startPosition == null) {
-                if (location.getFile() != null) {
-                    IResource resource = AdtUtils.fileToResource(location.getFile());
-                    if (resource != null && resource.isAccessible()) {
-                        marker = BaseProjectHelper.markResource(resource, MARKER_LINT,
-                                message, 0, severity);
-                    }
-                }
-            } else {
-                Position endPosition = location.getEnd();
-                int line = startPosition.getLine() + 1; // Marker API is 1-based
-                IFile file = AdtUtils.fileToIFile(location.getFile());
-                if (file != null && file.isAccessible()) {
-                    Pair<Integer, Integer> r = getRange(file, mDocument,
-                            startPosition, endPosition);
-                    int startOffset = r.getFirst();
-                    int endOffset = r.getSecond();
-                    marker = BaseProjectHelper.markResource(file, MARKER_LINT,
-                            message, line, startOffset, endOffset, severity);
-                }
-            }
-        }
-
-        if (marker == null) {
-            marker = BaseProjectHelper.markResource(mResources.get(0), MARKER_LINT,
-                        message, 0, severity);
-        }
-
-        if (marker != null) {
-            // Store marker id such that we can recognize it from the suppress quickfix
-            try {
-                marker.setAttribute(MARKER_CHECKID_PROPERTY, issue.getId());
-            } catch (CoreException e) {
-                AdtPlugin.log(e, null);
-            }
-        }
-
-        if (s == Severity.FATAL) {
-            mWasFatal = true;
-        }
-
-        if (mCollectNodes && location != null && marker != null) {
-            if (location instanceof LazyLocation) {
-                LazyLocation l = (LazyLocation) location;
-                IndexedRegion region = l.mRegion;
-                if (region instanceof Node) {
-                    Node node = (Node) region;
-                    if (node instanceof Attr) {
-                        node = ((Attr) node).getOwnerElement();
-                    }
-                    if (mNodeMap == null) {
-                        mNodeMap = new WeakHashMap<Node, IMarker>();
-                    }
-                    IMarker prev = mNodeMap.get(node);
-                    if (prev != null) {
-                        // Only replace the node if this node has higher priority
-                        int prevSeverity = prev.getAttribute(IMarker.SEVERITY, 0);
-                        if (prevSeverity < severity) {
-                            mNodeMap.put(node, marker);
-                        }
-                    } else {
-                        mNodeMap.put(node, marker);
-                    }
-                }
-            }
-        }
-    }
-
-    @Override
-    @Nullable
-    public File findResource(@NonNull String relativePath) {
-        // Look within the $ANDROID_SDK
-        String sdkFolder = AdtPrefs.getPrefs().getOsSdkFolder();
-        if (sdkFolder != null) {
-            File file = new File(sdkFolder, relativePath);
-            if (file.exists()) {
-                return file;
-            }
-        }
-
-        return null;
-    }
-
-    /**
-     * Clears any lint markers from the given resource (project, folder or file)
-     *
-     * @param resource the resource to remove markers from
-     */
-    public static void clearMarkers(@NonNull IResource resource) {
-        clearMarkers(Collections.singletonList(resource));
-    }
-
-    /** Clears any lint markers from the given list of resource (project, folder or file) */
-    static void clearMarkers(List<? extends IResource> resources) {
-        for (IResource resource : resources) {
-            try {
-                if (resource.isAccessible()) {
-                    resource.deleteMarkers(MARKER_LINT, false, IResource.DEPTH_INFINITE);
-                }
-            } catch (CoreException e) {
-                AdtPlugin.log(e, null);
-            }
-        }
-
-        IEditorPart activeEditor = AdtUtils.getActiveEditor();
-        LayoutEditorDelegate delegate = LayoutEditorDelegate.fromEditor(activeEditor);
-        if (delegate != null) {
-            delegate.getGraphicalEditor().getLayoutActionBar().updateErrorIndicator();
-        }
-    }
-
-    /**
-     * Removes all markers of the given id from the given resource.
-     *
-     * @param resource the resource to remove markers from (file or project, or
-     *            null for all open projects)
-     * @param id the id for the issue whose markers should be deleted
-     */
-    public static void removeMarkers(IResource resource, String id) {
-        if (resource == null) {
-            IJavaProject[] androidProjects = BaseProjectHelper.getAndroidProjects(null);
-            for (IJavaProject project : androidProjects) {
-                IProject p = project.getProject();
-                if (p != null) {
-                    // Recurse, but with a different parameter so it will not continue recursing
-                    removeMarkers(p, id);
-                }
-            }
-            return;
-        }
-        IMarker[] markers = getMarkers(resource);
-        for (IMarker marker : markers) {
-            if (id.equals(getId(marker))) {
-                try {
-                    marker.delete();
-                } catch (CoreException e) {
-                    AdtPlugin.log(e, null);
-                }
-            }
-        }
-    }
-
-    /**
-     * Returns the lint marker for the given resource (which may be a project, folder or file)
-     *
-     * @param resource the resource to be checked, typically a source file
-     * @return an array of markers, possibly empty but never null
-     */
-    public static IMarker[] getMarkers(IResource resource) {
-        try {
-            if (resource.isAccessible()) {
-                return resource.findMarkers(MARKER_LINT, false, IResource.DEPTH_INFINITE);
-            }
-        } catch (CoreException e) {
-            AdtPlugin.log(e, null);
-        }
-
-        return new IMarker[0];
-    }
-
-    private static int getMarkerSeverity(Severity severity) {
-        switch (severity) {
-            case INFORMATIONAL:
-                return IMarker.SEVERITY_INFO;
-            case WARNING:
-                return IMarker.SEVERITY_WARNING;
-            case FATAL:
-            case ERROR:
-            default:
-                return IMarker.SEVERITY_ERROR;
-        }
-    }
-
-    private static Pair<Integer, Integer> getRange(IFile file, IDocument doc,
-            Position startPosition, Position endPosition) {
-        int startOffset = startPosition.getOffset();
-        int endOffset = endPosition != null ? endPosition.getOffset() : -1;
-        if (endOffset != -1) {
-            // Attribute ranges often include trailing whitespace; trim this up
-            if (doc == null) {
-                IDocumentProvider provider = new TextFileDocumentProvider();
-                try {
-                    provider.connect(file);
-                    doc = provider.getDocument(file);
-                    if (doc != null) {
-                        return adjustOffsets(doc, startOffset, endOffset);
-                    }
-                } catch (Exception e) {
-                    AdtPlugin.log(e, "Can't find range information for %1$s", file.getName());
-                } finally {
-                    provider.disconnect(file);
-                }
-            } else {
-                return adjustOffsets(doc, startOffset, endOffset);
-            }
-        }
-
-        return Pair.of(startOffset, startOffset);
-    }
-
-    /**
-     * Trim off any trailing space on the given offset range in the given
-     * document, and don't span multiple lines on ranges since it makes (for
-     * example) the XML editor just glow with yellow underlines for all the
-     * attributes etc. Highlighting just the element beginning gets the point
-     * across. It also makes it more obvious where there are warnings on both
-     * the overall element and on individual attributes since without this the
-     * warnings on attributes would just overlap with the whole-element
-     * highlighting.
-     */
-    private static Pair<Integer, Integer> adjustOffsets(IDocument doc, int startOffset,
-            int endOffset) {
-        int originalStart = startOffset;
-        int originalEnd = endOffset;
-
-        if (doc != null) {
-            while (endOffset > startOffset && endOffset < doc.getLength()) {
-                try {
-                    if (!Character.isWhitespace(doc.getChar(endOffset - 1))) {
-                        break;
-                    } else {
-                        endOffset--;
-                    }
-                } catch (BadLocationException e) {
-                    // Pass - we've already validated offset range above
-                    break;
-                }
-            }
-
-            // Also don't span lines
-            int lineEnd = startOffset;
-            while (lineEnd < endOffset) {
-                try {
-                    char c = doc.getChar(lineEnd);
-                    if (c == '\n' || c == '\r') {
-                        endOffset = lineEnd;
-                        if (endOffset > 0 && doc.getChar(endOffset - 1) == '\r') {
-                            endOffset--;
-                        }
-                        break;
-                    }
-                } catch (BadLocationException e) {
-                    // Pass - we've already validated offset range above
-                    break;
-                }
-                lineEnd++;
-            }
-        }
-
-        if (startOffset >= endOffset) {
-            // Selecting nothing (for example, for the mangled CRLF delimiter issue selecting
-            // just the newline)
-            // In that case, use the real range
-            return Pair.of(originalStart, originalEnd);
-        }
-
-        return Pair.of(startOffset, endOffset);
-    }
-
-    /**
-     * Returns true if a fatal error was encountered
-     *
-     * @return true if a fatal error was encountered
-     */
-    public boolean hasFatalErrors() {
-        return mWasFatal;
-    }
-
-    /**
-     * Describe the issue for the given marker
-     *
-     * @param marker the marker to look up
-     * @return a full description of the corresponding issue, never null
-     */
-    public static String describe(IMarker marker) {
-        IssueRegistry registry = getRegistry();
-        String markerId = getId(marker);
-        Issue issue = registry.getIssue(markerId);
-        if (issue == null) {
-            return "";
-        }
-
-        String summary = issue.getBriefDescription(TextFormat.TEXT);
-        String explanation = issue.getExplanation(TextFormat.TEXT);
-
-        StringBuilder sb = new StringBuilder(summary.length() + explanation.length() + 20);
-        try {
-            sb.append((String) marker.getAttribute(IMarker.MESSAGE));
-            sb.append('\n').append('\n');
-        } catch (CoreException e) {
-        }
-        sb.append("Issue: ");
-        sb.append(summary);
-        sb.append('\n');
-        sb.append("Id: ");
-        sb.append(issue.getId());
-        sb.append('\n').append('\n');
-        sb.append(explanation);
-
-        if (issue.getMoreInfo() != null) {
-            sb.append('\n').append('\n');
-            sb.append(issue.getMoreInfo());
-        }
-
-        return sb.toString();
-    }
-
-    /**
-     * Returns the id for the given marker
-     *
-     * @param marker the marker to look up
-     * @return the corresponding issue id, or null
-     */
-    public static String getId(IMarker marker) {
-        try {
-            return (String) marker.getAttribute(MARKER_CHECKID_PROPERTY);
-        } catch (CoreException e) {
-            return null;
-        }
-    }
-
-    /**
-     * Shows the given marker in the editor
-     *
-     * @param marker the marker to be shown
-     */
-    public static void showMarker(IMarker marker) {
-        IRegion region = null;
-        try {
-            int start = marker.getAttribute(IMarker.CHAR_START, -1);
-            int end = marker.getAttribute(IMarker.CHAR_END, -1);
-            if (start >= 0 && end >= 0) {
-                region = new org.eclipse.jface.text.Region(start, end - start);
-            }
-
-            IResource resource = marker.getResource();
-            if (resource instanceof IFile) {
-                IEditorPart editor =
-                        AdtPlugin.openFile((IFile) resource, region, true /* showEditorTab */);
-                if (editor != null) {
-                    IDE.gotoMarker(editor, marker);
-                }
-            }
-        } catch (PartInitException ex) {
-            AdtPlugin.log(ex, null);
-        }
-    }
-
-    /**
-     * Show a dialog with errors for the given file
-     *
-     * @param shell the parent shell to attach the dialog to
-     * @param file the file to show the errors for
-     * @param editor the editor for the file, if known
-     */
-    public static void showErrors(
-            @NonNull Shell shell,
-            @NonNull IFile file,
-            @Nullable IEditorPart editor) {
-        LintListDialog dialog = new LintListDialog(shell, file, editor);
-        dialog.open();
-    }
-
-    @Override
-    public @NonNull String readFile(@NonNull File f) {
-        // Map File to IFile
-        IFile file = AdtUtils.fileToIFile(f);
-        if (file == null || !file.exists()) {
-            String path = f.getPath();
-            AdtPlugin.log(IStatus.ERROR, "Can't find file %1$s in workspace", path);
-            return readPlainFile(f);
-        }
-
-        if (SdkUtils.endsWithIgnoreCase(file.getName(), DOT_XML)) {
-            IStructuredModel model = null;
-            try {
-                IModelManager modelManager = StructuredModelManager.getModelManager();
-                model = modelManager.getModelForRead(file);
-                return model.getStructuredDocument().get();
-            } catch (IOException e) {
-                AdtPlugin.log(e, "Cannot read XML file");
-            } catch (CoreException e) {
-                AdtPlugin.log(e, null);
-            } finally {
-                if (model != null) {
-                    // TODO: This may be too early...
-                    model.releaseFromRead();
-                }
-            }
-        }
-
-        return readPlainFile(f);
-    }
-
-    private String readPlainFile(File file) {
-        try {
-            return LintUtils.getEncodedString(this, file);
-        } catch (IOException e) {
-            return ""; //$NON-NLS-1$
-        }
-    }
-
-    private Map<Project, ClassPathInfo> mProjectInfo;
-
-    @Override
-    @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 = null;
-            List<File> classes = null;
-            List<File> libraries = null;
-
-            IProject p = getProject(project);
-            if (p != null) {
-                try {
-                    IJavaProject javaProject = BaseProjectHelper.getJavaProject(p);
-
-                    // Output path
-                    File file = workspacePathToFile(javaProject.getOutputLocation());
-                    classes = Collections.singletonList(file);
-
-                    // Source path
-                    IClasspathEntry[] entries = javaProject.getRawClasspath();
-                    sources = new ArrayList<File>(entries.length);
-                    libraries = new ArrayList<File>(entries.length);
-                    for (int i = 0; i < entries.length; i++) {
-                        IClasspathEntry entry = entries[i];
-                        int kind = entry.getEntryKind();
-
-                        if (kind == IClasspathEntry.CPE_VARIABLE) {
-                            entry = JavaCore.getResolvedClasspathEntry(entry);
-                            if (entry == null) {
-                                // It's possible that the variable is no longer valid; ignore
-                                continue;
-                            }
-                            kind = entry.getEntryKind();
-                        }
-
-                        if (kind == IClasspathEntry.CPE_SOURCE) {
-                            sources.add(workspacePathToFile(entry.getPath()));
-                        } else if (kind == IClasspathEntry.CPE_LIBRARY) {
-                            libraries.add(entry.getPath().toFile());
-                        }
-                        // Note that we ignore IClasspathEntry.CPE_CONTAINER:
-                        // Normal Android Eclipse projects supply both
-                        //   AdtConstants.CONTAINER_FRAMEWORK
-                        // and
-                        //   AdtConstants.CONTAINER_LIBRARIES
-                        // here. We ignore the framework classes for obvious reasons,
-                        // but we also ignore the library container because lint will
-                        // process the libraries differently. When Eclipse builds a
-                        // project, it gets the .jar output of the library projects
-                        // from this container, which means it doesn't have to process
-                        // the library sources. Lint on the other hand wants to process
-                        // the source code, so instead it actually looks at the
-                        // project.properties file to find the libraries, and then it
-                        // iterates over all the library projects in turn and analyzes
-                        // those separately (but passing the main project for context,
-                        // such that the including project's manifest declarations
-                        // are used for data like minSdkVersion level).
-                        //
-                        // Note that this container will also contain *other*
-                        // libraries (Java libraries, not library projects) that we
-                        // *should* include. However, we can't distinguish these
-                        // class path entries from the library project jars,
-                        // so instead of looking at these, we simply listFiles() in
-                        // the libs/ folder after processing the classpath info
-                    }
-
-                    // Add in libraries
-                    File libs = new File(project.getDir(), FD_NATIVE_LIBS);
-                    if (libs.isDirectory()) {
-                        File[] jars = libs.listFiles();
-                        if (jars != null) {
-                            for (File jar : jars) {
-                                if (SdkUtils.endsWith(jar.getPath(), DOT_JAR)) {
-                                    libraries.add(jar);
-                                }
-                            }
-                        }
-                    }
-                } catch (CoreException e) {
-                    AdtPlugin.log(e, null);
-                }
-            }
-
-            if (sources == null) {
-                sources = super.getClassPath(project).getSourceFolders();
-            }
-            if (classes == null) {
-                classes = super.getClassPath(project).getClassFolders();
-            }
-            if (libraries == null) {
-                libraries = super.getClassPath(project).getLibraries();
-            }
-
-
-            // No test folders in Eclipse:
-            // https://bugs.eclipse.org/bugs/show_bug.cgi?id=224708
-            List<File> tests = Collections.emptyList();
-
-            info = new ClassPathInfo(sources, classes, libraries, tests);
-            mProjectInfo.put(project, info);
-        }
-
-        return info;
-    }
-
-    /**
-     * Returns the registry of issues to check from within Eclipse.
-     *
-     * @return the issue registry to use to access detectors and issues
-     */
-    public static IssueRegistry getRegistry() {
-        return new EclipseLintIssueRegistry();
-    }
-
-    @Override
-    public @NonNull Class<? extends Detector> replaceDetector(
-            @NonNull Class<? extends Detector> detectorClass) {
-        return detectorClass;
-    }
-
-    @Override
-    @NonNull
-    public IAndroidTarget[] getTargets() {
-        Sdk sdk = Sdk.getCurrent();
-        if (sdk != null) {
-            return sdk.getTargets();
-        } else {
-            return new IAndroidTarget[0];
-        }
-    }
-
-    private boolean mSearchForSuperClasses;
-
-    /**
-     * Sets whether this client should search for super types on its own. This
-     * is typically not needed when doing a full lint run (because lint will
-     * look at all classes and libraries), but is useful during incremental
-     * analysis when lint is only looking at a subset of classes. In that case,
-     * we want to use Eclipse's data structures for super classes.
-     *
-     * @param search whether to use a custom Eclipse search for super class
-     *            names
-     */
-    public void setSearchForSuperClasses(boolean search) {
-        mSearchForSuperClasses = search;
-    }
-
-    /**
-     * Whether this lint client is searching for super types. See
-     * {@link #setSearchForSuperClasses(boolean)} for details.
-     *
-     * @return whether the client will search for super types
-     */
-    public boolean getSearchForSuperClasses() {
-        return mSearchForSuperClasses;
-    }
-
-    @Override
-    @Nullable
-    public String getSuperClass(@NonNull Project project, @NonNull String name) {
-        if (!mSearchForSuperClasses) {
-            // Super type search using the Eclipse index is potentially slow, so
-            // only do this when necessary
-            return null;
-        }
-
-        IProject eclipseProject = getProject(project);
-        if (eclipseProject == null) {
-            return null;
-        }
-
-        try {
-            IJavaProject javaProject = BaseProjectHelper.getJavaProject(eclipseProject);
-            if (javaProject == null) {
-                return null;
-            }
-
-            String typeFqcn = ClassContext.getFqcn(name);
-            IType type = javaProject.findType(typeFqcn);
-            if (type != null) {
-                ITypeHierarchy hierarchy = type.newSupertypeHierarchy(new NullProgressMonitor());
-                IType superType = hierarchy.getSuperclass(type);
-                if (superType != null) {
-                    String key = superType.getKey();
-                    if (!key.isEmpty()
-                            && key.charAt(0) == 'L'
-                            && key.charAt(key.length() - 1) == ';') {
-                        return key.substring(1, key.length() - 1);
-                    } else {
-                        String fqcn = superType.getFullyQualifiedName();
-                        return ClassContext.getInternalName(fqcn);
-                    }
-                }
-            }
-        } catch (JavaModelException e) {
-            log(Severity.INFORMATIONAL, e, null);
-        } catch (CoreException e) {
-            log(Severity.INFORMATIONAL, e, null);
-        }
-
-        return null;
-    }
-
-    @Override
-    @Nullable
-    public Boolean isSubclassOf(
-            @NonNull Project project,
-            @NonNull String name, @NonNull
-            String superClassName) {
-        if (!mSearchForSuperClasses) {
-            // Super type search using the Eclipse index is potentially slow, so
-            // only do this when necessary
-            return null;
-        }
-
-        IProject eclipseProject = getProject(project);
-        if (eclipseProject == null) {
-            return null;
-        }
-
-        try {
-            IJavaProject javaProject = BaseProjectHelper.getJavaProject(eclipseProject);
-            if (javaProject == null) {
-                return null;
-            }
-
-            String typeFqcn = ClassContext.getFqcn(name);
-            IType type = javaProject.findType(typeFqcn);
-            if (type != null) {
-                ITypeHierarchy hierarchy = type.newSupertypeHierarchy(new NullProgressMonitor());
-                IType[] allSupertypes = hierarchy.getAllSuperclasses(type);
-                if (allSupertypes != null) {
-                    String target = 'L' + superClassName + ';';
-                    for (IType superType : allSupertypes) {
-                        if (target.equals(superType.getKey())) {
-                            return Boolean.TRUE;
-                        }
-                    }
-                    return Boolean.FALSE;
-                }
-            }
-        } catch (JavaModelException e) {
-            log(Severity.INFORMATIONAL, e, null);
-        } catch (CoreException e) {
-            log(Severity.INFORMATIONAL, e, null);
-        }
-
-        return null;
-    }
-
-    private static class LazyLocation extends Location implements Location.Handle {
-        private final IStructuredDocument mDocument;
-        private final IndexedRegion mRegion;
-        private Position mStart;
-        private Position mEnd;
-
-        public LazyLocation(File file, IStructuredDocument document, IndexedRegion region) {
-            super(file, null /*start*/, null /*end*/);
-            mDocument = document;
-            mRegion = region;
-        }
-
-        @Override
-        public Position getStart() {
-            if (mStart == null) {
-                int line = -1;
-                int column = -1;
-                int offset = mRegion.getStartOffset();
-
-                if (mRegion instanceof org.w3c.dom.Text && mDocument != null) {
-                    // For text nodes, skip whitespace prefix, if any
-                    for (int i = offset;
-                            i < mRegion.getEndOffset() && i < mDocument.getLength(); i++) {
-                        try {
-                            char c = mDocument.getChar(i);
-                            if (!Character.isWhitespace(c)) {
-                                offset = i;
-                                break;
-                            }
-                        } catch (BadLocationException e) {
-                            break;
-                        }
-                    }
-                }
-
-                if (mDocument != null && offset < mDocument.getLength()) {
-                    line = mDocument.getLineOfOffset(offset);
-                    column = -1;
-                    try {
-                        int lineOffset = mDocument.getLineOffset(line);
-                        column = offset - lineOffset;
-                    } catch (BadLocationException e) {
-                        AdtPlugin.log(e, null);
-                    }
-                }
-
-                mStart = new DefaultPosition(line, column, offset);
-            }
-
-            return mStart;
-        }
-
-        @Override
-        public Position getEnd() {
-            if (mEnd == null) {
-                mEnd = new DefaultPosition(-1, -1, mRegion.getEndOffset());
-            }
-
-            return mEnd;
-        }
-
-        @Override
-        public @NonNull Location resolve() {
-            return this;
-        }
-    }
-
-    private static class EclipseJavaParser extends JavaParser {
-        private static final boolean USE_ECLIPSE_PARSER = true;
-        private final Parser mParser;
-
-        EclipseJavaParser() {
-            if (USE_ECLIPSE_PARSER) {
-                CompilerOptions options = new CompilerOptions();
-                // Always using JDK 7 rather than basing it on project metadata since we
-                // don't do compilation error validation in lint (we leave that to the IDE's
-                // error parser or the command line build's compilation step); we want an
-                // AST that is as tolerant as possible.
-                options.complianceLevel = ClassFileConstants.JDK1_7;
-                options.sourceLevel = ClassFileConstants.JDK1_7;
-                options.targetJDK = ClassFileConstants.JDK1_7;
-                options.parseLiteralExpressionsAsConstants = true;
-                ProblemReporter problemReporter = new ProblemReporter(
-                        DefaultErrorHandlingPolicies.exitOnFirstError(),
-                        options,
-                        new DefaultProblemFactory());
-                mParser = new Parser(problemReporter, options.parseLiteralExpressionsAsConstants);
-                mParser.javadocParser.checkDocComment = false;
-            } else {
-                mParser = null;
-            }
-        }
-
-        @Override
-        public void prepareJavaParse(@NonNull List<JavaContext> contexts) {
-            // TODO: Use batch compiler from lint-cli.jar
-        }
-
-        @Override
-        public lombok.ast.Node parseJava(@NonNull JavaContext context) {
-            if (USE_ECLIPSE_PARSER) {
-                // Use Eclipse's compiler
-                EcjTreeConverter converter = new EcjTreeConverter();
-                String code = context.getContents();
-
-                CompilationUnit sourceUnit = new CompilationUnit(code.toCharArray(),
-                        context.file.getName(), "UTF-8"); //$NON-NLS-1$
-                CompilationResult compilationResult = new CompilationResult(sourceUnit, 0, 0, 0);
-                CompilationUnitDeclaration unit = null;
-                try {
-                    unit = mParser.parse(sourceUnit, compilationResult);
-                } catch (AbortCompilation e) {
-                    // No need to report Java parsing errors while running in Eclipse.
-                    // Eclipse itself will already provide problem markers for these files,
-                    // so all this achieves is creating "multiple annotations on this line"
-                    // tooltips instead.
-                    return null;
-                }
-                if (unit == null) {
-                    return null;
-                }
-
-                try {
-                    converter.visit(code, unit);
-                    List<? extends lombok.ast.Node> nodes = converter.getAll();
-
-                    // There could be more than one node when there are errors; pick out the
-                    // compilation unit node
-                    for (lombok.ast.Node node : nodes) {
-                        if (node instanceof lombok.ast.CompilationUnit) {
-                            return node;
-                        }
-                    }
-
-                    return null;
-                } catch (Throwable t) {
-                    AdtPlugin.log(t, "Failed converting ECJ parse tree to Lombok for file %1$s",
-                            context.file.getPath());
-                    return null;
-                }
-            } else {
-                // Use Lombok for now
-                Source source = new Source(context.getContents(), context.file.getName());
-                List<lombok.ast.Node> nodes = source.getNodes();
-
-                // Don't analyze files containing errors
-                List<ParseProblem> problems = source.getProblems();
-                if (problems != null && problems.size() > 0) {
-                    /* Silently ignore the errors. There are still some bugs in Lombok/Parboiled
-                     * (triggered if you run lint on the AOSP framework directory for example),
-                     * and having these show up as fatal errors when it's really a tool bug
-                     * is bad. To make matters worse, the error messages aren't clear:
-                     * http://code.google.com/p/projectlombok/issues/detail?id=313
-                    for (ParseProblem problem : problems) {
-                        lombok.ast.Position position = problem.getPosition();
-                        Location location = Location.create(context.file,
-                                context.getContents(), position.getStart(), position.getEnd());
-                        String message = problem.getMessage();
-                        context.report(
-                                IssueRegistry.PARSER_ERROR, location,
-                                message,
-                                null);
-
-                    }
-                    */
-                    return null;
-                }
-
-                // There could be more than one node when there are errors; pick out the
-                // compilation unit node
-                for (lombok.ast.Node node : nodes) {
-                    if (node instanceof lombok.ast.CompilationUnit) {
-                        return node;
-                    }
-                }
-                return null;
-            }
-        }
-
-        @Override
-        public @NonNull Location getLocation(@NonNull JavaContext context,
-                @NonNull lombok.ast.Node node) {
-            lombok.ast.Position position = node.getPosition();
-            return Location.create(context.file, context.getContents(),
-                    position.getStart(), position.getEnd());
-        }
-
-        @Override
-        public @NonNull Handle createLocationHandle(@NonNull JavaContext context,
-                @NonNull lombok.ast.Node node) {
-            return new LocationHandle(context.file, node);
-        }
-
-        @Override
-        public void dispose(@NonNull JavaContext context,
-                @NonNull lombok.ast.Node compilationUnit) {
-        }
-
-        @Override
-        @Nullable
-        public ResolvedNode resolve(@NonNull JavaContext context,
-                @NonNull lombok.ast.Node node) {
-            return null;
-        }
-
-        @Override
-        @Nullable
-        public TypeDescriptor 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;
-            private lombok.ast.Node mNode;
-            private Object mClientData;
-
-            public LocationHandle(File file, lombok.ast.Node node) {
-                mFile = file;
-                mNode = node;
-            }
-
-            @Override
-            public @NonNull Location resolve() {
-                lombok.ast.Position pos = mNode.getPosition();
-                return Location.create(mFile, null /*contents*/, pos.getStart(), pos.getEnd());
-            }
-
-            @Override
-            public void setClientData(@Nullable Object clientData) {
-                mClientData = clientData;
-            }
-
-            @Override
-            @Nullable
-            public Object getClientData() {
-                return mClientData;
-            }
-        }
-    }
-}
-
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/lint/EclipseLintIssueRegistry.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/lint/EclipseLintIssueRegistry.java
deleted file mode 100644
index 3abbdeb..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/lint/EclipseLintIssueRegistry.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * Copyright (C) 2014 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.lint;
-
-import com.android.annotations.NonNull;
-import com.android.tools.lint.checks.*;
-import com.android.tools.lint.detector.api.Issue;
-
-import java.util.ArrayList;
-import java.util.List;
-
-public class EclipseLintIssueRegistry extends BuiltinIssueRegistry {
-    private static List<Issue> sFilteredIssues;
-
-    public EclipseLintIssueRegistry() {
-    }
-
-    @NonNull
-    @Override
-    public List<Issue> getIssues() {
-        if (sFilteredIssues == null) {
-            // Remove issues that do not work properly in Eclipse
-            List<Issue> sIssues = super.getIssues();
-            List<Issue> result = new ArrayList<Issue>(sIssues.size());
-            for (Issue issue : sIssues) {
-                if (issue == MissingClassDetector.INSTANTIATABLE) {
-                    // Apparently violated by
-                    // android.support.v7.internal.widget.ActionBarView.HomeView
-                    // See issue 72760
-                    continue;
-                } else if (issue == DuplicateIdDetector.WITHIN_LAYOUT) {
-                    // Apparently violated by
-                    // sdk/extras/android/support/v7/appcompat/abc_activity_chooser_view_include.xml
-                    // See issue 72760
-                    continue;
-                } else if (issue == AppCompatResourceDetector.ISSUE
-                        || issue == AppCompatCallDetector.ISSUE) {
-                    // Apparently has some false positives in Eclipse; see issue
-                    // 72824
-                    continue;
-                } else if (issue.getImplementation().getDetectorClass() == RtlDetector.class) {
-                    // False positives in Eclipse; see issue 78780
-                    continue;
-                }
-                result.add(issue);
-            }
-            sFilteredIssues = result;
-        }
-
-        return sFilteredIssues;
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/lint/EclipseLintRunner.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/lint/EclipseLintRunner.java
deleted file mode 100644
index 43cd48d..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/lint/EclipseLintRunner.java
+++ /dev/null
@@ -1,238 +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.eclipse.adt.internal.lint;
-
-
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.ide.eclipse.adt.internal.preferences.AdtPrefs;
-import com.android.ide.eclipse.adt.internal.sdk.ProjectState;
-import com.android.ide.eclipse.adt.internal.sdk.Sdk;
-import com.android.tools.lint.client.api.IssueRegistry;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.jobs.Job;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.jface.text.IDocument;
-import org.eclipse.swt.widgets.Shell;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.IdentityHashMap;
-import java.util.List;
-import java.util.Map;
-
-/**
- * Eclipse implementation for running lint on workspace files and projects.
- */
-public class EclipseLintRunner {
-    static final String MARKER_CHECKID_PROPERTY = "checkid";    //$NON-NLS-1$
-
-    /**
-     * Runs lint and updates the markers, and waits for the result. Returns
-     * true if fatal errors were found.
-     *
-     * @param resources the resources (project, folder or file) to be analyzed
-     * @param source if checking a single source file, the source file
-     * @param doc the associated document, if known, or null
-     * @param fatalOnly if true, only report fatal issues (severity=error)
-     * @return true if any fatal errors were encountered.
-     */
-    private static boolean runLint(
-            @NonNull List<? extends IResource> resources,
-            @Nullable IResource source,
-            @Nullable IDocument doc,
-            boolean fatalOnly) {
-        resources = addLibraries(resources);
-        LintJob job = (LintJob) startLint(resources, source,  doc, fatalOnly,
-                false /*show*/);
-        try {
-            job.join();
-            boolean fatal = job.isFatal();
-
-            if (fatal) {
-                LintViewPart.show(resources);
-            }
-
-            return fatal;
-        } catch (InterruptedException e) {
-            AdtPlugin.log(e, null);
-        }
-
-        return false;
-    }
-
-    /**
-     * Runs lint and updates the markers. Does not wait for the job to finish -
-     * just returns immediately.
-     *
-     * @param resources the resources (project, folder or file) to be analyzed
-     * @param source if checking a single source file, the source file. When
-     *            single checking an XML file, this is typically the same as the
-     *            file passed in the list in the first parameter, but when
-     *            checking the .class files of a Java file for example, the
-     *            .class file and all the inner classes of the Java file are
-     *            passed in the first parameter, and the corresponding .java
-     *            source file is passed here.
-     * @param doc the associated document, if known, or null
-     * @param fatalOnly if true, only report fatal issues (severity=error)
-     * @param show if true, show the results in a {@link LintViewPart}
-     * @return the job running lint in the background.
-     */
-    public static Job startLint(
-            @NonNull List<? extends IResource> resources,
-            @Nullable IResource source,
-            @Nullable IDocument doc,
-            boolean fatalOnly,
-            boolean show) {
-        IssueRegistry registry = EclipseLintClient.getRegistry();
-        EclipseLintClient client = new EclipseLintClient(registry, resources, doc, fatalOnly);
-        return startLint(client, resources, source, show);
-    }
-
-    /**
-     * Runs lint and updates the markers. Does not wait for the job to finish -
-     * just returns immediately.
-     *
-     * @param client the lint client receiving issue reports etc
-     * @param resources the resources (project, folder or file) to be analyzed
-     * @param source if checking a single source file, the source file. When
-     *            single checking an XML file, this is typically the same as the
-     *            file passed in the list in the first parameter, but when
-     *            checking the .class files of a Java file for example, the
-     *            .class file and all the inner classes of the Java file are
-     *            passed in the first parameter, and the corresponding .java
-     *            source file is passed here.
-     * @param show if true, show the results in a {@link LintViewPart}
-     * @return the job running lint in the background.
-     */
-    public static Job startLint(
-            @NonNull EclipseLintClient client,
-            @NonNull List<? extends IResource> resources,
-            @Nullable IResource source,
-            boolean show) {
-        if (resources != null && !resources.isEmpty()) {
-            if (!AdtPrefs.getPrefs().getSkipLibrariesFromLint()) {
-                resources = addLibraries(resources);
-            }
-
-            cancelCurrentJobs(false);
-
-            LintJob job = new LintJob(client, resources, source);
-            job.schedule();
-
-            if (show) {
-                // Show lint view where the results are listed
-                LintViewPart.show(resources);
-            }
-            return job;
-        }
-
-        return null;
-    }
-
-    /**
-     * Run Lint for an Export APK action. If it succeeds (no fatal errors)
-     * returns true, and if it fails it will display an error message and return
-     * false.
-     *
-     * @param shell the parent shell to show error messages in
-     * @param project the project to run lint on
-     * @return true if the lint run succeeded with no fatal errors
-     */
-    public static boolean runLintOnExport(Shell shell, IProject project) {
-        if (AdtPrefs.getPrefs().isLintOnExport()) {
-            boolean fatal = EclipseLintRunner.runLint(Collections.singletonList(project),
-                    null, null, true /*fatalOnly*/);
-            if (fatal) {
-                MessageDialog.openWarning(shell,
-                        "Export Aborted",
-                        "Export aborted because fatal lint errors were found. These " +
-                        "are listed in the Lint View. Either fix these before " +
-                        "running Export again, or turn off \"Run full error check " +
-                        "when exporting app\" in the Android > Lint Error Checking " +
-                        "preference page.");
-                return false;
-            }
-        }
-
-        return true;
-    }
-
-    /** Cancels the current lint jobs, if any, and optionally waits for them to finish */
-    static void cancelCurrentJobs(boolean wait) {
-        // Cancel any current running jobs first
-        Job[] currentJobs = LintJob.getCurrentJobs();
-        for (Job job : currentJobs) {
-            job.cancel();
-        }
-
-        if (wait) {
-            for (Job job : currentJobs) {
-                try {
-                    job.join();
-                } catch (InterruptedException e) {
-                    AdtPlugin.log(e, null);
-                }
-            }
-        }
-    }
-
-    /** If the resource list contains projects, add in any library projects as well */
-    private static List<? extends IResource> addLibraries(List<? extends IResource> resources) {
-        if (resources != null && !resources.isEmpty()) {
-            boolean haveProjects = false;
-            for (IResource resource : resources) {
-                if (resource instanceof IProject) {
-                    haveProjects = true;
-                    break;
-                }
-            }
-
-            if (haveProjects) {
-                List<IResource> result = new ArrayList<IResource>();
-                Map<IProject, IProject> allProjects = new IdentityHashMap<IProject, IProject>();
-                List<IProject> projects = new ArrayList<IProject>();
-                for (IResource resource : resources) {
-                    if (resource instanceof IProject) {
-                        IProject project = (IProject) resource;
-                        allProjects.put(project, project);
-                        projects.add(project);
-                    } else {
-                        result.add(resource);
-                    }
-                }
-                for (IProject project : projects) {
-                    ProjectState state = Sdk.getProjectState(project);
-                    if (state != null) {
-                        for (IProject library : state.getFullLibraryProjects()) {
-                            allProjects.put(library, library);
-                        }
-                    }
-                }
-                for (IProject project : allProjects.keySet()) {
-                    result.add(project);
-                }
-
-                return result;
-            }
-        }
-
-        return resources;
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/lint/ExtractStringFix.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/lint/ExtractStringFix.java
deleted file mode 100644
index 7eafd43..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/lint/ExtractStringFix.java
+++ /dev/null
@@ -1,90 +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.ide.eclipse.adt.internal.lint;
-
-import com.android.ide.eclipse.adt.AdtUtils;
-import com.android.ide.eclipse.adt.internal.editors.AndroidXmlEditor;
-import com.android.ide.eclipse.adt.internal.refactorings.extractstring.ExtractStringRefactoring;
-import com.android.ide.eclipse.adt.internal.refactorings.extractstring.ExtractStringWizard;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.jface.text.IDocument;
-import org.eclipse.jface.text.ITextSelection;
-import org.eclipse.jface.text.TextSelection;
-import org.eclipse.ltk.ui.refactoring.RefactoringWizard;
-import org.eclipse.ltk.ui.refactoring.RefactoringWizardOpenOperation;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.ISharedImages;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
-import org.w3c.dom.Node;
-
-/**
- * Fix for extracting strings.
- * <p>
- * TODO: Look for existing string values, and if it matches one of the
- * existing Strings offer to just replace it with the given string!
- */
-@SuppressWarnings("restriction") // DOM model
-final class ExtractStringFix extends DocumentFix {
-    private ExtractStringFix(String id, IMarker marker) {
-        super(id, marker);
-    }
-
-    @Override
-    public boolean needsFocus() {
-        return true;
-    }
-
-    @Override
-    public boolean isCancelable() {
-        return true;
-    }
-
-    @Override
-    protected void apply(IDocument document, IStructuredModel model, Node node, int start,
-            int end) {
-        IEditorPart editorPart = AdtUtils.getActiveEditor();
-        if (editorPart instanceof AndroidXmlEditor) {
-            IFile file = (IFile) mMarker.getResource();
-            ITextSelection selection = new TextSelection(start, end - start);
-
-            ExtractStringRefactoring refactoring =
-                new ExtractStringRefactoring(file, editorPart, selection);
-            RefactoringWizard wizard = new ExtractStringWizard(refactoring, file.getProject());
-            RefactoringWizardOpenOperation op = new RefactoringWizardOpenOperation(wizard);
-            try {
-                IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
-                op.run(window.getShell(), wizard.getDefaultPageTitle());
-            } catch (InterruptedException e) {
-            }
-        }
-    }
-
-    @Override
-    public String getDisplayString() {
-        return "Extract String";
-    }
-
-    @Override
-    public Image getImage() {
-        ISharedImages sharedImages = PlatformUI.getWorkbench().getSharedImages();
-        return sharedImages.getImage(ISharedImages.IMG_OBJ_ADD);
-    }
-}
\ No newline at end of file
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/lint/GlobalLintConfiguration.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/lint/GlobalLintConfiguration.java
deleted file mode 100644
index 2f0261e..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/lint/GlobalLintConfiguration.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.ide.eclipse.adt.internal.lint;
-
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.ide.eclipse.adt.internal.preferences.AdtPrefs;
-import com.android.tools.lint.client.api.Configuration;
-import com.android.tools.lint.client.api.IssueRegistry;
-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 org.eclipse.jface.preference.IPreferenceStore;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-/** Global (non-project-specific) configuration for Lint in Eclipse */
-class GlobalLintConfiguration extends Configuration {
-    private static final GlobalLintConfiguration sInstance = new GlobalLintConfiguration();
-
-    private Map<Issue, Severity> mSeverities;
-    private boolean mBulkEditing;
-
-    private GlobalLintConfiguration() {
-    }
-
-    /**
-     * Obtain a reference to the singleton
-     *
-     * @return the singleton configuration
-     */
-    @NonNull
-    public static GlobalLintConfiguration get() {
-        return sInstance;
-    }
-
-    @Override
-    public Severity getSeverity(@NonNull Issue issue) {
-        if (mSeverities == null) {
-            IssueRegistry registry = EclipseLintClient.getRegistry();
-            mSeverities = new HashMap<Issue, Severity>();
-            IPreferenceStore store = getStore();
-            String assignments = store.getString(AdtPrefs.PREFS_LINT_SEVERITIES);
-            if (assignments != null && assignments.length() > 0) {
-                for (String assignment : assignments.split(",")) { //$NON-NLS-1$
-                    String[] s = assignment.split("="); //$NON-NLS-1$
-                    if (s.length == 2) {
-                        Issue d = registry.getIssue(s[0]);
-                        if (d != null) {
-                            Severity severity = Severity.valueOf(s[1]);
-                            if (severity != null) {
-                                mSeverities.put(d, severity);
-                            }
-                        }
-                    }
-                }
-            }
-        }
-
-        Severity severity = mSeverities.get(issue);
-        if (severity != null) {
-            return severity;
-        }
-
-        if (!issue.isEnabledByDefault()) {
-            return Severity.IGNORE;
-        }
-
-        return issue.getDefaultSeverity();
-    }
-
-    private IPreferenceStore getStore() {
-        IPreferenceStore store = AdtPlugin.getDefault().getPreferenceStore();
-        return store;
-    }
-
-    @Override
-    public void ignore(@NonNull Context context, @NonNull Issue issue,
-            @Nullable Location location, @NonNull String message) {
-        throw new UnsupportedOperationException(
-                "Can't ignore() in global configurations"); //$NON-NLS-1$
-    }
-
-    @Override
-    public void setSeverity(@NonNull Issue issue, @Nullable Severity severity) {
-        if (mSeverities == null) {
-            // Force initialization
-            getSeverity(issue);
-        }
-
-        if (severity == null) {
-            mSeverities.remove(issue);
-        } else {
-            mSeverities.put(issue, severity);
-        }
-
-        if (!mBulkEditing) {
-            setSeverities(mSeverities);
-        }
-    }
-
-    /**
-     * Sets the custom severities for the given issues, in bulk.
-     *
-     * @param severities a map from detector to severity to use from now on
-     * @return true if something changed from the current settings
-     */
-    private boolean setSeverities(Map<Issue, Severity> severities) {
-        mSeverities = severities;
-
-        String value = "";
-        if (severities.size() > 0) {
-            List<Issue> sortedKeys = new ArrayList<Issue>(severities.keySet());
-            Collections.sort(sortedKeys);
-
-            StringBuilder sb = new StringBuilder(severities.size() * 20);
-            for (Issue issue : sortedKeys) {
-                Severity severity = severities.get(issue);
-                if (severity != issue.getDefaultSeverity()) {
-                    if (sb.length() > 0) {
-                        sb.append(',');
-                    }
-                    sb.append(issue.getId());
-                    sb.append('=');
-                    sb.append(severity.name());
-                }
-            }
-
-            value = sb.toString();
-        }
-
-        IPreferenceStore store = getStore();
-        String previous = store.getString(AdtPrefs.PREFS_LINT_SEVERITIES);
-        boolean changed = !value.equals(previous);
-        if (changed) {
-            if (value.length() == 0) {
-                store.setToDefault(AdtPrefs.PREFS_LINT_SEVERITIES);
-            } else {
-                store.setValue(AdtPrefs.PREFS_LINT_SEVERITIES, value);
-            }
-        }
-
-        return changed;
-    }
-
-    @Override
-    public void startBulkEditing() {
-        mBulkEditing = true;
-    }
-
-    @Override
-    public void finishBulkEditing() {
-        mBulkEditing = false;
-        setSeverities(mSeverities);
-    }
-}
\ No newline at end of file
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/lint/InputDensityDialog.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/lint/InputDensityDialog.java
deleted file mode 100644
index d102225..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/lint/InputDensityDialog.java
+++ /dev/null
@@ -1,118 +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.eclipse.adt.internal.lint;
-
-import com.android.resources.Density;
-
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Combo;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Shell;
-
-import java.util.ArrayList;
-import java.util.List;
-
-class InputDensityDialog extends Dialog {
-    private Combo mCombo;
-    /**
-     * Density value being chosen - static to keep most recently chosen value
-     * across repeated invocations
-     */
-    private static int sDpi = Density.DEFAULT_DENSITY;
-
-    InputDensityDialog(Shell parentShell) {
-        super(parentShell);
-    }
-
-    @Override
-    protected Control createDialogArea(Composite parent) {
-        Composite container = (Composite) super.createDialogArea(parent);
-        container.setLayout(new GridLayout(1, false));
-
-        Label lblWhatIsThe = new Label(container, SWT.WRAP);
-        lblWhatIsThe.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, true, false, 1, 1));
-        lblWhatIsThe.setText("What is the screen density the current px value works with?");
-
-        mCombo = new Combo(container, SWT.READ_ONLY);
-        GridData gdCombo = new GridData(SWT.LEFT, SWT.CENTER, true, false, 1, 1);
-        gdCombo.widthHint = 200;
-        mCombo.setLayoutData(gdCombo);
-        int initialIndex = 0;
-        List<String> s = new ArrayList<String>();
-        int index = 0;
-        for (Density density : Density.values()) {
-            if (density == Density.NODPI) {
-                continue;
-            }
-            if (density.getDpiValue() == sDpi) {
-                initialIndex = index;
-            }
-            s.add(getLabel(density));
-            index++;
-        }
-        String[] items = s.toArray(new String[s.size()]);
-        mCombo.setItems(items);
-        mCombo.select(initialIndex);
-
-        return container;
-    }
-
-    private static String getLabel(Density density) {
-        return String.format("%1$s (%2$d)", density.getShortDisplayValue(), density.getDpiValue());
-    }
-
-    @Override
-    protected void createButtonsForButtonBar(Composite parent) {
-        createButton(parent, IDialogConstants.OK_ID, IDialogConstants.OK_LABEL, true);
-        createButton(parent, IDialogConstants.CANCEL_ID, IDialogConstants.CANCEL_LABEL, false);
-    }
-
-    @Override
-    protected Point getInitialSize() {
-        return new Point(450, 150);
-    }
-
-    @Override
-    public boolean close() {
-        String description = mCombo.getItem(mCombo.getSelectionIndex());
-
-        for (Density density : Density.values()) {
-            if (description.equals(getLabel(density))) {
-                sDpi = density.getDpiValue();
-                break;
-            }
-        }
-
-        return super.close();
-    }
-
-    @Override
-    protected void configureShell(Shell shell) {
-        super.configureShell(shell);
-        shell.setText("Choose Density");
-    }
-
-    int getDensity() {
-        return sDpi;
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/lint/LinearLayoutWeightFix.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/lint/LinearLayoutWeightFix.java
deleted file mode 100644
index af3fc74..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/lint/LinearLayoutWeightFix.java
+++ /dev/null
@@ -1,78 +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.ide.eclipse.adt.internal.lint;
-
-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_ORIENTATION;
-import static com.android.SdkConstants.VALUE_VERTICAL;
-import static com.android.SdkConstants.VALUE_ZERO_DP;
-
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.jface.text.IDocument;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.ui.ISharedImages;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-
-@SuppressWarnings("restriction") // DOM model
-final class LinearLayoutWeightFix extends DocumentFix {
-    private LinearLayoutWeightFix(String id, IMarker marker) {
-        super(id, marker);
-    }
-
-    @Override
-    public boolean needsFocus() {
-        return false;
-    }
-
-    @Override
-    public boolean isCancelable() {
-        return false;
-    }
-
-    @Override
-    protected void apply(IDocument document, IStructuredModel model, Node node, int start,
-            int end) {
-        if (node instanceof Element && node.getParentNode() instanceof Element) {
-            Element element = (Element) node;
-            Element parent = (Element) node.getParentNode();
-            String dimension;
-            if (VALUE_VERTICAL.equals(parent.getAttributeNS(ANDROID_URI,
-                    ATTR_ORIENTATION))) {
-                dimension = ATTR_LAYOUT_HEIGHT;
-            } else {
-                dimension = ATTR_LAYOUT_WIDTH;
-            }
-            element.setAttributeNS(ANDROID_URI, dimension, VALUE_ZERO_DP);
-        }
-    }
-
-    @Override
-    public String getDisplayString() {
-        return "Replace size attribute with 0dp";
-    }
-
-    @Override
-    public Image getImage() {
-        ISharedImages sharedImages = PlatformUI.getWorkbench().getSharedImages();
-        // TODO: Need a better icon here
-        return sharedImages.getImage(ISharedImages.IMG_OBJ_ELEMENT);
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/lint/LintColumn.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/lint/LintColumn.java
deleted file mode 100644
index 297d94b..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/lint/LintColumn.java
+++ /dev/null
@@ -1,532 +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.eclipse.adt.internal.lint;
-
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-import com.android.ide.eclipse.adt.internal.editors.IconFactory;
-import com.android.ide.eclipse.adt.internal.editors.layout.gle2.SwtUtils;
-import com.android.tools.lint.detector.api.Issue;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IFolder;
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.jface.resource.JFaceResources;
-import org.eclipse.jface.viewers.StyledString;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.ui.ISharedImages;
-import org.eclipse.ui.PlatformUI;
-
-import java.io.File;
-import java.util.Comparator;
-
-/** A column shown in the {@link LintList} */
-abstract class LintColumn implements Comparator<IMarker> {
-    protected final LintList mList;
-
-    protected LintColumn(@NonNull LintList list) {
-        mList = list;
-    }
-
-    /** @return true if this column should be shown by default */
-    public boolean isVisibleByDefault() {
-        return true;
-    }
-
-    /** @return true if this column's text should be left aligned */
-    public boolean isLeftAligned() {
-        return true;
-    }
-
-    /**
-     * @return the number of pixels that this column should show by default
-     */
-    public int getPreferredWidth() {
-        return getPreferredCharWidth() * SwtUtils.getAverageCharWidth(mList.getDisplay(),
-                mList.getTree().getFont());
-    }
-
-    /**
-     * @return the number of characters that this column should show by default
-     */
-    public int getPreferredCharWidth() {
-        return 15;
-    }
-
-    /**
-     * @return the title of the column
-     */
-    @NonNull
-    public abstract String getColumnHeaderText();
-
-    /**
-     * @return the image of the column, or null
-     */
-    public Image getColumnHeaderImage() {
-        return null;
-    }
-
-    /**
-     * @param marker the {@link IMarker} to get the value for
-     * @return the value of this column for the given marker
-     */
-    public abstract String getValue(@NonNull IMarker marker);
-
-    /**
-     * @param marker the {@link IMarker} to get the value for
-     * @return the styled value of this column for the given marker
-     */
-    public StyledString getStyledValue(@NonNull IMarker marker) {
-        return null;
-    }
-
-    /**
-     * @param marker the {@link IMarker} to get the image for
-     * @return The image for this particular column, or null
-     */
-    @Nullable
-    public Image getImage(@NonNull IMarker marker) {
-        return null;
-    }
-
-    /**
-     * @param marker the {@link IMarker} to get the font for
-     * @return The font for this particular column, or null
-     */
-    @Nullable
-    public Font getFont(@NonNull IMarker marker) {
-        return null;
-    }
-
-    /**
-     * @return true if the sort should be in ascending order. If false, sort in descending order.
-     */
-    public boolean isAscending() {
-        return true;
-    }
-
-    /**
-     * @return true if this column should be visible by default
-     */
-    public boolean visibleByDefault() {
-        return true;
-    }
-
-    @Override
-    public int compare(IMarker o1, IMarker o2) {
-        return getValue(o1).compareTo(getValue(o2));
-    }
-
-    // Used for default LabelProvider
-    @Override
-    public String toString() {
-        return getColumnHeaderText();
-    }
-
-    static class MessageColumn extends LintColumn {
-
-        public MessageColumn(LintList list) {
-            super(list);
-        }
-
-        @Override
-        public @NonNull String getColumnHeaderText() {
-            return "Description";
-        }
-
-        @Override
-        public int getPreferredCharWidth() {
-            return 80;
-        }
-
-        @Override
-        public String getValue(@NonNull IMarker marker) {
-            return getStyledValue(marker).toString();
-        }
-
-        @Override
-        public StyledString getStyledValue(@NonNull IMarker marker) {
-            StyledString styledString = new StyledString();
-
-            String message = marker.getAttribute(IMarker.MESSAGE, "");
-            styledString.append(message);
-
-            int count = mList.getCount(marker);
-            if (count > 1) {
-                styledString.append(String.format(" (%2$d items)", message, count),
-                        StyledString.COUNTER_STYLER);
-            }
-
-            return styledString;
-        }
-
-        @Override
-        public Image getImage(@NonNull IMarker marker) {
-            int severity = marker.getAttribute(IMarker.SEVERITY, 0);
-            ISharedImages sharedImages = PlatformUI.getWorkbench().getSharedImages();
-            switch (severity) {
-                case IMarker.SEVERITY_ERROR:
-                    if (LintFix.hasFix(EclipseLintClient.getId(marker))) {
-                        return IconFactory.getInstance().getIcon("quickfix_error");   //$NON-NLS-1$
-                    }
-                    return sharedImages.getImage(ISharedImages.IMG_OBJS_ERROR_TSK);
-                case IMarker.SEVERITY_WARNING:
-                    if (LintFix.hasFix(EclipseLintClient.getId(marker))) {
-                        return IconFactory.getInstance().getIcon("quickfix_warning"); //$NON-NLS-1$
-                    }
-                    return sharedImages.getImage(ISharedImages.IMG_OBJS_WARN_TSK);
-                case IMarker.SEVERITY_INFO:
-                    return sharedImages.getImage(ISharedImages.IMG_OBJS_INFO_TSK);
-                default:
-                    return null;
-            }
-        }
-
-        @Override
-        public Font getFont(@NonNull IMarker marker) {
-            int severity = marker.getAttribute(IMarker.SEVERITY, 0);
-            if (severity == IMarker.SEVERITY_ERROR) {
-                return JFaceResources.getFontRegistry().getBold(
-                        JFaceResources.DEFAULT_FONT);
-            }
-
-            return null;
-        }
-
-        @Override
-        public boolean isAscending() {
-            return false;
-        }
-
-        @Override
-        public int compare(IMarker marker2, IMarker marker1) {
-            // Reversing order marker1/marker2 here since we want to use a "descending" column
-            // sorting marker to indicate priority. (Note that we return from isAscending too.)
-
-            String id1 = EclipseLintClient.getId(marker1);
-            String id2 = EclipseLintClient.getId(marker2);
-            if (id1 == null || id2 == null) {
-                return marker1.getResource().getName().compareTo(
-                        marker2.getResource().getName());
-            }
-            Issue issue1 = mList.getIssue(id1);
-            Issue issue2 = mList.getIssue(id2);
-            if (issue1 == null || issue2 == null) {
-                // Unknown issue? Can happen if you have used a third party detector
-                // which is no longer available but which left a persistent marker behind
-                return id1.compareTo(id2);
-            }
-            int delta = mList.getSeverity(issue1).ordinal() -
-                    mList.getSeverity(issue2).ordinal();
-            if (delta != 0) {
-                return delta;
-            }
-            delta = issue2.getPriority() - issue1.getPriority();
-            if (delta != 0) {
-                return delta;
-            }
-            delta = issue1.getCategory().compareTo(issue2.getCategory());
-            if (delta != 0) {
-                return delta;
-            }
-            delta = id1.compareTo(id2);
-            if (delta != 0) {
-                return delta;
-            }
-
-            IResource resource1 = marker1.getResource();
-            IResource resource2 = marker2.getResource();
-
-            IProject project1 = resource1.getProject();
-            IProject project2 = resource2.getProject();
-            delta = project1.getName().compareTo(project2.getName());
-            if (delta != 0) {
-                return delta;
-            }
-
-            delta = resource1.getName().compareTo(resource2.getName());
-            if (delta != 0) {
-                return delta;
-            }
-
-            return marker1.getAttribute(IMarker.LINE_NUMBER, 0)
-                    - marker2.getAttribute(IMarker.LINE_NUMBER, 0);
-        }
-    }
-
-    static class CategoryColumn extends LintColumn {
-
-        public CategoryColumn(LintList list) {
-            super(list);
-        }
-
-        @Override
-        public @NonNull String getColumnHeaderText() {
-            return "Category";
-        }
-
-        @Override
-        public int getPreferredCharWidth() {
-            return 20;
-        }
-
-        @Override
-        public String getValue(@NonNull IMarker marker) {
-            Issue issue = mList.getIssue(marker);
-            if (issue != null) {
-                return issue.getCategory().getFullName();
-            } else {
-                return "";
-            }
-        }
-    }
-
-    static class LocationColumn extends LintColumn {
-        public LocationColumn(LintList list) {
-            super(list);
-        }
-
-        @Override
-        public @NonNull String getColumnHeaderText() {
-            return "Location";
-        }
-
-        @Override
-        public int getPreferredCharWidth() {
-            return 35;
-        }
-
-        @Override
-        public String getValue(@NonNull IMarker marker) {
-            return getStyledValue(marker).toString();
-        }
-
-        @Override
-        public StyledString getStyledValue(@NonNull IMarker marker) {
-            StyledString styledString = new StyledString();
-
-            // Combined location
-            IResource resource = marker.getResource();
-            if (resource instanceof IProject) {
-                styledString.append(resource.getName());
-            } else {
-                // Show location as Parent/File:Line in Project
-                styledString.append(resource.getName());
-                if (resource instanceof IFile) {
-                    int line = marker.getAttribute(IMarker.LINE_NUMBER, -1);
-                    if (line > 1) {
-                        styledString.append(':').append(Integer.toString(line));
-                    }
-                } else if (resource instanceof IFolder) {
-                    styledString.append(File.separatorChar);
-                }
-
-                if (!(resource.getParent() instanceof IProject)) {
-                    styledString.append(" in ");
-                    styledString.append(resource.getParent().getName(),
-                            StyledString.DECORATIONS_STYLER);
-                }
-
-                styledString.append(String.format(" (%1$s)", resource.getProject().getName()),
-                        StyledString.QUALIFIER_STYLER);
-            }
-
-            return styledString;
-        }
-
-        @Override
-        public int compare(IMarker marker1, IMarker marker2) {
-            IResource resource1 = marker1.getResource();
-            IResource resource2 = marker2.getResource();
-
-            IProject project1 = resource1.getProject();
-            IProject project2 = resource2.getProject();
-            int delta = project1.getName().compareTo(project2.getName());
-            if (delta != 0) {
-                return delta;
-            }
-
-            delta = resource1.getName().compareTo(resource2.getName());
-            if (delta != 0) {
-                return delta;
-            }
-
-            return marker1.getAttribute(IMarker.LINE_NUMBER, 0)
-                    - marker2.getAttribute(IMarker.LINE_NUMBER, 0);
-        }
-    }
-
-    static class FileColumn extends LintColumn {
-        public FileColumn(LintList list) {
-            super(list);
-        }
-
-        @Override
-        public @NonNull String getColumnHeaderText() {
-            return "File";
-        }
-
-        @Override
-        public boolean visibleByDefault() {
-            return false;
-        }
-
-        @Override
-        public int getPreferredCharWidth() {
-            return 12;
-        }
-
-        @Override
-        public String getValue(@NonNull IMarker marker) {
-            if (marker.getResource() instanceof IFile) {
-                return marker.getResource().getName();
-            } else {
-                return "";
-            }
-        }
-    }
-
-    static class PathColumn extends LintColumn {
-        public PathColumn(LintList list) {
-            super(list);
-        }
-
-        @Override
-        public @NonNull String getColumnHeaderText() {
-            return "Path";
-        }
-
-        @Override
-        public boolean visibleByDefault() {
-            return false;
-        }
-
-        @Override
-        public int getPreferredCharWidth() {
-            return 25;
-        }
-
-        @Override
-        public String getValue(@NonNull IMarker marker) {
-            return marker.getResource().getFullPath().toOSString();
-        }
-    }
-
-    static class LineColumn extends LintColumn {
-        public LineColumn(LintList list) {
-            super(list);
-        }
-
-        @Override
-        public @NonNull String getColumnHeaderText() {
-            return "Line";
-        }
-
-        @Override
-        public boolean visibleByDefault() {
-            return false;
-        }
-
-        @Override
-        public boolean isLeftAligned() {
-            return false;
-        }
-
-        @Override
-        public int getPreferredCharWidth() {
-            return 4;
-        }
-
-        @Override
-        public String getValue(@NonNull IMarker marker) {
-            int line = getLine(marker);
-            if (line >= 1) {
-                return Integer.toString(line);
-            } else {
-                return "";
-            }
-        }
-
-        private int getLine(IMarker marker) {
-            if (marker.getResource() instanceof IFile) {
-                int line = marker.getAttribute(IMarker.LINE_NUMBER, -1);
-                return line;
-            }
-
-            return -1;
-        }
-        @Override
-        public int compare(IMarker marker1, IMarker marker2) {
-            return getLine(marker1) - getLine(marker2);
-        }
-    }
-
-    static class PriorityColumn extends LintColumn {
-        public PriorityColumn(LintList list) {
-            super(list);
-        }
-
-        @Override
-        public @NonNull String getColumnHeaderText() {
-            return "Priority";
-        }
-
-        @Override
-        public boolean visibleByDefault() {
-            return false;
-        }
-
-        @Override
-        public boolean isLeftAligned() {
-            return false;
-        }
-
-        @Override
-        public int getPreferredCharWidth() {
-            return 2;
-        }
-
-        @Override
-        public String getValue(@NonNull IMarker marker) {
-            int priority = getPriority(marker);
-            if (priority > 0) {
-                return Integer.toString(priority);
-            }
-            return "";
-        }
-
-        private int getPriority(IMarker marker) {
-            Issue issue = mList.getIssue(marker);
-            if (issue != null) {
-                return issue.getPriority();
-            }
-            return 0;
-        }
-
-        @Override
-        public int compare(IMarker marker1, IMarker marker2) {
-            return getPriority(marker1) - getPriority(marker2);
-        }
-
-        @Override
-        public boolean isAscending() {
-            return false;
-        }
-    }
-}
\ No newline at end of file
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/lint/LintDeltaProcessor.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/lint/LintDeltaProcessor.java
deleted file mode 100644
index ebb9a59..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/lint/LintDeltaProcessor.java
+++ /dev/null
@@ -1,201 +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.ide.eclipse.adt.internal.lint;
-
-import static com.android.SdkConstants.DOT_CLASS;
-import static com.android.SdkConstants.DOT_JAVA;
-import static com.android.SdkConstants.EXT_JAVA;
-
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.ide.eclipse.adt.AdtUtils;
-import com.android.ide.eclipse.adt.internal.preferences.AdtPrefs;
-import com.android.ide.eclipse.adt.internal.resources.manager.GlobalProjectMonitor;
-import com.android.ide.eclipse.adt.internal.resources.manager.GlobalProjectMonitor.IFileListener;
-import com.android.ide.eclipse.adt.internal.resources.manager.ResourceManager;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IMarkerDelta;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IResourceDelta;
-import org.eclipse.swt.widgets.Display;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
-/**
- * Delta processor for Java files, which runs single-file lints if it finds that
- * the currently active file has been updated.
- */
-public class LintDeltaProcessor implements Runnable {
-    private List<IResource> mFiles;
-    private IFile mActiveFile;
-
-    private LintDeltaProcessor() {
-        // Get the active editor file, if any
-        Display display = AdtPlugin.getDisplay();
-        if (display == null || display.isDisposed()) {
-            return;
-        }
-        if (display.getThread() != Thread.currentThread()) {
-            display.syncExec(this);
-        } else {
-            run();
-        }
-    }
-
-    /**
-     * Creates a new {@link LintDeltaProcessor}
-     *
-     * @return a visitor
-     */
-    @NonNull
-    public static LintDeltaProcessor create() {
-        return new LintDeltaProcessor();
-    }
-
-    /**
-     * Process the given delta: update lint on any Java source and class files found.
-     *
-     * @param delta the delta describing recently changed files
-     */
-    public void process(@NonNull IResourceDelta delta)  {
-        if (mActiveFile == null || !mActiveFile.getName().endsWith(DOT_JAVA)) {
-            return;
-        }
-
-        mFiles = new ArrayList<IResource>();
-        gatherFiles(delta);
-
-        if (!mFiles.isEmpty()) {
-            EclipseLintRunner.startLint(mFiles, mActiveFile, null,
-                    false /*fatalOnly*/, false /*show*/);
-        }
-    }
-
-    /**
-     * Process edits in the given file: update lint on the Java source provided
-     * it's the active file.
-     *
-     * @param file the file that was changed
-     */
-    public void process(@NonNull IFile file)  {
-        if (mActiveFile == null || !mActiveFile.getName().endsWith(DOT_JAVA)) {
-            return;
-        }
-
-        if (file.equals(mActiveFile)) {
-            mFiles = Collections.<IResource>singletonList(file);
-            EclipseLintRunner.startLint(mFiles, mActiveFile, null,
-                    false /*fatalOnly*/, false /*show*/);
-        }
-    }
-
-    /**
-     * Collect .java and .class files to be run in lint. Only collects files
-     * that match the active editor.
-     */
-    private void gatherFiles(@NonNull IResourceDelta delta) {
-        IResource resource = delta.getResource();
-        String name = resource.getName();
-        if (name.endsWith(DOT_JAVA)) {
-            if (resource.equals(mActiveFile)) {
-                mFiles.add(resource);
-            }
-        } else if (name.endsWith(DOT_CLASS)) {
-            // Make sure this class corresponds to the .java file, meaning it has
-            // the same basename, or that it is an inner class of a class that
-            // matches the same basename. (We could potentially make sure the package
-            // names match too, but it's unlikely that the class names match without a
-            // package match, and there's no harm in including some extra classes here,
-            // since lint will resolve full paths and the resource markers won't go
-            // to the wrong place, we simply end up analyzing some extra files.)
-            String className = mActiveFile.getName();
-            if (name.regionMatches(0, className, 0, className.length() - DOT_JAVA.length())) {
-                if (name.length() == className.length() - DOT_JAVA.length() + DOT_CLASS.length()
-                        || name.charAt(className.length() - DOT_JAVA.length()) == '$') {
-                    mFiles.add(resource);
-                }
-            }
-        } else {
-            IResourceDelta[] children = delta.getAffectedChildren();
-            if (children != null && children.length > 0) {
-                for (IResourceDelta d : children) {
-                    gatherFiles(d);
-                }
-            }
-        }
-    }
-
-    @Override
-    public void run() {
-        // Get the active file: this must be run on the GUI thread
-        mActiveFile = AdtUtils.getActiveFile();
-    }
-
-    /**
-     * Start listening to the resource monitor
-     *
-     * @param resourceMonitor the resource monitor
-     */
-    public static void startListening(@NonNull GlobalProjectMonitor resourceMonitor) {
-        // Add a file listener which finds out when files have changed. This is listening
-        // specifically for saves of Java files, in order to run incremental lint on them.
-        // Note that the {@link PostCompilerBuilder} already handles incremental lint files
-        // on Java files - and runs it for both the .java and .class files.
-        //
-        // However, if Project > Build Automatically is turned off, then the PostCompilerBuilder
-        // isn't run after a save. THAT's what the below is for: it will run and *only*
-        // run lint incrementally if build automatically is off.
-        assert sListener == null; // Should only be called once on plugin activation
-        sListener = new IFileListener() {
-            @Override
-            public void fileChanged(@NonNull IFile file,
-                    @NonNull IMarkerDelta[] markerDeltas,
-                    int kind, @Nullable String extension, int flags, boolean isAndroidProject) {
-                if (!isAndroidProject || flags == IResourceDelta.MARKERS) {
-                    // If not an Android project or ONLY the markers changed.
-                    // Ignore these since they happen
-                    // when we add markers for lint errors found in the current file,
-                    // which would cause us to repeatedly enter this method over and over
-                    // again.
-                    return;
-                }
-                if (EXT_JAVA.equals(extension)
-                        && !ResourceManager.isAutoBuilding()
-                        && AdtPrefs.getPrefs().isLintOnSave()) {
-                    LintDeltaProcessor.create().process(file);
-                }
-            }
-        };
-        resourceMonitor.addFileListener(sListener, IResourceDelta.ADDED | IResourceDelta.CHANGED);
-    }
-
-    /**
-     * Stop listening to the resource monitor
-     *
-     * @param resourceMonitor the resource monitor
-     */
-    public static void stopListening(@NonNull GlobalProjectMonitor resourceMonitor) {
-        assert sListener != null;
-        resourceMonitor.removeFileListener(sListener);
-        sListener = null;
-    }
-
-    private static IFileListener sListener;
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/lint/LintEditAction.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/lint/LintEditAction.java
deleted file mode 100644
index bf05ce0..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/lint/LintEditAction.java
+++ /dev/null
@@ -1,49 +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.ide.eclipse.adt.internal.lint;
-
-import com.android.annotations.NonNull;
-import com.android.ide.eclipse.adt.internal.editors.AndroidXmlEditor;
-import com.android.ide.eclipse.adt.internal.editors.layout.gle2.DelegatingAction;
-
-import org.eclipse.jface.action.IAction;
-import org.eclipse.swt.widgets.Event;
-
-/**
- * Action intended to wrap an existing XML editor action, and then runs lint after
- * the edit.
- */
-public class LintEditAction extends DelegatingAction {
-    private final AndroidXmlEditor mEditor;
-
-    /**
-     * Creates a new {@link LintEditAction} associated with the given editor to
-     * wrap the given action
-     *
-     * @param action the action to be wrapped
-     * @param editor the editor associated with the action
-     */
-    public LintEditAction(@NonNull IAction action, @NonNull AndroidXmlEditor editor) {
-        super(action);
-        mEditor = editor;
-    }
-
-    @Override
-    public void runWithEvent(Event event) {
-        super.runWithEvent(event);
-        mEditor.runEditHooks();
-    }
-}
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
deleted file mode 100644
index 366e949..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/lint/LintFix.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.ide.eclipse.adt.internal.lint;
-
-
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.tools.lint.checks.AccessibilityDetector;
-import com.android.tools.lint.checks.DetectMissingPrefix;
-import com.android.tools.lint.checks.DosLineEndingDetector;
-import com.android.tools.lint.checks.HardcodedValuesDetector;
-import com.android.tools.lint.checks.InefficientWeightDetector;
-import com.android.tools.lint.checks.ManifestDetector;
-import com.android.tools.lint.checks.MissingIdDetector;
-import com.android.tools.lint.checks.ObsoleteLayoutParamsDetector;
-import com.android.tools.lint.checks.PxUsageDetector;
-import com.android.tools.lint.checks.ScrollViewChildDetector;
-import com.android.tools.lint.checks.SecurityDetector;
-import com.android.tools.lint.checks.TextFieldDetector;
-import com.android.tools.lint.checks.TranslationDetector;
-import com.android.tools.lint.checks.TypoDetector;
-import com.android.tools.lint.checks.TypographyDetector;
-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.TextFormat;
-
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.jface.text.IDocument;
-import org.eclipse.jface.text.contentassist.ICompletionProposal;
-import org.eclipse.jface.text.contentassist.IContextInformation;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.ui.ISharedImages;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.PlatformUI;
-
-import java.lang.reflect.Constructor;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-abstract class LintFix implements ICompletionProposal {
-    protected final IMarker mMarker;
-    protected final String mId;
-
-    protected LintFix(String id, IMarker marker) {
-        mId = id;
-        mMarker = marker;
-    }
-
-    /**
-     * Returns true if this fix needs focus (which means that when the fix is
-     * performed from for example a {@link LintListDialog}'s Fix button) the
-     * editor needs to be given focus.
-     *
-     * @return true if this fix needs focus after being applied
-     */
-    public boolean needsFocus() {
-        return true;
-    }
-
-    /**
-     * Returns true if this fix can be performed along side other fixes
-     *
-     * @return true if this fix can be performed in a bulk operation with other
-     *         fixes
-     */
-    public boolean isBulkCapable() {
-        return false;
-    }
-
-    /**
-     * Returns true if this fix can be cancelled once it's invoked. This is the case
-     * for fixes which shows a confirmation dialog (such as the Extract String etc).
-     * This will be used to determine whether the marker can be deleted immediately
-     * (for non-cancelable fixes) or if it should be left alone and detected fix
-     * on the next save.
-     *
-     * @return true if the fix can be cancelled
-     */
-    public boolean isCancelable() {
-        return true;
-    }
-
-    // ---- Implements ICompletionProposal ----
-
-    @Override
-    public String getDisplayString() {
-        return null;
-    }
-
-    @Override
-    public String getAdditionalProposalInfo() {
-        Issue issue = EclipseLintClient.getRegistry().getIssue(mId);
-        if (issue != null) {
-            return issue.getExplanation(TextFormat.HTML);
-        }
-
-        return null;
-    }
-
-    public void deleteMarker() {
-        try {
-            mMarker.delete();
-        } catch (PartInitException e) {
-            AdtPlugin.log(e, null);
-        } catch (CoreException e) {
-            AdtPlugin.log(e, null);
-        }
-    }
-
-    @Override
-    public Point getSelection(IDocument document) {
-        return null;
-    }
-
-    @Override
-    public Image getImage() {
-        ISharedImages sharedImages = PlatformUI.getWorkbench().getSharedImages();
-        return sharedImages.getImage(ISharedImages.IMG_OBJS_WARN_TSK);
-    }
-
-    @Override
-    public IContextInformation getContextInformation() {
-        return null;
-    }
-
-    // --- Access to available fixes ---
-
-    private static final Map<String, Class<? extends LintFix>> sFixes =
-            new HashMap<String, Class<? extends LintFix>>();
-    // Keep this map in sync with BuiltinIssueRegistry's hasAutoFix() data
-    static {
-        sFixes.put(InefficientWeightDetector.INEFFICIENT_WEIGHT.getId(),
-                LinearLayoutWeightFix.class);
-        sFixes.put(AccessibilityDetector.ISSUE.getId(), SetAttributeFix.class);
-        sFixes.put(InefficientWeightDetector.BASELINE_WEIGHTS.getId(), SetAttributeFix.class);
-        sFixes.put(ManifestDetector.ALLOW_BACKUP.getId(), SetAttributeFix.class);
-        sFixes.put(MissingIdDetector.ISSUE.getId(), SetAttributeFix.class);
-        sFixes.put(HardcodedValuesDetector.ISSUE.getId(), ExtractStringFix.class);
-        sFixes.put(UselessViewDetector.USELESS_LEAF.getId(), RemoveUselessViewFix.class);
-        sFixes.put(UselessViewDetector.USELESS_PARENT.getId(), RemoveUselessViewFix.class);
-        sFixes.put(PxUsageDetector.PX_ISSUE.getId(), ConvertToDpFix.class);
-        sFixes.put(TextFieldDetector.ISSUE.getId(), SetAttributeFix.class);
-        sFixes.put(SecurityDetector.EXPORTED_SERVICE.getId(), SetAttributeFix.class);
-        sFixes.put(TranslationDetector.MISSING.getId(), SetAttributeFix.class);
-        sFixes.put(DetectMissingPrefix.MISSING_NAMESPACE.getId(), AddPrefixFix.class);
-        sFixes.put(ScrollViewChildDetector.ISSUE.getId(), SetScrollViewSizeFix.class);
-        sFixes.put(ObsoleteLayoutParamsDetector.ISSUE.getId(), ObsoleteLayoutParamsFix.class);
-        sFixes.put(TypographyDetector.DASHES.getId(), TypographyFix.class);
-        sFixes.put(TypographyDetector.ELLIPSIS.getId(), TypographyFix.class);
-        sFixes.put(TypographyDetector.FRACTIONS.getId(), TypographyFix.class);
-        sFixes.put(TypographyDetector.OTHER.getId(), TypographyFix.class);
-        sFixes.put(TypographyDetector.QUOTES.getId(), TypographyFix.class);
-        sFixes.put(UseCompoundDrawableDetector.ISSUE.getId(),
-                UseCompoundDrawableDetectorFix.class);
-        sFixes.put(TypoDetector.ISSUE.getId(), TypoFix.class);
-        sFixes.put(DosLineEndingDetector.ISSUE.getId(), DosLineEndingsFix.class);
-        // ApiDetector.UNSUPPORTED is provided as a marker resolution rather than
-        // a quick assistant (the marker resolution adds a suitable @TargetApi annotation)
-    }
-
-    public static boolean hasFix(String id) {
-        return sFixes.containsKey(id);
-    }
-
-    /**
-     * Returns one or more fixes for the given issue, or null if no fixes are available
-     *
-     * @param id the id o the issue to obtain a fix for (see {@link Issue#getId()})
-     * @param marker the marker corresponding to the error
-     * @return a nonempty list of fix, or null
-     */
-    @Nullable
-    public static List<LintFix> getFixes(@NonNull String id, @NonNull IMarker marker) {
-        Class<? extends LintFix> clazz = sFixes.get(id);
-        if (clazz != null) {
-            try {
-                Constructor<? extends LintFix> constructor = clazz.getDeclaredConstructor(
-                        String.class, IMarker.class);
-                constructor.setAccessible(true);
-                LintFix fix = constructor.newInstance(id, marker);
-                List<LintFix> alternatives = fix.getAllFixes();
-                if (alternatives != null) {
-                    return alternatives;
-                } else {
-                    return Collections.singletonList(fix);
-                }
-            } catch (Throwable t) {
-                AdtPlugin.log(t, null);
-            }
-        }
-
-        return null;
-    }
-
-    /**
-     * Returns a full list of fixes for this issue. This will produce a list of
-     * multiple fixes, in the desired order, which provide alternative ways of
-     * fixing the issue.
-     *
-     * @return a list of fixes to fix this issue, or null if there are no
-     *         variations
-     */
-    @Nullable
-    protected List<LintFix> getAllFixes() {
-        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
deleted file mode 100644
index da10085..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/lint/LintFixGenerator.java
+++ /dev/null
@@ -1,563 +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.eclipse.adt.internal.lint;
-
-import static com.android.SdkConstants.DOT_JAVA;
-import static com.android.SdkConstants.DOT_XML;
-
-import com.android.ide.eclipse.adt.AdtConstants;
-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.preferences.AdtPrefs;
-import com.android.tools.lint.client.api.Configuration;
-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.TextFormat;
-import com.android.tools.lint.detector.api.Project;
-import com.android.tools.lint.detector.api.Severity;
-import com.android.utils.SdkUtils;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.jface.text.IDocument;
-import org.eclipse.jface.text.IRegion;
-import org.eclipse.jface.text.Region;
-import org.eclipse.jface.text.contentassist.ICompletionProposal;
-import org.eclipse.jface.text.contentassist.IContextInformation;
-import org.eclipse.jface.text.quickassist.IQuickAssistInvocationContext;
-import org.eclipse.jface.text.quickassist.IQuickAssistProcessor;
-import org.eclipse.jface.text.source.Annotation;
-import org.eclipse.jface.text.source.ISourceViewer;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IMarkerResolution;
-import org.eclipse.ui.IMarkerResolution2;
-import org.eclipse.ui.IMarkerResolutionGenerator2;
-import org.eclipse.ui.ISharedImages;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.part.FileEditorInput;
-import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;
-
-import java.io.File;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
-/**
- * A quickfix and marker resolution for disabling lint checks, and any
- * IDE specific implementations for fixing the warnings.
- * <p>
- * I would really like for this quickfix to show up as a light bulb on top of the error
- * icon in the editor, and I've spent a whole day trying to make it work. I did not
- * succeed, but here are the steps I tried in case I want to pick up the work again
- * later:
- * <ul>
- * <li>
- *     The WST has some support for quick fixes, and I came across some forum posts
- *     referencing the ability to show light bulbs. However, it turns out that the
- *     quickfix support for annotations in WST is hardcoded to source validation
- *     errors *only*.
- * <li>
- *     I tried defining my own editor annotations, and customizing the icon directly
- *     by either setting an icon or using the image provider. This works fine
- *     if I make my marker be a new independent marker type. However, whenever I
- *     switch the marker type back to extend the "Problem" type, then the icon reverts
- *     back to the standard error icon and it ignores my custom settings.
- *     And if I switch away from the Problems marker type, then the errors no longer
- *     show up in the Problems view. (I also tried extending the JDT marker but that
- *     still didn't work.)
- * <li>
- *     It looks like only JDT handles quickfix icons. It has a bunch of custom code
- *     to handle this, along with its own Annotation subclass used by the editor.
- *     I tried duplicating some of this by subclassing StructuredTextEditor, but
- *     it was evident that I'd have to pull in a *huge* amount of duplicated code to
- *     make this work, which seems risky given that all this is internal code that
- *     can change from one Eclipse version to the next.
- * </ul>
- * It looks like our best bet would be to reconsider whether these should show up
- * in the Problems view; perhaps we should use a custom view for these. That would also
- * make marker management more obvious.
- */
-@SuppressWarnings("restriction") // DOM model
-public class LintFixGenerator implements IMarkerResolutionGenerator2, IQuickAssistProcessor {
-    /** Constructs a new {@link LintFixGenerator} */
-    public LintFixGenerator() {
-    }
-
-    // ---- Implements IMarkerResolutionGenerator2 ----
-
-    @Override
-    public boolean hasResolutions(IMarker marker) {
-        try {
-            assert marker.getType().equals(AdtConstants.MARKER_LINT);
-        } catch (CoreException e) {
-        }
-
-        return true;
-    }
-
-    @Override
-    public IMarkerResolution[] getResolutions(IMarker marker) {
-        String id = marker.getAttribute(EclipseLintRunner.MARKER_CHECKID_PROPERTY,
-                ""); //$NON-NLS-1$
-        IResource resource = marker.getResource();
-
-        List<IMarkerResolution> resolutions = new ArrayList<IMarkerResolution>();
-
-        if (resource.getName().endsWith(DOT_JAVA)) {
-            AddSuppressAnnotation.createFixes(marker, id, resolutions);
-        }
-
-        resolutions.add(new MoreInfoProposal(id, marker.getAttribute(IMarker.MESSAGE, null)));
-        resolutions.add(new SuppressProposal(resource, id, false));
-        resolutions.add(new SuppressProposal(resource.getProject(), id, true /* all */));
-        resolutions.add(new SuppressProposal(resource, id, true /* all */));
-        resolutions.add(new ClearMarkersProposal(resource, true /* all */));
-
-        if (resolutions.size() > 0) {
-            return resolutions.toArray(new IMarkerResolution[resolutions.size()]);
-        }
-
-        return null;
-    }
-
-    // ---- Implements IQuickAssistProcessor ----
-
-    @Override
-    public String getErrorMessage() {
-        return "Disable Lint Error";
-    }
-
-    @Override
-    public boolean canFix(Annotation annotation) {
-        return true;
-    }
-
-    @Override
-    public boolean canAssist(IQuickAssistInvocationContext invocationContext) {
-        return true;
-    }
-
-    @Override
-    public ICompletionProposal[] computeQuickAssistProposals(
-            IQuickAssistInvocationContext invocationContext) {
-        ISourceViewer sourceViewer = invocationContext.getSourceViewer();
-        AndroidXmlEditor editor = AndroidXmlEditor.fromTextViewer(sourceViewer);
-        if (editor != null) {
-            IFile file = editor.getInputFile();
-            if (file == null) {
-                return null;
-            }
-            IDocument document = sourceViewer.getDocument();
-            List<IMarker> markers = AdtUtils.findMarkersOnLine(AdtConstants.MARKER_LINT,
-                    file, document, invocationContext.getOffset());
-            List<ICompletionProposal> proposals = new ArrayList<ICompletionProposal>();
-            if (markers.size() > 0) {
-                for (IMarker marker : markers) {
-                    String id = marker.getAttribute(EclipseLintRunner.MARKER_CHECKID_PROPERTY,
-                            ""); //$NON-NLS-1$
-
-                    // TODO: Allow for more than one fix?
-                    List<LintFix> fixes = LintFix.getFixes(id, marker);
-                    if (fixes != null) {
-                        for (LintFix fix : fixes) {
-                            proposals.add(fix);
-                        }
-                    }
-
-                    String message = marker.getAttribute(IMarker.MESSAGE, null);
-                    proposals.add(new MoreInfoProposal(id, message));
-
-                    proposals.addAll(AddSuppressAttribute.createFixes(editor, marker, id));
-                    proposals.add(new SuppressProposal(file, id, false));
-                    proposals.add(new SuppressProposal(file.getProject(), id, true /* all */));
-                    proposals.add(new SuppressProposal(file, id, true /* all */));
-
-                    proposals.add(new ClearMarkersProposal(file, true /* all */));
-                }
-            }
-            if (proposals.size() > 0) {
-                return proposals.toArray(new ICompletionProposal[proposals.size()]);
-            }
-        }
-
-        return null;
-    }
-
-    /**
-     * Suppress the given detector, and rerun the checks on the file
-     *
-     * @param id the id of the detector to be suppressed, or null
-     * @param updateMarkers if true, update all markers
-     * @param resource the resource associated with the markers
-     * @param thisFileOnly if true, only suppress this issue in this file
-     */
-    public static void suppressDetector(String id, boolean updateMarkers, IResource resource,
-            boolean thisFileOnly) {
-        IssueRegistry registry = EclipseLintClient.getRegistry();
-        Issue issue = registry.getIssue(id);
-        if (issue != null) {
-            EclipseLintClient mClient = new EclipseLintClient(registry,
-                    Collections.singletonList(resource), null, false);
-            Project project = null;
-            IProject eclipseProject = resource.getProject();
-            if (eclipseProject != null) {
-                File dir = AdtUtils.getAbsolutePath(eclipseProject).toFile();
-                project = mClient.getProject(dir, dir);
-            }
-            Configuration configuration = mClient.getConfigurationFor(project);
-            if (thisFileOnly && configuration instanceof DefaultConfiguration) {
-                File file = AdtUtils.getAbsolutePath(resource).toFile();
-                ((DefaultConfiguration) configuration).ignore(issue, file);
-            } else {
-                configuration.setSeverity(issue, Severity.IGNORE);
-            }
-        }
-
-        if (updateMarkers) {
-            EclipseLintClient.removeMarkers(resource, id);
-        }
-    }
-
-    /**
-     * Adds a suppress lint annotation or attribute depending on whether the
-     * error is in a Java or XML file.
-     *
-     * @param marker the marker pointing to the error to be suppressed
-     */
-    public static void addSuppressAnnotation(IMarker marker) {
-        String id = EclipseLintClient.getId(marker);
-        if (id != null) {
-            IResource resource = marker.getResource();
-            if (!(resource instanceof IFile)) {
-                return;
-            }
-            IFile file = (IFile) resource;
-            boolean isJava = file.getName().endsWith(DOT_JAVA);
-            boolean isXml = SdkUtils.endsWith(file.getName(), DOT_XML);
-            if (!isJava && !isXml) {
-                return;
-            }
-
-            try {
-                // See if the current active file is the one containing this marker;
-                // if so we can take some shortcuts
-                IEditorPart activeEditor = AdtUtils.getActiveEditor();
-                IEditorPart part = null;
-                if (activeEditor != null) {
-                    IEditorInput input = activeEditor.getEditorInput();
-                    if (input instanceof FileEditorInput
-                            && ((FileEditorInput)input).getFile().equals(file)) {
-                        part = activeEditor;
-                    }
-                }
-                if (part == null) {
-                    IRegion region = null;
-                    int start = marker.getAttribute(IMarker.CHAR_START, -1);
-                    int end = marker.getAttribute(IMarker.CHAR_END, -1);
-                    if (start != -1 && end != -1) {
-                        region = new Region(start, end - start);
-                    }
-                    part = AdtPlugin.openFile(file, region, true /* showEditor */);
-                }
-
-                if (isJava) {
-                    List<IMarkerResolution> resolutions = new ArrayList<IMarkerResolution>();
-                    AddSuppressAnnotation.createFixes(marker, id, resolutions);
-                    if (resolutions.size() > 0) {
-                        resolutions.get(0).run(marker);
-                    }
-                } else {
-                    assert isXml;
-                    if (part instanceof AndroidXmlEditor) {
-                        AndroidXmlEditor editor = (AndroidXmlEditor) part;
-                        List<AddSuppressAttribute> fixes = AddSuppressAttribute.createFixes(editor,
-                                marker, id);
-                        if (fixes.size() > 0) {
-                            IStructuredDocument document = editor.getStructuredDocument();
-                            fixes.get(0).apply(document);
-                        }
-                    }
-                }
-            } catch (PartInitException pie) {
-                AdtPlugin.log(pie, null);
-            }
-        }
-    }
-
-    private static class SuppressProposal implements ICompletionProposal, IMarkerResolution2 {
-        private final String mId;
-        private final boolean mGlobal;
-        private final IResource mResource;
-
-        private SuppressProposal(IResource resource, String check, boolean global) {
-            mResource = resource;
-            mId = check;
-            mGlobal = global;
-        }
-
-        private void perform() {
-            suppressDetector(mId, true, mResource, !mGlobal);
-        }
-
-        @Override
-        public String getDisplayString() {
-            if (mResource instanceof IProject) {
-                return "Disable Check in This Project";
-            } else if (mGlobal) {
-                return "Disable Check";
-            } else {
-                return "Disable Check in This File Only";
-            }
-        }
-
-        // ---- Implements MarkerResolution2 ----
-
-        @Override
-        public String getLabel() {
-            return getDisplayString();
-        }
-
-        @Override
-        public void run(IMarker marker) {
-            perform();
-        }
-
-        @Override
-        public String getDescription() {
-            return getAdditionalProposalInfo();
-        }
-
-        // ---- Implements ICompletionProposal ----
-
-        @Override
-        public void apply(IDocument document) {
-            perform();
-        }
-
-        @Override
-        public Point getSelection(IDocument document) {
-            return null;
-        }
-
-        @Override
-        public String getAdditionalProposalInfo() {
-            StringBuilder sb = new StringBuilder(200);
-            if (mResource instanceof IProject) {
-                sb.append("Suppresses this type of lint warning in the current project only.");
-            } else if (mGlobal) {
-                sb.append("Suppresses this type of lint warning in all files.");
-            } else {
-                sb.append("Suppresses this type of lint warning in the current file only.");
-            }
-            sb.append("<br><br>"); //$NON-NLS-1$
-            sb.append("You can re-enable checks from the \"Android > Lint Error Checking\" preference page.");
-
-            return sb.toString();
-        }
-
-        @Override
-        public Image getImage() {
-            ISharedImages sharedImages = PlatformUI.getWorkbench().getSharedImages();
-            return sharedImages.getImage(ISharedImages.IMG_OBJS_WARN_TSK);
-        }
-
-        @Override
-        public IContextInformation getContextInformation() {
-            return null;
-        }
-    }
-
-    private static class ClearMarkersProposal implements ICompletionProposal, IMarkerResolution2 {
-        private final boolean mGlobal;
-        private final IResource mResource;
-
-        public ClearMarkersProposal(IResource resource, boolean global) {
-            mResource = resource;
-            mGlobal = global;
-        }
-
-        private void perform() {
-            IResource resource = mGlobal ? mResource.getProject() : mResource;
-            EclipseLintClient.clearMarkers(resource);
-        }
-
-        @Override
-        public String getDisplayString() {
-            return mGlobal ? "Clear All Lint Markers" : "Clear Markers in This File Only";
-        }
-
-        // ---- Implements MarkerResolution2 ----
-
-        @Override
-        public String getLabel() {
-            return getDisplayString();
-        }
-
-        @Override
-        public void run(IMarker marker) {
-            perform();
-        }
-
-        @Override
-        public String getDescription() {
-            return getAdditionalProposalInfo();
-        }
-
-        // ---- Implements ICompletionProposal ----
-
-        @Override
-        public void apply(IDocument document) {
-            perform();
-        }
-
-        @Override
-        public Point getSelection(IDocument document) {
-            return null;
-        }
-
-        @Override
-        public String getAdditionalProposalInfo() {
-            StringBuilder sb = new StringBuilder(200);
-            if (mGlobal) {
-                sb.append("Clears all lint warning markers from the project.");
-            } else {
-                sb.append("Clears all lint warnings from this file.");
-            }
-            sb.append("<br><br>"); //$NON-NLS-1$
-            sb.append("This temporarily hides the problem, but does not suppress it. " +
-                    "Running Lint again can bring the error back.");
-            if (AdtPrefs.getPrefs().isLintOnSave()) {
-                sb.append(' ');
-                sb.append("This will happen the next time the file is saved since lint-on-save " +
-                        "is enabled. You can turn this off in the \"Lint Error Checking\" " +
-                        "preference page.");
-            }
-
-            return sb.toString();
-        }
-
-        @Override
-        public Image getImage() {
-            ISharedImages sharedImages = PlatformUI.getWorkbench().getSharedImages();
-            return sharedImages.getImage(ISharedImages.IMG_ELCL_REMOVE);
-        }
-
-        @Override
-        public IContextInformation getContextInformation() {
-            return null;
-        }
-    }
-
-    private static class MoreInfoProposal implements ICompletionProposal, IMarkerResolution2 {
-        private final String mId;
-        private final String mMessage;
-
-        public MoreInfoProposal(String id, String message) {
-            mId = id;
-            mMessage = message;
-        }
-
-        private void perform() {
-            Issue issue = EclipseLintClient.getRegistry().getIssue(mId);
-            assert issue != null : mId;
-
-            StringBuilder sb = new StringBuilder(300);
-            sb.append(mMessage);
-            sb.append('\n').append('\n');
-            sb.append("Issue Explanation:");
-            sb.append('\n');
-            String explanation = issue.getExplanation(TextFormat.TEXT);
-            if (explanation != null && !explanation.isEmpty()) {
-                sb.append('\n');
-                sb.append(explanation);
-            } else {
-                sb.append(issue.getBriefDescription(TextFormat.TEXT));
-            }
-
-            if (issue.getMoreInfo() != null) {
-                sb.append('\n').append('\n');
-                sb.append("More Information: ");
-                sb.append(issue.getMoreInfo());
-            }
-
-            MessageDialog.openInformation(AdtPlugin.getShell(), "More Info",
-                    sb.toString());
-        }
-
-        @Override
-        public String getDisplayString() {
-            return String.format("Explain Issue (%1$s)", mId);
-        }
-
-        // ---- Implements MarkerResolution2 ----
-
-        @Override
-        public String getLabel() {
-            return getDisplayString();
-        }
-
-        @Override
-        public void run(IMarker marker) {
-            perform();
-        }
-
-        @Override
-        public String getDescription() {
-            return getAdditionalProposalInfo();
-        }
-
-        // ---- Implements ICompletionProposal ----
-
-        @Override
-        public void apply(IDocument document) {
-            perform();
-        }
-
-        @Override
-        public Point getSelection(IDocument document) {
-            return null;
-        }
-
-        @Override
-        public String getAdditionalProposalInfo() {
-            return "Provides more information about this issue."
-                    + "<br><br>" //$NON-NLS-1$
-                    + EclipseLintClient.getRegistry().getIssue(mId).getExplanation(
-                            TextFormat.HTML);
-        }
-
-        @Override
-        public Image getImage() {
-            ISharedImages sharedImages = PlatformUI.getWorkbench().getSharedImages();
-            return sharedImages.getImage(ISharedImages.IMG_OBJS_INFO_TSK);
-        }
-
-        @Override
-        public IContextInformation getContextInformation() {
-            return null;
-        }
-    }
-}
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
deleted file mode 100644
index 51fa2d1..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/lint/LintJob.java
+++ /dev/null
@@ -1,201 +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.ide.eclipse.adt.internal.lint;
-
-import static com.android.SdkConstants.DOT_CLASS;
-import static com.android.SdkConstants.DOT_JAVA;
-import static com.android.SdkConstants.DOT_XML;
-
-import com.android.SdkConstants;
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.ide.eclipse.adt.AdtUtils;
-import com.android.tools.lint.client.api.IssueRegistry;
-import com.android.tools.lint.client.api.LintDriver;
-import com.android.tools.lint.client.api.LintRequest;
-import com.android.tools.lint.detector.api.Issue;
-import com.android.tools.lint.detector.api.Scope;
-import com.android.utils.SdkUtils;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.core.runtime.jobs.IJobManager;
-import org.eclipse.core.runtime.jobs.Job;
-
-import java.io.File;
-import java.util.ArrayList;
-import java.util.EnumSet;
-import java.util.List;
-
-/** Job to check lint on a set of resources */
-public final class LintJob extends Job {
-    /** Job family */
-    private static final Object FAMILY_RUN_LINT = new Object();
-    private final EclipseLintClient mClient;
-    private final List<? extends IResource> mResources;
-    private final IResource mSource;
-    private final IssueRegistry mRegistry;
-    private LintDriver mLint;
-    private boolean mFatal;
-
-    public LintJob(
-            @NonNull EclipseLintClient client,
-            @NonNull List<? extends IResource> resources,
-            @Nullable IResource source,
-            @NonNull IssueRegistry registry) {
-        super("Running Android Lint");
-        mClient = client;
-        mResources = resources;
-        mSource = source;
-        mRegistry = registry;
-    }
-
-    public LintJob(
-            @NonNull EclipseLintClient client,
-            @NonNull List<? extends IResource> resources,
-            @Nullable IResource source) {
-        this(client, resources, source, EclipseLintClient.getRegistry());
-    }
-
-    @Override
-    public boolean belongsTo(Object family) {
-        return family == FAMILY_RUN_LINT;
-    }
-
-    @Override
-    protected void canceling() {
-        super.canceling();
-        if (mLint != null) {
-            mLint.cancel();
-        }
-    }
-
-    @Override
-    @NonNull
-    protected IStatus run(IProgressMonitor monitor) {
-        try {
-            monitor.beginTask("Looking for errors", IProgressMonitor.UNKNOWN);
-            EnumSet<Scope> scope = null;
-            List<File> files = new ArrayList<File>(mResources.size());
-            for (IResource resource : mResources) {
-                File file = AdtUtils.getAbsolutePath(resource).toFile();
-                files.add(file);
-
-                if (resource instanceof IProject && mSource == null) {
-                    scope = Scope.ALL;
-                } else {
-                    String name = resource.getName();
-                    if (SdkUtils.endsWithIgnoreCase(name, DOT_XML)) {
-                        if (name.equals(SdkConstants.FN_ANDROID_MANIFEST_XML)) {
-                            scope = EnumSet.of(Scope.MANIFEST);
-                        } else {
-                            scope = Scope.RESOURCE_FILE_SCOPE;
-                        }
-                    } else if (name.endsWith(DOT_JAVA) && resource instanceof IFile) {
-                        if (scope != null) {
-                            if (!scope.contains(Scope.JAVA_FILE)) {
-                                scope = EnumSet.copyOf(scope);
-                                scope.add(Scope.JAVA_FILE);
-                            }
-                        } else {
-                            scope = Scope.JAVA_FILE_SCOPE;
-                        }
-                    } else if (name.endsWith(DOT_CLASS) && resource instanceof IFile) {
-                        if (scope != null) {
-                            if (!scope.contains(Scope.CLASS_FILE)) {
-                                scope = EnumSet.copyOf(scope);
-                                scope.add(Scope.CLASS_FILE);
-                            }
-                        } else {
-                            scope = Scope.CLASS_FILE_SCOPE;
-                        }
-                    } else {
-                        return new Status(Status.ERROR, AdtPlugin.PLUGIN_ID, Status.ERROR,
-                            "Only XML & Java files are supported for single file lint", null); //$NON-NLS-1$
-                    }
-                }
-            }
-            if (scope == null) {
-                scope = Scope.ALL;
-            }
-            if (mSource == null) {
-                assert !Scope.checkSingleFile(scope) : scope + " with " + mResources;
-            }
-            // Check single file?
-            if (mSource != null) {
-                // Delete specific markers
-                IMarker[] markers = EclipseLintClient.getMarkers(mSource);
-                for (IMarker marker : markers) {
-                    String id = marker.getAttribute(EclipseLintRunner.MARKER_CHECKID_PROPERTY, "");
-                    Issue issue = mRegistry.getIssue(id);
-                    if (issue == null) {
-                        continue;
-                    }
-                    if (issue.getImplementation().isAdequate(scope)) {
-                        marker.delete();
-                    }
-                }
-                mClient.setSearchForSuperClasses(true);
-            } else {
-                EclipseLintClient.clearMarkers(mResources);
-            }
-
-            mLint = new LintDriver(mRegistry, mClient);
-            mLint.analyze(new LintRequest(mClient, files).setScope(scope));
-            mFatal = mClient.hasFatalErrors();
-            return Status.OK_STATUS;
-        } catch (Exception e) {
-            return new Status(Status.ERROR, AdtPlugin.PLUGIN_ID, Status.ERROR,
-                              "Failed", e); //$NON-NLS-1$
-        } finally {
-            if (monitor != null) {
-                monitor.done();
-            }
-        }
-    }
-
-    /**
-     * Returns true if a fatal error was encountered
-     *
-     * @return true if a fatal error was encountered
-     */
-    public boolean isFatal() {
-        return mFatal;
-    }
-
-    /**
-     * Returns the associated lint client
-     *
-     * @return the associated lint client
-     */
-    @NonNull
-    public EclipseLintClient getLintClient() {
-        return mClient;
-    }
-
-    /** Returns the current lint jobs, if any (never returns null but array may be empty) */
-    @NonNull
-    static Job[] getCurrentJobs() {
-        IJobManager jobManager = Job.getJobManager();
-        return jobManager.find(LintJob.FAMILY_RUN_LINT);
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/lint/LintList.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/lint/LintList.java
deleted file mode 100644
index ccb04bb..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/lint/LintList.java
+++ /dev/null
@@ -1,979 +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.eclipse.adt.internal.lint;
-
-import com.android.ide.eclipse.adt.AdtConstants;
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.ide.eclipse.adt.AdtUtils;
-import com.android.ide.eclipse.adt.internal.editors.layout.LayoutEditorDelegate;
-import com.android.ide.eclipse.adt.internal.editors.layout.gle2.GraphicalEditorPart;
-import com.android.ide.eclipse.adt.internal.editors.layout.gle2.LayoutActionBar;
-import com.android.tools.lint.client.api.Configuration;
-import com.android.tools.lint.client.api.IssueRegistry;
-import com.android.tools.lint.client.api.LintClient;
-import com.android.tools.lint.detector.api.Issue;
-import com.android.tools.lint.detector.api.Severity;
-import com.google.common.collect.ArrayListMultimap;
-import com.google.common.collect.Multimap;
-
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.resources.IMarkerDelta;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IResourceChangeEvent;
-import org.eclipse.core.resources.IResourceChangeListener;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.jface.operation.IRunnableWithProgress;
-import org.eclipse.jface.viewers.ColumnPixelData;
-import org.eclipse.jface.viewers.ColumnWeightData;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.viewers.StyledCellLabelProvider;
-import org.eclipse.jface.viewers.StyledString;
-import org.eclipse.jface.viewers.TableLayout;
-import org.eclipse.jface.viewers.TreeNodeContentProvider;
-import org.eclipse.jface.viewers.TreeViewer;
-import org.eclipse.jface.viewers.TreeViewerColumn;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerCell;
-import org.eclipse.jface.viewers.ViewerComparator;
-import org.eclipse.jface.window.Window;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.BusyIndicator;
-import org.eclipse.swt.events.ControlEvent;
-import org.eclipse.swt.events.ControlListener;
-import org.eclipse.swt.events.PaintEvent;
-import org.eclipse.swt.events.PaintListener;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
-import org.eclipse.swt.events.TreeEvent;
-import org.eclipse.swt.events.TreeListener;
-import org.eclipse.swt.graphics.Rectangle;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.Tree;
-import org.eclipse.swt.widgets.TreeColumn;
-import org.eclipse.swt.widgets.TreeItem;
-import org.eclipse.ui.IMemento;
-import org.eclipse.ui.IWorkbenchPartSite;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.progress.IWorkbenchSiteProgressService;
-import org.eclipse.ui.progress.WorkbenchJob;
-
-import java.lang.reflect.InvocationTargetException;
-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;
-
-/**
- * A tree-table widget which shows a list of lint warnings for an underlying
- * {@link IResource} such as a file, a project, or a list of projects.
- */
-class LintList extends Composite implements IResourceChangeListener, ControlListener {
-    private static final Object UPDATE_MARKERS_FAMILY = new Object();
-
-    // For persistence:
-    private static final String KEY_WIDTHS = "lintColWidth"; //$NON-NLS-1$
-    private static final String KEY_VISIBLE = "lintColVisible"; //$NON-NLS-1$
-    // Mapping SWT TreeColumns to LintColumns
-    private static final String KEY_COLUMN = "lintColumn"; //$NON-NLS-1$
-
-    private final IWorkbenchPartSite mSite;
-    private final TreeViewer mTreeViewer;
-    private final Tree mTree;
-    private Set<String> mExpandedIds;
-    private ContentProvider mContentProvider;
-    private String mSelectedId;
-    private List<? extends IResource> mResources;
-    private Configuration mConfiguration;
-    private final boolean mSingleFile;
-    private int mErrorCount;
-    private int mWarningCount;
-    private final UpdateMarkersJob mUpdateMarkersJob = new UpdateMarkersJob();
-    private final IssueRegistry mRegistry;
-    private final IMemento mMemento;
-    private final LintColumn mMessageColumn = new LintColumn.MessageColumn(this);
-    private final LintColumn mLineColumn = new LintColumn.LineColumn(this);
-    private final LintColumn[] mColumns = new LintColumn[] {
-            mMessageColumn,
-            new LintColumn.PriorityColumn(this),
-            new LintColumn.CategoryColumn(this),
-            new LintColumn.LocationColumn(this),
-            new LintColumn.FileColumn(this),
-            new LintColumn.PathColumn(this),
-            mLineColumn
-    };
-    private LintColumn[] mVisibleColumns;
-
-    LintList(IWorkbenchPartSite site, Composite parent, IMemento memento, boolean singleFile) {
-        super(parent, SWT.NONE);
-        mSingleFile = singleFile;
-        mMemento = memento;
-        mSite = site;
-        mRegistry = EclipseLintClient.getRegistry();
-
-        GridLayout gridLayout = new GridLayout(1, false);
-        gridLayout.marginWidth = 0;
-        gridLayout.marginHeight = 0;
-        setLayout(gridLayout);
-
-        mTreeViewer = new TreeViewer(this, SWT.BORDER | SWT.FULL_SELECTION | SWT.MULTI);
-        mTree = mTreeViewer.getTree();
-        mTree.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));
-
-        createColumns();
-        mTreeViewer.setComparator(new TableComparator());
-        setSortIndicators();
-
-        mContentProvider = new ContentProvider();
-        mTreeViewer.setContentProvider(mContentProvider);
-
-        mTree.setLinesVisible(true);
-        mTree.setHeaderVisible(true);
-        mTree.addControlListener(this);
-
-        ResourcesPlugin.getWorkspace().addResourceChangeListener(
-                this,
-                IResourceChangeEvent.POST_CHANGE
-                        | IResourceChangeEvent.PRE_BUILD
-                        | IResourceChangeEvent.POST_BUILD);
-
-        // Workaround for https://bugs.eclipse.org/341865
-        mTree.addPaintListener(new PaintListener() {
-            @Override
-            public void paintControl(PaintEvent e) {
-                mTreePainted = true;
-                mTreeViewer.getTree().removePaintListener(this);
-            }
-        });
-
-        // Remember the most recently selected id category such that we can
-        // attempt to reselect it after a refresh
-        mTree.addSelectionListener(new SelectionAdapter() {
-            @Override
-            public void widgetSelected(SelectionEvent e) {
-                List<IMarker> markers = getSelectedMarkers();
-                if (markers.size() > 0) {
-                    mSelectedId = EclipseLintClient.getId(markers.get(0));
-                }
-            }
-        });
-        mTree.addTreeListener(new TreeListener() {
-            @Override
-            public void treeExpanded(TreeEvent e) {
-                Object data = e.item.getData();
-                if (data instanceof IMarker) {
-                    String id = EclipseLintClient.getId((IMarker) data);
-                    if (id != null) {
-                        if (mExpandedIds == null) {
-                            mExpandedIds = new HashSet<String>();
-                        }
-                        mExpandedIds.add(id);
-                    }
-                }
-            }
-
-            @Override
-            public void treeCollapsed(TreeEvent e) {
-                if (mExpandedIds != null) {
-                    Object data = e.item.getData();
-                    if (data instanceof IMarker) {
-                        String id = EclipseLintClient.getId((IMarker) data);
-                        if (id != null) {
-                            mExpandedIds.remove(id);
-                        }
-                    }
-                }
-            }
-        });
-    }
-
-    private boolean mTreePainted;
-
-    private void updateColumnWidths() {
-        Rectangle r = mTree.getClientArea();
-        int availableWidth = r.width;
-        // Add all available size to the first column
-        for (int i = 1; i < mTree.getColumnCount(); i++) {
-            TreeColumn column = mTree.getColumn(i);
-            availableWidth -= column.getWidth();
-        }
-        if (availableWidth > 100) {
-            mTree.getColumn(0).setWidth(availableWidth);
-        }
-    }
-
-    public void setResources(List<? extends IResource> resources) {
-        mResources = resources;
-
-        mConfiguration = null;
-        for (IResource resource : mResources) {
-            IProject project = resource.getProject();
-            if (project != null) {
-                // For logging only
-                LintClient client = new EclipseLintClient(null, null, null, false);
-                mConfiguration = ProjectLintConfiguration.get(client, project, false);
-                break;
-            }
-        }
-        if (mConfiguration == null) {
-            mConfiguration = GlobalLintConfiguration.get();
-        }
-
-        List<IMarker> markerList = getMarkers();
-        mTreeViewer.setInput(markerList);
-        if (mSingleFile) {
-            expandAll();
-        }
-
-        // Selecting the first item isn't a good idea since it may not be the first
-        // item shown in the table (since it does its own sorting), and furthermore we
-        // may not have all the data yet; this is called when scanning begins, not when
-        // it's done:
-        //if (mTree.getItemCount() > 0) {
-        //    mTree.select(mTree.getItem(0));
-        //}
-
-        updateColumnWidths(); // in case mSingleFile changed
-    }
-
-    /** Select the first item */
-    public void selectFirst() {
-        if (mTree.getItemCount() > 0) {
-            mTree.select(mTree.getItem(0));
-        }
-    }
-
-    private List<IMarker> getMarkers() {
-        mErrorCount = mWarningCount = 0;
-        List<IMarker> markerList = new ArrayList<IMarker>();
-        if (mResources != null) {
-            for (IResource resource : mResources) {
-                IMarker[] markers = EclipseLintClient.getMarkers(resource);
-                for (IMarker marker : markers) {
-                    markerList.add(marker);
-                    int severity = marker.getAttribute(IMarker.SEVERITY, 0);
-                    if (severity == IMarker.SEVERITY_ERROR) {
-                        mErrorCount++;
-                    } else if (severity == IMarker.SEVERITY_WARNING) {
-                        mWarningCount++;
-                    }
-                }
-            }
-
-            // No need to sort the marker list here; it will be sorted by the tree table model
-        }
-        return markerList;
-    }
-
-    public int getErrorCount() {
-        return mErrorCount;
-    }
-
-    public int getWarningCount() {
-        return mWarningCount;
-    }
-
-    @Override
-    protected void checkSubclass() {
-        // Disable the check that prevents subclassing of SWT components
-    }
-
-    public void addSelectionListener(SelectionListener listener) {
-        mTree.addSelectionListener(listener);
-    }
-
-    public void refresh() {
-        mTreeViewer.refresh();
-    }
-
-    public List<IMarker> getSelectedMarkers() {
-        TreeItem[] selection = mTree.getSelection();
-        List<IMarker> markers = new ArrayList<IMarker>(selection.length);
-        for (TreeItem item : selection) {
-            Object data = item.getData();
-            if (data instanceof IMarker) {
-                markers.add((IMarker) data);
-            }
-        }
-
-        return markers;
-    }
-
-    @Override
-    public void dispose() {
-        cancelJobs();
-        ResourcesPlugin.getWorkspace().removeResourceChangeListener(this);
-        super.dispose();
-    }
-
-    private class ContentProvider extends TreeNodeContentProvider {
-        private Map<Object, Object[]> mChildren;
-        private Map<IMarker, Integer> mTypeCount;
-        private IMarker[] mTopLevels;
-
-        @Override
-        public Object[] getElements(Object inputElement) {
-            if (inputElement == null) {
-                mTypeCount = null;
-                return new IMarker[0];
-            }
-
-            @SuppressWarnings("unchecked")
-            List<IMarker> list = (List<IMarker>) inputElement;
-
-            // Partition the children such that at the top level we have one
-            // marker of each type, and below we have all the duplicates of
-            // each one of those errors. And for errors with multiple locations,
-            // there is a third level.
-            Multimap<String, IMarker> types = ArrayListMultimap.<String, IMarker>create(100, 20);
-            for (IMarker marker : list) {
-                String id = EclipseLintClient.getId(marker);
-                types.put(id, marker);
-            }
-
-            Set<String> ids = types.keySet();
-
-            mChildren = new HashMap<Object, Object[]>(ids.size());
-            mTypeCount = new HashMap<IMarker, Integer>(ids.size());
-
-            List<IMarker> topLevel = new ArrayList<IMarker>(ids.size());
-            for (String id : ids) {
-                Collection<IMarker> markers = types.get(id);
-                int childCount = markers.size();
-
-                // Must sort the list items in order to have a stable first item
-                // (otherwise preserving expanded paths etc won't work)
-                TableComparator sorter = getTableSorter();
-                IMarker[] array = markers.toArray(new IMarker[markers.size()]);
-                sorter.sort(mTreeViewer, array);
-
-                IMarker topMarker = array[0];
-                mTypeCount.put(topMarker, childCount);
-                topLevel.add(topMarker);
-
-                IMarker[] children = Arrays.copyOfRange(array, 1, array.length);
-                mChildren.put(topMarker, children);
-            }
-
-            mTopLevels = topLevel.toArray(new IMarker[topLevel.size()]);
-            return mTopLevels;
-        }
-
-        @Override
-        public boolean hasChildren(Object element) {
-            Object[] children = mChildren != null ? mChildren.get(element) : null;
-            return children != null && children.length > 0;
-        }
-
-        @Override
-        public Object[] getChildren(Object parentElement) {
-            Object[] children = mChildren.get(parentElement);
-            if (children != null) {
-                return children;
-            }
-
-            return new Object[0];
-        }
-
-        @Override
-        public Object getParent(Object element) {
-            return null;
-        }
-
-        public int getCount(IMarker marker) {
-            if (mTypeCount != null) {
-                Integer count = mTypeCount.get(marker);
-                if (count != null) {
-                    return count.intValue();
-                }
-            }
-
-            return -1;
-        }
-
-        IMarker[] getTopMarkers() {
-            return mTopLevels;
-        }
-    }
-
-    private class LintColumnLabelProvider extends StyledCellLabelProvider {
-        private LintColumn mColumn;
-
-        LintColumnLabelProvider(LintColumn column) {
-            mColumn = column;
-        }
-
-        @Override
-        public void update(ViewerCell cell) {
-            Object element = cell.getElement();
-            cell.setImage(mColumn.getImage((IMarker) element));
-            StyledString styledString = mColumn.getStyledValue((IMarker) element);
-            if (styledString == null) {
-                cell.setText(mColumn.getValue((IMarker) element));
-                cell.setStyleRanges(null);
-            } else {
-                cell.setText(styledString.toString());
-                cell.setStyleRanges(styledString.getStyleRanges());
-            }
-            super.update(cell);
-        }
-    }
-
-    TreeViewer getTreeViewer() {
-        return mTreeViewer;
-    }
-
-    Tree getTree() {
-        return mTree;
-    }
-
-    // ---- Implements IResourceChangeListener ----
-
-    @Override
-    public void resourceChanged(IResourceChangeEvent event) {
-        if (mResources == null) {
-            return;
-        }
-        IMarkerDelta[] deltas = event.findMarkerDeltas(AdtConstants.MARKER_LINT, true);
-        if (deltas.length > 0) {
-            // Update immediately for POST_BUILD events, otherwise do an unconditional
-            // update after 30 seconds. This matches the logic in Eclipse's ProblemView
-            // (see the MarkerView class).
-            if (event.getType() == IResourceChangeEvent.POST_BUILD) {
-                cancelJobs();
-                getProgressService().schedule(mUpdateMarkersJob, 100);
-            } else {
-                IWorkbenchSiteProgressService progressService = getProgressService();
-                if (progressService == null) {
-                    mUpdateMarkersJob.schedule(30000);
-                } else {
-                    getProgressService().schedule(mUpdateMarkersJob, 30000);
-                }
-            }
-        }
-    }
-
-    // ---- Implements ControlListener ----
-
-    @Override
-    public void controlMoved(ControlEvent e) {
-    }
-
-    @Override
-    public void controlResized(ControlEvent e) {
-        updateColumnWidths();
-    }
-
-    // ---- Updating Markers ----
-
-    private void cancelJobs() {
-        mUpdateMarkersJob.cancel();
-    }
-
-    protected IWorkbenchSiteProgressService getProgressService() {
-        if (mSite != null) {
-            Object siteService = mSite.getAdapter(IWorkbenchSiteProgressService.class);
-            if (siteService != null) {
-                return (IWorkbenchSiteProgressService) siteService;
-            }
-        }
-        return null;
-    }
-
-    private class UpdateMarkersJob extends WorkbenchJob {
-        UpdateMarkersJob() {
-            super("Updating Lint Markers");
-            setSystem(true);
-        }
-
-        @Override
-        public IStatus runInUIThread(IProgressMonitor monitor) {
-            if (mTree.isDisposed()) {
-                return Status.CANCEL_STATUS;
-            }
-
-            mTreeViewer.setInput(null);
-            List<IMarker> markerList = getMarkers();
-            if (markerList.size() == 0) {
-                LayoutEditorDelegate delegate =
-                    LayoutEditorDelegate.fromEditor(AdtUtils.getActiveEditor());
-                if (delegate != null) {
-                    GraphicalEditorPart g = delegate.getGraphicalEditor();
-                    assert g != null;
-                    LayoutActionBar bar = g == null ? null : g.getLayoutActionBar();
-                    assert bar != null;
-                    if (bar != null) {
-                        bar.updateErrorIndicator();
-                    }
-                }
-            }
-            // Trigger selection update
-            Event updateEvent = new Event();
-            updateEvent.widget = mTree;
-            mTree.notifyListeners(SWT.Selection, updateEvent);
-            mTreeViewer.setInput(markerList);
-            mTreeViewer.refresh();
-
-            if (mExpandedIds != null) {
-                List<IMarker> expanded = new ArrayList<IMarker>(mExpandedIds.size());
-                IMarker[] topMarkers = mContentProvider.getTopMarkers();
-                if (topMarkers != null) {
-                    for (IMarker marker : topMarkers) {
-                        String id = EclipseLintClient.getId(marker);
-                        if (id != null && mExpandedIds.contains(id)) {
-                            expanded.add(marker);
-                        }
-                    }
-                }
-                if (!expanded.isEmpty()) {
-                    mTreeViewer.setExpandedElements(expanded.toArray());
-                }
-            }
-
-            if (mSelectedId != null) {
-                IMarker[] topMarkers = mContentProvider.getTopMarkers();
-                for (IMarker marker : topMarkers) {
-                    if (mSelectedId.equals(EclipseLintClient.getId(marker))) {
-                        mTreeViewer.setSelection(new StructuredSelection(marker), true /*reveal*/);
-                        break;
-                    }
-                }
-            }
-
-            return Status.OK_STATUS;
-        }
-
-        @Override
-        public boolean shouldRun() {
-            // Do not run if the change came in before there is a viewer
-            return PlatformUI.isWorkbenchRunning();
-        }
-
-        @Override
-        public boolean belongsTo(Object family) {
-            return UPDATE_MARKERS_FAMILY == family;
-        }
-    }
-
-    /**
-     * Returns the list of resources being shown in the list
-     *
-     * @return the list of resources being shown in this composite
-     */
-    public List<? extends IResource> getResources() {
-        return mResources;
-    }
-
-    /** Expands all nodes */
-    public void expandAll() {
-        mTreeViewer.expandAll();
-
-        if (mExpandedIds == null) {
-            mExpandedIds = new HashSet<String>();
-        }
-        IMarker[] topMarkers = mContentProvider.getTopMarkers();
-        if (topMarkers != null) {
-            for (IMarker marker : topMarkers) {
-                String id = EclipseLintClient.getId(marker);
-                if (id != null) {
-                    mExpandedIds.add(id);
-                }
-            }
-        }
-    }
-
-    /** Collapses all nodes */
-    public void collapseAll() {
-        mTreeViewer.collapseAll();
-        mExpandedIds = null;
-    }
-
-    // ---- Column Persistence ----
-
-    public void saveState(IMemento memento) {
-        if (mSingleFile) {
-            // Don't use persistence for single-file lists: this is a special mode of the
-            // window where we show a hardcoded set of columns for a single file, deliberately
-            // omitting the location column etc
-            return;
-        }
-
-        IMemento columnEntry = memento.createChild(KEY_WIDTHS);
-        LintColumn[] columns = new LintColumn[mTree.getColumnCount()];
-        int[] positions = mTree.getColumnOrder();
-        for (int i = 0; i < columns.length; i++) {
-            TreeColumn treeColumn = mTree.getColumn(i);
-            LintColumn column = (LintColumn) treeColumn.getData(KEY_COLUMN);
-            // Workaround for TeeColumn.getWidth() returning 0 in some cases,
-            // see https://bugs.eclipse.org/341865 for details.
-            int width = getColumnWidth(column, mTreePainted);
-            columnEntry.putInteger(getKey(treeColumn), width);
-            columns[positions[i]] = column;
-        }
-
-        if (getVisibleColumns() != null) {
-            IMemento visibleEntry = memento.createChild(KEY_VISIBLE);
-            for (LintColumn column : getVisibleColumns()) {
-                visibleEntry.putBoolean(getKey(column), true);
-            }
-        }
-    }
-
-    private void createColumns() {
-        LintColumn[] columns = getVisibleColumns();
-        TableLayout layout = new TableLayout();
-
-        for (int i = 0; i < columns.length; i++) {
-            LintColumn column = columns[i];
-            TreeViewerColumn viewerColumn = null;
-            TreeColumn treeColumn;
-            viewerColumn = new TreeViewerColumn(mTreeViewer, SWT.NONE);
-            treeColumn = viewerColumn.getColumn();
-            treeColumn.setData(KEY_COLUMN, column);
-            treeColumn.setResizable(true);
-            treeColumn.addSelectionListener(getHeaderListener());
-            if (!column.isLeftAligned()) {
-                treeColumn.setAlignment(SWT.RIGHT);
-            }
-            viewerColumn.setLabelProvider(new LintColumnLabelProvider(column));
-            treeColumn.setText(column.getColumnHeaderText());
-            treeColumn.setImage(column.getColumnHeaderImage());
-            IMemento columnWidths = null;
-            if (mMemento != null && !mSingleFile) {
-                columnWidths = mMemento.getChild(KEY_WIDTHS);
-            }
-            int columnWidth = getColumnWidth(column, false);
-            if (columnWidths != null) {
-                columnWidths.putInteger(getKey(column), columnWidth);
-            }
-            if (i == 0) {
-                // The first column should use layout -weights- to get all the
-                // remaining room
-                layout.addColumnData(new ColumnWeightData(1, true));
-            } else if (columnWidth < 0) {
-                int defaultColumnWidth = column.getPreferredWidth();
-                layout.addColumnData(new ColumnPixelData(defaultColumnWidth, true, true));
-            } else {
-                layout.addColumnData(new ColumnPixelData(columnWidth, true));
-            }
-        }
-        mTreeViewer.getTree().setLayout(layout);
-        mTree.layout(true);
-    }
-
-    private int getColumnWidth(LintColumn column, boolean getFromUi) {
-        Tree tree = mTreeViewer.getTree();
-        if (getFromUi) {
-            TreeColumn[] columns = tree.getColumns();
-            for (int i = 0; i < columns.length; i++) {
-                if (column.equals(columns[i].getData(KEY_COLUMN))) {
-                    return columns[i].getWidth();
-                }
-            }
-        }
-        int preferredWidth = -1;
-        if (mMemento != null && !mSingleFile) {
-            IMemento columnWidths = mMemento.getChild(KEY_WIDTHS);
-            if (columnWidths != null) {
-                Integer value = columnWidths.getInteger(getKey(column));
-                // Make sure we get a useful value
-                if (value != null && value.intValue() >= 0)
-                    preferredWidth = value.intValue();
-            }
-        }
-        if (preferredWidth <= 0) {
-            preferredWidth = Math.max(column.getPreferredWidth(), 30);
-        }
-        return preferredWidth;
-    }
-
-    private static String getKey(TreeColumn treeColumn) {
-        return getKey((LintColumn) treeColumn.getData(KEY_COLUMN));
-    }
-
-    private static String getKey(LintColumn column) {
-        return column.getClass().getSimpleName();
-    }
-
-    private LintColumn[] getVisibleColumns() {
-        if (mVisibleColumns == null) {
-            if (mSingleFile) {
-                // Special mode where we show just lint warnings for a single file:
-                // use a hardcoded list of columns, not including path/location etc but
-                // including line numbers (which are normally not shown by default).
-                mVisibleColumns = new LintColumn[] {
-                        mMessageColumn, mLineColumn
-                };
-            } else {
-                // Generate visible columns based on (a) previously saved window state,
-                // and (b) default window visible states provided by the columns themselves
-                List<LintColumn> list = new ArrayList<LintColumn>();
-                IMemento visibleColumns = null;
-                if (mMemento != null) {
-                    visibleColumns = mMemento.getChild(KEY_VISIBLE);
-                }
-                for (LintColumn column : mColumns) {
-                    if (visibleColumns != null) {
-                        Boolean b = visibleColumns.getBoolean(getKey(column));
-                        if (b != null && b.booleanValue()) {
-                            list.add(column);
-                        }
-                    } else if (column.visibleByDefault()) {
-                        list.add(column);
-                    }
-                }
-                if (!list.contains(mMessageColumn)) {
-                    list.add(0, mMessageColumn);
-                }
-                mVisibleColumns = list.toArray(new LintColumn[list.size()]);
-            }
-        }
-
-        return mVisibleColumns;
-    }
-
-    int getCount(IMarker marker) {
-        return mContentProvider.getCount(marker);
-    }
-
-    Issue getIssue(String id) {
-        return mRegistry.getIssue(id);
-    }
-
-    Issue getIssue(IMarker marker) {
-        String id = EclipseLintClient.getId(marker);
-        return mRegistry.getIssue(id);
-    }
-
-    Severity getSeverity(Issue issue) {
-        return mConfiguration.getSeverity(issue);
-    }
-
-    // ---- Choosing visible columns ----
-
-    public void configureColumns() {
-        ColumnDialog dialog = new ColumnDialog(getShell(), mColumns, getVisibleColumns());
-        if (dialog.open() == Window.OK) {
-            mVisibleColumns = dialog.getSelectedColumns();
-            // Clear out columns: Must recreate to set the right label provider etc
-            for (TreeColumn column : mTree.getColumns()) {
-                column.dispose();
-            }
-            createColumns();
-            mTreeViewer.setComparator(new TableComparator());
-            setSortIndicators();
-            mTreeViewer.refresh();
-        }
-    }
-
-    // ---- Table Sorting ----
-
-    private SelectionListener getHeaderListener() {
-        return new SelectionAdapter() {
-            @Override
-            public void widgetSelected(SelectionEvent e) {
-                final TreeColumn treeColumn = (TreeColumn) e.widget;
-                final LintColumn column = (LintColumn) treeColumn.getData(KEY_COLUMN);
-
-                try {
-                    IWorkbenchSiteProgressService progressService = getProgressService();
-                    if (progressService == null) {
-                        BusyIndicator.showWhile(getShell().getDisplay(), new Runnable() {
-                            @Override
-                            public void run() {
-                                resortTable(treeColumn, column,
-                                        new NullProgressMonitor());
-                            }
-                        });
-                    } else {
-                        getProgressService().busyCursorWhile(new IRunnableWithProgress() {
-                            @Override
-                            public void run(IProgressMonitor monitor) {
-                                resortTable(treeColumn, column, monitor);
-                            }
-                        });
-                    }
-                } catch (InvocationTargetException e1) {
-                    AdtPlugin.log(e1, null);
-                } catch (InterruptedException e1) {
-                    return;
-                }
-            }
-
-            private void resortTable(final TreeColumn treeColumn, LintColumn column,
-                    IProgressMonitor monitor) {
-                TableComparator sorter = getTableSorter();
-                monitor.beginTask("Sorting", 100);
-                monitor.worked(10);
-                if (column.equals(sorter.getTopColumn())) {
-                    sorter.reverseTopPriority();
-                } else {
-                    sorter.setTopPriority(column);
-                }
-                monitor.worked(15);
-                PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
-                    @Override
-                    public void run() {
-                        mTreeViewer.refresh();
-                        updateDirectionIndicator(treeColumn);
-                    }
-                });
-                monitor.done();
-            }
-        };
-    }
-
-    private void setSortIndicators() {
-        LintColumn top = getTableSorter().getTopColumn();
-        TreeColumn[] columns = mTreeViewer.getTree().getColumns();
-        for (int i = 0; i < columns.length; i++) {
-            TreeColumn column = columns[i];
-            if (column.getData(KEY_COLUMN).equals(top)) {
-                updateDirectionIndicator(column);
-                return;
-            }
-        }
-    }
-
-    private void updateDirectionIndicator(TreeColumn column) {
-        Tree tree = mTreeViewer.getTree();
-        tree.setSortColumn(column);
-        if (getTableSorter().isAscending()) {
-            tree.setSortDirection(SWT.UP);
-        } else {
-            tree.setSortDirection(SWT.DOWN);
-        }
-    }
-
-    private TableComparator getTableSorter() {
-        return (TableComparator) mTreeViewer.getComparator();
-    }
-
-    /** Comparator used to sort the {@link LintList} tree.
-     * <p>
-     * This code is simplified from similar code in
-     *    org.eclipse.ui.views.markers.internal.TableComparator
-     */
-    private class TableComparator extends ViewerComparator {
-        private int[] mPriorities;
-        private boolean[] mDirections;
-        private int[] mDefaultPriorities;
-        private boolean[] mDefaultDirections;
-
-        private TableComparator() {
-            int[] defaultPriorities = new int[mColumns.length];
-            for (int i = 0; i < defaultPriorities.length; i++) {
-                defaultPriorities[i] = i;
-            }
-            mPriorities = defaultPriorities;
-
-            boolean[] directions = new boolean[mColumns.length];
-            for (int i = 0; i < directions.length; i++) {
-                directions[i] = mColumns[i].isAscending();
-            }
-            mDirections = directions;
-
-            mDefaultPriorities = new int[defaultPriorities.length];
-            System.arraycopy(defaultPriorities, 0, this.mDefaultPriorities, 0,
-                    defaultPriorities.length);
-            mDefaultDirections = new boolean[directions.length];
-            System.arraycopy(directions, 0, this.mDefaultDirections, 0, directions.length);
-        }
-
-        private void resetState() {
-            System.arraycopy(mDefaultPriorities, 0, mPriorities, 0, mPriorities.length);
-            System.arraycopy(mDefaultDirections, 0, mDirections, 0, mDirections.length);
-        }
-
-        private void reverseTopPriority() {
-            mDirections[mPriorities[0]] = !mDirections[mPriorities[0]];
-        }
-
-        private void setTopPriority(LintColumn property) {
-            for (int i = 0; i < mColumns.length; i++) {
-                if (mColumns[i].equals(property)) {
-                    setTopPriority(i);
-                    return;
-                }
-            }
-        }
-
-        private void setTopPriority(int priority) {
-            if (priority < 0 || priority >= mPriorities.length) {
-                return;
-            }
-            int index = -1;
-            for (int i = 0; i < mPriorities.length; i++) {
-                if (mPriorities[i] == priority) {
-                    index = i;
-                }
-            }
-            if (index == -1) {
-                resetState();
-                return;
-            }
-            // shift the array
-            for (int i = index; i > 0; i--) {
-                mPriorities[i] = mPriorities[i - 1];
-            }
-            mPriorities[0] = priority;
-            mDirections[priority] = mDefaultDirections[priority];
-        }
-
-        private boolean isAscending() {
-            return mDirections[mPriorities[0]];
-        }
-
-        private int getTopPriority() {
-            return mPriorities[0];
-        }
-
-        private LintColumn getTopColumn() {
-            return mColumns[getTopPriority()];
-        }
-
-        @Override
-        public int compare(Viewer viewer, Object e1, Object e2) {
-            return compare((IMarker) e1, (IMarker) e2, 0, true);
-        }
-
-        private int compare(IMarker marker1, IMarker marker2, int depth,
-                boolean continueSearching) {
-            if (depth >= mPriorities.length) {
-                return 0;
-            }
-            int column = mPriorities[depth];
-            LintColumn property = mColumns[column];
-            int result = property.compare(marker1, marker2);
-            if (result == 0 && continueSearching) {
-                return compare(marker1, marker2, depth + 1, continueSearching);
-            }
-            return result * (mDirections[column] ? 1 : -1);
-        }
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/lint/LintListDialog.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/lint/LintListDialog.java
deleted file mode 100644
index f88c377..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/lint/LintListDialog.java
+++ /dev/null
@@ -1,303 +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.eclipse.adt.internal.lint;
-
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-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 org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.jface.dialogs.TitleAreaDialog;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchPartSite;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;
-
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-@SuppressWarnings("restriction") // WST DOM access
-class LintListDialog extends TitleAreaDialog implements SelectionListener {
-    private static final String PROJECT_LOGO_LARGE = "android-64"; //$NON-NLS-1$
-    private final IFile mFile;
-    private final IEditorPart mEditor;
-    private Button mFixButton;
-    private Button mIgnoreButton;
-    private Button mIgnoreAllButton;
-    private Button mShowButton;
-    private Text mDetailsText;
-    private Button mIgnoreTypeButton;
-    private LintList mList;
-
-    LintListDialog(
-            @NonNull Shell parentShell,
-            @NonNull IFile file,
-            @Nullable IEditorPart editor) {
-        super(parentShell);
-        mFile = file;
-        mEditor = editor;
-        setHelpAvailable(false);
-    }
-
-    @Override
-    protected void setShellStyle(int newShellStyle) {
-        // Allow resize
-        super.setShellStyle(newShellStyle | SWT.TITLE | SWT.MODELESS | SWT.RESIZE);
-    }
-
-    @Override
-    public boolean close() {
-        mList.dispose();
-        return super.close();
-    }
-
-    @Override
-    protected Control createContents(Composite parent) {
-      Control contents = super.createContents(parent);
-      setTitle("Lint Warnings in Layout");
-      setMessage("Lint Errors found for the current layout:");
-      setTitleImage(IconFactory.getInstance().getIcon(PROJECT_LOGO_LARGE));
-
-      return contents;
-    }
-
-    @SuppressWarnings("unused") // SWT constructors have side effects, they are not unused
-    @Override
-    protected Control createDialogArea(Composite parent) {
-        Composite area = (Composite) super.createDialogArea(parent);
-        Composite container = new Composite(area, SWT.NONE);
-        container.setLayoutData(new GridData(GridData.FILL_BOTH));
-
-        container.setLayout(new GridLayout(2, false));
-        IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
-        IWorkbenchPartSite site = null;
-        if (page.getActivePart() != null) {
-            site = page.getActivePart().getSite();
-        }
-
-        mList = new LintList(site, container, null /*memento*/, true /*singleFile*/);
-        mList.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 6));
-
-        mShowButton = new Button(container, SWT.NONE);
-        mShowButton.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1));
-        mShowButton.setText("Show");
-        mShowButton.setToolTipText("Opens the editor to reveal the XML with the issue");
-        mShowButton.addSelectionListener(this);
-
-        mFixButton = new Button(container, SWT.NONE);
-        mFixButton.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1));
-        mFixButton.setText("Fix");
-        mFixButton.setToolTipText("Automatically corrects the problem, if possible");
-        mFixButton.setEnabled(false);
-        mFixButton.addSelectionListener(this);
-
-        mIgnoreButton = new Button(container, SWT.NONE);
-        mIgnoreButton.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1));
-        mIgnoreButton.setText("Suppress Issue");
-        mIgnoreButton.setToolTipText("Adds a special attribute in the layout to suppress this specific warning");
-        mIgnoreButton.addSelectionListener(this);
-
-        mIgnoreAllButton = new Button(container, SWT.NONE);
-        mIgnoreAllButton.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1));
-        mIgnoreAllButton.setText("Suppress in Layout");
-        mIgnoreAllButton.setEnabled(mEditor instanceof AndroidXmlEditor);
-        mIgnoreAllButton.setToolTipText("Adds an attribute on the root element to suppress all issues of this type in this layout");
-        mIgnoreAllButton.addSelectionListener(this);
-
-        mIgnoreTypeButton = new Button(container, SWT.NONE);
-        mIgnoreTypeButton.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1));
-        mIgnoreTypeButton.setText("Disable Issue Type");
-        mIgnoreTypeButton.setToolTipText("Turns off checking for this type of error everywhere");
-        mIgnoreTypeButton.addSelectionListener(this);
-
-        new Label(container, SWT.NONE);
-
-        mDetailsText = new Text(container, SWT.BORDER | SWT.READ_ONLY | SWT.WRAP
-                | SWT.V_SCROLL | SWT.MULTI);
-        Display display = parent.getDisplay();
-        mDetailsText.setBackground(display.getSystemColor(SWT.COLOR_INFO_BACKGROUND));
-        mDetailsText.setForeground(display.getSystemColor(SWT.COLOR_INFO_FOREGROUND));
-        GridData gdText = new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1);
-        gdText.heightHint = 80;
-        mDetailsText.setLayoutData(gdText);
-
-        new Label(container, SWT.NONE);
-
-        mList.addSelectionListener(this);
-
-        mList.setResources(Collections.<IResource>singletonList(mFile));
-        mList.selectFirst();
-        if (mList.getSelectedMarkers().size() > 0) {
-            updateSelectionState();
-        }
-
-        return area;
-    }
-
-    /**
-     * Create contents of the button bar.
-     */
-    @Override
-    protected void createButtonsForButtonBar(Composite parent) {
-        createButton(parent, IDialogConstants.OK_ID, IDialogConstants.OK_LABEL, true);
-    }
-
-    /**
-     * Return the initial size of the dialog.
-     */
-    @Override
-    protected Point getInitialSize() {
-        return new Point(600, 400);
-    }
-
-    private void selectMarker(IMarker marker) {
-        if (marker == null) {
-            mDetailsText.setText(""); //$NON-NLS-1$
-            return;
-        }
-
-        mDetailsText.setText(EclipseLintClient.describe(marker));
-    }
-
-    // ---- Implements SelectionListener ----
-
-    @Override
-    public void widgetSelected(SelectionEvent e) {
-        Object source = e.getSource();
-        if (source == mList.getTreeViewer().getControl()) {
-            // Enable/disable buttons
-            updateSelectionState();
-        } else if (source == mShowButton) {
-            List<IMarker> selection = mList.getSelectedMarkers();
-            if (selection.size() > 0) {
-                EclipseLintClient.showMarker(selection.get(0));
-            }
-        } else if (source == mFixButton) {
-            List<IMarker> selection = mList.getSelectedMarkers();
-            for (IMarker marker : selection) {
-                List<LintFix> fixes = LintFix.getFixes(EclipseLintClient.getId(marker), marker);
-                if (fixes == null) {
-                    continue;
-                }
-                LintFix fix = fixes.get(0);
-                IEditorPart editor = AdtUtils.getActiveEditor();
-                if (editor instanceof AndroidXmlEditor) {
-                    IStructuredDocument doc = ((AndroidXmlEditor) editor).getStructuredDocument();
-                    fix.apply(doc);
-                    if (fix.needsFocus()) {
-                        close();
-                    }
-                } else {
-                    AdtPlugin.log(IStatus.ERROR, "Did not find associated editor to apply fix");
-                }
-            }
-        } else if (source == mIgnoreTypeButton) {
-            for (IMarker marker : mList.getSelectedMarkers()) {
-                String id = EclipseLintClient.getId(marker);
-                if (id != null) {
-                    LintFixGenerator.suppressDetector(id, true, mFile, true /*all*/);
-                }
-            }
-        } else if (source == mIgnoreButton) {
-            for (IMarker marker : mList.getSelectedMarkers()) {
-                LintFixGenerator.addSuppressAnnotation(marker);
-            }
-        } else if (source == mIgnoreAllButton) {
-            Set<String> ids = new HashSet<String>();
-            for (IMarker marker : mList.getSelectedMarkers()) {
-                String id = EclipseLintClient.getId(marker);
-                if (id != null && !ids.contains(id)) {
-                    ids.add(id);
-                    if (mEditor instanceof AndroidXmlEditor) {
-                        AndroidXmlEditor editor = (AndroidXmlEditor) mEditor;
-                        AddSuppressAttribute fix = AddSuppressAttribute.createFixForAll(editor,
-                                marker, id);
-                        if (fix != null) {
-                            IStructuredDocument document = editor.getStructuredDocument();
-                            fix.apply(document);
-                        }
-                    }
-                }
-            }
-            mList.refresh();
-        }
-    }
-
-    private void updateSelectionState() {
-        List<IMarker> selection = mList.getSelectedMarkers();
-
-        if (selection.size() == 1) {
-            selectMarker(selection.get(0));
-        } else {
-            selectMarker(null);
-        }
-
-        boolean canFix = selection.size() > 0;
-        for (IMarker marker : selection) {
-            if (!LintFix.hasFix(EclipseLintClient.getId(marker))) {
-                canFix = false;
-                break;
-            }
-
-            // Some fixes cannot be run in bulk
-            if (selection.size() > 1) {
-                List<LintFix> fixes = LintFix.getFixes(EclipseLintClient.getId(marker), marker);
-                if (fixes == null || !fixes.get(0).isBulkCapable()) {
-                    canFix = false;
-                    break;
-                }
-            }
-        }
-
-        mFixButton.setEnabled(canFix);
-    }
-
-    @Override
-    public void widgetDefaultSelected(SelectionEvent e) {
-        Object source = e.getSource();
-        if (source == mList.getTreeViewer().getControl()) {
-            // Jump to editor
-            List<IMarker> selection = mList.getSelectedMarkers();
-            if (selection.size() > 0) {
-                EclipseLintClient.showMarker(selection.get(0));
-                close();
-            }
-        }
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/lint/LintViewPart.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/lint/LintViewPart.java
deleted file mode 100644
index 90b956e..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/lint/LintViewPart.java
+++ /dev/null
@@ -1,657 +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.eclipse.adt.internal.lint;
-
-import static com.android.SdkConstants.DOT_JAVA;
-import static com.android.SdkConstants.DOT_XML;
-
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.ide.eclipse.adt.internal.editors.IconFactory;
-import com.android.ide.eclipse.adt.internal.preferences.LintPreferencePage;
-import com.android.ide.eclipse.adt.internal.project.BaseProjectHelper;
-import com.android.tools.lint.detector.api.LintUtils;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IFolder;
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.core.runtime.jobs.IJobChangeEvent;
-import org.eclipse.core.runtime.jobs.IJobChangeListener;
-import org.eclipse.core.runtime.jobs.Job;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.IStatusLineManager;
-import org.eclipse.jface.action.IToolBarManager;
-import org.eclipse.jface.action.Separator;
-import org.eclipse.jface.preference.IPreferenceNode;
-import org.eclipse.jface.preference.PreferenceDialog;
-import org.eclipse.jface.preference.PreferenceManager;
-import org.eclipse.jface.preference.PreferenceNode;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.text.IDocument;
-import org.eclipse.jface.text.IRegion;
-import org.eclipse.jface.text.Region;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.SashForm;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.ui.IMemento;
-import org.eclipse.ui.ISharedImages;
-import org.eclipse.ui.IViewPart;
-import org.eclipse.ui.IViewSite;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.editors.text.TextFileDocumentProvider;
-import org.eclipse.ui.part.ViewPart;
-import org.eclipse.ui.texteditor.IDocumentProvider;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-/**
- * Eclipse View which shows lint warnings for the current project
- */
-public class LintViewPart extends ViewPart implements SelectionListener, IJobChangeListener {
-    /** The view id for this view part */
-    public static final String ID = "com.android.ide.eclipse.adt.internal.lint.LintViewPart"; //$NON-NLS-1$
-    private static final String QUICKFIX_DISABLED_ICON = "quickfix-disabled";         //$NON-NLS-1$
-    private static final String QUICKFIX_ICON = "quickfix";                           //$NON-NLS-1$
-    private static final String REFRESH_ICON = "refresh";                             //$NON-NLS-1$
-    private static final String EXPAND_DISABLED_ICON = "expandall-disabled";          //$NON-NLS-1$
-    private static final String EXPAND_ICON = "expandall";                            //$NON-NLS-1$
-    private static final String COLUMNS_ICON = "columns";                             //$NON-NLS-1$
-    private static final String OPTIONS_ICON = "options";                             //$NON-NLS-1$
-    private static final String IGNORE_THIS_ICON = "ignore-this";                     //$NON-NLS-1$
-    private static final String IGNORE_THIS_DISABLED_ICON = "ignore-this-disabled";   //$NON-NLS-1$
-    private static final String IGNORE_FILE_ICON = "ignore-file";                     //$NON-NLS-1$
-    private static final String IGNORE_FILE_DISABLED_ICON = "ignore-file-disabled";   //$NON-NLS-1$
-    private static final String IGNORE_PRJ_ICON = "ignore-project";                   //$NON-NLS-1$
-    private static final String IGNORE_PRJ_DISABLED_ICON = "ignore-project-disabled"; //$NON-NLS-1$
-    private static final String IGNORE_ALL_ICON = "ignore-all";                   //$NON-NLS-1$
-    private static final String IGNORE_ALL_DISABLED_ICON = "ignore-all-disabled"; //$NON-NLS-1$
-    private IMemento mMemento;
-    private LintList mLintView;
-    private Text mDetailsText;
-    private Label mErrorLabel;
-    private SashForm mSashForm;
-    private Action mFixAction;
-    private Action mRemoveAction;
-    private Action mIgnoreAction;
-    private Action mAlwaysIgnoreAction;
-    private Action mIgnoreFileAction;
-    private Action mIgnoreProjectAction;
-    private Action mRemoveAllAction;
-    private Action mRefreshAction;
-    private Action mExpandAll;
-    private Action mCollapseAll;
-    private Action mConfigureColumns;
-    private Action mOptions;
-
-    /**
-     * Initial projects to show: this field is only briefly not null during the
-     * construction initiated by {@link #show(List)}
-     */
-    private static List<? extends IResource> sInitialResources;
-
-    /**
-     * Constructs a new {@link LintViewPart}
-     */
-    public LintViewPart() {
-    }
-
-    @Override
-    public void init(IViewSite site, IMemento memento) throws PartInitException {
-        super.init(site, memento);
-        mMemento = memento;
-    }
-
-    @Override
-    public void saveState(IMemento memento) {
-        super.saveState(memento);
-
-        mLintView.saveState(memento);
-    }
-
-    @Override
-    public void dispose() {
-        if (mLintView != null) {
-            mLintView.dispose();
-            mLintView = null;
-        }
-        super.dispose();
-    }
-
-    @Override
-    public void createPartControl(Composite parent) {
-        GridLayout gridLayout = new GridLayout(1, false);
-        gridLayout.verticalSpacing = 0;
-        gridLayout.marginWidth = 0;
-        gridLayout.marginHeight = 0;
-        parent.setLayout(gridLayout);
-
-        mErrorLabel = new Label(parent, SWT.NONE);
-        mErrorLabel.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1));
-
-        mSashForm = new SashForm(parent, SWT.NONE);
-        mSashForm.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));
-        mLintView = new LintList(getSite(), mSashForm, mMemento, false /*singleFile*/);
-
-        mDetailsText = new Text(mSashForm,
-                SWT.BORDER | SWT.READ_ONLY | SWT.WRAP | SWT.V_SCROLL | SWT.MULTI);
-        Display display = parent.getDisplay();
-        mDetailsText.setBackground(display.getSystemColor(SWT.COLOR_INFO_BACKGROUND));
-        mDetailsText.setForeground(display.getSystemColor(SWT.COLOR_INFO_FOREGROUND));
-
-        mLintView.addSelectionListener(this);
-        mSashForm.setWeights(new int[] {8, 2});
-
-        createActions();
-        initializeToolBar();
-
-        // If there are currently running jobs, listen for them such that we can update the
-        // button state
-        refreshStopIcon();
-
-        if (sInitialResources != null) {
-            mLintView.setResources(sInitialResources);
-            sInitialResources = null;
-        } else {
-            // No supplied context: show lint warnings for all projects
-            IJavaProject[] androidProjects = BaseProjectHelper.getAndroidProjects(null);
-            if (androidProjects.length > 0) {
-                List<IResource> projects = new ArrayList<IResource>();
-                for (IJavaProject project : androidProjects) {
-                    projects.add(project.getProject());
-                }
-                mLintView.setResources(projects);
-            }
-        }
-
-        updateIssueCount();
-    }
-
-    /**
-     * Create the actions.
-     */
-    private void createActions() {
-        ISharedImages sharedImages = PlatformUI.getWorkbench().getSharedImages();
-        IconFactory iconFactory = IconFactory.getInstance();
-        mFixAction = new LintViewAction("Fix", ACTION_FIX,
-                iconFactory.getImageDescriptor(QUICKFIX_ICON),
-                iconFactory.getImageDescriptor(QUICKFIX_DISABLED_ICON));
-
-        mIgnoreAction = new LintViewAction("Suppress this error with an annotation/attribute",
-                ACTION_IGNORE_THIS,
-                iconFactory.getImageDescriptor(IGNORE_THIS_ICON),
-                iconFactory.getImageDescriptor(IGNORE_THIS_DISABLED_ICON));
-        mIgnoreFileAction = new LintViewAction("Ignore in this file", ACTION_IGNORE_FILE,
-                iconFactory.getImageDescriptor(IGNORE_FILE_ICON),
-                iconFactory.getImageDescriptor(IGNORE_FILE_DISABLED_ICON));
-        mIgnoreProjectAction = new LintViewAction("Ignore in this project", ACTION_IGNORE_TYPE,
-                iconFactory.getImageDescriptor(IGNORE_PRJ_ICON),
-                iconFactory.getImageDescriptor(IGNORE_PRJ_DISABLED_ICON));
-        mAlwaysIgnoreAction = new LintViewAction("Always Ignore", ACTION_IGNORE_ALL,
-                iconFactory.getImageDescriptor(IGNORE_ALL_ICON),
-                iconFactory.getImageDescriptor(IGNORE_ALL_DISABLED_ICON));
-
-        mRemoveAction = new LintViewAction("Remove", ACTION_REMOVE,
-                sharedImages.getImageDescriptor(ISharedImages.IMG_ELCL_REMOVE),
-                sharedImages.getImageDescriptor(ISharedImages.IMG_ELCL_REMOVE_DISABLED));
-        mRemoveAllAction = new LintViewAction("Remove All", ACTION_REMOVE_ALL,
-                sharedImages.getImageDescriptor(ISharedImages.IMG_ELCL_REMOVEALL),
-                sharedImages.getImageDescriptor(ISharedImages.IMG_ELCL_REMOVEALL_DISABLED));
-        mRefreshAction = new LintViewAction("Refresh (& Save Files)", ACTION_REFRESH,
-                iconFactory.getImageDescriptor(REFRESH_ICON), null);
-        mRemoveAllAction.setEnabled(true);
-        mCollapseAll = new LintViewAction("Collapse All", ACTION_COLLAPSE,
-                sharedImages.getImageDescriptor(ISharedImages.IMG_ELCL_COLLAPSEALL),
-                sharedImages.getImageDescriptor(ISharedImages.IMG_ELCL_COLLAPSEALL_DISABLED));
-        mCollapseAll.setEnabled(true);
-        mExpandAll = new LintViewAction("Expand All", ACTION_EXPAND,
-                iconFactory.getImageDescriptor(EXPAND_ICON),
-                iconFactory.getImageDescriptor(EXPAND_DISABLED_ICON));
-        mExpandAll.setEnabled(true);
-
-        mConfigureColumns = new LintViewAction("Configure Columns...", ACTION_COLUMNS,
-                iconFactory.getImageDescriptor(COLUMNS_ICON),
-                null);
-
-        mOptions = new LintViewAction("Options...", ACTION_OPTIONS,
-                iconFactory.getImageDescriptor(OPTIONS_ICON),
-                null);
-
-        enableActions(Collections.<IMarker>emptyList(), false /*updateWidgets*/);
-    }
-
-    /**
-     * Initialize the toolbar.
-     */
-    private void initializeToolBar() {
-        IToolBarManager toolbarManager = getViewSite().getActionBars().getToolBarManager();
-        toolbarManager.add(mRefreshAction);
-        toolbarManager.add(mFixAction);
-        toolbarManager.add(mIgnoreAction);
-        toolbarManager.add(mIgnoreFileAction);
-        toolbarManager.add(mIgnoreProjectAction);
-        toolbarManager.add(mAlwaysIgnoreAction);
-        toolbarManager.add(new Separator());
-        toolbarManager.add(mRemoveAction);
-        toolbarManager.add(mRemoveAllAction);
-        toolbarManager.add(new Separator());
-        toolbarManager.add(mExpandAll);
-        toolbarManager.add(mCollapseAll);
-        toolbarManager.add(mConfigureColumns);
-        toolbarManager.add(mOptions);
-    }
-
-    @Override
-    public void setFocus() {
-        mLintView.setFocus();
-    }
-
-    /**
-     * Sets the resource associated with the lint view
-     *
-     * @param resources the associated resources
-     */
-    public void setResources(List<? extends IResource> resources) {
-        mLintView.setResources(resources);
-
-        // Refresh the stop/refresh icon status
-        refreshStopIcon();
-    }
-
-    private void refreshStopIcon() {
-        Job[] currentJobs = LintJob.getCurrentJobs();
-        if (currentJobs.length > 0) {
-            ISharedImages sharedImages = PlatformUI.getWorkbench().getSharedImages();
-            mRefreshAction.setImageDescriptor(sharedImages.getImageDescriptor(
-                    ISharedImages.IMG_ELCL_STOP));
-            for (Job job : currentJobs) {
-                job.addJobChangeListener(this);
-            }
-        } else {
-            mRefreshAction.setImageDescriptor(
-                    IconFactory.getInstance().getImageDescriptor(REFRESH_ICON));
-
-        }
-    }
-
-    // ---- Implements SelectionListener ----
-
-    @Override
-    public void widgetSelected(SelectionEvent e) {
-        List<IMarker> markers = mLintView.getSelectedMarkers();
-        if (markers.size() != 1) {
-            mDetailsText.setText(""); //$NON-NLS-1$
-        } else {
-            mDetailsText.setText(EclipseLintClient.describe(markers.get(0)));
-        }
-
-        IStatusLineManager status = getViewSite().getActionBars().getStatusLineManager();
-        status.setMessage(mDetailsText.getText());
-
-        updateIssueCount();
-
-        enableActions(markers, true /* updateWidgets */);
-    }
-
-    private void enableActions(List<IMarker> markers, boolean updateWidgets) {
-        // Update enabled state of actions
-        boolean hasSelection = markers.size() > 0;
-        boolean canFix = hasSelection;
-        for (IMarker marker : markers) {
-            if (!LintFix.hasFix(EclipseLintClient.getId(marker))) {
-                canFix = false;
-                break;
-            }
-
-            // Some fixes cannot be run in bulk
-            if (markers.size() > 1) {
-                List<LintFix> fixes = LintFix.getFixes(EclipseLintClient.getId(marker), marker);
-                if (fixes == null || !fixes.get(0).isBulkCapable()) {
-                    canFix = false;
-                    break;
-                }
-            }
-        }
-
-        boolean haveFile = false;
-        boolean isJavaOrXml = true;
-        for (IMarker marker : markers) {
-            IResource resource = marker.getResource();
-            if (resource instanceof IFile || resource instanceof IFolder) {
-                haveFile = true;
-                String name = resource.getName();
-                if (!LintUtils.endsWith(name, DOT_XML) && !LintUtils.endsWith(name, DOT_JAVA)) {
-                    isJavaOrXml = false;
-                }
-                break;
-            }
-        }
-
-        mFixAction.setEnabled(canFix);
-        mIgnoreAction.setEnabled(hasSelection && haveFile && isJavaOrXml);
-        mIgnoreFileAction.setEnabled(hasSelection && haveFile);
-        mIgnoreProjectAction.setEnabled(hasSelection);
-        mAlwaysIgnoreAction.setEnabled(hasSelection);
-        mRemoveAction.setEnabled(hasSelection);
-
-        if (updateWidgets) {
-            getViewSite().getActionBars().getToolBarManager().update(false);
-        }
-    }
-
-    @Override
-    public void widgetDefaultSelected(SelectionEvent e) {
-        Object source = e.getSource();
-        if (source == mLintView.getTreeViewer().getControl()) {
-            // Jump to editor
-            List<IMarker> selection = mLintView.getSelectedMarkers();
-            if (selection.size() > 0) {
-                EclipseLintClient.showMarker(selection.get(0));
-            }
-        }
-    }
-
-    // --- Implements IJobChangeListener ----
-
-    @Override
-    public void done(IJobChangeEvent event) {
-        mRefreshAction.setImageDescriptor(
-                IconFactory.getInstance().getImageDescriptor(REFRESH_ICON));
-
-        if (!mLintView.isDisposed()) {
-            mLintView.getDisplay().asyncExec(new Runnable()  {
-                @Override
-                public void run() {
-                    if (!mLintView.isDisposed()) {
-                        updateIssueCount();
-                    }
-                }
-            });
-        }
-    }
-
-    private void updateIssueCount() {
-        int errors = mLintView.getErrorCount();
-        int warnings = mLintView.getWarningCount();
-        mErrorLabel.setText(String.format("%1$d errors, %2$d warnings", errors, warnings));
-    }
-
-    @Override
-    public void aboutToRun(IJobChangeEvent event) {
-    }
-
-    @Override
-    public void awake(IJobChangeEvent event) {
-    }
-
-    @Override
-    public void running(IJobChangeEvent event) {
-    }
-
-    @Override
-    public void scheduled(IJobChangeEvent event) {
-    }
-
-    @Override
-    public void sleeping(IJobChangeEvent event) {
-    }
-
-    // ---- Actions ----
-
-    private static final int ACTION_REFRESH = 1;
-    private static final int ACTION_FIX = 2;
-    private static final int ACTION_IGNORE_THIS = 3;
-    private static final int ACTION_IGNORE_FILE = 4;
-    private static final int ACTION_IGNORE_TYPE = 5;
-    private static final int ACTION_IGNORE_ALL = 6;
-    private static final int ACTION_REMOVE = 7;
-    private static final int ACTION_REMOVE_ALL = 8;
-    private static final int ACTION_COLLAPSE = 9;
-    private static final int ACTION_EXPAND = 10;
-    private static final int ACTION_COLUMNS = 11;
-    private static final int ACTION_OPTIONS = 12;
-
-    private class LintViewAction extends Action {
-
-        private final int mAction;
-
-        private LintViewAction(String label, int action,
-                ImageDescriptor imageDesc, ImageDescriptor disabledImageDesc) {
-            super(label);
-            mAction = action;
-            setImageDescriptor(imageDesc);
-            if (disabledImageDesc != null) {
-                setDisabledImageDescriptor(disabledImageDesc);
-            }
-        }
-
-        @Override
-        public void run() {
-            switch (mAction) {
-                case ACTION_REFRESH: {
-                    IWorkbench workbench = PlatformUI.getWorkbench();
-                    if (workbench != null) {
-                        workbench.saveAllEditors(false /*confirm*/);
-                    }
-
-                    Job[] jobs = LintJob.getCurrentJobs();
-                    if (jobs.length > 0) {
-                        EclipseLintRunner.cancelCurrentJobs(false);
-                    } else {
-                        List<? extends IResource> resources = mLintView.getResources();
-                        if (resources == null) {
-                            return;
-                        }
-                        Job job = EclipseLintRunner.startLint(resources, null, null,
-                                false /*fatalOnly*/, false /*show*/);
-                        if (job != null && workbench != null) {
-                            job.addJobChangeListener(LintViewPart.this);
-                            ISharedImages sharedImages = workbench.getSharedImages();
-                            setImageDescriptor(sharedImages.getImageDescriptor(
-                                    ISharedImages.IMG_ELCL_STOP));
-                        }
-                    }
-                    break;
-                }
-                case ACTION_FIX: {
-                    List<IMarker> markers = mLintView.getSelectedMarkers();
-                    for (IMarker marker : markers) {
-                        List<LintFix> fixes = LintFix.getFixes(EclipseLintClient.getId(marker),
-                                marker);
-                        if (fixes == null) {
-                            continue;
-                        }
-                        LintFix fix = fixes.get(0);
-                        IResource resource = marker.getResource();
-                        if (fix.needsFocus() && resource instanceof IFile) {
-                            IRegion region = null;
-                            try {
-                                int start = marker.getAttribute(IMarker.CHAR_START, -1);
-                                int end = marker.getAttribute(IMarker.CHAR_END, -1);
-                                if (start != -1) {
-                                    region = new Region(start, end - start);
-                                }
-                                AdtPlugin.openFile((IFile) resource, region);
-                            } catch (PartInitException e) {
-                                AdtPlugin.log(e, "Can't open file %1$s", resource);
-                            }
-                        }
-                        IDocumentProvider provider = new TextFileDocumentProvider();
-                        try {
-                            provider.connect(resource);
-                            IDocument document = provider.getDocument(resource);
-                            if (document != null) {
-                                fix.apply(document);
-                                if (!fix.needsFocus()) {
-                                    provider.saveDocument(new NullProgressMonitor(), resource,
-                                            document,  true /*overwrite*/);
-                                }
-                            }
-                        } catch (Exception e) {
-                            AdtPlugin.log(e, "Did not find associated editor to apply fix: %1$s",
-                                    resource.getName());
-                        } finally {
-                            provider.disconnect(resource);
-                        }
-                    }
-                    break;
-                }
-                case ACTION_REMOVE: {
-                    for (IMarker marker : mLintView.getSelectedMarkers()) {
-                        try {
-                            marker.delete();
-                        } catch (CoreException e) {
-                            AdtPlugin.log(e, null);
-                        }
-                    }
-                    break;
-                }
-                case ACTION_REMOVE_ALL: {
-                    List<? extends IResource> resources = mLintView.getResources();
-                    if (resources != null) {
-                        for (IResource resource : resources) {
-                            EclipseLintClient.clearMarkers(resource);
-                        }
-                    }
-                    break;
-                }
-                case ACTION_IGNORE_ALL:
-                    assert false;
-                    break;
-                case ACTION_IGNORE_TYPE:
-                case ACTION_IGNORE_FILE: {
-                    boolean ignoreInFile = mAction == ACTION_IGNORE_FILE;
-                    for (IMarker marker : mLintView.getSelectedMarkers()) {
-                        String id = EclipseLintClient.getId(marker);
-                        if (id != null) {
-                            IResource resource = marker.getResource();
-                            LintFixGenerator.suppressDetector(id, true,
-                                    ignoreInFile ? resource : resource.getProject(),
-                                    ignoreInFile);
-                        }
-                    }
-                    break;
-                }
-                case ACTION_IGNORE_THIS: {
-                    for (IMarker marker : mLintView.getSelectedMarkers()) {
-                        LintFixGenerator.addSuppressAnnotation(marker);
-                    }
-                    break;
-                }
-                case ACTION_COLLAPSE: {
-                    mLintView.collapseAll();
-                    break;
-                }
-                case ACTION_EXPAND: {
-                    mLintView.expandAll();
-                    break;
-                }
-                case ACTION_COLUMNS: {
-                    mLintView.configureColumns();
-                    break;
-                }
-                case ACTION_OPTIONS: {
-                    PreferenceManager manager = new PreferenceManager();
-
-                    LintPreferencePage page = new LintPreferencePage();
-                    String title = "Default/Global Settings";
-                    page.setTitle(title);
-                    IPreferenceNode node = new PreferenceNode(title, page);
-                    manager.addToRoot(node);
-
-
-                    List<? extends IResource> resources = mLintView.getResources();
-                    if (resources != null) {
-                        Set<IProject> projects = new HashSet<IProject>();
-                        for (IResource resource : resources) {
-                            projects.add(resource.getProject());
-                        }
-                        if (projects.size() > 0) {
-                            for (IProject project : projects) {
-                                page = new LintPreferencePage();
-                                page.setTitle(String.format("Settings for %1$s",
-                                        project.getName()));
-                                page.setElement(project);
-                                node = new PreferenceNode(project.getName(), page);
-                                manager.addToRoot(node);
-                            }
-                        }
-                    }
-
-                    Shell shell = LintViewPart.this.getSite().getShell();
-                    PreferenceDialog dialog = new PreferenceDialog(shell, manager);
-                    dialog.create();
-                    dialog.setSelectedNode(title);
-                    dialog.open();
-                    break;
-                }
-                default:
-                    assert false : mAction;
-            }
-            updateIssueCount();
-        }
-    }
-
-    /**
-     * Shows or reconfigures the LintView to show the lint warnings for the
-     * given project
-     *
-     * @param projects the projects to show lint warnings for
-     */
-    public static void show(List<? extends IResource> projects) {
-        IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
-        if (window != null) {
-            IWorkbenchPage page = window.getActivePage();
-            if (page != null) {
-                try {
-                    // Pass initial project context via static field read by constructor
-                    sInitialResources = projects;
-                    IViewPart view = page.showView(LintViewPart.ID, null,
-                            IWorkbenchPage.VIEW_ACTIVATE);
-                    if (sInitialResources != null && view instanceof LintViewPart) {
-                        // The view must be showing already since the constructor was not
-                        // run, so reconfigure the view instead
-                        LintViewPart lintView = (LintViewPart) view;
-                        lintView.setResources(projects);
-                    }
-                } catch (PartInitException e) {
-                    AdtPlugin.log(e, "Cannot open Lint View");
-                } finally {
-                    sInitialResources = null;
-                }
-            }
-        }
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/lint/ObsoleteLayoutParamsFix.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/lint/ObsoleteLayoutParamsFix.java
deleted file mode 100644
index 9db5517..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/lint/ObsoleteLayoutParamsFix.java
+++ /dev/null
@@ -1,80 +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.ide.eclipse.adt.internal.lint;
-
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.jface.text.IDocument;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.ui.ISharedImages;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
-import org.eclipse.wst.sse.core.internal.provisional.IndexedRegion;
-import org.w3c.dom.Attr;
-import org.w3c.dom.Element;
-import org.w3c.dom.NamedNodeMap;
-import org.w3c.dom.Node;
-
-@SuppressWarnings("restriction") // DOM model
-final class ObsoleteLayoutParamsFix extends DocumentFix {
-    private ObsoleteLayoutParamsFix(String id, IMarker marker) {
-        super(id, marker);
-    }
-
-    @Override
-    public boolean needsFocus() {
-        return false;
-    }
-
-    @Override
-    public boolean isCancelable() {
-        return false;
-    }
-
-    @Override
-    public boolean isBulkCapable() {
-        return false;
-    }
-
-    @Override
-    protected void apply(IDocument document, IStructuredModel model, Node node, int start,
-            int end) {
-        if (node instanceof Element) {
-            Element element = (Element) node;
-            NamedNodeMap attributes = element.getAttributes();
-            for (int i = 0, n = attributes.getLength(); i < n; i++) {
-                Attr attribute = (Attr) attributes.item(i);
-                if (attribute instanceof IndexedRegion) {
-                    IndexedRegion region = (IndexedRegion) attribute;
-                    if (region.getStartOffset() == start) {
-                        element.removeAttribute(attribute.getName());
-                        return;
-                    }
-                }
-            }
-        }
-    }
-
-    @Override
-    public String getDisplayString() {
-        return "Remove attribute";
-    }
-
-    @Override
-    public Image getImage() {
-        ISharedImages sharedImages = PlatformUI.getWorkbench().getSharedImages();
-        return sharedImages.getImage(ISharedImages.IMG_ETOOL_DELETE);
-    }
-}
\ No newline at end of file
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/lint/ProjectLintConfiguration.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/lint/ProjectLintConfiguration.java
deleted file mode 100644
index 9e4ca12..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/lint/ProjectLintConfiguration.java
+++ /dev/null
@@ -1,90 +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.eclipse.adt.internal.lint;
-
-import com.android.annotations.NonNull;
-import com.android.annotations.VisibleForTesting;
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.ide.eclipse.adt.AdtUtils;
-import com.android.tools.lint.client.api.Configuration;
-import com.android.tools.lint.client.api.DefaultConfiguration;
-import com.android.tools.lint.client.api.LintClient;
-import com.android.tools.lint.detector.api.Issue;
-import com.android.tools.lint.detector.api.Project;
-import com.android.tools.lint.detector.api.Severity;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.QualifiedName;
-
-import java.io.File;
-
-/** Configuration for Lint in Eclipse projects */
-class ProjectLintConfiguration extends DefaultConfiguration {
-    private boolean mFatalOnly;
-
-    private final static QualifiedName CONFIGURATION_NAME = new QualifiedName(AdtPlugin.PLUGIN_ID,
-            "lintconfig"); //$NON-NLS-1$
-
-    @VisibleForTesting
-    ProjectLintConfiguration(LintClient client, Project project,
-            Configuration parent, boolean fatalOnly) {
-        super(client, project, parent);
-        mFatalOnly = fatalOnly;
-    }
-
-    private static ProjectLintConfiguration create(LintClient client, IProject project,
-            Configuration parent, boolean fatalOnly) {
-        File dir = AdtUtils.getAbsolutePath(project).toFile();
-        Project lintProject = client.getProject(dir, dir);
-        return new ProjectLintConfiguration(client, lintProject, parent, fatalOnly);
-    }
-
-    public static ProjectLintConfiguration get(LintClient client, IProject project,
-            boolean fatalOnly) {
-        // Don't cache fatal-only configurations: they're only used occasionally and typically
-        // not repeatedly
-        if (fatalOnly) {
-            return create(client, project, GlobalLintConfiguration.get(), true);
-        }
-
-        ProjectLintConfiguration configuration = null;
-        try {
-            Object value = project.getSessionProperty(CONFIGURATION_NAME);
-            configuration = (ProjectLintConfiguration) value;
-        } catch (CoreException e) {
-            // Not a problem; we will just create a new one
-        }
-        if (configuration == null) {
-            configuration = create(client, project, GlobalLintConfiguration.get(), false);
-            try {
-                project.setSessionProperty(CONFIGURATION_NAME, configuration);
-            } catch (CoreException e) {
-                AdtPlugin.log(e, "Can't store lint configuration");
-            }
-        }
-        return configuration;
-    }
-
-    @Override
-    public @NonNull Severity getSeverity(@NonNull Issue issue) {
-        Severity severity = super.getSeverity(issue);
-        if (mFatalOnly && severity != Severity.FATAL) {
-            return Severity.IGNORE;
-        }
-        return severity;
-    }
-}
\ No newline at end of file
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/lint/RemoveUselessViewFix.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/lint/RemoveUselessViewFix.java
deleted file mode 100644
index 0e9f326..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/lint/RemoveUselessViewFix.java
+++ /dev/null
@@ -1,99 +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.ide.eclipse.adt.internal.lint;
-
-import com.android.ide.eclipse.adt.AdtUtils;
-import com.android.ide.eclipse.adt.internal.editors.layout.LayoutEditorDelegate;
-import com.android.ide.eclipse.adt.internal.editors.layout.refactoring.UnwrapRefactoring;
-import com.android.tools.lint.checks.UselessViewDetector;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.jface.text.IDocument;
-import org.eclipse.jface.text.ITextSelection;
-import org.eclipse.jface.text.TextSelection;
-import org.eclipse.ltk.ui.refactoring.RefactoringWizard;
-import org.eclipse.ltk.ui.refactoring.RefactoringWizardOpenOperation;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.ui.ISharedImages;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-
-@SuppressWarnings("restriction") // DOM model
-final class RemoveUselessViewFix extends DocumentFix {
-    private RemoveUselessViewFix(String id, IMarker marker) {
-        super(id, marker);
-    }
-
-    @Override
-    public boolean needsFocus() {
-        return isCancelable();
-    }
-
-    @Override
-    public boolean isCancelable() {
-        return mId.equals(mId.equals(UselessViewDetector.USELESS_PARENT.getId()));
-    }
-
-    @Override
-    protected void apply(IDocument document, IStructuredModel model, Node node, int start,
-            int end) {
-        if (node instanceof Element && node.getParentNode() instanceof Element) {
-            Element element = (Element) node;
-            Element parent = (Element) node.getParentNode();
-
-            if (mId.equals(UselessViewDetector.USELESS_LEAF.getId())) {
-                parent.removeChild(element);
-            } else {
-                assert mId.equals(UselessViewDetector.USELESS_PARENT.getId());
-                // Invoke refactoring
-                LayoutEditorDelegate delegate =
-                    LayoutEditorDelegate.fromEditor(AdtUtils.getActiveEditor());
-
-                if (delegate != null) {
-                    IFile file = (IFile) mMarker.getResource();
-                    ITextSelection textSelection = new TextSelection(start,
-                            end - start);
-                    UnwrapRefactoring refactoring =
-                            new UnwrapRefactoring(file, delegate, textSelection, null);
-                    RefactoringWizard wizard = refactoring.createWizard();
-                    RefactoringWizardOpenOperation op =
-                            new RefactoringWizardOpenOperation(wizard);
-                    try {
-                        IWorkbenchWindow window = PlatformUI.getWorkbench().
-                                getActiveWorkbenchWindow();
-                        op.run(window.getShell(), wizard.getDefaultPageTitle());
-                    } catch (InterruptedException e) {
-                    }
-                }
-            }
-        }
-    }
-
-    @Override
-    public String getDisplayString() {
-        return "Remove unnecessary view";
-    }
-
-    @Override
-    public Image getImage() {
-        ISharedImages sharedImages = PlatformUI.getWorkbench().getSharedImages();
-        return sharedImages.getImage(ISharedImages.IMG_ETOOL_DELETE);
-    }
-}
\ No newline at end of file
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/lint/RunLintAction.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/lint/RunLintAction.java
deleted file mode 100644
index 1de903e..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/lint/RunLintAction.java
+++ /dev/null
@@ -1,232 +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.eclipse.adt.internal.lint;
-
-import static com.android.SdkConstants.DOT_XML;
-
-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.ide.eclipse.adt.internal.preferences.AdtPrefs;
-import com.android.tools.lint.detector.api.LintUtils;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.ui.JavaElementLabelProvider;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.ActionContributionItem;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.action.IMenuCreator;
-import org.eclipse.jface.action.Separator;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Menu;
-import org.eclipse.ui.IObjectActionDelegate;
-import org.eclipse.ui.ISharedImages;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.IWorkbenchWindowPulldownDelegate;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.texteditor.ITextEditor;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * Action which runs Lint on the currently projects (and also provides a
- * pulldown menu in the toolbar for selecting specifically which projects to
- * check)
- */
-public class RunLintAction implements IObjectActionDelegate, IMenuCreator,
-        IWorkbenchWindowPulldownDelegate {
-
-    private ISelection mSelection;
-    private Menu mMenu;
-
-    @Override
-    public void selectionChanged(IAction action, ISelection selection) {
-        mSelection = selection;
-    }
-
-    @Override
-    public void run(IAction action) {
-        List<IProject> projects = getProjects(mSelection, true /* warn */);
-
-        if (!projects.isEmpty()) {
-            EclipseLintRunner.startLint(projects, null, null, false /*fatalOnly*/, true /*show*/);
-        }
-    }
-
-    /** Returns the Android project(s) to apply a lint run to. */
-    static List<IProject> getProjects(ISelection selection, boolean warn) {
-        List<IProject> projects = AdtUtils.getSelectedProjects(selection);
-
-        if (projects.isEmpty() && warn) {
-            MessageDialog.openWarning(AdtPlugin.getShell(), "Lint",
-                    "Could not run Lint: Select an Android project first.");
-        }
-
-        return projects;
-    }
-
-    @Override
-    public void setActivePart(IAction action, IWorkbenchPart targetPart) {
-    }
-
-    @Override
-    public void dispose() {
-        if (mMenu != null) {
-            mMenu.dispose();
-        }
-    }
-
-    @Override
-    public void init(IWorkbenchWindow window) {
-    }
-
-    // ---- IMenuCreator ----
-
-    @Override
-    public Menu getMenu(Control parent) {
-        mMenu = new Menu(parent);
-
-        IconFactory iconFactory = IconFactory.getInstance();
-        ImageDescriptor allIcon = iconFactory.getImageDescriptor("lintrun"); //$NON-NLS-1$
-        LintMenuAction allAction = new LintMenuAction("Check All Projects", allIcon,
-                ACTION_RUN, null);
-
-        addAction(allAction);
-        addSeparator();
-        IJavaProject[] projects = AdtUtils.getOpenAndroidProjects();
-        ILabelProvider provider = new JavaElementLabelProvider(
-                JavaElementLabelProvider.SHOW_DEFAULT);
-        for (IJavaProject project : projects) {
-            IProject p = project.getProject();
-            ImageDescriptor icon = ImageDescriptor.createFromImage(provider.getImage(p));
-            String label = String.format("Check %1$s", p.getName());
-            LintMenuAction projectAction = new LintMenuAction(label, icon, ACTION_RUN, p);
-            addAction(projectAction);
-        }
-
-        ITextEditor textEditor = AdtUtils.getActiveTextEditor();
-        if (textEditor != null) {
-            IFile file = AdtUtils.getActiveFile();
-            // Currently only supported for XML files
-            if (file != null && LintUtils.endsWith(file.getName(), DOT_XML)) {
-                ImageDescriptor icon = ImageDescriptor.createFromImage(provider.getImage(file));
-                IAction fileAction = new LintMenuAction("Check Current File", icon, ACTION_RUN,
-                        file);
-
-                addSeparator();
-                addAction(fileAction);
-            }
-        }
-
-        ISharedImages images = PlatformUI.getWorkbench().getSharedImages();
-        ImageDescriptor clear = images.getImageDescriptor(ISharedImages.IMG_ELCL_REMOVEALL);
-        LintMenuAction clearAction = new LintMenuAction("Clear Lint Warnings", clear, ACTION_CLEAR,
-                null);
-        addSeparator();
-        addAction(clearAction);
-
-        LintMenuAction excludeAction = new LintMenuAction("Skip Library Project Dependencies",
-                allIcon, ACTION_TOGGLE_EXCLUDE, null);
-        addSeparator();
-        addAction(excludeAction);
-        excludeAction.setChecked(AdtPrefs.getPrefs().getSkipLibrariesFromLint());
-
-        return mMenu;
-    }
-
-    private void addAction(IAction action) {
-        ActionContributionItem item = new ActionContributionItem(action);
-        item.fill(mMenu, -1);
-    }
-
-    private void addSeparator() {
-        new Separator().fill(mMenu, -1);
-    }
-
-    @Override
-    public Menu getMenu(Menu parent) {
-        return null;
-    }
-
-    private static final int ACTION_RUN = 1;
-    private static final int ACTION_CLEAR = 2;
-    private static final int ACTION_TOGGLE_EXCLUDE = 3;
-
-    /**
-     * Actions in the pulldown context menu: run lint or clear lint markers on
-     * the given resource
-     */
-    private static class LintMenuAction extends Action {
-        private final IResource mResource;
-        private final int mAction;
-
-        /**
-         * Creates a new context menu action
-         *
-         * @param text the label
-         * @param descriptor the icon
-         * @param action the action to run: run lint, clear, or toggle exclude libraries
-         * @param resource the resource to check or clear markers for, where
-         *            null means all projects
-         */
-        private LintMenuAction(String text, ImageDescriptor descriptor, int action,
-                IResource resource) {
-            super(text, action == ACTION_TOGGLE_EXCLUDE ? AS_CHECK_BOX : AS_PUSH_BUTTON);
-            if (descriptor != null) {
-                setImageDescriptor(descriptor);
-            }
-            mAction = action;
-            mResource = resource;
-        }
-
-        @Override
-        public void run() {
-            if (mAction == ACTION_TOGGLE_EXCLUDE) {
-                AdtPrefs prefs = AdtPrefs.getPrefs();
-                prefs.setSkipLibrariesFromLint(!prefs.getSkipLibrariesFromLint());
-                return;
-            }
-            List<IResource> resources = new ArrayList<IResource>();
-            if (mResource == null) {
-                // All projects
-                IJavaProject[] open = AdtUtils.getOpenAndroidProjects();
-                for (IJavaProject project : open) {
-                    resources.add(project.getProject());
-                }
-            } else {
-                resources.add(mResource);
-            }
-            EclipseLintRunner.cancelCurrentJobs(false);
-            if (mAction == ACTION_CLEAR) {
-                EclipseLintClient.clearMarkers(resources);
-            } else {
-                assert mAction == ACTION_RUN;
-                EclipseLintRunner.startLint(resources, null, null, false /*fatalOnly*/,
-                        true /*show*/);
-            }
-        }
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/lint/SetAttributeFix.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/lint/SetAttributeFix.java
deleted file mode 100644
index ea73b9a..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/lint/SetAttributeFix.java
+++ /dev/null
@@ -1,151 +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.ide.eclipse.adt.internal.lint;
-
-import static com.android.SdkConstants.ANDROID_URI;
-import static com.android.SdkConstants.ATTR_ALLOW_BACKUP;
-import static com.android.SdkConstants.ATTR_BASELINE_ALIGNED;
-import static com.android.SdkConstants.ATTR_CONTENT_DESCRIPTION;
-import static com.android.SdkConstants.ATTR_ID;
-import static com.android.SdkConstants.ATTR_INPUT_TYPE;
-import static com.android.SdkConstants.ATTR_PERMISSION;
-import static com.android.SdkConstants.ATTR_TRANSLATABLE;
-import static com.android.SdkConstants.NEW_ID_PREFIX;
-import static com.android.SdkConstants.VALUE_FALSE;
-
-import com.android.ide.eclipse.adt.AdtUtils;
-import com.android.ide.eclipse.adt.internal.editors.AndroidXmlEditor;
-import com.android.ide.eclipse.adt.internal.editors.descriptors.DescriptorsUtils;
-import com.android.tools.lint.checks.AccessibilityDetector;
-import com.android.tools.lint.checks.InefficientWeightDetector;
-import com.android.tools.lint.checks.ManifestDetector;
-import com.android.tools.lint.checks.MissingIdDetector;
-import com.android.tools.lint.checks.SecurityDetector;
-import com.android.tools.lint.checks.TextFieldDetector;
-import com.android.tools.lint.checks.TranslationDetector;
-
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.ui.IEditorPart;
-import org.w3c.dom.Element;
-
-/** Shared fix class for various builtin attributes */
-final class SetAttributeFix extends SetPropertyFix {
-    private SetAttributeFix(String id, IMarker marker) {
-        super(id, marker);
-    }
-
-    @Override
-    protected String getAttribute() {
-        if (mId.equals(AccessibilityDetector.ISSUE.getId())) {
-            return ATTR_CONTENT_DESCRIPTION;
-        } else if (mId.equals(InefficientWeightDetector.BASELINE_WEIGHTS.getId())) {
-            return ATTR_BASELINE_ALIGNED;
-        } else if (mId.equals(SecurityDetector.EXPORTED_SERVICE.getId())) {
-            return ATTR_PERMISSION;
-        } else if (mId.equals(TextFieldDetector.ISSUE.getId())) {
-            return ATTR_INPUT_TYPE;
-        } else if (mId.equals(TranslationDetector.MISSING.getId())) {
-            return ATTR_TRANSLATABLE;
-        } else if (mId.equals(ManifestDetector.ALLOW_BACKUP.getId())) {
-            return ATTR_ALLOW_BACKUP;
-        } else if (mId.equals(MissingIdDetector.ISSUE.getId())) {
-            return ATTR_ID;
-        } else {
-            assert false : mId;
-            return "";
-        }
-    }
-
-    @Override
-    protected boolean isAndroidAttribute() {
-        if (mId.equals(TranslationDetector.MISSING.getId())) {
-            return false;
-        }
-
-        return true;
-    }
-
-    @Override
-    public String getDisplayString() {
-        if (mId.equals(AccessibilityDetector.ISSUE.getId())) {
-            return "Add content description attribute";
-        } else if (mId.equals(InefficientWeightDetector.BASELINE_WEIGHTS.getId())) {
-            return "Set baseline attribute";
-        } else if (mId.equals(TextFieldDetector.ISSUE.getId())) {
-            return "Set input type";
-        } else if (mId.equals(SecurityDetector.EXPORTED_SERVICE.getId())) {
-            return "Add permission attribute";
-        } else if (mId.equals(TranslationDetector.MISSING.getId())) {
-            return "Mark this as a non-translatable resource";
-        } else if (mId.equals(ManifestDetector.ALLOW_BACKUP.getId())) {
-            return "Set the allowBackup attribute to true or false";
-        } else if (mId.equals(MissingIdDetector.ISSUE.getId())) {
-            return "Set the ID attribute";
-        } else {
-            assert false : mId;
-            return "";
-        }
-    }
-
-    @Override
-    public String getAdditionalProposalInfo() {
-        String help = super.getAdditionalProposalInfo();
-
-        if (mId.equals(TranslationDetector.MISSING.getId())) {
-            help = "<b>Adds translatable=\"false\" to this &lt;string&gt;.</b><br><br>" + help;
-        }
-
-        return help;
-    }
-
-    @Override
-    protected boolean invokeCodeCompletion() {
-        return mId.equals(SecurityDetector.EXPORTED_SERVICE.getId())
-                || mId.equals(TextFieldDetector.ISSUE.getId())
-                || mId.equals(ManifestDetector.ALLOW_BACKUP.getId());
-    }
-
-    @Override
-    public boolean selectValue() {
-        if (mId.equals(TranslationDetector.MISSING.getId())) {
-            return false;
-        } else {
-            return super.selectValue();
-        }
-    }
-
-    @Override
-    protected String getProposal(Element element) {
-        if (mId.equals(InefficientWeightDetector.BASELINE_WEIGHTS.getId())) {
-            return VALUE_FALSE;
-        } else if (mId.equals(TranslationDetector.MISSING.getId())) {
-            return VALUE_FALSE;
-        } else if (mId.equals(TextFieldDetector.ISSUE.getId())) {
-            return element.getAttributeNS(ANDROID_URI, ATTR_INPUT_TYPE);
-        } else if (mId.equals(MissingIdDetector.ISSUE.getId())) {
-            IEditorPart editor = AdtUtils.getActiveEditor();
-            if (editor instanceof AndroidXmlEditor) {
-                AndroidXmlEditor xmlEditor = (AndroidXmlEditor) editor;
-                return DescriptorsUtils.getFreeWidgetId(xmlEditor.getUiRootNode(),
-                        "fragment"); //$NON-NLS-1$
-            } else {
-                return NEW_ID_PREFIX;
-            }
-        }
-
-        return super.getProposal(element);
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/lint/SetPropertyFix.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/lint/SetPropertyFix.java
deleted file mode 100644
index a2b79c3..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/lint/SetPropertyFix.java
+++ /dev/null
@@ -1,140 +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.ide.eclipse.adt.internal.lint;
-
-import static com.android.SdkConstants.ANDROID_URI;
-
-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.utils.XmlUtils;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.jface.text.IDocument;
-import org.eclipse.jface.text.Region;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.ISharedImages;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
-import org.eclipse.wst.sse.core.internal.provisional.IndexedRegion;
-import org.w3c.dom.Attr;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-
-@SuppressWarnings("restriction") // DOM model
-abstract class SetPropertyFix extends DocumentFix {
-    private Region mSelect;
-
-    protected SetPropertyFix(String id, IMarker marker) {
-        super(id, marker);
-    }
-
-    /** Attribute to be added */
-    protected abstract String getAttribute();
-
-    /** Whether it's in the android: namespace */
-    protected abstract boolean isAndroidAttribute();
-
-    protected String getProposal(Element element) {
-        return invokeCodeCompletion() ? "" : "TODO"; //$NON-NLS-1$
-    }
-
-    protected boolean invokeCodeCompletion() {
-        return false;
-    }
-
-    @Override
-    public boolean isCancelable() {
-        return false;
-    }
-
-    @Override
-    protected void apply(IDocument document, IStructuredModel model, Node node, int start,
-            int end) {
-        mSelect = null;
-
-        if (node instanceof Element) {
-            Element element = (Element) node;
-            String proposal = getProposal(element);
-            String localAttribute = getAttribute();
-            String prefix = null;
-            if (isAndroidAttribute()) {
-                prefix = XmlUtils.lookupNamespacePrefix(node, ANDROID_URI);
-            }
-            String attribute = prefix != null ? prefix + ':' + localAttribute : localAttribute;
-
-            // This does not work even though it should: it does not include the prefix
-            //element.setAttributeNS(ANDROID_URI, localAttribute, proposal);
-            // So workaround instead:
-            element.setAttribute(attribute, proposal);
-
-            Attr attr = null;
-            if (isAndroidAttribute()) {
-                attr = element.getAttributeNodeNS(ANDROID_URI, localAttribute);
-            } else {
-                attr = element.getAttributeNode(localAttribute);
-            }
-            if (attr instanceof IndexedRegion) {
-                IndexedRegion region = (IndexedRegion) attr;
-                int offset = region.getStartOffset();
-                // We only want to select the value part inside the quotes,
-                // so skip the attribute and =" parts added by WST:
-                offset += attribute.length() + 2;
-                if (selectValue()) {
-                    mSelect = new Region(offset, proposal.length());
-                }
-            }
-        }
-    }
-
-    protected boolean selectValue() {
-        return true;
-    }
-
-    @Override
-    public void apply(IDocument document) {
-        try {
-            IFile file = (IFile) mMarker.getResource();
-            super.apply(document);
-            AdtPlugin.openFile(file, mSelect, true);
-        } catch (PartInitException e) {
-            AdtPlugin.log(e, null);
-        }
-
-        // Invoke code assist
-        if (invokeCodeCompletion()) {
-            IEditorPart editor = AdtUtils.getActiveEditor();
-            if (editor instanceof AndroidXmlEditor) {
-                ((AndroidXmlEditor) editor).invokeContentAssist(-1);
-            }
-        }
-    }
-
-    @Override
-    public boolean needsFocus() {
-        // Because we need to show the editor with text selected
-        return true;
-    }
-
-    @Override
-    public Image getImage() {
-        ISharedImages sharedImages = PlatformUI.getWorkbench().getSharedImages();
-        return sharedImages.getImage(ISharedImages.IMG_OBJ_ADD);
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/lint/SetScrollViewSizeFix.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/lint/SetScrollViewSizeFix.java
deleted file mode 100644
index 52860cf..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/lint/SetScrollViewSizeFix.java
+++ /dev/null
@@ -1,73 +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.ide.eclipse.adt.internal.lint;
-
-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.VALUE_WRAP_CONTENT;
-
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.jface.text.IDocument;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.ui.ISharedImages;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-
-@SuppressWarnings("restriction") // DOM model
-final class SetScrollViewSizeFix extends DocumentFix {
-    private SetScrollViewSizeFix(String id, IMarker marker) {
-        super(id, marker);
-    }
-
-    @Override
-    public boolean needsFocus() {
-        return false;
-    }
-
-    @Override
-    public boolean isCancelable() {
-        return false;
-    }
-
-    @Override
-    protected void apply(IDocument document, IStructuredModel model, Node node, int start,
-            int end) {
-        if (node instanceof Element && node.getParentNode() instanceof Element) {
-            Element element = (Element) node;
-            Element parent = (Element) node.getParentNode();
-
-            boolean isHorizontal = HORIZONTAL_SCROLL_VIEW.equals(parent.getTagName());
-            String attributeName = isHorizontal ? ATTR_LAYOUT_WIDTH : ATTR_LAYOUT_HEIGHT;
-            element.setAttributeNS(ANDROID_URI, attributeName, VALUE_WRAP_CONTENT);
-        }
-    }
-
-    @Override
-    public String getDisplayString() {
-        return "Replace size attribute with wrap_content";
-    }
-
-    @Override
-    public Image getImage() {
-        ISharedImages sharedImages = PlatformUI.getWorkbench().getSharedImages();
-        // TODO: Need a better icon here
-        return sharedImages.getImage(ISharedImages.IMG_OBJ_ELEMENT);
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/lint/TypoFix.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/lint/TypoFix.java
deleted file mode 100644
index 7cc05d2..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/lint/TypoFix.java
+++ /dev/null
@@ -1,123 +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.ide.eclipse.adt.internal.lint;
-
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.tools.lint.checks.TypoDetector;
-import com.android.tools.lint.detector.api.TextFormat;
-
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.jface.text.BadLocationException;
-import org.eclipse.jface.text.FindReplaceDocumentAdapter;
-import org.eclipse.jface.text.IDocument;
-import org.eclipse.jface.text.IRegion;
-import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
-import org.w3c.dom.Node;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/** Quickfix for fixing typos */
-@SuppressWarnings("restriction") // DOM model
-final class TypoFix extends DocumentFix {
-    private String mTypo;
-    private String mReplacement;
-
-    private TypoFix(String id, IMarker marker) {
-        super(id, marker);
-    }
-
-    @Override
-    public String getDisplayString() {
-        return String.format("Replace \"%1$s\" by \"%2$s\"", mTypo, mReplacement);
-    }
-
-    @Override
-    public boolean needsFocus() {
-        return false;
-    }
-
-    @Override
-    public boolean isCancelable() {
-        return false;
-    }
-
-    @Override
-    protected void apply(IDocument document, IStructuredModel model, Node node,
-            int start, int end) {
-        String message = mMarker.getAttribute(IMarker.MESSAGE, "");
-        String typo = TypoDetector.getTypo(message, TextFormat.TEXT);
-        if (typo == null) {
-            return;
-        }
-        List<String> replacements = TypoDetector.getSuggestions(message, TextFormat.TEXT);
-        if (replacements == null || replacements.isEmpty()) {
-            return;
-        }
-
-        try {
-            String current = document.get(start, end-start);
-            if (current.equals(typo)) {
-                document.replace(start, end - start, replacements.get(0));
-            } else {
-                // The buffer has been edited; try to find the typo.
-                FindReplaceDocumentAdapter finder = new FindReplaceDocumentAdapter(document);
-                IRegion forward = finder.find(start, typo, true /*forward*/, true, true, false);
-                IRegion backward = finder.find(start, typo, false /*forward*/, true, true, false);
-                if (forward != null && backward != null) {
-                    // Pick the closest one
-                    int forwardDelta = forward.getOffset() - start;
-                    int backwardDelta = start - backward.getOffset();
-                    if (forwardDelta < backwardDelta) {
-                        start = forward.getOffset();
-                    } else {
-                        start = backward.getOffset();
-                    }
-                } else if (forward != null) {
-                    start = forward.getOffset();
-                } else if (backward != null) {
-                    start = backward.getOffset();
-                } else {
-                    return;
-                }
-                end = start + typo.length();
-                document.replace(start, end - start, replacements.get(0));
-            }
-        } catch (BadLocationException e) {
-            AdtPlugin.log(e, null);
-        }
-    }
-
-    @Override
-    protected List<LintFix> getAllFixes() {
-        String message = mMarker.getAttribute(IMarker.MESSAGE, "");
-        String typo = TypoDetector.getTypo(message, TextFormat.TEXT);
-        List<String> replacements = TypoDetector.getSuggestions(message, TextFormat.TEXT);
-        if (replacements != null && !replacements.isEmpty() && typo != null) {
-            List<LintFix> allFixes = new ArrayList<LintFix>(replacements.size());
-            for (String replacement : replacements) {
-                TypoFix fix = new TypoFix(mId, mMarker);
-                fix.mTypo = typo;
-                fix.mReplacement = replacement;
-                allFixes.add(fix);
-            }
-
-            return allFixes;
-        }
-
-        return null;
-    }
-}
\ No newline at end of file
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/lint/TypographyFix.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/lint/TypographyFix.java
deleted file mode 100644
index 535e023..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/lint/TypographyFix.java
+++ /dev/null
@@ -1,94 +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.ide.eclipse.adt.internal.lint;
-
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.tools.lint.checks.TypographyDetector;
-
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.jface.text.BadLocationException;
-import org.eclipse.jface.text.IDocument;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.ui.ISharedImages;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
-import org.eclipse.wst.sse.core.internal.provisional.IndexedRegion;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-
-import java.util.List;
-
-@SuppressWarnings("restriction") // DOM model
-final class TypographyFix extends DocumentFix {
-    private TypographyFix(String id, IMarker marker) {
-        super(id, marker);
-    }
-
-    @Override
-    public boolean needsFocus() {
-        return false;
-    }
-
-    @Override
-    public boolean isCancelable() {
-        return false;
-    }
-
-    @Override
-    public boolean isBulkCapable() {
-        return false;
-    }
-
-    @Override
-    protected void apply(IDocument document, IStructuredModel model, Node node, int start,
-            int end) {
-        if (node instanceof Element) {
-            Element element = (Element) node;
-            // Find the text node which contains the character in question
-            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) {
-                    IndexedRegion region = (IndexedRegion) child;
-                    String message = mMarker.getAttribute(IMarker.MESSAGE, "");
-                    List<TypographyDetector.ReplaceEdit> edits =
-                            TypographyDetector.getEdits(mId, message, child);
-                    for (TypographyDetector.ReplaceEdit edit : edits) {
-                        try {
-                            document.replace(edit.offset + region.getStartOffset(),
-                                    edit.length, edit.replaceWith);
-                        } catch (BadLocationException e) {
-                            AdtPlugin.log(e, null);
-                        }
-                    }
-                }
-            }
-        }
-    }
-
-    @Override
-    public String getDisplayString() {
-        return "Replace with suggested characters";
-    }
-
-    @Override
-    public Image getImage() {
-        ISharedImages sharedImages = PlatformUI.getWorkbench().getSharedImages();
-        // TODO: Need a better icon here
-        return sharedImages.getImage(ISharedImages.IMG_OBJ_ELEMENT);
-    }
-}
\ No newline at end of file
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/lint/UseCompoundDrawableDetectorFix.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/lint/UseCompoundDrawableDetectorFix.java
deleted file mode 100644
index bf3cc9a..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/lint/UseCompoundDrawableDetectorFix.java
+++ /dev/null
@@ -1,95 +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.ide.eclipse.adt.internal.lint;
-
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.ide.eclipse.adt.AdtUtils;
-import com.android.ide.eclipse.adt.internal.editors.layout.LayoutEditorDelegate;
-import com.android.ide.eclipse.adt.internal.editors.layout.refactoring.UseCompoundDrawableRefactoring;
-import com.android.tools.lint.checks.UseCompoundDrawableDetector;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.jface.text.IDocument;
-import org.eclipse.jface.text.ITextSelection;
-import org.eclipse.jface.text.TextSelection;
-import org.eclipse.ltk.ui.refactoring.RefactoringWizard;
-import org.eclipse.ltk.ui.refactoring.RefactoringWizardOpenOperation;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
-import org.w3c.dom.Node;
-
-/** Quickfix for the {@link UseCompoundDrawableDetector} */
-@SuppressWarnings("restriction") // DOM model
-class UseCompoundDrawableDetectorFix extends DocumentFix {
-    protected UseCompoundDrawableDetectorFix(String id, IMarker marker) {
-        super(id, marker);
-    }
-
-    @Override
-    public String getDisplayString() {
-        return "Convert to a compound drawable";
-    }
-
-    @Override
-    public Image getImage() {
-        return AdtPlugin.getAndroidLogo();
-    }
-
-    @Override
-    public boolean needsFocus() {
-        return false;
-    }
-
-    @Override
-    public boolean isCancelable() {
-        return false;
-    }
-
-    @Override
-    public boolean isBulkCapable() {
-        return false;
-    }
-
-    @Override
-    protected void apply(IDocument document, IStructuredModel model, Node node,
-            int start, int end) {
-
-        // Invoke refactoring
-        LayoutEditorDelegate delegate =
-                LayoutEditorDelegate.fromEditor(AdtUtils.getActiveEditor());
-
-        if (delegate != null) {
-            IFile file = (IFile) mMarker.getResource();
-            ITextSelection textSelection = new TextSelection(start,
-                    end - start);
-            UseCompoundDrawableRefactoring refactoring =
-                    new UseCompoundDrawableRefactoring(file, delegate, textSelection, null);
-            RefactoringWizard wizard = refactoring.createWizard();
-            RefactoringWizardOpenOperation op =
-                    new RefactoringWizardOpenOperation(wizard);
-            try {
-                IWorkbenchWindow window = PlatformUI.getWorkbench().
-                        getActiveWorkbenchWindow();
-                op.run(window.getShell(), wizard.getDefaultPageTitle());
-            } catch (InterruptedException e) {
-            }
-        }
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/preferences/AdtPrefs.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/preferences/AdtPrefs.java
deleted file mode 100644
index aed4bd4..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/preferences/AdtPrefs.java
+++ /dev/null
@@ -1,647 +0,0 @@
-/*
- * Copyright (C) 2009 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.preferences;
-
-
-import com.android.annotations.NonNull;
-import com.android.ide.common.xml.XmlAttributeSortOrder;
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.ide.eclipse.adt.internal.editors.AndroidXmlEditor;
-import com.android.ide.eclipse.adt.internal.editors.layout.gle2.RenderPreviewMode;
-import com.android.prefs.AndroidLocation.AndroidLocationException;
-import com.android.sdklib.internal.build.DebugKeyProvider;
-import com.android.sdklib.internal.build.DebugKeyProvider.KeytoolException;
-import com.android.sdkstats.DdmsPreferenceStore;
-
-import org.eclipse.core.runtime.preferences.AbstractPreferenceInitializer;
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.jface.util.PropertyChangeEvent;
-
-import java.io.File;
-import java.util.Locale;
-
-public final class AdtPrefs extends AbstractPreferenceInitializer {
-    public final static String PREFS_SDK_DIR = AdtPlugin.PLUGIN_ID + ".sdk"; //$NON-NLS-1$
-
-    public final static String PREFS_BUILD_RES_AUTO_REFRESH = AdtPlugin.PLUGIN_ID + ".resAutoRefresh"; //$NON-NLS-1$
-
-    public final static String PREFS_BUILD_FORCE_ERROR_ON_NATIVELIB_IN_JAR = AdtPlugin.PLUGIN_ID + ".forceErrorNativeLibInJar"; //$NON-NLS-1$
-
-    public final static String PREFS_BUILD_SKIP_POST_COMPILE_ON_FILE_SAVE = AdtPlugin.PLUGIN_ID + ".skipPostCompileOnFileSave"; //$NON-NLS-1$
-
-    public final static String PREFS_BUILD_VERBOSITY = AdtPlugin.PLUGIN_ID + ".buildVerbosity"; //$NON-NLS-1$
-
-    public final static String PREFS_DEFAULT_DEBUG_KEYSTORE = AdtPlugin.PLUGIN_ID + ".defaultDebugKeyStore"; //$NON-NLS-1$
-
-    public final static String PREFS_CUSTOM_DEBUG_KEYSTORE = AdtPlugin.PLUGIN_ID + ".customDebugKeyStore"; //$NON-NLS-1$
-
-    public final static String PREFS_HOME_PACKAGE = AdtPlugin.PLUGIN_ID + ".homePackage"; //$NON-NLS-1$
-
-    public final static String PREFS_EMU_OPTIONS = AdtPlugin.PLUGIN_ID + ".emuOptions"; //$NON-NLS-1$
-
-    public final static String PREFS_MONITOR_DENSITY = AdtPlugin.PLUGIN_ID + ".monitorDensity"; //$NON-NLS-1$
-
-    public final static String PREFS_FORMAT_GUI_XML = AdtPlugin.PLUGIN_ID + ".formatXml"; //$NON-NLS-1$
-    public final static String PREFS_PREFER_XML = AdtPlugin.PLUGIN_ID + ".xmlEditor"; //$NON-NLS-1$
-    public final static String PREFS_USE_CUSTOM_XML_FORMATTER = AdtPlugin.PLUGIN_ID + ".androidForm"; //$NON-NLS-1$
-
-    public final static String PREFS_PALETTE_MODE = AdtPlugin.PLUGIN_ID + ".palette"; //$NON-NLS-1$
-
-    public final static String PREFS_USE_ECLIPSE_INDENT = AdtPlugin.PLUGIN_ID + ".eclipseIndent"; //$NON-NLS-1$
-    public final static String PREVS_REMOVE_EMPTY_LINES = AdtPlugin.PLUGIN_ID + ".removeEmpty"; //$NON-NLS-1$
-    public final static String PREFS_ONE_ATTR_PER_LINE = AdtPlugin.PLUGIN_ID + ".oneAttrPerLine"; //$NON-NLS-1$
-    public final static String PREFS_SPACE_BEFORE_CLOSE = AdtPlugin.PLUGIN_ID + ".spaceBeforeClose"; //$NON-NLS-1$
-    public final static String PREFS_FORMAT_ON_SAVE = AdtPlugin.PLUGIN_ID + ".formatOnSave"; //$NON-NLS-1$
-    public final static String PREFS_LINT_ON_SAVE = AdtPlugin.PLUGIN_ID + ".lintOnSave"; //$NON-NLS-1$
-    public final static String PREFS_LINT_ON_EXPORT = AdtPlugin.PLUGIN_ID + ".lintOnExport"; //$NON-NLS-1$
-    public final static String PREFS_ATTRIBUTE_SORT = AdtPlugin.PLUGIN_ID + ".attrSort"; //$NON-NLS-1$
-    public final static String PREFS_LINT_SEVERITIES = AdtPlugin.PLUGIN_ID + ".lintSeverities"; //$NON-NLS-1$
-    public final static String PREFS_FIX_LEGACY_EDITORS = AdtPlugin.PLUGIN_ID + ".fixLegacyEditors"; //$NON-NLS-1$
-    public final static String PREFS_SHARED_LAYOUT_EDITOR = AdtPlugin.PLUGIN_ID + ".sharedLayoutEditor"; //$NON-NLS-1$
-    public final static String PREFS_PREVIEWS = AdtPlugin.PLUGIN_ID + ".previews"; //$NON-NLS-1$
-    public final static String PREFS_SKIP_LINT_LIBS = AdtPlugin.PLUGIN_ID + ".skipLintLibs"; //$NON-NLS-1$
-    public final static String PREFS_AUTO_PICK_TARGET = AdtPlugin.PLUGIN_ID + ".autoPickTarget"; //$NON-NLS-1$
-    public final static String PREFS_REFACTOR_IDS = AdtPlugin.PLUGIN_ID + ".refactorIds"; //$NON-NLS-1$
-
-    /** singleton instance */
-    private final static AdtPrefs sThis = new AdtPrefs();
-
-    /** default store, provided by eclipse */
-    private IPreferenceStore mStore;
-
-    /** cached location for the sdk folder */
-    private String mOsSdkLocation;
-
-    /** Verbosity of the build */
-    private BuildVerbosity mBuildVerbosity = BuildVerbosity.NORMAL;
-
-    private boolean mBuildForceResResfresh = false;
-    private boolean mBuildForceErrorOnNativeLibInJar = true;
-    private boolean mBuildSkipPostCompileOnFileSave = true;
-    private float mMonitorDensity = 0.f;
-    private String mPalette;
-
-    private boolean mFormatGuiXml;
-    private boolean mCustomXmlFormatter;
-    private boolean mUseEclipseIndent;
-    private boolean mRemoveEmptyLines;
-    private boolean mOneAttributeOnFirstLine;
-    private boolean mSpaceBeforeClose;
-    private boolean mFormatOnSave;
-    private boolean mLintOnSave;
-    private boolean mLintOnExport;
-    private XmlAttributeSortOrder mAttributeSort;
-    private boolean mSharedLayoutEditor;
-    private boolean mAutoPickTarget;
-    private RenderPreviewMode mPreviewMode = RenderPreviewMode.NONE;
-    private int mPreferXmlEditor;
-    private boolean mSkipLibrariesFromLint;
-
-    public static enum BuildVerbosity {
-        /** Build verbosity "Always". Those messages are always displayed, even in silent mode */
-        ALWAYS(0),
-        /** Build verbosity level "Normal" */
-        NORMAL(1),
-        /** Build verbosity level "Verbose". Those messages are only displayed in verbose mode */
-        VERBOSE(2);
-
-        private int mLevel;
-
-        BuildVerbosity(int level) {
-            mLevel = level;
-        }
-
-        public int getLevel() {
-            return mLevel;
-        }
-
-        /**
-         * Finds and returns a {@link BuildVerbosity} whose {@link #name()} matches a given name.
-         * <p/>This is different from {@link Enum#valueOf(Class, String)} in that it returns null
-         * if no matches are found.
-         *
-         * @param name the name to look up.
-         * @return returns the matching enum or null of no match where found.
-         */
-        public static BuildVerbosity find(String name) {
-            for (BuildVerbosity v : values()) {
-                if (v.name().equals(name)) {
-                    return v;
-                }
-            }
-
-            return null;
-        }
-    }
-
-    public static void init(IPreferenceStore preferenceStore) {
-        sThis.mStore = preferenceStore;
-    }
-
-    public static AdtPrefs getPrefs() {
-        return sThis;
-    }
-
-    public synchronized void loadValues(PropertyChangeEvent event) {
-        // get the name of the property that changed, if any
-        String property = event != null ? event.getProperty() : null;
-
-        if (property == null || PREFS_SDK_DIR.equals(property)) {
-            mOsSdkLocation = mStore.getString(PREFS_SDK_DIR);
-
-            // Make it possible to override the SDK path using an environment variable.
-            // The value will only be used if it matches an existing directory.
-            // Useful for testing from Eclipse.
-            // Note: this is a hack that does not change the preferences, so if the user
-            // looks at Window > Preferences > Android, the path will be the preferences
-            // one and not the overridden one.
-            String override = System.getenv("ADT_TEST_SDK_PATH");   //$NON-NLS-1$
-            if (override != null && override.length() > 0 && new File(override).isDirectory()) {
-                mOsSdkLocation = override;
-            }
-
-            // make sure it ends with a separator. Normally this is done when the preference
-            // is set. But to make sure older version still work, we fix it here as well.
-            if (mOsSdkLocation.length() > 0 && mOsSdkLocation.endsWith(File.separator) == false) {
-                mOsSdkLocation = mOsSdkLocation + File.separator;
-            }
-        }
-
-        if (property == null || PREFS_BUILD_VERBOSITY.equals(property)) {
-            mBuildVerbosity = BuildVerbosity.find(mStore.getString(PREFS_BUILD_VERBOSITY));
-            if (mBuildVerbosity == null) {
-                mBuildVerbosity = BuildVerbosity.NORMAL;
-            }
-        }
-
-        if (property == null || PREFS_BUILD_RES_AUTO_REFRESH.equals(property)) {
-            mBuildForceResResfresh = mStore.getBoolean(PREFS_BUILD_RES_AUTO_REFRESH);
-        }
-
-        if (property == null || PREFS_BUILD_FORCE_ERROR_ON_NATIVELIB_IN_JAR.equals(property)) {
-            mBuildForceErrorOnNativeLibInJar =
-                    mStore.getBoolean(PREFS_BUILD_FORCE_ERROR_ON_NATIVELIB_IN_JAR);
-        }
-
-        if (property == null || PREFS_BUILD_SKIP_POST_COMPILE_ON_FILE_SAVE.equals(property)) {
-            mBuildSkipPostCompileOnFileSave =
-                mStore.getBoolean(PREFS_BUILD_SKIP_POST_COMPILE_ON_FILE_SAVE);
-        }
-
-        if (property == null || PREFS_MONITOR_DENSITY.equals(property)) {
-            mMonitorDensity = mStore.getFloat(PREFS_MONITOR_DENSITY);
-        }
-
-        if (property == null || PREFS_FORMAT_GUI_XML.equals(property)) {
-            mFormatGuiXml = mStore.getBoolean(PREFS_FORMAT_GUI_XML);
-        }
-
-        if (property == null || PREFS_PREFER_XML.equals(property)) {
-            mPreferXmlEditor = mStore.getInt(PREFS_PREFER_XML);
-        }
-
-        if (property == null || PREFS_USE_CUSTOM_XML_FORMATTER.equals(property)) {
-            mCustomXmlFormatter = mStore.getBoolean(PREFS_USE_CUSTOM_XML_FORMATTER);
-        }
-
-        if (property == null || PREFS_PALETTE_MODE.equals(property)) {
-            mPalette = mStore.getString(PREFS_PALETTE_MODE);
-        }
-
-        if (property == null || PREFS_USE_ECLIPSE_INDENT.equals(property)) {
-            mUseEclipseIndent = mStore.getBoolean(PREFS_USE_ECLIPSE_INDENT);
-        }
-
-        if (property == null || PREVS_REMOVE_EMPTY_LINES.equals(property)) {
-            mRemoveEmptyLines = mStore.getBoolean(PREVS_REMOVE_EMPTY_LINES);
-        }
-
-        if (property == null || PREFS_ONE_ATTR_PER_LINE.equals(property)) {
-            mOneAttributeOnFirstLine = mStore.getBoolean(PREFS_ONE_ATTR_PER_LINE);
-        }
-
-        if (property == null || PREFS_ATTRIBUTE_SORT.equals(property)) {
-            String order = mStore.getString(PREFS_ATTRIBUTE_SORT);
-            mAttributeSort = XmlAttributeSortOrder.LOGICAL;
-            if (XmlAttributeSortOrder.ALPHABETICAL.key.equals(order)) {
-                mAttributeSort = XmlAttributeSortOrder.ALPHABETICAL;
-            } else if (XmlAttributeSortOrder.NO_SORTING.key.equals(order)) {
-                mAttributeSort = XmlAttributeSortOrder.NO_SORTING;
-            }
-        }
-
-        if (property == null || PREFS_SPACE_BEFORE_CLOSE.equals(property)) {
-            mSpaceBeforeClose = mStore.getBoolean(PREFS_SPACE_BEFORE_CLOSE);
-        }
-
-        if (property == null || PREFS_FORMAT_ON_SAVE.equals(property)) {
-            mFormatOnSave = mStore.getBoolean(PREFS_FORMAT_ON_SAVE);
-        }
-
-        if (property == null || PREFS_LINT_ON_SAVE.equals(property)) {
-            mLintOnSave = mStore.getBoolean(PREFS_LINT_ON_SAVE);
-        }
-
-        if (property == null || PREFS_LINT_ON_EXPORT.equals(property)) {
-            mLintOnExport = mStore.getBoolean(PREFS_LINT_ON_EXPORT);
-        }
-
-        if (property == null || PREFS_SHARED_LAYOUT_EDITOR.equals(property)) {
-            mSharedLayoutEditor = mStore.getBoolean(PREFS_SHARED_LAYOUT_EDITOR);
-        }
-
-        if (property == null || PREFS_AUTO_PICK_TARGET.equals(property)) {
-            mAutoPickTarget = mStore.getBoolean(PREFS_AUTO_PICK_TARGET);
-        }
-
-        if (property == null || PREFS_PREVIEWS.equals(property)) {
-            mPreviewMode = RenderPreviewMode.NONE;
-            String previewMode = mStore.getString(PREFS_PREVIEWS);
-            if (previewMode != null && !previewMode.isEmpty()) {
-                try {
-                    mPreviewMode = RenderPreviewMode.valueOf(previewMode.toUpperCase(Locale.US));
-                } catch (IllegalArgumentException iae) {
-                    // Ignore: Leave it as RenderPreviewMode.NONE
-                }
-            }
-        }
-
-        if (property == null || PREFS_SKIP_LINT_LIBS.equals(property)) {
-            mSkipLibrariesFromLint = mStore.getBoolean(PREFS_SKIP_LINT_LIBS);
-        }
-    }
-
-    /**
-     * Returns the SDK folder.
-     * Guaranteed to be terminated by a platform-specific path separator.
-     */
-    public synchronized String getOsSdkFolder() {
-        return mOsSdkLocation;
-    }
-
-    public synchronized BuildVerbosity getBuildVerbosity() {
-        return mBuildVerbosity;
-    }
-
-    public boolean getBuildForceResResfresh() {
-        return mBuildForceResResfresh;
-    }
-
-    /**
-     * Should changes made by GUI editors automatically format the corresponding XML nodes
-     * affected by the edit?
-     *
-     * @return true if the GUI editors should format affected XML regions
-     */
-    public boolean getFormatGuiXml() {
-        // The format-GUI-editors flag only applies when the custom formatter is used,
-        // since the built-in formatter has problems editing partial documents
-        return mFormatGuiXml && mCustomXmlFormatter;
-    }
-
-    /**
-     * Should the XML formatter use a custom Android XML formatter (following
-     * Android code style) or use the builtin Eclipse XML formatter?
-     *
-     * @return true if the Android formatter should be used instead of the
-     *         default Eclipse one
-     */
-    public boolean getUseCustomXmlFormatter() {
-        return mCustomXmlFormatter;
-    }
-
-    /**
-     * Should the Android XML formatter use the Eclipse XML indentation settings
-     * (usually one tab character) instead of the default 4 space character
-     * indent?
-     *
-     * @return true if the Eclipse XML indentation settings should be use
-     */
-    public boolean isUseEclipseIndent() {
-        return mUseEclipseIndent;
-    }
-
-    /**
-     * Should the Android XML formatter try to avoid inserting blank lines to
-     * make the format as compact as possible (no blank lines between elements,
-     * no blank lines surrounding comments, etc).
-     *
-     * @return true to remove blank lines
-     */
-    public boolean isRemoveEmptyLines() {
-        return mRemoveEmptyLines;
-    }
-
-    /**
-     * Should the Android XML formatter attempt to place a single attribute on
-     * the same line as the element open tag?
-     *
-     * @return true if single-attribute elements should place the attribute on
-     *         the same line as the element open tag
-     */
-    public boolean isOneAttributeOnFirstLine() {
-        return mOneAttributeOnFirstLine;
-    }
-
-    /**
-     * Returns the sort order to be applied to the attributes (one of which can
-     * be {@link com.android.ide.common.xml.XmlAttributeSortOrder#NO_SORTING}).
-     *
-     * @return the sort order to apply to the attributes
-     */
-    public XmlAttributeSortOrder getAttributeSort() {
-        if (mAttributeSort == null) {
-            return XmlAttributeSortOrder.LOGICAL;
-        }
-        return mAttributeSort;
-    }
-
-    /**
-     * Returns whether a space should be inserted before the closing {@code >}
-     * character in open tags and before the closing {@code />} characters in
-     * empty tag. Note that the {@link com.android.ide.common.xml.XmlFormatStyle#RESOURCE} style overrides
-     * this setting to make it more compact for the {@code <item>} elements.
-     *
-     * @return true if an empty space should be inserted before {@code >} or
-     *         {@code />}.
-     */
-    public boolean isSpaceBeforeClose() {
-        return mSpaceBeforeClose;
-    }
-
-    /**
-     * Returns whether the file should be automatically formatted on save.
-     *
-     * @return true if the XML files should be formatted on save.
-     */
-    public boolean isFormatOnSave() {
-        return mFormatOnSave;
-    }
-
-    public boolean isLintOnSave() {
-        return mLintOnSave;
-    }
-
-    public void setLintOnSave(boolean on) {
-        mLintOnSave = on;
-        IPreferenceStore store = AdtPlugin.getDefault().getPreferenceStore();
-        store.setValue(PREFS_LINT_ON_SAVE, on);
-    }
-
-    public boolean isLintOnExport() {
-        return mLintOnExport;
-    }
-
-    public void setLintOnExport(boolean on) {
-        mLintOnExport = on;
-        IPreferenceStore store = AdtPlugin.getDefault().getPreferenceStore();
-        store.setValue(PREFS_LINT_ON_EXPORT, on);
-    }
-
-    /**
-     * Returns whether the layout editor is sharing a single editor for all variations
-     * of a single resource. The default is false.
-     *
-     * @return true if the editor should be shared
-     */
-    public boolean isSharedLayoutEditor() {
-        return mSharedLayoutEditor;
-    }
-
-    /**
-     * Sets whether the layout editor should share a single editor for all variations
-     * of a single resource
-     *
-     * @param on if true, use a single editor
-     */
-    public void setSharedLayoutEditor(boolean on) {
-        mSharedLayoutEditor = on;
-        IPreferenceStore store = AdtPlugin.getDefault().getPreferenceStore();
-        store.setValue(PREFS_SHARED_LAYOUT_EDITOR, on);
-
-        // TODO: If enabling a shared editor, go and close all editors that are aliasing
-        // the same resource except for one of them.
-    }
-
-
-    public boolean getBuildForceErrorOnNativeLibInJar() {
-        return mBuildForceErrorOnNativeLibInJar;
-    }
-
-    public boolean getBuildSkipPostCompileOnFileSave() {
-        return mBuildSkipPostCompileOnFileSave;
-    }
-
-    public String getPaletteModes() {
-        return mPalette;
-    }
-
-    public void setPaletteModes(String palette) {
-        mPalette = palette;
-
-        // need to save this new value to the store
-        IPreferenceStore store = AdtPlugin.getDefault().getPreferenceStore();
-        store.setValue(PREFS_PALETTE_MODE, palette);
-    }
-
-    public float getMonitorDensity() {
-        return mMonitorDensity;
-    }
-
-    public void setMonitorDensity(float density) {
-        mMonitorDensity = density;
-
-        // need to save this new value to the store
-        IPreferenceStore store = AdtPlugin.getDefault().getPreferenceStore();
-        store.setValue(PREFS_MONITOR_DENSITY, density);
-    }
-
-    /**
-     * Sets the new location of the SDK
-     *
-     * @param location the location of the SDK
-     */
-    public void setSdkLocation(File location) {
-        mOsSdkLocation = location != null ? location.getPath() : null;
-
-        // TODO: Also store this location in the .android settings directory
-        // such that we can support using multiple workspaces without asking
-        // over and over.
-        if (mOsSdkLocation != null && mOsSdkLocation.length() > 0) {
-            DdmsPreferenceStore ddmsStore = new DdmsPreferenceStore();
-            ddmsStore.setLastSdkPath(mOsSdkLocation);
-        }
-
-        // need to save this new value to the store
-        IPreferenceStore store = AdtPlugin.getDefault().getPreferenceStore();
-        store.setValue(PREFS_SDK_DIR, mOsSdkLocation);
-    }
-
-    @Override
-    public void initializeDefaultPreferences() {
-        IPreferenceStore store = AdtPlugin.getDefault().getPreferenceStore();
-        initializeStoreWithDefaults(store);
-    }
-
-    public void initializeStoreWithDefaults(IPreferenceStore store) {
-        store.setDefault(PREFS_BUILD_RES_AUTO_REFRESH, true);
-        store.setDefault(PREFS_BUILD_FORCE_ERROR_ON_NATIVELIB_IN_JAR, true);
-        store.setDefault(PREFS_BUILD_SKIP_POST_COMPILE_ON_FILE_SAVE, true);
-
-        store.setDefault(PREFS_BUILD_VERBOSITY, BuildVerbosity.ALWAYS.name());
-
-        store.setDefault(PREFS_HOME_PACKAGE, "android.process.acore"); //$NON-NLS-1$
-
-        store.setDefault(PREFS_MONITOR_DENSITY, 0.f);
-
-        store.setDefault(PREFS_FORMAT_GUI_XML, true);
-        store.setDefault(PREFS_USE_CUSTOM_XML_FORMATTER, true);
-        store.setDefault(PREFS_ONE_ATTR_PER_LINE, true);
-        store.setDefault(PREFS_SPACE_BEFORE_CLOSE, true);
-        store.setDefault(PREFS_LINT_ON_SAVE, true);
-        store.setDefault(PREFS_LINT_ON_EXPORT, true);
-        store.setDefault(PREFS_AUTO_PICK_TARGET, true);
-
-        // Defaults already handled; no need to write into map:
-        //store.setDefault(PREFS_ATTRIBUTE_SORT, XmlAttributeSortOrder.LOGICAL.key);
-        //store.setDefault(PREFS_USE_ECLIPSE_INDENT, false);
-        //store.setDefault(PREVS_REMOVE_EMPTY_LINES, false);
-        //store.setDefault(PREFS_FORMAT_ON_SAVE, false);
-        //store.setDefault(PREFS_SHARED_LAYOUT_EDITOR, false);
-        //store.setDefault(PREFS_SKIP_LINT_LIBS, false);
-
-        try {
-            store.setDefault(PREFS_DEFAULT_DEBUG_KEYSTORE,
-                    DebugKeyProvider.getDefaultKeyStoreOsPath());
-        } catch (KeytoolException e) {
-            AdtPlugin.log(e, "Get default debug keystore path failed"); //$NON-NLS-1$
-        } catch (AndroidLocationException e) {
-            AdtPlugin.log(e, "Get default debug keystore path failed"); //$NON-NLS-1$
-        }
-    }
-
-    /**
-     * Returns whether the most recent page switch was to XML
-     *
-     * @param editorType the editor to check a preference for; corresponds to
-     *            one of the persistence class ids returned by
-     *            {@link AndroidXmlEditor#getPersistenceCategory}
-     * @return whether the most recent page switch in the given editor was to
-     *         XML
-     */
-    public boolean isXmlEditorPreferred(int editorType) {
-        return (mPreferXmlEditor & editorType) != 0;
-    }
-
-    /**
-     * Set whether the most recent page switch for a given editor type was to
-     * XML
-     *
-     * @param editorType the editor to check a preference for; corresponds to
-     *            one of the persistence class ids returned by
-     *            {@link AndroidXmlEditor#getPersistenceCategory}
-     * @param xml whether the last manual page switch in the given editor type
-     *            was to XML
-     */
-    public void setXmlEditorPreferred(int editorType, boolean xml) {
-        if (xml != isXmlEditorPreferred(editorType)) {
-            if (xml) {
-                mPreferXmlEditor |= editorType;
-            } else {
-                mPreferXmlEditor &= ~editorType;
-            }
-            assert ((mPreferXmlEditor & editorType) != 0) == xml;
-            IPreferenceStore store = AdtPlugin.getDefault().getPreferenceStore();
-            store.setValue(PREFS_PREFER_XML, xml);
-        }
-    }
-
-    /**
-     * Gets the {@link RenderPreviewMode}
-     *
-     * @return the preview mode
-     */
-    @NonNull
-    public RenderPreviewMode getRenderPreviewMode() {
-        return mPreviewMode;
-    }
-
-    /**
-     * Sets the {@link RenderPreviewMode}
-     *
-     * @param previewMode the preview mode
-     */
-    public void setPreviewMode(@NonNull RenderPreviewMode previewMode) {
-        mPreviewMode = previewMode;
-        IPreferenceStore store = AdtPlugin.getDefault().getPreferenceStore();
-        if (previewMode != RenderPreviewMode.NONE) {
-            store.setValue(PREFS_PREVIEWS, previewMode.name().toLowerCase(Locale.US));
-        } else {
-            store.setToDefault(PREFS_PREVIEWS);
-        }
-    }
-
-    /**
-     * Sets whether auto-pick render target mode is enabled.
-     *
-     * @return whether the layout editor should automatically pick the best render target
-     */
-    public boolean isAutoPickRenderTarget() {
-        return mAutoPickTarget;
-    }
-
-    /**
-     * Sets whether auto-pick render target mode is enabled.
-     *
-     * @param autoPick if true, auto pick the best render target in the layout editor
-     */
-    public void setAutoPickRenderTarget(boolean autoPick) {
-        mAutoPickTarget = autoPick;
-        IPreferenceStore store = AdtPlugin.getDefault().getPreferenceStore();
-        if (autoPick) {
-            store.setToDefault(PREFS_AUTO_PICK_TARGET);
-        } else {
-            store.setValue(PREFS_AUTO_PICK_TARGET, autoPick);
-        }
-    }
-
-    /**
-     * Sets whether libraries should be excluded when running lint on a project
-     *
-     * @param exclude if true, exclude library projects
-     */
-    public void setSkipLibrariesFromLint(boolean exclude) {
-        if (exclude != mSkipLibrariesFromLint) {
-            mSkipLibrariesFromLint = exclude;
-            IPreferenceStore store = AdtPlugin.getDefault().getPreferenceStore();
-            if (exclude) {
-                store.setValue(PREFS_SKIP_LINT_LIBS, true);
-            } else {
-                store.setToDefault(PREFS_SKIP_LINT_LIBS);
-            }
-        }
-    }
-
-    /**
-     * Returns whether libraries should be excluded when running lint on a project
-     *
-     * @return if true, exclude library projects
-     */
-    public boolean getSkipLibrariesFromLint() {
-        return mSkipLibrariesFromLint;
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/preferences/AndroidPreferencePage.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/preferences/AndroidPreferencePage.java
deleted file mode 100644
index 4fbc013..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/preferences/AndroidPreferencePage.java
+++ /dev/null
@@ -1,266 +0,0 @@
-/*
- * Copyright (C) 2007 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.preferences;
-
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.ide.eclipse.adt.AdtPlugin.CheckSdkErrorHandler;
-import com.android.ide.eclipse.adt.internal.sdk.Sdk;
-import com.android.ide.eclipse.adt.internal.sdk.Sdk.ITargetChangeListener;
-import com.android.sdklib.IAndroidTarget;
-import com.android.sdkstats.DdmsPreferenceStore;
-import com.android.sdkstats.SdkStatsService;
-import com.android.sdkuilib.internal.widgets.SdkTargetSelector;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.jface.preference.DirectoryFieldEditor;
-import org.eclipse.jface.preference.FieldEditorPreferencePage;
-import org.eclipse.jface.resource.JFaceResources;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchPreferencePage;
-
-import java.io.File;
-
-/**
- * This class represents a preference page that is contributed to the
- * Preferences dialog. By subclassing <samp>FieldEditorPreferencePage</samp>,
- * we can use the field support built into JFace that allows us to create a page
- * that is small and knows how to save, restore and apply itself.
- * <p>
- * This page is used to modify preferences only. They are stored in the
- * preference store that belongs to the main plug-in class. That way,
- * preferences can be accessed directly via the preference store.
- */
-
-public class AndroidPreferencePage extends FieldEditorPreferencePage implements
-        IWorkbenchPreferencePage {
-
-    private SdkDirectoryFieldEditor mDirectoryField;
-
-    public AndroidPreferencePage() {
-        super(GRID);
-        setPreferenceStore(AdtPlugin.getDefault().getPreferenceStore());
-        setDescription(Messages.AndroidPreferencePage_Title);
-    }
-
-    /**
-     * Creates the field editors. Field editors are abstractions of the common
-     * GUI blocks needed to manipulate various types of preferences. Each field
-     * editor knows how to save and restore itself.
-     */
-    @Override
-    public void createFieldEditors() {
-
-        mDirectoryField = new SdkDirectoryFieldEditor(AdtPrefs.PREFS_SDK_DIR,
-                Messages.AndroidPreferencePage_SDK_Location_, getFieldEditorParent());
-
-        addField(mDirectoryField);
-    }
-
-    /*
-     * (non-Javadoc)
-     *
-     * @see org.eclipse.ui.IWorkbenchPreferencePage#init(org.eclipse.ui.IWorkbench)
-     */
-    @Override
-    public void init(IWorkbench workbench) {
-    }
-
-    @Override
-    public void dispose() {
-        super.dispose();
-
-        if (mDirectoryField != null) {
-            mDirectoryField.dispose();
-            mDirectoryField = null;
-        }
-    }
-
-    /**
-     * Custom version of DirectoryFieldEditor which validates that the directory really
-     * contains an SDK.
-     *
-     * There's a known issue here, which is really a rare edge-case: if the pref dialog is open
-     * which a given sdk directory and the *content* of the directory changes such that the sdk
-     * state changed (i.e. from valid to invalid or vice versa), the pref panel will display or
-     * hide the error as appropriate but the pref panel will fail to validate the apply/ok buttons
-     * appropriately. The easy workaround is to cancel the pref panel and enter it again.
-     */
-    private static class SdkDirectoryFieldEditor extends DirectoryFieldEditor {
-
-        private SdkTargetSelector mTargetSelector;
-        private TargetChangedListener mTargetChangeListener;
-
-        public SdkDirectoryFieldEditor(String name, String labelText, Composite parent) {
-            super(name, labelText, parent);
-            setEmptyStringAllowed(false);
-        }
-
-        /**
-         * Method declared on StringFieldEditor and overridden in DirectoryFieldEditor.
-         * Checks whether the text input field contains a valid directory.
-         *
-         * @return True if the apply/ok button should be enabled in the pref panel
-         */
-        @Override
-        protected boolean doCheckState() {
-            String fileName = getTextControl().getText();
-            fileName = fileName.trim();
-
-            if (fileName.indexOf(',') >= 0 || fileName.indexOf(';') >= 0) {
-                setErrorMessage(Messages.AndroidPreferencePage_ERROR_Reserved_Char);
-                return false;  // Apply/OK must be disabled
-            }
-
-            File file = new File(fileName);
-            if (!file.isDirectory()) {
-                setErrorMessage(JFaceResources.getString(
-                    "DirectoryFieldEditor.errorMessage")); //$NON-NLS-1$
-                return false;
-            }
-
-            boolean ok = AdtPlugin.getDefault().checkSdkLocationAndId(fileName,
-                    new AdtPlugin.CheckSdkErrorHandler() {
-                @Override
-                public boolean handleError(
-                        CheckSdkErrorHandler.Solution solution,
-                        String message) {
-                    setErrorMessage(message.replaceAll("\n", " ")); //$NON-NLS-1$ //$NON-NLS-2$
-                    return false;  // Apply/OK must be disabled
-                }
-
-                @Override
-                public boolean handleWarning(
-                        CheckSdkErrorHandler.Solution solution,
-                        String message) {
-                    showMessage(message.replaceAll("\n", " ")); //$NON-NLS-1$ //$NON-NLS-2$
-                    return true;  // Apply/OK must be enabled
-                }
-            });
-            if (ok) clearMessage();
-            return ok;
-        }
-
-        @Override
-        protected void doStore() {
-            super.doStore();
-
-            // Also sync the value to the ~/.android preference settings such that we can
-            // share it with future new workspaces
-            String path = AdtPrefs.getPrefs().getOsSdkFolder();
-            if (path != null && path.length() > 0 && new File(path).exists()) {
-                DdmsPreferenceStore ddmsStore = new DdmsPreferenceStore();
-                ddmsStore.setLastSdkPath(path);
-            }
-        }
-
-        @Override
-        public Text getTextControl(Composite parent) {
-            setValidateStrategy(VALIDATE_ON_KEY_STROKE);
-            return super.getTextControl(parent);
-        }
-
-        /* (non-Javadoc)
-         * Method declared on StringFieldEditor (and FieldEditor).
-         */
-        @Override
-        protected void doFillIntoGrid(Composite parent, int numColumns) {
-            super.doFillIntoGrid(parent, numColumns);
-
-            GridData gd;
-            Label l = new Label(parent, SWT.NONE);
-            l.setText("Note: The list of SDK Targets below is only reloaded once you hit 'Apply' or 'OK'.");
-            gd = new GridData(GridData.FILL_HORIZONTAL);
-            gd.horizontalSpan = numColumns;
-            l.setLayoutData(gd);
-
-            try {
-                // We may not have an sdk if the sdk path pref is empty or not valid.
-                Sdk sdk = Sdk.getCurrent();
-                IAndroidTarget[] targets = sdk != null ? sdk.getTargets() : null;
-
-                mTargetSelector = new SdkTargetSelector(parent,
-                        targets,
-                        false /*allowSelection*/);
-                gd = (GridData) mTargetSelector.getLayoutData();
-                gd.horizontalSpan = numColumns;
-
-                if (mTargetChangeListener == null) {
-                    mTargetChangeListener = new TargetChangedListener();
-                    AdtPlugin.getDefault().addTargetListener(mTargetChangeListener);
-
-                    // Trigger a check to see if the SDK needs to be reloaded (which will
-                    // invoke onSdkLoaded asynchronously as needed).
-                    AdtPlugin.getDefault().refreshSdk();
-                }
-            } catch (Exception e) {
-                // We need to catch *any* exception that arises here, otherwise it disables
-                // the whole pref panel. We can live without the Sdk target selector but
-                // not being able to actually set an sdk path.
-                AdtPlugin.log(e, "SdkTargetSelector failed");
-            }
-        }
-
-        @Override
-        public void dispose() {
-            super.dispose();
-            if (mTargetChangeListener != null) {
-                AdtPlugin.getDefault().removeTargetListener(mTargetChangeListener);
-                mTargetChangeListener = null;
-            }
-        }
-
-        private class TargetChangedListener implements ITargetChangeListener {
-            @Override
-            public void onSdkLoaded() {
-                if (mTargetSelector != null) {
-                    // We may not have an sdk if the sdk path pref is empty or not valid.
-                    Sdk sdk = Sdk.getCurrent();
-                    IAndroidTarget[] targets = sdk != null ? sdk.getTargets() : null;
-
-                    mTargetSelector.setTargets(targets);
-                }
-            }
-
-            @Override
-            public void onProjectTargetChange(IProject changedProject) {
-                // do nothing.
-            }
-
-            @Override
-            public void onTargetLoaded(IAndroidTarget target) {
-                // do nothing.
-            }
-        }
-    }
-
-    @Override
-    public void setVisible(boolean visible) {
-        super.setVisible(visible);
-
-        /* When the ADT preferences page is made visible, display the dialog to obtain
-         * permissions for the ping service. */
-        SdkStatsService stats = new SdkStatsService();
-        Shell parent = getShell();
-        stats.checkUserPermissionForPing(parent);
-    }
-}
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
deleted file mode 100644
index f5f4633..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/preferences/BuildPreferencePage.java
+++ /dev/null
@@ -1,386 +0,0 @@
-/*
- * Copyright (C) 2007 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.preferences;
-
-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;
-
-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;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchPreferencePage;
-
-import java.io.File;
-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;
-
-/**
- * Preference page for build options.
- *
- */
-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);
-        mPrefStore = AdtPlugin.getDefault().getPreferenceStore();
-        setPreferenceStore(mPrefStore);
-        setDescription(Messages.BuildPreferencePage_Title);
-    }
-
-    @Override
-    protected void createFieldEditors() {
-        addField(new BooleanFieldEditor(AdtPrefs.PREFS_BUILD_RES_AUTO_REFRESH,
-                Messages.BuildPreferencePage_Auto_Refresh_Resources_on_Build,
-                getFieldEditorParent()));
-
-        addField(new BooleanFieldEditor(AdtPrefs.PREFS_BUILD_FORCE_ERROR_ON_NATIVELIB_IN_JAR,
-                "Force error when external jars contain native libraries",
-                getFieldEditorParent()));
-
-        addField(new BooleanFieldEditor(AdtPrefs.PREFS_BUILD_SKIP_POST_COMPILE_ON_FILE_SAVE,
-                "Skip packaging and dexing until export or launch. (Speeds up automatic builds on file save)",
-                getFieldEditorParent()));
-
-        RadioGroupFieldEditor rgfe = new RadioGroupFieldEditor(
-                AdtPrefs.PREFS_BUILD_VERBOSITY,
-                Messages.BuildPreferencePage_Build_Output, 1, new String[][] {
-                    { Messages.BuildPreferencePage_Silent, BuildVerbosity.ALWAYS.name() },
-                    { Messages.BuildPreferencePage_Normal, BuildVerbosity.NORMAL.name() },
-                    { Messages.BuildPreferencePage_Verbose, BuildVerbosity.VERBOSE.name() }
-                    },
-                getFieldEditorParent(), true);
-        addField(rgfe);
-
-        // default debug keystore fingerprints
-        Fingerprints defaultFingerprints = getFingerprints(
-                mPrefStore.getString(AdtPrefs.PREFS_DEFAULT_DEBUG_KEYSTORE));
-
-        // 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;
-    }
-
-    /*
-     * (non-Javadoc)
-     *
-     * @see org.eclipse.ui.IWorkbenchPreferencePage#init(org.eclipse.ui.IWorkbench)
-     */
-    @Override
-    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.
-     */
-    private static class ReadOnlyFieldEditor extends StringFieldEditor {
-
-        public ReadOnlyFieldEditor(String name, String labelText, Composite parent) {
-            super(name, labelText, parent);
-        }
-
-        @Override
-        protected void createControl(Composite parent) {
-            super.createControl(parent);
-
-            Text control = getTextControl();
-            control.setEditable(false);
-        }
-    }
-
-    /**
-     * 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);
-        }
-
-        @Override
-        protected boolean checkState() {
-            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);
-                if (file.isFile()) {
-                    // attempt to load the debug key.
-                    try {
-                        DebugKeyProvider provider = new DebugKeyProvider(fileName,
-                                null /* storeType */, null /* key gen output */);
-                        PrivateKey key = provider.getDebugKey();
-                        X509Certificate certificate = (X509Certificate)provider.getCertificate();
-
-                        if (key == null || certificate == null) {
-                            showErrorMessage("Unable to find debug key in keystore!");
-                            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!");
-                            return false;
-                        }
-
-                        if (certificate.getNotBefore().compareTo(today) > 0) {
-                            showErrorMessage("Certificate validity is in the future!");
-                            return false;
-                        }
-
-                        // we're good!
-                        clearErrorMessage();
-                        return true;
-                    } catch (GeneralSecurityException e) {
-                        handleException(e);
-                        return false;
-                    } catch (IOException e) {
-                        handleException(e);
-                        return false;
-                    } catch (KeytoolException e) {
-                        handleException(e);
-                        return false;
-                    } catch (AndroidLocationException e) {
-                        handleException(e);
-                        return false;
-                    }
-
-
-                } else {
-                    // file does not exist.
-                    showErrorMessage("Not a valid keystore path.");
-                    return false;  // Apply/OK must be disabled
-                }
-            }
-
-            clearErrorMessage();
-            return true;
-        }
-
-        @Override
-        public Text getTextControl(Composite parent) {
-            setValidateStrategy(VALIDATE_ON_KEY_STROKE);
-            return super.getTextControl(parent);
-        }
-
-        /**
-         * Set the error message from a {@link Throwable}. If the exception has no message, try
-         * to get the message from the cause.
-         * @param t the Throwable.
-         */
-        private void handleException(Throwable t) {
-            String msg = t.getMessage();
-            if (msg == null) {
-                Throwable cause = t.getCause();
-                if (cause != null) {
-                    handleException(cause);
-                } else {
-                    setErrorMessage("Uknown error when getting the debug key!");
-                }
-
-                return;
-            }
-
-            // valid text, display it.
-            showErrorMessage(msg);
-        }
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/preferences/EditorsPage.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/preferences/EditorsPage.java
deleted file mode 100644
index d33b49f..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/preferences/EditorsPage.java
+++ /dev/null
@@ -1,182 +0,0 @@
-/*
- * Copyright (C) 2010 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.preferences;
-
-import static com.android.ide.common.xml.XmlAttributeSortOrder.ALPHABETICAL;
-import static com.android.ide.common.xml.XmlAttributeSortOrder.LOGICAL;
-import static com.android.ide.common.xml.XmlAttributeSortOrder.NO_SORTING;
-
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.sdkuilib.internal.widgets.ResolutionChooserDialog;
-
-import org.eclipse.jface.preference.BooleanFieldEditor;
-import org.eclipse.jface.preference.FieldEditorPreferencePage;
-import org.eclipse.jface.preference.RadioGroupFieldEditor;
-import org.eclipse.jface.preference.StringButtonFieldEditor;
-import org.eclipse.jface.window.Window;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchPreferencePage;
-
-/**
- * Preference page for the editors.
- */
-public class EditorsPage extends FieldEditorPreferencePage implements IWorkbenchPreferencePage {
-    private BooleanFieldEditor mIndentEditor;
-    private BooleanFieldEditor mRemoveEmptyEditor;
-    private BooleanFieldEditor mOneAttrPerLineEditor;
-    private BooleanFieldEditor mSpaceBeforeCloseEditor;
-    private BooleanFieldEditor mFormatGuiXmlEditor;
-
-    /**
-     * Constructs a new Android editors preference page
-     */
-    public EditorsPage() {
-        super(GRID);
-        setPreferenceStore(AdtPlugin.getDefault().getPreferenceStore());
-    }
-
-    @Override
-    public void init(IWorkbench workbench) {
-        // pass
-    }
-
-    @Override
-    protected void createFieldEditors() {
-        Composite parent = getFieldEditorParent();
-
-        addField(new DensityFieldEditor(AdtPrefs.PREFS_MONITOR_DENSITY,
-                "Monitor Density", parent));
-
-        final MyBooleanFieldEditor editor = new MyBooleanFieldEditor(
-                AdtPrefs.PREFS_USE_CUSTOM_XML_FORMATTER,
-                "Format XML files using the standard Android XML style rather than the \n" +
-                "configured Eclipse XML style (additional options below)",
-                parent);
-        addField(editor);
-
-        // Add a listener which fires whenever the checkbox for the custom formatter
-        // is toggled -- this will be used to enable/disable the formatting related options
-        // on the page. To do this we subclass the BooleanFieldEditor to make the protected
-        // method getChangeControl public (so we can access it and add a listener on it).
-        // This is pretty ugly but I found several posts in the Eclipse forums asking
-        // how to do it and they were all unanswered. (No, calling setPropertyChangeListener
-        // does not work.)
-        Button checkbox = editor.getChangeControl(parent);
-        checkbox.addSelectionListener(new SelectionAdapter() {
-            @Override
-            public void widgetSelected(SelectionEvent e) {
-                updateCustomFormattingOptions(editor.getBooleanValue());
-            }
-        });
-
-        mIndentEditor = new BooleanFieldEditor(AdtPrefs.PREFS_USE_ECLIPSE_INDENT,
-                "Use Eclipse setting for indentation width and space or tab character "
-                + "indentation \n(Android default is 4 space characters)",
-                parent);
-        addField(mIndentEditor);
-
-        mRemoveEmptyEditor = new BooleanFieldEditor(AdtPrefs.PREVS_REMOVE_EMPTY_LINES,
-                "Always remove empty lines between elements",
-                parent);
-        addField(mRemoveEmptyEditor);
-
-        mOneAttrPerLineEditor = new BooleanFieldEditor(AdtPrefs.PREFS_ONE_ATTR_PER_LINE,
-                "Allow single attributes to appear on the same line as their elements",
-                parent);
-        addField(mOneAttrPerLineEditor);
-
-        mSpaceBeforeCloseEditor = new BooleanFieldEditor(AdtPrefs.PREFS_SPACE_BEFORE_CLOSE,
-                "Add a space before the > or /> in opening tags",
-                parent);
-        addField(mSpaceBeforeCloseEditor);
-
-        addField(new RadioGroupFieldEditor(AdtPrefs.PREFS_ATTRIBUTE_SORT,
-                "Sort Attributes", 1,
-                new String[][] {
-                    { "&Logical (id, style, layout attributes, remaining attributes alphabetically)",
-                        LOGICAL.key },
-                    { "&Alphabetical", ALPHABETICAL.key },
-                    { "&None", NO_SORTING.key },
-                },
-                parent, true));
-
-        mFormatGuiXmlEditor = new BooleanFieldEditor(AdtPrefs.PREFS_FORMAT_GUI_XML,
-                "Automatically format the XML edited by the visual layout editor",
-                parent);
-        addField(mFormatGuiXmlEditor);
-
-        addField(new BooleanFieldEditor(AdtPrefs.PREFS_FORMAT_ON_SAVE,
-                "Format on Save",
-                parent));
-
-        addField(new BooleanFieldEditor(AdtPrefs.PREFS_SHARED_LAYOUT_EDITOR,
-                "Use a single layout editor for all configuration variations of a layout",
-                parent));
-
-        boolean enabled = getPreferenceStore().getBoolean(AdtPrefs.PREFS_USE_CUSTOM_XML_FORMATTER);
-        updateCustomFormattingOptions(enabled);
-    }
-
-    private void updateCustomFormattingOptions(boolean enabled) {
-        Composite parent = getFieldEditorParent();
-        mIndentEditor.setEnabled(enabled, parent);
-        mRemoveEmptyEditor.setEnabled(enabled, parent);
-        mOneAttrPerLineEditor.setEnabled(enabled, parent);
-        mSpaceBeforeCloseEditor.setEnabled(enabled, parent);
-        mFormatGuiXmlEditor.setEnabled(enabled, parent);
-    }
-
-    /**
-     * Overridden solely so that I can get access to the checkbox button to listen to
-     * state changes
-     */
-    private class MyBooleanFieldEditor extends BooleanFieldEditor {
-        public MyBooleanFieldEditor(String name, String label, Composite parent) {
-            super(name, label, parent);
-        }
-        @Override
-        protected Button getChangeControl(Composite parent) {
-            return super.getChangeControl(parent);
-        }
-    }
-
-    /**
-     * Custom {@link StringButtonFieldEditor} to call out to {@link ResolutionChooserDialog}
-     * when the button is called.
-     */
-    private static class DensityFieldEditor extends StringButtonFieldEditor {
-
-        public DensityFieldEditor(String name, String labelText, Composite parent) {
-            super(name, labelText, parent);
-            setChangeButtonText("Compute...");
-        }
-
-        @Override
-        protected String changePressed() {
-            ResolutionChooserDialog dialog = new ResolutionChooserDialog(getShell());
-            if (dialog.open() == Window.OK) {
-                return Integer.toString(dialog.getDensity());
-            }
-
-            return null;
-        }
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/preferences/LaunchPreferencePage.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/preferences/LaunchPreferencePage.java
deleted file mode 100644
index 0ac1f0f..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/preferences/LaunchPreferencePage.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * 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.preferences;
-
-import com.android.ide.eclipse.adt.AdtPlugin;
-
-import org.eclipse.jface.preference.FieldEditorPreferencePage;
-import org.eclipse.jface.preference.StringFieldEditor;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchPreferencePage;
-
-/**
- * Settings page for launch related preferences.
- */
-public class LaunchPreferencePage extends FieldEditorPreferencePage implements
-        IWorkbenchPreferencePage {
-
-    public LaunchPreferencePage() {
-        super(GRID);
-        setPreferenceStore(AdtPlugin.getDefault().getPreferenceStore());
-        setDescription(Messages.LaunchPreferencePage_Title);
-    }
-
-    @Override
-    protected void createFieldEditors() {
-        addField(new StringFieldEditor(AdtPrefs.PREFS_EMU_OPTIONS,
-                Messages.LaunchPreferencePage_Default_Emu_Options, getFieldEditorParent()));
-
-        addField(new StringFieldEditor(AdtPrefs.PREFS_HOME_PACKAGE,
-                Messages.LaunchPreferencePage_Default_HOME_Package, getFieldEditorParent()));
-    }
-
-    @Override
-    public void init(IWorkbench workbench) {
-        // pass
-    }
-
-}
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
deleted file mode 100644
index 5cb94ba..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/preferences/LintPreferencePage.java
+++ /dev/null
@@ -1,752 +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.eclipse.adt.internal.preferences;
-
-import static com.android.tools.lint.detector.api.TextFormat.RAW;
-import static com.android.tools.lint.detector.api.TextFormat.TEXT;
-
-import com.android.annotations.NonNull;
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.ide.eclipse.adt.AdtUtils;
-import com.android.ide.eclipse.adt.internal.lint.EclipseLintClient;
-import com.android.ide.eclipse.adt.internal.lint.EclipseLintRunner;
-import com.android.ide.eclipse.adt.internal.project.BaseProjectHelper;
-import com.android.tools.lint.client.api.Configuration;
-import com.android.tools.lint.client.api.IssueRegistry;
-import com.android.tools.lint.detector.api.Category;
-import com.android.tools.lint.detector.api.Issue;
-import com.android.tools.lint.detector.api.Project;
-import com.android.tools.lint.detector.api.Severity;
-import com.android.tools.lint.detector.api.TextFormat;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IWorkspace;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.jface.viewers.IColorProvider;
-import org.eclipse.jface.viewers.ILabelProviderListener;
-import org.eclipse.jface.viewers.ITableLabelProvider;
-import org.eclipse.jface.viewers.TreeNodeContentProvider;
-import org.eclipse.jface.viewers.TreeViewer;
-import org.eclipse.jface.viewers.TreeViewerColumn;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.window.Window;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.ControlEvent;
-import org.eclipse.swt.events.ControlListener;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
-import org.eclipse.swt.events.TraverseEvent;
-import org.eclipse.swt.events.TraverseListener;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.graphics.Rectangle;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Combo;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Link;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.swt.widgets.Tree;
-import org.eclipse.swt.widgets.TreeColumn;
-import org.eclipse.swt.widgets.TreeItem;
-import org.eclipse.ui.ISharedImages;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchPreferencePage;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.dialogs.PreferencesUtil;
-import org.eclipse.ui.dialogs.PropertyPage;
-
-import java.io.File;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Locale;
-import java.util.Map;
-
-/** Preference page for configuring Lint preferences */
-public class LintPreferencePage extends PropertyPage implements IWorkbenchPreferencePage,
-        SelectionListener, ControlListener, ModifyListener {
-    private static final String ID =
-            "com.android.ide.eclipse.common.preferences.LintPreferencePage"; //$NON-NLS-1$
-    private static final int ID_COLUMN_WIDTH = 150;
-
-    private EclipseLintClient mClient;
-    private IssueRegistry mRegistry;
-    private Configuration mConfiguration;
-    private IProject mProject;
-    private Map<Issue, Severity> mSeverities = new HashMap<Issue, Severity>();
-    private Map<Issue, Severity> mInitialSeverities = Collections.<Issue, Severity>emptyMap();
-    private boolean mIgnoreEvent;
-
-    private Tree mTree;
-    private TreeViewer mTreeViewer;
-    private Text mDetailsText;
-    private Button mCheckFileCheckbox;
-    private Button mCheckExportCheckbox;
-    private Link mWorkspaceLink;
-    private TreeColumn mNameColumn;
-    private TreeColumn mIdColumn;
-    private Combo mSeverityCombo;
-    private Button mIncludeAll;
-    private Button mIgnoreAll;
-    private Text mSearch;
-
-    /**
-     * Create the preference page.
-     */
-    public LintPreferencePage() {
-        setPreferenceStore(AdtPlugin.getDefault().getPreferenceStore());
-    }
-
-    @Override
-    public Control createContents(Composite parent) {
-        IAdaptable resource = getElement();
-        if (resource != null) {
-            mProject = (IProject) resource.getAdapter(IProject.class);
-        }
-
-        Composite container = new Composite(parent, SWT.NULL);
-        container.setLayout(new GridLayout(2, false));
-
-        if (mProject != null) {
-            Label projectLabel = new Label(container, SWT.CHECK);
-            projectLabel.setLayoutData(new GridData(SWT.LEFT, SWT.BOTTOM, false, false, 1,
-                    1));
-            projectLabel.setText("Project-specific configuration:");
-
-            mWorkspaceLink = new Link(container, SWT.NONE);
-            mWorkspaceLink.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1));
-            mWorkspaceLink.setText("<a>Configure Workspace Settings...</a>");
-            mWorkspaceLink.addSelectionListener(this);
-        } else {
-            mCheckFileCheckbox = new Button(container, SWT.CHECK);
-            mCheckFileCheckbox.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false,
-                    2, 1));
-            mCheckFileCheckbox.setSelection(true);
-            mCheckFileCheckbox.setText("When saving files, check for errors");
-
-            mCheckExportCheckbox = new Button(container, SWT.CHECK);
-            mCheckExportCheckbox.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false,
-                    2, 1));
-            mCheckExportCheckbox.setSelection(true);
-            mCheckExportCheckbox.setText("Run full error check when exporting app and abort if fatal errors are found");
-
-            Label separator = new Label(container, SWT.SEPARATOR | SWT.HORIZONTAL);
-            separator.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 2, 1));
-
-            Label checkListLabel = new Label(container, SWT.NONE);
-            checkListLabel.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false, 2, 1));
-            checkListLabel.setText("Issues:");
-        }
-
-        mRegistry = EclipseLintClient.getRegistry();
-        mClient = new EclipseLintClient(mRegistry,
-                mProject != null ? Collections.singletonList(mProject) : null, null, false);
-        Project project = null;
-        if (mProject != null) {
-            File dir = AdtUtils.getAbsolutePath(mProject).toFile();
-            project = mClient.getProject(dir, dir);
-        }
-        mConfiguration = mClient.getConfigurationFor(project);
-
-        mSearch = new Text(container, SWT.SEARCH | SWT.ICON_CANCEL | SWT.ICON_SEARCH);
-        mSearch.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 2, 1));
-        mSearch.addSelectionListener(this);
-        mSearch.addModifyListener(this);
-        // Grab the Enter key such that pressing return in the search box filters (instead
-        // of closing the options dialog)
-        mSearch.setMessage("type filter text (use ~ to filter by severity, e.g. ~ignore)");
-        mSearch.addTraverseListener(new TraverseListener() {
-            @Override
-            public void keyTraversed(TraverseEvent e) {
-                if (e.keyCode == SWT.CR) {
-                    updateFilter();
-                    e.doit = false;
-                } else if (e.keyCode == SWT.ARROW_DOWN) {
-                    // Allow moving from the search into the table
-                    if (mTree.getItemCount() > 0) {
-                        TreeItem firstCategory = mTree.getItem(0);
-                        if (firstCategory.getItemCount() > 0) {
-                            TreeItem first = firstCategory.getItem(0);
-                            mTree.setFocus();
-                            mTree.select(first);
-                        }
-                    }
-                }
-            }
-        });
-
-        mTreeViewer = new TreeViewer(container, SWT.BORDER | SWT.FULL_SELECTION);
-        mTree = mTreeViewer.getTree();
-        GridData gdTable = new GridData(SWT.FILL, SWT.FILL, true, true, 2, 1);
-        gdTable.widthHint = 500;
-        gdTable.heightHint = 160;
-        mTree.setLayoutData(gdTable);
-        mTree.setLinesVisible(true);
-        mTree.setHeaderVisible(true);
-
-        TreeViewerColumn column1 = new TreeViewerColumn(mTreeViewer, SWT.NONE);
-        mIdColumn = column1.getColumn();
-        mIdColumn.setWidth(100);
-        mIdColumn.setText("Id");
-
-        TreeViewerColumn column2 = new TreeViewerColumn(mTreeViewer, SWT.FILL);
-        mNameColumn = column2.getColumn();
-        mNameColumn.setWidth(100);
-        mNameColumn.setText("Name");
-
-        mTreeViewer.setContentProvider(new ContentProvider());
-        mTreeViewer.setLabelProvider(new LabelProvider());
-
-        mDetailsText = new Text(container, SWT.BORDER | SWT.READ_ONLY | SWT.WRAP |SWT.V_SCROLL
-                | SWT.MULTI);
-        GridData gdText = new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 2);
-        gdText.heightHint = 80;
-        mDetailsText.setLayoutData(gdText);
-
-        Label severityLabel = new Label(container, SWT.NONE);
-        severityLabel.setText("Severity:");
-
-        mSeverityCombo = new Combo(container, SWT.READ_ONLY);
-        mSeverityCombo.setItems(new String[] {
-                "(Default)", "Fatal", "Error", "Warning", "Information", "Ignore"
-        });
-        GridData gdSeverityCombo = new GridData(SWT.FILL, SWT.TOP, false, false, 1, 1);
-        gdSeverityCombo.widthHint = 90;
-        mSeverityCombo.setLayoutData(gdSeverityCombo);
-        mSeverityCombo.setText("");
-        mSeverityCombo.addSelectionListener(this);
-
-        List<Issue> issues = mRegistry.getIssues();
-        for (Issue issue : issues) {
-            Severity severity = mConfiguration.getSeverity(issue);
-            mSeverities.put(issue, severity);
-        }
-        mInitialSeverities = new HashMap<Issue, Severity>(mSeverities);
-
-        mTreeViewer.setInput(mRegistry);
-
-        mTree.addSelectionListener(this);
-        // Add a listener to resize the column to the full width of the table
-        mTree.addControlListener(this);
-
-        loadSettings(false);
-
-        mTreeViewer.expandAll();
-
-        return container;
-    }
-
-    /**
-     * Initialize the preference page.
-     */
-    @Override
-    public void init(IWorkbench workbench) {
-        // Initialize the preference page
-    }
-
-    @Override
-    protected void contributeButtons(Composite parent) {
-        super.contributeButtons(parent);
-
-        // Add "Include All" button for quickly enabling all the detectors, including
-        // those disabled by default
-        mIncludeAll = new Button(parent, SWT.PUSH);
-        mIncludeAll.setText("Include All");
-        mIncludeAll.addSelectionListener(this);
-
-        // Add "Ignore All" button for quickly disabling all the detectors
-        mIgnoreAll = new Button(parent, SWT.PUSH);
-        mIgnoreAll.setText("Ignore All");
-        mIgnoreAll.addSelectionListener(this);
-
-        // As per the contributeButton javadoc: increase parent's column count for each
-        // added button
-        ((GridLayout) parent.getLayout()).numColumns += 2;
-    }
-
-    @Override
-    public void dispose() {
-        super.dispose();
-        cancelPendingSearch();
-    }
-
-    @Override
-    protected void performDefaults() {
-        super.performDefaults();
-
-        mConfiguration.startBulkEditing();
-
-        List<Issue> issues = mRegistry.getIssues();
-        for (Issue issue : issues) {
-            mConfiguration.setSeverity(issue, null);
-        }
-
-        mConfiguration.finishBulkEditing();
-
-        loadSettings(true);
-    }
-
-    @Override
-    public boolean performOk() {
-        storeSettings();
-        return true;
-    }
-
-    private void loadSettings(boolean refresh) {
-        if (mCheckExportCheckbox != null) {
-            AdtPrefs prefs = AdtPrefs.getPrefs();
-            mCheckFileCheckbox.setSelection(prefs.isLintOnSave());
-            mCheckExportCheckbox.setSelection(prefs.isLintOnExport());
-        }
-
-        mSeverities.clear();
-        List<Issue> issues = mRegistry.getIssues();
-        for (Issue issue : issues) {
-            Severity severity = mConfiguration.getSeverity(issue);
-            mSeverities.put(issue, severity);
-        }
-
-        if (refresh) {
-            mTreeViewer.refresh();
-        }
-    }
-
-    private void storeSettings() {
-        // Lint on Save, Lint on Export
-        if (mCheckExportCheckbox != null) {
-            AdtPrefs prefs = AdtPrefs.getPrefs();
-            prefs.setLintOnExport(mCheckExportCheckbox.getSelection());
-            prefs.setLintOnSave(mCheckFileCheckbox.getSelection());
-        }
-
-        if (mConfiguration == null) {
-            return;
-        }
-
-        mConfiguration.startBulkEditing();
-        try {
-            // Severities
-            for (Map.Entry<Issue, Severity> entry : mSeverities.entrySet()) {
-                Issue issue = entry.getKey();
-                Severity severity = entry.getValue();
-                if (mConfiguration.getSeverity(issue) != severity) {
-                    if ((severity == issue.getDefaultSeverity()) && issue.isEnabledByDefault()) {
-                        severity = null;
-                    }
-                    mConfiguration.setSeverity(issue, severity);
-                }
-            }
-        } finally {
-            mConfiguration.finishBulkEditing();
-        }
-
-        if (!mInitialSeverities.equals(mSeverities)) {
-            // Ask user whether we should re-run the rules.
-            MessageDialog dialog = new MessageDialog(
-                    null, "Lint Settings Have Changed", null,
-                    "The list of enabled checks has changed. Would you like to run lint now " +
-                            "to update the results?",
-                    MessageDialog.QUESTION,
-                    new String[] {
-                            "Yes", "No"
-                    },
-                    0); // yes is the default
-            int result = dialog.open();
-            if (result == 0) {
-                // Run lint on all the open Android projects
-                IWorkspace workspace = ResourcesPlugin.getWorkspace();
-                IProject[] projects = workspace.getRoot().getProjects();
-                List<IProject> androidProjects = new ArrayList<IProject>(projects.length);
-                for (IProject project : projects) {
-                    if (project.isOpen() && BaseProjectHelper.isAndroidProject(project)) {
-                        androidProjects.add(project);
-                    }
-                }
-
-                EclipseLintRunner.startLint(androidProjects, null,  null, false /*fatalOnly*/,
-                        true /*show*/);
-            }
-        }
-    }
-
-    private void updateFilter() {
-        cancelPendingSearch();
-        if (!mSearch.isDisposed()) {
-            // Clear selection before refiltering since otherwise it might be showing
-            // items no longer available in the list.
-            mTree.setSelection(new TreeItem[0]);
-            mDetailsText.setText("");
-            try {
-                mIgnoreEvent = true;
-                mSeverityCombo.setText("");
-                mSeverityCombo.setEnabled(false);
-            } finally {
-                mIgnoreEvent = false;
-            }
-
-            mTreeViewer.getContentProvider().inputChanged(mTreeViewer, null, mRegistry);
-            mTreeViewer.refresh();
-            mTreeViewer.expandAll();
-        }
-    }
-
-    private void cancelPendingSearch() {
-        if (mPendingUpdate != null) {
-            Shell shell = getShell();
-            if (!shell.isDisposed()) {
-                getShell().getDisplay().timerExec(-1, mPendingUpdate);
-            }
-            mPendingUpdate = null;
-        }
-    }
-
-    private Runnable mPendingUpdate;
-
-    private void scheduleSearch() {
-        if (mPendingUpdate == null) {
-            mPendingUpdate = new Runnable() {
-                @Override
-                public void run() {
-                    mPendingUpdate = null;
-                    updateFilter();
-                }
-            };
-        }
-        getShell().getDisplay().timerExec(250 /*ms*/, mPendingUpdate);
-    }
-
-    // ---- Implements SelectionListener ----
-
-    @Override
-    public void widgetSelected(SelectionEvent e) {
-        if (mIgnoreEvent) {
-            return;
-        }
-
-        Object source = e.getSource();
-        if (source == mTree) {
-            TreeItem item = (TreeItem) e.item;
-            Object data = item != null ? item.getData() : null;
-            if (data instanceof Issue) {
-                Issue issue = (Issue) data;
-                String summary = issue.getBriefDescription(TextFormat.TEXT);
-                String explanation = issue.getExplanation(TextFormat.TEXT);
-
-                StringBuilder sb = new StringBuilder(summary.length() + explanation.length() + 20);
-                sb.append(summary);
-                sb.append('\n').append('\n');
-                sb.append(explanation);
-                mDetailsText.setText(sb.toString());
-                try {
-                    mIgnoreEvent = true;
-                    Severity severity = getSeverity(issue);
-                    mSeverityCombo.select(severity.ordinal() + 1); // Skip the default option
-                    mSeverityCombo.setEnabled(true);
-                } finally {
-                    mIgnoreEvent = false;
-                }
-            } else {
-                mDetailsText.setText("");
-                try {
-                    mIgnoreEvent = true;
-                    mSeverityCombo.setText("");
-                    mSeverityCombo.setEnabled(false);
-                } finally {
-                    mIgnoreEvent = false;
-                }
-            }
-        } else if (source == mWorkspaceLink) {
-            int result = PreferencesUtil.createPreferenceDialogOn(getShell(), ID,
-                    new String[] { ID }, null).open();
-            if (result == Window.OK) {
-                loadSettings(true);
-            }
-        } else if (source == mSeverityCombo) {
-            int index = mSeverityCombo.getSelectionIndex();
-            Issue issue = (Issue) mTree.getSelection()[0].getData();
-            Severity severity;
-            if (index == -1 || index == 0) {
-                // "(Default)"
-                severity = issue.getDefaultSeverity();
-            } else {
-                // -1: Skip the "(Default)"
-                severity = Severity.values()[index - 1];
-            }
-            mSeverities.put(issue, severity);
-            mTreeViewer.refresh();
-        } else if (source == mIncludeAll) {
-            List<Issue> issues = mRegistry.getIssues();
-            for (Issue issue : issues) {
-                // The default severity is never ignore; for disabled-by-default
-                // issues the {@link Issue#isEnabledByDefault()} method is false instead
-                mSeverities.put(issue, issue.getDefaultSeverity());
-            }
-            mTreeViewer.refresh();
-        } else if (source == mIgnoreAll) {
-            List<Issue> issues = mRegistry.getIssues();
-            for (Issue issue : issues) {
-                mSeverities.put(issue, Severity.IGNORE);
-            }
-            mTreeViewer.refresh();
-        } else if (source == mSearch) {
-            updateFilter();
-        }
-    }
-
-    private Severity getSeverity(Issue issue) {
-        Severity severity = mSeverities.get(issue);
-        if (severity != null) {
-            return severity;
-        }
-
-        return mConfiguration.getSeverity(issue);
-    }
-
-    @Override
-    public void widgetDefaultSelected(SelectionEvent e) {
-        Object source = e.getSource();
-        if (source == mTree) {
-            widgetSelected(e);
-        } else if (source == mSearch) {
-            if (e.detail == SWT.CANCEL) {
-                // Cancel the search
-                mSearch.setText("");
-            }
-            updateFilter();
-        }
-    }
-
-    // ---- Implements ModifyListener ----
-    @Override
-    public void modifyText(ModifyEvent e) {
-        if (e.getSource() == mSearch) {
-            scheduleSearch();
-        }
-    }
-
-    // ---- Implements ControlListener ----
-
-    @Override
-    public void controlMoved(ControlEvent e) {
-    }
-
-    @Override
-    public void controlResized(ControlEvent e) {
-        Rectangle r = mTree.getClientArea();
-        int availableWidth = r.width;
-
-        mIdColumn.setWidth(ID_COLUMN_WIDTH);
-        availableWidth -= ID_COLUMN_WIDTH;
-
-        // Name absorbs everything else
-        mNameColumn.setWidth(availableWidth);
-    }
-
-    private boolean filterMatches(@NonNull String filter, @NonNull Issue issue) {
-        return (filter.startsWith("~") //$NON-NLS-1$
-                        && mConfiguration.getSeverity(issue).getDescription()
-                            .toLowerCase(Locale.US).startsWith(filter.substring(1)))
-                || issue.getCategory().getName().toLowerCase(Locale.US).startsWith(filter)
-                || issue.getCategory().getFullName().toLowerCase(Locale.US).startsWith(filter)
-                || issue.getId().toLowerCase(Locale.US).contains(filter)
-                || issue.getBriefDescription(RAW).toLowerCase(Locale.US).contains(filter);
-    }
-
-    private class ContentProvider extends TreeNodeContentProvider {
-        private Map<Category, List<Issue>> mCategoryToIssues;
-        private Object[] mElements;
-
-        @Override
-        public Object[] getElements(Object inputElement) {
-            return mElements;
-        }
-
-        @Override
-        public boolean hasChildren(Object element) {
-            return element instanceof Category;
-        }
-
-        @Override
-        public Object[] getChildren(Object parentElement) {
-            assert mCategoryToIssues != null;
-            List<Issue> list = mCategoryToIssues.get(parentElement);
-            if (list == null) {
-                return new Object[0];
-            }  else {
-                return list.toArray();
-            }
-        }
-
-        @Override
-        public Object getParent(Object element) {
-            return null;
-        }
-
-        @Override
-        public void inputChanged(final Viewer viewer, final Object oldInput,
-                final Object newInput) {
-            mCategoryToIssues = null;
-
-            String filter = mSearch.isDisposed() ? "" : mSearch.getText().trim();
-            if (filter.length() == 0) {
-                filter = null;
-            } else {
-                filter = filter.toLowerCase(Locale.US);
-            }
-
-            mCategoryToIssues = new HashMap<Category, List<Issue>>();
-            List<Issue> issues = mRegistry.getIssues();
-            for (Issue issue : issues) {
-                if (filter == null || filterMatches(filter, issue)) {
-                    List<Issue> list = mCategoryToIssues.get(issue.getCategory());
-                    if (list == null) {
-                        list = new ArrayList<Issue>();
-                        mCategoryToIssues.put(issue.getCategory(), list);
-                    }
-                    list.add(issue);
-                }
-            }
-
-            if (filter == null) {
-                // Not filtering: show all categories
-                mElements = mRegistry.getCategories().toArray();
-            } else {
-                // Filtering: only include categories that contain matches
-                if (mCategoryToIssues == null) {
-                    getChildren(null);
-                }
-
-                // Preserve the current category order, so instead of
-                // just creating a list of the mCategoryToIssues keyset, add them
-                // in the order they appear in in the registry
-                List<Category> categories = new ArrayList<Category>(mCategoryToIssues.size());
-                for (Category category : mRegistry.getCategories()) {
-                    if (mCategoryToIssues.containsKey(category)) {
-                        categories.add(category);
-                    }
-                }
-                mElements = categories.toArray();
-            }
-        }
-    }
-
-    private class LabelProvider implements ITableLabelProvider, IColorProvider {
-
-        @Override
-        public void addListener(ILabelProviderListener listener) {
-        }
-
-        @Override
-        public void dispose() {
-        }
-
-        @Override
-        public boolean isLabelProperty(Object element, String property) {
-            return true;
-        }
-
-        @Override
-        public void removeListener(ILabelProviderListener listener) {
-        }
-
-        @Override
-        public Image getColumnImage(Object element, int columnIndex) {
-            if (element instanceof Category) {
-                return null;
-            }
-
-            if (columnIndex == 1) {
-                Issue issue = (Issue) element;
-                Severity severity = mSeverities.get(issue);
-                if (severity == null) {
-                    return null;
-                }
-
-                ISharedImages sharedImages = PlatformUI.getWorkbench().getSharedImages();
-                switch (severity) {
-                    case FATAL:
-                    case ERROR:
-                        return sharedImages.getImage(ISharedImages.IMG_OBJS_ERROR_TSK);
-                    case WARNING:
-                        return sharedImages.getImage(ISharedImages.IMG_OBJS_WARN_TSK);
-                    case INFORMATIONAL:
-                        return sharedImages.getImage(ISharedImages.IMG_OBJS_INFO_TSK);
-                    case IGNORE:
-                        return sharedImages.getImage(ISharedImages.IMG_ELCL_REMOVE_DISABLED);
-                }
-            }
-            return null;
-        }
-
-        @Override
-        public String getColumnText(Object element, int columnIndex) {
-            if (element instanceof Category) {
-                if (columnIndex == 0) {
-                    return ((Category) element).getFullName();
-                } else {
-                    return null;
-                }
-            }
-
-            Issue issue = (Issue) element;
-            switch (columnIndex) {
-                case 0:
-                    return issue.getId();
-                case 1:
-                    return issue.getBriefDescription(TEXT);
-            }
-
-            return null;
-        }
-
-        // ---- IColorProvider ----
-
-        @Override
-        public Color getForeground(Object element) {
-            if (element instanceof Category) {
-                return mTree.getDisplay().getSystemColor(SWT.COLOR_INFO_FOREGROUND);
-            }
-
-            if (element instanceof Issue) {
-                Issue issue = (Issue) element;
-                Severity severity = mSeverities.get(issue);
-                if (severity == Severity.IGNORE) {
-                    return mTree.getDisplay().getSystemColor(SWT.COLOR_DARK_GRAY);
-                }
-            }
-
-            return null;
-        }
-
-        @Override
-        public Color getBackground(Object element) {
-            if (element instanceof Category) {
-                return mTree.getDisplay().getSystemColor(SWT.COLOR_INFO_BACKGROUND);
-            }
-            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
deleted file mode 100644
index 70b9751..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/preferences/Messages.java
+++ /dev/null
@@ -1,51 +0,0 @@
-
-package com.android.ide.eclipse.adt.internal.preferences;
-
-import org.eclipse.osgi.util.NLS;
-
-public class Messages extends NLS {
-    private static final String BUNDLE_NAME = "com.android.ide.eclipse.adt.internal.preferences.messages"; //$NON-NLS-1$
-
-    public static String AndroidPreferencePage_ERROR_Reserved_Char;
-
-    public static String AndroidPreferencePage_SDK_Location_;
-
-    public static String AndroidPreferencePage_Title;
-
-    public static String BuildPreferencePage_Auto_Refresh_Resources_on_Build;
-
-    public static String BuildPreferencePage_Build_Output;
-
-    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;
-
-    public static String BuildPreferencePage_Title;
-
-    public static String BuildPreferencePage_Verbose;
-
-    public static String LaunchPreferencePage_Default_Emu_Options;
-
-    public static String LaunchPreferencePage_Default_HOME_Package;
-
-    public static String LaunchPreferencePage_Title;
-    static {
-        // initialize resource bundle
-        NLS.initializeMessages(BUNDLE_NAME, Messages.class);
-    }
-
-    private Messages() {
-    }
-}
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
deleted file mode 100644
index 61894fd..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/preferences/messages.properties
+++ /dev/null
@@ -1,18 +0,0 @@
-BuildPreferencePage_Title=Build Settings:
-BuildPreferencePage_Auto_Refresh_Resources_on_Build=Automatically refresh Resources and Assets folder on build
-BuildPreferencePage_Build_Output=Build output
-BuildPreferencePage_Silent=Silent
-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:
-AndroidPreferencePage_Title=Android Preferences
-AndroidPreferencePage_SDK_Location_=SDK Location:
-AndroidPreferencePage_ERROR_Reserved_Char=Reserved characters ',' and ';' cannot be used in the SDK Location.
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/project/AndroidClasspathContainer.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/project/AndroidClasspathContainer.java
deleted file mode 100644
index 475dd5a..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/project/AndroidClasspathContainer.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * Copyright (C) 2007 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.project;
-
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.jdt.core.IClasspathContainer;
-import org.eclipse.jdt.core.IClasspathEntry;
-
-/**
- * Classpath container for the Android projects.
- * This supports both the System classpath and the library dependencies.
- */
-class AndroidClasspathContainer implements IClasspathContainer {
-
-    private final IClasspathEntry[] mClasspathEntry;
-    private final IPath mContainerPath;
-    private final String mName;
-    private final int mKind;
-
-    /**
-     * Constructs the container with the {@link IClasspathEntry} representing the android
-     * framework jar file and the container id
-     * @param entries the entries representing the android framework and optional libraries.
-     * @param path the path containing the classpath container id.
-     * @param name the name of the container to display.
-     * @param the container kind. Can be {@link IClasspathContainer#K_DEFAULT_SYSTEM} or
-     *      {@link IClasspathContainer#K_APPLICATION}
-     */
-    AndroidClasspathContainer(IClasspathEntry[] entries, IPath path, String name, int kind) {
-        mClasspathEntry = entries;
-        mContainerPath = path;
-        mName = name;
-        mKind = kind;
-    }
-
-    @Override
-    public IClasspathEntry[] getClasspathEntries() {
-        return mClasspathEntry;
-    }
-
-    @Override
-    public String getDescription() {
-        return mName;
-    }
-
-    @Override
-    public int getKind() {
-        return mKind;
-    }
-
-    @Override
-    public IPath getPath() {
-        return mContainerPath;
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/project/AndroidClasspathContainerInitializer.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/project/AndroidClasspathContainerInitializer.java
deleted file mode 100644
index f9382c5..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/project/AndroidClasspathContainerInitializer.java
+++ /dev/null
@@ -1,823 +0,0 @@
-/*
- * Copyright (C) 2007 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.project;
-
-import com.android.SdkConstants;
-import com.android.ide.common.sdk.LoadStatus;
-import com.android.ide.eclipse.adt.AdtConstants;
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.ide.eclipse.adt.internal.sdk.ProjectState;
-import com.android.ide.eclipse.adt.internal.sdk.Sdk;
-import com.android.sdklib.AndroidVersion;
-import com.android.sdklib.IAndroidTarget;
-import com.android.sdklib.IAndroidTarget.IOptionalLibrary;
-import com.google.common.collect.Maps;
-import com.google.common.io.Closeables;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IWorkspaceRoot;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.FileLocator;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.jdt.core.IAccessRule;
-import org.eclipse.jdt.core.IClasspathAttribute;
-import org.eclipse.jdt.core.IClasspathContainer;
-import org.eclipse.jdt.core.IClasspathEntry;
-import org.eclipse.jdt.core.IJavaModel;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.JavaCore;
-import org.eclipse.jdt.core.JavaModelException;
-import org.osgi.framework.Bundle;
-
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.URI;
-import java.net.URISyntaxException;
-import java.net.URL;
-import java.net.URLConnection;
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.regex.Pattern;
-
-/**
- * Classpath container initializer responsible for binding {@link AndroidClasspathContainer} to
- * {@link IProject}s. This removes the hard-coded path to the android.jar.
- */
-public class AndroidClasspathContainerInitializer extends BaseClasspathContainerInitializer {
-
-    public static final String NULL_API_URL = "<null>"; //$NON-NLS-1$
-
-    public static final String SOURCES_ZIP = "/sources.zip"; //$NON-NLS-1$
-
-    public static final String COM_ANDROID_IDE_ECLIPSE_ADT_SOURCE =
-        "com.android.ide.eclipse.source"; //$NON-NLS-1$
-
-    private static final String ANDROID_API_REFERENCE =
-        "http://developer.android.com/reference/"; //$NON-NLS-1$
-
-    private final static String PROPERTY_ANDROID_API = "androidApi"; //$NON-NLS-1$
-
-    private final static String PROPERTY_ANDROID_SOURCE = "androidSource"; //$NON-NLS-1$
-
-    /** path separator to store multiple paths in a single property. This is guaranteed to not
-     * be in a path.
-     */
-    private final static String PATH_SEPARATOR = "\u001C"; //$NON-NLS-1$
-
-    private final static String PROPERTY_CONTAINER_CACHE = "androidContainerCache"; //$NON-NLS-1$
-    private final static String PROPERTY_TARGET_NAME = "androidTargetCache"; //$NON-NLS-1$
-    private final static String CACHE_VERSION = "01"; //$NON-NLS-1$
-    private final static String CACHE_VERSION_SEP = CACHE_VERSION + PATH_SEPARATOR;
-
-    private final static int CACHE_INDEX_JAR = 0;
-    private final static int CACHE_INDEX_SRC = 1;
-    private final static int CACHE_INDEX_DOCS_URI = 2;
-    private final static int CACHE_INDEX_OPT_DOCS_URI = 3;
-    private final static int CACHE_INDEX_ADD_ON_START = CACHE_INDEX_OPT_DOCS_URI;
-
-    public AndroidClasspathContainerInitializer() {
-        // pass
-    }
-
-    /**
-     * Binds a classpath container  to a {@link IClasspathContainer} for a given project,
-     * or silently fails if unable to do so.
-     * @param containerPath the container path that is the container id.
-     * @param project the project to bind
-     */
-    @Override
-    public void initialize(IPath containerPath, IJavaProject project) throws CoreException {
-        if (AdtConstants.CONTAINER_FRAMEWORK.equals(containerPath.toString())) {
-            IClasspathContainer container = allocateAndroidContainer(project);
-            if (container != null) {
-                JavaCore.setClasspathContainer(new Path(AdtConstants.CONTAINER_FRAMEWORK),
-                        new IJavaProject[] { project },
-                        new IClasspathContainer[] { container },
-                        new NullProgressMonitor());
-            }
-        }
-    }
-
-    /**
-     * Updates the {@link IJavaProject} objects with new android framework container. This forces
-     * JDT to recompile them.
-     * @param androidProjects the projects to update.
-     * @return <code>true</code> if success, <code>false</code> otherwise.
-     */
-    static boolean updateProjects(IJavaProject[] androidProjects) {
-        try {
-            // Allocate a new AndroidClasspathContainer, and associate it to the android framework
-            // container id for each projects.
-            // By providing a new association between a container id and a IClasspathContainer,
-            // this forces the JDT to query the IClasspathContainer for new IClasspathEntry (with
-            // IClasspathContainer#getClasspathEntries()), and therefore force recompilation of
-            // the projects.
-            int projectCount = androidProjects.length;
-
-            IClasspathContainer[] containers = new IClasspathContainer[projectCount];
-            for (int i = 0 ; i < projectCount; i++) {
-                containers[i] = allocateAndroidContainer(androidProjects[i]);
-            }
-
-            // give each project their new container in one call.
-            JavaCore.setClasspathContainer(
-                    new Path(AdtConstants.CONTAINER_FRAMEWORK),
-                    androidProjects, containers, new NullProgressMonitor());
-
-            return true;
-        } catch (JavaModelException e) {
-            return false;
-        }
-    }
-
-    /**
-     * Allocates and returns an {@link AndroidClasspathContainer} object with the proper
-     * path to the framework jar file.
-     * @param javaProject The java project that will receive the container.
-     */
-    private static IClasspathContainer allocateAndroidContainer(IJavaProject javaProject) {
-        final IProject iProject = javaProject.getProject();
-
-        String markerMessage = null;
-        boolean outputToConsole = true;
-        IAndroidTarget target = null;
-
-        try {
-            AdtPlugin plugin = AdtPlugin.getDefault();
-            if (plugin == null) { // This is totally weird, but I've seen it happen!
-                return null;
-            }
-
-            synchronized (Sdk.getLock()) {
-                boolean sdkIsLoaded = plugin.getSdkLoadStatus() == LoadStatus.LOADED;
-
-                // check if the project has a valid target.
-                ProjectState state = Sdk.getProjectState(iProject);
-                if (state == null) {
-                    // looks like the project state (project.properties) couldn't be read!
-                    markerMessage = String.format(
-                            "Project has no %1$s file! Edit the project properties to set one.",
-                            SdkConstants.FN_PROJECT_PROPERTIES);
-                } else {
-                    // this might be null if the sdk is not yet loaded.
-                    target = state.getTarget();
-
-                    // if we are loaded and the target is non null, we create a valid
-                    // ClassPathContainer
-                    if (sdkIsLoaded && target != null) {
-                        // check the renderscript support mode. If support mode is enabled,
-                        // target API must be 18+
-                        if (!state.getRenderScriptSupportMode() ||
-                                target.getVersion().getApiLevel() >= 18) {
-                            // first make sure the target has loaded its data
-                            Sdk.getCurrent().checkAndLoadTargetData(target, null /*project*/);
-
-                            String targetName = target.getClasspathName();
-
-                            return new AndroidClasspathContainer(
-                                    createClasspathEntries(iProject, target, targetName),
-                                    new Path(AdtConstants.CONTAINER_FRAMEWORK),
-                                    targetName,
-                                    IClasspathContainer.K_DEFAULT_SYSTEM);
-                        } else {
-                            markerMessage = "Renderscript support mode requires compilation target API to be 18+.";
-                        }
-                    } else {
-                        // In case of error, we'll try different thing to provide the best error message
-                        // possible.
-                        // Get the project's target's hash string (if it exists)
-                        String hashString = state.getTargetHashString();
-
-                        if (hashString == null || hashString.length() == 0) {
-                            // if there is no hash string we only show this if the SDK is loaded.
-                            // For a project opened at start-up with no target, this would be displayed
-                            // twice, once when the project is opened, and once after the SDK has
-                            // finished loading.
-                            // By testing the sdk is loaded, we only show this once in the console.
-                            if (sdkIsLoaded) {
-                                markerMessage = String.format(
-                                        "Project has no target set. Edit the project properties to set one.");
-                            }
-                        } else if (sdkIsLoaded) {
-                            markerMessage = String.format(
-                                    "Unable to resolve target '%s'", hashString);
-                        } else {
-                            // this is the case where there is a hashString but the SDK is not yet
-                            // loaded and therefore we can't get the target yet.
-                            // We check if there is a cache of the needed information.
-                            AndroidClasspathContainer container = getContainerFromCache(iProject,
-                                    target);
-
-                            if (container == null) {
-                                // either the cache was wrong (ie folder does not exists anymore), or
-                                // there was no cache. In this case we need to make sure the project
-                                // is resolved again after the SDK is loaded.
-                                plugin.setProjectToResolve(javaProject);
-
-                                markerMessage = String.format(
-                                        "Unable to resolve target '%s' until the SDK is loaded.",
-                                        hashString);
-
-                                // let's not log this one to the console as it will happen at
-                                // every boot, and it's expected. (we do keep the error marker though).
-                                outputToConsole = false;
-
-                            } else {
-                                // we created a container from the cache, so we register the project
-                                // to be checked for cache validity once the SDK is loaded
-                                plugin.setProjectToCheck(javaProject);
-
-                                // and return the container
-                                return container;
-                            }
-                        }
-                    }
-                }
-
-                // return a dummy container to replace the one we may have had before.
-                // It'll be replaced by the real when if/when the target is resolved if/when the
-                // SDK finishes loading.
-                return new IClasspathContainer() {
-                    @Override
-                    public IClasspathEntry[] getClasspathEntries() {
-                        return new IClasspathEntry[0];
-                    }
-
-                    @Override
-                    public String getDescription() {
-                        return "Unable to get system library for the project";
-                    }
-
-                    @Override
-                    public int getKind() {
-                        return IClasspathContainer.K_DEFAULT_SYSTEM;
-                    }
-
-                    @Override
-                    public IPath getPath() {
-                        return null;
-                    }
-                };
-            }
-        } finally {
-           processError(iProject, markerMessage, AdtConstants.MARKER_TARGET, outputToConsole);
-        }
-    }
-
-    /**
-     * Creates and returns an array of {@link IClasspathEntry} objects for the android
-     * framework and optional libraries.
-     * <p/>This references the OS path to the android.jar and the
-     * java doc directory. This is dynamically created when a project is opened,
-     * and never saved in the project itself, so there's no risk of storing an
-     * obsolete path.
-     * The method also stores the paths used to create the entries in the project persistent
-     * properties. A new {@link AndroidClasspathContainer} can be created from the stored path
-     * using the {@link #getContainerFromCache(IProject)} method.
-     * @param project
-     * @param target The target that contains the libraries.
-     * @param targetName
-     */
-    private static IClasspathEntry[] createClasspathEntries(IProject project,
-            IAndroidTarget target, String targetName) {
-
-        // get the path from the target
-        String[] paths = getTargetPaths(target);
-
-        // create the classpath entry from the paths
-        IClasspathEntry[] entries = createClasspathEntriesFromPaths(paths, target);
-
-        // paths now contains all the path required to recreate the IClasspathEntry with no
-        // target info. We encode them in a single string, with each path separated by
-        // OS path separator.
-        StringBuilder sb = new StringBuilder(CACHE_VERSION);
-        for (String p : paths) {
-            sb.append(PATH_SEPARATOR);
-            sb.append(p);
-        }
-
-        // store this in a project persistent property
-        ProjectHelper.saveStringProperty(project, PROPERTY_CONTAINER_CACHE, sb.toString());
-        ProjectHelper.saveStringProperty(project, PROPERTY_TARGET_NAME, targetName);
-
-        return entries;
-    }
-
-    /**
-     * Generates an {@link AndroidClasspathContainer} from the project cache, if possible.
-     */
-    private static AndroidClasspathContainer getContainerFromCache(IProject project,
-            IAndroidTarget target) {
-        // get the cached info from the project persistent properties.
-        String cache = ProjectHelper.loadStringProperty(project, PROPERTY_CONTAINER_CACHE);
-        String targetNameCache = ProjectHelper.loadStringProperty(project, PROPERTY_TARGET_NAME);
-        if (cache == null || targetNameCache == null) {
-            return null;
-        }
-
-        // the first 2 chars must match CACHE_VERSION. The 3rd char is the normal separator.
-        if (cache.startsWith(CACHE_VERSION_SEP) == false) {
-            return null;
-        }
-
-        cache = cache.substring(CACHE_VERSION_SEP.length());
-
-        // the cache contains multiple paths, separated by a character guaranteed to not be in
-        // the path (\u001C).
-        // The first 3 are for android.jar (jar, source, doc), the rest are for the optional
-        // libraries and should contain at least one doc and a jar (if there are any libraries).
-        // Therefore, the path count should be 3 or 5+
-        String[] paths = cache.split(Pattern.quote(PATH_SEPARATOR));
-        if (paths.length < 3 || paths.length == 4) {
-            return null;
-        }
-
-        // now we check the paths actually exist.
-        // There's an exception: If the source folder for android.jar does not exist, this is
-        // not a problem, so we skip it.
-        // Also paths[CACHE_INDEX_DOCS_URI] is a URI to the javadoc, so we test it a
-        // bit differently.
-        try {
-            if (new File(paths[CACHE_INDEX_JAR]).exists() == false ||
-                    new File(new URI(paths[CACHE_INDEX_DOCS_URI])).exists() == false) {
-                return null;
-            }
-
-            // check the path for the add-ons, if they exist.
-            if (paths.length > CACHE_INDEX_ADD_ON_START) {
-
-                // check the docs path separately from the rest of the paths as it's a URI.
-                if (new File(new URI(paths[CACHE_INDEX_OPT_DOCS_URI])).exists() == false) {
-                    return null;
-                }
-
-                // now just check the remaining paths.
-                for (int i = CACHE_INDEX_ADD_ON_START + 1; i < paths.length; i++) {
-                    String path = paths[i];
-                    if (path.length() > 0) {
-                        File f = new File(path);
-                        if (f.exists() == false) {
-                            return null;
-                        }
-                    }
-                }
-            }
-        } catch (URISyntaxException e) {
-            return null;
-        }
-
-        IClasspathEntry[] entries = createClasspathEntriesFromPaths(paths, target);
-
-        return new AndroidClasspathContainer(entries,
-                new Path(AdtConstants.CONTAINER_FRAMEWORK),
-                targetNameCache, IClasspathContainer.K_DEFAULT_SYSTEM);
-    }
-
-    /**
-     * Generates an array of {@link IClasspathEntry} from a set of paths.
-     * @see #getTargetPaths(IAndroidTarget)
-     */
-    private static IClasspathEntry[] createClasspathEntriesFromPaths(String[] paths,
-            IAndroidTarget target) {
-        ArrayList<IClasspathEntry> list = new ArrayList<IClasspathEntry>();
-
-        // First, we create the IClasspathEntry for the framework.
-        // now add the android framework to the class path.
-        // create the path object.
-        IPath androidLib = new Path(paths[CACHE_INDEX_JAR]);
-
-        IPath androidSrc = null;
-        String androidSrcOsPath = null;
-        IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
-        if (target != null) {
-            androidSrcOsPath =
-                ProjectHelper.loadStringProperty(root, getAndroidSourceProperty(target));
-        }
-        if (androidSrcOsPath != null && androidSrcOsPath.trim().length() > 0) {
-            androidSrc = new Path(androidSrcOsPath);
-        }
-        if (androidSrc == null) {
-            androidSrc = new Path(paths[CACHE_INDEX_SRC]);
-            File androidSrcFile = new File(paths[CACHE_INDEX_SRC]);
-            if (!androidSrcFile.isDirectory()) {
-                androidSrc = null;
-            }
-        }
-
-        if (androidSrc == null && target != null) {
-            Bundle bundle = getSourceBundle();
-
-            if (bundle != null) {
-                AndroidVersion version = target.getVersion();
-                String apiString = version.getApiString();
-                String sourcePath = apiString + SOURCES_ZIP;
-                URL sourceURL = bundle.getEntry(sourcePath);
-                if (sourceURL != null) {
-                    URL url = null;
-                    try {
-                        url = FileLocator.resolve(sourceURL);
-                    } catch (IOException ignore) {
-                    }
-                    if (url != null) {
-                        androidSrcOsPath = url.getFile();
-                        if (new File(androidSrcOsPath).isFile()) {
-                            androidSrc = new Path(androidSrcOsPath);
-                        }
-                    }
-                }
-            }
-        }
-
-        // create the java doc link.
-        String androidApiURL = ProjectHelper.loadStringProperty(root, PROPERTY_ANDROID_API);
-        String apiURL = null;
-        if (androidApiURL != null && testURL(androidApiURL)) {
-            apiURL = androidApiURL;
-        } else {
-            if (testURL(paths[CACHE_INDEX_DOCS_URI])) {
-                apiURL = paths[CACHE_INDEX_DOCS_URI];
-            } else if (testURL(ANDROID_API_REFERENCE)) {
-                apiURL = ANDROID_API_REFERENCE;
-            }
-        }
-
-        IClasspathAttribute[] attributes = null;
-        if (apiURL != null && !NULL_API_URL.equals(apiURL)) {
-            IClasspathAttribute cpAttribute = JavaCore.newClasspathAttribute(
-                    IClasspathAttribute.JAVADOC_LOCATION_ATTRIBUTE_NAME, apiURL);
-            attributes = new IClasspathAttribute[] {
-                cpAttribute
-            };
-        }
-        // create the access rule to restrict access to classes in
-        // com.android.internal
-        IAccessRule accessRule = JavaCore.newAccessRule(new Path("com/android/internal/**"), //$NON-NLS-1$
-                IAccessRule.K_NON_ACCESSIBLE);
-
-        IClasspathEntry frameworkClasspathEntry = JavaCore.newLibraryEntry(androidLib,
-                androidSrc, // source attachment path
-                null, // default source attachment root path.
-                new IAccessRule[] { accessRule },
-                attributes,
-                false // not exported.
-                );
-
-        list.add(frameworkClasspathEntry);
-
-        // now deal with optional libraries
-        if (paths.length >= 5) {
-            String docPath = paths[CACHE_INDEX_OPT_DOCS_URI];
-            int i = 4;
-            while (i < paths.length) {
-                Path jarPath = new Path(paths[i++]);
-
-                attributes = null;
-                if (docPath.length() > 0) {
-                    attributes = new IClasspathAttribute[] {
-                        JavaCore.newClasspathAttribute(
-                                IClasspathAttribute.JAVADOC_LOCATION_ATTRIBUTE_NAME, docPath)
-                    };
-                }
-
-                IClasspathEntry entry = JavaCore.newLibraryEntry(
-                        jarPath,
-                        null, // source attachment path
-                        null, // default source attachment root path.
-                        null,
-                        attributes,
-                        false // not exported.
-                        );
-                list.add(entry);
-            }
-        }
-
-        if (apiURL != null) {
-            ProjectHelper.saveStringProperty(root, PROPERTY_ANDROID_API, apiURL);
-        }
-        if (androidSrc != null && target != null) {
-            ProjectHelper.saveStringProperty(root, getAndroidSourceProperty(target),
-                    androidSrc.toOSString());
-        }
-        return list.toArray(new IClasspathEntry[list.size()]);
-    }
-
-    private static Bundle getSourceBundle() {
-        String bundleId = System.getProperty(COM_ANDROID_IDE_ECLIPSE_ADT_SOURCE,
-                COM_ANDROID_IDE_ECLIPSE_ADT_SOURCE);
-        Bundle bundle = Platform.getBundle(bundleId);
-        return bundle;
-    }
-
-    private static String getAndroidSourceProperty(IAndroidTarget target) {
-        if (target == null) {
-            return null;
-        }
-        String androidSourceProperty = PROPERTY_ANDROID_SOURCE + "_"
-                + target.getVersion().getApiString();
-        return androidSourceProperty;
-    }
-
-    /**
-     * Cache results for testURL: Some are expensive to compute, and this is
-     * called repeatedly (perhaps for each open project)
-     */
-    private static final Map<String, Boolean> sRecentUrlValidCache =
-            Maps.newHashMapWithExpectedSize(4);
-
-    @SuppressWarnings("resource") // Eclipse does not handle Closeables#closeQuietly
-    private static boolean testURL(String androidApiURL) {
-        Boolean cached = sRecentUrlValidCache.get(androidApiURL);
-        if (cached != null) {
-            return cached.booleanValue();
-        }
-        boolean valid = false;
-        InputStream is = null;
-        try {
-            URL testURL = new URL(androidApiURL);
-            URLConnection connection = testURL.openConnection();
-            // Only try for 5 seconds (though some implementations ignore this flag)
-            connection.setConnectTimeout(5000);
-            connection.setReadTimeout(5000);
-            is = connection.getInputStream();
-            valid = true;
-        } catch (Exception ignore) {
-        } finally {
-            Closeables.closeQuietly(is);
-        }
-
-        sRecentUrlValidCache.put(androidApiURL, valid);
-
-        return valid;
-    }
-
-    /**
-     * Checks the projects' caches. If the cache was valid, the project is removed from the list.
-     * @param projects the list of projects to check.
-     */
-    public static void checkProjectsCache(ArrayList<IJavaProject> projects) {
-        Sdk currentSdk = Sdk.getCurrent();
-        int i = 0;
-        projectLoop: while (i < projects.size()) {
-            IJavaProject javaProject = projects.get(i);
-            IProject iProject = javaProject.getProject();
-
-            // check if the project is opened
-            if (iProject.isOpen() == false) {
-                // remove from the list
-                // we do not increment i in this case.
-                projects.remove(i);
-
-                continue;
-            }
-
-            // project that have been resolved before the sdk was loaded
-            // will have a ProjectState where the IAndroidTarget is null
-            // so we load the target now that the SDK is loaded.
-            IAndroidTarget target = currentSdk.loadTargetAndBuildTools(
-                    Sdk.getProjectState(iProject));
-            if (target == null) {
-                // this is really not supposed to happen. This would mean there are cached paths,
-                // but project.properties was deleted. Keep the project in the list to force
-                // a resolve which will display the error.
-                i++;
-                continue;
-            }
-
-            String[] targetPaths = getTargetPaths(target);
-
-            // now get the cached paths
-            String cache = ProjectHelper.loadStringProperty(iProject, PROPERTY_CONTAINER_CACHE);
-            if (cache == null) {
-                // this should not happen. We'll force resolve again anyway.
-                i++;
-                continue;
-            }
-
-            String[] cachedPaths = cache.split(Pattern.quote(PATH_SEPARATOR));
-            if (cachedPaths.length < 3 || cachedPaths.length == 4) {
-                // paths length is wrong. simply resolve the project again
-                i++;
-                continue;
-            }
-
-            // Now we compare the paths. The first 4 can be compared directly.
-            // because of case sensitiveness we need to use File objects
-
-            if (targetPaths.length != cachedPaths.length) {
-                // different paths, force resolve again.
-                i++;
-                continue;
-            }
-
-            // compare the main paths (android.jar, main sources, main javadoc)
-            if (new File(targetPaths[CACHE_INDEX_JAR]).equals(
-                            new File(cachedPaths[CACHE_INDEX_JAR])) == false ||
-                    new File(targetPaths[CACHE_INDEX_SRC]).equals(
-                            new File(cachedPaths[CACHE_INDEX_SRC])) == false ||
-                    new File(targetPaths[CACHE_INDEX_DOCS_URI]).equals(
-                            new File(cachedPaths[CACHE_INDEX_DOCS_URI])) == false) {
-                // different paths, force resolve again.
-                i++;
-                continue;
-            }
-
-            if (cachedPaths.length > CACHE_INDEX_OPT_DOCS_URI) {
-                // compare optional libraries javadoc
-                if (new File(targetPaths[CACHE_INDEX_OPT_DOCS_URI]).equals(
-                        new File(cachedPaths[CACHE_INDEX_OPT_DOCS_URI])) == false) {
-                    // different paths, force resolve again.
-                    i++;
-                    continue;
-                }
-
-                // testing the optional jar files is a little bit trickier.
-                // The order is not guaranteed to be identical.
-                // From a previous test, we do know however that there is the same number.
-                // The number of libraries should be low enough that we can simply go through the
-                // lists manually.
-                targetLoop: for (int tpi = 4 ; tpi < targetPaths.length; tpi++) {
-                    String targetPath = targetPaths[tpi];
-
-                    // look for a match in the other array
-                    for (int cpi = 4 ; cpi < cachedPaths.length; cpi++) {
-                        if (new File(targetPath).equals(new File(cachedPaths[cpi]))) {
-                            // found a match. Try the next targetPath
-                            continue targetLoop;
-                        }
-                    }
-
-                    // if we stop here, we haven't found a match, which means there's a
-                    // discrepancy in the libraries. We force a resolve.
-                    i++;
-                    continue projectLoop;
-                }
-            }
-
-            // at the point the check passes, and we can remove the project from the list.
-            // we do not increment i in this case.
-            projects.remove(i);
-        }
-    }
-
-    /**
-     * Returns the paths necessary to create the {@link IClasspathEntry} for this targets.
-     * <p/>The paths are always in the same order.
-     * <ul>
-     * <li>Path to android.jar</li>
-     * <li>Path to the source code for android.jar</li>
-     * <li>Path to the javadoc for the android platform</li>
-     * </ul>
-     * Additionally, if there are optional libraries, the array will contain:
-     * <ul>
-     * <li>Path to the libraries javadoc</li>
-     * <li>Path to the first .jar file</li>
-     * <li>(more .jar as needed)</li>
-     * </ul>
-     */
-    private static String[] getTargetPaths(IAndroidTarget target) {
-        ArrayList<String> paths = new ArrayList<String>();
-
-        // first, we get the path for android.jar
-        // The order is: android.jar, source folder, docs folder
-        paths.add(target.getPath(IAndroidTarget.ANDROID_JAR));
-        paths.add(target.getPath(IAndroidTarget.SOURCES));
-        paths.add(AdtPlugin.getUrlDoc());
-
-        // now deal with optional libraries.
-        IOptionalLibrary[] libraries = target.getOptionalLibraries();
-        if (libraries != null) {
-            // all the optional libraries use the same javadoc, so we start with this
-            String targetDocPath = target.getPath(IAndroidTarget.DOCS);
-            if (targetDocPath != null) {
-                paths.add(ProjectHelper.getJavaDocPath(targetDocPath));
-            } else {
-                // we add an empty string, to always have the same count.
-                paths.add("");
-            }
-
-            // because different libraries could use the same jar file, we make sure we add
-            // each jar file only once.
-            HashSet<String> visitedJars = new HashSet<String>();
-            for (IOptionalLibrary library : libraries) {
-                String jarPath = library.getJarPath();
-                if (visitedJars.contains(jarPath) == false) {
-                    visitedJars.add(jarPath);
-                    paths.add(jarPath);
-                }
-            }
-        }
-
-        return paths.toArray(new String[paths.size()]);
-    }
-
-    @Override
-    public boolean canUpdateClasspathContainer(IPath containerPath, IJavaProject project) {
-        return true;
-    }
-
-    @Override
-    public void requestClasspathContainerUpdate(IPath containerPath, IJavaProject project,
-            IClasspathContainer containerSuggestion) throws CoreException {
-        AdtPlugin plugin = AdtPlugin.getDefault();
-
-        synchronized (Sdk.getLock()) {
-            boolean sdkIsLoaded = plugin.getSdkLoadStatus() == LoadStatus.LOADED;
-
-            // check if the project has a valid target.
-            IAndroidTarget target = null;
-            if (sdkIsLoaded) {
-                target = Sdk.getCurrent().getTarget(project.getProject());
-            }
-            if (sdkIsLoaded && target != null) {
-                String[] paths = getTargetPaths(target);
-                IPath android_lib = new Path(paths[CACHE_INDEX_JAR]);
-                IClasspathEntry[] entries = containerSuggestion.getClasspathEntries();
-                for (int i = 0; i < entries.length; i++) {
-                    IClasspathEntry entry = entries[i];
-                    if (entry.getEntryKind() == IClasspathEntry.CPE_LIBRARY) {
-                        IPath entryPath = entry.getPath();
-
-                        if (entryPath != null) {
-                            if (entryPath.equals(android_lib)) {
-                                IPath entrySrcPath = entry.getSourceAttachmentPath();
-                                IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
-                                if (entrySrcPath != null) {
-                                    ProjectHelper.saveStringProperty(root,
-                                            getAndroidSourceProperty(target),
-                                            entrySrcPath.toString());
-                                } else {
-                                    ProjectHelper.saveStringProperty(root,
-                                            getAndroidSourceProperty(target), null);
-                                }
-                                IClasspathAttribute[] extraAttributtes = entry.getExtraAttributes();
-                                if (extraAttributtes.length == 0) {
-                                    ProjectHelper.saveStringProperty(root, PROPERTY_ANDROID_API,
-                                            NULL_API_URL);
-                                }
-                                for (int j = 0; j < extraAttributtes.length; j++) {
-                                    IClasspathAttribute extraAttribute = extraAttributtes[j];
-                                    String value = extraAttribute.getValue();
-                                    if ((value == null || value.trim().length() == 0)
-                                            && IClasspathAttribute.JAVADOC_LOCATION_ATTRIBUTE_NAME
-                                                    .equals(extraAttribute.getName())) {
-                                        value = NULL_API_URL;
-                                    }
-                                    if (IClasspathAttribute.JAVADOC_LOCATION_ATTRIBUTE_NAME
-                                            .equals(extraAttribute.getName())) {
-                                        ProjectHelper.saveStringProperty(root,
-                                                PROPERTY_ANDROID_API, value);
-
-                                    }
-                                }
-                            }
-                        }
-                    }
-                }
-                rebindClasspathEntries(project.getJavaModel(), containerPath);
-            }
-        }
-    }
-
-    private static void rebindClasspathEntries(IJavaModel model, IPath containerPath)
-            throws JavaModelException {
-        ArrayList<IJavaProject> affectedProjects = new ArrayList<IJavaProject>();
-
-        IJavaProject[] projects = model.getJavaProjects();
-        for (int i = 0; i < projects.length; i++) {
-            IJavaProject project = projects[i];
-            IClasspathEntry[] entries = project.getRawClasspath();
-            for (int k = 0; k < entries.length; k++) {
-                IClasspathEntry curr = entries[k];
-                if (curr.getEntryKind() == IClasspathEntry.CPE_CONTAINER
-                        && containerPath.equals(curr.getPath())) {
-                    affectedProjects.add(project);
-                }
-            }
-        }
-        if (!affectedProjects.isEmpty()) {
-            IJavaProject[] affected = affectedProjects
-                    .toArray(new IJavaProject[affectedProjects.size()]);
-            updateProjects(affected);
-        }
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/project/AndroidClasspathContainerPage.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/project/AndroidClasspathContainerPage.java
deleted file mode 100644
index b027650..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/project/AndroidClasspathContainerPage.java
+++ /dev/null
@@ -1,200 +0,0 @@
-/*
- * Copyright (C) 2010 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.project;
-
-import com.android.ide.eclipse.adt.AdtConstants;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.jdt.core.IClasspathEntry;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.JavaCore;
-import org.eclipse.jdt.internal.ui.dialogs.StatusInfo;
-import org.eclipse.jdt.internal.ui.dialogs.StatusUtil;
-import org.eclipse.jdt.ui.wizards.IClasspathContainerPage;
-import org.eclipse.jdt.ui.wizards.IClasspathContainerPageExtension;
-import org.eclipse.jface.wizard.WizardPage;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Combo;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Label;
-
-import java.util.Arrays;
-
-public class AndroidClasspathContainerPage extends WizardPage implements IClasspathContainerPage,
-        IClasspathContainerPageExtension {
-
-    private IProject mOwnerProject;
-
-    private String mLibsProjectName;
-
-    private Combo mProjectsCombo;
-
-    private IStatus mCurrStatus;
-
-    private boolean mPageVisible;
-
-    public AndroidClasspathContainerPage() {
-        super("AndroidClasspathContainerPage"); //$NON-NLS-1$
-        mPageVisible = false;
-        mCurrStatus = new StatusInfo();
-        setTitle("Android Libraries");
-        setDescription("This container manages classpath entries for Android container");
-    }
-
-    @Override
-    public IClasspathEntry getSelection() {
-        IPath path = new Path(AdtConstants.CONTAINER_FRAMEWORK);
-
-        final int index = this.mProjectsCombo.getSelectionIndex();
-        if (index != -1) {
-            final String selectedProjectName = this.mProjectsCombo.getItem(index);
-
-            if (this.mOwnerProject == null
-                    || !selectedProjectName.equals(this.mOwnerProject.getName())) {
-                path = path.append(selectedProjectName);
-            }
-        }
-
-        return JavaCore.newContainerEntry(path);
-    }
-
-    @Override
-    public void setSelection(final IClasspathEntry cpentry) {
-        final IPath path = cpentry == null ? null : cpentry.getPath();
-
-        if (path == null || path.segmentCount() == 1) {
-            if (this.mOwnerProject != null) {
-                this.mLibsProjectName = this.mOwnerProject.getName();
-            }
-        } else {
-            this.mLibsProjectName = path.segment(1);
-        }
-    }
-
-    @Override
-    public void createControl(final Composite parent) {
-        final Composite composite = new Composite(parent, SWT.NONE);
-        composite.setLayout(new GridLayout(2, false));
-
-        final Label label = new Label(composite, SWT.NONE);
-        label.setText("Project:");
-
-        final String[] androidProjects = getAndroidProjects();
-
-        this.mProjectsCombo = new Combo(composite, SWT.READ_ONLY);
-        this.mProjectsCombo.setItems(androidProjects);
-
-        final int index;
-
-        if (this.mOwnerProject != null) {
-            index = indexOf(androidProjects, this.mLibsProjectName);
-        } else {
-            if (this.mProjectsCombo.getItemCount() > 0) {
-                index = 0;
-            } else {
-                index = -1;
-            }
-        }
-
-        if (index != -1) {
-            this.mProjectsCombo.select(index);
-        }
-
-        final GridData gd = new GridData();
-        gd.grabExcessHorizontalSpace = true;
-        gd.minimumWidth = 100;
-
-        this.mProjectsCombo.setLayoutData(gd);
-
-        setControl(composite);
-    }
-
-    @Override
-    public boolean finish() {
-        return true;
-    }
-
-    @Override
-    public void setVisible(boolean visible) {
-        super.setVisible(visible);
-        mPageVisible = visible;
-        // policy: wizards are not allowed to come up with an error message
-        if (visible && mCurrStatus.matches(IStatus.ERROR)) {
-            StatusInfo status = new StatusInfo();
-            status.setError(""); //$NON-NLS-1$
-            mCurrStatus = status;
-        }
-        updateStatus(mCurrStatus);
-    }
-
-    /**
-     * Updates the status line and the OK button according to the given status
-     *
-     * @param status status to apply
-     */
-    protected void updateStatus(IStatus status) {
-        mCurrStatus = status;
-        setPageComplete(!status.matches(IStatus.ERROR));
-        if (mPageVisible) {
-            StatusUtil.applyToStatusLine(this, status);
-        }
-    }
-
-    /**
-     * Updates the status line and the OK button according to the status
-     * evaluate from an array of status. The most severe error is taken. In case
-     * that two status with the same severity exists, the status with lower
-     * index is taken.
-     *
-     * @param status the array of status
-     */
-    protected void updateStatus(IStatus[] status) {
-        updateStatus(StatusUtil.getMostSevere(status));
-    }
-
-    @Override
-    public void initialize(final IJavaProject project, final IClasspathEntry[] currentEntries) {
-        this.mOwnerProject = (project == null ? null : project.getProject());
-    }
-
-    private static String[] getAndroidProjects() {
-        IProject[] projects = ResourcesPlugin.getWorkspace().getRoot().getProjects();
-        final String[] names = new String[projects.length];
-        for (int i = 0; i < projects.length; i++) {
-            names[i] = projects[i].getName();
-        }
-        Arrays.sort(names);
-        return names;
-    }
-
-    private static int indexOf(final String[] array, final String str) {
-        for (int i = 0; i < array.length; i++) {
-            if (array[i].equals(str)) {
-                return i;
-            }
-        }
-        return -1;
-    }
-
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/project/AndroidExportNature.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/project/AndroidExportNature.java
deleted file mode 100644
index 218cffe..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/project/AndroidExportNature.java
+++ /dev/null
@@ -1,96 +0,0 @@
-/*
- * Copyright (C) 2010 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.project;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IProjectNature;
-import org.eclipse.core.runtime.CoreException;
-
-/**
- * Project nature for the Android Export Projects.
- */
-public class AndroidExportNature implements IProjectNature {
-
-    /** the project this nature object is associated with */
-    private IProject mProject;
-
-    /**
-     * Configures this nature for its project. This is called by the workspace
-     * when natures are added to the project using
-     * <code>IProject.setDescription</code> and should not be called directly
-     * by clients. The nature extension id is added to the list of natures
-     * before this method is called, and need not be added here.
-     *
-     * Exceptions thrown by this method will be propagated back to the caller of
-     * <code>IProject.setDescription</code>, but the nature will remain in
-     * the project description.
-     *
-     * @see org.eclipse.core.resources.IProjectNature#configure()
-     * @throws CoreException if configuration fails.
-     */
-    @Override
-    public void configure() throws CoreException {
-        // nothing to do.
-    }
-
-    /**
-     * De-configures this nature for its project. This is called by the
-     * workspace when natures are removed from the project using
-     * <code>IProject.setDescription</code> and should not be called directly
-     * by clients. The nature extension id is removed from the list of natures
-     * before this method is called, and need not be removed here.
-     *
-     * Exceptions thrown by this method will be propagated back to the caller of
-     * <code>IProject.setDescription</code>, but the nature will still be
-     * removed from the project description.
-     *
-     * The Android nature removes the custom pre builder and APK builder.
-     *
-     * @see org.eclipse.core.resources.IProjectNature#deconfigure()
-     * @throws CoreException if configuration fails.
-     */
-    @Override
-    public void deconfigure() throws CoreException {
-        // nothing to do
-    }
-
-    /**
-     * Returns the project to which this project nature applies.
-     *
-     * @return the project handle
-     * @see org.eclipse.core.resources.IProjectNature#getProject()
-     */
-    @Override
-    public IProject getProject() {
-        return mProject;
-    }
-
-    /**
-     * Sets the project to which this nature applies. Used when instantiating
-     * this project nature runtime. This is called by
-     * <code>IProject.create()</code> or
-     * <code>IProject.setDescription()</code> and should not be called
-     * directly by clients.
-     *
-     * @param project the project to which this nature applies
-     * @see org.eclipse.core.resources.IProjectNature#setProject(org.eclipse.core.resources.IProject)
-     */
-    @Override
-    public void setProject(IProject project) {
-        mProject = project;
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/project/AndroidManifestHelper.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/project/AndroidManifestHelper.java
deleted file mode 100644
index eaa3096..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/project/AndroidManifestHelper.java
+++ /dev/null
@@ -1,203 +0,0 @@
-/*
- * Copyright (C) 2007 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.project;
-
-import com.android.ide.common.xml.AndroidManifestParser;
-import com.android.ide.common.xml.ManifestData;
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.ide.eclipse.adt.internal.project.XmlErrorHandler.XmlErrorListener;
-import com.android.ide.eclipse.adt.io.IFileWrapper;
-import com.android.io.FileWrapper;
-import com.android.io.IAbstractFile;
-import com.android.io.StreamException;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.jdt.core.IJavaProject;
-import org.xml.sax.SAXException;
-
-import java.io.FileNotFoundException;
-import java.io.IOException;
-
-import javax.xml.parsers.ParserConfigurationException;
-
-public class AndroidManifestHelper {
-
-    /**
-     * Parses the Android Manifest, and returns an object containing the result of the parsing.
-     * <p/>
-     * This method can also gather XML error during the parsing. This is done by using an
-     * {@link XmlErrorHandler} to mark the files in case of error, as well as a given
-     * {@link XmlErrorListener}. To use a different error handler, consider using
-     * {@link AndroidManifestParser#parse(IAbstractFile, boolean, com.android.sdklib.xml.AndroidManifestParser.ManifestErrorHandler)}
-     * directly.
-     *
-     * @param manifestFile the {@link IFile} representing the manifest file.
-     * @param gatherData indicates whether the parsing will extract data from the manifest. If null,
-     * the method will always return null.
-     * @param errorListener an optional error listener. If non null, then the parser will also
-     * look for XML errors.
-     * @return an {@link ManifestData} or null if the parsing failed.
-     * @throws ParserConfigurationException
-     * @throws StreamException
-     * @throws IOException
-     * @throws SAXException
-     */
-    public static ManifestData parseUnchecked(
-            IAbstractFile manifestFile,
-            boolean gatherData,
-            XmlErrorListener errorListener) throws SAXException, IOException,
-            StreamException, ParserConfigurationException {
-        if (manifestFile != null) {
-            IFile eclipseFile = null;
-            if (manifestFile instanceof IFileWrapper) {
-                eclipseFile = ((IFileWrapper)manifestFile).getIFile();
-            }
-            XmlErrorHandler errorHandler = null;
-            if (errorListener != null) {
-                errorHandler = new XmlErrorHandler(eclipseFile, errorListener);
-            }
-
-            return AndroidManifestParser.parse(manifestFile, gatherData, errorHandler);
-        }
-
-        return null;
-    }
-
-    /**
-     * Parses the Android Manifest, and returns an object containing the result of the parsing.
-     * <p/>
-     * This method can also gather XML error during the parsing. This is done by using an
-     * {@link XmlErrorHandler} to mark the files in case of error, as well as a given
-     * {@link XmlErrorListener}. To use a different error handler, consider using
-     * {@link AndroidManifestParser#parse(IAbstractFile, boolean, com.android.sdklib.xml.AndroidManifestParser.ManifestErrorHandler)}
-     * directly.
-     *
-     * @param manifestFile the {@link IFile} representing the manifest file.
-     * @param gatherData indicates whether the parsing will extract data from the manifest. If null,
-     * the method will always return null.
-     * @param errorListener an optional error listener. If non null, then the parser will also
-     * look for XML errors.
-     * @return an {@link ManifestData} or null if the parsing failed.
-     */
-    public static ManifestData parse(
-            IAbstractFile manifestFile,
-            boolean gatherData,
-            XmlErrorListener errorListener) {
-        try {
-            return parseUnchecked(manifestFile, gatherData, errorListener);
-        } catch (ParserConfigurationException e) {
-            AdtPlugin.logAndPrintError(e, AndroidManifestHelper.class.getCanonicalName(),
-                    "Bad parser configuration for %s: %s",
-                    manifestFile.getOsLocation(),
-                    e.getMessage());
-        } catch (SAXException e) {
-            AdtPlugin.logAndPrintError(e, AndroidManifestHelper.class.getCanonicalName(),
-                    "Parser exception for %s: %s",
-                    manifestFile.getOsLocation(),
-                    e.getMessage());
-        } catch (IOException e) {
-            // Don't log a console error when failing to read a non-existing file
-            if (!(e instanceof FileNotFoundException)) {
-                AdtPlugin.logAndPrintError(e, AndroidManifestHelper.class.getCanonicalName(),
-                        "I/O error for %s: %s",
-                        manifestFile.getOsLocation(),
-                        e.getMessage());
-            }
-        } catch (StreamException e) {
-            AdtPlugin.logAndPrintError(e, AndroidManifestHelper.class.getCanonicalName(),
-                    "Unable to read %s: %s",
-                    manifestFile.getOsLocation(),
-                    e.getMessage());
-        }
-
-        return null;
-    }
-
-    /**
-     * Parses the Android Manifest for a given project, and returns an object containing
-     * the result of the parsing.
-     * <p/>
-     * This method can also gather XML error during the parsing. This is done by using an
-     * {@link XmlErrorHandler} to mark the files in case of error, as well as a given
-     * {@link XmlErrorListener}. To use a different error handler, consider using
-     * {@link AndroidManifestParser#parse(IAbstractFile, boolean, com.android.sdklib.xml.AndroidManifestParser.ManifestErrorHandler)}
-     * directly.
-     *
-     * @param javaProject the project containing the manifest to parse.
-     * @param gatherData indicates whether the parsing will extract data from the manifest. If null,
-     * the method will always return null.
-     * @param errorListener an optional error listener. If non null, then the parser will also
-     * look for XML errors.
-     * @return an {@link ManifestData} or null if the parsing failed.
-     */
-    public static ManifestData parse(
-            IJavaProject javaProject,
-            boolean gatherData,
-            XmlErrorListener errorListener) {
-
-        IFile manifestFile = ProjectHelper.getManifest(javaProject.getProject());
-        if (manifestFile != null) {
-            return parse(new IFileWrapper(manifestFile), gatherData, errorListener);
-        }
-
-        return null;
-    }
-
-    /**
-     * Parses the manifest file only for error check.
-     * @param manifestFile The manifest file to parse.
-     * @param errorListener the {@link XmlErrorListener} object being notified of the presence
-     * of errors.
-     */
-    public static void parseForError(IFile manifestFile, XmlErrorListener errorListener) {
-        parse(new IFileWrapper(manifestFile), false, errorListener);
-    }
-
-    /**
-     * Parses the manifest file, and collects data.
-     * @param manifestFile The manifest file to parse.
-     * @return an {@link ManifestData} or null if the parsing failed.
-     */
-    public static ManifestData parseForData(IFile manifestFile) {
-        return parse(new IFileWrapper(manifestFile), true, null);
-    }
-
-    /**
-     * Parses the manifest file, and collects data.
-     * @param project the project containing the manifest.
-     * @return an {@link AndroidManifestHelper} or null if the parsing failed.
-     */
-    public static ManifestData parseForData(IProject project) {
-        IFile manifestFile = ProjectHelper.getManifest(project);
-        if (manifestFile != null) {
-            return parse(new IFileWrapper(manifestFile), true, null);
-        }
-
-        return null;
-    }
-
-    /**
-     * Parses the manifest file, and collects data.
-     *
-     * @param osManifestFilePath The OS path of the manifest file to parse.
-     * @return an {@link AndroidManifestHelper} or null if the parsing failed.
-     */
-    public static ManifestData parseForData(String osManifestFilePath) {
-        return parse(new FileWrapper(osManifestFilePath), true, null);
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/project/AndroidNature.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/project/AndroidNature.java
deleted file mode 100644
index 3b1c29f..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/project/AndroidNature.java
+++ /dev/null
@@ -1,299 +0,0 @@
-/*
- * Copyright (C) 2007 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.project;
-
-import com.android.ide.eclipse.adt.AdtConstants;
-import com.android.ide.eclipse.adt.internal.build.builders.PostCompilerBuilder;
-import com.android.ide.eclipse.adt.internal.build.builders.PreCompilerBuilder;
-import com.android.ide.eclipse.adt.internal.build.builders.ResourceManagerBuilder;
-
-import org.eclipse.core.resources.ICommand;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IProjectDescription;
-import org.eclipse.core.resources.IProjectNature;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.core.runtime.SubProgressMonitor;
-import org.eclipse.jdt.core.JavaCore;
-
-/**
- * Project nature for the Android Projects.
- */
-public class AndroidNature implements IProjectNature {
-
-    /** the project this nature object is associated with */
-    private IProject mProject;
-
-    /**
-     * Configures this nature for its project. This is called by the workspace
-     * when natures are added to the project using
-     * <code>IProject.setDescription</code> and should not be called directly
-     * by clients. The nature extension id is added to the list of natures
-     * before this method is called, and need not be added here.
-     *
-     * Exceptions thrown by this method will be propagated back to the caller of
-     * <code>IProject.setDescription</code>, but the nature will remain in
-     * the project description.
-     *
-     * The Android nature adds the pre-builder and the APK builder if necessary.
-     *
-     * @see org.eclipse.core.resources.IProjectNature#configure()
-     * @throws CoreException if configuration fails.
-     */
-    @Override
-    public void configure() throws CoreException {
-        configureResourceManagerBuilder(mProject);
-        configurePreBuilder(mProject);
-        configureApkBuilder(mProject);
-    }
-
-    /**
-     * De-configures this nature for its project. This is called by the
-     * workspace when natures are removed from the project using
-     * <code>IProject.setDescription</code> and should not be called directly
-     * by clients. The nature extension id is removed from the list of natures
-     * before this method is called, and need not be removed here.
-     *
-     * Exceptions thrown by this method will be propagated back to the caller of
-     * <code>IProject.setDescription</code>, but the nature will still be
-     * removed from the project description.
-     *
-     * The Android nature removes the custom pre builder and APK builder.
-     *
-     * @see org.eclipse.core.resources.IProjectNature#deconfigure()
-     * @throws CoreException if configuration fails.
-     */
-    @Override
-    public void deconfigure() throws CoreException {
-        // remove the android builders
-        removeBuilder(mProject, ResourceManagerBuilder.ID);
-        removeBuilder(mProject, PreCompilerBuilder.ID);
-        removeBuilder(mProject, PostCompilerBuilder.ID);
-    }
-
-    /**
-     * Returns the project to which this project nature applies.
-     *
-     * @return the project handle
-     * @see org.eclipse.core.resources.IProjectNature#getProject()
-     */
-    @Override
-    public IProject getProject() {
-        return mProject;
-    }
-
-    /**
-     * Sets the project to which this nature applies. Used when instantiating
-     * this project nature runtime. This is called by
-     * <code>IProject.create()</code> or
-     * <code>IProject.setDescription()</code> and should not be called
-     * directly by clients.
-     *
-     * @param project the project to which this nature applies
-     * @see org.eclipse.core.resources.IProjectNature#setProject(org.eclipse.core.resources.IProject)
-     */
-    @Override
-    public void setProject(IProject project) {
-        mProject = project;
-    }
-
-    /**
-     * Adds the Android Nature and the Java Nature to the project if it doesn't
-     * already have them.
-     *
-     * @param project An existing or new project to update
-     * @param monitor An optional progress monitor. Can be null.
-     * @param addAndroidNature true if the Android Nature should be added to the project; false to
-     * add only the Java nature.
-     * @throws CoreException if fails to change the nature.
-     */
-    public static synchronized void setupProjectNatures(IProject project,
-            IProgressMonitor monitor, boolean addAndroidNature) throws CoreException {
-        if (project == null || !project.isOpen()) return;
-        if (monitor == null) monitor = new NullProgressMonitor();
-
-        // Add the natures. We need to add the Java nature first, so it adds its builder to the
-        // project first. This way, when the android nature is added, we can control where to put
-        // the android builders in relation to the java builder.
-        // Adding the java nature after the android one, would place the java builder before the
-        // android builders.
-        addNatureToProjectDescription(project, JavaCore.NATURE_ID, monitor);
-        if (addAndroidNature) {
-            addNatureToProjectDescription(project, AdtConstants.NATURE_DEFAULT, monitor);
-        }
-    }
-
-    /**
-     * Add the specified nature to the specified project. The nature is only
-     * added if not already present.
-     * <p/>
-     * Android Natures are always inserted at the beginning of the list of natures in order to
-     * have the jdt views/dialogs display the proper icon.
-     *
-     * @param project The project to modify.
-     * @param natureId The Id of the nature to add.
-     * @param monitor An existing progress monitor.
-     * @throws CoreException if fails to change the nature.
-     */
-    private static void addNatureToProjectDescription(IProject project,
-            String natureId, IProgressMonitor monitor) throws CoreException {
-        if (!project.hasNature(natureId)) {
-
-            IProjectDescription description = project.getDescription();
-            String[] natures = description.getNatureIds();
-            String[] newNatures = new String[natures.length + 1];
-
-            // Android natures always come first.
-            if (natureId.equals(AdtConstants.NATURE_DEFAULT)) {
-                System.arraycopy(natures, 0, newNatures, 1, natures.length);
-                newNatures[0] = natureId;
-            } else {
-                System.arraycopy(natures, 0, newNatures, 0, natures.length);
-                newNatures[natures.length] = natureId;
-            }
-
-            description.setNatureIds(newNatures);
-            project.setDescription(description, new SubProgressMonitor(monitor, 10));
-        }
-    }
-
-    /**
-     * Adds the ResourceManagerBuilder, if its not already there. It'll insert
-     * itself as the first builder.
-     * @throws CoreException
-     *
-     */
-    public static void configureResourceManagerBuilder(IProject project)
-            throws CoreException {
-        // get the builder list
-        IProjectDescription desc = project.getDescription();
-        ICommand[] commands = desc.getBuildSpec();
-
-        // look for the builder in case it's already there.
-        for (int i = 0; i < commands.length; ++i) {
-            if (ResourceManagerBuilder.ID.equals(commands[i].getBuilderName())) {
-                return;
-            }
-        }
-
-        // it's not there, lets add it at the beginning of the builders
-        ICommand[] newCommands = new ICommand[commands.length + 1];
-        System.arraycopy(commands, 0, newCommands, 1, commands.length);
-        ICommand command = desc.newCommand();
-        command.setBuilderName(ResourceManagerBuilder.ID);
-        newCommands[0] = command;
-        desc.setBuildSpec(newCommands);
-        project.setDescription(desc, null);
-    }
-
-    /**
-     * Adds the PreCompilerBuilder if its not already there. It'll check for
-     * presence of the ResourceManager and insert itself right after.
-     * @param project
-     * @throws CoreException
-     */
-    public static void configurePreBuilder(IProject project)
-            throws CoreException {
-        // get the builder list
-        IProjectDescription desc = project.getDescription();
-        ICommand[] commands = desc.getBuildSpec();
-
-        // look for the builder in case it's already there.
-        for (int i = 0; i < commands.length; ++i) {
-            if (PreCompilerBuilder.ID.equals(commands[i].getBuilderName())) {
-                return;
-            }
-        }
-
-        // we need to add it after the resource manager builder.
-        // Let's look for it
-        int index = -1;
-        for (int i = 0; i < commands.length; ++i) {
-            if (ResourceManagerBuilder.ID.equals(commands[i].getBuilderName())) {
-                index = i;
-                break;
-            }
-        }
-
-        // we're inserting after
-        index++;
-
-        // do the insertion
-
-        // copy the builders before.
-        ICommand[] newCommands = new ICommand[commands.length + 1];
-        System.arraycopy(commands, 0, newCommands, 0, index);
-
-        // insert the new builder
-        ICommand command = desc.newCommand();
-        command.setBuilderName(PreCompilerBuilder.ID);
-        newCommands[index] = command;
-
-        // copy the builder after
-        System.arraycopy(commands, index, newCommands, index + 1, commands.length-index);
-
-        // set the new builders in the project
-        desc.setBuildSpec(newCommands);
-        project.setDescription(desc, null);
-    }
-
-    public static void configureApkBuilder(IProject project)
-            throws CoreException {
-        // Add the .apk builder at the end if it's not already there
-        IProjectDescription desc = project.getDescription();
-        ICommand[] commands = desc.getBuildSpec();
-
-        for (int i = 0; i < commands.length; ++i) {
-            if (PostCompilerBuilder.ID.equals(commands[i].getBuilderName())) {
-                return;
-            }
-        }
-
-        ICommand[] newCommands = new ICommand[commands.length + 1];
-        System.arraycopy(commands, 0, newCommands, 0, commands.length);
-        ICommand command = desc.newCommand();
-        command.setBuilderName(PostCompilerBuilder.ID);
-        newCommands[commands.length] = command;
-        desc.setBuildSpec(newCommands);
-        project.setDescription(desc, null);
-    }
-
-    /**
-     * Removes a builder from the project.
-     * @param project The project to remove the builder from.
-     * @param id The String ID of the builder to remove.
-     * @return true if the builder was found and removed.
-     * @throws CoreException
-     */
-    public static boolean removeBuilder(IProject project, String id) throws CoreException {
-        IProjectDescription description = project.getDescription();
-        ICommand[] commands = description.getBuildSpec();
-        for (int i = 0; i < commands.length; ++i) {
-            if (id.equals(commands[i].getBuilderName())) {
-                ICommand[] newCommands = new ICommand[commands.length - 1];
-                System.arraycopy(commands, 0, newCommands, 0, i);
-                System.arraycopy(commands, i + 1, newCommands, i, commands.length - i - 1);
-                description.setBuildSpec(newCommands);
-                project.setDescription(description, null);
-                return true;
-            }
-        }
-
-        return false;
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/project/ApkInstallManager.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/project/ApkInstallManager.java
deleted file mode 100644
index 9039146..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/project/ApkInstallManager.java
+++ /dev/null
@@ -1,278 +0,0 @@
-/*
- * Copyright (C) 2009 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.project;
-
-import com.android.ddmlib.AndroidDebugBridge;
-import com.android.ddmlib.AndroidDebugBridge.IDebugBridgeChangeListener;
-import com.android.ddmlib.AndroidDebugBridge.IDeviceChangeListener;
-import com.android.ddmlib.IDevice;
-import com.android.ddmlib.MultiLineReceiver;
-import com.android.ide.eclipse.adt.internal.resources.manager.GlobalProjectMonitor;
-import com.android.ide.eclipse.adt.internal.resources.manager.GlobalProjectMonitor.IProjectListener;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.IPath;
-
-import java.util.HashSet;
-import java.util.Iterator;
-
-/**
- * Registers which apk was installed on which device.
- * <p/>
- * The goal of this class is to remember the installation of APKs on devices, and provide
- * information about whether a new APK should be installed on a device prior to running the
- * application from a launch configuration.
- * <p/>
- * The manager uses {@link IProject} and {@link IDevice} to identify the target device and the
- * (project generating the) APK. This ensures that disconnected and reconnected devices will
- * always receive new APKs (since the version may not match).
- * <p/>
- * This is a singleton. To get the instance, use {@link #getInstance()}
- */
-public final class ApkInstallManager {
-
-    private final static ApkInstallManager sThis = new ApkInstallManager();
-
-    /**
-     * Internal struct to associate a project and a device.
-     */
-    private final static class ApkInstall {
-        public ApkInstall(IProject project, String packageName, IDevice device) {
-            this.project = project;
-            this.packageName = packageName;
-            this.device = device;
-        }
-
-        @Override
-        public boolean equals(Object obj) {
-            if (obj instanceof ApkInstall) {
-                ApkInstall apkObj = (ApkInstall)obj;
-
-                return (device == apkObj.device && project.equals(apkObj.project) &&
-                        packageName.equals(apkObj.packageName));
-            }
-
-            return false;
-        }
-
-        @Override
-        public int hashCode() {
-            return (device.getSerialNumber() + project.getName() + packageName).hashCode();
-        }
-
-        final IProject project;
-        final String packageName;
-        final IDevice device;
-    }
-
-    /**
-     * Receiver and parser for the "pm path package" command.
-     */
-    private final static class PmReceiver extends MultiLineReceiver {
-        boolean foundPackage = false;
-        @Override
-        public void processNewLines(String[] lines) {
-            // if the package if found, then pm will show a line starting with "package:/"
-            if (foundPackage == false) { // just in case this is called several times for multilines
-                for (String line : lines) {
-                    if (line.startsWith("package:/")) {
-                        foundPackage = true;
-                        break;
-                    }
-                }
-            }
-        }
-
-        @Override
-        public boolean isCancelled() {
-            return false;
-        }
-    }
-
-    /**
-     * Hashset of the list of installed package. Hashset used to ensure we don't re-add new
-     * objects for the same app.
-     */
-    private final HashSet<ApkInstall> mInstallList = new HashSet<ApkInstall>();
-
-    public static ApkInstallManager getInstance() {
-        return sThis;
-    }
-
-    /**
-     * Registers an installation of <var>project</var> onto <var>device</var>
-     * @param project The project that was installed.
-     * @param packageName the package name of the apk
-     * @param device The device that received the installation.
-     */
-    public void registerInstallation(IProject project, String packageName, IDevice device) {
-        synchronized (mInstallList) {
-            mInstallList.add(new ApkInstall(project, packageName, device));
-        }
-    }
-
-    /**
-     * Returns whether a <var>project</var> was installed on the <var>device</var>.
-     * @param project the project that may have been installed.
-     * @param device the device that may have received the installation.
-     * @return
-     */
-    public boolean isApplicationInstalled(IProject project, String packageName, IDevice device) {
-        synchronized (mInstallList) {
-            ApkInstall found = null;
-            for (ApkInstall install : mInstallList) {
-                if (project.equals(install.project) && packageName.equals(install.packageName) &&
-                        device == install.device) {
-                    found = install;
-                    break;
-                }
-            }
-
-            // check the app is still installed.
-            if (found != null) {
-                try {
-                    PmReceiver receiver = new PmReceiver();
-                    found.device.executeShellCommand("pm path " + packageName, receiver);
-                    if (receiver.foundPackage == false) {
-                        mInstallList.remove(found);
-                    }
-
-                    return receiver.foundPackage;
-                } catch (Exception e) {
-                    // failed to query pm? force reinstall.
-                    return false;
-                }
-            }
-        }
-        return false;
-    }
-
-    /**
-     * Resets registered installations for a specific {@link IProject}.
-     * <p/>This ensures that {@link #isApplicationInstalled(IProject, IDevice)} will always return
-     * <code>null</code> for this specified project, for any device.
-     * @param project the project for which to reset all installations.
-     */
-    public void resetInstallationFor(IProject project) {
-        synchronized (mInstallList) {
-            Iterator<ApkInstall> iterator = mInstallList.iterator();
-            while (iterator.hasNext()) {
-                ApkInstall install = iterator.next();
-                if (install.project.equals(project)) {
-                    iterator.remove();
-                }
-            }
-        }
-    }
-
-    private ApkInstallManager() {
-        AndroidDebugBridge.addDeviceChangeListener(mDeviceChangeListener);
-        AndroidDebugBridge.addDebugBridgeChangeListener(mDebugBridgeListener);
-        GlobalProjectMonitor.getMonitor().addProjectListener(mProjectListener);
-    }
-
-    private IDebugBridgeChangeListener mDebugBridgeListener = new IDebugBridgeChangeListener() {
-        /**
-         * Responds to a bridge change by clearing the full installation list.
-         *
-         * @see IDebugBridgeChangeListener#bridgeChanged(AndroidDebugBridge)
-         */
-        @Override
-        public void bridgeChanged(AndroidDebugBridge bridge) {
-            // the bridge changed, there is no way to know which IDevice will be which.
-            // We reset everything
-            synchronized (mInstallList) {
-                mInstallList.clear();
-            }
-        }
-    };
-
-    private IDeviceChangeListener mDeviceChangeListener = new IDeviceChangeListener() {
-        /**
-         * Responds to a device being disconnected by removing all installations related
-         * to this device.
-         *
-         * @see IDeviceChangeListener#deviceDisconnected(IDevice)
-         */
-        @Override
-        public void deviceDisconnected(IDevice device) {
-            synchronized (mInstallList) {
-                Iterator<ApkInstall> iterator = mInstallList.iterator();
-                while (iterator.hasNext()) {
-                    ApkInstall install = iterator.next();
-                    if (install.device == device) {
-                        iterator.remove();
-                    }
-                }
-            }
-        }
-
-        @Override
-        public void deviceChanged(IDevice device, int changeMask) {
-            // nothing to do.
-        }
-
-        @Override
-        public void deviceConnected(IDevice device) {
-            // nothing to do.
-        }
-    };
-
-    private IProjectListener mProjectListener = new IProjectListener() {
-        /**
-         * Responds to a closed project by resetting all its installation.
-         *
-         * @see IProjectListener#projectClosed(IProject)
-         */
-        @Override
-        public void projectClosed(IProject project) {
-            resetInstallationFor(project);
-        }
-
-        /**
-         * Responds to a deleted project by resetting all its installation.
-         *
-         * @see IProjectListener#projectDeleted(IProject)
-         */
-        @Override
-        public void projectDeleted(IProject project) {
-            resetInstallationFor(project);
-        }
-
-        @Override
-        public void projectOpened(IProject project) {
-            // nothing to do.
-        }
-
-        @Override
-        public void projectOpenedWithWorkspace(IProject project) {
-            // nothing to do.
-        }
-
-        @Override
-        public void allProjectsOpenedWithWorkspace() {
-            // nothing to do.
-        }
-
-        @Override
-        public void projectRenamed(IProject project, IPath from) {
-            // project renaming also triggers delete/open events so
-            // there's nothing to do here (since delete will remove
-            // whatever's linked to the project from the list).
-        }
-    };
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/project/BaseClasspathContainerInitializer.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/project/BaseClasspathContainerInitializer.java
deleted file mode 100644
index a58f27d..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/project/BaseClasspathContainerInitializer.java
+++ /dev/null
@@ -1,103 +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.ide.eclipse.adt.internal.project;
-
-import com.android.ide.eclipse.adt.AdtPlugin;
-
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.core.runtime.jobs.Job;
-import org.eclipse.jdt.core.ClasspathContainerInitializer;
-
-/**
- * Base CPC initializer providing support to all our initializer.
- *
- */
-abstract class BaseClasspathContainerInitializer extends ClasspathContainerInitializer {
-
-
-    /**
-     * Adds an error to a project, or remove all markers if error message is null
-     * @param project the project to modify
-     * @param errorMessage the errorMessage or null to remove errors.
-     * @param markerType the marker type to be used.
-     * @param outputToConsole whether to output to the console.
-     */
-    protected static void processError(final IProject project, final String errorMessage,
-            final String markerType, boolean outputToConsole) {
-        if (errorMessage != null) {
-            // log the error and put the marker on the project if we can.
-            if (outputToConsole) {
-                AdtPlugin.printErrorToConsole(project, errorMessage);
-            }
-
-            // Use a job to prevent requiring a workspace lock in this thread.
-            final String fmessage = errorMessage;
-            Job markerJob = new Job("Android SDK: Resolving error markers") {
-                @Override
-                protected IStatus run(IProgressMonitor monitor) {
-                    try {
-                        BaseProjectHelper.markProject(project,
-                                markerType,
-                                fmessage, IMarker.SEVERITY_ERROR,
-                                IMarker.PRIORITY_HIGH);
-                    } catch (CoreException e2) {
-                        AdtPlugin.log(e2, null);
-                        // Don't return e2.getStatus(); the job control will then produce
-                        // a popup with this error, which isn't very interesting for the
-                        // user.
-                    }
-
-                    return Status.OK_STATUS;
-                }
-            };
-
-            // build jobs are run after other interactive jobs
-            markerJob.setPriority(Job.BUILD);
-            markerJob.setRule(ResourcesPlugin.getWorkspace().getRoot());
-            markerJob.schedule();
-        } else {
-            // Use a job to prevent requiring a workspace lock in this thread.
-            Job markerJob = new Job("Android SDK: Resolving error markers") {
-                @Override
-                protected IStatus run(IProgressMonitor monitor) {
-                    try {
-                        if (project.isAccessible()) {
-                            project.deleteMarkers(markerType, true,
-                                    IResource.DEPTH_INFINITE);
-                        }
-                    } catch (CoreException e2) {
-                        AdtPlugin.log(e2, null);
-                    }
-
-                    return Status.OK_STATUS;
-                }
-            };
-
-            // build jobs are run after other interactive jobs
-            markerJob.setPriority(Job.BUILD);
-            markerJob.setRule(ResourcesPlugin.getWorkspace().getRoot());
-            markerJob.schedule();
-        }
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/project/BaseProjectHelper.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/project/BaseProjectHelper.java
deleted file mode 100644
index 57632ea..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/project/BaseProjectHelper.java
+++ /dev/null
@@ -1,527 +0,0 @@
-/*
- * Copyright (C) 2007 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.project;
-
-import com.android.SdkConstants;
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-import com.android.ide.eclipse.adt.AdtConstants;
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.google.common.collect.Lists;
-
-import org.eclipse.core.resources.IFolder;
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IWorkspaceRoot;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.jdt.core.Flags;
-import org.eclipse.jdt.core.IClasspathEntry;
-import org.eclipse.jdt.core.IJavaModel;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.IMethod;
-import org.eclipse.jdt.core.IType;
-import org.eclipse.jdt.core.ITypeHierarchy;
-import org.eclipse.jdt.core.JavaCore;
-import org.eclipse.jdt.core.JavaModelException;
-import org.eclipse.jdt.ui.JavaUI;
-import org.eclipse.jdt.ui.actions.OpenJavaPerspectiveAction;
-import org.eclipse.jface.text.BadLocationException;
-import org.eclipse.jface.text.IDocument;
-import org.eclipse.jface.text.IRegion;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.texteditor.IDocumentProvider;
-import org.eclipse.ui.texteditor.ITextEditor;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * Utility methods to manipulate projects.
- */
-public final class BaseProjectHelper {
-
-    public static final String TEST_CLASS_OK = null;
-
-    /**
-     * Project filter to be used with {@link BaseProjectHelper#getAndroidProjects(IProjectFilter)}.
-     */
-    public static interface IProjectFilter {
-        boolean accept(IProject project);
-    }
-
-    /**
-     * returns a list of source classpath for a specified project
-     * @param javaProject
-     * @return a list of path relative to the workspace root.
-     */
-    @NonNull
-    public static List<IPath> getSourceClasspaths(IJavaProject javaProject) {
-        List<IPath> sourceList = Lists.newArrayList();
-        IClasspathEntry[] classpaths = javaProject.readRawClasspath();
-        if (classpaths != null) {
-            for (IClasspathEntry e : classpaths) {
-                if (e.getEntryKind() == IClasspathEntry.CPE_SOURCE) {
-                    sourceList.add(e.getPath());
-                }
-            }
-        }
-
-        return sourceList;
-    }
-
-    /**
-     * returns a list of source classpath for a specified project
-     * @param project
-     * @return a list of path relative to the workspace root.
-     */
-    public static List<IPath> getSourceClasspaths(IProject project) {
-        IJavaProject javaProject = JavaCore.create(project);
-        return getSourceClasspaths(javaProject);
-    }
-
-    /**
-     * Adds a marker to a file on a specific line. This methods catches thrown
-     * {@link CoreException}, and returns null instead.
-     * @param resource the resource to be marked
-     * @param markerId The id of the marker to add.
-     * @param message the message associated with the mark
-     * @param lineNumber the line number where to put the mark. If line is < 1, it puts the marker
-     * on line 1,
-     * @param severity the severity of the marker.
-     * @return the IMarker that was added or null if it failed to add one.
-     */
-    public final static IMarker markResource(IResource resource, String markerId,
-            String message, int lineNumber, int severity) {
-        return markResource(resource, markerId, message, lineNumber, -1, -1, severity);
-    }
-
-    /**
-     * Adds a marker to a file on a specific line, for a specific range of text. This
-     * methods catches thrown {@link CoreException}, and returns null instead.
-     *
-     * @param resource the resource to be marked
-     * @param markerId The id of the marker to add.
-     * @param message the message associated with the mark
-     * @param lineNumber the line number where to put the mark. If line is < 1, it puts
-     *            the marker on line 1,
-     * @param startOffset the beginning offset of the marker (relative to the beginning of
-     *            the document, not the line), or -1 for no range
-     * @param endOffset the ending offset of the marker
-     * @param severity the severity of the marker.
-     * @return the IMarker that was added or null if it failed to add one.
-     */
-    @Nullable
-    public final static IMarker markResource(IResource resource, String markerId,
-                String message, int lineNumber, int startOffset, int endOffset, int severity) {
-        if (!resource.isAccessible()) {
-            return null;
-        }
-
-        try {
-            IMarker marker = resource.createMarker(markerId);
-            marker.setAttribute(IMarker.MESSAGE, message);
-            marker.setAttribute(IMarker.SEVERITY, severity);
-
-            // if marker is text type, enforce a line number so that it shows in the editor
-            // somewhere (line 1)
-            if (lineNumber < 1 && marker.isSubtypeOf(IMarker.TEXT)) {
-                lineNumber = 1;
-            }
-
-            if (lineNumber >= 1) {
-                marker.setAttribute(IMarker.LINE_NUMBER, lineNumber);
-            }
-
-            if (startOffset != -1) {
-                marker.setAttribute(IMarker.CHAR_START, startOffset);
-                marker.setAttribute(IMarker.CHAR_END, endOffset);
-            }
-
-            // on Windows, when adding a marker to a project, it takes a refresh for the marker
-            // to show. In order to fix this we're forcing a refresh of elements receiving
-            // markers (and only the element, not its children), to force the marker display.
-            resource.refreshLocal(IResource.DEPTH_ZERO, new NullProgressMonitor());
-
-            return marker;
-        } catch (CoreException e) {
-            AdtPlugin.log(e, "Failed to add marker '%1$s' to '%2$s'", //$NON-NLS-1$
-                    markerId, resource.getFullPath());
-        }
-
-        return null;
-    }
-
-    /**
-     * Adds a marker to a resource. This methods catches thrown {@link CoreException},
-     * and returns null instead.
-     * @param resource the file to be marked
-     * @param markerId The id of the marker to add.
-     * @param message the message associated with the mark
-     * @param severity the severity of the marker.
-     * @return the IMarker that was added or null if it failed to add one.
-     */
-    @Nullable
-    public final static IMarker markResource(IResource resource, String markerId,
-            String message, int severity) {
-        return markResource(resource, markerId, message, -1, severity);
-    }
-
-    /**
-     * Adds a marker to an {@link IProject}. This method does not catch {@link CoreException}, like
-     * {@link #markResource(IResource, String, String, int)}.
-     *
-     * @param project the project to be marked
-     * @param markerId The id of the marker to add.
-     * @param message the message associated with the mark
-     * @param severity the severity of the marker.
-     * @param priority the priority of the marker
-     * @return the IMarker that was added.
-     * @throws CoreException if the marker cannot be added
-     */
-    @Nullable
-    public final static IMarker markProject(IProject project, String markerId,
-            String message, int severity, int priority) throws CoreException {
-        if (!project.isAccessible()) {
-            return null;
-        }
-
-        IMarker marker = project.createMarker(markerId);
-        marker.setAttribute(IMarker.MESSAGE, message);
-        marker.setAttribute(IMarker.SEVERITY, severity);
-        marker.setAttribute(IMarker.PRIORITY, priority);
-
-        // on Windows, when adding a marker to a project, it takes a refresh for the marker
-        // to show. In order to fix this we're forcing a refresh of elements receiving
-        // markers (and only the element, not its children), to force the marker display.
-        project.refreshLocal(IResource.DEPTH_ZERO, new NullProgressMonitor());
-
-        return marker;
-    }
-
-    /**
-     * Tests that a class name is valid for usage in the manifest.
-     * <p/>
-     * This tests the class existence, that it can be instantiated (ie it must not be abstract,
-     * nor non static if enclosed), and that it extends the proper super class (not necessarily
-     * directly)
-     * @param javaProject the {@link IJavaProject} containing the class.
-     * @param className the fully qualified name of the class to test.
-     * @param superClassName the fully qualified name of the expected super class.
-     * @param testVisibility if <code>true</code>, the method will check the visibility of the class
-     * or of its constructors.
-     * @return {@link #TEST_CLASS_OK} or an error message.
-     */
-    public final static String testClassForManifest(IJavaProject javaProject, String className,
-            String superClassName, boolean testVisibility) {
-        try {
-            // replace $ by .
-            String javaClassName = className.replaceAll("\\$", "\\."); //$NON-NLS-1$ //$NON-NLS-2$
-
-            // look for the IType object for this class
-            IType type = javaProject.findType(javaClassName);
-            if (type != null && type.exists()) {
-                // test that the class is not abstract
-                int flags = type.getFlags();
-                if (Flags.isAbstract(flags)) {
-                    return String.format("%1$s is abstract", className);
-                }
-
-                // test whether the class is public or not.
-                if (testVisibility && Flags.isPublic(flags) == false) {
-                    // if its not public, it may have a public default constructor,
-                    // which would then be fine.
-                    IMethod basicConstructor = type.getMethod(type.getElementName(), new String[0]);
-                    if (basicConstructor != null && basicConstructor.exists()) {
-                        int constructFlags = basicConstructor.getFlags();
-                        if (Flags.isPublic(constructFlags) == false) {
-                            return String.format(
-                                    "%1$s or its default constructor must be public for the system to be able to instantiate it",
-                                    className);
-                        }
-                    } else {
-                        return String.format(
-                                "%1$s must be public, or the system will not be able to instantiate it.",
-                                className);
-                    }
-                }
-
-                // If it's enclosed, test that it's static. If its declaring class is enclosed
-                // as well, test that it is also static, and public.
-                IType declaringType = type;
-                do {
-                    IType tmpType = declaringType.getDeclaringType();
-                    if (tmpType != null) {
-                        if (tmpType.exists()) {
-                            flags = declaringType.getFlags();
-                            if (Flags.isStatic(flags) == false) {
-                                return String.format("%1$s is enclosed, but not static",
-                                        declaringType.getFullyQualifiedName());
-                            }
-
-                            flags = tmpType.getFlags();
-                            if (testVisibility && Flags.isPublic(flags) == false) {
-                                return String.format("%1$s is not public",
-                                        tmpType.getFullyQualifiedName());
-                            }
-                        } else {
-                            // if it doesn't exist, we need to exit so we may as well mark it null.
-                            tmpType = null;
-                        }
-                    }
-                    declaringType = tmpType;
-                } while (declaringType != null);
-
-                // test the class inherit from the specified super class.
-                // get the type hierarchy
-                ITypeHierarchy hierarchy = type.newSupertypeHierarchy(new NullProgressMonitor());
-
-                // if the super class is not the reference class, it may inherit from
-                // it so we get its supertype. At some point it will be null and we
-                // will stop
-                IType superType = type;
-                boolean foundProperSuperClass = false;
-                while ((superType = hierarchy.getSuperclass(superType)) != null &&
-                        superType.exists()) {
-                    if (superClassName.equals(superType.getFullyQualifiedName())) {
-                        foundProperSuperClass = true;
-                    }
-                }
-
-                // didn't find the proper superclass? return false.
-                if (foundProperSuperClass == false) {
-                    return String.format("%1$s does not extend %2$s", className, superClassName);
-                }
-
-                return TEST_CLASS_OK;
-            } else {
-                return String.format("Class %1$s does not exist", className);
-            }
-        } catch (JavaModelException e) {
-            return String.format("%1$s: %2$s", className, e.getMessage());
-        }
-    }
-
-    /**
-     * Returns the {@link IJavaProject} for a {@link IProject} object.
-     * <p/>
-     * This checks if the project has the Java Nature first.
-     * @param project
-     * @return the IJavaProject or null if the project couldn't be created or if the project
-     * does not have the Java Nature.
-     * @throws CoreException if this method fails. Reasons include:
-     * <ul><li>This project does not exist.</li><li>This project is not open.</li></ul>
-     */
-    public static IJavaProject getJavaProject(IProject project) throws CoreException {
-        if (project != null && project.hasNature(JavaCore.NATURE_ID)) {
-            return JavaCore.create(project);
-        }
-        return null;
-    }
-
-    /**
-     * Reveals a specific line in the source file defining a specified class,
-     * for a specific project.
-     * @param project
-     * @param className
-     * @param line
-     * @return true if the source was revealed
-     */
-    public static boolean revealSource(IProject project, String className, int line) {
-        // Inner classes are pointless: All we need is the enclosing type to find the file, and the
-        // line number.
-        // Since the anonymous ones will cause IJavaProject#findType to fail, we remove
-        // all of them.
-        int pos = className.indexOf('$');
-        if (pos != -1) {
-            className = className.substring(0, pos);
-        }
-
-        // get the java project
-        IJavaProject javaProject = JavaCore.create(project);
-
-        try {
-            // look for the IType matching the class name.
-            IType result = javaProject.findType(className);
-            if (result != null && result.exists()) {
-                // before we show the type in an editor window, we make sure the current
-                // workbench page has an editor area (typically the ddms perspective doesn't).
-                IWorkbench workbench = PlatformUI.getWorkbench();
-                IWorkbenchWindow window = workbench.getActiveWorkbenchWindow();
-                IWorkbenchPage page = window.getActivePage();
-                if (page.isEditorAreaVisible() == false) {
-                    // no editor area? we open the java perspective.
-                    new OpenJavaPerspectiveAction().run();
-                }
-
-                IEditorPart editor = JavaUI.openInEditor(result);
-                if (editor instanceof ITextEditor) {
-                    // get the text editor that was just opened.
-                    ITextEditor textEditor = (ITextEditor)editor;
-
-                    IEditorInput input = textEditor.getEditorInput();
-
-                    // get the location of the line to show.
-                    IDocumentProvider documentProvider = textEditor.getDocumentProvider();
-                    IDocument document = documentProvider.getDocument(input);
-                    IRegion lineInfo = document.getLineInformation(line - 1);
-
-                    // select and reveal the line.
-                    textEditor.selectAndReveal(lineInfo.getOffset(), lineInfo.getLength());
-                }
-
-                return true;
-            }
-        } catch (JavaModelException e) {
-        } catch (PartInitException e) {
-        } catch (BadLocationException e) {
-        }
-
-        return false;
-    }
-
-    /**
-     * Returns the list of android-flagged projects. This list contains projects that are opened
-     * in the workspace and that are flagged as android project (through the android nature)
-     * @param filter an optional filter to control which android project are returned. Can be null.
-     * @return an array of IJavaProject, which can be empty if no projects match.
-     */
-    public static @NonNull IJavaProject[] getAndroidProjects(@Nullable IProjectFilter filter) {
-        IWorkspaceRoot workspaceRoot = ResourcesPlugin.getWorkspace().getRoot();
-        IJavaModel javaModel = JavaCore.create(workspaceRoot);
-
-        return getAndroidProjects(javaModel, filter);
-    }
-
-    /**
-     * Returns the list of android-flagged projects for the specified java Model.
-     * This list contains projects that are opened in the workspace and that are flagged as android
-     * project (through the android nature)
-     * @param javaModel the Java Model object corresponding for the current workspace root.
-     * @param filter an optional filter to control which android project are returned. Can be null.
-     * @return an array of IJavaProject, which can be empty if no projects match.
-     */
-    @NonNull
-    public static IJavaProject[] getAndroidProjects(@NonNull IJavaModel javaModel,
-            @Nullable IProjectFilter filter) {
-        // get the java projects
-        IJavaProject[] javaProjectList = null;
-        try {
-            javaProjectList  = javaModel.getJavaProjects();
-        }
-        catch (JavaModelException jme) {
-            return new IJavaProject[0];
-        }
-
-        // temp list to build the android project array
-        ArrayList<IJavaProject> androidProjectList = new ArrayList<IJavaProject>();
-
-        // loop through the projects and add the android flagged projects to the temp list.
-        for (IJavaProject javaProject : javaProjectList) {
-            // get the workspace project object
-            IProject project = javaProject.getProject();
-
-            // check if it's an android project based on its nature
-            if (isAndroidProject(project)) {
-                if (filter == null || filter.accept(project)) {
-                    androidProjectList.add(javaProject);
-                }
-            }
-        }
-
-        // return the android projects list.
-        return androidProjectList.toArray(new IJavaProject[androidProjectList.size()]);
-    }
-
-    /**
-     * Returns true if the given project is an Android project (e.g. is a Java project
-     * that also has the Android nature)
-     *
-     * @param project the project to test
-     * @return true if the given project is an Android project
-     */
-    public static boolean isAndroidProject(IProject project) {
-        // check if it's an android project based on its nature
-        try {
-            return project.hasNature(AdtConstants.NATURE_DEFAULT);
-        } catch (CoreException e) {
-            // this exception, thrown by IProject.hasNature(), means the project either doesn't
-            // exist or isn't opened. So, in any case we just skip it (the exception will
-            // bypass the ArrayList.add()
-        }
-
-        return false;
-    }
-
-    /**
-     * Returns the {@link IFolder} representing the output for the project for Android specific
-     * files.
-     * <p>
-     * The project must be a java project and be opened, or the method will return null.
-     * @param project the {@link IProject}
-     * @return an IFolder item or null.
-     */
-    public final static IFolder getJavaOutputFolder(IProject project) {
-        try {
-            if (project.isOpen() && project.hasNature(JavaCore.NATURE_ID)) {
-                // get a java project from the normal project object
-                IJavaProject javaProject = JavaCore.create(project);
-
-                IPath path = javaProject.getOutputLocation();
-                path = path.removeFirstSegments(1);
-                return project.getFolder(path);
-            }
-        } catch (JavaModelException e) {
-            // Let's do nothing and return null
-        } catch (CoreException e) {
-            // Let's do nothing and return null
-        }
-        return null;
-    }
-
-    /**
-     * Returns the {@link IFolder} representing the output for the project for compiled Java
-     * files.
-     * <p>
-     * The project must be a java project and be opened, or the method will return null.
-     * @param project the {@link IProject}
-     * @return an IFolder item or null.
-     */
-    @Nullable
-    public final static IFolder getAndroidOutputFolder(IProject project) {
-        try {
-            if (project.isOpen() && project.hasNature(JavaCore.NATURE_ID)) {
-                return project.getFolder(SdkConstants.FD_OUTPUT);
-            }
-        } catch (JavaModelException e) {
-            // Let's do nothing and return null
-        } catch (CoreException e) {
-            // Let's do nothing and return null
-        }
-        return null;
-    }
-
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/project/ExportHelper.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/project/ExportHelper.java
deleted file mode 100644
index 56e0c09..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/project/ExportHelper.java
+++ /dev/null
@@ -1,448 +0,0 @@
-/*
- * 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.project;
-
-import static com.android.sdklib.internal.project.ProjectProperties.PROPERTY_SDK;
-
-import com.android.SdkConstants;
-import com.android.ide.eclipse.adt.AdtConstants;
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.ide.eclipse.adt.AndroidPrintStream;
-import com.android.ide.eclipse.adt.internal.build.BuildHelper;
-import com.android.ide.eclipse.adt.internal.build.DexException;
-import com.android.ide.eclipse.adt.internal.build.NativeLibInJarException;
-import com.android.ide.eclipse.adt.internal.build.ProguardExecException;
-import com.android.ide.eclipse.adt.internal.build.ProguardResultException;
-import com.android.ide.eclipse.adt.internal.preferences.AdtPrefs;
-import com.android.ide.eclipse.adt.internal.sdk.ProjectState;
-import com.android.ide.eclipse.adt.internal.sdk.Sdk;
-import com.android.ide.eclipse.adt.io.IFileWrapper;
-import com.android.sdklib.BuildToolInfo;
-import com.android.sdklib.build.ApkCreationException;
-import com.android.sdklib.build.DuplicateFileException;
-import com.android.sdklib.internal.project.ProjectProperties;
-import com.android.tools.lint.detector.api.LintUtils;
-import com.android.xml.AndroidManifest;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IFolder;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IncrementalProjectBuilder;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.core.runtime.jobs.Job;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.JavaCore;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.FileDialog;
-import org.eclipse.swt.widgets.Shell;
-
-import java.io.BufferedInputStream;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.OutputStream;
-import java.security.PrivateKey;
-import java.security.cert.X509Certificate;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.List;
-import java.util.jar.JarEntry;
-import java.util.jar.JarOutputStream;
-
-/**
- * Export helper to export release version of APKs.
- */
-public final class ExportHelper {
-    private static final String HOME_PROPERTY = "user.home";                    //$NON-NLS-1$
-    private static final String HOME_PROPERTY_REF = "${" + HOME_PROPERTY + '}'; //$NON-NLS-1$
-    private static final String SDK_PROPERTY_REF = "${" + PROPERTY_SDK + '}';   //$NON-NLS-1$
-    private final static String TEMP_PREFIX = "android_";                       //$NON-NLS-1$
-
-    /**
-     * Exports a release version of the application created by the given project.
-     * @param project the project to export
-     * @param outputFile the file to write
-     * @param key the key to used for signing. Can be null.
-     * @param certificate the certificate used for signing. Can be null.
-     * @param monitor progress monitor
-     * @throws CoreException if an error occurs
-     */
-    public static void exportReleaseApk(IProject project, File outputFile, PrivateKey key,
-            X509Certificate certificate, IProgressMonitor monitor) throws CoreException {
-
-        // the export, takes the output of the precompiler & Java builders so it's
-        // important to call build in case the auto-build option of the workspace is disabled.
-        // Also enable dependency building to make sure everything is up to date.
-        // However do not package the APK since we're going to do it manually here, using a
-        // different output location.
-        ProjectHelper.compileInReleaseMode(project, monitor);
-
-        // if either key or certificate is null, ensure the other is null.
-        if (key == null) {
-            certificate = null;
-        } else if (certificate == null) {
-            key = null;
-        }
-
-        try {
-            // check if the manifest declares debuggable as true. While this is a release build,
-            // debuggable in the manifest will override this and generate a debug build
-            IResource manifestResource = project.findMember(SdkConstants.FN_ANDROID_MANIFEST_XML);
-            if (manifestResource.getType() != IResource.FILE) {
-                throw new CoreException(new Status(IStatus.ERROR, AdtPlugin.PLUGIN_ID,
-                        String.format("%1$s missing.", SdkConstants.FN_ANDROID_MANIFEST_XML)));
-            }
-
-            IFileWrapper manifestFile = new IFileWrapper((IFile) manifestResource);
-            boolean debugMode = AndroidManifest.getDebuggable(manifestFile);
-
-            AndroidPrintStream fakeStream = new AndroidPrintStream(null, null, new OutputStream() {
-                @Override
-                public void write(int b) throws IOException {
-                    // do nothing
-                }
-            });
-
-            ProjectState projectState = Sdk.getProjectState(project);
-
-            // get the jumbo mode option
-            String forceJumboStr = projectState.getProperty(AdtConstants.DEX_OPTIONS_FORCEJUMBO);
-            Boolean jumbo = Boolean.valueOf(forceJumboStr);
-
-            String dexMergerStr = projectState.getProperty(AdtConstants.DEX_OPTIONS_DISABLE_MERGER);
-            Boolean dexMerger = Boolean.valueOf(dexMergerStr);
-
-            BuildToolInfo buildToolInfo = getBuildTools(projectState);
-
-            BuildHelper helper = new BuildHelper(
-                    projectState,
-                    buildToolInfo,
-                    fakeStream, fakeStream,
-                    jumbo.booleanValue(),
-                    dexMerger.booleanValue(),
-                    debugMode, false /*verbose*/,
-                    null /*resourceMarker*/);
-
-            // get the list of library projects
-            List<IProject> libProjects = projectState.getFullLibraryProjects();
-
-            // Step 1. Package the resources.
-
-            // tmp file for the packaged resource file. To not disturb the incremental builders
-            // output, all intermediary files are created in tmp files.
-            File resourceFile = File.createTempFile(TEMP_PREFIX, SdkConstants.DOT_RES);
-            resourceFile.deleteOnExit();
-
-            // Make sure the PNG crunch cache is up to date
-            helper.updateCrunchCache();
-
-            // get the merged manifest
-            IFolder androidOutputFolder = BaseProjectHelper.getAndroidOutputFolder(project);
-            IFile mergedManifestFile = androidOutputFolder.getFile(
-                    SdkConstants.FN_ANDROID_MANIFEST_XML);
-
-
-            // package the resources.
-            helper.packageResources(
-                    mergedManifestFile,
-                    libProjects,
-                    null,   // res filter
-                    0,      // versionCode
-                    resourceFile.getParent(),
-                    resourceFile.getName());
-
-            // Step 2. Convert the byte code to Dalvik bytecode
-
-            // tmp file for the packaged resource file.
-            File dexFile = File.createTempFile(TEMP_PREFIX, SdkConstants.DOT_DEX);
-            dexFile.deleteOnExit();
-
-            ProjectState state = Sdk.getProjectState(project);
-            String proguardConfig = state.getProperties().getProperty(
-                    ProjectProperties.PROPERTY_PROGUARD_CONFIG);
-
-            boolean runProguard = false;
-            List<File> proguardConfigFiles = null;
-            if (proguardConfig != null && proguardConfig.length() > 0) {
-                // Be tolerant with respect to file and path separators just like
-                // Ant is. Allow "/" in the property file to mean whatever the file
-                // separator character is:
-                if (File.separatorChar != '/' && proguardConfig.indexOf('/') != -1) {
-                    proguardConfig = proguardConfig.replace('/', File.separatorChar);
-                }
-
-                Iterable<String> paths = LintUtils.splitPath(proguardConfig);
-                for (String path : paths) {
-                    if (path.startsWith(SDK_PROPERTY_REF)) {
-                        path = AdtPrefs.getPrefs().getOsSdkFolder() +
-                                path.substring(SDK_PROPERTY_REF.length());
-                    } else if (path.startsWith(HOME_PROPERTY_REF)) {
-                        path = System.getProperty(HOME_PROPERTY) +
-                                path.substring(HOME_PROPERTY_REF.length());
-                    }
-                    File proguardConfigFile = new File(path);
-                    if (proguardConfigFile.isAbsolute() == false) {
-                        proguardConfigFile = new File(project.getLocation().toFile(), path);
-                    }
-                    if (proguardConfigFile.isFile()) {
-                        if (proguardConfigFiles == null) {
-                            proguardConfigFiles = new ArrayList<File>();
-                        }
-                        proguardConfigFiles.add(proguardConfigFile);
-                        runProguard = true;
-                    } else {
-                        throw new CoreException(new Status(IStatus.ERROR, AdtPlugin.PLUGIN_ID,
-                                "Invalid proguard configuration file path " + proguardConfigFile
-                                + " does not exist or is not a regular file", null));
-                    }
-                }
-
-                // get the proguard file output by aapt
-                if (proguardConfigFiles != null) {
-                    IFile proguardFile = androidOutputFolder.getFile(AdtConstants.FN_AAPT_PROGUARD);
-                    proguardConfigFiles.add(proguardFile.getLocation().toFile());
-                }
-            }
-
-            Collection<String> dxInput;
-
-            if (runProguard) {
-                // get all the compiled code paths. This will contain both project output
-                // folder and jar files.
-                Collection<String> paths = helper.getCompiledCodePaths();
-
-                // create a jar file containing all the project output (as proguard cannot
-                // process folders of .class files).
-                File inputJar = File.createTempFile(TEMP_PREFIX, SdkConstants.DOT_JAR);
-                inputJar.deleteOnExit();
-                JarOutputStream jos = new JarOutputStream(new FileOutputStream(inputJar));
-
-                // a list of the other paths (jar files.)
-                List<String> jars = new ArrayList<String>();
-
-                for (String path : paths) {
-                    File root = new File(path);
-                    if (root.isDirectory()) {
-                        addFileToJar(jos, root, root);
-                    } else if (root.isFile()) {
-                        jars.add(path);
-                    }
-                }
-                jos.close();
-
-                // destination file for proguard
-                File obfuscatedJar = File.createTempFile(TEMP_PREFIX, SdkConstants.DOT_JAR);
-                obfuscatedJar.deleteOnExit();
-
-                // run proguard
-                helper.runProguard(proguardConfigFiles, inputJar, jars, obfuscatedJar,
-                        new File(project.getLocation().toFile(), SdkConstants.FD_PROGUARD));
-
-                helper.setProguardOutput(obfuscatedJar.getAbsolutePath());
-
-                // dx input is proguard's output
-                dxInput = Collections.singletonList(obfuscatedJar.getAbsolutePath());
-            } else {
-                // no proguard, simply get all the compiled code path: project output(s) +
-                // jar file(s)
-                dxInput = helper.getCompiledCodePaths();
-            }
-
-            IJavaProject javaProject = JavaCore.create(project);
-
-            helper.executeDx(javaProject, dxInput, dexFile.getAbsolutePath());
-
-            // Step 3. Final package
-
-            helper.finalPackage(
-                    resourceFile.getAbsolutePath(),
-                    dexFile.getAbsolutePath(),
-                    outputFile.getAbsolutePath(),
-                    libProjects,
-                    key,
-                    certificate,
-                    null); //resourceMarker
-
-            // success!
-        } catch (CoreException e) {
-            throw e;
-        } catch (ProguardResultException e) {
-            String msg = String.format("Proguard returned with error code %d. See console",
-                    e.getErrorCode());
-            AdtPlugin.printErrorToConsole(project, msg);
-            AdtPlugin.printErrorToConsole(project, (Object[]) e.getOutput());
-            throw new CoreException(new Status(IStatus.ERROR, AdtPlugin.PLUGIN_ID,
-                    msg, e));
-        } catch (ProguardExecException e) {
-            String msg = String.format("Failed to run proguard: %s", e.getMessage());
-            AdtPlugin.printErrorToConsole(project, msg);
-            throw new CoreException(new Status(IStatus.ERROR, AdtPlugin.PLUGIN_ID,
-                    msg, e));
-        } catch (DuplicateFileException e) {
-            String msg = String.format(
-                    "Found duplicate file for APK: %1$s\nOrigin 1: %2$s\nOrigin 2: %3$s",
-                    e.getArchivePath(), e.getFile1(), e.getFile2());
-            AdtPlugin.printErrorToConsole(project, msg);
-            throw new CoreException(new Status(IStatus.ERROR, AdtPlugin.PLUGIN_ID,
-                    e.getMessage(), e));
-        } catch (NativeLibInJarException e) {
-            String msg = e.getMessage();
-
-            AdtPlugin.printErrorToConsole(project, msg);
-            AdtPlugin.printErrorToConsole(project, (Object[]) e.getAdditionalInfo());
-            throw new CoreException(new Status(IStatus.ERROR, AdtPlugin.PLUGIN_ID,
-                    e.getMessage(), e));
-        } catch (DexException e) {
-            throw new CoreException(new Status(IStatus.ERROR, AdtPlugin.PLUGIN_ID,
-                    e.getMessage(), e));
-        } catch (ApkCreationException e) {
-            throw new CoreException(new Status(IStatus.ERROR, AdtPlugin.PLUGIN_ID,
-                    e.getMessage(), e));
-        } catch (Exception e) {
-            throw new CoreException(new Status(IStatus.ERROR, AdtPlugin.PLUGIN_ID,
-                    "Failed to export application", e));
-        } finally {
-            // move back to a debug build.
-            // By using a normal build, we'll simply rebuild the debug version, and let the
-            // builder decide whether to build the full package or not.
-            ProjectHelper.buildWithDeps(project, IncrementalProjectBuilder.FULL_BUILD, monitor);
-            project.refreshLocal(IResource.DEPTH_INFINITE, monitor);
-        }
-    }
-
-    public static BuildToolInfo getBuildTools(ProjectState projectState)
-            throws CoreException {
-        BuildToolInfo buildToolInfo = projectState.getBuildToolInfo();
-        if (buildToolInfo == null) {
-            buildToolInfo = Sdk.getCurrent().getLatestBuildTool();
-        }
-
-        if (buildToolInfo == null) {
-            throw new CoreException(new Status(IStatus.ERROR, AdtPlugin.PLUGIN_ID,
-                    "No Build Tools installed in the SDK."));
-        }
-        return buildToolInfo;
-    }
-
-    /**
-     * Exports an unsigned release APK after prompting the user for a location.
-     *
-     * <strong>Must be called from the UI thread.</strong>
-     *
-     * @param project the project to export
-     */
-    public static void exportUnsignedReleaseApk(final IProject project) {
-        Shell shell = Display.getCurrent().getActiveShell();
-
-        // create a default file name for the apk.
-        String fileName = project.getName() + SdkConstants.DOT_ANDROID_PACKAGE;
-
-        // Pop up the file save window to get the file location
-        FileDialog fileDialog = new FileDialog(shell, SWT.SAVE);
-
-        fileDialog.setText("Export Project");
-        fileDialog.setFileName(fileName);
-
-        final String saveLocation = fileDialog.open();
-        if (saveLocation != null) {
-            new Job("Android Release Export") {
-                @Override
-                protected IStatus run(IProgressMonitor monitor) {
-                    try {
-                        exportReleaseApk(project,
-                                new File(saveLocation),
-                                null, //key
-                                null, //certificate
-                                monitor);
-
-                        // this is unsigned export. Let's tell the developers to run zip align
-                        AdtPlugin.displayWarning("Android IDE Plug-in", String.format(
-                                "An unsigned package of the application was saved at\n%1$s\n\n" +
-                                "Before publishing the application you will need to:\n" +
-                                "- Sign the application with your release key,\n" +
-                                "- run zipalign on the signed package. ZipAlign is located in <SDK>/tools/\n\n" +
-                                "Aligning applications allows Android to use application resources\n" +
-                                "more efficiently.", saveLocation));
-
-                        return Status.OK_STATUS;
-                    } catch (CoreException e) {
-                        AdtPlugin.displayError("Android IDE Plug-in", String.format(
-                                "Error exporting application:\n\n%1$s", e.getMessage()));
-                        return e.getStatus();
-                    }
-                }
-            }.schedule();
-        }
-    }
-
-    /**
-     * Adds a file to a jar file.
-     * The <var>rootDirectory</var> dictates the path of the file inside the jar file. It must be
-     * a parent of <var>file</var>.
-     * @param jar the jar to add the file to
-     * @param file the file to add
-     * @param rootDirectory the rootDirectory.
-     * @throws IOException
-     */
-    private static void addFileToJar(JarOutputStream jar, File file, File rootDirectory)
-            throws IOException {
-        if (file.isDirectory()) {
-            if (file.getName().equals("META-INF") == false) {
-                for (File child: file.listFiles()) {
-                    addFileToJar(jar, child, rootDirectory);
-                }
-            }
-        } else if (file.isFile()) {
-            String rootPath = rootDirectory.getAbsolutePath();
-            String path = file.getAbsolutePath();
-            path = path.substring(rootPath.length()).replace("\\", "/"); //$NON-NLS-1$ //$NON-NLS-2$
-            if (path.charAt(0) == '/') {
-                path = path.substring(1);
-            }
-
-            JarEntry entry = new JarEntry(path);
-            entry.setTime(file.lastModified());
-            jar.putNextEntry(entry);
-
-            // put the content of the file.
-            byte[] buffer = new byte[1024];
-            int count;
-            BufferedInputStream bis = null;
-            try {
-                bis = new BufferedInputStream(new FileInputStream(file));
-                while ((count = bis.read(buffer)) != -1) {
-                    jar.write(buffer, 0, count);
-                }
-            } finally {
-                if (bis != null) {
-                    try {
-                        bis.close();
-                    } catch (IOException ignore) {
-                    }
-                }
-            }
-            jar.closeEntry();
-        }
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/project/FixLaunchConfig.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/project/FixLaunchConfig.java
deleted file mode 100644
index e311bfb..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/project/FixLaunchConfig.java
+++ /dev/null
@@ -1,156 +0,0 @@
-/*
- * Copyright (C) 2007 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.project;
-
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.ide.eclipse.adt.internal.launch.LaunchConfigDelegate;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.debug.core.DebugPlugin;
-import org.eclipse.debug.core.ILaunchConfiguration;
-import org.eclipse.debug.core.ILaunchConfigurationType;
-import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
-import org.eclipse.debug.core.ILaunchManager;
-import org.eclipse.jdt.launching.IJavaLaunchConfigurationConstants;
-
-import java.util.ArrayList;
-
-/**
- * Class to fix the launch configuration of a project if the java package
- * defined in the manifest has been changed.<br>
- * This fix can be done synchronously, or asynchronously.<br>
- * <code>start()</code> will start a thread that will do the fix.<br>
- * <code>run()</code> will do the fix in the current thread.<br><br>
- * By default, the fix first display a dialog to the user asking if he/she wants to
- * do the fix. This can be overriden by calling <code>setDisplayPrompt(false)</code>.
- *
- */
-public class FixLaunchConfig extends Thread {
-
-    private IProject mProject;
-    private String mOldPackage;
-    private String mNewPackage;
-
-    private boolean mDisplayPrompt = true;
-
-    public FixLaunchConfig(IProject project, String oldPackage, String newPackage) {
-        super();
-
-        mProject = project;
-        mOldPackage = oldPackage;
-        mNewPackage = newPackage;
-    }
-
-    /**
-     * Set the display prompt. If true run()/start() first ask the user if he/she wants
-     * to fix the Launch Config
-     * @param displayPrompt
-     */
-    public void setDisplayPrompt(boolean displayPrompt) {
-        mDisplayPrompt = displayPrompt;
-    }
-
-    /**
-     * Fix the Launch configurations.
-     */
-    @Override
-    public void run() {
-
-        if (mDisplayPrompt) {
-            // ask the user if he really wants to fix the launch config
-            boolean res = AdtPlugin.displayPrompt(
-                    "Launch Configuration Update",
-                    "The package definition in the manifest changed.\nDo you want to update your Launch Configuration(s)?");
-
-            if (res == false) {
-                return;
-            }
-        }
-
-        // get the list of config for the project
-        String projectName = mProject.getName();
-        ILaunchConfiguration[] configs = findConfigs(mProject.getName());
-
-        // loop through all the config and update the package
-        for (ILaunchConfiguration config : configs) {
-            try {
-                // get the working copy so that we can make changes.
-                ILaunchConfigurationWorkingCopy copy = config.getWorkingCopy();
-
-                // get the attributes for the activity
-                String activity = config.getAttribute(LaunchConfigDelegate.ATTR_ACTIVITY,
-                        ""); //$NON-NLS-1$
-
-                // manifests can define activities that are not in the defined package,
-                // so we need to make sure the activity is inside the old package.
-                if (activity.startsWith(mOldPackage)) {
-                    // create the new activity
-                    activity = mNewPackage + activity.substring(mOldPackage.length());
-
-                    // put it in the copy
-                    copy.setAttribute(LaunchConfigDelegate.ATTR_ACTIVITY, activity);
-
-                    // save the config
-                    copy.doSave();
-                }
-            } catch (CoreException e) {
-                // couldn't get the working copy. we output the error in the console
-                String msg = String.format("Failed to modify %1$s: %2$s", projectName,
-                        e.getMessage());
-                AdtPlugin.printErrorToConsole(mProject, msg);
-            }
-        }
-
-    }
-
-    /**
-     * Looks for and returns all existing Launch Configuration object for a
-     * specified project.
-     * @param projectName The name of the project
-     * @return all the ILaunchConfiguration object. If none are present, an empty array is
-     * returned.
-     */
-    private static ILaunchConfiguration[] findConfigs(String projectName) {
-        // get the launch manager
-        ILaunchManager manager = DebugPlugin.getDefault().getLaunchManager();
-
-        // now get the config type for our particular android type.
-        ILaunchConfigurationType configType = manager.
-                getLaunchConfigurationType(LaunchConfigDelegate.ANDROID_LAUNCH_TYPE_ID);
-
-        // create a temp list to hold all the valid configs
-        ArrayList<ILaunchConfiguration> list = new ArrayList<ILaunchConfiguration>();
-
-        try {
-            ILaunchConfiguration[] configs = manager.getLaunchConfigurations(configType);
-
-            for (ILaunchConfiguration config : configs) {
-                if (config.getAttribute(
-                        IJavaLaunchConfigurationConstants.ATTR_PROJECT_NAME,
-                        "").equals(projectName)) {  //$NON-NLS-1$
-                    list.add(config);
-                }
-            }
-        } catch (CoreException e) {
-        }
-
-        return list.toArray(new ILaunchConfiguration[list.size()]);
-
-    }
-
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/project/FolderDecorator.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/project/FolderDecorator.java
deleted file mode 100644
index 054890f..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/project/FolderDecorator.java
+++ /dev/null
@@ -1,109 +0,0 @@
-/*
- * 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.project;
-
-import com.android.SdkConstants;
-import com.android.ide.eclipse.adt.AdtConstants;
-import com.android.ide.eclipse.adt.AdtPlugin;
-
-import org.eclipse.core.resources.IFolder;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.viewers.IDecoration;
-import org.eclipse.jface.viewers.ILabelDecorator;
-import org.eclipse.jface.viewers.ILabelProviderListener;
-import org.eclipse.jface.viewers.ILightweightLabelDecorator;
-
-/**
- * A {@link ILabelDecorator} associated with an org.eclipse.ui.decorators extension.
- * This is used to add android icons in some special folders in the package explorer.
- */
-public class FolderDecorator implements ILightweightLabelDecorator {
-
-    private ImageDescriptor mDescriptor;
-
-    public FolderDecorator() {
-        mDescriptor = AdtPlugin.getImageDescriptor("/icons/android_project.png"); //$NON-NLS-1$
-    }
-
-    @Override
-    public void decorate(Object element, IDecoration decoration) {
-        if (element instanceof IFolder) {
-            IFolder folder = (IFolder)element;
-
-            // get the project and make sure this is an android project
-            IProject project = folder.getProject();
-            if (project == null || !project.exists() || !folder.exists()) {
-                return;
-            }
-
-            try {
-                if (project.hasNature(AdtConstants.NATURE_DEFAULT)) {
-                    // check the folder is directly under the project.
-                    if (folder.getParent().getType() == IResource.PROJECT) {
-                        String name = folder.getName();
-                        if (name.equals(SdkConstants.FD_ASSETS)) {
-                            doDecoration(decoration, null);
-                        } else if (name.equals(SdkConstants.FD_RESOURCES)) {
-                            doDecoration(decoration, null);
-                        } else if (name.equals(SdkConstants.FD_GEN_SOURCES)) {
-                            doDecoration(decoration, " [Generated Java Files]");
-                        } else if (name.equals(SdkConstants.FD_NATIVE_LIBS)) {
-                            doDecoration(decoration, null);
-                        } else if (name.equals(SdkConstants.FD_OUTPUT)) {
-                            doDecoration(decoration, null);
-                        }
-                    }
-                }
-            } catch (CoreException e) {
-                // log the error
-                AdtPlugin.log(e, "Unable to get nature of project '%s'.", project.getName());
-            }
-        }
-    }
-
-    public void doDecoration(IDecoration decoration, String suffix) {
-        decoration.addOverlay(mDescriptor, IDecoration.TOP_LEFT);
-
-        if (suffix != null) {
-            decoration.addSuffix(suffix);
-        }
-    }
-
-    @Override
-    public boolean isLabelProperty(Object element, String property) {
-        // Property change do not affect the label
-        return false;
-    }
-
-    @Override
-    public void addListener(ILabelProviderListener listener) {
-        // No state change will affect the rendering.
-    }
-
-    @Override
-    public void removeListener(ILabelProviderListener listener) {
-        // No state change will affect the rendering.
-    }
-
-    @Override
-    public void dispose() {
-        // nothing to dispose
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/project/LibraryClasspathContainerInitializer.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/project/LibraryClasspathContainerInitializer.java
deleted file mode 100644
index 8fbee40..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/project/LibraryClasspathContainerInitializer.java
+++ /dev/null
@@ -1,641 +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.eclipse.adt.internal.project;
-
-import static com.android.ide.eclipse.adt.AdtConstants.CONTAINER_DEPENDENCIES;
-
-import com.android.SdkConstants;
-import com.android.ide.common.sdk.LoadStatus;
-import com.android.ide.eclipse.adt.AdtConstants;
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.ide.eclipse.adt.AndroidPrintStream;
-import com.android.ide.eclipse.adt.internal.sdk.ProjectState;
-import com.android.ide.eclipse.adt.internal.sdk.Sdk;
-import com.android.sdklib.BuildToolInfo;
-import com.android.sdklib.build.JarListSanitizer;
-import com.android.sdklib.build.JarListSanitizer.DifferentLibException;
-import com.android.sdklib.build.JarListSanitizer.Sha1Exception;
-import com.android.sdklib.build.RenderScriptProcessor;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IFolder;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IWorkspaceRoot;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.jdt.core.IAccessRule;
-import org.eclipse.jdt.core.IClasspathAttribute;
-import org.eclipse.jdt.core.IClasspathContainer;
-import org.eclipse.jdt.core.IClasspathEntry;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.JavaCore;
-import org.eclipse.jdt.core.JavaModelException;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.MalformedURLException;
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Properties;
-import java.util.Set;
-
-public class LibraryClasspathContainerInitializer extends BaseClasspathContainerInitializer {
-
-    private final static String ATTR_SRC = "src"; //$NON-NLS-1$
-    private final static String ATTR_DOC = "doc"; //$NON-NLS-1$
-    private final static String DOT_PROPERTIES = ".properties"; //$NON-NLS-1$
-
-    public LibraryClasspathContainerInitializer() {
-    }
-
-    /**
-     * Updates the {@link IJavaProject} objects with new library.
-     * @param androidProjects the projects to update.
-     * @return <code>true</code> if success, <code>false</code> otherwise.
-     */
-    public static boolean updateProjects(IJavaProject[] androidProjects) {
-        try {
-            // Allocate a new AndroidClasspathContainer, and associate it to the library
-            // container id for each projects.
-            int projectCount = androidProjects.length;
-
-            IClasspathContainer[] libraryContainers = new IClasspathContainer[projectCount];
-            IClasspathContainer[] dependencyContainers = new IClasspathContainer[projectCount];
-            for (int i = 0 ; i < projectCount; i++) {
-                libraryContainers[i] = allocateLibraryContainer(androidProjects[i]);
-                dependencyContainers[i] = allocateDependencyContainer(androidProjects[i]);
-            }
-
-            // give each project their new container in one call.
-            JavaCore.setClasspathContainer(
-                    new Path(AdtConstants.CONTAINER_PRIVATE_LIBRARIES),
-                    androidProjects, libraryContainers, new NullProgressMonitor());
-
-            JavaCore.setClasspathContainer(
-                    new Path(AdtConstants.CONTAINER_DEPENDENCIES),
-                    androidProjects, dependencyContainers, new NullProgressMonitor());
-            return true;
-        } catch (JavaModelException e) {
-            return false;
-        }
-    }
-
-    /**
-     * Updates the {@link IJavaProject} objects with new library.
-     * @param androidProjects the projects to update.
-     * @return <code>true</code> if success, <code>false</code> otherwise.
-     */
-    public static boolean updateProject(List<ProjectState> projects) {
-        List<IJavaProject> javaProjectList = new ArrayList<IJavaProject>(projects.size());
-        for (ProjectState p : projects) {
-            IJavaProject javaProject = JavaCore.create(p.getProject());
-            if (javaProject != null) {
-                javaProjectList.add(javaProject);
-            }
-        }
-
-        IJavaProject[] javaProjects = javaProjectList.toArray(
-                new IJavaProject[javaProjectList.size()]);
-
-        return updateProjects(javaProjects);
-    }
-
-    @Override
-    public void initialize(IPath containerPath, IJavaProject project) throws CoreException {
-        if (AdtConstants.CONTAINER_PRIVATE_LIBRARIES.equals(containerPath.toString())) {
-            IClasspathContainer libraries = allocateLibraryContainer(project);
-            if (libraries != null) {
-                JavaCore.setClasspathContainer(new Path(AdtConstants.CONTAINER_PRIVATE_LIBRARIES),
-                        new IJavaProject[] { project },
-                        new IClasspathContainer[] { libraries },
-                        new NullProgressMonitor());
-            }
-
-        } else if(AdtConstants.CONTAINER_DEPENDENCIES.equals(containerPath.toString())) {
-            IClasspathContainer dependencies = allocateDependencyContainer(project);
-            if (dependencies != null) {
-                JavaCore.setClasspathContainer(new Path(AdtConstants.CONTAINER_DEPENDENCIES),
-                        new IJavaProject[] { project },
-                        new IClasspathContainer[] { dependencies },
-                        new NullProgressMonitor());
-            }
-        }
-    }
-
-    private static IClasspathContainer allocateLibraryContainer(IJavaProject javaProject) {
-        final IProject iProject = javaProject.getProject();
-
-        // check if the project has a valid target.
-        ProjectState state = Sdk.getProjectState(iProject);
-        if (state == null) {
-            // getProjectState should already have logged an error. Just bail out.
-            return null;
-        }
-
-        /*
-         * At this point we're going to gather a list of all that need to go in the
-         * dependency container.
-         * - Library project outputs (direct and indirect)
-         * - Java project output (those can be indirectly referenced through library projects
-         *   or other other Java projects)
-         * - Jar files:
-         *    + inside this project's libs/
-         *    + inside the library projects' libs/
-         *    + inside the referenced Java projects' classpath
-         */
-        List<IClasspathEntry> entries = new ArrayList<IClasspathEntry>();
-
-        // list of java project dependencies and jar files that will be built while
-        // going through the library projects.
-        Set<File> jarFiles = new HashSet<File>();
-        Set<IProject> refProjects = new HashSet<IProject>();
-
-        // process all the libraries
-
-        List<IProject> libProjects = state.getFullLibraryProjects();
-        for (IProject libProject : libProjects) {
-            // process all of the library project's dependencies
-            getDependencyListFromClasspath(libProject, refProjects, jarFiles, true);
-        }
-
-        // now process this projects' referenced projects only.
-        processReferencedProjects(iProject, refProjects, jarFiles);
-
-        // and the content of its libs folder
-        getJarListFromLibsFolder(iProject, jarFiles);
-
-        // now add a classpath entry for each Java project (this is a set so dups are already
-        // removed)
-        for (IProject p : refProjects) {
-            entries.add(JavaCore.newProjectEntry(p.getFullPath(), true /*isExported*/));
-        }
-
-        entries.addAll(convertJarsToClasspathEntries(iProject, jarFiles));
-
-        return allocateContainer(javaProject, entries, new Path(AdtConstants.CONTAINER_PRIVATE_LIBRARIES),
-                "Android Private Libraries");
-    }
-
-    private static List<IClasspathEntry> convertJarsToClasspathEntries(final IProject iProject,
-            Set<File> jarFiles) {
-        List<IClasspathEntry> entries = new ArrayList<IClasspathEntry>(jarFiles.size());
-
-        // and process the jar files list, but first sanitize it to remove dups.
-        JarListSanitizer sanitizer = new JarListSanitizer(
-                iProject.getFolder(SdkConstants.FD_OUTPUT).getLocation().toFile(),
-                new AndroidPrintStream(iProject, null /*prefix*/,
-                        AdtPlugin.getOutStream()));
-
-        String errorMessage = null;
-
-        try {
-            List<File> sanitizedList = sanitizer.sanitize(jarFiles);
-
-            for (File jarFile : sanitizedList) {
-                if (jarFile instanceof CPEFile) {
-                    CPEFile cpeFile = (CPEFile) jarFile;
-                    IClasspathEntry e = cpeFile.getClasspathEntry();
-
-                    entries.add(JavaCore.newLibraryEntry(
-                            e.getPath(),
-                            e.getSourceAttachmentPath(),
-                            e.getSourceAttachmentRootPath(),
-                            e.getAccessRules(),
-                            e.getExtraAttributes(),
-                            true /*isExported*/));
-                } else {
-                    String jarPath = jarFile.getAbsolutePath();
-
-                    IPath sourceAttachmentPath = null;
-                    IClasspathAttribute javaDocAttribute = null;
-
-                    File jarProperties = new File(jarPath + DOT_PROPERTIES);
-                    if (jarProperties.isFile()) {
-                        Properties p = new Properties();
-                        InputStream is = null;
-                        try {
-                            p.load(is = new FileInputStream(jarProperties));
-
-                            String value = p.getProperty(ATTR_SRC);
-                            if (value != null) {
-                                File srcPath = getFile(jarFile, value);
-
-                                if (srcPath.exists()) {
-                                    sourceAttachmentPath = new Path(srcPath.getAbsolutePath());
-                                }
-                            }
-
-                            value = p.getProperty(ATTR_DOC);
-                            if (value != null) {
-                                File docPath = getFile(jarFile, value);
-                                if (docPath.exists()) {
-                                    try {
-                                        javaDocAttribute = JavaCore.newClasspathAttribute(
-                                                IClasspathAttribute.JAVADOC_LOCATION_ATTRIBUTE_NAME,
-                                                docPath.toURI().toURL().toString());
-                                    } catch (MalformedURLException e) {
-                                        AdtPlugin.log(e, "Failed to process 'doc' attribute for %s",
-                                                jarProperties.getAbsolutePath());
-                                    }
-                                }
-                            }
-
-                        } catch (FileNotFoundException e) {
-                            // shouldn't happen since we check upfront
-                        } catch (IOException e) {
-                            AdtPlugin.log(e, "Failed to read %s", jarProperties.getAbsolutePath());
-                        } finally {
-                            if (is != null) {
-                                try {
-                                    is.close();
-                                } catch (IOException e) {
-                                    // ignore
-                                }
-                            }
-                        }
-                    }
-
-                    if (javaDocAttribute != null) {
-                        entries.add(JavaCore.newLibraryEntry(new Path(jarPath),
-                                sourceAttachmentPath, null /*sourceAttachmentRootPath*/,
-                                new IAccessRule[0],
-                                new IClasspathAttribute[] { javaDocAttribute },
-                                true /*isExported*/));
-                    } else {
-                        entries.add(JavaCore.newLibraryEntry(new Path(jarPath),
-                                sourceAttachmentPath, null /*sourceAttachmentRootPath*/,
-                                true /*isExported*/));
-                    }
-                }
-            }
-        } catch (DifferentLibException e) {
-            errorMessage = e.getMessage();
-            AdtPlugin.printErrorToConsole(iProject, (Object[]) e.getDetails());
-        } catch (Sha1Exception e) {
-            errorMessage = e.getMessage();
-        }
-
-        processError(iProject, errorMessage, AdtConstants.MARKER_DEPENDENCY,
-                true /*outputToConsole*/);
-
-        return entries;
-    }
-
-    private static IClasspathContainer allocateDependencyContainer(IJavaProject javaProject) {
-        final IProject iProject = javaProject.getProject();
-        final List<IClasspathEntry> entries = new ArrayList<IClasspathEntry>();
-        final Set<File> jarFiles = new HashSet<File>();
-        final IWorkspaceRoot workspaceRoot = ResourcesPlugin.getWorkspace().getRoot();
-
-        AdtPlugin plugin = AdtPlugin.getDefault();
-        if (plugin == null) { // This is totally weird, but I've seen it happen!
-            return null;
-        }
-
-        synchronized (Sdk.getLock()) {
-            boolean sdkIsLoaded = plugin.getSdkLoadStatus() == LoadStatus.LOADED;
-
-            // check if the project has a valid target.
-            final ProjectState state = Sdk.getProjectState(iProject);
-            if (state == null) {
-                // getProjectState should already have logged an error. Just bail out.
-                return null;
-            }
-
-            // annotations support for older version of android
-            if (state.getTarget() != null && state.getTarget().getVersion().getApiLevel() <= 15) {
-                File annotationsJar = new File(Sdk.getCurrent().getSdkOsLocation(),
-                        SdkConstants.FD_TOOLS + File.separator + SdkConstants.FD_SUPPORT +
-                        File.separator + SdkConstants.FN_ANNOTATIONS_JAR);
-
-                jarFiles.add(annotationsJar);
-            }
-
-            if (state.getRenderScriptSupportMode()) {
-                if (!sdkIsLoaded) {
-                    return null;
-                }
-                BuildToolInfo buildToolInfo = state.getBuildToolInfo();
-                if (buildToolInfo == null) {
-                    buildToolInfo = Sdk.getCurrent().getLatestBuildTool();
-
-                    if (buildToolInfo == null) {
-                        return null;
-                    }
-                }
-
-                File renderScriptSupportJar = RenderScriptProcessor.getSupportJar(
-                        buildToolInfo.getLocation().getAbsolutePath());
-
-                jarFiles.add(renderScriptSupportJar);
-            }
-
-            // process all the libraries
-
-            List<IProject> libProjects = state.getFullLibraryProjects();
-            for (IProject libProject : libProjects) {
-                // get the project output
-                IFolder outputFolder = BaseProjectHelper.getAndroidOutputFolder(libProject);
-
-                if (outputFolder != null) { // can happen when closing/deleting a library)
-                    IFile jarIFile = outputFolder.getFile(libProject.getName().toLowerCase() +
-                           SdkConstants.DOT_JAR);
-
-                    // get the source folder for the library project
-                    List<IPath> srcs = BaseProjectHelper.getSourceClasspaths(libProject);
-                    // find the first non-derived source folder.
-                    IPath sourceFolder = null;
-                    for (IPath src : srcs) {
-                        IFolder srcFolder = workspaceRoot.getFolder(src);
-                        if (srcFolder.isDerived() == false) {
-                            sourceFolder = src;
-                            break;
-                        }
-                    }
-
-                    // we can directly add a CPE for this jar as there's no risk of a duplicate.
-                    IClasspathEntry entry = JavaCore.newLibraryEntry(
-                            jarIFile.getLocation(),
-                            sourceFolder, // source attachment path
-                            null,         // default source attachment root path.
-                            true /*isExported*/);
-
-                    entries.add(entry);
-                }
-            }
-
-            entries.addAll(convertJarsToClasspathEntries(iProject, jarFiles));
-
-            return allocateContainer(javaProject, entries, new Path(CONTAINER_DEPENDENCIES),
-                    "Android Dependencies");
-        }
-    }
-
-    private static IClasspathContainer allocateContainer(IJavaProject javaProject,
-            List<IClasspathEntry> entries, IPath id, String description) {
-
-        if (AdtPlugin.getDefault() == null) { // This is totally weird, but I've seen it happen!
-            return null;
-        }
-
-        // First check that the project has a library-type container.
-        try {
-            IClasspathEntry[] rawClasspath = javaProject.getRawClasspath();
-            final IClasspathEntry[] oldRawClasspath = rawClasspath;
-
-            boolean foundContainer = false;
-            for (IClasspathEntry entry : rawClasspath) {
-                // get the entry and kind
-                final int kind = entry.getEntryKind();
-
-                if (kind == IClasspathEntry.CPE_CONTAINER) {
-                    String path = entry.getPath().toString();
-                    String idString = id.toString();
-                    if (idString.equals(path)) {
-                        foundContainer = true;
-                        break;
-                    }
-                }
-            }
-
-            // if there isn't any, add it.
-            if (foundContainer == false) {
-                // add the android container to the array
-                rawClasspath = ProjectHelper.addEntryToClasspath(rawClasspath,
-                        JavaCore.newContainerEntry(id, true /*isExported*/));
-            }
-
-            // set the new list of entries to the project
-            if (rawClasspath != oldRawClasspath) {
-                javaProject.setRawClasspath(rawClasspath, new NullProgressMonitor());
-            }
-        } catch (JavaModelException e) {
-            // This really shouldn't happen, but if it does, simply return null (the calling
-            // method will fails as well)
-            return null;
-        }
-
-        return new AndroidClasspathContainer(
-                entries.toArray(new IClasspathEntry[entries.size()]),
-                id,
-                description,
-                IClasspathContainer.K_APPLICATION);
-    }
-
-    private static File getFile(File root, String value) {
-        File file = new File(value);
-        if (file.isAbsolute() == false) {
-            file = new File(root.getParentFile(), value);
-        }
-
-        return file;
-    }
-
-    /**
-     * Finds all the jar files inside a project's libs folder.
-     * @param project
-     * @param jarFiles
-     */
-    private static void getJarListFromLibsFolder(IProject project, Set<File> jarFiles) {
-        IFolder libsFolder = project.getFolder(SdkConstants.FD_NATIVE_LIBS);
-        if (libsFolder.exists()) {
-            try {
-                IResource[] members = libsFolder.members();
-                for (IResource member : members) {
-                    if (member.getType() == IResource.FILE &&
-                            SdkConstants.EXT_JAR.equalsIgnoreCase(member.getFileExtension())) {
-                        IPath location = member.getLocation();
-                        if (location != null) {
-                            jarFiles.add(location.toFile());
-                        }
-                    }
-                }
-            } catch (CoreException e) {
-                // can't get the list? ignore this folder.
-            }
-        }
-    }
-
-    /**
-     * Process reference projects from the main projects to add indirect dependencies coming
-     * from Java project.
-     * @param project the main project
-     * @param projects the project list to add to
-     * @param jarFiles the jar list to add to.
-     */
-    private static void processReferencedProjects(IProject project,
-            Set<IProject> projects, Set<File> jarFiles) {
-        try {
-            IProject[] refs = project.getReferencedProjects();
-            for (IProject p : refs) {
-                // ignore if it's an Android project, or if it's not a Java
-                // Project
-                if (p.hasNature(JavaCore.NATURE_ID)
-                        && p.hasNature(AdtConstants.NATURE_DEFAULT) == false) {
-
-                    // process this project's dependencies
-                    getDependencyListFromClasspath(p, projects, jarFiles, true /*includeJarFiles*/);
-                }
-            }
-        } catch (CoreException e) {
-            // can't get the referenced projects? ignore
-        }
-    }
-
-    /**
-     * Finds all the dependencies of a given project and add them to a project list and
-     * a jar list.
-     * Only classpath entries that are exported are added, and only Java project (not Android
-     * project) are added.
-     *
-     * @param project the project to query
-     * @param projects the referenced project list to add to
-     * @param jarFiles the jar list to add to
-     * @param includeJarFiles whether to include jar files or just projects. This is useful when
-     *           calling on an Android project (value should be <code>false</code>)
-     */
-    private static void getDependencyListFromClasspath(IProject project, Set<IProject> projects,
-            Set<File> jarFiles, boolean includeJarFiles) {
-        IJavaProject javaProject = JavaCore.create(project);
-        IWorkspaceRoot wsRoot = ResourcesPlugin.getWorkspace().getRoot();
-
-        // we could use IJavaProject.getResolvedClasspath directly, but we actually
-        // want to see the containers themselves.
-        IClasspathEntry[] classpaths = javaProject.readRawClasspath();
-        if (classpaths != null) {
-            for (IClasspathEntry e : classpaths) {
-                // ignore entries that are not exported
-                if (!e.getPath().toString().equals(CONTAINER_DEPENDENCIES) && e.isExported()) {
-                    processCPE(e, javaProject, wsRoot, projects, jarFiles, includeJarFiles);
-                }
-            }
-        }
-    }
-
-    /**
-     * Processes a {@link IClasspathEntry} and add it to one of the list if applicable.
-     * @param entry the entry to process
-     * @param javaProject the {@link IJavaProject} from which this entry came.
-     * @param wsRoot the {@link IWorkspaceRoot}
-     * @param projects the project list to add to
-     * @param jarFiles the jar list to add to
-     * @param includeJarFiles whether to include jar files or just projects. This is useful when
-     *           calling on an Android project (value should be <code>false</code>)
-     */
-    private static void processCPE(IClasspathEntry entry, IJavaProject javaProject,
-            IWorkspaceRoot wsRoot,
-            Set<IProject> projects, Set<File> jarFiles, boolean includeJarFiles) {
-
-        // if this is a classpath variable reference, we resolve it.
-        if (entry.getEntryKind() == IClasspathEntry.CPE_VARIABLE) {
-            entry = JavaCore.getResolvedClasspathEntry(entry);
-        }
-
-        if (entry.getEntryKind() == IClasspathEntry.CPE_PROJECT) {
-            IProject refProject = wsRoot.getProject(entry.getPath().lastSegment());
-            try {
-                // ignore if it's an Android project, or if it's not a Java Project
-                if (refProject.hasNature(JavaCore.NATURE_ID) &&
-                        refProject.hasNature(AdtConstants.NATURE_DEFAULT) == false) {
-                    // add this project to the list
-                    projects.add(refProject);
-
-                    // also get the dependency from this project.
-                    getDependencyListFromClasspath(refProject, projects, jarFiles,
-                            true /*includeJarFiles*/);
-                }
-            } catch (CoreException exception) {
-                // can't query the project nature? ignore
-            }
-        } else if (entry.getEntryKind() == IClasspathEntry.CPE_LIBRARY) {
-            if (includeJarFiles) {
-                handleClasspathLibrary(entry, wsRoot, jarFiles);
-            }
-        } else if (entry.getEntryKind() == IClasspathEntry.CPE_CONTAINER) {
-            // get the container and its content
-            try {
-                IClasspathContainer container = JavaCore.getClasspathContainer(
-                        entry.getPath(), javaProject);
-                // ignore the system and default_system types as they represent
-                // libraries that are part of the runtime.
-                if (container != null &&
-                        container.getKind() == IClasspathContainer.K_APPLICATION) {
-                    IClasspathEntry[] entries = container.getClasspathEntries();
-                    for (IClasspathEntry cpe : entries) {
-                        processCPE(cpe, javaProject, wsRoot, projects, jarFiles, includeJarFiles);
-                    }
-                }
-            } catch (JavaModelException jme) {
-                // can't resolve the container? ignore it.
-                AdtPlugin.log(jme, "Failed to resolve ClasspathContainer: %s", entry.getPath());
-            }
-        }
-    }
-
-    private static final class CPEFile extends File {
-        private static final long serialVersionUID = 1L;
-
-        private final IClasspathEntry mClasspathEntry;
-
-        public CPEFile(String pathname, IClasspathEntry classpathEntry) {
-            super(pathname);
-            mClasspathEntry = classpathEntry;
-        }
-
-        public CPEFile(File file, IClasspathEntry classpathEntry) {
-            super(file.getAbsolutePath());
-            mClasspathEntry = classpathEntry;
-        }
-
-        public IClasspathEntry getClasspathEntry() {
-            return mClasspathEntry;
-        }
-    }
-
-    private static void handleClasspathLibrary(IClasspathEntry e, IWorkspaceRoot wsRoot,
-            Set<File> jarFiles) {
-        // get the IPath
-        IPath path = e.getPath();
-
-        IResource resource = wsRoot.findMember(path);
-
-        if (SdkConstants.EXT_JAR.equalsIgnoreCase(path.getFileExtension())) {
-            // case of a jar file (which could be relative to the workspace or a full path)
-            if (resource != null && resource.exists() &&
-                    resource.getType() == IResource.FILE) {
-                jarFiles.add(new CPEFile(resource.getLocation().toFile(), e));
-            } else {
-                // if the jar path doesn't match a workspace resource,
-                // then we get an OSString and check if this links to a valid file.
-                String osFullPath = path.toOSString();
-
-                File f = new CPEFile(osFullPath, e);
-                if (f.isFile()) {
-                    jarFiles.add(f);
-                }
-            }
-        }
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/project/ProjectChooserHelper.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/project/ProjectChooserHelper.java
deleted file mode 100644
index 9de8ad0..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/project/ProjectChooserHelper.java
+++ /dev/null
@@ -1,304 +0,0 @@
-/*
- * 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.project;
-
-import com.android.ide.eclipse.adt.internal.project.BaseProjectHelper.IProjectFilter;
-import com.android.ide.eclipse.adt.internal.sdk.ProjectState;
-import com.android.ide.eclipse.adt.internal.sdk.Sdk;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IWorkspaceRoot;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.jdt.core.IJavaModel;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.JavaCore;
-import org.eclipse.jdt.ui.JavaElementLabelProvider;
-import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.jface.window.Window;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
-import org.eclipse.swt.widgets.Combo;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.dialogs.ElementListSelectionDialog;
-
-/**
- * Helper class to deal with displaying a project choosing dialog that lists only the
- * projects with the Android nature.
- */
-public class ProjectChooserHelper {
-
-    private final Shell mParentShell;
-    private final IProjectChooserFilter mFilter;
-
-    /**
-     * List of current android projects. Since the dialog is modal, we'll just get
-     * the list once on-demand.
-     */
-    private IJavaProject[] mAndroidProjects;
-
-    /**
-     * Interface to filter out some project displayed by {@link ProjectChooserHelper}.
-     *
-     * @see IProjectFilter
-     */
-    public interface IProjectChooserFilter extends IProjectFilter {
-        /**
-         * Whether the Project Chooser can compute the project list once and cache the result.
-         * </p>If false the project list is recomputed every time the dialog is opened.
-         */
-        boolean useCache();
-    }
-
-    /**
-     * An implementation of {@link IProjectChooserFilter} that only displays non-library projects.
-     */
-    public final static class NonLibraryProjectOnlyFilter implements IProjectChooserFilter {
-        @Override
-        public boolean accept(IProject project) {
-            ProjectState state = Sdk.getProjectState(project);
-            if (state != null) {
-                return state.isLibrary() == false;
-            }
-
-            return false;
-        }
-
-        @Override
-        public boolean useCache() {
-            return true;
-        }
-    }
-
-    /**
-     * An implementation of {@link IProjectChooserFilter} that only displays library projects.
-     */
-    public final static class LibraryProjectOnlyFilter implements IProjectChooserFilter {
-        @Override
-        public boolean accept(IProject project) {
-            ProjectState state = Sdk.getProjectState(project);
-            if (state != null ) {
-                return state.isLibrary();
-            }
-
-            return false;
-        }
-
-        @Override
-        public boolean useCache() {
-            return true;
-        }
-    }
-
-    /**
-     * Creates a new project chooser.
-     * @param parentShell the parent {@link Shell} for the dialog.
-     * @param filter a filter to only accept certain projects. Can be null.
-     */
-    public ProjectChooserHelper(Shell parentShell, IProjectChooserFilter filter) {
-        mParentShell = parentShell;
-        mFilter = filter;
-    }
-
-    /**
-     * Displays a project chooser dialog which lists all available projects with the Android nature.
-     * <p/>
-     * The list of project is built from Android flagged projects currently opened in the workspace.
-     *
-     * @param projectName If non null and not empty, represents the name of an Android project
-     *                    that will be selected by default.
-     * @param message Message for the dialog box. Can be null in which case a default message
-     *                is displayed.
-     * @return the project chosen by the user in the dialog, or null if the dialog was canceled.
-     */
-    public IJavaProject chooseJavaProject(String projectName, String message) {
-        ILabelProvider labelProvider = new JavaElementLabelProvider(
-                JavaElementLabelProvider.SHOW_DEFAULT);
-        ElementListSelectionDialog dialog = new ElementListSelectionDialog(
-                mParentShell, labelProvider);
-        dialog.setTitle("Project Selection");
-        if (message == null) {
-            message = "Please select a project";
-        }
-        dialog.setMessage(message);
-
-        IWorkspaceRoot workspaceRoot = ResourcesPlugin.getWorkspace().getRoot();
-        IJavaModel javaModel = JavaCore.create(workspaceRoot);
-
-        // set the elements in the dialog. These are opened android projects.
-        dialog.setElements(getAndroidProjects(javaModel));
-
-        // look for the project matching the given project name
-        IJavaProject javaProject = null;
-        if (projectName != null && projectName.length() > 0) {
-            javaProject = javaModel.getJavaProject(projectName);
-        }
-
-        // if we found it, we set the initial selection in the dialog to this one.
-        if (javaProject != null) {
-            dialog.setInitialSelections(new Object[] { javaProject });
-        }
-
-        // open the dialog and return the object selected if OK was clicked, or null otherwise
-        if (dialog.open() == Window.OK) {
-            return (IJavaProject) dialog.getFirstResult();
-        }
-        return null;
-    }
-
-    /**
-     * Returns the list of Android projects.
-     * <p/>
-     * Because this list can be time consuming, this class caches the list of project.
-     * It is recommended to call this method instead of
-     * {@link BaseProjectHelper#getAndroidProjects()}.
-     *
-     * @param javaModel the java model. Can be null.
-     */
-    public IJavaProject[] getAndroidProjects(IJavaModel javaModel) {
-        // recompute only if we don't have the projects already or the filter is dynamic
-        // and prevent usage of a cache.
-        if (mAndroidProjects == null || (mFilter != null && mFilter.useCache() == false)) {
-            if (javaModel == null) {
-                mAndroidProjects = BaseProjectHelper.getAndroidProjects(mFilter);
-            } else {
-                mAndroidProjects = BaseProjectHelper.getAndroidProjects(javaModel, mFilter);
-            }
-        }
-
-        return mAndroidProjects;
-    }
-
-    /**
-     * Helper method to get the Android project with the given name
-     *
-     * @param projectName the name of the project to find
-     * @return the {@link IProject} for the Android project. <code>null</code> if not found.
-     */
-    public IProject getAndroidProject(String projectName) {
-        IProject iproject = null;
-        IJavaProject[] javaProjects = getAndroidProjects(null);
-        if (javaProjects != null) {
-            for (IJavaProject javaProject : javaProjects) {
-                if (javaProject.getElementName().equals(projectName)) {
-                    iproject = javaProject.getProject();
-                    break;
-                }
-            }
-        }
-        return iproject;
-    }
-
-    /**
-     * A selector combo for showing the currently selected project and for
-     * changing the selection
-     */
-    public static class ProjectCombo extends Combo implements SelectionListener {
-        /** Currently chosen project, or null when no project has been initialized or selected */
-        private IProject mProject;
-        private IJavaProject[] mAvailableProjects;
-
-        /**
-         * Creates a new project selector combo
-         *
-         * @param helper associated {@link ProjectChooserHelper} for looking up
-         *            projects
-         * @param parent parent composite to add the combo to
-         * @param initialProject the initial project to select, or null (which
-         *            will show a "Please Choose Project..." label instead.)
-         */
-        public ProjectCombo(ProjectChooserHelper helper, Composite parent,
-                IProject initialProject) {
-            super(parent, SWT.BORDER | SWT.FLAT | SWT.READ_ONLY);
-            mProject = initialProject;
-
-            mAvailableProjects = helper.getAndroidProjects(null);
-            String[] items = new String[mAvailableProjects.length + 1];
-            items[0] = "--- Choose Project ---";
-
-            ILabelProvider labelProvider = new JavaElementLabelProvider(
-                    JavaElementLabelProvider.SHOW_DEFAULT);
-            int selectionIndex = 0;
-            for (int i = 0, n = mAvailableProjects.length; i < n; i++) {
-                IProject project = mAvailableProjects[i].getProject();
-                items[i + 1] = labelProvider.getText(project);
-                if (project == initialProject) {
-                    selectionIndex = i + 1;
-                }
-            }
-            setItems(items);
-            select(selectionIndex);
-
-            addSelectionListener(this);
-        }
-
-        /**
-         * Returns the project selected by this chooser (or the initial project
-         * passed to the constructor if the user did not change it)
-         *
-         * @return the selected project
-         */
-        public IProject getSelectedProject() {
-            return mProject;
-        }
-
-        /**
-         * Sets the project selected by this chooser
-         *
-         * @param project the selected project
-         */
-        public void setSelectedProject(IProject project) {
-            mProject = project;
-
-            int selectionIndex = 0;
-            for (int i = 0, n = mAvailableProjects.length; i < n; i++) {
-                if (project == mAvailableProjects[i].getProject()) {
-                    selectionIndex = i + 1; // +1: Slot 0 is reserved for "Choose Project"
-                    select(selectionIndex);
-                    break;
-                }
-            }
-        }
-
-        /**
-         * Click handler for the button: Open the {@link ProjectChooserHelper}
-         * dialog for selecting a new project.
-         */
-        @Override
-        public void widgetSelected(SelectionEvent e) {
-            int selectionIndex = getSelectionIndex();
-            if (selectionIndex > 0 && mAvailableProjects != null
-                    && selectionIndex <= mAvailableProjects.length) {
-                // selection index 0 is "Choose Project", all other projects are offset
-                // by 1 from the selection index
-                mProject = mAvailableProjects[selectionIndex - 1].getProject();
-            } else {
-                mProject = null;
-            }
-        }
-
-        @Override
-        public void widgetDefaultSelected(SelectionEvent e) {
-        }
-
-        @Override
-        protected void checkSubclass() {
-            // Disable the check that prevents subclassing of SWT components
-        }
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/project/ProjectHelper.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/project/ProjectHelper.java
deleted file mode 100644
index a32b4ca..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/project/ProjectHelper.java
+++ /dev/null
@@ -1,1153 +0,0 @@
-/*
- * Copyright (C) 2007 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.project;
-
-import static com.android.ide.eclipse.adt.AdtConstants.COMPILER_COMPLIANCE_PREFERRED;
-
-import com.android.SdkConstants;
-import com.android.annotations.NonNull;
-import com.android.ide.common.xml.ManifestData;
-import com.android.ide.eclipse.adt.AdtConstants;
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.ide.eclipse.adt.internal.build.builders.PostCompilerBuilder;
-import com.android.ide.eclipse.adt.internal.build.builders.PreCompilerBuilder;
-import com.android.ide.eclipse.adt.internal.preferences.AdtPrefs;
-import com.android.ide.eclipse.adt.internal.sdk.ProjectState;
-import com.android.ide.eclipse.adt.internal.sdk.Sdk;
-import com.android.sdklib.BuildToolInfo;
-import com.android.sdklib.IAndroidTarget;
-import com.android.utils.Pair;
-
-import org.eclipse.core.resources.ICommand;
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IFolder;
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IProjectDescription;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IWorkspace;
-import org.eclipse.core.resources.IncrementalProjectBuilder;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.core.runtime.QualifiedName;
-import org.eclipse.jdt.core.IClasspathEntry;
-import org.eclipse.jdt.core.IJavaModel;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.JavaCore;
-import org.eclipse.jdt.core.JavaModelException;
-import org.eclipse.jdt.internal.corext.util.JavaModelUtil;
-import org.eclipse.jdt.launching.IVMInstall;
-import org.eclipse.jdt.launching.IVMInstall2;
-import org.eclipse.jdt.launching.IVMInstallType;
-import org.eclipse.jdt.launching.JavaRuntime;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.TreeMap;
-
-/**
- * Utility class to manipulate Project parameters/properties.
- */
-public final class ProjectHelper {
-    public final static int COMPILER_COMPLIANCE_OK = 0;
-    public final static int COMPILER_COMPLIANCE_LEVEL = 1;
-    public final static int COMPILER_COMPLIANCE_SOURCE = 2;
-    public final static int COMPILER_COMPLIANCE_CODEGEN_TARGET = 3;
-
-    /**
-     * Adds the given ClasspathEntry object to the class path entries.
-     * This method does not check whether the entry is already defined in the project.
-     *
-     * @param entries The class path entries to read. A copy will be returned.
-     * @param newEntry The new class path entry to add.
-     * @return A new class path entries array.
-     */
-    public static IClasspathEntry[] addEntryToClasspath(
-            IClasspathEntry[] entries, IClasspathEntry newEntry) {
-        int n = entries.length;
-        IClasspathEntry[] newEntries = new IClasspathEntry[n + 1];
-        System.arraycopy(entries, 0, newEntries, 0, n);
-        newEntries[n] = newEntry;
-        return newEntries;
-    }
-
-    /**
-     * Replaces the given ClasspathEntry in the classpath entries.
-     *
-     * If the classpath does not yet exists (Check is based on entry path), then it is added.
-     *
-     * @param entries The class path entries to read. The same array (replace) or a copy (add)
-     *                will be returned.
-     * @param newEntry The new class path entry to add.
-     * @return The same array (replace) or a copy (add) will be returned.
-     *
-     * @see IClasspathEntry#getPath()
-     */
-    public static IClasspathEntry[] replaceEntryInClasspath(
-            IClasspathEntry[] entries, IClasspathEntry newEntry) {
-
-        IPath path = newEntry.getPath();
-        for (int i = 0, count = entries.length; i < count ; i++) {
-            if (path.equals(entries[i].getPath())) {
-                entries[i] = newEntry;
-                return entries;
-            }
-        }
-
-        return addEntryToClasspath(entries, newEntry);
-    }
-
-    /**
-     * Adds the corresponding source folder to the project's class path entries.
-     * This method does not check whether the entry is already defined in the project.
-     *
-     * @param javaProject The java project of which path entries to update.
-     * @param newEntry The new class path entry to add.
-     * @throws JavaModelException
-     */
-    public static void addEntryToClasspath(IJavaProject javaProject, IClasspathEntry newEntry)
-            throws JavaModelException {
-
-        IClasspathEntry[] entries = javaProject.getRawClasspath();
-        entries = addEntryToClasspath(entries, newEntry);
-        javaProject.setRawClasspath(entries, new NullProgressMonitor());
-    }
-
-    /**
-     * Checks whether the given class path entry is already defined in the project.
-     *
-     * @param javaProject The java project of which path entries to check.
-     * @param newEntry The parent source folder to remove.
-     * @return True if the class path entry is already defined.
-     * @throws JavaModelException
-     */
-    public static boolean isEntryInClasspath(IJavaProject javaProject, IClasspathEntry newEntry)
-            throws JavaModelException {
-
-        IClasspathEntry[] entries = javaProject.getRawClasspath();
-        for (IClasspathEntry entry : entries) {
-            if (entry.equals(newEntry)) {
-                return true;
-            }
-        }
-        return false;
-    }
-
-    /**
-     * Remove a classpath entry from the array.
-     * @param entries The class path entries to read. A copy will be returned
-     * @param index The index to remove.
-     * @return A new class path entries array.
-     */
-    public static IClasspathEntry[] removeEntryFromClasspath(
-            IClasspathEntry[] entries, int index) {
-        int n = entries.length;
-        IClasspathEntry[] newEntries = new IClasspathEntry[n-1];
-
-        // copy the entries before index
-        System.arraycopy(entries, 0, newEntries, 0, index);
-
-        // copy the entries after index
-        System.arraycopy(entries, index + 1, newEntries, index,
-                entries.length - index - 1);
-
-        return newEntries;
-    }
-
-    /**
-     * Converts a OS specific path into a path valid for the java doc location
-     * attributes of a project.
-     * @param javaDocOSLocation The OS specific path.
-     * @return a valid path for the java doc location.
-     */
-    public static String getJavaDocPath(String javaDocOSLocation) {
-        // first thing we do is convert the \ into /
-        String javaDoc = javaDocOSLocation.replaceAll("\\\\", //$NON-NLS-1$
-                AdtConstants.WS_SEP);
-
-        // then we add file: at the beginning for unix path, and file:/ for non
-        // unix path
-        if (javaDoc.startsWith(AdtConstants.WS_SEP)) {
-            return "file:" + javaDoc; //$NON-NLS-1$
-        }
-
-        return "file:/" + javaDoc; //$NON-NLS-1$
-    }
-
-    /**
-     * Look for a specific classpath entry by full path and return its index.
-     * @param entries The entry array to search in.
-     * @param entryPath The OS specific path of the entry.
-     * @param entryKind The kind of the entry. Accepted values are 0
-     * (no filter), IClasspathEntry.CPE_LIBRARY, IClasspathEntry.CPE_PROJECT,
-     * IClasspathEntry.CPE_SOURCE, IClasspathEntry.CPE_VARIABLE,
-     * and IClasspathEntry.CPE_CONTAINER
-     * @return the index of the found classpath entry or -1.
-     */
-    public static int findClasspathEntryByPath(IClasspathEntry[] entries,
-            String entryPath, int entryKind) {
-        for (int i = 0 ; i < entries.length ; i++) {
-            IClasspathEntry entry = entries[i];
-
-            int kind = entry.getEntryKind();
-
-            if (kind == entryKind || entryKind == 0) {
-                // get the path
-                IPath path = entry.getPath();
-
-                String osPathString = path.toOSString();
-                if (osPathString.equals(entryPath)) {
-                    return i;
-                }
-            }
-        }
-
-        // not found, return bad index.
-        return -1;
-    }
-
-    /**
-     * Look for a specific classpath entry for file name only and return its
-     *  index.
-     * @param entries The entry array to search in.
-     * @param entryName The filename of the entry.
-     * @param entryKind The kind of the entry. Accepted values are 0
-     * (no filter), IClasspathEntry.CPE_LIBRARY, IClasspathEntry.CPE_PROJECT,
-     * IClasspathEntry.CPE_SOURCE, IClasspathEntry.CPE_VARIABLE,
-     * and IClasspathEntry.CPE_CONTAINER
-     * @param startIndex Index where to start the search
-     * @return the index of the found classpath entry or -1.
-     */
-    public static int findClasspathEntryByName(IClasspathEntry[] entries,
-            String entryName, int entryKind, int startIndex) {
-        if (startIndex < 0) {
-            startIndex = 0;
-        }
-        for (int i = startIndex ; i < entries.length ; i++) {
-            IClasspathEntry entry = entries[i];
-
-            int kind = entry.getEntryKind();
-
-            if (kind == entryKind || entryKind == 0) {
-                // get the path
-                IPath path = entry.getPath();
-                String name = path.segment(path.segmentCount()-1);
-
-                if (name.equals(entryName)) {
-                    return i;
-                }
-            }
-        }
-
-        // not found, return bad index.
-        return -1;
-    }
-
-    public static boolean updateProject(IJavaProject project) {
-        return updateProjects(new IJavaProject[] { project});
-    }
-
-    /**
-     * Update the android-specific projects's classpath containers.
-     * @param projects the projects to update
-     * @return
-     */
-    public static boolean updateProjects(IJavaProject[] projects) {
-        boolean r = AndroidClasspathContainerInitializer.updateProjects(projects);
-        if (r) {
-            return LibraryClasspathContainerInitializer.updateProjects(projects);
-        }
-        return false;
-    }
-
-    /**
-     * Fix the project. This checks the SDK location.
-     * @param project The project to fix.
-     * @throws JavaModelException
-     */
-    public static void fixProject(IProject project) throws JavaModelException {
-        if (AdtPlugin.getOsSdkFolder().length() == 0) {
-            AdtPlugin.printToConsole(project, "Unknown SDK Location, project not fixed.");
-            return;
-        }
-
-        // get a java project
-        IJavaProject javaProject = JavaCore.create(project);
-        fixProjectClasspathEntries(javaProject);
-    }
-
-    /**
-     * Fix the project classpath entries. The method ensures that:
-     * <ul>
-     * <li>The project does not reference any old android.zip/android.jar archive.</li>
-     * <li>The project does not use its output folder as a sourc folder.</li>
-     * <li>The project does not reference a desktop JRE</li>
-     * <li>The project references the AndroidClasspathContainer.
-     * </ul>
-     * @param javaProject The project to fix.
-     * @throws JavaModelException
-     */
-    public static void fixProjectClasspathEntries(IJavaProject javaProject)
-            throws JavaModelException {
-
-        // get the project classpath
-        IClasspathEntry[] entries = javaProject.getRawClasspath();
-        IClasspathEntry[] oldEntries = entries;
-        boolean forceRewriteOfCPE = false;
-
-        // check if the JRE is set as library
-        int jreIndex = ProjectHelper.findClasspathEntryByPath(entries, JavaRuntime.JRE_CONTAINER,
-                IClasspathEntry.CPE_CONTAINER);
-        if (jreIndex != -1) {
-            // the project has a JRE included, we remove it
-            entries = ProjectHelper.removeEntryFromClasspath(entries, jreIndex);
-        }
-
-        // get the output folder
-        IPath outputFolder = javaProject.getOutputLocation();
-
-        boolean foundFrameworkContainer = false;
-        IClasspathEntry foundLibrariesContainer = null;
-        IClasspathEntry foundDependenciesContainer = null;
-
-        for (int i = 0 ; i < entries.length ;) {
-            // get the entry and kind
-            IClasspathEntry entry = entries[i];
-            int kind = entry.getEntryKind();
-
-            if (kind == IClasspathEntry.CPE_SOURCE) {
-                IPath path = entry.getPath();
-
-                if (path.equals(outputFolder)) {
-                    entries = ProjectHelper.removeEntryFromClasspath(entries, i);
-
-                    // continue, to skip the i++;
-                    continue;
-                }
-            } else if (kind == IClasspathEntry.CPE_CONTAINER) {
-                String path = entry.getPath().toString();
-                if (AdtConstants.CONTAINER_FRAMEWORK.equals(path)) {
-                    foundFrameworkContainer = true;
-                } else if (AdtConstants.CONTAINER_PRIVATE_LIBRARIES.equals(path)) {
-                    foundLibrariesContainer = entry;
-                } else if (AdtConstants.CONTAINER_DEPENDENCIES.equals(path)) {
-                    foundDependenciesContainer = entry;
-                }
-            }
-
-            i++;
-        }
-
-        // look to see if we have the m2eclipse nature
-        boolean m2eNature = false;
-        try {
-            m2eNature = javaProject.getProject().hasNature("org.eclipse.m2e.core.maven2Nature");
-        } catch (CoreException e) {
-            AdtPlugin.log(e, "Failed to query project %s for m2e nature",
-                    javaProject.getProject().getName());
-        }
-
-
-        // if the framework container is not there, we add it
-        if (!foundFrameworkContainer) {
-            // add the android container to the array
-            entries = ProjectHelper.addEntryToClasspath(entries,
-                    JavaCore.newContainerEntry(new Path(AdtConstants.CONTAINER_FRAMEWORK)));
-        }
-
-        // same thing for the library container
-        if (foundLibrariesContainer == null) {
-            // add the exported libraries android container to the array
-            entries = ProjectHelper.addEntryToClasspath(entries,
-                    JavaCore.newContainerEntry(
-                            new Path(AdtConstants.CONTAINER_PRIVATE_LIBRARIES), true));
-        } else if (!m2eNature && !foundLibrariesContainer.isExported()) {
-            // the container is present but it's not exported and since there's no m2e nature
-            // we do want it to be exported.
-            // keep all the other parameters the same.
-            entries = ProjectHelper.replaceEntryInClasspath(entries,
-                    JavaCore.newContainerEntry(
-                            new Path(AdtConstants.CONTAINER_PRIVATE_LIBRARIES),
-                            foundLibrariesContainer.getAccessRules(),
-                            foundLibrariesContainer.getExtraAttributes(),
-                            true));
-            forceRewriteOfCPE = true;
-        }
-
-        // same thing for the dependencies container
-        if (foundDependenciesContainer == null) {
-            // add the android dependencies container to the array
-            entries = ProjectHelper.addEntryToClasspath(entries,
-                    JavaCore.newContainerEntry(
-                            new Path(AdtConstants.CONTAINER_DEPENDENCIES), true));
-        } else if (!m2eNature && !foundDependenciesContainer.isExported()) {
-            // the container is present but it's not exported and since there's no m2e nature
-            // we do want it to be exported.
-            // keep all the other parameters the same.
-            entries = ProjectHelper.replaceEntryInClasspath(entries,
-                    JavaCore.newContainerEntry(
-                            new Path(AdtConstants.CONTAINER_DEPENDENCIES),
-                            foundDependenciesContainer.getAccessRules(),
-                            foundDependenciesContainer.getExtraAttributes(),
-                            true));
-            forceRewriteOfCPE = true;
-        }
-
-        // set the new list of entries to the project
-        if (entries != oldEntries || forceRewriteOfCPE) {
-            javaProject.setRawClasspath(entries, new NullProgressMonitor());
-        }
-
-        // If needed, check and fix compiler compliance and source compatibility
-        ProjectHelper.checkAndFixCompilerCompliance(javaProject);
-    }
-
-
-    /**
-     * Checks the project compiler compliance level is supported.
-     * @param javaProject The project to check
-     * @return A pair with the first integer being an error code, and the second value
-     *   being the invalid value found or null. The error code can be: <ul>
-     * <li><code>COMPILER_COMPLIANCE_OK</code> if the project is properly configured</li>
-     * <li><code>COMPILER_COMPLIANCE_LEVEL</code> for unsupported compiler level</li>
-     * <li><code>COMPILER_COMPLIANCE_SOURCE</code> for unsupported source compatibility</li>
-     * <li><code>COMPILER_COMPLIANCE_CODEGEN_TARGET</code> for unsupported .class format</li>
-     * </ul>
-     */
-    public static final Pair<Integer, String> checkCompilerCompliance(IJavaProject javaProject) {
-        // get the project compliance level option
-        String compliance = javaProject.getOption(JavaCore.COMPILER_COMPLIANCE, true);
-
-        // check it against a list of valid compliance level strings.
-        if (!checkCompliance(javaProject, compliance)) {
-            // if we didn't find the proper compliance level, we return an error
-            return Pair.of(COMPILER_COMPLIANCE_LEVEL, compliance);
-        }
-
-        // otherwise we check source compatibility
-        String source = javaProject.getOption(JavaCore.COMPILER_SOURCE, true);
-
-        // check it against a list of valid compliance level strings.
-        if (!checkCompliance(javaProject, source)) {
-            // if we didn't find the proper compliance level, we return an error
-            return Pair.of(COMPILER_COMPLIANCE_SOURCE, source);
-        }
-
-        // otherwise check codegen level
-        String codeGen = javaProject.getOption(JavaCore.COMPILER_CODEGEN_TARGET_PLATFORM, true);
-
-        // check it against a list of valid compliance level strings.
-        if (!checkCompliance(javaProject, codeGen)) {
-            // if we didn't find the proper compliance level, we return an error
-            return Pair.of(COMPILER_COMPLIANCE_CODEGEN_TARGET, codeGen);
-        }
-
-        return Pair.of(COMPILER_COMPLIANCE_OK, null);
-    }
-
-    /**
-     * Checks the project compiler compliance level is supported.
-     * @param project The project to check
-     * @return A pair with the first integer being an error code, and the second value
-     *   being the invalid value found or null. The error code can be: <ul>
-     * <li><code>COMPILER_COMPLIANCE_OK</code> if the project is properly configured</li>
-     * <li><code>COMPILER_COMPLIANCE_LEVEL</code> for unsupported compiler level</li>
-     * <li><code>COMPILER_COMPLIANCE_SOURCE</code> for unsupported source compatibility</li>
-     * <li><code>COMPILER_COMPLIANCE_CODEGEN_TARGET</code> for unsupported .class format</li>
-     * </ul>
-     */
-    public static final Pair<Integer, String> checkCompilerCompliance(IProject project) {
-        // get the java project from the IProject resource object
-        IJavaProject javaProject = JavaCore.create(project);
-
-        // check and return the result.
-        return checkCompilerCompliance(javaProject);
-    }
-
-
-    /**
-     * Checks, and fixes if needed, the compiler compliance level, and the source compatibility
-     * level
-     * @param project The project to check and fix.
-     */
-    public static final void checkAndFixCompilerCompliance(IProject project) {
-        // FIXME This method is never used. Shall we just removed it?
-        // {@link #checkAndFixCompilerCompliance(IJavaProject)} is used instead.
-
-        // get the java project from the IProject resource object
-        IJavaProject javaProject = JavaCore.create(project);
-
-        // Now we check the compiler compliance level and make sure it is valid
-        checkAndFixCompilerCompliance(javaProject);
-    }
-
-    /**
-     * Checks, and fixes if needed, the compiler compliance level, and the source compatibility
-     * level
-     * @param javaProject The Java project to check and fix.
-     */
-    public static final void checkAndFixCompilerCompliance(IJavaProject javaProject) {
-        Pair<Integer, String> result = checkCompilerCompliance(javaProject);
-        if (result.getFirst().intValue() != COMPILER_COMPLIANCE_OK) {
-            // setup the preferred compiler compliance level.
-            javaProject.setOption(JavaCore.COMPILER_COMPLIANCE,
-                    AdtConstants.COMPILER_COMPLIANCE_PREFERRED);
-            javaProject.setOption(JavaCore.COMPILER_SOURCE,
-                    AdtConstants.COMPILER_COMPLIANCE_PREFERRED);
-            javaProject.setOption(JavaCore.COMPILER_CODEGEN_TARGET_PLATFORM,
-                    AdtConstants.COMPILER_COMPLIANCE_PREFERRED);
-
-            // clean the project to make sure we recompile
-            try {
-                javaProject.getProject().build(IncrementalProjectBuilder.CLEAN_BUILD,
-                        new NullProgressMonitor());
-            } catch (CoreException e) {
-                AdtPlugin.printErrorToConsole(javaProject.getProject(),
-                        "Project compiler settings changed. Clean your project.");
-            }
-        }
-    }
-
-    /**
-     * Makes the given project use JDK 6 (or more specifically,
-     * {@link AdtConstants#COMPILER_COMPLIANCE_PREFERRED} as the compilation
-     * target, regardless of what the default IDE JDK level is, provided a JRE
-     * of the given level is installed.
-     *
-     * @param javaProject the Java project
-     * @throws CoreException if the IDE throws an exception setting the compiler
-     *             level
-     */
-    @SuppressWarnings("restriction") // JDT API for setting compliance options
-    public static void enforcePreferredCompilerCompliance(@NonNull IJavaProject javaProject)
-            throws CoreException {
-        String compliance = javaProject.getOption(JavaCore.COMPILER_COMPLIANCE, true);
-        if (compliance == null ||
-                JavaModelUtil.isVersionLessThan(compliance, COMPILER_COMPLIANCE_PREFERRED)) {
-            IVMInstallType[] types = JavaRuntime.getVMInstallTypes();
-            for (int i = 0; i < types.length; i++) {
-                IVMInstallType type = types[i];
-                IVMInstall[] installs = type.getVMInstalls();
-                for (int j = 0; j < installs.length; j++) {
-                    IVMInstall install = installs[j];
-                    if (install instanceof IVMInstall2) {
-                        IVMInstall2 install2 = (IVMInstall2) install;
-                        // Java version can be 1.6.0, and preferred is 1.6
-                        if (install2.getJavaVersion().startsWith(COMPILER_COMPLIANCE_PREFERRED)) {
-                            Map<String, String> options = javaProject.getOptions(false);
-                            JavaCore.setComplianceOptions(COMPILER_COMPLIANCE_PREFERRED, options);
-                            JavaModelUtil.setDefaultClassfileOptions(options,
-                                    COMPILER_COMPLIANCE_PREFERRED);
-                            javaProject.setOptions(options);
-                            return;
-                        }
-                    }
-                }
-            }
-        }
-    }
-
-    /**
-     * Returns a {@link IProject} by its running application name, as it returned by the AVD.
-     * <p/>
-     * <var>applicationName</var> will in most case be the package declared in the manifest, but
-     * can, in some cases, be a custom process name declared in the manifest, in the
-     * <code>application</code>, <code>activity</code>, <code>receiver</code>, or
-     * <code>service</code> nodes.
-     * @param applicationName The application name.
-     * @return a project or <code>null</code> if no matching project were found.
-     */
-    public static IProject findAndroidProjectByAppName(String applicationName) {
-        // Get the list of project for the current workspace
-        IWorkspace workspace = ResourcesPlugin.getWorkspace();
-        IProject[] projects = workspace.getRoot().getProjects();
-
-        // look for a project that matches the packageName of the app
-        // we're trying to debug
-        for (IProject p : projects) {
-            if (p.isOpen()) {
-                try {
-                    if (p.hasNature(AdtConstants.NATURE_DEFAULT) == false) {
-                        // ignore non android projects
-                        continue;
-                    }
-                } catch (CoreException e) {
-                    // failed to get the nature? skip project.
-                    continue;
-                }
-
-                // check that there is indeed a manifest file.
-                IFile manifestFile = getManifest(p);
-                if (manifestFile == null) {
-                    // no file? skip this project.
-                    continue;
-                }
-
-                ManifestData data = AndroidManifestHelper.parseForData(manifestFile);
-                if (data == null) {
-                    // skip this project.
-                    continue;
-                }
-
-                String manifestPackage = data.getPackage();
-
-                if (manifestPackage != null && manifestPackage.equals(applicationName)) {
-                    // this is the project we were looking for!
-                    return p;
-                } else {
-                    // if the package and application name don't match,
-                    // we look for other possible process names declared in the manifest.
-                    String[] processes = data.getProcesses();
-                    for (String process : processes) {
-                        if (process.equals(applicationName)) {
-                            return p;
-                        }
-                    }
-                }
-            }
-        }
-
-        return null;
-
-    }
-
-    public static void fixProjectNatureOrder(IProject project) throws CoreException {
-        IProjectDescription description = project.getDescription();
-        String[] natures = description.getNatureIds();
-
-        // if the android nature is not the first one, we reorder them
-        if (AdtConstants.NATURE_DEFAULT.equals(natures[0]) == false) {
-            // look for the index
-            for (int i = 0 ; i < natures.length ; i++) {
-                if (AdtConstants.NATURE_DEFAULT.equals(natures[i])) {
-                    // if we try to just reorder the array in one pass, this doesn't do
-                    // anything. I guess JDT check that we are actually adding/removing nature.
-                    // So, first we'll remove the android nature, and then add it back.
-
-                    // remove the android nature
-                    removeNature(project, AdtConstants.NATURE_DEFAULT);
-
-                    // now add it back at the first index.
-                    description = project.getDescription();
-                    natures = description.getNatureIds();
-
-                    String[] newNatures = new String[natures.length + 1];
-
-                    // first one is android
-                    newNatures[0] = AdtConstants.NATURE_DEFAULT;
-
-                    // next the rest that was before the android nature
-                    System.arraycopy(natures, 0, newNatures, 1, natures.length);
-
-                    // set the new natures
-                    description.setNatureIds(newNatures);
-                    project.setDescription(description, null);
-
-                    // and stop
-                    break;
-                }
-            }
-        }
-    }
-
-
-    /**
-     * Removes a specific nature from a project.
-     * @param project The project to remove the nature from.
-     * @param nature The nature id to remove.
-     * @throws CoreException
-     */
-    public static void removeNature(IProject project, String nature) throws CoreException {
-        IProjectDescription description = project.getDescription();
-        String[] natures = description.getNatureIds();
-
-        // check if the project already has the android nature.
-        for (int i = 0; i < natures.length; ++i) {
-            if (nature.equals(natures[i])) {
-                String[] newNatures = new String[natures.length - 1];
-                if (i > 0) {
-                    System.arraycopy(natures, 0, newNatures, 0, i);
-                }
-                System.arraycopy(natures, i + 1, newNatures, i, natures.length - i - 1);
-                description.setNatureIds(newNatures);
-                project.setDescription(description, null);
-
-                return;
-            }
-        }
-
-    }
-
-    /**
-     * Returns if the project has error level markers.
-     * @param includeReferencedProjects flag to also test the referenced projects.
-     * @throws CoreException
-     */
-    public static boolean hasError(IProject project, boolean includeReferencedProjects)
-    throws CoreException {
-        IMarker[] markers = project.findMarkers(IMarker.PROBLEM, true, IResource.DEPTH_INFINITE);
-        if (markers != null && markers.length > 0) {
-            // the project has marker(s). even though they are "problem" we
-            // don't know their severity. so we loop on them and figure if they
-            // are warnings or errors
-            for (IMarker m : markers) {
-                int s = m.getAttribute(IMarker.SEVERITY, -1);
-                if (s == IMarker.SEVERITY_ERROR) {
-                    return true;
-                }
-            }
-        }
-
-        // test the referenced projects if needed.
-        if (includeReferencedProjects) {
-            List<IProject> projects = getReferencedProjects(project);
-
-            for (IProject p : projects) {
-                if (hasError(p, false)) {
-                    return true;
-                }
-            }
-        }
-
-        return false;
-    }
-
-    /**
-     * Saves a String property into the persistent storage of a resource.
-     * @param resource The resource into which the string value is saved.
-     * @param propertyName the name of the property. The id of the plug-in is added to this string.
-     * @param value the value to save
-     * @return true if the save succeeded.
-     */
-    public static boolean saveStringProperty(IResource resource, String propertyName,
-            String value) {
-        QualifiedName qname = new QualifiedName(AdtPlugin.PLUGIN_ID, propertyName);
-
-        try {
-            resource.setPersistentProperty(qname, value);
-        } catch (CoreException e) {
-            return false;
-        }
-
-        return true;
-    }
-
-    /**
-     * Loads a String property from the persistent storage of a resource.
-     * @param resource The resource from which the string value is loaded.
-     * @param propertyName the name of the property. The id of the plug-in is added to this string.
-     * @return the property value or null if it was not found.
-     */
-    public static String loadStringProperty(IResource resource, String propertyName) {
-        QualifiedName qname = new QualifiedName(AdtPlugin.PLUGIN_ID, propertyName);
-
-        try {
-            String value = resource.getPersistentProperty(qname);
-            return value;
-        } catch (CoreException e) {
-            return null;
-        }
-    }
-
-    /**
-     * Saves a property into the persistent storage of a resource.
-     * @param resource The resource into which the boolean value is saved.
-     * @param propertyName the name of the property. The id of the plug-in is added to this string.
-     * @param value the value to save
-     * @return true if the save succeeded.
-     */
-    public static boolean saveBooleanProperty(IResource resource, String propertyName,
-            boolean value) {
-        return saveStringProperty(resource, propertyName, Boolean.toString(value));
-    }
-
-    /**
-     * Loads a boolean property from the persistent storage of a resource.
-     * @param resource The resource from which the boolean value is loaded.
-     * @param propertyName the name of the property. The id of the plug-in is added to this string.
-     * @param defaultValue The default value to return if the property was not found.
-     * @return the property value or the default value if the property was not found.
-     */
-    public static boolean loadBooleanProperty(IResource resource, String propertyName,
-            boolean defaultValue) {
-        String value = loadStringProperty(resource, propertyName);
-        if (value != null) {
-            return Boolean.parseBoolean(value);
-        }
-
-        return defaultValue;
-    }
-
-    public static Boolean loadBooleanProperty(IResource resource, String propertyName) {
-        String value = loadStringProperty(resource, propertyName);
-        if (value != null) {
-            return Boolean.valueOf(value);
-        }
-
-        return null;
-    }
-
-    /**
-     * Saves the path of a resource into the persistent storage of a resource.
-     * @param resource The resource into which the resource path is saved.
-     * @param propertyName the name of the property. The id of the plug-in is added to this string.
-     * @param value The resource to save. It's its path that is actually stored. If null, an
-     *      empty string is stored.
-     * @return true if the save succeeded
-     */
-    public static boolean saveResourceProperty(IResource resource, String propertyName,
-            IResource value) {
-        if (value != null) {
-            IPath iPath = value.getFullPath();
-            return saveStringProperty(resource, propertyName, iPath.toString());
-        }
-
-        return saveStringProperty(resource, propertyName, ""); //$NON-NLS-1$
-    }
-
-    /**
-     * Loads the path of a resource from the persistent storage of a resource, and returns the
-     * corresponding IResource object.
-     * @param resource The resource from which the resource path is loaded.
-     * @param propertyName the name of the property. The id of the plug-in is added to this string.
-     * @return The corresponding IResource object (or children interface) or null
-     */
-    public static IResource loadResourceProperty(IResource resource, String propertyName) {
-        String value = loadStringProperty(resource, propertyName);
-
-        if (value != null && value.length() > 0) {
-            return ResourcesPlugin.getWorkspace().getRoot().findMember(new Path(value));
-        }
-
-        return null;
-    }
-
-    /**
-     * Returns the list of referenced project that are opened and Java projects.
-     * @param project
-     * @return a new list object containing the opened referenced java project.
-     * @throws CoreException
-     */
-    public static List<IProject> getReferencedProjects(IProject project) throws CoreException {
-        IProject[] projects = project.getReferencedProjects();
-
-        ArrayList<IProject> list = new ArrayList<IProject>();
-
-        for (IProject p : projects) {
-            if (p.isOpen() && p.hasNature(JavaCore.NATURE_ID)) {
-                list.add(p);
-            }
-        }
-
-        return list;
-    }
-
-
-    /**
-     * Checks a Java project compiler level option against a list of supported versions.
-     * @param optionValue the Compiler level option.
-     * @return true if the option value is supported.
-     */
-    private static boolean checkCompliance(@NonNull IJavaProject project, String optionValue) {
-        for (String s : AdtConstants.COMPILER_COMPLIANCE) {
-            if (s != null && s.equals(optionValue)) {
-                return true;
-            }
-        }
-
-        if (JavaCore.VERSION_1_7.equals(optionValue)) {
-            // Requires API 19 and buildTools 19
-            Sdk currentSdk = Sdk.getCurrent();
-            if (currentSdk != null) {
-                IProject p = project.getProject();
-                IAndroidTarget target = currentSdk.getTarget(p);
-                if (target == null || target.getVersion().getApiLevel() < 19) {
-                    return false;
-                }
-
-                ProjectState projectState = Sdk.getProjectState(p);
-                if (projectState != null) {
-                    BuildToolInfo buildToolInfo = projectState.getBuildToolInfo();
-                    if (buildToolInfo == null) {
-                        buildToolInfo = currentSdk.getLatestBuildTool();
-                    }
-                    if (buildToolInfo == null || buildToolInfo.getRevision().getMajor() < 19) {
-                        return false;
-                    }
-                }
-
-                return true;
-            }
-        }
-
-        return false;
-    }
-
-    /**
-     * Returns the apk filename for the given project
-     * @param project The project.
-     * @param config An optional config name. Can be null.
-     */
-    public static String getApkFilename(IProject project, String config) {
-        if (config != null) {
-            return project.getName() + "-" + config + SdkConstants.DOT_ANDROID_PACKAGE; //$NON-NLS-1$
-        }
-
-        return project.getName() + SdkConstants.DOT_ANDROID_PACKAGE;
-    }
-
-    /**
-     * Find the list of projects on which this JavaProject is dependent on at the compilation level.
-     *
-     * @param javaProject Java project that we are looking for the dependencies.
-     * @return A list of Java projects for which javaProject depend on.
-     * @throws JavaModelException
-     */
-    public static List<IJavaProject> getAndroidProjectDependencies(IJavaProject javaProject)
-        throws JavaModelException {
-        String[] requiredProjectNames = javaProject.getRequiredProjectNames();
-
-        // Go from java project name to JavaProject name
-        IJavaModel javaModel = javaProject.getJavaModel();
-
-        // loop through all dependent projects and keep only those that are Android projects
-        List<IJavaProject> projectList = new ArrayList<IJavaProject>(requiredProjectNames.length);
-        for (String javaProjectName : requiredProjectNames) {
-            IJavaProject androidJavaProject = javaModel.getJavaProject(javaProjectName);
-
-            //Verify that the project has also the Android Nature
-            try {
-                if (!androidJavaProject.getProject().hasNature(AdtConstants.NATURE_DEFAULT)) {
-                    continue;
-                }
-            } catch (CoreException e) {
-                continue;
-            }
-
-            projectList.add(androidJavaProject);
-        }
-
-        return projectList;
-    }
-
-    /**
-     * Returns the android package file as an IFile object for the specified
-     * project.
-     * @param project The project
-     * @return The android package as an IFile object or null if not found.
-     */
-    public static IFile getApplicationPackage(IProject project) {
-        // get the output folder
-        IFolder outputLocation = BaseProjectHelper.getAndroidOutputFolder(project);
-
-        if (outputLocation == null) {
-            AdtPlugin.printErrorToConsole(project,
-                    "Failed to get the output location of the project. Check build path properties"
-                    );
-            return null;
-        }
-
-
-        // get the package path
-        String packageName = project.getName() + SdkConstants.DOT_ANDROID_PACKAGE;
-        IResource r = outputLocation.findMember(packageName);
-
-        // check the package is present
-        if (r instanceof IFile && r.exists()) {
-            return (IFile)r;
-        }
-
-        String msg = String.format("Could not find %1$s!", packageName);
-        AdtPlugin.printErrorToConsole(project, msg);
-
-        return null;
-    }
-
-    /**
-     * Returns an {@link IFile} object representing the manifest for the given project.
-     *
-     * @param project The project containing the manifest file.
-     * @return An IFile object pointing to the manifest or null if the manifest
-     *         is missing.
-     */
-    public static IFile getManifest(IProject project) {
-        IResource r = project.findMember(AdtConstants.WS_SEP
-                + SdkConstants.FN_ANDROID_MANIFEST_XML);
-
-        if (r == null || r.exists() == false || (r instanceof IFile) == false) {
-            return null;
-        }
-        return (IFile) r;
-    }
-
-    /**
-     * Does a full release build of the application, including the libraries. Do not build the
-     * package.
-     *
-     * @param project The project to be built.
-     * @param monitor A eclipse runtime progress monitor to be updated by the builders.
-     * @throws CoreException
-     */
-    @SuppressWarnings("unchecked")
-    public static void compileInReleaseMode(IProject project, IProgressMonitor monitor)
-            throws CoreException {
-        compileInReleaseMode(project, true /*includeDependencies*/, monitor);
-    }
-
-    /**
-     * Does a full release build of the application, including the libraries. Do not build the
-     * package.
-     *
-     * @param project The project to be built.
-     * @param monitor A eclipse runtime progress monitor to be updated by the builders.
-     * @throws CoreException
-     */
-    @SuppressWarnings("unchecked")
-    private static void compileInReleaseMode(IProject project, boolean includeDependencies,
-            IProgressMonitor monitor)
-            throws CoreException {
-
-        if (includeDependencies) {
-            ProjectState projectState = Sdk.getProjectState(project);
-
-            // this gives us all the library projects, direct and indirect dependencies,
-            // so no need to run this method recursively.
-            List<IProject> libraries = projectState.getFullLibraryProjects();
-
-            // build dependencies in reverse order to prevent libraries being rebuilt
-            // due to refresh of other libraries (they would be compiled in the wrong mode).
-            for (int i = libraries.size() - 1 ; i >= 0 ; i--) {
-                IProject lib = libraries.get(i);
-                compileInReleaseMode(lib, false /*includeDependencies*/, monitor);
-
-                // force refresh of the dependency.
-                lib.refreshLocal(IResource.DEPTH_INFINITE, monitor);
-            }
-        }
-
-        // do a full build on all the builders to guarantee that the builders are called.
-        // (Eclipse does an optimization where builders are not called if there aren't any
-        // deltas).
-
-        ICommand[] commands = project.getDescription().getBuildSpec();
-        for (ICommand command : commands) {
-            String name = command.getBuilderName();
-            if (PreCompilerBuilder.ID.equals(name)) {
-                Map newArgs = new HashMap();
-                newArgs.put(PreCompilerBuilder.RELEASE_REQUESTED, "");
-                if (command.getArguments() != null) {
-                    newArgs.putAll(command.getArguments());
-                }
-
-                project.build(IncrementalProjectBuilder.FULL_BUILD,
-                        PreCompilerBuilder.ID, newArgs, monitor);
-            } else if (PostCompilerBuilder.ID.equals(name)) {
-                if (includeDependencies == false) {
-                    // this is a library, we need to build it!
-                    project.build(IncrementalProjectBuilder.FULL_BUILD, name,
-                            command.getArguments(), monitor);
-                }
-            } else {
-
-                project.build(IncrementalProjectBuilder.FULL_BUILD, name,
-                        command.getArguments(), monitor);
-            }
-        }
-    }
-
-    /**
-     * Force building the project and all its dependencies.
-     *
-     * @param project the project to build
-     * @param kind the build kind
-     * @param monitor
-     * @throws CoreException
-     */
-    public static void buildWithDeps(IProject project, int kind, IProgressMonitor monitor)
-            throws CoreException {
-        // Get list of projects that we depend on
-        ProjectState projectState = Sdk.getProjectState(project);
-
-        // this gives us all the library projects, direct and indirect dependencies,
-        // so no need to run this method recursively.
-        List<IProject> libraries = projectState.getFullLibraryProjects();
-
-        // build dependencies in reverse order to prevent libraries being rebuilt
-        // due to refresh of other libraries (they would be compiled in the wrong mode).
-        for (int i = libraries.size() - 1 ; i >= 0 ; i--) {
-            IProject lib = libraries.get(i);
-            lib.build(kind, monitor);
-            lib.refreshLocal(IResource.DEPTH_INFINITE, monitor);
-        }
-
-        project.build(kind, monitor);
-    }
-
-
-    /**
-     * Build project incrementally, including making the final packaging even if it is disabled
-     * by default.
-     *
-     * @param project The project to be built.
-     * @param monitor A eclipse runtime progress monitor to be updated by the builders.
-     * @throws CoreException
-     */
-    public static void doFullIncrementalDebugBuild(IProject project, IProgressMonitor monitor)
-            throws CoreException {
-        // Get list of projects that we depend on
-        List<IJavaProject> androidProjectList = new ArrayList<IJavaProject>();
-        try {
-            androidProjectList = getAndroidProjectDependencies(
-                                    BaseProjectHelper.getJavaProject(project));
-        } catch (JavaModelException e) {
-            AdtPlugin.printErrorToConsole(project, e);
-        }
-        // Recursively build dependencies
-        for (IJavaProject dependency : androidProjectList) {
-            doFullIncrementalDebugBuild(dependency.getProject(), monitor);
-        }
-
-        // Do an incremental build to pick up all the deltas
-        project.build(IncrementalProjectBuilder.INCREMENTAL_BUILD, monitor);
-
-        // If the preferences indicate not to use post compiler optimization
-        // then the incremental build will have done everything necessary, otherwise,
-        // we have to run the final builder manually (if requested).
-        if (AdtPrefs.getPrefs().getBuildSkipPostCompileOnFileSave()) {
-            // Create the map to pass to the PostC builder
-            Map<String, String> args = new TreeMap<String, String>();
-            args.put(PostCompilerBuilder.POST_C_REQUESTED, ""); //$NON-NLS-1$
-
-            // call the post compiler manually, forcing FULL_BUILD otherwise Eclipse won't
-            // call the builder since the delta is empty.
-            project.build(IncrementalProjectBuilder.FULL_BUILD,
-                          PostCompilerBuilder.ID, args, monitor);
-        }
-
-        // because the post compiler builder does a delayed refresh due to
-        // library not picking the refresh up if it's done during the build,
-        // we want to force a refresh here as this call is generally asking for
-        // a build to use the apk right after the call.
-        project.refreshLocal(IResource.DEPTH_INFINITE, monitor);
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/project/SupportLibraryHelper.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/project/SupportLibraryHelper.java
deleted file mode 100644
index e1819b2..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/project/SupportLibraryHelper.java
+++ /dev/null
@@ -1,176 +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.ide.eclipse.adt.internal.project;
-
-import static com.android.SdkConstants.FQCN_GRID_LAYOUT;
-import static com.android.SdkConstants.FQCN_GRID_LAYOUT_V7;
-import static com.android.SdkConstants.FQCN_SPACE;
-import static com.android.SdkConstants.FQCN_SPACE_V7;
-
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-import com.android.ide.eclipse.adt.AdtUtils;
-import com.android.ide.eclipse.adt.internal.actions.AddSupportJarAction;
-import com.android.ide.eclipse.adt.internal.editors.manifest.ManifestInfo;
-import com.android.ide.eclipse.adt.internal.sdk.ProjectState;
-import com.android.ide.eclipse.adt.internal.sdk.ProjectState.LibraryState;
-import com.android.ide.eclipse.adt.internal.sdk.Sdk;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.swt.widgets.Display;
-
-/**
- * Helper class for the Android Support Library. The support library provides
- * (for example) a backport of GridLayout, which must be used as a library
- * project rather than a jar library since it has resources. This class provides
- * support for finding the library project, or downloading and installing it on
- * demand if it does not, as well as translating tags such as
- * {@code <GridLayout>} into {@code <com.android.support.v7.GridLayout>} if it
- * does not.
- */
-public class SupportLibraryHelper {
-    /**
-     * Returns the correct tag to use for the given view tag. This is normally
-     * the same as the tag itself. However, for some views which are not available
-     * on all platforms, this will:
-     * <ul>
-     *  <li> Check if the view is available in the compatibility library,
-     *       and if so, if the support library is not installed, will offer to
-     *       install it via the SDK manager.
-     *  <li> (The tool may also offer to adjust the minimum SDK of the project
-     *       up to a level such that the given tag is supported directly, and then
-     *       this method will return the original tag.)
-     *  <li> Check whether the compatibility library is included in the project, and
-     *       if not, offer to copy it into the workspace and add a library dependency.
-     *  <li> Return the alternative tag. For example, for "GridLayout", it will
-     *       (if the minimum SDK is less than 14) return "com.android.support.v7.GridLayout"
-     *       instead.
-     * </ul>
-     *
-     * @param project the project to add the dependency into
-     * @param tag the tag to look up, such as "GridLayout"
-     * @return the tag to use in the layout, normally the same as the input tag but possibly
-     *      an equivalent compatibility library tag instead.
-     */
-    @NonNull
-    public static String getTagFor(@NonNull IProject project, @NonNull String tag) {
-        boolean isGridLayout = tag.equals(FQCN_GRID_LAYOUT);
-        boolean isSpace = tag.equals(FQCN_SPACE);
-        if (isGridLayout || isSpace) {
-            int minSdk = ManifestInfo.get(project).getMinSdkVersion();
-            if (minSdk < 14) {
-                // See if the support library is installed in the SDK area
-                // See if there is a local project in the workspace providing the
-                // project
-                IProject supportProject = getSupportProjectV7();
-                if (supportProject != null) {
-                    // Make sure I have a dependency on it
-                    ProjectState state = Sdk.getProjectState(project);
-                    if (state != null) {
-                        for (LibraryState library : state.getLibraries()) {
-                            if (supportProject.equals(library.getProjectState().getProject())) {
-                                // Found it: you have the compatibility library and have linked
-                                // to it: use the alternative tag
-                                return isGridLayout ? FQCN_GRID_LAYOUT_V7 : FQCN_SPACE_V7;
-                            }
-                        }
-                    }
-                }
-
-                // Ask user to install it
-                String message = String.format(
-                        "%1$s requires API level 14 or higher, or a compatibility "
-                                + "library for older versions.\n\n"
-                                + " Do you want to install the compatibility library?", tag);
-                MessageDialog dialog =
-                        new MessageDialog(
-                                Display.getCurrent().getActiveShell(),
-                                "Warning",
-                                null,
-                                message,
-                                MessageDialog.QUESTION,
-                                new String[] {
-                                        "Install", "Cancel"
-                                },
-                                1 /* default button: Cancel */);
-                int answer = dialog.open();
-                if (answer == 0) {
-                    if (supportProject != null) {
-                        // Just add library dependency
-                        if (!AddSupportJarAction.addLibraryDependency(
-                                supportProject,
-                                project,
-                                true /* waitForFinish */)) {
-                            return tag;
-                        }
-                    } else {
-                        // Install library AND add dependency
-                        if (!AddSupportJarAction.installGridLayoutLibrary(
-                                project,
-                                true /* waitForFinish */)) {
-                            return tag;
-                        }
-                    }
-
-                    return isGridLayout ? FQCN_GRID_LAYOUT_V7 : FQCN_SPACE_V7;
-                }
-            }
-        }
-
-        return tag;
-    }
-
-    /** Cache for {@link #getSupportProjectV7()} */
-    private static IProject sCachedProject;
-
-    /**
-     * Finds and returns the support project in the workspace, if any.
-     *
-     * @return the android support library project, or null if not found
-     */
-    @Nullable
-    public static IProject getSupportProjectV7() {
-        if (sCachedProject != null) {
-            if (sCachedProject.isAccessible()) {
-                return sCachedProject;
-            } else {
-                sCachedProject = null;
-            }
-        }
-
-        sCachedProject = findSupportProjectV7();
-        return sCachedProject;
-    }
-
-    @Nullable
-    private static IProject findSupportProjectV7() {
-        for (IJavaProject javaProject : AdtUtils.getOpenAndroidProjects()) {
-            IProject project = javaProject.getProject();
-            ProjectState state = Sdk.getProjectState(project);
-            if (state != null && state.isLibrary()) {
-                ManifestInfo manifestInfo = ManifestInfo.get(project);
-                if (manifestInfo.getPackage().equals("android.support.v7.gridlayout")) { //$NON-NLS-1$
-                    return project;
-                }
-            }
-        }
-
-        return null;
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/project/XmlErrorHandler.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/project/XmlErrorHandler.java
deleted file mode 100644
index c496c7e..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/project/XmlErrorHandler.java
+++ /dev/null
@@ -1,175 +0,0 @@
-/*
- * Copyright (C) 2007 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.project;
-
-import com.android.ide.common.xml.AndroidManifestParser.ManifestErrorHandler;
-import com.android.ide.eclipse.adt.AdtConstants;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.jdt.core.IJavaProject;
-import org.xml.sax.Locator;
-import org.xml.sax.SAXException;
-import org.xml.sax.SAXParseException;
-import org.xml.sax.helpers.DefaultHandler;
-
-/**
- * XML error handler used by the parser to report errors/warnings.
- */
-public class XmlErrorHandler extends DefaultHandler implements ManifestErrorHandler {
-
-    private final IJavaProject mJavaProject;
-    /** file being parsed */
-    private final IFile mFile;
-    /** link to the delta visitor, to set the xml error flag */
-    private final XmlErrorListener mErrorListener;
-
-    /**
-     * Classes which implement this interface provide a method that deals
-     * with XML errors.
-     */
-    public interface XmlErrorListener {
-        /**
-         * Sent when an XML error is detected.
-         */
-        public void errorFound();
-    }
-
-    public static class BasicXmlErrorListener implements XmlErrorListener {
-        public boolean mHasXmlError = false;
-
-        @Override
-        public void errorFound() {
-            mHasXmlError = true;
-        }
-    }
-
-    public XmlErrorHandler(IJavaProject javaProject, IFile file, XmlErrorListener errorListener) {
-        mJavaProject = javaProject;
-        mFile = file;
-        mErrorListener = errorListener;
-    }
-
-    public XmlErrorHandler(IFile file, XmlErrorListener errorListener) {
-        this(null, file, errorListener);
-    }
-
-    /**
-     * Xml Error call back
-     * @param exception the parsing exception
-     * @throws SAXException
-     */
-    @Override
-    public void error(SAXParseException exception) throws SAXException {
-        handleError(exception, exception.getLineNumber());
-    }
-
-    /**
-     * Xml Fatal Error call back
-     * @param exception the parsing exception
-     * @throws SAXException
-     */
-    @Override
-    public void fatalError(SAXParseException exception) throws SAXException {
-        handleError(exception, exception.getLineNumber());
-    }
-
-    /**
-     * Xml Warning call back
-     * @param exception the parsing exception
-     * @throws SAXException
-     */
-    @Override
-    public void warning(SAXParseException exception) throws SAXException {
-        if (mFile != null) {
-            BaseProjectHelper.markResource(mFile,
-                    AdtConstants.MARKER_XML,
-                    exception.getMessage(),
-                    exception.getLineNumber(),
-                    IMarker.SEVERITY_WARNING);
-        }
-    }
-
-    protected final IFile getFile() {
-        return mFile;
-    }
-
-    /**
-     * Handles a parsing error and an optional line number.
-     * @param exception
-     * @param lineNumber
-     */
-    @Override
-    public void handleError(Exception exception, int lineNumber) {
-        if (mErrorListener != null) {
-            mErrorListener.errorFound();
-        }
-
-        String message = exception.getMessage();
-        if (message == null) {
-            message = "Unknown error " + exception.getClass().getCanonicalName();
-        }
-
-        if (mFile != null) {
-            BaseProjectHelper.markResource(mFile,
-                    AdtConstants.MARKER_XML,
-                    message,
-                    lineNumber,
-                    IMarker.SEVERITY_ERROR);
-        }
-    }
-
-    /**
-     * Checks that a class is valid and can be used in the Android Manifest.
-     * <p/>
-     * Errors are put as {@link 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.
-     */
-    @Override
-    public void checkClass(Locator locator, String className, String superClassName,
-            boolean testVisibility) {
-        if (mJavaProject == null) {
-            return;
-        }
-        // we need to check the validity of the activity.
-        String result = BaseProjectHelper.testClassForManifest(mJavaProject,
-                className, superClassName, testVisibility);
-        if (result != BaseProjectHelper.TEST_CLASS_OK) {
-            // get the line number
-            int line = locator.getLineNumber();
-
-            // mark the file
-            IMarker marker = BaseProjectHelper.markResource(getFile(),
-                    AdtConstants.MARKER_ANDROID, result, line, IMarker.SEVERITY_ERROR);
-
-            // add custom attributes to be used by the manifest editor.
-            if (marker != null) {
-                try {
-                    marker.setAttribute(AdtConstants.MARKER_ATTR_TYPE,
-                            AdtConstants.MARKER_ATTR_TYPE_ACTIVITY);
-                    marker.setAttribute(AdtConstants.MARKER_ATTR_CLASS, className);
-                } catch (CoreException e) {
-                }
-            }
-        }
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/properties/AndroidPropertyPage.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/properties/AndroidPropertyPage.java
deleted file mode 100644
index 6e0e9be..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/properties/AndroidPropertyPage.java
+++ /dev/null
@@ -1,191 +0,0 @@
-/*
- * 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.properties;
-
-import com.android.SdkConstants;
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.ide.eclipse.adt.internal.sdk.ProjectState;
-import com.android.ide.eclipse.adt.internal.sdk.Sdk;
-import com.android.sdklib.IAndroidTarget;
-import com.android.sdklib.internal.project.ProjectProperties;
-import com.android.sdklib.internal.project.ProjectPropertiesWorkingCopy;
-import com.android.sdkuilib.internal.widgets.SdkTargetSelector;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Group;
-import org.eclipse.ui.dialogs.PropertyPage;
-
-/**
- * Property page for "Android" project.
- * This is accessible from the Package Explorer when right clicking a project and choosing
- * "Properties".
- *
- */
-public class AndroidPropertyPage extends PropertyPage {
-
-    private IProject mProject;
-    private SdkTargetSelector mSelector;
-    private Button mIsLibrary;
-    // APK-SPLIT: This is not yet supported, so we hide the UI
-//    private Button mSplitByDensity;
-    private LibraryProperties mLibraryDependencies;
-    private ProjectPropertiesWorkingCopy mPropertiesWorkingCopy;
-
-    public AndroidPropertyPage() {
-        // pass
-    }
-
-    @Override
-    protected Control createContents(Composite parent) {
-        // get the element (this is not yet valid in the constructor).
-        mProject = (IProject)getElement();
-
-        // get the targets from the sdk
-        IAndroidTarget[] targets = null;
-        if (Sdk.getCurrent() != null) {
-            targets = Sdk.getCurrent().getTargets();
-        }
-
-        // build the UI.
-        Composite top = new Composite(parent, SWT.NONE);
-        top.setLayoutData(new GridData(GridData.FILL_BOTH));
-        top.setLayout(new GridLayout(1, false));
-
-        Group targetGroup = new Group(top, SWT.NONE);
-        targetGroup.setLayoutData(new GridData(GridData.FILL_BOTH));
-        targetGroup.setLayout(new GridLayout(1, false));
-        targetGroup.setText("Project Build Target");
-
-        mSelector = new SdkTargetSelector(targetGroup, targets);
-
-        Group libraryGroup = new Group(top, SWT.NONE);
-        libraryGroup.setLayoutData(new GridData(GridData.FILL_BOTH));
-        libraryGroup.setLayout(new GridLayout(1, false));
-        libraryGroup.setText("Library");
-
-        mIsLibrary = new Button(libraryGroup, SWT.CHECK);
-        mIsLibrary.setText("Is Library");
-
-        mLibraryDependencies = new LibraryProperties(libraryGroup);
-
-        // fill the ui
-        fillUi();
-
-        // add callbacks
-        mSelector.setSelectionListener(new SelectionAdapter() {
-            @Override
-            public void widgetSelected(SelectionEvent e) {
-                updateValidity();
-            }
-        });
-
-        if (mProject.isOpen() == false) {
-            // disable the ui.
-        }
-
-        return top;
-    }
-
-    @Override
-    public boolean performOk() {
-        Sdk currentSdk = Sdk.getCurrent();
-        if (currentSdk != null && mProject.isOpen()) {
-            ProjectState state = Sdk.getProjectState(mProject);
-
-            // simply update the properties copy. Eclipse will be notified of the file change
-            // and will reload it smartly (detecting differences) and updating the ProjectState.
-            // See Sdk.mFileListener
-            boolean mustSaveProp = false;
-
-            IAndroidTarget newTarget = mSelector.getSelected();
-            if (state == null || newTarget != state.getTarget()) {
-                mPropertiesWorkingCopy.setProperty(ProjectProperties.PROPERTY_TARGET,
-                        newTarget.hashString());
-                mustSaveProp = true;
-            }
-
-            if (state == null || mIsLibrary.getSelection() != state.isLibrary()) {
-                mPropertiesWorkingCopy.setProperty(ProjectProperties.PROPERTY_LIBRARY,
-                        Boolean.toString(mIsLibrary.getSelection()));
-                mustSaveProp = true;
-            }
-
-            if (mLibraryDependencies.save()) {
-                mustSaveProp = true;
-            }
-
-            if (mustSaveProp) {
-                try {
-                    mPropertiesWorkingCopy.save();
-
-                    IResource projectProp = mProject.findMember(SdkConstants.FN_PROJECT_PROPERTIES);
-                    if (projectProp != null) {
-                        projectProp.refreshLocal(IResource.DEPTH_ZERO, new NullProgressMonitor());
-                    }
-                } catch (Exception e) {
-                    String msg = String.format(
-                            "Failed to save %1$s for project %2$s",
-                            SdkConstants.FN_PROJECT_PROPERTIES, mProject.getName());
-                    AdtPlugin.log(e, msg);
-                }
-            }
-        }
-
-        return true;
-    }
-
-    @Override
-    protected void performDefaults() {
-        fillUi();
-        updateValidity();
-    }
-
-    private void fillUi() {
-        if (Sdk.getCurrent() != null && mProject.isOpen()) {
-            ProjectState state = Sdk.getProjectState(mProject);
-
-            // make a working copy of the properties
-            mPropertiesWorkingCopy = state.getProperties().makeWorkingCopy();
-
-            // get the target
-            IAndroidTarget target = state.getTarget();
-            if (target != null) {
-                mSelector.setSelection(target);
-            }
-
-            mIsLibrary.setSelection(state.isLibrary());
-            mLibraryDependencies.setContent(state, mPropertiesWorkingCopy);
-        }
-
-    }
-
-    private void updateValidity() {
-        // look for the selection and validate the page if there is a selection
-        IAndroidTarget target = mSelector.getSelected();
-        setValid(target != null);
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/properties/LibraryProperties.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/properties/LibraryProperties.java
deleted file mode 100644
index a734b41..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/properties/LibraryProperties.java
+++ /dev/null
@@ -1,374 +0,0 @@
-/*
- * Copyright (C) 2010 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.properties;
-
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.ide.eclipse.adt.internal.project.ProjectChooserHelper;
-import com.android.ide.eclipse.adt.internal.project.ProjectChooserHelper.IProjectChooserFilter;
-import com.android.ide.eclipse.adt.internal.sdk.ProjectState;
-import com.android.ide.eclipse.adt.internal.sdk.ProjectState.LibraryState;
-import com.android.ide.eclipse.adt.internal.sdk.Sdk;
-import com.android.sdklib.internal.project.ProjectProperties;
-import com.android.sdklib.internal.project.ProjectPropertiesWorkingCopy;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.ControlAdapter;
-import org.eclipse.swt.events.ControlEvent;
-import org.eclipse.swt.events.DisposeEvent;
-import org.eclipse.swt.events.DisposeListener;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.graphics.Rectangle;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.swt.widgets.TableColumn;
-import org.eclipse.swt.widgets.TableItem;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Set;
-
-
-/**
- * Self-contained UI to edit the library dependencies of a Project.
- */
-final class LibraryProperties {
-
-    private Composite mTop;
-    private Table mTable;
-    private Image mMatchIcon;
-    private Image mErrorIcon;
-    private Button mAddButton;
-    private Button mRemoveButton;
-    private Button mUpButton;
-    private Button mDownButton;
-    private ProjectChooserHelper mProjectChooser;
-
-    /**
-     * Original ProjectState being edited. This is read-only.
-     * @see #mPropertiesWorkingCopy
-     */
-    private ProjectState mState;
-    /**
-     * read-write copy of the properties being edited.
-     */
-    private ProjectPropertiesWorkingCopy mPropertiesWorkingCopy;
-
-    private final List<ItemData> mItemDataList = new ArrayList<ItemData>();
-    private boolean mMustSave = false;
-
-    /**
-     * Internal struct to store library info in the table item.
-     */
-    private final static class ItemData {
-        String relativePath;
-        IProject project;
-    }
-
-    /**
-     * {@link IProjectChooserFilter} implementation that dynamically ignores libraries
-     * that are already dependencies.
-     */
-    IProjectChooserFilter mFilter = new IProjectChooserFilter() {
-        @Override
-        public boolean accept(IProject project) {
-            // first check if it's a library
-            ProjectState state = Sdk.getProjectState(project);
-            if (state != null) {
-                if (state.isLibrary() == false || project == mState.getProject()) {
-                    return false;
-                }
-
-                // then check if the library is not already part of the dependencies.
-                for (ItemData data : mItemDataList) {
-                    if (data.project == project) {
-                        return false;
-                    }
-                }
-
-                return true;
-            }
-
-            return false;
-        }
-
-        @Override
-        public boolean useCache() {
-            return false;
-        }
-    };
-
-    LibraryProperties(Composite parent) {
-
-        mMatchIcon = AdtPlugin.getImageDescriptor("/icons/match.png").createImage(); //$NON-NLS-1$
-        mErrorIcon = AdtPlugin.getImageDescriptor("/icons/error.png").createImage(); //$NON-NLS-1$
-
-        // Layout has 2 column
-        mTop = new Composite(parent, SWT.NONE);
-        mTop.setLayout(new GridLayout(2, false));
-        mTop.setLayoutData(new GridData(GridData.FILL_BOTH));
-        mTop.setFont(parent.getFont());
-        mTop.addDisposeListener(new DisposeListener() {
-            @Override
-            public void widgetDisposed(DisposeEvent e) {
-                mMatchIcon.dispose();
-                mErrorIcon.dispose();
-            }
-        });
-
-        mTable = new Table(mTop, SWT.BORDER | SWT.FULL_SELECTION | SWT.SINGLE);
-        mTable.setLayoutData(new GridData(GridData.FILL_BOTH));
-        mTable.setHeaderVisible(true);
-        mTable.setLinesVisible(false);
-        mTable.addSelectionListener(new SelectionAdapter() {
-            @Override
-            public void widgetSelected(SelectionEvent e) {
-                resetEnabled();
-            }
-        });
-
-        final TableColumn column0 = new TableColumn(mTable, SWT.NONE);
-        column0.setText("Reference");
-        final TableColumn column1 = new TableColumn(mTable, SWT.NONE);
-        column1.setText("Project");
-
-        Composite buttons = new Composite(mTop, SWT.NONE);
-        buttons.setLayout(new GridLayout());
-        buttons.setLayoutData(new GridData(GridData.FILL_VERTICAL));
-
-        mProjectChooser = new ProjectChooserHelper(parent.getShell(), mFilter);
-
-        mAddButton = new Button(buttons, SWT.PUSH | SWT.FLAT);
-        mAddButton.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-        mAddButton.setText("Add...");
-        mAddButton.addSelectionListener(new SelectionAdapter() {
-            @Override
-            public void widgetSelected(SelectionEvent e) {
-                IJavaProject javaProject = mProjectChooser.chooseJavaProject(null /*projectName*/,
-                        "Please select a library project");
-                if (javaProject != null) {
-                    IProject iProject = javaProject.getProject();
-                    IPath relativePath = iProject.getLocation().makeRelativeTo(
-                            mState.getProject().getLocation());
-
-                    addItem(relativePath.toString(), iProject, -1);
-                    resetEnabled();
-                    mMustSave = true;
-                }
-            }
-        });
-
-        mRemoveButton = new Button(buttons, SWT.PUSH | SWT.FLAT);
-        mRemoveButton.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-        mRemoveButton.setText("Remove");
-        mRemoveButton.addSelectionListener(new SelectionAdapter() {
-            @Override
-            public void widgetSelected(SelectionEvent e) {
-                // selection is ensured and in single mode.
-                TableItem selection = mTable.getSelection()[0];
-                ItemData data = (ItemData) selection.getData();
-                mItemDataList.remove(data);
-                mTable.remove(mTable.getSelectionIndex());
-                resetEnabled();
-                mMustSave = true;
-            }
-        });
-
-        Label l = new Label(buttons, SWT.SEPARATOR | SWT.HORIZONTAL);
-        l.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-
-        mUpButton = new Button(buttons, SWT.PUSH | SWT.FLAT);
-        mUpButton.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-        mUpButton.setText("Up");
-        mUpButton.addSelectionListener(new SelectionAdapter() {
-            @Override
-            public void widgetSelected(SelectionEvent e) {
-                int index = mTable.getSelectionIndex();
-                ItemData data = mItemDataList.remove(index);
-                mTable.remove(index);
-
-                // add at a lower index.
-                addItem(data.relativePath, data.project, index - 1);
-
-                // reset the selection
-                mTable.select(index - 1);
-                resetEnabled();
-                mMustSave = true;
-            }
-        });
-
-        mDownButton = new Button(buttons, SWT.PUSH | SWT.FLAT);
-        mDownButton.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-        mDownButton.setText("Down");
-        mDownButton.addSelectionListener(new SelectionAdapter() {
-            @Override
-            public void widgetSelected(SelectionEvent e) {
-                int index = mTable.getSelectionIndex();
-                ItemData data = mItemDataList.remove(index);
-                mTable.remove(index);
-
-                // add at a higher index.
-                addItem(data.relativePath, data.project, index + 1);
-
-                // reset the selection
-                mTable.select(index + 1);
-                resetEnabled();
-                mMustSave = true;
-            }
-        });
-
-        adjustColumnsWidth(mTable, column0, column1);
-    }
-
-    /**
-     * Sets or reset the content.
-     * @param state the {@link ProjectState} to display. This is read-only.
-     * @param propertiesWorkingCopy the working copy of {@link ProjectProperties} to modify.
-     */
-    void setContent(ProjectState state, ProjectPropertiesWorkingCopy propertiesWorkingCopy) {
-        mState = state;
-        mPropertiesWorkingCopy = propertiesWorkingCopy;
-
-        // reset content
-        mTable.removeAll();
-        mItemDataList.clear();
-
-        // get the libraries and make a copy of the data we need.
-        List<LibraryState> libs = state.getLibraries();
-
-        for (LibraryState lib : libs) {
-            ProjectState libState = lib.getProjectState();
-            addItem(lib.getRelativePath(), libState != null ? libState.getProject() : null, -1);
-        }
-
-        mMustSave = false;
-
-        resetEnabled();
-    }
-
-    /**
-     * Saves the state of the UI into the {@link ProjectProperties} object that was returned by
-     * {@link #setContent}.
-     * <p/>This does not update the {@link ProjectState} object that was provided, nor does it save
-     * the new properties on disk. Saving the properties on disk, via
-     * {@link ProjectPropertiesWorkingCopy#save()}, and updating the {@link ProjectState} instance,
-     * via {@link ProjectState#reloadProperties()} must be done by the caller.
-     * @return <code>true</code> if there was actually new data saved in the project state, false
-     * otherwise.
-     */
-    boolean save() {
-        boolean mustSave = mMustSave;
-        if (mMustSave) {
-            // remove all previous library dependencies.
-            Set<String> keys = mPropertiesWorkingCopy.keySet();
-            for (String key : keys) {
-                if (key.startsWith(ProjectProperties.PROPERTY_LIB_REF)) {
-                    mPropertiesWorkingCopy.removeProperty(key);
-                }
-            }
-
-            // now add the new libraries.
-            int index = 1;
-            for (ItemData data : mItemDataList) {
-                mPropertiesWorkingCopy.setProperty(ProjectProperties.PROPERTY_LIB_REF + index++,
-                        data.relativePath);
-            }
-        }
-
-        mMustSave = false;
-        return mustSave;
-    }
-
-    /**
-     * Enables or disables the whole widget.
-     * @param enabled whether the widget must be enabled or not.
-     */
-    void setEnabled(boolean enabled) {
-        if (enabled == false) {
-            mTable.setEnabled(false);
-            mAddButton.setEnabled(false);
-            mRemoveButton.setEnabled(false);
-            mUpButton.setEnabled(false);
-            mDownButton.setEnabled(false);
-        } else {
-            mTable.setEnabled(true);
-            mAddButton.setEnabled(true);
-            resetEnabled();
-        }
-    }
-
-    private void resetEnabled() {
-        int index = mTable.getSelectionIndex();
-        mRemoveButton.setEnabled(index != -1);
-        mUpButton.setEnabled(index > 0);
-        mDownButton.setEnabled(index != -1 && index < mTable.getItemCount() - 1);
-    }
-
-    /**
-     * Adds a new item and stores a {@link Stuff} into {@link #mStuff}.
-     *
-     * @param relativePath the relative path of the library entry
-     * @param project the associated IProject
-     * @param index if different than -1, the index at which to insert the item.
-     */
-    private void addItem(String relativePath, IProject project, int index) {
-        ItemData data = new ItemData();
-        data.relativePath = relativePath;
-        data.project = project;
-        TableItem item;
-        if (index == -1) {
-            mItemDataList.add(data);
-            item = new TableItem(mTable, SWT.NONE);
-        } else {
-            mItemDataList.add(index, data);
-            item = new TableItem(mTable, SWT.NONE, index);
-        }
-        item.setData(data);
-        item.setText(0, data.relativePath);
-        item.setImage(data.project != null ? mMatchIcon : mErrorIcon);
-        item.setText(1, data.project != null ? data.project.getName() : "?");
-    }
-
-    /**
-     * Adds a listener to adjust the columns width when the parent is resized.
-     * <p/>
-     * If we need something more fancy, we might want to use this:
-     * http://dev.eclipse.org/viewcvs/index.cgi/org.eclipse.swt.snippets/src/org/eclipse/swt/snippets/Snippet77.java?view=co
-     */
-    private void adjustColumnsWidth(final Table table,
-            final TableColumn column0,
-            final TableColumn column1) {
-        // Add a listener to resize the column to the full width of the table
-        table.addControlListener(new ControlAdapter() {
-            @Override
-            public void controlResized(ControlEvent e) {
-                Rectangle r = table.getClientArea();
-                column0.setWidth(r.width * 50 / 100); // 50%
-                column1.setWidth(r.width * 50 / 100); // 50%
-            }
-        });
-    }
-}
-
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/refactorings/core/AndroidPackageRenameParticipant.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/refactorings/core/AndroidPackageRenameParticipant.java
deleted file mode 100644
index b821777..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/refactorings/core/AndroidPackageRenameParticipant.java
+++ /dev/null
@@ -1,547 +0,0 @@
-/*
- * Copyright (C) 2010 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.refactorings.core;
-
-import static com.android.SdkConstants.ANDROID_URI;
-import static com.android.SdkConstants.ATTR_CLASS;
-import static com.android.SdkConstants.ATTR_CONTEXT;
-import static com.android.SdkConstants.ATTR_NAME;
-import static com.android.SdkConstants.ATTR_PACKAGE;
-import static com.android.SdkConstants.DOT_XML;
-import static com.android.SdkConstants.EXT_XML;
-import static com.android.SdkConstants.TOOLS_URI;
-import static com.android.SdkConstants.VIEW_FRAGMENT;
-import static com.android.SdkConstants.VIEW_TAG;
-
-import com.android.SdkConstants;
-import com.android.annotations.NonNull;
-import com.android.ide.common.xml.ManifestData;
-import com.android.ide.eclipse.adt.AdtConstants;
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.ide.eclipse.adt.internal.editors.layout.gle2.DomUtilities;
-import com.android.ide.eclipse.adt.internal.project.AndroidManifestHelper;
-import com.android.ide.eclipse.adt.internal.sdk.ProjectState;
-import com.android.ide.eclipse.adt.internal.sdk.Sdk;
-import com.android.resources.ResourceFolderType;
-import com.android.utils.SdkUtils;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IFolder;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.OperationCanceledException;
-import org.eclipse.jdt.core.IJavaElement;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.IPackageFragment;
-import org.eclipse.jdt.core.JavaModelException;
-import org.eclipse.jdt.internal.corext.refactoring.changes.RenamePackageChange;
-import org.eclipse.jdt.internal.corext.refactoring.rename.RenameCompilationUnitProcessor;
-import org.eclipse.jdt.internal.corext.refactoring.rename.RenameTypeProcessor;
-import org.eclipse.jface.text.IRegion;
-import org.eclipse.jface.text.Region;
-import org.eclipse.ltk.core.refactoring.Change;
-import org.eclipse.ltk.core.refactoring.CompositeChange;
-import org.eclipse.ltk.core.refactoring.FileStatusContext;
-import org.eclipse.ltk.core.refactoring.NullChange;
-import org.eclipse.ltk.core.refactoring.RefactoringStatus;
-import org.eclipse.ltk.core.refactoring.RefactoringStatusContext;
-import org.eclipse.ltk.core.refactoring.TextFileChange;
-import org.eclipse.ltk.core.refactoring.participants.CheckConditionsContext;
-import org.eclipse.ltk.core.refactoring.participants.RefactoringProcessor;
-import org.eclipse.ltk.core.refactoring.participants.RenameParticipant;
-import org.eclipse.text.edits.MultiTextEdit;
-import org.eclipse.text.edits.ReplaceEdit;
-import org.eclipse.text.edits.TextEdit;
-import org.eclipse.wst.sse.core.StructuredModelManager;
-import org.eclipse.wst.sse.core.internal.provisional.IModelManager;
-import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
-import org.eclipse.wst.sse.core.internal.provisional.IndexedRegion;
-import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
-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.io.IOException;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
-
-/**
- * A participant to participate in refactorings that rename a package in an Android project.
- * The class updates android manifest and the layout file
- * The user can suppress refactoring by disabling the "Update references" checkbox
- * <p>
- * Rename participants are registered via the extension point <code>
- * org.eclipse.ltk.core.refactoring.renameParticipants</code>.
- * Extensions to this extension point must therefore extend
- * <code>org.eclipse.ltk.core.refactoring.participants.RenameParticipant</code>.
- * </p>
- */
-@SuppressWarnings("restriction")
-public class AndroidPackageRenameParticipant extends RenameParticipant {
-
-    private IProject mProject;
-    private IFile mManifestFile;
-    private IPackageFragment mPackageFragment;
-    private String mOldPackage;
-    private String mNewPackage;
-    private String mAppPackage;
-    private boolean mRefactoringAppPackage;
-
-    @Override
-    public String getName() {
-        return "Android Package Rename";
-    }
-
-    @Override
-    public RefactoringStatus checkConditions(IProgressMonitor pm, CheckConditionsContext context)
-            throws OperationCanceledException {
-        if (mAppPackage.equals(mOldPackage) && !mRefactoringAppPackage) {
-            IRegion region = null;
-            Document document = DomUtilities.getDocument(mManifestFile);
-            if (document != null && document.getDocumentElement() != null) {
-                Attr attribute = document.getDocumentElement().getAttributeNode(ATTR_PACKAGE);
-                if (attribute instanceof IndexedRegion) {
-                    IndexedRegion ir = (IndexedRegion) attribute;
-                    int start = ir.getStartOffset();
-                    region = new Region(start, ir.getEndOffset() - start);
-                }
-            }
-            if (region == null) {
-                region = new Region(0, 0);
-            }
-            // There's no line wrapping in the error dialog, so split up the message into
-            // individually digestible pieces of information
-            RefactoringStatusContext ctx = new FileStatusContext(mManifestFile, region);
-            RefactoringStatus status = RefactoringStatus.createInfoStatus(
-                    "You are refactoring the same package as your application's " +
-                    "package (specified in the manifest).\n", ctx);
-            status.addInfo(
-                    "Note that this refactoring does NOT also update your " +
-                    "application package.", ctx);
-            status.addInfo("The application package defines your application's identity.", ctx);
-            status.addInfo(
-                    "If you change it, then it is considered to be a different application.", ctx);
-            status.addInfo("(Users of the previous version cannot update to the new version.)",
-                    ctx);
-            status.addInfo(
-                    "The application package, and the package containing the code, can differ.",
-                    ctx);
-            status.addInfo(
-                    "To really change application package, " +
-                    "choose \"Android Tools\" > \"Rename  Application Package.\" " +
-                    "from the project context menu.", ctx);
-            return status;
-        }
-
-        return new RefactoringStatus();
-    }
-
-    @Override
-    protected boolean initialize(final Object element) {
-        mRefactoringAppPackage = false;
-        try {
-            // Only propose this refactoring if the "Update References" checkbox is set.
-            if (!getArguments().getUpdateReferences()) {
-                return false;
-            }
-
-            if (element instanceof IPackageFragment) {
-                mPackageFragment = (IPackageFragment) element;
-                if (!mPackageFragment.containsJavaResources()) {
-                    return false;
-                }
-                IJavaProject javaProject = (IJavaProject) mPackageFragment
-                        .getAncestor(IJavaElement.JAVA_PROJECT);
-                mProject = javaProject.getProject();
-                IResource manifestResource = mProject.findMember(AdtConstants.WS_SEP
-                        + SdkConstants.FN_ANDROID_MANIFEST_XML);
-
-                if (manifestResource == null || !manifestResource.exists()
-                        || !(manifestResource instanceof IFile)) {
-                    RefactoringUtil.logInfo("Invalid or missing the "
-                            + SdkConstants.FN_ANDROID_MANIFEST_XML + " in the "
-                            + mProject.getName() + " project.");
-                    return false;
-                }
-                mManifestFile = (IFile) manifestResource;
-                String packageName = mPackageFragment.getElementName();
-                ManifestData manifestData;
-                manifestData = AndroidManifestHelper.parseForData(mManifestFile);
-                if (manifestData == null) {
-                    return false;
-                }
-                mAppPackage = manifestData.getPackage();
-                mOldPackage = packageName;
-                mNewPackage = getArguments().getNewName();
-                if (mOldPackage == null || mNewPackage == null) {
-                    return false;
-                }
-
-                if (RefactoringUtil.isRefactorAppPackage()
-                        && mAppPackage != null
-                        && mAppPackage.equals(packageName)) {
-                    mRefactoringAppPackage = true;
-                }
-
-                return true;
-            }
-        } catch (JavaModelException ignore) {
-        }
-        return false;
-    }
-
-
-    @Override
-    public Change createChange(IProgressMonitor pm) throws CoreException,
-            OperationCanceledException {
-        if (pm.isCanceled()) {
-            return null;
-        }
-        if (!getArguments().getUpdateReferences()) {
-            return null;
-        }
-
-        RefactoringProcessor p = getProcessor();
-        if (p instanceof RenameCompilationUnitProcessor) {
-            RenameTypeProcessor rtp =
-                    ((RenameCompilationUnitProcessor) p).getRenameTypeProcessor();
-            if (rtp != null) {
-                String pattern = rtp.getFilePatterns();
-                boolean updQualf = rtp.getUpdateQualifiedNames();
-                if (updQualf && pattern != null && pattern.contains("xml")) { //$NON-NLS-1$
-                    // Do not propose this refactoring if the
-                    // "Update fully qualified names in non-Java files" option is
-                    // checked and the file patterns mention XML. [c.f. SDK bug 21589]
-                    return null;
-                }
-            }
-        }
-
-        IPath pkgPath = mPackageFragment.getPath();
-        IPath genPath = mProject.getFullPath().append(SdkConstants.FD_GEN_SOURCES);
-        if (genPath.isPrefixOf(pkgPath)) {
-            RefactoringUtil.logInfo(getName() + ": Cannot rename generated package.");
-            return null;
-        }
-        CompositeChange result = new CompositeChange(getName());
-        result.markAsSynthetic();
-
-        addManifestFileChanges(result);
-
-        // Update layout files; we don't just need to react to custom view
-        // changes, we need to update fragment references and even tool:context activity
-        // references
-        addLayoutFileChanges(mProject, result);
-
-        // Also update in dependent projects
-        ProjectState projectState = Sdk.getProjectState(mProject);
-        if (projectState != null) {
-            Collection<ProjectState> parentProjects = projectState.getFullParentProjects();
-            for (ProjectState parentProject : parentProjects) {
-                IProject project = parentProject.getProject();
-                addLayoutFileChanges(project, result);
-            }
-        }
-
-        if (mRefactoringAppPackage) {
-            Change genChange = getGenPackageChange(pm);
-            if (genChange != null) {
-                result.add(genChange);
-            }
-
-            return new NullChange("Update Imports") {
-                @Override
-                public Change perform(IProgressMonitor monitor) throws CoreException {
-                    FixImportsJob job = new FixImportsJob("Fix Rename Package",
-                            mManifestFile, mNewPackage);
-                    job.schedule(500);
-
-                    // Not undoable: just return null instead of an undo-change.
-                    return null;
-                }
-            };
-        }
-
-        return (result.getChildren().length == 0) ? null : result;
-    }
-
-    /**
-     * Returns Android gen package text change
-     *
-     * @param pm the progress monitor
-     *
-     * @return Android gen package text change
-     * @throws CoreException if an error happens
-     * @throws OperationCanceledException if the operation is canceled
-     */
-    public Change getGenPackageChange(IProgressMonitor pm) throws CoreException,
-            OperationCanceledException {
-        if (mRefactoringAppPackage) {
-            IPackageFragment genJavaPackageFragment = getGenPackageFragment();
-            if (genJavaPackageFragment != null && genJavaPackageFragment.exists()) {
-                return new RenamePackageChange(genJavaPackageFragment, mNewPackage, true);
-            }
-        }
-        return null;
-    }
-
-    /**
-     * Return the gen package fragment
-     */
-    private IPackageFragment getGenPackageFragment() throws JavaModelException {
-        IJavaProject javaProject = (IJavaProject) mPackageFragment
-                .getAncestor(IJavaElement.JAVA_PROJECT);
-        if (javaProject != null && javaProject.isOpen()) {
-            IProject project = javaProject.getProject();
-            IFolder genFolder = project.getFolder(SdkConstants.FD_GEN_SOURCES);
-            if (genFolder.exists()) {
-                String javaPackagePath = mAppPackage.replace('.', '/');
-                IPath genJavaPackagePath = genFolder.getFullPath().append(javaPackagePath);
-                IPackageFragment genPackageFragment = javaProject
-                        .findPackageFragment(genJavaPackagePath);
-                return genPackageFragment;
-            }
-        }
-        return null;
-    }
-
-    /**
-     * Returns the new class name
-     *
-     * @param fqcn the fully qualified class name in the renamed package
-     * @return the new class name
-     */
-    private String getNewClassName(String fqcn) {
-        assert isInRenamedPackage(fqcn) : fqcn;
-        int lastDot = fqcn.lastIndexOf('.');
-        if (lastDot < 0) {
-            return mNewPackage;
-        }
-        String name = fqcn.substring(lastDot, fqcn.length());
-        String newClassName = mNewPackage + name;
-        return newClassName;
-    }
-
-    private void addManifestFileChanges(CompositeChange result) {
-        addXmlFileChanges(mManifestFile, result, true);
-    }
-
-    private void addLayoutFileChanges(IProject project, CompositeChange result) {
-        try {
-            // Update references in XML resource files
-            IFolder resFolder = project.getFolder(SdkConstants.FD_RESOURCES);
-
-            IResource[] folders = resFolder.members();
-            for (IResource folder : folders) {
-                String folderName = folder.getName();
-                ResourceFolderType folderType = ResourceFolderType.getFolderType(folderName);
-                if (folderType != ResourceFolderType.LAYOUT) {
-                    continue;
-                }
-                if (!(folder instanceof IFolder)) {
-                    continue;
-                }
-                IResource[] files = ((IFolder) folder).members();
-                for (int i = 0; i < files.length; i++) {
-                    IResource member = files[i];
-                    if ((member instanceof IFile) && member.exists()) {
-                        IFile file = (IFile) member;
-                        String fileName = member.getName();
-
-                        if (SdkUtils.endsWith(fileName, DOT_XML)) {
-                            addXmlFileChanges(file, result, false);
-                        }
-                    }
-                }
-            }
-        } catch (CoreException e) {
-            RefactoringUtil.log(e);
-        }
-    }
-
-    private boolean addXmlFileChanges(IFile file, CompositeChange changes, boolean isManifest) {
-        IModelManager modelManager = StructuredModelManager.getModelManager();
-        IStructuredModel model = null;
-        try {
-            model = modelManager.getExistingModelForRead(file);
-            if (model == null) {
-                model = modelManager.getModelForRead(file);
-            }
-            if (model != null) {
-                IStructuredDocument document = model.getStructuredDocument();
-                if (model instanceof IDOMModel) {
-                    IDOMModel domModel = (IDOMModel) model;
-                    Element root = domModel.getDocument().getDocumentElement();
-                    if (root != null) {
-                        List<TextEdit> edits = new ArrayList<TextEdit>();
-                        if (isManifest) {
-                            addManifestReplacements(edits, root, document);
-                        } else {
-                            addLayoutReplacements(edits, root, document);
-                        }
-                        if (!edits.isEmpty()) {
-                            MultiTextEdit rootEdit = new MultiTextEdit();
-                            rootEdit.addChildren(edits.toArray(new TextEdit[edits.size()]));
-                            TextFileChange change = new TextFileChange(file.getName(), file);
-                            change.setTextType(EXT_XML);
-                            change.setEdit(rootEdit);
-                            changes.add(change);
-                        }
-                    }
-                } else {
-                    return false;
-                }
-            }
-
-            return true;
-        } catch (IOException e) {
-            AdtPlugin.log(e, null);
-        } catch (CoreException e) {
-            AdtPlugin.log(e, null);
-        } finally {
-            if (model != null) {
-                model.releaseFromRead();
-            }
-        }
-
-        return false;
-    }
-
-    private boolean isInRenamedPackage(String fqcn) {
-        return fqcn.startsWith(mOldPackage)
-                && fqcn.length() > mOldPackage.length()
-                && fqcn.indexOf('.', mOldPackage.length() + 1) == -1;
-    }
-
-    private void addLayoutReplacements(
-            @NonNull List<TextEdit> edits,
-            @NonNull Element element,
-            @NonNull IStructuredDocument document) {
-        String tag = element.getTagName();
-        if (isInRenamedPackage(tag)) {
-            int start = RefactoringUtil.getTagNameRangeStart(element, document);
-            if (start != -1) {
-                int end = start + tag.length();
-                edits.add(new ReplaceEdit(start, end - start, getNewClassName(tag)));
-            }
-        } else {
-            Attr classNode = null;
-            if (tag.equals(VIEW_TAG)) {
-                classNode = element.getAttributeNode(ATTR_CLASS);
-            } else if (tag.equals(VIEW_FRAGMENT)) {
-                classNode = element.getAttributeNode(ATTR_CLASS);
-                if (classNode == null) {
-                    classNode = element.getAttributeNodeNS(ANDROID_URI, ATTR_NAME);
-                }
-            } else if (element.hasAttributeNS(TOOLS_URI, ATTR_CONTEXT)) {
-                classNode = element.getAttributeNodeNS(TOOLS_URI, ATTR_CONTEXT);
-                if (classNode != null && classNode.getValue().startsWith(".")) { //$NON-NLS-1$
-                    classNode = null;
-                }
-            }
-            if (classNode != null) {
-                String fqcn = classNode.getValue();
-                if (isInRenamedPackage(fqcn)) {
-                    int start = RefactoringUtil.getAttributeValueRangeStart(classNode, document);
-                    if (start != -1) {
-                        int end = start + fqcn.length();
-                        edits.add(new ReplaceEdit(start, end - start, getNewClassName(fqcn)));
-                    }
-                }
-            }
-        }
-
-        NodeList children = element.getChildNodes();
-        for (int i = 0, n = children.getLength(); i < n; i++) {
-            Node child = children.item(i);
-            if (child.getNodeType() == Node.ELEMENT_NODE) {
-                addLayoutReplacements(edits, (Element) child, document);
-            }
-        }
-    }
-
-    private void addManifestReplacements(
-            @NonNull List<TextEdit> edits,
-            @NonNull Element element,
-            @NonNull IStructuredDocument document) {
-        if (mRefactoringAppPackage &&
-                element == element.getOwnerDocument().getDocumentElement()) {
-            // Update the app package declaration
-            Attr pkg = element.getAttributeNode(ATTR_PACKAGE);
-            if (pkg != null && pkg.getValue().equals(mOldPackage)) {
-                int start = RefactoringUtil.getAttributeValueRangeStart(pkg, document);
-                if (start != -1) {
-                    int end = start + mOldPackage.length();
-                    edits.add(new ReplaceEdit(start, end - start, mNewPackage));
-                }
-            }
-        }
-
-        NamedNodeMap attributes = element.getAttributes();
-        for (int i = 0, n = attributes.getLength(); i < n; i++) {
-            Attr attr = (Attr) attributes.item(i);
-            if (!RefactoringUtil.isManifestClassAttribute(attr)) {
-                continue;
-            }
-
-            String value = attr.getValue();
-            if (isInRenamedPackage(value)) {
-                int start = RefactoringUtil.getAttributeValueRangeStart(attr, document);
-                if (start != -1) {
-                    int end = start + value.length();
-                    edits.add(new ReplaceEdit(start, end - start, getNewClassName(value)));
-                }
-            } else if (value.startsWith(".")) {
-                // If we're renaming the app package
-                String fqcn = mAppPackage + value;
-                if (isInRenamedPackage(fqcn)) {
-                    int start = RefactoringUtil.getAttributeValueRangeStart(attr, document);
-                    if (start != -1) {
-                        int end = start + value.length();
-                        String newClassName = getNewClassName(fqcn);
-                        if (mRefactoringAppPackage) {
-                            newClassName = newClassName.substring(mNewPackage.length());
-                        } else if (newClassName.startsWith(mOldPackage)
-                                && newClassName.charAt(mOldPackage.length()) == '.') {
-                            newClassName = newClassName.substring(mOldPackage.length());
-                        }
-
-                        if (!newClassName.equals(value)) {
-                            edits.add(new ReplaceEdit(start, end - start, newClassName));
-                        }
-                    }
-                }
-            }
-        }
-
-        NodeList children = element.getChildNodes();
-        for (int i = 0, n = children.getLength(); i < n; i++) {
-            Node child = children.item(i);
-            if (child.getNodeType() == Node.ELEMENT_NODE) {
-                addManifestReplacements(edits, (Element) child, document);
-            }
-        }
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/refactorings/core/AndroidTypeMoveParticipant.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/refactorings/core/AndroidTypeMoveParticipant.java
deleted file mode 100644
index 2146184..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/refactorings/core/AndroidTypeMoveParticipant.java
+++ /dev/null
@@ -1,362 +0,0 @@
-/*
- * Copyright (C) 2010 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.refactorings.core;
-
-import static com.android.SdkConstants.ANDROID_URI;
-import static com.android.SdkConstants.ATTR_CLASS;
-import static com.android.SdkConstants.ATTR_CONTEXT;
-import static com.android.SdkConstants.ATTR_NAME;
-import static com.android.SdkConstants.DOT_XML;
-import static com.android.SdkConstants.EXT_XML;
-import static com.android.SdkConstants.TOOLS_URI;
-import static com.android.SdkConstants.VIEW_FRAGMENT;
-import static com.android.SdkConstants.VIEW_TAG;
-
-import com.android.SdkConstants;
-import com.android.annotations.NonNull;
-import com.android.ide.common.xml.ManifestData;
-import com.android.ide.eclipse.adt.AdtConstants;
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.ide.eclipse.adt.internal.project.AndroidManifestHelper;
-import com.android.ide.eclipse.adt.internal.sdk.ProjectState;
-import com.android.ide.eclipse.adt.internal.sdk.Sdk;
-import com.android.resources.ResourceFolderType;
-import com.android.utils.SdkUtils;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IFolder;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.OperationCanceledException;
-import org.eclipse.jdt.core.IJavaElement;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.IPackageFragment;
-import org.eclipse.jdt.core.IType;
-import org.eclipse.jdt.core.JavaModelException;
-import org.eclipse.ltk.core.refactoring.Change;
-import org.eclipse.ltk.core.refactoring.CompositeChange;
-import org.eclipse.ltk.core.refactoring.RefactoringStatus;
-import org.eclipse.ltk.core.refactoring.TextFileChange;
-import org.eclipse.ltk.core.refactoring.participants.CheckConditionsContext;
-import org.eclipse.ltk.core.refactoring.participants.MoveParticipant;
-import org.eclipse.text.edits.MultiTextEdit;
-import org.eclipse.text.edits.ReplaceEdit;
-import org.eclipse.text.edits.TextEdit;
-import org.eclipse.wst.sse.core.StructuredModelManager;
-import org.eclipse.wst.sse.core.internal.provisional.IModelManager;
-import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
-import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
-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.IOException;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
-
-/**
- * A participant to participate in refactorings that move a type in an Android project.
- * The class updates android manifest and the layout file
- * The user can suppress refactoring by disabling the "Update references" checkbox
- * <p>
- * Rename participants are registered via the extension point <code>
- * org.eclipse.ltk.core.refactoring.moveParticipants</code>.
- * Extensions to this extension point must therefore extend <code>org.eclipse.ltk.core.refactoring.participants.MoveParticipant</code>.
- * </p>
- */
-@SuppressWarnings("restriction")
-public class AndroidTypeMoveParticipant extends MoveParticipant {
-
-    private IProject mProject;
-    protected IFile mManifestFile;
-    protected String mOldFqcn;
-    protected String mNewFqcn;
-    protected String mAppPackage;
-
-    @Override
-    public String getName() {
-        return "Android Type Move";
-    }
-
-    @Override
-    public RefactoringStatus checkConditions(IProgressMonitor pm, CheckConditionsContext context)
-            throws OperationCanceledException {
-        return new RefactoringStatus();
-    }
-
-    @Override
-    protected boolean initialize(Object element) {
-        if (element instanceof IType) {
-            IType type = (IType) element;
-            IJavaProject javaProject = (IJavaProject) type.getAncestor(IJavaElement.JAVA_PROJECT);
-            mProject = javaProject.getProject();
-            IResource manifestResource = mProject.findMember(AdtConstants.WS_SEP
-                    + SdkConstants.FN_ANDROID_MANIFEST_XML);
-
-            if (manifestResource == null || !manifestResource.exists()
-                    || !(manifestResource instanceof IFile)) {
-                RefactoringUtil.logInfo("Invalid or missing the "
-                        + SdkConstants.FN_ANDROID_MANIFEST_XML + " in the " + mProject.getName()
-                        + " project.");
-                return false;
-            }
-            mManifestFile = (IFile) manifestResource;
-            ManifestData manifestData;
-            manifestData = AndroidManifestHelper.parseForData(mManifestFile);
-            if (manifestData == null) {
-                return false;
-            }
-            mAppPackage = manifestData.getPackage();
-            mOldFqcn = type.getFullyQualifiedName();
-            Object destination = getArguments().getDestination();
-            if (destination instanceof IPackageFragment) {
-                IPackageFragment packageFragment = (IPackageFragment) destination;
-                mNewFqcn = packageFragment.getElementName() + "." + type.getElementName();
-            } else if (destination instanceof IResource) {
-                try {
-                    IPackageFragment[] fragments = javaProject.getPackageFragments();
-                    for (IPackageFragment fragment : fragments) {
-                        IResource resource = fragment.getResource();
-                        if (resource.equals(destination)) {
-                            mNewFqcn = fragment.getElementName() + '.' + type.getElementName();
-                            break;
-                        }
-                    }
-                } catch (JavaModelException e) {
-                    // pass
-                }
-            }
-            return mOldFqcn != null && mNewFqcn != null;
-        }
-
-        return false;
-    }
-
-    @Override
-    public Change createChange(IProgressMonitor pm) throws CoreException,
-            OperationCanceledException {
-        if (pm.isCanceled()) {
-            return null;
-        }
-        if (!getArguments().getUpdateReferences()) {
-            return null;
-        }
-        CompositeChange result = new CompositeChange(getName());
-        result.markAsSynthetic();
-
-        addManifestFileChanges(result);
-
-        // Update layout files; we don't just need to react to custom view
-        // changes, we need to update fragment references and even tool:context activity
-        // references
-        addLayoutFileChanges(mProject, result);
-
-        // Also update in dependent projects
-        ProjectState projectState = Sdk.getProjectState(mProject);
-        if (projectState != null) {
-            Collection<ProjectState> parentProjects = projectState.getFullParentProjects();
-            for (ProjectState parentProject : parentProjects) {
-                IProject project = parentProject.getProject();
-                addLayoutFileChanges(project, result);
-            }
-        }
-
-        return (result.getChildren().length == 0) ? null : result;
-    }
-
-    private void addManifestFileChanges(CompositeChange result) {
-        addXmlFileChanges(mManifestFile, result, true);
-    }
-
-    private void addLayoutFileChanges(IProject project, CompositeChange result) {
-        try {
-            // Update references in XML resource files
-            IFolder resFolder = project.getFolder(SdkConstants.FD_RESOURCES);
-
-            IResource[] folders = resFolder.members();
-            for (IResource folder : folders) {
-                String folderName = folder.getName();
-                ResourceFolderType folderType = ResourceFolderType.getFolderType(folderName);
-                if (folderType != ResourceFolderType.LAYOUT) {
-                    continue;
-                }
-                if (!(folder instanceof IFolder)) {
-                    continue;
-                }
-                IResource[] files = ((IFolder) folder).members();
-                for (int i = 0; i < files.length; i++) {
-                    IResource member = files[i];
-                    if ((member instanceof IFile) && member.exists()) {
-                        IFile file = (IFile) member;
-                        String fileName = member.getName();
-
-                        if (SdkUtils.endsWith(fileName, DOT_XML)) {
-                            addXmlFileChanges(file, result, false);
-                        }
-                    }
-                }
-            }
-        } catch (CoreException e) {
-            RefactoringUtil.log(e);
-        }
-    }
-
-    private boolean addXmlFileChanges(IFile file, CompositeChange changes, boolean isManifest) {
-        IModelManager modelManager = StructuredModelManager.getModelManager();
-        IStructuredModel model = null;
-        try {
-            model = modelManager.getExistingModelForRead(file);
-            if (model == null) {
-                model = modelManager.getModelForRead(file);
-            }
-            if (model != null) {
-                IStructuredDocument document = model.getStructuredDocument();
-                if (model instanceof IDOMModel) {
-                    IDOMModel domModel = (IDOMModel) model;
-                    Element root = domModel.getDocument().getDocumentElement();
-                    if (root != null) {
-                        List<TextEdit> edits = new ArrayList<TextEdit>();
-                        if (isManifest) {
-                            addManifestReplacements(edits, root, document);
-                        } else {
-                            addLayoutReplacements(edits, root, document);
-                        }
-                        if (!edits.isEmpty()) {
-                            MultiTextEdit rootEdit = new MultiTextEdit();
-                            rootEdit.addChildren(edits.toArray(new TextEdit[edits.size()]));
-                            TextFileChange change = new TextFileChange(file.getName(), file);
-                            change.setTextType(EXT_XML);
-                            change.setEdit(rootEdit);
-                            changes.add(change);
-                        }
-                    }
-                } else {
-                    return false;
-                }
-            }
-
-            return true;
-        } catch (IOException e) {
-            AdtPlugin.log(e, null);
-        } catch (CoreException e) {
-            AdtPlugin.log(e, null);
-        } finally {
-            if (model != null) {
-                model.releaseFromRead();
-            }
-        }
-
-        return false;
-    }
-
-    private void addLayoutReplacements(
-            @NonNull List<TextEdit> edits,
-            @NonNull Element element,
-            @NonNull IStructuredDocument document) {
-        String tag = element.getTagName();
-        if (tag.equals(mOldFqcn)) {
-            int start = RefactoringUtil.getTagNameRangeStart(element, document);
-            if (start != -1) {
-                int end = start + mOldFqcn.length();
-                edits.add(new ReplaceEdit(start, end - start, mNewFqcn));
-            }
-        } else if (tag.equals(VIEW_TAG)) {
-            Attr classNode = element.getAttributeNode(ATTR_CLASS);
-            if (classNode != null && classNode.getValue().equals(mOldFqcn)) {
-                int start = RefactoringUtil.getAttributeValueRangeStart(classNode, document);
-                if (start != -1) {
-                    int end = start + mOldFqcn.length();
-                    edits.add(new ReplaceEdit(start, end - start, mNewFqcn));
-                }
-            }
-        } else if (tag.equals(VIEW_FRAGMENT)) {
-            Attr classNode = element.getAttributeNode(ATTR_CLASS);
-            if (classNode == null) {
-                classNode = element.getAttributeNodeNS(ANDROID_URI, ATTR_NAME);
-            }
-            if (classNode != null && classNode.getValue().equals(mOldFqcn)) {
-                int start = RefactoringUtil.getAttributeValueRangeStart(classNode, document);
-                if (start != -1) {
-                    int end = start + mOldFqcn.length();
-                    edits.add(new ReplaceEdit(start, end - start, mNewFqcn));
-                }
-            }
-        } else if (element.hasAttributeNS(TOOLS_URI, ATTR_CONTEXT)) {
-            Attr classNode = element.getAttributeNodeNS(TOOLS_URI, ATTR_CONTEXT);
-            if (classNode != null && classNode.getValue().equals(mOldFqcn)) {
-                int start = RefactoringUtil.getAttributeValueRangeStart(classNode, document);
-                if (start != -1) {
-                    int end = start + mOldFqcn.length();
-                    edits.add(new ReplaceEdit(start, end - start, mNewFqcn));
-                }
-            }
-        }
-
-        NodeList children = element.getChildNodes();
-        for (int i = 0, n = children.getLength(); i < n; i++) {
-            Node child = children.item(i);
-            if (child.getNodeType() == Node.ELEMENT_NODE) {
-                addLayoutReplacements(edits, (Element) child, document);
-            }
-        }
-    }
-
-    private void addManifestReplacements(
-            @NonNull List<TextEdit> edits,
-            @NonNull Element element,
-            @NonNull IStructuredDocument document) {
-        NamedNodeMap attributes = element.getAttributes();
-        for (int i = 0, n = attributes.getLength(); i < n; i++) {
-            Attr attr = (Attr) attributes.item(i);
-            if (!RefactoringUtil.isManifestClassAttribute(attr)) {
-                continue;
-            }
-
-            String value = attr.getValue();
-            if (value.equals(mOldFqcn)) {
-                int start = RefactoringUtil.getAttributeValueRangeStart(attr, document);
-                if (start != -1) {
-                    int end = start + mOldFqcn.length();
-                    edits.add(new ReplaceEdit(start, end - start, mNewFqcn));
-                }
-            } else if (value.startsWith(".")) { //$NON-NLS-1$
-                String fqcn = mAppPackage + value;
-                if (fqcn.equals(mOldFqcn)) {
-                    int start = RefactoringUtil.getAttributeValueRangeStart(attr, document);
-                    if (start != -1) {
-                        int end = start + value.length();
-                        edits.add(new ReplaceEdit(start, end - start, mNewFqcn));
-                    }
-                }
-            }
-        }
-
-        NodeList children = element.getChildNodes();
-        for (int i = 0, n = children.getLength(); i < n; i++) {
-            Node child = children.item(i);
-            if (child.getNodeType() == Node.ELEMENT_NODE) {
-                addManifestReplacements(edits, (Element) child, document);
-            }
-        }
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/refactorings/core/AndroidTypeRenameParticipant.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/refactorings/core/AndroidTypeRenameParticipant.java
deleted file mode 100644
index 7843ab3..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/refactorings/core/AndroidTypeRenameParticipant.java
+++ /dev/null
@@ -1,529 +0,0 @@
-/*
- * Copyright (C) 2010 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.refactorings.core;
-
-import static com.android.SdkConstants.ANDROID_MANIFEST_XML;
-import static com.android.SdkConstants.ANDROID_URI;
-import static com.android.SdkConstants.ATTR_CLASS;
-import static com.android.SdkConstants.ATTR_CONTEXT;
-import static com.android.SdkConstants.ATTR_NAME;
-import static com.android.SdkConstants.CLASS_VIEW;
-import static com.android.SdkConstants.DOT_XML;
-import static com.android.SdkConstants.EXT_XML;
-import static com.android.SdkConstants.R_CLASS;
-import static com.android.SdkConstants.TOOLS_URI;
-import static com.android.SdkConstants.VIEW_FRAGMENT;
-import static com.android.SdkConstants.VIEW_TAG;
-
-import com.android.SdkConstants;
-import com.android.annotations.NonNull;
-import com.android.ide.common.xml.ManifestData;
-import com.android.ide.eclipse.adt.AdtConstants;
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.ide.eclipse.adt.internal.editors.layout.gle2.DomUtilities;
-import com.android.ide.eclipse.adt.internal.editors.manifest.ManifestInfo;
-import com.android.ide.eclipse.adt.internal.project.AndroidManifestHelper;
-import com.android.ide.eclipse.adt.internal.project.BaseProjectHelper;
-import com.android.ide.eclipse.adt.internal.sdk.ProjectState;
-import com.android.ide.eclipse.adt.internal.sdk.Sdk;
-import com.android.resources.ResourceFolderType;
-import com.android.resources.ResourceType;
-import com.android.utils.SdkUtils;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IFolder;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.core.runtime.OperationCanceledException;
-import org.eclipse.jdt.core.IField;
-import org.eclipse.jdt.core.IJavaElement;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.IType;
-import org.eclipse.jdt.core.ITypeHierarchy;
-import org.eclipse.jdt.internal.corext.refactoring.rename.RenameCompilationUnitProcessor;
-import org.eclipse.jdt.internal.corext.refactoring.rename.RenameTypeProcessor;
-import org.eclipse.ltk.core.refactoring.Change;
-import org.eclipse.ltk.core.refactoring.CompositeChange;
-import org.eclipse.ltk.core.refactoring.RefactoringStatus;
-import org.eclipse.ltk.core.refactoring.TextFileChange;
-import org.eclipse.ltk.core.refactoring.participants.CheckConditionsContext;
-import org.eclipse.ltk.core.refactoring.participants.RefactoringProcessor;
-import org.eclipse.ltk.core.refactoring.participants.RenameParticipant;
-import org.eclipse.ltk.core.refactoring.participants.RenameRefactoring;
-import org.eclipse.text.edits.MultiTextEdit;
-import org.eclipse.text.edits.ReplaceEdit;
-import org.eclipse.text.edits.TextEdit;
-import org.eclipse.wst.sse.core.StructuredModelManager;
-import org.eclipse.wst.sse.core.internal.provisional.IModelManager;
-import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
-import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
-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.IOException;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
-
-/**
- * A participant to participate in refactorings that rename a type in an Android project.
- * The class updates android manifest and the layout file
- * The user can suppress refactoring by disabling the "Update references" checkbox.
- * <p>
- * Rename participants are registered via the extension point <code>
- * org.eclipse.ltk.core.refactoring.renameParticipants</code>.
- * Extensions to this extension point must therefore extend
- * <code>org.eclipse.ltk.core.refactoring.participants.RenameParticipant</code>.
- */
-@SuppressWarnings("restriction")
-public class AndroidTypeRenameParticipant extends RenameParticipant {
-    private IProject mProject;
-    private IFile mManifestFile;
-    private String mOldFqcn;
-    private String mNewFqcn;
-    private String mOldSimpleName;
-    private String mNewSimpleName;
-    private String mOldDottedName;
-    private String mNewDottedName;
-    private boolean mIsCustomView;
-
-    /**
-     * Set while we are creating an embedded Java refactoring. This could cause a recursive
-     * invocation of the XML renaming refactoring to react to the field, so this is flag
-     * during the call to the Java processor, and is used to ignore requests for adding in
-     * field reactions during that time.
-     */
-    private static boolean sIgnore;
-
-    @Override
-    public String getName() {
-        return "Android Type Rename";
-    }
-
-    @Override
-    public RefactoringStatus checkConditions(IProgressMonitor pm, CheckConditionsContext context)
-            throws OperationCanceledException {
-        return new RefactoringStatus();
-    }
-
-    @Override
-    protected boolean initialize(Object element) {
-        if (sIgnore) {
-            return false;
-        }
-
-        if (element instanceof IType) {
-            IType type = (IType) element;
-            IJavaProject javaProject = (IJavaProject) type.getAncestor(IJavaElement.JAVA_PROJECT);
-            mProject = javaProject.getProject();
-            IResource manifestResource = mProject.findMember(AdtConstants.WS_SEP
-                    + SdkConstants.FN_ANDROID_MANIFEST_XML);
-
-            if (manifestResource == null || !manifestResource.exists()
-                    || !(manifestResource instanceof IFile)) {
-                RefactoringUtil.logInfo(
-                        String.format("Invalid or missing file %1$s in project %2$s",
-                                SdkConstants.FN_ANDROID_MANIFEST_XML,
-                                mProject.getName()));
-                return false;
-            }
-
-            try {
-                IType classView = javaProject.findType(CLASS_VIEW);
-                if (classView != null) {
-                    ITypeHierarchy hierarchy = type.newSupertypeHierarchy(new NullProgressMonitor());
-                    if (hierarchy.contains(classView)) {
-                        mIsCustomView = true;
-                    }
-                }
-            } catch (CoreException e) {
-                AdtPlugin.log(e, null);
-            }
-
-            mManifestFile = (IFile) manifestResource;
-            ManifestData manifestData;
-            manifestData = AndroidManifestHelper.parseForData(mManifestFile);
-            if (manifestData == null) {
-                return false;
-            }
-            mOldSimpleName = type.getElementName();
-            mOldDottedName = '.' + mOldSimpleName;
-            mOldFqcn = type.getFullyQualifiedName();
-            String packageName = type.getPackageFragment().getElementName();
-            mNewSimpleName = getArguments().getNewName();
-            mNewDottedName = '.' + mNewSimpleName;
-            if (packageName != null) {
-                mNewFqcn = packageName + mNewDottedName;
-            } else {
-                mNewFqcn = mNewSimpleName;
-            }
-            if (mOldFqcn == null || mNewFqcn == null) {
-                return false;
-            }
-            if (!RefactoringUtil.isRefactorAppPackage() && mNewFqcn.indexOf('.') == -1) {
-                mNewFqcn = packageName + mNewDottedName;
-            }
-            return true;
-        }
-        return false;
-    }
-
-    @Override
-    public Change createChange(IProgressMonitor pm) throws CoreException,
-            OperationCanceledException {
-        if (pm.isCanceled()) {
-            return null;
-        }
-
-        // Only propose this refactoring if the "Update References" checkbox is set.
-        if (!getArguments().getUpdateReferences()) {
-            return null;
-        }
-
-        RefactoringProcessor p = getProcessor();
-        if (p instanceof RenameCompilationUnitProcessor) {
-            RenameTypeProcessor rtp =
-                    ((RenameCompilationUnitProcessor) p).getRenameTypeProcessor();
-            if (rtp != null) {
-                String pattern = rtp.getFilePatterns();
-                boolean updQualf = rtp.getUpdateQualifiedNames();
-                if (updQualf && pattern != null && pattern.contains("xml")) { //$NON-NLS-1$
-                    // Do not propose this refactoring if the
-                    // "Update fully qualified names in non-Java files" option is
-                    // checked and the file patterns mention XML. [c.f. SDK bug 21589]
-                    return null;
-                }
-            }
-        }
-
-        CompositeChange result = new CompositeChange(getName());
-
-        // Only show the children in the refactoring preview dialog
-        result.markAsSynthetic();
-
-        addManifestFileChanges(mManifestFile, result);
-        addLayoutFileChanges(mProject, result);
-        addJavaChanges(mProject, result, pm);
-
-        // Also update in dependent projects
-        // TODO: Also do the Java elements, if they are in Jar files, since the library
-        // projects do this (and the JDT refactoring does not include them)
-        ProjectState projectState = Sdk.getProjectState(mProject);
-        if (projectState != null) {
-            Collection<ProjectState> parentProjects = projectState.getFullParentProjects();
-            for (ProjectState parentProject : parentProjects) {
-                IProject project = parentProject.getProject();
-                IResource manifestResource = project.findMember(AdtConstants.WS_SEP
-                        + SdkConstants.FN_ANDROID_MANIFEST_XML);
-                if (manifestResource != null && manifestResource.exists()
-                        && manifestResource instanceof IFile) {
-                    addManifestFileChanges((IFile) manifestResource, result);
-                }
-                addLayoutFileChanges(project, result);
-                addJavaChanges(project, result, pm);
-            }
-        }
-
-        // Look for the field change on the R.java class; it's a derived file
-        // and will generate file modified manually warnings. Disable it.
-        RenameResourceParticipant.disableRClassChanges(result);
-
-        return (result.getChildren().length == 0) ? null : result;
-    }
-
-    private void addJavaChanges(IProject project, CompositeChange result, IProgressMonitor monitor) {
-        if (!mIsCustomView) {
-            return;
-        }
-
-        // Also rename styleables, if any
-        try {
-            // Find R class
-            IJavaProject javaProject = BaseProjectHelper.getJavaProject(project);
-            ManifestInfo info = ManifestInfo.get(project);
-            info.getPackage();
-            String rFqcn = info.getPackage() + '.' + R_CLASS;
-            IType styleable = javaProject.findType(rFqcn + '.' + ResourceType.STYLEABLE.getName());
-            if (styleable != null) {
-                IField[] fields = styleable.getFields();
-                CompositeChange fieldChanges = null;
-                for (IField field : fields) {
-                    String name = field.getElementName();
-                    if (name.equals(mOldSimpleName) || name.startsWith(mOldSimpleName)
-                            && name.length() > mOldSimpleName.length()
-                            && name.charAt(mOldSimpleName.length()) == '_') {
-                        // Rename styleable fields
-                        String newName = name.equals(mOldSimpleName) ? mNewSimpleName :
-                            mNewSimpleName + name.substring(mOldSimpleName.length());
-                        RenameRefactoring refactoring =
-                                RenameResourceParticipant.createFieldRefactoring(field,
-                                        newName, true);
-
-                        try {
-                            sIgnore = true;
-                            RefactoringStatus status = refactoring.checkAllConditions(monitor);
-                            if (status != null && !status.hasError()) {
-                                Change fieldChange = refactoring.createChange(monitor);
-                                if (fieldChange != null) {
-                                    if (fieldChanges == null) {
-                                        fieldChanges = new CompositeChange(
-                                                "Update custom view styleable fields");
-                                        // Disable these changes. They sometimes end up
-                                        // editing the wrong offsets. It looks like Eclipse
-                                        // doesn't ensure that after applying each change it
-                                        // also adjusts the other field offsets. I poked around
-                                        // and couldn't find a way to do this properly, but
-                                        // at least by listing the diffs here it shows what should
-                                        // be done.
-                                        fieldChanges.setEnabled(false);
-                                    }
-                                    // Disable change: see comment above.
-                                    fieldChange.setEnabled(false);
-                                    fieldChanges.add(fieldChange);
-                                }
-                            }
-                        } catch (CoreException e) {
-                            AdtPlugin.log(e, null);
-                        } finally {
-                            sIgnore = false;
-                        }
-                    }
-                }
-                if (fieldChanges != null) {
-                    result.add(fieldChanges);
-                }
-            }
-        } catch (CoreException e) {
-            AdtPlugin.log(e, null);
-        }
-    }
-
-    private void addManifestFileChanges(IFile manifestFile, CompositeChange result) {
-        addXmlFileChanges(manifestFile, result, null);
-    }
-
-    private void addLayoutFileChanges(IProject project, CompositeChange result) {
-        try {
-            // Update references in XML resource files
-            IFolder resFolder = project.getFolder(SdkConstants.FD_RESOURCES);
-
-            IResource[] folders = resFolder.members();
-            for (IResource folder : folders) {
-                String folderName = folder.getName();
-                ResourceFolderType folderType = ResourceFolderType.getFolderType(folderName);
-                if (folderType != ResourceFolderType.LAYOUT &&
-                        folderType != ResourceFolderType.VALUES) {
-                    continue;
-                }
-                if (!(folder instanceof IFolder)) {
-                    continue;
-                }
-                IResource[] files = ((IFolder) folder).members();
-                for (int i = 0; i < files.length; i++) {
-                    IResource member = files[i];
-                    if ((member instanceof IFile) && member.exists()) {
-                        IFile file = (IFile) member;
-                        String fileName = member.getName();
-
-                        if (SdkUtils.endsWith(fileName, DOT_XML)) {
-                            addXmlFileChanges(file, result, folderType);
-                        }
-                    }
-                }
-            }
-        } catch (CoreException e) {
-            RefactoringUtil.log(e);
-        }
-    }
-
-    private boolean addXmlFileChanges(IFile file, CompositeChange changes,
-            ResourceFolderType folderType) {
-        IModelManager modelManager = StructuredModelManager.getModelManager();
-        IStructuredModel model = null;
-        try {
-            model = modelManager.getExistingModelForRead(file);
-            if (model == null) {
-                model = modelManager.getModelForRead(file);
-            }
-            if (model != null) {
-                IStructuredDocument document = model.getStructuredDocument();
-                if (model instanceof IDOMModel) {
-                    IDOMModel domModel = (IDOMModel) model;
-                    Element root = domModel.getDocument().getDocumentElement();
-                    if (root != null) {
-                        List<TextEdit> edits = new ArrayList<TextEdit>();
-                        if (folderType == null) {
-                            assert file.getName().equals(ANDROID_MANIFEST_XML);
-                            addManifestReplacements(edits, root, document);
-                        } else if (folderType == ResourceFolderType.VALUES) {
-                            addValueReplacements(edits, root, document);
-                        } else {
-                            assert folderType == ResourceFolderType.LAYOUT;
-                            addLayoutReplacements(edits, root, document);
-                        }
-                        if (!edits.isEmpty()) {
-                            MultiTextEdit rootEdit = new MultiTextEdit();
-                            rootEdit.addChildren(edits.toArray(new TextEdit[edits.size()]));
-                            TextFileChange change = new TextFileChange(file.getName(), file);
-                            change.setTextType(EXT_XML);
-                            change.setEdit(rootEdit);
-                            changes.add(change);
-                        }
-                    }
-                } else {
-                    return false;
-                }
-            }
-
-            return true;
-        } catch (IOException e) {
-            AdtPlugin.log(e, null);
-        } catch (CoreException e) {
-            AdtPlugin.log(e, null);
-        } finally {
-            if (model != null) {
-                model.releaseFromRead();
-            }
-        }
-
-        return false;
-    }
-
-    private void addLayoutReplacements(
-            @NonNull List<TextEdit> edits,
-            @NonNull Element element,
-            @NonNull IStructuredDocument document) {
-        String tag = element.getTagName();
-        if (tag.equals(mOldFqcn)) {
-            int start = RefactoringUtil.getTagNameRangeStart(element, document);
-            if (start != -1) {
-                int end = start + mOldFqcn.length();
-                edits.add(new ReplaceEdit(start, end - start, mNewFqcn));
-            }
-        } else if (tag.equals(VIEW_TAG)) {
-            // TODO: Handle inner classes ($ vs .) ?
-            Attr classNode = element.getAttributeNode(ATTR_CLASS);
-            if (classNode != null && classNode.getValue().equals(mOldFqcn)) {
-                int start = RefactoringUtil.getAttributeValueRangeStart(classNode, document);
-                if (start != -1) {
-                    int end = start + mOldFqcn.length();
-                    edits.add(new ReplaceEdit(start, end - start, mNewFqcn));
-                }
-            }
-        } else if (tag.equals(VIEW_FRAGMENT)) {
-            Attr classNode = element.getAttributeNode(ATTR_CLASS);
-            if (classNode == null) {
-                classNode = element.getAttributeNodeNS(ANDROID_URI, ATTR_NAME);
-            }
-            if (classNode != null && classNode.getValue().equals(mOldFqcn)) {
-                int start = RefactoringUtil.getAttributeValueRangeStart(classNode, document);
-                if (start != -1) {
-                    int end = start + mOldFqcn.length();
-                    edits.add(new ReplaceEdit(start, end - start, mNewFqcn));
-                }
-            }
-        } else if (element.hasAttributeNS(TOOLS_URI, ATTR_CONTEXT)) {
-            Attr classNode = element.getAttributeNodeNS(TOOLS_URI, ATTR_CONTEXT);
-            if (classNode != null && classNode.getValue().equals(mOldFqcn)) {
-                int start = RefactoringUtil.getAttributeValueRangeStart(classNode, document);
-                if (start != -1) {
-                    int end = start + mOldFqcn.length();
-                    edits.add(new ReplaceEdit(start, end - start, mNewFqcn));
-                }
-            } else if (classNode != null && classNode.getValue().equals(mOldDottedName)) {
-                int start = RefactoringUtil.getAttributeValueRangeStart(classNode, document);
-                if (start != -1) {
-                    int end = start + mOldDottedName.length();
-                    edits.add(new ReplaceEdit(start, end - start, mNewDottedName));
-                }
-            }
-        }
-
-        NodeList children = element.getChildNodes();
-        for (int i = 0, n = children.getLength(); i < n; i++) {
-            Node child = children.item(i);
-            if (child.getNodeType() == Node.ELEMENT_NODE) {
-                addLayoutReplacements(edits, (Element) child, document);
-            }
-        }
-    }
-
-    private void addValueReplacements(
-            @NonNull List<TextEdit> edits,
-            @NonNull Element root,
-            @NonNull IStructuredDocument document) {
-        // Look for styleable renames for custom views
-        String declareStyleable = ResourceType.DECLARE_STYLEABLE.getName();
-        List<Element> topLevel = DomUtilities.getChildren(root);
-        for (Element element : topLevel) {
-            String tag = element.getTagName();
-            if (declareStyleable.equals(tag)) {
-                Attr nameNode = element.getAttributeNode(ATTR_NAME);
-                if (nameNode != null && mOldSimpleName.equals(nameNode.getValue())) {
-                    int start = RefactoringUtil.getAttributeValueRangeStart(nameNode, document);
-                    if (start != -1) {
-                        int end = start + mOldSimpleName.length();
-                        edits.add(new ReplaceEdit(start, end - start, mNewSimpleName));
-                    }
-                }
-            }
-        }
-    }
-
-    private void addManifestReplacements(
-            @NonNull List<TextEdit> edits,
-            @NonNull Element element,
-            @NonNull IStructuredDocument document) {
-        NamedNodeMap attributes = element.getAttributes();
-        for (int i = 0, n = attributes.getLength(); i < n; i++) {
-            Attr attr = (Attr) attributes.item(i);
-            if (!RefactoringUtil.isManifestClassAttribute(attr)) {
-                continue;
-            }
-
-            String value = attr.getValue();
-            if (value.equals(mOldFqcn)) {
-                int start = RefactoringUtil.getAttributeValueRangeStart(attr, document);
-                if (start != -1) {
-                    int end = start + mOldFqcn.length();
-                    edits.add(new ReplaceEdit(start, end - start, mNewFqcn));
-                }
-            } else if (value.equals(mOldDottedName)) {
-                int start = RefactoringUtil.getAttributeValueRangeStart(attr, document);
-                if (start != -1) {
-                    int end = start + mOldDottedName.length();
-                    edits.add(new ReplaceEdit(start, end - start, mNewDottedName));
-                }
-            }
-        }
-
-        NodeList children = element.getChildNodes();
-        for (int i = 0, n = children.getLength(); i < n; i++) {
-            Node child = children.item(i);
-            if (child.getNodeType() == Node.ELEMENT_NODE) {
-                addManifestReplacements(edits, (Element) child, document);
-            }
-        }
-    }
-}
\ No newline at end of file
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/refactorings/core/FixImportsJob.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/refactorings/core/FixImportsJob.java
deleted file mode 100644
index 552e6a8..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/refactorings/core/FixImportsJob.java
+++ /dev/null
@@ -1,148 +0,0 @@
-/*
- * Copyright (C) 2010 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.refactorings.core;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IncrementalProjectBuilder;
-import org.eclipse.core.resources.WorkspaceJob;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.jdt.core.ICompilationUnit;
-import org.eclipse.jdt.core.IJavaElement;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.IPackageFragment;
-import org.eclipse.jdt.core.ISourceRange;
-import org.eclipse.jdt.core.JavaCore;
-import org.eclipse.jdt.core.dom.CompilationUnit;
-import org.eclipse.jdt.core.search.TypeNameMatch;
-import org.eclipse.jdt.internal.corext.codemanipulation.CodeGenerationSettings;
-import org.eclipse.jdt.internal.corext.codemanipulation.OrganizeImportsOperation;
-import org.eclipse.jdt.internal.corext.codemanipulation.OrganizeImportsOperation.IChooseImportQuery;
-import org.eclipse.jdt.internal.ui.actions.WorkbenchRunnableAdapter;
-import org.eclipse.jdt.internal.ui.javaeditor.EditorUtility;
-import org.eclipse.jdt.internal.ui.preferences.JavaPreferencesSettings;
-import org.eclipse.jdt.ui.SharedASTProvider;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.progress.IProgressService;
-
-/**
- * The helper class which fixes the import errors after refactoring
- *
- */
-@SuppressWarnings("restriction")
-public class FixImportsJob extends WorkspaceJob {
-
-    private IFile mAndroidManifest;
-
-    private String mJavaPackage;
-
-    /**
-     * Creates a new <code>FixImportsJob</code>
-     *
-     * @param name the job name
-     * @param androidManifest the android manifest file
-     * @param javaPackage the android java package
-     */
-    public FixImportsJob(String name, IFile androidManifest, String javaPackage) {
-        super(name);
-        this.mAndroidManifest = androidManifest;
-        this.mJavaPackage = javaPackage;
-    }
-
-    @Override
-    public IStatus runInWorkspace(final IProgressMonitor monitor) throws CoreException {
-        if (mJavaPackage == null || mAndroidManifest == null || !mAndroidManifest.exists()) {
-            return Status.CANCEL_STATUS;
-        }
-        IProject project = mAndroidManifest.getProject();
-        IJavaProject javaProject = JavaCore.create(project);
-        if (javaProject == null || !javaProject.isOpen()) {
-            return Status.CANCEL_STATUS;
-        }
-
-        project.build(IncrementalProjectBuilder.INCREMENTAL_BUILD, monitor);
-
-        IMarker[] markers = project.findMarkers(IMarker.PROBLEM, true, IResource.DEPTH_INFINITE);
-        for (int i = 0; i < markers.length; i++) {
-            IMarker marker = markers[i];
-            IResource resource = marker.getResource();
-            try {
-                IJavaElement element = JavaCore.create(resource);
-                if (element != null && (element instanceof ICompilationUnit)) {
-                    final ICompilationUnit cu = (ICompilationUnit) element;
-                    IPackageFragment packageFragment = (IPackageFragment) cu
-                            .getAncestor(IJavaElement.PACKAGE_FRAGMENT);
-                    if (packageFragment != null && packageFragment.exists()) {
-                        String packageName = packageFragment.getElementName();
-                        if (packageName != null && packageName.startsWith(mJavaPackage)) {
-                            CompilationUnit astRoot = SharedASTProvider.getAST(cu,
-                                    SharedASTProvider.WAIT_ACTIVE_ONLY, null);
-                            CodeGenerationSettings settings = JavaPreferencesSettings
-                                    .getCodeGenerationSettings(cu.getJavaProject());
-                            final boolean hasAmbiguity[] = new boolean[] {
-                                false
-                            };
-                            IChooseImportQuery query = new IChooseImportQuery() {
-                                @Override
-                                public TypeNameMatch[] chooseImports(TypeNameMatch[][] openChoices,
-                                        ISourceRange[] ranges) {
-                                    hasAmbiguity[0] = true;
-                                    return new TypeNameMatch[0];
-                                }
-                            };
-                            final OrganizeImportsOperation op = new OrganizeImportsOperation(cu,
-                                    astRoot, settings.importIgnoreLowercase, !cu.isWorkingCopy(),
-                                    true, query);
-                            Display.getDefault().asyncExec(new Runnable() {
-
-                                @Override
-                                public void run() {
-                                    try {
-                                        IProgressService progressService = PlatformUI
-                                                .getWorkbench().getProgressService();
-                                        progressService.run(
-                                                true,
-                                                true,
-                                                new WorkbenchRunnableAdapter(op, op
-                                                        .getScheduleRule()));
-                                        IEditorPart openEditor = EditorUtility.isOpenInEditor(cu);
-                                        if (openEditor != null) {
-                                            openEditor.doSave(monitor);
-                                        }
-                                    } catch (Throwable e) {
-                                        RefactoringUtil.log(e);
-                                    }
-                                }
-                            });
-
-                        }
-                    }
-                }
-            } catch (Throwable e) {
-                RefactoringUtil.log(e);
-            }
-        }
-        return Status.OK_STATUS;
-    }
-}
\ No newline at end of file
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/refactorings/core/RefactoringUtil.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/refactorings/core/RefactoringUtil.java
deleted file mode 100644
index 04ebcfa..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/refactorings/core/RefactoringUtil.java
+++ /dev/null
@@ -1,224 +0,0 @@
-/*
- * Copyright (C) 2010 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.refactorings.core;
-
-import static com.android.SdkConstants.ANDROID_URI;
-import static com.android.SdkConstants.ATTR_NAME;
-import static com.android.xml.AndroidManifest.ATTRIBUTE_BACKUP_AGENT;
-import static com.android.xml.AndroidManifest.ATTRIBUTE_MANAGE_SPACE_ACTIVITY;
-import static com.android.xml.AndroidManifest.ATTRIBUTE_PARENT_ACTIVITY_NAME;
-import static com.android.xml.AndroidManifest.ATTRIBUTE_TARGET_ACTIVITY;
-
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.xml.AndroidManifest;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.jface.text.BadLocationException;
-import org.eclipse.jface.text.IDocument;
-import org.eclipse.wst.sse.core.StructuredModelManager;
-import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
-import org.eclipse.wst.sse.core.internal.provisional.IndexedRegion;
-import org.w3c.dom.Attr;
-import org.w3c.dom.Element;
-
-import java.io.IOException;
-import java.io.UnsupportedEncodingException;
-
-/**
- * The utility class for android refactoring
- *
- */
-@SuppressWarnings("restriction")
-public class RefactoringUtil {
-
-    private static boolean sRefactorAppPackage = false;
-
-    /**
-     * Releases SSE read model; saves SSE model if exists edit model
-     * Called in dispose method of refactoring change classes
-     *
-     * @param model the SSE model
-     * @param document the document
-     */
-    public static void fixModel(IStructuredModel model, IDocument document) {
-        if (model != null) {
-            model.releaseFromRead();
-        }
-        model = null;
-        if (document == null) {
-            return;
-        }
-        try {
-            model = StructuredModelManager.getModelManager().getExistingModelForEdit(document);
-            if (model != null) {
-                model.save();
-            }
-        } catch (UnsupportedEncodingException e1) {
-            // ignore
-        } catch (IOException e1) {
-            // ignore
-        } catch (CoreException e1) {
-            // ignore
-        } finally {
-            if (model != null) {
-                model.releaseFromEdit();
-            }
-        }
-    }
-
-    /**
-     * Logs the info message
-     *
-     * @param message the message
-     */
-    public static void logInfo(String message) {
-        AdtPlugin.log(IStatus.INFO, AdtPlugin.PLUGIN_ID, message);
-    }
-
-    /**
-     * Logs the the exception
-     *
-     * @param e the exception
-     */
-    public static void log(Throwable e) {
-        AdtPlugin.log(e, e.getMessage());
-    }
-
-    /**
-     * @return true if Rename/Move package needs to change the application package
-     * default is false
-     *
-     */
-    public static boolean isRefactorAppPackage() {
-        return sRefactorAppPackage;
-    }
-
-    /**
-     * @param refactorAppPackage true if Rename/Move package needs to change the application package
-     */
-    public static void setRefactorAppPackage(boolean refactorAppPackage) {
-        RefactoringUtil.sRefactorAppPackage = refactorAppPackage;
-    }
-
-    /**
-     * Returns the range of the attribute value in the given document
-     *
-     * @param attr the attribute to look up
-     * @param document the document containing the attribute
-     * @return the range of the value text, not including quotes, in the document
-     */
-    public static int getAttributeValueRangeStart(
-            @NonNull Attr attr,
-            @NonNull IDocument document) {
-        IndexedRegion region = (IndexedRegion) attr;
-        int potentialStart = attr.getName().length() + 2; // + 2: add ="
-        String text;
-        try {
-            text = document.get(region.getStartOffset(),
-                    region.getEndOffset() - region.getStartOffset());
-        } catch (BadLocationException e) {
-            return -1;
-        }
-        String value = attr.getValue();
-        int index = text.indexOf(value, potentialStart);
-        if (index != -1) {
-            return region.getStartOffset() + index;
-        } else {
-            return -1;
-        }
-    }
-
-    /**
-     * Returns the start of the tag name of the given element
-     *
-     * @param element the element to look up
-     * @param document the document containing the attribute
-     * @return the index of the start tag in the document
-     */
-    public static int getTagNameRangeStart(
-            @NonNull Element element,
-            @NonNull IDocument document) {
-        IndexedRegion region = (IndexedRegion) element;
-        int potentialStart = 1; // add '<'
-        String text;
-        try {
-            text = document.get(region.getStartOffset(),
-                    region.getEndOffset() - region.getStartOffset());
-        } catch (BadLocationException e) {
-            return -1;
-        }
-        int index = text.indexOf(element.getTagName(), potentialStart);
-        if (index != -1) {
-            return region.getStartOffset() + index;
-        } else {
-            return -1;
-        }
-    }
-
-    /**
-     * Returns whether the given manifest attribute should be considered to describe
-     * a class name. These will be eligible for refactoring when classes are renamed
-     * or moved.
-     *
-     * @param attribute the manifest attribute
-     * @return true if this attribute can describe a class
-     */
-    public static boolean isManifestClassAttribute(@NonNull Attr attribute) {
-        return isManifestClassAttribute(
-                attribute.getOwnerElement().getTagName(),
-                attribute.getNamespaceURI(),
-                attribute.getLocalName());
-    }
-
-    /**
-     * Returns whether the given manifest attribute should be considered to describe
-     * a class name. These will be eligible for refactoring when classes are renamed
-     * or moved.
-     *
-     * @param tag the tag, if known
-     * @param uri the attribute namespace, if any
-     * @param name the attribute local name, if any
-     * @return true if this attribute can describe a class
-     */
-    public static boolean isManifestClassAttribute(
-            @Nullable String tag,
-            @Nullable String uri,
-            @Nullable String name) {
-        if (name == null) {
-            return false;
-        }
-
-        if ((name.equals(ATTR_NAME)
-                && (AndroidManifest.NODE_ACTIVITY.equals(tag)
-                        || AndroidManifest.NODE_APPLICATION.equals(tag)
-                        || AndroidManifest.NODE_INSTRUMENTATION.equals(tag)
-                        || AndroidManifest.NODE_PROVIDER.equals(tag)
-                        || AndroidManifest.NODE_SERVICE.equals(tag)
-                        || AndroidManifest.NODE_RECEIVER.equals(tag)))
-                || name.equals(ATTRIBUTE_TARGET_ACTIVITY)
-                || name.equals(ATTRIBUTE_MANAGE_SPACE_ACTIVITY)
-                || name.equals(ATTRIBUTE_BACKUP_AGENT)
-                || name.equals(ATTRIBUTE_PARENT_ACTIVITY_NAME)) {
-            return ANDROID_URI.equals(uri);
-        }
-
-        return false;
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/refactorings/core/RenameResourcePage.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/refactorings/core/RenameResourcePage.java
deleted file mode 100644
index 6779fd3..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/refactorings/core/RenameResourcePage.java
+++ /dev/null
@@ -1,177 +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.ide.eclipse.adt.internal.refactorings.core;
-
-import static com.android.SdkConstants.PREFIX_RESOURCE_REF;
-import static com.android.SdkConstants.R_CLASS;
-
-import com.android.ide.eclipse.adt.internal.resources.ResourceNameValidator;
-import com.android.resources.ResourceType;
-
-import org.eclipse.jdt.internal.ui.refactoring.TextInputWizardPage;
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.ltk.core.refactoring.RefactoringStatus;
-import org.eclipse.ltk.core.refactoring.participants.RenameRefactoring;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Text;
-
-import java.util.Set;
-
-@SuppressWarnings("restriction") // JDT refactoring UI
-class RenameResourcePage extends TextInputWizardPage implements SelectionListener {
-    private Label mXmlLabel;
-    private Label mJavaLabel;
-    private Button mUpdateReferences;
-    private boolean mCanClear;
-    private ResourceType mType;
-    private ResourceNameValidator mValidator;
-
-    /**
-     * Create the wizard.
-     * @param type the type of the resource to be renamed
-     * @param initial initial renamed value
-     * @param canClear whether the dialog should allow clearing the field
-     */
-    public RenameResourcePage(ResourceType type, String initial, boolean canClear) {
-        super(type.getName(), true, initial);
-        mType = type;
-        mCanClear = canClear;
-
-        mValidator = ResourceNameValidator.create(false /*allowXmlExtension*/,
-                (Set<String>) null, mType);
-    }
-
-    @SuppressWarnings("unused") // SWT constructors aren't really unused, they have side effects
-    @Override
-    public void createControl(Composite parent) {
-        Composite container = new Composite(parent, SWT.NULL);
-        setControl(container);
-        initializeDialogUnits(container);
-        container.setLayout(new GridLayout(2, false));
-        Label nameLabel = new Label(container, SWT.NONE);
-        nameLabel.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1));
-        nameLabel.setText("New Name:");
-        Text text = super.createTextInputField(container);
-        text.selectAll();
-        text.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
-        Label xmlLabel = new Label(container, SWT.NONE);
-        xmlLabel.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1));
-        xmlLabel.setText("XML:");
-        mXmlLabel = new Label(container, SWT.NONE);
-        mXmlLabel.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1));
-        Label javaLabel = new Label(container, SWT.NONE);
-        javaLabel.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1));
-        javaLabel.setText("Java:");
-        mJavaLabel = new Label(container, SWT.NONE);
-        mJavaLabel.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1));
-        new Label(container, SWT.NONE);
-        new Label(container, SWT.NONE);
-        mUpdateReferences = new Button(container, SWT.CHECK);
-        mUpdateReferences.setSelection(true);
-        mUpdateReferences.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false, 2, 1));
-        mUpdateReferences.setText("Update References");
-        mUpdateReferences.addSelectionListener(this);
-
-        Dialog.applyDialogFont(container);
-    }
-
-    @Override
-    public void setVisible(boolean visible) {
-        if (visible) {
-            RenameResourceProcessor processor = getProcessor();
-            String newName = processor.getNewName();
-            if (newName != null && newName.length() > 0
-                    && !newName.equals(getInitialValue())) {
-                Text textField = getTextField();
-                textField.setText(newName);
-                textField.setSelection(0, newName.length());
-            }
-        }
-
-        super.setVisible(visible);
-    }
-
-    @Override
-    protected RefactoringStatus validateTextField(String newName) {
-        if (newName.isEmpty() && isEmptyInputValid()) {
-            getProcessor().setNewName("");
-            return RefactoringStatus.createWarningStatus(
-                    "The resource definition will be deleted");
-        }
-
-        String error = mValidator.isValid(newName);
-        if (error != null) {
-            return RefactoringStatus.createErrorStatus(error);
-        }
-
-        RenameResourceProcessor processor = getProcessor();
-        processor.setNewName(newName);
-        return processor.checkNewName(newName);
-    }
-
-    private RenameResourceProcessor getProcessor() {
-        RenameRefactoring refactoring = (RenameRefactoring) getRefactoring();
-        return (RenameResourceProcessor) refactoring.getProcessor();
-    }
-
-    @Override
-    protected boolean isEmptyInputValid() {
-        return mCanClear;
-    }
-
-    @Override
-    protected boolean isInitialInputValid() {
-        RenameResourceProcessor processor = getProcessor();
-        return processor.getNewName() != null
-                && !processor.getNewName().equals(processor.getCurrentName());
-    }
-
-    @Override
-    protected void textModified(String text) {
-        super.textModified(text);
-        if (mXmlLabel != null && mJavaLabel != null) {
-            String xml = PREFIX_RESOURCE_REF + mType.getName() + '/' + text;
-            String java = R_CLASS + '.' + mType.getName() + '.' + text;
-            if (text.isEmpty()) {
-                xml = java = "";
-            }
-            mXmlLabel.setText(xml);
-            mJavaLabel.setText(java);
-        }
-    }
-
-    // ---- Implements SelectionListener ----
-
-    @Override
-    public void widgetSelected(SelectionEvent e) {
-        if (e.getSource() == mUpdateReferences) {
-            RenameResourceProcessor processor = getProcessor();
-            boolean update = mUpdateReferences.getSelection();
-            processor.setUpdateReferences(update);
-        }
-    }
-
-    @Override
-    public void widgetDefaultSelected(SelectionEvent e) {
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/refactorings/core/RenameResourceParticipant.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/refactorings/core/RenameResourceParticipant.java
deleted file mode 100644
index 438e822..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/refactorings/core/RenameResourceParticipant.java
+++ /dev/null
@@ -1,752 +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.ide.eclipse.adt.internal.refactorings.core;
-
-import static com.android.SdkConstants.ANDROID_PREFIX;
-import static com.android.SdkConstants.ANDROID_URI;
-import static com.android.SdkConstants.ATTR_ID;
-import static com.android.SdkConstants.ATTR_NAME;
-import static com.android.SdkConstants.ATTR_TYPE;
-import static com.android.SdkConstants.DOT_XML;
-import static com.android.SdkConstants.EXT_XML;
-import static com.android.SdkConstants.FD_RES;
-import static com.android.SdkConstants.FN_RESOURCE_CLASS;
-import static com.android.SdkConstants.NEW_ID_PREFIX;
-import static com.android.SdkConstants.PREFIX_RESOURCE_REF;
-import static com.android.SdkConstants.PREFIX_THEME_REF;
-import static com.android.SdkConstants.R_CLASS;
-import static com.android.SdkConstants.TAG_ITEM;
-import static com.android.SdkConstants.TOOLS_URI;
-
-import com.android.SdkConstants;
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.ide.eclipse.adt.AdtUtils;
-import com.android.ide.eclipse.adt.internal.editors.manifest.ManifestInfo;
-import com.android.ide.eclipse.adt.internal.project.BaseProjectHelper;
-import com.android.ide.eclipse.adt.internal.resources.ResourceNameValidator;
-import com.android.ide.eclipse.adt.internal.sdk.ProjectState;
-import com.android.ide.eclipse.adt.internal.sdk.Sdk;
-import com.android.resources.ResourceFolderType;
-import com.android.resources.ResourceType;
-import com.android.utils.SdkUtils;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IFolder;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.OperationCanceledException;
-import org.eclipse.jdt.core.IField;
-import org.eclipse.jdt.core.IJavaElement;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.IType;
-import org.eclipse.jdt.internal.corext.refactoring.rename.RenameFieldProcessor;
-import org.eclipse.ltk.core.refactoring.Change;
-import org.eclipse.ltk.core.refactoring.CompositeChange;
-import org.eclipse.ltk.core.refactoring.RefactoringStatus;
-import org.eclipse.ltk.core.refactoring.TextChange;
-import org.eclipse.ltk.core.refactoring.TextFileChange;
-import org.eclipse.ltk.core.refactoring.participants.CheckConditionsContext;
-import org.eclipse.ltk.core.refactoring.participants.RenameParticipant;
-import org.eclipse.ltk.core.refactoring.participants.RenameRefactoring;
-import org.eclipse.ltk.core.refactoring.resource.RenameResourceChange;
-import org.eclipse.text.edits.MultiTextEdit;
-import org.eclipse.text.edits.ReplaceEdit;
-import org.eclipse.text.edits.TextEdit;
-import org.eclipse.wst.sse.core.StructuredModelManager;
-import org.eclipse.wst.sse.core.internal.provisional.IModelManager;
-import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
-import org.eclipse.wst.sse.core.internal.provisional.IndexedRegion;
-import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
-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.IOException;
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * A rename participant handling renames of resources (such as R.id.foo and R.layout.bar).
- * This reacts to refactorings of fields in the R inner classes (such as R.id), and updates
- * the XML files as appropriate; renaming .xml files, updating XML attributes, resource
- * references in style declarations, and so on.
- */
-@SuppressWarnings("restriction") // WTP API
-public class RenameResourceParticipant extends RenameParticipant {
-    /** The project we're refactoring in */
-    private @NonNull IProject mProject;
-
-    /** The type of the resource we're refactoring, such as {@link ResourceType#ID} */
-    private @NonNull ResourceType mType;
-    /**
-     * The type of the resource folder we're refactoring in, such as
-     * {@link ResourceFolderType#VALUES}. When refactoring non value files, we need to
-     * rename the files as well.
-     */
-    private @NonNull ResourceFolderType mFolderType;
-
-    /** The previous name of the resource */
-    private @NonNull String mOldName;
-
-    /** The new name of the resource */
-    private @NonNull String mNewName;
-
-    /** Whether references to the resource should be updated */
-    private boolean mUpdateReferences;
-
-    /** A match pattern to look for in XML, such as {@code @attr/foo} */
-    private @NonNull String mXmlMatch1;
-
-    /** A match pattern to look for in XML, such as {@code ?attr/foo} */
-    private @Nullable String mXmlMatch2;
-
-    /** A match pattern to look for in XML, such as {@code ?foo} */
-    private @Nullable String mXmlMatch3;
-
-    /** The value to replace a reference to {@link #mXmlMatch1} with, such as {@code @attr/bar} */
-    private @NonNull String mXmlNewValue1;
-
-    /** The value to replace a reference to {@link #mXmlMatch2} with, such as {@code ?attr/bar} */
-    private @Nullable String mXmlNewValue2;
-
-    /** The value to replace a reference to {@link #mXmlMatch3} with, such as {@code ?bar} */
-    private @Nullable String mXmlNewValue3;
-
-    /**
-     * If non null, this refactoring was initiated as a file rename of an XML file (and if
-     * null, we are just reacting to a Java field rename)
-     */
-    private IFile mRenamedFile;
-
-    /**
-     * If renaming a field, we need to create an embedded field refactoring to update the
-     * Java sources referring to the corresponding R class field. This is stored as an
-     * instance such that we can have it participate in both the condition check methods
-     * as well as the {@link #createChange(IProgressMonitor)} refactoring operation.
-     */
-    private RenameRefactoring mFieldRefactoring;
-
-    /**
-     * Set while we are creating an embedded Java refactoring. This could cause a recursive
-     * invocation of the XML renaming refactoring to react to the field, so this is flag
-     * during the call to the Java processor, and is used to ignore requests for adding in
-     * field reactions during that time.
-     */
-    private static boolean sIgnore;
-
-    /**
-     * Creates a new {@linkplain RenameResourceParticipant}
-     */
-    public RenameResourceParticipant() {
-    }
-
-    @Override
-    public String getName() {
-        return "Android Rename Field Participant";
-    }
-
-    @Override
-    protected boolean initialize(Object element) {
-        if (sIgnore) {
-            return false;
-        }
-
-        if (element instanceof IField) {
-            IField field = (IField) element;
-            IType declaringType = field.getDeclaringType();
-            if (declaringType != null) {
-                if (R_CLASS.equals(declaringType.getParent().getElementName())) {
-                    String typeName = declaringType.getElementName();
-                    mType = ResourceType.getEnum(typeName);
-                    if (mType != null) {
-                        mUpdateReferences = getArguments().getUpdateReferences();
-                        mFolderType = AdtUtils.getFolderTypeFor(mType);
-                        IJavaProject javaProject = (IJavaProject) field.getAncestor(
-                                IJavaElement.JAVA_PROJECT);
-                        mProject = javaProject.getProject();
-                        mOldName = field.getElementName();
-                        mNewName = getArguments().getNewName();
-                        mFieldRefactoring = null;
-                        mRenamedFile = null;
-                        createXmlSearchPatterns();
-                        return true;
-                    }
-                }
-            }
-
-            return false;
-        } else if (element instanceof IFile) {
-            IFile file = (IFile) element;
-            mProject = file.getProject();
-            if (BaseProjectHelper.isAndroidProject(mProject)) {
-                IPath path = file.getFullPath();
-                int segments = path.segmentCount();
-                if (segments == 4 && path.segment(1).equals(FD_RES)) {
-                    String parentName = file.getParent().getName();
-                    mFolderType = ResourceFolderType.getFolderType(parentName);
-                    if (mFolderType != null && mFolderType != ResourceFolderType.VALUES) {
-                        mType = AdtUtils.getResourceTypeFor(mFolderType);
-                        if (mType != null) {
-                            mUpdateReferences = getArguments().getUpdateReferences();
-                            mProject = file.getProject();
-                            mOldName = AdtUtils.stripAllExtensions(file.getName());
-                            mNewName = AdtUtils.stripAllExtensions(getArguments().getNewName());
-                            mRenamedFile = file;
-                            createXmlSearchPatterns();
-
-                            mFieldRefactoring = null;
-                            IField field = getResourceField(mProject, mType, mOldName);
-                            if (field != null) {
-                                mFieldRefactoring = createFieldRefactoring(field);
-                            } else {
-                                // no corresponding field; aapt has not run yet. Perhaps user has
-                                // turned off auto build.
-                                mFieldRefactoring = null;
-                            }
-
-                            return true;
-                        }
-                    }
-                }
-            }
-        } else if (element instanceof String) {
-            String uri = (String) element;
-            if (uri.startsWith(PREFIX_RESOURCE_REF) && !uri.startsWith(ANDROID_PREFIX)) {
-                RenameResourceProcessor processor = (RenameResourceProcessor) getProcessor();
-                mProject = processor.getProject();
-                mType = processor.getType();
-                mFolderType = AdtUtils.getFolderTypeFor(mType);
-                mOldName = processor.getCurrentName();
-                mNewName = processor.getNewName();
-                assert uri.endsWith(mOldName) && uri.contains(mType.getName()) : uri;
-                mUpdateReferences = getArguments().getUpdateReferences();
-                if (mNewName.isEmpty()) {
-                    mUpdateReferences = false;
-                }
-                mRenamedFile = null;
-                createXmlSearchPatterns();
-                mFieldRefactoring = null;
-                if (!mNewName.isEmpty()) {
-                    IField field = getResourceField(mProject, mType, mOldName);
-                    if (field != null) {
-                        mFieldRefactoring = createFieldRefactoring(field);
-                    }
-                }
-
-                return true;
-            }
-        }
-
-        return false;
-    }
-
-    /** Create nested Java refactoring which updates the R field references, if applicable */
-    private RenameRefactoring createFieldRefactoring(IField field) {
-        return createFieldRefactoring(field, mNewName, mUpdateReferences);
-    }
-
-    /**
-     * Create nested Java refactoring which updates the R field references, if
-     * applicable
-     *
-     * @param field the field to be refactored
-     * @param newName the new name
-     * @param updateReferences whether references should be updated
-     * @return a new rename refactoring
-     */
-    public static RenameRefactoring createFieldRefactoring(
-            @NonNull IField field,
-            @NonNull String newName,
-            boolean updateReferences) {
-        RenameFieldProcessor processor = new RenameFieldProcessor(field);
-        processor.setRenameGetter(false);
-        processor.setRenameSetter(false);
-        RenameRefactoring refactoring = new RenameRefactoring(processor);
-        processor.setUpdateReferences(updateReferences);
-        processor.setUpdateTextualMatches(false);
-        processor.setNewElementName(newName);
-        try {
-            if (refactoring.isApplicable()) {
-                return refactoring;
-            }
-        } catch (CoreException e) {
-            AdtPlugin.log(e, null);
-        }
-
-        return null;
-    }
-
-    private void createXmlSearchPatterns() {
-        // Set up search strings for the attribute iterator. This will
-        // identify string matches for mXmlMatch1, 2 and 3, and when matched,
-        // will add a replacement edit for mXmlNewValue1, 2, or 3.
-        mXmlMatch2 = null;
-        mXmlNewValue2 = null;
-        mXmlMatch3 = null;
-        mXmlNewValue3 = null;
-
-        String typeName = mType.getName();
-        if (mUpdateReferences) {
-            mXmlMatch1 = PREFIX_RESOURCE_REF + typeName + '/' + mOldName;
-            mXmlNewValue1 = PREFIX_RESOURCE_REF + typeName + '/' + mNewName;
-            if (mType == ResourceType.ID) {
-                mXmlMatch2 = NEW_ID_PREFIX + mOldName;
-                mXmlNewValue2 = NEW_ID_PREFIX + mNewName;
-            } else if (mType == ResourceType.ATTR) {
-                // When renaming @attr/foo, also edit ?attr/foo
-                mXmlMatch2 = PREFIX_THEME_REF + typeName + '/' + mOldName;
-                mXmlNewValue2 = PREFIX_THEME_REF + typeName + '/' + mNewName;
-                // as well as ?foo
-                mXmlMatch3 = PREFIX_THEME_REF + mOldName;
-                mXmlNewValue3 = PREFIX_THEME_REF + mNewName;
-            }
-        } else if (mType == ResourceType.ID) {
-            mXmlMatch1 = NEW_ID_PREFIX + mOldName;
-            mXmlNewValue1 = NEW_ID_PREFIX + mNewName;
-        }
-    }
-
-    @Override
-    public RefactoringStatus checkConditions(IProgressMonitor pm, CheckConditionsContext context)
-            throws OperationCanceledException {
-        if (mRenamedFile != null && getArguments().getNewName().indexOf('.') == -1
-                && mRenamedFile.getName().indexOf('.') != -1) {
-            return RefactoringStatus.createErrorStatus(
-                    String.format("You must include the file extension (%1$s?)",
-                           mRenamedFile.getName().substring(mRenamedFile.getName().indexOf('.'))));
-        }
-
-        // Ensure that the new name is valid
-        if (mNewName != null && !mNewName.isEmpty()) {
-            ResourceNameValidator validator = ResourceNameValidator.create(false, mProject, mType);
-            String error = validator.isValid(mNewName);
-            if (error != null) {
-                return RefactoringStatus.createErrorStatus(error);
-            }
-        }
-
-        if (mFieldRefactoring != null) {
-            try {
-                sIgnore = true;
-                return mFieldRefactoring.checkAllConditions(pm);
-            } catch (CoreException e) {
-                AdtPlugin.log(e, null);
-            } finally {
-                sIgnore = false;
-            }
-        }
-
-        return new RefactoringStatus();
-    }
-
-    @Override
-    public Change createChange(IProgressMonitor monitor) throws CoreException,
-            OperationCanceledException {
-        if (monitor.isCanceled()) {
-            return null;
-        }
-
-        CompositeChange result = new CompositeChange("Update resource references");
-
-        // Only show the children in the refactoring preview dialog
-        result.markAsSynthetic();
-
-        addResourceFileChanges(result, mProject, monitor);
-
-        // If renaming resources in a library project, also offer to rename references
-        // in including projects
-        if (mUpdateReferences) {
-            ProjectState projectState = Sdk.getProjectState(mProject);
-            if (projectState != null && projectState.isLibrary()) {
-                List<ProjectState> parentProjects = projectState.getParentProjects();
-                for (ProjectState state : parentProjects) {
-                    IProject project = state.getProject();
-                    CompositeChange nested = new CompositeChange(
-                            String.format("Update references in %1$s", project.getName()));
-                    addResourceFileChanges(nested, project, monitor);
-                    if (nested.getChildren().length > 0) {
-                        result.add(nested);
-                    }
-                }
-            }
-        }
-
-        if (mFieldRefactoring != null) {
-            // We have to add in Java field refactoring
-            try {
-                sIgnore = true;
-                addJavaChanges(result, monitor);
-            } finally {
-                sIgnore = false;
-            }
-        } else {
-            // Disable field refactoring added by the default Java field rename handler
-            disableExistingResourceFileChange();
-        }
-
-        return (result.getChildren().length == 0) ? null : result;
-    }
-
-    /**
-     * Adds all changes to resource files (typically XML but also renaming drawable files
-     *
-     * @param project the Android project
-     * @param className the layout classes
-     */
-    private void addResourceFileChanges(
-            CompositeChange change,
-            IProject project,
-            IProgressMonitor monitor)
-            throws OperationCanceledException {
-        if (monitor.isCanceled()) {
-            return;
-        }
-
-        try {
-            // Update resource references in the manifest
-            IFile manifest = project.getFile(SdkConstants.ANDROID_MANIFEST_XML);
-            if (manifest != null) {
-                addResourceXmlChanges(manifest, change, null);
-            }
-
-            // Update references in XML resource files
-            IFolder resFolder = project.getFolder(SdkConstants.FD_RESOURCES);
-
-            IResource[] folders = resFolder.members();
-            for (IResource folder : folders) {
-                if (!(folder instanceof IFolder)) {
-                    continue;
-                }
-                String folderName = folder.getName();
-                ResourceFolderType folderType = ResourceFolderType.getFolderType(folderName);
-                IResource[] files = ((IFolder) folder).members();
-                for (int i = 0; i < files.length; i++) {
-                    IResource member = files[i];
-                    if ((member instanceof IFile) && member.exists()) {
-                        IFile file = (IFile) member;
-                        String fileName = member.getName();
-
-                        if (SdkUtils.endsWith(fileName, DOT_XML)) {
-                            addResourceXmlChanges(file, change, folderType);
-                        }
-
-                        if ((mRenamedFile == null || !mRenamedFile.equals(file))
-                                && fileName.startsWith(mOldName)
-                                && fileName.length() > mOldName.length()
-                                && fileName.charAt(mOldName.length()) == '.'
-                                && mFolderType != ResourceFolderType.VALUES
-                                && mFolderType == folderType) {
-                            // Rename this file
-                            String newFile = mNewName + fileName.substring(mOldName.length());
-                            IPath path = file.getFullPath();
-                            change.add(new RenameResourceChange(path, newFile));
-                        }
-                    }
-                }
-            }
-        } catch (CoreException e) {
-            RefactoringUtil.log(e);
-        }
-    }
-
-    private void addJavaChanges(CompositeChange result, IProgressMonitor monitor)
-            throws CoreException, OperationCanceledException {
-        if (monitor.isCanceled()) {
-            return;
-        }
-
-        RefactoringStatus status = mFieldRefactoring.checkAllConditions(monitor);
-        if (status != null && !status.hasError()) {
-            Change fieldChanges = mFieldRefactoring.createChange(monitor);
-            if (fieldChanges != null) {
-                result.add(fieldChanges);
-
-                // Look for the field change on the R.java class; it's a derived file
-                // and will generate file modified manually warnings. Disable it.
-                disableRClassChanges(fieldChanges);
-            }
-        }
-    }
-
-    private boolean addResourceXmlChanges(
-            IFile file,
-            CompositeChange changes,
-            ResourceFolderType folderType) {
-        IModelManager modelManager = StructuredModelManager.getModelManager();
-        IStructuredModel model = null;
-        try {
-            model = modelManager.getExistingModelForRead(file);
-            if (model == null) {
-                model = modelManager.getModelForRead(file);
-            }
-            if (model != null) {
-                IStructuredDocument document = model.getStructuredDocument();
-                if (model instanceof IDOMModel) {
-                    IDOMModel domModel = (IDOMModel) model;
-                    Element root = domModel.getDocument().getDocumentElement();
-                    if (root != null) {
-                        List<TextEdit> edits = new ArrayList<TextEdit>();
-                        addReplacements(edits, root, document, folderType);
-                        if (!edits.isEmpty()) {
-                            MultiTextEdit rootEdit = new MultiTextEdit();
-                            rootEdit.addChildren(edits.toArray(new TextEdit[edits.size()]));
-                            TextFileChange change = new TextFileChange(file.getName(), file);
-                            change.setTextType(EXT_XML);
-                            change.setEdit(rootEdit);
-                            changes.add(change);
-                        }
-                    }
-                } else {
-                    return false;
-                }
-            }
-
-            return true;
-        } catch (IOException e) {
-            AdtPlugin.log(e, null);
-        } catch (CoreException e) {
-            AdtPlugin.log(e, null);
-        } finally {
-            if (model != null) {
-                model.releaseFromRead();
-            }
-        }
-
-        return false;
-    }
-
-    private void addReplacements(
-            @NonNull List<TextEdit> edits,
-            @NonNull Element element,
-            @NonNull IStructuredDocument document,
-            @Nullable ResourceFolderType folderType) {
-        String tag = element.getTagName();
-        if (folderType == ResourceFolderType.VALUES) {
-            // Look for
-            //   <item name="main_layout" type="layout">...</item>
-            //   <item name="myid" type="id"/>
-            //   <string name="mystring">...</string>
-            // etc
-            if (tag.equals(mType.getName())
-                    || (tag.equals(TAG_ITEM)
-                            && (mType == ResourceType.ID
-                                || mType.getName().equals(element.getAttribute(ATTR_TYPE))))) {
-                Attr nameNode = element.getAttributeNode(ATTR_NAME);
-                if (nameNode != null && nameNode.getValue().equals(mOldName)) {
-                    int start = RefactoringUtil.getAttributeValueRangeStart(nameNode, document);
-                    if (start != -1) {
-                        int end = start + mOldName.length();
-                        edits.add(new ReplaceEdit(start, end - start, mNewName));
-                    }
-                }
-            }
-        }
-
-        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 not updating references, only update XML matches that define the id
-            if (!mUpdateReferences && (!ATTR_ID.equals(attr.getLocalName()) ||
-                    !ANDROID_URI.equals(attr.getNamespaceURI()))) {
-
-                if (TOOLS_URI.equals(attr.getNamespaceURI()) && value.equals(mXmlMatch1)) {
-                    int start = RefactoringUtil.getAttributeValueRangeStart(attr, document);
-                    if (start != -1) {
-                        int end = start + mXmlMatch1.length();
-                        edits.add(new ReplaceEdit(start, end - start, mXmlNewValue1));
-                    }
-                }
-
-                continue;
-            }
-
-            // Replace XML attribute reference, such as
-            //   android:id="@+id/oldName"   =>   android:id="+id/newName"
-
-            String match = null;
-            String matchedValue = null;
-
-            if (value.equals(mXmlMatch1)) {
-                match = mXmlMatch1;
-                matchedValue = mXmlNewValue1;
-            } else if (value.equals(mXmlMatch2)) {
-                match = mXmlMatch2;
-                matchedValue = mXmlNewValue2;
-            } else if (value.equals(mXmlMatch3)) {
-                match = mXmlMatch3;
-                matchedValue = mXmlNewValue3;
-            } else {
-                continue;
-            }
-
-            if (match != null) {
-                if (mNewName.isEmpty() && ATTR_ID.equals(attr.getLocalName()) &&
-                        ANDROID_URI.equals(attr.getNamespaceURI())) {
-                    // Delete attribute
-                    IndexedRegion region = (IndexedRegion) attr;
-                    int start = region.getStartOffset();
-                    int end = region.getEndOffset();
-                    edits.add(new ReplaceEdit(start, end - start, ""));
-                } else {
-                    int start = RefactoringUtil.getAttributeValueRangeStart(attr, document);
-                    if (start != -1) {
-                        int end = start + match.length();
-                        edits.add(new ReplaceEdit(start, end - start, matchedValue));
-                    }
-                }
-            }
-        }
-
-        NodeList children = element.getChildNodes();
-        for (int i = 0, n = children.getLength(); i < n; i++) {
-            Node child = children.item(i);
-            if (child.getNodeType() == Node.ELEMENT_NODE) {
-                addReplacements(edits, (Element) child, document, folderType);
-            } else if (child.getNodeType() == Node.TEXT_NODE && mUpdateReferences) {
-                // Replace XML text, such as @color/custom_theme_color in
-                //    <item name="android:windowBackground">@color/custom_theme_color</item>
-                //
-                String text = child.getNodeValue();
-                int index = getFirstNonBlankIndex(text);
-                if (index != -1) {
-                    String match = null;
-                    String matchedValue = null;
-                    if (mXmlMatch1 != null
-                            && text.startsWith(mXmlMatch1) && text.trim().equals(mXmlMatch1)) {
-                        match = mXmlMatch1;
-                        matchedValue = mXmlNewValue1;
-                    } else if (mXmlMatch2 != null
-                            && text.startsWith(mXmlMatch2) && text.trim().equals(mXmlMatch2)) {
-                        match = mXmlMatch2;
-                        matchedValue = mXmlNewValue2;
-                    } else if (mXmlMatch3 != null
-                            && text.startsWith(mXmlMatch3) && text.trim().equals(mXmlMatch3)) {
-                        match = mXmlMatch3;
-                        matchedValue = mXmlNewValue3;
-                    }
-                    if (match != null) {
-                        IndexedRegion region = (IndexedRegion) child;
-                        int start = region.getStartOffset() + index;
-                        int end = start + match.length();
-                        edits.add(new ReplaceEdit(start, end - start, matchedValue));
-                    }
-                }
-            }
-        }
-    }
-
-    /**
-     * Returns the index of the first non-space character in the string, or -1
-     * if the string is empty or has only whitespace
-     *
-     * @param s the string to check
-     * @return the index of the first non whitespace character
-     */
-    private int getFirstNonBlankIndex(String s) {
-        for (int i = 0, n = s.length(); i < n; i++) {
-            if (!Character.isWhitespace(s.charAt(i))) {
-                return i;
-            }
-        }
-
-        return -1;
-    }
-
-    /**
-     * Initiates a renaming of a resource item
-     *
-     * @param project the project containing the resource references
-     * @param type the type of resource
-     * @param name the name of the resource
-     * @return false if initiating the rename failed
-     */
-    @Nullable
-    private static IField getResourceField(
-            @NonNull IProject project,
-            @NonNull ResourceType type,
-            @NonNull String name) {
-        try {
-            IJavaProject javaProject = BaseProjectHelper.getJavaProject(project);
-            if (javaProject == null) {
-                return null;
-            }
-
-            String pkg = ManifestInfo.get(project).getPackage();
-            // TODO: Rename in all libraries too?
-            IType t = javaProject.findType(pkg + '.' + R_CLASS + '.' + type.getName());
-            if (t == null) {
-                return null;
-            }
-
-            return t.getField(name);
-        } catch (CoreException e) {
-            AdtPlugin.log(e, null);
-        }
-
-        return null;
-    }
-
-    /**
-     * Searches for existing changes in the refactoring which modifies the R
-     * field to rename it. it's derived so performing this change will generate
-     * a "generated code was modified manually" warning
-     */
-    private void disableExistingResourceFileChange() {
-        IFolder genFolder = mProject.getFolder(SdkConstants.FD_GEN_SOURCES);
-        if (genFolder != null && genFolder.exists()) {
-            ManifestInfo manifestInfo = ManifestInfo.get(mProject);
-            String pkg = manifestInfo.getPackage();
-            if (pkg != null) {
-                IFile rFile = genFolder.getFile(pkg.replace('.', '/') + '/' + FN_RESOURCE_CLASS);
-                TextChange change = getTextChange(rFile);
-                if (change != null) {
-                    change.setEnabled(false);
-                }
-            }
-        }
-    }
-
-    /**
-     * Searches for existing changes in the refactoring which modifies the R
-     * field to rename it. it's derived so performing this change will generate
-     * a "generated code was modified manually" warning
-     *
-     * @param change the change to disable R file changes in
-     */
-    public static void disableRClassChanges(Change change) {
-        if (change.getName().equals(FN_RESOURCE_CLASS)) {
-            change.setEnabled(false);
-        }
-        // Look for the field change on the R.java class; it's a derived file
-        // and will generate file modified manually warnings. Disable it.
-        if (change instanceof CompositeChange) {
-            for (Change outer : ((CompositeChange) change).getChildren()) {
-                disableRClassChanges(outer);
-            }
-        }
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/refactorings/core/RenameResourceProcessor.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/refactorings/core/RenameResourceProcessor.java
deleted file mode 100644
index 5ea9941..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/refactorings/core/RenameResourceProcessor.java
+++ /dev/null
@@ -1,211 +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.ide.eclipse.adt.internal.refactorings.core;
-
-import static com.android.SdkConstants.PREFIX_RESOURCE_REF;
-
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-import com.android.ide.eclipse.adt.AdtConstants;
-import com.android.ide.eclipse.adt.internal.resources.ResourceNameValidator;
-import com.android.resources.ResourceType;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.ltk.core.refactoring.Change;
-import org.eclipse.ltk.core.refactoring.RefactoringStatus;
-import org.eclipse.ltk.core.refactoring.participants.CheckConditionsContext;
-import org.eclipse.ltk.core.refactoring.participants.ParticipantManager;
-import org.eclipse.ltk.core.refactoring.participants.RefactoringParticipant;
-import org.eclipse.ltk.core.refactoring.participants.RenameArguments;
-import org.eclipse.ltk.core.refactoring.participants.RenameProcessor;
-import org.eclipse.ltk.core.refactoring.participants.SharableParticipants;
-
-/**
- * A rename processor for Android resources.
- */
-public class RenameResourceProcessor extends RenameProcessor {
-    private IProject mProject;
-    private ResourceType mType;
-    private String mCurrentName;
-    private String mNewName;
-    private boolean mUpdateReferences = true;
-    private ResourceNameValidator mValidator;
-    private RenameArguments mRenameArguments;
-
-    /**
-     * Creates a new rename resource processor.
-     *
-     * @param project the project containing the renamed resource
-     * @param type the type of the resource
-     * @param currentName the current name of the resource
-     * @param newName the new name of the resource, or null if not known
-     */
-    public RenameResourceProcessor(
-            @NonNull IProject project,
-            @NonNull ResourceType type,
-            @NonNull String currentName,
-            @Nullable String newName) {
-        mProject = project;
-        mType = type;
-        mCurrentName = currentName;
-        mNewName = newName != null ? newName : currentName;
-        mUpdateReferences= true;
-        mValidator = ResourceNameValidator.create(false, mProject, mType);
-    }
-
-    /**
-     * Returns the project containing the renamed resource
-     *
-     * @return the project containing the renamed resource
-     */
-    @NonNull
-    public IProject getProject() {
-        return mProject;
-    }
-
-    /**
-     * Returns the new resource name
-     *
-     * @return the new resource name
-     */
-    @NonNull
-    public String getNewName() {
-        return mNewName;
-    }
-
-    /**
-     * Returns the current name of the resource
-     *
-     * @return the current name of the resource
-     */
-    public String getCurrentName() {
-        return mCurrentName;
-    }
-
-    /**
-     * Returns the type of the resource
-     *
-     * @return the type of the resource
-     */
-    @NonNull
-    public ResourceType getType() {
-        return mType;
-    }
-
-    /**
-     * Sets the new name
-     *
-     * @param newName the new name
-     */
-    public void setNewName(@NonNull String newName) {
-        mNewName = newName;
-    }
-
-    /**
-     * Returns {@code true} if the refactoring processor also updates references
-     *
-     * @return {@code true} if the refactoring processor also updates references
-     */
-    public boolean isUpdateReferences() {
-        return mUpdateReferences;
-    }
-
-    /**
-     * Specifies if the refactoring processor also updates references. The
-     * default behavior is to update references.
-     *
-     * @param updateReferences {@code true} if the refactoring processor should
-     *            also updates references
-     */
-    public void setUpdateReferences(boolean updateReferences) {
-        mUpdateReferences = updateReferences;
-    }
-
-    /**
-     * Checks the given new potential name and returns a {@link RefactoringStatus} indicating
-     * whether the potential new name is valid
-     *
-     * @param name the name to check
-     * @return a {@link RefactoringStatus} with the validation result
-     */
-    public RefactoringStatus checkNewName(String name) {
-        String error = mValidator.isValid(name);
-        if (error != null) {
-            return RefactoringStatus.createFatalErrorStatus(error);
-        }
-
-        return new RefactoringStatus();
-    }
-
-    @Override
-    public RefactoringStatus checkInitialConditions(IProgressMonitor pm) throws CoreException {
-        return new RefactoringStatus();
-    }
-
-    @Override
-    public RefactoringStatus checkFinalConditions(IProgressMonitor pm,
-            CheckConditionsContext context) throws CoreException {
-        pm.beginTask("", 1);
-        try {
-            mRenameArguments = new RenameArguments(getNewName(), isUpdateReferences());
-            return new RefactoringStatus();
-        } finally {
-            pm.done();
-        }
-    }
-
-    @Override
-    public Change createChange(IProgressMonitor pm) throws CoreException {
-        pm.beginTask("", 1);
-        try {
-            // Added by {@link RenameResourceParticipant}
-            return null;
-        } finally {
-            pm.done();
-        }
-    }
-
-    @Override
-    public Object[] getElements() {
-        return new Object[0];
-    }
-
-    @Override
-    public String getIdentifier() {
-        return "com.android.ide.renameResourceProcessor"; //$NON-NLS-1$
-    }
-
-    @Override
-    public String getProcessorName() {
-        return "Rename Android Resource";
-    }
-
-    @Override
-    public boolean isApplicable() {
-        return true;
-    }
-
-    @Override
-    public RefactoringParticipant[] loadParticipants(RefactoringStatus status,
-            SharableParticipants shared) throws CoreException {
-        String[] affectedNatures = new String[] { AdtConstants.NATURE_DEFAULT };
-        String url = PREFIX_RESOURCE_REF + mType.getName() + '/' + mCurrentName;
-        return ParticipantManager.loadRenameParticipants(status, this, url, mRenameArguments,
-                null, affectedNatures, shared);
-    }
-}
\ No newline at end of file
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/refactorings/core/RenameResourceWizard.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/refactorings/core/RenameResourceWizard.java
deleted file mode 100644
index 6ffe25d..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/refactorings/core/RenameResourceWizard.java
+++ /dev/null
@@ -1,157 +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.ide.eclipse.adt.internal.refactorings.core;
-
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.resources.ResourceType;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.jdt.internal.ui.IJavaHelpContextIds;
-import org.eclipse.jdt.internal.ui.JavaPluginImages;
-import org.eclipse.jdt.internal.ui.refactoring.reorg.RenameRefactoringWizard;
-import org.eclipse.jdt.ui.refactoring.RefactoringSaveHelper;
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.ltk.core.refactoring.RefactoringStatus;
-import org.eclipse.ltk.core.refactoring.participants.RenameRefactoring;
-import org.eclipse.ltk.ui.refactoring.RefactoringWizardOpenOperation;
-import org.eclipse.swt.widgets.Shell;
-
-/**
- * Rename refactoring wizard for Android resources such as {@code @id/foo}
- */
-@SuppressWarnings("restriction") // JDT refactoring UI
-public class RenameResourceWizard extends RenameRefactoringWizard {
-	private ResourceType mType;
-    private boolean mCanClear;
-
-    /**
-     * Constructs a new {@linkplain RenameResourceWizard}
-     *
-     * @param refactoring the refactoring
-     * @param type the type of resource being renamed
-     * @param canClear whether the user can clear the value
-     */
-    public RenameResourceWizard(
-            @NonNull RenameRefactoring refactoring,
-            @NonNull ResourceType type,
-            boolean canClear) {
-        super(refactoring,
-                "Rename Resource",
-                "Enter the new name for this resource",
-                JavaPluginImages.DESC_WIZBAN_REFACTOR_FIELD,
-                IJavaHelpContextIds.RENAME_FIELD_WIZARD_PAGE);
-        mType = type;
-		mCanClear = canClear;
-	}
-
-	@Override
-	protected void addUserInputPages() {
-	    RenameRefactoring refactoring = (RenameRefactoring) getRefactoring();
-        RenameResourceProcessor processor = (RenameResourceProcessor) refactoring.getProcessor();
-	    String name = processor.getNewName();
-        addPage(new RenameResourcePage(mType, name, mCanClear));
-	}
-
-    /**
-     * Initiates a renaming of a resource item
-     *
-     * @param shell the shell to parent the dialog to
-     * @param project the project containing the resource references
-     * @param type the type of resource
-     * @param currentName the name of the resource
-     * @param newName the new name, or null if not known
-     * @param canClear whether the name is allowed to be cleared
-     * @return false if initiating the rename failed
-     */
-    public static RenameResult renameResource(
-            @NonNull Shell shell,
-            @NonNull IProject project,
-            @NonNull ResourceType type,
-            @NonNull String currentName,
-            @Nullable String newName,
-            boolean canClear) {
-        try {
-            RenameResourceProcessor processor = new RenameResourceProcessor(project, type,
-                    currentName, newName);
-            RenameRefactoring refactoring = new RenameRefactoring(processor);
-            if (!refactoring.isApplicable()) {
-                return RenameResult.unavailable();
-            }
-
-            if (!show(refactoring, processor, shell, type, canClear)) {
-                return RenameResult.canceled();
-            }
-            return RenameResult.name(processor.getNewName());
-        } catch (CoreException e) {
-            AdtPlugin.log(e, null);
-        }
-
-        return RenameResult.unavailable();
-    }
-
-    /**
-     * Show a refactoring dialog for the given resource refactoring operation
-     *
-     * @param refactoring the rename refactoring
-     * @param processor the field processor
-     * @param parent the parent shell
-     * @param type the resource type
-     * @param canClear whether the user is allowed to clear/reset the name to
-     *            nothing
-     * @return true if the refactoring was performed, and false if it was
-     *         canceled
-     * @throws CoreException if an unexpected error occurs
-     */
-    private static boolean show(
-            @NonNull RenameRefactoring refactoring,
-            @NonNull RenameResourceProcessor processor,
-            @NonNull Shell parent,
-            @NonNull ResourceType type,
-            boolean canClear) throws CoreException {
-        RefactoringSaveHelper saveHelper = new RefactoringSaveHelper(
-                RefactoringSaveHelper.SAVE_REFACTORING);
-        if (!saveHelper.saveEditors(parent)) {
-            return false;
-        }
-
-        try {
-            RenameResourceWizard wizard = new RenameResourceWizard(refactoring, type, canClear);
-            RefactoringWizardOpenOperation operation = new RefactoringWizardOpenOperation(wizard);
-            String dialogTitle = wizard.getDefaultPageTitle();
-            int result = operation.run(parent, dialogTitle == null ? "" : dialogTitle);
-            RefactoringStatus status = operation.getInitialConditionCheckingStatus();
-            if (status.hasFatalError()) {
-                return false;
-            }
-            if (result == RefactoringWizardOpenOperation.INITIAL_CONDITION_CHECKING_FAILED
-                    || result == IDialogConstants.CANCEL_ID) {
-                saveHelper.triggerIncrementalBuild();
-                return false;
-            }
-
-            // Save modified resources; need to trigger R file regeneration
-            saveHelper.saveEditors(parent);
-
-            return true;
-        } catch (InterruptedException e) {
-            return false; // Canceled
-        }
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/refactorings/core/RenameResourceXmlTextAction.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/refactorings/core/RenameResourceXmlTextAction.java
deleted file mode 100644
index 8ecb088..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/refactorings/core/RenameResourceXmlTextAction.java
+++ /dev/null
@@ -1,410 +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.ide.eclipse.adt.internal.refactorings.core;
-
-import static com.android.SdkConstants.ANDROID_MANIFEST_XML;
-import static com.android.SdkConstants.ANDROID_PREFIX;
-import static com.android.SdkConstants.ANDROID_THEME_PREFIX;
-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.ide.common.resources.ResourceUrl;
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.ide.eclipse.adt.internal.editors.layout.gle2.DomUtilities;
-import com.android.ide.eclipse.adt.internal.editors.manifest.ManifestInfo;
-import com.android.ide.eclipse.adt.internal.project.BaseProjectHelper;
-import com.android.ide.eclipse.adt.internal.sdk.ProjectState;
-import com.android.ide.eclipse.adt.internal.sdk.Sdk;
-import com.android.resources.ResourceType;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.IType;
-import org.eclipse.jdt.internal.corext.refactoring.rename.RenameTypeProcessor;
-import org.eclipse.jdt.internal.ui.refactoring.reorg.RenameTypeWizard;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.jface.text.BadLocationException;
-import org.eclipse.jface.text.IDocument;
-import org.eclipse.jface.text.ITextSelection;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.ISelectionProvider;
-import org.eclipse.ltk.core.refactoring.participants.RenameRefactoring;
-import org.eclipse.ltk.ui.refactoring.RefactoringWizardOpenOperation;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IFileEditorInput;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.texteditor.IDocumentProvider;
-import org.eclipse.ui.texteditor.ITextEditor;
-import org.eclipse.ui.texteditor.ITextEditorExtension;
-import org.eclipse.ui.texteditor.ITextEditorExtension2;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-
-import java.util.List;
-
-/**
- * Text action for XML files to invoke renaming
- * <p>
- * TODO: Handle other types of renaming: invoking class renaming when editing
- * class names in layout files and manifest files, renaming attribute names when
- * editing a styleable attribute, etc.
- */
-@SuppressWarnings("restriction") // Java rename refactoring
-public final class RenameResourceXmlTextAction extends Action {
-    private final ITextEditor mEditor;
-
-    /**
-     * Creates a new {@linkplain RenameResourceXmlTextAction}
-     *
-     * @param editor the associated editor
-     */
-    public RenameResourceXmlTextAction(@NonNull ITextEditor editor) {
-        super("Rename");
-        mEditor = editor;
-    }
-
-    @Override
-    public void run() {
-        if (!validateEditorInputState()) {
-            return;
-        }
-        IFile file = getFile();
-        if (file == null) {
-            return;
-        }
-        IProject project = file.getProject();
-        if (project == null) {
-            return;
-        }
-        IDocument document = getDocument();
-        if (document == null) {
-            return;
-        }
-        ITextSelection selection = getSelection();
-        if (selection == null) {
-            return;
-        }
-
-        ResourceUrl resource = findResource(document, selection.getOffset());
-
-        if (resource == null) {
-            resource = findItemDefinition(document, selection.getOffset());
-        }
-
-        if (resource != null) {
-            ResourceType type = resource.type;
-            String name = resource.name;
-            Shell shell = mEditor.getSite().getShell();
-            boolean canClear = false;
-
-            RenameResourceWizard.renameResource(shell, project, type, name, null, canClear);
-            return;
-        }
-
-        String className = findClassName(document, file, selection.getOffset());
-        if (className != null) {
-            assert className.equals(className.trim());
-            IType type = findType(className, project);
-            if (type != null) {
-                RenameTypeProcessor processor = new RenameTypeProcessor(type);
-                //processor.setNewElementName(className);
-                processor.setUpdateQualifiedNames(true);
-                processor.setUpdateSimilarDeclarations(false);
-                //processor.setMatchStrategy(?);
-                //processor.setFilePatterns(patterns);
-                processor.setUpdateReferences(true);
-
-                RenameRefactoring refactoring = new RenameRefactoring(processor);
-                RenameTypeWizard wizard = new RenameTypeWizard(refactoring);
-                RefactoringWizardOpenOperation op = new RefactoringWizardOpenOperation(wizard);
-                try {
-                    IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
-                    op.run(window.getShell(), wizard.getDefaultPageTitle());
-                } catch (InterruptedException e) {
-                }
-            }
-
-            return;
-        }
-
-        // Fallback: tell user the cursor isn't in the right place
-        MessageDialog.openInformation(mEditor.getSite().getShell(),
-                "Rename",
-                "Operation unavailable on the current selection.\n"
-                        + "Select an Android resource name or class.");
-    }
-
-    private boolean validateEditorInputState() {
-        if (mEditor instanceof ITextEditorExtension2)
-            return ((ITextEditorExtension2) mEditor).validateEditorInputState();
-        else if (mEditor instanceof ITextEditorExtension)
-            return !((ITextEditorExtension) mEditor).isEditorInputReadOnly();
-        else if (mEditor != null)
-            return mEditor.isEditable();
-        else
-            return false;
-    }
-
-    /**
-     * Searches for a resource URL around the caret, such as {@code @string/foo}
-     *
-     * @param document the document to search in
-     * @param offset the offset to search at
-     * @return a resource pair, or null if not found
-     */
-    @Nullable
-    public static ResourceUrl findResource(@NonNull IDocument document, int offset) {
-        try {
-            int max = document.getLength();
-            if (offset >= max) {
-                offset = max - 1;
-            } else if (offset < 0) {
-                offset = 0;
-            } else if (offset > 0) {
-                // If the caret is right after a resource name (meaning getChar(offset) points
-                // to the following character), back up
-                char c = document.getChar(offset);
-                if (!isValidResourceNameChar(c)) {
-                    offset--;
-                }
-            }
-
-            int start = offset;
-            boolean valid = true;
-            for (; start >= 0; start--) {
-                char c = document.getChar(start);
-                if (c == '@' || c == '?') {
-                    break;
-                } else if (!isValidResourceNameChar(c)) {
-                    valid = false;
-                    break;
-                }
-            }
-            if (valid) {
-                // Search forwards for the end
-                int end = start + 1;
-                for (; end < max; end++) {
-                    char c = document.getChar(end);
-                    if (!isValidResourceNameChar(c)) {
-                        break;
-                    }
-                }
-                if (end > start + 1) {
-                    String url = document.get(start, end - start);
-
-                    // Don't allow renaming framework resources -- @android:string/ok etc
-                    if (url.startsWith(ANDROID_PREFIX) || url.startsWith(ANDROID_THEME_PREFIX)) {
-                        return null;
-                    }
-
-                    return ResourceUrl.parse(url);
-                }
-            }
-        } catch (BadLocationException e) {
-            AdtPlugin.log(e, null);
-        }
-
-        return null;
-    }
-
-    private static boolean isValidResourceNameChar(char c) {
-        return c == '@' || c == '?' || c == '/' || c == '+' || Character.isJavaIdentifierPart(c);
-    }
-
-    /**
-     * Searches for an item definition around the caret, such as
-     * {@code   <string name="foo">My String</string>}
-     */
-    private ResourceUrl findItemDefinition(IDocument document, int offset) {
-        Node node = DomUtilities.getNode(document, offset);
-        if (node == null) {
-            return null;
-        }
-        if (node.getNodeType() == Node.TEXT_NODE) {
-            node = node.getParentNode();
-        }
-        if (node == null || node.getNodeType() != Node.ELEMENT_NODE) {
-            return null;
-        }
-
-        Element element = (Element) node;
-        String name = element.getAttribute(ATTR_NAME);
-        if (name == null || name.isEmpty()) {
-            return null;
-        }
-        String typeString = element.getTagName();
-        if (TAG_ITEM.equals(typeString)) {
-            typeString = element.getAttribute(ATTR_TYPE);
-            if (typeString == null || typeString.isEmpty()) {
-                return null;
-            }
-        }
-        ResourceType type = ResourceType.getEnum(typeString);
-        if (type != null) {
-            return ResourceUrl.create(type, name, false, false);
-        }
-
-        return null;
-    }
-
-    /**
-     * Searches for a fully qualified class name around the caret, such as {@code foo.bar.MyClass}
-     *
-     * @param document the document to search in
-     * @param file the file, if known
-     * @param offset the offset to search at
-     * @return a resource pair, or null if not found
-     */
-    @Nullable
-    public static String findClassName(
-            @NonNull IDocument document,
-            @Nullable IFile file,
-            int offset) {
-        try {
-            int max = document.getLength();
-            if (offset >= max) {
-                offset = max - 1;
-            } else if (offset < 0) {
-                offset = 0;
-            } else if (offset > 0) {
-                // If the caret is right after a resource name (meaning getChar(offset) points
-                // to the following character), back up
-                char c = document.getChar(offset);
-                if (Character.isJavaIdentifierPart(c)) {
-                    offset--;
-                }
-            }
-
-            int start = offset;
-            for (; start >= 0; start--) {
-                char c = document.getChar(start);
-                if (c == '"' || c == '<' || c == '/') {
-                    start++;
-                    break;
-                } else if (c != '.' && !Character.isJavaIdentifierPart(c)) {
-                    return null;
-                }
-            }
-            // Search forwards for the end
-            int end = start + 1;
-            for (; end < max; end++) {
-                char c = document.getChar(end);
-                if (c != '.' && !Character.isJavaIdentifierPart(c)) {
-                    if (c != '"' && c != '>' && !Character.isWhitespace(c)) {
-                        return null;
-                    }
-                    break;
-                }
-            }
-            if (end > start + 1) {
-                String fqcn = document.get(start, end - start);
-                int dot = fqcn.indexOf('.');
-                if (dot == -1) { // Only support fully qualified names
-                    return null;
-                }
-                if (dot == 0) { // Special case for manifests: prepend package
-                    if (file != null && file.getName().equals(ANDROID_MANIFEST_XML)) {
-                        ManifestInfo info = ManifestInfo.get(file.getProject());
-                        return info.getPackage() + fqcn;
-                    }
-                    return null;
-                }
-
-                return fqcn;
-            }
-        } catch (BadLocationException e) {
-            AdtPlugin.log(e, null);
-        }
-
-        return null;
-    }
-
-    @Nullable
-    private IType findType(@NonNull String className, @NonNull IProject project) {
-        IType type = null;
-        try {
-            IJavaProject javaProject = BaseProjectHelper.getJavaProject(project);
-            type = javaProject.findType(className);
-            if (type == null || !type.exists()) {
-                return null;
-            }
-            if (!type.isBinary()) {
-                return type;
-            }
-            // See if this class is coming through a library project jar file and
-            // if so locate the real class
-            ProjectState projectState = Sdk.getProjectState(project);
-            if (projectState != null) {
-                List<IProject> libraries = projectState.getFullLibraryProjects();
-                for (IProject library : libraries) {
-                    javaProject = BaseProjectHelper.getJavaProject(library);
-                    type = javaProject.findType(className);
-                    if (type != null && type.exists() && !type.isBinary()) {
-                        return type;
-                    }
-                }
-            }
-        } catch (CoreException e) {
-            AdtPlugin.log(e, null);
-        }
-
-        return null;
-    }
-
-    private ITextSelection getSelection() {
-        ISelectionProvider selectionProvider = mEditor.getSelectionProvider();
-        if (selectionProvider == null) {
-            return null;
-        }
-        ISelection selection = selectionProvider.getSelection();
-        if (!(selection instanceof ITextSelection)) {
-            return null;
-        }
-        return (ITextSelection) selection;
-    }
-
-    private IDocument getDocument() {
-        IDocumentProvider documentProvider = mEditor.getDocumentProvider();
-        if (documentProvider == null) {
-            return null;
-        }
-        IDocument document = documentProvider.getDocument(mEditor.getEditorInput());
-        if (document == null) {
-            return null;
-        }
-        return document;
-    }
-
-    @Nullable
-    private IFile getFile() {
-        IEditorInput input = mEditor.getEditorInput();
-        if (input instanceof IFileEditorInput) {
-            IFileEditorInput fileInput = (IFileEditorInput) input;
-            return fileInput.getFile();
-        }
-
-        return null;
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/refactorings/core/RenameResult.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/refactorings/core/RenameResult.java
deleted file mode 100644
index ade346f..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/refactorings/core/RenameResult.java
+++ /dev/null
@@ -1,163 +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.ide.eclipse.adt.internal.refactorings.core;
-
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-
-/**
- * A result from a renaming operation
- */
-public class RenameResult {
-    private boolean mCanceled;
-    private boolean mUnavailable;
-    private @Nullable String mName;
-    private boolean mClear;
-
-    /**
-     * Constructs a new rename result
-     */
-    private RenameResult() {
-    }
-
-    /**
-     * Creates a new blank {@linkplain RenameResult}
-     * @return a new result
-     */
-    @NonNull
-    public static RenameResult create() {
-        return new RenameResult();
-    }
-
-    /**
-     * Creates a new {@linkplain RenameResult} for a user canceled renaming operation
-     * @return a canceled operation
-     */
-    @NonNull
-    public static RenameResult canceled() {
-        return new RenameResult().setCanceled(true);
-    }
-
-    /**
-     * Creates a {@linkplain RenameResult} for a renaming operation that was
-     * not available (for example because the field attempted to be renamed
-     * does not yet exist (or does not exist any more)
-     *
-     * @return a new result
-     */
-    @NonNull
-    public static RenameResult unavailable() {
-        return new RenameResult().setUnavailable(true);
-    }
-
-    /**
-     * Creates a new {@linkplain RenameResult} for a successful renaming
-     * operation to the given name
-     *
-     * @param name the new name
-     * @return a new result
-     */
-    @NonNull
-    public static RenameResult name(@Nullable String name) {
-        return new RenameResult().setName(name);
-    }
-
-    /**
-     * Marks this result as canceled
-     *
-     * @param canceled whether the result was canceled
-     * @return this, for constructor chaining
-     */
-    @NonNull
-    public RenameResult setCanceled(boolean canceled) {
-        mCanceled = canceled;
-        return this;
-    }
-
-    /**
-     * Marks this result as unavailable
-     *
-     * @param unavailable whether this result was unavailable
-     * @return this, for constructor chaining
-     */
-    @NonNull
-    public RenameResult setUnavailable(boolean unavailable) {
-        mUnavailable = unavailable;
-        return this;
-    }
-
-    /**
-     * Sets the new name of the renaming operation
-     *
-     * @param name the new name
-     * @return this, for constructor chaining
-     */
-    @NonNull
-    public RenameResult setName(@Nullable String name) {
-        mName = name;
-        return this;
-    }
-
-    /**
-     * Marks this result as clearing the name (reverting it back to the default)
-     *
-     * @param clear whether the name was cleared
-     * @return this, for constructor chaining
-     */
-    @NonNull
-    public RenameResult setCleared(boolean clear) {
-        mClear = clear;
-        return this;
-    }
-
-    /**
-     * Returns whether this result represents a canceled renaming operation
-     *
-     * @return true if the operation was canceled
-     */
-    public boolean isCanceled() {
-        return mCanceled;
-    }
-
-    /**
-     * Returns whether this result represents an unavailable renaming operation
-     *
-     * @return true if the operation was not available
-     */
-    public boolean isUnavailable() {
-        return mUnavailable;
-    }
-
-    /**
-     * Returns whether this result represents a renaming back to the default (possibly
-     * clear) name. In this case, {@link #getName()} will return {@code null}.
-     *
-     * @return true if the name should be reset
-     */
-    public boolean isCleared() {
-        return mClear;
-    }
-
-    /**
-     * Returns the new name.
-     *
-     * @return the new name
-     */
-    @Nullable
-    public String getName() {
-        return mName;
-    }
-}
\ No newline at end of file
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/refactorings/extractstring/EnabledTextEditGroup.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/refactorings/extractstring/EnabledTextEditGroup.java
deleted file mode 100644
index 15f6c47..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/refactorings/extractstring/EnabledTextEditGroup.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * Copyright (C) 2010 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.refactorings.extractstring;
-
-import org.eclipse.text.edits.TextEditGroup;
-
-/**
- * A {@link TextEditGroup} that we want to enable or disable by default.
- * This is used to propose a change that may not compile, so we'll create
- * a change that is disabled.
- * <p/>
- * Disabling the change is done by the refactoring class when processing
- * the text edit groups generated by the Java AST visitor.
- */
-class EnabledTextEditGroup extends TextEditGroup {
-    private final boolean mEnabled;
-
-    public EnabledTextEditGroup(String name, boolean enabled) {
-        super(name);
-        mEnabled = enabled;
-    }
-
-    public boolean isEnabled() {
-        return mEnabled;
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/refactorings/extractstring/ExtractStringAction.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/refactorings/extractstring/ExtractStringAction.java
deleted file mode 100644
index 14556fd..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/refactorings/extractstring/ExtractStringAction.java
+++ /dev/null
@@ -1,184 +0,0 @@
-/*
- * Copyright (C) 2009 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.refactorings.extractstring;
-
-import com.android.ide.eclipse.adt.AdtConstants;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.jdt.core.ICompilationUnit;
-import org.eclipse.jdt.core.JavaCore;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.text.ITextSelection;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.ltk.ui.refactoring.RefactoringWizard;
-import org.eclipse.ltk.ui.refactoring.RefactoringWizardOpenOperation;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.IWorkbenchWindowActionDelegate;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.part.FileEditorInput;
-
-/*
- * Quick Reference Link:
- * http://www.eclipse.org/articles/article.php?file=Article-Unleashing-the-Power-of-Refactoring/index.html
- * and
- * http://www.ibm.com/developerworks/opensource/library/os-ecjdt/
- */
-
-/**
- * Action executed when the "Extract String" menu item is invoked.
- * <p/>
- * The intent of the action is to start a refactoring that extracts a source string and
- * replaces it by an Android string resource ID.
- * <p/>
- * Workflow:
- * <ul>
- * <li> The action is currently located in the Refactoring menu in the main menu.
- * <li> TODO: extend the popup refactoring menu in a Java or Android XML file.
- * <li> The action is only enabled if the selection is 1 character or more. That is at least part
- *     of the string must be selected, it's not enough to just move the insertion point. This is
- *     a limitation due to {@link #selectionChanged(IAction, ISelection)} not being called when
- *     the insertion point is merely moved. TODO: address this limitation.
- * <ul> The action gets the current {@link ISelection}. It also knows the current
- *     {@link IWorkbenchWindow}. However for the refactoring we are also interested in having the
- *     actual resource file. By looking at the Active Window > Active Page > Active Editor we
- *     can get the {@link IEditorInput} and find the {@link ICompilationUnit} (aka Java file)
- *     that is being edited.
- * <ul> TODO: change this to find the {@link IFile} being manipulated. The {@link ICompilationUnit}
- *     can be inferred using {@link JavaCore#createCompilationUnitFrom(IFile)}. This will allow
- *     us to be able to work with a selection from an Android XML file later.
- * <li> The action creates a new {@link ExtractStringRefactoring} and make it run on in a new
- *     {@link ExtractStringWizard}.
- * <ul>
- */
-public class ExtractStringAction implements IWorkbenchWindowActionDelegate {
-
-    /** Keep track of the current workbench window. */
-    private IWorkbenchWindow mWindow;
-    private ITextSelection mSelection;
-    private IEditorPart mEditor;
-    private IFile mFile;
-
-    /**
-     * Keep track of the current workbench window.
-     */
-    @Override
-    public void init(IWorkbenchWindow window) {
-        mWindow = window;
-    }
-
-    @Override
-    public void dispose() {
-        // Nothing to do
-    }
-
-    /**
-     * Examine the selection to determine if the action should be enabled or not.
-     * <p/>
-     * Keep a link to the relevant selection structure (i.e. a part of the Java AST).
-     */
-    @Override
-    public void selectionChanged(IAction action, ISelection selection) {
-
-        // Note, two kinds of selections are returned here:
-        // ITextSelection on a Java source window
-        // IStructuredSelection in the outline or navigator
-        // This simply deals with the refactoring based on a non-empty selection.
-        // At that point, just enable the action and later decide if it's valid when it actually
-        // runs since we don't have access to the AST yet.
-
-        mSelection = null;
-        mFile = null;
-
-        if (selection instanceof ITextSelection) {
-            mSelection = (ITextSelection) selection;
-            if (mSelection.getLength() > 0) {
-                mEditor = getActiveEditor();
-                mFile = getSelectedFile(mEditor);
-            }
-        }
-
-        action.setEnabled(mSelection != null && mFile != null);
-    }
-
-    /**
-     * Create a new instance of our refactoring and a wizard to configure it.
-     */
-    @Override
-    public void run(IAction action) {
-        if (mSelection != null && mFile != null) {
-            ExtractStringRefactoring ref = new ExtractStringRefactoring(mFile, mEditor, mSelection);
-            RefactoringWizard wizard = new ExtractStringWizard(ref, mFile.getProject());
-            RefactoringWizardOpenOperation op = new RefactoringWizardOpenOperation(wizard);
-            try {
-                op.run(mWindow.getShell(), wizard.getDefaultPageTitle());
-            } catch (InterruptedException e) {
-                // Interrupted. Pass.
-            }
-        }
-    }
-
-    /**
-     * Returns the active editor (hopefully matching our selection) or null.
-     */
-    private IEditorPart getActiveEditor() {
-        IWorkbenchWindow wwin = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
-        if (wwin != null) {
-            IWorkbenchPage page = wwin.getActivePage();
-            if (page != null) {
-                return page.getActiveEditor();
-            }
-        }
-
-        return null;
-    }
-
-    /**
-     * Returns the active {@link IFile} (hopefully matching our selection) or null.
-     * The file is only returned if it's a file from a project with an Android nature.
-     * <p/>
-     * At that point we do not try to analyze if the selection nor the file is suitable
-     * for the refactoring. This check is performed when the refactoring is invoked since
-     * it can then produce meaningful error messages as needed.
-     */
-    private IFile getSelectedFile(IEditorPart editor) {
-        if (editor != null) {
-            IEditorInput input = editor.getEditorInput();
-
-            if (input instanceof FileEditorInput) {
-                FileEditorInput fi = (FileEditorInput) input;
-                IFile file = fi.getFile();
-                if (file.exists()) {
-                    IProject proj = file.getProject();
-                    try {
-                        if (proj != null && proj.hasNature(AdtConstants.NATURE_DEFAULT)) {
-                            return file;
-                        }
-                    } catch (CoreException e) {
-                        // ignore
-                    }
-                }
-            }
-        }
-
-        return null;
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/refactorings/extractstring/ExtractStringContribution.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/refactorings/extractstring/ExtractStringContribution.java
deleted file mode 100644
index 61bd06e..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/refactorings/extractstring/ExtractStringContribution.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * Copyright (C) 2009 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.refactorings.extractstring;
-
-import org.eclipse.ltk.core.refactoring.RefactoringContribution;
-import org.eclipse.ltk.core.refactoring.RefactoringDescriptor;
-
-import java.util.Map;
-
-/**
- * @see ExtractStringDescriptor
- */
-public class ExtractStringContribution extends RefactoringContribution {
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ltk.core.refactoring.RefactoringContribution#createDescriptor(java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.util.Map, int)
-     */
-    @SuppressWarnings({"unchecked", "rawtypes"})
-    @Override
-    public RefactoringDescriptor createDescriptor(
-            String id,
-            String project,
-            String description,
-            String comment,
-            Map arguments,
-            int flags)
-                throws IllegalArgumentException {
-        return new ExtractStringDescriptor(project, description, comment, arguments);
-    }
-
-    @SuppressWarnings("rawtypes")
-    @Override
-    public Map retrieveArgumentMap(RefactoringDescriptor descriptor) {
-        if (descriptor instanceof ExtractStringDescriptor) {
-            return ((ExtractStringDescriptor) descriptor).getArguments();
-        }
-        return super.retrieveArgumentMap(descriptor);
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/refactorings/extractstring/ExtractStringDescriptor.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/refactorings/extractstring/ExtractStringDescriptor.java
deleted file mode 100644
index 190736a..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/refactorings/extractstring/ExtractStringDescriptor.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * Copyright (C) 2009 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.refactorings.extractstring;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.ltk.core.refactoring.Refactoring;
-import org.eclipse.ltk.core.refactoring.RefactoringDescriptor;
-import org.eclipse.ltk.core.refactoring.RefactoringStatus;
-
-import java.util.Map;
-
-/**
- * A descriptor that allows an {@link ExtractStringRefactoring} to be created from
- * a previous instance of itself.
- */
-public class ExtractStringDescriptor extends RefactoringDescriptor {
-
-    public static final String ID =
-        "com.android.ide.eclipse.adt.refactoring.extract.string";  //$NON-NLS-1$
-    
-    private final Map<String, String> mArguments;
-
-    public ExtractStringDescriptor(String project, String description, String comment,
-            Map<String, String> arguments) {
-        super(ID, project, description, comment,
-                RefactoringDescriptor.STRUCTURAL_CHANGE | RefactoringDescriptor.MULTI_CHANGE //flags
-        );
-        mArguments = arguments;
-    }
-    
-    public Map<String, String> getArguments() {
-        return mArguments;
-    }
-
-    /**
-     * Creates a new refactoring instance for this refactoring descriptor based on
-     * an argument map. The argument map is created by the refactoring itself in
-     * {@link ExtractStringRefactoring#createChange(org.eclipse.core.runtime.IProgressMonitor)}
-     * <p/>
-     * This is apparently used to replay a refactoring.
-     * 
-     * {@inheritDoc}
-     * 
-     * @throws CoreException
-     */
-    @Override
-    public Refactoring createRefactoring(RefactoringStatus status) throws CoreException {
-        try {
-            ExtractStringRefactoring ref = new ExtractStringRefactoring(mArguments);
-            return ref;
-        } catch (NullPointerException e) {
-            status.addFatalError("Failed to recreate ExtractStringRefactoring from descriptor");
-            return null;
-        }
-    }
-
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/refactorings/extractstring/ExtractStringInputPage.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/refactorings/extractstring/ExtractStringInputPage.java
deleted file mode 100644
index 5ac5f5c..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/refactorings/extractstring/ExtractStringInputPage.java
+++ /dev/null
@@ -1,606 +0,0 @@
-/*
- * Copyright (C) 2009 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.refactorings.extractstring;
-
-
-import com.android.SdkConstants;
-import com.android.ide.common.resources.configuration.FolderConfiguration;
-import com.android.ide.eclipse.adt.AdtConstants;
-import com.android.ide.eclipse.adt.internal.ui.ConfigurationSelector;
-import com.android.ide.eclipse.adt.internal.ui.ConfigurationSelector.SelectorMode;
-import com.android.resources.ResourceFolderType;
-
-import org.eclipse.core.resources.IFolder;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.jface.wizard.WizardPage;
-import org.eclipse.ltk.ui.refactoring.UserInputWizardPage;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Combo;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Group;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Text;
-
-import java.util.HashMap;
-import java.util.Locale;
-import java.util.Map;
-import java.util.TreeSet;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-/**
- * @see ExtractStringRefactoring
- */
-class ExtractStringInputPage extends UserInputWizardPage {
-
-    /** Last res file path used, shared across the session instances but specific to the
-     *  current project. The default for unknown projects is {@link #DEFAULT_RES_FILE_PATH}. */
-    private static HashMap<String, String> sLastResFilePath = new HashMap<String, String>();
-
-    /** The project where the user selection happened. */
-    private final IProject mProject;
-
-    /** Text field where the user enters the new ID to be generated or replaced with. */
-    private Combo mStringIdCombo;
-    /** Text field where the user enters the new string value. */
-    private Text mStringValueField;
-    /** The configuration selector, to select the resource path of the XML file. */
-    private ConfigurationSelector mConfigSelector;
-    /** The combo to display the existing XML files or enter a new one. */
-    private Combo mResFileCombo;
-    /** Checkbox asking whether to replace in all Java files. */
-    private Button mReplaceAllJava;
-    /** Checkbox asking whether to replace in all XML files with same name but other res config */
-    private Button mReplaceAllXml;
-
-    /** Regex pattern to read a valid res XML file path. It checks that the are 2 folders and
-     *  a leaf file name ending with .xml */
-    private static final Pattern RES_XML_FILE_REGEX = Pattern.compile(
-                                     "/res/[a-z][a-zA-Z0-9_-]+/[^.]+\\.xml");  //$NON-NLS-1$
-    /** Absolute destination folder root, e.g. "/res/" */
-    private static final String RES_FOLDER_ABS =
-        AdtConstants.WS_RESOURCES + AdtConstants.WS_SEP;
-    /** Relative destination folder root, e.g. "res/" */
-    private static final String RES_FOLDER_REL =
-        SdkConstants.FD_RESOURCES + AdtConstants.WS_SEP;
-
-    private static final String DEFAULT_RES_FILE_PATH = "/res/values/strings.xml";  //$NON-NLS-1$
-
-    private XmlStringFileHelper mXmlHelper = new XmlStringFileHelper();
-
-    private final OnConfigSelectorUpdated mOnConfigSelectorUpdated = new OnConfigSelectorUpdated();
-
-    private ModifyListener mValidateOnModify = new ModifyListener() {
-        @Override
-        public void modifyText(ModifyEvent e) {
-            validatePage();
-        }
-    };
-
-    private SelectionListener mValidateOnSelection = new SelectionAdapter() {
-        @Override
-        public void widgetSelected(SelectionEvent e) {
-            validatePage();
-        }
-    };
-
-    public ExtractStringInputPage(IProject project) {
-        super("ExtractStringInputPage");  //$NON-NLS-1$
-        mProject = project;
-    }
-
-    /**
-     * Create the UI for the refactoring wizard.
-     * <p/>
-     * Note that at that point the initial conditions have been checked in
-     * {@link ExtractStringRefactoring}.
-     * <p/>
-     *
-     * Note: the special tag below defines this as the entry point for the WindowsDesigner Editor.
-     * @wbp.parser.entryPoint
-     */
-    @Override
-    public void createControl(Composite parent) {
-        Composite content = new Composite(parent, SWT.NONE);
-        GridLayout layout = new GridLayout();
-        content.setLayout(layout);
-
-        createStringGroup(content);
-        createResFileGroup(content);
-        createOptionGroup(content);
-
-        initUi();
-        setControl(content);
-    }
-
-    /**
-     * Creates the top group with the field to replace which string and by what
-     * and by which options.
-     *
-     * @param content A composite with a 1-column grid layout
-     */
-    public void createStringGroup(Composite content) {
-
-        final ExtractStringRefactoring ref = getOurRefactoring();
-
-        Group group = new Group(content, SWT.NONE);
-        group.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-        group.setText("New String");
-        if (ref.getMode() == ExtractStringRefactoring.Mode.EDIT_SOURCE) {
-            group.setText("String Replacement");
-        }
-
-        GridLayout layout = new GridLayout();
-        layout.numColumns = 2;
-        group.setLayout(layout);
-
-        // line: Textfield for string value (based on selection, if any)
-
-        Label label = new Label(group, SWT.NONE);
-        label.setText("&String");
-
-        String selectedString = ref.getTokenString();
-
-        mStringValueField = new Text(group, SWT.SINGLE | SWT.LEFT | SWT.BORDER);
-        mStringValueField.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-        mStringValueField.setText(selectedString != null ? selectedString : "");  //$NON-NLS-1$
-
-        ref.setNewStringValue(mStringValueField.getText());
-
-        mStringValueField.addModifyListener(new ModifyListener() {
-            @Override
-            public void modifyText(ModifyEvent e) {
-                validatePage();
-            }
-        });
-
-        // line : Textfield for new ID
-
-        label = new Label(group, SWT.NONE);
-        label.setText("ID &R.string.");
-        if (ref.getMode() == ExtractStringRefactoring.Mode.EDIT_SOURCE) {
-            label.setText("&Replace by R.string.");
-        } else if (ref.getMode() == ExtractStringRefactoring.Mode.SELECT_NEW_ID) {
-            label.setText("New &R.string.");
-        }
-
-        mStringIdCombo = new Combo(group, SWT.SINGLE | SWT.LEFT | SWT.BORDER | SWT.DROP_DOWN);
-        mStringIdCombo.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-        mStringIdCombo.setText(guessId(selectedString));
-        mStringIdCombo.forceFocus();
-
-        ref.setNewStringId(mStringIdCombo.getText().trim());
-
-        mStringIdCombo.addModifyListener(mValidateOnModify);
-        mStringIdCombo.addSelectionListener(mValidateOnSelection);
-    }
-
-    /**
-     * Creates the lower group with the fields to choose the resource confirmation and
-     * the target XML file.
-     *
-     * @param content A composite with a 1-column grid layout
-     */
-    private void createResFileGroup(Composite content) {
-
-        Group group = new Group(content, SWT.NONE);
-        GridData gd = new GridData(GridData.FILL_HORIZONTAL);
-        gd.grabExcessVerticalSpace = true;
-        group.setLayoutData(gd);
-        group.setText("XML resource to edit");
-
-        GridLayout layout = new GridLayout();
-        layout.numColumns = 2;
-        group.setLayout(layout);
-
-        // line: selection of the res config
-
-        Label label;
-        label = new Label(group, SWT.NONE);
-        label.setText("&Configuration:");
-
-        mConfigSelector = new ConfigurationSelector(group, SelectorMode.DEFAULT);
-        gd = new GridData(GridData.GRAB_HORIZONTAL | GridData.GRAB_VERTICAL);
-        gd.horizontalSpan = 2;
-        gd.widthHint = ConfigurationSelector.WIDTH_HINT;
-        gd.heightHint = ConfigurationSelector.HEIGHT_HINT;
-        mConfigSelector.setLayoutData(gd);
-        mConfigSelector.setOnChangeListener(mOnConfigSelectorUpdated);
-
-        // line: selection of the output file
-
-        label = new Label(group, SWT.NONE);
-        label.setText("Resource &file:");
-
-        mResFileCombo = new Combo(group, SWT.DROP_DOWN);
-        mResFileCombo.select(0);
-        mResFileCombo.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-        mResFileCombo.addModifyListener(mOnConfigSelectorUpdated);
-    }
-
-    /**
-     * Creates the bottom option groups with a few checkboxes.
-     *
-     * @param content A composite with a 1-column grid layout
-     */
-    private void createOptionGroup(Composite content) {
-        Group options = new Group(content, SWT.NONE);
-        options.setText("Options");
-        GridData gd_Options = new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1);
-        gd_Options.widthHint = 77;
-        options.setLayoutData(gd_Options);
-        options.setLayout(new GridLayout(1, false));
-
-        mReplaceAllJava = new Button(options, SWT.CHECK);
-        mReplaceAllJava.setToolTipText("When checked, the exact same string literal will be replaced in all Java files.");
-        mReplaceAllJava.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
-        mReplaceAllJava.setText("Replace in all &Java files");
-        mReplaceAllJava.addSelectionListener(mValidateOnSelection);
-
-        mReplaceAllXml = new Button(options, SWT.CHECK);
-        mReplaceAllXml.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
-        mReplaceAllXml.setToolTipText("When checked, string literals will be replaced in other XML resource files having the same name but located in different resource configuration folders.");
-        mReplaceAllXml.setText("Replace in all &XML files for different configuration");
-        mReplaceAllXml.addSelectionListener(mValidateOnSelection);
-    }
-
-    // -- Start of internal part ----------
-    // Hide everything down-below from WindowsDesigner Editor
-    //$hide>>$
-
-    /**
-     * Init UI just after it has been created the first time.
-     */
-    private void initUi() {
-        // set output file name to the last one used
-        String projPath = mProject.getFullPath().toPortableString();
-        String filePath = sLastResFilePath.get(projPath);
-
-        mResFileCombo.setText(filePath != null ? filePath : DEFAULT_RES_FILE_PATH);
-        mOnConfigSelectorUpdated.run();
-        validatePage();
-    }
-
-    /**
-     * Utility method to guess a suitable new XML ID based on the selected string.
-     */
-    public static String guessId(String text) {
-        if (text == null) {
-            return "";  //$NON-NLS-1$
-        }
-
-        // make lower case
-        text = text.toLowerCase(Locale.US);
-
-        // everything not alphanumeric becomes an underscore
-        text = text.replaceAll("[^a-zA-Z0-9]+", "_");  //$NON-NLS-1$ //$NON-NLS-2$
-
-        // the id must be a proper Java identifier, so it can't start with a number
-        if (text.length() > 0 && !Character.isJavaIdentifierStart(text.charAt(0))) {
-            text = "_" + text;  //$NON-NLS-1$
-        }
-        return text;
-    }
-
-    /**
-     * Returns the {@link ExtractStringRefactoring} instance used by this wizard page.
-     */
-    private ExtractStringRefactoring getOurRefactoring() {
-        return (ExtractStringRefactoring) getRefactoring();
-    }
-
-    /**
-     * Validates fields of the wizard input page. Displays errors as appropriate and
-     * enable the "Next" button (or not) by calling {@link #setPageComplete(boolean)}.
-     *
-     * If validation succeeds, this updates the text id & value in the refactoring object.
-     *
-     * @return True if the page has been positively validated. It may still have warnings.
-     */
-    private boolean validatePage() {
-        boolean success = true;
-
-        ExtractStringRefactoring ref = getOurRefactoring();
-
-        ref.setReplaceAllJava(mReplaceAllJava.getSelection());
-        ref.setReplaceAllXml(mReplaceAllXml.isEnabled() && mReplaceAllXml.getSelection());
-
-        // Analyze fatal errors.
-
-        String text = mStringIdCombo.getText().trim();
-        if (text == null || text.length() < 1) {
-            setErrorMessage("Please provide a resource ID.");
-            success = false;
-        } else {
-            for (int i = 0; i < text.length(); i++) {
-                char c = text.charAt(i);
-                boolean ok = i == 0 ?
-                        Character.isJavaIdentifierStart(c) :
-                        Character.isJavaIdentifierPart(c);
-                if (!ok) {
-                    setErrorMessage(String.format(
-                            "The resource ID must be a valid Java identifier. The character %1$c at position %2$d is not acceptable.",
-                            c, i+1));
-                    success = false;
-                    break;
-                }
-            }
-
-            // update the field in the refactoring object in case of success
-            if (success) {
-                ref.setNewStringId(text);
-            }
-        }
-
-        String resFile = mResFileCombo.getText();
-        if (success) {
-            if (resFile == null || resFile.length() == 0) {
-                setErrorMessage("A resource file name is required.");
-                success = false;
-            } else if (!RES_XML_FILE_REGEX.matcher(resFile).matches()) {
-                setErrorMessage("The XML file name is not valid.");
-                success = false;
-            }
-        }
-
-        // Analyze info & warnings.
-
-        if (success) {
-            setErrorMessage(null);
-
-            ref.setTargetFile(resFile);
-            sLastResFilePath.put(mProject.getFullPath().toPortableString(), resFile);
-
-            String idValue = mXmlHelper.valueOfStringId(mProject, resFile, text);
-            if (idValue != null) {
-                String msg = String.format("%1$s already contains a string ID '%2$s' with value '%3$s'.",
-                        resFile,
-                        text,
-                        idValue);
-                if (ref.getMode() == ExtractStringRefactoring.Mode.SELECT_NEW_ID) {
-                    setErrorMessage(msg);
-                    success = false;
-                } else {
-                    setMessage(msg, WizardPage.WARNING);
-                }
-            } else if (mProject.findMember(resFile) == null) {
-                setMessage(
-                        String.format("File %2$s does not exist and will be created.",
-                                text, resFile),
-                        WizardPage.INFORMATION);
-            } else {
-                setMessage(null);
-            }
-        }
-
-        if (success) {
-            // Also update the text value in case of success.
-            ref.setNewStringValue(mStringValueField.getText());
-        }
-
-        setPageComplete(success);
-        return success;
-    }
-
-    private void updateStringValueCombo() {
-        String resFile = mResFileCombo.getText();
-        Map<String, String> ids = mXmlHelper.getResIdsForFile(mProject, resFile);
-
-        // get the current text from the combo, to make sure we don't change it
-        String currText = mStringIdCombo.getText();
-
-        // erase the choices and fill with the given ids
-        mStringIdCombo.removeAll();
-        mStringIdCombo.setItems(ids.keySet().toArray(new String[ids.size()]));
-
-        // set the current text to preserve it in case it changed
-        if (!currText.equals(mStringIdCombo.getText())) {
-            mStringIdCombo.setText(currText);
-        }
-    }
-
-    private class OnConfigSelectorUpdated implements Runnable, ModifyListener {
-
-        /** Regex pattern to parse a valid res path: it reads (/res/folder-name/)+(filename). */
-        private final Pattern mPathRegex = Pattern.compile(
-            "(/res/[a-z][a-zA-Z0-9_-]+/)(.+)");  //$NON-NLS-1$
-
-        /** Temporary config object used to retrieve the Config Selector value. */
-        private FolderConfiguration mTempConfig = new FolderConfiguration();
-
-        private HashMap<String, TreeSet<String>> mFolderCache =
-            new HashMap<String, TreeSet<String>>();
-        private String mLastFolderUsedInCombo = null;
-        private boolean mInternalConfigChange;
-        private boolean mInternalFileComboChange;
-
-        /**
-         * Callback invoked when the {@link ConfigurationSelector} has been changed.
-         * <p/>
-         * The callback does the following:
-         * <ul>
-         * <li> Examine the current file name to retrieve the XML filename, if any.
-         * <li> Recompute the path based on the configuration selector (e.g. /res/values-fr/).
-         * <li> Examine the path to retrieve all the files in it. Keep those in a local cache.
-         * <li> If the XML filename from step 1 is not in the file list, it's a custom file name.
-         *      Insert it and sort it.
-         * <li> Re-populate the file combo with all the choices.
-         * <li> Select the original XML file.
-         */
-        @Override
-        public void run() {
-            if (mInternalConfigChange) {
-                return;
-            }
-
-            // get current leafname, if any
-            String leafName = "";  //$NON-NLS-1$
-            String currPath = mResFileCombo.getText();
-            Matcher m = mPathRegex.matcher(currPath);
-            if (m.matches()) {
-                // Note: groups 1 and 2 cannot be null.
-                leafName = m.group(2);
-                currPath = m.group(1);
-            } else {
-                // There was a path but it was invalid. Ignore it.
-                currPath = "";  //$NON-NLS-1$
-            }
-
-            // recreate the res path from the current configuration
-            mConfigSelector.getConfiguration(mTempConfig);
-            StringBuffer sb = new StringBuffer(RES_FOLDER_ABS);
-            sb.append(mTempConfig.getFolderName(ResourceFolderType.VALUES));
-            sb.append(AdtConstants.WS_SEP);
-
-            String newPath = sb.toString();
-
-            if (newPath.equals(currPath) && newPath.equals(mLastFolderUsedInCombo)) {
-                // Path has not changed. No need to reload.
-                return;
-            }
-
-            // Get all the files at the new path
-
-            TreeSet<String> filePaths = mFolderCache.get(newPath);
-
-            if (filePaths == null) {
-                filePaths = new TreeSet<String>();
-
-                IFolder folder = mProject.getFolder(newPath);
-                if (folder != null && folder.exists()) {
-                    try {
-                        for (IResource res : folder.members()) {
-                            String name = res.getName();
-                            if (res.getType() == IResource.FILE && name.endsWith(".xml")) {
-                                filePaths.add(newPath + name);
-                            }
-                        }
-                    } catch (CoreException e) {
-                        // Ignore.
-                    }
-                }
-
-                mFolderCache.put(newPath, filePaths);
-            }
-
-            currPath = newPath + leafName;
-            if (leafName.length() > 0 && !filePaths.contains(currPath)) {
-                filePaths.add(currPath);
-            }
-
-            // Fill the combo
-            try {
-                mInternalFileComboChange = true;
-
-                mResFileCombo.removeAll();
-
-                for (String filePath : filePaths) {
-                    mResFileCombo.add(filePath);
-                }
-
-                int index = -1;
-                if (leafName.length() > 0) {
-                    index = mResFileCombo.indexOf(currPath);
-                    if (index >= 0) {
-                        mResFileCombo.select(index);
-                    }
-                }
-
-                if (index == -1) {
-                    mResFileCombo.setText(currPath);
-                }
-
-                mLastFolderUsedInCombo = newPath;
-
-            } finally {
-                mInternalFileComboChange = false;
-            }
-
-            // finally validate the whole page
-            updateStringValueCombo();
-            validatePage();
-        }
-
-        /**
-         * Callback invoked when {@link ExtractStringInputPage#mResFileCombo} has been
-         * modified.
-         */
-        @Override
-        public void modifyText(ModifyEvent e) {
-            if (mInternalFileComboChange) {
-                return;
-            }
-
-            String wsFolderPath = mResFileCombo.getText();
-
-            // This is a custom path, we need to sanitize it.
-            // First it should start with "/res/". Then we need to make sure there are no
-            // relative paths, things like "../" or "./" or even "//".
-            wsFolderPath = wsFolderPath.replaceAll("/+\\.\\./+|/+\\./+|//+|\\\\+|^/+", "/");  //$NON-NLS-1$ //$NON-NLS-2$
-            wsFolderPath = wsFolderPath.replaceAll("^\\.\\./+|^\\./+", "");                   //$NON-NLS-1$ //$NON-NLS-2$
-            wsFolderPath = wsFolderPath.replaceAll("/+\\.\\.$|/+\\.$|/+$", "");               //$NON-NLS-1$ //$NON-NLS-2$
-
-            // We get "res/foo" from selections relative to the project when we want a "/res/foo" path.
-            if (wsFolderPath.startsWith(RES_FOLDER_REL)) {
-                wsFolderPath = RES_FOLDER_ABS + wsFolderPath.substring(RES_FOLDER_REL.length());
-
-                mInternalFileComboChange = true;
-                mResFileCombo.setText(wsFolderPath);
-                mInternalFileComboChange = false;
-            }
-
-            if (wsFolderPath.startsWith(RES_FOLDER_ABS)) {
-                wsFolderPath = wsFolderPath.substring(RES_FOLDER_ABS.length());
-
-                int pos = wsFolderPath.indexOf(AdtConstants.WS_SEP_CHAR);
-                if (pos >= 0) {
-                    wsFolderPath = wsFolderPath.substring(0, pos);
-                }
-
-                String[] folderSegments = wsFolderPath.split(SdkConstants.RES_QUALIFIER_SEP);
-
-                if (folderSegments.length > 0) {
-                    String folderName = folderSegments[0];
-
-                    if (folderName != null && !folderName.equals(wsFolderPath)) {
-                        // update config selector
-                        mInternalConfigChange = true;
-                        mConfigSelector.setConfiguration(folderSegments);
-                        mInternalConfigChange = false;
-                    }
-                }
-            }
-
-            updateStringValueCombo();
-            validatePage();
-        }
-    }
-
-    // End of hiding from SWT Designer
-    //$hide<<$
-
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/refactorings/extractstring/ExtractStringProposal.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/refactorings/extractstring/ExtractStringProposal.java
deleted file mode 100644
index 5400be4..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/refactorings/extractstring/ExtractStringProposal.java
+++ /dev/null
@@ -1,185 +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.eclipse.adt.internal.refactorings.extractstring;
-
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.ide.eclipse.adt.AdtUtils;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.jdt.core.IBuffer;
-import org.eclipse.jdt.core.JavaModelException;
-import org.eclipse.jdt.core.dom.ASTNode;
-import org.eclipse.jdt.ui.text.java.IInvocationContext;
-import org.eclipse.jdt.ui.text.java.IJavaCompletionProposal;
-import org.eclipse.jface.text.IDocument;
-import org.eclipse.jface.text.ITextSelection;
-import org.eclipse.jface.text.TextSelection;
-import org.eclipse.jface.text.contentassist.IContextInformation;
-import org.eclipse.ltk.ui.refactoring.RefactoringWizard;
-import org.eclipse.ltk.ui.refactoring.RefactoringWizardOpenOperation;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PlatformUI;
-
-/**
- * Proposal for extracting strings in Java files
- */
-public class ExtractStringProposal implements IJavaCompletionProposal {
-    private IInvocationContext mContext;
-
-    public ExtractStringProposal(IInvocationContext context) {
-        mContext = context;
-    }
-
-    @Override
-    public void apply(IDocument document) {
-        IEditorPart editor = AdtUtils.getActiveEditor();
-        IFile file = AdtUtils.getActiveFile();
-        if (editor == null || file == null) {
-            return;
-        }
-
-        ASTNode coveringNode = mContext.getCoveringNode();
-        int start = coveringNode.getStartPosition();
-        int length = coveringNode.getLength();
-        ITextSelection selection = new TextSelection(start, length);
-
-        ExtractStringRefactoring refactoring = new ExtractStringRefactoring(file, editor,
-                selection);
-
-        RefactoringWizard wizard = new ExtractStringWizard(refactoring, file.getProject());
-        RefactoringWizardOpenOperation op = new RefactoringWizardOpenOperation(wizard);
-        try {
-            IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
-            op.run(window.getShell(), wizard.getDefaultPageTitle());
-        } catch (InterruptedException e) {
-        }
-    }
-
-    @Override
-    public Point getSelection(IDocument document) {
-        return null;
-    }
-
-    @Override
-    public String getAdditionalProposalInfo() {
-        try {
-            ASTNode coveringNode = mContext.getCoveringNode();
-            int start = coveringNode.getStartPosition();
-            int length = coveringNode.getLength();
-            IBuffer buffer = mContext.getCompilationUnit().getBuffer();
-            StringBuilder sb = new StringBuilder();
-            String string = buffer.getText(start, length);
-            string = ExtractStringRefactoring.unquoteAttrValue(string);
-            String token = ExtractStringInputPage.guessId(string);
-
-            // Look up the beginning and the end of the line (outside of the extracted string)
-            // such that we can show a preview of the diff, e.g. if you have
-            // foo.setTitle("Hello"); we want to show foo.setTitle(R.string.hello);
-            // so we need to extract "foo.setTitle(" and ");".
-
-            // Look backwards to the beginning of the line (and strip whitespace)
-            int i = start - 1;
-            while (i > 0) {
-                char c = buffer.getChar(i);
-                if (c == '\r' || (c == '\n')) {
-                    break;
-                }
-                i--;
-            }
-            String linePrefix = buffer.getText(i + 1, start - (i + 1)).trim();
-
-            // Look forwards to the end of the line (and strip whitespace)
-            i = start + length;
-            while (i < buffer.getLength()) {
-                char c = buffer.getChar(i);
-                if (c == '\r' || (c == '\n')) {
-                    break;
-                }
-                i++;
-            }
-            String lineSuffix = buffer.getText(start + length, i - (start + length));
-
-            // Should we show the replacement as just R.string.foo or
-            // context.getString(R.string.foo) ?
-            boolean useContext = false;
-            ASTNode parent = coveringNode.getParent();
-            if (parent != null) {
-                int type = parent.getNodeType();
-                if (type == ASTNode.ASSIGNMENT
-                        || type == ASTNode.VARIABLE_DECLARATION_STATEMENT
-                        || type == ASTNode.VARIABLE_DECLARATION_FRAGMENT
-                        || type == ASTNode.VARIABLE_DECLARATION_EXPRESSION) {
-                    useContext = true;
-                }
-            }
-
-            // Display .java change:
-            sb.append("...<br>");                   //$NON-NLS-1$
-            sb.append(linePrefix);
-            sb.append("<b>");                       //$NON-NLS-1$
-            if (useContext) {
-                sb.append("context.getString(");    //$NON-NLS-1$
-            }
-            sb.append("R.string.");                 //$NON-NLS-1$
-            sb.append(token);
-            if (useContext) {
-                sb.append(")");                     //$NON-NLS-1$
-            }
-            sb.append("</b>");                      //$NON-NLS-1$
-            sb.append(lineSuffix);
-            sb.append("<br>...<br>");               //$NON-NLS-1$
-
-            // Display strings.xml change:
-            sb.append("<br>");                      //$NON-NLS-1$
-            sb.append("&lt;resources&gt;<br>");     //$NON-NLS-1$
-            sb.append("    <b>&lt;string name=\""); //$NON-NLS-1$
-            sb.append(token);
-            sb.append("\"&gt;");                    //$NON-NLS-1$
-            sb.append(string);
-            sb.append("&lt;/string&gt;</b><br>");   //$NON-NLS-1$
-            sb.append("&lt;/resources&gt;");        //$NON-NLS-1$
-
-            return sb.toString();
-        } catch (JavaModelException e) {
-            AdtPlugin.log(e, null);
-        }
-
-        return "Initiates the Extract String refactoring operation";
-    }
-
-    @Override
-    public String getDisplayString() {
-        return "Extract String";
-    }
-
-    @Override
-    public Image getImage() {
-        return AdtPlugin.getAndroidLogo();
-    }
-
-    @Override
-    public IContextInformation getContextInformation() {
-        return null;
-    }
-
-    @Override
-    public int getRelevance() {
-        return 80;
-    }
-}
\ No newline at end of file
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/refactorings/extractstring/ExtractStringRefactoring.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/refactorings/extractstring/ExtractStringRefactoring.java
deleted file mode 100644
index db0b096..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/refactorings/extractstring/ExtractStringRefactoring.java
+++ /dev/null
@@ -1,1933 +0,0 @@
-/*
- * Copyright (C) 2009 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.refactorings.extractstring;
-
-import static com.android.SdkConstants.QUOT_ENTITY;
-import static com.android.SdkConstants.STRING_PREFIX;
-
-import com.android.SdkConstants;
-import com.android.ide.common.res2.ValueXmlHelper;
-import com.android.ide.common.xml.ManifestData;
-import com.android.ide.eclipse.adt.AdtConstants;
-import com.android.ide.eclipse.adt.internal.editors.AndroidXmlEditor;
-import com.android.ide.eclipse.adt.internal.editors.descriptors.AttributeDescriptor;
-import com.android.ide.eclipse.adt.internal.editors.descriptors.ReferenceAttributeDescriptor;
-import com.android.ide.eclipse.adt.internal.editors.uimodel.UiAttributeNode;
-import com.android.ide.eclipse.adt.internal.editors.uimodel.UiElementNode;
-import com.android.ide.eclipse.adt.internal.project.AndroidManifestHelper;
-import com.android.resources.ResourceFolderType;
-import com.android.resources.ResourceType;
-
-import org.eclipse.core.resources.IContainer;
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IFolder;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.ResourceAttributes;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.OperationCanceledException;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.core.runtime.SubMonitor;
-import org.eclipse.jdt.core.IBuffer;
-import org.eclipse.jdt.core.ICompilationUnit;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.IPackageFragment;
-import org.eclipse.jdt.core.IPackageFragmentRoot;
-import org.eclipse.jdt.core.JavaCore;
-import org.eclipse.jdt.core.JavaModelException;
-import org.eclipse.jdt.core.ToolFactory;
-import org.eclipse.jdt.core.compiler.IScanner;
-import org.eclipse.jdt.core.compiler.ITerminalSymbols;
-import org.eclipse.jdt.core.compiler.InvalidInputException;
-import org.eclipse.jdt.core.dom.AST;
-import org.eclipse.jdt.core.dom.ASTNode;
-import org.eclipse.jdt.core.dom.ASTParser;
-import org.eclipse.jdt.core.dom.CompilationUnit;
-import org.eclipse.jdt.core.dom.rewrite.ASTRewrite;
-import org.eclipse.jdt.core.dom.rewrite.ImportRewrite;
-import org.eclipse.jface.text.ITextSelection;
-import org.eclipse.ltk.core.refactoring.Change;
-import org.eclipse.ltk.core.refactoring.ChangeDescriptor;
-import org.eclipse.ltk.core.refactoring.CompositeChange;
-import org.eclipse.ltk.core.refactoring.Refactoring;
-import org.eclipse.ltk.core.refactoring.RefactoringChangeDescriptor;
-import org.eclipse.ltk.core.refactoring.RefactoringStatus;
-import org.eclipse.ltk.core.refactoring.TextEditChangeGroup;
-import org.eclipse.ltk.core.refactoring.TextFileChange;
-import org.eclipse.text.edits.InsertEdit;
-import org.eclipse.text.edits.MultiTextEdit;
-import org.eclipse.text.edits.ReplaceEdit;
-import org.eclipse.text.edits.TextEdit;
-import org.eclipse.text.edits.TextEditGroup;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.wst.sse.core.StructuredModelManager;
-import org.eclipse.wst.sse.core.internal.provisional.IModelManager;
-import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
-import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;
-import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocumentRegion;
-import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegion;
-import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegionList;
-import org.eclipse.wst.xml.core.internal.regions.DOMRegionContext;
-import org.w3c.dom.Node;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
-import java.util.Queue;
-
-/**
- * This refactoring extracts a string from a file and replaces it by an Android resource ID
- * such as R.string.foo.
- * <p/>
- * There are a number of scenarios, which are not all supported yet. The workflow works as
- * such:
- * <ul>
- * <li> User selects a string in a Java and invokes the {@link ExtractStringAction}.
- * <li> The action finds the {@link ICompilationUnit} being edited as well as the current
- *      {@link ITextSelection}. The action creates a new instance of this refactoring as
- *      well as an {@link ExtractStringWizard} and runs the operation.
- * <li> Step 1 of the refactoring is to check the preliminary conditions. Right now we check
- *      that the java source is not read-only and is in sync. We also try to find a string under
- *      the selection. If this fails, the refactoring is aborted.
- * <li> On success, the wizard is shown, which lets the user input the new ID to use.
- * <li> The wizard sets the user input values into this refactoring instance, e.g. the new string
- *      ID, the XML file to update, etc. The wizard does use the utility method
- *      {@link XmlStringFileHelper#valueOfStringId(IProject, String, String)} to check whether
- *      the new ID is already defined in the target XML file.
- * <li> Once Preview or Finish is selected in the wizard, the
- *      {@link #checkFinalConditions(IProgressMonitor)} is called to double-check the user input
- *      and compute the actual changes.
- * <li> When all changes are computed, {@link #createChange(IProgressMonitor)} is invoked.
- * </ul>
- *
- * The list of changes are:
- * <ul>
- * <li> If the target XML does not exist, create it with the new string ID.
- * <li> If the target XML exists, find the <resources> node and add the new string ID right after.
- *      If the node is <resources/>, it needs to be opened.
- * <li> Create an AST rewriter to edit the source Java file and replace all occurrences by the
- *      new computed R.string.foo. Also need to rewrite imports to import R as needed.
- *      If there's already a conflicting R included, we need to insert the FQCN instead.
- * <li> TODO: Have a pref in the wizard: [x] Change other XML Files
- * <li> TODO: Have a pref in the wizard: [x] Change other Java Files
- * </ul>
- */
-@SuppressWarnings("restriction")
-public class ExtractStringRefactoring extends Refactoring {
-
-    public enum Mode {
-        /**
-         * the Extract String refactoring is called on an <em>existing</em> source file.
-         * Its purpose is then to get the selected string of the source and propose to
-         * change it by an XML id. The XML id may be a new one or an existing one.
-         */
-        EDIT_SOURCE,
-        /**
-         * The Extract String refactoring is called without any source file.
-         * Its purpose is then to create a new XML string ID or select/modify an existing one.
-         */
-        SELECT_ID,
-        /**
-         * The Extract String refactoring is called without any source file.
-         * Its purpose is then to create a new XML string ID. The ID must not already exist.
-         */
-        SELECT_NEW_ID
-    }
-
-    /** The {@link Mode} of operation of the refactoring. */
-    private final Mode mMode;
-    /** Non-null when editing an Android Resource XML file: identifies the attribute name
-     * of the value being edited. When null, the source is an Android Java file. */
-    private String mXmlAttributeName;
-    /** The file model being manipulated.
-     * Value is null when not on {@link Mode#EDIT_SOURCE} mode. */
-    private final IFile mFile;
-    /** The editor. Non-null when invoked from {@link ExtractStringAction}. Null otherwise. */
-    private final IEditorPart mEditor;
-    /** The project that contains {@link #mFile} and that contains the target XML file to modify. */
-    private final IProject mProject;
-    /** The start of the selection in {@link #mFile}.
-     * Value is -1 when not on {@link Mode#EDIT_SOURCE} mode. */
-    private final int mSelectionStart;
-    /** The end of the selection in {@link #mFile}.
-     * Value is -1 when not on {@link Mode#EDIT_SOURCE} mode. */
-    private final int mSelectionEnd;
-
-    /** The compilation unit, only defined if {@link #mFile} points to a usable Java source file. */
-    private ICompilationUnit mUnit;
-    /** The actual string selected, after UTF characters have been escaped, good for display.
-     * Value is null when not on {@link Mode#EDIT_SOURCE} mode. */
-    private String mTokenString;
-
-    /** The XML string ID selected by the user in the wizard. */
-    private String mXmlStringId;
-    /** The XML string value. Might be different than the initial selected string. */
-    private String mXmlStringValue;
-    /** The path of the XML file that will define {@link #mXmlStringId}, selected by the user
-     *  in the wizard. This is relative to the project, e.g. "/res/values/string.xml" */
-    private String mTargetXmlFileWsPath;
-    /** True if we should find & replace in all Java files. */
-    private boolean mReplaceAllJava;
-    /** True if we should find & replace in all XML files of the same name in other res configs
-     * (other than the main {@link #mTargetXmlFileWsPath}.) */
-    private boolean mReplaceAllXml;
-
-    /** The list of changes computed by {@link #checkFinalConditions(IProgressMonitor)} and
-     *  used by {@link #createChange(IProgressMonitor)}. */
-    private ArrayList<Change> mChanges;
-
-    private XmlStringFileHelper mXmlHelper = new XmlStringFileHelper();
-
-    private static final String KEY_MODE = "mode";                      //$NON-NLS-1$
-    private static final String KEY_FILE = "file";                      //$NON-NLS-1$
-    private static final String KEY_PROJECT = "proj";                   //$NON-NLS-1$
-    private static final String KEY_SEL_START = "sel-start";            //$NON-NLS-1$
-    private static final String KEY_SEL_END = "sel-end";                //$NON-NLS-1$
-    private static final String KEY_TOK_ESC = "tok-esc";                //$NON-NLS-1$
-    private static final String KEY_XML_ATTR_NAME = "xml-attr-name";    //$NON-NLS-1$
-    private static final String KEY_RPLC_ALL_JAVA = "rplc-all-java";    //$NON-NLS-1$
-    private static final String KEY_RPLC_ALL_XML  = "rplc-all-xml";     //$NON-NLS-1$
-
-    /**
-     * This constructor is solely used by {@link ExtractStringDescriptor},
-     * to replay a previous refactoring.
-     * <p/>
-     * To create a refactoring from code, please use one of the two other constructors.
-     *
-     * @param arguments A map previously created using {@link #createArgumentMap()}.
-     * @throws NullPointerException
-     */
-    public ExtractStringRefactoring(Map<String, String> arguments) throws NullPointerException {
-
-        mReplaceAllJava = Boolean.parseBoolean(arguments.get(KEY_RPLC_ALL_JAVA));
-        mReplaceAllXml  = Boolean.parseBoolean(arguments.get(KEY_RPLC_ALL_XML));
-        mMode = Mode.valueOf(arguments.get(KEY_MODE));
-
-        IPath path = Path.fromPortableString(arguments.get(KEY_PROJECT));
-        mProject = (IProject) ResourcesPlugin.getWorkspace().getRoot().findMember(path);
-
-        if (mMode == Mode.EDIT_SOURCE) {
-            path = Path.fromPortableString(arguments.get(KEY_FILE));
-            mFile = (IFile) ResourcesPlugin.getWorkspace().getRoot().findMember(path);
-
-            mSelectionStart   = Integer.parseInt(arguments.get(KEY_SEL_START));
-            mSelectionEnd     = Integer.parseInt(arguments.get(KEY_SEL_END));
-            mTokenString      = arguments.get(KEY_TOK_ESC);
-            mXmlAttributeName = arguments.get(KEY_XML_ATTR_NAME);
-        } else {
-            mFile = null;
-            mSelectionStart = mSelectionEnd = -1;
-            mTokenString = null;
-            mXmlAttributeName = null;
-        }
-
-        mEditor = null;
-    }
-
-    private Map<String, String> createArgumentMap() {
-        HashMap<String, String> args = new HashMap<String, String>();
-        args.put(KEY_RPLC_ALL_JAVA, Boolean.toString(mReplaceAllJava));
-        args.put(KEY_RPLC_ALL_XML,  Boolean.toString(mReplaceAllXml));
-        args.put(KEY_MODE,      mMode.name());
-        args.put(KEY_PROJECT,   mProject.getFullPath().toPortableString());
-        if (mMode == Mode.EDIT_SOURCE) {
-            args.put(KEY_FILE,      mFile.getFullPath().toPortableString());
-            args.put(KEY_SEL_START, Integer.toString(mSelectionStart));
-            args.put(KEY_SEL_END,   Integer.toString(mSelectionEnd));
-            args.put(KEY_TOK_ESC,   mTokenString);
-            args.put(KEY_XML_ATTR_NAME, mXmlAttributeName);
-        }
-        return args;
-    }
-
-    /**
-     * Constructor to use when the Extract String refactoring is called on an
-     * *existing* source file. Its purpose is then to get the selected string of
-     * the source and propose to change it by an XML id. The XML id may be a new one
-     * or an existing one.
-     *
-     * @param file The source file to process. Cannot be null. File must exist in workspace.
-     * @param editor The editor.
-     * @param selection The selection in the source file. Cannot be null or empty.
-     */
-    public ExtractStringRefactoring(IFile file, IEditorPart editor, ITextSelection selection) {
-        mMode = Mode.EDIT_SOURCE;
-        mFile = file;
-        mEditor = editor;
-        mProject = file.getProject();
-        mSelectionStart = selection.getOffset();
-        mSelectionEnd = mSelectionStart + Math.max(0, selection.getLength() - 1);
-    }
-
-    /**
-     * Constructor to use when the Extract String refactoring is called without
-     * any source file. Its purpose is then to create a new XML string ID.
-     * <p/>
-     * For example this is currently invoked by the ResourceChooser when
-     * the user wants to create a new string rather than select an existing one.
-     *
-     * @param project The project where the target XML file to modify is located. Cannot be null.
-     * @param enforceNew If true the XML ID must be a new one.
-     *                   If false, an existing ID can be used.
-     */
-    public ExtractStringRefactoring(IProject project, boolean enforceNew) {
-        mMode = enforceNew ? Mode.SELECT_NEW_ID : Mode.SELECT_ID;
-        mFile = null;
-        mEditor = null;
-        mProject = project;
-        mSelectionStart = mSelectionEnd = -1;
-    }
-
-    /**
-     * Sets the replacement string ID. Used by the wizard to set the user input.
-     */
-    public void setNewStringId(String newStringId) {
-        mXmlStringId = newStringId;
-    }
-
-    /**
-     * Sets the replacement string ID. Used by the wizard to set the user input.
-     */
-    public void setNewStringValue(String newStringValue) {
-        mXmlStringValue = newStringValue;
-    }
-
-    /**
-     * Sets the target file. This is a project path, e.g. "/res/values/strings.xml".
-     * Used by the wizard to set the user input.
-     */
-    public void setTargetFile(String targetXmlFileWsPath) {
-        mTargetXmlFileWsPath = targetXmlFileWsPath;
-    }
-
-    public void setReplaceAllJava(boolean replaceAllJava) {
-        mReplaceAllJava = replaceAllJava;
-    }
-
-    public void setReplaceAllXml(boolean replaceAllXml) {
-        mReplaceAllXml = replaceAllXml;
-    }
-
-    /**
-     * @see org.eclipse.ltk.core.refactoring.Refactoring#getName()
-     */
-    @Override
-    public String getName() {
-        if (mMode == Mode.SELECT_ID) {
-            return "Create or Use Android String";
-        } else if (mMode == Mode.SELECT_NEW_ID) {
-            return "Create New Android String";
-        }
-
-        return "Extract Android String";
-    }
-
-    public Mode getMode() {
-        return mMode;
-    }
-
-    /**
-     * Gets the actual string selected, after UTF characters have been escaped,
-     * good for display. Value can be null.
-     */
-    public String getTokenString() {
-        return mTokenString;
-    }
-
-    /** Returns the XML string ID selected by the user in the wizard. */
-    public String getXmlStringId() {
-        return mXmlStringId;
-    }
-
-    /**
-     * Step 1 of 3 of the refactoring:
-     * Checks that the current selection meets the initial condition before the ExtractString
-     * wizard is shown. The check is supposed to be lightweight and quick. Note that at that
-     * point the wizard has not been created yet.
-     * <p/>
-     * Here we scan the source buffer to find the token matching the selection.
-     * The check is successful is a Java string literal is selected, the source is in sync
-     * and is not read-only.
-     * <p/>
-     * This is also used to extract the string to be modified, so that we can display it in
-     * the refactoring wizard.
-     *
-     * @see org.eclipse.ltk.core.refactoring.Refactoring#checkInitialConditions(org.eclipse.core.runtime.IProgressMonitor)
-     *
-     * @throws CoreException
-     */
-    @Override
-    public RefactoringStatus checkInitialConditions(IProgressMonitor monitor)
-            throws CoreException, OperationCanceledException {
-
-        mUnit = null;
-        mTokenString = null;
-
-        RefactoringStatus status = new RefactoringStatus();
-
-        try {
-            monitor.beginTask("Checking preconditions...", 6);
-
-            if (mMode != Mode.EDIT_SOURCE) {
-                monitor.worked(6);
-                return status;
-            }
-
-            if (!checkSourceFile(mFile, status, monitor)) {
-                return status;
-            }
-
-            // Try to get a compilation unit from this file. If it fails, mUnit is null.
-            try {
-                mUnit = JavaCore.createCompilationUnitFrom(mFile);
-
-                // Make sure the unit is not read-only, e.g. it's not a class file or inside a Jar
-                if (mUnit.isReadOnly()) {
-                    status.addFatalError("The file is read-only, please make it writeable first.");
-                    return status;
-                }
-
-                // This is a Java file. Check if it contains the selection we want.
-                if (!findSelectionInJavaUnit(mUnit, status, monitor)) {
-                    return status;
-                }
-
-            } catch (Exception e) {
-                // That was not a Java file. Ignore.
-            }
-
-            if (mUnit != null) {
-                monitor.worked(1);
-                return status;
-            }
-
-            // Check this a Layout XML file and get the selection and its context.
-            if (mFile != null && SdkConstants.EXT_XML.equals(mFile.getFileExtension())) {
-
-                // Currently we only support Android resource XML files, so they must have a path
-                // similar to
-                //    project/res/<type>[-<configuration>]/*.xml
-                //    project/AndroidManifest.xml
-                // There is no support for sub folders, so the segment count must be 4 or 2.
-                // We don't need to check the type folder name because a/ we only accept
-                // an AndroidXmlEditor source and b/ aapt generates a compilation error for
-                // unknown folders.
-
-                IPath path = mFile.getFullPath();
-                if ((path.segmentCount() == 4 &&
-                     path.segment(1).equalsIgnoreCase(SdkConstants.FD_RESOURCES)) ||
-                    (path.segmentCount() == 2 &&
-                     path.segment(1).equalsIgnoreCase(SdkConstants.FN_ANDROID_MANIFEST_XML))) {
-                    if (!findSelectionInXmlFile(mFile, status, monitor)) {
-                        return status;
-                    }
-                }
-            }
-
-            if (!status.isOK()) {
-                status.addFatalError(
-                        "Selection must be inside a Java source or an Android Layout XML file.");
-            }
-
-        } finally {
-            monitor.done();
-        }
-
-        return status;
-    }
-
-    /**
-     * Try to find the selected Java element in the compilation unit.
-     *
-     * If selection matches a string literal, capture it, otherwise add a fatal error
-     * to the status.
-     *
-     * On success, advance the monitor by 3.
-     * Returns status.isOK().
-     */
-    private boolean findSelectionInJavaUnit(ICompilationUnit unit,
-            RefactoringStatus status, IProgressMonitor monitor) {
-        try {
-            IBuffer buffer = unit.getBuffer();
-
-            IScanner scanner = ToolFactory.createScanner(
-                    false, //tokenizeComments
-                    false, //tokenizeWhiteSpace
-                    false, //assertMode
-                    false  //recordLineSeparator
-                    );
-            scanner.setSource(buffer.getCharacters());
-            monitor.worked(1);
-
-            for(int token = scanner.getNextToken();
-                    token != ITerminalSymbols.TokenNameEOF;
-                    token = scanner.getNextToken()) {
-                if (scanner.getCurrentTokenStartPosition() <= mSelectionStart &&
-                        scanner.getCurrentTokenEndPosition() >= mSelectionEnd) {
-                    // found the token, but only keep if the right type
-                    if (token == ITerminalSymbols.TokenNameStringLiteral) {
-                        mTokenString = new String(scanner.getCurrentTokenSource());
-                    }
-                    break;
-                } else if (scanner.getCurrentTokenStartPosition() > mSelectionEnd) {
-                    // scanner is past the selection, abort.
-                    break;
-                }
-            }
-        } catch (JavaModelException e1) {
-            // Error in unit.getBuffer. Ignore.
-        } catch (InvalidInputException e2) {
-            // Error in scanner.getNextToken. Ignore.
-        } finally {
-            monitor.worked(1);
-        }
-
-        if (mTokenString != null) {
-            // As a literal string, the token should have surrounding quotes. Remove them.
-            // Note: unquoteAttrValue technically removes either " or ' paired quotes, whereas
-            // the Java token should only have " quotes. Since we know the type to be a string
-            // literal, there should be no confusion here.
-            mTokenString = unquoteAttrValue(mTokenString);
-
-            // We need a non-empty string literal
-            if (mTokenString.length() == 0) {
-                mTokenString = null;
-            }
-        }
-
-        if (mTokenString == null) {
-            status.addFatalError("Please select a Java string literal.");
-        }
-
-        monitor.worked(1);
-        return status.isOK();
-    }
-
-    /**
-     * Try to find the selected XML element. This implementation replies on the refactoring
-     * originating from an Android Layout Editor. We rely on some internal properties of the
-     * Structured XML editor to retrieve file content to avoid parsing it again. We also rely
-     * on our specific Android XML model to get element & attribute descriptor properties.
-     *
-     * If selection matches a string literal, capture it, otherwise add a fatal error
-     * to the status.
-     *
-     * On success, advance the monitor by 1.
-     * Returns status.isOK().
-     */
-    private boolean findSelectionInXmlFile(IFile file,
-            RefactoringStatus status,
-            IProgressMonitor monitor) {
-
-        try {
-            if (!(mEditor instanceof AndroidXmlEditor)) {
-                status.addFatalError("Only the Android XML Editor is currently supported.");
-                return status.isOK();
-            }
-
-            AndroidXmlEditor editor = (AndroidXmlEditor) mEditor;
-            IStructuredModel smodel = null;
-            Node node = null;
-            String currAttrName = null;
-
-            try {
-                // See the portability note in AndroidXmlEditor#getModelForRead() javadoc.
-                smodel = editor.getModelForRead();
-                if (smodel != null) {
-                    // The structured model gives the us the actual XML Node element where the
-                    // offset is. By using this Node, we can find the exact UiElementNode of our
-                    // model and thus we'll be able to get the properties of the attribute -- to
-                    // check if it accepts a string reference. This does not however tell us if
-                    // the selection is actually in an attribute value, nor which attribute is
-                    // being edited.
-                    for(int offset = mSelectionStart; offset >= 0 && node == null; --offset) {
-                        node = (Node) smodel.getIndexedRegion(offset);
-                    }
-
-                    if (node == null) {
-                        status.addFatalError(
-                                "The selection does not match any element in the XML document.");
-                        return status.isOK();
-                    }
-
-                    if (node.getNodeType() != Node.ELEMENT_NODE) {
-                        status.addFatalError("The selection is not inside an actual XML element.");
-                        return status.isOK();
-                    }
-
-                    IStructuredDocument sdoc = smodel.getStructuredDocument();
-                    if (sdoc != null) {
-                        // Portability note: all the structured document implementation is
-                        // under wst.sse.core.internal.provisional so we can expect it to change in
-                        // a distant future if they start cleaning their codebase, however unlikely
-                        // that is.
-
-                        int selStart = mSelectionStart;
-                        IStructuredDocumentRegion region =
-                            sdoc.getRegionAtCharacterOffset(selStart);
-                        if (region != null &&
-                                DOMRegionContext.XML_TAG_NAME.equals(region.getType())) {
-                            // Find if any sub-region representing an attribute contains the
-                            // selection. If it does, returns the name of the attribute in
-                            // currAttrName and returns the value in the field mTokenString.
-                            currAttrName = findSelectionInRegion(region, selStart);
-
-                            if (mTokenString == null) {
-                                status.addFatalError(
-                                    "The selection is not inside an actual XML attribute value.");
-                            }
-                        }
-                    }
-
-                    if (mTokenString != null && node != null && currAttrName != null) {
-
-                        // Validate that the attribute accepts a string reference.
-                        // This sets mTokenString to null by side-effect when it fails and
-                        // adds a fatal error to the status as needed.
-                        validateSelectedAttribute(editor, node, currAttrName, status);
-
-                    } else {
-                        // We shouldn't get here: we're missing one of the token string, the node
-                        // or the attribute name. All of them have been checked earlier so don't
-                        // set any specific error.
-                        mTokenString = null;
-                    }
-                }
-            } catch (Throwable t) {
-                // Since we use some internal APIs, use a broad catch-all to report any
-                // unexpected issue rather than crash the whole refactoring.
-                status.addFatalError(
-                        String.format("XML parsing error: %1$s", t.getMessage()));
-            } finally {
-                if (smodel != null) {
-                    smodel.releaseFromRead();
-                }
-            }
-
-        } finally {
-            monitor.worked(1);
-        }
-
-        return status.isOK();
-    }
-
-    /**
-     * The region gives us the textual representation of the XML element
-     * where the selection starts, split using sub-regions. We now just
-     * need to iterate through the sub-regions to find which one
-     * contains the actual selection. We're interested in an attribute
-     * value however when we find one we want to memorize the attribute
-     * name that was defined just before.
-     *
-     * @return When the cursor is on a valid attribute name or value, returns the string of
-     * attribute name. As a side-effect, returns the value of the attribute in {@link #mTokenString}
-     */
-    private String findSelectionInRegion(IStructuredDocumentRegion region, int selStart) {
-
-        String currAttrName = null;
-
-        int startInRegion = selStart - region.getStartOffset();
-
-        int nb = region.getNumberOfRegions();
-        ITextRegionList list = region.getRegions();
-        String currAttrValue = null;
-
-        for (int i = 0; i < nb; i++) {
-            ITextRegion subRegion = list.get(i);
-            String type = subRegion.getType();
-
-            if (DOMRegionContext.XML_TAG_ATTRIBUTE_NAME.equals(type)) {
-                currAttrName = region.getText(subRegion);
-
-                // I like to select the attribute definition and invoke
-                // the extract string wizard. So if the selection is on
-                // the attribute name part, find the value that is just
-                // after and use it as if it were the selection.
-
-                if (subRegion.getStart() <= startInRegion &&
-                        startInRegion < subRegion.getTextEnd()) {
-                    // A well-formed attribute is composed of a name,
-                    // an equal sign and the value. There can't be any space
-                    // in between, which makes the parsing a lot easier.
-                    if (i <= nb - 3 &&
-                            DOMRegionContext.XML_TAG_ATTRIBUTE_EQUALS.equals(
-                                                   list.get(i + 1).getType())) {
-                        subRegion = list.get(i + 2);
-                        type = subRegion.getType();
-                        if (DOMRegionContext.XML_TAG_ATTRIBUTE_VALUE.equals(
-                                type)) {
-                            currAttrValue = region.getText(subRegion);
-                        }
-                    }
-                }
-
-            } else if (subRegion.getStart() <= startInRegion &&
-                    startInRegion < subRegion.getTextEnd() &&
-                    DOMRegionContext.XML_TAG_ATTRIBUTE_VALUE.equals(type)) {
-                currAttrValue = region.getText(subRegion);
-            }
-
-            if (currAttrValue != null) {
-                // We found the value. Only accept it if not empty
-                // and if we found an attribute name before.
-                String text = currAttrValue;
-
-                // The attribute value contains XML quotes. Remove them.
-                text = unquoteAttrValue(text);
-                if (text.length() > 0 && currAttrName != null) {
-                    // Setting mTokenString to non-null marks the fact we
-                    // accept this attribute.
-                    mTokenString = text;
-                }
-
-                break;
-            }
-        }
-
-        return currAttrName;
-    }
-
-    /**
-     * Attribute values found as text for {@link DOMRegionContext#XML_TAG_ATTRIBUTE_VALUE}
-     * contain XML quotes. This removes the quotes (either single or double quotes).
-     *
-     * @param attrValue The attribute value, as extracted by
-     *                  {@link IStructuredDocumentRegion#getText(ITextRegion)}.
-     *                  Must not be null.
-     * @return The attribute value, without quotes. Whitespace is not trimmed, if any.
-     *         String may be empty, but not null.
-     */
-    static String unquoteAttrValue(String attrValue) {
-        int len = attrValue.length();
-        int len1 = len - 1;
-        if (len >= 2 &&
-                attrValue.charAt(0) == '"' &&
-                attrValue.charAt(len1) == '"') {
-            attrValue = attrValue.substring(1, len1);
-        } else if (len >= 2 &&
-                attrValue.charAt(0) == '\'' &&
-                attrValue.charAt(len1) == '\'') {
-            attrValue = attrValue.substring(1, len1);
-        }
-
-        return attrValue;
-    }
-
-    /**
-     * Validates that the attribute accepts a string reference.
-     * This sets mTokenString to null by side-effect when it fails and
-     * adds a fatal error to the status as needed.
-     */
-    private void validateSelectedAttribute(AndroidXmlEditor editor, Node node,
-            String attrName, RefactoringStatus status) {
-        UiElementNode rootUiNode = editor.getUiRootNode();
-        UiElementNode currentUiNode =
-            rootUiNode == null ? null : rootUiNode.findXmlNode(node);
-        ReferenceAttributeDescriptor attrDesc = null;
-
-        if (currentUiNode != null) {
-            // remove any namespace prefix from the attribute name
-            String name = attrName;
-            int pos = name.indexOf(':');
-            if (pos > 0 && pos < name.length() - 1) {
-                name = name.substring(pos + 1);
-            }
-
-            for (UiAttributeNode attrNode : currentUiNode.getAllUiAttributes()) {
-                if (attrNode.getDescriptor().getXmlLocalName().equals(name)) {
-                    AttributeDescriptor desc = attrNode.getDescriptor();
-                    if (desc instanceof ReferenceAttributeDescriptor) {
-                        attrDesc = (ReferenceAttributeDescriptor) desc;
-                    }
-                    break;
-                }
-            }
-        }
-
-        // The attribute descriptor is a resource reference. It must either accept
-        // of any resource type or specifically accept string types.
-        if (attrDesc != null &&
-                (attrDesc.getResourceType() == null ||
-                 attrDesc.getResourceType() == ResourceType.STRING)) {
-            // We have one more check to do: is the current string value already
-            // an Android XML string reference? If so, we can't edit it.
-            if (mTokenString != null && mTokenString.startsWith("@")) {                             //$NON-NLS-1$
-                int pos1 = 0;
-                if (mTokenString.length() > 1 && mTokenString.charAt(1) == '+') {
-                    pos1++;
-                }
-                int pos2 = mTokenString.indexOf('/');
-                if (pos2 > pos1) {
-                    String kind = mTokenString.substring(pos1 + 1, pos2);
-                    if (ResourceType.STRING.getName().equals(kind)) {
-                        mTokenString = null;
-                        status.addFatalError(String.format(
-                                "The attribute %1$s already contains a %2$s reference.",
-                                attrName,
-                                kind));
-                    }
-                }
-            }
-
-            if (mTokenString != null) {
-                // We're done with all our checks. mTokenString contains the
-                // current attribute value. We don't memorize the region nor the
-                // attribute, however we memorize the textual attribute name so
-                // that we can offer replacement for all its occurrences.
-                mXmlAttributeName = attrName;
-            }
-
-        } else {
-            mTokenString = null;
-            status.addFatalError(String.format(
-                    "The attribute %1$s does not accept a string reference.",
-                    attrName));
-        }
-    }
-
-    /**
-     * Tests from org.eclipse.jdt.internal.corext.refactoringChecks#validateEdit()
-     * Might not be useful.
-     *
-     * On success, advance the monitor by 2.
-     *
-     * @return False if caller should abort, true if caller should continue.
-     */
-    private boolean checkSourceFile(IFile file,
-            RefactoringStatus status,
-            IProgressMonitor monitor) {
-        // check whether the source file is in sync
-        if (!file.isSynchronized(IResource.DEPTH_ZERO)) {
-            status.addFatalError("The file is not synchronized. Please save it first.");
-            return false;
-        }
-        monitor.worked(1);
-
-        // make sure we can write to it.
-        ResourceAttributes resAttr = file.getResourceAttributes();
-        if (resAttr == null || resAttr.isReadOnly()) {
-            status.addFatalError("The file is read-only, please make it writeable first.");
-            return false;
-        }
-        monitor.worked(1);
-
-        return true;
-    }
-
-    /**
-     * Step 2 of 3 of the refactoring:
-     * Check the conditions once the user filled values in the refactoring wizard,
-     * then prepare the changes to be applied.
-     * <p/>
-     * In this case, most of the sanity checks are done by the wizard so essentially this
-     * should only be called if the wizard positively validated the user input.
-     *
-     * Here we do check that the target resource XML file either does not exists or
-     * is not read-only.
-     *
-     * @see org.eclipse.ltk.core.refactoring.Refactoring#checkFinalConditions(IProgressMonitor)
-     *
-     * @throws CoreException
-     */
-    @Override
-    public RefactoringStatus checkFinalConditions(IProgressMonitor monitor)
-            throws CoreException, OperationCanceledException {
-        RefactoringStatus status = new RefactoringStatus();
-
-        try {
-            monitor.beginTask("Checking post-conditions...", 5);
-
-            if (mXmlStringId == null || mXmlStringId.length() <= 0) {
-                // this is not supposed to happen
-                status.addFatalError("Missing replacement string ID");
-            } else if (mTargetXmlFileWsPath == null || mTargetXmlFileWsPath.length() <= 0) {
-                // this is not supposed to happen
-                status.addFatalError("Missing target xml file path");
-            }
-            monitor.worked(1);
-
-            // Either that resource must not exist or it must be a writable file.
-            IResource targetXml = getTargetXmlResource(mTargetXmlFileWsPath);
-            if (targetXml != null) {
-                if (targetXml.getType() != IResource.FILE) {
-                    status.addFatalError(
-                            String.format("XML file '%1$s' is not a file.", mTargetXmlFileWsPath));
-                } else {
-                    ResourceAttributes attr = targetXml.getResourceAttributes();
-                    if (attr != null && attr.isReadOnly()) {
-                        status.addFatalError(
-                                String.format("XML file '%1$s' is read-only.",
-                                        mTargetXmlFileWsPath));
-                    }
-                }
-            }
-            monitor.worked(1);
-
-            if (status.hasError()) {
-                return status;
-            }
-
-            mChanges = new ArrayList<Change>();
-
-
-            // Prepare the change to create/edit the String ID in the res/values XML file.
-            if (!mXmlStringValue.equals(
-                    mXmlHelper.valueOfStringId(mProject, mTargetXmlFileWsPath, mXmlStringId))) {
-                // We actually change it only if the ID doesn't exist yet or has a different value
-                Change change = createXmlChanges((IFile) targetXml, mXmlStringId, mXmlStringValue,
-                        status, SubMonitor.convert(monitor, 1));
-                if (change != null) {
-                    mChanges.add(change);
-                }
-            }
-
-            if (status.hasError()) {
-                return status;
-            }
-
-            if (mMode == Mode.EDIT_SOURCE) {
-                List<Change> changes = null;
-                if (mXmlAttributeName != null) {
-                    // Prepare the change to the Android resource XML file
-                    changes = computeXmlSourceChanges(mFile,
-                            mXmlStringId,
-                            mTokenString,
-                            mXmlAttributeName,
-                            true, // allConfigurations
-                            status,
-                            monitor);
-
-                } else if (mUnit != null) {
-                    // Prepare the change to the Java compilation unit
-                    changes = computeJavaChanges(mUnit, mXmlStringId, mTokenString,
-                            status, SubMonitor.convert(monitor, 1));
-                }
-                if (changes != null) {
-                    mChanges.addAll(changes);
-                }
-            }
-
-            if (mReplaceAllJava) {
-                String currentIdentifier = mUnit != null ? mUnit.getHandleIdentifier() : ""; //$NON-NLS-1$
-
-                SubMonitor submon = SubMonitor.convert(monitor, 1);
-                for (ICompilationUnit unit : findAllJavaUnits()) {
-                    // Only process Java compilation units that exist, are not derived
-                    // and are not read-only.
-                    if (unit == null || !unit.exists()) {
-                        continue;
-                    }
-                    IResource resource = unit.getResource();
-                    if (resource == null || resource.isDerived()) {
-                        continue;
-                    }
-
-                    // Ensure that we don't process the current compilation unit (processed
-                    // as mUnit above) twice
-                    if (currentIdentifier.equals(unit.getHandleIdentifier())) {
-                        continue;
-                    }
-
-                    ResourceAttributes attrs = resource.getResourceAttributes();
-                    if (attrs != null && attrs.isReadOnly()) {
-                        continue;
-                    }
-
-                    List<Change> changes = computeJavaChanges(
-                            unit, mXmlStringId, mTokenString,
-                            status, SubMonitor.convert(submon, 1));
-                    if (changes != null) {
-                        mChanges.addAll(changes);
-                    }
-                }
-            }
-
-            if (mReplaceAllXml) {
-                SubMonitor submon = SubMonitor.convert(monitor, 1);
-                for (IFile xmlFile : findAllResXmlFiles()) {
-                    if (xmlFile != null) {
-                        List<Change> changes = computeXmlSourceChanges(xmlFile,
-                                mXmlStringId,
-                                mTokenString,
-                                mXmlAttributeName,
-                                false, // allConfigurations
-                                status,
-                                SubMonitor.convert(submon, 1));
-                        if (changes != null) {
-                            mChanges.addAll(changes);
-                        }
-                    }
-                }
-            }
-
-            monitor.worked(1);
-        } finally {
-            monitor.done();
-        }
-
-        return status;
-    }
-
-    // --- XML changes ---
-
-    /**
-     * Returns a foreach-compatible iterator over all XML files in the project's
-     * /res folder, excluding the target XML file (the one where we'll write/edit
-     * the string id).
-     */
-    private Iterable<IFile> findAllResXmlFiles() {
-        return new Iterable<IFile>() {
-            @Override
-            public Iterator<IFile> iterator() {
-                return new Iterator<IFile>() {
-                    final Queue<IFile> mFiles = new LinkedList<IFile>();
-                    final Queue<IResource> mFolders = new LinkedList<IResource>();
-                    IPath mFilterPath1 = null;
-                    IPath mFilterPath2 = null;
-                    {
-                        // Filter out the XML file where we'll be writing the XML string id.
-                        IResource filterRes = mProject.findMember(mTargetXmlFileWsPath);
-                        if (filterRes != null) {
-                            mFilterPath1 = filterRes.getFullPath();
-                        }
-                        // Filter out the XML source file, if any (e.g. typically a layout)
-                        if (mFile != null) {
-                            mFilterPath2 = mFile.getFullPath();
-                        }
-
-                        // We want to process the manifest
-                        IResource man = mProject.findMember("AndroidManifest.xml"); // TODO find a constant
-                        if (man.exists() && man instanceof IFile && !man.equals(mFile)) {
-                            mFiles.add((IFile) man);
-                        }
-
-                        // Add all /res folders (technically we don't need to process /res/values
-                        // XML files that contain resources/string elements, but it's easier to
-                        // not filter them out.)
-                        IFolder f = mProject.getFolder(AdtConstants.WS_RESOURCES);
-                        if (f.exists()) {
-                            try {
-                                mFolders.addAll(
-                                        Arrays.asList(f.members(IContainer.EXCLUDE_DERIVED)));
-                            } catch (CoreException e) {
-                                // pass
-                            }
-                        }
-                    }
-
-                    @Override
-                    public boolean hasNext() {
-                        if (!mFiles.isEmpty()) {
-                            return true;
-                        }
-
-                        while (!mFolders.isEmpty()) {
-                            IResource res = mFolders.poll();
-                            if (res.exists() && res instanceof IFolder) {
-                                IFolder f = (IFolder) res;
-                                try {
-                                    getFileList(f);
-                                    if (!mFiles.isEmpty()) {
-                                        return true;
-                                    }
-                                } catch (CoreException e) {
-                                    // pass
-                                }
-                            }
-                        }
-                        return false;
-                    }
-
-                    private void getFileList(IFolder folder) throws CoreException {
-                        for (IResource res : folder.members(IContainer.EXCLUDE_DERIVED)) {
-                            // Only accept file resources which are not derived and actually exist
-                            if (res.exists() && !res.isDerived() && res instanceof IFile) {
-                                IFile file = (IFile) res;
-                                // Must have an XML extension
-                                if (SdkConstants.EXT_XML.equals(file.getFileExtension())) {
-                                    IPath p = file.getFullPath();
-                                    // And not be either paths we want to filter out
-                                    if ((mFilterPath1 != null && mFilterPath1.equals(p)) ||
-                                            (mFilterPath2 != null && mFilterPath2.equals(p))) {
-                                        continue;
-                                    }
-                                    mFiles.add(file);
-                                }
-                            }
-                        }
-                    }
-
-                    @Override
-                    public IFile next() {
-                        IFile file = mFiles.poll();
-                        hasNext();
-                        return file;
-                    }
-
-                    @Override
-                    public void remove() {
-                        throw new UnsupportedOperationException(
-                            "This iterator does not support removal");  //$NON-NLS-1$
-                    }
-                };
-            }
-        };
-    }
-
-    /**
-     * Internal helper that actually prepares the {@link Change} that adds the given
-     * ID to the given XML File.
-     * <p/>
-     * This does not actually modify the file.
-     *
-     * @param targetXml The file resource to modify.
-     * @param xmlStringId The new ID to insert.
-     * @param tokenString The old string, which will be the value in the XML string.
-     * @return A new {@link TextEdit} that describes how to change the file.
-     */
-    private Change createXmlChanges(IFile targetXml,
-            String xmlStringId,
-            String tokenString,
-            RefactoringStatus status,
-            SubMonitor monitor) {
-
-        TextFileChange xmlChange = new TextFileChange(getName(), targetXml);
-        xmlChange.setTextType(SdkConstants.EXT_XML);
-
-        String error = "";                  //$NON-NLS-1$
-        TextEdit edit = null;
-        TextEditGroup editGroup = null;
-
-        try {
-            if (!targetXml.exists()) {
-                // Kludge: use targetXml==null as a signal this is a new file being created
-                targetXml = null;
-            }
-
-            edit = createXmlReplaceEdit(targetXml, xmlStringId, tokenString, status,
-                    SubMonitor.convert(monitor, 1));
-        } catch (IOException e) {
-            error = e.toString();
-        } catch (CoreException e) {
-            // Failed to read file. Ignore. Will handle error below.
-            error = e.toString();
-        }
-
-        if (edit == null) {
-            status.addFatalError(String.format("Failed to modify file %1$s%2$s",
-                    targetXml == null ? "" : targetXml.getFullPath(),   //$NON-NLS-1$
-                    error == null ? "" : ": " + error));                //$NON-NLS-1$
-            return null;
-        }
-
-        editGroup = new TextEditGroup(targetXml == null ? "Create <string> in new XML file"
-                                                        : "Insert <string> in XML file",
-                                      edit);
-
-        xmlChange.setEdit(edit);
-        // The TextEditChangeGroup let the user toggle this change on and off later.
-        xmlChange.addTextEditChangeGroup(new TextEditChangeGroup(xmlChange, editGroup));
-
-        monitor.worked(1);
-        return xmlChange;
-    }
-
-    /**
-     * Scan the XML file to find the best place where to insert the new string element.
-     * <p/>
-     * This handles a variety of cases, including replacing existing ids in place,
-     * adding the top resources element if missing and the XML PI if not present.
-     * It tries to preserve indentation when adding new elements at the end of an existing XML.
-     *
-     * @param file The XML file to modify, that must be present in the workspace.
-     *             Pass null to create a change for a new file that doesn't exist yet.
-     * @param xmlStringId The new ID to insert.
-     * @param tokenString The old string, which will be the value in the XML string.
-     * @param status The in-out refactoring status. Used to log a more detailed error if the
-     *          XML has a top element that is not a resources element.
-     * @param monitor A monitor to track progress.
-     * @return A new {@link TextEdit} for either a replace or an insert operation, or null in case
-     *          of error.
-     * @throws CoreException - if the file's contents or description can not be read.
-     * @throws IOException   - if the file's contents can not be read or its detected encoding does
-     *                         not support its contents.
-     */
-    private TextEdit createXmlReplaceEdit(IFile file,
-            String xmlStringId,
-            String tokenString,
-            RefactoringStatus status,
-            SubMonitor monitor)
-                throws IOException, CoreException {
-
-        IModelManager modelMan = StructuredModelManager.getModelManager();
-
-        final String NODE_RESOURCES = SdkConstants.TAG_RESOURCES;
-        final String NODE_STRING = SdkConstants.TAG_STRING;
-        final String ATTR_NAME = SdkConstants.ATTR_NAME;
-
-
-        // Scan the source to find the best insertion point.
-
-        // 1- The most common case we need to handle is the one of inserting at the end
-        //    of a valid XML document, respecting the whitespace last used.
-        //
-        // Ideally we have this structure:
-        // <xml ...>
-        // <resource>
-        // ...ws1...<string>blah</string>...ws2...
-        // </resource>
-        //
-        // where ws1 and ws2 are the whitespace respectively before and after the last element
-        // just before the closing </resource>.
-        // In this case we want to generate the new string just before ws2...</resource> with
-        // the same whitespace as ws1.
-        //
-        // 2- Another expected case is there's already an existing string which "name" attribute
-        //    equals to xmlStringId and we just want to replace its value.
-        //
-        // Other cases we need to handle:
-        // 3- There is no element at all -> create a full new <resource>+<string> content.
-        // 4- There is <resource/>, that is the tag is not opened. This can be handled as the
-        //    previous case, generating full content but also replacing <resource/>.
-        // 5- There is a top element that is not <resource>. That's a fatal error and we abort.
-
-        IStructuredModel smodel = null;
-
-        // Single and double quotes must be escaped in the <string>value</string> declaration
-        tokenString = ValueXmlHelper.escapeResourceString(tokenString);
-
-        try {
-            IStructuredDocument sdoc = null;
-            boolean checkTopElement = true;
-            boolean replaceStringContent = false;
-            boolean hasPiXml = false;
-            int newResStart = 0;
-            int newResLength = 0;
-            String lineSep = "\n";                  //$NON-NLS-1$
-
-            if (file != null) {
-                smodel = modelMan.getExistingModelForRead(file);
-                if (smodel != null) {
-                    sdoc = smodel.getStructuredDocument();
-                } else if (smodel == null) {
-                    // The model is not currently open.
-                    if (file.exists()) {
-                        sdoc = modelMan.createStructuredDocumentFor(file);
-                    } else {
-                        sdoc = modelMan.createNewStructuredDocumentFor(file);
-                    }
-                }
-            }
-
-            if (sdoc == null && file != null) {
-                // Get a document matching the actual saved file
-                sdoc = modelMan.createStructuredDocumentFor(file);
-            }
-
-            if (sdoc != null) {
-                String wsBefore = "";   //$NON-NLS-1$
-                String lastWs = null;
-
-                lineSep = sdoc.getLineDelimiter();
-                if (lineSep == null || lineSep.length() == 0) {
-                    // That wasn't too useful, let's go back to a reasonable default
-                    lineSep = "\n"; //$NON-NLS-1$
-                }
-
-                for (IStructuredDocumentRegion regions : sdoc.getStructuredDocumentRegions()) {
-                    String type = regions.getType();
-
-                    if (DOMRegionContext.XML_CONTENT.equals(type)) {
-
-                        if (replaceStringContent) {
-                            // Generate a replacement for a <string> value matching the string ID.
-                            return new ReplaceEdit(
-                                    regions.getStartOffset(), regions.getLength(), tokenString);
-                        }
-
-                        // Otherwise capture what should be whitespace content
-                        lastWs = regions.getFullText();
-                        continue;
-
-                    } else if (DOMRegionContext.XML_PI_OPEN.equals(type) && !hasPiXml) {
-
-                        int nb = regions.getNumberOfRegions();
-                        ITextRegionList list = regions.getRegions();
-                        for (int i = 0; i < nb; i++) {
-                            ITextRegion region = list.get(i);
-                            type = region.getType();
-                            if (DOMRegionContext.XML_TAG_NAME.equals(type)) {
-                                String name = regions.getText(region);
-                                if ("xml".equals(name)) {   //$NON-NLS-1$
-                                    hasPiXml = true;
-                                    break;
-                                }
-                            }
-                        }
-                        continue;
-
-                    } else if (!DOMRegionContext.XML_TAG_NAME.equals(type)) {
-                        // ignore things which are not a tag nor text content (such as comments)
-                        continue;
-                    }
-
-                    int nb = regions.getNumberOfRegions();
-                    ITextRegionList list = regions.getRegions();
-
-                    String name = null;
-                    String attrName = null;
-                    String attrValue = null;
-                    boolean isEmptyTag = false;
-                    boolean isCloseTag = false;
-
-                    for (int i = 0; i < nb; i++) {
-                        ITextRegion region = list.get(i);
-                        type = region.getType();
-
-                        if (DOMRegionContext.XML_END_TAG_OPEN.equals(type)) {
-                            isCloseTag = true;
-                        } else if (DOMRegionContext.XML_EMPTY_TAG_CLOSE.equals(type)) {
-                            isEmptyTag = true;
-                        } else if (DOMRegionContext.XML_TAG_NAME.equals(type)) {
-                            name = regions.getText(region);
-                        } else if (DOMRegionContext.XML_TAG_ATTRIBUTE_NAME.equals(type) &&
-                                NODE_STRING.equals(name)) {
-                            // Record the attribute names into a <string> element.
-                            attrName = regions.getText(region);
-                        } else if (DOMRegionContext.XML_TAG_ATTRIBUTE_VALUE.equals(type) &&
-                                ATTR_NAME.equals(attrName)) {
-                            // Record the value of a <string name=...> attribute
-                            attrValue = regions.getText(region);
-
-                            if (attrValue != null &&
-                                    unquoteAttrValue(attrValue).equals(xmlStringId)) {
-                                // We found a <string name=> matching the string ID to replace.
-                                // We'll generate a replacement when we process the string value
-                                // (that is the next XML_CONTENT region.)
-                                replaceStringContent = true;
-                            }
-                        }
-                    }
-
-                    if (checkTopElement) {
-                        // Check the top element has a resource name
-                        checkTopElement = false;
-                        if (!NODE_RESOURCES.equals(name)) {
-                            status.addFatalError(
-                                    String.format("XML file lacks a <resource> tag: %1$s",
-                                            mTargetXmlFileWsPath));
-                            return null;
-
-                        }
-
-                        if (isEmptyTag) {
-                            // The top element is an empty "<resource/>" tag. We need to do
-                            // a full new resource+string replacement.
-                            newResStart = regions.getStartOffset();
-                            newResLength = regions.getLength();
-                        }
-                    }
-
-                    if (NODE_RESOURCES.equals(name)) {
-                        if (isCloseTag) {
-                            // We found the </resource> tag and we want
-                            // to insert just before this one.
-
-                            StringBuilder content = new StringBuilder();
-                            content.append(wsBefore)
-                                   .append("<string name=\"")                   //$NON-NLS-1$
-                                   .append(xmlStringId)
-                                   .append("\">")                               //$NON-NLS-1$
-                                   .append(tokenString)
-                                   .append("</string>");                        //$NON-NLS-1$
-
-                            // Backup to insert before the whitespace preceding </resource>
-                            IStructuredDocumentRegion insertBeforeReg = regions;
-                            while (true) {
-                                IStructuredDocumentRegion previous = insertBeforeReg.getPrevious();
-                                if (previous != null &&
-                                        DOMRegionContext.XML_CONTENT.equals(previous.getType()) &&
-                                        previous.getText().trim().length() == 0) {
-                                    insertBeforeReg = previous;
-                                } else {
-                                    break;
-                                }
-                            }
-                            if (insertBeforeReg == regions) {
-                                // If we have not found any whitespace before </resources>,
-                                // at least add a line separator.
-                                content.append(lineSep);
-                            }
-
-                            return new InsertEdit(insertBeforeReg.getStartOffset(),
-                                                  content.toString());
-                        }
-                    } else {
-                        // For any other tag than <resource>, capture whitespace before and after.
-                        if (!isCloseTag) {
-                            wsBefore = lastWs;
-                        }
-                    }
-                }
-            }
-
-            // We reach here either because there's no XML content at all or because
-            // there's an empty <resource/>.
-            // Provide a full new resource+string replacement.
-            StringBuilder content = new StringBuilder();
-            if (!hasPiXml) {
-                content.append("<?xml version=\"1.0\" encoding=\"utf-8\"?>"); //$NON-NLS-1$
-                content.append(lineSep);
-            } else if (newResLength == 0 && sdoc != null) {
-                // If inserting at the end, check if the last region is some whitespace.
-                // If there's no newline, insert one ourselves.
-                IStructuredDocumentRegion lastReg = sdoc.getLastStructuredDocumentRegion();
-                if (lastReg != null && lastReg.getText().indexOf('\n') == -1) {
-                    content.append('\n');
-                }
-            }
-
-            // FIXME how to access formatting preferences to generate the proper indentation?
-            content.append("<resources>").append(lineSep);                  //$NON-NLS-1$
-            content.append("    <string name=\"")                           //$NON-NLS-1$
-                   .append(xmlStringId)
-                   .append("\">")                                           //$NON-NLS-1$
-                   .append(tokenString)
-                   .append("</string>")                                     //$NON-NLS-1$
-                   .append(lineSep);
-            content.append("</resources>").append(lineSep);                 //$NON-NLS-1$
-
-            if (newResLength > 0) {
-                // Replace existing piece
-                return new ReplaceEdit(newResStart, newResLength, content.toString());
-            } else {
-                // Insert at the end.
-                int offset = sdoc == null ? 0 : sdoc.getLength();
-                return new InsertEdit(offset, content.toString());
-            }
-        } catch (IOException e) {
-            // This is expected to happen and is properly reported to the UI.
-            throw e;
-        } catch (CoreException e) {
-            // This is expected to happen and is properly reported to the UI.
-            throw e;
-        } catch (Throwable t) {
-            // Since we use some internal APIs, use a broad catch-all to report any
-            // unexpected issue rather than crash the whole refactoring.
-            status.addFatalError(
-                    String.format("XML replace error: %1$s", t.getMessage()));
-        } finally {
-            if (smodel != null) {
-                smodel.releaseFromRead();
-            }
-        }
-
-        return null;
-    }
-
-    /**
-     * Computes the changes to be made to the source Android XML file and
-     * returns a list of {@link Change}.
-     * <p/>
-     * This function scans an XML file, looking for an attribute value equals to
-     * <code>tokenString</code>. If non null, <code>xmlAttrName</code> limit the search
-     * to only attributes that have that name.
-     * If found, a change is made to replace each occurrence of <code>tokenString</code>
-     * by a new "@string/..." using the new <code>xmlStringId</code>.
-     *
-     * @param sourceFile The file to process.
-     *          A status error will be generated if it does not exists.
-     *          Must not be null.
-     * @param tokenString The string to find. Must not be null or empty.
-     * @param xmlAttrName Optional attribute name to limit the search. Can be null.
-     * @param allConfigurations True if this function should can all XML files with the same
-     *          name and the same resource type folder but with different configurations.
-     * @param status Status used to report fatal errors.
-     * @param monitor Used to log progress.
-     */
-    private List<Change> computeXmlSourceChanges(IFile sourceFile,
-            String xmlStringId,
-            String tokenString,
-            String xmlAttrName,
-            boolean allConfigurations,
-            RefactoringStatus status,
-            IProgressMonitor monitor) {
-
-        if (!sourceFile.exists()) {
-            status.addFatalError(String.format("XML file '%1$s' does not exist.",
-                    sourceFile.getFullPath().toOSString()));
-            return null;
-        }
-
-        // We shouldn't be trying to replace a null or empty string.
-        assert tokenString != null && tokenString.length() > 0;
-        if (tokenString == null || tokenString.length() == 0) {
-            return null;
-        }
-
-        // Note: initially this method was only processing files using a pattern
-        //   /project/res/<type>-<configuration>/<filename.xml>
-        // However the last version made that more generic to be able to process any XML
-        // files. We should probably revisit and simplify this later.
-        HashSet<IFile> files = new HashSet<IFile>();
-        files.add(sourceFile);
-
-        if (allConfigurations && SdkConstants.EXT_XML.equals(sourceFile.getFileExtension())) {
-            IPath path = sourceFile.getFullPath();
-            if (path.segmentCount() == 4 && path.segment(1).equals(SdkConstants.FD_RESOURCES)) {
-                IProject project = sourceFile.getProject();
-                String filename = path.segment(3);
-                String initialTypeName = path.segment(2);
-                ResourceFolderType type = ResourceFolderType.getFolderType(initialTypeName);
-
-                IContainer res = sourceFile.getParent().getParent();
-                if (type != null && res != null && res.getType() == IResource.FOLDER) {
-                    try {
-                        for (IResource r : res.members()) {
-                            if (r != null && r.getType() == IResource.FOLDER) {
-                                String name = r.getName();
-                                // Skip the initial folder name, it's already in the list.
-                                if (!name.equals(initialTypeName)) {
-                                    // Only accept the same folder type (e.g. layout-*)
-                                    ResourceFolderType t =
-                                        ResourceFolderType.getFolderType(name);
-                                    if (type.equals(t)) {
-                                        // recompute the path
-                                        IPath p = res.getProjectRelativePath().append(name).
-                                                                               append(filename);
-                                        IResource f = project.findMember(p);
-                                        if (f != null && f instanceof IFile) {
-                                            files.add((IFile) f);
-                                        }
-                                    }
-                                }
-                            }
-                        }
-                    } catch (CoreException e) {
-                        // Ignore.
-                    }
-                }
-            }
-        }
-
-        SubMonitor subMonitor = SubMonitor.convert(monitor, Math.min(1, files.size()));
-
-        ArrayList<Change> changes = new ArrayList<Change>();
-
-        // Portability note: getModelManager is part of wst.sse.core however the
-        // interface returned is part of wst.sse.core.internal.provisional so we can
-        // expect it to change in a distant future if they start cleaning their codebase,
-        // however unlikely that is.
-        IModelManager modelManager = StructuredModelManager.getModelManager();
-
-        for (IFile file : files) {
-
-            IStructuredModel smodel = null;
-            MultiTextEdit multiEdit = null;
-            TextFileChange xmlChange = null;
-            ArrayList<TextEditGroup> editGroups = null;
-
-            try {
-                IStructuredDocument sdoc = null;
-
-                smodel = modelManager.getExistingModelForRead(file);
-                if (smodel != null) {
-                    sdoc = smodel.getStructuredDocument();
-                } else if (smodel == null) {
-                    // The model is not currently open.
-                    if (file.exists()) {
-                        sdoc = modelManager.createStructuredDocumentFor(file);
-                    } else {
-                        sdoc = modelManager.createNewStructuredDocumentFor(file);
-                    }
-                }
-
-                if (sdoc == null) {
-                    status.addFatalError("XML structured document not found");     //$NON-NLS-1$
-                    continue;
-                }
-
-                multiEdit = new MultiTextEdit();
-                editGroups = new ArrayList<TextEditGroup>();
-                xmlChange = new TextFileChange(getName(), file);
-                xmlChange.setTextType("xml");   //$NON-NLS-1$
-
-                String quotedReplacement = quotedAttrValue(STRING_PREFIX + xmlStringId);
-
-                // Prepare the change set
-                for (IStructuredDocumentRegion regions : sdoc.getStructuredDocumentRegions()) {
-                    // Only look at XML "top regions"
-                    if (!DOMRegionContext.XML_TAG_NAME.equals(regions.getType())) {
-                        continue;
-                    }
-
-                    int nb = regions.getNumberOfRegions();
-                    ITextRegionList list = regions.getRegions();
-                    String lastAttrName = null;
-
-                    for (int i = 0; i < nb; i++) {
-                        ITextRegion subRegion = list.get(i);
-                        String type = subRegion.getType();
-
-                        if (DOMRegionContext.XML_TAG_ATTRIBUTE_NAME.equals(type)) {
-                            // Memorize the last attribute name seen
-                            lastAttrName = regions.getText(subRegion);
-
-                        } else if (DOMRegionContext.XML_TAG_ATTRIBUTE_VALUE.equals(type)) {
-                            // Check this is the attribute and the original string
-                            String text = regions.getText(subRegion);
-
-                            // Remove " or ' quoting present in the attribute value
-                            text = unquoteAttrValue(text);
-
-                            if (tokenString.equals(text) &&
-                                    (xmlAttrName == null || xmlAttrName.equals(lastAttrName))) {
-
-                                // Found an occurrence. Create a change for it.
-                                TextEdit edit = new ReplaceEdit(
-                                        regions.getStartOffset() + subRegion.getStart(),
-                                        subRegion.getTextLength(),
-                                        quotedReplacement);
-                                TextEditGroup editGroup = new TextEditGroup(
-                                        "Replace attribute string by ID",
-                                        edit);
-
-                                multiEdit.addChild(edit);
-                                editGroups.add(editGroup);
-                            }
-                        }
-                    }
-                }
-            } catch (Throwable t) {
-                // Since we use some internal APIs, use a broad catch-all to report any
-                // unexpected issue rather than crash the whole refactoring.
-                status.addFatalError(
-                        String.format("XML refactoring error: %1$s", t.getMessage()));
-            } finally {
-                if (smodel != null) {
-                    smodel.releaseFromRead();
-                }
-
-                if (multiEdit != null &&
-                        xmlChange != null &&
-                        editGroups != null &&
-                        multiEdit.hasChildren()) {
-                    xmlChange.setEdit(multiEdit);
-                    for (TextEditGroup group : editGroups) {
-                        xmlChange.addTextEditChangeGroup(
-                                new TextEditChangeGroup(xmlChange, group));
-                    }
-                    changes.add(xmlChange);
-                }
-                subMonitor.worked(1);
-            }
-        } // for files
-
-        if (changes.size() > 0) {
-            return changes;
-        }
-        return null;
-    }
-
-    /**
-     * Returns a quoted attribute value suitable to be placed after an attributeName=
-     * statement in an XML stream.
-     *
-     * According to http://www.w3.org/TR/2008/REC-xml-20081126/#NT-AttValue
-     * the attribute value can be either quoted using ' or " and the corresponding
-     * entities &apos; or &quot; must be used inside.
-     */
-    private String quotedAttrValue(String attrValue) {
-        if (attrValue.indexOf('"') == -1) {
-            // no double-quotes inside, use double-quotes around.
-            return '"' + attrValue + '"';
-        }
-        if (attrValue.indexOf('\'') == -1) {
-            // no single-quotes inside, use single-quotes around.
-            return '\'' + attrValue + '\'';
-        }
-        // If we get here, there's a mix. Opt for double-quote around and replace
-        // inner double-quotes.
-        attrValue = attrValue.replace("\"", QUOT_ENTITY);  //$NON-NLS-1$
-        return '"' + attrValue + '"';
-    }
-
-    // --- Java changes ---
-
-    /**
-     * Returns a foreach compatible iterator over all ICompilationUnit in the project.
-     */
-    private Iterable<ICompilationUnit> findAllJavaUnits() {
-        final IJavaProject javaProject = JavaCore.create(mProject);
-
-        return new Iterable<ICompilationUnit>() {
-            @Override
-            public Iterator<ICompilationUnit> iterator() {
-                return new Iterator<ICompilationUnit>() {
-                    final Queue<ICompilationUnit> mUnits = new LinkedList<ICompilationUnit>();
-                    final Queue<IPackageFragment> mFragments = new LinkedList<IPackageFragment>();
-                    {
-                        try {
-                            IPackageFragment[] tmpFrags = javaProject.getPackageFragments();
-                            if (tmpFrags != null && tmpFrags.length > 0) {
-                                mFragments.addAll(Arrays.asList(tmpFrags));
-                            }
-                        } catch (JavaModelException e) {
-                            // pass
-                        }
-                    }
-
-                    @Override
-                    public boolean hasNext() {
-                        if (!mUnits.isEmpty()) {
-                            return true;
-                        }
-
-                        while (!mFragments.isEmpty()) {
-                            try {
-                                IPackageFragment fragment = mFragments.poll();
-                                if (fragment.getKind() == IPackageFragmentRoot.K_SOURCE) {
-                                    ICompilationUnit[] tmpUnits = fragment.getCompilationUnits();
-                                    if (tmpUnits != null && tmpUnits.length > 0) {
-                                        mUnits.addAll(Arrays.asList(tmpUnits));
-                                        return true;
-                                    }
-                                }
-                            } catch (JavaModelException e) {
-                                // pass
-                            }
-                        }
-                        return false;
-                    }
-
-                    @Override
-                    public ICompilationUnit next() {
-                        ICompilationUnit unit = mUnits.poll();
-                        hasNext();
-                        return unit;
-                    }
-
-                    @Override
-                    public void remove() {
-                        throw new UnsupportedOperationException(
-                                "This iterator does not support removal");  //$NON-NLS-1$
-                    }
-                };
-            }
-        };
-    }
-
-    /**
-     * Computes the changes to be made to Java file(s) and returns a list of {@link Change}.
-     * <p/>
-     * This function scans a Java compilation unit using {@link ReplaceStringsVisitor}, looking
-     * for a string literal equals to <code>tokenString</code>.
-     * If found, a change is made to replace each occurrence of <code>tokenString</code> by
-     * a piece of Java code that somehow accesses R.string.<code>xmlStringId</code>.
-     *
-     * @param unit The compilated unit to process. Must not be null.
-     * @param tokenString The string to find. Must not be null or empty.
-     * @param status Status used to report fatal errors.
-     * @param monitor Used to log progress.
-     */
-    private List<Change> computeJavaChanges(ICompilationUnit unit,
-            String xmlStringId,
-            String tokenString,
-            RefactoringStatus status,
-            SubMonitor monitor) {
-
-        // We shouldn't be trying to replace a null or empty string.
-        assert tokenString != null && tokenString.length() > 0;
-        if (tokenString == null || tokenString.length() == 0) {
-            return null;
-        }
-
-        // Get the Android package name from the Android Manifest. We need it to create
-        // the FQCN of the R class.
-        String packageName = null;
-        String error = null;
-        IResource manifestFile = mProject.findMember(SdkConstants.FN_ANDROID_MANIFEST_XML);
-        if (manifestFile == null || manifestFile.getType() != IResource.FILE) {
-            error = "File not found";
-        } else {
-            ManifestData manifestData = AndroidManifestHelper.parseForData((IFile) manifestFile);
-            if (manifestData == null) {
-                error = "Invalid content";
-            } else {
-                packageName = manifestData.getPackage();
-                if (packageName == null) {
-                    error = "Missing package definition";
-                }
-            }
-        }
-
-        if (error != null) {
-            status.addFatalError(
-                    String.format("Failed to parse file %1$s: %2$s.",
-                            manifestFile == null ? "" : manifestFile.getFullPath(),  //$NON-NLS-1$
-                            error));
-            return null;
-        }
-
-        // Right now the changes array will contain one TextFileChange at most.
-        ArrayList<Change> changes = new ArrayList<Change>();
-
-        // This is the unit that will be modified.
-        TextFileChange change = new TextFileChange(getName(), (IFile) unit.getResource());
-        change.setTextType("java"); //$NON-NLS-1$
-
-        // Create an AST for this compilation unit
-        ASTParser parser = ASTParser.newParser(AST.JLS3);
-        parser.setProject(unit.getJavaProject());
-        parser.setSource(unit);
-        parser.setResolveBindings(true);
-        ASTNode node = parser.createAST(monitor.newChild(1));
-
-        // The ASTNode must be a CompilationUnit, by design
-        if (!(node instanceof CompilationUnit)) {
-            status.addFatalError(String.format("Internal error: ASTNode class %s",  //$NON-NLS-1$
-                    node.getClass()));
-            return null;
-        }
-
-        // ImportRewrite will allow us to add the new type to the imports and will resolve
-        // what the Java source must reference, e.g. the FQCN or just the simple name.
-        ImportRewrite importRewrite = ImportRewrite.create((CompilationUnit) node, true);
-        String Rqualifier = packageName + ".R"; //$NON-NLS-1$
-        Rqualifier = importRewrite.addImport(Rqualifier);
-
-        // Rewrite the AST itself via an ASTVisitor
-        AST ast = node.getAST();
-        ASTRewrite astRewrite = ASTRewrite.create(ast);
-        ArrayList<TextEditGroup> astEditGroups = new ArrayList<TextEditGroup>();
-        ReplaceStringsVisitor visitor = new ReplaceStringsVisitor(
-                ast, astRewrite, astEditGroups,
-                tokenString, Rqualifier, xmlStringId);
-        node.accept(visitor);
-
-        // Finally prepare the change set
-        try {
-            MultiTextEdit edit = new MultiTextEdit();
-
-            // Create the edit to change the imports, only if anything changed
-            TextEdit subEdit = importRewrite.rewriteImports(monitor.newChild(1));
-            if (subEdit.hasChildren()) {
-                edit.addChild(subEdit);
-            }
-
-            // Create the edit to change the Java source, only if anything changed
-            subEdit = astRewrite.rewriteAST();
-            if (subEdit.hasChildren()) {
-                edit.addChild(subEdit);
-            }
-
-            // Only create a change set if any edit was collected
-            if (edit.hasChildren()) {
-                change.setEdit(edit);
-
-                // Create TextEditChangeGroups which let the user turn changes on or off
-                // individually. This must be done after the change.setEdit() call above.
-                for (TextEditGroup editGroup : astEditGroups) {
-                    TextEditChangeGroup group = new TextEditChangeGroup(change, editGroup);
-                    if (editGroup instanceof EnabledTextEditGroup) {
-                        group.setEnabled(((EnabledTextEditGroup) editGroup).isEnabled());
-                    }
-                    change.addTextEditChangeGroup(group);
-                }
-
-                changes.add(change);
-            }
-
-            monitor.worked(1);
-
-            if (changes.size() > 0) {
-                return changes;
-            }
-
-        } catch (CoreException e) {
-            // ImportRewrite.rewriteImports failed.
-            status.addFatalError(e.getMessage());
-        }
-        return null;
-    }
-
-    // ----
-
-    /**
-     * Step 3 of 3 of the refactoring: returns the {@link Change} that will be able to do the
-     * work and creates a descriptor that can be used to replay that refactoring later.
-     *
-     * @see org.eclipse.ltk.core.refactoring.Refactoring#createChange(org.eclipse.core.runtime.IProgressMonitor)
-     *
-     * @throws CoreException
-     */
-    @Override
-    public Change createChange(IProgressMonitor monitor)
-            throws CoreException, OperationCanceledException {
-
-        try {
-            monitor.beginTask("Applying changes...", 1);
-
-            CompositeChange change = new CompositeChange(
-                    getName(),
-                    mChanges.toArray(new Change[mChanges.size()])) {
-                @Override
-                public ChangeDescriptor getDescriptor() {
-
-                    String comment = String.format(
-                            "Extracts string '%1$s' into R.string.%2$s",
-                            mTokenString,
-                            mXmlStringId);
-
-                    ExtractStringDescriptor desc = new ExtractStringDescriptor(
-                            mProject.getName(), //project
-                            comment, //description
-                            comment, //comment
-                            createArgumentMap());
-
-                    return new RefactoringChangeDescriptor(desc);
-                }
-            };
-
-            monitor.worked(1);
-
-            return change;
-
-        } finally {
-            monitor.done();
-        }
-
-    }
-
-    /**
-     * Given a file project path, returns its resource in the same project than the
-     * compilation unit. The resource may not exist.
-     */
-    private IResource getTargetXmlResource(String xmlFileWsPath) {
-        IResource resource = mProject.getFile(xmlFileWsPath);
-        return resource;
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/refactorings/extractstring/ExtractStringWizard.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/refactorings/extractstring/ExtractStringWizard.java
deleted file mode 100644
index 556dff0..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/refactorings/extractstring/ExtractStringWizard.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Copyright (C) 2009 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.refactorings.extractstring;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.ltk.ui.refactoring.RefactoringWizard;
-
-/**
- * A wizard for ExtractString based on a simple dialog with one page.
- * 
- * @see ExtractStringInputPage
- * @see ExtractStringRefactoring
- */
-public class ExtractStringWizard extends RefactoringWizard {
-
-    private final IProject mProject;
-
-    /**
-     * Create a wizard for ExtractString based on a simple dialog with one page.
-     * 
-     * @param ref The instance of {@link ExtractStringRefactoring} to associate to the wizard.
-     * @param project The project where the wizard was invoked from (e.g. where the user selection
-     *                happened, so that we can retrieve project resources.)
-     */
-    public ExtractStringWizard(ExtractStringRefactoring ref, IProject project) {
-        super(ref, DIALOG_BASED_USER_INTERFACE | PREVIEW_EXPAND_FIRST_NODE);
-        mProject = project;
-        setDefaultPageTitle(ref.getName());
-    }
-
-    @Override
-    protected void addUserInputPages() {
-        addPage(new ExtractStringInputPage(mProject));
-    }
-
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/refactorings/extractstring/ReplaceStringsVisitor.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/refactorings/extractstring/ReplaceStringsVisitor.java
deleted file mode 100644
index e058ce1..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/refactorings/extractstring/ReplaceStringsVisitor.java
+++ /dev/null
@@ -1,480 +0,0 @@
-/*
- * Copyright (C) 2009 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.refactorings.extractstring;
-
-import org.eclipse.jdt.core.dom.AST;
-import org.eclipse.jdt.core.dom.ASTNode;
-import org.eclipse.jdt.core.dom.ASTVisitor;
-import org.eclipse.jdt.core.dom.Assignment;
-import org.eclipse.jdt.core.dom.ClassInstanceCreation;
-import org.eclipse.jdt.core.dom.Expression;
-import org.eclipse.jdt.core.dom.IMethodBinding;
-import org.eclipse.jdt.core.dom.ITypeBinding;
-import org.eclipse.jdt.core.dom.IVariableBinding;
-import org.eclipse.jdt.core.dom.MethodDeclaration;
-import org.eclipse.jdt.core.dom.MethodInvocation;
-import org.eclipse.jdt.core.dom.Modifier;
-import org.eclipse.jdt.core.dom.Name;
-import org.eclipse.jdt.core.dom.SimpleName;
-import org.eclipse.jdt.core.dom.SimpleType;
-import org.eclipse.jdt.core.dom.SingleVariableDeclaration;
-import org.eclipse.jdt.core.dom.StringLiteral;
-import org.eclipse.jdt.core.dom.Type;
-import org.eclipse.jdt.core.dom.TypeDeclaration;
-import org.eclipse.jdt.core.dom.VariableDeclarationExpression;
-import org.eclipse.jdt.core.dom.VariableDeclarationFragment;
-import org.eclipse.jdt.core.dom.VariableDeclarationStatement;
-import org.eclipse.jdt.core.dom.rewrite.ASTRewrite;
-import org.eclipse.text.edits.TextEditGroup;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.TreeMap;
-
-/**
- * Visitor used by {@link ExtractStringRefactoring} to extract a string from an existing
- * Java source and replace it by an Android XML string reference.
- *
- * @see ExtractStringRefactoring#computeJavaChanges
- */
-class ReplaceStringsVisitor extends ASTVisitor {
-
-    private static final String CLASS_ANDROID_CONTEXT    = "android.content.Context"; //$NON-NLS-1$
-    private static final String CLASS_JAVA_CHAR_SEQUENCE = "java.lang.CharSequence";  //$NON-NLS-1$
-    private static final String CLASS_JAVA_STRING        = "java.lang.String";        //$NON-NLS-1$
-
-
-    private final AST mAst;
-    private final ASTRewrite mRewriter;
-    private final String mOldString;
-    private final String mRQualifier;
-    private final String mXmlId;
-    private final ArrayList<TextEditGroup> mEditGroups;
-
-    public ReplaceStringsVisitor(AST ast,
-            ASTRewrite astRewrite,
-            ArrayList<TextEditGroup> editGroups,
-            String oldString,
-            String rQualifier,
-            String xmlId) {
-        mAst = ast;
-        mRewriter = astRewrite;
-        mEditGroups = editGroups;
-        mOldString = oldString;
-        mRQualifier = rQualifier;
-        mXmlId = xmlId;
-    }
-
-    @SuppressWarnings("unchecked")
-    @Override
-    public boolean visit(StringLiteral node) {
-        if (node.getLiteralValue().equals(mOldString)) {
-
-            // We want to analyze the calling context to understand whether we can
-            // just replace the string literal by the named int constant (R.id.foo)
-            // or if we should generate a Context.getString() call.
-            boolean useGetResource = false;
-            useGetResource = examineVariableDeclaration(node) ||
-                                examineMethodInvocation(node) ||
-                                examineAssignment(node);
-
-            Name qualifierName = mAst.newName(mRQualifier + ".string");     //$NON-NLS-1$
-            SimpleName idName = mAst.newSimpleName(mXmlId);
-            ASTNode newNode = mAst.newQualifiedName(qualifierName, idName);
-            boolean disabledChange = false;
-            String title = "Replace string by ID";
-
-            if (useGetResource) {
-                Expression context = methodHasContextArgument(node);
-                if (context == null && !isClassDerivedFromContext(node)) {
-                    // if we don't have a class that derives from Context and
-                    // we don't have a Context method argument, then try a bit harder:
-                    // can we find a method or a field that will give us a context?
-                    context = findContextFieldOrMethod(node);
-
-                    if (context == null) {
-                        // If not, let's  write Context.getString(), which is technically
-                        // invalid but makes it a good clue on how to fix it. Since these
-                        // will not compile, we create a disabled change by default.
-                        context = mAst.newSimpleName("Context");            //$NON-NLS-1$
-                        disabledChange = true;
-                    }
-                }
-
-                MethodInvocation mi2 = mAst.newMethodInvocation();
-                mi2.setName(mAst.newSimpleName("getString"));               //$NON-NLS-1$
-                mi2.setExpression(context);
-                mi2.arguments().add(newNode);
-
-                newNode = mi2;
-                title = "Replace string by Context.getString(R.string...)";
-            }
-
-            TextEditGroup editGroup = new EnabledTextEditGroup(title, !disabledChange);
-            mEditGroups.add(editGroup);
-            mRewriter.replace(node, newNode, editGroup);
-        }
-        return super.visit(node);
-    }
-
-    /**
-     * Examines if the StringLiteral is part of an assignment corresponding to the
-     * a string variable declaration, e.g. String foo = id.
-     *
-     * The parent fragment is of syntax "var = expr" or "var[] = expr".
-     * We want the type of the variable, which is either held by a
-     * VariableDeclarationStatement ("type [fragment]") or by a
-     * VariableDeclarationExpression. In either case, the type can be an array
-     * but for us all that matters is to know whether the type is an int or
-     * a string.
-     */
-    private boolean examineVariableDeclaration(StringLiteral node) {
-        VariableDeclarationFragment fragment = findParentClass(node,
-                VariableDeclarationFragment.class);
-
-        if (fragment != null) {
-            ASTNode parent = fragment.getParent();
-
-            Type type = null;
-            if (parent instanceof VariableDeclarationStatement) {
-                type = ((VariableDeclarationStatement) parent).getType();
-            } else if (parent instanceof VariableDeclarationExpression) {
-                type = ((VariableDeclarationExpression) parent).getType();
-            }
-
-            if (type instanceof SimpleType) {
-                return isJavaString(type.resolveBinding());
-            }
-        }
-
-        return false;
-    }
-
-    /**
-     * Examines if the StringLiteral is part of a assignment to a variable that
-     * is a string. We need to lookup the variable to find its type, either in the
-     * enclosing method or class type.
-     */
-    private boolean examineAssignment(StringLiteral node) {
-
-        Assignment assignment = findParentClass(node, Assignment.class);
-        if (assignment != null) {
-            Expression left = assignment.getLeftHandSide();
-
-            ITypeBinding typeBinding = left.resolveTypeBinding();
-            return isJavaString(typeBinding);
-        }
-
-        return false;
-    }
-
-    /**
-     * If the expression is part of a method invocation (aka a function call) or a
-     * class instance creation (aka a "new SomeClass" constructor call), we try to
-     * find the type of the argument being used. If it is a String (most likely), we
-     * want to return true (to generate a getString() call). However if there might
-     * be a similar method that takes an int, in which case we don't want to do that.
-     *
-     * This covers the case of Activity.setTitle(int resId) vs setTitle(String str).
-     */
-    @SuppressWarnings("rawtypes")
-    private boolean examineMethodInvocation(StringLiteral node) {
-
-        ASTNode parent = null;
-        List arguments = null;
-        IMethodBinding methodBinding = null;
-
-        MethodInvocation invoke = findParentClass(node, MethodInvocation.class);
-        if (invoke != null) {
-            parent = invoke;
-            arguments = invoke.arguments();
-            methodBinding = invoke.resolveMethodBinding();
-        } else {
-            ClassInstanceCreation newclass = findParentClass(node, ClassInstanceCreation.class);
-            if (newclass != null) {
-                parent = newclass;
-                arguments = newclass.arguments();
-                methodBinding = newclass.resolveConstructorBinding();
-            }
-        }
-
-        if (parent != null && arguments != null && methodBinding != null) {
-            // We want to know which argument this is.
-            // Walk up the hierarchy again to find the immediate child of the parent,
-            // which should turn out to be one of the invocation arguments.
-            ASTNode child = null;
-            for (ASTNode n = node; n != parent; ) {
-                ASTNode p = n.getParent();
-                if (p == parent) {
-                    child = n;
-                    break;
-                }
-                n = p;
-            }
-            if (child == null) {
-                // This can't happen: a parent of 'node' must be the child of 'parent'.
-                return false;
-            }
-
-            // Find the index
-            int index = 0;
-            for (Object arg : arguments) {
-                if (arg == child) {
-                    break;
-                }
-                index++;
-            }
-
-            if (index == arguments.size()) {
-                // This can't happen: one of the arguments of 'invoke' must be 'child'.
-                return false;
-            }
-
-            // Eventually we want to determine if the parameter is a string type,
-            // in which case a Context.getString() call must be generated.
-            boolean useStringType = false;
-
-            // Find the type of that argument
-            ITypeBinding[] types = methodBinding.getParameterTypes();
-            if (index < types.length) {
-                ITypeBinding type = types[index];
-                useStringType = isJavaString(type);
-            }
-
-            // Now that we know that this method takes a String parameter, can we find
-            // a variant that would accept an int for the same parameter position?
-            if (useStringType) {
-                String name = methodBinding.getName();
-                ITypeBinding clazz = methodBinding.getDeclaringClass();
-                nextMethod: for (IMethodBinding mb2 : clazz.getDeclaredMethods()) {
-                    if (methodBinding == mb2 || !mb2.getName().equals(name)) {
-                        continue;
-                    }
-                    // We found a method with the same name. We want the same parameters
-                    // except that the one at 'index' must be an int type.
-                    ITypeBinding[] types2 = mb2.getParameterTypes();
-                    int len2 = types2.length;
-                    if (types.length == len2) {
-                        for (int i = 0; i < len2; i++) {
-                            if (i == index) {
-                                ITypeBinding type2 = types2[i];
-                                if (!("int".equals(type2.getQualifiedName()))) {   //$NON-NLS-1$
-                                    // The argument at 'index' is not an int.
-                                    continue nextMethod;
-                                }
-                            } else if (!types[i].equals(types2[i])) {
-                                // One of the other arguments do not match our original method
-                                continue nextMethod;
-                            }
-                        }
-                        // If we got here, we found a perfect match: a method with the same
-                        // arguments except the one at 'index' is an int. In this case we
-                        // don't need to convert our R.id into a string.
-                        useStringType = false;
-                        break;
-                    }
-                }
-            }
-
-            return useStringType;
-        }
-        return false;
-    }
-
-    /**
-     * Examines if the StringLiteral is part of a method declaration (a.k.a. a function
-     * definition) which takes a Context argument.
-     * If such, it returns the name of the variable as a {@link SimpleName}.
-     * Otherwise it returns null.
-     */
-    private SimpleName methodHasContextArgument(StringLiteral node) {
-        MethodDeclaration decl = findParentClass(node, MethodDeclaration.class);
-        if (decl != null) {
-            for (Object obj : decl.parameters()) {
-                if (obj instanceof SingleVariableDeclaration) {
-                    SingleVariableDeclaration var = (SingleVariableDeclaration) obj;
-                    if (isAndroidContext(var.getType())) {
-                        return mAst.newSimpleName(var.getName().getIdentifier());
-                    }
-                }
-            }
-        }
-        return null;
-    }
-
-    /**
-     * Walks up the node hierarchy to find the class (aka type) where this statement
-     * is used and returns true if this class derives from android.content.Context.
-     */
-    private boolean isClassDerivedFromContext(StringLiteral node) {
-        TypeDeclaration clazz = findParentClass(node, TypeDeclaration.class);
-        if (clazz != null) {
-            // This is the class that the user is currently writing, so it can't be
-            // a Context by itself, it has to be derived from it.
-            return isAndroidContext(clazz.getSuperclassType());
-        }
-        return false;
-    }
-
-    private Expression findContextFieldOrMethod(StringLiteral node) {
-        TypeDeclaration clazz = findParentClass(node, TypeDeclaration.class);
-        return clazz == null ? null : findContextFieldOrMethod(clazz.resolveBinding());
-    }
-
-    private Expression findContextFieldOrMethod(ITypeBinding clazzType) {
-        TreeMap<Integer, Expression> results = new TreeMap<Integer, Expression>();
-        findContextCandidates(results, clazzType, 0 /*superType*/);
-        if (results.size() > 0) {
-            Integer bestRating = results.keySet().iterator().next();
-            return results.get(bestRating);
-        }
-        return null;
-    }
-
-    /**
-     * Find all method or fields that are candidates for providing a Context.
-     * There can be various choices amongst this class or its super classes.
-     * Sort them by rating in the results map.
-     *
-     * The best ever choice is to find a method with no argument that returns a Context.
-     * The second suitable choice is to find a Context field.
-     * The least desirable choice is to find a method with arguments. It's not really
-     * desirable since we can't generate these arguments automatically.
-     *
-     * Methods and fields from supertypes are ignored if they are private.
-     *
-     * The rating is reversed: the lowest rating integer is used for the best candidate.
-     * Because the superType argument is actually a recursion index, this makes the most
-     * immediate classes more desirable.
-     *
-     * @param results The map that accumulates the rating=>expression results. The lower
-     *                rating number is the best candidate.
-     * @param clazzType The class examined.
-     * @param superType The recursion index.
-     *                  0 for the immediate class, 1 for its super class, etc.
-     */
-    private void findContextCandidates(TreeMap<Integer, Expression> results,
-            ITypeBinding clazzType,
-            int superType) {
-        for (IMethodBinding mb : clazzType.getDeclaredMethods()) {
-            // If we're looking at supertypes, we can't use private methods.
-            if (superType != 0 && Modifier.isPrivate(mb.getModifiers())) {
-                continue;
-            }
-
-            if (isAndroidContext(mb.getReturnType())) {
-                // We found a method that returns something derived from Context.
-
-                int argsLen = mb.getParameterTypes().length;
-                if (argsLen == 0) {
-                    // We'll favor any method that takes no argument,
-                    // That would be the best candidate ever, so we can stop here.
-                    MethodInvocation mi = mAst.newMethodInvocation();
-                    mi.setName(mAst.newSimpleName(mb.getName()));
-                    results.put(Integer.MIN_VALUE, mi);
-                    return;
-                } else {
-                    // A method with arguments isn't as interesting since we wouldn't
-                    // know how to populate such arguments. We'll use it if there are
-                    // no other alternatives. We'll favor the one with the less arguments.
-                    Integer rating = Integer.valueOf(10000 + 1000 * superType + argsLen);
-                    if (!results.containsKey(rating)) {
-                        MethodInvocation mi = mAst.newMethodInvocation();
-                        mi.setName(mAst.newSimpleName(mb.getName()));
-                        results.put(rating, mi);
-                    }
-                }
-            }
-        }
-
-        // A direct Context field would be more interesting than a method with
-        // arguments. Try to find one.
-        for (IVariableBinding var : clazzType.getDeclaredFields()) {
-            // If we're looking at supertypes, we can't use private field.
-            if (superType != 0 && Modifier.isPrivate(var.getModifiers())) {
-                continue;
-            }
-
-            if (isAndroidContext(var.getType())) {
-                // We found such a field. Let's use it.
-                Integer rating = Integer.valueOf(superType);
-                results.put(rating, mAst.newSimpleName(var.getName()));
-                break;
-            }
-        }
-
-        // Examine the super class to see if we can locate a better match
-        clazzType = clazzType.getSuperclass();
-        if (clazzType != null) {
-            findContextCandidates(results, clazzType, superType + 1);
-        }
-    }
-
-    /**
-     * Walks up the node hierarchy and returns the first ASTNode of the requested class.
-     * Only look at parents.
-     *
-     * Implementation note: this is a generic method so that it returns the node already
-     * casted to the requested type.
-     */
-    @SuppressWarnings("unchecked")
-    private <T extends ASTNode> T findParentClass(ASTNode node, Class<T> clazz) {
-        if (node != null) {
-            for (node = node.getParent(); node != null; node = node.getParent()) {
-                if (node.getClass().equals(clazz)) {
-                    return (T) node;
-                }
-            }
-        }
-        return null;
-    }
-
-    /**
-     * Returns true if the given type is or derives from android.content.Context.
-     */
-    private boolean isAndroidContext(Type type) {
-        if (type != null) {
-            return isAndroidContext(type.resolveBinding());
-        }
-        return false;
-    }
-
-    /**
-     * Returns true if the given type is or derives from android.content.Context.
-     */
-    private boolean isAndroidContext(ITypeBinding type) {
-        for (; type != null; type = type.getSuperclass()) {
-            if (CLASS_ANDROID_CONTEXT.equals(type.getQualifiedName())) {
-                return true;
-            }
-        }
-        return false;
-    }
-
-    /**
-     * Returns true if this type binding represents a String or CharSequence type.
-     */
-    private boolean isJavaString(ITypeBinding type) {
-        for (; type != null; type = type.getSuperclass()) {
-            if (CLASS_JAVA_STRING.equals(type.getQualifiedName()) ||
-                CLASS_JAVA_CHAR_SEQUENCE.equals(type.getQualifiedName())) {
-                return true;
-            }
-        }
-        return false;
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/refactorings/extractstring/XmlStringFileHelper.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/refactorings/extractstring/XmlStringFileHelper.java
deleted file mode 100644
index 01e814e..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/refactorings/extractstring/XmlStringFileHelper.java
+++ /dev/null
@@ -1,187 +0,0 @@
-/*
- * Copyright (C) 2009 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.refactorings.extractstring;
-
-import com.android.SdkConstants;
-import com.android.ide.eclipse.adt.AdtPlugin;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.wst.sse.core.StructuredModelManager;
-import org.eclipse.wst.sse.core.internal.provisional.IModelManager;
-import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMDocument;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
-import org.w3c.dom.NamedNodeMap;
-import org.w3c.dom.Node;
-
-import java.util.HashMap;
-import java.util.Map;
-import java.util.TreeMap;
-
-/**
- * An helper utility to get IDs out of an Android XML resource file.
- */
-@SuppressWarnings("restriction")
-class XmlStringFileHelper {
-
-    /** A temporary cache of R.string IDs defined by a given xml file. The key is the
-     * project path of the file, the data is a set of known string Ids for that file.
-     *
-     * Map type: map [String filename] => map [String id => String value].
-     */
-    private HashMap<String, Map<String, String>> mResIdCache =
-        new HashMap<String, Map<String, String>>();
-
-    public XmlStringFileHelper() {
-    }
-
-    /**
-     * Utility method used by the wizard to retrieve the actual value definition of a given
-     * string ID.
-     *
-     * @param project The project contain the XML file.
-     * @param xmlFileWsPath The project path of the XML file, e.g. "/res/values/strings.xml".
-     *          The given file may or may not exist.
-     * @param stringId The string ID to find.
-     * @return The value string if the ID is defined, null otherwise.
-     */
-    public String valueOfStringId(IProject project, String xmlFileWsPath, String stringId) {
-        Map<String, String> cache = getResIdsForFile(project, xmlFileWsPath);
-        return cache.get(stringId);
-    }
-
-    /**
-     * Utility method that retrieves all the *string* IDs defined in the given Android resource
-     * file. The instance maintains an internal cache so a given file is retrieved only once.
-     * Callers should consider the set to be read-only.
-     *
-     * @param project The project contain the XML file.
-     * @param xmlFileWsPath The project path of the XML file, e.g. "/res/values/strings.xml".
-     *          The given file may or may not exist.
-     * @return The map of string IDs => values defined in the given file. Cached. Never null.
-     */
-    public Map<String, String> getResIdsForFile(IProject project, String xmlFileWsPath) {
-        Map<String, String> cache = mResIdCache.get(xmlFileWsPath);
-        if (cache == null) {
-            cache = internalGetResIdsForFile(project, xmlFileWsPath);
-            mResIdCache.put(xmlFileWsPath, cache);
-        }
-        return cache;
-    }
-
-    /**
-     * Extract all the defined string IDs from a given file using XPath.
-     * @param project The project contain the XML file.
-     * @param xmlFileWsPath The project path of the file to parse. It may not exist.
-     * @return The map of all string IDs => values defined in the file.
-     *   The returned set is always non null. It is empty if the file does not exist.
-     */
-    private Map<String, String> internalGetResIdsForFile(IProject project, String xmlFileWsPath) {
-
-        TreeMap<String, String> ids = new TreeMap<String, String>();
-
-        // Access the project that contains the resource that contains the compilation unit
-        IResource resource = project.getFile(xmlFileWsPath);
-
-        if (resource != null && resource.exists() && resource.getType() == IResource.FILE) {
-            IStructuredModel smodel = null;
-
-            try {
-                IFile file = (IFile) resource;
-                IModelManager modelMan = StructuredModelManager.getModelManager();
-                smodel = modelMan.getExistingModelForRead(file);
-                if (smodel == null) {
-                    smodel = modelMan.getModelForRead(file);
-                }
-
-                if (smodel instanceof IDOMModel) {
-                    IDOMDocument doc = ((IDOMModel) smodel).getDocument();
-
-                    // We want all the IDs in an XML structure like this:
-                    // <resources>
-                    //    <string name="ID">something</string>
-                    // </resources>
-
-                    Node root = findChild(doc, null, SdkConstants.TAG_RESOURCES);
-                    if (root != null) {
-                        for (Node strNode = findChild(root, null,
-                                                      SdkConstants.TAG_STRING);
-                             strNode != null;
-                             strNode = findChild(null, strNode,
-                                                 SdkConstants.TAG_STRING)) {
-                            NamedNodeMap attrs = strNode.getAttributes();
-                            Node nameAttr = attrs.getNamedItem(SdkConstants.ATTR_NAME);
-                            if (nameAttr != null) {
-                                String id = nameAttr.getNodeValue();
-
-                                // Find the TEXT node right after the element.
-                                // Whitespace matters so we don't try to normalize it.
-                                String text = "";                       //$NON-NLS-1$
-                                for (Node txtNode = strNode.getFirstChild();
-                                        txtNode != null && txtNode.getNodeType() == Node.TEXT_NODE;
-                                        txtNode = txtNode.getNextSibling()) {
-                                    text += txtNode.getNodeValue();
-                                }
-
-                                ids.put(id, text);
-                            }
-                        }
-                    }
-                }
-
-            } catch (Throwable e) {
-                AdtPlugin.log(e, "GetResIds failed in %1$s", xmlFileWsPath); //$NON-NLS-1$
-            } finally {
-                if (smodel != null) {
-                    smodel.releaseFromRead();
-                }
-            }
-        }
-
-        return ids;
-    }
-
-    /**
-     * Utility method that finds the next node of the requested element name.
-     *
-     * @param parent The parent node. If not null, will to start searching its children.
-     *               Set to null when iterating through children.
-     * @param lastChild The last child returned. Use null when visiting a parent the first time.
-     * @param elementName The element name of the node to find.
-     * @return The next children or sibling nide with the requested element name or null.
-     */
-    private Node findChild(Node parent, Node lastChild, String elementName) {
-        if (lastChild == null && parent != null) {
-            lastChild = parent.getFirstChild();
-        } else if (lastChild != null) {
-            lastChild = lastChild.getNextSibling();
-        }
-
-        for ( ; lastChild != null ; lastChild = lastChild.getNextSibling()) {
-            if (lastChild.getNodeType() == Node.ELEMENT_NODE &&
-                    lastChild.getNamespaceURI() == null &&  // resources don't have any NS URI
-                    elementName.equals(lastChild.getLocalName())) {
-                return lastChild;
-            }
-        }
-
-        return null;
-    }
-
-}
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
deleted file mode 100644
index 406cebc..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/refactorings/renamepackage/ApplicationPackageNameRefactoring.java
+++ /dev/null
@@ -1,586 +0,0 @@
-/*
- * Copyright (C) 2010 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.refactorings.renamepackage;
-
-import static com.android.SdkConstants.FN_BUILD_CONFIG_BASE;
-import static com.android.SdkConstants.FN_MANIFEST_BASE;
-import static com.android.SdkConstants.FN_RESOURCE_BASE;
-
-import com.android.SdkConstants;
-import com.android.ide.eclipse.adt.AdtConstants;
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.xml.AndroidManifest;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IFolder;
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IResourceVisitor;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.OperationCanceledException;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.jdt.core.ICompilationUnit;
-import org.eclipse.jdt.core.JavaCore;
-import org.eclipse.jdt.core.JavaModelException;
-import org.eclipse.jdt.core.dom.AST;
-import org.eclipse.jdt.core.dom.ASTParser;
-import org.eclipse.jdt.core.dom.ASTVisitor;
-import org.eclipse.jdt.core.dom.CompilationUnit;
-import org.eclipse.jdt.core.dom.ImportDeclaration;
-import org.eclipse.jdt.core.dom.Name;
-import org.eclipse.jdt.core.dom.QualifiedName;
-import org.eclipse.jdt.core.dom.rewrite.ASTRewrite;
-import org.eclipse.jdt.core.dom.rewrite.ImportRewrite;
-import org.eclipse.ltk.core.refactoring.Change;
-import org.eclipse.ltk.core.refactoring.CompositeChange;
-import org.eclipse.ltk.core.refactoring.Refactoring;
-import org.eclipse.ltk.core.refactoring.RefactoringStatus;
-import org.eclipse.ltk.core.refactoring.TextEditChangeGroup;
-import org.eclipse.ltk.core.refactoring.TextFileChange;
-import org.eclipse.text.edits.MalformedTreeException;
-import org.eclipse.text.edits.MultiTextEdit;
-import org.eclipse.text.edits.ReplaceEdit;
-import org.eclipse.text.edits.TextEdit;
-import org.eclipse.text.edits.TextEditGroup;
-import org.eclipse.wst.sse.core.StructuredModelManager;
-import org.eclipse.wst.sse.core.internal.provisional.IModelManager;
-import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;
-import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocumentRegion;
-import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegion;
-import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegionList;
-import org.eclipse.wst.xml.core.internal.regions.DOMRegionContext;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
-
-/**
- *  Wrapper class defining the stages of the refactoring process
- */
-@SuppressWarnings("restriction")
-class ApplicationPackageNameRefactoring extends Refactoring {
-    private final IProject mProject;
-    private final Name mOldPackageName;
-    private final Name mNewPackageName;
-
-    List<String> MAIN_COMPONENT_TYPES_LIST = Arrays.asList(MAIN_COMPONENT_TYPES);
-
-    ApplicationPackageNameRefactoring(
-            IProject project,
-            Name oldPackageName,
-            Name newPackageName) {
-        mProject = project;
-        mOldPackageName = oldPackageName;
-        mNewPackageName = newPackageName;
-    }
-
-    @Override
-    public RefactoringStatus checkInitialConditions(IProgressMonitor pm)
-            throws CoreException, OperationCanceledException {
-
-        // Accurate refactoring of the "shorthand" names in
-        // AndroidManifest.xml depends on not having compilation errors.
-        if (mProject.findMaxProblemSeverity(
-                IMarker.PROBLEM,
-                true,
-                IResource.DEPTH_INFINITE) == IMarker.SEVERITY_ERROR) {
-            return
-                RefactoringStatus.createFatalErrorStatus("Fix the errors in your project, first.");
-        }
-
-        return new RefactoringStatus();
-    }
-
-    @Override
-    public RefactoringStatus checkFinalConditions(IProgressMonitor pm)
-            throws OperationCanceledException {
-
-        return new RefactoringStatus();
-    }
-
-    @Override
-    public Change createChange(IProgressMonitor pm) throws CoreException,
-    OperationCanceledException {
-
-        // Traverse all files in the project, building up a list of changes
-        JavaFileVisitor fileVisitor = new JavaFileVisitor();
-        mProject.accept(fileVisitor);
-        return fileVisitor.getChange();
-    }
-
-    @Override
-    public String getName() {
-        return "AndroidPackageNameRefactoring"; //$NON-NLS-1$
-    }
-
-    public final static String[] MAIN_COMPONENT_TYPES = {
-        AndroidManifest.NODE_ACTIVITY, AndroidManifest.NODE_SERVICE,
-        AndroidManifest.NODE_RECEIVER, AndroidManifest.NODE_PROVIDER,
-        AndroidManifest.NODE_APPLICATION
-    };
-
-
-    TextEdit updateJavaFileImports(CompilationUnit cu) {
-
-        ImportVisitor importVisitor = new ImportVisitor(cu.getAST());
-        cu.accept(importVisitor);
-        TextEdit rewrittenImports = importVisitor.getTextEdit();
-
-        // If the import of R was potentially implicit, insert an import statement
-        if (rewrittenImports != null && cu.getPackage().getName().getFullyQualifiedName()
-                .equals(mOldPackageName.getFullyQualifiedName())) {
-
-            UsageVisitor usageVisitor = new UsageVisitor();
-            cu.accept(usageVisitor);
-
-            if (usageVisitor.seenAny()) {
-                ImportRewrite irw = ImportRewrite.create(cu, true);
-                if (usageVisitor.hasSeenR()) {
-                    irw.addImport(mNewPackageName.getFullyQualifiedName() + '.'
-                            + FN_RESOURCE_BASE);
-                }
-                if (usageVisitor.hasSeenBuildConfig()) {
-                    irw.addImport(mNewPackageName.getFullyQualifiedName() + '.'
-                            + FN_BUILD_CONFIG_BASE);
-                }
-                if (usageVisitor.hasSeenManifest()) {
-                    irw.addImport(mNewPackageName.getFullyQualifiedName() + '.'
-                            + FN_MANIFEST_BASE);
-                }
-
-                try {
-                    rewrittenImports.addChild( irw.rewriteImports(null) );
-                } catch (MalformedTreeException e) {
-                    Status s = new Status(Status.ERROR, AdtPlugin.PLUGIN_ID, e.getMessage(), e);
-                    AdtPlugin.getDefault().getLog().log(s);
-                } catch (CoreException e) {
-                    Status s = new Status(Status.ERROR, AdtPlugin.PLUGIN_ID, e.getMessage(), e);
-                    AdtPlugin.getDefault().getLog().log(s);
-                }
-            }
-        }
-
-        return rewrittenImports;
-    }
-
-    // XML utility functions
-    private String stripQuotes(String text) {
-        int len = text.length();
-        if (len >= 2 && text.charAt(0) == '"' && text.charAt(len - 1) == '"') {
-            return text.substring(1, len - 1);
-        } else if (len >= 2 && text.charAt(0) == '\'' && text.charAt(len - 1) == '\'') {
-            return text.substring(1, len - 1);
-        }
-        return text;
-    }
-
-    private String addQuotes(String text) {
-        return '"' + text + '"';
-    }
-
-    /*
-     * Make the appropriate package name changes to a resource file,
-     * e.g. .xml files in res/layout. This entails updating the namespace
-     * declarations for custom styleable attributes.  The namespace prefix
-     * is user-defined and may be declared in any element where or parent
-     * element of where the prefix is used.
-     */
-    TextFileChange editXmlResourceFile(IFile file) {
-
-        IModelManager modelManager = StructuredModelManager.getModelManager();
-        IStructuredDocument sdoc = null;
-        try {
-            sdoc = modelManager.createStructuredDocumentFor(file);
-        } catch (IOException e) {
-            Status s = new Status(Status.ERROR, AdtPlugin.PLUGIN_ID, e.getMessage(), e);
-            AdtPlugin.getDefault().getLog().log(s);
-        } catch (CoreException e) {
-            Status s = new Status(Status.ERROR, AdtPlugin.PLUGIN_ID, e.getMessage(), e);
-            AdtPlugin.getDefault().getLog().log(s);
-        }
-
-        if (sdoc == null) {
-            return null;
-        }
-
-        TextFileChange xmlChange = new TextFileChange("XML resource file edit", file);
-        xmlChange.setTextType(SdkConstants.EXT_XML);
-
-        MultiTextEdit multiEdit = new MultiTextEdit();
-        ArrayList<TextEditGroup> editGroups = new ArrayList<TextEditGroup>();
-
-        final String oldAppNamespaceString = String.format(AdtConstants.NS_CUSTOM_RESOURCES,
-                mOldPackageName.getFullyQualifiedName());
-        final String newAppNamespaceString = String.format(AdtConstants.NS_CUSTOM_RESOURCES,
-                mNewPackageName.getFullyQualifiedName());
-
-        // Prepare the change set
-        for (IStructuredDocumentRegion region : sdoc.getStructuredDocumentRegions()) {
-
-            if (!DOMRegionContext.XML_TAG_NAME.equals(region.getType())) {
-                continue;
-            }
-
-            int nb = region.getNumberOfRegions();
-            ITextRegionList list = region.getRegions();
-            String lastAttrName = null;
-
-            for (int i = 0; i < nb; i++) {
-                ITextRegion subRegion = list.get(i);
-                String type = subRegion.getType();
-
-                if (DOMRegionContext.XML_TAG_ATTRIBUTE_NAME.equals(type)) {
-                    // Memorize the last attribute name seen
-                    lastAttrName = region.getText(subRegion);
-
-                } else if (DOMRegionContext.XML_TAG_ATTRIBUTE_VALUE.equals(type)) {
-                    // Check this is the attribute and the original string
-
-                    if (lastAttrName != null &&
-                            lastAttrName.startsWith(SdkConstants.XMLNS_PREFIX)) {
-
-                        String lastAttrValue = region.getText(subRegion);
-                        if (oldAppNamespaceString.equals(stripQuotes(lastAttrValue))) {
-
-                            // Found an occurrence. Create a change for it.
-                            TextEdit edit = new ReplaceEdit(
-                                    region.getStartOffset() + subRegion.getStart(),
-                                    subRegion.getTextLength(),
-                                    addQuotes(newAppNamespaceString));
-                            TextEditGroup editGroup = new TextEditGroup(
-                                    "Replace package name in custom namespace prefix", edit);
-
-                            multiEdit.addChild(edit);
-                            editGroups.add(editGroup);
-                        }
-                    }
-                }
-            }
-        }
-
-        if (multiEdit.hasChildren()) {
-            xmlChange.setEdit(multiEdit);
-            for (TextEditGroup group : editGroups) {
-                xmlChange.addTextEditChangeGroup(new TextEditChangeGroup(xmlChange, group));
-            }
-
-            return xmlChange;
-        }
-        return null;
-    }
-
-    /*
-     * Replace all instances of the package name in AndroidManifest.xml.
-     * This includes expanding shorthand paths for each Component (Activity,
-     * Service, etc.) and of course updating the application package name.
-     * The namespace prefix might not be "android", so we resolve it
-     * dynamically.
-     */
-    TextFileChange editAndroidManifest(IFile file) {
-
-        IModelManager modelManager = StructuredModelManager.getModelManager();
-        IStructuredDocument sdoc = null;
-        try {
-            sdoc = modelManager.createStructuredDocumentFor(file);
-        } catch (IOException e) {
-            Status s = new Status(Status.ERROR, AdtPlugin.PLUGIN_ID, e.getMessage(), e);
-            AdtPlugin.getDefault().getLog().log(s);
-        } catch (CoreException e) {
-            Status s = new Status(Status.ERROR, AdtPlugin.PLUGIN_ID, e.getMessage(), e);
-            AdtPlugin.getDefault().getLog().log(s);
-        }
-
-        if (sdoc == null) {
-            return null;
-        }
-
-        TextFileChange xmlChange = new TextFileChange("Make Manifest edits", file);
-        xmlChange.setTextType(SdkConstants.EXT_XML);
-
-        MultiTextEdit multiEdit = new MultiTextEdit();
-        ArrayList<TextEditGroup> editGroups = new ArrayList<TextEditGroup>();
-
-        // The namespace prefix is guaranteed to be resolved before
-        // the first use of this attribute
-        String android_name_attribute = null;
-
-        // Prepare the change set
-        for (IStructuredDocumentRegion region : sdoc.getStructuredDocumentRegions()) {
-
-            // Only look at XML "top regions"
-            if (!DOMRegionContext.XML_TAG_NAME.equals(region.getType())) {
-                continue;
-            }
-
-            int nb = region.getNumberOfRegions();
-            ITextRegionList list = region.getRegions();
-            String lastTagName = null, lastAttrName = null;
-
-            for (int i = 0; i < nb; i++) {
-                ITextRegion subRegion = list.get(i);
-                String type = subRegion.getType();
-
-                if (DOMRegionContext.XML_TAG_NAME.equals(type)) {
-                    // Memorize the last tag name seen
-                    lastTagName = region.getText(subRegion);
-
-                } else if (DOMRegionContext.XML_TAG_ATTRIBUTE_NAME.equals(type)) {
-                    // Memorize the last attribute name seen
-                    lastAttrName = region.getText(subRegion);
-
-                } else if (DOMRegionContext.XML_TAG_ATTRIBUTE_VALUE.equals(type)) {
-
-                    String lastAttrValue = region.getText(subRegion);
-                    if (lastAttrName != null &&
-                            lastAttrName.startsWith(SdkConstants.XMLNS_PREFIX)) {
-
-                        // Resolves the android namespace prefix for this file
-                        if (SdkConstants.ANDROID_URI.equals(stripQuotes(lastAttrValue))) {
-                            String android_namespace_prefix = lastAttrName
-                                .substring(SdkConstants.XMLNS_PREFIX.length());
-                            android_name_attribute = android_namespace_prefix + ':'
-                                + AndroidManifest.ATTRIBUTE_NAME;
-                        }
-                    } else if (AndroidManifest.NODE_MANIFEST.equals(lastTagName)
-                            && AndroidManifest.ATTRIBUTE_PACKAGE.equals(lastAttrName)) {
-
-                        // Found an occurrence. Create a change for it.
-                        TextEdit edit = new ReplaceEdit(region.getStartOffset()
-                                + subRegion.getStart(), subRegion.getTextLength(),
-                                addQuotes(mNewPackageName.getFullyQualifiedName()));
-
-                        multiEdit.addChild(edit);
-                        editGroups.add(new TextEditGroup("Change Android package name", edit));
-
-                    } else if (MAIN_COMPONENT_TYPES_LIST.contains(lastTagName)
-                            && lastAttrName != null
-                            && lastAttrName.equals(android_name_attribute)) {
-
-                        String package_path = stripQuotes(lastAttrValue);
-                        String old_package_name_string = mOldPackageName.getFullyQualifiedName();
-
-                        String absolute_path = AndroidManifest.combinePackageAndClassName(
-                                old_package_name_string, package_path);
-
-                        TextEdit edit = new ReplaceEdit(region.getStartOffset()
-                                + subRegion.getStart(), subRegion.getTextLength(),
-                                addQuotes(absolute_path));
-
-                        multiEdit.addChild(edit);
-
-                        editGroups.add(new TextEditGroup("Update component path", edit));
-                    }
-                }
-            }
-        }
-
-        if (multiEdit.hasChildren()) {
-            xmlChange.setEdit(multiEdit);
-            for (TextEditGroup group : editGroups) {
-                xmlChange.addTextEditChangeGroup(new TextEditChangeGroup(xmlChange, group));
-            }
-
-            return xmlChange;
-        }
-        return null;
-    }
-
-
-    /*
-     * Iterates through all project files, taking distinct actions based on
-     * whether the file is:
-     * 1) a .java file (replaces or inserts the "import" statements)
-     * 2) a .xml layout file (updates namespace declarations)
-     * 3) the AndroidManifest.xml
-     */
-    class JavaFileVisitor implements IResourceVisitor {
-
-        final List<TextFileChange> mChanges = new ArrayList<TextFileChange>();
-
-        final ASTParser mParser = ASTParser.newParser(AST.JLS3);
-
-        public CompositeChange getChange() {
-
-            Collections.reverse(mChanges);
-            CompositeChange change = new CompositeChange("Refactoring Application package name",
-                    mChanges.toArray(new Change[mChanges.size()]));
-            change.markAsSynthetic();
-            return change;
-        }
-
-        @Override
-        public boolean visit(IResource resource) throws CoreException {
-            if (resource instanceof IFile) {
-                IFile file = (IFile) resource;
-                if (SdkConstants.EXT_JAVA.equals(file.getFileExtension())) {
-
-                    ICompilationUnit icu = JavaCore.createCompilationUnitFrom(file);
-
-                    mParser.setSource(icu);
-                    CompilationUnit cu = (CompilationUnit) mParser.createAST(null);
-
-                    TextEdit textEdit = updateJavaFileImports(cu);
-                    if (textEdit != null && textEdit.hasChildren()) {
-                        MultiTextEdit edit = new MultiTextEdit();
-                        edit.addChild(textEdit);
-
-                        TextFileChange text_file_change = new TextFileChange(file.getName(), file);
-                        text_file_change.setTextType(SdkConstants.EXT_JAVA);
-                        text_file_change.setEdit(edit);
-                        mChanges.add(text_file_change);
-                    }
-
-                    // XXX Partially taken from ExtractStringRefactoring.java
-                    // Check this a Layout XML file and get the selection and
-                    // its context.
-                } else if (SdkConstants.EXT_XML.equals(file.getFileExtension())) {
-
-                    if (SdkConstants.FN_ANDROID_MANIFEST_XML.equals(file.getName())) {
-                        // Ensure that this is the root manifest, not some other copy
-                        // (such as the one in bin/)
-                        IPath path = file.getFullPath();
-                        if (path.segmentCount() == 2) {
-                            TextFileChange manifest_change = editAndroidManifest(file);
-                            mChanges.add(manifest_change);
-                        }
-                    } else {
-
-                        // Currently we only support Android resource XML files,
-                        // so they must have a path similar to
-                        //   project/res/<type>[-<configuration>]/*.xml
-                        // There is no support for sub folders, so the segment count must be 4.
-                        // We don't need to check the type folder name because
-                        // a/ we only accept an AndroidXmlEditor source and
-                        // b/ aapt generates a compilation error for unknown folders.
-                        IPath path = file.getFullPath();
-                        // check if we are inside the project/res/* folder.
-                        if (path.segmentCount() == 4) {
-                            if (path.segment(1).equalsIgnoreCase(SdkConstants.FD_RESOURCES)) {
-
-
-                                TextFileChange xmlChange = editXmlResourceFile(file);
-                                if (xmlChange != null) {
-                                    mChanges.add(xmlChange);
-                                }
-                            }
-                        }
-                    }
-                }
-
-                return false;
-
-            } else if (resource instanceof IFolder) {
-                return !SdkConstants.FD_GEN_SOURCES.equals(resource.getName());
-            }
-
-            return true;
-        }
-    }
-
-    private static class UsageVisitor extends ASTVisitor {
-        private boolean mSeenManifest;
-        private boolean mSeenR;
-        private boolean mSeenBuildConfig;
-
-        @Override
-        public boolean visit(QualifiedName node) {
-            Name qualifier = node.getQualifier();
-            if (qualifier.isSimpleName()) {
-                String name = qualifier.toString();
-                if (name.equals(FN_RESOURCE_BASE)) {
-                    mSeenR = true;
-                } else if (name.equals(FN_BUILD_CONFIG_BASE)) {
-                    mSeenBuildConfig = true;
-                } else if (name.equals(FN_MANIFEST_BASE)) {
-                    mSeenManifest = true;
-                }
-            }
-            return super.visit(node);
-        };
-
-        public boolean seenAny() {
-            return mSeenR || mSeenBuildConfig || mSeenManifest;
-        }
-
-        public boolean hasSeenBuildConfig() {
-            return mSeenBuildConfig;
-        }
-        public boolean hasSeenManifest() {
-            return mSeenManifest;
-        }
-        public boolean hasSeenR() {
-            return mSeenR;
-        }
-    }
-
-    private class ImportVisitor extends ASTVisitor {
-
-        final AST mAst;
-        final ASTRewrite mRewriter;
-
-        ImportVisitor(AST ast) {
-            mAst = ast;
-            mRewriter = ASTRewrite.create(ast);
-        }
-
-        public TextEdit getTextEdit() {
-            try {
-                return this.mRewriter.rewriteAST();
-            } catch (JavaModelException e) {
-                Status s = new Status(Status.ERROR, AdtPlugin.PLUGIN_ID, e.getMessage(), e);
-                AdtPlugin.getDefault().getLog().log(s);
-            } catch (IllegalArgumentException e) {
-                Status s = new Status(Status.ERROR, AdtPlugin.PLUGIN_ID, e.getMessage(), e);
-                AdtPlugin.getDefault().getLog().log(s);
-            }
-            return null;
-        }
-
-        @Override
-        public boolean visit(ImportDeclaration id) {
-
-            Name importName = id.getName();
-            if (importName.isQualifiedName()) {
-                QualifiedName qualifiedImportName = (QualifiedName) importName;
-
-                String identifier = qualifiedImportName.getName().getIdentifier();
-                if (identifier.equals(FN_RESOURCE_BASE)) {
-                    mRewriter.replace(qualifiedImportName.getQualifier(), mNewPackageName,
-                            null);
-                } else if (identifier.equals(FN_BUILD_CONFIG_BASE)
-                        && mOldPackageName.toString().equals(
-                                qualifiedImportName.getQualifier().toString())) {
-                    mRewriter.replace(qualifiedImportName.getQualifier(), mNewPackageName,
-                            null);
-
-                } else if (identifier.equals(FN_MANIFEST_BASE)
-                        && mOldPackageName.toString().equals(
-                                qualifiedImportName.getQualifier().toString())) {
-                    mRewriter.replace(qualifiedImportName.getQualifier(), mNewPackageName,
-                            null);
-                }
-            }
-
-            return true;
-        }
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/refactorings/renamepackage/ApplicationPackageNameRefactoringWizard.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/refactorings/renamepackage/ApplicationPackageNameRefactoringWizard.java
deleted file mode 100644
index 3651855..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/refactorings/renamepackage/ApplicationPackageNameRefactoringWizard.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Copyright (C) 2010 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.refactorings.renamepackage;
-
-import org.eclipse.ltk.core.refactoring.Refactoring;
-import org.eclipse.ltk.ui.refactoring.RefactoringWizard;
-
-/**
- * @see RenamePackageAction
- */
-class ApplicationPackageNameRefactoringWizard extends RefactoringWizard {
-
-    public ApplicationPackageNameRefactoringWizard(Refactoring refactoring) {
-        super(refactoring, 0);
-    }
-
-    @Override
-    protected void addUserInputPages() {
-    }
-}
-
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/refactorings/renamepackage/RenamePackageAction.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/refactorings/renamepackage/RenamePackageAction.java
deleted file mode 100644
index bb475aa..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/refactorings/renamepackage/RenamePackageAction.java
+++ /dev/null
@@ -1,174 +0,0 @@
-/*
- * Copyright (C) 2010 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.refactorings.renamepackage;
-
-import com.android.ide.common.xml.ManifestData;
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.ide.eclipse.adt.internal.project.AndroidManifestHelper;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.jdt.core.dom.AST;
-import org.eclipse.jdt.core.dom.Name;
-import org.eclipse.jdt.ui.refactoring.RefactoringSaveHelper;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.dialogs.IInputValidator;
-import org.eclipse.jface.dialogs.InputDialog;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.window.Window;
-import org.eclipse.ltk.core.refactoring.Refactoring;
-import org.eclipse.ltk.ui.refactoring.RefactoringWizardOpenOperation;
-import org.eclipse.ui.IObjectActionDelegate;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.IWorkbenchWindowActionDelegate;
-
-import java.util.Iterator;
-
-/**
- * Refactoring steps:
- * <ol>
- * <li>Update the "package" attribute of the &lt;manifest&gt; tag with the new
- * name.</li>
- * <li>Replace all values for the "android:name" attribute in the
- * &lt;application&gt; and "component class" (&lt;activity&gt;, &lt;service&gt;,
- * &lt;receiver&gt;, and &lt;provider&gt;) tags with the non-shorthand version
- * of the class name</li>
- * <li>Replace package resource imports (*.R) in .java files</li>
- * <li>Update package name in the namespace declarations (e.g. "xmlns:app")
- * used for custom styleable attributes in layout resource files</li>
- * </ol>
- * Caveat: Sometimes it is necessary to perform a project-wide
- * "Organize Imports" afterwards. (CTRL+SHIFT+O when a project has active
- * selection)
- */
-public class RenamePackageAction implements IObjectActionDelegate {
-
-    private ISelection mSelection;
-    @SuppressWarnings("unused") private IWorkbenchPart mTargetPart; // TODO cleanup
-
-    /**
-     * @see IObjectActionDelegate#setActivePart(IAction, IWorkbenchPart)
-     */
-    @Override
-    public void setActivePart(IAction action, IWorkbenchPart targetPart) {
-        mTargetPart = targetPart;
-    }
-
-    @Override
-    public void selectionChanged(IAction action, ISelection selection) {
-        mSelection = selection;
-    }
-
-    /**
-     * @see IWorkbenchWindowActionDelegate#init
-     */
-    public void init(IWorkbenchWindow window) {
-        // pass
-    }
-
-    @Override
-    public void run(IAction action) {
-
-        // Prompt for refactoring on the selected project
-        if (mSelection instanceof IStructuredSelection) {
-            for (Iterator<?> it = ((IStructuredSelection) mSelection).iterator(); it.hasNext();) {
-                Object element = it.next();
-                IProject project = null;
-                if (element instanceof IProject) {
-                    project = (IProject) element;
-                } else if (element instanceof IAdaptable) {
-                    project = (IProject) ((IAdaptable) element).getAdapter(IProject.class);
-                }
-                if (project != null) {
-                    // It is advisable that the user saves before proceeding,
-                    // revealing any compilation errors. The following lines
-                    // enforce a save as a convenience.
-                    RefactoringSaveHelper save_helper = new RefactoringSaveHelper(
-                            RefactoringSaveHelper.SAVE_ALL_ALWAYS_ASK);
-                    if (save_helper.saveEditors(AdtPlugin.getShell())) {
-                        promptNewName(project);
-                    }
-                }
-            }
-        }
-    }
-
-    /*
-     * Validate the new package name and start the refactoring wizard
-     */
-    private void promptNewName(final IProject project) {
-
-        ManifestData manifestData = AndroidManifestHelper.parseForData(project);
-        if (manifestData == null) {
-            return;
-        }
-
-        final String oldPackageNameString = manifestData.getPackage();
-
-        final AST astValidator = AST.newAST(AST.JLS3);
-        Name oldPackageName = astValidator.newName(oldPackageNameString);
-
-        IInputValidator validator = new IInputValidator() {
-
-            @Override
-            public String isValid(String newText) {
-                try {
-                    astValidator.newName(newText);
-                } catch (IllegalArgumentException e) {
-                    return "Illegal package name.";
-                }
-
-                if (newText.equals(oldPackageNameString))
-                    return "No change.";
-                else
-                    return null;
-            }
-        };
-
-        InputDialog dialog = new InputDialog(AdtPlugin.getShell(),
-                "Rename Application Package", "Enter new package name:", oldPackageNameString,
-                validator);
-
-        if (dialog.open() == Window.OK) {
-            Name newPackageName = astValidator.newName(dialog.getValue());
-            initiateAndroidPackageRefactoring(project, oldPackageName, newPackageName);
-        }
-    }
-
-
-    private void initiateAndroidPackageRefactoring(
-            final IProject project,
-            Name oldPackageName,
-            Name newPackageName) {
-
-        Refactoring package_name_refactoring =
-            new ApplicationPackageNameRefactoring(project, oldPackageName, newPackageName);
-
-        ApplicationPackageNameRefactoringWizard wizard =
-            new ApplicationPackageNameRefactoringWizard(package_name_refactoring);
-        RefactoringWizardOpenOperation op = new RefactoringWizardOpenOperation(wizard);
-        try {
-            op.run(AdtPlugin.getShell(), package_name_refactoring.getName());
-        } catch (InterruptedException e) {
-            Status s = new Status(Status.ERROR, AdtPlugin.PLUGIN_ID, e.getMessage(), e);
-            AdtPlugin.getDefault().getLog().log(s);
-        }
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/resources/CyclicDependencyValidator.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/resources/CyclicDependencyValidator.java
deleted file mode 100644
index a2b13c6..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/resources/CyclicDependencyValidator.java
+++ /dev/null
@@ -1,66 +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.eclipse.adt.internal.resources;
-
-import com.android.annotations.Nullable;
-import com.android.ide.eclipse.adt.internal.editors.layout.gle2.IncludeFinder;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.jface.dialogs.IInputValidator;
-
-import java.util.Collection;
-
-/** A validator which checks for cyclic dependencies */
-public class CyclicDependencyValidator implements IInputValidator {
-    private final Collection<String> mInvalidIds;
-
-    private CyclicDependencyValidator(Collection<String> invalid) {
-        this.mInvalidIds = invalid;
-    }
-
-    @Override
-    public String isValid(String newText) {
-        if (mInvalidIds.contains(newText)) {
-            return "Cyclic include, not valid";
-        }
-        return null;
-    }
-
-    /**
-     * Creates a validator which ensures that the chosen id is not for a layout that is
-     * directly or indirectly including the given layout. Used to avoid cyclic
-     * dependencies when offering layouts to be included within a given file, etc.
-     *
-     * @param file the target file that candidate layouts should not directly or
-     *            indirectly include
-     * @return a validator which checks whether resource ids are valid or whether they
-     *         could result in a cyclic dependency
-     */
-    @Nullable
-    public static IInputValidator create(@Nullable IFile file) {
-        if (file == null) {
-            return null;
-        }
-
-        IProject project = file.getProject();
-        IncludeFinder includeFinder = IncludeFinder.get(project);
-        final Collection<String> invalid =
-            includeFinder.getInvalidIncludes(file);
-
-        return new CyclicDependencyValidator(invalid);
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/resources/ResourceHelper.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/resources/ResourceHelper.java
deleted file mode 100644
index b0e3d43..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/resources/ResourceHelper.java
+++ /dev/null
@@ -1,628 +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.eclipse.adt.internal.resources;
-
-import static com.android.SdkConstants.ANDROID_PREFIX;
-import static com.android.SdkConstants.ANDROID_STYLE_RESOURCE_PREFIX;
-import static com.android.SdkConstants.ANDROID_URI;
-import static com.android.SdkConstants.ATTR_COLOR;
-import static com.android.SdkConstants.ATTR_NAME;
-import static com.android.SdkConstants.ATTR_TYPE;
-import static com.android.SdkConstants.DOT_XML;
-import static com.android.SdkConstants.EXT_XML;
-import static com.android.SdkConstants.FD_RESOURCES;
-import static com.android.SdkConstants.FD_RES_VALUES;
-import static com.android.SdkConstants.PREFIX_RESOURCE_REF;
-import static com.android.SdkConstants.STYLE_RESOURCE_PREFIX;
-import static com.android.SdkConstants.TAG_ITEM;
-import static com.android.SdkConstants.TAG_RESOURCES;
-import static com.android.ide.eclipse.adt.AdtConstants.WS_SEP;
-
-import com.android.ide.common.rendering.api.ResourceValue;
-import com.android.ide.common.resources.ResourceDeltaKind;
-import com.android.ide.common.resources.ResourceResolver;
-import com.android.ide.common.resources.ResourceUrl;
-import com.android.ide.common.resources.configuration.CountryCodeQualifier;
-import com.android.ide.common.resources.configuration.DensityQualifier;
-import com.android.ide.common.resources.configuration.FolderConfiguration;
-import com.android.ide.common.resources.configuration.KeyboardStateQualifier;
-import com.android.ide.common.resources.configuration.LayoutDirectionQualifier;
-import com.android.ide.common.resources.configuration.LocaleQualifier;
-import com.android.ide.common.resources.configuration.NavigationMethodQualifier;
-import com.android.ide.common.resources.configuration.NavigationStateQualifier;
-import com.android.ide.common.resources.configuration.NetworkCodeQualifier;
-import com.android.ide.common.resources.configuration.NightModeQualifier;
-import com.android.ide.common.resources.configuration.ResourceQualifier;
-import com.android.ide.common.resources.configuration.ScreenDimensionQualifier;
-import com.android.ide.common.resources.configuration.ScreenHeightQualifier;
-import com.android.ide.common.resources.configuration.ScreenOrientationQualifier;
-import com.android.ide.common.resources.configuration.ScreenRatioQualifier;
-import com.android.ide.common.resources.configuration.ScreenSizeQualifier;
-import com.android.ide.common.resources.configuration.ScreenWidthQualifier;
-import com.android.ide.common.resources.configuration.SmallestScreenWidthQualifier;
-import com.android.ide.common.resources.configuration.TextInputMethodQualifier;
-import com.android.ide.common.resources.configuration.TouchScreenQualifier;
-import com.android.ide.common.resources.configuration.UiModeQualifier;
-import com.android.ide.common.resources.configuration.VersionQualifier;
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.ide.eclipse.adt.internal.editors.AndroidXmlEditor;
-import com.android.ide.eclipse.adt.internal.editors.Hyperlinks;
-import com.android.ide.eclipse.adt.internal.editors.IconFactory;
-import com.android.ide.eclipse.adt.internal.editors.layout.gle2.ImageUtils;
-import com.android.ide.eclipse.adt.internal.editors.layout.refactoring.VisualRefactoring;
-import com.android.ide.eclipse.adt.internal.wizards.newxmlfile.NewXmlFileWizard;
-import com.android.resources.FolderTypeRelationship;
-import com.android.resources.ResourceFolderType;
-import com.android.resources.ResourceType;
-import com.android.utils.Pair;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IResourceDelta;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.jface.text.IRegion;
-import org.eclipse.jface.text.Region;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.graphics.RGB;
-import org.eclipse.wst.sse.core.StructuredModelManager;
-import org.eclipse.wst.sse.core.internal.provisional.IModelManager;
-import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
-import org.eclipse.wst.sse.core.internal.provisional.IndexedRegion;
-import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;
-import org.eclipse.wst.xml.core.internal.document.ElementImpl;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
-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 org.w3c.dom.Text;
-import org.xml.sax.InputSource;
-
-import java.io.BufferedInputStream;
-import java.io.ByteArrayInputStream;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.UnsupportedEncodingException;
-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;
-
-/**
- * Helper class to deal with SWT specifics for the resources.
- */
-@SuppressWarnings("restriction") // XML model
-public class ResourceHelper {
-
-    private final static Map<Class<?>, Image> sIconMap = new HashMap<Class<?>, Image>(
-            FolderConfiguration.getQualifierCount());
-
-    static {
-        try {
-            IconFactory factory = IconFactory.getInstance();
-            sIconMap.put(CountryCodeQualifier.class,        factory.getIcon("mcc")); //$NON-NLS-1$
-            sIconMap.put(NetworkCodeQualifier.class,        factory.getIcon("mnc")); //$NON-NLS-1$
-            sIconMap.put(LocaleQualifier.class,             factory.getIcon("language")); //$NON-NLS-1$
-            sIconMap.put(LayoutDirectionQualifier.class,    factory.getIcon("bidi")); //$NON-NLS-1$
-            sIconMap.put(ScreenSizeQualifier.class,         factory.getIcon("size")); //$NON-NLS-1$
-            sIconMap.put(ScreenRatioQualifier.class,        factory.getIcon("ratio")); //$NON-NLS-1$
-            sIconMap.put(ScreenOrientationQualifier.class,  factory.getIcon("orientation")); //$NON-NLS-1$
-            sIconMap.put(UiModeQualifier.class,             factory.getIcon("dockmode")); //$NON-NLS-1$
-            sIconMap.put(NightModeQualifier.class,          factory.getIcon("nightmode")); //$NON-NLS-1$
-            sIconMap.put(DensityQualifier.class,            factory.getIcon("dpi")); //$NON-NLS-1$
-            sIconMap.put(TouchScreenQualifier.class,        factory.getIcon("touch")); //$NON-NLS-1$
-            sIconMap.put(KeyboardStateQualifier.class,      factory.getIcon("keyboard")); //$NON-NLS-1$
-            sIconMap.put(TextInputMethodQualifier.class,    factory.getIcon("text_input")); //$NON-NLS-1$
-            sIconMap.put(NavigationStateQualifier.class,    factory.getIcon("navpad")); //$NON-NLS-1$
-            sIconMap.put(NavigationMethodQualifier.class,   factory.getIcon("navpad")); //$NON-NLS-1$
-            sIconMap.put(ScreenDimensionQualifier.class,    factory.getIcon("dimension")); //$NON-NLS-1$
-            sIconMap.put(VersionQualifier.class,            factory.getIcon("version")); //$NON-NLS-1$
-            sIconMap.put(ScreenWidthQualifier.class,        factory.getIcon("width")); //$NON-NLS-1$
-            sIconMap.put(ScreenHeightQualifier.class,       factory.getIcon("height")); //$NON-NLS-1$
-            sIconMap.put(SmallestScreenWidthQualifier.class,factory.getIcon("swidth")); //$NON-NLS-1$
-        } catch (Throwable t) {
-            AdtPlugin.log(t , null);
-        }
-    }
-
-    /**
-     * Returns the icon for the qualifier.
-     */
-    public static Image getIcon(Class<? extends ResourceQualifier> theClass) {
-        return sIconMap.get(theClass);
-    }
-
-    /**
-     * Returns a {@link ResourceDeltaKind} from an {@link IResourceDelta} value.
-     * @param kind a {@link IResourceDelta} integer constant.
-     * @return a matching {@link ResourceDeltaKind} or null.
-     *
-     * @see IResourceDelta#ADDED
-     * @see IResourceDelta#REMOVED
-     * @see IResourceDelta#CHANGED
-     */
-    public static ResourceDeltaKind getResourceDeltaKind(int kind) {
-        switch (kind) {
-            case IResourceDelta.ADDED:
-                return ResourceDeltaKind.ADDED;
-            case IResourceDelta.REMOVED:
-                return ResourceDeltaKind.REMOVED;
-            case IResourceDelta.CHANGED:
-                return ResourceDeltaKind.CHANGED;
-        }
-
-        return null;
-    }
-
-    /**
-     * Is this a resource that can be defined in any file within the "values" folder?
-     * <p>
-     * Some resource types can be defined <b>both</b> as a separate XML file as well
-     * as defined within a value XML file. This method will return true for these types
-     * as well. In other words, a ResourceType can return true for both
-     * {@link #isValueBasedResourceType} and {@link #isFileBasedResourceType}.
-     *
-     * @param type the resource type to check
-     * @return true if the given resource type can be represented as a value under the
-     *         values/ folder
-     */
-    public static boolean isValueBasedResourceType(ResourceType type) {
-        List<ResourceFolderType> folderTypes = FolderTypeRelationship.getRelatedFolders(type);
-        for (ResourceFolderType folderType : folderTypes) {
-            if (folderType == ResourceFolderType.VALUES) {
-                return true;
-            }
-        }
-
-        return false;
-    }
-
-    /**
-     * Is this a resource that is defined in a file named by the resource plus the XML
-     * extension?
-     * <p>
-     * Some resource types can be defined <b>both</b> as a separate XML file as well as
-     * defined within a value XML file along with other properties. This method will
-     * return true for these resource types as well. In other words, a ResourceType can
-     * return true for both {@link #isValueBasedResourceType} and
-     * {@link #isFileBasedResourceType}.
-     *
-     * @param type the resource type to check
-     * @return true if the given resource type is stored in a file named by the resource
-     */
-    public static boolean isFileBasedResourceType(ResourceType type) {
-        List<ResourceFolderType> folderTypes = FolderTypeRelationship.getRelatedFolders(type);
-        for (ResourceFolderType folderType : folderTypes) {
-            if (folderType != ResourceFolderType.VALUES) {
-
-                if (type == ResourceType.ID) {
-                    // The folder types for ID is not only VALUES but also
-                    // LAYOUT and MENU. However, unlike resources, they are only defined
-                    // inline there so for the purposes of isFileBasedResourceType
-                    // (where the intent is to figure out files that are uniquely identified
-                    // by a resource's name) this method should return false anyway.
-                    return false;
-                }
-
-                return true;
-            }
-        }
-
-        return false;
-    }
-
-    /**
-     * Returns true if this class can create the given resource
-     *
-     * @param resource the resource to be created
-     * @return true if the {@link #createResource} method can create this resource
-     */
-    public static boolean canCreateResource(String resource) {
-        // Cannot create framework resources
-        if (resource.startsWith(ANDROID_PREFIX)) {
-            return false;
-        }
-
-        ResourceUrl parsed = ResourceUrl.parse(resource);
-        if (parsed != null) {
-            if (parsed.framework) {
-                return false;
-            }
-            ResourceType type = parsed.type;
-            String name = parsed.name;
-
-            // Make sure the name is valid
-            ResourceNameValidator validator =
-                ResourceNameValidator.create(false, (Set<String>) null /* existing */, type);
-            if (validator.isValid(name) != null) {
-                return false;
-            }
-
-            return canCreateResourceType(type);
-        }
-
-        return false;
-    }
-
-    /**
-     * Returns true if this class can create resources of the given resource
-     * type
-     *
-     * @param type the type of resource to be created
-     * @return true if the {@link #createResource} method can create resources
-     *         of this type (provided the name parameter is also valid)
-     */
-    public static boolean canCreateResourceType(ResourceType type) {
-        // We can create all value types
-        if (isValueBasedResourceType(type)) {
-            return true;
-        }
-
-        // We can create -some- file-based types - those supported by the New XML wizard:
-        for (ResourceFolderType folderType : FolderTypeRelationship.getRelatedFolders(type)) {
-            if (NewXmlFileWizard.canCreateXmlFile(folderType)) {
-                return true;
-            }
-        }
-
-        return false;
-    }
-
-    /** Creates a file-based resource, like a layout. Used by {@link #createResource} */
-    private static Pair<IFile,IRegion> createFileResource(IProject project, ResourceType type,
-            String name) {
-
-        ResourceFolderType folderType = null;
-        for (ResourceFolderType f : FolderTypeRelationship.getRelatedFolders(type)) {
-            if (NewXmlFileWizard.canCreateXmlFile(f)) {
-                folderType = f;
-                break;
-            }
-        }
-        if (folderType == null) {
-            return null;
-        }
-
-        // Find "dimens.xml" file in res/values/ (or corresponding name for other
-        // value types)
-        IPath projectPath = new Path(FD_RESOURCES + WS_SEP + folderType.getName() + WS_SEP
-            + name + '.' + EXT_XML);
-        IFile file = project.getFile(projectPath);
-        return NewXmlFileWizard.createXmlFile(project, file, folderType);
-    }
-
-    /**
-     * Creates a resource of a given type, name and (if applicable) value
-     *
-     * @param project the project to contain the resource
-     * @param type the type of resource
-     * @param name the name of the resource
-     * @param value the value of the resource, if it is a value-type resource
-     * @return a pair of the file containing the resource and a region where the value
-     *         appears
-     */
-    public static Pair<IFile,IRegion> createResource(IProject project, ResourceType type,
-            String name, String value) {
-        if (!isValueBasedResourceType(type)) {
-            return createFileResource(project, type, name);
-        }
-
-        // Find "dimens.xml" file in res/values/ (or corresponding name for other
-        // value types)
-        String typeName = type.getName();
-        String fileName = typeName + 's';
-        String projectPath = FD_RESOURCES + WS_SEP + FD_RES_VALUES + WS_SEP
-            + fileName + '.' + EXT_XML;
-        Object editRequester = project;
-        IResource member = project.findMember(projectPath);
-        String tagName = Hyperlinks.getTagName(type);
-        boolean createEmptyTag = type == ResourceType.ID;
-        if (member != null) {
-            if (member instanceof IFile) {
-                IFile file = (IFile) member;
-                // File exists: Must add item to the XML
-                IModelManager manager = StructuredModelManager.getModelManager();
-                IStructuredModel model = null;
-                try {
-                    model = manager.getExistingModelForEdit(file);
-                    if (model == null) {
-                        model = manager.getModelForEdit(file);
-                    }
-                    if (model instanceof IDOMModel) {
-                        model.beginRecording(editRequester, String.format("Add %1$s",
-                                type.getDisplayName()));
-                        IDOMModel domModel = (IDOMModel) model;
-                        Document document = domModel.getDocument();
-                        Element root = document.getDocumentElement();
-                        IStructuredDocument structuredDocument = model.getStructuredDocument();
-                        Node lastElement = null;
-                        NodeList childNodes = root.getChildNodes();
-                        String indent = null;
-                        for (int i = childNodes.getLength() - 1; i >= 0; i--) {
-                            Node node = childNodes.item(i);
-                            if (node.getNodeType() == Node.ELEMENT_NODE) {
-                                lastElement = node;
-                                indent = AndroidXmlEditor.getIndent(structuredDocument, node);
-                                break;
-                            }
-                        }
-                        if (indent == null || indent.length() == 0) {
-                            indent = "    "; //$NON-NLS-1$
-                        }
-                        Node nextChild = lastElement != null ? lastElement.getNextSibling() : null;
-                        Text indentNode = document.createTextNode('\n' + indent);
-                        root.insertBefore(indentNode, nextChild);
-                        Element element = document.createElement(tagName);
-                        if (createEmptyTag) {
-                            if (element instanceof ElementImpl) {
-                                ElementImpl elementImpl = (ElementImpl) element;
-                                elementImpl.setEmptyTag(true);
-                            }
-                        }
-                        element.setAttribute(ATTR_NAME, name);
-                        if (!tagName.equals(typeName)) {
-                            element.setAttribute(ATTR_TYPE, typeName);
-                        }
-                        root.insertBefore(element, nextChild);
-                        IRegion region = null;
-
-                        if (createEmptyTag) {
-                            IndexedRegion domRegion = VisualRefactoring.getRegion(element);
-                            int endOffset = domRegion.getEndOffset();
-                            region = new Region(endOffset, 0);
-                        } else {
-                            Node valueNode = document.createTextNode(value);
-                            element.appendChild(valueNode);
-
-                            IndexedRegion domRegion = VisualRefactoring.getRegion(valueNode);
-                            int startOffset = domRegion.getStartOffset();
-                            int length = domRegion.getLength();
-                            region = new Region(startOffset, length);
-                        }
-                        model.save();
-                        return Pair.of(file, region);
-                    }
-                } catch (Exception e) {
-                    AdtPlugin.log(e, "Cannot access XML value model");
-                } finally {
-                    if (model != null) {
-                        model.endRecording(editRequester);
-                        model.releaseFromEdit();
-                    }
-                }
-            }
-
-            return null;
-        } else {
-            // No such file exists: just create it
-            String prolog = "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n"; //$NON-NLS-1$
-            StringBuilder sb = new StringBuilder(prolog);
-
-            String root = TAG_RESOURCES;
-            sb.append('<').append(root).append('>').append('\n');
-            sb.append("    "); //$NON-NLS-1$
-            sb.append('<');
-            sb.append(tagName);
-            sb.append(" name=\""); //$NON-NLS-1$
-            sb.append(name);
-            sb.append('"');
-            if (!tagName.equals(typeName)) {
-                sb.append(" type=\""); //$NON-NLS-1$
-                sb.append(typeName);
-                sb.append('"');
-            }
-            int start, end;
-            if (createEmptyTag) {
-                sb.append("/>");                             //$NON-NLS-1$
-                start = sb.length();
-                end = sb.length();
-            } else {
-                sb.append('>');
-                start = sb.length();
-                sb.append(value);
-                end = sb.length();
-                sb.append('<').append('/');
-                sb.append(tagName);
-                sb.append('>');
-            }
-            sb.append('\n').append('<').append('/').append(root).append('>').append('\n');
-            String result = sb.toString();
-            // TODO: Pretty print string (wait until that CL is integrated)
-            String error = null;
-            try {
-                byte[] buf = result.getBytes("UTF8");    //$NON-NLS-1$
-                InputStream stream = new ByteArrayInputStream(buf);
-                IFile file = project.getFile(new Path(projectPath));
-                file.create(stream, true /*force*/, null /*progress*/);
-                IRegion region = new Region(start, end - start);
-                return Pair.of(file, region);
-            } catch (UnsupportedEncodingException e) {
-                error = e.getMessage();
-            } catch (CoreException e) {
-                error = e.getMessage();
-            }
-
-            error = String.format("Failed to generate %1$s: %2$s", name, error);
-            AdtPlugin.displayError("New Android XML File", error);
-        }
-        return null;
-    }
-
-    /**
-     * Returns the theme name to be shown for theme styles, e.g. for "@style/Theme" it
-     * returns "Theme"
-     *
-     * @param style a theme style string
-     * @return the user visible theme name
-     */
-    public static String styleToTheme(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());
-        } else if (style.startsWith(PREFIX_RESOURCE_REF)) {
-            // @package:style/foo
-            int index = style.indexOf('/');
-            if (index != -1) {
-                style = style.substring(index + 1);
-            }
-        }
-        return style;
-    }
-
-    /**
-     * Returns true if the given style represents a project theme
-     *
-     * @param style a theme style string
-     * @return true if the style string represents a project theme, as opposed
-     *         to a framework theme
-     */
-    public static boolean isProjectStyle(String style) {
-        assert style.startsWith(STYLE_RESOURCE_PREFIX)
-            || style.startsWith(ANDROID_STYLE_RESOURCE_PREFIX) : style;
-
-        return style.startsWith(STYLE_RESOURCE_PREFIX);
-    }
-
-    /**
-     * Returns the layout resource name for the given layout file, e.g. for
-     * /res/layout/foo.xml returns foo.
-     *
-     * @param layoutFile the layout file whose name we want to look up
-     * @return the layout name
-     */
-    public static String getLayoutName(IFile layoutFile) {
-        String layoutName = layoutFile.getName();
-        int dotIndex = layoutName.indexOf('.');
-        if (dotIndex != -1) {
-            layoutName = layoutName.substring(0, dotIndex);
-        }
-        return layoutName;
-    }
-
-    /**
-     * Tries to resolve the given resource value to an actual RGB color. For state lists
-     * it will pick the simplest/fallback color.
-     *
-     * @param resources the resource resolver to use to follow color references
-     * @param color the color to resolve
-     * @return the corresponding {@link RGB} color, or null
-     */
-    public static RGB resolveColor(ResourceResolver resources, ResourceValue color) {
-        color = resources.resolveResValue(color);
-        if (color == null) {
-            return null;
-        }
-        String value = color.getValue();
-
-        while (value != null) {
-            if (value.startsWith("#")) { //$NON-NLS-1$
-                try {
-                    int rgba = ImageUtils.getColor(value);
-                    // Drop alpha channel
-                    return ImageUtils.intToRgb(rgba);
-                } catch (NumberFormatException nfe) {
-                    // Pass
-                }
-                return null;
-            }
-            if (value.startsWith(PREFIX_RESOURCE_REF)) {
-                boolean isFramework = color.isFramework();
-                color = resources.findResValue(value, isFramework);
-                if (color != null) {
-                    value = color.getValue();
-                } else {
-                    break;
-                }
-            } else {
-                File file = new File(value);
-                if (file.exists() && file.getName().endsWith(DOT_XML)) {
-                    // Parse
-                    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
-                    BufferedInputStream bis = null;
-                    try {
-                        bis = new BufferedInputStream(new FileInputStream(file));
-                        InputSource is = new InputSource(bis);
-                        factory.setNamespaceAware(true);
-                        factory.setValidating(false);
-                        DocumentBuilder builder = factory.newDocumentBuilder();
-                        Document document = builder.parse(is);
-                        NodeList items = document.getElementsByTagName(TAG_ITEM);
-
-                        value = findColorValue(items);
-                        continue;
-                    } catch (Exception e) {
-                        AdtPlugin.log(e, "Failed parsing color file %1$s", file.getName());
-                    } finally {
-                        if (bis != null) {
-                            try {
-                                bis.close();
-                            } catch (IOException e) {
-                                // Nothing useful can be done here
-                            }
-                        }
-                    }
-                }
-
-                return null;
-            }
-        }
-
-        return null;
-    }
-
-    /**
-     * Searches a color XML file for the color definition element that does not
-     * have an associated state and returns its color
-     */
-    private static String findColorValue(NodeList items) {
-        for (int i = 0, n = items.getLength(); i < n; i++) {
-            // Find non-state color definition
-            Node item = items.item(i);
-            boolean hasState = false;
-            if (item.getNodeType() == Node.ELEMENT_NODE) {
-                Element element = (Element) item;
-                if (element.hasAttributeNS(ANDROID_URI, ATTR_COLOR)) {
-                    NamedNodeMap attributes = element.getAttributes();
-                    for (int j = 0, m = attributes.getLength(); j < m; j++) {
-                        Attr attribute = (Attr) attributes.item(j);
-                        if (attribute.getLocalName().startsWith("state_")) { //$NON-NLS-1$
-                            hasState = true;
-                            break;
-                        }
-                    }
-
-                    if (!hasState) {
-                        return element.getAttributeNS(ANDROID_URI, ATTR_COLOR);
-                    }
-                }
-            }
-        }
-
-        return null;
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/resources/ResourceNameValidator.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/resources/ResourceNameValidator.java
deleted file mode 100644
index 5ea1edc..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/resources/ResourceNameValidator.java
+++ /dev/null
@@ -1,242 +0,0 @@
-/*
- * Copyright (C) 2010 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.resources;
-
-import static com.android.SdkConstants.DOT_XML;
-
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-import com.android.ide.common.resources.ResourceItem;
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.ide.eclipse.adt.internal.editors.layout.gle2.ImageUtils;
-import com.android.ide.eclipse.adt.internal.resources.manager.ProjectResources;
-import com.android.ide.eclipse.adt.internal.resources.manager.ResourceManager;
-import com.android.resources.ResourceFolderType;
-import com.android.resources.ResourceType;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.jdt.core.JavaConventions;
-import org.eclipse.jface.dialogs.IInputValidator;
-
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.Set;
-
-/**
- * Validator which ensures that new Android resource names are valid.
- */
-public class ResourceNameValidator implements IInputValidator {
-    /** Set of existing names to check for conflicts with */
-    private Set<String> mExisting;
-
-    /** If true, the validated name must be unique */
-    private boolean mUnique = true;
-
-    /** If true, the validated name must exist */
-    private boolean mExist;
-
-    /**
-     * True if the resource name being considered is a "file" based resource (where the
-     * resource name is the actual file name, rather than just a value attribute inside an
-     * XML file name of arbitrary name
-     */
-    private boolean mIsFileType;
-
-    /**
-     * True if the resource type can point to image resources
-     */
-    private boolean mIsImageType;
-
-    /** If true, allow .xml as a name suffix */
-    private boolean mAllowXmlExtension;
-
-    private ResourceNameValidator(boolean allowXmlExtension, Set<String> existing,
-            boolean isFileType, boolean isImageType) {
-        mAllowXmlExtension = allowXmlExtension;
-        mExisting = existing;
-        mIsFileType = isFileType;
-        mIsImageType = isImageType;
-    }
-
-    /**
-     * Makes the resource name validator require that names are unique.
-     *
-     * @return this, for construction chaining
-     */
-    public ResourceNameValidator unique() {
-        mUnique = true;
-        mExist = false;
-
-        return this;
-    }
-
-    /**
-     * Makes the resource name validator require that names already exist
-     *
-     * @return this, for construction chaining
-     */
-    public ResourceNameValidator exist() {
-        mExist = true;
-        mUnique = false;
-
-        return this;
-    }
-
-    @Override
-    public String isValid(String newText) {
-        // IValidator has the same interface as SWT's IInputValidator
-        try {
-            if (newText == null || newText.trim().length() == 0) {
-                return "Enter a new name";
-            }
-
-            if (mAllowXmlExtension && newText.endsWith(DOT_XML)) {
-                newText = newText.substring(0, newText.length() - DOT_XML.length());
-            }
-
-            if (mAllowXmlExtension && mIsImageType
-                    && ImageUtils.hasImageExtension(newText)) {
-                newText = newText.substring(0, newText.lastIndexOf('.'));
-            }
-
-            if (!mIsFileType) {
-                newText = newText.replace('.', '_');
-            }
-
-            if (newText.indexOf('.') != -1 && !newText.endsWith(DOT_XML)) {
-                if (mIsImageType) {
-                    return "The filename must end with .xml or .png";
-                } else {
-                    return "The filename must end with .xml";
-                }
-            }
-
-            // Resource names must be valid Java identifiers, since they will
-            // be represented as Java identifiers in the R file:
-            if (!Character.isJavaIdentifierStart(newText.charAt(0))) {
-                return "The resource name must begin with a character";
-            }
-            for (int i = 1, n = newText.length(); i < n; i++) {
-                char c = newText.charAt(i);
-                if (!Character.isJavaIdentifierPart(c)) {
-                    return String.format("'%1$c' is not a valid resource name character", c);
-                }
-            }
-
-            if (mIsFileType) {
-                char first = newText.charAt(0);
-                if (!(first >= 'a' && first <= 'z')) {
-                    return String.format(
-                            "File-based resource names must start with a lowercase letter.");
-                }
-
-                // AAPT only allows lowercase+digits+_:
-                // "%s: Invalid file name: must contain only [a-z0-9_.]","
-                for (int i = 0, n = newText.length(); i < n; i++) {
-                    char c = newText.charAt(i);
-                    if (!((c >= 'a' && c <= 'z') || (c >= '0' && c <= '9') || c == '_')) {
-                        return String.format(
-                          "File-based resource names must contain only lowercase a-z, 0-9, or _.");
-                    }
-                }
-            }
-
-            String level = "1.5"; //$NON-NLS-1$
-            IStatus validIdentifier = JavaConventions.validateIdentifier(newText, level, level);
-            if (!validIdentifier.isOK()) {
-                return String.format("%1$s is not a valid name (reserved Java keyword)", newText);
-            }
-
-
-            if (mExisting != null && (mUnique || mExist)) {
-                boolean exists = mExisting.contains(newText);
-                if (mUnique && exists) {
-                    return String.format("%1$s already exists", newText);
-                } else if (mExist && !exists) {
-                    return String.format("%1$s does not exist", newText);
-                }
-            }
-
-            return null;
-        } catch (Exception e) {
-            AdtPlugin.log(e, "Validation failed: %s", e.toString());
-            return ""; //$NON-NLS-1$
-        }
-    }
-
-    /**
-     * Creates a new {@link ResourceNameValidator}
-     *
-     * @param allowXmlExtension if true, allow .xml to be entered as a suffix for the
-     *            resource name
-     * @param type the resource type of the resource name being validated
-     * @return a new {@link ResourceNameValidator}
-     */
-    public static ResourceNameValidator create(boolean allowXmlExtension,
-            ResourceFolderType type) {
-        boolean isFileType = type != ResourceFolderType.VALUES;
-        return new ResourceNameValidator(allowXmlExtension, null, isFileType,
-                type == ResourceFolderType.DRAWABLE);
-    }
-
-    /**
-     * Creates a new {@link ResourceNameValidator}
-     *
-     * @param allowXmlExtension if true, allow .xml to be entered as a suffix for the
-     *            resource name
-     * @param existing An optional set of names that already exist (and therefore will not
-     *            be considered valid if entered as the new name)
-     * @param type the resource type of the resource name being validated
-     * @return a new {@link ResourceNameValidator}
-     */
-    public static ResourceNameValidator create(boolean allowXmlExtension, Set<String> existing,
-            ResourceType type) {
-        boolean isFileType = ResourceHelper.isFileBasedResourceType(type);
-        return new ResourceNameValidator(allowXmlExtension, existing, isFileType,
-                type == ResourceType.DRAWABLE).unique();
-    }
-
-    /**
-     * Creates a new {@link ResourceNameValidator}. By default, the name will need to be
-     * unique in the project.
-     *
-     * @param allowXmlExtension if true, allow .xml to be entered as a suffix for the
-     *            resource name
-     * @param project the project to validate new resource names for
-     * @param type the resource type of the resource name being validated
-     * @return a new {@link ResourceNameValidator}
-     */
-    public static ResourceNameValidator create(boolean allowXmlExtension,
-            @Nullable IProject project,
-            @NonNull ResourceType type) {
-        Set<String> existing = null;
-        if (project != null) {
-            existing = new HashSet<String>();
-            ResourceManager manager = ResourceManager.getInstance();
-            ProjectResources projectResources = manager.getProjectResources(project);
-            Collection<ResourceItem> items = projectResources.getResourceItemsOfType(type);
-            for (ResourceItem item : items) {
-                existing.add(item.getName());
-            }
-        }
-
-        boolean isFileType = ResourceHelper.isFileBasedResourceType(type);
-        return new ResourceNameValidator(allowXmlExtension, existing, isFileType,
-                type == ResourceType.DRAWABLE);
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/resources/manager/CompiledResourcesMonitor.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/resources/manager/CompiledResourcesMonitor.java
deleted file mode 100644
index ab5ae40..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/resources/manager/CompiledResourcesMonitor.java
+++ /dev/null
@@ -1,313 +0,0 @@
-/*
- * Copyright (C) 2007 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.resources.manager;
-
-import com.android.SdkConstants;
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-import com.android.ide.common.resources.IntArrayWrapper;
-import com.android.ide.common.xml.ManifestData;
-import com.android.ide.eclipse.adt.AdtConstants;
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.ide.eclipse.adt.internal.project.AndroidManifestHelper;
-import com.android.ide.eclipse.adt.internal.project.ProjectHelper;
-import com.android.ide.eclipse.adt.internal.resources.manager.GlobalProjectMonitor.IFileListener;
-import com.android.ide.eclipse.adt.internal.resources.manager.GlobalProjectMonitor.IProjectListener;
-import com.android.resources.ResourceType;
-import com.android.util.Pair;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IMarkerDelta;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IResourceDelta;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IStatus;
-
-import java.io.File;
-import java.lang.reflect.Field;
-import java.lang.reflect.Modifier;
-import java.util.EnumMap;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.regex.Pattern;
-
-/**
- * A monitor for the compiled resources. This only monitors changes in the resources of type
- *  {@link ResourceType#ID}.
- */
-public final class CompiledResourcesMonitor implements IFileListener, IProjectListener {
-
-    private final static CompiledResourcesMonitor sThis = new CompiledResourcesMonitor();
-
-    /**
-     * Sets up the monitoring system.
-     * @param monitor The main Resource Monitor.
-     */
-    public static void setupMonitor(GlobalProjectMonitor monitor) {
-        monitor.addFileListener(sThis, IResourceDelta.ADDED | IResourceDelta.CHANGED);
-        monitor.addProjectListener(sThis);
-    }
-
-    /**
-     * private constructor to prevent construction.
-     */
-    private CompiledResourcesMonitor() {
-    }
-
-
-    /* (non-Javadoc)
-     * Sent when a file changed : if the file is the R class, then it is parsed again to update
-     * the internal data.
-     *
-     * @param file The file that changed.
-     * @param markerDeltas The marker deltas for the file.
-     * @param kind The change kind. This is equivalent to
-     * {@link IResourceDelta#accept(IResourceDeltaVisitor)}
-     *
-     * @see IFileListener#fileChanged
-     */
-    @Override
-    public void fileChanged(@NonNull IFile file, @NonNull IMarkerDelta[] markerDeltas,
-            int kind, @Nullable String extension, int flags, boolean isAndroidProject) {
-        if (!isAndroidProject || flags == IResourceDelta.MARKERS) {
-            // Not Android or only the markers changed: not relevant
-            return;
-        }
-
-        IProject project = file.getProject();
-
-        if (file.getName().equals(SdkConstants.FN_COMPILED_RESOURCE_CLASS)) {
-            // create the classname
-            String className = getRClassName(project);
-            if (className == null) {
-                // We need to abort.
-                AdtPlugin.log(IStatus.ERROR,
-                        "fileChanged: failed to find manifest package for project %1$s", //$NON-NLS-1$
-                        project.getName());
-                return;
-            }
-            // path will begin with /projectName/bin/classes so we'll ignore that
-            IPath relativeClassPath = file.getFullPath().removeFirstSegments(3);
-            if (packagePathMatches(relativeClassPath.toString(), className)) {
-                loadAndParseRClass(project, className);
-            }
-        }
-    }
-
-    /**
-     * Check to see if the package section of the given path matches the packageName.
-     * For example, /project/bin/classes/com/foo/app/R.class should match com.foo.app.R
-     * @param path the pathname of the file to look at
-     * @param packageName the package qualified name of the class
-     * @return true if the package section of the path matches the package qualified name
-     */
-    private boolean packagePathMatches(String path, String packageName) {
-        // First strip the ".class" off the end of the path
-        String pathWithoutExtension = path.substring(0, path.indexOf(SdkConstants.DOT_CLASS));
-
-        // then split the components of each path by their separators
-        String [] pathArray = pathWithoutExtension.split(Pattern.quote(File.separator));
-        String [] packageArray = packageName.split(AdtConstants.RE_DOT);
-
-
-        int pathIndex = 0;
-        int packageIndex = 0;
-
-        while (pathIndex < pathArray.length && packageIndex < packageArray.length) {
-            if (pathArray[pathIndex].equals(packageArray[packageIndex]) == false) {
-                return false;
-            }
-            pathIndex++;
-            packageIndex++;
-        }
-        // We may have matched all the way up to this point, but we're not sure it's a match
-        // unless BOTH paths done
-        return (pathIndex == pathArray.length && packageIndex == packageArray.length);
-    }
-
-    /**
-     * Processes project close event.
-     */
-    @Override
-    public void projectClosed(IProject project) {
-        // the ProjectResources object will be removed by the ResourceManager.
-    }
-
-    /**
-     * Processes project delete event.
-     */
-    @Override
-    public void projectDeleted(IProject project) {
-        // the ProjectResources object will be removed by the ResourceManager.
-    }
-
-    /**
-     * Processes project open event.
-     */
-    @Override
-    public void projectOpened(IProject project) {
-        // when the project is opened, we get an ADDED event for each file, so we don't
-        // need to do anything here.
-    }
-
-    @Override
-    public void projectRenamed(IProject project, IPath from) {
-        // renamed projects also trigger delete/open event,
-        // so nothing to be done here.
-    }
-
-    /**
-     * Processes existing project at init time.
-     */
-    @Override
-    public void projectOpenedWithWorkspace(IProject project) {
-        try {
-            // check this is an android project
-            if (project.hasNature(AdtConstants.NATURE_DEFAULT)) {
-                String className = getRClassName(project);
-                // Find the classname
-                if (className == null) {
-                    // We need to abort.
-                    AdtPlugin.log(IStatus.ERROR,
-                            "projectOpenedWithWorkspace: failed to find manifest package for project %1$s", //$NON-NLS-1$
-                            project.getName());
-                    return;
-                }
-                loadAndParseRClass(project, className);
-            }
-        } catch (CoreException e) {
-            // pass
-        }
-    }
-
-    @Override
-    public void allProjectsOpenedWithWorkspace() {
-        // nothing to do.
-    }
-
-
-    private void loadAndParseRClass(IProject project, String className) {
-        try {
-            // first check there's a ProjectResources to store the content
-            ProjectResources projectResources = ResourceManager.getInstance().getProjectResources(
-                    project);
-
-            if (projectResources != null) {
-                // create a temporary class loader to load the class
-                ProjectClassLoader loader = new ProjectClassLoader(null /* parentClassLoader */,
-                        project);
-
-                try {
-                    Class<?> clazz = loader.loadClass(className);
-
-                    if (clazz != null) {
-                        // create the maps to store the result of the parsing
-                        Map<ResourceType, Map<String, Integer>> resourceValueMap =
-                            new EnumMap<ResourceType, Map<String, Integer>>(ResourceType.class);
-                        Map<Integer, Pair<ResourceType, String>> genericValueToNameMap =
-                            new HashMap<Integer, Pair<ResourceType, String>>();
-                        Map<IntArrayWrapper, String> styleableValueToNameMap =
-                            new HashMap<IntArrayWrapper, String>();
-
-                        // parse the class
-                        if (parseClass(clazz, genericValueToNameMap, styleableValueToNameMap,
-                                resourceValueMap)) {
-                            // now we associate the maps to the project.
-                            projectResources.setCompiledResources(genericValueToNameMap,
-                                    styleableValueToNameMap, resourceValueMap);
-                        }
-                    }
-                } catch (Error e) {
-                    // Log this error with the class name we're trying to load and abort.
-                    AdtPlugin.log(e, "loadAndParseRClass failed to find class %1$s", className); //$NON-NLS-1$
-                }
-            }
-        } catch (ClassNotFoundException e) {
-            // pass
-        }
-    }
-
-    /**
-     * Parses a R class, and fills maps.
-     * @param rClass the class to parse
-     * @param genericValueToNameMap
-     * @param styleableValueToNameMap
-     * @param resourceValueMap
-     * @return True if we managed to parse the R class.
-     */
-    private boolean parseClass(Class<?> rClass,
-            Map<Integer, Pair<ResourceType, String>> genericValueToNameMap,
-            Map<IntArrayWrapper, String> styleableValueToNameMap, Map<ResourceType,
-            Map<String, Integer>> resourceValueMap) {
-        try {
-            for (Class<?> inner : rClass.getDeclaredClasses()) {
-                String resTypeName = inner.getSimpleName();
-                ResourceType resType = ResourceType.getEnum(resTypeName);
-
-                if (resType != null) {
-                    Map<String, Integer> fullMap = new HashMap<String, Integer>();
-                    resourceValueMap.put(resType, fullMap);
-
-                    for (Field f : inner.getDeclaredFields()) {
-                        // only process static final fields.
-                        int modifiers = f.getModifiers();
-                        if (Modifier.isStatic(modifiers)) {
-                            Class<?> type = f.getType();
-                            if (type.isArray() && type.getComponentType() == int.class) {
-                                // if the object is an int[] we put it in the styleable map
-                                styleableValueToNameMap.put(
-                                        new IntArrayWrapper((int[]) f.get(null)),
-                                        f.getName());
-                            } else if (type == int.class) {
-                                Integer value = (Integer) f.get(null);
-                                genericValueToNameMap.put(value, Pair.of(resType, f.getName()));
-                                fullMap.put(f.getName(), value);
-                            } else {
-                                assert false;
-                            }
-                        }
-                    }
-                }
-            }
-
-            return true;
-        } catch (IllegalArgumentException e) {
-        } catch (IllegalAccessException e) {
-        }
-        return false;
-    }
-
-    /**
-     * Returns the class name of the R class, based on the project's manifest's package.
-     *
-     * @return A class name (e.g. "my.app.R") or null if there's no valid package in the manifest.
-     */
-    private String getRClassName(IProject project) {
-        IFile manifestFile = ProjectHelper.getManifest(project);
-        if (manifestFile != null && manifestFile.isSynchronized(IResource.DEPTH_ZERO)) {
-            ManifestData data = AndroidManifestHelper.parseForData(manifestFile);
-            if (data != null) {
-                String javaPackage = data.getPackage();
-                return javaPackage + ".R"; //$NON-NLS-1$
-            }
-        }
-        return null;
-    }
-
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/resources/manager/DynamicIdMap.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/resources/manager/DynamicIdMap.java
deleted file mode 100644
index 7bab4fd..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/resources/manager/DynamicIdMap.java
+++ /dev/null
@@ -1,75 +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.ide.eclipse.adt.internal.resources.manager;
-
-import com.android.resources.ResourceType;
-import com.android.util.Pair;
-import com.android.utils.SparseArray;
-
-import java.util.HashMap;
-import java.util.Map;
-
-public class DynamicIdMap {
-
-    private final Map<Pair<ResourceType, String>, Integer> mDynamicIds = new HashMap<Pair<ResourceType, String>, Integer>();
-    private final SparseArray<Pair<ResourceType, String>> mRevDynamicIds = new SparseArray<Pair<ResourceType, String>>();
-    private int mDynamicSeed;
-
-    public DynamicIdMap(int seed) {
-        mDynamicSeed = seed;
-    }
-
-    public void reset(int seed) {
-        mDynamicIds.clear();
-        mRevDynamicIds.clear();
-        mDynamicSeed = seed;
-    }
-
-    /**
-     * Returns a dynamic integer for the given resource type/name, creating it if it doesn't
-     * already exist.
-     *
-     * @param type the type of the resource
-     * @param name the name of the resource
-     * @return an integer.
-     */
-    public Integer getId(ResourceType type, String name) {
-        return getId(Pair.of(type, name));
-    }
-
-    /**
-     * Returns a dynamic integer for the given resource type/name, creating it if it doesn't
-     * already exist.
-     *
-     * @param resource the type/name of the resource
-     * @return an integer.
-     */
-    public Integer getId(Pair<ResourceType, String> resource) {
-        Integer value = mDynamicIds.get(resource);
-        if (value == null) {
-            value = Integer.valueOf(++mDynamicSeed);
-            mDynamicIds.put(resource, value);
-            mRevDynamicIds.put(value, resource);
-        }
-
-        return value;
-    }
-
-    public Pair<ResourceType, String> resolveId(int id) {
-        return mRevDynamicIds.get(id);
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/resources/manager/GlobalProjectMonitor.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/resources/manager/GlobalProjectMonitor.java
deleted file mode 100644
index 674a601..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/resources/manager/GlobalProjectMonitor.java
+++ /dev/null
@@ -1,546 +0,0 @@
-/*
- * Copyright (C) 2007 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.resources.manager;
-
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-import com.android.ide.common.resources.ResourceFile;
-import com.android.ide.common.resources.ResourceFolder;
-import com.android.ide.eclipse.adt.AdtConstants;
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.ide.eclipse.adt.internal.project.BaseProjectHelper;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IFolder;
-import org.eclipse.core.resources.IMarkerDelta;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IResourceChangeEvent;
-import org.eclipse.core.resources.IResourceChangeListener;
-import org.eclipse.core.resources.IResourceDelta;
-import org.eclipse.core.resources.IResourceDeltaVisitor;
-import org.eclipse.core.resources.IWorkspace;
-import org.eclipse.core.resources.IWorkspaceRoot;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.jdt.core.IJavaModel;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.JavaCore;
-
-import java.util.ArrayList;
-
-/**
- * The Global Project Monitor tracks project file changes, and forward them to simple project,
- * file, and folder listeners.
- * Those listeners can be setup with masks to listen to particular events.
- * <p/>
- * To track project resource changes, use the monitor in the {@link ResourceManager}. It is more
- * efficient and while the global ProjectMonitor can track any file, deleted resource files
- * cannot be matched to previous {@link ResourceFile} or {@link ResourceFolder} objects by the
- * time the listeners get the event notifications.
- *
- * @see IProjectListener
- * @see IFolderListener
- * @see IFileListener
- */
-public final class GlobalProjectMonitor {
-
-    private final static GlobalProjectMonitor sThis = new GlobalProjectMonitor();
-
-    /**
-     * Classes which implement this interface provide a method that deals
-     * with file change events.
-     */
-    public interface IFileListener {
-        /**
-         * Sent when a file changed.
-         *
-         * @param file The file that changed.
-         * @param markerDeltas The marker deltas for the file.
-         * @param kind The change kind. This is equivalent to
-         *            {@link IResourceDelta#accept(IResourceDeltaVisitor)}
-         * @param extension the extension of the file or null if the file does
-         *            not have an extension
-         * @param flags the {@link IResourceDelta#getFlags()} value with details
-         *            on what changed in the file
-         * @param isAndroidProject whether the parent project is an Android Project
-         */
-        public void fileChanged(@NonNull IFile file, @NonNull IMarkerDelta[] markerDeltas,
-                int kind, @Nullable String extension, int flags, boolean isAndroidProject);
-    }
-
-    /**
-     * Classes which implements this interface provide methods dealing with project events.
-     */
-    public interface IProjectListener {
-        /**
-         * Sent for each opened android project at the time the listener is put in place.
-         * @param project the opened project.
-         */
-        public void projectOpenedWithWorkspace(IProject project);
-
-        /**
-         * Sent once after all Android projects have been opened,
-         * at the time the listener is put in place.
-         * <p/>
-         * This is called after {@link #projectOpenedWithWorkspace(IProject)} has
-         * been called on all known Android projects.
-         */
-        public void allProjectsOpenedWithWorkspace();
-
-        /**
-         * Sent when a project is opened.
-         * @param project the project being opened.
-         */
-        public void projectOpened(IProject project);
-
-        /**
-         * Sent when a project is closed.
-         * @param project the project being closed.
-         */
-        public void projectClosed(IProject project);
-
-        /**
-         * Sent when a project is deleted.
-         * @param project the project about to be deleted.
-         */
-        public void projectDeleted(IProject project);
-
-        /**
-         * Sent when a project is renamed. During a project rename
-         * {@link #projectDeleted(IProject)} and {@link #projectOpened(IProject)} are also called.
-         * This is called last.
-         *
-         * @param project the new {@link IProject} object.
-         * @param from the path of the project before the rename action.
-         */
-        public void projectRenamed(IProject project, IPath from);
-    }
-
-    /**
-     * Classes which implement this interface provide a method that deals
-     * with folder change events
-     */
-    public interface IFolderListener {
-        /**
-         * Sent when a folder changed.
-         * @param folder The file that was changed
-         * @param kind The change kind. This is equivalent to {@link IResourceDelta#getKind()}
-         * @param isAndroidProject whether the parent project is an Android Project
-         */
-        public void folderChanged(IFolder folder, int kind, boolean isAndroidProject);
-    }
-
-    /**
-     * Interface for a listener to be notified when resource change event starts and ends.
-     */
-    public interface IResourceEventListener {
-        public void resourceChangeEventStart();
-        public void resourceChangeEventEnd();
-    }
-
-    /**
-     * Interface for a listener that gets passed the raw delta without processing.
-     */
-    public interface IRawDeltaListener {
-        public void visitDelta(IResourceDelta delta);
-    }
-
-    /**
-     * Base listener bundle to associate a listener to an event mask.
-     */
-    private static class ListenerBundle {
-        /** Mask value to accept all events */
-        public final static int MASK_NONE = -1;
-
-        /**
-         * Event mask. Values accepted are IResourceDelta.###
-         * @see IResourceDelta#ADDED
-         * @see IResourceDelta#REMOVED
-         * @see IResourceDelta#CHANGED
-         * @see IResourceDelta#ADDED_PHANTOM
-         * @see IResourceDelta#REMOVED_PHANTOM
-         * */
-        int kindMask;
-    }
-
-    /**
-     * Listener bundle for file event.
-     */
-    private static class FileListenerBundle extends ListenerBundle {
-
-        /** The file listener */
-        IFileListener listener;
-    }
-
-    /**
-     * Listener bundle for folder event.
-     */
-    private static class FolderListenerBundle extends ListenerBundle {
-        /** The file listener */
-        IFolderListener listener;
-    }
-
-    private final ArrayList<FileListenerBundle> mFileListeners =
-        new ArrayList<FileListenerBundle>();
-
-    private final ArrayList<FolderListenerBundle> mFolderListeners =
-        new ArrayList<FolderListenerBundle>();
-
-    private final ArrayList<IProjectListener> mProjectListeners = new ArrayList<IProjectListener>();
-
-    private final ArrayList<IResourceEventListener> mEventListeners =
-        new ArrayList<IResourceEventListener>();
-
-    private final ArrayList<IRawDeltaListener> mRawDeltaListeners =
-        new ArrayList<IRawDeltaListener>();
-
-    private IWorkspace mWorkspace;
-
-    private boolean mIsAndroidProject;
-
-    /**
-     * Delta visitor for resource changes.
-     */
-    private final class DeltaVisitor implements IResourceDeltaVisitor {
-
-        @Override
-        public boolean visit(IResourceDelta delta) {
-            // Find the other resource listeners to notify
-            IResource r = delta.getResource();
-            int type = r.getType();
-            if (type == IResource.FILE) {
-                int kind = delta.getKind();
-                // notify the listeners.
-                for (FileListenerBundle bundle : mFileListeners) {
-                    if (bundle.kindMask == ListenerBundle.MASK_NONE
-                            || (bundle.kindMask & kind) != 0) {
-                        try {
-                            bundle.listener.fileChanged((IFile)r, delta.getMarkerDeltas(), kind,
-                                    r.getFileExtension(), delta.getFlags(), mIsAndroidProject);
-                        } catch (Throwable t) {
-                            AdtPlugin.log(t,"Failed to call IFileListener.fileChanged");
-                        }
-                    }
-                }
-                return false;
-            } else if (type == IResource.FOLDER) {
-                int kind = delta.getKind();
-                // notify the listeners.
-                for (FolderListenerBundle bundle : mFolderListeners) {
-                    if (bundle.kindMask == ListenerBundle.MASK_NONE
-                            || (bundle.kindMask & kind) != 0) {
-                        try {
-                            bundle.listener.folderChanged((IFolder)r, kind, mIsAndroidProject);
-                        } catch (Throwable t) {
-                            AdtPlugin.log(t,"Failed to call IFileListener.folderChanged");
-                        }
-                    }
-                }
-                return true;
-            } else if (type == IResource.PROJECT) {
-                IProject project = (IProject)r;
-
-                try {
-                    mIsAndroidProject = project.hasNature(AdtConstants.NATURE_DEFAULT);
-                } catch (CoreException e) {
-                    // this can only happen if the project does not exist or is not open, neither
-                    // of which can happen here since we are processing changes in the project
-                    // or at worst a project post-open event.
-                    return false;
-                }
-
-                if (mIsAndroidProject == false) {
-                    // for non android project, skip the project listeners but return true
-                    // to visit the children and notify the IFileListeners
-                    return true;
-                }
-
-                int flags = delta.getFlags();
-
-                if ((flags & IResourceDelta.OPEN) != 0) {
-                    // the project is opening or closing.
-
-                    if (project.isOpen()) {
-                        // notify the listeners.
-                        for (IProjectListener pl : mProjectListeners) {
-                            try {
-                                pl.projectOpened(project);
-                            } catch (Throwable t) {
-                                AdtPlugin.log(t,"Failed to call IProjectListener.projectOpened");
-                            }
-                        }
-                    } else {
-                        // notify the listeners.
-                        for (IProjectListener pl : mProjectListeners) {
-                            try {
-                                pl.projectClosed(project);
-                            } catch (Throwable t) {
-                                AdtPlugin.log(t,"Failed to call IProjectListener.projectClosed");
-                            }
-                        }
-                    }
-
-                    if ((flags & IResourceDelta.MOVED_FROM) != 0) {
-                        IPath from = delta.getMovedFromPath();
-                        // notify the listeners.
-                        for (IProjectListener pl : mProjectListeners) {
-                            try {
-                                pl.projectRenamed(project, from);
-                            } catch (Throwable t) {
-                                AdtPlugin.log(t,"Failed to call IProjectListener.projectRenamed");
-                            }
-                        }
-                    }
-                }
-            }
-
-            return true;
-        }
-    }
-
-    public static GlobalProjectMonitor getMonitor() {
-        return sThis;
-    }
-
-
-    /**
-     * Starts the resource monitoring.
-     * @param ws The current workspace.
-     * @return The monitor object.
-     */
-    public static GlobalProjectMonitor startMonitoring(IWorkspace ws) {
-        if (sThis != null) {
-            ws.addResourceChangeListener(sThis.mResourceChangeListener,
-                    IResourceChangeEvent.POST_CHANGE | IResourceChangeEvent.PRE_DELETE);
-            sThis.mWorkspace = ws;
-        }
-        return sThis;
-    }
-
-    /**
-     * Stops the resource monitoring.
-     * @param ws The current workspace.
-     */
-    public static void stopMonitoring(IWorkspace ws) {
-        if (sThis != null) {
-            ws.removeResourceChangeListener(sThis.mResourceChangeListener);
-
-            synchronized (sThis) {
-                sThis.mFileListeners.clear();
-                sThis.mProjectListeners.clear();
-            }
-        }
-    }
-
-    /**
-     * Adds a file listener.
-     * @param listener The listener to receive the events.
-     * @param kindMask The event mask to filter out specific events.
-     * {@link ListenerBundle#MASK_NONE} will forward all events.
-     * See {@link ListenerBundle#kindMask} for more values.
-     */
-    public synchronized void addFileListener(IFileListener listener, int kindMask) {
-        FileListenerBundle bundle = new FileListenerBundle();
-        bundle.listener = listener;
-        bundle.kindMask = kindMask;
-
-        mFileListeners.add(bundle);
-    }
-
-    /**
-     * Removes an existing file listener.
-     * @param listener the listener to remove.
-     */
-    public synchronized void removeFileListener(IFileListener listener) {
-        for (int i = 0 ; i < mFileListeners.size() ; i++) {
-            FileListenerBundle bundle = mFileListeners.get(i);
-            if (bundle.listener == listener) {
-                mFileListeners.remove(i);
-                return;
-            }
-        }
-    }
-
-    /**
-     * Adds a folder listener.
-     * @param listener The listener to receive the events.
-     * @param kindMask The event mask to filter out specific events.
-     * {@link ListenerBundle#MASK_NONE} will forward all events.
-     * See {@link ListenerBundle#kindMask} for more values.
-     */
-    public synchronized void addFolderListener(IFolderListener listener, int kindMask) {
-        FolderListenerBundle bundle = new FolderListenerBundle();
-        bundle.listener = listener;
-        bundle.kindMask = kindMask;
-
-        mFolderListeners.add(bundle);
-    }
-
-    /**
-     * Removes an existing folder listener.
-     * @param listener the listener to remove.
-     */
-    public synchronized void removeFolderListener(IFolderListener listener) {
-        for (int i = 0 ; i < mFolderListeners.size() ; i++) {
-            FolderListenerBundle bundle = mFolderListeners.get(i);
-            if (bundle.listener == listener) {
-                mFolderListeners.remove(i);
-                return;
-            }
-        }
-    }
-
-    /**
-     * Adds a project listener.
-     * @param listener The listener to receive the events.
-     */
-    public synchronized void addProjectListener(IProjectListener listener) {
-        mProjectListeners.add(listener);
-
-        // we need to look at the opened projects and give them to the listener.
-
-        // get the list of opened android projects.
-        IWorkspaceRoot workspaceRoot = mWorkspace.getRoot();
-        IJavaModel javaModel = JavaCore.create(workspaceRoot);
-        IJavaProject[] androidProjects = BaseProjectHelper.getAndroidProjects(javaModel,
-                null /*filter*/);
-
-
-        notifyResourceEventStart();
-
-        for (IJavaProject androidProject : androidProjects) {
-            listener.projectOpenedWithWorkspace(androidProject.getProject());
-        }
-
-        listener.allProjectsOpenedWithWorkspace();
-
-        notifyResourceEventEnd();
-    }
-
-    /**
-     * Removes an existing project listener.
-     * @param listener the listener to remove.
-     */
-    public synchronized void removeProjectListener(IProjectListener listener) {
-        mProjectListeners.remove(listener);
-    }
-
-    /**
-     * Adds a resource event listener.
-     * @param listener The listener to receive the events.
-     */
-    public synchronized void addResourceEventListener(IResourceEventListener listener) {
-        mEventListeners.add(listener);
-    }
-
-    /**
-     * Removes an existing Resource Event listener.
-     * @param listener the listener to remove.
-     */
-    public synchronized void removeResourceEventListener(IResourceEventListener listener) {
-        mEventListeners.remove(listener);
-    }
-
-    /**
-     * Adds a raw delta listener.
-     * @param listener The listener to receive the deltas.
-     */
-    public synchronized void addRawDeltaListener(IRawDeltaListener listener) {
-        mRawDeltaListeners.add(listener);
-    }
-
-    /**
-     * Removes an existing Raw Delta listener.
-     * @param listener the listener to remove.
-     */
-    public synchronized void removeRawDeltaListener(IRawDeltaListener listener) {
-        mRawDeltaListeners.remove(listener);
-    }
-
-    private void notifyResourceEventStart() {
-        for (IResourceEventListener listener : mEventListeners) {
-            try {
-                listener.resourceChangeEventStart();
-            } catch (Throwable t) {
-                AdtPlugin.log(t,"Failed to call IResourceEventListener.resourceChangeEventStart");
-            }
-        }
-    }
-
-    private void notifyResourceEventEnd() {
-        for (IResourceEventListener listener : mEventListeners) {
-            try {
-                listener.resourceChangeEventEnd();
-            } catch (Throwable t) {
-                AdtPlugin.log(t,"Failed to call IResourceEventListener.resourceChangeEventEnd");
-            }
-        }
-    }
-
-    private IResourceChangeListener mResourceChangeListener = new IResourceChangeListener() {
-        /**
-         * Processes the workspace resource change events.
-         *
-         * @see IResourceChangeListener#resourceChanged(IResourceChangeEvent)
-         */
-        @Override
-        public synchronized void resourceChanged(IResourceChangeEvent event) {
-            // notify the event listeners of a start.
-            notifyResourceEventStart();
-
-            if (event.getType() == IResourceChangeEvent.PRE_DELETE) {
-                // a project is being deleted. Lets get the project object and remove
-                // its compiled resource list.
-                IResource r = event.getResource();
-                IProject project = r.getProject();
-
-                // notify the listeners.
-                for (IProjectListener pl : mProjectListeners) {
-                    try {
-                        if (project.hasNature(AdtConstants.NATURE_DEFAULT)) {
-                            try {
-                                pl.projectDeleted(project);
-                            } catch (Throwable t) {
-                                AdtPlugin.log(t,"Failed to call IProjectListener.projectDeleted");
-                            }
-                        }
-                    } catch (CoreException e) {
-                        // just ignore this project.
-                    }
-                }
-            } else {
-                // this a regular resource change. We get the delta and go through it with a visitor.
-                IResourceDelta delta = event.getDelta();
-
-                // notify the raw delta listeners
-                for (IRawDeltaListener listener : mRawDeltaListeners) {
-                    listener.visitDelta(delta);
-                }
-
-                DeltaVisitor visitor = new DeltaVisitor();
-                try {
-                    delta.accept(visitor);
-                } catch (CoreException e) {
-                }
-            }
-
-            // we're done, notify the event listeners.
-            notifyResourceEventEnd();
-        }
-    };
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/resources/manager/IdeScanningContext.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/resources/manager/IdeScanningContext.java
deleted file mode 100644
index d613249..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/resources/manager/IdeScanningContext.java
+++ /dev/null
@@ -1,234 +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.eclipse.adt.internal.resources.manager;
-
-import static com.android.SdkConstants.ANDROID_URI;
-import static com.android.ide.eclipse.adt.AdtConstants.MARKER_AAPT_COMPILE;
-import static org.eclipse.core.resources.IResource.DEPTH_ONE;
-import static org.eclipse.core.resources.IResource.DEPTH_ZERO;
-
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-import com.android.ide.common.resources.ResourceRepository;
-import com.android.ide.common.resources.ScanningContext;
-import com.android.ide.common.resources.platform.AttributeInfo;
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.ide.eclipse.adt.internal.build.AaptParser;
-import com.android.ide.eclipse.adt.internal.sdk.AndroidTargetData;
-import com.android.ide.eclipse.adt.internal.sdk.Sdk;
-import com.android.utils.Pair;
-
-import org.eclipse.core.resources.IFolder;
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.CoreException;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-/**
- * An {@link IdeScanningContext} is a specialized {@link ScanningContext} which
- * carries extra information about the scanning state, such as which file is
- * currently being scanned, and which files have been scanned in the past, such
- * that at the end of a scan we can mark and clear errors, etc.
- */
-public class IdeScanningContext extends ScanningContext {
-    private final IProject mProject;
-    private final List<IResource> mScannedResources = new ArrayList<IResource>();
-    private IResource mCurrentFile;
-    private List<Pair<IResource, String>> mErrors;
-    private Set<IProject> mFullAaptProjects;
-    private boolean mValidate;
-    private Map<String, AttributeInfo> mAttributeMap;
-    private ResourceRepository mFrameworkResources;
-
-    /**
-     * Constructs a new {@link IdeScanningContext}
-     *
-     * @param repository the associated {@link ResourceRepository}
-     * @param project the associated project
-     * @param validate if true, check that the attributes and resources are
-     *            valid and if not request a full AAPT check
-     */
-    public IdeScanningContext(@NonNull ResourceRepository repository, @NonNull IProject project,
-            boolean validate) {
-        super(repository);
-        mProject = project;
-        mValidate = validate;
-
-        Sdk sdk = Sdk.getCurrent();
-        if (sdk != null) {
-            AndroidTargetData targetData = sdk.getTargetData(project);
-            if (targetData != null) {
-                mAttributeMap = targetData.getAttributeMap();
-                mFrameworkResources = targetData.getFrameworkResources();
-            }
-        }
-    }
-
-    @Override
-    public void addError(@NonNull String error) {
-        super.addError(error);
-
-        if (mErrors == null) {
-            mErrors = new ArrayList<Pair<IResource,String>>();
-        }
-        mErrors.add(Pair.of(mCurrentFile, error));
-    }
-
-    /**
-     * Notifies the context that the given resource is about to be scanned.
-     *
-     * @param resource the resource about to be scanned
-     */
-    public void startScanning(@NonNull IResource resource) {
-        assert mCurrentFile == null : mCurrentFile;
-        mCurrentFile = resource;
-        mScannedResources.add(resource);
-    }
-
-    /**
-     * Notifies the context that the given resource has been scanned.
-     *
-     * @param resource the resource that was scanned
-     */
-    public void finishScanning(@NonNull IResource resource) {
-        assert mCurrentFile != null;
-        mCurrentFile = null;
-    }
-
-    /**
-     * Process any errors found to add error markers in the affected files (and
-     * also clear up any aapt errors in files that are no longer applicable)
-     *
-     * @param async if true, delay updating markers until the next display
-     *            thread event loop update
-     */
-    public void updateMarkers(boolean async) {
-        // Run asynchronously? This is necessary for example when adding markers
-        // as the result of a resource change notification, since at that point the
-        // resource tree is locked for modifications and attempting to create a
-        // marker will throw a org.eclipse.core.internal.resources.ResourceException.
-        if (async) {
-            AdtPlugin.getDisplay().asyncExec(new Runnable() {
-                @Override
-                public void run() {
-                    updateMarkers(false);
-                }
-            });
-            return;
-        }
-
-        // First clear out old/previous markers
-        for (IResource resource : mScannedResources) {
-            try {
-                if (resource.exists()) {
-                    int depth = resource instanceof IFolder ? DEPTH_ONE : DEPTH_ZERO;
-                    resource.deleteMarkers(MARKER_AAPT_COMPILE, true, depth);
-                }
-            } catch (CoreException ce) {
-                // Pass
-            }
-        }
-
-        // Add new errors
-        if (mErrors != null && mErrors.size() > 0) {
-            List<String> errors = new ArrayList<String>();
-            for (Pair<IResource, String> pair : mErrors) {
-                errors.add(pair.getSecond());
-            }
-            AaptParser.parseOutput(errors, mProject);
-        }
-    }
-
-    @Override
-    public boolean needsFullAapt() {
-        // returns true if it was explicitly requested or if a file that has errors was modified.
-        // This handles the case where an edit doesn't add any new id but fix a compile error.
-        return super.needsFullAapt() || hasModifiedFilesWithErrors();
-    }
-
-    /**
-     * Returns true if any of the scanned resources has an error marker on it.
-     */
-    private boolean hasModifiedFilesWithErrors() {
-        for (IResource resource : mScannedResources) {
-            try {
-                int depth = resource instanceof IFolder ? DEPTH_ONE : DEPTH_ZERO;
-                if (resource.exists()) {
-                    IMarker[] markers = resource.findMarkers(IMarker.PROBLEM,
-                            true /*includeSubtypes*/, depth);
-                    for (IMarker marker : markers) {
-                        if (marker.getAttribute(IMarker.SEVERITY, IMarker.SEVERITY_INFO) ==
-                                IMarker.SEVERITY_ERROR) {
-                            return true;
-                        }
-                    }
-                }
-            } catch (CoreException ce) {
-                // Pass
-            }
-        }
-
-        return false;
-    }
-
-    @Override
-    protected void requestFullAapt() {
-        super.requestFullAapt();
-
-        if (mCurrentFile != null) {
-            if (mFullAaptProjects == null) {
-                mFullAaptProjects = new HashSet<IProject>();
-            }
-            mFullAaptProjects.add(mCurrentFile.getProject());
-        } else {
-            assert false : "No current context to apply IdeScanningContext to";
-        }
-    }
-
-    /**
-     * Returns the collection of projects that scanned resources have requested
-     * a full aapt for.
-     *
-     * @return a collection of projects that scanned resources requested full
-     *         aapt runs for, or null
-     */
-    public Collection<IProject> getAaptRequestedProjects() {
-        return mFullAaptProjects;
-    }
-
-    @Override
-    public boolean checkValue(@Nullable String uri, @NonNull String name, @NonNull String value) {
-        if (!mValidate) {
-            return true;
-        }
-
-        if (!needsFullAapt() && mAttributeMap != null && ANDROID_URI.equals(uri)) {
-            AttributeInfo info = mAttributeMap.get(name);
-            if (info != null && !info.isValid(value, mRepository, mFrameworkResources)) {
-                return false;
-            }
-        }
-
-        return super.checkValue(uri, name, value);
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/resources/manager/ProjectClassLoader.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/resources/manager/ProjectClassLoader.java
deleted file mode 100644
index e07f099..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/resources/manager/ProjectClassLoader.java
+++ /dev/null
@@ -1,376 +0,0 @@
-/*
- * 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.resources.manager;
-
-import com.android.SdkConstants;
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.ide.eclipse.adt.internal.build.BuildHelper;
-import com.android.ide.eclipse.adt.internal.sdk.ProjectState;
-import com.android.ide.eclipse.adt.internal.sdk.Sdk;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IWorkspaceRoot;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.jdt.core.IClasspathContainer;
-import org.eclipse.jdt.core.IClasspathEntry;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.JavaCore;
-import org.eclipse.jdt.core.JavaModelException;
-import org.objectweb.asm.ClassReader;
-import org.objectweb.asm.ClassVisitor;
-import org.objectweb.asm.ClassWriter;
-import org.objectweb.asm.Opcodes;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.net.URLClassLoader;
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * ClassLoader able to load class from output of an Eclipse project.
- */
-public final class ProjectClassLoader extends ClassLoader {
-
-    private final IJavaProject mJavaProject;
-    private URLClassLoader mJarClassLoader;
-    private boolean mInsideJarClassLoader = false;
-
-    public ProjectClassLoader(ClassLoader parentClassLoader, IProject project) {
-        super(parentClassLoader);
-        mJavaProject = JavaCore.create(project);
-    }
-
-    @Override
-    protected Class<?> findClass(String name) throws ClassNotFoundException {
-        // if we are here through a child classloader, throw an exception.
-        if (mInsideJarClassLoader) {
-            throw new ClassNotFoundException(name);
-        }
-
-        // attempt to load the class from the main project
-        Class<?> clazz = loadFromProject(mJavaProject, name);
-
-        if (clazz != null) {
-            return clazz;
-        }
-
-        // attempt to load the class from the jar dependencies
-        clazz = loadClassFromJar(name);
-        if (clazz != null) {
-            return clazz;
-        }
-
-        // attempt to load the class from the libraries
-        try {
-            // get the project info
-            ProjectState projectState = Sdk.getProjectState(mJavaProject.getProject());
-
-            // this can happen if the project has no project.properties.
-            if (projectState != null) {
-
-                List<IProject> libProjects = projectState.getFullLibraryProjects();
-                List<IJavaProject> referencedJavaProjects = BuildHelper.getJavaProjects(
-                        libProjects);
-
-                for (IJavaProject javaProject : referencedJavaProjects) {
-                    clazz = loadFromProject(javaProject, name);
-
-                    if (clazz != null) {
-                        return clazz;
-                    }
-                }
-            }
-        } catch (CoreException e) {
-            // log exception?
-        }
-
-        throw new ClassNotFoundException(name);
-    }
-
-    /**
-     * Attempts to load a class from a project output folder.
-     * @param project the project to load the class from
-     * @param name the name of the class
-     * @return a class object if found, null otherwise.
-     */
-    private Class<?> loadFromProject(IJavaProject project, String name) {
-        try {
-            // get the project output folder.
-            IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
-            IPath outputLocation = project.getOutputLocation();
-            IResource outRes = root.findMember(outputLocation);
-            if (outRes == null) {
-                return null;
-            }
-
-            File outFolder = new File(outRes.getLocation().toOSString());
-
-            // get the class name segments
-            String[] segments = name.split("\\."); //$NON-NLS-1$
-
-            // try to load the class from the bin folder of the project.
-            File classFile = getFile(outFolder, segments, 0);
-            if (classFile == null) {
-                return null;
-            }
-
-            // load the content of the file and create the class.
-            FileInputStream fis = new FileInputStream(classFile);
-            byte[] data = new byte[(int)classFile.length()];
-            int read = 0;
-            try {
-                read = fis.read(data);
-            } catch (IOException e) {
-                data = null;
-            }
-            fis.close();
-
-            if (data != null) {
-                try {
-                    Class<?> clazz = defineClass(null, data, 0, read);
-                    if (clazz != null) {
-                        return clazz;
-                    }
-                } catch (UnsupportedClassVersionError e) {
-                    // Attempt to reload on lower version
-                    int maxVersion = 50; // JDK 1.6
-                    try {
-                        byte[] rewritten = rewriteClass(data, maxVersion, 0);
-                        return defineClass(null, rewritten, 0, rewritten.length);
-                    } catch (UnsupportedClassVersionError e2) {
-                        throw e; // throw *original* exception, not attempt to rewrite
-                    }
-                }
-            }
-        } catch (Exception e) {
-            // log the exception?
-        }
-
-        return null;
-    }
-
-    /**
-     * Rewrites the given class to the given target class file version.
-     */
-    public static byte[] rewriteClass(byte[] classData, final int maxVersion, final int minVersion) {
-        assert maxVersion >= minVersion;
-        ClassWriter classWriter = new ClassWriter(0);
-        ClassVisitor classVisitor = new ClassVisitor(Opcodes.ASM5, classWriter) {
-            @Override
-            public void visit(int version, int access, String name, String signature,
-                    String superName, String[] interfaces) {
-                if (version > maxVersion) {
-                    version = maxVersion;
-                }
-                if (version < minVersion) {
-                    version = minVersion;
-                }
-                super.visit(version, access, name, signature, superName, interfaces);
-            }
-        };
-        ClassReader reader = new ClassReader(classData);
-        reader.accept(classVisitor, 0);
-        return classWriter.toByteArray();
-    }
-
-    /**
-     * Returns the File matching the a certain path from a root {@link File}.
-     * <p/>The methods checks that the file ends in .class even though the last segment
-     * does not.
-     * @param parent the root of the file.
-     * @param segments the segments containing the path of the file
-     * @param index the offset at which to start looking into segments.
-     * @throws FileNotFoundException
-     */
-    private File getFile(File parent, String[] segments, int index)
-            throws FileNotFoundException {
-        // reached the end with no match?
-        if (index == segments.length) {
-            throw new FileNotFoundException();
-        }
-
-        String toMatch = segments[index];
-        File[] files = parent.listFiles();
-
-        // we're at the last segments. we look for a matching <file>.class
-        if (index == segments.length - 1) {
-            toMatch = toMatch + ".class";
-
-            if (files != null) {
-                for (File file : files) {
-                    if (file.isFile() && file.getName().equals(toMatch)) {
-                        return file;
-                    }
-                }
-            }
-
-            // no match? abort.
-            throw new FileNotFoundException();
-        }
-
-        String innerClassName = null;
-
-        if (files != null) {
-            for (File file : files) {
-                if (file.isDirectory()) {
-                    if (toMatch.equals(file.getName())) {
-                        return getFile(file, segments, index+1);
-                    }
-                } else if (file.getName().startsWith(toMatch)) {
-                    if (innerClassName == null) {
-                        StringBuilder sb = new StringBuilder(segments[index]);
-                        for (int i = index + 1 ; i < segments.length ; i++) {
-                            sb.append('$');
-                            sb.append(segments[i]);
-                        }
-                        sb.append(".class");
-
-                        innerClassName = sb.toString();
-                    }
-
-                    if (file.getName().equals(innerClassName)) {
-                        return file;
-                    }
-                }
-            }
-        }
-
-        return null;
-    }
-
-    /**
-     * Loads a class from the 3rd party jar present in the project
-     *
-     * @return the class loader or null if not found.
-     */
-    private Class<?> loadClassFromJar(String name) {
-        if (mJarClassLoader == null) {
-            // get the OS path to all the external jars
-            URL[] jars = getExternalJars();
-
-            mJarClassLoader = new URLClassLoader(jars, this /* parent */);
-        }
-
-        try {
-            // because a class loader always look in its parent loader first, we need to know
-            // that we are querying the jar classloader. This will let us know to not query
-            // it again for classes we don't find, or this would create an infinite loop.
-            mInsideJarClassLoader = true;
-            return mJarClassLoader.loadClass(name);
-        } catch (ClassNotFoundException e) {
-            // not found? return null.
-            return null;
-        } finally {
-            mInsideJarClassLoader = false;
-        }
-    }
-
-    /**
-     * Returns an array of external jar files used by the project.
-     * @return an array of OS-specific absolute file paths
-     */
-    private final URL[] getExternalJars() {
-        // get a java project from it
-        IJavaProject javaProject = JavaCore.create(mJavaProject.getProject());
-
-        ArrayList<URL> oslibraryList = new ArrayList<URL>();
-        IClasspathEntry[] classpaths = javaProject.readRawClasspath();
-        if (classpaths != null) {
-            for (IClasspathEntry e : classpaths) {
-                if (e.getEntryKind() == IClasspathEntry.CPE_LIBRARY ||
-                        e.getEntryKind() == IClasspathEntry.CPE_VARIABLE) {
-                    // if this is a classpath variable reference, we resolve it.
-                    if (e.getEntryKind() == IClasspathEntry.CPE_VARIABLE) {
-                        e = JavaCore.getResolvedClasspathEntry(e);
-                    }
-
-                    handleClassPathEntry(e, oslibraryList);
-                } else if (e.getEntryKind() == IClasspathEntry.CPE_CONTAINER) {
-                    // get the container.
-                    try {
-                        IClasspathContainer container = JavaCore.getClasspathContainer(
-                                e.getPath(), javaProject);
-                        // ignore the system and default_system types as they represent
-                        // libraries that are part of the runtime.
-                        if (container != null &&
-                                container.getKind() == IClasspathContainer.K_APPLICATION) {
-                            IClasspathEntry[] entries = container.getClasspathEntries();
-                            for (IClasspathEntry entry : entries) {
-                                // TODO: Xav -- is this necessary?
-                                if (entry.getEntryKind() == IClasspathEntry.CPE_VARIABLE) {
-                                    entry = JavaCore.getResolvedClasspathEntry(entry);
-                                }
-
-                                handleClassPathEntry(entry, oslibraryList);
-                            }
-                        }
-                    } catch (JavaModelException jme) {
-                        // can't resolve the container? ignore it.
-                        AdtPlugin.log(jme, "Failed to resolve ClasspathContainer: %s",
-                                e.getPath());
-                    }
-                }
-            }
-        }
-
-        return oslibraryList.toArray(new URL[oslibraryList.size()]);
-    }
-
-    private void handleClassPathEntry(IClasspathEntry e, ArrayList<URL> oslibraryList) {
-        // get the IPath
-        IPath path = e.getPath();
-
-        // check the name ends with .jar
-        if (SdkConstants.EXT_JAR.equalsIgnoreCase(path.getFileExtension())) {
-            boolean local = false;
-            IResource resource = ResourcesPlugin.getWorkspace().getRoot().findMember(path);
-            if (resource != null && resource.exists() &&
-                    resource.getType() == IResource.FILE) {
-                local = true;
-                try {
-                    oslibraryList.add(new File(resource.getLocation().toOSString())
-                            .toURI().toURL());
-                } catch (MalformedURLException mue) {
-                    // pass
-                }
-            }
-
-            if (local == false) {
-                // if the jar path doesn't match a workspace resource,
-                // then we get an OSString and check if this links to a valid file.
-                String osFullPath = path.toOSString();
-
-                File f = new File(osFullPath);
-                if (f.exists()) {
-                    try {
-                        oslibraryList.add(f.toURI().toURL());
-                    } catch (MalformedURLException mue) {
-                        // pass
-                    }
-                }
-            }
-        }
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/resources/manager/ProjectResources.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/resources/manager/ProjectResources.java
deleted file mode 100644
index 7c3fd4c..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/resources/manager/ProjectResources.java
+++ /dev/null
@@ -1,271 +0,0 @@
-/*
- * Copyright (C) 2007 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.resources.manager;
-
-import com.android.SdkConstants;
-import com.android.annotations.NonNull;
-import com.android.ide.common.rendering.api.ResourceValue;
-import com.android.ide.common.resources.IntArrayWrapper;
-import com.android.ide.common.resources.ResourceFolder;
-import com.android.ide.common.resources.ResourceItem;
-import com.android.ide.common.resources.ResourceRepository;
-import com.android.ide.common.resources.configuration.FolderConfiguration;
-import com.android.ide.eclipse.adt.internal.sdk.ProjectState;
-import com.android.ide.eclipse.adt.internal.sdk.Sdk;
-import com.android.ide.eclipse.adt.io.IFolderWrapper;
-import com.android.io.IAbstractFolder;
-import com.android.resources.ResourceType;
-import com.android.util.Pair;
-
-import org.eclipse.core.resources.IFolder;
-import org.eclipse.core.resources.IProject;
-
-import java.util.EnumMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Map.Entry;
-
-/**
- * Represents the resources of a project.
- * On top of the regular {@link ResourceRepository} features it provides:
- *<ul>
- *<li>configured resources contain the resources coming from the libraries.</li>
- *<li>resolution to and from resource integer (compiled value in R.java).</li>
- *<li>handles resource integer for non existing values of type ID. This is used when rendering.</li>
- *<li>layouts that have no been saved yet. This is handled by generating dynamic IDs
- *       on the fly.</li>
- *</ul>
- */
-@SuppressWarnings("deprecation")
-public class ProjectResources extends ResourceRepository {
-    // project resources are defined as 0x7FXX#### where XX is the resource type (layout, drawable,
-    // etc...). Using FF as the type allows for 255 resource types before we get a collision
-    // which should be fine.
-    private final static int DYNAMIC_ID_SEED_START = 0x7fff0000;
-
-    /** Map of (name, id) for resources of type {@link ResourceType#ID} coming from R.java */
-    private Map<ResourceType, Map<String, Integer>> mResourceValueMap;
-    /** Map of (id, [name, resType]) for all resources coming from R.java */
-    private Map<Integer, Pair<ResourceType, String>> mResIdValueToNameMap;
-    /** Map of (int[], name) for styleable resources coming from R.java */
-    private Map<IntArrayWrapper, String> mStyleableValueToNameMap;
-
-    private final DynamicIdMap mDynamicIdMap = new DynamicIdMap(DYNAMIC_ID_SEED_START);
-    private final IntArrayWrapper mWrapper = new IntArrayWrapper(null);
-    private final IProject mProject;
-
-    public static ProjectResources create(IProject project) {
-        IFolder resFolder = project.getFolder(SdkConstants.FD_RESOURCES);
-
-        return new ProjectResources(project, new IFolderWrapper(resFolder));
-    }
-
-    /**
-     * Makes a ProjectResources for a given <var>project</var>.
-     * @param project the project.
-     */
-    private ProjectResources(IProject project, IAbstractFolder resFolder) {
-        super(resFolder, false /*isFrameworkRepository*/);
-        mProject = project;
-    }
-
-    /**
-     * Returns the resources values matching a given {@link FolderConfiguration}, this will
-     * include library dependency.
-     *
-     * @param referenceConfig the configuration that each value must match.
-     * @return a map with guaranteed to contain an entry for each {@link ResourceType}
-     */
-    @Override
-    @NonNull
-    public Map<ResourceType, Map<String, ResourceValue>> getConfiguredResources(
-            @NonNull FolderConfiguration referenceConfig) {
-        ensureInitialized();
-
-        Map<ResourceType, Map<String, ResourceValue>> resultMap =
-            new EnumMap<ResourceType, Map<String, ResourceValue>>(ResourceType.class);
-
-        // if the project contains libraries, we need to add the libraries resources here
-        // so that they are accessible to the layout rendering.
-        if (mProject != null) {
-            ProjectState state = Sdk.getProjectState(mProject);
-            if (state != null) {
-                List<IProject> libraries = state.getFullLibraryProjects();
-
-                ResourceManager resMgr = ResourceManager.getInstance();
-
-                // because aapt put all the library in their order in this array, the first
-                // one will have priority over the 2nd one. So it's better to loop in the inverse
-                // order and fill the map with resources that will be overwritten by higher
-                // priority resources
-                for (int i = libraries.size() - 1 ; i >= 0 ; i--) {
-                    IProject library = libraries.get(i);
-
-                    ProjectResources libRes = resMgr.getProjectResources(library);
-                    if (libRes != null) {
-                        // get the library resources, and only the library, not the dependencies
-                        // so call doGetConfiguredResources() directly.
-                        Map<ResourceType, Map<String, ResourceValue>> libMap =
-                                libRes.doGetConfiguredResources(referenceConfig);
-
-                        // we don't want to simply replace the whole map, but instead merge the
-                        // content of any sub-map
-                        for (Entry<ResourceType, Map<String, ResourceValue>> libEntry :
-                                libMap.entrySet()) {
-
-                            // get the map currently in the result map for this resource type
-                            Map<String, ResourceValue> tempMap = resultMap.get(libEntry.getKey());
-                            if (tempMap == null) {
-                                // since there's no current map for this type, just add the map
-                                // directly coming from the library resources
-                                resultMap.put(libEntry.getKey(), libEntry.getValue());
-                            } else {
-                                // already a map for this type. add the resources from the
-                                // library, this will override existing value, which is why
-                                // we loop in a specific library order.
-                                tempMap.putAll(libEntry.getValue());
-                            }
-                        }
-                    }
-                }
-            }
-        }
-
-        // now the project resources themselves.
-        Map<ResourceType, Map<String, ResourceValue>> thisProjectMap =
-                doGetConfiguredResources(referenceConfig);
-
-        // now merge the maps.
-        for (Entry<ResourceType, Map<String, ResourceValue>> entry : thisProjectMap.entrySet()) {
-            ResourceType type = entry.getKey();
-            Map<String, ResourceValue> typeMap = resultMap.get(type);
-            if (typeMap == null) {
-                resultMap.put(type, entry.getValue());
-            } else {
-                typeMap.putAll(entry.getValue());
-            }
-        }
-
-        return resultMap;
-    }
-
-    /**
-     * Returns the {@link ResourceFolder} associated with a {@link IFolder}.
-     * @param folder The {@link IFolder} object.
-     * @return the {@link ResourceFolder} or null if it was not found.
-     *
-     * @see ResourceRepository#getResourceFolder(com.android.io.IAbstractFolder)
-     */
-    public ResourceFolder getResourceFolder(IFolder folder) {
-        return getResourceFolder(new IFolderWrapper(folder));
-    }
-
-    /**
-     * Resolves a compiled resource id into the resource name and type
-     * @param id the resource integer id.
-     * @return a {@link Pair} of 2 strings { name, type } or null if the id could not be resolved
-     */
-    public Pair<ResourceType, String> resolveResourceId(int id) {
-        Pair<ResourceType, String> result = null;
-        if (mResIdValueToNameMap != null) {
-            result = mResIdValueToNameMap.get(id);
-        }
-
-        if (result == null) {
-            synchronized (mDynamicIdMap) {
-                result = mDynamicIdMap.resolveId(id);
-            }
-        }
-
-        return result;
-    }
-
-    /**
-     * Resolves a compiled styleable id of type int[] into the styleable name.
-     */
-    public String resolveStyleable(int[] id) {
-        if (mStyleableValueToNameMap != null) {
-            mWrapper.set(id);
-            return mStyleableValueToNameMap.get(mWrapper);
-        }
-
-        return null;
-    }
-
-    /**
-     * Returns the integer id of a resource given its type and name.
-     * <p/>If the resource is of type {@link ResourceType#ID} and does not exist in the
-     * internal map, then new id values are dynamically generated (and stored so that queries
-     * with the same names will return the same value).
-     */
-    public Integer getResourceId(ResourceType type, String name) {
-        Integer result = null;
-        if (mResourceValueMap != null) {
-            Map<String, Integer> map = mResourceValueMap.get(type);
-            if (map != null) {
-                result = map.get(name);
-            }
-        }
-
-        if (result == null) {
-            synchronized (mDynamicIdMap) {
-                result = mDynamicIdMap.getId(type, name);
-            }
-        }
-
-        return result;
-    }
-
-    /**
-     * Resets the list of dynamic Ids. This list is used by
-     * {@link #getResourceId(String, String)} when the resource query is an ID that doesn't
-     * exist (for example for ID automatically generated in layout files that are not saved yet.)
-     * <p/>This method resets those dynamic ID and must be called whenever the actual list of IDs
-     * change.
-     */
-    public void resetDynamicIds() {
-        synchronized (mDynamicIdMap) {
-            mDynamicIdMap.reset(DYNAMIC_ID_SEED_START);
-        }
-    }
-
-    @Override
-    @NonNull
-    protected ResourceItem createResourceItem(@NonNull String name) {
-        return new ResourceItem(name);
-    }
-
-    /**
-     * Sets compiled resource information.
-     *
-     * @param resIdValueToNameMap a map of compiled resource id to resource name.
-     *    The map is acquired by the {@link ProjectResources} object.
-     * @param styleableValueMap a map of (int[], name) for the styleable information. The map is
-     *    acquired by the {@link ProjectResources} object.
-     * @param resourceValueMap a map of (name, id) for resources of type {@link ResourceType#ID}.
-     *    The list is acquired by the {@link ProjectResources} object.
-     */
-    void setCompiledResources(Map<Integer, Pair<ResourceType, String>> resIdValueToNameMap,
-            Map<IntArrayWrapper, String> styleableValueMap,
-            Map<ResourceType, Map<String, Integer>> resourceValueMap) {
-        mResourceValueMap = resourceValueMap;
-        mResIdValueToNameMap = resIdValueToNameMap;
-        mStyleableValueToNameMap = styleableValueMap;
-
-        resetDynamicIds();
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/resources/manager/ResourceManager.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/resources/manager/ResourceManager.java
deleted file mode 100644
index e407b6a..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/resources/manager/ResourceManager.java
+++ /dev/null
@@ -1,655 +0,0 @@
-/*
- * Copyright (C) 2007 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.resources.manager;
-
-import com.android.SdkConstants;
-import com.android.ide.common.resources.FrameworkResources;
-import com.android.ide.common.resources.ResourceFile;
-import com.android.ide.common.resources.ResourceFolder;
-import com.android.ide.common.resources.ResourceRepository;
-import com.android.ide.common.resources.ScanningContext;
-import com.android.ide.eclipse.adt.AdtConstants;
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.ide.eclipse.adt.internal.resources.ResourceHelper;
-import com.android.ide.eclipse.adt.internal.resources.manager.GlobalProjectMonitor.IProjectListener;
-import com.android.ide.eclipse.adt.internal.resources.manager.GlobalProjectMonitor.IRawDeltaListener;
-import com.android.ide.eclipse.adt.internal.sdk.ProjectState;
-import com.android.ide.eclipse.adt.internal.sdk.Sdk;
-import com.android.ide.eclipse.adt.io.IFileWrapper;
-import com.android.ide.eclipse.adt.io.IFolderWrapper;
-import com.android.io.FolderWrapper;
-import com.android.resources.ResourceFolderType;
-import com.android.sdklib.IAndroidTarget;
-
-import org.eclipse.core.resources.IContainer;
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IFolder;
-import org.eclipse.core.resources.IMarkerDelta;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IResourceDelta;
-import org.eclipse.core.resources.IResourceDeltaVisitor;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.QualifiedName;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.Map;
-
-/**
- * The ResourceManager tracks resources for all opened projects.
- * <p/>
- * It provide direct access to all the resources of a project as a {@link ProjectResources}
- * object that allows accessing the resources through their file representation or as Android
- * resources (similar to what is seen by an Android application).
- * <p/>
- * The ResourceManager automatically tracks file changes to update its internal representation
- * of the resources so that they are always up to date.
- * <p/>
- * It also gives access to a monitor that is more resource oriented than the
- * {@link GlobalProjectMonitor}.
- * This monitor will let you track resource changes by giving you direct access to
- * {@link ResourceFile}, or {@link ResourceFolder}.
- *
- * @see ProjectResources
- */
-public final class ResourceManager {
-    public final static boolean DEBUG = false;
-
-    private final static ResourceManager sThis = new ResourceManager();
-
-    /**
-     * Map associating project resource with project objects.
-     * <p/><b>All accesses must be inside a synchronized(mMap) block</b>, and do as a little as
-     * possible and <b>not call out to other classes</b>.
-     */
-    private final Map<IProject, ProjectResources> mMap =
-        new HashMap<IProject, ProjectResources>();
-
-    /**
-     * Interface to be notified of resource changes.
-     *
-     * @see ResourceManager#addListener(IResourceListener)
-     * @see ResourceManager#removeListener(IResourceListener)
-     */
-    public interface IResourceListener {
-        /**
-         * Notification for resource file change.
-         * @param project the project of the file.
-         * @param file the {@link ResourceFile} representing the file.
-         * @param eventType the type of event. See {@link IResourceDelta}.
-         */
-        void fileChanged(IProject project, ResourceFile file, int eventType);
-        /**
-         * Notification for resource folder change.
-         * @param project the project of the file.
-         * @param folder the {@link ResourceFolder} representing the folder.
-         * @param eventType the type of event. See {@link IResourceDelta}.
-         */
-        void folderChanged(IProject project, ResourceFolder folder, int eventType);
-    }
-
-    private final ArrayList<IResourceListener> mListeners = new ArrayList<IResourceListener>();
-
-    /**
-     * Sets up the resource manager with the global project monitor.
-     * @param monitor The global project monitor
-     */
-    public static void setup(GlobalProjectMonitor monitor) {
-        monitor.addProjectListener(sThis.mProjectListener);
-        monitor.addRawDeltaListener(sThis.mRawDeltaListener);
-
-        CompiledResourcesMonitor.setupMonitor(monitor);
-    }
-
-    /**
-     * Returns the singleton instance.
-     */
-    public static ResourceManager getInstance() {
-        return sThis;
-    }
-
-    /**
-     * Adds a new {@link IResourceListener} to be notified of resource changes.
-     * @param listener the listener to be added.
-     */
-    public void addListener(IResourceListener listener) {
-        synchronized (mListeners) {
-            mListeners.add(listener);
-        }
-    }
-
-    /**
-     * Removes an {@link IResourceListener}, so that it's not notified of resource changes anymore.
-     * @param listener the listener to be removed.
-     */
-    public void removeListener(IResourceListener listener) {
-        synchronized (mListeners) {
-            mListeners.remove(listener);
-        }
-    }
-
-    /**
-     * Returns the resources of a project.
-     * @param project The project
-     * @return a ProjectResources object
-     */
-    public ProjectResources getProjectResources(IProject project) {
-        synchronized (mMap) {
-            ProjectResources resources = mMap.get(project);
-
-            if (resources == null) {
-                resources = ProjectResources.create(project);
-                mMap.put(project, resources);
-            }
-
-            return resources;
-        }
-    }
-
-    /**
-     * Update the resource repository with a delta
-     *
-     * @param delta the resource changed delta to process.
-     * @param context a context object with state for the current update, such
-     *            as a place to stash errors encountered
-     */
-    public void processDelta(IResourceDelta delta, IdeScanningContext context) {
-        doProcessDelta(delta, context);
-
-        // when a project is added to the workspace it is possible this is called before the
-        // repo is actually created so this will return null.
-        ResourceRepository repo = context.getRepository();
-        if (repo != null) {
-            repo.postUpdateCleanUp();
-        }
-    }
-
-    /**
-     * Update the resource repository with a delta
-     *
-     * @param delta the resource changed delta to process.
-     * @param context a context object with state for the current update, such
-     *            as a place to stash errors encountered
-     */
-    private void doProcessDelta(IResourceDelta delta, IdeScanningContext context) {
-        // Skip over deltas that don't fit our mask
-        int mask = IResourceDelta.ADDED | IResourceDelta.REMOVED | IResourceDelta.CHANGED;
-        int kind = delta.getKind();
-        if ( (mask & kind) == 0) {
-            return;
-        }
-
-        // Process this delta first as we need to make sure new folders are created before
-        // we process their content
-        IResource r = delta.getResource();
-        int type = r.getType();
-
-        if (type == IResource.FILE) {
-            context.startScanning(r);
-            updateFile((IFile)r, delta.getMarkerDeltas(), kind, context);
-            context.finishScanning(r);
-        } else if (type == IResource.FOLDER) {
-            updateFolder((IFolder)r, kind, context);
-        } // We only care about files and folders.
-          // Project deltas are handled by our project listener
-
-        // Now, process children recursively
-        IResourceDelta[] children = delta.getAffectedChildren();
-        for (IResourceDelta child : children)  {
-            processDelta(child, context);
-        }
-    }
-
-    /**
-     * Update a resource folder that we know about
-     * @param folder the folder that was updated
-     * @param kind the delta type (added/removed/updated)
-     */
-    private void updateFolder(IFolder folder, int kind, IdeScanningContext context) {
-        ProjectResources resources;
-
-        final IProject project = folder.getProject();
-
-        try {
-            if (project.hasNature(AdtConstants.NATURE_DEFAULT) == false) {
-                return;
-            }
-        } catch (CoreException e) {
-            // can't get the project nature? return!
-            return;
-        }
-
-        switch (kind) {
-            case IResourceDelta.ADDED:
-                // checks if the folder is under res.
-                IPath path = folder.getFullPath();
-
-                // the path will be project/res/<something>
-                if (path.segmentCount() == 3) {
-                    if (isInResFolder(path)) {
-                        // get the project and its resource object.
-                        synchronized (mMap) {
-                            resources = mMap.get(project);
-
-                            // if it doesn't exist, we create it.
-                            if (resources == null) {
-                                resources = ProjectResources.create(project);
-                                mMap.put(project, resources);
-                            }
-                        }
-
-                        ResourceFolder newFolder = resources.processFolder(
-                                new IFolderWrapper(folder));
-                        if (newFolder != null) {
-                            notifyListenerOnFolderChange(project, newFolder, kind);
-                        }
-                    }
-                }
-                break;
-            case IResourceDelta.CHANGED:
-                // only call the listeners.
-                synchronized (mMap) {
-                    resources = mMap.get(folder.getProject());
-                }
-                if (resources != null) {
-                    ResourceFolder resFolder = resources.getResourceFolder(folder);
-                    if (resFolder != null) {
-                        notifyListenerOnFolderChange(project, resFolder, kind);
-                    }
-                }
-                break;
-            case IResourceDelta.REMOVED:
-                synchronized (mMap) {
-                    resources = mMap.get(folder.getProject());
-                }
-                if (resources != null) {
-                    // lets get the folder type
-                    ResourceFolderType type = ResourceFolderType.getFolderType(
-                            folder.getName());
-
-                    context.startScanning(folder);
-                    ResourceFolder removedFolder = resources.removeFolder(type,
-                            new IFolderWrapper(folder), context);
-                    context.finishScanning(folder);
-                    if (removedFolder != null) {
-                        notifyListenerOnFolderChange(project, removedFolder, kind);
-                    }
-                }
-                break;
-        }
-    }
-
-    /**
-     * Called when a delta indicates that a file has changed. Depending on the
-     * file being changed, and the type of change (ADDED, REMOVED, CHANGED), the
-     * file change is processed to update the resource manager data.
-     *
-     * @param file The file that changed.
-     * @param markerDeltas The marker deltas for the file.
-     * @param kind The change kind. This is equivalent to
-     *            {@link IResourceDelta#accept(IResourceDeltaVisitor)}
-     * @param context a context object with state for the current update, such
-     *            as a place to stash errors encountered
-     */
-    private void updateFile(IFile file, IMarkerDelta[] markerDeltas, int kind,
-            ScanningContext context) {
-        final IProject project = file.getProject();
-
-        try {
-            if (project.hasNature(AdtConstants.NATURE_DEFAULT) == false) {
-                return;
-            }
-        } catch (CoreException e) {
-            // can't get the project nature? return!
-            return;
-        }
-
-        // get the project resources
-        ProjectResources resources;
-        synchronized (mMap) {
-            resources = mMap.get(project);
-        }
-
-        if (resources == null) {
-            return;
-        }
-
-        // checks if the file is under res/something or bin/res/something
-        IPath path = file.getFullPath();
-
-        if (path.segmentCount() == 4 || path.segmentCount() == 5) {
-            if (isInResFolder(path)) {
-                IContainer container = file.getParent();
-                if (container instanceof IFolder) {
-
-                    ResourceFolder folder = resources.getResourceFolder(
-                            (IFolder)container);
-
-                    // folder can be null as when the whole folder is deleted, the
-                    // REMOVED event for the folder comes first. In this case, the
-                    // folder will have taken care of things.
-                    if (folder != null) {
-                        ResourceFile resFile = folder.processFile(
-                                new IFileWrapper(file),
-                                ResourceHelper.getResourceDeltaKind(kind), context);
-                        notifyListenerOnFileChange(project, resFile, kind);
-                    }
-                }
-            }
-        }
-    }
-
-    /**
-     * Implementation of the {@link IProjectListener} as an internal class so that the methods
-     * do not appear in the public API of {@link ResourceManager}.
-     */
-    private final IProjectListener mProjectListener = new IProjectListener() {
-        @Override
-        public void projectClosed(IProject project) {
-            synchronized (mMap) {
-                mMap.remove(project);
-            }
-        }
-
-        @Override
-        public void projectDeleted(IProject project) {
-            synchronized (mMap) {
-                mMap.remove(project);
-            }
-        }
-
-        @Override
-        public void projectOpened(IProject project) {
-            createProject(project);
-        }
-
-        @Override
-        public void projectOpenedWithWorkspace(IProject project) {
-            createProject(project);
-        }
-
-        @Override
-        public void allProjectsOpenedWithWorkspace() {
-            // nothing to do.
-        }
-
-        @Override
-        public void projectRenamed(IProject project, IPath from) {
-            // renamed project get a delete/open event too, so this can be ignored.
-        }
-    };
-
-    /**
-     * Implementation of {@link IRawDeltaListener} as an internal class so that the methods
-     * do not appear in the public API of {@link ResourceManager}. Delta processing can be
-     * accessed through the {@link ResourceManager#visitDelta(IResourceDelta delta)} method.
-     */
-    private final IRawDeltaListener mRawDeltaListener = new IRawDeltaListener() {
-        @Override
-        public void visitDelta(IResourceDelta workspaceDelta) {
-            // If we're auto-building, then PreCompilerBuilder will pass us deltas and
-            // they will be processed as part of the build.
-            if (isAutoBuilding()) {
-                return;
-            }
-
-            // When *not* auto building, we need to process the deltas immediately on save,
-            // even if the user is not building yet, such that for example resource ids
-            // are updated in the resource repositories so rendering etc. can work for
-            // those new ids.
-
-            IResourceDelta[] projectDeltas = workspaceDelta.getAffectedChildren();
-            for (IResourceDelta delta : projectDeltas) {
-                if (delta.getResource() instanceof IProject) {
-                    IProject project = (IProject) delta.getResource();
-
-                    try {
-                        if (project.hasNature(AdtConstants.NATURE_DEFAULT) == false) {
-                            continue;
-                        }
-                    } catch (CoreException e) {
-                        // only happens if the project is closed or doesn't exist.
-                    }
-
-                    IdeScanningContext context =
-                            new IdeScanningContext(getProjectResources(project), project, true);
-
-                    processDelta(delta, context);
-
-                    Collection<IProject> projects = context.getAaptRequestedProjects();
-                    if (projects != null) {
-                        for (IProject p : projects) {
-                            markAaptRequested(p);
-                        }
-                    }
-                } else {
-                    AdtPlugin.log(IStatus.WARNING, "Unexpected delta type: %1$s",
-                            delta.getResource().toString());
-                }
-            }
-        }
-    };
-
-    /**
-     * Returns the {@link ResourceFolder} for the given file or <code>null</code> if none exists.
-     */
-    public ResourceFolder getResourceFolder(IFile file) {
-        IContainer container = file.getParent();
-        if (container.getType() == IResource.FOLDER) {
-            IFolder parent = (IFolder)container;
-            IProject project = file.getProject();
-
-            ProjectResources resources = getProjectResources(project);
-            if (resources != null) {
-                return resources.getResourceFolder(parent);
-            }
-        }
-
-        return null;
-    }
-
-    /**
-     * Returns the {@link ResourceFolder} for the given folder or <code>null</code> if none exists.
-     */
-    public ResourceFolder getResourceFolder(IFolder folder) {
-        IProject project = folder.getProject();
-
-        ProjectResources resources = getProjectResources(project);
-        if (resources != null) {
-            return resources.getResourceFolder(folder);
-        }
-
-        return null;
-    }
-
-    /**
-     * Loads and returns the resources for a given {@link IAndroidTarget}
-     * @param androidTarget the target from which to load the framework resources
-     */
-    public ResourceRepository loadFrameworkResources(IAndroidTarget androidTarget) {
-        String osResourcesPath = androidTarget.getPath(IAndroidTarget.RESOURCES);
-
-        FolderWrapper frameworkRes = new FolderWrapper(osResourcesPath);
-        if (frameworkRes.exists()) {
-            FrameworkResources resources = new FrameworkResources(frameworkRes);
-
-            resources.loadResources();
-            resources.loadPublicResources(AdtPlugin.getDefault());
-            return resources;
-        }
-
-        return null;
-    }
-
-    /**
-     * Initial project parsing to gather resource info.
-     * @param project
-     */
-    private void createProject(IProject project) {
-        if (project.isOpen()) {
-            synchronized (mMap) {
-                ProjectResources projectResources = mMap.get(project);
-                if (projectResources == null) {
-                    projectResources = ProjectResources.create(project);
-                    mMap.put(project, projectResources);
-                }
-            }
-        }
-    }
-
-
-    /**
-     * Returns true if the path is under /project/res/
-     * @param path a workspace relative path
-     * @return true if the path is under /project res/
-     */
-    private boolean isInResFolder(IPath path) {
-        return SdkConstants.FD_RESOURCES.equalsIgnoreCase(path.segment(1));
-    }
-
-    private void notifyListenerOnFolderChange(IProject project, ResourceFolder folder,
-            int eventType) {
-        synchronized (mListeners) {
-            for (IResourceListener listener : mListeners) {
-                try {
-                    listener.folderChanged(project, folder, eventType);
-                } catch (Throwable t) {
-                    AdtPlugin.log(t,
-                            "Failed to execute ResourceManager.IResouceListener.folderChanged()"); //$NON-NLS-1$
-                }
-            }
-        }
-    }
-
-    private void notifyListenerOnFileChange(IProject project, ResourceFile file, int eventType) {
-        synchronized (mListeners) {
-            for (IResourceListener listener : mListeners) {
-                try {
-                    listener.fileChanged(project, file, eventType);
-                } catch (Throwable t) {
-                    AdtPlugin.log(t,
-                            "Failed to execute ResourceManager.IResouceListener.fileChanged()"); //$NON-NLS-1$
-                }
-            }
-        }
-    }
-
-    /**
-     * Private constructor to enforce singleton design.
-     */
-    private ResourceManager() {
-    }
-
-    // debug only
-    @SuppressWarnings("unused")
-    private String getKindString(int kind) {
-        if (DEBUG) {
-            switch (kind) {
-                case IResourceDelta.ADDED: return "ADDED";
-                case IResourceDelta.REMOVED: return "REMOVED";
-                case IResourceDelta.CHANGED: return "CHANGED";
-            }
-        }
-
-        return Integer.toString(kind);
-    }
-
-    /**
-     * Returns true if the Project > Build Automatically option is turned on
-     * (default).
-     *
-     * @return true if the Project > Build Automatically option is turned on
-     *         (default).
-     */
-    public static boolean isAutoBuilding() {
-        return ResourcesPlugin.getWorkspace().getDescription().isAutoBuilding();
-    }
-
-    /** Qualified name for the per-project persistent property "needs aapt" */
-    private final static QualifiedName NEED_AAPT = new QualifiedName(AdtPlugin.PLUGIN_ID,
-            "aapt");//$NON-NLS-1$
-
-    /**
-     * Mark the given project, and any projects which depend on it as a library
-     * project, as needing a full aapt build the next time the project is built.
-     *
-     * @param project the project to mark as needing aapt
-     */
-    public static void markAaptRequested(IProject project) {
-        try {
-            String needsAapt = Boolean.TRUE.toString();
-            project.setPersistentProperty(NEED_AAPT, needsAapt);
-
-            ProjectState state = Sdk.getProjectState(project);
-            if (state.isLibrary()) {
-                // For library projects also mark the dependent projects as needing full aapt
-                for (ProjectState parent : state.getFullParentProjects()) {
-                    IProject parentProject = parent.getProject();
-                    // Mark the project, but only if it's open. Resource#setPersistentProperty
-                    // only works on open projects.
-                    if (parentProject.isOpen()) {
-                        parentProject.setPersistentProperty(NEED_AAPT, needsAapt);
-                    }
-                }
-            }
-        } catch (CoreException e) {
-            AdtPlugin.log(e,  null);
-        }
-    }
-
-    /**
-     * Clear the "needs aapt" flag set by {@link #markAaptRequested(IProject)}.
-     * This is usually called when a project is built. Note that this will only
-     * clean the build flag on the given project, not on any downstream projects
-     * that depend on this project as a library project.
-     *
-     * @param project the project to clear from the needs aapt list
-     */
-    public static void clearAaptRequest(IProject project) {
-        try {
-            project.setPersistentProperty(NEED_AAPT, null);
-            // Note that even if this project is a library project, we -don't- clear
-            // the aapt flags on the dependent projects since they may still depend
-            // on other dirty projects. When they are built, they will issue their
-            // own clear flag requests.
-        } catch (CoreException e) {
-            AdtPlugin.log(e,  null);
-        }
-    }
-
-    /**
-     * Returns whether the given project needs a full aapt build.
-     *
-     * @param project the project to check
-     * @return true if the project needs a full aapt run
-     */
-    public static boolean isAaptRequested(IProject project) {
-        try {
-            String b = project.getPersistentProperty(NEED_AAPT);
-            return b != null && Boolean.valueOf(b);
-        } catch (CoreException e) {
-            AdtPlugin.log(e,  null);
-        }
-
-        return false;
-    }
-}
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
deleted file mode 100755
index 2396a4c..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/sdk/AdtConsoleSdkLog.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Copyright (C) 2010 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.sdk;
-
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.utils.ILogger;
-
-/**
- * An {@link ILogger} logger that outputs to the ADT console.
- */
-public class AdtConsoleSdkLog implements ILogger {
-
-    private static final String TAG = "SDK Manager"; //$NON-NLS-1$
-
-    @Override
-    public void error(@Nullable Throwable t, @Nullable String errorFormat, Object... args) {
-        if (t != null) {
-            AdtPlugin.logAndPrintError(t, TAG, "Error: " + errorFormat, args);
-        } else {
-            AdtPlugin.printErrorToConsole(TAG, String.format(errorFormat, args));
-        }
-    }
-
-    @Override
-    public void info(@NonNull String msgFormat, Object... args) {
-        String msg = String.format(msgFormat, args);
-        for (String s : msg.split("\n")) {
-            if (s.trim().length() > 0) {
-                AdtPlugin.printToConsole(TAG, s);
-            }
-        }
-    }
-
-    @Override
-    public void verbose(@NonNull String msgFormat, Object... args) {
-        info(msgFormat, args);
-    }
-
-    @Override
-    public void warning(@NonNull String warningFormat, Object... args) {
-        AdtPlugin.printToConsole(TAG, String.format("Warning: " + warningFormat, args));
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/sdk/AdtManifestMergeCallback.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/sdk/AdtManifestMergeCallback.java
deleted file mode 100755
index dc539dc..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/sdk/AdtManifestMergeCallback.java
+++ /dev/null
@@ -1,46 +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.ide.eclipse.adt.internal.sdk;
-
-import com.android.annotations.NonNull;
-import com.android.manifmerger.ICallback;
-import com.android.manifmerger.ManifestMerger;
-import com.android.sdklib.AndroidTargetHash;
-import com.android.sdklib.AndroidVersion;
-import com.android.sdklib.IAndroidTarget;
-
-/**
- * A {@link ManifestMerger} {@link ICallback} that returns the
- * proper API level for known API codenames.
- */
-public class AdtManifestMergeCallback implements ICallback {
-    @Override
-    public int queryCodenameApiLevel(@NonNull String codename) {
-        Sdk sdk = Sdk.getCurrent();
-        if (sdk != null) {
-            try {
-                AndroidVersion version = new AndroidVersion(codename);
-                String hashString = AndroidTargetHash.getPlatformHashString(version);
-                IAndroidTarget t = sdk.getTargetFromHashString(hashString);
-                if (t != null) {
-                    return t.getVersion().getApiLevel();
-                }
-            } catch (AndroidVersion.AndroidVersionException ignore) {}
-        }
-        return ICallback.UNKNOWN_CODENAME;
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/sdk/AndroidJarLoader.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/sdk/AndroidJarLoader.java
deleted file mode 100644
index 754cedf..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/sdk/AndroidJarLoader.java
+++ /dev/null
@@ -1,458 +0,0 @@
-/*
- * Copyright (C) 2007 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.sdk;
-
-import com.android.SdkConstants;
-import com.google.common.io.Closeables;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.SubMonitor;
-
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.lang.reflect.Modifier;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.zip.ZipEntry;
-import java.util.zip.ZipInputStream;
-
-import javax.management.InvalidAttributeValueException;
-
-/**
- * Custom class loader able to load a class from the SDK jar file.
- */
-public class AndroidJarLoader extends ClassLoader implements IAndroidClassLoader {
-
-    /**
-     * Wrapper around a {@link Class} to provide the methods of
-     * {@link IAndroidClassLoader.IClassDescriptor}.
-     */
-    public final static class ClassWrapper implements IClassDescriptor {
-        private Class<?> mClass;
-
-        public ClassWrapper(Class<?> clazz) {
-            mClass = clazz;
-        }
-
-        @Override
-        public String getFullClassName() {
-            return mClass.getCanonicalName();
-        }
-
-        @Override
-        public IClassDescriptor[] getDeclaredClasses() {
-            Class<?>[] classes = mClass.getDeclaredClasses();
-            IClassDescriptor[] iclasses = new IClassDescriptor[classes.length];
-            for (int i = 0 ; i < classes.length ; i++) {
-                iclasses[i] = new ClassWrapper(classes[i]);
-            }
-
-            return iclasses;
-        }
-
-        @Override
-        public IClassDescriptor getEnclosingClass() {
-            return new ClassWrapper(mClass.getEnclosingClass());
-        }
-
-        @Override
-        public String getSimpleName() {
-            return mClass.getSimpleName();
-        }
-
-        @Override
-        public IClassDescriptor getSuperclass() {
-            return new ClassWrapper(mClass.getSuperclass());
-        }
-
-        @Override
-        public boolean equals(Object clazz) {
-            if (clazz instanceof ClassWrapper) {
-                return mClass.equals(((ClassWrapper)clazz).mClass);
-            }
-            return super.equals(clazz);
-        }
-
-        @Override
-        public int hashCode() {
-            return mClass.hashCode();
-        }
-
-
-        @Override
-        public boolean isInstantiable() {
-            int modifiers = mClass.getModifiers();
-            return Modifier.isAbstract(modifiers) == false && Modifier.isPublic(modifiers) == true;
-        }
-
-        public Class<?> wrappedClass() {
-            return mClass;
-        }
-
-    }
-
-    private String mOsFrameworkLocation;
-
-    /** A cache for binary data extracted from the zip */
-    private final HashMap<String, byte[]> mEntryCache = new HashMap<String, byte[]>();
-    /** A cache for already defined Classes */
-    private final HashMap<String, Class<?> > mClassCache = new HashMap<String, Class<?> >();
-
-    /**
-     * Creates the class loader by providing the os path to the framework jar archive
-     *
-     * @param osFrameworkLocation OS Path of the framework JAR file
-     */
-    public AndroidJarLoader(String osFrameworkLocation) {
-        super();
-        mOsFrameworkLocation = osFrameworkLocation;
-    }
-
-    @Override
-    public String getSource() {
-        return mOsFrameworkLocation;
-    }
-
-    /**
-     * Pre-loads all class binary data that belong to the given package by reading the archive
-     * once and caching them internally.
-     * <p/>
-     * This does not actually preload "classes", it just reads the unzipped bytes for a given
-     * class. To obtain a class, one must call {@link #findClass(String)} later.
-     * <p/>
-     * All classes which package name starts with "packageFilter" will be included and can be
-     * found later.
-     * <p/>
-     * May throw some exceptions if the framework JAR cannot be read.
-     *
-     * @param packageFilter The package that contains all the class data to preload, using a fully
-     *                    qualified binary name (.e.g "com.my.package."). The matching algorithm
-     *                    is simple "startsWith". Use an empty string to include everything.
-     * @param taskLabel An optional task name for the sub monitor. Can be null.
-     * @param monitor A progress monitor. Can be null. Caller is responsible for calling done.
-     * @throws IOException
-     * @throws InvalidAttributeValueException
-     * @throws ClassFormatError
-     */
-    public void preLoadClasses(String packageFilter, String taskLabel, IProgressMonitor monitor)
-        throws IOException, InvalidAttributeValueException, ClassFormatError {
-        // Transform the package name into a zip entry path
-        String pathFilter = packageFilter.replaceAll("\\.", "/"); //$NON-NLS-1$ //$NON-NLS-2$
-
-        SubMonitor progress = SubMonitor.convert(monitor, taskLabel == null ? "" : taskLabel, 100);
-
-        // create streams to read the intermediary archive
-        FileInputStream fis = new FileInputStream(mOsFrameworkLocation);
-        ZipInputStream zis = new ZipInputStream(fis);
-        ZipEntry entry;
-        while ((entry = zis.getNextEntry()) != null) {
-            // get the name of the entry.
-            String entryPath = entry.getName();
-
-            if (!entryPath.endsWith(SdkConstants.DOT_CLASS)) {
-                // only accept class files
-                continue;
-            }
-
-            // check if it is part of the package to preload
-            if (pathFilter.length() > 0 && !entryPath.startsWith(pathFilter)) {
-                continue;
-            }
-            String className = entryPathToClassName(entryPath);
-
-            if (!mEntryCache.containsKey(className)) {
-                long entrySize = entry.getSize();
-                if (entrySize > Integer.MAX_VALUE) {
-                    throw new InvalidAttributeValueException();
-                }
-                byte[] data = readZipData(zis, (int)entrySize);
-                mEntryCache.put(className, data);
-            }
-
-            // advance 5% of whatever is allocated on the progress bar
-            progress.setWorkRemaining(100);
-            progress.worked(5);
-            progress.subTask(String.format("Preload %1$s", className));
-        }
-    }
-
-    /**
-     * Finds and loads all classes that derive from a given set of super classes.
-     * <p/>
-     * As a side-effect this will load and cache most, if not all, classes in the input JAR file.
-     *
-     * @param packageFilter Base name of package of classes to find.
-     *                      Use an empty string to find everyting.
-     * @param superClasses The super classes of all the classes to find.
-     * @return An hash map which keys are the super classes looked for and which values are
-     *         ArrayList of the classes found. The array lists are always created for all the
-     *         valid keys, they are simply empty if no deriving class is found for a given
-     *         super class.
-     * @throws IOException
-     * @throws InvalidAttributeValueException
-     * @throws ClassFormatError
-     */
-    @SuppressWarnings("resource") // Eclipse doesn't understand Closeables.closeQuietly
-    @Override
-    public HashMap<String, ArrayList<IClassDescriptor>> findClassesDerivingFrom(
-            String packageFilter,
-            String[] superClasses)
-            throws IOException, InvalidAttributeValueException, ClassFormatError {
-
-        packageFilter = packageFilter.replaceAll("\\.", "/"); //$NON-NLS-1$ //$NON-NLS-2$
-
-        HashMap<String, ArrayList<IClassDescriptor>> mClassesFound =
-                new HashMap<String, ArrayList<IClassDescriptor>>();
-
-        for (String className : superClasses) {
-            mClassesFound.put(className, new ArrayList<IClassDescriptor>());
-        }
-
-        // create streams to read the intermediary archive
-        FileInputStream fis = new FileInputStream(mOsFrameworkLocation);
-        ZipInputStream zis = new ZipInputStream(fis);
-        try {
-            ZipEntry entry;
-            while ((entry = zis.getNextEntry()) != null) {
-                // get the name of the entry and convert to a class binary name
-                String entryPath = entry.getName();
-                if (!entryPath.endsWith(SdkConstants.DOT_CLASS)) {
-                    // only accept class files
-                    continue;
-                }
-                if (packageFilter.length() > 0 && !entryPath.startsWith(packageFilter)) {
-                    // only accept stuff from the requested root package.
-                    continue;
-                }
-                String className = entryPathToClassName(entryPath);
-
-                Class<?> loaded_class = mClassCache.get(className);
-                if (loaded_class == null) {
-                    byte[] data = mEntryCache.get(className);
-                    if (data == null) {
-                        // Get the class and cache it
-                        long entrySize = entry.getSize();
-                        if (entrySize > Integer.MAX_VALUE) {
-                            throw new InvalidAttributeValueException();
-                        }
-                        data = readZipData(zis, (int)entrySize);
-                    }
-                    try {
-                        loaded_class = defineAndCacheClass(className, data);
-                    } catch (NoClassDefFoundError error) {
-                        if (error.getMessage().startsWith("java/")) {
-                            // Can't define these; we just need to stop
-                            // iteration here
-                            continue;
-                        }
-                        throw error;
-                    }
-                }
-
-                for (Class<?> superClass = loaded_class.getSuperclass();
-                        superClass != null;
-                        superClass = superClass.getSuperclass()) {
-                    String superName = superClass.getCanonicalName();
-                    if (mClassesFound.containsKey(superName)) {
-                        mClassesFound.get(superName).add(new ClassWrapper(loaded_class));
-                        break;
-                    }
-                }
-            }
-        } finally {
-            Closeables.closeQuietly(zis);
-        }
-
-        return mClassesFound;
-    }
-
-    /** Helper method that converts a Zip entry path into a corresponding
-     *  Java full qualified binary class name.
-     *  <p/>
-     *  F.ex, this converts "com/my/package/Foo.class" into "com.my.package.Foo".
-     */
-    private String entryPathToClassName(String entryPath) {
-        return entryPath.replaceFirst("\\.class$", "").replaceAll("[/\\\\]", "."); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-    }
-
-    /**
-     * Finds the class with the specified binary name.
-     *
-     * {@inheritDoc}
-     */
-    @Override
-    protected Class<?> findClass(String name) throws ClassNotFoundException {
-        try {
-            // try to find the class in the cache
-            Class<?> cached_class = mClassCache.get(name);
-            if (cached_class == ClassNotFoundException.class) {
-                // we already know we can't find this class, don't try again
-                throw new ClassNotFoundException(name);
-            } else if (cached_class != null) {
-                return cached_class;
-            }
-
-            // if not found, look it up and cache it
-            byte[] data = loadClassData(name);
-            if (data != null) {
-                return defineAndCacheClass(name, data);
-            } else {
-                // if the class can't be found, record a CNFE class in the map so
-                // that we don't try to reload it next time
-                mClassCache.put(name, ClassNotFoundException.class);
-                throw new ClassNotFoundException(name);
-            }
-        } catch (ClassNotFoundException e) {
-            throw e;
-        } catch (Exception e) {
-            throw new ClassNotFoundException(e.getMessage());
-        }
-    }
-
-    /**
-     * Defines a class based on its binary data and caches the resulting class object.
-     *
-     * @param name The binary name of the class (i.e. package.class1$class2)
-     * @param data The binary data from the loader.
-     * @return The class defined
-     * @throws ClassFormatError if defineClass failed.
-     */
-    private Class<?> defineAndCacheClass(String name, byte[] data) throws ClassFormatError {
-        Class<?> cached_class;
-        cached_class = defineClass(null, data, 0, data.length);
-
-        if (cached_class != null) {
-            // Add new class to the cache class and remove it from the zip entry data cache
-            mClassCache.put(name, cached_class);
-            mEntryCache.remove(name);
-        }
-        return cached_class;
-    }
-
-    /**
-     * Loads a class data from its binary name.
-     * <p/>
-     * This uses the class binary data that has been preloaded earlier by the preLoadClasses()
-     * method if possible.
-     *
-     * @param className the binary name
-     * @return an array of bytes representing the class data or null if not found
-     * @throws InvalidAttributeValueException
-     * @throws IOException
-     */
-    private synchronized byte[] loadClassData(String className)
-            throws InvalidAttributeValueException, IOException {
-
-        byte[] data = mEntryCache.get(className);
-        if (data != null) {
-            return data;
-        }
-
-        // The name is a binary name. Something like "android.R", or "android.R$id".
-        // Make a path out of it.
-        String entryName = className.replaceAll("\\.", "/") + SdkConstants.DOT_CLASS; //$NON-NLS-1$ //$NON-NLS-2$
-
-       // create streams to read the intermediary archive
-        FileInputStream fis = new FileInputStream(mOsFrameworkLocation);
-        ZipInputStream zis = new ZipInputStream(fis);
-        try {
-            // loop on the entries of the intermediary package and put them in the final package.
-            ZipEntry entry;
-
-            while ((entry = zis.getNextEntry()) != null) {
-                // get the name of the entry.
-                String currEntryName = entry.getName();
-
-                if (currEntryName.equals(entryName)) {
-                    long entrySize = entry.getSize();
-                    if (entrySize > Integer.MAX_VALUE) {
-                        throw new InvalidAttributeValueException();
-                    }
-
-                    data = readZipData(zis, (int)entrySize);
-                    return data;
-                }
-            }
-
-            return null;
-        } finally {
-            zis.close();
-        }
-    }
-
-    /**
-     * Reads data for the <em>current</em> entry from the zip input stream.
-     *
-     * @param zis The Zip input stream
-     * @param entrySize The entry size. -1 if unknown.
-     * @return The new data for the <em>current</em> entry.
-     * @throws IOException If ZipInputStream.read() fails.
-     */
-    private byte[] readZipData(ZipInputStream zis, int entrySize) throws IOException {
-        int block_size = 1024;
-        int data_size = entrySize < 1 ? block_size : entrySize;
-        int offset = 0;
-        byte[] data = new byte[data_size];
-
-        while(zis.available() != 0) {
-            int count = zis.read(data, offset, data_size - offset);
-            if (count < 0) {  // read data is done
-                break;
-            }
-            offset += count;
-
-            if (entrySize >= 1 && offset >= entrySize) {  // we know the size and we're done
-                break;
-            }
-
-            // if we don't know the entry size and we're not done reading,
-            // expand the data buffer some more.
-            if (offset >= data_size) {
-                byte[] temp = new byte[data_size + block_size];
-                System.arraycopy(data, 0, temp, 0, data_size);
-                data_size += block_size;
-                data = temp;
-                block_size *= 2;
-            }
-        }
-
-        if (offset < data_size) {
-            // buffer was allocated too large, trim it
-            byte[] temp = new byte[offset];
-            if (offset > 0) {
-                System.arraycopy(data, 0, temp, 0, offset);
-            }
-            data = temp;
-        }
-
-        return data;
-    }
-
-    /**
-     * Returns a {@link IAndroidClassLoader.IClassDescriptor} by its fully-qualified name.
-     * @param className the fully-qualified name of the class to return.
-     * @throws ClassNotFoundException
-     */
-    @Override
-    public IClassDescriptor getClass(String className) throws ClassNotFoundException {
-        try {
-            return new ClassWrapper(loadClass(className));
-        } catch (ClassNotFoundException e) {
-            throw e;  // useful for debugging
-        }
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/sdk/AndroidTargetData.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/sdk/AndroidTargetData.java
deleted file mode 100644
index 85ae9fd..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/sdk/AndroidTargetData.java
+++ /dev/null
@@ -1,417 +0,0 @@
-/*
- * Copyright (C) 2007 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.sdk;
-
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-import com.android.ide.common.rendering.LayoutLibrary;
-import com.android.ide.common.rendering.api.LayoutLog;
-import com.android.ide.common.resources.ResourceRepository;
-import com.android.ide.common.resources.platform.AttributeInfo;
-import com.android.ide.common.sdk.LoadStatus;
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.ide.eclipse.adt.internal.editors.animator.AnimDescriptors;
-import com.android.ide.eclipse.adt.internal.editors.animator.AnimatorDescriptors;
-import com.android.ide.eclipse.adt.internal.editors.color.ColorDescriptors;
-import com.android.ide.eclipse.adt.internal.editors.descriptors.IDescriptorProvider;
-import com.android.ide.eclipse.adt.internal.editors.drawable.DrawableDescriptors;
-import com.android.ide.eclipse.adt.internal.editors.layout.descriptors.LayoutDescriptors;
-import com.android.ide.eclipse.adt.internal.editors.manifest.descriptors.AndroidManifestDescriptors;
-import com.android.ide.eclipse.adt.internal.editors.menu.descriptors.MenuDescriptors;
-import com.android.ide.eclipse.adt.internal.editors.otherxml.descriptors.OtherXmlDescriptors;
-import com.android.ide.eclipse.adt.internal.editors.values.descriptors.ValuesDescriptors;
-import com.android.ide.eclipse.adt.internal.resources.manager.ProjectResources;
-import com.android.sdklib.IAndroidTarget;
-import com.android.sdklib.IAndroidTarget.IOptionalLibrary;
-
-import org.eclipse.core.runtime.IStatus;
-
-import java.io.File;
-import java.util.ArrayList;
-import java.util.Hashtable;
-import java.util.Map;
-
-/**
- * This class contains the data of an Android Target as loaded from the SDK.
- */
-public class AndroidTargetData {
-
-    public final static int DESCRIPTOR_MANIFEST = 1;
-    public final static int DESCRIPTOR_LAYOUT = 2;
-    public final static int DESCRIPTOR_MENU = 3;
-    public final static int DESCRIPTOR_OTHER_XML = 4;
-    public final static int DESCRIPTOR_RESOURCES = 5;
-    public final static int DESCRIPTOR_SEARCHABLE = 6;
-    public final static int DESCRIPTOR_PREFERENCES = 7;
-    public final static int DESCRIPTOR_APPWIDGET_PROVIDER = 8;
-    public final static int DESCRIPTOR_DRAWABLE = 9;
-    public final static int DESCRIPTOR_ANIMATOR = 10;
-    public final static int DESCRIPTOR_ANIM = 11;
-    public final static int DESCRIPTOR_COLOR = 12;
-
-    private final IAndroidTarget mTarget;
-
-    /**
-     * mAttributeValues is a map { key => list [ values ] }.
-     * The key for the map is "(element-xml-name,attribute-namespace:attribute-xml-local-name)".
-     * The attribute namespace prefix must be:
-     * - "android" for SdkConstants.NS_RESOURCES
-     * - "xmlns" for the XMLNS URI.
-     *
-     * This is used for attributes that do not have a unique name, but still need to be populated
-     * with values in the UI. Uniquely named attributes have their values in {@link #mEnumValueMap}.
-     */
-    private Hashtable<String, String[]> mAttributeValues = new Hashtable<String, String[]>();
-
-    private AndroidManifestDescriptors mManifestDescriptors;
-    private DrawableDescriptors mDrawableDescriptors;
-    private AnimatorDescriptors mAnimatorDescriptors;
-    private AnimDescriptors mAnimDescriptors;
-    private ColorDescriptors mColorDescriptors;
-    private LayoutDescriptors mLayoutDescriptors;
-    private MenuDescriptors mMenuDescriptors;
-    private OtherXmlDescriptors mOtherXmlDescriptors;
-
-    private Map<String, Map<String, Integer>> mEnumValueMap;
-
-    private ResourceRepository mFrameworkResources;
-    private LayoutLibrary mLayoutLibrary;
-    private Map<String, AttributeInfo> mAttributeMap;
-
-    private boolean mLayoutBridgeInit = false;
-
-    AndroidTargetData(IAndroidTarget androidTarget) {
-        mTarget = androidTarget;
-    }
-
-    /**
-     * Sets the associated map from string attribute name to
-     * {@link AttributeInfo}
-     *
-     * @param attributeMap the map
-     */
-    public void setAttributeMap(@NonNull Map<String, AttributeInfo> attributeMap) {
-        mAttributeMap = attributeMap;
-    }
-
-    /**
-     * Returns the associated map from string attribute name to
-     * {@link AttributeInfo}
-     *
-     * @return the map
-     */
-    @Nullable
-    public Map<String, AttributeInfo> getAttributeMap() {
-        return mAttributeMap;
-    }
-
-    /**
-     * Creates an AndroidTargetData object.
-     */
-    void setExtraData(
-            AndroidManifestDescriptors manifestDescriptors,
-            LayoutDescriptors layoutDescriptors,
-            MenuDescriptors menuDescriptors,
-            OtherXmlDescriptors otherXmlDescriptors,
-            DrawableDescriptors drawableDescriptors,
-            AnimatorDescriptors animatorDescriptors,
-            AnimDescriptors animDescriptors,
-            ColorDescriptors colorDescriptors,
-            Map<String, Map<String, Integer>> enumValueMap,
-            String[] permissionValues,
-            String[] activityIntentActionValues,
-            String[] broadcastIntentActionValues,
-            String[] serviceIntentActionValues,
-            String[] intentCategoryValues,
-            String[] platformLibraries,
-            IOptionalLibrary[] optionalLibraries,
-            ResourceRepository frameworkResources,
-            LayoutLibrary layoutLibrary) {
-
-        mManifestDescriptors = manifestDescriptors;
-        mDrawableDescriptors = drawableDescriptors;
-        mAnimatorDescriptors = animatorDescriptors;
-        mAnimDescriptors = animDescriptors;
-        mColorDescriptors = colorDescriptors;
-        mLayoutDescriptors = layoutDescriptors;
-        mMenuDescriptors = menuDescriptors;
-        mOtherXmlDescriptors = otherXmlDescriptors;
-        mEnumValueMap = enumValueMap;
-        mFrameworkResources = frameworkResources;
-        mLayoutLibrary = layoutLibrary;
-
-        setPermissions(permissionValues);
-        setIntentFilterActionsAndCategories(activityIntentActionValues, broadcastIntentActionValues,
-                serviceIntentActionValues, intentCategoryValues);
-        setOptionalLibraries(platformLibraries, optionalLibraries);
-    }
-
-    /**
-     * Returns an {@link IDescriptorProvider} from a given Id.
-     * The Id can be one of {@link #DESCRIPTOR_MANIFEST}, {@link #DESCRIPTOR_LAYOUT},
-     * {@link #DESCRIPTOR_MENU}, or {@link #DESCRIPTOR_OTHER_XML}.
-     * All other values will throw an {@link IllegalArgumentException}.
-     */
-    public IDescriptorProvider getDescriptorProvider(int descriptorId) {
-        switch (descriptorId) {
-            case DESCRIPTOR_MANIFEST:
-                return mManifestDescriptors;
-            case DESCRIPTOR_LAYOUT:
-                return mLayoutDescriptors;
-            case DESCRIPTOR_MENU:
-                return mMenuDescriptors;
-            case DESCRIPTOR_OTHER_XML:
-                return mOtherXmlDescriptors;
-            case DESCRIPTOR_RESOURCES:
-                // FIXME: since it's hard-coded the Resources Descriptors are not platform dependent.
-                return ValuesDescriptors.getInstance();
-            case DESCRIPTOR_PREFERENCES:
-                return mOtherXmlDescriptors.getPreferencesProvider();
-            case DESCRIPTOR_APPWIDGET_PROVIDER:
-                return mOtherXmlDescriptors.getAppWidgetProvider();
-            case DESCRIPTOR_SEARCHABLE:
-                return mOtherXmlDescriptors.getSearchableProvider();
-            case DESCRIPTOR_DRAWABLE:
-                return mDrawableDescriptors;
-            case DESCRIPTOR_ANIMATOR:
-                return mAnimatorDescriptors;
-            case DESCRIPTOR_ANIM:
-                return mAnimDescriptors;
-            case DESCRIPTOR_COLOR:
-                return mColorDescriptors;
-            default :
-                 throw new IllegalArgumentException();
-        }
-    }
-
-    /**
-     * Returns the manifest descriptors.
-     */
-    public AndroidManifestDescriptors getManifestDescriptors() {
-        return mManifestDescriptors;
-    }
-
-    /**
-     * Returns the drawable descriptors
-     */
-    public DrawableDescriptors getDrawableDescriptors() {
-        return mDrawableDescriptors;
-    }
-
-    /**
-     * Returns the animation descriptors
-     */
-    public AnimDescriptors getAnimDescriptors() {
-        return mAnimDescriptors;
-    }
-
-    /**
-     * Returns the color descriptors
-     */
-    public ColorDescriptors getColorDescriptors() {
-        return mColorDescriptors;
-    }
-
-    /**
-     * Returns the animator descriptors
-     */
-    public AnimatorDescriptors getAnimatorDescriptors() {
-        return mAnimatorDescriptors;
-    }
-
-    /**
-     * Returns the layout Descriptors.
-     */
-    public LayoutDescriptors getLayoutDescriptors() {
-        return mLayoutDescriptors;
-    }
-
-    /**
-     * Returns the menu descriptors.
-     */
-    public MenuDescriptors getMenuDescriptors() {
-        return mMenuDescriptors;
-    }
-
-    /**
-     * Returns the XML descriptors
-     */
-    public OtherXmlDescriptors getXmlDescriptors() {
-        return mOtherXmlDescriptors;
-    }
-
-    /**
-     * Returns this list of possible values for an XML attribute.
-     * <p/>This should only be called for attributes for which possible values depend on the
-     * parent element node.
-     * <p/>For attributes that have the same values no matter the parent node, use
-     * {@link #getEnumValueMap()}.
-     * @param elementName the name of the element containing the attribute.
-     * @param attributeName the name of the attribute
-     * @return an array of String with the possible values, or <code>null</code> if no values were
-     * found.
-     */
-    public String[] getAttributeValues(String elementName, String attributeName) {
-        String key = String.format("(%1$s,%2$s)", elementName, attributeName); //$NON-NLS-1$
-        return mAttributeValues.get(key);
-    }
-
-    /**
-     * Returns this list of possible values for an XML attribute.
-     * <p/>This should only be called for attributes for which possible values depend on the
-     * parent and great-grand-parent element node.
-     * <p/>The typical example of this is for the 'name' attribute under
-     * activity/intent-filter/action
-     * <p/>For attributes that have the same values no matter the parent node, use
-     * {@link #getEnumValueMap()}.
-     * @param elementName the name of the element containing the attribute.
-     * @param attributeName the name of the attribute
-     * @param greatGrandParentElementName the great-grand-parent node.
-     * @return an array of String with the possible values, or <code>null</code> if no values were
-     * found.
-     */
-    public String[] getAttributeValues(String elementName, String attributeName,
-            String greatGrandParentElementName) {
-        if (greatGrandParentElementName != null) {
-            String key = String.format("(%1$s,%2$s,%3$s)", //$NON-NLS-1$
-                    greatGrandParentElementName, elementName, attributeName);
-            String[] values = mAttributeValues.get(key);
-            if (values != null) {
-                return values;
-            }
-        }
-
-        return getAttributeValues(elementName, attributeName);
-    }
-
-    /**
-     * Returns the enum values map.
-     * <p/>The map defines the possible values for XML attributes. The key is the attribute name
-     * and the value is a map of (string, integer) in which the key (string) is the name of
-     * the value, and the Integer is the numerical value in the compiled binary XML files.
-     */
-    public Map<String, Map<String, Integer>> getEnumValueMap() {
-        return mEnumValueMap;
-    }
-
-    /**
-     * Returns the {@link ProjectResources} containing the Framework Resources.
-     */
-    public ResourceRepository getFrameworkResources() {
-        return mFrameworkResources;
-    }
-
-    /**
-     * Returns a {@link LayoutLibrary} object possibly containing a {@link LayoutBridge} object.
-     * <p/>If {@link LayoutLibrary#getBridge()} is <code>null</code>,
-     * {@link LayoutBridge#getStatus()} will contain the reason (either {@link LoadStatus#LOADING}
-     * or {@link LoadStatus#FAILED}).
-     * <p/>Valid {@link LayoutBridge} objects are always initialized before being returned.
-     */
-    public synchronized LayoutLibrary getLayoutLibrary() {
-        if (mLayoutBridgeInit == false && mLayoutLibrary.getStatus() == LoadStatus.LOADED) {
-            boolean ok = mLayoutLibrary.init(
-                    mTarget.getProperties(),
-                    new File(mTarget.getPath(IAndroidTarget.FONTS)),
-                    getEnumValueMap(),
-                    new LayoutLog() {
-
-                        @Override
-                        public void error(String tag, String message, Throwable throwable,
-                                Object data) {
-                            AdtPlugin.log(throwable, message);
-                        }
-
-                        @Override
-                        public void error(String tag, String message, Object data) {
-                            AdtPlugin.log(IStatus.ERROR, message);
-                        }
-
-                        @Override
-                        public void warning(String tag, String message, Object data) {
-                            AdtPlugin.log(IStatus.WARNING, message);
-                        }
-                    });
-            if (!ok) {
-                AdtPlugin.log(IStatus.ERROR,
-                        "LayoutLibrary initialization failed");
-            }
-            mLayoutBridgeInit = true;
-        }
-
-        return mLayoutLibrary;
-    }
-
-    /**
-     * Sets the permission values
-     * @param permissionValues the list of permissions
-     */
-    private void setPermissions(String[] permissionValues) {
-        setValues("(uses-permission,android:name)", permissionValues);   //$NON-NLS-1$
-        setValues("(application,android:permission)", permissionValues); //$NON-NLS-1$
-        setValues("(activity,android:permission)", permissionValues);    //$NON-NLS-1$
-        setValues("(receiver,android:permission)", permissionValues);    //$NON-NLS-1$
-        setValues("(service,android:permission)", permissionValues);     //$NON-NLS-1$
-        setValues("(provider,android:permission)", permissionValues);    //$NON-NLS-1$
-    }
-
-    private void setIntentFilterActionsAndCategories(String[] activityIntentActions,
-            String[] broadcastIntentActions, String[] serviceIntentActions,
-            String[] intentCategoryValues) {
-        setValues("(activity,action,android:name)", activityIntentActions);  //$NON-NLS-1$
-        setValues("(receiver,action,android:name)", broadcastIntentActions); //$NON-NLS-1$
-        setValues("(service,action,android:name)", serviceIntentActions);    //$NON-NLS-1$
-        setValues("(category,android:name)", intentCategoryValues);          //$NON-NLS-1$
-    }
-
-    private void setOptionalLibraries(String[] platformLibraries,
-            IOptionalLibrary[] optionalLibraries) {
-
-        ArrayList<String> libs = new ArrayList<String>();
-
-        if (platformLibraries != null) {
-            for (String name : platformLibraries) {
-                libs.add(name);
-            }
-        }
-
-        if (optionalLibraries != null) {
-            for (int i = 0; i < optionalLibraries.length; i++) {
-                libs.add(optionalLibraries[i].getName());
-            }
-        }
-        setValues("(uses-library,android:name)",  libs.toArray(new String[libs.size()]));
-    }
-
-    /**
-     * Sets a (name, values) pair in the hash map.
-     * <p/>
-     * If the name is already present in the map, it is first removed.
-     * @param name the name associated with the values.
-     * @param values The values to add.
-     */
-    private void setValues(String name, String[] values) {
-        mAttributeValues.remove(name);
-        mAttributeValues.put(name, values);
-    }
-
-    public void dispose() {
-        if (mLayoutLibrary != null) {
-            mLayoutLibrary.dispose();
-        }
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/sdk/AndroidTargetParser.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/sdk/AndroidTargetParser.java
deleted file mode 100644
index 9a1fd3d..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/sdk/AndroidTargetParser.java
+++ /dev/null
@@ -1,605 +0,0 @@
-/*
- * 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.sdk;
-
-import com.android.SdkConstants;
-import com.android.ide.common.rendering.LayoutLibrary;
-import com.android.ide.common.resources.ResourceRepository;
-import com.android.ide.common.resources.platform.AttrsXmlParser;
-import com.android.ide.common.resources.platform.DeclareStyleableInfo;
-import com.android.ide.common.resources.platform.ViewClassInfo;
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.ide.eclipse.adt.internal.editors.animator.AnimDescriptors;
-import com.android.ide.eclipse.adt.internal.editors.animator.AnimatorDescriptors;
-import com.android.ide.eclipse.adt.internal.editors.color.ColorDescriptors;
-import com.android.ide.eclipse.adt.internal.editors.drawable.DrawableDescriptors;
-import com.android.ide.eclipse.adt.internal.editors.layout.descriptors.LayoutDescriptors;
-import com.android.ide.eclipse.adt.internal.editors.manifest.descriptors.AndroidManifestDescriptors;
-import com.android.ide.eclipse.adt.internal.editors.menu.descriptors.MenuDescriptors;
-import com.android.ide.eclipse.adt.internal.editors.otherxml.descriptors.OtherXmlDescriptors;
-import com.android.ide.eclipse.adt.internal.resources.manager.ResourceManager;
-import com.android.sdklib.IAndroidTarget;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.core.runtime.SubMonitor;
-
-import java.io.BufferedReader;
-import java.io.FileNotFoundException;
-import java.io.FileReader;
-import java.io.IOException;
-import java.lang.reflect.Field;
-import java.lang.reflect.Modifier;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import javax.management.InvalidAttributeValueException;
-
-/**
- * Parser for the platform data in an SDK.
- * <p/>
- * This gather the following information:
- * <ul>
- * <li>Resource ID from <code>android.R</code></li>
- * <li>The list of permissions values from <code>android.Manifest$permission</code></li>
- * <li></li>
- * </ul>
- */
-public final class AndroidTargetParser {
-
-    private static final String TAG = "Framework Resource Parser";
-    private final IAndroidTarget mAndroidTarget;
-
-    /**
-     * Creates a platform data parser.
-     */
-    public AndroidTargetParser(IAndroidTarget platformTarget) {
-        mAndroidTarget = platformTarget;
-    }
-
-    /**
-     * Parses the framework, collects all interesting information and stores them in the
-     * {@link IAndroidTarget} given to the constructor.
-     *
-     * @param monitor A progress monitor. Can be null. Caller is responsible for calling done.
-     * @return True if the SDK path was valid and parsing has been attempted.
-     */
-    public IStatus run(IProgressMonitor monitor) {
-        try {
-            SubMonitor progress = SubMonitor.convert(monitor,
-                    String.format("Parsing SDK %1$s", mAndroidTarget.getName()),
-                    16);
-
-            AndroidTargetData targetData = new AndroidTargetData(mAndroidTarget);
-
-            // parse the rest of the data.
-
-            AndroidJarLoader classLoader =
-                new AndroidJarLoader(mAndroidTarget.getPath(IAndroidTarget.ANDROID_JAR));
-
-            preload(classLoader, progress.newChild(40, SubMonitor.SUPPRESS_NONE));
-
-            if (progress.isCanceled()) {
-                return Status.CANCEL_STATUS;
-            }
-
-            // get the permissions
-            progress.subTask("Permissions");
-            String[] permissionValues = collectPermissions(classLoader);
-            progress.worked(1);
-
-            if (progress.isCanceled()) {
-                return Status.CANCEL_STATUS;
-            }
-
-            // get the action and category values for the Intents.
-            progress.subTask("Intents");
-            ArrayList<String> activity_actions = new ArrayList<String>();
-            ArrayList<String> broadcast_actions = new ArrayList<String>();
-            ArrayList<String> service_actions = new ArrayList<String>();
-            ArrayList<String> categories = new ArrayList<String>();
-            collectIntentFilterActionsAndCategories(activity_actions, broadcast_actions,
-                    service_actions, categories);
-            progress.worked(1);
-
-            if (progress.isCanceled()) {
-                return Status.CANCEL_STATUS;
-            }
-
-            // gather the attribute definition
-            progress.subTask("Attributes definitions");
-            AttrsXmlParser attrsXmlParser = new AttrsXmlParser(
-                    mAndroidTarget.getPath(IAndroidTarget.ATTRIBUTES),
-                    AdtPlugin.getDefault(),
-                    1000);
-            attrsXmlParser.preload();
-
-            progress.worked(1);
-
-            progress.subTask("Manifest definitions");
-            AttrsXmlParser attrsManifestXmlParser = new AttrsXmlParser(
-                    mAndroidTarget.getPath(IAndroidTarget.MANIFEST_ATTRIBUTES),
-                    attrsXmlParser,
-                    AdtPlugin.getDefault(), 1100);
-            attrsManifestXmlParser.preload();
-            progress.worked(1);
-
-            Collection<ViewClassInfo> mainList = new ArrayList<ViewClassInfo>();
-            Collection<ViewClassInfo> groupList = new ArrayList<ViewClassInfo>();
-
-            // collect the layout/widgets classes
-            progress.subTask("Widgets and layouts");
-            collectLayoutClasses(classLoader, attrsXmlParser, mainList, groupList,
-                    progress.newChild(1));
-
-            if (progress.isCanceled()) {
-                return Status.CANCEL_STATUS;
-            }
-
-            ViewClassInfo[] layoutViewsInfo = mainList.toArray(
-                    new ViewClassInfo[mainList.size()]);
-            ViewClassInfo[] layoutGroupsInfo = groupList.toArray(
-                    new ViewClassInfo[groupList.size()]);
-            mainList.clear();
-            groupList.clear();
-
-            // collect the preferences classes.
-            collectPreferenceClasses(classLoader, attrsXmlParser, mainList, groupList,
-                    progress.newChild(1));
-
-            if (progress.isCanceled()) {
-                return Status.CANCEL_STATUS;
-            }
-
-            ViewClassInfo[] preferencesInfo = mainList.toArray(new ViewClassInfo[mainList.size()]);
-            ViewClassInfo[] preferenceGroupsInfo = groupList.toArray(
-                    new ViewClassInfo[groupList.size()]);
-
-            Map<String, DeclareStyleableInfo> xmlMenuMap = collectMenuDefinitions(attrsXmlParser);
-            Map<String, DeclareStyleableInfo> xmlSearchableMap = collectSearchableDefinitions(
-                    attrsXmlParser);
-            Map<String, DeclareStyleableInfo> manifestMap = collectManifestDefinitions(
-                                                                            attrsManifestXmlParser);
-            Map<String, Map<String, Integer>> enumValueMap = attrsXmlParser.getEnumFlagValues();
-
-            Map<String, DeclareStyleableInfo> xmlAppWidgetMap = null;
-            if (mAndroidTarget.getVersion().getApiLevel() >= 3) {
-                xmlAppWidgetMap = collectAppWidgetDefinitions(attrsXmlParser);
-            }
-
-            if (progress.isCanceled()) {
-                return Status.CANCEL_STATUS;
-            }
-
-            // From the information that was collected, create the pieces that will be put in
-            // the PlatformData object.
-            AndroidManifestDescriptors manifestDescriptors = new AndroidManifestDescriptors();
-            manifestDescriptors.updateDescriptors(manifestMap);
-            progress.worked(1);
-
-            if (progress.isCanceled()) {
-                return Status.CANCEL_STATUS;
-            }
-
-            LayoutDescriptors layoutDescriptors = new LayoutDescriptors();
-            layoutDescriptors.updateDescriptors(layoutViewsInfo, layoutGroupsInfo,
-                    attrsXmlParser.getDeclareStyleableList(), mAndroidTarget);
-            progress.worked(1);
-
-            if (progress.isCanceled()) {
-                return Status.CANCEL_STATUS;
-            }
-
-            MenuDescriptors menuDescriptors = new MenuDescriptors();
-            menuDescriptors.updateDescriptors(xmlMenuMap);
-            progress.worked(1);
-
-            if (progress.isCanceled()) {
-                return Status.CANCEL_STATUS;
-            }
-
-            OtherXmlDescriptors otherXmlDescriptors = new OtherXmlDescriptors();
-            otherXmlDescriptors.updateDescriptors(
-                    xmlSearchableMap,
-                    xmlAppWidgetMap,
-                    preferencesInfo,
-                    preferenceGroupsInfo);
-            progress.worked(1);
-
-            if (progress.isCanceled()) {
-                return Status.CANCEL_STATUS;
-            }
-
-            DrawableDescriptors drawableDescriptors = new DrawableDescriptors();
-            Map<String, DeclareStyleableInfo> map = attrsXmlParser.getDeclareStyleableList();
-            drawableDescriptors.updateDescriptors(map);
-            progress.worked(1);
-
-            if (progress.isCanceled()) {
-                return Status.CANCEL_STATUS;
-            }
-
-            AnimatorDescriptors animatorDescriptors = new AnimatorDescriptors();
-            animatorDescriptors.updateDescriptors(map);
-            progress.worked(1);
-
-            if (progress.isCanceled()) {
-                return Status.CANCEL_STATUS;
-            }
-
-            AnimDescriptors animDescriptors = new AnimDescriptors();
-            animDescriptors.updateDescriptors(map);
-            progress.worked(1);
-
-            if (progress.isCanceled()) {
-                return Status.CANCEL_STATUS;
-            }
-
-            ColorDescriptors colorDescriptors = new ColorDescriptors();
-            colorDescriptors.updateDescriptors(map);
-            progress.worked(1);
-
-            // load the framework resources.
-            ResourceRepository frameworkResources =
-                    ResourceManager.getInstance().loadFrameworkResources(mAndroidTarget);
-            progress.worked(1);
-
-            // now load the layout lib bridge
-            LayoutLibrary layoutBridge =  LayoutLibrary.load(
-                    mAndroidTarget.getPath(IAndroidTarget.LAYOUT_LIB),
-                    AdtPlugin.getDefault(),
-                    "ADT plug-in");
-
-            progress.worked(1);
-
-            // and finally create the PlatformData with all that we loaded.
-            targetData.setExtraData(
-                    manifestDescriptors,
-                    layoutDescriptors,
-                    menuDescriptors,
-                    otherXmlDescriptors,
-                    drawableDescriptors,
-                    animatorDescriptors,
-                    animDescriptors,
-                    colorDescriptors,
-                    enumValueMap,
-                    permissionValues,
-                    activity_actions.toArray(new String[activity_actions.size()]),
-                    broadcast_actions.toArray(new String[broadcast_actions.size()]),
-                    service_actions.toArray(new String[service_actions.size()]),
-                    categories.toArray(new String[categories.size()]),
-                    mAndroidTarget.getPlatformLibraries(),
-                    mAndroidTarget.getOptionalLibraries(),
-                    frameworkResources,
-                    layoutBridge);
-
-            targetData.setAttributeMap(attrsXmlParser.getAttributeMap());
-
-            Sdk.getCurrent().setTargetData(mAndroidTarget, targetData);
-
-            return Status.OK_STATUS;
-        } catch (Exception e) {
-            AdtPlugin.logAndPrintError(e, TAG, "SDK parser failed"); //$NON-NLS-1$
-            AdtPlugin.printToConsole("SDK parser failed", e.getMessage());
-            return new Status(IStatus.ERROR, AdtPlugin.PLUGIN_ID, "SDK parser failed", e);
-        }
-    }
-
-    /**
-     * Preloads all "interesting" classes from the framework SDK jar.
-     * <p/>
-     * Currently this preloads all classes from the framework jar
-     *
-     * @param classLoader The framework SDK jar classloader
-     * @param monitor A progress monitor. Can be null. Caller is responsible for calling done.
-     */
-    private void preload(AndroidJarLoader classLoader, IProgressMonitor monitor) {
-        try {
-            classLoader.preLoadClasses("" /* all classes */,        //$NON-NLS-1$
-                    mAndroidTarget.getName(),                       // monitor task label
-                    monitor);
-        } catch (InvalidAttributeValueException e) {
-            AdtPlugin.log(e, "Problem preloading classes"); //$NON-NLS-1$
-        } catch (IOException e) {
-            AdtPlugin.log(e, "Problem preloading classes"); //$NON-NLS-1$
-        }
-    }
-
-    /**
-     * Loads, collects and returns the list of default permissions from the framework.
-     *
-     * @param classLoader The framework SDK jar classloader
-     * @return a non null (but possibly empty) array containing the permission values.
-     */
-    private String[] collectPermissions(AndroidJarLoader classLoader) {
-        try {
-            Class<?> permissionClass =
-                classLoader.loadClass(SdkConstants.CLASS_MANIFEST_PERMISSION);
-
-            if (permissionClass != null) {
-                ArrayList<String> list = new ArrayList<String>();
-
-                Field[] fields = permissionClass.getFields();
-
-                for (Field f : fields) {
-                    int modifiers = f.getModifiers();
-                    if (Modifier.isStatic(modifiers) && Modifier.isFinal(modifiers) &&
-                            Modifier.isPublic(modifiers)) {
-                        try {
-                            Object value = f.get(null);
-                            if (value instanceof String) {
-                                list.add((String)value);
-                            }
-                        } catch (IllegalArgumentException e) {
-                            // since we provide null this should not happen
-                        } catch (IllegalAccessException e) {
-                            // if the field is inaccessible we ignore it.
-                        } catch (NullPointerException npe) {
-                            // looks like this is not a static field. we can ignore.
-                        } catch (ExceptionInInitializerError  eiie) {
-                            // lets just ignore the field again
-                        }
-                    }
-                }
-
-                return list.toArray(new String[list.size()]);
-            }
-        } catch (ClassNotFoundException e) {
-            AdtPlugin.logAndPrintError(e, TAG,
-                    "Collect permissions failed, class %1$s not found in %2$s", //$NON-NLS-1$
-                    SdkConstants.CLASS_MANIFEST_PERMISSION,
-                    mAndroidTarget.getPath(IAndroidTarget.ANDROID_JAR));
-        }
-
-        return new String[0];
-    }
-
-    /**
-     * Loads and collects the action and category default values from the framework.
-     * The values are added to the <code>actions</code> and <code>categories</code> lists.
-     *
-     * @param activityActions the list which will receive the activity action values.
-     * @param broadcastActions the list which will receive the broadcast action values.
-     * @param serviceActions the list which will receive the service action values.
-     * @param categories the list which will receive the category values.
-     */
-    private void collectIntentFilterActionsAndCategories(ArrayList<String> activityActions,
-            ArrayList<String> broadcastActions,
-            ArrayList<String> serviceActions, ArrayList<String> categories)  {
-        collectValues(mAndroidTarget.getPath(IAndroidTarget.ACTIONS_ACTIVITY),
-                activityActions);
-        collectValues(mAndroidTarget.getPath(IAndroidTarget.ACTIONS_BROADCAST),
-                broadcastActions);
-        collectValues(mAndroidTarget.getPath(IAndroidTarget.ACTIONS_SERVICE),
-                serviceActions);
-        collectValues(mAndroidTarget.getPath(IAndroidTarget.CATEGORIES),
-                categories);
-    }
-
-    /**
-     * Collects values from a text file located in the SDK
-     * @param osFilePath The path to the text file.
-     * @param values the {@link ArrayList} to fill with the values.
-     */
-    private void collectValues(String osFilePath, ArrayList<String> values) {
-        FileReader fr = null;
-        BufferedReader reader = null;
-        try {
-            fr = new FileReader(osFilePath);
-            reader = new BufferedReader(fr);
-
-            String line;
-            while ((line = reader.readLine()) != null) {
-                line = line.trim();
-                if (line.length() > 0 && line.startsWith("#") == false) { //$NON-NLS-1$
-                    values.add(line);
-                }
-            }
-        } catch (IOException e) {
-            AdtPlugin.log(e, "Failed to read SDK values"); //$NON-NLS-1$
-        } finally {
-            try {
-                if (reader != null) {
-                    reader.close();
-                }
-            } catch (IOException e) {
-                AdtPlugin.log(e, "Failed to read SDK values"); //$NON-NLS-1$
-            }
-
-            try {
-                if (fr != null) {
-                    fr.close();
-                }
-            } catch (IOException e) {
-                AdtPlugin.log(e, "Failed to read SDK values"); //$NON-NLS-1$
-            }
-        }
-    }
-
-    /**
-     * Collects all layout classes information from the class loader and the
-     * attrs.xml and sets the corresponding structures in the resource manager.
-     *
-     * @param classLoader The framework SDK jar classloader in case we cannot get the widget from
-     * the platform directly
-     * @param attrsXmlParser The parser of the attrs.xml file
-     * @param mainList the Collection to receive the main list of {@link ViewClassInfo}.
-     * @param groupList the Collection to receive the group list of {@link ViewClassInfo}.
-     * @param monitor A progress monitor. Can be null. Caller is responsible for calling done.
-     */
-    private void collectLayoutClasses(AndroidJarLoader classLoader,
-            AttrsXmlParser attrsXmlParser,
-            Collection<ViewClassInfo> mainList,
-            Collection<ViewClassInfo> groupList,
-            IProgressMonitor monitor) {
-        LayoutParamsParser ldp = null;
-        try {
-            WidgetClassLoader loader = new WidgetClassLoader(
-                    mAndroidTarget.getPath(IAndroidTarget.WIDGETS));
-            if (loader.parseWidgetList(monitor)) {
-                ldp = new LayoutParamsParser(loader, attrsXmlParser);
-            }
-            // if the parsing failed, we'll use the old loader below.
-        } catch (FileNotFoundException e) {
-            AdtPlugin.log(e, "Android Framework Parser"); //$NON-NLS-1$
-            // the file does not exist, we'll use the old loader below.
-        }
-
-        if (ldp == null) {
-            ldp = new LayoutParamsParser(classLoader, attrsXmlParser);
-        }
-        ldp.parseLayoutClasses(monitor);
-
-        List<ViewClassInfo> views = ldp.getViews();
-        List<ViewClassInfo> groups = ldp.getGroups();
-
-        if (views != null && groups != null) {
-            mainList.addAll(views);
-            groupList.addAll(groups);
-        }
-    }
-
-    /**
-     * Collects all preferences definition information from the attrs.xml and
-     * sets the corresponding structures in the resource manager.
-     *
-     * @param classLoader The framework SDK jar classloader
-     * @param attrsXmlParser The parser of the attrs.xml file
-     * @param mainList the Collection to receive the main list of {@link ViewClassInfo}.
-     * @param groupList the Collection to receive the group list of {@link ViewClassInfo}.
-     * @param monitor A progress monitor. Can be null. Caller is responsible for calling done.
-     */
-    private void collectPreferenceClasses(AndroidJarLoader classLoader,
-            AttrsXmlParser attrsXmlParser, Collection<ViewClassInfo> mainList,
-            Collection<ViewClassInfo> groupList, IProgressMonitor monitor) {
-        LayoutParamsParser ldp = new LayoutParamsParser(classLoader, attrsXmlParser);
-
-        try {
-            ldp.parsePreferencesClasses(monitor);
-
-            List<ViewClassInfo> prefs = ldp.getViews();
-            List<ViewClassInfo> groups = ldp.getGroups();
-
-            if (prefs != null && groups != null) {
-                mainList.addAll(prefs);
-                groupList.addAll(groups);
-            }
-        } catch (NoClassDefFoundError e) {
-            AdtPlugin.logAndPrintError(e, TAG,
-                    "Collect preferences failed, class %1$s not found in %2$s",
-                    e.getMessage(),
-                    classLoader.getSource());
-        } catch (Throwable e) {
-            AdtPlugin.log(e, "Android Framework Parser: failed to collect preference classes"); //$NON-NLS-1$
-            AdtPlugin.printErrorToConsole("Android Framework Parser",
-                    "failed to collect preference classes");
-        }
-    }
-
-    /**
-     * Collects all menu definition information from the attrs.xml and returns it.
-     *
-     * @param attrsXmlParser The parser of the attrs.xml file
-     */
-    private Map<String, DeclareStyleableInfo> collectMenuDefinitions(
-            AttrsXmlParser attrsXmlParser) {
-        Map<String, DeclareStyleableInfo> map = attrsXmlParser.getDeclareStyleableList();
-        Map<String, DeclareStyleableInfo> map2 = new HashMap<String, DeclareStyleableInfo>();
-        for (String key : new String[] { "Menu",        //$NON-NLS-1$
-                                         "MenuItem",        //$NON-NLS-1$
-                                         "MenuGroup" }) {   //$NON-NLS-1$
-            if (map.containsKey(key)) {
-                map2.put(key, map.get(key));
-            } else {
-                AdtPlugin.log(IStatus.WARNING,
-                        "Menu declare-styleable %1$s not found in file %2$s", //$NON-NLS-1$
-                        key, attrsXmlParser.getOsAttrsXmlPath());
-                AdtPlugin.printErrorToConsole("Android Framework Parser",
-                        String.format("Menu declare-styleable %1$s not found in file %2$s", //$NON-NLS-1$
-                        key, attrsXmlParser.getOsAttrsXmlPath()));
-            }
-        }
-
-        return Collections.unmodifiableMap(map2);
-    }
-
-    /**
-     * Collects all searchable definition information from the attrs.xml and returns it.
-     *
-     * @param attrsXmlParser The parser of the attrs.xml file
-     */
-    private Map<String, DeclareStyleableInfo> collectSearchableDefinitions(
-            AttrsXmlParser attrsXmlParser) {
-        Map<String, DeclareStyleableInfo> map = attrsXmlParser.getDeclareStyleableList();
-        Map<String, DeclareStyleableInfo> map2 = new HashMap<String, DeclareStyleableInfo>();
-        for (String key : new String[] { "Searchable",              //$NON-NLS-1$
-                                         "SearchableActionKey" }) { //$NON-NLS-1$
-            if (map.containsKey(key)) {
-                map2.put(key, map.get(key));
-            } else {
-                AdtPlugin.log(IStatus.WARNING,
-                        "Searchable declare-styleable %1$s not found in file %2$s", //$NON-NLS-1$
-                        key, attrsXmlParser.getOsAttrsXmlPath());
-                AdtPlugin.printErrorToConsole("Android Framework Parser",
-                        String.format("Searchable declare-styleable %1$s not found in file %2$s", //$NON-NLS-1$
-                        key, attrsXmlParser.getOsAttrsXmlPath()));
-            }
-        }
-
-        return Collections.unmodifiableMap(map2);
-    }
-
-    /**
-     * Collects all appWidgetProviderInfo definition information from the attrs.xml and returns it.
-     *
-     * @param attrsXmlParser The parser of the attrs.xml file
-     */
-    private Map<String, DeclareStyleableInfo> collectAppWidgetDefinitions(
-            AttrsXmlParser attrsXmlParser) {
-        Map<String, DeclareStyleableInfo> map = attrsXmlParser.getDeclareStyleableList();
-        Map<String, DeclareStyleableInfo> map2 = new HashMap<String, DeclareStyleableInfo>();
-        for (String key : new String[] { "AppWidgetProviderInfo" }) {  //$NON-NLS-1$
-            if (map.containsKey(key)) {
-                map2.put(key, map.get(key));
-            } else {
-                AdtPlugin.log(IStatus.WARNING,
-                        "AppWidget declare-styleable %1$s not found in file %2$s", //$NON-NLS-1$
-                        key, attrsXmlParser.getOsAttrsXmlPath());
-                AdtPlugin.printErrorToConsole("Android Framework Parser",
-                        String.format("AppWidget declare-styleable %1$s not found in file %2$s", //$NON-NLS-1$
-                        key, attrsXmlParser.getOsAttrsXmlPath()));
-            }
-        }
-
-        return Collections.unmodifiableMap(map2);
-    }
-
-    /**
-     * Collects all manifest definition information from the attrs_manifest.xml and returns it.
-     */
-    private Map<String, DeclareStyleableInfo> collectManifestDefinitions(
-            AttrsXmlParser attrsXmlParser) {
-
-        return attrsXmlParser.getDeclareStyleableList();
-    }
-
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/sdk/IAndroidClassLoader.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/sdk/IAndroidClassLoader.java
deleted file mode 100644
index ab78d2a..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/sdk/IAndroidClassLoader.java
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
- * 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.sdk;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.HashMap;
-
-import javax.management.InvalidAttributeValueException;
-
-/**
- * Classes which implements this interface provide methods to access framework resource
- * data loaded from the SDK.
- */
-interface IAndroidClassLoader {
-
-    /**
-     * Classes which implement this interface provide methods to describe a class.
-     */
-    public interface IClassDescriptor {
-
-        String getFullClassName();
-
-        IClassDescriptor getSuperclass();
-
-        String getSimpleName();
-
-        IClassDescriptor getEnclosingClass();
-
-        IClassDescriptor[] getDeclaredClasses();
-
-        boolean isInstantiable();
-    }
-
-    /**
-     * Finds and loads all classes that derive from a given set of super classes.
-     *
-     * @param rootPackage Root package of classes to find. Use an empty string to find everyting.
-     * @param superClasses The super classes of all the classes to find.
-     * @return An hash map which keys are the super classes looked for and which values are
-     *         ArrayList of the classes found. The array lists are always created for all the
-     *         valid keys, they are simply empty if no deriving class is found for a given
-     *         super class.
-     * @throws IOException
-     * @throws InvalidAttributeValueException
-     * @throws ClassFormatError
-     */
-    public HashMap<String, ArrayList<IClassDescriptor>> findClassesDerivingFrom(
-            String rootPackage, String[] superClasses)
-        throws IOException, InvalidAttributeValueException, ClassFormatError;
-
-    /**
-     * Returns a {@link IClassDescriptor} by its fully-qualified name.
-     * @param className the fully-qualified name of the class to return.
-     * @throws ClassNotFoundException
-     */
-    public IClassDescriptor getClass(String className) throws ClassNotFoundException;
-
-    /**
-     * Returns a string indicating the source of the classes, typically for debugging
-     * or in error messages. This would typically be a JAR file name or some kind of
-     * identifier that would mean something to the user when looking at error messages.
-     *
-     * @return An informal string representing the source of the classes.
-     */
-    public String getSource();
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/sdk/LayoutParamsParser.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/sdk/LayoutParamsParser.java
deleted file mode 100644
index d05c12a..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/sdk/LayoutParamsParser.java
+++ /dev/null
@@ -1,378 +0,0 @@
-/*
- * 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.sdk;
-
-import com.android.SdkConstants;
-import com.android.ide.common.resources.platform.AttrsXmlParser;
-import com.android.ide.common.resources.platform.ViewClassInfo;
-import com.android.ide.common.resources.platform.ViewClassInfo.LayoutParamsInfo;
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.ide.eclipse.adt.internal.sdk.IAndroidClassLoader.IClassDescriptor;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.SubMonitor;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.List;
-import java.util.SortedMap;
-import java.util.TreeMap;
-
-import javax.management.InvalidAttributeValueException;
-
-/*
- * TODO: refactor this. Could use some cleanup.
- */
-
-/**
- * Parser for the framework library.
- * <p/>
- * This gather the following information:
- * <ul>
- * <li>Resource ID from <code>android.R</code></li>
- * <li>The list of permissions values from <code>android.Manifest$permission</code></li>
- * <li></li>
- * </ul>
- */
-public class LayoutParamsParser {
-
-    /**
-     * Class extending {@link ViewClassInfo} by adding the notion of instantiability.
-     * {@link LayoutParamsParser#getViews()} and {@link LayoutParamsParser#getGroups()} should
-     * only return classes that can be instantiated.
-     */
-    final static class ExtViewClassInfo extends ViewClassInfo {
-
-        private boolean mIsInstantiable;
-
-        ExtViewClassInfo(boolean instantiable, boolean isLayout, String canonicalClassName,
-                String shortClassName) {
-            super(isLayout, canonicalClassName, shortClassName);
-            mIsInstantiable = instantiable;
-        }
-
-        boolean isInstantiable() {
-            return mIsInstantiable;
-        }
-    }
-
-    /* Note: protected members/methods are overridden in unit tests */
-
-    /** Reference to android.view.View */
-    protected IClassDescriptor mTopViewClass;
-    /** Reference to android.view.ViewGroup */
-    protected IClassDescriptor mTopGroupClass;
-    /** Reference to android.view.ViewGroup$LayoutParams */
-    protected IClassDescriptor mTopLayoutParamsClass;
-
-    /** Input list of all classes deriving from android.view.View */
-    protected ArrayList<IClassDescriptor> mViewList;
-    /** Input list of all classes deriving from android.view.ViewGroup */
-    protected ArrayList<IClassDescriptor> mGroupList;
-
-    /** Output map of FQCN => info on View classes */
-    protected TreeMap<String, ExtViewClassInfo> mViewMap;
-    /** Output map of FQCN => info on ViewGroup classes */
-    protected TreeMap<String, ExtViewClassInfo> mGroupMap;
-    /** Output map of FQCN => info on LayoutParams classes */
-    protected HashMap<String, LayoutParamsInfo> mLayoutParamsMap;
-
-    /** The attrs.xml parser */
-    protected AttrsXmlParser mAttrsXmlParser;
-
-    /** The android.jar class loader */
-    protected IAndroidClassLoader mClassLoader;
-
-    /**
-     * Instantiate a new LayoutParamsParser.
-     * @param classLoader The android.jar class loader
-     * @param attrsXmlParser The parser of the attrs.xml file
-     */
-    public LayoutParamsParser(IAndroidClassLoader classLoader,
-            AttrsXmlParser attrsXmlParser) {
-        mClassLoader = classLoader;
-        mAttrsXmlParser = attrsXmlParser;
-    }
-
-    /** Returns the map of FQCN => info on View classes */
-    public List<ViewClassInfo> getViews() {
-        return getInstantiables(mViewMap);
-    }
-
-    /** Returns the map of FQCN => info on ViewGroup classes */
-    public List<ViewClassInfo> getGroups() {
-        return getInstantiables(mGroupMap);
-    }
-
-    /**
-     * TODO: doc here.
-     * <p/>
-     * Note: on output we should have NO dependency on {@link IClassDescriptor},
-     * otherwise we wouldn't be able to unload the class loader later.
-     * <p/>
-     * Note on Vocabulary: FQCN=Fully Qualified Class Name (e.g. "my.package.class$innerClass")
-     * @param monitor A progress monitor. Can be null. Caller is responsible for calling done.
-     */
-    public void parseLayoutClasses(IProgressMonitor monitor) {
-        parseClasses(monitor,
-                SdkConstants.CLASS_VIEW,
-                SdkConstants.CLASS_VIEWGROUP,
-                SdkConstants.CLASS_VIEWGROUP_LAYOUTPARAMS);
-    }
-
-    public void parsePreferencesClasses(IProgressMonitor monitor) {
-        parseClasses(monitor,
-                SdkConstants.CLASS_PREFERENCE,
-                SdkConstants.CLASS_PREFERENCEGROUP,
-                null /* paramsClassName */ );
-    }
-
-    private void parseClasses(IProgressMonitor monitor,
-            String rootClassName,
-            String groupClassName,
-            String paramsClassName) {
-        try {
-            SubMonitor progress = SubMonitor.convert(monitor, 100);
-
-            String[] superClasses = new String[2 + (paramsClassName == null ? 0 : 1)];
-            superClasses[0] = groupClassName;
-            superClasses[1] = rootClassName;
-            if (paramsClassName != null) {
-                superClasses[2] = paramsClassName;
-            }
-            HashMap<String, ArrayList<IClassDescriptor>> found =
-                    mClassLoader.findClassesDerivingFrom("android.", superClasses);  //$NON-NLS-1$
-            mTopViewClass = mClassLoader.getClass(rootClassName);
-            mTopGroupClass = mClassLoader.getClass(groupClassName);
-            if (paramsClassName != null) {
-                mTopLayoutParamsClass = mClassLoader.getClass(paramsClassName);
-            }
-
-            mViewList = found.get(rootClassName);
-            mGroupList = found.get(groupClassName);
-
-            mViewMap = new TreeMap<String, ExtViewClassInfo>();
-            mGroupMap = new TreeMap<String, ExtViewClassInfo>();
-            if (mTopLayoutParamsClass != null) {
-                mLayoutParamsMap = new HashMap<String, LayoutParamsInfo>();
-            }
-
-            // Add top classes to the maps since by design they are not listed in classes deriving
-            // from themselves.
-            if (mTopGroupClass != null) {
-                addGroup(mTopGroupClass);
-            }
-            if (mTopViewClass != null) {
-                addView(mTopViewClass);
-            }
-
-            // ViewGroup derives from View
-            ExtViewClassInfo vg = mGroupMap.get(groupClassName);
-            if (vg != null) {
-                vg.setSuperClass(mViewMap.get(rootClassName));
-            }
-
-            progress.setWorkRemaining(mGroupList.size() + mViewList.size());
-
-            for (IClassDescriptor groupChild : mGroupList) {
-                addGroup(groupChild);
-                progress.worked(1);
-            }
-
-            for (IClassDescriptor viewChild : mViewList) {
-                if (viewChild != mTopGroupClass) {
-                    addView(viewChild);
-                }
-                progress.worked(1);
-            }
-        } catch (ClassNotFoundException e) {
-            AdtPlugin.log(e, "Problem loading class %1$s or %2$s",  //$NON-NLS-1$
-                    rootClassName, groupClassName);
-        } catch (InvalidAttributeValueException e) {
-            AdtPlugin.log(e, "Problem loading classes"); //$NON-NLS-1$
-        } catch (ClassFormatError e) {
-            AdtPlugin.log(e, "Problem loading classes"); //$NON-NLS-1$
-        } catch (IOException e) {
-            AdtPlugin.log(e, "Problem loading classes"); //$NON-NLS-1$
-        }
-    }
-
-    /**
-     * Parses a View class and adds a ExtViewClassInfo for it in mViewMap.
-     * It calls itself recursively to handle super classes which are also Views.
-     */
-    private ExtViewClassInfo addView(IClassDescriptor viewClass) {
-        String fqcn = viewClass.getFullClassName();
-        if (mViewMap.containsKey(fqcn)) {
-            return mViewMap.get(fqcn);
-        } else if (mGroupMap.containsKey(fqcn)) {
-            return mGroupMap.get(fqcn);
-        }
-
-        ExtViewClassInfo info = new ExtViewClassInfo(viewClass.isInstantiable(),
-                false /* layout */, fqcn, viewClass.getSimpleName());
-        mViewMap.put(fqcn, info);
-
-        // All view classes derive from mTopViewClass by design.
-        // Do not lookup the super class for mTopViewClass itself.
-        if (viewClass.equals(mTopViewClass) == false) {
-            IClassDescriptor superClass = viewClass.getSuperclass();
-            ExtViewClassInfo superClassInfo = addView(superClass);
-            info.setSuperClass(superClassInfo);
-        }
-
-        mAttrsXmlParser.loadViewAttributes(info);
-        return info;
-    }
-
-    /**
-     * Parses a ViewGroup class and adds a ExtViewClassInfo for it in mGroupMap.
-     * It calls itself recursively to handle super classes which are also ViewGroups.
-     */
-    private ExtViewClassInfo addGroup(IClassDescriptor groupClass) {
-        String fqcn = groupClass.getFullClassName();
-        if (mGroupMap.containsKey(fqcn)) {
-            return mGroupMap.get(fqcn);
-        }
-
-        ExtViewClassInfo info = new ExtViewClassInfo(groupClass.isInstantiable(),
-                true /* layout */, fqcn, groupClass.getSimpleName());
-        mGroupMap.put(fqcn, info);
-
-        // All groups derive from android.view.ViewGroup, which in turns derives from
-        // android.view.View (i.e. mTopViewClass here). So the only group that can have View as
-        // its super class is the ViewGroup base class and we don't try to resolve it since groups
-        // are loaded before views.
-        IClassDescriptor superClass = groupClass.getSuperclass();
-
-        // Assertion: at this point, we should have
-        //   superClass != mTopViewClass || fqcn.equals(SdkConstants.CLASS_VIEWGROUP);
-
-        if (superClass != null && superClass.equals(mTopViewClass) == false) {
-            ExtViewClassInfo superClassInfo = addGroup(superClass);
-
-            // Assertion: we should have superClassInfo != null && superClassInfo != info;
-            if (superClassInfo != null && superClassInfo != info) {
-                info.setSuperClass(superClassInfo);
-            }
-        }
-
-        mAttrsXmlParser.loadViewAttributes(info);
-        if (mTopLayoutParamsClass != null) {
-            info.setLayoutParams(addLayoutParams(groupClass));
-        }
-        return info;
-    }
-
-    /**
-     * Parses a ViewGroup class and returns an info object on its inner LayoutParams.
-     *
-     * @return The {@link LayoutParamsInfo} for the ViewGroup class or null.
-     */
-    private LayoutParamsInfo addLayoutParams(IClassDescriptor groupClass) {
-
-        // Is there a LayoutParams in this group class?
-        IClassDescriptor layoutParamsClass = findLayoutParams(groupClass);
-
-        // if there's no layout data in the group class, link to the one from the
-        // super class.
-        if (layoutParamsClass == null) {
-            for (IClassDescriptor superClass = groupClass.getSuperclass();
-                    layoutParamsClass == null &&
-                        superClass != null &&
-                        superClass.equals(mTopViewClass) == false;
-                    superClass = superClass.getSuperclass()) {
-                layoutParamsClass = findLayoutParams(superClass);
-            }
-        }
-
-        if (layoutParamsClass != null) {
-            return getLayoutParamsInfo(layoutParamsClass);
-        }
-
-        return null;
-    }
-
-    /**
-     * Parses a LayoutParams class and returns a LayoutParamsInfo object for it.
-     * It calls itself recursively to handle the super class of the LayoutParams.
-     */
-    private LayoutParamsInfo getLayoutParamsInfo(IClassDescriptor layoutParamsClass) {
-        String fqcn = layoutParamsClass.getFullClassName();
-        LayoutParamsInfo layoutParamsInfo = mLayoutParamsMap.get(fqcn);
-
-        if (layoutParamsInfo != null) {
-            return layoutParamsInfo;
-        }
-
-        // Find the link on the LayoutParams super class
-        LayoutParamsInfo superClassInfo = null;
-        if (layoutParamsClass.equals(mTopLayoutParamsClass) == false) {
-            IClassDescriptor superClass = layoutParamsClass.getSuperclass();
-            superClassInfo = getLayoutParamsInfo(superClass);
-        }
-
-        // Find the link on the enclosing ViewGroup
-        ExtViewClassInfo enclosingGroupInfo = addGroup(layoutParamsClass.getEnclosingClass());
-
-        layoutParamsInfo = new ExtViewClassInfo.LayoutParamsInfo(
-                enclosingGroupInfo, layoutParamsClass.getSimpleName(), superClassInfo);
-        mLayoutParamsMap.put(fqcn, layoutParamsInfo);
-
-        mAttrsXmlParser.loadLayoutParamsAttributes(layoutParamsInfo);
-
-        return layoutParamsInfo;
-    }
-
-    /**
-     * Given a ViewGroup-derived class, looks for an inner class named LayoutParams
-     * and if found returns its class definition.
-     * <p/>
-     * This uses the actual defined inner classes and does not look at inherited classes.
-     *
-     * @param groupClass The ViewGroup derived class
-     * @return The Class of the inner LayoutParams or null if none is declared.
-     */
-    private IClassDescriptor findLayoutParams(IClassDescriptor groupClass) {
-        IClassDescriptor[] innerClasses = groupClass.getDeclaredClasses();
-        for (IClassDescriptor innerClass : innerClasses) {
-            if (innerClass.getSimpleName().equals(SdkConstants.CLASS_NAME_LAYOUTPARAMS)) {
-                return innerClass;
-            }
-        }
-        return null;
-    }
-
-    /**
-     * Computes and return a list of ViewClassInfo from a map by filtering out the class that
-     * cannot be instantiated.
-     */
-    private List<ViewClassInfo> getInstantiables(SortedMap<String, ExtViewClassInfo> map) {
-        Collection<ExtViewClassInfo> values = map.values();
-        ArrayList<ViewClassInfo> list = new ArrayList<ViewClassInfo>();
-
-        for (ExtViewClassInfo info : values) {
-            if (info.isInstantiable()) {
-                list.add(info);
-            }
-        }
-
-        return list;
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/sdk/ProjectState.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/sdk/ProjectState.java
deleted file mode 100644
index 74c9857..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/sdk/ProjectState.java
+++ /dev/null
@@ -1,740 +0,0 @@
-/*
- * Copyright (C) 2010 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.sdk;
-
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.sdklib.BuildToolInfo;
-import com.android.sdklib.IAndroidTarget;
-import com.android.sdklib.internal.project.ProjectProperties;
-import com.android.sdklib.internal.project.ProjectPropertiesWorkingCopy;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-
-import java.io.File;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-import java.util.regex.Matcher;
-
-/**
- * Centralized state for Android Eclipse project.
- * <p>This gives raw access to the properties (from <code>project.properties</code>), as well
- * as direct access to target and library information.
- *
- * This also gives access to library information.
- *
- * {@link #isLibrary()} indicates if the project is a library.
- * {@link #hasLibraries()} and {@link #getLibraries()} give access to the libraries through
- * instances of {@link LibraryState}. A {@link LibraryState} instance is a link between a main
- * project and its library. Theses instances are owned by the {@link ProjectState}.
- *
- * {@link #isMissingLibraries()} will indicate if the project has libraries that are not resolved.
- * Unresolved libraries are libraries that do not have any matching opened Eclipse project.
- * When there are missing libraries, the {@link LibraryState} instance for them will return null
- * for {@link LibraryState#getProjectState()}.
- *
- */
-public final class ProjectState {
-
-    /**
-     * A class that represents a library linked to a project.
-     * <p/>It does not represent the library uniquely. Instead the {@link LibraryState} is linked
-     * to the main project which is accessible through {@link #getMainProjectState()}.
-     * <p/>If a library is used by two different projects, then there will be two different
-     * instances of {@link LibraryState} for the library.
-     *
-     * @see ProjectState#getLibrary(IProject)
-     */
-    public final class LibraryState {
-        private String mRelativePath;
-        private ProjectState mProjectState;
-        private String mPath;
-
-        private LibraryState(String relativePath) {
-            mRelativePath = relativePath;
-        }
-
-        /**
-         * Returns the {@link ProjectState} of the main project using this library.
-         */
-        public ProjectState getMainProjectState() {
-            return ProjectState.this;
-        }
-
-        /**
-         * Closes the library. This resets the IProject from this object ({@link #getProjectState()} will
-         * return <code>null</code>), and updates the main project data so that the library
-         * {@link IProject} object does not show up in the return value of
-         * {@link ProjectState#getFullLibraryProjects()}.
-         */
-        public void close() {
-            mProjectState.removeParentProject(getMainProjectState());
-            mProjectState = null;
-            mPath = null;
-
-            getMainProjectState().updateFullLibraryList();
-        }
-
-        private void setRelativePath(String relativePath) {
-            mRelativePath = relativePath;
-        }
-
-        private void setProject(ProjectState project) {
-            mProjectState = project;
-            mPath = project.getProject().getLocation().toOSString();
-            mProjectState.addParentProject(getMainProjectState());
-
-            getMainProjectState().updateFullLibraryList();
-        }
-
-        /**
-         * Returns the relative path of the library from the main project.
-         * <p/>This is identical to the value defined in the main project's project.properties.
-         */
-        public String getRelativePath() {
-            return mRelativePath;
-        }
-
-        /**
-         * Returns the {@link ProjectState} item for the library. This can be null if the project
-         * is not actually opened in Eclipse.
-         */
-        public ProjectState getProjectState() {
-            return mProjectState;
-        }
-
-        /**
-         * Returns the OS-String location of the library project.
-         * <p/>This is based on location of the Eclipse project that matched
-         * {@link #getRelativePath()}.
-         *
-         * @return The project location, or null if the project is not opened in Eclipse.
-         */
-        public String getProjectLocation() {
-            return mPath;
-        }
-
-        @Override
-        public boolean equals(Object obj) {
-            if (obj instanceof LibraryState) {
-                // the only thing that's always non-null is the relative path.
-                LibraryState objState = (LibraryState)obj;
-                return mRelativePath.equals(objState.mRelativePath) &&
-                        getMainProjectState().equals(objState.getMainProjectState());
-            } else if (obj instanceof ProjectState || obj instanceof IProject) {
-                return mProjectState != null && mProjectState.equals(obj);
-            } else if (obj instanceof String) {
-                return normalizePath(mRelativePath).equals(normalizePath((String) obj));
-            }
-
-            return false;
-        }
-
-        @Override
-        public int hashCode() {
-            return normalizePath(mRelativePath).hashCode();
-        }
-    }
-
-    private final IProject mProject;
-    private final ProjectProperties mProperties;
-    private IAndroidTarget mTarget;
-    private BuildToolInfo mBuildToolInfo;
-
-    /**
-     * list of libraries. Access to this list must be protected by
-     * <code>synchronized(mLibraries)</code>, but it is important that such code do not call
-     * out to other classes (especially those protected by {@link Sdk#getLock()}.)
-     */
-    private final ArrayList<LibraryState> mLibraries = new ArrayList<LibraryState>();
-    /** Cached list of all IProject instances representing the resolved libraries, including
-     * indirect dependencies. This must never be null. */
-    private List<IProject> mLibraryProjects = Collections.emptyList();
-    /**
-     * List of parent projects. When this instance is a library ({@link #isLibrary()} returns
-     * <code>true</code>) then this is filled with projects that depends on this project.
-     */
-    private final ArrayList<ProjectState> mParentProjects = new ArrayList<ProjectState>();
-
-    ProjectState(IProject project, ProjectProperties properties) {
-        if (project == null || properties == null) {
-            throw new NullPointerException();
-        }
-
-        mProject = project;
-        mProperties = properties;
-
-        // load the libraries
-        synchronized (mLibraries) {
-            int index = 1;
-            while (true) {
-                String propName = ProjectProperties.PROPERTY_LIB_REF + Integer.toString(index++);
-                String rootPath = mProperties.getProperty(propName);
-
-                if (rootPath == null) {
-                    break;
-                }
-
-                mLibraries.add(new LibraryState(convertPath(rootPath)));
-            }
-        }
-    }
-
-    public IProject getProject() {
-        return mProject;
-    }
-
-    public ProjectProperties getProperties() {
-        return mProperties;
-    }
-
-    public @Nullable String getProperty(@NonNull String name) {
-        if (mProperties != null) {
-            return mProperties.getProperty(name);
-        }
-
-        return null;
-    }
-
-    public void setTarget(IAndroidTarget target) {
-        mTarget = target;
-    }
-
-    /**
-     * Returns the project's target's hash string.
-     * <p/>If {@link #getTarget()} returns a valid object, then this returns the value of
-     * {@link IAndroidTarget#hashString()}.
-     * <p/>Otherwise this will return the value of the property
-     * {@link ProjectProperties#PROPERTY_TARGET} from {@link #getProperties()} (if valid).
-     * @return the target hash string or null if not found.
-     */
-    public String getTargetHashString() {
-        if (mTarget != null) {
-            return mTarget.hashString();
-        }
-
-        return mProperties.getProperty(ProjectProperties.PROPERTY_TARGET);
-    }
-
-    public IAndroidTarget getTarget() {
-        return mTarget;
-    }
-
-    public void setBuildToolInfo(BuildToolInfo buildToolInfo) {
-        mBuildToolInfo = buildToolInfo;
-    }
-
-    public BuildToolInfo getBuildToolInfo() {
-        return mBuildToolInfo;
-    }
-
-    /**
-     * Returns the build tools version from the project's properties.
-     * @return the value or null
-     */
-    @Nullable
-    public String getBuildToolInfoVersion() {
-        return mProperties.getProperty(ProjectProperties.PROPERTY_BUILD_TOOLS);
-    }
-
-    public boolean getRenderScriptSupportMode() {
-        String supportModeValue = mProperties.getProperty(ProjectProperties.PROPERTY_RS_SUPPORT);
-        if (supportModeValue != null) {
-            return Boolean.parseBoolean(supportModeValue);
-        }
-
-        return false;
-    }
-
-    public static class LibraryDifference {
-        public boolean removed = false;
-        public boolean added = false;
-
-        public boolean hasDiff() {
-            return removed || added;
-        }
-    }
-
-    /**
-     * Reloads the content of the properties.
-     * <p/>This also reset the reference to the target as it may have changed, therefore this
-     * should be followed by a call to {@link Sdk#loadTarget(ProjectState)}.
-     *
-     * <p/>If the project libraries changes, they are updated to a certain extent.<br>
-     * Removed libraries are removed from the state list, and added to the {@link LibraryDifference}
-     * object that is returned so that they can be processed.<br>
-     * Added libraries are added to the state (as new {@link LibraryState} objects), but their
-     * IProject is not resolved. {@link ProjectState#needs(ProjectState)} should be called
-     * afterwards to properly initialize the libraries.
-     *
-     * @return an instance of {@link LibraryDifference} describing the change in libraries.
-     */
-    public LibraryDifference reloadProperties() {
-        mTarget = null;
-        mProperties.reload();
-
-        // compare/reload the libraries.
-
-        // if the order change it won't impact the java part, so instead try to detect removed/added
-        // libraries.
-
-        LibraryDifference diff = new LibraryDifference();
-
-        synchronized (mLibraries) {
-            List<LibraryState> oldLibraries = new ArrayList<LibraryState>(mLibraries);
-            mLibraries.clear();
-
-            // load the libraries
-            int index = 1;
-            while (true) {
-                String propName = ProjectProperties.PROPERTY_LIB_REF + Integer.toString(index++);
-                String rootPath = mProperties.getProperty(propName);
-
-                if (rootPath == null) {
-                    break;
-                }
-
-                // search for a library with the same path (not exact same string, but going
-                // to the same folder).
-                String convertedPath = convertPath(rootPath);
-                boolean found = false;
-                for (int i = 0 ; i < oldLibraries.size(); i++) {
-                    LibraryState libState = oldLibraries.get(i);
-                    if (libState.equals(convertedPath)) {
-                        // it's a match. move it back to mLibraries and remove it from the
-                        // old library list.
-                        found = true;
-                        mLibraries.add(libState);
-                        oldLibraries.remove(i);
-                        break;
-                    }
-                }
-
-                if (found == false) {
-                    diff.added = true;
-                    mLibraries.add(new LibraryState(convertedPath));
-                }
-            }
-
-            // whatever's left in oldLibraries is removed.
-            diff.removed = oldLibraries.size() > 0;
-
-            // update the library with what IProjet are known at the time.
-            updateFullLibraryList();
-        }
-
-        return diff;
-    }
-
-    /**
-     * Returns the list of {@link LibraryState}.
-     */
-    public List<LibraryState> getLibraries() {
-        synchronized (mLibraries) {
-            return Collections.unmodifiableList(mLibraries);
-        }
-    }
-
-    /**
-     * Returns all the <strong>resolved</strong> library projects, including indirect dependencies.
-     * The list is ordered to match the library priority order for resource processing with
-     * <code>aapt</code>.
-     * <p/>If some dependencies are not resolved (or their projects is not opened in Eclipse),
-     * they will not show up in this list.
-     * @return the resolved projects as an unmodifiable list. May be an empty.
-     */
-    public List<IProject> getFullLibraryProjects() {
-        return mLibraryProjects;
-    }
-
-    /**
-     * Returns whether this is a library project.
-     */
-    public boolean isLibrary() {
-        String value = mProperties.getProperty(ProjectProperties.PROPERTY_LIBRARY);
-        return value != null && Boolean.valueOf(value);
-    }
-
-    /**
-     * Returns whether the project depends on one or more libraries.
-     */
-    public boolean hasLibraries() {
-        synchronized (mLibraries) {
-            return mLibraries.size() > 0;
-        }
-    }
-
-    /**
-     * Returns whether the project is missing some required libraries.
-     */
-    public boolean isMissingLibraries() {
-        synchronized (mLibraries) {
-            for (LibraryState state : mLibraries) {
-                if (state.getProjectState() == null) {
-                    return true;
-                }
-            }
-        }
-
-        return false;
-    }
-
-    /**
-     * Returns the {@link LibraryState} object for a given {@link IProject}.
-     * </p>This can only return a non-null object if the link between the main project's
-     * {@link IProject} and the library's {@link IProject} was done.
-     *
-     * @return the matching LibraryState or <code>null</code>
-     *
-     * @see #needs(ProjectState)
-     */
-    public LibraryState getLibrary(IProject library) {
-        synchronized (mLibraries) {
-            for (LibraryState state : mLibraries) {
-                ProjectState ps = state.getProjectState();
-                if (ps != null && ps.getProject().equals(library)) {
-                    return state;
-                }
-            }
-        }
-
-        return null;
-    }
-
-    /**
-     * Returns the {@link LibraryState} object for a given <var>name</var>.
-     * </p>This can only return a non-null object if the link between the main project's
-     * {@link IProject} and the library's {@link IProject} was done.
-     *
-     * @return the matching LibraryState or <code>null</code>
-     *
-     * @see #needs(IProject)
-     */
-    public LibraryState getLibrary(String name) {
-        synchronized (mLibraries) {
-            for (LibraryState state : mLibraries) {
-                ProjectState ps = state.getProjectState();
-                if (ps != null && ps.getProject().getName().equals(name)) {
-                    return state;
-                }
-            }
-        }
-
-        return null;
-    }
-
-
-    /**
-     * Returns whether a given library project is needed by the receiver.
-     * <p/>If the library is needed, this finds the matching {@link LibraryState}, initializes it
-     * so that it contains the library's {@link IProject} object (so that
-     * {@link LibraryState#getProjectState()} does not return null) and then returns it.
-     *
-     * @param libraryProject the library project to check.
-     * @return a non null object if the project is a library dependency,
-     * <code>null</code> otherwise.
-     *
-     * @see LibraryState#getProjectState()
-     */
-    public LibraryState needs(ProjectState libraryProject) {
-        // compute current location
-        File projectFile = mProject.getLocation().toFile();
-
-        // get the location of the library.
-        File libraryFile = libraryProject.getProject().getLocation().toFile();
-
-        // loop on all libraries and check if the path match
-        synchronized (mLibraries) {
-            for (LibraryState state : mLibraries) {
-                if (state.getProjectState() == null) {
-                    File library = new File(projectFile, state.getRelativePath());
-                    try {
-                        File absPath = library.getCanonicalFile();
-                        if (absPath.equals(libraryFile)) {
-                            state.setProject(libraryProject);
-                            return state;
-                        }
-                    } catch (IOException e) {
-                        // ignore this library
-                    }
-                }
-            }
-        }
-
-        return null;
-    }
-
-    /**
-     * Returns whether the project depends on a given <var>library</var>
-     * @param library the library to check.
-     * @return true if the project depends on the library. This is not affected by whether the link
-     * was done through {@link #needs(ProjectState)}.
-     */
-    public boolean dependsOn(ProjectState library) {
-        synchronized (mLibraries) {
-            for (LibraryState state : mLibraries) {
-                if (state != null && state.getProjectState() != null &&
-                        library.getProject().equals(state.getProjectState().getProject())) {
-                    return true;
-                }
-            }
-        }
-
-        return false;
-    }
-
-
-    /**
-     * Updates a library with a new path.
-     * <p/>This method acts both as a check and an action. If the project does not depend on the
-     * given <var>oldRelativePath</var> then no action is done and <code>null</code> is returned.
-     * <p/>If the project depends on the library, then the project is updated with the new path,
-     * and the {@link LibraryState} for the library is returned.
-     * <p/>Updating the project does two things:<ul>
-     * <li>Update LibraryState with new relative path and new {@link IProject} object.</li>
-     * <li>Update the main project's <code>project.properties</code> with the new relative path
-     * for the changed library.</li>
-     * </ul>
-     *
-     * @param oldRelativePath the old library path relative to this project
-     * @param newRelativePath the new library path relative to this project
-     * @param newLibraryState the new {@link ProjectState} object.
-     * @return a non null object if the project depends on the library.
-     *
-     * @see LibraryState#getProjectState()
-     */
-    public LibraryState updateLibrary(String oldRelativePath, String newRelativePath,
-            ProjectState newLibraryState) {
-        // compute current location
-        File projectFile = mProject.getLocation().toFile();
-
-        // loop on all libraries and check if the path matches
-        synchronized (mLibraries) {
-            for (LibraryState state : mLibraries) {
-                if (state.getProjectState() == null) {
-                    try {
-                        // oldRelativePath may not be the same exact string as the
-                        // one in the project properties (trailing separator could be different
-                        // for instance).
-                        // Use java.io.File to deal with this and also do a platform-dependent
-                        // path comparison
-                        File library1 = new File(projectFile, oldRelativePath);
-                        File library2 = new File(projectFile, state.getRelativePath());
-                        if (library1.getCanonicalPath().equals(library2.getCanonicalPath())) {
-                            // save the exact property string to replace.
-                            String oldProperty = state.getRelativePath();
-
-                            // then update the LibraryPath.
-                            state.setRelativePath(newRelativePath);
-                            state.setProject(newLibraryState);
-
-                            // update the project.properties file
-                            IStatus status = replaceLibraryProperty(oldProperty, newRelativePath);
-                            if (status != null) {
-                                if (status.getSeverity() != IStatus.OK) {
-                                    // log the error somehow.
-                                }
-                            } else {
-                                // This should not happen since the library wouldn't be here in the
-                                // first place
-                            }
-
-                            // return the LibraryState object.
-                            return state;
-                        }
-                    } catch (IOException e) {
-                        // ignore this library
-                    }
-                }
-            }
-        }
-
-        return null;
-    }
-
-
-    private void addParentProject(ProjectState parentState) {
-        mParentProjects.add(parentState);
-    }
-
-    private void removeParentProject(ProjectState parentState) {
-        mParentProjects.remove(parentState);
-    }
-
-    public List<ProjectState> getParentProjects() {
-        return Collections.unmodifiableList(mParentProjects);
-    }
-
-    /**
-     * Computes the transitive closure of projects referencing this project as a
-     * library project
-     *
-     * @return a collection (in any order) of project states for projects that
-     *         directly or indirectly include this project state's project as a
-     *         library project
-     */
-    public Collection<ProjectState> getFullParentProjects() {
-        Set<ProjectState> result = new HashSet<ProjectState>();
-        addParentProjects(result, this);
-        return result;
-    }
-
-    /** Adds all parent projects of the given project, transitively, into the given parent set */
-    private static void addParentProjects(Set<ProjectState> parents, ProjectState state) {
-        for (ProjectState s : state.mParentProjects) {
-            if (!parents.contains(s)) {
-                parents.add(s);
-                addParentProjects(parents, s);
-            }
-        }
-    }
-
-    /**
-     * Update the value of a library dependency.
-     * <p/>This loops on all current dependency looking for the value to replace and then replaces
-     * it.
-     * <p/>This both updates the in-memory {@link #mProperties} values and on-disk
-     * project.properties file.
-     * @param oldValue the old value to replace
-     * @param newValue the new value to set.
-     * @return the status of the replacement. If null, no replacement was done (value not found).
-     */
-    private IStatus replaceLibraryProperty(String oldValue, String newValue) {
-        int index = 1;
-        while (true) {
-            String propName = ProjectProperties.PROPERTY_LIB_REF + Integer.toString(index++);
-            String rootPath = mProperties.getProperty(propName);
-
-            if (rootPath == null) {
-                break;
-            }
-
-            if (rootPath.equals(oldValue)) {
-                // need to update the properties. Get a working copy to change it and save it on
-                // disk since ProjectProperties is read-only.
-                ProjectPropertiesWorkingCopy workingCopy = mProperties.makeWorkingCopy();
-                workingCopy.setProperty(propName, newValue);
-                try {
-                    workingCopy.save();
-
-                    // reload the properties with the new values from the disk.
-                    mProperties.reload();
-                } catch (Exception e) {
-                    return new Status(IStatus.ERROR, AdtPlugin.PLUGIN_ID, String.format(
-                            "Failed to save %1$s for project %2$s",
-                                    mProperties.getType() .getFilename(), mProject.getName()),
-                            e);
-
-                }
-                return Status.OK_STATUS;
-            }
-        }
-
-        return null;
-    }
-
-    /**
-     * Update the full library list, including indirect dependencies. The result is returned by
-     * {@link #getFullLibraryProjects()}.
-     */
-    void updateFullLibraryList() {
-        ArrayList<IProject> list = new ArrayList<IProject>();
-        synchronized (mLibraries) {
-            buildFullLibraryDependencies(mLibraries, list);
-        }
-
-        mLibraryProjects = Collections.unmodifiableList(list);
-    }
-
-    /**
-     * Resolves a given list of libraries, finds out if they depend on other libraries, and
-     * returns a full list of all the direct and indirect dependencies in the proper order (first
-     * is higher priority when calling aapt).
-     * @param inLibraries the libraries to resolve
-     * @param outLibraries where to store all the libraries.
-     */
-    private void buildFullLibraryDependencies(List<LibraryState> inLibraries,
-            ArrayList<IProject> outLibraries) {
-        // loop in the inverse order to resolve dependencies on the libraries, so that if a library
-        // is required by two higher level libraries it can be inserted in the correct place
-        for (int i = inLibraries.size() - 1  ; i >= 0 ; i--) {
-            LibraryState library = inLibraries.get(i);
-
-            // get its libraries if possible
-            ProjectState libProjectState = library.getProjectState();
-            if (libProjectState != null) {
-                List<LibraryState> dependencies = libProjectState.getLibraries();
-
-                // build the dependencies for those libraries
-                buildFullLibraryDependencies(dependencies, outLibraries);
-
-                // and add the current library (if needed) in front (higher priority)
-                if (outLibraries.contains(libProjectState.getProject()) == false) {
-                    outLibraries.add(0, libProjectState.getProject());
-                }
-            }
-        }
-    }
-
-
-    /**
-     * Converts a path containing only / by the proper platform separator.
-     */
-    private String convertPath(String path) {
-        return path.replaceAll("/", Matcher.quoteReplacement(File.separator)); //$NON-NLS-1$
-    }
-
-    /**
-     * Normalizes a relative path.
-     */
-    private String normalizePath(String path) {
-        path = convertPath(path);
-        if (path.endsWith("/")) { //$NON-NLS-1$
-            path = path.substring(0, path.length() - 1);
-        }
-        return path;
-    }
-
-    @Override
-    public boolean equals(Object obj) {
-        if (obj instanceof ProjectState) {
-            return mProject.equals(((ProjectState) obj).mProject);
-        } else if (obj instanceof IProject) {
-            return mProject.equals(obj);
-        }
-
-        return false;
-    }
-
-    @Override
-    public int hashCode() {
-        return mProject.hashCode();
-    }
-
-    @Override
-    public String toString() {
-        return mProject.getName();
-    }
-}
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
deleted file mode 100644
index 7ff06fc..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/sdk/Sdk.java
+++ /dev/null
@@ -1,1620 +0,0 @@
-/*
- * 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.sdk;
-
-import static com.android.SdkConstants.DOT_XML;
-import static com.android.SdkConstants.EXT_JAR;
-import static com.android.SdkConstants.FD_RES;
-
-import com.android.SdkConstants;
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-import com.android.ddmlib.IDevice;
-import com.android.ide.common.rendering.LayoutLibrary;
-import com.android.ide.common.sdk.LoadStatus;
-import com.android.ide.eclipse.adt.AdtConstants;
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.ide.eclipse.adt.internal.build.DexWrapper;
-import com.android.ide.eclipse.adt.internal.editors.common.CommonXmlEditor;
-import com.android.ide.eclipse.adt.internal.preferences.AdtPrefs;
-import com.android.ide.eclipse.adt.internal.project.BaseProjectHelper;
-import com.android.ide.eclipse.adt.internal.project.LibraryClasspathContainerInitializer;
-import com.android.ide.eclipse.adt.internal.project.ProjectHelper;
-import com.android.ide.eclipse.adt.internal.resources.manager.GlobalProjectMonitor;
-import com.android.ide.eclipse.adt.internal.resources.manager.GlobalProjectMonitor.IFileListener;
-import com.android.ide.eclipse.adt.internal.resources.manager.GlobalProjectMonitor.IProjectListener;
-import com.android.ide.eclipse.adt.internal.resources.manager.GlobalProjectMonitor.IResourceEventListener;
-import com.android.ide.eclipse.adt.internal.sdk.ProjectState.LibraryDifference;
-import com.android.ide.eclipse.adt.internal.sdk.ProjectState.LibraryState;
-import com.android.io.StreamException;
-import com.android.prefs.AndroidLocation.AndroidLocationException;
-import com.android.sdklib.AndroidVersion;
-import com.android.sdklib.BuildToolInfo;
-import com.android.sdklib.IAndroidTarget;
-import com.android.sdklib.SdkManager;
-import com.android.sdklib.devices.DeviceManager;
-import com.android.sdklib.internal.avd.AvdManager;
-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.repository.FullRevision;
-import com.android.utils.ILogger;
-import com.google.common.collect.Maps;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IFolder;
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.resources.IMarkerDelta;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IResourceDelta;
-import org.eclipse.core.resources.IncrementalProjectBuilder;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.QualifiedName;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.core.runtime.jobs.Job;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.JavaCore;
-import org.eclipse.jdt.core.JavaModelException;
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.ui.IEditorDescriptor;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IEditorReference;
-import org.eclipse.ui.IFileEditorInput;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchPartSite;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.ide.IDE;
-
-import java.io.File;
-import java.io.IOException;
-import java.net.MalformedURLException;
-import java.net.URL;
-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.Map.Entry;
-import java.util.Set;
-import java.util.concurrent.atomic.AtomicBoolean;
-
-/**
- * Central point to load, manipulate and deal with the Android SDK. Only one SDK can be used
- * at the same time.
- *
- * To start using an SDK, call {@link #loadSdk(String)} which returns the instance of
- * the Sdk object.
- *
- * To get the list of platforms or add-ons present in the SDK, call {@link #getTargets()}.
- */
-public final class Sdk  {
-    private final static boolean DEBUG = false;
-
-    private final static Object LOCK = new Object();
-
-    private static Sdk sCurrentSdk = null;
-
-    /**
-     * Map associating {@link IProject} and their state {@link ProjectState}.
-     * <p/>This <b>MUST NOT</b> be accessed directly. Instead use {@link #getProjectState(IProject)}.
-     */
-    private final static HashMap<IProject, ProjectState> sProjectStateMap =
-            new HashMap<IProject, ProjectState>();
-
-    /**
-     * Data bundled using during the load of Target data.
-     * <p/>This contains the {@link LoadStatus} and a list of projects that attempted
-     * to compile before the loading was finished. Those projects will be recompiled
-     * at the end of the loading.
-     */
-    private final static class TargetLoadBundle {
-        LoadStatus status;
-        final HashSet<IJavaProject> projectsToReload = new HashSet<IJavaProject>();
-    }
-
-    private final SdkManager mManager;
-    private final Map<String, DexWrapper> mDexWrappers = Maps.newHashMap();
-    private final AvdManager mAvdManager;
-    private final DeviceManager mDeviceManager;
-
-    /** Map associating an {@link IAndroidTarget} to an {@link AndroidTargetData} */
-    private final HashMap<IAndroidTarget, AndroidTargetData> mTargetDataMap =
-        new HashMap<IAndroidTarget, AndroidTargetData>();
-    /** Map associating an {@link IAndroidTarget} and its {@link TargetLoadBundle}. */
-    private final HashMap<IAndroidTarget, TargetLoadBundle> mTargetDataStatusMap =
-        new HashMap<IAndroidTarget, TargetLoadBundle>();
-
-    /**
-     * If true the target data will never load anymore. The only way to reload them is to
-     * completely reload the SDK with {@link #loadSdk(String)}
-     */
-    private boolean mDontLoadTargetData = false;
-
-    private final String mDocBaseUrl;
-
-    /**
-     * Classes implementing this interface will receive notification when targets are changed.
-     */
-    public interface ITargetChangeListener {
-        /**
-         * Sent when project has its target changed.
-         */
-        void onProjectTargetChange(IProject changedProject);
-
-        /**
-         * Called when the targets are loaded (either the SDK finished loading when Eclipse starts,
-         * or the SDK is changed).
-         */
-        void onTargetLoaded(IAndroidTarget target);
-
-        /**
-         * Called when the base content of the SDK is parsed.
-         */
-        void onSdkLoaded();
-    }
-
-    /**
-     * Basic abstract implementation of the ITargetChangeListener for the case where both
-     * {@link #onProjectTargetChange(IProject)} and {@link #onTargetLoaded(IAndroidTarget)}
-     * use the same code based on a simple test requiring to know the current IProject.
-     */
-    public static abstract class TargetChangeListener implements ITargetChangeListener {
-        /**
-         * Returns the {@link IProject} associated with the listener.
-         */
-        public abstract IProject getProject();
-
-        /**
-         * Called when the listener needs to take action on the event. This is only called
-         * if {@link #getProject()} and the {@link IAndroidTarget} associated with the project
-         * match the values received in {@link #onProjectTargetChange(IProject)} and
-         * {@link #onTargetLoaded(IAndroidTarget)}.
-         */
-        public abstract void reload();
-
-        @Override
-        public void onProjectTargetChange(IProject changedProject) {
-            if (changedProject != null && changedProject.equals(getProject())) {
-                reload();
-            }
-        }
-
-        @Override
-        public void onTargetLoaded(IAndroidTarget target) {
-            IProject project = getProject();
-            if (target != null && target.equals(Sdk.getCurrent().getTarget(project))) {
-                reload();
-            }
-        }
-
-        @Override
-        public void onSdkLoaded() {
-            // do nothing;
-        }
-    }
-
-    /**
-     * Returns the lock object used to synchronize all operations dealing with SDK, targets and
-     * projects.
-     */
-    @NonNull
-    public static final Object getLock() {
-        return LOCK;
-    }
-
-    /**
-     * Loads an SDK and returns an {@link Sdk} object if success.
-     * <p/>If the SDK failed to load, it displays an error to the user.
-     * @param sdkLocation the OS path to the SDK.
-     */
-    @Nullable
-    public static Sdk loadSdk(String sdkLocation) {
-        synchronized (LOCK) {
-            if (sCurrentSdk != null) {
-                sCurrentSdk.dispose();
-                sCurrentSdk = null;
-            }
-
-            final AtomicBoolean hasWarning = new AtomicBoolean();
-            final AtomicBoolean hasError = new AtomicBoolean();
-            final ArrayList<String> logMessages = new ArrayList<String>();
-            ILogger log = new ILogger() {
-                @Override
-                public void error(@Nullable Throwable throwable, @Nullable String errorFormat,
-                        Object... arg) {
-                    hasError.set(true);
-                    if (errorFormat != null) {
-                        logMessages.add(String.format("Error: " + errorFormat, arg));
-                    }
-
-                    if (throwable != null) {
-                        logMessages.add(throwable.getMessage());
-                    }
-                }
-
-                @Override
-                public void warning(@NonNull String warningFormat, Object... arg) {
-                    hasWarning.set(true);
-                    logMessages.add(String.format("Warning: " + warningFormat, arg));
-                }
-
-                @Override
-                public void info(@NonNull String msgFormat, Object... arg) {
-                    logMessages.add(String.format(msgFormat, arg));
-                }
-
-                @Override
-                public void verbose(@NonNull String msgFormat, Object... arg) {
-                    info(msgFormat, arg);
-                }
-            };
-
-            // get an SdkManager object for the location
-            SdkManager manager = SdkManager.createManager(sdkLocation, log);
-            try {
-                if (manager == null) {
-                    hasError.set(true);
-                } else {
-                    // create the AVD Manager
-                    AvdManager avdManager = null;
-                    try {
-                        avdManager = AvdManager.getInstance(manager.getLocalSdk(), log);
-                    } catch (AndroidLocationException e) {
-                        log.error(e, "Error parsing the AVDs");
-                    }
-                    sCurrentSdk = new Sdk(manager, avdManager);
-                    return sCurrentSdk;
-                }
-            } finally {
-                if (hasError.get() || hasWarning.get()) {
-                    StringBuilder sb = new StringBuilder(
-                            String.format("%s when loading the SDK:\n",
-                                    hasError.get() ? "Error" : "Warning"));
-                    for (String msg : logMessages) {
-                        sb.append('\n');
-                        sb.append(msg);
-                    }
-                    if (hasError.get()) {
-                        AdtPlugin.printErrorToConsole("Android SDK", sb.toString());
-                        AdtPlugin.displayError("Android SDK", sb.toString());
-                    } else {
-                        AdtPlugin.printToConsole("Android SDK", sb.toString());
-                    }
-                }
-            }
-            return null;
-        }
-    }
-
-    /**
-     * Returns the current {@link Sdk} object.
-     */
-    @Nullable
-    public static Sdk getCurrent() {
-        synchronized (LOCK) {
-            return sCurrentSdk;
-        }
-    }
-
-    /**
-     * Returns the location of the current SDK as an OS path string.
-     * Guaranteed to be terminated by a platform-specific path separator.
-     * <p/>
-     * Due to {@link File} canonicalization, this MAY differ from the string used to initialize
-     * the SDK path.
-     *
-     * @return The SDK OS path or null if no SDK is setup.
-     * @deprecated Consider using {@link #getSdkFileLocation()} instead.
-     * @see #getSdkFileLocation()
-     */
-    @Deprecated
-    @Nullable
-    public String getSdkOsLocation() {
-        String path = mManager == null ? null : mManager.getLocation();
-        if (path != null) {
-            // For backward compatibility make sure it ends with a separator.
-            // This used to be the case when the SDK Manager was created from a String path
-            // but now that a File is internally used the trailing dir separator is lost.
-            if (path.length() > 0 && !path.endsWith(File.separator)) {
-                path = path + File.separator;
-            }
-        }
-        return path;
-    }
-
-    /**
-     * Returns the location of the current SDK as a {@link File} or null.
-     *
-     * @return The SDK OS path or null if no SDK is setup.
-     */
-    @Nullable
-    public File getSdkFileLocation() {
-        if (mManager == null || mManager.getLocalSdk() == null) {
-            return null;
-        }
-        return mManager.getLocalSdk().getLocation();
-    }
-
-    /**
-     * Returns a <em>new</em> {@link SdkManager} that can parse the SDK located
-     * at the current {@link #getSdkOsLocation()}.
-     * <p/>
-     * Implementation detail: The {@link Sdk} has its own internal manager with
-     * a custom logger which is not designed to be useful for outsiders. Callers
-     * who need their own {@link SdkManager} for parsing will often want to control
-     * the logger for their own need.
-     * <p/>
-     * This is just a convenient method equivalent to writing:
-     * <pre>SdkManager.createManager(Sdk.getCurrent().getSdkLocation(), log);</pre>
-     *
-     * @param log The logger for the {@link SdkManager}.
-     * @return A new {@link SdkManager} parsing the same location.
-     */
-    public @Nullable SdkManager getNewSdkManager(@NonNull ILogger log) {
-        return SdkManager.createManager(getSdkOsLocation(), log);
-    }
-
-    /**
-     * Returns the URL to the local documentation.
-     * Can return null if no documentation is found in the current SDK.
-     *
-     * @return A file:// URL on the local documentation folder if it exists or null.
-     */
-    @Nullable
-    public String getDocumentationBaseUrl() {
-        return mDocBaseUrl;
-    }
-
-    /**
-     * Returns the list of targets that are available in the SDK.
-     */
-    public IAndroidTarget[] getTargets() {
-        return mManager.getTargets();
-    }
-
-    /**
-     * Queries the underlying SDK Manager to check whether the platforms or addons
-     * directories have changed on-disk. Does not reload the SDK.
-     * <p/>
-     * This is a quick test based on the presence of the directories, their timestamps
-     * and a quick checksum of the source.properties files. It's possible to have
-     * false positives (e.g. if a file is manually modified in a platform) or false
-     * negatives (e.g. if a platform data file is changed manually in a 2nd level
-     * directory without altering the source.properties.)
-     */
-    public boolean haveTargetsChanged() {
-        return mManager.hasChanged();
-    }
-
-    /**
-     * Returns a target from a hash that was generated by {@link IAndroidTarget#hashString()}.
-     *
-     * @param hash the {@link IAndroidTarget} hash string.
-     * @return The matching {@link IAndroidTarget} or null.
-     */
-    @Nullable
-    public IAndroidTarget getTargetFromHashString(@NonNull String hash) {
-        return mManager.getTargetFromHashString(hash);
-    }
-
-    @Nullable
-    public BuildToolInfo getBuildToolInfo(@Nullable String buildToolVersion) {
-        if (buildToolVersion != null) {
-            try {
-                return mManager.getBuildTool(FullRevision.parseRevision(buildToolVersion));
-            } catch (Exception e) {
-                // ignore, return null below.
-            }
-        }
-
-        return null;
-    }
-
-    @Nullable
-    public BuildToolInfo getLatestBuildTool() {
-        return mManager.getLatestBuildTool();
-    }
-
-    /**
-     * Initializes a new project with a target. This creates the <code>project.properties</code>
-     * file.
-     * @param project the project to initialize
-     * @param target the project's target.
-     * @throws IOException if creating the file failed in any way.
-     * @throws StreamException if processing the project property file fails
-     */
-    public void initProject(@Nullable IProject project, @Nullable IAndroidTarget target)
-            throws IOException, StreamException {
-        if (project == null || target == null) {
-            return;
-        }
-
-        synchronized (LOCK) {
-            // check if there's already a state?
-            ProjectState state = getProjectState(project);
-
-            ProjectPropertiesWorkingCopy properties = null;
-
-            if (state != null) {
-                properties = state.getProperties().makeWorkingCopy();
-            }
-
-            if (properties == null) {
-                IPath location = project.getLocation();
-                if (location == null) {  // can return null when the project is being deleted.
-                    // do nothing and return null;
-                    return;
-                }
-
-                properties = ProjectProperties.create(location.toOSString(), PropertyType.PROJECT);
-            }
-
-            // save the target hash string in the project persistent property
-            properties.setProperty(ProjectProperties.PROPERTY_TARGET, target.hashString());
-            properties.save();
-        }
-    }
-
-    /**
-     * Returns the {@link ProjectState} object associated with a given project.
-     * <p/>
-     * This method is the only way to properly get the project's {@link ProjectState}
-     * If the project has not yet been loaded, then it is loaded.
-     * <p/>Because this methods deals with projects, it's not linked to an actual {@link Sdk}
-     * objects, and therefore is static.
-     * <p/>The value returned by {@link ProjectState#getTarget()} will change as {@link Sdk} objects
-     * are replaced.
-     * @param project the request project
-     * @return the ProjectState for the project.
-     */
-    @Nullable
-    @SuppressWarnings("deprecation")
-    public static ProjectState getProjectState(IProject project) {
-        if (project == null) {
-            return null;
-        }
-
-        synchronized (LOCK) {
-            ProjectState state = sProjectStateMap.get(project);
-            if (state == null) {
-                // load the project.properties from the project folder.
-                IPath location = project.getLocation();
-                if (location == null) {  // can return null when the project is being deleted.
-                    // do nothing and return null;
-                    return null;
-                }
-
-                String projectLocation = location.toOSString();
-
-                ProjectProperties properties = ProjectProperties.load(projectLocation,
-                        PropertyType.PROJECT);
-                if (properties == null) {
-                    // legacy support: look for default.properties and rename it if needed.
-                    properties = ProjectProperties.load(projectLocation,
-                            PropertyType.LEGACY_DEFAULT);
-
-                    if (properties == null) {
-                        AdtPlugin.log(IStatus.ERROR,
-                                "Failed to load properties file for project '%s'",
-                                project.getName());
-                        return null;
-                    } else {
-                        //legacy mode.
-                        // get a working copy with the new type "project"
-                        ProjectPropertiesWorkingCopy wc = properties.makeWorkingCopy(
-                                PropertyType.PROJECT);
-                        // and save it
-                        try {
-                            wc.save();
-
-                            // delete the old file.
-                            ProjectProperties.delete(projectLocation, PropertyType.LEGACY_DEFAULT);
-
-                            // make sure to use the new properties
-                            properties = ProjectProperties.load(projectLocation,
-                                    PropertyType.PROJECT);
-                        } catch (Exception e) {
-                            AdtPlugin.log(IStatus.ERROR,
-                                    "Failed to rename properties file to %1$s for project '%s2$'",
-                                    PropertyType.PROJECT.getFilename(), project.getName());
-                        }
-                    }
-                }
-
-                state = new ProjectState(project, properties);
-                sProjectStateMap.put(project, state);
-
-                // try to resolve the target
-                if (AdtPlugin.getDefault().getSdkLoadStatus() == LoadStatus.LOADED) {
-                    sCurrentSdk.loadTargetAndBuildTools(state);
-                }
-            }
-
-            return state;
-        }
-    }
-
-    /**
-     * Returns the {@link IAndroidTarget} object associated with the given {@link IProject}.
-     */
-    @Nullable
-    public IAndroidTarget getTarget(IProject project) {
-        if (project == null) {
-            return null;
-        }
-
-        ProjectState state = getProjectState(project);
-        if (state != null) {
-            return state.getTarget();
-        }
-
-        return null;
-    }
-
-    /**
-     * Loads the {@link IAndroidTarget} and BuildTools for a given project.
-     * <p/>This method will get the target hash string from the project properties, and resolve
-     * it to an {@link IAndroidTarget} object and store it inside the {@link ProjectState}.
-     * @param state the state representing the project to load.
-     * @return the target that was loaded.
-     */
-    @Nullable
-    public IAndroidTarget loadTargetAndBuildTools(ProjectState state) {
-        IAndroidTarget target = null;
-        if (state != null) {
-            String hash = state.getTargetHashString();
-            if (hash != null) {
-                state.setTarget(target = getTargetFromHashString(hash));
-            }
-
-            String markerMessage = null;
-            String buildToolInfoVersion = state.getBuildToolInfoVersion();
-            if (buildToolInfoVersion != null) {
-                BuildToolInfo buildToolsInfo = getBuildToolInfo(buildToolInfoVersion);
-
-                if (buildToolsInfo != null) {
-                    state.setBuildToolInfo(buildToolsInfo);
-                } else {
-                    markerMessage = String.format("Unable to resolve %s property value '%s'",
-                                        ProjectProperties.PROPERTY_BUILD_TOOLS,
-                                        buildToolInfoVersion);
-                }
-            } else {
-                // this is ok, we'll use the latest one automatically.
-                state.setBuildToolInfo(null);
-            }
-
-            handleBuildToolsMarker(state.getProject(), markerMessage);
-        }
-
-        return target;
-    }
-
-    /**
-     * Adds or edit a build tools marker from the given project. This is done through a Job.
-     * @param project the project
-     * @param markerMessage the message. if null the marker is removed.
-     */
-    private void handleBuildToolsMarker(final IProject project, final String markerMessage) {
-        Job markerJob = new Job("Android SDK: Build Tools Marker") {
-            @Override
-            protected IStatus run(IProgressMonitor monitor) {
-                try {
-                    if (project.isAccessible()) {
-                        // always delete existing marker first
-                        project.deleteMarkers(AdtConstants.MARKER_BUILD_TOOLS, true,
-                                IResource.DEPTH_ZERO);
-
-                        // add the new one if needed.
-                        if (markerMessage != null) {
-                            BaseProjectHelper.markProject(project,
-                                    AdtConstants.MARKER_BUILD_TOOLS,
-                                    markerMessage, IMarker.SEVERITY_ERROR,
-                                    IMarker.PRIORITY_HIGH);
-                        }
-                    }
-                } catch (CoreException e2) {
-                    AdtPlugin.log(e2, null);
-                    // Don't return e2.getStatus(); the job control will then produce
-                    // a popup with this error, which isn't very interesting for the
-                    // user.
-                }
-
-                return Status.OK_STATUS;
-            }
-        };
-
-        // build jobs are run after other interactive jobs
-        markerJob.setPriority(Job.BUILD);
-        markerJob.setRule(ResourcesPlugin.getWorkspace().getRoot());
-        markerJob.schedule();
-    }
-
-    /**
-     * Checks and loads (if needed) the data for a given target.
-     * <p/> The data is loaded in a separate {@link Job}, and opened editors will be notified
-     * through their implementation of {@link ITargetChangeListener#onTargetLoaded(IAndroidTarget)}.
-     * <p/>An optional project as second parameter can be given to be recompiled once the target
-     * data is finished loading.
-     * <p/>The return value is non-null only if the target data has already been loaded (and in this
-     * case is the status of the load operation)
-     * @param target the target to load.
-     * @param project an optional project to be recompiled when the target data is loaded.
-     * If the target is already loaded, nothing happens.
-     * @return The load status if the target data is already loaded.
-     */
-    @NonNull
-    public LoadStatus checkAndLoadTargetData(final IAndroidTarget target, IJavaProject project) {
-        boolean loadData = false;
-
-        synchronized (LOCK) {
-            if (mDontLoadTargetData) {
-                return LoadStatus.FAILED;
-            }
-
-            TargetLoadBundle bundle = mTargetDataStatusMap.get(target);
-            if (bundle == null) {
-                bundle = new TargetLoadBundle();
-                mTargetDataStatusMap.put(target,bundle);
-
-                // set status to loading
-                bundle.status = LoadStatus.LOADING;
-
-                // add project to bundle
-                if (project != null) {
-                    bundle.projectsToReload.add(project);
-                }
-
-                // and set the flag to start the loading below
-                loadData = true;
-            } else if (bundle.status == LoadStatus.LOADING) {
-                // add project to bundle
-                if (project != null) {
-                    bundle.projectsToReload.add(project);
-                }
-
-                return bundle.status;
-            } else if (bundle.status == LoadStatus.LOADED || bundle.status == LoadStatus.FAILED) {
-                return bundle.status;
-            }
-        }
-
-        if (loadData) {
-            Job job = new Job(String.format("Loading data for %1$s", target.getFullName())) {
-                @Override
-                protected IStatus run(IProgressMonitor monitor) {
-                    AdtPlugin plugin = AdtPlugin.getDefault();
-                    try {
-                        IStatus status = new AndroidTargetParser(target).run(monitor);
-
-                        IJavaProject[] javaProjectArray = null;
-
-                        synchronized (LOCK) {
-                            TargetLoadBundle bundle = mTargetDataStatusMap.get(target);
-
-                            if (status.getCode() != IStatus.OK) {
-                                bundle.status = LoadStatus.FAILED;
-                                bundle.projectsToReload.clear();
-                            } else {
-                                bundle.status = LoadStatus.LOADED;
-
-                                // Prepare the array of project to recompile.
-                                // The call is done outside of the synchronized block.
-                                javaProjectArray = bundle.projectsToReload.toArray(
-                                        new IJavaProject[bundle.projectsToReload.size()]);
-
-                                // and update the UI of the editors that depend on the target data.
-                                plugin.updateTargetListeners(target);
-                            }
-                        }
-
-                        if (javaProjectArray != null) {
-                            ProjectHelper.updateProjects(javaProjectArray);
-                        }
-
-                        return status;
-                    } catch (Throwable t) {
-                        synchronized (LOCK) {
-                            TargetLoadBundle bundle = mTargetDataStatusMap.get(target);
-                            bundle.status = LoadStatus.FAILED;
-                        }
-
-                        AdtPlugin.log(t, "Exception in checkAndLoadTargetData.");    //$NON-NLS-1$
-                        String message = String.format("Parsing Data for %1$s failed",  target.hashString());
-                        if (t instanceof UnsupportedClassVersionError) {
-                            message = "To use this platform, run Eclipse with JDK 7 or later. (" + message + ")";
-                        }
-                        return new Status(IStatus.ERROR, AdtPlugin.PLUGIN_ID, message, t);
-                    }
-                }
-            };
-            job.setPriority(Job.BUILD); // build jobs are run after other interactive jobs
-            job.setRule(ResourcesPlugin.getWorkspace().getRoot());
-            job.schedule();
-        }
-
-        // The only way to go through here is when the loading starts through the Job.
-        // Therefore the current status of the target is LOADING.
-        return LoadStatus.LOADING;
-    }
-
-    /**
-     * Return the {@link AndroidTargetData} for a given {@link IAndroidTarget}.
-     */
-    @Nullable
-    public AndroidTargetData getTargetData(IAndroidTarget target) {
-        synchronized (LOCK) {
-            return mTargetDataMap.get(target);
-        }
-    }
-
-    /**
-     * Return the {@link AndroidTargetData} for a given {@link IProject}.
-     */
-    @Nullable
-    public AndroidTargetData getTargetData(IProject project) {
-        synchronized (LOCK) {
-            IAndroidTarget target = getTarget(project);
-            if (target != null) {
-                return getTargetData(target);
-            }
-        }
-
-        return null;
-    }
-
-    /**
-     * Returns a {@link DexWrapper} object to be used to execute dx commands. If dx.jar was not
-     * loaded properly, then this will return <code>null</code>.
-     */
-    @Nullable
-    public DexWrapper getDexWrapper(@Nullable BuildToolInfo buildToolInfo) {
-        if (buildToolInfo == null) {
-            return null;
-        }
-        synchronized (LOCK) {
-            String dexLocation = buildToolInfo.getPath(BuildToolInfo.PathId.DX_JAR);
-            DexWrapper dexWrapper = mDexWrappers.get(dexLocation);
-
-            if (dexWrapper == null) {
-                // load DX.
-                dexWrapper = new DexWrapper();
-                IStatus res = dexWrapper.loadDex(dexLocation);
-                if (res != Status.OK_STATUS) {
-                    AdtPlugin.log(null, res.getMessage());
-                    dexWrapper = null;
-                } else {
-                    mDexWrappers.put(dexLocation, dexWrapper);
-                }
-            }
-
-            return dexWrapper;
-        }
-    }
-
-    public void unloadDexWrappers() {
-        synchronized (LOCK) {
-            for (DexWrapper wrapper : mDexWrappers.values()) {
-                wrapper.unload();
-            }
-            mDexWrappers.clear();
-        }
-    }
-
-    /**
-     * Returns the {@link AvdManager}. If the AvdManager failed to parse the AVD folder, this could
-     * be <code>null</code>.
-     */
-    @Nullable
-    public AvdManager getAvdManager() {
-        return mAvdManager;
-    }
-
-    @Nullable
-    public static AndroidVersion getDeviceVersion(@NonNull IDevice device) {
-        try {
-            Map<String, String> props = device.getProperties();
-            String apiLevel = props.get(IDevice.PROP_BUILD_API_LEVEL);
-            if (apiLevel == null) {
-                return null;
-            }
-
-            return new AndroidVersion(Integer.parseInt(apiLevel),
-                    props.get((IDevice.PROP_BUILD_CODENAME)));
-        } catch (NumberFormatException e) {
-            return null;
-        }
-    }
-
-    @NonNull
-    public DeviceManager getDeviceManager() {
-        return mDeviceManager;
-    }
-
-    /**
-     * Returns a list of {@link ProjectState} representing projects depending, directly or
-     * indirectly on a given library project.
-     * @param project the library project.
-     * @return a possibly empty list of ProjectState.
-     */
-    @NonNull
-    public static Set<ProjectState> getMainProjectsFor(IProject project) {
-        synchronized (LOCK) {
-            // first get the project directly depending on this.
-            Set<ProjectState> list = new HashSet<ProjectState>();
-
-            // loop on all project and see if ProjectState.getLibrary returns a non null
-            // project.
-            for (Entry<IProject, ProjectState> entry : sProjectStateMap.entrySet()) {
-                if (project != entry.getKey()) {
-                    LibraryState library = entry.getValue().getLibrary(project);
-                    if (library != null) {
-                        list.add(entry.getValue());
-                    }
-                }
-            }
-
-            // now look for projects depending on the projects directly depending on the library.
-            HashSet<ProjectState> result = new HashSet<ProjectState>(list);
-            for (ProjectState p : list) {
-                if (p.isLibrary()) {
-                    Set<ProjectState> set = getMainProjectsFor(p.getProject());
-                    result.addAll(set);
-                }
-            }
-
-            return result;
-        }
-    }
-
-    /**
-     * Unload the SDK's target data.
-     *
-     * If <var>preventReload</var>, this effect is final until the SDK instance is changed
-     * through {@link #loadSdk(String)}.
-     *
-     * The goal is to unload the targets to be able to replace existing targets with new ones,
-     * before calling {@link #loadSdk(String)} to fully reload the SDK.
-     *
-     * @param preventReload prevent the data from being loaded again for the remaining live of
-     *   this {@link Sdk} instance.
-     */
-    public void unloadTargetData(boolean preventReload) {
-        synchronized (LOCK) {
-            mDontLoadTargetData = preventReload;
-
-            // dispose of the target data.
-            for (AndroidTargetData data : mTargetDataMap.values()) {
-                data.dispose();
-            }
-
-            mTargetDataMap.clear();
-        }
-    }
-
-    private Sdk(SdkManager manager, AvdManager avdManager) {
-        mManager = manager;
-        mAvdManager = avdManager;
-
-        // listen to projects closing
-        GlobalProjectMonitor monitor = GlobalProjectMonitor.getMonitor();
-        // need to register the resource event listener first because the project listener
-        // is called back during registration with project opened in the workspace.
-        monitor.addResourceEventListener(mResourceEventListener);
-        monitor.addProjectListener(mProjectListener);
-        monitor.addFileListener(mFileListener,
-                IResourceDelta.CHANGED | IResourceDelta.ADDED | IResourceDelta.REMOVED);
-
-        // pre-compute some paths
-        mDocBaseUrl = getDocumentationBaseUrl(manager.getLocation() +
-                SdkConstants.OS_SDK_DOCS_FOLDER);
-
-        mDeviceManager = DeviceManager.createInstance(manager.getLocalSdk().getLocation(),
-                                                      AdtPlugin.getDefault());
-
-        // update whatever ProjectState is already present with new IAndroidTarget objects.
-        synchronized (LOCK) {
-            for (Entry<IProject, ProjectState> entry: sProjectStateMap.entrySet()) {
-                loadTargetAndBuildTools(entry.getValue());
-            }
-        }
-    }
-
-    /**
-     *  Cleans and unloads the SDK.
-     */
-    private void dispose() {
-        GlobalProjectMonitor monitor = GlobalProjectMonitor.getMonitor();
-        monitor.removeProjectListener(mProjectListener);
-        monitor.removeFileListener(mFileListener);
-        monitor.removeResourceEventListener(mResourceEventListener);
-
-        // the IAndroidTarget objects are now obsolete so update the project states.
-        synchronized (LOCK) {
-            for (Entry<IProject, ProjectState> entry: sProjectStateMap.entrySet()) {
-                entry.getValue().setTarget(null);
-            }
-
-            // dispose of the target data.
-            for (AndroidTargetData data : mTargetDataMap.values()) {
-                data.dispose();
-            }
-
-            mTargetDataMap.clear();
-        }
-    }
-
-    void setTargetData(IAndroidTarget target, AndroidTargetData data) {
-        synchronized (LOCK) {
-            mTargetDataMap.put(target, data);
-        }
-    }
-
-    /**
-     * Returns the URL to the local documentation.
-     * Can return null if no documentation is found in the current SDK.
-     *
-     * @param osDocsPath Path to the documentation folder in the current SDK.
-     *  The folder may not actually exist.
-     * @return A file:// URL on the local documentation folder if it exists or null.
-     */
-    private String getDocumentationBaseUrl(String osDocsPath) {
-        File f = new File(osDocsPath);
-
-        if (f.isDirectory()) {
-            try {
-                // Note: to create a file:// URL, one would typically use something like
-                // f.toURI().toURL().toString(). However this generates a broken path on
-                // Windows, namely "C:\\foo" is converted to "file:/C:/foo" instead of
-                // "file:///C:/foo" (i.e. there should be 3 / after "file:"). So we'll
-                // do the correct thing manually.
-
-                String path = f.getAbsolutePath();
-                if (File.separatorChar != '/') {
-                    path = path.replace(File.separatorChar, '/');
-                }
-
-                // For some reason the URL class doesn't add the mandatory "//" after
-                // the "file:" protocol name, so it has to be hacked into the path.
-                URL url = new URL("file", null, "//" + path);  //$NON-NLS-1$ //$NON-NLS-2$
-                String result = url.toString();
-                return result;
-            } catch (MalformedURLException e) {
-                // ignore malformed URLs
-            }
-        }
-
-        return null;
-    }
-
-    /**
-     * Delegate listener for project changes.
-     */
-    private IProjectListener mProjectListener = new IProjectListener() {
-        @Override
-        public void projectClosed(IProject project) {
-            onProjectRemoved(project, false /*deleted*/);
-        }
-
-        @Override
-        public void projectDeleted(IProject project) {
-            onProjectRemoved(project, true /*deleted*/);
-        }
-
-        private void onProjectRemoved(IProject removedProject, boolean deleted) {
-            if (DEBUG) {
-                System.out.println(">>> CLOSED: " + removedProject.getName());
-            }
-
-            // get the target project
-            synchronized (LOCK) {
-                // Don't use getProject() as it could create the ProjectState if it's not
-                // there yet and this is not what we want. We want the current object.
-                // Therefore, direct access to the map.
-                ProjectState removedState = sProjectStateMap.get(removedProject);
-                if (removedState != null) {
-                    // 1. clear the layout lib cache associated with this project
-                    IAndroidTarget target = removedState.getTarget();
-                    if (target != null) {
-                        // get the bridge for the target, and clear the cache for this project.
-                        AndroidTargetData data = mTargetDataMap.get(target);
-                        if (data != null) {
-                            LayoutLibrary layoutLib = data.getLayoutLibrary();
-                            if (layoutLib != null && layoutLib.getStatus() == LoadStatus.LOADED) {
-                                layoutLib.clearCaches(removedProject);
-                            }
-                        }
-                    }
-
-                    // 2. if the project is a library, make sure to update the
-                    // LibraryState for any project referencing it.
-                    // Also, record the updated projects that are libraries, to update
-                    // projects that depend on them.
-                    for (ProjectState projectState : sProjectStateMap.values()) {
-                        LibraryState libState = projectState.getLibrary(removedProject);
-                        if (libState != null) {
-                            // Close the library right away.
-                            // This remove links between the LibraryState and the projectState.
-                            // This is because in case of a rename of a project, projectClosed and
-                            // projectOpened will be called before any other job is run, so we
-                            // need to make sure projectOpened is closed with the main project
-                            // state up to date.
-                            libState.close();
-
-                            // record that this project changed, and in case it's a library
-                            // that its parents need to be updated as well.
-                            markProject(projectState, projectState.isLibrary());
-                        }
-                    }
-
-                    // now remove the project for the project map.
-                    sProjectStateMap.remove(removedProject);
-                }
-            }
-
-            if (DEBUG) {
-                System.out.println("<<<");
-            }
-        }
-
-        @Override
-        public void projectOpened(IProject project) {
-            onProjectOpened(project);
-        }
-
-        @Override
-        public void projectOpenedWithWorkspace(IProject project) {
-            // no need to force recompilation when projects are opened with the workspace.
-            onProjectOpened(project);
-        }
-
-        @Override
-        public void allProjectsOpenedWithWorkspace() {
-            // Correct currently open editors
-            fixOpenLegacyEditors();
-        }
-
-        private void onProjectOpened(final IProject openedProject) {
-
-            ProjectState openedState = getProjectState(openedProject);
-            if (openedState != null) {
-                if (DEBUG) {
-                    System.out.println(">>> OPENED: " + openedProject.getName());
-                }
-
-                synchronized (LOCK) {
-                    final boolean isLibrary = openedState.isLibrary();
-                    final boolean hasLibraries = openedState.hasLibraries();
-
-                    if (isLibrary || hasLibraries) {
-                        boolean foundLibraries = false;
-                        // loop on all the existing project and update them based on this new
-                        // project
-                        for (ProjectState projectState : sProjectStateMap.values()) {
-                            if (projectState != openedState) {
-                                // If the project has libraries, check if this project
-                                // is a reference.
-                                if (hasLibraries) {
-                                    // ProjectState#needs() both checks if this is a missing library
-                                    // and updates LibraryState to contains the new values.
-                                    // This must always be called.
-                                    LibraryState libState = openedState.needs(projectState);
-
-                                    if (libState != null) {
-                                        // found a library! Add the main project to the list of
-                                        // modified project
-                                        foundLibraries = true;
-                                    }
-                                }
-
-                                // if the project is a library check if the other project depend
-                                // on it.
-                                if (isLibrary) {
-                                    // ProjectState#needs() both checks if this is a missing library
-                                    // and updates LibraryState to contains the new values.
-                                    // This must always be called.
-                                    LibraryState libState = projectState.needs(openedState);
-
-                                    if (libState != null) {
-                                        // There's a dependency! Add the project to the list of
-                                        // modified project, but also to a list of projects
-                                        // that saw one of its dependencies resolved.
-                                        markProject(projectState, projectState.isLibrary());
-                                    }
-                                }
-                            }
-                        }
-
-                        // if the project has a libraries and we found at least one, we add
-                        // the project to the list of modified project.
-                        // Since we already went through the parent, no need to update them.
-                        if (foundLibraries) {
-                            markProject(openedState, false /*updateParents*/);
-                        }
-                    }
-                }
-
-                // Correct file editor associations.
-                fixEditorAssociations(openedProject);
-
-                // Fix classpath entries in a job since the workspace might be locked now.
-                Job fixCpeJob = new Job("Adjusting Android Project Classpath") {
-                    @Override
-                    protected IStatus run(IProgressMonitor monitor) {
-                        try {
-                            ProjectHelper.fixProjectClasspathEntries(
-                                    JavaCore.create(openedProject));
-                        } catch (JavaModelException e) {
-                            AdtPlugin.log(e, "error fixing classpath entries");
-                            // Don't return e2.getStatus(); the job control will then produce
-                            // a popup with this error, which isn't very interesting for the
-                            // user.
-                        }
-
-                        return Status.OK_STATUS;
-                    }
-                };
-
-                // build jobs are run after other interactive jobs
-                fixCpeJob.setPriority(Job.BUILD);
-                fixCpeJob.setRule(ResourcesPlugin.getWorkspace().getRoot());
-                fixCpeJob.schedule();
-
-
-                if (DEBUG) {
-                    System.out.println("<<<");
-                }
-            }
-        }
-
-        @Override
-        public void projectRenamed(IProject project, IPath from) {
-            // we don't actually care about this anymore.
-        }
-    };
-
-    /**
-     * Delegate listener for file changes.
-     */
-    private IFileListener mFileListener = new IFileListener() {
-        @Override
-        public void fileChanged(final @NonNull IFile file, @NonNull IMarkerDelta[] markerDeltas,
-                int kind, @Nullable String extension, int flags, boolean isAndroidPRoject) {
-            if (!isAndroidPRoject) {
-                return;
-            }
-
-            if (SdkConstants.FN_PROJECT_PROPERTIES.equals(file.getName()) &&
-                    file.getParent() == file.getProject()) {
-                try {
-                    // reload the content of the project.properties file and update
-                    // the target.
-                    IProject iProject = file.getProject();
-
-                    ProjectState state = Sdk.getProjectState(iProject);
-
-                    // get the current target and build tools
-                    IAndroidTarget oldTarget = state.getTarget();
-                    boolean oldRsSupportMode = state.getRenderScriptSupportMode();
-
-                    // get the current library flag
-                    boolean wasLibrary = state.isLibrary();
-
-                    LibraryDifference diff = state.reloadProperties();
-
-                    // load the (possibly new) target.
-                    IAndroidTarget newTarget = loadTargetAndBuildTools(state);
-
-                    // reload the libraries if needed
-                    if (diff.hasDiff()) {
-                        if (diff.added) {
-                            synchronized (LOCK) {
-                                for (ProjectState projectState : sProjectStateMap.values()) {
-                                    if (projectState != state) {
-                                        // need to call needs to do the libraryState link,
-                                        // but no need to look at the result, as we'll compare
-                                        // the result of getFullLibraryProjects()
-                                        // this is easier to due to indirect dependencies.
-                                        state.needs(projectState);
-                                    }
-                                }
-                            }
-                        }
-
-                        markProject(state, wasLibrary || state.isLibrary());
-                    }
-
-                    // apply the new target if needed.
-                    if (newTarget != oldTarget ||
-                            oldRsSupportMode != state.getRenderScriptSupportMode()) {
-                        IJavaProject javaProject = BaseProjectHelper.getJavaProject(
-                                file.getProject());
-                        if (javaProject != null) {
-                            ProjectHelper.updateProject(javaProject);
-                        }
-
-                        // update the editors to reload with the new target
-                        AdtPlugin.getDefault().updateTargetListeners(iProject);
-                    }
-                } catch (CoreException e) {
-                    // This can't happen as it's only for closed project (or non existing)
-                    // but in that case we can't get a fileChanged on this file.
-                }
-            } else if (kind == IResourceDelta.ADDED || kind == IResourceDelta.REMOVED) {
-                // check if it's an add/remove on a jar files inside libs
-                if (EXT_JAR.equals(extension) &&
-                        file.getProjectRelativePath().segmentCount() == 2 &&
-                        file.getParent().getName().equals(SdkConstants.FD_NATIVE_LIBS)) {
-                    // need to update the project and whatever depend on it.
-
-                    processJarFileChange(file);
-                }
-            }
-        }
-
-        private void processJarFileChange(final IFile file) {
-            try {
-                IProject iProject = file.getProject();
-
-                if (iProject.hasNature(AdtConstants.NATURE_DEFAULT) == false) {
-                    return;
-                }
-
-                List<IJavaProject> projectList = new ArrayList<IJavaProject>();
-                IJavaProject javaProject = BaseProjectHelper.getJavaProject(iProject);
-                if (javaProject != null) {
-                    projectList.add(javaProject);
-                }
-
-                ProjectState state = Sdk.getProjectState(iProject);
-
-                if (state != null) {
-                    Collection<ProjectState> parents = state.getFullParentProjects();
-                    for (ProjectState s : parents) {
-                        javaProject = BaseProjectHelper.getJavaProject(s.getProject());
-                        if (javaProject != null) {
-                            projectList.add(javaProject);
-                        }
-                    }
-
-                    ProjectHelper.updateProjects(
-                            projectList.toArray(new IJavaProject[projectList.size()]));
-                }
-            } catch (CoreException e) {
-                // This can't happen as it's only for closed project (or non existing)
-                // but in that case we can't get a fileChanged on this file.
-            }
-        }
-    };
-
-    /** List of modified projects. This is filled in
-     * {@link IProjectListener#projectOpened(IProject)},
-     * {@link IProjectListener#projectOpenedWithWorkspace(IProject)},
-     * {@link IProjectListener#projectClosed(IProject)}, and
-     * {@link IProjectListener#projectDeleted(IProject)} and processed in
-     * {@link IResourceEventListener#resourceChangeEventEnd()}.
-     */
-    private final List<ProjectState> mModifiedProjects = new ArrayList<ProjectState>();
-    private final List<ProjectState> mModifiedChildProjects = new ArrayList<ProjectState>();
-
-    private void markProject(ProjectState projectState, boolean updateParents) {
-        if (mModifiedProjects.contains(projectState) == false) {
-            if (DEBUG) {
-                System.out.println("\tMARKED: " + projectState.getProject().getName());
-            }
-            mModifiedProjects.add(projectState);
-        }
-
-        // if the project is resolved also add it to this list.
-        if (updateParents) {
-            if (mModifiedChildProjects.contains(projectState) == false) {
-                if (DEBUG) {
-                    System.out.println("\tMARKED(child): " + projectState.getProject().getName());
-                }
-                mModifiedChildProjects.add(projectState);
-            }
-        }
-    }
-
-    /**
-     * Delegate listener for resource changes. This is called before and after any calls to the
-     * project and file listeners (for a given resource change event).
-     */
-    private IResourceEventListener mResourceEventListener = new IResourceEventListener() {
-        @Override
-        public void resourceChangeEventStart() {
-            mModifiedProjects.clear();
-            mModifiedChildProjects.clear();
-        }
-
-        @Override
-        public void resourceChangeEventEnd() {
-            if (mModifiedProjects.size() == 0) {
-                return;
-            }
-
-            // first make sure all the parents are updated
-            updateParentProjects();
-
-            // for all modified projects, update their library list
-            // and gather their IProject
-            final List<IJavaProject> projectList = new ArrayList<IJavaProject>();
-            for (ProjectState state : mModifiedProjects) {
-                state.updateFullLibraryList();
-                projectList.add(JavaCore.create(state.getProject()));
-            }
-
-            Job job = new Job("Android Library Update") { //$NON-NLS-1$
-                @Override
-                protected IStatus run(IProgressMonitor monitor) {
-                    LibraryClasspathContainerInitializer.updateProjects(
-                            projectList.toArray(new IJavaProject[projectList.size()]));
-
-                    for (IJavaProject javaProject : projectList) {
-                        try {
-                            javaProject.getProject().build(IncrementalProjectBuilder.FULL_BUILD,
-                                    monitor);
-                        } catch (CoreException e) {
-                            // pass
-                        }
-                    }
-                    return Status.OK_STATUS;
-                }
-            };
-            job.setPriority(Job.BUILD);
-            job.setRule(ResourcesPlugin.getWorkspace().getRoot());
-            job.schedule();
-        }
-    };
-
-    /**
-     * Updates all existing projects with a given list of new/updated libraries.
-     * This loops through all opened projects and check if they depend on any of the given
-     * library project, and if they do, they are linked together.
-     */
-    private void updateParentProjects() {
-        if (mModifiedChildProjects.size() == 0) {
-            return;
-        }
-
-        ArrayList<ProjectState> childProjects = new ArrayList<ProjectState>(mModifiedChildProjects);
-        mModifiedChildProjects.clear();
-        synchronized (LOCK) {
-            // for each project for which we must update its parent, we loop on the parent
-            // projects and adds them to the list of modified projects. If they are themselves
-            // libraries, we add them too.
-            for (ProjectState state : childProjects) {
-                if (DEBUG) {
-                    System.out.println(">>> Updating parents of " + state.getProject().getName());
-                }
-                List<ProjectState> parents = state.getParentProjects();
-                for (ProjectState parent : parents) {
-                    markProject(parent, parent.isLibrary());
-                }
-                if (DEBUG) {
-                    System.out.println("<<<");
-                }
-            }
-        }
-
-        // done, but there may be parents that are also libraries. Need to update their parents.
-        updateParentProjects();
-    }
-
-    /**
-     * Fix editor associations for the given project, if not already done.
-     * <p/>
-     * Eclipse has a per-file setting for which editor should be used for each file
-     * (see {@link IDE#setDefaultEditor(IFile, String)}).
-     * We're using this flag to pick between the various XML editors (layout, drawable, etc)
-     * since they all have the same file name extension.
-     * <p/>
-     * Unfortunately, the file setting can be "wrong" for two reasons:
-     * <ol>
-     *   <li> The editor type was added <b>after</b> a file had been seen by the IDE.
-     *        For example, we added new editors for animations and for drawables around
-     *        ADT 12, but any file seen by ADT in earlier versions will continue to use
-     *        the vanilla Eclipse XML editor instead.
-     *   <li> A bug in ADT 14 and ADT 15 (see issue 21124) meant that files created in new
-     *        folders would end up with wrong editor associations. Even though that bug
-     *        is fixed in ADT 16, the fix only affects new files, it cannot retroactively
-     *        fix editor associations that were set incorrectly by ADT 14 or 15.
-     * </ol>
-     * <p/>
-     * This method attempts to fix the editor bindings retroactively by scanning all the
-     * resource XML files and resetting the editor associations.
-     * Since this is a potentially slow operation, this is only done "once"; we use a
-     * persistent project property to avoid looking repeatedly. In the future if we add
-     * additional editors, we can rev the scanned version value.
-     */
-    private void fixEditorAssociations(final IProject project) {
-        QualifiedName KEY = new QualifiedName(AdtPlugin.PLUGIN_ID, "editorbinding"); //$NON-NLS-1$
-
-        try {
-            String value = project.getPersistentProperty(KEY);
-            int currentVersion = 0;
-            if (value != null) {
-                try {
-                    currentVersion = Integer.parseInt(value);
-                } catch (Exception ingore) {
-                }
-            }
-
-            // The target version we're comparing to. This must be incremented each time
-            // we change the processing here so that a new version of the plugin would
-            // try to fix existing user projects.
-            final int targetVersion = 2;
-
-            if (currentVersion >= targetVersion) {
-                return;
-            }
-
-            // Set to specific version such that we can rev the version in the future
-            // to trigger further scanning
-            project.setPersistentProperty(KEY, Integer.toString(targetVersion));
-
-            // Now update the actual editor associations.
-            Job job = new Job("Update Android editor bindings") { //$NON-NLS-1$
-                @Override
-                protected IStatus run(IProgressMonitor monitor) {
-                    try {
-                        for (IResource folderResource : project.getFolder(FD_RES).members()) {
-                            if (folderResource instanceof IFolder) {
-                                IFolder folder = (IFolder) folderResource;
-
-                                for (IResource resource : folder.members()) {
-                                    if (resource instanceof IFile &&
-                                            resource.getName().endsWith(DOT_XML)) {
-                                        fixXmlFile((IFile) resource);
-                                    }
-                                }
-                            }
-                        }
-
-                        // TODO change AndroidManifest.xml ID too
-
-                    } catch (CoreException e) {
-                        AdtPlugin.log(e, null);
-                    }
-
-                    return Status.OK_STATUS;
-                }
-
-                /**
-                 * Attempt to fix the editor ID for the given /res XML file.
-                 */
-                private void fixXmlFile(final IFile file) {
-                    // Fix the default editor ID for this resource.
-                    // This has no effect on currently open editors.
-                    IEditorDescriptor desc = IDE.getDefaultEditor(file);
-
-                    if (desc == null || !CommonXmlEditor.ID.equals(desc.getId())) {
-                        IDE.setDefaultEditor(file, CommonXmlEditor.ID);
-                    }
-                }
-            };
-            job.setPriority(Job.BUILD);
-            job.schedule();
-        } catch (CoreException e) {
-            AdtPlugin.log(e, null);
-        }
-    }
-
-    /**
-     * Tries to fix all currently open Android legacy editors.
-     * <p/>
-     * If an editor is found to match one of the legacy ids, we'll try to close it.
-     * If that succeeds, we try to reopen it using the new common editor ID.
-     * <p/>
-     * This method must be run from the UI thread.
-     */
-    private void fixOpenLegacyEditors() {
-
-        AdtPlugin adt = AdtPlugin.getDefault();
-        if (adt == null) {
-            return;
-        }
-
-        final IPreferenceStore store = adt.getPreferenceStore();
-        int currentValue = store.getInt(AdtPrefs.PREFS_FIX_LEGACY_EDITORS);
-        // The target version we're comparing to. This must be incremented each time
-        // we change the processing here so that a new version of the plugin would
-        // try to fix existing editors.
-        final int targetValue = 1;
-
-        if (currentValue >= targetValue) {
-            return;
-        }
-
-        // To be able to close and open editors we need to make sure this is done
-        // in the UI thread, which this isn't invoked from.
-        PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
-            @Override
-            public void run() {
-                HashSet<String> legacyIds =
-                    new HashSet<String>(Arrays.asList(CommonXmlEditor.LEGACY_EDITOR_IDS));
-
-                for (IWorkbenchWindow win : PlatformUI.getWorkbench().getWorkbenchWindows()) {
-                    for (IWorkbenchPage page : win.getPages()) {
-                        for (IEditorReference ref : page.getEditorReferences()) {
-                            try {
-                                IEditorInput input = ref.getEditorInput();
-                                if (input instanceof IFileEditorInput) {
-                                    IFile file = ((IFileEditorInput)input).getFile();
-                                    IEditorPart part = ref.getEditor(true /*restore*/);
-                                    if (part != null) {
-                                        IWorkbenchPartSite site = part.getSite();
-                                        if (site != null) {
-                                            String id = site.getId();
-                                            if (legacyIds.contains(id)) {
-                                                // This editor matches one of legacy editor IDs.
-                                                fixEditor(page, part, input, file, id);
-                                            }
-                                        }
-                                    }
-                                }
-                            } catch (Exception e) {
-                                // ignore
-                            }
-                        }
-                    }
-                }
-
-                // Remember that we managed to do fix all editors
-                store.setValue(AdtPrefs.PREFS_FIX_LEGACY_EDITORS, targetValue);
-            }
-
-            private void fixEditor(
-                    IWorkbenchPage page,
-                    IEditorPart part,
-                    IEditorInput input,
-                    IFile file,
-                    String id) {
-                IDE.setDefaultEditor(file, CommonXmlEditor.ID);
-
-                boolean ok = page.closeEditor(part, true /*save*/);
-
-                AdtPlugin.log(IStatus.INFO,
-                    "Closed legacy editor ID %s for %s: %s", //$NON-NLS-1$
-                    id,
-                    file.getFullPath(),
-                    ok ? "Success" : "Failed");//$NON-NLS-1$ //$NON-NLS-2$
-
-                if (ok) {
-                    // Try to reopen it with the new ID
-                    try {
-                        page.openEditor(input, CommonXmlEditor.ID);
-                    } catch (PartInitException e) {
-                        AdtPlugin.log(e,
-                            "Failed to reopen %s",          //$NON-NLS-1$
-                            file.getFullPath());
-                    }
-                }
-            }
-        });
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/sdk/WidgetClassLoader.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/sdk/WidgetClassLoader.java
deleted file mode 100644
index 682d6e5..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/sdk/WidgetClassLoader.java
+++ /dev/null
@@ -1,343 +0,0 @@
-/*
- * 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.sdk;
-
-import com.android.SdkConstants;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-
-import java.io.BufferedReader;
-import java.io.FileNotFoundException;
-import java.io.FileReader;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.TreeMap;
-
-import javax.management.InvalidAttributeValueException;
-
-/**
- * Parser for the text file containing the list of widgets, layouts and layout params.
- * <p/>
- * The file is a straight text file containing one class per line.<br>
- * Each line is in the following format<br>
- * <code>[code][class name] [super class name] [super class name]...</code>
- * where code is a single letter (W for widget, L for layout, P for layout params), and class names
- * are the fully qualified name of the classes.
- */
-public final class WidgetClassLoader implements IAndroidClassLoader {
-
-    /**
-     * Basic class containing the class descriptions found in the text file.
-     */
-    private final static class ClassDescriptor implements IClassDescriptor {
-
-        private String mFqcn;
-        private String mSimpleName;
-        private ClassDescriptor mSuperClass;
-        private ClassDescriptor mEnclosingClass;
-        private final ArrayList<IClassDescriptor> mDeclaredClasses =
-                new ArrayList<IClassDescriptor>();
-        private boolean mIsInstantiable = false;
-
-        ClassDescriptor(String fqcn) {
-            mFqcn = fqcn;
-            mSimpleName = getSimpleName(fqcn);
-        }
-
-        @Override
-        public String getFullClassName() {
-            return mFqcn;
-        }
-
-        @Override
-        public String getSimpleName() {
-            return mSimpleName;
-        }
-
-        @Override
-        public IClassDescriptor[] getDeclaredClasses() {
-            return mDeclaredClasses.toArray(new IClassDescriptor[mDeclaredClasses.size()]);
-        }
-
-        private void addDeclaredClass(ClassDescriptor declaredClass) {
-            mDeclaredClasses.add(declaredClass);
-        }
-
-        @Override
-        public IClassDescriptor getEnclosingClass() {
-            return mEnclosingClass;
-        }
-
-        void setEnclosingClass(ClassDescriptor enclosingClass) {
-            // set the enclosing class.
-            mEnclosingClass = enclosingClass;
-
-            // add this to the list of declared class in the enclosing class.
-            mEnclosingClass.addDeclaredClass(this);
-
-            // finally change the name of declared class to make sure it uses the
-            // convention: package.enclosing$declared instead of package.enclosing.declared
-            mFqcn = enclosingClass.mFqcn + "$" + mFqcn.substring(enclosingClass.mFqcn.length() + 1);
-        }
-
-        @Override
-        public IClassDescriptor getSuperclass() {
-            return mSuperClass;
-        }
-
-        void setSuperClass(ClassDescriptor superClass) {
-            mSuperClass = superClass;
-        }
-
-        @Override
-        public boolean equals(Object clazz) {
-            if (clazz instanceof ClassDescriptor) {
-                return mFqcn.equals(((ClassDescriptor)clazz).mFqcn);
-            }
-            return super.equals(clazz);
-        }
-
-        @Override
-        public int hashCode() {
-            return mFqcn.hashCode();
-        }
-
-        @Override
-        public boolean isInstantiable() {
-            return mIsInstantiable;
-        }
-
-        void setInstantiable(boolean state) {
-            mIsInstantiable = state;
-        }
-
-        private String getSimpleName(String fqcn) {
-            String[] segments = fqcn.split("\\.");
-            return segments[segments.length-1];
-        }
-    }
-
-    private BufferedReader mReader;
-
-    /** Output map of FQCN => descriptor on all classes */
-    private final Map<String, ClassDescriptor> mMap = new TreeMap<String, ClassDescriptor>();
-    /** Output map of FQCN => descriptor on View classes */
-    private final Map<String, ClassDescriptor> mWidgetMap = new TreeMap<String, ClassDescriptor>();
-    /** Output map of FQCN => descriptor on ViewGroup classes */
-    private final Map<String, ClassDescriptor> mLayoutMap = new TreeMap<String, ClassDescriptor>();
-    /** Output map of FQCN => descriptor on LayoutParams classes */
-    private final Map<String, ClassDescriptor> mLayoutParamsMap =
-        new HashMap<String, ClassDescriptor>();
-    /** File path of the source text file */
-    private String mOsFilePath;
-
-    /**
-     * Creates a loader with a given file path.
-     * @param osFilePath the OS path of the file to load.
-     * @throws FileNotFoundException if the file is not found.
-     */
-    WidgetClassLoader(String osFilePath) throws FileNotFoundException {
-        mOsFilePath = osFilePath;
-        mReader = new BufferedReader(new FileReader(osFilePath));
-    }
-
-    @Override
-    public String getSource() {
-        return mOsFilePath;
-    }
-
-    /**
-     * Parses the text file and return true if the file was successfully parsed.
-     * @param monitor
-     */
-    boolean parseWidgetList(IProgressMonitor monitor) {
-        try {
-            String line;
-            while ((line = mReader.readLine()) != null) {
-                if (line.length() > 0) {
-                    char prefix = line.charAt(0);
-                    String[] classes = null;
-                    ClassDescriptor clazz = null;
-                    switch (prefix) {
-                        case 'W':
-                            classes = line.substring(1).split(" ");
-                            clazz = processClass(classes, 0, null /* map */);
-                            if (clazz != null) {
-                                clazz.setInstantiable(true);
-                                mWidgetMap.put(classes[0], clazz);
-                            }
-                            break;
-                        case 'L':
-                            classes = line.substring(1).split(" ");
-                            clazz = processClass(classes, 0, null /* map */);
-                            if (clazz != null) {
-                                clazz.setInstantiable(true);
-                                mLayoutMap.put(classes[0], clazz);
-                            }
-                            break;
-                        case 'P':
-                            classes = line.substring(1).split(" ");
-                            clazz = processClass(classes, 0, mLayoutParamsMap);
-                            if (clazz != null) {
-                                clazz.setInstantiable(true);
-                            }
-                            break;
-                        case '#':
-                            // comment, do nothing
-                            break;
-                        default:
-                                throw new IllegalArgumentException();
-                    }
-                }
-            }
-
-            // reconciliate the layout and their layout params
-            postProcess();
-
-            return true;
-        } catch (IOException e) {
-        } finally {
-            try {
-                mReader.close();
-            } catch (IOException e) {
-            }
-        }
-
-        return false;
-    }
-
-    /**
-     * Parses a View class and adds a ViewClassInfo for it in mWidgetMap.
-     * It calls itself recursively to handle super classes which are also Views.
-     * @param classes the inheritance list of the class to process.
-     * @param index the index of the class to process in the <code>classes</code> array.
-     * @param map an optional map in which to put every {@link ClassDescriptor} created.
-     */
-    private ClassDescriptor processClass(String[] classes, int index,
-            Map<String, ClassDescriptor> map) {
-        if (index >= classes.length) {
-            return null;
-        }
-
-        String fqcn = classes[index];
-
-        if ("java.lang.Object".equals(fqcn)) { //$NON-NLS-1$
-            return null;
-        }
-
-        // check if the ViewInfoClass has not yet been created.
-        if (mMap.containsKey(fqcn)) {
-            return mMap.get(fqcn);
-        }
-
-        // create the custom class.
-        ClassDescriptor clazz = new ClassDescriptor(fqcn);
-        mMap.put(fqcn, clazz);
-        if (map != null) {
-            map.put(fqcn, clazz);
-        }
-
-        // get the super class
-        ClassDescriptor superClass = processClass(classes, index+1, map);
-        if (superClass != null) {
-            clazz.setSuperClass(superClass);
-        }
-
-        return clazz;
-    }
-
-    /**
-     * Goes through the layout params and look for the enclosed class. If the layout params
-     * has no known enclosed type it is dropped.
-     */
-    private void postProcess() {
-        Collection<ClassDescriptor> params = mLayoutParamsMap.values();
-
-        for (ClassDescriptor param : params) {
-            String fqcn = param.getFullClassName();
-
-            // get the enclosed name.
-            String enclosed = getEnclosedName(fqcn);
-
-            // look for a match in the layouts. We don't use the layout map as it only contains the
-            // end classes, but in this case we also need to process the layout params for the base
-            // layout classes.
-            ClassDescriptor enclosingType = mMap.get(enclosed);
-            if (enclosingType != null) {
-                param.setEnclosingClass(enclosingType);
-
-                // remove the class from the map, and put it back with the fixed name
-                mMap.remove(fqcn);
-                mMap.put(param.getFullClassName(), param);
-            }
-        }
-    }
-
-    private String getEnclosedName(String fqcn) {
-        int index = fqcn.lastIndexOf('.');
-        return fqcn.substring(0, index);
-    }
-
-    /**
-     * Finds and loads all classes that derive from a given set of super classes.
-     *
-     * @param rootPackage Root package of classes to find. Use an empty string to find everyting.
-     * @param superClasses The super classes of all the classes to find.
-     * @return An hash map which keys are the super classes looked for and which values are
-     *         ArrayList of the classes found. The array lists are always created for all the
-     *         valid keys, they are simply empty if no deriving class is found for a given
-     *         super class.
-     * @throws IOException
-     * @throws InvalidAttributeValueException
-     * @throws ClassFormatError
-     */
-    @Override
-    public HashMap<String, ArrayList<IClassDescriptor>> findClassesDerivingFrom(String rootPackage,
-            String[] superClasses) throws IOException, InvalidAttributeValueException,
-            ClassFormatError {
-        HashMap<String, ArrayList<IClassDescriptor>> map =
-                new HashMap<String, ArrayList<IClassDescriptor>>();
-
-        ArrayList<IClassDescriptor> list = new ArrayList<IClassDescriptor>();
-        list.addAll(mWidgetMap.values());
-        map.put(SdkConstants.CLASS_VIEW, list);
-
-        list = new ArrayList<IClassDescriptor>();
-        list.addAll(mLayoutMap.values());
-        map.put(SdkConstants.CLASS_VIEWGROUP, list);
-
-        list = new ArrayList<IClassDescriptor>();
-        list.addAll(mLayoutParamsMap.values());
-        map.put(SdkConstants.CLASS_VIEWGROUP_LAYOUTPARAMS, list);
-
-        return map;
-    }
-
-    /**
-     * Returns a {@link IAndroidClassLoader.IClassDescriptor} by its fully-qualified name.
-     * @param className the fully-qualified name of the class to return.
-     * @throws ClassNotFoundException
-     */
-    @Override
-    public IClassDescriptor getClass(String className) throws ClassNotFoundException {
-        return mMap.get(className);
-    }
-
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/sdk/layout-devices.xsd b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/sdk/layout-devices.xsd
deleted file mode 100755
index a4ea6c4..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/sdk/layout-devices.xsd
+++ /dev/null
@@ -1,345 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- * Copyright (C) 2009 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/android/layout-devices/1"
-    xmlns:xsd="http://www.w3.org/2001/XMLSchema"
-    xmlns:c="http://schemas.android.com/sdk/android/layout-devices/1"
-    elementFormDefault="qualified"
-    attributeFormDefault="unqualified"
-    version="1">
-
-    <!-- The root element layout-devices defines a sequence of 0..n device elements. -->
-
-    <xsd:element name="layout-devices" type="c:layoutDevicesType" />
-
-    <xsd:complexType name="layoutDevicesType">
-        <xsd:annotation>
-            <xsd:documentation xml:lang="en">
-                The "layout-devices" element is the root element of this schema.
-
-                It must contain zero or more "device" elements that each define the configurations
-                available for a given device.
-
-                These definitions are used in the Graphical Layout Editor in the
-                Android Development Tools (ADT) plugin for Eclipse.
-            </xsd:documentation>
-        </xsd:annotation>
-
-        <xsd:sequence>
-            <!-- layout-devices defines a sequence of 0..n device elements. -->
-            <xsd:element name="device" minOccurs="0" maxOccurs="unbounded">
-
-                <xsd:annotation>
-                    <xsd:documentation xml:lang="en">
-                        A device element must contain at most one "default" element
-                        followed by one or more "config" elements.
-
-                        The "default" element defines all the default parameters
-                        inherited by the following "config" elements.
-                        Each "config" element can override the default values, if any.
-
-                        A "device" element also has a required "name" attribute that
-                        represents the user-interface name of this device.
-                    </xsd:documentation>
-                </xsd:annotation>
-
-                <xsd:complexType>
-                    <!-- device defines a choice of 0..1 default element
-                    and 1..n config elements. -->
-
-                    <xsd:sequence>
-                        <xsd:element name="default" type="c:parametersType"
-                                     minOccurs="0"  maxOccurs="1" />
-                        <xsd:element name="config"  type="c:configType"
-                                     minOccurs="1"  maxOccurs="unbounded" />
-                    </xsd:sequence>
-
-                    <xsd:attribute name="name" type="xsd:normalizedString" use="required" />
-                </xsd:complexType>
-
-            </xsd:element>
-        </xsd:sequence>
-    </xsd:complexType>
-
-    <!-- The type of a device>default element.
-         This is overridden by configType below for the device>config element.
-    -->
-    <xsd:complexType name="parametersType">
-        <xsd:annotation>
-            <xsd:documentation xml:lang="en">
-                The parametersType define all the parameters that can happen either in a
-                "default" element or in a named "config" element.
-                Each parameter element can appear once at most.
-
-                Parameters here are the same as those used to specify alternate Android
-                resources, as documented by
-                http://d.android.com/guide/topics/resources/resources-i18n.html#AlternateResources
-            </xsd:documentation>
-        </xsd:annotation>
-
-        <xsd:all>
-            <!-- parametersType says that 0..1 of each of these elements must be declared. -->
-
-            <xsd:element name="country-code" minOccurs="0">
-                <xsd:annotation>
-                    <xsd:documentation xml:lang="en">
-                        Specifies the configuration is for a particular Mobile Country Code.
-                    </xsd:documentation>
-                </xsd:annotation>
-                <xsd:simpleType>
-                    <xsd:restriction base="xsd:float">
-                        <xsd:minInclusive value="100" />
-                        <xsd:maxInclusive value="999" />
-                    </xsd:restriction>
-                </xsd:simpleType>
-            </xsd:element>
-
-            <xsd:element name="network-code" minOccurs="0">
-                <xsd:annotation>
-                    <xsd:documentation xml:lang="en">
-                        Specifies the configuration is for a particular Mobile Network Code.
-                    </xsd:documentation>
-                </xsd:annotation>
-                <xsd:simpleType>
-                    <xsd:restriction base="xsd:float">
-                        <xsd:minExclusive value="0" />
-                        <xsd:maxExclusive value="1000" />
-                    </xsd:restriction>
-                </xsd:simpleType>
-            </xsd:element>
-
-            <xsd:element name="screen-size" minOccurs="0">
-                <xsd:annotation>
-                    <xsd:documentation xml:lang="en">
-                        Specifies that the configuration is for a particular class of screen.
-                    </xsd:documentation>
-                </xsd:annotation>
-                <xsd:simpleType>
-                    <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="screen-ratio" minOccurs="0">
-                <xsd:annotation>
-                    <xsd:documentation xml:lang="en">
-                        Specifies that the configuration is for a taller/wider than traditional
-                        screen. This is based purely on the aspect ration 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="long" />
-                        <xsd:enumeration value="notlong" />
-                    </xsd:restriction>
-                </xsd:simpleType>
-            </xsd:element>
-
-            <xsd:element name="screen-orientation" minOccurs="0">
-                <xsd:annotation>
-                    <xsd:documentation xml:lang="en">
-                        Specifies that the configuration is for a screen that is tall (port) or
-                        wide (land).
-                    </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="pixel-density" minOccurs="0">
-                <xsd:annotation>
-                    <xsd:documentation xml:lang="en">
-                        Specifies the screen density the configuration is defined for. 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 is mdpi and 16x16 in hdpi.
-                        The special nodpi density that can be used in resource qualifiers is not
-                        a valid keyword here.
-                    </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="touch-type" minOccurs="0">
-                <xsd:annotation>
-                    <xsd:documentation xml:lang="en">
-                        Specifies the touch type the configuration is defined 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="keyboard-state" minOccurs="0">
-                <xsd:annotation>
-                    <xsd:documentation xml:lang="en">
-                        If your configuration uses a soft keyboard, use the keyssoft value.
-                        If it doesn't and has a real keyboard, use keysexposed or keyshidden.
-                    </xsd:documentation>
-                </xsd:annotation>
-                <xsd:simpleType>
-                    <xsd:restriction base="xsd:token">
-                        <xsd:enumeration value="keysexposed" />
-                        <xsd:enumeration value="keyshidden" />
-                        <xsd:enumeration value="keyssoft" />
-                    </xsd:restriction>
-                </xsd:simpleType>
-            </xsd:element>
-
-            <xsd:element name="text-input-method" minOccurs="0">
-                <xsd:annotation>
-                    <xsd:documentation xml:lang="en">
-                        Specifies the primary text input method the configuration is designed for.
-                    </xsd:documentation>
-                </xsd:annotation>
-                <xsd:simpleType>
-                    <xsd:restriction base="xsd:token">
-                        <xsd:enumeration value="nokeys" />
-                        <xsd:enumeration value="qwerty" />
-                        <xsd:enumeration value="12key" />
-                    </xsd:restriction>
-                </xsd:simpleType>
-            </xsd:element>
-
-            <xsd:element name="nav-state" minOccurs="0">
-                <xsd:annotation>
-                    <xsd:documentation xml:lang="en">
-                        Specifies whether the primary non-touchscreen navigation control is
-                        exposed or hidden.
-                    </xsd:documentation>
-                </xsd:annotation>
-                <xsd:simpleType>
-                    <xsd:restriction base="xsd:token">
-                        <xsd:enumeration value="navexposed" />
-                        <xsd:enumeration value="navhidden" />
-                    </xsd:restriction>
-                </xsd:simpleType>
-            </xsd:element>
-
-            <xsd:element name="nav-method" minOccurs="0">
-                <xsd:annotation>
-                    <xsd:documentation xml:lang="en">
-                        Specifies the primary non-touchscreen navigation method the configuration
-                        is designed for.
-                    </xsd:documentation>
-                </xsd:annotation>
-                <xsd:simpleType>
-                    <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:element>
-
-            <xsd:element name="screen-dimension" minOccurs="0">
-                <xsd:annotation>
-                    <xsd:documentation xml:lang="en">
-                        Specifies the device screen resolution, in pixels.
-                    </xsd:documentation>
-                </xsd:annotation>
-                <xsd:complexType>
-                    <xsd:sequence minOccurs="2" maxOccurs="2">
-
-                        <xsd:element name="size">
-                            <xsd:simpleType>
-                                <xsd:restriction base="xsd:positiveInteger" />
-                            </xsd:simpleType>
-                        </xsd:element>
-
-                    </xsd:sequence>
-                </xsd:complexType>
-            </xsd:element>
-
-            <xsd:element name="xdpi" minOccurs="0">
-                <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:float">
-                        <xsd:minExclusive value="0" />
-                    </xsd:restriction>
-                </xsd:simpleType>
-            </xsd:element>
-
-            <xsd:element name="ydpi" minOccurs="0">
-                <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:float">
-                        <xsd:minExclusive value="0" />
-                    </xsd:restriction>
-                </xsd:simpleType>
-            </xsd:element>
-
-        </xsd:all>
-    </xsd:complexType>
-
-    <!-- The type definition of a device>config element.
-         This type is basically all the element defined by parametersType and an extra
-         required "name" attribute for the user-interface configuration name.
-    -->
-    <xsd:complexType name="configType">
-        <xsd:annotation>
-            <xsd:documentation>
-                The configType defines the content of a "config" element in a "device" element.
-
-                A "config" element can have all the parameters elements defined by
-                "parameterType". It also has a required "name" attribute that indicates the
-                user-interface name for this configuration.
-            </xsd:documentation>
-        </xsd:annotation>
-
-        <xsd:complexContent>
-            <xsd:extension base="c:parametersType">
-                <xsd:attribute name="name" type="xsd:normalizedString" use="required" />
-            </xsd:extension>
-        </xsd:complexContent>
-    </xsd:complexType>
-
-</xsd:schema>
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/sourcelookup/AdtSourceLookupDirector.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/sourcelookup/AdtSourceLookupDirector.java
deleted file mode 100755
index bcb9c48..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/sourcelookup/AdtSourceLookupDirector.java
+++ /dev/null
@@ -1,119 +0,0 @@
-/*
- * Copyright (C) 2010 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.sourcelookup;
-
-import com.android.ide.eclipse.adt.internal.sdk.ProjectState;
-import com.android.ide.eclipse.adt.internal.sdk.Sdk;
-import com.android.sdklib.IAndroidTarget;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.debug.core.ILaunchConfiguration;
-import org.eclipse.debug.core.sourcelookup.ISourceContainer;
-import org.eclipse.debug.core.sourcelookup.containers.DefaultSourceContainer;
-import org.eclipse.debug.core.sourcelookup.containers.DirectorySourceContainer;
-import org.eclipse.debug.core.sourcelookup.containers.ExternalArchiveSourceContainer;
-import org.eclipse.jdt.core.IClasspathEntry;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.JavaCore;
-import org.eclipse.jdt.internal.launching.JavaSourceLookupDirector;
-import org.eclipse.jdt.launching.IJavaLaunchConfigurationConstants;
-
-import java.io.File;
-
-public class AdtSourceLookupDirector extends JavaSourceLookupDirector {
-
-    @Override
-    public void initializeDefaults(ILaunchConfiguration configuration) throws CoreException {
-        dispose();
-        setLaunchConfiguration(configuration);
-        String projectName =
-            configuration.getAttribute(IJavaLaunchConfigurationConstants.ATTR_PROJECT_NAME,
-                ""); //$NON-NLS-1$
-        if (projectName != null && projectName.length() > 0) {
-            IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(projectName);
-            if (project != null && project.isOpen()) {
-                ProjectState state = Sdk.getProjectState(project);
-                if (state == null) {
-                    initDefaults();
-                    return;
-                }
-                IAndroidTarget target = state.getTarget();
-                if (target == null) {
-                    initDefaults();
-                    return;
-                }
-                String path = target.getPath(IAndroidTarget.ANDROID_JAR);
-                if (path == null) {
-                    initDefaults();
-                    return;
-                }
-                IJavaProject javaProject = JavaCore.create(project);
-                if (javaProject != null && javaProject.isOpen()) {
-                    IClasspathEntry[] entries = javaProject.getResolvedClasspath(true);
-                    IClasspathEntry androidEntry = null;
-                    for (int i = 0; i < entries.length; i++) {
-                        IClasspathEntry entry = entries[i];
-                        if (entry.getEntryKind() == IClasspathEntry.CPE_LIBRARY
-                                && path.equals(entry.getPath().toString())) {
-                            androidEntry = entry;
-                            break;
-                        }
-                    }
-                    if (androidEntry != null) {
-                        IPath sourceAttachmentPath = androidEntry.getSourceAttachmentPath();
-                        if (sourceAttachmentPath != null) {
-                            String androidSrc = sourceAttachmentPath.toString();
-                            if (androidSrc != null && androidSrc.trim().length() > 0) {
-                                File srcFile = new File(androidSrc);
-                                ISourceContainer adtContainer = null;
-                                if (srcFile.isFile()) {
-                                    adtContainer = new ExternalArchiveSourceContainer(androidSrc,
-                                            true);
-                                }
-                                if (srcFile.isDirectory()) {
-                                    adtContainer = new DirectorySourceContainer(srcFile, false);
-                                }
-                                if (adtContainer != null) {
-                                    ISourceContainer defaultContainer =
-                                        new DefaultSourceContainer();
-                                    setSourceContainers(new ISourceContainer[] {
-                                            adtContainer, defaultContainer
-                                    });
-                                    initializeParticipants();
-                                    return;
-                                }
-                            }
-                        }
-                    }
-                }
-            }
-        }
-        initDefaults();
-    }
-
-    private void initDefaults() {
-        setSourceContainers(new ISourceContainer[] {
-            new DefaultSourceContainer()
-        });
-        initializeParticipants();
-    }
-
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/ui/ConfigurationSelector.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/ui/ConfigurationSelector.java
deleted file mode 100644
index 44f9082..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/ui/ConfigurationSelector.java
+++ /dev/null
@@ -1,1989 +0,0 @@
-/*
- * 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.ui;
-
-import com.android.SdkConstants;
-import com.android.ide.common.resources.LocaleManager;
-import com.android.ide.common.resources.configuration.CountryCodeQualifier;
-import com.android.ide.common.resources.configuration.DensityQualifier;
-import com.android.ide.common.resources.configuration.FolderConfiguration;
-import com.android.ide.common.resources.configuration.KeyboardStateQualifier;
-import com.android.ide.common.resources.configuration.LayoutDirectionQualifier;
-import com.android.ide.common.resources.configuration.LocaleQualifier;
-import com.android.ide.common.resources.configuration.NavigationMethodQualifier;
-import com.android.ide.common.resources.configuration.NavigationStateQualifier;
-import com.android.ide.common.resources.configuration.NetworkCodeQualifier;
-import com.android.ide.common.resources.configuration.NightModeQualifier;
-import com.android.ide.common.resources.configuration.ResourceQualifier;
-import com.android.ide.common.resources.configuration.ScreenDimensionQualifier;
-import com.android.ide.common.resources.configuration.ScreenHeightQualifier;
-import com.android.ide.common.resources.configuration.ScreenOrientationQualifier;
-import com.android.ide.common.resources.configuration.ScreenRatioQualifier;
-import com.android.ide.common.resources.configuration.ScreenSizeQualifier;
-import com.android.ide.common.resources.configuration.ScreenWidthQualifier;
-import com.android.ide.common.resources.configuration.SmallestScreenWidthQualifier;
-import com.android.ide.common.resources.configuration.TextInputMethodQualifier;
-import com.android.ide.common.resources.configuration.TouchScreenQualifier;
-import com.android.ide.common.resources.configuration.UiModeQualifier;
-import com.android.ide.common.resources.configuration.VersionQualifier;
-import com.android.ide.eclipse.adt.internal.resources.ResourceHelper;
-import com.android.resources.Density;
-import com.android.resources.Keyboard;
-import com.android.resources.KeyboardState;
-import com.android.resources.LayoutDirection;
-import com.android.resources.Navigation;
-import com.android.resources.NavigationState;
-import com.android.resources.NightMode;
-import com.android.resources.ResourceEnum;
-import com.android.resources.ScreenOrientation;
-import com.android.resources.ScreenRatio;
-import com.android.resources.ScreenSize;
-import com.android.resources.TouchScreen;
-import com.android.resources.UiMode;
-
-import org.eclipse.jface.viewers.ILabelProviderListener;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.ITableLabelProvider;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.StackLayout;
-import org.eclipse.swt.events.ControlAdapter;
-import org.eclipse.swt.events.ControlEvent;
-import org.eclipse.swt.events.FocusAdapter;
-import org.eclipse.swt.events.FocusEvent;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
-import org.eclipse.swt.events.VerifyEvent;
-import org.eclipse.swt.events.VerifyListener;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.graphics.Rectangle;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Combo;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.swt.widgets.TableColumn;
-import org.eclipse.swt.widgets.Text;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Locale;
-
-/**
- * Custom UI widget to let user build a Folder configuration.
- * <p/>
- * To use this, instantiate somewhere in the UI and then:
- * <ul>
- * <li>Use {@link #setConfiguration(String)} or {@link #setConfiguration(FolderConfiguration)}.
- * <li>Retrieve the configuration using {@link #getConfiguration(FolderConfiguration)}.
- * </ul>
- */
-public class ConfigurationSelector extends Composite {
-
-    public static final int WIDTH_HINT = 600;
-    public static final int HEIGHT_HINT = 250;
-
-    private Runnable mOnChangeListener;
-
-    private TableViewer mFullTableViewer;
-    private TableViewer mSelectionTableViewer;
-    private Button mAddButton;
-    private Button mRemoveButton;
-    private StackLayout mStackLayout;
-
-    private boolean mOnRefresh = false;
-
-    private final FolderConfiguration mBaseConfiguration = new FolderConfiguration();
-    private final FolderConfiguration mSelectedConfiguration = new FolderConfiguration();
-
-    private final HashMap<Class<? extends ResourceQualifier>, QualifierEditBase> mUiMap =
-        new HashMap<Class<? extends ResourceQualifier>, QualifierEditBase>();
-    private final SelectorMode mMode;
-    private Composite mQualifierEditParent;
-    private IQualifierFilter mQualifierFilter;
-
-    /**
-     * Basic of {@link VerifyListener} to only accept digits.
-     */
-    private static class DigitVerifier implements VerifyListener {
-        @Override
-        public void verifyText(VerifyEvent e) {
-            // check for digit only.
-            for (int i = 0 ; i < e.text.length(); i++) {
-                char letter = e.text.charAt(i);
-                if (letter < '0' || letter > '9') {
-                    e.doit = false;
-                    return;
-                }
-            }
-        }
-    }
-
-    /**
-     * Implementation of {@link VerifyListener} for Country Code qualifiers.
-     */
-    public static class MobileCodeVerifier extends DigitVerifier {
-        @Override
-        public void verifyText(VerifyEvent e) {
-            super.verifyText(e);
-
-            // basic tests passed?
-            if (e.doit) {
-                // check the max 3 digits.
-                if (e.text.length() - e.end + e.start +
-                        ((Text)e.getSource()).getText().length() > 3) {
-                    e.doit = false;
-                }
-            }
-        }
-    }
-
-    /**
-     * Implementation of {@link VerifyListener} for the Language and Region qualifiers.
-     */
-    public static class LanguageRegionVerifier implements VerifyListener {
-        @Override
-        public void verifyText(VerifyEvent e) {
-            // check for length
-            if (e.text.length() - e.end + e.start + ((Combo)e.getSource()).getText().length() > 6) {
-                e.doit = false;
-                return;
-            }
-
-            // check for lower case only.
-            for (int i = 0 ; i < e.text.length(); i++) {
-                char letter = e.text.charAt(i);
-                if (letter == '-') {
-                    if (i+e.start != 2) {
-                        e.doit = false;
-                        return;
-                    } else {
-                        continue;
-                    }
-                }
-                if (i+e.start == 3 && letter != 'r') {
-                    e.doit = false;
-                    return;
-                }
-                if ((letter < 'a' || letter > 'z') && (letter < 'A' || letter > 'Z')) {
-                    e.doit = false;
-                    return;
-                }
-            }
-        }
-    }
-
-    /**
-     * Implementation of {@link VerifyListener} for the Density qualifier.
-     */
-    public static class DensityVerifier extends DigitVerifier { }
-
-    /**
-     * Implementation of {@link VerifyListener} for the Screen Dimension qualifier.
-     */
-    public static class DimensionVerifier extends DigitVerifier { }
-
-    /**
-     * Enum for the state of the configuration being created.
-     */
-    public enum ConfigurationState {
-        OK, INVALID_CONFIG, REGION_WITHOUT_LANGUAGE;
-    }
-
-    /**
-     * Behavior mode for the Selector.
-     *
-     * @see #DEFAULT
-     * @see #DEVICE_ONLY
-     * @see #CONFIG_ONLY
-     */
-    public enum SelectorMode {
-        /** the default mode */
-        DEFAULT,
-        /** mode forcing the qualifier values to be valid on a device.
-         * For instance {@link Density#NODPI} is a valid qualifier for a resource configuration but
-         * this is not valid on a device */
-        DEVICE_ONLY,
-        /** mode where only the specific config can be edited. The user can only select
-         * which non-empty qualifier to select. */
-        CONFIG_ONLY;
-    }
-
-    /**
-     * A filter for {@link ResourceQualifier}.
-     * @see ConfigurationSelector#setQualifierFilter(IQualifierFilter)
-     */
-    public interface IQualifierFilter {
-        /**
-         * Returns true of the qualifier is accepted.
-         */
-        boolean accept(ResourceQualifier qualifier);
-    }
-
-    /**
-     * Creates the selector.
-     * <p/>
-     * The {@link SelectorMode} changes the behavior of the selector depending on what is being
-     * edited (a device config, a resource config, a given configuration).
-     *
-     * @param parent the composite parent.
-     * @param mode the mode for the selector.
-     */
-    public ConfigurationSelector(Composite parent, SelectorMode mode) {
-        super(parent, SWT.NONE);
-
-        mMode  = mode;
-        mBaseConfiguration.createDefault();
-
-        GridLayout gl = new GridLayout(4, false);
-        gl.marginWidth = gl.marginHeight = 0;
-        setLayout(gl);
-
-        // first column is the first table
-        final Table fullTable = new Table(this, SWT.SINGLE | SWT.FULL_SELECTION | SWT.BORDER);
-        fullTable.setLayoutData(new GridData(GridData.FILL_BOTH));
-        fullTable.setHeaderVisible(true);
-        fullTable.setLinesVisible(true);
-
-        // create the column
-        final TableColumn fullTableColumn = new TableColumn(fullTable, SWT.LEFT);
-        // set the header
-        fullTableColumn.setText("Available Qualifiers");
-
-        fullTable.addControlListener(new ControlAdapter() {
-            @Override
-            public void controlResized(ControlEvent e) {
-                Rectangle r = fullTable.getClientArea();
-                fullTableColumn.setWidth(r.width);
-            }
-        });
-
-        mFullTableViewer = new TableViewer(fullTable);
-        mFullTableViewer.setContentProvider(new QualifierContentProvider());
-        // the label provider must return the value of the label only if the mode is
-        // CONFIG_ONLY
-        mFullTableViewer.setLabelProvider(new QualifierLabelProvider(
-                mMode == SelectorMode.CONFIG_ONLY));
-        mFullTableViewer.setInput(mBaseConfiguration);
-        mFullTableViewer.addSelectionChangedListener(new ISelectionChangedListener() {
-            @Override
-            public void selectionChanged(SelectionChangedEvent event) {
-                ISelection selection = event.getSelection();
-                if (selection instanceof IStructuredSelection) {
-                    IStructuredSelection structSelection = (IStructuredSelection)selection;
-                    Object first = structSelection.getFirstElement();
-
-                    if (first instanceof ResourceQualifier) {
-                        mAddButton.setEnabled(true);
-                        return;
-                    }
-                }
-
-                mAddButton.setEnabled(false);
-            }
-        });
-
-        // 2nd column is the left/right arrow button
-        Composite buttonComposite = new Composite(this, SWT.NONE);
-        gl = new GridLayout(1, false);
-        gl.marginWidth = gl.marginHeight = 0;
-        buttonComposite.setLayout(gl);
-        buttonComposite.setLayoutData(new GridData(GridData.FILL_VERTICAL));
-
-        new Composite(buttonComposite, SWT.NONE);
-        mAddButton = new Button(buttonComposite, SWT.BORDER | SWT.PUSH);
-        mAddButton.setText("->");
-        mAddButton.setEnabled(false);
-        mAddButton.addSelectionListener(new SelectionAdapter() {
-            @Override
-            public void widgetSelected(SelectionEvent e) {
-                IStructuredSelection selection =
-                    (IStructuredSelection)mFullTableViewer.getSelection();
-
-                Object first = selection.getFirstElement();
-                if (first instanceof ResourceQualifier) {
-                    ResourceQualifier qualifier = (ResourceQualifier)first;
-
-                    mBaseConfiguration.removeQualifier(qualifier);
-                    mSelectedConfiguration.addQualifier(qualifier);
-
-                    mFullTableViewer.refresh();
-                    mSelectionTableViewer.refresh();
-                    mSelectionTableViewer.setSelection(new StructuredSelection(qualifier), true);
-
-                    onChange(false /* keepSelection */);
-                }
-            }
-        });
-
-        mRemoveButton = new Button(buttonComposite, SWT.BORDER | SWT.PUSH);
-        mRemoveButton.setText("<-");
-        mRemoveButton.setEnabled(false);
-        mRemoveButton.addSelectionListener(new SelectionAdapter() {
-            @Override
-            public void widgetSelected(SelectionEvent e) {
-                IStructuredSelection selection =
-                    (IStructuredSelection)mSelectionTableViewer.getSelection();
-
-                Object first = selection.getFirstElement();
-                if (first instanceof ResourceQualifier) {
-                    ResourceQualifier qualifier = (ResourceQualifier)first;
-
-                    mSelectedConfiguration.removeQualifier(qualifier);
-                    mBaseConfiguration.addQualifier(qualifier);
-
-                    mFullTableViewer.refresh();
-                    mSelectionTableViewer.refresh();
-
-                    onChange(false /* keepSelection */);
-                }
-            }
-        });
-
-        // 3rd column is the selected config table
-        final Table selectionTable = new Table(this, SWT.SINGLE | SWT.FULL_SELECTION | SWT.BORDER);
-        selectionTable.setLayoutData(new GridData(GridData.FILL_BOTH));
-        selectionTable.setHeaderVisible(true);
-        selectionTable.setLinesVisible(true);
-
-        // create the column
-        final TableColumn selectionTableColumn = new TableColumn(selectionTable, SWT.LEFT);
-        // set the header
-        selectionTableColumn.setText("Chosen Qualifiers");
-
-        selectionTable.addControlListener(new ControlAdapter() {
-            @Override
-            public void controlResized(ControlEvent e) {
-                Rectangle r = selectionTable.getClientArea();
-                selectionTableColumn.setWidth(r.width);
-            }
-        });
-        mSelectionTableViewer = new TableViewer(selectionTable);
-        mSelectionTableViewer.setContentProvider(new QualifierContentProvider());
-        // always show the qualifier value in this case.
-        mSelectionTableViewer.setLabelProvider(new QualifierLabelProvider(
-                true /* showQualifierValue */));
-        mSelectionTableViewer.setInput(mSelectedConfiguration);
-        mSelectionTableViewer.addSelectionChangedListener(new ISelectionChangedListener() {
-            @Override
-            public void selectionChanged(SelectionChangedEvent event) {
-                // ignore selection changes during resfreshes in some cases.
-                if (mOnRefresh) {
-                    return;
-                }
-
-                ISelection selection = event.getSelection();
-                if (selection instanceof IStructuredSelection) {
-                    IStructuredSelection structSelection = (IStructuredSelection)selection;
-
-                    if (structSelection.isEmpty() == false) {
-                        Object first = structSelection.getFirstElement();
-
-                        if (first instanceof ResourceQualifier) {
-                            mRemoveButton.setEnabled(true);
-
-                            if (mMode != SelectorMode.CONFIG_ONLY) {
-                                QualifierEditBase composite = mUiMap.get(first.getClass());
-
-                                if (composite != null) {
-                                    composite.setQualifier((ResourceQualifier)first);
-                                }
-
-                                mStackLayout.topControl = composite;
-                                mQualifierEditParent.layout();
-                            }
-
-                            return;
-                        }
-                    } else {
-                        if (mMode != SelectorMode.CONFIG_ONLY) {
-                            mStackLayout.topControl = null;
-                            mQualifierEditParent.layout();
-                        }
-                    }
-                }
-
-                mRemoveButton.setEnabled(false);
-            }
-        });
-
-        if (mMode != SelectorMode.CONFIG_ONLY) {
-            // 4th column is the detail of the selected qualifier
-            mQualifierEditParent = new Composite(this, SWT.NONE);
-            mQualifierEditParent.setLayout(mStackLayout = new StackLayout());
-            mQualifierEditParent.setLayoutData(new GridData(GridData.FILL_VERTICAL));
-
-            // create the UI for all the qualifiers, and associate them to the
-            // ResourceQualifer class.
-            mUiMap.put(CountryCodeQualifier.class, new MCCEdit(mQualifierEditParent));
-            mUiMap.put(NetworkCodeQualifier.class, new MNCEdit(mQualifierEditParent));
-            mUiMap.put(LocaleQualifier.class, new LocaleEdit(mQualifierEditParent));
-            mUiMap.put(LayoutDirectionQualifier.class,
-                    new LayoutDirectionEdit(mQualifierEditParent));
-            mUiMap.put(SmallestScreenWidthQualifier.class,
-                    new SmallestScreenWidthEdit(mQualifierEditParent));
-            mUiMap.put(ScreenWidthQualifier.class, new ScreenWidthEdit(mQualifierEditParent));
-            mUiMap.put(ScreenHeightQualifier.class, new ScreenHeightEdit(mQualifierEditParent));
-            mUiMap.put(ScreenSizeQualifier.class, new ScreenSizeEdit(mQualifierEditParent));
-            mUiMap.put(ScreenRatioQualifier.class, new ScreenRatioEdit(mQualifierEditParent));
-            mUiMap.put(ScreenOrientationQualifier.class, new OrientationEdit(mQualifierEditParent));
-            mUiMap.put(UiModeQualifier.class, new UiModeEdit(mQualifierEditParent));
-            mUiMap.put(NightModeQualifier.class, new NightModeEdit(mQualifierEditParent));
-            mUiMap.put(DensityQualifier.class, new DensityEdit(mQualifierEditParent));
-            mUiMap.put(TouchScreenQualifier.class, new TouchEdit(mQualifierEditParent));
-            mUiMap.put(KeyboardStateQualifier.class, new KeyboardEdit(mQualifierEditParent));
-            mUiMap.put(TextInputMethodQualifier.class, new TextInputEdit(mQualifierEditParent));
-            mUiMap.put(NavigationStateQualifier.class,
-                    new NavigationStateEdit(mQualifierEditParent));
-            mUiMap.put(NavigationMethodQualifier.class, new NavigationEdit(mQualifierEditParent));
-            mUiMap.put(ScreenDimensionQualifier.class,
-                    new ScreenDimensionEdit(mQualifierEditParent));
-            mUiMap.put(VersionQualifier.class, new VersionEdit(mQualifierEditParent));
-        }
-    }
-
-    /**
-     * Sets a {@link IQualifierFilter}. If non null, this will restrict the qualifiers that
-     * can be chosen.
-     * @param filter the filter to set.
-     */
-    public void setQualifierFilter(IQualifierFilter filter) {
-        mQualifierFilter = filter;
-    }
-
-    /**
-     * Sets a listener to be notified when the configuration changes.
-     * @param listener A {@link Runnable} whose <code>run()</code> method is called when the
-     * configuration is changed. The method is called from the UI thread.
-     */
-    public void setOnChangeListener(Runnable listener) {
-        mOnChangeListener = listener;
-    }
-
-    /**
-     * Initialize the UI with a given {@link FolderConfiguration}. This must
-     * be called from the UI thread.
-     * @param config The configuration.
-     */
-    public void setConfiguration(FolderConfiguration config) {
-
-        if (mMode != SelectorMode.CONFIG_ONLY) {
-            mSelectedConfiguration.set(config, true /*nonFakeValuesOnly*/);
-
-            // create the base config, which is the default config minus the qualifiers
-            // in SelectedConfiguration
-            mBaseConfiguration.substract(mSelectedConfiguration);
-        } else {
-            // set the base config to the edited config.
-            // reset the config to be empty
-            mBaseConfiguration.reset();
-            mBaseConfiguration.set(config, true /*nonFakeValuesOnly*/);
-        }
-
-        mSelectionTableViewer.refresh();
-        mFullTableViewer.refresh();
-    }
-
-    /**
-     * Initialize the UI with the configuration represented by a resource folder name.
-     * This must be called from the UI thread.
-     *
-     * @param folderSegments the segments of the folder name,
-     *                       split using {@link FolderConfiguration#QUALIFIER_SEP}.
-     * @return true if success, or false if the folder name is not a valid name.
-     */
-    public boolean setConfiguration(String[] folderSegments) {
-        FolderConfiguration config = FolderConfiguration.getConfig(folderSegments);
-
-        if (config == null) {
-            return false;
-        }
-
-        setConfiguration(config);
-
-        return true;
-    }
-
-    /**
-     * Initialize the UI with the configuration represented by a resource folder name.
-     * This must be called from the UI thread.
-     * @param folderName the name of the folder.
-     * @return true if success, or false if the folder name is not a valid name.
-     */
-    public boolean setConfiguration(String folderName) {
-        // split the name of the folder in segments.
-        String[] folderSegments = folderName.split(SdkConstants.RES_QUALIFIER_SEP);
-
-        return setConfiguration(folderSegments);
-    }
-
-    /**
-     * Gets the configuration as setup by the widget.
-     * @param config the {@link FolderConfiguration} object to be filled with the information
-     * from the UI.
-     */
-    public void getConfiguration(FolderConfiguration config) {
-        config.set(mSelectedConfiguration);
-    }
-
-    /**
-     * Returns the state of the configuration being edited/created.
-     */
-    public ConfigurationState getState() {
-        if (mSelectedConfiguration.getInvalidQualifier() != null) {
-            return ConfigurationState.INVALID_CONFIG;
-        }
-
-        return ConfigurationState.OK;
-    }
-
-    /**
-     * Returns the first invalid qualifier of the configuration being edited/created,
-     * or <code>null<code> if they are all valid (or if none exists).
-     * <p/>If {@link #getState()} return {@link ConfigurationState#INVALID_CONFIG} then this will
-     * not return <code>null</code>.
-     */
-    public ResourceQualifier getInvalidQualifier() {
-        return mSelectedConfiguration.getInvalidQualifier();
-    }
-
-    /**
-     * Handle changes in the configuration.
-     * @param keepSelection if <code>true</code> attemps to avoid triggering selection change in
-     * {@link #mSelectedConfiguration}.
-     */
-    private void onChange(boolean keepSelection) {
-        ISelection selection = null;
-        if (keepSelection) {
-            mOnRefresh = true;
-            selection = mSelectionTableViewer.getSelection();
-        }
-
-        mSelectionTableViewer.refresh(true);
-
-        if (keepSelection) {
-            mSelectionTableViewer.setSelection(selection);
-            mOnRefresh = false;
-        }
-
-        if (mOnChangeListener != null) {
-            mOnChangeListener.run();
-        }
-    }
-
-    private void fillCombo(Combo combo, ResourceEnum[] resEnums) {
-        for (ResourceEnum resEnum : resEnums) {
-            // only add the enum if:
-            // not in device mode OR (device mode is true and) it's a valid device value.
-            // Also, always ignore fake values.
-            if ((mMode == SelectorMode.DEFAULT || resEnum.isValidValueForDevice()) &&
-                    resEnum.isFakeValue() == false) {
-                combo.add(resEnum.getShortDisplayValue());
-            }
-        }
-    }
-
-    /**
-     * Content provider around a {@link FolderConfiguration}.
-     */
-    private class QualifierContentProvider implements IStructuredContentProvider {
-
-        private FolderConfiguration mInput;
-
-        public QualifierContentProvider() {
-        }
-
-        @Override
-        public void dispose() {
-            // pass
-        }
-
-        @Override
-        public Object[] getElements(Object inputElement) {
-            // default easy case
-            if (mQualifierFilter == null) {
-                return mInput.getQualifiers();
-            }
-
-            // in this case we have to compute the list
-            ArrayList<ResourceQualifier> list = new ArrayList<ResourceQualifier>();
-            for (ResourceQualifier qual : mInput.getQualifiers()) {
-                if (mQualifierFilter.accept(qual)) {
-                    list.add(qual);
-                }
-            }
-
-            return list.toArray();
-        }
-
-        @Override
-        public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-            mInput = null;
-            if (newInput instanceof FolderConfiguration) {
-                mInput = (FolderConfiguration)newInput;
-            }
-        }
-    }
-
-    /**
-     * Label provider for {@link ResourceQualifier} objects.
-     */
-    private static class QualifierLabelProvider implements ITableLabelProvider {
-
-        private final boolean mShowQualifierValue;
-
-        public QualifierLabelProvider(boolean showQualifierValue) {
-            mShowQualifierValue = showQualifierValue;
-        }
-
-        @Override
-        public String getColumnText(Object element, int columnIndex) {
-            // only one column, so we can ignore columnIndex
-            if (element instanceof ResourceQualifier) {
-                if (mShowQualifierValue) {
-                    String value = ((ResourceQualifier)element).getShortDisplayValue();
-                    if (value == null || value.length() == 0) {
-                        return String.format("%1$s (?)",
-                                ((ResourceQualifier)element).getShortName());
-                    } else {
-                        return value;
-                    }
-
-                } else {
-                    return ((ResourceQualifier)element).getShortName();
-                }
-            }
-
-            return null;
-        }
-
-        @Override
-        public Image getColumnImage(Object element, int columnIndex) {
-            // only one column, so we can ignore columnIndex
-            if (element instanceof ResourceQualifier) {
-                return ResourceHelper.getIcon(((ResourceQualifier)element).getClass());
-            }
-
-            return null;
-        }
-
-        @Override
-        public void addListener(ILabelProviderListener listener) {
-            // pass
-        }
-
-        @Override
-        public void dispose() {
-            // pass
-        }
-
-        @Override
-        public boolean isLabelProperty(Object element, String property) {
-            // pass
-            return false;
-        }
-
-        @Override
-        public void removeListener(ILabelProviderListener listener) {
-            // pass
-        }
-    }
-
-    /**
-     * Base class for Edit widget for {@link ResourceQualifier}.
-     */
-    private abstract static class QualifierEditBase extends Composite {
-
-        public QualifierEditBase(Composite parent, String title) {
-            super(parent, SWT.NONE);
-            setLayout(new GridLayout(1, false));
-
-            new Label(this, SWT.NONE).setText(title);
-        }
-
-        public abstract void setQualifier(ResourceQualifier qualifier);
-    }
-
-    /**
-     * Edit widget for {@link CountryCodeQualifier}.
-     */
-    private class MCCEdit extends QualifierEditBase {
-
-        private final Text mText;
-
-        public MCCEdit(Composite parent) {
-            super(parent, CountryCodeQualifier.NAME);
-
-            mText = new Text(this, SWT.BORDER);
-            mText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-            mText.addVerifyListener(new MobileCodeVerifier());
-            mText.addModifyListener(new ModifyListener() {
-                @Override
-                public void modifyText(ModifyEvent e) {
-                    onTextChange();
-                }
-            });
-
-            mText.addFocusListener(new FocusAdapter() {
-                @Override
-                public void focusLost(FocusEvent e) {
-                    onTextChange();
-                }
-            });
-
-            new Label(this, SWT.NONE).setText("(3 digit code)");
-        }
-
-        private void onTextChange() {
-            String value = mText.getText();
-
-            if (value.length() == 0) {
-                // empty string, means a qualifier with no value.
-                // Since the qualifier classes are immutable, and we don't want to
-                // remove the qualifier from the configuration, we create a new default one.
-                mSelectedConfiguration.setCountryCodeQualifier(new CountryCodeQualifier());
-            } else {
-                try {
-                    CountryCodeQualifier qualifier = CountryCodeQualifier.getQualifier(
-                            CountryCodeQualifier.getFolderSegment(Integer.parseInt(value)));
-                    if (qualifier != null) {
-                        mSelectedConfiguration.setCountryCodeQualifier(qualifier);
-                    } else {
-                        // Failure! Looks like the value is wrong
-                        // (for instance not exactly 3 digits).
-                        mSelectedConfiguration.setCountryCodeQualifier(new CountryCodeQualifier());
-                    }
-                } catch (NumberFormatException nfe) {
-                    // Looks like the code is not a number. This should not happen since the text
-                    // field has a VerifyListener that prevents it.
-                    mSelectedConfiguration.setCountryCodeQualifier(new CountryCodeQualifier());
-                }
-            }
-
-            // notify of change
-            onChange(true /* keepSelection */);
-        }
-
-        @Override
-        public void setQualifier(ResourceQualifier qualifier) {
-            CountryCodeQualifier q = (CountryCodeQualifier)qualifier;
-
-            mText.setText(Integer.toString(q.getCode()));
-        }
-    }
-
-    /**
-     * Edit widget for {@link NetworkCodeQualifier}.
-     */
-    private class MNCEdit extends QualifierEditBase {
-        private final Text mText;
-
-        public MNCEdit(Composite parent) {
-            super(parent, NetworkCodeQualifier.NAME);
-
-            mText = new Text(this, SWT.BORDER);
-            mText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-            mText.addVerifyListener(new MobileCodeVerifier());
-            mText.addModifyListener(new ModifyListener() {
-                @Override
-                public void modifyText(ModifyEvent e) {
-                    onTextChange();
-                }
-            });
-            mText.addFocusListener(new FocusAdapter() {
-                @Override
-                public void focusLost(FocusEvent e) {
-                    onTextChange();
-                }
-            });
-
-            new Label(this, SWT.NONE).setText("(1-3 digit code)");
-        }
-
-        private void onTextChange() {
-            String value = mText.getText();
-
-            if (value.length() == 0) {
-                // empty string, means a qualifier with no value.
-                // Since the qualifier classes are immutable, and we don't want to
-                // remove the qualifier from the configuration, we create a new default one.
-                mSelectedConfiguration.setNetworkCodeQualifier(new NetworkCodeQualifier());
-            } else {
-                try {
-                    NetworkCodeQualifier qualifier = NetworkCodeQualifier.getQualifier(
-                            NetworkCodeQualifier.getFolderSegment(Integer.parseInt(value)));
-                    if (qualifier != null) {
-                        mSelectedConfiguration.setNetworkCodeQualifier(qualifier);
-                    } else {
-                        // Failure! Looks like the value is wrong
-                        // (for instance not exactly 3 digits).
-                        mSelectedConfiguration.setNetworkCodeQualifier(new NetworkCodeQualifier());
-                    }
-                } catch (NumberFormatException nfe) {
-                    // Looks like the code is not a number. This should not happen since the text
-                    // field has a VerifyListener that prevents it.
-                    mSelectedConfiguration.setNetworkCodeQualifier(new NetworkCodeQualifier());
-                }
-            }
-
-            // notify of change
-            onChange(true /* keepSelection */);
-        }
-
-        @Override
-        public void setQualifier(ResourceQualifier qualifier) {
-            NetworkCodeQualifier q = (NetworkCodeQualifier)qualifier;
-
-            mText.setText(Integer.toString(q.getCode()));
-        }
-    }
-
-    /**
-     * Edit widget for {@link LanguageQualifier}.
-     */
-    private class LocaleEdit extends QualifierEditBase {
-        private final Combo mLanguage;
-        private final Label mName;
-
-        public LocaleEdit(Composite parent) {
-            super(parent, LocaleQualifier.NAME);
-
-            mLanguage = new Combo(this, SWT.DROP_DOWN);
-            List<String> codes = LocaleManager.getLanguageCodes();
-            String[] items = codes.toArray(new String[codes.size()]);
-            Arrays.sort(items);
-            mLanguage.setItems(items);
-
-            mLanguage.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-            mLanguage.addVerifyListener(new LanguageRegionVerifier());
-            mLanguage.addSelectionListener(new SelectionListener() {
-                @Override
-                public void widgetDefaultSelected(SelectionEvent e) {
-                    onLanguageChange();
-                }
-                @Override
-                public void widgetSelected(SelectionEvent e) {
-                    onLanguageChange();
-                }
-            });
-            mLanguage.addModifyListener(new ModifyListener() {
-                @Override
-                public void modifyText(ModifyEvent e) {
-                    onLanguageChange();
-                }
-            });
-
-            new Label(this, SWT.NONE).setText("(2 letter code or language-rRegion)");
-
-            mName = new Label(this, SWT.NONE);
-            mName.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-
-        }
-
-        private void onLanguageChange() {
-            // update the current config
-            String value = mLanguage.getText();
-
-            String newName = "";
-            if (value.length() == 2) {
-                String name = LocaleManager.getLanguageName(value.toLowerCase(Locale.US));
-                if (name != null) {
-                    newName = name;
-                }
-            }
-            mName.setText(newName);
-
-            if (value.length() == 0) {
-                // empty string, means no qualifier.
-                // Since the qualifier classes are immutable, and we don't want to
-                // remove the qualifier from the configuration, we create a new default one.
-                mSelectedConfiguration.setLocaleQualifier(new LocaleQualifier());
-            } else {
-                LocaleQualifier qualifier = LocaleQualifier.getQualifier(value);
-                if (qualifier != null) {
-                    mSelectedConfiguration.setLocaleQualifier(qualifier);
-                } else {
-                    // Failure! Looks like the value is wrong (for instance a one letter string).
-                    mSelectedConfiguration.setLocaleQualifier(new LocaleQualifier());
-                }
-            }
-
-            // notify of change
-            onChange(true /* keepSelection */);
-        }
-
-        @Override
-        public void setQualifier(ResourceQualifier qualifier) {
-            LocaleQualifier q = (LocaleQualifier)qualifier;
-
-            String value = q.getValue();
-            if (value != null) {
-                mLanguage.setText(value);
-            }
-        }
-    }
-
-    /**
-     * Edit widget for {@link LayoutDirectionQualifier}.
-     */
-    private class LayoutDirectionEdit extends QualifierEditBase {
-
-        private final Combo mDirection;
-
-        public LayoutDirectionEdit(Composite parent) {
-            super(parent, LayoutDirectionQualifier.NAME);
-
-            mDirection = new Combo(this, SWT.DROP_DOWN | SWT.READ_ONLY);
-            fillCombo(mDirection, LayoutDirection.values());
-
-            mDirection.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-            mDirection.addSelectionListener(new SelectionListener() {
-                @Override
-                public void widgetDefaultSelected(SelectionEvent e) {
-                    onDirectionChange();
-                }
-                @Override
-                public void widgetSelected(SelectionEvent e) {
-                    onDirectionChange();
-                }
-            });
-        }
-
-        protected void onDirectionChange() {
-            // update the current config
-            int index = mDirection.getSelectionIndex();
-
-            if (index != -1) {
-                mSelectedConfiguration.setLayoutDirectionQualifier(new LayoutDirectionQualifier(
-                        LayoutDirection.getByIndex(index)));
-            } else {
-                // empty selection, means no qualifier.
-                // Since the qualifier classes are immutable, and we don't want to
-                // remove the qualifier from the configuration, we create a new default one.
-                mSelectedConfiguration.setLayoutDirectionQualifier(
-                        new LayoutDirectionQualifier());
-            }
-
-            // notify of change
-            onChange(true /* keepSelection */);
-        }
-
-        @Override
-        public void setQualifier(ResourceQualifier qualifier) {
-            LayoutDirectionQualifier q = (LayoutDirectionQualifier)qualifier;
-
-            LayoutDirection value = q.getValue();
-            if (value == null) {
-                mDirection.clearSelection();
-            } else {
-                mDirection.select(LayoutDirection.getIndex(value));
-            }
-        }
-    }
-
-
-    /**
-     * Edit widget for {@link SmallestScreenWidthQualifier}.
-     */
-    private class SmallestScreenWidthEdit extends QualifierEditBase {
-
-        private final Text mSize;
-
-        public SmallestScreenWidthEdit(Composite parent) {
-            super(parent, SmallestScreenWidthQualifier.NAME);
-
-            ModifyListener modifyListener = new ModifyListener() {
-                @Override
-                public void modifyText(ModifyEvent e) {
-                    onSizeChange();
-                }
-            };
-
-            FocusAdapter focusListener = new FocusAdapter() {
-                @Override
-                public void focusLost(FocusEvent e) {
-                    onSizeChange();
-                }
-            };
-
-            mSize = new Text(this, SWT.BORDER);
-            mSize.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-            mSize.addVerifyListener(new DimensionVerifier());
-            mSize.addModifyListener(modifyListener);
-            mSize.addFocusListener(focusListener);
-        }
-
-        private void onSizeChange() {
-            // update the current config
-            String size = mSize.getText();
-
-            if (size.length() == 0) {
-                // if one of the strings is empty, reset to no qualifier.
-                // Since the qualifier classes are immutable, and we don't want to
-                // remove the qualifier from the configuration, we create a new default one.
-                mSelectedConfiguration.setSmallestScreenWidthQualifier(
-                        new SmallestScreenWidthQualifier());
-            } else {
-                SmallestScreenWidthQualifier qualifier = SmallestScreenWidthQualifier.getQualifier(
-                        size);
-
-                if (qualifier != null) {
-                    mSelectedConfiguration.setSmallestScreenWidthQualifier(qualifier);
-                } else {
-                    // Failure! Looks like the value is wrong, reset the qualifier
-                    // Since the qualifier classes are immutable, and we don't want to
-                    // remove the qualifier from the configuration, we create a new default one.
-                    mSelectedConfiguration.setSmallestScreenWidthQualifier(
-                            new SmallestScreenWidthQualifier());
-                }
-            }
-
-            // notify of change
-            onChange(true /* keepSelection */);
-        }
-
-        @Override
-        public void setQualifier(ResourceQualifier qualifier) {
-            SmallestScreenWidthQualifier q = (SmallestScreenWidthQualifier)qualifier;
-
-            mSize.setText(Integer.toString(q.getValue()));
-        }
-    }
-
-    /**
-     * Edit widget for {@link ScreenWidthQualifier}.
-     */
-    private class ScreenWidthEdit extends QualifierEditBase {
-
-        private final Text mSize;
-
-        public ScreenWidthEdit(Composite parent) {
-            super(parent, ScreenWidthQualifier.NAME);
-
-            ModifyListener modifyListener = new ModifyListener() {
-                @Override
-                public void modifyText(ModifyEvent e) {
-                    onSizeChange();
-                }
-            };
-
-            FocusAdapter focusListener = new FocusAdapter() {
-                @Override
-                public void focusLost(FocusEvent e) {
-                    onSizeChange();
-                }
-            };
-
-            mSize = new Text(this, SWT.BORDER);
-            mSize.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-            mSize.addVerifyListener(new DimensionVerifier());
-            mSize.addModifyListener(modifyListener);
-            mSize.addFocusListener(focusListener);
-        }
-
-        private void onSizeChange() {
-            // update the current config
-            String size = mSize.getText();
-
-            if (size.length() == 0) {
-                // if one of the strings is empty, reset to no qualifier.
-                // Since the qualifier classes are immutable, and we don't want to
-                // remove the qualifier from the configuration, we create a new default one.
-                mSelectedConfiguration.setScreenWidthQualifier(new ScreenWidthQualifier());
-            } else {
-                ScreenWidthQualifier qualifier = ScreenWidthQualifier.getQualifier(size);
-
-                if (qualifier != null) {
-                    mSelectedConfiguration.setScreenWidthQualifier(qualifier);
-                } else {
-                    // Failure! Looks like the value is wrong, reset the qualifier
-                    // Since the qualifier classes are immutable, and we don't want to
-                    // remove the qualifier from the configuration, we create a new default one.
-                    mSelectedConfiguration.setScreenWidthQualifier(
-                            new ScreenWidthQualifier());
-                }
-            }
-
-            // notify of change
-            onChange(true /* keepSelection */);
-        }
-
-        @Override
-        public void setQualifier(ResourceQualifier qualifier) {
-            ScreenWidthQualifier q = (ScreenWidthQualifier)qualifier;
-
-            mSize.setText(Integer.toString(q.getValue()));
-        }
-    }
-
-    /**
-     * Edit widget for {@link ScreenHeightQualifier}.
-     */
-    private class ScreenHeightEdit extends QualifierEditBase {
-
-        private final Text mSize;
-
-        public ScreenHeightEdit(Composite parent) {
-            super(parent, ScreenHeightQualifier.NAME);
-
-            ModifyListener modifyListener = new ModifyListener() {
-                @Override
-                public void modifyText(ModifyEvent e) {
-                    onSizeChange();
-                }
-            };
-
-            FocusAdapter focusListener = new FocusAdapter() {
-                @Override
-                public void focusLost(FocusEvent e) {
-                    onSizeChange();
-                }
-            };
-
-            mSize = new Text(this, SWT.BORDER);
-            mSize.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-            mSize.addVerifyListener(new DimensionVerifier());
-            mSize.addModifyListener(modifyListener);
-            mSize.addFocusListener(focusListener);
-        }
-
-        private void onSizeChange() {
-            // update the current config
-            String size = mSize.getText();
-
-            if (size.length() == 0) {
-                // if one of the strings is empty, reset to no qualifier.
-                // Since the qualifier classes are immutable, and we don't want to
-                // remove the qualifier from the configuration, we create a new default one.
-                mSelectedConfiguration.setScreenHeightQualifier(new ScreenHeightQualifier());
-            } else {
-                ScreenHeightQualifier qualifier = ScreenHeightQualifier.getQualifier(size);
-
-                if (qualifier != null) {
-                    mSelectedConfiguration.setScreenHeightQualifier(qualifier);
-                } else {
-                    // Failure! Looks like the value is wrong, reset the qualifier
-                    // Since the qualifier classes are immutable, and we don't want to
-                    // remove the qualifier from the configuration, we create a new default one.
-                    mSelectedConfiguration.setScreenHeightQualifier(
-                            new ScreenHeightQualifier());
-                }
-            }
-
-            // notify of change
-            onChange(true /* keepSelection */);
-        }
-
-        @Override
-        public void setQualifier(ResourceQualifier qualifier) {
-            ScreenHeightQualifier q = (ScreenHeightQualifier)qualifier;
-
-            mSize.setText(Integer.toString(q.getValue()));
-        }
-    }
-
-
-    /**
-     * Edit widget for {@link ScreenSizeQualifier}.
-     */
-    private class ScreenSizeEdit extends QualifierEditBase {
-
-        private final Combo mSize;
-
-        public ScreenSizeEdit(Composite parent) {
-            super(parent, ScreenSizeQualifier.NAME);
-
-            mSize = new Combo(this, SWT.DROP_DOWN | SWT.READ_ONLY);
-            fillCombo(mSize, ScreenSize.values());
-
-            mSize.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-            mSize.addSelectionListener(new SelectionListener() {
-                @Override
-                public void widgetDefaultSelected(SelectionEvent e) {
-                    onScreenSizeChange();
-                }
-                @Override
-                public void widgetSelected(SelectionEvent e) {
-                    onScreenSizeChange();
-                }
-            });
-        }
-
-        protected void onScreenSizeChange() {
-            // update the current config
-            int index = mSize.getSelectionIndex();
-
-            if (index != -1) {
-                mSelectedConfiguration.setScreenSizeQualifier(new ScreenSizeQualifier(
-                        ScreenSize.getByIndex(index)));
-            } else {
-                // empty selection, means no qualifier.
-                // Since the qualifier classes are immutable, and we don't want to
-                // remove the qualifier from the configuration, we create a new default one.
-                mSelectedConfiguration.setScreenSizeQualifier(
-                        new ScreenSizeQualifier());
-            }
-
-            // notify of change
-            onChange(true /* keepSelection */);
-        }
-
-        @Override
-        public void setQualifier(ResourceQualifier qualifier) {
-            ScreenSizeQualifier q = (ScreenSizeQualifier)qualifier;
-
-            ScreenSize value = q.getValue();
-            if (value == null) {
-                mSize.clearSelection();
-            } else {
-                mSize.select(ScreenSize.getIndex(value));
-            }
-        }
-    }
-
-    /**
-     * Edit widget for {@link ScreenRatioQualifier}.
-     */
-    private class ScreenRatioEdit extends QualifierEditBase {
-
-        private final Combo mRatio;
-
-        public ScreenRatioEdit(Composite parent) {
-            super(parent, ScreenRatioQualifier.NAME);
-
-            mRatio = new Combo(this, SWT.DROP_DOWN | SWT.READ_ONLY);
-            fillCombo(mRatio, ScreenRatio.values());
-
-            mRatio.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-            mRatio.addSelectionListener(new SelectionListener() {
-                @Override
-                public void widgetDefaultSelected(SelectionEvent e) {
-                    onScreenRatioChange();
-                }
-                @Override
-                public void widgetSelected(SelectionEvent e) {
-                    onScreenRatioChange();
-                }
-            });
-        }
-
-        protected void onScreenRatioChange() {
-            // update the current config
-            int index = mRatio.getSelectionIndex();
-
-            if (index != -1) {
-                mSelectedConfiguration.setScreenRatioQualifier(new ScreenRatioQualifier(
-                        ScreenRatio.getByIndex(index)));
-            } else {
-                // empty selection, means no qualifier.
-                // Since the qualifier classes are immutable, and we don't want to
-                // remove the qualifier from the configuration, we create a new default one.
-                mSelectedConfiguration.setScreenRatioQualifier(
-                        new ScreenRatioQualifier());
-            }
-
-            // notify of change
-            onChange(true /* keepSelection */);
-        }
-
-        @Override
-        public void setQualifier(ResourceQualifier qualifier) {
-            ScreenRatioQualifier q = (ScreenRatioQualifier)qualifier;
-
-            ScreenRatio value = q.getValue();
-            if (value == null) {
-                mRatio.clearSelection();
-            } else {
-                mRatio.select(ScreenRatio.getIndex(value));
-            }
-        }
-    }
-
-    /**
-     * Edit widget for {@link ScreenOrientationQualifier}.
-     */
-    private class OrientationEdit extends QualifierEditBase {
-
-        private final Combo mOrientation;
-
-        public OrientationEdit(Composite parent) {
-            super(parent, ScreenOrientationQualifier.NAME);
-
-            mOrientation = new Combo(this, SWT.DROP_DOWN | SWT.READ_ONLY);
-            fillCombo(mOrientation, ScreenOrientation.values());
-
-            mOrientation.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-            mOrientation.addSelectionListener(new SelectionListener() {
-                @Override
-                public void widgetDefaultSelected(SelectionEvent e) {
-                    onOrientationChange();
-                }
-                @Override
-                public void widgetSelected(SelectionEvent e) {
-                    onOrientationChange();
-                }
-            });
-        }
-
-        protected void onOrientationChange() {
-            // update the current config
-            int index = mOrientation.getSelectionIndex();
-
-            if (index != -1) {
-                mSelectedConfiguration.setScreenOrientationQualifier(new ScreenOrientationQualifier(
-                    ScreenOrientation.getByIndex(index)));
-            } else {
-                // empty selection, means no qualifier.
-                // Since the qualifier classes are immutable, and we don't want to
-                // remove the qualifier from the configuration, we create a new default one.
-                mSelectedConfiguration.setScreenOrientationQualifier(
-                        new ScreenOrientationQualifier());
-            }
-
-            // notify of change
-            onChange(true /* keepSelection */);
-        }
-
-        @Override
-        public void setQualifier(ResourceQualifier qualifier) {
-            ScreenOrientationQualifier q = (ScreenOrientationQualifier)qualifier;
-
-            ScreenOrientation value = q.getValue();
-            if (value == null) {
-                mOrientation.clearSelection();
-            } else {
-                mOrientation.select(ScreenOrientation.getIndex(value));
-            }
-        }
-    }
-
-    /**
-     * Edit widget for {@link DockModeQualifier}.
-     */
-    private class UiModeEdit extends QualifierEditBase {
-
-        private final Combo mUiMode;
-
-        public UiModeEdit(Composite parent) {
-            super(parent, UiModeQualifier.NAME);
-
-            mUiMode = new Combo(this, SWT.DROP_DOWN | SWT.READ_ONLY);
-            fillCombo(mUiMode, UiMode.values());
-
-            mUiMode.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-            mUiMode.addSelectionListener(new SelectionListener() {
-                @Override
-                public void widgetDefaultSelected(SelectionEvent e) {
-                    onDockModeChange();
-                }
-                @Override
-                public void widgetSelected(SelectionEvent e) {
-                    onDockModeChange();
-                }
-            });
-        }
-
-        protected void onDockModeChange() {
-            // update the current config
-            int index = mUiMode.getSelectionIndex();
-
-            if (index != -1) {
-                mSelectedConfiguration.setUiModeQualifier(
-                        new UiModeQualifier(UiMode.getByIndex(index)));
-            } else {
-                // empty selection, means no qualifier.
-                // Since the qualifier classes are immutable, and we don't want to
-                // remove the qualifier from the configuration, we create a new default one.
-                mSelectedConfiguration.setUiModeQualifier(new UiModeQualifier());
-            }
-
-            // notify of change
-            onChange(true /* keepSelection */);
-        }
-
-        @Override
-        public void setQualifier(ResourceQualifier qualifier) {
-            UiModeQualifier q = (UiModeQualifier)qualifier;
-
-            UiMode value = q.getValue();
-            if (value == null) {
-                mUiMode.clearSelection();
-            } else {
-                mUiMode.select(UiMode.getIndex(value));
-            }
-        }
-    }
-
-    /**
-     * Edit widget for {@link NightModeQualifier}.
-     */
-    private class NightModeEdit extends QualifierEditBase {
-
-        private final Combo mNightMode;
-
-        public NightModeEdit(Composite parent) {
-            super(parent, NightModeQualifier.NAME);
-
-            mNightMode = new Combo(this, SWT.DROP_DOWN | SWT.READ_ONLY);
-            fillCombo(mNightMode, NightMode.values());
-
-            mNightMode.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-            mNightMode.addSelectionListener(new SelectionListener() {
-                @Override
-                public void widgetDefaultSelected(SelectionEvent e) {
-                    onNightModeChange();
-                }
-                @Override
-                public void widgetSelected(SelectionEvent e) {
-                    onNightModeChange();
-                }
-            });
-        }
-
-        protected void onNightModeChange() {
-            // update the current config
-            int index = mNightMode.getSelectionIndex();
-
-            if (index != -1) {
-                mSelectedConfiguration.setNightModeQualifier(
-                        new NightModeQualifier(NightMode.getByIndex(index)));
-            } else {
-                // empty selection, means no qualifier.
-                // Since the qualifier classes are immutable, and we don't want to
-                // remove the qualifier from the configuration, we create a new default one.
-                mSelectedConfiguration.setNightModeQualifier(new NightModeQualifier());
-            }
-
-            // notify of change
-            onChange(true /* keepSelection */);
-        }
-
-        @Override
-        public void setQualifier(ResourceQualifier qualifier) {
-            NightModeQualifier q = (NightModeQualifier)qualifier;
-
-            NightMode value = q.getValue();
-            if (value == null) {
-                mNightMode.clearSelection();
-            } else {
-                mNightMode.select(NightMode.getIndex(value));
-            }
-        }
-    }
-
-
-    /**
-     * Edit widget for {@link DensityQualifier}.
-     */
-    private class DensityEdit extends QualifierEditBase {
-        private final Combo mDensity;
-
-        public DensityEdit(Composite parent) {
-            super(parent, DensityQualifier.NAME);
-
-            mDensity = new Combo(this, SWT.DROP_DOWN | SWT.READ_ONLY);
-            fillCombo(mDensity, Density.values());
-
-            mDensity.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-            mDensity.addSelectionListener(new SelectionListener() {
-                @Override
-                public void widgetDefaultSelected(SelectionEvent e) {
-                    onDensityChange();
-                }
-                @Override
-                public void widgetSelected(SelectionEvent e) {
-                    onDensityChange();
-                }
-            });
-        }
-
-        private void onDensityChange() {
-            // update the current config
-            int index = mDensity.getSelectionIndex();
-
-            if (index != -1) {
-                mSelectedConfiguration.setDensityQualifier(new DensityQualifier(
-                    Density.getByIndex(index)));
-            } else {
-                // empty selection, means no qualifier.
-                // Since the qualifier classes are immutable, and we don't want to
-                // remove the qualifier from the configuration, we create a new default one.
-                mSelectedConfiguration.setDensityQualifier(
-                        new DensityQualifier());
-            }
-
-            // notify of change
-            onChange(true /* keepSelection */);
-        }
-
-        @Override
-        public void setQualifier(ResourceQualifier qualifier) {
-            DensityQualifier q = (DensityQualifier)qualifier;
-
-            Density value = q.getValue();
-            if (value == null) {
-                mDensity.clearSelection();
-            } else {
-                mDensity.select(Density.getIndex(value));
-            }
-        }
-    }
-
-    /**
-     * Edit widget for {@link TouchScreenQualifier}.
-     */
-    private class TouchEdit extends QualifierEditBase {
-
-        private final Combo mTouchScreen;
-
-        public TouchEdit(Composite parent) {
-            super(parent, TouchScreenQualifier.NAME);
-
-            mTouchScreen = new Combo(this, SWT.DROP_DOWN | SWT.READ_ONLY);
-            fillCombo(mTouchScreen, TouchScreen.values());
-
-            mTouchScreen.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-            mTouchScreen.addSelectionListener(new SelectionListener() {
-                @Override
-                public void widgetDefaultSelected(SelectionEvent e) {
-                    onTouchChange();
-                }
-                @Override
-                public void widgetSelected(SelectionEvent e) {
-                    onTouchChange();
-                }
-            });
-        }
-
-        protected void onTouchChange() {
-            // update the current config
-            int index = mTouchScreen.getSelectionIndex();
-
-            if (index != -1) {
-                mSelectedConfiguration.setTouchTypeQualifier(new TouchScreenQualifier(
-                        TouchScreen.getByIndex(index)));
-            } else {
-                // empty selection, means no qualifier.
-                // Since the qualifier classes are immutable, and we don't want to
-                // remove the qualifier from the configuration, we create a new default one.
-                mSelectedConfiguration.setTouchTypeQualifier(new TouchScreenQualifier());
-            }
-
-            // notify of change
-            onChange(true /* keepSelection */);
-        }
-
-        @Override
-        public void setQualifier(ResourceQualifier qualifier) {
-            TouchScreenQualifier q = (TouchScreenQualifier)qualifier;
-
-            TouchScreen value = q.getValue();
-            if (value == null) {
-                mTouchScreen.clearSelection();
-            } else {
-                mTouchScreen.select(TouchScreen.getIndex(value));
-            }
-        }
-    }
-
-    /**
-     * Edit widget for {@link KeyboardStateQualifier}.
-     */
-    private class KeyboardEdit extends QualifierEditBase {
-
-        private final Combo mKeyboardState;
-
-        public KeyboardEdit(Composite parent) {
-            super(parent, KeyboardStateQualifier.NAME);
-
-            mKeyboardState = new Combo(this, SWT.DROP_DOWN | SWT.READ_ONLY);
-            fillCombo(mKeyboardState, KeyboardState.values());
-
-            mKeyboardState.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-            mKeyboardState.addSelectionListener(new SelectionListener() {
-                @Override
-                public void widgetDefaultSelected(SelectionEvent e) {
-                    onKeyboardChange();
-                }
-                @Override
-                public void widgetSelected(SelectionEvent e) {
-                    onKeyboardChange();
-                }
-            });
-        }
-
-        protected void onKeyboardChange() {
-            // update the current config
-            int index = mKeyboardState.getSelectionIndex();
-
-            if (index != -1) {
-                mSelectedConfiguration.setKeyboardStateQualifier(new KeyboardStateQualifier(
-                        KeyboardState.getByIndex(index)));
-            } else {
-                // empty selection, means no qualifier.
-                // Since the qualifier classes are immutable, and we don't want to
-                // remove the qualifier from the configuration, we create a new default one.
-                mSelectedConfiguration.setKeyboardStateQualifier(
-                        new KeyboardStateQualifier());
-            }
-
-            // notify of change
-            onChange(true /* keepSelection */);
-        }
-
-        @Override
-        public void setQualifier(ResourceQualifier qualifier) {
-            KeyboardStateQualifier q = (KeyboardStateQualifier)qualifier;
-
-            KeyboardState value = q.getValue();
-            if (value == null) {
-                mKeyboardState.clearSelection();
-            } else {
-                mKeyboardState.select(KeyboardState.getIndex(value));
-            }
-        }
-    }
-
-    /**
-     * Edit widget for {@link TextInputMethodQualifier}.
-     */
-    private class TextInputEdit extends QualifierEditBase {
-
-        private final Combo mTextInput;
-
-        public TextInputEdit(Composite parent) {
-            super(parent, TextInputMethodQualifier.NAME);
-
-            mTextInput = new Combo(this, SWT.DROP_DOWN | SWT.READ_ONLY);
-            fillCombo(mTextInput, Keyboard.values());
-
-            mTextInput.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-            mTextInput.addSelectionListener(new SelectionListener() {
-                @Override
-                public void widgetDefaultSelected(SelectionEvent e) {
-                    onTextInputChange();
-                }
-                @Override
-                public void widgetSelected(SelectionEvent e) {
-                    onTextInputChange();
-                }
-            });
-        }
-
-        protected void onTextInputChange() {
-            // update the current config
-            int index = mTextInput.getSelectionIndex();
-
-            if (index != -1) {
-                mSelectedConfiguration.setTextInputMethodQualifier(new TextInputMethodQualifier(
-                        Keyboard.getByIndex(index)));
-            } else {
-                // empty selection, means no qualifier.
-                // Since the qualifier classes are immutable, and we don't want to
-                // remove the qualifier from the configuration, we create a new default one.
-                mSelectedConfiguration.setTextInputMethodQualifier(
-                        new TextInputMethodQualifier());
-            }
-
-            // notify of change
-            onChange(true /* keepSelection */);
-        }
-
-        @Override
-        public void setQualifier(ResourceQualifier qualifier) {
-            TextInputMethodQualifier q = (TextInputMethodQualifier)qualifier;
-
-            Keyboard value = q.getValue();
-            if (value == null) {
-                mTextInput.clearSelection();
-            } else {
-                mTextInput.select(Keyboard.getIndex(value));
-            }
-        }
-    }
-
-    /**
-     * Edit widget for {@link NavigationStateQualifier}.
-     */
-    private class NavigationStateEdit extends QualifierEditBase {
-
-        private final Combo mNavigationState;
-
-        public NavigationStateEdit(Composite parent) {
-            super(parent, NavigationStateQualifier.NAME);
-
-            mNavigationState = new Combo(this, SWT.DROP_DOWN | SWT.READ_ONLY);
-            fillCombo(mNavigationState, NavigationState.values());
-
-            mNavigationState.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-            mNavigationState.addSelectionListener(new SelectionListener() {
-                @Override
-                public void widgetDefaultSelected(SelectionEvent e) {
-                    onNavigationChange();
-                }
-                @Override
-                public void widgetSelected(SelectionEvent e) {
-                    onNavigationChange();
-                }
-            });
-        }
-
-        protected void onNavigationChange() {
-            // update the current config
-            int index = mNavigationState.getSelectionIndex();
-
-            if (index != -1) {
-                mSelectedConfiguration.setNavigationStateQualifier(
-                        new NavigationStateQualifier(NavigationState.getByIndex(index)));
-            } else {
-                // empty selection, means no qualifier.
-                // Since the qualifier classes are immutable, and we don't want to
-                // remove the qualifier from the configuration, we create a new default one.
-                mSelectedConfiguration.setNavigationStateQualifier(new NavigationStateQualifier());
-            }
-
-            // notify of change
-            onChange(true /* keepSelection */);
-        }
-
-        @Override
-        public void setQualifier(ResourceQualifier qualifier) {
-            NavigationStateQualifier q = (NavigationStateQualifier)qualifier;
-
-            NavigationState value = q.getValue();
-            if (value == null) {
-                mNavigationState.clearSelection();
-            } else {
-                mNavigationState.select(NavigationState.getIndex(value));
-            }
-        }
-    }
-
-
-    /**
-     * Edit widget for {@link NavigationMethodQualifier}.
-     */
-    private class NavigationEdit extends QualifierEditBase {
-
-        private final Combo mNavigation;
-
-        public NavigationEdit(Composite parent) {
-            super(parent, NavigationMethodQualifier.NAME);
-
-            mNavigation = new Combo(this, SWT.DROP_DOWN | SWT.READ_ONLY);
-            fillCombo(mNavigation, Navigation.values());
-
-            mNavigation.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-            mNavigation.addSelectionListener(new SelectionListener() {
-                @Override
-                public void widgetDefaultSelected(SelectionEvent e) {
-                    onNavigationChange();
-                }
-                @Override
-                public void widgetSelected(SelectionEvent e) {
-                    onNavigationChange();
-                }
-            });
-        }
-
-        protected void onNavigationChange() {
-            // update the current config
-            int index = mNavigation.getSelectionIndex();
-
-            if (index != -1) {
-                mSelectedConfiguration.setNavigationMethodQualifier(new NavigationMethodQualifier(
-                        Navigation.getByIndex(index)));
-            } else {
-                // empty selection, means no qualifier.
-                // Since the qualifier classes are immutable, and we don't want to
-                // remove the qualifier from the configuration, we create a new default one.
-                mSelectedConfiguration.setNavigationMethodQualifier(
-                        new NavigationMethodQualifier());
-            }
-
-            // notify of change
-            onChange(true /* keepSelection */);
-        }
-
-        @Override
-        public void setQualifier(ResourceQualifier qualifier) {
-            NavigationMethodQualifier q = (NavigationMethodQualifier)qualifier;
-
-            Navigation value = q.getValue();
-            if (value == null) {
-                mNavigation.clearSelection();
-            } else {
-                mNavigation.select(Navigation.getIndex(value));
-            }
-        }
-    }
-
-    /**
-     * Edit widget for {@link ScreenDimensionQualifier}.
-     */
-    private class ScreenDimensionEdit extends QualifierEditBase {
-
-        private final Text mSize1;
-        private final Text mSize2;
-
-        public ScreenDimensionEdit(Composite parent) {
-            super(parent, ScreenDimensionQualifier.NAME);
-
-            ModifyListener modifyListener = new ModifyListener() {
-                @Override
-                public void modifyText(ModifyEvent e) {
-                    onSizeChange();
-                }
-            };
-
-            FocusAdapter focusListener = new FocusAdapter() {
-                @Override
-                public void focusLost(FocusEvent e) {
-                    onSizeChange();
-                }
-            };
-
-            mSize1 = new Text(this, SWT.BORDER);
-            mSize1.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-            mSize1.addVerifyListener(new DimensionVerifier());
-            mSize1.addModifyListener(modifyListener);
-            mSize1.addFocusListener(focusListener);
-
-            mSize2 = new Text(this, SWT.BORDER);
-            mSize2.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-            mSize2.addVerifyListener(new DimensionVerifier());
-            mSize2.addModifyListener(modifyListener);
-            mSize2.addFocusListener(focusListener);
-        }
-
-        private void onSizeChange() {
-            // update the current config
-            String size1 = mSize1.getText();
-            String size2 = mSize2.getText();
-
-            if (size1.length() == 0 || size2.length() == 0) {
-                // if one of the strings is empty, reset to no qualifier.
-                // Since the qualifier classes are immutable, and we don't want to
-                // remove the qualifier from the configuration, we create a new default one.
-                mSelectedConfiguration.setScreenDimensionQualifier(new ScreenDimensionQualifier());
-            } else {
-                ScreenDimensionQualifier qualifier = ScreenDimensionQualifier.getQualifier(size1,
-                        size2);
-
-                if (qualifier != null) {
-                    mSelectedConfiguration.setScreenDimensionQualifier(qualifier);
-                } else {
-                    // Failure! Looks like the value is wrong, reset the qualifier
-                    // Since the qualifier classes are immutable, and we don't want to
-                    // remove the qualifier from the configuration, we create a new default one.
-                    mSelectedConfiguration.setScreenDimensionQualifier(
-                            new ScreenDimensionQualifier());
-                }
-            }
-
-            // notify of change
-            onChange(true /* keepSelection */);
-        }
-
-        @Override
-        public void setQualifier(ResourceQualifier qualifier) {
-            ScreenDimensionQualifier q = (ScreenDimensionQualifier)qualifier;
-
-            mSize1.setText(Integer.toString(q.getValue1()));
-            mSize2.setText(Integer.toString(q.getValue2()));
-        }
-    }
-
-    /**
-     * Edit widget for {@link VersionQualifier}.
-     */
-    private class VersionEdit extends QualifierEditBase {
-        private final Text mText;
-
-        public VersionEdit(Composite parent) {
-            super(parent, VersionQualifier.NAME);
-
-            mText = new Text(this, SWT.BORDER);
-            mText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-            mText.addVerifyListener(new MobileCodeVerifier());
-            mText.addModifyListener(new ModifyListener() {
-                @Override
-                public void modifyText(ModifyEvent e) {
-                    onVersionChange();
-                }
-            });
-            mText.addFocusListener(new FocusAdapter() {
-                @Override
-                public void focusLost(FocusEvent e) {
-                    onVersionChange();
-                }
-            });
-
-            new Label(this, SWT.NONE).setText("(Platform API level)");
-        }
-
-        private void onVersionChange() {
-            String value = mText.getText();
-
-            if (value.length() == 0) {
-                // empty string, means a qualifier with no value.
-                // Since the qualifier classes are immutable, and we don't want to
-                // remove the qualifier from the configuration, we create a new default one.
-                mSelectedConfiguration.setVersionQualifier(new VersionQualifier());
-            } else {
-                try {
-                    VersionQualifier qualifier = VersionQualifier.getQualifier(
-                            VersionQualifier.getFolderSegment(Integer.parseInt(value)));
-                    if (qualifier != null) {
-                        mSelectedConfiguration.setVersionQualifier(qualifier);
-                    } else {
-                        // Failure! Looks like the value is wrong
-                        mSelectedConfiguration.setVersionQualifier(new VersionQualifier());
-                    }
-                } catch (NumberFormatException nfe) {
-                    // Looks like the code is not a number. This should not happen since the text
-                    // field has a VerifyListener that prevents it.
-                    mSelectedConfiguration.setVersionQualifier(new VersionQualifier());
-                }
-            }
-
-            // notify of change
-            onChange(true /* keepSelection */);
-        }
-
-        @Override
-        public void setQualifier(ResourceQualifier qualifier) {
-            VersionQualifier q = (VersionQualifier)qualifier;
-
-            mText.setText(Integer.toString(q.getVersion()));
-        }
-    }
-
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/ui/EclipseUiHelper.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/ui/EclipseUiHelper.java
deleted file mode 100644
index f0fd231..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/ui/EclipseUiHelper.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * 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.ui;
-
-import org.eclipse.ui.IViewPart;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.PlatformUI;
-
-/**
- * Helpers for Eclipse UI related stuff.
- */
-public final class EclipseUiHelper {
-
-    /** View Id for the default Eclipse Content Outline view. */
-    public static final String CONTENT_OUTLINE_VIEW_ID = "org.eclipse.ui.views.ContentOutline";
-    /** View Id for the default Eclipse Property Sheet view. */
-    public static final String PROPERTY_SHEET_VIEW_ID  = "org.eclipse.ui.views.PropertySheet";
-    
-    /** This class never gets instantiated. */
-    private EclipseUiHelper() {
-    }
-    
-    /**
-     * Shows the corresponding view.
-     * <p/>
-     * Silently fails in case of error.
-     * 
-     * @param viewId One of {@link #CONTENT_OUTLINE_VIEW_ID}, {@link #PROPERTY_SHEET_VIEW_ID}.
-     * @param activate True to force activate (i.e. takes focus), false to just make visible (i.e.
-     *                 does not steal focus.)
-     */
-    public static void showView(String viewId, boolean activate) {
-        IWorkbenchWindow win = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
-        if (win != null) {
-            IWorkbenchPage page = win.getActivePage();
-            if (page != null) {
-                try {
-                    IViewPart part = page.showView(viewId,
-                            null /* secondaryId */,
-                            activate ? IWorkbenchPage.VIEW_ACTIVATE : IWorkbenchPage.VIEW_VISIBLE);
-                } catch (PartInitException e) {
-                    // ignore
-                }
-            }
-        }
-        
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/ui/IUpdateWizardDialog.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/ui/IUpdateWizardDialog.java
deleted file mode 100755
index c49b589..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/ui/IUpdateWizardDialog.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Copyright (C) 2009 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.ui;
-
-import org.eclipse.jface.wizard.WizardDialog;
-
-
-/**
- * An interface that enables a client to update {@link WizardDialog} after its creation.
- */
-public interface IUpdateWizardDialog {
-    /**
-     * Invoked after {@link WizardDialog#create()} to let the caller update the dialog.
-     */
-    public void updateWizardDialog(WizardDialogEx dialog);
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/ui/MarginChooser.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/ui/MarginChooser.java
deleted file mode 100644
index c2a5f71..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/ui/MarginChooser.java
+++ /dev/null
@@ -1,229 +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.eclipse.adt.internal.ui;
-
-import com.android.ide.eclipse.adt.internal.editors.layout.gle2.GraphicalEditorPart;
-import com.android.ide.eclipse.adt.internal.sdk.AndroidTargetData;
-import com.android.resources.ResourceType;
-
-import org.eclipse.jface.window.Window;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Listener;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.ui.dialogs.SelectionStatusDialog;
-
-/**
- * Dialog for choosing margins
- */
-public class MarginChooser extends SelectionStatusDialog implements Listener {
-    private GraphicalEditorPart mEditor;
-    private AndroidTargetData mTargetData;
-    private Text mLeftField;
-    private Text mRightField;
-    private Text mTopField;
-    private Text mBottomField;
-    private Text mAllField;
-    private String mInitialAll;
-    private String mInitialLeft;
-    private String mInitialRight;
-    private String mInitialTop;
-    private String mInitialBottom;
-    private Label mErrorLabel;
-    private String[] mMargins;
-
-    // Client data key for resource buttons pointing to the associated text field
-    private final static String PROP_TEXTFIELD = "textField"; //$NON-NLS-1$
-
-    /**
-     * Constructs a new margin chooser dialog.
-     *
-     * @param parent parent widget
-     * @param editor associated layout editor
-     * @param targetData current SDK target
-     * @param all current value for the all margins attribute
-     * @param left current value for the left margin
-     * @param right current value for the right margin
-     * @param top current value for the top margin
-     * @param bottom current value for the bottom margin
-     */
-    public MarginChooser(Shell parent, GraphicalEditorPart editor, AndroidTargetData targetData, String all,
-            String left, String right, String top, String bottom) {
-        super(parent);
-        setTitle("Edit Margins");
-        mEditor = editor;
-        mTargetData = targetData;
-        mInitialAll = all;
-        mInitialLeft = left;
-        mInitialRight = right;
-        mInitialTop = top;
-        mInitialBottom = bottom;
-    }
-
-    @SuppressWarnings("unused") // SWT constructors have side effects, "new Label" is not unused.
-    @Override
-    protected Control createDialogArea(Composite parent) {
-        Composite container = new Composite(parent, SWT.NONE);
-        container.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));
-
-        container.setLayout(new GridLayout(3, false));
-
-        Label allLabel = new Label(container, SWT.NONE);
-        allLabel.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1));
-        allLabel.setText("All:");
-
-        mAllField = new Text(container, SWT.BORDER | SWT.LEFT);
-        mAllField.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
-        mAllField.setText(mInitialAll != null ? mInitialAll : ""); //$NON-NLS-1$
-
-        Button allButton = new Button(container, SWT.NONE);
-        allButton.setText("Resource...");
-        allButton.setData(PROP_TEXTFIELD, mAllField);
-
-        Label label = new Label(container, SWT.SEPARATOR | SWT.HORIZONTAL);
-        label.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 3, 1));
-
-        Label leftLabel = new Label(container, SWT.NONE);
-        leftLabel.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1));
-        leftLabel.setText("Left:");
-
-        mLeftField = new Text(container, SWT.BORDER | SWT.LEFT);
-        mLeftField.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
-        mLeftField.setText(mInitialLeft != null ? mInitialLeft : ""); //$NON-NLS-1$
-
-        Button leftButton = new Button(container, SWT.NONE);
-        leftButton.setText("Resource...");
-        leftButton.setData(PROP_TEXTFIELD, mLeftField);
-
-        Label rightLabel = new Label(container, SWT.NONE);
-        rightLabel.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1));
-        rightLabel.setText("Right:");
-
-        mRightField = new Text(container, SWT.BORDER | SWT.LEFT);
-        mRightField.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
-        mRightField.setText(mInitialRight != null ? mInitialRight : ""); //$NON-NLS-1$
-
-        Button rightButton = new Button(container, SWT.NONE);
-        rightButton.setText("Resource...");
-        rightButton.setData(PROP_TEXTFIELD, mRightField);
-
-        Label topLabel = new Label(container, SWT.NONE);
-        topLabel.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1));
-        topLabel.setText("Top:");
-
-        mTopField = new Text(container, SWT.BORDER | SWT.LEFT);
-        mTopField.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
-        mTopField.setText(mInitialTop != null ? mInitialTop : ""); //$NON-NLS-1$
-
-        Button topButton = new Button(container, SWT.NONE);
-        topButton.setText("Resource...");
-        topButton.setData(PROP_TEXTFIELD, mTopField);
-
-        Label bottomLabel = new Label(container, SWT.NONE);
-        bottomLabel.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1));
-        bottomLabel.setText("Bottom:");
-
-        mBottomField = new Text(container, SWT.BORDER | SWT.LEFT);
-        mBottomField.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
-        mBottomField.setText(mInitialBottom != null ? mInitialBottom : ""); //$NON-NLS-1$
-
-        Button bottomButton = new Button(container, SWT.NONE);
-        bottomButton.setText("Resource...");
-        bottomButton.setData(PROP_TEXTFIELD, mBottomField);
-
-        allButton.addListener(SWT.Selection, this);
-        leftButton.addListener(SWT.Selection, this);
-        rightButton.addListener(SWT.Selection, this);
-        topButton.addListener(SWT.Selection, this);
-        bottomButton.addListener(SWT.Selection, this);
-
-        mAllField.addListener(SWT.Modify, this);
-        mLeftField.addListener(SWT.Modify, this);
-        mRightField.addListener(SWT.Modify, this);
-        mTopField.addListener(SWT.Modify, this);
-        mBottomField.addListener(SWT.Modify, this);
-
-        new Label(container, SWT.NONE);
-        mErrorLabel = new Label(container, SWT.WRAP);
-        mErrorLabel.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false, 2, 1));
-        mErrorLabel.setForeground(parent.getDisplay().getSystemColor(SWT.COLOR_RED));
-        return container;
-    }
-
-    @Override
-    protected void computeResult() {
-        mMargins = new String[] {
-                mAllField.getText().trim(),
-                mLeftField.getText().trim(), mRightField.getText().trim(),
-                mTopField.getText().trim(), mBottomField.getText().trim()
-        };
-    }
-
-    /**
-     * Returns the margins in the order all, left, right, top, bottom
-     *
-     * @return the margins in the order all, left, right, top, bottom, never
-     *         null
-     */
-    public String[] getMargins() {
-        return mMargins;
-    }
-
-    @Override
-    public void handleEvent(Event event) {
-        if (event.type == SWT.Modify) {
-            // Text field modification -- warn about non-dip numbers
-            if (event.widget instanceof Text) {
-                Text text = (Text) event.widget;
-                String input = text.getText().trim();
-                boolean isNumber = false;
-                try {
-                    if (Integer.parseInt(input) > 0) {
-                        isNumber = true;
-                    }
-                } catch (NumberFormatException nufe) {
-                    // Users are allowed to enter non-numbers here, not an error
-                }
-                if (isNumber) {
-                    String message = String.format("Hint: Use \"%1$sdp\" instead", input);
-                    mErrorLabel.setText(message);
-                } else {
-                    mErrorLabel.setText("");
-                }
-            }
-        } else if (event.type == SWT.Selection) {
-            // Button pressed - open resource chooser
-            if (event.widget instanceof Button) {
-                Button button = (Button) event.widget;
-                Text text = (Text) button.getData(PROP_TEXTFIELD);
-
-                // Open a resource chooser dialog for specified resource type.
-                ResourceChooser chooser = ResourceChooser.create(mEditor, ResourceType.DIMEN)
-                        .setCurrentResource(text.getText().trim());
-                if (chooser.open() == Window.OK) {
-                    text.setText(chooser.getCurrentResource());
-                }
-            }
-        }
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/ui/ReferenceChooserDialog.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/ui/ReferenceChooserDialog.java
deleted file mode 100644
index 6c62865..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/ui/ReferenceChooserDialog.java
+++ /dev/null
@@ -1,396 +0,0 @@
-/*
- * 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.ui;
-
-import com.android.ide.common.resources.ResourceItem;
-import com.android.ide.common.resources.ResourceRepository;
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.ide.eclipse.adt.internal.editors.layout.properties.PropertyFactory;
-import com.android.ide.eclipse.adt.internal.refactorings.extractstring.ExtractStringRefactoring;
-import com.android.ide.eclipse.adt.internal.refactorings.extractstring.ExtractStringWizard;
-import com.android.resources.ResourceType;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.jface.dialogs.DialogSettings;
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.jface.dialogs.IDialogSettings;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.TreePath;
-import org.eclipse.jface.viewers.TreeSelection;
-import org.eclipse.jface.viewers.TreeViewer;
-import org.eclipse.ltk.ui.refactoring.RefactoringWizard;
-import org.eclipse.ltk.ui.refactoring.RefactoringWizardOpenOperation;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Tree;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.dialogs.FilteredTree;
-import org.eclipse.ui.dialogs.PatternFilter;
-import org.eclipse.ui.dialogs.SelectionStatusDialog;
-
-import java.util.Collection;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-/**
- * A dialog to let the user choose a reference to a resource.
- *
- */
-public class ReferenceChooserDialog extends SelectionStatusDialog {
-
-    private static Pattern sResourcePattern = Pattern.compile("@(.*)/(.+)"); //$NON-NLS-1$
-    private static Pattern sInlineIdResourcePattern = Pattern.compile("@\\+id/(.+)"); //$NON-NLS-1$
-
-    private static IDialogSettings sDialogSettings = new DialogSettings("");
-
-    private ResourceRepository mProjectResources;
-    private String mCurrentResource;
-    private FilteredTree mFilteredTree;
-    private Button mNewResButton;
-    private final IProject mProject;
-    private TreeViewer mTreeViewer;
-    private ResourcePreviewHelper mPreviewHelper;
-
-    /**
-     * @param project
-     * @param parent
-     */
-    public ReferenceChooserDialog(IProject project, ResourceRepository projectResources,
-            Shell parent) {
-        super(parent);
-        mProject = project;
-        mProjectResources = projectResources;
-
-        int shellStyle = getShellStyle();
-        setShellStyle(shellStyle | SWT.MAX | SWT.RESIZE);
-
-        setTitle("Reference Chooser");
-        setMessage(String.format("Choose a resource"));
-
-        setDialogBoundsSettings(sDialogSettings, getDialogBoundsStrategy());
-    }
-
-    public void setPreviewHelper(ResourcePreviewHelper previewHelper) {
-        mPreviewHelper = previewHelper;
-    }
-
-    public void setCurrentResource(String resource) {
-        mCurrentResource = resource;
-    }
-
-    public String getCurrentResource() {
-        return mCurrentResource;
-    }
-
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.dialogs.SelectionStatusDialog#computeResult()
-     */
-    @Override
-    protected void computeResult() {
-        // get the selection
-        TreePath treeSelection = getSelection();
-        if (treeSelection != null) {
-            if (treeSelection.getSegmentCount() == 2) {
-                // get the resource type and the resource item
-                ResourceType resourceType = (ResourceType)treeSelection.getFirstSegment();
-                ResourceItem resourceItem = (ResourceItem)treeSelection.getLastSegment();
-
-                mCurrentResource = resourceItem.getXmlString(resourceType, false /* system */);
-            }
-        }
-    }
-
-    @Override
-    protected Control createDialogArea(Composite parent) {
-        Composite top = (Composite)super.createDialogArea(parent);
-
-        // create the standard message area
-        createMessageArea(top);
-
-        // create the filtered tree
-        createFilteredTree(top);
-
-        // setup the initial selection
-        if (mCurrentResource != null) {
-            setupInitialSelection();
-        }
-
-        // create the "New Resource" button
-        createNewResButtons(top);
-
-        Composite workaround = PropertyFactory.addWorkaround(top);
-        if (workaround != null) {
-            workaround.setLayoutData(new GridData(SWT.LEFT, SWT.TOP, false, false, 1, 1));
-        }
-
-        return top;
-    }
-
-    /**
-     * Creates the "New Resource" button.
-     * @param top the parent composite
-     */
-    private void createNewResButtons(Composite top) {
-        mNewResButton = new Button(top, SWT.NONE);
-        mNewResButton.addSelectionListener(new OnNewResButtonSelected());
-        updateNewResButton();
-    }
-
-    private void createFilteredTree(Composite parent) {
-        mFilteredTree = new FilteredTree(parent, SWT.BORDER | SWT.SINGLE | SWT.FULL_SELECTION,
-                new PatternFilter());
-
-        GridData data = new GridData();
-        data.widthHint = convertWidthInCharsToPixels(60);
-        data.heightHint = convertHeightInCharsToPixels(18);
-        data.grabExcessVerticalSpace = true;
-        data.grabExcessHorizontalSpace = true;
-        data.horizontalAlignment = GridData.FILL;
-        data.verticalAlignment = GridData.FILL;
-        mFilteredTree.setLayoutData(data);
-        mFilteredTree.setFont(parent.getFont());
-
-        mTreeViewer = mFilteredTree.getViewer();
-        Tree tree = mTreeViewer.getTree();
-
-        tree.addSelectionListener(new SelectionListener() {
-            @Override
-            public void widgetDefaultSelected(SelectionEvent e) {
-                handleDoubleClick();
-            }
-
-            @Override
-            public void widgetSelected(SelectionEvent e) {
-                handleSelection();
-            }
-        });
-
-        mTreeViewer.setLabelProvider(new ResourceLabelProvider());
-        mTreeViewer.setContentProvider(new ResourceContentProvider(false /* fullLevels */));
-        mTreeViewer.setInput(mProjectResources);
-    }
-
-    protected void handleSelection() {
-        validateCurrentSelection();
-        updateNewResButton();
-
-        if (mPreviewHelper != null) {
-            TreePath treeSelection = getSelection();
-            ResourceType type = null;
-            if (treeSelection != null && treeSelection.getSegmentCount() == 2) {
-                Object segment = treeSelection.getSegment(0);
-                if (segment instanceof ResourceType) {
-                    type = (ResourceType) segment;
-                    // Ensure that mCurrentResource is valid
-                    computeResult();
-                }
-            }
-
-            mPreviewHelper.updatePreview(type, mCurrentResource);
-        }
-    }
-
-    protected void handleDoubleClick() {
-        if (validateCurrentSelection()) {
-            buttonPressed(IDialogConstants.OK_ID);
-        }
-    }
-
-    /**
-     * Returns the selected item in the tree as a {@link TreePath} object.
-     * @return the <code>TreePath</code> object or <code>null</code> if there was no selection.
-     */
-    private TreePath getSelection() {
-        ISelection selection = mFilteredTree.getViewer().getSelection();
-        if (selection instanceof TreeSelection) {
-            TreeSelection treeSelection = (TreeSelection)selection;
-            TreePath[] treePaths = treeSelection.getPaths();
-
-            // the selection mode is SWT.SINGLE, so we just get the first one.
-            if (treePaths.length > 0) {
-                return treePaths[0];
-            }
-        }
-
-        return null;
-    }
-
-    private boolean validateCurrentSelection() {
-        TreePath treeSelection = getSelection();
-
-        IStatus status;
-        if (treeSelection != null) {
-            if (treeSelection.getSegmentCount() == 2) {
-                status = new Status(IStatus.OK, AdtPlugin.PLUGIN_ID,
-                        IStatus.OK, "", //$NON-NLS-1$
-                        null);
-            } else {
-                status = new Status(IStatus.ERROR, AdtPlugin.PLUGIN_ID,
-                        IStatus.ERROR, "You must select a Resource Item",
-                        null);
-            }
-        } else {
-            status = new Status(IStatus.ERROR, AdtPlugin.PLUGIN_ID,
-                    IStatus.ERROR, "", //$NON-NLS-1$
-                    null);
-        }
-
-        updateStatus(status);
-
-        return status.isOK();
-    }
-
-    /**
-     * Updates the new res button when the list selection changes.
-     * The name of the button changes depending on the resource.
-     */
-    private void updateNewResButton() {
-        ResourceType type = getSelectedResourceType();
-
-        // We only support adding new strings right now
-        mNewResButton.setEnabled(type == ResourceType.STRING);
-
-        String title = String.format("New %1$s...",
-                type == null ? "Resource" : type.getDisplayName());
-        mNewResButton.setText(title);
-        mNewResButton.pack();
-    }
-
-    /**
-     * Callback invoked when the mNewResButton is selected by the user.
-     */
-    private class OnNewResButtonSelected extends SelectionAdapter {
-        @Override
-         public void widgetSelected(SelectionEvent e) {
-             super.widgetSelected(e);
-
-             ResourceType type = getSelectedResourceType();
-
-             // We currently only support strings
-             if (type == ResourceType.STRING) {
-
-                 ExtractStringRefactoring ref = new ExtractStringRefactoring(
-                         mProject, true /*enforceNew*/);
-                 RefactoringWizard wizard = new ExtractStringWizard(ref, mProject);
-                 RefactoringWizardOpenOperation op = new RefactoringWizardOpenOperation(wizard);
-                 try {
-                     IWorkbench w = PlatformUI.getWorkbench();
-                     if (op.run(w.getDisplay().getActiveShell(), wizard.getDefaultPageTitle()) ==
-                             IDialogConstants.OK_ID) {
-                         mTreeViewer.refresh();
-
-                         // select it if possible
-                         setupInitialSelection(type, ref.getXmlStringId());
-                     }
-                 } catch (InterruptedException ex) {
-                     // Interrupted. Pass.
-                 }
-             }
-         }
-     }
-
-    /**
-     * Returns the {@link ResourceType} of the selected element, if any.
-     * Returns null if nothing suitable is selected.
-     */
-    private ResourceType getSelectedResourceType() {
-        ResourceType type = null;
-
-        TreePath selection = getSelection();
-        if (selection != null && selection.getSegmentCount() > 0) {
-            Object first = selection.getFirstSegment();
-            if (first instanceof ResourceType) {
-                type = (ResourceType) first;
-            }
-        }
-        return type;
-    }
-
-    /**
-     * Sets up the initial selection.
-     * <p/>
-     * This parses {@link #mCurrentResource} to find out the resource type and the resource name.
-     */
-    private void setupInitialSelection() {
-        // checks the inline id pattern first as it's more restrictive than the other one.
-        Matcher m = sInlineIdResourcePattern.matcher(mCurrentResource);
-        if (m.matches()) {
-            // get the matching name
-            String resourceName = m.group(1);
-
-            // setup initial selection
-            setupInitialSelection(ResourceType.ID, resourceName);
-        } else {
-            // attempts the inline id pattern
-            m = sResourcePattern.matcher(mCurrentResource);
-            if (m.matches()) {
-                // get the resource type.
-                ResourceType resourceType = ResourceType.getEnum(m.group(1));
-                if (resourceType != null) {
-                    // get the matching name
-                    String resourceName = m.group(2);
-
-                    // setup initial selection
-                    setupInitialSelection(resourceType, resourceName);
-                }
-            }
-        }
-    }
-
-    /**
-     * Sets up the initial selection based on a {@link ResourceType} and a resource name.
-     * @param resourceType the resource type.
-     * @param resourceName the resource name.
-     */
-    private void setupInitialSelection(ResourceType resourceType, String resourceName) {
-        // get all the resources of this type
-        Collection<ResourceItem> resourceItems =
-                mProjectResources.getResourceItemsOfType(resourceType);
-
-        for (ResourceItem resourceItem : resourceItems) {
-            if (resourceName.equals(resourceItem.getName())) {
-                // name of the resource match, we select it,
-                TreePath treePath = new TreePath(new Object[] { resourceType, resourceItem });
-                mFilteredTree.getViewer().setSelection(
-                        new TreeSelection(treePath),
-                        true /*reveal*/);
-
-                // and we're done.
-                return;
-            }
-        }
-
-        // if we get here, the resource type is valid, but the resource is missing.
-        // we select and expand the resource type element.
-        TreePath treePath = new TreePath(new Object[] { resourceType });
-        mFilteredTree.getViewer().setSelection(
-                new TreeSelection(treePath),
-                true /*reveal*/);
-        mFilteredTree.getViewer().setExpandedState(resourceType, true /* expanded */);
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/ui/ResourceChooser.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/ui/ResourceChooser.java
deleted file mode 100644
index ce828cf..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/ui/ResourceChooser.java
+++ /dev/null
@@ -1,958 +0,0 @@
-/*
- * Copyright (C) 2007 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.ui;
-
-import static com.android.SdkConstants.ANDROID_PREFIX;
-import static com.android.SdkConstants.PREFIX_RESOURCE_REF;
-
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-import com.android.ide.common.rendering.api.ResourceValue;
-import com.android.ide.common.resources.ResourceItem;
-import com.android.ide.common.resources.ResourceRepository;
-import com.android.ide.common.resources.ResourceResolver;
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.ide.eclipse.adt.AdtUtils;
-import com.android.ide.eclipse.adt.internal.assetstudio.OpenCreateAssetSetWizardAction;
-import com.android.ide.eclipse.adt.internal.editors.layout.gle2.GraphicalEditorPart;
-import com.android.ide.eclipse.adt.internal.editors.layout.properties.PropertyFactory;
-import com.android.ide.eclipse.adt.internal.refactorings.extractstring.ExtractStringRefactoring;
-import com.android.ide.eclipse.adt.internal.refactorings.extractstring.ExtractStringWizard;
-import com.android.ide.eclipse.adt.internal.resources.ResourceHelper;
-import com.android.ide.eclipse.adt.internal.resources.ResourceNameValidator;
-import com.android.ide.eclipse.adt.internal.resources.manager.ProjectResources;
-import com.android.ide.eclipse.adt.internal.resources.manager.ResourceManager;
-import com.android.ide.eclipse.adt.internal.sdk.AndroidTargetData;
-import com.android.ide.eclipse.adt.internal.sdk.ProjectState;
-import com.android.ide.eclipse.adt.internal.sdk.Sdk;
-import com.android.resources.ResourceType;
-import com.android.utils.Pair;
-import com.google.common.collect.Maps;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.jface.dialogs.IInputValidator;
-import org.eclipse.jface.dialogs.InputDialog;
-import org.eclipse.jface.text.IRegion;
-import org.eclipse.jface.window.Window;
-import org.eclipse.ltk.ui.refactoring.RefactoringWizard;
-import org.eclipse.ltk.ui.refactoring.RefactoringWizardOpenOperation;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Listener;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.dialogs.AbstractElementListSelectionDialog;
-import org.eclipse.ui.dialogs.SelectionStatusDialog;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.List;
-import java.util.Locale;
-import java.util.Map;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-/**
- * A dialog to let the user select a resource based on a resource type.
- */
-public class ResourceChooser extends AbstractElementListSelectionDialog implements ModifyListener {
-    /** The return code from the dialog for the user choosing "Clear" */
-    public static final int CLEAR_RETURN_CODE = -5;
-    /** The dialog button ID for the user choosing "Clear" */
-    private static final int CLEAR_BUTTON_ID = CLEAR_RETURN_CODE;
-
-    private Pattern mProjectResourcePattern;
-    private ResourceType mResourceType;
-    private final List<ResourceRepository> mProjectResources;
-    private final ResourceRepository mFrameworkResources;
-    private Pattern mSystemResourcePattern;
-    private Button mProjectButton;
-    private Button mSystemButton;
-    private Button mNewButton;
-    private String mCurrentResource;
-    private final IProject mProject;
-    private IInputValidator mInputValidator;
-
-    /** Helper object used to draw previews for drawables and colors. */
-    private ResourcePreviewHelper mPreviewHelper;
-
-    /**
-     * Textfield for editing the actual returned value, updated when selection
-     * changes. Only shown if {@link #mShowValueText} is true.
-     */
-    private Text mEditValueText;
-
-    /**
-     * Whether the {@link #mEditValueText} textfield should be shown when the dialog is created.
-     */
-    private boolean mShowValueText;
-
-    /**
-     * Flag indicating whether it's the first time {@link #handleSelectionChanged()} is called.
-     * This is used to filter out the first selection event, always called by the superclass
-     * when the widget is created, to distinguish between "the dialog was created" and
-     * "the user clicked on a selection result", since only the latter should wipe out the
-     * manual user edit shown in the value text.
-     */
-    private boolean mFirstSelect = true;
-
-    /**
-     * Label used to show the resolved value in the resource chooser. Only shown
-     * if the {@link #mResourceResolver} field is set.
-     */
-    private Label mResolvedLabel;
-
-    /** Resource resolver used to show actual values for resources selected. (Optional). */
-    private ResourceResolver mResourceResolver;
-
-    /**
-     * Creates a Resource Chooser dialog.
-     * @param project Project being worked on
-     * @param type The type of the resource to choose
-     * @param projectResources The repository for the project
-     * @param frameworkResources The Framework resource repository
-     * @param parent the parent shell
-     */
-    private ResourceChooser(
-            @NonNull IProject project,
-            @NonNull ResourceType type,
-            @NonNull List<ResourceRepository> projectResources,
-            @Nullable ResourceRepository frameworkResources,
-            @NonNull Shell parent) {
-        super(parent, new ResourceLabelProvider());
-        mProject = project;
-
-        mResourceType = type;
-        mProjectResources = projectResources;
-        mFrameworkResources = frameworkResources;
-
-        mProjectResourcePattern = Pattern.compile(
-                PREFIX_RESOURCE_REF + mResourceType.getName() + "/(.+)"); //$NON-NLS-1$
-
-        mSystemResourcePattern = Pattern.compile(
-                ANDROID_PREFIX + mResourceType.getName() + "/(.+)"); //$NON-NLS-1$
-
-        setTitle("Resource Chooser");
-        setMessage(String.format("Choose a %1$s resource",
-                mResourceType.getDisplayName().toLowerCase(Locale.US)));
-    }
-
-    /**
-     * Creates a new {@link ResourceChooser}
-     *
-     * @param editor the associated layout editor
-     * @param type the resource type to choose
-     * @return a new {@link ResourceChooser}
-     */
-    @NonNull
-    public static ResourceChooser create(
-            @NonNull GraphicalEditorPart editor,
-            @NonNull ResourceType type) {
-        IProject project = editor.getProject();
-        Shell parent = editor.getCanvasControl().getShell();
-        AndroidTargetData targetData = editor.getEditorDelegate().getEditor().getTargetData();
-        ResourceChooser chooser = create(project, type, targetData, parent);
-
-        // When editing Strings, allow editing the value text directly. When we
-        // get inline editing support (where values entered directly into the
-        // textual widget are translated automatically into a resource) this can
-        // go away.
-        if (type == ResourceType.STRING) {
-            chooser.setResourceResolver(editor.getResourceResolver());
-            chooser.setShowValueText(true);
-        } else if (type == ResourceType.DIMEN || type == ResourceType.INTEGER) {
-            chooser.setResourceResolver(editor.getResourceResolver());
-        }
-
-        chooser.setPreviewHelper(new ResourcePreviewHelper(chooser, editor));
-        return chooser;
-    }
-
-    /**
-     * Creates a new {@link ResourceChooser}
-     *
-     * @param project the associated project
-     * @param type the resource type to choose
-     * @param targetData the associated framework target data
-     * @param parent the target shell
-     * @return a new {@link ResourceChooser}
-     */
-    @NonNull
-    public static ResourceChooser create(
-            @NonNull IProject project,
-            @NonNull ResourceType type,
-            @Nullable AndroidTargetData targetData,
-            @NonNull Shell parent) {
-        ResourceManager manager = ResourceManager.getInstance();
-
-        List<ResourceRepository> projectResources = new ArrayList<ResourceRepository>();
-        ProjectResources resources = manager.getProjectResources(project);
-        projectResources.add(resources);
-
-        // Add in library project resources
-        ProjectState projectState = Sdk.getProjectState(project);
-        if (projectState != null) {
-            List<IProject> libraries = projectState.getFullLibraryProjects();
-            if (libraries != null && !libraries.isEmpty()) {
-                for (IProject library : libraries) {
-                    projectResources.add(manager.getProjectResources(library));
-                }
-            }
-        }
-
-        ResourceRepository frameworkResources =
-                targetData != null ? targetData.getFrameworkResources() : null;
-        return new ResourceChooser(project, type, projectResources, frameworkResources, parent);
-    }
-
-    /**
-     * Sets whether this dialog should show the value field as a separate text
-     * value (and take the resulting value of the dialog from this text field
-     * rather than from the selection)
-     *
-     * @param showValueText if true, show the value text field
-     * @return this, for constructor chaining
-     */
-    public ResourceChooser setShowValueText(boolean showValueText) {
-        mShowValueText = showValueText;
-
-        return this;
-    }
-
-    /**
-     * Sets the resource resolver to use to show resolved values for the current
-     * selection
-     *
-     * @param resourceResolver the resource resolver to use
-     * @return this, for constructor chaining
-     */
-    public ResourceChooser setResourceResolver(ResourceResolver resourceResolver) {
-        mResourceResolver = resourceResolver;
-
-        return this;
-    }
-
-    /**
-     * Sets the {@link ResourcePreviewHelper} to use to preview drawable
-     * resources, if any
-     *
-     * @param previewHelper the helper to use
-     * @return this, for constructor chaining
-     */
-    public ResourceChooser setPreviewHelper(ResourcePreviewHelper previewHelper) {
-        mPreviewHelper = previewHelper;
-
-        return this;
-    }
-
-    /**
-     * Sets the initial dialog size
-     *
-     * @param width the initial width
-     * @param height the initial height
-     * @return this, for constructor chaining
-     */
-    public ResourceChooser setInitialSize(int width, int height) {
-        setSize(width, height);
-
-        return this;
-    }
-
-    @Override
-    public void create() {
-        super.create();
-
-        if (mShowValueText) {
-            mEditValueText.selectAll();
-            mEditValueText.setFocus();
-        }
-    }
-
-    @Override
-    protected void createButtonsForButtonBar(Composite parent) {
-        createButton(parent, CLEAR_BUTTON_ID, "Clear", false /*defaultButton*/);
-        super.createButtonsForButtonBar(parent);
-    }
-
-    @Override
-    protected void buttonPressed(int buttonId) {
-        super.buttonPressed(buttonId);
-
-        if (buttonId == CLEAR_BUTTON_ID) {
-            assert CLEAR_RETURN_CODE != Window.OK && CLEAR_RETURN_CODE != Window.CANCEL;
-            setReturnCode(CLEAR_RETURN_CODE);
-            close();
-        }
-    }
-
-    /**
-     * Sets the currently selected item
-     *
-     * @param resource the resource url for the currently selected item
-     * @return this, for constructor chaining
-     */
-    public ResourceChooser setCurrentResource(@Nullable String resource) {
-        mCurrentResource = resource;
-
-        if (mShowValueText && mEditValueText != null) {
-            mEditValueText.setText(resource);
-        }
-
-        return this;
-    }
-
-    /**
-     * Returns the currently selected url
-     *
-     * @return the currently selected url
-     */
-    @Nullable
-    public String getCurrentResource() {
-        return mCurrentResource;
-    }
-
-    /**
-     * Sets the input validator to use, if any
-     *
-     * @param inputValidator the validator
-     * @return this, for constructor chaining
-     */
-    public ResourceChooser setInputValidator(@Nullable IInputValidator inputValidator) {
-        mInputValidator = inputValidator;
-
-        return this;
-    }
-
-    @Override
-    protected void computeResult() {
-        if (mShowValueText) {
-            mCurrentResource = mEditValueText.getText();
-            if (mCurrentResource.length() == 0) {
-                mCurrentResource = null;
-            }
-            return;
-        }
-
-        computeResultFromSelection();
-    }
-
-    private void computeResultFromSelection() {
-        if (getSelectionIndex() == -1) {
-            mCurrentResource = null;
-            return;
-        }
-
-        Object[] elements = getSelectedElements();
-        if (elements.length == 1 && elements[0] instanceof ResourceItem) {
-            ResourceItem item = (ResourceItem)elements[0];
-
-            mCurrentResource = item.getXmlString(mResourceType, mSystemButton.getSelection());
-
-            if (mInputValidator != null && mInputValidator.isValid(mCurrentResource) != null) {
-                mCurrentResource = null;
-            }
-        }
-    }
-
-    @Override
-    protected Control createDialogArea(Composite parent) {
-        Composite top = (Composite)super.createDialogArea(parent);
-
-        createMessageArea(top);
-
-        createButtons(top);
-        createFilterText(top);
-        createFilteredList(top);
-
-        // create the "New Resource" button
-        createNewResButtons(top);
-
-        // Optionally create the value text field, if {@link #mShowValueText} is true
-        createValueField(top);
-
-        setupResourceList();
-        selectResourceString(mCurrentResource);
-
-        return top;
-    }
-
-    /**
-     * Creates the radio button to switch between project and system resources.
-     * @param top the parent composite
-     */
-    private void createButtons(Composite top) {
-        mProjectButton = new Button(top, SWT.RADIO);
-        mProjectButton.setText("Project Resources");
-        mProjectButton.addSelectionListener(new SelectionAdapter() {
-            @Override
-            public void widgetSelected(SelectionEvent e) {
-                super.widgetSelected(e);
-                if (mProjectButton.getSelection()) {
-                    // Clear selection before changing the list contents. This works around
-                    // a bug in the superclass where switching to the framework resources,
-                    // choosing one of the last resources, then switching to the project
-                    // resources would cause an exception when calling getSelection() because
-                    // selection state doesn't get cleared when we set new contents on
-                    // the filtered list.
-                    fFilteredList.setSelection(new int[0]);
-                    setupResourceList();
-                    updateNewButton(false /*isSystem*/);
-                    updateValue();
-                }
-            }
-        });
-        mSystemButton = new Button(top, SWT.RADIO);
-        mSystemButton.setText("System Resources");
-        mSystemButton.addSelectionListener(new SelectionAdapter() {
-            @Override
-            public void widgetSelected(SelectionEvent e) {
-                super.widgetSelected(e);
-                if (mSystemButton.getSelection()) {
-                    fFilteredList.setSelection(new int[0]);
-                    setupResourceList();
-                    updateNewButton(true /*isSystem*/);
-                    updateValue();
-                }
-            }
-        });
-        if (mFrameworkResources == null) {
-            mSystemButton.setVisible(false);
-        }
-    }
-
-    /**
-     * Creates the "New Resource" button.
-     * @param top the parent composite
-     */
-    private void createNewResButtons(Composite top) {
-        mNewButton = new Button(top, SWT.NONE);
-
-        String title = String.format("New %1$s...", mResourceType.getDisplayName());
-        if (mResourceType == ResourceType.DRAWABLE) {
-            title = "Create New Icon...";
-        }
-        mNewButton.setText(title);
-
-        mNewButton.addSelectionListener(new SelectionAdapter() {
-            @Override
-            public void widgetSelected(SelectionEvent e) {
-                super.widgetSelected(e);
-
-                if (mResourceType == ResourceType.STRING) {
-                    // Special case: Use Extract String refactoring wizard UI
-                    String newName = createNewString();
-                    selectAddedItem(newName);
-                } else if (mResourceType == ResourceType.DRAWABLE) {
-                    // Special case: Use the "Create Icon Set" wizard
-                    OpenCreateAssetSetWizardAction action =
-                            new OpenCreateAssetSetWizardAction(mProject);
-                    action.run();
-                    List<IResource> files = action.getCreatedFiles();
-                    if (files != null && files.size() > 0) {
-                        String newName = AdtUtils.stripAllExtensions(files.get(0).getName());
-                        // Recompute the "current resource" to select the new id
-                        ResourceItem[] items = setupResourceList();
-                        selectItemName(newName, items);
-                    }
-                } else {
-                    if (ResourceHelper.isValueBasedResourceType(mResourceType)) {
-                        String newName = createNewValue(mResourceType);
-                        if (newName != null) {
-                            selectAddedItem(newName);
-                        }
-                    } else {
-                        String newName = createNewFile(mResourceType);
-                        if (newName != null) {
-                            selectAddedItem(newName);
-                        }
-                    }
-                }
-            }
-
-            private void selectAddedItem(@NonNull String newName) {
-                // Recompute the "current resource" to select the new id
-                ResourceItem[] items = setupResourceList();
-
-                // Ensure that the name is in the list. There's a delay after
-                // an item is added (until the builder runs and processes the delta)
-                // so if it's not in the list, add it
-                boolean found = false;
-                for (ResourceItem item : items) {
-                    if (newName.equals(item.getName())) {
-                        found = true;
-                        break;
-                    }
-                }
-                if (!found) {
-                    ResourceItem[] newItems = new ResourceItem[items.length + 1];
-                    System.arraycopy(items, 0, newItems, 0, items.length);
-                    newItems[items.length] = new ResourceItem(newName);
-                    items = newItems;
-                    Arrays.sort(items);
-                    setListElements(items);
-                    fFilteredList.setEnabled(newItems.length > 0);
-                }
-
-                selectItemName(newName, items);
-            }
-        });
-    }
-
-    /**
-     * Creates the value text field.
-     *
-     * @param top the parent composite
-     */
-    private void createValueField(Composite top) {
-        if (mShowValueText) {
-            mEditValueText = new Text(top, SWT.BORDER);
-            if (mCurrentResource != null) {
-                mEditValueText.setText(mCurrentResource);
-            }
-            mEditValueText.addModifyListener(this);
-
-            GridData data = new GridData();
-            data.grabExcessVerticalSpace = false;
-            data.grabExcessHorizontalSpace = true;
-            data.horizontalAlignment = GridData.FILL;
-            data.verticalAlignment = GridData.BEGINNING;
-            mEditValueText.setLayoutData(data);
-            mEditValueText.setFont(top.getFont());
-        }
-
-        if (mResourceResolver != null) {
-            mResolvedLabel = new Label(top, SWT.NONE);
-            GridData data = new GridData();
-            data.grabExcessVerticalSpace = false;
-            data.grabExcessHorizontalSpace = true;
-            data.horizontalAlignment = GridData.FILL;
-            data.verticalAlignment = GridData.BEGINNING;
-            mResolvedLabel.setLayoutData(data);
-        }
-
-        Composite workaround = PropertyFactory.addWorkaround(top);
-        if (workaround != null) {
-            workaround.setLayoutData(new GridData(SWT.LEFT, SWT.TOP, false, false, 1, 1));
-        }
-    }
-
-    private void updateResolvedLabel() {
-        if (mResourceResolver == null) {
-            return;
-        }
-
-        String v = null;
-        if (mCurrentResource != null) {
-            v = mCurrentResource;
-            if (mCurrentResource.startsWith(PREFIX_RESOURCE_REF)) {
-                ResourceValue value = mResourceResolver.findResValue(mCurrentResource, false);
-                if (value != null) {
-                    v = value.getValue();
-                }
-            }
-        }
-
-        if (v == null) {
-            v = "";
-        }
-
-        mResolvedLabel.setText(String.format("Resolved Value: %1$s", v));
-    }
-
-    @Override
-    protected void handleSelectionChanged() {
-        super.handleSelectionChanged();
-        if (mInputValidator != null) {
-            Object[] elements = getSelectedElements();
-            if (elements.length == 1 && elements[0] instanceof ResourceItem) {
-                ResourceItem item = (ResourceItem)elements[0];
-                String current = item.getXmlString(mResourceType, mSystemButton.getSelection());
-                String error = mInputValidator.isValid(current);
-                IStatus status;
-                if (error != null) {
-                    status = new Status(IStatus.ERROR, AdtPlugin.PLUGIN_ID, error);
-                } else {
-                    status = new Status(IStatus.OK, AdtPlugin.PLUGIN_ID, null);
-                }
-                updateStatus(status);
-            }
-        }
-
-        updateValue();
-    }
-
-    private void updateValue() {
-        if (mPreviewHelper != null) {
-            computeResult();
-            mPreviewHelper.updatePreview(mResourceType, mCurrentResource);
-        }
-
-        if (mShowValueText) {
-            if (mFirstSelect) {
-                mFirstSelect = false;
-                mEditValueText.selectAll();
-            } else {
-                computeResultFromSelection();
-                mEditValueText.setText(mCurrentResource != null ? mCurrentResource : "");
-            }
-        }
-
-        if (mResourceResolver != null) {
-            if (!mShowValueText) {
-                computeResultFromSelection();
-            }
-            updateResolvedLabel();
-        }
-    }
-
-    @Nullable
-    private String createNewFile(ResourceType type) {
-        // Show a name/value dialog entering the key name and the value
-        Shell shell = AdtPlugin.getShell();
-        if (shell == null) {
-            return null;
-        }
-
-        ResourceNameValidator validator = ResourceNameValidator.create(true /*allowXmlExtension*/,
-                mProject, mResourceType);
-        InputDialog d = new InputDialog(
-                AdtPlugin.getShell(),
-                "Enter name",  // title
-                "Enter name",
-                "", //$NON-NLS-1$
-                validator);
-        if (d.open() == Window.OK) {
-            String name = d.getValue().trim();
-            if (name.length() == 0) {
-                return null;
-            }
-
-            Pair<IFile, IRegion> resource = ResourceHelper.createResource(mProject, type, name,
-                    null);
-            if (resource != null) {
-                return name;
-            }
-        }
-
-        return null;
-    }
-
-
-    @Nullable
-    private String createNewValue(ResourceType type) {
-        // Show a name/value dialog entering the key name and the value
-        Shell shell = AdtPlugin.getShell();
-        if (shell == null) {
-            return null;
-        }
-        NameValueDialog dialog = new NameValueDialog(shell, getFilter());
-        if (dialog.open() != Window.OK) {
-            return null;
-        }
-
-        String name = dialog.getName();
-        String value = dialog.getValue();
-        if (name.length() == 0 || value.length() == 0) {
-            return null;
-        }
-
-        Pair<IFile, IRegion> resource = ResourceHelper.createResource(mProject, type, name, value);
-        if (resource != null) {
-            return name;
-        }
-
-        return null;
-    }
-
-    private String createNewString() {
-        ExtractStringRefactoring ref = new ExtractStringRefactoring(
-                mProject, true /*enforceNew*/);
-        RefactoringWizard wizard = new ExtractStringWizard(ref, mProject);
-        RefactoringWizardOpenOperation op = new RefactoringWizardOpenOperation(wizard);
-        try {
-            IWorkbench w = PlatformUI.getWorkbench();
-            if (op.run(w.getDisplay().getActiveShell(), wizard.getDefaultPageTitle()) ==
-                    IDialogConstants.OK_ID) {
-                return ref.getXmlStringId();
-            }
-        } catch (InterruptedException ex) {
-            // Interrupted. Pass.
-        }
-
-        return null;
-    }
-
-    /**
-     * Setups the current list.
-     */
-    private ResourceItem[] setupResourceList() {
-        Collection<ResourceItem> items = null;
-        if (mProjectButton.getSelection()) {
-            if (mProjectResources.size() == 1) {
-                items = mProjectResources.get(0).getResourceItemsOfType(mResourceType);
-            } else {
-                Map<String, ResourceItem> merged = Maps.newHashMapWithExpectedSize(200);
-                for (ResourceRepository repository : mProjectResources) {
-                    for (ResourceItem item : repository.getResourceItemsOfType(mResourceType)) {
-                        if (!merged.containsKey(item.getName())) {
-                            merged.put(item.getName(), item);
-                        }
-                    }
-                }
-                items = merged.values();
-            }
-        } else if (mSystemButton.getSelection()) {
-            items = mFrameworkResources.getResourceItemsOfType(mResourceType);
-        }
-
-        if (items == null) {
-            items = Collections.emptyList();
-        }
-
-        ResourceItem[] arrayItems = items.toArray(new ResourceItem[items.size()]);
-
-        // sort the array
-        Arrays.sort(arrayItems);
-
-        setListElements(arrayItems);
-        fFilteredList.setEnabled(arrayItems.length > 0);
-
-        return arrayItems;
-    }
-
-    /**
-     * Select an item by its name, if possible.
-     */
-    private void selectItemName(String itemName, ResourceItem[] items) {
-        if (itemName == null || items == null) {
-            return;
-        }
-
-        for (ResourceItem item : items) {
-            if (itemName.equals(item.getName())) {
-                setSelection(new Object[] { item });
-                break;
-            }
-        }
-    }
-
-    /**
-     * Select an item by its full resource string.
-     * This also selects between project and system repository based on the resource string.
-     */
-    private void selectResourceString(String resourceString) {
-        boolean isSystem = false;
-        String itemName = null;
-
-        if (resourceString != null) {
-            // Is this a system resource?
-            // If not a system resource or if they are not available, this will be a project res.
-            Matcher m = mSystemResourcePattern.matcher(resourceString);
-            if (m.matches()) {
-                itemName = m.group(1);
-                isSystem = true;
-            }
-
-            if (!isSystem && itemName == null) {
-                // Try to match project resource name
-                m = mProjectResourcePattern.matcher(resourceString);
-                if (m.matches()) {
-                    itemName = m.group(1);
-                }
-            }
-        }
-
-        // Update the repository selection
-        mProjectButton.setSelection(!isSystem);
-        mSystemButton.setSelection(isSystem);
-        updateNewButton(isSystem);
-
-        // Update the list
-        ResourceItem[] items = setupResourceList();
-
-        // If we have a selection name, select it
-        if (itemName != null) {
-            selectItemName(itemName, items);
-        }
-    }
-
-    private void updateNewButton(boolean isSystem) {
-        mNewButton.setEnabled(!isSystem && ResourceHelper.canCreateResourceType(mResourceType));
-    }
-
-    // ---- Implements ModifyListener ----
-
-    @Override
-    public void modifyText(ModifyEvent e) {
-       if (e.getSource() == mEditValueText && mResourceResolver != null) {
-           mCurrentResource = mEditValueText.getText();
-
-           if (mCurrentResource.startsWith(PREFIX_RESOURCE_REF)) {
-               if (mProjectResourcePattern.matcher(mCurrentResource).matches() ||
-                       mSystemResourcePattern.matcher(mCurrentResource).matches()) {
-                   updateResolvedLabel();
-               }
-           } else {
-               updateResolvedLabel();
-           }
-       }
-    }
-
-    /** Dialog asking for a Name/Value pair */
-    private class NameValueDialog extends SelectionStatusDialog implements Listener {
-        private org.eclipse.swt.widgets.Text mNameText;
-        private org.eclipse.swt.widgets.Text mValueText;
-        private String mInitialName;
-        private String mName;
-        private String mValue;
-        private ResourceNameValidator mValidator;
-
-        public NameValueDialog(Shell parent, String initialName) {
-            super(parent);
-            mInitialName = initialName;
-        }
-
-        @Override
-        protected Control createDialogArea(Composite parent) {
-            Composite container = new Composite(parent, SWT.NONE);
-            container.setLayout(new GridLayout(2, false));
-            GridData gridData = new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1);
-            // Wide enough to accommodate the error label
-            gridData.widthHint = 500;
-            container.setLayoutData(gridData);
-
-
-            Label nameLabel = new Label(container, SWT.NONE);
-            nameLabel.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1));
-            nameLabel.setText("Name:");
-
-            mNameText = new org.eclipse.swt.widgets.Text(container, SWT.BORDER);
-            mNameText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
-            if (mInitialName != null) {
-                mNameText.setText(mInitialName);
-                mNameText.selectAll();
-            }
-
-            Label valueLabel = new Label(container, SWT.NONE);
-            valueLabel.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1));
-            valueLabel.setText("Value:");
-
-            mValueText = new org.eclipse.swt.widgets.Text(container, SWT.BORDER);
-            mValueText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
-
-            mNameText.addListener(SWT.Modify, this);
-            mValueText.addListener(SWT.Modify, this);
-
-            validate();
-
-            return container;
-        }
-
-        @Override
-        protected void computeResult() {
-            mName = mNameText.getText().trim();
-            mValue = mValueText.getText().trim();
-        }
-
-        private String getName() {
-            return mName;
-        }
-
-        private String getValue() {
-            return mValue;
-        }
-
-        @Override
-        public void handleEvent(Event event) {
-            validate();
-        }
-
-        private void validate() {
-            IStatus status;
-            computeResult();
-            if (mName.length() == 0) {
-                status = new Status(IStatus.ERROR, AdtPlugin.PLUGIN_ID, "Enter a name");
-            } else if (mValue.length() == 0) {
-                status = new Status(IStatus.ERROR, AdtPlugin.PLUGIN_ID, "Enter a value");
-            } else {
-                if (mValidator == null) {
-                    mValidator = ResourceNameValidator.create(false, mProject, mResourceType);
-                }
-                String error = mValidator.isValid(mName);
-                if (error != null) {
-                    status = new Status(IStatus.ERROR, AdtPlugin.PLUGIN_ID, error);
-                } else {
-                    status = new Status(IStatus.OK, AdtPlugin.PLUGIN_ID, null);
-                }
-            }
-            updateStatus(status);
-        }
-    }
-
-    /**
-     * Open the resource chooser for the given type, associated with the given
-     * editor
-     *
-     * @param graphicalEditor the editor associated with the resource to be
-     *            chosen (used to find the associated Android target to be used
-     *            for framework resources etc)
-     * @param type the resource type to be chosen
-     * @param currentValue the current value, or null
-     * @param validator a validator to be used, or null
-     * @return the chosen resource, null if cancelled and "" if value should be
-     *         cleared
-     */
-    public static String chooseResource(
-            @NonNull GraphicalEditorPart graphicalEditor,
-            @NonNull ResourceType type,
-            String currentValue, IInputValidator validator) {
-        ResourceChooser chooser = create(graphicalEditor, type).
-                setCurrentResource(currentValue);
-        if (validator != null) {
-            // Ensure wide enough to accommodate validator error message
-            chooser.setSize(85, 10);
-            chooser.setInputValidator(validator);
-        }
-        int result = chooser.open();
-        if (result == ResourceChooser.CLEAR_RETURN_CODE) {
-            return ""; //$NON-NLS-1$
-        } else if (result == Window.OK) {
-            return chooser.getCurrentResource();
-        }
-
-        return null;
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/ui/ResourceContentProvider.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/ui/ResourceContentProvider.java
deleted file mode 100644
index d26dfaf..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/ui/ResourceContentProvider.java
+++ /dev/null
@@ -1,124 +0,0 @@
-/*
- * Copyright (C) 2007 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.ui;
-
-import com.android.ide.common.resources.ResourceFile;
-import com.android.ide.common.resources.ResourceItem;
-import com.android.ide.common.resources.ResourceRepository;
-import com.android.resources.ResourceType;
-
-import org.eclipse.jface.viewers.ITreeContentProvider;
-import org.eclipse.jface.viewers.Viewer;
-
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
-
-/**
- * Content provider for the Resource Explorer TreeView.
- * Each level of the tree is represented by a different class.
- * <ul>
- * <li>{@link ResourceType}. This represents the list of existing Resource Type present
- * in the resources. This can be matched to the subclasses inside the class <code>R</code>
- * </li>
- * <ul>
- * <li>{@link ResourceItem}. This represents one resource (which can existing in various alternate
- * versions). This is similar to the resource Ids defined as <code>R.sometype.id</code>.
- * </li>
- * <ul>
- * <li>{@link ResourceFile}. (optional) This represents a particular version of the
- * {@link ResourceItem}. It is displayed as a list of resource qualifier.
- * </li>
- * </ul>
- * </ul>
- * </ul>
- *
- * @see ResourceLabelProvider
- */
-public class ResourceContentProvider implements ITreeContentProvider {
-
-    /**
-     * The current ProjectResources being displayed.
-     */
-    private ResourceRepository mResources;
-
-    private boolean mFullLevels;
-
-   /**
-     * Constructs a new content providers for resource display.
-     * @param fullLevels if <code>true</code> the content provider will suppport all 3 levels. If
-     * <code>false</code>, only two levels are provided.
-     */
-    public ResourceContentProvider(boolean fullLevels) {
-        mFullLevels = fullLevels;
-    }
-
-    @Override
-    public Object[] getChildren(Object parentElement) {
-        if (parentElement instanceof ResourceType) {
-            Object[] array = mResources.getResourceItemsOfType(
-                    (ResourceType)parentElement).toArray();
-            Arrays.sort(array);
-            return array;
-        } else if (mFullLevels && parentElement instanceof ResourceItem) {
-            return ((ResourceItem)parentElement).getSourceFileArray();
-        }
-        return null;
-    }
-
-    @Override
-    public Object getParent(Object element) {
-        // pass
-        return null;
-    }
-
-    @Override
-    public boolean hasChildren(Object element) {
-        if (element instanceof ResourceType) {
-            return mResources.hasResourcesOfType((ResourceType)element);
-        } else if (mFullLevels && element instanceof ResourceItem) {
-            return ((ResourceItem)element).hasAlternates();
-        }
-        return false;
-    }
-
-    @Override
-    public Object[] getElements(Object inputElement) {
-        if (inputElement instanceof ResourceRepository) {
-            if ((ResourceRepository)inputElement == mResources) {
-                // get the top level resources.
-                List<ResourceType> types = mResources.getAvailableResourceTypes();
-                Collections.sort(types);
-                return types.toArray();
-            }
-        }
-
-        return new Object[0];
-    }
-
-    @Override
-    public void dispose() {
-        // pass
-    }
-
-    @Override
-    public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-        if (newInput instanceof ResourceRepository) {
-             mResources = (ResourceRepository)newInput;
-        }
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/ui/ResourceExplorerView.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/ui/ResourceExplorerView.java
deleted file mode 100644
index f48423c..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/ui/ResourceExplorerView.java
+++ /dev/null
@@ -1,353 +0,0 @@
-/*
- * Copyright (C) 2007 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.ui;
-
-import com.android.ide.common.resources.ResourceFile;
-import com.android.ide.common.resources.ResourceItem;
-import com.android.ide.eclipse.adt.AdtConstants;
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.ide.eclipse.adt.internal.resources.manager.GlobalProjectMonitor.IResourceEventListener;
-import com.android.ide.eclipse.adt.internal.resources.manager.ProjectResources;
-import com.android.ide.eclipse.adt.internal.resources.manager.ResourceManager;
-import com.android.ide.eclipse.adt.io.IFileWrapper;
-import com.android.io.IAbstractFile;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.jdt.core.IJavaElement;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.jface.viewers.DoubleClickEvent;
-import org.eclipse.jface.viewers.IDoubleClickListener;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.TreeViewer;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.SWTException;
-import org.eclipse.swt.events.ControlEvent;
-import org.eclipse.swt.events.ControlListener;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Tree;
-import org.eclipse.swt.widgets.TreeColumn;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IFileEditorInput;
-import org.eclipse.ui.ISelectionListener;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.ide.IDE;
-import org.eclipse.ui.part.ViewPart;
-
-import java.util.Iterator;
-
-/**
- * Resource Explorer View.
- * <p/>
- * This contains a basic Tree view, and uses a TreeViewer to handle the data.
- * <p/>
- * The view listener to change in selection in the workbench, and update to show the resource
- * of the project of the current selected item (either item in the package explorer, or of the
- * current editor).
- *
- * @see ResourceContentProvider
- */
-public class ResourceExplorerView extends ViewPart implements ISelectionListener,
-        IResourceEventListener {
-
-    // Note: keep using the obsolete SdkConstants.EDITORS_NAMESPACE (which used
-    // to be the Editors Plugin ID) to keep existing preferences functional.
-    private final static String PREFS_COLUMN_RES =
-        AdtConstants.EDITORS_NAMESPACE + "ResourceExplorer.Col1"; //$NON-NLS-1$
-    private final static String PREFS_COLUMN_2 =
-        AdtConstants.EDITORS_NAMESPACE + "ResourceExplorer.Col2"; //$NON-NLS-1$
-
-    private Tree mTree;
-    private TreeViewer mTreeViewer;
-
-    private IProject mCurrentProject;
-
-    public ResourceExplorerView() {
-    }
-
-    @Override
-    public void createPartControl(Composite parent) {
-        mTree = new Tree(parent, SWT.SINGLE | SWT.VIRTUAL);
-        mTree.setLayoutData(new GridData(GridData.FILL_BOTH));
-        mTree.setHeaderVisible(true);
-        mTree.setLinesVisible(true);
-
-        final IPreferenceStore store = AdtPlugin.getDefault().getPreferenceStore();
-
-        // create 2 columns. The main one with the resources, and an "info" column.
-        createTreeColumn(mTree, "Resources", SWT.LEFT,
-                "abcdefghijklmnopqrstuvwxz", -1, PREFS_COLUMN_RES, store); //$NON-NLS-1$
-        createTreeColumn(mTree, "Info", SWT.LEFT,
-                "0123456789", -1, PREFS_COLUMN_2, store); //$NON-NLS-1$
-
-        // create the jface wrapper
-        mTreeViewer = new TreeViewer(mTree);
-
-        mTreeViewer.setContentProvider(new ResourceContentProvider(true /* fullLevels */));
-        mTreeViewer.setLabelProvider(new ResourceLabelProvider());
-
-        // listen to selection change in the workbench.
-        IWorkbenchPage page = getSite().getPage();
-
-        page.addSelectionListener(this);
-
-        // init with current selection
-        selectionChanged(getSite().getPart(), page.getSelection());
-
-        // add support for double click.
-        mTreeViewer.addDoubleClickListener(new IDoubleClickListener() {
-            @Override
-            public void doubleClick(DoubleClickEvent event) {
-                ISelection sel = event.getSelection();
-
-                if (sel instanceof IStructuredSelection) {
-                    IStructuredSelection selection = (IStructuredSelection) sel;
-
-                    if (selection.size() == 1) {
-                        Object element = selection.getFirstElement();
-
-                        // if it's a resourceFile, we directly open it.
-                        if (element instanceof ResourceFile) {
-                            try {
-                                IAbstractFile iAbstractFile = ((ResourceFile)element).getFile();
-                                if (iAbstractFile instanceof IFileWrapper) {
-                                    IDE.openEditor(getSite().getWorkbenchWindow().getActivePage(),
-                                            ((IFileWrapper)iAbstractFile).getIFile());
-                                }
-                            } catch (PartInitException e) {
-                            }
-                        } else if (element instanceof ResourceItem) {
-                            // if it's a ResourceItem, we open the first file, but only if
-                            // there's no alternate files.
-                            ResourceItem item = (ResourceItem)element;
-
-                            if (item.isEditableDirectly()) {
-                                ResourceFile[] files = item.getSourceFileArray();
-                                if (files[0] != null) {
-                                    try {
-                                        IAbstractFile iAbstractFile = files[0].getFile();
-                                        if (iAbstractFile instanceof IFileWrapper) {
-                                            IDE.openEditor(
-                                                    getSite().getWorkbenchWindow().getActivePage(),
-                                                    ((IFileWrapper)iAbstractFile).getIFile());
-                                        }
-                                    } catch (PartInitException e) {
-                                    }
-                                }
-                            }
-                        }
-                    }
-                }
-            }
-        });
-
-        // set up the resource manager to send us resource change notification
-        AdtPlugin.getDefault().getResourceMonitor().addResourceEventListener(this);
-    }
-
-    @Override
-    public void dispose() {
-        AdtPlugin.getDefault().getResourceMonitor().removeResourceEventListener(this);
-
-        super.dispose();
-    }
-
-    @Override
-    public void setFocus() {
-        mTree.setFocus();
-    }
-
-    /**
-     * Processes a new selection.
-     */
-    @Override
-    public void selectionChanged(IWorkbenchPart part, ISelection selection) {
-        // first we test if the part is an editor.
-        if (part instanceof IEditorPart) {
-            // if it is, we check if it's a file editor.
-            IEditorInput input = ((IEditorPart)part).getEditorInput();
-
-            if (input instanceof IFileEditorInput) {
-                // from the file editor we can get the IFile object, and from it, the IProject.
-                IFile file = ((IFileEditorInput)input).getFile();
-
-                // get the file project
-                IProject project = file.getProject();
-
-                handleProjectSelection(project);
-            }
-        } else if (selection instanceof IStructuredSelection) {
-            // if it's not an editor, we look for structured selection.
-            for (Iterator<?> it = ((IStructuredSelection) selection).iterator();
-                    it.hasNext();) {
-                Object element = it.next();
-                IProject project = null;
-
-                // if we are in the navigator or package explorer, the selection could contain a
-                // IResource object.
-                if (element instanceof IResource) {
-                    project = ((IResource) element).getProject();
-                } else if (element instanceof IJavaElement) {
-                    // if we are in the package explorer on a java element, we handle that too.
-                    IJavaElement javaElement = (IJavaElement)element;
-                    IJavaProject javaProject = javaElement.getJavaProject();
-                    if (javaProject != null) {
-                        project = javaProject.getProject();
-                    }
-                } else if (element instanceof IAdaptable) {
-                    // finally we try to get a project object from IAdaptable.
-                    project = (IProject) ((IAdaptable) element)
-                            .getAdapter(IProject.class);
-                }
-
-                // if we found a project, handle it, and return.
-                if (project != null) {
-                    if (handleProjectSelection(project)) {
-                        return;
-                    }
-                }
-            }
-        }
-    }
-
-    /**
-     * Handles a project selection.
-     * @param project the new selected project
-     * @return true if the project could be processed.
-     */
-    private boolean handleProjectSelection(IProject project) {
-        try {
-            // if it's an android project, then we get its resources, and feed them
-            // to the tree viewer.
-            if (project.hasNature(AdtConstants.NATURE_DEFAULT)) {
-                if (mCurrentProject != project) {
-                    ProjectResources projRes = ResourceManager.getInstance().getProjectResources(
-                            project);
-                    if (projRes != null) {
-                        mTreeViewer.setInput(projRes);
-                        mCurrentProject = project;
-                        return true;
-                    }
-                }
-            }
-        } catch (CoreException e) {
-        }
-
-        return false;
-    }
-
-    /**
-     * Create a TreeColumn with the specified parameters. If a
-     * <code>PreferenceStore</code> object and a preference entry name String
-     * object are provided then the column will listen to change in its width
-     * and update the preference store accordingly.
-     *
-     * @param parent The Table parent object
-     * @param header The header string
-     * @param style The column style
-     * @param sample_text A sample text to figure out column width if preference
-     *            value is missing
-     * @param fixedSize a fixed size. If != -1 the column is non resizable
-     * @param pref_name The preference entry name for column width
-     * @param prefs The preference store
-     */
-    public void createTreeColumn(Tree parent, String header, int style,
-            String sample_text, int fixedSize, final String pref_name,
-            final IPreferenceStore prefs) {
-
-        // create the column
-        TreeColumn col = new TreeColumn(parent, style);
-
-        if (fixedSize != -1) {
-            col.setWidth(fixedSize);
-            col.setResizable(false);
-        } else {
-            // if there is no pref store or the entry is missing, we use the sample
-            // text and pack the column.
-            // Otherwise we just read the width from the prefs and apply it.
-            if (prefs == null || prefs.contains(pref_name) == false) {
-                col.setText(sample_text);
-                col.pack();
-
-                // init the prefs store with the current value
-                if (prefs != null) {
-                    prefs.setValue(pref_name, col.getWidth());
-                }
-            } else {
-                col.setWidth(prefs.getInt(pref_name));
-            }
-
-            // if there is a pref store and a pref entry name, then we setup a
-            // listener to catch column resize to put the new width value into the store.
-            if (prefs != null && pref_name != null) {
-                col.addControlListener(new ControlListener() {
-                    @Override
-                    public void controlMoved(ControlEvent e) {
-                    }
-
-                    @Override
-                    public void controlResized(ControlEvent e) {
-                        // get the new width
-                        int w = ((TreeColumn)e.widget).getWidth();
-
-                        // store in pref store
-                        prefs.setValue(pref_name, w);
-                    }
-                });
-            }
-        }
-
-        // set the header
-        col.setText(header);
-    }
-
-    /**
-     * Processes a start in a resource event change.
-     */
-    @Override
-    public void resourceChangeEventStart() {
-        // pass
-    }
-
-    /**
-     * Processes the end of a resource change event.
-     */
-    @Override
-    public void resourceChangeEventEnd() {
-        try {
-            mTree.getDisplay().asyncExec(new Runnable() {
-                @Override
-                public void run() {
-                    if (mTree.isDisposed() == false) {
-                        mTreeViewer.refresh();
-                    }
-                }
-            });
-        } catch (SWTException e) {
-            // display is disposed. nothing to do.
-        }
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/ui/ResourceLabelProvider.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/ui/ResourceLabelProvider.java
deleted file mode 100644
index 5bf8615..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/ui/ResourceLabelProvider.java
+++ /dev/null
@@ -1,142 +0,0 @@
-/*
- * Copyright (C) 2007 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.ui;
-
-import com.android.ide.common.resources.ResourceFile;
-import com.android.ide.common.resources.ResourceItem;
-import com.android.resources.ResourceType;
-
-import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.jface.viewers.ILabelProviderListener;
-import org.eclipse.jface.viewers.ITableLabelProvider;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.ui.ISharedImages;
-import org.eclipse.ui.PlatformUI;
-
-/**
- * Label provider for the Resource Explorer TreeView.
- * Each level of the tree is represented by a different class.
- * <ul>
- * <li>{@link ResourceType}. This represents the list of existing Resource Type present
- * in the resources. This can be matched to the subclasses inside the class <code>R</code>
- * </li>
- * <ul>
- * <li>{@link ResourceItem}. This represents one resource. The actual type can be
- * {@link ConfigurableResourceItem} (which can exist in various alternate versions),
- * or {@link IdResourceItem}.
- * This is similar to the resource Ids defined as <code>R.sometype.id</code>.
- * </li>
- * <ul>
- * <li>{@link ResourceFile}. This represents a particular version of the {@link ResourceItem}.
- * It is displayed as a list of resource qualifier.
- * </li>
- * </ul>
- * </ul>
- * </ul>
- *
- * @see ResourceContentProvider
- */
-public class ResourceLabelProvider implements ILabelProvider, ITableLabelProvider {
-    private Image mWarningImage;
-
-    public ResourceLabelProvider() {
-        mWarningImage = PlatformUI.getWorkbench().getSharedImages().getImageDescriptor(
-                ISharedImages.IMG_OBJS_WARN_TSK).createImage();
-    }
-
-    /**
-     * @see #getColumnImage(Object, int)
-     */
-    @Override
-    public Image getImage(Object element) {
-        // pass
-        return null;
-    }
-
-    /**
-     * @see #getColumnText(Object, int)
-     */
-    @Override
-    public String getText(Object element) {
-        return getColumnText(element, 0);
-    }
-
-    @Override
-    public void addListener(ILabelProviderListener listener) {
-        // pass
-    }
-
-    @Override
-    public void dispose() {
-        mWarningImage.dispose();
-    }
-
-    @Override
-    public boolean isLabelProperty(Object element, String property) {
-        return false;
-    }
-
-    @Override
-    public void removeListener(ILabelProviderListener listener) {
-        // pass
-    }
-
-    @Override
-    public Image getColumnImage(Object element, int columnIndex) {
-        if (columnIndex == 1) {
-            if (element instanceof ResourceItem) {
-                ResourceItem item = (ResourceItem)element;
-                if (item.hasDefault() == false) {
-                    return mWarningImage;
-                }
-            }
-        }
-        return null;
-    }
-
-    @Override
-    public String getColumnText(Object element, int columnIndex) {
-        switch (columnIndex) {
-            case 0:
-                if (element instanceof ResourceType) {
-                    return ((ResourceType)element).getDisplayName();
-                } else if (element instanceof ResourceItem) {
-                    return ((ResourceItem)element).getName();
-                } else if (element instanceof ResourceFile) {
-                    return ((ResourceFile)element).getFolder().getConfiguration().toDisplayString();
-                }
-                break;
-            case 1:
-                if (element instanceof ResourceItem) {
-                    ResourceItem item = (ResourceItem)element;
-                    if (item.isDeclaredInline()) {
-                        return "Declared inline";
-                    } else {
-                        int count = item.getAlternateCount();
-                        if (count > 0) {
-                            if (item.hasDefault()) {
-                                count++;
-                            }
-                            return String.format("%1$d version(s)", count);
-                        }
-                    }
-                }
-                return null;
-        }
-        return null;
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/ui/ResourcePreviewHelper.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/ui/ResourcePreviewHelper.java
deleted file mode 100644
index afd1df9..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/ui/ResourcePreviewHelper.java
+++ /dev/null
@@ -1,195 +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.eclipse.adt.internal.ui;
-
-import static com.android.SdkConstants.DOT_9PNG;
-import static com.android.utils.SdkUtils.endsWithIgnoreCase;
-
-import com.android.ide.common.rendering.api.ResourceValue;
-import com.android.ide.common.resources.ResourceResolver;
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.ide.eclipse.adt.internal.editors.layout.gle2.GraphicalEditorPart;
-import com.android.ide.eclipse.adt.internal.editors.layout.gle2.ImageControl;
-import com.android.ide.eclipse.adt.internal.editors.layout.gle2.ImageUtils;
-import com.android.ide.eclipse.adt.internal.editors.layout.gle2.RenderService;
-import com.android.ide.eclipse.adt.internal.editors.layout.gle2.SwtUtils;
-import com.android.ide.eclipse.adt.internal.resources.ResourceHelper;
-import com.android.resources.ResourceType;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.jface.dialogs.DialogTray;
-import org.eclipse.jface.dialogs.TrayDialog;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.RGB;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Label;
-
-import java.awt.image.BufferedImage;
-import java.io.File;
-import java.io.IOException;
-
-import javax.imageio.ImageIO;
-
-/**
- * The {@link ResourcePreviewHelper} provides help to {@link TrayDialog} resource choosers
- * where some resources (such as drawables and colors) are previewed in the tray area.
- */
-public class ResourcePreviewHelper {
-    /**
-     * The width of the preview rendering
-     * <p>
-     * TODO: Make the preview rendering resize if the tray area is resized
-     */
-    private static final int WIDTH = 100;
-    /** The height of the preview rendering */
-    private static final int HEIGHT = 100;
-
-    private final GraphicalEditorPart mEditor;
-    private final TrayDialog mTrayDialog;
-
-    private boolean mShowingPreview;
-    private DialogTray mPreviewTray;
-    private ImageControl mPreviewImageControl;
-
-    /**
-     * Constructs a new {@link ResourcePreviewHelper}.
-     * <p>
-     * TODO: Add support for performing previews without an associated graphical editor,
-     * such as previewing icons from the manifest form editor; just pick default
-     * configuration settings in that case.
-     *
-     * @param trayDialog the associated tray-capable dialog
-     * @param editor a graphical editor. This is currently needed in order to provide
-     *            configuration data for the rendering.
-     */
-    public ResourcePreviewHelper(TrayDialog trayDialog, GraphicalEditorPart editor) {
-        this.mTrayDialog = trayDialog;
-        this.mEditor = editor;
-    }
-
-    /**
-     * Updates the preview based on the current selection and resource type, possibly
-     * hiding or opening the tray in the process.
-     *
-     * @param type the resource type for the selected resource
-     * @param resource the full resource url
-     */
-    public void updatePreview(ResourceType type, String resource) {
-        boolean showPreview = type == ResourceType.DRAWABLE || type == ResourceType.COLOR;
-        if (showPreview) {
-            if (mPreviewTray == null) {
-                mPreviewTray = new DialogTray() {
-                    @Override
-                    protected Control createContents(Composite parent) {
-                        // This creates a centered image control
-                        Composite panel = new Composite(parent, SWT.NONE);
-                        panel.setLayout(new GridLayout(3, false));
-                        Label dummy1 = new Label(panel, SWT.NONE);
-                        dummy1.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, true, true, 1, 1));
-                        mPreviewImageControl = new ImageControl(panel, SWT.NONE, SwtUtils
-                                .createEmptyImage(parent.getDisplay(), WIDTH, HEIGHT));
-                        GridData gd = new GridData(SWT.CENTER, SWT.CENTER, false, false, 1, 1);
-                        gd.widthHint = WIDTH;
-                        gd.heightHint = HEIGHT;
-                        mPreviewImageControl.setLayoutData(gd);
-                        Label dummy2 = new Label(panel, SWT.NONE);
-                        dummy2.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, true, true, 1, 1));
-
-                        return panel;
-                    }
-
-                };
-            }
-
-            if (!mShowingPreview) {
-                mTrayDialog.openTray(mPreviewTray);
-            }
-
-            BufferedImage image = null;
-            try {
-                if (type == ResourceType.COLOR) {
-                    ResourceResolver resources = mEditor.getResourceResolver();
-                    ResourceValue value = resources.findResValue(resource, false);
-                    if (value != null) {
-                        RGB color = ResourceHelper.resolveColor(resources, value);
-                        if (color != null) {
-                            image = ImageUtils.createColoredImage(WIDTH, HEIGHT, color);
-                        }
-                    }
-                } else {
-                    assert type == ResourceType.DRAWABLE;
-
-                    ResourceResolver resources = mEditor.getResourceResolver();
-                    ResourceValue drawable = resources.findResValue(resource, false);
-                    if (drawable != null) {
-                        String path = drawable.getValue();
-
-                        // Special-case image files (other than 9-patch files) and render these
-                        // directly, in order to provide proper aspect ratio handling and
-                        // to handle scaling to show the full contents:
-                        if (ImageUtils.hasImageExtension(path)
-                                && !endsWithIgnoreCase(path, DOT_9PNG)) {
-                            File file = new File(path);
-                            if (file.exists()) {
-                                try {
-                                    image = ImageIO.read(file);
-                                    int width = image.getWidth();
-                                    int height = image.getHeight();
-                                    if (width > WIDTH || height > HEIGHT) {
-                                        double xScale = WIDTH / (double) width;
-                                        double yScale = HEIGHT / (double) height;
-                                        double scale = Math.min(xScale, yScale);
-                                        image = ImageUtils.scale(image, scale, scale);
-                                    }
-                                } catch (IOException e) {
-                                    AdtPlugin.log(e, "Can't read preview image %1$s", path);
-                                }
-                            }
-                        }
-
-                        if (image == null) {
-                            RenderService renderService = RenderService.create(mEditor);
-                            renderService.setOverrideRenderSize(WIDTH, HEIGHT);
-                            image = renderService.renderDrawable(drawable);
-                        }
-                    }
-                }
-            } catch (Throwable t) {
-                // Some kind of rendering error occurred. However, we don't want to use
-                //    AdtPlugin.log(t, "Can't generate preview for %1$s", resource);
-                // because if it's a severe type of error (such as an InternalError shown
-                // in issue #18623) then a dialog will pop up and interfere with the
-                // preview, so just log a warning (unfortunately without the trace) instead.
-                AdtPlugin.log(IStatus.WARNING, "Can't generate preview for %1$s", resource);
-            }
-
-            Display display = mEditor.getSite().getShell().getDisplay();
-            if (image != null) {
-                mPreviewImageControl.setImage(SwtUtils.convertToSwt(display, image, true, -1));
-            } else {
-                mPreviewImageControl.setImage(SwtUtils.createEmptyImage(display, WIDTH, HEIGHT));
-            }
-            mPreviewImageControl.redraw();
-        } else if (mPreviewTray != null && mShowingPreview) {
-            mTrayDialog.closeTray();
-        }
-        mShowingPreview = showPreview;
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/ui/WizardDialogEx.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/ui/WizardDialogEx.java
deleted file mode 100755
index ee1ac97..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/ui/WizardDialogEx.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Copyright (C) 2009 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.ui;
-
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.jface.wizard.IWizard;
-import org.eclipse.jface.wizard.WizardDialog;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Shell;
-
-/**
- * A {@link WizardDialog} that gives access to some inner controls.
- */
-public final class WizardDialogEx extends WizardDialog {
-
-    /**
-     * @see WizardDialog#WizardDialog(Shell, IWizard)
-     */
-    public WizardDialogEx(Shell parentShell, IWizard newWizard) {
-        super(parentShell, newWizard);
-    }
-
-    /**
-     * Returns the cancel button.
-     * <p/>
-     * Note: there is already a protected, deprecated method that does the same thing.
-     * To avoid overriding a deprecated method, the name as be changed to ...Ex.
-     */
-    public Button getCancelButtonEx() {
-        return getButton(IDialogConstants.CANCEL_ID);
-    }
-}
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
deleted file mode 100644
index bfe301e..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/utils/FingerprintUtils.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- * 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/welcome/AdtStartup.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/welcome/AdtStartup.java
deleted file mode 100644
index b07893d..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/welcome/AdtStartup.java
+++ /dev/null
@@ -1,366 +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.eclipse.adt.internal.welcome;
-
-import com.android.SdkConstants;
-import com.android.annotations.Nullable;
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.ide.eclipse.adt.AdtPlugin.CheckSdkErrorHandler;
-import com.android.ide.eclipse.adt.internal.editors.layout.gle2.LayoutWindowCoordinator;
-import com.android.ide.eclipse.adt.internal.preferences.AdtPrefs;
-import com.android.ide.eclipse.base.InstallDetails;
-import com.android.utils.GrabProcessOutput;
-import com.android.utils.GrabProcessOutput.IProcessOutput;
-import com.android.utils.GrabProcessOutput.Wait;
-import com.android.sdkstats.DdmsPreferenceStore;
-import com.android.sdkstats.SdkStatsService;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.core.runtime.Plugin;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.core.runtime.jobs.Job;
-import org.eclipse.jface.wizard.WizardDialog;
-import org.eclipse.osgi.service.datalocation.Location;
-import org.eclipse.ui.IStartup;
-import org.eclipse.ui.IWindowListener;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PlatformUI;
-import org.osgi.framework.Constants;
-import org.osgi.framework.Version;
-
-import java.io.File;
-import java.io.IOException;
-import java.util.concurrent.atomic.AtomicReference;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-/**
- * ADT startup tasks (other than those performed in {@link AdtPlugin#start(org.osgi.framework.BundleContext)}
- * when the plugin is initializing.
- * <p>
- * The main tasks currently performed are:
- * <ul>
- *   <li> See if the user has ever run the welcome wizard, and if not, run it
- *   <li> Ping the usage statistics server, if enabled by the user. This is done here
- *       rather than during the plugin start since this task is run later (when the workspace
- *       is fully initialized) and we want to ask the user for permission for usage
- *       tracking before running it (and if we don't, then the usage tracking permissions
- *       dialog will run instead.)
- * </ul>
- */
-public class AdtStartup implements IStartup, IWindowListener {
-
-    private DdmsPreferenceStore mStore = new DdmsPreferenceStore();
-
-    @Override
-    public void earlyStartup() {
-        if (!isSdkSpecified()) {
-            File bundledSdk = getBundledSdk();
-            if (bundledSdk != null) {
-                AdtPrefs.getPrefs().setSdkLocation(bundledSdk);
-            }
-        }
-
-        boolean showSdkInstallationPage = !isSdkSpecified() && isFirstTime();
-        boolean showOptInDialogPage = !mStore.hasPingId();
-
-        if (showSdkInstallationPage || showOptInDialogPage) {
-            showWelcomeWizard(showSdkInstallationPage, showOptInDialogPage);
-        }
-
-        if (mStore.isPingOptIn()) {
-            sendUsageStats();
-        }
-
-        initializeWindowCoordinator();
-
-        AdtPlugin.getDefault().workbenchStarted();
-    }
-
-    private boolean isSdkSpecified() {
-        String osSdkFolder = AdtPrefs.getPrefs().getOsSdkFolder();
-        return (osSdkFolder != null && !osSdkFolder.isEmpty());
-    }
-
-    /**
-     * Returns the path to the bundled SDK if this is part of the ADT package.
-     * The ADT package has the following structure:
-     *   root
-     *      |--eclipse
-     *      |--sdk
-     * @return path to bundled SDK, null if no valid bundled SDK detected.
-     */
-    private File getBundledSdk() {
-        Location install = Platform.getInstallLocation();
-        if (install != null && install.getURL() != null) {
-            File toolsFolder = new File(install.getURL().getFile()).getParentFile();
-            if (toolsFolder != null) {
-                File sdkFolder = new File(toolsFolder, "sdk");
-                if (sdkFolder.exists() && AdtPlugin.getDefault().checkSdkLocationAndId(
-                        sdkFolder.getAbsolutePath(),
-                        new SdkValidator())) {
-                    return sdkFolder;
-                }
-            }
-        }
-
-        return null;
-    }
-
-    private boolean isFirstTime() {
-        for (int i = 0; i < 2; i++) {
-            String osSdkPath = null;
-
-            if (i == 0) {
-                // If we've recorded an SDK location in the .android settings, then the user
-                // has run ADT before but possibly in a different workspace. We don't want to pop up
-                // the welcome wizard each time if we can simply use the existing SDK install.
-                osSdkPath = mStore.getLastSdkPath();
-            } else if (i == 1) {
-                osSdkPath = getSdkPathFromWindowsRegistry();
-            }
-
-            if (osSdkPath != null && osSdkPath.length() > 0) {
-                boolean ok = new File(osSdkPath).isDirectory();
-
-                if (!ok) {
-                    osSdkPath = osSdkPath.trim();
-                    ok = new File(osSdkPath).isDirectory();
-                }
-
-                if (ok) {
-                    // Verify that the SDK is valid
-                    ok = AdtPlugin.getDefault().checkSdkLocationAndId(
-                            osSdkPath, new SdkValidator());
-                    if (ok) {
-                        // Yes, we've seen an SDK location before and we can use it again,
-                        // no need to pester the user with the welcome wizard.
-                        // This also implies that the user has responded to the usage statistics
-                        // question.
-                        AdtPrefs.getPrefs().setSdkLocation(new File(osSdkPath));
-                        return false;
-                    }
-                }
-            }
-        }
-
-        // Check whether we've run this wizard before.
-        return !mStore.isAdtUsed();
-    }
-
-    private static class SdkValidator extends AdtPlugin.CheckSdkErrorHandler {
-        @Override
-        public boolean handleError(
-                CheckSdkErrorHandler.Solution solution,
-                String message) {
-            return false;
-        }
-
-        @Override
-        public boolean handleWarning(
-                CheckSdkErrorHandler.Solution  solution,
-                String message) {
-            return true;
-        }
-    }
-
-    private String getSdkPathFromWindowsRegistry() {
-        if (SdkConstants.CURRENT_PLATFORM != SdkConstants.PLATFORM_WINDOWS) {
-            return null;
-        }
-
-        final String valueName = "Path";                                               //$NON-NLS-1$
-        final AtomicReference<String> result = new AtomicReference<String>();
-        final Pattern regexp =
-            Pattern.compile("^\\s+" + valueName + "\\s+REG_SZ\\s+(.*)$");//$NON-NLS-1$ //$NON-NLS-2$
-
-        for (String key : new String[] {
-                "HKLM\\Software\\Android SDK Tools",                                   //$NON-NLS-1$
-                "HKLM\\Software\\Wow6432Node\\Android SDK Tools" }) {                  //$NON-NLS-1$
-
-            String[] command = new String[] {
-                "reg", "query", key, "/v", valueName       //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-            };
-
-            Process process;
-            try {
-                process = Runtime.getRuntime().exec(command);
-
-                GrabProcessOutput.grabProcessOutput(
-                        process,
-                        Wait.WAIT_FOR_READERS,
-                        new IProcessOutput() {
-                            @Override
-                            public void out(@Nullable String line) {
-                                if (line != null) {
-                                    Matcher m = regexp.matcher(line);
-                                    if (m.matches()) {
-                                        result.set(m.group(1));
-                                    }
-                                }
-                            }
-
-                            @Override
-                            public void err(@Nullable String line) {
-                                // ignore stderr
-                            }
-                        });
-            } catch (IOException ignore) {
-            } catch (InterruptedException ignore) {
-            }
-
-            String str = result.get();
-            if (str != null) {
-                if (new File(str).isDirectory()) {
-                    return str;
-                }
-                str = str.trim();
-                if (new File(str).isDirectory()) {
-                    return str;
-                }
-            }
-        }
-
-        return null;
-    }
-
-    private void initializeWindowCoordinator() {
-        final IWorkbench workbench = PlatformUI.getWorkbench();
-        workbench.addWindowListener(this);
-        workbench.getDisplay().asyncExec(new Runnable() {
-            @Override
-            public void run() {
-                for (IWorkbenchWindow window : workbench.getWorkbenchWindows()) {
-                    LayoutWindowCoordinator.get(window, true /*create*/);
-                }
-            }
-        });
-    }
-
-    private void showWelcomeWizard(final boolean showSdkInstallPage,
-            final boolean showUsageOptInPage) {
-        final IWorkbench workbench = PlatformUI.getWorkbench();
-        workbench.getDisplay().asyncExec(new Runnable() {
-            @Override
-            public void run() {
-                IWorkbenchWindow window = workbench.getActiveWorkbenchWindow();
-                if (window != null) {
-                    WelcomeWizard wizard = new WelcomeWizard(mStore, showSdkInstallPage,
-                            showUsageOptInPage);
-                    WizardDialog dialog = new WizardDialog(window.getShell(), wizard);
-                    dialog.open();
-                }
-
-                // Record the fact that we've run the wizard so we don't attempt to do it again,
-                // even if the user just cancels out of the wizard.
-                mStore.setAdtUsed(true);
-
-                if (mStore.isPingOptIn()) {
-                    sendUsageStats();
-                }
-            }
-        });
-    }
-
-    private void sendUsageStats() {
-        // Ping the usage server and parse the SDK content.
-        // This is deferred in separate jobs to avoid blocking the bundle start.
-        // We also serialize them to avoid too many parallel jobs when Eclipse starts.
-        Job pingJob = createPingUsageServerJob();
-        // build jobs are run after other interactive jobs
-        pingJob.setPriority(Job.BUILD);
-        // Wait another 30 seconds before starting the ping job. This gives other
-        // startup tasks time to finish since it's not vital to get the usage ping
-        // immediately.
-        pingJob.schedule(30000 /*milliseconds*/);
-    }
-
-    /**
-     * Creates a job than can ping the usage server.
-     */
-    private Job createPingUsageServerJob() {
-        // In order to not block the plugin loading, so we spawn another thread.
-        Job job = new Job("Android SDK Ping") {  // Job name, visible in progress view
-            @Override
-            protected IStatus run(IProgressMonitor monitor) {
-                try {
-                    pingUsageServer();
-
-                    return Status.OK_STATUS;
-                } catch (Throwable t) {
-                    AdtPlugin.log(t, "pingUsageServer failed");       //$NON-NLS-1$
-                    return new Status(IStatus.ERROR, AdtPlugin.PLUGIN_ID,
-                            "pingUsageServer failed", t);    //$NON-NLS-1$
-                }
-            }
-        };
-        return job;
-    }
-
-    private static Version getVersion(Plugin plugin) {
-        @SuppressWarnings("cast") // Cast required in Eclipse 3.5; prevent auto-removal in 3.7
-        String version = (String) plugin.getBundle().getHeaders().get(Constants.BUNDLE_VERSION);
-        // Parse the string using the Version class.
-        return new Version(version);
-    }
-
-    /**
-     * Pings the usage start server.
-     */
-    private void pingUsageServer() {
-        // Report the version of the ADT plugin to the stat server
-        Version version = getVersion(AdtPlugin.getDefault());
-        String adtVersionString = String.format("%1$d.%2$d.%3$d", version.getMajor(), //$NON-NLS-1$
-                version.getMinor(), version.getMicro());
-
-        // Report the version of Eclipse to the stat server.
-        // Get the version of eclipse by getting the version of one of the runtime plugins.
-        Version eclipseVersion = InstallDetails.getPlatformVersion();
-        String eclipseVersionString = String.format("%1$d.%2$d",  //$NON-NLS-1$
-                eclipseVersion.getMajor(), eclipseVersion.getMinor());
-
-        SdkStatsService stats = new SdkStatsService();
-        stats.ping("adt", adtVersionString); //$NON-NLS-1$
-        stats.ping("eclipse", eclipseVersionString); //$NON-NLS-1$
-    }
-
-    // ---- Implements IWindowListener ----
-
-    @Override
-    public void windowActivated(IWorkbenchWindow window) {
-    }
-
-    @Override
-    public void windowDeactivated(IWorkbenchWindow window) {
-    }
-
-    @Override
-    public void windowClosed(IWorkbenchWindow window) {
-        LayoutWindowCoordinator listener = LayoutWindowCoordinator.get(window, false /*create*/);
-        if (listener != null) {
-            listener.dispose();
-        }
-    }
-
-    @Override
-    public void windowOpened(IWorkbenchWindow window) {
-        LayoutWindowCoordinator.get(window, true /*create*/);
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/welcome/UsagePermissionPage.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/welcome/UsagePermissionPage.java
deleted file mode 100644
index d8413bb..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/welcome/UsagePermissionPage.java
+++ /dev/null
@@ -1,148 +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.eclipse.adt.internal.welcome;
-
-import com.android.sdkstats.SdkStatsPermissionDialog;
-
-import org.eclipse.jface.dialogs.IMessageProvider;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.jface.wizard.WizardPage;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Link;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.browser.IWebBrowser;
-
-import java.net.URL;
-
-/** Page which displays the permission dialog for collecting usage statistics */
-public class UsagePermissionPage extends WizardPage implements SelectionListener {
-    private Link mLink;
-    private Button mYesRadio;
-    private Button mNoRadio;
-
-    /**
-     * Create the wizard.
-     */
-    public UsagePermissionPage() {
-        super("usageData");
-        setTitle("Contribute Usage Statistics?");
-        setDescription(SdkStatsPermissionDialog.NOTICE_TEXT);
-    }
-
-    /**
-     * Create contents of the wizard.
-     *
-     * @param parent parent to create page into
-     */
-    @Override
-    public void createControl(Composite parent) {
-        Composite container = new Composite(parent, SWT.NULL);
-
-        setControl(container);
-        container.setLayout(new GridLayout(1, false));
-
-        Label label = new Label(container, SWT.WRAP);
-        GridData gd_lblByChoosingTo = new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1);
-        gd_lblByChoosingTo.widthHint = 580;
-        label.setLayoutData(gd_lblByChoosingTo);
-        label.setText(SdkStatsPermissionDialog.BODY_TEXT);
-
-        Label blankLine = new Label(container, SWT.NONE);
-
-        Label questionLabel = new Label(container, SWT.NONE);
-        questionLabel.setText("Send usage statistics to Google?");
-
-        mYesRadio = new Button(container, SWT.RADIO);
-        mYesRadio.setText("Yes");
-        mYesRadio.addSelectionListener(this);
-
-        mNoRadio = new Button(container, SWT.RADIO);
-        mNoRadio.setText("No");
-        mNoRadio.addSelectionListener(this);
-
-        Label laterLabel = new Label(container, SWT.WRAP);
-        GridData gdLaterLabel = new GridData(SWT.FILL, SWT.BOTTOM, false, true, 1, 1);
-        gdLaterLabel.widthHint = 580;
-        laterLabel.setLayoutData(gdLaterLabel);
-        laterLabel.setText("If you later decide to change this setting, you can do so in the " +
-               "options panel under Android > Usage Stats");
-
-        mLink = new Link(container, SWT.NONE);
-        mLink.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1));
-        mLink.setText(SdkStatsPermissionDialog.PRIVACY_POLICY_LINK_TEXT);
-        mLink.addSelectionListener(this);
-
-        validatePage();
-    }
-
-    @Override
-    public void setVisible(boolean visible) {
-        super.setVisible(visible);
-        mYesRadio.setFocus();
-    }
-
-    boolean isUsageCollectionApproved() {
-        return mYesRadio.getSelection();
-    }
-
-    @Override
-    public void widgetSelected(SelectionEvent event) {
-        if (event.getSource() == mLink) {
-            try {
-                IWorkbench workbench = PlatformUI.getWorkbench();
-                IWebBrowser browser = workbench.getBrowserSupport().getExternalBrowser();
-                browser.openURL(new URL(event.text));
-            } catch (Exception e) {
-                String message = String.format("Could not open browser. Vist\n%1$s\ninstead.",
-                        event.text);
-                MessageDialog.openError(getWizard().getContainer().getShell(),
-                        "Browser Error", message);
-            }
-        } else {
-            // Radio buttons selected
-            validatePage();
-        }
-    }
-
-    @Override
-    public void widgetDefaultSelected(SelectionEvent e) {
-    }
-
-    private void validatePage() {
-        String error = null;
-
-        if (!mYesRadio.getSelection() && !mNoRadio.getSelection()) {
-            error = "Select Yes or No";
-        }
-
-        setPageComplete(error == null);
-        if (error != null) {
-            setMessage(error, IMessageProvider.ERROR);
-        } else {
-            setErrorMessage(null);
-            setMessage(null);
-        }
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/welcome/WelcomeWizard.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/welcome/WelcomeWizard.java
deleted file mode 100644
index 916924e..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/welcome/WelcomeWizard.java
+++ /dev/null
@@ -1,207 +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.eclipse.adt.internal.welcome;
-
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.ide.eclipse.adt.internal.preferences.AdtPrefs;
-import com.android.ide.eclipse.adt.internal.sdk.AdtConsoleSdkLog;
-import com.android.sdkstats.DdmsPreferenceStore;
-import com.android.sdkuilib.internal.repository.ui.AdtUpdateDialog;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.wizard.Wizard;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PlatformUI;
-
-import java.io.File;
-import java.util.HashSet;
-import java.util.Set;
-
-/**
- * Wizard shown on first start for new users: configure SDK location, accept or
- * reject usage data collection, etc
- */
-public class WelcomeWizard extends Wizard {
-    private final DdmsPreferenceStore mStore;
-
-    private WelcomeWizardPage mWelcomePage;
-    private UsagePermissionPage mUsagePage;
-
-    private final boolean mShowWelcomePage;
-    private final boolean mShowUsagePage;
-
-    /**
-     * Creates a new {@link WelcomeWizard}
-     *
-     * @param store preferences for usage statistics collection etc
-     * @param showInstallSdkPage show page to install SDK's
-     * @param showUsageOptinPage show page to get user consent for usage data collection
-     */
-    public WelcomeWizard(DdmsPreferenceStore store, boolean showInstallSdkPage,
-            boolean showUsageOptinPage) {
-        mStore = store;
-        mShowWelcomePage = showInstallSdkPage;
-        mShowUsagePage = showUsageOptinPage;
-
-        setWindowTitle("Welcome to Android Development");
-        ImageDescriptor image = AdtPlugin.getImageDescriptor("icons/android-64.png"); //$NON-NLS-1$
-        setDefaultPageImageDescriptor(image);
-    }
-
-    @Override
-    public void addPages() {
-        if (mShowWelcomePage) {
-            mWelcomePage = new WelcomeWizardPage();
-            addPage(mWelcomePage);
-        }
-
-        // It's possible that the user has already run the command line tools
-        // such as ddms and has agreed to usage statistics collection, but has never
-        // run ADT which is why the wizard was opened. No need to ask again.
-        if (mShowUsagePage && !mStore.hasPingId()) {
-            mUsagePage = new UsagePermissionPage();
-            addPage(mUsagePage);
-        }
-    }
-
-    @Override
-    public boolean performFinish() {
-        if (mUsagePage != null) {
-            boolean isUsageCollectionApproved = mUsagePage.isUsageCollectionApproved();
-            DdmsPreferenceStore store = new DdmsPreferenceStore();
-
-            // Workaround: Store a new ping id if one doesn't exist, regardless of
-            // whether usage statistics gathering is enabled, to ensure that ddms and
-            // ADT agree upon whether usage data collection is enabled. The reason this
-            // is necessary is that the Eclipse PreferenceStore optimizes out writing
-            // property values that equal their default values, and in our case, the
-            // default value for usage-collection is "false", so it just doesn't write
-            // it into the config file is the user opts out - which means that nothing
-            // is written in ddms.config. That works in the sense that the getter returns
-            // "usage collection"=false, but it doesn't work in the sense that it looks
-            // like the property has not yet been decided by the user. DDMS will look at
-            // the existence of a ping id to see whether we've already considered the
-            // question, so do the same here.
-            if (!store.hasPingId()) {
-                store.generateNewPingId();
-            }
-
-            store.setPingOptIn(isUsageCollectionApproved);
-        }
-
-        if (mWelcomePage != null) {
-            // Read out wizard settings immediately; we will perform the actual work
-            // after the wizard window has been taken down and it's too late to read the
-            // settings then
-            final File path = mWelcomePage.getPath();
-            final boolean installCommon = mWelcomePage.isInstallCommon();
-            final boolean installLatest = mWelcomePage.isInstallLatest();
-            final boolean createNew = mWelcomePage.isCreateNew();
-
-            // Perform installation asynchronously since it takes a while.
-            getShell().getDisplay().asyncExec(new Runnable() {
-                @Override
-                public void run() {
-                    if (createNew) {
-                        try {
-                            Set<Integer> apiLevels = new HashSet<Integer>();
-                            if (installCommon) {
-                                apiLevels.add(8);
-                            }
-                            if (installLatest) {
-                                apiLevels.add(AdtUpdateDialog.USE_MAX_REMOTE_API_LEVEL);
-                            }
-                            installSdk(path, apiLevels);
-                        } catch (Exception e) {
-                            AdtPlugin.logAndPrintError(e, "ADT Welcome Wizard",
-                                    "Installation failed");
-                        }
-                    }
-
-                    // Set SDK path after installation since this will trigger a SDK refresh.
-                    AdtPrefs.getPrefs().setSdkLocation(path);
-                }
-            });
-        }
-
-        // The wizard always succeeds, even if installation fails or is aborted
-        return true;
-    }
-
-    /**
-     * Trigger the install window. It will connect to the repository, display
-     * a confirmation window showing which packages are selected for install
-     * and display a progress dialog during installation.
-     */
-    private boolean installSdk(File path, Set<Integer> apiLevels) {
-        if (!path.isDirectory()) {
-            if (!path.mkdirs()) {
-                AdtPlugin.logAndPrintError(null, "ADT Welcome Wizard",
-                        "Failed to create directory %1$s",
-                        path.getAbsolutePath());
-                return false;
-            }
-        }
-
-        // Get a shell to use for the SDK installation. There are cases where getActiveShell
-        // returns null so attempt to obtain it through other means.
-        Display display = AdtPlugin.getDisplay();
-        Shell shell = display.getActiveShell();
-        if (shell == null) {
-            IWorkbench workbench = PlatformUI.getWorkbench();
-            IWorkbenchWindow window = workbench.getActiveWorkbenchWindow();
-            if (window != null) {
-                shell = window.getShell();
-            }
-        }
-        boolean disposeShell = false;
-        if (shell == null) {
-            shell = new Shell(display);
-            AdtPlugin.log(IStatus.WARNING, "No parent shell for SDK installation dialog");
-            disposeShell = true;
-        }
-
-        AdtUpdateDialog updater = new AdtUpdateDialog(
-                shell,
-                new AdtConsoleSdkLog(),
-                path.getAbsolutePath());
-        // Note: we don't have to specify tools & platform-tools since they
-        // are required dependencies of any platform.
-        boolean result = updater.installNewSdk(apiLevels);
-
-        // TODO: Install extra package here as well since it is now core to most of
-        // the templates
-        // if (result) {
-        //     updater.installExtraPackage(vendor, path);
-        // }
-
-        if (disposeShell) {
-            shell.dispose();
-        }
-
-        if (!result) {
-            AdtPlugin.printErrorToConsole("Failed to install Android SDK.");
-            return false;
-        }
-
-        return true;
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/welcome/WelcomeWizardPage.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/welcome/WelcomeWizardPage.java
deleted file mode 100644
index bcee887..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/welcome/WelcomeWizardPage.java
+++ /dev/null
@@ -1,302 +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.eclipse.adt.internal.welcome;
-
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.ide.eclipse.adt.AdtPlugin.CheckSdkErrorHandler;
-
-import org.eclipse.jface.dialogs.IMessageProvider;
-import org.eclipse.jface.wizard.WizardPage;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.DirectoryDialog;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Text;
-
-import java.io.File;
-import java.util.concurrent.atomic.AtomicReference;
-
-/** Main page shown in the {@link WelcomeWizard} */
-public class WelcomeWizardPage extends WizardPage implements ModifyListener, SelectionListener {
-    private Text mExistingDirText;
-    private Button mExistingDirButton;
-    private Button mInstallLatestCheckbox;
-    private Button mInstallCommonCheckbox;
-    private Button mInstallNewRadio;
-    private Button mUseExistingRadio;
-    private Text mNewDirText;
-    private Button mNewDirButton;
-
-    /**
-     * Create the wizard.
-     */
-    public WelcomeWizardPage() {
-        super("welcomePage");
-        setTitle("Welcome to Android Development");
-        setDescription("Configure SDK");
-    }
-
-    /**
-     * Create contents of the wizard.
-     * @param parent parent widget to add page to
-     */
-    @Override
-    @SuppressWarnings("unused") // SWT constructors have side effects so "new Label" is not unused
-    public void createControl(Composite parent) {
-        Composite container = new Composite(parent, SWT.NULL);
-
-        setControl(container);
-        container.setLayout(new GridLayout(4, false));
-
-        Label overviewLabel = new Label(container, SWT.WRAP | SWT.SHADOW_NONE);
-        GridData gdOverviewLabel = new GridData(SWT.FILL, SWT.CENTER, false, false, 4, 1);
-        gdOverviewLabel.widthHint = 580;
-        overviewLabel.setLayoutData(gdOverviewLabel);
-        overviewLabel.setText("To develop for Android, you need an Android SDK, and at least one version of the Android APIs to compile against. You may also want additional versions of Android to test with.");
-
-        Label spacing = new Label(container, SWT.NONE);
-        spacing.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false, 4, 1));
-
-        mInstallNewRadio = new Button(container, SWT.RADIO);
-        mInstallNewRadio.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false, 4, 1));
-        mInstallNewRadio.setSelection(true);
-        mInstallNewRadio.setText("Install new SDK");
-        mInstallNewRadio.addSelectionListener(this);
-
-        Label indentLabel = new Label(container, SWT.NONE);
-        GridData gdIndentLabel = new GridData(SWT.LEFT, SWT.CENTER, false, false, 1, 1);
-        gdIndentLabel.widthHint = 20;
-        indentLabel.setLayoutData(gdIndentLabel);
-
-        mInstallLatestCheckbox = new Button(container, SWT.CHECK);
-        mInstallLatestCheckbox.setSelection(true);
-        mInstallLatestCheckbox.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false, 3,
-                1));
-        mInstallLatestCheckbox.setText("Install the latest available version of Android APIs (supports all the latest features)");
-        mInstallLatestCheckbox.addSelectionListener(this);
-
-        new Label(container, SWT.NONE);
-        mInstallCommonCheckbox = new Button(container, SWT.CHECK);
-        mInstallCommonCheckbox.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false, 3,
-                1));
-        mInstallCommonCheckbox.setText("Install Android 2.2, a version which is supported by ~96% phones and tablets");
-        mInstallCommonCheckbox.addSelectionListener(this);
-
-        new Label(container, SWT.NONE);
-        Label addHintLabel = new Label(container, SWT.NONE);
-        addHintLabel.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false, 3, 1));
-        addHintLabel.setText("     (You can add additional platforms using the SDK Manager.)");
-
-        new Label(container, SWT.NONE);
-        Label targetLabel = new Label(container, SWT.NONE);
-        targetLabel.setText("Target Location:");
-
-        mNewDirText = new Text(container, SWT.BORDER);
-        mNewDirText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
-        String defaultPath = System.getProperty("user.home") + File.separator + "android-sdks"; //$NON-NLS-1$
-        mNewDirText.setText(defaultPath);
-        mNewDirText.addModifyListener(this);
-
-        mNewDirButton = new Button(container, SWT.FLAT);
-        mNewDirButton.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1));
-        mNewDirButton.setText("Browse...");
-        mNewDirButton.addSelectionListener(this);
-
-        Label spacing2 = new Label(container, SWT.NONE);
-        spacing2.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false, 4, 1));
-
-        mUseExistingRadio = new Button(container, SWT.RADIO);
-        mUseExistingRadio.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false, 4, 1));
-        mUseExistingRadio.setText("Use existing SDKs");
-        mUseExistingRadio.addSelectionListener(this);
-
-        new Label(container, SWT.NONE);
-        Label installationLabel = new Label(container, SWT.NONE);
-        installationLabel.setText("Existing Location:");
-
-        mExistingDirText = new Text(container, SWT.BORDER);
-        mExistingDirText.setEnabled(false);
-        mExistingDirText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
-        mExistingDirText.addModifyListener(this);
-
-        mExistingDirButton = new Button(container, SWT.FLAT);
-        mExistingDirButton.setEnabled(false);
-        mExistingDirButton.setText("Browse...");
-        mExistingDirButton.addSelectionListener(this);
-    }
-
-    boolean isCreateNew() {
-        return mInstallNewRadio.getSelection();
-    }
-
-    boolean isInstallLatest() {
-        return mInstallLatestCheckbox.getSelection();
-    }
-
-    boolean isInstallCommon() {
-        return mInstallCommonCheckbox.getSelection();
-    }
-
-    File getPath() {
-        Text text = isCreateNew() ? mNewDirText : mExistingDirText;
-        return new File(text.getText());
-    }
-
-    @Override
-    public void widgetSelected(SelectionEvent e) {
-        Object source = e.getSource();
-
-        if (source == mExistingDirButton) {
-            DirectoryDialog dialog = new DirectoryDialog(mExistingDirButton.getShell(), SWT.OPEN);
-            String file = dialog.open();
-            String path = mExistingDirText.getText().trim();
-            if (path.length() > 0) {
-                // TODO: Shouldn't this be done before the open() call?
-                dialog.setFilterPath(path);
-            }
-            if (file != null) {
-                mExistingDirText.setText(file);
-            }
-        } else if (source == mNewDirButton) {
-            DirectoryDialog dialog = new DirectoryDialog(mNewDirButton.getShell(), SWT.OPEN);
-            String path = mNewDirText.getText().trim();
-            if (path.length() > 0) {
-                dialog.setFilterPath(path);
-            }
-            String file = dialog.open();
-            if (file != null) {
-                mNewDirText.setText(file);
-            }
-        } else if (source == mInstallNewRadio) {
-            mExistingDirButton.setEnabled(false);
-            mExistingDirText.setEnabled(false);
-            mNewDirButton.setEnabled(true);
-            mNewDirText.setEnabled(true);
-        } else if (source == mUseExistingRadio) {
-            mExistingDirButton.setEnabled(true);
-            mExistingDirText.setEnabled(true);
-            mNewDirButton.setEnabled(false);
-            mNewDirText.setEnabled(false);
-        }
-
-        validatePage();
-    }
-
-    @Override
-    public void widgetDefaultSelected(SelectionEvent e) {
-    }
-
-    @Override
-    public void modifyText(ModifyEvent e) {
-        validatePage();
-    }
-
-    private void validatePage() {
-        String error = null;
-        String warning = null;
-
-        if (isCreateNew()) {
-            // Make sure that the target installation directory is empty or doesn't exist
-            // (and that it can be created)
-            String path = mNewDirText.getText().trim();
-            if (path.length() == 0) {
-                error = "Please enter a new directory to install the SDK into";
-            } else {
-                File file = new File(path);
-                if (file.exists()) {
-                    if (file.isDirectory()) {
-                        if (!file.canWrite()) {
-                            error = "Missing write permission in target directory";
-                        }
-                        File[] children = file.listFiles();
-                        if (children != null && children.length > 0) {
-                            warning = "The directory is not empty";
-                        }
-                    } else {
-                        error = "The target must be a directory";
-                    }
-                } else {
-                    File parent = file.getParentFile();
-                    if (parent == null || !parent.exists()) {
-                        error = "The parent directory does not exist";
-                    } else if (!parent.canWrite()) {
-                        error = "No write permission in parent directory";
-                    }
-                }
-            }
-
-            if (error == null && !mInstallLatestCheckbox.getSelection()
-                    && !mInstallCommonCheckbox.getSelection()) {
-                error = "You must choose at least one Android version to install";
-            }
-        } else {
-            // Make sure that the existing installation directory exists and is valid
-            String path = mExistingDirText.getText().trim();
-            if (path.length() == 0) {
-                error = "Please enter an existing SDK installation directory";
-            } else {
-                File file = new File(path);
-                if (!file.exists()) {
-                    error = "The chosen installation directory does not exist";
-                } else {
-                    final AtomicReference<String> errorReference = new AtomicReference<String>();
-                    final AtomicReference<String> warningReference = new AtomicReference<String>();
-                    AdtPlugin.getDefault().checkSdkLocationAndId(path,
-                            new AdtPlugin.CheckSdkErrorHandler() {
-                        @Override
-                        public boolean handleError(
-                                CheckSdkErrorHandler.Solution solution,
-                                String message) {
-                            message = message.replaceAll("\n", " "); //$NON-NLS-1$ //$NON-NLS-2$
-                            errorReference.set(message);
-                            return false;  // Apply/OK must be disabled
-                        }
-
-                        @Override
-                        public boolean handleWarning(
-                                CheckSdkErrorHandler.Solution solution,
-                                String message) {
-                            message = message.replaceAll("\n", " "); //$NON-NLS-1$ //$NON-NLS-2$
-                            warningReference.set(message);
-                            return true;  // Apply/OK must be enabled
-                        }
-                    });
-                    error = errorReference.get();
-                    if (warning == null) {
-                        warning = warningReference.get();
-                    }
-                }
-            }
-        }
-
-        setPageComplete(error == null);
-        if (error != null) {
-            setMessage(error, IMessageProvider.ERROR);
-        } else if (warning != null) {
-            setMessage(warning, IMessageProvider.WARNING);
-        } else {
-            setErrorMessage(null);
-            setMessage(null);
-        }
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/actions/ExportAction.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/actions/ExportAction.java
deleted file mode 100644
index 4d3870b..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/actions/ExportAction.java
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
- * Copyright (C) 2007 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.wizards.actions;
-
-import com.android.ide.eclipse.adt.internal.lint.EclipseLintRunner;
-import com.android.ide.eclipse.adt.internal.project.ExportHelper;
-import com.android.ide.eclipse.adt.internal.sdk.ProjectState;
-import com.android.ide.eclipse.adt.internal.sdk.Sdk;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.IObjectActionDelegate;
-import org.eclipse.ui.IWorkbenchPart;
-
-public class ExportAction implements IObjectActionDelegate {
-
-    private ISelection mSelection;
-    private Shell mShell;
-
-    /**
-     * @see IObjectActionDelegate#setActivePart(IAction, IWorkbenchPart)
-     */
-    @Override
-    public void setActivePart(IAction action, IWorkbenchPart targetPart) {
-        mShell = targetPart.getSite().getShell();
-    }
-
-    @Override
-    public void run(IAction action) {
-        if (mSelection instanceof IStructuredSelection) {
-            IStructuredSelection selection = (IStructuredSelection)mSelection;
-            // get the unique selected item.
-            if (selection.size() == 1) {
-                Object element = selection.getFirstElement();
-
-                // get the project object from it.
-                IProject project = null;
-                if (element instanceof IProject) {
-                    project = (IProject) element;
-                } else if (element instanceof IAdaptable) {
-                    project = (IProject) ((IAdaptable) element).getAdapter(IProject.class);
-                }
-
-                // and finally do the action
-                if (project != null) {
-                    if (!EclipseLintRunner.runLintOnExport(mShell, project)) {
-                        return;
-                    }
-
-                    ProjectState state = Sdk.getProjectState(project);
-                    if (state.isLibrary()) {
-                        MessageDialog.openError(mShell, "Android Export",
-                                "Android library projects cannot be exported.");
-                    } else {
-                        ExportHelper.exportUnsignedReleaseApk(project);
-                    }
-                }
-            }
-        }
-    }
-
-    @Override
-    public void selectionChanged(IAction action, ISelection selection) {
-        mSelection = selection;
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/actions/ExportWizardAction.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/actions/ExportWizardAction.java
deleted file mode 100644
index 673d956..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/actions/ExportWizardAction.java
+++ /dev/null
@@ -1,94 +0,0 @@
-/*
- * 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.wizards.actions;
-
-import com.android.ide.eclipse.adt.internal.lint.EclipseLintRunner;
-import com.android.ide.eclipse.adt.internal.sdk.ProjectState;
-import com.android.ide.eclipse.adt.internal.sdk.Sdk;
-import com.android.ide.eclipse.adt.internal.wizards.export.ExportWizard;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.wizard.WizardDialog;
-import org.eclipse.ui.IObjectActionDelegate;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchPart;
-
-public class ExportWizardAction implements IObjectActionDelegate {
-
-    private ISelection mSelection;
-    private IWorkbench mWorkbench;
-
-    /**
-     * @see IObjectActionDelegate#setActivePart(IAction, IWorkbenchPart)
-     */
-    @Override
-    public void setActivePart(IAction action, IWorkbenchPart targetPart) {
-        mWorkbench = targetPart.getSite().getWorkbenchWindow().getWorkbench();
-    }
-
-    @Override
-    public void run(IAction action) {
-        if (mSelection instanceof IStructuredSelection) {
-            IStructuredSelection selection = (IStructuredSelection)mSelection;
-
-            // get the unique selected item.
-            if (selection.size() == 1) {
-                Object element = selection.getFirstElement();
-
-                // get the project object from it.
-                IProject project = null;
-                if (element instanceof IProject) {
-                    project = (IProject) element;
-                } else if (element instanceof IAdaptable) {
-                    project = (IProject) ((IAdaptable) element).getAdapter(IProject.class);
-                }
-
-                // and finally do the action
-                if (project != null) {
-                    if (!EclipseLintRunner.runLintOnExport(
-                            mWorkbench.getActiveWorkbenchWindow().getShell(), project)) {
-                        return;
-                    }
-
-                    ProjectState state = Sdk.getProjectState(project);
-                    if (state.isLibrary()) {
-                        MessageDialog.openError(mWorkbench.getDisplay().getActiveShell(),
-                                "Android Export",
-                                "Android library projects cannot be exported.");
-                    } else {
-                        // call the export wizard on the current selection.
-                        ExportWizard wizard = new ExportWizard();
-                        wizard.init(mWorkbench, selection);
-                        WizardDialog dialog = new WizardDialog(
-                                mWorkbench.getDisplay().getActiveShell(), wizard);
-                        dialog.open();
-                    }
-                }
-            }
-        }
-    }
-
-    @Override
-    public void selectionChanged(IAction action, ISelection selection) {
-        mSelection = selection;
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/actions/NewProjectAction.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/actions/NewProjectAction.java
deleted file mode 100644
index 38f4768..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/actions/NewProjectAction.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Copyright (C) 2009 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.wizards.actions;
-
-import com.android.ide.eclipse.adt.internal.wizards.templates.NewProjectWizard;
-
-import org.eclipse.jface.action.IAction;
-import org.eclipse.ui.IWorkbenchWizard;
-
-/**
- * Delegate for the toolbar action "Android Project".
- * It displays the Android New Project wizard to create a new Android Project (not a test project).
- *
- * @see NewTestProjectAction
- */
-public class NewProjectAction extends OpenWizardAction {
-
-    @Override
-    protected IWorkbenchWizard instanciateWizard(IAction action) {
-        return new NewProjectWizard();
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/actions/NewTestProjectAction.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/actions/NewTestProjectAction.java
deleted file mode 100755
index c8e45ef..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/actions/NewTestProjectAction.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Copyright (C) 2009 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.wizards.actions;
-
-import com.android.ide.eclipse.adt.internal.wizards.newproject.NewTestProjectWizard;
-
-import org.eclipse.jface.action.IAction;
-import org.eclipse.ui.IWorkbenchWizard;
-
-/**
- * Delegate for the toolbar action "Android Test Project".
- * It displays the Android New Project wizard to create a new Test Project.
- */
-public class NewTestProjectAction extends OpenWizardAction {
-
-    @Override
-    protected IWorkbenchWizard instanciateWizard(IAction action) {
-        return new NewTestProjectWizard();
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/actions/NewXmlFileAction.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/actions/NewXmlFileAction.java
deleted file mode 100644
index ba349c3..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/actions/NewXmlFileAction.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Copyright (C) 2009 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.wizards.actions;
-
-import com.android.ide.eclipse.adt.internal.wizards.newxmlfile.NewXmlFileWizard;
-
-import org.eclipse.jface.action.IAction;
-import org.eclipse.ui.IWorkbenchWizard;
-
-/**
- * Delegate for the toolbar action "Android Project" or for the
- * project > Android Project context menu.
- * 
- * It displays the Android New XML file wizard.
- */
-public class NewXmlFileAction extends OpenWizardAction {
-
-    @Override
-    protected IWorkbenchWizard instanciateWizard(IAction action) {
-        return new NewXmlFileWizard();
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/actions/OpenWizardAction.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/actions/OpenWizardAction.java
deleted file mode 100644
index a3e6135..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/actions/OpenWizardAction.java
+++ /dev/null
@@ -1,183 +0,0 @@
-/*
- * Copyright (C) 2009 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.wizards.actions;
-
-import com.android.ide.eclipse.adt.internal.ui.IUpdateWizardDialog;
-import com.android.ide.eclipse.adt.internal.ui.WizardDialogEx;
-
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IObjectActionDelegate;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.IWorkbenchWindowActionDelegate;
-import org.eclipse.ui.IWorkbenchWizard;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.internal.IWorkbenchHelpContextIds;
-import org.eclipse.ui.internal.LegacyResourceSupport;
-import org.eclipse.ui.internal.actions.NewWizardShortcutAction;
-import org.eclipse.ui.internal.util.Util;
-
-/**
- * An abstract action that displays one of our wizards.
- * Derived classes must provide the actual wizard to display.
- */
-/*package*/ abstract class OpenWizardAction
-    implements IWorkbenchWindowActionDelegate, IObjectActionDelegate {
-
-    /**
-     * The wizard dialog width, extracted from {@link NewWizardShortcutAction}
-     */
-    private static final int SIZING_WIZARD_WIDTH = 500;
-
-    /**
-     * The wizard dialog height, extracted from {@link NewWizardShortcutAction}
-     */
-    private static final int SIZING_WIZARD_HEIGHT = 500;
-
-    /** The wizard that was created by {@link #run(IAction)}. */
-    private IWorkbenchWizard mWizard;
-    /** The result from the dialog */
-    private int mDialogResult;
-
-    private ISelection mSelection;
-    private IWorkbench mWorkbench;
-
-    /** Returns the wizard that was created by {@link #run(IAction)}. */
-    public IWorkbenchWizard getWizard() {
-        return mWizard;
-    }
-
-    /** Returns the result from {@link Dialog#open()}, available after
-     * the completion of {@link #run(IAction)}. */
-    public int getDialogResult() {
-        return mDialogResult;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.IWorkbenchWindowActionDelegate#dispose()
-     */
-    @Override
-    public void dispose() {
-        // pass
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.IWorkbenchWindowActionDelegate#init(org.eclipse.ui.IWorkbenchWindow)
-     */
-    @Override
-    public void init(IWorkbenchWindow window) {
-        // pass
-    }
-
-    /**
-     * Opens and display the Android New Project Wizard.
-     * <p/>
-     * Most of this implementation is extracted from {@link NewWizardShortcutAction#run()}.
-     *
-     * @param action The action that got us here. Can be null when used internally.
-     * @see org.eclipse.ui.IActionDelegate#run(org.eclipse.jface.action.IAction)
-     */
-    @Override
-    public void run(IAction action) {
-
-        // get the workbench and the current window
-        IWorkbench workbench = mWorkbench != null ? mWorkbench : PlatformUI.getWorkbench();
-        IWorkbenchWindow window = workbench.getActiveWorkbenchWindow();
-
-        // This code from NewWizardShortcutAction#run() gets the current window selection
-        // and converts it to a workbench structured selection for the wizard, if possible.
-        ISelection selection = mSelection;
-        if (selection == null) {
-            selection = window.getSelectionService().getSelection();
-        }
-
-        IStructuredSelection selectionToPass = StructuredSelection.EMPTY;
-        if (selection instanceof IStructuredSelection) {
-            selectionToPass = (IStructuredSelection) selection;
-        } else {
-            // Build the selection from the IFile of the editor
-            IWorkbenchPart part = window.getPartService().getActivePart();
-            if (part instanceof IEditorPart) {
-                IEditorInput input = ((IEditorPart) part).getEditorInput();
-                Class<?> fileClass = LegacyResourceSupport.getFileClass();
-                if (input != null && fileClass != null) {
-                    Object file = Util.getAdapter(input, fileClass);
-                    if (file != null) {
-                        selectionToPass = new StructuredSelection(file);
-                    }
-                }
-            }
-        }
-
-        // Create the wizard and initialize it with the selection
-        mWizard = instanciateWizard(action);
-        mWizard.init(workbench, selectionToPass);
-
-        // It's not visible yet until a dialog is created and opened
-        Shell parent = window.getShell();
-        WizardDialogEx dialog = new WizardDialogEx(parent, mWizard);
-        dialog.create();
-
-        if (mWizard instanceof IUpdateWizardDialog) {
-            ((IUpdateWizardDialog) mWizard).updateWizardDialog(dialog);
-        }
-
-        // This code comes straight from NewWizardShortcutAction#run()
-        Point defaultSize = dialog.getShell().getSize();
-        dialog.getShell().setSize(
-                Math.max(SIZING_WIZARD_WIDTH, defaultSize.x),
-                Math.max(SIZING_WIZARD_HEIGHT, defaultSize.y));
-        window.getWorkbench().getHelpSystem().setHelp(dialog.getShell(),
-                IWorkbenchHelpContextIds.NEW_WIZARD_SHORTCUT);
-
-        mDialogResult = dialog.open();
-    }
-
-    /**
-     * Called by {@link #run(IAction)} to instantiate the actual wizard.
-     *
-     * @param action The action parameter from {@link #run(IAction)}.
-     *               This can be null.
-     * @return A new wizard instance. Must not be null.
-     */
-    protected abstract IWorkbenchWizard instanciateWizard(IAction action);
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.IActionDelegate#selectionChanged(org.eclipse.jface.action.IAction, org.eclipse.jface.viewers.ISelection)
-     */
-    @Override
-    public void selectionChanged(IAction action, ISelection selection) {
-        mSelection = selection;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.IObjectActionDelegate#setActivePart(org.eclipse.jface.action.IAction, org.eclipse.ui.IWorkbenchPart)
-     */
-    @Override
-    public void setActivePart(IAction action, IWorkbenchPart targetPart) {
-        mWorkbench = targetPart.getSite().getWorkbenchWindow().getWorkbench();
-    }
-}
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
deleted file mode 100644
index 170da6d..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/export/ExportWizard.java
+++ /dev/null
@@ -1,626 +0,0 @@
-/*
- * 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.wizards.export;
-
-import com.android.annotations.Nullable;
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.ide.eclipse.adt.internal.sdk.ProjectState;
-import com.android.ide.eclipse.adt.internal.sdk.Sdk;
-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;
-import com.android.sdklib.BuildToolInfo;
-import com.android.sdklib.BuildToolInfo.PathId;
-import com.android.sdklib.internal.build.DebugKeyProvider.IKeyGenOutput;
-import com.android.sdklib.internal.build.KeystoreHelper;
-import com.android.utils.GrabProcessOutput;
-import com.android.utils.GrabProcessOutput.IProcessOutput;
-import com.android.utils.GrabProcessOutput.Wait;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.jface.operation.IRunnableWithProgress;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.wizard.Wizard;
-import org.eclipse.jface.wizard.WizardPage;
-import org.eclipse.swt.events.VerifyEvent;
-import org.eclipse.swt.events.VerifyListener;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.ui.IExportWizard;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.PlatformUI;
-
-import java.io.ByteArrayOutputStream;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.io.PrintStream;
-import java.lang.reflect.InvocationTargetException;
-import java.security.KeyStore;
-import java.security.KeyStore.PrivateKeyEntry;
-import java.security.PrivateKey;
-import java.security.cert.X509Certificate;
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * Export wizard to export an apk signed with a release key/certificate.
- */
-public final class ExportWizard extends Wizard implements IExportWizard {
-
-    private static final String PROJECT_LOGO_LARGE = "icons/android-64.png"; //$NON-NLS-1$
-
-    private static final String PAGE_PROJECT_CHECK = "Page_ProjectCheck"; //$NON-NLS-1$
-    private static final String PAGE_KEYSTORE_SELECTION = "Page_KeystoreSelection"; //$NON-NLS-1$
-    private static final String PAGE_KEY_CREATION = "Page_KeyCreation"; //$NON-NLS-1$
-    private static final String PAGE_KEY_SELECTION = "Page_KeySelection"; //$NON-NLS-1$
-    private static final String PAGE_KEY_CHECK = "Page_KeyCheck"; //$NON-NLS-1$
-
-    static final String PROPERTY_KEYSTORE = "keystore"; //$NON-NLS-1$
-    static final String PROPERTY_ALIAS = "alias"; //$NON-NLS-1$
-    static final String PROPERTY_DESTINATION = "destination"; //$NON-NLS-1$
-
-    static final int APK_FILE_SOURCE = 0;
-    static final int APK_FILE_DEST = 1;
-    static final int APK_COUNT = 2;
-
-    /**
-     * Base page class for the ExportWizard page. This class add the {@link #onShow()} callback.
-     */
-    static abstract class ExportWizardPage extends WizardPage {
-
-        /** bit mask constant for project data change event */
-        protected static final int DATA_PROJECT = 0x001;
-        /** bit mask constant for keystore data change event */
-        protected static final int DATA_KEYSTORE = 0x002;
-        /** bit mask constant for key data change event */
-        protected static final int DATA_KEY = 0x004;
-
-        protected static final VerifyListener sPasswordVerifier = new VerifyListener() {
-            @Override
-            public void verifyText(VerifyEvent e) {
-                // verify the characters are valid for password.
-                int len = e.text.length();
-
-                // first limit to 127 characters max
-                if (len + ((Text)e.getSource()).getText().length() > 127) {
-                    e.doit = false;
-                    return;
-                }
-
-                // now only take non control characters
-                for (int i = 0 ; i < len ; i++) {
-                    if (e.text.charAt(i) < 32) {
-                        e.doit = false;
-                        return;
-                    }
-                }
-            }
-        };
-
-        /**
-         * Bit mask indicating what changed while the page was hidden.
-         * @see #DATA_PROJECT
-         * @see #DATA_KEYSTORE
-         * @see #DATA_KEY
-         */
-        protected int mProjectDataChanged = 0;
-
-        ExportWizardPage(String name) {
-            super(name);
-        }
-
-        abstract void onShow();
-
-        @Override
-        public void setVisible(boolean visible) {
-            super.setVisible(visible);
-            if (visible) {
-                onShow();
-                mProjectDataChanged = 0;
-            }
-        }
-
-        final void projectDataChanged(int changeMask) {
-            mProjectDataChanged |= changeMask;
-        }
-
-        /**
-         * Calls {@link #setErrorMessage(String)} and {@link #setPageComplete(boolean)} based on a
-         * {@link Throwable} object.
-         */
-        protected void onException(Throwable t) {
-            String message = getExceptionMessage(t);
-
-            setErrorMessage(message);
-            setPageComplete(false);
-        }
-    }
-
-    private ExportWizardPage mPages[] = new ExportWizardPage[5];
-
-    private IProject mProject;
-
-    private String mKeystore;
-    private String mKeystorePassword;
-    private boolean mKeystoreCreationMode;
-
-    private String mKeyAlias;
-    private String mKeyPassword;
-    private int mValidity;
-    private String mDName;
-
-    private PrivateKey mPrivateKey;
-    private X509Certificate mCertificate;
-
-    private File mDestinationFile;
-
-    private ExportWizardPage mKeystoreSelectionPage;
-    private ExportWizardPage mKeyCreationPage;
-    private ExportWizardPage mKeySelectionPage;
-    private ExportWizardPage mKeyCheckPage;
-
-    private boolean mKeyCreationMode;
-
-    private List<String> mExistingAliases;
-
-    public ExportWizard() {
-        setHelpAvailable(false); // TODO have help
-        setWindowTitle("Export Android Application");
-        setImageDescriptor();
-    }
-
-    @Override
-    public void addPages() {
-        addPage(mPages[0] = new ProjectCheckPage(this, PAGE_PROJECT_CHECK));
-        addPage(mKeystoreSelectionPage = mPages[1] = new KeystoreSelectionPage(this,
-                PAGE_KEYSTORE_SELECTION));
-        addPage(mKeyCreationPage = mPages[2] = new KeyCreationPage(this, PAGE_KEY_CREATION));
-        addPage(mKeySelectionPage = mPages[3] = new KeySelectionPage(this, PAGE_KEY_SELECTION));
-        addPage(mKeyCheckPage = mPages[4] = new KeyCheckPage(this, PAGE_KEY_CHECK));
-    }
-
-    @Override
-    public boolean performFinish() {
-        // save the properties
-        ProjectHelper.saveStringProperty(mProject, PROPERTY_KEYSTORE, mKeystore);
-        ProjectHelper.saveStringProperty(mProject, PROPERTY_ALIAS, mKeyAlias);
-        ProjectHelper.saveStringProperty(mProject, PROPERTY_DESTINATION,
-                mDestinationFile.getAbsolutePath());
-
-        // run the export in an UI runnable.
-        IWorkbench workbench = PlatformUI.getWorkbench();
-        final boolean[] result = new boolean[1];
-        try {
-            workbench.getProgressService().busyCursorWhile(new IRunnableWithProgress() {
-                /**
-                 * Run the export.
-                 * @throws InvocationTargetException
-                 * @throws InterruptedException
-                 */
-                @Override
-                public void run(IProgressMonitor monitor) throws InvocationTargetException,
-                        InterruptedException {
-                    try {
-                        result[0] = doExport(monitor);
-                    } finally {
-                        monitor.done();
-                    }
-                }
-            });
-        } catch (InvocationTargetException e) {
-            return false;
-        } catch (InterruptedException e) {
-            return false;
-        }
-
-        return result[0];
-    }
-
-    private boolean doExport(IProgressMonitor monitor) {
-        try {
-            // if needed, create the keystore and/or key.
-            if (mKeystoreCreationMode || mKeyCreationMode) {
-                final ArrayList<String> output = new ArrayList<String>();
-                boolean createdStore = KeystoreHelper.createNewStore(
-                        mKeystore,
-                        null /*storeType*/,
-                        mKeystorePassword,
-                        mKeyAlias,
-                        mKeyPassword,
-                        mDName,
-                        mValidity,
-                        new IKeyGenOutput() {
-                            @Override
-                            public void err(String message) {
-                                output.add(message);
-                            }
-                            @Override
-                            public void out(String message) {
-                                output.add(message);
-                            }
-                        });
-
-                if (createdStore == false) {
-                    // keystore creation error!
-                    displayError(output.toArray(new String[output.size()]));
-                    return false;
-                }
-
-                // keystore is created, now load the private key and certificate.
-                KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
-                FileInputStream fis = new FileInputStream(mKeystore);
-                keyStore.load(fis, mKeystorePassword.toCharArray());
-                fis.close();
-                PrivateKeyEntry entry = (KeyStore.PrivateKeyEntry)keyStore.getEntry(
-                        mKeyAlias, new KeyStore.PasswordProtection(mKeyPassword.toCharArray()));
-
-                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.
-                    displayError("Could not find key");
-                    return false;
-                }
-            }
-
-            // check the private key/certificate again since it may have been created just above.
-            if (mPrivateKey != null && mCertificate != null) {
-                // check whether we can run zipalign.
-                boolean runZipAlign = false;
-
-                ProjectState projectState = Sdk.getProjectState(mProject);
-                BuildToolInfo buildToolInfo = ExportHelper.getBuildTools(projectState);
-
-                String zipAlignPath = buildToolInfo.getPath(PathId.ZIP_ALIGN);
-                runZipAlign = zipAlignPath != null && new File(zipAlignPath).isFile();
-
-                File apkExportFile = mDestinationFile;
-                if (runZipAlign) {
-                    // create a temp file for the original export.
-                    apkExportFile = File.createTempFile("androidExport_", ".apk");
-                }
-
-                // export the signed apk.
-                ExportHelper.exportReleaseApk(mProject, apkExportFile,
-                        mPrivateKey, mCertificate, monitor);
-
-                // align if we can
-                if (runZipAlign) {
-                    String message = zipAlign(zipAlignPath, apkExportFile, mDestinationFile);
-                    if (message != null) {
-                        displayError(message);
-                        return false;
-                    }
-                } else {
-                    AdtPlugin.displayWarning("Export Wizard",
-                            "The zipalign tool was not found in the SDK.\n\n" +
-                            "Please update to the latest SDK and re-export your application\n" +
-                            "or run zipalign manually.\n\n" +
-                            "Aligning applications allows Android to use application resources\n" +
-                            "more efficiently.");
-                }
-
-                return true;
-            }
-        } catch (Throwable t) {
-            displayError(t);
-        }
-
-        return false;
-    }
-
-    @Override
-    public boolean canFinish() {
-        // check if we have the apk to resign, the destination location, and either
-        // a private key/certificate or the creation mode. In creation mode, unless
-        // all the key/keystore info is valid, the user cannot reach the last page, so there's
-        // no need to check them again here.
-        return ((mPrivateKey != null && mCertificate != null)
-                        || mKeystoreCreationMode || mKeyCreationMode) &&
-                mDestinationFile != null;
-    }
-
-    /*
-     * (non-Javadoc)
-     * @see org.eclipse.ui.IWorkbenchWizard#init(org.eclipse.ui.IWorkbench,
-     * org.eclipse.jface.viewers.IStructuredSelection)
-     */
-    @Override
-    public void init(IWorkbench workbench, IStructuredSelection selection) {
-        // get the project from the selection
-        Object selected = selection.getFirstElement();
-
-        if (selected instanceof IProject) {
-            mProject = (IProject)selected;
-        } else if (selected instanceof IAdaptable) {
-            IResource r = (IResource)((IAdaptable)selected).getAdapter(IResource.class);
-            if (r != null) {
-                mProject = r.getProject();
-            }
-        }
-    }
-
-    ExportWizardPage getKeystoreSelectionPage() {
-        return mKeystoreSelectionPage;
-    }
-
-    ExportWizardPage getKeyCreationPage() {
-        return mKeyCreationPage;
-    }
-
-    ExportWizardPage getKeySelectionPage() {
-        return mKeySelectionPage;
-    }
-
-    ExportWizardPage getKeyCheckPage() {
-        return mKeyCheckPage;
-    }
-
-    /**
-     * Returns an image descriptor for the wizard logo.
-     */
-    private void setImageDescriptor() {
-        ImageDescriptor desc = AdtPlugin.getImageDescriptor(PROJECT_LOGO_LARGE);
-        setDefaultPageImageDescriptor(desc);
-    }
-
-    IProject getProject() {
-        return mProject;
-    }
-
-    void setProject(IProject project) {
-        mProject = project;
-
-        updatePageOnChange(ExportWizardPage.DATA_PROJECT);
-    }
-
-    void setKeystore(String path) {
-        mKeystore = path;
-        mPrivateKey = null;
-        mCertificate = null;
-
-        updatePageOnChange(ExportWizardPage.DATA_KEYSTORE);
-    }
-
-    String getKeystore() {
-        return mKeystore;
-    }
-
-    void setKeystoreCreationMode(boolean createStore) {
-        mKeystoreCreationMode = createStore;
-        updatePageOnChange(ExportWizardPage.DATA_KEYSTORE);
-    }
-
-    boolean getKeystoreCreationMode() {
-        return mKeystoreCreationMode;
-    }
-
-
-    void setKeystorePassword(String password) {
-        mKeystorePassword = password;
-        mPrivateKey = null;
-        mCertificate = null;
-
-        updatePageOnChange(ExportWizardPage.DATA_KEYSTORE);
-    }
-
-    String getKeystorePassword() {
-        return mKeystorePassword;
-    }
-
-    void setKeyCreationMode(boolean createKey) {
-        mKeyCreationMode = createKey;
-        updatePageOnChange(ExportWizardPage.DATA_KEY);
-    }
-
-    boolean getKeyCreationMode() {
-        return mKeyCreationMode;
-    }
-
-    void setExistingAliases(List<String> aliases) {
-        mExistingAliases = aliases;
-    }
-
-    List<String> getExistingAliases() {
-        return mExistingAliases;
-    }
-
-    void setKeyAlias(String name) {
-        mKeyAlias = name;
-        mPrivateKey = null;
-        mCertificate = null;
-
-        updatePageOnChange(ExportWizardPage.DATA_KEY);
-    }
-
-    String getKeyAlias() {
-        return mKeyAlias;
-    }
-
-    void setKeyPassword(String password) {
-        mKeyPassword = password;
-        mPrivateKey = null;
-        mCertificate = null;
-
-        updatePageOnChange(ExportWizardPage.DATA_KEY);
-    }
-
-    String getKeyPassword() {
-        return mKeyPassword;
-    }
-
-    void setValidity(int validity) {
-        mValidity = validity;
-        updatePageOnChange(ExportWizardPage.DATA_KEY);
-    }
-
-    int getValidity() {
-        return mValidity;
-    }
-
-    void setDName(String dName) {
-        mDName = dName;
-        updatePageOnChange(ExportWizardPage.DATA_KEY);
-    }
-
-    String getDName() {
-        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;
-    }
-
-    void setDestination(File destinationFile) {
-        mDestinationFile = destinationFile;
-    }
-
-    void resetDestination() {
-        mDestinationFile = null;
-    }
-
-    void updatePageOnChange(int changeMask) {
-        for (ExportWizardPage page : mPages) {
-            page.projectDataChanged(changeMask);
-        }
-    }
-
-    private void displayError(String... messages) {
-        String message = null;
-        if (messages.length == 1) {
-            message = messages[0];
-        } else {
-            StringBuilder sb = new StringBuilder(messages[0]);
-            for (int i = 1;  i < messages.length; i++) {
-                sb.append('\n');
-                sb.append(messages[i]);
-            }
-
-            message = sb.toString();
-        }
-
-        AdtPlugin.displayError("Export Wizard", message);
-    }
-
-    private void displayError(Throwable t) {
-        String message = getExceptionMessage(t);
-        displayError(message);
-
-        AdtPlugin.log(t, "Export Wizard Error");
-    }
-
-    /**
-     * Executes zipalign
-     * @param zipAlignPath location of the zipalign too
-     * @param source file to zipalign
-     * @param destination where to write the resulting file
-     * @return null if success, the error otherwise
-     * @throws IOException
-     */
-    private String zipAlign(String zipAlignPath, File source, File destination) throws IOException {
-        // command line: zipaling -f 4 tmp destination
-        String[] command = new String[5];
-        command[0] = zipAlignPath;
-        command[1] = "-f"; //$NON-NLS-1$
-        command[2] = "4"; //$NON-NLS-1$
-        command[3] = source.getAbsolutePath();
-        command[4] = destination.getAbsolutePath();
-
-        Process process = Runtime.getRuntime().exec(command);
-        final ArrayList<String> output = new ArrayList<String>();
-        try {
-            final IProject project = getProject();
-
-            int status = GrabProcessOutput.grabProcessOutput(
-                    process,
-                    Wait.WAIT_FOR_READERS,
-                    new IProcessOutput() {
-                        @Override
-                        public void out(@Nullable String line) {
-                            if (line != null) {
-                                AdtPlugin.printBuildToConsole(BuildVerbosity.VERBOSE,
-                                        project, line);
-                            }
-                        }
-
-                        @Override
-                        public void err(@Nullable String line) {
-                            if (line != null) {
-                                output.add(line);
-                            }
-                        }
-                    });
-
-            if (status != 0) {
-                // build a single message from the array list
-                StringBuilder sb = new StringBuilder("Error while running zipalign:");
-                for (String msg : output) {
-                    sb.append('\n');
-                    sb.append(msg);
-                }
-
-                return sb.toString();
-            }
-        } catch (InterruptedException e) {
-            // ?
-        }
-        return null;
-    }
-
-    /**
-     * Returns the {@link Throwable#getMessage()}. If the {@link Throwable#getMessage()} returns
-     * <code>null</code>, the method is called again on the cause of the Throwable object.
-     * <p/>If no Throwable in the chain has a valid message, the canonical name of the first
-     * exception is returned.
-     */
-    static String getExceptionMessage(Throwable t) {
-        String message = t.getMessage();
-        if (message == null) {
-            // no error info? get the stack call to display it
-            // At least that'll give us a better bug report.
-            ByteArrayOutputStream baos = new ByteArrayOutputStream();
-            t.printStackTrace(new PrintStream(baos));
-            message = baos.toString();
-        }
-
-        return message;
-    }
-}
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
deleted file mode 100644
index c17f43e..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/export/KeyCheckPage.java
+++ /dev/null
@@ -1,378 +0,0 @@
-/*
- * 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.wizards.export;
-
-import com.android.ide.eclipse.adt.internal.project.ProjectHelper;
-import com.android.ide.eclipse.adt.internal.wizards.export.ExportWizard.ExportWizardPage;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.ScrolledComposite;
-import org.eclipse.swt.events.ControlAdapter;
-import org.eclipse.swt.events.ControlEvent;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.graphics.Rectangle;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.FileDialog;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.ui.forms.widgets.FormText;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.security.KeyStore;
-import java.security.KeyStore.PrivateKeyEntry;
-import java.security.KeyStoreException;
-import java.security.NoSuchAlgorithmException;
-import java.security.PrivateKey;
-import java.security.UnrecoverableEntryException;
-import java.security.cert.CertificateException;
-import java.security.cert.X509Certificate;
-import java.util.Calendar;
-
-/**
- * Final page of the wizard that checks the key and ask for the ouput location.
- */
-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;
-    private Text mDestination;
-    private boolean mFatalSigningError;
-    private FormText mDetailText;
-    private ScrolledComposite mScrolledComposite;
-
-    private String mKeyDetails;
-    private String mDestinationDetails;
-
-    protected KeyCheckPage(ExportWizard wizard, String pageName) {
-        super(pageName);
-        mWizard = wizard;
-
-        setTitle("Destination and key/certificate checks");
-        setDescription(""); // TODO
-    }
-
-    @Override
-    public void createControl(Composite parent) {
-        setErrorMessage(null);
-        setMessage(null);
-
-        // build the ui.
-        Composite composite = new Composite(parent, SWT.NULL);
-        composite.setLayoutData(new GridData(GridData.FILL_BOTH));
-        GridLayout gl = new GridLayout(3, false);
-        gl.verticalSpacing *= 3;
-        composite.setLayout(gl);
-
-        GridData gd;
-
-        new Label(composite, SWT.NONE).setText("Destination APK file:");
-        mDestination = new Text(composite, SWT.BORDER);
-        mDestination.setLayoutData(gd = new GridData(GridData.FILL_HORIZONTAL));
-        mDestination.addModifyListener(new ModifyListener() {
-            @Override
-            public void modifyText(ModifyEvent e) {
-                onDestinationChange(false /*forceDetailUpdate*/);
-            }
-        });
-        final Button browseButton = new Button(composite, SWT.PUSH);
-        browseButton.setText("Browse...");
-        browseButton.addSelectionListener(new SelectionAdapter() {
-            @Override
-            public void widgetSelected(SelectionEvent e) {
-                FileDialog fileDialog = new FileDialog(browseButton.getShell(), SWT.SAVE);
-
-                fileDialog.setText("Destination file name");
-                // get a default apk name based on the project
-                String filename = ProjectHelper.getApkFilename(mWizard.getProject(),
-                        null /*config*/);
-                fileDialog.setFileName(filename);
-
-                String saveLocation = fileDialog.open();
-                if (saveLocation != null) {
-                    mDestination.setText(saveLocation);
-                }
-            }
-        });
-
-        mScrolledComposite = new ScrolledComposite(composite, SWT.V_SCROLL);
-        mScrolledComposite.setLayoutData(gd = new GridData(GridData.FILL_BOTH));
-        gd.horizontalSpan = 3;
-        mScrolledComposite.setExpandHorizontal(true);
-        mScrolledComposite.setExpandVertical(true);
-
-        mDetailText = new FormText(mScrolledComposite, SWT.NONE);
-        mScrolledComposite.setContent(mDetailText);
-
-        mScrolledComposite.addControlListener(new ControlAdapter() {
-            @Override
-            public void controlResized(ControlEvent e) {
-                updateScrolling();
-            }
-        });
-
-        setControl(composite);
-    }
-
-    @Override
-    void onShow() {
-        // fill the texts with information loaded from the project.
-        if ((mProjectDataChanged & DATA_PROJECT) != 0) {
-            // reset the destination from the content of the project
-            IProject project = mWizard.getProject();
-
-            String destination = ProjectHelper.loadStringProperty(project,
-                    ExportWizard.PROPERTY_DESTINATION);
-            if (destination != null) {
-                mDestination.setText(destination);
-            }
-        }
-
-        // if anything change we basically reload the data.
-        if (mProjectDataChanged != 0) {
-            mFatalSigningError = false;
-
-            // reset the wizard with no key/cert to make it not finishable, unless a valid
-            // key/cert is found.
-            mWizard.setSigningInfo(null, null);
-            mPrivateKey = null;
-            mCertificate = null;
-            mKeyDetails = null;
-
-            if (mWizard.getKeystoreCreationMode() || mWizard.getKeyCreationMode()) {
-                int validity = mWizard.getValidity();
-                StringBuilder sb = new StringBuilder(
-                        String.format("<p>Certificate expires in %d years.</p>",
-                        validity));
-
-                if (validity < REQUIRED_YEARS) {
-                    sb.append(VALIDITY_WARNING);
-                }
-
-                mKeyDetails = sb.toString();
-            } else {
-                try {
-                    KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
-                    FileInputStream fis = new FileInputStream(mWizard.getKeystore());
-                    keyStore.load(fis, mWizard.getKeystorePassword().toCharArray());
-                    fis.close();
-                    PrivateKeyEntry entry = (KeyStore.PrivateKeyEntry)keyStore.getEntry(
-                            mWizard.getKeyAlias(),
-                            new KeyStore.PasswordProtection(
-                                    mWizard.getKeyPassword().toCharArray()));
-
-                    if (entry != null) {
-                        mPrivateKey = entry.getPrivateKey();
-                        mCertificate = (X509Certificate)entry.getCertificate();
-                    } else {
-                        setErrorMessage("Unable to find key.");
-
-                        setPageComplete(false);
-                    }
-                } catch (FileNotFoundException e) {
-                    // this was checked at the first previous step and will not happen here, unless
-                    // the file was removed during the export wizard execution.
-                    onException(e);
-                } catch (KeyStoreException e) {
-                    onException(e);
-                } catch (NoSuchAlgorithmException e) {
-                    onException(e);
-                } catch (UnrecoverableEntryException e) {
-                    onException(e);
-                } catch (CertificateException e) {
-                    onException(e);
-                } catch (IOException e) {
-                    onException(e);
-                }
-
-                if (mPrivateKey != null && mCertificate != null) {
-                    Calendar expirationCalendar = Calendar.getInstance();
-                    expirationCalendar.setTime(mCertificate.getNotAfter());
-                    Calendar today = Calendar.getInstance();
-
-                    if (expirationCalendar.before(today)) {
-                        mKeyDetails = String.format(
-                                "<p>Certificate expired on %s</p>",
-                                mCertificate.getNotAfter().toString());
-
-                        // fatal error = nothing can make the page complete.
-                        mFatalSigningError = true;
-
-                        setErrorMessage("Certificate is expired.");
-                        setPageComplete(false);
-                    } else {
-                        // valid, key/cert: put it in the wizard so that it can be finished
-                        mWizard.setSigningInfo(mPrivateKey, mCertificate);
-
-                        StringBuilder sb = new StringBuilder(String.format(
-                                "<p>Certificate expires on %s.</p>",
-                                mCertificate.getNotAfter().toString()));
-
-                        int expirationYear = expirationCalendar.get(Calendar.YEAR);
-                        int thisYear = today.get(Calendar.YEAR);
-
-                        if (thisYear + REQUIRED_YEARS < expirationYear) {
-                            // do nothing
-                        } else {
-                            if (expirationYear == thisYear) {
-                                sb.append("<p>The certificate expires this year.</p>");
-                            } else {
-                                int count = expirationYear-thisYear;
-                                sb.append(String.format(
-                                        "<p>The Certificate expires in %1$s %2$s.</p>",
-                                        count, count == 1 ? "year" : "years"));
-                            }
-                            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 {
-                    // fatal error = nothing can make the page complete.
-                    mFatalSigningError = true;
-                }
-            }
-        }
-
-        onDestinationChange(true /*forceDetailUpdate*/);
-    }
-
-    /**
-     * Callback for destination field edition
-     * @param forceDetailUpdate if true, the detail {@link FormText} is updated even if a fatal
-     * error has happened in the signing.
-     */
-    private void onDestinationChange(boolean forceDetailUpdate) {
-        if (mFatalSigningError == false) {
-            // reset messages for now.
-            setErrorMessage(null);
-            setMessage(null);
-
-            String path = mDestination.getText().trim();
-
-            if (path.length() == 0) {
-                setErrorMessage("Enter destination for the APK file.");
-                // reset canFinish in the wizard.
-                mWizard.resetDestination();
-                setPageComplete(false);
-                return;
-            }
-
-            File file = new File(path);
-            if (file.isDirectory()) {
-                setErrorMessage("Destination is a directory.");
-                // reset canFinish in the wizard.
-                mWizard.resetDestination();
-                setPageComplete(false);
-                return;
-            }
-
-            File parentFolder = file.getParentFile();
-            if (parentFolder == null || parentFolder.isDirectory() == false) {
-                setErrorMessage("Not a valid directory.");
-                // reset canFinish in the wizard.
-                mWizard.resetDestination();
-                setPageComplete(false);
-                return;
-            }
-
-            if (file.isFile()) {
-                mDestinationDetails = "<li>WARNING: destination file already exists</li>";
-                setMessage("Destination file already exists.", WARNING);
-            }
-
-            // no error, set the destination in the wizard.
-            mWizard.setDestination(file);
-            setPageComplete(true);
-
-            updateDetailText();
-        } else if (forceDetailUpdate) {
-            updateDetailText();
-        }
-    }
-
-    /**
-     * Updates the scrollbar to match the content of the {@link FormText} or the new size
-     * of the {@link ScrolledComposite}.
-     */
-    private void updateScrolling() {
-        if (mDetailText != null) {
-            Rectangle r = mScrolledComposite.getClientArea();
-            mScrolledComposite.setMinSize(mDetailText.computeSize(r.width, SWT.DEFAULT));
-            mScrolledComposite.layout();
-        }
-    }
-
-    private void updateDetailText() {
-        StringBuilder sb = new StringBuilder("<form>");
-        if (mKeyDetails != null) {
-            sb.append(mKeyDetails);
-        }
-
-        if (mDestinationDetails != null && mFatalSigningError == false) {
-            sb.append(mDestinationDetails);
-        }
-
-        sb.append("</form>");
-
-        mDetailText.setText(sb.toString(), true /* parseTags */,
-                true /* expandURLs */);
-
-        mDetailText.getParent().layout();
-
-        updateScrolling();
-    }
-
-    @Override
-    protected void onException(Throwable t) {
-        super.onException(t);
-
-        mKeyDetails = String.format("ERROR: %1$s", ExportWizard.getExceptionMessage(t));
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/export/KeyCreationPage.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/export/KeyCreationPage.java
deleted file mode 100644
index aea94ad..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/export/KeyCreationPage.java
+++ /dev/null
@@ -1,339 +0,0 @@
-/*
- * 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.wizards.export;
-
-import com.android.ide.eclipse.adt.internal.project.ProjectHelper;
-import com.android.ide.eclipse.adt.internal.wizards.export.ExportWizard.ExportWizardPage;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.jface.wizard.IWizardPage;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.events.VerifyEvent;
-import org.eclipse.swt.events.VerifyListener;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Text;
-
-import java.util.List;
-
-/**
- * Key creation page.
- */
-final class KeyCreationPage extends ExportWizardPage {
-
-    private final ExportWizard mWizard;
-    private Text mAlias;
-    private Text mKeyPassword;
-    private Text mKeyPassword2;
-    private Text mCnField;
-    private boolean mDisableOnChange = false;
-    private Text mOuField;
-    private Text mOField;
-    private Text mLField;
-    private Text mStField;
-    private Text mCField;
-    private String mDName;
-    private int mValidity = 0;
-    private List<String> mExistingAliases;
-
-
-    protected KeyCreationPage(ExportWizard wizard, String pageName) {
-        super(pageName);
-        mWizard = wizard;
-
-        setTitle("Key Creation");
-        setDescription(""); // TODO?
-    }
-
-    @Override
-    public void createControl(Composite parent) {
-        Composite composite = new Composite(parent, SWT.NULL);
-        composite.setLayoutData(new GridData(GridData.FILL_BOTH));
-        GridLayout gl = new GridLayout(2, false);
-        composite.setLayout(gl);
-
-        GridData gd;
-
-        new Label(composite, SWT.NONE).setText("Alias:");
-        mAlias = new Text(composite, SWT.BORDER);
-        mAlias.setLayoutData(gd = new GridData(GridData.FILL_HORIZONTAL));
-
-        new Label(composite, SWT.NONE).setText("Password:");
-        mKeyPassword = new Text(composite, SWT.BORDER | SWT.PASSWORD);
-        mKeyPassword.setLayoutData(gd = new GridData(GridData.FILL_HORIZONTAL));
-        mKeyPassword.addVerifyListener(sPasswordVerifier);
-
-        new Label(composite, SWT.NONE).setText("Confirm:");
-        mKeyPassword2 = new Text(composite, SWT.BORDER | SWT.PASSWORD);
-        mKeyPassword2.setLayoutData(gd = new GridData(GridData.FILL_HORIZONTAL));
-        mKeyPassword2.addVerifyListener(sPasswordVerifier);
-
-        new Label(composite, SWT.NONE).setText("Validity (years):");
-        final Text validityText = new Text(composite, SWT.BORDER);
-        validityText.setLayoutData(gd = new GridData(GridData.FILL_HORIZONTAL));
-        validityText.addVerifyListener(new VerifyListener() {
-            @Override
-            public void verifyText(VerifyEvent e) {
-                // check for digit only.
-                for (int i = 0 ; i < e.text.length(); i++) {
-                    char letter = e.text.charAt(i);
-                    if (letter < '0' || letter > '9') {
-                        e.doit = false;
-                        return;
-                    }
-                }
-            }
-        });
-
-        new Label(composite, SWT.SEPARATOR | SWT.HORIZONTAL).setLayoutData(
-                gd = new GridData(GridData.FILL_HORIZONTAL));
-        gd.horizontalSpan = 2;
-
-        new Label(composite, SWT.NONE).setText("First and Last Name:");
-        mCnField = new Text(composite, SWT.BORDER);
-        mCnField.setLayoutData(gd = new GridData(GridData.FILL_HORIZONTAL));
-
-        new Label(composite, SWT.NONE).setText("Organizational Unit:");
-        mOuField = new Text(composite, SWT.BORDER);
-        mOuField.setLayoutData(gd = new GridData(GridData.FILL_HORIZONTAL));
-
-        new Label(composite, SWT.NONE).setText("Organization:");
-        mOField = new Text(composite, SWT.BORDER);
-        mOField.setLayoutData(gd = new GridData(GridData.FILL_HORIZONTAL));
-
-        new Label(composite, SWT.NONE).setText("City or Locality:");
-        mLField = new Text(composite, SWT.BORDER);
-        mLField.setLayoutData(gd = new GridData(GridData.FILL_HORIZONTAL));
-
-        new Label(composite, SWT.NONE).setText("State or Province:");
-        mStField = new Text(composite, SWT.BORDER);
-        mStField.setLayoutData(gd = new GridData(GridData.FILL_HORIZONTAL));
-
-        new Label(composite, SWT.NONE).setText("Country Code (XX):");
-        mCField = new Text(composite, SWT.BORDER);
-        mCField.setLayoutData(gd = new GridData(GridData.FILL_HORIZONTAL));
-
-        // Show description the first time
-        setErrorMessage(null);
-        setMessage(null);
-        setControl(composite);
-
-        mAlias.addModifyListener(new ModifyListener() {
-            @Override
-            public void modifyText(ModifyEvent e) {
-                mWizard.setKeyAlias(mAlias.getText().trim());
-                onChange();
-            }
-        });
-        mKeyPassword.addModifyListener(new ModifyListener() {
-            @Override
-            public void modifyText(ModifyEvent e) {
-                mWizard.setKeyPassword(mKeyPassword.getText());
-                onChange();
-            }
-        });
-        mKeyPassword2.addModifyListener(new ModifyListener() {
-            @Override
-            public void modifyText(ModifyEvent e) {
-                onChange();
-            }
-        });
-
-        validityText.addModifyListener(new ModifyListener() {
-            @Override
-            public void modifyText(ModifyEvent e) {
-                try {
-                    mValidity = Integer.parseInt(validityText.getText());
-                } catch (NumberFormatException e2) {
-                    // this should only happen if the text field is empty due to the verifyListener.
-                    mValidity = 0;
-                }
-                mWizard.setValidity(mValidity);
-                onChange();
-            }
-        });
-
-        ModifyListener dNameListener = new ModifyListener() {
-            @Override
-            public void modifyText(ModifyEvent e) {
-                onDNameChange();
-            }
-        };
-
-        mCnField.addModifyListener(dNameListener);
-        mOuField.addModifyListener(dNameListener);
-        mOField.addModifyListener(dNameListener);
-        mLField.addModifyListener(dNameListener);
-        mStField.addModifyListener(dNameListener);
-        mCField.addModifyListener(dNameListener);
-    }
-
-    @Override
-    void onShow() {
-        // fill the texts with information loaded from the project.
-        if ((mProjectDataChanged & (DATA_PROJECT | DATA_KEYSTORE)) != 0) {
-            // reset the keystore/alias from the content of the project
-            IProject project = mWizard.getProject();
-
-            // disable onChange for now. we'll call it once at the end.
-            mDisableOnChange = true;
-
-            String alias = ProjectHelper.loadStringProperty(project, ExportWizard.PROPERTY_ALIAS);
-            if (alias != null) {
-                mAlias.setText(alias);
-            }
-
-            // get the existing list of keys if applicable
-            if (mWizard.getKeyCreationMode()) {
-                mExistingAliases = mWizard.getExistingAliases();
-            } else {
-                mExistingAliases = null;
-            }
-
-            // reset the passwords
-            mKeyPassword.setText(""); //$NON-NLS-1$
-            mKeyPassword2.setText(""); //$NON-NLS-1$
-
-            // enable onChange, and call it to display errors and enable/disable pageCompleted.
-            mDisableOnChange = false;
-            onChange();
-        }
-    }
-
-    @Override
-    public IWizardPage getPreviousPage() {
-        if (mWizard.getKeyCreationMode()) { // this means we create a key from an existing store
-            return mWizard.getKeySelectionPage();
-        }
-
-        return mWizard.getKeystoreSelectionPage();
-    }
-
-    @Override
-    public IWizardPage getNextPage() {
-        return mWizard.getKeyCheckPage();
-    }
-
-    /**
-     * Handles changes and update the error message and calls {@link #setPageComplete(boolean)}.
-     */
-    private void onChange() {
-        if (mDisableOnChange) {
-            return;
-        }
-
-        setErrorMessage(null);
-        setMessage(null);
-
-        if (mAlias.getText().trim().length() == 0) {
-            setErrorMessage("Enter key alias.");
-            setPageComplete(false);
-            return;
-        } else if (mExistingAliases != null) {
-            // we cannot use indexOf, because we need to do a case-insensitive check
-            String keyAlias = mAlias.getText().trim();
-            for (String alias : mExistingAliases) {
-                if (alias.equalsIgnoreCase(keyAlias)) {
-                    setErrorMessage("Key alias already exists in keystore.");
-                    setPageComplete(false);
-                    return;
-                }
-            }
-        }
-
-        String value = mKeyPassword.getText();
-        if (value.length() == 0) {
-            setErrorMessage("Enter key password.");
-            setPageComplete(false);
-            return;
-        } else if (value.length() < 6) {
-            setErrorMessage("Key password is too short - must be at least 6 characters.");
-            setPageComplete(false);
-            return;
-        }
-
-        if (value.equals(mKeyPassword2.getText()) == false) {
-            setErrorMessage("Key passwords don't match.");
-            setPageComplete(false);
-            return;
-        }
-
-        if (mValidity == 0) {
-            setErrorMessage("Key certificate validity is required.");
-            setPageComplete(false);
-            return;
-        } else if (mValidity < 25) {
-            setMessage("A 25 year certificate validity is recommended.", WARNING);
-        } else if (mValidity > 1000) {
-            setErrorMessage("Key certificate validity must be between 1 and 1000 years.");
-            setPageComplete(false);
-            return;
-        }
-
-        if (mDName == null || mDName.length() == 0) {
-            setErrorMessage("At least one Certificate issuer field is required to be non-empty.");
-            setPageComplete(false);
-            return;
-        }
-
-        setPageComplete(true);
-    }
-
-    /**
-     * Handles changes in the DName fields.
-     */
-    private void onDNameChange() {
-        StringBuilder sb = new StringBuilder();
-
-        buildDName("CN", mCnField, sb);
-        buildDName("OU", mOuField, sb);
-        buildDName("O", mOField, sb);
-        buildDName("L", mLField, sb);
-        buildDName("ST", mStField, sb);
-        buildDName("C", mCField, sb);
-
-        mDName = sb.toString();
-        mWizard.setDName(mDName);
-
-        onChange();
-    }
-
-    /**
-     * Builds the distinguished name string with the provided {@link StringBuilder}.
-     * @param prefix the prefix of the entry.
-     * @param textField The {@link Text} field containing the entry value.
-     * @param sb the string builder containing the dname.
-     */
-    private void buildDName(String prefix, Text textField, StringBuilder sb) {
-        if (textField != null) {
-            String value = textField.getText().trim();
-            if (value.length() > 0) {
-                if (sb.length() > 0) {
-                    sb.append(",");
-                }
-
-                sb.append(prefix);
-                sb.append('=');
-                sb.append(value);
-            }
-        }
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/export/KeySelectionPage.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/export/KeySelectionPage.java
deleted file mode 100644
index 604a208..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/export/KeySelectionPage.java
+++ /dev/null
@@ -1,268 +0,0 @@
-/*
- * 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.wizards.export;
-
-import com.android.ide.eclipse.adt.internal.project.ProjectHelper;
-import com.android.ide.eclipse.adt.internal.wizards.export.ExportWizard.ExportWizardPage;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.jface.wizard.IWizardPage;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Combo;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Text;
-
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.security.KeyStore;
-import java.security.KeyStoreException;
-import java.security.NoSuchAlgorithmException;
-import java.security.cert.CertificateException;
-import java.util.ArrayList;
-import java.util.Enumeration;
-
-/**
- * Key Selection Page. This is used when an existing keystore is used.
- */
-final class KeySelectionPage extends ExportWizardPage {
-
-    private final ExportWizard mWizard;
-    private Label mKeyAliasesLabel;
-    private Combo mKeyAliases;
-    private Label mKeyPasswordLabel;
-    private Text mKeyPassword;
-    private boolean mDisableOnChange = false;
-    private Button mUseExistingKey;
-    private Button mCreateKey;
-
-    protected KeySelectionPage(ExportWizard wizard, String pageName) {
-        super(pageName);
-        mWizard = wizard;
-
-        setTitle("Key alias selection");
-        setDescription(""); // TODO
-    }
-
-    @Override
-    public void createControl(Composite parent) {
-        Composite composite = new Composite(parent, SWT.NULL);
-        composite.setLayoutData(new GridData(GridData.FILL_BOTH));
-        GridLayout gl = new GridLayout(3, false);
-        composite.setLayout(gl);
-
-        GridData gd;
-
-        mUseExistingKey = new Button(composite, SWT.RADIO);
-        mUseExistingKey.setText("Use existing key");
-        mUseExistingKey.setLayoutData(gd = new GridData(GridData.FILL_HORIZONTAL));
-        gd.horizontalSpan = 3;
-        mUseExistingKey.setSelection(true);
-
-        new Composite(composite, SWT.NONE).setLayoutData(gd = new GridData());
-        gd.heightHint = 0;
-        gd.widthHint = 50;
-        mKeyAliasesLabel = new Label(composite, SWT.NONE);
-        mKeyAliasesLabel.setText("Alias:");
-        mKeyAliases = new Combo(composite, SWT.READ_ONLY);
-        mKeyAliases.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-
-        new Composite(composite, SWT.NONE).setLayoutData(gd = new GridData());
-        gd.heightHint = 0;
-        gd.widthHint = 50;
-        mKeyPasswordLabel = new Label(composite, SWT.NONE);
-        mKeyPasswordLabel.setText("Password:");
-        mKeyPassword = new Text(composite, SWT.BORDER | SWT.PASSWORD);
-        mKeyPassword.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-
-        mCreateKey = new Button(composite, SWT.RADIO);
-        mCreateKey.setText("Create new key");
-        mCreateKey.setLayoutData(gd = new GridData(GridData.FILL_HORIZONTAL));
-        gd.horizontalSpan = 3;
-
-        // Show description the first time
-        setErrorMessage(null);
-        setMessage(null);
-        setControl(composite);
-
-        mUseExistingKey.addSelectionListener(new SelectionAdapter() {
-            @Override
-            public void widgetSelected(SelectionEvent e) {
-                mWizard.setKeyCreationMode(!mUseExistingKey.getSelection());
-                enableWidgets();
-                onChange();
-            }
-        });
-
-        mKeyAliases.addSelectionListener(new SelectionAdapter() {
-            @Override
-            public void widgetSelected(SelectionEvent e) {
-                mWizard.setKeyAlias(mKeyAliases.getItem(mKeyAliases.getSelectionIndex()));
-                onChange();
-            }
-        });
-
-        mKeyPassword.addModifyListener(new ModifyListener() {
-            @Override
-            public void modifyText(ModifyEvent e) {
-                mWizard.setKeyPassword(mKeyPassword.getText());
-                onChange();
-            }
-        });
-    }
-
-    @Override
-    void onShow() {
-        // fill the texts with information loaded from the project.
-        if ((mProjectDataChanged & (DATA_PROJECT | DATA_KEYSTORE)) != 0) {
-            // disable onChange for now. we'll call it once at the end.
-            mDisableOnChange = true;
-
-            // reset the alias from the content of the project
-            try {
-                // reset to using a key
-                mWizard.setKeyCreationMode(false);
-                mUseExistingKey.setSelection(true);
-                mCreateKey.setSelection(false);
-                enableWidgets();
-
-                // remove the content of the alias combo always and first, in case the
-                // keystore password is wrong
-                mKeyAliases.removeAll();
-
-                // get the alias list (also used as a keystore password test)
-                KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
-                FileInputStream fis = new FileInputStream(mWizard.getKeystore());
-                keyStore.load(fis, mWizard.getKeystorePassword().toCharArray());
-                fis.close();
-
-                Enumeration<String> aliases = keyStore.aliases();
-
-                // get the alias from the project previous export, and look for a match as
-                // we add the aliases to the combo.
-                IProject project = mWizard.getProject();
-
-                String keyAlias = ProjectHelper.loadStringProperty(project,
-                        ExportWizard.PROPERTY_ALIAS);
-
-                ArrayList<String> aliasList = new ArrayList<String>();
-
-                int selection = -1;
-                int count = 0;
-                while (aliases.hasMoreElements()) {
-                    String alias = aliases.nextElement();
-                    mKeyAliases.add(alias);
-                    aliasList.add(alias);
-                    if (selection == -1 && alias.equalsIgnoreCase(keyAlias)) {
-                        selection = count;
-                    }
-                    count++;
-                }
-
-                mWizard.setExistingAliases(aliasList);
-
-                if (selection != -1) {
-                    mKeyAliases.select(selection);
-
-                    // since a match was found and is selected, we need to give it to
-                    // the wizard as well
-                    mWizard.setKeyAlias(keyAlias);
-                } else {
-                    mKeyAliases.clearSelection();
-                }
-
-                // reset the password
-                mKeyPassword.setText(""); //$NON-NLS-1$
-
-                // enable onChange, and call it to display errors and enable/disable pageCompleted.
-                mDisableOnChange = false;
-                onChange();
-            } catch (KeyStoreException e) {
-                onException(e);
-            } catch (FileNotFoundException e) {
-                onException(e);
-            } catch (NoSuchAlgorithmException e) {
-                onException(e);
-            } catch (CertificateException e) {
-                onException(e);
-            } catch (IOException e) {
-                onException(e);
-            } finally {
-                // in case we exit with an exception, we need to reset this
-                mDisableOnChange = false;
-            }
-        }
-    }
-
-    @Override
-    public IWizardPage getPreviousPage() {
-        return mWizard.getKeystoreSelectionPage();
-    }
-
-    @Override
-    public IWizardPage getNextPage() {
-        if (mWizard.getKeyCreationMode()) {
-            return mWizard.getKeyCreationPage();
-        }
-
-        return mWizard.getKeyCheckPage();
-    }
-
-    /**
-     * Handles changes and update the error message and calls {@link #setPageComplete(boolean)}.
-     */
-    private void onChange() {
-        if (mDisableOnChange) {
-            return;
-        }
-
-        setErrorMessage(null);
-        setMessage(null);
-
-        if (mWizard.getKeyCreationMode() == false) {
-            if (mKeyAliases.getSelectionIndex() == -1) {
-                setErrorMessage("Select a key alias.");
-                setPageComplete(false);
-                return;
-            }
-
-            if (mKeyPassword.getText().trim().length() == 0) {
-                setErrorMessage("Enter key password.");
-                setPageComplete(false);
-                return;
-            }
-        }
-
-        setPageComplete(true);
-    }
-
-    private void enableWidgets() {
-        boolean useKey = !mWizard.getKeyCreationMode();
-        mKeyAliasesLabel.setEnabled(useKey);
-        mKeyAliases.setEnabled(useKey);
-        mKeyPassword.setEnabled(useKey);
-        mKeyPasswordLabel.setEnabled(useKey);
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/export/KeystoreSelectionPage.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/export/KeystoreSelectionPage.java
deleted file mode 100644
index eabee15..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/export/KeystoreSelectionPage.java
+++ /dev/null
@@ -1,264 +0,0 @@
-/*
- * 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.wizards.export;
-
-import com.android.ide.eclipse.adt.internal.project.ProjectHelper;
-import com.android.ide.eclipse.adt.internal.wizards.export.ExportWizard.ExportWizardPage;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.jface.wizard.IWizardPage;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.FileDialog;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Text;
-
-import java.io.File;
-
-/**
- * Keystore selection page. This page allows to choose to create a new keystore or use an
- * existing one.
- */
-final class KeystoreSelectionPage extends ExportWizardPage {
-
-    private final ExportWizard mWizard;
-    private Button mUseExistingKeystore;
-    private Button mCreateKeystore;
-    private Text mKeystore;
-    private Text mKeystorePassword;
-    private Label mConfirmLabel;
-    private Text mKeystorePassword2;
-    private boolean mDisableOnChange = false;
-
-    protected KeystoreSelectionPage(ExportWizard wizard, String pageName) {
-        super(pageName);
-        mWizard = wizard;
-
-        setTitle("Keystore selection");
-        setDescription(""); //TODO
-    }
-
-    @Override
-    public void createControl(Composite parent) {
-        Composite composite = new Composite(parent, SWT.NULL);
-        composite.setLayoutData(new GridData(GridData.FILL_BOTH));
-        GridLayout gl = new GridLayout(3, false);
-        composite.setLayout(gl);
-
-        GridData gd;
-
-        mUseExistingKeystore = new Button(composite, SWT.RADIO);
-        mUseExistingKeystore.setText("Use existing keystore");
-        mUseExistingKeystore.setLayoutData(gd = new GridData(GridData.FILL_HORIZONTAL));
-        gd.horizontalSpan = 3;
-        mUseExistingKeystore.setSelection(true);
-
-        mCreateKeystore = new Button(composite, SWT.RADIO);
-        mCreateKeystore.setText("Create new keystore");
-        mCreateKeystore.setLayoutData(gd = new GridData(GridData.FILL_HORIZONTAL));
-        gd.horizontalSpan = 3;
-
-        new Label(composite, SWT.NONE).setText("Location:");
-        mKeystore = new Text(composite, SWT.BORDER);
-        mKeystore.setLayoutData(gd = new GridData(GridData.FILL_HORIZONTAL));
-        final Button browseButton = new Button(composite, SWT.PUSH);
-        browseButton.setText("Browse...");
-        browseButton.addSelectionListener(new SelectionAdapter() {
-           @Override
-           public void widgetSelected(SelectionEvent e) {
-               FileDialog fileDialog;
-               if (mUseExistingKeystore.getSelection()) {
-                   fileDialog = new FileDialog(browseButton.getShell(),SWT.OPEN);
-                   fileDialog.setText("Load Keystore");
-               } else {
-                   fileDialog = new FileDialog(browseButton.getShell(),SWT.SAVE);
-                   fileDialog.setText("Select Keystore Name");
-               }
-
-               String fileName = fileDialog.open();
-               if (fileName != null) {
-                   mKeystore.setText(fileName);
-               }
-           }
-        });
-
-        new Label(composite, SWT.NONE).setText("Password:");
-        mKeystorePassword = new Text(composite, SWT.BORDER | SWT.PASSWORD);
-        mKeystorePassword.setLayoutData(gd = new GridData(GridData.FILL_HORIZONTAL));
-        mKeystorePassword.addVerifyListener(sPasswordVerifier);
-        new Composite(composite, SWT.NONE).setLayoutData(gd = new GridData());
-        gd.heightHint = gd.widthHint = 0;
-
-        mConfirmLabel = new Label(composite, SWT.NONE);
-        mConfirmLabel.setText("Confirm:");
-        mKeystorePassword2 = new Text(composite, SWT.BORDER | SWT.PASSWORD);
-        mKeystorePassword2.setLayoutData(gd = new GridData(GridData.FILL_HORIZONTAL));
-        mKeystorePassword2.addVerifyListener(sPasswordVerifier);
-        new Composite(composite, SWT.NONE).setLayoutData(gd = new GridData());
-        gd.heightHint = gd.widthHint = 0;
-        mKeystorePassword2.setEnabled(false);
-
-        // Show description the first time
-        setErrorMessage(null);
-        setMessage(null);
-        setControl(composite);
-
-        mUseExistingKeystore.addSelectionListener(new SelectionAdapter() {
-           @Override
-           public void widgetSelected(SelectionEvent e) {
-               boolean createStore = !mUseExistingKeystore.getSelection();
-               mKeystorePassword2.setEnabled(createStore);
-               mConfirmLabel.setEnabled(createStore);
-               mWizard.setKeystoreCreationMode(createStore);
-               onChange();
-            }
-        });
-
-        mKeystore.addModifyListener(new ModifyListener() {
-            @Override
-            public void modifyText(ModifyEvent e) {
-                mWizard.setKeystore(mKeystore.getText().trim());
-                onChange();
-            }
-        });
-
-        mKeystorePassword.addModifyListener(new ModifyListener() {
-            @Override
-            public void modifyText(ModifyEvent e) {
-                mWizard.setKeystorePassword(mKeystorePassword.getText());
-                onChange();
-            }
-        });
-
-        mKeystorePassword2.addModifyListener(new ModifyListener() {
-            @Override
-            public void modifyText(ModifyEvent e) {
-                onChange();
-            }
-        });
-    }
-
-    @Override
-    public IWizardPage getNextPage() {
-        if (mUseExistingKeystore.getSelection()) {
-            return mWizard.getKeySelectionPage();
-        }
-
-        return mWizard.getKeyCreationPage();
-    }
-
-    @Override
-    void onShow() {
-        // fill the texts with information loaded from the project.
-        if ((mProjectDataChanged & DATA_PROJECT) != 0) {
-            // reset the keystore/alias from the content of the project
-            IProject project = mWizard.getProject();
-
-            // disable onChange for now. we'll call it once at the end.
-            mDisableOnChange = true;
-
-            String keystore = ProjectHelper.loadStringProperty(project,
-                    ExportWizard.PROPERTY_KEYSTORE);
-            if (keystore != null) {
-                mKeystore.setText(keystore);
-            }
-
-            // reset the passwords
-            mKeystorePassword.setText(""); //$NON-NLS-1$
-            mKeystorePassword2.setText(""); //$NON-NLS-1$
-
-            // enable onChange, and call it to display errors and enable/disable pageCompleted.
-            mDisableOnChange = false;
-            onChange();
-        }
-    }
-
-    /**
-     * Handles changes and update the error message and calls {@link #setPageComplete(boolean)}.
-     */
-    private void onChange() {
-        if (mDisableOnChange) {
-            return;
-        }
-
-        setErrorMessage(null);
-        setMessage(null);
-
-        boolean createStore = !mUseExistingKeystore.getSelection();
-
-        // checks the keystore path is non null.
-        String keystore = mKeystore.getText().trim();
-        if (keystore.length() == 0) {
-            setErrorMessage("Enter path to keystore.");
-            setPageComplete(false);
-            return;
-        } else {
-            File f = new File(keystore);
-            if (f.exists() == false) {
-                if (createStore == false) {
-                    setErrorMessage("Keystore does not exist.");
-                    setPageComplete(false);
-                    return;
-                }
-            } else if (f.isDirectory()) {
-                setErrorMessage("Keystore path is a directory.");
-                setPageComplete(false);
-                return;
-            } else if (f.isFile()) {
-                if (createStore) {
-                    setErrorMessage("File already exists.");
-                    setPageComplete(false);
-                    return;
-                }
-            }
-        }
-
-        String value = mKeystorePassword.getText();
-        if (value.length() == 0) {
-            setErrorMessage("Enter keystore password.");
-            setPageComplete(false);
-            return;
-        } else if (createStore && value.length() < 6) {
-            setErrorMessage("Keystore password is too short - must be at least 6 characters.");
-            setPageComplete(false);
-            return;
-        }
-
-        if (createStore) {
-            if (mKeystorePassword2.getText().length() == 0) {
-                setErrorMessage("Confirm keystore password.");
-                setPageComplete(false);
-                return;
-            }
-
-            if (mKeystorePassword.getText().equals(mKeystorePassword2.getText()) == false) {
-                setErrorMessage("Keystore passwords do not match.");
-                setPageComplete(false);
-                return;
-            }
-        }
-
-        setPageComplete(true);
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/export/ProjectCheckPage.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/export/ProjectCheckPage.java
deleted file mode 100644
index b8a7043..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/export/ProjectCheckPage.java
+++ /dev/null
@@ -1,291 +0,0 @@
-/*
- * 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.wizards.export;
-
-import com.android.ide.common.xml.ManifestData;
-import com.android.ide.eclipse.adt.AdtConstants;
-import com.android.ide.eclipse.adt.internal.editors.IconFactory;
-import com.android.ide.eclipse.adt.internal.project.AndroidManifestHelper;
-import com.android.ide.eclipse.adt.internal.project.BaseProjectHelper;
-import com.android.ide.eclipse.adt.internal.project.ProjectChooserHelper;
-import com.android.ide.eclipse.adt.internal.project.ProjectChooserHelper.NonLibraryProjectOnlyFilter;
-import com.android.ide.eclipse.adt.internal.project.ProjectHelper;
-import com.android.ide.eclipse.adt.internal.wizards.export.ExportWizard.ExportWizardPage;
-
-import org.eclipse.core.resources.IFolder;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Text;
-
-/**
- * First Export Wizard Page. Display warning/errors.
- */
-final class ProjectCheckPage extends ExportWizardPage {
-    private final static String IMG_ERROR = "error.png"; //$NON-NLS-1$
-    private final static String IMG_WARNING = "warning.png"; //$NON-NLS-1$
-
-    private final ExportWizard mWizard;
-    private Image mError;
-    private Image mWarning;
-    private boolean mHasMessage = false;
-    private Composite mTopComposite;
-    private Composite mErrorComposite;
-    private Text mProjectText;
-    private ProjectChooserHelper mProjectChooserHelper;
-    private boolean mFirstOnShow = true;
-
-    protected ProjectCheckPage(ExportWizard wizard, String pageName) {
-        super(pageName);
-        mWizard = wizard;
-
-        setTitle("Project Checks");
-        setDescription("Performs a set of checks to make sure the application can be exported.");
-    }
-
-    @Override
-    public void createControl(Composite parent) {
-        mProjectChooserHelper = new ProjectChooserHelper(parent.getShell(),
-                new NonLibraryProjectOnlyFilter());
-
-        GridLayout gl = null;
-        GridData gd = null;
-
-        mTopComposite = new Composite(parent, SWT.NONE);
-        mTopComposite.setLayoutData(new GridData(GridData.FILL_BOTH));
-        mTopComposite.setLayout(new GridLayout(1, false));
-
-        // composite for the project selection.
-        Composite projectComposite = new Composite(mTopComposite, SWT.NONE);
-        projectComposite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-        projectComposite.setLayout(gl = new GridLayout(3, false));
-        gl.marginHeight = gl.marginWidth = 0;
-
-        Label label = new Label(projectComposite, SWT.NONE);
-        label.setLayoutData(gd = new GridData(GridData.FILL_HORIZONTAL));
-        gd.horizontalSpan = 3;
-        label.setText("Select the project to export:");
-
-        new Label(projectComposite, SWT.NONE).setText("Project:");
-        mProjectText = new Text(projectComposite, SWT.BORDER);
-        mProjectText.setLayoutData(gd = new GridData(GridData.FILL_HORIZONTAL));
-        mProjectText.addModifyListener(new ModifyListener() {
-            @Override
-            public void modifyText(ModifyEvent e) {
-                handleProjectNameChange();
-            }
-        });
-
-        Button browseButton = new Button(projectComposite, SWT.PUSH);
-        browseButton.setText("Browse...");
-        browseButton.addSelectionListener(new SelectionAdapter() {
-            @Override
-            public void widgetSelected(SelectionEvent e) {
-                IJavaProject javaProject = mProjectChooserHelper.chooseJavaProject(
-                        mProjectText.getText().trim(),
-                        "Please select a project to export");
-
-                if (javaProject != null) {
-                    IProject project = javaProject.getProject();
-
-                    // set the new name in the text field. The modify listener will take
-                    // care of updating the status and the ExportWizard object.
-                    mProjectText.setText(project.getName());
-                }
-            }
-        });
-
-        setControl(mTopComposite);
-    }
-
-    @Override
-    void onShow() {
-        if (mFirstOnShow) {
-            // get the project and init the ui
-            IProject project = mWizard.getProject();
-            if (project != null) {
-                mProjectText.setText(project.getName());
-            }
-
-            mFirstOnShow = false;
-        }
-    }
-
-    private void buildErrorUi(IProject project) {
-        // Show description the first time
-        setErrorMessage(null);
-        setMessage(null);
-        setPageComplete(true);
-        mHasMessage = false;
-
-        // composite parent for the warning/error
-        GridLayout gl = null;
-        mErrorComposite = new Composite(mTopComposite, SWT.NONE);
-        mErrorComposite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-        gl = new GridLayout(2, false);
-        gl.marginHeight = gl.marginWidth = 0;
-        gl.verticalSpacing *= 3; // more spacing than normal.
-        mErrorComposite.setLayout(gl);
-
-        if (project == null) {
-            setErrorMessage("Select project to export.");
-            mHasMessage = true;
-        } else {
-            try {
-                if (project.hasNature(AdtConstants.NATURE_DEFAULT) == false) {
-                    addError(mErrorComposite, "Project is not an Android project.");
-                } else {
-                    // check for errors
-                    if (ProjectHelper.hasError(project, true))  {
-                        addError(mErrorComposite, "Project has compilation error(s)");
-                    }
-
-                    // check the project output
-                    IFolder outputIFolder = BaseProjectHelper.getJavaOutputFolder(project);
-                    if (outputIFolder == null) {
-                        addError(mErrorComposite,
-                                "Unable to get the output folder of the project!");
-                    }
-
-                    // project is an android project, we check the debuggable attribute.
-                    ManifestData manifestData = AndroidManifestHelper.parseForData(project);
-                    Boolean debuggable = null;
-                    if (manifestData != null) {
-                        debuggable = manifestData.getDebuggable();
-                    }
-
-                    if (debuggable != null && debuggable == Boolean.TRUE) {
-                        addWarning(mErrorComposite,
-                                "The manifest 'debuggable' attribute is set to true.\n" +
-                                "You should set it to false for applications that you release to the public.\n\n" +
-                                "Applications with debuggable=true are compiled in debug mode always.");
-                    }
-
-                    // check for mapview stuff
-                }
-            } catch (CoreException e) {
-                // unable to access nature
-                addError(mErrorComposite, "Unable to get project nature");
-            }
-        }
-
-        if (mHasMessage == false) {
-            Label label = new Label(mErrorComposite, SWT.NONE);
-            GridData gd = new GridData(GridData.FILL_HORIZONTAL);
-            gd.horizontalSpan = 2;
-            label.setLayoutData(gd);
-            label.setText("No errors found. Click Next.");
-        }
-
-        mTopComposite.layout();
-    }
-
-    /**
-     * Adds an error label to a {@link Composite} object.
-     * @param parent the Composite parent.
-     * @param message the error message.
-     */
-    private void addError(Composite parent, String message) {
-        if (mError == null) {
-            mError = IconFactory.getInstance().getIcon(IMG_ERROR);
-        }
-
-        new Label(parent, SWT.NONE).setImage(mError);
-        Label label = new Label(parent, SWT.NONE);
-        label.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-        label.setText(message);
-
-        setErrorMessage("Application cannot be exported due to the error(s) below.");
-        setPageComplete(false);
-        mHasMessage = true;
-    }
-
-    /**
-     * Adds a warning label to a {@link Composite} object.
-     * @param parent the Composite parent.
-     * @param message the warning message.
-     */
-    private void addWarning(Composite parent, String message) {
-        if (mWarning == null) {
-            mWarning = IconFactory.getInstance().getIcon(IMG_WARNING);
-        }
-
-        new Label(parent, SWT.NONE).setImage(mWarning);
-        Label label = new Label(parent, SWT.NONE);
-        label.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-        label.setText(message);
-
-        mHasMessage = true;
-    }
-
-    /**
-     * Checks the parameters for correctness, and update the error message and buttons.
-     */
-    private void handleProjectNameChange() {
-        setPageComplete(false);
-
-        if (mErrorComposite != null) {
-            mErrorComposite.dispose();
-            mErrorComposite = null;
-        }
-
-        // update the wizard with the new project
-        mWizard.setProject(null);
-
-        //test the project name first!
-        String text = mProjectText.getText().trim();
-        if (text.length() == 0) {
-            setErrorMessage("Select project to export.");
-        } else if (text.matches("[a-zA-Z0-9_ \\.-]+") == false) {
-            setErrorMessage("Project name contains unsupported characters!");
-        } else {
-            IJavaProject[] projects = mProjectChooserHelper.getAndroidProjects(null);
-            IProject found = null;
-            for (IJavaProject javaProject : projects) {
-                if (javaProject.getProject().getName().equals(text)) {
-                    found = javaProject.getProject();
-                    break;
-                }
-
-            }
-
-            if (found != null) {
-                setErrorMessage(null);
-
-                // update the wizard with the new project
-                mWizard.setProject(found);
-
-                // now rebuild the error ui.
-                buildErrorUi(found);
-            } else {
-                setErrorMessage(String.format("There is no android project named '%1$s'",
-                        text));
-            }
-        }
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/exportgradle/BuildFileCreator.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/exportgradle/BuildFileCreator.java
deleted file mode 100644
index d3df058..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/exportgradle/BuildFileCreator.java
+++ /dev/null
@@ -1,642 +0,0 @@
-/*
- * Copyright (C) 2013 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.wizards.exportgradle;
-
-import static com.android.SdkConstants.GRADLE_LATEST_VERSION;
-import static com.android.SdkConstants.GRADLE_PLUGIN_LATEST_VERSION;
-import static com.android.SdkConstants.GRADLE_PLUGIN_NAME;
-import static com.android.tools.lint.checks.GradleDetector.APP_PLUGIN_ID;
-import static com.android.tools.lint.checks.GradleDetector.LIB_PLUGIN_ID;
-
-import com.android.SdkConstants;
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-import com.android.ide.eclipse.adt.internal.project.BaseProjectHelper;
-import com.android.ide.eclipse.adt.internal.sdk.ProjectState;
-import com.android.ide.eclipse.adt.internal.sdk.Sdk;
-import com.android.ide.eclipse.adt.io.IFolderWrapper;
-import com.android.io.IAbstractFile;
-import com.android.sdklib.io.FileOp;
-import com.android.xml.AndroidManifest;
-import com.google.common.base.Charsets;
-import com.google.common.base.Joiner;
-import com.google.common.collect.Lists;
-import com.google.common.io.Closeables;
-import com.google.common.io.Files;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IWorkspaceRoot;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.core.runtime.SubMonitor;
-import org.eclipse.jdt.core.IClasspathEntry;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.JavaCore;
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.swt.widgets.Shell;
-
-import java.io.ByteArrayInputStream;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Comparator;
-import java.util.List;
-import java.util.Properties;
-import java.util.Set;
-import java.util.TreeSet;
-
-/**
- * Creates build.gradle and settings.gradle files for a set of projects.
- * <p>
- * Based on {@link org.eclipse.ant.internal.ui.datatransfer.BuildFileCreator}
- */
-public class BuildFileCreator {
-    static final String BUILD_FILE = "build.gradle"; //$NON-NLS-1$
-    static final String SETTINGS_FILE = "settings.gradle"; //$NON-NLS-1$
-    private static final String NEWLINE = System.getProperty("line.separator"); //$NON-NLS-1$
-    private static final String GRADLE_WRAPPER_LOCATION =
-            "tools/templates/gradle/wrapper"; //$NON-NLS-1$
-    static final String PLUGIN_CLASSPATH =
-            "classpath '" + GRADLE_PLUGIN_NAME + GRADLE_PLUGIN_LATEST_VERSION + "'"; //$NON-NLS-1$
-    static final String MAVEN_REPOSITORY = "jcenter()"; //$NON-NLS-1$
-
-    private static final String[] GRADLE_WRAPPER_FILES = new String[] {
-        "gradlew", //$NON-NLS-1$
-        "gradlew.bat", //$NON-NLS-1$
-        "gradle/wrapper/gradle-wrapper.jar", //$NON-NLS-1$
-        "gradle/wrapper/gradle-wrapper.properties" //$NON-NLS-1$
-    };
-
-    private static final Comparator<IFile> FILE_COMPARATOR = new Comparator<IFile>() {
-        @Override
-        public int compare(IFile o1, IFile o2) {
-            return o1.toString().compareTo(o2.toString());
-        }
-    };
-
-    private final GradleModule mModule;
-    private final StringBuilder mBuildFile = new StringBuilder();
-
-    /**
-     * Create buildfile for the projects.
-     *
-     * @param shell parent instance for dialogs
-     * @return project names for which buildfiles were created
-     * @throws InterruptedException thrown when user cancels task
-     */
-    public static void createBuildFiles(
-            @NonNull ProjectSetupBuilder builder,
-            @NonNull Shell shell,
-            @NonNull IProgressMonitor pm) {
-
-        File gradleLocation = new File(Sdk.getCurrent().getSdkOsLocation(), GRADLE_WRAPPER_LOCATION);
-        SubMonitor localmonitor = null;
-
-        try {
-            // See if we have a Gradle wrapper in the SDK templates directory. If so, we can copy
-            // it over.
-            boolean hasGradleWrapper = true;
-            for (File wrapperFile : getGradleWrapperFiles(gradleLocation)) {
-                if (!wrapperFile.exists()) {
-                    hasGradleWrapper = false;
-                }
-            }
-
-            Collection<GradleModule> modules = builder.getModules();
-            boolean multiModules = modules.size() > 1;
-
-            // determine files to create/change
-            List<IFile> files = new ArrayList<IFile>();
-
-            // add the build.gradle file for all modules.
-            for (GradleModule module : modules) {
-                // build.gradle file
-                IFile file = module.getProject().getFile(BuildFileCreator.BUILD_FILE);
-                files.add(file);
-            }
-
-            // get the commonRoot for all modules. If only one module, this returns the path
-            // of the project.
-            IPath commonRoot = builder.getCommonRoot();
-
-            IWorkspaceRoot workspaceRoot = ResourcesPlugin.getWorkspace().getRoot();
-            IPath workspaceLocation = workspaceRoot.getLocation();
-
-            IPath relativePath = commonRoot.makeRelativeTo(workspaceLocation);
-            // if makeRelativePath to returns the same path, then commonRoot is not in the
-            // workspace.
-            boolean rootInWorkspace = !relativePath.equals(commonRoot);
-            // we only care if the root is a workspace project. if it's the workspace folder itself,
-            // then the files won't be handled by the workspace.
-            rootInWorkspace = rootInWorkspace && relativePath.segmentCount() > 0;
-
-            File settingsFile = new File(commonRoot.toFile(), SETTINGS_FILE);
-
-            // more than one modules -> generate settings.gradle
-            if (multiModules && rootInWorkspace) {
-
-                // Locate the settings.gradle file and add it to the changed files list
-                IPath settingsGradle = Path.fromOSString(settingsFile.getAbsolutePath());
-
-                // different path, means commonRoot is inside the workspace, which means we have
-                // to add settings.gradle and wrapper files to the list of files to add.
-                IFile iFile = workspaceRoot.getFile(settingsGradle);
-                if (iFile != null) {
-                    files.add(iFile);
-                }
-            }
-
-            // Gradle wrapper files
-            if (hasGradleWrapper && rootInWorkspace) {
-                // See if there already wrapper files there and only mark nonexistent ones for
-                // creation.
-                for (File wrapperFile : getGradleWrapperFiles(commonRoot.toFile())) {
-                    if (!wrapperFile.exists()) {
-                        IPath path = Path.fromOSString(wrapperFile.getAbsolutePath());
-                        IFile file = workspaceRoot.getFile(path);
-                        files.add(file);
-                    }
-                }
-            }
-
-            ExportStatus status = new ExportStatus();
-            builder.setStatus(status);
-
-            // Trigger checkout of changed files
-            Set<IFile> confirmedFiles = validateEdit(files, status, shell);
-
-            if (status.hasError()) {
-                return;
-            }
-
-            // Now iterate over all the modules and generate the build files.
-            localmonitor = SubMonitor.convert(pm, ExportMessages.PageTitle,
-                    confirmedFiles.size());
-            List<String> projectSettingsPath = Lists.newArrayList();
-            for (GradleModule currentModule : modules) {
-                IProject moduleProject = currentModule.getProject();
-
-                IFile file = moduleProject.getFile(BuildFileCreator.BUILD_FILE);
-                if (!confirmedFiles.contains(file)) {
-                    continue;
-                }
-
-                localmonitor.setTaskName(NLS.bind(ExportMessages.FileStatusMessage,
-                        moduleProject.getName()));
-
-                ProjectState projectState = Sdk.getProjectState(moduleProject);
-                BuildFileCreator instance = new BuildFileCreator(currentModule, shell);
-                if (projectState != null) {
-                    // This is an Android project
-                    if (!multiModules) {
-                        instance.appendBuildScript();
-                    }
-                    instance.appendHeader(projectState.isLibrary());
-                    instance.appendDependencies();
-                    instance.startAndroidTask(projectState);
-                    //instance.appendDefaultConfig();
-                    instance.createAndroidSourceSets();
-                    instance.finishAndroidTask();
-                } else {
-                    // This is a plain Java project
-                    instance.appendJavaHeader();
-                    instance.createJavaSourceSets();
-                }
-
-               try {
-                    // Write the build file
-                    String buildfile = instance.mBuildFile.toString();
-                    InputStream is =
-                            new ByteArrayInputStream(buildfile.getBytes("UTF-8")); //$NON-NLS-1$
-                    if (file.exists()) {
-                        file.setContents(is, true, true, null);
-                    } else {
-                        file.create(is, true, null);
-                    }
-               } catch (Exception e) {
-                     status.addFileStatus(ExportStatus.FileStatus.IO_FAILURE,
-                             file.getLocation().toFile());
-                     status.setErrorMessage(e.getMessage());
-                     return;
-               }
-
-               if (localmonitor.isCanceled()) {
-                   return;
-               }
-               localmonitor.worked(1);
-
-                // get the project path to add it to the settings.gradle.
-                projectSettingsPath.add(currentModule.getPath());
-            }
-
-            // write the settings file.
-            if (multiModules) {
-                try {
-                    writeGradleSettingsFile(settingsFile, projectSettingsPath);
-                } catch (IOException e) {
-                    status.addFileStatus(ExportStatus.FileStatus.IO_FAILURE, settingsFile);
-                    status.setErrorMessage(e.getMessage());
-                    return;
-                }
-                File mainBuildFile = new File(commonRoot.toFile(), BUILD_FILE);
-                try {
-                    writeRootBuildGradle(mainBuildFile);
-                } catch (IOException e) {
-                    status.addFileStatus(ExportStatus.FileStatus.IO_FAILURE, mainBuildFile);
-                    status.setErrorMessage(e.getMessage());
-                    return;
-                }
-            }
-
-            // finally write the wrapper
-            // TODO check we can based on where it is
-            if (hasGradleWrapper) {
-                copyGradleWrapper(gradleLocation, commonRoot.toFile(), status);
-                if (status.hasError()) {
-                    return;
-                }
-            }
-
-        } finally {
-            if (localmonitor != null && !localmonitor.isCanceled()) {
-                localmonitor.done();
-            }
-            if (pm != null) {
-                pm.done();
-            }
-        }
-    }
-
-    /**
-     * @param GradleModule create buildfile for this project
-     * @param shell parent instance for dialogs
-     */
-    private BuildFileCreator(GradleModule module, Shell shell) {
-        mModule = module;
-    }
-
-    /**
-     * Return the files that comprise the Gradle wrapper as a collection of {@link File} instances.
-     * @param root
-     * @return
-     */
-    private static List<File> getGradleWrapperFiles(File root) {
-        List<File> files = new ArrayList<File>(GRADLE_WRAPPER_FILES.length);
-        for (String file : GRADLE_WRAPPER_FILES) {
-            files.add(new File(root, file));
-        }
-        return files;
-    }
-
-    /**
-     * Copy the Gradle wrapper files from one directory to another.
-     */
-    private static void copyGradleWrapper(File from, File to, ExportStatus status) {
-        for (String file : GRADLE_WRAPPER_FILES) {
-            File dest = new File(to, file);
-            try {
-                File src = new File(from, file);
-                dest.getParentFile().mkdirs();
-                new FileOp().copyFile(src, dest);
-
-                if (src.getName().equals(GRADLE_PROPERTIES)) {
-                    updateGradleDistributionUrl(GRADLE_LATEST_VERSION, dest);
-                }
-                dest.setExecutable(src.canExecute());
-                status.addFileStatus(ExportStatus.FileStatus.OK, dest);
-            } catch (IOException e) {
-                status.addFileStatus(ExportStatus.FileStatus.IO_FAILURE, dest);
-                return;
-            }
-        }
-    }
-
-    /**
-     * Outputs boilerplate buildscript information common to all Gradle build files.
-     */
-    private void appendBuildScript() {
-        appendBuildScript(mBuildFile);
-    }
-
-    /**
-     * Outputs boilerplate header information common to all Gradle build files.
-     */
-    private static void appendBuildScript(StringBuilder builder) {
-        builder.append("buildscript {\n"); //$NON-NLS-1$
-        builder.append("    repositories {\n"); //$NON-NLS-1$
-        builder.append("        " + MAVEN_REPOSITORY + "\n"); //$NON-NLS-1$
-        builder.append("    }\n"); //$NON-NLS-1$
-        builder.append("    dependencies {\n"); //$NON-NLS-1$
-        builder.append("        " + PLUGIN_CLASSPATH + "\n"); //$NON-NLS-1$
-        builder.append("    }\n"); //$NON-NLS-1$
-        builder.append("}\n"); //$NON-NLS-1$
-    }
-
-    /**
-     * Outputs boilerplate header information common to all Gradle build files.
-     */
-    private void appendHeader(boolean isLibrary) {
-        if (isLibrary) {
-            mBuildFile.append("apply plugin: '").append(LIB_PLUGIN_ID).append("'\n"); //$NON-NLS-1$  //$NON-NLS-2$
-        } else {
-            mBuildFile.append("apply plugin: '").append(APP_PLUGIN_ID).append("'\n"); //$NON-NLS-1$  //$NON-NLS-2$
-        }
-        mBuildFile.append("\n"); //$NON-NLS-1$
-    }
-
-    /**
-     * Outputs a block which sets up library and project dependencies.
-     */
-    private void appendDependencies() {
-        mBuildFile.append("dependencies {\n"); //$NON-NLS-1$
-
-        // first the local jars.
-        // TODO: Fix
-        mBuildFile.append("    compile fileTree(dir: 'libs', include: '*.jar')\n"); //$NON-NLS-1$
-
-        for (GradleModule dep : mModule.getDependencies()) {
-            mBuildFile.append("    compile project('" + dep.getPath() + "')\n"); //$NON-NLS-1$ //$NON-NLS-2$
-        }
-
-        mBuildFile.append("}\n"); //$NON-NLS-1$
-        mBuildFile.append("\n"); //$NON-NLS-1$
-    }
-
-    /**
-     * Outputs the beginning of an Android task in the build file.
-     */
-    private void startAndroidTask(ProjectState projectState) {
-        int buildApi = projectState.getTarget().getVersion().getApiLevel();
-        String toolsVersion = projectState.getTarget().getBuildToolInfo().getRevision().toString();
-        mBuildFile.append("android {\n"); //$NON-NLS-1$
-        mBuildFile.append("    compileSdkVersion " + buildApi + "\n"); //$NON-NLS-1$
-        mBuildFile.append("    buildToolsVersion \"" + toolsVersion + "\"\n"); //$NON-NLS-1$
-        mBuildFile.append("\n"); //$NON-NLS-1$
-
-        try {
-            IJavaProject javaProject = BaseProjectHelper.getJavaProject(projectState.getProject());
-            // otherwise we check source compatibility
-            String source = javaProject.getOption(JavaCore.COMPILER_SOURCE, true);
-            if (JavaCore.VERSION_1_7.equals(source)) {
-                mBuildFile.append(
-                        "    compileOptions {\n" + //$NON-NLS-1$
-                        "        sourceCompatibility JavaVersion.VERSION_1_7\n" + //$NON-NLS-1$
-                        "        targetCompatibility JavaVersion.VERSION_1_7\n" + //$NON-NLS-1$
-                        "    }\n" + //$NON-NLS-1$
-                        "\n"); //$NON-NLS-1$
-            }
-        } catch (CoreException e) {
-            // Ignore compliance level, go with default
-        }
-    }
-
-    /**
-     * Outputs a sourceSets block to the Android task that locates all of the various source
-     * subdirectories in the project.
-     */
-    private void createAndroidSourceSets() {
-        IFolderWrapper projectFolder = new IFolderWrapper(mModule.getProject());
-        IAbstractFile mManifestFile = AndroidManifest.getManifest(projectFolder);
-        if (mManifestFile == null) {
-            return;
-        }
-        List<String> srcDirs = new ArrayList<String>();
-        for (IClasspathEntry entry : mModule.getJavaProject().readRawClasspath()) {
-            if (entry.getEntryKind() != IClasspathEntry.CPE_SOURCE ||
-                    SdkConstants.FD_GEN_SOURCES.equals(entry.getPath().lastSegment())) {
-                continue;
-            }
-            IPath path = entry.getPath().removeFirstSegments(1);
-            srcDirs.add("'" + path.toOSString() + "'"); //$NON-NLS-1$
-        }
-
-        String srcPaths = Joiner.on(",").join(srcDirs);
-
-        mBuildFile.append("    sourceSets {\n"); //$NON-NLS-1$
-        mBuildFile.append("        main {\n"); //$NON-NLS-1$
-        mBuildFile.append("            manifest.srcFile '" + SdkConstants.FN_ANDROID_MANIFEST_XML + "'\n"); //$NON-NLS-1$
-        mBuildFile.append("            java.srcDirs = [" + srcPaths + "]\n"); //$NON-NLS-1$
-        mBuildFile.append("            resources.srcDirs = [" + srcPaths + "]\n"); //$NON-NLS-1$
-        mBuildFile.append("            aidl.srcDirs = [" + srcPaths + "]\n"); //$NON-NLS-1$
-        mBuildFile.append("            renderscript.srcDirs = [" + srcPaths + "]\n"); //$NON-NLS-1$
-        mBuildFile.append("            res.srcDirs = ['res']\n"); //$NON-NLS-1$
-        mBuildFile.append("            assets.srcDirs = ['assets']\n"); //$NON-NLS-1$
-        mBuildFile.append("        }\n"); //$NON-NLS-1$
-        mBuildFile.append("\n"); //$NON-NLS-1$
-        mBuildFile.append("        // Move the tests to tests/java, tests/res, etc...\n"); //$NON-NLS-1$
-        mBuildFile.append("        instrumentTest.setRoot('tests')\n"); //$NON-NLS-1$
-        if (srcDirs.contains("'src'")) {
-            mBuildFile.append("\n"); //$NON-NLS-1$
-            mBuildFile.append("        // Move the build types to build-types/<type>\n"); //$NON-NLS-1$
-            mBuildFile.append("        // For instance, build-types/debug/java, build-types/debug/AndroidManifest.xml, ...\n"); //$NON-NLS-1$
-            mBuildFile.append("        // This moves them out of them default location under src/<type>/... which would\n"); //$NON-NLS-1$
-            mBuildFile.append("        // conflict with src/ being used by the main source set.\n"); //$NON-NLS-1$
-            mBuildFile.append("        // Adding new build types or product flavors should be accompanied\n"); //$NON-NLS-1$
-            mBuildFile.append("        // by a similar customization.\n"); //$NON-NLS-1$
-            mBuildFile.append("        debug.setRoot('build-types/debug')\n"); //$NON-NLS-1$
-            mBuildFile.append("        release.setRoot('build-types/release')\n"); //$NON-NLS-1$
-        }
-        mBuildFile.append("    }\n"); //$NON-NLS-1$
-    }
-
-    /**
-     * Outputs the completion of the Android task in the build file.
-     */
-    private void finishAndroidTask() {
-        mBuildFile.append("}\n"); //$NON-NLS-1$
-    }
-
-    /**
-     * Outputs a boilerplate header for non-Android projects
-     */
-    private void appendJavaHeader() {
-        mBuildFile.append("apply plugin: 'java'\n"); //$NON-NLS-1$
-    }
-
-    /**
-     * Outputs a sourceSets block for non-Android projects to locate the source directories.
-     */
-    private void createJavaSourceSets() {
-        List<String> dirs = new ArrayList<String>();
-        for (IClasspathEntry entry : mModule.getJavaProject().readRawClasspath()) {
-            if (entry.getEntryKind() != IClasspathEntry.CPE_SOURCE) {
-                continue;
-            }
-            IPath path = entry.getPath().removeFirstSegments(1);
-            dirs.add("'" + path.toOSString() + "'"); //$NON-NLS-1$
-        }
-
-        String srcPaths = Joiner.on(",").join(dirs);
-
-        mBuildFile.append("sourceSets {\n"); //$NON-NLS-1$
-        mBuildFile.append("    main.java.srcDirs = [" + srcPaths + "]\n"); //$NON-NLS-1$
-        mBuildFile.append("    main.resources.srcDirs = [" + srcPaths + "]\n"); //$NON-NLS-1$
-        mBuildFile.append("    test.java.srcDirs = ['tests/java']\n"); //$NON-NLS-1$
-        mBuildFile.append("    test.resources.srcDirs = ['tests/resources']\n"); //$NON-NLS-1$
-        mBuildFile.append("}\n"); //$NON-NLS-1$
-    }
-
-    /**
-     * Merges the new subproject dependencies into the settings.gradle file if it already exists,
-     * and creates one if it does not.
-     * @throws IOException
-     */
-    private static void writeGradleSettingsFile(File settingsFile, List<String> projectPaths)
-            throws IOException {
-        StringBuilder contents = new StringBuilder();
-        for (String path : projectPaths) {
-            contents.append("include '").append(path).append("'\n"); //$NON-NLS-1$ //$NON-NLS-2$
-        }
-
-        Files.write(contents.toString(), settingsFile, Charsets.UTF_8);
-    }
-
-    private static void writeRootBuildGradle(File buildFile) throws IOException {
-        StringBuilder sb = new StringBuilder(
-                "// Top-level build file where you can add configuration options common to all sub-projects/modules.\n");
-
-        appendBuildScript(sb);
-
-        Files.write(sb.toString(), buildFile, Charsets.UTF_8);
-    }
-
-    /**
-     * Request write access to given files. Depending on the version control
-     * plug-in opens a confirm checkout dialog.
-     *
-     * @param shell
-     *            parent instance for dialogs
-     * @return <code>IFile</code> objects for which user confirmed checkout
-     * @throws CoreException
-     *             thrown if project is under version control, but not connected
-     */
-    static Set<IFile> validateEdit(
-            @NonNull List<IFile> files,
-            @NonNull ExportStatus exportStatus,
-            @NonNull Shell shell) {
-        Set<IFile> confirmedFiles = new TreeSet<IFile>(FILE_COMPARATOR);
-        if (files.size() == 0) {
-            return confirmedFiles;
-        }
-        IStatus status = (files.get(0)).getWorkspace().validateEdit(
-                files.toArray(new IFile[files.size()]), shell);
-        if (status.isMultiStatus() && status.getChildren().length > 0) {
-            for (int i = 0; i < status.getChildren().length; i++) {
-                IStatus statusChild = status.getChildren()[i];
-                if (statusChild.isOK()) {
-                    confirmedFiles.add(files.get(i));
-                } else {
-                    exportStatus.addFileStatus(
-                            ExportStatus.FileStatus.VCS_FAILURE,
-                            files.get(i).getLocation().toFile());
-                }
-            }
-        } else if (status.isOK()) {
-            confirmedFiles.addAll(files);
-        }
-        if (status.getSeverity() == IStatus.ERROR) {
-            // not possible to checkout files: not connected to version
-            // control plugin or hijacked files and made read-only, so
-            // collect error messages provided by validator and re-throw
-            StringBuffer message = new StringBuffer(status.getPlugin() + ": " //$NON-NLS-1$
-                    + status.getMessage() + NEWLINE);
-            if (status.isMultiStatus()) {
-                for (int i = 0; i < status.getChildren().length; i++) {
-                    IStatus statusChild = status.getChildren()[i];
-                    message.append(statusChild.getMessage() + NEWLINE);
-                }
-            }
-            String s = message.toString();
-            exportStatus.setErrorMessage(s);
-        }
-
-        return confirmedFiles;
-    }
-
-    // -------------------------------------------------------------------------------
-    // Fix gradle wrapper version. This code is from GradleUtil in the Studio plugin:
-    // -------------------------------------------------------------------------------
-
-    private static final String GRADLE_PROPERTIES = "gradle-wrapper.properties";
-    private static final String GRADLEW_PROPERTIES_PATH =
-            "gradle" + File.separator + "wrapper" + File.separator + GRADLE_PROPERTIES;
-    private static final String GRADLEW_DISTRIBUTION_URL_PROPERTY_NAME = "distributionUrl";
-
-    @NonNull
-    private static File getGradleWrapperPropertiesFilePath(@NonNull File projectRootDir) {
-        return new File(projectRootDir, GRADLEW_PROPERTIES_PATH);
-    }
-
-    @Nullable
-    public static File findWrapperPropertiesFile(@NonNull File projectRootDir) {
-      File wrapperPropertiesFile = getGradleWrapperPropertiesFilePath(projectRootDir);
-      return wrapperPropertiesFile.isFile() ? wrapperPropertiesFile : null;
-    }
-
-    private static boolean updateGradleDistributionUrl(
-            @NonNull String gradleVersion,
-            @NonNull File propertiesFile) throws IOException {
-        Properties properties = loadGradleWrapperProperties(propertiesFile);
-        String gradleDistributionUrl = getGradleDistributionUrl(gradleVersion, false);
-        String property = properties.getProperty(GRADLEW_DISTRIBUTION_URL_PROPERTY_NAME);
-        if (property != null
-                && (property.equals(gradleDistributionUrl) || property
-                        .equals(getGradleDistributionUrl(gradleVersion, true)))) {
-            return false;
-        }
-        properties.setProperty(GRADLEW_DISTRIBUTION_URL_PROPERTY_NAME, gradleDistributionUrl);
-        FileOutputStream out = null;
-        try {
-            out = new FileOutputStream(propertiesFile);
-            properties.store(out, null);
-            return true;
-        } finally {
-            Closeables.close(out, true);
-        }
-    }
-
-    @NonNull
-    private static Properties loadGradleWrapperProperties(@NonNull File propertiesFile)
-            throws IOException {
-        Properties properties = new Properties();
-        FileInputStream fileInputStream = null;
-        try {
-            fileInputStream = new FileInputStream(propertiesFile);
-            properties.load(fileInputStream);
-            return properties;
-        } finally {
-            Closeables.close(fileInputStream, true);
-        }
-    }
-
-    @NonNull
-    private static String getGradleDistributionUrl(@NonNull String gradleVersion,
-            boolean binOnly) {
-        String suffix = binOnly ? "bin" : "all";
-        return String.format("https://services.gradle.org/distributions/gradle-%1$s-" + suffix
-                + ".zip", gradleVersion);
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/exportgradle/ConfirmationPage.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/exportgradle/ConfirmationPage.java
deleted file mode 100644
index 1f236fb..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/exportgradle/ConfirmationPage.java
+++ /dev/null
@@ -1,275 +0,0 @@
-/*
- * Copyright (C) 2013 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.wizards.exportgradle;
-
-import com.google.common.collect.Lists;
-
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.TableLayout;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.wizard.WizardPage;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Group;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.ui.model.WorkbenchLabelProvider;
-
-import java.io.File;
-import java.util.Collection;
-import java.util.List;
-
-/**
- * Confirmation page to review the actual project export
- * list and see warning about existing files.
- *
- */
-public class ConfirmationPage extends WizardPage {
-
-    private final ProjectSetupBuilder mBuilder;
-    private TableViewer mTableViewer;
-    private Label mModuleDescription1;
-    private Label mModuleDescription2;
-    private Label mModuleDescription3;
-    private Label mProjectRootLabel;
-    private Label mProjectRootWarning;
-    private List<IJavaProject> mOverrideProjects;
-    private boolean mOverrideWarning;
-    private Button mForceOverride;
-
-    public ConfirmationPage(ProjectSetupBuilder builder) {
-        super("ConfirmationPage"); //$NON-NLS-1$
-        mBuilder = builder;
-        setPageComplete(false);
-        setTitle(ExportMessages.PageTitle);
-        setDescription(ExportMessages.PageDescription);
-    }
-
-    @Override
-    public void createControl(Composite parent) {
-        initializeDialogUnits(parent);
-        GridData data;
-
-        Composite workArea = new Composite(parent, SWT.NONE);
-        setControl(workArea);
-
-        workArea.setLayout(new GridLayout());
-        workArea.setLayoutData(new GridData(GridData.FILL_BOTH
-                | GridData.GRAB_HORIZONTAL | GridData.GRAB_VERTICAL));
-
-        Label title = new Label(workArea, SWT.NONE);
-        title.setText("Please review the export options.");
-
-        Group group = new Group(workArea, SWT.NONE);
-        group.setText("Project root");
-        group.setLayout(new GridLayout());
-        group.setLayoutData(new GridData(SWT.FILL, SWT.NONE, true, false));
-
-        mProjectRootLabel = new Label(group, SWT.NONE);
-        mProjectRootLabel.setLayoutData(new GridData(SWT.FILL, SWT.NONE, true, false));
-
-        mProjectRootWarning = new Label(group, SWT.NONE);
-        mProjectRootWarning.setLayoutData(new GridData(SWT.FILL, SWT.NONE, true, false));
-
-        Group group2 = new Group(workArea, SWT.NONE);
-        group2.setText("Exported Modules");
-        group2.setLayout(new GridLayout());
-        group2.setLayoutData(data = new GridData(SWT.FILL, SWT.FILL, true, true));
-        data.heightHint = 300;
-
-        Table table = new Table(group2, SWT.BORDER | SWT.V_SCROLL | SWT.H_SCROLL);
-        mTableViewer = new TableViewer(table);
-        table.setLayout(new TableLayout());
-        table.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
-        mTableViewer.setContentProvider(new IStructuredContentProvider() {
-            @Override
-            public Object[] getElements(Object inputElement) {
-                if (inputElement instanceof ProjectSetupBuilder) {
-                    ProjectSetupBuilder builder = (ProjectSetupBuilder) inputElement;
-                    Collection<GradleModule> modules = builder.getModules();
-                    Object[] array = new Object[modules.size()];
-                    int i = 0;
-                    for (GradleModule module : modules) {
-                        array[i++] = module.getJavaProject();
-                    }
-
-                    return array;
-                }
-
-                return null;
-            }
-
-            @Override
-            public void dispose() {
-            }
-
-            @Override
-            public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-            }
-
-        });
-        mTableViewer.setLabelProvider(new WorkbenchLabelProvider() {
-            @Override
-            protected String decorateText(String input, Object element) {
-                if (element instanceof IJavaProject) {
-                    IJavaProject javaProject = (IJavaProject) element;
-                    StringBuilder sb = new StringBuilder(input);
-                    if (!mBuilder.isOriginalProject(javaProject)) {
-                        sb.append('*');
-                    }
-                    // TODO: decorate icon instead?
-                    if (mOverrideProjects.contains(javaProject)) {
-                        sb.append(" (1 warning)");
-                    }
-
-                    return sb.toString();
-                }
-
-                return input;
-            }
-        });
-        mTableViewer.addSelectionChangedListener(new ISelectionChangedListener() {
-            @Override
-            public void selectionChanged(SelectionChangedEvent event) {
-                IStructuredSelection selection = (IStructuredSelection) event.getSelection();
-                Object firstElement = selection.getFirstElement();
-                if (firstElement instanceof IJavaProject) {
-                    GradleModule module = mBuilder.getModule((IJavaProject) firstElement);
-                    if (mBuilder.getOriginalModules().contains(module)) {
-                        mModuleDescription1.setText("Exported because selected in previous page.");
-                    } else {
-                        List<GradleModule> list = mBuilder.getShortestDependencyTo(module);
-                        StringBuilder sb = new StringBuilder();
-                        for (GradleModule m : list) {
-                            if (sb.length() > 0) {
-                                sb.append(" > ");
-                            }
-                            sb.append(m.getJavaProject().getProject().getName());
-                        }
-                        mModuleDescription1.setText("Dependency chain: " + sb);
-                    }
-                    mModuleDescription2.setText("Path: " + module.getPath());
-
-                    if (mOverrideProjects.contains(module.getJavaProject())) {
-                        mModuleDescription3.setText(
-                                "WARNING: build.gradle already exists for this project");
-                    } else {
-                        mModuleDescription3.setText("");
-                    }
-                } else {
-                    mModuleDescription1.setText("");
-                    mModuleDescription2.setText("");
-                    mModuleDescription3.setText("");
-                }
-            }
-        });
-
-        mModuleDescription1 = new Label(group2, SWT.NONE);
-        mModuleDescription1.setLayoutData(new GridData(SWT.FILL, SWT.NONE, true, false));
-        mModuleDescription2 = new Label(group2, SWT.NONE);
-        mModuleDescription2.setLayoutData(new GridData(SWT.FILL, SWT.NONE, true, false));
-        mModuleDescription3 = new Label(group2, SWT.NONE);
-        mModuleDescription3.setLayoutData(new GridData(SWT.FILL, SWT.NONE, true, false));
-
-        mForceOverride = new Button(workArea, SWT.CHECK);
-        mForceOverride.setLayoutData(new GridData(SWT.FILL, SWT.NONE, true, false));
-        mForceOverride.setText("Force overriding of existing files");
-        mForceOverride.addSelectionListener(new SelectionAdapter() {
-            @Override
-            public void widgetSelected(SelectionEvent e) {
-                updateEnablement();
-            }
-        });
-
-        setControl(workArea);
-        Dialog.applyDialogFont(parent);
-    }
-
-    /**
-     * Get list of projects which have already a buildfile.
-     *
-     * @param javaProjects list of IJavaProject objects
-     * @return set of project names
-     */
-    private void computeOverride(String commonRoot) {
-        mOverrideProjects = Lists.newArrayList();
-        for (GradleModule module : mBuilder.getModules()) {
-            if (new File(module.getProject().getLocation().toFile(),
-                    BuildFileCreator.BUILD_FILE).exists()) {
-                mOverrideProjects.add(module.getJavaProject());
-            }
-        }
-
-        // also check on the root settings.gradle/build.gradle
-        boolean settingsFile = new File(commonRoot, BuildFileCreator.SETTINGS_FILE).exists();
-        boolean buildFile = new File(commonRoot, BuildFileCreator.BUILD_FILE).exists();
-        if (settingsFile && buildFile) {
-             mProjectRootWarning.setText(
-                     "WARNING: build.gradle/settings.gradle already exists at this location.");
-        } else if (settingsFile) {
-            mProjectRootWarning.setText(
-                    "WARNING: settings.gradle already exists at this location.");
-        } else if (buildFile) {
-            mProjectRootWarning.setText("WARNING: build.gradle already exists at this location.");
-        }
-
-        mOverrideWarning = mOverrideProjects.size() > 0 || settingsFile || buildFile;
-    }
-
-    /**
-     * Enables/disables the finish button on the wizard and displays error messages as needed.
-     */
-    private void updateEnablement() {
-        if (mOverrideWarning && !mForceOverride.getSelection()) {
-            setErrorMessage("Enable overriding of existing files before clicking Finish");
-            mBuilder.setCanGenerate(false);
-        } else {
-            setErrorMessage(null);
-            mBuilder.setCanGenerate(true);
-        }
-        setPageComplete(false);
-        getContainer().updateButtons();
-    }
-
-    @Override
-    public void setVisible(boolean visible) {
-        super.setVisible(visible);
-        if (visible) {
-            mProjectRootWarning.setText("");
-
-            String commonRoot = mBuilder.getCommonRoot().toOSString();
-            computeOverride(commonRoot);
-            mProjectRootLabel.setText(commonRoot);
-            mTableViewer.setInput(mBuilder);
-            mTableViewer.getTable().setFocus();
-            mBuilder.setCanFinish(false);
-            mBuilder.setCanGenerate(true);
-            updateEnablement();
-        }
-    }
-}
\ No newline at end of file
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/exportgradle/ExportMessages.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/exportgradle/ExportMessages.java
deleted file mode 100644
index c7d6c17..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/exportgradle/ExportMessages.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Copyright (C) 2013 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.wizards.exportgradle;
-
-import org.eclipse.osgi.util.NLS;
-
-public class ExportMessages extends NLS {
-    private static final String BUNDLE_NAME =
-            "com.android.ide.eclipse.adt.internal.wizards.exportgradle.ExportMessages";//$NON-NLS-1$
-
-    public static String PageTitle;
-    public static String PageDescription;
-    public static String SelectProjects;
-    public static String ConfirmOverwrite;
-    public static String ConfirmOverwriteTitle;
-    public static String CyclicProjectsError;
-    public static String ExportFailedError;
-    public static String SelectAll;
-    public static String DeselectAll;
-    public static String NoProjectsError;
-    public static String StatusMessage;
-    public static String FileStatusMessage;
-    public static String WindowTitle;
-
-    static {
-        // load message values from bundle file
-        NLS.initializeMessages(BUNDLE_NAME, ExportMessages.class);
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/exportgradle/ExportMessages.properties b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/exportgradle/ExportMessages.properties
deleted file mode 100644
index 1a6dbb1..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/exportgradle/ExportMessages.properties
+++ /dev/null
@@ -1,27 +0,0 @@
-# Copyright (C) 2013 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.
-
-PageTitle=Generate Gradle Build files
-PageDescription=Generates Gradle build files based on the configuration of the Java projects
-SelectProjects=Select the projects to use to &generate the Gradle buildfiles:
-ConfirmOverwrite=Are you sure you want to overwrite the buildfiles for these projects?
-ConfirmOverwriteTitle=Overwrite Buildfiles?
-CyclicProjectsError=A cycle was detected in the build path of project: {0}
-ExportFailedError=Buildfile export failed: {0}. See the error log for more details.
-SelectAll=&Select All
-DeselectAll=&Deselect All
-NoProjectsError=Select one or more projects to export.
-StatusMessage=Creating Gradle build files...
-FileStatusMessage=Generating build file for {0}...
-WindowTitle=Export
\ No newline at end of file
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/exportgradle/ExportStatus.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/exportgradle/ExportStatus.java
deleted file mode 100644
index 6fbe14e..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/exportgradle/ExportStatus.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * Copyright (C) 2013 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.wizards.exportgradle;
-
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-import com.google.common.collect.ArrayListMultimap;
-import com.google.common.collect.Multimap;
-
-import java.io.File;
-
-public class ExportStatus {
-
-    public static enum FileStatus { OK, VCS_FAILURE, IO_FAILURE; }
-
-    private String mMainError = null;
-    private final Multimap<FileStatus, File> mFileStatus = ArrayListMultimap.create();
-
-    void addFileStatus(@NonNull FileStatus status, @NonNull File file) {
-        mFileStatus.put(status, file);
-    }
-
-    boolean hasError() {
-        return mMainError != null ||
-                !mFileStatus.get(FileStatus.VCS_FAILURE).isEmpty() ||
-                !mFileStatus.get(FileStatus.IO_FAILURE).isEmpty();
-    }
-
-    public void setErrorMessage(String error) {
-        mMainError = error;
-    }
-
-    @Nullable
-    public String getErrorMessage() {
-        return mMainError;
-    }
-
-    @NonNull
-    public Multimap<FileStatus, File> getFileStatus() {
-        return mFileStatus;
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/exportgradle/FinalPage.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/exportgradle/FinalPage.java
deleted file mode 100644
index bbfadf8..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/exportgradle/FinalPage.java
+++ /dev/null
@@ -1,112 +0,0 @@
-/*
- * Copyright (C) 2013 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.wizards.exportgradle;
-
-import com.android.ide.eclipse.adt.internal.wizards.exportgradle.ExportStatus.FileStatus;
-import com.google.common.collect.Multimap;
-
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.jface.wizard.WizardPage;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Text;
-
-import java.io.File;
-import java.util.Collection;
-
-/**
- * Final page to review the result of the export.
- */
-public class FinalPage extends WizardPage {
-
-    private final ProjectSetupBuilder mBuilder;
-    private ExportStatus mStatus;
-
-    private Text mText;
-
-    public FinalPage(ProjectSetupBuilder builder) {
-        super("FinalPage"); //$NON-NLS-1$
-        mBuilder = builder;
-        setPageComplete(true);
-        setTitle(ExportMessages.PageTitle);
-        setDescription(ExportMessages.PageDescription);
-    }
-
-    @Override
-    public void createControl(Composite parent) {
-        initializeDialogUnits(parent);
-
-        mText = new Text(parent, SWT.MULTI | SWT.READ_ONLY);
-        mText.setLayoutData(new GridData(GridData.FILL_BOTH
-                | GridData.GRAB_HORIZONTAL | GridData.GRAB_VERTICAL));
-
-        setControl(mText);
-        Dialog.applyDialogFont(parent);
-    }
-
-    @Override
-    public void setVisible(boolean visible) {
-        super.setVisible(visible);
-        if (visible) {
-            mStatus = mBuilder.getStatus();
-            mBuilder.setCanFinish(!mStatus.hasError());
-            mBuilder.setCanGenerate(false);
-
-            StringBuilder sb = new StringBuilder();
-            if (mStatus.hasError()) {
-                sb.append("There was an error!").append("\n\n");
-
-                String errorMsg = mStatus.getErrorMessage();
-                if (errorMsg != null) {
-                    sb.append(errorMsg);
-                }
-
-                Multimap<FileStatus, File> fileStatusMap = mStatus.getFileStatus();
-                Collection<File> files = fileStatusMap.values();
-                if (files != null) {
-                    sb.append("\n\n").append("Error on files:").append('\n');
-                    for (File file : files) {
-                        sb.append("\n").append(file.getAbsolutePath());
-                    }
-                }
-            } else {
-                sb.append("Export successful.\n\n");
-
-                int count = mBuilder.getModuleCount();
-                if (count > 1) {
-                    sb.append(String.format("Exported %s modules", count)).append('\n');
-                    sb.append(String.format(
-                            "Root folder: %s", mBuilder.getCommonRoot().toOSString()));
-                } else {
-                    sb.append("Exported project: ").append(mBuilder.getCommonRoot().toOSString());
-                }
-
-                sb.append("\n\n").append("Choose 'Import Non-Android Studio project' in Android Studio").append('\n');
-                sb.append("and select the following file:").append("\n\t");
-
-                File bGradle = new File(
-                        mBuilder.getCommonRoot().toFile(), BuildFileCreator.BUILD_FILE);
-                sb.append(bGradle.getAbsolutePath());
-
-                sb.append("\n\n").append("Do NOT import the Eclipse project itself!");
-            }
-
-            mText.setText(sb.toString());
-        }
-    }
-}
\ No newline at end of file
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/exportgradle/GradleExportWizard.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/exportgradle/GradleExportWizard.java
deleted file mode 100644
index 8c74187..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/exportgradle/GradleExportWizard.java
+++ /dev/null
@@ -1,111 +0,0 @@
-/*
- * Copyright (C) 2013 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.wizards.exportgradle;
-
-import com.android.ide.eclipse.adt.AdtPlugin;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.SubMonitor;
-import org.eclipse.jface.operation.IRunnableWithProgress;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.wizard.Wizard;
-import org.eclipse.jface.wizard.WizardPage;
-import org.eclipse.ui.IExportWizard;
-import org.eclipse.ui.IWorkbench;
-
-import java.lang.reflect.InvocationTargetException;
-import java.util.Collection;
-
-public class GradleExportWizard extends Wizard implements IExportWizard {
-
-    private ProjectSetupBuilder mBuilder = new ProjectSetupBuilder();
-
-    private ProjectSelectionPage mFirstPage;
-    private ConfirmationPage mSecondPage;
-    private FinalPage mFinalPage;
-
-    /**
-     * Creates buildfile.
-     */
-    @Override
-    public boolean performFinish() {
-        if (mBuilder.canGenerate()) {
-            generateBuildfiles(mSecondPage);
-            getContainer().showPage(mFinalPage);
-            return false;
-        }
-
-        return true;
-    }
-
-    @Override
-    public void addPages() {
-        addPage(new ImportInsteadPage());
-        mFirstPage = new ProjectSelectionPage(mBuilder);
-        addPage(mFirstPage);
-        mSecondPage = new ConfirmationPage(mBuilder);
-        addPage(mSecondPage);
-        mFinalPage = new FinalPage(mBuilder);
-        addPage(mFinalPage);
-    }
-
-    @Override
-    public void init(IWorkbench workbench, IStructuredSelection selection) {
-        setWindowTitle(ExportMessages.WindowTitle);
-        setNeedsProgressMonitor(true);
-    }
-
-    @Override
-    public boolean canFinish() {
-        return mBuilder.canFinish() || mBuilder.canGenerate();
-    }
-
-    /**
-     * Converts Eclipse Java projects to Gradle build files. Displays error dialogs.
-     */
-    public boolean generateBuildfiles(final WizardPage page) {
-        IRunnableWithProgress runnable = new IRunnableWithProgress() {
-            @Override
-            public void run(IProgressMonitor pm) throws InterruptedException {
-                Collection<GradleModule> modules = mBuilder.getModules();
-                final int count = modules.size();
-
-                SubMonitor localmonitor = SubMonitor.convert(pm, ExportMessages.StatusMessage,
-                        count);
-                BuildFileCreator.createBuildFiles(
-                        mBuilder,
-                        page.getShell(),
-                        localmonitor.newChild(count));
-            }
-        };
-
-        try {
-            getContainer().run(false, false, runnable);
-        } catch (InvocationTargetException e) {
-            AdtPlugin.log(e, null);
-            return false;
-        } catch (InterruptedException e) {
-            AdtPlugin.log(e, null);
-            return false;
-        }
-        if (page.getErrorMessage() != null) {
-            return false;
-        }
-        return true;
-    }
-
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/exportgradle/GradleModule.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/exportgradle/GradleModule.java
deleted file mode 100644
index 684f03b..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/exportgradle/GradleModule.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/*
- * Copyright (C) 2013 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.wizards.exportgradle;
-
-import com.android.annotations.NonNull;
-import com.google.common.collect.Lists;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.jdt.core.IJavaProject;
-
-import java.util.List;
-
-/**
- * A configured Gradle module for export. This includes gradle path, dependency, type, etc...
- */
-public class GradleModule {
-
-    @NonNull
-    private final IJavaProject mJavaProject;
-
-    private String mPath;
-    private Type mType;
-
-    private final List<GradleModule> mDependencies = Lists.newArrayList();
-
-    public static enum Type { ANDROID, JAVA };
-
-    GradleModule(@NonNull IJavaProject javaProject) {
-        mJavaProject = javaProject;
-    }
-
-    @NonNull
-    public IJavaProject getJavaProject() {
-        return mJavaProject;
-    }
-
-    @NonNull
-    public IProject getProject() {
-        return mJavaProject.getProject();
-    }
-
-    boolean isConfigured() {
-        return mType != null;
-    }
-
-    public void setType(Type type) {
-        mType = type;
-    }
-
-    public Type getType() {
-        return mType;
-    }
-
-    public void addDependency(GradleModule module) {
-        mDependencies.add(module);
-    }
-
-    public List<GradleModule> getDependencies() {
-        return mDependencies;
-    }
-
-    public void setPath(String path) {
-        mPath = path;
-    }
-
-    public String getPath() {
-        return mPath;
-    }
-
-    @Override
-    public String toString() {
-        return "GradleModule [mJavaProject=" + mJavaProject + ", mPath=" + mPath + ", mType="
-                + mType + ", mDependencies=" + mDependencies + "]";
-    }
-}
-
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/exportgradle/ImportInsteadPage.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/exportgradle/ImportInsteadPage.java
deleted file mode 100644
index cff9aca..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/exportgradle/ImportInsteadPage.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * Copyright (C) 2014 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.wizards.exportgradle;
-
-import org.eclipse.jface.wizard.WizardPage;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.CLabel;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-
-class ImportInsteadPage extends WizardPage {
-    public ImportInsteadPage() {
-        super("importInstead");
-        setTitle("Import Instead?");
-        setDescription("Consider importing directly into Android Studio instead of exporting from Eclipse");
-    }
-
-    @Override
-    public void createControl(Composite parent) {
-        Composite container = new Composite(parent, SWT.NULL);
-        setControl(container);
-        container.setLayout(new GridLayout(1, false));
-
-        CLabel label = new CLabel(container, SWT.NONE);
-        label.setLayoutData(new GridData(SWT.LEFT, SWT.TOP, true, false, 1, 1));
-        label.setText(
-                "Recent versions of Android Studio now support direct import of ADT projects.\n" +
-                "\n" +
-                "There are advantages to importing from Studio instead of exporting from Eclipse:\n" +
-                "- It can replace jars and library projects with Gradle dependencies instead\n" +
-                "- On import, it creates a new copy of the project and changes the project structure\n" +
-                "  to the new Gradle directory layout which better supports multiple resource directories.\n" +
-                "- It can merge instrumentation test projects into the same project\n" +
-                "- Android Studio is released more frequently than the ADT plugin, so the import\n" +
-                "  mechanism more closely tracks the requirements of Studio Gradle projects.\n" +
-                "\n" +
-                "If you want to preserve your Eclipse directory structure, or if for some reason import\n" +
-                "in Studio doesn't work (please let us know by filing a bug), continue to export from\n" +
-                "Eclipse instead.");
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/exportgradle/ProjectSelectionPage.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/exportgradle/ProjectSelectionPage.java
deleted file mode 100644
index 81c7a73..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/exportgradle/ProjectSelectionPage.java
+++ /dev/null
@@ -1,275 +0,0 @@
-/*
- * Copyright (C) 2013 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.wizards.exportgradle;
-
-import com.google.common.base.Joiner;
-import com.google.common.collect.Lists;
-import com.ibm.icu.text.MessageFormat;
-
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IWorkspaceRoot;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.jdt.core.IJavaModel;
-import org.eclipse.jdt.core.IJavaModelMarker;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.JavaCore;
-import org.eclipse.jdt.core.JavaModelException;
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.jface.viewers.CheckStateChangedEvent;
-import org.eclipse.jface.viewers.CheckboxTableViewer;
-import org.eclipse.jface.viewers.ICheckStateListener;
-import org.eclipse.jface.viewers.TableLayout;
-import org.eclipse.jface.wizard.WizardPage;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.ui.model.WorkbenchContentProvider;
-import org.eclipse.ui.model.WorkbenchLabelProvider;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * Displays a wizard page that lets the user choose the projects for which to create Gradle build
- * files.
- * <p>
- * Based on {@link org.eclipse.ant.internal.ui.datatransfer.AntBuildfileExportPage}
- */
-public class ProjectSelectionPage extends WizardPage {
-
-    private final ProjectSetupBuilder mBuilder;
-    private CheckboxTableViewer mTableViewer;
-    private List<IJavaProject> mSelectedJavaProjects = Lists.newArrayList();
-
-    public ProjectSelectionPage(ProjectSetupBuilder builder) {
-        super("GradleExportPage"); //$NON-NLS-1$
-        mBuilder = builder;
-        setPageComplete(false);
-        setTitle(ExportMessages.PageTitle);
-        setDescription(ExportMessages.PageDescription);
-    }
-
-    @Override
-    public void createControl(Composite parent) {
-        initializeDialogUnits(parent);
-
-        Composite workArea = new Composite(parent, SWT.NONE);
-        setControl(workArea);
-
-        workArea.setLayout(new GridLayout());
-        workArea.setLayoutData(new GridData(GridData.FILL_BOTH
-                | GridData.GRAB_HORIZONTAL | GridData.GRAB_VERTICAL));
-
-        Label title = new Label(workArea, SWT.NONE);
-        title.setText(ExportMessages.SelectProjects);
-
-        Composite listComposite = new Composite(workArea, SWT.NONE);
-        GridLayout layout = new GridLayout();
-        layout.numColumns = 2;
-        layout.marginWidth = 0;
-        layout.makeColumnsEqualWidth = false;
-        listComposite.setLayout(layout);
-
-        listComposite.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL
-                | GridData.GRAB_VERTICAL | GridData.FILL_BOTH));
-
-        Table table = new Table(listComposite,
-                SWT.CHECK | SWT.BORDER | SWT.V_SCROLL | SWT.H_SCROLL);
-        mTableViewer = new CheckboxTableViewer(table);
-        table.setLayout(new TableLayout());
-        GridData data = new GridData(SWT.FILL, SWT.FILL, true, true);
-        data.heightHint = 300;
-        table.setLayoutData(data);
-        mTableViewer.setContentProvider(new WorkbenchContentProvider() {
-            @Override
-            public Object[] getElements(Object element) {
-                if (element instanceof IJavaProject[]) {
-                    return (IJavaProject[]) element;
-                }
-                return null;
-            }
-        });
-        mTableViewer.setLabelProvider(new WorkbenchLabelProvider());
-        mTableViewer.addCheckStateListener(new ICheckStateListener() {
-            @Override
-            public void checkStateChanged(CheckStateChangedEvent event) {
-                if (event.getChecked()) {
-                    mSelectedJavaProjects.add((IJavaProject) event.getElement());
-                } else {
-                    mSelectedJavaProjects.remove(event.getElement());
-                }
-                updateEnablement();
-            }
-        });
-
-        initializeProjects();
-        createSelectionButtons(listComposite);
-        setControl(workArea);
-        updateEnablement();
-        Dialog.applyDialogFont(parent);
-    }
-
-    /**
-     * Creates select all/deselect all buttons.
-     */
-    private void createSelectionButtons(Composite composite) {
-        Composite buttonsComposite = new Composite(composite, SWT.NONE);
-        GridLayout layout = new GridLayout();
-        layout.marginWidth = 0;
-        layout.marginHeight = 0;
-        buttonsComposite.setLayout(layout);
-
-        buttonsComposite.setLayoutData(new GridData(
-                GridData.VERTICAL_ALIGN_BEGINNING));
-
-        Button selectAll = new Button(buttonsComposite, SWT.PUSH);
-        selectAll.setText(ExportMessages.SelectAll);
-        selectAll.addSelectionListener(new SelectionAdapter() {
-            @Override
-            public void widgetSelected(SelectionEvent e) {
-                for (int i = 0; i < mTableViewer.getTable().getItemCount(); i++) {
-                    mSelectedJavaProjects.add((IJavaProject) mTableViewer.getElementAt(i));
-                }
-                mTableViewer.setAllChecked(true);
-                updateEnablement();
-            }
-        });
-        setButtonLayoutData(selectAll);
-
-        Button deselectAll = new Button(buttonsComposite, SWT.PUSH);
-        deselectAll.setText(ExportMessages.DeselectAll);
-        deselectAll.addSelectionListener(new SelectionAdapter() {
-            @Override
-            public void widgetSelected(SelectionEvent e) {
-                mSelectedJavaProjects.clear();
-                mTableViewer.setAllChecked(false);
-                updateEnablement();
-            }
-        });
-        setButtonLayoutData(deselectAll);
-    }
-
-    /**
-     * Populates the list with all the eligible projects in the workspace.
-     */
-    private void initializeProjects() {
-        IWorkspaceRoot rootWorkspace = ResourcesPlugin.getWorkspace().getRoot();
-        IJavaModel javaModel = JavaCore.create(rootWorkspace);
-        IJavaProject[] javaProjects;
-        try {
-            javaProjects = javaModel.getJavaProjects();
-        } catch (JavaModelException e) {
-            javaProjects = new IJavaProject[0];
-        }
-        mTableViewer.setInput(javaProjects);
-        // Check any necessary projects
-        if (mSelectedJavaProjects != null) {
-            mTableViewer.setCheckedElements(mSelectedJavaProjects.toArray(
-                    new IJavaProject[mSelectedJavaProjects.size()]));
-        }
-    }
-
-    /**
-     * Enables/disables the finish button on the wizard and displays error messages as needed.
-     */
-    private void updateEnablement() {
-        String error = null;
-        try {
-            if (mSelectedJavaProjects.size() == 0) {
-                error = ExportMessages.NoProjectsError;
-                return;
-            }
-
-            List<String> cyclicProjects;
-            try {
-                cyclicProjects = getCyclicProjects(mSelectedJavaProjects);
-                if (cyclicProjects.size() > 0) {
-                    error = MessageFormat.format(ExportMessages.CyclicProjectsError,
-                            new Object[] { Joiner.on(", ").join(cyclicProjects) }); //$NON-NLS-1$
-                    return;
-                }
-
-                error = mBuilder.setProject(mSelectedJavaProjects);
-                if (error != null) {
-                    return;
-                }
-
-            } catch (CoreException ignored) {
-                // TODO: do something?
-            }
-        } finally {
-            setErrorMessage(error);
-            setPageComplete(error == null);
-            getContainer().updateButtons();
-        }
-    }
-
-    @Override
-    public void setVisible(boolean visible) {
-        super.setVisible(visible);
-        if (visible) {
-            mTableViewer.getTable().setFocus();
-            mBuilder.setCanFinish(false);
-            mBuilder.setCanGenerate(false);
-        }
-    }
-
-    /**
-     * Returns given projects that have cyclic dependencies.
-     *
-     * @param javaProjects list of IJavaProject objects
-     * @return set of project names
-     */
-    private List<String> getCyclicProjects(List<IJavaProject> projects) throws CoreException {
-
-        List<String> cyclicProjects = new ArrayList<String>();
-        for (IJavaProject javaProject : projects) {
-            if (hasCyclicDependency(javaProject)) {
-                cyclicProjects.add(javaProject.getProject().getName());
-            }
-        }
-        return cyclicProjects;
-    }
-
-    /**
-     * Check if given project has a cyclic dependency.
-     * <p>
-     * See {@link org.eclipse.jdt.core.tests.model.ClasspathTests.numberOfCycleMarkers}
-     */
-    private static boolean hasCyclicDependency(IJavaProject javaProject)
-            throws CoreException {
-        IMarker[] markers = javaProject.getProject().findMarkers(
-                IJavaModelMarker.BUILDPATH_PROBLEM_MARKER, false,
-                IResource.DEPTH_ONE);
-        for (IMarker marker : markers) {
-            String cycleAttr = (String) marker
-                    .getAttribute(IJavaModelMarker.CYCLE_DETECTED);
-            if (cycleAttr != null && cycleAttr.equals("true")) { //$NON-NLS-1$
-                return true;
-            }
-        }
-        return false;
-    }
-}
\ No newline at end of file
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/exportgradle/ProjectSetupBuilder.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/exportgradle/ProjectSetupBuilder.java
deleted file mode 100644
index 1fd6b74..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/exportgradle/ProjectSetupBuilder.java
+++ /dev/null
@@ -1,425 +0,0 @@
-/*
- * Copyright (C) 2013 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.wizards.exportgradle;
-
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-import com.android.ide.eclipse.adt.AdtConstants;
-import com.android.ide.eclipse.adt.internal.project.BaseProjectHelper;
-import com.android.ide.eclipse.adt.internal.sdk.ProjectState;
-import com.android.ide.eclipse.adt.internal.sdk.ProjectState.LibraryState;
-import com.android.ide.eclipse.adt.internal.sdk.Sdk;
-import com.google.common.collect.Lists;
-import com.google.common.collect.Maps;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.jdt.core.IClasspathEntry;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.IPackageFragmentRoot;
-import org.eclipse.jdt.core.JavaCore;
-import org.eclipse.jdt.core.JavaModelException;
-
-import java.io.File;
-import java.util.Collection;
-import java.util.List;
-import java.util.Map;
-import java.util.regex.Pattern;
-
-/**
- * Class to setup the project and its modules.
- */
-public class ProjectSetupBuilder {
-
-    private final static class InternalException extends Exception {
-        private static final long serialVersionUID = 1L;
-
-        InternalException(String message) {
-            super(message);
-        }
-    }
-
-    private boolean mCanFinish = false;
-    private boolean mCanGenerate = false;
-    private final List<GradleModule> mOriginalModules = Lists.newArrayList();
-    private final Map<IJavaProject, GradleModule> mModules = Maps.newHashMap();
-    private IPath mCommonRoot;
-    private ExportStatus mStatus;
-
-    public ProjectSetupBuilder() {
-
-    }
-
-    public void setCanGenerate(boolean generate) {
-        mCanGenerate = generate;
-    }
-
-    public void setCanFinish(boolean canFinish) {
-        mCanFinish = canFinish;
-    }
-
-    public boolean canFinish() {
-        return mCanFinish;
-    }
-
-    public boolean canGenerate() {
-        return mCanGenerate;
-    }
-
-    public void setStatus(ExportStatus status) {
-        mStatus = status;
-    }
-
-    public ExportStatus getStatus() {
-        return mStatus;
-    }
-
-    @NonNull
-    public String setProject(@NonNull List<IJavaProject> selectedProjects)
-            throws CoreException {
-        mModules.clear();
-
-        // build a list of all projects that must be included. This is in case
-        // some dependencies have not been included in the selected projects. We also include
-        // parent projects so that the full multi-project setup is correct.
-        // Note that if two projects are selected that are not related, both will be added
-        // in the same multi-project anyway.
-        try {
-            for (IJavaProject javaProject : selectedProjects) {
-                GradleModule module;
-
-                if (javaProject.getProject().hasNature(AdtConstants.NATURE_DEFAULT)) {
-                    module = processAndroidProject(javaProject);
-                } else {
-                    module = processJavaProject(javaProject);
-                }
-
-                mOriginalModules.add(module);
-            }
-
-            Collection<GradleModule> modules = mModules.values();
-            computeRootAndPaths(modules);
-
-            return null;
-        } catch (InternalException e) {
-            return e.getMessage();
-        }
-    }
-
-    @NonNull
-    public Collection<GradleModule> getModules() {
-        return mModules.values();
-    }
-
-    public int getModuleCount() {
-        return mModules.size();
-    }
-
-    @Nullable
-    public IPath getCommonRoot() {
-        return mCommonRoot;
-    }
-
-    @Nullable
-    public GradleModule getModule(IJavaProject javaProject) {
-        return mModules.get(javaProject);
-    }
-
-    public boolean isOriginalProject(@NonNull IJavaProject javaProject) {
-        GradleModule module = mModules.get(javaProject);
-        return mOriginalModules.contains(module);
-    }
-
-    @NonNull
-    public List<GradleModule> getOriginalModules() {
-        return mOriginalModules;
-    }
-
-    @Nullable
-    public List<GradleModule> getShortestDependencyTo(GradleModule module) {
-        return findModule(module, mOriginalModules);
-    }
-
-    @Nullable
-    public List<GradleModule> findModule(GradleModule toFind, GradleModule rootModule) {
-        if (toFind == rootModule) {
-            List<GradleModule> list = Lists.newArrayList();
-            list.add(toFind);
-            return list;
-        }
-
-        List<GradleModule> shortestChain = findModule(toFind, rootModule.getDependencies());
-
-        if (shortestChain != null) {
-            shortestChain.add(0, rootModule);
-        }
-
-        return shortestChain;
-    }
-
-    @Nullable
-    public List<GradleModule> findModule(GradleModule toFind, List<GradleModule> modules) {
-        List<GradleModule> currentChain = null;
-
-        for (GradleModule child : modules) {
-            List<GradleModule> newChain = findModule(toFind, child);
-            if (currentChain == null) {
-                currentChain = newChain;
-            } else if (newChain != null) {
-                if (currentChain.size() > newChain.size()) {
-                    currentChain = newChain;
-                }
-            }
-        }
-
-        return currentChain;
-    }
-
-    @NonNull
-    private GradleModule processAndroidProject(@NonNull IJavaProject javaProject)
-            throws InternalException, CoreException {
-
-        // get/create the module
-        GradleModule module = createModuleOnDemand(javaProject);
-        if (module.isConfigured()) {
-            return module;
-        }
-
-        module.setType(GradleModule.Type.ANDROID);
-
-        ProjectState projectState = Sdk.getProjectState(javaProject.getProject());
-        assert projectState != null;
-
-        // add library project dependencies
-        List<LibraryState> libraryProjects = projectState.getLibraries();
-        for (LibraryState libraryState : libraryProjects) {
-            ProjectState libProjectState = libraryState.getProjectState();
-            if (libProjectState != null) {
-                IJavaProject javaLib = getJavaProject(libProjectState);
-                if (javaLib != null) {
-                    GradleModule libModule = processAndroidProject(javaLib);
-                    module.addDependency(libModule);
-                } else {
-                    throw new InternalException(String.format(
-                            "Project %1$s is missing. Needed by %2$s.\n" +
-                            "Make sure all dependencies are opened.",
-                            libraryState.getRelativePath(),
-                            javaProject.getProject().getName()));
-                }
-            } else {
-                throw new InternalException(String.format(
-                        "Project %1$s is missing. Needed by %2$s.\n" +
-                        "Make sure all dependencies are opened.",
-                        libraryState.getRelativePath(),
-                        javaProject.getProject().getName()));
-            }
-        }
-
-        // add java project dependencies
-        List<IJavaProject> javaDepProjects = getReferencedProjects(javaProject);
-        for (IJavaProject javaDep : javaDepProjects) {
-            GradleModule libModule = processJavaProject(javaDep);
-            module.addDependency(libModule);
-        }
-
-        return module;
-    }
-
-    @NonNull
-    private GradleModule processJavaProject(@NonNull IJavaProject javaProject)
-            throws InternalException, CoreException {
-        // get/create the module
-        GradleModule module = createModuleOnDemand(javaProject);
-
-        if (module.isConfigured()) {
-            return module;
-        }
-
-        module.setType(GradleModule.Type.JAVA);
-
-        // add java project dependencies
-        List<IJavaProject> javaDepProjects = getReferencedProjects(javaProject);
-        for (IJavaProject javaDep : javaDepProjects) {
-            // Java project should not reference Android project!
-            if (javaDep.getProject().hasNature(AdtConstants.NATURE_DEFAULT)) {
-                throw new InternalException(String.format(
-                        "Java project %1$s depends on Android project %2$s!\n" +
-                        "This is not a valid dependency",
-                        javaProject.getProject().getName(), javaDep.getProject().getName()));
-            }
-            GradleModule libModule = processJavaProject(javaDep);
-            module.addDependency(libModule);
-        }
-
-        return module;
-    }
-
-    private void computeRootAndPaths(Collection<GradleModule> modules) throws InternalException {
-        // compute the common root.
-        mCommonRoot = determineCommonRoot(modules);
-
-        // compute all the relative paths.
-        for (GradleModule module : modules) {
-            String path = getGradlePath(module.getJavaProject().getProject().getLocation(),
-                    mCommonRoot);
-
-            module.setPath(path);
-        }
-    }
-
-    /**
-     * Finds the common parent directory shared by this project and all its dependencies.
-     * If there's only one project, returns the single project's folder.
-     * @throws InternalException
-     */
-    @NonNull
-    private static IPath determineCommonRoot(Collection<GradleModule> modules)
-            throws InternalException {
-        IPath commonRoot = null;
-        for (GradleModule module : modules) {
-            if (commonRoot == null) {
-                commonRoot = module.getJavaProject().getProject().getLocation();
-            } else {
-                commonRoot = findCommonRoot(commonRoot,
-                        module.getJavaProject().getProject().getLocation());
-            }
-        }
-
-        return commonRoot;
-    }
-
-    /**
-     * Converts the given path to be relative to the given root path, and converts it to
-     * Gradle project notation, such as is used in the settings.gradle file.
-     */
-    @NonNull
-    private static String getGradlePath(IPath path, IPath root) {
-        IPath relativePath = path.makeRelativeTo(root);
-        String relativeString = relativePath.toOSString();
-        return ":" + relativeString.replaceAll(Pattern.quote(File.separator), ":"); //$NON-NLS-1$
-    }
-
-    /**
-     * Given two IPaths, finds the parent directory of both of them.
-     * @throws InternalException
-     */
-    @NonNull
-    private static IPath findCommonRoot(@NonNull IPath path1, @NonNull IPath path2)
-            throws InternalException {
-        if (path1.getDevice() != null && !path1.getDevice().equals(path2.getDevice())) {
-            throw new InternalException(
-                    "Different modules have been detected on different drives.\n" +
-                    "This prevents finding a common root to all modules.");
-        }
-
-        IPath result = path1.uptoSegment(0);
-
-        final int count = Math.min(path1.segmentCount(), path2.segmentCount());
-        for (int i = 0; i < count; i++) {
-            if (path1.segment(i).equals(path2.segment(i))) {
-                result = result.append(Path.SEPARATOR + path2.segment(i));
-            }
-        }
-        return result;
-    }
-
-    @Nullable
-    private IJavaProject getJavaProject(ProjectState projectState) {
-        try {
-            return BaseProjectHelper.getJavaProject(projectState.getProject());
-        } catch (CoreException e) {
-            return null;
-        }
-    }
-
-    @NonNull
-    private GradleModule createModuleOnDemand(@NonNull IJavaProject javaProject) {
-        GradleModule module = mModules.get(javaProject);
-        if (module == null) {
-            module = new GradleModule(javaProject);
-            mModules.put(javaProject, module);
-        }
-
-        return module;
-    }
-
-    @NonNull
-    private static List<IJavaProject> getReferencedProjects(IJavaProject javaProject)
-            throws JavaModelException, InternalException {
-
-        List<IJavaProject> projects = Lists.newArrayList();
-
-        IClasspathEntry entries[] = javaProject.getRawClasspath();
-        for (IClasspathEntry classpathEntry : entries) {
-            if (classpathEntry.getContentKind() == IPackageFragmentRoot.K_SOURCE
-                    && classpathEntry.getEntryKind() == IClasspathEntry.CPE_PROJECT) {
-                // found required project on build path
-                String subProjectRoot = classpathEntry.getPath().toString();
-                IJavaProject subProject = getJavaProject(subProjectRoot);
-                // is project available in workspace?
-                if (subProject != null) {
-                    projects.add(subProject);
-                } else {
-                    throw new InternalException(String.format(
-                            "Project '%s' is missing project dependency '%s' in Eclipse workspace.\n" +
-                            "Make sure all dependencies are opened.",
-                            javaProject.getProject().getName(),
-                            classpathEntry.getPath().toString()));
-                }
-            }
-        }
-
-        return projects;
-    }
-
-    /**
-     * Get Java project for given root.
-     */
-    @Nullable
-    private static IJavaProject getJavaProject(String root) {
-        IPath path = new Path(root);
-        if (path.segmentCount() == 1) {
-            return getJavaProjectByName(root);
-        }
-        IResource resource = ResourcesPlugin.getWorkspace().getRoot()
-                .findMember(path);
-        if (resource != null && resource.getType() == IResource.PROJECT) {
-            if (resource.exists()) {
-                return (IJavaProject) JavaCore.create(resource);
-            }
-        }
-        return null;
-    }
-
-    /**
-     * Get Java project from resource.
-     */
-    private static IJavaProject getJavaProjectByName(String name) {
-        try {
-            IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(name);
-            if (project.exists()) {
-                return JavaCore.create(project);
-            }
-        } catch (IllegalArgumentException iae) {
-        }
-        return null;
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/newproject/ApplicationInfoPage.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/newproject/ApplicationInfoPage.java
deleted file mode 100644
index c832534..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/newproject/ApplicationInfoPage.java
+++ /dev/null
@@ -1,809 +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.eclipse.adt.internal.wizards.newproject;
-
-import com.android.SdkConstants;
-import com.android.ide.eclipse.adt.AdtConstants;
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.ide.eclipse.adt.internal.sdk.Sdk;
-import com.android.ide.eclipse.adt.internal.sdk.Sdk.ITargetChangeListener;
-import com.android.ide.eclipse.adt.internal.wizards.newproject.NewProjectWizardState.Mode;
-import com.android.sdklib.IAndroidTarget;
-
-import org.eclipse.core.filesystem.URIUtil;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IWorkspace;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.jdt.core.JavaConventions;
-import org.eclipse.jface.dialogs.IMessageProvider;
-import org.eclipse.jface.wizard.WizardPage;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Combo;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Text;
-
-import java.io.File;
-import java.io.FileFilter;
-import java.net.URI;
-
-/** Page where you choose the application name, activity name, and optional test project info */
-public class ApplicationInfoPage extends WizardPage implements SelectionListener, ModifyListener,
-        ITargetChangeListener {
-    private static final String JDK_15 = "1.5"; //$NON-NLS-1$
-    private final static String DUMMY_PACKAGE = "your.package.namespace";
-
-    /** Suffix added by default to activity names */
-    static final String ACTIVITY_NAME_SUFFIX = "Activity"; //$NON-NLS-1$
-
-    private final NewProjectWizardState mValues;
-
-    private Text mApplicationText;
-    private Text mPackageText;
-    private Text mActivityText;
-    private Button mCreateActivityCheckbox;
-    private Combo mSdkCombo;
-
-    private boolean mIgnore;
-    private Button mCreateTestCheckbox;
-    private Text mTestProjectNameText;
-    private Text mTestApplicationText;
-    private Text mTestPackageText;
-    private Label mTestProjectNameLabel;
-    private Label mTestApplicationLabel;
-    private Label mTestPackageLabel;
-
-    /**
-     * Create the wizard.
-     */
-    ApplicationInfoPage(NewProjectWizardState values) {
-        super("appInfo"); //$NON-NLS-1$
-        mValues = values;
-
-        setTitle("Application Info");
-        setDescription("Configure the new Android Project");
-        AdtPlugin.getDefault().addTargetListener(this);
-    }
-
-    /**
-     * Create contents of the wizard.
-     */
-    @Override
-    @SuppressWarnings("unused") // Eclipse marks SWT constructors with side effects as unused
-    public void createControl(Composite parent) {
-        Composite container = new Composite(parent, SWT.NULL);
-        container.setLayout(new GridLayout(2, false));
-
-        Label applicationLabel = new Label(container, SWT.NONE);
-        applicationLabel.setText("Application Name:");
-
-        mApplicationText = new Text(container, SWT.BORDER);
-        mApplicationText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
-        mApplicationText.addModifyListener(this);
-
-        Label packageLabel = new Label(container, SWT.NONE);
-        packageLabel.setText("Package Name:");
-
-        mPackageText = new Text(container, SWT.BORDER);
-        mPackageText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
-        mPackageText.addModifyListener(this);
-
-        if (mValues.mode != Mode.TEST) {
-            mCreateActivityCheckbox = new Button(container, SWT.CHECK);
-            mCreateActivityCheckbox.setText("Create Activity:");
-            mCreateActivityCheckbox.addSelectionListener(this);
-
-            mActivityText = new Text(container, SWT.BORDER);
-            mActivityText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
-            mActivityText.addModifyListener(this);
-        }
-
-        Label minSdkLabel = new Label(container, SWT.NONE);
-        minSdkLabel.setText("Minimum SDK:");
-
-        mSdkCombo = new Combo(container, SWT.NONE);
-        GridData gdSdkCombo = new GridData(SWT.LEFT, SWT.CENTER, true, false, 1, 1);
-        gdSdkCombo.widthHint = 200;
-        mSdkCombo.setLayoutData(gdSdkCombo);
-        mSdkCombo.addSelectionListener(this);
-        mSdkCombo.addModifyListener(this);
-
-        onSdkLoaded();
-
-        setControl(container);
-        new Label(container, SWT.NONE);
-        new Label(container, SWT.NONE);
-
-        mCreateTestCheckbox = new Button(container, SWT.CHECK);
-        mCreateTestCheckbox.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false, 2, 1));
-        mCreateTestCheckbox.setText("Create a Test Project");
-        mCreateTestCheckbox.addSelectionListener(this);
-
-        mTestProjectNameLabel = new Label(container, SWT.NONE);
-        mTestProjectNameLabel.setText("Test Project Name:");
-
-        mTestProjectNameText = new Text(container, SWT.BORDER);
-        mTestProjectNameText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
-        mTestProjectNameText.addModifyListener(this);
-
-        mTestApplicationLabel = new Label(container, SWT.NONE);
-        mTestApplicationLabel.setText("Test Application:");
-
-        mTestApplicationText = new Text(container, SWT.BORDER);
-        mTestApplicationText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
-        mTestApplicationText.addModifyListener(this);
-
-        mTestPackageLabel = new Label(container, SWT.NONE);
-        mTestPackageLabel.setText("Test Package:");
-
-        mTestPackageText = new Text(container, SWT.BORDER);
-        mTestPackageText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
-        mTestPackageText.addModifyListener(this);
-    }
-
-    /** Controls whether the options for creating a paired test project should be shown */
-    private void showTestOptions(boolean visible) {
-        if (mValues.mode == Mode.SAMPLE) {
-            visible = false;
-        }
-
-        mCreateTestCheckbox.setVisible(visible);
-        mTestProjectNameLabel.setVisible(visible);
-        mTestProjectNameText.setVisible(visible);
-        mTestApplicationLabel.setVisible(visible);
-        mTestApplicationText.setVisible(visible);
-        mTestPackageLabel.setVisible(visible);
-        mTestPackageText.setVisible(visible);
-    }
-
-    /** Controls whether the options for creating a paired test project should be enabled */
-    private void enableTestOptions(boolean enabled) {
-        mTestProjectNameLabel.setEnabled(enabled);
-        mTestProjectNameText.setEnabled(enabled);
-        mTestApplicationLabel.setEnabled(enabled);
-        mTestApplicationText.setEnabled(enabled);
-        mTestPackageLabel.setEnabled(enabled);
-        mTestPackageText.setEnabled(enabled);
-    }
-
-    @Override
-    public void setVisible(boolean visible) {
-        super.setVisible(visible);
-
-        if (visible) {
-            try {
-                mIgnore = true;
-                if (mValues.applicationName != null) {
-                    mApplicationText.setText(mValues.applicationName);
-                }
-                if (mValues.packageName != null) {
-                    mPackageText.setText(mValues.packageName);
-                } else {
-                    mPackageText.setText(DUMMY_PACKAGE);
-                }
-
-                if (mValues.mode != Mode.TEST) {
-                    mCreateActivityCheckbox.setSelection(mValues.createActivity);
-                    mActivityText.setEnabled(mValues.createActivity);
-                    if (mValues.activityName != null) {
-                        mActivityText.setText(mValues.activityName);
-                    }
-                }
-                if (mValues.minSdk != null && mValues.minSdk.length() > 0) {
-                    mSdkCombo.setText(mValues.minSdk);
-                }
-
-                showTestOptions(mValues.mode == Mode.ANY);
-                enableTestOptions(mCreateTestCheckbox.getSelection());
-
-                if (mValues.testProjectName != null) {
-                    mTestProjectNameText.setText(mValues.testProjectName);
-                }
-                if (mValues.testApplicationName != null) {
-                    mTestApplicationText.setText(mValues.testApplicationName);
-                }
-                if (mValues.testProjectName != null) {
-                    mTestPackageText.setText(mValues.testProjectName);
-                }
-            } finally {
-                mIgnore = false;
-            }
-        }
-
-        // Start focus with the package name, since the other fields are typically assigned
-        // reasonable defaults
-        mPackageText.setFocus();
-        mPackageText.selectAll();
-
-        validatePage();
-    }
-
-    protected void setSdkTargets(IAndroidTarget[] targets, IAndroidTarget target) {
-        if (targets == null) {
-            targets = new IAndroidTarget[0];
-        }
-        int selectionIndex = -1;
-        String[] items = new String[targets.length];
-        for (int i = 0, n = targets.length; i < n; i++) {
-            items[i] = targetLabel(targets[i]);
-            if (targets[i] == target) {
-                selectionIndex = i;
-            }
-        }
-        try {
-            mIgnore = true;
-            mSdkCombo.setItems(items);
-            mSdkCombo.setData(targets);
-            if (selectionIndex != -1) {
-                mSdkCombo.select(selectionIndex);
-            }
-        } finally {
-            mIgnore = false;
-        }
-    }
-
-    private String targetLabel(IAndroidTarget target) {
-        // In the minimum SDK chooser, show the targets with api number and description,
-        // such as "11 (Android 3.0)"
-        return String.format("%1$s (%2$s)", target.getVersion().getApiString(),
-                target.getFullName());
-    }
-
-    @Override
-    public void dispose() {
-        AdtPlugin.getDefault().removeTargetListener(this);
-        super.dispose();
-    }
-
-    @Override
-    public boolean isPageComplete() {
-        // This page is only needed when creating new projects
-        if (mValues.useExisting || mValues.mode != Mode.ANY) {
-            return true;
-        }
-
-        // Ensure that we reach this page
-        if (mValues.packageName == null) {
-            return false;
-        }
-
-        return super.isPageComplete();
-    }
-
-    @Override
-    public void modifyText(ModifyEvent e) {
-        if (mIgnore) {
-            return;
-        }
-
-        Object source = e.getSource();
-        if (source == mSdkCombo) {
-            mValues.minSdk = mSdkCombo.getText().trim();
-            IAndroidTarget[] targets = (IAndroidTarget[]) mSdkCombo.getData();
-            // An editable combo will treat item selection the same way as a user edit,
-            // so we need to see if the string looks like a labeled version
-            int index = mSdkCombo.getSelectionIndex();
-            if (index != -1) {
-                if (index >= 0 && index < targets.length) {
-                    IAndroidTarget target = targets[index];
-                    if (targetLabel(target).equals(mValues.minSdk)) {
-                        mValues.minSdk = target.getVersion().getApiString();
-                    }
-                }
-            }
-
-            // Ensure that we never pick up the (Android x.y) suffix shown in combobox
-            // for readability
-            int separator = mValues.minSdk.indexOf(' ');
-            if (separator != -1) {
-                mValues.minSdk = mValues.minSdk.substring(0, separator);
-            }
-            mValues.minSdkModifiedByUser = true;
-            mValues.updateSdkTargetToMatchMinSdkVersion();
-        } else if (source == mApplicationText) {
-            mValues.applicationName = mApplicationText.getText().trim();
-            mValues.applicationNameModifiedByUser = true;
-
-            if (!mValues.testApplicationNameModified) {
-                mValues.testApplicationName = suggestTestApplicationName(mValues.applicationName);
-                try {
-                    mIgnore = true;
-                    mTestApplicationText.setText(mValues.testApplicationName);
-                } finally {
-                    mIgnore = false;
-                }
-            }
-
-        } else if (source == mPackageText) {
-            mValues.packageName = mPackageText.getText().trim();
-            mValues.packageNameModifiedByUser = true;
-
-            if (!mValues.testPackageModified) {
-                mValues.testPackageName = suggestTestPackage(mValues.packageName);
-                try {
-                    mIgnore = true;
-                    mTestPackageText.setText(mValues.testPackageName);
-                } finally {
-                    mIgnore = false;
-                }
-            }
-        } else if (source == mActivityText) {
-            mValues.activityName = mActivityText.getText().trim();
-            mValues.activityNameModifiedByUser = true;
-        } else if (source == mTestApplicationText) {
-            mValues.testApplicationName = mTestApplicationText.getText().trim();
-            mValues.testApplicationNameModified = true;
-        } else if (source == mTestPackageText) {
-            mValues.testPackageName = mTestPackageText.getText().trim();
-            mValues.testPackageModified = true;
-        } else if (source == mTestProjectNameText) {
-            mValues.testProjectName = mTestProjectNameText.getText().trim();
-            mValues.testProjectModified = true;
-        }
-
-        validatePage();
-    }
-
-    @Override
-    public void widgetSelected(SelectionEvent e) {
-        if (mIgnore) {
-            return;
-        }
-
-        Object source = e.getSource();
-
-        if (source == mCreateActivityCheckbox) {
-            mValues.createActivity = mCreateActivityCheckbox.getSelection();
-            mActivityText.setEnabled(mValues.createActivity);
-        } else if (source == mSdkCombo) {
-            int index = mSdkCombo.getSelectionIndex();
-            IAndroidTarget[] targets = (IAndroidTarget[]) mSdkCombo.getData();
-            if (index != -1) {
-                if (index >= 0 && index < targets.length) {
-                    IAndroidTarget target = targets[index];
-                    // Even though we are showing the logical version name, we place the
-                    // actual api number as the minimum SDK
-                    mValues.minSdk = target.getVersion().getApiString();
-                }
-            } else {
-                String text = mSdkCombo.getText();
-                boolean found = false;
-                for (IAndroidTarget target : targets) {
-                    if (targetLabel(target).equals(text)) {
-                        mValues.minSdk = target.getVersion().getApiString();
-                        found = true;
-                        break;
-                    }
-                }
-                if (!found) {
-                    mValues.minSdk = text;
-                }
-            }
-        } else if (source == mCreateTestCheckbox) {
-            mValues.createPairProject = mCreateTestCheckbox.getSelection();
-            enableTestOptions(mValues.createPairProject);
-            if (mValues.createPairProject) {
-                if (mValues.testProjectName == null || mValues.testProjectName.length() == 0) {
-                    mValues.testProjectName = suggestTestProjectName(mValues.projectName);
-                }
-                if (mValues.testApplicationName == null ||
-                        mValues.testApplicationName.length() == 0) {
-                    mValues.testApplicationName =
-                            suggestTestApplicationName(mValues.applicationName);
-                }
-                if (mValues.testPackageName == null || mValues.testPackageName.length() == 0) {
-                    mValues.testPackageName = suggestTestPackage(mValues.packageName);
-                }
-
-                try {
-                    mIgnore = true;
-                    mTestProjectNameText.setText(mValues.testProjectName);
-                    mTestApplicationText.setText(mValues.testApplicationName);
-                    mTestPackageText.setText(mValues.testPackageName);
-                } finally {
-                    mIgnore = false;
-                }
-            }
-        }
-
-        validatePage();
-    }
-
-    @Override
-    public void widgetDefaultSelected(SelectionEvent e) {
-    }
-
-    private void validatePage() {
-        IStatus status = validatePackage(mValues.packageName);
-        if (status == null || status.getSeverity() != IStatus.ERROR) {
-            IStatus validActivity = validateActivity();
-            if (validActivity != null) {
-                status = validActivity;
-            }
-        }
-        if (status == null || status.getSeverity() != IStatus.ERROR) {
-            IStatus validMinSdk = validateMinSdk();
-            if (validMinSdk != null) {
-                status = validMinSdk;
-            }
-        }
-
-        if (status == null || status.getSeverity() != IStatus.ERROR) {
-            IStatus validSourceFolder = validateSourceFolder();
-            if (validSourceFolder != null) {
-                status = validSourceFolder;
-            }
-        }
-
-        // If creating a test project to go along with the main project, also validate
-        // the additional test project parameters
-        if (status == null || status.getSeverity() != IStatus.ERROR) {
-            if (mValues.createPairProject) {
-                IStatus validTestProject = ProjectNamePage.validateProjectName(
-                        mValues.testProjectName);
-                if (validTestProject != null) {
-                    status = validTestProject;
-                }
-
-                if (status == null || status.getSeverity() != IStatus.ERROR) {
-                    IStatus validTestLocation = validateTestProjectLocation();
-                    if (validTestLocation != null) {
-                        status = validTestLocation;
-                    }
-                }
-
-                if (status == null || status.getSeverity() != IStatus.ERROR) {
-                    IStatus validTestPackage = validatePackage(mValues.testPackageName);
-                    if (validTestPackage != null) {
-                        status = new Status(validTestPackage.getSeverity(),
-                                AdtPlugin.PLUGIN_ID,
-                                validTestPackage.getMessage() + " (in test package)");
-                    }
-                }
-
-                if (status == null || status.getSeverity() != IStatus.ERROR) {
-                    if (mValues.projectName.equals(mValues.testProjectName)) {
-                        status = new Status(IStatus.ERROR, AdtPlugin.PLUGIN_ID,
-                             "The main project name and the test project name must be different.");
-                    }
-                }
-            }
-        }
-
-        // -- update UI & enable finish if there's no error
-        setPageComplete(status == null || status.getSeverity() != IStatus.ERROR);
-        if (status != null) {
-            setMessage(status.getMessage(),
-                    status.getSeverity() == IStatus.ERROR
-                        ? IMessageProvider.ERROR : IMessageProvider.WARNING);
-        } else {
-            setErrorMessage(null);
-            setMessage(null);
-        }
-    }
-
-    private IStatus validateTestProjectLocation() {
-        assert mValues.createPairProject;
-
-        // Validate location
-        Path path = new Path(mValues.projectLocation.getPath());
-        if (!mValues.useExisting) {
-            if (!mValues.useDefaultLocation) {
-                // If not using the default value validate the location.
-                URI uri = URIUtil.toURI(path.toOSString());
-                IWorkspace workspace = ResourcesPlugin.getWorkspace();
-                IProject handle = workspace.getRoot().getProject(mValues.testProjectName);
-                IStatus locationStatus = workspace.validateProjectLocationURI(handle, uri);
-                if (!locationStatus.isOK()) {
-                    return locationStatus;
-                }
-                // The location is valid as far as Eclipse is concerned (i.e. mostly not
-                // an existing workspace project.) Check it either doesn't exist or is
-                // a directory that is empty.
-                File f = path.toFile();
-                if (f.exists() && !f.isDirectory()) {
-                    return new Status(IStatus.ERROR, AdtPlugin.PLUGIN_ID,
-                            "A directory name must be specified.");
-                } else if (f.isDirectory()) {
-                    // However if the directory exists, we should put a
-                    // warning if it is not empty. We don't put an error
-                    // (we'll ask the user again for confirmation before
-                    // using the directory.)
-                    String[] l = f.list();
-                    if (l != null && l.length != 0) {
-                        return new Status(IStatus.WARNING, AdtPlugin.PLUGIN_ID,
-                                "The selected output directory is not empty.");
-                    }
-                }
-            } else {
-                IPath destPath = path.removeLastSegments(1).append(mValues.testProjectName);
-                File dest = destPath.toFile();
-                if (dest.exists()) {
-                    return new Status(IStatus.ERROR, AdtPlugin.PLUGIN_ID,
-                            String.format(
-                                    "There is already a file or directory named \"%1$s\" in the selected location.",
-                            mValues.testProjectName));
-                }
-            }
-        }
-
-        return null;
-    }
-
-    private IStatus validateSourceFolder() {
-        // This check does nothing when creating a new project.
-        // This check is also useless when no activity is present or created.
-        mValues.sourceFolder = SdkConstants.FD_SOURCES;
-        if (!mValues.useExisting || !mValues.createActivity) {
-            return null;
-        }
-
-        String osTarget = mValues.activityName;
-        if (osTarget.indexOf('.') == -1) {
-            osTarget = mValues.packageName + File.separator + osTarget;
-        } else if (osTarget.indexOf('.') == 0) {
-            osTarget = mValues.packageName + osTarget;
-        }
-        osTarget = osTarget.replace('.', File.separatorChar) + SdkConstants.DOT_JAVA;
-
-        File projectDir = mValues.projectLocation;
-        File[] allDirs = projectDir.listFiles(new FileFilter() {
-            @Override
-            public boolean accept(File pathname) {
-                return pathname.isDirectory();
-            }
-        });
-        if (allDirs != null) {
-            boolean found = false;
-            for (File f : allDirs) {
-                Path path = new Path(f.getAbsolutePath());
-                File java_activity = path.append(osTarget).toFile();
-                if (java_activity.isFile()) {
-                    mValues.sourceFolder = f.getName();
-                    found = true;
-                    break;
-                }
-            }
-
-            if (!found) {
-                String projectPath = projectDir.getPath();
-                if (allDirs.length > 0) {
-                    return new Status(IStatus.ERROR, AdtPlugin.PLUGIN_ID,
-                            String.format("%1$s can not be found under %2$s.", osTarget,
-                            projectPath));
-                } else {
-                    return new Status(IStatus.ERROR, AdtPlugin.PLUGIN_ID,
-                            String.format("No source folders can be found in %1$s.",
-                            projectPath));
-                }
-            }
-        }
-
-        return null;
-    }
-
-    private IStatus validateMinSdk() {
-        // Validate min SDK field
-        // If the min sdk version is empty, it is always accepted.
-        if (mValues.minSdk == null || mValues.minSdk.length() == 0) {
-            return null;
-        }
-
-        IAndroidTarget target = mValues.target;
-        if (target == null) {
-            return null;
-        }
-
-        // If the current target is a preview, explicitly indicate minSdkVersion
-        // must be set to this target name.
-        if (target.getVersion().isPreview() && !target.getVersion().equals(mValues.minSdk)) {
-            return new Status(IStatus.ERROR, AdtPlugin.PLUGIN_ID,
-                    String.format(
-                            "The SDK target is a preview. Min SDK Version must be set to '%s'.",
-                            target.getVersion().getCodename()));
-        }
-
-        if (!target.getVersion().equals(mValues.minSdk)) {
-            return new Status(target.getVersion().isPreview() ? IStatus.ERROR : IStatus.WARNING,
-                    AdtPlugin.PLUGIN_ID,
-                    "The API level for the selected SDK target does not match the Min SDK Version."
-                    );
-        }
-
-        return null;
-    }
-
-    public static IStatus validatePackage(String packageFieldContents) {
-        // Validate package
-        if (packageFieldContents == null || packageFieldContents.length() == 0) {
-            return new Status(IStatus.ERROR, AdtPlugin.PLUGIN_ID,
-                    "Package name must be specified.");
-        } else if (packageFieldContents.equals(DUMMY_PACKAGE)) {
-            // The dummy package name is just a placeholder package (which isn't even valid
-            // because it contains the reserved Java keyword "package") but we want to
-            // make the error message say that a proper package should be entered rather than
-            // what's wrong with this specific package. (And the reason we provide a dummy
-            // package rather than a blank line is to make it more clear to beginners what
-            // we're looking for.
-            return new Status(IStatus.ERROR, AdtPlugin.PLUGIN_ID,
-                    "Package name must be specified.");
-        }
-        // Check it's a valid package string
-        IStatus status = JavaConventions.validatePackageName(packageFieldContents, JDK_15,
-                JDK_15);
-        if (!status.isOK()) {
-            return status;
-        }
-
-        // The Android Activity Manager does not accept packages names with only one
-        // identifier. Check the package name has at least one dot in them (the previous rule
-        // validated that if such a dot exist, it's not the first nor last characters of the
-        // string.)
-        if (packageFieldContents.indexOf('.') == -1) {
-            return new Status(IStatus.ERROR, AdtPlugin.PLUGIN_ID,
-                    "Package name must have at least two identifiers.");
-        }
-
-        return null;
-    }
-
-    public static IStatus validateClass(String className) {
-        if (className == null || className.length() == 0) {
-            return new Status(IStatus.ERROR, AdtPlugin.PLUGIN_ID,
-                    "Class name must be specified.");
-        }
-        if (className.indexOf('.') != -1) {
-            return new Status(IStatus.ERROR, AdtPlugin.PLUGIN_ID,
-                    "Enter just a class name, not a full package name");
-        }
-        return JavaConventions.validateJavaTypeName(className, JDK_15, JDK_15);
-    }
-
-    private IStatus validateActivity() {
-        // Validate activity (if creating an activity)
-        if (!mValues.createActivity) {
-            return null;
-        }
-
-        return validateActivity(mValues.activityName);
-    }
-
-    /**
-     * Validates the given activity name
-     *
-     * @param activityFieldContents the activity name to validate
-     * @return a status for whether the activity name is valid
-     */
-    public static IStatus validateActivity(String activityFieldContents) {
-        // Validate activity field
-        if (activityFieldContents == null || activityFieldContents.length() == 0) {
-            return new Status(IStatus.ERROR, AdtPlugin.PLUGIN_ID,
-                    "Activity name must be specified.");
-        } else if (ACTIVITY_NAME_SUFFIX.equals(activityFieldContents)) {
-            return new Status(IStatus.ERROR, AdtPlugin.PLUGIN_ID, "Enter a valid activity name");
-        } else if (activityFieldContents.contains("..")) { //$NON-NLS-1$
-            return new Status(IStatus.ERROR, AdtPlugin.PLUGIN_ID,
-                    "Package segments in activity name cannot be empty (..)");
-        }
-        // The activity field can actually contain part of a sub-package name
-        // or it can start with a dot "." to indicates it comes from the parent package
-        // name.
-        String packageName = "";  //$NON-NLS-1$
-        int pos = activityFieldContents.lastIndexOf('.');
-        if (pos >= 0) {
-            packageName = activityFieldContents.substring(0, pos);
-            if (packageName.startsWith(".")) { //$NON-NLS-1$
-                packageName = packageName.substring(1);
-            }
-
-            activityFieldContents = activityFieldContents.substring(pos + 1);
-        }
-
-        // the activity field can contain a simple java identifier, or a
-        // package name or one that starts with a dot. So if it starts with a dot,
-        // ignore this dot -- the rest must look like a package name.
-        if (activityFieldContents.length() > 0 && activityFieldContents.charAt(0) == '.') {
-            activityFieldContents = activityFieldContents.substring(1);
-        }
-
-        // Check it's a valid activity string
-        IStatus status = JavaConventions.validateTypeVariableName(activityFieldContents, JDK_15,
-                JDK_15);
-        if (!status.isOK()) {
-            return status;
-        }
-
-        // Check it's a valid package string
-        if (packageName.length() > 0) {
-            status = JavaConventions.validatePackageName(packageName, JDK_15, JDK_15);
-            if (!status.isOK()) {
-                return new Status(IStatus.ERROR, AdtPlugin.PLUGIN_ID,
-                        status.getMessage() + " (in the activity name)");
-            }
-        }
-
-        return null;
-    }
-
-    // ---- Implement ITargetChangeListener ----
-
-    @Override
-    public void onSdkLoaded() {
-        if (mSdkCombo == null) {
-            return;
-        }
-
-        // Update the sdk target selector with the new targets
-
-        // get the targets from the sdk
-        IAndroidTarget[] targets = null;
-        if (Sdk.getCurrent() != null) {
-            targets = Sdk.getCurrent().getTargets();
-        }
-        setSdkTargets(targets, mValues.target);
-    }
-
-    @Override
-    public void onProjectTargetChange(IProject changedProject) {
-        // Ignore
-    }
-
-    @Override
-    public void onTargetLoaded(IAndroidTarget target) {
-        // Ignore
-    }
-
-    public static String suggestTestApplicationName(String applicationName) {
-        if (applicationName == null) {
-            applicationName = ""; //$NON-NLS-1$
-        }
-        if (applicationName.indexOf(' ') != -1) {
-            return applicationName + " Test"; //$NON-NLS-1$
-        } else {
-            return applicationName + "Test"; //$NON-NLS-1$
-        }
-    }
-
-    public static String suggestTestProjectName(String projectName) {
-        if (projectName == null) {
-            projectName = ""; //$NON-NLS-1$
-        }
-        if (projectName.length() > 0 && Character.isUpperCase(projectName.charAt(0))) {
-            return projectName + "Test"; //$NON-NLS-1$
-        } else {
-            return projectName + "-test"; //$NON-NLS-1$
-        }
-    }
-
-
-    public static String suggestTestPackage(String packagePath) {
-        if (packagePath == null) {
-            packagePath = ""; //$NON-NLS-1$
-        }
-        return packagePath + ".test"; //$NON-NLS-1$
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/newproject/FileStoreAdapter.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/newproject/FileStoreAdapter.java
deleted file mode 100755
index 0f4e87e..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/newproject/FileStoreAdapter.java
+++ /dev/null
@@ -1,160 +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.ide.eclipse.adt.internal.wizards.newproject;
-
-import org.eclipse.core.filesystem.IFileInfo;
-import org.eclipse.core.filesystem.IFileStore;
-import org.eclipse.core.filesystem.IFileSystem;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IProgressMonitor;
-
-import java.io.File;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.net.URI;
-
-/**
- * IFileStore implementation that delegates to the give {@link IFileStore}.
- * This makes it easier to just override a single method from a store.
- */
-class FileStoreAdapter implements IFileStore {
-
-    private final IFileStore mStore;
-
-    public FileStoreAdapter(IFileStore store) {
-        mStore = store;
-    }
-
-    @SuppressWarnings("rawtypes")
-    @Override
-    public Object getAdapter(Class adapter) {
-        return mStore.getAdapter(adapter);
-    }
-
-    @Override
-    public IFileInfo[] childInfos(int options, IProgressMonitor monitor) throws CoreException {
-        return mStore.childInfos(options, monitor);
-    }
-
-    @Override
-    public String[] childNames(int options, IProgressMonitor monitor)
-            throws CoreException {
-        return mStore.childNames(options, monitor);
-    }
-
-    @Override
-    public IFileStore[] childStores(int options, IProgressMonitor monitor) throws CoreException {
-        return mStore.childStores(options, monitor);
-    }
-
-    @Override
-    public void copy(IFileStore destination, int options, IProgressMonitor monitor)
-            throws CoreException {
-        mStore.copy(destination, options, monitor);
-    }
-
-    @Override
-    public void delete(int options, IProgressMonitor monitor) throws CoreException {
-        mStore.delete(options, monitor);
-    }
-
-    @Override
-    public IFileInfo fetchInfo() {
-        return mStore.fetchInfo();
-    }
-
-    @Override
-    public IFileInfo fetchInfo(int options, IProgressMonitor monitor) throws CoreException {
-        return mStore.fetchInfo(options, monitor);
-    }
-
-    @Deprecated
-    @Override
-    public IFileStore getChild(IPath path) {
-        return mStore.getChild(path);
-    }
-
-    @Override
-    public IFileStore getFileStore(IPath path) {
-        return mStore.getFileStore(path);
-    }
-
-    @Override
-    public IFileStore getChild(String name) {
-        return mStore.getChild(name);
-    }
-
-    @Override
-    public IFileSystem getFileSystem() {
-        return mStore.getFileSystem();
-    }
-
-    @Override
-    public String getName() {
-        return mStore.getName();
-    }
-
-    @Override
-    public IFileStore getParent() {
-        return mStore.getParent();
-    }
-
-    @Override
-    public boolean isParentOf(IFileStore other) {
-        return mStore.isParentOf(other);
-    }
-
-    @Override
-    public IFileStore mkdir(int options, IProgressMonitor monitor) throws CoreException {
-        return mStore.mkdir(options, monitor);
-    }
-
-    @Override
-    public void move(IFileStore destination, int options, IProgressMonitor monitor)
-            throws CoreException {
-        mStore.move(destination, options, monitor);
-    }
-
-    @Override
-    public InputStream openInputStream(int options, IProgressMonitor monitor)
-            throws CoreException {
-        return mStore.openInputStream(options, monitor);
-    }
-
-    @Override
-    public OutputStream openOutputStream(int options, IProgressMonitor monitor)
-            throws CoreException {
-        return mStore.openOutputStream(options, monitor);
-    }
-
-    @Override
-    public void putInfo(IFileInfo info, int options, IProgressMonitor monitor)
-            throws CoreException {
-        mStore.putInfo(info, options, monitor);
-    }
-
-    @Override
-    public File toLocalFile(int options, IProgressMonitor monitor) throws CoreException {
-        return mStore.toLocalFile(options, monitor);
-    }
-
-    @Override
-    public URI toURI() {
-        return mStore.toURI();
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/newproject/ImportPage.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/newproject/ImportPage.java
deleted file mode 100644
index 1e02fed..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/newproject/ImportPage.java
+++ /dev/null
@@ -1,512 +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.ide.eclipse.adt.internal.wizards.newproject;
-
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.tools.lint.detector.api.LintUtils;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IWorkspaceRoot;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.jface.dialogs.IMessageProvider;
-import org.eclipse.jface.viewers.CellEditor;
-import org.eclipse.jface.viewers.CellLabelProvider;
-import org.eclipse.jface.viewers.CheckStateChangedEvent;
-import org.eclipse.jface.viewers.CheckboxTableViewer;
-import org.eclipse.jface.viewers.ColumnViewer;
-import org.eclipse.jface.viewers.EditingSupport;
-import org.eclipse.jface.viewers.ICheckStateListener;
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.TableViewerColumn;
-import org.eclipse.jface.viewers.TextCellEditor;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerCell;
-import org.eclipse.jface.wizard.IWizardPage;
-import org.eclipse.jface.wizard.WizardPage;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.ControlEvent;
-import org.eclipse.swt.events.ControlListener;
-import org.eclipse.swt.events.KeyEvent;
-import org.eclipse.swt.events.KeyListener;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
-import org.eclipse.swt.events.TraverseEvent;
-import org.eclipse.swt.events.TraverseListener;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Rectangle;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.DirectoryDialog;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.swt.widgets.TableColumn;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.IWorkingSet;
-
-import java.io.File;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
-/** WizardPage for importing Android projects */
-class ImportPage extends WizardPage implements SelectionListener, IStructuredContentProvider,
-        ICheckStateListener, KeyListener, TraverseListener, ControlListener {
-    private static final int DIR_COLUMN = 0;
-    private static final int NAME_COLUMN = 1;
-
-    private final NewProjectWizardState mValues;
-    private List<ImportedProject> mProjectPaths;
-    private final IProject[] mExistingProjects;
-
-    private Text mDir;
-    private Button mBrowseButton;
-    private Button mCopyCheckBox;
-    private Button mRefreshButton;
-    private Button mDeselectAllButton;
-    private Button mSelectAllButton;
-    private Table mTable;
-    private CheckboxTableViewer mCheckboxTableViewer;
-    private WorkingSetGroup mWorkingSetGroup;
-
-    ImportPage(NewProjectWizardState values) {
-        super("importPage"); //$NON-NLS-1$
-        mValues = values;
-        setTitle("Import Projects");
-        setDescription("Select a directory to search for existing Android projects");
-        mWorkingSetGroup = new WorkingSetGroup();
-        setWorkingSets(new IWorkingSet[0]);
-
-        // Record all projects such that we can ensure that the project names are unique
-        IWorkspaceRoot workspaceRoot = ResourcesPlugin.getWorkspace().getRoot();
-        mExistingProjects = workspaceRoot.getProjects();
-    }
-
-    public void init(IStructuredSelection selection, IWorkbenchPart activePart) {
-        setWorkingSets(WorkingSetHelper.getSelectedWorkingSet(selection, activePart));
-    }
-
-    @SuppressWarnings("unused") // SWT constructors have side effects and aren't unused
-    @Override
-    public void createControl(Composite parent) {
-        Composite container = new Composite(parent, SWT.NULL);
-        setControl(container);
-        container.setLayout(new GridLayout(3, false));
-
-        Label directoryLabel = new Label(container, SWT.NONE);
-        directoryLabel.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1));
-        directoryLabel.setText("Root Directory:");
-
-        mDir = new Text(container, SWT.BORDER);
-        mDir.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
-        mDir.addKeyListener(this);
-        mDir.addTraverseListener(this);
-
-        mBrowseButton = new Button(container, SWT.NONE);
-        mBrowseButton.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1));
-        mBrowseButton.setText("Browse...");
-        mBrowseButton.addSelectionListener(this);
-
-        Label projectsLabel = new Label(container, SWT.NONE);
-        projectsLabel.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false, 3, 1));
-        projectsLabel.setText("Projects:");
-
-        mTable = new Table(container, SWT.CHECK);
-        mTable.setHeaderVisible(true);
-        mCheckboxTableViewer = new CheckboxTableViewer(mTable);
-
-        TableViewerColumn dirViewerColumn = new TableViewerColumn(mCheckboxTableViewer, SWT.NONE);
-        TableColumn dirColumn = dirViewerColumn.getColumn();
-        dirColumn.setWidth(200);
-        dirColumn.setText("Project to Import");
-        TableViewerColumn nameViewerColumn = new TableViewerColumn(mCheckboxTableViewer, SWT.NONE);
-        TableColumn nameColumn = nameViewerColumn.getColumn();
-        nameColumn.setWidth(200);
-        nameColumn.setText("New Project Name");
-        nameViewerColumn.setEditingSupport(new ProjectNameEditingSupport(mCheckboxTableViewer));
-
-        mTable.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 2, 4));
-        mTable.setLinesVisible(true);
-        mTable.setHeaderVisible(true);
-        mTable.addSelectionListener(this);
-        mTable.addControlListener(this);
-        mCheckboxTableViewer.setContentProvider(this);
-        mCheckboxTableViewer.setInput(this);
-        mCheckboxTableViewer.addCheckStateListener(this);
-        mCheckboxTableViewer.setLabelProvider(new ProjectCellLabelProvider());
-
-        mSelectAllButton = new Button(container, SWT.NONE);
-        mSelectAllButton.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1));
-        mSelectAllButton.setText("Select All");
-        mSelectAllButton.addSelectionListener(this);
-
-        mDeselectAllButton = new Button(container, SWT.NONE);
-        mDeselectAllButton.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1));
-        mDeselectAllButton.setText("Deselect All");
-        mDeselectAllButton.addSelectionListener(this);
-
-        mRefreshButton = new Button(container, SWT.NONE);
-        mRefreshButton.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1));
-        mRefreshButton.setText("Refresh");
-        mRefreshButton.addSelectionListener(this);
-        new Label(container, SWT.NONE);
-
-        mCopyCheckBox = new Button(container, SWT.CHECK);
-        mCopyCheckBox.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false, 3, 1));
-        mCopyCheckBox.setText("Copy projects into workspace");
-        mCopyCheckBox.addSelectionListener(this);
-
-        Composite group = mWorkingSetGroup.createControl(container);
-        group.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 3, 1));
-
-        updateColumnWidths();
-    }
-
-    private void updateColumnWidths() {
-        Rectangle r = mTable.getClientArea();
-        int availableWidth = r.width;
-        // Add all available size to the first column
-        for (int i = 1; i < mTable.getColumnCount(); i++) {
-            TableColumn column = mTable.getColumn(i);
-            availableWidth -= column.getWidth();
-        }
-        if (availableWidth > 100) {
-            mTable.getColumn(0).setWidth(availableWidth);
-        }
-    }
-
-    @Override
-    public void setVisible(boolean visible) {
-        super.setVisible(visible);
-        validatePage();
-    }
-
-    private void refresh() {
-        File root = new File(mDir.getText().trim());
-        mProjectPaths = searchForProjects(root);
-        mCheckboxTableViewer.refresh();
-        mCheckboxTableViewer.setAllChecked(true);
-
-        updateValidity();
-        validatePage();
-    }
-
-    private void updateValidity(){
-        List<ImportedProject> selected = new ArrayList<ImportedProject>();
-        List<ImportedProject> disabled = new ArrayList<ImportedProject>();
-        for (ImportedProject project : mProjectPaths) {
-            String projectName = project.getProjectName();
-            boolean invalid = false;
-            for (IProject existingProject : mExistingProjects) {
-                if (projectName.equals(existingProject.getName())) {
-                    invalid = true;
-                    break;
-                }
-            }
-            if (invalid) {
-                disabled.add(project);
-            } else {
-                selected.add(project);
-            }
-        }
-
-        mValues.importProjects = selected;
-
-        mCheckboxTableViewer.setGrayedElements(disabled.toArray());
-        mCheckboxTableViewer.setCheckedElements(selected.toArray());
-        mCheckboxTableViewer.refresh();
-        mCheckboxTableViewer.getTable().setFocus();
-    }
-
-    private List<ImportedProject> searchForProjects(File dir) {
-        List<ImportedProject> projects = new ArrayList<ImportedProject>();
-        addProjects(dir, projects, dir.getPath().length() + 1);
-        return projects;
-    }
-
-    /** Finds all project directories under the given directory */
-    private void addProjects(File dir, List<ImportedProject> projects, int prefixLength) {
-        if (dir.isDirectory()) {
-            if (LintUtils.isManifestFolder(dir)) {
-                String relative = dir.getPath();
-                if (relative.length() > prefixLength) {
-                    relative = relative.substring(prefixLength);
-                }
-                projects.add(new ImportedProject(dir, relative));
-            }
-
-            File[] children = dir.listFiles();
-            if (children != null) {
-                for (File child : children) {
-                    addProjects(child, projects, prefixLength);
-                }
-            }
-        }
-    }
-
-    private void validatePage() {
-        IStatus status = null;
-
-        // Validate project name -- unless we're creating a sample, in which case
-        // the user will get a chance to pick the name on the Sample page
-        if (mProjectPaths == null || mProjectPaths.isEmpty()) {
-            status = new Status(IStatus.ERROR, AdtPlugin.PLUGIN_ID,
-                    "Select a directory to search for existing Android projects");
-        } else if (mValues.importProjects == null || mValues.importProjects.isEmpty()) {
-            status = new Status(IStatus.ERROR, AdtPlugin.PLUGIN_ID,
-                    "Select at least one project");
-        } else {
-            for (ImportedProject project : mValues.importProjects) {
-                if (mCheckboxTableViewer.getGrayed(project)) {
-                    status = new Status(IStatus.ERROR, AdtPlugin.PLUGIN_ID,
-                            String.format("Cannot import %1$s because the project name is in use",
-                                    project.getProjectName()));
-                    break;
-                } else {
-                    status = ProjectNamePage.validateProjectName(project.getProjectName());
-                    if (status != null && !status.isOK()) {
-                        // Need to insert project name to make it clear which project name
-                        // is in violation
-                        if (mValues.importProjects.size() > 1) {
-                            String message = String.format("%1$s: %2$s",
-                                    project.getProjectName(), status.getMessage());
-                            status = new Status(status.getSeverity(), AdtPlugin.PLUGIN_ID,
-                                    message);
-                        }
-                        break;
-                    } else {
-                        status = null; // Don't leave non null status with isOK() == true
-                    }
-                }
-            }
-        }
-
-        // -- update UI & enable finish if there's no error
-        setPageComplete(status == null || status.getSeverity() != IStatus.ERROR);
-        if (status != null) {
-            setMessage(status.getMessage(),
-                    status.getSeverity() == IStatus.ERROR
-                        ? IMessageProvider.ERROR : IMessageProvider.WARNING);
-        } else {
-            setErrorMessage(null);
-            setMessage(null);
-        }
-    }
-
-    /**
-     * Returns the working sets to which the new project should be added.
-     *
-     * @return the selected working sets to which the new project should be added
-     */
-    private IWorkingSet[] getWorkingSets() {
-        return mWorkingSetGroup.getSelectedWorkingSets();
-    }
-
-    /**
-     * Sets the working sets to which the new project should be added.
-     *
-     * @param workingSets the initial selected working sets
-     */
-    private void setWorkingSets(IWorkingSet[] workingSets) {
-        assert workingSets != null;
-        mWorkingSetGroup.setWorkingSets(workingSets);
-    }
-
-    @Override
-    public IWizardPage getNextPage() {
-        // Sync working set data to the value object, since the WorkingSetGroup
-        // doesn't let us add listeners to do this lazily
-        mValues.workingSets = getWorkingSets();
-
-        return super.getNextPage();
-    }
-
-    // ---- Implements SelectionListener ----
-
-    @Override
-    public void widgetSelected(SelectionEvent e) {
-        Object source = e.getSource();
-        if (source == mBrowseButton) {
-            // Choose directory
-            DirectoryDialog dialog = new DirectoryDialog(getShell(), SWT.OPEN);
-            String path = mDir.getText().trim();
-            if (path.length() > 0) {
-                dialog.setFilterPath(path);
-            }
-            String file = dialog.open();
-            if (file != null) {
-                mDir.setText(file);
-                refresh();
-            }
-        } else if (source == mSelectAllButton) {
-            mCheckboxTableViewer.setAllChecked(true);
-            mValues.importProjects = mProjectPaths;
-        } else if (source == mDeselectAllButton) {
-            mCheckboxTableViewer.setAllChecked(false);
-            mValues.importProjects = Collections.emptyList();
-        } else if (source == mRefreshButton || source == mDir) {
-            refresh();
-        } else if (source == mCopyCheckBox) {
-            mValues.copyIntoWorkspace = mCopyCheckBox.getSelection();
-        }
-
-        validatePage();
-    }
-
-    @Override
-    public void widgetDefaultSelected(SelectionEvent e) {
-    }
-
-    // ---- KeyListener ----
-
-    @Override
-    public void keyPressed(KeyEvent e) {
-        if (e.getSource() == mDir) {
-            if (e.keyCode == SWT.CR) {
-                refresh();
-            }
-        }
-    }
-
-    @Override
-    public void keyReleased(KeyEvent e) {
-    }
-
-    // ---- TraverseListener ----
-
-    @Override
-    public void keyTraversed(TraverseEvent e) {
-        // Prevent Return from running through the wizard; return is handled by
-        // key listener to refresh project list instead
-        if (SWT.TRAVERSE_RETURN == e.detail) {
-            e.doit = false;
-        }
-    }
-
-    // ---- Implements IStructuredContentProvider ----
-
-    @Override
-    public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-    }
-
-    @Override
-    public Object[] getElements(Object inputElement) {
-        return mProjectPaths != null ? mProjectPaths.toArray() : new Object[0];
-    }
-
-    // ---- Implements ICheckStateListener ----
-
-    @Override
-    public void checkStateChanged(CheckStateChangedEvent event) {
-        // Try to disable other elements that conflict with this
-        Object[] checked = mCheckboxTableViewer.getCheckedElements();
-        List<ImportedProject> selected = new ArrayList<ImportedProject>(checked.length);
-        for (Object o : checked) {
-            if (!mCheckboxTableViewer.getGrayed(o)) {
-                selected.add((ImportedProject) o);
-            }
-        }
-        mValues.importProjects = selected;
-        validatePage();
-
-        mCheckboxTableViewer.update(event.getElement(), null);
-    }
-
-    // ---- Implements ControlListener ----
-
-    @Override
-    public void controlMoved(ControlEvent e) {
-    }
-
-    @Override
-    public void controlResized(ControlEvent e) {
-        updateColumnWidths();
-    }
-
-    private final class ProjectCellLabelProvider extends CellLabelProvider {
-        @Override
-        public void update(ViewerCell cell) {
-            Object element = cell.getElement();
-            int index = cell.getColumnIndex();
-            ImportedProject project = (ImportedProject) element;
-
-            Display display = mTable.getDisplay();
-            Color fg;
-            if (mCheckboxTableViewer.getGrayed(element)) {
-                fg = display.getSystemColor(SWT.COLOR_DARK_GRAY);
-            } else {
-                fg = display.getSystemColor(SWT.COLOR_LIST_FOREGROUND);
-            }
-            cell.setForeground(fg);
-            cell.setBackground(display.getSystemColor(SWT.COLOR_LIST_BACKGROUND));
-
-            switch (index) {
-                case DIR_COLUMN: {
-                    // Directory name
-                    cell.setText(project.getRelativePath());
-                    return;
-                }
-
-                case NAME_COLUMN: {
-                    // New name
-                    cell.setText(project.getProjectName());
-                    return;
-                }
-                default:
-                    assert false : index;
-            }
-            cell.setText("");
-        }
-    }
-
-    /** Editing support for the project name column */
-    private class ProjectNameEditingSupport extends EditingSupport {
-        private ProjectNameEditingSupport(ColumnViewer viewer) {
-            super(viewer);
-        }
-
-        @Override
-        protected void setValue(Object element, Object value) {
-            ImportedProject project = (ImportedProject) element;
-            project.setProjectName(value.toString());
-            mCheckboxTableViewer.update(element, null);
-            updateValidity();
-            validatePage();
-        }
-
-        @Override
-        protected Object getValue(Object element) {
-            ImportedProject project = (ImportedProject) element;
-            return project.getProjectName();
-        }
-
-        @Override
-        protected CellEditor getCellEditor(Object element) {
-            return new TextCellEditor(mTable);
-        }
-
-        @Override
-        protected boolean canEdit(Object element) {
-            return true;
-        }
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/newproject/ImportProjectWizard.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/newproject/ImportProjectWizard.java
deleted file mode 100644
index 1004fd6..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/newproject/ImportProjectWizard.java
+++ /dev/null
@@ -1,94 +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.ide.eclipse.adt.internal.wizards.newproject;
-
-import static com.android.SdkConstants.FN_PROJECT_PROGUARD_FILE;
-import static com.android.SdkConstants.OS_SDK_TOOLS_LIB_FOLDER;
-
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.ide.eclipse.adt.AdtUtils;
-import com.android.ide.eclipse.adt.internal.wizards.newproject.NewProjectWizardState.Mode;
-
-import org.eclipse.jdt.ui.actions.OpenJavaPerspectiveAction;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.wizard.Wizard;
-import org.eclipse.ui.INewWizard;
-import org.eclipse.ui.IWorkbench;
-
-import java.io.File;
-
-
-/**
- * An "Import Android Project" wizard.
- */
-public class ImportProjectWizard extends Wizard implements INewWizard {
-    private static final String PROJECT_LOGO_LARGE = "icons/android-64.png"; //$NON-NLS-1$
-
-    private NewProjectWizardState mValues;
-    private ImportPage mImportPage;
-    private IStructuredSelection mSelection;
-
-    /** Constructs a new wizard default project wizard */
-    public ImportProjectWizard() {
-    }
-
-    @Override
-    public void addPages() {
-        mValues = new NewProjectWizardState(Mode.ANY);
-        mImportPage = new ImportPage(mValues);
-        if (mSelection != null) {
-            mImportPage.init(mSelection, AdtUtils.getActivePart());
-        }
-        addPage(mImportPage);
-    }
-
-    @Override
-    public void init(IWorkbench workbench, IStructuredSelection selection) {
-        mSelection = selection;
-
-        setHelpAvailable(false); // TODO have help
-        ImageDescriptor desc = AdtPlugin.getImageDescriptor(PROJECT_LOGO_LARGE);
-        setDefaultPageImageDescriptor(desc);
-
-        // Trigger a check to see if the SDK needs to be reloaded (which will
-        // invoke onSdkLoaded asynchronously as needed).
-        AdtPlugin.getDefault().refreshSdk();
-    }
-
-    @Override
-    public boolean performFinish() {
-        File file = new File(AdtPlugin.getOsSdkFolder(), OS_SDK_TOOLS_LIB_FOLDER + File.separator
-                + FN_PROJECT_PROGUARD_FILE);
-        if (!file.exists()) {
-            AdtPlugin.displayError("Tools Out of Date?",
-            String.format("It looks like you do not have the latest version of the "
-                    + "SDK Tools installed. Make sure you update via the SDK Manager "
-                    + "first. (Could not find %1$s)", file.getPath()));
-            return false;
-        }
-
-        NewProjectCreator creator = new NewProjectCreator(mValues, getContainer());
-        if (!(creator.createAndroidProjects())) {
-            return false;
-        }
-
-        // Open the default Java Perspective
-        OpenJavaPerspectiveAction action = new OpenJavaPerspectiveAction();
-        action.run();
-        return true;
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/newproject/ImportedProject.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/newproject/ImportedProject.java
deleted file mode 100644
index 74af651..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/newproject/ImportedProject.java
+++ /dev/null
@@ -1,256 +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.ide.eclipse.adt.internal.wizards.newproject;
-
-import static com.android.SdkConstants.ATTR_NAME;
-
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-import com.android.ide.common.xml.AndroidManifestParser;
-import com.android.ide.common.xml.ManifestData;
-import com.android.ide.common.xml.ManifestData.Activity;
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.ide.eclipse.adt.internal.editors.layout.gle2.DomUtilities;
-import com.android.ide.eclipse.adt.internal.sdk.Sdk;
-import com.android.io.FolderWrapper;
-import com.android.sdklib.AndroidVersion;
-import com.android.sdklib.IAndroidTarget;
-import com.android.sdklib.internal.project.ProjectProperties;
-import com.android.sdklib.internal.project.ProjectProperties.PropertyType;
-import com.google.common.base.Charsets;
-import com.google.common.io.Files;
-
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IWorkspace;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IStatus;
-import org.w3c.dom.Document;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-import org.xml.sax.SAXException;
-
-import java.io.File;
-import java.io.IOException;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-/** An Android project to be imported */
-class ImportedProject {
-    private final File mLocation;
-    private String mActivityName;
-    private ManifestData mManifest;
-    private String mProjectName;
-    private String mRelativePath;
-
-    ImportedProject(File location, String relativePath) {
-        super();
-        mLocation = location;
-        mRelativePath = relativePath;
-    }
-
-    File getLocation() {
-        return mLocation;
-    }
-
-    String getRelativePath() {
-        return mRelativePath;
-    }
-
-    @Nullable
-    ManifestData getManifest() {
-        if (mManifest == null) {
-            try {
-                mManifest = AndroidManifestParser.parse(new FolderWrapper(mLocation));
-            } catch (SAXException e) {
-                // Some sort of error in the manifest file: report to the user in a better way?
-                AdtPlugin.log(e, null);
-                return null;
-            } catch (Exception e) {
-                AdtPlugin.log(e, null);
-                return null;
-            }
-        }
-
-        return mManifest;
-    }
-
-    @Nullable
-    public String getActivityName() {
-        if (mActivityName == null) {
-            // Compute the project name and the package name from the manifest
-            ManifestData manifest = getManifest();
-            if (manifest != null) {
-                if (manifest.getLauncherActivity() != null) {
-                    mActivityName = manifest.getLauncherActivity().getName();
-                }
-                if (mActivityName == null || mActivityName.isEmpty()) {
-                    Activity[] activities = manifest.getActivities();
-                    for (Activity activity : activities) {
-                        mActivityName = activity.getName();
-                        if (mActivityName != null && !mActivityName.isEmpty()) {
-                            break;
-                        }
-                    }
-                }
-                if (mActivityName != null) {
-                    int index = mActivityName.lastIndexOf('.');
-                    mActivityName = mActivityName.substring(index + 1);
-                }
-            }
-        }
-
-        return mActivityName;
-    }
-
-    @NonNull
-    public String getProjectName() {
-        if (mProjectName == null) {
-            // Are we importing an Eclipse project? If so just use the existing project name
-            mProjectName = findEclipseProjectName();
-            if (mProjectName != null) {
-                return mProjectName;
-            }
-
-            String activityName = getActivityName();
-            if (activityName == null || activityName.isEmpty()) {
-                // I could also look at the build files, say build.xml from ant, and
-                // try to glean the project name from there
-                mProjectName = mLocation.getName();
-            } else {
-                // Try to derive it from the activity name:
-                IWorkspace workspace = ResourcesPlugin.getWorkspace();
-                IStatus nameStatus = workspace.validateName(activityName, IResource.PROJECT);
-                if (nameStatus.isOK()) {
-                    mProjectName = activityName;
-                } else {
-                    // Try to derive it by escaping characters
-                    StringBuilder sb = new StringBuilder();
-                    for (int i = 0, n = activityName.length(); i < n; i++) {
-                        char c = activityName.charAt(i);
-                        if (c != IPath.DEVICE_SEPARATOR && c != IPath.SEPARATOR && c != '\\') {
-                            sb.append(c);
-                        }
-                    }
-                    if (sb.length() == 0) {
-                        mProjectName = mLocation.getName();
-                    } else {
-                        mProjectName = sb.toString();
-                    }
-                }
-            }
-        }
-
-        return mProjectName;
-    }
-
-    @Nullable
-    private String findEclipseProjectName() {
-        File projectFile = new File(mLocation, ".project"); //$NON-NLS-1$
-        if (projectFile.exists()) {
-            String xml;
-            try {
-                xml = Files.toString(projectFile, Charsets.UTF_8);
-                Document doc = DomUtilities.parseDocument(xml, false);
-                if (doc != null) {
-                    NodeList names = doc.getElementsByTagName(ATTR_NAME);
-                    if (names.getLength() >= 1) {
-                        Node nameElement = names.item(0);
-                        String name = nameElement.getTextContent().trim();
-                        if (!name.isEmpty()) {
-                            return name;
-                        }
-                    }
-                }
-            } catch (IOException e) {
-                // pass: don't attempt to read project name; must be some sort of unrelated
-                // file with the same name, perhaps from a different editor or IDE
-            }
-        }
-
-        return null;
-    }
-
-    public void setProjectName(@NonNull String newName) {
-        mProjectName = newName;
-    }
-
-    public IAndroidTarget getTarget() {
-        // Pick a target:
-        // First try to find the one requested by project.properties
-        IAndroidTarget[] targets = Sdk.getCurrent().getTargets();
-        ProjectProperties properties = ProjectProperties.load(mLocation.getPath(),
-                PropertyType.PROJECT);
-        if (properties != null) {
-            String targetProperty = properties.getProperty(ProjectProperties.PROPERTY_TARGET);
-            if (targetProperty != null) {
-                Matcher m = Pattern.compile("android-(.+)").matcher( //$NON-NLS-1$
-                        targetProperty.trim());
-                if (m.matches()) {
-                    String targetName = m.group(1);
-                    int targetLevel;
-                    try {
-                        targetLevel = Integer.parseInt(targetName);
-                    } catch (NumberFormatException nufe) {
-                        // pass
-                        targetLevel = -1;
-                    }
-                    for (IAndroidTarget t : targets) {
-                        AndroidVersion version = t.getVersion();
-                        if (version.isPreview() && targetName.equals(version.getCodename())) {
-                            return t;
-                        } else if (targetLevel == version.getApiLevel()) {
-                            return t;
-                        }
-                    }
-                    if (targetLevel > 0) {
-                        // If not found, pick the closest one that is higher than the
-                        // api level
-                        IAndroidTarget target = targets[targets.length - 1];
-                        int targetDelta = target.getVersion().getApiLevel() - targetLevel;
-                        for (IAndroidTarget t : targets) {
-                            int newDelta = t.getVersion().getApiLevel() - targetLevel;
-                            if (newDelta >= 0 && newDelta < targetDelta) {
-                                targetDelta = newDelta;
-                                target = t;
-                            }
-                        }
-
-                        return target;
-                    }
-                }
-            }
-        }
-
-        // If not found, pick the closest one to the one requested by the
-        // project (in project.properties) that is still >= the minSdk version
-        IAndroidTarget target = targets[targets.length - 1];
-        ManifestData manifest = getManifest();
-        if (manifest != null) {
-            int minSdkLevel = manifest.getMinSdkVersion();
-            int targetDelta = target.getVersion().getApiLevel() - minSdkLevel;
-            for (IAndroidTarget t : targets) {
-                int newDelta = t.getVersion().getApiLevel() - minSdkLevel;
-                if (newDelta >= 0 && newDelta < targetDelta) {
-                    targetDelta = newDelta;
-                    target = t;
-                }
-            }
-        }
-
-        return target;
-    }
-}
\ No newline at end of file
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/newproject/NewProjectCreator.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/newproject/NewProjectCreator.java
deleted file mode 100644
index d168c75..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/newproject/NewProjectCreator.java
+++ /dev/null
@@ -1,1520 +0,0 @@
-/*
- * Copyright (C) 2007 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.wizards.newproject;
-
-import static com.android.SdkConstants.FN_PROJECT_PROPERTIES;
-import static com.android.sdklib.internal.project.ProjectProperties.PROPERTY_LIBRARY;
-
-import static org.eclipse.core.resources.IResource.DEPTH_ZERO;
-
-import com.android.SdkConstants;
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-import com.android.annotations.VisibleForTesting;
-import com.android.ide.common.res2.ValueXmlHelper;
-import com.android.ide.common.xml.ManifestData;
-import com.android.ide.common.xml.XmlFormatStyle;
-import com.android.ide.eclipse.adt.AdtConstants;
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.ide.eclipse.adt.AdtUtils;
-import com.android.ide.eclipse.adt.internal.editors.formatting.EclipseXmlFormatPreferences;
-import com.android.ide.eclipse.adt.internal.editors.formatting.EclipseXmlPrettyPrinter;
-import com.android.ide.eclipse.adt.internal.preferences.AdtPrefs;
-import com.android.ide.eclipse.adt.internal.project.AndroidNature;
-import com.android.ide.eclipse.adt.internal.project.BaseProjectHelper;
-import com.android.ide.eclipse.adt.internal.project.ProjectHelper;
-import com.android.ide.eclipse.adt.internal.sdk.ProjectState;
-import com.android.ide.eclipse.adt.internal.sdk.Sdk;
-import com.android.ide.eclipse.adt.internal.wizards.newproject.NewProjectWizardState.Mode;
-import com.android.io.StreamException;
-import com.android.resources.Density;
-import com.android.sdklib.IAndroidTarget;
-import com.android.sdklib.internal.project.ProjectPropertiesWorkingCopy;
-
-import org.eclipse.core.filesystem.EFS;
-import org.eclipse.core.filesystem.IFileInfo;
-import org.eclipse.core.filesystem.IFileStore;
-import org.eclipse.core.filesystem.IFileSystem;
-import org.eclipse.core.resources.IContainer;
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IFolder;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IProjectDescription;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IResourceStatus;
-import org.eclipse.core.resources.IWorkspace;
-import org.eclipse.core.resources.IWorkspaceRunnable;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.core.runtime.OperationCanceledException;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.core.runtime.SubProgressMonitor;
-import org.eclipse.jdt.core.IAccessRule;
-import org.eclipse.jdt.core.IClasspathAttribute;
-import org.eclipse.jdt.core.IClasspathEntry;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.JavaCore;
-import org.eclipse.jdt.core.JavaModelException;
-import org.eclipse.jface.dialogs.ErrorDialog;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.jface.operation.IRunnableContext;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.ui.IWorkingSet;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.actions.WorkspaceModifyOperation;
-
-import java.io.ByteArrayInputStream;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.io.InputStream;
-import java.lang.reflect.InvocationTargetException;
-import java.net.MalformedURLException;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Map.Entry;
-import java.util.Set;
-
-/**
- * The actual project creator invoked from the New Project Wizard
- * <p/>
- * Note: this class is public so that it can be accessed from unit tests.
- * It is however an internal class. Its API may change without notice.
- * It should semantically be considered as a private final class.
- */
-public class NewProjectCreator  {
-
-    private static final String PARAM_SDK_TOOLS_DIR = "ANDROID_SDK_TOOLS";          //$NON-NLS-1$
-    private static final String PARAM_ACTIVITY = "ACTIVITY_NAME";                   //$NON-NLS-1$
-    private static final String PARAM_APPLICATION = "APPLICATION_NAME";             //$NON-NLS-1$
-    private static final String PARAM_PACKAGE = "PACKAGE";                          //$NON-NLS-1$
-    private static final String PARAM_IMPORT_RESOURCE_CLASS = "IMPORT_RESOURCE_CLASS"; //$NON-NLS-1$
-    private static final String PARAM_PROJECT = "PROJECT_NAME";                     //$NON-NLS-1$
-    private static final String PARAM_STRING_NAME = "STRING_NAME";                  //$NON-NLS-1$
-    private static final String PARAM_STRING_CONTENT = "STRING_CONTENT";            //$NON-NLS-1$
-    private static final String PARAM_IS_NEW_PROJECT = "IS_NEW_PROJECT";            //$NON-NLS-1$
-    private static final String PARAM_SAMPLE_LOCATION = "SAMPLE_LOCATION";          //$NON-NLS-1$
-    private static final String PARAM_SOURCE = "SOURCE";                            //$NON-NLS-1$
-    private static final String PARAM_SRC_FOLDER = "SRC_FOLDER";                    //$NON-NLS-1$
-    private static final String PARAM_SDK_TARGET = "SDK_TARGET";                    //$NON-NLS-1$
-    private static final String PARAM_IS_LIBRARY = "IS_LIBRARY";                    //$NON-NLS-1$
-    private static final String PARAM_MIN_SDK_VERSION = "MIN_SDK_VERSION";          //$NON-NLS-1$
-    // Warning: The expanded string PARAM_TEST_TARGET_PACKAGE must not contain the
-    // string "PACKAGE" since it collides with the replacement of PARAM_PACKAGE.
-    private static final String PARAM_TEST_TARGET_PACKAGE = "TEST_TARGET_PCKG";     //$NON-NLS-1$
-    private static final String PARAM_TARGET_SELF = "TARGET_SELF";                  //$NON-NLS-1$
-    private static final String PARAM_TARGET_MAIN = "TARGET_MAIN";                  //$NON-NLS-1$
-    private static final String PARAM_TARGET_EXISTING = "TARGET_EXISTING";          //$NON-NLS-1$
-    private static final String PARAM_REFERENCE_PROJECT = "REFERENCE_PROJECT";      //$NON-NLS-1$
-
-    private static final String PH_ACTIVITIES = "ACTIVITIES";                       //$NON-NLS-1$
-    private static final String PH_USES_SDK = "USES-SDK";                           //$NON-NLS-1$
-    private static final String PH_INTENT_FILTERS = "INTENT_FILTERS";               //$NON-NLS-1$
-    private static final String PH_STRINGS = "STRINGS";                             //$NON-NLS-1$
-    private static final String PH_TEST_USES_LIBRARY = "TEST-USES-LIBRARY";         //$NON-NLS-1$
-    private static final String PH_TEST_INSTRUMENTATION = "TEST-INSTRUMENTATION";   //$NON-NLS-1$
-
-    private static final String BIN_DIRECTORY =
-        SdkConstants.FD_OUTPUT + AdtConstants.WS_SEP;
-    private static final String BIN_CLASSES_DIRECTORY =
-        SdkConstants.FD_OUTPUT + AdtConstants.WS_SEP +
-        SdkConstants.FD_CLASSES_OUTPUT + AdtConstants.WS_SEP;
-    private static final String RES_DIRECTORY =
-        SdkConstants.FD_RESOURCES + AdtConstants.WS_SEP;
-    private static final String ASSETS_DIRECTORY =
-        SdkConstants.FD_ASSETS + AdtConstants.WS_SEP;
-    private static final String DRAWABLE_DIRECTORY =
-        SdkConstants.FD_RES_DRAWABLE + AdtConstants.WS_SEP;
-    private static final String DRAWABLE_XHDPI_DIRECTORY =
-            SdkConstants.FD_RES_DRAWABLE + '-' + Density.XHIGH.getResourceValue() +
-            AdtConstants.WS_SEP;
-    private static final String DRAWABLE_HDPI_DIRECTORY =
-            SdkConstants.FD_RES_DRAWABLE + '-' + Density.HIGH.getResourceValue() +
-            AdtConstants.WS_SEP;
-    private static final String DRAWABLE_MDPI_DIRECTORY =
-        SdkConstants.FD_RES_DRAWABLE + '-' + Density.MEDIUM.getResourceValue() +
-        AdtConstants.WS_SEP;
-    private static final String DRAWABLE_LDPI_DIRECTORY =
-        SdkConstants.FD_RES_DRAWABLE + '-' + Density.LOW.getResourceValue() +
-        AdtConstants.WS_SEP;
-    private static final String LAYOUT_DIRECTORY =
-        SdkConstants.FD_RES_LAYOUT + AdtConstants.WS_SEP;
-    private static final String VALUES_DIRECTORY =
-        SdkConstants.FD_RES_VALUES + AdtConstants.WS_SEP;
-    private static final String GEN_SRC_DIRECTORY =
-        SdkConstants.FD_GEN_SOURCES + AdtConstants.WS_SEP;
-
-    private static final String TEMPLATES_DIRECTORY = "templates/"; //$NON-NLS-1$
-    private static final String TEMPLATE_MANIFEST = TEMPLATES_DIRECTORY
-            + "AndroidManifest.template"; //$NON-NLS-1$
-    private static final String TEMPLATE_ACTIVITIES = TEMPLATES_DIRECTORY
-            + "activity.template"; //$NON-NLS-1$
-    private static final String TEMPLATE_USES_SDK = TEMPLATES_DIRECTORY
-            + "uses-sdk.template"; //$NON-NLS-1$
-    private static final String TEMPLATE_INTENT_LAUNCHER = TEMPLATES_DIRECTORY
-            + "launcher_intent_filter.template"; //$NON-NLS-1$
-    private static final String TEMPLATE_TEST_USES_LIBRARY = TEMPLATES_DIRECTORY
-            + "test_uses-library.template"; //$NON-NLS-1$
-    private static final String TEMPLATE_TEST_INSTRUMENTATION = TEMPLATES_DIRECTORY
-            + "test_instrumentation.template"; //$NON-NLS-1$
-
-
-
-    private static final String TEMPLATE_STRINGS = TEMPLATES_DIRECTORY
-            + "strings.template"; //$NON-NLS-1$
-    private static final String TEMPLATE_STRING = TEMPLATES_DIRECTORY
-            + "string.template"; //$NON-NLS-1$
-    private static final String PROJECT_ICON = "ic_launcher.png"; //$NON-NLS-1$
-    private static final String ICON_XHDPI = "ic_launcher_xhdpi.png"; //$NON-NLS-1$
-    private static final String ICON_HDPI = "ic_launcher_hdpi.png"; //$NON-NLS-1$
-    private static final String ICON_MDPI = "ic_launcher_mdpi.png"; //$NON-NLS-1$
-    private static final String ICON_LDPI = "ic_launcher_ldpi.png"; //$NON-NLS-1$
-
-    private static final String STRINGS_FILE = "strings.xml";       //$NON-NLS-1$
-
-    private static final String STRING_RSRC_PREFIX = SdkConstants.STRING_PREFIX;
-    private static final String STRING_APP_NAME = "app_name";       //$NON-NLS-1$
-    private static final String STRING_HELLO_WORLD = "hello";       //$NON-NLS-1$
-
-    private static final String[] DEFAULT_DIRECTORIES = new String[] {
-            BIN_DIRECTORY, BIN_CLASSES_DIRECTORY, RES_DIRECTORY, ASSETS_DIRECTORY };
-    private static final String[] RES_DIRECTORIES = new String[] {
-            DRAWABLE_DIRECTORY, LAYOUT_DIRECTORY, VALUES_DIRECTORY };
-    private static final String[] RES_DENSITY_ENABLED_DIRECTORIES = new String[] {
-            DRAWABLE_XHDPI_DIRECTORY,
-            DRAWABLE_HDPI_DIRECTORY, DRAWABLE_MDPI_DIRECTORY, DRAWABLE_LDPI_DIRECTORY,
-            LAYOUT_DIRECTORY, VALUES_DIRECTORY };
-
-    private static final String JAVA_ACTIVITY_TEMPLATE = "java_file.template";  //$NON-NLS-1$
-    private static final String LAYOUT_TEMPLATE = "layout.template";            //$NON-NLS-1$
-    private static final String MAIN_LAYOUT_XML = "main.xml";                   //$NON-NLS-1$
-
-    private final NewProjectWizardState mValues;
-    private final IRunnableContext mRunnableContext;
-
-    /**
-     * Creates a new {@linkplain NewProjectCreator}
-     * @param values the wizard state with initial project parameters
-     * @param runnableContext the context to run project creation in
-     */
-    public NewProjectCreator(NewProjectWizardState values, IRunnableContext runnableContext) {
-        mValues = values;
-        mRunnableContext = runnableContext;
-    }
-
-    /**
-     * Before actually creating the project for a new project (as opposed to using an
-     * existing project), we check if the target location is a directory that either does
-     * not exist or is empty.
-     *
-     * If it's not empty, ask the user for confirmation.
-     *
-     * @param destination The destination folder where the new project is to be created.
-     * @return True if the destination doesn't exist yet or is an empty directory or is
-     *         accepted by the user.
-     */
-    private boolean validateNewProjectLocationIsEmpty(IPath destination) {
-        File f = new File(destination.toOSString());
-        if (f.isDirectory() && f.list().length > 0) {
-            return AdtPlugin.displayPrompt("New Android Project",
-                    "You are going to create a new Android Project in an existing, non-empty, directory. Are you sure you want to proceed?");
-        }
-        return true;
-    }
-
-    /**
-     * Structure that describes all the information needed to create a project.
-     * This is collected from the pages by {@link NewProjectCreator#createAndroidProjects()}
-     * and then used by
-     * {@link NewProjectCreator#createProjectAsync(IProgressMonitor, ProjectInfo, ProjectInfo)}.
-     */
-    private static class ProjectInfo {
-        private final IProject mProject;
-        private final IProjectDescription mDescription;
-        private final Map<String, Object> mParameters;
-        private final HashMap<String, String> mDictionary;
-
-        public ProjectInfo(IProject project,
-                IProjectDescription description,
-                Map<String, Object> parameters,
-                HashMap<String, String> dictionary) {
-                    mProject = project;
-                    mDescription = description;
-                    mParameters = parameters;
-                    mDictionary = dictionary;
-        }
-
-        public IProject getProject() {
-            return mProject;
-        }
-
-        public IProjectDescription getDescription() {
-            return mDescription;
-        }
-
-        public Map<String, Object> getParameters() {
-            return mParameters;
-        }
-
-        public HashMap<String, String> getDictionary() {
-            return mDictionary;
-        }
-    }
-
-    /**
-     * Creates the android project.
-     * @return True if the project could be created.
-     */
-    public boolean createAndroidProjects() {
-        if (mValues.importProjects != null && !mValues.importProjects.isEmpty()) {
-            return importProjects();
-        }
-
-        final ProjectInfo mainData = collectMainPageInfo();
-        final ProjectInfo testData = collectTestPageInfo();
-
-        // Create a monitored operation to create the actual project
-        WorkspaceModifyOperation op = new WorkspaceModifyOperation() {
-            @Override
-            protected void execute(IProgressMonitor monitor) throws InvocationTargetException {
-                createProjectAsync(monitor, mainData, testData, null, true);
-            }
-        };
-
-        // Run the operation in a different thread
-        runAsyncOperation(op);
-        return true;
-    }
-
-    /**
-     * Creates the a plain Java project without typical android directories or an Android Nature.
-     * This is intended for use by unit tests and not as a general-purpose Java project creator.
-     * @return True if the project could be created.
-     */
-    @VisibleForTesting
-    public boolean createJavaProjects() {
-        if (mValues.importProjects != null && !mValues.importProjects.isEmpty()) {
-            return importProjects();
-        }
-
-        final ProjectInfo mainData = collectMainPageInfo();
-        final ProjectInfo testData = collectTestPageInfo();
-
-        // Create a monitored operation to create the actual project
-        WorkspaceModifyOperation op = new WorkspaceModifyOperation() {
-            @Override
-            protected void execute(IProgressMonitor monitor) throws InvocationTargetException {
-                createProjectAsync(monitor, mainData, testData, null, false);
-            }
-        };
-
-        // Run the operation in a different thread
-        runAsyncOperation(op);
-        return true;
-    }
-
-    /**
-     * Imports a list of projects
-     */
-    private boolean importProjects() {
-        assert mValues.importProjects != null && !mValues.importProjects.isEmpty();
-        IWorkspace workspace = ResourcesPlugin.getWorkspace();
-
-        final List<ProjectInfo> projectData = new ArrayList<ProjectInfo>();
-        for (ImportedProject p : mValues.importProjects) {
-
-            // Compute the project name and the package name from the manifest
-            ManifestData manifest = p.getManifest();
-            if (manifest == null) {
-                continue;
-            }
-            String packageName = manifest.getPackage();
-            String projectName = p.getProjectName();
-            String minSdk = manifest.getMinSdkVersionString();
-
-            final IProject project = workspace.getRoot().getProject(projectName);
-            final IProjectDescription description =
-                    workspace.newProjectDescription(project.getName());
-
-            final Map<String, Object> parameters = new HashMap<String, Object>();
-            parameters.put(PARAM_PROJECT, projectName);
-            parameters.put(PARAM_PACKAGE, packageName);
-            parameters.put(PARAM_SDK_TOOLS_DIR, AdtPlugin.getOsSdkToolsFolder());
-            parameters.put(PARAM_IS_NEW_PROJECT, Boolean.FALSE);
-            parameters.put(PARAM_SRC_FOLDER, SdkConstants.FD_SOURCES);
-
-            parameters.put(PARAM_SDK_TARGET, p.getTarget());
-
-            // TODO: Find out if these end up getting used in the import-path through the code!
-            parameters.put(PARAM_MIN_SDK_VERSION, minSdk);
-            parameters.put(PARAM_APPLICATION, STRING_RSRC_PREFIX + STRING_APP_NAME);
-            final HashMap<String, String> dictionary = new HashMap<String, String>();
-            dictionary.put(STRING_APP_NAME, mValues.applicationName);
-
-            if (mValues.copyIntoWorkspace) {
-                parameters.put(PARAM_SOURCE, p.getLocation());
-
-                // TODO: Make sure it isn't *already* in the workspace!
-                //IPath defaultLocation = Platform.getLocation();
-                //if ((!mValues.useDefaultLocation || mValues.useExisting)
-                //        && !defaultLocation.isPrefixOf(path)) {
-                //IPath workspaceLocation = Platform.getLocation().append(projectName);
-                //description.setLocation(workspaceLocation);
-                // DON'T SET THE LOCATION: It's IMPLIED and in fact it will generate
-                // an error if you set it!
-            } else {
-                // Create in place
-                description.setLocation(new Path(p.getLocation().getPath()));
-            }
-
-            projectData.add(new ProjectInfo(project, description, parameters, dictionary));
-        }
-
-        // Create a monitored operation to create the actual project
-        WorkspaceModifyOperation op = new WorkspaceModifyOperation() {
-            @Override
-            protected void execute(IProgressMonitor monitor) throws InvocationTargetException {
-                createProjectAsync(monitor, null, null, projectData, true);
-            }
-        };
-
-        // Run the operation in a different thread
-        runAsyncOperation(op);
-        return true;
-    }
-
-    /**
-     * Collects all the parameters needed to create the main project.
-     * @return A new {@link ProjectInfo} on success. Returns null if the project cannot be
-     *    created because parameters are incorrect or should not be created because there
-     *    is no main page.
-     */
-    private ProjectInfo collectMainPageInfo() {
-        if (mValues.mode == Mode.TEST) {
-            return null;
-        }
-
-        IWorkspace workspace = ResourcesPlugin.getWorkspace();
-        final IProject project = workspace.getRoot().getProject(mValues.projectName);
-        final IProjectDescription description = workspace.newProjectDescription(project.getName());
-
-        final Map<String, Object> parameters = new HashMap<String, Object>();
-        parameters.put(PARAM_PROJECT, mValues.projectName);
-        parameters.put(PARAM_PACKAGE, mValues.packageName);
-        parameters.put(PARAM_APPLICATION, STRING_RSRC_PREFIX + STRING_APP_NAME);
-        parameters.put(PARAM_SDK_TOOLS_DIR, AdtPlugin.getOsSdkToolsFolder());
-        parameters.put(PARAM_IS_NEW_PROJECT, mValues.mode == Mode.ANY && !mValues.useExisting);
-        parameters.put(PARAM_SAMPLE_LOCATION, mValues.chosenSample);
-        parameters.put(PARAM_SRC_FOLDER, mValues.sourceFolder);
-        parameters.put(PARAM_SDK_TARGET, mValues.target);
-        parameters.put(PARAM_MIN_SDK_VERSION, mValues.minSdk);
-
-        if (mValues.createActivity) {
-            parameters.put(PARAM_ACTIVITY, mValues.activityName);
-        }
-
-        // create a dictionary of string that will contain name+content.
-        // we'll put all the strings into values/strings.xml
-        final HashMap<String, String> dictionary = new HashMap<String, String>();
-        dictionary.put(STRING_APP_NAME, mValues.applicationName);
-
-        IPath path = new Path(mValues.projectLocation.getPath());
-        IPath defaultLocation = Platform.getLocation();
-        if ((!mValues.useDefaultLocation || mValues.useExisting)
-                && !defaultLocation.isPrefixOf(path)) {
-            description.setLocation(path);
-        }
-
-        if (mValues.mode == Mode.ANY && !mValues.useExisting && !mValues.useDefaultLocation &&
-                !validateNewProjectLocationIsEmpty(path)) {
-            return null;
-        }
-
-        return new ProjectInfo(project, description, parameters, dictionary);
-    }
-
-    /**
-     * Collects all the parameters needed to create the test project.
-     *
-     * @return A new {@link ProjectInfo} on success. Returns null if the project cannot be
-     *    created because parameters are incorrect or should not be created because there
-     *    is no test page.
-     */
-    private ProjectInfo collectTestPageInfo() {
-        if (mValues.mode != Mode.TEST && !mValues.createPairProject) {
-            return null;
-        }
-
-        IWorkspace workspace = ResourcesPlugin.getWorkspace();
-        String projectName =
-                mValues.mode == Mode.TEST ? mValues.projectName : mValues.testProjectName;
-        final IProject project = workspace.getRoot().getProject(projectName);
-        final IProjectDescription description = workspace.newProjectDescription(project.getName());
-
-        final Map<String, Object> parameters = new HashMap<String, Object>();
-
-        String pkg =
-                mValues.mode == Mode.TEST ? mValues.packageName : mValues.testPackageName;
-
-        parameters.put(PARAM_PACKAGE, pkg);
-        parameters.put(PARAM_APPLICATION, STRING_RSRC_PREFIX + STRING_APP_NAME);
-        parameters.put(PARAM_SDK_TOOLS_DIR, AdtPlugin.getOsSdkToolsFolder());
-        parameters.put(PARAM_IS_NEW_PROJECT, !mValues.useExisting);
-        parameters.put(PARAM_SRC_FOLDER, mValues.sourceFolder);
-        parameters.put(PARAM_SDK_TARGET, mValues.target);
-        parameters.put(PARAM_MIN_SDK_VERSION, mValues.minSdk);
-
-        // Test-specific parameters
-        String testedPkg = mValues.createPairProject
-                ? mValues.packageName : mValues.testTargetPackageName;
-        if (testedPkg == null) {
-            assert mValues.testingSelf;
-            testedPkg = pkg;
-        }
-
-        parameters.put(PARAM_TEST_TARGET_PACKAGE, testedPkg);
-
-        if (mValues.testingSelf) {
-            parameters.put(PARAM_TARGET_SELF, true);
-        } else {
-            parameters.put(PARAM_TARGET_EXISTING, true);
-            parameters.put(PARAM_REFERENCE_PROJECT, mValues.testedProject);
-        }
-
-        if (mValues.createPairProject) {
-            parameters.put(PARAM_TARGET_MAIN, true);
-        }
-
-        // create a dictionary of string that will contain name+content.
-        // we'll put all the strings into values/strings.xml
-        final HashMap<String, String> dictionary = new HashMap<String, String>();
-        dictionary.put(STRING_APP_NAME, mValues.testApplicationName);
-
-        // Use the same logic to determine test project location as in
-        // ApplicationInfoPage#validateTestProjectLocation
-        IPath path = new Path(mValues.projectLocation.getPath());
-        path = path.removeLastSegments(1).append(mValues.testProjectName);
-        IPath defaultLocation = Platform.getLocation();
-        if ((!mValues.useDefaultLocation || mValues.useExisting)
-                && !path.equals(defaultLocation)) {
-            description.setLocation(path);
-        }
-
-        if (!mValues.useExisting && !mValues.useDefaultLocation &&
-                !validateNewProjectLocationIsEmpty(path)) {
-            return null;
-        }
-
-        return new ProjectInfo(project, description, parameters, dictionary);
-    }
-
-    /**
-     * Runs the operation in a different thread and display generated
-     * exceptions.
-     *
-     * @param op The asynchronous operation to run.
-     */
-    private void runAsyncOperation(WorkspaceModifyOperation op) {
-        try {
-            mRunnableContext.run(true /* fork */, true /* cancelable */, op);
-        } catch (InvocationTargetException e) {
-
-            AdtPlugin.log(e, "New Project Wizard failed");
-
-            // The runnable threw an exception
-            Throwable t = e.getTargetException();
-            if (t instanceof CoreException) {
-                CoreException core = (CoreException) t;
-                if (core.getStatus().getCode() == IResourceStatus.CASE_VARIANT_EXISTS) {
-                    // The error indicates the file system is not case sensitive
-                    // and there's a resource with a similar name.
-                    MessageDialog.openError(AdtPlugin.getShell(),
-                            "Error", "Error: Case Variant Exists");
-                } else {
-                    ErrorDialog.openError(AdtPlugin.getShell(),
-                            "Error", core.getMessage(), core.getStatus());
-                }
-            } else {
-                // Some other kind of exception
-                String msg = t.getMessage();
-                Throwable t1 = t;
-                while (msg == null && t1.getCause() != null) {
-                    msg = t1.getMessage();
-                    t1 = t1.getCause();
-                }
-                if (msg == null) {
-                    msg = t.toString();
-                }
-                MessageDialog.openError(AdtPlugin.getShell(), "Error", msg);
-            }
-            e.printStackTrace();
-        } catch (InterruptedException e) {
-            e.printStackTrace();
-        }
-    }
-
-    /**
-     * Creates the actual project(s). This is run asynchronously in a different thread.
-     *
-     * @param monitor An existing monitor.
-     * @param mainData Data for main project. Can be null.
-     * @param isAndroidProject true if the project is to be set up as a full Android project; false
-     * for a plain Java project.
-     * @throws InvocationTargetException to wrap any unmanaged exception and
-     *         return it to the calling thread. The method can fail if it fails
-     *         to create or modify the project or if it is canceled by the user.
-     */
-    private void createProjectAsync(IProgressMonitor monitor,
-            ProjectInfo mainData,
-            ProjectInfo testData,
-            List<ProjectInfo> importData,
-            boolean isAndroidProject)
-                throws InvocationTargetException {
-        monitor.beginTask("Create Android Project", 100);
-        try {
-            IProject mainProject = null;
-
-            if (mainData != null) {
-                mainProject = createEclipseProject(
-                        new SubProgressMonitor(monitor, 50),
-                        mainData.getProject(),
-                        mainData.getDescription(),
-                        mainData.getParameters(),
-                        mainData.getDictionary(),
-                        null,
-                        isAndroidProject);
-
-                if (mainProject != null) {
-                    final IJavaProject javaProject = JavaCore.create(mainProject);
-                    Display.getDefault().syncExec(new WorksetAdder(javaProject,
-                            mValues.workingSets));
-                }
-            }
-
-            if (testData != null) {
-                Map<String, Object> parameters = testData.getParameters();
-                if (parameters.containsKey(PARAM_TARGET_MAIN) && mainProject != null) {
-                    parameters.put(PARAM_REFERENCE_PROJECT, mainProject);
-                }
-
-                IProject testProject = createEclipseProject(
-                        new SubProgressMonitor(monitor, 50),
-                        testData.getProject(),
-                        testData.getDescription(),
-                        parameters,
-                        testData.getDictionary(),
-                        null,
-                        isAndroidProject);
-                if (testProject != null) {
-                    final IJavaProject javaProject = JavaCore.create(testProject);
-                    Display.getDefault().syncExec(new WorksetAdder(javaProject,
-                            mValues.workingSets));
-                }
-            }
-
-            if (importData != null) {
-                for (final ProjectInfo data : importData) {
-                    ProjectPopulator projectPopulator = null;
-                    if (mValues.copyIntoWorkspace) {
-                        projectPopulator = new ProjectPopulator() {
-                            @Override
-                            public void populate(IProject project) {
-                                // Copy
-                                IFileSystem fileSystem = EFS.getLocalFileSystem();
-                                File source = (File) data.getParameters().get(PARAM_SOURCE);
-                                IFileStore sourceDir = new ReadWriteFileStore(
-                                        fileSystem.getStore(source.toURI()));
-                                IFileStore destDir = new ReadWriteFileStore(
-                                        fileSystem.getStore(AdtUtils.getAbsolutePath(project)));
-                                try {
-                                    sourceDir.copy(destDir, EFS.OVERWRITE, null);
-                                } catch (CoreException e) {
-                                    AdtPlugin.log(e, null);
-                                }
-                            }
-                        };
-                    }
-                    IProject project = createEclipseProject(
-                            new SubProgressMonitor(monitor, 50),
-                            data.getProject(),
-                            data.getDescription(),
-                            data.getParameters(),
-                            data.getDictionary(),
-                            projectPopulator,
-                            isAndroidProject);
-                    if (project != null) {
-                        final IJavaProject javaProject = JavaCore.create(project);
-                        Display.getDefault().syncExec(new WorksetAdder(javaProject,
-                                mValues.workingSets));
-                        ProjectHelper.enforcePreferredCompilerCompliance(javaProject);
-                    }
-                }
-            }
-        } catch (CoreException e) {
-            throw new InvocationTargetException(e);
-        } catch (IOException e) {
-            throw new InvocationTargetException(e);
-        } catch (StreamException e) {
-            throw new InvocationTargetException(e);
-        } finally {
-            monitor.done();
-        }
-    }
-
-    /** Handler which can write contents into a project */
-    public interface ProjectPopulator {
-        /**
-         * Add contents into the given project
-         *
-         * @param project the project to write into
-         * @throws InvocationTargetException if anything goes wrong
-         */
-        public void populate(IProject project) throws InvocationTargetException;
-    }
-
-    /**
-     * Creates the actual project, sets its nature and adds the required folders
-     * and files to it. This is run asynchronously in a different thread.
-     *
-     * @param monitor An existing monitor.
-     * @param project The project to create.
-     * @param description A description of the project.
-     * @param parameters Template parameters.
-     * @param dictionary String definition.
-     * @param isAndroidProject true if the project is to be set up as a full Android project; false
-     * for a plain Java project.
-     * @return The project newly created
-     * @throws StreamException
-     */
-    private IProject createEclipseProject(
-            @NonNull IProgressMonitor monitor,
-            @NonNull IProject project,
-            @NonNull IProjectDescription description,
-            @NonNull Map<String, Object> parameters,
-            @Nullable Map<String, String> dictionary,
-            @Nullable ProjectPopulator projectPopulator,
-            boolean isAndroidProject)
-                throws CoreException, IOException, StreamException {
-
-        // get the project target
-        IAndroidTarget target = (IAndroidTarget) parameters.get(PARAM_SDK_TARGET);
-        boolean legacy = isAndroidProject && target.getVersion().getApiLevel() < 4;
-
-        // Create project and open it
-        project.create(description, new SubProgressMonitor(monitor, 10));
-        if (monitor.isCanceled()) throw new OperationCanceledException();
-
-        project.open(IResource.BACKGROUND_REFRESH, new SubProgressMonitor(monitor, 10));
-
-        // Add the Java and android nature to the project
-        AndroidNature.setupProjectNatures(project, monitor, isAndroidProject);
-
-        // Create folders in the project if they don't already exist
-        addDefaultDirectories(project, AdtConstants.WS_ROOT, DEFAULT_DIRECTORIES, monitor);
-        String[] sourceFolders;
-        if (isAndroidProject) {
-            sourceFolders = new String[] {
-                    (String) parameters.get(PARAM_SRC_FOLDER),
-                    GEN_SRC_DIRECTORY
-                };
-        } else {
-            sourceFolders = new String[] {
-                    (String) parameters.get(PARAM_SRC_FOLDER)
-                };
-        }
-        addDefaultDirectories(project, AdtConstants.WS_ROOT, sourceFolders, monitor);
-
-        // Create the resource folders in the project if they don't already exist.
-        if (legacy) {
-            addDefaultDirectories(project, RES_DIRECTORY, RES_DIRECTORIES, monitor);
-        } else {
-            addDefaultDirectories(project, RES_DIRECTORY, RES_DENSITY_ENABLED_DIRECTORIES, monitor);
-        }
-
-        if (projectPopulator != null) {
-            try {
-                projectPopulator.populate(project);
-            } catch (InvocationTargetException ite) {
-                AdtPlugin.log(ite, null);
-            }
-        }
-
-        // Setup class path: mark folders as source folders
-        IJavaProject javaProject = JavaCore.create(project);
-        setupSourceFolders(javaProject, sourceFolders, monitor);
-
-        if (((Boolean) parameters.get(PARAM_IS_NEW_PROJECT)).booleanValue()) {
-            // Create files in the project if they don't already exist
-            addManifest(project, parameters, dictionary, monitor);
-
-            // add the default app icon
-            addIcon(project, legacy, monitor);
-
-            // Create the default package components
-            addSampleCode(project, sourceFolders[0], parameters, dictionary, monitor);
-
-            // add the string definition file if needed
-            if (dictionary != null && dictionary.size() > 0) {
-                addStringDictionaryFile(project, dictionary, monitor);
-            }
-
-            // add the default proguard config
-            File libFolder = new File((String) parameters.get(PARAM_SDK_TOOLS_DIR),
-                    SdkConstants.FD_LIB);
-            addLocalFile(project,
-                    new File(libFolder, SdkConstants.FN_PROJECT_PROGUARD_FILE),
-                    // Write ProGuard config files with the extension .pro which
-                    // is what is used in the ProGuard documentation and samples
-                    SdkConstants.FN_PROJECT_PROGUARD_FILE,
-                    monitor);
-
-            // Set output location
-            javaProject.setOutputLocation(project.getFolder(BIN_CLASSES_DIRECTORY).getFullPath(),
-                    monitor);
-        }
-
-        File sampleDir = (File) parameters.get(PARAM_SAMPLE_LOCATION);
-        if (sampleDir != null) {
-            // Copy project
-            copySampleCode(project, sampleDir, parameters, dictionary, monitor);
-        }
-
-        // Create the reference to the target project
-        if (parameters.containsKey(PARAM_REFERENCE_PROJECT)) {
-            IProject refProject = (IProject) parameters.get(PARAM_REFERENCE_PROJECT);
-            if (refProject != null) {
-                IProjectDescription desc = project.getDescription();
-
-                // Add out reference to the existing project reference.
-                // We just created a project with no references so we don't need to expand
-                // the currently-empty current list.
-                desc.setReferencedProjects(new IProject[] { refProject });
-
-                project.setDescription(desc, IResource.KEEP_HISTORY,
-                        new SubProgressMonitor(monitor, 10));
-
-                IClasspathEntry entry = JavaCore.newProjectEntry(
-                        refProject.getFullPath(), //path
-                        new IAccessRule[0], //accessRules
-                        false, //combineAccessRules
-                        new IClasspathAttribute[0], //extraAttributes
-                        false //isExported
-
-                );
-                ProjectHelper.addEntryToClasspath(javaProject, entry);
-            }
-        }
-
-        if (isAndroidProject) {
-            Sdk.getCurrent().initProject(project, target);
-        }
-
-        // Fix the project to make sure all properties are as expected.
-        // Necessary for existing projects and good for new ones to.
-        ProjectHelper.fixProject(project);
-
-        Boolean isLibraryProject = (Boolean) parameters.get(PARAM_IS_LIBRARY);
-        if (isLibraryProject != null && isLibraryProject.booleanValue()
-                && Sdk.getCurrent() != null && project.isOpen()) {
-            ProjectState state = Sdk.getProjectState(project);
-            if (state != null) {
-                // make a working copy of the properties
-                ProjectPropertiesWorkingCopy properties =
-                        state.getProperties().makeWorkingCopy();
-
-                properties.setProperty(PROPERTY_LIBRARY, Boolean.TRUE.toString());
-                try {
-                    properties.save();
-                    IResource projectProp = project.findMember(FN_PROJECT_PROPERTIES);
-                    if (projectProp != null) {
-                        projectProp.refreshLocal(DEPTH_ZERO, new NullProgressMonitor());
-                    }
-                } catch (Exception e) {
-                    String msg = String.format(
-                            "Failed to save %1$s for project %2$s",
-                            SdkConstants.FN_PROJECT_PROPERTIES, project.getName());
-                    AdtPlugin.log(e, msg);
-                }
-            }
-        }
-
-        return project;
-    }
-
-    /**
-     * Creates a new project
-     *
-     * @param monitor An existing monitor.
-     * @param project The project to create.
-     * @param target the build target to associate with the project
-     * @param projectPopulator a handler for writing the template contents
-     * @param isLibrary whether this project should be marked as a library project
-     * @param projectLocation the location to write the project into
-     * @param workingSets Eclipse working sets, if any, to add the project to
-     * @throws CoreException if anything goes wrong
-     */
-    public static void create(
-            @NonNull IProgressMonitor monitor,
-            @NonNull final IProject project,
-            @NonNull IAndroidTarget target,
-            @Nullable final ProjectPopulator projectPopulator,
-            boolean isLibrary,
-            @NonNull String projectLocation,
-            @NonNull final IWorkingSet[] workingSets)
-                throws CoreException {
-        final NewProjectCreator creator = new NewProjectCreator(null, null);
-
-        final Map<String, String> dictionary = null;
-        final Map<String, Object> parameters = new HashMap<String, Object>();
-        parameters.put(PARAM_SDK_TARGET, target);
-        parameters.put(PARAM_SRC_FOLDER, SdkConstants.FD_SOURCES);
-        parameters.put(PARAM_IS_NEW_PROJECT, false);
-        parameters.put(PARAM_SAMPLE_LOCATION, null);
-        parameters.put(PARAM_IS_LIBRARY, isLibrary);
-
-        IWorkspace workspace = ResourcesPlugin.getWorkspace();
-        final IProjectDescription description = workspace.newProjectDescription(project.getName());
-
-        if (projectLocation != null) {
-            IPath path = new Path(projectLocation);
-            IPath parent = new Path(path.toFile().getParent());
-            IPath workspaceLocation = Platform.getLocation();
-            if (!workspaceLocation.equals(parent)) {
-                description.setLocation(path);
-            }
-        }
-
-        IWorkspaceRunnable workspaceRunnable = new IWorkspaceRunnable() {
-            @Override
-            public void run(IProgressMonitor submonitor) throws CoreException {
-                try {
-                    creator.createEclipseProject(submonitor, project, description, parameters,
-                            dictionary, projectPopulator, true);
-                } catch (IOException e) {
-                    throw new CoreException(new Status(IStatus.ERROR, AdtPlugin.PLUGIN_ID,
-                            "Unexpected error while creating project", e));
-                } catch (StreamException e) {
-                    throw new CoreException(new Status(IStatus.ERROR, AdtPlugin.PLUGIN_ID,
-                            "Unexpected error while creating project", e));
-                }
-                if (workingSets != null && workingSets.length > 0) {
-                    IJavaProject javaProject = BaseProjectHelper.getJavaProject(project);
-                    if (javaProject != null) {
-                        Display.getDefault().syncExec(new WorksetAdder(javaProject,
-                                workingSets));
-                    }
-                }
-            }
-        };
-
-        ResourcesPlugin.getWorkspace().run(workspaceRunnable, monitor);
-    }
-
-    /**
-     * Adds default directories to the project.
-     *
-     * @param project The Java Project to update.
-     * @param parentFolder The path of the parent folder. Must end with a
-     *        separator.
-     * @param folders Folders to be added.
-     * @param monitor An existing monitor.
-     * @throws CoreException if the method fails to create the directories in
-     *         the project.
-     */
-    private void addDefaultDirectories(IProject project, String parentFolder,
-            String[] folders, IProgressMonitor monitor) throws CoreException {
-        for (String name : folders) {
-            if (name.length() > 0) {
-                IFolder folder = project.getFolder(parentFolder + name);
-                if (!folder.exists()) {
-                    folder.create(true /* force */, true /* local */,
-                            new SubProgressMonitor(monitor, 10));
-                }
-            }
-        }
-    }
-
-    /**
-     * Adds the manifest to the project.
-     *
-     * @param project The Java Project to update.
-     * @param parameters Template Parameters.
-     * @param dictionary String List to be added to a string definition
-     *        file. This map will be filled by this method.
-     * @param monitor An existing monitor.
-     * @throws CoreException if the method fails to update the project.
-     * @throws IOException if the method fails to create the files in the
-     *         project.
-     */
-    private void addManifest(IProject project, Map<String, Object> parameters,
-            Map<String, String> dictionary, IProgressMonitor monitor)
-            throws CoreException, IOException {
-
-        // get IFile to the manifest and check if it's not already there.
-        IFile file = project.getFile(SdkConstants.FN_ANDROID_MANIFEST_XML);
-        if (!file.exists()) {
-
-            // Read manifest template
-            String manifestTemplate = AdtPlugin.readEmbeddedTextFile(TEMPLATE_MANIFEST);
-
-            // Replace all keyword parameters
-            manifestTemplate = replaceParameters(manifestTemplate, parameters);
-
-            if (manifestTemplate == null) {
-                // Inform the user there will be not manifest.
-                AdtPlugin.logAndPrintError(null, "Create Project" /*TAG*/,
-                        "Failed to generate the Android manifest. Missing template %s",
-                        TEMPLATE_MANIFEST);
-                // Abort now, there's no need to continue
-                return;
-            }
-
-            if (parameters.containsKey(PARAM_ACTIVITY)) {
-                // now get the activity template
-                String activityTemplate = AdtPlugin.readEmbeddedTextFile(TEMPLATE_ACTIVITIES);
-
-                // If the activity name doesn't contain any dot, it's in the form
-                // "ClassName" and we need to expand it to ".ClassName" in the XML.
-                String name = (String) parameters.get(PARAM_ACTIVITY);
-                if (name.indexOf('.') == -1) {
-                    // Duplicate the parameters map to avoid changing the caller
-                    parameters = new HashMap<String, Object>(parameters);
-                    parameters.put(PARAM_ACTIVITY, "." + name); //$NON-NLS-1$
-                }
-
-                // Replace all keyword parameters to make main activity.
-                String activities = replaceParameters(activityTemplate, parameters);
-
-                // set the intent.
-                String intent = AdtPlugin.readEmbeddedTextFile(TEMPLATE_INTENT_LAUNCHER);
-
-                if (activities != null) {
-                    if (intent != null) {
-                        // set the intent to the main activity
-                        activities = activities.replaceAll(PH_INTENT_FILTERS, intent);
-                    }
-
-                    // set the activity(ies) in the manifest
-                    manifestTemplate = manifestTemplate.replaceAll(PH_ACTIVITIES, activities);
-                }
-            } else {
-                // remove the activity(ies) from the manifest
-                manifestTemplate = manifestTemplate.replaceAll(PH_ACTIVITIES, "");  //$NON-NLS-1$
-            }
-
-            // Handle the case of the test projects
-            if (parameters.containsKey(PARAM_TEST_TARGET_PACKAGE)) {
-                // Set the uses-library needed by the test project
-                String usesLibrary = AdtPlugin.readEmbeddedTextFile(TEMPLATE_TEST_USES_LIBRARY);
-                if (usesLibrary != null) {
-                    manifestTemplate = manifestTemplate.replaceAll(
-                            PH_TEST_USES_LIBRARY, usesLibrary);
-                }
-
-                // Set the instrumentation element needed by the test project
-                String instru = AdtPlugin.readEmbeddedTextFile(TEMPLATE_TEST_INSTRUMENTATION);
-                if (instru != null) {
-                    manifestTemplate = manifestTemplate.replaceAll(
-                            PH_TEST_INSTRUMENTATION, instru);
-                }
-
-                // Replace PARAM_TEST_TARGET_PACKAGE itself now
-                manifestTemplate = replaceParameters(manifestTemplate, parameters);
-
-            } else {
-                // remove the unused entries
-                manifestTemplate = manifestTemplate.replaceAll(PH_TEST_USES_LIBRARY, "");     //$NON-NLS-1$
-                manifestTemplate = manifestTemplate.replaceAll(PH_TEST_INSTRUMENTATION, "");  //$NON-NLS-1$
-            }
-
-            String minSdkVersion = (String) parameters.get(PARAM_MIN_SDK_VERSION);
-            if (minSdkVersion != null && minSdkVersion.length() > 0) {
-                String usesSdkTemplate = AdtPlugin.readEmbeddedTextFile(TEMPLATE_USES_SDK);
-                if (usesSdkTemplate != null) {
-                    String usesSdk = replaceParameters(usesSdkTemplate, parameters);
-                    manifestTemplate = manifestTemplate.replaceAll(PH_USES_SDK, usesSdk);
-                }
-            } else {
-                manifestTemplate = manifestTemplate.replaceAll(PH_USES_SDK, "");
-            }
-
-            // Reformat the file according to the user's formatting settings
-            manifestTemplate = reformat(XmlFormatStyle.MANIFEST, manifestTemplate);
-
-            // Save in the project as UTF-8
-            InputStream stream = new ByteArrayInputStream(
-                    manifestTemplate.getBytes("UTF-8")); //$NON-NLS-1$
-            file.create(stream, false /* force */, new SubProgressMonitor(monitor, 10));
-        }
-    }
-
-    /**
-     * Adds the string resource file.
-     *
-     * @param project The Java Project to update.
-     * @param strings The list of strings to be added to the string file.
-     * @param monitor An existing monitor.
-     * @throws CoreException if the method fails to update the project.
-     * @throws IOException if the method fails to create the files in the
-     *         project.
-     */
-    private void addStringDictionaryFile(IProject project,
-            Map<String, String> strings, IProgressMonitor monitor)
-            throws CoreException, IOException {
-
-        // create the IFile object and check if the file doesn't already exist.
-        IFile file = project.getFile(RES_DIRECTORY + AdtConstants.WS_SEP
-                                     + VALUES_DIRECTORY + AdtConstants.WS_SEP + STRINGS_FILE);
-        if (!file.exists()) {
-            // get the Strings.xml template
-            String stringDefinitionTemplate = AdtPlugin.readEmbeddedTextFile(TEMPLATE_STRINGS);
-
-            // get the template for one string
-            String stringTemplate = AdtPlugin.readEmbeddedTextFile(TEMPLATE_STRING);
-
-            // get all the string names
-            Set<String> stringNames = strings.keySet();
-
-            // loop on it and create the string definitions
-            StringBuilder stringNodes = new StringBuilder();
-            for (String key : stringNames) {
-                // get the value from the key
-                String value = strings.get(key);
-
-                // Escape values if necessary
-                value = ValueXmlHelper.escapeResourceString(value);
-
-                // place them in the template
-                String stringDef = stringTemplate.replace(PARAM_STRING_NAME, key);
-                stringDef = stringDef.replace(PARAM_STRING_CONTENT, value);
-
-                // append to the other string
-                if (stringNodes.length() > 0) {
-                    stringNodes.append('\n');
-                }
-                stringNodes.append(stringDef);
-            }
-
-            // put the string nodes in the Strings.xml template
-            stringDefinitionTemplate = stringDefinitionTemplate.replace(PH_STRINGS,
-                                                                        stringNodes.toString());
-
-            // reformat the file according to the user's formatting settings
-            stringDefinitionTemplate = reformat(XmlFormatStyle.RESOURCE, stringDefinitionTemplate);
-
-            // write the file as UTF-8
-            InputStream stream = new ByteArrayInputStream(
-                    stringDefinitionTemplate.getBytes("UTF-8")); //$NON-NLS-1$
-            file.create(stream, false /* force */, new SubProgressMonitor(monitor, 10));
-        }
-    }
-
-    /** Reformats the given contents with the current formatting settings */
-    private String reformat(XmlFormatStyle style, String contents) {
-        if (AdtPrefs.getPrefs().getUseCustomXmlFormatter()) {
-            EclipseXmlFormatPreferences formatPrefs = EclipseXmlFormatPreferences.create();
-            return EclipseXmlPrettyPrinter.prettyPrint(contents, formatPrefs, style,
-                    null /*lineSeparator*/);
-        } else {
-            return contents;
-        }
-    }
-
-    /**
-     * Adds default application icon to the project.
-     *
-     * @param project The Java Project to update.
-     * @param legacy whether we're running in legacy mode (no density support)
-     * @param monitor An existing monitor.
-     * @throws CoreException if the method fails to update the project.
-     */
-    private void addIcon(IProject project, boolean legacy, IProgressMonitor monitor)
-            throws CoreException {
-        if (legacy) { // density support
-            // do medium density icon only, in the default drawable folder.
-            IFile file = project.getFile(RES_DIRECTORY + AdtConstants.WS_SEP
-                    + DRAWABLE_DIRECTORY + AdtConstants.WS_SEP + PROJECT_ICON);
-            if (!file.exists()) {
-                addFile(file, AdtPlugin.readEmbeddedFile(TEMPLATES_DIRECTORY + ICON_MDPI), monitor);
-            }
-        } else {
-            // do all 4 icons.
-            IFile file;
-
-            // extra high density
-            file = project.getFile(RES_DIRECTORY + AdtConstants.WS_SEP
-                    + DRAWABLE_XHDPI_DIRECTORY + AdtConstants.WS_SEP + PROJECT_ICON);
-            if (!file.exists()) {
-                addFile(file, AdtPlugin.readEmbeddedFile(TEMPLATES_DIRECTORY + ICON_XHDPI), monitor);
-            }
-
-            // high density
-            file = project.getFile(RES_DIRECTORY + AdtConstants.WS_SEP
-                    + DRAWABLE_HDPI_DIRECTORY + AdtConstants.WS_SEP + PROJECT_ICON);
-            if (!file.exists()) {
-                addFile(file, AdtPlugin.readEmbeddedFile(TEMPLATES_DIRECTORY + ICON_HDPI), monitor);
-            }
-
-            // medium density
-            file = project.getFile(RES_DIRECTORY + AdtConstants.WS_SEP
-                    + DRAWABLE_MDPI_DIRECTORY + AdtConstants.WS_SEP + PROJECT_ICON);
-            if (!file.exists()) {
-                addFile(file, AdtPlugin.readEmbeddedFile(TEMPLATES_DIRECTORY + ICON_MDPI), monitor);
-            }
-
-            // low density
-            file = project.getFile(RES_DIRECTORY + AdtConstants.WS_SEP
-                    + DRAWABLE_LDPI_DIRECTORY + AdtConstants.WS_SEP + PROJECT_ICON);
-            if (!file.exists()) {
-                addFile(file, AdtPlugin.readEmbeddedFile(TEMPLATES_DIRECTORY + ICON_LDPI), monitor);
-            }
-        }
-    }
-
-    /**
-     * Creates a file from a data source.
-     * @param dest the file to write
-     * @param source the content of the file.
-     * @param monitor the progress monitor
-     * @throws CoreException
-     */
-    private void addFile(IFile dest, byte[] source, IProgressMonitor monitor) throws CoreException {
-        if (source != null) {
-            // Save in the project
-            InputStream stream = new ByteArrayInputStream(source);
-            dest.create(stream, false /* force */, new SubProgressMonitor(monitor, 10));
-        }
-    }
-
-    /**
-     * Creates the package folder and copies the sample code in the project.
-     *
-     * @param project The Java Project to update.
-     * @param parameters Template Parameters.
-     * @param dictionary String List to be added to a string definition
-     *        file. This map will be filled by this method.
-     * @param monitor An existing monitor.
-     * @throws CoreException if the method fails to update the project.
-     * @throws IOException if the method fails to create the files in the
-     *         project.
-     */
-    private void addSampleCode(IProject project, String sourceFolder,
-            Map<String, Object> parameters, Map<String, String> dictionary,
-            IProgressMonitor monitor) throws CoreException, IOException {
-        // create the java package directories.
-        IFolder pkgFolder = project.getFolder(sourceFolder);
-        String packageName = (String) parameters.get(PARAM_PACKAGE);
-
-        // The PARAM_ACTIVITY key will be absent if no activity should be created,
-        // in which case activityName will be null.
-        String activityName = (String) parameters.get(PARAM_ACTIVITY);
-
-        Map<String, Object> java_activity_parameters = new HashMap<String, Object>(parameters);
-        java_activity_parameters.put(PARAM_IMPORT_RESOURCE_CLASS, "");  //$NON-NLS-1$
-
-        if (activityName != null) {
-
-            String resourcePackageClass = null;
-
-            // An activity name can be of the form ".package.Class", ".Class" or FQDN.
-            // The initial dot is ignored, as it is always added later in the templates.
-            int lastDotIndex = activityName.lastIndexOf('.');
-
-            if (lastDotIndex != -1) {
-
-                // Resource class
-                if (lastDotIndex > 0) {
-                    resourcePackageClass = packageName + '.' + SdkConstants.FN_RESOURCE_BASE;
-                }
-
-                // Package name
-                if (activityName.startsWith(".")) {  //$NON-NLS-1$
-                    packageName += activityName.substring(0, lastDotIndex);
-                } else {
-                    packageName = activityName.substring(0, lastDotIndex);
-                }
-
-                // Activity Class name
-                activityName = activityName.substring(lastDotIndex + 1);
-            }
-
-            java_activity_parameters.put(PARAM_ACTIVITY, activityName);
-            java_activity_parameters.put(PARAM_PACKAGE, packageName);
-            if (resourcePackageClass != null) {
-                String importResourceClass = "\nimport " + resourcePackageClass + ";";  //$NON-NLS-1$ // $NON-NLS-2$
-                java_activity_parameters.put(PARAM_IMPORT_RESOURCE_CLASS, importResourceClass);
-            }
-        }
-
-        String[] components = packageName.split(AdtConstants.RE_DOT);
-        for (String component : components) {
-            pkgFolder = pkgFolder.getFolder(component);
-            if (!pkgFolder.exists()) {
-                pkgFolder.create(true /* force */, true /* local */,
-                        new SubProgressMonitor(monitor, 10));
-            }
-        }
-
-        if (activityName != null) {
-            // create the main activity Java file
-            String activityJava = activityName + SdkConstants.DOT_JAVA;
-            IFile file = pkgFolder.getFile(activityJava);
-            if (!file.exists()) {
-                copyFile(JAVA_ACTIVITY_TEMPLATE, file, java_activity_parameters, monitor, false);
-            }
-
-            // create the layout file (if we're creating an
-            IFolder layoutfolder = project.getFolder(RES_DIRECTORY).getFolder(LAYOUT_DIRECTORY);
-            file = layoutfolder.getFile(MAIN_LAYOUT_XML);
-            if (!file.exists()) {
-                copyFile(LAYOUT_TEMPLATE, file, parameters, monitor, true);
-                dictionary.put(STRING_HELLO_WORLD, String.format("Hello World, %1$s!",
-                        activityName));
-            }
-        }
-    }
-
-    private void copySampleCode(IProject project, File sampleDir,
-            Map<String, Object> parameters, Map<String, String> dictionary,
-            IProgressMonitor monitor) throws CoreException {
-        // Copy the sampleDir into the project directory recursively
-        IFileSystem fileSystem = EFS.getLocalFileSystem();
-        IFileStore sourceDir = new ReadWriteFileStore(
-                                        fileSystem.getStore(sampleDir.toURI()));
-        IFileStore destDir   = new ReadWriteFileStore(
-                                        fileSystem.getStore(AdtUtils.getAbsolutePath(project)));
-        sourceDir.copy(destDir, EFS.OVERWRITE, null);
-    }
-
-    /**
-     * In a sample we never duplicate source files as read-only.
-     * This creates a store that read files attributes and doesn't set the r-o flag.
-     */
-    private static class ReadWriteFileStore extends FileStoreAdapter {
-
-        public ReadWriteFileStore(IFileStore store) {
-            super(store);
-        }
-
-        // Override when reading attributes
-        @Override
-        public IFileInfo fetchInfo(int options, IProgressMonitor monitor) throws CoreException {
-            IFileInfo info = super.fetchInfo(options, monitor);
-            info.setAttribute(EFS.ATTRIBUTE_READ_ONLY, false);
-            return info;
-        }
-
-        // Override when writing attributes
-        @Override
-        public void putInfo(IFileInfo info, int options, IProgressMonitor storeMonitor)
-                throws CoreException {
-            info.setAttribute(EFS.ATTRIBUTE_READ_ONLY, false);
-            super.putInfo(info, options, storeMonitor);
-        }
-
-        @Deprecated
-        @Override
-        public IFileStore getChild(IPath path) {
-            IFileStore child = super.getChild(path);
-            if (!(child instanceof ReadWriteFileStore)) {
-                child = new ReadWriteFileStore(child);
-            }
-            return child;
-        }
-
-        @Override
-        public IFileStore getChild(String name) {
-            return new ReadWriteFileStore(super.getChild(name));
-        }
-    }
-
-    /**
-     * Adds a file to the root of the project
-     * @param project the project to add the file to.
-     * @param destName the name to write the file as
-     * @param source the file to add. It'll keep the same filename once copied into the project.
-     * @param monitor the monitor to report progress to
-     * @throws FileNotFoundException if the file to be added does not exist
-     * @throws CoreException if writing the file does not work
-     */
-    public static void addLocalFile(IProject project, File source, String destName,
-            IProgressMonitor monitor) throws FileNotFoundException, CoreException {
-        IFile dest = project.getFile(destName);
-        if (dest.exists() == false) {
-            FileInputStream stream = new FileInputStream(source);
-            dest.create(stream, false /* force */, new SubProgressMonitor(monitor, 10));
-        }
-    }
-
-    /**
-     * Adds the given folder to the project's class path.
-     *
-     * @param javaProject The Java Project to update.
-     * @param sourceFolders Template Parameters.
-     * @param monitor An existing monitor.
-     * @throws JavaModelException if the classpath could not be set.
-     */
-    private void setupSourceFolders(IJavaProject javaProject, String[] sourceFolders,
-            IProgressMonitor monitor) throws JavaModelException {
-        IProject project = javaProject.getProject();
-
-        // get the list of entries.
-        IClasspathEntry[] entries = javaProject.getRawClasspath();
-
-        // remove the project as a source folder (This is the default)
-        entries = removeSourceClasspath(entries, project);
-
-        // add the source folders.
-        for (String sourceFolder : sourceFolders) {
-            IFolder srcFolder = project.getFolder(sourceFolder);
-
-            // remove it first in case.
-            entries = removeSourceClasspath(entries, srcFolder);
-            entries = ProjectHelper.addEntryToClasspath(entries,
-                    JavaCore.newSourceEntry(srcFolder.getFullPath()));
-        }
-
-        javaProject.setRawClasspath(entries, new SubProgressMonitor(monitor, 10));
-    }
-
-
-    /**
-     * Removes the corresponding source folder from the class path entries if
-     * found.
-     *
-     * @param entries The class path entries to read. A copy will be returned.
-     * @param folder The parent source folder to remove.
-     * @return A new class path entries array.
-     */
-    private IClasspathEntry[] removeSourceClasspath(IClasspathEntry[] entries, IContainer folder) {
-        if (folder == null) {
-            return entries;
-        }
-        IClasspathEntry source = JavaCore.newSourceEntry(folder.getFullPath());
-        int n = entries.length;
-        for (int i = n - 1; i >= 0; i--) {
-            if (entries[i].equals(source)) {
-                IClasspathEntry[] newEntries = new IClasspathEntry[n - 1];
-                if (i > 0) System.arraycopy(entries, 0, newEntries, 0, i);
-                if (i < n - 1) System.arraycopy(entries, i + 1, newEntries, i, n - i - 1);
-                n--;
-                entries = newEntries;
-            }
-        }
-        return entries;
-    }
-
-
-    /**
-     * Copies the given file from our resource folder to the new project.
-     * Expects the file to the US-ASCII or UTF-8 encoded.
-     *
-     * @throws CoreException from IFile if failing to create the new file.
-     * @throws MalformedURLException from URL if failing to interpret the URL.
-     * @throws FileNotFoundException from RandomAccessFile.
-     * @throws IOException from RandomAccessFile.length() if can't determine the
-     *         length.
-     */
-    private void copyFile(String resourceFilename, IFile destFile,
-            Map<String, Object> parameters, IProgressMonitor monitor, boolean reformat)
-            throws CoreException, IOException {
-
-        // Read existing file.
-        String template = AdtPlugin.readEmbeddedTextFile(
-                TEMPLATES_DIRECTORY + resourceFilename);
-
-        // Replace all keyword parameters
-        template = replaceParameters(template, parameters);
-
-        if (reformat) {
-            // Guess the formatting style based on the file location
-            XmlFormatStyle style = EclipseXmlPrettyPrinter
-                    .getForFile(destFile.getProjectRelativePath());
-            if (style != null) {
-                template = reformat(style, template);
-            }
-        }
-
-        // Save in the project as UTF-8
-        InputStream stream = new ByteArrayInputStream(template.getBytes("UTF-8")); //$NON-NLS-1$
-        destFile.create(stream, false /* force */, new SubProgressMonitor(monitor, 10));
-    }
-
-    /**
-     * Replaces placeholders found in a string with values.
-     *
-     * @param str the string to search for placeholders.
-     * @param parameters a map of <placeholder, Value> to search for in the string
-     * @return A new String object with the placeholder replaced by the values.
-     */
-    private String replaceParameters(String str, Map<String, Object> parameters) {
-
-        if (parameters == null) {
-            AdtPlugin.log(IStatus.ERROR,
-                    "NPW replace parameters: null parameter map. String: '%s'", str);  //$NON-NLS-1$
-            return str;
-        } else if (str == null) {
-            AdtPlugin.log(IStatus.ERROR,
-                    "NPW replace parameters: null template string");  //$NON-NLS-1$
-            return str;
-        }
-
-        for (Entry<String, Object> entry : parameters.entrySet()) {
-            if (entry != null && entry.getValue() instanceof String) {
-                Object value = entry.getValue();
-                if (value == null) {
-                    AdtPlugin.log(IStatus.ERROR,
-                    "NPW replace parameters: null value for key '%s' in template '%s'",  //$NON-NLS-1$
-                    entry.getKey(),
-                    str);
-                } else {
-                    str = str.replaceAll(entry.getKey(), (String) value);
-                }
-            }
-        }
-
-        return str;
-    }
-
-    private static class WorksetAdder implements Runnable {
-        private final IJavaProject mProject;
-        private final IWorkingSet[] mWorkingSets;
-
-        private WorksetAdder(IJavaProject project, IWorkingSet[] workingSets) {
-            mProject = project;
-            mWorkingSets = workingSets;
-        }
-
-        @Override
-        public void run() {
-            if (mWorkingSets.length > 0 && mProject != null
-                    && mProject.exists()) {
-                PlatformUI.getWorkbench().getWorkingSetManager()
-                        .addToWorkingSets(mProject, mWorkingSets);
-            }
-        }
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/newproject/NewProjectWizard.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/newproject/NewProjectWizard.java
deleted file mode 100644
index ff03b33..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/newproject/NewProjectWizard.java
+++ /dev/null
@@ -1,181 +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.eclipse.adt.internal.wizards.newproject;
-
-import static com.android.SdkConstants.FN_PROJECT_PROGUARD_FILE;
-import static com.android.SdkConstants.OS_SDK_TOOLS_LIB_FOLDER;
-
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.ide.eclipse.adt.AdtUtils;
-import com.android.ide.eclipse.adt.internal.wizards.newproject.NewProjectWizardState.Mode;
-
-import org.eclipse.jdt.ui.actions.OpenJavaPerspectiveAction;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.wizard.IWizardPage;
-import org.eclipse.jface.wizard.Wizard;
-import org.eclipse.ui.INewWizard;
-import org.eclipse.ui.IWorkbench;
-
-import java.io.File;
-
-
-/**
- * A "New Android Project" Wizard.
- * <p/>
- * Note: this class is public so that it can be accessed from unit tests.
- * It is however an internal class. Its API may change without notice.
- * It should semantically be considered as a private final class.
- * <p/>
- * Do not derive from this class.
- */
-public class NewProjectWizard extends Wizard implements INewWizard {
-    private static final String PROJECT_LOGO_LARGE = "icons/android-64.png"; //$NON-NLS-1$
-
-    private NewProjectWizardState mValues;
-    private ProjectNamePage mNamePage;
-    private SdkSelectionPage mSdkPage;
-    private SampleSelectionPage mSamplePage;
-    private ApplicationInfoPage mPropertiesPage;
-    private final Mode mMode;
-    private IStructuredSelection mSelection;
-
-    /** Constructs a new wizard default project wizard */
-    public NewProjectWizard() {
-        this(Mode.ANY);
-    }
-
-    protected NewProjectWizard(Mode mode) {
-        mMode = mode;
-        switch (mMode) {
-            case SAMPLE:
-                setWindowTitle("New Android Sample Project");
-                break;
-            case TEST:
-                setWindowTitle("New Android Test Project");
-                break;
-            default:
-                setWindowTitle("New Android Project");
-                break;
-        }
-    }
-
-    @Override
-    public void addPages() {
-        mValues = new NewProjectWizardState(mMode);
-
-        if (mMode != Mode.SAMPLE) {
-            mNamePage = new ProjectNamePage(mValues);
-
-            if (mSelection != null) {
-                mNamePage.init(mSelection, AdtUtils.getActivePart());
-            }
-
-            addPage(mNamePage);
-        }
-
-        if (mMode == Mode.TEST) {
-            addPage(new TestTargetPage(mValues));
-        }
-
-        mSdkPage = new SdkSelectionPage(mValues);
-        addPage(mSdkPage);
-
-        if (mMode != Mode.TEST) {
-            // Sample projects can be created when entering the new/existing wizard, or
-            // the sample wizard
-            mSamplePage = new SampleSelectionPage(mValues);
-            addPage(mSamplePage);
-        }
-
-        if (mMode != Mode.SAMPLE) {
-            // Project properties are entered in all project types except sample projects
-            mPropertiesPage = new ApplicationInfoPage(mValues);
-            addPage(mPropertiesPage);
-        }
-    }
-
-    @Override
-    public void init(IWorkbench workbench, IStructuredSelection selection) {
-        mSelection = selection;
-
-        setHelpAvailable(false); // TODO have help
-        ImageDescriptor desc = AdtPlugin.getImageDescriptor(PROJECT_LOGO_LARGE);
-        setDefaultPageImageDescriptor(desc);
-
-        // Trigger a check to see if the SDK needs to be reloaded (which will
-        // invoke onSdkLoaded asynchronously as needed).
-        AdtPlugin.getDefault().refreshSdk();
-    }
-
-    @Override
-    public boolean performFinish() {
-        File file = new File(AdtPlugin.getOsSdkFolder(), OS_SDK_TOOLS_LIB_FOLDER + File.separator
-                + FN_PROJECT_PROGUARD_FILE);
-        if (!file.exists()) {
-            AdtPlugin.displayError("Tools Out of Date?",
-            String.format("It looks like you do not have the latest version of the "
-                    + "SDK Tools installed. Make sure you update via the SDK Manager "
-                    + "first. (Could not find %1$s)", file.getPath()));
-            return false;
-        }
-
-        NewProjectCreator creator = new NewProjectCreator(mValues, getContainer());
-        if (!(creator.createAndroidProjects())) {
-            return false;
-        }
-
-        // Open the default Java Perspective
-        OpenJavaPerspectiveAction action = new OpenJavaPerspectiveAction();
-        action.run();
-        return true;
-    }
-
-    @Override
-    public IWizardPage getNextPage(IWizardPage page) {
-        if (page == mNamePage) {
-            // Skip the test target selection page unless creating a test project
-            if (mValues.mode != Mode.TEST) {
-                return mSdkPage;
-            }
-        } else if (page == mSdkPage) {
-            if (mValues.mode == Mode.SAMPLE) {
-                return mSamplePage;
-            } else if (mValues.mode != Mode.TEST) {
-                return mPropertiesPage;
-            } else {
-                // Done with wizard when creating from existing or creating test projects
-                return null;
-            }
-        } else if (page == mSamplePage) {
-            // Nothing more to be entered for samples
-            return null;
-        }
-
-        return super.getNextPage(page);
-    }
-
-    /**
-     * Returns the package name currently set by the wizard
-     *
-     * @return the current package name, or null
-     */
-    public String getPackageName() {
-        return mValues.packageName;
-    }
-
-    // TBD: Call setDialogSettings etc to store persistent state between wizard invocations.
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/newproject/NewProjectWizardState.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/newproject/NewProjectWizardState.java
deleted file mode 100644
index 06c0300..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/newproject/NewProjectWizardState.java
+++ /dev/null
@@ -1,412 +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.eclipse.adt.internal.wizards.newproject;
-
-import com.android.SdkConstants;
-import com.android.annotations.Nullable;
-import com.android.ide.common.xml.ManifestData;
-import com.android.ide.common.xml.ManifestData.Activity;
-import com.android.ide.eclipse.adt.AdtConstants;
-import com.android.ide.eclipse.adt.internal.project.AndroidManifestHelper;
-import com.android.ide.eclipse.adt.internal.sdk.Sdk;
-import com.android.sdklib.IAndroidTarget;
-import com.android.sdklib.internal.project.ProjectProperties;
-import com.android.sdklib.internal.project.ProjectProperties.PropertyType;
-import com.android.utils.Pair;
-import com.android.xml.AndroidManifest;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.ui.IWorkingSet;
-
-import java.io.File;
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * The {@link NewProjectWizardState} holds the state used by the various pages
- * in the {@link NewProjectWizard} and its variations, and it can also be used
- * to pass project information to the {@link NewProjectCreator}.
- */
-public class NewProjectWizardState {
-    /** The mode to run the wizard in: creating test, or sample, or plain project */
-    public Mode mode;
-
-    /**
-     * If true, the project should be created from an existing codebase (pointed
-     * to by the {@link #projectLocation} or in the case of sample projects, the
-     * {@link #chosenSample}. Otherwise, create a brand new project from scratch.
-     */
-    public boolean useExisting;
-
-    /**
-     * Whether new projects should be created into the default project location
-     * (e.g. in the Eclipse workspace) or not
-     */
-    public boolean useDefaultLocation = true;
-
-    /** The build target SDK */
-    public IAndroidTarget target;
-    /** True if the user has manually modified the target */
-    public boolean targetModifiedByUser;
-
-    /** The location to store projects into */
-    public File projectLocation = new File(Platform.getLocation().toOSString());
-    /** True if the project location name has been manually edited by the user */
-    public boolean projectLocationModifiedByUser;
-
-    /** The name of the project */
-    public String projectName = ""; //$NON-NLS-1$
-    /** True if the project name has been manually edited by the user */
-    public boolean projectNameModifiedByUser;
-
-    /** The application name */
-    public String applicationName;
-    /** True if the application name has been manually edited by the user */
-    public boolean applicationNameModifiedByUser;
-
-    /** The package path */
-    public String packageName;
-    /** True if the package name has been manually edited by the user */
-    public boolean packageNameModifiedByUser;
-
-    /** True if a new activity should be created */
-    public boolean createActivity;
-
-    /** The name of the new activity to be created */
-    public String activityName;
-    /** True if the activity name has been manually edited by the user */
-    public boolean activityNameModifiedByUser;
-
-    /** The minimum SDK version to use with the project (may be null or blank) */
-    public String minSdk;
-    /** True if the minimum SDK version has been manually edited by the user */
-    public boolean minSdkModifiedByUser;
-    /**
-     * A list of paths to each of the available samples for the current SDK.
-     * The pair is (String: sample display name => File: sample directory).
-     * Note we want a list, not a map since we might have duplicates.
-     * */
-    public List<Pair<String, File>> samples = new ArrayList<Pair<String, File>>();
-    /** Path to the currently chosen sample */
-    public File chosenSample;
-
-    /** The name of the source folder, relative to the project root */
-    public String sourceFolder = SdkConstants.FD_SOURCES;
-    /** The set of chosen working sets to use when creating the project */
-    public IWorkingSet[] workingSets = new IWorkingSet[0];
-
-    /**
-     * A reference to a different project that the current test project will be
-     * testing.
-     */
-    public IProject testedProject;
-    /**
-     * If true, this test project should be testing itself, otherwise it will be
-     * testing the project pointed to by {@link #testedProject}.
-     */
-    public boolean testingSelf;
-
-    // NOTE: These apply only to creating paired projects; when isTest is true
-    // we're using
-    // the normal fields above
-    /**
-     * If true, create a test project along with this plain project which will
-     * be testing the plain project. (This flag only applies when creating
-     * normal projects.)
-     */
-    public boolean createPairProject;
-    /**
-     * The application name of the test application (only applies when
-     * {@link #createPairProject} is true)
-     */
-    public String testApplicationName;
-    /**
-     * True if the testing application name has been modified by the user (only
-     * applies when {@link #createPairProject} is true)
-     */
-    public boolean testApplicationNameModified;
-    /**
-     * The package name of the test application (only applies when
-     * {@link #createPairProject} is true)
-     */
-    public String testPackageName;
-    /**
-     * True if the testing package name has been modified by the user (only
-     * applies when {@link #createPairProject} is true)
-     */
-    public boolean testPackageModified;
-    /**
-     * The project name of the test project (only applies when
-     * {@link #createPairProject} is true)
-     */
-    public String testProjectName;
-    /**
-     * True if the testing project name has been modified by the user (only
-     * applies when {@link #createPairProject} is true)
-     */
-    public boolean testProjectModified;
-    /** Package name of the tested app */
-    public String testTargetPackageName;
-
-    /**
-     * Copy project into workspace? This flag only applies when importing
-     * projects (creating projects from existing source)
-     */
-    public boolean copyIntoWorkspace;
-
-    /**
-     * List of projects to be imported. Null if not importing projects.
-     */
-    @Nullable
-    public List<ImportedProject> importProjects;
-
-    /**
-     * Creates a new {@link NewProjectWizardState}
-     *
-     * @param mode the mode to run the wizard in
-     */
-    public NewProjectWizardState(Mode mode) {
-        this.mode = mode;
-        if (mode == Mode.SAMPLE) {
-            useExisting = true;
-        } else if (mode == Mode.TEST) {
-            createActivity = false;
-        }
-    }
-
-    /**
-     * Extract information (package name, application name, minimum SDK etc) from
-     * the given Android project.
-     *
-     * @param path the path to the project to extract information from
-     */
-    public void extractFromAndroidManifest(Path path) {
-        String osPath = path.append(SdkConstants.FN_ANDROID_MANIFEST_XML).toOSString();
-        if (!(new File(osPath).exists())) {
-            return;
-        }
-
-        ManifestData manifestData = AndroidManifestHelper.parseForData(osPath);
-        if (manifestData == null) {
-            return;
-        }
-
-        String newPackageName = null;
-        Activity activity = null;
-        String newActivityName = null;
-        String minSdkVersion = null;
-        try {
-            newPackageName = manifestData.getPackage();
-            minSdkVersion = manifestData.getMinSdkVersionString();
-
-            // try to get the first launcher activity. If none, just take the first activity.
-            activity = manifestData.getLauncherActivity();
-            if (activity == null) {
-                Activity[] activities = manifestData.getActivities();
-                if (activities != null && activities.length > 0) {
-                    activity = activities[0];
-                }
-            }
-        } catch (Exception e) {
-            // ignore exceptions
-        }
-
-        if (newPackageName != null && newPackageName.length() > 0) {
-            packageName = newPackageName;
-        }
-
-        if (activity != null) {
-            newActivityName = AndroidManifest.extractActivityName(activity.getName(),
-                    newPackageName);
-        }
-
-        if (newActivityName != null && newActivityName.length() > 0) {
-            activityName = newActivityName;
-            // we are "importing" an existing activity, not creating a new one
-            createActivity = false;
-
-            // If project name and application names are empty, use the activity
-            // name as a default. If the activity name has dots, it's a part of a
-            // package specification and only the last identifier must be used.
-            if (newActivityName.indexOf('.') != -1) {
-                String[] ids = newActivityName.split(AdtConstants.RE_DOT);
-                newActivityName = ids[ids.length - 1];
-            }
-            if (projectName == null || projectName.length() == 0 ||
-                    !projectNameModifiedByUser) {
-                projectName = newActivityName;
-                projectNameModifiedByUser = false;
-            }
-            if (applicationName == null || applicationName.length() == 0 ||
-                    !applicationNameModifiedByUser) {
-                applicationNameModifiedByUser = false;
-                applicationName = newActivityName;
-            }
-        } else {
-            activityName = ""; //$NON-NLS-1$
-
-            // There is no activity name to use to fill in the project and application
-            // name. However if there's a package name, we can use this as a base.
-            if (newPackageName != null && newPackageName.length() > 0) {
-                // Package name is a java identifier, so it's most suitable for
-                // an application name.
-
-                if (applicationName == null || applicationName.length() == 0 ||
-                        !applicationNameModifiedByUser) {
-                    applicationName = newPackageName;
-                }
-
-                // For the project name, remove any dots
-                newPackageName = newPackageName.replace('.', '_');
-                if (projectName == null || projectName.length() == 0 ||
-                        !projectNameModifiedByUser) {
-                    projectName = newPackageName;
-                }
-
-            }
-        }
-
-        if (mode == Mode.ANY && useExisting) {
-            updateSdkTargetToMatchProject(path.toFile());
-        }
-
-        minSdk = minSdkVersion;
-        minSdkModifiedByUser = false;
-    }
-
-    /**
-     * Try to find an SDK Target that matches the current MinSdkVersion.
-     *
-     * There can be multiple targets with the same sdk api version, so don't change
-     * it if it's already at the right version. Otherwise pick the first target
-     * that matches.
-     */
-    public void updateSdkTargetToMatchMinSdkVersion() {
-        IAndroidTarget currentTarget = target;
-        if (currentTarget != null && currentTarget.getVersion().equals(minSdk)) {
-            return;
-        }
-
-        Sdk sdk = Sdk.getCurrent();
-        if (sdk != null) {
-            IAndroidTarget[] targets = sdk.getTargets();
-            for (IAndroidTarget t : targets) {
-                if (t.getVersion().equals(minSdk)) {
-                    target = t;
-                    return;
-                }
-            }
-        }
-    }
-
-    /**
-     * Updates the SDK to reflect the SDK required by the project at the given
-     * location
-     *
-     * @param location the location of the project
-     */
-    public void updateSdkTargetToMatchProject(File location) {
-        // Select the target matching the manifest's sdk or build properties, if any
-        IAndroidTarget foundTarget = null;
-        // This is the target currently in the UI
-        IAndroidTarget currentTarget = target;
-        String projectPath = location.getPath();
-
-        // If there's a current target defined, we do not allow to change it when
-        // operating in the create-from-sample mode -- since the available sample list
-        // is tied to the current target, so changing it would invalidate the project we're
-        // trying to load in the first place.
-        if (!targetModifiedByUser) {
-            ProjectProperties p = ProjectProperties.load(projectPath,
-                    PropertyType.PROJECT);
-            if (p != null) {
-                String v = p.getProperty(ProjectProperties.PROPERTY_TARGET);
-                IAndroidTarget desiredTarget = Sdk.getCurrent().getTargetFromHashString(v);
-                // We can change the current target if:
-                // - we found a new desired target
-                // - there is no current target
-                // - or the current target can't run the desired target
-                if (desiredTarget != null &&
-                        (currentTarget == null || !desiredTarget.canRunOn(currentTarget))) {
-                    foundTarget = desiredTarget;
-                }
-            }
-
-            Sdk sdk = Sdk.getCurrent();
-            IAndroidTarget[] targets = null;
-            if (sdk != null) {
-                targets = sdk.getTargets();
-            }
-            if (targets == null) {
-                targets = new IAndroidTarget[0];
-            }
-
-            if (foundTarget == null && minSdk != null) {
-                // Otherwise try to match the requested min-sdk-version if we find an
-                // exact match, regardless of the currently selected target.
-                for (IAndroidTarget existingTarget : targets) {
-                    if (existingTarget != null &&
-                            existingTarget.getVersion().equals(minSdk)) {
-                        foundTarget = existingTarget;
-                        break;
-                    }
-                }
-            }
-
-            if (foundTarget == null) {
-                // Or last attempt, try to match a sample project location and use it
-                // if we find an exact match, regardless of the currently selected target.
-                for (IAndroidTarget existingTarget : targets) {
-                    if (existingTarget != null &&
-                            projectPath.startsWith(existingTarget.getLocation())) {
-                        foundTarget = existingTarget;
-                        break;
-                    }
-                }
-            }
-        }
-
-        if (foundTarget != null) {
-            target = foundTarget;
-        }
-    }
-
-    /**
-     * Type of project being offered/created by the wizard
-     */
-    public enum Mode {
-        /** Create a sample project. Testing options are not presented. */
-        SAMPLE,
-
-        /**
-         * Create a test project, either testing itself or some other project.
-         * Note that even if in the {@link #ANY} mode, a test project can be
-         * created as a *paired* project with the main project, so this flag
-         * only means that we are creating *just* a test project
-         */
-        TEST,
-
-        /**
-         * Create an Android project, which can be a plain project, optionally
-         * with a paired test project, or a sample project (the first page
-         * contains toggles for choosing which
-         */
-        ANY;
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/newproject/NewSampleProjectWizard.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/newproject/NewSampleProjectWizard.java
deleted file mode 100644
index 6b6a4c2..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/newproject/NewSampleProjectWizard.java
+++ /dev/null
@@ -1,32 +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.eclipse.adt.internal.wizards.newproject;
-
-import com.android.ide.eclipse.adt.internal.wizards.newproject.NewProjectWizardState.Mode;
-
-/**
- * A "New Sample Android Project" Wizard.
- * <p/>
- * This displays the new project wizard pre-configured for samples only.
- */
-public class NewSampleProjectWizard extends NewProjectWizard {
-    /**
-     * Creates a new wizard for creating a sample Android project
-     */
-    public NewSampleProjectWizard() {
-        super(Mode.SAMPLE);
-    }
-}
\ No newline at end of file
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/newproject/NewTestProjectWizard.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/newproject/NewTestProjectWizard.java
deleted file mode 100644
index e0959f4..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/newproject/NewTestProjectWizard.java
+++ /dev/null
@@ -1,32 +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.eclipse.adt.internal.wizards.newproject;
-
-import com.android.ide.eclipse.adt.internal.wizards.newproject.NewProjectWizardState.Mode;
-
-/**
- * A "New Test Android Project" Wizard.
- * <p/>
- * This is really the {@link NewProjectWizard} that only displays the "test project" pages.
- */
-public class NewTestProjectWizard extends NewProjectWizard {
-    /**
-     * Creates a new wizard for creating an Android Test Project
-     */
-    public NewTestProjectWizard() {
-        super(Mode.TEST);
-    }
-}
\ No newline at end of file
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/newproject/ProjectNamePage.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/newproject/ProjectNamePage.java
deleted file mode 100644
index d04ea89..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/newproject/ProjectNamePage.java
+++ /dev/null
@@ -1,606 +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.eclipse.adt.internal.wizards.newproject;
-
-import static com.android.SdkConstants.FN_PROJECT_PROGUARD_FILE;
-import static com.android.SdkConstants.OS_SDK_TOOLS_LIB_FOLDER;
-import static com.android.ide.eclipse.adt.AdtUtils.capitalize;
-import static com.android.ide.eclipse.adt.internal.wizards.newproject.ApplicationInfoPage.ACTIVITY_NAME_SUFFIX;
-import static com.android.utils.SdkUtils.stripWhitespace;
-
-import com.android.SdkConstants;
-import com.android.ide.common.xml.ManifestData;
-import com.android.ide.common.xml.ManifestData.Activity;
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.ide.eclipse.adt.internal.VersionCheck;
-import com.android.ide.eclipse.adt.internal.project.AndroidManifestHelper;
-import com.android.ide.eclipse.adt.internal.wizards.newproject.NewProjectWizardState.Mode;
-
-import org.eclipse.core.filesystem.URIUtil;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IWorkspace;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.jface.dialogs.IMessageProvider;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.wizard.IWizardPage;
-import org.eclipse.jface.wizard.WizardPage;
-import org.eclipse.osgi.util.TextProcessor;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.DirectoryDialog;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.IWorkingSet;
-
-import java.io.File;
-import java.net.URI;
-import java.util.Locale;
-
-/**
- * Initial page shown when creating projects which asks for the project name,
- * the the location of the project, working sets, etc.
- */
-public class ProjectNamePage extends WizardPage implements SelectionListener, ModifyListener {
-    private final NewProjectWizardState mValues;
-    /** Flag used when setting button/text state manually to ignore listener updates */
-    private boolean mIgnore;
-    /** Last user-browsed location, static so that it be remembered for the whole session */
-    private static String sCustomLocationOsPath = "";  //$NON-NLS-1$
-    private static boolean sAutoComputeCustomLocation = true;
-
-    private Text mProjectNameText;
-    private Text mLocationText;
-    private Button mCreateSampleRadioButton;
-    private Button mCreateNewButton;
-    private Button mUseDefaultCheckBox;
-    private Button mBrowseButton;
-    private Label mLocationLabel;
-    private WorkingSetGroup mWorkingSetGroup;
-    /**
-     * Whether we've made sure the Tools are up to date (enough that all the
-     * resources required by the New Project wizard are present -- we don't
-     * necessarily check for newer versions than that here; that's done by
-     * {@link VersionCheck}, though that check doesn't <b>enforce</b> an update
-     * since it needs to allow the user to proceed to access the SDK manager
-     * etc.)
-     */
-    private boolean mCheckedSdkUptodate;
-
-    /**
-     * Create the wizard.
-     * @param values current wizard state
-     */
-    ProjectNamePage(NewProjectWizardState values) {
-        super("projectNamePage"); //$NON-NLS-1$
-        mValues = values;
-
-        setTitle("Create Android Project");
-        setDescription("Select project name and type of project");
-        mWorkingSetGroup = new WorkingSetGroup();
-        setWorkingSets(new IWorkingSet[0]);
-    }
-
-    void init(IStructuredSelection selection, IWorkbenchPart activePart) {
-        setWorkingSets(WorkingSetHelper.getSelectedWorkingSet(selection, activePart));
-    }
-
-    /**
-     * Create contents of the wizard.
-     * @param parent the parent to add the page to
-     */
-    @Override
-    public void createControl(Composite parent) {
-        Composite container = new Composite(parent, SWT.NULL);
-        container.setLayout(new GridLayout(3, false));
-
-        Label nameLabel = new Label(container, SWT.NONE);
-        nameLabel.setText("Project Name:");
-
-        mProjectNameText = new Text(container, SWT.BORDER);
-        mProjectNameText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 2, 1));
-        mProjectNameText.addModifyListener(this);
-
-        if (mValues.mode != Mode.TEST) {
-            mCreateNewButton = new Button(container, SWT.RADIO);
-            mCreateNewButton.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false, 3, 1));
-            mCreateNewButton.setText("Create new project in workspace");
-            mCreateNewButton.addSelectionListener(this);
-
-            // TBD: Should we hide this completely, and make samples something you only invoke
-            // from the "New Sample Project" wizard?
-            mCreateSampleRadioButton = new Button(container, SWT.RADIO);
-            mCreateSampleRadioButton.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false,
-                    3, 1));
-            mCreateSampleRadioButton.setText("Create project from existing sample");
-            mCreateSampleRadioButton.addSelectionListener(this);
-        }
-
-        Label separator = new Label(container, SWT.SEPARATOR | SWT.HORIZONTAL);
-        separator.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 3, 1));
-
-        mUseDefaultCheckBox = new Button(container, SWT.CHECK);
-        mUseDefaultCheckBox.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false, 3, 1));
-        mUseDefaultCheckBox.setText("Use default location");
-        mUseDefaultCheckBox.addSelectionListener(this);
-
-        mLocationLabel = new Label(container, SWT.NONE);
-        mLocationLabel.setText("Location:");
-
-        mLocationText = new Text(container, SWT.BORDER);
-        mLocationText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
-        mLocationText.addModifyListener(this);
-
-        mBrowseButton = new Button(container, SWT.NONE);
-        mBrowseButton.setText("Browse...");
-        mBrowseButton.addSelectionListener(this);
-
-        Composite group = mWorkingSetGroup.createControl(container);
-        group.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false, 3, 1));
-
-        setControl(container);
-    }
-
-    @Override
-    public void setVisible(boolean visible) {
-        super.setVisible(visible);
-
-        if (visible) {
-            try {
-                mIgnore = true;
-                if (mValues.projectName != null) {
-                        mProjectNameText.setText(mValues.projectName);
-                    mProjectNameText.setFocus();
-                }
-                if (mValues.mode == Mode.ANY || mValues.mode == Mode.TEST) {
-                    if (mValues.useExisting) {
-                        assert false; // This is now handled by the separate import wizard
-                    } else if (mCreateNewButton != null) {
-                        mCreateNewButton.setSelection(true);
-                    }
-                } else if (mValues.mode == Mode.SAMPLE) {
-                    mCreateSampleRadioButton.setSelection(true);
-                }
-                if (mValues.projectLocation != null) {
-                    mLocationText.setText(mValues.projectLocation.getPath());
-                }
-                mUseDefaultCheckBox.setSelection(mValues.useDefaultLocation);
-                updateLocationState();
-            } finally {
-                mIgnore = false;
-            }
-        }
-
-        validatePage();
-    }
-
-    @Override
-    public void modifyText(ModifyEvent e) {
-        if (mIgnore) {
-            return;
-        }
-
-        Object source = e.getSource();
-
-        if (source == mProjectNameText) {
-            onProjectFieldModified();
-            if (!mValues.useDefaultLocation && !mValues.projectLocationModifiedByUser) {
-                updateLocationPathField(null);
-            }
-        } else if (source == mLocationText) {
-            mValues.projectLocationModifiedByUser = true;
-            if (!mValues.useDefaultLocation) {
-                File f = new File(mLocationText.getText().trim());
-                mValues.projectLocation = f;
-                if (f.exists() && f.isDirectory() && !f.equals(mValues.projectLocation)) {
-                    updateLocationPathField(mValues.projectLocation.getPath());
-                }
-            }
-        }
-
-        validatePage();
-    }
-
-    private void onProjectFieldModified() {
-        mValues.projectName = mProjectNameText.getText().trim();
-        mValues.projectNameModifiedByUser = true;
-
-        if (!mValues.applicationNameModifiedByUser) {
-            mValues.applicationName = capitalize(mValues.projectName);
-            if (!mValues.testApplicationNameModified) {
-                mValues.testApplicationName =
-                        ApplicationInfoPage.suggestTestApplicationName(mValues.applicationName);
-            }
-        }
-        if (!mValues.activityNameModifiedByUser) {
-            String name = capitalize(mValues.projectName);
-            mValues.activityName = stripWhitespace(name) + ACTIVITY_NAME_SUFFIX;
-        }
-        if (!mValues.testProjectModified) {
-            mValues.testProjectName =
-                    ApplicationInfoPage.suggestTestProjectName(mValues.projectName);
-        }
-        if (!mValues.projectLocationModifiedByUser) {
-            updateLocationPathField(null);
-        }
-    }
-
-    @Override
-    public void widgetSelected(SelectionEvent e) {
-        if (mIgnore) {
-            return;
-        }
-
-        Object source = e.getSource();
-
-        if (source == mCreateNewButton && mCreateNewButton != null
-                && mCreateNewButton.getSelection()) {
-            mValues.useExisting = false;
-            if (mValues.mode == Mode.SAMPLE) {
-                // Only reset the mode if we're toggling from sample back to create new
-                // or create existing. We can only come to the sample state when we're in
-                // ANY mode. (In particular, we don't want to switch to ANY if you're
-                // in test mode.
-                mValues.mode = Mode.ANY;
-            }
-            updateLocationState();
-        } else if (source == mCreateSampleRadioButton && mCreateSampleRadioButton.getSelection()) {
-            mValues.useExisting = true;
-            mValues.useDefaultLocation = true;
-            if (!mUseDefaultCheckBox.getSelection()) {
-                try {
-                    mIgnore = true;
-                    mUseDefaultCheckBox.setSelection(true);
-                } finally {
-                    mIgnore = false;
-                }
-            }
-            mValues.mode = Mode.SAMPLE;
-            updateLocationState();
-        } else if (source == mUseDefaultCheckBox) {
-            mValues.useDefaultLocation = mUseDefaultCheckBox.getSelection();
-            updateLocationState();
-        } else if (source == mBrowseButton) {
-            onOpenDirectoryBrowser();
-        }
-
-        validatePage();
-    }
-
-   /**
-    * Enables or disable the location widgets depending on the user selection:
-    * the location path is enabled when using the "existing source" mode (i.e. not new project)
-    * or in new project mode with the "use default location" turned off.
-    */
-   private void updateLocationState() {
-       boolean isNewProject = !mValues.useExisting;
-       boolean isCreateFromSample = mValues.mode == Mode.SAMPLE;
-       boolean useDefault = mValues.useDefaultLocation && !isCreateFromSample;
-       boolean locationEnabled = (!isNewProject || !useDefault) && !isCreateFromSample;
-
-       mUseDefaultCheckBox.setEnabled(isNewProject);
-       mLocationLabel.setEnabled(locationEnabled);
-       mLocationText.setEnabled(locationEnabled);
-       mBrowseButton.setEnabled(locationEnabled);
-
-       updateLocationPathField(null);
-   }
-
-    /**
-     * Display a directory browser and update the location path field with the selected path
-     */
-    private void onOpenDirectoryBrowser() {
-
-        String existingDir = mLocationText.getText().trim();
-
-        // Disable the path if it doesn't exist
-        if (existingDir.length() == 0) {
-            existingDir = null;
-        } else {
-            File f = new File(existingDir);
-            if (!f.exists()) {
-                existingDir = null;
-            }
-        }
-
-        DirectoryDialog directoryDialog = new DirectoryDialog(mLocationText.getShell());
-        directoryDialog.setMessage("Browse for folder");
-        directoryDialog.setFilterPath(existingDir);
-        String dir = directoryDialog.open();
-
-        if (dir != null) {
-            updateLocationPathField(dir);
-            validatePage();
-        }
-    }
-
-    @Override
-    public void widgetDefaultSelected(SelectionEvent e) {
-    }
-
-    /**
-     * Returns the working sets to which the new project should be added.
-     *
-     * @return the selected working sets to which the new project should be added
-     */
-    private IWorkingSet[] getWorkingSets() {
-        return mWorkingSetGroup.getSelectedWorkingSets();
-    }
-
-    /**
-     * Sets the working sets to which the new project should be added.
-     *
-     * @param workingSets the initial selected working sets
-     */
-    private void setWorkingSets(IWorkingSet[] workingSets) {
-        assert workingSets != null;
-        mWorkingSetGroup.setWorkingSets(workingSets);
-    }
-
-    /**
-     * Updates the location directory path field.
-     * <br/>
-     * When custom user selection is enabled, use the absDir argument if not null and also
-     * save it internally. If absDir is null, restore the last saved absDir. This allows the
-     * user selection to be remembered when the user switches from default to custom.
-     * <br/>
-     * When custom user selection is disabled, use the workspace default location with the
-     * current project name. This does not change the internally cached absDir.
-     *
-     * @param absDir A new absolute directory path or null to use the default.
-     */
-    private void updateLocationPathField(String absDir) {
-        boolean isNewProject = !mValues.useExisting || mValues.mode == Mode.SAMPLE;
-        boolean useDefault = mValues.useDefaultLocation;
-        boolean customLocation = !isNewProject || !useDefault;
-
-        if (!mIgnore) {
-            try {
-                mIgnore = true;
-                if (customLocation) {
-                    if (absDir != null) {
-                        // We get here if the user selected a directory with the "Browse" button.
-                        // Disable auto-compute of the custom location unless the user selected
-                        // the exact same path.
-                        sAutoComputeCustomLocation = sAutoComputeCustomLocation &&
-                                                     absDir.equals(sCustomLocationOsPath);
-                        sCustomLocationOsPath = TextProcessor.process(absDir);
-                    } else  if (sAutoComputeCustomLocation ||
-                                (!isNewProject && !new File(sCustomLocationOsPath).isDirectory())) {
-                        // As a default import location, just suggest the home directory; the user
-                        // needs to point to a project to import.
-                        // TODO: Open file chooser automatically?
-                        sCustomLocationOsPath = System.getProperty("user.home"); //$NON-NLS-1$
-                    }
-                    if (!mLocationText.getText().equals(sCustomLocationOsPath)) {
-                        mLocationText.setText(sCustomLocationOsPath);
-                        mValues.projectLocation = new File(sCustomLocationOsPath);
-                    }
-                } else {
-                    String value = Platform.getLocation().append(mValues.projectName).toString();
-                    value = TextProcessor.process(value);
-                    if (!mLocationText.getText().equals(value)) {
-                        mLocationText.setText(value);
-                        mValues.projectLocation = new File(value);
-                    }
-                }
-            } finally {
-                mIgnore = false;
-            }
-        }
-
-        if (mValues.useExisting && mValues.projectLocation != null
-                && mValues.projectLocation.exists() && mValues.mode != Mode.SAMPLE) {
-            mValues.extractFromAndroidManifest(new Path(mValues.projectLocation.getPath()));
-            if (!mValues.projectNameModifiedByUser && mValues.projectName != null) {
-                try {
-                    mIgnore = true;
-                    mProjectNameText.setText(mValues.projectName);
-                } finally {
-                    mIgnore = false;
-                }
-            }
-        }
-    }
-
-    private void validatePage() {
-        IStatus status = null;
-
-        // Validate project name -- unless we're creating a sample, in which case
-        // the user will get a chance to pick the name on the Sample page
-        if (mValues.mode != Mode.SAMPLE) {
-            status = validateProjectName(mValues.projectName);
-        }
-
-        if (status == null || status.getSeverity() != IStatus.ERROR) {
-            IStatus validLocation = validateLocation();
-            if (validLocation != null) {
-                status = validLocation;
-            }
-        }
-
-        if (!mCheckedSdkUptodate) {
-            // Ensure that we have a recent enough version of the Tools that the right templates
-            // are available
-            File file = new File(AdtPlugin.getOsSdkFolder(), OS_SDK_TOOLS_LIB_FOLDER
-                    + File.separator + FN_PROJECT_PROGUARD_FILE);
-            if (!file.exists()) {
-                status = new Status(IStatus.ERROR, AdtPlugin.PLUGIN_ID,
-                        String.format("You do not have the latest version of the "
-                        + "SDK Tools installed: Please update. (Missing %1$s)", file.getPath()));
-            } else {
-                mCheckedSdkUptodate = true;
-            }
-        }
-
-        // -- update UI & enable finish if there's no error
-        setPageComplete(status == null || status.getSeverity() != IStatus.ERROR);
-        if (status != null) {
-            setMessage(status.getMessage(),
-                    status.getSeverity() == IStatus.ERROR
-                        ? IMessageProvider.ERROR : IMessageProvider.WARNING);
-        } else {
-            setErrorMessage(null);
-            setMessage(null);
-        }
-    }
-
-    private IStatus validateLocation() {
-        if (mValues.mode == Mode.SAMPLE) {
-            // Samples are always created in the default directory
-            return null;
-        }
-
-        // Validate location
-        Path path = new Path(mValues.projectLocation.getPath());
-        if (!mValues.useExisting) {
-            if (!mValues.useDefaultLocation) {
-                // If not using the default value validate the location.
-                URI uri = URIUtil.toURI(path.toOSString());
-                IWorkspace workspace = ResourcesPlugin.getWorkspace();
-                IProject handle = workspace.getRoot().getProject(mValues.projectName);
-                IStatus locationStatus = workspace.validateProjectLocationURI(handle, uri);
-                if (!locationStatus.isOK()) {
-                    return locationStatus;
-                }
-                // The location is valid as far as Eclipse is concerned (i.e. mostly not
-                // an existing workspace project.) Check it either doesn't exist or is
-                // a directory that is empty.
-                File f = path.toFile();
-                if (f.exists() && !f.isDirectory()) {
-                    return new Status(IStatus.ERROR, AdtPlugin.PLUGIN_ID,
-                            "A directory name must be specified.");
-                } else if (f.isDirectory()) {
-                    // However if the directory exists, we should put a
-                    // warning if it is not empty. We don't put an error
-                    // (we'll ask the user again for confirmation before
-                    // using the directory.)
-                    String[] l = f.list();
-                    if (l != null && l.length != 0) {
-                        return new Status(IStatus.WARNING, AdtPlugin.PLUGIN_ID,
-                                "The selected output directory is not empty.");
-                    }
-                }
-            } else {
-                // Otherwise validate the path string is not empty
-                if (mValues.projectLocation.getPath().length() == 0) {
-                    return new Status(IStatus.ERROR, AdtPlugin.PLUGIN_ID,
-                            "A directory name must be specified.");
-                }
-                File dest = path.toFile();
-                if (dest.exists()) {
-                    return new Status(IStatus.ERROR, AdtPlugin.PLUGIN_ID,
-                            String.format(
-                                    "There is already a file or directory named \"%1$s\" in the selected location.",
-                            mValues.projectName));
-                }
-            }
-        } else {
-            // Must be an existing directory
-            File f = path.toFile();
-            if (!f.isDirectory()) {
-                return new Status(IStatus.ERROR, AdtPlugin.PLUGIN_ID,
-                        "An existing directory name must be specified.");
-            }
-
-            // Check there's an android manifest in the directory
-            String osPath = path.append(SdkConstants.FN_ANDROID_MANIFEST_XML).toOSString();
-            File manifestFile = new File(osPath);
-            if (!manifestFile.isFile()) {
-                return new Status(IStatus.ERROR, AdtPlugin.PLUGIN_ID,
-                        String.format(
-                                "Choose a valid Android code directory\n" +
-                                "(%1$s not found in %2$s.)",
-                                SdkConstants.FN_ANDROID_MANIFEST_XML, f.getName()));
-            }
-
-            // Parse it and check the important fields.
-            ManifestData manifestData = AndroidManifestHelper.parseForData(osPath);
-            if (manifestData == null) {
-                return new Status(IStatus.ERROR, AdtPlugin.PLUGIN_ID,
-                        String.format("File %1$s could not be parsed.", osPath));
-            }
-            String packageName = manifestData.getPackage();
-            if (packageName == null || packageName.length() == 0) {
-                return new Status(IStatus.ERROR, AdtPlugin.PLUGIN_ID,
-                        String.format("No package name defined in %1$s.", osPath));
-            }
-            Activity[] activities = manifestData.getActivities();
-            if (activities == null || activities.length == 0) {
-                // This is acceptable now as long as no activity needs to be
-                // created
-                if (mValues.createActivity) {
-                    return new Status(IStatus.ERROR, AdtPlugin.PLUGIN_ID,
-                            String.format("No activity name defined in %1$s.", osPath));
-                }
-            }
-
-            // If there's already a .project, tell the user to use import instead.
-            if (path.append(".project").toFile().exists()) {  //$NON-NLS-1$
-                return new Status(IStatus.WARNING, AdtPlugin.PLUGIN_ID,
-                        "An Eclipse project already exists in this directory.\n" +
-                        "Consider using File > Import > Existing Project instead.");
-            }
-        }
-
-        return null;
-    }
-
-    public static IStatus validateProjectName(String projectName) {
-        if (projectName == null || projectName.length() == 0) {
-            return new Status(IStatus.ERROR, AdtPlugin.PLUGIN_ID,
-                    "Project name must be specified");
-        } else {
-            IWorkspace workspace = ResourcesPlugin.getWorkspace();
-            IStatus nameStatus = workspace.validateName(projectName, IResource.PROJECT);
-            if (!nameStatus.isOK()) {
-                return nameStatus;
-            } else {
-                // Note: the case-sensitiveness of the project name matters and can cause a
-                // conflict *later* when creating the project resource, so let's check it now.
-                for (IProject existingProj : workspace.getRoot().getProjects()) {
-                    if (projectName.equalsIgnoreCase(existingProj.getName())) {
-                        return new Status(IStatus.ERROR, AdtPlugin.PLUGIN_ID,
-                                "A project with that name already exists in the workspace");
-                    }
-                }
-            }
-        }
-
-        return null;
-    }
-
-    @Override
-    public IWizardPage getNextPage() {
-        // Sync working set data to the value object, since the WorkingSetGroup
-        // doesn't let us add listeners to do this lazily
-        mValues.workingSets = getWorkingSets();
-
-        return super.getNextPage();
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/newproject/SampleSelectionPage.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/newproject/SampleSelectionPage.java
deleted file mode 100644
index 1972470..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/newproject/SampleSelectionPage.java
+++ /dev/null
@@ -1,271 +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.eclipse.adt.internal.wizards.newproject;
-
-import com.android.SdkConstants;
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.ide.eclipse.adt.internal.wizards.newproject.NewProjectWizardState.Mode;
-import com.android.sdklib.IAndroidTarget;
-import com.android.utils.Pair;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.jface.dialogs.IMessageProvider;
-import org.eclipse.jface.viewers.ArrayContentProvider;
-import org.eclipse.jface.viewers.ColumnLabelProvider;
-import org.eclipse.jface.viewers.IBaseLabelProvider;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.jface.wizard.WizardPage;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.swt.widgets.Text;
-
-import java.io.File;
-
-/** Page where the user can select a sample to "instantiate" */
-class SampleSelectionPage extends WizardPage implements SelectionListener, ModifyListener {
-    private final NewProjectWizardState mValues;
-    private boolean mIgnore;
-
-    private Table mTable;
-    private TableViewer mTableViewer;
-    private IAndroidTarget mCurrentSamplesTarget;
-    private Text mSampleProjectName;
-
-    /**
-     * Create the wizard.
-     */
-    SampleSelectionPage(NewProjectWizardState values) {
-        super("samplePage"); //$NON-NLS-1$
-        setTitle("Select Sample");
-        setDescription("Select which sample to create");
-        mValues = values;
-    }
-
-    /**
-     * Create contents of the wizard.
-     */
-    @Override
-    public void createControl(Composite parent) {
-        Composite container = new Composite(parent, SWT.NULL);
-        container.setLayout(new GridLayout(2, false));
-
-        mTableViewer = new TableViewer(container, SWT.BORDER | SWT.FULL_SELECTION);
-        mTable = mTableViewer.getTable();
-        GridData gridData = new GridData(SWT.FILL, SWT.FILL, true, true, 2, 1);
-        gridData.heightHint = 300;
-        mTable.setLayoutData(gridData);
-        mTable.addSelectionListener(this);
-
-        setControl(container);
-
-        Label projectLabel = new Label(container, SWT.NONE);
-        projectLabel.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1));
-        projectLabel.setText("Project Name:");
-
-        mSampleProjectName = new Text(container, SWT.BORDER);
-        mSampleProjectName.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
-        mSampleProjectName.addModifyListener(this);
-    }
-
-    @Override
-    public void setVisible(boolean visible) {
-        super.setVisible(visible);
-
-        if (visible) {
-            if (mValues.projectName != null) {
-                try {
-                    mIgnore = true;
-                    mSampleProjectName.setText(mValues.projectName);
-                } finally {
-                    mIgnore = false;
-                }
-            }
-
-            // Update samples list if the SDK target has changed (or if it hasn't yet
-            // been populated)
-            if (mCurrentSamplesTarget != mValues.target) {
-                mCurrentSamplesTarget = mValues.target;
-                updateSamples();
-            }
-
-            validatePage();
-        }
-    }
-
-    private void updateSamples() {
-        IBaseLabelProvider labelProvider = new ColumnLabelProvider() {
-            @Override
-            public Image getImage(Object element) {
-                return AdtPlugin.getAndroidLogo();
-            }
-
-            @Override
-            public String getText(Object element) {
-                if (element instanceof Pair<?, ?>) {
-                    Object name = ((Pair<?, ?>) element).getFirst();
-                    return name.toString();
-                }
-                return element.toString(); // Fallback. Should not happen.
-            }
-        };
-
-        mTableViewer.setContentProvider(new ArrayContentProvider());
-        mTableViewer.setLabelProvider(labelProvider);
-
-        if (mValues.samples != null && mValues.samples.size() > 0) {
-            Object[] samples = mValues.samples.toArray();
-            mTableViewer.setInput(samples);
-
-            mTable.select(0);
-            selectSample(mValues.samples.get(0).getSecond());
-            extractNamesFromAndroidManifest();
-        }
-    }
-
-    private void selectSample(File sample) {
-        mValues.chosenSample = sample;
-        if (sample != null && !mValues.projectNameModifiedByUser) {
-            mValues.projectName = sample.getName();
-            if (SdkConstants.FD_SAMPLE.equals(mValues.projectName) &&
-                    sample.getParentFile() != null) {
-                mValues.projectName = sample.getParentFile().getName() + '_' + mValues.projectName;
-            }
-            try {
-                mIgnore = true;
-                mSampleProjectName.setText(mValues.projectName);
-            } finally {
-                mIgnore = false;
-            }
-            updatedProjectName();
-        }
-    }
-
-    @SuppressWarnings("unchecked")
-    @Override
-    public void widgetSelected(SelectionEvent e) {
-        if (mIgnore) {
-            return;
-        }
-
-        if (e.getSource() == mTable) {
-            extractNamesFromAndroidManifest();
-            int index = mTable.getSelectionIndex();
-            if (index >= 0) {
-                Object[] roots = (Object[]) mTableViewer.getInput();
-                selectSample(((Pair<String, File>) roots[index]).getSecond());
-            } else {
-                selectSample(null);
-            }
-        } else {
-            assert false : e.getSource();
-        }
-
-        validatePage();
-    }
-
-    @Override
-    public void widgetDefaultSelected(SelectionEvent e) {
-    }
-
-    @Override
-    public void modifyText(ModifyEvent e) {
-        if (mIgnore) {
-            return;
-        }
-
-        if (e.getSource() == mSampleProjectName) {
-            mValues.projectName = mSampleProjectName.getText().trim();
-            mValues.projectNameModifiedByUser = true;
-            updatedProjectName();
-        }
-
-        validatePage();
-    }
-
-    private void updatedProjectName() {
-        if (mValues.useDefaultLocation) {
-            mValues.projectLocation = Platform.getLocation().toFile();
-        }
-    }
-
-    /**
-     * A sample was selected. Update the location field, manifest and validate.
-     * Extract names from an android manifest.
-     * This is done only if the user selected the "use existing source" and a manifest xml file
-     * can actually be found in the custom user directory.
-     */
-    private void extractNamesFromAndroidManifest() {
-        if (mValues.chosenSample == null || !mValues.chosenSample.isDirectory()) {
-            return;
-        }
-
-        Path path = new Path(mValues.chosenSample.getPath());
-        mValues.extractFromAndroidManifest(path);
-    }
-
-    @Override
-    public boolean isPageComplete() {
-        if (mValues.mode != Mode.SAMPLE) {
-            return true;
-        }
-
-        // Ensure that when creating samples, the Finish button isn't enabled until
-        // the user has reached and completed this page
-        if (mValues.chosenSample == null) {
-            return false;
-        }
-
-        return super.isPageComplete();
-    }
-
-    private void validatePage() {
-        IStatus status = null;
-        if (mValues.samples == null || mValues.samples.size() == 0) {
-            status = new Status(IStatus.ERROR, AdtPlugin.PLUGIN_ID,
-                    "The chosen SDK does not contain any samples");
-        } else if (mValues.chosenSample == null) {
-            status = new Status(IStatus.ERROR, AdtPlugin.PLUGIN_ID, "Choose a sample");
-        } else if (!mValues.chosenSample.exists()) {
-            status = new Status(IStatus.ERROR, AdtPlugin.PLUGIN_ID,
-                    String.format("Sample does not exist: %1$s", mValues.chosenSample.getPath()));
-        } else {
-            status = ProjectNamePage.validateProjectName(mValues.projectName);
-        }
-
-        // -- update UI & enable finish if there's no error
-        setPageComplete(status == null || status.getSeverity() != IStatus.ERROR);
-        if (status != null) {
-            setMessage(status.getMessage(),
-                    status.getSeverity() == IStatus.ERROR
-                        ? IMessageProvider.ERROR : IMessageProvider.WARNING);
-        } else {
-            setErrorMessage(null);
-            setMessage(null);
-        }
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/newproject/SdkSelectionPage.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/newproject/SdkSelectionPage.java
deleted file mode 100644
index 6cafcf0..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/newproject/SdkSelectionPage.java
+++ /dev/null
@@ -1,487 +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.eclipse.adt.internal.wizards.newproject;
-
-import com.android.SdkConstants;
-import com.android.annotations.Nullable;
-import com.android.ide.common.sdk.LoadStatus;
-import com.android.ide.common.xml.AndroidManifestParser;
-import com.android.ide.common.xml.ManifestData;
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.ide.eclipse.adt.internal.sdk.Sdk;
-import com.android.ide.eclipse.adt.internal.sdk.Sdk.ITargetChangeListener;
-import com.android.ide.eclipse.adt.internal.wizards.newproject.NewProjectWizardState.Mode;
-import com.android.io.FileWrapper;
-import com.android.sdklib.AndroidVersion;
-import com.android.sdklib.IAndroidTarget;
-import com.android.sdklib.SdkManager;
-import com.android.sdkuilib.internal.widgets.SdkTargetSelector;
-import com.android.utils.NullLogger;
-import com.android.utils.Pair;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.jface.dialogs.IMessageProvider;
-import org.eclipse.jface.wizard.WizardPage;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Group;
-
-import java.io.File;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.List;
-import java.util.Map;
-import java.util.Map.Entry;
-import java.util.regex.Pattern;
-
-/** A page in the New Project wizard where you select the target SDK */
-class SdkSelectionPage extends WizardPage implements ITargetChangeListener {
-    private final NewProjectWizardState mValues;
-    private boolean mIgnore;
-    private SdkTargetSelector mSdkTargetSelector;
-
-    /**
-     * Create the wizard.
-     */
-    SdkSelectionPage(NewProjectWizardState values) {
-        super("sdkSelection"); //$NON-NLS-1$
-        mValues = values;
-
-        setTitle("Select Build Target");
-        AdtPlugin.getDefault().addTargetListener(this);
-    }
-
-    @Override
-    public void dispose() {
-        AdtPlugin.getDefault().removeTargetListener(this);
-        super.dispose();
-    }
-
-    /**
-     * Create contents of the wizard.
-     */
-    @Override
-    public void createControl(Composite parent) {
-        Group group = new Group(parent, SWT.SHADOW_ETCHED_IN);
-        // Layout has 1 column
-        group.setLayout(new GridLayout());
-        group.setLayoutData(new GridData(GridData.FILL_BOTH));
-        group.setFont(parent.getFont());
-        group.setText("Build Target");
-
-        // The selector is created without targets. They are added below in the change listener.
-        mSdkTargetSelector = new SdkTargetSelector(group, null);
-
-        mSdkTargetSelector.setSelectionListener(new SelectionAdapter() {
-            @Override
-            public void widgetSelected(SelectionEvent e) {
-                if (mIgnore) {
-                    return;
-                }
-
-                mValues.target = mSdkTargetSelector.getSelected();
-                mValues.targetModifiedByUser = true;
-                onSdkTargetModified();
-                validatePage();
-            }
-        });
-
-        onSdkLoaded();
-
-        setControl(group);
-    }
-
-    @Override
-    public void setVisible(boolean visible) {
-        super.setVisible(visible);
-        if (mValues.mode == Mode.SAMPLE) {
-            setDescription("Choose an SDK to select a sample from");
-        } else {
-            setDescription("Choose an SDK to target");
-        }
-        try {
-            mIgnore = true;
-            if (mValues.target != null) {
-                mSdkTargetSelector.setSelection(mValues.target);
-            }
-        } finally {
-            mIgnore = false;
-        }
-
-        validatePage();
-    }
-
-    @Override
-    public boolean isPageComplete() {
-        // Ensure that the Finish button isn't enabled until
-        // the user has reached and completed this page
-        if (mValues.target == null) {
-            return false;
-        }
-
-        return super.isPageComplete();
-    }
-
-    /**
-     * Called when an SDK target is modified.
-     *
-     * Also changes the minSdkVersion field to reflect the sdk api level that has
-     * just been selected.
-     */
-    private void onSdkTargetModified() {
-        if (mIgnore) {
-            return;
-        }
-
-        IAndroidTarget target = mValues.target;
-
-        // Update the minimum SDK text field?
-        // We do if one of two conditions are met:
-        if (target != null) {
-            boolean setMinSdk = false;
-            AndroidVersion version = target.getVersion();
-            int apiLevel = version.getApiLevel();
-            // 1. Has the user not manually edited the SDK field yet? If so, keep
-            //    updating it to the selected value.
-            if (!mValues.minSdkModifiedByUser) {
-                setMinSdk = true;
-            } else {
-                // 2. Is the API level set to a higher level than the newly selected
-                //    target SDK? If so, change it down to the new lower value.
-                String s = mValues.minSdk;
-                if (s.length() > 0) {
-                    try {
-                        int currentApi = Integer.parseInt(s);
-                        if (currentApi > apiLevel) {
-                            setMinSdk = true;
-                        }
-                    } catch (NumberFormatException nfe) {
-                        // User may have typed something invalid -- ignore
-                    }
-                }
-            }
-            if (setMinSdk) {
-                String minSdk;
-                if (version.isPreview()) {
-                    minSdk = version.getCodename();
-                } else {
-                    minSdk = Integer.toString(apiLevel);
-                }
-                mValues.minSdk = minSdk;
-            }
-        }
-
-        loadSamplesForTarget(target);
-    }
-
-    /**
-     * Updates the list of all samples for the given target SDK.
-     * The list is stored in mSamplesPaths as absolute directory paths.
-     * The combo is recreated to match this.
-     */
-    private void loadSamplesForTarget(IAndroidTarget target) {
-        // Keep the name of the old selection (if there were any samples)
-        File previouslyChosenSample = mValues.chosenSample;
-
-        mValues.samples.clear();
-        mValues.chosenSample = null;
-
-        if (target != null) {
-            // Get the sample root path and recompute the list of samples
-            String samplesRootPath = target.getPath(IAndroidTarget.SAMPLES);
-
-            File root = new File(samplesRootPath);
-            findSamplesManifests(root, root, null, null, mValues.samples);
-
-            Sdk sdk = Sdk.getCurrent();
-            if (sdk != null) {
-                // Parse the extras to see if we can find samples that are
-                // compatible with the selected target API.
-                // First we need an SdkManager that suppresses all output.
-                SdkManager sdkman = sdk.getNewSdkManager(NullLogger.getLogger());
-
-                Map<File, String> extras = sdkman.getExtraSamples();
-                for (Entry<File, String> entry : extras.entrySet()) {
-                    File path = entry.getKey();
-                    String name = entry.getValue();
-
-                    // Case where the sample is at the root of the directory and not
-                    // in a per-sample sub-directory.
-                    if (path.getName().equals(SdkConstants.FD_SAMPLE)) {
-                        findSampleManifestInDir(
-                                path, path, name, target.getVersion(), mValues.samples);
-                    }
-
-                    // Scan sub-directories
-                    findSamplesManifests(
-                            path, path, name, target.getVersion(), mValues.samples);
-                }
-            }
-
-            if (mValues.samples.isEmpty()) {
-                return;
-            } else {
-                Collections.sort(mValues.samples, new Comparator<Pair<String, File>>() {
-                    @Override
-                    public int compare(Pair<String, File> o1, Pair<String, File> o2) {
-                        // Compare the display name of the sample
-                        return o1.getFirst().compareTo(o2.getFirst());
-                    }
-                });
-            }
-
-            // Try to find the old selection.
-            if (previouslyChosenSample != null) {
-                String previouslyChosenName = previouslyChosenSample.getName();
-                for (int i = 0, n = mValues.samples.size(); i < n; i++) {
-                    File file = mValues.samples.get(i).getSecond();
-                    if (file.getName().equals(previouslyChosenName)) {
-                        mValues.chosenSample = file;
-                        break;
-                    }
-                }
-            }
-        }
-    }
-
-    /**
-     * Recursively find potential sample directories under the given directory.
-     * Actually lists any directory that contains an android manifest.
-     * Paths found are added the samplesPaths list.
-     *
-     * @param rootDir The "samples" root directory. Doesn't change during recursion.
-     * @param currDir The directory being scanned. Caller must initially set it to {@code rootDir}.
-     * @param extraName Optional name appended to the samples display name. Typically used to
-     *   indicate a sample comes from a given extra package.
-     * @param targetVersion Optional target version filter. If non null, only samples that are
-     *   compatible with the given target will be listed.
-     * @param samplesPaths A non-null list filled by this method with all samples found. The
-     *   pair is (String: sample display name => File: sample directory).
-     */
-    private void findSamplesManifests(
-            File rootDir,
-            File currDir,
-            @Nullable String extraName,
-            @Nullable AndroidVersion targetVersion,
-            List<Pair<String, File>> samplesPaths) {
-        if (!currDir.isDirectory()) {
-            return;
-        }
-
-        for (File f : currDir.listFiles()) {
-            if (f.isDirectory()) {
-                findSampleManifestInDir(f, rootDir, extraName, targetVersion, samplesPaths);
-
-                // Recurse in the project, to find embedded tests sub-projects
-                // We can however skip this recursion for known android sub-dirs that
-                // can't have projects, namely for sources, assets and resources.
-                String leaf = f.getName();
-                if (!SdkConstants.FD_SOURCES.equals(leaf) &&
-                        !SdkConstants.FD_ASSETS.equals(leaf) &&
-                        !SdkConstants.FD_RES.equals(leaf)) {
-                    findSamplesManifests(rootDir, f, extraName, targetVersion, samplesPaths);
-                }
-            }
-        }
-    }
-
-    private void findSampleManifestInDir(
-            File sampleDir,
-            File rootDir,
-            String extraName,
-            AndroidVersion targetVersion,
-            List<Pair<String, File>> samplesPaths) {
-        // Assume this is a sample if it contains an android manifest.
-        File manifestFile = new File(sampleDir, SdkConstants.FN_ANDROID_MANIFEST_XML);
-        if (manifestFile.isFile()) {
-            try {
-                ManifestData data =
-                    AndroidManifestParser.parse(new FileWrapper(manifestFile));
-                if (data != null) {
-                    boolean accept = false;
-                    if (targetVersion == null) {
-                        accept = true;
-                    } else if (targetVersion != null) {
-                        int i = data.getMinSdkVersion();
-                        if (i != ManifestData.MIN_SDK_CODENAME) {
-                           accept = i <= targetVersion.getApiLevel();
-                        } else {
-                            String s = data.getMinSdkVersionString();
-                            if (s != null) {
-                                accept = s.equals(targetVersion.getCodename());
-                            }
-                        }
-                    }
-
-                    if (accept) {
-                        String name = getSampleDisplayName(extraName, rootDir, sampleDir);
-                        samplesPaths.add(Pair.of(name, sampleDir));
-                    }
-                }
-            } catch (Exception e) {
-                // Ignore. Don't use a sample which manifest doesn't parse correctly.
-                AdtPlugin.log(IStatus.INFO,
-                        "NPW ignoring malformed manifest %s",   //$NON-NLS-1$
-                        manifestFile.getAbsolutePath());
-            }
-        }
-    }
-
-    /**
-     * Compute the sample name compared to its root directory.
-     */
-    private String getSampleDisplayName(String extraName, File rootDir, File sampleDir) {
-        String name = null;
-        if (!rootDir.equals(sampleDir)) {
-            String path = sampleDir.getPath();
-            int n = rootDir.getPath().length();
-            if (path.length() > n) {
-                path = path.substring(n);
-                if (path.charAt(0) == File.separatorChar) {
-                    path = path.substring(1);
-                }
-                if (path.endsWith(File.separator)) {
-                    path = path.substring(0, path.length() - 1);
-                }
-                name = path.replaceAll(Pattern.quote(File.separator), " > ");   //$NON-NLS-1$
-            }
-        }
-        if (name == null &&
-                rootDir.equals(sampleDir) &&
-                sampleDir.getName().equals(SdkConstants.FD_SAMPLE) &&
-                extraName != null) {
-            // This is an old-style extra with one single sample directory. Just use the
-            // extra's name as the same name.
-            return extraName;
-        }
-        if (name == null) {
-            // Otherwise try to use the sample's directory name as the sample name.
-            while (sampleDir != null &&
-                   (name == null ||
-                    SdkConstants.FD_SAMPLE.equals(name) ||
-                    SdkConstants.FD_SAMPLES.equals(name))) {
-                name = sampleDir.getName();
-                sampleDir = sampleDir.getParentFile();
-            }
-        }
-        if (name == null) {
-            if (extraName != null) {
-                // In the unlikely case nothing worked and we have an extra name, use that.
-                return extraName;
-            } else {
-                name = "Sample"; // fallback name... should not happen.         //$NON-NLS-1$
-            }
-        }
-        if (extraName != null) {
-            name = name + " [" + extraName + ']';                               //$NON-NLS-1$
-        }
-
-        return name;
-    }
-
-    private void validatePage() {
-        String error = null;
-
-        if (AdtPlugin.getDefault().getSdkLoadStatus() == LoadStatus.LOADING) {
-            error = "The SDK is still loading; please wait.";
-        }
-
-        if (error == null && mValues.target == null) {
-            error = "An SDK Target must be specified.";
-        }
-
-        if (error == null && mValues.mode == Mode.SAMPLE) {
-            // Make sure this SDK target contains samples
-            if (mValues.samples == null || mValues.samples.size() == 0) {
-                error = "This target has no samples. Please select another target.";
-            }
-        }
-
-        // -- update UI & enable finish if there's no error
-        setPageComplete(error == null);
-        if (error != null) {
-            setMessage(error, IMessageProvider.ERROR);
-        } else {
-            setErrorMessage(null);
-            setMessage(null);
-        }
-    }
-
-    // ---- Implements ITargetChangeListener ----
-    @Override
-    public void onSdkLoaded() {
-        if (mSdkTargetSelector == null) {
-            return;
-        }
-
-        // Update the sdk target selector with the new targets
-
-        // get the targets from the sdk
-        IAndroidTarget[] targets = null;
-        if (Sdk.getCurrent() != null) {
-            targets = Sdk.getCurrent().getTargets();
-        }
-        mSdkTargetSelector.setTargets(targets);
-
-        // If there's only one target, select it.
-        // This will invoke the selection listener on the selector defined above.
-        if (targets != null && targets.length == 1) {
-            mValues.target = targets[0];
-            mSdkTargetSelector.setSelection(mValues.target);
-            onSdkTargetModified();
-        } else if (targets != null) {
-            // Pick the highest available platform by default (see issue #17505
-            // for related discussion.)
-            IAndroidTarget initialTarget = null;
-            for (IAndroidTarget target : targets) {
-                if (target.isPlatform()
-                        && !target.getVersion().isPreview()
-                        && (initialTarget == null ||
-                                target.getVersion().getApiLevel() >
-                                    initialTarget.getVersion().getApiLevel())) {
-                    initialTarget = target;
-                }
-            }
-            if (initialTarget != null) {
-                mValues.target = initialTarget;
-                try {
-                    mIgnore = true;
-                    mSdkTargetSelector.setSelection(mValues.target);
-                } finally {
-                    mIgnore = false;
-                }
-                onSdkTargetModified();
-            }
-        }
-
-        validatePage();
-    }
-
-    @Override
-    public void onProjectTargetChange(IProject changedProject) {
-        // Ignore
-    }
-
-    @Override
-    public void onTargetLoaded(IAndroidTarget target) {
-        // Ignore
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/newproject/TestTargetPage.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/newproject/TestTargetPage.java
deleted file mode 100644
index f1c188a..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/newproject/TestTargetPage.java
+++ /dev/null
@@ -1,293 +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.eclipse.adt.internal.wizards.newproject;
-
-import com.android.ide.common.xml.ManifestData;
-import com.android.ide.eclipse.adt.internal.project.AndroidManifestHelper;
-import com.android.ide.eclipse.adt.internal.project.ProjectChooserHelper;
-import com.android.ide.eclipse.adt.internal.sdk.Sdk;
-import com.android.sdklib.IAndroidTarget;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IWorkspaceRoot;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.jdt.core.IJavaModel;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.JavaCore;
-import org.eclipse.jdt.ui.JavaElementLabelProvider;
-import org.eclipse.jface.dialogs.IMessageProvider;
-import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.jface.wizard.WizardPage;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.dialogs.FilteredList;
-
-/**
- * Page shown when creating a test project which lets you choose between testing
- * yourself and testing a different project
- */
-class TestTargetPage extends WizardPage implements SelectionListener {
-    private final NewProjectWizardState mValues;
-    /** Flag used when setting button/text state manually to ignore listener updates */
-    private boolean mIgnore;
-    private String mLastExistingPackageName;
-
-    private Button mCurrentRadioButton;
-    private Button mExistingRadioButton;
-    private FilteredList mProjectList;
-    private boolean mPageShown;
-
-    /**
-     * Create the wizard.
-     */
-    TestTargetPage(NewProjectWizardState values) {
-        super("testTargetPage"); //$NON-NLS-1$
-        setTitle("Select Test Target");
-        setDescription("Choose a project to test");
-        mValues = values;
-    }
-
-    /**
-     * Create contents of the wizard.
-     */
-    @Override
-    public void createControl(Composite parent) {
-        Composite container = new Composite(parent, SWT.NULL);
-
-        setControl(container);
-        container.setLayout(new GridLayout(2, false));
-
-        mCurrentRadioButton = new Button(container, SWT.RADIO);
-        mCurrentRadioButton.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false, 2, 1));
-        mCurrentRadioButton.setText("This project");
-        mCurrentRadioButton.addSelectionListener(this);
-
-        mExistingRadioButton = new Button(container, SWT.RADIO);
-        mExistingRadioButton.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false, 2, 1));
-        mExistingRadioButton.setText("An existing Android project:");
-        mExistingRadioButton.addSelectionListener(this);
-
-        ILabelProvider labelProvider = new JavaElementLabelProvider(
-                JavaElementLabelProvider.SHOW_DEFAULT);
-        mProjectList = new FilteredList(container,
-                SWT.BORDER | SWT.V_SCROLL | SWT.H_SCROLL | SWT.SINGLE, labelProvider,
-                true /*ignoreCase*/, false /*allowDuplicates*/, true /* matchEmptyString*/);
-        mProjectList.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 2, 1));
-        mProjectList.addSelectionListener(this);
-    }
-
-    private void initializeList() {
-        ProjectChooserHelper helper = new ProjectChooserHelper(getShell(), null /*filter*/);
-        IWorkspaceRoot workspaceRoot = ResourcesPlugin.getWorkspace().getRoot();
-        IJavaModel javaModel = JavaCore.create(workspaceRoot);
-        IJavaProject[] androidProjects = helper.getAndroidProjects(javaModel);
-        mProjectList.setElements(androidProjects);
-        if (mValues.testedProject != null) {
-            for (IJavaProject project : androidProjects) {
-                if (project.getProject() == mValues.testedProject) {
-                    mProjectList.setSelection(new Object[] { project });
-                    break;
-                }
-            }
-        } else {
-            // No initial selection: force the user to choose
-            mProjectList.setSelection(new int[0]);
-        }
-    }
-
-    @Override
-    public void setVisible(boolean visible) {
-        super.setVisible(visible);
-        mPageShown = true;
-
-        if (visible) {
-            try {
-                mIgnore = true;
-                mCurrentRadioButton.setSelection(mValues.testingSelf);
-                mExistingRadioButton.setSelection(!mValues.testingSelf);
-                mProjectList.setEnabled(!mValues.testingSelf);
-
-                if (mProjectList.isEmpty()) {
-                    initializeList();
-                }
-                if (!mValues.testingSelf) {
-                    mProjectList.setFocus();
-                    IProject project = getSelectedProject();
-                    if (project != null) {
-                        // The FilteredList seems to -insist- on selecting the first item
-                        // in the list, even when the selection is explicitly set to an empty
-                        // array. This means the user is looking at a selection, so we need
-                        // to also go ahead and select this item in the model such that the
-                        // two agree, even if we would have preferred to have no initial
-                        // selection.
-                        mValues.testedProject = project;
-                    }
-                }
-            } finally {
-                mIgnore = false;
-            }
-        }
-
-        validatePage();
-    }
-
-    @Override
-    public void widgetSelected(SelectionEvent e) {
-        if (mIgnore) {
-            return;
-        }
-
-        Object source = e.getSource();
-        if (source == mExistingRadioButton) {
-            mProjectList.setEnabled(true);
-            mValues.testingSelf = false;
-            setExistingProject(getSelectedProject());
-            mProjectList.setFocus();
-        } else if (source == mCurrentRadioButton) {
-            mProjectList.setEnabled(false);
-            mValues.testingSelf = true;
-            mValues.testedProject = null;
-        } else {
-            // The event must be from the project list, which unfortunately doesn't
-            // pass itself as the selection event, it passes a reference to some internal
-            // table widget that it uses, so we check for this case last
-            IProject project = getSelectedProject();
-            if (project != mValues.testedProject) {
-                setExistingProject(project);
-            }
-        }
-
-        validatePage();
-    }
-
-    private IProject getSelectedProject() {
-        Object[] selection = mProjectList.getSelection();
-        IProject project = selection != null && selection.length == 1
-            ? ((IJavaProject) selection[0]).getProject() : null;
-        return project;
-    }
-
-    @Override
-    public void widgetDefaultSelected(SelectionEvent e) {
-    }
-
-    private void setExistingProject(IProject project) {
-        mValues.testedProject = project;
-
-        // Try to update the application, package, sdk target and minSdkVersion accordingly
-        if (project != null &&
-                (!mValues.applicationNameModifiedByUser ||
-                 !mValues.packageNameModifiedByUser     ||
-                 !mValues.targetModifiedByUser          ||
-                 !mValues.minSdkModifiedByUser)) {
-            ManifestData manifestData = AndroidManifestHelper.parseForData(project);
-            if (manifestData != null) {
-                String appName = String.format("%1$sTest", project.getName());
-                String packageName = manifestData.getPackage();
-                String minSdkVersion = manifestData.getMinSdkVersionString();
-                IAndroidTarget sdkTarget = null;
-                if (Sdk.getCurrent() != null) {
-                    sdkTarget = Sdk.getCurrent().getTarget(project);
-                }
-
-                if (packageName == null) {
-                    packageName = "";  //$NON-NLS-1$
-                }
-                mLastExistingPackageName = packageName;
-
-                if (!mValues.projectNameModifiedByUser) {
-                    mValues.projectName = appName;
-                }
-
-                if (!mValues.applicationNameModifiedByUser) {
-                    mValues.applicationName = appName;
-                }
-
-                if (!mValues.packageNameModifiedByUser) {
-                    packageName += ".test";  //$NON-NLS-1$
-                    mValues.packageName = packageName;
-                }
-
-                if (!mValues.targetModifiedByUser && sdkTarget != null) {
-                    mValues.target = sdkTarget;
-                }
-
-                if (!mValues.minSdkModifiedByUser) {
-                    if (minSdkVersion != null || sdkTarget != null) {
-                        mValues.minSdk = minSdkVersion;
-                    }
-                    if (sdkTarget == null) {
-                        mValues.updateSdkTargetToMatchMinSdkVersion();
-                    }
-                }
-            }
-        }
-
-        updateTestTargetPackageField(mLastExistingPackageName);
-    }
-
-    /**
-     * Updates the test target package name
-     *
-     * When using the "self-test" option, the packageName argument is ignored and the
-     * current value from the project package is used.
-     *
-     * Otherwise the packageName is used if it is not null.
-     */
-    private void updateTestTargetPackageField(String packageName) {
-        if (mValues.testingSelf) {
-            mValues.testTargetPackageName = mValues.packageName;
-        } else if (packageName != null) {
-            mValues.testTargetPackageName = packageName;
-        }
-    }
-
-    @Override
-    public boolean isPageComplete() {
-        // Ensure that the user sees the page and makes a selection
-        if (!mPageShown) {
-            return false;
-        }
-
-        return super.isPageComplete();
-    }
-
-    private void validatePage() {
-        String error = null;
-
-        if (!mValues.testingSelf) {
-            if (mValues.testedProject == null) {
-                error = "Please select an existing Android project as a test target.";
-            } else if (mValues.projectName.equals(mValues.testedProject.getName())) {
-                error = "The main project name and the test project name must be different.";
-            }
-        }
-
-        // -- update UI & enable finish if there's no error
-        setPageComplete(error == null);
-        if (error != null) {
-            setMessage(error, IMessageProvider.ERROR);
-        } else {
-            setErrorMessage(null);
-            setMessage(null);
-        }
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/newproject/WorkingSetGroup.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/newproject/WorkingSetGroup.java
deleted file mode 100644
index fb33a08..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/newproject/WorkingSetGroup.java
+++ /dev/null
@@ -1,109 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2009 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package com.android.ide.eclipse.adt.internal.wizards.newproject;
-
-import org.eclipse.jdt.internal.ui.JavaPlugin;
-import org.eclipse.jdt.internal.ui.wizards.NewWizardMessages;
-import org.eclipse.jdt.internal.ui.workingsets.IWorkingSetIDs;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Group;
-import org.eclipse.ui.IWorkingSet;
-import org.eclipse.ui.dialogs.WorkingSetConfigurationBlock;
-
-/**
- * Copied from
- * org.eclipse.jdt.ui.wizards.NewJavaProjectWizardPageOne$WorkingSetGroup
- *
- * Creates the working set group with controls that allow
- * the selection of working sets
- */
-@SuppressWarnings("restriction")
-public class WorkingSetGroup {
-
-    private WorkingSetConfigurationBlock fWorkingSetBlock;
-    private Button mEnableButton;
-
-    public WorkingSetGroup() {
-        String[] workingSetIds = new String[] {
-                IWorkingSetIDs.JAVA, IWorkingSetIDs.RESOURCE
-        };
-        fWorkingSetBlock = new WorkingSetConfigurationBlock(workingSetIds, JavaPlugin.getDefault()
-                .getDialogSettings());
-    }
-
-    public Composite createControl(Composite composite) {
-        Group workingSetGroup = new Group(composite, SWT.NONE);
-        workingSetGroup.setFont(composite.getFont());
-        workingSetGroup.setText(NewWizardMessages.NewJavaProjectWizardPageOne_WorkingSets_group);
-        workingSetGroup.setLayout(new GridLayout(1, false));
-
-        fWorkingSetBlock.createContent(workingSetGroup);
-
-        // WorkingSetGroup is implemented in such a way that the checkbox it contains
-        // can only be programmatically set if there's an existing working set associated
-        // *before* we construct the control. However the control is created when the
-        // wizard is opened, not when the page is first shown.
-        //
-        // One choice is to duplicate the class in our project.
-        // Or find the checkbox we want and trigger it manually.
-        mEnableButton = findCheckbox(workingSetGroup);
-
-        return workingSetGroup;
-    }
-
-    public void setWorkingSets(IWorkingSet[] workingSets) {
-        fWorkingSetBlock.setWorkingSets(workingSets);
-    }
-
-    public IWorkingSet[] getSelectedWorkingSets() {
-        try {
-            return fWorkingSetBlock.getSelectedWorkingSets();
-        } catch (Throwable t) {
-            // Test scenarios; no UI is created, which the fWorkingSetBlock assumes
-            // (it dereferences the enabledButton)
-            return new IWorkingSet[0];
-        }
-    }
-
-    public boolean isChecked() {
-        return mEnableButton == null ? false : mEnableButton.getSelection();
-    }
-
-    public void setChecked(boolean state) {
-        if (mEnableButton != null) {
-            mEnableButton.setSelection(state);
-        }
-    }
-
-    /**
-     * Finds the first button of style Checkbox in the given parent composite.
-     * Returns null if not found.
-     */
-    private Button findCheckbox(Composite parent) {
-        for (Control control : parent.getChildren()) {
-            if (control instanceof Button && (control.getStyle() & SWT.CHECK) == SWT.CHECK) {
-                return (Button) control;
-            } else if (control instanceof Composite) {
-                Button found = findCheckbox((Composite) control);
-                if (found != null) {
-                    return found;
-                }
-            }
-        }
-
-        return null;
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/newproject/WorkingSetHelper.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/newproject/WorkingSetHelper.java
deleted file mode 100755
index 428bfd3..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/newproject/WorkingSetHelper.java
+++ /dev/null
@@ -1,130 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2009 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package com.android.ide.eclipse.adt.internal.wizards.newproject;
-
-import org.eclipse.jdt.internal.ui.packageview.PackageExplorerPart;
-import org.eclipse.jdt.internal.ui.workingsets.IWorkingSetIDs;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.ITreeSelection;
-import org.eclipse.jface.viewers.TreePath;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.IWorkingSet;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-/**
- * This class contains a helper method to deal with working sets.
- * <p/>
- * Copied from org.eclipse.jdt.ui.wizards.NewJavaProjectWizardPageOne
- */
-@SuppressWarnings("restriction")
-public final class WorkingSetHelper {
-
-    private static final IWorkingSet[] EMPTY_WORKING_SET_ARRAY = new IWorkingSet[0];
-
-    /** This class is never instantiated. */
-    private WorkingSetHelper() {
-    }
-
-    public static IWorkingSet[] getSelectedWorkingSet(IStructuredSelection selection,
-            IWorkbenchPart activePart) {
-        IWorkingSet[] selected= getSelectedWorkingSet(selection);
-        if (selected != null && selected.length > 0) {
-            for (int i= 0; i < selected.length; i++) {
-                if (!isValidWorkingSet(selected[i]))
-                    return EMPTY_WORKING_SET_ARRAY;
-            }
-            return selected;
-        }
-
-        if (!(activePart instanceof PackageExplorerPart))
-            return EMPTY_WORKING_SET_ARRAY;
-
-        PackageExplorerPart explorerPart= (PackageExplorerPart) activePart;
-        if (explorerPart.getRootMode() == PackageExplorerPart.PROJECTS_AS_ROOTS) {
-            //Get active filter
-            IWorkingSet filterWorkingSet= explorerPart.getFilterWorkingSet();
-            if (filterWorkingSet == null)
-                return EMPTY_WORKING_SET_ARRAY;
-
-            if (!isValidWorkingSet(filterWorkingSet))
-                return EMPTY_WORKING_SET_ARRAY;
-
-            return new IWorkingSet[] {filterWorkingSet};
-        } else {
-            //If we have been gone into a working set return the working set
-            Object input= explorerPart.getViewPartInput();
-            if (!(input instanceof IWorkingSet))
-                return EMPTY_WORKING_SET_ARRAY;
-
-            IWorkingSet workingSet= (IWorkingSet)input;
-            if (!isValidWorkingSet(workingSet))
-                return EMPTY_WORKING_SET_ARRAY;
-
-            return new IWorkingSet[] {workingSet};
-        }
-    }
-
-    private static IWorkingSet[] getSelectedWorkingSet(IStructuredSelection selection) {
-        if (!(selection instanceof ITreeSelection))
-            return EMPTY_WORKING_SET_ARRAY;
-
-        ITreeSelection treeSelection= (ITreeSelection) selection;
-        if (treeSelection.isEmpty())
-            return EMPTY_WORKING_SET_ARRAY;
-
-        List<?> elements = treeSelection.toList();
-        if (elements.size() == 1) {
-            Object element= elements.get(0);
-            TreePath[] paths= treeSelection.getPathsFor(element);
-            if (paths.length != 1)
-                return EMPTY_WORKING_SET_ARRAY;
-
-            TreePath path= paths[0];
-            if (path.getSegmentCount() == 0)
-                return EMPTY_WORKING_SET_ARRAY;
-
-            Object candidate= path.getSegment(0);
-            if (!(candidate instanceof IWorkingSet))
-                return EMPTY_WORKING_SET_ARRAY;
-
-            IWorkingSet workingSetCandidate= (IWorkingSet) candidate;
-            if (isValidWorkingSet(workingSetCandidate))
-                return new IWorkingSet[] { workingSetCandidate };
-
-            return EMPTY_WORKING_SET_ARRAY;
-        }
-
-        ArrayList<Object> result = new ArrayList<Object>();
-        for (Iterator<?> iterator = elements.iterator(); iterator.hasNext();) {
-            Object element= iterator.next();
-            if (element instanceof IWorkingSet && isValidWorkingSet((IWorkingSet) element)) {
-                result.add(element);
-            }
-        }
-        return result.toArray(new IWorkingSet[result.size()]);
-    }
-
-
-    private static boolean isValidWorkingSet(IWorkingSet workingSet) {
-        String id= workingSet.getId();
-        if (!IWorkingSetIDs.JAVA.equals(id) && !IWorkingSetIDs.RESOURCE.equals(id))
-            return false;
-
-        if (workingSet.isAggregateWorkingSet())
-            return false;
-
-        return true;
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/newxmlfile/AddTranslationDialog.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/newxmlfile/AddTranslationDialog.java
deleted file mode 100644
index 0301b80..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/newxmlfile/AddTranslationDialog.java
+++ /dev/null
@@ -1,653 +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.ide.eclipse.adt.internal.wizards.newxmlfile;
-
-import static com.android.SdkConstants.FD_RES;
-import static com.android.SdkConstants.FD_RES_VALUES;
-import static com.android.SdkConstants.RES_QUALIFIER_SEP;
-
-import com.android.ide.common.rendering.api.ResourceValue;
-import com.android.ide.common.res2.ValueXmlHelper;
-import com.android.ide.common.resources.LocaleManager;
-import com.android.ide.common.resources.ResourceItem;
-import com.android.ide.common.resources.configuration.FolderConfiguration;
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.ide.eclipse.adt.AdtUtils;
-import com.android.ide.eclipse.adt.internal.editors.layout.configuration.FlagManager;
-import com.android.ide.eclipse.adt.internal.editors.layout.gle2.ImageControl;
-import com.android.ide.eclipse.adt.internal.editors.layout.gle2.RenderPreviewManager;
-import com.android.ide.eclipse.adt.internal.resources.manager.ProjectResources;
-import com.android.ide.eclipse.adt.internal.resources.manager.ResourceManager;
-import com.android.resources.ResourceType;
-import com.google.common.base.Charsets;
-import com.google.common.collect.Maps;
-
-import org.eclipse.core.resources.IContainer;
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IFolder;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IWorkspaceRoot;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.jface.viewers.ArrayContentProvider;
-import org.eclipse.jface.viewers.CellEditor;
-import org.eclipse.jface.viewers.CellLabelProvider;
-import org.eclipse.jface.viewers.ColumnViewer;
-import org.eclipse.jface.viewers.EditingSupport;
-import org.eclipse.jface.viewers.IBaseLabelProvider;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.jface.viewers.TableViewerColumn;
-import org.eclipse.jface.viewers.TextCellEditor;
-import org.eclipse.jface.viewers.ViewerCell;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.ControlEvent;
-import org.eclipse.swt.events.ControlListener;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
-import org.eclipse.swt.events.TraverseEvent;
-import org.eclipse.swt.events.TraverseListener;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.graphics.Rectangle;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Combo;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.swt.widgets.TableColumn;
-import org.eclipse.ui.ISharedImages;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.PlatformUI;
-
-import java.io.ByteArrayInputStream;
-import java.io.InputStream;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.SortedSet;
-
-/**
- * Dialog which adds a new translation to the project
- */
-public class AddTranslationDialog extends Dialog implements ControlListener, SelectionListener,
-        TraverseListener {
-    private static final int KEY_COLUMN = 0;
-    private static final int DEFAULT_TRANSLATION_COLUMN = 1;
-    private static final int NEW_TRANSLATION_COLUMN = 2;
-    private final FolderConfiguration mConfiguration = new FolderConfiguration();
-    private final IProject mProject;
-    private String mTarget;
-    private boolean mIgnore;
-    private Map<String, String> mTranslations;
-    private Set<String> mExistingLanguages;
-    private String mSelectedLanguage;
-    private String mSelectedRegion;
-
-    private Table mTable;
-    private Combo mLanguageCombo;
-    private Combo mRegionCombo;
-    private ImageControl mFlag;
-    private Label mFile;
-    private Button mOkButton;
-    private Composite mErrorPanel;
-    private Label mErrorLabel;
-    private MyTableViewer mTableViewer;
-
-    /**
-     * Creates the dialog.
-     * @param parentShell the parent shell
-     * @param project the project to add translations into
-     */
-    public AddTranslationDialog(Shell parentShell, IProject project) {
-        super(parentShell);
-        setShellStyle(SWT.CLOSE | SWT.RESIZE | SWT.TITLE);
-        mProject = project;
-    }
-
-    @Override
-    protected Control createDialogArea(Composite parent) {
-        Composite container = (Composite) super.createDialogArea(parent);
-        GridLayout gl_container = new GridLayout(6, false);
-        gl_container.horizontalSpacing = 0;
-        container.setLayout(gl_container);
-
-        Label languageLabel = new Label(container, SWT.NONE);
-        languageLabel.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1));
-        languageLabel.setText("Language:");
-        mLanguageCombo = new Combo(container, SWT.READ_ONLY);
-        GridData gd_mLanguageCombo = new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1);
-        gd_mLanguageCombo.widthHint = 150;
-        mLanguageCombo.setLayoutData(gd_mLanguageCombo);
-
-        Label regionLabel = new Label(container, SWT.NONE);
-        GridData gd_regionLabel = new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1);
-        gd_regionLabel.horizontalIndent = 10;
-        regionLabel.setLayoutData(gd_regionLabel);
-        regionLabel.setText("Region:");
-        mRegionCombo = new Combo(container, SWT.READ_ONLY);
-        GridData gd_mRegionCombo = new GridData(SWT.LEFT, SWT.CENTER, false, false, 1, 1);
-        gd_mRegionCombo.widthHint = 150;
-        mRegionCombo.setLayoutData(gd_mRegionCombo);
-        mRegionCombo.setEnabled(false);
-
-        mFlag = new ImageControl(container, SWT.NONE, null);
-        mFlag.setDisposeImage(false);
-        GridData gd_mFlag = new GridData(SWT.LEFT, SWT.CENTER, false, false, 1, 1);
-        gd_mFlag.exclude = true;
-        gd_mFlag.widthHint = 32;
-        gd_mFlag.horizontalIndent = 3;
-        mFlag.setLayoutData(gd_mFlag);
-
-        mFile = new Label(container, SWT.NONE);
-        mFile.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
-
-        mTableViewer = new MyTableViewer(container, SWT.BORDER | SWT.FULL_SELECTION);
-        mTable = mTableViewer.getTable();
-        mTable.setEnabled(false);
-        mTable.setLinesVisible(true);
-        mTable.setHeaderVisible(true);
-        mTable.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 6, 2));
-        mTable.addControlListener(this);
-        mTable.addTraverseListener(this);
-        // If you have difficulty opening up this form in WindowBuilder and it complains about
-        // the next line, change the type of the mTableViewer field and the above
-        // constructor call from MyTableViewer to TableViewer
-        TableViewerColumn keyViewerColumn = new TableViewerColumn(mTableViewer, SWT.NONE);
-        TableColumn keyColumn = keyViewerColumn.getColumn();
-        keyColumn.setWidth(100);
-        keyColumn.setText("Key");
-        TableViewerColumn defaultViewerColumn = new TableViewerColumn(mTableViewer, SWT.NONE);
-        TableColumn defaultColumn = defaultViewerColumn.getColumn();
-        defaultColumn.setWidth(200);
-        defaultColumn.setText("Default");
-        TableViewerColumn translationViewerColumn = new TableViewerColumn(mTableViewer, SWT.NONE);
-        TableColumn translationColumn = translationViewerColumn.getColumn();
-        translationColumn.setWidth(200);
-        translationColumn.setText("New Translation");
-
-        mErrorPanel = new Composite(container, SWT.NONE);
-        GridData gd_mErrorLabel = new GridData(SWT.FILL, SWT.CENTER, false, false, 6, 1);
-        gd_mErrorLabel.exclude = true;
-        mErrorPanel.setLayoutData(gd_mErrorLabel);
-
-        translationViewerColumn.setEditingSupport(new TranslationEditingSupport(mTableViewer));
-
-        fillLanguages();
-        fillRegions();
-        fillStrings();
-        updateColumnWidths();
-        validatePage();
-
-        mLanguageCombo.addSelectionListener(this);
-        mRegionCombo.addSelectionListener(this);
-
-        return container;
-    }
-
-    /** Populates the table with keys and default strings */
-    private void fillStrings() {
-        ResourceManager manager = ResourceManager.getInstance();
-        ProjectResources resources = manager.getProjectResources(mProject);
-        mExistingLanguages = resources.getLanguages();
-
-        Collection<ResourceItem> items = resources.getResourceItemsOfType(ResourceType.STRING);
-
-        ResourceItem[] array = items.toArray(new ResourceItem[items.size()]);
-        Arrays.sort(array);
-
-        // TODO: Read in the actual XML files providing the default keys here
-        // (they can be obtained via ResourceItem.getSourceFileList())
-        // such that we can read all the attributes associated with each
-        // item, and if it defines translatable=false, or the filename is
-        // donottranslate.xml, we can ignore it, and in other cases just
-        // duplicate all the attributes (such as "formatted=true", or other
-        // local conventions such as "product=tablet", or "msgid="123123123",
-        // etc.)
-
-        mTranslations = Maps.newHashMapWithExpectedSize(items.size());
-        IBaseLabelProvider labelProvider = new CellLabelProvider() {
-            @Override
-            public void update(ViewerCell cell) {
-                Object element = cell.getElement();
-                int index = cell.getColumnIndex();
-                ResourceItem item = (ResourceItem) element;
-                switch (index) {
-                    case KEY_COLUMN: {
-                        // Key
-                        cell.setText(item.getName());
-                        return;
-                    }
-                    case DEFAULT_TRANSLATION_COLUMN: {
-                        // Default translation
-                        ResourceValue value = item.getResourceValue(ResourceType.STRING,
-                                mConfiguration, false);
-
-                        if (value != null) {
-                            cell.setText(value.getValue());
-                            return;
-                        }
-                        break;
-                    }
-                    case NEW_TRANSLATION_COLUMN: {
-                        // New translation
-                        String translation = mTranslations.get(item.getName());
-                        if (translation != null) {
-                            cell.setText(translation);
-                            return;
-                        }
-                        break;
-                    }
-                    default:
-                        assert false : index;
-                }
-                cell.setText("");
-            }
-        };
-
-        mTableViewer.setLabelProvider(labelProvider);
-        mTableViewer.setContentProvider(new ArrayContentProvider());
-        mTableViewer.setInput(array);
-    }
-
-    /** Populate the languages dropdown */
-    private void fillLanguages() {
-        List<String> languageCodes = LocaleManager.getLanguageCodes();
-        List<String> labels = new ArrayList<String>();
-        for (String code : languageCodes) {
-            labels.add(code + ": " + LocaleManager.getLanguageName(code)); //$NON-NLS-1$
-        }
-        Collections.sort(labels);
-        labels.add(0, "(Select)");
-        mLanguageCombo.setItems(labels.toArray(new String[labels.size()]));
-        mLanguageCombo.select(0);
-    }
-
-    /** Populate the regions dropdown */
-    private void fillRegions() {
-        // TODO: When you switch languages, offer some "default" usable options. For example,
-        // when you choose English, offer the countries that use English, and so on. Unfortunately
-        // we don't have good data about this, we'd just need to hardcode a few common cases.
-        List<String> regionCodes = LocaleManager.getRegionCodes();
-        List<String> labels = new ArrayList<String>();
-        for (String code : regionCodes) {
-            labels.add(code + ": " + LocaleManager.getRegionName(code)); //$NON-NLS-1$
-        }
-        Collections.sort(labels);
-        labels.add(0, "Any");
-        mRegionCombo.setItems(labels.toArray(new String[labels.size()]));
-        mRegionCombo.select(0);
-    }
-
-    /** React to resizing by distributing the space evenly between the last two columns */
-    private void updateColumnWidths() {
-        Rectangle r = mTable.getClientArea();
-        int availableWidth = r.width;
-        // Distribute all available space to the last two columns
-        int columnCount = mTable.getColumnCount();
-        for (int i = 0; i < columnCount; i++) {
-            TableColumn column = mTable.getColumn(i);
-            availableWidth -= column.getWidth();
-        }
-        if (availableWidth != 0) {
-            TableColumn column = mTable.getColumn(DEFAULT_TRANSLATION_COLUMN);
-            column.setWidth(column.getWidth() + availableWidth / 2);
-            column = mTable.getColumn(NEW_TRANSLATION_COLUMN);
-            column.setWidth(column.getWidth() + availableWidth / 2 + availableWidth % 2);
-        }
-    }
-
-    @Override
-    protected void createButtonsForButtonBar(Composite parent) {
-        mOkButton = createButton(parent, IDialogConstants.OK_ID, IDialogConstants.OK_LABEL,
-                // Don't make the OK button default as in most dialogs, since when you press
-                // Return thinking you might edit a value it dismisses the dialog instead
-                false);
-        createButton(parent, IDialogConstants.CANCEL_ID, IDialogConstants.CANCEL_LABEL, false);
-        mOkButton.setEnabled(false);
-
-        validatePage();
-    }
-
-    /**
-     * Return the initial size of the dialog.
-     */
-    @Override
-    protected Point getInitialSize() {
-        return new Point(800, 600);
-    }
-
-    private void updateTarget() {
-        if (mSelectedLanguage == null) {
-            mTarget = null;
-            mFile.setText("");
-        } else {
-            String folder = FD_RES + '/' + FD_RES_VALUES + RES_QUALIFIER_SEP + mSelectedLanguage;
-            if (mSelectedRegion != null) {
-                folder = folder + RES_QUALIFIER_SEP + 'r' + mSelectedRegion;
-            }
-            mTarget = folder + "/strings.xml"; //$NON-NLS-1$
-            mFile.setText(String.format("Creating %1$s", mTarget));
-        }
-    }
-
-    private void updateFlag() {
-        if (mSelectedLanguage == null) {
-            // Nothing selected
-            ((GridData) mFlag.getLayoutData()).exclude = true;
-        } else {
-            FlagManager manager = FlagManager.get();
-            Image flag = manager.getFlag(mSelectedLanguage, mSelectedRegion);
-            if (flag != null) {
-                ((GridData) mFlag.getLayoutData()).exclude = false;
-                mFlag.setImage(flag);
-            }
-        }
-
-        mFlag.getParent().layout(true);
-        mFlag.getParent().redraw();
-    }
-
-    /** Actually create the new translation file and write it to disk */
-    private void createTranslation() {
-        List<String> keys = new ArrayList<String>(mTranslations.keySet());
-        Collections.sort(keys);
-
-        StringBuilder sb = new StringBuilder(keys.size() * 120);
-        sb.append("<resources>\n\n");          //$NON-NLS-1$
-        for (String key : keys) {
-            String value = mTranslations.get(key);
-            if (value == null || value.trim().isEmpty()) {
-                continue;
-            }
-            sb.append("    <string name=\"");  //$NON-NLS-1$
-            sb.append(key);
-            sb.append("\">");                  //$NON-NLS-1$
-            sb.append(ValueXmlHelper.escapeResourceString(value));
-            sb.append("</string>\n");          //$NON-NLS-1$
-        }
-        sb.append("\n</resources>");           //$NON-NLS-1$
-
-        IFile file = mProject.getFile(mTarget);
-
-        try {
-            IContainer parent = file.getParent();
-            AdtUtils.ensureExists(parent);
-            InputStream source = new ByteArrayInputStream(sb.toString().getBytes(Charsets.UTF_8));
-            file.create(source, true, new NullProgressMonitor());
-            AdtPlugin.openFile(file, null, true /*showEditorTab*/);
-
-            // Ensure that the project resources updates itself to notice the new language.
-            // In theory, this shouldn't be necessary.
-            ResourceManager manager = ResourceManager.getInstance();
-            IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
-            IFolder folder = root.getFolder(parent.getFullPath());
-            manager.getResourceFolder(folder);
-            RenderPreviewManager.bumpRevision();
-        } catch (CoreException e) {
-            AdtPlugin.log(e, null);
-        }
-    }
-
-    private void validatePage() {
-        if (mOkButton == null) { // Early initialization
-            return;
-        }
-
-        String message = null;
-
-        if (mSelectedLanguage == null) {
-            message = "Select a language";
-        } else if (mExistingLanguages.contains(mSelectedLanguage)) {
-            if (mSelectedRegion == null) {
-                message = String.format("%1$s is already translated in this project",
-                        LocaleManager.getLanguageName(mSelectedLanguage));
-            } else {
-                ResourceManager manager = ResourceManager.getInstance();
-                ProjectResources resources = manager.getProjectResources(mProject);
-                SortedSet<String> regions = resources.getRegions(mSelectedLanguage);
-                if (regions.contains(mSelectedRegion)) {
-                    message = String.format("%1$s (%2$s) is already translated in this project",
-                            LocaleManager.getLanguageName(mSelectedLanguage),
-                            LocaleManager.getRegionName(mSelectedRegion));
-                }
-            }
-        } else {
-            // Require all strings to be translated? No, some of these may not
-            // be translatable (e.g. translatable=false, defined in donottranslate.xml, etc.)
-            //int missing = mTable.getItemCount() - mTranslations.values().size();
-            //if (missing > 0) {
-            //    message = String.format("Missing %1$d translations", missing);
-            //}
-        }
-
-        boolean valid = message == null;
-        mTable.setEnabled(message == null);
-        mOkButton.setEnabled(valid);
-        showError(message);
-    }
-
-    private void showError(String error) {
-        GridData data = (GridData) mErrorPanel.getLayoutData();
-
-        boolean show = error != null;
-        if (show == data.exclude) {
-            if (show) {
-                if (mErrorLabel == null) {
-                    mErrorPanel.setLayout(new GridLayout(2, false));
-                    IWorkbench workbench = PlatformUI.getWorkbench();
-                    ISharedImages sharedImages = workbench.getSharedImages();
-                    String iconName = ISharedImages.IMG_OBJS_ERROR_TSK;
-                    Image image = sharedImages.getImage(iconName);
-                    @SuppressWarnings("unused")
-                    ImageControl icon = new ImageControl(mErrorPanel, SWT.NONE, image);
-
-                    mErrorLabel = new Label(mErrorPanel, SWT.NONE);
-                    mErrorLabel.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false,
-                            1, 1));
-                }
-                mErrorLabel.setText(error);
-            }
-            data.exclude = !show;
-            mErrorPanel.getParent().layout(true);
-        }
-    }
-
-    @Override
-    protected void okPressed() {
-        mTableViewer.applyEditorValue();
-
-        super.okPressed();
-        createTranslation();
-    }
-
-    // ---- Implements ControlListener ----
-
-    @Override
-    public void controlMoved(ControlEvent e) {
-    }
-
-    @Override
-    public void controlResized(ControlEvent e) {
-        if (mIgnore) {
-            return;
-        }
-
-        updateColumnWidths();
-    }
-
-    // ---- Implements SelectionListener ----
-
-    @Override
-    public void widgetSelected(SelectionEvent e) {
-        if (mIgnore) {
-            return;
-        }
-
-        Object source = e.getSource();
-        if (source == mLanguageCombo) {
-            try {
-                mIgnore = true;
-                mRegionCombo.select(0);
-                mSelectedRegion = null;
-            } finally {
-                mIgnore = false;
-            }
-
-            int languageIndex = mLanguageCombo.getSelectionIndex();
-            if (languageIndex == 0) {
-                mSelectedLanguage = null;
-                mRegionCombo.setEnabled(false);
-            } else {
-                // This depends on the label format
-                mSelectedLanguage = mLanguageCombo.getItem(languageIndex).substring(0, 2);
-                mRegionCombo.setEnabled(true);
-            }
-
-            updateTarget();
-            updateFlag();
-        } else if (source == mRegionCombo) {
-            int regionIndex = mRegionCombo.getSelectionIndex();
-            if (regionIndex == 0) {
-                mSelectedRegion = null;
-            } else {
-                mSelectedRegion = mRegionCombo.getItem(regionIndex).substring(0, 2);
-            }
-
-            updateTarget();
-            updateFlag();
-        }
-
-        try {
-            mIgnore = true;
-            validatePage();
-        } finally {
-            mIgnore = false;
-        }
-    }
-
-    @Override
-    public void widgetDefaultSelected(SelectionEvent e) {
-    }
-
-    // ---- TraverseListener ----
-
-    @Override
-    public void keyTraversed(TraverseEvent e) {
-        // If you press Return and we're not cell editing, start editing the current row
-        if (e.detail == SWT.TRAVERSE_RETURN && !mTableViewer.isCellEditorActive()) {
-            int index = mTable.getSelectionIndex();
-            if (index != -1) {
-                Object next = mTable.getItem(index).getData();
-                mTableViewer.editElement(next, NEW_TRANSLATION_COLUMN);
-            }
-        }
-    }
-
-    /** Editing support for the translation column */
-    private class TranslationEditingSupport extends EditingSupport {
-        /**
-         * When true, setValue is being called as part of a default action
-         * (e.g. Return), not due to focus loss
-         */
-        private boolean mDefaultAction;
-
-        private TranslationEditingSupport(ColumnViewer viewer) {
-            super(viewer);
-        }
-
-        @Override
-        protected void setValue(Object element, Object value) {
-            ResourceItem item = (ResourceItem) element;
-            mTranslations.put(item.getName(), value.toString());
-            mTableViewer.update(element, null);
-            validatePage();
-
-            // If the user is pressing Return to finish editing a value (which is
-            // not the only way this method can get called - for example, if you click
-            // outside the cell while editing, the focus loss will also result in
-            // this method getting called), then mDefaultAction is true, and we automatically
-            // start editing the next row.
-            if (mDefaultAction) {
-                mTable.getDisplay().asyncExec(new Runnable() {
-                    @Override
-                    public void run() {
-                        if (!mTable.isDisposed() && !mTableViewer.isCellEditorActive()) {
-                            int index = mTable.getSelectionIndex();
-                            if (index != -1 && index < mTable.getItemCount() - 1) {
-                                Object next = mTable.getItem(index + 1).getData();
-                                mTableViewer.editElement(next, NEW_TRANSLATION_COLUMN);
-                            }
-                        }
-                    }
-                });
-            }
-        }
-
-        @Override
-        protected Object getValue(Object element) {
-            ResourceItem item = (ResourceItem) element;
-            String value = mTranslations.get(item.getName());
-            if (value == null) {
-                return "";
-            }
-            return value;
-        }
-
-        @Override
-        protected CellEditor getCellEditor(Object element) {
-            return new TextCellEditor(mTable) {
-                @Override
-                protected void handleDefaultSelection(SelectionEvent event) {
-                    try {
-                        mDefaultAction = true;
-                        super.handleDefaultSelection(event);
-                    } finally {
-                        mDefaultAction = false;
-                    }
-                }
-            };
-        }
-
-        @Override
-        protected boolean canEdit(Object element) {
-            return true;
-        }
-    }
-
-    private class MyTableViewer extends TableViewer {
-        public MyTableViewer(Composite parent, int style) {
-            super(parent, style);
-        }
-
-        // Make this public so we can call it to ensure values are applied before the dialog
-        // is dismissed in {@link #okPressed}
-        @Override
-        public void applyEditorValue() {
-            super.applyEditorValue();
-        }
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/newxmlfile/ChooseConfigurationPage.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/newxmlfile/ChooseConfigurationPage.java
deleted file mode 100644
index 1d6467e..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/newxmlfile/ChooseConfigurationPage.java
+++ /dev/null
@@ -1,282 +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.eclipse.adt.internal.wizards.newxmlfile;
-
-import com.android.SdkConstants;
-import com.android.ide.common.resources.configuration.ResourceQualifier;
-import com.android.ide.eclipse.adt.AdtConstants;
-import com.android.ide.eclipse.adt.internal.ui.ConfigurationSelector;
-import com.android.ide.eclipse.adt.internal.ui.ConfigurationSelector.ConfigurationState;
-import com.android.ide.eclipse.adt.internal.ui.ConfigurationSelector.SelectorMode;
-import com.android.ide.eclipse.adt.internal.wizards.newxmlfile.NewXmlFileCreationPage.TypeInfo;
-import com.android.ide.eclipse.adt.internal.wizards.newxmlfile.NewXmlFileWizard.Values;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.jface.dialogs.IMessageProvider;
-import org.eclipse.jface.wizard.IWizardPage;
-import org.eclipse.jface.wizard.WizardPage;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Text;
-
-/**
- * Second page of the {@link NewXmlFileWizard}.
- * <p>
- * This page is used for choosing the current configuration or specific resource
- * folder.
- */
-public class ChooseConfigurationPage extends WizardPage {
-    private Values mValues;
-    private Text mWsFolderPathTextField;
-    private ConfigurationSelector mConfigSelector;
-    private boolean mInternalWsFolderPathUpdate;
-    private boolean mInternalConfigSelectorUpdate;
-
-    /** Absolute destination folder root, e.g. "/res/" */
-    static final String RES_FOLDER_ABS = AdtConstants.WS_RESOURCES + AdtConstants.WS_SEP;
-    /** Relative destination folder root, e.g. "res/" */
-    static final String RES_FOLDER_REL = SdkConstants.FD_RESOURCES + AdtConstants.WS_SEP;
-
-    /**
-     * Create the wizard.
-     *
-     * @param values value object holding current wizard state
-     */
-    public ChooseConfigurationPage(NewXmlFileWizard.Values values) {
-        super("chooseConfig");
-        mValues = values;
-        setTitle("Choose Configuration Folder");
-    }
-
-    @Override
-    public void setVisible(boolean visible) {
-        super.setVisible(visible);
-        if (visible) {
-            if (mValues.folderPath != null) {
-                mWsFolderPathTextField.setText(mValues.folderPath);
-            }
-        }
-    }
-
-    @Override
-    public void createControl(Composite parent) {
-        // This UI is maintained with WindowBuilder.
-
-        Composite composite = new Composite(parent, SWT.NULL);
-        composite.setLayout(new GridLayout(2, false /* makeColumnsEqualWidth */));
-        composite.setLayoutData(new GridData(GridData.FILL_BOTH));
-
-        // label before configuration selector
-        Label label = new Label(composite, SWT.NONE);
-        label.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false, 2, 1));
-        label.setText("Optional: Choose a specific configuration to limit the XML to:");
-
-        // configuration selector
-        mConfigSelector = new ConfigurationSelector(composite, SelectorMode.DEFAULT);
-        GridData gd = new GridData(GridData.GRAB_HORIZONTAL | GridData.GRAB_VERTICAL);
-        gd.verticalAlignment = SWT.FILL;
-        gd.horizontalAlignment = SWT.FILL;
-        gd.horizontalSpan = 2;
-        gd.heightHint = ConfigurationSelector.HEIGHT_HINT;
-        mConfigSelector.setLayoutData(gd);
-        mConfigSelector.setOnChangeListener(new ConfigurationChangeListener());
-
-        // Folder name: [text]
-        String tooltip = "The folder where the file will be generated, relative to the project.";
-
-        Label separator = new Label(composite, SWT.SEPARATOR | SWT.HORIZONTAL);
-        GridData gdSeparator = new GridData(SWT.FILL, SWT.CENTER, false, false, 2, 1);
-        gdSeparator.heightHint = 10;
-        separator.setLayoutData(gdSeparator);
-        Label folderLabel = new Label(composite, SWT.NONE);
-        folderLabel.setText("Folder:");
-        folderLabel.setToolTipText(tooltip);
-
-        mWsFolderPathTextField = new Text(composite, SWT.BORDER);
-        mWsFolderPathTextField.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-        mWsFolderPathTextField.setToolTipText(tooltip);
-        mWsFolderPathTextField.addModifyListener(new ModifyListener() {
-            @Override
-            public void modifyText(ModifyEvent e) {
-                onWsFolderPathUpdated();
-            }
-        });
-
-        setControl(composite);
-
-        mConfigSelector.setConfiguration(mValues.configuration);
-    }
-
-    /**
-     * Callback called when the Folder text field is changed, either programmatically
-     * or by the user.
-     */
-    private void onWsFolderPathUpdated() {
-        if (mInternalWsFolderPathUpdate) {
-            return;
-        }
-
-        String wsFolderPath = mWsFolderPathTextField.getText();
-
-        // This is a custom path, we need to sanitize it.
-        // First it should start with "/res/". Then we need to make sure there are no
-        // relative paths, things like "../" or "./" or even "//".
-        wsFolderPath = wsFolderPath.replaceAll("/+\\.\\./+|/+\\./+|//+|\\\\+|^/+", "/");  //$NON-NLS-1$ //$NON-NLS-2$
-        wsFolderPath = wsFolderPath.replaceAll("^\\.\\./+|^\\./+", "");                   //$NON-NLS-1$ //$NON-NLS-2$
-        wsFolderPath = wsFolderPath.replaceAll("/+\\.\\.$|/+\\.$|/+$", "");               //$NON-NLS-1$ //$NON-NLS-2$
-
-        // We get "res/foo" from selections relative to the project when we want a "/res/foo" path.
-        if (wsFolderPath.startsWith(RES_FOLDER_REL)) {
-            wsFolderPath = RES_FOLDER_ABS + wsFolderPath.substring(RES_FOLDER_REL.length());
-
-            mInternalWsFolderPathUpdate = true;
-            mWsFolderPathTextField.setText(wsFolderPath);
-            mInternalWsFolderPathUpdate = false;
-        }
-
-        mValues.folderPath = wsFolderPath;
-
-        if (wsFolderPath.startsWith(RES_FOLDER_ABS)) {
-            wsFolderPath = wsFolderPath.substring(RES_FOLDER_ABS.length());
-
-            int pos = wsFolderPath.indexOf(AdtConstants.WS_SEP_CHAR);
-            if (pos >= 0) {
-                wsFolderPath = wsFolderPath.substring(0, pos);
-            }
-
-            String[] folderSegments = wsFolderPath.split(SdkConstants.RES_QUALIFIER_SEP);
-
-            if (folderSegments.length > 0) {
-                String folderName = folderSegments[0];
-
-                // update config selector
-                mInternalConfigSelectorUpdate = true;
-                mConfigSelector.setConfiguration(folderSegments);
-                mInternalConfigSelectorUpdate = false;
-
-                IWizardPage previous = ((NewXmlFileWizard) getWizard()).getPreviousPage(this);
-                if (previous instanceof NewXmlFileCreationPage) {
-                    NewXmlFileCreationPage p = (NewXmlFileCreationPage) previous;
-                    p.selectTypeFromFolder(folderName);
-                }
-            }
-        }
-
-        validatePage();
-    }
-
-    /**
-     * Callback called when the configuration has changed in the {@link ConfigurationSelector}.
-     */
-    private class ConfigurationChangeListener implements Runnable {
-        @Override
-        public void run() {
-            if (mInternalConfigSelectorUpdate) {
-                return;
-            }
-
-            resetFolderPath(true /*validate*/);
-        }
-    }
-
-    /**
-     * Reset the current Folder path based on the UI selection
-     * @param validate if true, force a call to {@link #validatePage()}.
-     */
-    private void resetFolderPath(boolean validate) {
-        TypeInfo type = mValues.type;
-        if (type != null) {
-            mConfigSelector.getConfiguration(mValues.configuration);
-            StringBuilder sb = new StringBuilder(RES_FOLDER_ABS);
-            sb.append(mValues.configuration.getFolderName(type.getResFolderType()));
-
-            mInternalWsFolderPathUpdate = true;
-            String newPath = sb.toString();
-            mValues.folderPath = newPath;
-            mWsFolderPathTextField.setText(newPath);
-            mInternalWsFolderPathUpdate = false;
-
-            if (validate) {
-                validatePage();
-            }
-        }
-    }
-
-    /**
-     * Returns the destination folder path relative to the project or an empty string.
-     *
-     * @return the currently edited folder
-     */
-    public String getWsFolderPath() {
-        return mWsFolderPathTextField == null ? "" : mWsFolderPathTextField.getText(); //$NON-NLS-1$
-    }
-
-    /**
-     * Validates the fields, displays errors and warnings.
-     * Enables the finish button if there are no errors.
-     */
-    private void validatePage() {
-        String error = null;
-        String warning = null;
-
-        // -- validate folder configuration
-        if (error == null) {
-            ConfigurationState state = mConfigSelector.getState();
-            if (state == ConfigurationState.INVALID_CONFIG) {
-                ResourceQualifier qual = mConfigSelector.getInvalidQualifier();
-                if (qual != null) {
-                    error =
-                      String.format("The qualifier '%1$s' is invalid in the folder configuration.",
-                            qual.getName());
-                }
-            } else if (state == ConfigurationState.REGION_WITHOUT_LANGUAGE) {
-                error = "The Region qualifier requires the Language qualifier.";
-            }
-        }
-
-        // -- validate generated path
-        if (error == null) {
-            String wsFolderPath = getWsFolderPath();
-            if (!wsFolderPath.startsWith(RES_FOLDER_ABS)) {
-                error = String.format("Target folder must start with %1$s.", RES_FOLDER_ABS);
-            }
-        }
-
-        // -- validate destination file doesn't exist
-        if (error == null) {
-            IFile file = mValues.getDestinationFile();
-            if (file != null && file.exists()) {
-                warning = "The destination file already exists";
-            }
-        }
-
-        // -- update UI & enable finish if there's no error
-        setPageComplete(error == null);
-        if (error != null) {
-            setMessage(error, IMessageProvider.ERROR);
-        } else if (warning != null) {
-            setMessage(warning, IMessageProvider.WARNING);
-        } else {
-            setErrorMessage(null);
-            setMessage(null);
-        }
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/newxmlfile/NewXmlFileCreationPage.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/newxmlfile/NewXmlFileCreationPage.java
deleted file mode 100644
index 28fb8c0..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/newxmlfile/NewXmlFileCreationPage.java
+++ /dev/null
@@ -1,1163 +0,0 @@
-/*
- * 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.wizards.newxmlfile;
-
-import static com.android.SdkConstants.DOT_XML;
-import static com.android.SdkConstants.HORIZONTAL_SCROLL_VIEW;
-import static com.android.SdkConstants.LINEAR_LAYOUT;
-import static com.android.SdkConstants.RES_QUALIFIER_SEP;
-import static com.android.SdkConstants.SCROLL_VIEW;
-import static com.android.SdkConstants.VALUE_FILL_PARENT;
-import static com.android.SdkConstants.VALUE_MATCH_PARENT;
-import static com.android.ide.eclipse.adt.AdtConstants.WS_SEP_CHAR;
-import static com.android.ide.eclipse.adt.internal.wizards.newxmlfile.ChooseConfigurationPage.RES_FOLDER_ABS;
-
-import com.android.SdkConstants;
-import com.android.ide.common.resources.configuration.FolderConfiguration;
-import com.android.ide.common.resources.configuration.ResourceQualifier;
-import com.android.ide.eclipse.adt.AdtConstants;
-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.descriptors.DocumentDescriptor;
-import com.android.ide.eclipse.adt.internal.editors.descriptors.ElementDescriptor;
-import com.android.ide.eclipse.adt.internal.editors.descriptors.IDescriptorProvider;
-import com.android.ide.eclipse.adt.internal.project.ProjectChooserHelper;
-import com.android.ide.eclipse.adt.internal.project.ProjectChooserHelper.ProjectCombo;
-import com.android.ide.eclipse.adt.internal.resources.ResourceNameValidator;
-import com.android.ide.eclipse.adt.internal.sdk.AndroidTargetData;
-import com.android.ide.eclipse.adt.internal.sdk.Sdk;
-import com.android.ide.eclipse.adt.internal.sdk.Sdk.TargetChangeListener;
-import com.android.resources.ResourceFolderType;
-import com.android.sdklib.IAndroidTarget;
-import com.android.utils.Pair;
-import com.android.utils.SdkUtils;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jface.dialogs.IMessageProvider;
-import org.eclipse.jface.viewers.ArrayContentProvider;
-import org.eclipse.jface.viewers.ColumnLabelProvider;
-import org.eclipse.jface.viewers.IBaseLabelProvider;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.jface.wizard.WizardPage;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Combo;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.part.FileEditorInput;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.List;
-
-/**
- * This is the first page of the {@link NewXmlFileWizard} which provides the ability to create
- * skeleton XML resources files for Android projects.
- * <p/>
- * This page is used to select the project, resource type and file name.
- */
-class NewXmlFileCreationPage extends WizardPage {
-
-    @Override
-    public void setVisible(boolean visible) {
-        super.setVisible(visible);
-        // Ensure the initial focus is in the Name field; you usually don't need
-        // to edit the default text field (the project name)
-        if (visible && mFileNameTextField != null) {
-            mFileNameTextField.setFocus();
-        }
-
-        validatePage();
-    }
-
-    /**
-     * Information on one type of resource that can be created (e.g. menu, pref, layout, etc.)
-     */
-    static class TypeInfo {
-        private final String mUiName;
-        private final ResourceFolderType mResFolderType;
-        private final String mTooltip;
-        private final Object mRootSeed;
-        private ArrayList<String> mRoots = new ArrayList<String>();
-        private final String mXmlns;
-        private final String mDefaultAttrs;
-        private final String mDefaultRoot;
-        private final int mTargetApiLevel;
-
-        public TypeInfo(String uiName,
-                        String tooltip,
-                        ResourceFolderType resFolderType,
-                        Object rootSeed,
-                        String defaultRoot,
-                        String xmlns,
-                        String defaultAttrs,
-                        int targetApiLevel) {
-            mUiName = uiName;
-            mResFolderType = resFolderType;
-            mTooltip = tooltip;
-            mRootSeed = rootSeed;
-            mDefaultRoot = defaultRoot;
-            mXmlns = xmlns;
-            mDefaultAttrs = defaultAttrs;
-            mTargetApiLevel = targetApiLevel;
-        }
-
-        /** Returns the UI name for the resource type. Unique. Never null. */
-        String getUiName() {
-            return mUiName;
-        }
-
-        /** Returns the tooltip for the resource type. Can be null. */
-        String getTooltip() {
-            return mTooltip;
-        }
-
-        /**
-         * Returns the name of the {@link ResourceFolderType}.
-         * Never null but not necessarily unique,
-         * e.g. two types use  {@link ResourceFolderType#XML}.
-         */
-        String getResFolderName() {
-            return mResFolderType.getName();
-        }
-
-        /**
-         * Returns the matching {@link ResourceFolderType}.
-         * Never null but not necessarily unique,
-         * e.g. two types use  {@link ResourceFolderType#XML}.
-         */
-        ResourceFolderType getResFolderType() {
-            return mResFolderType;
-        }
-
-        /**
-         * Returns the seed used to fill the root element values.
-         * The seed might be either a String, a String array, an {@link ElementDescriptor},
-         * a {@link DocumentDescriptor} or null.
-         */
-        Object getRootSeed() {
-            return mRootSeed;
-        }
-
-        /**
-         * Returns the default root element that should be selected by default. Can be
-         * null.
-         *
-         * @param project the associated project, or null if not known
-         */
-        String getDefaultRoot(IProject project) {
-            return mDefaultRoot;
-        }
-
-        /**
-         * Returns the list of all possible root elements for the resource type.
-         * This can be an empty ArrayList but not null.
-         * <p/>
-         * TODO: the root list SHOULD depend on the currently selected project, to include
-         * custom classes.
-         */
-        ArrayList<String> getRoots() {
-            return mRoots;
-        }
-
-        /**
-         * If the generated resource XML file requires an "android" XMLNS, this should be set
-         * to {@link SdkConstants#NS_RESOURCES}. When it is null, no XMLNS is generated.
-         */
-        String getXmlns() {
-            return mXmlns;
-        }
-
-        /**
-         * When not null, this represent extra attributes that must be specified in the
-         * root element of the generated XML file. When null, no extra attributes are inserted.
-         *
-         * @param project the project to get the attributes for
-         * @param root the selected root element string, never null
-         */
-        String getDefaultAttrs(IProject project, String root) {
-            return mDefaultAttrs;
-        }
-
-        /**
-         * When not null, represents an extra string that should be written inside
-         * the element when constructed
-         *
-         * @param project the project to get the child content for
-         * @param root the chosen root element
-         * @return a string to be written inside the root element, or null if nothing
-         */
-        String getChild(IProject project, String root) {
-            return null;
-        }
-
-        /**
-         * The minimum API level required by the current SDK target to support this feature.
-         *
-         * @return the minimum API level
-         */
-        public int getTargetApiLevel() {
-            return mTargetApiLevel;
-        }
-    }
-
-    /**
-     * TypeInfo, information for each "type" of file that can be created.
-     */
-    private static final TypeInfo[] sTypes = {
-        new TypeInfo(
-                "Layout",                                                   // UI name
-                "An XML file that describes a screen layout.",              // tooltip
-                ResourceFolderType.LAYOUT,                                  // folder type
-                AndroidTargetData.DESCRIPTOR_LAYOUT,                        // root seed
-                LINEAR_LAYOUT,                                              // default root
-                SdkConstants.NS_RESOURCES,                                  // xmlns
-                "",                                                         // not used, see below
-                1                                                           // target API level
-                ) {
-
-                @Override
-                String getDefaultRoot(IProject project) {
-                    // TODO: Use GridLayout by default for new SDKs
-                    // (when we've ironed out all the usability issues)
-                    //Sdk currentSdk = Sdk.getCurrent();
-                    //if (project != null && currentSdk != null) {
-                    //    IAndroidTarget target = currentSdk.getTarget(project);
-                    //    // fill_parent was renamed match_parent in API level 8
-                    //    if (target != null && target.getVersion().getApiLevel() >= 13) {
-                    //        return GRID_LAYOUT;
-                    //    }
-                    //}
-
-                    return LINEAR_LAYOUT;
-                };
-
-                // The default attributes must be determined dynamically since whether
-                // we use match_parent or fill_parent depends on the API level of the
-                // project
-                @Override
-                String getDefaultAttrs(IProject project, String root) {
-                    Sdk currentSdk = Sdk.getCurrent();
-                    String fill = VALUE_FILL_PARENT;
-                    if (currentSdk != null) {
-                        IAndroidTarget target = currentSdk.getTarget(project);
-                        // fill_parent was renamed match_parent in API level 8
-                        if (target != null && target.getVersion().getApiLevel() >= 8) {
-                            fill = VALUE_MATCH_PARENT;
-                        }
-                    }
-
-                    // Only set "vertical" orientation of LinearLayouts by default;
-                    // for GridLayouts for example we want to rely on the real default
-                    // of the layout
-                    String size = String.format(
-                            "android:layout_width=\"%1$s\"\n"        //$NON-NLS-1$
-                            + "android:layout_height=\"%2$s\"",        //$NON-NLS-1$
-                            fill, fill);
-                    if (LINEAR_LAYOUT.equals(root)) {
-                        return "android:orientation=\"vertical\"\n" + size; //$NON-NLS-1$
-                    } else {
-                        return size;
-                    }
-                }
-
-                @Override
-                String getChild(IProject project, String root) {
-                    // Create vertical linear layouts inside new scroll views
-                    if (SCROLL_VIEW.equals(root) || HORIZONTAL_SCROLL_VIEW.equals(root)) {
-                        return "    <LinearLayout "         //$NON-NLS-1$
-                            + getDefaultAttrs(project, root).replace('\n', ' ')
-                            + " android:orientation=\"vertical\"" //$NON-NLS-1$
-                            + "></LinearLayout>\n";         //$NON-NLS-1$
-                    }
-                    return null;
-                }
-        },
-        new TypeInfo("Values",                                              // UI name
-                "An XML file with simple values: colors, strings, dimensions, etc.", // tooltip
-                ResourceFolderType.VALUES,                                  // folder type
-                SdkConstants.TAG_RESOURCES,                                 // root seed
-                null,                                                       // default root
-                null,                                                       // xmlns
-                null,                                                       // default attributes
-                1                                                           // target API level
-                ),
-        new TypeInfo("Drawable",                                            // UI name
-                "An XML file that describes a drawable.",                   // tooltip
-                ResourceFolderType.DRAWABLE,                                // folder type
-                AndroidTargetData.DESCRIPTOR_DRAWABLE,                      // root seed
-                null,                                                       // default root
-                SdkConstants.NS_RESOURCES,                                  // xmlns
-                null,                                                       // default attributes
-                1                                                           // target API level
-                ),
-        new TypeInfo("Menu",                                                // UI name
-                "An XML file that describes an menu.",                      // tooltip
-                ResourceFolderType.MENU,                                    // folder type
-                SdkConstants.TAG_MENU,                                      // root seed
-                null,                                                       // default root
-                SdkConstants.NS_RESOURCES,                                  // xmlns
-                null,                                                       // default attributes
-                1                                                           // target API level
-                ),
-        new TypeInfo("Color List",                                          // UI name
-                "An XML file that describes a color state list.",           // tooltip
-                ResourceFolderType.COLOR,                                   // folder type
-                AndroidTargetData.DESCRIPTOR_COLOR,                         // root seed
-                "selector",  //$NON-NLS-1$                                  // default root
-                SdkConstants.NS_RESOURCES,                                  // xmlns
-                null,                                                       // default attributes
-                1                                                           // target API level
-                ),
-        new TypeInfo("Property Animation",                                  // UI name
-                "An XML file that describes a property animation",          // tooltip
-                ResourceFolderType.ANIMATOR,                                // folder type
-                AndroidTargetData.DESCRIPTOR_ANIMATOR,                      // root seed
-                "set", //$NON-NLS-1$                                        // default root
-                SdkConstants.NS_RESOURCES,                                  // xmlns
-                null,                                                       // default attributes
-                11                                                          // target API level
-                ),
-        new TypeInfo("Tween Animation",                                     // UI name
-                "An XML file that describes a tween animation.",            // tooltip
-                ResourceFolderType.ANIM,                                    // folder type
-                AndroidTargetData.DESCRIPTOR_ANIM,                          // root seed
-                "set", //$NON-NLS-1$                                        // default root
-                null,                                                       // xmlns
-                null,                                                       // default attributes
-                1                                                           // target API level
-                ),
-        new TypeInfo("AppWidget Provider",                                  // UI name
-                "An XML file that describes a widget provider.",            // tooltip
-                ResourceFolderType.XML,                                     // folder type
-                AndroidTargetData.DESCRIPTOR_APPWIDGET_PROVIDER,            // root seed
-                null,                                                       // default root
-                SdkConstants.NS_RESOURCES,                                  // xmlns
-                null,                                                       // default attributes
-                3                                                           // target API level
-                ),
-        new TypeInfo("Preference",                                          // UI name
-                "An XML file that describes preferences.",                  // tooltip
-                ResourceFolderType.XML,                                     // folder type
-                AndroidTargetData.DESCRIPTOR_PREFERENCES,                   // root seed
-                SdkConstants.CLASS_NAME_PREFERENCE_SCREEN,                  // default root
-                SdkConstants.NS_RESOURCES,                                  // xmlns
-                null,                                                       // default attributes
-                1                                                           // target API level
-                ),
-        new TypeInfo("Searchable",                                          // UI name
-                "An XML file that describes a searchable.",                 // tooltip
-                ResourceFolderType.XML,                                     // folder type
-                AndroidTargetData.DESCRIPTOR_SEARCHABLE,                    // root seed
-                null,                                                       // default root
-                SdkConstants.NS_RESOURCES,                                  // xmlns
-                null,                                                       // default attributes
-                1                                                           // target API level
-                ),
-        // Still missing: Interpolator, Raw and Mipmap. Raw should probably never be in
-        // this menu since it's not often used for creating XML files.
-    };
-
-    private NewXmlFileWizard.Values mValues;
-    private ProjectCombo mProjectButton;
-    private Text mFileNameTextField;
-    private Combo mTypeCombo;
-    private IStructuredSelection mInitialSelection;
-    private ResourceFolderType mInitialFolderType;
-    private boolean mInternalTypeUpdate;
-    private TargetChangeListener mSdkTargetChangeListener;
-    private Table mRootTable;
-    private TableViewer mRootTableViewer;
-
-    // --- UI creation ---
-
-    /**
-     * Constructs a new {@link NewXmlFileCreationPage}.
-     * <p/>
-     * Called by {@link NewXmlFileWizard#createMainPage}.
-     */
-    protected NewXmlFileCreationPage(String pageName, NewXmlFileWizard.Values values) {
-        super(pageName);
-        mValues = values;
-        setPageComplete(false);
-    }
-
-    public void setInitialSelection(IStructuredSelection initialSelection) {
-        mInitialSelection = initialSelection;
-    }
-
-    public void setInitialFolderType(ResourceFolderType initialType) {
-        mInitialFolderType = initialType;
-    }
-
-    /**
-     * Called by the parent Wizard to create the UI for this Wizard Page.
-     *
-     * {@inheritDoc}
-     *
-     * @see org.eclipse.jface.dialogs.IDialogPage#createControl(org.eclipse.swt.widgets.Composite)
-     */
-    @Override
-    @SuppressWarnings("unused") // SWT constructors have side effects, they aren't unused
-    public void createControl(Composite parent) {
-        // This UI is maintained with WindowBuilder.
-
-        Composite composite = new Composite(parent, SWT.NULL);
-        composite.setLayout(new GridLayout(2, false /*makeColumnsEqualWidth*/));
-        composite.setLayoutData(new GridData(GridData.FILL_BOTH));
-
-        // label before type radios
-        Label typeLabel = new Label(composite, SWT.NONE);
-        typeLabel.setText("Resource Type:");
-
-        mTypeCombo = new Combo(composite, SWT.DROP_DOWN | SWT.READ_ONLY);
-        mTypeCombo.setToolTipText("What type of resource would you like to create?");
-        mTypeCombo.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-        if (mInitialFolderType != null) {
-            mTypeCombo.setEnabled(false);
-        }
-        mTypeCombo.addSelectionListener(new SelectionAdapter() {
-            @Override
-            public void widgetSelected(SelectionEvent e) {
-                TypeInfo type = getSelectedType();
-                if (type != null) {
-                    onSelectType(type);
-                }
-            }
-        });
-
-        // separator
-        Label separator = new Label(composite, SWT.SEPARATOR | SWT.HORIZONTAL);
-        GridData gd2 = new GridData(GridData.GRAB_HORIZONTAL);
-        gd2.horizontalAlignment = SWT.FILL;
-        gd2.horizontalSpan = 2;
-        separator.setLayoutData(gd2);
-
-        // Project: [button]
-        String tooltip = "The Android Project where the new resource file will be created.";
-        Label projectLabel = new Label(composite, SWT.NONE);
-        projectLabel.setText("Project:");
-        projectLabel.setToolTipText(tooltip);
-
-        ProjectChooserHelper helper =
-                new ProjectChooserHelper(getShell(), null /* filter */);
-
-        mProjectButton = new ProjectCombo(helper, composite, mValues.project);
-        mProjectButton.setToolTipText(tooltip);
-        mProjectButton.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-        mProjectButton.addSelectionListener(new SelectionAdapter() {
-            @Override
-            public void widgetSelected(SelectionEvent e) {
-                IProject project = mProjectButton.getSelectedProject();
-                if (project != mValues.project) {
-                    changeProject(project);
-                }
-            };
-        });
-
-        // Filename: [text]
-        Label fileLabel = new Label(composite, SWT.NONE);
-        fileLabel.setText("File:");
-        fileLabel.setToolTipText("The name of the resource file to create.");
-
-        mFileNameTextField = new Text(composite, SWT.BORDER);
-        mFileNameTextField.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-        mFileNameTextField.setToolTipText(tooltip);
-        mFileNameTextField.addModifyListener(new ModifyListener() {
-            @Override
-            public void modifyText(ModifyEvent e) {
-                mValues.name = mFileNameTextField.getText();
-                validatePage();
-            }
-        });
-
-        // separator
-        Label rootSeparator = new Label(composite, SWT.SEPARATOR | SWT.HORIZONTAL);
-        GridData gd = new GridData(GridData.GRAB_HORIZONTAL);
-        gd.horizontalAlignment = SWT.FILL;
-        gd.horizontalSpan = 2;
-        rootSeparator.setLayoutData(gd);
-
-        // Root Element:
-        // [TableViewer]
-        Label rootLabel = new Label(composite, SWT.NONE);
-        rootLabel.setText("Root Element:");
-        new Label(composite, SWT.NONE);
-
-        mRootTableViewer = new TableViewer(composite, SWT.BORDER | SWT.FULL_SELECTION);
-        mRootTable = mRootTableViewer.getTable();
-        GridData tableGridData = new GridData(SWT.FILL, SWT.FILL, true, true, 2, 1);
-        tableGridData.heightHint = 200;
-        mRootTable.setLayoutData(tableGridData);
-
-        setControl(composite);
-
-        // Update state the first time
-        setErrorMessage(null);
-        setMessage(null);
-
-        initializeFromSelection(mInitialSelection);
-        updateAvailableTypes();
-        initializeFromFixedType();
-        initializeRootValues();
-        installTargetChangeListener();
-
-        initialSelectType();
-        validatePage();
-    }
-
-    private void initialSelectType() {
-        TypeInfo[] types = (TypeInfo[]) mTypeCombo.getData();
-        int typeIndex = getTypeComboIndex(mValues.type);
-        if (typeIndex == -1) {
-            typeIndex = 0;
-        } else {
-            assert mValues.type == types[typeIndex];
-        }
-        mTypeCombo.select(typeIndex);
-        onSelectType(types[typeIndex]);
-        updateRootCombo(types[typeIndex]);
-    }
-
-    private void installTargetChangeListener() {
-        mSdkTargetChangeListener = new TargetChangeListener() {
-            @Override
-            public IProject getProject() {
-                return mValues.project;
-            }
-
-            @Override
-            public void reload() {
-                if (mValues.project != null) {
-                    changeProject(mValues.project);
-                }
-            }
-        };
-
-        AdtPlugin.getDefault().addTargetListener(mSdkTargetChangeListener);
-    }
-
-    @Override
-    public void dispose() {
-
-        if (mSdkTargetChangeListener != null) {
-            AdtPlugin.getDefault().removeTargetListener(mSdkTargetChangeListener);
-            mSdkTargetChangeListener = null;
-        }
-
-        super.dispose();
-    }
-
-    /**
-     * Returns the selected root element string, if any.
-     *
-     * @return The selected root element string or null.
-     */
-    public String getRootElement() {
-        int index = mRootTable.getSelectionIndex();
-        if (index >= 0) {
-            Object[] roots = (Object[]) mRootTableViewer.getInput();
-            return roots[index].toString();
-        }
-        return null;
-    }
-
-    /**
-     * Called by {@link NewXmlFileWizard} to initialize the page with the selection
-     * received by the wizard -- typically the current user workbench selection.
-     * <p/>
-     * Things we expect to find out from the selection:
-     * <ul>
-     * <li>The project name, valid if it's an android nature.</li>
-     * <li>The current folder, valid if it's a folder under /res</li>
-     * <li>An existing filename, in which case the user will be asked whether to override it.</li>
-     * </ul>
-     * <p/>
-     * The selection can also be set to a {@link Pair} of {@link IProject} and a workspace
-     * resource path (where the resource path does not have to exist yet, such as res/anim/).
-     *
-     * @param selection The selection when the wizard was initiated.
-     */
-    private boolean initializeFromSelection(IStructuredSelection selection) {
-        if (selection == null) {
-            return false;
-        }
-
-        // Find the best match in the element list. In case there are multiple selected elements
-        // select the one that provides the most information and assign them a score,
-        // e.g. project=1 + folder=2 + file=4.
-        IProject targetProject = null;
-        String targetWsFolderPath = null;
-        String targetFileName = null;
-        int targetScore = 0;
-        for (Object element : selection.toList()) {
-            if (element instanceof IAdaptable) {
-                IResource res = (IResource) ((IAdaptable) element).getAdapter(IResource.class);
-                IProject project = res != null ? res.getProject() : null;
-
-                // Is this an Android project?
-                try {
-                    if (project == null || !project.hasNature(AdtConstants.NATURE_DEFAULT)) {
-                        continue;
-                    }
-                } catch (CoreException e) {
-                    // checking the nature failed, ignore this resource
-                    continue;
-                }
-
-                int score = 1; // we have a valid project at least
-
-                IPath wsFolderPath = null;
-                String fileName = null;
-                assert res != null; // Eclipse incorrectly thinks res could be null, so tell it no
-                if (res.getType() == IResource.FOLDER) {
-                    wsFolderPath = res.getProjectRelativePath();
-                } else if (res.getType() == IResource.FILE) {
-                    if (SdkUtils.endsWithIgnoreCase(res.getName(), DOT_XML)) {
-                        fileName = res.getName();
-                    }
-                    wsFolderPath = res.getParent().getProjectRelativePath();
-                }
-
-                // Disregard this folder selection if it doesn't point to /res/something
-                if (wsFolderPath != null &&
-                        wsFolderPath.segmentCount() > 1 &&
-                        SdkConstants.FD_RESOURCES.equals(wsFolderPath.segment(0))) {
-                    score += 2;
-                } else {
-                    wsFolderPath = null;
-                    fileName = null;
-                }
-
-                score += fileName != null ? 4 : 0;
-
-                if (score > targetScore) {
-                    targetScore = score;
-                    targetProject = project;
-                    targetWsFolderPath = wsFolderPath != null ? wsFolderPath.toString() : null;
-                    targetFileName = fileName;
-                }
-            } else if (element instanceof Pair<?,?>) {
-                // Pair of Project/String
-                @SuppressWarnings("unchecked")
-                Pair<IProject,String> pair = (Pair<IProject,String>)element;
-                targetScore = 1;
-                targetProject = pair.getFirst();
-                targetWsFolderPath = pair.getSecond();
-                targetFileName = "";
-            }
-        }
-
-        if (targetProject == null) {
-            // Try to figure out the project from the active editor
-            IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
-            if (window != null) {
-                IWorkbenchPage page = window.getActivePage();
-                if (page != null) {
-                    IEditorPart activeEditor = page.getActiveEditor();
-                    if (activeEditor instanceof AndroidXmlEditor) {
-                        Object input = ((AndroidXmlEditor) activeEditor).getEditorInput();
-                        if (input instanceof FileEditorInput) {
-                            FileEditorInput fileInput = (FileEditorInput) input;
-                            targetScore = 1;
-                            IFile file = fileInput.getFile();
-                            targetProject = file.getProject();
-                            IPath path = file.getParent().getProjectRelativePath();
-                            targetWsFolderPath = path != null ? path.toString() : null;
-                        }
-                    }
-                }
-            }
-        }
-
-        if (targetProject == null) {
-            // If we didn't find a default project based on the selection, check how many
-            // open Android projects we can find in the current workspace. If there's only
-            // one, we'll just select it by default.
-            IJavaProject[] projects = AdtUtils.getOpenAndroidProjects();
-            if (projects != null && projects.length == 1) {
-                targetScore = 1;
-                targetProject = projects[0].getProject();
-            }
-        }
-
-        // Now set the UI accordingly
-        if (targetScore > 0) {
-            mValues.project = targetProject;
-            mValues.folderPath = targetWsFolderPath;
-            mProjectButton.setSelectedProject(targetProject);
-            mFileNameTextField.setText(targetFileName != null ? targetFileName : ""); //$NON-NLS-1$
-
-            // If the current selection context corresponds to a specific file type,
-            // select it.
-            if (targetWsFolderPath != null) {
-                int pos = targetWsFolderPath.lastIndexOf(WS_SEP_CHAR);
-                if (pos >= 0) {
-                    targetWsFolderPath = targetWsFolderPath.substring(pos + 1);
-                }
-                String[] folderSegments = targetWsFolderPath.split(RES_QUALIFIER_SEP);
-                if (folderSegments.length > 0) {
-                    mValues.configuration = FolderConfiguration.getConfig(folderSegments);
-                    String folderName = folderSegments[0];
-                    selectTypeFromFolder(folderName);
-                }
-            }
-        }
-
-        return true;
-    }
-
-    private void initializeFromFixedType() {
-        if (mInitialFolderType != null) {
-            for (TypeInfo type : sTypes) {
-                if (type.getResFolderType() == mInitialFolderType) {
-                    mValues.type = type;
-                    updateFolderPath(type);
-                    break;
-                }
-            }
-        }
-    }
-
-    /**
-     * Given a folder name, such as "drawable", select the corresponding type in
-     * the dropdown.
-     */
-    void selectTypeFromFolder(String folderName) {
-        List<TypeInfo> matches = new ArrayList<TypeInfo>();
-        boolean selected = false;
-
-        TypeInfo selectedType = getSelectedType();
-        for (TypeInfo type : sTypes) {
-            if (type.getResFolderName().equals(folderName)) {
-                matches.add(type);
-                selected |= type == selectedType;
-            }
-        }
-
-        if (matches.size() == 1) {
-            // If there's only one match, select it if it's not already selected
-            if (!selected) {
-                selectType(matches.get(0));
-            }
-        } else if (matches.size() > 1) {
-            // There are multiple type candidates for this folder. This can happen
-            // for /res/xml for example. Check to see if one of them is currently
-            // selected. If yes, leave the selection unchanged. If not, deselect all type.
-            if (!selected) {
-                selectType(null);
-            }
-        } else {
-            // Nothing valid was selected.
-            selectType(null);
-        }
-    }
-
-    /**
-     * Initialize the root values of the type infos based on the current framework values.
-     */
-    private void initializeRootValues() {
-        IProject project = mValues.project;
-        for (TypeInfo type : sTypes) {
-            // Clear all the roots for this type
-            ArrayList<String> roots = type.getRoots();
-            if (roots.size() > 0) {
-                roots.clear();
-            }
-
-            // depending of the type of the seed, initialize the root in different ways
-            Object rootSeed = type.getRootSeed();
-
-            if (rootSeed instanceof String) {
-                // The seed is a single string, Add it as-is.
-                roots.add((String) rootSeed);
-            } else if (rootSeed instanceof String[]) {
-                // The seed is an array of strings. Add them as-is.
-                for (String value : (String[]) rootSeed) {
-                    roots.add(value);
-                }
-            } else if (rootSeed instanceof Integer && project != null) {
-                // The seed is a descriptor reference defined in AndroidTargetData.DESCRIPTOR_*
-                // In this case add all the children element descriptors defined, recursively,
-                // and avoid infinite recursion by keeping track of what has already been added.
-
-                // Note: if project is null, the root list will be empty since it has been
-                // cleared above.
-
-                // get the AndroidTargetData from the project
-                IAndroidTarget target = null;
-                AndroidTargetData data = null;
-
-                target = Sdk.getCurrent().getTarget(project);
-                if (target == null) {
-                    // A project should have a target. The target can be missing if the project
-                    // is an old project for which a target hasn't been affected or if the
-                    // target no longer exists in this SDK. Simply log the error and dismiss.
-
-                    AdtPlugin.log(IStatus.INFO,
-                            "NewXmlFile wizard: no platform target for project %s",  //$NON-NLS-1$
-                            project.getName());
-                    continue;
-                } else {
-                    data = Sdk.getCurrent().getTargetData(target);
-
-                    if (data == null) {
-                        // We should have both a target and its data.
-                        // However if the wizard is invoked whilst the platform is still being
-                        // loaded we can end up in a weird case where we have a target but it
-                        // doesn't have any data yet.
-                        // Lets log a warning and silently ignore this root.
-
-                        AdtPlugin.log(IStatus.INFO,
-                              "NewXmlFile wizard: no data for target %s, project %s",  //$NON-NLS-1$
-                              target.getName(), project.getName());
-                        continue;
-                    }
-                }
-
-                IDescriptorProvider provider = data.getDescriptorProvider((Integer)rootSeed);
-                ElementDescriptor descriptor = provider.getDescriptor();
-                if (descriptor != null) {
-                    HashSet<ElementDescriptor> visited = new HashSet<ElementDescriptor>();
-                    initRootElementDescriptor(roots, descriptor, visited);
-                }
-
-                // Sort alphabetically.
-                Collections.sort(roots);
-            }
-        }
-    }
-
-    /**
-     * Helper method to recursively insert all XML names for the given {@link ElementDescriptor}
-     * into the roots array list. Keeps track of visited nodes to avoid infinite recursion.
-     * Also avoids inserting the top {@link DocumentDescriptor} which is generally synthetic
-     * and not a valid root element.
-     */
-    private void initRootElementDescriptor(ArrayList<String> roots,
-            ElementDescriptor desc, HashSet<ElementDescriptor> visited) {
-        if (!(desc instanceof DocumentDescriptor)) {
-            String xmlName = desc.getXmlName();
-            if (xmlName != null && xmlName.length() > 0) {
-                roots.add(xmlName);
-            }
-        }
-
-        visited.add(desc);
-
-        for (ElementDescriptor child : desc.getChildren()) {
-            if (!visited.contains(child)) {
-                initRootElementDescriptor(roots, child, visited);
-            }
-        }
-    }
-
-    /**
-     * Changes mProject to the given new project and update the UI accordingly.
-     * <p/>
-     * Note that this does not check if the new project is the same as the current one
-     * on purpose, which allows a project to be updated when its target has changed or
-     * when targets are loaded in the background.
-     */
-    private void changeProject(IProject newProject) {
-        mValues.project = newProject;
-
-        // enable types based on new API level
-        updateAvailableTypes();
-        initialSelectType();
-
-        // update the folder name based on API level
-        updateFolderPath(mValues.type);
-
-        // update the Type with the new descriptors.
-        initializeRootValues();
-
-        // update the combo
-        updateRootCombo(mValues.type);
-
-        validatePage();
-    }
-
-    private void onSelectType(TypeInfo type) {
-        // Do nothing if this is an internal modification or if the widget has been
-        // deselected.
-        if (mInternalTypeUpdate) {
-            return;
-        }
-
-        mValues.type = type;
-
-        if (type == null) {
-            return;
-        }
-
-        // update the combo
-        updateRootCombo(type);
-
-        // update the folder path
-        updateFolderPath(type);
-
-        validatePage();
-    }
-
-    /** Updates the selected type in the type dropdown control */
-    private void setSelectedType(TypeInfo type) {
-        TypeInfo[] types = (TypeInfo[]) mTypeCombo.getData();
-        if (types != null) {
-            for (int i = 0, n = types.length; i < n; i++) {
-                if (types[i] == type) {
-                    mTypeCombo.select(i);
-                    break;
-                }
-            }
-        }
-    }
-
-    /** Returns the selected type in the type dropdown control */
-    private TypeInfo getSelectedType() {
-        int index = mTypeCombo.getSelectionIndex();
-        if (index != -1) {
-            TypeInfo[] types = (TypeInfo[]) mTypeCombo.getData();
-            return types[index];
-        }
-
-        return null;
-    }
-
-    /** Returns the selected index in the type dropdown control */
-    private int getTypeComboIndex(TypeInfo type) {
-        TypeInfo[] types = (TypeInfo[]) mTypeCombo.getData();
-        for (int i = 0, n = types.length; i < n; i++) {
-            if (type == types[i]) {
-                return i;
-            }
-        }
-
-        return -1;
-    }
-
-    /** Updates the folder path to reflect the given type */
-    private void updateFolderPath(TypeInfo type) {
-        String wsFolderPath = mValues.folderPath;
-        String newPath = null;
-        FolderConfiguration config = mValues.configuration;
-        ResourceQualifier qual = config.getInvalidQualifier();
-        if (qual == null) {
-            // The configuration is valid. Reformat the folder path using the canonical
-            // value from the configuration.
-            newPath = RES_FOLDER_ABS + config.getFolderName(type.getResFolderType());
-        } else {
-            // The configuration is invalid. We still update the path but this time
-            // do it manually on the string.
-            if (wsFolderPath.startsWith(RES_FOLDER_ABS)) {
-                wsFolderPath = wsFolderPath.replaceFirst(
-                        "^(" + RES_FOLDER_ABS +")[^-]*(.*)",         //$NON-NLS-1$ //$NON-NLS-2$
-                        "\\1" + type.getResFolderName() + "\\2");    //$NON-NLS-1$ //$NON-NLS-2$
-            } else {
-                newPath = RES_FOLDER_ABS + config.getFolderName(type.getResFolderType());
-            }
-        }
-
-        if (newPath != null && !newPath.equals(wsFolderPath)) {
-            mValues.folderPath = newPath;
-        }
-    }
-
-    /**
-     * Helper method that fills the values of the "root element" combo box based
-     * on the currently selected type radio button. Also disables the combo is there's
-     * only one choice. Always select the first root element for the given type.
-     *
-     * @param type The currently selected {@link TypeInfo}, or null
-     */
-    private void updateRootCombo(TypeInfo type) {
-        IBaseLabelProvider labelProvider = new ColumnLabelProvider() {
-            @Override
-            public Image getImage(Object element) {
-                return IconFactory.getInstance().getIcon(element.toString());
-            }
-        };
-        mRootTableViewer.setContentProvider(new ArrayContentProvider());
-        mRootTableViewer.setLabelProvider(labelProvider);
-
-        if (type != null) {
-            // get the list of roots. The list can be empty but not null.
-            ArrayList<String> roots = type.getRoots();
-            mRootTableViewer.setInput(roots.toArray());
-
-            int index = 0; // default is to select the first one
-            String defaultRoot = type.getDefaultRoot(mValues.project);
-            if (defaultRoot != null) {
-                index = roots.indexOf(defaultRoot);
-            }
-            mRootTable.select(index < 0 ? 0 : index);
-            mRootTable.showSelection();
-        }
-    }
-
-    /**
-     * Helper method to select the current type in the type dropdown
-     *
-     * @param type The TypeInfo matching the radio button to selected or null to deselect them all.
-     */
-    private void selectType(TypeInfo type) {
-        mInternalTypeUpdate = true;
-        mValues.type = type;
-        if (type == null) {
-            if (mTypeCombo.getSelectionIndex() != -1) {
-                mTypeCombo.deselect(mTypeCombo.getSelectionIndex());
-            }
-        } else {
-            setSelectedType(type);
-        }
-        updateRootCombo(type);
-        mInternalTypeUpdate = false;
-    }
-
-    /**
-     * Add the available types in the type combobox, based on whether they are available
-     * for the current SDK.
-     * <p/>
-     * A type is available either if:
-     * - if mProject is null, API level 1 is considered valid
-     * - if mProject is !null, the project->target->API must be >= to the type's API level.
-     */
-    private void updateAvailableTypes() {
-        IProject project = mValues.project;
-        IAndroidTarget target = project != null ? Sdk.getCurrent().getTarget(project) : null;
-        int currentApiLevel = 1;
-        if (target != null) {
-            currentApiLevel = target.getVersion().getApiLevel();
-        }
-
-        List<String> items = new ArrayList<String>(sTypes.length);
-        List<TypeInfo> types = new ArrayList<TypeInfo>(sTypes.length);
-        for (int i = 0, n = sTypes.length; i < n; i++) {
-            TypeInfo type = sTypes[i];
-            if (type.getTargetApiLevel() <= currentApiLevel) {
-                items.add(type.getUiName());
-                types.add(type);
-            }
-        }
-        mTypeCombo.setItems(items.toArray(new String[items.size()]));
-        mTypeCombo.setData(types.toArray(new TypeInfo[types.size()]));
-    }
-
-    /**
-     * Validates the fields, displays errors and warnings.
-     * Enables the finish button if there are no errors.
-     */
-    private void validatePage() {
-        String error = null;
-        String warning = null;
-
-        // -- validate type
-        TypeInfo type = mValues.type;
-        if (error == null) {
-            if (type == null) {
-                error = "One of the types must be selected (e.g. layout, values, etc.)";
-            }
-        }
-
-        // -- validate project
-        if (mValues.project == null) {
-            error = "Please select an Android project.";
-        }
-
-        // -- validate type API level
-        if (error == null) {
-            IAndroidTarget target = Sdk.getCurrent().getTarget(mValues.project);
-            int currentApiLevel = 1;
-            if (target != null) {
-                currentApiLevel = target.getVersion().getApiLevel();
-            }
-
-            assert type != null;
-            if (type.getTargetApiLevel() > currentApiLevel) {
-                error = "The API level of the selected type (e.g. AppWidget, etc.) is not " +
-                        "compatible with the API level of the project.";
-            }
-        }
-
-        // -- validate filename
-        if (error == null) {
-            String fileName = mValues.getFileName();
-            assert type != null;
-            ResourceFolderType folderType = type.getResFolderType();
-            error = ResourceNameValidator.create(true, folderType).isValid(fileName);
-        }
-
-        // -- validate destination file doesn't exist
-        if (error == null) {
-            IFile file = mValues.getDestinationFile();
-            if (file != null && file.exists()) {
-                warning = "The destination file already exists";
-            }
-        }
-
-        // -- update UI & enable finish if there's no error
-        setPageComplete(error == null);
-        if (error != null) {
-            setMessage(error, IMessageProvider.ERROR);
-        } else if (warning != null) {
-            setMessage(warning, IMessageProvider.WARNING);
-        } else {
-            setErrorMessage(null);
-            setMessage(null);
-        }
-    }
-
-    /**
-     * Returns the {@link TypeInfo} for the given {@link ResourceFolderType}, or null if
-     * not found
-     *
-     * @param folderType the {@link ResourceFolderType} to look for
-     * @return the corresponding {@link TypeInfo}
-     */
-    static TypeInfo getTypeInfo(ResourceFolderType folderType) {
-        for (TypeInfo typeInfo : sTypes) {
-            if (typeInfo.getResFolderType() == folderType) {
-                return typeInfo;
-            }
-        }
-
-        return null;
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/newxmlfile/NewXmlFileWizard.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/newxmlfile/NewXmlFileWizard.java
deleted file mode 100644
index 16cd7b3..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/newxmlfile/NewXmlFileWizard.java
+++ /dev/null
@@ -1,431 +0,0 @@
-/*
- * 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.wizards.newxmlfile;
-
-import static com.android.SdkConstants.FQCN_GRID_LAYOUT;
-import static com.android.SdkConstants.GRID_LAYOUT;
-
-import com.android.SdkConstants;
-import com.android.ide.common.resources.configuration.FolderConfiguration;
-import com.android.ide.common.xml.XmlFormatStyle;
-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.formatting.EclipseXmlFormatPreferences;
-import com.android.ide.eclipse.adt.internal.editors.formatting.EclipseXmlPrettyPrinter;
-import com.android.ide.eclipse.adt.internal.editors.layout.gle2.RenderPreviewManager;
-import com.android.ide.eclipse.adt.internal.editors.manifest.ManifestInfo;
-import com.android.ide.eclipse.adt.internal.preferences.AdtPrefs;
-import com.android.ide.eclipse.adt.internal.project.SupportLibraryHelper;
-import com.android.ide.eclipse.adt.internal.wizards.newxmlfile.NewXmlFileCreationPage.TypeInfo;
-import com.android.resources.ResourceFolderType;
-import com.android.utils.Pair;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.text.IRegion;
-import org.eclipse.jface.text.Region;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.wizard.Wizard;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.INewWizard;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.PartInitException;
-
-import java.io.ByteArrayInputStream;
-import java.io.InputStream;
-import java.io.UnsupportedEncodingException;
-
-/**
- * The "New Android XML File Wizard" provides the ability to create skeleton XML
- * resources files for Android projects.
- * <p/>
- * The wizard has one page, {@link NewXmlFileCreationPage}, used to select the project,
- * the resource folder, resource type and file name. It then creates the XML file.
- */
-public class NewXmlFileWizard extends Wizard implements INewWizard {
-    /** The XML header to write at the top of the XML file */
-    public static final String XML_HEADER_LINE = "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n"; //$NON-NLS-1$
-
-    private static final String PROJECT_LOGO_LARGE = "android-64"; //$NON-NLS-1$
-
-    protected static final String MAIN_PAGE_NAME = "newAndroidXmlFilePage"; //$NON-NLS-1$
-
-    private NewXmlFileCreationPage mMainPage;
-    private ChooseConfigurationPage mConfigPage;
-    private Values mValues;
-
-    @Override
-    public void init(IWorkbench workbench, IStructuredSelection selection) {
-        setHelpAvailable(false); // TODO have help
-        setWindowTitle("New Android XML File");
-        setImageDescriptor();
-
-        mValues = new Values();
-        mMainPage = createMainPage(mValues);
-        mMainPage.setTitle("New Android XML File");
-        mMainPage.setDescription("Creates a new Android XML file.");
-        mMainPage.setInitialSelection(selection);
-
-        mConfigPage = new ChooseConfigurationPage(mValues);
-
-        // Trigger a check to see if the SDK needs to be reloaded (which will
-        // invoke onSdkLoaded asynchronously as needed).
-        AdtPlugin.getDefault().refreshSdk();
-    }
-
-    /**
-     * Creates the wizard page.
-     * <p/>
-     * Please do NOT override this method.
-     * <p/>
-     * This is protected so that it can be overridden by unit tests.
-     * However the contract of this class is private and NO ATTEMPT will be made
-     * to maintain compatibility between different versions of the plugin.
-     */
-    protected NewXmlFileCreationPage createMainPage(NewXmlFileWizard.Values values) {
-        return new NewXmlFileCreationPage(MAIN_PAGE_NAME, values);
-    }
-
-    // -- Methods inherited from org.eclipse.jface.wizard.Wizard --
-    //
-    // The Wizard class implements most defaults and boilerplate code needed by
-    // IWizard
-
-    /**
-     * Adds pages to this wizard.
-     */
-    @Override
-    public void addPages() {
-        addPage(mMainPage);
-        addPage(mConfigPage);
-
-    }
-
-    /**
-     * Performs any actions appropriate in response to the user having pressed
-     * the Finish button, or refuse if finishing now is not permitted: here, it
-     * actually creates the workspace project and then switch to the Java
-     * perspective.
-     *
-     * @return True
-     */
-    @Override
-    public boolean performFinish() {
-        final Pair<IFile, IRegion> created = createXmlFile();
-        if (created == null) {
-            return false;
-        } else {
-            // Open the file
-            // This has to be delayed in order for focus handling to work correctly
-            AdtPlugin.getDisplay().asyncExec(new Runnable() {
-                @Override
-                public void run() {
-                    IFile file = created.getFirst();
-                    IRegion region = created.getSecond();
-                    try {
-                        IEditorPart editor = AdtPlugin.openFile(file, null,
-                                false /*showEditorTab*/);
-                        if (editor instanceof AndroidXmlEditor) {
-                            final AndroidXmlEditor xmlEditor = (AndroidXmlEditor)editor;
-                            if (!xmlEditor.hasMultiplePages()) {
-                                xmlEditor.show(region.getOffset(), region.getLength(),
-                                        true /* showEditorTab */);
-                            }
-                        }
-                    } catch (PartInitException e) {
-                        AdtPlugin.log(e, "Failed to create %1$s: missing type", //$NON-NLS-1$
-                                file.getFullPath().toString());
-                    }
-                }});
-
-            return true;
-        }
-    }
-
-    // -- Custom Methods --
-
-    private Pair<IFile, IRegion> createXmlFile() {
-        IFile file = mValues.getDestinationFile();
-        TypeInfo type = mValues.type;
-        if (type == null) {
-            // this is not expected to happen
-            String name = file.getFullPath().toString();
-            AdtPlugin.log(IStatus.ERROR, "Failed to create %1$s: missing type", name);  //$NON-NLS-1$
-            return null;
-        }
-        String xmlns = type.getXmlns();
-        String root = mMainPage.getRootElement();
-        if (root == null) {
-            // this is not expected to happen
-            AdtPlugin.log(IStatus.ERROR, "Failed to create %1$s: missing root element", //$NON-NLS-1$
-                    file.toString());
-            return null;
-        }
-
-        String attrs = type.getDefaultAttrs(mValues.project, root);
-        String child = type.getChild(mValues.project, root);
-        return createXmlFile(file, xmlns, root, attrs, child, type.getResFolderType());
-    }
-
-    /** Creates a new file using the given root element, namespace and root attributes */
-    private static Pair<IFile, IRegion> createXmlFile(IFile file, String xmlns,
-            String root, String rootAttributes, String child, ResourceFolderType folderType) {
-        String name = file.getFullPath().toString();
-        boolean need_delete = false;
-
-        if (file.exists()) {
-            if (!AdtPlugin.displayPrompt("New Android XML File",
-                String.format("Do you want to overwrite the file %1$s ?", name))) {
-                // abort if user selects cancel.
-                return null;
-            }
-            need_delete = true;
-        } else {
-            AdtUtils.createWsParentDirectory(file.getParent());
-        }
-
-        StringBuilder sb = new StringBuilder(XML_HEADER_LINE);
-
-        if (folderType == ResourceFolderType.LAYOUT && root.equals(GRID_LAYOUT)) {
-            IProject project = file.getParent().getProject();
-            int minSdk = ManifestInfo.get(project).getMinSdkVersion();
-            if (minSdk < 14) {
-                root = SupportLibraryHelper.getTagFor(project, FQCN_GRID_LAYOUT);
-                if (root.equals(FQCN_GRID_LAYOUT)) {
-                    root = GRID_LAYOUT;
-                }
-            }
-        }
-
-        sb.append('<').append(root);
-        if (xmlns != null) {
-            sb.append('\n').append("  xmlns:android=\"").append(xmlns).append('"');  //$NON-NLS-1$
-        }
-
-        if (rootAttributes != null) {
-            sb.append("\n  ");                       //$NON-NLS-1$
-            sb.append(rootAttributes.replace("\n", "\n  "));  //$NON-NLS-1$ //$NON-NLS-2$
-        }
-
-        sb.append(">\n");                            //$NON-NLS-1$
-
-        if (child != null) {
-            sb.append(child);
-        }
-
-        boolean autoFormat = AdtPrefs.getPrefs().getUseCustomXmlFormatter();
-
-        // Insert an indented caret. Since the markup here will be reformatted, we need to
-        // insert text tokens that the formatter will preserve, which we can then turn back
-        // into indentation and a caret offset:
-        final String indentToken = "${indent}"; //$NON-NLS-1$
-        final String caretToken = "${caret}";   //$NON-NLS-1$
-        sb.append(indentToken);
-        sb.append(caretToken);
-        if (!autoFormat) {
-            sb.append('\n');
-        }
-
-        sb.append("</").append(root).append(">\n");  //$NON-NLS-1$ //$NON-NLS-2$
-
-        EclipseXmlFormatPreferences formatPrefs = EclipseXmlFormatPreferences.create();
-        String fileContents;
-        if (!autoFormat) {
-            fileContents = sb.toString();
-        } else {
-            XmlFormatStyle style = EclipseXmlPrettyPrinter.getForFolderType(folderType);
-            fileContents = EclipseXmlPrettyPrinter.prettyPrint(sb.toString(), formatPrefs,
-                    style, null /*lineSeparator*/);
-        }
-
-        // Remove marker tokens and replace them with whitespace
-        fileContents = fileContents.replace(indentToken, formatPrefs.getOneIndentUnit());
-        int caretOffset = fileContents.indexOf(caretToken);
-        if (caretOffset != -1) {
-            fileContents = fileContents.replace(caretToken, ""); //$NON-NLS-1$
-        }
-
-        String error = null;
-        try {
-            byte[] buf = fileContents.getBytes("UTF8");    //$NON-NLS-1$
-            InputStream stream = new ByteArrayInputStream(buf);
-            if (need_delete) {
-                file.delete(IResource.KEEP_HISTORY | IResource.FORCE, null /*monitor*/);
-            }
-            file.create(stream, true /*force*/, null /*progress*/);
-            IRegion region = caretOffset != -1 ? new Region(caretOffset, 0) : null;
-
-            // If you introduced a new locale, or new screen variations etc, ensure that
-            // the list of render previews is updated if necessary
-            if (file.getParent().getName().indexOf('-') != -1
-                    && (folderType == ResourceFolderType.LAYOUT
-                        || folderType == ResourceFolderType.VALUES)) {
-                RenderPreviewManager.bumpRevision();
-            }
-
-            return Pair.of(file, region);
-        } catch (UnsupportedEncodingException e) {
-            error = e.getMessage();
-        } catch (CoreException e) {
-            error = e.getMessage();
-        }
-
-        error = String.format("Failed to generate %1$s: %2$s", name, error);
-        AdtPlugin.displayError("New Android XML File", error);
-        return null;
-    }
-
-    /**
-     * Returns true if the New XML Wizard can create new files of the given
-     * {@link ResourceFolderType}
-     *
-     * @param folderType the folder type to create a file for
-     * @return true if this wizard can create new files for the given folder type
-     */
-    public static boolean canCreateXmlFile(ResourceFolderType folderType) {
-        TypeInfo typeInfo = NewXmlFileCreationPage.getTypeInfo(folderType);
-        return typeInfo != null && (typeInfo.getDefaultRoot(null /*project*/) != null ||
-                typeInfo.getRootSeed() instanceof String);
-    }
-
-    /**
-     * Creates a new XML file using the template according to the given folder type
-     *
-     * @param project the project to create the file in
-     * @param file the file to be created
-     * @param folderType the type of folder to look up a template for
-     * @return the created file
-     */
-    public static Pair<IFile, IRegion> createXmlFile(IProject project, IFile file,
-            ResourceFolderType folderType) {
-        TypeInfo type = NewXmlFileCreationPage.getTypeInfo(folderType);
-        String xmlns = type.getXmlns();
-        String root = type.getDefaultRoot(project);
-        if (root == null) {
-            root = type.getRootSeed().toString();
-        }
-        String attrs = type.getDefaultAttrs(project, root);
-        return createXmlFile(file, xmlns, root, attrs, null, folderType);
-    }
-
-    /**
-     * Returns an image descriptor for the wizard logo.
-     */
-    private void setImageDescriptor() {
-        ImageDescriptor desc = IconFactory.getInstance().getImageDescriptor(PROJECT_LOGO_LARGE);
-        setDefaultPageImageDescriptor(desc);
-    }
-
-    /**
-     * Specific New XML File wizard tied to the {@link ResourceFolderType#LAYOUT} type
-     */
-    public static class NewLayoutWizard extends NewXmlFileWizard {
-        /** Creates a new {@link NewLayoutWizard} */
-        public NewLayoutWizard() {
-        }
-
-        @Override
-        public void init(IWorkbench workbench, IStructuredSelection selection) {
-            super.init(workbench, selection);
-            setWindowTitle("New Android Layout XML File");
-            super.mMainPage.setTitle("New Android Layout XML File");
-            super.mMainPage.setDescription("Creates a new Android Layout XML file.");
-            super.mMainPage.setInitialFolderType(ResourceFolderType.LAYOUT);
-        }
-    }
-
-    /**
-     * Specific New XML File wizard tied to the {@link ResourceFolderType#VALUES} type
-     */
-    public static class NewValuesWizard extends NewXmlFileWizard {
-        /** Creates a new {@link NewValuesWizard} */
-        public NewValuesWizard() {
-        }
-
-        @Override
-        public void init(IWorkbench workbench, IStructuredSelection selection) {
-            super.init(workbench, selection);
-            setWindowTitle("New Android Values XML File");
-            super.mMainPage.setTitle("New Android Values XML File");
-            super.mMainPage.setDescription("Creates a new Android Values XML file.");
-            super.mMainPage.setInitialFolderType(ResourceFolderType.VALUES);
-        }
-    }
-
-    /** Value object which holds the current state of the wizard pages */
-    public static class Values {
-        /** The currently selected project, or null */
-        public IProject project;
-        /** The root name of the XML file to create, or null */
-        public String name;
-        /** The type of XML file to create */
-        public TypeInfo type;
-        /** The path within the project to create the new file in */
-        public String folderPath;
-        /** The currently chosen configuration */
-        public FolderConfiguration configuration = new FolderConfiguration();
-
-        /**
-         * Returns the destination filename or an empty string.
-         *
-         * @return the filename, never null.
-         */
-        public String getFileName() {
-            String fileName;
-            if (name == null) {
-                fileName = ""; //$NON-NLS-1$
-            } else {
-                fileName = name.trim();
-                if (fileName.length() > 0 && fileName.indexOf('.') == -1) {
-                    fileName = fileName + SdkConstants.DOT_XML;
-                }
-            }
-
-            return fileName;
-        }
-
-        /**
-         * Returns a {@link IFile} for the destination file.
-         * <p/>
-         * Returns null if the project, filename or folder are invalid and the
-         * destination file cannot be determined.
-         * <p/>
-         * The {@link IFile} is a resource. There might or might not be an
-         * actual real file.
-         *
-         * @return an {@link IFile} for the destination file
-         */
-        public IFile getDestinationFile() {
-            String fileName = getFileName();
-            if (project != null && folderPath != null && folderPath.length() > 0
-                    && fileName.length() > 0) {
-                IPath dest = new Path(folderPath).append(fileName);
-                IFile file = project.getFile(dest);
-                return file;
-            }
-            return null;
-        }
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/templates/ActivityPage.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/templates/ActivityPage.java
deleted file mode 100644
index ba4aedc..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/templates/ActivityPage.java
+++ /dev/null
@@ -1,326 +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.ide.eclipse.adt.internal.wizards.templates;
-
-import static com.android.ide.eclipse.adt.internal.wizards.templates.NewProjectWizard.CATEGORY_ACTIVITIES;
-import static com.android.ide.eclipse.adt.internal.wizards.templates.NewProjectWizard.CATEGORY_OTHER;
-import static com.android.ide.eclipse.adt.internal.wizards.templates.NewProjectWizard.IS_LAUNCHER;
-import static com.android.ide.eclipse.adt.internal.wizards.templates.TemplateHandler.PREVIEW_PADDING;
-import static com.android.ide.eclipse.adt.internal.wizards.templates.TemplateHandler.PREVIEW_WIDTH;
-
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.ide.eclipse.adt.internal.editors.layout.gle2.ImageControl;
-import com.google.common.collect.Lists;
-import com.google.common.io.Files;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.jface.dialogs.IMessageProvider;
-import org.eclipse.jface.resource.JFaceResources;
-import org.eclipse.jface.wizard.WizardPage;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.List;
-
-import java.io.ByteArrayInputStream;
-import java.io.File;
-import java.io.IOException;
-import java.util.ArrayList;
-
-class ActivityPage extends WizardPage implements SelectionListener {
-    private final NewProjectWizardState mValues;
-    private List mList;
-    private Button mCreateToggle;
-    private java.util.List<File> mTemplates;
-
-    private boolean mIgnore;
-    private boolean mShown;
-    private ImageControl mPreview;
-    private Image mPreviewImage;
-    private boolean mDisposePreviewImage;
-    private Label mHeading;
-    private Label mDescription;
-    private boolean mOnlyActivities;
-    private boolean mAskCreate;
-    private boolean mLauncherActivitiesOnly;
-
-    /**
-     * Create the wizard.
-     */
-    ActivityPage(NewProjectWizardState values, boolean onlyActivities, boolean askCreate) {
-        super("activityPage"); //$NON-NLS-1$
-        mValues = values;
-        mOnlyActivities = onlyActivities;
-        mAskCreate = askCreate;
-
-        if (onlyActivities) {
-            setTitle("Create Activity");
-        } else {
-            setTitle("Create Android Object");
-        }
-        if (onlyActivities && askCreate) {
-            setDescription(
-                    "Select whether to create an activity, and if so, what kind of activity.");
-        } else {
-            setDescription("Select which template to use");
-        }
-    }
-
-    /** Sets whether the activity page should only offer launcher activities */
-    void setLauncherActivitiesOnly(boolean launcherActivitiesOnly) {
-        mLauncherActivitiesOnly = launcherActivitiesOnly;
-    }
-
-    @Override
-    public void createControl(Composite parent) {
-        Composite container = new Composite(parent, SWT.NULL);
-        setControl(container);
-    }
-
-    @SuppressWarnings("unused") // SWT constructors have side effects and aren't unused
-    private void onEnter() {
-        Composite container = (Composite) getControl();
-        container.setLayout(new GridLayout(3, false));
-
-        if (mAskCreate) {
-            mCreateToggle = new Button(container, SWT.CHECK);
-            mCreateToggle.setSelection(true);
-            mCreateToggle.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false, 3, 1));
-            mCreateToggle.setText("Create Activity");
-            mCreateToggle.addSelectionListener(this);
-        }
-
-        mList = new List(container, SWT.BORDER | SWT.V_SCROLL);
-        mList.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 2, 1));
-
-
-        TemplateManager manager = mValues.template.getManager();
-        java.util.List<File> templates = manager.getTemplates(CATEGORY_ACTIVITIES);
-
-        if (!mOnlyActivities) {
-            templates.addAll(manager.getTemplates(CATEGORY_OTHER));
-        }
-        java.util.List<String> names = new ArrayList<String>(templates.size());
-        File current = mValues.activityValues.getTemplateLocation();
-        mTemplates = Lists.newArrayListWithExpectedSize(templates.size());
-        int index = -1;
-        for (int i = 0, n = templates.size(); i < n; i++) {
-            File template = templates.get(i);
-            TemplateMetadata metadata = manager.getTemplate(template);
-            if (metadata == null) {
-                continue;
-            }
-            if (mLauncherActivitiesOnly) {
-                Parameter parameter = metadata.getParameter(IS_LAUNCHER);
-                if (parameter == null) {
-                    continue;
-                }
-            }
-            mTemplates.add(template);
-            names.add(metadata.getTitle());
-            if (template.equals(current)) {
-                index = names.size();
-            }
-        }
-        String[] items = names.toArray(new String[names.size()]);
-        mList.setItems(items);
-        if (index == -1 && !mTemplates.isEmpty()) {
-            mValues.activityValues.setTemplateLocation(mTemplates.get(0));
-            index = 0;
-        }
-        if (index >= 0) {
-            mList.setSelection(index);
-            mList.addSelectionListener(this);
-        }
-
-        // Preview
-        mPreview = new ImageControl(container, SWT.NONE, null);
-        mPreview.setDisposeImage(false); // Handled manually in this class
-        GridData gd_mImage = new GridData(SWT.CENTER, SWT.CENTER, false, false, 1, 1);
-        gd_mImage.widthHint = PREVIEW_WIDTH + 2 * PREVIEW_PADDING;
-        mPreview.setLayoutData(gd_mImage);
-        new Label(container, SWT.NONE);
-
-        mHeading = new Label(container, SWT.NONE);
-        mHeading.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false, 2, 1));
-        new Label(container, SWT.NONE);
-
-        mDescription = new Label(container, SWT.WRAP);
-        mDescription.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, true, false, 2, 1));
-
-        Font font = JFaceResources.getFontRegistry().getBold(JFaceResources.BANNER_FONT);
-        if (font != null) {
-            mHeading.setFont(font);
-        }
-
-        updatePreview();
-    }
-
-    private void updatePreview() {
-        Image oldImage = mPreviewImage;
-        boolean dispose = mDisposePreviewImage;
-        mPreviewImage = null;
-
-        String title = "";
-        String description = "";
-        TemplateHandler handler = mValues.activityValues.getTemplateHandler();
-        TemplateMetadata template = handler.getTemplate();
-        if (template != null) {
-            String thumb = template.getThumbnailPath();
-            if (thumb != null && !thumb.isEmpty()) {
-                File file = new File(mValues.activityValues.getTemplateLocation(),
-                        thumb.replace('/', File.separatorChar));
-                if (file != null) {
-                    try {
-                        byte[] bytes = Files.toByteArray(file);
-                        ByteArrayInputStream input = new ByteArrayInputStream(bytes);
-                        mPreviewImage = new Image(getControl().getDisplay(), input);
-                        mDisposePreviewImage = true;
-                        input.close();
-                    } catch (IOException e) {
-                        AdtPlugin.log(e, null);
-                    }
-                }
-            } else {
-                // Fallback icon
-                mDisposePreviewImage = false;
-                mPreviewImage = TemplateMetadata.getDefaultTemplateIcon();
-            }
-            title = template.getTitle();
-            description = template.getDescription();
-        }
-
-        mHeading.setText(title);
-        mDescription.setText(description);
-        mPreview.setImage(mPreviewImage);
-        mPreview.fitToWidth(PREVIEW_WIDTH);
-
-        if (oldImage != null && dispose) {
-            oldImage.dispose();
-        }
-
-        Composite parent = (Composite) getControl();
-        parent.layout(true, true);
-        parent.redraw();
-    }
-
-    @Override
-    public void dispose() {
-        super.dispose();
-
-        if (mPreviewImage != null && mDisposePreviewImage) {
-            mDisposePreviewImage = false;
-            mPreviewImage.dispose();
-            mPreviewImage = null;
-        }
-    }
-
-    @Override
-    public void setVisible(boolean visible) {
-        if (visible && !mShown) {
-            onEnter();
-        }
-
-        super.setVisible(visible);
-
-        if (visible) {
-            mShown = true;
-            if (mAskCreate) {
-                try {
-                    mIgnore = true;
-                    mCreateToggle.setSelection(mValues.createActivity);
-                } finally {
-                    mIgnore = false;
-                }
-            }
-        }
-
-        validatePage();
-    }
-
-
-    private void validatePage() {
-        IStatus status = null;
-
-        if (mValues.createActivity) {
-            if (mList.getSelectionCount() < 1) {
-                status = new Status(IStatus.ERROR, AdtPlugin.PLUGIN_ID,
-                        "Select an activity type");
-            } else {
-                TemplateHandler templateHandler = mValues.activityValues.getTemplateHandler();
-                status = templateHandler.validateTemplate(mValues.minSdkLevel,
-                        mValues.getBuildApi());
-            }
-        }
-
-        setPageComplete(status == null || status.getSeverity() != IStatus.ERROR);
-        if (status != null) {
-            setMessage(status.getMessage(),
-                    status.getSeverity() == IStatus.ERROR
-                        ? IMessageProvider.ERROR : IMessageProvider.WARNING);
-        } else {
-            setErrorMessage(null);
-            setMessage(null);
-        }
-    }
-
-    @Override
-    public boolean isPageComplete() {
-        // Ensure that the Finish button isn't enabled until
-        // the user has reached and completed this page
-        if (!mShown && mValues.createActivity) {
-            return false;
-        }
-
-        return super.isPageComplete();
-    }
-
-    // ---- Implements SelectionListener ----
-
-    @Override
-    public void widgetSelected(SelectionEvent e) {
-        if (mIgnore) {
-            return;
-        }
-
-        Object source = e.getSource();
-        if (source == mCreateToggle) {
-            mValues.createActivity = mCreateToggle.getSelection();
-            mList.setEnabled(mValues.createActivity);
-        } else if (source == mList) {
-            int index = mList.getSelectionIndex();
-            if (index >= 0 && index < mTemplates.size()) {
-                File template = mTemplates.get(index);
-                mValues.activityValues.setTemplateLocation(template);
-                updatePreview();
-            }
-        }
-
-        validatePage();
-    }
-
-    @Override
-    public void widgetDefaultSelected(SelectionEvent e) {
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/templates/CreateFileChange.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/templates/CreateFileChange.java
deleted file mode 100644
index 3b41c36..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/templates/CreateFileChange.java
+++ /dev/null
@@ -1,107 +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.ide.eclipse.adt.internal.wizards.templates;
-
-import com.android.annotations.NonNull;
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.ide.eclipse.adt.AdtUtils;
-import com.google.common.io.Closeables;
-import com.google.common.io.Files;
-import com.google.common.io.InputSupplier;
-
-import org.eclipse.core.resources.IContainer;
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IFolder;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.OperationCanceledException;
-import org.eclipse.core.runtime.SubProgressMonitor;
-import org.eclipse.ltk.core.refactoring.Change;
-import org.eclipse.ltk.core.refactoring.RefactoringStatus;
-import org.eclipse.ltk.core.refactoring.resource.ResourceChange;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.InputStream;
-import java.net.URI;
-
-/** Change which lazily copies a file */
-public class CreateFileChange extends ResourceChange {
-    private String mName;
-    private final IPath mPath;
-    private final File mSource;
-
-    CreateFileChange(@NonNull String name, @NonNull IPath workspacePath, File source) {
-        mName = name;
-        mPath = workspacePath;
-        mSource = source;
-    }
-
-    @Override
-    protected IResource getModifiedResource() {
-      return ResourcesPlugin.getWorkspace().getRoot().getFile(mPath);
-    }
-
-    @Override
-    public String getName() {
-        return mName;
-    }
-
-    @Override
-    public RefactoringStatus isValid(IProgressMonitor pm)
-            throws CoreException, OperationCanceledException {
-        RefactoringStatus result = new RefactoringStatus();
-        IFile file = ResourcesPlugin.getWorkspace().getRoot().getFile(mPath);
-        URI location = file.getLocationURI();
-        if (location == null) {
-            result.addFatalError("Unknown location " + file.getFullPath().toString());
-            return result;
-        }
-        return result;
-    }
-
-    @SuppressWarnings("resource") // Eclipse doesn't know about Guava's Closeables.closeQuietly
-    @Override
-    public Change perform(IProgressMonitor pm) throws CoreException {
-        InputSupplier<FileInputStream> supplier = Files.newInputStreamSupplier(mSource);
-        InputStream is = null;
-        try {
-            pm.beginTask("Creating file", 3);
-            IFile file = (IFile) getModifiedResource();
-
-            IContainer parent = file.getParent();
-            if (parent != null && !parent.exists()) {
-                IFolder folder = ResourcesPlugin.getWorkspace().getRoot().getFolder(
-                        parent.getFullPath());
-                AdtUtils.ensureExists(folder);
-            }
-
-            is = supplier.getInput();
-            file.create(is, false, new SubProgressMonitor(pm, 1));
-            pm.worked(1);
-        } catch (Exception ioe) {
-            AdtPlugin.log(ioe, null);
-        } finally {
-            Closeables.closeQuietly(is);
-            pm.done();
-        }
-        return null;
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/templates/FmActivityToLayoutMethod.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/templates/FmActivityToLayoutMethod.java
deleted file mode 100644
index fbd50e9..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/templates/FmActivityToLayoutMethod.java
+++ /dev/null
@@ -1,64 +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.ide.eclipse.adt.internal.wizards.templates;
-
-import static com.android.ide.eclipse.adt.internal.wizards.templates.NewProjectPage.ACTIVITY_NAME_SUFFIX;
-import static com.android.ide.eclipse.adt.internal.wizards.templates.NewProjectPage.LAYOUT_NAME_PREFIX;
-
-import com.android.ide.eclipse.adt.AdtUtils;
-
-import freemarker.template.SimpleScalar;
-import freemarker.template.TemplateMethodModel;
-import freemarker.template.TemplateModel;
-import freemarker.template.TemplateModelException;
-
-import java.util.List;
-
-/**
- * Method invoked by FreeMarker to convert an Activity class name into
- * a suitable layout name.
- */
-public class FmActivityToLayoutMethod implements TemplateMethodModel {
-    @Override
-    public TemplateModel exec(List args) throws TemplateModelException {
-        if (args.size() != 1) {
-            throw new TemplateModelException("Wrong arguments");
-        }
-
-        String activityName = args.get(0).toString();
-
-        if (activityName.isEmpty()) {
-            return new SimpleScalar("");
-        }
-
-        // Strip off the end portion of the activity name. The user might be typing
-        // the activity name such that only a portion has been entered so far (e.g.
-        // "MainActivi") and we want to chop off that portion too such that we don't
-        // offer a layout name partially containing the activity suffix (e.g. "main_activi").
-        int suffixStart = activityName.lastIndexOf(ACTIVITY_NAME_SUFFIX.charAt(0));
-        if (suffixStart != -1 && activityName.regionMatches(suffixStart, ACTIVITY_NAME_SUFFIX, 0,
-                activityName.length() - suffixStart)) {
-            activityName = activityName.substring(0, suffixStart);
-        }
-        assert !activityName.endsWith(ACTIVITY_NAME_SUFFIX) : activityName;
-
-        // Convert CamelCase convention used in activity class names to underlined convention
-        // used in layout name:
-        String name = LAYOUT_NAME_PREFIX + AdtUtils.camelCaseToUnderlines(activityName);
-
-        return new SimpleScalar(name);
-    }
-}
\ No newline at end of file
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/templates/FmCamelCaseToUnderscoreMethod.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/templates/FmCamelCaseToUnderscoreMethod.java
deleted file mode 100644
index b855765..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/templates/FmCamelCaseToUnderscoreMethod.java
+++ /dev/null
@@ -1,38 +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.ide.eclipse.adt.internal.wizards.templates;
-
-import com.android.ide.eclipse.adt.AdtUtils;
-
-import freemarker.template.SimpleScalar;
-import freemarker.template.TemplateMethodModel;
-import freemarker.template.TemplateModel;
-import freemarker.template.TemplateModelException;
-
-import java.util.List;
-
-/**
- * Method invoked by FreeMarker to convert an underscore name into a CamelCase name.
- */
-public class FmCamelCaseToUnderscoreMethod implements TemplateMethodModel {
-    @Override
-    public TemplateModel exec(List args) throws TemplateModelException {
-        if (args.size() != 1) {
-            throw new TemplateModelException("Wrong arguments");
-        }
-        return new SimpleScalar(AdtUtils.camelCaseToUnderlines(args.get(0).toString()));
-    }
-}
\ No newline at end of file
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/templates/FmClassNameToResourceMethod.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/templates/FmClassNameToResourceMethod.java
deleted file mode 100644
index 366de9a..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/templates/FmClassNameToResourceMethod.java
+++ /dev/null
@@ -1,67 +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.ide.eclipse.adt.internal.wizards.templates;
-
-import static com.android.ide.eclipse.adt.internal.wizards.templates.NewProjectPage.ACTIVITY_NAME_SUFFIX;
-
-import com.android.ide.eclipse.adt.AdtUtils;
-
-import freemarker.template.SimpleScalar;
-import freemarker.template.TemplateMethodModel;
-import freemarker.template.TemplateModel;
-import freemarker.template.TemplateModelException;
-
-import java.util.List;
-
-/**
- * Similar to {@link FmCamelCaseToUnderscoreMethod}, but strips off common class
- * suffixes such as "Activity", "Fragment", etc.
- */
-public class FmClassNameToResourceMethod implements TemplateMethodModel {
-    @Override
-    public TemplateModel exec(List args) throws TemplateModelException {
-        if (args.size() != 1) {
-            throw new TemplateModelException("Wrong arguments");
-        }
-
-        String name = args.get(0).toString();
-
-        if (name.isEmpty()) {
-            return new SimpleScalar("");
-        }
-
-        name = stripSuffix(name, ACTIVITY_NAME_SUFFIX);
-        name = stripSuffix(name, "Fragment");              //$NON-NLS-1$
-        name = stripSuffix(name, "Service");               //$NON-NLS-1$
-        name = stripSuffix(name, "Provider");              //$NON-NLS-1$
-
-        return new SimpleScalar(AdtUtils.camelCaseToUnderlines(name));
-    }
-
-    // Strip off the end portion of the activity name. The user might be typing
-    // the activity name such that only a portion has been entered so far (e.g.
-    // "MainActivi") and we want to chop off that portion too such that we don't
-    private static String stripSuffix(String name, String suffix) {
-        int suffixStart = name.lastIndexOf(suffix.charAt(0));
-        if (suffixStart != -1 && name.regionMatches(suffixStart, suffix, 0,
-                name.length() - suffixStart)) {
-            name = name.substring(0, suffixStart);
-        }
-        assert !name.endsWith(suffix) : name;
-
-        return name;
-    }
-}
\ No newline at end of file
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/templates/FmEscapeXmlAttributeMethod.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/templates/FmEscapeXmlAttributeMethod.java
deleted file mode 100644
index 21f33b8..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/templates/FmEscapeXmlAttributeMethod.java
+++ /dev/null
@@ -1,40 +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.ide.eclipse.adt.internal.wizards.templates;
-
-import com.android.utils.XmlUtils;
-
-import freemarker.template.SimpleScalar;
-import freemarker.template.TemplateMethodModel;
-import freemarker.template.TemplateModel;
-import freemarker.template.TemplateModelException;
-
-import java.util.List;
-
-/**
- * Method invoked by FreeMarker to escape a string such that it can be used
- * as an XML attribute (escaping ', ", & and <).
- */
-public class FmEscapeXmlAttributeMethod implements TemplateMethodModel {
-    @Override
-    public TemplateModel exec(List args) throws TemplateModelException {
-        if (args.size() != 1) {
-            throw new TemplateModelException("Wrong arguments");
-        }
-        String string = args.get(0).toString();
-        return new SimpleScalar(XmlUtils.toXmlAttributeValue(string));
-    }
-}
\ No newline at end of file
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/templates/FmEscapeXmlStringMethod.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/templates/FmEscapeXmlStringMethod.java
deleted file mode 100644
index 2255653..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/templates/FmEscapeXmlStringMethod.java
+++ /dev/null
@@ -1,43 +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.ide.eclipse.adt.internal.wizards.templates;
-
-import com.android.ide.common.res2.ValueXmlHelper;
-
-import freemarker.template.SimpleScalar;
-import freemarker.template.TemplateMethodModel;
-import freemarker.template.TemplateModel;
-import freemarker.template.TemplateModelException;
-
-import java.util.List;
-
-/**
- * Method invoked by FreeMarker to escape a string such that it can be placed
- * as text in a string resource file.
- * This is similar to {@link FmEscapeXmlTextMethod}, but in addition to escaping
- * &lt; and &amp; it also escapes characters such as quotes necessary for Android
- *{@code <string>} elements.
- */
-public class FmEscapeXmlStringMethod implements TemplateMethodModel {
-    @Override
-    public TemplateModel exec(List args) throws TemplateModelException {
-        if (args.size() != 1) {
-            throw new TemplateModelException("Wrong arguments");
-        }
-        String string = args.get(0).toString();
-        return new SimpleScalar(ValueXmlHelper.escapeResourceString(string));
-    }
-}
\ No newline at end of file
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/templates/FmEscapeXmlTextMethod.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/templates/FmEscapeXmlTextMethod.java
deleted file mode 100644
index 55a4bc8..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/templates/FmEscapeXmlTextMethod.java
+++ /dev/null
@@ -1,40 +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.ide.eclipse.adt.internal.wizards.templates;
-
-import com.android.utils.XmlUtils;
-
-import freemarker.template.SimpleScalar;
-import freemarker.template.TemplateMethodModel;
-import freemarker.template.TemplateModel;
-import freemarker.template.TemplateModelException;
-
-import java.util.List;
-
-/**
- * Method invoked by FreeMarker to escape a string such that it can be used
- * as XML text (escaping < and &, but not ' and " etc).
- */
-public class FmEscapeXmlTextMethod implements TemplateMethodModel {
-    @Override
-    public TemplateModel exec(List args) throws TemplateModelException {
-        if (args.size() != 1) {
-            throw new TemplateModelException("Wrong arguments");
-        }
-        String string = args.get(0).toString();
-        return new SimpleScalar(XmlUtils.toXmlTextValue(string));
-    }
-}
\ No newline at end of file
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/templates/FmExtractLettersMethod.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/templates/FmExtractLettersMethod.java
deleted file mode 100644
index 09fa81c..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/templates/FmExtractLettersMethod.java
+++ /dev/null
@@ -1,45 +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.ide.eclipse.adt.internal.wizards.templates;
-
-import freemarker.template.SimpleScalar;
-import freemarker.template.TemplateMethodModel;
-import freemarker.template.TemplateModel;
-import freemarker.template.TemplateModelException;
-
-import java.util.List;
-
-/**
- * Method invoked by FreeMarker to extract letters from a string; this will remove
- * any whitespace, punctuation and digits.
- */
-public class FmExtractLettersMethod implements TemplateMethodModel {
-    @Override
-    public TemplateModel exec(List args) throws TemplateModelException {
-        if (args.size() != 1) {
-            throw new TemplateModelException("Wrong arguments");
-        }
-        String string = args.get(0).toString();
-        StringBuilder sb = new StringBuilder(string.length());
-        for (int i = 0, n = string.length(); i < n; i++) {
-            char c = string.charAt(i);
-            if (Character.isLetter(c)) {
-                sb.append(c);
-            }
-        }
-        return new SimpleScalar(sb.toString());
-    }
-}
\ No newline at end of file
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/templates/FmLayoutToActivityMethod.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/templates/FmLayoutToActivityMethod.java
deleted file mode 100644
index 6514959..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/templates/FmLayoutToActivityMethod.java
+++ /dev/null
@@ -1,61 +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.ide.eclipse.adt.internal.wizards.templates;
-
-import static com.android.ide.eclipse.adt.AdtUtils.extractClassName;
-import static com.android.ide.eclipse.adt.internal.wizards.templates.NewProjectPage.ACTIVITY_NAME_SUFFIX;
-import static com.android.ide.eclipse.adt.internal.wizards.templates.NewProjectPage.LAYOUT_NAME_PREFIX;
-
-import com.android.ide.eclipse.adt.AdtUtils;
-
-import freemarker.template.SimpleScalar;
-import freemarker.template.TemplateMethodModel;
-import freemarker.template.TemplateModel;
-import freemarker.template.TemplateModelException;
-
-import java.util.List;
-
-/**
- * Method invoked by FreeMarker to convert a layout name into an appropriate
- * Activity class.
- */
-public class FmLayoutToActivityMethod implements TemplateMethodModel {
-    @Override
-    public TemplateModel exec(List args) throws TemplateModelException {
-        if (args.size() != 1) {
-            throw new TemplateModelException("Wrong arguments");
-        }
-
-        String name = args.get(0).toString();
-
-        // Strip off the beginning portion of the layout name. The user might be typing
-        // the activity name such that only a portion has been entered so far (e.g.
-        // "MainActivi") and we want to chop off that portion too such that we don't
-        // offer a layout name partially containing the activity suffix (e.g. "main_activi").
-        if (name.startsWith(LAYOUT_NAME_PREFIX)) {
-            name = name.substring(LAYOUT_NAME_PREFIX.length());
-        }
-
-        name = AdtUtils.underlinesToCamelCase(name);
-        String className = extractClassName(name);
-        if (className == null) {
-            className = "My";
-        }
-        String activityName = className + ACTIVITY_NAME_SUFFIX;
-
-        return new SimpleScalar(activityName);
-    }
-}
\ No newline at end of file
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/templates/FmSlashedPackageNameMethod.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/templates/FmSlashedPackageNameMethod.java
deleted file mode 100644
index 60a6531..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/templates/FmSlashedPackageNameMethod.java
+++ /dev/null
@@ -1,39 +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.ide.eclipse.adt.internal.wizards.templates;
-
-import freemarker.template.SimpleScalar;
-import freemarker.template.TemplateMethodModel;
-import freemarker.template.TemplateModel;
-import freemarker.template.TemplateModelException;
-
-import java.util.List;
-
-/**
- * Method invoked by FreeMarker to convert a package name (foo.bar) into
- * a slashed path (foo/bar)
- */
-public class FmSlashedPackageNameMethod implements TemplateMethodModel {
-
-    @Override
-    public TemplateModel exec(List args) throws TemplateModelException {
-        if (args.size() != 1) {
-            throw new TemplateModelException("Wrong arguments");
-        }
-
-        return new SimpleScalar(args.get(0).toString().replace('.', '/'));
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/templates/FmUnderscoreToCamelCaseMethod.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/templates/FmUnderscoreToCamelCaseMethod.java
deleted file mode 100644
index 26d4fad..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/templates/FmUnderscoreToCamelCaseMethod.java
+++ /dev/null
@@ -1,39 +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.ide.eclipse.adt.internal.wizards.templates;
-
-import com.android.ide.eclipse.adt.AdtUtils;
-
-import freemarker.template.SimpleScalar;
-import freemarker.template.TemplateMethodModel;
-import freemarker.template.TemplateModel;
-import freemarker.template.TemplateModelException;
-
-import java.util.List;
-
-/**
- * Method invoked by FreeMarker to convert a CamelCase word into
- * underscore_names.
- */
-public class FmUnderscoreToCamelCaseMethod implements TemplateMethodModel {
-    @Override
-    public TemplateModel exec(List args) throws TemplateModelException {
-        if (args.size() != 1) {
-            throw new TemplateModelException("Wrong arguments");
-        }
-        return new SimpleScalar(AdtUtils.underlinesToCamelCase(args.get(0).toString()));
-    }
-}
\ No newline at end of file
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/templates/InstallDependencyPage.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/templates/InstallDependencyPage.java
deleted file mode 100644
index d806e79..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/templates/InstallDependencyPage.java
+++ /dev/null
@@ -1,298 +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.ide.eclipse.adt.internal.wizards.templates;
-
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.ide.eclipse.adt.internal.actions.AddSupportJarAction;
-import com.android.utils.Pair;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.jface.dialogs.IMessageProvider;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.jface.wizard.IWizard;
-import org.eclipse.jface.wizard.IWizardPage;
-import org.eclipse.jface.wizard.WizardPage;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Link;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.browser.IWebBrowser;
-
-import java.io.File;
-import java.net.URL;
-import java.util.List;
-
-class InstallDependencyPage extends WizardPage implements SelectionListener {
-    /**
-     * The compatibility library. This is the only library the templates
-     * currently support. The appearance of any other dependency in this
-     * template will be flagged as a validation error (and the user encouraged
-     * to upgrade to a newer ADT
-     */
-    static final String SUPPORT_LIBRARY_NAME = "android-support-v4"; //$NON-NLS-1$
-
-    /** URL containing more info */
-    private static final String URL =
-            "http://developer.android.com/tools/extras/support-library.html"; //$NON-NLS-1$
-
-    private Button mCheckButton;
-    private Button mInstallButton;
-    private Link mLink;
-    private TemplateMetadata mTemplate;
-
-    InstallDependencyPage() {
-        super("dependency"); //$NON-NLS-1$
-        setTitle("Install Dependencies");
-    }
-
-    void setTemplate(TemplateMetadata template) {
-        if (template != mTemplate) {
-            mTemplate = template;
-            if (getControl() != null) {
-                validatePage();
-            }
-        }
-    }
-
-    @Override
-    public void setVisible(boolean visible) {
-        super.setVisible(visible);
-        if (visible) {
-            updateVersionLabels();
-            validatePage();
-        }
-    }
-
-    @Override
-    public void createControl(Composite parent) {
-        Composite container = new Composite(parent, SWT.NULL);
-        setControl(container);
-        container.setLayout(new GridLayout(2, false));
-        // Remaining contents are created lazily, since this page is always added to
-        // the page list, but typically not shown
-
-        Label dependLabel = new Label(container, SWT.WRAP);
-        GridData gd_dependLabel = new GridData(SWT.LEFT, SWT.TOP, true, false, 2, 1);
-        gd_dependLabel.widthHint = NewTemplatePage.WIZARD_PAGE_WIDTH - 50;
-        dependLabel.setLayoutData(gd_dependLabel);
-        dependLabel.setText("This template depends on the Android Support library, which is " +
-                "either not installed, or the template depends on a more recent version than " +
-                "the one you have installed.");
-
-        mLink = new Link(container, SWT.NONE);
-        mLink.setLayoutData(new GridData(SWT.LEFT, SWT.TOP, false, false, 2, 1));
-        mLink.setText("<a href=\"" + URL + "\">" + URL + "</a>"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-        mLink.addSelectionListener(this);
-
-        Label lblNewLabel_1 = new Label(container, SWT.NONE);
-        lblNewLabel_1.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false, 2, 1));
-
-        requiredLabel = new Label(container, SWT.NONE);
-        requiredLabel.setText("Required version:");
-
-        mRequiredVersion = new Label(container, SWT.NONE);
-        mRequiredVersion.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1));
-
-        installedLabel = new Label(container, SWT.NONE);
-        installedLabel.setText("Installed version:");
-
-        mInstalledVersion = new Label(container, SWT.NONE);
-        mInstalledVersion.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1));
-
-        Label lblNewLabel = new Label(container, SWT.NONE);
-        lblNewLabel.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false, 2, 1));
-
-        Label descLabel = new Label(container, SWT.WRAP);
-        GridData gd_descLabel = new GridData(SWT.LEFT, SWT.TOP, true, false, 2, 1);
-        gd_descLabel.widthHint = 550;
-        descLabel.setLayoutData(gd_descLabel);
-        descLabel.setText(
-                "You can install or upgrade it by clicking the Install button below, or " +
-                "alternatively, you can install it outside of Eclipse with the SDK Manager, " +
-                "then click on \"Check Again\" to proceed.");
-
-        mInstallButton = new Button(container, SWT.NONE);
-        mInstallButton.setText("Install/Upgrade");
-        mInstallButton.addSelectionListener(this);
-
-        mCheckButton = new Button(container, SWT.NONE);
-        mCheckButton.setText("Check Again");
-        mCheckButton.addSelectionListener(this);
-
-        mInstallButton.setFocus();
-    }
-
-    private void showNextPage() {
-        validatePage();
-        if (isPageComplete()) {
-            // Finish button will be enabled now
-            mInstallButton.setEnabled(false);
-            mCheckButton.setEnabled(false);
-
-            IWizard wizard = getWizard();
-            IWizardPage next = wizard.getNextPage(this);
-            if (next != null) {
-                wizard.getContainer().showPage(next);
-            }
-        }
-    }
-
-    @Override
-    public boolean isPageComplete() {
-        if (mTemplate == null) {
-            return true;
-        }
-
-        return super.isPageComplete() && isInstalled();
-    }
-
-    private boolean isInstalled() {
-        return isInstalled(mTemplate.getDependencies());
-    }
-
-    static String sCachedName;
-    static int sCachedVersion;
-    private Label requiredLabel;
-    private Label installedLabel;
-    private Label mRequiredVersion;
-    private Label mInstalledVersion;
-
-    public static boolean isInstalled(List<Pair<String, Integer>> dependencies) {
-        for (Pair<String, Integer> dependency : dependencies) {
-            String name = dependency.getFirst();
-            int required = dependency.getSecond();
-
-            int installed = -1;
-            if (SUPPORT_LIBRARY_NAME.equals(name)) {
-                installed = getInstalledSupportLibVersion();
-            }
-
-            if (installed == -1) {
-                return false;
-            }
-            if (required > installed) {
-                return false;
-            }
-        }
-
-        return true;
-    }
-
-    private static int getInstalledSupportLibVersion() {
-        if (SUPPORT_LIBRARY_NAME.equals(sCachedName)) {
-            return sCachedVersion;
-        } else {
-            int version = AddSupportJarAction.getInstalledRevision();
-            sCachedName = SUPPORT_LIBRARY_NAME;
-            sCachedVersion = version;
-            return version;
-        }
-    }
-
-    private void updateVersionLabels() {
-        int version = getInstalledSupportLibVersion();
-        if (version == -1) {
-            mInstalledVersion.setText("Not installed");
-        } else {
-            mInstalledVersion.setText(Integer.toString(version));
-        }
-
-        if (mTemplate != null) {
-            for (Pair<String, Integer> dependency : mTemplate.getDependencies()) {
-                String name = dependency.getFirst();
-                if (name.equals(SUPPORT_LIBRARY_NAME)) {
-                    int required = dependency.getSecond();
-                    mRequiredVersion.setText(Integer.toString(required));
-                    break;
-                }
-            }
-        }
-    }
-
-    private void validatePage() {
-        if (mTemplate == null) {
-            return;
-        }
-
-        IStatus status = null;
-
-        List<Pair<String, Integer>> dependencies = mTemplate.getDependencies();
-        if (dependencies.size() > 1 || dependencies.size() == 1
-                && !dependencies.get(0).getFirst().equals(SUPPORT_LIBRARY_NAME)) {
-            status = new Status(IStatus.WARNING, AdtPlugin.PLUGIN_ID,
-                    "Unsupported template dependency: Upgrade your Android Eclipse plugin");
-        }
-
-        setPageComplete(status == null || status.getSeverity() != IStatus.ERROR);
-        if (status != null) {
-            setMessage(status.getMessage(),
-                    status.getSeverity() == IStatus.ERROR
-                        ? IMessageProvider.ERROR : IMessageProvider.WARNING);
-        } else {
-            setErrorMessage(null);
-            setMessage(null);
-        }
-    }
-
-    // ---- Implements SelectionListener ----
-
-    @Override
-    public void widgetSelected(SelectionEvent e) {
-        Object source = e.getSource();
-        if (source == mCheckButton) {
-            sCachedName = null;
-            if (isInstalled()) {
-                showNextPage();
-            }
-            updateVersionLabels();
-        } else if (source == mInstallButton) {
-            sCachedName = null;
-            for (Pair<String, Integer> dependency : mTemplate.getDependencies()) {
-                String name = dependency.getFirst();
-                if (SUPPORT_LIBRARY_NAME.equals(name)) {
-                    int version = dependency.getSecond();
-                    File installed = AddSupportJarAction.installSupport(version);
-                    if (installed != null) {
-                        showNextPage();
-                    }
-                    updateVersionLabels();
-                }
-            }
-        } else if (source == mLink) {
-            try {
-                IWorkbench workbench = PlatformUI.getWorkbench();
-                IWebBrowser browser = workbench.getBrowserSupport().getExternalBrowser();
-                browser.openURL(new URL(URL));
-            } catch (Exception ex) {
-                String message = String.format("Could not open browser. Vist\n%1$s\ninstead.",
-                        URL);
-                MessageDialog.openError(getShell(), "Browser Error", message);
-            }
-        }
-    }
-
-    @Override
-    public void widgetDefaultSelected(SelectionEvent e) {
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/templates/NewActivityWizard.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/templates/NewActivityWizard.java
deleted file mode 100644
index b33d65b..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/templates/NewActivityWizard.java
+++ /dev/null
@@ -1,187 +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.ide.eclipse.adt.internal.wizards.templates;
-
-import static com.android.ide.eclipse.adt.internal.wizards.templates.NewProjectWizard.ATTR_BUILD_API;
-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_API_LEVEL;
-import static com.android.ide.eclipse.adt.internal.wizards.templates.NewProjectWizard.ATTR_PACKAGE_NAME;
-import static com.android.ide.eclipse.adt.internal.wizards.templates.NewProjectWizard.ATTR_TARGET_API;
-import static org.eclipse.core.resources.IResource.DEPTH_INFINITE;
-
-import com.android.annotations.NonNull;
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.ide.eclipse.adt.AdtUtils;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.jface.operation.IRunnableWithProgress;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.wizard.IWizardPage;
-import org.eclipse.jface.wizard.WizardPage;
-import org.eclipse.ltk.core.refactoring.Change;
-import org.eclipse.ltk.core.refactoring.CompositeChange;
-import org.eclipse.ui.IWorkbench;
-
-import java.lang.reflect.InvocationTargetException;
-import java.util.List;
-import java.util.Set;
-
-/**
- * Wizard for creating new activities. This is a hybrid between a New Project
- * Wizard and a New Template Wizard: it has the "Activity selector" page from
- * the New Project Wizard, which is used to dynamically select a wizard for the
- * second page, but beyond that it runs the normal template wizard when it comes
- * time to create the template.
- */
-public class NewActivityWizard extends TemplateWizard {
-    private NewTemplatePage mTemplatePage;
-    private ActivityPage mActivityPage;
-    private NewProjectWizardState mValues;
-    private NewTemplateWizardState mActivityValues;
-    protected boolean mOnlyActivities;
-
-    /** Creates a new {@link NewActivityWizard} */
-    public NewActivityWizard() {
-        mOnlyActivities = true;
-    }
-
-    @Override
-    protected boolean shouldAddIconPage() {
-        return mActivityValues.getIconState() != null;
-    }
-
-    @Override
-    public void init(IWorkbench workbench, IStructuredSelection selection) {
-        super.init(workbench, selection);
-
-        setWindowTitle(mOnlyActivities ? "New Activity" : "New Android Object");
-
-        mValues = new NewProjectWizardState();
-        mActivityPage = new ActivityPage(mValues, mOnlyActivities, false);
-
-        mActivityValues = mValues.activityValues;
-        List<IProject> projects = AdtUtils.getSelectedProjects(selection);
-        if (projects.size() == 1) {
-            mActivityValues.project = projects.get(0);
-        }
-    }
-
-    @Override
-    public void addPages() {
-        super.addPages();
-        addPage(mActivityPage);
-    }
-
-    @Override
-    public IWizardPage getNextPage(IWizardPage page) {
-        if (page == mActivityPage) {
-            if (mTemplatePage == null) {
-                Set<String> hidden = mActivityValues.hidden;
-                hidden.add(ATTR_PACKAGE_NAME);
-                hidden.add(ATTR_MIN_API);
-                hidden.add(ATTR_MIN_API_LEVEL);
-                hidden.add(ATTR_TARGET_API);
-                hidden.add(ATTR_BUILD_API);
-
-                mTemplatePage = new NewTemplatePage(mActivityValues, true);
-                addPage(mTemplatePage);
-            }
-            return mTemplatePage;
-        } else if (page == mTemplatePage && shouldAddIconPage()) {
-            WizardPage iconPage = getIconPage(mActivityValues.getIconState());
-            mActivityValues.updateIconState(mTemplatePage.getEvaluator());
-            return iconPage;
-        } else if (page == mTemplatePage
-                || shouldAddIconPage() && page == getIconPage(mActivityValues.getIconState())) {
-            TemplateMetadata template = mActivityValues.getTemplateHandler().getTemplate();
-            if (template != null) {
-                if (InstallDependencyPage.isInstalled(template.getDependencies())) {
-                    return getPreviewPage(mActivityValues);
-                } else {
-                    return getDependencyPage(template, true);
-                }
-            }
-        } else {
-            TemplateMetadata template = mActivityValues.getTemplateHandler().getTemplate();
-            if (template != null && page == getDependencyPage(template, false)) {
-                return getPreviewPage(mActivityValues);
-            }
-        }
-
-        return super.getNextPage(page);
-    }
-
-    @Override
-    public boolean canFinish() {
-        // Deal with lazy creation of some pages: these may not be in the page-list yet
-        // since they are constructed lazily, so consider that option here.
-        if (mTemplatePage == null || !mTemplatePage.isPageComplete()) {
-            return false;
-        }
-
-        return super.canFinish();
-    }
-
-    @Override
-    public boolean performFinish(IProgressMonitor monitor) throws InvocationTargetException {
-        boolean success = super.performFinish(monitor);
-
-        if (success) {
-            List<Runnable> finalizingTasks = getFinalizingActions();
-            for (Runnable r : finalizingTasks) {
-                r.run();
-            }
-            return true;
-        }
-        return false;
-    }
-
-    @Override
-    @NonNull
-    protected IProject getProject() {
-        return mActivityValues.project;
-    }
-
-    @Override
-    @NonNull
-    protected List<String> getFilesToOpen() {
-        TemplateHandler activityTemplate = mActivityValues.getTemplateHandler();
-        return activityTemplate.getFilesToOpen();
-    }
-
-    @Override
-    @NonNull
-    protected List<Runnable> getFinalizingActions() {
-        TemplateHandler activityTemplate = mActivityValues.getTemplateHandler();
-        return activityTemplate.getFinalizingActions();
-    }
-
-    @Override
-    protected List<Change> computeChanges() {
-        return mActivityValues.computeChanges();
-    }
-
-    /** Wizard for creating other Android components */
-    public static class OtherWizard extends NewActivityWizard {
-        /** Create new {@link OtherWizard} */
-        public OtherWizard() {
-            mOnlyActivities = false;
-        }
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/templates/NewProjectPage.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/templates/NewProjectPage.java
deleted file mode 100644
index 14f59c0..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/templates/NewProjectPage.java
+++ /dev/null
@@ -1,931 +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.ide.eclipse.adt.internal.wizards.templates;
-
-
-import static com.android.SdkConstants.ATTR_ID;
-import static com.android.ide.eclipse.adt.AdtUtils.extractClassName;
-import static com.android.ide.eclipse.adt.internal.wizards.templates.NewTemplatePage.WIZARD_PAGE_WIDTH;
-
-import com.android.annotations.Nullable;
-import com.android.sdklib.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.ide.eclipse.adt.internal.sdk.Sdk;
-import com.android.ide.eclipse.adt.internal.wizards.newproject.ApplicationInfoPage;
-import com.android.ide.eclipse.adt.internal.wizards.newproject.ProjectNamePage;
-import com.android.sdklib.AndroidVersion;
-import com.android.sdklib.IAndroidTarget;
-import com.google.common.collect.Lists;
-import com.google.common.collect.Maps;
-
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IWorkspace;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.jface.dialogs.IMessageProvider;
-import org.eclipse.jface.fieldassist.ControlDecoration;
-import org.eclipse.jface.fieldassist.FieldDecoration;
-import org.eclipse.jface.fieldassist.FieldDecorationRegistry;
-import org.eclipse.jface.wizard.WizardPage;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.FocusEvent;
-import org.eclipse.swt.events.FocusListener;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Combo;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Text;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-
-/**
- * First wizard page in the "New Project From Template" wizard
- */
-public class NewProjectPage extends WizardPage
-        implements ModifyListener, SelectionListener, FocusListener {
-    private static final int FIELD_WIDTH = 300;
-    private static final String SAMPLE_PACKAGE_PREFIX = "com.example."; //$NON-NLS-1$
-    /** Suffix added by default to activity names */
-    static final String ACTIVITY_NAME_SUFFIX = "Activity";              //$NON-NLS-1$
-    /** Prefix added to default layout names */
-    static final String LAYOUT_NAME_PREFIX = "activity_";               //$NON-NLS-1$
-    private static final int INITIAL_MIN_SDK = 8;
-
-    private final NewProjectWizardState mValues;
-    private Map<String, Integer> mMinNameToApi;
-    private Parameter mThemeParameter;
-    private Combo mThemeCombo;
-
-    private Text mProjectText;
-    private Text mPackageText;
-    private Text mApplicationText;
-    private Combo mMinSdkCombo;
-    private Combo mTargetSdkCombo;
-    private Combo mBuildSdkCombo;
-    private Label mHelpIcon;
-    private Label mTipLabel;
-
-    private boolean mIgnore;
-    private ControlDecoration mApplicationDec;
-    private ControlDecoration mProjectDec;
-    private ControlDecoration mPackageDec;
-    private ControlDecoration mBuildTargetDec;
-    private ControlDecoration mMinSdkDec;
-    private ControlDecoration mTargetSdkDec;
-    private ControlDecoration mThemeDec;
-
-    NewProjectPage(NewProjectWizardState values) {
-        super("newAndroidApp"); //$NON-NLS-1$
-        mValues = values;
-        setTitle("New Android Application");
-        setDescription("Creates a new Android Application");
-    }
-
-    @SuppressWarnings("unused") // SWT constructors have side effects and aren't unused
-    @Override
-    public void createControl(Composite parent) {
-        Composite container = new Composite(parent, SWT.NULL);
-        setControl(container);
-        GridLayout gl_container = new GridLayout(4, false);
-        gl_container.horizontalSpacing = 10;
-        container.setLayout(gl_container);
-
-        Label applicationLabel = new Label(container, SWT.NONE);
-        applicationLabel.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 2, 1));
-        applicationLabel.setText("Application Name:");
-
-        mApplicationText = new Text(container, SWT.BORDER);
-        GridData gdApplicationText = new GridData(SWT.LEFT, SWT.CENTER, true, false, 2, 1);
-        gdApplicationText.widthHint = FIELD_WIDTH;
-        mApplicationText.setLayoutData(gdApplicationText);
-        mApplicationText.addModifyListener(this);
-        mApplicationText.addFocusListener(this);
-        mApplicationDec = createFieldDecoration(mApplicationText,
-                "The application name is shown in the Play Store, as well as in the " +
-                "Manage Application list in Settings.");
-
-        Label projectLabel = new Label(container, SWT.NONE);
-        projectLabel.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 2, 1));
-        projectLabel.setText("Project Name:");
-        mProjectText = new Text(container, SWT.BORDER);
-        GridData gdProjectText = new GridData(SWT.LEFT, SWT.CENTER, true, false, 2, 1);
-        gdProjectText.widthHint = FIELD_WIDTH;
-        mProjectText.setLayoutData(gdProjectText);
-        mProjectText.addModifyListener(this);
-        mProjectText.addFocusListener(this);
-        mProjectDec = createFieldDecoration(mProjectText,
-                "The project name is only used by Eclipse, but must be unique within the " +
-                "workspace. This can typically be the same as the application name.");
-
-        Label packageLabel = new Label(container, SWT.NONE);
-        packageLabel.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 2, 1));
-        packageLabel.setText("Package Name:");
-
-        mPackageText = new Text(container, SWT.BORDER);
-        GridData gdPackageText = new GridData(SWT.LEFT, SWT.CENTER, true, false, 2, 1);
-        gdPackageText.widthHint = FIELD_WIDTH;
-        mPackageText.setLayoutData(gdPackageText);
-        mPackageText.addModifyListener(this);
-        mPackageText.addFocusListener(this);
-        mPackageDec = createFieldDecoration(mPackageText,
-                "The package name must be a unique identifier for your application.\n" +
-                "It is typically not shown to users, but it *must* stay the same " +
-                "for the lifetime of your application; it is how multiple versions " +
-                "of the same application are considered the \"same app\".\nThis is " +
-                "typically the reverse domain name of your organization plus one or " +
-                "more application identifiers, and it must be a valid Java package " +
-                "name.");
-        new Label(container, SWT.NONE);
-
-        new Label(container, SWT.NONE);
-        new Label(container, SWT.NONE);
-        new Label(container, SWT.NONE);
-
-        // Min SDK
-
-        Label minSdkLabel = new Label(container, SWT.NONE);
-        minSdkLabel.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 2, 1));
-        minSdkLabel.setText("Minimum Required SDK:");
-
-        mMinSdkCombo = new Combo(container, SWT.READ_ONLY);
-        GridData gdMinSdkCombo = new GridData(SWT.LEFT, SWT.CENTER, true, false, 1, 1);
-        gdMinSdkCombo.widthHint = FIELD_WIDTH;
-        mMinSdkCombo.setLayoutData(gdMinSdkCombo);
-
-        // Pick most recent platform
-        IAndroidTarget[] targets = getCompilationTargets();
-        mMinNameToApi = Maps.newHashMap();
-        List<String> targetLabels = new ArrayList<String>(targets.length);
-        for (IAndroidTarget target : targets) {
-            String targetLabel;
-            if (target.isPlatform()
-                    && target.getVersion().getApiLevel() <= AdtUtils.getHighestKnownApiLevel()) {
-                targetLabel = AdtUtils.getAndroidName(target.getVersion().getApiLevel());
-            } else {
-                targetLabel = AdtUtils.getTargetLabel(target);
-            }
-            targetLabels.add(targetLabel);
-            mMinNameToApi.put(targetLabel, target.getVersion().getApiLevel());
-        }
-
-        List<String> codeNames = Lists.newArrayList();
-        int buildTargetIndex = -1;
-        for (int i = 0, n = targets.length; i < n; i++) {
-            IAndroidTarget target = targets[i];
-            AndroidVersion version = target.getVersion();
-            int apiLevel = version.getApiLevel();
-            if (version.isPreview()) {
-                String codeName = version.getCodename();
-                String targetLabel = codeName + " Preview";
-                codeNames.add(targetLabel);
-                mMinNameToApi.put(targetLabel, apiLevel);
-            } else if (target.isPlatform()
-                    && (mValues.target == null ||
-                        apiLevel > mValues.target.getVersion().getApiLevel())) {
-                mValues.target = target;
-                buildTargetIndex = i;
-            }
-        }
-        List<String> labels = new ArrayList<String>(24);
-        for (String label : AdtUtils.getKnownVersions()) {
-            labels.add(label);
-        }
-        assert labels.size() >= 15; // *Known* versions to ADT, not installed/available versions
-        for (String codeName : codeNames) {
-            labels.add(codeName);
-        }
-        String[] versions = labels.toArray(new String[labels.size()]);
-        mMinSdkCombo.setItems(versions);
-        if (mValues.target != null && mValues.target.getVersion().isPreview()) {
-            mValues.minSdk = mValues.target.getVersion().getCodename();
-            mMinSdkCombo.setText(mValues.minSdk);
-            mValues.iconState.minSdk = mValues.target.getVersion().getApiLevel();
-            mValues.minSdkLevel = mValues.iconState.minSdk;
-        } else {
-            mMinSdkCombo.select(INITIAL_MIN_SDK - 1);
-            mValues.minSdk = Integer.toString(INITIAL_MIN_SDK);
-            mValues.minSdkLevel = INITIAL_MIN_SDK;
-            mValues.iconState.minSdk = INITIAL_MIN_SDK;
-        }
-        mMinSdkCombo.addSelectionListener(this);
-        mMinSdkCombo.addFocusListener(this);
-        mMinSdkDec = createFieldDecoration(mMinSdkCombo,
-                "Choose the lowest version of Android that your application will support. Lower " +
-                "API levels target more devices, but means fewer features are available. By " +
-                "targeting API 8 and later, you reach approximately 95% of the market.");
-        new Label(container, SWT.NONE);
-
-        // Target SDK
-        Label targetSdkLabel = new Label(container, SWT.NONE);
-        targetSdkLabel.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 2, 1));
-        targetSdkLabel.setText("Target SDK:");
-
-        mTargetSdkCombo = new Combo(container, SWT.READ_ONLY);
-        GridData gdTargetSdkCombo = new GridData(SWT.LEFT, SWT.CENTER, true, false, 1, 1);
-        gdTargetSdkCombo.widthHint = FIELD_WIDTH;
-        mTargetSdkCombo.setLayoutData(gdTargetSdkCombo);
-
-        mTargetSdkCombo.setItems(versions);
-        mTargetSdkCombo.select(mValues.targetSdkLevel - 1);
-
-        mTargetSdkCombo.addSelectionListener(this);
-        mTargetSdkCombo.addFocusListener(this);
-        mTargetSdkDec = createFieldDecoration(mTargetSdkCombo,
-                "Choose the highest API level that the application is known to work with. " +
-                "This attribute informs the system that you have tested against the target " +
-                "version and the system should not enable any compatibility behaviors to " +
-                "maintain your app's forward-compatibility with the target version. " +
-                "The application is still able to run on older versions " +
-                "(down to minSdkVersion). Your application may look dated if you are not " +
-                "targeting the current version.");
-        new Label(container, SWT.NONE);
-
-        // Build Version
-
-        Label buildSdkLabel = new Label(container, SWT.NONE);
-        buildSdkLabel.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 2, 1));
-        buildSdkLabel.setText("Compile With:");
-
-        mBuildSdkCombo = new Combo(container, SWT.READ_ONLY);
-        GridData gdBuildSdkCombo = new GridData(SWT.LEFT, SWT.CENTER, true, false, 1, 1);
-        gdBuildSdkCombo.widthHint = FIELD_WIDTH;
-        mBuildSdkCombo.setLayoutData(gdBuildSdkCombo);
-        mBuildSdkCombo.setData(targets);
-        mBuildSdkCombo.setItems(targetLabels.toArray(new String[targetLabels.size()]));
-        if (buildTargetIndex != -1) {
-            mBuildSdkCombo.select(buildTargetIndex);
-        }
-
-        mBuildSdkCombo.addSelectionListener(this);
-        mBuildSdkCombo.addFocusListener(this);
-        mBuildTargetDec = createFieldDecoration(mBuildSdkCombo,
-                "Choose a target API to compile your code against, from your installed SDKs. " +
-                "This is typically the most recent version, or the first version that supports " +
-                "all the APIs you want to directly access without reflection.");
-        new Label(container, SWT.NONE);
-
-        TemplateMetadata metadata = mValues.template.getTemplate();
-        if (metadata != null) {
-            mThemeParameter = metadata.getParameter("baseTheme"); //$NON-NLS-1$
-            if (mThemeParameter != null && mThemeParameter.element != null) {
-                Label themeLabel = new Label(container, SWT.NONE);
-                themeLabel.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 2, 1));
-                themeLabel.setText("Theme:");
-
-                mThemeCombo = NewTemplatePage.createOptionCombo(mThemeParameter, container,
-                        mValues.parameters, this, this);
-                GridData gdThemeCombo = new GridData(SWT.LEFT, SWT.CENTER, true, false, 1, 1);
-                gdThemeCombo.widthHint = FIELD_WIDTH;
-                mThemeCombo.setLayoutData(gdThemeCombo);
-                new Label(container, SWT.NONE);
-
-                mThemeDec = createFieldDecoration(mThemeCombo,
-                        "Choose the base theme to use for the application");
-            }
-        }
-
-        new Label(container, SWT.NONE);
-        new Label(container, SWT.NONE);
-        new Label(container, SWT.NONE);
-        new Label(container, SWT.NONE);
-
-        Label label = new Label(container, SWT.SEPARATOR | SWT.HORIZONTAL);
-        label.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false, 4, 1));
-
-        mHelpIcon = new Label(container, SWT.NONE);
-        mHelpIcon.setLayoutData(new GridData(SWT.RIGHT, SWT.TOP, false, false, 1, 1));
-        Image icon = IconFactory.getInstance().getIcon("quickfix");
-        mHelpIcon.setImage(icon);
-        mHelpIcon.setVisible(false);
-
-        mTipLabel = new Label(container, SWT.WRAP);
-        mTipLabel.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 3, 1));
-
-        // Reserve space for 4 lines
-        mTipLabel.setText("\n\n\n\n"); //$NON-NLS-1$
-
-        // Reserve enough width to accommodate the various wizard pages up front
-        // (since they are created lazily, and we don't want the wizard to dynamically
-        // resize itself for small size adjustments as each successive page is slightly
-        // larger)
-        Label dummy = new Label(container, SWT.NONE);
-        GridData data = new GridData();
-        data.horizontalSpan = 4;
-        data.widthHint = WIZARD_PAGE_WIDTH;
-        dummy.setLayoutData(data);
-    }
-
-    /**
-     * Updates the theme selection such that it's valid for the current build
-     * and min sdk targets. Also runs {@link #validatePage} in case no valid entry was found.
-     * Does nothing if called on a template that does not supply a theme.
-     */
-    void updateTheme() {
-        if (mThemeParameter != null) {
-            // Pick the highest theme version that works for the current SDK level
-            Parameter parameter = NewTemplatePage.getParameter(mThemeCombo);
-            assert parameter == mThemeParameter;
-            if (parameter != null) {
-                String[] optionIds = (String[]) mThemeCombo.getData(ATTR_ID);
-                for (int index = optionIds.length - 1; index >= 0; index--) {
-                    IStatus status = NewTemplatePage.validateCombo(null, mThemeParameter,
-                            index, mValues.minSdkLevel, mValues.getBuildApi());
-                    if (status == null || status.isOK()) {
-                        String optionId = optionIds[index];
-                        parameter.value = optionId;
-                        parameter.edited = optionId != null && !optionId.toString().isEmpty();
-                        mValues.parameters.put(parameter.id, optionId);
-                        try {
-                            mIgnore = true;
-                            mThemeCombo.select(index);
-                        } finally {
-                            mIgnore = false;
-                        }
-                        break;
-                    }
-                }
-            }
-
-            validatePage();
-        }
-    }
-
-    private IAndroidTarget[] getCompilationTargets() {
-        Sdk current = Sdk.getCurrent();
-        if (current == null) {
-            return new IAndroidTarget[0];
-        }
-        IAndroidTarget[] targets = current.getTargets();
-        List<IAndroidTarget> list = new ArrayList<IAndroidTarget>();
-
-        for (IAndroidTarget target : targets) {
-            if (target.isPlatform() == false &&
-                    (target.getOptionalLibraries() == null ||
-                            target.getOptionalLibraries().length == 0)) {
-                continue;
-            }
-            list.add(target);
-        }
-
-        return list.toArray(new IAndroidTarget[list.size()]);
-    }
-
-    private ControlDecoration createFieldDecoration(Control control, String description) {
-        ControlDecoration dec = new ControlDecoration(control, SWT.LEFT);
-        dec.setMarginWidth(2);
-        FieldDecoration errorFieldIndicator = FieldDecorationRegistry.getDefault().
-           getFieldDecoration(FieldDecorationRegistry.DEC_INFORMATION);
-        dec.setImage(errorFieldIndicator.getImage());
-        dec.setDescriptionText(description);
-        control.setToolTipText(description);
-
-        return dec;
-    }
-
-    @Override
-    public void setVisible(boolean visible) {
-        super.setVisible(visible);
-
-        // DURING DEVELOPMENT ONLY
-        //if (assertionsEnabled()) {
-        //    String uniqueProjectName = AdtUtils.getUniqueProjectName("Test", "");
-        //    mProjectText.setText(uniqueProjectName);
-        //    mPackageText.setText("test.pkg");
-        //}
-
-        validatePage();
-    }
-
-    // ---- Implements ModifyListener ----
-
-    @Override
-    public void modifyText(ModifyEvent e) {
-        if (mIgnore) {
-            return;
-        }
-
-        Object source = e.getSource();
-        if (source == mProjectText) {
-            mValues.projectName = mProjectText.getText();
-            updateProjectLocation(mValues.projectName);
-            mValues.projectModified = true;
-
-            try {
-                mIgnore = true;
-                if (!mValues.applicationModified) {
-                    mValues.applicationName = mValues.projectName;
-                    mApplicationText.setText(mValues.projectName);
-                }
-                updateActivityNames(mValues.projectName);
-            } finally {
-                mIgnore = false;
-            }
-            suggestPackage(mValues.projectName);
-        } else if (source == mPackageText) {
-            mValues.packageName = mPackageText.getText();
-            mValues.packageModified = true;
-        } else if (source == mApplicationText) {
-            mValues.applicationName = mApplicationText.getText();
-            mValues.applicationModified = true;
-
-            try {
-                mIgnore = true;
-                if (!mValues.projectModified) {
-                    mValues.projectName = appNameToProjectName(mValues.applicationName);
-                    mProjectText.setText(mValues.projectName);
-                    updateProjectLocation(mValues.projectName);
-                }
-                updateActivityNames(mValues.applicationName);
-            } finally {
-                mIgnore = false;
-            }
-            suggestPackage(mValues.applicationName);
-        }
-
-        validatePage();
-    }
-
-    private String appNameToProjectName(String appName) {
-        // Strip out whitespace (and capitalize subsequent words where spaces were removed
-        boolean upcaseNext = false;
-        StringBuilder sb = new StringBuilder(appName.length());
-        for (int i = 0, n = appName.length(); i < n; i++) {
-            char c = appName.charAt(i);
-            if (c == ' ') {
-                upcaseNext = true;
-            } else if (upcaseNext) {
-                sb.append(Character.toUpperCase(c));
-                upcaseNext = false;
-            } else {
-                sb.append(c);
-            }
-        }
-
-        appName = sb.toString().trim();
-
-        IWorkspace workspace = ResourcesPlugin.getWorkspace();
-        IStatus nameStatus = workspace.validateName(appName, IResource.PROJECT);
-        if (nameStatus.isOK()) {
-            return appName;
-        }
-
-        sb = new StringBuilder(appName.length());
-        for (int i = 0, n = appName.length(); i < n; i++) {
-            char c = appName.charAt(i);
-            if (Character.isLetterOrDigit(c) || c == '.' || c == '-') {
-                sb.append(c);
-            }
-        }
-
-        return sb.toString().trim();
-    }
-
-    /** If the project should be created in the workspace, then update the project location
-     * based on the project name. */
-    private void updateProjectLocation(String projectName) {
-        if (projectName == null) {
-            projectName = "";
-        }
-
-        if (mValues.useDefaultLocation) {
-            IPath workspace = Platform.getLocation();
-            String projectLocation = workspace.append(projectName).toOSString();
-            mValues.projectLocation = projectLocation;
-        }
-    }
-
-    private void updateActivityNames(String name) {
-        try {
-            mIgnore = true;
-            if (!mValues.activityNameModified) {
-                mValues.activityName = extractClassName(name) + ACTIVITY_NAME_SUFFIX;
-            }
-            if (!mValues.activityTitleModified) {
-                mValues.activityTitle = name;
-            }
-        } finally {
-            mIgnore = false;
-        }
-    }
-
-    // ---- Implements SelectionListener ----
-
-    @Override
-    public void widgetSelected(SelectionEvent e) {
-        if (mIgnore) {
-            return;
-        }
-
-        Object source = e.getSource();
-        if (source == mMinSdkCombo) {
-            mValues.minSdk = getSelectedMinSdk();
-            Integer minSdk = mMinNameToApi.get(mValues.minSdk);
-            if (minSdk == null) {
-                try {
-                    minSdk = Integer.parseInt(mValues.minSdk);
-                } catch (NumberFormatException nufe) {
-                    // If not a number, then the string is a codename, so treat it
-                    // as a preview version.
-                    minSdk = SdkVersionInfo.HIGHEST_KNOWN_API + 1;
-                }
-            }
-            mValues.iconState.minSdk = minSdk.intValue();
-            mValues.minSdkLevel = minSdk.intValue();
-
-            // If higher than build target, adjust build target
-            if (mValues.minSdkLevel > mValues.getBuildApi()) {
-                // Try to find a build target with an adequate build API
-                IAndroidTarget[] targets = (IAndroidTarget[]) mBuildSdkCombo.getData();
-                IAndroidTarget best = null;
-                int bestApi = Integer.MAX_VALUE;
-                int bestTargetIndex = -1;
-                for (int i = 0; i < targets.length; i++) {
-                    IAndroidTarget target = targets[i];
-                    if (!target.isPlatform()) {
-                        continue;
-                    }
-                    int api = target.getVersion().getApiLevel();
-                    if (api >= mValues.minSdkLevel && api < bestApi) {
-                        best = target;
-                        bestApi = api;
-                        bestTargetIndex = i;
-                    }
-                }
-
-                if (best != null) {
-                    assert bestTargetIndex != -1;
-                    mValues.target = best;
-                    try {
-                        mIgnore = true;
-                        mBuildSdkCombo.select(bestTargetIndex);
-                    } finally {
-                        mIgnore = false;
-                    }
-                }
-            }
-
-            // If higher than targetSdkVersion, adjust targetSdkVersion
-            if (mValues.minSdkLevel > mValues.targetSdkLevel) {
-                mValues.targetSdkLevel = mValues.minSdkLevel;
-                try {
-                    mIgnore = true;
-                    setSelectedTargetSdk(mValues.targetSdkLevel);
-                } finally {
-                    mIgnore = false;
-                }
-            }
-        } else if (source == mBuildSdkCombo) {
-            mValues.target = getSelectedBuildTarget();
-
-            // If lower than min sdk target, adjust min sdk target
-            if (mValues.target.getVersion().isPreview()) {
-                mValues.minSdk = mValues.target.getVersion().getCodename();
-                try {
-                    mIgnore = true;
-                    mMinSdkCombo.setText(mValues.minSdk);
-                } finally {
-                    mIgnore = false;
-                }
-            } else {
-                String minSdk = mValues.minSdk;
-                int buildApiLevel = mValues.target.getVersion().getApiLevel();
-                if (minSdk != null && !minSdk.isEmpty()
-                        && Character.isDigit(minSdk.charAt(0))
-                        && buildApiLevel < Integer.parseInt(minSdk)) {
-                    mValues.minSdk = Integer.toString(buildApiLevel);
-                    try {
-                        mIgnore = true;
-                        setSelectedMinSdk(buildApiLevel);
-                    } finally {
-                        mIgnore = false;
-                    }
-                }
-            }
-        } else if (source == mTargetSdkCombo) {
-            mValues.targetSdkLevel = getSelectedTargetSdk();
-        }
-
-        validatePage();
-    }
-
-    private String getSelectedMinSdk() {
-        // If you're using a preview build, such as android-JellyBean, you have
-        // to use the codename, e.g. JellyBean, as the minimum SDK as well.
-        IAndroidTarget buildTarget = getSelectedBuildTarget();
-        if (buildTarget != null && buildTarget.getVersion().isPreview()) {
-            return buildTarget.getVersion().getCodename();
-        }
-
-        // +1: First API level (at index 0) is 1
-        return Integer.toString(mMinSdkCombo.getSelectionIndex() + 1);
-    }
-
-    private int getSelectedTargetSdk() {
-        // +1: First API level (at index 0) is 1
-        return mTargetSdkCombo.getSelectionIndex() + 1;
-    }
-
-    private void setSelectedMinSdk(int api) {
-        mMinSdkCombo.select(api - 1); // -1: First API level (at index 0) is 1
-    }
-
-    private void setSelectedTargetSdk(int api) {
-        mTargetSdkCombo.select(api - 1); // -1: First API level (at index 0) is 1
-    }
-
-    @Nullable
-    private IAndroidTarget getSelectedBuildTarget() {
-        IAndroidTarget[] targets = (IAndroidTarget[]) mBuildSdkCombo.getData();
-        int index = mBuildSdkCombo.getSelectionIndex();
-        if (index >= 0 && index < targets.length) {
-            return targets[index];
-        } else {
-            return null;
-        }
-    }
-
-    private void suggestPackage(String original) {
-        if (!mValues.packageModified) {
-            // Create default package name
-            StringBuilder sb = new StringBuilder();
-            sb.append(SAMPLE_PACKAGE_PREFIX);
-            appendPackage(sb, original);
-
-            String pkg = sb.toString();
-            if (pkg.endsWith(".")) { //$NON-NLS-1$
-                pkg = pkg.substring(0, pkg.length() - 1);
-            }
-            mValues.packageName = pkg;
-            try {
-                mIgnore = true;
-                mPackageText.setText(mValues.packageName);
-            } finally {
-                mIgnore = false;
-            }
-        }
-    }
-
-    private static void appendPackage(StringBuilder sb, String string) {
-        for (int i = 0, n = string.length(); i < n; i++) {
-            char c = string.charAt(i);
-            if (i == 0 && Character.isJavaIdentifierStart(c)
-                    || i != 0 && Character.isJavaIdentifierPart(c)) {
-                sb.append(Character.toLowerCase(c));
-            } else if ((c == '.')
-                    && (sb.length() > 0 && sb.charAt(sb.length() - 1) != '.')) {
-                sb.append('.');
-            } else if (c == '-') {
-                sb.append('_');
-            }
-        }
-    }
-
-    @Override
-    public void widgetDefaultSelected(SelectionEvent e) {
-    }
-
-    // ---- Implements FocusListener ----
-
-    @Override
-    public void focusGained(FocusEvent e) {
-        Object source = e.getSource();
-        String tip = "";
-        if (source == mApplicationText) {
-            tip = mApplicationDec.getDescriptionText();
-        } else if (source == mProjectText) {
-            tip = mProjectDec.getDescriptionText();
-        } else if (source == mBuildSdkCombo) {
-            tip = mBuildTargetDec.getDescriptionText();
-        } else if (source == mMinSdkCombo) {
-            tip = mMinSdkDec.getDescriptionText();
-        } else if (source == mPackageText) {
-            tip = mPackageDec.getDescriptionText();
-            if (mPackageText.getText().startsWith(SAMPLE_PACKAGE_PREFIX)) {
-                int length = SAMPLE_PACKAGE_PREFIX.length();
-                if (mPackageText.getText().length() > length
-                        && SAMPLE_PACKAGE_PREFIX.endsWith(".")) { //$NON-NLS-1$
-                    length--;
-                }
-                mPackageText.setSelection(0, length);
-            }
-        } else if (source == mTargetSdkCombo) {
-            tip = mTargetSdkDec.getDescriptionText();
-        } else if (source == mThemeCombo) {
-            tip = mThemeDec.getDescriptionText();
-        }
-        mTipLabel.setText(tip);
-        mHelpIcon.setVisible(tip.length() > 0);
-    }
-
-    @Override
-    public void focusLost(FocusEvent e) {
-        mTipLabel.setText("");
-        mHelpIcon.setVisible(false);
-    }
-
-    // Validation
-
-    private void validatePage() {
-        IStatus status = mValues.template.validateTemplate(mValues.minSdkLevel,
-                mValues.getBuildApi());
-        if (status != null && !status.isOK()) {
-            updateDecorator(mApplicationDec, null, true);
-            updateDecorator(mPackageDec, null, true);
-            updateDecorator(mProjectDec, null, true);
-            updateDecorator(mThemeDec, null, true);
-            /* These never get marked with errors:
-            updateDecorator(mBuildTargetDec, null, true);
-            updateDecorator(mMinSdkDec, null, true);
-            updateDecorator(mTargetSdkDec, null, true);
-            */
-        } else {
-            IStatus appStatus = validateAppName();
-            if (appStatus != null && (status == null
-                    || appStatus.getSeverity() > status.getSeverity())) {
-                status = appStatus;
-            }
-
-            IStatus projectStatus = validateProjectName();
-            if (projectStatus != null && (status == null
-                    || projectStatus.getSeverity() > status.getSeverity())) {
-                status = projectStatus;
-            }
-
-            IStatus packageStatus = validatePackageName();
-            if (packageStatus != null && (status == null
-                    || packageStatus.getSeverity() > status.getSeverity())) {
-                status = packageStatus;
-            }
-
-            IStatus locationStatus = ProjectContentsPage.validateLocationInWorkspace(mValues);
-            if (locationStatus != null && (status == null
-                    || locationStatus.getSeverity() > status.getSeverity())) {
-                status = locationStatus;
-            }
-
-            if (status == null || status.getSeverity() != IStatus.ERROR) {
-                if (mValues.target == null) {
-                    status = new Status(IStatus.WARNING, AdtPlugin.PLUGIN_ID,
-                            "Select an Android build target version");
-                }
-            }
-
-            if (status == null || status.getSeverity() != IStatus.ERROR) {
-                if (mValues.minSdk == null || mValues.minSdk.isEmpty()) {
-                    status = new Status(IStatus.WARNING, AdtPlugin.PLUGIN_ID,
-                            "Select a minimum SDK version");
-                } else {
-                    AndroidVersion version = mValues.target.getVersion();
-                    if (version.isPreview()) {
-                        if (version.getCodename().equals(mValues.minSdk) == false) {
-                            status = new Status(IStatus.ERROR, AdtPlugin.PLUGIN_ID,
-                            "Preview platforms require the min SDK version to match their codenames.");
-                       }
-                    } else if (mValues.target.getVersion().compareTo(
-                            mValues.minSdkLevel,
-                            version.isPreview() ? mValues.minSdk : null) < 0) {
-                        status = new Status(IStatus.WARNING, AdtPlugin.PLUGIN_ID,
-                            "The minimum SDK version is higher than the build target version");
-                    }
-                    if (status == null || status.getSeverity() != IStatus.ERROR) {
-                        if (mValues.targetSdkLevel < mValues.minSdkLevel) {
-                            status = new Status(IStatus.ERROR, AdtPlugin.PLUGIN_ID,
-                                "The target SDK version should be at least as high as the minimum SDK version");
-                        }
-                    }
-                }
-            }
-
-            IStatus themeStatus = validateTheme();
-            if (themeStatus != null && (status == null
-                    || themeStatus.getSeverity() > status.getSeverity())) {
-                status = themeStatus;
-            }
-        }
-
-        setPageComplete(status == null || status.getSeverity() != IStatus.ERROR);
-        if (status != null) {
-            setMessage(status.getMessage(),
-                    status.getSeverity() == IStatus.ERROR
-                        ? IMessageProvider.ERROR : IMessageProvider.WARNING);
-        } else {
-            setErrorMessage(null);
-            setMessage(null);
-        }
-    }
-
-    private IStatus validateAppName() {
-        String appName = mValues.applicationName;
-        IStatus status = null;
-        if (appName == null || appName.isEmpty()) {
-            status = new Status(IStatus.ERROR, AdtPlugin.PLUGIN_ID,
-                    "Enter an application name (shown in launcher)");
-        } else if (Character.isLowerCase(mValues.applicationName.charAt(0))) {
-            status = new Status(IStatus.WARNING, AdtPlugin.PLUGIN_ID,
-                    "The application name for most apps begins with an uppercase letter");
-        }
-
-        updateDecorator(mApplicationDec, status, true);
-
-        return status;
-    }
-
-    private IStatus validateProjectName() {
-        IStatus status = ProjectNamePage.validateProjectName(mValues.projectName);
-        updateDecorator(mProjectDec, status, true);
-
-        return status;
-    }
-
-    private IStatus validatePackageName() {
-        IStatus status;
-        if (mValues.packageName == null || mValues.packageName.startsWith(SAMPLE_PACKAGE_PREFIX)) {
-            if (mValues.packageName != null
-                    && !mValues.packageName.equals(SAMPLE_PACKAGE_PREFIX)) {
-                status = ApplicationInfoPage.validatePackage(mValues.packageName);
-                if (status == null || status.isOK()) {
-                    status = new Status(IStatus.WARNING, AdtPlugin.PLUGIN_ID,
-                        String.format("The prefix '%1$s' is meant as a placeholder and should " +
-                                      "not be used", SAMPLE_PACKAGE_PREFIX));
-                }
-            } else {
-                status = new Status(IStatus.ERROR, AdtPlugin.PLUGIN_ID,
-                        "Package name must be specified.");
-            }
-        } else {
-            status = ApplicationInfoPage.validatePackage(mValues.packageName);
-        }
-
-        updateDecorator(mPackageDec, status, true);
-
-        return status;
-    }
-
-    private IStatus validateTheme() {
-        IStatus status = null;
-
-        if (mThemeParameter != null) {
-            status = NewTemplatePage.validateCombo(null, mThemeParameter,
-                    mThemeCombo.getSelectionIndex(),  mValues.minSdkLevel,
-                    mValues.getBuildApi());
-
-            updateDecorator(mThemeDec, status, true);
-        }
-
-        return status;
-    }
-
-    private void updateDecorator(ControlDecoration decorator, IStatus status, boolean hasInfo) {
-        if (hasInfo) {
-            int severity = status != null ? status.getSeverity() : IStatus.OK;
-            setDecoratorType(decorator, severity);
-        } else {
-            if (status == null || status.isOK()) {
-                decorator.hide();
-            } else {
-                decorator.show();
-            }
-        }
-    }
-
-    private void setDecoratorType(ControlDecoration decorator, int severity) {
-        String id;
-        if (severity == IStatus.ERROR) {
-            id = FieldDecorationRegistry.DEC_ERROR;
-        } else if (severity == IStatus.WARNING) {
-            id = FieldDecorationRegistry.DEC_WARNING;
-        } else {
-            id = FieldDecorationRegistry.DEC_INFORMATION;
-        }
-        FieldDecoration errorFieldIndicator = FieldDecorationRegistry.getDefault().
-                getFieldDecoration(id);
-        decorator.setImage(errorFieldIndicator.getImage());
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/templates/NewProjectWizard.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/templates/NewProjectWizard.java
deleted file mode 100644
index d350a00..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/templates/NewProjectWizard.java
+++ /dev/null
@@ -1,456 +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.ide.eclipse.adt.internal.wizards.templates;
-
-import static org.eclipse.core.resources.IResource.DEPTH_INFINITE;
-
-import com.android.SdkConstants;
-import com.android.annotations.NonNull;
-import com.android.annotations.VisibleForTesting;
-import com.android.assetstudiolib.GraphicGenerator;
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.ide.eclipse.adt.AdtUtils;
-import com.android.ide.eclipse.adt.internal.actions.AddSupportJarAction;
-import com.android.ide.eclipse.adt.internal.assetstudio.AssetType;
-import com.android.ide.eclipse.adt.internal.assetstudio.ConfigureAssetSetPage;
-import com.android.ide.eclipse.adt.internal.assetstudio.CreateAssetSetWizardState;
-import com.android.ide.eclipse.adt.internal.project.BaseProjectHelper;
-import com.android.ide.eclipse.adt.internal.project.ProjectHelper;
-import com.android.ide.eclipse.adt.internal.wizards.newproject.NewProjectCreator;
-import com.android.ide.eclipse.adt.internal.wizards.newproject.NewProjectCreator.ProjectPopulator;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IWorkspaceRoot;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jface.operation.IRunnableWithProgress;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.wizard.IWizardPage;
-import org.eclipse.jface.wizard.WizardPage;
-import org.eclipse.ltk.core.refactoring.Change;
-import org.eclipse.ltk.core.refactoring.CompositeChange;
-import org.eclipse.swt.graphics.RGB;
-import org.eclipse.ui.IWorkbench;
-
-import java.io.File;
-import java.lang.reflect.InvocationTargetException;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-/**
- * Wizard for creating new projects
- */
-public class NewProjectWizard extends TemplateWizard {
-    private static final String PARENT_ACTIVITY_CLASS = "parentActivityClass";  //$NON-NLS-1$
-    private static final String ACTIVITY_TITLE = "activityTitle";  //$NON-NLS-1$
-    static final String IS_LAUNCHER = "isLauncher";                //$NON-NLS-1$
-    static final String IS_NEW_PROJECT = "isNewProject";           //$NON-NLS-1$
-    static final String IS_LIBRARY_PROJECT = "isLibraryProject";   //$NON-NLS-1$
-    static final String ATTR_COPY_ICONS = "copyIcons";             //$NON-NLS-1$
-    static final String ATTR_TARGET_API = "targetApi";             //$NON-NLS-1$
-    static final String ATTR_MIN_API = "minApi";                   //$NON-NLS-1$
-    static final String ATTR_MIN_BUILD_API = "minBuildApi";        //$NON-NLS-1$
-    static final String ATTR_BUILD_API = "buildApi";               //$NON-NLS-1$
-    static final String ATTR_REVISION = "revision";                //$NON-NLS-1$
-    static final String ATTR_MIN_API_LEVEL = "minApiLevel";        //$NON-NLS-1$
-    static final String ATTR_PACKAGE_NAME = "packageName";         //$NON-NLS-1$
-    static final String ATTR_APP_TITLE = "appTitle";               //$NON-NLS-1$
-    static final String CATEGORY_PROJECTS = "projects";            //$NON-NLS-1$
-    static final String CATEGORY_ACTIVITIES = "activities";        //$NON-NLS-1$
-    static final String CATEGORY_OTHER = "other";                  //$NON-NLS-1$
-    static final String ATTR_APP_COMPAT = "appCompat";             //$NON-NLS-1$
-    /**
-     * Reserved file name for the launcher icon, resolves to the xhdpi version
-     *
-     * @see CreateAssetSetWizardState#getImage
-     */
-    public static final String DEFAULT_LAUNCHER_ICON = "launcher_icon";   //$NON-NLS-1$
-
-    private NewProjectPage mMainPage;
-    private ProjectContentsPage mContentsPage;
-    private ActivityPage mActivityPage;
-    private NewTemplatePage mTemplatePage;
-    private NewProjectWizardState mValues;
-    /** The project being created */
-    private IProject mProject;
-
-    @Override
-    public void init(IWorkbench workbench, IStructuredSelection selection) {
-        super.init(workbench, selection);
-
-        setWindowTitle("New Android Application");
-
-        mValues = new NewProjectWizardState();
-        mMainPage = new NewProjectPage(mValues);
-        mContentsPage = new ProjectContentsPage(mValues);
-        mContentsPage.init(selection, AdtUtils.getActivePart());
-        mActivityPage = new ActivityPage(mValues, true, true);
-        mActivityPage.setLauncherActivitiesOnly(true);
-    }
-
-    @Override
-    public void addPages() {
-        super.addPages();
-        addPage(mMainPage);
-        addPage(mContentsPage);
-        addPage(mActivityPage);
-    }
-
-    @Override
-    public IWizardPage getNextPage(IWizardPage page) {
-        if (page == mMainPage) {
-            return mContentsPage;
-        }
-
-        if (page == mContentsPage) {
-            if (mValues.createIcon) {
-                // Bundle asset studio wizard to create the launcher icon
-                CreateAssetSetWizardState iconState = mValues.iconState;
-                iconState.type = AssetType.LAUNCHER;
-                iconState.outputName = "ic_launcher"; //$NON-NLS-1$
-                iconState.background = new RGB(0xff, 0xff, 0xff);
-                iconState.foreground = new RGB(0x33, 0xb6, 0xea);
-                iconState.trim = true;
-
-                // ADT 20: White icon with blue shape
-                //iconState.shape = GraphicGenerator.Shape.CIRCLE;
-                //iconState.sourceType = CreateAssetSetWizardState.SourceType.CLIPART;
-                //iconState.clipartName = "user.png"; //$NON-NLS-1$
-                //iconState.padding = 10;
-
-                // ADT 21: Use the platform packaging icon, but allow user to customize it
-                iconState.sourceType = CreateAssetSetWizardState.SourceType.IMAGE;
-                iconState.imagePath = new File(DEFAULT_LAUNCHER_ICON);
-                iconState.shape = GraphicGenerator.Shape.NONE;
-                iconState.padding = 0;
-
-                WizardPage p = getIconPage(mValues.iconState);
-                p.setTitle("Configure Launcher Icon");
-                return p;
-            } else {
-                if (mValues.createActivity) {
-                    return mActivityPage;
-                } else {
-                    return null;
-                }
-            }
-        }
-
-        if (page == mIconPage) {
-            return mActivityPage;
-        }
-
-        if (page == mActivityPage && mValues.createActivity) {
-            if (mTemplatePage == null) {
-                NewTemplateWizardState activityValues = mValues.activityValues;
-
-                // Initialize the *default* activity name based on what we've derived
-                // from the project name
-                activityValues.defaults.put("activityName", mValues.activityName);
-
-                // Hide those parameters that the template requires but that we don't want to
-                // ask the users about, since we will supply these values from the rest
-                // of the new project wizard.
-                Set<String> hidden = activityValues.hidden;
-                hidden.add(ATTR_PACKAGE_NAME);
-                hidden.add(ATTR_APP_TITLE);
-                hidden.add(ATTR_MIN_API);
-                hidden.add(ATTR_MIN_API_LEVEL);
-                hidden.add(ATTR_TARGET_API);
-                hidden.add(ATTR_BUILD_API);
-                hidden.add(IS_LAUNCHER);
-                // Don't ask about hierarchical parent activities in new projects where there
-                // can't possibly be any
-                hidden.add(PARENT_ACTIVITY_CLASS);
-                hidden.add(ACTIVITY_TITLE); // Not used for the first activity in the project
-
-                mTemplatePage = new NewTemplatePage(activityValues, false);
-                addPage(mTemplatePage);
-            }
-            mTemplatePage.setCustomMinSdk(mValues.minSdkLevel, mValues.getBuildApi());
-            return mTemplatePage;
-        }
-
-        if (page == mTemplatePage) {
-            TemplateMetadata template = mValues.activityValues.getTemplateHandler().getTemplate();
-            if (template != null
-                    && !InstallDependencyPage.isInstalled(template.getDependencies())) {
-                return getDependencyPage(template, true);
-            }
-        }
-
-        if (page == mTemplatePage || !mValues.createActivity && page == mActivityPage
-                || page == getDependencyPage(null, false)) {
-            return null;
-        }
-
-        return super.getNextPage(page);
-    }
-
-    @Override
-    public boolean canFinish() {
-        // Deal with lazy creation of some pages: these may not be in the page-list yet
-        // since they are constructed lazily, so consider that option here.
-        if (mValues.createIcon && (mIconPage == null || !mIconPage.isPageComplete())) {
-            return false;
-        }
-        if (mValues.createActivity && (mTemplatePage == null || !mTemplatePage.isPageComplete())) {
-            return false;
-        }
-
-        // Override super behavior (which just calls isPageComplete() on each of the pages)
-        // to special case the template and icon pages since we want to skip them if
-        // the appropriate flags are not set.
-        for (IWizardPage page : getPages()) {
-            if (page == mTemplatePage && !mValues.createActivity) {
-                continue;
-            }
-            if (page == mIconPage && !mValues.createIcon) {
-                continue;
-            }
-            if (!page.isPageComplete()) {
-                return false;
-            }
-        }
-
-        return true;
-    }
-
-    @Override
-    @NonNull
-    protected IProject getProject() {
-        return mProject;
-    }
-
-    @Override
-    @NonNull
-    protected List<String> getFilesToOpen() {
-        return mValues.template.getFilesToOpen();
-    }
-
-    @VisibleForTesting
-    NewProjectWizardState getValues() {
-        return mValues;
-    }
-
-    @VisibleForTesting
-    void setValues(NewProjectWizardState values) {
-        mValues = values;
-    }
-
-    @Override
-    protected List<Change> computeChanges() {
-        final TemplateHandler template = mValues.template;
-        // We'll be merging in an activity template, but don't create *~ backup files
-        // of the merged files (such as the manifest file) in that case.
-        // (NOTE: After the change from direct file manipulation to creating a list of Change
-        // objects, this no longer applies - but the code is kept around a little while longer
-        // in case we want to generate change objects that makes backups of merged files)
-        template.setBackupMergedFiles(false);
-
-        // Generate basic output skeleton
-        Map<String, Object> paramMap = new HashMap<String, Object>();
-        addProjectInfo(paramMap);
-        TemplateHandler.addDirectoryParameters(paramMap, getProject());
-        // We don't know at this point whether the activity is going to need
-        // AppCompat so we just assume that it will.
-        if (mValues.createActivity && mValues.minSdkLevel < 14) {
-            paramMap.put(ATTR_APP_COMPAT, true);
-            getFinalizingActions().add(new Runnable() {
-                @Override
-                public void run() {
-                    AddSupportJarAction.installAppCompatLibrary(mProject, true);
-                }
-            });
-        }
-
-        return template.render(mProject, paramMap);
-    }
-
-    @Override
-    protected boolean performFinish(final IProgressMonitor monitor)
-            throws InvocationTargetException {
-        try {
-            IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
-            String name = mValues.projectName;
-            mProject = root.getProject(name);
-
-            final TemplateHandler template = mValues.template;
-            // We'll be merging in an activity template, but don't create *~ backup files
-            // of the merged files (such as the manifest file) in that case.
-            template.setBackupMergedFiles(false);
-
-            ProjectPopulator projectPopulator = new ProjectPopulator() {
-                @Override
-                public void populate(IProject project) throws InvocationTargetException {
-                    // Copy in the proguard file; templates don't provide this one.
-                    // add the default proguard config
-                    File libFolder = new File(AdtPlugin.getOsSdkToolsFolder(),
-                            SdkConstants.FD_LIB);
-                    try {
-                        assert project == mProject;
-                        NewProjectCreator.addLocalFile(project,
-                                new File(libFolder, SdkConstants.FN_PROJECT_PROGUARD_FILE),
-                                // Write ProGuard config files with the extension .pro which
-                                // is what is used in the ProGuard documentation and samples
-                                SdkConstants.FN_PROJECT_PROGUARD_FILE,
-                                new NullProgressMonitor());
-                    } catch (Exception e) {
-                        AdtPlugin.log(e, null);
-                    }
-
-                    try {
-                        mProject.refreshLocal(DEPTH_INFINITE, new NullProgressMonitor());
-                    } catch (CoreException e) {
-                        AdtPlugin.log(e, null);
-                    }
-
-                    // Render the project template
-                    List<Change> changes = computeChanges();
-                    if (!changes.isEmpty()) {
-                        monitor.beginTask("Creating project...", changes.size());
-                        try {
-                            CompositeChange composite = new CompositeChange("",
-                                    changes.toArray(new Change[changes.size()]));
-                            composite.perform(monitor);
-                        } catch (CoreException e) {
-                            AdtPlugin.log(e, null);
-                            throw new InvocationTargetException(e);
-                        } finally {
-                            monitor.done();
-                        }
-                    }
-
-                    if (mValues.createIcon) { // TODO: Set progress
-                        generateIcons(mProject);
-                    }
-
-                    // Render the embedded activity template template
-                    if (mValues.createActivity) {
-                        final TemplateHandler activityTemplate =
-                                mValues.activityValues.getTemplateHandler();
-                        // We'll be merging in an activity template, but don't create
-                        // *~ backup files of the merged files (such as the manifest file)
-                        // in that case.
-                        activityTemplate.setBackupMergedFiles(false);
-                        generateActivity(template, project, monitor);
-                    }
-                }
-            };
-
-            NewProjectCreator.create(monitor, mProject, mValues.target, projectPopulator,
-                    mValues.isLibrary, mValues.projectLocation, mValues.workingSets);
-
-            // For new projects, ensure that we're actually using the preferred compliance,
-            // not just the default one
-            IJavaProject javaProject = BaseProjectHelper.getJavaProject(mProject);
-            if (javaProject != null) {
-                ProjectHelper.enforcePreferredCompilerCompliance(javaProject);
-            }
-
-            try {
-                mProject.refreshLocal(DEPTH_INFINITE, new NullProgressMonitor());
-            } catch (CoreException e) {
-                AdtPlugin.log(e, null);
-            }
-
-            List<Runnable> finalizingTasks = getFinalizingActions();
-            for (Runnable r : finalizingTasks) {
-                r.run();
-            }
-
-            return true;
-        } catch (Exception ioe) {
-            AdtPlugin.log(ioe, null);
-            return false;
-        }
-    }
-
-    /**
-     * Generate custom icons into the project based on the asset studio wizard state
-     */
-    private void generateIcons(final IProject newProject) {
-        // Generate the custom icons
-        assert mValues.createIcon;
-        ConfigureAssetSetPage.generateIcons(newProject, mValues.iconState, false, mIconPage);
-    }
-
-    /**
-     * Generate the activity: Pre-populate information about the project the
-     * activity needs but that we don't need to ask about when creating a new
-     * project
-     */
-    private void generateActivity(TemplateHandler projectTemplate, IProject project,
-            IProgressMonitor monitor) throws InvocationTargetException {
-        assert mValues.createActivity;
-        NewTemplateWizardState activityValues = mValues.activityValues;
-        Map<String, Object> parameters = activityValues.parameters;
-
-        addProjectInfo(parameters);
-
-        parameters.put(IS_NEW_PROJECT, true);
-        parameters.put(IS_LIBRARY_PROJECT, mValues.isLibrary);
-        // Ensure that activities created as part of a new project are marked as
-        // launcher activities
-        parameters.put(IS_LAUNCHER, true);
-        TemplateHandler.addDirectoryParameters(parameters, project);
-
-        TemplateHandler activityTemplate = activityValues.getTemplateHandler();
-        activityTemplate.setBackupMergedFiles(false);
-        List<Change> changes = activityTemplate.render(project, parameters);
-        if (!changes.isEmpty()) {
-            monitor.beginTask("Creating template...", changes.size());
-            try {
-                CompositeChange composite = new CompositeChange("",
-                        changes.toArray(new Change[changes.size()]));
-                composite.perform(monitor);
-            } catch (CoreException e) {
-                AdtPlugin.log(e, null);
-                throw new InvocationTargetException(e);
-            } finally {
-                monitor.done();
-            }
-        }
-
-        List<String> filesToOpen = activityTemplate.getFilesToOpen();
-        projectTemplate.getFilesToOpen().addAll(filesToOpen);
-
-        List<Runnable> finalizingActions = activityTemplate.getFinalizingActions();
-        projectTemplate.getFinalizingActions().addAll(finalizingActions);
-    }
-
-    private void addProjectInfo(Map<String, Object> parameters) {
-        parameters.put(ATTR_PACKAGE_NAME, mValues.packageName);
-        parameters.put(ATTR_APP_TITLE, mValues.applicationName);
-        parameters.put(ATTR_MIN_API, mValues.minSdk);
-        parameters.put(ATTR_MIN_API_LEVEL, mValues.minSdkLevel);
-        parameters.put(ATTR_TARGET_API, mValues.targetSdkLevel);
-        parameters.put(ATTR_BUILD_API, mValues.target.getVersion().getApiLevel());
-        parameters.put(ATTR_COPY_ICONS, !mValues.createIcon);
-        parameters.putAll(mValues.parameters);
-    }
-
-    @Override
-    @NonNull
-    protected List<Runnable> getFinalizingActions() {
-        return mValues.template.getFinalizingActions();
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/templates/NewProjectWizardState.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/templates/NewProjectWizardState.java
deleted file mode 100644
index 9cd3a6d..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/templates/NewProjectWizardState.java
+++ /dev/null
@@ -1,125 +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.ide.eclipse.adt.internal.wizards.templates;
-
-import static com.android.ide.eclipse.adt.internal.wizards.templates.NewProjectWizard.CATEGORY_PROJECTS;
-
-import com.android.ide.eclipse.adt.AdtUtils;
-import com.android.ide.eclipse.adt.internal.assetstudio.CreateAssetSetWizardState;
-import com.android.sdklib.IAndroidTarget;
-
-import org.eclipse.ui.IWorkingSet;
-
-import java.util.HashMap;
-import java.util.Map;
-
-/**
- * Value object which holds the current state of the wizard pages for the
- * {@link NewProjectWizard}
- */
-public class NewProjectWizardState {
-    /** Creates a new {@link NewProjectWizardState} */
-    public NewProjectWizardState() {
-        template = TemplateHandler.createFromName(CATEGORY_PROJECTS,
-                "NewAndroidApplication"); //$NON-NLS-1$
-    }
-
-    /** The template handler instantiating the project */
-    public final TemplateHandler template;
-
-    /** The name of the project */
-    public String projectName;
-
-    /** The derived name of the activity, if any */
-    public String activityName;
-
-    /** The derived title of the activity, if any */
-    public String activityTitle;
-
-    /** The application name */
-    public String applicationName;
-
-    /** The package name */
-    public String packageName;
-
-    /** Whether the project name has been edited by the user */
-    public boolean projectModified;
-
-    /** Whether the package name has been edited by the user */
-    public boolean packageModified;
-
-    /** Whether the activity name has been edited by the user */
-    public boolean activityNameModified;
-
-    /** Whether the activity title has been edited by the user */
-    public boolean activityTitleModified;
-
-    /** Whether the application name has been edited by the user */
-    public boolean applicationModified;
-
-    /** The compilation target to use for this project */
-    public IAndroidTarget target;
-
-    /** The minimum SDK API level, as a string (if the API is a preview release with a codename) */
-    public String minSdk;
-
-    /** The minimum SDK API level to use */
-    public int minSdkLevel;
-
-    /** The target SDK level */
-    public int targetSdkLevel = AdtUtils.getHighestKnownApiLevel();
-
-    /** Whether this project should be marked as a library project */
-    public boolean isLibrary;
-
-    /** Whether to create an activity (if so, the activity state is stored in
-     * {@link #activityValues}) */
-    public boolean createActivity = true;
-
-    /** Whether a custom icon should be created instead of just reusing the default (if so,
-     * the icon wizard state is stored in {@link #iconState}) */
-    public boolean createIcon = true;
-
-    // Delegated wizards
-
-    /** State for the asset studio wizard, used to create custom icons */
-    public CreateAssetSetWizardState iconState = new CreateAssetSetWizardState();
-
-    /** State for the template wizard, used to embed an activity template */
-    public NewTemplateWizardState activityValues = new NewTemplateWizardState();
-
-    /** Whether a custom location should be used */
-    public boolean useDefaultLocation = true;
-
-    /** Folder where the project should be created. */
-    public String projectLocation;
-
-    /** Configured parameters, by id */
-    public final Map<String, Object> parameters = new HashMap<String, Object>();
-
-    /** The set of chosen working sets to use when creating the project */
-    public IWorkingSet[] workingSets = new IWorkingSet[0];
-
-    /**
-     * Returns the build target API level
-     *
-     * @return the build target API level
-     */
-    public int getBuildApi() {
-        return target != null ? target.getVersion().getApiLevel() : minSdkLevel;
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/templates/NewTemplatePage.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/templates/NewTemplatePage.java
deleted file mode 100644
index 57cf5c8..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/templates/NewTemplatePage.java
+++ /dev/null
@@ -1,946 +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.ide.eclipse.adt.internal.wizards.templates;
-
-import static com.android.SdkConstants.CLASS_ACTIVITY;
-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;
-import static com.android.ide.eclipse.adt.internal.wizards.templates.TemplateHandler.ATTR_DEFAULT;
-import static com.android.ide.eclipse.adt.internal.wizards.templates.TemplateHandler.ATTR_ID;
-import static com.android.ide.eclipse.adt.internal.wizards.templates.TemplateHandler.ATTR_NAME;
-import static com.android.ide.eclipse.adt.internal.wizards.templates.TemplateHandler.PREVIEW_PADDING;
-import static com.android.ide.eclipse.adt.internal.wizards.templates.TemplateHandler.PREVIEW_WIDTH;
-
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.ide.eclipse.adt.internal.editors.IconFactory;
-import com.android.ide.eclipse.adt.internal.editors.layout.gle2.ImageControl;
-import com.android.ide.eclipse.adt.internal.project.BaseProjectHelper;
-import com.android.ide.eclipse.adt.internal.project.ProjectChooserHelper;
-import com.android.ide.eclipse.adt.internal.project.ProjectChooserHelper.ProjectCombo;
-import com.android.ide.eclipse.adt.internal.wizards.templates.Parameter.Constraint;
-import com.android.ide.eclipse.adt.internal.wizards.templates.Parameter.Type;
-import com.android.tools.lint.detector.api.LintUtils;
-import com.google.common.collect.Lists;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.jdt.core.Flags;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.IType;
-import org.eclipse.jdt.core.ITypeHierarchy;
-import org.eclipse.jdt.core.JavaModelException;
-import org.eclipse.jdt.core.search.IJavaSearchScope;
-import org.eclipse.jdt.core.search.SearchEngine;
-import org.eclipse.jdt.ui.IJavaElementSearchConstants;
-import org.eclipse.jdt.ui.JavaUI;
-import org.eclipse.jdt.ui.dialogs.ITypeInfoFilterExtension;
-import org.eclipse.jdt.ui.dialogs.ITypeInfoRequestor;
-import org.eclipse.jdt.ui.dialogs.TypeSelectionExtension;
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.jface.dialogs.IInputValidator;
-import org.eclipse.jface.dialogs.IMessageProvider;
-import org.eclipse.jface.dialogs.ProgressMonitorDialog;
-import org.eclipse.jface.fieldassist.ControlDecoration;
-import org.eclipse.jface.fieldassist.FieldDecoration;
-import org.eclipse.jface.fieldassist.FieldDecorationRegistry;
-import org.eclipse.jface.wizard.WizardPage;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.FocusEvent;
-import org.eclipse.swt.events.FocusListener;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Combo;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.ui.dialogs.SelectionDialog;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-
-import java.io.ByteArrayInputStream;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-/**
- * First wizard page in the "New Project From Template" wizard (which is parameterized
- * via template.xml files)
- */
-public class NewTemplatePage extends WizardPage
-        implements ModifyListener, SelectionListener, FocusListener {
-    /** The default width to use for the wizard page */
-    static final int WIZARD_PAGE_WIDTH = 600;
-
-    private final NewTemplateWizardState mValues;
-    private final boolean mChooseProject;
-    private int mCustomMinSdk = -1;
-    private int mCustomBuildApi = -1;
-    private boolean mIgnore;
-    private boolean mShown;
-    private Control mFirst;
-    // TODO: Move decorators to the Parameter objects?
-    private Map<String, ControlDecoration> mDecorations = new HashMap<String, ControlDecoration>();
-    private Label mHelpIcon;
-    private Label mTipLabel;
-    private ImageControl mPreview;
-    private Image mPreviewImage;
-    private boolean mDisposePreviewImage;
-    private ProjectCombo mProjectButton;
-    private StringEvaluator mEvaluator;
-
-    private TemplateMetadata mShowingTemplate;
-
-    /**
-     * Creates a new {@link NewTemplatePage}
-     *
-     * @param values the wizard state
-     * @param chooseProject whether the wizard should present a project chooser,
-     *            and update {@code values}' project field
-     */
-    NewTemplatePage(NewTemplateWizardState values, boolean chooseProject) {
-        super("newTemplatePage"); //$NON-NLS-1$
-        mValues = values;
-        mChooseProject = chooseProject;
-    }
-
-    /**
-     * @param minSdk a minimum SDK to use, provided chooseProject is false. If
-     *            it is true, then the minimum SDK used for validation will be
-     *            the one of the project
-     * @param buildApi the build API to use
-     */
-    void setCustomMinSdk(int minSdk, int buildApi) {
-        assert !mChooseProject;
-        //assert buildApi >= minSdk;
-        mCustomMinSdk = minSdk;
-        mCustomBuildApi = buildApi;
-    }
-
-    @Override
-    public void createControl(Composite parent2) {
-        Composite parent = new Composite(parent2, SWT.NULL);
-        setControl(parent);
-        GridLayout parentLayout = new GridLayout(3, false);
-        parentLayout.verticalSpacing = 0;
-        parentLayout.marginWidth = 0;
-        parentLayout.marginHeight = 0;
-        parentLayout.horizontalSpacing = 0;
-        parent.setLayout(parentLayout);
-
-        // Reserve enough width (since the panel is created lazily later)
-        Label label = new Label(parent, SWT.NONE);
-        GridData data = new GridData();
-        data.widthHint = WIZARD_PAGE_WIDTH;
-        label.setLayoutData(data);
-    }
-
-    @SuppressWarnings("unused") // SWT constructors have side effects and aren't unused
-    private void onEnter() {
-        TemplateMetadata template = mValues.getTemplateHandler().getTemplate();
-        if (template == mShowingTemplate) {
-            return;
-        }
-        mShowingTemplate = template;
-
-        Composite parent = (Composite) getControl();
-
-        Control[] children = parent.getChildren();
-        if (children.length > 0) {
-            for (Control c : parent.getChildren()) {
-                c.dispose();
-            }
-            for (ControlDecoration decoration : mDecorations.values()) {
-                decoration.dispose();
-            }
-            mDecorations.clear();
-        }
-
-        Composite container = new Composite(parent, SWT.NULL);
-        container.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 2, 1));
-        GridLayout gl_container = new GridLayout(3, false);
-        gl_container.horizontalSpacing = 10;
-        container.setLayout(gl_container);
-
-        if (mChooseProject) {
-            // Project: [button]
-            String tooltip = "The Android Project where the new resource will be created.";
-            Label projectLabel = new Label(container, SWT.NONE);
-            projectLabel.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1));
-            projectLabel.setText("Project:");
-            projectLabel.setToolTipText(tooltip);
-
-            ProjectChooserHelper helper =
-                    new ProjectChooserHelper(getShell(), null /* filter */);
-            mProjectButton = new ProjectCombo(helper, container, mValues.project);
-            mProjectButton.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 2, 1));
-            mProjectButton.setToolTipText(tooltip);
-            mProjectButton.addSelectionListener(this);
-
-            //Label projectSeparator = new Label(container, SWT.SEPARATOR | SWT.HORIZONTAL);
-            //projectSeparator.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false, 3, 1));
-        }
-
-        // Add parameters
-        mFirst = null;
-        String thumb = null;
-        if (template != null) {
-            thumb = template.getThumbnailPath();
-            String title = template.getTitle();
-            if (title != null && !title.isEmpty()) {
-                setTitle(title);
-            }
-            String description = template.getDescription();
-            if (description != null && !description.isEmpty()) {
-                setDescription(description);
-            }
-
-            Map<String, String> defaults = mValues.defaults;
-            Set<String> seen = null;
-            if (LintUtils.assertionsEnabled()) {
-                seen = new HashSet<String>();
-            }
-
-            List<Parameter> parameters = template.getParameters();
-            for (Parameter parameter : parameters) {
-                Parameter.Type type = parameter.type;
-
-                if (type == Parameter.Type.SEPARATOR) {
-                    Label separator = new Label(container, SWT.SEPARATOR | SWT.HORIZONTAL);
-                    separator.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false, 3, 1));
-                    continue;
-                }
-
-                String id = parameter.id;
-                assert id != null && !id.isEmpty() : ATTR_ID;
-                Object value = defaults.get(id);
-                if (value == null) {
-                    value = parameter.value;
-                }
-
-                String name = parameter.name;
-                String help = parameter.help;
-
-                // Required
-                assert name != null && !name.isEmpty() : ATTR_NAME;
-                // Ensure id's are unique:
-                assert seen != null && seen.add(id) : id;
-
-                // Skip attributes that were already provided by the surrounding
-                // context. For example, when adding into an existing project,
-                // provide the minimum SDK automatically from the project.
-                if (mValues.hidden != null && mValues.hidden.contains(id)) {
-                    continue;
-                }
-
-                switch (type) {
-                    case STRING: {
-                        // TODO: Look at the constraints to add validators here
-                        // TODO: If I type.equals("layout") add resource validator for layout
-                        // names
-                        // TODO: If I type.equals("class") make class validator
-
-                        // TODO: Handle package and id better later
-                        Label label = new Label(container, SWT.NONE);
-                        label.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false,
-                                1, 1));
-                        label.setText(name);
-
-                        Text text = new Text(container, SWT.BORDER);
-                        text.setData(parameter);
-                        parameter.control = text;
-
-                        if (parameter.constraints.contains(Constraint.EXISTS)) {
-                            text.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false,
-                                    1, 1));
-
-                            Button button = new Button(container, SWT.FLAT);
-                            button.setData(parameter);
-                            button.setText("...");
-                            button.addSelectionListener(this);
-                        } else {
-                            text.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false,
-                                    2, 1));
-                        }
-
-                        boolean hasValue = false;
-                        if (value instanceof String) {
-                            String stringValue = (String) value;
-                            hasValue = !stringValue.isEmpty();
-                            text.setText(stringValue);
-                            mValues.parameters.put(id, value);
-                        }
-
-                        if (!hasValue) {
-                            if (parameter.constraints.contains(Constraint.EMPTY)) {
-                                text.setMessage("Optional");
-                            } else if (parameter.constraints.contains(Constraint.NONEMPTY)) {
-                                text.setMessage("Required");
-                            }
-                        }
-
-                        text.addModifyListener(this);
-                        text.addFocusListener(this);
-
-                        if (mFirst == null) {
-                            mFirst = text;
-                        }
-
-                        if (help != null && !help.isEmpty()) {
-                            text.setToolTipText(help);
-                            ControlDecoration decoration = createFieldDecoration(id, text, help);
-                        }
-                        break;
-                    }
-                    case BOOLEAN: {
-                        Label label = new Label(container, SWT.NONE);
-                        label.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false,
-                                1, 1));
-
-                        Button checkBox = new Button(container, SWT.CHECK);
-                        checkBox.setText(name);
-                        checkBox.setData(parameter);
-                        parameter.control = checkBox;
-                        checkBox.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false,
-                                2, 1));
-
-                        if (value instanceof Boolean) {
-                            Boolean selected = (Boolean) value;
-                            checkBox.setSelection(selected);
-                            mValues.parameters.put(id, value);
-                        }
-
-                        checkBox.addSelectionListener(this);
-                        checkBox.addFocusListener(this);
-
-                        if (mFirst == null) {
-                            mFirst = checkBox;
-                        }
-
-                        if (help != null && !help.isEmpty()) {
-                            checkBox.setToolTipText(help);
-                            ControlDecoration decoration = createFieldDecoration(id, checkBox,
-                                    help);
-                        }
-                        break;
-                    }
-                    case ENUM: {
-                        Label label = new Label(container, SWT.NONE);
-                        label.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false,
-                                1, 1));
-                        label.setText(name);
-
-                        Combo combo = createOptionCombo(parameter, container, mValues.parameters,
-                                this, this);
-                        combo.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false,
-                                2, 1));
-
-                        if (mFirst == null) {
-                            mFirst = combo;
-                        }
-
-                        if (help != null && !help.isEmpty()) {
-                            ControlDecoration decoration = createFieldDecoration(id, combo, help);
-                        }
-                        break;
-                    }
-                    case SEPARATOR:
-                        // Already handled above
-                        assert false : type;
-                        break;
-                    default:
-                        assert false : type;
-                }
-            }
-        }
-
-        // Preview
-        mPreview = new ImageControl(parent, SWT.NONE, null);
-        mPreview.setDisposeImage(false); // Handled manually in this class
-        GridData gd_mImage = new GridData(SWT.CENTER, SWT.CENTER, false, false, 1, 1);
-        gd_mImage.widthHint = PREVIEW_WIDTH + 2 * PREVIEW_PADDING;
-        mPreview.setLayoutData(gd_mImage);
-
-        Label separator = new Label(parent, SWT.SEPARATOR | SWT.HORIZONTAL);
-        GridData separatorData = new GridData(SWT.FILL, SWT.TOP, true, false, 3, 1);
-        separatorData.heightHint = 16;
-        separator.setLayoutData(separatorData);
-
-        // Generic help
-        mHelpIcon = new Label(parent, SWT.NONE);
-        mHelpIcon.setLayoutData(new GridData(SWT.RIGHT, SWT.TOP, false, false, 1, 1));
-        Image icon = IconFactory.getInstance().getIcon("quickfix");
-        mHelpIcon.setImage(icon);
-        mHelpIcon.setVisible(false);
-        mTipLabel = new Label(parent, SWT.WRAP);
-        mTipLabel.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 2, 1));
-
-        setPreview(thumb);
-
-        parent.layout(true, true);
-        // TODO: This is a workaround for the fact that (at least on OSX) you end up
-        // with some visual artifacts from the control decorations in the upper left corner
-        // (outside the parent widget itself) from the initial control decoration placement
-        // prior to layout. Therefore, perform a redraw. A better solution would be to
-        // delay creation of the control decorations until layout has been performed.
-        // Let's do that soon.
-        parent.getParent().redraw();
-    }
-
-    @NonNull
-    static Combo createOptionCombo(
-            @NonNull Parameter parameter,
-            @NonNull Composite container,
-            @NonNull Map<String, Object> valueMap,
-            @NonNull SelectionListener selectionListener,
-            @NonNull FocusListener focusListener) {
-        Combo combo = new Combo(container, SWT.READ_ONLY);
-
-        List<Element> options = parameter.getOptions();
-        assert options.size() > 0;
-        int selected = 0;
-        List<String> ids = Lists.newArrayList();
-        List<Integer> minSdks = Lists.newArrayList();
-        List<Integer> minBuildApis = Lists.newArrayList();
-        List<String> labels = Lists.newArrayList();
-        for (int i = 0, n = options.size(); i < n; i++) {
-            Element option = options.get(i);
-            String optionId = option.getAttribute(ATTR_ID);
-            assert optionId != null && !optionId.isEmpty() : ATTR_ID;
-            String isDefault = option.getAttribute(ATTR_DEFAULT);
-            if (isDefault != null && !isDefault.isEmpty() &&
-                    Boolean.valueOf(isDefault)) {
-                selected = i;
-            }
-            NodeList childNodes = option.getChildNodes();
-            assert childNodes.getLength() == 1 &&
-                    childNodes.item(0).getNodeType() == Node.TEXT_NODE;
-            String optionLabel = childNodes.item(0).getNodeValue().trim();
-
-            String minApiString = option.getAttribute(ATTR_MIN_API);
-            int minSdk = 1;
-            if (minApiString != null && !minApiString.isEmpty()) {
-                try {
-                    minSdk = Integer.parseInt(minApiString);
-                } catch (NumberFormatException nufe) {
-                    // Templates aren't allowed to contain codenames, should
-                    // always be an integer
-                    AdtPlugin.log(nufe, null);
-                    minSdk = 1;
-                }
-            }
-            String minBuildApiString = option.getAttribute(ATTR_MIN_BUILD_API);
-            int minBuildApi = 1;
-            if (minBuildApiString != null && !minBuildApiString.isEmpty()) {
-                try {
-                    minBuildApi = Integer.parseInt(minBuildApiString);
-                } catch (NumberFormatException nufe) {
-                    // Templates aren't allowed to contain codenames, should
-                    // always be an integer
-                    AdtPlugin.log(nufe, null);
-                    minBuildApi = 1;
-                }
-            }
-            minSdks.add(minSdk);
-            minBuildApis.add(minBuildApi);
-            ids.add(optionId);
-            labels.add(optionLabel);
-        }
-        combo.setData(parameter);
-        parameter.control = combo;
-        combo.setData(ATTR_ID, ids.toArray(new String[ids.size()]));
-        combo.setData(ATTR_MIN_API, minSdks.toArray(new Integer[minSdks.size()]));
-        combo.setData(ATTR_MIN_BUILD_API, minBuildApis.toArray(
-                new Integer[minBuildApis.size()]));
-        assert labels.size() > 0;
-        combo.setItems(labels.toArray(new String[labels.size()]));
-        combo.select(selected);
-
-        combo.addSelectionListener(selectionListener);
-        combo.addFocusListener(focusListener);
-
-        valueMap.put(parameter.id, ids.get(selected));
-
-        if (parameter.help != null && !parameter.help.isEmpty()) {
-            combo.setToolTipText(parameter.help);
-        }
-
-        return  combo;
-    }
-
-    private void setPreview(String thumb) {
-        Image oldImage = mPreviewImage;
-        boolean dispose = mDisposePreviewImage;
-        mPreviewImage = null;
-
-        if (thumb == null || thumb.isEmpty()) {
-            mPreviewImage = TemplateMetadata.getDefaultTemplateIcon();
-            mDisposePreviewImage = false;
-        } else {
-            byte[] data = mValues.getTemplateHandler().readTemplateResource(thumb);
-            if (data != null) {
-                try {
-                    mPreviewImage = new Image(getControl().getDisplay(),
-                            new ByteArrayInputStream(data));
-                    mDisposePreviewImage = true;
-                } catch (Exception e) {
-                    AdtPlugin.log(e, null);
-                }
-            }
-            if (mPreviewImage == null) {
-                return;
-            }
-        }
-
-        mPreview.setImage(mPreviewImage);
-        mPreview.fitToWidth(PREVIEW_WIDTH);
-
-        if (oldImage != null && dispose) {
-            oldImage.dispose();
-        }
-    }
-
-    @Override
-    public void dispose() {
-        super.dispose();
-
-        if (mPreviewImage != null && mDisposePreviewImage) {
-            mDisposePreviewImage = false;
-            mPreviewImage.dispose();
-            mPreviewImage = null;
-        }
-    }
-
-    private ControlDecoration createFieldDecoration(String id, Control control,
-            String description) {
-        ControlDecoration decoration = new ControlDecoration(control, SWT.LEFT);
-        decoration.setMarginWidth(2);
-        FieldDecoration errorFieldIndicator = FieldDecorationRegistry.getDefault().
-           getFieldDecoration(FieldDecorationRegistry.DEC_INFORMATION);
-        decoration.setImage(errorFieldIndicator.getImage());
-        decoration.setDescriptionText(description);
-        control.setToolTipText(description);
-        mDecorations.put(id, decoration);
-
-        return decoration;
-    }
-
-    @Override
-    public boolean isPageComplete() {
-        // Force user to reach this page before hitting Finish
-        return mShown && super.isPageComplete();
-    }
-
-    @Override
-    public void setVisible(boolean visible) {
-        if (visible) {
-            onEnter();
-        }
-
-        super.setVisible(visible);
-
-        if (mFirst != null) {
-            mFirst.setFocus();
-        }
-
-        if (visible) {
-            mShown = true;
-        }
-
-        validatePage();
-    }
-
-    /** Returns the parameter associated with the given control */
-    @Nullable
-    static Parameter getParameter(Control control) {
-        return (Parameter) control.getData();
-    }
-
-    /**
-     * Returns the current string evaluator, if any
-     *
-     * @return the evaluator or null
-     */
-    @Nullable
-    public StringEvaluator getEvaluator() {
-        return mEvaluator;
-    }
-
-    // ---- Validation ----
-
-    private void validatePage() {
-        int minSdk = getMinSdk();
-        int buildApi = getBuildApi();
-        IStatus status = mValues.getTemplateHandler().validateTemplate(minSdk, buildApi);
-
-        if (status == null || status.isOK()) {
-            if (mChooseProject && mValues.project == null) {
-                status = new Status(IStatus.ERROR, AdtPlugin.PLUGIN_ID,
-                        "Please select an Android project.");
-            }
-        }
-
-        for (Parameter parameter : mShowingTemplate.getParameters()) {
-            if (parameter.type == Parameter.Type.SEPARATOR) {
-                continue;
-            }
-            IInputValidator validator = parameter.getValidator(mValues.project);
-            if (validator != null) {
-               ControlDecoration decoration = mDecorations.get(parameter.id);
-               String value = parameter.value == null ? "" : parameter.value.toString();
-               String error = validator.isValid(value);
-               if (error != null) {
-                   IStatus s = new Status(IStatus.ERROR, AdtPlugin.PLUGIN_ID, error);
-                   if (decoration != null) {
-                       updateDecorator(decoration, s, parameter.help);
-                   }
-                   if (status == null || status.isOK()) {
-                       status = s;
-                   }
-               } else if (decoration != null) {
-                   updateDecorator(decoration, null, parameter.help);
-               }
-            }
-
-            if (status == null || status.isOK()) {
-                if (parameter.control instanceof Combo) {
-                    status = validateCombo(status, parameter, minSdk, buildApi);
-                }
-            }
-        }
-
-        setPageComplete(status == null || status.getSeverity() != IStatus.ERROR);
-        if (status != null) {
-            setMessage(status.getMessage(),
-                    status.getSeverity() == IStatus.ERROR
-                        ? IMessageProvider.ERROR : IMessageProvider.WARNING);
-        } else {
-            setErrorMessage(null);
-            setMessage(null);
-        }
-    }
-
-    /** Validates the given combo */
-    static IStatus validateCombo(IStatus status, Parameter parameter, int minSdk, int buildApi) {
-        Combo combo = (Combo) parameter.control;
-        int index = combo.getSelectionIndex();
-        return validateCombo(status, parameter, index, minSdk, buildApi);
-    }
-
-    /** Validates the given combo assuming the value at the given index is chosen */
-    static IStatus validateCombo(IStatus status, Parameter parameter, int index,
-            int minSdk, int buildApi) {
-        Combo combo = (Combo) parameter.control;
-        Integer[] optionIds = (Integer[]) combo.getData(ATTR_MIN_API);
-        // Check minSdk
-        if (index != -1 && index < optionIds.length) {
-            Integer requiredMinSdk = optionIds[index];
-            if (requiredMinSdk > minSdk) {
-                status = new Status(IStatus.ERROR, AdtPlugin.PLUGIN_ID,
-                    String.format(
-                            "%1$s \"%2$s\" requires a minimum SDK version of at " +
-                            "least %3$d, and the current min version is %4$d",
-                            parameter.name, combo.getItems()[index], requiredMinSdk, minSdk));
-            }
-        }
-
-        // Check minimum build target
-        optionIds = (Integer[]) combo.getData(ATTR_MIN_BUILD_API);
-        if (index != -1 && index < optionIds.length) {
-            Integer requiredBuildApi = optionIds[index];
-            if (requiredBuildApi > buildApi) {
-                status = new Status(IStatus.ERROR, AdtPlugin.PLUGIN_ID,
-                    String.format(
-                        "%1$s \"%2$s\"  requires a build target API version of at " +
-                        "least %3$d, and the current version is %4$d",
-                        parameter.name, combo.getItems()[index], requiredBuildApi, buildApi));
-            }
-        }
-        return status;
-    }
-
-    private int getMinSdk() {
-        return mChooseProject ? mValues.getMinSdk() : mCustomMinSdk;
-    }
-
-    private int getBuildApi() {
-        return mChooseProject ? mValues.getBuildApi() : mCustomBuildApi;
-    }
-
-    private void updateDecorator(ControlDecoration decorator, IStatus status, String help) {
-        if (help != null && !help.isEmpty()) {
-            decorator.setDescriptionText(status != null ? status.getMessage() : help);
-
-            int severity = status != null ? status.getSeverity() : IStatus.OK;
-            String id;
-            if (severity == IStatus.ERROR) {
-                id = FieldDecorationRegistry.DEC_ERROR;
-            } else if (severity == IStatus.WARNING) {
-                id = FieldDecorationRegistry.DEC_WARNING;
-            } else {
-                id = FieldDecorationRegistry.DEC_INFORMATION;
-            }
-            FieldDecoration errorFieldIndicator = FieldDecorationRegistry.getDefault().
-                    getFieldDecoration(id);
-            decorator.setImage(errorFieldIndicator.getImage());
-        } else {
-            if (status == null || status.isOK()) {
-                decorator.hide();
-            } else {
-                decorator.show();
-            }
-        }
-    }
-
-    // ---- Implements ModifyListener ----
-
-    @Override
-    public void modifyText(ModifyEvent e) {
-        if (mIgnore) {
-            return;
-        }
-
-        Object source = e.getSource();
-        if (source instanceof Text) {
-            Text text = (Text) source;
-            editParameter(text, text.getText().trim());
-        }
-
-        validatePage();
-    }
-
-    // ---- Implements SelectionListener ----
-
-    @Override
-    public void widgetSelected(SelectionEvent e) {
-        if (mIgnore) {
-            return;
-        }
-
-        Object source = e.getSource();
-        if (source == mProjectButton) {
-            mValues.project = mProjectButton.getSelectedProject();
-        } else if (source instanceof Combo) {
-            Combo combo = (Combo) source;
-            String[] optionIds = (String[]) combo.getData(ATTR_ID);
-            int index = combo.getSelectionIndex();
-            if (index != -1 && index < optionIds.length) {
-                String optionId = optionIds[index];
-                editParameter(combo, optionId);
-                TemplateMetadata template = mValues.getTemplateHandler().getTemplate();
-                if (template != null) {
-                    setPreview(template.getThumbnailPath());
-                }
-            }
-        } else if (source instanceof Button) {
-            Button button = (Button) source;
-            Parameter parameter = (Parameter) button.getData();
-            if (parameter.type == Type.BOOLEAN) {
-                // Checkbox parameter
-                editParameter(button, button.getSelection());
-
-                TemplateMetadata template = mValues.getTemplateHandler().getTemplate();
-                if (template != null) {
-                    setPreview(template.getThumbnailPath());
-                }
-            } else {
-                // Choose button for some other parameter, usually a text
-                String activity = chooseActivity();
-                if (activity != null) {
-                    setValue(parameter, activity);
-                }
-            }
-        }
-
-        validatePage();
-    }
-
-    private String chooseActivity() {
-        try {
-            // Compute a search scope: We need to merge all the subclasses
-            // android.app.Fragment and android.support.v4.app.Fragment
-            IJavaSearchScope scope = SearchEngine.createWorkspaceScope();
-            IProject project = mValues.project;
-            IJavaProject javaProject = BaseProjectHelper.getJavaProject(project);
-            IType activityType = null;
-
-            if (javaProject != null) {
-                activityType = javaProject.findType(CLASS_ACTIVITY);
-            }
-            if (activityType == null) {
-                IJavaProject[] projects = BaseProjectHelper.getAndroidProjects(null);
-                for (IJavaProject p : projects) {
-                    activityType = p.findType(CLASS_ACTIVITY);
-                    if (activityType != null) {
-                        break;
-                    }
-                }
-            }
-            if (activityType != null) {
-                NullProgressMonitor monitor = new NullProgressMonitor();
-                ITypeHierarchy hierarchy = activityType.newTypeHierarchy(monitor);
-                IType[] classes = hierarchy.getAllSubtypes(activityType);
-                scope = SearchEngine.createJavaSearchScope(classes, IJavaSearchScope.SOURCES);
-            }
-
-            Shell parent = AdtPlugin.getShell();
-            final SelectionDialog dialog = JavaUI.createTypeDialog(
-                    parent,
-                    new ProgressMonitorDialog(parent),
-                    scope,
-                    IJavaElementSearchConstants.CONSIDER_CLASSES, false,
-                    // Use ? as a default filter to fill dialog with matches
-                    "?", //$NON-NLS-1$
-                    new TypeSelectionExtension() {
-                        @Override
-                        public ITypeInfoFilterExtension getFilterExtension() {
-                            return new ITypeInfoFilterExtension() {
-                                @Override
-                                public boolean select(ITypeInfoRequestor typeInfoRequestor) {
-                                    int modifiers = typeInfoRequestor.getModifiers();
-                                    if (!Flags.isPublic(modifiers)
-                                            || Flags.isInterface(modifiers)
-                                            || Flags.isEnum(modifiers)) {
-                                        return false;
-                                    }
-                                    return true;
-                                }
-                            };
-                        }
-                    });
-
-            dialog.setTitle("Choose Activity Class");
-            dialog.setMessage("Select an Activity class (? = any character, * = any string):");
-            if (dialog.open() == IDialogConstants.CANCEL_ID) {
-                return null;
-            }
-
-            Object[] types = dialog.getResult();
-            if (types != null && types.length > 0) {
-                return ((IType) types[0]).getFullyQualifiedName();
-            }
-        } catch (JavaModelException e) {
-            AdtPlugin.log(e, null);
-        } catch (CoreException e) {
-            AdtPlugin.log(e, null);
-        }
-        return null;
-    }
-
-    private void editParameter(Control control, Object value) {
-        Parameter parameter = getParameter(control);
-        if (parameter != null) {
-            String id = parameter.id;
-            parameter.value = value;
-            parameter.edited = value != null && !value.toString().isEmpty();
-            mValues.parameters.put(id, value);
-
-            // Update dependent variables, if any
-            List<Parameter> parameters = mShowingTemplate.getParameters();
-            for (Parameter p : parameters) {
-                if (p == parameter || p.suggest == null || p.edited ||
-                        p.type == Parameter.Type.SEPARATOR) {
-                    continue;
-                }
-                if (!p.suggest.contains(id)) {
-                    continue;
-                }
-
-                try {
-                    if (mEvaluator == null) {
-                        mEvaluator = new StringEvaluator();
-                    }
-                    String updated = mEvaluator.evaluate(p.suggest, parameters);
-                    if (updated != null && !updated.equals(p.value)) {
-                        setValue(p, updated);
-                    }
-                } catch (Throwable t) {
-                    // Pass: Ignore updating if something wrong happens
-                    t.printStackTrace(); // during development only
-                }
-            }
-        }
-    }
-
-    private void setValue(Parameter p, String value) {
-        p.value = value;
-        mValues.parameters.put(p.id, value);
-
-        // Update form widgets
-        boolean prevIgnore = mIgnore;
-        try {
-            mIgnore = true;
-            if (p.control instanceof Text) {
-                ((Text) p.control).setText(value);
-            } else if (p.control instanceof Button) {
-                // TODO: Handle
-            } else if (p.control instanceof Combo) {
-                // TODO: Handle
-            } else if (p.control != null) {
-                assert false : p.control;
-            }
-        } finally {
-            mIgnore = prevIgnore;
-        }
-    }
-
-    @Override
-    public void widgetDefaultSelected(SelectionEvent e) {
-    }
-
-    // ---- Implements FocusListener ----
-
-    @Override
-    public void focusGained(FocusEvent e) {
-        Object source = e.getSource();
-        String tip = "";
-
-        if (source instanceof Control) {
-            Control control = (Control) source;
-            Parameter parameter = getParameter(control);
-            if (parameter != null) {
-                ControlDecoration decoration = mDecorations.get(parameter.id);
-                if (decoration != null) {
-                    tip = decoration.getDescriptionText();
-                }
-            }
-        }
-
-        mTipLabel.setText(tip);
-        mHelpIcon.setVisible(tip.length() > 0);
-    }
-
-    @Override
-    public void focusLost(FocusEvent e) {
-        mTipLabel.setText("");
-        mHelpIcon.setVisible(false);
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/templates/NewTemplateWizard.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/templates/NewTemplateWizard.java
deleted file mode 100644
index 99814f7..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/templates/NewTemplateWizard.java
+++ /dev/null
@@ -1,212 +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.ide.eclipse.adt.internal.wizards.templates;
-
-import static com.android.ide.eclipse.adt.internal.wizards.templates.NewProjectWizard.ATTR_BUILD_API;
-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_API_LEVEL;
-import static com.android.ide.eclipse.adt.internal.wizards.templates.NewProjectWizard.ATTR_PACKAGE_NAME;
-import static com.android.ide.eclipse.adt.internal.wizards.templates.NewProjectWizard.ATTR_TARGET_API;
-
-import com.android.annotations.NonNull;
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.ide.eclipse.adt.AdtUtils;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.jface.operation.IRunnableWithProgress;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.wizard.IWizardPage;
-import org.eclipse.jface.wizard.WizardPage;
-import org.eclipse.ltk.core.refactoring.Change;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.wizards.newresource.BasicNewResourceWizard;
-
-import java.io.File;
-import java.util.List;
-import java.util.Set;
-
-/**
- * Template wizard which creates parameterized templates
- */
-public class NewTemplateWizard extends TemplateWizard {
-    /** Template name and location under $sdk/templates for the default activity */
-    static final String BLANK_ACTIVITY = "activities/BlankActivity";           //$NON-NLS-1$
-    /** Template name and location under $sdk/templates for the custom view template */
-    static final String CUSTOM_VIEW = "other/CustomView";                      //$NON-NLS-1$
-
-    protected NewTemplatePage mMainPage;
-    protected NewTemplateWizardState mValues;
-    private final String mTemplateName;
-
-    NewTemplateWizard(String templateName) {
-        mTemplateName = templateName;
-    }
-
-    @Override
-    public void init(IWorkbench workbench, IStructuredSelection selection) {
-        super.init(workbench, selection);
-
-        mValues = new NewTemplateWizardState();
-
-        File template = TemplateManager.getTemplateLocation(mTemplateName);
-        if (template != null) {
-            mValues.setTemplateLocation(template);
-        }
-        hideBuiltinParameters();
-
-        List<IProject> projects = AdtUtils.getSelectedProjects(selection);
-        if (projects.size() == 1) {
-            mValues.project = projects.get(0);
-        }
-
-        mMainPage = new NewTemplatePage(mValues, true);
-    }
-
-    @Override
-    protected boolean shouldAddIconPage() {
-        return mValues.getIconState() != null;
-    }
-
-    /**
-     * Hide those parameters that the template requires but that we don't want
-     * to ask the users about, since we can derive it from the target project
-     * the template is written into.
-     */
-    protected void hideBuiltinParameters() {
-        Set<String> hidden = mValues.hidden;
-        hidden.add(ATTR_PACKAGE_NAME);
-        hidden.add(ATTR_MIN_API);
-        hidden.add(ATTR_MIN_API_LEVEL);
-        hidden.add(ATTR_TARGET_API);
-        hidden.add(ATTR_BUILD_API);
-    }
-
-    @Override
-    public void addPages() {
-        super.addPages();
-        addPage(mMainPage);
-    }
-
-    @Override
-    public IWizardPage getNextPage(IWizardPage page) {
-        TemplateMetadata template = mValues.getTemplateHandler().getTemplate();
-
-        if (page == mMainPage && shouldAddIconPage()) {
-            WizardPage iconPage = getIconPage(mValues.getIconState());
-            mValues.updateIconState(mMainPage.getEvaluator());
-            return iconPage;
-        } else if (page == mMainPage
-                || shouldAddIconPage() && page == getIconPage(mValues.getIconState())) {
-            if (template != null) {
-                if (InstallDependencyPage.isInstalled(template.getDependencies())) {
-                    return getPreviewPage(mValues);
-                } else {
-                    return getDependencyPage(template, true);
-                }
-            }
-        } else if (page == getDependencyPage(template, false)) {
-            return getPreviewPage(mValues);
-        }
-
-        return super.getNextPage(page);
-    }
-
-    @Override
-    @NonNull
-    protected IProject getProject() {
-        return mValues.project;
-    }
-
-    @Override
-    @NonNull
-    protected List<String> getFilesToOpen() {
-        TemplateHandler activityTemplate = mValues.getTemplateHandler();
-        return activityTemplate.getFilesToOpen();
-    }
-
-    @Override
-    @NonNull
-    protected List<Runnable> getFinalizingActions() {
-        TemplateHandler activityTemplate = mValues.getTemplateHandler();
-        return activityTemplate.getFinalizingActions();
-    }
-
-    @Override
-    protected List<Change> computeChanges() {
-        return mValues.computeChanges();
-    }
-
-    /**
-     * Opens the given set of files (as relative paths within a given project
-     *
-     * @param project the project containing the paths
-     * @param relativePaths the paths to files to open
-     * @param mWorkbench the workbench to open the files in
-     */
-    public static void openFiles(
-            @NonNull final IProject project,
-            @NonNull final List<String> relativePaths,
-            @NonNull final IWorkbench mWorkbench) {
-        if (!relativePaths.isEmpty()) {
-            // This has to be delayed in order for focus handling to work correctly
-            AdtPlugin.getDisplay().asyncExec(new Runnable() {
-                @Override
-                public void run() {
-                    for (String path : relativePaths) {
-                        IResource resource = project.findMember(path);
-                        if (resource != null) {
-                            if (resource instanceof IFile) {
-                                try {
-                                    AdtPlugin.openFile((IFile) resource, null, false);
-                                } catch (PartInitException e) {
-                                    AdtPlugin.log(e, "Failed to open %1$s", //$NON-NLS-1$
-                                            resource.getFullPath().toString());
-                                }
-                            }
-                            boolean isLast = relativePaths.size() == 1 ||
-                                    path.equals(relativePaths.get(relativePaths.size() - 1));
-                            if (isLast) {
-                                BasicNewResourceWizard.selectAndReveal(resource,
-                                        mWorkbench.getActiveWorkbenchWindow());
-                            }
-                        }
-                    }
-                }
-            });
-        }
-    }
-
-    /**
-     * Specific New Custom View wizard
-     */
-    public static class NewCustomViewWizard extends NewTemplateWizard {
-        /** Creates a new {@link NewCustomViewWizard} */
-        public NewCustomViewWizard() {
-            super(CUSTOM_VIEW);
-        }
-
-        @Override
-        public void init(IWorkbench workbench, IStructuredSelection selection) {
-            super.init(workbench, selection);
-            setWindowTitle("New Custom View");
-            super.mMainPage.setTitle("New Custom View");
-            super.mMainPage.setDescription("Creates a new custom view");
-        }
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/templates/NewTemplateWizardState.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/templates/NewTemplateWizardState.java
deleted file mode 100644
index 2c97003..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/templates/NewTemplateWizardState.java
+++ /dev/null
@@ -1,215 +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.ide.eclipse.adt.internal.wizards.templates;
-
-import static com.android.ide.eclipse.adt.internal.wizards.templates.NewProjectWizard.ATTR_BUILD_API;
-import static com.android.ide.eclipse.adt.internal.wizards.templates.NewProjectWizard.ATTR_COPY_ICONS;
-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_API_LEVEL;
-import static com.android.ide.eclipse.adt.internal.wizards.templates.NewProjectWizard.ATTR_PACKAGE_NAME;
-import static com.android.ide.eclipse.adt.internal.wizards.templates.NewProjectWizard.ATTR_TARGET_API;
-import static com.android.ide.eclipse.adt.internal.wizards.templates.NewProjectWizard.IS_LIBRARY_PROJECT;
-import static com.android.ide.eclipse.adt.internal.wizards.templates.NewProjectWizard.IS_NEW_PROJECT;
-import static com.android.ide.eclipse.adt.internal.wizards.templates.NewTemplateWizard.BLANK_ACTIVITY;
-
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-import com.android.ide.eclipse.adt.internal.assetstudio.ConfigureAssetSetPage;
-import com.android.ide.eclipse.adt.internal.assetstudio.CreateAssetSetWizardState;
-import com.android.ide.eclipse.adt.internal.editors.manifest.ManifestInfo;
-import com.android.ide.eclipse.adt.internal.sdk.ProjectState;
-import com.android.ide.eclipse.adt.internal.sdk.Sdk;
-import com.android.sdklib.IAndroidTarget;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.ltk.core.refactoring.Change;
-import org.eclipse.ltk.core.refactoring.NullChange;
-
-import java.io.File;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-/**
- * Value object which holds the current state of the wizard pages for the
- * {@link NewTemplateWizard}
- */
-public class NewTemplateWizardState {
-    /** Template handler responsible for instantiating templates and reading resources */
-    private TemplateHandler mTemplateHandler;
-
-    /** Configured parameters, by id */
-    public final Map<String, Object> parameters = new HashMap<String, Object>();
-
-    /** Configured defaults for the parameters, by id */
-    public final Map<String, String> defaults = new HashMap<String, String>();
-
-    /** Ids for parameters which should be hidden (because the client wizard already
-     * has information for these parameters) */
-    public final Set<String> hidden = new HashSet<String>();
-
-    /**
-     * The chosen project (which may be null if the wizard page is being
-     * embedded in the new project wizard)
-     */
-    public IProject project;
-
-    /** The minimum API level to use for this template */
-    public int minSdkLevel;
-
-    /** Location of the template being created */
-    private File mTemplateLocation;
-
-    /**
-     * State for the asset studio wizard, used to create custom icons provided
-     * the icon requests it with an {@code <icons>} element
-     */
-    private CreateAssetSetWizardState mIconState;
-
-    /**
-     * Create a new state object for use by the {@link NewTemplatePage}
-     */
-    public NewTemplateWizardState() {
-        parameters.put(IS_NEW_PROJECT, false);
-    }
-
-    @NonNull
-    TemplateHandler getTemplateHandler() {
-        if (mTemplateHandler == null) {
-            File inputPath;
-            if (mTemplateLocation != null) {
-                inputPath = mTemplateLocation;
-            } else {
-                // Default
-                inputPath = TemplateManager.getTemplateLocation(BLANK_ACTIVITY);
-            }
-            mTemplateHandler = TemplateHandler.createFromPath(inputPath);
-        }
-
-        return mTemplateHandler;
-    }
-
-    /** Sets the current template */
-    void setTemplateLocation(File file) {
-        if (!file.equals(mTemplateLocation)) {
-            mTemplateLocation = file;
-            mTemplateHandler = null;
-        }
-    }
-
-    /** Returns the current template */
-    File getTemplateLocation() {
-        return mTemplateLocation;
-    }
-
-    /** Returns the min SDK version to use */
-    int getMinSdk() {
-        if (project == null) {
-            return -1;
-        }
-        ManifestInfo manifest = ManifestInfo.get(project);
-        return manifest.getMinSdkVersion();
-    }
-
-    /** Returns the build API version to use */
-    int getBuildApi() {
-        if (project == null) {
-            return -1;
-        }
-        IAndroidTarget target = Sdk.getCurrent().getTarget(project);
-        if (target != null) {
-            return target.getVersion().getApiLevel();
-        }
-
-        return getMinSdk();
-    }
-
-    /** Computes the changes this wizard will make */
-    @NonNull
-    List<Change> computeChanges() {
-        if (project == null) {
-            return Collections.emptyList();
-        }
-
-        ManifestInfo manifest = ManifestInfo.get(project);
-        parameters.put(ATTR_PACKAGE_NAME, manifest.getPackage());
-        parameters.put(ATTR_MIN_API, manifest.getMinSdkName());
-        parameters.put(ATTR_MIN_API_LEVEL, manifest.getMinSdkVersion());
-        parameters.put(ATTR_TARGET_API, manifest.getTargetSdkVersion());
-        parameters.put(ATTR_BUILD_API, getBuildApi());
-        parameters.put(ATTR_COPY_ICONS, mIconState == null);
-        ProjectState projectState = Sdk.getProjectState(project);
-        parameters.put(IS_LIBRARY_PROJECT,
-                projectState != null ? projectState.isLibrary() : false);
-
-        TemplateHandler.addDirectoryParameters(parameters, project);
-
-        List<Change> changes = getTemplateHandler().render(project, parameters);
-
-        if (mIconState != null) {
-            String title = String.format("Generate icons (res/drawable-<density>/%1$s.png)",
-                    mIconState.outputName);
-            changes.add(new NullChange(title) {
-                @Override
-                public Change perform(IProgressMonitor pm) throws CoreException {
-                    ConfigureAssetSetPage.generateIcons(mIconState.project,
-                            mIconState, false, null);
-
-                    // Not undoable: just return null instead of an undo-change.
-                    return null;
-                }
-            });
-
-        }
-
-        return changes;
-    }
-
-    @NonNull
-    CreateAssetSetWizardState getIconState() {
-        if (mIconState == null) {
-            TemplateHandler handler = getTemplateHandler();
-            if (handler != null) {
-                TemplateMetadata template = handler.getTemplate();
-                if (template != null) {
-                    mIconState = template.getIconState(project);
-                }
-            }
-        }
-
-        return mIconState;
-    }
-
-    /**
-     * Updates the icon state, such as the output name, based on other parameter settings
-     * @param evaluator the string evaluator, or null if none exists
-     */
-    public void updateIconState(@Nullable StringEvaluator evaluator) {
-        TemplateMetadata template = getTemplateHandler().getTemplate();
-        if (template != null) {
-            if (evaluator == null) {
-                evaluator = new StringEvaluator();
-            }
-            template.updateIconName(template.getParameters(), evaluator);
-        }
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/templates/Parameter.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/templates/Parameter.java
deleted file mode 100644
index 3139451..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/templates/Parameter.java
+++ /dev/null
@@ -1,417 +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.ide.eclipse.adt.internal.wizards.templates;
-
-import static com.android.ide.eclipse.adt.internal.wizards.templates.NewProjectWizard.ATTR_PACKAGE_NAME;
-import static com.android.ide.eclipse.adt.internal.wizards.templates.TemplateHandler.ATTR_CONSTRAINTS;
-import static com.android.ide.eclipse.adt.internal.wizards.templates.TemplateHandler.ATTR_DEFAULT;
-import static com.android.ide.eclipse.adt.internal.wizards.templates.TemplateHandler.ATTR_HELP;
-import static com.android.ide.eclipse.adt.internal.wizards.templates.TemplateHandler.ATTR_ID;
-import static com.android.ide.eclipse.adt.internal.wizards.templates.TemplateHandler.ATTR_NAME;
-import static com.android.ide.eclipse.adt.internal.wizards.templates.TemplateHandler.ATTR_SUGGEST;
-
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.ide.eclipse.adt.internal.editors.layout.gle2.DomUtilities;
-import com.android.ide.eclipse.adt.internal.editors.manifest.ManifestInfo;
-import com.android.ide.eclipse.adt.internal.project.BaseProjectHelper;
-import com.android.ide.eclipse.adt.internal.resources.ResourceNameValidator;
-import com.android.ide.eclipse.adt.internal.wizards.newproject.ApplicationInfoPage;
-import com.android.resources.ResourceFolderType;
-import com.android.resources.ResourceType;
-import com.google.common.base.Splitter;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.IType;
-import org.eclipse.jface.dialogs.IInputValidator;
-import org.eclipse.jface.fieldassist.ControlDecoration;
-import org.eclipse.swt.widgets.Control;
-import org.w3c.dom.Element;
-
-import java.util.Collections;
-import java.util.EnumSet;
-import java.util.List;
-import java.util.Locale;
-
-/**
- * A template parameter editable and edited by the user.
- * <p>
- * Note that this class encapsulates not just the metadata provided by the
- * template, but the actual editing operation of that template in the wizard: it
- * also captures current values, a reference to the editing widget (such that
- * related widgets can be updated when one value depends on another etc)
- */
-class Parameter {
-    enum Type {
-        STRING,
-        BOOLEAN,
-        ENUM,
-        SEPARATOR;
-        // TODO: Numbers?
-
-        public static Type get(String name) {
-            try {
-                return Type.valueOf(name.toUpperCase(Locale.US));
-            } catch (IllegalArgumentException e) {
-                AdtPlugin.printErrorToConsole("Unexpected template type '" + name + "'");
-                AdtPlugin.printErrorToConsole("Expected one of :");
-                for (Type s : Type.values()) {
-                    AdtPlugin.printErrorToConsole("  " + s.name().toLowerCase(Locale.US));
-                }
-            }
-
-            return STRING;
-        }
-    }
-
-    /**
-     * Constraints that can be applied to a parameter which helps the UI add a
-     * validator etc for user input. These are typically combined into a set
-     * of constraints via an EnumSet.
-     */
-    enum Constraint {
-        /**
-         * This value must be unique. This constraint usually only makes sense
-         * when other constraints are specified, such as {@link #LAYOUT}, which
-         * means that the parameter should designate a name that does not
-         * represent an existing layout resource name
-         */
-        UNIQUE,
-
-        /**
-         * This value must already exist. This constraint usually only makes sense
-         * when other constraints are specified, such as {@link #LAYOUT}, which
-         * means that the parameter should designate a name that already exists as
-         * a resource name.
-         */
-        EXISTS,
-
-        /** The associated value must not be empty */
-        NONEMPTY,
-
-        /** The associated value is allowed to be empty */
-        EMPTY,
-
-        /** The associated value should represent a fully qualified activity class name */
-        ACTIVITY,
-
-        /** The associated value should represent an API level */
-        APILEVEL,
-
-        /** The associated value should represent a valid class name */
-        CLASS,
-
-        /** The associated value should represent a valid package name */
-        PACKAGE,
-
-        /** The associated value should represent a valid layout resource name */
-        LAYOUT,
-
-        /** The associated value should represent a valid drawable resource name */
-        DRAWABLE,
-
-        /** The associated value should represent a valid id resource name */
-        ID,
-
-        /** The associated value should represent a valid string resource name */
-        STRING;
-
-        public static Constraint get(String name) {
-            try {
-                return Constraint.valueOf(name.toUpperCase(Locale.US));
-            } catch (IllegalArgumentException e) {
-                AdtPlugin.printErrorToConsole("Unexpected template constraint '" + name + "'");
-                if (name.indexOf(',') != -1) {
-                    AdtPlugin.printErrorToConsole("Use | to separate constraints");
-                } else {
-                    AdtPlugin.printErrorToConsole("Expected one of :");
-                    for (Constraint s : Constraint.values()) {
-                        AdtPlugin.printErrorToConsole("  " + s.name().toLowerCase(Locale.US));
-                    }
-                }
-            }
-
-            return NONEMPTY;
-        }
-    }
-
-    /** The template defining the parameter */
-    public final TemplateMetadata template;
-
-    /** The type of parameter */
-    @NonNull
-    public final Type type;
-
-    /** The unique id of the parameter (not displayed to the user) */
-    @Nullable
-    public final String id;
-
-    /** The display name for this parameter */
-    @Nullable
-    public final String name;
-
-    /**
-     * The initial value for this parameter (see also {@link #suggest} for more
-     * dynamic defaults
-     */
-    @Nullable
-    public final String initial;
-
-    /**
-     * A template expression using other template parameters for producing a
-     * default value based on other edited parameters, if possible.
-     */
-    @Nullable
-    public final String suggest;
-
-    /** Help for the parameter, if any */
-    @Nullable
-    public final String help;
-
-    /** The currently edited value */
-    @Nullable
-    public Object value;
-
-    /** The control showing this value */
-    @Nullable
-    public Control control;
-
-    /** The decoration associated with the control */
-    @Nullable
-    public ControlDecoration decoration;
-
-    /** Whether the parameter has been edited */
-    public boolean edited;
-
-    /** The element defining this parameter */
-    @NonNull
-    public final Element element;
-
-    /** The constraints applicable for this parameter */
-    @NonNull
-    public final EnumSet<Constraint> constraints;
-
-    /** The validator, if any, for this field */
-    private IInputValidator mValidator;
-
-    /** True if this field has no validator */
-    private boolean mNoValidator;
-
-    /** Project associated with this validator */
-    private IProject mValidatorProject;
-
-    Parameter(@NonNull TemplateMetadata template, @NonNull Element parameter) {
-        this.template = template;
-        element = parameter;
-
-        String typeName = parameter.getAttribute(TemplateHandler.ATTR_TYPE);
-        assert typeName != null && !typeName.isEmpty() : TemplateHandler.ATTR_TYPE;
-        type = Type.get(typeName);
-
-        id = parameter.getAttribute(ATTR_ID);
-        initial = parameter.getAttribute(ATTR_DEFAULT);
-        suggest = parameter.getAttribute(ATTR_SUGGEST);
-        name = parameter.getAttribute(ATTR_NAME);
-        help = parameter.getAttribute(ATTR_HELP);
-        String constraintString = parameter.getAttribute(ATTR_CONSTRAINTS);
-        if (constraintString != null && !constraintString.isEmpty()) {
-            EnumSet<Constraint> constraintSet = null;
-            for (String s : Splitter.on('|').omitEmptyStrings().split(constraintString)) {
-                Constraint constraint = Constraint.get(s);
-                if (constraintSet == null) {
-                    constraintSet = EnumSet.of(constraint);
-                } else {
-                    constraintSet = EnumSet.copyOf(constraintSet);
-                    constraintSet.add(constraint);
-                }
-            }
-            constraints = constraintSet;
-        } else {
-            constraints = EnumSet.noneOf(Constraint.class);
-        }
-
-        if (initial != null && !initial.isEmpty() && type == Type.BOOLEAN) {
-            value = Boolean.valueOf(initial);
-        } else {
-            value = initial;
-        }
-    }
-
-    Parameter(
-            @NonNull TemplateMetadata template,
-            @NonNull Type type,
-            @NonNull String id,
-            @NonNull String initialValue) {
-        this.template = template;
-        this.type = type;
-        this.id = id;
-        this.value = initialValue;
-        element = null;
-        initial = null;
-        suggest = null;
-        name = id;
-        help = null;
-        constraints = EnumSet.noneOf(Constraint.class);
-    }
-
-    List<Element> getOptions() {
-        if (element != null) {
-            return DomUtilities.getChildren(element);
-        } else {
-            return Collections.emptyList();
-        }
-    }
-
-    @Nullable
-    public IInputValidator getValidator(@Nullable final IProject project) {
-        if (mNoValidator) {
-            return null;
-        }
-
-        if (project != mValidatorProject) {
-            // Force update of validators if the project changes, since the validators
-            // are often tied to project metadata (for example, the resource name validators
-            // which look for name conflicts)
-            mValidator = null;
-            mValidatorProject = project;
-        }
-
-        if (mValidator == null) {
-            if (constraints.contains(Constraint.LAYOUT)) {
-                if (project != null && constraints.contains(Constraint.UNIQUE)) {
-                    mValidator = ResourceNameValidator.create(false, project, ResourceType.LAYOUT);
-                } else {
-                    mValidator = ResourceNameValidator.create(false, ResourceFolderType.LAYOUT);
-                }
-                return mValidator;
-            } else if (constraints.contains(Constraint.STRING)) {
-                if (project != null && constraints.contains(Constraint.UNIQUE)) {
-                    mValidator = ResourceNameValidator.create(false, project, ResourceType.STRING);
-                } else {
-                    mValidator = ResourceNameValidator.create(false, ResourceFolderType.VALUES);
-                }
-                return mValidator;
-            } else if (constraints.contains(Constraint.ID)) {
-                if (project != null && constraints.contains(Constraint.UNIQUE)) {
-                    mValidator = ResourceNameValidator.create(false, project, ResourceType.ID);
-                } else {
-                    mValidator = ResourceNameValidator.create(false, ResourceFolderType.VALUES);
-                }
-                return mValidator;
-            } else if (constraints.contains(Constraint.DRAWABLE)) {
-                if (project != null && constraints.contains(Constraint.UNIQUE)) {
-                    mValidator = ResourceNameValidator.create(false, project,
-                            ResourceType.DRAWABLE);
-                } else {
-                    mValidator = ResourceNameValidator.create(false, ResourceFolderType.DRAWABLE);
-                }
-                return mValidator;
-            } else if (constraints.contains(Constraint.PACKAGE)
-                    || constraints.contains(Constraint.CLASS)
-                    || constraints.contains(Constraint.ACTIVITY)) {
-                mValidator = new IInputValidator() {
-                    @Override
-                    public String isValid(String newText) {
-                        newText = newText.trim();
-                        if (newText.isEmpty()) {
-                            if (constraints.contains(Constraint.EMPTY)) {
-                                return null;
-                            } else if (constraints.contains(Constraint.NONEMPTY)) {
-                                return String.format("Enter a value for %1$s", name);
-                            } else {
-                                // Compatibility mode: older templates might not specify;
-                                // in that case, accept empty
-                                if (!"activityClass".equals(id)) { //$NON-NLS-1$
-                                    return null;
-                                }
-                            }
-                        }
-                        IStatus status;
-                        if (constraints.contains(Constraint.ACTIVITY)) {
-                            status = ApplicationInfoPage.validateActivity(newText);
-                        } else if (constraints.contains(Constraint.PACKAGE)) {
-                            status = ApplicationInfoPage.validatePackage(newText);
-                        } else {
-                            assert constraints.contains(Constraint.CLASS);
-                            status = ApplicationInfoPage.validateClass(newText);
-                        }
-                        if (status != null && !status.isOK()) {
-                            return status.getMessage();
-                        }
-
-                        // Uniqueness
-                        if (project != null && constraints.contains(Constraint.UNIQUE)) {
-                            try {
-                                // Determine the package.
-                                // If there is a package info
-
-                                IJavaProject p = BaseProjectHelper.getJavaProject(project);
-                                if (p != null) {
-                                    String fqcn = newText;
-                                    if (fqcn.indexOf('.') == -1) {
-                                        String pkg = null;
-                                        Parameter parameter = template.getParameter(
-                                                ATTR_PACKAGE_NAME);
-                                        if (parameter != null && parameter.value != null) {
-                                            pkg = parameter.value.toString();
-                                        } else {
-                                            pkg = ManifestInfo.get(project).getPackage();
-                                        }
-                                        fqcn = pkg.isEmpty() ? newText : pkg + '.' + newText;
-                                    }
-
-                                    IType t = p.findType(fqcn);
-                                    if (t != null && t.exists()) {
-                                        return String.format("%1$s already exists", newText);
-                                    }
-                                }
-                            } catch (CoreException e) {
-                                AdtPlugin.log(e, null);
-                            }
-                        }
-
-                        return null;
-                    }
-                };
-                return mValidator;
-            } else if (constraints.contains(Constraint.NONEMPTY)) {
-                mValidator = new IInputValidator() {
-                    @Override
-                    public String isValid(String newText) {
-                        if (newText.trim().isEmpty()) {
-                            return String.format("Enter a value for %1$s", name);
-                        }
-
-                        return null;
-                    }
-                };
-                return mValidator;
-            }
-
-            // TODO: Handle EXISTS, APILEVEL (which is currently handled manually in the
-            // new project wizard, and never actually input by the user in a templated
-            // wizard)
-
-            mNoValidator = true;
-        }
-
-        return mValidator;
-    }
-}
\ No newline at end of file
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/templates/ProjectContentsPage.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/templates/ProjectContentsPage.java
deleted file mode 100644
index 7d7881f..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/templates/ProjectContentsPage.java
+++ /dev/null
@@ -1,380 +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.ide.eclipse.adt.internal.wizards.templates;
-
-
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.ide.eclipse.adt.internal.wizards.newproject.WorkingSetGroup;
-import com.android.ide.eclipse.adt.internal.wizards.newproject.WorkingSetHelper;
-
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.jface.dialogs.IMessageProvider;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.wizard.IWizardPage;
-import org.eclipse.jface.wizard.WizardPage;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.FocusEvent;
-import org.eclipse.swt.events.FocusListener;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.DirectoryDialog;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.IWorkingSet;
-
-import java.io.File;
-
-/**
- * Second wizard page in the "New Project From Template" wizard
- */
-public class ProjectContentsPage extends WizardPage
-        implements ModifyListener, SelectionListener, FocusListener {
-
-    private final NewProjectWizardState mValues;
-
-    private boolean mIgnore;
-    private Button mCustomIconToggle;
-    private Button mLibraryToggle;
-
-    private Button mUseDefaultLocationToggle;
-    private Label mLocationLabel;
-    private Text mLocationText;
-    private Button mChooseLocationButton;
-    private static String sLastProjectLocation = System.getProperty("user.home"); //$NON-NLS-1$
-    private Button mCreateActivityToggle;
-    private WorkingSetGroup mWorkingSetGroup;
-
-    ProjectContentsPage(NewProjectWizardState values) {
-        super("newAndroidApp"); //$NON-NLS-1$
-        mValues = values;
-        setTitle("New Android Application");
-        setDescription("Configure Project");
-
-        mWorkingSetGroup = new WorkingSetGroup();
-        setWorkingSets(new IWorkingSet[0]);
-    }
-
-    @Override
-    public void createControl(Composite parent) {
-        Composite container = new Composite(parent, SWT.NULL);
-        setControl(container);
-        GridLayout gl_container = new GridLayout(4, false);
-        gl_container.horizontalSpacing = 10;
-        container.setLayout(gl_container);
-
-        mCustomIconToggle = new Button(container, SWT.CHECK);
-        mCustomIconToggle.setSelection(true);
-        mCustomIconToggle.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false, 4, 1));
-        mCustomIconToggle.setText("Create custom launcher icon");
-        mCustomIconToggle.setSelection(mValues.createIcon);
-        mCustomIconToggle.addSelectionListener(this);
-
-        mCreateActivityToggle = new Button(container, SWT.CHECK);
-        mCreateActivityToggle.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false,
-                4, 1));
-        mCreateActivityToggle.setText("Create activity");
-        mCreateActivityToggle.setSelection(mValues.createActivity);
-        mCreateActivityToggle.addSelectionListener(this);
-
-        new Label(container, SWT.NONE).setLayoutData(
-                new GridData(SWT.LEFT, SWT.CENTER, false, false, 4, 1));
-
-        mLibraryToggle = new Button(container, SWT.CHECK);
-        mLibraryToggle.setSelection(true);
-        mLibraryToggle.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false, 4, 1));
-        mLibraryToggle.setText("Mark this project as a library");
-        mLibraryToggle.setSelection(mValues.isLibrary);
-        mLibraryToggle.addSelectionListener(this);
-
-        // Blank line
-        new Label(container, SWT.NONE).setLayoutData(
-                new GridData(SWT.LEFT, SWT.CENTER, false, false, 4, 1));
-
-        mUseDefaultLocationToggle = new Button(container, SWT.CHECK);
-        mUseDefaultLocationToggle.setLayoutData(
-                new GridData(SWT.LEFT, SWT.CENTER, false, false, 4, 1));
-        mUseDefaultLocationToggle.setText("Create Project in Workspace");
-        mUseDefaultLocationToggle.addSelectionListener(this);
-
-        mLocationLabel = new Label(container, SWT.NONE);
-        mLocationLabel.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1));
-        mLocationLabel.setText("Location:");
-
-        mLocationText = new Text(container, SWT.BORDER);
-        mLocationText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 2, 1));
-        mLocationText.addModifyListener(this);
-
-        mChooseLocationButton = new Button(container, SWT.NONE);
-        mChooseLocationButton.setText("Browse...");
-        mChooseLocationButton.addSelectionListener(this);
-        mChooseLocationButton.setEnabled(false);
-        setUseCustomLocation(!mValues.useDefaultLocation);
-
-        new Label(container, SWT.NONE).setLayoutData(
-                new GridData(SWT.LEFT, SWT.CENTER, false, false, 4, 1));
-
-        Composite group = mWorkingSetGroup.createControl(container);
-        group.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false, 4, 1));
-    }
-
-    @Override
-    public void setVisible(boolean visible) {
-        super.setVisible(visible);
-
-        if (visible) {
-            try {
-                mIgnore = true;
-                mUseDefaultLocationToggle.setSelection(mValues.useDefaultLocation);
-                mLocationText.setText(mValues.projectLocation);
-            } finally {
-                mIgnore = false;
-            }
-        }
-
-        validatePage();
-    }
-
-    private void setUseCustomLocation(boolean en) {
-        mValues.useDefaultLocation = !en;
-        mUseDefaultLocationToggle.setSelection(!en);
-        if (!en) {
-            updateProjectLocation(mValues.projectName);
-        }
-
-        mLocationLabel.setEnabled(en);
-        mLocationText.setEnabled(en);
-        mChooseLocationButton.setEnabled(en);
-    }
-
-    void init(IStructuredSelection selection, IWorkbenchPart activePart) {
-        setWorkingSets(WorkingSetHelper.getSelectedWorkingSet(selection, activePart));
-    }
-
-    /**
-     * Returns the working sets to which the new project should be added.
-     *
-     * @return the selected working sets to which the new project should be added
-     */
-    private IWorkingSet[] getWorkingSets() {
-        return mWorkingSetGroup.getSelectedWorkingSets();
-    }
-
-    /**
-     * Sets the working sets to which the new project should be added.
-     *
-     * @param workingSets the initial selected working sets
-     */
-    private void setWorkingSets(IWorkingSet[] workingSets) {
-        assert workingSets != null;
-        mWorkingSetGroup.setWorkingSets(workingSets);
-    }
-
-    @Override
-    public IWizardPage getNextPage() {
-        // Sync working set data to the value object, since the WorkingSetGroup
-        // doesn't let us add listeners to do this lazily
-        mValues.workingSets = getWorkingSets();
-
-        return super.getNextPage();
-    }
-
-    // ---- Implements ModifyListener ----
-
-    @Override
-    public void modifyText(ModifyEvent e) {
-        if (mIgnore) {
-            return;
-        }
-
-        Object source = e.getSource();
-        if (source == mLocationText) {
-            mValues.projectLocation = mLocationText.getText().trim();
-        }
-
-        validatePage();
-    }
-
-
-    /** If the project should be created in the workspace, then update the project location
-     * based on the project name. */
-    private void updateProjectLocation(String projectName) {
-        if (projectName == null) {
-            projectName = "";
-        }
-
-        boolean useDefaultLocation = mUseDefaultLocationToggle.getSelection();
-
-        if (useDefaultLocation) {
-            IPath workspace = Platform.getLocation();
-            String projectLocation = workspace.append(projectName).toOSString();
-            mLocationText.setText(projectLocation);
-            mValues.projectLocation = projectLocation;
-        }
-    }
-
-    // ---- Implements SelectionListener ----
-
-    @Override
-    public void widgetSelected(SelectionEvent e) {
-        if (mIgnore) {
-            return;
-        }
-
-        Object source = e.getSource();
-        if (source == mCustomIconToggle) {
-            mValues.createIcon = mCustomIconToggle.getSelection();
-        } else if (source == mLibraryToggle) {
-            mValues.isLibrary = mLibraryToggle.getSelection();
-        } else if (source == mCreateActivityToggle) {
-            mValues.createActivity = mCreateActivityToggle.getSelection();
-        } else if (source == mUseDefaultLocationToggle) {
-            boolean useDefault = mUseDefaultLocationToggle.getSelection();
-            setUseCustomLocation(!useDefault);
-        } else if (source == mChooseLocationButton) {
-            String dir = promptUserForLocation(getShell());
-            if (dir != null) {
-                mLocationText.setText(dir);
-                mValues.projectLocation = dir;
-            }
-        }
-
-        validatePage();
-    }
-
-    private String promptUserForLocation(Shell shell) {
-        DirectoryDialog dd = new DirectoryDialog(getShell());
-        dd.setMessage("Select folder where project should be created");
-
-        String curLocation = mLocationText.getText().trim();
-        if (!curLocation.isEmpty()) {
-            dd.setFilterPath(curLocation);
-        } else if (sLastProjectLocation != null) {
-            dd.setFilterPath(sLastProjectLocation);
-        }
-
-        String dir = dd.open();
-        if (dir != null) {
-            sLastProjectLocation = dir;
-        }
-
-        return dir;
-    }
-
-    @Override
-    public void widgetDefaultSelected(SelectionEvent e) {
-    }
-
-    // ---- Implements FocusListener ----
-
-    @Override
-    public void focusGained(FocusEvent e) {
-    }
-
-    @Override
-    public void focusLost(FocusEvent e) {
-    }
-
-    // Validation
-
-    void validatePage() {
-        IStatus status = validateProjectLocation();
-
-        setPageComplete(status == null || status.getSeverity() != IStatus.ERROR);
-        if (status != null) {
-            setMessage(status.getMessage(),
-                    status.getSeverity() == IStatus.ERROR
-                        ? IMessageProvider.ERROR : IMessageProvider.WARNING);
-        } else {
-            setErrorMessage(null);
-            setMessage(null);
-        }
-    }
-
-    static IStatus validateLocationInWorkspace(NewProjectWizardState values) {
-        if (values.useDefaultLocation) {
-            return null;
-        }
-
-        // Validate location
-        if (values.projectName != null) {
-            File dest = Platform.getLocation().append(values.projectName).toFile();
-            if (dest.exists()) {
-                return new Status(IStatus.ERROR, AdtPlugin.PLUGIN_ID, String.format(
-                   "There is already a file or directory named \"%1$s\" in the selected location.",
-                        values.projectName));
-            }
-        }
-
-        return null;
-    }
-
-    private IStatus validateProjectLocation() {
-        if (mValues.useDefaultLocation) {
-            return validateLocationInWorkspace(mValues);
-        }
-
-        String location = mLocationText.getText();
-        if (location.trim().isEmpty()) {
-            return new Status(IStatus.ERROR, AdtPlugin.PLUGIN_ID,
-                    "Provide a valid file system location where the project should be created.");
-        }
-
-        File f = new File(location);
-        if (f.exists()) {
-            if (!f.isDirectory()) {
-                return new Status(IStatus.ERROR, AdtPlugin.PLUGIN_ID,
-                        String.format("'%s' is not a valid folder.", location));
-            }
-
-            File[] children = f.listFiles();
-            if (children != null && children.length > 0) {
-                return new Status(IStatus.ERROR, AdtPlugin.PLUGIN_ID,
-                        String.format("Folder '%s' is not empty.", location));
-            }
-        }
-
-        // if the folder doesn't exist, then make sure that the parent
-        // exists and is a writable folder
-        File parent = f.getParentFile();
-        if (!parent.exists()) {
-            return new Status(IStatus.ERROR, AdtPlugin.PLUGIN_ID,
-                    String.format("Folder '%s' does not exist.", parent.getName()));
-        }
-
-        if (!parent.isDirectory()) {
-            return new Status(IStatus.ERROR, AdtPlugin.PLUGIN_ID,
-                    String.format("'%s' is not a folder.", parent.getName()));
-        }
-
-        if (!parent.canWrite()) {
-            return new Status(IStatus.ERROR, AdtPlugin.PLUGIN_ID,
-                    String.format("'%s' is not writeable.", parent.getName()));
-        }
-
-        return null;
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/templates/StringEvaluator.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/templates/StringEvaluator.java
deleted file mode 100644
index c1c8073..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/templates/StringEvaluator.java
+++ /dev/null
@@ -1,101 +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.ide.eclipse.adt.internal.wizards.templates;
-
-import static com.android.tools.lint.detector.api.LintUtils.assertionsEnabled;
-
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-import com.android.ide.eclipse.adt.AdtPlugin;
-
-import freemarker.cache.TemplateLoader;
-import freemarker.template.Configuration;
-import freemarker.template.DefaultObjectWrapper;
-import freemarker.template.Template;
-
-import java.io.IOException;
-import java.io.Reader;
-import java.io.StringReader;
-import java.io.StringWriter;
-import java.util.List;
-import java.util.Map;
-
-/**
- * A template handler which can evaluate simple strings. Used to evaluate
- * parameter constraints during UI wizard value editing.
- * <p>
- * Unlike the more general {@link TemplateHandler} which is used to instantiate
- * full template files (from resources, merging into existing files etc) this
- * evaluator supports only simple strings, referencing only values from the
- * provided map (and builtin functions).
- */
-class StringEvaluator implements TemplateLoader {
-    private Map<String, Object> mParameters;
-    private Configuration mFreemarker;
-    private String mCurrentExpression;
-
-    StringEvaluator() {
-        mParameters = TemplateHandler.createBuiltinMap();
-
-        mFreemarker = new Configuration();
-        mFreemarker.setObjectWrapper(new DefaultObjectWrapper());
-        mFreemarker.setTemplateLoader(this);
-    }
-
-    /** Evaluates the given expression, with the given set of parameters */
-    @Nullable
-    String evaluate(@NonNull String expression, @NonNull List<Parameter> parameters) {
-        // Render the instruction list template.
-        for (Parameter parameter : parameters) {
-            mParameters.put(parameter.id, parameter.value);
-        }
-        try {
-            mCurrentExpression = expression;
-            Template inputsTemplate = mFreemarker.getTemplate(expression);
-            StringWriter out = new StringWriter();
-            inputsTemplate.process(mParameters, out);
-            out.flush();
-            return out.toString();
-        } catch (Exception e) {
-            if (assertionsEnabled()) {
-                AdtPlugin.log(e, null);
-            }
-            return null;
-        }
-    }
-
-    // ---- Implements TemplateLoader ----
-
-    @Override
-    public Object findTemplateSource(String name) throws IOException {
-        return mCurrentExpression;
-    }
-
-    @Override
-    public long getLastModified(Object templateSource) {
-        return 0;
-    }
-
-    @Override
-    public Reader getReader(Object templateSource, String encoding) throws IOException {
-        return new StringReader(mCurrentExpression);
-    }
-
-    @Override
-    public void closeTemplateSource(Object templateSource) throws IOException {
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/templates/TemplateHandler.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/templates/TemplateHandler.java
deleted file mode 100644
index 8e11841..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/templates/TemplateHandler.java
+++ /dev/null
@@ -1,1239 +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.ide.eclipse.adt.internal.wizards.templates;
-
-import static com.android.SdkConstants.ATTR_PACKAGE;
-import static com.android.SdkConstants.DOT_AIDL;
-import static com.android.SdkConstants.DOT_FTL;
-import static com.android.SdkConstants.DOT_JAVA;
-import static com.android.SdkConstants.DOT_RS;
-import static com.android.SdkConstants.DOT_SVG;
-import static com.android.SdkConstants.DOT_TXT;
-import static com.android.SdkConstants.DOT_XML;
-import static com.android.SdkConstants.EXT_XML;
-import static com.android.SdkConstants.FD_NATIVE_LIBS;
-import static com.android.SdkConstants.XMLNS_PREFIX;
-import static com.android.ide.eclipse.adt.internal.wizards.templates.InstallDependencyPage.SUPPORT_LIBRARY_NAME;
-import static com.android.ide.eclipse.adt.internal.wizards.templates.TemplateManager.getTemplateRootFolder;
-
-import com.android.SdkConstants;
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-import com.android.annotations.VisibleForTesting;
-import com.android.ide.common.xml.XmlFormatStyle;
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.ide.eclipse.adt.AdtUtils;
-import com.android.ide.eclipse.adt.internal.actions.AddSupportJarAction;
-import com.android.ide.eclipse.adt.internal.editors.formatting.EclipseXmlFormatPreferences;
-import com.android.ide.eclipse.adt.internal.editors.formatting.EclipseXmlPrettyPrinter;
-import com.android.ide.eclipse.adt.internal.editors.layout.gle2.DomUtilities;
-import com.android.ide.eclipse.adt.internal.project.BaseProjectHelper;
-import com.android.ide.eclipse.adt.internal.sdk.AdtManifestMergeCallback;
-import com.android.manifmerger.ManifestMerger;
-import com.android.manifmerger.MergerLog;
-import com.android.resources.ResourceFolderType;
-import com.android.utils.SdkUtils;
-import com.google.common.base.Charsets;
-import com.google.common.collect.Lists;
-import com.google.common.io.Files;
-
-import freemarker.cache.TemplateLoader;
-import freemarker.template.Configuration;
-import freemarker.template.DefaultObjectWrapper;
-import freemarker.template.Template;
-import freemarker.template.TemplateException;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.JavaCore;
-import org.eclipse.jdt.core.ToolFactory;
-import org.eclipse.jdt.core.formatter.CodeFormatter;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.jface.operation.IRunnableWithProgress;
-import org.eclipse.jface.text.BadLocationException;
-import org.eclipse.jface.text.IDocument;
-import org.eclipse.ltk.core.refactoring.Change;
-import org.eclipse.ltk.core.refactoring.NullChange;
-import org.eclipse.ltk.core.refactoring.TextFileChange;
-import org.eclipse.swt.SWT;
-import org.eclipse.text.edits.InsertEdit;
-import org.eclipse.text.edits.MultiTextEdit;
-import org.eclipse.text.edits.ReplaceEdit;
-import org.eclipse.text.edits.TextEdit;
-import org.osgi.framework.Constants;
-import org.osgi.framework.Version;
-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 org.xml.sax.Attributes;
-import org.xml.sax.SAXException;
-import org.xml.sax.helpers.DefaultHandler;
-
-import java.io.ByteArrayInputStream;
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStreamReader;
-import java.io.Reader;
-import java.io.StringWriter;
-import java.io.Writer;
-import java.lang.reflect.InvocationTargetException;
-import java.net.URL;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import javax.xml.parsers.SAXParser;
-import javax.xml.parsers.SAXParserFactory;
-
-/**
- * Handler which manages instantiating FreeMarker templates, copying resources
- * and merging into existing files
- */
-class TemplateHandler {
-    /** Highest supported format; templates with a higher number will be skipped
-     * <p>
-     * <ul>
-     * <li> 1: Initial format, supported by ADT 20 and up.
-     * <li> 2: ADT 21 and up. Boolean variables that have a default value and are not
-     *    edited by the user would end up as strings in ADT 20; now they are always
-     *    proper Booleans. Templates which rely on this should specify format >= 2.
-     * <li> 3: The wizard infrastructure passes the {@code isNewProject} boolean variable
-     *    to indicate whether a wizard is created as part of a new blank project
-     * <li> 4: The templates now specify dependencies in the recipe file.
-     * </ul>
-     */
-    static final int CURRENT_FORMAT = 4;
-
-    /**
-     * Special marker indicating that this path refers to the special shared
-     * resource directory rather than being somewhere inside the root/ directory
-     * where all template specific resources are found
-     */
-    private static final String VALUE_TEMPLATE_DIR = "$TEMPLATEDIR"; //$NON-NLS-1$
-
-    /**
-     * Directory within the template which contains the resources referenced
-     * from the template.xml file
-     */
-    private static final String DATA_ROOT = "root";      //$NON-NLS-1$
-
-    /**
-     * Shared resource directory containing common resources shared among
-     * multiple templates
-     */
-    private static final String RESOURCE_ROOT = "resources";   //$NON-NLS-1$
-
-    /** Reserved filename which describes each template */
-    static final String TEMPLATE_XML = "template.xml";   //$NON-NLS-1$
-
-    // Various tags and attributes used in the template metadata files - template.xml,
-    // globals.xml.ftl, recipe.xml.ftl, etc.
-
-    static final String TAG_MERGE = "merge";             //$NON-NLS-1$
-    static final String TAG_EXECUTE = "execute";         //$NON-NLS-1$
-    static final String TAG_GLOBALS = "globals";         //$NON-NLS-1$
-    static final String TAG_GLOBAL = "global";           //$NON-NLS-1$
-    static final String TAG_PARAMETER = "parameter";     //$NON-NLS-1$
-    static final String TAG_COPY = "copy";               //$NON-NLS-1$
-    static final String TAG_INSTANTIATE = "instantiate"; //$NON-NLS-1$
-    static final String TAG_OPEN = "open";               //$NON-NLS-1$
-    static final String TAG_THUMB = "thumb";             //$NON-NLS-1$
-    static final String TAG_THUMBS = "thumbs";           //$NON-NLS-1$
-    static final String TAG_DEPENDENCY = "dependency";   //$NON-NLS-1$
-    static final String TAG_ICONS = "icons";             //$NON-NLS-1$
-    static final String TAG_FORMFACTOR = "formfactor";   //$NON-NLS-1$
-    static final String TAG_CATEGORY = "category";       //$NON-NLS-1$
-    static final String ATTR_FORMAT = "format";          //$NON-NLS-1$
-    static final String ATTR_REVISION = "revision";      //$NON-NLS-1$
-    static final String ATTR_VALUE = "value";            //$NON-NLS-1$
-    static final String ATTR_DEFAULT = "default";        //$NON-NLS-1$
-    static final String ATTR_SUGGEST = "suggest";        //$NON-NLS-1$
-    static final String ATTR_ID = "id";                  //$NON-NLS-1$
-    static final String ATTR_NAME = "name";              //$NON-NLS-1$
-    static final String ATTR_DESCRIPTION = "description";//$NON-NLS-1$
-    static final String ATTR_TYPE = "type";              //$NON-NLS-1$
-    static final String ATTR_HELP = "help";              //$NON-NLS-1$
-    static final String ATTR_FILE = "file";              //$NON-NLS-1$
-    static final String ATTR_TO = "to";                  //$NON-NLS-1$
-    static final String ATTR_FROM = "from";              //$NON-NLS-1$
-    static final String ATTR_CONSTRAINTS = "constraints";//$NON-NLS-1$
-    static final String ATTR_BACKGROUND = "background";  //$NON-NLS-1$
-    static final String ATTR_FOREGROUND = "foreground";  //$NON-NLS-1$
-    static final String ATTR_SHAPE = "shape";            //$NON-NLS-1$
-    static final String ATTR_TRIM = "trim";              //$NON-NLS-1$
-    static final String ATTR_PADDING = "padding";        //$NON-NLS-1$
-    static final String ATTR_SOURCE_TYPE = "source";     //$NON-NLS-1$
-    static final String ATTR_CLIPART_NAME = "clipartName";//$NON-NLS-1$
-    static final String ATTR_TEXT = "text";              //$NON-NLS-1$
-    static final String ATTR_SRC_DIR = "srcDir";         //$NON-NLS-1$
-    static final String ATTR_SRC_OUT = "srcOut";         //$NON-NLS-1$
-    static final String ATTR_RES_DIR = "resDir";         //$NON-NLS-1$
-    static final String ATTR_RES_OUT = "resOut";         //$NON-NLS-1$
-    static final String ATTR_MANIFEST_DIR = "manifestDir";//$NON-NLS-1$
-    static final String ATTR_MANIFEST_OUT = "manifestOut";//$NON-NLS-1$
-    static final String ATTR_PROJECT_DIR = "projectDir"; //$NON-NLS-1$
-    static final String ATTR_PROJECT_OUT = "projectOut"; //$NON-NLS-1$
-    static final String ATTR_MAVEN_URL = "mavenUrl";     //$NON-NLS-1$
-    static final String ATTR_DEBUG_KEYSTORE_SHA1 = 
-    		"debugKeystoreSha1";                         //$NON-NLS-1$
-
-    static final String CATEGORY_ACTIVITIES = "activities";//$NON-NLS-1$
-    static final String CATEGORY_PROJECTS = "projects";    //$NON-NLS-1$
-    static final String CATEGORY_OTHER = "other";          //$NON-NLS-1$
-
-    static final String MAVEN_SUPPORT_V4 = "support-v4";   //$NON-NLS-1$
-    static final String MAVEN_SUPPORT_V13 = "support-v13"; //$NON-NLS-1$
-    static final String MAVEN_APPCOMPAT = "appcompat-v7";  //$NON-NLS-1$
-
-    /** Default padding to apply in wizards around the thumbnail preview images */
-    static final int PREVIEW_PADDING = 10;
-
-    /** Default width to scale thumbnail preview images in wizards to */
-    static final int PREVIEW_WIDTH = 200;
-
-    /**
-     * List of files to open after the wizard has been created (these are
-     * identified by {@link #TAG_OPEN} elements in the recipe file
-     */
-    private final List<String> mOpen = Lists.newArrayList();
-
-    /**
-     * List of actions to perform after the wizard has finished.
-     */
-    protected List<Runnable> mFinalizingActions = Lists.newArrayList();
-
-    /** Path to the directory containing the templates */
-    @NonNull
-    private final File mRootPath;
-
-    /** The changes being processed by the template handler */
-    private List<Change> mMergeChanges;
-    private List<Change> mTextChanges;
-    private List<Change> mOtherChanges;
-
-    /** The project to write the template into */
-    private IProject mProject;
-
-    /** The template loader which is responsible for finding (and sharing) template files */
-    private final MyTemplateLoader mLoader;
-
-    /** Agree to all file-overwrites from now on? */
-    private boolean mYesToAll = false;
-
-    /** Is writing the template cancelled? */
-    private boolean mNoToAll = false;
-
-    /**
-     * Should files that we merge contents into be backed up? If yes, will
-     * create emacs-style tilde-file backups (filename.xml~)
-     */
-    private boolean mBackupMergedFiles = true;
-
-    /**
-     * Template metadata
-     */
-    private TemplateMetadata mTemplate;
-
-    private final TemplateManager mManager;
-
-    /** Creates a new {@link TemplateHandler} for the given root path */
-    static TemplateHandler createFromPath(File rootPath) {
-        return new TemplateHandler(rootPath, new TemplateManager());
-    }
-
-    /** Creates a new {@link TemplateHandler} for the template name, which should
-     * be relative to the templates directory */
-    static TemplateHandler createFromName(String category, String name) {
-        TemplateManager manager = new TemplateManager();
-
-        // Use the TemplateManager iteration which should merge contents between the
-        // extras/templates/ and tools/templates folders and pick the most recent version
-        List<File> templates = manager.getTemplates(category);
-        for (File file : templates) {
-            if (file.getName().equals(name) && category.equals(file.getParentFile().getName())) {
-                return new TemplateHandler(file, manager);
-            }
-        }
-
-        return new TemplateHandler(new File(getTemplateRootFolder(),
-                category + File.separator + name), manager);
-    }
-
-    private TemplateHandler(File rootPath, TemplateManager manager) {
-        mRootPath = rootPath;
-        mManager = manager;
-        mLoader = new MyTemplateLoader();
-        mLoader.setPrefix(mRootPath.getPath());
-    }
-
-    public TemplateManager getManager() {
-        return mManager;
-    }
-
-    public void setBackupMergedFiles(boolean backupMergedFiles) {
-        mBackupMergedFiles = backupMergedFiles;
-    }
-
-    @NonNull
-    public List<Change> render(IProject project, Map<String, Object> args) {
-        mOpen.clear();
-
-        mProject = project;
-        mMergeChanges = new ArrayList<Change>();
-        mTextChanges = new ArrayList<Change>();
-        mOtherChanges = new ArrayList<Change>();
-
-        // Render the instruction list template.
-        Map<String, Object> paramMap = createParameterMap(args);
-        Configuration freemarker = new Configuration();
-        freemarker.setObjectWrapper(new DefaultObjectWrapper());
-        freemarker.setTemplateLoader(mLoader);
-
-        processVariables(freemarker, TEMPLATE_XML, paramMap);
-
-        // Add the changes in the order where merges are shown first, then text files,
-        // and finally other files (like jars and icons which don't have previews).
-        List<Change> changes = new ArrayList<Change>();
-        changes.addAll(mMergeChanges);
-        changes.addAll(mTextChanges);
-        changes.addAll(mOtherChanges);
-        return changes;
-    }
-
-    Map<String, Object> createParameterMap(Map<String, Object> args) {
-        final Map<String, Object> paramMap = createBuiltinMap();
-
-        // Wizard parameters supplied by user, specific to this template
-        paramMap.putAll(args);
-
-        return paramMap;
-    }
-
-    /** Data model for the templates */
-    static Map<String, Object> createBuiltinMap() {
-        // Create the data model.
-        final Map<String, Object> paramMap = new HashMap<String, Object>();
-
-        // Builtin conversion methods
-        paramMap.put("slashedPackageName", new FmSlashedPackageNameMethod());       //$NON-NLS-1$
-        paramMap.put("camelCaseToUnderscore", new FmCamelCaseToUnderscoreMethod()); //$NON-NLS-1$
-        paramMap.put("underscoreToCamelCase", new FmUnderscoreToCamelCaseMethod()); //$NON-NLS-1$
-        paramMap.put("activityToLayout", new FmActivityToLayoutMethod());           //$NON-NLS-1$
-        paramMap.put("layoutToActivity", new FmLayoutToActivityMethod());           //$NON-NLS-1$
-        paramMap.put("classToResource", new FmClassNameToResourceMethod());         //$NON-NLS-1$
-        paramMap.put("escapeXmlAttribute", new FmEscapeXmlStringMethod());          //$NON-NLS-1$
-        paramMap.put("escapeXmlText", new FmEscapeXmlStringMethod());               //$NON-NLS-1$
-        paramMap.put("escapeXmlString", new FmEscapeXmlStringMethod());             //$NON-NLS-1$
-        paramMap.put("extractLetters", new FmExtractLettersMethod());               //$NON-NLS-1$
-
-        // This should be handled better: perhaps declared "required packages" as part of the
-        // inputs? (It would be better if we could conditionally disable template based
-        // on availability)
-        Map<String, String> builtin = new HashMap<String, String>();
-        builtin.put("templatesRes", VALUE_TEMPLATE_DIR); //$NON-NLS-1$
-        paramMap.put("android", builtin);                //$NON-NLS-1$
-
-        return paramMap;
-    }
-
-    static void addDirectoryParameters(Map<String, Object> parameters, IProject project) {
-        IPath srcDir = project.getFile(SdkConstants.SRC_FOLDER).getProjectRelativePath();
-        parameters.put(ATTR_SRC_DIR, srcDir.toString());
-
-        IPath resDir = project.getFile(SdkConstants.RES_FOLDER).getProjectRelativePath();
-        parameters.put(ATTR_RES_DIR, resDir.toString());
-
-        IPath manifestDir = project.getProjectRelativePath();
-        parameters.put(ATTR_MANIFEST_DIR, manifestDir.toString());
-        parameters.put(ATTR_MANIFEST_OUT, manifestDir.toString());
-        
-        parameters.put(ATTR_PROJECT_DIR, manifestDir.toString());
-        parameters.put(ATTR_PROJECT_OUT, manifestDir.toString());
-        
-        parameters.put(ATTR_DEBUG_KEYSTORE_SHA1, "");
-    }
-
-    @Nullable
-    public TemplateMetadata getTemplate() {
-        if (mTemplate == null) {
-            mTemplate = mManager.getTemplate(mRootPath);
-        }
-
-        return mTemplate;
-    }
-
-    @NonNull
-    public String getResourcePath(String templateName) {
-        return new File(mRootPath.getPath(), templateName).getPath();
-    }
-
-    /**
-     * Load a text resource for the given relative path within the template
-     *
-     * @param relativePath relative path within the template
-     * @return the string contents of the template text file
-     */
-    @Nullable
-    public String readTemplateTextResource(@NonNull String relativePath) {
-        try {
-            return Files.toString(new File(mRootPath,
-                    relativePath.replace('/', File.separatorChar)), Charsets.UTF_8);
-        } catch (IOException e) {
-            AdtPlugin.log(e, null);
-            return null;
-        }
-    }
-
-    @Nullable
-    public String readTemplateTextResource(@NonNull File file) {
-        assert file.isAbsolute();
-        try {
-            return Files.toString(file, Charsets.UTF_8);
-        } catch (IOException e) {
-            AdtPlugin.log(e, null);
-            return null;
-        }
-    }
-
-    /**
-     * Reads the contents of a resource
-     *
-     * @param relativePath the path relative to the template directory
-     * @return the binary data read from the file
-     */
-    @Nullable
-    public byte[] readTemplateResource(@NonNull String relativePath) {
-        try {
-            return Files.toByteArray(new File(mRootPath, relativePath));
-        } catch (IOException e) {
-            AdtPlugin.log(e, null);
-            return null;
-        }
-    }
-
-    /**
-     * Most recent thrown exception during template instantiation. This should
-     * basically always be null. Used by unit tests to see if any template
-     * instantiation recorded a failure.
-     */
-    @VisibleForTesting
-    public static Exception sMostRecentException;
-
-    /** Read the given FreeMarker file and process the variable definitions */
-    private void processVariables(final Configuration freemarker,
-            String file, final Map<String, Object> paramMap) {
-        try {
-            String xml;
-            if (file.endsWith(DOT_XML)) {
-                // Just read the file
-                xml = readTemplateTextResource(file);
-                if (xml == null) {
-                    return;
-                }
-            } else {
-                mLoader.setTemplateFile(new File(mRootPath, file));
-                Template inputsTemplate = freemarker.getTemplate(file);
-                StringWriter out = new StringWriter();
-                inputsTemplate.process(paramMap, out);
-                out.flush();
-                xml = out.toString();
-            }
-
-            SAXParserFactory factory = SAXParserFactory.newInstance();
-            SAXParser saxParser = factory.newSAXParser();
-            saxParser.parse(new ByteArrayInputStream(xml.getBytes()), new DefaultHandler() {
-                @Override
-                public void startElement(String uri, String localName, String name,
-                        Attributes attributes)
-                                throws SAXException {
-                    if (TAG_PARAMETER.equals(name)) {
-                        String id = attributes.getValue(ATTR_ID);
-                        if (!paramMap.containsKey(id)) {
-                            String value = attributes.getValue(ATTR_DEFAULT);
-                            Object mapValue = value;
-                            if (value != null && !value.isEmpty()) {
-                                String type = attributes.getValue(ATTR_TYPE);
-                                if ("boolean".equals(type)) { //$NON-NLS-1$
-                                    mapValue = Boolean.valueOf(value);
-                                }
-                            }
-                            paramMap.put(id, mapValue);
-                        }
-                    } else if (TAG_GLOBAL.equals(name)) {
-                        String id = attributes.getValue(ATTR_ID);
-                        if (!paramMap.containsKey(id)) {
-                        	paramMap.put(id, TypedVariable.parseGlobal(attributes));
-                        }
-                    } else if (TAG_GLOBALS.equals(name)) {
-                        // Handle evaluation of variables
-                        String path = attributes.getValue(ATTR_FILE);
-                        if (path != null) {
-                            processVariables(freemarker, path, paramMap);
-                        } // else: <globals> root element
-                    } else if (TAG_EXECUTE.equals(name)) {
-                        String path = attributes.getValue(ATTR_FILE);
-                        if (path != null) {
-                            execute(freemarker, path, paramMap);
-                        }
-                    } else if (TAG_DEPENDENCY.equals(name)) {
-                        String dependencyName = attributes.getValue(ATTR_NAME);
-                        if (dependencyName.equals(SUPPORT_LIBRARY_NAME)) {
-                            // We assume the revision requirement has been satisfied
-                            // by the wizard
-                            File path = AddSupportJarAction.getSupportJarFile();
-                            if (path != null) {
-                                IPath to = getTargetPath(FD_NATIVE_LIBS +'/' + path.getName());
-                                try {
-                                    copy(path, to);
-                                } catch (IOException ioe) {
-                                    AdtPlugin.log(ioe, null);
-                                }
-                            }
-                        }
-                    } else if (!name.equals("template") && !name.equals(TAG_CATEGORY) &&
-                    		!name.equals(TAG_FORMFACTOR) && !name.equals("option") &&
-                    		!name.equals(TAG_THUMBS) && !name.equals(TAG_THUMB) &&
-                    		!name.equals(TAG_ICONS)) {
-                        System.err.println("WARNING: Unknown template directive " + name);
-                    }
-                }
-            });
-        } catch (Exception e) {
-            sMostRecentException = e;
-            AdtPlugin.log(e, null);
-        }
-    }
-
-    @SuppressWarnings("unused")
-    private boolean canOverwrite(File file) {
-        if (file.exists()) {
-            // Warn that the file already exists and ask the user what to do
-            if (!mYesToAll) {
-                MessageDialog dialog = new MessageDialog(null, "File Already Exists", null,
-                        String.format(
-                                "%1$s already exists.\nWould you like to replace it?",
-                                file.getPath()),
-                                MessageDialog.QUESTION, new String[] {
-                    // Yes will be moved to the end because it's the default
-                    "Yes", "No", "Cancel", "Yes to All"
-                }, 0);
-                int result = dialog.open();
-                switch (result) {
-                case 0:
-                    // Yes
-                    break;
-                case 3:
-                    // Yes to all
-                    mYesToAll = true;
-                    break;
-                case 1:
-                    // No
-                    return false;
-                case SWT.DEFAULT:
-                case 2:
-                    // Cancel
-                    mNoToAll = true;
-                    return false;
-                }
-            }
-
-            if (mBackupMergedFiles) {
-                return makeBackup(file);
-            } else {
-                return file.delete();
-            }
-        }
-
-        return true;
-    }
-
-    /** Executes the given recipe file: copying, merging, instantiating, opening files etc */
-    private void execute(
-            final Configuration freemarker,
-            String file,
-            final Map<String, Object> paramMap) {
-        try {
-            mLoader.setTemplateFile(new File(mRootPath, file));
-            Template freemarkerTemplate = freemarker.getTemplate(file);
-
-            StringWriter out = new StringWriter();
-            freemarkerTemplate.process(paramMap, out);
-            out.flush();
-            String xml = out.toString();
-
-            // Parse and execute the resulting instruction list.
-            SAXParserFactory factory = SAXParserFactory.newInstance();
-            SAXParser saxParser = factory.newSAXParser();
-
-            saxParser.parse(new ByteArrayInputStream(xml.getBytes()),
-                    new DefaultHandler() {
-                @Override
-                public void startElement(String uri, String localName, String name,
-                        Attributes attributes)
-                                throws SAXException {
-                    if (mNoToAll) {
-                        return;
-                    }
-
-                    try {
-                        boolean instantiate = TAG_INSTANTIATE.equals(name);
-                        if (TAG_COPY.equals(name) || instantiate) {
-                            String fromPath = attributes.getValue(ATTR_FROM);
-                            String toPath = attributes.getValue(ATTR_TO);
-                            if (toPath == null || toPath.isEmpty()) {
-                                toPath = attributes.getValue(ATTR_FROM);
-                                toPath = AdtUtils.stripSuffix(toPath, DOT_FTL);
-                            }
-                            IPath to = getTargetPath(toPath);
-                            if (instantiate) {
-                                instantiate(freemarker, paramMap, fromPath, to);
-                            } else {
-                                copyTemplateResource(fromPath, to);
-                            }
-                        } else if (TAG_MERGE.equals(name)) {
-                            String fromPath = attributes.getValue(ATTR_FROM);
-                            String toPath = attributes.getValue(ATTR_TO);
-                            if (toPath == null || toPath.isEmpty()) {
-                                toPath = attributes.getValue(ATTR_FROM);
-                                toPath = AdtUtils.stripSuffix(toPath, DOT_FTL);
-                            }
-                            // Resources in template.xml are located within root/
-                            IPath to = getTargetPath(toPath);
-                            merge(freemarker, paramMap, fromPath, to);
-                        } else if (name.equals(TAG_OPEN)) {
-                            // The relative path here is within the output directory:
-                            String relativePath = attributes.getValue(ATTR_FILE);
-                            if (relativePath != null && !relativePath.isEmpty()) {
-                                mOpen.add(relativePath);
-                            }
-                        } else if (TAG_DEPENDENCY.equals(name)) {
-                            String dependencyUrl = attributes.getValue(ATTR_MAVEN_URL);
-                            File path;
-                            if (dependencyUrl.contains(MAVEN_SUPPORT_V4)) {
-                                // We assume the revision requirement has been satisfied
-                                // by the wizard
-                                path = AddSupportJarAction.getSupportJarFile();
-                            } else if (dependencyUrl.contains(MAVEN_SUPPORT_V13)) {
-                                path = AddSupportJarAction.getSupport13JarFile();
-                            } else if (dependencyUrl.contains(MAVEN_APPCOMPAT)) {
-                                path = null;
-                                mFinalizingActions.add(new Runnable() {
-                                    @Override
-                                    public void run() {
-                                        AddSupportJarAction.installAppCompatLibrary(mProject, true);
-                                    }
-                                });
-                            } else {
-                                path = null;
-                                System.err.println("WARNING: Unknown dependency type");
-                            }
-
-                            if (path != null) {
-                                IPath to = getTargetPath(FD_NATIVE_LIBS +'/' + path.getName());
-                                try {
-                                    copy(path, to);
-                                } catch (IOException ioe) {
-                                    AdtPlugin.log(ioe, null);
-                                }
-                            }
-                        } else if (!name.equals("recipe") && !name.equals(TAG_DEPENDENCY)) { //$NON-NLS-1$
-                            System.err.println("WARNING: Unknown template directive " + name);
-                        }
-                    } catch (Exception e) {
-                        sMostRecentException = e;
-                        AdtPlugin.log(e, null);
-                    }
-                }
-            });
-
-        } catch (Exception e) {
-            sMostRecentException = e;
-            AdtPlugin.log(e, null);
-        }
-    }
-
-    @NonNull
-    private File getFullPath(@NonNull String fromPath) {
-        if (fromPath.startsWith(VALUE_TEMPLATE_DIR)) {
-            return new File(getTemplateRootFolder(), RESOURCE_ROOT + File.separator
-                    + fromPath.substring(VALUE_TEMPLATE_DIR.length() + 1).replace('/',
-                            File.separatorChar));
-        }
-        return new File(mRootPath, DATA_ROOT + File.separator + fromPath);
-    }
-
-    @NonNull
-    private IPath getTargetPath(@NonNull String relative) {
-        if (relative.indexOf('\\') != -1) {
-            relative = relative.replace('\\', '/');
-        }
-        return new Path(relative);
-    }
-
-    @NonNull
-    private IFile getTargetFile(@NonNull IPath path) {
-        return mProject.getFile(path);
-    }
-
-    private void merge(
-            @NonNull final Configuration freemarker,
-            @NonNull final Map<String, Object> paramMap,
-            @NonNull String relativeFrom,
-            @NonNull IPath toPath) throws IOException, TemplateException {
-
-        String currentXml = null;
-
-        IFile to = getTargetFile(toPath);
-        if (to.exists()) {
-            currentXml = AdtPlugin.readFile(to);
-        }
-
-        if (currentXml == null) {
-            // The target file doesn't exist: don't merge, just copy
-            boolean instantiate = relativeFrom.endsWith(DOT_FTL);
-            if (instantiate) {
-                instantiate(freemarker, paramMap, relativeFrom, toPath);
-            } else {
-                copyTemplateResource(relativeFrom, toPath);
-            }
-            return;
-        }
-
-        if (!to.getFileExtension().equals(EXT_XML)) {
-            throw new RuntimeException("Only XML files can be merged at this point: " + to);
-        }
-
-        String xml = null;
-        File from = getFullPath(relativeFrom);
-        if (relativeFrom.endsWith(DOT_FTL)) {
-            // Perform template substitution of the template prior to merging
-            mLoader.setTemplateFile(from);
-            Template template = freemarker.getTemplate(from.getName());
-            Writer out = new StringWriter();
-            template.process(paramMap, out);
-            out.flush();
-            xml = out.toString();
-        } else {
-            xml = readTemplateTextResource(from);
-            if (xml == null) {
-                return;
-            }
-        }
-
-        Document currentDocument = DomUtilities.parseStructuredDocument(currentXml);
-        assert currentDocument != null : currentXml;
-        Document fragment = DomUtilities.parseStructuredDocument(xml);
-        assert fragment != null : xml;
-
-        XmlFormatStyle formatStyle = XmlFormatStyle.MANIFEST;
-        boolean modified;
-        boolean ok;
-        String fileName = to.getName();
-        if (fileName.equals(SdkConstants.FN_ANDROID_MANIFEST_XML)) {
-            modified = ok = mergeManifest(currentDocument, fragment);
-        } else {
-            // Merge plain XML files
-            String parentFolderName = to.getParent().getName();
-            ResourceFolderType folderType = ResourceFolderType.getFolderType(parentFolderName);
-            if (folderType != null) {
-                formatStyle = EclipseXmlPrettyPrinter.getForFile(toPath);
-            } else {
-                formatStyle = XmlFormatStyle.FILE;
-            }
-
-            modified = mergeResourceFile(currentDocument, fragment, folderType, paramMap);
-            ok = true;
-        }
-
-        // Finally write out the merged file (formatting etc)
-        String contents = null;
-        if (ok) {
-            if (modified) {
-                contents = EclipseXmlPrettyPrinter.prettyPrint(currentDocument,
-                        EclipseXmlFormatPreferences.create(), formatStyle, null,
-                        currentXml.endsWith("\n")); //$NON-NLS-1$
-            }
-        } else {
-            // Just insert into file along with comment, using the "standard" conflict
-            // syntax that many tools and editors recognize.
-            String sep = SdkUtils.getLineSeparator();
-            contents =
-                    "<<<<<<< Original" + sep
-                    + currentXml + sep
-                    + "=======" + sep
-                    + xml
-                    + ">>>>>>> Added" + sep;
-        }
-
-        if (contents != null) {
-            TextFileChange change = new TextFileChange("Merge " + fileName, to);
-            MultiTextEdit rootEdit = new MultiTextEdit();
-            rootEdit.addChild(new ReplaceEdit(0, currentXml.length(), contents));
-            change.setEdit(rootEdit);
-            change.setTextType(SdkConstants.EXT_XML);
-            mMergeChanges.add(change);
-        }
-    }
-
-    /** Merges the given resource file contents into the given resource file
-     * @param paramMap */
-    private static boolean mergeResourceFile(Document currentDocument, Document fragment,
-            ResourceFolderType folderType, Map<String, Object> paramMap) {
-        boolean modified = false;
-
-        // Copy namespace declarations
-        NamedNodeMap attributes = fragment.getDocumentElement().getAttributes();
-        if (attributes != null) {
-            for (int i = 0, n = attributes.getLength(); i < n; i++) {
-                Attr attribute = (Attr) attributes.item(i);
-                if (attribute.getName().startsWith(XMLNS_PREFIX)) {
-                    currentDocument.getDocumentElement().setAttribute(attribute.getName(),
-                            attribute.getValue());
-                }
-            }
-        }
-
-        // For layouts for example, I want to *append* inside the root all the
-        // contents of the new file.
-        // But for resources for example, I want to combine elements which specify
-        // the same name or id attribute.
-        // For elements like manifest files we need to insert stuff at the right
-        // location in a nested way (activities in the application element etc)
-        // but that doesn't happen for the other file types.
-        Element root = fragment.getDocumentElement();
-        NodeList children = root.getChildNodes();
-        List<Node> nodes = new ArrayList<Node>(children.getLength());
-        for (int i = children.getLength() - 1; i >= 0; i--) {
-            Node child = children.item(i);
-            nodes.add(child);
-            root.removeChild(child);
-        }
-        Collections.reverse(nodes);
-
-        root = currentDocument.getDocumentElement();
-
-        if (folderType == ResourceFolderType.VALUES) {
-            // Try to merge items of the same name
-            Map<String, Node> old = new HashMap<String, Node>();
-            NodeList newSiblings = root.getChildNodes();
-            for (int i = newSiblings.getLength() - 1; i >= 0; i--) {
-                Node child = newSiblings.item(i);
-                if (child.getNodeType() == Node.ELEMENT_NODE) {
-                    Element element = (Element) child;
-                    String name = getResourceId(element);
-                    if (name != null) {
-                        old.put(name, element);
-                    }
-                }
-            }
-
-            for (Node node : nodes) {
-                if (node.getNodeType() == Node.ELEMENT_NODE) {
-                    Element element = (Element) node;
-                    String name = getResourceId(element);
-                    Node replace = name != null ? old.get(name) : null;
-                    if (replace != null) {
-                        // There is an existing item with the same id: just replace it
-                        // ACTUALLY -- let's NOT change it.
-                        // Let's say you've used the activity wizard once, and it
-                        // emits some configuration parameter as a resource that
-                        // it depends on, say "padding". Then the user goes and
-                        // tweaks the padding to some other number.
-                        // Now running the wizard a *second* time for some new activity,
-                        // we should NOT go and set the value back to the template's
-                        // default!
-                        //root.replaceChild(node, replace);
-
-                        // ... ON THE OTHER HAND... What if it's a parameter class
-                        // (where the template rewrites a common attribute). Here it's
-                        // really confusing if the new parameter is not set. This is
-                        // really an error in the template, since we shouldn't have conflicts
-                        // like that, but we need to do something to help track this down.
-                        AdtPlugin.log(null,
-                                "Warning: Ignoring name conflict in resource file for name %1$s",
-                                name);
-                    } else {
-                        root.appendChild(node);
-                        modified = true;
-                    }
-                }
-            }
-        } else {
-            // In other file types, such as layouts, just append all the new content
-            // at the end.
-            for (Node node : nodes) {
-                root.appendChild(node);
-                modified = true;
-            }
-        }
-        return modified;
-    }
-
-    /** Merges the given manifest fragment into the given manifest file */
-    private static boolean mergeManifest(Document currentManifest, Document fragment) {
-        // TODO change MergerLog.wrapSdkLog by a custom IMergerLog that will create
-        // and maintain error markers.
-
-        // Transfer package element from manifest to merged in root; required by
-        // manifest merger
-        Element fragmentRoot = fragment.getDocumentElement();
-        Element manifestRoot = currentManifest.getDocumentElement();
-        if (fragmentRoot == null || manifestRoot == null) {
-            return false;
-        }
-        String pkg = fragmentRoot.getAttribute(ATTR_PACKAGE);
-        if (pkg == null || pkg.isEmpty()) {
-            pkg = manifestRoot.getAttribute(ATTR_PACKAGE);
-            if (pkg != null && !pkg.isEmpty()) {
-                fragmentRoot.setAttribute(ATTR_PACKAGE, pkg);
-            }
-        }
-
-        ManifestMerger merger = new ManifestMerger(
-                MergerLog.wrapSdkLog(AdtPlugin.getDefault()),
-                new AdtManifestMergeCallback()).setExtractPackagePrefix(true);
-        return currentManifest != null &&
-                fragment != null &&
-                merger.process(currentManifest, fragment);
-    }
-
-    /**
-     * Makes a backup of the given file, if it exists, by renaming it to name~
-     * (and removing an old name~ file if it exists)
-     */
-    private static boolean makeBackup(File file) {
-        if (!file.exists()) {
-            return true;
-        }
-        if (file.isDirectory()) {
-            return false;
-        }
-
-        File backupFile = new File(file.getParentFile(), file.getName() + '~');
-        if (backupFile.exists()) {
-            backupFile.delete();
-        }
-        return file.renameTo(backupFile);
-    }
-
-    private static String getResourceId(Element element) {
-        String name = element.getAttribute(ATTR_NAME);
-        if (name == null) {
-            name = element.getAttribute(ATTR_ID);
-        }
-
-        return name;
-    }
-
-    /** Instantiates the given template file into the given output file */
-    private void instantiate(
-            @NonNull final Configuration freemarker,
-            @NonNull final Map<String, Object> paramMap,
-            @NonNull String relativeFrom,
-            @NonNull IPath to) throws IOException, TemplateException {
-        // For now, treat extension-less files as directories... this isn't quite right
-        // so I should refine this! Maybe with a unique attribute in the template file?
-        boolean isDirectory = relativeFrom.indexOf('.') == -1;
-        if (isDirectory) {
-            // It's a directory
-            copyTemplateResource(relativeFrom, to);
-        } else {
-            File from = getFullPath(relativeFrom);
-            mLoader.setTemplateFile(from);
-            Template template = freemarker.getTemplate(from.getName());
-            Writer out = new StringWriter(1024);
-            template.process(paramMap, out);
-            out.flush();
-            String contents = out.toString();
-
-            contents = format(mProject, contents, to);
-            IFile targetFile = getTargetFile(to);
-            TextFileChange change = createNewFileChange(targetFile);
-            MultiTextEdit rootEdit = new MultiTextEdit();
-            rootEdit.addChild(new InsertEdit(0, contents));
-            change.setEdit(rootEdit);
-            mTextChanges.add(change);
-        }
-    }
-
-    private static String format(IProject project, String contents, IPath to) {
-        String name = to.lastSegment();
-        if (name.endsWith(DOT_XML)) {
-            XmlFormatStyle formatStyle = EclipseXmlPrettyPrinter.getForFile(to);
-            EclipseXmlFormatPreferences prefs = EclipseXmlFormatPreferences.create();
-            return EclipseXmlPrettyPrinter.prettyPrint(contents, prefs, formatStyle, null);
-        } else if (name.endsWith(DOT_JAVA)) {
-            Map<?, ?> options = null;
-            if (project != null && project.isAccessible()) {
-                try {
-                    IJavaProject javaProject = BaseProjectHelper.getJavaProject(project);
-                    if (javaProject != null) {
-                        options = javaProject.getOptions(true);
-                    }
-                } catch (CoreException e) {
-                    AdtPlugin.log(e, null);
-                }
-            }
-            if (options == null) {
-                options = JavaCore.getOptions();
-            }
-
-            CodeFormatter formatter = ToolFactory.createCodeFormatter(options);
-
-            try {
-                IDocument doc = new org.eclipse.jface.text.Document();
-                // format the file (the meat and potatoes)
-                doc.set(contents);
-                TextEdit edit = formatter.format(
-                        CodeFormatter.K_COMPILATION_UNIT | CodeFormatter.F_INCLUDE_COMMENTS,
-                        contents, 0, contents.length(), 0, null);
-                if (edit != null) {
-                    edit.apply(doc);
-                }
-
-                return doc.get();
-            } catch (Exception e) {
-                AdtPlugin.log(e, null);
-            }
-        }
-
-        return contents;
-    }
-
-    private static TextFileChange createNewFileChange(IFile targetFile) {
-        String fileName = targetFile.getName();
-        String message;
-        if (targetFile.exists()) {
-            message = String.format("Replace %1$s", fileName);
-        } else {
-            message = String.format("Create %1$s", fileName);
-        }
-
-        TextFileChange change = new TextFileChange(message, targetFile) {
-            @Override
-            protected IDocument acquireDocument(IProgressMonitor pm) throws CoreException {
-                IDocument document = super.acquireDocument(pm);
-
-                // In our case, we know we *always* use this TextFileChange
-                // to *create* files, we're not appending to existing files.
-                // However, due to the following bug we can end up with cached
-                // contents of previously deleted files that happened to have the
-                // same file name:
-                //   https://bugs.eclipse.org/bugs/show_bug.cgi?id=390402
-                // Therefore, as a workaround, wipe out the cached contents here
-                if (document.getLength() > 0) {
-                    try {
-                        document.replace(0, document.getLength(), "");
-                    } catch (BadLocationException e) {
-                        // pass
-                    }
-                }
-
-                return document;
-            }
-        };
-        change.setTextType(fileName.substring(fileName.lastIndexOf('.') + 1));
-        return change;
-    }
-
-    /**
-     * Returns the list of files to open when the template has been created
-     *
-     * @return the list of files to open
-     */
-    @NonNull
-    public List<String> getFilesToOpen() {
-        return mOpen;
-    }
-
-    /**
-     * Returns the list of actions to perform when the template has been created
-     *
-     * @return the list of actions to perform
-     */
-    @NonNull
-    public List<Runnable> getFinalizingActions() {
-        return mFinalizingActions;
-    }
-
-    /** Copy a template resource */
-    private final void copyTemplateResource(
-            @NonNull String relativeFrom,
-            @NonNull IPath output) throws IOException {
-        File from = getFullPath(relativeFrom);
-        copy(from, output);
-    }
-
-    /** Returns true if the given file contains the given bytes */
-    private static boolean isIdentical(@Nullable byte[] data, @NonNull IFile dest) {
-        assert dest.exists();
-        byte[] existing = AdtUtils.readData(dest);
-        return Arrays.equals(existing, data);
-    }
-
-    /**
-     * Copies the given source file into the given destination file (where the
-     * source is allowed to be a directory, in which case the whole directory is
-     * copied recursively)
-     */
-    private void copy(File src, IPath path) throws IOException {
-        if (src.isDirectory()) {
-            File[] children = src.listFiles();
-            if (children != null) {
-                for (File child : children) {
-                    copy(child, path.append(child.getName()));
-                }
-            }
-        } else {
-            IResource dest = mProject.getFile(path);
-            if (dest.exists() && !(dest instanceof IFile)) {// Don't attempt to overwrite a folder
-                assert false : dest.getClass().getName();
-            return;
-            }
-            IFile file = (IFile) dest;
-            String targetName = path.lastSegment();
-            if (dest instanceof IFile) {
-                if (dest.exists() && isIdentical(Files.toByteArray(src), file)) {
-                    String label = String.format(
-                            "Not overwriting %1$s because the files are identical", targetName);
-                    NullChange change = new NullChange(label);
-                    change.setEnabled(false);
-                    mOtherChanges.add(change);
-                    return;
-                }
-            }
-
-            if (targetName.endsWith(DOT_XML)
-                    || targetName.endsWith(DOT_JAVA)
-                    || targetName.endsWith(DOT_TXT)
-                    || targetName.endsWith(DOT_RS)
-                    || targetName.endsWith(DOT_AIDL)
-                    || targetName.endsWith(DOT_SVG)) {
-
-                String newFile = Files.toString(src, Charsets.UTF_8);
-                newFile = format(mProject, newFile, path);
-
-                TextFileChange addFile = createNewFileChange(file);
-                addFile.setEdit(new InsertEdit(0, newFile));
-                mTextChanges.add(addFile);
-            } else {
-                // Write binary file: Need custom change for that
-                IPath workspacePath = mProject.getFullPath().append(path);
-                mOtherChanges.add(new CreateFileChange(targetName, workspacePath, src));
-            }
-        }
-    }
-
-    /**
-     * A custom {@link TemplateLoader} which locates and provides templates
-     * within the plugin .jar file
-     */
-    private static final class MyTemplateLoader implements TemplateLoader {
-        private String mPrefix;
-
-        public void setPrefix(String prefix) {
-            mPrefix = prefix;
-        }
-
-        public void setTemplateFile(File file) {
-            setTemplateParent(file.getParentFile());
-        }
-
-        public void setTemplateParent(File parent) {
-            mPrefix = parent.getPath();
-        }
-
-        @Override
-        public Reader getReader(Object templateSource, String encoding) throws IOException {
-            URL url = (URL) templateSource;
-            return new InputStreamReader(url.openStream(), encoding);
-        }
-
-        @Override
-        public long getLastModified(Object templateSource) {
-            return 0;
-        }
-
-        @Override
-        public Object findTemplateSource(String name) throws IOException {
-            String path = mPrefix != null ? mPrefix + '/' + name : name;
-            File file = new File(path);
-            if (file.exists()) {
-                return file.toURI().toURL();
-            }
-            return null;
-        }
-
-        @Override
-        public void closeTemplateSource(Object templateSource) throws IOException {
-        }
-    }
-
-    /**
-     * Validates this template to make sure it's supported
-     * @param currentMinSdk the minimum SDK in the project, or -1 or 0 if unknown (e.g. codename)
-     * @param buildApi the build API, or -1 or 0 if unknown (e.g. codename)
-     *
-     * @return a status object with the error, or null if there is no problem
-     */
-    @SuppressWarnings("cast") // In Eclipse 3.6.2 cast below is needed
-    @Nullable
-    public IStatus validateTemplate(int currentMinSdk, int buildApi) {
-        TemplateMetadata template = getTemplate();
-        if (template == null) {
-            return null;
-        }
-        if (!template.isSupported()) {
-            String versionString = (String) AdtPlugin.getDefault().getBundle().getHeaders().get(
-                    Constants.BUNDLE_VERSION);
-            Version version = new Version(versionString);
-            return new Status(IStatus.ERROR, AdtPlugin.PLUGIN_ID,
-                    String.format("This template requires a more recent version of the " +
-                            "Android Eclipse plugin. Please update from version %1$d.%2$d.%3$d.",
-                            version.getMajor(), version.getMinor(), version.getMicro()));
-        }
-        int templateMinSdk = template.getMinSdk();
-        if (templateMinSdk > currentMinSdk && currentMinSdk >= 1) {
-            return new Status(IStatus.ERROR, AdtPlugin.PLUGIN_ID,
-                    String.format("This template requires a minimum SDK version of at " +
-                            "least %1$d, and the current min version is %2$d",
-                            templateMinSdk, currentMinSdk));
-        }
-        int templateMinBuildApi = template.getMinBuildApi();
-        if (templateMinBuildApi >  buildApi && buildApi >= 1) {
-            return new Status(IStatus.ERROR, AdtPlugin.PLUGIN_ID,
-                    String.format("This template requires a build target API version of at " +
-                            "least %1$d, and the current version is %2$d",
-                            templateMinBuildApi, buildApi));
-        }
-
-        return null;
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/templates/TemplateManager.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/templates/TemplateManager.java
deleted file mode 100644
index 30dd09e..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/templates/TemplateManager.java
+++ /dev/null
@@ -1,261 +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.ide.eclipse.adt.internal.wizards.templates;
-
-import static com.android.SdkConstants.FD_EXTRAS;
-import static com.android.SdkConstants.FD_TEMPLATES;
-import static com.android.SdkConstants.FD_TOOLS;
-import static com.android.ide.eclipse.adt.internal.wizards.templates.TemplateHandler.TEMPLATE_XML;
-
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.ide.eclipse.adt.AdtUtils;
-import com.android.ide.eclipse.adt.internal.editors.layout.gle2.DomUtilities;
-import com.android.ide.eclipse.adt.internal.preferences.AdtPrefs;
-import com.google.common.base.Charsets;
-import com.google.common.collect.Maps;
-import com.google.common.collect.Sets;
-import com.google.common.io.Files;
-
-import org.w3c.dom.Document;
-
-import java.io.File;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-/** Handles locating templates and providing template metadata */
-public class TemplateManager {
-	private static final Set<String> EXCLUDED_CATEGORIES = Sets.newHashSet("Folder", "Google");
-	private static final Set<String> EXCLUDED_FORMFACTORS = Sets.newHashSet("Wear", "TV");
-	
-    TemplateManager() {
-    }
-
-    /** @return the root folder containing templates */
-    @Nullable
-    public static File getTemplateRootFolder() {
-        String location = AdtPrefs.getPrefs().getOsSdkFolder();
-        if (location != null) {
-            File folder = new File(location, FD_TOOLS + File.separator + FD_TEMPLATES);
-            if (folder.isDirectory()) {
-                return folder;
-            }
-        }
-
-        return null;
-    }
-
-    /** @return the root folder containing extra templates */
-    @NonNull
-    public static List<File> getExtraTemplateRootFolders() {
-        List<File> folders = new ArrayList<File>();
-        String location = AdtPrefs.getPrefs().getOsSdkFolder();
-        if (location != null) {
-            File extras = new File(location, FD_EXTRAS);
-            if (extras.isDirectory()) {
-                for (File vendor : AdtUtils.listFiles(extras)) {
-                    if (!vendor.isDirectory()) {
-                        continue;
-                    }
-                    for (File pkg : AdtUtils.listFiles(vendor)) {
-                        if (pkg.isDirectory()) {
-                            File folder = new File(pkg, FD_TEMPLATES);
-                            if (folder.isDirectory()) {
-                                folders.add(folder);
-                            }
-                        }
-                    }
-                }
-
-                // Legacy
-                File folder = new File(extras, FD_TEMPLATES);
-                if (folder.isDirectory()) {
-                    folders.add(folder);
-                }
-            }
-        }
-
-        return folders;
-    }
-
-    /**
-     * Returns a template file under the given root, if it exists
-     *
-     * @param root the root folder
-     * @param relativePath the relative path
-     * @return a template file under the given root, if it exists
-     */
-    @Nullable
-    public static File getTemplateLocation(@NonNull File root, @NonNull String relativePath) {
-        File templateRoot = getTemplateRootFolder();
-        if (templateRoot != null) {
-            String rootPath = root.getPath();
-            File templateFile = new File(templateRoot,
-                    rootPath.replace('/', File.separatorChar) + File.separator
-                    + relativePath.replace('/', File.separatorChar));
-            if (templateFile.exists()) {
-                return templateFile;
-            }
-        }
-
-        return null;
-    }
-
-    /**
-     * Returns a template file under one of the available roots, if it exists
-     *
-     * @param relativePath the relative path
-     * @return a template file under one of the available roots, if it exists
-     */
-    @Nullable
-    public static File getTemplateLocation(@NonNull String relativePath) {
-        File templateRoot = getTemplateRootFolder();
-        if (templateRoot != null) {
-            File templateFile = new File(templateRoot,
-                    relativePath.replace('/', File.separatorChar));
-            if (templateFile.exists()) {
-                return templateFile;
-            }
-        }
-
-        return null;
-
-    }
-
-    /**
-     * Returns all the templates with the given prefix
-     *
-     * @param folder the folder prefix
-     * @return the available templates
-     */
-    @NonNull
-    List<File> getTemplates(@NonNull String folder) {
-        List<File> templates = new ArrayList<File>();
-        Map<String, File> templateNames = Maps.newHashMap();
-        File root = getTemplateRootFolder();
-        if (root != null) {
-            File[] files = new File(root, folder).listFiles();
-            if (files != null) {
-                for (File file : files) {
-                    if (file.isDirectory()) { // Avoid .DS_Store etc
-                        templates.add(file);
-                        templateNames.put(file.getName(), file);
-                    }
-                }
-            }
-        }
-
-        // Add in templates from extras/ as well.
-        for (File extra : getExtraTemplateRootFolders()) {
-            File[] files = new File(extra, folder).listFiles();
-            if (files != null) {
-                for (File file : files) {
-                    if (file.isDirectory()) {
-                        File replaces = templateNames.get(file.getName());
-                        if (replaces != null) {
-                            int compare = compareTemplates(replaces, file);
-                            if (compare > 0) {
-                                int index = templates.indexOf(replaces);
-                                if (index != -1) {
-                                    templates.set(index, file);
-                                } else {
-                                    templates.add(file);
-                                }
-                            }
-                        } else {
-                            templates.add(file);
-                        }
-                    }
-                }
-            }
-        }
-
-        // Sort by file name (not path as is File's default)
-        if (templates.size() > 1) {
-            Collections.sort(templates, new Comparator<File>() {
-                @Override
-                public int compare(File file1, File file2) {
-                    return file1.getName().compareTo(file2.getName());
-                }
-            });
-        }
-
-        return templates;
-    }
-
-    /**
-     * Compare two files, and return the one with the HIGHEST revision, and if
-     * the same, most recently modified
-     */
-    private int compareTemplates(File file1, File file2) {
-        TemplateMetadata template1 = getTemplate(file1);
-        TemplateMetadata template2 = getTemplate(file2);
-
-        if (template1 == null) {
-            return 1;
-        } else if (template2 == null) {
-            return -1;
-        } else {
-            int delta = template2.getRevision() - template1.getRevision();
-            if (delta == 0) {
-                delta = (int) (file2.lastModified() - file1.lastModified());
-            }
-            return delta;
-        }
-    }
-
-    /** Cache for {@link #getTemplate()} */
-    private Map<File, TemplateMetadata> mTemplateMap;
-
-    @Nullable
-    TemplateMetadata getTemplate(File templateDir) {
-        if (mTemplateMap != null) {
-            TemplateMetadata metadata = mTemplateMap.get(templateDir);
-            if (metadata != null) {
-                return metadata;
-            }
-        } else {
-            mTemplateMap = Maps.newHashMap();
-        }
-
-        try {
-            File templateFile = new File(templateDir, TEMPLATE_XML);
-            if (templateFile.isFile()) {
-                String xml = Files.toString(templateFile, Charsets.UTF_8);
-                Document doc = DomUtilities.parseDocument(xml, true);
-                if (doc != null && doc.getDocumentElement() != null) {
-                    TemplateMetadata metadata = new TemplateMetadata(doc);
-                    if (EXCLUDED_CATEGORIES.contains(metadata.getCategory()) ||
-                    	EXCLUDED_FORMFACTORS.contains(metadata.getFormFactor())) {
-                    	return null;
-                    }
-                    mTemplateMap.put(templateDir, metadata);
-                    return metadata;
-                }
-            }
-        } catch (IOException e) {
-            AdtPlugin.log(e, null);
-        }
-
-        return null;
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/templates/TemplateMetadata.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/templates/TemplateMetadata.java
deleted file mode 100644
index 4ce7d74..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/templates/TemplateMetadata.java
+++ /dev/null
@@ -1,468 +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.ide.eclipse.adt.internal.wizards.templates;
-
-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;
-import static com.android.ide.eclipse.adt.internal.wizards.templates.NewProjectWizard.ATTR_REVISION;
-import static com.android.ide.eclipse.adt.internal.wizards.templates.TemplateHandler.ATTR_BACKGROUND;
-import static com.android.ide.eclipse.adt.internal.wizards.templates.TemplateHandler.ATTR_CLIPART_NAME;
-import static com.android.ide.eclipse.adt.internal.wizards.templates.TemplateHandler.ATTR_DESCRIPTION;
-import static com.android.ide.eclipse.adt.internal.wizards.templates.TemplateHandler.ATTR_FOREGROUND;
-import static com.android.ide.eclipse.adt.internal.wizards.templates.TemplateHandler.ATTR_FORMAT;
-import static com.android.ide.eclipse.adt.internal.wizards.templates.TemplateHandler.ATTR_NAME;
-import static com.android.ide.eclipse.adt.internal.wizards.templates.TemplateHandler.ATTR_PADDING;
-import static com.android.ide.eclipse.adt.internal.wizards.templates.TemplateHandler.ATTR_SHAPE;
-import static com.android.ide.eclipse.adt.internal.wizards.templates.TemplateHandler.ATTR_SOURCE_TYPE;
-import static com.android.ide.eclipse.adt.internal.wizards.templates.TemplateHandler.ATTR_TEXT;
-import static com.android.ide.eclipse.adt.internal.wizards.templates.TemplateHandler.ATTR_TRIM;
-import static com.android.ide.eclipse.adt.internal.wizards.templates.TemplateHandler.ATTR_TYPE;
-import static com.android.ide.eclipse.adt.internal.wizards.templates.TemplateHandler.ATTR_VALUE;
-import static com.android.ide.eclipse.adt.internal.wizards.templates.TemplateHandler.CURRENT_FORMAT;
-import static com.android.ide.eclipse.adt.internal.wizards.templates.TemplateHandler.TAG_DEPENDENCY;
-import static com.android.ide.eclipse.adt.internal.wizards.templates.TemplateHandler.TAG_ICONS;
-import static com.android.ide.eclipse.adt.internal.wizards.templates.TemplateHandler.TAG_PARAMETER;
-import static com.android.ide.eclipse.adt.internal.wizards.templates.TemplateHandler.TAG_THUMB;
-import static com.android.ide.eclipse.adt.internal.wizards.templates.TemplateHandler.TAG_FORMFACTOR;
-import static com.android.ide.eclipse.adt.internal.wizards.templates.TemplateHandler.TAG_CATEGORY;
-
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-import com.android.assetstudiolib.GraphicGenerator;
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.ide.eclipse.adt.internal.assetstudio.AssetType;
-import com.android.ide.eclipse.adt.internal.assetstudio.CreateAssetSetWizardState;
-import com.android.ide.eclipse.adt.internal.assetstudio.CreateAssetSetWizardState.SourceType;
-import com.android.ide.eclipse.adt.internal.editors.IconFactory;
-import com.android.ide.eclipse.adt.internal.editors.layout.gle2.ImageUtils;
-import com.android.utils.Pair;
-import com.google.common.collect.Lists;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.graphics.RGB;
-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.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Locale;
-import java.util.Map;
-
-/** An ADT template along with metadata */
-class TemplateMetadata {
-    private final Document mDocument;
-    private final List<Parameter> mParameters;
-    private final Map<String, Parameter> mParameterMap;
-    private List<Pair<String, Integer>> mDependencies;
-    private Integer mMinApi;
-    private Integer mMinBuildApi;
-    private Integer mRevision;
-    private boolean mNoIcons;
-    private CreateAssetSetWizardState mIconState;
-	private String mFormFactor;
-	private String mCategory;
-
-    TemplateMetadata(@NonNull Document document) {
-        mDocument = document;
-
-        NodeList parameters = mDocument.getElementsByTagName(TAG_PARAMETER);
-        mParameters = new ArrayList<Parameter>(parameters.getLength());
-        mParameterMap = new HashMap<String, Parameter>(parameters.getLength());
-        for (int index = 0, max = parameters.getLength(); index < max; index++) {
-            Element element = (Element) parameters.item(index);
-            Parameter parameter = new Parameter(this, element);
-            mParameters.add(parameter);
-            if (parameter.id != null) {
-                mParameterMap.put(parameter.id, parameter);
-            }
-        }
-    }
-
-    boolean isSupported() {
-        String versionString = mDocument.getDocumentElement().getAttribute(ATTR_FORMAT);
-        if (versionString != null && !versionString.isEmpty()) {
-            try {
-                int version = Integer.parseInt(versionString);
-                return version <= CURRENT_FORMAT;
-            } catch (NumberFormatException nufe) {
-                return false;
-            }
-        }
-
-        // Older templates without version specified: supported
-        return true;
-    }
-
-    @Nullable
-    String getTitle() {
-        String name = mDocument.getDocumentElement().getAttribute(ATTR_NAME);
-        if (name != null && !name.isEmpty()) {
-            return name;
-        }
-
-        return null;
-    }
-
-    @Nullable
-    String getDescription() {
-        String description = mDocument.getDocumentElement().getAttribute(ATTR_DESCRIPTION);
-        if (description != null && !description.isEmpty()) {
-            return description;
-        }
-
-        return null;
-    }
-
-    int getMinSdk() {
-        if (mMinApi == null) {
-            mMinApi = 1;
-            String api = mDocument.getDocumentElement().getAttribute(ATTR_MIN_API);
-            if (api != null && !api.isEmpty()) {
-                try {
-                    mMinApi = Integer.parseInt(api);
-                } catch (NumberFormatException nufe) {
-                    // Templates aren't allowed to contain codenames, should always be an integer
-                    AdtPlugin.log(nufe, null);
-                    mMinApi = 1;
-                }
-            }
-        }
-
-        return mMinApi.intValue();
-    }
-
-    int getMinBuildApi() {
-        if (mMinBuildApi == null) {
-            mMinBuildApi = 1;
-            String api = mDocument.getDocumentElement().getAttribute(ATTR_MIN_BUILD_API);
-            if (api != null && !api.isEmpty()) {
-                try {
-                    mMinBuildApi = Integer.parseInt(api);
-                } catch (NumberFormatException nufe) {
-                    // Templates aren't allowed to contain codenames, should always be an integer
-                    AdtPlugin.log(nufe, null);
-                    mMinBuildApi = 1;
-                }
-            }
-        }
-
-        return mMinBuildApi.intValue();
-    }
-
-    public int getRevision() {
-        if (mRevision == null) {
-            mRevision = 1;
-            String revision = mDocument.getDocumentElement().getAttribute(ATTR_REVISION);
-            if (revision != null && !revision.isEmpty()) {
-                try {
-                    mRevision = Integer.parseInt(revision);
-                } catch (NumberFormatException nufe) {
-                    AdtPlugin.log(nufe, null);
-                    mRevision = 1;
-                }
-            }
-        }
-
-        return mRevision.intValue();
-    }
-    
-    public String getFormFactor() {
-        if (mFormFactor == null) {
-            mFormFactor = "Mobile";
-            
-            NodeList formfactorDeclarations = mDocument.getElementsByTagName(TAG_FORMFACTOR);
-            if (formfactorDeclarations.getLength() > 0) {
-            	Element element = (Element) formfactorDeclarations.item(0);
-                String formFactor = element.getAttribute(ATTR_VALUE);
-                if (formFactor != null && !formFactor.isEmpty()) {
-                	mFormFactor = formFactor;
-                }
-            }
-        }
-        return mFormFactor;
-    }
-    
-    public String getCategory() {
-        if (mCategory == null) {
-        	mCategory = "";
-        	NodeList categories = mDocument.getElementsByTagName(TAG_CATEGORY);
-            if (categories.getLength() > 0) {
-            	Element element = (Element) categories.item(0);
-            	String category = element.getAttribute(ATTR_VALUE);
-                if (category != null && !category.isEmpty()) {
-                	mCategory = category;
-                }
-            }
-        }
-        return mCategory;
-    }
-
-    /**
-     * Returns a suitable icon wizard state instance if this wizard requests
-     * icons to be created, and null otherwise
-     *
-     * @return icon wizard state or null
-     */
-    @Nullable
-    public CreateAssetSetWizardState getIconState(IProject project) {
-        if (mIconState == null && !mNoIcons) {
-            NodeList icons = mDocument.getElementsByTagName(TAG_ICONS);
-            if (icons.getLength() < 1) {
-                mNoIcons = true;
-                return null;
-            }
-            Element icon = (Element) icons.item(0);
-
-            mIconState = new CreateAssetSetWizardState();
-            mIconState.project = project;
-
-            String typeString = getAttributeOrNull(icon, ATTR_TYPE);
-            if (typeString != null) {
-                typeString = typeString.toUpperCase(Locale.US);
-                boolean found = false;
-                for (AssetType type : AssetType.values()) {
-                    if (typeString.equals(type.name())) {
-                        mIconState.type = type;
-                        found = true;
-                        break;
-                    }
-                }
-                if (!found) {
-                    AdtPlugin.log(null, "Unknown asset type %1$s", typeString);
-                }
-            }
-
-            mIconState.outputName = getAttributeOrNull(icon, ATTR_NAME);
-            if (mIconState.outputName != null) {
-                // Register parameter such that if it is referencing other values, it gets
-                // updated when other values are edited
-                Parameter outputParameter = new Parameter(this,
-                        Parameter.Type.STRING, "_iconname", mIconState.outputName); //$NON-NLS-1$
-                getParameters().add(outputParameter);
-            }
-
-            RGB background = getRgb(icon, ATTR_BACKGROUND);
-            if (background != null) {
-                mIconState.background = background;
-            }
-            RGB foreground = getRgb(icon, ATTR_FOREGROUND);
-            if (foreground != null) {
-                mIconState.foreground = foreground;
-            }
-            String shapeString = getAttributeOrNull(icon, ATTR_SHAPE);
-            if (shapeString != null) {
-                shapeString = shapeString.toUpperCase(Locale.US);
-                boolean found = false;
-                for (GraphicGenerator.Shape shape : GraphicGenerator.Shape.values()) {
-                    if (shapeString.equals(shape.name())) {
-                        mIconState.shape = shape;
-                        found = true;
-                        break;
-                    }
-                }
-                if (!found) {
-                    AdtPlugin.log(null, "Unknown shape %1$s", shapeString);
-                }
-            }
-            String trimString = getAttributeOrNull(icon, ATTR_TRIM);
-            if (trimString != null) {
-                mIconState.trim = Boolean.valueOf(trimString);
-            }
-            String paddingString = getAttributeOrNull(icon, ATTR_PADDING);
-            if (paddingString != null) {
-                mIconState.padding = Integer.parseInt(paddingString);
-            }
-            String sourceTypeString = getAttributeOrNull(icon, ATTR_SOURCE_TYPE);
-            if (sourceTypeString != null) {
-                sourceTypeString = sourceTypeString.toUpperCase(Locale.US);
-                boolean found = false;
-                for (SourceType type : SourceType.values()) {
-                    if (sourceTypeString.equals(type.name())) {
-                        mIconState.sourceType = type;
-                        found = true;
-                        break;
-                    }
-                }
-                if (!found) {
-                    AdtPlugin.log(null, "Unknown source type %1$s", sourceTypeString);
-                }
-            }
-            mIconState.clipartName = getAttributeOrNull(icon, ATTR_CLIPART_NAME);
-
-            String textString = getAttributeOrNull(icon, ATTR_TEXT);
-            if (textString != null) {
-                mIconState.text = textString;
-            }
-        }
-
-        return mIconState;
-    }
-
-    void updateIconName(List<Parameter> parameters, StringEvaluator evaluator) {
-        if (mIconState != null) {
-            NodeList icons = mDocument.getElementsByTagName(TAG_ICONS);
-            if (icons.getLength() < 1) {
-                return;
-            }
-            Element icon = (Element) icons.item(0);
-            String name = getAttributeOrNull(icon, ATTR_NAME);
-            if (name != null) {
-                mIconState.outputName = evaluator.evaluate(name, parameters);
-            }
-        }
-    }
-
-    private static RGB getRgb(@NonNull Element element, @NonNull String name) {
-        String colorString = getAttributeOrNull(element, name);
-        if (colorString != null) {
-            int rgb = ImageUtils.getColor(colorString.trim());
-            return ImageUtils.intToRgb(rgb);
-        }
-
-        return null;
-    }
-
-    @Nullable
-    private static String getAttributeOrNull(@NonNull Element element, @NonNull String name) {
-        String value = element.getAttribute(name);
-        if (value != null && value.isEmpty()) {
-            return null;
-        }
-        return value;
-    }
-
-    @Nullable
-    String getThumbnailPath() {
-        // Apply selector logic. Pick the thumb first thumb that satisfies the largest number
-        // of conditions.
-        NodeList thumbs = mDocument.getElementsByTagName(TAG_THUMB);
-        if (thumbs.getLength() == 0) {
-            return null;
-        }
-
-
-        int bestMatchCount = 0;
-        Element bestMatch = null;
-
-        for (int i = 0, n = thumbs.getLength(); i < n; i++) {
-            Element thumb = (Element) thumbs.item(i);
-
-            NamedNodeMap attributes = thumb.getAttributes();
-            if (bestMatch == null && attributes.getLength() == 0) {
-                bestMatch = thumb;
-            } else if (attributes.getLength() <= bestMatchCount) {
-                // Already have a match with this number of attributes, no point checking
-                continue;
-            } else {
-                boolean match = true;
-                for (int j = 0, max = attributes.getLength(); j < max; j++) {
-                    Attr attribute = (Attr) attributes.item(j);
-                    Parameter parameter = mParameterMap.get(attribute.getName());
-                    if (parameter == null) {
-                        AdtPlugin.log(null, "Unexpected parameter in template thumbnail: %1$s",
-                                attribute.getName());
-                        continue;
-                    }
-                    String thumbNailValue = attribute.getValue();
-                    String editedValue = parameter.value != null ? parameter.value.toString() : "";
-                    if (!thumbNailValue.equals(editedValue)) {
-                        match = false;
-                        break;
-                    }
-                }
-                if (match) {
-                    bestMatch = thumb;
-                    bestMatchCount = attributes.getLength();
-                }
-            }
-        }
-
-        if (bestMatch != null) {
-            NodeList children = bestMatch.getChildNodes();
-            for (int i = 0, n = children.getLength(); i < n; i++) {
-                Node child = children.item(i);
-                if (child.getNodeType() == Node.TEXT_NODE) {
-                    return child.getNodeValue().trim();
-                }
-            }
-        }
-
-        return null;
-    }
-
-    /**
-     * Returns the dependencies (as a list of pairs of names and revisions)
-     * required by this template
-     */
-    List<Pair<String, Integer>> getDependencies() {
-        if (mDependencies == null) {
-            NodeList elements = mDocument.getElementsByTagName(TAG_DEPENDENCY);
-            if (elements.getLength() == 0) {
-                return Collections.emptyList();
-            }
-
-            List<Pair<String, Integer>> dependencies = Lists.newArrayList();
-            for (int i = 0, n = elements.getLength(); i < n; i++) {
-                Element element = (Element) elements.item(i);
-                String name = element.getAttribute(ATTR_NAME);
-                int revision = -1;
-                String revisionString = element.getAttribute(ATTR_REVISION);
-                if (!revisionString.isEmpty()) {
-                    revision = Integer.parseInt(revisionString);
-                }
-                dependencies.add(Pair.of(name, revision));
-            }
-            mDependencies = dependencies;
-        }
-
-        return mDependencies;
-    }
-
-    /** Returns the list of available parameters */
-    @NonNull
-    List<Parameter> getParameters() {
-        return mParameters;
-    }
-
-    /**
-     * Returns the parameter of the given id, or null if not found
-     *
-     * @param id the id of the target parameter
-     * @return the corresponding parameter, or null if not found
-     */
-    @Nullable
-    public Parameter getParameter(@NonNull String id) {
-        for (Parameter parameter : mParameters) {
-            if (id.equals(parameter.id)) {
-                return parameter;
-            }
-        }
-
-        return null;
-    }
-
-    /** Returns a default icon for templates */
-    static Image getDefaultTemplateIcon() {
-        return IconFactory.getInstance().getIcon("default_template"); //$NON-NLS-1$
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/templates/TemplatePreviewPage.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/templates/TemplatePreviewPage.java
deleted file mode 100644
index c3d28fc..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/templates/TemplatePreviewPage.java
+++ /dev/null
@@ -1,46 +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.ide.eclipse.adt.internal.wizards.templates;
-
-import org.eclipse.ltk.core.refactoring.Change;
-import org.eclipse.ltk.core.refactoring.CompositeChange;
-import org.eclipse.ltk.internal.ui.refactoring.PreviewWizardPage;
-
-import java.util.List;
-
-@SuppressWarnings("restriction") // Refactoring UI
-class TemplatePreviewPage extends PreviewWizardPage {
-    private final NewTemplateWizardState mValues;
-
-    TemplatePreviewPage(NewTemplateWizardState values) {
-        super(true);
-        mValues = values;
-        setTitle("Preview");
-        setDescription("Optionally review pending changes");
-    }
-
-    @Override
-    public void setVisible(boolean visible) {
-        if (visible) {
-            List<Change> changes = mValues.computeChanges();
-            CompositeChange root = new CompositeChange("Create template",
-                    changes.toArray(new Change[changes.size()]));
-            setChange(root);
-        }
-
-        super.setVisible(visible);
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/templates/TemplateTestPage.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/templates/TemplateTestPage.java
deleted file mode 100644
index e461d55..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/templates/TemplateTestPage.java
+++ /dev/null
@@ -1,161 +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.ide.eclipse.adt.internal.wizards.templates;
-
-import org.eclipse.jface.dialogs.IMessageProvider;
-import org.eclipse.jface.wizard.WizardPage;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.DirectoryDialog;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Text;
-
-import java.io.File;
-
-/** For template developers: Test local template directory */
-public class TemplateTestPage extends WizardPage
-        implements SelectionListener, ModifyListener {
-    private Text mLocation;
-    private Button mButton;
-    private static String sLocation; // Persist between repeated invocations
-    private Button mProjectToggle;
-    private File mTemplate;
-
-    TemplateTestPage() {
-        super("testWizardPage"); //$NON-NLS-1$
-        setTitle("Wizard Tester");
-        setDescription("Test a new template");
-    }
-
-    @SuppressWarnings("unused") // SWT constructors have side effects and aren't unused
-    @Override
-    public void createControl(Composite parent) {
-        Composite container = new Composite(parent, SWT.NULL);
-        setControl(container);
-        container.setLayout(new GridLayout(3, false));
-
-        Label label = new Label(container, SWT.NONE);
-        label.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1));
-        label.setText("Template Location:");
-
-        mLocation = new Text(container, SWT.BORDER);
-        GridData gd_mLocation = new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1);
-        gd_mLocation.widthHint = 400;
-        mLocation.setLayoutData(gd_mLocation);
-        if (sLocation != null) {
-            mLocation.setText(sLocation);
-        }
-        mLocation.addModifyListener(this);
-
-        mButton = new Button(container, SWT.FLAT);
-        mButton.setText("...");
-
-        mProjectToggle = new Button(container, SWT.CHECK);
-        mProjectToggle.setEnabled(false);
-        mProjectToggle.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false, 2, 1));
-        mProjectToggle.setText("Full project template");
-        new Label(container, SWT.NONE);
-        mButton.addSelectionListener(this);
-    }
-
-    @Override
-    public void setVisible(boolean visible) {
-        super.setVisible(visible);
-        validatePage();
-    }
-
-    private boolean validatePage() {
-        String error = null;
-
-        String path = mLocation.getText().trim();
-        if (path == null || path.length() == 0) {
-            error = "Select a template directory";
-            mTemplate = null;
-        } else {
-            mTemplate = new File(path);
-            if (!mTemplate.exists()) {
-                error = String.format("%1$s does not exist", path);
-            } else {
-                // Preserve across wizard sessions
-                sLocation = path;
-
-                if (mTemplate.isDirectory()) {
-                    if (!new File(mTemplate, TemplateHandler.TEMPLATE_XML).exists()) {
-                        error = String.format("Not a template: missing template.xml file in %1$s ",
-                                path);
-                    }
-                } else {
-                    if (mTemplate.getName().equals(TemplateHandler.TEMPLATE_XML)) {
-                        mTemplate = mTemplate.getParentFile();
-                    } else {
-                        error = String.format("Select a directory containing a template");
-                    }
-                }
-            }
-        }
-
-        setPageComplete(error == null);
-        if (error != null) {
-            setMessage(error, IMessageProvider.ERROR);
-        } else {
-            setErrorMessage(null);
-            setMessage(null);
-        }
-
-        return error == null;
-    }
-
-    @Override
-    public void modifyText(ModifyEvent e) {
-        validatePage();
-    }
-
-    @Override
-    public void widgetSelected(SelectionEvent e) {
-        if (e.getSource() == mButton) {
-            DirectoryDialog dialog = new DirectoryDialog(mButton.getShell(), SWT.OPEN);
-            String path = mLocation.getText().trim();
-            if (path.length() > 0) {
-                dialog.setFilterPath(path);
-            }
-            String file = dialog.open();
-            if (file != null) {
-                mLocation.setText(file);
-            }
-        }
-
-        validatePage();
-    }
-
-    File getLocation() {
-        return mTemplate;
-    }
-
-    boolean isProjectTemplate() {
-        return mProjectToggle.getSelection();
-    }
-
-    @Override
-    public void widgetDefaultSelected(SelectionEvent e) {
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/templates/TemplateTestWizard.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/templates/TemplateTestWizard.java
deleted file mode 100644
index b3b1ef2..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/templates/TemplateTestWizard.java
+++ /dev/null
@@ -1,78 +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.ide.eclipse.adt.internal.wizards.templates;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.wizard.IWizardPage;
-import org.eclipse.ui.IWorkbench;
-
-import java.io.File;
-
-/**
- * Template wizard which creates parameterized templates
- */
-public class TemplateTestWizard extends NewTemplateWizard {
-    private TemplateTestPage mSelectionPage;
-    private IProject mProject;
-
-    /** Creates a new wizard for testing template definitions in a local directory */
-    public TemplateTestWizard() {
-        super("");
-    }
-
-    @Override
-    public void init(IWorkbench workbench, IStructuredSelection selection) {
-        super.init(workbench, selection);
-        if (mValues != null) {
-            mProject = mValues.project;
-        }
-
-        mMainPage = null;
-        mValues = null;
-
-        mSelectionPage = new TemplateTestPage();
-    }
-
-    @Override
-    public void addPages() {
-        addPage(mSelectionPage);
-    }
-
-    @Override
-    public IWizardPage getNextPage(IWizardPage page) {
-        if (page == mSelectionPage) {
-            File file = mSelectionPage.getLocation();
-            if (file != null && file.exists()) {
-                if (mValues == null) {
-                    mValues = new NewTemplateWizardState();
-                    mValues.setTemplateLocation(file);
-                    mValues.project = mProject;
-                    hideBuiltinParameters();
-
-                    mMainPage = new NewTemplatePage(mValues, true);
-                    addPage(mMainPage);
-                } else {
-                    mValues.setTemplateLocation(file);
-                }
-
-                return mMainPage;
-            }
-        }
-
-        return super.getNextPage(page);
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/templates/TemplateWizard.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/templates/TemplateWizard.java
deleted file mode 100644
index 7ca32f9..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/templates/TemplateWizard.java
+++ /dev/null
@@ -1,222 +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.ide.eclipse.adt.internal.wizards.templates;
-
-import static org.eclipse.core.resources.IResource.DEPTH_INFINITE;
-
-import com.android.annotations.NonNull;
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.ide.eclipse.adt.internal.assetstudio.ConfigureAssetSetPage;
-import com.android.ide.eclipse.adt.internal.assetstudio.CreateAssetSetWizardState;
-import com.android.ide.eclipse.adt.internal.editors.IconFactory;
-import com.google.common.collect.Lists;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.jface.operation.IRunnableWithProgress;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.wizard.IWizardPage;
-import org.eclipse.jface.wizard.Wizard;
-import org.eclipse.jface.wizard.WizardPage;
-import org.eclipse.ltk.core.refactoring.Change;
-import org.eclipse.ltk.core.refactoring.CompositeChange;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.ui.INewWizard;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.actions.WorkspaceModifyOperation;
-
-import java.lang.reflect.InvocationTargetException;
-import java.util.List;
-import java.util.concurrent.atomic.AtomicBoolean;
-
-import javax.swing.SwingUtilities;
-
-abstract class TemplateWizard extends Wizard implements INewWizard {
-    private static final String PROJECT_LOGO_LARGE = "android-64"; //$NON-NLS-1$
-    protected IWorkbench mWorkbench;
-    private UpdateToolsPage mUpdatePage;
-    private InstallDependencyPage mDependencyPage;
-    private TemplatePreviewPage mPreviewPage;
-    protected ConfigureAssetSetPage mIconPage;
-
-    protected TemplateWizard() {
-    }
-
-    /** Should this wizard add an icon page? */
-    protected boolean shouldAddIconPage() {
-        return false;
-    }
-
-    @Override
-    public void init(IWorkbench workbench, IStructuredSelection selection) {
-        mWorkbench = workbench;
-
-        setHelpAvailable(false);
-        ImageDescriptor desc = IconFactory.getInstance().getImageDescriptor(PROJECT_LOGO_LARGE);
-        setDefaultPageImageDescriptor(desc);
-
-        if (!UpdateToolsPage.isUpToDate()) {
-            mUpdatePage = new UpdateToolsPage();
-        }
-
-        setNeedsProgressMonitor(true);
-
-        // Trigger a check to see if the SDK needs to be reloaded (which will
-        // invoke onSdkLoaded asynchronously as needed).
-        AdtPlugin.getDefault().refreshSdk();
-    }
-
-    @Override
-    public void addPages() {
-        super.addPages();
-        if (mUpdatePage != null) {
-            addPage(mUpdatePage);
-        }
-    }
-
-    @Override
-    public IWizardPage getStartingPage() {
-        if (mUpdatePage != null && mUpdatePage.isPageComplete()) {
-            return getNextPage(mUpdatePage);
-        }
-
-        return super.getStartingPage();
-    }
-
-    protected WizardPage getPreviewPage(NewTemplateWizardState values) {
-        if (mPreviewPage == null) {
-            mPreviewPage = new TemplatePreviewPage(values);
-            addPage(mPreviewPage);
-        }
-
-        return mPreviewPage;
-    }
-
-    protected WizardPage getIconPage(CreateAssetSetWizardState iconState) {
-        if (mIconPage == null) {
-            mIconPage = new ConfigureAssetSetPage(iconState);
-            mIconPage.setTitle("Configure Icon");
-            addPage(mIconPage);
-        }
-
-        return mIconPage;
-    }
-
-    protected WizardPage getDependencyPage(TemplateMetadata template, boolean create) {
-        if (!create) {
-            return mDependencyPage;
-        }
-
-        if (mDependencyPage == null) {
-            mDependencyPage = new InstallDependencyPage();
-            addPage(mDependencyPage);
-        }
-        mDependencyPage.setTemplate(template);
-        return mDependencyPage;
-    }
-
-    /**
-     * Returns the project where the template is being inserted
-     *
-     * @return the project to insert the template into
-     */
-    @NonNull
-    protected abstract IProject getProject();
-
-    /**
-     * Returns the list of files to open, which might be empty. This method will
-     * only be called <b>after</b> {@link #computeChanges()} has been called.
-     *
-     * @return a list of files to open
-     */
-    @NonNull
-    protected abstract List<String> getFilesToOpen();
-
-    /**
-     * Returns the list of files to open, which might be empty. This method will
-     * only be called <b>after</b> {@link #computeChanges()} has been called.
-     *
-     * @return a list of files to open
-     */
-    @NonNull
-    protected abstract List<Runnable> getFinalizingActions();
-
-    /**
-     * Computes the changes to the {@link #getProject()} this template should
-     * perform
-     *
-     * @return the changes to perform
-     */
-    protected abstract List<Change> computeChanges();
-
-    protected boolean performFinish(IProgressMonitor monitor) throws InvocationTargetException {
-        List<Change> changes = computeChanges();
-        if (!changes.isEmpty()) {
-            monitor.beginTask("Creating template...", changes.size());
-            try {
-                CompositeChange composite = new CompositeChange("",
-                        changes.toArray(new Change[changes.size()]));
-                composite.perform(monitor);
-            } catch (CoreException e) {
-                AdtPlugin.log(e, null);
-                throw new InvocationTargetException(e);
-            } finally {
-                monitor.done();
-            }
-        }
-
-        // TBD: Is this necessary now that we're using IFile objects?
-        try {
-            getProject().refreshLocal(DEPTH_INFINITE, new NullProgressMonitor());
-        } catch (CoreException e) {
-            AdtPlugin.log(e, null);
-        }
-        return true;
-    }
-
-    @Override
-    public boolean performFinish() {
-        final AtomicBoolean success = new AtomicBoolean();
-        try {
-            getContainer().run(true, false, new IRunnableWithProgress() {
-                @Override
-                public void run(IProgressMonitor monitor) throws InvocationTargetException,
-                InterruptedException {
-                    boolean ok = performFinish(monitor);
-                    success.set(ok);
-                }
-            });
-
-        } catch (InvocationTargetException e) {
-            AdtPlugin.log(e, null);
-            return false;
-        } catch (InterruptedException e) {
-            AdtPlugin.log(e, null);
-            return false;
-        }
-
-        if (success.get()) {
-            // Open the primary file/files
-            NewTemplateWizard.openFiles(getProject(), getFilesToOpen(), mWorkbench);
-            return true;
-        } else {
-            return false;
-        }
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/templates/TypedVariable.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/templates/TypedVariable.java
deleted file mode 100644
index 468a10c..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/templates/TypedVariable.java
+++ /dev/null
@@ -1,50 +0,0 @@
-package com.android.ide.eclipse.adt.internal.wizards.templates;
-
-import java.util.Locale;
-
-import org.xml.sax.Attributes;
-
-public class TypedVariable {
-	public enum Type {
-		STRING,
-		BOOLEAN,
-		INTEGER;
-
-		public static Type get(String name) {
-			if (name == null) {
-				return STRING;
-			}
-			try {
-				return valueOf(name.toUpperCase(Locale.US));
-			} catch (IllegalArgumentException e) {
-				System.err.println("Unexpected global type '" + name + "'");
-				System.err.println("Expected one of :");
-				for (Type s : Type.values()) {
-					System.err.println("  " + s.name().toLowerCase(Locale.US));
-				}
-			}
-
-			return STRING;
-		}
-	}
-
-	public static Object parseGlobal(Attributes attributes) {
-		String value = attributes.getValue(TemplateHandler.ATTR_VALUE);
-		Type type = Type.get(attributes.getValue(TemplateHandler.ATTR_TYPE));
-
-		switch (type) {
-		case STRING:
-			return value;
-		case BOOLEAN:
-			return Boolean.parseBoolean(value);
-		case INTEGER:
-			try {
-				return Integer.parseInt(value);
-			} catch (NumberFormatException e) {
-				return value;
-			}
-		}
-
-		return value;
-	}
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/templates/UpdateToolsPage.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/templates/UpdateToolsPage.java
deleted file mode 100644
index 5bbf449..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/templates/UpdateToolsPage.java
+++ /dev/null
@@ -1,94 +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.ide.eclipse.adt.internal.wizards.templates;
-
-import org.eclipse.jface.wizard.WizardPage;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Label;
-
-class UpdateToolsPage extends WizardPage implements SelectionListener {
-    private Button mInstallButton;
-    UpdateToolsPage() {
-        super("update");
-        setTitle("Update Tools");
-        validatePage();
-    }
-
-    @Override
-    public void createControl(Composite parent) {
-        Composite container = new Composite(parent, SWT.NULL);
-        setControl(container);
-        container.setLayout(new GridLayout(1, false));
-
-        Label label = new Label(container, SWT.WRAP);
-        GridData layoutData = new GridData(SWT.LEFT, SWT.TOP, true, true, 1, 1);
-        layoutData.widthHint = NewTemplatePage.WIZARD_PAGE_WIDTH - 50;
-        label.setLayoutData(layoutData);
-        label.setText(
-                "Your tools installation appears to be out of date (or not yet installed).\n" +
-                "\n" +
-                "This wizard depends on templates distributed with the Android SDK Tools.\n" +
-                "\n" +
-                "Please update the tools first (via Window > Android SDK Manager, or by " +
-                "using the \"android\" command in a terminal window). Note that on Windows " +
-                "you may need to restart the IDE, since there are some known problems where " +
-                "Windows locks the files held open by the running IDE, so the updater is " +
-                "unable to delete them in order to upgrade them.");
-
-        mInstallButton = new Button(container, SWT.NONE);
-        mInstallButton.setText("Check Again");
-        mInstallButton.addSelectionListener(this);
-    }
-
-    @Override
-    public boolean isPageComplete() {
-        return isUpToDate();
-    }
-
-    static boolean isUpToDate() {
-        return TemplateManager.getTemplateRootFolder() != null;
-    }
-
-    private void validatePage() {
-        boolean ok = isUpToDate();
-        setPageComplete(ok);
-        if (ok) {
-            setErrorMessage(null);
-            setMessage(null);
-        } else {
-            setErrorMessage("The tools need to be updated via the SDK Manager");
-        }
-    }
-
-    // ---- Implements SelectionListener ----
-
-    @Override
-    public void widgetSelected(SelectionEvent e) {
-        if (e.getSource() == mInstallButton) {
-            validatePage();
-        }
-    }
-
-    @Override
-    public void widgetDefaultSelected(SelectionEvent e) {
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/io/IFileWrapper.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/io/IFileWrapper.java
deleted file mode 100644
index b030f07..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/io/IFileWrapper.java
+++ /dev/null
@@ -1,159 +0,0 @@
-/*
- * 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.io;
-
-import com.android.io.IAbstractFile;
-import com.android.io.IAbstractFolder;
-import com.android.io.StreamException;
-
-import org.eclipse.core.resources.IContainer;
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.NullProgressMonitor;
-
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-
-/**
- * An implementation of {@link IAbstractFile} on top of an {@link IFile} object.
- */
-public class IFileWrapper implements IAbstractFile {
-
-    private final IFile mFile;
-
-    public IFileWrapper(IFile file) {
-        mFile = file;
-    }
-
-    @Override
-    public InputStream getContents() throws StreamException {
-        try {
-            return mFile.getContents();
-        } catch (CoreException e) {
-            StreamException.Error error = StreamException.Error.DEFAULT;
-            if (mFile.isSynchronized(IResource.DEPTH_ZERO) == false) {
-                error = StreamException.Error.OUTOFSYNC;
-            }
-            throw new StreamException(e, this, error);
-        }
-    }
-
-    @Override
-    public void setContents(InputStream source) throws StreamException {
-        try {
-            mFile.setContents(source, IResource.FORCE, null);
-        } catch (CoreException e) {
-            throw new StreamException(e, this);
-        }
-    }
-
-    @Override
-    public OutputStream getOutputStream() throws StreamException {
-        return new ByteArrayOutputStream() {
-            @Override
-            public void close() throws IOException {
-                super.close();
-
-                byte[] data = toByteArray();
-                try {
-                    setContents(new ByteArrayInputStream(data));
-                } catch (StreamException e) {
-                    throw new IOException();
-                }
-            }
-        };
-    }
-
-    @Override
-    public PreferredWriteMode getPreferredWriteMode() {
-        return PreferredWriteMode.INPUTSTREAM;
-    }
-
-    @Override
-    public String getOsLocation() {
-        return mFile.getLocation().toOSString();
-    }
-
-    @Override
-    public String getName() {
-        return mFile.getName();
-    }
-
-    @Override
-    public boolean exists() {
-        return mFile.exists();
-    }
-
-    @Override
-    public boolean delete() {
-        try {
-            mFile.delete(true /*force*/, new NullProgressMonitor());
-            return true;
-        } catch (CoreException e) {
-            return false;
-        }
-    }
-
-    /**
-     * Returns the {@link IFile} object that the receiver could represent. Can be <code>null</code>
-     */
-    public IFile getIFile() {
-        return mFile;
-    }
-
-    @Override
-    public long getModificationStamp() {
-        return mFile.getModificationStamp();
-    }
-
-    @Override
-    public boolean equals(Object obj) {
-        if (obj instanceof IFileWrapper) {
-            return mFile.equals(((IFileWrapper)obj).mFile);
-        }
-
-        if (obj instanceof IFile) {
-            return mFile.equals(obj);
-        }
-
-        return super.equals(obj);
-    }
-
-    @Override
-    public int hashCode() {
-        return mFile.hashCode();
-    }
-
-    @Override
-    public IAbstractFolder getParentFolder() {
-        IContainer p = mFile.getParent();
-        if (p != null) {
-            return new IFolderWrapper(p);
-        }
-
-        return null;
-    }
-
-    @Override
-    public String toString() {
-        return mFile.toString();
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/io/IFolderWrapper.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/io/IFolderWrapper.java
deleted file mode 100644
index c659711..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/io/IFolderWrapper.java
+++ /dev/null
@@ -1,200 +0,0 @@
-/*
- * 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.io;
-
-import com.android.io.IAbstractFile;
-import com.android.io.IAbstractFolder;
-import com.android.io.IAbstractResource;
-
-import org.eclipse.core.resources.IContainer;
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IFolder;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.core.runtime.Path;
-
-import java.util.ArrayList;
-
-/**
- * An implementation of {@link IAbstractFolder} on top of either an {@link IFolder} or an
- * {@link IContainer} object.
- */
-public class IFolderWrapper implements IAbstractFolder {
-
-    private final IFolder mFolder; // could be null.
-    private final IContainer mContainer; // never null.
-
-    public IFolderWrapper(IFolder folder) {
-        mContainer = mFolder = folder;
-    }
-
-    public IFolderWrapper(IContainer container) {
-        mFolder = container instanceof IFolder ? (IFolder)container : null;
-        mContainer = container;
-    }
-
-    @Override
-    public String getName() {
-        return mContainer.getName();
-    }
-
-    @Override
-    public boolean exists() {
-        return mContainer.exists();
-    }
-
-    @Override
-    public boolean delete() {
-        try {
-            mContainer.delete(true /*force*/, new NullProgressMonitor());
-            return true;
-        } catch (CoreException e) {
-            return false;
-        }
-    }
-
-
-    @Override
-    public IAbstractResource[] listMembers() {
-        try {
-            IResource[] members = mContainer.members();
-            final int count = members.length;
-            IAbstractResource[] afiles = new IAbstractResource[count];
-
-            for (int i = 0 ; i < count ; i++) {
-                IResource f = members[i];
-                if (f instanceof IFile) {
-                    afiles[i] = new IFileWrapper((IFile) f);
-                } else {
-                    afiles[i] = new IFolderWrapper((IContainer) f);
-                }
-            }
-
-            return afiles;
-        } catch (CoreException e) {
-            // return empty array below
-        }
-
-        return new IAbstractResource[0];
-    }
-
-    @Override
-    public boolean hasFile(String name) {
-        try {
-            IResource[] files = mContainer.members();
-            for (IResource file : files) {
-                if (name.equals(file.getName())) {
-                    return true;
-                }
-            }
-        } catch (CoreException e) {
-            // we'll return false below.
-        }
-
-        return false;
-    }
-
-    @Override
-    public IAbstractFile getFile(String name) {
-        if (mFolder != null) {
-            IFile file = mFolder.getFile(name);
-            return new IFileWrapper(file);
-        }
-
-        IFile file = mContainer.getFile(new Path(name));
-        return new IFileWrapper(file);
-    }
-
-    /**
-     * Returns the {@link IFolder} object that the receiver could represent.
-     * Can be <code>null</code>
-     */
-    public IFolder getIFolder() {
-        return mFolder;
-    }
-
-    @Override
-    public boolean equals(Object obj) {
-        if (obj instanceof IFolderWrapper) {
-            return mFolder.equals(((IFolderWrapper)obj).mFolder);
-        }
-
-        if (obj instanceof IFolder) {
-            return mFolder.equals(obj);
-        }
-
-        return super.equals(obj);
-    }
-
-    @Override
-    public int hashCode() {
-        return mContainer.hashCode();
-    }
-
-    @Override
-    public IAbstractFolder getFolder(String name) {
-        if (mFolder != null) {
-            IFolder folder = mFolder.getFolder(name);
-            return new IFolderWrapper(folder);
-        }
-
-        IFolder folder = mContainer.getFolder(new Path(name));
-        return new IFolderWrapper(folder);
-    }
-
-    @Override
-    public String getOsLocation() {
-        return mContainer.getLocation().toOSString();
-    }
-
-    @Override
-    public String[] list(FilenameFilter filter) {
-        try {
-            IResource[] members = mContainer.members();
-            if (members.length > 0) {
-                ArrayList<String> list = new ArrayList<String>();
-                for (IResource res : members) {
-                    if (filter.accept(this, res.getName())) {
-                        list.add(res.getName());
-                    }
-                }
-
-                return list.toArray(new String[list.size()]);
-            }
-        } catch (CoreException e) {
-            // can't read the members? return empty list below.
-        }
-
-        return new String[0];
-    }
-
-    @Override
-    public IAbstractFolder getParentFolder() {
-        IContainer p = mContainer.getParent();
-        if (p != null) {
-            return new IFolderWrapper(p);
-        }
-
-        return null;
-    }
-
-    @Override
-    public String toString() {
-        return mFolder.toString();
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/messages.properties b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/messages.properties
deleted file mode 100644
index 3a85856..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/messages.properties
+++ /dev/null
@@ -1,14 +0,0 @@
-Could_Not_Find_Folder=Could not find SDK folder '%1$s'.
-Could_Not_Find_Folder_In_SDK=Could not find folder '%1$s' inside SDK '%2$s'.
-Could_Not_Find=Could not find %1$s\!
-VersionCheck_Tools_Too_Old=This version of ADT requires Android SDK Tools revision %1$s or above.\n\nCurrent revision is %2$s.\n\nPlease update your SDK Tools to the latest version.
-VersionCheck_Plugin_Version_Failed=Failed to get the required ADT version number from the SDK.\n\nThe Android Developer Toolkit may not work properly.
-VersionCheck_Build_Tool_Missing=The Android SDK requires the new Build Tools component to be installed.\n\nPlease open the SDK Manager and install \"Android SDK Build-tools".
-VersionCheck_Unable_To_Parse_Version_s=Unable to parse sdk build version: %1$s
-VersionCheck_Plugin_Too_Old=This Android SDK requires Android Developer Toolkit version %1$d.%2$d.%3$d or above.\n\nCurrent version is %4$s.\n\nPlease update ADT to the latest version.
-AdtPlugin_Failed_To_Start_s=Failed to start %1$s
-AdtPlugin_Android_SDK_Content_Loader=Android SDK Content Loader
-AdtPlugin_Android_SDK_Resource_Parser=Android SDK Resource Parser
-AdtPlugin_Failed_To_Parse_s=Failed to parse:
-Console_Date_Tag=[%1$tF %1$tT]
-Console_Data_Project_Tag=[%1$tF %1$tT - %2$s]
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/templates/AndroidManifest.template b/eclipse/plugins/com.android.ide.eclipse.adt/templates/AndroidManifest.template
deleted file mode 100644
index e8975a0..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/templates/AndroidManifest.template
+++ /dev/null
@@ -1,12 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
-      package="PACKAGE"
-      android:versionCode="1"
-      android:versionName="1.0">
-USES-SDK
-TEST-INSTRUMENTATION
-    <application android:icon="@drawable/ic_launcher" android:label="APPLICATION_NAME">
-ACTIVITIES
-TEST-USES-LIBRARY
-    </application>
-</manifest>
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/templates/activity.template b/eclipse/plugins/com.android.ide.eclipse.adt/templates/activity.template
deleted file mode 100644
index ee17fb8..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/templates/activity.template
+++ /dev/null
@@ -1,7 +0,0 @@
-        <activity android:name="ACTIVITY_NAME"
-                  android:label="APPLICATION_NAME">
-            <intent-filter>
-                <action android:name="android.intent.action.MAIN" />
-INTENT_FILTERS
-            </intent-filter>
-        </activity>
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/templates/ic_launcher_hdpi.png b/eclipse/plugins/com.android.ide.eclipse.adt/templates/ic_launcher_hdpi.png
deleted file mode 100644
index 96a442e..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/templates/ic_launcher_hdpi.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/templates/ic_launcher_ldpi.png b/eclipse/plugins/com.android.ide.eclipse.adt/templates/ic_launcher_ldpi.png
deleted file mode 100644
index 9923872..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/templates/ic_launcher_ldpi.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/templates/ic_launcher_mdpi.png b/eclipse/plugins/com.android.ide.eclipse.adt/templates/ic_launcher_mdpi.png
deleted file mode 100644
index 359047d..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/templates/ic_launcher_mdpi.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/templates/ic_launcher_xhdpi.png b/eclipse/plugins/com.android.ide.eclipse.adt/templates/ic_launcher_xhdpi.png
deleted file mode 100644
index 71c6d76..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/templates/ic_launcher_xhdpi.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/templates/java_file.template b/eclipse/plugins/com.android.ide.eclipse.adt/templates/java_file.template
deleted file mode 100644
index e40e77e..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/templates/java_file.template
+++ /dev/null
@@ -1,13 +0,0 @@
-package PACKAGE;
-IMPORT_RESOURCE_CLASS
-import android.app.Activity;
-import android.os.Bundle;
-
-public class ACTIVITY_NAME extends Activity {
-    /** Called when the activity is first created. */
-    @Override
-    public void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-        setContentView(R.layout.main);
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/templates/launcher_intent_filter.template b/eclipse/plugins/com.android.ide.eclipse.adt/templates/launcher_intent_filter.template
deleted file mode 100644
index f5681be..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/templates/launcher_intent_filter.template
+++ /dev/null
@@ -1 +0,0 @@
-                <category android:name="android.intent.category.LAUNCHER" />
\ No newline at end of file
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/templates/layout.template b/eclipse/plugins/com.android.ide.eclipse.adt/templates/layout.template
deleted file mode 100644
index 398b79a..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/templates/layout.template
+++ /dev/null
@@ -1,15 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:tools="http://schemas.android.com/tools"
-    android:orientation="vertical"
-    android:layout_width="fill_parent"
-    android:layout_height="fill_parent"
-    tools:context=".ACTIVITY_NAME"
-    >
-<TextView  
-    android:layout_width="fill_parent" 
-    android:layout_height="wrap_content" 
-    android:text="@string/hello"
-    />
-</LinearLayout>
-
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/templates/preference_intent_filter.template b/eclipse/plugins/com.android.ide.eclipse.adt/templates/preference_intent_filter.template
deleted file mode 100644
index 609bb2c..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/templates/preference_intent_filter.template
+++ /dev/null
@@ -1 +0,0 @@
-                <category android:name="android.intent.category.PREFERENCE" />
\ No newline at end of file
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/templates/string.template b/eclipse/plugins/com.android.ide.eclipse.adt/templates/string.template
deleted file mode 100644
index 3a6e4b2..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/templates/string.template
+++ /dev/null
@@ -1 +0,0 @@
-    <string name="STRING_NAME">STRING_CONTENT</string>
\ No newline at end of file
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/templates/strings.template b/eclipse/plugins/com.android.ide.eclipse.adt/templates/strings.template
deleted file mode 100644
index b980ace..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/templates/strings.template
+++ /dev/null
@@ -1,5 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<resources>
-STRINGS
-</resources>
-
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/templates/test_instrumentation.template b/eclipse/plugins/com.android.ide.eclipse.adt/templates/test_instrumentation.template
deleted file mode 100755
index c282fbc..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/templates/test_instrumentation.template
+++ /dev/null
@@ -1 +0,0 @@
-    <instrumentation android:targetPackage="TEST_TARGET_PCKG" android:name="android.test.InstrumentationTestRunner" />
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/templates/test_uses-library.template b/eclipse/plugins/com.android.ide.eclipse.adt/templates/test_uses-library.template
deleted file mode 100755
index 28ae7a4..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/templates/test_uses-library.template
+++ /dev/null
@@ -1 +0,0 @@
-    <uses-library android:name="android.test.runner" />
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/templates/uses-sdk.template b/eclipse/plugins/com.android.ide.eclipse.adt/templates/uses-sdk.template
deleted file mode 100644
index 8adae71..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/templates/uses-sdk.template
+++ /dev/null
@@ -1 +0,0 @@
-    <uses-sdk android:minSdkVersion="MIN_SDK_VERSION" />
diff --git a/eclipse/plugins/com.android.ide.eclipse.base/.classpath b/eclipse/plugins/com.android.ide.eclipse.base/.classpath
deleted file mode 100644
index 0281bd9..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.base/.classpath
+++ /dev/null
@@ -1,21 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry exported="true" kind="lib" path="libs/dvlib.jar" sourcepath="/dvlib"/>
-	<classpathentry exported="true" kind="lib" path="libs/common.jar" sourcepath="/common"/>
-	<classpathentry exported="true" kind="lib" path="libs/commons-codec-1.4.jar"/>
-	<classpathentry exported="true" kind="lib" path="libs/commons-compress-1.0.jar"/>
-	<classpathentry exported="true" kind="lib" path="libs/commons-logging-1.1.1.jar"/>
-	<classpathentry exported="true" kind="lib" path="libs/guava-17.0.jar"/>
-	<classpathentry exported="true" kind="lib" path="libs/httpclient-4.1.1.jar"/>
-	<classpathentry exported="true" kind="lib" path="libs/httpcore-4.1.jar"/>
-	<classpathentry exported="true" kind="lib" path="libs/kxml2-2.3.0.jar"/>
-	<classpathentry exported="true" kind="lib" path="libs/layoutlib-api.jar" sourcepath="/layoutlib-api"/>
-	<classpathentry exported="true" kind="lib" path="libs/sdklib.jar" sourcepath="/sdklib"/>
-	<classpathentry exported="true" kind="lib" path="libs/sdkstats.jar" sourcepath="/sdkstats"/>
-	<classpathentry exported="true" kind="lib" path="libs/sdk-common.jar" sourcepath="/sdk-common"/>
-	<classpathentry exported="true" kind="lib" path="libs/httpmime-4.1.jar"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/eclipse/plugins/com.android.ide.eclipse.base/.gitignore b/eclipse/plugins/com.android.ide.eclipse.base/.gitignore
deleted file mode 100644
index 5e56e04..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.base/.gitignore
+++ /dev/null
@@ -1 +0,0 @@
-/bin
diff --git a/eclipse/plugins/com.android.ide.eclipse.base/.project b/eclipse/plugins/com.android.ide.eclipse.base/.project
deleted file mode 100644
index 34e7eda..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.base/.project
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>plugin-base</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.PluginNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/eclipse/plugins/com.android.ide.eclipse.base/.settings/org.eclipse.jdt.core.prefs b/eclipse/plugins/com.android.ide.eclipse.base/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index ea66196..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.base/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,98 +0,0 @@
-eclipse.preferences.version=1
-org.eclipse.jdt.core.compiler.annotation.missingNonNullByDefaultAnnotation=ignore
-org.eclipse.jdt.core.compiler.annotation.nonnull=com.android.annotations.NonNull
-org.eclipse.jdt.core.compiler.annotation.nonnullbydefault=com.android.annotations.NonNullByDefault
-org.eclipse.jdt.core.compiler.annotation.nonnullisdefault=disabled
-org.eclipse.jdt.core.compiler.annotation.nullable=com.android.annotations.Nullable
-org.eclipse.jdt.core.compiler.annotation.nullanalysis=enabled
-org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6
-org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.6
-org.eclipse.jdt.core.compiler.debug.lineNumber=generate
-org.eclipse.jdt.core.compiler.debug.localVariable=generate
-org.eclipse.jdt.core.compiler.debug.sourceFile=generate
-org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
-org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
-org.eclipse.jdt.core.compiler.problem.comparingIdentical=warning
-org.eclipse.jdt.core.compiler.problem.deadCode=warning
-org.eclipse.jdt.core.compiler.problem.deprecation=warning
-org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
-org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
-org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
-org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=ignore
-org.eclipse.jdt.core.compiler.problem.fallthroughCase=warning
-org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
-org.eclipse.jdt.core.compiler.problem.fieldHiding=warning
-org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
-org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
-org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
-org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
-org.eclipse.jdt.core.compiler.problem.includeNullInfoFromAsserts=enabled
-org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
-org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=warning
-org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
-org.eclipse.jdt.core.compiler.problem.localVariableHiding=warning
-org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
-org.eclipse.jdt.core.compiler.problem.missingDefaultCase=ignore
-org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=warning
-org.eclipse.jdt.core.compiler.problem.missingEnumCaseDespiteDefault=disabled
-org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=warning
-org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=error
-org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled
-org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
-org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=ignore
-org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
-org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
-org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore
-org.eclipse.jdt.core.compiler.problem.nullAnnotationInferenceConflict=warning
-org.eclipse.jdt.core.compiler.problem.nullReference=warning
-org.eclipse.jdt.core.compiler.problem.nullSpecInsufficientInfo=warning
-org.eclipse.jdt.core.compiler.problem.nullSpecViolation=warning
-org.eclipse.jdt.core.compiler.problem.nullUncheckedConversion=ignore
-org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
-org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
-org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=warning
-org.eclipse.jdt.core.compiler.problem.potentialNullReference=warning
-org.eclipse.jdt.core.compiler.problem.potentialNullSpecViolation=error
-org.eclipse.jdt.core.compiler.problem.potentiallyUnclosedCloseable=warning
-org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
-org.eclipse.jdt.core.compiler.problem.redundantNullAnnotation=warning
-org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
-org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=ignore
-org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=warning
-org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=ignore
-org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=ignore
-org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
-org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
-org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=enabled
-org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
-org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
-org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
-org.eclipse.jdt.core.compiler.problem.unavoidableGenericTypeProblems=disabled
-org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
-org.eclipse.jdt.core.compiler.problem.unclosedCloseable=error
-org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
-org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
-org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=warning
-org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=warning
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.unusedImport=warning
-org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
-org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
-org.eclipse.jdt.core.compiler.problem.unusedObjectAllocation=warning
-org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
-org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
-org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
-org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
-org.eclipse.jdt.core.compiler.source=1.6
diff --git a/eclipse/plugins/com.android.ide.eclipse.base/META-INF/MANIFEST.MF b/eclipse/plugins/com.android.ide.eclipse.base/META-INF/MANIFEST.MF
deleted file mode 100644
index f6cb3de..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.base/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,157 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: Common Android Utilities
-Bundle-SymbolicName: com.android.ide.eclipse.base;singleton:=true
-Bundle-Version: 24.3.3.qualifier
-Require-Bundle: org.eclipse.ui,
- org.eclipse.core.runtime
-Bundle-ActivationPolicy: lazy
-Bundle-Vendor: The Android Open Source Project
-Bundle-ClassPath: .,
- libs/annotations.jar,
- libs/common.jar,
- libs/commons-codec-1.4.jar,
- libs/commons-compress-1.0.jar,
- libs/commons-logging-1.1.1.jar,
- libs/guava-17.0.jar,
- libs/httpclient-4.1.1.jar,
- libs/httpcore-4.1.jar,
- libs/httpmime-4.1.jar,
- libs/kxml2-2.3.0.jar,
- libs/layoutlib-api.jar,
- libs/sdklib.jar,
- libs/sdkstats.jar,
- libs/dvlib.jar,
- libs/sdk-common.jar
-Bundle-RequiredExecutionEnvironment: JavaSE-1.6
-Export-Package: com.android,
- com.android.annotations,
- com.android.annotations.concurrency,
- com.android.build,
- com.android.dvlib,
- com.android.ide.common.build,
- com.android.ide.common.internal,
- com.android.ide.common.packaging,
- com.android.ide.common.rendering,
- com.android.ide.common.rendering.api,
- com.android.ide.common.rendering.legacy,
- com.android.ide.common.repository,
- com.android.ide.common.res2,
- com.android.ide.common.resources,
- com.android.ide.common.resources.configuration,
- com.android.ide.common.sdk,
- com.android.ide.common.signing,
- com.android.ide.common.xml,
- com.android.ide.eclipse.base,
- com.android.ide.eclipse.base.internal.preferences,
- com.android.io,
- com.android.layoutlib.api,
- com.android.prefs,
- com.android.resources,
- com.android.sdklib,
- com.android.sdklib.build,
- com.android.sdklib.devices,
- com.android.sdklib.internal.androidTarget,
- com.android.sdklib.internal.avd,
- com.android.sdklib.internal.build,
- com.android.sdklib.internal.project,
- com.android.sdklib.internal.repository,
- com.android.sdklib.internal.repository.archives,
- com.android.sdklib.internal.repository.packages,
- com.android.sdklib.internal.repository.sources,
- com.android.sdklib.internal.repository.updater,
- com.android.sdklib.io,
- com.android.sdklib.repository,
- com.android.sdklib.repository.descriptors,
- com.android.sdklib.repository.local,
- com.android.sdklib.repository.remote,
- com.android.sdklib.util,
- com.android.sdkstats,
- com.android.util,
- com.android.utils,
- com.android.xml,
- com.google.common.annotations,
- com.google.common.base,
- com.google.common.base.internal,
- com.google.common.cache,
- com.google.common.collect,
- com.google.common.escape,
- com.google.common.eventbus,
- com.google.common.hash,
- com.google.common.html,
- com.google.common.io,
- com.google.common.math,
- com.google.common.net,
- com.google.common.primitives,
- com.google.common.reflect,
- com.google.common.util.concurrent,
- com.google.common.xml,
- com.google.thirdparty.publicsuffix,
- org.apache.commons.codec,
- org.apache.commons.codec.binary,
- org.apache.commons.codec.digest,
- org.apache.commons.codec.language,
- org.apache.commons.codec.net,
- org.apache.commons.compress.archivers,
- org.apache.commons.compress.archivers.ar,
- org.apache.commons.compress.archivers.arj,
- org.apache.commons.compress.archivers.cpio,
- org.apache.commons.compress.archivers.dump,
- org.apache.commons.compress.archivers.jar,
- org.apache.commons.compress.archivers.sevenz,
- org.apache.commons.compress.archivers.tar,
- org.apache.commons.compress.archivers.zip,
- org.apache.commons.compress.changes,
- org.apache.commons.compress.compressors,
- org.apache.commons.compress.compressors.bzip2,
- org.apache.commons.compress.compressors.gzip,
- org.apache.commons.compress.compressors.lzma,
- org.apache.commons.compress.compressors.pack200,
- org.apache.commons.compress.compressors.snappy,
- org.apache.commons.compress.compressors.xz,
- org.apache.commons.compress.compressors.z,
- org.apache.commons.compress.compressors.z._internal_,
- org.apache.commons.compress.utils,
- org.apache.commons.logging,
- org.apache.commons.logging.impl,
- org.apache.http,
- org.apache.http.annotation,
- org.apache.http.auth,
- org.apache.http.auth.params,
- org.apache.http.client,
- org.apache.http.client.entity,
- org.apache.http.client.methods,
- org.apache.http.client.params,
- org.apache.http.client.protocol,
- org.apache.http.client.utils,
- org.apache.http.conn,
- org.apache.http.conn.params,
- org.apache.http.conn.routing,
- org.apache.http.conn.scheme,
- org.apache.http.conn.ssl,
- org.apache.http.conn.util,
- org.apache.http.cookie,
- org.apache.http.cookie.params,
- org.apache.http.entity,
- org.apache.http.entity.mime,
- org.apache.http.entity.mime.content,
- org.apache.http.impl,
- org.apache.http.impl.auth,
- org.apache.http.impl.client,
- org.apache.http.impl.conn,
- org.apache.http.impl.conn.tsccm,
- org.apache.http.impl.cookie,
- org.apache.http.impl.entity,
- org.apache.http.impl.io,
- org.apache.http.io,
- org.apache.http.message,
- org.apache.http.params,
- org.apache.http.protocol,
- org.apache.http.util,
- org.kxml2.io,
- org.kxml2.kdom,
- org.kxml2.wap,
- org.kxml2.wap.syncml,
- org.kxml2.wap.wml,
- org.kxml2.wap.wv,
- org.xmlpull.v1
diff --git a/eclipse/plugins/com.android.ide.eclipse.base/build.properties b/eclipse/plugins/com.android.ide.eclipse.base/build.properties
deleted file mode 100644
index d304902..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.base/build.properties
+++ /dev/null
@@ -1,7 +0,0 @@
-output.. = bin/
-bin.includes = .,\
-               libs/,\
-               META-INF/,\
-               plugin.xml
-jars.compile.order = .
-source.. = src/
diff --git a/eclipse/plugins/com.android.ide.eclipse.base/plugin.xml b/eclipse/plugins/com.android.ide.eclipse.base/plugin.xml
deleted file mode 100644
index 6e298b7..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.base/plugin.xml
+++ /dev/null
@@ -1,14 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.4"?>
-<plugin>
-   <extension
-         point="org.eclipse.ui.preferencePages">
-      <page
-            category="com.android.ide.eclipse.preferences.main"
-            class="com.android.ide.eclipse.base.internal.preferences.UsagePreferencePage"
-            id="com.android.ide.eclipse.common.preferences.UsagePreferencePage"
-            name="Usage Stats">
-      </page>
-   </extension>
-
-</plugin>
diff --git a/eclipse/plugins/com.android.ide.eclipse.base/pom.xml b/eclipse/plugins/com.android.ide.eclipse.base/pom.xml
deleted file mode 100644
index b3f7ed1..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.base/pom.xml
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-    <modelVersion>4.0.0</modelVersion>
-
-    <version>24.3.3-SNAPSHOT</version>
-    <artifactId>com.android.ide.eclipse.base</artifactId>
-    <packaging>eclipse-plugin</packaging>
-    <name>base</name>
-
-    <parent>
-        <relativePath>../../pom.xml</relativePath>
-        <groupId>adt.group</groupId>
-        <artifactId>parent</artifactId>
-        <version>1.0.0-SNAPSHOT</version>
-    </parent>
-</project>
diff --git a/eclipse/plugins/com.android.ide.eclipse.base/src/com/android/ide/eclipse/base/InstallDetails.java b/eclipse/plugins/com.android.ide.eclipse.base/src/com/android/ide/eclipse/base/InstallDetails.java
deleted file mode 100644
index 8c4a4a7..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.base/src/com/android/ide/eclipse/base/InstallDetails.java
+++ /dev/null
@@ -1,41 +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.eclipse.base;
-
-import org.eclipse.core.runtime.Platform;
-import org.osgi.framework.Bundle;
-import org.osgi.framework.Version;
-
-public class InstallDetails {
-    private static final String ADT_PLUGIN_ID = "com.android.ide.eclipse.adt"; //$NON-NLS-1$
-    private static final String ECLIPSE_PLATFORM_PLUGIN_ID = "org.eclipse.platform"; //$NON-NLS-1$
-
-    /**
-     * Returns true if the ADT plugin is available in the current platform. This is useful
-     * for distinguishing between specific RCP applications vs. ADT + Eclipse.
-     */
-    public static boolean isAdtInstalled() {
-        Bundle b = Platform.getBundle(ADT_PLUGIN_ID);
-        return b != null;
-    }
-
-    /** Returns the version of current eclipse platform. */
-    public static Version getPlatformVersion() {
-        Bundle b = Platform.getBundle(ECLIPSE_PLATFORM_PLUGIN_ID);
-        return b == null ? Version.emptyVersion : b.getVersion();
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.base/src/com/android/ide/eclipse/base/internal/preferences/UsagePreferencePage.java b/eclipse/plugins/com.android.ide.eclipse.base/src/com/android/ide/eclipse/base/internal/preferences/UsagePreferencePage.java
deleted file mode 100644
index c8b70e1..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.base/src/com/android/ide/eclipse/base/internal/preferences/UsagePreferencePage.java
+++ /dev/null
@@ -1,123 +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.eclipse.base.internal.preferences;
-
-import com.android.sdkstats.DdmsPreferenceStore;
-import com.android.sdkstats.SdkStatsPermissionDialog;
-
-import org.eclipse.jface.preference.BooleanFieldEditor;
-import org.eclipse.jface.preference.PreferencePage;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Link;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchPreferencePage;
-
-public class UsagePreferencePage extends PreferencePage implements IWorkbenchPreferencePage {
-    private static final int WRAP_WIDTH_PX = 200;
-
-    private BooleanFieldEditor mOptInCheckBox;
-    private DdmsPreferenceStore mStore = new DdmsPreferenceStore();
-
-    public UsagePreferencePage() {
-    }
-
-    @Override
-    public void init(IWorkbench workbench) {
-        // pass
-    }
-
-    @Override
-    protected Control createContents(Composite parent) {
-        Composite top = new Composite(parent, SWT.NONE);
-        top.setLayout(new GridLayout(1, false));
-        top.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-
-        Label l = new Label(top, SWT.WRAP);
-        l.setText(SdkStatsPermissionDialog.BODY_TEXT);
-        GridData gd = new GridData(GridData.FILL_HORIZONTAL);
-        gd.widthHint = WRAP_WIDTH_PX;
-        l.setLayoutData(gd);
-
-        Link privacyPolicyLink = new Link(top, SWT.WRAP);
-        gd = new GridData(GridData.FILL_HORIZONTAL);
-        gd.widthHint = WRAP_WIDTH_PX;
-        privacyPolicyLink.setLayoutData(gd);
-        privacyPolicyLink.setText(SdkStatsPermissionDialog.PRIVACY_POLICY_LINK_TEXT);
-
-        privacyPolicyLink.addSelectionListener(new SelectionAdapter() {
-            @Override
-            public void widgetSelected(SelectionEvent event) {
-                SdkStatsPermissionDialog.openUrl(event.text);
-            }
-        });
-
-        mOptInCheckBox = new BooleanFieldEditor(DdmsPreferenceStore.PING_OPT_IN,
-                SdkStatsPermissionDialog.CHECKBOX_TEXT, top);
-        mOptInCheckBox.setPage(this);
-        mOptInCheckBox.setPreferenceStore(mStore.getPreferenceStore());
-        mOptInCheckBox.load();
-
-        return top;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.preference.PreferencePage#performCancel()
-     */
-    @Override
-    public boolean performCancel() {
-        mOptInCheckBox.load();
-        return super.performCancel();
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.preference.PreferencePage#performDefaults()
-     */
-    @Override
-    protected void performDefaults() {
-        mOptInCheckBox.loadDefault();
-        super.performDefaults();
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.preference.PreferencePage#performOk()
-     */
-    @Override
-    public boolean performOk() {
-        save();
-        return super.performOk();
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.preference.PreferencePage#performApply()
-     */
-    @Override
-    protected void performApply() {
-        save();
-        super.performApply();
-    }
-
-    private void save() {
-        mStore.setPingOptIn(mOptInCheckBox.getBooleanValue());
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.ddms/.classpath b/eclipse/plugins/com.android.ide.eclipse.ddms/.classpath
deleted file mode 100644
index 97afc79..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.ddms/.classpath
+++ /dev/null
@@ -1,13 +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.pde.core.requiredPlugins"/>
-	<classpathentry kind="lib" path="libs/jfreechart-1.0.9.jar"/>
-	<classpathentry kind="lib" path="libs/jcommon-1.0.12.jar"/>
-	<classpathentry kind="lib" path="libs/jfreechart-swt-1.0.9.jar"/>
-	<classpathentry exported="true" kind="lib" path="libs/ddmlib.jar" sourcepath="/ddmlib"/>
-	<classpathentry exported="true" kind="lib" path="libs/ddmuilib.jar" sourcepath="/ddmuilib"/>
-	<classpathentry exported="true" kind="lib" path="libs/uiautomatorviewer.jar" sourcepath="/uiautomatorviewer/src"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/eclipse/plugins/com.android.ide.eclipse.ddms/.gitignore b/eclipse/plugins/com.android.ide.eclipse.ddms/.gitignore
deleted file mode 100644
index 5e56e04..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.ddms/.gitignore
+++ /dev/null
@@ -1 +0,0 @@
-/bin
diff --git a/eclipse/plugins/com.android.ide.eclipse.ddms/.project b/eclipse/plugins/com.android.ide.eclipse.ddms/.project
deleted file mode 100644
index f4150a2..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.ddms/.project
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>plugin-ddms</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.PluginNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/eclipse/plugins/com.android.ide.eclipse.ddms/.settings/org.eclipse.jdt.core.prefs b/eclipse/plugins/com.android.ide.eclipse.ddms/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index ea66196..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.ddms/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,98 +0,0 @@
-eclipse.preferences.version=1
-org.eclipse.jdt.core.compiler.annotation.missingNonNullByDefaultAnnotation=ignore
-org.eclipse.jdt.core.compiler.annotation.nonnull=com.android.annotations.NonNull
-org.eclipse.jdt.core.compiler.annotation.nonnullbydefault=com.android.annotations.NonNullByDefault
-org.eclipse.jdt.core.compiler.annotation.nonnullisdefault=disabled
-org.eclipse.jdt.core.compiler.annotation.nullable=com.android.annotations.Nullable
-org.eclipse.jdt.core.compiler.annotation.nullanalysis=enabled
-org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6
-org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.6
-org.eclipse.jdt.core.compiler.debug.lineNumber=generate
-org.eclipse.jdt.core.compiler.debug.localVariable=generate
-org.eclipse.jdt.core.compiler.debug.sourceFile=generate
-org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
-org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
-org.eclipse.jdt.core.compiler.problem.comparingIdentical=warning
-org.eclipse.jdt.core.compiler.problem.deadCode=warning
-org.eclipse.jdt.core.compiler.problem.deprecation=warning
-org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
-org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
-org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
-org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=ignore
-org.eclipse.jdt.core.compiler.problem.fallthroughCase=warning
-org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
-org.eclipse.jdt.core.compiler.problem.fieldHiding=warning
-org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
-org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
-org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
-org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
-org.eclipse.jdt.core.compiler.problem.includeNullInfoFromAsserts=enabled
-org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
-org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=warning
-org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
-org.eclipse.jdt.core.compiler.problem.localVariableHiding=warning
-org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
-org.eclipse.jdt.core.compiler.problem.missingDefaultCase=ignore
-org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=warning
-org.eclipse.jdt.core.compiler.problem.missingEnumCaseDespiteDefault=disabled
-org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=warning
-org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=error
-org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled
-org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
-org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=ignore
-org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
-org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
-org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore
-org.eclipse.jdt.core.compiler.problem.nullAnnotationInferenceConflict=warning
-org.eclipse.jdt.core.compiler.problem.nullReference=warning
-org.eclipse.jdt.core.compiler.problem.nullSpecInsufficientInfo=warning
-org.eclipse.jdt.core.compiler.problem.nullSpecViolation=warning
-org.eclipse.jdt.core.compiler.problem.nullUncheckedConversion=ignore
-org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
-org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
-org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=warning
-org.eclipse.jdt.core.compiler.problem.potentialNullReference=warning
-org.eclipse.jdt.core.compiler.problem.potentialNullSpecViolation=error
-org.eclipse.jdt.core.compiler.problem.potentiallyUnclosedCloseable=warning
-org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
-org.eclipse.jdt.core.compiler.problem.redundantNullAnnotation=warning
-org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
-org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=ignore
-org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=warning
-org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=ignore
-org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=ignore
-org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
-org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
-org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=enabled
-org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
-org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
-org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
-org.eclipse.jdt.core.compiler.problem.unavoidableGenericTypeProblems=disabled
-org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
-org.eclipse.jdt.core.compiler.problem.unclosedCloseable=error
-org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
-org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
-org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=warning
-org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=warning
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.unusedImport=warning
-org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
-org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
-org.eclipse.jdt.core.compiler.problem.unusedObjectAllocation=warning
-org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
-org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
-org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
-org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
-org.eclipse.jdt.core.compiler.source=1.6
diff --git a/eclipse/plugins/com.android.ide.eclipse.ddms/META-INF/MANIFEST.MF b/eclipse/plugins/com.android.ide.eclipse.ddms/META-INF/MANIFEST.MF
deleted file mode 100644
index 92868ce..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.ddms/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,43 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: %Bundle-Name
-Bundle-SymbolicName: com.android.ide.eclipse.ddms;singleton:=true
-Bundle-Version: 24.3.3.qualifier
-Bundle-Activator: com.android.ide.eclipse.ddms.DdmsPlugin
-Bundle-Vendor: %Bundle-Vendor
-Bundle-Localization: plugin
-Require-Bundle: org.eclipse.ui,
- org.eclipse.core.runtime,
- org.eclipse.ui.console,
- org.eclipse.core.resources,
- org.eclipse.ui.ide,
- org.eclipse.core.filesystem,
- com.android.ide.eclipse.base
-Bundle-ActivationPolicy: lazy
-Export-Package: com.android.ddmlib,
- com.android.ddmlib.log,
- com.android.ddmlib.testrunner,
- com.android.ddmlib.utils,
- com.android.ddmuilib,
- com.android.ddmuilib.actions,
- com.android.ddmuilib.annotation,
- com.android.ddmuilib.console,
- com.android.ddmuilib.explorer,
- com.android.ddmuilib.handler,
- com.android.ddmuilib.heap,
- com.android.ddmuilib.location,
- com.android.ddmuilib.log.event,
- com.android.ddmuilib.logcat,
- com.android.ddmuilib.net,
- com.android.ide.eclipse.ddms,
- com.android.ide.eclipse.ddms.i18n,
- com.android.ide.eclipse.ddms.preferences,
- com.android.ide.eclipse.ddms.views
-Bundle-ClassPath: .,
- libs/ddmlib.jar,
- libs/ddmuilib.jar,
- libs/jcommon-1.0.12.jar,
- libs/jfreechart-1.0.9.jar,
- libs/jfreechart-swt-1.0.9.jar,
- libs/uiautomatorviewer.jar
-Bundle-RequiredExecutionEnvironment: JavaSE-1.6
diff --git a/eclipse/plugins/com.android.ide.eclipse.ddms/MODULE_LICENSE_APACHE2 b/eclipse/plugins/com.android.ide.eclipse.ddms/MODULE_LICENSE_APACHE2
deleted file mode 100644
index e69de29..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.ddms/MODULE_LICENSE_APACHE2
+++ /dev/null
diff --git a/eclipse/plugins/com.android.ide.eclipse.ddms/about.html b/eclipse/plugins/com.android.ide.eclipse.ddms/about.html
deleted file mode 100644
index 2858811..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.ddms/about.html
+++ /dev/null
@@ -1,226 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
-    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
-<title>About</title>
-</head>
-<body lang="EN-US">
-<h2>About This Content</h2>
- 
-<p>September 19, 2010</p>	
-<h3>License</h3>
-
-<pre>
-
-Note:  jcommon-1.0.12.jar is under the BSD license rather than the APL.  You can find a copy of the BSD License at http://www.opensource.org/licenses/bsd-license.php
-
-   jfreechart-1.0.9.jar and jfreechart-1.0.9-swt.jar are under the LGPL rather than the APL.  You can find a copy of the LGPL at http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt.  You can get the source code for these two components at http://android.git.kernel.org/pub/jfreechart-1.0.9.zip
-
-
-      Apache License
-                           Version 2.0, January 2004
-                        http://www.apache.org/licenses/
-
-   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
-   1. Definitions.
-
-      &quot;License&quot; shall mean the terms and conditions for use, reproduction,
-      and distribution as defined by Sections 1 through 9 of this document.
-
-      &quot;Licensor&quot; shall mean the copyright owner or entity authorized by
-      the copyright owner that is granting the License.
-
-      &quot;Legal Entity&quot; shall mean the union of the acting entity and all
-      other entities that control, are controlled by, or are under common
-      control with that entity. For the purposes of this definition,
-      &quot;control&quot; means (i) the power, direct or indirect, to cause the
-      direction or management of such entity, whether by contract or
-      otherwise, or (ii) ownership of fifty percent (50%) or more of the
-      outstanding shares, or (iii) beneficial ownership of such entity.
-
-      &quot;You&quot; (or &quot;Your&quot;) shall mean an individual or Legal Entity
-      exercising permissions granted by this License.
-
-      &quot;Source&quot; form shall mean the preferred form for making modifications,
-      including but not limited to software source code, documentation
-      source, and configuration files.
-
-      &quot;Object&quot; form shall mean any form resulting from mechanical
-      transformation or translation of a Source form, including but
-      not limited to compiled object code, generated documentation,
-      and conversions to other media types.
-
-      &quot;Work&quot; shall mean the work of authorship, whether in Source or
-      Object form, made available under the License, as indicated by a
-      copyright notice that is included in or attached to the work
-      (an example is provided in the Appendix below).
-
-      &quot;Derivative Works&quot; shall mean any work, whether in Source or Object
-      form, that is based on (or derived from) the Work and for which the
-      editorial revisions, annotations, elaborations, or other modifications
-      represent, as a whole, an original work of authorship. For the purposes
-      of this License, Derivative Works shall not include works that remain
-      separable from, or merely link (or bind by name) to the interfaces of,
-      the Work and Derivative Works thereof.
-
-      &quot;Contribution&quot; shall mean any work of authorship, including
-      the original version of the Work and any modifications or additions
-      to that Work or Derivative Works thereof, that is intentionally
-      submitted to Licensor for inclusion in the Work by the copyright owner
-      or by an individual or Legal Entity authorized to submit on behalf of
-      the copyright owner. For the purposes of this definition, &quot;submitted&quot;
-      means any form of electronic, verbal, or written communication sent
-      to the Licensor or its representatives, including but not limited to
-      communication on electronic mailing lists, source code control systems,
-      and issue tracking systems that are managed by, or on behalf of, the
-      Licensor for the purpose of discussing and improving the Work, but
-      excluding communication that is conspicuously marked or otherwise
-      designated in writing by the copyright owner as &quot;Not a Contribution.&quot;
-
-      &quot;Contributor&quot; shall mean Licensor and any individual or Legal Entity
-      on behalf of whom a Contribution has been received by Licensor and
-      subsequently incorporated within the Work.
-
-   2. Grant of Copyright License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      copyright license to reproduce, prepare Derivative Works of,
-      publicly display, publicly perform, sublicense, and distribute the
-      Work and such Derivative Works in Source or Object form.
-
-   3. Grant of Patent License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      (except as stated in this section) patent license to make, have made,
-      use, offer to sell, sell, import, and otherwise transfer the Work,
-      where such license applies only to those patent claims licensable
-      by such Contributor that are necessarily infringed by their
-      Contribution(s) alone or by combination of their Contribution(s)
-      with the Work to which such Contribution(s) was submitted. If You
-      institute patent litigation against any entity (including a
-      cross-claim or counterclaim in a lawsuit) alleging that the Work
-      or a Contribution incorporated within the Work constitutes direct
-      or contributory patent infringement, then any patent licenses
-      granted to You under this License for that Work shall terminate
-      as of the date such litigation is filed.
-
-   4. Redistribution. You may reproduce and distribute copies of the
-      Work or Derivative Works thereof in any medium, with or without
-      modifications, and in Source or Object form, provided that You
-      meet the following conditions:
-
-      (a) You must give any other recipients of the Work or
-          Derivative Works a copy of this License; and
-
-      (b) You must cause any modified files to carry prominent notices
-          stating that You changed the files; and
-
-      (c) You must retain, in the Source form of any Derivative Works
-          that You distribute, all copyright, patent, trademark, and
-          attribution notices from the Source form of the Work,
-          excluding those notices that do not pertain to any part of
-          the Derivative Works; and
-
-      (d) If the Work includes a &quot;NOTICE&quot; text file as part of its
-          distribution, then any Derivative Works that You distribute must
-          include a readable copy of the attribution notices contained
-          within such NOTICE file, excluding those notices that do not
-          pertain to any part of the Derivative Works, in at least one
-          of the following places: within a NOTICE text file distributed
-          as part of the Derivative Works; within the Source form or
-          documentation, if provided along with the Derivative Works; or,
-          within a display generated by the Derivative Works, if and
-          wherever such third-party notices normally appear. The contents
-          of the NOTICE file are for informational purposes only and
-          do not modify the License. You may add Your own attribution
-          notices within Derivative Works that You distribute, alongside
-          or as an addendum to the NOTICE text from the Work, provided
-          that such additional attribution notices cannot be construed
-          as modifying the License.
-
-      You may add Your own copyright statement to Your modifications and
-      may provide additional or different license terms and conditions
-      for use, reproduction, or distribution of Your modifications, or
-      for any such Derivative Works as a whole, provided Your use,
-      reproduction, and distribution of the Work otherwise complies with
-      the conditions stated in this License.
-
-   5. Submission of Contributions. Unless You explicitly state otherwise,
-      any Contribution intentionally submitted for inclusion in the Work
-      by You to the Licensor shall be under the terms and conditions of
-      this License, without any additional terms or conditions.
-      Notwithstanding the above, nothing herein shall supersede or modify
-      the terms of any separate license agreement you may have executed
-      with Licensor regarding such Contributions.
-
-   6. Trademarks. This License does not grant permission to use the trade
-      names, trademarks, service marks, or product names of the Licensor,
-      except as required for reasonable and customary use in describing the
-      origin of the Work and reproducing the content of the NOTICE file.
-
-   7. Disclaimer of Warranty. Unless required by applicable law or
-      agreed to in writing, Licensor provides the Work (and each
-      Contributor provides its Contributions) on an &quot;AS IS&quot; BASIS,
-      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
-      implied, including, without limitation, any warranties or conditions
-      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
-      PARTICULAR PURPOSE. You are solely responsible for determining the
-      appropriateness of using or redistributing the Work and assume any
-      risks associated with Your exercise of permissions under this License.
-
-   8. Limitation of Liability. In no event and under no legal theory,
-      whether in tort (including negligence), contract, or otherwise,
-      unless required by applicable law (such as deliberate and grossly
-      negligent acts) or agreed to in writing, shall any Contributor be
-      liable to You for damages, including any direct, indirect, special,
-      incidental, or consequential damages of any character arising as a
-      result of this License or out of the use or inability to use the
-      Work (including but not limited to damages for loss of goodwill,
-      work stoppage, computer failure or malfunction, or any and all
-      other commercial damages or losses), even if such Contributor
-      has been advised of the possibility of such damages.
-
-   9. Accepting Warranty or Additional Liability. While redistributing
-      the Work or Derivative Works thereof, You may choose to offer,
-      and charge a fee for, acceptance of support, warranty, indemnity,
-      or other liability obligations and/or rights consistent with this
-      License. However, in accepting such obligations, You may act only
-      on Your own behalf and on Your sole responsibility, not on behalf
-      of any other Contributor, and only if You agree to indemnify,
-      defend, and hold each Contributor harmless for any liability
-      incurred by, or claims asserted against, such Contributor by reason
-      of your accepting any such warranty or additional liability.
-
-   END OF TERMS AND CONDITIONS
-
-   APPENDIX: How to apply the Apache License to your work.
-
-      To apply the Apache License to your work, attach the following
-      boilerplate notice, with the fields enclosed by brackets &quot;[]&quot;
-      replaced with your own identifying information. (Don&apos;t include
-      the brackets!)  The text should be enclosed in the appropriate
-      comment syntax for the file format. We also recommend that a
-      file or class name and description of purpose be included on the
-      same &quot;printed page&quot; as the copyright notice for easier
-      identification within third-party archives.
-
-   Copyright [yyyy] [name of copyright owner]
-
-   Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
-   you may not use this file except in compliance with the License.
-   You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an &quot;AS IS&quot; BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
-
-</pre>
-
-</body>
-</html>
\ No newline at end of file
diff --git a/eclipse/plugins/com.android.ide.eclipse.ddms/about.ini b/eclipse/plugins/com.android.ide.eclipse.ddms/about.ini
deleted file mode 100644
index 3395379..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.ddms/about.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-aboutText=%blurb
-featureImage=icons/ddms-32.png
\ No newline at end of file
diff --git a/eclipse/plugins/com.android.ide.eclipse.ddms/about.properties b/eclipse/plugins/com.android.ide.eclipse.ddms/about.properties
deleted file mode 100755
index 7b7aaa2..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.ddms/about.properties
+++ /dev/null
@@ -1,7 +0,0 @@
-blurb=Dalvik Debug Monitor Service\n\
-\n\
-Version\: {featureVersion}\n\
-\n\
-(c) Copyright 2007-2011 The Android Open Source Project.  All rights reserved.\n\
-Visit http://developer.android.com/sdk/eclipse-adt.html
-
diff --git a/eclipse/plugins/com.android.ide.eclipse.ddms/build.properties b/eclipse/plugins/com.android.ide.eclipse.ddms/build.properties
deleted file mode 100644
index 3c02154..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.ddms/build.properties
+++ /dev/null
@@ -1,13 +0,0 @@
-source.. = src/
-output.. = bin/
-bin.includes = META-INF/,\
-               icons/,\
-               plugin.xml,\
-               .,\
-               libs/,\
-               schema/,\
-               about.html,\
-               about.ini,\
-               about.properties,\
-               plugin.properties
-
diff --git a/eclipse/plugins/com.android.ide.eclipse.ddms/icons/android.png b/eclipse/plugins/com.android.ide.eclipse.ddms/icons/android.png
deleted file mode 100644
index a8dc35e..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.ddms/icons/android.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.ddms/icons/ddms-16.png b/eclipse/plugins/com.android.ide.eclipse.ddms/icons/ddms-16.png
deleted file mode 100644
index f40e720..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.ddms/icons/ddms-16.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.ddms/icons/ddms-32.png b/eclipse/plugins/com.android.ide.eclipse.ddms/icons/ddms-32.png
deleted file mode 100644
index d54ab7f..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.ddms/icons/ddms-32.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.ddms/icons/device.png b/eclipse/plugins/com.android.ide.eclipse.ddms/icons/device.png
deleted file mode 100644
index 7dbbbb6..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.ddms/icons/device.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.ddms/icons/emulator-16.png b/eclipse/plugins/com.android.ide.eclipse.ddms/icons/emulator-16.png
deleted file mode 100644
index 7554b24..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.ddms/icons/emulator-16.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.ddms/icons/heap.png b/eclipse/plugins/com.android.ide.eclipse.ddms/icons/heap.png
deleted file mode 100644
index e3aa3f0..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.ddms/icons/heap.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.ddms/icons/logcat.png b/eclipse/plugins/com.android.ide.eclipse.ddms/icons/logcat.png
deleted file mode 100644
index 0843eb7..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.ddms/icons/logcat.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.ddms/icons/networkstats.png b/eclipse/plugins/com.android.ide.eclipse.ddms/icons/networkstats.png
deleted file mode 100644
index 7018705..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.ddms/icons/networkstats.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.ddms/icons/systrace.png b/eclipse/plugins/com.android.ide.eclipse.ddms/icons/systrace.png
deleted file mode 100644
index f663914..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.ddms/icons/systrace.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.ddms/icons/thread.png b/eclipse/plugins/com.android.ide.eclipse.ddms/icons/thread.png
deleted file mode 100644
index ac839e8..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.ddms/icons/thread.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.ddms/icons/uiautomator.png b/eclipse/plugins/com.android.ide.eclipse.ddms/icons/uiautomator.png
deleted file mode 100644
index 423f781..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.ddms/icons/uiautomator.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.ddms/plugin.properties b/eclipse/plugins/com.android.ide.eclipse.ddms/plugin.properties
deleted file mode 100644
index 0593679..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.ddms/plugin.properties
+++ /dev/null
@@ -1,21 +0,0 @@
-#Properties file for com.android.ide.eclipse.ddms
-Bundle-Vendor = The Android Open Source Project
-Bundle-Name = Dalvik Debug Monitor Service
-category.name = Android
-view.name.Devices = Devices
-view.name.LogCat = LogCat
-view.name.Threads = Threads
-view.name.Heap = Heap
-view.name.File_Explorer = File Explorer
-view.name.Emulator_Control = Emulator Control
-view.name.Allocation_Tracker = Allocation Tracker
-view.name.Network_Stats = Network Statistics
-view.name.SysInfo = System Information
-perspective.name.DDMS = DDMS
-page.name.DDMS = DDMS
-page.name.LogCat = LogCat
-extension-point.name.Tools_Locator = Tools Locator
-extension-point.name.Debugger_Connector = Debugger Connector
-extension-point.name.Source_Revealer = Source Revealer
-extension-point.name.TreeView_Laucher = TraceView Launcher
-extension-point.name.ClientAction = Client Specific Actions
\ No newline at end of file
diff --git a/eclipse/plugins/com.android.ide.eclipse.ddms/plugin.xml b/eclipse/plugins/com.android.ide.eclipse.ddms/plugin.xml
deleted file mode 100644
index 43d10cf..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.ddms/plugin.xml
+++ /dev/null
@@ -1,156 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.2"?>
-<plugin>
-   <extension-point id="toolsLocator" name="%extension-point.name.Tools_Locator" schema="schema/toolsLocator.exsd"/>
-   <extension-point id="debuggerConnector" name="%extension-point.name.Debugger_Connector" schema="schema/debuggerConnector.exsd"/>
-   <extension-point id="sourceRevealer" name="%extension-point.name.Source_Revealer" schema="schema/sourceRevealer.exsd"/>
-   <extension-point id="traceviewLauncher" name="%extension-point.name.TreeView_Laucher" schema="schema/traceviewLauncher.exsd"/>
-   <extension-point id="clientAction" name="%extension-point.name.ClientAction" schema="schema/clientAction.exsd"/>
-
-   <extension
-         point="org.eclipse.ui.views">
-      <category
-            name="%category.name"
-            id="com.android.ide.eclipse.ddms.views.category">
-      </category>
-      <view
-            allowMultiple="false"
-            category="com.android.ide.eclipse.ddms.views.category"
-            class="com.android.ide.eclipse.ddms.views.DeviceView"
-            icon="icons/device.png"
-            id="com.android.ide.eclipse.ddms.views.DeviceView"
-            name="%view.name.Devices">
-      </view>
-      <!-- Deprecate the old logcat view. It should be removed entirely
-           after the preview release -->
-      <view
-            allowMultiple="false"
-            category="com.android.ide.eclipse.ddms.views.category"
-            class="com.android.ide.eclipse.ddms.views.OldLogCatView"
-            icon="icons/android.png"
-            id="com.android.ide.eclipse.ddms.views.OldLogCatView"
-            name="LogCat (deprecated)"/>
-      <view
-            allowMultiple="false"
-            category="com.android.ide.eclipse.ddms.views.category"
-            class="com.android.ide.eclipse.ddms.views.LogCatView"
-            icon="icons/logcat.png"
-            id="com.android.ide.eclipse.ddms.views.LogCatView"
-            name="%view.name.LogCat"/>
-      <!-- Disabled for now due to AWT/SWT bridge issue on Leopard.
-      <view
-            allowMultiple="false"
-            category="com.android.ide.eclipse.ddms.views.category"
-            class="com.android.ide.eclipse.ddms.views.EventLogView"
-            icon="icons/android.png"
-            id="com.android.ide.eclipse.ddms.views.EventLogView"
-            name="Event Log"/> -->
-      <view
-            allowMultiple="false"
-            category="com.android.ide.eclipse.ddms.views.category"
-            class="com.android.ide.eclipse.ddms.views.ThreadView"
-            icon="icons/thread.png"
-            id="com.android.ide.eclipse.ddms.views.ThreadView"
-            name="%view.name.Threads"/>
-      <view
-            allowMultiple="false"
-            category="com.android.ide.eclipse.ddms.views.category"
-            class="com.android.ide.eclipse.ddms.views.HeapView"
-            icon="icons/heap.png"
-            id="com.android.ide.eclipse.ddms.views.HeapView"
-            name="%view.name.Heap"/>
-      <view
-            allowMultiple="false"
-            category="com.android.ide.eclipse.ddms.views.category"
-            class="com.android.ide.eclipse.ddms.views.FileExplorerView"
-            icon="icons/android.png"
-            id="com.android.ide.eclipse.ddms.views.FileExplorerView"
-            name="%view.name.File_Explorer"/>
-      <view
-            allowMultiple="false"
-            category="com.android.ide.eclipse.ddms.views.category"
-            class="com.android.ide.eclipse.ddms.views.EmulatorControlView"
-            icon="icons/emulator-16.png"
-            id="com.android.ide.eclipse.ddms.views.EmulatorControlView"
-            name="%view.name.Emulator_Control"/>
-      <view
-            allowMultiple="false"
-            category="com.android.ide.eclipse.ddms.views.category"
-            class="com.android.ide.eclipse.ddms.views.AllocTrackerView"
-            icon="icons/heap.png"
-            id="com.android.ide.eclipse.ddms.views.AllocTrackerView"
-            name="%view.name.Allocation_Tracker"/>
-      <view
-            category="com.android.ide.eclipse.ddms.views.category"
-            class="com.android.ide.eclipse.ddms.views.NetworkStatisticsView"
-            icon="icons/networkstats.png"
-            id="com.android.ide.eclipse.ddms.views.NetworkStatsView"
-            name="%view.name.Network_Stats"
-            restorable="true">
-      </view>
-      <view
-            category="com.android.ide.eclipse.ddms.views.category"
-            class="com.android.ide.eclipse.ddms.views.SysInfoView"
-            id="com.android.ide.eclipse.ddms.views.SysInfoView"
-            name="%view.name.SysInfo"
-            restorable="true">
-      </view>
-   </extension>
-   <extension
-         point="org.eclipse.ui.editors">
-      <editor
-            class="com.android.ide.eclipse.ddms.editors.UiAutomatorViewer"
-            default="true"
-            extensions="uix"
-            icon="icons/uiautomator.png"
-            id="com.android.ide.eclipse.ddms.editors.UiAutomatorViewer"
-            name="UI Automator Hierarchy Viewer">
-      </editor>
-   </extension>
-   <extension
-         point="org.eclipse.ui.perspectives">
-      <perspective
-            class="com.android.ide.eclipse.ddms.Perspective"
-            icon="icons/ddms-16.png"
-            id="com.android.ide.eclipse.ddms.Perspective"
-            name="%perspective.name.DDMS"/>
-   </extension>
-   <extension
-         point="org.eclipse.core.runtime.preferences">
-      <initializer class="com.android.ide.eclipse.ddms.preferences.PreferenceInitializer"/>
-   </extension>
-   <extension
-         point="org.eclipse.ui.perspectiveExtensions">
-      <perspectiveExtension targetID="org.eclipse.jdt.ui.JavaPerspective">
-         <perspectiveShortcut id="com.android.ide.eclipse.ddms.Perspective"/>
-      </perspectiveExtension>
-      <perspectiveExtension targetID="org.eclipse.ui.resourcePerspective">
-         <perspectiveShortcut id="com.android.ide.eclipse.ddms.Perspective"/>
-      </perspectiveExtension>
-      <perspectiveExtension targetID="org.eclipse.debug.ui.DebugPerspective">
-         <perspectiveShortcut id="com.android.ide.eclipse.ddms.Perspective"/>
-         <view id="com.android.ide.eclipse.ddms.views.LogCatView"
-           relative="org.eclipse.ui.views.ProblemView"
-           relationship="stack" />
-      </perspectiveExtension>
-   </extension>
-   <extension
-         point="org.eclipse.ui.preferencePages">
-      <page
-            category="com.android.ide.eclipse.preferences.main"
-            class="com.android.ide.eclipse.ddms.preferences.PreferencePage"
-            id="com.android.ide.eclipse.ddms.preferences.PreferencePage"
-            name="%page.name.DDMS"/>
-      <page
-            category="com.android.ide.eclipse.preferences.main"
-            class="com.android.ide.eclipse.ddms.preferences.LogCatPreferencePage"
-            id="com.android.ide.eclipse.ddms.preferences.LogCatPreferencePage"
-            name="%page.name.LogCat"/>
-      <page
-            category="com.android.ide.eclipse.ddms.preferences.LogCatPreferencePage"
-            class="com.android.ide.eclipse.ddms.preferences.LogCatColorsPage"
-            id="com.android.ide.eclipse.ddms.preferences.LogCatColorsPage"
-            name="Colors">
-      </page>
-   </extension>
-</plugin>
diff --git a/eclipse/plugins/com.android.ide.eclipse.ddms/pom.xml b/eclipse/plugins/com.android.ide.eclipse.ddms/pom.xml
deleted file mode 100644
index 5f43936..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.ddms/pom.xml
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-    <modelVersion>4.0.0</modelVersion>
-
-    <version>24.3.3-SNAPSHOT</version>
-    <artifactId>com.android.ide.eclipse.ddms</artifactId>
-    <packaging>eclipse-plugin</packaging>
-    <name>ddms</name>
-
-    <parent>
-        <relativePath>../../pom.xml</relativePath>
-        <groupId>adt.group</groupId>
-        <artifactId>parent</artifactId>
-        <version>1.0.0-SNAPSHOT</version>
-    </parent>
-</project>
diff --git a/eclipse/plugins/com.android.ide.eclipse.ddms/schema/clientAction.exsd b/eclipse/plugins/com.android.ide.eclipse.ddms/schema/clientAction.exsd
deleted file mode 100644
index f277bb0..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.ddms/schema/clientAction.exsd
+++ /dev/null
@@ -1,94 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="com.android.ide.eclipse.ddms" xmlns="http://www.w3.org/2001/XMLSchema">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="com.android.ide.eclipse.ddms" id="clientAction" name="%extension-point.name.ClientAction"/>
-      </appInfo>
-      <documentation>
-         Extension point that allows adding custom actions to the DDMS Device Panel to act on the currently selected client (Dalvik VM).
-      </documentation>
-   </annotation>
-
-   <element name="clientAction">
-      <complexType>
-         <attribute name="class" type="string" use="required">
-            <annotation>
-               <documentation>
-
-               </documentation>
-               <appInfo>
-                  <meta.attribute kind="java" basedOn=":com.android.ide.eclipse.ddms.IClientAction"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="extension">
-      <annotation>
-         <appInfo>
-            <meta.element />
-         </appInfo>
-      </annotation>
-      <complexType>
-         <sequence>
-            <element ref="clientAction"/>
-         </sequence>
-         <attribute name="point" type="string" use="required">
-            <annotation>
-               <documentation>
-
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-
-               </documentation>
-               <appInfo>
-                  <meta.attribute translatable="true"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="since"/>
-      </appInfo>
-      <documentation>
-         21.1.0
-      </documentation>
-   </annotation>
-
-
-   <annotation>
-      <appInfo>
-         <meta.section type="apiinfo"/>
-      </appInfo>
-      <documentation>
-         Extensions must implement com.android.ide.ddms.IClientAction
-      </documentation>
-   </annotation>
-
-
-   <annotation>
-      <appInfo>
-         <meta.section type="copyright"/>
-      </appInfo>
-      <documentation>
-         Copyright (C) 2012 The Android Open Source Project
-      </documentation>
-   </annotation>
-
-</schema>
diff --git a/eclipse/plugins/com.android.ide.eclipse.ddms/schema/debuggerConnector.exsd b/eclipse/plugins/com.android.ide.eclipse.ddms/schema/debuggerConnector.exsd
deleted file mode 100644
index 515713a..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.ddms/schema/debuggerConnector.exsd
+++ /dev/null
@@ -1,104 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="com.android.ide.eclipse.ddms" xmlns="http://www.w3.org/2001/XMLSchema">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="com.android.ide.eclipse.ddms" id="debuggerConnector" name="Debugger Connector"/>
-      </appInfo>
-      <documentation>
-         Extension Point to provide a way to connect a debugger to a VM running on a connected device.
-
-The goal of the extension is to identify which project in the workspace matches the running application to properly setup a launch configuration.
-      </documentation>
-   </annotation>
-
-   <element name="connector">
-      <complexType>
-         <attribute name="class" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-               <appInfo>
-                  <meta.attribute kind="java" basedOn=":com.android.ide.eclipse.ddms.IDebuggerConnector"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="extension">
-      <annotation>
-         <appInfo>
-            <meta.element />
-         </appInfo>
-      </annotation>
-      <complexType>
-         <sequence>
-            <element ref="connector"/>
-         </sequence>
-         <attribute name="point" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-               <appInfo>
-                  <meta.attribute translatable="true"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="since"/>
-      </appInfo>
-      <documentation>
-         8.0.0
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="examples"/>
-      </appInfo>
-      <documentation>
-         [Enter extension point usage example here.]
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="apiinfo"/>
-      </appInfo>
-      <documentation>
-         The class must implement com.android.ide.ddms.IDebuggerConnector.
-      </documentation>
-   </annotation>
-
-
-   <annotation>
-      <appInfo>
-         <meta.section type="copyright"/>
-      </appInfo>
-      <documentation>
-         Copyright (C) 2010 The Android Open Source Project
-      </documentation>
-   </annotation>
-
-</schema>
diff --git a/eclipse/plugins/com.android.ide.eclipse.ddms/schema/sourceRevealer.exsd b/eclipse/plugins/com.android.ide.eclipse.ddms/schema/sourceRevealer.exsd
deleted file mode 100644
index 9f2cf9c..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.ddms/schema/sourceRevealer.exsd
+++ /dev/null
@@ -1,96 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="com.android.ide.eclipse.ddms" xmlns="http://www.w3.org/2001/XMLSchema">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="com.android.ide.eclipse.ddms" id="sourceRevealer" name="Source Revealer"/>
-      </appInfo>
-      <documentation>
-         Extension Point to provide a way to display the source code of a VM running on a connected device.
-
-The goal of the extension is to identify which project in the workspace matches the running application to properly identify the source file to open.
-      </documentation>
-   </annotation>
-
-   <element name="revealer">
-      <complexType>
-         <attribute name="class" type="string" use="required">
-            <annotation>
-               <documentation>
-
-               </documentation>
-               <appInfo>
-                  <meta.attribute kind="java" basedOn=":com.android.ide.eclipse.ddms.ISourceRevealer"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="extension">
-      <annotation>
-         <appInfo>
-            <meta.element />
-         </appInfo>
-      </annotation>
-      <complexType>
-         <sequence>
-            <element ref="revealer"/>
-         </sequence>
-         <attribute name="point" type="string" use="required">
-            <annotation>
-               <documentation>
-
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-
-               </documentation>
-               <appInfo>
-                  <meta.attribute translatable="true"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="since"/>
-      </appInfo>
-      <documentation>
-         8.0.0
-      </documentation>
-   </annotation>
-
-
-   <annotation>
-      <appInfo>
-         <meta.section type="apiinfo"/>
-      </appInfo>
-      <documentation>
-         The class must implement com.android.ide.ddms.ISourceRevealer.
-      </documentation>
-   </annotation>
-
-
-   <annotation>
-      <appInfo>
-         <meta.section type="copyright"/>
-      </appInfo>
-      <documentation>
-         Copyright (C) 2010 The Android Open Source Project
-      </documentation>
-   </annotation>
-
-</schema>
diff --git a/eclipse/plugins/com.android.ide.eclipse.ddms/schema/toolsLocator.exsd b/eclipse/plugins/com.android.ide.eclipse.ddms/schema/toolsLocator.exsd
deleted file mode 100644
index da51921..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.ddms/schema/toolsLocator.exsd
+++ /dev/null
@@ -1,104 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="com.android.ide.eclipse.ddms" xmlns="http://www.w3.org/2001/XMLSchema">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="com.android.ide.eclipse.ddms" id="toolsLocator" name="Tools Locator"/>
-      </appInfo>
-      <documentation>
-         Extension Point to provide the location of SDK Tools to DDMS.
-      </documentation>
-   </annotation>
-
-   <element name="locator">
-      <complexType>
-         <attribute name="class" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-               <appInfo>
-                  <meta.attribute kind="java" basedOn=":com.android.ide.eclipse.ddms.IToolsLocator"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="extension">
-      <annotation>
-         <appInfo>
-            <meta.element />
-         </appInfo>
-      </annotation>
-      <complexType>
-         <sequence>
-            <element ref="locator"/>
-         </sequence>
-         <attribute name="point" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-               <appInfo>
-                  <meta.attribute translatable="true"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="since"/>
-      </appInfo>
-      <documentation>
-         8.0.0
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="examples"/>
-      </appInfo>
-      <documentation>
-         &lt;extension point=&quot;com.android.ide.eclipse.ddms.toolsLocator&quot;&gt;
-    &lt;locator class=&quot;com.android.ide.eclipse.adt.ToolsLocator&quot;/&gt;
-&lt;/extension&gt;
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="apiinfo"/>
-      </appInfo>
-      <documentation>
-         The class must implement com.android.ide.ddms.IToolsLocator.
-      </documentation>
-   </annotation>
-
-
-   <annotation>
-      <appInfo>
-         <meta.section type="copyright"/>
-      </appInfo>
-      <documentation>
-         Copyright (C) 2010 The Android Open Source Project
-      </documentation>
-   </annotation>
-
-</schema>
diff --git a/eclipse/plugins/com.android.ide.eclipse.ddms/schema/traceviewLauncher.exsd b/eclipse/plugins/com.android.ide.eclipse.ddms/schema/traceviewLauncher.exsd
deleted file mode 100644
index daca83a..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.ddms/schema/traceviewLauncher.exsd
+++ /dev/null
@@ -1,100 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="com.android.ide.eclipse.ddms" xmlns="http://www.w3.org/2001/XMLSchema">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="com.android.ide.eclipse.ddms" id="traceviewLauncher" name="Traceview Launcher"/>
-      </appInfo>
-      <documentation>
-         Extension Point to launch Traceview.
-      </documentation>
-   </annotation>
-
-   <element name="launcher">
-      <complexType>
-         <attribute name="class" type="string" use="required">
-            <annotation>
-               <documentation>
-               </documentation>
-               <appInfo>
-                  <meta.attribute kind="java" basedOn=":com.android.ide.eclipse.ddms.ITraceviewLauncher"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="extension">
-      <annotation>
-         <appInfo>
-            <meta.element />
-         </appInfo>
-      </annotation>
-      <complexType>
-         <sequence>
-            <element ref="launcher"/>
-         </sequence>
-         <attribute name="point" type="string" use="required">
-            <annotation>
-               <documentation>
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-               </documentation>
-               <appInfo>
-                  <meta.attribute translatable="true"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="since"/>
-      </appInfo>
-      <documentation>
-         10.0.0
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="examples"/>
-      </appInfo>
-      <documentation>
-         &lt;extension point=&quot;com.android.ide.eclipse.ddms.traceviewLauncher&quot;&gt;
-    &lt;launcher class=&quot;com.android.ide.eclipse.adt.Launcher&quot;/&gt;
-&lt;/extension&gt;
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="apiinfo"/>
-      </appInfo>
-      <documentation>
-         The class must implement com.android.ide.ddms.ITraceviewLauncher.
-      </documentation>
-   </annotation>
-
-
-   <annotation>
-      <appInfo>
-         <meta.section type="copyright"/>
-      </appInfo>
-      <documentation>
-         Copyright (C) 2011 The Android Open Source Project
-      </documentation>
-   </annotation>
-
-</schema>
diff --git a/eclipse/plugins/com.android.ide.eclipse.ddms/src/com/android/ide/eclipse/ddms/CommonAction.java b/eclipse/plugins/com.android.ide.eclipse.ddms/src/com/android/ide/eclipse/ddms/CommonAction.java
deleted file mode 100644
index ae13037..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.ddms/src/com/android/ide/eclipse/ddms/CommonAction.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.eclipse.ddms;
-
-import com.android.ddmuilib.actions.ICommonAction;
-
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.resource.ImageDescriptor;
-
-/**
- * Basic action extending the jFace Action class in order to implement
- * ICommonAction.
- */
-public class CommonAction extends Action implements ICommonAction {
-
-    private Runnable mRunnable;
-
-    public CommonAction() {
-        super();
-    }
-
-    public CommonAction(String text) {
-        super(text);
-    }
-
-    /**
-     * @param text
-     * @param image
-     */
-    public CommonAction(String text, ImageDescriptor image) {
-        super(text, image);
-    }
-
-    /**
-     * @param text
-     * @param style
-     */
-    public CommonAction(String text, int style) {
-        super(text, style);
-    }
-
-    @Override
-    public void run() {
-        if (mRunnable != null) {
-            mRunnable.run();
-        }
-    }
-
-    /**
-     * Sets the {@link Runnable}.
-     * @see ICommonAction#setRunnable(Runnable)
-     */
-    @Override
-    public void setRunnable(Runnable runnable) {
-        mRunnable = runnable;
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.ddms/src/com/android/ide/eclipse/ddms/DdmsPlugin.java b/eclipse/plugins/com.android.ide.eclipse.ddms/src/com/android/ide/eclipse/ddms/DdmsPlugin.java
deleted file mode 100644
index e08080b..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.ddms/src/com/android/ide/eclipse/ddms/DdmsPlugin.java
+++ /dev/null
@@ -1,876 +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.eclipse.ddms;
-
-import com.android.annotations.NonNull;
-import com.android.ddmlib.AndroidDebugBridge;
-import com.android.ddmlib.AndroidDebugBridge.IDeviceChangeListener;
-import com.android.ddmlib.Client;
-import com.android.ddmlib.DdmPreferences;
-import com.android.ddmlib.IDevice;
-import com.android.ddmlib.Log;
-import com.android.ddmlib.Log.ILogOutput;
-import com.android.ddmlib.Log.LogLevel;
-import com.android.ddmuilib.DdmUiPreferences;
-import com.android.ddmuilib.DevicePanel.IUiSelectionListener;
-import com.android.ddmuilib.StackTracePanel;
-import com.android.ddmuilib.console.DdmConsole;
-import com.android.ddmuilib.console.IDdmConsole;
-import com.android.ide.eclipse.ddms.i18n.Messages;
-import com.android.ide.eclipse.ddms.preferences.PreferenceInitializer;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IExtensionPoint;
-import org.eclipse.core.runtime.IExtensionRegistry;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.core.runtime.jobs.Job;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.util.IPropertyChangeListener;
-import org.eclipse.jface.util.PropertyChangeEvent;
-import org.eclipse.swt.SWTException;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.console.ConsolePlugin;
-import org.eclipse.ui.console.IConsole;
-import org.eclipse.ui.console.MessageConsole;
-import org.eclipse.ui.console.MessageConsoleStream;
-import org.eclipse.ui.plugin.AbstractUIPlugin;
-import org.osgi.framework.BundleContext;
-
-import java.io.File;
-import java.util.ArrayList;
-import java.util.Calendar;
-import java.util.Collections;
-import java.util.List;
-
-/**
- * The activator class controls the plug-in life cycle
- */
-public final class DdmsPlugin extends AbstractUIPlugin implements IDeviceChangeListener,
-        IUiSelectionListener, com.android.ddmuilib.StackTracePanel.ISourceRevealer {
-
-
-    // The plug-in ID
-    public static final String PLUGIN_ID = "com.android.ide.eclipse.ddms"; //$NON-NLS-1$
-
-    /** The singleton instance */
-    private static DdmsPlugin sPlugin;
-
-    /** Location of the adb command line executable */
-    private static String sAdbLocation;
-    private static String sToolsFolder;
-    private static String sHprofConverter;
-
-    private boolean mHasDebuggerConnectors;
-    /** debugger connectors for already running apps.
-     * Initialized from an extension point.
-     */
-    private IDebuggerConnector[] mDebuggerConnectors;
-    private ITraceviewLauncher[] mTraceviewLaunchers;
-    private List<IClientAction> mClientSpecificActions = null;
-
-    /** Console for DDMS log message */
-    private MessageConsole mDdmsConsole;
-
-    private IDevice mCurrentDevice;
-    private Client mCurrentClient;
-    private boolean mListeningToUiSelection = false;
-
-    private final ArrayList<ISelectionListener> mListeners = new ArrayList<ISelectionListener>();
-
-    private Color mRed;
-
-
-    /**
-     * Classes which implement this interface provide methods that deals
-     * with {@link IDevice} and {@link Client} selectionchanges.
-     */
-    public interface ISelectionListener {
-
-        /**
-         * Sent when a new {@link Client} is selected.
-         * @param selectedClient The selected client. If null, no clients are selected.
-         */
-        public void selectionChanged(Client selectedClient);
-
-        /**
-         * Sent when a new {@link IDevice} is selected.
-         * @param selectedDevice the selected device. If null, no devices are selected.
-         */
-        public void selectionChanged(IDevice selectedDevice);
-    }
-
-    /**
-     * The constructor
-     */
-    public DdmsPlugin() {
-        sPlugin = this;
-    }
-
-    /*
-     * (non-Javadoc)
-     *
-     * @see org.eclipse.ui.plugin.AbstractUIPlugin#start(org.osgi.framework.BundleContext)
-     */
-    @Override
-    public void start(BundleContext context) throws Exception {
-        super.start(context);
-
-        final Display display = getDisplay();
-
-        // get the eclipse store
-        final IPreferenceStore eclipseStore = getPreferenceStore();
-
-        AndroidDebugBridge.addDeviceChangeListener(this);
-
-        DdmUiPreferences.setStore(eclipseStore);
-
-        //DdmUiPreferences.displayCharts();
-
-        // set the consoles.
-        mDdmsConsole = new MessageConsole("DDMS", null); //$NON-NLS-1$
-        ConsolePlugin.getDefault().getConsoleManager().addConsoles(
-                new IConsole[] {
-                    mDdmsConsole
-                });
-
-        final MessageConsoleStream consoleStream = mDdmsConsole.newMessageStream();
-        final MessageConsoleStream errorConsoleStream = mDdmsConsole.newMessageStream();
-        mRed = new Color(display, 0xFF, 0x00, 0x00);
-
-        // because this can be run, in some cases, by a non UI thread, and because
-        // changing the console properties update the UI, we need to make this change
-        // in the UI thread.
-        display.asyncExec(new Runnable() {
-            @Override
-            public void run() {
-                errorConsoleStream.setColor(mRed);
-            }
-        });
-
-        // set up the ddms log to use the ddms console.
-        Log.setLogOutput(new ILogOutput() {
-            @Override
-            public void printLog(LogLevel logLevel, String tag, String message) {
-                if (logLevel.getPriority() >= LogLevel.ERROR.getPriority()) {
-                    printToStream(errorConsoleStream, tag, message);
-                    showConsoleView(mDdmsConsole);
-                } else {
-                    printToStream(consoleStream, tag, message);
-                }
-            }
-
-            @Override
-            public void printAndPromptLog(final LogLevel logLevel, final String tag,
-                    final String message) {
-                printLog(logLevel, tag, message);
-                // dialog box only run in UI thread..
-                display.asyncExec(new Runnable() {
-                    @Override
-                    public void run() {
-                        Shell shell = display.getActiveShell();
-                        if (logLevel == LogLevel.ERROR) {
-                            MessageDialog.openError(shell, tag, message);
-                        } else {
-                            MessageDialog.openWarning(shell, tag, message);
-                        }
-                    }
-                });
-            }
-
-        });
-
-        // set up the ddms console to use this objects
-        DdmConsole.setConsole(new IDdmConsole() {
-            @Override
-            public void printErrorToConsole(String message) {
-                printToStream(errorConsoleStream, null, message);
-                showConsoleView(mDdmsConsole);
-            }
-            @Override
-            public void printErrorToConsole(String[] messages) {
-                for (String m : messages) {
-                    printToStream(errorConsoleStream, null, m);
-                }
-                showConsoleView(mDdmsConsole);
-            }
-            @Override
-            public void printToConsole(String message) {
-                printToStream(consoleStream, null, message);
-            }
-            @Override
-            public void printToConsole(String[] messages) {
-                for (String m : messages) {
-                    printToStream(consoleStream, null, m);
-                }
-            }
-        });
-
-        // set the listener for the preference change
-        eclipseStore.addPropertyChangeListener(new IPropertyChangeListener() {
-            @Override
-            public void propertyChange(PropertyChangeEvent event) {
-                // get the name of the property that changed.
-                String property = event.getProperty();
-
-                if (PreferenceInitializer.ATTR_DEBUG_PORT_BASE.equals(property)) {
-                    DdmPreferences.setDebugPortBase(
-                            eclipseStore.getInt(PreferenceInitializer.ATTR_DEBUG_PORT_BASE));
-                } else if (PreferenceInitializer.ATTR_SELECTED_DEBUG_PORT.equals(property)) {
-                    DdmPreferences.setSelectedDebugPort(
-                            eclipseStore.getInt(PreferenceInitializer.ATTR_SELECTED_DEBUG_PORT));
-                } else if (PreferenceInitializer.ATTR_THREAD_INTERVAL.equals(property)) {
-                    DdmUiPreferences.setThreadRefreshInterval(
-                            eclipseStore.getInt(PreferenceInitializer.ATTR_THREAD_INTERVAL));
-                } else if (PreferenceInitializer.ATTR_LOG_LEVEL.equals(property)) {
-                    DdmPreferences.setLogLevel(
-                            eclipseStore.getString(PreferenceInitializer.ATTR_LOG_LEVEL));
-                } else if (PreferenceInitializer.ATTR_TIME_OUT.equals(property)) {
-                    DdmPreferences.setTimeOut(
-                            eclipseStore.getInt(PreferenceInitializer.ATTR_TIME_OUT));
-                } else if (PreferenceInitializer.ATTR_USE_ADBHOST.equals(property)) {
-                    DdmPreferences.setUseAdbHost(
-                            eclipseStore.getBoolean(PreferenceInitializer.ATTR_USE_ADBHOST));
-                } else if (PreferenceInitializer.ATTR_ADBHOST_VALUE.equals(property)) {
-                    DdmPreferences.setAdbHostValue(
-                            eclipseStore.getString(PreferenceInitializer.ATTR_ADBHOST_VALUE));
-                }
-            }
-        });
-
-        // do some last initializations
-
-        // set the preferences.
-        PreferenceInitializer.setupPreferences();
-
-        // this class is set as the main source revealer and will look at all the implementations
-        // of the extension point. see #reveal(String, String, int)
-        StackTracePanel.setSourceRevealer(this);
-
-        /*
-         * Load the extension point implementations.
-         * The first step is to load the IConfigurationElement representing the implementations.
-         * The 2nd step is to use these objects to instantiate the implementation classes.
-         *
-         * Because the 2nd step will trigger loading the plug-ins providing the implementations,
-         * and those plug-ins could access DDMS classes (like ADT), this 2nd step should be done
-         * in a Job to ensure that DDMS is loaded, so that the other plug-ins can load.
-         *
-         * Both steps could be done in the 2nd step but some of DDMS UI rely on knowing if there
-         * is an implementation or not (DeviceView), so we do the first steps in start() and, in
-         * some case, record it.
-         *
-         */
-
-        // get the IConfigurationElement for the debuggerConnector right away.
-        final IConfigurationElement[] dcce = findConfigElements(
-                "com.android.ide.eclipse.ddms.debuggerConnector"); //$NON-NLS-1$
-        mHasDebuggerConnectors = dcce.length > 0;
-
-        // get the other configElements and instantiante them in a Job.
-        new Job(Messages.DdmsPlugin_DDMS_Post_Create_Init) {
-            @Override
-            protected IStatus run(IProgressMonitor monitor) {
-                try {
-                    // init the lib
-                    AndroidDebugBridge.init(true /* debugger support */);
-
-                    // get the available adb locators
-                    IConfigurationElement[] elements = findConfigElements(
-                            "com.android.ide.eclipse.ddms.toolsLocator"); //$NON-NLS-1$
-
-                    IToolsLocator[] locators = instantiateToolsLocators(elements);
-
-                    for (IToolsLocator locator : locators) {
-                        try {
-                            String adbLocation = locator.getAdbLocation();
-                            String traceviewLocation = locator.getTraceViewLocation();
-                            String hprofConvLocation = locator.getHprofConvLocation();
-                            if (adbLocation != null && traceviewLocation != null &&
-                                    hprofConvLocation != null) {
-                                // checks if the location is valid.
-                                if (setToolsLocation(adbLocation, hprofConvLocation,
-                                        traceviewLocation)) {
-
-                                    AndroidDebugBridge.createBridge(sAdbLocation,
-                                            true /* forceNewBridge */);
-
-                                    // no need to look at the other locators.
-                                    break;
-                                }
-                            }
-                        } catch (Throwable t) {
-                            // ignore, we'll just not use this implementation.
-                        }
-                    }
-
-                    // get the available debugger connectors
-                    mDebuggerConnectors = instantiateDebuggerConnectors(dcce);
-
-                    // get the available Traceview Launchers.
-                    elements = findConfigElements("com.android.ide.eclipse.ddms.traceviewLauncher"); //$NON-NLS-1$
-                    mTraceviewLaunchers = instantiateTraceviewLauncher(elements);
-
-                    return Status.OK_STATUS;
-                } catch (CoreException e) {
-                    return e.getStatus();
-                }
-            }
-        }.schedule();
-    }
-
-    private void showConsoleView(MessageConsole console) {
-        ConsolePlugin.getDefault().getConsoleManager().showConsoleView(console);
-    }
-
-
-    /** Obtain a list of configuration elements that extend the given extension point. */
-    IConfigurationElement[] findConfigElements(String extensionPointId) {
-        // get the adb location from an implementation of the ADB Locator extension point.
-        IExtensionRegistry extensionRegistry = Platform.getExtensionRegistry();
-        IExtensionPoint extensionPoint = extensionRegistry.getExtensionPoint(extensionPointId);
-        if (extensionPoint != null) {
-            return extensionPoint.getConfigurationElements();
-        }
-
-        // shouldn't happen or it means the plug-in is broken.
-        return new IConfigurationElement[0];
-    }
-
-    /**
-     * Finds if any other plug-in is extending the exposed Extension Point called adbLocator.
-     *
-     * @return an array of all locators found, or an empty array if none were found.
-     */
-    private IToolsLocator[] instantiateToolsLocators(IConfigurationElement[] configElements)
-            throws CoreException {
-        ArrayList<IToolsLocator> list = new ArrayList<IToolsLocator>();
-
-        if (configElements.length > 0) {
-            // only use the first one, ignore the others.
-            IConfigurationElement configElement = configElements[0];
-
-            // instantiate the class
-            Object obj = configElement.createExecutableExtension("class"); //$NON-NLS-1$
-            if (obj instanceof IToolsLocator) {
-                list.add((IToolsLocator) obj);
-            }
-        }
-
-        return list.toArray(new IToolsLocator[list.size()]);
-    }
-
-    /**
-     * Finds if any other plug-in is extending the exposed Extension Point called debuggerConnector.
-     *
-     * @return an array of all locators found, or an empty array if none were found.
-     */
-    private IDebuggerConnector[] instantiateDebuggerConnectors(
-            IConfigurationElement[] configElements) throws CoreException {
-        ArrayList<IDebuggerConnector> list = new ArrayList<IDebuggerConnector>();
-
-        if (configElements.length > 0) {
-            // only use the first one, ignore the others.
-            IConfigurationElement configElement = configElements[0];
-
-            // instantiate the class
-            Object obj = configElement.createExecutableExtension("class"); //$NON-NLS-1$
-            if (obj instanceof IDebuggerConnector) {
-                list.add((IDebuggerConnector) obj);
-            }
-        }
-
-        return list.toArray(new IDebuggerConnector[list.size()]);
-    }
-
-    /**
-     * Finds if any other plug-in is extending the exposed Extension Point called traceviewLauncher.
-     *
-     * @return an array of all locators found, or an empty array if none were found.
-     */
-    private ITraceviewLauncher[] instantiateTraceviewLauncher(
-            IConfigurationElement[] configElements)
-            throws CoreException {
-        ArrayList<ITraceviewLauncher> list = new ArrayList<ITraceviewLauncher>();
-
-        if (configElements.length > 0) {
-            // only use the first one, ignore the others.
-            IConfigurationElement configElement = configElements[0];
-
-            // instantiate the class
-            Object obj = configElement.createExecutableExtension("class"); //$NON-NLS-1$
-            if (obj instanceof ITraceviewLauncher) {
-                list.add((ITraceviewLauncher) obj);
-            }
-        }
-
-        return list.toArray(new ITraceviewLauncher[list.size()]);
-    }
-
-    /**
-     * Returns the classes that implement {@link IClientAction} in each of the extensions that
-     * extend clientAction extension point.
-     * @throws CoreException
-     */
-    private List<IClientAction> instantiateClientSpecificActions(IConfigurationElement[] elements)
-            throws CoreException {
-        if (elements == null || elements.length == 0) {
-            return Collections.emptyList();
-        }
-
-        List<IClientAction> extensions = new ArrayList<IClientAction>(1);
-
-        for (IConfigurationElement e : elements) {
-            Object o = e.createExecutableExtension("class"); //$NON-NLS-1$
-            if (o instanceof IClientAction) {
-                extensions.add((IClientAction) o);
-            }
-        }
-
-        return extensions;
-    }
-
-    public static Display getDisplay() {
-        IWorkbench bench = sPlugin.getWorkbench();
-        if (bench != null) {
-            return bench.getDisplay();
-        }
-        return null;
-    }
-
-    /*
-     * (non-Javadoc)
-     *
-     * @see org.eclipse.ui.plugin.AbstractUIPlugin#stop(org.osgi.framework.BundleContext)
-     */
-    @Override
-    public void stop(BundleContext context) throws Exception {
-        AndroidDebugBridge.removeDeviceChangeListener(this);
-
-        AndroidDebugBridge.terminate();
-
-        mRed.dispose();
-
-        sPlugin = null;
-        super.stop(context);
-    }
-
-    /**
-     * Returns the shared instance
-     *
-     * @return the shared instance
-     */
-    public static DdmsPlugin getDefault() {
-        return sPlugin;
-    }
-
-    public static String getAdb() {
-        return sAdbLocation;
-    }
-
-    public static File getPlatformToolsFolder() {
-        return new File(sAdbLocation).getParentFile();
-    }
-
-    public static String getToolsFolder() {
-        return sToolsFolder;
-    }
-
-    public static String getHprofConverter() {
-        return sHprofConverter;
-    }
-
-    /**
-     * Stores the adb location. This returns true if the location is an existing file.
-     */
-    private static boolean setToolsLocation(String adbLocation, String hprofConvLocation,
-            String traceViewLocation) {
-
-        File adb = new File(adbLocation);
-        File hprofConverter = new File(hprofConvLocation);
-        File traceview = new File(traceViewLocation);
-
-        String missing = "";
-        if (adb.isFile() == false) {
-            missing += adb.getAbsolutePath() + " ";
-        }
-        if (hprofConverter.isFile() == false) {
-            missing += hprofConverter.getAbsolutePath() + " ";
-        }
-        if (traceview.isFile() == false) {
-            missing += traceview.getAbsolutePath() + " ";
-        }
-
-        if (missing.length() > 0) {
-            String msg = String.format("DDMS files not found: %1$s", missing);
-            Log.e("DDMS", msg);
-            Status status = new Status(IStatus.ERROR, PLUGIN_ID, msg, null /*exception*/);
-            getDefault().getLog().log(status);
-            return false;
-        }
-
-        sAdbLocation = adbLocation;
-        sHprofConverter = hprofConverter.getAbsolutePath();
-        DdmUiPreferences.setTraceviewLocation(traceview.getAbsolutePath());
-
-        sToolsFolder = traceview.getParent();
-
-        return true;
-    }
-
-    /**
-     * Set the location of the adb executable and optionally starts adb
-     * @param adb location of adb
-     * @param startAdb flag to start adb
-     */
-    public static void setToolsLocation(String adbLocation, boolean startAdb,
-            String hprofConvLocation, String traceViewLocation) {
-
-        if (setToolsLocation(adbLocation, hprofConvLocation, traceViewLocation)) {
-            // starts the server in a thread in case this is blocking.
-            if (startAdb) {
-                new Thread() {
-                    @Override
-                    public void run() {
-                        // create and start the bridge
-                        try {
-                            AndroidDebugBridge.createBridge(sAdbLocation,
-                                    false /* forceNewBridge */);
-                        } catch (Throwable t) {
-                            Status status = new Status(IStatus.ERROR, PLUGIN_ID,
-                                    "Failed to create AndroidDebugBridge", t);
-                            getDefault().getLog().log(status);
-                        }
-                    }
-                }.start();
-            }
-        }
-    }
-
-    /**
-     * Returns whether there are implementations of the debuggerConnectors extension point.
-     * <p/>
-     * This is guaranteed to return the correct value as soon as the plug-in is loaded.
-     */
-    public boolean hasDebuggerConnectors() {
-        return mHasDebuggerConnectors;
-    }
-
-    /**
-     * Returns the implementations of {@link IDebuggerConnector}.
-     * <p/>
-     * There may be a small amount of time right after the plug-in load where this can return
-     * null even if there are implementation.
-     * <p/>
-     * Since the use of the implementation likely require user input, the UI can use
-     * {@link #hasDebuggerConnectors()} to know if there are implementations before they are loaded.
-     */
-    public IDebuggerConnector[] getDebuggerConnectors() {
-        return mDebuggerConnectors;
-    }
-
-    public synchronized void addSelectionListener(ISelectionListener listener) {
-        mListeners.add(listener);
-
-        // notify the new listener of the current selection
-       listener.selectionChanged(mCurrentDevice);
-       listener.selectionChanged(mCurrentClient);
-    }
-
-    public synchronized void removeSelectionListener(ISelectionListener listener) {
-        mListeners.remove(listener);
-    }
-
-    public synchronized void setListeningState(boolean state) {
-        mListeningToUiSelection = state;
-    }
-
-    /**
-     * Sent when the a device is connected to the {@link AndroidDebugBridge}.
-     * <p/>
-     * This is sent from a non UI thread.
-     * @param device the new device.
-     *
-     * @see IDeviceChangeListener#deviceConnected(IDevice)
-     */
-    @Override
-    public void deviceConnected(IDevice device) {
-        // if we are listening to selection coming from the ui, then we do nothing, as
-        // any change in the devices/clients, will be handled by the UI, and we'll receive
-        // selection notification through our implementation of IUiSelectionListener.
-        if (mListeningToUiSelection == false) {
-            if (mCurrentDevice == null) {
-                handleDefaultSelection(device);
-            }
-        }
-    }
-
-    /**
-     * Sent when the a device is disconnected to the {@link AndroidDebugBridge}.
-     * <p/>
-     * This is sent from a non UI thread.
-     * @param device the new device.
-     *
-     * @see IDeviceChangeListener#deviceDisconnected(IDevice)
-     */
-    @Override
-    public void deviceDisconnected(IDevice device) {
-        // if we are listening to selection coming from the ui, then we do nothing, as
-        // any change in the devices/clients, will be handled by the UI, and we'll receive
-        // selection notification through our implementation of IUiSelectionListener.
-        if (mListeningToUiSelection == false) {
-            // test if the disconnected device was the default selection.
-            if (mCurrentDevice == device) {
-                // try to find a new device
-                AndroidDebugBridge bridge = AndroidDebugBridge.getBridge();
-                if (bridge != null) {
-                    // get the device list
-                    IDevice[] devices = bridge.getDevices();
-
-                    // check if we still have devices
-                    if (devices.length == 0) {
-                        handleDefaultSelection((IDevice)null);
-                    } else {
-                        handleDefaultSelection(devices[0]);
-                    }
-                } else {
-                    handleDefaultSelection((IDevice)null);
-                }
-            }
-        }
-    }
-
-    /**
-     * Sent when a device data changed, or when clients are started/terminated on the device.
-     * <p/>
-     * This is sent from a non UI thread.
-     * @param device the device that was updated.
-     * @param changeMask the mask indicating what changed.
-     *
-     * @see IDeviceChangeListener#deviceChanged(IDevice)
-     */
-    @Override
-    public void deviceChanged(IDevice device, int changeMask) {
-        // if we are listening to selection coming from the ui, then we do nothing, as
-        // any change in the devices/clients, will be handled by the UI, and we'll receive
-        // selection notification through our implementation of IUiSelectionListener.
-        if (mListeningToUiSelection == false) {
-
-            // check if this is our device
-            if (device == mCurrentDevice) {
-                if (mCurrentClient == null) {
-                    handleDefaultSelection(device);
-                } else {
-                    // get the clients and make sure ours is still in there.
-                    Client[] clients = device.getClients();
-                    boolean foundClient = false;
-                    for (Client client : clients) {
-                        if (client == mCurrentClient) {
-                            foundClient = true;
-                            break;
-                        }
-                    }
-
-                    // if we haven't found our client, lets look for a new one
-                    if (foundClient == false) {
-                        mCurrentClient = null;
-                        handleDefaultSelection(device);
-                    }
-                }
-            }
-        }
-    }
-
-    /**
-     * Sent when a new {@link IDevice} and {@link Client} are selected.
-     * @param selectedDevice the selected device. If null, no devices are selected.
-     * @param selectedClient The selected client. If null, no clients are selected.
-     */
-    @Override
-    public synchronized void selectionChanged(IDevice selectedDevice, Client selectedClient) {
-        if (mCurrentDevice != selectedDevice) {
-            mCurrentDevice = selectedDevice;
-
-            // notify of the new default device
-            for (ISelectionListener listener : mListeners) {
-                listener.selectionChanged(mCurrentDevice);
-            }
-        }
-
-        if (mCurrentClient != selectedClient) {
-            mCurrentClient = selectedClient;
-
-            // notify of the new default client
-            for (ISelectionListener listener : mListeners) {
-                listener.selectionChanged(mCurrentClient);
-            }
-        }
-    }
-
-    /**
-     * Handles a default selection of a {@link IDevice} and {@link Client}.
-     * @param device the selected device
-     */
-    private void handleDefaultSelection(final IDevice device) {
-        // because the listener expect to receive this from the UI thread, and this is called
-        // from the AndroidDebugBridge notifications, we need to run this in the UI thread.
-        try {
-            Display display = getDisplay();
-
-            display.asyncExec(new Runnable() {
-                @Override
-                public void run() {
-                    // set the new device if different.
-                    boolean newDevice = false;
-                    if (mCurrentDevice != device) {
-                        mCurrentDevice = device;
-                        newDevice = true;
-
-                        // notify of the new default device
-                        for (ISelectionListener listener : mListeners) {
-                            listener.selectionChanged(mCurrentDevice);
-                        }
-                    }
-
-                    if (device != null) {
-                        // if this is a device switch or the same device but we didn't find a valid
-                        // client the last time, we go look for a client to use again.
-                        if (newDevice || mCurrentClient == null) {
-                            // now get the new client
-                            Client[] clients =  device.getClients();
-                            if (clients.length > 0) {
-                                handleDefaultSelection(clients[0]);
-                            } else {
-                                handleDefaultSelection((Client)null);
-                            }
-                        }
-                    } else {
-                        handleDefaultSelection((Client)null);
-                    }
-                }
-            });
-        } catch (SWTException e) {
-            // display is disposed. Do nothing since we're quitting anyway.
-        }
-    }
-
-    private void handleDefaultSelection(Client client) {
-        mCurrentClient = client;
-
-        // notify of the new default client
-        for (ISelectionListener listener : mListeners) {
-            listener.selectionChanged(mCurrentClient);
-        }
-    }
-
-    /**
-     * Prints a message, associated with a project to the specified stream
-     * @param stream The stream to write to
-     * @param tag The tag associated to the message. Can be null
-     * @param message The message to print.
-     */
-    private static synchronized void printToStream(MessageConsoleStream stream, String tag,
-            String message) {
-        String dateTag = getMessageTag(tag);
-
-        stream.print(dateTag);
-        if (!dateTag.endsWith(" ")) {
-            stream.print(" ");          //$NON-NLS-1$
-        }
-        stream.println(message);
-    }
-
-    /**
-     * Creates a string containing the current date/time, and the tag
-     * @param tag The tag associated to the message. Can be null
-     * @return The dateTag
-     */
-    private static String getMessageTag(String tag) {
-        Calendar c = Calendar.getInstance();
-
-        if (tag == null) {
-            return String.format(Messages.DdmsPlugin_Message_Tag_Mask_1, c);
-        }
-
-        return String.format(Messages.DdmsPlugin_Message_Tag_Mask_2, c, tag);
-    }
-
-    /**
-     * Implementation of com.android.ddmuilib.StackTracePanel.ISourceRevealer.
-     */
-    @Override
-    public void reveal(String applicationName, String className, int line) {
-        JavaSourceRevealer.reveal(applicationName, className, line);
-    }
-
-    public boolean launchTraceview(String osPath) {
-        if (mTraceviewLaunchers != null) {
-            for (ITraceviewLauncher launcher : mTraceviewLaunchers) {
-                try {
-                    if (launcher.openFile(osPath)) {
-                        return true;
-                    }
-                } catch (Throwable t) {
-                    // ignore, we'll just not use this implementation.
-                }
-            }
-        }
-
-        return false;
-    }
-
-    /**
-     * Returns the list of clients that extend the clientAction extension point.
-     */
-    @NonNull
-    public synchronized List<IClientAction> getClientSpecificActions() {
-        if (mClientSpecificActions == null) {
-            // get available client specific action extensions
-            IConfigurationElement[] elements =
-                    findConfigElements("com.android.ide.eclipse.ddms.clientAction"); //$NON-NLS-1$
-            try {
-                mClientSpecificActions = instantiateClientSpecificActions(elements);
-            } catch (CoreException e) {
-                mClientSpecificActions = Collections.emptyList();
-            }
-        }
-
-        return mClientSpecificActions;
-    }
-
-    private LogCatMonitor mLogCatMonitor;
-    public void startLogCatMonitor(IDevice device) {
-        if (mLogCatMonitor == null) {
-            mLogCatMonitor = new LogCatMonitor(getDebuggerConnectors(), getPreferenceStore());
-        }
-
-        mLogCatMonitor.monitorDevice(device);
-    }
-
-    /** Returns an image descriptor for the image file at the given plug-in relative path */
-    public static ImageDescriptor getImageDescriptor(String path) {
-        return imageDescriptorFromPlugin(PLUGIN_ID, path);
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.ddms/src/com/android/ide/eclipse/ddms/IClientAction.java b/eclipse/plugins/com.android.ide.eclipse.ddms/src/com/android/ide/eclipse/ddms/IClientAction.java
deleted file mode 100644
index c231975..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.ddms/src/com/android/ide/eclipse/ddms/IClientAction.java
+++ /dev/null
@@ -1,26 +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.eclipse.ddms;
-
-import com.android.ddmlib.Client;
-
-import org.eclipse.jface.action.Action;
-
-public interface IClientAction {
-    Action getAction();
-    void selectedClientChanged(Client c);
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.ddms/src/com/android/ide/eclipse/ddms/IDebuggerConnector.java b/eclipse/plugins/com.android.ide.eclipse.ddms/src/com/android/ide/eclipse/ddms/IDebuggerConnector.java
deleted file mode 100644
index c22dfd2..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.ddms/src/com/android/ide/eclipse/ddms/IDebuggerConnector.java
+++ /dev/null
@@ -1,45 +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.eclipse.ddms;
-
-/**
- * Classes which implement this interface provides a way to connect a debugger to a VM running
- * on a connected device.
- */
-public interface IDebuggerConnector {
-    /**
-     * Is this application from a project present in the workspace?
-     * @param appName name of the application. This is typically the application's package, but
-     * can be different if the component was setup to run in its own process.
-     * @return true if there is a project in the workspace containing the given app.
-     */
-    boolean isWorkspaceApp(String appName);
-
-    /**
-     * Connects a debugger to a VM identified by its appName.
-     * <p/>
-     * The given port is tied to the application and should be used if possible. However the
-     * "selected" port can also be used if needed.
-     * @param appName the name of the application. Usually the application's package but this
-     * can be different if the component was setup to run in it's own process.
-     * @param appPort the preferred connection port.
-     * @param selectedPort the port value for the selected application
-     * @return true if success.
-     */
-    boolean connectDebugger(String appName, int appPort, int selectedPort);
-
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.ddms/src/com/android/ide/eclipse/ddms/ISourceRevealer.java b/eclipse/plugins/com.android.ide.eclipse.ddms/src/com/android/ide/eclipse/ddms/ISourceRevealer.java
deleted file mode 100644
index 078203f..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.ddms/src/com/android/ide/eclipse/ddms/ISourceRevealer.java
+++ /dev/null
@@ -1,43 +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.eclipse.ddms;
-
-/**
- * Classes which implement this interface are able to open a source file based on the provided
- * constraints.
- */
-public interface ISourceRevealer {
-    /**
-     * Reveal a particular line in the given application.
-     * @param applicationName the name of the application running the source.
-     * @param className the fully qualified class name
-     * @param line the line to reveal
-     * @return true if the source was revealed.
-     */
-    boolean reveal(String applicationName, String className, int line);
-
-    /**
-     * Reveal a particular Java method.
-     * @param fqmn fully qualified method name
-     * @param fileName file name that contains the method, null if not known
-     * @param lineNumber line number in the file, -1 if not known
-     * @param perspective If not null, switch to this perspective before
-     *                            revealing the source
-     * @return true if the source was revealed.
-     */
-    boolean revealMethod(String fqmn, String fileName, int lineNumber, String perspective);
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.ddms/src/com/android/ide/eclipse/ddms/IToolsLocator.java b/eclipse/plugins/com.android.ide.eclipse.ddms/src/com/android/ide/eclipse/ddms/IToolsLocator.java
deleted file mode 100644
index 5b53db3..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.ddms/src/com/android/ide/eclipse/ddms/IToolsLocator.java
+++ /dev/null
@@ -1,41 +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.eclipse.ddms;
-
-/**
- * Classes which implement this interface provides the location of various SDK tools.
- */
-public interface IToolsLocator {
-
-    /**
-     * Queries the location of ADB
-     * @return A full OS path to the location of adb.
-     */
-    String getAdbLocation();
-
-    /**
-     * Queries the location of Traceview
-     * @return A full OS path to the location of traceview
-     */
-    String getTraceViewLocation();
-
-    /**
-     * Queries the location of hprof-conv
-     * @return A full OS path to the location of hprof-conv.
-     */
-    String getHprofConvLocation();
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.ddms/src/com/android/ide/eclipse/ddms/ITraceviewLauncher.java b/eclipse/plugins/com.android.ide.eclipse.ddms/src/com/android/ide/eclipse/ddms/ITraceviewLauncher.java
deleted file mode 100644
index 7542b88..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.ddms/src/com/android/ide/eclipse/ddms/ITraceviewLauncher.java
+++ /dev/null
@@ -1,25 +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.eclipse.ddms;
-
-/**
- * Classes which implement this interface provides a way to open a traceview file.
- */
-public interface ITraceviewLauncher {
-
-    boolean openFile(String osPath);
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.ddms/src/com/android/ide/eclipse/ddms/JavaSourceRevealer.java b/eclipse/plugins/com.android.ide.eclipse.ddms/src/com/android/ide/eclipse/ddms/JavaSourceRevealer.java
deleted file mode 100644
index 6f9086a..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.ddms/src/com/android/ide/eclipse/ddms/JavaSourceRevealer.java
+++ /dev/null
@@ -1,83 +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.eclipse.ddms;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IConfigurationElement;
-
-import java.util.ArrayList;
-import java.util.List;
-
-public class JavaSourceRevealer {
-    private static final String SOURCE_REVEALER_EXTENSION_ID =
-            "com.android.ide.eclipse.ddms.sourceRevealer"; //$NON-NLS-1$
-
-    private static List<ISourceRevealer> sSourceRevealers = instantiateSourceRevealers();
-
-    /** Instantiate all providers of the {@link #SOURCE_REVEALER_EXTENSION_ID} extension. */
-    private static List<ISourceRevealer> instantiateSourceRevealers() {
-        IConfigurationElement[] configElements =
-                DdmsPlugin.getDefault().findConfigElements(SOURCE_REVEALER_EXTENSION_ID);
-
-        List<ISourceRevealer> providers = new ArrayList<ISourceRevealer>();
-
-        for (IConfigurationElement configElement : configElements) {
-            // instantiate the class
-            Object obj = null;
-            try {
-                obj = configElement.createExecutableExtension("class"); //$NON-NLS-1$
-            } catch (CoreException e) {
-                // ignore exception while instantiating this class.
-            }
-
-            if (obj instanceof ISourceRevealer) {
-                providers.add((ISourceRevealer) obj);
-            }
-        }
-
-        return providers;
-    }
-
-    public static boolean reveal(String applicationName, String className, int line) {
-        for (ISourceRevealer revealer : sSourceRevealers) {
-            try {
-                if (revealer.reveal(applicationName, className, line)) {
-                    return true;
-                }
-            } catch (Throwable t) {
-                // ignore, we'll just not use this implementation.
-            }
-        }
-
-        return false;
-    }
-
-    public static boolean revealMethod(String fqmn, String fileName, int linenumber,
-            String perspective) {
-        for (ISourceRevealer revealer : sSourceRevealers) {
-            try {
-                if (revealer.revealMethod(fqmn, fileName, linenumber, perspective)) {
-                    return true;
-                }
-            } catch (Throwable t) {
-                // ignore, we'll just not use this implementation.
-            }
-        }
-
-        return false;
-    }
-}
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
deleted file mode 100644
index e99a637..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.ddms/src/com/android/ide/eclipse/ddms/LogCatMonitor.java
+++ /dev/null
@@ -1,277 +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.eclipse.ddms;
-
-import com.android.ddmlib.AndroidDebugBridge;
-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.LogCatReceiver;
-import com.android.ddmuilib.logcat.LogCatReceiverFactory;
-import com.android.ide.eclipse.ddms.views.LogCatView;
-
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.jface.util.IPropertyChangeListener;
-import org.eclipse.jface.util.PropertyChangeEvent;
-import org.eclipse.jface.window.Window;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.IViewPart;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.PlatformUI;
-
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.concurrent.atomic.AtomicBoolean;
-
-/**
- * LogCatMonitor helps in monitoring the logcat output from a set of devices.
- * It scans through the received logcat messages, and activates the logcat view
- * if any message is deemed important.
- */
-public class LogCatMonitor {
-    public static final String AUTO_MONITOR_PREFKEY = "ddms.logcat.automonitor"; //$NON-NLS-1$
-    public static final String AUTO_MONITOR_LOGLEVEL = "ddms.logcat.auotmonitor.level"; //$NON-NLS-1$
-    private static final String AUTO_MONITOR_PROMPT_SHOWN = "ddms.logcat.automonitor.userprompt"; //$NON-NLS-1$
-
-    private IPreferenceStore mPrefStore;
-    private Map<String, DeviceData> mMonitoredDevices;
-    private IDebuggerConnector[] mConnectors;
-
-    private int mMinMessagePriority;
-
-    /**
-     * Flag that controls when the logcat stream is checked. This flag is set when the user
-     * performs a launch, and is reset as soon as the logcat view is displayed.
-     */
-    final AtomicBoolean mMonitorEnabled = new AtomicBoolean(false);
-
-    public LogCatMonitor(IDebuggerConnector[] debuggerConnectors, IPreferenceStore prefStore) {
-        mConnectors = debuggerConnectors;
-        mPrefStore = prefStore;
-        mMinMessagePriority =
-                LogLevel.getByString(mPrefStore.getString(AUTO_MONITOR_LOGLEVEL)).getPriority();
-
-        mMonitoredDevices = new HashMap<String, DeviceData>();
-
-        AndroidDebugBridge.addDeviceChangeListener(new IDeviceChangeListener() {
-            @Override
-            public void deviceDisconnected(IDevice device) {
-                unmonitorDevice(device.getSerialNumber());
-                mMonitoredDevices.remove(device.getSerialNumber());
-            }
-
-            @Override
-            public void deviceConnected(IDevice device) {
-            }
-
-            @Override
-            public void deviceChanged(IDevice device, int changeMask) {
-            }
-        });
-
-        mPrefStore.addPropertyChangeListener(new IPropertyChangeListener() {
-            @Override
-            public void propertyChange(PropertyChangeEvent event) {
-                if (AUTO_MONITOR_PREFKEY.equals(event.getProperty())
-                        && event.getNewValue().equals(false)) {
-                    unmonitorAllDevices();
-                } else if (AUTO_MONITOR_LOGLEVEL.equals(event.getProperty())) {
-                    mMinMessagePriority =
-                            LogLevel.getByString((String) event.getNewValue()).getPriority();
-                }
-            }
-        });
-    }
-
-    private void unmonitorAllDevices() {
-        for (String device : mMonitoredDevices.keySet()) {
-            unmonitorDevice(device);
-        }
-
-        mMonitoredDevices.clear();
-    }
-
-    private void unmonitorDevice(String deviceSerial) {
-        DeviceData data = mMonitoredDevices.get(deviceSerial);
-        if (data == null) {
-            return;
-        }
-
-        data.receiver.removeMessageReceivedEventListener(data.bufferChangeListener);
-    }
-
-    public void monitorDevice(final IDevice device) {
-        if (!mPrefStore.getBoolean(AUTO_MONITOR_PREFKEY)) {
-            // do not monitor device if auto monitoring is off
-            return;
-        }
-
-        mMonitorEnabled.set(true);
-
-        if (mMonitoredDevices.keySet().contains(device.getSerialNumber())) {
-            // the device is already monitored
-            return;
-        }
-
-        LogCatReceiver r = LogCatReceiverFactory.INSTANCE.newReceiver(device, mPrefStore);
-        ILogCatBufferChangeListener l = new ILogCatBufferChangeListener() {
-            @Override
-            public void bufferChanged(List<LogCatMessage> addedMessages,
-                    List<LogCatMessage> deletedMessages) {
-                checkMessages(addedMessages, device);
-            }
-        };
-        r.addMessageReceivedEventListener(l);
-
-        mMonitoredDevices.put(device.getSerialNumber(), new DeviceData(r, l));
-    }
-
-    private void checkMessages(List<LogCatMessage> receivedMessages, IDevice device) {
-        if (!mMonitorEnabled.get()) {
-            return;
-        }
-
-        // check the received list of messages to see if any of them are
-        // significant enough to be seen by the user. If so, activate the logcat view
-        // to display those messages
-        for (LogCatMessage m : receivedMessages) {
-            if (isImportantMessage(m)) {
-                focusLogCatView(device, m.getAppName());
-
-                // now that logcat view is active, no need to check messages until the next
-                // time user launches an application.
-                mMonitorEnabled.set(false);
-                break;
-            }
-        }
-    }
-
-    /**
-     * Check whether a message is "important". Currently, we assume that a message is important if
-     * it is of severity level error or higher, and it belongs to an app currently in the workspace.
-     */
-    private boolean isImportantMessage(LogCatMessage m) {
-        if (m.getLogLevel().getPriority() < mMinMessagePriority) {
-            return false;
-        }
-
-        String app = m.getAppName();
-        for (IDebuggerConnector c : mConnectors) {
-            if (c.isWorkspaceApp(app)) {
-                return true;
-            }
-        }
-
-        return false;
-    }
-
-    private void focusLogCatView(final IDevice device, final String appName) {
-        Display.getDefault().asyncExec(new Runnable() {
-            @Override
-            public void run() {
-                IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
-                if (window == null) {
-                    return;
-                }
-
-                IWorkbenchPage page = window.getActivePage();
-                if (page == null) {
-                    return;
-                }
-
-                // if the logcat view is not visible, then prompt the user once to set
-                // logcat monitoring preferences
-                if (!isLogCatViewVisible(page)) {
-                    boolean showLogCatView = promptUserOnce(page.getWorkbenchWindow().getShell());
-                    if (!showLogCatView) {
-                        return;
-                    }
-                }
-
-                // display view
-                final LogCatView v = displayLogCatView(page);
-                if (v == null) {
-                    return;
-                }
-
-                // select correct device
-                v.selectionChanged(device);
-
-                // select appropriate filter
-                v.selectTransientAppFilter(appName);
-            }
-
-            private boolean isLogCatViewVisible(IWorkbenchPage page) {
-                IViewPart view = page.findView(LogCatView.ID);
-                return view != null && page.isPartVisible(view);
-            }
-
-            private LogCatView displayLogCatView(IWorkbenchPage page) {
-                // if the view is already in the page, just bring it to the front
-                // without giving it focus.
-                IViewPart view = page.findView(LogCatView.ID);
-                if (view != null) {
-                    page.bringToTop(view);
-                    if (view instanceof LogCatView) {
-                        return (LogCatView)view;
-                    }
-                }
-
-                // if the view is not in the page, then create and show it.
-                try {
-                    return (LogCatView) page.showView(LogCatView.ID);
-                } catch (PartInitException e) {
-                    return null;
-                }
-            }
-
-            private boolean promptUserOnce(Shell shell) {
-                // see if this prompt was already displayed
-                boolean promptShown = mPrefStore.getBoolean(AUTO_MONITOR_PROMPT_SHOWN);
-                if (promptShown) {
-                    return mPrefStore.getBoolean(AUTO_MONITOR_PREFKEY);
-                }
-
-                LogCatMonitorDialog dlg = new LogCatMonitorDialog(shell);
-                int r = dlg.open();
-
-                // save preference indicating that this dialog has been displayed once
-                mPrefStore.setValue(AUTO_MONITOR_PROMPT_SHOWN, true);
-                mPrefStore.setValue(AUTO_MONITOR_PREFKEY, dlg.shouldMonitor());
-                mPrefStore.setValue(AUTO_MONITOR_LOGLEVEL, dlg.getMinimumPriority());
-
-                return r == Window.OK && dlg.shouldMonitor();
-            }
-
-        });
-    }
-
-    private static class DeviceData {
-        public final LogCatReceiver receiver;
-        public final ILogCatBufferChangeListener bufferChangeListener;
-
-        public DeviceData(LogCatReceiver r, ILogCatBufferChangeListener l) {
-            receiver = r;
-            bufferChangeListener = l;
-        }
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.ddms/src/com/android/ide/eclipse/ddms/LogCatMonitorDialog.java b/eclipse/plugins/com.android.ide.eclipse.ddms/src/com/android/ide/eclipse/ddms/LogCatMonitorDialog.java
deleted file mode 100644
index 6194a0d..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.ddms/src/com/android/ide/eclipse/ddms/LogCatMonitorDialog.java
+++ /dev/null
@@ -1,118 +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.eclipse.ddms;
-
-import com.android.ddmlib.Log.LogLevel;
-
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.jface.dialogs.TitleAreaDialog;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Combo;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Shell;
-
-public class LogCatMonitorDialog extends TitleAreaDialog {
-    private static final String TITLE = "Auto Monitor Logcat";
-    private static final String DEFAULT_MESSAGE =
-            "Would you like ADT to automatically monitor logcat \n" +
-            "output for messages from applications in the workspace?";
-
-    private boolean mShouldMonitor = true;
-
-    private static final String[] LOG_PRIORITIES = new String[] {
-        LogLevel.VERBOSE.getStringValue(),
-        LogLevel.DEBUG.getStringValue(),
-        LogLevel.INFO.getStringValue(),
-        LogLevel.WARN.getStringValue(),
-        LogLevel.ERROR.getStringValue(),
-        LogLevel.ASSERT.getStringValue(),
-    };
-    private static final int ERROR_PRIORITY_INDEX = 4;
-
-    private String mMinimumLogPriority = LOG_PRIORITIES[ERROR_PRIORITY_INDEX];
-
-    public LogCatMonitorDialog(Shell parentShell) {
-        super(parentShell);
-        setHelpAvailable(false);
-    }
-
-    @Override
-    protected Control createDialogArea(Composite parent) {
-        setTitle(TITLE);
-        setMessage(DEFAULT_MESSAGE);
-
-        parent = (Composite) super.createDialogArea(parent);
-        Composite c = new Composite(parent, SWT.BORDER);
-        c.setLayout(new GridLayout(2, false));
-        GridData gd_c = new GridData(GridData.FILL_BOTH);
-        gd_c.grabExcessVerticalSpace = false;
-        gd_c.grabExcessHorizontalSpace = false;
-        c.setLayoutData(gd_c);
-
-        final Button disableButton = new Button(c, SWT.RADIO);
-        disableButton.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false, 2, 1));
-        disableButton.setText("No, do not monitor logcat output.");
-
-        final Button enableButton = new Button(c, SWT.RADIO);
-        enableButton.setText("Yes, monitor logcat and display logcat view if there are\n" +
-                "messages with priority higher than:");
-        enableButton.setSelection(true);
-
-        final Combo levelCombo = new Combo(c, SWT.READ_ONLY | SWT.DROP_DOWN);
-        levelCombo.setItems(LOG_PRIORITIES);
-        levelCombo.select(ERROR_PRIORITY_INDEX);
-
-        SelectionListener s = new SelectionAdapter() {
-            @Override
-            public void widgetSelected(SelectionEvent e) {
-                if (e.getSource() == enableButton) {
-                    mShouldMonitor = enableButton.getSelection();
-                    levelCombo.setEnabled(mShouldMonitor);
-                } else if (e.getSource() == levelCombo) {
-                    mMinimumLogPriority = LOG_PRIORITIES[levelCombo.getSelectionIndex()];
-                }
-            }
-        };
-
-        levelCombo.addSelectionListener(s);
-        enableButton.addSelectionListener(s);
-
-        return parent;
-    }
-
-    @Override
-    protected void createButtonsForButtonBar(Composite parent) {
-        // Only need OK button
-        createButton(parent, IDialogConstants.OK_ID, IDialogConstants.OK_LABEL,
-                true);
-    }
-
-    public boolean shouldMonitor() {
-        return mShouldMonitor;
-    }
-
-    public String getMinimumPriority() {
-        return mMinimumLogPriority;
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.ddms/src/com/android/ide/eclipse/ddms/Perspective.java b/eclipse/plugins/com.android.ide.eclipse.ddms/src/com/android/ide/eclipse/ddms/Perspective.java
deleted file mode 100644
index c98e9ca..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.ddms/src/com/android/ide/eclipse/ddms/Perspective.java
+++ /dev/null
@@ -1,89 +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.eclipse.ddms;
-
-import com.android.ide.eclipse.ddms.views.AllocTrackerView;
-import com.android.ide.eclipse.ddms.views.DeviceView;
-import com.android.ide.eclipse.ddms.views.EmulatorControlView;
-import com.android.ide.eclipse.ddms.views.FileExplorerView;
-import com.android.ide.eclipse.ddms.views.HeapView;
-import com.android.ide.eclipse.ddms.views.LogCatView;
-import com.android.ide.eclipse.ddms.views.NetworkStatisticsView;
-import com.android.ide.eclipse.ddms.views.SysInfoView;
-import com.android.ide.eclipse.ddms.views.ThreadView;
-
-import org.eclipse.ui.IFolderLayout;
-import org.eclipse.ui.IPageLayout;
-import org.eclipse.ui.IPerspectiveFactory;
-
-public class Perspective implements IPerspectiveFactory {
-
-    public static String ID = "com.android.ide.eclipse.ddms.Perspective"; //$NON-NLS-1$
-
-    @Override
-    public void createInitialLayout(IPageLayout layout) {
-        // create a default layout that looks like the stand alone DDMS.
-
-        // no editor window
-        layout.setEditorAreaVisible(false);
-
-        String editorArea = layout.getEditorArea();
-        IFolderLayout folder;
-
-        folder = layout.createFolder("logcat", IPageLayout.BOTTOM, 0.8f, //$NON-NLS-1$
-                editorArea);
-        folder.addPlaceholder(LogCatView.ID + ":*"); //$NON-NLS-1$
-        folder.addView(LogCatView.ID);
-
-        folder = layout.createFolder("devices", IPageLayout.LEFT, 0.3f, //$NON-NLS-1$
-                editorArea);
-        folder.addPlaceholder(DeviceView.ID + ":*"); //$NON-NLS-1$
-        folder.addView(DeviceView.ID);
-
-        folder = layout.createFolder("ddms-detail", IPageLayout.RIGHT, 0.5f, //$NON-NLS-1$
-                editorArea);
-        folder.addPlaceholder(ThreadView.ID + ":*"); //$NON-NLS-1$
-        folder.addView(ThreadView.ID);
-        folder.addView(HeapView.ID);
-        folder.addView(AllocTrackerView.ID);
-        folder.addView(NetworkStatisticsView.ID);
-        folder.addView(FileExplorerView.ID);
-        folder.addView(EmulatorControlView.ID);
-        folder.addView(SysInfoView.ID);
-
-        layout.addPerspectiveShortcut("org.eclipse.ui.resourcePerspective"); //$NON-NLS-1$
-        layout.addPerspectiveShortcut("org.eclipse.debug.ui.DebugPerspective"); //$NON-NLS-1$
-        layout.addPerspectiveShortcut("org.eclipse.jdt.ui.JavaPerspective"); //$NON-NLS-1$
-
-        layout.addShowViewShortcut(DeviceView.ID);
-        layout.addShowViewShortcut(FileExplorerView.ID);
-        layout.addShowViewShortcut(HeapView.ID);
-        layout.addShowViewShortcut(AllocTrackerView.ID);
-        layout.addShowViewShortcut(LogCatView.ID);
-        layout.addShowViewShortcut(ThreadView.ID);
-        layout.addShowViewShortcut(NetworkStatisticsView.ID);
-        layout.addShowViewShortcut(SysInfoView.ID);
-
-        layout.addShowViewShortcut(IPageLayout.ID_RES_NAV);
-        layout.addShowViewShortcut(IPageLayout.ID_BOOKMARKS);
-        layout.addShowViewShortcut(IPageLayout.ID_OUTLINE);
-        layout.addShowViewShortcut(IPageLayout.ID_PROP_SHEET);
-        layout.addShowViewShortcut(IPageLayout.ID_PROBLEM_VIEW);
-        layout.addShowViewShortcut(IPageLayout.ID_PROGRESS_VIEW);
-        layout.addShowViewShortcut(IPageLayout.ID_TASK_LIST);
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.ddms/src/com/android/ide/eclipse/ddms/editors/UiAutomatorViewer.java b/eclipse/plugins/com.android.ide.eclipse.ddms/src/com/android/ide/eclipse/ddms/editors/UiAutomatorViewer.java
deleted file mode 100644
index 0843018..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.ddms/src/com/android/ide/eclipse/ddms/editors/UiAutomatorViewer.java
+++ /dev/null
@@ -1,172 +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.eclipse.ddms.editors;
-
-import com.android.ide.eclipse.base.InstallDetails;
-import com.android.uiautomator.UiAutomatorHelper.UiAutomatorResult;
-import com.android.uiautomator.UiAutomatorModel;
-import com.android.uiautomator.UiAutomatorView;
-
-import org.eclipse.core.filesystem.EFS;
-import org.eclipse.core.filesystem.IFileStore;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IEditorSite;
-import org.eclipse.ui.IURIEditorInput;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.WorkbenchException;
-import org.eclipse.ui.ide.IDE;
-import org.eclipse.ui.part.EditorPart;
-
-import java.io.File;
-import java.util.concurrent.atomic.AtomicBoolean;
-
-public class UiAutomatorViewer extends EditorPart {
-    private String mFilePath;
-    private UiAutomatorView mView;
-
-    @Override
-    public void doSave(IProgressMonitor arg0) {
-    }
-
-    @Override
-    public void doSaveAs() {
-    }
-
-    @Override
-    public boolean isSaveAsAllowed() {
-        return false;
-    }
-
-    @Override
-    public boolean isDirty() {
-        return false;
-    }
-
-    @Override
-    public void init(IEditorSite site, IEditorInput input) throws PartInitException {
-        // we use a IURIEditorInput to allow opening files not within the workspace
-        if (!(input instanceof IURIEditorInput)) {
-            throw new PartInitException("UI Automator Hierarchy View: unsupported input type.");
-        }
-
-        setSite(site);
-        setInput(input);
-        mFilePath = ((IURIEditorInput) input).getURI().getPath();
-
-        // set the editor part name to be the name of the file.
-        File f = new File(mFilePath);
-        setPartName(f.getName());
-    }
-
-    @Override
-    public void createPartControl(Composite parent) {
-        Composite c = new Composite(parent, SWT.NONE);
-        c.setLayout(new GridLayout(1, false));
-        GridData gd = new GridData(GridData.FILL_BOTH);
-        c.setLayoutData(gd);
-
-        mView = new UiAutomatorView(c, SWT.BORDER);
-        mView.setLayoutData(new GridData(GridData.FILL_BOTH));
-
-        if (mFilePath == null) {
-            return;
-        }
-
-        UiAutomatorModel model = null;
-        File modelFile = new File(mFilePath);
-        try {
-            model = new UiAutomatorModel(modelFile);
-        } catch (Exception e) {
-            MessageDialog.openError(parent.getShell(), "Error opening " + mFilePath,
-                    "Unexpected error while parsing input: " + e.getMessage());
-            return;
-        }
-
-        mView.setModel(model, modelFile, null);
-    }
-
-    @Override
-    public void setFocus() {
-    }
-
-    public static boolean openEditor(final UiAutomatorResult r) {
-        final IFileStore fileStore =  EFS.getLocalFileSystem().getStore(
-                new Path(r.uiHierarchy.getAbsolutePath()));
-        if (!fileStore.fetchInfo().exists()) {
-            return false;
-        }
-
-        final AtomicBoolean status = new AtomicBoolean(false);
-
-        final IWorkbench workbench = PlatformUI.getWorkbench();
-        workbench.getDisplay().syncExec(new Runnable() {
-            @Override
-            public void run() {
-                IWorkbenchWindow window = workbench.getActiveWorkbenchWindow();
-                if (window == null) {
-                    return;
-                }
-
-                IWorkbenchPage page = window.getActivePage();
-                if (page == null) {
-                    return;
-                }
-
-                // try to switch perspectives if possible
-                if (page.isEditorAreaVisible() == false && InstallDetails.isAdtInstalled()) {
-                    try {
-                        workbench.showPerspective("org.eclipse.jdt.ui.JavaPerspective", window); //$NON-NLS-1$
-                    } catch (WorkbenchException e) {
-                    }
-                }
-
-                IEditorPart editor = null;
-                try {
-                    editor = IDE.openEditorOnFileStore(page, fileStore);
-                } catch (PartInitException e) {
-                    return;
-                }
-
-                if (!(editor instanceof UiAutomatorViewer)) {
-                    return;
-                }
-
-                ((UiAutomatorViewer) editor).setModel(r.model, r.uiHierarchy, r.screenshot);
-                status.set(true);
-            }
-        });
-
-        return status.get();
-    }
-
-    protected void setModel(UiAutomatorModel model, File modelFile, Image screenshot) {
-        mView.setModel(model, modelFile, screenshot);
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.ddms/src/com/android/ide/eclipse/ddms/i18n/Messages.java b/eclipse/plugins/com.android.ide.eclipse.ddms/src/com/android/ide/eclipse/ddms/i18n/Messages.java
deleted file mode 100644
index 576b598..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.ddms/src/com/android/ide/eclipse/ddms/i18n/Messages.java
+++ /dev/null
@@ -1,121 +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.eclipse.ddms.i18n;
-
-import org.eclipse.osgi.util.NLS;
-
-public class Messages extends NLS {
-    private static final String BUNDLE_NAME = "com.android.ide.eclipse.ddms.i18n.messages"; //$NON-NLS-1$
-    public static String DdmsPlugin_Message_Tag_Mask_1;
-    public static String DdmsPlugin_Message_Tag_Mask_2;
-    public static String DdmsPlugin_DDMS_Post_Create_Init;
-    public static String DeviceView_ADB_Error;
-    public static String DeviceView_ADB_Failed_Restart;
-    public static String DeviceView_Cause_GC;
-    public static String DeviceView_Cause_GC_Tooltip;
-    public static String DeviceView_Debug_Process;
-    public static String DeviceView_Debug_Process_Title;
-    public static String DeviceView_Debug_Process_Tooltip;
-    public static String DeviceView_Debug_Session_Failed;
-    public static String DeviceView_Dump_HPROF_File;
-    public static String DeviceView_Dump_HPROF_File_Not_Supported_By_VM;
-    public static String DeviceView_Dump_HPROF_File_Tooltip;
-    public static String DeviceView_Failed_To_Save_HPROF_Data;
-    public static String DeviceView_HPROF_Error;
-    public static String DeviceView_Process_Already_Being_Debugged;
-    public static String DeviceView_Process_Debug_Already_In_Use;
-    public static String DeviceView_Pulling_From_Device;
-    public static String DeviceView_Reset_ADB;
-    public static String DeviceView_Reset_ADB_Host_Deamon;
-    public static String DeviceView_Save_HPROF_File;
-    public static String DeviceView_Screen_Capture;
-    public static String DeviceView_Screen_Capture_Tooltip;
-    public static String DeviceView_Start_Method_Profiling;
-    public static String DeviceView_Start_Method_Profiling_Not_Suported_By_Vm;
-    public static String DeviceView_Start_Method_Profiling_Tooltip;
-    public static String DeviceView_Stop_Method_Profiling;
-    public static String DeviceView_Stop_Method_Profiling_Tooltip;
-    public static String DeviceView_Stop_Process;
-    public static String DeviceView_Stop_Process_Tooltip;
-    public static String DeviceView_Threads;
-    public static String DeviceView_Threads_Tooltip;
-    public static String DeviceView_Unable_Create_HPROF_For_Application;
-    public static String DeviceView_Unable_Download_HPROF_From_Device_One_Param_First_Message;
-    public static String DeviceView_Unable_Download_HPROF_From_Device_One_Param_Second_Message;
-    public static String DeviceView_Unable_Download_HPROF_From_Device_Two_Param;
-    public static String DeviceView_Update_Heap;
-    public static String DeviceView_Update_Heap_Tooltip;
-    public static String EventLogView_Clear_Log;
-    public static String EventLogView_Clears_Event_Log;
-    public static String EventLogView_Import_Bug_Report_Log;
-    public static String EventLogView_Imports_Bug_Report;
-    public static String EventLogView_Load_Log;
-    public static String EventLogView_Loads_Event_Log;
-    public static String EventLogView_Opens_Options_Panel;
-    public static String EventLogView_Options;
-    public static String EventLogView_Save_Log;
-    public static String EventLogView_Saves_Event_Log;
-    public static String FileExplorerView_Delete;
-    public static String FileExplorerView_Delete_The_Selection;
-    public static String FileExplorerView_Pull_File;
-    public static String FileExplorerView_Pull_File_From_File;
-    public static String FileExplorerView_Push_File;
-    public static String FileExplorerView_Push_File_Onto_Device;
-    public static String LogCatPreferencePage_Display_Font;
-    public static String LogCatPreferencePage_MaxMessages;
-    public static String LogCatPreferencePage_Switch_Perspective;
-    public static String LogCatPreferencePage_Switch_To;
-    public static String LogCatPreferencePage_AutoMonitorLogcat;
-    public static String LogCatPreferencePage_SessionFilterLogLevel;
-    public static String LogCatView_Clear_Log;
-    public static String LogCatView_Copy;
-    public static String LogCatView_Create_Filter;
-    public static String LogCatView_Create_Filter_Tooltip;
-    public static String LogCatView_Delete_Filter;
-    public static String LogCatView_Delete_Filter_Tooltip;
-    public static String LogCatView_Edit_Filter;
-    public static String LogCatView_Edit_Filter_Tooltip;
-    public static String LogCatView_Export_Selection_As_Text;
-    public static String LogCatView_Export_Selection_As_Text_Tooltip;
-    public static String LogCatView_Select_All;
-    public static String PreferencePage_ADB_Connection_Time_Out;
-    public static String PreferencePage_Adbhost_value;
-    public static String PreferencePage_Assert;
-    public static String PreferencePage_Base_Local_Debugger_Port;
-    public static String PreferencePage_Debug;
-    public static String PreferencePage_Error;
-    public static String PreferencePage_Heap_Updates_Enabled_Default;
-    public static String PreferencePage_HPROF_Action;
-    public static String PreferencePage_Info;
-    public static String PreferencePage_Logging_Level;
-    public static String PreferencePage_Open_Eclipse;
-    public static String PreferencePage_Save_Disk;
-    public static String PreferencePage_Thread_Status_Refresh_Interval;
-    public static String PreferencePage_Thread_Updates_Enabled_By_Default;
-    public static String PreferencePage_Use_Adbhost;
-    public static String PreferencePage_Verbose;
-    public static String PreferencePage_Warning;
-    public static String TableView_Copy;
-    public static String TableView_Select_All;
-    static {
-        // initialize resource bundle
-        NLS.initializeMessages(BUNDLE_NAME, Messages.class);
-    }
-
-    private Messages() {
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.ddms/src/com/android/ide/eclipse/ddms/i18n/messages.properties b/eclipse/plugins/com.android.ide.eclipse.ddms/src/com/android/ide/eclipse/ddms/i18n/messages.properties
deleted file mode 100644
index 3698ebc..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.ddms/src/com/android/ide/eclipse/ddms/i18n/messages.properties
+++ /dev/null
@@ -1,107 +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.
-#
-
-DdmsPlugin_Message_Tag_Mask_1=[%1$tF %1$tT]
-DdmsPlugin_Message_Tag_Mask_2=[%1$tF %1$tT - %2$s]
-DdmsPlugin_DDMS_Post_Create_Init=DDMS post-create init
-DeviceView_ADB_Error=Adb Error
-DeviceView_ADB_Failed_Restart=Adb failed to restart\!\n\nMake sure the plugin is properly configured.
-DeviceView_Cause_GC=Cause GC
-DeviceView_Cause_GC_Tooltip=Cause GC
-DeviceView_Debug_Process=Debug Process
-DeviceView_Debug_Process_Title=Process Debug
-DeviceView_Debug_Process_Tooltip=Debug the selected process, provided its source project is present and opened in the workspace.
-DeviceView_Debug_Session_Failed=No opened project found for %1$s. Debug session failed\!
-DeviceView_Dump_HPROF_File=Dump HPROF file
-DeviceView_Dump_HPROF_File_Not_Supported_By_VM=Dump HPROF file (not supported by this VM)
-DeviceView_Dump_HPROF_File_Tooltip=Dump HPROF file
-DeviceView_Failed_To_Save_HPROF_Data=Failed to save hprof data into temp file%1$s
-DeviceView_HPROF_Error=HPROF Error
-DeviceView_Process_Already_Being_Debugged=The process is already being debugged\!
-DeviceView_Process_Debug_Already_In_Use=The process debug port is already in use\!
-DeviceView_Pulling_From_Device=Pulling %1$s from the device
-DeviceView_Reset_ADB=Reset adb
-DeviceView_Reset_ADB_Host_Deamon=Reset the adb host daemon
-DeviceView_Save_HPROF_File=Save HPROF file
-DeviceView_Screen_Capture=Screen Capture
-DeviceView_Screen_Capture_Tooltip=Screen Capture
-DeviceView_Start_Method_Profiling=Start Method Profiling
-DeviceView_Start_Method_Profiling_Not_Suported_By_Vm=Start Method Profiling (not supported by this VM)
-DeviceView_Start_Method_Profiling_Tooltip=Start Method Profiling
-DeviceView_Stop_Method_Profiling=Stop Method Profiling
-DeviceView_Stop_Method_Profiling_Tooltip=Stop Method Profiling
-DeviceView_Stop_Process=Stop Process
-DeviceView_Stop_Process_Tooltip=Stop Process
-DeviceView_Threads=Update Threads
-DeviceView_Threads_Tooltip=Update Threads
-DeviceView_Unable_Create_HPROF_For_Application=Unable to create HPROF file for application '%1$s'.\n\n%2$s Check logcat for more information.
-DeviceView_Unable_Download_HPROF_From_Device_One_Param_First_Message=Unable to download HPROF file from device '%1$s'.
-DeviceView_Unable_Download_HPROF_From_Device_One_Param_Second_Message=Unable to download HPROF file from device '%1$s'.
-DeviceView_Unable_Download_HPROF_From_Device_Two_Param=Unable to download HPROF file from device '%1$s'.\n\n%2$s
-DeviceView_Update_Heap=Update Heap
-DeviceView_Update_Heap_Tooltip=Update Heap
-EventLogView_Clear_Log=Clear Log
-EventLogView_Clears_Event_Log=Clears the event log
-EventLogView_Import_Bug_Report_Log=Import Bug Report Log
-EventLogView_Imports_Bug_Report=Imports a bug report.
-EventLogView_Load_Log=Load Log
-EventLogView_Loads_Event_Log=Loads an event log
-EventLogView_Opens_Options_Panel=Opens the options panel
-EventLogView_Options=Options...
-EventLogView_Save_Log=Save Log
-EventLogView_Saves_Event_Log=Saves the event log
-FileExplorerView_Delete=Delete
-FileExplorerView_Delete_The_Selection=Delete the selection
-FileExplorerView_Pull_File=Pull File...
-FileExplorerView_Pull_File_From_File=Pull a file from the device
-FileExplorerView_Push_File=Push File...
-FileExplorerView_Push_File_Onto_Device=Push a file onto the device
-LogCatPreferencePage_Display_Font=Display Font:
-LogCatPreferencePage_MaxMessages=Maximum number of logcat messages to buffer:
-LogCatPreferencePage_Switch_Perspective=Switch Perspective
-LogCatPreferencePage_Switch_To=Switch to:
-LogCatPreferencePage_AutoMonitorLogcat=Monitor logcat for messages from applications in workspace
-LogCatPreferencePage_SessionFilterLogLevel=Show logcat view if message priority is atleast:
-LogCatView_Clear_Log=Clear Log
-LogCatView_Copy=Copy
-LogCatView_Create_Filter=Create Filter
-LogCatView_Create_Filter_Tooltip=Create Filter
-LogCatView_Delete_Filter=Delete Filter
-LogCatView_Delete_Filter_Tooltip=Delete Filter
-LogCatView_Edit_Filter=Edit Filter
-LogCatView_Edit_Filter_Tooltip=Edit Filter
-LogCatView_Export_Selection_As_Text=Export Selection As Text...
-LogCatView_Export_Selection_As_Text_Tooltip=Export Selection As Text...
-LogCatView_Select_All=Select All
-PreferencePage_ADB_Connection_Time_Out=ADB connection time out (ms):
-PreferencePage_Adbhost_value=ADBHOST value:
-PreferencePage_Assert=Assert
-PreferencePage_Base_Local_Debugger_Port=Base local debugger port:
-PreferencePage_Debug=Debug
-PreferencePage_Error=Error
-PreferencePage_Heap_Updates_Enabled_Default=Heap updates enabled by default
-PreferencePage_HPROF_Action=HPROF Action:
-PreferencePage_Info=Info
-PreferencePage_Logging_Level=Logging Level
-PreferencePage_Open_Eclipse=Open in Eclipse
-PreferencePage_Save_Disk=Save to disk
-PreferencePage_Thread_Status_Refresh_Interval=Thread status refresh interval (seconds):
-PreferencePage_Thread_Updates_Enabled_By_Default=Thread updates enabled by default
-PreferencePage_Use_Adbhost=Use ADBHOST
-PreferencePage_Verbose=Verbose
-PreferencePage_Warning=Warning
-TableView_Copy=Copy
-TableView_Select_All=Select All
diff --git a/eclipse/plugins/com.android.ide.eclipse.ddms/src/com/android/ide/eclipse/ddms/preferences/LogCatColorsPage.java b/eclipse/plugins/com.android.ide.eclipse.ddms/src/com/android/ide/eclipse/ddms/preferences/LogCatColorsPage.java
deleted file mode 100644
index 675a51c..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.ddms/src/com/android/ide/eclipse/ddms/preferences/LogCatColorsPage.java
+++ /dev/null
@@ -1,65 +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.eclipse.ddms.preferences;
-
-import com.android.ddmuilib.logcat.LogCatPanel;
-import com.android.ide.eclipse.ddms.DdmsPlugin;
-
-import org.eclipse.jface.preference.ColorFieldEditor;
-import org.eclipse.jface.preference.FieldEditorPreferencePage;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchPreferencePage;
-
-public class LogCatColorsPage extends FieldEditorPreferencePage
-                                            implements IWorkbenchPreferencePage {
-    public LogCatColorsPage() {
-        super(GRID);
-        setPreferenceStore(DdmsPlugin.getDefault().getPreferenceStore());
-    }
-
-    @Override
-    public void init(IWorkbench workbench) {
-    }
-
-    @Override
-    protected void createFieldEditors() {
-        // colors preference for different log levels
-        ColorFieldEditor cfe = new ColorFieldEditor(LogCatPanel.VERBOSE_COLOR_PREFKEY,
-                "Verbose Log Message Color", getFieldEditorParent());
-        addField(cfe);
-
-        cfe = new ColorFieldEditor(LogCatPanel.DEBUG_COLOR_PREFKEY, "Debug Log Message Color",
-                getFieldEditorParent());
-        addField(cfe);
-
-        cfe = new ColorFieldEditor(LogCatPanel.INFO_COLOR_PREFKEY, "Info Log Message Color",
-                getFieldEditorParent());
-        addField(cfe);
-
-        cfe = new ColorFieldEditor(LogCatPanel.WARN_COLOR_PREFKEY, "Warning Log Message Color",
-                getFieldEditorParent());
-        addField(cfe);
-
-        cfe = new ColorFieldEditor(LogCatPanel.ERROR_COLOR_PREFKEY, "Error Log Message Color",
-                getFieldEditorParent());
-        addField(cfe);
-
-        cfe = new ColorFieldEditor(LogCatPanel.ASSERT_COLOR_PREFKEY, "Assert Log Message Color",
-                getFieldEditorParent());
-        addField(cfe);
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.ddms/src/com/android/ide/eclipse/ddms/preferences/LogCatPreferencePage.java b/eclipse/plugins/com.android.ide.eclipse.ddms/src/com/android/ide/eclipse/ddms/preferences/LogCatPreferencePage.java
deleted file mode 100644
index aa88eec..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.ddms/src/com/android/ide/eclipse/ddms/preferences/LogCatPreferencePage.java
+++ /dev/null
@@ -1,159 +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.eclipse.ddms.preferences;
-
-import com.android.ddmlib.Log.LogLevel;
-import com.android.ddmuilib.logcat.LogCatMessageList;
-import com.android.ddmuilib.logcat.LogCatPanel;
-import com.android.ide.eclipse.base.InstallDetails;
-import com.android.ide.eclipse.ddms.DdmsPlugin;
-import com.android.ide.eclipse.ddms.LogCatMonitor;
-import com.android.ide.eclipse.ddms.i18n.Messages;
-
-import org.eclipse.jface.preference.BooleanFieldEditor;
-import org.eclipse.jface.preference.ComboFieldEditor;
-import org.eclipse.jface.preference.FieldEditorPreferencePage;
-import org.eclipse.jface.preference.FontFieldEditor;
-import org.eclipse.jface.preference.IntegerFieldEditor;
-import org.eclipse.jface.util.PropertyChangeEvent;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.ui.IPerspectiveDescriptor;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchPreferencePage;
-import org.eclipse.ui.PlatformUI;
-
-/**
- * Preference Pane for LogCat.
- */
-public class LogCatPreferencePage extends FieldEditorPreferencePage implements
-        IWorkbenchPreferencePage {
-    private BooleanFieldEditor mSwitchPerspective;
-    private ComboFieldEditor mWhichPerspective;
-    private IntegerFieldEditor mMaxMessages;
-    private BooleanFieldEditor mAutoMonitorLogcat;
-    private ComboFieldEditor mAutoMonitorLogcatLevel;
-    private BooleanFieldEditor mAutoScrollLock;
-
-    public LogCatPreferencePage() {
-        super(GRID);
-        setPreferenceStore(DdmsPlugin.getDefault().getPreferenceStore());
-    }
-
-    @Override
-    protected void createFieldEditors() {
-        FontFieldEditor ffe = new FontFieldEditor(LogCatPanel.LOGCAT_VIEW_FONT_PREFKEY,
-                Messages.LogCatPreferencePage_Display_Font, getFieldEditorParent());
-        addField(ffe);
-
-        mMaxMessages = new IntegerFieldEditor(
-                LogCatMessageList.MAX_MESSAGES_PREFKEY,
-                Messages.LogCatPreferencePage_MaxMessages, getFieldEditorParent());
-        addField(mMaxMessages);
-
-        mAutoScrollLock = new BooleanFieldEditor(LogCatPanel.AUTO_SCROLL_LOCK_PREFKEY,
-                "Automatically enable/disable scroll lock based on the scrollbar position",
-                getFieldEditorParent());
-        addField(mAutoScrollLock);
-
-        createHorizontalSeparator();
-
-        if (InstallDetails.isAdtInstalled()) {
-            createAdtSpecificFieldEditors();
-        }
-    }
-
-    private void createHorizontalSeparator() {
-        Label l = new Label(getFieldEditorParent(), SWT.SEPARATOR | SWT.HORIZONTAL);
-        GridData gd = new GridData(GridData.FILL_HORIZONTAL);
-        gd.horizontalSpan = 3;
-        l.setLayoutData(gd);
-    }
-
-    private void createAdtSpecificFieldEditors() {
-        mSwitchPerspective = new BooleanFieldEditor(PreferenceInitializer.ATTR_SWITCH_PERSPECTIVE,
-                Messages.LogCatPreferencePage_Switch_Perspective, getFieldEditorParent());
-        addField(mSwitchPerspective);
-        IPerspectiveDescriptor[] perspectiveDescriptors =
-                PlatformUI.getWorkbench().getPerspectiveRegistry().getPerspectives();
-        String[][] perspectives = new String[0][0];
-        if (perspectiveDescriptors.length > 0) {
-            perspectives = new String[perspectiveDescriptors.length][2];
-            for (int i = 0; i < perspectiveDescriptors.length; i++) {
-                IPerspectiveDescriptor perspective = perspectiveDescriptors[i];
-                perspectives[i][0] = perspective.getLabel();
-                perspectives[i][1] = perspective.getId();
-            }
-        }
-        mWhichPerspective = new ComboFieldEditor(PreferenceInitializer.ATTR_PERSPECTIVE_ID,
-                Messages.LogCatPreferencePage_Switch_To, perspectives, getFieldEditorParent());
-        mWhichPerspective.setEnabled(getPreferenceStore()
-                .getBoolean(PreferenceInitializer.ATTR_SWITCH_PERSPECTIVE), getFieldEditorParent());
-        addField(mWhichPerspective);
-
-        createHorizontalSeparator();
-
-        mAutoMonitorLogcat = new BooleanFieldEditor(LogCatMonitor.AUTO_MONITOR_PREFKEY,
-                Messages.LogCatPreferencePage_AutoMonitorLogcat,
-                getFieldEditorParent());
-        addField(mAutoMonitorLogcat);
-
-        mAutoMonitorLogcatLevel = new ComboFieldEditor(LogCatMonitor.AUTO_MONITOR_LOGLEVEL,
-                Messages.LogCatPreferencePage_SessionFilterLogLevel,
-                new String[][] {
-                    { LogLevel.VERBOSE.toString(), LogLevel.VERBOSE.getStringValue() },
-                    { LogLevel.DEBUG.toString(), LogLevel.DEBUG.getStringValue() },
-                    { LogLevel.INFO.toString(), LogLevel.INFO.getStringValue() },
-                    { LogLevel.WARN.toString(), LogLevel.WARN.getStringValue() },
-                    { LogLevel.ERROR.toString(), LogLevel.ERROR.getStringValue() },
-                    { LogLevel.ASSERT.toString(), LogLevel.ASSERT.getStringValue() },
-                },
-                getFieldEditorParent());
-        mAutoMonitorLogcatLevel.setEnabled(
-                getPreferenceStore().getBoolean(LogCatMonitor.AUTO_MONITOR_PREFKEY),
-                getFieldEditorParent());
-        addField(mAutoMonitorLogcatLevel);
-    }
-
-    @Override
-    public void init(IWorkbench workbench) {
-    }
-
-    @Override
-    public void propertyChange(PropertyChangeEvent event) {
-        if (event.getSource().equals(mSwitchPerspective)) {
-            mWhichPerspective.setEnabled(mSwitchPerspective.getBooleanValue(),
-                    getFieldEditorParent());
-        } else if (event.getSource().equals(mAutoMonitorLogcat)) {
-            mAutoMonitorLogcatLevel.setEnabled(mAutoMonitorLogcat.getBooleanValue(),
-                    getFieldEditorParent());
-        }
-    }
-
-    @Override
-    protected void performDefaults() {
-        super.performDefaults();
-        mWhichPerspective.setEnabled(mSwitchPerspective.getBooleanValue(), getFieldEditorParent());
-
-        mMaxMessages.setStringValue(
-                Integer.toString(LogCatMessageList.MAX_MESSAGES_DEFAULT));
-
-        mAutoMonitorLogcatLevel.setEnabled(mAutoMonitorLogcat.getBooleanValue(),
-                getFieldEditorParent());
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.ddms/src/com/android/ide/eclipse/ddms/preferences/PreferenceInitializer.java b/eclipse/plugins/com.android.ide.eclipse.ddms/src/com/android/ide/eclipse/ddms/preferences/PreferenceInitializer.java
deleted file mode 100644
index 254b2c5..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.ddms/src/com/android/ide/eclipse/ddms/preferences/PreferenceInitializer.java
+++ /dev/null
@@ -1,155 +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.eclipse.ddms.preferences;
-
-import com.android.ddmlib.DdmPreferences;
-import com.android.ddmlib.Log.LogLevel;
-import com.android.ddmuilib.DdmUiPreferences;
-import com.android.ide.eclipse.ddms.DdmsPlugin;
-import com.android.ide.eclipse.ddms.LogCatMonitor;
-import com.android.ide.eclipse.ddms.views.DeviceView.HProfHandler;
-import com.android.ide.eclipse.ddms.views.LogCatView;
-
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.core.runtime.content.IContentType;
-import org.eclipse.core.runtime.preferences.AbstractPreferenceInitializer;
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.FontData;
-
-/**
- * Class used to initialize default preference values.
- */
-public class PreferenceInitializer extends AbstractPreferenceInitializer {
-
-    public final static String ATTR_LOG_LEVEL =
-        DdmsPlugin.PLUGIN_ID + ".logLevel"; //$NON-NLS-1$
-
-    public final static String ATTR_DEBUG_PORT_BASE =
-        DdmsPlugin.PLUGIN_ID + ".adbDebugBasePort"; //$NON-NLS-1$
-
-    public final static String ATTR_SELECTED_DEBUG_PORT =
-        DdmsPlugin.PLUGIN_ID + ".debugSelectedPort"; //$NON-NLS-1$
-
-    public final static String ATTR_DEFAULT_THREAD_UPDATE =
-        DdmsPlugin.PLUGIN_ID + ".defaultThreadUpdateEnabled"; //$NON-NLS-1$
-
-    public final static String ATTR_DEFAULT_HEAP_UPDATE =
-        DdmsPlugin.PLUGIN_ID + ".defaultHeapUpdateEnabled"; //$NON-NLS-1$
-
-    public final static String ATTR_THREAD_INTERVAL =
-        DdmsPlugin.PLUGIN_ID + ".threadStatusInterval"; //$NON-NLS-1$
-
-    public final static String ATTR_IMAGE_SAVE_DIR =
-        DdmsPlugin.PLUGIN_ID + ".imageSaveDir"; //$NON-NLS-1$
-
-    public final static String ATTR_LAST_IMAGE_SAVE_DIR =
-        DdmsPlugin.PLUGIN_ID + ".lastImageSaveDir"; //$NON-NLS-1$
-
-    public final static String ATTR_LOGCAT_FONT =
-        DdmsPlugin.PLUGIN_ID + ".logcatFont"; //$NON-NLS-1$
-
-    public final static String ATTR_HPROF_ACTION =
-        DdmsPlugin.PLUGIN_ID + ".hprofAction"; //$NON-NLS-1$
-
-    public final static String ATTR_TIME_OUT =
-        DdmsPlugin.PLUGIN_ID + ".timeOut"; //$NON-NLS-1$
-
-    public final static String ATTR_USE_ADBHOST =
-        DdmsPlugin.PLUGIN_ID + ".useAdbHost"; //$NON-NLS-1$
-
-    public final static String ATTR_ADBHOST_VALUE =
-        DdmsPlugin.PLUGIN_ID + ".adbHostValue"; //$NON-NLS-1$
-
-    public final static String ATTR_SWITCH_PERSPECTIVE =
-        DdmsPlugin.PLUGIN_ID + ".switchPerspective"; //$NON-NLS-1$
-
-    public final static String ATTR_PERSPECTIVE_ID =
-        DdmsPlugin.PLUGIN_ID + ".perspectiveId"; //$NON-NLS-1$
-
-    public static final String ATTR_PROFILER_BUFSIZE_MB =
-        DdmsPlugin.PLUGIN_ID + ".profilerBufferSizeMb"; //$NON-NLS-1$
-
-    /*
-     * (non-Javadoc)
-     *
-     * @see org.eclipse.core.runtime.preferences.AbstractPreferenceInitializer
-     * #initializeDefaultPreferences()
-     */
-    @Override
-    public void initializeDefaultPreferences() {
-        IPreferenceStore store = DdmsPlugin.getDefault().getPreferenceStore();
-
-        store.setDefault(ATTR_DEBUG_PORT_BASE, DdmPreferences.DEFAULT_DEBUG_PORT_BASE);
-
-        store.setDefault(ATTR_SELECTED_DEBUG_PORT, DdmPreferences.DEFAULT_SELECTED_DEBUG_PORT);
-
-        store.setDefault(ATTR_DEFAULT_THREAD_UPDATE, DdmPreferences.DEFAULT_INITIAL_THREAD_UPDATE);
-        store.setDefault(ATTR_DEFAULT_HEAP_UPDATE,
-                DdmPreferences.DEFAULT_INITIAL_HEAP_UPDATE);
-
-        store.setDefault(ATTR_PROFILER_BUFSIZE_MB, DdmPreferences.DEFAULT_PROFILER_BUFFER_SIZE_MB);
-
-        store.setDefault(ATTR_THREAD_INTERVAL, DdmUiPreferences.DEFAULT_THREAD_REFRESH_INTERVAL);
-
-        String homeDir = System.getProperty("user.home"); //$NON-NLS-1$
-        store.setDefault(ATTR_IMAGE_SAVE_DIR, homeDir);
-
-        store.setDefault(ATTR_LOG_LEVEL, DdmPreferences.DEFAULT_LOG_LEVEL.getStringValue());
-
-        store.setDefault(ATTR_LOGCAT_FONT,
-                new FontData("Courier", 10, SWT.NORMAL).toString()); //$NON-NLS-1$
-
-        // When obtaining hprof files from the device, default to opening the file
-        // only if there is a registered content type for the hprof extension.
-        store.setDefault(ATTR_HPROF_ACTION, HProfHandler.ACTION_SAVE);
-        for (IContentType contentType: Platform.getContentTypeManager().getAllContentTypes()) {
-            if (contentType.isAssociatedWith(HProfHandler.DOT_HPROF)) {
-                store.setDefault(ATTR_HPROF_ACTION, HProfHandler.ACTION_OPEN);
-                break;
-            }
-        }
-
-        store.setDefault(ATTR_TIME_OUT, DdmPreferences.DEFAULT_TIMEOUT);
-
-        store.setDefault(ATTR_USE_ADBHOST, DdmPreferences.DEFAULT_USE_ADBHOST);
-        store.setDefault(ATTR_ADBHOST_VALUE, DdmPreferences.DEFAULT_ADBHOST_VALUE);
-        store.setDefault(ATTR_SWITCH_PERSPECTIVE, LogCatView.DEFAULT_SWITCH_PERSPECTIVE);
-        store.setDefault(ATTR_PERSPECTIVE_ID, LogCatView.DEFAULT_PERSPECTIVE_ID);
-
-        store.setDefault(LogCatMonitor.AUTO_MONITOR_PREFKEY, true);
-        store.setDefault(LogCatMonitor.AUTO_MONITOR_LOGLEVEL, LogLevel.VERBOSE.getStringValue());
-    }
-
-    /**
-     * Initializes the preferences of ddmlib and ddmuilib with values from the eclipse store.
-     */
-    public synchronized static void setupPreferences() {
-        IPreferenceStore store = DdmsPlugin.getDefault().getPreferenceStore();
-
-        DdmPreferences.setDebugPortBase(store.getInt(ATTR_DEBUG_PORT_BASE));
-        DdmPreferences.setSelectedDebugPort(store.getInt(ATTR_SELECTED_DEBUG_PORT));
-        DdmPreferences.setLogLevel(store.getString(ATTR_LOG_LEVEL));
-        DdmPreferences.setInitialThreadUpdate(store.getBoolean(ATTR_DEFAULT_THREAD_UPDATE));
-        DdmPreferences.setInitialHeapUpdate(store.getBoolean(ATTR_DEFAULT_HEAP_UPDATE));
-        DdmPreferences.setProfilerBufferSizeMb(store.getInt(ATTR_PROFILER_BUFSIZE_MB));
-        DdmUiPreferences.setThreadRefreshInterval(store.getInt(ATTR_THREAD_INTERVAL));
-        DdmPreferences.setTimeOut(store.getInt(ATTR_TIME_OUT));
-        DdmPreferences.setUseAdbHost(store.getBoolean(ATTR_USE_ADBHOST));
-        DdmPreferences.setAdbHostValue(store.getString(ATTR_ADBHOST_VALUE));
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.ddms/src/com/android/ide/eclipse/ddms/preferences/PreferencePage.java b/eclipse/plugins/com.android.ide.eclipse.ddms/src/com/android/ide/eclipse/ddms/preferences/PreferencePage.java
deleted file mode 100644
index 56af601..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.ddms/src/com/android/ide/eclipse/ddms/preferences/PreferencePage.java
+++ /dev/null
@@ -1,152 +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.eclipse.ddms.preferences;
-
-import com.android.ddmlib.DdmPreferences;
-import com.android.ddmlib.Log.LogLevel;
-import com.android.ide.eclipse.base.InstallDetails;
-import com.android.ide.eclipse.ddms.DdmsPlugin;
-import com.android.ide.eclipse.ddms.i18n.Messages;
-import com.android.ide.eclipse.ddms.views.DeviceView.HProfHandler;
-
-import org.eclipse.jface.preference.BooleanFieldEditor;
-import org.eclipse.jface.preference.ComboFieldEditor;
-import org.eclipse.jface.preference.FieldEditorPreferencePage;
-import org.eclipse.jface.preference.IntegerFieldEditor;
-import org.eclipse.jface.preference.RadioGroupFieldEditor;
-import org.eclipse.jface.preference.StringFieldEditor;
-import org.eclipse.jface.util.PropertyChangeEvent;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchPreferencePage;
-
-public class PreferencePage extends FieldEditorPreferencePage implements
-        IWorkbenchPreferencePage {
-
-    private BooleanFieldEditor mUseAdbHost;
-    private StringFieldEditor mAdbHostValue;
-    private IntegerFieldEditor mProfilerBufsize;
-
-    public PreferencePage() {
-        super(GRID);
-        setPreferenceStore(DdmsPlugin.getDefault().getPreferenceStore());
-    }
-
-    /**
-     * Creates the field editors. Field editors are abstractions of the common
-     * GUI blocks needed to manipulate various types of preferences. Each field
-     * editor knows how to save and restore itself.
-     */
-    @Override
-    public void createFieldEditors() {
-        IntegerFieldEditor ife;
-
-        ife = new IntegerFieldEditor(PreferenceInitializer.ATTR_DEBUG_PORT_BASE,
-                Messages.PreferencePage_Base_Local_Debugger_Port, getFieldEditorParent());
-        ife.setValidRange(1024, 32767);
-        addField(ife);
-
-        BooleanFieldEditor bfe;
-
-        bfe = new BooleanFieldEditor(PreferenceInitializer.ATTR_DEFAULT_THREAD_UPDATE,
-                Messages.PreferencePage_Thread_Updates_Enabled_By_Default, getFieldEditorParent());
-        addField(bfe);
-
-        bfe = new BooleanFieldEditor(PreferenceInitializer.ATTR_DEFAULT_HEAP_UPDATE,
-                Messages.PreferencePage_Heap_Updates_Enabled_Default, getFieldEditorParent());
-        addField(bfe);
-
-        ife = new IntegerFieldEditor(PreferenceInitializer.ATTR_THREAD_INTERVAL,
-                Messages.PreferencePage_Thread_Status_Refresh_Interval, getFieldEditorParent());
-        ife.setValidRange(1, 60);
-        addField(ife);
-
-        if (InstallDetails.isAdtInstalled()) {
-            ComboFieldEditor cfe = new ComboFieldEditor(PreferenceInitializer.ATTR_HPROF_ACTION,
-                    Messages.PreferencePage_HPROF_Action, new String[][] {
-                    {
-                        Messages.PreferencePage_Save_Disk, HProfHandler.ACTION_SAVE
-                    },
-                    {
-                        Messages.PreferencePage_Open_Eclipse, HProfHandler.ACTION_OPEN
-                    },
-            }, getFieldEditorParent());
-            addField(cfe);
-        }
-
-        mProfilerBufsize = new IntegerFieldEditor(PreferenceInitializer.ATTR_PROFILER_BUFSIZE_MB,
-                "Method Profiler buffer size (MB):",
-                getFieldEditorParent());
-        addField(mProfilerBufsize);
-
-        ife = new IntegerFieldEditor(PreferenceInitializer.ATTR_TIME_OUT,
-                Messages.PreferencePage_ADB_Connection_Time_Out, getFieldEditorParent());
-        addField(ife);
-
-        RadioGroupFieldEditor rgfe = new RadioGroupFieldEditor(
-                PreferenceInitializer.ATTR_LOG_LEVEL,
-                Messages.PreferencePage_Logging_Level, 1, new String[][] {
-                        {
-                                Messages.PreferencePage_Verbose, LogLevel.VERBOSE.getStringValue()
-                        },
-                        {
-                                Messages.PreferencePage_Debug, LogLevel.DEBUG.getStringValue()
-                        },
-                        {
-                                Messages.PreferencePage_Info, LogLevel.INFO.getStringValue()
-                        },
-                        {
-                                Messages.PreferencePage_Warning, LogLevel.WARN.getStringValue()
-                        },
-                        {
-                                Messages.PreferencePage_Error, LogLevel.ERROR.getStringValue()
-                        },
-                        {
-                                Messages.PreferencePage_Assert, LogLevel.ASSERT.getStringValue()
-                        }
-                    },
-                getFieldEditorParent(), true);
-        addField(rgfe);
-        mUseAdbHost = new BooleanFieldEditor(PreferenceInitializer.ATTR_USE_ADBHOST,
-                Messages.PreferencePage_Use_Adbhost, getFieldEditorParent());
-        addField(mUseAdbHost);
-        mAdbHostValue = new StringFieldEditor(PreferenceInitializer.ATTR_ADBHOST_VALUE,
-                Messages.PreferencePage_Adbhost_value, getFieldEditorParent());
-        mAdbHostValue.setEnabled(getPreferenceStore()
-                .getBoolean(PreferenceInitializer.ATTR_USE_ADBHOST), getFieldEditorParent());
-        addField(mAdbHostValue);
-    }
-
-    @Override
-    public void init(IWorkbench workbench) {
-    }
-
-    @Override
-    public void propertyChange(PropertyChangeEvent event) {
-        if (event.getSource().equals(mUseAdbHost)) {
-            mAdbHostValue.setEnabled(mUseAdbHost.getBooleanValue(), getFieldEditorParent());
-        } else if (event.getSource().equals(mProfilerBufsize)) {
-            DdmPreferences.setProfilerBufferSizeMb(mProfilerBufsize.getIntValue());
-        }
-        super.propertyChange(event);
-    }
-
-    @Override
-    protected void performDefaults() {
-        super.performDefaults();
-        mAdbHostValue.setEnabled(mUseAdbHost.getBooleanValue(), getFieldEditorParent());
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.ddms/src/com/android/ide/eclipse/ddms/systrace/ISystraceOptions.java b/eclipse/plugins/com.android.ide.eclipse.ddms/src/com/android/ide/eclipse/ddms/systrace/ISystraceOptions.java
deleted file mode 100644
index f0e0804..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.ddms/src/com/android/ide/eclipse/ddms/systrace/ISystraceOptions.java
+++ /dev/null
@@ -1,25 +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.eclipse.ddms.systrace;
-
-public interface ISystraceOptions {
-    /** Get tags to enable, returns null if no tags need to be enabled. */
-    String getTags();
-
-    /** Get the command line options to atrace. */
-    String getOptions();
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.ddms/src/com/android/ide/eclipse/ddms/systrace/ISystraceOptionsDialog.java b/eclipse/plugins/com.android.ide.eclipse.ddms/src/com/android/ide/eclipse/ddms/systrace/ISystraceOptionsDialog.java
deleted file mode 100644
index 4cc0faa..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.ddms/src/com/android/ide/eclipse/ddms/systrace/ISystraceOptionsDialog.java
+++ /dev/null
@@ -1,23 +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.eclipse.ddms.systrace;
-
-public interface ISystraceOptionsDialog {
-    ISystraceOptions getSystraceOptions();
-    String getTraceFilePath();
-    int open();
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.ddms/src/com/android/ide/eclipse/ddms/systrace/SystraceOptionsDialogV1.java b/eclipse/plugins/com.android.ide.eclipse.ddms/src/com/android/ide/eclipse/ddms/systrace/SystraceOptionsDialogV1.java
deleted file mode 100644
index b462ada..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.ddms/src/com/android/ide/eclipse/ddms/systrace/SystraceOptionsDialogV1.java
+++ /dev/null
@@ -1,445 +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.eclipse.ddms.systrace;
-
-import org.eclipse.jface.dialogs.TitleAreaDialog;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.FileDialog;
-import org.eclipse.swt.widgets.Group;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Text;
-
-import java.io.File;
-
-public class SystraceOptionsDialogV1 extends TitleAreaDialog implements ISystraceOptionsDialog {
-    private static final String TITLE = "Android System Trace";
-    private static final String DEFAULT_MESSAGE =
-            "Settings to use while capturing system level trace";
-    private static final String DEFAULT_TRACE_FNAME = "trace.html"; //$NON-NLS-1$
-
-    private Text mDestinationText;
-    private String mDestinationPath;
-    private Text mTraceDurationText;
-    private Text mTraceBufferSizeText;
-
-    private static String sSaveToFolder = System.getProperty("user.home"); //$NON-NLS-1$
-    private static String sTraceDuration = "";
-    private static String sTraceBufferSize = "";
-
-    private Button mTraceCpuFreqBtn;
-    private Button mTraceCpuIdleBtn;
-    private Button mTraceCpuLoadBtn;
-    private Button mTraceDiskIoBtn;
-    private Button mTraceKernelWorkqueuesBtn;
-    private Button mTraceCpuSchedulerBtn;
-
-    private static boolean sTraceCpuFreq;
-    private static boolean sTraceCpuIdle;
-    private static boolean sTraceCpuLoad;
-    private static boolean sTraceDiskIo;
-    private static boolean sTraceKernelWorkqueues;
-    private static boolean sTraceCpuScheduler;
-
-    private Button mGfxTagBtn;
-    private Button mInputTagBtn;
-    private Button mViewTagBtn;
-    private Button mWebViewTagBtn;
-    private Button mWmTagBtn;
-    private Button mAmTagBtn;
-    private Button mSyncTagBtn;
-    private Button mAudioTagBtn;
-    private Button mVideoTagBtn;
-    private Button mCameraTagBtn;
-
-    private static boolean sGfxTag;
-    private static boolean sInputTag;
-    private static boolean sViewTag;
-    private static boolean sWebViewTag;
-    private static boolean sWmTag;
-    private static boolean sAmTag;
-    private static boolean sSyncTag;
-    private static boolean sAudioTag;
-    private static boolean sVideoTag;
-    private static boolean sCameraTag;
-
-    private final SystraceOptions mOptions = new SystraceOptions();
-
-    public SystraceOptionsDialogV1(Shell parentShell) {
-        super(parentShell);
-    }
-
-    @Override
-    protected Control createDialogArea(Composite parent) {
-        setTitle(TITLE);
-        setMessage(DEFAULT_MESSAGE);
-
-        Composite c = new Composite(parent, SWT.BORDER);
-        c.setLayout(new GridLayout(3, false));
-        c.setLayoutData(new GridData(GridData.FILL_BOTH));
-
-        Label l = new Label(c, SWT.NONE);
-        l.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1));
-        l.setText("Destination File: ");
-
-        mDestinationText = new Text(c, SWT.BORDER);
-        mDestinationText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
-        mDestinationText.setText(sSaveToFolder + File.separator + DEFAULT_TRACE_FNAME);
-
-        final Button browse = new Button(c, SWT.NONE);
-        browse.setText("Browse...");
-        browse.addSelectionListener(new SelectionAdapter() {
-            @Override
-            public void widgetSelected(SelectionEvent e) {
-                String path = openBrowseDialog(browse.getShell());
-                if (path != null) mDestinationText.setText(path);
-            }
-        });
-
-        Label lblTraceDurationseconds = new Label(c, SWT.NONE);
-        lblTraceDurationseconds.setLayoutData(
-                new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1));
-        lblTraceDurationseconds.setText("Trace duration (seconds): ");
-
-        mTraceDurationText = new Text(c, SWT.BORDER);
-        mTraceDurationText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 2, 1));
-        mTraceDurationText.setText(sTraceDuration);
-
-        Label lblTraceBufferSize = new Label(c, SWT.NONE);
-        lblTraceBufferSize.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1));
-        lblTraceBufferSize.setText("Trace Buffer Size (kb): ");
-
-        mTraceBufferSizeText = new Text(c, SWT.BORDER);
-        mTraceBufferSizeText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 2, 1));
-        mTraceBufferSizeText.setText(sTraceBufferSize);
-
-        Label separator = new Label(c, SWT.SEPARATOR | SWT.HORIZONTAL);
-        GridData gd = new GridData(GridData.FILL_HORIZONTAL);
-        gd.horizontalSpan = 3;
-        separator.setLayoutData(gd);
-
-        Group grpTraceEvents = new Group(c, SWT.BORDER);
-        grpTraceEvents.setLayout(new GridLayout(3, false));
-        grpTraceEvents.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, true, false, 2, 1));
-        grpTraceEvents.setText("Trace Events");
-
-        mTraceCpuFreqBtn = new Button(grpTraceEvents, SWT.CHECK);
-        mTraceCpuFreqBtn.setText("CPU Frequency Changes");
-        mTraceCpuFreqBtn.setSelection(sTraceCpuFreq);
-
-        mTraceCpuIdleBtn = new Button(grpTraceEvents, SWT.CHECK);
-        mTraceCpuIdleBtn.setText("CPU Idle Events");
-        mTraceCpuIdleBtn.setSelection(sTraceCpuIdle);
-
-        mTraceCpuLoadBtn = new Button(grpTraceEvents, SWT.CHECK);
-        mTraceCpuLoadBtn.setText("CPU Load");
-        mTraceCpuLoadBtn.setSelection(sTraceCpuLoad);
-
-        mTraceCpuSchedulerBtn = new Button(grpTraceEvents, SWT.CHECK);
-        mTraceCpuSchedulerBtn.setText("CPU Scheduler");
-        mTraceCpuSchedulerBtn.setSelection(sTraceCpuScheduler);
-
-        Group grpTraceRootEvents = new Group(c, SWT.BORDER);
-        grpTraceRootEvents.setLayout(new GridLayout(2, false));
-        grpTraceRootEvents.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, true, false, 2, 1));
-        grpTraceRootEvents.setText("Trace Events that require root privileges on device");
-
-        mTraceDiskIoBtn = new Button(grpTraceRootEvents, SWT.CHECK);
-        mTraceDiskIoBtn.setText("Disk I/O");
-        mTraceDiskIoBtn.setSelection(sTraceDiskIo);
-
-        mTraceKernelWorkqueuesBtn = new Button(grpTraceRootEvents, SWT.CHECK);
-        mTraceKernelWorkqueuesBtn.setText("Kernel Workqueues (requires root)");
-        mTraceKernelWorkqueuesBtn.setSelection(sTraceKernelWorkqueues);
-
-        Group grpTraceTags = new Group(c, SWT.BORDER);
-        grpTraceTags.setLayout(new GridLayout(5, false));
-        grpTraceTags.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, true, false, 3, 1));
-        grpTraceTags.setText("Trace Tags");
-
-        mGfxTagBtn = new Button(grpTraceTags, SWT.CHECK);
-        mGfxTagBtn.setText("gfx");
-        mGfxTagBtn.setSelection(sGfxTag);
-
-        mInputTagBtn = new Button(grpTraceTags, SWT.CHECK);
-        mInputTagBtn.setText("input");
-        mInputTagBtn.setSelection(sInputTag);
-
-        mViewTagBtn = new Button(grpTraceTags, SWT.CHECK);
-        mViewTagBtn.setText("view");
-        mViewTagBtn.setSelection(sViewTag);
-
-        mWebViewTagBtn = new Button(grpTraceTags, SWT.CHECK);
-        mWebViewTagBtn.setText("webview");
-        mWebViewTagBtn.setSelection(sWebViewTag);
-
-        mWmTagBtn = new Button(grpTraceTags, SWT.CHECK);
-        mWmTagBtn.setText("wm");
-        mWmTagBtn.setSelection(sWmTag);
-
-        mAmTagBtn = new Button(grpTraceTags, SWT.CHECK);
-        mAmTagBtn.setText("am");
-        mAmTagBtn.setSelection(sAmTag);
-
-        mSyncTagBtn = new Button(grpTraceTags, SWT.CHECK);
-        mSyncTagBtn.setText("sync");
-        mSyncTagBtn.setSelection(sSyncTag);
-
-        mAudioTagBtn = new Button(grpTraceTags, SWT.CHECK);
-        mAudioTagBtn.setText("audio");
-        mAudioTagBtn.setSelection(sAudioTag);
-
-        mVideoTagBtn = new Button(grpTraceTags, SWT.CHECK);
-        mVideoTagBtn.setText("video");
-        mVideoTagBtn.setSelection(sVideoTag);
-
-        mCameraTagBtn = new Button(grpTraceTags, SWT.CHECK);
-        mCameraTagBtn.setText("camera");
-        mCameraTagBtn.setSelection(sCameraTag);
-
-        Label lblTraceTagsWarning = new Label(grpTraceTags, SWT.NONE);
-        lblTraceTagsWarning.setText(
-                "Changes to trace tags will likely need a restart of the Android framework to take effect:\n"
-                + "    $ adb shell stop\n"
-                + "    $ adb shell start");
-        lblTraceTagsWarning.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, true, false, 5, 1));
-
-        ModifyListener m = new ModifyListener() {
-            @Override
-            public void modifyText(ModifyEvent e) {
-                validateFields();
-            }
-        };
-
-        mDestinationText.addModifyListener(m);
-        mTraceBufferSizeText.addModifyListener(m);
-        mTraceDurationText.addModifyListener(m);
-
-        return c;
-    }
-
-    private void validateFields() {
-        // validate trace destination path
-        String msg = validatePath(mDestinationText.getText());
-        if (msg != null) {
-            setErrorMessage(msg);
-            getButton(OK).setEnabled(false);
-            return;
-        }
-
-        // validate the trace duration
-        if (!validateInteger(mTraceDurationText.getText())) {
-            setErrorMessage("Trace Duration should be a valid integer (seconds)");
-            getButton(OK).setEnabled(false);
-            return;
-        }
-
-        // validate the trace buffer size
-        if (!validateInteger(mTraceBufferSizeText.getText())) {
-            setErrorMessage("Trace Buffer Size should be a valid integer (kilobytes)");
-            getButton(OK).setEnabled(false);
-            return;
-        }
-
-        getButton(OK).setEnabled(true);
-        setErrorMessage(null);
-    }
-
-    private boolean validateInteger(String text) {
-        if (text == null || text.isEmpty()) {
-            return true;
-        }
-
-        try {
-            Integer.parseInt(text);
-            return true;
-        } catch (NumberFormatException e) {
-            return false;
-        }
-    }
-
-    private String validatePath(String path) {
-        if (path == null || path.isEmpty()) {
-            return null;
-        }
-
-        File f = new File(path);
-        if (f.isDirectory()) {
-            return String.format("The path '%s' points to a folder", path);
-        }
-
-        if (!f.exists()) { // if such a file doesn't exist, make sure the parent folder is valid
-            if (!f.getParentFile().isDirectory()) {
-                return String.format("That path '%s' is not a valid folder.", f.getParent());
-            }
-        }
-
-        return null;
-    }
-
-    private String openBrowseDialog(Shell parentShell) {
-        FileDialog fd = new FileDialog(parentShell, SWT.SAVE);
-
-        fd.setText("Save To");
-        fd.setFileName(DEFAULT_TRACE_FNAME);
-
-        fd.setFilterPath(sSaveToFolder);
-        fd.setFilterExtensions(new String[] { "*.html" }); //$NON-NLS-1$
-
-        String fname = fd.open();
-        if (fname == null || fname.trim().length() == 0) {
-            return null;
-        }
-
-        sSaveToFolder = fd.getFilterPath();
-        return fname;
-    }
-
-    @Override
-    protected void okPressed() {
-        mDestinationPath = mDestinationText.getText().trim();
-
-        sTraceDuration = mTraceDurationText.getText();
-        if (!sTraceDuration.isEmpty()) {
-            mOptions.mTraceDuration = Integer.parseInt(sTraceDuration);
-        }
-
-        sTraceBufferSize = mTraceBufferSizeText.getText();
-        if (!sTraceBufferSize.isEmpty()) {
-            mOptions.mTraceBufferSize = Integer.parseInt(sTraceBufferSize);
-        }
-
-        mOptions.mTraceCpuFreq = mTraceCpuFreqBtn.getSelection();
-        mOptions.mTraceCpuIdle = mTraceCpuIdleBtn.getSelection();
-        mOptions.mTraceCpuLoad = mTraceCpuLoadBtn.getSelection();
-        mOptions.mTraceDiskIo = mTraceDiskIoBtn.getSelection();
-        mOptions.mTraceKernelWorkqueues = mTraceKernelWorkqueuesBtn.getSelection();
-        mOptions.mTraceCpuScheduler = mTraceCpuSchedulerBtn.getSelection();
-
-        if (mGfxTagBtn.getSelection()) mOptions.enableTag(SystraceOptions.TAG_GFX);
-        if (mInputTagBtn.getSelection()) mOptions.enableTag(SystraceOptions.TAG_INPUT);
-        if (mViewTagBtn.getSelection()) mOptions.enableTag(SystraceOptions.TAG_VIEW);
-        if (mWebViewTagBtn.getSelection()) mOptions.enableTag(SystraceOptions.TAG_WEBVIEW);
-        if (mWmTagBtn.getSelection()) mOptions.enableTag(SystraceOptions.TAG_WM);
-        if (mAmTagBtn.getSelection()) mOptions.enableTag(SystraceOptions.TAG_AM);
-        if (mSyncTagBtn.getSelection()) mOptions.enableTag(SystraceOptions.TAG_SYNC);
-        if (mAudioTagBtn.getSelection()) mOptions.enableTag(SystraceOptions.TAG_AUDIO);
-        if (mVideoTagBtn.getSelection()) mOptions.enableTag(SystraceOptions.TAG_VIDEO);
-        if (mCameraTagBtn.getSelection()) mOptions.enableTag(SystraceOptions.TAG_CAMERA);
-
-        // save current selections to be restored if the dialog is invoked again
-        sTraceCpuFreq = mTraceCpuFreqBtn.getSelection();
-        sTraceCpuIdle = mTraceCpuIdleBtn.getSelection();
-        sTraceCpuLoad = mTraceCpuLoadBtn.getSelection();
-        sTraceDiskIo = mTraceDiskIoBtn.getSelection();
-        sTraceKernelWorkqueues = mTraceKernelWorkqueuesBtn.getSelection();
-        sTraceCpuScheduler = mTraceCpuSchedulerBtn.getSelection();
-
-        sGfxTag = mGfxTagBtn.getSelection();
-        sInputTag = mInputTagBtn.getSelection();
-        sViewTag = mViewTagBtn.getSelection();
-        sWebViewTag = mWebViewTagBtn.getSelection();
-        sWmTag = mWmTagBtn.getSelection();
-        sAmTag = mAmTagBtn.getSelection();
-        sSyncTag = mSyncTagBtn.getSelection();
-        sAudioTag = mAudioTagBtn.getSelection();
-        sVideoTag = mVideoTagBtn.getSelection();
-        sCameraTag = mCameraTagBtn.getSelection();
-
-        super.okPressed();
-    }
-
-    @Override
-    public SystraceOptions getSystraceOptions() {
-        return mOptions;
-    }
-
-    @Override
-    public String getTraceFilePath() {
-        return mDestinationPath;
-    }
-
-    private class SystraceOptions implements ISystraceOptions {
-        // This list is based on the tags in frameworks/native/include/utils/Trace.h
-        private static final int TAG_GFX = 1 << 1;
-        private static final int TAG_INPUT = 1 << 2;
-        private static final int TAG_VIEW = 1 << 3;
-        private static final int TAG_WEBVIEW = 1 << 4;
-        private static final int TAG_WM = 1 << 5;
-        private static final int TAG_AM = 1 << 6;
-        private static final int TAG_SYNC = 1 << 7;
-        private static final int TAG_AUDIO = 1 << 8;
-        private static final int TAG_VIDEO = 1 << 9;
-        private static final int TAG_CAMERA = 1 << 10;
-
-        private int mTraceBufferSize;
-        private int mTraceDuration;
-
-        private boolean mTraceCpuFreq;
-        private boolean mTraceCpuIdle;
-        private boolean mTraceCpuLoad;
-        private boolean mTraceDiskIo;
-        private boolean mTraceKernelWorkqueues;
-        private boolean mTraceCpuScheduler;
-
-        private int mTag;
-
-        private void enableTag(int tag) {
-            mTag |= tag;
-        }
-
-        @Override
-        public String getTags() {
-            return mTag == 0 ? null : "0x" + Integer.toHexString(mTag);
-        }
-
-        @Override
-        public String getOptions() {
-            StringBuilder sb = new StringBuilder(20);
-
-            if (mTraceCpuFreq) sb.append("-f "); //$NON-NLS-1$
-            if (mTraceCpuIdle) sb.append("-i "); //$NON-NLS-1$
-            if (mTraceCpuLoad) sb.append("-l "); //$NON-NLS-1$
-            if (mTraceDiskIo) sb.append("-d ");  //$NON-NLS-1$
-            if (mTraceKernelWorkqueues) sb.append("-w "); //$NON-NLS-1$
-            if (mTraceCpuScheduler) sb.append("-s "); //$NON-NLS-1$
-
-            if (mTraceDuration > 0) {
-                sb.append("-t");    //$NON-NLS-1$
-                sb.append(mTraceDuration);
-                sb.append(' ');
-            }
-
-            if (mTraceBufferSize > 0) {
-                sb.append("-b ");	//$NON-NLS-1$
-                sb.append(mTraceBufferSize);
-                sb.append(' ');
-            }
-
-            return sb.toString().trim();
-        }
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.ddms/src/com/android/ide/eclipse/ddms/systrace/SystraceOptionsDialogV2.java b/eclipse/plugins/com.android.ide.eclipse.ddms/src/com/android/ide/eclipse/ddms/systrace/SystraceOptionsDialogV2.java
deleted file mode 100644
index e28edd3..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.ddms/src/com/android/ide/eclipse/ddms/systrace/SystraceOptionsDialogV2.java
+++ /dev/null
@@ -1,369 +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.eclipse.ddms.systrace;
-
-import com.android.ddmuilib.TableHelper;
-import com.google.common.collect.ImmutableSet;
-import com.google.common.collect.Lists;
-import com.google.common.collect.Sets;
-
-import org.eclipse.jface.dialogs.TitleAreaDialog;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Combo;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.FileDialog;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.swt.widgets.TableItem;
-import org.eclipse.swt.widgets.Text;
-
-import java.io.File;
-import java.util.List;
-import java.util.Set;
-
-public class SystraceOptionsDialogV2 extends TitleAreaDialog implements ISystraceOptionsDialog {
-    private static final String TITLE = "Systrace (Android System Trace)";
-    private static final String DEFAULT_MESSAGE =
-            "Settings to use while capturing system level trace";
-    private static final String DEFAULT_TRACE_FNAME = "trace.html"; //$NON-NLS-1$
-    private static final Set<String> sCommonTags = ImmutableSet.of(
-            "am", "app", "dalvik", "disk", "gfx", "input", "res", "sched", "view", "webview", "wm");
-
-    private Text mDestinationText;
-    private String mDestinationPath;
-    private Text mTraceDurationText;
-    private Text mTraceBufferSizeText;
-    private Combo mTraceAppCombo;
-
-    private static String sSaveToFolder = System.getProperty("user.home"); //$NON-NLS-1$
-    private static String sTraceDuration = "5";
-    private static String sTraceBufferSize = "2048";
-    private static Set<String> sEnabledTags = Sets.newHashSet(sCommonTags);
-    private static String sLastSelectedApp = null;
-
-    private final List<SystraceTag> mCommonSupportedTags;
-    private final List<SystraceTag> mAdvancedSupportedTags;
-
-    private final List<String> mCurrentApps;
-
-    private final SystraceOptions mOptions = new SystraceOptions();
-    private Table mCommonTagsTable;
-    private Table mAdvancedTagsTable;
-
-    public SystraceOptionsDialogV2(Shell parentShell, List<SystraceTag> tags, List<String> apps) {
-        super(parentShell);
-        mCurrentApps = apps;
-
-        mCommonSupportedTags = Lists.newArrayListWithExpectedSize(tags.size());
-        mAdvancedSupportedTags = Lists.newArrayListWithExpectedSize(tags.size());
-
-        for (SystraceTag supportedTag : tags) {
-            if (sCommonTags.contains(supportedTag.tag)) {
-                mCommonSupportedTags.add(supportedTag);
-            } else {
-                mAdvancedSupportedTags.add(supportedTag);
-            }
-        }
-    }
-
-    @Override
-    protected Control createDialogArea(Composite parent) {
-        setTitle(TITLE);
-        setMessage(DEFAULT_MESSAGE);
-
-        Composite c = new Composite(parent, SWT.BORDER);
-        c.setLayout(new GridLayout(3, false));
-        c.setLayoutData(new GridData(GridData.FILL_BOTH));
-
-        Label l = new Label(c, SWT.NONE);
-        l.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1));
-        l.setText("Destination File: ");
-
-        mDestinationText = new Text(c, SWT.BORDER);
-        mDestinationText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
-        mDestinationText.setText(sSaveToFolder + File.separator + DEFAULT_TRACE_FNAME);
-
-        final Button browse = new Button(c, SWT.NONE);
-        browse.setText("Browse...");
-        browse.addSelectionListener(new SelectionAdapter() {
-            @Override
-            public void widgetSelected(SelectionEvent e) {
-                String path = openBrowseDialog(browse.getShell());
-                if (path != null) mDestinationText.setText(path);
-            }
-        });
-
-        Label lblTraceDurationseconds = new Label(c, SWT.NONE);
-        lblTraceDurationseconds.setLayoutData(
-                new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1));
-        lblTraceDurationseconds.setText("Trace duration (seconds): ");
-
-        mTraceDurationText = new Text(c, SWT.BORDER);
-        mTraceDurationText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 2, 1));
-        mTraceDurationText.setText(sTraceDuration);
-
-        Label lblTraceBufferSize = new Label(c, SWT.NONE);
-        lblTraceBufferSize.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1));
-        lblTraceBufferSize.setText("Trace Buffer Size (kb): ");
-
-        mTraceBufferSizeText = new Text(c, SWT.BORDER);
-        mTraceBufferSizeText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 2, 1));
-        mTraceBufferSizeText.setText(sTraceBufferSize);
-
-        Label lblTraceAppName = new Label(c, SWT.NONE);
-        lblTraceAppName.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1));
-        lblTraceAppName.setText("Enable Application Traces from: ");
-
-        mTraceAppCombo = new Combo(c, SWT.DROP_DOWN | SWT.READ_ONLY);
-        mTraceAppCombo.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 2, 1));
-        String[] items = new String[mCurrentApps.size() + 1];
-        items[0] = "None";
-        for (int i = 0; i < mCurrentApps.size(); i++) {
-            items[i+1] = mCurrentApps.get(i);
-        }
-        mTraceAppCombo.setItems(items);
-        if (sLastSelectedApp != null) {
-            mTraceAppCombo.setText(sLastSelectedApp);
-        } else {
-            mTraceAppCombo.select(0);
-        }
-
-        Label separator = new Label(c, SWT.SEPARATOR | SWT.HORIZONTAL);
-        GridData gd = new GridData(GridData.FILL_HORIZONTAL);
-        gd.horizontalSpan = 3;
-        separator.setLayoutData(gd);
-
-        ModifyListener m = new ModifyListener() {
-            @Override
-            public void modifyText(ModifyEvent e) {
-                validateFields();
-            }
-        };
-
-        mDestinationText.addModifyListener(m);
-        mTraceBufferSizeText.addModifyListener(m);
-        mTraceDurationText.addModifyListener(m);
-
-        mCommonTagsTable = createTable(c, "Commonly Used Tags: ", mCommonSupportedTags);
-        mAdvancedTagsTable = createTable(c, "Advanced Options: ", mAdvancedSupportedTags);
-
-        return c;
-    }
-
-    private Table createTable(Composite c, String label, List<SystraceTag> supportedTags) {
-        Label l = new Label(c, SWT.NONE);
-        l.setText(label);
-        l.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1));
-
-        Table table = new Table(c, SWT.CHECK | SWT.BORDER);
-        GridData gd = new GridData(GridData.FILL_BOTH);
-        gd.horizontalSpan = 2;
-        table.setLayoutData(gd);
-        table.setHeaderVisible(false);
-        table.setLinesVisible(false);
-
-        for (SystraceTag tag : supportedTags) {
-            TableItem item = new TableItem(table, SWT.NONE);
-            item.setText(tag.info);
-            item.setChecked(sEnabledTags.contains(tag.tag));
-        }
-
-        TableHelper.createTableColumn(table,
-                "TagHeaderNotDisplayed",                //$NON-NLS-1$
-                SWT.LEFT,
-                "SampleTagForColumnLengthCalculation",  //$NON-NLS-1$
-                null,
-                null);
-
-        return table;
-    }
-
-    private void validateFields() {
-        // validate trace destination path
-        String msg = validatePath(mDestinationText.getText());
-        if (msg != null) {
-            setErrorMessage(msg);
-            getButton(OK).setEnabled(false);
-            return;
-        }
-
-        // validate the trace duration
-        if (!validateInteger(mTraceDurationText.getText())) {
-            setErrorMessage("Trace Duration should be a valid integer (seconds)");
-            getButton(OK).setEnabled(false);
-            return;
-        }
-
-        // validate the trace buffer size
-        if (!validateInteger(mTraceBufferSizeText.getText())) {
-            setErrorMessage("Trace Buffer Size should be a valid integer (kilobytes)");
-            getButton(OK).setEnabled(false);
-            return;
-        }
-
-        getButton(OK).setEnabled(true);
-        setErrorMessage(null);
-    }
-
-    private boolean validateInteger(String text) {
-        if (text == null || text.isEmpty()) {
-            return true;
-        }
-
-        try {
-            Integer.parseInt(text);
-            return true;
-        } catch (NumberFormatException e) {
-            return false;
-        }
-    }
-
-    private String validatePath(String path) {
-        if (path == null || path.isEmpty()) {
-            return null;
-        }
-
-        File f = new File(path);
-        if (f.isDirectory()) {
-            return String.format("The path '%s' points to a folder", path);
-        }
-
-        if (!f.exists()) { // if such a file doesn't exist, make sure the parent folder is valid
-            if (!f.getParentFile().isDirectory()) {
-                return String.format("That path '%s' is not a valid folder.", f.getParent());
-            }
-        }
-
-        return null;
-    }
-
-    private String openBrowseDialog(Shell parentShell) {
-        FileDialog fd = new FileDialog(parentShell, SWT.SAVE);
-
-        fd.setText("Save To");
-        fd.setFileName(DEFAULT_TRACE_FNAME);
-
-        fd.setFilterPath(sSaveToFolder);
-        fd.setFilterExtensions(new String[] { "*.html" }); //$NON-NLS-1$
-
-        String fname = fd.open();
-        if (fname == null || fname.trim().length() == 0) {
-            return null;
-        }
-
-        sSaveToFolder = fd.getFilterPath();
-        return fname;
-    }
-
-    @Override
-    protected void okPressed() {
-        mDestinationPath = mDestinationText.getText().trim();
-
-        sTraceDuration = mTraceDurationText.getText();
-        if (!sTraceDuration.isEmpty()) {
-            mOptions.mTraceDuration = Integer.parseInt(sTraceDuration);
-        }
-
-        sTraceBufferSize = mTraceBufferSizeText.getText();
-        if (!sTraceBufferSize.isEmpty()) {
-            mOptions.mTraceBufferSize = Integer.parseInt(sTraceBufferSize);
-        }
-
-        if (mTraceAppCombo.getSelectionIndex() != 0) {
-            mOptions.mTraceApp = sLastSelectedApp = mTraceAppCombo.getText();
-        }
-
-        sEnabledTags.clear();
-        sEnabledTags.addAll(getEnabledTags(mCommonTagsTable, mCommonSupportedTags));
-        sEnabledTags.addAll(getEnabledTags(mAdvancedTagsTable, mAdvancedSupportedTags));
-
-        super.okPressed();
-    }
-
-    private static Set<String> getEnabledTags(Table table, List<SystraceTag> tags) {
-        Set<String> enabledTags = Sets.newHashSetWithExpectedSize(tags.size());
-
-        for (int i = 0; i < table.getItemCount(); i++) {
-            TableItem it = table.getItem(i);
-            if (it.getChecked()) {
-                enabledTags.add(tags.get(i).tag);
-            }
-        }
-
-        return enabledTags;
-    }
-
-    @Override
-    public ISystraceOptions getSystraceOptions() {
-        return mOptions;
-    }
-
-    @Override
-    public String getTraceFilePath() {
-        return mDestinationPath;
-    }
-
-    private class SystraceOptions implements ISystraceOptions {
-        private int mTraceBufferSize;
-        private int mTraceDuration;
-        private String mTraceApp;
-
-        @Override
-        public String getTags() {
-            return null;
-        }
-
-        @Override
-        public String getOptions() {
-            StringBuilder sb = new StringBuilder(5 * mCommonSupportedTags.size());
-
-            if (mTraceApp != null) {
-                sb.append("-a ");   //$NON-NLS-1$
-                sb.append(mTraceApp);
-                sb.append(' ');
-            }
-
-            if (mTraceDuration > 0) {
-                sb.append("-t");    //$NON-NLS-1$
-                sb.append(mTraceDuration);
-                sb.append(' ');
-            }
-
-            if (mTraceBufferSize > 0) {
-                sb.append("-b ");   //$NON-NLS-1$
-                sb.append(mTraceBufferSize);
-                sb.append(' ');
-            }
-
-            for (String s : sEnabledTags) {
-                sb.append(s);
-                sb.append(' ');
-            }
-
-            return sb.toString().trim();
-        }
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.ddms/src/com/android/ide/eclipse/ddms/systrace/SystraceOutputParser.java b/eclipse/plugins/com.android.ide.eclipse.ddms/src/com/android/ide/eclipse/ddms/systrace/SystraceOutputParser.java
deleted file mode 100644
index 2548edc..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.ddms/src/com/android/ide/eclipse/ddms/systrace/SystraceOutputParser.java
+++ /dev/null
@@ -1,169 +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.eclipse.ddms.systrace;
-
-import com.google.common.base.Charsets;
-import com.google.common.io.Files;
-
-import java.io.File;
-import java.io.IOException;
-import java.util.zip.DataFormatException;
-import java.util.zip.Inflater;
-
-/** {@link SystraceOutputParser} receives the output of atrace command run on the device,
- * parses it and generates html based on the trace */
-public class SystraceOutputParser {
-    private static final String TRACE_START = "TRACE:\n"; //$NON-NLS-1$
-
-    private final boolean mUncompress;
-    private final String mJs;
-    private final String mCss;
-    private final String mHtmlPrefix;
-    private final String mHtmlSuffix;
-
-    private byte[] mAtraceOutput;
-    private int mAtraceLength;
-    private int mSystraceIndex = -1;
-
-    /**
-     * Constructs a atrace output parser.
-     * @param compressedStream Is the input stream compressed using zlib?
-     * @param systraceJs systrace javascript content
-     * @param systraceCss systrace css content
-     */
-    public SystraceOutputParser(boolean compressedStream, String systraceJs, String systraceCss,
-            String htmlPrefix, String htmlSuffix) {
-        mUncompress = compressedStream;
-        mJs = systraceJs;
-        mCss = systraceCss;
-        mHtmlPrefix = htmlPrefix;
-        mHtmlSuffix = htmlSuffix;
-    }
-
-    /**
-     * Parses the atrace output for systrace content.
-     * @param atraceOutput output bytes from atrace
-     */
-    public void parse(byte[] atraceOutput) {
-        mAtraceOutput = atraceOutput;
-        mAtraceLength = atraceOutput.length;
-
-        removeCrLf();
-
-        // locate the trace start marker within the first hundred bytes
-        String header = new String(mAtraceOutput, 0, Math.min(100, mAtraceLength));
-        mSystraceIndex = locateSystraceData(header);
-
-        if (mSystraceIndex < 0) {
-            throw new RuntimeException("Unable to find trace start marker 'TRACE:':\n" + header);
-        }
-    }
-
-    /** Replaces \r\n with \n in {@link #mAtraceOutput}. */
-    private void removeCrLf() {
-        int dst = 0;
-        for (int src = 0; src < mAtraceLength - 1; src++, dst++) {
-            byte copy;
-            if (mAtraceOutput[src] == '\r' && mAtraceOutput[src + 1] == '\n') {
-                copy = '\n';
-                src++;
-            } else {
-                copy = mAtraceOutput[src];
-            }
-            mAtraceOutput[dst] = copy;
-        }
-
-        mAtraceLength = dst;
-    }
-
-    private int locateSystraceData(String header) {
-        int index = header.indexOf(TRACE_START);
-        if (index < 0) {
-            return -1;
-        } else {
-            return index + TRACE_START.length();
-        }
-    }
-
-    public String getSystraceHtml() {
-        if (mSystraceIndex < 0) {
-            return "";
-        }
-
-        String trace = "";
-        if (mUncompress) {
-            Inflater decompressor = new Inflater();
-            decompressor.setInput(mAtraceOutput, mSystraceIndex, mAtraceLength - mSystraceIndex);
-
-            byte[] buf = new byte[4096];
-            int n;
-            StringBuilder sb = new StringBuilder(1000);
-            try {
-                while ((n = decompressor.inflate(buf)) > 0) {
-                    sb.append(new String(buf, 0, n));
-                }
-            } catch (DataFormatException e) {
-                throw new RuntimeException(e);
-            }
-            decompressor.end();
-
-            trace = sb.toString();
-        } else {
-            trace = new String(mAtraceOutput, mSystraceIndex, mAtraceLength - mSystraceIndex);
-        }
-
-        // each line should end with the characters \n\ followed by a newline
-        String html_out = trace.replaceAll("\n", "\\\\n\\\\\n");
-        String header = String.format(mHtmlPrefix, mCss, mJs, "");
-        String footer = mHtmlSuffix;
-        return header + html_out + footer;
-    }
-
-    public static String getJs(File assetsFolder) {
-        try {
-            return String.format("<script language=\"javascript\">%s</script>",
-                    Files.toString(new File(assetsFolder, "script.js"), Charsets.UTF_8));
-        } catch (IOException e) {
-            return "";
-        }
-    }
-
-    public static String getCss(File assetsFolder) {
-        try {
-            return String.format("<style type=\"text/css\">%s</style>",
-                    Files.toString(new File(assetsFolder, "style.css"), Charsets.UTF_8));
-        } catch (IOException e) {
-            return "";
-        }
-    }
-
-    public static String getHtmlPrefix(File assetsFolder) {
-        return getHtmlTemplate(assetsFolder, "prefix.html");
-    }
-
-    public static String getHtmlSuffix(File assetsFolder) {
-        return getHtmlTemplate(assetsFolder, "suffix.html");
-    }
-
-    private static String getHtmlTemplate(File assetsFolder, String htmlFileName) {
-        try {
-            return Files.toString(new File(assetsFolder, htmlFileName), Charsets.UTF_8);
-        } catch (IOException e) {
-            return "";
-        }
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.ddms/src/com/android/ide/eclipse/ddms/systrace/SystraceTag.java b/eclipse/plugins/com.android.ide.eclipse.ddms/src/com/android/ide/eclipse/ddms/systrace/SystraceTag.java
deleted file mode 100644
index 0fc03ef..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.ddms/src/com/android/ide/eclipse/ddms/systrace/SystraceTag.java
+++ /dev/null
@@ -1,27 +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.eclipse.ddms.systrace;
-
-public class SystraceTag {
-    public final String tag;
-    public final String info;
-
-    public SystraceTag(String tagName, String details) {
-        tag = tagName;
-        info = details;
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.ddms/src/com/android/ide/eclipse/ddms/systrace/SystraceTask.java b/eclipse/plugins/com.android.ide.eclipse.ddms/src/com/android/ide/eclipse/ddms/systrace/SystraceTask.java
deleted file mode 100644
index 7262964..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.ddms/src/com/android/ide/eclipse/ddms/systrace/SystraceTask.java
+++ /dev/null
@@ -1,101 +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.eclipse.ddms.systrace;
-
-import com.android.ddmlib.IDevice;
-import com.android.ddmlib.IShellOutputReceiver;
-import com.google.common.primitives.Bytes;
-
-public class SystraceTask implements Runnable {
-    private final IDevice mDevice;
-    private final String mOptions;
-
-    private volatile boolean mCancel;
-
-    private final Object mLock = new Object();
-    private String errorMessage;
-    private boolean mTraceComplete;
-    private byte[] mBuffer = new byte[1024];
-    private int mDataLength = 0;
-
-    public SystraceTask(IDevice device, String options) {
-        mDevice = device;
-        mOptions = options;
-    }
-
-    @Override
-    public void run() {
-        try {
-            mDevice.executeShellCommand("atrace " + mOptions, new Receiver(), 0);
-        } catch (Exception e) {
-            synchronized (mLock) {
-                errorMessage = "Unexpected error while running atrace on device: " + e;
-            }
-        }
-    }
-
-    public void cancel() {
-        mCancel = true;
-    }
-
-    public String getError() {
-        synchronized (mLock) {
-            return errorMessage;
-        }
-    }
-
-    public byte[] getAtraceOutput() {
-        synchronized (mLock) {
-            return mTraceComplete ? mBuffer : null;
-        }
-    }
-
-    private class Receiver implements IShellOutputReceiver {
-        @Override
-        public void addOutput(byte[] data, int offset, int length) {
-            synchronized (mLock) {
-                if (mDataLength + length > mBuffer.length) {
-                    mBuffer = Bytes.ensureCapacity(mBuffer, mDataLength + length + 1, 1024);
-                }
-
-                for (int i = 0; i < length; i++) {
-                    mBuffer[mDataLength + i] = data[offset + i];
-                }
-                mDataLength += length;
-            }
-        }
-
-        @Override
-        public void flush() {
-            synchronized (mLock) {
-                // trim mBuffer to its final size
-                byte[] copy = new byte[mDataLength];
-                for (int i = 0; i < mDataLength; i++) {
-                    copy[i] = mBuffer[i];
-                }
-                mBuffer = copy;
-
-                mTraceComplete = true;
-            }
-        }
-
-        @Override
-        public boolean isCancelled() {
-            return mCancel;
-        }
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.ddms/src/com/android/ide/eclipse/ddms/systrace/SystraceVersionDetector.java b/eclipse/plugins/com.android.ide.eclipse.ddms/src/com/android/ide/eclipse/ddms/systrace/SystraceVersionDetector.java
deleted file mode 100644
index 646a454..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.ddms/src/com/android/ide/eclipse/ddms/systrace/SystraceVersionDetector.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.ide.eclipse.ddms.systrace;
-
-import com.android.ddmlib.CollectingOutputReceiver;
-import com.android.ddmlib.IDevice;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.jface.operation.IRunnableWithProgress;
-
-import java.lang.reflect.InvocationTargetException;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.TimeUnit;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-public class SystraceVersionDetector implements IRunnableWithProgress {
-    public static final int SYSTRACE_V1 = 1;
-    public static final int SYSTRACE_V2 = 2;
-
-    private final IDevice mDevice;
-    private List<SystraceTag> mTags;
-
-    public SystraceVersionDetector(IDevice device) {
-        mDevice = device;
-    }
-
-    @Override
-    public void run(IProgressMonitor monitor) throws InvocationTargetException,
-            InterruptedException {
-        monitor.beginTask("Checking systrace version on device..",
-                IProgressMonitor.UNKNOWN);
-
-        CountDownLatch setTagLatch = new CountDownLatch(1);
-        CollectingOutputReceiver receiver = new CollectingOutputReceiver(setTagLatch);
-        try {
-            String cmd = "atrace --list_categories";
-            mDevice.executeShellCommand(cmd, receiver);
-            setTagLatch.await(5, TimeUnit.SECONDS);
-        } catch (Exception e) {
-            throw new InvocationTargetException(e);
-        }
-
-        String shellOutput = receiver.getOutput();
-        mTags = parseSupportedTags(shellOutput);
-
-        monitor.done();
-    }
-
-    public int getVersion() {
-        if (mTags == null) {
-            return SYSTRACE_V1;
-        } else {
-            return SYSTRACE_V2;
-        }
-    }
-
-    public List<SystraceTag> getTags() {
-        return mTags;
-    }
-
-    private List<SystraceTag> parseSupportedTags(String listCategoriesOutput) {
-        if (listCategoriesOutput == null) {
-            return null;
-        }
-
-        if (listCategoriesOutput.contains("unknown option")) {
-            return null;
-        }
-
-        String[] categories = listCategoriesOutput.split("\n");
-        List<SystraceTag> tags = new ArrayList<SystraceTag>(categories.length);
-
-        Pattern p = Pattern.compile("([^-]+) - (.*)"); //$NON-NLS-1$
-        for (String category : categories) {
-            Matcher m = p.matcher(category);
-            if (m.find()) {
-                tags.add(new SystraceTag(m.group(1).trim(), m.group(2).trim()));
-            }
-        }
-
-        return tags;
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.ddms/src/com/android/ide/eclipse/ddms/views/AllocTrackerView.java b/eclipse/plugins/com.android.ide.eclipse.ddms/src/com/android/ide/eclipse/ddms/views/AllocTrackerView.java
deleted file mode 100644
index e8b73ff..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.ddms/src/com/android/ide/eclipse/ddms/views/AllocTrackerView.java
+++ /dev/null
@@ -1,47 +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.eclipse.ddms.views;
-
-import com.android.ddmuilib.AllocationPanel;
-
-import org.eclipse.swt.widgets.Composite;
-
-public class AllocTrackerView extends TableView {
-
-    public static final String ID = "com.android.ide.eclipse.ddms.views.AllocTrackerView"; //$NON-NLS-1$
-    private AllocationPanel mPanel;
-
-    public AllocTrackerView() {
-    }
-
-    @Override
-    public void createPartControl(Composite parent) {
-        mPanel = new AllocationPanel();
-        mPanel.createPanel(parent);
-
-        setSelectionDependentPanel(mPanel);
-
-        // listen to focus changes for table(s) of the panel.
-        setupTableFocusListener(mPanel, parent);
-    }
-
-    @Override
-    public void setFocus() {
-        mPanel.setFocus();
-    }
-
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.ddms/src/com/android/ide/eclipse/ddms/views/DeviceView.java b/eclipse/plugins/com.android.ide.eclipse.ddms/src/com/android/ide/eclipse/ddms/views/DeviceView.java
deleted file mode 100644
index c70c388..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.ddms/src/com/android/ide/eclipse/ddms/views/DeviceView.java
+++ /dev/null
@@ -1,877 +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.eclipse.ddms.views;
-
-import com.android.ddmlib.AndroidDebugBridge;
-import com.android.ddmlib.AndroidDebugBridge.IClientChangeListener;
-import com.android.ddmlib.Client;
-import com.android.ddmlib.ClientData;
-import com.android.ddmlib.ClientData.IHprofDumpHandler;
-import com.android.ddmlib.ClientData.MethodProfilingStatus;
-import com.android.ddmlib.CollectingOutputReceiver;
-import com.android.ddmlib.DdmPreferences;
-import com.android.ddmlib.IDevice;
-import com.android.ddmlib.SyncException;
-import com.android.ddmlib.SyncService;
-import com.android.ddmlib.SyncService.ISyncProgressMonitor;
-import com.android.ddmlib.TimeoutException;
-import com.android.ddmuilib.DevicePanel;
-import com.android.ddmuilib.DevicePanel.IUiSelectionListener;
-import com.android.ddmuilib.ImageLoader;
-import com.android.ddmuilib.ScreenShotDialog;
-import com.android.ddmuilib.SyncProgressHelper;
-import com.android.ddmuilib.SyncProgressHelper.SyncRunnable;
-import com.android.ddmuilib.handler.BaseFileHandler;
-import com.android.ddmuilib.handler.MethodProfilingHandler;
-import com.android.ide.eclipse.ddms.DdmsPlugin;
-import com.android.ide.eclipse.ddms.IClientAction;
-import com.android.ide.eclipse.ddms.IDebuggerConnector;
-import com.android.ide.eclipse.ddms.editors.UiAutomatorViewer;
-import com.android.ide.eclipse.ddms.i18n.Messages;
-import com.android.ide.eclipse.ddms.preferences.PreferenceInitializer;
-import com.android.ide.eclipse.ddms.systrace.ISystraceOptions;
-import com.android.ide.eclipse.ddms.systrace.ISystraceOptionsDialog;
-import com.android.ide.eclipse.ddms.systrace.SystraceOptionsDialogV1;
-import com.android.ide.eclipse.ddms.systrace.SystraceOptionsDialogV2;
-import com.android.ide.eclipse.ddms.systrace.SystraceOutputParser;
-import com.android.ide.eclipse.ddms.systrace.SystraceTask;
-import com.android.ide.eclipse.ddms.systrace.SystraceVersionDetector;
-import com.android.uiautomator.UiAutomatorHelper;
-import com.android.uiautomator.UiAutomatorHelper.UiAutomatorException;
-import com.android.uiautomator.UiAutomatorHelper.UiAutomatorResult;
-import com.google.common.io.Files;
-
-import org.eclipse.core.filesystem.EFS;
-import org.eclipse.core.filesystem.IFileStore;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.action.IToolBarManager;
-import org.eclipse.jface.action.Separator;
-import org.eclipse.jface.dialogs.ErrorDialog;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.jface.dialogs.ProgressMonitorDialog;
-import org.eclipse.jface.operation.IRunnableWithProgress;
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.IActionBars;
-import org.eclipse.ui.ISharedImages;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.WorkbenchException;
-import org.eclipse.ui.ide.IDE;
-import org.eclipse.ui.part.ViewPart;
-
-import java.io.File;
-import java.io.IOException;
-import java.lang.reflect.InvocationTargetException;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.TimeUnit;
-
-public class DeviceView extends ViewPart implements IUiSelectionListener, IClientChangeListener {
-
-    private final static boolean USE_SELECTED_DEBUG_PORT = true;
-
-    public static final String ID = "com.android.ide.eclipse.ddms.views.DeviceView"; //$NON-NLS-1$
-
-    private static DeviceView sThis;
-
-    private Shell mParentShell;
-    private DevicePanel mDeviceList;
-
-    private Action mResetAdbAction;
-    private Action mCaptureAction;
-    private Action mViewUiAutomatorHierarchyAction;
-    private Action mSystraceAction;
-    private Action mUpdateThreadAction;
-    private Action mUpdateHeapAction;
-    private Action mGcAction;
-    private Action mKillAppAction;
-    private Action mDebugAction;
-    private Action mHprofAction;
-    private Action mTracingAction;
-
-    private ImageDescriptor mTracingStartImage;
-    private ImageDescriptor mTracingStopImage;
-
-    public class HProfHandler extends BaseFileHandler implements IHprofDumpHandler {
-        public final static String ACTION_SAVE = "hprof.save"; //$NON-NLS-1$
-        public final static String ACTION_OPEN = "hprof.open"; //$NON-NLS-1$
-
-        public final static String DOT_HPROF = ".hprof"; //$NON-NLS-1$
-
-        HProfHandler(Shell parentShell) {
-            super(parentShell);
-        }
-
-        @Override
-        protected String getDialogTitle() {
-            return Messages.DeviceView_HPROF_Error;
-        }
-
-        @Override
-        public void onEndFailure(final Client client, final String message) {
-            mParentShell.getDisplay().asyncExec(new Runnable() {
-                @Override
-                public void run() {
-                    try {
-                        displayErrorFromUiThread(
-                                Messages.DeviceView_Unable_Create_HPROF_For_Application,
-                                client.getClientData().getClientDescription(),
-                                message != null ? message + "\n\n" : ""); //$NON-NLS-1$ //$NON-NLS-2$
-                    } finally {
-                        // this will make sure the dump hprof button is
-                        // re-enabled for the
-                        // current selection. as the client is finished dumping
-                        // an hprof file
-                        doSelectionChanged(mDeviceList.getSelectedClient());
-                    }
-                }
-            });
-        }
-
-        @Override
-        public void onSuccess(final String remoteFilePath, final Client client) {
-            mParentShell.getDisplay().asyncExec(new Runnable() {
-                @Override
-                public void run() {
-                    final IDevice device = client.getDevice();
-                    try {
-                        // get the sync service to pull the HPROF file
-                        final SyncService sync = client.getDevice().getSyncService();
-                        if (sync != null) {
-                            // get from the preference what action to take
-                            IPreferenceStore store = DdmsPlugin.getDefault().getPreferenceStore();
-                            String value = store.getString(PreferenceInitializer.ATTR_HPROF_ACTION);
-
-                            if (ACTION_OPEN.equals(value)) {
-                                File temp = File.createTempFile("android", DOT_HPROF); //$NON-NLS-1$
-                                final String tempPath = temp.getAbsolutePath();
-                                SyncProgressHelper.run(new SyncRunnable() {
-
-                                    @Override
-                                    public void run(ISyncProgressMonitor monitor)
-                                                throws SyncException, IOException,
-                                                TimeoutException {
-                                        sync.pullFile(remoteFilePath, tempPath, monitor);
-                                    }
-
-                                    @Override
-                                    public void close() {
-                                        sync.close();
-                                    }
-                                },
-                                        String.format(Messages.DeviceView_Pulling_From_Device,
-                                                remoteFilePath),
-                                        mParentShell);
-
-                                open(tempPath);
-                            } else {
-                                // default action is ACTION_SAVE
-                                promptAndPull(sync,
-                                        client.getClientData().getClientDescription() + DOT_HPROF,
-                                        remoteFilePath, Messages.DeviceView_Save_HPROF_File);
-
-                            }
-                        } else {
-                            displayErrorFromUiThread(
-                                    Messages.DeviceView_Unable_Download_HPROF_From_Device_One_Param_First_Message,
-                                    device.getSerialNumber());
-                        }
-                    } catch (SyncException e) {
-                        if (e.wasCanceled() == false) {
-                            displayErrorFromUiThread(
-                                    Messages.DeviceView_Unable_Download_HPROF_From_Device_Two_Param,
-                                    device.getSerialNumber(), e.getMessage());
-                        }
-                    } catch (Exception e) {
-                        displayErrorFromUiThread(
-                                Messages.DeviceView_Unable_Download_HPROF_From_Device_One_Param_Second_Message,
-                                device.getSerialNumber());
-
-                    } finally {
-                        // this will make sure the dump hprof button is
-                        // re-enabled for the
-                        // current selection. as the client is finished dumping
-                        // an hprof file
-                        doSelectionChanged(mDeviceList.getSelectedClient());
-                    }
-                }
-            });
-        }
-
-        @Override
-        public void onSuccess(final byte[] data, final Client client) {
-            mParentShell.getDisplay().asyncExec(new Runnable() {
-                @Override
-                public void run() {
-                    // get from the preference what action to take
-                    IPreferenceStore store = DdmsPlugin.getDefault().getPreferenceStore();
-                    String value = store.getString(PreferenceInitializer.ATTR_HPROF_ACTION);
-
-                    if (ACTION_OPEN.equals(value)) {
-                        try {
-                            // no need to give an extension since we're going to
-                            // convert the
-                            // file anyway after.
-                            File tempFile = saveTempFile(data, null /* extension */);
-                            open(tempFile.getAbsolutePath());
-                        } catch (Exception e) {
-                            String errorMsg = e.getMessage();
-                            displayErrorFromUiThread(
-                                    Messages.DeviceView_Failed_To_Save_HPROF_Data,
-                                    errorMsg != null ? ":\n" + errorMsg : "."); //$NON-NLS-1$ //$NON-NLS-2$
-                        }
-                    } else {
-                        // default action is ACTION_SAVE
-                        promptAndSave(client.getClientData().getClientDescription() + DOT_HPROF,
-                                data, Messages.DeviceView_Save_HPROF_File);
-                    }
-                }
-            });
-        }
-
-        private void open(String path) throws IOException, InterruptedException, PartInitException {
-            // make a temp file to convert the hprof into something
-            // readable by normal tools
-            File temp = File.createTempFile("android", DOT_HPROF); //$NON-NLS-1$
-            String tempPath = temp.getAbsolutePath();
-
-            String[] command = new String[3];
-            command[0] = DdmsPlugin.getHprofConverter();
-            command[1] = path;
-            command[2] = tempPath;
-
-            Process p = Runtime.getRuntime().exec(command);
-            p.waitFor();
-
-            IFileStore fileStore = EFS.getLocalFileSystem().getStore(new Path(tempPath));
-            if (!fileStore.fetchInfo().isDirectory() && fileStore.fetchInfo().exists()) {
-                // before we open the file in an editor window, we make sure the
-                // current
-                // workbench page has an editor area (typically the ddms
-                // perspective doesn't).
-                IWorkbench workbench = PlatformUI.getWorkbench();
-                IWorkbenchWindow window = workbench.getActiveWorkbenchWindow();
-                IWorkbenchPage page = window.getActivePage();
-                if (page == null) {
-                    return;
-                }
-
-                if (page.isEditorAreaVisible() == false) {
-                    IAdaptable input;
-                    input = page.getInput();
-                    try {
-                        workbench.showPerspective("org.eclipse.debug.ui.DebugPerspective", //$NON-NLS-1$
-                                window, input);
-                    } catch (WorkbenchException e) {
-                    }
-                }
-
-                IDE.openEditorOnFileStore(page, fileStore);
-            }
-        }
-    }
-
-    public DeviceView() {
-        // the view is declared with allowMultiple="false" so we
-        // can safely do this.
-        sThis = this;
-    }
-
-    public static DeviceView getInstance() {
-        return sThis;
-    }
-
-    @Override
-    public void createPartControl(Composite parent) {
-        mParentShell = parent.getShell();
-
-        ImageLoader loader = ImageLoader.getDdmUiLibLoader();
-
-        mDeviceList = new DevicePanel(USE_SELECTED_DEBUG_PORT);
-        mDeviceList.createPanel(parent);
-        mDeviceList.addSelectionListener(this);
-
-        DdmsPlugin plugin = DdmsPlugin.getDefault();
-        mDeviceList.addSelectionListener(plugin);
-        plugin.setListeningState(true);
-
-        mCaptureAction = new Action(Messages.DeviceView_Screen_Capture) {
-            @Override
-            public void run() {
-                ScreenShotDialog dlg = new ScreenShotDialog(
-                        DdmsPlugin.getDisplay().getActiveShell());
-                dlg.open(mDeviceList.getSelectedDevice());
-            }
-        };
-        mCaptureAction.setToolTipText(Messages.DeviceView_Screen_Capture_Tooltip);
-        mCaptureAction.setImageDescriptor(loader.loadDescriptor("capture.png")); //$NON-NLS-1$
-
-        mViewUiAutomatorHierarchyAction = new Action("Dump View Hierarchy for UI Automator") {
-            @Override
-            public void run() {
-                takeUiAutomatorSnapshot(mDeviceList.getSelectedDevice(),
-                        DdmsPlugin.getDisplay().getActiveShell());
-            }
-        };
-        mViewUiAutomatorHierarchyAction.setToolTipText("Dump View Hierarchy for UI Automator");
-        mViewUiAutomatorHierarchyAction.setImageDescriptor(
-                DdmsPlugin.getImageDescriptor("icons/uiautomator.png")); //$NON-NLS-1$
-
-        mSystraceAction = new Action("Capture System Wide Trace") {
-            @Override
-            public void run() {
-                launchSystrace(mDeviceList.getSelectedDevice(),
-                        DdmsPlugin.getDisplay().getActiveShell());
-            }
-        };
-        mSystraceAction.setToolTipText("Capture system wide trace using Android systrace");
-        mSystraceAction.setImageDescriptor(
-                DdmsPlugin.getImageDescriptor("icons/systrace.png")); //$NON-NLS-1$
-        mSystraceAction.setEnabled(true);
-
-        mResetAdbAction = new Action(Messages.DeviceView_Reset_ADB) {
-            @Override
-            public void run() {
-                AndroidDebugBridge bridge = AndroidDebugBridge.getBridge();
-                if (bridge != null) {
-                    if (bridge.restart() == false) {
-                        // get the current Display
-                        final Display display = DdmsPlugin.getDisplay();
-
-                        // dialog box only run in ui thread..
-                        display.asyncExec(new Runnable() {
-                            @Override
-                            public void run() {
-                                Shell shell = display.getActiveShell();
-                                MessageDialog.openError(shell, Messages.DeviceView_ADB_Error,
-                                        Messages.DeviceView_ADB_Failed_Restart);
-                            }
-                        });
-                    }
-                }
-            }
-        };
-        mResetAdbAction.setToolTipText(Messages.DeviceView_Reset_ADB_Host_Deamon);
-        mResetAdbAction.setImageDescriptor(PlatformUI.getWorkbench()
-                .getSharedImages().getImageDescriptor(
-                        ISharedImages.IMG_OBJS_WARN_TSK));
-
-        mKillAppAction = new Action() {
-            @Override
-            public void run() {
-                mDeviceList.killSelectedClient();
-            }
-        };
-
-        mKillAppAction.setText(Messages.DeviceView_Stop_Process);
-        mKillAppAction.setToolTipText(Messages.DeviceView_Stop_Process_Tooltip);
-        mKillAppAction.setImageDescriptor(loader.loadDescriptor(DevicePanel.ICON_HALT));
-
-        mGcAction = new Action() {
-            @Override
-            public void run() {
-                mDeviceList.forceGcOnSelectedClient();
-            }
-        };
-
-        mGcAction.setText(Messages.DeviceView_Cause_GC);
-        mGcAction.setToolTipText(Messages.DeviceView_Cause_GC_Tooltip);
-        mGcAction.setImageDescriptor(loader.loadDescriptor(DevicePanel.ICON_GC));
-
-        mHprofAction = new Action() {
-            @Override
-            public void run() {
-                mDeviceList.dumpHprof();
-                doSelectionChanged(mDeviceList.getSelectedClient());
-            }
-        };
-        mHprofAction.setText(Messages.DeviceView_Dump_HPROF_File);
-        mHprofAction.setToolTipText(Messages.DeviceView_Dump_HPROF_File_Tooltip);
-        mHprofAction.setImageDescriptor(loader.loadDescriptor(DevicePanel.ICON_HPROF));
-
-        mUpdateHeapAction = new Action(Messages.DeviceView_Update_Heap, IAction.AS_CHECK_BOX) {
-            @Override
-            public void run() {
-                boolean enable = mUpdateHeapAction.isChecked();
-                mDeviceList.setEnabledHeapOnSelectedClient(enable);
-            }
-        };
-        mUpdateHeapAction.setToolTipText(Messages.DeviceView_Update_Heap_Tooltip);
-        mUpdateHeapAction.setImageDescriptor(loader.loadDescriptor(DevicePanel.ICON_HEAP));
-
-        mUpdateThreadAction = new Action(Messages.DeviceView_Threads, IAction.AS_CHECK_BOX) {
-            @Override
-            public void run() {
-                boolean enable = mUpdateThreadAction.isChecked();
-                mDeviceList.setEnabledThreadOnSelectedClient(enable);
-            }
-        };
-        mUpdateThreadAction.setToolTipText(Messages.DeviceView_Threads_Tooltip);
-        mUpdateThreadAction.setImageDescriptor(loader.loadDescriptor(DevicePanel.ICON_THREAD));
-
-        mTracingAction = new Action() {
-            @Override
-            public void run() {
-                mDeviceList.toggleMethodProfiling();
-            }
-        };
-        mTracingAction.setText(Messages.DeviceView_Start_Method_Profiling);
-        mTracingAction.setToolTipText(Messages.DeviceView_Start_Method_Profiling_Tooltip);
-        mTracingStartImage = loader.loadDescriptor(DevicePanel.ICON_TRACING_START);
-        mTracingStopImage = loader.loadDescriptor(DevicePanel.ICON_TRACING_STOP);
-        mTracingAction.setImageDescriptor(mTracingStartImage);
-
-        mDebugAction = new Action(Messages.DeviceView_Debug_Process) {
-            @Override
-            public void run() {
-                if (DdmsPlugin.getDefault().hasDebuggerConnectors()) {
-                    Client currentClient = mDeviceList.getSelectedClient();
-                    if (currentClient != null) {
-                        ClientData clientData = currentClient.getClientData();
-
-                        // make sure the client can be debugged
-                        switch (clientData.getDebuggerConnectionStatus()) {
-                            case ERROR: {
-                                Display display = DdmsPlugin.getDisplay();
-                                Shell shell = display.getActiveShell();
-                                MessageDialog.openError(shell,
-                                        Messages.DeviceView_Debug_Process_Title,
-                                        Messages.DeviceView_Process_Debug_Already_In_Use);
-                                return;
-                            }
-                            case ATTACHED: {
-                                Display display = DdmsPlugin.getDisplay();
-                                Shell shell = display.getActiveShell();
-                                MessageDialog.openError(shell,
-                                        Messages.DeviceView_Debug_Process_Title,
-                                        Messages.DeviceView_Process_Already_Being_Debugged);
-                                return;
-                            }
-                        }
-
-                        // get the name of the client
-                        String packageName = clientData.getClientDescription();
-                        if (packageName != null) {
-
-                            // try all connectors till one returns true.
-                            IDebuggerConnector[] connectors =
-                                    DdmsPlugin.getDefault().getDebuggerConnectors();
-
-                            if (connectors != null) {
-                                for (IDebuggerConnector connector : connectors) {
-                                    try {
-                                        if (connector.connectDebugger(packageName,
-                                                currentClient.getDebuggerListenPort(),
-                                                DdmPreferences.getSelectedDebugPort())) {
-                                            return;
-                                        }
-                                    } catch (Throwable t) {
-                                        // ignore, we'll just not use this
-                                        // implementation
-                                    }
-                                }
-                            }
-
-                            // if we get to this point, then we failed to find a
-                            // project
-                            // that matched the application to debug
-                            Display display = DdmsPlugin.getDisplay();
-                            Shell shell = display.getActiveShell();
-                            MessageDialog.openError(shell, Messages.DeviceView_Debug_Process_Title,
-                                    String.format(
-                                            Messages.DeviceView_Debug_Session_Failed,
-                                            packageName));
-                        }
-                    }
-                }
-            }
-        };
-        mDebugAction.setToolTipText(Messages.DeviceView_Debug_Process_Tooltip);
-        mDebugAction.setImageDescriptor(loader.loadDescriptor("debug-attach.png")); //$NON-NLS-1$
-        mDebugAction.setEnabled(DdmsPlugin.getDefault().hasDebuggerConnectors());
-
-        placeActions();
-
-        // disabling all action buttons
-        selectionChanged(null, null);
-
-        ClientData.setHprofDumpHandler(new HProfHandler(mParentShell));
-        AndroidDebugBridge.addClientChangeListener(this);
-        ClientData.setMethodProfilingHandler(new MethodProfilingHandler(mParentShell) {
-            @Override
-            protected void open(String tempPath) {
-                if (DdmsPlugin.getDefault().launchTraceview(tempPath) == false) {
-                    super.open(tempPath);
-                }
-            }
-        });
-    }
-
-    private void takeUiAutomatorSnapshot(final IDevice device, final Shell shell) {
-        ProgressMonitorDialog dialog = new ProgressMonitorDialog(shell);
-        try {
-            dialog.run(true, false, new IRunnableWithProgress() {
-                @Override
-                public void run(IProgressMonitor monitor) throws InvocationTargetException,
-                                                                        InterruptedException {
-                    UiAutomatorResult result = null;
-                    try {
-                        result = UiAutomatorHelper.takeSnapshot(device, monitor);
-                    } catch (UiAutomatorException e) {
-                        throw new InvocationTargetException(e);
-                    } finally {
-                        monitor.done();
-                    }
-
-                    UiAutomatorViewer.openEditor(result);
-                }
-            });
-        } catch (Exception e) {
-            Throwable t = e;
-            if (e instanceof InvocationTargetException) {
-                t = ((InvocationTargetException) e).getTargetException();
-            }
-            Status s = new Status(IStatus.ERROR, DdmsPlugin.PLUGIN_ID,
-                                            "Error obtaining UI hierarchy", t);
-            ErrorDialog.openError(shell, "UI Automator",
-                    "Unexpected error while obtaining UI hierarchy", s);
-        }
-    };
-
-    private void launchSystrace(final IDevice device, final Shell parentShell) {
-        final File systraceAssets = new File(DdmsPlugin.getPlatformToolsFolder(), "systrace"); //$NON-NLS-1$
-        if (!systraceAssets.isDirectory()) {
-            MessageDialog.openError(parentShell, "Systrace",
-                    "Updated version of platform-tools (18.0.1 or greater) is required.\n"
-                    + "Please update your platform-tools using SDK Manager.");
-            return;
-        }
-
-        SystraceVersionDetector detector = new SystraceVersionDetector(device);
-        try {
-            new ProgressMonitorDialog(parentShell).run(true, false, detector);
-        } catch (InvocationTargetException e) {
-            MessageDialog.openError(parentShell,
-                    "Systrace",
-                    "Unexpected error while detecting atrace version: " + e);
-            return;
-        } catch (InterruptedException e) {
-            return;
-        }
-
-        final ISystraceOptionsDialog dlg;
-        if (detector.getVersion() == SystraceVersionDetector.SYSTRACE_V1) {
-            dlg = new SystraceOptionsDialogV1(parentShell);
-        } else {
-            Client[] clients = device.getClients();
-            List<String> apps = new ArrayList<String>(clients.length);
-            for (int i = 0; i < clients.length; i++) {
-                String name = clients[i].getClientData().getClientDescription();
-                if (name != null && !name.isEmpty()) {
-                    apps.add(name);
-                }
-            }
-            dlg = new SystraceOptionsDialogV2(parentShell, detector.getTags(), apps);
-        }
-
-        if (dlg.open() != SystraceOptionsDialogV1.OK) {
-            return;
-        }
-
-        final ISystraceOptions options = dlg.getSystraceOptions();
-
-        // set trace tag if necessary:
-        //      adb shell setprop debug.atrace.tags.enableflags <tag>
-        String tag = options.getTags();
-        if (tag != null) {
-            CountDownLatch setTagLatch = new CountDownLatch(1);
-            CollectingOutputReceiver receiver = new CollectingOutputReceiver(setTagLatch);
-            try {
-                String cmd = "setprop debug.atrace.tags.enableflags " + tag;
-                device.executeShellCommand(cmd, receiver);
-                setTagLatch.await(5, TimeUnit.SECONDS);
-            } catch (Exception e) {
-                MessageDialog.openError(parentShell,
-                        "Systrace",
-                        "Unexpected error while setting trace tags: " + e);
-                return;
-            }
-
-            String shellOutput = receiver.getOutput();
-            if (shellOutput.contains("Error type")) {                   //$NON-NLS-1$
-                throw new RuntimeException(receiver.getOutput());
-            }
-        }
-
-        // obtain the output of "adb shell atrace <trace-options>" and generate the html file
-        ProgressMonitorDialog d = new ProgressMonitorDialog(parentShell);
-        try {
-            d.run(true, true, new IRunnableWithProgress() {
-                @Override
-                public void run(IProgressMonitor monitor) throws InvocationTargetException,
-                        InterruptedException {
-                    boolean COMPRESS_DATA = true;
-
-                    monitor.setTaskName("Collecting Trace Information");
-                    final String atraceOptions = options.getOptions()
-                                                + (COMPRESS_DATA ? " -z" : "");
-                    SystraceTask task = new SystraceTask(device, atraceOptions);
-                    Thread t = new Thread(task, "Systrace Output Receiver");
-                    t.start();
-
-                    // check if the user has cancelled tracing every so often
-                    while (true) {
-                        t.join(1000);
-
-                        if (t.isAlive()) {
-                            if (monitor.isCanceled()) {
-                                task.cancel();
-                                return;
-                            }
-                        } else {
-                            break;
-                        }
-                    }
-
-                    if (task.getError() != null) {
-                        throw new RuntimeException(task.getError());
-                    }
-
-                    monitor.setTaskName("Saving trace information");
-                    SystraceOutputParser parser = new SystraceOutputParser(
-                            COMPRESS_DATA,
-                            SystraceOutputParser.getJs(systraceAssets),
-                            SystraceOutputParser.getCss(systraceAssets),
-                            SystraceOutputParser.getHtmlPrefix(systraceAssets),
-                            SystraceOutputParser.getHtmlSuffix(systraceAssets));
-
-                    parser.parse(task.getAtraceOutput());
-
-                    String html = parser.getSystraceHtml();
-                    try {
-                        Files.write(html.getBytes(), new File(dlg.getTraceFilePath()));
-                    } catch (IOException e) {
-                        throw new InvocationTargetException(e);
-                    }
-                }
-            });
-        } catch (InvocationTargetException e) {
-            ErrorDialog.openError(parentShell, "Systrace",
-                    "Unable to collect system trace.",
-                    new Status(Status.ERROR,
-                            DdmsPlugin.PLUGIN_ID,
-                            "Unexpected error while collecting system trace.",
-                            e.getCause()));
-        } catch (InterruptedException ignore) {
-        }
-    }
-
-    @Override
-    public void setFocus() {
-        mDeviceList.setFocus();
-    }
-
-    /**
-     * Sent when a new {@link IDevice} and {@link Client} are selected.
-     *
-     * @param selectedDevice the selected device. If null, no devices are
-     *            selected.
-     * @param selectedClient The selected client. If null, no clients are
-     *            selected.
-     */
-    @Override
-    public void selectionChanged(IDevice selectedDevice, Client selectedClient) {
-        // update the buttons
-        doSelectionChanged(selectedClient);
-        doSelectionChanged(selectedDevice);
-    }
-
-    private void doSelectionChanged(Client selectedClient) {
-        // update the buttons
-        if (selectedClient != null) {
-            if (USE_SELECTED_DEBUG_PORT) {
-                // set the client as the debug client
-                selectedClient.setAsSelectedClient();
-            }
-
-            mDebugAction.setEnabled(DdmsPlugin.getDefault().hasDebuggerConnectors());
-            mKillAppAction.setEnabled(true);
-            mGcAction.setEnabled(true);
-
-            mUpdateHeapAction.setEnabled(true);
-            mUpdateHeapAction.setChecked(selectedClient.isHeapUpdateEnabled());
-
-            mUpdateThreadAction.setEnabled(true);
-            mUpdateThreadAction.setChecked(selectedClient.isThreadUpdateEnabled());
-
-            ClientData data = selectedClient.getClientData();
-
-            if (data.hasFeature(ClientData.FEATURE_HPROF)) {
-                mHprofAction.setEnabled(data.hasPendingHprofDump() == false);
-                mHprofAction.setToolTipText(Messages.DeviceView_Dump_HPROF_File);
-            } else {
-                mHprofAction.setEnabled(false);
-                mHprofAction
-                        .setToolTipText(Messages.DeviceView_Dump_HPROF_File_Not_Supported_By_VM);
-            }
-
-            if (data.hasFeature(ClientData.FEATURE_PROFILING)) {
-                mTracingAction.setEnabled(true);
-                if (data.getMethodProfilingStatus() == MethodProfilingStatus.TRACER_ON
-                        || data.getMethodProfilingStatus() == MethodProfilingStatus.SAMPLER_ON) {
-                    mTracingAction
-                            .setToolTipText(Messages.DeviceView_Stop_Method_Profiling_Tooltip);
-                    mTracingAction.setText(Messages.DeviceView_Stop_Method_Profiling);
-                    mTracingAction.setImageDescriptor(mTracingStopImage);
-                } else {
-                    mTracingAction
-                            .setToolTipText(Messages.DeviceView_Start_Method_Profiling_Tooltip);
-                    mTracingAction.setImageDescriptor(mTracingStartImage);
-                    mTracingAction.setText(Messages.DeviceView_Start_Method_Profiling);
-                }
-            } else {
-                mTracingAction.setEnabled(false);
-                mTracingAction.setImageDescriptor(mTracingStartImage);
-                mTracingAction
-                        .setToolTipText(Messages.DeviceView_Start_Method_Profiling_Not_Suported_By_Vm);
-                mTracingAction.setText(Messages.DeviceView_Start_Method_Profiling);
-            }
-        } else {
-            if (USE_SELECTED_DEBUG_PORT) {
-                // set the client as the debug client
-                AndroidDebugBridge bridge = AndroidDebugBridge.getBridge();
-                if (bridge != null) {
-                    bridge.setSelectedClient(null);
-                }
-            }
-
-            mDebugAction.setEnabled(false);
-            mKillAppAction.setEnabled(false);
-            mGcAction.setEnabled(false);
-            mUpdateHeapAction.setChecked(false);
-            mUpdateHeapAction.setEnabled(false);
-            mUpdateThreadAction.setEnabled(false);
-            mUpdateThreadAction.setChecked(false);
-            mHprofAction.setEnabled(false);
-
-            mHprofAction.setEnabled(false);
-            mHprofAction.setToolTipText(Messages.DeviceView_Dump_HPROF_File);
-
-            mTracingAction.setEnabled(false);
-            mTracingAction.setImageDescriptor(mTracingStartImage);
-            mTracingAction.setToolTipText(Messages.DeviceView_Start_Method_Profiling_Tooltip);
-            mTracingAction.setText(Messages.DeviceView_Start_Method_Profiling);
-        }
-
-        for (IClientAction a : DdmsPlugin.getDefault().getClientSpecificActions()) {
-            a.selectedClientChanged(selectedClient);
-        }
-    }
-
-    private void doSelectionChanged(IDevice selectedDevice) {
-        boolean validDevice = selectedDevice != null;
-
-        mCaptureAction.setEnabled(validDevice);
-        mViewUiAutomatorHierarchyAction.setEnabled(validDevice);
-        mSystraceAction.setEnabled(validDevice);
-    }
-
-    /**
-     * Place the actions in the ui.
-     */
-    private final void placeActions() {
-        IActionBars actionBars = getViewSite().getActionBars();
-
-        // first in the menu
-        IMenuManager menuManager = actionBars.getMenuManager();
-        menuManager.removeAll();
-        menuManager.add(mDebugAction);
-        menuManager.add(new Separator());
-        menuManager.add(mUpdateHeapAction);
-        menuManager.add(mHprofAction);
-        menuManager.add(mGcAction);
-        menuManager.add(new Separator());
-        menuManager.add(mUpdateThreadAction);
-        menuManager.add(mTracingAction);
-        menuManager.add(new Separator());
-        menuManager.add(mKillAppAction);
-        menuManager.add(new Separator());
-        menuManager.add(mCaptureAction);
-        menuManager.add(new Separator());
-        menuManager.add(mViewUiAutomatorHierarchyAction);
-        menuManager.add(new Separator());
-        menuManager.add(mSystraceAction);
-        menuManager.add(new Separator());
-        menuManager.add(mResetAdbAction);
-        for (IClientAction a : DdmsPlugin.getDefault().getClientSpecificActions()) {
-            menuManager.add(a.getAction());
-        }
-
-        // and then in the toolbar
-        IToolBarManager toolBarManager = actionBars.getToolBarManager();
-        toolBarManager.removeAll();
-        toolBarManager.add(mDebugAction);
-        toolBarManager.add(new Separator());
-        toolBarManager.add(mUpdateHeapAction);
-        toolBarManager.add(mHprofAction);
-        toolBarManager.add(mGcAction);
-        toolBarManager.add(new Separator());
-        toolBarManager.add(mUpdateThreadAction);
-        toolBarManager.add(mTracingAction);
-        toolBarManager.add(new Separator());
-        toolBarManager.add(mKillAppAction);
-        toolBarManager.add(new Separator());
-        toolBarManager.add(mCaptureAction);
-        toolBarManager.add(new Separator());
-        toolBarManager.add(mViewUiAutomatorHierarchyAction);
-        toolBarManager.add(new Separator());
-        toolBarManager.add(mSystraceAction);
-        for (IClientAction a : DdmsPlugin.getDefault().getClientSpecificActions()) {
-            toolBarManager.add(a.getAction());
-        }
-    }
-
-    @Override
-    public void clientChanged(final Client client, int changeMask) {
-        if ((changeMask & Client.CHANGE_METHOD_PROFILING_STATUS) == Client.CHANGE_METHOD_PROFILING_STATUS) {
-            if (mDeviceList.getSelectedClient() == client) {
-                mParentShell.getDisplay().asyncExec(new Runnable() {
-                    @Override
-                    public void run() {
-                        // force refresh of the button enabled state.
-                        doSelectionChanged(client);
-                    }
-                });
-            }
-        }
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.ddms/src/com/android/ide/eclipse/ddms/views/EmulatorControlView.java b/eclipse/plugins/com.android.ide.eclipse.ddms/src/com/android/ide/eclipse/ddms/views/EmulatorControlView.java
deleted file mode 100644
index 0dda7ef..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.ddms/src/com/android/ide/eclipse/ddms/views/EmulatorControlView.java
+++ /dev/null
@@ -1,42 +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.eclipse.ddms.views;
-
-import com.android.ddmuilib.EmulatorControlPanel;
-
-import org.eclipse.swt.widgets.Composite;
-
-public class EmulatorControlView extends SelectionDependentViewPart {
-
-    public static final String ID =
-        "com.android.ide.eclipse.ddms.views.EmulatorControlView"; //$NON-NLS-1$
-
-    private EmulatorControlPanel mPanel;
-
-    @Override
-    public void createPartControl(Composite parent) {
-        mPanel = new EmulatorControlPanel();
-        mPanel.createPanel(parent);
-        setSelectionDependentPanel(mPanel);
-    }
-
-    @Override
-    public void setFocus() {
-        mPanel.setFocus();
-    }
-
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.ddms/src/com/android/ide/eclipse/ddms/views/EventLogView.java b/eclipse/plugins/com.android.ide.eclipse.ddms/src/com/android/ide/eclipse/ddms/views/EventLogView.java
deleted file mode 100644
index 653f17f..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.ddms/src/com/android/ide/eclipse/ddms/views/EventLogView.java
+++ /dev/null
@@ -1,111 +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.eclipse.ddms.views;
-
-import com.android.ddmuilib.ImageLoader;
-import com.android.ddmuilib.log.event.EventLogPanel;
-import com.android.ide.eclipse.ddms.CommonAction;
-import com.android.ide.eclipse.ddms.i18n.Messages;
-
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.action.IToolBarManager;
-import org.eclipse.jface.action.Separator;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.IActionBars;
-
-public class EventLogView extends SelectionDependentViewPart {
-
-    private EventLogPanel mLogPanel;
-
-    @Override
-    public void createPartControl(Composite parent) {
-        ImageLoader loader = ImageLoader.getDdmUiLibLoader();
-
-        // create the external actions
-        CommonAction optionsAction = new CommonAction(Messages.EventLogView_Options);
-        optionsAction.setToolTipText(Messages.EventLogView_Opens_Options_Panel);
-        optionsAction.setImageDescriptor(loader.loadDescriptor("edit.png")); //$NON-NLS-1$
-
-        CommonAction clearLogAction = new CommonAction(Messages.EventLogView_Clear_Log);
-        clearLogAction.setToolTipText(Messages.EventLogView_Clears_Event_Log);
-        clearLogAction.setImageDescriptor(loader.loadDescriptor("clear.png")); //$NON-NLS-1$
-
-        CommonAction saveAction = new CommonAction(Messages.EventLogView_Save_Log);
-        saveAction.setToolTipText(Messages.EventLogView_Saves_Event_Log);
-        saveAction.setImageDescriptor(loader.loadDescriptor("save.png")); //$NON-NLS-1$
-
-        CommonAction loadAction = new CommonAction(Messages.EventLogView_Load_Log);
-        loadAction.setToolTipText(Messages.EventLogView_Loads_Event_Log);
-        loadAction.setImageDescriptor(loader.loadDescriptor("load.png")); //$NON-NLS-1$
-
-        CommonAction importBugAction = new CommonAction(Messages.EventLogView_Import_Bug_Report_Log);
-        importBugAction.setToolTipText(Messages.EventLogView_Imports_Bug_Report);
-        importBugAction.setImageDescriptor(loader.loadDescriptor("importBug.png")); //$NON-NLS-1$
-
-        placeActions(optionsAction, clearLogAction, saveAction, loadAction, importBugAction);
-
-        mLogPanel = new EventLogPanel();
-        mLogPanel
-                .setActions(optionsAction, clearLogAction, saveAction, loadAction, importBugAction);
-        mLogPanel.createPanel(parent);
-        setSelectionDependentPanel(mLogPanel);
-    }
-
-    @Override
-    public void setFocus() {
-        mLogPanel.setFocus();
-    }
-
-    @Override
-    public void dispose() {
-        if (mLogPanel != null) {
-            mLogPanel.stopEventLog(true);
-        }
-    }
-
-    /**
-     * Places the actions in the toolbar and in the menu.
-     * 
-     * @param importBugAction
-     */
-    private void placeActions(IAction optionAction, IAction clearAction, IAction saveAction,
-            IAction loadAction, CommonAction importBugAction) {
-        IActionBars actionBars = getViewSite().getActionBars();
-
-        // first in the menu
-        IMenuManager menuManager = actionBars.getMenuManager();
-        menuManager.add(clearAction);
-        menuManager.add(new Separator());
-        menuManager.add(saveAction);
-        menuManager.add(loadAction);
-        menuManager.add(importBugAction);
-        menuManager.add(new Separator());
-        menuManager.add(optionAction);
-
-        // and then in the toolbar
-        IToolBarManager toolBarManager = actionBars.getToolBarManager();
-        toolBarManager.add(clearAction);
-        toolBarManager.add(new Separator());
-        toolBarManager.add(saveAction);
-        toolBarManager.add(loadAction);
-        toolBarManager.add(importBugAction);
-        toolBarManager.add(new Separator());
-        toolBarManager.add(optionAction);
-    }
-
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.ddms/src/com/android/ide/eclipse/ddms/views/FileExplorerView.java b/eclipse/plugins/com.android.ide.eclipse.ddms/src/com/android/ide/eclipse/ddms/views/FileExplorerView.java
deleted file mode 100644
index 41796dc..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.ddms/src/com/android/ide/eclipse/ddms/views/FileExplorerView.java
+++ /dev/null
@@ -1,181 +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.eclipse.ddms.views;
-
-import com.android.ddmlib.Client;
-import com.android.ddmlib.IDevice;
-import com.android.ddmuilib.ImageLoader;
-import com.android.ddmuilib.explorer.DeviceExplorer;
-import com.android.ide.eclipse.ddms.CommonAction;
-import com.android.ide.eclipse.ddms.DdmsPlugin;
-import com.android.ide.eclipse.ddms.DdmsPlugin.ISelectionListener;
-import com.android.ide.eclipse.ddms.i18n.Messages;
-
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.action.IToolBarManager;
-import org.eclipse.jface.action.Separator;
-import org.eclipse.swt.graphics.Device;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.IActionBars;
-import org.eclipse.ui.ISharedImages;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.part.ViewPart;
-
-public class FileExplorerView extends ViewPart implements ISelectionListener {
-
-    public static final String ID = "com.android.ide.eclipse.ddms.views.FileExplorerView"; //$NON-NLS-1$
-
-    private final static String COLUMN_NAME =
-            DdmsPlugin.PLUGIN_ID + ".explorer.name"; //$NON-NLS-1S
-    private final static String COLUMN_SIZE =
-            DdmsPlugin.PLUGIN_ID + ".explorer.size"; //$NON-NLS-1S
-    private final static String COLUMN_DATE =
-            DdmsPlugin.PLUGIN_ID + ".explorer.data"; //$NON-NLS-1S
-    private final static String COLUMN_TIME =
-            DdmsPlugin.PLUGIN_ID + ".explorer.time"; //$NON-NLS-1S
-    private final static String COLUMN_PERMISSIONS =
-            DdmsPlugin.PLUGIN_ID + ".explorer.permissions"; //$NON-NLS-1S
-    private final static String COLUMN_INFO =
-            DdmsPlugin.PLUGIN_ID + ".explorer.info"; //$NON-NLS-1$
-
-    private DeviceExplorer mExplorer;
-
-    public FileExplorerView() {
-    }
-
-    @Override
-    public void createPartControl(Composite parent) {
-        ImageLoader loader = ImageLoader.getDdmUiLibLoader();
-
-        DeviceExplorer.COLUMN_NAME = COLUMN_NAME;
-        DeviceExplorer.COLUMN_SIZE = COLUMN_SIZE;
-        DeviceExplorer.COLUMN_DATE = COLUMN_DATE;
-        DeviceExplorer.COLUMN_TIME = COLUMN_TIME;
-        DeviceExplorer.COLUMN_PERMISSIONS = COLUMN_PERMISSIONS;
-        DeviceExplorer.COLUMN_INFO = COLUMN_INFO;
-
-        // device explorer
-        mExplorer = new DeviceExplorer();
-
-        mExplorer.setCustomImages(
-                PlatformUI.getWorkbench().getSharedImages().getImage(ISharedImages.IMG_OBJ_FILE),
-                PlatformUI.getWorkbench().getSharedImages().getImage(ISharedImages.IMG_OBJ_FOLDER),
-                null /* apk image */,
-                PlatformUI.getWorkbench().getSharedImages().getImage(ISharedImages.IMG_OBJ_ELEMENT)
-                );
-
-        // creates the actions
-        CommonAction pushAction = new CommonAction(Messages.FileExplorerView_Push_File) {
-            @Override
-            public void run() {
-                mExplorer.pushIntoSelection();
-            }
-        };
-        pushAction.setToolTipText(Messages.FileExplorerView_Push_File_Onto_Device);
-        pushAction.setImageDescriptor(loader.loadDescriptor("push.png")); //$NON-NLS-1$
-        pushAction.setEnabled(false);
-
-        CommonAction pullAction = new CommonAction(Messages.FileExplorerView_Pull_File) {
-            @Override
-            public void run() {
-                mExplorer.pullSelection();
-            }
-        };
-        pullAction.setToolTipText(Messages.FileExplorerView_Pull_File_From_File);
-        pullAction.setImageDescriptor(loader.loadDescriptor("pull.png")); //$NON-NLS-1$
-        pullAction.setEnabled(false);
-
-        CommonAction deleteAction = new CommonAction(Messages.FileExplorerView_Delete) {
-            @Override
-            public void run() {
-                mExplorer.deleteSelection();
-            }
-        };
-        deleteAction.setToolTipText(Messages.FileExplorerView_Delete_The_Selection);
-        deleteAction.setImageDescriptor(loader.loadDescriptor("delete.png")); //$NON-NLS-1$
-        deleteAction.setEnabled(false);
-
-        CommonAction createNewFolderAction = new CommonAction("New Folder") {
-            @Override
-            public void run() {
-                mExplorer.createNewFolderInSelection();
-            }
-        };
-        createNewFolderAction.setToolTipText("New Folder");
-        createNewFolderAction.setImageDescriptor(loader.loadDescriptor("add.png")); //$NON-NLS-1$
-        createNewFolderAction.setEnabled(false);
-
-        // set up the actions in the explorer
-        mExplorer.setActions(pushAction, pullAction, deleteAction, createNewFolderAction);
-
-        // and in the ui
-        IActionBars actionBars = getViewSite().getActionBars();
-        IMenuManager menuManager = actionBars.getMenuManager();
-        IToolBarManager toolBarManager = actionBars.getToolBarManager();
-
-        menuManager.add(pullAction);
-        menuManager.add(pushAction);
-        menuManager.add(new Separator());
-        menuManager.add(deleteAction);
-        menuManager.add(new Separator());
-        menuManager.add(createNewFolderAction);
-
-        toolBarManager.add(pullAction);
-        toolBarManager.add(pushAction);
-        toolBarManager.add(new Separator());
-        toolBarManager.add(deleteAction);
-        toolBarManager.add(new Separator());
-        toolBarManager.add(createNewFolderAction);
-
-        mExplorer.createPanel(parent);
-
-        DdmsPlugin.getDefault().addSelectionListener(this);
-    }
-
-    @Override
-    public void setFocus() {
-        mExplorer.setFocus();
-    }
-
-    /**
-     * Sent when a new {@link Client} is selected.
-     *
-     * @param selectedClient The selected client.
-     */
-    @Override
-    public void selectionChanged(Client selectedClient) {
-        // pass
-    }
-
-    /**
-     * Sent when a new {@link Device} is selected.
-     *
-     * @param selectedDevice the selected device.
-     */
-    @Override
-    public void selectionChanged(IDevice selectedDevice) {
-        mExplorer.switchDevice(selectedDevice);
-    }
-
-    /**
-     * Sent when there is no current selection.
-     */
-    public void selectionRemoved() {
-
-    }
-
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.ddms/src/com/android/ide/eclipse/ddms/views/HeapView.java b/eclipse/plugins/com.android.ide.eclipse.ddms/src/com/android/ide/eclipse/ddms/views/HeapView.java
deleted file mode 100644
index 5745e8e..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.ddms/src/com/android/ide/eclipse/ddms/views/HeapView.java
+++ /dev/null
@@ -1,47 +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.eclipse.ddms.views;
-
-import com.android.ddmuilib.HeapPanel;
-
-import org.eclipse.swt.widgets.Composite;
-
-public class HeapView extends TableView {
-
-    public static final String ID = "com.android.ide.eclipse.ddms.views.HeapView"; //$NON-NLS-1$
-    private HeapPanel mPanel;
-
-    public HeapView() {
-    }
-
-    @Override
-    public void createPartControl(Composite parent) {
-        mPanel = new HeapPanel();
-        mPanel.createPanel(parent);
-
-        setSelectionDependentPanel(mPanel);
-
-        // listen to focus changes for table(s) of the panel.
-        setupTableFocusListener(mPanel, parent);
-    }
-
-    @Override
-    public void setFocus() {
-        mPanel.setFocus();
-    }
-
-}
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
deleted file mode 100644
index 9f78c4a..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.ddms/src/com/android/ide/eclipse/ddms/views/LogCatView.java
+++ /dev/null
@@ -1,120 +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.eclipse.ddms.views;
-
-import com.android.ddmlib.logcat.LogCatMessage;
-import com.android.ddmuilib.logcat.ILogCatMessageSelectionListener;
-import com.android.ddmuilib.logcat.LogCatPanel;
-import com.android.ddmuilib.logcat.LogCatStackTraceParser;
-import com.android.ide.eclipse.ddms.DdmsPlugin;
-import com.android.ide.eclipse.ddms.JavaSourceRevealer;
-import com.android.ide.eclipse.ddms.i18n.Messages;
-import com.android.ide.eclipse.ddms.preferences.PreferenceInitializer;
-
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.swt.dnd.Clipboard;
-import org.eclipse.swt.layout.FillLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.IActionBars;
-import org.eclipse.ui.actions.ActionFactory;
-
-public class LogCatView extends SelectionDependentViewPart {
-    /** LogCatView ID as defined in plugin.xml. */
-    public static final String ID = "com.android.ide.eclipse.ddms.views.LogCatView"; //$NON-NLS-1$
-
-    /** Switch perspective when a Java file is opened from logcat view. */
-    public static final boolean DEFAULT_SWITCH_PERSPECTIVE = true;
-
-    /** Target perspective to open when a Java file is opened from logcat view. */
-    public static final String DEFAULT_PERSPECTIVE_ID =
-            "org.eclipse.jdt.ui.JavaPerspective"; //$NON-NLS-1$
-
-    private LogCatPanel mLogCatPanel;
-    private LogCatStackTraceParser mStackTraceParser = new LogCatStackTraceParser();
-
-    private Clipboard mClipboard;
-
-    @Override
-    public void createPartControl(Composite parent) {
-        parent.setLayout(new FillLayout());
-
-        IPreferenceStore prefStore = DdmsPlugin.getDefault().getPreferenceStore();
-        mLogCatPanel = new LogCatPanel(prefStore);
-        mLogCatPanel.createPanel(parent);
-        setSelectionDependentPanel(mLogCatPanel);
-
-        mLogCatPanel.addLogCatMessageSelectionListener(new ILogCatMessageSelectionListener() {
-            @Override
-            public void messageDoubleClicked(LogCatMessage m) {
-                onDoubleClick(m);
-            }
-        });
-
-        mClipboard = new Clipboard(parent.getDisplay());
-        IActionBars actionBars = getViewSite().getActionBars();
-        actionBars.setGlobalActionHandler(ActionFactory.COPY.getId(),
-                new Action(Messages.LogCatView_Copy) {
-            @Override
-            public void run() {
-                mLogCatPanel.copySelectionToClipboard(mClipboard);
-            }
-        });
-
-        actionBars.setGlobalActionHandler(ActionFactory.SELECT_ALL.getId(),
-                new Action(Messages.LogCatView_Select_All) {
-            @Override
-            public void run() {
-                mLogCatPanel.selectAll();
-            }
-        });
-
-        actionBars.setGlobalActionHandler(ActionFactory.FIND.getId(),
-                new Action("Find") {
-            @Override
-            public void run() {
-                mLogCatPanel.showFindDialog();
-            }
-        });
-    }
-
-    @Override
-    public void setFocus() {
-    }
-
-    private void onDoubleClick(LogCatMessage m) {
-        String msg = m.getMessage();
-        if (!mStackTraceParser.isValidExceptionTrace(msg)) {
-            return;
-        }
-
-        IPreferenceStore store = DdmsPlugin.getDefault().getPreferenceStore();
-        String perspectiveId = null;
-        if (store.getBoolean(PreferenceInitializer.ATTR_SWITCH_PERSPECTIVE)) {
-            perspectiveId = store.getString(PreferenceInitializer.ATTR_PERSPECTIVE_ID);
-        }
-
-
-        String fileName = mStackTraceParser.getFileName(msg);
-        int lineNumber = mStackTraceParser.getLineNumber(msg);
-        String methodName = mStackTraceParser.getMethodName(msg);
-        JavaSourceRevealer.revealMethod(methodName, fileName, lineNumber, perspectiveId);
-    }
-
-    public void selectTransientAppFilter(String appName) {
-        mLogCatPanel.selectTransientAppFilter(appName);
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.ddms/src/com/android/ide/eclipse/ddms/views/NativeHeapView.java b/eclipse/plugins/com.android.ide.eclipse.ddms/src/com/android/ide/eclipse/ddms/views/NativeHeapView.java
deleted file mode 100644
index 91c8022..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.ddms/src/com/android/ide/eclipse/ddms/views/NativeHeapView.java
+++ /dev/null
@@ -1,47 +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.eclipse.ddms.views;
-
-import com.android.ddmuilib.NativeHeapPanel;
-
-import org.eclipse.swt.widgets.Composite;
-
-public class NativeHeapView extends TableView {
-
-    public static final String ID =
-        "com.android.ide.eclipse.ddms.views.NativeHeapView"; //$NON-NLS-1$
-    private NativeHeapPanel mPanel;
-
-    public NativeHeapView() {
-    }
-
-    @Override
-    public void createPartControl(Composite parent) {
-        mPanel = new NativeHeapPanel();
-        mPanel.createPanel(parent);
-        
-        setSelectionDependentPanel(mPanel);
-
-        // listen to focus changes for table(s) of the panel.
-        setupTableFocusListener(mPanel, parent);
-    }
-
-    @Override
-    public void setFocus() {
-        mPanel.setFocus();
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.ddms/src/com/android/ide/eclipse/ddms/views/NetworkStatisticsView.java b/eclipse/plugins/com.android.ide.eclipse.ddms/src/com/android/ide/eclipse/ddms/views/NetworkStatisticsView.java
deleted file mode 100644
index f90189c..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.ddms/src/com/android/ide/eclipse/ddms/views/NetworkStatisticsView.java
+++ /dev/null
@@ -1,47 +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.eclipse.ddms.views;
-
-import com.android.ddmuilib.net.NetworkPanel;
-
-import org.eclipse.swt.widgets.Composite;
-
-public class NetworkStatisticsView extends TableView {
-    public static final String ID = "com.android.ide.eclipse.ddms.views.NetworkStatsView";
-
-    private NetworkPanel mPanel;
-
-    public NetworkStatisticsView() {
-    }
-
-    @Override
-    public void createPartControl(Composite parent) {
-        mPanel = new NetworkPanel();
-        mPanel.createPanel(parent);
-
-        setSelectionDependentPanel(mPanel);
-
-        // listen to focus changes for table(s) of the panel.
-        setupTableFocusListener(mPanel, parent);
-    }
-
-    @Override
-    public void setFocus() {
-        mPanel.setFocus();
-    }
-
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.ddms/src/com/android/ide/eclipse/ddms/views/OldLogCatView.java b/eclipse/plugins/com.android.ide.eclipse.ddms/src/com/android/ide/eclipse/ddms/views/OldLogCatView.java
deleted file mode 100644
index d0b1fb4..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.ddms/src/com/android/ide/eclipse/ddms/views/OldLogCatView.java
+++ /dev/null
@@ -1,385 +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.eclipse.ddms.views;
-
-import com.android.ddmlib.Log.LogLevel;
-import com.android.ddmuilib.ImageLoader;
-import com.android.ddmuilib.logcat.LogColors;
-import com.android.ddmuilib.logcat.LogFilter;
-import com.android.ddmuilib.logcat.LogPanel;
-import com.android.ddmuilib.logcat.LogPanel.ILogFilterStorageManager;
-import com.android.ddmuilib.logcat.LogPanel.LogCatViewInterface;
-import com.android.ide.eclipse.ddms.CommonAction;
-import com.android.ide.eclipse.ddms.DdmsPlugin;
-import com.android.ide.eclipse.ddms.i18n.Messages;
-import com.android.ide.eclipse.ddms.preferences.PreferenceInitializer;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.action.IToolBarManager;
-import org.eclipse.jface.action.Separator;
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.swt.dnd.Clipboard;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.FontData;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.ui.IActionBars;
-import org.eclipse.ui.IPerspectiveRegistry;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.WorkbenchException;
-import org.eclipse.ui.actions.ActionFactory;
-import org.eclipse.ui.ide.IDE;
-
-import java.util.ArrayList;
-
-/**
- * The log cat view displays log output from the current device selection.
- */
-public final class OldLogCatView extends SelectionDependentViewPart implements LogCatViewInterface {
-
-    public static final String ID = "com.android.ide.eclipse.ddms.views.OldLogCatView"; //$NON-NLS-1$
-
-    private static final String PREFS_COL_TIME =
-            DdmsPlugin.PLUGIN_ID + ".logcat.time"; //$NON-NLS-1$
-    private static final String PREFS_COL_LEVEL =
-            DdmsPlugin.PLUGIN_ID + ".logcat.level"; //$NON-NLS-1$
-    private static final String PREFS_COL_PID =
-            DdmsPlugin.PLUGIN_ID + ".logcat.pid"; //$NON-NLS-1$
-    private static final String PREFS_COL_TAG =
-            DdmsPlugin.PLUGIN_ID + ".logcat.tag"; //$NON-NLS-1$
-    private static final String PREFS_COL_MESSAGE =
-            DdmsPlugin.PLUGIN_ID + ".logcat.message"; //$NON-NLS-1$
-
-    private static final String PREFS_FILTERS =
-            DdmsPlugin.PLUGIN_ID + ".logcat.filters"; //$NON-NLS-1$
-
-    public static final String CHOICE_METHOD_DECLARATION =
-            DdmsPlugin.PLUGIN_ID + ".logcat.MethodDeclaration"; //$NON-NLS-1$
-    public static final String CHOICE_ERROR_LINE =
-            DdmsPlugin.PLUGIN_ID + ".logcat.ErrorLine"; //$NON-NLS-1$
-
-    /* Default values for the switch of perspective. */
-    public static final boolean DEFAULT_SWITCH_PERSPECTIVE = true;
-    public static final String DEFAULT_PERSPECTIVE_ID = "org.eclipse.jdt.ui.JavaPerspective"; //$NON-NLS-1$
-    private static OldLogCatView sThis;
-    private LogPanel mLogPanel;
-
-    private CommonAction mCreateFilterAction;
-    private CommonAction mDeleteFilterAction;
-    private CommonAction mEditFilterAction;
-    private CommonAction mExportAction;
-
-    private CommonAction[] mLogLevelActions;
-    private String[] mLogLevelIcons = {
-            "v.png", //$NON-NLS-1S
-            "d.png", //$NON-NLS-1S
-            "i.png", //$NON-NLS-1S
-            "w.png", //$NON-NLS-1S
-            "e.png", //$NON-NLS-1S
-    };
-
-    private Action mClearAction;
-
-    private Clipboard mClipboard;
-
-    /**
-     * An implementation of {@link ILogFilterStorageManager} to bridge to the
-     * eclipse preference store, and saves the log filters.
-     */
-    private final class FilterStorage implements ILogFilterStorageManager {
-
-        @Override
-        public LogFilter[] getFilterFromStore() {
-            String filterPrefs = DdmsPlugin.getDefault().getPreferenceStore().getString(
-                    PREFS_FILTERS);
-
-            // split in a string per filter
-            String[] filters = filterPrefs.split("\\|"); //$NON-NLS-1$
-
-            ArrayList<LogFilter> list =
-                    new ArrayList<LogFilter>(filters.length);
-
-            for (String f : filters) {
-                if (f.length() > 0) {
-                    LogFilter logFilter = new LogFilter();
-                    if (logFilter.loadFromString(f)) {
-                        list.add(logFilter);
-                    }
-                }
-            }
-
-            return list.toArray(new LogFilter[list.size()]);
-        }
-
-        @Override
-        public void saveFilters(LogFilter[] filters) {
-            StringBuilder sb = new StringBuilder();
-            for (LogFilter f : filters) {
-                String filterString = f.toString();
-                sb.append(filterString);
-                sb.append('|');
-            }
-
-            DdmsPlugin.getDefault().getPreferenceStore().setValue(PREFS_FILTERS, sb.toString());
-        }
-
-        @Override
-        public boolean requiresDefaultFilter() {
-            return true;
-        }
-    }
-
-    public OldLogCatView() {
-        sThis = this;
-        LogPanel.PREFS_TIME = PREFS_COL_TIME;
-        LogPanel.PREFS_LEVEL = PREFS_COL_LEVEL;
-        LogPanel.PREFS_PID = PREFS_COL_PID;
-        LogPanel.PREFS_TAG = PREFS_COL_TAG;
-        LogPanel.PREFS_MESSAGE = PREFS_COL_MESSAGE;
-    }
-
-    /**
-     * Returns the singleton instance.
-     */
-    public static OldLogCatView getInstance() {
-        return sThis;
-    }
-
-    /**
-     * Sets the display font.
-     *
-     * @param font The font.
-     */
-    public static void setFont(Font font) {
-        if (sThis != null && sThis.mLogPanel != null) {
-            sThis.mLogPanel.setFont(font);
-        }
-    }
-
-    @Override
-    public void createPartControl(Composite parent) {
-        Display d = parent.getDisplay();
-        LogColors colors = new LogColors();
-
-        ImageLoader loader = ImageLoader.getDdmUiLibLoader();
-
-        colors.infoColor = new Color(d, 0, 127, 0);
-        colors.debugColor = new Color(d, 0, 0, 127);
-        colors.errorColor = new Color(d, 255, 0, 0);
-        colors.warningColor = new Color(d, 255, 127, 0);
-        colors.verboseColor = new Color(d, 0, 0, 0);
-
-        mCreateFilterAction = new CommonAction(Messages.LogCatView_Create_Filter) {
-            @Override
-            public void run() {
-                mLogPanel.addFilter();
-            }
-        };
-        mCreateFilterAction.setToolTipText(Messages.LogCatView_Create_Filter_Tooltip);
-        mCreateFilterAction.setImageDescriptor(loader.loadDescriptor("add.png")); //$NON-NLS-1$
-
-        mEditFilterAction = new CommonAction(Messages.LogCatView_Edit_Filter) {
-            @Override
-            public void run() {
-                mLogPanel.editFilter();
-            }
-        };
-        mEditFilterAction.setToolTipText(Messages.LogCatView_Edit_Filter_Tooltip);
-        mEditFilterAction.setImageDescriptor(loader.loadDescriptor("edit.png")); //$NON-NLS-1$
-
-        mDeleteFilterAction = new CommonAction(Messages.LogCatView_Delete_Filter) {
-            @Override
-            public void run() {
-                mLogPanel.deleteFilter();
-            }
-        };
-        mDeleteFilterAction.setToolTipText(Messages.LogCatView_Delete_Filter_Tooltip);
-        mDeleteFilterAction.setImageDescriptor(loader.loadDescriptor("delete.png")); //$NON-NLS-1$
-
-        mExportAction = new CommonAction(Messages.LogCatView_Export_Selection_As_Text) {
-            @Override
-            public void run() {
-                mLogPanel.save();
-            }
-        };
-        mExportAction.setToolTipText(Messages.LogCatView_Export_Selection_As_Text_Tooltip);
-        mExportAction.setImageDescriptor(loader.loadDescriptor("save.png")); //$NON-NLS-1$
-
-        LogLevel[] levels = LogLevel.values();
-        mLogLevelActions = new CommonAction[mLogLevelIcons.length];
-        for (int i = 0; i < mLogLevelActions.length; i++) {
-            String name = levels[i].getStringValue();
-            mLogLevelActions[i] = new CommonAction(name, IAction.AS_CHECK_BOX) {
-                @Override
-                public void run() {
-                    // disable the other actions and record current index
-                    for (int j = 0; j < mLogLevelActions.length; j++) {
-                        Action a = mLogLevelActions[j];
-                        if (a == this) {
-                            a.setChecked(true);
-
-                            // set the log level
-                            mLogPanel.setCurrentFilterLogLevel(j + 2);
-                        } else {
-                            a.setChecked(false);
-                        }
-                    }
-                }
-            };
-
-            mLogLevelActions[i].setToolTipText(name);
-            mLogLevelActions[i].setImageDescriptor(loader.loadDescriptor(mLogLevelIcons[i]));
-        }
-
-        mClearAction = new Action(Messages.LogCatView_Clear_Log) {
-            @Override
-            public void run() {
-                mLogPanel.clear();
-            }
-        };
-        mClearAction.setImageDescriptor(loader.loadDescriptor("clear.png")); //$NON-NLS-1$
-
-        // now create the log view
-        mLogPanel = new LogPanel(colors, new FilterStorage(), LogPanel.FILTER_MANUAL);
-        mLogPanel.setLogCatViewInterface(this);
-        mLogPanel.setActions(mDeleteFilterAction, mEditFilterAction, mLogLevelActions);
-
-        // get the font
-        String fontStr = DdmsPlugin.getDefault().getPreferenceStore().getString(
-                PreferenceInitializer.ATTR_LOGCAT_FONT);
-        if (fontStr != null) {
-            FontData data = new FontData(fontStr);
-
-            if (fontStr != null) {
-                mLogPanel.setFont(new Font(parent.getDisplay(), data));
-            }
-        }
-
-        mLogPanel.createPanel(parent);
-        setSelectionDependentPanel(mLogPanel);
-
-        // place the actions.
-        placeActions();
-
-        // setup the copy action
-        mClipboard = new Clipboard(d);
-        IActionBars actionBars = getViewSite().getActionBars();
-        actionBars.setGlobalActionHandler(ActionFactory.COPY.getId(), new Action(
-                Messages.LogCatView_Copy) {
-            @Override
-            public void run() {
-                mLogPanel.copy(mClipboard);
-            }
-        });
-
-        // setup the select all action
-        actionBars.setGlobalActionHandler(ActionFactory.SELECT_ALL.getId(),
-                new Action(Messages.LogCatView_Select_All) {
-                    @Override
-                    public void run() {
-                        mLogPanel.selectAll();
-                    }
-                });
-    }
-
-    @Override
-    public void dispose() {
-        mLogPanel.stopLogCat(true);
-        mClipboard.dispose();
-    }
-
-    @Override
-    public void setFocus() {
-        mLogPanel.setFocus();
-    }
-
-    /**
-     * Place the actions in the ui.
-     */
-    private void placeActions() {
-        IActionBars actionBars = getViewSite().getActionBars();
-
-        // first in the menu
-        IMenuManager menuManager = actionBars.getMenuManager();
-        menuManager.add(mCreateFilterAction);
-        menuManager.add(mEditFilterAction);
-        menuManager.add(mDeleteFilterAction);
-        menuManager.add(new Separator());
-        menuManager.add(mClearAction);
-        menuManager.add(new Separator());
-        menuManager.add(mExportAction);
-
-        // and then in the toolbar
-        IToolBarManager toolBarManager = actionBars.getToolBarManager();
-        for (CommonAction a : mLogLevelActions) {
-            toolBarManager.add(a);
-        }
-        toolBarManager.add(new Separator());
-        toolBarManager.add(mCreateFilterAction);
-        toolBarManager.add(mEditFilterAction);
-        toolBarManager.add(mDeleteFilterAction);
-        toolBarManager.add(new Separator());
-        toolBarManager.add(mClearAction);
-    }
-
-    void openFile(IFile file, IMarker marker) {
-        try {
-            IWorkbenchPage page = getViewSite().getWorkbenchWindow()
-                    .getActivePage();
-            if (page != null) {
-                IDE.openEditor(page, marker);
-                marker.delete();
-            }
-        } catch (CoreException e) {
-            Status s = new Status(Status.ERROR, DdmsPlugin.PLUGIN_ID, e.getMessage(), e);
-            DdmsPlugin.getDefault().getLog().log(s);
-        }
-    }
-
-    void switchPerspective() {
-        IPreferenceStore store = DdmsPlugin.getDefault().getPreferenceStore();
-        if (store.getBoolean(PreferenceInitializer.ATTR_SWITCH_PERSPECTIVE)) {
-            IWorkbench workbench = PlatformUI.getWorkbench();
-            IWorkbenchWindow window = workbench.getActiveWorkbenchWindow();
-            IPerspectiveRegistry perspectiveRegistry = workbench.getPerspectiveRegistry();
-            String perspectiveId = store.getString(PreferenceInitializer.ATTR_PERSPECTIVE_ID);
-            if (perspectiveId != null
-                    && perspectiveId.length() > 0
-                    && perspectiveRegistry.findPerspectiveWithId(perspectiveId) != null) {
-                try {
-                    workbench.showPerspective(perspectiveId, window);
-                } catch (WorkbenchException e) {
-                    e.printStackTrace();
-                }
-            }
-        }
-    }
-
-    @Override
-    public void onDoubleClick() {
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.ddms/src/com/android/ide/eclipse/ddms/views/SelectionDependentViewPart.java b/eclipse/plugins/com.android.ide.eclipse.ddms/src/com/android/ide/eclipse/ddms/views/SelectionDependentViewPart.java
deleted file mode 100644
index 3326d01..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.ddms/src/com/android/ide/eclipse/ddms/views/SelectionDependentViewPart.java
+++ /dev/null
@@ -1,71 +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.eclipse.ddms.views;
-
-import com.android.ddmlib.Client;
-import com.android.ddmlib.IDevice;
-import com.android.ddmuilib.SelectionDependentPanel;
-import com.android.ide.eclipse.ddms.DdmsPlugin;
-import com.android.ide.eclipse.ddms.DdmsPlugin.ISelectionListener;
-
-import org.eclipse.swt.graphics.Device;
-import org.eclipse.ui.part.ViewPart;
-
-/**
- * A Workbench {@link ViewPart} that requires {@link Device}/{@link Client} selection notifications
- * from {@link DdmsPlugin} through the {@link ISelectionListener} interface.
- */
-public abstract class SelectionDependentViewPart extends ViewPart implements ISelectionListener {
-
-    private SelectionDependentPanel mPanel;
-
-    protected final void setSelectionDependentPanel(SelectionDependentPanel panel) {
-        // remember the panel
-        mPanel = panel;
-
-        // and add ourself as listener of selection events.
-        DdmsPlugin.getDefault().addSelectionListener(this);
-    }
-
-    @Override
-    public void dispose() {
-        DdmsPlugin.getDefault().removeSelectionListener(this);
-        super.dispose();
-    }
-
-    /**
-     * Sent when a new {@link Client} is selected.
-     * @param selectedClient The selected client.
-     *
-     * @see ISelectionListener
-     */
-    @Override
-    public final void selectionChanged(Client selectedClient) {
-        mPanel.clientSelected(selectedClient);
-    }
-
-    /**
-     * Sent when a new {@link Device} is selected.
-     * @param selectedDevice the selected device.
-     *
-     * @see ISelectionListener
-     */
-    @Override
-    public final void selectionChanged(IDevice selectedDevice) {
-        mPanel.deviceSelected(selectedDevice);
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.ddms/src/com/android/ide/eclipse/ddms/views/SysInfoView.java b/eclipse/plugins/com.android.ide.eclipse.ddms/src/com/android/ide/eclipse/ddms/views/SysInfoView.java
deleted file mode 100644
index e493925..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.ddms/src/com/android/ide/eclipse/ddms/views/SysInfoView.java
+++ /dev/null
@@ -1,29 +0,0 @@
-package com.android.ide.eclipse.ddms.views;
-
-import com.android.ddmuilib.SysinfoPanel;
-
-import org.eclipse.swt.widgets.Composite;
-
-public class SysInfoView extends SelectionDependentViewPart {
-    public static final String ID = "com.android.ide.eclipse.ddms.views.SysInfoView"; //$NON-NLS-1$
-
-    private SysinfoPanel mSysInfoPanel;
-
-    @Override
-    public void createPartControl(Composite parent) {
-        mSysInfoPanel = new SysinfoPanel();
-        mSysInfoPanel.createPanel(parent);
-        setSelectionDependentPanel(mSysInfoPanel);
-    }
-
-    @Override
-    public void setFocus() {
-        mSysInfoPanel.setFocus();
-    }
-
-    @Override
-    public void dispose() {
-        mSysInfoPanel.dispose();
-        super.dispose();
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.ddms/src/com/android/ide/eclipse/ddms/views/TableView.java b/eclipse/plugins/com.android.ide.eclipse.ddms/src/com/android/ide/eclipse/ddms/views/TableView.java
deleted file mode 100644
index 1f9f0db..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.ddms/src/com/android/ide/eclipse/ddms/views/TableView.java
+++ /dev/null
@@ -1,101 +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.eclipse.ddms.views;
-
-import com.android.ddmuilib.ITableFocusListener;
-import com.android.ddmuilib.ITableFocusListener.IFocusedTableActivator;
-import com.android.ddmuilib.TablePanel;
-import com.android.ide.eclipse.ddms.i18n.Messages;
-
-import org.eclipse.jface.action.Action;
-import org.eclipse.swt.dnd.Clipboard;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.IActionBars;
-import org.eclipse.ui.actions.ActionFactory;
-
-/**
- * Base class for view containing Table that needs to support copy, and select
- * all.
- */
-public abstract class TableView extends SelectionDependentViewPart {
-
-    /** Activator for the current Table that has the focus */
-    IFocusedTableActivator mActivator = null;
-
-    private Clipboard mClipboard;
-
-    private Action mCopyAction;
-    private Action mSelectAllAction;
-
-    /**
-     * Setup the listener for the Table objects of <code>Panel</code>, and setup
-     * the copy and select all actions.
-     *
-     * @param panel The panel to setup
-     * @param parent The parent composite of the Panel's content.
-     */
-    void setupTableFocusListener(TablePanel panel, Composite parent) {
-        panel.setTableFocusListener(new ITableFocusListener() {
-            @Override
-            public void focusGained(IFocusedTableActivator activator) {
-                mActivator = activator;
-                mCopyAction.setEnabled(true);
-                mSelectAllAction.setEnabled(true);
-            }
-
-            @Override
-            public void focusLost(IFocusedTableActivator activator) {
-                if (activator == mActivator) {
-                    mActivator = null;
-                    mCopyAction.setEnabled(false);
-                    mSelectAllAction.setEnabled(false);
-                }
-            }
-        });
-
-        // setup the copy action
-        mClipboard = new Clipboard(parent.getDisplay());
-        IActionBars actionBars = getViewSite().getActionBars();
-        actionBars.setGlobalActionHandler(ActionFactory.COPY.getId(),
-                mCopyAction = new Action(Messages.TableView_Copy) {
-                    @Override
-                    public void run() {
-                        if (mActivator != null) {
-                            mActivator.copy(mClipboard);
-                        }
-                    }
-                });
-
-        // setup the select all action
-        actionBars.setGlobalActionHandler(ActionFactory.SELECT_ALL.getId(),
-                mSelectAllAction = new Action(Messages.TableView_Select_All) {
-                    @Override
-                    public void run() {
-                        if (mActivator != null) {
-                            mActivator.selectAll();
-                        }
-                    }
-                });
-
-    }
-
-    @Override
-    public void dispose() {
-        super.dispose();
-        mClipboard.dispose();
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.ddms/src/com/android/ide/eclipse/ddms/views/ThreadView.java b/eclipse/plugins/com.android.ide.eclipse.ddms/src/com/android/ide/eclipse/ddms/views/ThreadView.java
deleted file mode 100644
index 9d4eeb7..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.ddms/src/com/android/ide/eclipse/ddms/views/ThreadView.java
+++ /dev/null
@@ -1,47 +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.eclipse.ddms.views;
-
-import com.android.ddmuilib.ThreadPanel;
-
-import org.eclipse.swt.widgets.Composite;
-
-public class ThreadView extends TableView {
-
-    public static final String ID =
-        "com.android.ide.eclipse.ddms.views.ThreadView"; //$NON-NLS-1$
-    private ThreadPanel mPanel;
-
-    public ThreadView() {
-    }
-
-    @Override
-    public void createPartControl(Composite parent) {
-        mPanel = new ThreadPanel();
-        mPanel.createPanel(parent);
-
-        setSelectionDependentPanel(mPanel);
-
-        // listen to focus changes for table(s) of the panel.
-        setupTableFocusListener(mPanel, parent);
-    }
-
-    @Override
-    public void setFocus() {
-        mPanel.setFocus();
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.gldebugger.tests/.classpath b/eclipse/plugins/com.android.ide.eclipse.gldebugger.tests/.classpath
deleted file mode 100644
index 2abf483..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.gldebugger.tests/.classpath
+++ /dev/null
@@ -1,11 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="src" path="src"/>
-    <classpathentry kind="lib" path="/plugin-gldebugger/libs/host-libprotobuf-java-2.3.0-lite.jar"/>
-    <classpathentry kind="lib" path="/plugin-gldebugger/libs/liblzf-1.0.jar"/>
-    <classpathentry combineaccessrules="false" kind="src" path="/ddmlib"/>
-    <classpathentry combineaccessrules="false" kind="src" path="/ddmuilib"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/eclipse/plugins/com.android.ide.eclipse.gldebugger.tests/.project b/eclipse/plugins/com.android.ide.eclipse.gldebugger.tests/.project
deleted file mode 100644
index ef19c36..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.gldebugger.tests/.project
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>plugin-gldebugger-tests</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.PluginNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/eclipse/plugins/com.android.ide.eclipse.gldebugger.tests/META-INF/MANIFEST.MF b/eclipse/plugins/com.android.ide.eclipse.gldebugger.tests/META-INF/MANIFEST.MF
deleted file mode 100644
index 240874b..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.gldebugger.tests/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,10 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: gldebugger-tests
-Bundle-SymbolicName: com.android.ide.eclipse.gldebugger.tests
-Bundle-Version: 24.3.3.qualifier
-Bundle-RequiredExecutionEnvironment: J2SE-1.5
-Require-Bundle: org.junit4;bundle-version="4.5.0";resolution:=optional,
- com.android.ide.eclipse.gldebugger,
- org.eclipse.swt,
- org.junit;bundle-version="4.11.0";resolution:=optional
diff --git a/eclipse/plugins/com.android.ide.eclipse.gldebugger.tests/build.properties b/eclipse/plugins/com.android.ide.eclipse.gldebugger.tests/build.properties
deleted file mode 100644
index 34d2e4d..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.gldebugger.tests/build.properties
+++ /dev/null
@@ -1,4 +0,0 @@
-source.. = src/
-output.. = bin/
-bin.includes = META-INF/,\
-               .
diff --git a/eclipse/plugins/com.android.ide.eclipse.gldebugger.tests/pom.xml b/eclipse/plugins/com.android.ide.eclipse.gldebugger.tests/pom.xml
deleted file mode 100644
index f87e88a..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.gldebugger.tests/pom.xml
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-    <modelVersion>4.0.0</modelVersion>
-
-    <version>24.3.3-SNAPSHOT</version>
-    <artifactId>com.android.ide.eclipse.gldebugger.tests</artifactId>
-    <packaging>eclipse-test-plugin</packaging>
-    <name>gldebugger.tests</name>
-
-    <parent>
-        <relativePath>../../pom.xml</relativePath>
-        <groupId>adt.group</groupId>
-        <artifactId>parent</artifactId>
-        <version>1.0.0-SNAPSHOT</version>
-    </parent>
-</project>
diff --git a/eclipse/plugins/com.android.ide.eclipse.gldebugger.tests/src/com/android/ide/eclipse/gltrace/format/GLAPISpecTest.java b/eclipse/plugins/com.android.ide.eclipse.gldebugger.tests/src/com/android/ide/eclipse/gltrace/format/GLAPISpecTest.java
deleted file mode 100644
index 4a4d070..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.gldebugger.tests/src/com/android/ide/eclipse/gltrace/format/GLAPISpecTest.java
+++ /dev/null
@@ -1,74 +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.eclipse.gltrace.format;
-
-import static org.junit.Assert.*;
-
-import com.android.ide.eclipse.gltrace.GLProtoBuf.GLMessage.DataType.Type;
-
-import org.junit.Test;
-
-import java.util.Arrays;
-import java.util.List;
-
-public class GLAPISpecTest {
-    @Test
-    public void testParser() {
-        String returnType = "void";
-        String funcName = "glDiscardFramebufferEXT";
-        List<String> args = Arrays.asList(
-                "GLenum target",
-                "GLsizei numAttachments",
-                "const GLenum* attachments");
-
-        GLAPISpec spec = GLAPISpec.parseLine(createSpec(returnType, funcName, args));
-
-        assertEquals(Type.VOID, spec.getReturnValue().getDataType());
-        assertEquals(returnType, spec.getReturnValue().getCType());
-        assertEquals(funcName, spec.getFunction());
-
-        List<GLDataTypeSpec> argSpecs = spec.getArgs();
-        assertEquals(argSpecs.size(), args.size());
-
-        GLDataTypeSpec argSpec = argSpecs.get(0);
-        assertEquals(argSpec.getArgName(), "target");
-        assertEquals(argSpec.getDataType(), Type.ENUM);
-        assertEquals(argSpec.isPointer(), false);
-
-        argSpec = argSpecs.get(2);
-        assertEquals(argSpec.getArgName(), "attachments");
-        assertEquals(argSpec.getDataType(), Type.ENUM);
-        assertEquals(argSpec.isPointer(), true);
-    }
-
-    private String createSpec(String returnType, String funcName, List<String> args) {
-        StringBuffer sb = new StringBuffer();
-        sb.append(String.format("%s, %s", returnType, funcName));
-
-        if (args != null) {
-            sb.append(", ");
-            for (int i = 0; i < args.size(); i++) {
-                sb.append(args.get(i));
-                if (i != args.size() - 1) {
-                    sb.append(", ");
-                }
-            }
-        }
-
-        return sb.toString();
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.gldebugger.tests/src/com/android/ide/eclipse/gltrace/format/GLMessageFormatterTest.java b/eclipse/plugins/com.android.ide.eclipse.gldebugger.tests/src/com/android/ide/eclipse/gltrace/format/GLMessageFormatterTest.java
deleted file mode 100644
index 5d18041..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.gldebugger.tests/src/com/android/ide/eclipse/gltrace/format/GLMessageFormatterTest.java
+++ /dev/null
@@ -1,195 +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.eclipse.gltrace.format;
-
-import static org.junit.Assert.*;
-
-import com.android.ide.eclipse.gltrace.GLEnum;
-import com.android.ide.eclipse.gltrace.GLProtoBuf.GLMessage;
-import com.android.ide.eclipse.gltrace.GLProtoBuf.GLMessage.Builder;
-import com.android.ide.eclipse.gltrace.GLProtoBuf.GLMessage.DataType;
-import com.android.ide.eclipse.gltrace.GLProtoBuf.GLMessage.DataType.Type;
-import com.android.ide.eclipse.gltrace.GLProtoBuf.GLMessage.Function;
-import com.google.protobuf.ByteString;
-
-import org.junit.Test;
-
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-public class GLMessageFormatterTest {
-    private static final List<String> API_SPECS = Arrays.asList(
-            "void, glBindBuffer, GLenum target, GLuint buffer",
-            "const GLchar*, glGetString, GLenum name",
-            "void, glMultMatrixf, const GLfloat* m",
-            "GLenum, eglBindAPI, GLEnum arg",
-            "void, glGetActiveAttrib, GLenum* type",
-            "void, glTexImage2D, GLint level, GLsizei width, const GLvoid* pixels");
-    private static GLMessageFormatter sGLMessageFormatter;
-
-    static {
-        Map<String, GLAPISpec> specs = new HashMap<String, GLAPISpec>(API_SPECS.size());
-
-        for (String specString: API_SPECS) {
-            GLAPISpec spec = GLAPISpec.parseLine(specString);
-            specs.put(spec.getFunction(), spec);
-        }
-
-        sGLMessageFormatter = new GLMessageFormatter(specs);
-    }
-
-    @Test
-    public void testBindBuffer() {
-        GLEnum arg1 = GLEnum.GL_ELEMENT_ARRAY_BUFFER;
-        int arg2 = 10;
-
-        GLMessage msg = constructGLMessage(null, Function.glBindBuffer,
-                createEnumDataType((int)arg1.value),
-                createIntegerDataType(arg2));
-
-        String expected = String.format("glBindBuffer(target = %s, buffer = %s)",
-                arg1.toString(),
-                Integer.toString(arg2));
-        String actual = sGLMessageFormatter.formatGLMessage(msg);
-
-        assertEquals(expected, actual);
-    }
-
-    @Test
-    public void testGlGetString() {
-        String retValue = "testString";
-        GLEnum arg1 = GLEnum.GL_RENDERER;
-
-        GLMessage msg = constructGLMessage(
-                createStringDataType(retValue),
-                Function.glGetString,
-                createEnumDataType((int)arg1.value));
-        String expected = String.format("%s(name = %s) = (const GLchar*) %s", Function.glGetString,
-                arg1.toString(), retValue);
-        String actual = sGLMessageFormatter.formatGLMessage(msg);
-
-        assertEquals(expected, actual);
-    }
-
-    @Test
-    public void testGLEnum0() {
-        // an enum of value 0 should equal GL_POINTS if it is an argument,
-        // and GL_NO_ERROR if it is a return value
-        GLMessage msg = constructGLMessage(
-                createEnumDataType(0),
-                Function.eglBindAPI,
-                createEnumDataType(0));
-        String expected = "eglBindAPI(arg = GL_POINTS) = (GLenum) GL_NO_ERROR";
-        String actual = sGLMessageFormatter.formatGLMessage(msg);
-
-        assertEquals(expected, actual);
-    }
-
-    @Test
-    public void testMessageWithPointer() {
-        GLMessage msg = constructGLMessage(null,
-                Function.glTexImage2D,
-                createIntegerDataType(1),
-                createIntegerDataType(2),
-                createIntegerPointerDataType(0xbadc0ffe));
-        String expected = "glTexImage2D(level = 1, width = 2, pixels = 0xbadc0ffe)";
-        String actual = sGLMessageFormatter.formatGLMessage(msg);
-
-        assertEquals(expected, actual);
-    }
-
-    @Test
-    public void testMessageWithMismatchedPointer() {
-        // "void, glMultMatrixf, const GLfloat* m",
-        GLMessage msg = constructGLMessage(null,
-                Function.glMultMatrixf,
-                createIntegerDataType(0xbadc0ffe));
-
-        String expected = "glMultMatrixf(m = 0xbadc0ffe)";
-        String actual = sGLMessageFormatter.formatGLMessage(msg);
-
-        assertEquals(expected, actual);
-    }
-
-    @Test
-    public void testMessageWithEnumPointer() {
-        //void, glGetActiveAttrib, GLenum* type
-        GLMessage msg = constructGLMessage(null,
-                Function.glGetActiveAttrib,
-                createIntegerPointerDataType((int)GLEnum.GL_FLOAT_MAT4.value));
-
-        String expected = "glGetActiveAttrib(type = [GL_FLOAT_MAT4])";
-        String actual = sGLMessageFormatter.formatGLMessage(msg);
-
-        assertEquals(expected, actual);
-    }
-
-    private DataType createStringDataType(String retValue) {
-        return DataType.newBuilder()
-                .addCharValue(ByteString.copyFromUtf8(retValue))
-                .setIsArray(true)
-                .setType(Type.CHAR)
-                .build();
-    }
-
-    private DataType createIntegerDataType(int val) {
-        return DataType.newBuilder()
-                .addIntValue(val)
-                .setIsArray(false)
-                .setType(Type.INT)
-                .build();
-    }
-
-    private DataType createIntegerPointerDataType(int val) {
-        return DataType.newBuilder()
-                .addIntValue(val)
-                .setIsArray(true)
-                .setType(Type.INT)
-                .build();
-    }
-
-    private DataType createEnumDataType(int val) {
-        return DataType.newBuilder()
-                .addIntValue(val)
-                .setIsArray(false)
-                .setType(Type.ENUM)
-                .build();
-    }
-
-    private GLMessage constructGLMessage(DataType retValue, Function func, DataType...args) {
-        Builder builder = GLMessage.newBuilder();
-        builder.setFunction(func);
-
-        // set required fields we don't care about in these tests
-        builder.setContextId(0);
-        builder.setStartTime(0);
-        builder.setDuration(0);
-
-        // set return value if any
-        if (retValue != null) {
-            builder.setReturnValue(retValue);
-        }
-
-        for (DataType arg: args) {
-            builder.addArgs(arg);
-        }
-
-        return builder.build();
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.gldebugger/.classpath b/eclipse/plugins/com.android.ide.eclipse.gldebugger/.classpath
deleted file mode 100755
index aaeec62..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.gldebugger/.classpath
+++ /dev/null
@@ -1,9 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="src" path="src"/>
-    <classpathentry kind="lib" path="libs/host-libprotobuf-java-2.3.0-lite.jar"/>
-    <classpathentry kind="lib" path="libs/liblzf-1.0.jar" />
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/eclipse/plugins/com.android.ide.eclipse.gldebugger/.project b/eclipse/plugins/com.android.ide.eclipse.gldebugger/.project
deleted file mode 100755
index 0327756..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.gldebugger/.project
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>plugin-gldebugger</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.PluginNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/eclipse/plugins/com.android.ide.eclipse.gldebugger/.settings/org.eclipse.jdt.core.prefs b/eclipse/plugins/com.android.ide.eclipse.gldebugger/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index ea66196..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.gldebugger/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,98 +0,0 @@
-eclipse.preferences.version=1
-org.eclipse.jdt.core.compiler.annotation.missingNonNullByDefaultAnnotation=ignore
-org.eclipse.jdt.core.compiler.annotation.nonnull=com.android.annotations.NonNull
-org.eclipse.jdt.core.compiler.annotation.nonnullbydefault=com.android.annotations.NonNullByDefault
-org.eclipse.jdt.core.compiler.annotation.nonnullisdefault=disabled
-org.eclipse.jdt.core.compiler.annotation.nullable=com.android.annotations.Nullable
-org.eclipse.jdt.core.compiler.annotation.nullanalysis=enabled
-org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6
-org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.6
-org.eclipse.jdt.core.compiler.debug.lineNumber=generate
-org.eclipse.jdt.core.compiler.debug.localVariable=generate
-org.eclipse.jdt.core.compiler.debug.sourceFile=generate
-org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
-org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
-org.eclipse.jdt.core.compiler.problem.comparingIdentical=warning
-org.eclipse.jdt.core.compiler.problem.deadCode=warning
-org.eclipse.jdt.core.compiler.problem.deprecation=warning
-org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
-org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
-org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
-org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=ignore
-org.eclipse.jdt.core.compiler.problem.fallthroughCase=warning
-org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
-org.eclipse.jdt.core.compiler.problem.fieldHiding=warning
-org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
-org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
-org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
-org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
-org.eclipse.jdt.core.compiler.problem.includeNullInfoFromAsserts=enabled
-org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
-org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=warning
-org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
-org.eclipse.jdt.core.compiler.problem.localVariableHiding=warning
-org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
-org.eclipse.jdt.core.compiler.problem.missingDefaultCase=ignore
-org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=warning
-org.eclipse.jdt.core.compiler.problem.missingEnumCaseDespiteDefault=disabled
-org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=warning
-org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=error
-org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled
-org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
-org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=ignore
-org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
-org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
-org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore
-org.eclipse.jdt.core.compiler.problem.nullAnnotationInferenceConflict=warning
-org.eclipse.jdt.core.compiler.problem.nullReference=warning
-org.eclipse.jdt.core.compiler.problem.nullSpecInsufficientInfo=warning
-org.eclipse.jdt.core.compiler.problem.nullSpecViolation=warning
-org.eclipse.jdt.core.compiler.problem.nullUncheckedConversion=ignore
-org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
-org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
-org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=warning
-org.eclipse.jdt.core.compiler.problem.potentialNullReference=warning
-org.eclipse.jdt.core.compiler.problem.potentialNullSpecViolation=error
-org.eclipse.jdt.core.compiler.problem.potentiallyUnclosedCloseable=warning
-org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
-org.eclipse.jdt.core.compiler.problem.redundantNullAnnotation=warning
-org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
-org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=ignore
-org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=warning
-org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=ignore
-org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=ignore
-org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
-org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
-org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=enabled
-org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
-org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
-org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
-org.eclipse.jdt.core.compiler.problem.unavoidableGenericTypeProblems=disabled
-org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
-org.eclipse.jdt.core.compiler.problem.unclosedCloseable=error
-org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
-org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
-org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=warning
-org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=warning
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.unusedImport=warning
-org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
-org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
-org.eclipse.jdt.core.compiler.problem.unusedObjectAllocation=warning
-org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
-org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
-org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
-org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
-org.eclipse.jdt.core.compiler.source=1.6
diff --git a/eclipse/plugins/com.android.ide.eclipse.gldebugger/META-INF/MANIFEST.MF b/eclipse/plugins/com.android.ide.eclipse.gldebugger/META-INF/MANIFEST.MF
deleted file mode 100644
index 96177db..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.gldebugger/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,23 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: Tracer for OpenGL ES
-Bundle-SymbolicName: com.android.ide.eclipse.gldebugger;singleton:=true
-Bundle-Version: 24.3.3.qualifier
-Bundle-Activator: com.android.ide.eclipse.gltrace.GlTracePlugin
-Require-Bundle: org.eclipse.ui,
- org.eclipse.core.runtime,
- org.eclipse.ui.ide,
- org.eclipse.core.resources,
- org.eclipse.core.filesystem,
- org.eclipse.ui.console,
- com.android.ide.eclipse.ddms,
- com.android.ide.eclipse.base
-Bundle-ActivationPolicy: lazy
-Bundle-ClassPath: libs/host-libprotobuf-java-2.3.0-lite.jar,
- libs/liblzf-1.0.jar,
- .
-Bundle-Vendor: The Android Open Source Project
-Export-Package: com.android.ide.eclipse.gltrace;x-friends:="com.android.ide.eclipse.gldebugger.tests",
- com.android.ide.eclipse.gltrace.format;x-friends:="com.android.ide.eclipse.gldebugger.tests",
- com.android.ide.eclipse.gltrace.model;x-friends:="com.android.ide.eclipse.gldebugger.tests"
-Bundle-RequiredExecutionEnvironment: JavaSE-1.6
diff --git a/eclipse/plugins/com.android.ide.eclipse.gldebugger/build.properties b/eclipse/plugins/com.android.ide.eclipse.gldebugger/build.properties
deleted file mode 100644
index 4f3d57a..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.gldebugger/build.properties
+++ /dev/null
@@ -1,8 +0,0 @@
-source.. = src/
-output.. = bin/
-bin.includes = plugin.xml,\
-               META-INF/,\
-               .,\
-               libs/,\
-               icons/,\
-               entries.in,
diff --git a/eclipse/plugins/com.android.ide.eclipse.gldebugger/entries.in b/eclipse/plugins/com.android.ide.eclipse.gldebugger/entries.in
deleted file mode 100644
index 46f2797..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.gldebugger/entries.in
+++ /dev/null
@@ -1,549 +0,0 @@
-# com.android.ide.eclipse.gltrace.glentries, v1
-# This file is a slightly processed version of $ANDROID_SRC/frameworks/base/opengl/libs/entries.in
-# The only differences are that the GL_ENTRY() text is removed, and all pointers are associated
-# with the data type as opposed to the variable name. e.g. "void *data" will is converted to
-# "void* data".
-void, eglCreateContext, int version, int context
-void, eglMakeCurrent, int context
-void, glActiveShaderProgramEXT, GLuint pipeline, GLuint program
-void, glActiveTexture, GLenum texture
-void, glAlphaFunc, GLenum func, GLclampf ref
-void, glAlphaFuncQCOM, GLenum func, GLclampf ref
-void, glAlphaFuncx, GLenum func, GLclampx ref
-void, glAlphaFuncxOES, GLenum func, GLclampx ref
-void, glAttachShader, GLuint program, GLuint shader
-void, glBeginPerfMonitorAMD, GLuint monitor
-void, glBeginQuery, GLenum target, GLuint id
-void, glBeginQueryEXT, GLenum target, GLuint id
-void, glBeginTransformFeedback, GLenum primitiveMode
-void, glBindAttribLocation, GLuint program, GLuint index, const GLchar* name
-void, glBindBuffer, GLenum target, GLuint buffer
-void, glBindBufferBase, GLenum target, GLuint index, GLuint buffer
-void, glBindBufferRange, GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size
-void, glBindFramebuffer, GLenum target, GLuint framebuffer
-void, glBindFramebufferOES, GLenum target, GLuint framebuffer
-void, glBindProgramPipelineEXT, GLuint pipeline
-void, glBindRenderbuffer, GLenum target, GLuint renderbuffer
-void, glBindRenderbufferOES, GLenum target, GLuint renderbuffer
-void, glBindSampler, GLuint unit, GLuint sampler
-void, glBindTexture, GLenum target, GLuint texture
-void, glBindTransformFeedback, GLenum target, GLuint id
-void, glBindVertexArray, GLuint array
-void, glBindVertexArrayOES, GLuint array
-void, glBlendColor, GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha
-void, glBlendEquation,  GLenum mode
-void, glBlendEquationOES, GLenum mode
-void, glBlendEquationSeparate, GLenum modeRGB, GLenum modeAlpha
-void, glBlendEquationSeparateOES, GLenum modeRGB, GLenum modeAlpha
-void, glBlendFunc, GLenum sfactor, GLenum dfactor
-void, glBlendFuncSeparate, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha
-void, glBlendFuncSeparateOES, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha
-void, glBlitFramebuffer, GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter
-void, glBlitFramebufferANGLE, GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter
-void, glBufferData, GLenum target, GLsizeiptr size, const GLvoid* data, GLenum usage
-void, glBufferSubData, GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid* data
-GLenum, glCheckFramebufferStatus, GLenum target
-GLenum, glCheckFramebufferStatusOES, GLenum target
-void, glClear, GLbitfield mask
-void, glClearBufferfi, GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil
-void, glClearBufferfv, GLenum buffer, GLint drawbuffer, const GLfloat* value
-void, glClearBufferiv, GLenum buffer, GLint drawbuffer, const GLint* value
-void, glClearBufferuiv, GLenum buffer, GLint drawbuffer, const GLuint* value
-void, glClearColor, GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha
-void, glClearColorx, GLclampx red, GLclampx green, GLclampx blue, GLclampx alpha
-void, glClearColorxOES, GLclampx red, GLclampx green, GLclampx blue, GLclampx alpha
-void, glClearDepthf, GLclampf depth
-void, glClearDepthfOES, GLclampf depth
-void, glClearDepthx, GLclampx depth
-void, glClearDepthxOES, GLclampx depth
-void, glClearStencil, GLint s
-void, glClientActiveTexture, GLenum texture
-GLenum, glClientWaitSync, GLsync sync, GLbitfield flags, GLuint64 timeout
-void, glClipPlanef, GLenum plane, const GLfloat* equation
-void, glClipPlanefIMG, GLenum p, const GLfloat* eqn
-void, glClipPlanefOES, GLenum plane, const GLfloat* equation
-void, glClipPlanex, GLenum plane, const GLfixed* equation
-void, glClipPlanexIMG, GLenum p, const GLfixed* eqn
-void, glClipPlanexOES, GLenum plane, const GLfixed* equation
-void, glColor4f, GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha
-void, glColor4ub, GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha
-void, glColor4x, GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha
-void, glColor4xOES, GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha
-void, glColorMask, GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha
-void, glColorPointer, GLint size, GLenum type, GLsizei stride, const GLvoid* pointer
-void, glCompileShader, GLuint shader
-void, glCompressedTexImage2D, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid* data
-void, glCompressedTexImage3D, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid* data
-void, glCompressedTexImage3DOES, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid* data
-void, glCompressedTexSubImage2D, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid* data
-void, glCompressedTexSubImage3D, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid* data
-void, glCompressedTexSubImage3DOES, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid* data
-void, glCopyBufferSubData, GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size
-void, glCopyTexImage2D, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border
-void, glCopyTexSubImage2D, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height
-void, glCopyTexSubImage3D, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height
-void, glCopyTexSubImage3DOES, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height
-void, glCoverageMaskNV, GLboolean mask
-void, glCoverageOperationNV, GLenum operation
-GLuint, glCreateProgram, void
-GLuint, glCreateShader, GLenum type
-GLuint, glCreateShaderProgramvEXT, GLenum type, GLsizei count, const GLchar** strings
-void, glCullFace, GLenum mode
-void, glCurrentPaletteMatrixOES, GLuint matrixpaletteindex
-void, glDeleteBuffers, GLsizei n, const GLuint* buffers
-void, glDeleteFencesNV, GLsizei n, const GLuint* fences
-void, glDeleteFramebuffers, GLsizei n, const GLuint* framebuffers
-void, glDeleteFramebuffersOES, GLsizei n, const GLuint* framebuffers
-void, glDeletePerfMonitorsAMD, GLsizei n, GLuint* monitors
-void, glDeleteProgram, GLuint program
-void, glDeleteProgramPipelinesEXT, GLsizei n, const GLuint* pipelines
-void, glDeleteQueries, GLsizei n, const GLuint* ids
-void, glDeleteQueriesEXT, GLsizei n, const GLuint* ids
-void, glDeleteRenderbuffers, GLsizei n, const GLuint* renderbuffers
-void, glDeleteRenderbuffersOES, GLsizei n, const GLuint* renderbuffers
-void, glDeleteSamplers, GLsizei count, const GLuint* samplers
-void, glDeleteShader, GLuint shader
-void, glDeleteSync, GLsync sync
-void, glDeleteTextures, GLsizei n, const GLuint* textures
-void, glDeleteTransformFeedbacks, GLsizei n, const GLuint* ids
-void, glDeleteVertexArrays, GLsizei n, const GLuint* arrays
-void, glDeleteVertexArraysOES, GLsizei n, const GLuint* arrays
-void, glDepthFunc, GLenum func
-void, glDepthMask, GLboolean flag
-void, glDepthRangef, GLclampf zNear, GLclampf zFar
-void, glDepthRangefOES, GLclampf zNear, GLclampf zFar
-void, glDepthRangex, GLclampx zNear, GLclampx zFar
-void, glDepthRangexOES, GLclampx zNear, GLclampx zFar
-void, glDetachShader, GLuint program, GLuint shader
-void, glDisable, GLenum cap
-void, glDisableClientState, GLenum array
-void, glDisableDriverControlQCOM, GLuint driverControl
-void, glDisableVertexAttribArray, GLuint index
-void, glDiscardFramebufferEXT, GLenum target, GLsizei numAttachments, const GLenum* attachments
-void, glDrawArrays, GLenum mode, GLint first, GLsizei count
-void, glDrawArraysInstanced, GLenum mode, GLint first, GLsizei count, GLsizei instanceCount
-void, glDrawBuffers, GLsizei n, const GLenum* bufs
-void, glDrawBuffersNV, GLsizei n, const GLenum* bufs
-void, glDrawElements, GLenum mode, GLsizei count, GLenum type, const GLvoid* indices
-void, glDrawElementsInstanced, GLenum mode, GLsizei count, GLenum type, const GLvoid* indices, GLsizei instanceCount
-void, glDrawRangeElements, GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid* indices
-void, glDrawTexfOES, GLfloat x, GLfloat y, GLfloat z, GLfloat width, GLfloat height
-void, glDrawTexfvOES, const GLfloat* coords
-void, glDrawTexiOES, GLint x, GLint y, GLint z, GLint width, GLint height
-void, glDrawTexivOES, const GLint* coords
-void, glDrawTexsOES, GLshort x, GLshort y, GLshort z, GLshort width, GLshort height
-void, glDrawTexsvOES, const GLshort* coords
-void, glDrawTexxOES, GLfixed x, GLfixed y, GLfixed z, GLfixed width, GLfixed height
-void, glDrawTexxvOES, const GLfixed* coords
-void, glEGLImageTargetRenderbufferStorageOES, GLenum target, GLeglImageOES image
-void, glEGLImageTargetTexture2DOES, GLenum target, GLeglImageOES image
-void, glEnable, GLenum cap
-void, glEnableClientState, GLenum array
-void, glEnableDriverControlQCOM, GLuint driverControl
-void, glEnableVertexAttribArray, GLuint index
-void, glEndPerfMonitorAMD, GLuint monitor
-void, glEndQuery, GLenum target
-void, glEndQueryEXT, GLenum target
-void, glEndTilingQCOM, GLbitfield preserveMask
-void, glEndTransformFeedback, void
-void, glExtGetBufferPointervQCOM, GLenum target, GLvoid** params
-void, glExtGetBuffersQCOM, GLuint* buffers, GLint maxBuffers, GLint* numBuffers
-void, glExtGetFramebuffersQCOM, GLuint* framebuffers, GLint maxFramebuffers, GLint* numFramebuffers
-void, glExtGetProgramBinarySourceQCOM, GLuint program, GLenum shadertype, GLchar* source, GLint* length
-void, glExtGetProgramsQCOM, GLuint* programs, GLint maxPrograms, GLint* numPrograms
-void, glExtGetRenderbuffersQCOM, GLuint* renderbuffers, GLint maxRenderbuffers, GLint* numRenderbuffers
-void, glExtGetShadersQCOM, GLuint* shaders, GLint maxShaders, GLint* numShaders
-void, glExtGetTexLevelParameterivQCOM, GLuint texture, GLenum face, GLint level, GLenum pname, GLint* params
-void, glExtGetTexSubImageQCOM, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, GLvoid* texels
-void, glExtGetTexturesQCOM, GLuint* textures, GLint maxTextures, GLint* numTextures
-GLboolean, glExtIsProgramBinaryQCOM, GLuint program
-void, glExtTexObjectStateOverrideiQCOM, GLenum target, GLenum pname, GLint param
-GLsync, glFenceSync, GLenum condition, GLbitfield flags
-void, glFinish, void
-void, glFinishFenceNV, GLuint fence
-void, glFlush, void
-void, glFlushMappedBufferRange, GLenum target, GLintptr offset, GLsizeiptr length
-void, glFogf, GLenum pname, GLfloat param
-void, glFogfv, GLenum pname, const GLfloat* params
-void, glFogx, GLenum pname, GLfixed param
-void, glFogxOES, GLenum pname, GLfixed param
-void, glFogxv, GLenum pname, const GLfixed* params
-void, glFogxvOES, GLenum pname, const GLfixed* params
-void, glFramebufferRenderbuffer, GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer
-void, glFramebufferRenderbufferOES, GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer
-void, glFramebufferTexture2D, GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level
-void, glFramebufferTexture2DMultisampleEXT, GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLsizei samples
-void, glFramebufferTexture2DMultisampleIMG, GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLsizei samples
-void, glFramebufferTexture2DOES, GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level
-void, glFramebufferTexture3DOES, GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset
-void, glFramebufferTextureLayer, GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer
-void, glFrontFace, GLenum mode
-void, glFrustumf, GLfloat left, GLfloat right, GLfloat bottom, GLfloat top, GLfloat zNear, GLfloat zFar
-void, glFrustumfOES, GLfloat left, GLfloat right, GLfloat bottom, GLfloat top, GLfloat zNear, GLfloat zFar
-void, glFrustumx, GLfixed left, GLfixed right, GLfixed bottom, GLfixed top, GLfixed zNear, GLfixed zFar
-void, glFrustumxOES, GLfixed left, GLfixed right, GLfixed bottom, GLfixed top, GLfixed zNear, GLfixed zFar
-void, glGenBuffers, GLsizei n, GLuint* buffers
-void, glGenFencesNV, GLsizei n, GLuint* fences
-void, glGenFramebuffers, GLsizei n, GLuint* framebuffers
-void, glGenFramebuffersOES, GLsizei n, GLuint* framebuffers
-void, glGenPerfMonitorsAMD, GLsizei n, GLuint* monitors
-void, glGenProgramPipelinesEXT, GLsizei n, GLuint* pipelines
-void, glGenQueries, GLsizei n, GLuint* ids
-void, glGenQueriesEXT, GLsizei n, GLuint* ids
-void, glGenRenderbuffers, GLsizei n, GLuint* renderbuffers
-void, glGenRenderbuffersOES, GLsizei n, GLuint* renderbuffers
-void, glGenSamplers, GLsizei count, GLuint* samplers
-void, glGenTextures, GLsizei n, GLuint* textures
-void, glGenTransformFeedbacks, GLsizei n, GLuint* ids
-void, glGenVertexArrays, GLsizei n, GLuint* arrays
-void, glGenVertexArraysOES, GLsizei n, GLuint* arrays
-void, glGenerateMipmap, GLenum target
-void, glGenerateMipmapOES, GLenum target
-void, glGetActiveAttrib, GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, GLchar* name
-void, glGetActiveUniform, GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, GLchar* name
-void, glGetActiveUniformBlockName, GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei* length, GLchar* uniformBlockName
-void, glGetActiveUniformBlockiv, GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint* params
-void, glGetActiveUniformsiv, GLuint program, GLsizei uniformCount, const GLuint* uniformIndices, GLenum pname, GLint* params
-void, glGetAttachedShaders, GLuint program, GLsizei maxcount, GLsizei* count, GLuint* shaders
-GLint, glGetAttribLocation, GLuint program, const GLchar* name
-void, glGetBooleanv, GLenum pname, GLboolean* params
-void, glGetBufferParameteri64v, GLenum target, GLenum pname, GLint64* params
-void, glGetBufferParameteriv, GLenum target, GLenum pname, GLint* params
-void, glGetBufferPointerv, GLenum target, GLenum pname, GLvoid** params
-void, glGetBufferPointervOES, GLenum target, GLenum pname, GLvoid**  params
-void, glGetClipPlanef, GLenum pname, GLfloat eqn[4]
-void, glGetClipPlanefOES, GLenum pname, GLfloat eqn[4]
-void, glGetClipPlanex, GLenum pname, GLfixed eqn[4]
-void, glGetClipPlanexOES, GLenum pname, GLfixed eqn[4]
-void, glGetDriverControlStringQCOM, GLuint driverControl, GLsizei bufSize, GLsizei* length, GLchar* driverControlString
-void, glGetDriverControlsQCOM, GLint* num, GLsizei size, GLuint* driverControls
-GLenum, glGetError, void
-void, glGetFenceivNV, GLuint fence, GLenum pname, GLint* params
-void, glGetFixedv, GLenum pname, GLfixed* params
-void, glGetFixedvOES, GLenum pname, GLfixed* params
-void, glGetFloatv, GLenum pname, GLfloat* params
-GLint, glGetFragDataLocation, GLuint program, const GLchar* name
-void, glGetFramebufferAttachmentParameteriv, GLenum target, GLenum attachment, GLenum pname, GLint* params
-void, glGetFramebufferAttachmentParameterivOES, GLenum target, GLenum attachment, GLenum pname, GLint* params
-GLenum, glGetGraphicsResetStatusEXT, void
-void, glGetInteger64i_v, GLenum target, GLuint index, GLint64* data
-void, glGetInteger64v, GLenum pname, GLint64* params
-void, glGetIntegeri_v, GLenum target, GLuint index, GLint* data
-void, glGetIntegerv, GLenum pname, GLint* params
-void, glGetInternalformativ, GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint* params
-void, glGetLightfv, GLenum light, GLenum pname, GLfloat* params
-void, glGetLightxv, GLenum light, GLenum pname, GLfixed* params
-void, glGetLightxvOES, GLenum light, GLenum pname, GLfixed* params
-void, glGetMaterialfv, GLenum face, GLenum pname, GLfloat* params
-void, glGetMaterialxv, GLenum face, GLenum pname, GLfixed* params
-void, glGetMaterialxvOES, GLenum face, GLenum pname, GLfixed* params
-void, glGetObjectLabelEXT, GLenum type, GLuint object, GLsizei bufSize, GLsizei* length, GLchar* label
-void, glGetPerfMonitorCounterDataAMD, GLuint monitor, GLenum pname, GLsizei dataSize, GLuint* data, GLint* bytesWritten
-void, glGetPerfMonitorCounterInfoAMD, GLuint group, GLuint counter, GLenum pname, GLvoid* data
-void, glGetPerfMonitorCounterStringAMD, GLuint group, GLuint counter, GLsizei bufSize, GLsizei* length, GLchar* counterString
-void, glGetPerfMonitorCountersAMD, GLuint group, GLint* numCounters, GLint* maxActiveCounters, GLsizei counterSize, GLuint* counters
-void, glGetPerfMonitorGroupStringAMD, GLuint group, GLsizei bufSize, GLsizei* length, GLchar* groupString
-void, glGetPerfMonitorGroupsAMD, GLint* numGroups, GLsizei groupsSize, GLuint* groups
-void, glGetPointerv, GLenum pname, GLvoid** params
-void, glGetProgramBinary, GLuint program, GLsizei bufSize, GLsizei* length, GLenum* binaryFormat, GLvoid* binary
-void, glGetProgramBinaryOES, GLuint program, GLsizei bufSize, GLsizei* length, GLenum* binaryFormat, GLvoid* binary
-void, glGetProgramInfoLog, GLuint program, GLsizei bufsize, GLsizei* length, GLchar* infolog
-void, glGetProgramPipelineInfoLogEXT, GLuint pipeline, GLsizei bufSize, GLsizei* length, GLchar* infoLog
-void, glGetProgramPipelineivEXT, GLuint pipeline, GLenum pname, GLint* params
-void, glGetProgramiv, GLuint program, GLenum pname, GLint* params
-void, glGetQueryObjectuiv, GLuint id, GLenum pname, GLuint* params
-void, glGetQueryObjectuivEXT, GLuint id, GLenum pname, GLuint* params
-void, glGetQueryiv, GLenum target, GLenum pname, GLint* params
-void, glGetQueryivEXT, GLenum target, GLenum pname, GLint* params
-void, glGetRenderbufferParameteriv, GLenum target, GLenum pname, GLint* params
-void, glGetRenderbufferParameterivOES, GLenum target, GLenum pname, GLint* params
-void, glGetSamplerParameterfv, GLuint sampler, GLenum pname, GLfloat* params
-void, glGetSamplerParameteriv, GLuint sampler, GLenum pname, GLint* params
-void, glGetShaderInfoLog, GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* infolog
-void, glGetShaderPrecisionFormat, GLenum shadertype, GLenum precisiontype, GLint* range, GLint* precision
-void, glGetShaderSource, GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* source
-void, glGetShaderiv, GLuint shader, GLenum pname, GLint* params
-const GLchar* , glGetString, GLenum name
-const GLubyte*, glGetStringi, GLenum name, GLuint index
-void, glGetSynciv, GLsync sync, GLenum pname, GLsizei bufSize, GLsizei* length, GLint* values
-void, glGetTexEnvfv, GLenum env, GLenum pname, GLfloat* params
-void, glGetTexEnviv, GLenum env, GLenum pname, GLint* params
-void, glGetTexEnvxv, GLenum env, GLenum pname, GLfixed* params
-void, glGetTexEnvxvOES, GLenum env, GLenum pname, GLfixed* params
-void, glGetTexGenfvOES, GLenum coord, GLenum pname, GLfloat* params
-void, glGetTexGenivOES, GLenum coord, GLenum pname, GLint* params
-void, glGetTexGenxvOES, GLenum coord, GLenum pname, GLfixed* params
-void, glGetTexParameterfv, GLenum target, GLenum pname, GLfloat* params
-void, glGetTexParameteriv, GLenum target, GLenum pname, GLint* params
-void, glGetTexParameterxv, GLenum target, GLenum pname, GLfixed* params
-void, glGetTexParameterxvOES, GLenum target, GLenum pname, GLfixed* params
-void, glGetTransformFeedbackVarying, GLuint program, GLuint index, GLsizei bufSize, GLsizei* length, GLsizei* size, GLenum* type, GLchar* name
-GLuint, glGetUniformBlockIndex, GLuint program, const GLchar* uniformBlockName
-void, glGetUniformIndices, GLuint program, GLsizei uniformCount, const GLchar* const* uniformNames, GLuint* uniformIndices
-GLint, glGetUniformLocation, GLuint program, const GLchar* name
-void, glGetUniformfv, GLuint program, GLint location, GLfloat* params
-void, glGetUniformiv, GLuint program, GLint location, GLint* params
-void, glGetUniformuiv, GLuint program, GLint location, GLuint* params
-void, glGetVertexAttribIiv, GLuint index, GLenum pname, GLint* params
-void, glGetVertexAttribIuiv, GLuint index, GLenum pname, GLuint* params
-void, glGetVertexAttribPointerv, GLuint index, GLenum pname, GLvoid** pointer
-void, glGetVertexAttribfv, GLuint index, GLenum pname, GLfloat* params
-void, glGetVertexAttribiv, GLuint index, GLenum pname, GLint* params
-void, glGetnUniformfvEXT, GLuint program, GLint location, GLsizei bufSize, float* params
-void, glGetnUniformivEXT, GLuint program, GLint location, GLsizei bufSize, GLint* params
-void, glHint, GLenum target, GLenum mode
-void, glInsertEventMarkerEXT, GLsizei length, const GLchar* marker
-void, glInvalidateFramebuffer, GLenum target, GLsizei numAttachments, const GLenum* attachments
-void, glInvalidateSubFramebuffer, GLenum target, GLsizei numAttachments, const GLenum* attachments, GLint x, GLint y, GLsizei width, GLsizei height
-GLboolean, glIsBuffer, GLuint buffer
-GLboolean, glIsEnabled, GLenum cap
-GLboolean, glIsFenceNV, GLuint fence
-GLboolean, glIsFramebuffer, GLuint framebuffer
-GLboolean, glIsFramebufferOES, GLuint framebuffer
-GLboolean, glIsProgram, GLuint program
-GLboolean, glIsProgramPipelineEXT, GLuint pipeline
-GLboolean, glIsQuery, GLuint id
-GLboolean, glIsQueryEXT, GLuint id
-GLboolean, glIsRenderbuffer, GLuint renderbuffer
-GLboolean, glIsRenderbufferOES, GLuint renderbuffer
-GLboolean, glIsSampler, GLuint sampler
-GLboolean, glIsShader, GLuint shader
-GLboolean, glIsSync, GLsync sync
-GLboolean, glIsTexture, GLuint texture
-GLboolean, glIsTransformFeedback, GLuint id
-GLboolean, glIsVertexArray, GLuint array
-GLboolean, glIsVertexArrayOES, GLuint array
-void, glLabelObjectEXT, GLenum type, GLuint object, GLsizei length, const GLchar* label
-void, glLightModelf, GLenum pname, GLfloat param
-void, glLightModelfv, GLenum pname, const GLfloat* params
-void, glLightModelx, GLenum pname, GLfixed param
-void, glLightModelxOES, GLenum pname, GLfixed param
-void, glLightModelxv, GLenum pname, const GLfixed* params
-void, glLightModelxvOES, GLenum pname, const GLfixed* params
-void, glLightf, GLenum light, GLenum pname, GLfloat param
-void, glLightfv, GLenum light, GLenum pname, const GLfloat* params
-void, glLightx, GLenum light, GLenum pname, GLfixed param
-void, glLightxOES, GLenum light, GLenum pname, GLfixed param
-void, glLightxv, GLenum light, GLenum pname, const GLfixed* params
-void, glLightxvOES, GLenum light, GLenum pname, const GLfixed* params
-void, glLineWidth, GLfloat width
-void, glLineWidthx, GLfixed width
-void, glLineWidthxOES, GLfixed width
-void, glLinkProgram, GLuint program
-void, glLoadIdentity, void
-void, glLoadMatrixf, const GLfloat* m
-void, glLoadMatrixx, const GLfixed* m
-void, glLoadMatrixxOES, const GLfixed* m
-void, glLoadPaletteFromModelViewMatrixOES, void
-void, glLogicOp, GLenum opcode
-void*, glMapBufferOES, GLenum target, GLenum access
-GLvoid*, glMapBufferRange, GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access
-void, glMaterialf, GLenum face, GLenum pname, GLfloat param
-void, glMaterialfv, GLenum face, GLenum pname, const GLfloat* params
-void, glMaterialx, GLenum face, GLenum pname, GLfixed param
-void, glMaterialxOES, GLenum face, GLenum pname, GLfixed param
-void, glMaterialxv, GLenum face, GLenum pname, const GLfixed* params
-void, glMaterialxvOES, GLenum face, GLenum pname, const GLfixed* params
-void, glMatrixIndexPointerOES, GLint size, GLenum type, GLsizei stride, const GLvoid* pointer
-void, glMatrixMode, GLenum mode
-void, glMultMatrixf, const GLfloat* m
-void, glMultMatrixx, const GLfixed* m
-void, glMultMatrixxOES, const GLfixed* m
-void, glMultiDrawArraysEXT, GLenum mode, GLint* first, GLsizei* count, GLsizei primcount
-void, glMultiDrawElementsEXT, GLenum mode, const GLsizei* count, GLenum type, const GLvoid** indices, GLsizei primcount
-void, glMultiTexCoord4f, GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q
-void, glMultiTexCoord4x, GLenum target, GLfixed s, GLfixed t, GLfixed r, GLfixed q
-void, glMultiTexCoord4xOES, GLenum target, GLfixed s, GLfixed t, GLfixed r, GLfixed q
-void, glNormal3f, GLfloat nx, GLfloat ny, GLfloat nz
-void, glNormal3x, GLfixed nx, GLfixed ny, GLfixed nz
-void, glNormal3xOES, GLfixed nx, GLfixed ny, GLfixed nz
-void, glNormalPointer, GLenum type, GLsizei stride, const GLvoid* pointer
-void, glOrthof, GLfloat left, GLfloat right, GLfloat bottom, GLfloat top, GLfloat zNear, GLfloat zFar
-void, glOrthofOES, GLfloat left, GLfloat right, GLfloat bottom, GLfloat top, GLfloat zNear, GLfloat zFar
-void, glOrthox, GLfixed left, GLfixed right, GLfixed bottom, GLfixed top, GLfixed zNear, GLfixed zFar
-void, glOrthoxOES, GLfixed left, GLfixed right, GLfixed bottom, GLfixed top, GLfixed zNear, GLfixed zFar
-void, glPauseTransformFeedback, void
-void, glPixelStorei, GLenum pname, GLint param
-void, glPointParameterf, GLenum pname, GLfloat param
-void, glPointParameterfv, GLenum pname, const GLfloat* params
-void, glPointParameterx, GLenum pname, GLfixed param
-void, glPointParameterxOES, GLenum pname, GLfixed param
-void, glPointParameterxv, GLenum pname, const GLfixed* params
-void, glPointParameterxvOES, GLenum pname, const GLfixed* params
-void, glPointSize, GLfloat size
-void, glPointSizePointerOES, GLenum type, GLsizei stride, const GLvoid* pointer
-void, glPointSizex, GLfixed size
-void, glPointSizexOES, GLfixed size
-void, glPolygonOffset, GLfloat factor, GLfloat units
-void, glPolygonOffsetx, GLfixed factor, GLfixed units
-void, glPolygonOffsetxOES, GLfixed factor, GLfixed units
-void, glPopGroupMarkerEXT, void
-void, glPopMatrix, void
-void, glProgramBinary, GLuint program, GLenum binaryFormat, const GLvoid* binary, GLsizei length
-void, glProgramBinaryOES, GLuint program, GLenum binaryFormat, const GLvoid* binary, GLint length
-void, glProgramParameteri, GLuint program, GLenum pname, GLint value
-void, glProgramParameteriEXT, GLuint program, GLenum pname, GLint value
-void, glProgramUniform1fEXT, GLuint program, GLint location, GLfloat x
-void, glProgramUniform1fvEXT, GLuint program, GLint location, GLsizei count, const GLfloat* value
-void, glProgramUniform1iEXT, GLuint program, GLint location, GLint x
-void, glProgramUniform1ivEXT, GLuint program, GLint location, GLsizei count, const GLint* value
-void, glProgramUniform2fEXT, GLuint program, GLint location, GLfloat x, GLfloat y
-void, glProgramUniform2fvEXT, GLuint program, GLint location, GLsizei count, const GLfloat* value
-void, glProgramUniform2iEXT, GLuint program, GLint location, GLint x, GLint y
-void, glProgramUniform2ivEXT, GLuint program, GLint location, GLsizei count, const GLint* value
-void, glProgramUniform3fEXT, GLuint program, GLint location, GLfloat x, GLfloat y, GLfloat z
-void, glProgramUniform3fvEXT, GLuint program, GLint location, GLsizei count, const GLfloat* value
-void, glProgramUniform3iEXT, GLuint program, GLint location, GLint x, GLint y, GLint z
-void, glProgramUniform3ivEXT, GLuint program, GLint location, GLsizei count, const GLint* value
-void, glProgramUniform4fEXT, GLuint program, GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w
-void, glProgramUniform4fvEXT, GLuint program, GLint location, GLsizei count, const GLfloat* value
-void, glProgramUniform4iEXT, GLuint program, GLint location, GLint x, GLint y, GLint z, GLint w
-void, glProgramUniform4ivEXT, GLuint program, GLint location, GLsizei count, const GLint* value
-void, glProgramUniformMatrix2fvEXT, GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value
-void, glProgramUniformMatrix3fvEXT, GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value
-void, glProgramUniformMatrix4fvEXT, GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value
-void, glPushGroupMarkerEXT, GLsizei length, const GLchar* marker
-void, glPushMatrix, void
-GLbitfield, glQueryMatrixxOES, GLfixed mantissa[16], GLint exponent[16]
-void, glReadBuffer, GLenum mode
-void, glReadBufferNV, GLenum mode
-void, glReadPixels, GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid* pixels
-void, glReadnPixelsEXT, GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, void* data
-void, glReleaseShaderCompiler, void
-void, glRenderbufferStorage, GLenum target, GLenum internalformat, GLsizei width, GLsizei height
-void, glRenderbufferStorageMultisample, GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height
-void, glRenderbufferStorageMultisampleANGLE, GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height
-void, glRenderbufferStorageMultisampleAPPLE, GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height
-void, glRenderbufferStorageMultisampleEXT, GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height
-void, glRenderbufferStorageMultisampleIMG, GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height
-void, glRenderbufferStorageOES, GLenum target, GLenum internalformat, GLsizei width, GLsizei height
-void, glResolveMultisampleFramebufferAPPLE, void
-void, glResumeTransformFeedback, void
-void, glRotatef, GLfloat angle, GLfloat x, GLfloat y, GLfloat z
-void, glRotatex, GLfixed angle, GLfixed x, GLfixed y, GLfixed z
-void, glRotatexOES, GLfixed angle, GLfixed x, GLfixed y, GLfixed z
-void, glSampleCoverage, GLclampf value, GLboolean invert
-void, glSampleCoveragex, GLclampx value, GLboolean invert
-void, glSampleCoveragexOES, GLclampx value, GLboolean invert
-void, glSamplerParameterf, GLuint sampler, GLenum pname, GLfloat param
-void, glSamplerParameterfv, GLuint sampler, GLenum pname, const GLfloat* param
-void, glSamplerParameteri, GLuint sampler, GLenum pname, GLint param
-void, glSamplerParameteriv, GLuint sampler, GLenum pname, const GLint* param
-void, glScalef, GLfloat x, GLfloat y, GLfloat z
-void, glScalex, GLfixed x, GLfixed y, GLfixed z
-void, glScalexOES, GLfixed x, GLfixed y, GLfixed z
-void, glScissor, GLint x, GLint y, GLsizei width, GLsizei height
-void, glSelectPerfMonitorCountersAMD, GLuint monitor, GLboolean enable, GLuint group, GLint numCounters, GLuint* countersList
-void, glSetFenceNV, GLuint fence, GLenum condition
-void, glShadeModel, GLenum mode
-void, glShaderBinary, GLsizei n, const GLuint* shaders, GLenum binaryformat, const GLvoid* binary, GLsizei length
-void, glShaderSource, GLuint shader, GLsizei count, const GLchar** string, const GLint* length
-void, glStartTilingQCOM, GLuint x, GLuint y, GLuint width, GLuint height, GLbitfield preserveMask
-void, glStencilFunc, GLenum func, GLint ref, GLuint mask
-void, glStencilFuncSeparate, GLenum face, GLenum func, GLint ref, GLuint mask
-void, glStencilMask, GLuint mask
-void, glStencilMaskSeparate, GLenum face, GLuint mask
-void, glStencilOp, GLenum fail, GLenum zfail, GLenum zpass
-void, glStencilOpSeparate, GLenum face, GLenum fail, GLenum zfail, GLenum zpass
-GLboolean, glTestFenceNV, GLuint fence
-void, glTexCoordPointer, GLint size, GLenum type, GLsizei stride, const GLvoid* pointer
-void, glTexEnvf, GLenum target, GLenum pname, GLfloat param
-void, glTexEnvfv, GLenum target, GLenum pname, const GLfloat* params
-void, glTexEnvi, GLenum target, GLenum pname, GLint param
-void, glTexEnviv, GLenum target, GLenum pname, const GLint* params
-void, glTexEnvx, GLenum target, GLenum pname, GLfixed param
-void, glTexEnvxOES, GLenum target, GLenum pname, GLfixed param
-void, glTexEnvxv, GLenum target, GLenum pname, const GLfixed* params
-void, glTexEnvxvOES, GLenum target, GLenum pname, const GLfixed* params
-void, glTexGenfOES, GLenum coord, GLenum pname, GLfloat param
-void, glTexGenfvOES, GLenum coord, GLenum pname, const GLfloat* params
-void, glTexGeniOES, GLenum coord, GLenum pname, GLint param
-void, glTexGenivOES, GLenum coord, GLenum pname, const GLint* params
-void, glTexGenxOES, GLenum coord, GLenum pname, GLfixed param
-void, glTexGenxvOES, GLenum coord, GLenum pname, const GLfixed* params
-void, glTexImage2D, GLenum target, GLint level, GLEnum internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid* pixels
-void, glTexImage3D, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid* pixels
-void, glTexImage3DOES, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid* pixels
-void, glTexParameterf, GLenum target, GLenum pname, GLfloat param
-void, glTexParameterfv, GLenum target, GLenum pname, const GLfloat* params
-void, glTexParameteri, GLenum target, GLenum pname, GLint param
-void, glTexParameteriv, GLenum target, GLenum pname, const GLint* params
-void, glTexParameterx, GLenum target, GLenum pname, GLfixed param
-void, glTexParameterxOES, GLenum target, GLenum pname, GLfixed param
-void, glTexParameterxv, GLenum target, GLenum pname, const GLfixed* params
-void, glTexParameterxvOES, GLenum target, GLenum pname, const GLfixed* params
-void, glTexStorage1DEXT, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width
-void, glTexStorage2D, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height
-void, glTexStorage2DEXT, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height
-void, glTexStorage3D, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth
-void, glTexStorage3DEXT, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth
-void, glTexSubImage2D, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid* pixels
-void, glTexSubImage3D, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid* pixels
-void, glTexSubImage3DOES, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid* pixels
-void, glTextureStorage1DEXT, GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width
-void, glTextureStorage2DEXT, GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height
-void, glTextureStorage3DEXT, GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth
-void, glTransformFeedbackVaryings, GLuint program, GLsizei count, const GLchar* const* varyings, GLenum bufferMode
-void, glTranslatef, GLfloat x, GLfloat y, GLfloat z
-void, glTranslatex, GLfixed x, GLfixed y, GLfixed z
-void, glTranslatexOES, GLfixed x, GLfixed y, GLfixed z
-void, glUniform1f, GLint location, GLfloat x
-void, glUniform1fv, GLint location, GLsizei count, const GLfloat* v
-void, glUniform1i, GLint location, GLint x
-void, glUniform1iv, GLint location, GLsizei count, const GLint* v
-void, glUniform1ui, GLint location, GLuint v0
-void, glUniform1uiv, GLint location, GLsizei count, const GLuint* value
-void, glUniform2f, GLint location, GLfloat x, GLfloat y
-void, glUniform2fv, GLint location, GLsizei count, const GLfloat* v
-void, glUniform2i, GLint location, GLint x, GLint y
-void, glUniform2iv, GLint location, GLsizei count, const GLint* v
-void, glUniform2ui, GLint location, GLuint v0, GLuint v1
-void, glUniform2uiv, GLint location, GLsizei count, const GLuint* value
-void, glUniform3f, GLint location, GLfloat x, GLfloat y, GLfloat z
-void, glUniform3fv, GLint location, GLsizei count, const GLfloat* v
-void, glUniform3i, GLint location, GLint x, GLint y, GLint z
-void, glUniform3iv, GLint location, GLsizei count, const GLint* v
-void, glUniform3ui, GLint location, GLuint v0, GLuint v1, GLuint v2
-void, glUniform3uiv, GLint location, GLsizei count, const GLuint* value
-void, glUniform4f, GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w
-void, glUniform4fv, GLint location, GLsizei count, const GLfloat* v
-void, glUniform4i, GLint location, GLint x, GLint y, GLint z, GLint w
-void, glUniform4iv, GLint location, GLsizei count, const GLint* v
-void, glUniform4ui, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3
-void, glUniform4uiv, GLint location, GLsizei count, const GLuint* value
-void, glUniformBlockBinding, GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding
-void, glUniformMatrix2fv, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value
-void, glUniformMatrix2x3fv, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value
-void, glUniformMatrix2x4fv, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value
-void, glUniformMatrix3fv, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value
-void, glUniformMatrix3x2fv, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value
-void, glUniformMatrix3x4fv, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value
-void, glUniformMatrix4fv, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value
-void, glUniformMatrix4x2fv, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value
-void, glUniformMatrix4x3fv, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value
-GLboolean, glUnmapBuffer, GLenum target
-GLboolean, glUnmapBufferOES, GLenum target
-void, glUseProgram, GLuint program
-void, glUseProgramStagesEXT, GLuint pipeline, GLbitfield stages, GLuint program
-void, glValidateProgram, GLuint program
-void, glValidateProgramPipelineEXT, GLuint pipeline
-void, glVertexAttrib1f, GLuint indx, GLfloat x
-void, glVertexAttrib1fv, GLuint indx, const GLfloat* values
-void, glVertexAttrib2f, GLuint indx, GLfloat x, GLfloat y
-void, glVertexAttrib2fv, GLuint indx, const GLfloat* values
-void, glVertexAttrib3f, GLuint indx, GLfloat x, GLfloat y, GLfloat z
-void, glVertexAttrib3fv, GLuint indx, const GLfloat* values
-void, glVertexAttrib4f, GLuint indx, GLfloat x, GLfloat y, GLfloat z, GLfloat w
-void, glVertexAttrib4fv, GLuint indx, const GLfloat* values
-void, glVertexAttribDivisor, GLuint index, GLuint divisor
-void, glVertexAttribI4i, GLuint index, GLint x, GLint y, GLint z, GLint w
-void, glVertexAttribI4iv, GLuint index, const GLint* v
-void, glVertexAttribI4ui, GLuint index, GLuint x, GLuint y, GLuint z, GLuint w
-void, glVertexAttribI4uiv, GLuint index, const GLuint* v
-void, glVertexAttribIPointer, GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid* pointer
-void, glVertexAttribPointer, GLuint indx, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid* ptr
-void, glVertexAttribPointerData, GLuint indx, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid* ptr, GLuint minIndex, GLuint maxIndex
-void, glVertexPointer, GLint size, GLenum type, GLsizei stride, const GLvoid* pointer
-void, glViewport, GLint x, GLint y, GLsizei width, GLsizei height
-void, glWaitSync, GLsync sync, GLbitfield flags, GLuint64 timeout
-void, glWeightPointerOES, GLint size, GLenum type, GLsizei stride, const GLvoid* pointer
diff --git a/eclipse/plugins/com.android.ide.eclipse.gldebugger/icons/connect.png b/eclipse/plugins/com.android.ide.eclipse.gldebugger/icons/connect.png
deleted file mode 100644
index 14ef522..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.gldebugger/icons/connect.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.gldebugger/icons/expandall.png b/eclipse/plugins/com.android.ide.eclipse.gldebugger/icons/expandall.png
deleted file mode 100644
index 7bdf83d..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.gldebugger/icons/expandall.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.gldebugger/icons/opengl.png b/eclipse/plugins/com.android.ide.eclipse.gldebugger/icons/opengl.png
deleted file mode 100644
index ae9d032..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.gldebugger/icons/opengl.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.gldebugger/icons/sample.gif b/eclipse/plugins/com.android.ide.eclipse.gldebugger/icons/sample.gif
deleted file mode 100644
index 34fb3c9..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.gldebugger/icons/sample.gif
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.gldebugger/icons/zoomfit.png b/eclipse/plugins/com.android.ide.eclipse.gldebugger/icons/zoomfit.png
deleted file mode 100644
index 9c53ac8..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.gldebugger/icons/zoomfit.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.gldebugger/plugin.xml b/eclipse/plugins/com.android.ide.eclipse.gldebugger/plugin.xml
deleted file mode 100644
index 5806b3c..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.gldebugger/plugin.xml
+++ /dev/null
@@ -1,99 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.4"?>
-<plugin>
-
-   <extension
-         point="org.eclipse.ui.views">
-      <category
-            id="com.android.ide.eclipse.gltrace"
-            name="Tracer for OpenGL ES">
-      </category>
-      <view
-            category="com.android.ide.eclipse.gltrace"
-            class="com.android.ide.eclipse.gltrace.views.FrameSummaryView"
-            icon="icons/opengl.png"
-            id="com.android.ide.eclipse.gltrace.views.FrameBuffer"
-            name="Frame Summary"
-            restorable="true">
-      </view>
-      <view
-            category="com.android.ide.eclipse.gltrace"
-            class="com.android.ide.eclipse.gltrace.views.StateView"
-            icon="icons/opengl.png"
-            id="com.android.ide.eclipse.gltrace.views.State"
-            name="GL State"
-            restorable="true">
-      </view>
-      <view
-            category="com.android.ide.eclipse.gltrace"
-            class="com.android.ide.eclipse.gltrace.views.detail.DetailsView"
-            icon="icons/opengl.png"
-            id="com.android.ide.eclipse.gltrace.views.Details"
-            name="Details"
-            restorable="true">
-      </view>
-   </extension>
-   <extension
-         point="org.eclipse.ui.editors">
-      <editor
-            class="com.android.ide.eclipse.gltrace.editors.GLFunctionTraceViewer"
-            default="true"
-            extensions="gltrace"
-            icon="icons/opengl.png"
-            id="com.android.ide.eclipse.gltrace.GLFunctionTrace"
-            name="GL Function Trace">
-      </editor>
-   </extension>
-   <extension
-         point="org.eclipse.ui.actionSets">
-      <actionSet
-            description="OpenGL Trace Actions"
-            id="com.android.ide.eclipse.gltrace.actionset"
-            label="OpenGL Trace Actions"
-            visible="false">
-         <action
-               class="com.android.ide.eclipse.gltrace.CollectTraceAction"
-               icon="icons/connect.png"
-               id="gltrace.action.connect"
-               label="Collects OpenGL trace from device"
-               style="push"
-               toolbarPath="Normal/additions"
-               tooltip="Connects to the device and collects OpenGL trace information">
-         </action>
-         <action
-               class="com.android.ide.eclipse.gltrace.OpenGLTraceAction"
-               icon="icons/opengl.png"
-               id="gltrace.action.open"
-               label="Open GL Trace File"
-               style="push"
-               toolbarPath="Normal/additions"
-               tooltip="Open a saved OpenGL Trace File">
-         </action>
-      </actionSet>
-   </extension>
-   <extension
-         point="org.eclipse.ui.perspectives">
-      <perspective
-            class="com.android.ide.eclipse.gltrace.GLTracePerspective"
-            icon="icons/opengl.png"
-            id="com.android.ide.eclipse.gltrace.perspective"
-            name="Tracer for OpenGL ES">
-      </perspective>
-   </extension>
-   <extension
-         point="org.eclipse.ui.perspectiveExtensions">
-      <perspectiveExtension
-            targetID="com.android.ide.eclipse.gltrace.perspective">
-         <actionSet
-               id="com.android.ide.eclipse.gltrace.actionset">
-         </actionSet>
-      </perspectiveExtension>
-   </extension>
-   <extension
-         point="com.android.ide.eclipse.ddms.clientAction">
-      <clientAction
-            class="com.android.ide.eclipse.gltrace.DeviceViewAction">
-      </clientAction>
-   </extension>
-
-</plugin>
diff --git a/eclipse/plugins/com.android.ide.eclipse.gldebugger/pom.xml b/eclipse/plugins/com.android.ide.eclipse.gldebugger/pom.xml
deleted file mode 100644
index a2a8cef..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.gldebugger/pom.xml
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-    <modelVersion>4.0.0</modelVersion>
-
-    <version>24.3.3-SNAPSHOT</version>
-    <artifactId>com.android.ide.eclipse.gldebugger</artifactId>
-    <packaging>eclipse-plugin</packaging>
-    <name>gldebugger</name>
-
-    <parent>
-        <relativePath>../../pom.xml</relativePath>
-        <groupId>adt.group</groupId>
-        <artifactId>parent</artifactId>
-        <version>1.0.0-SNAPSHOT</version>
-    </parent>
-</project>
diff --git a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/CollectTraceAction.java b/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/CollectTraceAction.java
deleted file mode 100644
index c13ab46..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/CollectTraceAction.java
+++ /dev/null
@@ -1,428 +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.eclipse.gltrace;
-
-import com.android.ddmlib.AdbCommandRejectedException;
-import com.android.ddmlib.AndroidDebugBridge;
-import com.android.ddmlib.Client;
-import com.android.ddmlib.IDevice;
-import com.android.ddmlib.IDevice.DeviceUnixSocketNamespace;
-import com.android.ddmlib.IShellOutputReceiver;
-import com.android.ddmlib.ShellCommandUnresponsiveException;
-import com.android.ddmlib.TimeoutException;
-import com.android.ide.eclipse.gltrace.editors.GLFunctionTraceViewer;
-import com.google.common.io.Closeables;
-import com.google.common.util.concurrent.SimpleTimeLimiter;
-
-import org.eclipse.core.filesystem.EFS;
-import org.eclipse.core.filesystem.IFileStore;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.window.Window;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorReference;
-import org.eclipse.ui.IURIEditorInput;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.IWorkbenchWindowActionDelegate;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.WorkbenchException;
-import org.eclipse.ui.ide.IDE;
-
-import java.io.DataInputStream;
-import java.io.DataOutputStream;
-import java.io.FileNotFoundException;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.net.Socket;
-import java.util.concurrent.Callable;
-import java.util.concurrent.Semaphore;
-import java.util.concurrent.TimeUnit;
-
-public class CollectTraceAction implements IWorkbenchWindowActionDelegate {
-    /** Abstract Unix Domain Socket Name used by the gltrace device code. */
-    private static final String GLTRACE_UDS = "gltrace";        //$NON-NLS-1$
-
-    /** Local port that is forwarded to the device's {@link #GLTRACE_UDS} socket. */
-    private static final int LOCAL_FORWARDED_PORT = 6039;
-
-    /** Activity name to use for a system activity that has already been launched. */
-    private static final String SYSTEM_APP = "system";          //$NON-NLS-1$
-
-    /** Time to wait for the application to launch (seconds) */
-    private static final int LAUNCH_TIMEOUT = 15;
-
-    /** Time to wait for the application to die (seconds) */
-    private static final int KILL_TIMEOUT = 5;
-
-    private static final int MIN_API_LEVEL = 16;
-
-    @Override
-    public void run(IAction action) {
-        connectToDevice();
-    }
-
-    @Override
-    public void selectionChanged(IAction action, ISelection selection) {
-    }
-
-    @Override
-    public void dispose() {
-    }
-
-    @Override
-    public void init(IWorkbenchWindow window) {
-    }
-
-    private void connectToDevice() {
-        Shell shell = Display.getDefault().getActiveShell();
-        GLTraceOptionsDialog dlg = new GLTraceOptionsDialog(shell);
-        if (dlg.open() != Window.OK) {
-            return;
-        }
-
-        TraceOptions traceOptions = dlg.getTraceOptions();
-
-        IDevice device = getDevice(traceOptions.device);
-        String apiLevelString = device.getProperty(IDevice.PROP_BUILD_API_LEVEL);
-        int apiLevel;
-        try {
-            apiLevel = Integer.parseInt(apiLevelString);
-        } catch (NumberFormatException e) {
-            apiLevel = MIN_API_LEVEL;
-        }
-        if (apiLevel < MIN_API_LEVEL) {
-            MessageDialog.openError(shell, "GL Trace",
-                    String.format("OpenGL Tracing is only supported on devices at API Level %1$d."
-                            + "The selected device '%2$s' provides API level %3$s.",
-                                    MIN_API_LEVEL, traceOptions.device, apiLevelString));
-            return;
-        }
-
-        try {
-            setupForwarding(device, LOCAL_FORWARDED_PORT);
-        } catch (Exception e) {
-            MessageDialog.openError(shell, "Setup GL Trace",
-                    "Error while setting up port forwarding: " + e.getMessage());
-            return;
-        }
-
-        try {
-            if (!SYSTEM_APP.equals(traceOptions.appToTrace)) {
-                startActivity(device, traceOptions.appToTrace, traceOptions.activityToTrace,
-                        traceOptions.isActivityNameFullyQualified);
-            }
-        } catch (Exception e) {
-            MessageDialog.openError(shell, "Setup GL Trace",
-                    "Error while launching application: " + e.getMessage());
-            return;
-        }
-
-        // if everything went well, the app should now be waiting for the gl debugger
-        // to connect
-        startTracing(shell, traceOptions, LOCAL_FORWARDED_PORT);
-
-        // once tracing is complete, remove port forwarding
-        disablePortForwarding(device, LOCAL_FORWARDED_PORT);
-
-        // and finally open the editor to view the file
-        openInEditor(shell, traceOptions.traceDestination);
-    }
-
-    public static void openInEditor(Shell shell, String traceFilePath) {
-        final IFileStore fileStore = EFS.getLocalFileSystem().getStore(new Path(traceFilePath));
-        if (!fileStore.fetchInfo().exists()) {
-            return;
-        }
-
-        final IWorkbench workbench = PlatformUI.getWorkbench();
-        IWorkbenchWindow window = workbench.getActiveWorkbenchWindow();
-        if (window == null) {
-            return;
-        }
-
-        IWorkbenchPage page = window.getActivePage();
-        if (page == null) {
-            return;
-        }
-
-        try {
-            workbench.showPerspective("com.android.ide.eclipse.gltrace.perspective", window);
-        } catch (WorkbenchException e) {
-        }
-
-        // if there is a editor already open, then refresh its model
-        GLFunctionTraceViewer viewer = getOpenTraceViewer(page, traceFilePath);
-        if (viewer != null) {
-            viewer.setInput(shell, traceFilePath);
-        }
-
-        // open the editor (if not open), or bring it to foreground if it is already open
-        try {
-            IDE.openEditorOnFileStore(page, fileStore);
-        } catch (PartInitException e) {
-            GlTracePlugin.getDefault().logMessage(
-                    "Unexpected error while opening gltrace file in editor: " + e);
-            return;
-        }
-    }
-
-    /**
-     * Returns the editor part that has the provided file path open.
-     * @param page page containing editors
-     * @param traceFilePath file that should be open in an editor
-     * @return if given trace file is already open, then a reference to that editor part,
-     *         null otherwise
-     */
-    private static GLFunctionTraceViewer getOpenTraceViewer(IWorkbenchPage page,
-            String traceFilePath) {
-        IEditorReference[] editorRefs = page.getEditorReferences();
-        for (IEditorReference ref : editorRefs) {
-            String id = ref.getId();
-            if (!GLFunctionTraceViewer.ID.equals(id)) {
-                continue;
-            }
-
-            IEditorInput input = null;
-            try {
-                input = ref.getEditorInput();
-            } catch (PartInitException e) {
-                continue;
-            }
-
-            if (!(input instanceof IURIEditorInput)) {
-                continue;
-            }
-
-            if (traceFilePath.equals(((IURIEditorInput) input).getURI().getPath())) {
-                return (GLFunctionTraceViewer) ref.getEditor(true);
-            }
-        }
-
-        return null;
-    }
-
-    @SuppressWarnings("resource") // Closeables.closeQuietly
-    public static void startTracing(Shell shell, TraceOptions traceOptions, int port) {
-        Socket socket = new Socket();
-        DataInputStream traceDataStream = null;
-        DataOutputStream traceCommandsStream = null;
-        try {
-            socket.connect(new java.net.InetSocketAddress("127.0.0.1", port)); //$NON-NLS-1$
-            socket.setTcpNoDelay(true);
-            traceDataStream = new DataInputStream(socket.getInputStream());
-            traceCommandsStream = new DataOutputStream(socket.getOutputStream());
-        } catch (IOException e) {
-            MessageDialog.openError(shell,
-                    "OpenGL Trace",
-                    "Unable to connect to remote GL Trace Server: " + e.getMessage());
-            return;
-        }
-
-        // create channel to send trace commands to device
-        TraceCommandWriter traceCommandWriter = new TraceCommandWriter(traceCommandsStream);
-        try {
-            traceCommandWriter.setTraceOptions(traceOptions.collectFbOnEglSwap,
-                    traceOptions.collectFbOnGlDraw,
-                    traceOptions.collectTextureData);
-        } catch (IOException e) {
-            MessageDialog.openError(shell,
-                    "OpenGL Trace",
-                    "Unexpected error while setting trace options: " + e.getMessage());
-            closeSocket(socket);
-            return;
-        }
-
-        FileOutputStream fos = null;
-        try {
-            fos = new FileOutputStream(traceOptions.traceDestination, false);
-        } catch (FileNotFoundException e) {
-            // input path is valid, so this cannot occur
-        }
-
-        // create trace writer that writes to a trace file
-        TraceFileWriter traceFileWriter = new TraceFileWriter(fos, traceDataStream);
-        traceFileWriter.start();
-
-        GLTraceCollectorDialog dlg = new GLTraceCollectorDialog(shell,
-                traceFileWriter,
-                traceCommandWriter,
-                traceOptions);
-        dlg.open();
-
-        traceFileWriter.stopTracing();
-        traceCommandWriter.close();
-        closeSocket(socket);
-    }
-
-    private static void closeSocket(Socket socket) {
-        try {
-            socket.close();
-        } catch (IOException e) {
-            // ignore error while closing socket
-        }
-    }
-
-    private void startActivity(IDevice device, String appPackage, String activity,
-            boolean isActivityNameFullyQualified)
-            throws TimeoutException, AdbCommandRejectedException,
-            ShellCommandUnresponsiveException, IOException, InterruptedException {
-        killApp(device, appPackage); // kill app if it is already running
-        waitUntilAppKilled(device, appPackage, KILL_TIMEOUT);
-
-        StringBuilder activityPath = new StringBuilder(appPackage);
-        if (!activity.isEmpty()) {
-            activityPath.append('/');
-            if (!isActivityNameFullyQualified) {
-                activityPath.append('.');
-            }
-            activityPath.append(activity);
-        }
-        String startAppCmd = String.format(
-                "am start --opengl-trace %s -a android.intent.action.MAIN -c android.intent.category.LAUNCHER", //$NON-NLS-1$
-                activityPath.toString());
-
-        Semaphore launchCompletionSempahore = new Semaphore(0);
-        StartActivityOutputReceiver receiver = new StartActivityOutputReceiver(
-                launchCompletionSempahore);
-        device.executeShellCommand(startAppCmd, receiver);
-
-        // wait until shell finishes launch command
-        launchCompletionSempahore.acquire();
-
-        // throw exception if there was an error during launch
-        String output = receiver.getOutput();
-        if (output.contains("Error")) {             //$NON-NLS-1$
-            throw new RuntimeException(output);
-        }
-
-        // wait until the app itself has been launched
-        waitUntilAppLaunched(device, appPackage, LAUNCH_TIMEOUT);
-    }
-
-    private void killApp(IDevice device, String appName) {
-        Client client = device.getClient(appName);
-        if (client != null) {
-            client.kill();
-        }
-    }
-
-    private void waitUntilAppLaunched(final IDevice device, final String appName, int timeout) {
-        Callable<Boolean> c = new Callable<Boolean>() {
-            @Override
-            public Boolean call() throws Exception {
-                Client client;
-                do {
-                    client = device.getClient(appName);
-                } while (client == null);
-
-                return Boolean.TRUE;
-            }
-        };
-        try {
-            new SimpleTimeLimiter().callWithTimeout(c, timeout, TimeUnit.SECONDS, true);
-        } catch (Exception e) {
-            throw new RuntimeException("Timed out waiting for application to launch.");
-        }
-
-        // once the app has launched, wait an additional couple of seconds
-        // for it to start up
-        try {
-            Thread.sleep(2000);
-        } catch (InterruptedException e) {
-            // ignore
-        }
-    }
-
-    private void waitUntilAppKilled(final IDevice device, final String appName, int timeout) {
-        Callable<Boolean> c = new Callable<Boolean>() {
-            @Override
-            public Boolean call() throws Exception {
-                Client client;
-                while ((client = device.getClient(appName)) != null) {
-                    client.kill();
-                }
-                return Boolean.TRUE;
-            }
-        };
-        try {
-            new SimpleTimeLimiter().callWithTimeout(c, timeout, TimeUnit.SECONDS, true);
-        } catch (Exception e) {
-            throw new RuntimeException("Timed out waiting for running application to die.");
-        }
-    }
-
-    public static void setupForwarding(IDevice device, int i)
-            throws TimeoutException, AdbCommandRejectedException, IOException {
-        device.createForward(i, GLTRACE_UDS, DeviceUnixSocketNamespace.ABSTRACT);
-    }
-
-    public static void disablePortForwarding(IDevice device, int port) {
-        try {
-            device.removeForward(port, GLTRACE_UDS, DeviceUnixSocketNamespace.ABSTRACT);
-        } catch (Exception e) {
-            // ignore exceptions;
-        }
-    }
-
-    private IDevice getDevice(String deviceName) {
-        IDevice[] devices = AndroidDebugBridge.getBridge().getDevices();
-
-        for (IDevice device : devices) {
-            if (device.getName().equals(deviceName)) {
-                return device;
-            }
-        }
-
-        return null;
-    }
-
-    private static class StartActivityOutputReceiver implements IShellOutputReceiver {
-        private Semaphore mSemaphore;
-        private StringBuffer sb = new StringBuffer(300);
-
-        public StartActivityOutputReceiver(Semaphore s) {
-            mSemaphore = s;
-        }
-
-        @Override
-        public void addOutput(byte[] data, int offset, int length) {
-            String d = new String(data, offset, length);
-            sb.append(d);
-        }
-
-        @Override
-        public void flush() {
-            mSemaphore.release();
-        }
-
-        @Override
-        public boolean isCancelled() {
-            return false;
-        }
-
-        public String getOutput() {
-            return sb.toString();
-        }
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/DeviceViewAction.java b/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/DeviceViewAction.java
deleted file mode 100644
index 7d912ba..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/DeviceViewAction.java
+++ /dev/null
@@ -1,113 +0,0 @@
-package com.android.ide.eclipse.gltrace;
-
-import com.android.ddmlib.Client;
-import com.android.ddmlib.ClientData;
-import com.android.ide.eclipse.ddms.IClientAction;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.jface.dialogs.ProgressMonitorDialog;
-import org.eclipse.jface.operation.IRunnableWithProgress;
-import org.eclipse.jface.window.Window;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Shell;
-
-import java.lang.reflect.InvocationTargetException;
-
-public class DeviceViewAction implements IClientAction {
-    private static final class StartTraceAction extends Action {
-        private static final int LOCAL_FORWARDED_PORT = 6049;
-
-        private Client mClient;
-
-        public StartTraceAction() {
-            super("Start OpenGL Trace");
-            setImageDescriptor(GlTracePlugin.getImageDescriptor("/icons/connect.png")); //$NON-NLS-1$
-            setClient(null);
-        }
-
-        public void setClient(Client c) {
-            mClient = c;
-            clientChanged();
-        }
-
-        private void clientChanged() {
-            if (mClient == null) {
-                setEnabled(false);
-                return;
-            }
-
-            ClientData cd = mClient.getClientData();
-            if (cd.hasFeature(ClientData.FEATURE_OPENGL_TRACING)) {
-                setEnabled(true);
-                setToolTipText("Trace OpenGL calls");
-            } else {
-                setEnabled(false);
-                setToolTipText("Selected VM does not support tracing OpenGL calls");
-            }
-        }
-
-        @Override
-        public void run() {
-            if (mClient == null) {
-                return;
-            }
-
-            Shell shell = Display.getDefault().getActiveShell();
-            GLTraceOptionsDialog dlg = new GLTraceOptionsDialog(shell, false,
-                    mClient.getClientData().getClientDescription());
-            if (dlg.open() != Window.OK) {
-                return;
-            }
-
-            // start tracing on the client
-            mClient.startOpenGlTracing();
-
-            try {
-                CollectTraceAction.setupForwarding(mClient.getDevice(), LOCAL_FORWARDED_PORT);
-            } catch (Exception e) {
-                MessageDialog.openError(shell, "Setup GL Trace",
-                        "Error while setting up port forwarding: " + e.getMessage());
-                return;
-            }
-
-            // wait for a few seconds for the client to start the trace server
-            try {
-                new ProgressMonitorDialog(shell).run(true, true, new IRunnableWithProgress() {
-                    @Override
-                    public void run(IProgressMonitor monitor)
-                            throws InvocationTargetException, InterruptedException {
-                        Thread.sleep(3000);
-                    }
-                });
-            } catch (Exception e) {
-            }
-
-            // retrieve the trace from the device
-            TraceOptions traceOptions = dlg.getTraceOptions();
-            CollectTraceAction.startTracing(shell, traceOptions, LOCAL_FORWARDED_PORT);
-
-            // inform the client that it doesn't need to be traced anymore
-            mClient.stopOpenGlTracing();
-
-            // remove port forwarding
-            CollectTraceAction.disablePortForwarding(mClient.getDevice(), LOCAL_FORWARDED_PORT);
-
-            // and finally open the editor to view the file
-            CollectTraceAction.openInEditor(shell, traceOptions.traceDestination);
-        }
-    }
-
-    private static final StartTraceAction sAction = new StartTraceAction();
-
-    @Override
-    public Action getAction() {
-        return sAction;
-    }
-
-    @Override
-    public void selectedClientChanged(Client c) {
-        sAction.setClient(c);
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/FileUtils.java b/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/FileUtils.java
deleted file mode 100644
index ab06f67..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/FileUtils.java
+++ /dev/null
@@ -1,42 +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.eclipse.gltrace;
-
-import com.google.common.io.Files;
-
-import java.io.File;
-import java.io.IOException;
-
-public class FileUtils {
-    private static final File sCacheDir;
-
-    static {
-        sCacheDir = Files.createTempDir();
-        sCacheDir.deleteOnExit();
-    }
-
-    public static File createTempFile(String prefix, String suffix) {
-        File f;
-        try {
-            f = File.createTempFile(prefix, suffix, sCacheDir);
-        } catch (IOException e) {
-            throw new RuntimeException(e);
-        }
-        f.deleteOnExit();
-        return f;
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/GLEnum.java b/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/GLEnum.java
deleted file mode 100644
index ceb9f1a..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/GLEnum.java
+++ /dev/null
@@ -1,1017 +0,0 @@
-/*
- ** 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.
- */
-
-// auto generated by generate_GLEnum_java.py"
-
-package com.android.ide.eclipse.gltrace;
-
-public enum GLEnum {
-    GL_NONE(0x0000),
-    GL_LINES(0x0001),
-    GL_LINE_LOOP(0x0002),
-    GL_LINE_STRIP(0x0003),
-    GL_TRIANGLES(0x0004),
-    GL_TRIANGLE_STRIP(0x0005),
-    GL_TRIANGLE_FAN(0x0006),
-    GL_ADD(0x0104),
-    GL_NEVER(0x0200),
-    GL_LESS(0x0201),
-    GL_EQUAL(0x0202),
-    GL_LEQUAL(0x0203),
-    GL_GREATER(0x0204),
-    GL_NOTEQUAL(0x0205),
-    GL_GEQUAL(0x0206),
-    GL_ALWAYS(0x0207),
-    GL_SRC_COLOR(0x0300),
-    GL_ONE_MINUS_SRC_COLOR(0x0301),
-    GL_SRC_ALPHA(0x0302),
-    GL_ONE_MINUS_SRC_ALPHA(0x0303),
-    GL_DST_ALPHA(0x0304),
-    GL_ONE_MINUS_DST_ALPHA(0x0305),
-    GL_DST_COLOR(0x0306),
-    GL_ONE_MINUS_DST_COLOR(0x0307),
-    GL_SRC_ALPHA_SATURATE(0x0308),
-    GL_FRONT(0x0404),
-    GL_BACK(0x0405),
-    GL_FRONT_AND_BACK(0x0408),
-    GL_INVALID_ENUM(0x0500),
-    GL_INVALID_VALUE(0x0501),
-    GL_INVALID_OPERATION(0x0502),
-    GL_STACK_OVERFLOW(0x0503),
-    GL_STACK_UNDERFLOW(0x0504),
-    GL_OUT_OF_MEMORY(0x0505),
-    GL_INVALID_FRAMEBUFFER_OPERATION(0x0506),
-    GL_EXP(0x0800),
-    GL_EXP2(0x0801),
-    GL_CW(0x0900),
-    GL_CCW(0x0901),
-    GL_CURRENT_COLOR(0x0B00),
-    GL_CURRENT_NORMAL(0x0B02),
-    GL_CURRENT_TEXTURE_COORDS(0x0B03),
-    GL_POINT_SMOOTH(0x0B10),
-    GL_POINT_SIZE(0x0B11),
-    GL_SMOOTH_POINT_SIZE_RANGE(0x0B12),
-    GL_LINE_SMOOTH(0x0B20),
-    GL_LINE_WIDTH(0x0B21),
-    GL_SMOOTH_LINE_WIDTH_RANGE(0x0B22),
-    GL_CULL_FACE(0x0B44),
-    GL_CULL_FACE_MODE(0x0B45),
-    GL_FRONT_FACE(0x0B46),
-    GL_LIGHTING(0x0B50),
-    GL_LIGHT_MODEL_TWO_SIDE(0x0B52),
-    GL_LIGHT_MODEL_AMBIENT(0x0B53),
-    GL_SHADE_MODEL(0x0B54),
-    GL_COLOR_MATERIAL(0x0B57),
-    GL_FOG(0x0B60),
-    GL_FOG_DENSITY(0x0B62),
-    GL_FOG_START(0x0B63),
-    GL_FOG_END(0x0B64),
-    GL_FOG_MODE(0x0B65),
-    GL_FOG_COLOR(0x0B66),
-    GL_DEPTH_RANGE(0x0B70),
-    GL_DEPTH_TEST(0x0B71),
-    GL_DEPTH_WRITEMASK(0x0B72),
-    GL_DEPTH_CLEAR_VALUE(0x0B73),
-    GL_DEPTH_FUNC(0x0B74),
-    GL_STENCIL_TEST(0x0B90),
-    GL_STENCIL_CLEAR_VALUE(0x0B91),
-    GL_STENCIL_FUNC(0x0B92),
-    GL_STENCIL_VALUE_MASK(0x0B93),
-    GL_STENCIL_FAIL(0x0B94),
-    GL_STENCIL_PASS_DEPTH_FAIL(0x0B95),
-    GL_STENCIL_PASS_DEPTH_PASS(0x0B96),
-    GL_STENCIL_REF(0x0B97),
-    GL_STENCIL_WRITEMASK(0x0B98),
-    GL_MATRIX_MODE(0x0BA0),
-    GL_NORMALIZE(0x0BA1),
-    GL_VIEWPORT(0x0BA2),
-    GL_MODELVIEW_STACK_DEPTH(0x0BA3),
-    GL_PROJECTION_STACK_DEPTH(0x0BA4),
-    GL_TEXTURE_STACK_DEPTH(0x0BA5),
-    GL_MODELVIEW_MATRIX(0x0BA6),
-    GL_PROJECTION_MATRIX(0x0BA7),
-    GL_TEXTURE_MATRIX(0x0BA8),
-    GL_ALPHA_TEST(0x0BC0),
-    GL_ALPHA_TEST_FUNC(0x0BC1),
-    GL_ALPHA_TEST_REF(0x0BC2),
-    GL_DITHER(0x0BD0),
-    GL_BLEND_DST(0x0BE0),
-    GL_BLEND_SRC(0x0BE1),
-    GL_BLEND(0x0BE2),
-    GL_LOGIC_OP_MODE(0x0BF0),
-    GL_COLOR_LOGIC_OP(0x0BF2),
-    GL_READ_BUFFER_NV(0x0C02),
-    GL_SCISSOR_BOX(0x0C10),
-    GL_SCISSOR_TEST(0x0C11),
-    GL_COLOR_CLEAR_VALUE(0x0C22),
-    GL_COLOR_WRITEMASK(0x0C23),
-    GL_PERSPECTIVE_CORRECTION_HINT(0x0C50),
-    GL_POINT_SMOOTH_HINT(0x0C51),
-    GL_LINE_SMOOTH_HINT(0x0C52),
-    GL_FOG_HINT(0x0C54),
-    GL_UNPACK_ROW_LENGTH(0x0CF2),
-    GL_UNPACK_SKIP_ROWS(0x0CF3),
-    GL_UNPACK_SKIP_PIXELS(0x0CF4),
-    GL_UNPACK_ALIGNMENT(0x0CF5),
-    GL_PACK_ALIGNMENT(0x0D05),
-    GL_ALPHA_SCALE(0x0D1C),
-    GL_MAX_LIGHTS(0x0D31),
-    GL_MAX_CLIP_PLANES(0x0D32),
-    GL_MAX_TEXTURE_SIZE(0x0D33),
-    GL_MAX_MODELVIEW_STACK_DEPTH(0x0D36),
-    GL_MAX_PROJECTION_STACK_DEPTH(0x0D38),
-    GL_MAX_TEXTURE_STACK_DEPTH(0x0D39),
-    GL_MAX_VIEWPORT_DIMS(0x0D3A),
-    GL_SUBPIXEL_BITS(0x0D50),
-    GL_RED_BITS(0x0D52),
-    GL_GREEN_BITS(0x0D53),
-    GL_BLUE_BITS(0x0D54),
-    GL_ALPHA_BITS(0x0D55),
-    GL_DEPTH_BITS(0x0D56),
-    GL_STENCIL_BITS(0x0D57),
-    GL_TEXTURE_2D(0x0DE1),
-    GL_DONT_CARE(0x1100),
-    GL_FASTEST(0x1101),
-    GL_NICEST(0x1102),
-    GL_AMBIENT(0x1200),
-    GL_DIFFUSE(0x1201),
-    GL_SPECULAR(0x1202),
-    GL_POSITION(0x1203),
-    GL_SPOT_DIRECTION(0x1204),
-    GL_SPOT_EXPONENT(0x1205),
-    GL_SPOT_CUTOFF(0x1206),
-    GL_CONSTANT_ATTENUATION(0x1207),
-    GL_LINEAR_ATTENUATION(0x1208),
-    GL_QUADRATIC_ATTENUATION(0x1209),
-    GL_BYTE(0x1400),
-    GL_UNSIGNED_BYTE(0x1401),
-    GL_SHORT(0x1402),
-    GL_UNSIGNED_SHORT(0x1403),
-    GL_INT(0x1404),
-    GL_UNSIGNED_INT(0x1405),
-    GL_FLOAT(0x1406),
-    GL_FIXED(0x140C),
-    GL_CLEAR(0x1500),
-    GL_AND(0x1501),
-    GL_AND_REVERSE(0x1502),
-    GL_COPY(0x1503),
-    GL_AND_INVERTED(0x1504),
-    GL_NOOP(0x1505),
-    GL_XOR(0x1506),
-    GL_OR(0x1507),
-    GL_NOR(0x1508),
-    GL_EQUIV(0x1509),
-    GL_INVERT(0x150A),
-    GL_OR_REVERSE(0x150B),
-    GL_COPY_INVERTED(0x150C),
-    GL_OR_INVERTED(0x150D),
-    GL_NAND(0x150E),
-    GL_SET(0x150F),
-    GL_EMISSION(0x1600),
-    GL_SHININESS(0x1601),
-    GL_AMBIENT_AND_DIFFUSE(0x1602),
-    GL_MODELVIEW(0x1700),
-    GL_PROJECTION(0x1701),
-    GL_TEXTURE(0x1702),
-    GL_COLOR_EXT(0x1800),
-    GL_DEPTH_EXT(0x1801),
-    GL_STENCIL_EXT(0x1802),
-    GL_STENCIL_INDEX(0x1901),
-    GL_DEPTH_COMPONENT(0x1902),
-    GL_RED_EXT(0x1903),
-    GL_ALPHA(0x1906),
-    GL_RGB(0x1907),
-    GL_RGBA(0x1908),
-    GL_LUMINANCE(0x1909),
-    GL_LUMINANCE_ALPHA(0x190A),
-    GL_FLAT(0x1D00),
-    GL_SMOOTH(0x1D01),
-    GL_KEEP(0x1E00),
-    GL_REPLACE(0x1E01),
-    GL_INCR(0x1E02),
-    GL_DECR(0x1E03),
-    GL_VENDOR(0x1F00),
-    GL_RENDERER(0x1F01),
-    GL_VERSION(0x1F02),
-    GL_EXTENSIONS(0x1F03),
-    GL_MODULATE(0x2100),
-    GL_DECAL(0x2101),
-    GL_TEXTURE_ENV_MODE(0x2200),
-    GL_TEXTURE_ENV_COLOR(0x2201),
-    GL_TEXTURE_ENV(0x2300),
-    GL_TEXTURE_GEN_MODE(0x2500),
-    GL_NEAREST(0x2600),
-    GL_LINEAR(0x2601),
-    GL_NEAREST_MIPMAP_NEAREST(0x2700),
-    GL_LINEAR_MIPMAP_NEAREST(0x2701),
-    GL_NEAREST_MIPMAP_LINEAR(0x2702),
-    GL_LINEAR_MIPMAP_LINEAR(0x2703),
-    GL_TEXTURE_MAG_FILTER(0x2800),
-    GL_TEXTURE_MIN_FILTER(0x2801),
-    GL_TEXTURE_WRAP_S(0x2802),
-    GL_TEXTURE_WRAP_T(0x2803),
-    GL_REPEAT(0x2901),
-    GL_POLYGON_OFFSET_UNITS(0x2A00),
-    GL_CLIP_PLANE0(0x3000),
-    GL_CLIP_PLANE1(0x3001),
-    GL_CLIP_PLANE2(0x3002),
-    GL_CLIP_PLANE3(0x3003),
-    GL_CLIP_PLANE4(0x3004),
-    GL_CLIP_PLANE5(0x3005),
-    GL_LIGHT0(0x4000),
-    GL_LIGHT1(0x4001),
-    GL_LIGHT2(0x4002),
-    GL_LIGHT3(0x4003),
-    GL_LIGHT4(0x4004),
-    GL_LIGHT5(0x4005),
-    GL_LIGHT6(0x4006),
-    GL_LIGHT7(0x4007),
-    GL_COVERAGE_BUFFER_BIT_NV(0x8000),
-    GL_CONSTANT_COLOR(0x8001),
-    GL_ONE_MINUS_CONSTANT_COLOR(0x8002),
-    GL_CONSTANT_ALPHA(0x8003),
-    GL_ONE_MINUS_CONSTANT_ALPHA(0x8004),
-    GL_BLEND_COLOR(0x8005),
-    GL_FUNC_ADD(0x8006),
-    GL_MIN_EXT(0x8007),
-    GL_MAX_EXT(0x8008),
-    GL_BLEND_EQUATION_RGB(0x8009),
-    GL_FUNC_SUBTRACT(0x800A),
-    GL_FUNC_REVERSE_SUBTRACT(0x800B),
-    GL_UNSIGNED_SHORT_4_4_4_4(0x8033),
-    GL_UNSIGNED_SHORT_5_5_5_1(0x8034),
-    GL_POLYGON_OFFSET_FILL(0x8037),
-    GL_POLYGON_OFFSET_FACTOR(0x8038),
-    GL_RESCALE_NORMAL(0x803A),
-    GL_ALPHA8_EXT(0x803C),
-    GL_LUMINANCE8_EXT(0x8040),
-    GL_LUMINANCE8_ALPHA8_EXT(0x8045),
-    GL_RGB8(0x8051),
-    GL_RGB10_EXT(0x8052),
-    GL_RGBA4(0x8056),
-    GL_RGB5_A1(0x8057),
-    GL_RGBA8(0x8058),
-    GL_RGB10_A2_EXT(0x8059),
-    GL_TEXTURE_BINDING_2D(0x8069),
-    GL_TEXTURE_BINDING_3D(0x806A),
-    GL_TEXTURE_3D(0x806F),
-    GL_TEXTURE_WRAP_R(0x8072),
-    GL_MAX_3D_TEXTURE_SIZE(0x8073),
-    GL_VERTEX_ARRAY(0x8074),
-    GL_NORMAL_ARRAY(0x8075),
-    GL_COLOR_ARRAY(0x8076),
-    GL_TEXTURE_COORD_ARRAY(0x8078),
-    GL_VERTEX_ARRAY_SIZE(0x807A),
-    GL_VERTEX_ARRAY_TYPE(0x807B),
-    GL_VERTEX_ARRAY_STRIDE(0x807C),
-    GL_NORMAL_ARRAY_TYPE(0x807E),
-    GL_NORMAL_ARRAY_STRIDE(0x807F),
-    GL_COLOR_ARRAY_SIZE(0x8081),
-    GL_COLOR_ARRAY_TYPE(0x8082),
-    GL_COLOR_ARRAY_STRIDE(0x8083),
-    GL_TEXTURE_COORD_ARRAY_SIZE(0x8088),
-    GL_TEXTURE_COORD_ARRAY_TYPE(0x8089),
-    GL_TEXTURE_COORD_ARRAY_STRIDE(0x808A),
-    GL_VERTEX_ARRAY_POINTER(0x808E),
-    GL_NORMAL_ARRAY_POINTER(0x808F),
-    GL_COLOR_ARRAY_POINTER(0x8090),
-    GL_TEXTURE_COORD_ARRAY_POINTER(0x8092),
-    GL_MULTISAMPLE(0x809D),
-    GL_SAMPLE_ALPHA_TO_COVERAGE(0x809E),
-    GL_SAMPLE_ALPHA_TO_ONE(0x809F),
-    GL_SAMPLE_COVERAGE(0x80A0),
-    GL_SAMPLE_BUFFERS(0x80A8),
-    GL_SAMPLES(0x80A9),
-    GL_SAMPLE_COVERAGE_VALUE(0x80AA),
-    GL_SAMPLE_COVERAGE_INVERT(0x80AB),
-    GL_BLEND_DST_RGB(0x80C8),
-    GL_BLEND_SRC_RGB(0x80C9),
-    GL_BLEND_DST_ALPHA(0x80CA),
-    GL_BLEND_SRC_ALPHA(0x80CB),
-    GL_BGRA_EXT(0x80E1),
-    GL_POINT_SIZE_MIN(0x8126),
-    GL_POINT_SIZE_MAX(0x8127),
-    GL_POINT_FADE_THRESHOLD_SIZE(0x8128),
-    GL_POINT_DISTANCE_ATTENUATION(0x8129),
-    GL_CLAMP_TO_EDGE(0x812F),
-    GL_GENERATE_MIPMAP(0x8191),
-    GL_GENERATE_MIPMAP_HINT(0x8192),
-    GL_DEPTH_COMPONENT16(0x81A5),
-    GL_DEPTH_COMPONENT24(0x81A6),
-    GL_DEPTH_COMPONENT32(0x81A7),
-    GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING_EXT(0x8210),
-    GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE_EXT(0x8211),
-    GL_RG_EXT(0x8227),
-    GL_R8_EXT(0x8229),
-    GL_RG8_EXT(0x822B),
-    GL_R16F_EXT(0x822D),
-    GL_RG16F_EXT(0x822F),
-    GL_LOSE_CONTEXT_ON_RESET_EXT(0x8252),
-    GL_GUILTY_CONTEXT_RESET_EXT(0x8253),
-    GL_INNOCENT_CONTEXT_RESET_EXT(0x8254),
-    GL_UNKNOWN_CONTEXT_RESET_EXT(0x8255),
-    GL_RESET_NOTIFICATION_STRATEGY_EXT(0x8256),
-    GL_PROGRAM_SEPARABLE_EXT(0x8258),
-    GL_ACTIVE_PROGRAM_EXT(0x8259),
-    GL_PROGRAM_PIPELINE_BINDING_EXT(0x825A),
-    GL_NO_RESET_NOTIFICATION_EXT(0x8261),
-    GL_UNSIGNED_SHORT_5_6_5(0x8363),
-    GL_UNSIGNED_SHORT_4_4_4_4_REV_EXT(0x8365),
-    GL_UNSIGNED_SHORT_1_5_5_5_REV_EXT(0x8366),
-    GL_UNSIGNED_INT_2_10_10_10_REV_EXT(0x8368),
-    GL_MIRRORED_REPEAT(0x8370),
-    GL_COMPRESSED_RGB_S3TC_DXT1_EXT(0x83F0),
-    GL_COMPRESSED_RGBA_S3TC_DXT1_EXT(0x83F1),
-    GL_ALIASED_POINT_SIZE_RANGE(0x846D),
-    GL_ALIASED_LINE_WIDTH_RANGE(0x846E),
-    GL_TEXTURE0(0x84C0),
-    GL_TEXTURE1(0x84C1),
-    GL_TEXTURE2(0x84C2),
-    GL_TEXTURE3(0x84C3),
-    GL_TEXTURE4(0x84C4),
-    GL_TEXTURE5(0x84C5),
-    GL_TEXTURE6(0x84C6),
-    GL_TEXTURE7(0x84C7),
-    GL_TEXTURE8(0x84C8),
-    GL_TEXTURE9(0x84C9),
-    GL_TEXTURE10(0x84CA),
-    GL_TEXTURE11(0x84CB),
-    GL_TEXTURE12(0x84CC),
-    GL_TEXTURE13(0x84CD),
-    GL_TEXTURE14(0x84CE),
-    GL_TEXTURE15(0x84CF),
-    GL_TEXTURE16(0x84D0),
-    GL_TEXTURE17(0x84D1),
-    GL_TEXTURE18(0x84D2),
-    GL_TEXTURE19(0x84D3),
-    GL_TEXTURE20(0x84D4),
-    GL_TEXTURE21(0x84D5),
-    GL_TEXTURE22(0x84D6),
-    GL_TEXTURE23(0x84D7),
-    GL_TEXTURE24(0x84D8),
-    GL_TEXTURE25(0x84D9),
-    GL_TEXTURE26(0x84DA),
-    GL_TEXTURE27(0x84DB),
-    GL_TEXTURE28(0x84DC),
-    GL_TEXTURE29(0x84DD),
-    GL_TEXTURE30(0x84DE),
-    GL_TEXTURE31(0x84DF),
-    GL_ACTIVE_TEXTURE(0x84E0),
-    GL_CLIENT_ACTIVE_TEXTURE(0x84E1),
-    GL_MAX_TEXTURE_UNITS(0x84E2),
-    GL_SUBTRACT(0x84E7),
-    GL_MAX_RENDERBUFFER_SIZE(0x84E8),
-    GL_ALL_COMPLETED_NV(0x84F2),
-    GL_FENCE_STATUS_NV(0x84F3),
-    GL_FENCE_CONDITION_NV(0x84F4),
-    GL_DEPTH_STENCIL(0x84F9),
-    GL_UNSIGNED_INT_24_8(0x84FA),
-    GL_MAX_TEXTURE_LOD_BIAS_EXT(0x84FD),
-    GL_TEXTURE_MAX_ANISOTROPY_EXT(0x84FE),
-    GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT(0x84FF),
-    GL_TEXTURE_FILTER_CONTROL_EXT(0x8500),
-    GL_TEXTURE_LOD_BIAS_EXT(0x8501),
-    GL_INCR_WRAP(0x8507),
-    GL_DECR_WRAP(0x8508),
-    GL_NORMAL_MAP(0x8511),
-    GL_REFLECTION_MAP(0x8512),
-    GL_TEXTURE_CUBE_MAP(0x8513),
-    GL_TEXTURE_BINDING_CUBE_MAP(0x8514),
-    GL_TEXTURE_CUBE_MAP_POSITIVE_X(0x8515),
-    GL_TEXTURE_CUBE_MAP_NEGATIVE_X(0x8516),
-    GL_TEXTURE_CUBE_MAP_POSITIVE_Y(0x8517),
-    GL_TEXTURE_CUBE_MAP_NEGATIVE_Y(0x8518),
-    GL_TEXTURE_CUBE_MAP_POSITIVE_Z(0x8519),
-    GL_TEXTURE_CUBE_MAP_NEGATIVE_Z(0x851A),
-    GL_MAX_CUBE_MAP_TEXTURE_SIZE(0x851C),
-    GL_COMBINE(0x8570),
-    GL_COMBINE_RGB(0x8571),
-    GL_COMBINE_ALPHA(0x8572),
-    GL_RGB_SCALE(0x8573),
-    GL_ADD_SIGNED(0x8574),
-    GL_INTERPOLATE(0x8575),
-    GL_CONSTANT(0x8576),
-    GL_PRIMARY_COLOR(0x8577),
-    GL_PREVIOUS(0x8578),
-    GL_SRC0_RGB(0x8580),
-    GL_SRC1_RGB(0x8581),
-    GL_SRC2_RGB(0x8582),
-    GL_SRC0_ALPHA(0x8588),
-    GL_SRC1_ALPHA(0x8589),
-    GL_SRC2_ALPHA(0x858A),
-    GL_OPERAND0_RGB(0x8590),
-    GL_OPERAND1_RGB(0x8591),
-    GL_OPERAND2_RGB(0x8592),
-    GL_OPERAND0_ALPHA(0x8598),
-    GL_OPERAND1_ALPHA(0x8599),
-    GL_OPERAND2_ALPHA(0x859A),
-    GL_VERTEX_ARRAY_BINDING(0x85B5),
-    GL_UNSIGNED_SHORT_8_8_APPLE(0x85BA),
-    GL_UNSIGNED_SHORT_8_8_REV_APPLE(0x85BB),
-    GL_VERTEX_ATTRIB_ARRAY_ENABLED(0x8622),
-    GL_VERTEX_ATTRIB_ARRAY_SIZE(0x8623),
-    GL_VERTEX_ATTRIB_ARRAY_STRIDE(0x8624),
-    GL_VERTEX_ATTRIB_ARRAY_TYPE(0x8625),
-    GL_CURRENT_VERTEX_ATTRIB(0x8626),
-    GL_VERTEX_ATTRIB_ARRAY_POINTER(0x8645),
-    GL_NUM_COMPRESSED_TEXTURE_FORMATS(0x86A2),
-    GL_COMPRESSED_TEXTURE_FORMATS(0x86A3),
-    GL_MAX_VERTEX_UNITS(0x86A4),
-    GL_WEIGHT_ARRAY_TYPE(0x86A9),
-    GL_WEIGHT_ARRAY_STRIDE(0x86AA),
-    GL_WEIGHT_ARRAY_SIZE(0x86AB),
-    GL_WEIGHT_ARRAY_POINTER(0x86AC),
-    GL_WEIGHT_ARRAY(0x86AD),
-    GL_DOT3_RGB(0x86AE),
-    GL_DOT3_RGBA(0x86AF),
-    GL_Z400_BINARY_AMD(0x8740),
-    GL_PROGRAM_BINARY_LENGTH(0x8741),
-    GL_BUFFER_SIZE(0x8764),
-    GL_BUFFER_USAGE(0x8765),
-    GL_ATC_RGBA_INTERPOLATED_ALPHA_AMD(0x87EE),
-    GL_3DC_X_AMD(0x87F9),
-    GL_3DC_XY_AMD(0x87FA),
-    GL_NUM_PROGRAM_BINARY_FORMATS(0x87FE),
-    GL_PROGRAM_BINARY_FORMATS(0x87FF),
-    GL_STENCIL_BACK_FUNC(0x8800),
-    GL_STENCIL_BACK_FAIL(0x8801),
-    GL_STENCIL_BACK_PASS_DEPTH_FAIL(0x8802),
-    GL_STENCIL_BACK_PASS_DEPTH_PASS(0x8803),
-    GL_RGBA32F_EXT(0x8814),
-    GL_RGB32F_EXT(0x8815),
-    GL_ALPHA32F_EXT(0x8816),
-    GL_LUMINANCE32F_EXT(0x8818),
-    GL_LUMINANCE_ALPHA32F_EXT(0x8819),
-    GL_RGBA16F_EXT(0x881A),
-    GL_RGB16F_EXT(0x881B),
-    GL_ALPHA16F_EXT(0x881C),
-    GL_LUMINANCE16F_EXT(0x881E),
-    GL_LUMINANCE_ALPHA16F_EXT(0x881F),
-    GL_WRITEONLY_RENDERING_QCOM(0x8823),
-    GL_MAX_DRAW_BUFFERS_NV(0x8824),
-    GL_DRAW_BUFFER0_NV(0x8825),
-    GL_DRAW_BUFFER1_NV(0x8826),
-    GL_DRAW_BUFFER2_NV(0x8827),
-    GL_DRAW_BUFFER3_NV(0x8828),
-    GL_DRAW_BUFFER4_NV(0x8829),
-    GL_DRAW_BUFFER5_NV(0x882A),
-    GL_DRAW_BUFFER6_NV(0x882B),
-    GL_DRAW_BUFFER7_NV(0x882C),
-    GL_DRAW_BUFFER8_NV(0x882D),
-    GL_DRAW_BUFFER9_NV(0x882E),
-    GL_DRAW_BUFFER10_NV(0x882F),
-    GL_DRAW_BUFFER11_NV(0x8830),
-    GL_DRAW_BUFFER12_NV(0x8831),
-    GL_DRAW_BUFFER13_NV(0x8832),
-    GL_DRAW_BUFFER14_NV(0x8833),
-    GL_DRAW_BUFFER15_NV(0x8834),
-    GL_BLEND_EQUATION_ALPHA(0x883D),
-    GL_MATRIX_PALETTE(0x8840),
-    GL_MAX_PALETTE_MATRICES(0x8842),
-    GL_CURRENT_PALETTE_MATRIX(0x8843),
-    GL_MATRIX_INDEX_ARRAY(0x8844),
-    GL_MATRIX_INDEX_ARRAY_SIZE(0x8846),
-    GL_MATRIX_INDEX_ARRAY_TYPE(0x8847),
-    GL_MATRIX_INDEX_ARRAY_STRIDE(0x8848),
-    GL_MATRIX_INDEX_ARRAY_POINTER(0x8849),
-    GL_COMPARE_REF_TO_TEXTURE_EXT(0x884E),
-    GL_CURRENT_QUERY_EXT(0x8865),
-    GL_QUERY_RESULT_EXT(0x8866),
-    GL_QUERY_RESULT_AVAILABLE_EXT(0x8867),
-    GL_POINT_SPRITE(0x8861),
-    GL_COORD_REPLACE(0x8862),
-    GL_MAX_VERTEX_ATTRIBS(0x8869),
-    GL_VERTEX_ATTRIB_ARRAY_NORMALIZED(0x886A),
-    GL_MAX_TEXTURE_IMAGE_UNITS(0x8872),
-    GL_ARRAY_BUFFER(0x8892),
-    GL_ELEMENT_ARRAY_BUFFER(0x8893),
-    GL_ARRAY_BUFFER_BINDING(0x8894),
-    GL_ELEMENT_ARRAY_BUFFER_BINDING(0x8895),
-    GL_VERTEX_ARRAY_BUFFER_BINDING(0x8896),
-    GL_NORMAL_ARRAY_BUFFER_BINDING(0x8897),
-    GL_COLOR_ARRAY_BUFFER_BINDING(0x8898),
-    GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING(0x889A),
-    GL_WEIGHT_ARRAY_BUFFER_BINDING(0x889E),
-    GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING(0x889F),
-    GL_WRITE_ONLY(0x88B9),
-    GL_BUFFER_ACCESS(0x88BB),
-    GL_BUFFER_MAPPED(0x88BC),
-    GL_BUFFER_MAP_POINTER(0x88BD),
-    GL_STREAM_DRAW(0x88E0),
-    GL_STATIC_DRAW(0x88E4),
-    GL_DYNAMIC_DRAW(0x88E8),
-    GL_DEPTH24_STENCIL8(0x88F0),
-    GL_POINT_SIZE_ARRAY_TYPE(0x898A),
-    GL_POINT_SIZE_ARRAY_STRIDE(0x898B),
-    GL_POINT_SIZE_ARRAY_POINTER(0x898C),
-    GL_MODELVIEW_MATRIX_FLOAT_AS_INT_BITS(0x898D),
-    GL_PROJECTION_MATRIX_FLOAT_AS_INT_BITS(0x898E),
-    GL_TEXTURE_MATRIX_FLOAT_AS_INT_BITS(0x898F),
-    GL_RGB_422_APPLE(0x8A1F),
-    GL_PROGRAM_PIPELINE_OBJECT_EXT(0x8A4F),
-    GL_FRAGMENT_SHADER(0x8B30),
-    GL_VERTEX_SHADER(0x8B31),
-    GL_PROGRAM_OBJECT_EXT(0x8B40),
-    GL_SHADER_OBJECT_EXT(0x8B48),
-    GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS(0x8B4C),
-    GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS(0x8B4D),
-    GL_SHADER_TYPE(0x8B4F),
-    GL_FLOAT_VEC2(0x8B50),
-    GL_FLOAT_VEC3(0x8B51),
-    GL_FLOAT_VEC4(0x8B52),
-    GL_INT_VEC2(0x8B53),
-    GL_INT_VEC3(0x8B54),
-    GL_INT_VEC4(0x8B55),
-    GL_BOOL(0x8B56),
-    GL_BOOL_VEC2(0x8B57),
-    GL_BOOL_VEC3(0x8B58),
-    GL_BOOL_VEC4(0x8B59),
-    GL_FLOAT_MAT2(0x8B5A),
-    GL_FLOAT_MAT3(0x8B5B),
-    GL_FLOAT_MAT4(0x8B5C),
-    GL_SAMPLER_2D(0x8B5E),
-    GL_SAMPLER_3D(0x8B5F),
-    GL_SAMPLER_CUBE(0x8B60),
-    GL_SAMPLER_2D_SHADOW_EXT(0x8B62),
-    GL_DELETE_STATUS(0x8B80),
-    GL_COMPILE_STATUS(0x8B81),
-    GL_LINK_STATUS(0x8B82),
-    GL_VALIDATE_STATUS(0x8B83),
-    GL_INFO_LOG_LENGTH(0x8B84),
-    GL_ATTACHED_SHADERS(0x8B85),
-    GL_ACTIVE_UNIFORMS(0x8B86),
-    GL_ACTIVE_UNIFORM_MAX_LENGTH(0x8B87),
-    GL_SHADER_SOURCE_LENGTH(0x8B88),
-    GL_ACTIVE_ATTRIBUTES(0x8B89),
-    GL_ACTIVE_ATTRIBUTE_MAX_LENGTH(0x8B8A),
-    GL_FRAGMENT_SHADER_DERIVATIVE_HINT(0x8B8B),
-    GL_SHADING_LANGUAGE_VERSION(0x8B8C),
-    GL_CURRENT_PROGRAM(0x8B8D),
-    GL_PALETTE4_RGB8(0x8B90),
-    GL_PALETTE4_RGBA8(0x8B91),
-    GL_PALETTE4_R5_G6_B5(0x8B92),
-    GL_PALETTE4_RGBA4(0x8B93),
-    GL_PALETTE4_RGB5_A1(0x8B94),
-    GL_PALETTE8_RGB8(0x8B95),
-    GL_PALETTE8_RGBA8(0x8B96),
-    GL_PALETTE8_R5_G6_B5(0x8B97),
-    GL_PALETTE8_RGBA4(0x8B98),
-    GL_PALETTE8_RGB5_A1(0x8B99),
-    GL_IMPLEMENTATION_COLOR_READ_TYPE(0x8B9A),
-    GL_IMPLEMENTATION_COLOR_READ_FORMAT(0x8B9B),
-    GL_POINT_SIZE_ARRAY(0x8B9C),
-    GL_TEXTURE_CROP_RECT(0x8B9D),
-    GL_MATRIX_INDEX_ARRAY_BUFFER_BINDING(0x8B9E),
-    GL_POINT_SIZE_ARRAY_BUFFER_BINDING(0x8B9F),
-    GL_COUNTER_TYPE_AMD(0x8BC0),
-    GL_COUNTER_RANGE_AMD(0x8BC1),
-    GL_UNSIGNED_INT64_AMD(0x8BC2),
-    GL_PERCENTAGE_AMD(0x8BC3),
-    GL_PERFMON_RESULT_AVAILABLE_AMD(0x8BC4),
-    GL_PERFMON_RESULT_SIZE_AMD(0x8BC5),
-    GL_PERFMON_RESULT_AMD(0x8BC6),
-    GL_TEXTURE_WIDTH_QCOM(0x8BD2),
-    GL_TEXTURE_HEIGHT_QCOM(0x8BD3),
-    GL_TEXTURE_DEPTH_QCOM(0x8BD4),
-    GL_TEXTURE_INTERNAL_FORMAT_QCOM(0x8BD5),
-    GL_TEXTURE_FORMAT_QCOM(0x8BD6),
-    GL_TEXTURE_TYPE_QCOM(0x8BD7),
-    GL_TEXTURE_IMAGE_VALID_QCOM(0x8BD8),
-    GL_TEXTURE_NUM_LEVELS_QCOM(0x8BD9),
-    GL_TEXTURE_TARGET_QCOM(0x8BDA),
-    GL_TEXTURE_OBJECT_VALID_QCOM(0x8BDB),
-    GL_STATE_RESTORE(0x8BDC),
-    GL_COMPRESSED_RGB_PVRTC_4BPPV1_IMG(0x8C00),
-    GL_COMPRESSED_RGB_PVRTC_2BPPV1_IMG(0x8C01),
-    GL_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG(0x8C02),
-    GL_COMPRESSED_RGBA_PVRTC_2BPPV1_IMG(0x8C03),
-    GL_MODULATE_COLOR_IMG(0x8C04),
-    GL_RECIP_ADD_SIGNED_ALPHA_IMG(0x8C05),
-    GL_TEXTURE_ALPHA_MODULATE_IMG(0x8C06),
-    GL_FACTOR_ALPHA_MODULATE_IMG(0x8C07),
-    GL_FRAGMENT_ALPHA_MODULATE_IMG(0x8C08),
-    GL_ADD_BLEND_IMG(0x8C09),
-    GL_SGX_BINARY_IMG(0x8C0A),
-    GL_UNSIGNED_NORMALIZED_EXT(0x8C17),
-    GL_ANY_SAMPLES_PASSED_EXT(0x8C2F),
-    GL_SRGB_EXT(0x8C40),
-    GL_SRGB_ALPHA_EXT(0x8C42),
-    GL_SRGB8_ALPHA8_EXT(0x8C43),
-    GL_ATC_RGB_AMD(0x8C92),
-    GL_ATC_RGBA_EXPLICIT_ALPHA_AMD(0x8C93),
-    GL_STENCIL_BACK_REF(0x8CA3),
-    GL_STENCIL_BACK_VALUE_MASK(0x8CA4),
-    GL_STENCIL_BACK_WRITEMASK(0x8CA5),
-    GL_FRAMEBUFFER_BINDING(0x8CA6),
-    GL_RENDERBUFFER_BINDING(0x8CA7),
-    GL_READ_FRAMEBUFFER_APPLE(0x8CA8),
-    GL_DRAW_FRAMEBUFFER_APPLE(0x8CA9),
-    GL_READ_FRAMEBUFFER_BINDING_APPLE(0x8CAA),
-    GL_RENDERBUFFER_SAMPLES_APPLE(0x8CAB),
-    GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE(0x8CD0),
-    GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME(0x8CD1),
-    GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL(0x8CD2),
-    GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE(0x8CD3),
-    GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_3D_ZOFFSET(0x8CD4),
-    GL_FRAMEBUFFER_COMPLETE(0x8CD5),
-    GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT(0x8CD6),
-    GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT(0x8CD7),
-    GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS(0x8CD9),
-    GL_FRAMEBUFFER_INCOMPLETE_FORMATS(0x8CDA),
-    GL_FRAMEBUFFER_UNSUPPORTED(0x8CDD),
-    GL_MAX_COLOR_ATTACHMENTS_NV(0x8CDF),
-    GL_COLOR_ATTACHMENT0(0x8CE0),
-    GL_COLOR_ATTACHMENT1_NV(0x8CE1),
-    GL_COLOR_ATTACHMENT2_NV(0x8CE2),
-    GL_COLOR_ATTACHMENT3_NV(0x8CE3),
-    GL_COLOR_ATTACHMENT4_NV(0x8CE4),
-    GL_COLOR_ATTACHMENT5_NV(0x8CE5),
-    GL_COLOR_ATTACHMENT6_NV(0x8CE6),
-    GL_COLOR_ATTACHMENT7_NV(0x8CE7),
-    GL_COLOR_ATTACHMENT8_NV(0x8CE8),
-    GL_COLOR_ATTACHMENT9_NV(0x8CE9),
-    GL_COLOR_ATTACHMENT10_NV(0x8CEA),
-    GL_COLOR_ATTACHMENT11_NV(0x8CEB),
-    GL_COLOR_ATTACHMENT12_NV(0x8CEC),
-    GL_COLOR_ATTACHMENT13_NV(0x8CED),
-    GL_COLOR_ATTACHMENT14_NV(0x8CEE),
-    GL_COLOR_ATTACHMENT15_NV(0x8CEF),
-    GL_DEPTH_ATTACHMENT(0x8D00),
-    GL_STENCIL_ATTACHMENT(0x8D20),
-    GL_FRAMEBUFFER(0x8D40),
-    GL_RENDERBUFFER(0x8D41),
-    GL_RENDERBUFFER_WIDTH(0x8D42),
-    GL_RENDERBUFFER_HEIGHT(0x8D43),
-    GL_RENDERBUFFER_INTERNAL_FORMAT(0x8D44),
-    GL_STENCIL_INDEX1(0x8D46),
-    GL_STENCIL_INDEX4(0x8D47),
-    GL_STENCIL_INDEX8(0x8D48),
-    GL_RENDERBUFFER_RED_SIZE(0x8D50),
-    GL_RENDERBUFFER_GREEN_SIZE(0x8D51),
-    GL_RENDERBUFFER_BLUE_SIZE(0x8D52),
-    GL_RENDERBUFFER_ALPHA_SIZE(0x8D53),
-    GL_RENDERBUFFER_DEPTH_SIZE(0x8D54),
-    GL_RENDERBUFFER_STENCIL_SIZE(0x8D55),
-    GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_APPLE(0x8D56),
-    GL_MAX_SAMPLES_APPLE(0x8D57),
-    GL_TEXTURE_GEN_STR(0x8D60),
-    GL_HALF_FLOAT(0x8D61),
-    GL_RGB565(0x8D62),
-    GL_ETC1_RGB8(0x8D64),
-    GL_TEXTURE_EXTERNAL(0x8D65),
-    GL_SAMPLER_EXTERNAL(0x8D66),
-    GL_TEXTURE_BINDING_EXTERNAL(0x8D67),
-    GL_REQUIRED_TEXTURE_IMAGE_UNITS(0x8D68),
-    GL_ANY_SAMPLES_PASSED_CONSERVATIVE_EXT(0x8D6A),
-    GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_SAMPLES_EXT(0x8D6C),
-    GL_LOW_FLOAT(0x8DF0),
-    GL_MEDIUM_FLOAT(0x8DF1),
-    GL_HIGH_FLOAT(0x8DF2),
-    GL_LOW_INT(0x8DF3),
-    GL_MEDIUM_INT(0x8DF4),
-    GL_HIGH_INT(0x8DF5),
-    GL_UNSIGNED_INT_10_10_10_2(0x8DF6),
-    GL_INT_10_10_10_2(0x8DF7),
-    GL_SHADER_BINARY_FORMATS(0x8DF8),
-    GL_NUM_SHADER_BINARY_FORMATS(0x8DF9),
-    GL_SHADER_COMPILER(0x8DFA),
-    GL_MAX_VERTEX_UNIFORM_VECTORS(0x8DFB),
-    GL_MAX_VARYING_VECTORS(0x8DFC),
-    GL_MAX_FRAGMENT_UNIFORM_VECTORS(0x8DFD),
-    GL_DEPTH_COMPONENT16_NONLINEAR_NV(0x8E2C),
-    GL_COVERAGE_COMPONENT_NV(0x8ED0),
-    GL_COVERAGE_COMPONENT4_NV(0x8ED1),
-    GL_COVERAGE_ATTACHMENT_NV(0x8ED2),
-    GL_COVERAGE_BUFFERS_NV(0x8ED3),
-    GL_COVERAGE_SAMPLES_NV(0x8ED4),
-    GL_COVERAGE_ALL_FRAGMENTS_NV(0x8ED5),
-    GL_COVERAGE_EDGE_FRAGMENTS_NV(0x8ED6),
-    GL_COVERAGE_AUTOMATIC_NV(0x8ED7),
-    GL_MALI_SHADER_BINARY_ARM(0x8F60),
-    GL_PERFMON_GLOBAL_MODE_QCOM(0x8FA0),
-    GL_SHADER_BINARY_VIV(0x8FC4),
-    GL_CONTEXT_ROBUST_ACCESS_EXT(0x90F3),
-    GL_TEXTURE_IMMUTABLE_FORMAT_EXT(0x912F),
-    GL_SGX_PROGRAM_BINARY_IMG(0x9130),
-    GL_RENDERBUFFER_SAMPLES_EXT(0x9133),
-    GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_EXT(0x9134),
-    GL_MAX_SAMPLES_EXT(0x9135),
-    GL_TEXTURE_SAMPLES_IMG(0x9136),
-    GL_BUFFER_OBJECT_EXT(0x9151),
-    GL_QUERY_OBJECT_EXT(0x9153),
-    GL_VERTEX_ARRAY_OBJECT_EXT(0x9154),
-    GL_SHADER_BINARY_DMP(0x9250),
-    GL_BGRA8_EXT(0x93A1),
-
-    // Constants defined by ES3
-    GL_READ_BUFFER(0x0C02),
-    GL_PACK_ROW_LENGTH(0x0D02),
-    GL_PACK_SKIP_ROWS(0x0D03),
-    GL_PACK_SKIP_PIXELS(0x0D04),
-    GL_COLOR(0x1800),
-    GL_DEPTH(0x1801),
-    GL_STENCIL(0x1802),
-    GL_RED(0x1903),
-    GL_RGB10_A2(0x8059),
-    GL_UNPACK_SKIP_IMAGES(0x806D),
-    GL_UNPACK_IMAGE_HEIGHT(0x806E),
-    GL_UNSIGNED_INT_2_10_10_10_REV(0x8368),
-    GL_MAX_ELEMENTS_VERTICES(0x80E8),
-    GL_MAX_ELEMENTS_INDICES(0x80E9),
-    GL_TEXTURE_MIN_LOD(0x813A),
-    GL_TEXTURE_MAX_LOD(0x813B),
-    GL_TEXTURE_BASE_LEVEL(0x813C),
-    GL_TEXTURE_MAX_LEVEL(0x813D),
-    GL_MIN(0x8007),
-    GL_MAX(0x8008),
-    GL_MAX_TEXTURE_LOD_BIAS(0x84FD),
-    GL_TEXTURE_COMPARE_MODE(0x884C),
-    GL_TEXTURE_COMPARE_FUNC(0x884D),
-    GL_CURRENT_QUERY(0x8865),
-    GL_QUERY_RESULT(0x8866),
-    GL_QUERY_RESULT_AVAILABLE(0x8867),
-    GL_STREAM_READ(0x88E1),
-    GL_STREAM_COPY(0x88E2),
-    GL_STATIC_READ(0x88E5),
-    GL_STATIC_COPY(0x88E6),
-    GL_DYNAMIC_READ(0x88E9),
-    GL_DYNAMIC_COPY(0x88EA),
-    GL_MAX_DRAW_BUFFERS(0x8824),
-    GL_DRAW_BUFFER0(0x8825),
-    GL_DRAW_BUFFER1(0x8826),
-    GL_DRAW_BUFFER2(0x8827),
-    GL_DRAW_BUFFER3(0x8828),
-    GL_DRAW_BUFFER4(0x8829),
-    GL_DRAW_BUFFER5(0x882A),
-    GL_DRAW_BUFFER6(0x882B),
-    GL_DRAW_BUFFER7(0x882C),
-    GL_DRAW_BUFFER8(0x882D),
-    GL_DRAW_BUFFER9(0x882E),
-    GL_DRAW_BUFFER10(0x882F),
-    GL_DRAW_BUFFER11(0x8830),
-    GL_DRAW_BUFFER12(0x8831),
-    GL_DRAW_BUFFER13(0x8832),
-    GL_DRAW_BUFFER14(0x8833),
-    GL_DRAW_BUFFER15(0x8834),
-    GL_MAX_FRAGMENT_UNIFORM_COMPONENTS(0x8B49),
-    GL_MAX_VERTEX_UNIFORM_COMPONENTS(0x8B4A),
-    GL_SAMPLER_2D_SHADOW(0x8B62),
-    GL_PIXEL_PACK_BUFFER(0x88EB),
-    GL_PIXEL_UNPACK_BUFFER(0x88EC),
-    GL_PIXEL_PACK_BUFFER_BINDING(0x88ED),
-    GL_PIXEL_UNPACK_BUFFER_BINDING(0x88EF),
-    GL_FLOAT_MAT2x3(0x8B65),
-    GL_FLOAT_MAT2x4(0x8B66),
-    GL_FLOAT_MAT3x2(0x8B67),
-    GL_FLOAT_MAT3x4(0x8B68),
-    GL_FLOAT_MAT4x2(0x8B69),
-    GL_FLOAT_MAT4x3(0x8B6A),
-    GL_SRGB(0x8C40),
-    GL_SRGB8(0x8C41),
-    GL_SRGB8_ALPHA8(0x8C43),
-    GL_COMPARE_REF_TO_TEXTURE(0x884E),
-    GL_MAJOR_VERSION(0x821B),
-    GL_MINOR_VERSION(0x821C),
-    GL_NUM_EXTENSIONS(0x821D),
-    GL_RGBA32F(0x8814),
-    GL_RGB32F(0x8815),
-    GL_RGBA16F(0x881A),
-    GL_RGB16F(0x881B),
-    GL_VERTEX_ATTRIB_ARRAY_INTEGER(0x88FD),
-    GL_MAX_ARRAY_TEXTURE_LAYERS(0x88FF),
-    GL_MIN_PROGRAM_TEXEL_OFFSET(0x8904),
-    GL_MAX_PROGRAM_TEXEL_OFFSET(0x8905),
-    GL_MAX_VARYING_COMPONENTS(0x8B4B),
-    GL_TEXTURE_2D_ARRAY(0x8C1A),
-    GL_TEXTURE_BINDING_2D_ARRAY(0x8C1D),
-    GL_R11F_G11F_B10F(0x8C3A),
-    GL_UNSIGNED_INT_10F_11F_11F_REV(0x8C3B),
-    GL_RGB9_E5(0x8C3D),
-    GL_UNSIGNED_INT_5_9_9_9_REV(0x8C3E),
-    GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH(0x8C76),
-    GL_TRANSFORM_FEEDBACK_BUFFER_MODE(0x8C7F),
-    GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS(0x8C80),
-    GL_TRANSFORM_FEEDBACK_VARYINGS(0x8C83),
-    GL_TRANSFORM_FEEDBACK_BUFFER_START(0x8C84),
-    GL_TRANSFORM_FEEDBACK_BUFFER_SIZE(0x8C85),
-    GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN(0x8C88),
-    GL_RASTERIZER_DISCARD(0x8C89),
-    GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS(0x8C8A),
-    GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS(0x8C8B),
-    GL_INTERLEAVED_ATTRIBS(0x8C8C),
-    GL_SEPARATE_ATTRIBS(0x8C8D),
-    GL_TRANSFORM_FEEDBACK_BUFFER(0x8C8E),
-    GL_TRANSFORM_FEEDBACK_BUFFER_BINDING(0x8C8F),
-    GL_RGBA32UI(0x8D70),
-    GL_RGB32UI(0x8D71),
-    GL_RGBA16UI(0x8D76),
-    GL_RGB16UI(0x8D77),
-    GL_RGBA8UI(0x8D7C),
-    GL_RGB8UI(0x8D7D),
-    GL_RGBA32I(0x8D82),
-    GL_RGB32I(0x8D83),
-    GL_RGBA16I(0x8D88),
-    GL_RGB16I(0x8D89),
-    GL_RGBA8I(0x8D8E),
-    GL_RGB8I(0x8D8F),
-    GL_RED_INTEGER(0x8D94),
-    GL_RGB_INTEGER(0x8D98),
-    GL_RGBA_INTEGER(0x8D99),
-    GL_SAMPLER_2D_ARRAY(0x8DC1),
-    GL_SAMPLER_2D_ARRAY_SHADOW(0x8DC4),
-    GL_SAMPLER_CUBE_SHADOW(0x8DC5),
-    GL_UNSIGNED_INT_VEC2(0x8DC6),
-    GL_UNSIGNED_INT_VEC3(0x8DC7),
-    GL_UNSIGNED_INT_VEC4(0x8DC8),
-    GL_INT_SAMPLER_2D(0x8DCA),
-    GL_INT_SAMPLER_3D(0x8DCB),
-    GL_INT_SAMPLER_CUBE(0x8DCC),
-    GL_INT_SAMPLER_2D_ARRAY(0x8DCF),
-    GL_UNSIGNED_INT_SAMPLER_2D(0x8DD2),
-    GL_UNSIGNED_INT_SAMPLER_3D(0x8DD3),
-    GL_UNSIGNED_INT_SAMPLER_CUBE(0x8DD4),
-    GL_UNSIGNED_INT_SAMPLER_2D_ARRAY(0x8DD7),
-    GL_BUFFER_ACCESS_FLAGS(0x911F),
-    GL_BUFFER_MAP_LENGTH(0x9120),
-    GL_BUFFER_MAP_OFFSET(0x9121),
-    GL_DEPTH_COMPONENT32F(0x8CAC),
-    GL_DEPTH32F_STENCIL8(0x8CAD),
-    GL_FLOAT_32_UNSIGNED_INT_24_8_REV(0x8DAD),
-    GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING(0x8210),
-    GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE(0x8211),
-    GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE(0x8212),
-    GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE(0x8213),
-    GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE(0x8214),
-    GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE(0x8215),
-    GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE(0x8216),
-    GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE(0x8217),
-    GL_FRAMEBUFFER_DEFAULT(0x8218),
-    GL_FRAMEBUFFER_UNDEFINED(0x8219),
-    GL_DEPTH_STENCIL_ATTACHMENT(0x821A),
-    GL_UNSIGNED_NORMALIZED(0x8C17),
-    GL_READ_FRAMEBUFFER(0x8CA8),
-    GL_DRAW_FRAMEBUFFER(0x8CA9),
-    GL_READ_FRAMEBUFFER_BINDING(0x8CAA),
-    GL_RENDERBUFFER_SAMPLES(0x8CAB),
-    GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER(0x8CD4),
-    GL_MAX_COLOR_ATTACHMENTS(0x8CDF),
-    GL_COLOR_ATTACHMENT1(0x8CE1),
-    GL_COLOR_ATTACHMENT2(0x8CE2),
-    GL_COLOR_ATTACHMENT3(0x8CE3),
-    GL_COLOR_ATTACHMENT4(0x8CE4),
-    GL_COLOR_ATTACHMENT5(0x8CE5),
-    GL_COLOR_ATTACHMENT6(0x8CE6),
-    GL_COLOR_ATTACHMENT7(0x8CE7),
-    GL_COLOR_ATTACHMENT8(0x8CE8),
-    GL_COLOR_ATTACHMENT9(0x8CE9),
-    GL_COLOR_ATTACHMENT10(0x8CEA),
-    GL_COLOR_ATTACHMENT11(0x8CEB),
-    GL_COLOR_ATTACHMENT12(0x8CEC),
-    GL_COLOR_ATTACHMENT13(0x8CED),
-    GL_COLOR_ATTACHMENT14(0x8CEE),
-    GL_COLOR_ATTACHMENT15(0x8CEF),
-    GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE(0x8D56),
-    GL_MAX_SAMPLES(0x8D57),
-    GL_MAP_READ_BIT(0x0001),
-    GL_MAP_WRITE_BIT(0x0002),
-    GL_MAP_INVALIDATE_RANGE_BIT(0x0004),
-    GL_MAP_INVALIDATE_BUFFER_BIT(0x0008),
-    GL_MAP_FLUSH_EXPLICIT_BIT(0x0010),
-    GL_MAP_UNSYNCHRONIZED_BIT(0x0020),
-    GL_RG(0x8227),
-    GL_RG_INTEGER(0x8228),
-    GL_R8(0x8229),
-    GL_RG8(0x822B),
-    GL_R16F(0x822D),
-    GL_R32F(0x822E),
-    GL_RG16F(0x822F),
-    GL_RG32F(0x8230),
-    GL_R8I(0x8231),
-    GL_R8UI(0x8232),
-    GL_R16I(0x8233),
-    GL_R16UI(0x8234),
-    GL_R32I(0x8235),
-    GL_R32UI(0x8236),
-    GL_RG8I(0x8237),
-    GL_RG8UI(0x8238),
-    GL_RG16I(0x8239),
-    GL_RG16UI(0x823A),
-    GL_RG32I(0x823B),
-    GL_RG32UI(0x823C),
-    GL_R8_SNORM(0x8F94),
-    GL_RG8_SNORM(0x8F95),
-    GL_RGB8_SNORM(0x8F96),
-    GL_RGBA8_SNORM(0x8F97),
-    GL_SIGNED_NORMALIZED(0x8F9C),
-    GL_PRIMITIVE_RESTART_FIXED_INDEX(0x8D69),
-    GL_COPY_READ_BUFFER(0x8F36),
-    GL_COPY_WRITE_BUFFER(0x8F37),
-    GL_UNIFORM_BUFFER(0x8A11),
-    GL_UNIFORM_BUFFER_BINDING(0x8A28),
-    GL_UNIFORM_BUFFER_START(0x8A29),
-    GL_UNIFORM_BUFFER_SIZE(0x8A2A),
-    GL_MAX_VERTEX_UNIFORM_BLOCKS(0x8A2B),
-    GL_MAX_FRAGMENT_UNIFORM_BLOCKS(0x8A2D),
-    GL_MAX_COMBINED_UNIFORM_BLOCKS(0x8A2E),
-    GL_MAX_UNIFORM_BUFFER_BINDINGS(0x8A2F),
-    GL_MAX_UNIFORM_BLOCK_SIZE(0x8A30),
-    GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS(0x8A31),
-    GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS(0x8A33),
-    GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT(0x8A34),
-    GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH(0x8A35),
-    GL_ACTIVE_UNIFORM_BLOCKS(0x8A36),
-    GL_UNIFORM_TYPE(0x8A37),
-    GL_UNIFORM_SIZE(0x8A38),
-    GL_UNIFORM_NAME_LENGTH(0x8A39),
-    GL_UNIFORM_BLOCK_INDEX(0x8A3A),
-    GL_UNIFORM_OFFSET(0x8A3B),
-    GL_UNIFORM_ARRAY_STRIDE(0x8A3C),
-    GL_UNIFORM_MATRIX_STRIDE(0x8A3D),
-    GL_UNIFORM_IS_ROW_MAJOR(0x8A3E),
-    GL_UNIFORM_BLOCK_BINDING(0x8A3F),
-    GL_UNIFORM_BLOCK_DATA_SIZE(0x8A40),
-    GL_UNIFORM_BLOCK_NAME_LENGTH(0x8A41),
-    GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS(0x8A42),
-    GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES(0x8A43),
-    GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER(0x8A44),
-    GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER(0x8A46),
-    GL_MAX_VERTEX_OUTPUT_COMPONENTS(0x9122),
-    GL_MAX_FRAGMENT_INPUT_COMPONENTS(0x9125),
-    GL_MAX_SERVER_WAIT_TIMEOUT(0x9111),
-    GL_OBJECT_TYPE(0x9112),
-    GL_SYNC_CONDITION(0x9113),
-    GL_SYNC_STATUS(0x9114),
-    GL_SYNC_FLAGS(0x9115),
-    GL_SYNC_FENCE(0x9116),
-    GL_SYNC_GPU_COMMANDS_COMPLETE(0x9117),
-    GL_UNSIGNALED(0x9118),
-    GL_SIGNALED(0x9119),
-    GL_ALREADY_SIGNALED(0x911A),
-    GL_TIMEOUT_EXPIRED(0x911B),
-    GL_CONDITION_SATISFIED(0x911C),
-    GL_WAIT_FAILED(0x911D),
-    GL_SYNC_FLUSH_COMMANDS_BIT(0x00000001),
-    GL_TIMEOUT_IGNORED(0xFFFFFFFFFFFFFFFFl),
-    GL_VERTEX_ATTRIB_ARRAY_DIVISOR(0x88FE),
-    GL_ANY_SAMPLES_PASSED(0x8C2F),
-    GL_ANY_SAMPLES_PASSED_CONSERVATIVE(0x8D6A),
-    GL_SAMPLER_BINDING(0x8919),
-    GL_RGB10_A2UI(0x906F),
-    GL_TEXTURE_SWIZZLE_R(0x8E42),
-    GL_TEXTURE_SWIZZLE_G(0x8E43),
-    GL_TEXTURE_SWIZZLE_B(0x8E44),
-    GL_TEXTURE_SWIZZLE_A(0x8E45),
-    GL_GREEN(0x1904),
-    GL_BLUE(0x1905),
-    GL_INT_2_10_10_10_REV(0x8D9F),
-    GL_TRANSFORM_FEEDBACK(0x8E22),
-    GL_TRANSFORM_FEEDBACK_PAUSED(0x8E23),
-    GL_TRANSFORM_FEEDBACK_ACTIVE(0x8E24),
-    GL_TRANSFORM_FEEDBACK_BINDING(0x8E25),
-    GL_PROGRAM_BINARY_RETRIEVABLE_HINT(0x8257),
-    GL_COMPRESSED_R11_EAC(0x9270),
-    GL_COMPRESSED_SIGNED_R11_EAC(0x9271),
-    GL_COMPRESSED_RG11_EAC(0x9272),
-    GL_COMPRESSED_SIGNED_RG11_EAC(0x9273),
-    GL_COMPRESSED_RGB8_ETC2(0x9274),
-    GL_COMPRESSED_SRGB8_ETC2(0x9275),
-    GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2(0x9276),
-    GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2(0x9277),
-    GL_COMPRESSED_RGBA8_ETC2_EAC(0x9278),
-    GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC(0x9279),
-    GL_TEXTURE_IMMUTABLE_FORMAT(0x912F),
-    GL_MAX_ELEMENT_INDEX(0x8D6B),
-    GL_NUM_SAMPLE_COUNTS(0x9380),
-    GL_TEXTURE_IMMUTABLE_LEVELS(0x82DF),
-
-    GL_ALL_SHADER_BITS_EXT(0xFFFFFFFF),
-    ;
-
-    public final long value;
-    GLEnum(final long value) {
-        this.value = value;
-    }
-
-    private static final java.util.HashMap<Long, GLEnum> reverseMap = new java.util.HashMap<Long, GLEnum>();
-    static {
-        for (GLEnum e : GLEnum.values())
-        reverseMap.put(e.value, e);
-    }
-
-    public static GLEnum valueOf(final long value) {
-        return reverseMap.get(value);
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/GLProtoBuf.java b/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/GLProtoBuf.java
deleted file mode 100644
index 3c0fbd4..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/GLProtoBuf.java
+++ /dev/null
@@ -1,3119 +0,0 @@
-// Generated by the protocol buffer compiler.  DO NOT EDIT!
-// source: gltrace.proto
-
-package com.android.ide.eclipse.gltrace;
-
-public final class GLProtoBuf {
-  private GLProtoBuf() {}
-  public static void registerAllExtensions(
-      com.google.protobuf.ExtensionRegistryLite registry) {
-  }
-  public static final class GLMessage extends
-      com.google.protobuf.GeneratedMessageLite {
-    // Use GLMessage.newBuilder() to construct.
-    private GLMessage() {
-      initFields();
-    }
-    private GLMessage(boolean noInit) {}
-    
-    private static final GLMessage defaultInstance;
-    public static GLMessage getDefaultInstance() {
-      return defaultInstance;
-    }
-    
-    @Override
-    public GLMessage getDefaultInstanceForType() {
-      return defaultInstance;
-    }
-    
-    public enum Function
-        implements com.google.protobuf.Internal.EnumLite {
-      glActiveTexture(0, 0),
-      glAlphaFunc(1, 1),
-      glAlphaFuncx(2, 2),
-      glAlphaFuncxOES(3, 3),
-      glAttachShader(4, 4),
-      glBeginPerfMonitorAMD(5, 5),
-      glBindAttribLocation(6, 6),
-      glBindBuffer(7, 7),
-      glBindFramebuffer(8, 8),
-      glBindFramebufferOES(9, 9),
-      glBindRenderbuffer(10, 10),
-      glBindRenderbufferOES(11, 11),
-      glBindTexture(12, 12),
-      glBindVertexArrayOES(13, 13),
-      glBlendColor(14, 14),
-      glBlendEquation(15, 15),
-      glBlendEquationOES(16, 16),
-      glBlendEquationSeparate(17, 17),
-      glBlendEquationSeparateOES(18, 18),
-      glBlendFunc(19, 19),
-      glBlendFuncSeparate(20, 20),
-      glBlendFuncSeparateOES(21, 21),
-      glBufferData(22, 22),
-      glBufferSubData(23, 23),
-      glCheckFramebufferStatus(24, 24),
-      glCheckFramebufferStatusOES(25, 25),
-      glClearColor(26, 26),
-      glClearColorx(27, 27),
-      glClearColorxOES(28, 28),
-      glClearDepthf(29, 29),
-      glClearDepthfOES(30, 30),
-      glClearDepthx(31, 31),
-      glClearDepthxOES(32, 32),
-      glClear(33, 33),
-      glClearStencil(34, 34),
-      glClientActiveTexture(35, 35),
-      glClipPlanef(36, 36),
-      glClipPlanefIMG(37, 37),
-      glClipPlanefOES(38, 38),
-      glClipPlanex(39, 39),
-      glClipPlanexIMG(40, 40),
-      glClipPlanexOES(41, 41),
-      glColor4f(42, 42),
-      glColor4ub(43, 43),
-      glColor4x(44, 44),
-      glColor4xOES(45, 45),
-      glColorMask(46, 46),
-      glColorPointer(47, 47),
-      glCompileShader(48, 48),
-      glCompressedTexImage2D(49, 49),
-      glCompressedTexImage3DOES(50, 50),
-      glCompressedTexSubImage2D(51, 51),
-      glCompressedTexSubImage3DOES(52, 52),
-      glCopyTexImage2D(53, 53),
-      glCopyTexSubImage2D(54, 54),
-      glCopyTexSubImage3DOES(55, 55),
-      glCoverageMaskNV(56, 56),
-      glCoverageOperationNV(57, 57),
-      glCreateProgram(58, 58),
-      glCreateShader(59, 59),
-      glCullFace(60, 60),
-      glCurrentPaletteMatrixOES(61, 61),
-      glDeleteBuffers(62, 62),
-      glDeleteFencesNV(63, 63),
-      glDeleteFramebuffers(64, 64),
-      glDeleteFramebuffersOES(65, 65),
-      glDeletePerfMonitorsAMD(66, 66),
-      glDeleteProgram(67, 67),
-      glDeleteRenderbuffers(68, 68),
-      glDeleteRenderbuffersOES(69, 69),
-      glDeleteShader(70, 70),
-      glDeleteTextures(71, 71),
-      glDeleteVertexArraysOES(72, 72),
-      glDepthFunc(73, 73),
-      glDepthMask(74, 74),
-      glDepthRangef(75, 75),
-      glDepthRangefOES(76, 76),
-      glDepthRangex(77, 77),
-      glDepthRangexOES(78, 78),
-      glDetachShader(79, 79),
-      glDisableClientState(80, 80),
-      glDisableDriverControlQCOM(81, 81),
-      glDisable(82, 82),
-      glDisableVertexAttribArray(83, 83),
-      glDiscardFramebufferEXT(84, 84),
-      glDrawArrays(85, 85),
-      glDrawElements(86, 86),
-      glDrawTexfOES(87, 87),
-      glDrawTexfvOES(88, 88),
-      glDrawTexiOES(89, 89),
-      glDrawTexivOES(90, 90),
-      glDrawTexsOES(91, 91),
-      glDrawTexsvOES(92, 92),
-      glDrawTexxOES(93, 93),
-      glDrawTexxvOES(94, 94),
-      glEGLImageTargetRenderbufferStorageOES(95, 95),
-      glEGLImageTargetTexture2DOES(96, 96),
-      glEnableClientState(97, 97),
-      glEnableDriverControlQCOM(98, 98),
-      glEnable(99, 99),
-      glEnableVertexAttribArray(100, 100),
-      glEndPerfMonitorAMD(101, 101),
-      glEndTilingQCOM(102, 102),
-      glExtGetBufferPointervQCOM(103, 103),
-      glExtGetBuffersQCOM(104, 104),
-      glExtGetFramebuffersQCOM(105, 105),
-      glExtGetProgramBinarySourceQCOM(106, 106),
-      glExtGetProgramsQCOM(107, 107),
-      glExtGetRenderbuffersQCOM(108, 108),
-      glExtGetShadersQCOM(109, 109),
-      glExtGetTexLevelParameterivQCOM(110, 110),
-      glExtGetTexSubImageQCOM(111, 111),
-      glExtGetTexturesQCOM(112, 112),
-      glExtIsProgramBinaryQCOM(113, 113),
-      glExtTexObjectStateOverrideiQCOM(114, 114),
-      glFinishFenceNV(115, 115),
-      glFinish(116, 116),
-      glFlush(117, 117),
-      glFogf(118, 118),
-      glFogfv(119, 119),
-      glFogx(120, 120),
-      glFogxOES(121, 121),
-      glFogxv(122, 122),
-      glFogxvOES(123, 123),
-      glFramebufferRenderbuffer(124, 124),
-      glFramebufferRenderbufferOES(125, 125),
-      glFramebufferTexture2D(126, 126),
-      glFramebufferTexture2DMultisampleIMG(127, 127),
-      glFramebufferTexture2DOES(128, 128),
-      glFramebufferTexture3DOES(129, 129),
-      glFrontFace(130, 130),
-      glFrustumf(131, 131),
-      glFrustumfOES(132, 132),
-      glFrustumx(133, 133),
-      glFrustumxOES(134, 134),
-      glGenBuffers(135, 135),
-      glGenerateMipmap(136, 136),
-      glGenerateMipmapOES(137, 137),
-      glGenFencesNV(138, 138),
-      glGenFramebuffers(139, 139),
-      glGenFramebuffersOES(140, 140),
-      glGenPerfMonitorsAMD(141, 141),
-      glGenRenderbuffers(142, 142),
-      glGenRenderbuffersOES(143, 143),
-      glGenTextures(144, 144),
-      glGenVertexArraysOES(145, 145),
-      glGetActiveAttrib(146, 146),
-      glGetActiveUniform(147, 147),
-      glGetAttachedShaders(148, 148),
-      glGetAttribLocation(149, 149),
-      glGetBooleanv(150, 150),
-      glGetBufferParameteriv(151, 151),
-      glGetBufferPointervOES(152, 152),
-      glGetClipPlanef(153, 153),
-      glGetClipPlanefOES(154, 154),
-      glGetClipPlanex(155, 155),
-      glGetClipPlanexOES(156, 156),
-      glGetDriverControlsQCOM(157, 157),
-      glGetDriverControlStringQCOM(158, 158),
-      glGetError(159, 159),
-      glGetFenceivNV(160, 160),
-      glGetFixedv(161, 161),
-      glGetFixedvOES(162, 162),
-      glGetFloatv(163, 163),
-      glGetFramebufferAttachmentParameteriv(164, 164),
-      glGetFramebufferAttachmentParameterivOES(165, 165),
-      glGetIntegerv(166, 166),
-      glGetLightfv(167, 167),
-      glGetLightxv(168, 168),
-      glGetLightxvOES(169, 169),
-      glGetMaterialfv(170, 170),
-      glGetMaterialxv(171, 171),
-      glGetMaterialxvOES(172, 172),
-      glGetPerfMonitorCounterDataAMD(173, 173),
-      glGetPerfMonitorCounterInfoAMD(174, 174),
-      glGetPerfMonitorCountersAMD(175, 175),
-      glGetPerfMonitorCounterStringAMD(176, 176),
-      glGetPerfMonitorGroupsAMD(177, 177),
-      glGetPerfMonitorGroupStringAMD(178, 178),
-      glGetPointerv(179, 179),
-      glGetProgramBinaryOES(180, 180),
-      glGetProgramInfoLog(181, 181),
-      glGetProgramiv(182, 182),
-      glGetRenderbufferParameteriv(183, 183),
-      glGetRenderbufferParameterivOES(184, 184),
-      glGetShaderInfoLog(185, 185),
-      glGetShaderiv(186, 186),
-      glGetShaderPrecisionFormat(187, 187),
-      glGetShaderSource(188, 188),
-      glGetString(189, 189),
-      glGetTexEnvfv(190, 190),
-      glGetTexEnviv(191, 191),
-      glGetTexEnvxv(192, 192),
-      glGetTexEnvxvOES(193, 193),
-      glGetTexGenfvOES(194, 194),
-      glGetTexGenivOES(195, 195),
-      glGetTexGenxvOES(196, 196),
-      glGetTexParameterfv(197, 197),
-      glGetTexParameteriv(198, 198),
-      glGetTexParameterxv(199, 199),
-      glGetTexParameterxvOES(200, 200),
-      glGetUniformfv(201, 201),
-      glGetUniformiv(202, 202),
-      glGetUniformLocation(203, 203),
-      glGetVertexAttribfv(204, 204),
-      glGetVertexAttribiv(205, 205),
-      glGetVertexAttribPointerv(206, 206),
-      glHint(207, 207),
-      glIsBuffer(208, 208),
-      glIsEnabled(209, 209),
-      glIsFenceNV(210, 210),
-      glIsFramebuffer(211, 211),
-      glIsFramebufferOES(212, 212),
-      glIsProgram(213, 213),
-      glIsRenderbuffer(214, 214),
-      glIsRenderbufferOES(215, 215),
-      glIsShader(216, 216),
-      glIsTexture(217, 217),
-      glIsVertexArrayOES(218, 218),
-      glLightf(219, 219),
-      glLightfv(220, 220),
-      glLightModelf(221, 221),
-      glLightModelfv(222, 222),
-      glLightModelx(223, 223),
-      glLightModelxOES(224, 224),
-      glLightModelxv(225, 225),
-      glLightModelxvOES(226, 226),
-      glLightx(227, 227),
-      glLightxOES(228, 228),
-      glLightxv(229, 229),
-      glLightxvOES(230, 230),
-      glLineWidth(231, 231),
-      glLineWidthx(232, 232),
-      glLineWidthxOES(233, 233),
-      glLinkProgram(234, 234),
-      glLoadIdentity(235, 235),
-      glLoadMatrixf(236, 236),
-      glLoadMatrixx(237, 237),
-      glLoadMatrixxOES(238, 238),
-      glLoadPaletteFromModelViewMatrixOES(239, 239),
-      glLogicOp(240, 240),
-      glMapBufferOES(241, 241),
-      glMaterialf(242, 242),
-      glMaterialfv(243, 243),
-      glMaterialx(244, 244),
-      glMaterialxOES(245, 245),
-      glMaterialxv(246, 246),
-      glMaterialxvOES(247, 247),
-      glMatrixIndexPointerOES(248, 248),
-      glMatrixMode(249, 249),
-      glMultiDrawArraysEXT(250, 250),
-      glMultiDrawElementsEXT(251, 251),
-      glMultiTexCoord4f(252, 252),
-      glMultiTexCoord4x(253, 253),
-      glMultiTexCoord4xOES(254, 254),
-      glMultMatrixf(255, 255),
-      glMultMatrixx(256, 256),
-      glMultMatrixxOES(257, 257),
-      glNormal3f(258, 258),
-      glNormal3x(259, 259),
-      glNormal3xOES(260, 260),
-      glNormalPointer(261, 261),
-      glOrthof(262, 262),
-      glOrthofOES(263, 263),
-      glOrthox(264, 264),
-      glOrthoxOES(265, 265),
-      glPixelStorei(266, 266),
-      glPointParameterf(267, 267),
-      glPointParameterfv(268, 268),
-      glPointParameterx(269, 269),
-      glPointParameterxOES(270, 270),
-      glPointParameterxv(271, 271),
-      glPointParameterxvOES(272, 272),
-      glPointSize(273, 273),
-      glPointSizePointerOES(274, 274),
-      glPointSizex(275, 275),
-      glPointSizexOES(276, 276),
-      glPolygonOffset(277, 277),
-      glPolygonOffsetx(278, 278),
-      glPolygonOffsetxOES(279, 279),
-      glPopMatrix(280, 280),
-      glProgramBinaryOES(281, 281),
-      glPushMatrix(282, 282),
-      glQueryMatrixxOES(283, 283),
-      glReadPixels(284, 284),
-      glReleaseShaderCompiler(285, 285),
-      glRenderbufferStorage(286, 286),
-      glRenderbufferStorageMultisampleIMG(287, 287),
-      glRenderbufferStorageOES(288, 288),
-      glRotatef(289, 289),
-      glRotatex(290, 290),
-      glRotatexOES(291, 291),
-      glSampleCoverage(292, 292),
-      glSampleCoveragex(293, 293),
-      glSampleCoveragexOES(294, 294),
-      glScalef(295, 295),
-      glScalex(296, 296),
-      glScalexOES(297, 297),
-      glScissor(298, 298),
-      glSelectPerfMonitorCountersAMD(299, 299),
-      glSetFenceNV(300, 300),
-      glShadeModel(301, 301),
-      glShaderBinary(302, 302),
-      glShaderSource(303, 303),
-      glStartTilingQCOM(304, 304),
-      glStencilFunc(305, 305),
-      glStencilFuncSeparate(306, 306),
-      glStencilMask(307, 307),
-      glStencilMaskSeparate(308, 308),
-      glStencilOp(309, 309),
-      glStencilOpSeparate(310, 310),
-      glTestFenceNV(311, 311),
-      glTexCoordPointer(312, 312),
-      glTexEnvf(313, 313),
-      glTexEnvfv(314, 314),
-      glTexEnvi(315, 315),
-      glTexEnviv(316, 316),
-      glTexEnvx(317, 317),
-      glTexEnvxOES(318, 318),
-      glTexEnvxv(319, 319),
-      glTexEnvxvOES(320, 320),
-      glTexGenfOES(321, 321),
-      glTexGenfvOES(322, 322),
-      glTexGeniOES(323, 323),
-      glTexGenivOES(324, 324),
-      glTexGenxOES(325, 325),
-      glTexGenxvOES(326, 326),
-      glTexImage2D(327, 327),
-      glTexImage3DOES(328, 328),
-      glTexParameterf(329, 329),
-      glTexParameterfv(330, 330),
-      glTexParameteri(331, 331),
-      glTexParameteriv(332, 332),
-      glTexParameterx(333, 333),
-      glTexParameterxOES(334, 334),
-      glTexParameterxv(335, 335),
-      glTexParameterxvOES(336, 336),
-      glTexSubImage2D(337, 337),
-      glTexSubImage3DOES(338, 338),
-      glTranslatef(339, 339),
-      glTranslatex(340, 340),
-      glTranslatexOES(341, 341),
-      glUniform1f(342, 342),
-      glUniform1fv(343, 343),
-      glUniform1i(344, 344),
-      glUniform1iv(345, 345),
-      glUniform2f(346, 346),
-      glUniform2fv(347, 347),
-      glUniform2i(348, 348),
-      glUniform2iv(349, 349),
-      glUniform3f(350, 350),
-      glUniform3fv(351, 351),
-      glUniform3i(352, 352),
-      glUniform3iv(353, 353),
-      glUniform4f(354, 354),
-      glUniform4fv(355, 355),
-      glUniform4i(356, 356),
-      glUniform4iv(357, 357),
-      glUniformMatrix2fv(358, 358),
-      glUniformMatrix3fv(359, 359),
-      glUniformMatrix4fv(360, 360),
-      glUnmapBufferOES(361, 361),
-      glUseProgram(362, 362),
-      glValidateProgram(363, 363),
-      glVertexAttrib1f(364, 364),
-      glVertexAttrib1fv(365, 365),
-      glVertexAttrib2f(366, 366),
-      glVertexAttrib2fv(367, 367),
-      glVertexAttrib3f(368, 368),
-      glVertexAttrib3fv(369, 369),
-      glVertexAttrib4f(370, 370),
-      glVertexAttrib4fv(371, 371),
-      glVertexAttribPointer(372, 372),
-      glVertexPointer(373, 373),
-      glViewport(374, 374),
-      glWeightPointerOES(375, 375),
-      glReadBuffer(376, 376),
-      glDrawRangeElements(377, 377),
-      glTexImage3D(378, 378),
-      glTexSubImage3D(379, 379),
-      glCopyTexSubImage3D(380, 380),
-      glCompressedTexImage3D(381, 381),
-      glCompressedTexSubImage3D(382, 382),
-      glGenQueries(383, 383),
-      glDeleteQueries(384, 384),
-      glIsQuery(385, 385),
-      glBeginQuery(386, 386),
-      glEndQuery(387, 387),
-      glGetQueryiv(388, 388),
-      glGetQueryObjectuiv(389, 389),
-      glUnmapBuffer(390, 390),
-      glGetBufferPointerv(391, 391),
-      glDrawBuffers(392, 392),
-      glUniformMatrix2x3fv(393, 393),
-      glUniformMatrix3x2fv(394, 394),
-      glUniformMatrix2x4fv(395, 395),
-      glUniformMatrix4x2fv(396, 396),
-      glUniformMatrix3x4fv(397, 397),
-      glUniformMatrix4x3fv(398, 398),
-      glBlitFramebuffer(399, 399),
-      glRenderbufferStorageMultisample(400, 400),
-      glFramebufferTextureLayer(401, 401),
-      glMapBufferRange(402, 402),
-      glFlushMappedBufferRange(403, 403),
-      glBindVertexArray(404, 404),
-      glDeleteVertexArrays(405, 405),
-      glGenVertexArrays(406, 406),
-      glIsVertexArray(407, 407),
-      glGetIntegeri_v(408, 408),
-      glBeginTransformFeedback(409, 409),
-      glEndTransformFeedback(410, 410),
-      glBindBufferRange(411, 411),
-      glBindBufferBase(412, 412),
-      glTransformFeedbackVaryings(413, 413),
-      glGetTransformFeedbackVarying(414, 414),
-      glVertexAttribIPointer(415, 415),
-      glGetVertexAttribIiv(416, 416),
-      glGetVertexAttribIuiv(417, 417),
-      glVertexAttribI4i(418, 418),
-      glVertexAttribI4ui(419, 419),
-      glVertexAttribI4iv(420, 420),
-      glVertexAttribI4uiv(421, 421),
-      glGetUniformuiv(422, 422),
-      glGetFragDataLocation(423, 423),
-      glUniform1ui(424, 424),
-      glUniform2ui(425, 425),
-      glUniform3ui(426, 426),
-      glUniform4ui(427, 427),
-      glUniform1uiv(428, 428),
-      glUniform2uiv(429, 429),
-      glUniform3uiv(430, 430),
-      glUniform4uiv(431, 431),
-      glClearBufferiv(432, 432),
-      glClearBufferuiv(433, 433),
-      glClearBufferfv(434, 434),
-      glClearBufferfi(435, 435),
-      glGetStringi(436, 436),
-      glCopyBufferSubData(437, 437),
-      glGetUniformIndices(438, 438),
-      glGetActiveUniformsiv(439, 439),
-      glGetUniformBlockIndex(440, 440),
-      glGetActiveUniformBlockiv(441, 441),
-      glGetActiveUniformBlockName(442, 442),
-      glUniformBlockBinding(443, 443),
-      glDrawArraysInstanced(444, 444),
-      glDrawElementsInstanced(445, 445),
-      glFenceSync(446, 446),
-      glIsSync(447, 447),
-      glDeleteSync(448, 448),
-      glClientWaitSync(449, 449),
-      glWaitSync(450, 450),
-      glGetInteger64v(451, 451),
-      glGetSynciv(452, 452),
-      glGetInteger64i_v(453, 453),
-      glGetBufferParameteri64v(454, 454),
-      glGenSamplers(455, 455),
-      glDeleteSamplers(456, 456),
-      glIsSampler(457, 457),
-      glBindSampler(458, 458),
-      glSamplerParameteri(459, 459),
-      glSamplerParameteriv(460, 460),
-      glSamplerParameterf(461, 461),
-      glSamplerParameterfv(462, 462),
-      glGetSamplerParameteriv(463, 463),
-      glGetSamplerParameterfv(464, 464),
-      glVertexAttribDivisor(465, 465),
-      glBindTransformFeedback(466, 466),
-      glDeleteTransformFeedbacks(467, 467),
-      glGenTransformFeedbacks(468, 468),
-      glIsTransformFeedback(469, 469),
-      glPauseTransformFeedback(470, 470),
-      glResumeTransformFeedback(471, 471),
-      glGetProgramBinary(472, 472),
-      glProgramBinary(473, 473),
-      glProgramParameteri(474, 474),
-      glInvalidateFramebuffer(475, 475),
-      glInvalidateSubFramebuffer(476, 476),
-      glTexStorage2D(477, 477),
-      glTexStorage3D(478, 478),
-      glGetInternalformativ(479, 479),
-      glActiveShaderProgramEXT(480, 502),
-      glAlphaFuncQCOM(481, 503),
-      glBeginQueryEXT(482, 504),
-      glBindProgramPipelineEXT(483, 505),
-      glBlitFramebufferANGLE(484, 506),
-      glCreateShaderProgramvEXT(485, 507),
-      glDeleteProgramPipelinesEXT(486, 508),
-      glDeleteQueriesEXT(487, 509),
-      glDrawBuffersNV(488, 510),
-      glEndQueryEXT(489, 511),
-      glFramebufferTexture2DMultisampleEXT(490, 512),
-      glGenProgramPipelinesEXT(491, 513),
-      glGenQueriesEXT(492, 514),
-      glGetGraphicsResetStatusEXT(493, 515),
-      glGetObjectLabelEXT(494, 516),
-      glGetProgramPipelineInfoLogEXT(495, 517),
-      glGetProgramPipelineivEXT(496, 518),
-      glGetQueryObjectuivEXT(497, 519),
-      glGetQueryivEXT(498, 520),
-      glGetnUniformfvEXT(499, 521),
-      glInsertEventMarkerEXT(501, 522),
-      glIsProgramPipelineEXT(502, 523),
-      glIsQueryEXT(503, 524),
-      glLabelObjectEXT(504, 525),
-      glPopGroupMarkerEXT(505, 526),
-      glProgramParameteriEXT(506, 527),
-      glProgramUniform1fEXT(507, 528),
-      glProgramUniform1fvEXT(508, 529),
-      glProgramUniform1iEXT(509, 530),
-      glProgramUniform1ivEXT(510, 531),
-      glProgramUniform2fEXT(511, 532),
-      glProgramUniform2fvEXT(512, 533),
-      glProgramUniform2iEXT(513, 534),
-      glProgramUniform2ivEXT(514, 535),
-      glProgramUniform3fEXT(515, 536),
-      glProgramUniform3fvEXT(516, 537),
-      glProgramUniform3iEXT(517, 538),
-      glProgramUniform3ivEXT(518, 539),
-      glProgramUniform4fEXT(519, 540),
-      glProgramUniform4fvEXT(520, 541),
-      glProgramUniform4iEXT(521, 542),
-      glProgramUniform4ivEXT(522, 543),
-      glProgramUniformMatrix2fvEXT(523, 544),
-      glProgramUniformMatrix3fvEXT(524, 545),
-      glProgramUniformMatrix4fvEXT(525, 546),
-      glPushGroupMarkerEXT(526, 547),
-      glReadBufferNV(527, 548),
-      glReadnPixelsEXT(528, 549),
-      glRenderbufferStorageMultisampleANGLE(529, 550),
-      glRenderbufferStorageMultisampleAPPLE(530, 551),
-      glRenderbufferStorageMultisampleEXT(531, 552),
-      glResolveMultisampleFramebufferAPPLE(532, 553),
-      glTexStorage1DEXT(533, 554),
-      glTexStorage2DEXT(534, 555),
-      glTexStorage3DEXT(535, 556),
-      glTextureStorage1DEXT(536, 557),
-      glTextureStorage2DEXT(537, 558),
-      glTextureStorage3DEXT(538, 559),
-      glUseProgramStagesEXT(539, 560),
-      glValidateProgramPipelineEXT(540, 561),
-      eglGetDisplay(541, 2000),
-      eglInitialize(542, 2001),
-      eglTerminate(543, 2002),
-      eglGetConfigs(544, 2003),
-      eglChooseConfig(545, 2004),
-      eglGetConfigAttrib(546, 2005),
-      eglCreateWindowSurface(547, 2006),
-      eglCreatePixmapSurface(548, 2007),
-      eglCreatePbufferSurface(549, 2008),
-      eglDestroySurface(550, 2009),
-      eglQuerySurface(551, 2010),
-      eglCreateContext(552, 2011),
-      eglDestroyContext(553, 2012),
-      eglMakeCurrent(554, 2013),
-      eglGetCurrentContext(555, 2014),
-      eglGetCurrentSurface(556, 2015),
-      eglGetCurrentDisplay(557, 2016),
-      eglQueryContext(558, 2017),
-      eglWaitGL(559, 2018),
-      eglWaitNative(560, 2019),
-      eglSwapBuffers(561, 2020),
-      eglCopyBuffers(562, 2021),
-      eglGetError(563, 2022),
-      eglQueryString(564, 2023),
-      eglGetProcAddress(565, 2024),
-      eglSurfaceAttrib(566, 2025),
-      eglBindTexImage(567, 2026),
-      eglReleaseTexImage(568, 2027),
-      eglSwapInterval(569, 2028),
-      eglBindAPI(570, 2029),
-      eglQueryAPI(571, 2030),
-      eglWaitClient(572, 2031),
-      eglReleaseThread(573, 2032),
-      eglCreatePbufferFromClientBuffer(574, 2033),
-      eglLockSurfaceKHR(575, 2034),
-      eglUnlockSurfaceKHR(576, 2035),
-      eglCreateImageKHR(577, 2036),
-      eglDestroyImageKHR(578, 2037),
-      eglCreateSyncKHR(579, 2038),
-      eglDestroySyncKHR(580, 2039),
-      eglClientWaitSyncKHR(581, 2040),
-      eglGetSyncAttribKHR(582, 2041),
-      eglSetSwapRectangleANDROID(583, 2042),
-      eglGetRenderBufferANDROID(584, 2043),
-      eglGetSystemTimeFrequencyNV(585, 2044),
-      eglGetSystemTimeNV(586, 2045),
-      invalid(587, 3000),
-      glVertexAttribPointerData(588, 3001),
-      ;
-      
-      public static final Function glGetnUniformivEXT = glGetnUniformfvEXT;
-      
-      @Override
-    public final int getNumber() { return value; }
-      
-      public static Function valueOf(int value) {
-        switch (value) {
-          case 0: return glActiveTexture;
-          case 1: return glAlphaFunc;
-          case 2: return glAlphaFuncx;
-          case 3: return glAlphaFuncxOES;
-          case 4: return glAttachShader;
-          case 5: return glBeginPerfMonitorAMD;
-          case 6: return glBindAttribLocation;
-          case 7: return glBindBuffer;
-          case 8: return glBindFramebuffer;
-          case 9: return glBindFramebufferOES;
-          case 10: return glBindRenderbuffer;
-          case 11: return glBindRenderbufferOES;
-          case 12: return glBindTexture;
-          case 13: return glBindVertexArrayOES;
-          case 14: return glBlendColor;
-          case 15: return glBlendEquation;
-          case 16: return glBlendEquationOES;
-          case 17: return glBlendEquationSeparate;
-          case 18: return glBlendEquationSeparateOES;
-          case 19: return glBlendFunc;
-          case 20: return glBlendFuncSeparate;
-          case 21: return glBlendFuncSeparateOES;
-          case 22: return glBufferData;
-          case 23: return glBufferSubData;
-          case 24: return glCheckFramebufferStatus;
-          case 25: return glCheckFramebufferStatusOES;
-          case 26: return glClearColor;
-          case 27: return glClearColorx;
-          case 28: return glClearColorxOES;
-          case 29: return glClearDepthf;
-          case 30: return glClearDepthfOES;
-          case 31: return glClearDepthx;
-          case 32: return glClearDepthxOES;
-          case 33: return glClear;
-          case 34: return glClearStencil;
-          case 35: return glClientActiveTexture;
-          case 36: return glClipPlanef;
-          case 37: return glClipPlanefIMG;
-          case 38: return glClipPlanefOES;
-          case 39: return glClipPlanex;
-          case 40: return glClipPlanexIMG;
-          case 41: return glClipPlanexOES;
-          case 42: return glColor4f;
-          case 43: return glColor4ub;
-          case 44: return glColor4x;
-          case 45: return glColor4xOES;
-          case 46: return glColorMask;
-          case 47: return glColorPointer;
-          case 48: return glCompileShader;
-          case 49: return glCompressedTexImage2D;
-          case 50: return glCompressedTexImage3DOES;
-          case 51: return glCompressedTexSubImage2D;
-          case 52: return glCompressedTexSubImage3DOES;
-          case 53: return glCopyTexImage2D;
-          case 54: return glCopyTexSubImage2D;
-          case 55: return glCopyTexSubImage3DOES;
-          case 56: return glCoverageMaskNV;
-          case 57: return glCoverageOperationNV;
-          case 58: return glCreateProgram;
-          case 59: return glCreateShader;
-          case 60: return glCullFace;
-          case 61: return glCurrentPaletteMatrixOES;
-          case 62: return glDeleteBuffers;
-          case 63: return glDeleteFencesNV;
-          case 64: return glDeleteFramebuffers;
-          case 65: return glDeleteFramebuffersOES;
-          case 66: return glDeletePerfMonitorsAMD;
-          case 67: return glDeleteProgram;
-          case 68: return glDeleteRenderbuffers;
-          case 69: return glDeleteRenderbuffersOES;
-          case 70: return glDeleteShader;
-          case 71: return glDeleteTextures;
-          case 72: return glDeleteVertexArraysOES;
-          case 73: return glDepthFunc;
-          case 74: return glDepthMask;
-          case 75: return glDepthRangef;
-          case 76: return glDepthRangefOES;
-          case 77: return glDepthRangex;
-          case 78: return glDepthRangexOES;
-          case 79: return glDetachShader;
-          case 80: return glDisableClientState;
-          case 81: return glDisableDriverControlQCOM;
-          case 82: return glDisable;
-          case 83: return glDisableVertexAttribArray;
-          case 84: return glDiscardFramebufferEXT;
-          case 85: return glDrawArrays;
-          case 86: return glDrawElements;
-          case 87: return glDrawTexfOES;
-          case 88: return glDrawTexfvOES;
-          case 89: return glDrawTexiOES;
-          case 90: return glDrawTexivOES;
-          case 91: return glDrawTexsOES;
-          case 92: return glDrawTexsvOES;
-          case 93: return glDrawTexxOES;
-          case 94: return glDrawTexxvOES;
-          case 95: return glEGLImageTargetRenderbufferStorageOES;
-          case 96: return glEGLImageTargetTexture2DOES;
-          case 97: return glEnableClientState;
-          case 98: return glEnableDriverControlQCOM;
-          case 99: return glEnable;
-          case 100: return glEnableVertexAttribArray;
-          case 101: return glEndPerfMonitorAMD;
-          case 102: return glEndTilingQCOM;
-          case 103: return glExtGetBufferPointervQCOM;
-          case 104: return glExtGetBuffersQCOM;
-          case 105: return glExtGetFramebuffersQCOM;
-          case 106: return glExtGetProgramBinarySourceQCOM;
-          case 107: return glExtGetProgramsQCOM;
-          case 108: return glExtGetRenderbuffersQCOM;
-          case 109: return glExtGetShadersQCOM;
-          case 110: return glExtGetTexLevelParameterivQCOM;
-          case 111: return glExtGetTexSubImageQCOM;
-          case 112: return glExtGetTexturesQCOM;
-          case 113: return glExtIsProgramBinaryQCOM;
-          case 114: return glExtTexObjectStateOverrideiQCOM;
-          case 115: return glFinishFenceNV;
-          case 116: return glFinish;
-          case 117: return glFlush;
-          case 118: return glFogf;
-          case 119: return glFogfv;
-          case 120: return glFogx;
-          case 121: return glFogxOES;
-          case 122: return glFogxv;
-          case 123: return glFogxvOES;
-          case 124: return glFramebufferRenderbuffer;
-          case 125: return glFramebufferRenderbufferOES;
-          case 126: return glFramebufferTexture2D;
-          case 127: return glFramebufferTexture2DMultisampleIMG;
-          case 128: return glFramebufferTexture2DOES;
-          case 129: return glFramebufferTexture3DOES;
-          case 130: return glFrontFace;
-          case 131: return glFrustumf;
-          case 132: return glFrustumfOES;
-          case 133: return glFrustumx;
-          case 134: return glFrustumxOES;
-          case 135: return glGenBuffers;
-          case 136: return glGenerateMipmap;
-          case 137: return glGenerateMipmapOES;
-          case 138: return glGenFencesNV;
-          case 139: return glGenFramebuffers;
-          case 140: return glGenFramebuffersOES;
-          case 141: return glGenPerfMonitorsAMD;
-          case 142: return glGenRenderbuffers;
-          case 143: return glGenRenderbuffersOES;
-          case 144: return glGenTextures;
-          case 145: return glGenVertexArraysOES;
-          case 146: return glGetActiveAttrib;
-          case 147: return glGetActiveUniform;
-          case 148: return glGetAttachedShaders;
-          case 149: return glGetAttribLocation;
-          case 150: return glGetBooleanv;
-          case 151: return glGetBufferParameteriv;
-          case 152: return glGetBufferPointervOES;
-          case 153: return glGetClipPlanef;
-          case 154: return glGetClipPlanefOES;
-          case 155: return glGetClipPlanex;
-          case 156: return glGetClipPlanexOES;
-          case 157: return glGetDriverControlsQCOM;
-          case 158: return glGetDriverControlStringQCOM;
-          case 159: return glGetError;
-          case 160: return glGetFenceivNV;
-          case 161: return glGetFixedv;
-          case 162: return glGetFixedvOES;
-          case 163: return glGetFloatv;
-          case 164: return glGetFramebufferAttachmentParameteriv;
-          case 165: return glGetFramebufferAttachmentParameterivOES;
-          case 166: return glGetIntegerv;
-          case 167: return glGetLightfv;
-          case 168: return glGetLightxv;
-          case 169: return glGetLightxvOES;
-          case 170: return glGetMaterialfv;
-          case 171: return glGetMaterialxv;
-          case 172: return glGetMaterialxvOES;
-          case 173: return glGetPerfMonitorCounterDataAMD;
-          case 174: return glGetPerfMonitorCounterInfoAMD;
-          case 175: return glGetPerfMonitorCountersAMD;
-          case 176: return glGetPerfMonitorCounterStringAMD;
-          case 177: return glGetPerfMonitorGroupsAMD;
-          case 178: return glGetPerfMonitorGroupStringAMD;
-          case 179: return glGetPointerv;
-          case 180: return glGetProgramBinaryOES;
-          case 181: return glGetProgramInfoLog;
-          case 182: return glGetProgramiv;
-          case 183: return glGetRenderbufferParameteriv;
-          case 184: return glGetRenderbufferParameterivOES;
-          case 185: return glGetShaderInfoLog;
-          case 186: return glGetShaderiv;
-          case 187: return glGetShaderPrecisionFormat;
-          case 188: return glGetShaderSource;
-          case 189: return glGetString;
-          case 190: return glGetTexEnvfv;
-          case 191: return glGetTexEnviv;
-          case 192: return glGetTexEnvxv;
-          case 193: return glGetTexEnvxvOES;
-          case 194: return glGetTexGenfvOES;
-          case 195: return glGetTexGenivOES;
-          case 196: return glGetTexGenxvOES;
-          case 197: return glGetTexParameterfv;
-          case 198: return glGetTexParameteriv;
-          case 199: return glGetTexParameterxv;
-          case 200: return glGetTexParameterxvOES;
-          case 201: return glGetUniformfv;
-          case 202: return glGetUniformiv;
-          case 203: return glGetUniformLocation;
-          case 204: return glGetVertexAttribfv;
-          case 205: return glGetVertexAttribiv;
-          case 206: return glGetVertexAttribPointerv;
-          case 207: return glHint;
-          case 208: return glIsBuffer;
-          case 209: return glIsEnabled;
-          case 210: return glIsFenceNV;
-          case 211: return glIsFramebuffer;
-          case 212: return glIsFramebufferOES;
-          case 213: return glIsProgram;
-          case 214: return glIsRenderbuffer;
-          case 215: return glIsRenderbufferOES;
-          case 216: return glIsShader;
-          case 217: return glIsTexture;
-          case 218: return glIsVertexArrayOES;
-          case 219: return glLightf;
-          case 220: return glLightfv;
-          case 221: return glLightModelf;
-          case 222: return glLightModelfv;
-          case 223: return glLightModelx;
-          case 224: return glLightModelxOES;
-          case 225: return glLightModelxv;
-          case 226: return glLightModelxvOES;
-          case 227: return glLightx;
-          case 228: return glLightxOES;
-          case 229: return glLightxv;
-          case 230: return glLightxvOES;
-          case 231: return glLineWidth;
-          case 232: return glLineWidthx;
-          case 233: return glLineWidthxOES;
-          case 234: return glLinkProgram;
-          case 235: return glLoadIdentity;
-          case 236: return glLoadMatrixf;
-          case 237: return glLoadMatrixx;
-          case 238: return glLoadMatrixxOES;
-          case 239: return glLoadPaletteFromModelViewMatrixOES;
-          case 240: return glLogicOp;
-          case 241: return glMapBufferOES;
-          case 242: return glMaterialf;
-          case 243: return glMaterialfv;
-          case 244: return glMaterialx;
-          case 245: return glMaterialxOES;
-          case 246: return glMaterialxv;
-          case 247: return glMaterialxvOES;
-          case 248: return glMatrixIndexPointerOES;
-          case 249: return glMatrixMode;
-          case 250: return glMultiDrawArraysEXT;
-          case 251: return glMultiDrawElementsEXT;
-          case 252: return glMultiTexCoord4f;
-          case 253: return glMultiTexCoord4x;
-          case 254: return glMultiTexCoord4xOES;
-          case 255: return glMultMatrixf;
-          case 256: return glMultMatrixx;
-          case 257: return glMultMatrixxOES;
-          case 258: return glNormal3f;
-          case 259: return glNormal3x;
-          case 260: return glNormal3xOES;
-          case 261: return glNormalPointer;
-          case 262: return glOrthof;
-          case 263: return glOrthofOES;
-          case 264: return glOrthox;
-          case 265: return glOrthoxOES;
-          case 266: return glPixelStorei;
-          case 267: return glPointParameterf;
-          case 268: return glPointParameterfv;
-          case 269: return glPointParameterx;
-          case 270: return glPointParameterxOES;
-          case 271: return glPointParameterxv;
-          case 272: return glPointParameterxvOES;
-          case 273: return glPointSize;
-          case 274: return glPointSizePointerOES;
-          case 275: return glPointSizex;
-          case 276: return glPointSizexOES;
-          case 277: return glPolygonOffset;
-          case 278: return glPolygonOffsetx;
-          case 279: return glPolygonOffsetxOES;
-          case 280: return glPopMatrix;
-          case 281: return glProgramBinaryOES;
-          case 282: return glPushMatrix;
-          case 283: return glQueryMatrixxOES;
-          case 284: return glReadPixels;
-          case 285: return glReleaseShaderCompiler;
-          case 286: return glRenderbufferStorage;
-          case 287: return glRenderbufferStorageMultisampleIMG;
-          case 288: return glRenderbufferStorageOES;
-          case 289: return glRotatef;
-          case 290: return glRotatex;
-          case 291: return glRotatexOES;
-          case 292: return glSampleCoverage;
-          case 293: return glSampleCoveragex;
-          case 294: return glSampleCoveragexOES;
-          case 295: return glScalef;
-          case 296: return glScalex;
-          case 297: return glScalexOES;
-          case 298: return glScissor;
-          case 299: return glSelectPerfMonitorCountersAMD;
-          case 300: return glSetFenceNV;
-          case 301: return glShadeModel;
-          case 302: return glShaderBinary;
-          case 303: return glShaderSource;
-          case 304: return glStartTilingQCOM;
-          case 305: return glStencilFunc;
-          case 306: return glStencilFuncSeparate;
-          case 307: return glStencilMask;
-          case 308: return glStencilMaskSeparate;
-          case 309: return glStencilOp;
-          case 310: return glStencilOpSeparate;
-          case 311: return glTestFenceNV;
-          case 312: return glTexCoordPointer;
-          case 313: return glTexEnvf;
-          case 314: return glTexEnvfv;
-          case 315: return glTexEnvi;
-          case 316: return glTexEnviv;
-          case 317: return glTexEnvx;
-          case 318: return glTexEnvxOES;
-          case 319: return glTexEnvxv;
-          case 320: return glTexEnvxvOES;
-          case 321: return glTexGenfOES;
-          case 322: return glTexGenfvOES;
-          case 323: return glTexGeniOES;
-          case 324: return glTexGenivOES;
-          case 325: return glTexGenxOES;
-          case 326: return glTexGenxvOES;
-          case 327: return glTexImage2D;
-          case 328: return glTexImage3DOES;
-          case 329: return glTexParameterf;
-          case 330: return glTexParameterfv;
-          case 331: return glTexParameteri;
-          case 332: return glTexParameteriv;
-          case 333: return glTexParameterx;
-          case 334: return glTexParameterxOES;
-          case 335: return glTexParameterxv;
-          case 336: return glTexParameterxvOES;
-          case 337: return glTexSubImage2D;
-          case 338: return glTexSubImage3DOES;
-          case 339: return glTranslatef;
-          case 340: return glTranslatex;
-          case 341: return glTranslatexOES;
-          case 342: return glUniform1f;
-          case 343: return glUniform1fv;
-          case 344: return glUniform1i;
-          case 345: return glUniform1iv;
-          case 346: return glUniform2f;
-          case 347: return glUniform2fv;
-          case 348: return glUniform2i;
-          case 349: return glUniform2iv;
-          case 350: return glUniform3f;
-          case 351: return glUniform3fv;
-          case 352: return glUniform3i;
-          case 353: return glUniform3iv;
-          case 354: return glUniform4f;
-          case 355: return glUniform4fv;
-          case 356: return glUniform4i;
-          case 357: return glUniform4iv;
-          case 358: return glUniformMatrix2fv;
-          case 359: return glUniformMatrix3fv;
-          case 360: return glUniformMatrix4fv;
-          case 361: return glUnmapBufferOES;
-          case 362: return glUseProgram;
-          case 363: return glValidateProgram;
-          case 364: return glVertexAttrib1f;
-          case 365: return glVertexAttrib1fv;
-          case 366: return glVertexAttrib2f;
-          case 367: return glVertexAttrib2fv;
-          case 368: return glVertexAttrib3f;
-          case 369: return glVertexAttrib3fv;
-          case 370: return glVertexAttrib4f;
-          case 371: return glVertexAttrib4fv;
-          case 372: return glVertexAttribPointer;
-          case 373: return glVertexPointer;
-          case 374: return glViewport;
-          case 375: return glWeightPointerOES;
-          case 376: return glReadBuffer;
-          case 377: return glDrawRangeElements;
-          case 378: return glTexImage3D;
-          case 379: return glTexSubImage3D;
-          case 380: return glCopyTexSubImage3D;
-          case 381: return glCompressedTexImage3D;
-          case 382: return glCompressedTexSubImage3D;
-          case 383: return glGenQueries;
-          case 384: return glDeleteQueries;
-          case 385: return glIsQuery;
-          case 386: return glBeginQuery;
-          case 387: return glEndQuery;
-          case 388: return glGetQueryiv;
-          case 389: return glGetQueryObjectuiv;
-          case 390: return glUnmapBuffer;
-          case 391: return glGetBufferPointerv;
-          case 392: return glDrawBuffers;
-          case 393: return glUniformMatrix2x3fv;
-          case 394: return glUniformMatrix3x2fv;
-          case 395: return glUniformMatrix2x4fv;
-          case 396: return glUniformMatrix4x2fv;
-          case 397: return glUniformMatrix3x4fv;
-          case 398: return glUniformMatrix4x3fv;
-          case 399: return glBlitFramebuffer;
-          case 400: return glRenderbufferStorageMultisample;
-          case 401: return glFramebufferTextureLayer;
-          case 402: return glMapBufferRange;
-          case 403: return glFlushMappedBufferRange;
-          case 404: return glBindVertexArray;
-          case 405: return glDeleteVertexArrays;
-          case 406: return glGenVertexArrays;
-          case 407: return glIsVertexArray;
-          case 408: return glGetIntegeri_v;
-          case 409: return glBeginTransformFeedback;
-          case 410: return glEndTransformFeedback;
-          case 411: return glBindBufferRange;
-          case 412: return glBindBufferBase;
-          case 413: return glTransformFeedbackVaryings;
-          case 414: return glGetTransformFeedbackVarying;
-          case 415: return glVertexAttribIPointer;
-          case 416: return glGetVertexAttribIiv;
-          case 417: return glGetVertexAttribIuiv;
-          case 418: return glVertexAttribI4i;
-          case 419: return glVertexAttribI4ui;
-          case 420: return glVertexAttribI4iv;
-          case 421: return glVertexAttribI4uiv;
-          case 422: return glGetUniformuiv;
-          case 423: return glGetFragDataLocation;
-          case 424: return glUniform1ui;
-          case 425: return glUniform2ui;
-          case 426: return glUniform3ui;
-          case 427: return glUniform4ui;
-          case 428: return glUniform1uiv;
-          case 429: return glUniform2uiv;
-          case 430: return glUniform3uiv;
-          case 431: return glUniform4uiv;
-          case 432: return glClearBufferiv;
-          case 433: return glClearBufferuiv;
-          case 434: return glClearBufferfv;
-          case 435: return glClearBufferfi;
-          case 436: return glGetStringi;
-          case 437: return glCopyBufferSubData;
-          case 438: return glGetUniformIndices;
-          case 439: return glGetActiveUniformsiv;
-          case 440: return glGetUniformBlockIndex;
-          case 441: return glGetActiveUniformBlockiv;
-          case 442: return glGetActiveUniformBlockName;
-          case 443: return glUniformBlockBinding;
-          case 444: return glDrawArraysInstanced;
-          case 445: return glDrawElementsInstanced;
-          case 446: return glFenceSync;
-          case 447: return glIsSync;
-          case 448: return glDeleteSync;
-          case 449: return glClientWaitSync;
-          case 450: return glWaitSync;
-          case 451: return glGetInteger64v;
-          case 452: return glGetSynciv;
-          case 453: return glGetInteger64i_v;
-          case 454: return glGetBufferParameteri64v;
-          case 455: return glGenSamplers;
-          case 456: return glDeleteSamplers;
-          case 457: return glIsSampler;
-          case 458: return glBindSampler;
-          case 459: return glSamplerParameteri;
-          case 460: return glSamplerParameteriv;
-          case 461: return glSamplerParameterf;
-          case 462: return glSamplerParameterfv;
-          case 463: return glGetSamplerParameteriv;
-          case 464: return glGetSamplerParameterfv;
-          case 465: return glVertexAttribDivisor;
-          case 466: return glBindTransformFeedback;
-          case 467: return glDeleteTransformFeedbacks;
-          case 468: return glGenTransformFeedbacks;
-          case 469: return glIsTransformFeedback;
-          case 470: return glPauseTransformFeedback;
-          case 471: return glResumeTransformFeedback;
-          case 472: return glGetProgramBinary;
-          case 473: return glProgramBinary;
-          case 474: return glProgramParameteri;
-          case 475: return glInvalidateFramebuffer;
-          case 476: return glInvalidateSubFramebuffer;
-          case 477: return glTexStorage2D;
-          case 478: return glTexStorage3D;
-          case 479: return glGetInternalformativ;
-          case 502: return glActiveShaderProgramEXT;
-          case 503: return glAlphaFuncQCOM;
-          case 504: return glBeginQueryEXT;
-          case 505: return glBindProgramPipelineEXT;
-          case 506: return glBlitFramebufferANGLE;
-          case 507: return glCreateShaderProgramvEXT;
-          case 508: return glDeleteProgramPipelinesEXT;
-          case 509: return glDeleteQueriesEXT;
-          case 510: return glDrawBuffersNV;
-          case 511: return glEndQueryEXT;
-          case 512: return glFramebufferTexture2DMultisampleEXT;
-          case 513: return glGenProgramPipelinesEXT;
-          case 514: return glGenQueriesEXT;
-          case 515: return glGetGraphicsResetStatusEXT;
-          case 516: return glGetObjectLabelEXT;
-          case 517: return glGetProgramPipelineInfoLogEXT;
-          case 518: return glGetProgramPipelineivEXT;
-          case 519: return glGetQueryObjectuivEXT;
-          case 520: return glGetQueryivEXT;
-          case 521: return glGetnUniformfvEXT;
-          case 522: return glInsertEventMarkerEXT;
-          case 523: return glIsProgramPipelineEXT;
-          case 524: return glIsQueryEXT;
-          case 525: return glLabelObjectEXT;
-          case 526: return glPopGroupMarkerEXT;
-          case 527: return glProgramParameteriEXT;
-          case 528: return glProgramUniform1fEXT;
-          case 529: return glProgramUniform1fvEXT;
-          case 530: return glProgramUniform1iEXT;
-          case 531: return glProgramUniform1ivEXT;
-          case 532: return glProgramUniform2fEXT;
-          case 533: return glProgramUniform2fvEXT;
-          case 534: return glProgramUniform2iEXT;
-          case 535: return glProgramUniform2ivEXT;
-          case 536: return glProgramUniform3fEXT;
-          case 537: return glProgramUniform3fvEXT;
-          case 538: return glProgramUniform3iEXT;
-          case 539: return glProgramUniform3ivEXT;
-          case 540: return glProgramUniform4fEXT;
-          case 541: return glProgramUniform4fvEXT;
-          case 542: return glProgramUniform4iEXT;
-          case 543: return glProgramUniform4ivEXT;
-          case 544: return glProgramUniformMatrix2fvEXT;
-          case 545: return glProgramUniformMatrix3fvEXT;
-          case 546: return glProgramUniformMatrix4fvEXT;
-          case 547: return glPushGroupMarkerEXT;
-          case 548: return glReadBufferNV;
-          case 549: return glReadnPixelsEXT;
-          case 550: return glRenderbufferStorageMultisampleANGLE;
-          case 551: return glRenderbufferStorageMultisampleAPPLE;
-          case 552: return glRenderbufferStorageMultisampleEXT;
-          case 553: return glResolveMultisampleFramebufferAPPLE;
-          case 554: return glTexStorage1DEXT;
-          case 555: return glTexStorage2DEXT;
-          case 556: return glTexStorage3DEXT;
-          case 557: return glTextureStorage1DEXT;
-          case 558: return glTextureStorage2DEXT;
-          case 559: return glTextureStorage3DEXT;
-          case 560: return glUseProgramStagesEXT;
-          case 561: return glValidateProgramPipelineEXT;
-          case 2000: return eglGetDisplay;
-          case 2001: return eglInitialize;
-          case 2002: return eglTerminate;
-          case 2003: return eglGetConfigs;
-          case 2004: return eglChooseConfig;
-          case 2005: return eglGetConfigAttrib;
-          case 2006: return eglCreateWindowSurface;
-          case 2007: return eglCreatePixmapSurface;
-          case 2008: return eglCreatePbufferSurface;
-          case 2009: return eglDestroySurface;
-          case 2010: return eglQuerySurface;
-          case 2011: return eglCreateContext;
-          case 2012: return eglDestroyContext;
-          case 2013: return eglMakeCurrent;
-          case 2014: return eglGetCurrentContext;
-          case 2015: return eglGetCurrentSurface;
-          case 2016: return eglGetCurrentDisplay;
-          case 2017: return eglQueryContext;
-          case 2018: return eglWaitGL;
-          case 2019: return eglWaitNative;
-          case 2020: return eglSwapBuffers;
-          case 2021: return eglCopyBuffers;
-          case 2022: return eglGetError;
-          case 2023: return eglQueryString;
-          case 2024: return eglGetProcAddress;
-          case 2025: return eglSurfaceAttrib;
-          case 2026: return eglBindTexImage;
-          case 2027: return eglReleaseTexImage;
-          case 2028: return eglSwapInterval;
-          case 2029: return eglBindAPI;
-          case 2030: return eglQueryAPI;
-          case 2031: return eglWaitClient;
-          case 2032: return eglReleaseThread;
-          case 2033: return eglCreatePbufferFromClientBuffer;
-          case 2034: return eglLockSurfaceKHR;
-          case 2035: return eglUnlockSurfaceKHR;
-          case 2036: return eglCreateImageKHR;
-          case 2037: return eglDestroyImageKHR;
-          case 2038: return eglCreateSyncKHR;
-          case 2039: return eglDestroySyncKHR;
-          case 2040: return eglClientWaitSyncKHR;
-          case 2041: return eglGetSyncAttribKHR;
-          case 2042: return eglSetSwapRectangleANDROID;
-          case 2043: return eglGetRenderBufferANDROID;
-          case 2044: return eglGetSystemTimeFrequencyNV;
-          case 2045: return eglGetSystemTimeNV;
-          case 3000: return invalid;
-          case 3001: return glVertexAttribPointerData;
-          default: return null;
-        }
-      }
-      
-      public static com.google.protobuf.Internal.EnumLiteMap<Function>
-          internalGetValueMap() {
-        return internalValueMap;
-      }
-      private static com.google.protobuf.Internal.EnumLiteMap<Function>
-          internalValueMap =
-            new com.google.protobuf.Internal.EnumLiteMap<Function>() {
-              @Override
-            public Function findValueByNumber(int number) {
-                return Function.valueOf(number)
-      ;        }
-            };
-      
-      private final int index;
-      private final int value;
-      private Function(int index, int value) {
-        this.index = index;
-        this.value = value;
-      }
-      
-      // @@protoc_insertion_point(enum_scope:android.gltrace.GLMessage.Function)
-    }
-    
-    public static final class DataType extends
-        com.google.protobuf.GeneratedMessageLite {
-      // Use DataType.newBuilder() to construct.
-      private DataType() {
-        initFields();
-      }
-      private DataType(boolean noInit) {}
-      
-      private static final DataType defaultInstance;
-      public static DataType getDefaultInstance() {
-        return defaultInstance;
-      }
-      
-      @Override
-    public DataType getDefaultInstanceForType() {
-        return defaultInstance;
-      }
-      
-      public enum Type
-          implements com.google.protobuf.Internal.EnumLite {
-        VOID(0, 1),
-        CHAR(1, 2),
-        BYTE(2, 3),
-        INT(3, 4),
-        FLOAT(4, 5),
-        BOOL(5, 6),
-        ENUM(6, 7),
-        INT64(7, 8),
-        ;
-        
-        
-        @Override
-        public final int getNumber() { return value; }
-        
-        public static Type valueOf(int value) {
-          switch (value) {
-            case 1: return VOID;
-            case 2: return CHAR;
-            case 3: return BYTE;
-            case 4: return INT;
-            case 5: return FLOAT;
-            case 6: return BOOL;
-            case 7: return ENUM;
-            case 8: return INT64;
-            default: return null;
-          }
-        }
-        
-        public static com.google.protobuf.Internal.EnumLiteMap<Type>
-            internalGetValueMap() {
-          return internalValueMap;
-        }
-        private static com.google.protobuf.Internal.EnumLiteMap<Type>
-            internalValueMap =
-              new com.google.protobuf.Internal.EnumLiteMap<Type>() {
-                @Override
-                public Type findValueByNumber(int number) {
-                  return Type.valueOf(number)
-        ;        }
-              };
-        
-        private final int index;
-        private final int value;
-        private Type(int index, int value) {
-          this.index = index;
-          this.value = value;
-        }
-        
-        // @@protoc_insertion_point(enum_scope:android.gltrace.GLMessage.DataType.Type)
-      }
-      
-      // required .android.gltrace.GLMessage.DataType.Type type = 1 [default = VOID];
-      public static final int TYPE_FIELD_NUMBER = 1;
-      private boolean hasType;
-      private com.android.ide.eclipse.gltrace.GLProtoBuf.GLMessage.DataType.Type type_;
-      public boolean hasType() { return hasType; }
-      public com.android.ide.eclipse.gltrace.GLProtoBuf.GLMessage.DataType.Type getType() { return type_; }
-      
-      // required bool isArray = 2 [default = false];
-      public static final int ISARRAY_FIELD_NUMBER = 2;
-      private boolean hasIsArray;
-      private boolean isArray_ = false;
-      public boolean hasIsArray() { return hasIsArray; }
-      public boolean getIsArray() { return isArray_; }
-      
-      // repeated int32 intValue = 3;
-      public static final int INTVALUE_FIELD_NUMBER = 3;
-      private java.util.List<java.lang.Integer> intValue_ =
-        java.util.Collections.emptyList();
-      public java.util.List<java.lang.Integer> getIntValueList() {
-        return intValue_;
-      }
-      public int getIntValueCount() { return intValue_.size(); }
-      public int getIntValue(int index) {
-        return intValue_.get(index);
-      }
-      
-      // repeated float floatValue = 4;
-      public static final int FLOATVALUE_FIELD_NUMBER = 4;
-      private java.util.List<java.lang.Float> floatValue_ =
-        java.util.Collections.emptyList();
-      public java.util.List<java.lang.Float> getFloatValueList() {
-        return floatValue_;
-      }
-      public int getFloatValueCount() { return floatValue_.size(); }
-      public float getFloatValue(int index) {
-        return floatValue_.get(index);
-      }
-      
-      // repeated bytes charValue = 5;
-      public static final int CHARVALUE_FIELD_NUMBER = 5;
-      private java.util.List<com.google.protobuf.ByteString> charValue_ =
-        java.util.Collections.emptyList();
-      public java.util.List<com.google.protobuf.ByteString> getCharValueList() {
-        return charValue_;
-      }
-      public int getCharValueCount() { return charValue_.size(); }
-      public com.google.protobuf.ByteString getCharValue(int index) {
-        return charValue_.get(index);
-      }
-      
-      // repeated bytes rawBytes = 6;
-      public static final int RAWBYTES_FIELD_NUMBER = 6;
-      private java.util.List<com.google.protobuf.ByteString> rawBytes_ =
-        java.util.Collections.emptyList();
-      public java.util.List<com.google.protobuf.ByteString> getRawBytesList() {
-        return rawBytes_;
-      }
-      public int getRawBytesCount() { return rawBytes_.size(); }
-      public com.google.protobuf.ByteString getRawBytes(int index) {
-        return rawBytes_.get(index);
-      }
-      
-      // repeated bool boolValue = 7;
-      public static final int BOOLVALUE_FIELD_NUMBER = 7;
-      private java.util.List<java.lang.Boolean> boolValue_ =
-        java.util.Collections.emptyList();
-      public java.util.List<java.lang.Boolean> getBoolValueList() {
-        return boolValue_;
-      }
-      public int getBoolValueCount() { return boolValue_.size(); }
-      public boolean getBoolValue(int index) {
-        return boolValue_.get(index);
-      }
-      
-      // repeated int64 int64Value = 8;
-      public static final int INT64VALUE_FIELD_NUMBER = 8;
-      private java.util.List<java.lang.Long> int64Value_ =
-        java.util.Collections.emptyList();
-      public java.util.List<java.lang.Long> getInt64ValueList() {
-        return int64Value_;
-      }
-      public int getInt64ValueCount() { return int64Value_.size(); }
-      public long getInt64Value(int index) {
-        return int64Value_.get(index);
-      }
-      
-      private void initFields() {
-        type_ = com.android.ide.eclipse.gltrace.GLProtoBuf.GLMessage.DataType.Type.VOID;
-      }
-      @Override
-    public final boolean isInitialized() {
-        if (!hasType) return false;
-        if (!hasIsArray) return false;
-        return true;
-      }
-      
-      @Override
-    public void writeTo(com.google.protobuf.CodedOutputStream output)
-                          throws java.io.IOException {
-        getSerializedSize();
-        if (hasType()) {
-          output.writeEnum(1, getType().getNumber());
-        }
-        if (hasIsArray()) {
-          output.writeBool(2, getIsArray());
-        }
-        for (int element : getIntValueList()) {
-          output.writeInt32(3, element);
-        }
-        for (float element : getFloatValueList()) {
-          output.writeFloat(4, element);
-        }
-        for (com.google.protobuf.ByteString element : getCharValueList()) {
-          output.writeBytes(5, element);
-        }
-        for (com.google.protobuf.ByteString element : getRawBytesList()) {
-          output.writeBytes(6, element);
-        }
-        for (boolean element : getBoolValueList()) {
-          output.writeBool(7, element);
-        }
-        for (long element : getInt64ValueList()) {
-          output.writeInt64(8, element);
-        }
-      }
-      
-      private int memoizedSerializedSize = -1;
-      @Override
-    public int getSerializedSize() {
-        int size = memoizedSerializedSize;
-        if (size != -1) return size;
-      
-        size = 0;
-        if (hasType()) {
-          size += com.google.protobuf.CodedOutputStream
-            .computeEnumSize(1, getType().getNumber());
-        }
-        if (hasIsArray()) {
-          size += com.google.protobuf.CodedOutputStream
-            .computeBoolSize(2, getIsArray());
-        }
-        {
-          int dataSize = 0;
-          for (int element : getIntValueList()) {
-            dataSize += com.google.protobuf.CodedOutputStream
-              .computeInt32SizeNoTag(element);
-          }
-          size += dataSize;
-          size += 1 * getIntValueList().size();
-        }
-        {
-          int dataSize = 0;
-          dataSize = 4 * getFloatValueList().size();
-          size += dataSize;
-          size += 1 * getFloatValueList().size();
-        }
-        {
-          int dataSize = 0;
-          for (com.google.protobuf.ByteString element : getCharValueList()) {
-            dataSize += com.google.protobuf.CodedOutputStream
-              .computeBytesSizeNoTag(element);
-          }
-          size += dataSize;
-          size += 1 * getCharValueList().size();
-        }
-        {
-          int dataSize = 0;
-          for (com.google.protobuf.ByteString element : getRawBytesList()) {
-            dataSize += com.google.protobuf.CodedOutputStream
-              .computeBytesSizeNoTag(element);
-          }
-          size += dataSize;
-          size += 1 * getRawBytesList().size();
-        }
-        {
-          int dataSize = 0;
-          dataSize = 1 * getBoolValueList().size();
-          size += dataSize;
-          size += 1 * getBoolValueList().size();
-        }
-        {
-          int dataSize = 0;
-          for (long element : getInt64ValueList()) {
-            dataSize += com.google.protobuf.CodedOutputStream
-              .computeInt64SizeNoTag(element);
-          }
-          size += dataSize;
-          size += 1 * getInt64ValueList().size();
-        }
-        memoizedSerializedSize = size;
-        return size;
-      }
-      
-      public static com.android.ide.eclipse.gltrace.GLProtoBuf.GLMessage.DataType parseFrom(
-          com.google.protobuf.ByteString data)
-          throws com.google.protobuf.InvalidProtocolBufferException {
-        return newBuilder().mergeFrom(data).buildParsed();
-      }
-      public static com.android.ide.eclipse.gltrace.GLProtoBuf.GLMessage.DataType parseFrom(
-          com.google.protobuf.ByteString data,
-          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-          throws com.google.protobuf.InvalidProtocolBufferException {
-        return newBuilder().mergeFrom(data, extensionRegistry)
-                 .buildParsed();
-      }
-      public static com.android.ide.eclipse.gltrace.GLProtoBuf.GLMessage.DataType parseFrom(byte[] data)
-          throws com.google.protobuf.InvalidProtocolBufferException {
-        return newBuilder().mergeFrom(data).buildParsed();
-      }
-      public static com.android.ide.eclipse.gltrace.GLProtoBuf.GLMessage.DataType parseFrom(
-          byte[] data,
-          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-          throws com.google.protobuf.InvalidProtocolBufferException {
-        return newBuilder().mergeFrom(data, extensionRegistry)
-                 .buildParsed();
-      }
-      public static com.android.ide.eclipse.gltrace.GLProtoBuf.GLMessage.DataType parseFrom(java.io.InputStream input)
-          throws java.io.IOException {
-        return newBuilder().mergeFrom(input).buildParsed();
-      }
-      public static com.android.ide.eclipse.gltrace.GLProtoBuf.GLMessage.DataType parseFrom(
-          java.io.InputStream input,
-          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-          throws java.io.IOException {
-        return newBuilder().mergeFrom(input, extensionRegistry)
-                 .buildParsed();
-      }
-      public static com.android.ide.eclipse.gltrace.GLProtoBuf.GLMessage.DataType parseDelimitedFrom(java.io.InputStream input)
-          throws java.io.IOException {
-        Builder builder = newBuilder();
-        if (builder.mergeDelimitedFrom(input)) {
-          return builder.buildParsed();
-        } else {
-          return null;
-        }
-      }
-      public static com.android.ide.eclipse.gltrace.GLProtoBuf.GLMessage.DataType parseDelimitedFrom(
-          java.io.InputStream input,
-          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-          throws java.io.IOException {
-        Builder builder = newBuilder();
-        if (builder.mergeDelimitedFrom(input, extensionRegistry)) {
-          return builder.buildParsed();
-        } else {
-          return null;
-        }
-      }
-      public static com.android.ide.eclipse.gltrace.GLProtoBuf.GLMessage.DataType parseFrom(
-          com.google.protobuf.CodedInputStream input)
-          throws java.io.IOException {
-        return newBuilder().mergeFrom(input).buildParsed();
-      }
-      public static com.android.ide.eclipse.gltrace.GLProtoBuf.GLMessage.DataType parseFrom(
-          com.google.protobuf.CodedInputStream input,
-          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-          throws java.io.IOException {
-        return newBuilder().mergeFrom(input, extensionRegistry)
-                 .buildParsed();
-      }
-      
-      public static Builder newBuilder() { return Builder.create(); }
-      @Override
-    public Builder newBuilderForType() { return newBuilder(); }
-      public static Builder newBuilder(com.android.ide.eclipse.gltrace.GLProtoBuf.GLMessage.DataType prototype) {
-        return newBuilder().mergeFrom(prototype);
-      }
-      @Override
-    public Builder toBuilder() { return newBuilder(this); }
-      
-      public static final class Builder extends
-          com.google.protobuf.GeneratedMessageLite.Builder<
-            com.android.ide.eclipse.gltrace.GLProtoBuf.GLMessage.DataType, Builder> {
-        private com.android.ide.eclipse.gltrace.GLProtoBuf.GLMessage.DataType result;
-        
-        // Construct using com.android.ide.eclipse.gltrace.GLProtoBuf.GLMessage.DataType.newBuilder()
-        private Builder() {}
-        
-        private static Builder create() {
-          Builder builder = new Builder();
-          builder.result = new com.android.ide.eclipse.gltrace.GLProtoBuf.GLMessage.DataType();
-          return builder;
-        }
-        
-        @Override
-        protected com.android.ide.eclipse.gltrace.GLProtoBuf.GLMessage.DataType internalGetResult() {
-          return result;
-        }
-        
-        @Override
-        public Builder clear() {
-          if (result == null) {
-            throw new IllegalStateException(
-              "Cannot call clear() after build().");
-          }
-          result = new com.android.ide.eclipse.gltrace.GLProtoBuf.GLMessage.DataType();
-          return this;
-        }
-        
-        @Override
-        public Builder clone() {
-          return create().mergeFrom(result);
-        }
-        
-        @Override
-        public com.android.ide.eclipse.gltrace.GLProtoBuf.GLMessage.DataType getDefaultInstanceForType() {
-          return com.android.ide.eclipse.gltrace.GLProtoBuf.GLMessage.DataType.getDefaultInstance();
-        }
-        
-        @Override
-        public boolean isInitialized() {
-          return result.isInitialized();
-        }
-        @Override
-        public com.android.ide.eclipse.gltrace.GLProtoBuf.GLMessage.DataType build() {
-          if (result != null && !isInitialized()) {
-            throw newUninitializedMessageException(result);
-          }
-          return buildPartial();
-        }
-        
-        private com.android.ide.eclipse.gltrace.GLProtoBuf.GLMessage.DataType buildParsed()
-            throws com.google.protobuf.InvalidProtocolBufferException {
-          if (!isInitialized()) {
-            throw newUninitializedMessageException(
-              result).asInvalidProtocolBufferException();
-          }
-          return buildPartial();
-        }
-        
-        @Override
-        public com.android.ide.eclipse.gltrace.GLProtoBuf.GLMessage.DataType buildPartial() {
-          if (result == null) {
-            throw new IllegalStateException(
-              "build() has already been called on this Builder.");
-          }
-          if (result.intValue_ != java.util.Collections.EMPTY_LIST) {
-            result.intValue_ =
-              java.util.Collections.unmodifiableList(result.intValue_);
-          }
-          if (result.floatValue_ != java.util.Collections.EMPTY_LIST) {
-            result.floatValue_ =
-              java.util.Collections.unmodifiableList(result.floatValue_);
-          }
-          if (result.charValue_ != java.util.Collections.EMPTY_LIST) {
-            result.charValue_ =
-              java.util.Collections.unmodifiableList(result.charValue_);
-          }
-          if (result.rawBytes_ != java.util.Collections.EMPTY_LIST) {
-            result.rawBytes_ =
-              java.util.Collections.unmodifiableList(result.rawBytes_);
-          }
-          if (result.boolValue_ != java.util.Collections.EMPTY_LIST) {
-            result.boolValue_ =
-              java.util.Collections.unmodifiableList(result.boolValue_);
-          }
-          if (result.int64Value_ != java.util.Collections.EMPTY_LIST) {
-            result.int64Value_ =
-              java.util.Collections.unmodifiableList(result.int64Value_);
-          }
-          com.android.ide.eclipse.gltrace.GLProtoBuf.GLMessage.DataType returnMe = result;
-          result = null;
-          return returnMe;
-        }
-        
-        @Override
-        public Builder mergeFrom(com.android.ide.eclipse.gltrace.GLProtoBuf.GLMessage.DataType other) {
-          if (other == com.android.ide.eclipse.gltrace.GLProtoBuf.GLMessage.DataType.getDefaultInstance()) return this;
-          if (other.hasType()) {
-            setType(other.getType());
-          }
-          if (other.hasIsArray()) {
-            setIsArray(other.getIsArray());
-          }
-          if (!other.intValue_.isEmpty()) {
-            if (result.intValue_.isEmpty()) {
-              result.intValue_ = new java.util.ArrayList<java.lang.Integer>();
-            }
-            result.intValue_.addAll(other.intValue_);
-          }
-          if (!other.floatValue_.isEmpty()) {
-            if (result.floatValue_.isEmpty()) {
-              result.floatValue_ = new java.util.ArrayList<java.lang.Float>();
-            }
-            result.floatValue_.addAll(other.floatValue_);
-          }
-          if (!other.charValue_.isEmpty()) {
-            if (result.charValue_.isEmpty()) {
-              result.charValue_ = new java.util.ArrayList<com.google.protobuf.ByteString>();
-            }
-            result.charValue_.addAll(other.charValue_);
-          }
-          if (!other.rawBytes_.isEmpty()) {
-            if (result.rawBytes_.isEmpty()) {
-              result.rawBytes_ = new java.util.ArrayList<com.google.protobuf.ByteString>();
-            }
-            result.rawBytes_.addAll(other.rawBytes_);
-          }
-          if (!other.boolValue_.isEmpty()) {
-            if (result.boolValue_.isEmpty()) {
-              result.boolValue_ = new java.util.ArrayList<java.lang.Boolean>();
-            }
-            result.boolValue_.addAll(other.boolValue_);
-          }
-          if (!other.int64Value_.isEmpty()) {
-            if (result.int64Value_.isEmpty()) {
-              result.int64Value_ = new java.util.ArrayList<java.lang.Long>();
-            }
-            result.int64Value_.addAll(other.int64Value_);
-          }
-          return this;
-        }
-        
-        @Override
-        public Builder mergeFrom(
-            com.google.protobuf.CodedInputStream input,
-            com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-            throws java.io.IOException {
-          while (true) {
-            int tag = input.readTag();
-            switch (tag) {
-              case 0:
-                return this;
-              default: {
-                if (!parseUnknownField(input, extensionRegistry, tag)) {
-                  return this;
-                }
-                break;
-              }
-              case 8: {
-                int rawValue = input.readEnum();
-                com.android.ide.eclipse.gltrace.GLProtoBuf.GLMessage.DataType.Type value = com.android.ide.eclipse.gltrace.GLProtoBuf.GLMessage.DataType.Type.valueOf(rawValue);
-                if (value != null) {
-                  setType(value);
-                }
-                break;
-              }
-              case 16: {
-                setIsArray(input.readBool());
-                break;
-              }
-              case 24: {
-                addIntValue(input.readInt32());
-                break;
-              }
-              case 26: {
-                int length = input.readRawVarint32();
-                int limit = input.pushLimit(length);
-                while (input.getBytesUntilLimit() > 0) {
-                  addIntValue(input.readInt32());
-                }
-                input.popLimit(limit);
-                break;
-              }
-              case 37: {
-                addFloatValue(input.readFloat());
-                break;
-              }
-              case 34: {
-                int length = input.readRawVarint32();
-                int limit = input.pushLimit(length);
-                while (input.getBytesUntilLimit() > 0) {
-                  addFloatValue(input.readFloat());
-                }
-                input.popLimit(limit);
-                break;
-              }
-              case 42: {
-                addCharValue(input.readBytes());
-                break;
-              }
-              case 50: {
-                addRawBytes(input.readBytes());
-                break;
-              }
-              case 56: {
-                addBoolValue(input.readBool());
-                break;
-              }
-              case 58: {
-                int length = input.readRawVarint32();
-                int limit = input.pushLimit(length);
-                while (input.getBytesUntilLimit() > 0) {
-                  addBoolValue(input.readBool());
-                }
-                input.popLimit(limit);
-                break;
-              }
-              case 64: {
-                addInt64Value(input.readInt64());
-                break;
-              }
-              case 66: {
-                int length = input.readRawVarint32();
-                int limit = input.pushLimit(length);
-                while (input.getBytesUntilLimit() > 0) {
-                  addInt64Value(input.readInt64());
-                }
-                input.popLimit(limit);
-                break;
-              }
-            }
-          }
-        }
-        
-        
-        // required .android.gltrace.GLMessage.DataType.Type type = 1 [default = VOID];
-        public boolean hasType() {
-          return result.hasType();
-        }
-        public com.android.ide.eclipse.gltrace.GLProtoBuf.GLMessage.DataType.Type getType() {
-          return result.getType();
-        }
-        public Builder setType(com.android.ide.eclipse.gltrace.GLProtoBuf.GLMessage.DataType.Type value) {
-          if (value == null) {
-            throw new NullPointerException();
-          }
-          result.hasType = true;
-          result.type_ = value;
-          return this;
-        }
-        public Builder clearType() {
-          result.hasType = false;
-          result.type_ = com.android.ide.eclipse.gltrace.GLProtoBuf.GLMessage.DataType.Type.VOID;
-          return this;
-        }
-        
-        // required bool isArray = 2 [default = false];
-        public boolean hasIsArray() {
-          return result.hasIsArray();
-        }
-        public boolean getIsArray() {
-          return result.getIsArray();
-        }
-        public Builder setIsArray(boolean value) {
-          result.hasIsArray = true;
-          result.isArray_ = value;
-          return this;
-        }
-        public Builder clearIsArray() {
-          result.hasIsArray = false;
-          result.isArray_ = false;
-          return this;
-        }
-        
-        // repeated int32 intValue = 3;
-        public java.util.List<java.lang.Integer> getIntValueList() {
-          return java.util.Collections.unmodifiableList(result.intValue_);
-        }
-        public int getIntValueCount() {
-          return result.getIntValueCount();
-        }
-        public int getIntValue(int index) {
-          return result.getIntValue(index);
-        }
-        public Builder setIntValue(int index, int value) {
-          result.intValue_.set(index, value);
-          return this;
-        }
-        public Builder addIntValue(int value) {
-          if (result.intValue_.isEmpty()) {
-            result.intValue_ = new java.util.ArrayList<java.lang.Integer>();
-          }
-          result.intValue_.add(value);
-          return this;
-        }
-        public Builder addAllIntValue(
-            java.lang.Iterable<? extends java.lang.Integer> values) {
-          if (result.intValue_.isEmpty()) {
-            result.intValue_ = new java.util.ArrayList<java.lang.Integer>();
-          }
-          super.addAll(values, result.intValue_);
-          return this;
-        }
-        public Builder clearIntValue() {
-          result.intValue_ = java.util.Collections.emptyList();
-          return this;
-        }
-        
-        // repeated float floatValue = 4;
-        public java.util.List<java.lang.Float> getFloatValueList() {
-          return java.util.Collections.unmodifiableList(result.floatValue_);
-        }
-        public int getFloatValueCount() {
-          return result.getFloatValueCount();
-        }
-        public float getFloatValue(int index) {
-          return result.getFloatValue(index);
-        }
-        public Builder setFloatValue(int index, float value) {
-          result.floatValue_.set(index, value);
-          return this;
-        }
-        public Builder addFloatValue(float value) {
-          if (result.floatValue_.isEmpty()) {
-            result.floatValue_ = new java.util.ArrayList<java.lang.Float>();
-          }
-          result.floatValue_.add(value);
-          return this;
-        }
-        public Builder addAllFloatValue(
-            java.lang.Iterable<? extends java.lang.Float> values) {
-          if (result.floatValue_.isEmpty()) {
-            result.floatValue_ = new java.util.ArrayList<java.lang.Float>();
-          }
-          super.addAll(values, result.floatValue_);
-          return this;
-        }
-        public Builder clearFloatValue() {
-          result.floatValue_ = java.util.Collections.emptyList();
-          return this;
-        }
-        
-        // repeated bytes charValue = 5;
-        public java.util.List<com.google.protobuf.ByteString> getCharValueList() {
-          return java.util.Collections.unmodifiableList(result.charValue_);
-        }
-        public int getCharValueCount() {
-          return result.getCharValueCount();
-        }
-        public com.google.protobuf.ByteString getCharValue(int index) {
-          return result.getCharValue(index);
-        }
-        public Builder setCharValue(int index, com.google.protobuf.ByteString value) {
-          if (value == null) {
-    throw new NullPointerException();
-  }
-  result.charValue_.set(index, value);
-          return this;
-        }
-        public Builder addCharValue(com.google.protobuf.ByteString value) {
-          if (value == null) {
-    throw new NullPointerException();
-  }
-  if (result.charValue_.isEmpty()) {
-            result.charValue_ = new java.util.ArrayList<com.google.protobuf.ByteString>();
-          }
-          result.charValue_.add(value);
-          return this;
-        }
-        public Builder addAllCharValue(
-            java.lang.Iterable<? extends com.google.protobuf.ByteString> values) {
-          if (result.charValue_.isEmpty()) {
-            result.charValue_ = new java.util.ArrayList<com.google.protobuf.ByteString>();
-          }
-          super.addAll(values, result.charValue_);
-          return this;
-        }
-        public Builder clearCharValue() {
-          result.charValue_ = java.util.Collections.emptyList();
-          return this;
-        }
-        
-        // repeated bytes rawBytes = 6;
-        public java.util.List<com.google.protobuf.ByteString> getRawBytesList() {
-          return java.util.Collections.unmodifiableList(result.rawBytes_);
-        }
-        public int getRawBytesCount() {
-          return result.getRawBytesCount();
-        }
-        public com.google.protobuf.ByteString getRawBytes(int index) {
-          return result.getRawBytes(index);
-        }
-        public Builder setRawBytes(int index, com.google.protobuf.ByteString value) {
-          if (value == null) {
-    throw new NullPointerException();
-  }
-  result.rawBytes_.set(index, value);
-          return this;
-        }
-        public Builder addRawBytes(com.google.protobuf.ByteString value) {
-          if (value == null) {
-    throw new NullPointerException();
-  }
-  if (result.rawBytes_.isEmpty()) {
-            result.rawBytes_ = new java.util.ArrayList<com.google.protobuf.ByteString>();
-          }
-          result.rawBytes_.add(value);
-          return this;
-        }
-        public Builder addAllRawBytes(
-            java.lang.Iterable<? extends com.google.protobuf.ByteString> values) {
-          if (result.rawBytes_.isEmpty()) {
-            result.rawBytes_ = new java.util.ArrayList<com.google.protobuf.ByteString>();
-          }
-          super.addAll(values, result.rawBytes_);
-          return this;
-        }
-        public Builder clearRawBytes() {
-          result.rawBytes_ = java.util.Collections.emptyList();
-          return this;
-        }
-        
-        // repeated bool boolValue = 7;
-        public java.util.List<java.lang.Boolean> getBoolValueList() {
-          return java.util.Collections.unmodifiableList(result.boolValue_);
-        }
-        public int getBoolValueCount() {
-          return result.getBoolValueCount();
-        }
-        public boolean getBoolValue(int index) {
-          return result.getBoolValue(index);
-        }
-        public Builder setBoolValue(int index, boolean value) {
-          result.boolValue_.set(index, value);
-          return this;
-        }
-        public Builder addBoolValue(boolean value) {
-          if (result.boolValue_.isEmpty()) {
-            result.boolValue_ = new java.util.ArrayList<java.lang.Boolean>();
-          }
-          result.boolValue_.add(value);
-          return this;
-        }
-        public Builder addAllBoolValue(
-            java.lang.Iterable<? extends java.lang.Boolean> values) {
-          if (result.boolValue_.isEmpty()) {
-            result.boolValue_ = new java.util.ArrayList<java.lang.Boolean>();
-          }
-          super.addAll(values, result.boolValue_);
-          return this;
-        }
-        public Builder clearBoolValue() {
-          result.boolValue_ = java.util.Collections.emptyList();
-          return this;
-        }
-        
-        // repeated int64 int64Value = 8;
-        public java.util.List<java.lang.Long> getInt64ValueList() {
-          return java.util.Collections.unmodifiableList(result.int64Value_);
-        }
-        public int getInt64ValueCount() {
-          return result.getInt64ValueCount();
-        }
-        public long getInt64Value(int index) {
-          return result.getInt64Value(index);
-        }
-        public Builder setInt64Value(int index, long value) {
-          result.int64Value_.set(index, value);
-          return this;
-        }
-        public Builder addInt64Value(long value) {
-          if (result.int64Value_.isEmpty()) {
-            result.int64Value_ = new java.util.ArrayList<java.lang.Long>();
-          }
-          result.int64Value_.add(value);
-          return this;
-        }
-        public Builder addAllInt64Value(
-            java.lang.Iterable<? extends java.lang.Long> values) {
-          if (result.int64Value_.isEmpty()) {
-            result.int64Value_ = new java.util.ArrayList<java.lang.Long>();
-          }
-          super.addAll(values, result.int64Value_);
-          return this;
-        }
-        public Builder clearInt64Value() {
-          result.int64Value_ = java.util.Collections.emptyList();
-          return this;
-        }
-        
-        // @@protoc_insertion_point(builder_scope:android.gltrace.GLMessage.DataType)
-      }
-      
-      static {
-        defaultInstance = new DataType(true);
-        com.android.ide.eclipse.gltrace.GLProtoBuf.internalForceInit();
-        defaultInstance.initFields();
-      }
-      
-      // @@protoc_insertion_point(class_scope:android.gltrace.GLMessage.DataType)
-    }
-    
-    public static final class FrameBuffer extends
-        com.google.protobuf.GeneratedMessageLite {
-      // Use FrameBuffer.newBuilder() to construct.
-      private FrameBuffer() {
-        initFields();
-      }
-      private FrameBuffer(boolean noInit) {}
-      
-      private static final FrameBuffer defaultInstance;
-      public static FrameBuffer getDefaultInstance() {
-        return defaultInstance;
-      }
-      
-      @Override
-    public FrameBuffer getDefaultInstanceForType() {
-        return defaultInstance;
-      }
-      
-      // required int32 width = 1;
-      public static final int WIDTH_FIELD_NUMBER = 1;
-      private boolean hasWidth;
-      private int width_ = 0;
-      public boolean hasWidth() { return hasWidth; }
-      public int getWidth() { return width_; }
-      
-      // required int32 height = 2;
-      public static final int HEIGHT_FIELD_NUMBER = 2;
-      private boolean hasHeight;
-      private int height_ = 0;
-      public boolean hasHeight() { return hasHeight; }
-      public int getHeight() { return height_; }
-      
-      // repeated bytes contents = 3;
-      public static final int CONTENTS_FIELD_NUMBER = 3;
-      private java.util.List<com.google.protobuf.ByteString> contents_ =
-        java.util.Collections.emptyList();
-      public java.util.List<com.google.protobuf.ByteString> getContentsList() {
-        return contents_;
-      }
-      public int getContentsCount() { return contents_.size(); }
-      public com.google.protobuf.ByteString getContents(int index) {
-        return contents_.get(index);
-      }
-      
-      private void initFields() {
-      }
-      @Override
-    public final boolean isInitialized() {
-        if (!hasWidth) return false;
-        if (!hasHeight) return false;
-        return true;
-      }
-      
-      @Override
-    public void writeTo(com.google.protobuf.CodedOutputStream output)
-                          throws java.io.IOException {
-        getSerializedSize();
-        if (hasWidth()) {
-          output.writeInt32(1, getWidth());
-        }
-        if (hasHeight()) {
-          output.writeInt32(2, getHeight());
-        }
-        for (com.google.protobuf.ByteString element : getContentsList()) {
-          output.writeBytes(3, element);
-        }
-      }
-      
-      private int memoizedSerializedSize = -1;
-      @Override
-    public int getSerializedSize() {
-        int size = memoizedSerializedSize;
-        if (size != -1) return size;
-      
-        size = 0;
-        if (hasWidth()) {
-          size += com.google.protobuf.CodedOutputStream
-            .computeInt32Size(1, getWidth());
-        }
-        if (hasHeight()) {
-          size += com.google.protobuf.CodedOutputStream
-            .computeInt32Size(2, getHeight());
-        }
-        {
-          int dataSize = 0;
-          for (com.google.protobuf.ByteString element : getContentsList()) {
-            dataSize += com.google.protobuf.CodedOutputStream
-              .computeBytesSizeNoTag(element);
-          }
-          size += dataSize;
-          size += 1 * getContentsList().size();
-        }
-        memoizedSerializedSize = size;
-        return size;
-      }
-      
-      public static com.android.ide.eclipse.gltrace.GLProtoBuf.GLMessage.FrameBuffer parseFrom(
-          com.google.protobuf.ByteString data)
-          throws com.google.protobuf.InvalidProtocolBufferException {
-        return newBuilder().mergeFrom(data).buildParsed();
-      }
-      public static com.android.ide.eclipse.gltrace.GLProtoBuf.GLMessage.FrameBuffer parseFrom(
-          com.google.protobuf.ByteString data,
-          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-          throws com.google.protobuf.InvalidProtocolBufferException {
-        return newBuilder().mergeFrom(data, extensionRegistry)
-                 .buildParsed();
-      }
-      public static com.android.ide.eclipse.gltrace.GLProtoBuf.GLMessage.FrameBuffer parseFrom(byte[] data)
-          throws com.google.protobuf.InvalidProtocolBufferException {
-        return newBuilder().mergeFrom(data).buildParsed();
-      }
-      public static com.android.ide.eclipse.gltrace.GLProtoBuf.GLMessage.FrameBuffer parseFrom(
-          byte[] data,
-          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-          throws com.google.protobuf.InvalidProtocolBufferException {
-        return newBuilder().mergeFrom(data, extensionRegistry)
-                 .buildParsed();
-      }
-      public static com.android.ide.eclipse.gltrace.GLProtoBuf.GLMessage.FrameBuffer parseFrom(java.io.InputStream input)
-          throws java.io.IOException {
-        return newBuilder().mergeFrom(input).buildParsed();
-      }
-      public static com.android.ide.eclipse.gltrace.GLProtoBuf.GLMessage.FrameBuffer parseFrom(
-          java.io.InputStream input,
-          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-          throws java.io.IOException {
-        return newBuilder().mergeFrom(input, extensionRegistry)
-                 .buildParsed();
-      }
-      public static com.android.ide.eclipse.gltrace.GLProtoBuf.GLMessage.FrameBuffer parseDelimitedFrom(java.io.InputStream input)
-          throws java.io.IOException {
-        Builder builder = newBuilder();
-        if (builder.mergeDelimitedFrom(input)) {
-          return builder.buildParsed();
-        } else {
-          return null;
-        }
-      }
-      public static com.android.ide.eclipse.gltrace.GLProtoBuf.GLMessage.FrameBuffer parseDelimitedFrom(
-          java.io.InputStream input,
-          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-          throws java.io.IOException {
-        Builder builder = newBuilder();
-        if (builder.mergeDelimitedFrom(input, extensionRegistry)) {
-          return builder.buildParsed();
-        } else {
-          return null;
-        }
-      }
-      public static com.android.ide.eclipse.gltrace.GLProtoBuf.GLMessage.FrameBuffer parseFrom(
-          com.google.protobuf.CodedInputStream input)
-          throws java.io.IOException {
-        return newBuilder().mergeFrom(input).buildParsed();
-      }
-      public static com.android.ide.eclipse.gltrace.GLProtoBuf.GLMessage.FrameBuffer parseFrom(
-          com.google.protobuf.CodedInputStream input,
-          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-          throws java.io.IOException {
-        return newBuilder().mergeFrom(input, extensionRegistry)
-                 .buildParsed();
-      }
-      
-      public static Builder newBuilder() { return Builder.create(); }
-      @Override
-    public Builder newBuilderForType() { return newBuilder(); }
-      public static Builder newBuilder(com.android.ide.eclipse.gltrace.GLProtoBuf.GLMessage.FrameBuffer prototype) {
-        return newBuilder().mergeFrom(prototype);
-      }
-      @Override
-    public Builder toBuilder() { return newBuilder(this); }
-      
-      public static final class Builder extends
-          com.google.protobuf.GeneratedMessageLite.Builder<
-            com.android.ide.eclipse.gltrace.GLProtoBuf.GLMessage.FrameBuffer, Builder> {
-        private com.android.ide.eclipse.gltrace.GLProtoBuf.GLMessage.FrameBuffer result;
-        
-        // Construct using com.android.ide.eclipse.gltrace.GLProtoBuf.GLMessage.FrameBuffer.newBuilder()
-        private Builder() {}
-        
-        private static Builder create() {
-          Builder builder = new Builder();
-          builder.result = new com.android.ide.eclipse.gltrace.GLProtoBuf.GLMessage.FrameBuffer();
-          return builder;
-        }
-        
-        @Override
-        protected com.android.ide.eclipse.gltrace.GLProtoBuf.GLMessage.FrameBuffer internalGetResult() {
-          return result;
-        }
-        
-        @Override
-        public Builder clear() {
-          if (result == null) {
-            throw new IllegalStateException(
-              "Cannot call clear() after build().");
-          }
-          result = new com.android.ide.eclipse.gltrace.GLProtoBuf.GLMessage.FrameBuffer();
-          return this;
-        }
-        
-        @Override
-        public Builder clone() {
-          return create().mergeFrom(result);
-        }
-        
-        @Override
-        public com.android.ide.eclipse.gltrace.GLProtoBuf.GLMessage.FrameBuffer getDefaultInstanceForType() {
-          return com.android.ide.eclipse.gltrace.GLProtoBuf.GLMessage.FrameBuffer.getDefaultInstance();
-        }
-        
-        @Override
-        public boolean isInitialized() {
-          return result.isInitialized();
-        }
-        @Override
-        public com.android.ide.eclipse.gltrace.GLProtoBuf.GLMessage.FrameBuffer build() {
-          if (result != null && !isInitialized()) {
-            throw newUninitializedMessageException(result);
-          }
-          return buildPartial();
-        }
-        
-        private com.android.ide.eclipse.gltrace.GLProtoBuf.GLMessage.FrameBuffer buildParsed()
-            throws com.google.protobuf.InvalidProtocolBufferException {
-          if (!isInitialized()) {
-            throw newUninitializedMessageException(
-              result).asInvalidProtocolBufferException();
-          }
-          return buildPartial();
-        }
-        
-        @Override
-        public com.android.ide.eclipse.gltrace.GLProtoBuf.GLMessage.FrameBuffer buildPartial() {
-          if (result == null) {
-            throw new IllegalStateException(
-              "build() has already been called on this Builder.");
-          }
-          if (result.contents_ != java.util.Collections.EMPTY_LIST) {
-            result.contents_ =
-              java.util.Collections.unmodifiableList(result.contents_);
-          }
-          com.android.ide.eclipse.gltrace.GLProtoBuf.GLMessage.FrameBuffer returnMe = result;
-          result = null;
-          return returnMe;
-        }
-        
-        @Override
-        public Builder mergeFrom(com.android.ide.eclipse.gltrace.GLProtoBuf.GLMessage.FrameBuffer other) {
-          if (other == com.android.ide.eclipse.gltrace.GLProtoBuf.GLMessage.FrameBuffer.getDefaultInstance()) return this;
-          if (other.hasWidth()) {
-            setWidth(other.getWidth());
-          }
-          if (other.hasHeight()) {
-            setHeight(other.getHeight());
-          }
-          if (!other.contents_.isEmpty()) {
-            if (result.contents_.isEmpty()) {
-              result.contents_ = new java.util.ArrayList<com.google.protobuf.ByteString>();
-            }
-            result.contents_.addAll(other.contents_);
-          }
-          return this;
-        }
-        
-        @Override
-        public Builder mergeFrom(
-            com.google.protobuf.CodedInputStream input,
-            com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-            throws java.io.IOException {
-          while (true) {
-            int tag = input.readTag();
-            switch (tag) {
-              case 0:
-                return this;
-              default: {
-                if (!parseUnknownField(input, extensionRegistry, tag)) {
-                  return this;
-                }
-                break;
-              }
-              case 8: {
-                setWidth(input.readInt32());
-                break;
-              }
-              case 16: {
-                setHeight(input.readInt32());
-                break;
-              }
-              case 26: {
-                addContents(input.readBytes());
-                break;
-              }
-            }
-          }
-        }
-        
-        
-        // required int32 width = 1;
-        public boolean hasWidth() {
-          return result.hasWidth();
-        }
-        public int getWidth() {
-          return result.getWidth();
-        }
-        public Builder setWidth(int value) {
-          result.hasWidth = true;
-          result.width_ = value;
-          return this;
-        }
-        public Builder clearWidth() {
-          result.hasWidth = false;
-          result.width_ = 0;
-          return this;
-        }
-        
-        // required int32 height = 2;
-        public boolean hasHeight() {
-          return result.hasHeight();
-        }
-        public int getHeight() {
-          return result.getHeight();
-        }
-        public Builder setHeight(int value) {
-          result.hasHeight = true;
-          result.height_ = value;
-          return this;
-        }
-        public Builder clearHeight() {
-          result.hasHeight = false;
-          result.height_ = 0;
-          return this;
-        }
-        
-        // repeated bytes contents = 3;
-        public java.util.List<com.google.protobuf.ByteString> getContentsList() {
-          return java.util.Collections.unmodifiableList(result.contents_);
-        }
-        public int getContentsCount() {
-          return result.getContentsCount();
-        }
-        public com.google.protobuf.ByteString getContents(int index) {
-          return result.getContents(index);
-        }
-        public Builder setContents(int index, com.google.protobuf.ByteString value) {
-          if (value == null) {
-    throw new NullPointerException();
-  }
-  result.contents_.set(index, value);
-          return this;
-        }
-        public Builder addContents(com.google.protobuf.ByteString value) {
-          if (value == null) {
-    throw new NullPointerException();
-  }
-  if (result.contents_.isEmpty()) {
-            result.contents_ = new java.util.ArrayList<com.google.protobuf.ByteString>();
-          }
-          result.contents_.add(value);
-          return this;
-        }
-        public Builder addAllContents(
-            java.lang.Iterable<? extends com.google.protobuf.ByteString> values) {
-          if (result.contents_.isEmpty()) {
-            result.contents_ = new java.util.ArrayList<com.google.protobuf.ByteString>();
-          }
-          super.addAll(values, result.contents_);
-          return this;
-        }
-        public Builder clearContents() {
-          result.contents_ = java.util.Collections.emptyList();
-          return this;
-        }
-        
-        // @@protoc_insertion_point(builder_scope:android.gltrace.GLMessage.FrameBuffer)
-      }
-      
-      static {
-        defaultInstance = new FrameBuffer(true);
-        com.android.ide.eclipse.gltrace.GLProtoBuf.internalForceInit();
-        defaultInstance.initFields();
-      }
-      
-      // @@protoc_insertion_point(class_scope:android.gltrace.GLMessage.FrameBuffer)
-    }
-    
-    // required int32 context_id = 1;
-    public static final int CONTEXT_ID_FIELD_NUMBER = 1;
-    private boolean hasContextId;
-    private int contextId_ = 0;
-    public boolean hasContextId() { return hasContextId; }
-    public int getContextId() { return contextId_; }
-    
-    // required int64 start_time = 2;
-    public static final int START_TIME_FIELD_NUMBER = 2;
-    private boolean hasStartTime;
-    private long startTime_ = 0L;
-    public boolean hasStartTime() { return hasStartTime; }
-    public long getStartTime() { return startTime_; }
-    
-    // required int32 duration = 3;
-    public static final int DURATION_FIELD_NUMBER = 3;
-    private boolean hasDuration;
-    private int duration_ = 0;
-    public boolean hasDuration() { return hasDuration; }
-    public int getDuration() { return duration_; }
-    
-    // required .android.gltrace.GLMessage.Function function = 4 [default = invalid];
-    public static final int FUNCTION_FIELD_NUMBER = 4;
-    private boolean hasFunction;
-    private com.android.ide.eclipse.gltrace.GLProtoBuf.GLMessage.Function function_;
-    public boolean hasFunction() { return hasFunction; }
-    public com.android.ide.eclipse.gltrace.GLProtoBuf.GLMessage.Function getFunction() { return function_; }
-    
-    // repeated .android.gltrace.GLMessage.DataType args = 5;
-    public static final int ARGS_FIELD_NUMBER = 5;
-    private java.util.List<com.android.ide.eclipse.gltrace.GLProtoBuf.GLMessage.DataType> args_ =
-      java.util.Collections.emptyList();
-    public java.util.List<com.android.ide.eclipse.gltrace.GLProtoBuf.GLMessage.DataType> getArgsList() {
-      return args_;
-    }
-    public int getArgsCount() { return args_.size(); }
-    public com.android.ide.eclipse.gltrace.GLProtoBuf.GLMessage.DataType getArgs(int index) {
-      return args_.get(index);
-    }
-    
-    // optional .android.gltrace.GLMessage.DataType returnValue = 6;
-    public static final int RETURNVALUE_FIELD_NUMBER = 6;
-    private boolean hasReturnValue;
-    private com.android.ide.eclipse.gltrace.GLProtoBuf.GLMessage.DataType returnValue_;
-    public boolean hasReturnValue() { return hasReturnValue; }
-    public com.android.ide.eclipse.gltrace.GLProtoBuf.GLMessage.DataType getReturnValue() { return returnValue_; }
-    
-    // optional .android.gltrace.GLMessage.FrameBuffer fb = 7;
-    public static final int FB_FIELD_NUMBER = 7;
-    private boolean hasFb;
-    private com.android.ide.eclipse.gltrace.GLProtoBuf.GLMessage.FrameBuffer fb_;
-    public boolean hasFb() { return hasFb; }
-    public com.android.ide.eclipse.gltrace.GLProtoBuf.GLMessage.FrameBuffer getFb() { return fb_; }
-    
-    // optional int32 threadtime = 8;
-    public static final int THREADTIME_FIELD_NUMBER = 8;
-    private boolean hasThreadtime;
-    private int threadtime_ = 0;
-    public boolean hasThreadtime() { return hasThreadtime; }
-    public int getThreadtime() { return threadtime_; }
-    
-    private void initFields() {
-      function_ = com.android.ide.eclipse.gltrace.GLProtoBuf.GLMessage.Function.invalid;
-      returnValue_ = com.android.ide.eclipse.gltrace.GLProtoBuf.GLMessage.DataType.getDefaultInstance();
-      fb_ = com.android.ide.eclipse.gltrace.GLProtoBuf.GLMessage.FrameBuffer.getDefaultInstance();
-    }
-    @Override
-    public final boolean isInitialized() {
-      if (!hasContextId) return false;
-      if (!hasStartTime) return false;
-      if (!hasDuration) return false;
-      if (!hasFunction) return false;
-      for (com.android.ide.eclipse.gltrace.GLProtoBuf.GLMessage.DataType element : getArgsList()) {
-        if (!element.isInitialized()) return false;
-      }
-      if (hasReturnValue()) {
-        if (!getReturnValue().isInitialized()) return false;
-      }
-      if (hasFb()) {
-        if (!getFb().isInitialized()) return false;
-      }
-      return true;
-    }
-    
-    @Override
-    public void writeTo(com.google.protobuf.CodedOutputStream output)
-                        throws java.io.IOException {
-      getSerializedSize();
-      if (hasContextId()) {
-        output.writeInt32(1, getContextId());
-      }
-      if (hasStartTime()) {
-        output.writeInt64(2, getStartTime());
-      }
-      if (hasDuration()) {
-        output.writeInt32(3, getDuration());
-      }
-      if (hasFunction()) {
-        output.writeEnum(4, getFunction().getNumber());
-      }
-      for (com.android.ide.eclipse.gltrace.GLProtoBuf.GLMessage.DataType element : getArgsList()) {
-        output.writeMessage(5, element);
-      }
-      if (hasReturnValue()) {
-        output.writeMessage(6, getReturnValue());
-      }
-      if (hasFb()) {
-        output.writeMessage(7, getFb());
-      }
-      if (hasThreadtime()) {
-        output.writeInt32(8, getThreadtime());
-      }
-    }
-    
-    private int memoizedSerializedSize = -1;
-    @Override
-    public int getSerializedSize() {
-      int size = memoizedSerializedSize;
-      if (size != -1) return size;
-    
-      size = 0;
-      if (hasContextId()) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeInt32Size(1, getContextId());
-      }
-      if (hasStartTime()) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeInt64Size(2, getStartTime());
-      }
-      if (hasDuration()) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeInt32Size(3, getDuration());
-      }
-      if (hasFunction()) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeEnumSize(4, getFunction().getNumber());
-      }
-      for (com.android.ide.eclipse.gltrace.GLProtoBuf.GLMessage.DataType element : getArgsList()) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeMessageSize(5, element);
-      }
-      if (hasReturnValue()) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeMessageSize(6, getReturnValue());
-      }
-      if (hasFb()) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeMessageSize(7, getFb());
-      }
-      if (hasThreadtime()) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeInt32Size(8, getThreadtime());
-      }
-      memoizedSerializedSize = size;
-      return size;
-    }
-    
-    public static com.android.ide.eclipse.gltrace.GLProtoBuf.GLMessage parseFrom(
-        com.google.protobuf.ByteString data)
-        throws com.google.protobuf.InvalidProtocolBufferException {
-      return newBuilder().mergeFrom(data).buildParsed();
-    }
-    public static com.android.ide.eclipse.gltrace.GLProtoBuf.GLMessage parseFrom(
-        com.google.protobuf.ByteString data,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-        throws com.google.protobuf.InvalidProtocolBufferException {
-      return newBuilder().mergeFrom(data, extensionRegistry)
-               .buildParsed();
-    }
-    public static com.android.ide.eclipse.gltrace.GLProtoBuf.GLMessage parseFrom(byte[] data)
-        throws com.google.protobuf.InvalidProtocolBufferException {
-      return newBuilder().mergeFrom(data).buildParsed();
-    }
-    public static com.android.ide.eclipse.gltrace.GLProtoBuf.GLMessage parseFrom(
-        byte[] data,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-        throws com.google.protobuf.InvalidProtocolBufferException {
-      return newBuilder().mergeFrom(data, extensionRegistry)
-               .buildParsed();
-    }
-    public static com.android.ide.eclipse.gltrace.GLProtoBuf.GLMessage parseFrom(java.io.InputStream input)
-        throws java.io.IOException {
-      return newBuilder().mergeFrom(input).buildParsed();
-    }
-    public static com.android.ide.eclipse.gltrace.GLProtoBuf.GLMessage parseFrom(
-        java.io.InputStream input,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-        throws java.io.IOException {
-      return newBuilder().mergeFrom(input, extensionRegistry)
-               .buildParsed();
-    }
-    public static com.android.ide.eclipse.gltrace.GLProtoBuf.GLMessage parseDelimitedFrom(java.io.InputStream input)
-        throws java.io.IOException {
-      Builder builder = newBuilder();
-      if (builder.mergeDelimitedFrom(input)) {
-        return builder.buildParsed();
-      } else {
-        return null;
-      }
-    }
-    public static com.android.ide.eclipse.gltrace.GLProtoBuf.GLMessage parseDelimitedFrom(
-        java.io.InputStream input,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-        throws java.io.IOException {
-      Builder builder = newBuilder();
-      if (builder.mergeDelimitedFrom(input, extensionRegistry)) {
-        return builder.buildParsed();
-      } else {
-        return null;
-      }
-    }
-    public static com.android.ide.eclipse.gltrace.GLProtoBuf.GLMessage parseFrom(
-        com.google.protobuf.CodedInputStream input)
-        throws java.io.IOException {
-      return newBuilder().mergeFrom(input).buildParsed();
-    }
-    public static com.android.ide.eclipse.gltrace.GLProtoBuf.GLMessage parseFrom(
-        com.google.protobuf.CodedInputStream input,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-        throws java.io.IOException {
-      return newBuilder().mergeFrom(input, extensionRegistry)
-               .buildParsed();
-    }
-    
-    public static Builder newBuilder() { return Builder.create(); }
-    @Override
-    public Builder newBuilderForType() { return newBuilder(); }
-    public static Builder newBuilder(com.android.ide.eclipse.gltrace.GLProtoBuf.GLMessage prototype) {
-      return newBuilder().mergeFrom(prototype);
-    }
-    @Override
-    public Builder toBuilder() { return newBuilder(this); }
-    
-    public static final class Builder extends
-        com.google.protobuf.GeneratedMessageLite.Builder<
-          com.android.ide.eclipse.gltrace.GLProtoBuf.GLMessage, Builder> {
-      private com.android.ide.eclipse.gltrace.GLProtoBuf.GLMessage result;
-      
-      // Construct using com.android.ide.eclipse.gltrace.GLProtoBuf.GLMessage.newBuilder()
-      private Builder() {}
-      
-      private static Builder create() {
-        Builder builder = new Builder();
-        builder.result = new com.android.ide.eclipse.gltrace.GLProtoBuf.GLMessage();
-        return builder;
-      }
-      
-      @Override
-    protected com.android.ide.eclipse.gltrace.GLProtoBuf.GLMessage internalGetResult() {
-        return result;
-      }
-      
-      @Override
-    public Builder clear() {
-        if (result == null) {
-          throw new IllegalStateException(
-            "Cannot call clear() after build().");
-        }
-        result = new com.android.ide.eclipse.gltrace.GLProtoBuf.GLMessage();
-        return this;
-      }
-      
-      @Override
-    public Builder clone() {
-        return create().mergeFrom(result);
-      }
-      
-      @Override
-    public com.android.ide.eclipse.gltrace.GLProtoBuf.GLMessage getDefaultInstanceForType() {
-        return com.android.ide.eclipse.gltrace.GLProtoBuf.GLMessage.getDefaultInstance();
-      }
-      
-      @Override
-    public boolean isInitialized() {
-        return result.isInitialized();
-      }
-      @Override
-    public com.android.ide.eclipse.gltrace.GLProtoBuf.GLMessage build() {
-        if (result != null && !isInitialized()) {
-          throw newUninitializedMessageException(result);
-        }
-        return buildPartial();
-      }
-      
-      private com.android.ide.eclipse.gltrace.GLProtoBuf.GLMessage buildParsed()
-          throws com.google.protobuf.InvalidProtocolBufferException {
-        if (!isInitialized()) {
-          throw newUninitializedMessageException(
-            result).asInvalidProtocolBufferException();
-        }
-        return buildPartial();
-      }
-      
-      @Override
-    public com.android.ide.eclipse.gltrace.GLProtoBuf.GLMessage buildPartial() {
-        if (result == null) {
-          throw new IllegalStateException(
-            "build() has already been called on this Builder.");
-        }
-        if (result.args_ != java.util.Collections.EMPTY_LIST) {
-          result.args_ =
-            java.util.Collections.unmodifiableList(result.args_);
-        }
-        com.android.ide.eclipse.gltrace.GLProtoBuf.GLMessage returnMe = result;
-        result = null;
-        return returnMe;
-      }
-      
-      @Override
-    public Builder mergeFrom(com.android.ide.eclipse.gltrace.GLProtoBuf.GLMessage other) {
-        if (other == com.android.ide.eclipse.gltrace.GLProtoBuf.GLMessage.getDefaultInstance()) return this;
-        if (other.hasContextId()) {
-          setContextId(other.getContextId());
-        }
-        if (other.hasStartTime()) {
-          setStartTime(other.getStartTime());
-        }
-        if (other.hasDuration()) {
-          setDuration(other.getDuration());
-        }
-        if (other.hasFunction()) {
-          setFunction(other.getFunction());
-        }
-        if (!other.args_.isEmpty()) {
-          if (result.args_.isEmpty()) {
-            result.args_ = new java.util.ArrayList<com.android.ide.eclipse.gltrace.GLProtoBuf.GLMessage.DataType>();
-          }
-          result.args_.addAll(other.args_);
-        }
-        if (other.hasReturnValue()) {
-          mergeReturnValue(other.getReturnValue());
-        }
-        if (other.hasFb()) {
-          mergeFb(other.getFb());
-        }
-        if (other.hasThreadtime()) {
-          setThreadtime(other.getThreadtime());
-        }
-        return this;
-      }
-      
-      @Override
-    public Builder mergeFrom(
-          com.google.protobuf.CodedInputStream input,
-          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-          throws java.io.IOException {
-        while (true) {
-          int tag = input.readTag();
-          switch (tag) {
-            case 0:
-              return this;
-            default: {
-              if (!parseUnknownField(input, extensionRegistry, tag)) {
-                return this;
-              }
-              break;
-            }
-            case 8: {
-              setContextId(input.readInt32());
-              break;
-            }
-            case 16: {
-              setStartTime(input.readInt64());
-              break;
-            }
-            case 24: {
-              setDuration(input.readInt32());
-              break;
-            }
-            case 32: {
-              int rawValue = input.readEnum();
-              com.android.ide.eclipse.gltrace.GLProtoBuf.GLMessage.Function value = com.android.ide.eclipse.gltrace.GLProtoBuf.GLMessage.Function.valueOf(rawValue);
-              if (value != null) {
-                setFunction(value);
-              }
-              break;
-            }
-            case 42: {
-              com.android.ide.eclipse.gltrace.GLProtoBuf.GLMessage.DataType.Builder subBuilder = com.android.ide.eclipse.gltrace.GLProtoBuf.GLMessage.DataType.newBuilder();
-              input.readMessage(subBuilder, extensionRegistry);
-              addArgs(subBuilder.buildPartial());
-              break;
-            }
-            case 50: {
-              com.android.ide.eclipse.gltrace.GLProtoBuf.GLMessage.DataType.Builder subBuilder = com.android.ide.eclipse.gltrace.GLProtoBuf.GLMessage.DataType.newBuilder();
-              if (hasReturnValue()) {
-                subBuilder.mergeFrom(getReturnValue());
-              }
-              input.readMessage(subBuilder, extensionRegistry);
-              setReturnValue(subBuilder.buildPartial());
-              break;
-            }
-            case 58: {
-              com.android.ide.eclipse.gltrace.GLProtoBuf.GLMessage.FrameBuffer.Builder subBuilder = com.android.ide.eclipse.gltrace.GLProtoBuf.GLMessage.FrameBuffer.newBuilder();
-              if (hasFb()) {
-                subBuilder.mergeFrom(getFb());
-              }
-              input.readMessage(subBuilder, extensionRegistry);
-              setFb(subBuilder.buildPartial());
-              break;
-            }
-            case 64: {
-              setThreadtime(input.readInt32());
-              break;
-            }
-          }
-        }
-      }
-      
-      
-      // required int32 context_id = 1;
-      public boolean hasContextId() {
-        return result.hasContextId();
-      }
-      public int getContextId() {
-        return result.getContextId();
-      }
-      public Builder setContextId(int value) {
-        result.hasContextId = true;
-        result.contextId_ = value;
-        return this;
-      }
-      public Builder clearContextId() {
-        result.hasContextId = false;
-        result.contextId_ = 0;
-        return this;
-      }
-      
-      // required int64 start_time = 2;
-      public boolean hasStartTime() {
-        return result.hasStartTime();
-      }
-      public long getStartTime() {
-        return result.getStartTime();
-      }
-      public Builder setStartTime(long value) {
-        result.hasStartTime = true;
-        result.startTime_ = value;
-        return this;
-      }
-      public Builder clearStartTime() {
-        result.hasStartTime = false;
-        result.startTime_ = 0L;
-        return this;
-      }
-      
-      // required int32 duration = 3;
-      public boolean hasDuration() {
-        return result.hasDuration();
-      }
-      public int getDuration() {
-        return result.getDuration();
-      }
-      public Builder setDuration(int value) {
-        result.hasDuration = true;
-        result.duration_ = value;
-        return this;
-      }
-      public Builder clearDuration() {
-        result.hasDuration = false;
-        result.duration_ = 0;
-        return this;
-      }
-      
-      // required .android.gltrace.GLMessage.Function function = 4 [default = invalid];
-      public boolean hasFunction() {
-        return result.hasFunction();
-      }
-      public com.android.ide.eclipse.gltrace.GLProtoBuf.GLMessage.Function getFunction() {
-        return result.getFunction();
-      }
-      public Builder setFunction(com.android.ide.eclipse.gltrace.GLProtoBuf.GLMessage.Function value) {
-        if (value == null) {
-          throw new NullPointerException();
-        }
-        result.hasFunction = true;
-        result.function_ = value;
-        return this;
-      }
-      public Builder clearFunction() {
-        result.hasFunction = false;
-        result.function_ = com.android.ide.eclipse.gltrace.GLProtoBuf.GLMessage.Function.invalid;
-        return this;
-      }
-      
-      // repeated .android.gltrace.GLMessage.DataType args = 5;
-      public java.util.List<com.android.ide.eclipse.gltrace.GLProtoBuf.GLMessage.DataType> getArgsList() {
-        return java.util.Collections.unmodifiableList(result.args_);
-      }
-      public int getArgsCount() {
-        return result.getArgsCount();
-      }
-      public com.android.ide.eclipse.gltrace.GLProtoBuf.GLMessage.DataType getArgs(int index) {
-        return result.getArgs(index);
-      }
-      public Builder setArgs(int index, com.android.ide.eclipse.gltrace.GLProtoBuf.GLMessage.DataType value) {
-        if (value == null) {
-          throw new NullPointerException();
-        }
-        result.args_.set(index, value);
-        return this;
-      }
-      public Builder setArgs(int index, com.android.ide.eclipse.gltrace.GLProtoBuf.GLMessage.DataType.Builder builderForValue) {
-        result.args_.set(index, builderForValue.build());
-        return this;
-      }
-      public Builder addArgs(com.android.ide.eclipse.gltrace.GLProtoBuf.GLMessage.DataType value) {
-        if (value == null) {
-          throw new NullPointerException();
-        }
-        if (result.args_.isEmpty()) {
-          result.args_ = new java.util.ArrayList<com.android.ide.eclipse.gltrace.GLProtoBuf.GLMessage.DataType>();
-        }
-        result.args_.add(value);
-        return this;
-      }
-      public Builder addArgs(com.android.ide.eclipse.gltrace.GLProtoBuf.GLMessage.DataType.Builder builderForValue) {
-        if (result.args_.isEmpty()) {
-          result.args_ = new java.util.ArrayList<com.android.ide.eclipse.gltrace.GLProtoBuf.GLMessage.DataType>();
-        }
-        result.args_.add(builderForValue.build());
-        return this;
-      }
-      public Builder addAllArgs(
-          java.lang.Iterable<? extends com.android.ide.eclipse.gltrace.GLProtoBuf.GLMessage.DataType> values) {
-        if (result.args_.isEmpty()) {
-          result.args_ = new java.util.ArrayList<com.android.ide.eclipse.gltrace.GLProtoBuf.GLMessage.DataType>();
-        }
-        super.addAll(values, result.args_);
-        return this;
-      }
-      public Builder clearArgs() {
-        result.args_ = java.util.Collections.emptyList();
-        return this;
-      }
-      
-      // optional .android.gltrace.GLMessage.DataType returnValue = 6;
-      public boolean hasReturnValue() {
-        return result.hasReturnValue();
-      }
-      public com.android.ide.eclipse.gltrace.GLProtoBuf.GLMessage.DataType getReturnValue() {
-        return result.getReturnValue();
-      }
-      public Builder setReturnValue(com.android.ide.eclipse.gltrace.GLProtoBuf.GLMessage.DataType value) {
-        if (value == null) {
-          throw new NullPointerException();
-        }
-        result.hasReturnValue = true;
-        result.returnValue_ = value;
-        return this;
-      }
-      public Builder setReturnValue(com.android.ide.eclipse.gltrace.GLProtoBuf.GLMessage.DataType.Builder builderForValue) {
-        result.hasReturnValue = true;
-        result.returnValue_ = builderForValue.build();
-        return this;
-      }
-      public Builder mergeReturnValue(com.android.ide.eclipse.gltrace.GLProtoBuf.GLMessage.DataType value) {
-        if (result.hasReturnValue() &&
-            result.returnValue_ != com.android.ide.eclipse.gltrace.GLProtoBuf.GLMessage.DataType.getDefaultInstance()) {
-          result.returnValue_ =
-            com.android.ide.eclipse.gltrace.GLProtoBuf.GLMessage.DataType.newBuilder(result.returnValue_).mergeFrom(value).buildPartial();
-        } else {
-          result.returnValue_ = value;
-        }
-        result.hasReturnValue = true;
-        return this;
-      }
-      public Builder clearReturnValue() {
-        result.hasReturnValue = false;
-        result.returnValue_ = com.android.ide.eclipse.gltrace.GLProtoBuf.GLMessage.DataType.getDefaultInstance();
-        return this;
-      }
-      
-      // optional .android.gltrace.GLMessage.FrameBuffer fb = 7;
-      public boolean hasFb() {
-        return result.hasFb();
-      }
-      public com.android.ide.eclipse.gltrace.GLProtoBuf.GLMessage.FrameBuffer getFb() {
-        return result.getFb();
-      }
-      public Builder setFb(com.android.ide.eclipse.gltrace.GLProtoBuf.GLMessage.FrameBuffer value) {
-        if (value == null) {
-          throw new NullPointerException();
-        }
-        result.hasFb = true;
-        result.fb_ = value;
-        return this;
-      }
-      public Builder setFb(com.android.ide.eclipse.gltrace.GLProtoBuf.GLMessage.FrameBuffer.Builder builderForValue) {
-        result.hasFb = true;
-        result.fb_ = builderForValue.build();
-        return this;
-      }
-      public Builder mergeFb(com.android.ide.eclipse.gltrace.GLProtoBuf.GLMessage.FrameBuffer value) {
-        if (result.hasFb() &&
-            result.fb_ != com.android.ide.eclipse.gltrace.GLProtoBuf.GLMessage.FrameBuffer.getDefaultInstance()) {
-          result.fb_ =
-            com.android.ide.eclipse.gltrace.GLProtoBuf.GLMessage.FrameBuffer.newBuilder(result.fb_).mergeFrom(value).buildPartial();
-        } else {
-          result.fb_ = value;
-        }
-        result.hasFb = true;
-        return this;
-      }
-      public Builder clearFb() {
-        result.hasFb = false;
-        result.fb_ = com.android.ide.eclipse.gltrace.GLProtoBuf.GLMessage.FrameBuffer.getDefaultInstance();
-        return this;
-      }
-      
-      // optional int32 threadtime = 8;
-      public boolean hasThreadtime() {
-        return result.hasThreadtime();
-      }
-      public int getThreadtime() {
-        return result.getThreadtime();
-      }
-      public Builder setThreadtime(int value) {
-        result.hasThreadtime = true;
-        result.threadtime_ = value;
-        return this;
-      }
-      public Builder clearThreadtime() {
-        result.hasThreadtime = false;
-        result.threadtime_ = 0;
-        return this;
-      }
-      
-      // @@protoc_insertion_point(builder_scope:android.gltrace.GLMessage)
-    }
-    
-    static {
-      defaultInstance = new GLMessage(true);
-      com.android.ide.eclipse.gltrace.GLProtoBuf.internalForceInit();
-      defaultInstance.initFields();
-    }
-    
-    // @@protoc_insertion_point(class_scope:android.gltrace.GLMessage)
-  }
-  
-  
-  static {
-  }
-  
-  public static void internalForceInit() {}
-  
-  // @@protoc_insertion_point(outer_class_scope)
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/GLTraceCollectorDialog.java b/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/GLTraceCollectorDialog.java
deleted file mode 100644
index 56dc8e9..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/GLTraceCollectorDialog.java
+++ /dev/null
@@ -1,228 +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.eclipse.gltrace;
-
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.jface.dialogs.TitleAreaDialog;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Group;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.ProgressBar;
-import org.eclipse.swt.widgets.Shell;
-
-import java.io.IOException;
-import java.text.DecimalFormat;
-
-/** Dialog displayed while the trace is being streamed from device to host. */
-public class GLTraceCollectorDialog extends TitleAreaDialog {
-    private static final String TITLE = "OpenGL ES Trace";
-    private static final String DEFAULT_MESSAGE = "Trace collection in progress.";
-    private static final DecimalFormat SIZE_FORMATTER = new DecimalFormat("#.##"); //$NON-NLS-1$
-
-    private TraceOptions mTraceOptions;
-    private final TraceFileWriter mTraceFileWriter;
-    private final TraceCommandWriter mTraceCommandWriter;
-
-    private Label mFramesCollectedLabel;
-    private Label mTraceFileSizeLabel;
-    private StatusRefreshTask mRefreshTask;
-
-    protected GLTraceCollectorDialog(Shell parentShell, TraceFileWriter traceFileWriter,
-            TraceCommandWriter traceCommandWriter, TraceOptions traceOptions) {
-        super(parentShell);
-        mTraceFileWriter = traceFileWriter;
-        mTraceCommandWriter = traceCommandWriter;
-        mTraceOptions = traceOptions;
-    }
-
-    @Override
-    protected Control createButtonBar(Composite parent) {
-        Composite c = new Composite(parent, SWT.NONE);
-        c.setLayout(new GridLayout(0, false));
-        GridData gd = new GridData(GridData.FILL_HORIZONTAL);
-        gd.horizontalAlignment = GridData.CENTER;
-        c.setLayoutData(gd);
-
-        createButton(c, IDialogConstants.OK_ID, "Stop Tracing", true);
-        return c;
-    }
-
-    @Override
-    protected Control createDialogArea(Composite parent) {
-        parent.setLayout(new GridLayout());
-
-        setTitle(TITLE);
-        setMessage(DEFAULT_MESSAGE);
-
-        Group controlGroup = new Group(parent, SWT.BORDER);
-        controlGroup.setLayout(new GridLayout(2, false));
-        controlGroup.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-        controlGroup.setForeground(Display.getDefault().getSystemColor(SWT.COLOR_BLUE));
-        controlGroup.setText("Trace Options");
-
-        createLabel(controlGroup, "Collect Framebuffer contents on eglSwapBuffers()");
-        final Button eglSwapCheckBox = createButton(controlGroup,
-                mTraceOptions.collectFbOnEglSwap);
-
-        createLabel(controlGroup, "Collect Framebuffer contents on glDraw*()");
-        final Button glDrawCheckBox = createButton(controlGroup, mTraceOptions.collectFbOnGlDraw);
-
-        createLabel(controlGroup, "Collect texture data for glTexImage*()");
-        final Button glTexImageCheckBox = createButton(controlGroup,
-                mTraceOptions.collectTextureData);
-
-        SelectionListener l = new SelectionAdapter() {
-            @Override
-            public void widgetSelected(SelectionEvent event) {
-                boolean eglSwap = eglSwapCheckBox.getSelection();
-                boolean glDraw = glDrawCheckBox.getSelection();
-                boolean glTexImage = glTexImageCheckBox.getSelection();
-
-                try {
-                    mTraceCommandWriter.setTraceOptions(eglSwap, glDraw, glTexImage);
-                } catch (IOException e) {
-                    eglSwapCheckBox.setEnabled(false);
-                    glDrawCheckBox.setEnabled(false);
-                    glTexImageCheckBox.setEnabled(false);
-
-                    MessageDialog.openError(Display.getDefault().getActiveShell(),
-                            "OpenGL ES Trace",
-                            "Error while setting trace options: " + e.getMessage());
-                }
-
-                // update the text on the button
-                if (!(event.getSource() instanceof Button)) {
-                    return;
-                }
-                Button sourceButton = (Button) event.getSource();
-                sourceButton.setText(getToggleActionText(sourceButton.getSelection()));
-                sourceButton.pack();
-            }
-        };
-
-        eglSwapCheckBox.addSelectionListener(l);
-        glDrawCheckBox.addSelectionListener(l);
-        glTexImageCheckBox.addSelectionListener(l);
-
-        Group statusGroup = new Group(parent, SWT.NONE);
-        statusGroup.setLayout(new GridLayout(2, false));
-        statusGroup.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-        statusGroup.setForeground(Display.getDefault().getSystemColor(SWT.COLOR_BLUE));
-        statusGroup.setText("Trace Status");
-
-        createLabel(statusGroup, "Frames Collected:");
-        mFramesCollectedLabel = createLabel(statusGroup, "");
-
-        createLabel(statusGroup, "Trace File Size:");
-        mTraceFileSizeLabel = createLabel(statusGroup, "");
-
-        ProgressBar pb = new ProgressBar(statusGroup, SWT.INDETERMINATE);
-        GridData gd = new GridData(GridData.FILL_HORIZONTAL);
-        gd.horizontalSpan = 2;
-        pb.setLayoutData(gd);
-
-        mRefreshTask = new StatusRefreshTask();
-        new Thread(mRefreshTask, "Trace Status Refresh Thread").start();
-
-        return super.createDialogArea(parent);
-    }
-
-    private Button createButton(Composite controlComposite, boolean selection) {
-        Button b = new Button(controlComposite, SWT.TOGGLE);
-        b.setText(getToggleActionText(selection));
-        b.setSelection(selection);
-        return b;
-    }
-
-    /** Get text to show on toggle box given its current selection. */
-    private String getToggleActionText(boolean en) {
-        return en ? "Disable" : "Enable";
-    }
-
-    private Label createLabel(Composite parent, String text) {
-        Label l = new Label(parent, SWT.NONE);
-        l.setText(text);
-        GridData gd = new GridData(GridData.FILL_HORIZONTAL);
-        gd.horizontalAlignment = SWT.LEFT;
-        gd.verticalAlignment = SWT.CENTER;
-        l.setLayoutData(gd);
-
-        return l;
-    }
-
-    @Override
-    protected void okPressed() {
-        mRefreshTask.cancel();
-        super.okPressed();
-    }
-
-    /** Periodically refresh the trace status. */
-    private class StatusRefreshTask implements Runnable {
-        private static final int REFRESH_INTERVAL = 1000;
-        private volatile boolean mIsCancelled = false;
-
-        @Override
-        public void run() {
-            if (mTraceFileWriter == null) {
-                return;
-            }
-
-            while (!mIsCancelled) {
-                final String frameCount = Integer.toString(mTraceFileWriter.getCurrentFrameCount());
-
-                double fileSize = mTraceFileWriter.getCurrentFileSize();
-                fileSize /= (1024 * 1024); // convert to size in MB
-                final String frameSize = SIZE_FORMATTER.format(fileSize) + " MB";
-
-                Display.getDefault().syncExec(new Runnable() {
-                    @Override
-                    public void run() {
-                        if (mFramesCollectedLabel.isDisposed()) {
-                            return;
-                        }
-
-                        mFramesCollectedLabel.setText(frameCount);
-                        mTraceFileSizeLabel.setText(frameSize);
-
-                        mFramesCollectedLabel.pack();
-                        mTraceFileSizeLabel.pack();
-                    }
-                });
-
-                try {
-                    Thread.sleep(REFRESH_INTERVAL);
-                } catch (InterruptedException e) {
-                    return;
-                }
-            }
-        }
-
-        public void cancel() {
-            mIsCancelled = true;
-        }
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/GLTraceOptionsDialog.java b/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/GLTraceOptionsDialog.java
deleted file mode 100644
index b4de3d1..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/GLTraceOptionsDialog.java
+++ /dev/null
@@ -1,403 +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.eclipse.gltrace;
-
-import com.android.ddmlib.AndroidDebugBridge;
-import com.android.ddmlib.IDevice;
-
-import org.eclipse.core.runtime.preferences.IEclipsePreferences;
-import org.eclipse.core.runtime.preferences.InstanceScope;
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.jface.dialogs.TitleAreaDialog;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Combo;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.FileDialog;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Text;
-import org.osgi.service.prefs.BackingStoreException;
-
-import java.io.File;
-import java.util.ArrayList;
-import java.util.List;
-
-/** Dialog displaying all the trace options before the user initiates tracing. */
-public class GLTraceOptionsDialog extends TitleAreaDialog {
-    private static final String TITLE = "OpenGL ES Trace Options";
-    private static final String DEFAULT_MESSAGE = "Provide the application and activity to be traced.";
-
-    private static final String PREF_APP_PACKAGE = "gl.trace.apppackage";   //$NON-NLS-1$
-    private static final String PREF_ACTIVITY = "gl.trace.activity";        //$NON-NLS-1$
-    private static final String PREF_TRACEFILE = "gl.trace.destfile";       //$NON-NLS-1$
-    private static final String PREF_DEVICE = "gl.trace.device";            //$NON-NLS-1$
-    private String mLastUsedDevice;
-
-    private static String sSaveToFolder = System.getProperty("user.home"); //$NON-NLS-1$
-
-    private Button mOkButton;
-
-    private Combo mDeviceCombo;
-    private Text mAppPackageToTraceText;
-    private Text mActivityToTraceText;
-    private Button mIsActivityFullyQualifiedButton;
-    private Text mTraceFilePathText;
-
-    private String mSelectedDevice = "";
-    private String mAppPackageToTrace = "";
-    private String mActivityToTrace = "";
-    private String mTraceFilePath = "";
-    private boolean mAllowAppSelection;
-
-    private static boolean sCollectFbOnEglSwap = true;
-    private static boolean sCollectFbOnGlDraw = false;
-    private static boolean sCollectTextureData = false;
-    private static boolean sIsActivityFullyQualified = false;
-    private IDevice[] mDevices;
-
-    public GLTraceOptionsDialog(Shell parentShell) {
-        this(parentShell, true, null);
-    }
-
-    /**
-     * Constructs a dialog displaying options for the tracer.
-     * @param allowAppSelection true if user can change the application to trace
-     * @param appToTrace default application package to trace
-     */
-    public GLTraceOptionsDialog(Shell parentShell, boolean allowAppSelection,
-            String appToTrace) {
-        super(parentShell);
-        loadPreferences();
-
-        mAllowAppSelection = allowAppSelection;
-        if (appToTrace != null) {
-            mAppPackageToTrace = appToTrace;
-        }
-    }
-
-    @Override
-    protected Control createDialogArea(Composite shell) {
-        setTitle(TITLE);
-        setMessage(DEFAULT_MESSAGE);
-
-        Composite parent = (Composite) super.createDialogArea(shell);
-        Composite c = new Composite(parent, SWT.BORDER);
-        c.setLayout(new GridLayout(2, false));
-        c.setLayoutData(new GridData(GridData.FILL_BOTH));
-
-        createLabel(c, "Device:");
-        mDevices = AndroidDebugBridge.getBridge().getDevices();
-        createDeviceDropdown(c, mDevices);
-
-        createSeparator(c);
-
-        createLabel(c, "Application Package:");
-        createAppToTraceText(c, "e.g. com.example.package");
-
-        createLabel(c, "Activity to launch:");
-        createActivityToTraceText(c, "Leave blank to launch default activity");
-
-        createLabel(c, "");
-        createIsFullyQualifedActivityButton(c,
-                "Activity name is fully qualified, do not prefix with package name");
-
-        if (!mAllowAppSelection) {
-            mAppPackageToTraceText.setEnabled(false);
-            mActivityToTraceText.setEnabled(false);
-            mIsActivityFullyQualifiedButton.setEnabled(false);
-        }
-
-        createSeparator(c);
-
-        createLabel(c, "Data Collection Options:");
-        createCaptureImageOptions(c);
-
-        createSeparator(c);
-
-        createLabel(c, "Destination File: ");
-        createSaveToField(c);
-
-        return c;
-    }
-
-    @Override
-    protected void createButtonsForButtonBar(Composite parent) {
-        super.createButtonsForButtonBar(parent);
-
-        mOkButton = getButton(IDialogConstants.OK_ID);
-        mOkButton.setText("Trace");
-
-        DialogStatus status = validateDialog();
-        mOkButton.setEnabled(status.valid);
-    }
-
-    private void createSeparator(Composite c) {
-        Label l = new Label(c, SWT.SEPARATOR | SWT.HORIZONTAL);
-        GridData gd = new GridData(GridData.FILL_HORIZONTAL);
-        gd.horizontalSpan = 2;
-        l.setLayoutData(gd);
-    }
-
-    private void createSaveToField(Composite parent) {
-        Composite c = new Composite(parent, SWT.NONE);
-        c.setLayout(new GridLayout(2, false));
-        c.setLayoutData(new GridData(GridData.FILL_BOTH));
-
-        mTraceFilePathText = new Text(c, SWT.BORDER);
-        mTraceFilePathText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-        mTraceFilePathText.setText(mTraceFilePath);
-        mTraceFilePathText.addModifyListener(new ModifyListener() {
-            @Override
-            public void modifyText(ModifyEvent e) {
-                validateAndSetMessage();
-            }
-        });
-
-        Button browse = new Button(c, SWT.PUSH);
-        browse.setText("Browse...");
-        browse.addSelectionListener(new SelectionAdapter() {
-            @Override
-            public void widgetSelected(SelectionEvent e) {
-                String fName = openBrowseDialog();
-                if (fName == null) {
-                    return;
-                }
-
-                mTraceFilePathText.setText(fName);
-                validateAndSetMessage();
-            }
-        });
-    }
-
-    private String openBrowseDialog() {
-        FileDialog fd = new FileDialog(Display.getDefault().getActiveShell(), SWT.SAVE);
-
-        fd.setText("Save To");
-        fd.setFileName("trace1.gltrace");
-
-        fd.setFilterPath(sSaveToFolder);
-        fd.setFilterExtensions(new String[] { "*.gltrace" });
-
-        String fname = fd.open();
-        if (fname == null || fname.trim().length() == 0) {
-            return null;
-        }
-
-        sSaveToFolder = fd.getFilterPath();
-        return fname;
-    }
-
-    /** Options controlling when the FB should be captured. */
-    private void createCaptureImageOptions(Composite parent) {
-        Composite c = new Composite(parent, SWT.NONE);
-        c.setLayout(new GridLayout(1, false));
-        c.setLayoutData(new GridData(GridData.FILL_BOTH));
-
-        final Button readFbOnEglSwapCheckBox = new Button(c, SWT.CHECK);
-        readFbOnEglSwapCheckBox.setText("Read back framebuffer 0 on eglSwapBuffers()");
-        readFbOnEglSwapCheckBox.setSelection(sCollectFbOnEglSwap);
-
-        final Button readFbOnGlDrawCheckBox = new Button(c, SWT.CHECK);
-        readFbOnGlDrawCheckBox.setText("Read back currently bound framebuffer On glDraw*()");
-        readFbOnGlDrawCheckBox.setSelection(sCollectFbOnGlDraw);
-
-        final Button readTextureDataCheckBox = new Button(c, SWT.CHECK);
-        readTextureDataCheckBox.setText("Collect texture data submitted using glTexImage*()");
-        readTextureDataCheckBox.setSelection(sCollectTextureData);
-
-        SelectionListener l = new SelectionAdapter() {
-            @Override
-            public void widgetSelected(SelectionEvent e) {
-                sCollectFbOnEglSwap = readFbOnEglSwapCheckBox.getSelection();
-                sCollectFbOnGlDraw = readFbOnGlDrawCheckBox.getSelection();
-                sCollectTextureData = readTextureDataCheckBox.getSelection();
-            }
-        };
-
-        readFbOnEglSwapCheckBox.addSelectionListener(l);
-        readFbOnGlDrawCheckBox.addSelectionListener(l);
-        readTextureDataCheckBox.addSelectionListener(l);
-    }
-
-    private Text createAppToTraceText(Composite parent, String defaultMessage) {
-        mAppPackageToTraceText = new Text(parent, SWT.BORDER);
-        mAppPackageToTraceText.setMessage(defaultMessage);
-        mAppPackageToTraceText.setText(mAppPackageToTrace);
-
-        mAppPackageToTraceText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-
-        mAppPackageToTraceText.addModifyListener(new ModifyListener() {
-            @Override
-            public void modifyText(ModifyEvent e) {
-                validateAndSetMessage();
-            }
-        });
-
-        return mActivityToTraceText;
-    }
-
-    private Text createActivityToTraceText(Composite parent, String defaultMessage) {
-        mActivityToTraceText = new Text(parent, SWT.BORDER);
-        mActivityToTraceText.setMessage(defaultMessage);
-        mActivityToTraceText.setText(mActivityToTrace);
-
-        mActivityToTraceText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-
-        mActivityToTraceText.addModifyListener(new ModifyListener() {
-            @Override
-            public void modifyText(ModifyEvent e) {
-                validateAndSetMessage();
-            }
-        });
-
-        return mActivityToTraceText;
-    }
-
-    private Button createIsFullyQualifedActivityButton(Composite parent, String message) {
-        mIsActivityFullyQualifiedButton = new Button(parent, SWT.CHECK);
-        mIsActivityFullyQualifiedButton.setText(message);
-        mIsActivityFullyQualifiedButton.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-        mIsActivityFullyQualifiedButton.setSelection(sIsActivityFullyQualified);
-
-        return mIsActivityFullyQualifiedButton;
-    }
-
-    private void validateAndSetMessage() {
-        DialogStatus status = validateDialog();
-        mOkButton.setEnabled(status.valid);
-        setErrorMessage(status.message);
-    }
-
-    private Combo createDeviceDropdown(Composite parent, IDevice[] devices) {
-        mDeviceCombo = new Combo(parent, SWT.READ_ONLY | SWT.BORDER);
-
-        List<String> items = new ArrayList<String>(devices.length);
-        for (IDevice d : devices) {
-            items.add(d.getName());
-        }
-        mDeviceCombo.setItems(items.toArray(new String[items.size()]));
-
-        int index = 0;
-        if (items.contains(mLastUsedDevice)) {
-            index = items.indexOf(mLastUsedDevice);
-        }
-        if (index >= 0 && index < items.size()) {
-            mDeviceCombo.select(index);
-        }
-        return mDeviceCombo;
-    }
-
-    private void createLabel(Composite parent, String text) {
-        Label l = new Label(parent, SWT.NONE);
-        l.setText(text);
-        GridData gd = new GridData();
-        gd.horizontalAlignment = SWT.RIGHT;
-        gd.verticalAlignment = SWT.CENTER;
-        l.setLayoutData(gd);
-    }
-
-    /**
-     * A tuple that specifies whether the current state of the inputs
-     * on the dialog is valid or not. If it is not valid, the message
-     * field stores the reason why it isn't.
-     */
-    private final class DialogStatus {
-        final boolean valid;
-        final String message;
-
-        private DialogStatus(boolean isValid, String errMessage) {
-            valid = isValid;
-            message = errMessage;
-        }
-    }
-
-    private DialogStatus validateDialog() {
-        if (mDevices.length == 0) {
-            return new DialogStatus(false, "No connected devices.");
-        }
-
-        if (mAppPackageToTraceText.getText().trim().isEmpty()) {
-            return new DialogStatus(false, "Provide an application name");
-        }
-
-        String traceFile = mTraceFilePathText.getText().trim();
-        if (traceFile.isEmpty()) {
-            return new DialogStatus(false, "Specify the location where the trace will be saved.");
-        }
-
-        File f = new File(traceFile).getParentFile();
-        if (f != null && !f.exists()) {
-            return new DialogStatus(false,
-                    String.format("Folder %s does not exist", f.getAbsolutePath()));
-        }
-
-        return new DialogStatus(true, null);
-    }
-
-    @Override
-    protected void okPressed() {
-        mAppPackageToTrace = mAppPackageToTraceText.getText().trim();
-        mActivityToTrace = mActivityToTraceText.getText().trim();
-        if (mActivityToTrace.startsWith(".")) { //$NON-NLS-1$
-            mActivityToTrace = mActivityToTrace.substring(1);
-        }
-        sIsActivityFullyQualified = mIsActivityFullyQualifiedButton.getSelection();
-        mTraceFilePath = mTraceFilePathText.getText().trim();
-        mSelectedDevice = mDeviceCombo.getText();
-
-        savePreferences();
-
-        super.okPressed();
-    }
-
-    private void savePreferences() {
-        IEclipsePreferences prefs = new InstanceScope().getNode(GlTracePlugin.PLUGIN_ID);
-        prefs.put(PREF_APP_PACKAGE, mAppPackageToTrace);
-        prefs.put(PREF_ACTIVITY, mActivityToTrace);
-        prefs.put(PREF_TRACEFILE, mTraceFilePath);
-        prefs.put(PREF_DEVICE, mSelectedDevice);
-        try {
-            prefs.flush();
-        } catch (BackingStoreException e) {
-            // ignore issues while persisting preferences
-        }
-    }
-
-    private void loadPreferences() {
-        IEclipsePreferences prefs = new InstanceScope().getNode(GlTracePlugin.PLUGIN_ID);
-        mAppPackageToTrace = prefs.get(PREF_APP_PACKAGE, "");
-        mActivityToTrace = prefs.get(PREF_ACTIVITY, "");
-        mTraceFilePath = prefs.get(PREF_TRACEFILE, "");
-        mLastUsedDevice = prefs.get(PREF_DEVICE, "");
-    }
-
-    public TraceOptions getTraceOptions() {
-        return new TraceOptions(mSelectedDevice, mAppPackageToTrace, mActivityToTrace,
-                sIsActivityFullyQualified, mTraceFilePath, sCollectFbOnEglSwap,
-                sCollectFbOnGlDraw, sCollectTextureData);
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/GLTracePerspective.java b/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/GLTracePerspective.java
deleted file mode 100644
index 30bb1d5..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/GLTracePerspective.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.eclipse.gltrace;
-
-import com.android.ide.eclipse.gltrace.views.FrameSummaryView;
-import com.android.ide.eclipse.gltrace.views.StateView;
-import com.android.ide.eclipse.gltrace.views.detail.DetailsView;
-
-import org.eclipse.ui.IFolderLayout;
-import org.eclipse.ui.IPageLayout;
-import org.eclipse.ui.IPerspectiveFactory;
-
-public class GLTracePerspective implements IPerspectiveFactory {
-    private static final String STATE_FOLDER_ID = "stateFolder";      //$NON-NLS-1$
-    private static final String FB_FOLDER_ID = "fbFolder";   //$NON-NLS-1$
-    private static final String TEXTURE_VIEW_FOLDER_ID = "textureViewFolder"; //$NON-NLS-1$
-
-    @Override
-    public void createInitialLayout(IPageLayout layout) {
-        // Create a 3 column layout
-        // The first column contains the function trace in an editor.
-        // The second column contains the GL State View.
-        // The third column contains the texture view and the top and the framebuffer at the bottom.
-
-        // Add the OpenGL state view to the right of the editor
-        IFolderLayout column2 = layout.createFolder(STATE_FOLDER_ID, IPageLayout.RIGHT, 0.65f,
-                layout.getEditorArea());
-        column2.addView(StateView.ID);
-
-        // Add the Texture View in the 3rd column
-        IFolderLayout column3 = layout.createFolder(FB_FOLDER_ID, IPageLayout.RIGHT, 0.6f,
-                STATE_FOLDER_ID);
-        column3.addView(DetailsView.ID);
-
-        // Add the OpenGL Framebuffer view below the texture view (bottom of 3rd column)
-        IFolderLayout column3bottom = layout.createFolder(TEXTURE_VIEW_FOLDER_ID,
-                IPageLayout.BOTTOM,
-                0.5f,
-                FB_FOLDER_ID);
-        column3bottom.addView(FrameSummaryView.ID);
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/GLUtils.java b/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/GLUtils.java
deleted file mode 100644
index 9e82768..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/GLUtils.java
+++ /dev/null
@@ -1,110 +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.eclipse.gltrace;
-
-
-import java.nio.ByteBuffer;
-import java.nio.ByteOrder;
-import java.nio.FloatBuffer;
-import java.nio.IntBuffer;
-import java.nio.ShortBuffer;
-
-public class GLUtils {
-    public static String formatData(byte[] data, GLEnum format) {
-        switch (format) {
-            case GL_BYTE:
-                return formatBytes(data, false);
-            case GL_UNSIGNED_BYTE:
-                return formatBytes(data, true);
-            case GL_SHORT:
-                return formatShorts(data, false);
-            case GL_UNSIGNED_SHORT:
-                return formatShorts(data, true);
-            case GL_FIXED:
-                return formatInts(data);
-            case GL_FLOAT:
-                return formatFloats(data);
-            default:
-                return ""; //$NON-NLS-1$
-        }
-    }
-
-    private static String formatFloats(byte[] data) {
-        FloatBuffer bb = ByteBuffer.wrap(data).order(ByteOrder.LITTLE_ENDIAN).asFloatBuffer();
-
-        StringBuilder sb = new StringBuilder(bb.capacity() * 3);
-
-        while (bb.remaining() > 0) {
-            sb.append(String.format("%.4f", bb.get()));
-            sb.append(',');
-            sb.append('\n');
-        }
-
-        return sb.toString();
-    }
-
-    private static String formatInts(byte[] data) {
-        IntBuffer bb = ByteBuffer.wrap(data).order(ByteOrder.LITTLE_ENDIAN).asIntBuffer();
-
-        StringBuilder sb = new StringBuilder(bb.capacity() * 3);
-
-        while (bb.remaining() > 0) {
-            sb.append(bb.get());
-            sb.append(',');
-            sb.append('\n');
-        }
-
-        return sb.toString();
-    }
-
-    private static String formatShorts(byte[] data, boolean unsigned) {
-        ShortBuffer bb = ByteBuffer.wrap(data).order(ByteOrder.LITTLE_ENDIAN).asShortBuffer();
-
-        StringBuilder sb = new StringBuilder(bb.capacity() * 3);
-
-        while (bb.remaining() > 0) {
-            if (unsigned) {
-                sb.append(bb.get() & 0xffff);
-            } else {
-                sb.append(bb.get());
-            }
-            sb.append(',');
-            sb.append('\n');
-        }
-
-        return sb.toString();
-    }
-
-    private static String formatBytes(byte[] data, boolean unsigned) {
-        ByteBuffer bb = ByteBuffer.wrap(data);
-
-        StringBuilder sb = new StringBuilder(bb.capacity() * 3);
-
-        while (bb.remaining() > 0) {
-            if (unsigned) {
-                sb.append(bb.get() & 0xff);
-            } else {
-                sb.append(bb.get());
-            }
-
-            sb.append(',');
-            sb.append('\n');
-        }
-
-        return sb.toString();
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/GlTracePlugin.java b/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/GlTracePlugin.java
deleted file mode 100644
index a73b7f1..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/GlTracePlugin.java
+++ /dev/null
@@ -1,130 +0,0 @@
-/*
- ** 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.
- */
-
-package com.android.ide.eclipse.gltrace;
-
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.console.ConsolePlugin;
-import org.eclipse.ui.console.IConsole;
-import org.eclipse.ui.console.IConsoleConstants;
-import org.eclipse.ui.console.MessageConsole;
-import org.eclipse.ui.console.MessageConsoleStream;
-import org.eclipse.ui.plugin.AbstractUIPlugin;
-import org.osgi.framework.BundleContext;
-
-/**
- * The activator class controls the plug-in life cycle
- */
-public class GlTracePlugin extends AbstractUIPlugin {
-
-    // The plug-in ID
-    public static final String PLUGIN_ID = "com.android.ide.eclipse.gldebugger"; //$NON-NLS-1$
-
-    // The shared instance
-    private static GlTracePlugin plugin;
-
-    private MessageConsole mConsole;
-    private MessageConsoleStream mConsoleStream;
-
-    /**
-     * The constructor
-     */
-    public GlTracePlugin() {
-    }
-
-    /*
-     * (non-Javadoc)
-     * @see
-     * org.eclipse.ui.plugin.AbstractUIPlugin#start(org.osgi.framework.BundleContext
-     * )
-     */
-    @Override
-    public void start(BundleContext context) throws Exception {
-        super.start(context);
-        plugin = this;
-
-        mConsole = new MessageConsole("OpenGL Trace View", null);
-        ConsolePlugin.getDefault().getConsoleManager().addConsoles(new IConsole[] {
-                mConsole });
-
-        mConsoleStream = mConsole.newMessageStream();
-    }
-
-    /*
-     * (non-Javadoc)
-     * @see
-     * org.eclipse.ui.plugin.AbstractUIPlugin#stop(org.osgi.framework.BundleContext
-     * )
-     */
-    @Override
-    public void stop(BundleContext context) throws Exception {
-        plugin = null;
-        super.stop(context);
-    }
-
-    /**
-     * Returns the shared instance
-     *
-     * @return the shared instance
-     */
-    public static GlTracePlugin getDefault() {
-        return plugin;
-    }
-
-    /**
-     * Returns an image descriptor for the image file at the given plug-in
-     * relative path
-     *
-     * @param path the path
-     * @return the image descriptor
-     */
-    public static ImageDescriptor getImageDescriptor(String path) {
-        return imageDescriptorFromPlugin(PLUGIN_ID, path);
-    }
-
-    public void logMessage(String message) {
-        mConsoleStream.println(message);
-
-        Display.getDefault().asyncExec(sShowConsoleRunnable);
-    }
-
-    private static Runnable sShowConsoleRunnable = new Runnable() {
-        @Override
-        public void run() {
-            showConsoleView();
-        };
-    };
-
-    private static void showConsoleView() {
-        IWorkbenchWindow w = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
-        if (w != null) {
-            IWorkbenchPage page = w.getActivePage();
-            if (page != null) {
-                try {
-                    page.showView(IConsoleConstants.ID_CONSOLE_VIEW, null,
-                            IWorkbenchPage.VIEW_VISIBLE);
-                } catch (PartInitException e) {
-                    // ignore
-                }
-            }
-        }
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/OpenGLTraceAction.java b/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/OpenGLTraceAction.java
deleted file mode 100644
index 6e232bb..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/OpenGLTraceAction.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.ide.eclipse.gltrace;
-
-import org.eclipse.core.filesystem.EFS;
-import org.eclipse.core.filesystem.IFileStore;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.FileDialog;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.IWorkbenchWindowActionDelegate;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.ide.IDE;
-
-import java.io.File;
-
-public class OpenGLTraceAction implements IWorkbenchWindowActionDelegate {
-    private static String sLoadFromFolder = System.getProperty("user.home");
-
-    @Override
-    public void run(IAction action) {
-        openTrace();
-    }
-
-    @Override
-    public void selectionChanged(IAction action, ISelection selection) {
-    }
-
-    @Override
-    public void dispose() {
-    }
-
-    @Override
-    public void init(IWorkbenchWindow window) {
-    }
-
-    private void openTrace() {
-        Shell shell = Display.getDefault().getActiveShell();
-        FileDialog fd = new FileDialog(shell, SWT.OPEN);
-
-        fd.setText("Open Trace File");
-        fd.setFilterPath(sLoadFromFolder);
-        fd.setFilterExtensions(new String[] { "*.gltrace" });
-
-        String fname = fd.open();
-        if (fname == null || fname.trim().length() == 0) {
-            return;
-        }
-
-        sLoadFromFolder = new File(fname).getParent().toString();
-
-        openEditorFor(fname);
-    }
-
-    private void openEditorFor(String fname) {
-        IFileStore fileStore = EFS.getLocalFileSystem().getStore(new Path(fname));
-        IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
-
-        try {
-            IDE.openEditorOnFileStore( page, fileStore );
-        } catch (PartInitException e) {
-            MessageDialog.openError(Display.getDefault().getActiveShell(),
-                    "Error opening GL Trace File",
-                    "Unexpected error while opening GL Trace file: " + e.getMessage());
-        }
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/ProtoBufUtils.java b/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/ProtoBufUtils.java
deleted file mode 100644
index 074e440..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/ProtoBufUtils.java
+++ /dev/null
@@ -1,86 +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.eclipse.gltrace;
-
-import com.android.ide.eclipse.gltrace.GLProtoBuf.GLMessage;
-
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.graphics.ImageData;
-import org.eclipse.swt.graphics.PaletteData;
-import org.eclipse.swt.widgets.Display;
-import org.liblzf.CLZF;
-
-/** Utilities to deal with protobuf encoded {@link GLMessage}. */
-public class ProtoBufUtils {
-    private static ImageData getImageData(GLMessage glMsg) {
-        int width = glMsg.getFb().getWidth();
-        int height = glMsg.getFb().getHeight();
-
-        if (width * height == 0) {
-            return null;
-        }
-
-        byte[] compressed = glMsg.getFb().getContents(0).toByteArray();
-        byte[] uncompressed = new byte[width * height * 4];
-
-        int size = CLZF.lzf_decompress(compressed, compressed.length,
-                                uncompressed, uncompressed.length);
-        assert size == width * height * 4 : "Unexpected image size after decompression.";
-
-        int redMask   = 0xff000000;
-        int greenMask = 0x00ff0000;
-        int blueMask  = 0x0000ff00;
-        PaletteData palette = new PaletteData(redMask, greenMask, blueMask);
-        ImageData imageData = new ImageData(
-                width,
-                height,
-                32,         // depth
-                palette,
-                1,          // scan line padding
-                uncompressed);
-        byte[] alpha = new byte[width*height];
-        for (int i = 0; i < width * height; i++) {
-            alpha[i] = uncompressed[i * 4 + 3];
-        }
-        imageData.alphaData = alpha;
-
-        imageData = imageData.scaledTo(imageData.width, -imageData.height);
-        return imageData;
-    }
-
-    /** Obtains the image stored in provided protocol buffer message. */
-    public static Image getImage(Display display, GLMessage glMsg) {
-        if (!glMsg.hasFb()) {
-            return null;
-        }
-
-        ImageData imageData = null;
-        try {
-            imageData = getImageData(glMsg);
-        } catch (Exception e) {
-            GlTracePlugin.getDefault().logMessage(
-                    "Unexpected error while retrieving framebuffer image: " + e);
-            return null;
-        }
-
-        if (imageData == null) {
-            return null;
-        }
-
-        return new Image(display, imageData);
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/SwtUtils.java b/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/SwtUtils.java
deleted file mode 100644
index a7c960d..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/SwtUtils.java
+++ /dev/null
@@ -1,33 +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.eclipse.gltrace;
-
-import org.eclipse.swt.graphics.GC;
-import org.eclipse.swt.widgets.Control;
-
-public class SwtUtils {
-    /** Minimum Character width in pixels. */
-    private static final int MIN_CHAR_WIDTH = 10;
-
-    /** Returns the font width if it is greater than {@link #MIN_CHAR_WIDTH}. */
-    public static int getApproximateFontWidth(Control c) {
-        GC gc = new GC(c);
-        int avgCharWidth = gc.getFontMetrics().getAverageCharWidth();
-        gc.dispose();
-        return Math.max(avgCharWidth, MIN_CHAR_WIDTH);
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/TraceCommandWriter.java b/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/TraceCommandWriter.java
deleted file mode 100644
index dd5cd3c..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/TraceCommandWriter.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.ide.eclipse.gltrace;
-
-import java.io.DataOutputStream;
-import java.io.IOException;
-
-/**
- * Write trace control options to the trace backend.
- * Currently, the number of options is limited, so all the options are packed into a
- * single integer. Any changes to this protocol have to be updated on the device as well.
- */
-public class TraceCommandWriter {
-    private static final int CMD_SIZE = 4;
-
-    private static final int READ_FB_ON_EGLSWAP_BIT = 0;
-    private static final int READ_FB_ON_GLDRAW_BIT = 1;
-    private static final int READ_TEXTURE_DATA_ON_GLTEXIMAGE_BIT = 2;
-
-    private final DataOutputStream mStream;;
-
-    public TraceCommandWriter(DataOutputStream traceCommandStream) {
-        mStream = traceCommandStream;
-    }
-
-    public void setTraceOptions(boolean readFbOnEglSwap, boolean readFbOnGlDraw,
-            boolean readTextureOnGlTexImage) throws IOException {
-        int eglSwap = readFbOnEglSwap ? (1 << READ_FB_ON_EGLSWAP_BIT) : 0;
-        int glDraw = readFbOnGlDraw ? (1 << READ_FB_ON_GLDRAW_BIT) : 0;
-        int tex = readTextureOnGlTexImage ? ( 1 << READ_TEXTURE_DATA_ON_GLTEXIMAGE_BIT) : 0;
-
-        int cmd = eglSwap | glDraw | tex;
-
-        mStream.writeInt(CMD_SIZE);
-        mStream.writeInt(cmd);
-        mStream.flush();
-    }
-
-    public void close() {
-        try {
-            mStream.close();
-        } catch (IOException e) {
-            // ignore exception while closing stream
-        }
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/TraceFileInfo.java b/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/TraceFileInfo.java
deleted file mode 100644
index 80933b0..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/TraceFileInfo.java
+++ /dev/null
@@ -1,41 +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.eclipse.gltrace;
-
-public class TraceFileInfo {
-    private final String mPath;
-    private final long mSize;
-    private final long mLastModified;
-
-    public TraceFileInfo(String path, long size, long lastModified) {
-        mPath = path;
-        mSize = size;
-        mLastModified = lastModified;
-    }
-
-    public String getPath() {
-        return mPath;
-    }
-
-    public long getSize() {
-        return mSize;
-    }
-
-    public long getLastModificationTime() {
-        return mLastModified;
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/TraceFileParserTask.java b/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/TraceFileParserTask.java
deleted file mode 100644
index b90c004..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/TraceFileParserTask.java
+++ /dev/null
@@ -1,254 +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.eclipse.gltrace;
-
-import com.android.ide.eclipse.gltrace.GLProtoBuf.GLMessage;
-import com.android.ide.eclipse.gltrace.GLProtoBuf.GLMessage.Function;
-import com.android.ide.eclipse.gltrace.format.GLAPISpec;
-import com.android.ide.eclipse.gltrace.format.GLMessageFormatter;
-import com.android.ide.eclipse.gltrace.model.GLCall;
-import com.android.ide.eclipse.gltrace.model.GLFrame;
-import com.android.ide.eclipse.gltrace.model.GLTrace;
-import com.android.ide.eclipse.gltrace.state.transforms.StateTransformFactory;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.jface.operation.IRunnableWithProgress;
-
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.io.RandomAccessFile;
-import java.lang.reflect.InvocationTargetException;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.List;
-import java.util.Set;
-import java.util.TreeSet;
-
-public class TraceFileParserTask implements IRunnableWithProgress {
-    private static final TraceFileReader sReader = new TraceFileReader();
-
-    private static final GLMessageFormatter sGLMessageFormatter =
-            new GLMessageFormatter(GLAPISpec.getSpecs());
-
-    private String mTraceFilePath;
-    private RandomAccessFile mFile;
-
-    private List<GLCall> mGLCalls;
-    private Set<Integer> mGLContextIds;
-
-    private GLTrace mTrace;
-
-    /**
-     * Construct a GL Trace file parser.
-     * @param path path to trace file
-     */
-    public TraceFileParserTask(String path) {
-        try {
-            mFile = new RandomAccessFile(path, "r"); //$NON-NLS-1$
-        } catch (FileNotFoundException e) {
-            throw new IllegalArgumentException(e);
-        }
-
-        mTraceFilePath = path;
-        mGLCalls = new ArrayList<GLCall>();
-        mGLContextIds = new TreeSet<Integer>();
-    }
-
-    private void addMessage(int index, long traceFileOffset, GLMessage msg, long startTime) {
-        String formattedMsg;
-        try {
-            formattedMsg = sGLMessageFormatter.formatGLMessage(msg);
-        } catch (Exception e) {
-            formattedMsg = String.format("%s()", msg.getFunction().toString()); //$NON-NLS-1$
-        }
-
-        GLCall c = new GLCall(index,
-                                startTime,
-                                traceFileOffset,
-                                formattedMsg,
-                                msg.getFunction(),
-                                msg.hasFb(),
-                                msg.getContextId(),
-                                msg.getDuration(),
-                                msg.getThreadtime());
-
-        addProperties(c, msg);
-
-        try {
-            c.setStateTransformations(StateTransformFactory.getTransformsFor(msg));
-        } catch (Exception e) {
-            c.setStateTransformationCreationError(e.getMessage());
-            GlTracePlugin.getDefault().logMessage("Error while creating transformations for "
-                                                        + c.toString() + ":");
-            GlTracePlugin.getDefault().logMessage(e.getMessage());
-        }
-
-        mGLCalls.add(c);
-        mGLContextIds.add(Integer.valueOf(c.getContextId()));
-    }
-
-    /** Save important values from the {@link GLMessage} in the {@link GLCall} as properties. */
-    private void addProperties(GLCall c, GLMessage msg) {
-        switch (msg.getFunction()) {
-        case glPushGroupMarkerEXT:
-            // void PushGroupMarkerEXT(sizei length, const char *marker);
-            // save the marker name
-            c.addProperty(GLCall.PROPERTY_MARKERNAME,
-                    msg.getArgs(1).getCharValue(0).toStringUtf8());
-            break;
-        case glVertexAttribPointerData:
-            // void glVertexAttribPointerData(GLuint indx, GLint size, GLenum type,
-            //         GLboolean normalized, GLsizei stride, const GLvoid* ptr,
-            //         int minIndex, int maxIndex)
-            c.addProperty(GLCall.PROPERTY_VERTEX_ATTRIB_POINTER_SIZE,
-                    Integer.valueOf(msg.getArgs(1).getIntValue(0)));
-            c.addProperty(GLCall.PROPERTY_VERTEX_ATTRIB_POINTER_TYPE,
-                    GLEnum.valueOf(msg.getArgs(2).getIntValue(0)));
-            c.addProperty(GLCall.PROPERTY_VERTEX_ATTRIB_POINTER_DATA,
-                    msg.getArgs(5).getRawBytes(0).toByteArray());
-            break;
-        default:
-            break;
-        }
-    }
-
-    /**
-     * Parse the entire file and create a {@link GLTrace} object that can be retrieved
-     * using {@link #getTrace()}.
-     */
-    @Override
-    public void run(IProgressMonitor monitor) throws InvocationTargetException,
-            InterruptedException {
-        long fileLength;
-        try {
-            fileLength = mFile.length();
-        } catch (IOException e1) {
-            fileLength = 0;
-        }
-
-        monitor.beginTask("Parsing OpenGL Trace File",
-                fileLength > 0 ? 100 : IProgressMonitor.UNKNOWN);
-
-        List<GLFrame> glFrames = null;
-
-        try {
-            GLMessage msg = null;
-            int msgCount = 0;
-            long filePointer = mFile.getFilePointer();
-            int percentParsed = 0;
-
-            // counters that maintain some statistics about the trace messages
-            long minTraceStartTime = Long.MAX_VALUE;
-
-            while ((msg = sReader.getMessageAtOffset(mFile, -1)) != null) {
-                if (minTraceStartTime > msg.getStartTime()) {
-                    minTraceStartTime = msg.getStartTime();
-                }
-
-                addMessage(msgCount, filePointer, msg, msg.getStartTime() - minTraceStartTime);
-
-                filePointer = mFile.getFilePointer();
-                msgCount++;
-
-                if (monitor.isCanceled()) {
-                    throw new InterruptedException();
-                }
-
-                if (fileLength > 0) {
-                    int percentParsedNow = (int)((filePointer * 100) / fileLength);
-                    monitor.worked(percentParsedNow - percentParsed);
-                    percentParsed = percentParsedNow;
-                }
-            }
-
-            if (mGLContextIds.size() > 1) {
-                // if there are multiple contexts, then the calls may arrive at the
-                // host out of order. So we perform a sort based on the invocation time.
-                Collections.sort(mGLCalls, new Comparator<GLCall>() {
-                    @Override
-                    public int compare(GLCall c1, GLCall c2) {
-                        long diff = (c1.getStartTime() - c2.getStartTime());
-
-                        // We could return diff casted to an int. But in Java, casting
-                        // from a long to an int truncates the bits and will not preserve
-                        // the sign. So we resort to comparing the diff to 0 and returning
-                        // the sign.
-                        if (diff == 0) {
-                            return 0;
-                        } else if (diff > 0) {
-                            return 1;
-                        } else {
-                            return -1;
-                        }
-                    }
-                });
-
-                // reassign indices after sorting
-                for (int i = 0; i < mGLCalls.size(); i++) {
-                    mGLCalls.get(i).setIndex(i);
-                }
-            }
-
-            glFrames = createFrames(mGLCalls);
-        } catch (Exception e) {
-            throw new InvocationTargetException(e);
-        } finally {
-            try {
-                mFile.close();
-            } catch (IOException e) {
-                // ignore exception while closing file
-            }
-            monitor.done();
-        }
-
-        File f = new File(mTraceFilePath);
-        TraceFileInfo fileInfo = new TraceFileInfo(mTraceFilePath, f.length(), f.lastModified());
-        mTrace = new GLTrace(fileInfo, glFrames, mGLCalls, new ArrayList<Integer>(mGLContextIds));
-    }
-
-    /** Assign GL calls to GL Frames. */
-    private List<GLFrame> createFrames(List<GLCall> calls) {
-        List<GLFrame> glFrames = new ArrayList<GLFrame>();
-        int startCallIndex = 0;
-        int frameIndex = 0;
-
-        for (int i = 0; i < calls.size(); i++) {
-            GLCall c = calls.get(i);
-            if (c.getFunction() == Function.eglSwapBuffers) {
-                glFrames.add(new GLFrame(frameIndex, startCallIndex, i + 1));
-                startCallIndex = i + 1;
-                frameIndex++;
-            }
-        }
-
-        // assign left over calls at the end to the last frame
-        if (startCallIndex != mGLCalls.size()) {
-            glFrames.add(new GLFrame(frameIndex, startCallIndex, mGLCalls.size()));
-        }
-
-        return glFrames;
-    }
-
-    /**
-     * Retrieve the trace object constructed from messages in the trace file.
-     */
-    public GLTrace getTrace() {
-        return mTrace;
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/TraceFileReader.java b/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/TraceFileReader.java
deleted file mode 100644
index 76b32b0..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/TraceFileReader.java
+++ /dev/null
@@ -1,66 +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.eclipse.gltrace;
-
-import com.android.ide.eclipse.gltrace.GLProtoBuf.GLMessage;
-import com.google.protobuf.InvalidProtocolBufferException;
-
-import java.io.EOFException;
-import java.io.IOException;
-import java.io.RandomAccessFile;
-
-public class TraceFileReader {
-    /** Maximum size for a protocol buffer message.
-     * The message size is dominated by the size of the compressed framebuffer.
-     * Currently, we assume that the maximum is for a 1080p display. Since the buffers compress
-     * well, we should probably never get close to this.
-     */
-    private static final int MAX_PROTOBUF_SIZE = 1920 * 1080 * 100;
-
-    /**
-     * Obtain the next protobuf message in this file.
-     * @param file file to read from
-     * @param offset offset to start reading from
-     * @return protobuf message at given offset
-     * @throws IOException in case of file I/O errors
-     * @throws InvalidProtocolBufferException if protobuf is not well formed
-     */
-    public GLMessage getMessageAtOffset(RandomAccessFile file, long offset) throws IOException {
-        int len;
-        byte[] b;
-        try {
-            if (offset != -1) {
-                file.seek(offset);
-            }
-
-            len = file.readInt();
-            if (len > MAX_PROTOBUF_SIZE) {
-                String msg = String.format(
-                        "Unexpectedly large (%d bytes) protocol buffer message encountered.",
-                        len);
-                throw new InvalidProtocolBufferException(msg);
-            }
-
-            b = new byte[len];
-            file.readFully(b);
-        } catch (EOFException e) {
-            return null;
-        }
-
-        return GLMessage.parseFrom(b);
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/TraceFileWriter.java b/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/TraceFileWriter.java
deleted file mode 100644
index 0be05ae..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/TraceFileWriter.java
+++ /dev/null
@@ -1,156 +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.eclipse.gltrace;
-
-import com.android.ide.eclipse.gltrace.GLProtoBuf.GLMessage;
-import com.android.ide.eclipse.gltrace.GLProtoBuf.GLMessage.Function;
-import com.google.protobuf.InvalidProtocolBufferException;
-
-import java.io.DataInputStream;
-import java.io.DataOutputStream;
-import java.io.FileOutputStream;
-import java.io.IOException;
-
-/** A class that streams data received from a socket into the trace file. */
-public class TraceFileWriter {
-    private DataInputStream mInputStream;
-    private DataOutputStream mOutputStream;
-    private Thread mReceiverThread;
-
-    private int mFileSize = 0;
-    private int mFrameCount = 0;
-
-    /**
-     * Construct a trace file writer.
-     * @param fos output stream to write trace data to
-     * @param is input stream from which trace data is read
-     */
-    public TraceFileWriter(FileOutputStream fos, DataInputStream is) {
-        mOutputStream = new DataOutputStream(fos);
-        mInputStream = is;
-    }
-
-    public void start() {
-        // launch thread
-        mReceiverThread = new Thread(new GLTraceReceiverTask());
-        mReceiverThread.setName("GL Trace Receiver");
-        mReceiverThread.start();
-    }
-
-    public void stopTracing() {
-        // close socket to stop the receiver thread
-        try {
-            mInputStream.close();
-        } catch (IOException e) {
-            // ignore exception while closing socket
-        }
-
-        // wait for receiver to complete
-        try {
-            mReceiverThread.join();
-        } catch (InterruptedException e1) {
-            // ignore, this cannot be interrupted
-        }
-
-        // close stream
-        try {
-            mOutputStream.close();
-        } catch (IOException e) {
-            // ignore error while closing stream
-        }
-    }
-
-    /**
-     * The GLTraceReceiverTask collects trace data from the device and writes it
-     * into a file while collecting some stats on the way.
-     */
-    private class GLTraceReceiverTask implements Runnable {
-        @Override
-        public void run() {
-            while (true) {
-                byte[] buffer = readTraceData(mInputStream);
-                if (buffer == null) {
-                    break;
-                }
-
-                try {
-                    writeTraceData(buffer, mOutputStream);
-                } catch (IOException e) {
-                    break;
-                }
-
-                updateTraceStats(buffer);
-            }
-        }
-    }
-
-    private byte[] readTraceData(DataInputStream dis) {
-        int len;
-        try {
-            len = dis.readInt();
-        } catch (IOException e1) {
-            return null;
-        }
-        len = Integer.reverseBytes(len);    // readInt is big endian, we want little endian
-
-        byte[] buffer = new byte[len];
-        int readLen = 0;
-        while (readLen < len) {
-            try {
-                int read = dis.read(buffer, readLen, len - readLen);
-                if (read < 0) {
-                    return null;
-                } else {
-                    readLen += read;
-                }
-            } catch (IOException e) {
-                return null;
-            }
-        }
-
-        return buffer;
-    }
-
-
-    private void writeTraceData(byte[] buffer, DataOutputStream stream) throws IOException {
-        stream.writeInt(buffer.length);
-        stream.write(buffer);
-    }
-
-    private void updateTraceStats(byte[] buffer) {
-        GLMessage msg = null;
-        try {
-            msg = GLMessage.parseFrom(buffer);
-        } catch (InvalidProtocolBufferException e) {
-            return;
-        }
-
-        mFileSize += buffer.length;
-
-        if (msg.getFunction() == Function.eglSwapBuffers) {
-            mFrameCount++;
-        }
-    }
-
-    public int getCurrentFileSize() {
-        return mFileSize;
-    }
-
-    public int getCurrentFrameCount() {
-        return mFrameCount;
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/TraceOptions.java b/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/TraceOptions.java
deleted file mode 100644
index ac9fb6b..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/TraceOptions.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.ide.eclipse.gltrace;
-
-public class TraceOptions {
-    /** Device on which the application should be run. */
-    public final String device;
-
-    /** Application to trace. */
-    public final String appToTrace;
-
-    /** Activity to trace. */
-    public final String activityToTrace;
-
-    public final boolean isActivityNameFullyQualified;
-
-    /** Path where the trace file should be saved. */
-    public final String traceDestination;
-
-    /** Flag indicating whether Framebuffer should be captured on eglSwap() */
-    public final boolean collectFbOnEglSwap;
-
-    /** Flag indicating whether Framebuffer should be captured on glDraw*() */
-    public final boolean collectFbOnGlDraw;
-
-    /** Flag indicating whether texture data should be captured on glTexImage*() */
-    public final boolean collectTextureData;
-
-    public TraceOptions(String device, String appPackage, String activity,
-            boolean isActivityNameFullyQualified, String destinationPath,
-            boolean collectFbOnEglSwap, boolean collectFbOnGlDraw, boolean collectTextureData) {
-        this.device = device;
-        this.appToTrace = appPackage;
-        this.activityToTrace = activity;
-        this.isActivityNameFullyQualified = isActivityNameFullyQualified;
-        this.traceDestination = destinationPath;
-        this.collectFbOnEglSwap = collectFbOnEglSwap;
-        this.collectFbOnGlDraw = collectFbOnGlDraw;
-        this.collectTextureData = collectTextureData;
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/editors/DurationMinimap.java b/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/editors/DurationMinimap.java
deleted file mode 100644
index 9b4c57c..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/editors/DurationMinimap.java
+++ /dev/null
@@ -1,541 +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.eclipse.gltrace.editors;
-
-import com.android.ide.eclipse.gltrace.GLProtoBuf.GLMessage.Function;
-import com.android.ide.eclipse.gltrace.model.GLCall;
-import com.android.ide.eclipse.gltrace.model.GLTrace;
-
-import org.eclipse.jface.resource.FontRegistry;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.MouseAdapter;
-import org.eclipse.swt.events.MouseEvent;
-import org.eclipse.swt.events.MouseMoveListener;
-import org.eclipse.swt.events.MouseTrackListener;
-import org.eclipse.swt.events.PaintEvent;
-import org.eclipse.swt.events.PaintListener;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.FontData;
-import org.eclipse.swt.graphics.GC;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.graphics.Rectangle;
-import org.eclipse.swt.widgets.Canvas;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.Listener;
-
-import java.util.ArrayList;
-import java.util.List;
-
-public class DurationMinimap extends Canvas {
-    /** Default alpha value. */
-    private static final int DEFAULT_ALPHA = 255;
-
-    /** Alpha value for highlighting visible calls. */
-    private static final int VISIBLE_CALLS_HIGHLIGHT_ALPHA = 50;
-
-    /** Clamp call durations at this value. */
-    private static final long CALL_DURATION_CLAMP = 20000;
-
-    private static final String FONT_KEY = "default.font";      //$NON-NLS-1$
-
-    /** Scale font size by this amount to get the max display length of call duration. */
-    private static final int MAX_DURATION_LENGTH_SCALE = 6;
-
-    /** List of GL Calls in the trace. */
-    private List<GLCall> mCalls;
-
-    /** Number of GL contexts in the trace. */
-    private int mContextCount;
-
-    /** Starting call index of currently displayed frame. */
-    private int mStartCallIndex;
-
-    /** Ending call index of currently displayed frame. */
-    private int mEndCallIndex;
-
-    /** The top index that is currently visible in the table. */
-    private int mVisibleCallTopIndex;
-
-    /** The bottom index that is currently visible in the table. */
-    private int mVisibleCallBottomIndex;
-
-    private Color mBackgroundColor;
-    private Color mDurationLineColor;
-    private Color mGlDrawColor;
-    private Color mGlErrorColor;
-    private Color mContextHeaderColor;
-    private Color mVisibleCallsHighlightColor;
-    private Color mMouseMarkerColor;
-
-    private FontRegistry mFontRegistry;
-    private int mFontWidth;
-    private int mFontHeight;
-
-    // back buffers used for double buffering
-    private Image mBackBufferImage;
-    private GC mBackBufferGC;
-
-    // mouse state
-    private boolean mMouseInSelf;
-    private int mMouseY;
-
-    // helper object used to position various items on screen
-    private final PositionHelper mPositionHelper;
-
-    public DurationMinimap(Composite parent, GLTrace trace) {
-        super(parent, SWT.NO_BACKGROUND);
-
-        setInput(trace);
-
-        initializeColors();
-        initializeFonts();
-
-        mPositionHelper = new PositionHelper(
-                mFontHeight,
-                mContextCount,
-                mFontWidth * MAX_DURATION_LENGTH_SCALE, /* max display length for call. */
-                CALL_DURATION_CLAMP                     /* max duration */);
-
-        addPaintListener(new PaintListener() {
-            @Override
-            public void paintControl(PaintEvent e) {
-                draw(e.display, e.gc);
-            }
-        });
-
-        addListener(SWT.Resize, new Listener() {
-            @Override
-            public void handleEvent(Event event) {
-                controlResized();
-            }
-        });
-
-        addMouseMoveListener(new MouseMoveListener() {
-            @Override
-            public void mouseMove(MouseEvent e) {
-                mouseMoved(e);
-            }
-        });
-
-        addMouseListener(new MouseAdapter() {
-            @Override
-            public void mouseUp(MouseEvent e) {
-                mouseClicked(e);
-            }
-        });
-
-        addMouseTrackListener(new MouseTrackListener() {
-            @Override
-            public void mouseHover(MouseEvent e) {
-            }
-
-            @Override
-            public void mouseExit(MouseEvent e) {
-                mMouseInSelf = false;
-                redraw();
-            }
-
-            @Override
-            public void mouseEnter(MouseEvent e) {
-                mMouseInSelf = true;
-                redraw();
-            }
-        });
-    }
-
-    public void setInput(GLTrace trace) {
-        if (trace != null) {
-            mCalls = trace.getGLCalls();
-            mContextCount = trace.getContexts().size();
-        } else {
-            mCalls = null;
-            mContextCount = 1;
-        }
-    }
-
-    @Override
-    public void dispose() {
-        disposeColors();
-        disposeBackBuffer();
-        super.dispose();
-    }
-
-    private void initializeColors() {
-        mBackgroundColor = new Color(getDisplay(), 0x33, 0x33, 0x33);
-        mDurationLineColor = new Color(getDisplay(), 0x08, 0x51, 0x9c);
-        mGlDrawColor = new Color(getDisplay(), 0x6b, 0xae, 0xd6);
-        mContextHeaderColor = new Color(getDisplay(), 0xd1, 0xe5, 0xf0);
-        mVisibleCallsHighlightColor = new Color(getDisplay(), 0xcc, 0xcc, 0xcc);
-        mMouseMarkerColor = new Color(getDisplay(), 0xaa, 0xaa, 0xaa);
-
-        mGlErrorColor = getDisplay().getSystemColor(SWT.COLOR_RED);
-    }
-
-    private void disposeColors() {
-        mBackgroundColor.dispose();
-        mDurationLineColor.dispose();
-        mGlDrawColor.dispose();
-        mContextHeaderColor.dispose();
-        mVisibleCallsHighlightColor.dispose();
-        mMouseMarkerColor.dispose();
-    }
-
-    private void initializeFonts() {
-        mFontRegistry = new FontRegistry(getDisplay());
-        mFontRegistry.put(FONT_KEY,
-                new FontData[] { new FontData("Arial", 8, SWT.NORMAL) });  //$NON-NLS-1$
-
-        GC gc = new GC(getDisplay());
-        gc.setFont(mFontRegistry.get(FONT_KEY));
-        mFontWidth = gc.getFontMetrics().getAverageCharWidth();
-        mFontHeight = gc.getFontMetrics().getHeight();
-        gc.dispose();
-    }
-
-    private void initializeBackBuffer() {
-        Rectangle clientArea = getClientArea();
-
-        if (clientArea.width == 0 || clientArea.height == 0) {
-            mBackBufferImage = null;
-            mBackBufferGC = null;
-            return;
-        }
-
-        mBackBufferImage = new Image(getDisplay(),
-                clientArea.width,
-                clientArea.height);
-        mBackBufferGC = new GC(mBackBufferImage);
-    }
-
-    private void disposeBackBuffer() {
-        if (mBackBufferImage != null) {
-            mBackBufferImage.dispose();
-            mBackBufferImage = null;
-        }
-
-        if (mBackBufferGC != null) {
-            mBackBufferGC.dispose();
-            mBackBufferGC = null;
-        }
-    }
-
-    private void mouseMoved(MouseEvent e) {
-        mMouseY = e.y;
-        redraw();
-    }
-
-    private void mouseClicked(MouseEvent e) {
-        if (mMouseInSelf) {
-            int selIndex = mPositionHelper.getCallAt(mMouseY);
-            sendCallSelectedEvent(selIndex);
-            redraw();
-        }
-    }
-
-    private void draw(Display display, GC gc) {
-        if (mBackBufferImage == null) {
-            initializeBackBuffer();
-        }
-
-        if (mBackBufferImage == null) {
-            return;
-        }
-
-        // draw contents onto the back buffer
-        drawBackground(mBackBufferGC, mBackBufferImage.getBounds());
-        drawContextHeaders(mBackBufferGC);
-        drawCallDurations(mBackBufferGC);
-        drawVisibleCallHighlights(mBackBufferGC);
-        drawMouseMarkers(mBackBufferGC);
-
-        // finally copy over the rendered back buffer onto screen
-        int width = getClientArea().width;
-        int height = getClientArea().height;
-        gc.drawImage(mBackBufferImage,
-                0, 0, width, height,
-                0, 0, width, height);
-    }
-
-    private void drawBackground(GC gc, Rectangle bounds) {
-        gc.setBackground(mBackgroundColor);
-        gc.fillRectangle(bounds);
-    }
-
-    private void drawContextHeaders(GC gc) {
-        if (mContextCount <= 1) {
-            return;
-        }
-
-        gc.setForeground(mContextHeaderColor);
-        gc.setFont(mFontRegistry.get(FONT_KEY));
-        for (int i = 0; i < mContextCount; i++) {
-            Point p = mPositionHelper.getHeaderLocation(i);
-            gc.drawText("CTX" + Integer.toString(i), p.x, p.y);
-        }
-    }
-
-    /** Draw the call durations as a sequence of lines.
-     *
-     * Calls are arranged on the y-axis based on the sequence in which they were originally
-     * called by the application. If the display height is lesser than the number of calls, then
-     * not every call is shown - the calls are underscanned based the height of the display.
-     *
-     * The x-axis shows two pieces of information: the duration of the call, and the context
-     * in which the call was made. The duration controls how long the displayed line is, and
-     * the context controls the starting offset of the line.
-     */
-    private void drawCallDurations(GC gc) {
-        if (mCalls == null || mCalls.size() < mEndCallIndex) {
-            return;
-        }
-
-        gc.setBackground(mDurationLineColor);
-
-        int callUnderScan = mPositionHelper.getCallUnderScanValue();
-        for (int i = mStartCallIndex; i < mEndCallIndex; i += callUnderScan) {
-            boolean resetColor = false;
-            GLCall c = mCalls.get(i);
-
-            long duration = c.getWallDuration();
-
-            if (c.hasErrors()) {
-                gc.setBackground(mGlErrorColor);
-                resetColor = true;
-
-                // If the call has any errors, we want it to be visible in the minimap
-                // regardless of how long it took.
-                duration = mPositionHelper.getMaxDuration();
-            } else if (c.getFunction() == Function.glDrawArrays
-                    || c.getFunction() == Function.glDrawElements
-                    || c.getFunction() == Function.eglSwapBuffers) {
-                gc.setBackground(mGlDrawColor);
-                resetColor = true;
-
-                // render all draw calls & swap buffer at max length
-                duration = mPositionHelper.getMaxDuration();
-            }
-
-            Rectangle bounds = mPositionHelper.getDurationBounds(
-                    i - mStartCallIndex,
-                    c.getContextId(),
-                    duration);
-            gc.fillRectangle(bounds);
-
-            if (resetColor) {
-                gc.setBackground(mDurationLineColor);
-            }
-        }
-    }
-
-    /**
-     * Draw a bounding box that highlights the currently visible range of calls in the
-     * {@link GLFunctionTraceViewer} table.
-     */
-    private void drawVisibleCallHighlights(GC gc) {
-        gc.setAlpha(VISIBLE_CALLS_HIGHLIGHT_ALPHA);
-        gc.setBackground(mVisibleCallsHighlightColor);
-        gc.fillRectangle(mPositionHelper.getBoundsFramingCalls(
-                mVisibleCallTopIndex - mStartCallIndex,
-                mVisibleCallBottomIndex - mStartCallIndex));
-        gc.setAlpha(DEFAULT_ALPHA);
-    }
-
-    private void drawMouseMarkers(GC gc) {
-        if (!mMouseInSelf) {
-            return;
-        }
-
-        if (mPositionHelper.getCallAt(mMouseY) < 0) {
-            return;
-        }
-
-        gc.setForeground(mMouseMarkerColor);
-        gc.drawLine(0, mMouseY, getClientArea().width, mMouseY);
-    }
-
-    private void controlResized() {
-        // regenerate back buffer on size changes
-        disposeBackBuffer();
-        initializeBackBuffer();
-
-        redraw();
-    }
-
-    public int getMinimumWidth() {
-        return mPositionHelper.getMinimumWidth();
-    }
-
-    /** Set the GL Call start and end indices for currently displayed frame. */
-    public void setCallRangeForCurrentFrame(int startCallIndex, int endCallIndex) {
-        mStartCallIndex = startCallIndex;
-        mEndCallIndex = endCallIndex;
-        mPositionHelper.updateCallDensity(mEndCallIndex - mStartCallIndex, getClientArea().height);
-        redraw();
-    }
-
-    /**
-     * Set the call range that is currently visible in the {@link GLFunctionTraceViewer} table.
-     * @param visibleTopIndex index of call currently visible at the top of the table.
-     * @param visibleBottomIndex index of call currently visible at the bottom of the table.
-     */
-    public void setVisibleCallRange(int visibleTopIndex, int visibleBottomIndex) {
-        mVisibleCallTopIndex = visibleTopIndex;
-        mVisibleCallBottomIndex = visibleBottomIndex;
-        redraw();
-    }
-
-    public interface ICallSelectionListener {
-        void callSelected(int selectedCallIndex);
-    }
-
-    private List<ICallSelectionListener> mListeners = new ArrayList<ICallSelectionListener>();
-
-    public void addCallSelectionListener(ICallSelectionListener l) {
-        mListeners.add(l);
-    }
-
-    private void sendCallSelectedEvent(int selectedCall) {
-        for (ICallSelectionListener l : mListeners) {
-            l.callSelected(selectedCall);
-        }
-    }
-
-    /** Utility class to help with the positioning and sizes of elements in the canvas. */
-    private static class PositionHelper {
-        /** Left Margin after which duration lines are drawn. */
-        private static final int LEFT_MARGIN = 5;
-
-        /** Top margin after which header is drawn. */
-        private static final int TOP_MARGIN = 5;
-
-        /** # of pixels of padding between duration markers for different contexts. */
-        private static final int CONTEXT_PADDING = 10;
-
-        private final int mHeaderMargin;
-        private final int mContextCount;
-        private final int mMaxDurationLength;
-        private final long mMaxDuration;
-        private final double mScale;
-
-        private int mCallCount;
-        private int mNumCallsPerPixel = 1;
-
-        public PositionHelper(int fontHeight, int contextCount,
-                int maxDurationLength, long maxDuration) {
-            mContextCount = contextCount;
-            mMaxDurationLength = maxDurationLength;
-            mMaxDuration = maxDuration;
-            mScale = (double) maxDurationLength / maxDuration;
-
-            // header region is present only there are multiple contexts
-            if (mContextCount > 1) {
-                mHeaderMargin = fontHeight * 3;
-            } else {
-                mHeaderMargin = 0;
-            }
-        }
-
-        /** Get the minimum width of the canvas. */
-        public int getMinimumWidth() {
-            return LEFT_MARGIN + (mMaxDurationLength + CONTEXT_PADDING) * mContextCount;
-        }
-
-        /** Get the bounds for a call duration line. */
-        public Rectangle getDurationBounds(int callIndex, int context, long duration) {
-            if (duration <= 0) {
-                duration = 1;
-            } else if (duration > mMaxDuration) {
-                duration = mMaxDuration;
-            }
-
-            int x = LEFT_MARGIN + ((mMaxDurationLength + CONTEXT_PADDING) * context);
-            int y = (callIndex/mNumCallsPerPixel) + TOP_MARGIN + mHeaderMargin;
-            int w = (int) (duration * mScale);
-            int h = 1;
-
-            return new Rectangle(x, y, w, h);
-        }
-
-        public long getMaxDuration() {
-            return mMaxDuration;
-        }
-
-        /** Get the bounds for calls spanning given range. */
-        public Rectangle getBoundsFramingCalls(int startCallIndex, int endCallIndex) {
-            if (startCallIndex >= 0 && endCallIndex >= startCallIndex
-                    && endCallIndex <= mCallCount) {
-                int x = LEFT_MARGIN;
-                int y = (startCallIndex/mNumCallsPerPixel) + TOP_MARGIN + mHeaderMargin;
-                int w = ((mMaxDurationLength + CONTEXT_PADDING) * mContextCount);
-                int h = (endCallIndex - startCallIndex)/mNumCallsPerPixel;
-            return new Rectangle(x, y, w, h);
-            } else {
-                return new Rectangle(0, 0, 0, 0);
-            }
-        }
-
-        public Point getHeaderLocation(int context) {
-            int x = LEFT_MARGIN + ((mMaxDurationLength + CONTEXT_PADDING) * context);
-            return new Point(x, TOP_MARGIN);
-        }
-
-        /** Update the call density based on the number of calls to be displayed and
-         * the available height to display them in. */
-        public void updateCallDensity(int callCount, int displayHeight) {
-            mCallCount = callCount;
-
-            if (displayHeight <= 0) {
-                displayHeight = callCount + 1;
-            }
-
-            mNumCallsPerPixel = (callCount / displayHeight) + 1;
-        }
-
-        /** Get the underscan value. In cases where there are more calls to be displayed
-         * than there are availble pixels, we only display 1 out of every underscan calls. */
-        public int getCallUnderScanValue() {
-            return mNumCallsPerPixel;
-        }
-
-        /** Get the index of the call at given y offset. */
-        public int getCallAt(int y) {
-            if (!isWithinBounds(y)) {
-                return -1;
-            }
-
-            Rectangle displayBounds = getBoundsFramingCalls(0, mCallCount);
-            return (y - displayBounds.y) * mNumCallsPerPixel;
-        }
-
-        /** Does the provided y offset map to a valid call? */
-        private boolean isWithinBounds(int y) {
-            Rectangle displayBounds = getBoundsFramingCalls(0, mCallCount);
-            if (y < displayBounds.y) {
-                return false;
-            }
-
-            if (y > (displayBounds.y + displayBounds.height)) {
-                return false;
-            }
-
-            return true;
-        }
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/editors/GLCallGroups.java b/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/editors/GLCallGroups.java
deleted file mode 100644
index 226d483..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/editors/GLCallGroups.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.ide.eclipse.gltrace.editors;
-
-import com.android.ide.eclipse.gltrace.GLProtoBuf.GLMessage.Function;
-import com.android.ide.eclipse.gltrace.model.GLCall;
-import com.android.ide.eclipse.gltrace.model.GLTrace;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-import java.util.Stack;
-
-public class GLCallGroups {
-    /**
-     * A {@link GLCallNode} is a simple wrapper around a {@link GLCall} that
-     * adds the notion of hierarchy.
-     */
-    public interface GLCallNode {
-        /** Does this call have child nodes? */
-        boolean hasChildren();
-
-        /** Returns a list of child nodes of this call. */
-        List<GLCallNode> getChildren();
-
-        /** Returns the {@link GLCall} that is wrapped by this node. */
-        GLCall getCall();
-
-        /** Returns the parent of this node, the parent is null if this is a top level node */
-        GLCallNode getParent();
-
-        /** Set the parent node. */
-        void setParent(GLCallNode parent);
-    }
-
-    private static class GLTreeNode implements GLCallNode {
-        private final GLCall mCall;
-        private GLCallNode mParent;
-        private List<GLCallNode> mGLCallNodes;
-
-        public GLTreeNode(GLCall call) {
-            mCall = call;
-            mGLCallNodes = new ArrayList<GLCallNode>();
-        }
-
-        @Override
-        public boolean hasChildren() {
-            return true;
-        }
-
-        @Override
-        public GLCallNode getParent() {
-            return mParent;
-        }
-
-        @Override
-        public void setParent(GLCallNode parent) {
-            mParent = parent;
-        }
-
-        @Override
-        public List<GLCallNode> getChildren() {
-            return mGLCallNodes;
-        }
-
-        public void addChild(GLCallNode n) {
-            mGLCallNodes.add(n);
-            n.setParent(this);
-        }
-
-        @Override
-        public GLCall getCall() {
-            return mCall;
-        }
-    }
-
-    private static class GLLeafNode implements GLCallNode {
-        private final GLCall mCall;
-        private GLCallNode mParent;
-
-        public GLLeafNode(GLCall call) {
-            mCall = call;
-        }
-
-        @Override
-        public boolean hasChildren() {
-            return false;
-        }
-
-        @Override
-        public List<GLCallNode> getChildren() {
-            return null;
-        }
-
-        @Override
-        public GLCallNode getParent() {
-            return mParent;
-        }
-
-        @Override
-        public void setParent(GLCallNode parent) {
-            mParent = parent;
-        }
-
-        @Override
-        public GLCall getCall() {
-            return mCall;
-        }
-    }
-
-    /**
-     * Impose a hierarchy on a list of {@link GLCall}'s based on the presence of
-     * {@link Function#glPushGroupMarkerEXT} and {@link Function#glPopGroupMarkerEXT} calls.
-     * Such a hierarchy is possible only if calls from a single context are considered.
-     * @param trace trace to look at
-     * @param start starting call index
-     * @param end ending call index
-     * @param contextToGroup context from which calls should be grouped. If no such context
-     *        is present, then all calls in the given range will be returned back as a flat
-     *        list.
-     * @return a tree structured list of {@link GLCallNode} objects
-     */
-    public static List<GLCallNode> constructCallHierarchy(GLTrace trace, int start, int end,
-            int contextToGroup) {
-        if (trace == null) {
-            return Collections.emptyList();
-        }
-
-        if (contextToGroup < 0 || contextToGroup > trace.getContexts().size()) {
-            return flatHierarchy(trace, start, end);
-        }
-
-        List<GLCall> calls = trace.getGLCalls();
-
-        Stack<GLTreeNode> hierarchyStack = new Stack<GLTreeNode>();
-        List<GLCallNode> items = new ArrayList<GLCallNode>();
-
-        for (int i = start; i < end; i++) {
-            GLCall c = calls.get(i);
-            if (c.getContextId() != contextToGroup) {
-                // skip this call if it is not part of the context we need to display
-                continue;
-            }
-
-            if (c.getFunction() == Function.glPushGroupMarkerEXT) {
-                GLTreeNode group = new GLTreeNode(c);
-                if (hierarchyStack.size() > 0) {
-                    hierarchyStack.peek().addChild(group);
-                } else {
-                    items.add(group);
-                }
-                hierarchyStack.push(group);
-            } else if (c.getFunction() == Function.glPopGroupMarkerEXT) {
-                if (hierarchyStack.size() > 0) {
-                    hierarchyStack.pop();
-                } else {
-                    // FIXME: If we are attempting to pop from an empty stack,
-                    // that implies that a push marker was seen in a prior frame
-                    // (in a call before @start). In such a case, we simply continue
-                    // adding further calls to the root of the hierarchy rather than
-                    // searching backwards in the call list for the corresponding
-                    // push markers.
-                    items.add(new GLLeafNode(c));
-                }
-            } else {
-              GLLeafNode leaf = new GLLeafNode(c);
-              if (hierarchyStack.size() > 0) {
-                  hierarchyStack.peek().addChild(leaf);
-              } else {
-                  items.add(leaf);
-              }
-            }
-        }
-
-        return items;
-    }
-
-    private static List<GLCallNode> flatHierarchy(GLTrace trace, int start, int end) {
-        List<GLCallNode> items = new ArrayList<GLCallNode>();
-
-        List<GLCall> calls = trace.getGLCalls();
-        for (int i = start; i < end; i++) {
-            items.add(new GLLeafNode(calls.get(i)));
-        }
-
-        return items;
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/editors/GLFunctionTraceViewer.java b/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/editors/GLFunctionTraceViewer.java
deleted file mode 100644
index b809ddd..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/editors/GLFunctionTraceViewer.java
+++ /dev/null
@@ -1,984 +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.eclipse.gltrace.editors;
-
-import com.android.ddmuilib.AbstractBufferFindTarget;
-import com.android.ddmuilib.FindDialog;
-import com.android.ide.eclipse.gltrace.GLProtoBuf.GLMessage.Function;
-import com.android.ide.eclipse.gltrace.GlTracePlugin;
-import com.android.ide.eclipse.gltrace.SwtUtils;
-import com.android.ide.eclipse.gltrace.TraceFileParserTask;
-import com.android.ide.eclipse.gltrace.editors.DurationMinimap.ICallSelectionListener;
-import com.android.ide.eclipse.gltrace.editors.GLCallGroups.GLCallNode;
-import com.android.ide.eclipse.gltrace.model.GLCall;
-import com.android.ide.eclipse.gltrace.model.GLFrame;
-import com.android.ide.eclipse.gltrace.model.GLTrace;
-import com.android.ide.eclipse.gltrace.views.FrameSummaryViewPage;
-import com.android.ide.eclipse.gltrace.views.detail.DetailsPage;
-import com.google.common.base.Charsets;
-import com.google.common.io.Files;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.core.runtime.jobs.Job;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.dialogs.ErrorDialog;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.jface.dialogs.ProgressMonitorDialog;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.viewers.CellLabelProvider;
-import org.eclipse.jface.viewers.ColumnLabelProvider;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.ISelectionProvider;
-import org.eclipse.jface.viewers.ITreeContentProvider;
-import org.eclipse.jface.viewers.TreeViewer;
-import org.eclipse.jface.viewers.TreeViewerColumn;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerCell;
-import org.eclipse.jface.viewers.ViewerFilter;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.dnd.Clipboard;
-import org.eclipse.swt.dnd.TextTransfer;
-import org.eclipse.swt.dnd.Transfer;
-import org.eclipse.swt.events.ControlAdapter;
-import org.eclipse.swt.events.ControlEvent;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Combo;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.FileDialog;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Scale;
-import org.eclipse.swt.widgets.ScrollBar;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Spinner;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.swt.widgets.ToolBar;
-import org.eclipse.swt.widgets.ToolItem;
-import org.eclipse.swt.widgets.Tree;
-import org.eclipse.swt.widgets.TreeColumn;
-import org.eclipse.swt.widgets.TreeItem;
-import org.eclipse.ui.IActionBars;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorSite;
-import org.eclipse.ui.ISharedImages;
-import org.eclipse.ui.IURIEditorInput;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.actions.ActionFactory;
-import org.eclipse.ui.part.EditorPart;
-
-import java.io.File;
-import java.io.IOException;
-import java.lang.reflect.InvocationTargetException;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-/** Display OpenGL function trace in a tabular view. */
-public class GLFunctionTraceViewer extends EditorPart implements ISelectionProvider {
-    public static final String ID = "com.android.ide.eclipse.gltrace.GLFunctionTrace"; //$NON-NLS-1$
-
-    private static final String DEFAULT_FILTER_MESSAGE = "Filter list of OpenGL calls. Accepts Java regexes.";
-    private static final String NEWLINE = System.getProperty("line.separator"); //$NON-NLS-1$
-
-    private static Image sExpandAllIcon;
-
-    private static String sLastExportedToFolder;
-
-    private String mFilePath;
-    private Scale mFrameSelectionScale;
-    private Spinner mFrameSelectionSpinner;
-
-    private GLTrace mTrace;
-
-    private TreeViewer mFrameTreeViewer;
-    private List<GLCallNode> mTreeViewerNodes;
-
-    private Text mFilterText;
-    private GLCallFilter mGLCallFilter;
-
-    private Color mGldrawTextColor;
-    private Color mGlCallErrorColor;
-
-    /**
-     * Job to refresh the tree view & frame summary view.
-     *
-     * When the currently displayed frame is changed, either via the {@link #mFrameSelectionScale}
-     * or via {@link #mFrameSelectionSpinner}, we need to update the displayed tree of calls for
-     * that frame, and the frame summary view. Both these operations need to happen on the UI
-     * thread, but are time consuming. This works out ok if the frame selection is not changing
-     * rapidly (i.e., when the spinner or scale is moved to the target frame in a single action).
-     * However, if the spinner is constantly pressed, then the user is scrolling through a sequence
-     * of frames, and rather than refreshing the details for each of the intermediate frames,
-     * we create a job to refresh the details and schedule the job after a short interval
-     * {@link #TREE_REFRESH_INTERVAL}. This allows us to stay responsive to the spinner/scale,
-     * and not do the costly refresh for each of the intermediate frames.
-     */
-    private Job mTreeRefresherJob;
-    private final Object mTreeRefresherLock = new Object();
-    private static final int TREE_REFRESH_INTERVAL_MS = 250;
-
-    private int mCurrentFrame;
-
-    // Currently displayed frame's start and end call indices.
-    private int mCallStartIndex;
-    private int mCallEndIndex;
-
-    private DurationMinimap mDurationMinimap;
-    private ScrollBar mVerticalScrollBar;
-
-    private Combo mContextSwitchCombo;
-    private boolean mShowContextSwitcher;
-    private int mCurrentlyDisplayedContext = -1;
-
-    private StateViewPage mStateViewPage;
-    private FrameSummaryViewPage mFrameSummaryViewPage;
-    private DetailsPage mDetailsPage;
-
-    private ToolItem mExpandAllToolItem;
-    private ToolItem mCollapseAllToolItem;
-    private ToolItem mSaveAsToolItem;
-
-    public GLFunctionTraceViewer() {
-        mGldrawTextColor = Display.getDefault().getSystemColor(SWT.COLOR_BLUE);
-        mGlCallErrorColor = Display.getDefault().getSystemColor(SWT.COLOR_RED);
-    }
-
-    @Override
-    public void doSave(IProgressMonitor monitor) {
-    }
-
-    @Override
-    public void doSaveAs() {
-    }
-
-    @Override
-    public void init(IEditorSite site, IEditorInput input) throws PartInitException {
-        // we use a IURIEditorInput to allow opening files not within the workspace
-        if (!(input instanceof IURIEditorInput)) {
-            throw new PartInitException("GL Function Trace View: unsupported input type.");
-        }
-
-        setSite(site);
-        setInput(input);
-        mFilePath = ((IURIEditorInput) input).getURI().getPath();
-
-        // set the editor part name to be the name of the file.
-        File f = new File(mFilePath);
-        setPartName(f.getName());
-    }
-
-    @Override
-    public boolean isDirty() {
-        return false;
-    }
-
-    @Override
-    public boolean isSaveAsAllowed() {
-        return false;
-    }
-
-    @Override
-    public void createPartControl(Composite parent) {
-        Composite c = new Composite(parent, SWT.NONE);
-        c.setLayout(new GridLayout(1, false));
-        GridData gd = new GridData(GridData.FILL_BOTH);
-        c.setLayoutData(gd);
-
-        setInput(parent.getShell(), mFilePath);
-
-        createFrameSelectionControls(c);
-        createOptionsBar(c);
-        createFrameTraceView(c);
-
-        getSite().setSelectionProvider(mFrameTreeViewer);
-
-        IActionBars actionBars = getEditorSite().getActionBars();
-        actionBars.setGlobalActionHandler(ActionFactory.COPY.getId(),
-                new Action("Copy") {
-            @Override
-            public void run() {
-                copySelectionToClipboard();
-            }
-        });
-
-        actionBars.setGlobalActionHandler(ActionFactory.SELECT_ALL.getId(),
-                new Action("Select All") {
-            @Override
-            public void run() {
-                selectAll();
-            }
-        });
-
-        actionBars.setGlobalActionHandler(ActionFactory.FIND.getId(),
-                new Action("Find") {
-            @Override
-            public void run() {
-                showFindDialog();
-            }
-        });
-    }
-
-    public void setInput(Shell shell, String tracePath) {
-        ProgressMonitorDialog dlg = new ProgressMonitorDialog(shell);
-        TraceFileParserTask parser = new TraceFileParserTask(mFilePath);
-        try {
-            dlg.run(true, true, parser);
-        } catch (InvocationTargetException e) {
-            // exception while parsing, display error to user
-            MessageDialog.openError(shell,
-                    "Error parsing OpenGL Trace File",
-                    e.getCause().getMessage());
-            return;
-        } catch (InterruptedException e) {
-            // operation canceled by user, just return
-            return;
-        }
-
-        mTrace = parser.getTrace();
-        mShowContextSwitcher = (mTrace == null) ? false : mTrace.getContexts().size() > 1;
-        if (mStateViewPage != null) {
-            mStateViewPage.setInput(mTrace);
-        }
-        if (mFrameSummaryViewPage != null) {
-            mFrameSummaryViewPage.setInput(mTrace);
-        }
-        if (mDetailsPage != null) {
-            mDetailsPage.setInput(mTrace);
-        }
-        if (mDurationMinimap != null) {
-            mDurationMinimap.setInput(mTrace);
-        }
-
-        Display.getDefault().asyncExec(new Runnable() {
-            @Override
-            public void run() {
-                refreshUI();
-            }
-        });
-    }
-
-    private void refreshUI() {
-        if (mTrace == null || mTrace.getGLCalls().size() == 0) {
-            setFrameCount(0);
-            return;
-        }
-
-        setFrameCount(mTrace.getFrames().size());
-        selectFrame(1);
-    }
-
-    private void createFrameSelectionControls(Composite parent) {
-        Composite c = new Composite(parent, SWT.NONE);
-        c.setLayout(new GridLayout(3, false));
-        GridData gd = new GridData(GridData.FILL_HORIZONTAL);
-        c.setLayoutData(gd);
-
-        Label l = new Label(c, SWT.NONE);
-        l.setText("Select Frame:");
-
-        mFrameSelectionScale = new Scale(c, SWT.HORIZONTAL);
-        mFrameSelectionScale.setMinimum(1);
-        mFrameSelectionScale.setMaximum(1);
-        mFrameSelectionScale.setSelection(0);
-        gd = new GridData(GridData.FILL_HORIZONTAL);
-        mFrameSelectionScale.setLayoutData(gd);
-
-        mFrameSelectionScale.addSelectionListener(new SelectionAdapter() {
-            @Override
-            public void widgetSelected(SelectionEvent e) {
-                int selectedFrame = mFrameSelectionScale.getSelection();
-                mFrameSelectionSpinner.setSelection(selectedFrame);
-                selectFrame(selectedFrame);
-            }
-        });
-
-        mFrameSelectionSpinner = new Spinner(c, SWT.BORDER);
-        gd = new GridData();
-        // width to hold atleast 6 digits
-        gd.widthHint = SwtUtils.getApproximateFontWidth(mFrameSelectionSpinner) * 6;
-        mFrameSelectionSpinner.setLayoutData(gd);
-
-        mFrameSelectionSpinner.setMinimum(1);
-        mFrameSelectionSpinner.setMaximum(1);
-        mFrameSelectionSpinner.setSelection(0);
-        mFrameSelectionSpinner.addSelectionListener(new SelectionAdapter() {
-            @Override
-            public void widgetSelected(SelectionEvent e) {
-                int selectedFrame = mFrameSelectionSpinner.getSelection();
-                mFrameSelectionScale.setSelection(selectedFrame);
-                selectFrame(selectedFrame);
-            }
-        });
-    }
-
-    private void setFrameCount(int nFrames) {
-        boolean en = nFrames > 0;
-        mFrameSelectionScale.setEnabled(en);
-        mFrameSelectionSpinner.setEnabled(en);
-
-        mFrameSelectionScale.setMaximum(nFrames);
-        mFrameSelectionSpinner.setMaximum(nFrames);
-    }
-
-    private void selectFrame(int selectedFrame) {
-        mFrameSelectionScale.setSelection(selectedFrame);
-        mFrameSelectionSpinner.setSelection(selectedFrame);
-
-        synchronized (mTreeRefresherLock) {
-            if (mTrace != null) {
-                GLFrame f = mTrace.getFrame(selectedFrame - 1);
-                mCallStartIndex = f.getStartIndex();
-                mCallEndIndex = f.getEndIndex();
-            } else {
-                mCallStartIndex = mCallEndIndex = 0;
-            }
-
-            mCurrentFrame = selectedFrame - 1;
-
-            scheduleNewRefreshJob();
-        }
-
-        // update minimap view
-        mDurationMinimap.setCallRangeForCurrentFrame(mCallStartIndex, mCallEndIndex);
-    }
-
-    /**
-     * Show only calls from the given context
-     * @param context context id whose calls should be displayed. Illegal values will result in
-     *                calls from all contexts being displayed.
-     */
-    private void selectContext(int context) {
-        if (mCurrentlyDisplayedContext == context) {
-            return;
-        }
-
-        synchronized (mTreeRefresherLock) {
-            mCurrentlyDisplayedContext = context;
-            scheduleNewRefreshJob();
-        }
-    }
-
-    private void scheduleNewRefreshJob() {
-        if (mTreeRefresherJob != null) {
-            return;
-        }
-
-        mTreeRefresherJob = new Job("Refresh GL Trace View Tree") {
-            @Override
-            protected IStatus run(IProgressMonitor monitor) {
-                final int start, end, context;
-
-                synchronized (mTreeRefresherLock) {
-                    start = mCallStartIndex;
-                    end = mCallEndIndex;
-                    context = mCurrentlyDisplayedContext;
-
-                    mTreeRefresherJob = null;
-                }
-
-                // update tree view in the editor
-                Display.getDefault().syncExec(new Runnable() {
-                    @Override
-                    public void run() {
-                        refreshTree(start, end, context);
-
-                        // update the frame summary view
-                        if (mFrameSummaryViewPage != null) {
-                            mFrameSummaryViewPage.setSelectedFrame(mCurrentFrame);
-                        }
-                    }
-                });
-                return Status.OK_STATUS;
-            }
-        };
-        mTreeRefresherJob.setPriority(Job.SHORT);
-        mTreeRefresherJob.schedule(TREE_REFRESH_INTERVAL_MS);
-    }
-
-    private void refreshTree(int startCallIndex, int endCallIndex, int contextToDisplay) {
-        mTreeViewerNodes = GLCallGroups.constructCallHierarchy(mTrace,
-                startCallIndex, endCallIndex,
-                contextToDisplay);
-        mFrameTreeViewer.setInput(mTreeViewerNodes);
-        mFrameTreeViewer.refresh();
-        mFrameTreeViewer.expandAll();
-    }
-
-    private void createOptionsBar(Composite parent) {
-        int numColumns = mShowContextSwitcher ? 4 : 3;
-
-        Composite c = new Composite(parent, SWT.NONE);
-        c.setLayout(new GridLayout(numColumns, false));
-        GridData gd = new GridData(GridData.FILL_HORIZONTAL);
-        c.setLayoutData(gd);
-
-        Label l = new Label(c, SWT.NONE);
-        l.setText("Filter:");
-
-        mFilterText = new Text(c, SWT.BORDER | SWT.ICON_SEARCH | SWT.SEARCH | SWT.ICON_CANCEL);
-        mFilterText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-        mFilterText.setMessage(DEFAULT_FILTER_MESSAGE);
-        mFilterText.addModifyListener(new ModifyListener() {
-            @Override
-            public void modifyText(ModifyEvent e) {
-                updateAppliedFilters();
-            }
-        });
-
-        if (mShowContextSwitcher) {
-            mContextSwitchCombo = new Combo(c, SWT.BORDER | SWT.READ_ONLY);
-
-            // Setup the combo such that "All Contexts" is the first item,
-            // and then we have an item for each context.
-            mContextSwitchCombo.add("All Contexts");
-            mContextSwitchCombo.select(0);
-            mCurrentlyDisplayedContext = -1; // showing all contexts
-            for (int i = 0; i < mTrace.getContexts().size(); i++) {
-                mContextSwitchCombo.add("Context " + i);
-            }
-
-            mContextSwitchCombo.addSelectionListener(new SelectionAdapter() {
-                @Override
-                public void widgetSelected(SelectionEvent e) {
-                    selectContext(mContextSwitchCombo.getSelectionIndex() - 1);
-                }
-            });
-        } else {
-            mCurrentlyDisplayedContext = 0;
-        }
-
-        ToolBar toolBar = new ToolBar(c, SWT.FLAT | SWT.BORDER);
-
-        mExpandAllToolItem = new ToolItem(toolBar, SWT.PUSH);
-        mExpandAllToolItem.setToolTipText("Expand All");
-        if (sExpandAllIcon == null) {
-            ImageDescriptor id = GlTracePlugin.getImageDescriptor("/icons/expandall.png");
-            sExpandAllIcon = id.createImage();
-        }
-        if (sExpandAllIcon != null) {
-            mExpandAllToolItem.setImage(sExpandAllIcon);
-        }
-
-        mCollapseAllToolItem = new ToolItem(toolBar, SWT.PUSH);
-        mCollapseAllToolItem.setToolTipText("Collapse All");
-        mCollapseAllToolItem.setImage(
-                PlatformUI.getWorkbench().getSharedImages().getImage(
-                        ISharedImages.IMG_ELCL_COLLAPSEALL));
-
-        mSaveAsToolItem = new ToolItem(toolBar, SWT.PUSH);
-        mSaveAsToolItem.setToolTipText("Export Trace");
-        mSaveAsToolItem.setImage(
-                PlatformUI.getWorkbench().getSharedImages().getImage(
-                        ISharedImages.IMG_ETOOL_SAVEAS_EDIT));
-
-        SelectionListener toolbarSelectionListener = new SelectionAdapter() {
-            @Override
-            public void widgetSelected(SelectionEvent e) {
-                if (e.getSource() == mCollapseAllToolItem) {
-                    setTreeItemsExpanded(false);
-                } else if (e.getSource() == mExpandAllToolItem) {
-                    setTreeItemsExpanded(true);
-                } else if (e.getSource() == mSaveAsToolItem) {
-                    exportTrace();
-                }
-            }
-        };
-        mExpandAllToolItem.addSelectionListener(toolbarSelectionListener);
-        mCollapseAllToolItem.addSelectionListener(toolbarSelectionListener);
-        mSaveAsToolItem.addSelectionListener(toolbarSelectionListener);
-    }
-
-    private void updateAppliedFilters() {
-        mGLCallFilter.setFilters(mFilterText.getText().trim());
-        mFrameTreeViewer.refresh();
-    }
-
-    private void createFrameTraceView(Composite parent) {
-        Composite c = new Composite(parent, SWT.NONE);
-        c.setLayout(new GridLayout(2, false));
-        GridData gd = new GridData(GridData.FILL_BOTH);
-        c.setLayoutData(gd);
-
-        final Tree tree = new Tree(c, SWT.BORDER | SWT.FULL_SELECTION | SWT.MULTI);
-        gd = new GridData(GridData.FILL_BOTH);
-        tree.setLayoutData(gd);
-        tree.setLinesVisible(true);
-        tree.setHeaderVisible(true);
-
-        mFrameTreeViewer = new TreeViewer(tree);
-        CellLabelProvider labelProvider = new GLFrameLabelProvider();
-
-        // column showing the GL context id
-        TreeViewerColumn tvc = new TreeViewerColumn(mFrameTreeViewer, SWT.NONE);
-        tvc.setLabelProvider(labelProvider);
-        TreeColumn column = tvc.getColumn();
-        column.setText("Function");
-        column.setWidth(500);
-
-        // column showing the GL function duration (wall clock time)
-        tvc = new TreeViewerColumn(mFrameTreeViewer, SWT.NONE);
-        tvc.setLabelProvider(labelProvider);
-        column = tvc.getColumn();
-        column.setText("Wall Time (ns)");
-        column.setWidth(150);
-        column.setAlignment(SWT.RIGHT);
-
-        // column showing the GL function duration (thread time)
-        tvc = new TreeViewerColumn(mFrameTreeViewer, SWT.NONE);
-        tvc.setLabelProvider(labelProvider);
-        column = tvc.getColumn();
-        column.setText("Thread Time (ns)");
-        column.setWidth(150);
-        column.setAlignment(SWT.RIGHT);
-
-        mFrameTreeViewer.setContentProvider(new GLFrameContentProvider());
-
-        mGLCallFilter = new GLCallFilter();
-        mFrameTreeViewer.addFilter(mGLCallFilter);
-
-        // when the control is resized, give all the additional space
-        // to the function name column.
-        tree.addControlListener(new ControlAdapter() {
-            @Override
-            public void controlResized(ControlEvent e) {
-                int w = mFrameTreeViewer.getTree().getClientArea().width;
-                if (w > 200) {
-                    mFrameTreeViewer.getTree().getColumn(2).setWidth(100);
-                    mFrameTreeViewer.getTree().getColumn(1).setWidth(100);
-                    mFrameTreeViewer.getTree().getColumn(0).setWidth(w - 200);
-                }
-            }
-        });
-
-        mDurationMinimap = new DurationMinimap(c, mTrace);
-        gd = new GridData(GridData.FILL_VERTICAL);
-        gd.widthHint = gd.minimumWidth = mDurationMinimap.getMinimumWidth();
-        mDurationMinimap.setLayoutData(gd);
-        mDurationMinimap.addCallSelectionListener(new ICallSelectionListener() {
-            @Override
-            public void callSelected(int selectedCallIndex) {
-                if (selectedCallIndex > 0 && selectedCallIndex < mTreeViewerNodes.size()) {
-                    TreeItem item = tree.getItem(selectedCallIndex);
-                    tree.select(item);
-                    tree.setTopItem(item);
-                }
-            }
-        });
-
-        mVerticalScrollBar = tree.getVerticalBar();
-        mVerticalScrollBar.addSelectionListener(new SelectionAdapter() {
-            @Override
-            public void widgetSelected(SelectionEvent e) {
-                updateVisibleRange();
-            }
-        });
-    }
-
-    private void updateVisibleRange() {
-        int visibleCallTopIndex = mCallStartIndex;
-        int visibleCallBottomIndex = mCallEndIndex;
-
-        if (mVerticalScrollBar.isEnabled()) {
-            int selection = mVerticalScrollBar.getSelection();
-            int thumb = mVerticalScrollBar.getThumb();
-            int max = mVerticalScrollBar.getMaximum();
-
-            // from the scrollbar values, compute the visible fraction
-            double top = (double) selection / max;
-            double bottom = (double) (selection + thumb) / max;
-
-            // map the fraction to the call indices
-            int range = mCallEndIndex - mCallStartIndex;
-            visibleCallTopIndex = mCallStartIndex + (int) Math.floor(range * top);
-            visibleCallBottomIndex = mCallStartIndex + (int) Math.ceil(range * bottom);
-        }
-
-        mDurationMinimap.setVisibleCallRange(visibleCallTopIndex, visibleCallBottomIndex);
-    }
-
-    @Override
-    public void setFocus() {
-        mFrameTreeViewer.getTree().setFocus();
-    }
-
-    private static class GLFrameContentProvider implements ITreeContentProvider {
-        @Override
-        public void dispose() {
-        }
-
-        @Override
-        public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-        }
-
-        @Override
-        public Object[] getElements(Object inputElement) {
-            return getChildren(inputElement);
-        }
-
-        @Override
-        public Object[] getChildren(Object parentElement) {
-            if (parentElement instanceof List<?>) {
-                return ((List<?>) parentElement).toArray();
-            }
-
-            if (!(parentElement instanceof GLCallNode)) {
-                return null;
-            }
-
-            GLCallNode parent = (GLCallNode) parentElement;
-            if (parent.hasChildren()) {
-                return parent.getChildren().toArray();
-            } else {
-                return new Object[0];
-            }
-        }
-
-        @Override
-        public Object getParent(Object element) {
-            if (!(element instanceof GLCallNode)) {
-                return null;
-            }
-
-            return ((GLCallNode) element).getParent();
-        }
-
-        @Override
-        public boolean hasChildren(Object element) {
-            if (!(element instanceof GLCallNode)) {
-                return false;
-            }
-
-            return ((GLCallNode) element).hasChildren();
-        }
-    }
-
-    private class GLFrameLabelProvider extends ColumnLabelProvider {
-        @Override
-        public void update(ViewerCell cell) {
-            Object element = cell.getElement();
-            if (!(element instanceof GLCallNode)) {
-                return;
-            }
-
-            GLCall c = ((GLCallNode) element).getCall();
-
-            if (c.getFunction() == Function.glDrawArrays
-                    || c.getFunction() == Function.glDrawElements) {
-                cell.setForeground(mGldrawTextColor);
-            }
-
-            if (c.hasErrors()) {
-                cell.setForeground(mGlCallErrorColor);
-            }
-
-            cell.setText(getColumnText(c, cell.getColumnIndex()));
-        }
-
-        private String getColumnText(GLCall c, int columnIndex) {
-            switch (columnIndex) {
-            case 0:
-                if (c.getFunction() == Function.glPushGroupMarkerEXT) {
-                    Object marker = c.getProperty(GLCall.PROPERTY_MARKERNAME);
-                    if (marker instanceof String) {
-                        return ((String) marker);
-                    }
-                }
-                return c.toString();
-            case 1:
-                return formatDuration(c.getWallDuration());
-            case 2:
-                return formatDuration(c.getThreadDuration());
-            default:
-                return Integer.toString(c.getContextId());
-            }
-        }
-
-        private String formatDuration(int time) {
-            // Max duration is in the 10s of milliseconds, so xx,xxx,xxx ns
-            // So we require a format specifier that is 10 characters wide
-            return String.format("%,10d", time);            //$NON-NLS-1$
-        }
-    }
-
-    private static class GLCallFilter extends ViewerFilter {
-        private final List<Pattern> mPatterns = new ArrayList<Pattern>();
-
-        public void setFilters(String filter) {
-            mPatterns.clear();
-
-            // split the user input into multiple regexes
-            // we assume that the regexes are OR'ed together i.e., all text that matches
-            // any one of the regexes will be displayed
-            for (String regex : filter.split(" ")) {
-                mPatterns.add(Pattern.compile(regex, Pattern.CASE_INSENSITIVE));
-            }
-        }
-
-        @Override
-        public boolean select(Viewer viewer, Object parentElement, Object element) {
-            if (!(element instanceof GLCallNode)) {
-                return true;
-            }
-
-            String text = getTextUnderNode((GLCallNode) element);
-
-            if (mPatterns.size() == 0) {
-                // match if there are no regex filters
-                return true;
-            }
-
-            for (Pattern p : mPatterns) {
-                Matcher matcher = p.matcher(text);
-                if (matcher.find()) {
-                    // match if atleast one of the regexes matches this text
-                    return true;
-                }
-            }
-
-            return false;
-        }
-
-        /** Obtain a string representation of all functions under a given tree node. */
-        private String getTextUnderNode(GLCallNode element) {
-            String func = element.getCall().getFunction().toString();
-            if (!element.hasChildren()) {
-                return func;
-            }
-
-            StringBuilder sb = new StringBuilder(100);
-            sb.append(func);
-
-            for (GLCallNode child : element.getChildren()) {
-                sb.append(getTextUnderNode(child));
-            }
-
-            return sb.toString();
-        }
-    }
-
-    @Override
-    public void addSelectionChangedListener(ISelectionChangedListener listener) {
-        if (mFrameTreeViewer != null) {
-            mFrameTreeViewer.addSelectionChangedListener(listener);
-        }
-    }
-
-    @Override
-    public ISelection getSelection() {
-        if (mFrameTreeViewer != null) {
-            return mFrameTreeViewer.getSelection();
-        } else {
-            return null;
-        }
-    }
-
-    @Override
-    public void removeSelectionChangedListener(ISelectionChangedListener listener) {
-        if (mFrameTreeViewer != null) {
-            mFrameTreeViewer.removeSelectionChangedListener(listener);
-        }
-    }
-
-    @Override
-    public void setSelection(ISelection selection) {
-        if (mFrameTreeViewer != null) {
-            mFrameTreeViewer.setSelection(selection);
-        }
-    }
-
-    public GLTrace getTrace() {
-        return mTrace;
-    }
-
-    public StateViewPage getStateViewPage() {
-        if (mStateViewPage == null) {
-            mStateViewPage = new StateViewPage(mTrace);
-        }
-
-        return mStateViewPage;
-    }
-
-    public FrameSummaryViewPage getFrameSummaryViewPage() {
-        if (mFrameSummaryViewPage == null) {
-            mFrameSummaryViewPage = new FrameSummaryViewPage(mTrace);
-        }
-
-        return mFrameSummaryViewPage;
-    }
-
-    public DetailsPage getDetailsPage() {
-        if (mDetailsPage == null) {
-            mDetailsPage = new DetailsPage(mTrace);
-        }
-
-        return mDetailsPage;
-    }
-
-    private void copySelectionToClipboard() {
-        if (mFrameTreeViewer == null || mFrameTreeViewer.getTree().isDisposed()) {
-            return;
-        }
-
-        StringBuilder sb = new StringBuilder();
-
-        for (TreeItem it: mFrameTreeViewer.getTree().getSelection()) {
-            Object data = it.getData();
-            if (data instanceof GLCallNode) {
-                sb.append(((GLCallNode) data).getCall());
-                sb.append(NEWLINE);
-            }
-        }
-
-        if (sb.length() > 0) {
-            Clipboard cb = new Clipboard(Display.getDefault());
-            cb.setContents(
-                    new Object[] { sb.toString() },
-                    new Transfer[] { TextTransfer.getInstance() });
-            cb.dispose();
-        }
-    }
-
-    private void selectAll() {
-        if (mFrameTreeViewer == null || mFrameTreeViewer.getTree().isDisposed()) {
-            return;
-        }
-
-        mFrameTreeViewer.getTree().selectAll();
-    }
-
-    private void exportTrace() {
-        if (mFrameTreeViewer == null || mFrameTreeViewer.getTree().isDisposed()) {
-            return;
-        }
-
-        if (mCallEndIndex == 0) {
-            return;
-        }
-
-        FileDialog fd = new FileDialog(mFrameTreeViewer.getTree().getShell(), SWT.SAVE);
-        fd.setFilterExtensions(new String[] { "*.txt" });
-        if (sLastExportedToFolder != null) {
-            fd.setFilterPath(sLastExportedToFolder);
-        }
-
-        String path = fd.open();
-        if (path == null) {
-            return;
-        }
-
-        File f = new File(path);
-        sLastExportedToFolder = f.getParent();
-        try {
-            exportFrameTo(f);
-        } catch (IOException e) {
-            ErrorDialog.openError(mFrameTreeViewer.getTree().getShell(),
-                    "Export trace file.",
-                    "Unexpected error exporting trace file.",
-                    new Status(Status.ERROR, GlTracePlugin.PLUGIN_ID, e.toString()));
-        }
-    }
-
-    private void exportFrameTo(File f) throws IOException {
-        String glCalls = serializeGlCalls(mTrace.getGLCalls(), mCallStartIndex, mCallEndIndex);
-        Files.write(glCalls, f, Charsets.UTF_8);
-    }
-
-    private String serializeGlCalls(List<GLCall> glCalls, int start, int end) {
-        StringBuilder sb = new StringBuilder();
-        while (start < end) {
-            sb.append(glCalls.get(start).toString());
-            sb.append("\n"); //$NON-NLS-1$
-            start++;
-        }
-
-        return sb.toString();
-    }
-
-    private void setTreeItemsExpanded(boolean expand) {
-        if (mFrameTreeViewer == null || mFrameTreeViewer.getTree().isDisposed()) {
-            return;
-        }
-
-        if (expand) {
-            mFrameTreeViewer.expandAll();
-        } else {
-            mFrameTreeViewer.collapseAll();
-        }
-    }
-
-    private class TraceViewerFindTarget extends AbstractBufferFindTarget {
-        @Override
-        public int getItemCount() {
-            return mFrameTreeViewer.getTree().getItemCount();
-        }
-
-        @Override
-        public String getItem(int index) {
-            Object data = mFrameTreeViewer.getTree().getItem(index).getData();
-            if (data instanceof GLCallNode) {
-                return ((GLCallNode) data).getCall().toString();
-            }
-            return null;
-        }
-
-        @Override
-        public void selectAndReveal(int index) {
-            Tree t = mFrameTreeViewer.getTree();
-            t.deselectAll();
-            t.select(t.getItem(index));
-            t.showSelection();
-        }
-
-        @Override
-        public int getStartingIndex() {
-            return 0;
-        }
-    };
-
-    private FindDialog mFindDialog;
-    private TraceViewerFindTarget mFindTarget = new TraceViewerFindTarget();
-
-    private void showFindDialog() {
-        if (mFindDialog != null) {
-            // the dialog is already displayed
-            return;
-        }
-
-        mFindDialog = new FindDialog(Display.getDefault().getActiveShell(),
-                mFindTarget,
-                FindDialog.FIND_NEXT_ID);
-        mFindDialog.open(); // blocks until find dialog is closed
-        mFindDialog = null;
-    }
-
-    public String getInputPath() {
-        return mFilePath;
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/editors/StateContentProvider.java b/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/editors/StateContentProvider.java
deleted file mode 100644
index 7bff168..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/editors/StateContentProvider.java
+++ /dev/null
@@ -1,75 +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.eclipse.gltrace.editors;
-
-import com.android.ide.eclipse.gltrace.state.GLCompositeProperty;
-import com.android.ide.eclipse.gltrace.state.GLListProperty;
-import com.android.ide.eclipse.gltrace.state.GLSparseArrayProperty;
-import com.android.ide.eclipse.gltrace.state.IGLProperty;
-
-import org.eclipse.jface.viewers.ITreeContentProvider;
-import org.eclipse.jface.viewers.Viewer;
-
-public class StateContentProvider implements ITreeContentProvider {
-    @Override
-    public void dispose() {
-    }
-
-    @Override
-    public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-    }
-
-    @Override
-    public Object[] getElements(Object inputElement) {
-        return getChildren(inputElement);
-    }
-
-    @Override
-    public Object[] getChildren(Object parentElement) {
-        if (parentElement instanceof GLListProperty) {
-            return ((GLListProperty) parentElement).getList().toArray();
-        }
-
-        if (parentElement instanceof GLCompositeProperty) {
-            return ((GLCompositeProperty) parentElement).getProperties().toArray();
-        }
-
-        if (parentElement instanceof GLSparseArrayProperty) {
-            return ((GLSparseArrayProperty) parentElement).getValues().toArray();
-        }
-
-        return null;
-    }
-
-    @Override
-    public Object getParent(Object element) {
-        if (element instanceof IGLProperty) {
-            return ((IGLProperty) element).getParent();
-        }
-
-        return null;
-    }
-
-    @Override
-    public boolean hasChildren(Object element) {
-        if (element instanceof IGLProperty) {
-            return ((IGLProperty) element).isComposite();
-        }
-
-        return false;
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/editors/StateLabelProvider.java b/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/editors/StateLabelProvider.java
deleted file mode 100644
index e37ea77..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/editors/StateLabelProvider.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.eclipse.gltrace.editors;
-
-import com.android.ide.eclipse.gltrace.state.GLListProperty;
-import com.android.ide.eclipse.gltrace.state.GLSparseArrayProperty;
-import com.android.ide.eclipse.gltrace.state.GLStateType;
-import com.android.ide.eclipse.gltrace.state.IGLProperty;
-
-import org.eclipse.jface.viewers.ColumnLabelProvider;
-import org.eclipse.jface.viewers.ViewerCell;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.widgets.Display;
-
-import java.util.Set;
-
-public class StateLabelProvider extends ColumnLabelProvider {
-    private Set<IGLProperty> mChangedProperties;
-
-    private Color mHighlightForegroundColor;
-    private Color mNormalForegroundColor;
-
-    public StateLabelProvider() {
-        mHighlightForegroundColor = Display.getDefault().getSystemColor(SWT.COLOR_BLUE);
-        mNormalForegroundColor = Display.getDefault().getSystemColor(SWT.COLOR_BLACK);
-    }
-
-    public String getColumnText(IGLProperty property, int columnIndex) {
-        switch (columnIndex) {
-            case 0:
-                return getName(property);
-            case 1:
-                return getValue(property);
-            default:
-                return "";
-        }
-    }
-
-    private String getValue(IGLProperty element) {
-        return element.getStringValue();
-    }
-
-    private String getName(IGLProperty element) {
-        IGLProperty parent = element.getParent();
-        if (parent instanceof GLListProperty) {
-            // For members of list, use the index in the list as the name as opposed to
-            // the property type
-            int index = ((GLListProperty) parent).indexOf(element);
-            if (element.getType() == GLStateType.GL_STATE_ES1) {
-                return String.format("Context %d (ES1)", index);
-            } else if (element.getType() == GLStateType.GL_STATE_ES2) {
-                return String.format("Context %d (ES2)", index);
-            } else {
-                return Integer.toString(index);
-            }
-        } else if (parent instanceof GLSparseArrayProperty) {
-            // For members of sparse array, use the key as the name as opposed to
-            // the property type
-            int index = ((GLSparseArrayProperty) parent).keyFor(element);
-            return Integer.toString(index);
-        }
-
-        return element.getType().getDescription();
-    }
-
-    @Override
-    public void update(ViewerCell cell) {
-        Object element = cell.getElement();
-        if (!(element instanceof IGLProperty)) {
-            return;
-        }
-
-        IGLProperty prop = (IGLProperty) element;
-
-        String text = getColumnText(prop, cell.getColumnIndex());
-        cell.setText(text);
-
-        if (mChangedProperties != null && mChangedProperties.contains(prop)) {
-            cell.setForeground(mHighlightForegroundColor);
-        } else {
-            cell.setForeground(mNormalForegroundColor);
-        }
-    }
-
-    public void setChangedProperties(Set<IGLProperty> changedProperties) {
-        mChangedProperties = changedProperties;
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/editors/StateViewPage.java b/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/editors/StateViewPage.java
deleted file mode 100644
index faa9561..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/editors/StateViewPage.java
+++ /dev/null
@@ -1,372 +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.eclipse.gltrace.editors;
-
-import com.android.ide.eclipse.gltrace.GlTracePlugin;
-import com.android.ide.eclipse.gltrace.editors.GLCallGroups.GLCallNode;
-import com.android.ide.eclipse.gltrace.model.GLCall;
-import com.android.ide.eclipse.gltrace.model.GLTrace;
-import com.android.ide.eclipse.gltrace.state.GLState;
-import com.android.ide.eclipse.gltrace.state.IGLProperty;
-import com.android.ide.eclipse.gltrace.state.StatePrettyPrinter;
-import com.android.ide.eclipse.gltrace.state.transforms.IStateTransform;
-import com.google.common.base.Charsets;
-import com.google.common.io.Files;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.core.runtime.jobs.ILock;
-import org.eclipse.core.runtime.jobs.Job;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.IToolBarManager;
-import org.eclipse.jface.dialogs.ErrorDialog;
-import org.eclipse.jface.layout.GridDataFactory;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.ISelectionProvider;
-import org.eclipse.jface.viewers.TreeSelection;
-import org.eclipse.jface.viewers.TreeViewer;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.FileDialog;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Tree;
-import org.eclipse.swt.widgets.TreeColumn;
-import org.eclipse.ui.ISelectionListener;
-import org.eclipse.ui.ISharedImages;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.part.IPageSite;
-import org.eclipse.ui.part.Page;
-
-import java.io.File;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-/**
- * A tree view of the OpenGL state. It listens to the current GLCall that is selected
- * in the Function Trace view, and updates its view to reflect the state as of the selected call.
- */
-public class StateViewPage extends Page implements ISelectionListener, ISelectionProvider {
-    public static final String ID = "com.android.ide.eclipse.gltrace.views.GLState"; //$NON-NLS-1$
-    private static String sLastUsedPath;
-    private static final ILock sGlStateLock = Job.getJobManager().newLock();
-
-    private GLTrace mTrace;
-    private List<GLCall> mGLCalls;
-
-    /** OpenGL State as of call {@link #mCurrentStateIndex}. */
-    private IGLProperty mState;
-    private int mCurrentStateIndex;
-
-    private String[] TREE_PROPERTIES = { "Name", "Value" };
-    private TreeViewer mTreeViewer;
-    private StateLabelProvider mLabelProvider;
-
-    public StateViewPage(GLTrace trace) {
-        setInput(trace);
-    }
-
-    public void setInput(GLTrace trace) {
-        mTrace = trace;
-        if (trace != null) {
-            mGLCalls = trace.getGLCalls();
-        } else {
-            mGLCalls = null;
-        }
-
-        mState = GLState.createDefaultState();
-        mCurrentStateIndex = -1;
-
-        if (mTreeViewer != null) {
-            mTreeViewer.setInput(mState);
-            mTreeViewer.refresh();
-        }
-    }
-
-    @Override
-    public void createControl(Composite parent) {
-        final Tree tree = new Tree(parent, SWT.VIRTUAL | SWT.H_SCROLL | SWT.V_SCROLL);
-        GridDataFactory.fillDefaults().grab(true, true).applyTo(tree);
-
-        tree.setHeaderVisible(true);
-        tree.setLinesVisible(true);
-        tree.setLayoutData(new GridData(GridData.FILL_BOTH));
-
-        TreeColumn col1 = new TreeColumn(tree, SWT.LEFT);
-        col1.setText(TREE_PROPERTIES[0]);
-        col1.setWidth(200);
-
-        TreeColumn col2 = new TreeColumn(tree, SWT.LEFT);
-        col2.setText(TREE_PROPERTIES[1]);
-        col2.setWidth(200);
-
-        mTreeViewer = new TreeViewer(tree);
-        mTreeViewer.setContentProvider(new StateContentProvider());
-        mLabelProvider = new StateLabelProvider();
-        mTreeViewer.setLabelProvider(mLabelProvider);
-        mTreeViewer.setInput(mState);
-        mTreeViewer.refresh();
-
-        final IToolBarManager manager = getSite().getActionBars().getToolBarManager();
-        manager.add(new Action("Save to File",
-                PlatformUI.getWorkbench().getSharedImages().getImageDescriptor(
-                        ISharedImages.IMG_ETOOL_SAVEAS_EDIT)) {
-            @Override
-            public void run() {
-                saveCurrentState();
-            }
-        });
-    }
-
-    private void saveCurrentState() {
-        final Shell shell = mTreeViewer.getTree().getShell();
-        FileDialog fd = new FileDialog(shell, SWT.SAVE);
-        fd.setFilterExtensions(new String[] { "*.txt" });
-        if (sLastUsedPath != null) {
-            fd.setFilterPath(sLastUsedPath);
-        }
-
-        String path = fd.open();
-        if (path == null) {
-            return;
-        }
-
-        File f = new File(path);
-        sLastUsedPath = f.getParent();
-
-        // export state to f
-        StatePrettyPrinter pp = new StatePrettyPrinter();
-        synchronized (sGlStateLock) {
-            mState.prettyPrint(pp);
-        }
-
-        try {
-            Files.write(pp.toString(), f, Charsets.UTF_8);
-        } catch (IOException e) {
-            ErrorDialog.openError(shell,
-                    "Export GL State",
-                    "Unexpected error while writing GL state to file.",
-                    new Status(Status.ERROR, GlTracePlugin.PLUGIN_ID, e.toString()));
-        }
-    }
-
-    @Override
-    public void init(IPageSite pageSite) {
-        super.init(pageSite);
-        pageSite.getPage().addSelectionListener(this);
-    }
-
-    @Override
-    public void dispose() {
-        getSite().getPage().removeSelectionListener(this);
-        super.dispose();
-    }
-
-    @Override
-    public void selectionChanged(IWorkbenchPart part, ISelection selection) {
-        if (!(part instanceof GLFunctionTraceViewer)) {
-            return;
-        }
-
-        if (((GLFunctionTraceViewer) part).getTrace() != mTrace) {
-            return;
-        }
-
-        if (!(selection instanceof TreeSelection)) {
-            return;
-        }
-
-        GLCall selectedCall = null;
-
-        Object data = ((TreeSelection) selection).getFirstElement();
-        if (data instanceof GLCallNode) {
-            selectedCall = ((GLCallNode) data).getCall();
-        }
-
-        if (selectedCall == null) {
-            return;
-        }
-
-        final int selectedCallIndex = selectedCall.getIndex();
-
-        // Creation of texture images takes a few seconds on the first run. So run
-        // the update task as an Eclipse job.
-        Job job = new Job("Updating GL State") {
-            @Override
-            protected IStatus run(IProgressMonitor monitor) {
-                Set<IGLProperty> changedProperties = null;
-
-                try {
-                    sGlStateLock.acquire();
-                    changedProperties = updateState(mCurrentStateIndex,
-                            selectedCallIndex);
-                    mCurrentStateIndex = selectedCallIndex;
-                } catch (Exception e) {
-                    GlTracePlugin.getDefault().logMessage(
-                            "Unexpected error while updating GL State.");
-                    GlTracePlugin.getDefault().logMessage(e.getMessage());
-                    return new Status(Status.ERROR,
-                            GlTracePlugin.PLUGIN_ID,
-                            "Unexpected error while updating GL State.",
-                            e);
-                } finally {
-                    sGlStateLock.release();
-                }
-
-                mLabelProvider.setChangedProperties(changedProperties);
-                Display.getDefault().syncExec(new Runnable() {
-                    @Override
-                    public void run() {
-                        if (!mTreeViewer.getTree().isDisposed()) {
-                            mTreeViewer.refresh();
-                        }
-                    }
-                });
-
-                return Status.OK_STATUS;
-            }
-        };
-        job.setPriority(Job.SHORT);
-        job.schedule();
-    }
-
-    @Override
-    public Control getControl() {
-        if (mTreeViewer == null) {
-            return null;
-        }
-
-        return mTreeViewer.getControl();
-    }
-
-    @Override
-    public void setFocus() {
-    }
-
-    /**
-     * Update GL state from GL call at fromIndex to the call at toIndex.
-     * If fromIndex < toIndex, the GL state will be updated by applying all the transformations
-     * corresponding to calls from (fromIndex + 1) to toIndex (inclusive).
-     * If fromIndex > toIndex, the GL state will be updated by reverting all the calls from
-     * fromIndex (inclusive) to (toIndex + 1).
-     * @return GL state properties that changed as a result of this update.
-     */
-    private Set<IGLProperty> updateState(int fromIndex, int toIndex) {
-        assert fromIndex >= -1 && fromIndex < mGLCalls.size();
-        assert toIndex >= 0 && toIndex < mGLCalls.size();
-
-        if (fromIndex < toIndex) {
-            return applyTransformations(fromIndex, toIndex);
-        } else if (fromIndex > toIndex) {
-            return revertTransformations(fromIndex, toIndex);
-        } else {
-            return Collections.emptySet();
-        }
-    }
-
-    private Set<IGLProperty> applyTransformations(int fromIndex, int toIndex) {
-        int setSizeHint = 3 * (toIndex - fromIndex) + 10;
-        Set<IGLProperty> changedProperties = new HashSet<IGLProperty>(setSizeHint);
-
-        for (int i = fromIndex + 1; i <= toIndex; i++) {
-            GLCall call = mGLCalls.get(i);
-            for (IStateTransform f : call.getStateTransformations()) {
-                try {
-                    f.apply(mState);
-                    IGLProperty changedProperty = f.getChangedProperty(mState);
-                    if (changedProperty != null) {
-                        changedProperties.addAll(getHierarchy(changedProperty));
-                    }
-                } catch (Exception e) {
-                    GlTracePlugin.getDefault().logMessage("Error applying transformations for "
-                            + call);
-                    GlTracePlugin.getDefault().logMessage(e.toString());
-                }
-            }
-        }
-
-        return changedProperties;
-    }
-
-    private Set<IGLProperty> revertTransformations(int fromIndex, int toIndex) {
-        int setSizeHint = 3 * (fromIndex - toIndex) + 10;
-        Set<IGLProperty> changedProperties = new HashSet<IGLProperty>(setSizeHint);
-
-        for (int i = fromIndex; i > toIndex; i--) {
-            List<IStateTransform> transforms = mGLCalls.get(i).getStateTransformations();
-            // When reverting transformations, iterate from the last to first so that the reversals
-            // are performed in the correct sequence.
-            for (int j = transforms.size() - 1; j >= 0; j--) {
-                IStateTransform f = transforms.get(j);
-                f.revert(mState);
-
-                IGLProperty changedProperty = f.getChangedProperty(mState);
-                if (changedProperty != null) {
-                    changedProperties.addAll(getHierarchy(changedProperty));
-                }
-            }
-        }
-
-        return changedProperties;
-    }
-
-    /**
-     * Obtain the list of properties starting from the provided property up to
-     * the root of GL state.
-     */
-    private List<IGLProperty> getHierarchy(IGLProperty changedProperty) {
-        List<IGLProperty> changedProperties = new ArrayList<IGLProperty>(5);
-        changedProperties.add(changedProperty);
-
-        // add the entire parent chain until we reach the root
-        IGLProperty prop = changedProperty;
-        while ((prop = prop.getParent()) != null) {
-            changedProperties.add(prop);
-        }
-
-        return changedProperties;
-    }
-
-    @Override
-    public void addSelectionChangedListener(ISelectionChangedListener listener) {
-        mTreeViewer.addSelectionChangedListener(listener);
-    }
-
-    @Override
-    public ISelection getSelection() {
-        return mTreeViewer.getSelection();
-    }
-
-    @Override
-    public void removeSelectionChangedListener(ISelectionChangedListener listener) {
-        mTreeViewer.removeSelectionChangedListener(listener);
-    }
-
-    @Override
-    public void setSelection(ISelection selection) {
-        mTreeViewer.setSelection(selection);
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/format/GLAPISpec.java b/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/format/GLAPISpec.java
deleted file mode 100644
index 57b587c..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/format/GLAPISpec.java
+++ /dev/null
@@ -1,134 +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.eclipse.gltrace.format;
-
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-/**
- * Model a single GL API function call's specification.
- */
-public class GLAPISpec {
-    private static final String GL_SPECS_FILE = "/entries.in"; //$NON-NLS-1$
-    private static final String GLES2_ENTRIES_HEADER_V1 =
-            "# com.android.ide.eclipse.gltrace.glentries, v1"; //$NON-NLS-1$
-    private static Map<String, GLAPISpec> sApiSpecs;
-
-    private final String mGLFunction;
-    private final GLDataTypeSpec mReturnType;
-    private final List<GLDataTypeSpec> mArgs;
-
-    private GLAPISpec(String glFunction, GLDataTypeSpec returnType, List<GLDataTypeSpec> args) {
-        mGLFunction = glFunction;
-        mReturnType = returnType;
-        mArgs = args;
-    }
-
-    public String getFunction() {
-        return mGLFunction;
-    }
-
-    public GLDataTypeSpec getReturnValue() {
-        return mReturnType;
-    }
-
-    public List<GLDataTypeSpec> getArgs() {
-        return mArgs;
-    }
-
-    public static Map<String, GLAPISpec> getSpecs() {
-        if (sApiSpecs == null) {
-            sApiSpecs = parseApiSpecs(GLAPISpec.class.getResourceAsStream(GL_SPECS_FILE));
-        }
-
-        return sApiSpecs;
-    }
-
-    private static Map<String, GLAPISpec> parseApiSpecs(InputStream specFile) {
-        BufferedReader reader = new BufferedReader(new InputStreamReader(specFile));
-        Map<String, GLAPISpec> specs = new HashMap<String, GLAPISpec>(400);
-
-        try{
-            String header = reader.readLine().trim();
-            assert header.equals(GLES2_ENTRIES_HEADER_V1);
-
-            String line;
-            while ((line = reader.readLine()) != null) {
-                // strip away the comments
-                int commentPos = line.indexOf('#');
-                if (commentPos != -1) {
-                    line = line.substring(0, commentPos);
-                }
-                line = line.trim();
-
-                // parse non empty lines
-                if (line.length() > 0) {
-                    GLAPISpec spec = parseLine(line);
-                    specs.put(spec.getFunction(), spec);
-                }
-            }
-
-            specFile.close();
-        } catch (IOException e) {
-            // this is unlikely to happen as the file is present within this .jar file.
-            // Even if it does happen, we just return whatever we've read till now. The net
-            // impact will be that the function calls will not be parsed fully and will just
-            // display the function name.
-        }
-
-        return specs;
-    }
-
-    /**
-     * Parse a GL API Specification entry from "/entries.in". Each line is of the format:
-     * {@code returnType, funcName, arg*}. This method is package private for testing.
-     */
-    static GLAPISpec parseLine(String line) {
-        List<String> words = Arrays.asList(line.split(","));
-
-        String retType = words.get(0).trim();
-        String func = words.get(1).trim();
-        List<String> argDefinitions = words.subList(2, words.size());
-
-        List<GLDataTypeSpec> glArgs = new ArrayList<GLDataTypeSpec>(argDefinitions.size()/2);
-        for (String argDefn: argDefinitions) {
-            // an argDefn is something like: "const GLvoid* data"
-            argDefn = argDefn.trim();
-            int lastSeparator = argDefn.lastIndexOf(' ');
-            if (lastSeparator == -1) {
-                // no space => a void type with no argument name
-                glArgs.add(new GLDataTypeSpec(argDefn, null));
-            } else {
-                // everything upto the last space is the type
-                String type = argDefn.substring(0, lastSeparator);
-
-                // and the last word is the variable name
-                String name = argDefn.substring(lastSeparator + 1);
-                glArgs.add(new GLDataTypeSpec(type, name));
-            }
-        }
-
-        return new GLAPISpec(func, new GLDataTypeSpec(retType, null), glArgs);
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/format/GLDataTypeSpec.java b/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/format/GLDataTypeSpec.java
deleted file mode 100644
index de9c9b6..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/format/GLDataTypeSpec.java
+++ /dev/null
@@ -1,75 +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.eclipse.gltrace.format;
-
-import com.android.ide.eclipse.gltrace.GLProtoBuf.GLMessage.DataType.Type;
-
-public class GLDataTypeSpec {
-    private final String mCType;
-    private final Type mType;
-    private final String mName;
-    private final boolean mIsPointer;
-
-    public GLDataTypeSpec(String type, String name) {
-        mCType = type;
-        mName = name;
-
-        mType = getDataType(type);
-        mIsPointer = type.contains("*");        //$NON-NLS-1$
-    }
-
-    private Type getDataType(String type) {
-        type = type.toLowerCase();
-
-        // We use type.contains() rather than type.equals since we are matching against
-        // the type name along with qualifiers. e.g. "void", "GLvoid" and "void*" should
-        // all be assigned the same type.
-        if (type.contains("boolean")) {         //$NON-NLS-1$
-            return Type.BOOL;
-        } else if (type.contains("enum")) {     //$NON-NLS-1$
-            return Type.ENUM;
-        } else if (type.contains("float") || type.contains("clampf")) { //$NON-NLS-1$ //$NON-NLS-2$
-            return Type.FLOAT;
-        } else if (type.contains("void")) {     //$NON-NLS-1$
-            return Type.VOID;
-        } else if (type.contains("char")) {     //$NON-NLS-1$
-            return Type.CHAR;
-        } else {
-            // Matches all of the following types:
-            // glclampx, gluint, glint, glshort, glsizei, glfixed,
-            // glsizeiptr, glintptr, glbitfield, glfixed, glubyte.
-            // We might do custom formatting for these types in the future.
-            return Type.INT;
-        }
-    }
-
-    public Type getDataType() {
-        return mType;
-    }
-
-    public String getCType() {
-        return mCType;
-    }
-
-    public String getArgName() {
-        return mName;
-    }
-
-    public boolean isPointer() {
-        return mIsPointer;
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/format/GLMessageFormatter.java b/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/format/GLMessageFormatter.java
deleted file mode 100644
index 6c34005..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/format/GLMessageFormatter.java
+++ /dev/null
@@ -1,166 +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.eclipse.gltrace.format;
-
-import com.android.ide.eclipse.gltrace.GLEnum;
-import com.android.ide.eclipse.gltrace.GLProtoBuf.GLMessage;
-import com.android.ide.eclipse.gltrace.GLProtoBuf.GLMessage.DataType;
-import com.android.ide.eclipse.gltrace.GLProtoBuf.GLMessage.DataType.Type;
-
-import java.util.List;
-import java.util.Map;
-
-/**
- * GLMessageFormatter is used to format and create a string representation for a {@link GLMessage}.
- * It is provided with a specification for all GL Functions. Using this information, each
- * GLMessage is parsed and formatted appropriately for display.
- */
-public class GLMessageFormatter {
-    private static final String GL_NO_ERROR = "GL_NO_ERROR";
-    private Map<String, GLAPISpec> mAPISpecs;
-    private enum DataTypeContext { CONTEXT_ARGUMENT, CONTEXT_RETURNVALUE };
-
-    public GLMessageFormatter(Map<String, GLAPISpec> specs) {
-        mAPISpecs = specs;
-    }
-
-    public String formatGLMessage(GLMessage glMessage) {
-        GLAPISpec apiSpec = mAPISpecs.get(glMessage.getFunction().toString());
-        if (apiSpec == null) {
-            return glMessage.getFunction().toString();
-        }
-
-        return formatCall(apiSpec, glMessage) + formatReturnValue(apiSpec, glMessage);
-    }
-
-    private String formatReturnValue(GLAPISpec apiSpec, GLMessage glMessage) {
-        if (apiSpec.getReturnValue().getDataType() == Type.VOID) {
-            return "";
-        }
-
-        GLDataTypeSpec returnSpec = apiSpec.getReturnValue();
-        return String.format(" = (%s) %s", returnSpec.getCType(),   //$NON-NLS-1$
-                formatDataValue(glMessage.getReturnValue(),
-                        returnSpec,
-                        DataTypeContext.CONTEXT_RETURNVALUE));
-    }
-
-    private String formatCall(GLAPISpec apiSpec, GLMessage glMessage) {
-        return String.format("%s(%s)", apiSpec.getFunction(),       //$NON-NLS-1$
-                formatArgs(glMessage, apiSpec.getArgs()));
-    }
-
-    private String formatArgs(GLMessage glMessage, List<GLDataTypeSpec> argSpecs) {
-        int sizeEstimate = 10 + argSpecs.size() * 5;
-        StringBuilder sb = new StringBuilder(sizeEstimate);
-
-        for (int i = 0; i < argSpecs.size(); i++) {
-            GLDataTypeSpec argSpec = argSpecs.get(i);
-
-            if (argSpec.getDataType() == Type.VOID && !argSpec.isPointer()) {
-                sb.append("void");                                  //$NON-NLS-1$
-            } else {
-                sb.append(argSpec.getArgName());
-                sb.append(" = ");                                   //$NON-NLS-1$
-                sb.append(formatDataValue(glMessage.getArgs(i),
-                                argSpec,
-                                DataTypeContext.CONTEXT_ARGUMENT));
-            }
-
-            if (i < argSpecs.size() - 1) {
-                sb.append(", ");                                    //$NON-NLS-1$
-            }
-        }
-
-        return sb.toString();
-    }
-
-    private String formatDataValue(DataType var, GLDataTypeSpec typeSpec, DataTypeContext context) {
-        if (typeSpec.isPointer()) {
-            return formatPointer(var, typeSpec.getDataType());
-        }
-
-        switch (typeSpec.getDataType()) {
-            case VOID:
-                return "";
-            case BOOL:
-                return Boolean.toString(var.getBoolValue(0));
-            case FLOAT:
-                return String.format("%f", var.getFloatValue(0));   //$NON-NLS-1$
-            case INT:
-                return Integer.toString(var.getIntValue(0));
-            case ENUM:
-                if (var.getIntValue(0) == 0 && context == DataTypeContext.CONTEXT_RETURNVALUE) {
-                    return GL_NO_ERROR;
-                } else {
-                    return GLEnum.valueOf(var.getIntValue(0)).toString();
-                }
-            default:
-                return "(unknown type)";                            //$NON-NLS-1$
-        }
-    }
-
-    private String formatPointer(DataType var, Type typeSpec) {
-        if (var.getType() != typeSpec && !isEnumTypeWithIntData(var, typeSpec)) {
-            // the type of the data in the message does not match expected specification.
-            // in such a case, just print the data as a pointer and don't try to interpret it.
-            if (var.getIntValueCount() > 0) {
-                return String.format("0x%x", var.getIntValue(0));   //$NON-NLS-1$
-            } else {
-                return "0x??";                                      //$NON-NLS-1$
-            }
-        }
-
-        // Display as array if possible
-        switch (typeSpec) {
-            case BOOL:
-                return var.getBoolValueList().toString();
-            case FLOAT:
-                return var.getFloatValueList().toString();
-            case INT:
-                return var.getIntValueList().toString();
-            case CHAR:
-                return var.getCharValueList().get(0).toStringUtf8();
-            case ENUM:
-                List<Integer> vals = var.getIntValueList();
-                StringBuilder sb = new StringBuilder(vals.size() * 5);
-                sb.append('[');
-                for (Integer v: vals) {
-                    sb.append(GLEnum.valueOf(v.intValue()));
-                }
-                sb.append(']');
-                return sb.toString();
-            case VOID:
-                if (var.getRawBytesList().size() > 0) {
-                    return String.format("[ %d bytes ]", var.getRawBytesList().get(0).size()); //$NON-NLS-1$
-                }
-                return "[]"; //$NON-NLS-1$
-        }
-
-        // We have a pointer, but we don't have the data pointed to.
-        // Just format and return the pointer (points to device memory)
-        if (var.getIntValue(0) == 0) {
-            return "NULL";                                          //$NON-NLS-1$
-        } else {
-            return String.format("0x%x", var.getIntValue(0));       //$NON-NLS-1$
-        }
-    }
-
-    private boolean isEnumTypeWithIntData(DataType var, Type typeSpec) {
-        return var.getType() == Type.INT && typeSpec == Type.ENUM;
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/model/GLCall.java b/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/model/GLCall.java
deleted file mode 100644
index 0f6a116..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/model/GLCall.java
+++ /dev/null
@@ -1,183 +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.eclipse.gltrace.model;
-
-import com.android.ide.eclipse.gltrace.GLProtoBuf;
-import com.android.ide.eclipse.gltrace.GLProtoBuf.GLMessage.Function;
-import com.android.ide.eclipse.gltrace.state.transforms.IStateTransform;
-import com.android.utils.SparseArray;
-
-import java.util.Collections;
-import java.util.List;
-
-/**
- * A GLCall is the in memory representation of a single {@link GLProtoBuf.GLMessage}.
- *
- * Some protocol buffer messages have a large amount of image data packed in them. Rather
- * than storing all of that in memory, the GLCall stores a thumbnail image, and an offset
- * into the trace file corresponding to original protocol buffer message. If full image data
- * is required, the protocol buffer message can be recreated by reading the trace at the
- * specified offset.
- */
-public class GLCall {
-    /** Marker name provided by a {@link Function#glPushGroupMarkerEXT} call. */
-    public static final int PROPERTY_MARKERNAME = 0;
-
-    /** Size argument in a {@link Function#glVertexAttribPointerData} call. */
-    public static final int PROPERTY_VERTEX_ATTRIB_POINTER_SIZE = 1;
-
-    /** Type argument in a {@link Function#glVertexAttribPointerData} call. */
-    public static final int PROPERTY_VERTEX_ATTRIB_POINTER_TYPE = 2;
-
-    /** Data argument in a {@link Function#glVertexAttribPointerData} call. */
-    public static final int PROPERTY_VERTEX_ATTRIB_POINTER_DATA = 3;
-
-    /** Index of this call in the trace. */
-    private int mIndex;
-
-    /** Time on device when this call was invoked. */
-    private final long mStartTime;
-
-    /** Offset of the protobuf message corresponding to this call in the trace file. */
-    private final long mTraceFileOffset;
-
-    /** Flag indicating whether the original protobuf message included FB data. */
-    private final boolean mHasFb;
-
-    /** Full string representation of this call. */
-    private final String mDisplayString;
-
-    /** The actual GL Function called. */
-    private final Function mFunction;
-
-    /** GL Context identifier corresponding to the context of this call. */
-    private final int mContextId;
-
-    /** Duration of this call (MONOTONIC/wall clock time). */
-    private final int mWallDuration;
-
-    /** Duration of this call (THREAD time). */
-    private final int mThreadDuration;
-
-    /** List of state transformations performed by this call. */
-    private List<IStateTransform> mStateTransforms = Collections.emptyList();
-
-    /** Error conditions while creating state transforms for this call. */
-    private String mStateTransformationCreationErrorMessage;
-
-    /** List of properties associated to this call. */
-    private SparseArray<Object> mProperties;
-
-    public GLCall(int index, long startTime, long traceFileOffset, String displayString,
-            Function function, boolean hasFb, int contextId,
-            int wallTime, int threadTime) {
-        mIndex = index;
-        mStartTime = startTime;
-        mTraceFileOffset = traceFileOffset;
-        mDisplayString = displayString;
-        mFunction = function;
-        mHasFb = hasFb;
-        mContextId = contextId;
-        mWallDuration = wallTime;
-        mThreadDuration = threadTime;
-    }
-
-    public int getIndex() {
-        return mIndex;
-    }
-
-    public void setIndex(int i) {
-        mIndex = i;
-    }
-
-    public long getOffsetInTraceFile() {
-        return mTraceFileOffset;
-    }
-
-    public Function getFunction() {
-        return mFunction;
-    }
-
-    public int getContextId() {
-        return mContextId;
-    }
-
-    public boolean hasFb() {
-        return mHasFb;
-    }
-
-    public long getStartTime() {
-        return mStartTime;
-    }
-
-    public int getWallDuration() {
-        return mWallDuration;
-    }
-
-    public int getThreadDuration() {
-        return mThreadDuration;
-    }
-
-    public void setStateTransformations(List<IStateTransform> transforms) {
-        mStateTransforms = transforms;
-    }
-
-    public void setStateTransformationCreationError(String errorMessage) {
-        mStateTransformationCreationErrorMessage = errorMessage;
-    }
-
-    public boolean hasErrors() {
-        return mStateTransformationCreationErrorMessage != null;
-    }
-
-    public String getError() {
-        return mStateTransformationCreationErrorMessage;
-    }
-
-    public List<IStateTransform> getStateTransformations() {
-        return mStateTransforms;
-    }
-
-    @Override
-    public String toString() {
-        return mDisplayString;
-    }
-
-    /**
-     * Associate a certain value to the property name. Property names are defined
-     * as constants in {@link GLCall}.
-     */
-    public void addProperty(int propertyName, Object value) {
-        if (mProperties == null) {
-            mProperties = new SparseArray<Object>(1);
-        }
-
-        mProperties.put(propertyName, value);
-    }
-
-    /**
-     * Obtain the value for the given property. Returns null if no such property
-     * is associated with this {@link GLCall}.
-     */
-    public Object getProperty(int propertyName) {
-        if (mProperties == null) {
-            return null;
-        }
-
-        return mProperties.get(propertyName);
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/model/GLFrame.java b/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/model/GLFrame.java
deleted file mode 100644
index 5ff07a4..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/model/GLFrame.java
+++ /dev/null
@@ -1,51 +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.eclipse.gltrace.model;
-
-/**
- * A GLFrame is used to keep track of the start and end {@link GLCall} indices
- * for each OpenGL frame.
- */
-public class GLFrame {
-    private final int mIndex;
-    private final int mStartCallIndex;
-    private final int mEndCallIndex;
-
-    /**
-     * Construct a {@link GLFrame} given the range of {@link GLCall}s spanning this frame.
-     * @param frameIndex index of this frame in the trace.
-     * @param startCallIndex index of the first call in this frame (inclusive).
-     * @param endCallIndex index of the last call in this frame (exclusive).
-     */
-    public GLFrame(int frameIndex, int startCallIndex, int endCallIndex) {
-        mIndex = frameIndex;
-        mStartCallIndex = startCallIndex;
-        mEndCallIndex = endCallIndex;
-    }
-
-    public int getIndex() {
-        return mIndex;
-    }
-
-    public int getStartIndex() {
-        return mStartCallIndex;
-    }
-
-    public int getEndIndex() {
-        return mEndCallIndex;
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/model/GLTrace.java b/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/model/GLTrace.java
deleted file mode 100644
index 7667644..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/model/GLTrace.java
+++ /dev/null
@@ -1,120 +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.eclipse.gltrace.model;
-
-import com.android.ide.eclipse.gltrace.GLProtoBuf.GLMessage;
-import com.android.ide.eclipse.gltrace.ProtoBufUtils;
-import com.android.ide.eclipse.gltrace.TraceFileInfo;
-import com.android.ide.eclipse.gltrace.TraceFileReader;
-
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.widgets.Display;
-
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.io.RandomAccessFile;
-import java.util.Collections;
-import java.util.List;
-
-/** GLTrace is the in memory model of a OpenGL trace file. */
-public class GLTrace {
-    private static final TraceFileReader sTraceFileReader = new TraceFileReader();
-
-    /** Information regarding the trace file. */
-    private final TraceFileInfo mTraceFileInfo;
-
-    /** List of frames in the trace. */
-    private final List<GLFrame> mGLFrames;
-
-    /** List of GL Calls comprising the trace. */
-    private final List<GLCall> mGLCalls;
-
-    /** List of context ids used by the application. */
-    private List<Integer> mContextIds;
-
-    public GLTrace(TraceFileInfo traceFileInfo, List<GLFrame> glFrames, List<GLCall> glCalls,
-            List<Integer> contextIds) {
-        mTraceFileInfo = traceFileInfo;
-        mGLFrames = glFrames;
-        mGLCalls = glCalls;
-        mContextIds = contextIds;
-    }
-
-    public List<GLFrame> getFrames() {
-        return mGLFrames;
-    }
-
-    public GLFrame getFrame(int i) {
-        return mGLFrames.get(i);
-    }
-
-    public List<GLCall> getGLCalls() {
-        return mGLCalls;
-    }
-
-    public List<GLCall> getGLCallsForFrame(int frameIndex) {
-        if (frameIndex >= mGLFrames.size()) {
-            return Collections.emptyList();
-        }
-
-        GLFrame frame = mGLFrames.get(frameIndex);
-        return mGLCalls.subList(frame.getStartIndex(), frame.getEndIndex());
-    }
-
-    public Image getImage(GLCall c) {
-        if (!c.hasFb()) {
-            return null;
-        }
-
-        if (isTraceFileModified()) {
-            return null;
-        }
-
-        RandomAccessFile file;
-        try {
-            file = new RandomAccessFile(mTraceFileInfo.getPath(), "r"); //$NON-NLS-1$
-        } catch (FileNotFoundException e1) {
-            return null;
-        }
-
-        GLMessage m = null;
-        try {
-            m = sTraceFileReader.getMessageAtOffset(file, c.getOffsetInTraceFile());
-        } catch (Exception e) {
-            return null;
-        } finally {
-            try {
-                file.close();
-            } catch (IOException e) {
-                // ignore exception while closing file
-            }
-        }
-
-        return ProtoBufUtils.getImage(Display.getCurrent(), m);
-    }
-
-    private boolean isTraceFileModified() {
-        File f = new File(mTraceFileInfo.getPath());
-        return f.length() != mTraceFileInfo.getSize()
-                || f.lastModified() != mTraceFileInfo.getLastModificationTime();
-    }
-
-    public List<Integer> getContexts() {
-        return mContextIds;
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/state/DisplayRadix.java b/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/state/DisplayRadix.java
deleted file mode 100644
index 935f4d7..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/state/DisplayRadix.java
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS 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.gltrace.state;
-
-public enum DisplayRadix {
-    DECIMAL, HEX
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/state/GLAbstractAtomicProperty.java b/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/state/GLAbstractAtomicProperty.java
deleted file mode 100644
index cb96312..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/state/GLAbstractAtomicProperty.java
+++ /dev/null
@@ -1,65 +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.eclipse.gltrace.state;
-
-
-/**
- * Abstract implementation of {@link IGLProperty}. This provides the basics that can be
- * used by leaf level properties.
- */
-public abstract class GLAbstractAtomicProperty implements IGLProperty {
-    private final GLStateType mType;
-    private IGLProperty mParent;
-
-    public GLAbstractAtomicProperty(GLStateType type) {
-        mType = type;
-    }
-
-    @Override
-    public GLStateType getType() {
-        return mType;
-    }
-
-    @Override
-    public IGLProperty getParent() {
-        return mParent;
-    }
-
-    @Override
-    public void setParent(IGLProperty parent) {
-        mParent = parent;
-    }
-
-    @Override
-    public boolean isComposite() {
-        return false;
-    }
-
-    @Override
-    public IGLProperty clone() {
-        try {
-            return (IGLProperty) super.clone();
-        } catch (CloneNotSupportedException e) {
-            return null;
-        }
-    }
-
-    @Override
-    public void prettyPrint(StatePrettyPrinter pp) {
-        pp.prettyPrint(mType, getStringValue());
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/state/GLBooleanProperty.java b/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/state/GLBooleanProperty.java
deleted file mode 100644
index 8332b0a..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/state/GLBooleanProperty.java
+++ /dev/null
@@ -1,64 +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.eclipse.gltrace.state;
-
-
-/** Properties that hold boolean values. */
-public final class GLBooleanProperty extends GLAbstractAtomicProperty {
-    private final Boolean mDefaultValue;
-    private Boolean mCurrentValue;
-
-    public GLBooleanProperty(GLStateType name, Boolean defaultValue) {
-        super(name);
-
-        mDefaultValue = mCurrentValue = defaultValue;
-    }
-
-    @Override
-    public boolean isDefault() {
-        return mDefaultValue != null & mDefaultValue.equals(mCurrentValue);
-    }
-
-    public void setValue(Boolean newValue) {
-        mCurrentValue = newValue;
-    }
-
-    @Override
-    public String getStringValue() {
-        return mCurrentValue.toString();
-    }
-
-    @Override
-    public String toString() {
-        return getType() + "=" + getStringValue(); //$NON-NLS-1$
-    }
-
-    @Override
-    public void setValue(Object value) {
-        if (value instanceof Boolean) {
-            mCurrentValue = (Boolean) value;
-        } else {
-            throw new IllegalArgumentException("Attempt to set non-boolean value for " //$NON-NLS-1$
-                    + getType());
-        }
-    }
-
-    @Override
-    public Object getValue() {
-        return mCurrentValue;
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/state/GLCompositeProperty.java b/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/state/GLCompositeProperty.java
deleted file mode 100644
index ff8b83a..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/state/GLCompositeProperty.java
+++ /dev/null
@@ -1,136 +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.eclipse.gltrace.state;
-
-import java.util.Collection;
-import java.util.EnumMap;
-import java.util.Map;
-
-/**
- * A composite property is a container for multiple named properties, kind of like a dictionary.
- */
-public class GLCompositeProperty implements IGLProperty {
-    private final GLStateType mType;
-    private final Map<GLStateType, IGLProperty> mPropertiesMap;
-    private IGLProperty mParent;
-
-    /** Construct a composite property given a list of {@link IGLProperty} objects. */
-    public GLCompositeProperty(GLStateType type, IGLProperty... iglProperties) {
-        mType = type;
-        mPropertiesMap = new EnumMap<GLStateType, IGLProperty>(GLStateType.class);
-
-        for (IGLProperty p : iglProperties) {
-            mPropertiesMap.put(p.getType(), p);
-            p.setParent(this);
-        }
-    }
-
-    public Collection<IGLProperty> getProperties() {
-        return mPropertiesMap.values();
-    }
-
-    public IGLProperty getProperty(GLStateType name) {
-        return mPropertiesMap.get(name);
-    }
-
-    @Override
-    public GLCompositeProperty clone() {
-        IGLProperty []props = new IGLProperty[mPropertiesMap.size()];
-
-        int i = 0;
-        for (IGLProperty p : mPropertiesMap.values()) {
-            props[i++] = p.clone();
-        }
-
-        return new GLCompositeProperty(getType(), props);
-    }
-
-    @Override
-    public String toString() {
-        StringBuffer sb = new StringBuffer();
-        sb.append("GLCompositeProperty {");      //$NON-NLS-1$
-
-        for (IGLProperty p : mPropertiesMap.values()) {
-            sb.append(p.toString());
-            sb.append(", ");                     //$NON-NLS-1$
-        }
-
-        sb.append("}");
-        return sb.toString();
-    }
-
-    @Override
-    public String getStringValue() {
-        // This method is called for displaying objects in the UI.
-        // We do not display any values for composites in the UI as they are only intermediate
-        // nodes in the tree.
-        return "";
-    }
-
-    @Override
-    public GLStateType getType() {
-        return mType;
-    }
-
-    @Override
-    public boolean isComposite() {
-        return true;
-    }
-
-    @Override
-    public boolean isDefault() {
-        for (IGLProperty p : mPropertiesMap.values()) {
-            if (!p.isDefault()) {
-                return false;
-            }
-        }
-
-        return true;
-    }
-
-    @Override
-    public IGLProperty getParent() {
-        return mParent;
-    }
-
-    @Override
-    public void setParent(IGLProperty parent) {
-        mParent = parent;
-    }
-
-    @Override
-    public void setValue(Object value) {
-        throw new UnsupportedOperationException(
-                "Values cannot be set for composite properties."); //$NON-NLS-1$
-    }
-
-    @Override
-    public Object getValue() {
-        throw new UnsupportedOperationException(
-                "Values cannot be obtained for composite properties."); //$NON-NLS-1$
-    }
-
-    @Override
-    public void prettyPrint(StatePrettyPrinter pp) {
-        pp.prettyPrint(mType, null);
-        pp.incrementIndentLevel();
-        for (IGLProperty p : mPropertiesMap.values()) {
-            p.prettyPrint(pp);
-        }
-        pp.decrementIndentLevel();
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/state/GLEnumProperty.java b/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/state/GLEnumProperty.java
deleted file mode 100644
index a3acbd4..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/state/GLEnumProperty.java
+++ /dev/null
@@ -1,64 +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.eclipse.gltrace.state;
-
-import com.android.ide.eclipse.gltrace.GLEnum;
-
-/** Properties that hold a {@link GLEnum}. */
-public final class GLEnumProperty extends GLAbstractAtomicProperty {
-    private GLEnum mCurrentValue;
-    private final GLEnum mDefaultValue;
-
-    public GLEnumProperty(GLStateType name, GLEnum defaultValue) {
-        super(name);
-
-        mCurrentValue = mDefaultValue = defaultValue;
-    }
-
-    @Override
-    public boolean isDefault() {
-        return mDefaultValue == mCurrentValue;
-    }
-
-    public void setValue(GLEnum newValue) {
-        mCurrentValue = newValue;
-    }
-
-    @Override
-    public String getStringValue() {
-        return mCurrentValue.toString();
-    }
-
-    @Override
-    public String toString() {
-        return getType() + "=" + getStringValue(); //$NON-NLS-1$
-    }
-
-    @Override
-    public void setValue(Object value) {
-        if (value instanceof GLEnum) {
-            mCurrentValue = (GLEnum) value;
-        } else {
-            throw new IllegalArgumentException("Attempt to set invalid value for " + getType()); //$NON-NLS-1$
-        }
-    }
-
-    @Override
-    public Object getValue() {
-        return mCurrentValue;
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/state/GLFloatProperty.java b/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/state/GLFloatProperty.java
deleted file mode 100644
index 387a88c..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/state/GLFloatProperty.java
+++ /dev/null
@@ -1,63 +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.eclipse.gltrace.state;
-
-/** Properties that hold float values. */
-public class GLFloatProperty extends GLAbstractAtomicProperty {
-    private final Float mDefaultValue;
-    private Float mCurrentValue;
-
-    public GLFloatProperty(GLStateType name, Float defaultValue) {
-        super(name);
-
-        mDefaultValue = mCurrentValue = defaultValue;
-    }
-
-    @Override
-    public boolean isDefault() {
-        return Math.abs(mCurrentValue - mDefaultValue) < 0.000000001;
-    }
-
-    public void setValue(Float newValue) {
-        mCurrentValue = newValue;
-    }
-
-    @Override
-    public void setValue(Object value) {
-        if (value instanceof Float) {
-            mCurrentValue = (Float) value;
-        } else {
-            throw new IllegalArgumentException("Attempt to set non float value for "
-                    + getType());
-        }
-    }
-
-    @Override
-    public Object getValue() {
-        return mCurrentValue;
-    }
-
-    @Override
-    public String getStringValue() {
-        return mCurrentValue.toString();
-    }
-
-    @Override
-    public String toString() {
-        return getType() + "=" + getStringValue(); //$NON-NLS-1$
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/state/GLIntegerProperty.java b/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/state/GLIntegerProperty.java
deleted file mode 100644
index 7374ff0..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/state/GLIntegerProperty.java
+++ /dev/null
@@ -1,73 +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.eclipse.gltrace.state;
-
-/** Properties that hold an integer value. */
-public class GLIntegerProperty extends GLAbstractAtomicProperty {
-    private final Integer mDefaultValue;
-    private Integer mCurrentValue;
-    private final DisplayRadix mRadix;
-
-    public GLIntegerProperty(GLStateType name, Integer defaultValue, DisplayRadix radix) {
-        super(name);
-
-        mDefaultValue = mCurrentValue = defaultValue;
-        mRadix = radix;
-    }
-
-    public GLIntegerProperty(GLStateType name, Integer defaultValue) {
-        this(name, defaultValue, DisplayRadix.DECIMAL);
-    }
-
-    @Override
-    public boolean isDefault() {
-        return mDefaultValue != null & mDefaultValue.equals(mCurrentValue);
-    }
-
-    public void setValue(Integer newValue) {
-        mCurrentValue = newValue;
-    }
-
-    @Override
-    public String getStringValue() {
-        if (mRadix == DisplayRadix.HEX) {
-            return String.format("0x%08x", Integer.valueOf(mCurrentValue));
-        }
-
-        return mCurrentValue.toString();
-    }
-
-    @Override
-    public String toString() {
-        return getType() + "=" + getStringValue(); //$NON-NLS-1$
-    }
-
-    @Override
-    public void setValue(Object value) {
-        if (value instanceof Integer) {
-            mCurrentValue = (Integer) value;
-        } else {
-            throw new IllegalArgumentException("Attempt to set non-integer value for " //$NON-NLS-1$
-                                    + getType());
-        }
-    }
-
-    @Override
-    public Object getValue() {
-        return mCurrentValue;
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/state/GLListProperty.java b/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/state/GLListProperty.java
deleted file mode 100644
index 6840abf..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/state/GLListProperty.java
+++ /dev/null
@@ -1,182 +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.eclipse.gltrace.state;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Locale;
-
-/**
- * A list property is a container for a list of properties, addressed by index.
- */
-public class GLListProperty implements IGLProperty {
-    private final List<IGLProperty> mList;
-    private final GLStateType mType;
-    private IGLProperty mParent;
-    private IGLProperty mTemplate;
-
-    /**
-     * Construct a list of properties of given size from the provided template.
-     * @param template property that will be cloned and used as members of the list
-     * @param size size of the list
-     */
-    public GLListProperty(GLStateType type, IGLProperty template, int size) {
-        mType = type;
-        mTemplate = template;
-
-        mList = new ArrayList<IGLProperty>(size);
-        for (int i = 0; i < size; i++) {
-            IGLProperty p = template.clone();
-            mList.add(p);
-
-            p.setParent(this);
-        }
-    }
-
-    private GLListProperty(GLStateType type, List<IGLProperty> props) {
-        mList = props;
-        mType = type;
-
-        for (IGLProperty p : mList) {
-            p.setParent(this);
-        }
-    }
-
-    public List<IGLProperty> getList() {
-        return mList;
-    }
-
-    public IGLProperty get(int index) {
-        return mList.get(index);
-    }
-
-    public boolean add(IGLProperty property) {
-        property.setParent(this);
-        return mList.add(property);
-    }
-
-    public boolean remove(IGLProperty property) {
-        return mList.remove(property);
-    }
-
-    public void set(int index, IGLProperty property) {
-        ensureCapacity(index + 1);
-        mList.set(index, property);
-        property.setParent(this);
-    }
-
-    private void ensureCapacity(int capactiy) {
-        for (int i = mList.size(); i < capactiy; i++) {
-            mList.add(mTemplate);
-        }
-    }
-
-    @Override
-    public GLListProperty clone() {
-        List<IGLProperty> props = new ArrayList<IGLProperty>(
-                mList.size());
-
-        for (IGLProperty p : mList) {
-            props.add(p.clone());
-        }
-
-        return new GLListProperty(getType(), props);
-    }
-
-    @Override
-    public String toString() {
-        StringBuffer sb = new StringBuffer();
-        sb.append("GLListProperty [");      //$NON-NLS-1$
-
-        int i = 0;
-        for (IGLProperty p : mList) {
-            sb.append(i);
-            sb.append(':');
-            sb.append(p.toString());
-            sb.append(", ");                //$NON-NLS-1$
-            i++;
-        }
-
-        sb.append("]");
-        return sb.toString();
-    }
-
-    @Override
-    public String getStringValue() {
-        // This method is called for displaying objects in the UI.
-        // We do not display any values for composites in the UI as they are only intermediate
-        // nodes in the tree.
-        return "";
-    }
-
-    @Override
-    public GLStateType getType() {
-        return mType;
-    }
-
-    @Override
-    public boolean isComposite() {
-        return true;
-    }
-
-    @Override
-    public boolean isDefault() {
-        return false;
-    }
-
-    @Override
-    public IGLProperty getParent() {
-        return mParent;
-    }
-
-    @Override
-    public void setParent(IGLProperty parent) {
-        mParent = parent;
-    }
-
-    public int indexOf(IGLProperty property) {
-        return mList.indexOf(property);
-    }
-
-    @Override
-    public void setValue(Object value) {
-        throw new UnsupportedOperationException(
-                "Values cannot be set for composite properties."); //$NON-NLS-1$
-    }
-
-    @Override
-    public Object getValue() {
-        throw new UnsupportedOperationException(
-                "Values cannot be obtained for composite properties."); //$NON-NLS-1$
-    }
-
-    public int size() {
-        return mList.size();
-    }
-
-    @Override
-    public void prettyPrint(StatePrettyPrinter pp) {
-        pp.prettyPrint(mType, null);
-        pp.incrementIndentLevel();
-        for (int i = 0; i < mList.size(); i++) {
-            pp.prettyPrint(String.format(Locale.US, "Index %d:", i));
-            IGLProperty p = mList.get(i);
-            p.prettyPrint(pp);
-        }
-        pp.decrementIndentLevel();
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/state/GLLongProperty.java b/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/state/GLLongProperty.java
deleted file mode 100644
index 44c04ec..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/state/GLLongProperty.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS 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.gltrace.state;
-
-/** Properties that hold a long value. */
-public class GLLongProperty extends GLAbstractAtomicProperty {
-    private final Long mDefaultValue;
-    private Long mCurrentValue;
-    private final DisplayRadix mRadix;
-
-    public GLLongProperty(GLStateType name, Long defaultValue, DisplayRadix radix) {
-        super(name);
-
-        mDefaultValue = mCurrentValue = defaultValue;
-        mRadix = radix;
-    }
-
-    public GLLongProperty(GLStateType name, Long defaultValue) {
-        this(name, defaultValue, DisplayRadix.DECIMAL);
-    }
-
-    @Override
-    public boolean isDefault() {
-        return mDefaultValue != null & mDefaultValue.equals(mCurrentValue);
-    }
-
-    public void setValue(Long newValue) {
-        mCurrentValue = newValue;
-    }
-
-    @Override
-    public String getStringValue() {
-        if (mRadix == DisplayRadix.HEX) {
-            return String.format("0x%08x", Long.valueOf(mCurrentValue));
-        }
-
-        return mCurrentValue.toString();
-    }
-
-    @Override
-    public String toString() {
-        return getType() + "=" + getStringValue(); //$NON-NLS-1$
-    }
-
-    @Override
-    public void setValue(Object value) {
-        if (value instanceof Long) {
-            mCurrentValue = (Long) value;
-        } else {
-            throw new IllegalArgumentException("Attempt to set non-integer value for " //$NON-NLS-1$
-                                    + getType());
-        }
-    }
-
-    @Override
-    public Object getValue() {
-        return mCurrentValue;
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/state/GLObjectProperty.java b/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/state/GLObjectProperty.java
deleted file mode 100644
index 703d4da..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/state/GLObjectProperty.java
+++ /dev/null
@@ -1,66 +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.eclipse.gltrace.state;
-
-import com.google.common.base.Joiner;
-
-import java.util.List;
-
-public class GLObjectProperty extends GLAbstractAtomicProperty {
-    private final Object mDefaultValue;
-    private Object mCurrentValue;
-
-    private static final Joiner JOINER = Joiner.on(", ");   //$NON-NLS-1$
-
-    public GLObjectProperty(GLStateType type, Object defaultValue) {
-        super(type);
-
-        mDefaultValue = mCurrentValue = defaultValue;
-    }
-
-    @Override
-    public boolean isDefault() {
-        return mDefaultValue != null & mDefaultValue.equals(mCurrentValue);
-    }
-
-    @Override
-    public void setValue(Object newValue) {
-        mCurrentValue = newValue;
-    }
-
-    @Override
-    public String getStringValue() {
-        if (mCurrentValue == null) {
-            return "null";
-        } else {
-            if (mCurrentValue instanceof List<?>) {
-                return "[" + JOINER.join((List<?>) mCurrentValue) + "]"; //$NON-NLS-1$ //$NON-NLS-2$
-            }
-            return mCurrentValue.toString();
-        }
-    }
-
-    @Override
-    public String toString() {
-        return getType() + "=" + getStringValue(); //$NON-NLS-1$
-    }
-
-    @Override
-    public Object getValue() {
-        return mCurrentValue;
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/state/GLSparseArrayProperty.java b/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/state/GLSparseArrayProperty.java
deleted file mode 100644
index c450028..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/state/GLSparseArrayProperty.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.ide.eclipse.gltrace.state;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Locale;
-
-import com.android.utils.SparseArray;
-
-public class GLSparseArrayProperty implements IGLProperty {
-    private final GLStateType mType;
-    private final IGLProperty mDefaultValue;
-    private final boolean mCreateOnAccess;
-    private final SparseArray<IGLProperty> mSparseArray;
-    private IGLProperty mParent;
-
-    public GLSparseArrayProperty(GLStateType type, IGLProperty defaultValue) {
-        this(type, defaultValue, false);
-    }
-
-    /**
-     * Constructs a sparse array property.
-     * @param type GL state corresponding to this property
-     * @param defaultValue default value of each item
-     * @param createOnAccess create an item on access if it is not present
-     */
-    public GLSparseArrayProperty(GLStateType type, IGLProperty defaultValue,
-            boolean createOnAccess) {
-        mType = type;
-        mDefaultValue = defaultValue;
-        mCreateOnAccess = createOnAccess;
-        mSparseArray = new SparseArray<IGLProperty>(20);
-    }
-
-    private GLSparseArrayProperty(GLStateType type, IGLProperty defaultValue,
-            boolean createOnAccess, SparseArray<IGLProperty> contents) {
-        mType = type;
-        mDefaultValue = defaultValue;
-        mCreateOnAccess = createOnAccess;
-        mSparseArray = contents;
-    }
-
-    public List<IGLProperty> getValues() {
-        List<IGLProperty> values = new ArrayList<IGLProperty>(mSparseArray.size());
-
-        for (int i = 0; i < mSparseArray.size(); i++) {
-            values.add(mSparseArray.valueAt(i));
-        }
-
-        return values;
-    }
-
-    public IGLProperty getProperty(int key) {
-        IGLProperty p = mSparseArray.get(key);
-        if (p == null && mCreateOnAccess) {
-            add(key);
-            p = mSparseArray.get(key);
-        }
-        return p;
-    }
-
-    public int keyFor(IGLProperty element) {
-        int index = mSparseArray.indexOfValue(element);
-        return mSparseArray.keyAt(index);
-    }
-
-    public void put(int key, IGLProperty element) {
-        element.setParent(this);
-        mSparseArray.put(key, element);
-    }
-
-    public void add(int key) {
-        IGLProperty prop = mDefaultValue.clone();
-        prop.setParent(this);
-        mSparseArray.put(key, prop);
-    }
-
-    public void delete(int key) {
-        mSparseArray.delete(key);
-    }
-
-    @Override
-    public GLStateType getType() {
-        return mType;
-    }
-
-    @Override
-    public boolean isComposite() {
-        return true;
-    }
-
-    @Override
-    public boolean isDefault() {
-        return false;
-    }
-
-    @Override
-    public IGLProperty getParent() {
-        return mParent;
-    }
-
-    @Override
-    public void setParent(IGLProperty parent) {
-        mParent = parent;
-    }
-
-    @Override
-    public GLSparseArrayProperty clone() {
-        SparseArray<IGLProperty> copy = new SparseArray<IGLProperty>(mSparseArray.size());
-        for (int i = 0; i < mSparseArray.size(); i++) {
-            int key = mSparseArray.keyAt(i);
-            IGLProperty value = mSparseArray.get(key);
-            copy.put(key, value);
-        }
-
-        return new GLSparseArrayProperty(mType, mDefaultValue, mCreateOnAccess, copy);
-    }
-
-    @Override
-    public String getStringValue() {
-        // This method is called for displaying objects in the UI.
-        // We do not display any values for composites in the UI as they are only intermediate
-        // nodes in the tree.
-        return "";
-    }
-
-    @Override
-    public void setValue(Object value) {
-        throw new UnsupportedOperationException(
-                "Values cannot be set for composite properties."); //$NON-NLS-1$
-    }
-
-    @Override
-    public Object getValue() {
-        throw new UnsupportedOperationException(
-                "Values cannot be obtained for composite properties."); //$NON-NLS-1$
-    }
-
-    @Override
-    public void prettyPrint(StatePrettyPrinter pp) {
-        pp.prettyPrint(mType, null);
-        pp.incrementIndentLevel();
-        for (int i = 0; i < mSparseArray.size(); i++) {
-            int key = mSparseArray.keyAt(i);
-            pp.prettyPrint(String.format(Locale.US, "Index %d:", key));
-            IGLProperty prop = mSparseArray.get(key);
-
-            assert prop != null;
-            if (prop != null) {
-                prop.prettyPrint(pp);
-            }
-        }
-        pp.decrementIndentLevel();
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/state/GLState.java b/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/state/GLState.java
deleted file mode 100644
index 04ce676..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/state/GLState.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.ide.eclipse.gltrace.state;
-
-import com.android.ide.eclipse.gltrace.GLEnum;
-import com.android.ide.eclipse.gltrace.state.DisplayRadix;
-
-import java.util.Collections;
-
-public class GLState {
-    /** # of texture units modeled in the GL State. */
-    public static final int TEXTURE_UNIT_COUNT = 32;
-
-    /** # of vertex attributes */
-    private static final int MAX_VERTEX_ATTRIBS = 16;
-
-    private static GLState sGLState = new GLState();
-
-    private IGLProperty createBufferBindings() {
-        IGLProperty array, eArray, vArray;
-
-        array      = new GLIntegerProperty(GLStateType.ARRAY_BUFFER_BINDING, 0);
-        eArray     = new GLIntegerProperty(GLStateType.ELEMENT_ARRAY_BUFFER_BINDING, 0);
-
-        vArray     = new GLIntegerProperty(
-                GLStateType.VERTEX_ATTRIB_ARRAY_BUFFER_BINDING_PER_INDEX, 0);
-        IGLProperty vArray8 = new GLListProperty(GLStateType.VERTEX_ATTRIB_ARRAY_BUFFER_BINDINGS,
-                vArray, MAX_VERTEX_ATTRIBS);
-
-        return new GLCompositeProperty(
-                GLStateType.BUFFER_BINDINGS,
-                array,
-                eArray,
-                vArray8);
-    }
-
-    private IGLProperty createVertexAttribArrays() {
-        IGLProperty enabled, size, stride, type, normalized, pointer;
-
-        enabled    = new GLBooleanProperty(GLStateType.VERTEX_ATTRIB_ARRAY_ENABLED, false);
-        size       = new GLIntegerProperty(GLStateType.VERTEX_ATTRIB_ARRAY_SIZE, 4);
-        stride     = new GLIntegerProperty(GLStateType.VERTEX_ATTRIB_ARRAY_STRIDE, 0);
-        type       = new GLEnumProperty(GLStateType.VERTEX_ATTRIB_ARRAY_TYPE, GLEnum.GL_FLOAT);
-        normalized = new GLBooleanProperty(GLStateType.VERTEX_ATTRIB_ARRAY_NORMALIZED, false);
-        pointer    = new GLLongProperty(GLStateType.VERTEX_ATTRIB_ARRAY_POINTER, 0L,
-                DisplayRadix.HEX);
-
-        IGLProperty perVertexAttribArrayState = new GLCompositeProperty(
-                GLStateType.VERTEX_ATTRIB_ARRAY_COMPOSITE,
-                enabled,
-                size,
-                stride,
-                type,
-                normalized,
-                pointer);
-
-        return new GLListProperty(
-                GLStateType.VERTEX_ATTRIB_ARRAY,
-                perVertexAttribArrayState,
-                MAX_VERTEX_ATTRIBS);
-    }
-
-    private IGLProperty createGenericVertexAttributeState() {
-        IGLProperty v0 = new GLFloatProperty(GLStateType.GENERIC_VERTEX_ATTRIB_V0,
-                Float.valueOf(0));
-        IGLProperty v1 = new GLFloatProperty(GLStateType.GENERIC_VERTEX_ATTRIB_V1,
-                Float.valueOf(0));
-        IGLProperty v2 = new GLFloatProperty(GLStateType.GENERIC_VERTEX_ATTRIB_V2,
-                Float.valueOf(0));
-        IGLProperty v3 = new GLFloatProperty(GLStateType.GENERIC_VERTEX_ATTRIB_V3,
-                Float.valueOf(0));
-
-        IGLProperty perGenericVertexAttribState = new GLCompositeProperty(
-                GLStateType.GENERIC_VERTEX_ATTRIBUTE_DATA_COMPOSITE,
-                v0, v1, v2, v3);
-
-        return new GLListProperty(
-                GLStateType.GENERIC_VERTEX_ATTRIBUTES,
-                perGenericVertexAttribState,
-                MAX_VERTEX_ATTRIBS);
-    }
-
-    private IGLProperty createVboState() {
-        IGLProperty size = new GLIntegerProperty(GLStateType.BUFFER_SIZE, Integer.valueOf(0));
-        IGLProperty usage = new GLEnumProperty(GLStateType.BUFFER_USAGE, GLEnum.GL_STATIC_DRAW);
-        IGLProperty data = new GLObjectProperty(GLStateType.BUFFER_DATA, new byte[0]);
-        IGLProperty type = new GLEnumProperty(GLStateType.BUFFER_TYPE, GLEnum.GL_ARRAY_BUFFER);
-
-        IGLProperty perVboState = new GLCompositeProperty(GLStateType.VBO_COMPOSITE,
-                size, usage, data, type);
-
-        return new GLSparseArrayProperty(GLStateType.VBO, perVboState);
-    }
-
-    private IGLProperty createVertexArrayData() {
-        IGLProperty vertexAttribArrays = createVertexAttribArrays();
-        IGLProperty bufferBindings = createBufferBindings();
-        IGLProperty genericAttribs = createGenericVertexAttributeState();
-        IGLProperty vboState = createVboState();
-
-        return new GLCompositeProperty(GLStateType.VERTEX_ARRAY_DATA,
-                genericAttribs,
-                vertexAttribArrays,
-                bufferBindings,
-                vboState);
-    }
-
-    private IGLProperty createTransformationState() {
-        IGLProperty viewPortX = new GLIntegerProperty(GLStateType.VIEWPORT_X, 0);
-        IGLProperty viewPortY = new GLIntegerProperty(GLStateType.VIEWPORT_Y, 0);
-        IGLProperty viewPortW = new GLIntegerProperty(GLStateType.VIEWPORT_WIDTH, 0);
-        IGLProperty viewPortH = new GLIntegerProperty(GLStateType.VIEWPORT_HEIGHT, 0);
-        IGLProperty viewPort = new GLCompositeProperty(GLStateType.VIEWPORT,
-                viewPortX, viewPortY, viewPortW, viewPortH);
-
-        IGLProperty clampNear = new GLFloatProperty(GLStateType.DEPTH_RANGE_NEAR,
-                Float.valueOf(0.0f));
-        IGLProperty clampFar = new GLFloatProperty(GLStateType.DEPTH_RANGE_FAR,
-                Float.valueOf(1.0f));
-        IGLProperty depthRange = new GLCompositeProperty(GLStateType.DEPTH_RANGE,
-                clampNear,
-                clampFar);
-
-        IGLProperty transformationState = new GLCompositeProperty(GLStateType.TRANSFORMATION_STATE,
-                viewPort,
-                depthRange);
-        return transformationState;
-    }
-
-    private IGLProperty createRasterizationState() {
-        IGLProperty lineWidth = new GLFloatProperty(GLStateType.LINE_WIDTH, Float.valueOf(1.0f));
-        IGLProperty cullFace = new GLBooleanProperty(GLStateType.CULL_FACE, Boolean.FALSE);
-        IGLProperty cullFaceMode = new GLEnumProperty(GLStateType.CULL_FACE_MODE, GLEnum.GL_BACK);
-        IGLProperty frontFace = new GLEnumProperty(GLStateType.FRONT_FACE, GLEnum.GL_CCW);
-        IGLProperty polyOffsetFactor = new GLFloatProperty(GLStateType.POLYGON_OFFSET_FACTOR,
-                Float.valueOf(0f));
-        IGLProperty polyOffsetUnits = new GLFloatProperty(GLStateType.POLYGON_OFFSET_UNITS,
-                Float.valueOf(0f));
-        IGLProperty polyOffsetFill = new GLBooleanProperty(GLStateType.POLYGON_OFFSET_FILL,
-                Boolean.FALSE);
-
-        return new GLCompositeProperty(GLStateType.RASTERIZATION_STATE,
-                lineWidth,
-                cullFace,
-                cullFaceMode,
-                frontFace,
-                polyOffsetFactor,
-                polyOffsetUnits,
-                polyOffsetFill);
-    }
-
-    private IGLProperty createPixelOperationsState() {
-        IGLProperty scissorTest = new GLBooleanProperty(GLStateType.SCISSOR_TEST, Boolean.FALSE);
-        IGLProperty scissorBoxX = new GLIntegerProperty(GLStateType.SCISSOR_BOX_X, 0);
-        IGLProperty scissorBoxY = new GLIntegerProperty(GLStateType.SCISSOR_BOX_Y, 0);
-        IGLProperty scissorBoxW = new GLIntegerProperty(GLStateType.SCISSOR_BOX_WIDTH, 0);
-        IGLProperty scissorBoxH = new GLIntegerProperty(GLStateType.SCISSOR_BOX_HEIGHT, 0);
-        IGLProperty scissorBox = new GLCompositeProperty(GLStateType.SCISSOR_BOX,
-                scissorBoxX, scissorBoxY, scissorBoxW, scissorBoxH);
-
-        IGLProperty stencilTest = new GLBooleanProperty(GLStateType.STENCIL_TEST, Boolean.FALSE);
-        IGLProperty stencilFunc = new GLEnumProperty(GLStateType.STENCIL_FUNC, GLEnum.GL_ALWAYS);
-        IGLProperty stencilMask = new GLIntegerProperty(GLStateType.STENCIL_VALUE_MASK,
-                Integer.valueOf(0xffffffff), DisplayRadix.HEX);
-        IGLProperty stencilRef = new GLIntegerProperty(GLStateType.STENCIL_REF,
-                Integer.valueOf(0));
-        IGLProperty stencilFail = new GLEnumProperty(GLStateType.STENCIL_FAIL, GLEnum.GL_KEEP);
-        IGLProperty stencilPassDepthFail = new GLEnumProperty(GLStateType.STENCIL_PASS_DEPTH_FAIL,
-                GLEnum.GL_KEEP);
-        IGLProperty stencilPassDepthPass = new GLEnumProperty(GLStateType.STENCIL_PASS_DEPTH_PASS,
-                GLEnum.GL_KEEP);
-        IGLProperty stencilBackFunc = new GLEnumProperty(GLStateType.STENCIL_BACK_FUNC,
-                GLEnum.GL_ALWAYS);
-        IGLProperty stencilBackValueMask = new GLIntegerProperty(
-                GLStateType.STENCIL_BACK_VALUE_MASK, Integer.valueOf(0xffffffff), DisplayRadix.HEX);
-        IGLProperty stencilBackRef = new GLIntegerProperty(GLStateType.STENCIL_BACK_REF, 0);
-        IGLProperty stencilBackFail = new GLEnumProperty(GLStateType.STENCIL_BACK_FAIL,
-                GLEnum.GL_KEEP);
-        IGLProperty stencilBackPassDepthFail = new GLEnumProperty(
-                GLStateType.STENCIL_BACK_PASS_DEPTH_FAIL, GLEnum.GL_KEEP);
-        IGLProperty stencilBackPassDepthPass = new GLEnumProperty(
-                GLStateType.STENCIL_BACK_PASS_DEPTH_PASS, GLEnum.GL_KEEP);
-        IGLProperty stencil = new GLCompositeProperty(GLStateType.STENCIL,
-                stencilTest, stencilFunc,
-                stencilMask, stencilRef, stencilFail,
-                stencilPassDepthFail, stencilPassDepthPass,
-                stencilBackFunc, stencilBackValueMask,
-                stencilBackRef, stencilBackFail,
-                stencilBackPassDepthFail, stencilBackPassDepthPass);
-
-        IGLProperty depthTest = new GLBooleanProperty(GLStateType.DEPTH_TEST, Boolean.FALSE);
-        IGLProperty depthFunc = new GLEnumProperty(GLStateType.DEPTH_FUNC, GLEnum.GL_LESS);
-
-        IGLProperty blendEnabled = new GLBooleanProperty(GLStateType.BLEND_ENABLED, Boolean.FALSE);
-        // FIXME: BLEND_SRC_RGB should be set to GL_ONE, but GL_LINES is already 0x1.
-        IGLProperty blendSrcRgb = new GLEnumProperty(GLStateType.BLEND_SRC_RGB, GLEnum.GL_LINES);
-        IGLProperty blendSrcAlpha = new GLEnumProperty(GLStateType.BLEND_SRC_ALPHA,
-                GLEnum.GL_LINES);
-        IGLProperty blendDstRgb = new GLEnumProperty(GLStateType.BLEND_DST_RGB, GLEnum.GL_NONE);
-        IGLProperty blendDstAlpha = new GLEnumProperty(GLStateType.BLEND_DST_ALPHA,
-                GLEnum.GL_NONE);
-        IGLProperty blendEquationRgb = new GLEnumProperty(GLStateType.BLEND_EQUATION_RGB,
-                GLEnum.GL_FUNC_ADD);
-        IGLProperty blendEquationAlpha = new GLEnumProperty(GLStateType.BLEND_EQUATION_ALPHA,
-                GLEnum.GL_FUNC_ADD);
-        IGLProperty blend = new GLCompositeProperty(GLStateType.BLEND,
-                blendEnabled, blendSrcRgb, blendSrcAlpha, blendDstRgb, blendDstAlpha,
-                blendEquationRgb, blendEquationAlpha);
-
-        IGLProperty dither = new GLBooleanProperty(GLStateType.DITHER, Boolean.TRUE);
-
-        return new GLCompositeProperty(GLStateType.PIXEL_OPERATIONS,
-                scissorTest, scissorBox, stencil,
-                depthTest, depthFunc, blend, dither);
-    }
-
-    private IGLProperty createPixelPackState() {
-        IGLProperty packAlignment = new GLIntegerProperty(GLStateType.PACK_ALIGNMENT,
-                Integer.valueOf(4));
-        IGLProperty unpackAlignment = new GLIntegerProperty(GLStateType.UNPACK_ALIGNMENT,
-                Integer.valueOf(4));
-        IGLProperty pixelPack = new GLCompositeProperty(GLStateType.PIXEL_PACKING,
-                packAlignment, unpackAlignment);
-        return pixelPack;
-    }
-
-    private IGLProperty createFramebufferState() {
-        IGLProperty binding = new GLIntegerProperty(GLStateType.FRAMEBUFFER_BINDING, 0);
-        GLCompositeProperty framebufferState = new GLCompositeProperty(
-                GLStateType.FRAMEBUFFER_STATE,
-                binding);
-        return framebufferState;
-    }
-
-    private IGLProperty createTextureState() {
-        IGLProperty activeTexture = new GLIntegerProperty(GLStateType.ACTIVE_TEXTURE_UNIT,
-                Integer.valueOf(0));
-
-        IGLProperty binding2D = new GLIntegerProperty(GLStateType.TEXTURE_BINDING_2D,
-                Integer.valueOf(0));
-        IGLProperty bindingCubeMap = new GLIntegerProperty(GLStateType.TEXTURE_BINDING_CUBE_MAP,
-                Integer.valueOf(0));
-        IGLProperty bindingExternal = new GLIntegerProperty(GLStateType.TEXTURE_BINDING_EXTERNAL,
-                Integer.valueOf(0));
-        IGLProperty perTextureUnitState = new GLCompositeProperty(
-                GLStateType.PER_TEXTURE_UNIT_STATE, binding2D, bindingCubeMap, bindingExternal);
-        IGLProperty textureUnitState = new GLListProperty(GLStateType.TEXTURE_UNITS,
-                perTextureUnitState, TEXTURE_UNIT_COUNT);
-
-        IGLProperty swizzleR = new GLEnumProperty(GLStateType.TEXTURE_SWIZZLE_R, GLEnum.GL_RED);
-        IGLProperty swizzleG = new GLEnumProperty(GLStateType.TEXTURE_SWIZZLE_G, GLEnum.GL_GREEN);
-        IGLProperty swizzleB = new GLEnumProperty(GLStateType.TEXTURE_SWIZZLE_B, GLEnum.GL_BLUE);
-        IGLProperty swizzleA = new GLEnumProperty(GLStateType.TEXTURE_SWIZZLE_A, GLEnum.GL_ALPHA);
-        IGLProperty minFilter = new GLEnumProperty(GLStateType.TEXTURE_MIN_FILTER,
-                GLEnum.GL_NEAREST);
-        IGLProperty magFilter = new GLEnumProperty(GLStateType.TEXTURE_MAG_FILTER,
-                GLEnum.GL_NEAREST);
-        IGLProperty wrapS = new GLEnumProperty(GLStateType.TEXTURE_WRAP_S, GLEnum.GL_REPEAT);
-        IGLProperty wrapT = new GLEnumProperty(GLStateType.TEXTURE_WRAP_T, GLEnum.GL_REPEAT);
-        IGLProperty wrapR = new GLEnumProperty(GLStateType.TEXTURE_WRAP_R, GLEnum.GL_REPEAT);
-        IGLProperty minLod = new GLFloatProperty(GLStateType.TEXTURE_MIN_LOD, Float.valueOf(-1000));
-        IGLProperty maxLod = new GLFloatProperty(GLStateType.TEXTURE_MAX_LOD, Float.valueOf(1000));
-        IGLProperty baseLevel = new GLIntegerProperty(GLStateType.TEXTURE_BASE_LEVEL, 0);
-        IGLProperty maxLevel = new GLIntegerProperty(GLStateType.TEXTURE_MAX_LEVEL, 1000);
-        IGLProperty cmpMode = new GLEnumProperty(GLStateType.TEXTURE_COMPARE_MODE, GLEnum.GL_NONE);
-        IGLProperty cmpFunc = new GLEnumProperty(GLStateType.TEXTURE_COMPARE_FUNC,
-                GLEnum.GL_LEQUAL);
-        IGLProperty immutableFormat = new GLBooleanProperty(GLStateType.TEXTURE_IMMUTABLE_FORMAT,
-                Boolean.FALSE);
-        IGLProperty immutableLevels = new GLIntegerProperty(GLStateType.TEXTURE_IMMUTABLE_LEVELS,
-                0);
-
-        IGLProperty width = new GLIntegerProperty(GLStateType.TEXTURE_WIDTH, Integer.valueOf(-1));
-        IGLProperty height = new GLIntegerProperty(GLStateType.TEXTURE_HEIGHT,
-                Integer.valueOf(-1));
-        IGLProperty format = new GLEnumProperty(GLStateType.TEXTURE_FORMAT,
-                GLEnum.GL_INVALID_VALUE);
-        IGLProperty imageType = new GLEnumProperty(GLStateType.TEXTURE_IMAGE_TYPE,
-                GLEnum.GL_UNSIGNED_BYTE);
-        IGLProperty image = new GLStringProperty(GLStateType.TEXTURE_IMAGE, null);
-
-        IGLProperty perTextureLevelState = new GLCompositeProperty(
-                GLStateType.PER_TEXTURE_LEVEL_STATE,
-                width, height, format, imageType, image);
-        IGLProperty mipmapState = new GLSparseArrayProperty(GLStateType.TEXTURE_MIPMAPS,
-                perTextureLevelState, true);
-
-        IGLProperty textureDefaultState = new GLCompositeProperty(GLStateType.PER_TEXTURE_STATE,
-                swizzleR, swizzleG, swizzleB, swizzleA,
-                minFilter, magFilter,
-                wrapS, wrapT, wrapR,
-                minLod, maxLod,
-                baseLevel, maxLevel,
-                cmpMode, cmpFunc,
-                immutableFormat, immutableLevels,
-                mipmapState);
-        GLSparseArrayProperty textures = new GLSparseArrayProperty(GLStateType.TEXTURES,
-                textureDefaultState);
-        textures.add(0);
-
-        return new GLCompositeProperty(GLStateType.TEXTURE_STATE,
-                activeTexture,
-                textureUnitState,
-                textures);
-    }
-
-    private IGLProperty createProgramState() {
-        IGLProperty currentProgram = new GLIntegerProperty(GLStateType.CURRENT_PROGRAM,
-                Integer.valueOf(0));
-
-        IGLProperty attachedShaderId = new GLIntegerProperty(GLStateType.ATTACHED_SHADER_ID,
-                Integer.valueOf(0));
-        IGLProperty attachedShaders = new GLSparseArrayProperty(GLStateType.ATTACHED_SHADERS,
-                attachedShaderId);
-
-        IGLProperty attributeName = new GLStringProperty(GLStateType.ATTRIBUTE_NAME, "");
-        IGLProperty attributeType = new GLEnumProperty(GLStateType.ATTRIBUTE_TYPE,
-                GLEnum.GL_FLOAT_MAT4);
-        IGLProperty attributeSize = new GLIntegerProperty(GLStateType.ATTRIBUTE_SIZE,
-                Integer.valueOf(1));
-        IGLProperty attributeValue = new GLObjectProperty(GLStateType.ATTRIBUTE_VALUE,
-                Collections.emptyList());
-        IGLProperty perAttributeProperty = new GLCompositeProperty(GLStateType.PER_ATTRIBUTE_STATE,
-                attributeName, attributeType, attributeSize, attributeValue);
-        IGLProperty attributes = new GLSparseArrayProperty(GLStateType.ACTIVE_ATTRIBUTES,
-                perAttributeProperty);
-
-        IGLProperty uniformName = new GLStringProperty(GLStateType.UNIFORM_NAME, "");
-        IGLProperty uniformType = new GLEnumProperty(GLStateType.UNIFORM_TYPE,
-                GLEnum.GL_FLOAT_MAT4);
-        IGLProperty uniformSize = new GLIntegerProperty(GLStateType.UNIFORM_SIZE,
-                Integer.valueOf(1));
-        IGLProperty uniformValue = new GLObjectProperty(GLStateType.UNIFORM_VALUE,
-                Collections.emptyList());
-        IGLProperty perUniformProperty = new GLCompositeProperty(GLStateType.PER_UNIFORM_STATE,
-                uniformName, uniformType, uniformSize, uniformValue);
-        IGLProperty uniforms = new GLSparseArrayProperty(GLStateType.ACTIVE_UNIFORMS,
-                perUniformProperty);
-
-        IGLProperty perProgramState = new GLCompositeProperty(GLStateType.PER_PROGRAM_STATE,
-                attachedShaders, attributes, uniforms);
-
-        IGLProperty programs = new GLSparseArrayProperty(GLStateType.PROGRAMS, perProgramState);
-
-        return new GLCompositeProperty(GLStateType.PROGRAM_STATE,
-                currentProgram, programs);
-    }
-
-    private IGLProperty createShaderState() {
-        IGLProperty shaderType = new GLEnumProperty(GLStateType.SHADER_TYPE,
-                GLEnum.GL_VERTEX_SHADER);
-        IGLProperty shaderSource = new GLStringProperty(GLStateType.SHADER_SOURCE,
-                ""); //$NON-NLS-1$
-        IGLProperty perShaderState = new GLCompositeProperty(GLStateType.PER_SHADER_STATE,
-                shaderType, shaderSource);
-        return new GLSparseArrayProperty(GLStateType.SHADERS, perShaderState);
-    }
-
-    public static IGLProperty createDefaultES2State() {
-        GLCompositeProperty glState = new GLCompositeProperty(GLStateType.GL_STATE_ES2,
-                sGLState.createVertexArrayData(),
-                sGLState.createFramebufferState(),
-                sGLState.createTransformationState(),
-                sGLState.createRasterizationState(),
-                sGLState.createPixelOperationsState(),
-                sGLState.createPixelPackState(),
-                sGLState.createTextureState(),
-                sGLState.createProgramState(),
-                sGLState.createShaderState());
-        return glState;
-    }
-
-    public static IGLProperty createDefaultES1State() {
-        GLCompositeProperty glState = new GLCompositeProperty(GLStateType.GL_STATE_ES1,
-                sGLState.createVertexArrayData(),
-                sGLState.createFramebufferState(),
-                sGLState.createTransformationState(),
-                sGLState.createRasterizationState(),
-                sGLState.createPixelOperationsState(),
-                sGLState.createPixelPackState(),
-                sGLState.createTextureState());
-        return glState;
-    }
-
-    public static IGLProperty createDefaultState() {
-        return new GLListProperty(GLStateType.GL_STATE, null, 0);
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/state/GLStateType.java b/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/state/GLStateType.java
deleted file mode 100644
index a0a7ce4..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/state/GLStateType.java
+++ /dev/null
@@ -1,187 +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.eclipse.gltrace.state;
-
-/** The type for each OpenGL State Property {@link IGLProperty}. */
-public enum GLStateType {
-    // Note: the indentation reflects the state hierarchy.
-
-    GL_STATE("OpenGL State Variables"),
-        GL_STATE_ES1("OpenGL ES 1.1 State"),
-        GL_STATE_ES2("OpenGL ES 2.0 State"),
-
-    VERTEX_ARRAY_DATA("Vertex Array Data"),
-        GENERIC_VERTEX_ATTRIBUTES("Generic Vertex Attributes"),
-            GENERIC_VERTEX_ATTRIBUTE_DATA_COMPOSITE("Generic Vertex Attribute Data"),
-                GENERIC_VERTEX_ATTRIB_V0("x"),
-                GENERIC_VERTEX_ATTRIB_V1("y"),
-                GENERIC_VERTEX_ATTRIB_V2("z"),
-                GENERIC_VERTEX_ATTRIB_V3("w"),
-
-        VERTEX_ATTRIB_ARRAY("Vertex Attrib Array Properties"),
-        VERTEX_ATTRIB_ARRAY_COMPOSITE("Vertex Attrib Array #n Properties"),
-            VERTEX_ATTRIB_ARRAY_ENABLED("Vertex Attrib Array Enable"),
-            VERTEX_ATTRIB_ARRAY_SIZE("Vertex Attrib Array Size"),
-            VERTEX_ATTRIB_ARRAY_STRIDE("Vertex Attrib Array Stride"),
-            VERTEX_ATTRIB_ARRAY_TYPE("Vertex Attrib Array Type"),
-            VERTEX_ATTRIB_ARRAY_NORMALIZED("Vertex Attrib Array Normalized"),
-            VERTEX_ATTRIB_ARRAY_POINTER("Vertex Attrib Array Pointer"),
-
-        BUFFER_BINDINGS("Buffer Bindings"),
-            ARRAY_BUFFER_BINDING("Current Buffer Binding"),
-            ELEMENT_ARRAY_BUFFER_BINDING("Element Array Buffer Binding"),
-            VERTEX_ATTRIB_ARRAY_BUFFER_BINDINGS("Attribute Array Buffer Bindings"),
-            VERTEX_ATTRIB_ARRAY_BUFFER_BINDING_PER_INDEX("Attribute Array Buffer Binding"),
-
-        VBO("Vertex Buffer Objects"),
-            VBO_COMPOSITE("Per VBO State"),
-                BUFFER_SIZE("Size"),
-                BUFFER_USAGE("Usage"),
-                BUFFER_DATA("Data"),
-                BUFFER_TYPE("Type"),
-
-    TRANSFORMATION_STATE("Transformation State"),
-        VIEWPORT("Viewport"),
-            VIEWPORT_X("Lower Left X"),
-            VIEWPORT_Y("Lower Left Y"),
-            VIEWPORT_WIDTH("Width"),
-            VIEWPORT_HEIGHT("Height"),
-        DEPTH_RANGE("Depth Range"),
-            DEPTH_RANGE_NEAR("Near Clipping Plane"),
-            DEPTH_RANGE_FAR("Far Clipping Plane"),
-
-    RASTERIZATION_STATE("Rasterization State"),
-        LINE_WIDTH("Line Width"),
-        CULL_FACE("Polygon Culling Enabled"),
-        CULL_FACE_MODE("Cull front/back facing polygons"),
-        FRONT_FACE("Polygon frontface CW/CCW indicator"),
-        POLYGON_OFFSET_FACTOR("Polygon Offset Factor"),
-        POLYGON_OFFSET_UNITS("Polygon Offset Units"),
-        POLYGON_OFFSET_FILL("Polygon Offset Enable"),
-
-    PIXEL_OPERATIONS("Pixel Operations"),
-        SCISSOR_TEST("Scissoring enabled"),
-        SCISSOR_BOX("Scissor Box"),
-            SCISSOR_BOX_X("Lower Left X"),
-            SCISSOR_BOX_Y("Lower Left Y"),
-            SCISSOR_BOX_WIDTH("Width"),
-            SCISSOR_BOX_HEIGHT("Height"),
-        STENCIL("Stencil"),
-            STENCIL_TEST("Stenciling enabled"),
-            STENCIL_FUNC("Front Stencil Function"),
-            STENCIL_VALUE_MASK("Front Stencil Mask"),
-            STENCIL_REF("Front Stencil Reference Value"),
-            STENCIL_FAIL("Front Stencil Fail Action"),
-            STENCIL_PASS_DEPTH_FAIL("Front stencil depth buffer fail action"),
-            STENCIL_PASS_DEPTH_PASS("Front stencil depth buffer pass action"),
-            STENCIL_BACK_FUNC("Back stencil function"),
-            STENCIL_BACK_VALUE_MASK("Back stencil mask"),
-            STENCIL_BACK_REF("Back stencil reference value"),
-            STENCIL_BACK_FAIL("Back stencil fail action"),
-            STENCIL_BACK_PASS_DEPTH_FAIL("Back stencil depth buffer fail action"),
-            STENCIL_BACK_PASS_DEPTH_PASS("Back stencil depth buffer pass action"),
-        DEPTH_TEST("Depth buffer enabled"),
-        DEPTH_FUNC("Depth buffer test function"),
-        BLEND("Blending"),
-            BLEND_ENABLED("Enabled"),
-            BLEND_SRC_RGB("Source RGB function"),
-            BLEND_SRC_ALPHA("Source A function"),
-            BLEND_DST_RGB("Dest. RGB function"),
-            BLEND_DST_ALPHA("Dest. A function"),
-            BLEND_EQUATION_RGB("RGB Equation"),
-            BLEND_EQUATION_ALPHA("Alpha Equation"),
-        DITHER("Dithering enabled"),
-
-    PIXEL_PACKING("Pixel Packing"),
-        PACK_ALIGNMENT("Pack Alignment"),
-        UNPACK_ALIGNMENT("Unpack Alignment"),
-
-    TEXTURE_STATE("Texture State"),
-        ACTIVE_TEXTURE_UNIT("Active Texture Unit"),
-        TEXTURE_UNITS("Texture Units"),
-        PER_TEXTURE_UNIT_STATE("Texture Unit Properties"),
-            TEXTURE_BINDING_2D("TEXTURE_2D Binding"),
-            TEXTURE_BINDING_CUBE_MAP("TEXTURE_CUBE_MAP Binding"),
-            TEXTURE_BINDING_EXTERNAL("TEXTURE_EXTERNAL Binding"),
-        TEXTURES("Textures"),
-            PER_TEXTURE_STATE("Per Texture State"),
-                TEXTURE_SWIZZLE_R("Red Component Swizzle"),
-                TEXTURE_SWIZZLE_G("Green Component Swizzle"),
-                TEXTURE_SWIZZLE_B("Blue Component Swizzle"),
-                TEXTURE_SWIZZLE_A("Alpha Component Swizzle"),
-                TEXTURE_MIN_FILTER("Minification Function"),
-                TEXTURE_MAG_FILTER("Magnification Function"),
-                TEXTURE_WRAP_S("Texcoord s Wrap Mode"),
-                TEXTURE_WRAP_T("Texcoord t Wrap Mode"),
-                TEXTURE_WRAP_R("Texcoord r Wrap Mode"),
-                TEXTURE_MIN_LOD("Min Level of Detail"),
-                TEXTURE_MAX_LOD("Max Level of Detail"),
-                TEXTURE_BASE_LEVEL("Base Texture Array"),
-                TEXTURE_MAX_LEVEL("Max Texture Array Level"),
-                TEXTURE_COMPARE_MODE("Comparison Mode"),
-                TEXTURE_COMPARE_FUNC("Comparison Function"),
-                TEXTURE_IMMUTABLE_FORMAT("Size and format immutable?"),
-                TEXTURE_IMMUTABLE_LEVELS("# of levels in immutable textures"),
-                TEXTURE_MIPMAPS("Texture Mipmap State"),
-                    PER_TEXTURE_LEVEL_STATE("Per Texture Level State"),
-                        TEXTURE_FORMAT("Format"),
-                        TEXTURE_WIDTH("Width"),
-                        TEXTURE_HEIGHT("Height"),
-                        TEXTURE_IMAGE_TYPE("Image Type"),
-                        TEXTURE_IMAGE("Image"),
-
-    PROGRAM_STATE("Program Object State"),
-        CURRENT_PROGRAM("Current Program"),
-        PROGRAMS("Programs"),
-            PER_PROGRAM_STATE("Per Program State"),
-                ATTACHED_SHADERS("Attached Shaders"),
-                    ATTACHED_SHADER_ID("Attached Shader ID"),
-                ACTIVE_ATTRIBUTES("Attributes"),
-                    PER_ATTRIBUTE_STATE("Per Attribute State"),
-                        ATTRIBUTE_NAME("Name"),
-                        ATTRIBUTE_TYPE("Type"),
-                        ATTRIBUTE_SIZE("Size"),
-                        ATTRIBUTE_VALUE("Value"),
-                ACTIVE_UNIFORMS("Uniforms"),
-                    PER_UNIFORM_STATE("Per Uniform State"),
-                        UNIFORM_NAME("Name"),
-                        UNIFORM_TYPE("Type"),
-                        UNIFORM_SIZE("Size"),
-                        UNIFORM_VALUE("Value"),
-
-    SHADERS("Shader Objects"),
-        PER_SHADER_STATE("Per Shader State"),
-            SHADER_TYPE("Shader Type"),
-            SHADER_SOURCE("Source"),
-
-    FRAMEBUFFER_STATE("Framebuffer State"),
-        FRAMEBUFFER_BINDING("Framebuffer Binding"),
-        FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE("Framebuffer object type"),
-        FRAMEBUFFER_ATTACHMENT_OBJECT_NAME("Framebuffer object name"),
-        FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL("Framebuffer texture level"),
-        FRAMEBUFFER_ATTACHEMENT_TEXTURE_CUBE_MAP_FACE("Framebuffer texture cubemap face");
-
-    private final String mDescription;
-
-    GLStateType(String description) {
-        mDescription = description;
-    }
-
-    public String getDescription() {
-        return mDescription;
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/state/GLStringProperty.java b/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/state/GLStringProperty.java
deleted file mode 100644
index d95651f..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/state/GLStringProperty.java
+++ /dev/null
@@ -1,62 +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.eclipse.gltrace.state;
-
-public class GLStringProperty extends GLAbstractAtomicProperty {
-    private final String mDefaultValue;
-    private String mCurrentValue;
-
-    public GLStringProperty(GLStateType type, String defaultValue) {
-        super(type);
-
-        mDefaultValue = mCurrentValue = defaultValue;
-    }
-
-    @Override
-    public boolean isDefault() {
-        return mDefaultValue.equalsIgnoreCase(mCurrentValue);
-    }
-
-    @Override
-    public void setValue(Object value) {
-        if (value instanceof String) {
-            mCurrentValue = (String) value;
-        } else {
-            throw new IllegalArgumentException("Attempt to set non-string value for " //$NON-NLS-1$
-                    + getType());
-        }
-    }
-
-    public void setValue(String value) {
-        mCurrentValue = value;
-    }
-
-    @Override
-    public Object getValue() {
-        return mCurrentValue;
-    }
-
-    @Override
-    public String getStringValue() {
-        return mCurrentValue;
-    }
-
-    @Override
-    public String toString() {
-        return getType() + "=" + getStringValue(); //$NON-NLS-1$
-    };
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/state/IGLProperty.java b/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/state/IGLProperty.java
deleted file mode 100644
index ed87fd2..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/state/IGLProperty.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.eclipse.gltrace.state;
-
-
-/**
- * The GL state is modeled as a hierarchical set of properties, all of which implement
- * this interface.
- */
-public interface IGLProperty extends Cloneable {
-    /** Obtain the type of the property. */
-    GLStateType getType();
-
-    /** Is this a composite property?
-     * @return true if it is a list or structure of properties,
-     *         false if it is a leaf level atomic property
-     * */
-    boolean isComposite();
-
-    /**
-     * Is the currently set value the default?
-     * @return true if current value matches the default (initial) value
-     */
-    boolean isDefault();
-
-    /** Set the current value for this property. */
-    void setValue(Object value);
-
-    /** Get the current value for this property. */
-    Object getValue();
-
-    /** Get the string representation for this property. */
-    String getStringValue();
-
-    /**
-     * Get the parent property that holds this property.
-     * @return null if this property is at the top level, parent otherwise
-     */
-    IGLProperty getParent();
-
-    /** Set the parent property that holds this property. */
-    void setParent(IGLProperty parent);
-
-    /** Deep clone this property. */
-    IGLProperty clone();
-
-    /** Pretty print current property value to the given writer. */
-    void prettyPrint(StatePrettyPrinter pp);
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/state/StatePrettyPrinter.java b/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/state/StatePrettyPrinter.java
deleted file mode 100644
index 0ad9aa4..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/state/StatePrettyPrinter.java
+++ /dev/null
@@ -1,67 +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.eclipse.gltrace.state;
-
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-import com.android.utils.SdkUtils;
-
-public class StatePrettyPrinter {
-    private static final int SPACES_PER_INDENT = 4;
-    private final String mLineSeparator = SdkUtils.getLineSeparator();
-
-    private StringBuilder mSb = new StringBuilder(1000);
-    private int mIndentLevel = 0;
-
-    public void prettyPrint(@NonNull GLStateType name, @Nullable String value) {
-        indentLine(mIndentLevel * SPACES_PER_INDENT);
-
-        mSb.append(name.toString());
-
-        if (value != null) {
-            mSb.append(':');
-            mSb.append(value);
-        }
-        mSb.append(mLineSeparator);
-    }
-
-    public void prettyPrint(@NonNull String s) {
-        indentLine(mIndentLevel * SPACES_PER_INDENT);
-
-        mSb.append(s);
-        mSb.append(mLineSeparator);
-    }
-
-    private void indentLine(int spaces) {
-        for (int i = 0; i < spaces; i++) {
-            mSb.append(' ');
-        }
-    }
-
-    public void incrementIndentLevel() {
-        mIndentLevel++;
-    }
-
-    public void decrementIndentLevel() {
-        mIndentLevel--;
-    }
-
-    @Override
-    public String toString() {
-        return mSb.toString();
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/state/transforms/BufferSubDataTransform.java b/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/state/transforms/BufferSubDataTransform.java
deleted file mode 100644
index 393f1b9..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/state/transforms/BufferSubDataTransform.java
+++ /dev/null
@@ -1,76 +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.eclipse.gltrace.state.transforms;
-
-import com.android.ide.eclipse.gltrace.GLProtoBuf.GLMessage.Function;
-import com.android.ide.eclipse.gltrace.state.IGLProperty;
-
-import java.nio.ByteBuffer;
-
-/**
- * A {@link BufferSubDataTransform} updates a portion of the buffer data as specified by
- * the {@link Function#glBufferSubData} function.
- */
-public class BufferSubDataTransform implements IStateTransform {
-    private final IGLPropertyAccessor mAccessor;
-    private final int mOffset;
-
-    private final byte[] mSubData;
-    private byte[] mOldData;
-    private byte[] mNewData;
-
-    public BufferSubDataTransform(IGLPropertyAccessor accessor, int offset, byte[] data) {
-        mAccessor = accessor;
-        mOffset = offset;
-        mSubData = data;
-    }
-
-    @Override
-    public void apply(IGLProperty state) {
-        IGLProperty property = mAccessor.getProperty(state);
-        mOldData = (byte[]) property.getValue();
-
-        if (mOldData != null) {
-            mNewData = new byte[mOldData.length];
-            ByteBuffer bb = ByteBuffer.wrap(mNewData);
-
-            // copy all of the old buffer
-            bb.put(mOldData);
-            bb.rewind();
-
-            // update with the sub buffer data at specified offset
-            bb.position(mOffset);
-            bb.put(mSubData);
-        }
-
-        property.setValue(mNewData);
-    }
-
-    @Override
-    public void revert(IGLProperty state) {
-        if (mOldData != null) {
-            IGLProperty property = mAccessor.getProperty(state);
-            property.setValue(mOldData);
-            mOldData = null;
-        }
-    }
-
-    @Override
-    public IGLProperty getChangedProperty(IGLProperty state) {
-        return mAccessor.getProperty(state);
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/state/transforms/CurrentProgramPropertyAccessor.java b/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/state/transforms/CurrentProgramPropertyAccessor.java
deleted file mode 100644
index 9cc3cb8..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/state/transforms/CurrentProgramPropertyAccessor.java
+++ /dev/null
@@ -1,67 +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.eclipse.gltrace.state.transforms;
-
-import com.android.ide.eclipse.gltrace.state.GLIntegerProperty;
-import com.android.ide.eclipse.gltrace.state.GLStateType;
-import com.android.ide.eclipse.gltrace.state.IGLProperty;
-
-public class CurrentProgramPropertyAccessor implements IGLPropertyAccessor {
-    private final int mContextId;
-    private final GLStateType mStateCategory;
-    private final int mLocation;
-    private final GLStateType mStateType;
-    private final IGLPropertyAccessor mCurrentProgramAccessor;
-
-    public CurrentProgramPropertyAccessor(int contextid, GLStateType stateCategory,
-            int location, GLStateType stateType) {
-        mContextId = contextid;
-        mStateCategory = stateCategory;
-        mLocation = location;
-        mStateType = stateType;
-
-        mCurrentProgramAccessor = GLPropertyAccessor.makeAccessor(contextid,
-                GLStateType.PROGRAM_STATE,
-                GLStateType.CURRENT_PROGRAM);
-    }
-
-    @Override
-    public IGLProperty getProperty(IGLProperty state) {
-        // obtain the current program
-        IGLProperty currentProgramProperty = mCurrentProgramAccessor.getProperty(state);
-        if (!(currentProgramProperty instanceof GLIntegerProperty)) {
-            return null;
-        }
-
-        Integer program = (Integer) currentProgramProperty.getValue();
-
-        // now access the required program property
-        return GLPropertyAccessor.makeAccessor(mContextId,
-                                               GLStateType.PROGRAM_STATE,
-                                               GLStateType.PROGRAMS,
-                                               program,
-                                               mStateCategory,
-                                               Integer.valueOf(mLocation),
-                                               mStateType).getProperty(state);
-    }
-
-    @Override
-    public String getPath() {
-        return String.format("PROGRAM_STATE/PROGRAMS/${program}/%s/%d/%s",
-                mStateCategory, mLocation, mStateType);
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/state/transforms/CurrentVboPropertyAccessor.java b/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/state/transforms/CurrentVboPropertyAccessor.java
deleted file mode 100644
index bd1286d..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/state/transforms/CurrentVboPropertyAccessor.java
+++ /dev/null
@@ -1,71 +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.eclipse.gltrace.state.transforms;
-
-import com.android.ide.eclipse.gltrace.GLEnum;
-import com.android.ide.eclipse.gltrace.state.GLIntegerProperty;
-import com.android.ide.eclipse.gltrace.state.GLStateType;
-import com.android.ide.eclipse.gltrace.state.IGLProperty;
-
-/**
- * An {@link IGLPropertyAccessor} that retrieves the requested property in the
- * currently bound {@link GLEnum#GL_ARRAY_BUFFER} or {@link GLEnum#GL_ELEMENT_ARRAY_BUFFER}.
- */
-public class CurrentVboPropertyAccessor implements IGLPropertyAccessor {
-    private final int mContextId;
-    private final IGLPropertyAccessor mVboBindingAccessor;
-    private final GLStateType mVboProperty;
-
-    public CurrentVboPropertyAccessor(int contextId, GLEnum target, GLStateType vboProperty) {
-        mContextId = contextId;
-        mVboProperty = vboProperty;
-
-        GLStateType vboType;
-        if (target == GLEnum.GL_ARRAY_BUFFER) {
-            vboType = GLStateType.ARRAY_BUFFER_BINDING;
-        } else {
-            vboType = GLStateType.ELEMENT_ARRAY_BUFFER_BINDING;
-        }
-
-        mVboBindingAccessor = GLPropertyAccessor.makeAccessor(contextId,
-                GLStateType.VERTEX_ARRAY_DATA,
-                GLStateType.BUFFER_BINDINGS,
-                vboType);
-    }
-
-    @Override
-    public IGLProperty getProperty(IGLProperty state) {
-        // obtain the current bound buffer
-        IGLProperty currentBinding = mVboBindingAccessor.getProperty(state);
-        if (!(currentBinding instanceof GLIntegerProperty)) {
-            return null;
-        }
-
-        Integer buffer = (Integer) currentBinding.getValue();
-
-        return GLPropertyAccessor.makeAccessor(mContextId,
-                                               GLStateType.VERTEX_ARRAY_DATA,
-                                               GLStateType.VBO,
-                                               buffer,
-                                               mVboProperty).getProperty(state);
-    }
-
-    @Override
-    public String getPath() {
-        return String.format("VERTEX_ARRAY_DATA/VBO/${currentBuffer}/%s", mVboProperty);
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/state/transforms/GLPropertyAccessor.java b/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/state/transforms/GLPropertyAccessor.java
deleted file mode 100644
index be338be..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/state/transforms/GLPropertyAccessor.java
+++ /dev/null
@@ -1,139 +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.eclipse.gltrace.state.transforms;
-
-import com.android.ide.eclipse.gltrace.state.GLCompositeProperty;
-import com.android.ide.eclipse.gltrace.state.GLListProperty;
-import com.android.ide.eclipse.gltrace.state.GLSparseArrayProperty;
-import com.android.ide.eclipse.gltrace.state.GLStateType;
-import com.android.ide.eclipse.gltrace.state.IGLProperty;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * GLPropertyAccessor's can be used to extract a certain property from the provided
- * OpenGL State hierarchy.
- */
-public class GLPropertyAccessor implements IGLPropertyAccessor {
-    private final int mContextId;
-    private final List<GLPropertyExtractor> mExtractors;
-
-    private GLPropertyAccessor(int contextId, List<GLPropertyExtractor> extractors) {
-        mContextId = contextId;
-        mExtractors = extractors;
-    }
-
-    @Override
-    public IGLProperty getProperty(IGLProperty state) {
-        IGLProperty root = ((GLListProperty) state).get(mContextId);
-
-        for (GLPropertyExtractor e : mExtractors) {
-            IGLProperty successor = e.getProperty(root);
-            if (successor == null) {
-                root = null;
-                break;
-            }
-            root = successor;
-        }
-
-        return root;
-    }
-
-    /**
-     * Factory method used to construct a {@link GLPropertyAccessor}.
-     * @param contextId id of affected context
-     * @param accessors list of accessor's to be used to navigate the property hierarchy. The
-     *                  accessors are either Integers or {@link GLStateType} objects. Integers
-     *                  are assumed to be indexes in a {@link GLListProperty} or
-     *                  {@link GLSparseArrayProperty}, and the GLStateType enum objects are
-     *                  used to query {@link GLCompositeProperty}'s.
-     */
-    public static IGLPropertyAccessor makeAccessor(int contextId, Object...accessors) {
-        List<GLPropertyExtractor> extractors = new ArrayList<GLPropertyExtractor>();
-
-        for (Object accessor : accessors) {
-            if (accessor instanceof GLStateType) {
-                extractors.add(new GLNamePropertyExtractor((GLStateType) accessor));
-            } else if (accessor instanceof Integer) {
-                extractors.add(new GLIndexPropertyExtractor((Integer) accessor));
-            } else {
-                throw new IllegalArgumentException("Unknown property (" + accessor
-                        + ") used to access members of IGLProperty");
-            }
-        }
-
-        return new GLPropertyAccessor(contextId, extractors);
-    }
-
-    private interface GLPropertyExtractor {
-        IGLProperty getProperty(IGLProperty p);
-    }
-
-    /** Extract properties by name. */
-    private static class GLNamePropertyExtractor implements GLPropertyExtractor {
-        private final GLStateType mType;
-
-        public GLNamePropertyExtractor(GLStateType type) {
-            mType = type;
-        }
-
-        @Override
-        public IGLProperty getProperty(IGLProperty p) {
-            if (p instanceof GLCompositeProperty) {
-                return ((GLCompositeProperty) p).getProperty(mType);
-            }
-
-            return null;
-        }
-    }
-
-    /** Extract properties by index. */
-    private static class GLIndexPropertyExtractor implements GLPropertyExtractor {
-        private final int mIndex;
-
-        public GLIndexPropertyExtractor(int index) {
-            mIndex = index;
-        }
-
-        @Override
-        public IGLProperty getProperty(IGLProperty p) {
-            if (p instanceof GLListProperty && mIndex >= 0) {
-                return ((GLListProperty) p).get(mIndex);
-            }
-            if (p instanceof GLSparseArrayProperty) {
-                return ((GLSparseArrayProperty) p).getProperty(mIndex);
-            }
-            return null;
-        }
-    }
-
-    @Override
-    public String getPath() {
-        StringBuilder sb = new StringBuilder(mExtractors.size() * 10);
-        for (GLPropertyExtractor e: mExtractors) {
-            if (e instanceof GLNamePropertyExtractor) {
-                sb.append(((GLNamePropertyExtractor) e).mType);
-            } else {
-                sb.append(((GLIndexPropertyExtractor) e).mIndex);
-            }
-            sb.append('/');
-        }
-
-        return sb.toString();
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/state/transforms/IGLPropertyAccessor.java b/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/state/transforms/IGLPropertyAccessor.java
deleted file mode 100644
index 5df21b9..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/state/transforms/IGLPropertyAccessor.java
+++ /dev/null
@@ -1,31 +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.eclipse.gltrace.state.transforms;
-
-import com.android.ide.eclipse.gltrace.state.IGLProperty;
-
-/**
- * An {@link IGLPropertyAccessor} provides an interface to extract
- * a specific property from a composite property.
- */
-public interface IGLPropertyAccessor {
-    /** Obtain a specific property from the given state. */
-    IGLProperty getProperty(IGLProperty state);
-
-    /** Returns the string representation of this property accessor. */
-    String getPath();
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/state/transforms/IPredicate.java b/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/state/transforms/IPredicate.java
deleted file mode 100644
index e31226f..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/state/transforms/IPredicate.java
+++ /dev/null
@@ -1,21 +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.eclipse.gltrace.state.transforms;
-
-public interface IPredicate {
-    boolean apply(Object value);
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/state/transforms/IStateTransform.java b/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/state/transforms/IStateTransform.java
deleted file mode 100644
index de33a08..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/state/transforms/IStateTransform.java
+++ /dev/null
@@ -1,34 +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.eclipse.gltrace.state.transforms;
-
-import com.android.ide.eclipse.gltrace.state.IGLProperty;
-
-/**
- * This interface encapsulates a single change to the GL state. GL Calls that affect
- * multiple state variables would use a list of these state transformations.
- */
-public interface IStateTransform {
-    /** Apply this transformation on the given state. */
-    void apply(IGLProperty currentState);
-
-    /** Revert this transformation from the given state. */
-    void revert(IGLProperty currentState);
-
-    /** Obtain the property that will be affected by this transformation. */
-    IGLProperty getChangedProperty(IGLProperty currentState);
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/state/transforms/ListElementAddTransform.java b/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/state/transforms/ListElementAddTransform.java
deleted file mode 100644
index dcf50d7..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/state/transforms/ListElementAddTransform.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.ide.eclipse.gltrace.state.transforms;
-
-import com.android.ide.eclipse.gltrace.state.GLListProperty;
-import com.android.ide.eclipse.gltrace.state.IGLProperty;
-
-/**
- * A {@link ListElementAddTransform} provides the ability to add a new property to a list of
- * properties in the GL State.
- */
-public class ListElementAddTransform implements IStateTransform {
-    private final IGLPropertyAccessor mAccessor;
-    private final IGLProperty mElement;
-
-    public ListElementAddTransform(IGLPropertyAccessor accessor, IGLProperty element) {
-        mAccessor = accessor;
-        mElement = element;
-    }
-
-    @Override
-    public void apply(IGLProperty currentState) {
-        GLListProperty list = getList(currentState);
-        if (list != null) {
-            list.add(mElement);
-        }
-    }
-
-    @Override
-    public void revert(IGLProperty currentState) {
-        GLListProperty list = getList(currentState);
-        if (list != null) {
-            list.remove(mElement);
-        }
-    }
-
-    @Override
-    public IGLProperty getChangedProperty(IGLProperty currentState) {
-        return getList(currentState);
-    }
-
-    private GLListProperty getList(IGLProperty state) {
-        IGLProperty p = state;
-
-        if (mAccessor != null) {
-            p = mAccessor.getProperty(p);
-        }
-
-        if (p instanceof GLListProperty) {
-            return (GLListProperty) p;
-        } else {
-            return null;
-        }
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/state/transforms/Predicates.java b/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/state/transforms/Predicates.java
deleted file mode 100644
index 0de8358..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/state/transforms/Predicates.java
+++ /dev/null
@@ -1,36 +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.eclipse.gltrace.state.transforms;
-
-public class Predicates {
-    private static class IntegerPropertyEqualsPredicate implements IPredicate {
-        private int mExpected;
-
-        public IntegerPropertyEqualsPredicate(Integer expected) {
-            mExpected = expected.intValue();
-        }
-
-        @Override
-        public boolean apply(Object value) {
-            return value instanceof Integer && ((Integer) value).intValue() == mExpected;
-        }
-    }
-
-    public static IPredicate matchesInteger(int expected) {
-        return new IntegerPropertyEqualsPredicate(expected);
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/state/transforms/PropertyChangeTransform.java b/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/state/transforms/PropertyChangeTransform.java
deleted file mode 100644
index 276f6f4..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/state/transforms/PropertyChangeTransform.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.eclipse.gltrace.state.transforms;
-
-import com.android.ide.eclipse.gltrace.state.IGLProperty;
-
-/**
- * A PropertyChangeTransform object provides the ability to alter the value of a
- * single GL State variable. An optional predicate provides the ability to perform
- * the change only if the predicate succeeds.
- */
-public class PropertyChangeTransform implements IStateTransform {
-    private final IGLPropertyAccessor mAccessor;
-    private final Object mNewValue;
-    private final IPredicate mPredicate;
-    private Object mOldValue;
-
-    /**
-     * Construct a state transform that will extract the property using the accessor,
-     * and modify its value to the provided value.
-     */
-    PropertyChangeTransform(IGLPropertyAccessor accessor, Object newValue) {
-        this(accessor, newValue, null);
-    }
-
-    /**
-     * Construct a state transform that will extract the property using the accessor,
-     * check if the predicate function accepts the current value, and if so modify its
-     * value to the provided value.
-     */
-    public PropertyChangeTransform(IGLPropertyAccessor accessor, Object newValue,
-            IPredicate predicate) {
-        mAccessor = accessor;
-        mNewValue = newValue;
-        mPredicate = predicate;
-        mOldValue = null;
-    }
-
-    /** Apply the state transformation on the given OpenGL state. */
-    @Override
-    public void apply(IGLProperty state) {
-        IGLProperty property = mAccessor.getProperty(state);
-
-        assert mOldValue == null : "Transform cannot be applied multiple times";
-        if (mPredicate != null) {
-            // if predicate is not null, then first check if the current value
-            // passes the predicate function.
-            if (!mPredicate.apply(property.getValue())) {
-                return;
-            }
-        }
-
-        if (property != null) {
-            mOldValue = property.getValue();
-            property.setValue(mNewValue);
-        } else {
-            throw new RuntimeException("No such property: " + mAccessor.getPath());
-        }
-    }
-
-    /**
-     * Reverses the effect of this state transform. It restores the property's value to the same
-     * state as it was before this transformation was applied. If this transform was never
-     * {@link #apply(IGLProperty)}'ed, then performing a revert has no effect.
-     */
-    @Override
-    public void revert(IGLProperty state) {
-        if (mOldValue != null) {
-            IGLProperty property = mAccessor.getProperty(state);
-            property.setValue(mOldValue);
-            mOldValue = null;
-        }
-    }
-
-    /** Gets the property that will be affected by applying this transformation. */
-    @Override
-    public IGLProperty getChangedProperty(IGLProperty state) {
-        if (mPredicate != null) {
-            Object value = mOldValue == null ? mNewValue : mOldValue;
-            if (!mPredicate.apply(value)) {
-                // if the value doesn't match the predicate, then this property
-                // is not altered.
-                return null;
-            }
-        }
-
-        return mAccessor.getProperty(state);
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/state/transforms/SparseArrayElementAddTransform.java b/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/state/transforms/SparseArrayElementAddTransform.java
deleted file mode 100644
index b7547bc..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/state/transforms/SparseArrayElementAddTransform.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.ide.eclipse.gltrace.state.transforms;
-
-import com.android.ide.eclipse.gltrace.state.GLSparseArrayProperty;
-import com.android.ide.eclipse.gltrace.state.IGLProperty;
-
-/**
- * A {@link SparseArrayElementAddTransform} changes given state by adding an
- * element to a sparse array, if there is no item with the same key already.
- */
-public class SparseArrayElementAddTransform implements IStateTransform {
-    private IGLPropertyAccessor mAccessor;
-    private int mKey;
-    private IGLProperty mOldValue;
-
-    public SparseArrayElementAddTransform(IGLPropertyAccessor accessor, int key) {
-        mAccessor = accessor;
-        mKey = key;
-    }
-
-    @Override
-    public void apply(IGLProperty currentState) {
-        GLSparseArrayProperty propertyArray = getArray(currentState);
-        if (propertyArray != null) {
-            mOldValue = propertyArray.getProperty(mKey);
-            if (mOldValue == null) {
-                // add only if there is no item with this key already present
-                propertyArray.add(mKey);
-            }
-        }
-    }
-
-    @Override
-    public void revert(IGLProperty currentState) {
-        GLSparseArrayProperty propertyArray = getArray(currentState);
-        if (propertyArray != null) {
-            if (mOldValue == null) {
-                // delete only if we actually added this key
-                propertyArray.delete(mKey);
-            }
-        }
-    }
-
-    @Override
-    public IGLProperty getChangedProperty(IGLProperty currentState) {
-        return getArray(currentState);
-    }
-
-    private GLSparseArrayProperty getArray(IGLProperty state) {
-        IGLProperty p = state;
-
-        if (mAccessor != null) {
-            p = mAccessor.getProperty(p);
-        }
-
-        if (p instanceof GLSparseArrayProperty) {
-            return (GLSparseArrayProperty) p;
-        } else {
-            return null;
-        }
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/state/transforms/SparseArrayElementRemoveTransform.java b/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/state/transforms/SparseArrayElementRemoveTransform.java
deleted file mode 100644
index c1ff211..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/state/transforms/SparseArrayElementRemoveTransform.java
+++ /dev/null
@@ -1,49 +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.eclipse.gltrace.state.transforms;
-
-import com.android.ide.eclipse.gltrace.state.IGLProperty;
-
-/**
- * A {@link SparseArrayElementRemoveTransform} changes given state by removing an
- * element from a sparse array.
- */
-public class SparseArrayElementRemoveTransform implements IStateTransform {
-    private final SparseArrayElementAddTransform mAddTransform;
-
-    public SparseArrayElementRemoveTransform(IGLPropertyAccessor accessor, int key) {
-        mAddTransform = new SparseArrayElementAddTransform(accessor, key);
-    }
-
-    @Override
-    public void apply(IGLProperty currentState) {
-        // applying a RemoveTransform is the same as reverting an AddTransform.
-        mAddTransform.revert(currentState);
-    }
-
-    @Override
-    public void revert(IGLProperty currentState) {
-        // reverting a RemoveTransform is the same as applying an AddTransform.
-        mAddTransform.apply(currentState);
-    }
-
-    @Override
-    public IGLProperty getChangedProperty(IGLProperty currentState) {
-        return mAddTransform.getChangedProperty(currentState);
-    }
-
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/state/transforms/StateTransformFactory.java b/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/state/transforms/StateTransformFactory.java
deleted file mode 100644
index 023f84b..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/state/transforms/StateTransformFactory.java
+++ /dev/null
@@ -1,1384 +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.eclipse.gltrace.state.transforms;
-
-import com.android.ide.eclipse.gltrace.FileUtils;
-import com.android.ide.eclipse.gltrace.GLEnum;
-import com.android.ide.eclipse.gltrace.GLProtoBuf.GLMessage;
-import com.android.ide.eclipse.gltrace.state.GLState;
-import com.android.ide.eclipse.gltrace.state.GLStateType;
-import com.android.ide.eclipse.gltrace.state.IGLProperty;
-import com.google.common.io.Files;
-import com.google.protobuf.ByteString;
-
-import java.io.File;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.EnumSet;
-import java.util.List;
-
-public class StateTransformFactory {
-    private static final String TEXTURE_DATA_FILE_PREFIX = "tex";   //$NON-NLS-1$
-    private static final String TEXTURE_DATA_FILE_SUFFIX = ".dat";  //$NON-NLS-1$
-    private static EnumSet<GLEnum> sTexParameterPnameValues;
-
-    /** Construct a list of transformations to be applied for the provided OpenGL call. */
-    public static List<IStateTransform> getTransformsFor(GLMessage msg) {
-        switch (msg.getFunction()) {
-            case eglCreateContext:
-                return transformsForEglCreateContext(msg);
-            case glBindFramebuffer:
-                return transformsForGlBindFramebuffer(msg);
-
-            // vertex data
-            case glVertexAttribPointer:
-                return transformsForGlVertexAttribPointer(msg);
-            case glVertexAttrib1f:
-            case glVertexAttrib2f:
-            case glVertexAttrib3f:
-            case glVertexAttrib4f:
-                return transformsForGlVertexAttribxf(msg);
-            case glVertexAttrib1fv:
-            case glVertexAttrib2fv:
-            case glVertexAttrib3fv:
-            case glVertexAttrib4fv:
-                return transformsForGlVertexAttribxfv(msg);
-            case glEnableVertexAttribArray:
-                return transformsForGlEnableVertexAttribArray(msg);
-            case glDisableVertexAttribArray:
-                return transformsForGlDisableVertexAttribArray(msg);
-
-            // VBO's
-            case glBindBuffer:
-                return transformsForGlBindBuffer(msg);
-            case glGenBuffers:
-                return transformsForGlGenBuffers(msg);
-            case glDeleteBuffers:
-                return transformsForGlDeleteBuffers(msg);
-            case glBufferData:
-                return transformsForGlBufferData(msg);
-            case glBufferSubData:
-                return transformsForGlBufferSubData(msg);
-
-            // transformation state
-            case glViewport:
-                return transformsForGlViewport(msg);
-            case glDepthRangef:
-                return transformsForGlDepthRangef(msg);
-
-            // rasterization
-            case glLineWidth:
-                return transformsForGlLineWidth(msg);
-            case glCullFace:
-                return transformsForGlCullFace(msg);
-            case glFrontFace:
-                return transformsForGlFrontFace(msg);
-            case glPolygonOffset:
-                return transformsForGlPolygonOffset(msg);
-
-            // pixel operations
-            case glScissor:
-                return transformsForGlScissor(msg);
-            case glStencilFunc:
-                return transformsForGlStencilFunc(msg);
-            case glStencilFuncSeparate:
-                return transformsForGlStencilFuncSeparate(msg);
-            case glStencilOp:
-                return transformsForGlStencilOp(msg);
-            case glStencilOpSeparate:
-                return transformsForGlStencilOpSeparate(msg);
-            case glDepthFunc:
-                return transformsForGlDepthFunc(msg);
-            case glBlendEquation:
-                return transformsForGlBlendEquation(msg);
-            case glBlendEquationSeparate:
-                return transformsForGlBlendEquationSeparate(msg);
-            case glBlendFunc:
-                return transformsForGlBlendFunc(msg);
-            case glBlendFuncSeparate:
-                return transformsForGlBlendFuncSeparate(msg);
-            case glPixelStorei:
-                return transformsForGlPixelStorei(msg);
-
-            // Texture State Transformations
-            case glGenTextures:
-                return transformsForGlGenTextures(msg);
-            case glDeleteTextures:
-                return transformsForGlDeleteTextures(msg);
-            case glActiveTexture:
-                return transformsForGlActiveTexture(msg);
-            case glBindTexture:
-                return transformsForGlBindTexture(msg);
-            case glTexImage2D:
-                return transformsForGlTexImage2D(msg);
-            case glTexSubImage2D:
-                return transformsForGlTexSubImage2D(msg);
-            case glTexParameteri:
-                return transformsForGlTexParameter(msg);
-
-            // Program State Transformations
-            case glCreateProgram:
-                return transformsForGlCreateProgram(msg);
-            case glUseProgram:
-                return transformsForGlUseProgram(msg);
-            case glAttachShader:
-                return transformsForGlAttachShader(msg);
-            case glDetachShader:
-                return transformsForGlDetachShader(msg);
-            case glGetActiveAttrib:
-                return transformsForGlGetActiveAttrib(msg);
-            case glGetActiveUniform:
-                return transformsForGlGetActiveUniform(msg);
-            case glUniform1i:
-            case glUniform2i:
-            case glUniform3i:
-            case glUniform4i:
-                return transformsForGlUniform(msg, false);
-            case glUniform1f:
-            case glUniform2f:
-            case glUniform3f:
-            case glUniform4f:
-                return transformsForGlUniform(msg, true);
-            case glUniform1iv:
-            case glUniform2iv:
-            case glUniform3iv:
-            case glUniform4iv:
-                return transformsForGlUniformv(msg, false);
-            case glUniform1fv:
-            case glUniform2fv:
-            case glUniform3fv:
-            case glUniform4fv:
-                return transformsForGlUniformv(msg, true);
-            case glUniformMatrix2fv:
-            case glUniformMatrix3fv:
-            case glUniformMatrix4fv:
-                return transformsForGlUniformMatrix(msg);
-
-            // Shader State Transformations
-            case glCreateShader:
-                return transformsForGlCreateShader(msg);
-            case glDeleteShader:
-                return transformsForGlDeleteShader(msg);
-            case glShaderSource:
-                return transformsForGlShaderSource(msg);
-            default:
-                return Collections.emptyList();
-        }
-    }
-
-    private static List<IStateTransform> transformsForGlVertexAttribPointer(GLMessage msg) {
-        int index = msg.getArgs(0).getIntValue(0);
-
-        int size = msg.getArgs(1).getIntValue(0);
-        int type = msg.getArgs(2).getIntValue(0);
-        boolean normalized = msg.getArgs(3).getBoolValue(0);
-        int stride = msg.getArgs(4).getIntValue(0);
-
-        long pointer;
-        if (msg.getArgs(5).getIntValueCount() > 0) {
-            pointer = msg.getArgs(5).getIntValue(0);
-        } else {
-            pointer = msg.getArgs(5).getInt64Value(0);
-        }
-
-        List<IStateTransform> transforms = new ArrayList<IStateTransform>();
-        transforms.add(new PropertyChangeTransform(
-                GLPropertyAccessor.makeAccessor(msg.getContextId(),
-                                                GLStateType.VERTEX_ARRAY_DATA,
-                                                GLStateType.VERTEX_ATTRIB_ARRAY,
-                                                Integer.valueOf(index),
-                                                GLStateType.VERTEX_ATTRIB_ARRAY_SIZE),
-                Integer.valueOf(size)));
-        transforms.add(new PropertyChangeTransform(
-                GLPropertyAccessor.makeAccessor(msg.getContextId(),
-                                                GLStateType.VERTEX_ARRAY_DATA,
-                                                GLStateType.VERTEX_ATTRIB_ARRAY,
-                                                Integer.valueOf(index),
-                                                GLStateType.VERTEX_ATTRIB_ARRAY_TYPE),
-                GLEnum.valueOf(type)));
-        transforms.add(new PropertyChangeTransform(
-                GLPropertyAccessor.makeAccessor(msg.getContextId(),
-                                                GLStateType.VERTEX_ARRAY_DATA,
-                                                GLStateType.VERTEX_ATTRIB_ARRAY,
-                                                Integer.valueOf(index),
-                                                GLStateType.VERTEX_ATTRIB_ARRAY_NORMALIZED),
-                Boolean.valueOf(normalized)));
-        transforms.add(new PropertyChangeTransform(
-                GLPropertyAccessor.makeAccessor(msg.getContextId(),
-                                                GLStateType.VERTEX_ARRAY_DATA,
-                                                GLStateType.VERTEX_ATTRIB_ARRAY,
-                                                Integer.valueOf(index),
-                                                GLStateType.VERTEX_ATTRIB_ARRAY_STRIDE),
-                Integer.valueOf(stride)));
-        transforms.add(new PropertyChangeTransform(
-                GLPropertyAccessor.makeAccessor(msg.getContextId(),
-                                                GLStateType.VERTEX_ARRAY_DATA,
-                                                GLStateType.VERTEX_ATTRIB_ARRAY,
-                                                Integer.valueOf(index),
-                                                GLStateType.VERTEX_ATTRIB_ARRAY_POINTER),
-                Long.valueOf(pointer)));
-        return transforms;
-    }
-
-    private static List<IStateTransform> transformsForGlVertexAttrib(int context,
-            int index, float v0, float v1, float v2, float v3) {
-        List<IStateTransform> transforms = new ArrayList<IStateTransform>(4);
-        transforms.add(new PropertyChangeTransform(
-                GLPropertyAccessor.makeAccessor(context,
-                                                GLStateType.VERTEX_ARRAY_DATA,
-                                                GLStateType.GENERIC_VERTEX_ATTRIBUTES,
-                                                Integer.valueOf(index),
-                                                GLStateType.GENERIC_VERTEX_ATTRIB_V0),
-                Float.valueOf(v0)));
-        transforms.add(new PropertyChangeTransform(
-                GLPropertyAccessor.makeAccessor(context,
-                                                GLStateType.VERTEX_ARRAY_DATA,
-                                                GLStateType.GENERIC_VERTEX_ATTRIBUTES,
-                                                Integer.valueOf(index),
-                                                GLStateType.GENERIC_VERTEX_ATTRIB_V1),
-                Float.valueOf(v1)));
-        transforms.add(new PropertyChangeTransform(
-                GLPropertyAccessor.makeAccessor(context,
-                                                GLStateType.VERTEX_ARRAY_DATA,
-                                                GLStateType.GENERIC_VERTEX_ATTRIBUTES,
-                                                Integer.valueOf(index),
-                                                GLStateType.GENERIC_VERTEX_ATTRIB_V2),
-                Float.valueOf(v2)));
-        transforms.add(new PropertyChangeTransform(
-                GLPropertyAccessor.makeAccessor(context,
-                                                GLStateType.VERTEX_ARRAY_DATA,
-                                                GLStateType.GENERIC_VERTEX_ATTRIBUTES,
-                                                Integer.valueOf(index),
-                                                GLStateType.GENERIC_VERTEX_ATTRIB_V3),
-                Float.valueOf(v3)));
-        return transforms;
-    }
-
-    private static List<IStateTransform> transformsForGlVertexAttribxf(GLMessage msg) {
-        // void glVertexAttrib1f(GLuint index, GLfloat v0);
-        // void glVertexAttrib2f(GLuint index, GLfloat v0, GLfloat v1);
-        // void glVertexAttrib3f(GLuint index, GLfloat v0, GLfloat v1, GLfloat v2);
-        // void glVertexAttrib4f(GLuint index, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);
-
-        int index = msg.getArgs(0).getIntValue(0);
-        float v0 = msg.getArgs(1).getFloatValue(0);
-        float v1 = msg.getArgsCount() > 2 ? msg.getArgs(2).getFloatValue(0) : 0;
-        float v2 = msg.getArgsCount() > 3 ? msg.getArgs(3).getFloatValue(0) : 0;
-        float v3 = msg.getArgsCount() > 4 ? msg.getArgs(4).getFloatValue(0) : 0;
-
-        return transformsForGlVertexAttrib(msg.getContextId(), index, v0, v1, v2, v3);
-    }
-
-    private static List<IStateTransform> transformsForGlVertexAttribxfv(GLMessage msg) {
-        // void glVertexAttrib1fv(GLuint index, const GLfloat *v);
-        // void glVertexAttrib2fv(GLuint index, const GLfloat *v);
-        // void glVertexAttrib3fv(GLuint index, const GLfloat *v);
-        // void glVertexAttrib4fv(GLuint index, const GLfloat *v);
-
-        int index = msg.getArgs(0).getIntValue(0);
-        float v[] = new float[4];
-
-        for (int i = 0; i < msg.getArgs(1).getFloatValueList().size(); i++) {
-            v[i] = msg.getArgs(1).getFloatValue(i);
-        }
-
-        return transformsForGlVertexAttrib(msg.getContextId(), index, v[0], v[1], v[2], v[3]);
-    }
-
-    private static List<IStateTransform> transformsForGlEnableVertexAttribArray(GLMessage msg) {
-        // void glEnableVertexAttribArray(GLuint index);
-        // void glDisableVertexAttribArray(GLuint index);
-
-        int index = msg.getArgs(0).getIntValue(0);
-        IStateTransform transform = new PropertyChangeTransform(
-                GLPropertyAccessor.makeAccessor(msg.getContextId(),
-                                                GLStateType.VERTEX_ARRAY_DATA,
-                                                GLStateType.VERTEX_ATTRIB_ARRAY,
-                                                Integer.valueOf(index),
-                                                GLStateType.VERTEX_ATTRIB_ARRAY_ENABLED),
-                Boolean.TRUE);
-        return Collections.singletonList(transform);
-    }
-
-    private static List<IStateTransform> transformsForGlDisableVertexAttribArray(GLMessage msg) {
-        // void glEnableVertexAttribArray(GLuint index);
-        // void glDisableVertexAttribArray(GLuint index);
-
-        int index = msg.getArgs(0).getIntValue(0);
-        IStateTransform transform = new PropertyChangeTransform(
-                GLPropertyAccessor.makeAccessor(msg.getContextId(),
-                                                GLStateType.VERTEX_ARRAY_DATA,
-                                                GLStateType.VERTEX_ATTRIB_ARRAY,
-                                                Integer.valueOf(index),
-                                                GLStateType.VERTEX_ATTRIB_ARRAY_ENABLED),
-                Boolean.FALSE);
-        return Collections.singletonList(transform);
-    }
-
-    private static List<IStateTransform> transformsForGlBindBuffer(GLMessage msg) {
-        // void glBindBuffer(GLenum target, GLuint buffer);
-        // target is one of GL_ARRAY_BUFFER or GL_ELEMENT_ARRAY_BUFFER.
-
-        GLEnum target = GLEnum.valueOf(msg.getArgs(0).getIntValue(0));
-        int buffer = msg.getArgs(1).getIntValue(0);
-        GLStateType bufferType;
-
-        if (target == GLEnum.GL_ARRAY_BUFFER) {
-            bufferType = GLStateType.ARRAY_BUFFER_BINDING;
-        } else {
-            bufferType = GLStateType.ELEMENT_ARRAY_BUFFER_BINDING;
-        }
-
-        IStateTransform transform = new PropertyChangeTransform(
-                GLPropertyAccessor.makeAccessor(msg.getContextId(),
-                                                GLStateType.VERTEX_ARRAY_DATA,
-                                                GLStateType.BUFFER_BINDINGS,
-                                                bufferType),
-                Integer.valueOf(buffer));
-        return Collections.singletonList(transform);
-    }
-
-    private static List<IStateTransform> transformsForGlGenBuffers(GLMessage msg) {
-        // void glGenBuffers(GLsizei n, GLuint * buffers);
-        int n = msg.getArgs(0).getIntValue(0);
-        List<IStateTransform> transforms = new ArrayList<IStateTransform>();
-
-        for (int i = 0; i < n; i++) {
-            transforms.add(new SparseArrayElementAddTransform(
-                    GLPropertyAccessor.makeAccessor(msg.getContextId(),
-                                                    GLStateType.VERTEX_ARRAY_DATA,
-                                                    GLStateType.VBO),
-                    msg.getArgs(1).getIntValue(i)));
-        }
-
-        return transforms;
-    }
-
-    private static List<IStateTransform> transformsForGlDeleteBuffers(GLMessage msg) {
-        // void glDeleteBuffers(GLsizei n, const GLuint * buffers);
-        int n = msg.getArgs(0).getIntValue(0);
-        List<IStateTransform> transforms = new ArrayList<IStateTransform>();
-
-        for (int i = 0; i < n; i++) {
-            transforms.add(new SparseArrayElementRemoveTransform(
-                    GLPropertyAccessor.makeAccessor(msg.getContextId(),
-                                                    GLStateType.VERTEX_ARRAY_DATA,
-                                                    GLStateType.VBO),
-                    msg.getArgs(1).getIntValue(i)));
-        }
-
-        return transforms;
-    }
-
-    private static List<IStateTransform> transformsForGlBufferData(GLMessage msg) {
-        // void glBufferData(GLenum target, GLsizeiptr size, const GLvoid * data, GLenum usage);
-        GLEnum target = GLEnum.valueOf(msg.getArgs(0).getIntValue(0));
-        int size = msg.getArgs(1).getIntValue(0);
-        byte[] data = null;
-        GLEnum usage = GLEnum.valueOf(msg.getArgs(3).getIntValue(0));
-
-        if (msg.getArgs(2).getRawBytesList().size() > 0) {
-            data = msg.getArgs(2).getRawBytesList().get(0).toByteArray();
-        } else {
-            data = new byte[size];
-        }
-
-        List<IStateTransform> transforms = new ArrayList<IStateTransform>();
-
-        transforms.add(new PropertyChangeTransform(
-                new CurrentVboPropertyAccessor(msg.getContextId(),
-                                               target,
-                                               GLStateType.BUFFER_SIZE),
-                Integer.valueOf(size)));
-        transforms.add(new PropertyChangeTransform(
-                new CurrentVboPropertyAccessor(msg.getContextId(),
-                                               target,
-                                               GLStateType.BUFFER_DATA),
-                data));
-        transforms.add(new PropertyChangeTransform(
-                new CurrentVboPropertyAccessor(msg.getContextId(),
-                                               target,
-                                               GLStateType.BUFFER_USAGE),
-                usage));
-        transforms.add(new PropertyChangeTransform(
-                new CurrentVboPropertyAccessor(msg.getContextId(),
-                                               target,
-                                               GLStateType.BUFFER_TYPE),
-                target));
-        return transforms;
-    }
-
-    private static List<IStateTransform> transformsForGlBufferSubData(GLMessage msg) {
-        // void glBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid * data);
-        GLEnum target = GLEnum.valueOf(msg.getArgs(0).getIntValue(0));
-        int offset = msg.getArgs(1).getIntValue(0);
-        byte[] data = msg.getArgs(3).getRawBytesList().get(0).toByteArray();
-
-        IStateTransform transform = new BufferSubDataTransform(
-                new CurrentVboPropertyAccessor(msg.getContextId(),
-                        target,
-                        GLStateType.BUFFER_DATA),
-                offset, data);
-
-        return Collections.singletonList(transform);
-    }
-
-    private static List<IStateTransform> transformsForGlBindFramebuffer(GLMessage msg) {
-        // void glBindFramebuffer(GLenum target, GLuint framebuffer);
-        int fb = msg.getArgs(1).getIntValue(0);
-        IStateTransform transform = new PropertyChangeTransform(
-                GLPropertyAccessor.makeAccessor(msg.getContextId(),
-                        GLStateType.FRAMEBUFFER_STATE,
-                        GLStateType.FRAMEBUFFER_BINDING),
-                fb);
-        return Collections.singletonList(transform);
-    }
-
-    private static List<IStateTransform> transformsForGlLineWidth(GLMessage msg) {
-        // void glLineWidth(GLfloat width);
-        float width = msg.getArgs(0).getFloatValue(0);
-        IStateTransform transform = new PropertyChangeTransform(
-                GLPropertyAccessor.makeAccessor(msg.getContextId(),
-                        GLStateType.RASTERIZATION_STATE,
-                        GLStateType.LINE_WIDTH),
-                width);
-        return Collections.singletonList(transform);
-    }
-
-    private static List<IStateTransform> transformsForGlCullFace(GLMessage msg) {
-        // void glCullFace(GLenum mode);
-        int mode = msg.getArgs(0).getIntValue(0);
-        IStateTransform transform = new PropertyChangeTransform(
-                GLPropertyAccessor.makeAccessor(msg.getContextId(),
-                        GLStateType.RASTERIZATION_STATE,
-                        GLStateType.CULL_FACE_MODE),
-                GLEnum.valueOf(mode));
-        return Collections.singletonList(transform);
-    }
-
-    private static List<IStateTransform> transformsForGlFrontFace(GLMessage msg) {
-        // void glFrontFace(GLenum mode);
-        int mode = msg.getArgs(0).getIntValue(0);
-        IStateTransform transform = new PropertyChangeTransform(
-                GLPropertyAccessor.makeAccessor(msg.getContextId(),
-                        GLStateType.RASTERIZATION_STATE,
-                        GLStateType.FRONT_FACE),
-                GLEnum.valueOf(mode));
-        return Collections.singletonList(transform);
-    }
-
-    private static List<IStateTransform> transformsForGlPolygonOffset(GLMessage msg) {
-        // void glPolygonOffset(GLfloat factor, GLfloat units)
-        float factor = msg.getArgs(0).getFloatValue(0);
-        float units = msg.getArgs(1).getFloatValue(0);
-
-        List<IStateTransform> transforms = new ArrayList<IStateTransform>();
-        transforms.add(new PropertyChangeTransform(
-                GLPropertyAccessor.makeAccessor(msg.getContextId(),
-                        GLStateType.RASTERIZATION_STATE,
-                        GLStateType.POLYGON_OFFSET_FACTOR),
-                Float.valueOf(factor)));
-        transforms.add(new PropertyChangeTransform(
-                GLPropertyAccessor.makeAccessor(msg.getContextId(),
-                        GLStateType.RASTERIZATION_STATE,
-                        GLStateType.POLYGON_OFFSET_UNITS),
-                Float.valueOf(units)));
-        return transforms;
-    }
-
-    private static List<IStateTransform> transformsForGlScissor(GLMessage msg) {
-        // void glScissor(GLint x, GLint y, GLsizei width, GLsizei height);
-        int x = msg.getArgs(0).getIntValue(0);
-        int y = msg.getArgs(1).getIntValue(0);
-        int w = msg.getArgs(2).getIntValue(0);
-        int h = msg.getArgs(3).getIntValue(0);
-
-        List<IStateTransform> transforms = new ArrayList<IStateTransform>();
-        transforms.add(new PropertyChangeTransform(
-                GLPropertyAccessor.makeAccessor(msg.getContextId(),
-                        GLStateType.PIXEL_OPERATIONS,
-                        GLStateType.SCISSOR_BOX,
-                        GLStateType.SCISSOR_BOX_X),
-                Integer.valueOf(x)));
-        transforms.add(new PropertyChangeTransform(
-                GLPropertyAccessor.makeAccessor(msg.getContextId(),
-                        GLStateType.PIXEL_OPERATIONS,
-                        GLStateType.SCISSOR_BOX,
-                        GLStateType.SCISSOR_BOX_Y),
-                Integer.valueOf(y)));
-        transforms.add(new PropertyChangeTransform(
-                GLPropertyAccessor.makeAccessor(msg.getContextId(),
-                        GLStateType.PIXEL_OPERATIONS,
-                        GLStateType.SCISSOR_BOX,
-                        GLStateType.SCISSOR_BOX_WIDTH),
-                Integer.valueOf(w)));
-        transforms.add(new PropertyChangeTransform(
-                GLPropertyAccessor.makeAccessor(msg.getContextId(),
-                        GLStateType.PIXEL_OPERATIONS,
-                        GLStateType.SCISSOR_BOX,
-                        GLStateType.SCISSOR_BOX_HEIGHT),
-                Integer.valueOf(h)));
-        return transforms;
-    }
-
-    private static List<IStateTransform> transformsForGlStencilFuncFront(int contextId,
-            GLEnum func, int ref, int mask) {
-        List<IStateTransform> transforms = new ArrayList<IStateTransform>();
-        transforms.add(new PropertyChangeTransform(
-                GLPropertyAccessor.makeAccessor(contextId,
-                        GLStateType.PIXEL_OPERATIONS,
-                        GLStateType.STENCIL,
-                        GLStateType.STENCIL_FUNC),
-                func));
-        transforms.add(new PropertyChangeTransform(
-                GLPropertyAccessor.makeAccessor(contextId,
-                        GLStateType.PIXEL_OPERATIONS,
-                        GLStateType.STENCIL,
-                        GLStateType.STENCIL_REF),
-                Integer.valueOf(ref)));
-        transforms.add(new PropertyChangeTransform(
-                GLPropertyAccessor.makeAccessor(contextId,
-                        GLStateType.PIXEL_OPERATIONS,
-                        GLStateType.STENCIL,
-                        GLStateType.STENCIL_VALUE_MASK),
-                Integer.valueOf(mask)));
-        return transforms;
-    }
-
-    private static List<IStateTransform> transformsForGlStencilFuncBack(int contextId,
-            GLEnum func, int ref, int mask) {
-        List<IStateTransform> transforms = new ArrayList<IStateTransform>();
-        transforms.add(new PropertyChangeTransform(
-                GLPropertyAccessor.makeAccessor(contextId,
-                        GLStateType.PIXEL_OPERATIONS,
-                        GLStateType.STENCIL,
-                        GLStateType.STENCIL_BACK_FUNC),
-                func));
-        transforms.add(new PropertyChangeTransform(
-                GLPropertyAccessor.makeAccessor(contextId,
-                        GLStateType.PIXEL_OPERATIONS,
-                        GLStateType.STENCIL,
-                        GLStateType.STENCIL_BACK_REF),
-                Integer.valueOf(ref)));
-        transforms.add(new PropertyChangeTransform(
-                GLPropertyAccessor.makeAccessor(contextId,
-                        GLStateType.PIXEL_OPERATIONS,
-                        GLStateType.STENCIL,
-                        GLStateType.STENCIL_BACK_VALUE_MASK),
-                Integer.valueOf(mask)));
-        return transforms;
-    }
-
-    private static List<IStateTransform> transformsForGlStencilFunc(GLMessage msg) {
-        // void glStencilFunc(GLenum func, GLint ref, GLuint mask);
-        GLEnum func = GLEnum.valueOf(msg.getArgs(0).getIntValue(0));
-        int ref = msg.getArgs(1).getIntValue(0);
-        int mask = msg.getArgs(2).getIntValue(0);
-
-        List<IStateTransform> transforms = new ArrayList<IStateTransform>();
-        transforms.addAll(transformsForGlStencilFuncFront(msg.getContextId(), func, ref, mask));
-        transforms.addAll(transformsForGlStencilFuncBack(msg.getContextId(), func, ref, mask));
-        return transforms;
-    }
-
-    private static List<IStateTransform> transformsForGlStencilFuncSeparate(GLMessage msg) {
-        // void glStencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask);
-        GLEnum face = GLEnum.valueOf(msg.getArgs(0).getIntValue(0));
-        GLEnum func = GLEnum.valueOf(msg.getArgs(1).getIntValue(0));
-        int ref = msg.getArgs(2).getIntValue(0);
-        int mask = msg.getArgs(3).getIntValue(0);
-
-        List<IStateTransform> transforms = new ArrayList<IStateTransform>();
-        if (face == GLEnum.GL_FRONT || face == GLEnum.GL_FRONT_AND_BACK) {
-            transforms.addAll(
-                    transformsForGlStencilFuncFront(msg.getContextId(), func, ref, mask));
-        }
-        if (face == GLEnum.GL_BACK || face == GLEnum.GL_FRONT_AND_BACK) {
-            transforms.addAll(
-                    transformsForGlStencilFuncBack(msg.getContextId(), func, ref, mask));
-        }
-
-        return transforms;
-    }
-
-    private static List<IStateTransform> transformsForGlStencilOpFront(int contextId,
-            GLEnum sfail, GLEnum dpfail, GLEnum dppass) {
-        List<IStateTransform> transforms = new ArrayList<IStateTransform>();
-        transforms.add(new PropertyChangeTransform(
-                GLPropertyAccessor.makeAccessor(contextId,
-                        GLStateType.PIXEL_OPERATIONS,
-                        GLStateType.STENCIL,
-                        GLStateType.STENCIL_FAIL),
-                sfail));
-        transforms.add(new PropertyChangeTransform(
-                GLPropertyAccessor.makeAccessor(contextId,
-                        GLStateType.PIXEL_OPERATIONS,
-                        GLStateType.STENCIL,
-                        GLStateType.STENCIL_PASS_DEPTH_FAIL),
-                dpfail));
-        transforms.add(new PropertyChangeTransform(
-                GLPropertyAccessor.makeAccessor(contextId,
-                        GLStateType.PIXEL_OPERATIONS,
-                        GLStateType.STENCIL,
-                        GLStateType.STENCIL_PASS_DEPTH_PASS),
-                dppass));
-        return transforms;
-    }
-
-    private static List<IStateTransform> transformsForGlStencilOpBack(int contextId,
-            GLEnum sfail, GLEnum dpfail, GLEnum dppass) {
-        List<IStateTransform> transforms = new ArrayList<IStateTransform>();
-        transforms.add(new PropertyChangeTransform(
-                GLPropertyAccessor.makeAccessor(contextId,
-                        GLStateType.PIXEL_OPERATIONS,
-                        GLStateType.STENCIL,
-                        GLStateType.STENCIL_BACK_FAIL),
-                sfail));
-        transforms.add(new PropertyChangeTransform(
-                GLPropertyAccessor.makeAccessor(contextId,
-                        GLStateType.PIXEL_OPERATIONS,
-                        GLStateType.STENCIL,
-                        GLStateType.STENCIL_BACK_PASS_DEPTH_FAIL),
-                dpfail));
-        transforms.add(new PropertyChangeTransform(
-                GLPropertyAccessor.makeAccessor(contextId,
-                        GLStateType.PIXEL_OPERATIONS,
-                        GLStateType.STENCIL,
-                        GLStateType.STENCIL_BACK_PASS_DEPTH_PASS),
-                dppass));
-        return transforms;
-    }
-
-    private static List<IStateTransform> transformsForGlStencilOp(GLMessage msg) {
-        // void glStencilOp(GLenum sfail, GLenum dpfail, GLenum dppass);
-        GLEnum sfail = GLEnum.valueOf(msg.getArgs(0).getIntValue(0));
-        GLEnum dpfail = GLEnum.valueOf(msg.getArgs(1).getIntValue(0));
-        GLEnum dppass = GLEnum.valueOf(msg.getArgs(2).getIntValue(0));
-        List<IStateTransform> transforms = new ArrayList<IStateTransform>();
-        transforms.addAll(
-                transformsForGlStencilOpFront(msg.getContextId(), sfail, dpfail, dppass));
-        transforms.addAll(
-                transformsForGlStencilOpBack(msg.getContextId(), sfail, dpfail, dppass));
-        return transforms;
-    }
-
-    private static List<IStateTransform> transformsForGlStencilOpSeparate(GLMessage msg) {
-        // void glStencilOp(GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass);
-        GLEnum face = GLEnum.valueOf(msg.getArgs(0).getIntValue(0));
-        GLEnum sfail = GLEnum.valueOf(msg.getArgs(1).getIntValue(0));
-        GLEnum dpfail = GLEnum.valueOf(msg.getArgs(2).getIntValue(0));
-        GLEnum dppass = GLEnum.valueOf(msg.getArgs(3).getIntValue(0));
-        List<IStateTransform> transforms = new ArrayList<IStateTransform>();
-
-        if (face == GLEnum.GL_FRONT || face == GLEnum.GL_FRONT_AND_BACK) {
-            transforms.addAll(
-                    transformsForGlStencilOpFront(msg.getContextId(), sfail, dpfail, dppass));
-        }
-
-        if (face == GLEnum.GL_BACK || face == GLEnum.GL_FRONT_AND_BACK) {
-            transforms.addAll(
-                    transformsForGlStencilOpBack(msg.getContextId(), sfail, dpfail, dppass));
-        }
-
-        return transforms;
-    }
-
-    private static List<IStateTransform> transformsForGlDepthFunc(GLMessage msg) {
-        // void glDepthFunc(GLenum func);
-        GLEnum func = GLEnum.valueOf(msg.getArgs(0).getIntValue(0));
-
-        IStateTransform transform = new PropertyChangeTransform(
-                GLPropertyAccessor.makeAccessor(msg.getContextId(),
-                        GLStateType.PIXEL_OPERATIONS,
-                        GLStateType.DEPTH_FUNC),
-                func);
-        return Collections.singletonList(transform);
-    }
-
-    private static IStateTransform transformForGlEquationRGB(int contextId, GLEnum mode) {
-        return new PropertyChangeTransform(
-                GLPropertyAccessor.makeAccessor(contextId,
-                        GLStateType.PIXEL_OPERATIONS,
-                        GLStateType.BLEND,
-                        GLStateType.BLEND_EQUATION_RGB),
-                mode);
-    }
-
-    private static IStateTransform transformForGlEquationAlpha(int contextId, GLEnum mode) {
-        return new PropertyChangeTransform(
-                GLPropertyAccessor.makeAccessor(contextId,
-                        GLStateType.PIXEL_OPERATIONS,
-                        GLStateType.BLEND,
-                        GLStateType.BLEND_EQUATION_ALPHA),
-                mode);
-    }
-
-    private static List<IStateTransform> transformsForGlBlendEquationSeparate(GLMessage msg) {
-        // void glBlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha);
-        GLEnum rgb = GLEnum.valueOf(msg.getArgs(0).getIntValue(0));
-        GLEnum alpha = GLEnum.valueOf(msg.getArgs(1).getIntValue(0));
-
-        List<IStateTransform> transforms = new ArrayList<IStateTransform>();
-        transforms.add(transformForGlEquationRGB(msg.getContextId(), rgb));
-        transforms.add(transformForGlEquationAlpha(msg.getContextId(), alpha));
-        return transforms;
-    }
-
-    private static List<IStateTransform> transformsForGlBlendEquation(GLMessage msg) {
-        // void glBlendEquation(GLenum mode);
-        GLEnum mode = GLEnum.valueOf(msg.getArgs(0).getIntValue(0));
-
-        List<IStateTransform> transforms = new ArrayList<IStateTransform>();
-        transforms.add(transformForGlEquationRGB(msg.getContextId(), mode));
-        transforms.add(transformForGlEquationAlpha(msg.getContextId(), mode));
-        return transforms;
-    }
-
-    private static List<IStateTransform> transformsForGlBlendFuncSrcDst(boolean src,
-            int contextId, GLEnum rgb, GLEnum alpha) {
-        List<IStateTransform> transforms = new ArrayList<IStateTransform>();
-
-        GLStateType rgbAccessor = GLStateType.BLEND_DST_RGB;
-        GLStateType alphaAccessor = GLStateType.BLEND_DST_ALPHA;
-        if (src) {
-            rgbAccessor = GLStateType.BLEND_SRC_RGB;
-            alphaAccessor = GLStateType.BLEND_SRC_ALPHA;
-        }
-
-        transforms.add(new PropertyChangeTransform(
-                GLPropertyAccessor.makeAccessor(contextId,
-                        GLStateType.PIXEL_OPERATIONS,
-                        GLStateType.BLEND,
-                        rgbAccessor),
-                rgb));
-        transforms.add(new PropertyChangeTransform(
-                GLPropertyAccessor.makeAccessor(contextId,
-                        GLStateType.PIXEL_OPERATIONS,
-                        GLStateType.BLEND,
-                        alphaAccessor),
-                alpha));
-        return transforms;
-    }
-
-    private static List<IStateTransform> transformsForGlBlendFuncSeparate(GLMessage msg) {
-        // void glBlendFuncSeparate(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha)
-        GLEnum srcRgb = GLEnum.valueOf(msg.getArgs(0).getIntValue(0));
-        GLEnum dstRgb = GLEnum.valueOf(msg.getArgs(1).getIntValue(0));
-        GLEnum srcAlpha = GLEnum.valueOf(msg.getArgs(2).getIntValue(0));
-        GLEnum dstAlpha = GLEnum.valueOf(msg.getArgs(3).getIntValue(0));
-
-        List<IStateTransform> transforms = new ArrayList<IStateTransform>();
-        transforms.addAll(transformsForGlBlendFuncSrcDst(true,
-                msg.getContextId(), srcRgb, srcAlpha));
-        transforms.addAll(transformsForGlBlendFuncSrcDst(false,
-                msg.getContextId(), dstRgb, dstAlpha));
-        return transforms;
-    }
-
-    private static List<IStateTransform> transformsForGlBlendFunc(GLMessage msg) {
-        // void glBlendFunc(GLenum sfactor, GLenum dfactor);
-        GLEnum sfactor = GLEnum.valueOf(msg.getArgs(0).getIntValue(0));
-        GLEnum dfactor = GLEnum.valueOf(msg.getArgs(1).getIntValue(0));
-
-        List<IStateTransform> transforms = new ArrayList<IStateTransform>();
-        transforms.addAll(transformsForGlBlendFuncSrcDst(true,
-                msg.getContextId(), sfactor, sfactor));
-        transforms.addAll(transformsForGlBlendFuncSrcDst(false,
-                msg.getContextId(), dfactor, dfactor));
-        return transforms;
-    }
-
-    private static List<IStateTransform> transformsForGlPixelStorei(GLMessage msg) {
-        // void glPixelStorei(GLenum pname, GLint param);
-        GLEnum pname = GLEnum.valueOf(msg.getArgs(0).getIntValue(0));
-        Integer param = Integer.valueOf(msg.getArgs(1).getIntValue(0));
-
-        IStateTransform transform;
-        if (pname == GLEnum.GL_PACK_ALIGNMENT) {
-            transform = new PropertyChangeTransform(
-                    GLPropertyAccessor.makeAccessor(msg.getContextId(),
-                            GLStateType.PIXEL_PACKING,
-                            GLStateType.PACK_ALIGNMENT),
-                    param);
-        } else {
-            transform = new PropertyChangeTransform(
-                    GLPropertyAccessor.makeAccessor(msg.getContextId(),
-                            GLStateType.PIXEL_PACKING,
-                            GLStateType.UNPACK_ALIGNMENT),
-                    param);
-        }
-
-        return Collections.singletonList(transform);
-    }
-
-    private static List<IStateTransform> transformsForGlViewport(GLMessage msg) {
-        // void glViewport( GLint x, GLint y, GLsizei width, GLsizei height);
-        int x = msg.getArgs(0).getIntValue(0);
-        int y = msg.getArgs(1).getIntValue(0);
-        int w = msg.getArgs(2).getIntValue(0);
-        int h = msg.getArgs(3).getIntValue(0);
-
-        List<IStateTransform> transforms = new ArrayList<IStateTransform>();
-        transforms.add(new PropertyChangeTransform(
-                GLPropertyAccessor.makeAccessor(msg.getContextId(),
-                                                GLStateType.TRANSFORMATION_STATE,
-                                                GLStateType.VIEWPORT,
-                                                GLStateType.VIEWPORT_X),
-                Integer.valueOf(x)));
-        transforms.add(new PropertyChangeTransform(
-                GLPropertyAccessor.makeAccessor(msg.getContextId(),
-                                                GLStateType.TRANSFORMATION_STATE,
-                                                GLStateType.VIEWPORT,
-                                                GLStateType.VIEWPORT_Y),
-                Integer.valueOf(y)));
-        transforms.add(new PropertyChangeTransform(
-                GLPropertyAccessor.makeAccessor(msg.getContextId(),
-                                                GLStateType.TRANSFORMATION_STATE,
-                                                GLStateType.VIEWPORT,
-                                                GLStateType.VIEWPORT_WIDTH),
-                Integer.valueOf(w)));
-        transforms.add(new PropertyChangeTransform(
-                GLPropertyAccessor.makeAccessor(msg.getContextId(),
-                                                GLStateType.TRANSFORMATION_STATE,
-                                                GLStateType.VIEWPORT,
-                                                GLStateType.VIEWPORT_HEIGHT),
-                Integer.valueOf(h)));
-        return transforms;
-    }
-
-    private static List<IStateTransform> transformsForGlDepthRangef(GLMessage msg) {
-        // void glDepthRangef(GLclampf nearVal, GLclampf farVal);
-        float near = msg.getArgs(0).getFloatValue(0);
-        float far = msg.getArgs(1).getFloatValue(0);
-
-        List<IStateTransform> transforms = new ArrayList<IStateTransform>();
-        transforms.add(new PropertyChangeTransform(
-                GLPropertyAccessor.makeAccessor(msg.getContextId(),
-                                                GLStateType.TRANSFORMATION_STATE,
-                                                GLStateType.DEPTH_RANGE,
-                                                GLStateType.DEPTH_RANGE_NEAR),
-                Float.valueOf(near)));
-        transforms.add(new PropertyChangeTransform(
-                GLPropertyAccessor.makeAccessor(msg.getContextId(),
-                                                GLStateType.TRANSFORMATION_STATE,
-                                                GLStateType.DEPTH_RANGE,
-                                                GLStateType.DEPTH_RANGE_FAR),
-                Float.valueOf(far)));
-        return transforms;
-    }
-
-    private static List<IStateTransform> transformsForGlGenTextures(GLMessage msg) {
-        // void glGenTextures(GLsizei n, GLuint *textures);
-        int n = msg.getArgs(0).getIntValue(0);
-
-        List<IStateTransform> transforms = new ArrayList<IStateTransform>();
-        for (int i = 0; i < n; i++) {
-            int texture = msg.getArgs(1).getIntValue(i);
-            transforms.add(new SparseArrayElementAddTransform(
-                    GLPropertyAccessor.makeAccessor(msg.getContextId(),
-                                                    GLStateType.TEXTURE_STATE,
-                                                    GLStateType.TEXTURES),
-                    texture));
-        }
-
-        return transforms;
-    }
-
-    /**
-     * Obtain a list of transforms that will reset any existing texture units
-     * that are bound to provided texture.
-     * @param contextId context to operate on
-     * @param texture texture that should be unbound
-     */
-    private static List<IStateTransform> transformsToResetBoundTextureUnits(int contextId,
-            int texture) {
-        List<IStateTransform> transforms = new ArrayList<IStateTransform>(
-                GLState.TEXTURE_UNIT_COUNT);
-
-        for (int i = 0; i < GLState.TEXTURE_UNIT_COUNT; i++) {
-            transforms.add(new PropertyChangeTransform(
-                    GLPropertyAccessor.makeAccessor(contextId,
-                                                    GLStateType.TEXTURE_STATE,
-                                                    GLStateType.TEXTURE_UNITS,
-                                                    Integer.valueOf(i),
-                                                    GLStateType.TEXTURE_BINDING_2D),
-                    Integer.valueOf(0), /* reset binding to texture 0 */
-                    Predicates.matchesInteger(texture) /* only if currently bound to @texture */ ));
-        }
-        return transforms;
-    }
-
-    private static List<IStateTransform> transformsForGlDeleteTextures(GLMessage msg) {
-        // void glDeleteTextures(GLsizei n, const GLuint * textures);
-        int n = msg.getArgs(0).getIntValue(0);
-
-        List<IStateTransform> transforms = new ArrayList<IStateTransform>(n);
-        for (int i = 0; i < n; i++) {
-            int texture = msg.getArgs(1).getIntValue(i);
-            transforms.add(new SparseArrayElementRemoveTransform(
-                    GLPropertyAccessor.makeAccessor(msg.getContextId(),
-                                                    GLStateType.TEXTURE_STATE,
-                                                    GLStateType.TEXTURES),
-                    texture));
-            transforms.addAll(transformsToResetBoundTextureUnits(msg.getContextId(), texture));
-        }
-
-        return transforms;
-    }
-
-    private static List<IStateTransform> transformsForGlActiveTexture(GLMessage msg) {
-        // void glActiveTexture(GLenum texture);
-        GLEnum texture = GLEnum.valueOf(msg.getArgs(0).getIntValue(0));
-        Integer textureIndex = Integer.valueOf((int)(texture.value - GLEnum.GL_TEXTURE0.value));
-        IStateTransform transform = new PropertyChangeTransform(
-                GLPropertyAccessor.makeAccessor(msg.getContextId(),
-                                                GLStateType.TEXTURE_STATE,
-                                                GLStateType.ACTIVE_TEXTURE_UNIT),
-                textureIndex);
-        return Collections.singletonList(transform);
-    }
-
-    private static GLStateType getTextureUnitTargetName(GLEnum target) {
-        if (target == GLEnum.GL_TEXTURE_CUBE_MAP) {
-            return GLStateType.TEXTURE_BINDING_CUBE_MAP;
-        } else if (target == GLEnum.GL_TEXTURE_EXTERNAL) {
-            // added by OES_EGL_image_external
-            return GLStateType.TEXTURE_BINDING_EXTERNAL;
-        } else {
-            return GLStateType.TEXTURE_BINDING_2D;
-        }
-    }
-
-    private static GLStateType getTextureTargetName(GLEnum pname) {
-        switch (pname) {
-            case GL_TEXTURE_MIN_FILTER:
-                return GLStateType.TEXTURE_MIN_FILTER;
-            case GL_TEXTURE_MAG_FILTER:
-                return GLStateType.TEXTURE_MAG_FILTER;
-            case GL_TEXTURE_WRAP_S:
-                return GLStateType.TEXTURE_WRAP_S;
-            case GL_TEXTURE_WRAP_T:
-                return GLStateType.TEXTURE_WRAP_T;
-        }
-
-        assert false : "glTexParameter's pname argument does not support provided value.";
-        return GLStateType.TEXTURE_MIN_FILTER;
-    }
-
-    private static List<IStateTransform> transformsForGlBindTexture(GLMessage msg) {
-        // void glBindTexture(GLenum target, GLuint texture);
-        GLEnum target = GLEnum.valueOf(msg.getArgs(0).getIntValue(0));
-        Integer texture = Integer.valueOf(msg.getArgs(1).getIntValue(0));
-
-        IStateTransform transform = new PropertyChangeTransform(
-                new TextureUnitPropertyAccessor(msg.getContextId(),
-                                                getTextureUnitTargetName(target)),
-                texture);
-        return Collections.singletonList(transform);
-    }
-
-    /**
-     * Utility function used by both {@link #transformsForGlTexImage2D(GLMessage) and
-     * {@link #transformsForGlTexSubImage2D(GLMessage)}.
-     */
-    private static List<IStateTransform> transformsForGlTexImage(GLMessage msg, int widthArgIndex,
-            int heightArgIndex, int xOffsetIndex, int yOffsetIndex) {
-        GLEnum target = GLEnum.valueOf(msg.getArgs(0).getIntValue(0));
-        int level = msg.getArgs(1).getIntValue(0);
-        Integer width = Integer.valueOf(msg.getArgs(widthArgIndex).getIntValue(0));
-        Integer height = Integer.valueOf(msg.getArgs(heightArgIndex).getIntValue(0));
-        GLEnum format = GLEnum.valueOf(msg.getArgs(6).getIntValue(0));
-        GLEnum type = GLEnum.valueOf(msg.getArgs(7).getIntValue(0));
-
-        List<IStateTransform> transforms = new ArrayList<IStateTransform>();
-        transforms.add(new PropertyChangeTransform(
-                new TexturePropertyAccessor(msg.getContextId(),
-                                            getTextureUnitTargetName(target),
-                                            level,
-                                            GLStateType.TEXTURE_WIDTH),
-                width));
-        transforms.add(new PropertyChangeTransform(
-                new TexturePropertyAccessor(msg.getContextId(),
-                                            getTextureUnitTargetName(target),
-                                            level,
-                                            GLStateType.TEXTURE_HEIGHT),
-                height));
-        transforms.add(new PropertyChangeTransform(
-                new TexturePropertyAccessor(msg.getContextId(),
-                                            getTextureUnitTargetName(target),
-                                            level,
-                                            GLStateType.TEXTURE_FORMAT),
-                format));
-        transforms.add(new PropertyChangeTransform(
-                new TexturePropertyAccessor(msg.getContextId(),
-                                            getTextureUnitTargetName(target),
-                                            level,
-                                            GLStateType.TEXTURE_IMAGE_TYPE),
-                type));
-
-        // if texture data is available, extract and store it in the cache folder
-        File f = null;
-        if (msg.getArgs(8).getIsArray()) {
-            ByteString data = msg.getArgs(8).getRawBytes(0);
-            f = FileUtils.createTempFile(TEXTURE_DATA_FILE_PREFIX, TEXTURE_DATA_FILE_SUFFIX);
-            try {
-                Files.write(data.toByteArray(), f);
-            } catch (IOException e) {
-                throw new RuntimeException(e);
-            }
-        }
-
-        int xOffset = 0;
-        int yOffset = 0;
-
-        if (xOffsetIndex >= 0) {
-            xOffset = msg.getArgs(xOffsetIndex).getIntValue(0);
-        }
-
-        if (yOffsetIndex >= 0) {
-            yOffset = msg.getArgs(yOffsetIndex).getIntValue(0);
-        }
-
-        transforms.add(new TexImageTransform(
-                new TexturePropertyAccessor(msg.getContextId(),
-                        getTextureUnitTargetName(target),
-                        level,
-                        GLStateType.TEXTURE_IMAGE),
-                f, format, type, xOffset, yOffset, width, height));
-
-        return transforms;
-    }
-
-    private static List<IStateTransform> transformsForGlTexImage2D(GLMessage msg) {
-        // void glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width,
-        //          GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *data);
-        return transformsForGlTexImage(msg, 3, 4, -1, -1);
-    }
-
-    private static List<IStateTransform> transformsForGlTexSubImage2D(GLMessage msg) {
-        // void glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset,
-        //          GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *data);
-        return transformsForGlTexImage(msg, 4, 5, 2, 3);
-    }
-
-    private static List<IStateTransform> transformsForGlTexParameter(GLMessage msg) {
-        // void glTexParameteri(GLenum target, GLenum pname, GLint param);
-        GLEnum target = GLEnum.valueOf(msg.getArgs(0).getIntValue(0));
-        GLEnum pname = GLEnum.valueOf(msg.getArgs(1).getIntValue(0));
-        GLEnum pvalue = GLEnum.valueOf(msg.getArgs(2).getIntValue(0));
-
-        if (sTexParameterPnameValues == null) {
-            GLEnum[] pnameValues = new GLEnum[] {
-                    GLEnum.GL_TEXTURE_BASE_LEVEL,
-                    GLEnum.GL_TEXTURE_COMPARE_FUNC,
-                    GLEnum.GL_TEXTURE_COMPARE_MODE,
-                    GLEnum.GL_TEXTURE_MIN_FILTER,
-                    GLEnum.GL_TEXTURE_MAG_FILTER,
-                    GLEnum.GL_TEXTURE_MIN_LOD,
-                    GLEnum.GL_TEXTURE_MAX_LOD,
-                    GLEnum.GL_TEXTURE_MAX_LEVEL,
-                    GLEnum.GL_TEXTURE_SWIZZLE_R,
-                    GLEnum.GL_TEXTURE_SWIZZLE_G,
-                    GLEnum.GL_TEXTURE_SWIZZLE_B,
-                    GLEnum.GL_TEXTURE_SWIZZLE_A,
-                    GLEnum.GL_TEXTURE_WRAP_S,
-                    GLEnum.GL_TEXTURE_WRAP_T,
-                    GLEnum.GL_TEXTURE_WRAP_R
-            };
-            sTexParameterPnameValues = EnumSet.copyOf(Arrays.asList(pnameValues));
-        }
-
-        if (!sTexParameterPnameValues.contains(pname)) {
-            throw new IllegalArgumentException(
-                    String.format("Unsupported parameter (%s) for glTexParameter()", pname));
-        }
-
-        IStateTransform transform = new PropertyChangeTransform(
-                new TexturePropertyAccessor(msg.getContextId(),
-                                            getTextureUnitTargetName(target),
-                                            getTextureTargetName(pname)),
-                pvalue);
-        return Collections.singletonList(transform);
-    }
-
-    private static List<IStateTransform> transformsForGlCreateProgram(GLMessage msg) {
-        // GLuint glCreateProgram(void);
-        int program = msg.getReturnValue().getIntValue(0);
-
-        IStateTransform transform = new SparseArrayElementAddTransform(
-                GLPropertyAccessor.makeAccessor(msg.getContextId(),
-                                                GLStateType.PROGRAM_STATE,
-                                                GLStateType.PROGRAMS),
-                program);
-        return Collections.singletonList(transform);
-    }
-
-    private static List<IStateTransform> transformsForGlUseProgram(GLMessage msg) {
-        // void glUseProgram(GLuint program);
-        Integer program = Integer.valueOf(msg.getArgs(0).getIntValue(0));
-
-        IStateTransform transform = new PropertyChangeTransform(
-                GLPropertyAccessor.makeAccessor(msg.getContextId(),
-                                                GLStateType.PROGRAM_STATE,
-                                                GLStateType.CURRENT_PROGRAM),
-                program);
-        return Collections.singletonList(transform);
-    }
-
-    private static List<IStateTransform> transformsForGlAttachShader(GLMessage msg) {
-        // void glAttachShader(GLuint program, GLuint shader);
-        int program = msg.getArgs(0).getIntValue(0);
-        int shader = msg.getArgs(1).getIntValue(0);
-
-        IStateTransform transform = new SparseArrayElementAddTransform(
-                GLPropertyAccessor.makeAccessor(msg.getContextId(),
-                                                GLStateType.PROGRAM_STATE,
-                                                GLStateType.PROGRAMS,
-                                                Integer.valueOf(program),
-                                                GLStateType.ATTACHED_SHADERS),
-                Integer.valueOf(shader));
-        return Collections.singletonList(transform);
-    }
-
-    private static List<IStateTransform> transformsForGlDetachShader(GLMessage msg) {
-        // void glDetachShader(GLuint program, GLuint shader);
-        int program = msg.getArgs(0).getIntValue(0);
-        int shader = msg.getArgs(1).getIntValue(0);
-
-        IStateTransform transform = new SparseArrayElementRemoveTransform(
-                GLPropertyAccessor.makeAccessor(msg.getContextId(),
-                                                GLStateType.PROGRAM_STATE,
-                                                GLStateType.PROGRAMS,
-                                                Integer.valueOf(program),
-                                                GLStateType.ATTACHED_SHADERS),
-                Integer.valueOf(shader));
-        return Collections.singletonList(transform);
-    }
-
-    private static List<IStateTransform> transformsForGlGetActiveAttribOrUniform(
-            GLMessage msg, boolean isAttrib) {
-        // void glGetActive[Attrib|Uniform](GLuint program, GLuint index, GLsizei bufsize,
-        //                  GLsizei* length, GLint* size, GLenum* type, GLchar* name);
-        int program = msg.getArgs(0).getIntValue(0);
-        int size = msg.getArgs(4).getIntValue(0);
-        GLEnum type = GLEnum.valueOf(msg.getArgs(5).getIntValue(0));
-        String name = msg.getArgs(6).getCharValue(0).toStringUtf8();
-
-        // The 2nd argument (index) does not give the correct location of the
-        // attribute/uniform in device. The actual location is obtained from
-        // the getAttribLocation or getUniformLocation calls. The trace library
-        // appends this value as an additional last argument to this call.
-        int location = msg.getArgs(7).getIntValue(0);
-
-        GLStateType activeInput;
-        GLStateType inputName;
-        GLStateType inputType;
-        GLStateType inputSize;
-
-        if (isAttrib) {
-            activeInput = GLStateType.ACTIVE_ATTRIBUTES;
-            inputName = GLStateType.ATTRIBUTE_NAME;
-            inputType = GLStateType.ATTRIBUTE_TYPE;
-            inputSize = GLStateType.ATTRIBUTE_SIZE;
-        } else {
-            activeInput = GLStateType.ACTIVE_UNIFORMS;
-            inputName = GLStateType.UNIFORM_NAME;
-            inputType = GLStateType.UNIFORM_TYPE;
-            inputSize = GLStateType.UNIFORM_SIZE;
-        }
-
-        IStateTransform addAttribute = new SparseArrayElementAddTransform(
-                GLPropertyAccessor.makeAccessor(msg.getContextId(),
-                                                GLStateType.PROGRAM_STATE,
-                                                GLStateType.PROGRAMS,
-                                                Integer.valueOf(program),
-                                                activeInput),
-                Integer.valueOf(location));
-        IStateTransform setAttributeName = new PropertyChangeTransform(
-                GLPropertyAccessor.makeAccessor(msg.getContextId(),
-                                                GLStateType.PROGRAM_STATE,
-                                                GLStateType.PROGRAMS,
-                                                Integer.valueOf(program),
-                                                activeInput,
-                                                Integer.valueOf(location),
-                                                inputName),
-                name);
-        IStateTransform setAttributeType = new PropertyChangeTransform(
-                GLPropertyAccessor.makeAccessor(msg.getContextId(),
-                                                GLStateType.PROGRAM_STATE,
-                                                GLStateType.PROGRAMS,
-                                                Integer.valueOf(program),
-                                                activeInput,
-                                                Integer.valueOf(location),
-                                                inputType),
-                type);
-        IStateTransform setAttributeSize = new PropertyChangeTransform(
-                GLPropertyAccessor.makeAccessor(msg.getContextId(),
-                                                GLStateType.PROGRAM_STATE,
-                                                GLStateType.PROGRAMS,
-                                                Integer.valueOf(program),
-                                                activeInput,
-                                                Integer.valueOf(location),
-                                                inputSize),
-                Integer.valueOf(size));
-        return Arrays.asList(addAttribute, setAttributeName, setAttributeType, setAttributeSize);
-    }
-
-    private static List<IStateTransform> transformsForGlGetActiveAttrib(GLMessage msg) {
-        return transformsForGlGetActiveAttribOrUniform(msg, true);
-    }
-
-    private static List<IStateTransform> transformsForGlGetActiveUniform(GLMessage msg) {
-        return transformsForGlGetActiveAttribOrUniform(msg, false);
-    }
-
-    private static List<IStateTransform> transformsForGlUniformMatrix(GLMessage msg) {
-        // void glUniformMatrix[2|3|4]fv(GLint location, GLsizei count, GLboolean transpose,
-        //                                  const GLfloat *value);
-        int location = msg.getArgs(0).getIntValue(0);
-        List<Float> uniforms = msg.getArgs(3).getFloatValueList();
-
-        IStateTransform setValues = new PropertyChangeTransform(
-                new CurrentProgramPropertyAccessor(msg.getContextId(),
-                                                   GLStateType.ACTIVE_UNIFORMS,
-                                                   location,
-                                                   GLStateType.UNIFORM_VALUE),
-                uniforms);
-
-        return Collections.singletonList(setValues);
-    }
-
-    private static List<IStateTransform> transformsForGlUniformv(GLMessage msg, boolean isFloats) {
-        // void glUniform1fv(GLint location, GLsizei count, const GLfloat *value);
-        int location = msg.getArgs(0).getIntValue(0);
-        List<?> uniforms;
-        if (isFloats) {
-            uniforms = msg.getArgs(2).getFloatValueList();
-        } else {
-            uniforms = msg.getArgs(2).getIntValueList();
-        }
-
-        IStateTransform setValues = new PropertyChangeTransform(
-                new CurrentProgramPropertyAccessor(msg.getContextId(),
-                                                   GLStateType.ACTIVE_UNIFORMS,
-                                                   location,
-                                                   GLStateType.UNIFORM_VALUE),
-                uniforms);
-
-        return Collections.singletonList(setValues);
-    }
-
-    private static List<IStateTransform> transformsForGlUniform(GLMessage msg, boolean isFloats) {
-        // void glUniform1f(GLint location, GLfloat v0);
-        // void glUniform2f(GLint location, GLfloat v0, GLfloat v1);
-        // ..            3f
-        // ..            4f
-        // void glUniform1i(GLint location, GLfloat v0);
-        // void glUniform2i(GLint location, GLfloat v0, GLfloat v1);
-        // ..            3i
-        // ..            4i
-
-        int location = msg.getArgs(0).getIntValue(0);
-        if (location < 0) {
-            throw new IllegalArgumentException("Argument location cannot be less than 0.");
-        }
-        List<?> uniforms;
-        if (isFloats) {
-            List<Float> args = new ArrayList<Float>(msg.getArgsCount() - 1);
-            for (int i = 1; i < msg.getArgsCount(); i++) {
-                args.add(Float.valueOf(msg.getArgs(1).getFloatValue(0)));
-            }
-            uniforms = args;
-        } else {
-            List<Integer> args = new ArrayList<Integer>(msg.getArgsCount() - 1);
-            for (int i = 1; i < msg.getArgsCount(); i++) {
-                args.add(Integer.valueOf(msg.getArgs(1).getIntValue(0)));
-            }
-            uniforms = args;
-        }
-
-        IStateTransform setValues = new PropertyChangeTransform(
-                new CurrentProgramPropertyAccessor(msg.getContextId(),
-                                                   GLStateType.ACTIVE_UNIFORMS,
-                                                   location,
-                                                   GLStateType.UNIFORM_VALUE),
-                uniforms);
-
-        return Collections.singletonList(setValues);
-    }
-
-    private static List<IStateTransform> transformsForGlCreateShader(GLMessage msg) {
-        // GLuint glCreateShader(GLenum shaderType);
-        GLEnum shaderType = GLEnum.valueOf(msg.getArgs(0).getIntValue(0));
-        int shader = msg.getReturnValue().getIntValue(0);
-
-        IStateTransform addShader = new SparseArrayElementAddTransform(
-                GLPropertyAccessor.makeAccessor(msg.getContextId(),
-                                                GLStateType.SHADERS),
-                shader);
-        IStateTransform setShaderType = new PropertyChangeTransform(
-                GLPropertyAccessor.makeAccessor(msg.getContextId(),
-                                                GLStateType.SHADERS,
-                                                Integer.valueOf(shader),
-                                                GLStateType.SHADER_TYPE),
-                shaderType);
-        return Arrays.asList(addShader, setShaderType);
-    }
-
-    private static List<IStateTransform> transformsForGlDeleteShader(GLMessage msg) {
-        // void glDeleteShader(GLuint shader);
-        int shader = msg.getArgs(0).getIntValue(0);
-
-        IStateTransform transform = new SparseArrayElementRemoveTransform(
-                GLPropertyAccessor.makeAccessor(msg.getContextId(),
-                        GLStateType.SHADERS),
-                shader);
-        return Collections.singletonList(transform);
-    }
-
-    private static List<IStateTransform> transformsForGlShaderSource(GLMessage msg) {
-        // void glShaderSource(GLuint shader, GLsizei count, const GLchar **string,
-        //                                                          const GLint *length);
-        // This message is patched up on the device to return a single string as opposed to a
-        // list of strings
-        int shader = msg.getArgs(0).getIntValue(0);
-        String src = msg.getArgs(2).getCharValue(0).toStringUtf8();
-
-        IStateTransform transform = new PropertyChangeTransform(
-                GLPropertyAccessor.makeAccessor(msg.getContextId(),
-                                                GLStateType.SHADERS,
-                                                Integer.valueOf(shader),
-                                                GLStateType.SHADER_SOURCE),
-                src);
-        return Collections.singletonList(transform);
-    }
-
-    private static List<IStateTransform> transformsForEglCreateContext(GLMessage msg) {
-        // void eglCreateContext(int version, int context);
-        int version = msg.getArgs(0).getIntValue(0);
-        IGLProperty glState = null;
-        if (version == 0) {
-            glState = GLState.createDefaultES1State();
-        } else {
-            glState = GLState.createDefaultES2State();
-        }
-        IStateTransform transform = new ListElementAddTransform(null, glState);
-        return Collections.singletonList(transform);
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/state/transforms/TexImageTransform.java b/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/state/transforms/TexImageTransform.java
deleted file mode 100644
index dde89ea..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/state/transforms/TexImageTransform.java
+++ /dev/null
@@ -1,342 +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.eclipse.gltrace.state.transforms;
-
-import com.android.ide.eclipse.gltrace.FileUtils;
-import com.android.ide.eclipse.gltrace.GLEnum;
-import com.android.ide.eclipse.gltrace.state.GLStringProperty;
-import com.android.ide.eclipse.gltrace.state.IGLProperty;
-import com.google.common.io.Files;
-import com.google.common.primitives.UnsignedBytes;
-
-import java.awt.image.BufferedImage;
-import java.io.File;
-import java.io.IOException;
-import java.nio.ByteBuffer;
-import java.nio.FloatBuffer;
-
-import javax.imageio.ImageIO;
-
-/**
- * {@link TexImageTransform} transforms the state to reflect the effect of a
- * glTexImage2D or glTexSubImage2D GL call.
- */
-public class TexImageTransform implements IStateTransform {
-    private static final String PNG_IMAGE_FORMAT = "PNG";
-    private static final String TEXTURE_FILE_PREFIX = "tex";
-    private static final String TEXTURE_FILE_SUFFIX = ".png";
-
-    private final IGLPropertyAccessor mAccessor;
-    private final File mTextureDataFile;
-
-    private final int mxOffset;
-    private final int myOffset;
-    private final int mWidth;
-    private final int mHeight;
-
-    private String mOldValue;
-    private String mNewValue;
-    private GLEnum mFormat;
-    private GLEnum mType;
-
-    /**
-     * Construct a texture image transformation.
-     * @param accessor accessor to obtain the GL state variable to modify
-     * @param textureData texture data passed in by the call. Could be null.
-     * @param format format of the source texture data
-     * @param xOffset x offset for the source data (used only in glTexSubImage2D)
-     * @param yOffset y offset for the source data (used only in glTexSubImage2D)
-     * @param width width of the texture
-     * @param height height of the texture
-     */
-    public TexImageTransform(IGLPropertyAccessor accessor, File textureData, GLEnum format,
-            GLEnum type, int xOffset, int yOffset, int width, int height) {
-        mAccessor = accessor;
-        mTextureDataFile = textureData;
-        mFormat = format;
-        mType = type;
-
-        mxOffset = xOffset;
-        myOffset = yOffset;
-        mWidth = width;
-        mHeight = height;
-    }
-
-    @Override
-    public void apply(IGLProperty currentState) {
-        assert mOldValue == null : "Transform cannot be applied multiple times"; //$NON-NLS-1$
-
-        IGLProperty property = mAccessor.getProperty(currentState);
-        if (!(property instanceof GLStringProperty)) {
-            return;
-        }
-
-        GLStringProperty prop = (GLStringProperty) property;
-        mOldValue = prop.getStringValue();
-
-        // Applying texture transformations is a heavy weight process. So we perform
-        // it only once and save the result in a temporary file. The property is actually
-        // the path to the file.
-        if (mNewValue == null) {
-            try {
-                if (mOldValue == null) {
-                    mNewValue = createTexture(mTextureDataFile, mWidth, mHeight);
-                } else {
-                    mNewValue = updateTextureData(mOldValue, mTextureDataFile, mxOffset, myOffset,
-                            mWidth, mHeight);
-                }
-            } catch (IOException e) {
-                throw new RuntimeException(e);
-            } catch (RuntimeException e) {
-                throw e;
-            }
-        }
-
-        prop.setValue(mNewValue);
-    }
-
-    @Override
-    public void revert(IGLProperty state) {
-        if (mOldValue != null) {
-            IGLProperty property = mAccessor.getProperty(state);
-            property.setValue(mOldValue);
-            mOldValue = null;
-        }
-    }
-
-    @Override
-    public IGLProperty getChangedProperty(IGLProperty state) {
-        return mAccessor.getProperty(state);
-    }
-
-    /**
-     * Creates a texture of provided width and height. If the texture data file is provided,
-     * then the texture is initialized with the contents of that file, otherwise an empty
-     * image is created.
-     * @param textureDataFile path to texture data, could be null.
-     * @param width width of texture
-     * @param height height of texture
-     * @return path to cached texture
-     */
-    private String createTexture(File textureDataFile, int width, int height) throws IOException {
-        File f = FileUtils.createTempFile(TEXTURE_FILE_PREFIX, TEXTURE_FILE_SUFFIX);
-
-        BufferedImage img = new BufferedImage(width, height, BufferedImage.TYPE_4BYTE_ABGR);
-
-        if (textureDataFile != null) {
-            byte[] initialData = Files.toByteArray(textureDataFile);
-            img.getRaster().setDataElements(0, 0, width, height,
-                    formatSourceData(initialData, width, height));
-        }
-
-        ImageIO.write(img, PNG_IMAGE_FORMAT, f);
-
-        return f.getAbsolutePath();
-    }
-
-    /**
-     * Update part of an existing texture.
-     * @param currentImagePath current texture image.
-     * @param textureDataFile new data to update the current texture with
-     * @param xOffset x offset for the update region
-     * @param yOffset y offset for the update region
-     * @param width width of the update region
-     * @param height height of the update region
-     * @return path to the updated texture
-     */
-    private String updateTextureData(String currentImagePath, File textureDataFile,
-            int xOffset, int yOffset, int width, int height) throws IOException {
-        assert currentImagePath != null : "Attempt to update a null texture";
-
-        if (textureDataFile == null) {
-            // Do not perform any updates if we don't have the actual data.
-            return currentImagePath;
-        }
-
-        File f = FileUtils.createTempFile(TEXTURE_FILE_PREFIX, TEXTURE_FILE_SUFFIX);
-        BufferedImage image = null;
-        image = ImageIO.read(new File(currentImagePath));
-
-        byte[] subImageData = Files.toByteArray(textureDataFile);
-        image.getRaster().setDataElements(xOffset, yOffset, width, height,
-                formatSourceData(subImageData, width, height));
-        ImageIO.write(image, PNG_IMAGE_FORMAT, f);
-
-        return f.getAbsolutePath();
-    }
-
-    private byte[] formatSourceData(byte[] subImageData, int width, int height) {
-        if (mType != GLEnum.GL_UNSIGNED_BYTE) {
-            subImageData = unpackData(subImageData, mType);
-        }
-
-        switch (mFormat) {
-            case GL_RGBA:
-                // no conversions necessary
-                return subImageData;
-            case GL_RGB:
-                return addAlphaChannel(subImageData, width, height);
-            case GL_RED:
-            case GL_GREEN:
-            case GL_BLUE:
-                // GL_RED, GL_GREEN and GL_BLUE are all supposed to fill those respective
-                // channels, but we assume that the programmers intent was to use GL_ALPHA in order
-                // to overcome the issue that GL_ALPHA cannot be used with float data.
-                if (mType != GLEnum.GL_FLOAT) {
-                    throw new RuntimeException();
-                } else {
-                    // fall through - assume that it is GL_ALPHA
-                }
-                //$FALL-THROUGH$
-            case GL_ALPHA:
-                return addRGBChannels(subImageData, width, height);
-            case GL_LUMINANCE:
-                return createRGBAFromLuminance(subImageData, width, height);
-            case GL_LUMINANCE_ALPHA:
-                return createRGBAFromLuminanceAlpha(subImageData, width, height);
-            default:
-                throw new RuntimeException();
-        }
-    }
-
-    private byte[] unpackData(byte[] data, GLEnum type) {
-        switch (type) {
-            case GL_UNSIGNED_BYTE:
-                return data;
-            case GL_UNSIGNED_SHORT_4_4_4_4:
-                return convertShortToUnsigned(data, 0xf000, 12, 0x0f00, 8, 0x00f0, 4, 0x000f, 0,
-                        true);
-            case GL_UNSIGNED_SHORT_5_6_5:
-                return convertShortToUnsigned(data, 0xf800, 11, 0x07e0, 5, 0x001f, 0, 0, 0,
-                        false);
-            case GL_UNSIGNED_SHORT_5_5_5_1:
-                return convertShortToUnsigned(data, 0xf800, 11, 0x07c0, 6, 0x003e, 1, 0x1, 0,
-                        true);
-            case GL_FLOAT:
-                return convertFloatToUnsigned(data);
-            default:
-                return data;
-        }
-    }
-
-   private byte[] convertFloatToUnsigned(byte[] data) {
-       byte[] unsignedData = new byte[data.length];
-       ByteBuffer floatBuffer = ByteBuffer.wrap(data);
-       for (int i = 0; i < data.length / 4; i++) {
-           float v = floatBuffer.getFloat(i);
-           byte alpha = (byte)(v * 255);
-           unsignedData[i*4 + 3] = alpha;
-       }
-       return unsignedData;
-   }
-
-   private byte[] convertShortToUnsigned(byte[] shortData,
-           int rmask, int rshift,
-           int gmask, int gshift,
-           int bmask, int bshift,
-           int amask, int ashift,
-           boolean includeAlpha) {
-       int numChannels = includeAlpha ? 4 : 3;
-       byte[] unsignedData = new byte[(shortData.length/2) * numChannels];
-
-       for (int i = 0; i < (shortData.length / 2); i++) {
-           int hi = UnsignedBytes.toInt(shortData[i*2 + 0]);
-           int lo = UnsignedBytes.toInt(shortData[i*2 + 1]);
-
-           int x = hi << 8 | lo;
-
-           int r = (x & rmask) >>> rshift;
-           int g = (x & gmask) >>> gshift;
-           int b = (x & bmask) >>> bshift;
-           int a = (x & amask) >>> ashift;
-
-           unsignedData[i * numChannels + 0] = UnsignedBytes.checkedCast(r);
-           unsignedData[i * numChannels + 1] = UnsignedBytes.checkedCast(g);
-           unsignedData[i * numChannels + 2] = UnsignedBytes.checkedCast(b);
-
-           if (includeAlpha) {
-               unsignedData[i * numChannels + 3] = UnsignedBytes.checkedCast(a);
-           }
-       }
-
-       return unsignedData;
-   }
-
-   private byte[] addAlphaChannel(byte[] sourceData, int width, int height) {
-        assert sourceData.length == 3 * width * height; // should have R, G & B channels
-
-        byte[] data = new byte[4 * width * height];
-
-        for (int src = 0, dst = 0; src < sourceData.length; src += 3, dst += 4) {
-            data[dst + 0] = sourceData[src + 0]; // copy R byte
-            data[dst + 1] = sourceData[src + 1]; // copy G byte
-            data[dst + 2] = sourceData[src + 2]; // copy B byte
-            data[dst + 3] = 1; // add alpha = 1
-        }
-
-        return data;
-    }
-
-    private byte[] addRGBChannels(byte[] sourceData, int width, int height) {
-        assert sourceData.length == width * height; // should have a single alpha channel
-
-        byte[] data = new byte[4 * width * height];
-
-        for (int src = 0, dst = 0; src < sourceData.length; src++, dst += 4) {
-            data[dst + 0] = data[dst + 1] = data[dst + 2] = 0; // set R = G = B = 0
-            data[dst + 3] = sourceData[src];                 // copy over alpha
-        }
-
-        return data;
-    }
-
-    private byte[] createRGBAFromLuminance(byte[] sourceData, int width, int height) {
-        assert sourceData.length == width * height; // should have a single luminance channel
-
-        byte[] data = new byte[4 * width * height];
-
-        for (int src = 0, dst = 0; src < sourceData.length; src++, dst += 4) {
-            int l = sourceData[src] * 3;
-            if (l > 255) { // clamp to 255
-                l = 255;
-            }
-
-            data[dst + 0] = data[dst + 1] = data[dst + 2] = (byte) l; // set R = G = B = L * 3
-            data[dst + 3] = 1;                                        // set alpha = 1
-        }
-
-        return data;
-    }
-
-    private byte[] createRGBAFromLuminanceAlpha(byte[] sourceData, int width, int height) {
-        assert sourceData.length == 2 * width * height; // should have luminance & alpha channels
-
-        byte[] data = new byte[4 * width * height];
-
-        for (int src = 0, dst = 0; src < sourceData.length; src += 2, dst += 4) {
-            int l = sourceData[src] * 3;
-            if (l > 255) { // clamp to 255
-                l = 255;
-            }
-
-            data[dst + 0] = data[dst + 1] = data[dst + 2] = (byte) l; // set R = G = B = L * 3
-            data[dst + 3] = sourceData[src + 1];                    // copy over alpha
-        }
-
-        return data;
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/state/transforms/TexturePropertyAccessor.java b/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/state/transforms/TexturePropertyAccessor.java
deleted file mode 100644
index 10758d8..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/state/transforms/TexturePropertyAccessor.java
+++ /dev/null
@@ -1,86 +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.eclipse.gltrace.state.transforms;
-
-import com.android.ide.eclipse.gltrace.state.GLIntegerProperty;
-import com.android.ide.eclipse.gltrace.state.GLStateType;
-import com.android.ide.eclipse.gltrace.state.IGLProperty;
-
-/**
- * The {@link TexturePropertyAccessor} provides the ability to access a
- * texture property. Texture properties are accessed by first identifying the active
- * texture unit ({@link GLStateType#ACTIVE_TEXTURE_UNIT}), and then identifying the texture
- * that is bound to that unit.
- */
-public class TexturePropertyAccessor implements IGLPropertyAccessor {
-    private final int mContextId;
-    private final GLStateType mTargetUnitType;
-    private final int mMipmapLevel;
-    private final GLStateType mTextureType;
-    private TextureUnitPropertyAccessor mTextureUnitPropertyAccessor;
-
-    public TexturePropertyAccessor(int contextId, GLStateType textureUnitTarget, int level,
-            GLStateType textureTargetName) {
-        mContextId = contextId;
-        mTargetUnitType = textureUnitTarget;
-        mMipmapLevel = level;
-        mTextureType = textureTargetName;
-        mTextureUnitPropertyAccessor = new TextureUnitPropertyAccessor(mContextId,
-                mTargetUnitType);
-    }
-
-    public TexturePropertyAccessor(int contextId, GLStateType textureUnitTarget,
-            GLStateType textureTargetName) {
-        this(contextId, textureUnitTarget, -1, textureTargetName);
-    }
-
-    @Override
-    public IGLProperty getProperty(IGLProperty state) {
-        // identify the texture that is bound in the current active texture unit
-        IGLProperty targetTexture = mTextureUnitPropertyAccessor.getProperty(state);
-        if (!(targetTexture instanceof GLIntegerProperty)) {
-            return null;
-        }
-        Integer textureId = (Integer) targetTexture.getValue();
-
-        // now extract the required property from the selected texture
-        IGLPropertyAccessor textureAccessor;
-        if (mMipmapLevel >= 0) {
-            textureAccessor = GLPropertyAccessor.makeAccessor(mContextId,
-                    GLStateType.TEXTURE_STATE,
-                    GLStateType.TEXTURES,
-                    textureId,
-                    GLStateType.TEXTURE_MIPMAPS,
-                    Integer.valueOf(mMipmapLevel),
-                    mTextureType);
-        } else {
-            textureAccessor = GLPropertyAccessor.makeAccessor(mContextId,
-                    GLStateType.TEXTURE_STATE,
-                    GLStateType.TEXTURES,
-                    textureId,
-                    mTextureType);
-        }
-
-        return textureAccessor.getProperty(state);
-    }
-
-    @Override
-    public String getPath() {
-        return String.format("TEXTURE_STATE/TEXTURES/${activeTexture}/%s", mTextureType);
-    }
-
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/state/transforms/TextureUnitPropertyAccessor.java b/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/state/transforms/TextureUnitPropertyAccessor.java
deleted file mode 100644
index 2489e14..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/state/transforms/TextureUnitPropertyAccessor.java
+++ /dev/null
@@ -1,64 +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.eclipse.gltrace.state.transforms;
-
-import com.android.ide.eclipse.gltrace.state.GLIntegerProperty;
-import com.android.ide.eclipse.gltrace.state.GLStateType;
-import com.android.ide.eclipse.gltrace.state.IGLProperty;
-
-/**
- * The {@link TextureUnitPropertyAccessor} provides the ability to access a
- * texture unit property that is indexed based on the run time value of the
- * {@link GLStateType#ACTIVE_TEXTURE_UNIT} property.
- */
-public class TextureUnitPropertyAccessor implements IGLPropertyAccessor {
-    private final int mContextId;
-    private final IGLPropertyAccessor mActiveTextureAccessor;
-    private final GLStateType mTargetType;
-
-    public TextureUnitPropertyAccessor(int contextId, GLStateType targetPropertyType) {
-        mContextId = contextId;
-        mTargetType = targetPropertyType;
-
-        mActiveTextureAccessor = GLPropertyAccessor.makeAccessor(mContextId,
-                GLStateType.TEXTURE_STATE,
-                GLStateType.ACTIVE_TEXTURE_UNIT);
-    }
-
-    @Override
-    public IGLProperty getProperty(IGLProperty state) {
-        // first extract the current active texture unit
-        IGLProperty activeTextureProperty = mActiveTextureAccessor.getProperty(state);
-        if (!(activeTextureProperty instanceof GLIntegerProperty)) {
-            return null;
-        }
-        Integer activeTexture = (Integer) activeTextureProperty.getValue();
-
-        // extract the required property for the current texture unit
-        IGLPropertyAccessor targetAccessor = GLPropertyAccessor.makeAccessor(mContextId,
-                GLStateType.TEXTURE_STATE,
-                GLStateType.TEXTURE_UNITS,
-                activeTexture,
-                mTargetType);
-        return targetAccessor.getProperty(state);
-    }
-
-    @Override
-    public String getPath() {
-        return String.format("TEXTURE_STATE/TEXTURE_UNITS/${activeTextureUnit}/%s", mTargetType);
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/views/FitToCanvasAction.java b/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/views/FitToCanvasAction.java
deleted file mode 100644
index 1ee0fa0..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/views/FitToCanvasAction.java
+++ /dev/null
@@ -1,40 +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.eclipse.gltrace.views;
-
-import com.android.ide.eclipse.gltrace.GlTracePlugin;
-import com.android.ide.eclipse.gltrace.widgets.ImageCanvas;
-
-import org.eclipse.jface.action.Action;
-
-public class FitToCanvasAction extends Action {
-    private ImageCanvas mImageCanvas;
-
-    public FitToCanvasAction(boolean fitByDefault, ImageCanvas canvas) {
-        super("Fit to Canvas", GlTracePlugin.getImageDescriptor("/icons/zoomfit.png")); //$NON-NLS-2$
-        setToolTipText("Fit Image to Canvas");
-        mImageCanvas = canvas;
-
-        setChecked(fitByDefault);
-        mImageCanvas.setFitToCanvas(fitByDefault);
-    }
-
-    @Override
-    public void run() {
-        mImageCanvas.setFitToCanvas(isChecked());
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/views/FrameSummaryView.java b/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/views/FrameSummaryView.java
deleted file mode 100644
index 42eb98c..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/views/FrameSummaryView.java
+++ /dev/null
@@ -1,53 +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.eclipse.gltrace.views;
-
-import com.android.ide.eclipse.gltrace.editors.GLFunctionTraceViewer;
-
-import org.eclipse.ui.IWorkbenchPart;
-
-/**
- * The {@link FrameSummaryView} is a page book view with pages of type {@link FrameSummaryViewPage}.
- */
-public class FrameSummaryView extends GLPageBookView {
-    public static final String ID = "com.android.ide.eclipse.gltrace.views.FrameBuffer"; //$NON-NLS-1$
-
-    public FrameSummaryView() {
-        super("Open a GL Trace file to view the framebuffer contents.");
-    }
-
-    @Override
-    protected PageRec doCreatePage(IWorkbenchPart part) {
-        if (!(part instanceof GLFunctionTraceViewer)) {
-            return null;
-        }
-
-        GLFunctionTraceViewer viewer = (GLFunctionTraceViewer) part;
-        FrameSummaryViewPage page = viewer.getFrameSummaryViewPage();
-        initPage(page);
-        page.createControl(getPageBook());
-
-        return new PageRec(part, page);
-    }
-
-    @Override
-    protected void doDestroyPage(IWorkbenchPart part, PageRec pageRecord) {
-        FrameSummaryViewPage page = (FrameSummaryViewPage) pageRecord.page;
-        page.dispose();
-        pageRecord.dispose();
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/views/FrameSummaryViewPage.java b/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/views/FrameSummaryViewPage.java
deleted file mode 100644
index 25de48f..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/views/FrameSummaryViewPage.java
+++ /dev/null
@@ -1,442 +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.eclipse.gltrace.views;
-
-import com.android.ide.eclipse.gltrace.GLProtoBuf.GLMessage.Function;
-import com.android.ide.eclipse.gltrace.model.GLCall;
-import com.android.ide.eclipse.gltrace.model.GLTrace;
-import com.android.ide.eclipse.gltrace.widgets.ImageCanvas;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.core.runtime.jobs.Job;
-import org.eclipse.jface.action.IToolBarManager;
-import org.eclipse.jface.layout.GridDataFactory;
-import org.eclipse.jface.viewers.ColumnLabelProvider;
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.jface.viewers.TableViewerColumn;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerCell;
-import org.eclipse.jface.viewers.ViewerComparator;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.SashForm;
-import org.eclipse.swt.events.ControlAdapter;
-import org.eclipse.swt.events.ControlEvent;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.swt.widgets.TableColumn;
-import org.eclipse.ui.part.Page;
-
-import java.util.EnumMap;
-import java.util.List;
-import java.util.Map;
-
-/**
- * A {@link FrameSummaryViewPage} displays summary information regarding a frame. This includes
- * the contents of the frame buffer at the end of the frame, and statistics regarding the
- * OpenGL Calls present in the frame.
- */
-public class FrameSummaryViewPage extends Page {
-    private GLTrace mTrace;
-
-    private final Object mLock = new Object();
-    private Job mRefresherJob;
-    private int mCurrentFrame;
-
-    private SashForm mSash;
-    private ImageCanvas mImageCanvas;
-
-    private Label mWallClockTimeLabel;
-    private Label mThreadTimeLabel;
-
-    private TableViewer mStatsTableViewer;
-    private StatsLabelProvider mStatsLabelProvider;
-    private StatsTableComparator mStatsTableComparator;
-
-    private FitToCanvasAction mFitToCanvasAction;
-    private SaveImageAction mSaveImageAction;
-
-    private static final String[] STATS_TABLE_PROPERTIES = {
-        "Function",
-        "Count",
-        "Wall Time (ns)",
-        "Thread Time (ns)",
-    };
-    private static final float[] STATS_TABLE_COLWIDTH_RATIOS = {
-        0.4f, 0.1f, 0.25f, 0.25f,
-    };
-    private static final int[] STATS_TABLE_COL_ALIGNMENT = {
-        SWT.LEFT, SWT.LEFT, SWT.RIGHT, SWT.RIGHT,
-    };
-
-    public FrameSummaryViewPage(GLTrace trace) {
-        mTrace = trace;
-    }
-
-    public void setInput(GLTrace trace) {
-        mTrace = trace;
-    }
-
-    @Override
-    public void createControl(Composite parent) {
-        mSash = new SashForm(parent, SWT.VERTICAL);
-
-        // create image canvas where the framebuffer is displayed
-        mImageCanvas = new ImageCanvas(mSash);
-
-        // create a composite where the frame statistics are displayed
-        createFrameStatisticsPart(mSash);
-
-        mSash.setWeights(new int[] {70, 30});
-
-        mFitToCanvasAction = new FitToCanvasAction(true, mImageCanvas);
-        mSaveImageAction = new SaveImageAction(mImageCanvas);
-
-        IToolBarManager toolbarManager = getSite().getActionBars().getToolBarManager();
-        toolbarManager.add(mFitToCanvasAction);
-        toolbarManager.add(mSaveImageAction);
-    }
-
-    private void createFrameStatisticsPart(Composite parent) {
-        Composite c = new Composite(parent, SWT.NONE);
-        c.setLayout(new GridLayout(2, false));
-        GridDataFactory.fillDefaults().grab(true, true).applyTo(c);
-
-        Label l = new Label(c, SWT.NONE);
-        l.setText("Cumulative call duration of all OpenGL Calls in this frame:");
-        l.setForeground(Display.getDefault().getSystemColor(SWT.COLOR_DARK_GRAY));
-        GridDataFactory.fillDefaults().span(2, 1).applyTo(l);
-
-        l = new Label(c, SWT.NONE);
-        l.setText("Wall Clock Time: ");
-        GridDataFactory.fillDefaults().align(SWT.RIGHT, SWT.CENTER).applyTo(l);
-
-        mWallClockTimeLabel = new Label(c, SWT.NONE);
-        GridDataFactory.defaultsFor(mWallClockTimeLabel)
-                       .grab(true, false)
-                       .applyTo(mWallClockTimeLabel);
-
-        l = new Label(c, SWT.NONE);
-        l.setText("Thread Time: ");
-        GridDataFactory.fillDefaults().align(SWT.RIGHT, SWT.CENTER).applyTo(l);
-
-        mThreadTimeLabel = new Label(c, SWT.NONE);
-        GridDataFactory.defaultsFor(mThreadTimeLabel)
-                       .grab(true, false)
-                       .applyTo(mThreadTimeLabel);
-
-        l = new Label(c, SWT.HORIZONTAL | SWT.SEPARATOR);
-        GridDataFactory.fillDefaults().span(2, 1).applyTo(l);
-
-        l = new Label(c, SWT.NONE);
-        l.setText("Per OpenGL Function Statistics:");
-        l.setForeground(Display.getDefault().getSystemColor(SWT.COLOR_DARK_GRAY));
-        GridDataFactory.fillDefaults().span(2, 1).applyTo(l);
-
-        final Table table = new Table(c, SWT.BORDER | SWT.FULL_SELECTION);
-        GridDataFactory.fillDefaults().grab(true, true).span(2, 1).applyTo(table);
-
-        table.setLinesVisible(true);
-        table.setHeaderVisible(true);
-
-        mStatsTableViewer = new TableViewer(table);
-        mStatsLabelProvider = new StatsLabelProvider();
-        mStatsTableComparator = new StatsTableComparator(1);
-
-        // when a column is selected, sort the table based on that column
-        SelectionListener columnSelectionListener = new SelectionAdapter() {
-            @Override
-            public void widgetSelected(SelectionEvent e) {
-                TableColumn tc = (TableColumn) e.widget;
-                String colText = tc.getText();
-                for (int i = 0; i < STATS_TABLE_PROPERTIES.length; i++) {
-                    if (STATS_TABLE_PROPERTIES[i].equals(colText)) {
-                        mStatsTableComparator.setSortColumn(i);
-                        table.setSortColumn(tc);
-                        table.setSortDirection(mStatsTableComparator.getDirection());
-                        mStatsTableViewer.refresh();
-                        break;
-                    }
-                }
-            }
-        };
-
-        for (int i = 0; i < STATS_TABLE_PROPERTIES.length; i++) {
-            TableViewerColumn tvc = new TableViewerColumn(mStatsTableViewer, SWT.NONE);
-            tvc.getColumn().setText(STATS_TABLE_PROPERTIES[i]);
-            tvc.setLabelProvider(mStatsLabelProvider);
-            tvc.getColumn().setAlignment(STATS_TABLE_COL_ALIGNMENT[i]);
-            tvc.getColumn().addSelectionListener(columnSelectionListener);
-        }
-        mStatsTableViewer.setContentProvider(new StatsContentProvider());
-        mStatsTableViewer.setInput(null);
-        mStatsTableViewer.setComparator(mStatsTableComparator);
-
-        // resize columns appropriately when the size of the widget changes
-        table.addControlListener(new ControlAdapter() {
-            @Override
-            public void controlResized(ControlEvent e) {
-                int w = table.getClientArea().width;
-
-                for (int i = 0; i < STATS_TABLE_COLWIDTH_RATIOS.length; i++) {
-                    table.getColumn(i).setWidth((int) (w * STATS_TABLE_COLWIDTH_RATIOS[i]));
-                }
-            }
-        });
-    }
-
-    @Override
-    public Control getControl() {
-        return mSash;
-    }
-
-    @Override
-    public void setFocus() {
-    }
-
-    public void setSelectedFrame(int frame) {
-        if (mTrace == null) {
-            return;
-        }
-
-        synchronized (mLock) {
-            mCurrentFrame = frame;
-
-            if (mRefresherJob != null) {
-                return;
-            }
-
-            mRefresherJob = new Job("Update Frame Summary Task") {
-                @Override
-                protected IStatus run(IProgressMonitor monitor) {
-                    final int currentFrame;
-                    synchronized (mLock) {
-                        currentFrame = mCurrentFrame;
-                        mRefresherJob = null;
-                    };
-
-                    updateImageCanvas(currentFrame);
-                    updateFrameStats(currentFrame);
-
-                    return Status.OK_STATUS;
-                }
-            };
-            mRefresherJob.setPriority(Job.SHORT);
-            mRefresherJob.schedule(500);
-        };
-    }
-
-    private void updateFrameStats(int frame) {
-        final List<GLCall> calls = mTrace.getGLCallsForFrame(frame);
-
-        Job job = new Job("Update Frame Statistics") {
-            @Override
-            protected IStatus run(IProgressMonitor monitor) {
-                long wallClockDuration = 0;
-                long threadDuration = 0;
-
-                final Map<Function, PerCallStats> cumulativeStats =
-                        new EnumMap<Function, PerCallStats>(Function.class);
-
-                for (GLCall c: calls) {
-                    wallClockDuration += c.getWallDuration();
-                    threadDuration += c.getThreadDuration();
-
-                    PerCallStats stats = cumulativeStats.get(c.getFunction());
-                    if (stats == null) {
-                        stats = new PerCallStats();
-                    }
-
-                    stats.count++;
-                    stats.threadDuration += c.getThreadDuration();
-                    stats.wallDuration += c.getWallDuration();
-
-                    cumulativeStats.put(c.getFunction(), stats);
-                }
-
-                final String wallTime = formatMilliSeconds(wallClockDuration);
-                final String threadTime = formatMilliSeconds(threadDuration);
-
-                Display.getDefault().syncExec(new Runnable() {
-                    @Override
-                    public void run() {
-                        mWallClockTimeLabel.setText(wallTime);
-                        mThreadTimeLabel.setText(threadTime);
-                        mStatsTableViewer.setInput(cumulativeStats);
-                    }
-                });
-
-                return Status.OK_STATUS;
-            }
-        };
-        job.setUser(true);
-        job.schedule();
-    }
-
-    private String formatMilliSeconds(long nanoSeconds) {
-        double milliSeconds = (double) nanoSeconds / 1000000;
-        return String.format("%.2f ms", milliSeconds);          //$NON-NLS-1$
-    }
-
-    private void updateImageCanvas(int frame) {
-        int lastCallIndex = mTrace.getFrame(frame).getEndIndex() - 1;
-        if (lastCallIndex >= 0 && lastCallIndex < mTrace.getGLCalls().size()) {
-            GLCall call = mTrace.getGLCalls().get(lastCallIndex);
-            final Image image = mTrace.getImage(call);
-            Display.getDefault().asyncExec(new Runnable() {
-                @Override
-                public void run() {
-                    mImageCanvas.setImage(image);
-
-                    mFitToCanvasAction.setEnabled(image != null);
-                    mSaveImageAction.setEnabled(image != null);
-                }
-            });
-        }
-    }
-
-    /** Cumulative stats maintained for each type of OpenGL Function in a particular frame. */
-    private static class PerCallStats {
-        public int count;
-        public long wallDuration;
-        public long threadDuration;
-    }
-
-    private static class StatsContentProvider implements IStructuredContentProvider {
-        @Override
-        public void dispose() {
-        }
-
-        @Override
-        public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-        }
-
-        @Override
-        public Object[] getElements(Object inputElement) {
-            if (inputElement instanceof Map<?, ?>) {
-                return ((Map<?, ?>) inputElement).entrySet().toArray();
-            }
-
-            return null;
-        }
-    }
-
-    private static class StatsLabelProvider extends ColumnLabelProvider {
-        @Override
-        public void update(ViewerCell cell) {
-            Object element = cell.getElement();
-            if (!(element instanceof Map.Entry<?, ?>)) {
-                return;
-            }
-
-            Function f = (Function) ((Map.Entry<?, ?>) element).getKey();
-            PerCallStats stats = (PerCallStats) ((Map.Entry<?, ?>) element).getValue();
-
-            switch (cell.getColumnIndex()) {
-            case 0:
-                cell.setText(f.toString());
-                break;
-            case 1:
-                cell.setText(Integer.toString(stats.count));
-                break;
-            case 2:
-                cell.setText(formatDuration(stats.wallDuration));
-                break;
-            case 3:
-                cell.setText(formatDuration(stats.threadDuration));
-                break;
-            default:
-                // should not happen
-                cell.setText("??"); //$NON-NLS-1$
-                break;
-            }
-        }
-
-        private String formatDuration(long time) {
-            // Max duration is in the 10s of milliseconds = xx,xxx,xxx ns
-            // So we require a format specifier that is 10 characters wide
-            return String.format("%,10d", time);            //$NON-NLS-1$
-        }
-    }
-
-    private static class StatsTableComparator extends ViewerComparator {
-        private int mSortColumn;
-        private boolean mDescending = true;
-
-        private StatsTableComparator(int defaultSortColIndex) {
-            mSortColumn = defaultSortColIndex;
-        }
-
-        public void setSortColumn(int index) {
-            if (index == mSortColumn) {
-                // if same column as what we are currently sorting on,
-                // then toggle the direction
-                mDescending = !mDescending;
-            } else {
-                mSortColumn = index;
-                mDescending = true;
-            }
-        }
-
-        public int getDirection() {
-            return mDescending ? SWT.UP : SWT.DOWN;
-        }
-
-        @Override
-        public int compare(Viewer viewer, Object e1, Object e2) {
-            Map.Entry<?, ?> entry1;
-            Map.Entry<?, ?> entry2;
-
-            if (mDescending) {
-                entry1 = (Map.Entry<?, ?>) e1;
-                entry2 = (Map.Entry<?, ?>) e2;
-            } else {
-                entry1 = (Map.Entry<?, ?>) e2;
-                entry2 = (Map.Entry<?, ?>) e1;
-            }
-
-            String k1 = entry1.getKey().toString();
-            String k2 = entry2.getKey().toString();
-
-            PerCallStats stats1 = (PerCallStats) entry1.getValue();
-            PerCallStats stats2 = (PerCallStats) entry2.getValue();
-
-            switch (mSortColumn) {
-            case 0: // function name
-                return String.CASE_INSENSITIVE_ORDER.compare(k1, k2);
-            case 1:
-                return stats1.count - stats2.count;
-            case 2:
-                return (int) (stats1.wallDuration - stats2.wallDuration);
-            case 3:
-                return (int) (stats1.threadDuration - stats2.threadDuration);
-            default:
-                return super.compare(viewer, e1, e2);
-            }
-        }
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/views/GLPageBookView.java b/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/views/GLPageBookView.java
deleted file mode 100644
index 1240553..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/views/GLPageBookView.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.ide.eclipse.gltrace.views;
-
-import com.android.ide.eclipse.gltrace.editors.GLFunctionTraceViewer;
-
-import org.eclipse.jface.viewers.ISelectionProvider;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.part.IPage;
-import org.eclipse.ui.part.IPageSite;
-import org.eclipse.ui.part.MessagePage;
-import org.eclipse.ui.part.PageBook;
-import org.eclipse.ui.part.PageBookView;
-
-/**
- * {@link GLPageBookView} is an abstract {@link PageBookView} that can be used
- * to provide page book view's whose main part is a {@link GLFunctionTraceViewer}.
- */
-public abstract class GLPageBookView extends PageBookView {
-    private final String mDefaultMessage;
-
-    public GLPageBookView(String defaultMessage) {
-        super();
-
-        mDefaultMessage = defaultMessage;
-    }
-
-    @Override
-    protected IPage createDefaultPage(PageBook book) {
-        MessagePage page = new MessagePage();
-        initPage(page);
-        page.createControl(book);
-        page.setMessage(mDefaultMessage);
-        return page;
-    }
-
-    @Override
-    protected IWorkbenchPart getBootstrapPart() {
-        IWorkbenchPage page = getSite().getPage();
-        if (page != null) {
-            return page.getActiveEditor();
-        }
-
-        return null;
-    }
-
-    @Override
-    protected boolean isImportant(IWorkbenchPart part) {
-        return part instanceof GLFunctionTraceViewer;
-    }
-
-    @Override
-    public void partBroughtToTop(IWorkbenchPart part) {
-        partActivated(part);
-    }
-
-    @Override
-    protected void showPageRec(PageRec pageRec) {
-        IPageSite pageSite = getPageSite(pageRec.page);
-        if (pageRec.page instanceof ISelectionProvider) {
-            pageSite.setSelectionProvider((ISelectionProvider) pageRec.page);
-        } else {
-            pageSite.setSelectionProvider(null); // clear selection provider
-        }
-
-        super.showPageRec(pageRec);
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/views/SaveImageAction.java b/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/views/SaveImageAction.java
deleted file mode 100644
index 6cc8b69..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/views/SaveImageAction.java
+++ /dev/null
@@ -1,59 +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.eclipse.gltrace.views;
-
-import com.android.ide.eclipse.gltrace.widgets.ImageCanvas;
-
-import org.eclipse.jface.action.Action;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.FileDialog;
-import org.eclipse.ui.ISharedImages;
-import org.eclipse.ui.PlatformUI;
-
-import java.io.File;
-
-public class SaveImageAction extends Action {
-    private static String sLastUsedPath;
-
-    private ImageCanvas mImageCanvas;
-
-    public SaveImageAction(ImageCanvas canvas) {
-        super("Save Image",
-                PlatformUI.getWorkbench().getSharedImages().getImageDescriptor(
-                        ISharedImages.IMG_ETOOL_SAVEAS_EDIT));
-        setToolTipText("Save Image");
-        mImageCanvas = canvas;
-    }
-
-    @Override
-    public void run() {
-        FileDialog fd = new FileDialog(mImageCanvas.getShell(), SWT.SAVE);
-        fd.setFilterExtensions(new String[] { "*.png" });
-        if (sLastUsedPath != null) {
-            fd.setFilterPath(sLastUsedPath);
-        }
-
-        String path = fd.open();
-        if (path == null) {
-            return;
-        }
-
-        File f = new File(path);
-        sLastUsedPath = f.getParent();
-        mImageCanvas.exportImageTo(f);
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/views/StateView.java b/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/views/StateView.java
deleted file mode 100644
index eff2fef..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/views/StateView.java
+++ /dev/null
@@ -1,57 +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.eclipse.gltrace.views;
-
-import com.android.ide.eclipse.gltrace.editors.GLFunctionTraceViewer;
-import com.android.ide.eclipse.gltrace.editors.StateViewPage;
-
-import org.eclipse.ui.IWorkbenchPart;
-
-/**
- * The StateView shows the GL state for the current active {@link GLFunctionTraceViewer}.
- * It behaves like the Eclipse Outline View: Each active editor provides the GL state content
- * to show via a {@link StateViewPage}. This class simply acts as a stack view showing the
- * state corresponding to whichever editor is active.
- */
-public class StateView extends GLPageBookView {
-    public static final String ID = "com.android.ide.eclipse.gltrace.views.State"; //$NON-NLS-1$
-
-    public StateView() {
-        super("Open (or select) a GL Trace file to view the GL State.");
-    }
-
-    @Override
-    protected PageRec doCreatePage(IWorkbenchPart part) {
-        if (!(part instanceof GLFunctionTraceViewer)) {
-            return null;
-        }
-
-        GLFunctionTraceViewer viewer = (GLFunctionTraceViewer) part;
-        StateViewPage page = viewer.getStateViewPage();
-        initPage(page);
-        page.createControl(getPageBook());
-
-        return new PageRec(part, page);
-    }
-
-    @Override
-    protected void doDestroyPage(IWorkbenchPart part, PageRec pageRecord) {
-        StateViewPage v = (StateViewPage) pageRecord.page;
-        v.dispose();
-        pageRecord.dispose();
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/views/detail/DetailsPage.java b/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/views/detail/DetailsPage.java
deleted file mode 100644
index 510898d..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/views/detail/DetailsPage.java
+++ /dev/null
@@ -1,232 +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.eclipse.gltrace.views.detail;
-
-import com.android.ide.eclipse.gltrace.editors.GLCallGroups.GLCallNode;
-import com.android.ide.eclipse.gltrace.editors.GLFunctionTraceViewer;
-import com.android.ide.eclipse.gltrace.model.GLCall;
-import com.android.ide.eclipse.gltrace.model.GLTrace;
-import com.android.ide.eclipse.gltrace.state.IGLProperty;
-import com.android.ide.eclipse.gltrace.views.StateView;
-
-import org.eclipse.jface.action.IContributionItem;
-import org.eclipse.jface.action.IToolBarManager;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.TreeSelection;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.StackLayout;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.ui.ISelectionListener;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.part.IPageSite;
-import org.eclipse.ui.part.Page;
-
-import java.util.Arrays;
-import java.util.List;
-
-public class DetailsPage extends Page implements ISelectionListener {
-    private GLTrace mTrace;
-
-    private IToolBarManager mToolBarManager;
-    private Composite mTopComposite;
-    private StackLayout mStackLayout;
-    private Composite mBlankComposite;
-
-    private List<IDetailProvider> mDetailProviders = Arrays.asList(
-            new ShaderSourceDetailsProvider(),
-            new ShaderUniformDetailsProvider(),
-            new TextureImageDetailsProvider(),
-            new VboDetailProvider(),
-            new GlDrawCallDetailProvider(),
-            new VertexAttribPointerDataDetailProvider());
-
-    public DetailsPage(GLTrace trace) {
-        mTrace = trace;
-    }
-
-    public void setInput(GLTrace trace) {
-        mTrace = trace;
-    }
-
-    @Override
-    public void createControl(Composite parent) {
-        mTopComposite = new Composite(parent, SWT.NONE);
-        mStackLayout = new StackLayout();
-        mTopComposite.setLayout(mStackLayout);
-        mTopComposite.setLayoutData(new GridData(GridData.FILL_BOTH));
-
-        mBlankComposite = new Composite(mTopComposite, SWT.NONE);
-
-        mToolBarManager = getSite().getActionBars().getToolBarManager();
-
-        for (IDetailProvider provider : mDetailProviders) {
-            provider.createControl(mTopComposite);
-
-            for (IContributionItem item: provider.getToolBarItems()) {
-                mToolBarManager.add(item);
-            }
-        }
-
-        setDetailsProvider(null);
-    }
-
-    private void setDetailsProvider(IDetailProvider provider) {
-        for (IContributionItem item: mToolBarManager.getItems()) {
-            item.setVisible(false);
-        }
-
-        if (provider == null) {
-            setTopControl(mBlankComposite);
-        } else {
-            setTopControl(provider.getControl());
-
-            for (IContributionItem item: provider.getToolBarItems()) {
-                item.setVisible(true);
-            }
-        }
-
-        mToolBarManager.update(true);
-    }
-
-    private void setTopControl(Control c) {
-        mStackLayout.topControl = c;
-        mTopComposite.layout();
-    }
-
-    @Override
-    public Control getControl() {
-        return mTopComposite;
-    }
-
-    @Override
-    public void init(IPageSite pageSite) {
-        super.init(pageSite);
-        pageSite.getPage().addSelectionListener(this);
-    }
-
-    @Override
-    public void dispose() {
-        getSite().getPage().removeSelectionListener(this);
-
-        for (IDetailProvider provider : mDetailProviders) {
-            provider.disposeControl();
-        }
-
-        super.dispose();
-    }
-
-    @Override
-    public void setFocus() {
-    }
-
-    @Override
-    public void selectionChanged(IWorkbenchPart part, ISelection selection) {
-        if (part instanceof GLFunctionTraceViewer) {
-            GLCall selectedCall = getSelectedCall((GLFunctionTraceViewer) part, selection);
-            if (selectedCall == null) {
-                return;
-            }
-
-            callSelected(selectedCall);
-            return;
-        } else if (part instanceof StateView) {
-            IGLProperty selectedProperty = getSelectedProperty((StateView) part, selection);
-            if (selectedProperty == null) {
-                return;
-            }
-
-            stateVariableSelected(selectedProperty);
-            return;
-        }
-
-        return;
-    }
-
-    private void stateVariableSelected(IGLProperty property) {
-        for (IDetailProvider p : mDetailProviders) {
-            if (!(p instanceof IStateDetailProvider)) {
-                continue;
-            }
-
-            IStateDetailProvider sp = (IStateDetailProvider) p;
-            if (sp.isApplicable(property)) {
-                sp.updateControl(property);
-                setDetailsProvider(sp);
-                return;
-            }
-        }
-
-        setDetailsProvider(null);
-        return;
-    }
-
-    private void callSelected(GLCall selectedCall) {
-        for (IDetailProvider p : mDetailProviders) {
-            if (!(p instanceof ICallDetailProvider)) {
-                continue;
-            }
-
-            ICallDetailProvider cp = (ICallDetailProvider) p;
-            if (cp.isApplicable(selectedCall)) {
-                cp.updateControl(mTrace, selectedCall);
-                setDetailsProvider(cp);
-                return;
-            }
-        }
-
-        setDetailsProvider(null);
-        return;
-    }
-
-    private GLCall getSelectedCall(GLFunctionTraceViewer part, ISelection selection) {
-        if (part.getTrace() != mTrace) {
-            return null;
-        }
-
-        if (!(selection instanceof TreeSelection)) {
-            return null;
-        }
-
-        Object data = ((TreeSelection) selection).getFirstElement();
-        if (data instanceof GLCallNode) {
-            return ((GLCallNode) data).getCall();
-        } else {
-            return null;
-        }
-    }
-
-    private IGLProperty getSelectedProperty(StateView view, ISelection selection) {
-        if (!(selection instanceof IStructuredSelection)) {
-            return null;
-        }
-
-        IStructuredSelection ssel = (IStructuredSelection) selection;
-        @SuppressWarnings("rawtypes")
-        List objects = ssel.toList();
-        if (objects.size() > 0) {
-            Object data = objects.get(0);
-            if (data instanceof IGLProperty) {
-                return (IGLProperty) data;
-            }
-        }
-
-        return null;
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/views/detail/DetailsView.java b/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/views/detail/DetailsView.java
deleted file mode 100644
index 0a2d88e..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/views/detail/DetailsView.java
+++ /dev/null
@@ -1,52 +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.eclipse.gltrace.views.detail;
-
-import com.android.ide.eclipse.gltrace.editors.GLFunctionTraceViewer;
-import com.android.ide.eclipse.gltrace.views.GLPageBookView;
-
-import org.eclipse.ui.IWorkbenchPart;
-
-public class DetailsView extends GLPageBookView {
-    public static final String ID = "com.android.ide.eclipse.gltrace.views.Details"; //$NON-NLS-1$
-
-    public DetailsView() {
-        super(""); //$NON-NLS-1$
-    }
-
-    @Override
-    protected PageRec doCreatePage(IWorkbenchPart part) {
-        if (!(part instanceof GLFunctionTraceViewer)) {
-            return null;
-        }
-
-        GLFunctionTraceViewer viewer = (GLFunctionTraceViewer) part;
-        DetailsPage page = viewer.getDetailsPage();
-
-        initPage(page);
-        page.createControl(getPageBook());
-
-        return new PageRec(part, page);
-    }
-
-    @Override
-    protected void doDestroyPage(IWorkbenchPart part, PageRec pageRecord) {
-        DetailsPage page = (DetailsPage) pageRecord.page;
-        page.dispose();
-        pageRecord.dispose();
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/views/detail/GlDrawCallDetailProvider.java b/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/views/detail/GlDrawCallDetailProvider.java
deleted file mode 100644
index 44a05ff..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/views/detail/GlDrawCallDetailProvider.java
+++ /dev/null
@@ -1,82 +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.eclipse.gltrace.views.detail;
-
-import com.android.ide.eclipse.gltrace.GLProtoBuf.GLMessage.Function;
-import com.android.ide.eclipse.gltrace.model.GLCall;
-import com.android.ide.eclipse.gltrace.model.GLTrace;
-import com.android.ide.eclipse.gltrace.views.FitToCanvasAction;
-import com.android.ide.eclipse.gltrace.views.SaveImageAction;
-import com.android.ide.eclipse.gltrace.widgets.ImageCanvas;
-
-import org.eclipse.jface.action.ActionContributionItem;
-import org.eclipse.jface.action.IContributionItem;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-
-import java.util.Arrays;
-import java.util.List;
-
-public class GlDrawCallDetailProvider implements ICallDetailProvider {
-    private ImageCanvas mImageCanvas;
-    private FitToCanvasAction mFitToCanvasAction;
-    private SaveImageAction mSaveImageAction;
-    private List<IContributionItem> mToolBarItems;
-
-    @Override
-    public boolean isApplicable(GLCall call) {
-        return (call.getFunction() == Function.glDrawArrays
-                || call.getFunction() == Function.glDrawElements) && call.hasFb();
-    }
-
-    @Override
-    public void createControl(Composite parent) {
-        mImageCanvas = new ImageCanvas(parent);
-        mImageCanvas.setFitToCanvas(false);
-
-        mFitToCanvasAction = new FitToCanvasAction(false, mImageCanvas);
-        mSaveImageAction = new SaveImageAction(mImageCanvas);
-
-        mToolBarItems = Arrays.asList(
-                (IContributionItem) new ActionContributionItem(mFitToCanvasAction),
-                (IContributionItem) new ActionContributionItem(mSaveImageAction));
-    }
-
-    @Override
-    public void disposeControl() {
-        if (mImageCanvas != null) {
-            mImageCanvas.dispose();
-            mImageCanvas = null;
-        }
-    }
-
-    @Override
-    public Control getControl() {
-        return mImageCanvas;
-    }
-
-    @Override
-    public void updateControl(GLTrace trace, GLCall call) {
-        mImageCanvas.setImage(trace.getImage(call));
-        mImageCanvas.setFitToCanvas(true);
-    }
-
-    @Override
-    public List<IContributionItem> getToolBarItems() {
-        return mToolBarItems;
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/views/detail/ICallDetailProvider.java b/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/views/detail/ICallDetailProvider.java
deleted file mode 100644
index 51770f3..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/views/detail/ICallDetailProvider.java
+++ /dev/null
@@ -1,31 +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.eclipse.gltrace.views.detail;
-
-import com.android.ide.eclipse.gltrace.model.GLCall;
-import com.android.ide.eclipse.gltrace.model.GLTrace;
-
-public interface ICallDetailProvider extends IDetailProvider {
-    /** Is this provider applicable for given {@link GLCall}? */
-    boolean isApplicable(GLCall call);
-
-    /**
-     * Update the detail view for given {@link GLCall} that is part of the given
-     * {@link GLTrace}.
-     */
-    void updateControl(GLTrace trace, GLCall call);
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/views/detail/IDetailProvider.java b/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/views/detail/IDetailProvider.java
deleted file mode 100644
index 1fc5174..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/views/detail/IDetailProvider.java
+++ /dev/null
@@ -1,38 +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.eclipse.gltrace.views.detail;
-
-import org.eclipse.jface.action.IContributionItem;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-
-import java.util.List;
-
-public interface IDetailProvider {
-    /** Create the controls to display the details. */
-    void createControl(Composite parent);
-
-    /** Dispose off any created controls. */
-    void disposeControl();
-
-    /** Obtain the top level control used by this detail provider. */
-    Control getControl();
-
-
-    /** Obtain a list of tool bar items to be displayed when this provider is active. */
-    List<IContributionItem> getToolBarItems();
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/views/detail/IStateDetailProvider.java b/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/views/detail/IStateDetailProvider.java
deleted file mode 100644
index 4ad06be..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/views/detail/IStateDetailProvider.java
+++ /dev/null
@@ -1,27 +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.eclipse.gltrace.views.detail;
-
-import com.android.ide.eclipse.gltrace.state.IGLProperty;
-
-public interface IStateDetailProvider extends IDetailProvider {
-    /** Is this provider applicable for given GL state property? */
-    boolean isApplicable(IGLProperty state);
-
-    /** Update the detail view for given GL state property. */
-    void updateControl(IGLProperty state);
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/views/detail/ShaderSourceDetailsProvider.java b/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/views/detail/ShaderSourceDetailsProvider.java
deleted file mode 100644
index ca986c3..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/views/detail/ShaderSourceDetailsProvider.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.ide.eclipse.gltrace.views.detail;
-
-import com.android.ide.eclipse.gltrace.state.GLCompositeProperty;
-import com.android.ide.eclipse.gltrace.state.GLStateType;
-import com.android.ide.eclipse.gltrace.state.GLStringProperty;
-import com.android.ide.eclipse.gltrace.state.IGLProperty;
-
-import org.eclipse.jface.action.IContributionItem;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Text;
-
-import java.util.Collections;
-import java.util.List;
-
-public class ShaderSourceDetailsProvider implements IStateDetailProvider {
-    private Text mTextControl;
-
-    @Override
-    public boolean isApplicable(IGLProperty state) {
-        return getShaderSourceProperty(state) != null;
-    }
-
-    @Override
-    public void createControl(Composite parent) {
-        mTextControl = new Text(parent, SWT.BORDER| SWT.READ_ONLY
-                | SWT.MULTI | SWT.WRAP | SWT.V_SCROLL | SWT.H_SCROLL);
-        mTextControl.setEditable(false);
-    }
-
-    @Override
-    public void disposeControl() {
-    }
-
-    @Override
-    public Control getControl() {
-        return mTextControl;
-    }
-
-    @Override
-    public void updateControl(IGLProperty state) {
-        IGLProperty shaderSrcProperty = getShaderSourceProperty(state);
-        if (shaderSrcProperty instanceof GLStringProperty) {
-            String shaderSrc = ((GLStringProperty) shaderSrcProperty).getStringValue();
-            mTextControl.setText(shaderSrc);
-            mTextControl.setEnabled(true);
-        } else {
-            mTextControl.setText(""); //$NON-NLS-1$
-            mTextControl.setEnabled(false);
-        }
-    }
-
-    /**
-     * Get the {@link GLStateType#SHADER_SOURCE} property given a node in
-     * the state hierarchy.
-     * @param state any node in the GL state hierarchy
-     * @return The {@link GLStateType#SHADER_SOURCE} property if a unique instance
-     *         of it can be accessed from the given node, null otherwise.
-     *         A unique instance can be accessed if the given node is
-     *         either the requested node itself, or its parent or sibling.
-     */
-    private IGLProperty getShaderSourceProperty(IGLProperty state) {
-        if (state.getType() == GLStateType.SHADER_SOURCE) {
-            // given node is the requested node
-            return state;
-        }
-
-        if (state.getType() != GLStateType.PER_SHADER_STATE) {
-            // if it is not the parent, then it could be a sibling, in which case
-            // we go up a level to its parent
-            state = state.getParent();
-        }
-
-        if (state != null && state.getType() == GLStateType.PER_SHADER_STATE) {
-            // if it is the parent, we can access the required property
-            return ((GLCompositeProperty) state).getProperty(GLStateType.SHADER_SOURCE);
-        }
-
-        return null;
-    }
-
-    @Override
-    public List<IContributionItem> getToolBarItems() {
-        return Collections.emptyList();
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/views/detail/ShaderUniformDetailsProvider.java b/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/views/detail/ShaderUniformDetailsProvider.java
deleted file mode 100644
index 2e3f725..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/views/detail/ShaderUniformDetailsProvider.java
+++ /dev/null
@@ -1,173 +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.eclipse.gltrace.views.detail;
-
-import com.android.ide.eclipse.gltrace.GLEnum;
-import com.android.ide.eclipse.gltrace.state.GLCompositeProperty;
-import com.android.ide.eclipse.gltrace.state.GLStateType;
-import com.android.ide.eclipse.gltrace.state.IGLProperty;
-import com.google.common.base.Joiner;
-
-import org.eclipse.jface.action.IContributionItem;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Text;
-
-import java.util.Collections;
-import java.util.List;
-
-public class ShaderUniformDetailsProvider implements IStateDetailProvider {
-    private Text mTextControl;
-    private static final Joiner JOINER = Joiner.on(", ");
-
-    @Override
-    public boolean isApplicable(IGLProperty state) {
-        return getShaderUniformProperty(state) != null;
-    }
-
-    @Override
-    public void createControl(Composite parent) {
-        mTextControl = new Text(parent, SWT.BORDER | SWT.READ_ONLY | SWT.MULTI | SWT.WRAP);
-        mTextControl.setEditable(false);
-    }
-
-    @Override
-    public void disposeControl() {
-    }
-
-    @Override
-    public Control getControl() {
-        return mTextControl;
-    }
-
-    @Override
-    public void updateControl(IGLProperty state) {
-        IGLProperty uniform = getShaderUniformProperty(state);
-        if (uniform instanceof GLCompositeProperty) {
-            GLCompositeProperty uniformProperty = (GLCompositeProperty) uniform;
-            IGLProperty nameProperty = uniformProperty.getProperty(GLStateType.UNIFORM_NAME);
-            IGLProperty typeProperty = uniformProperty.getProperty(GLStateType.UNIFORM_TYPE);
-            IGLProperty valueProperty = uniformProperty.getProperty(GLStateType.UNIFORM_VALUE);
-
-            String name = (String) nameProperty.getValue();
-            GLEnum type = (GLEnum) typeProperty.getValue();
-            Object value = valueProperty.getValue();
-            mTextControl.setText(formatUniform(name, type, value));
-            mTextControl.setEnabled(true);
-        } else {
-            mTextControl.setText(""); //$NON-NLS-1$
-            mTextControl.setEnabled(false);
-        }
-    }
-
-    private String formatUniform(String name, GLEnum type, Object value) {
-        String valueText;
-
-        switch (type) {
-            case GL_FLOAT:
-            case GL_FLOAT_VEC2:
-            case GL_FLOAT_VEC3:
-            case GL_FLOAT_VEC4:
-            case GL_INT:
-            case GL_INT_VEC2:
-            case GL_INT_VEC3:
-            case GL_INT_VEC4:
-            case GL_BOOL:
-            case GL_BOOL_VEC2:
-            case GL_BOOL_VEC3:
-            case GL_BOOL_VEC4:
-                valueText = formatVector(value);
-                break;
-            case GL_FLOAT_MAT2:
-                valueText = formatMatrix(2, value);
-                break;
-            case GL_FLOAT_MAT3:
-                valueText = formatMatrix(3, value);
-                break;
-            case GL_FLOAT_MAT4:
-                valueText = formatMatrix(4, value);
-                break;
-            case GL_SAMPLER_2D:
-            case GL_SAMPLER_CUBE:
-            default:
-                valueText = value.toString();
-                break;
-        }
-
-        return String.format("%s %s = %s", type, name, valueText); //$NON-NLS-1$
-    }
-
-    private String formatVector(Object value) {
-        if (value instanceof List<?>) {
-            List<?> list = (List<?>) value;
-            StringBuilder sb = new StringBuilder(list.size() * 4);
-            sb.append('[');
-            JOINER.appendTo(sb, list);
-            sb.append(']');
-            return sb.toString();
-        }
-
-        return value.toString();
-    }
-
-    private String formatMatrix(int dimension, Object value) {
-        if (value instanceof List<?>) {
-            List<?> list = (List<?>) value;
-            if (list.size() != dimension * dimension) {
-                // Uniforms can only be square matrices, so this scenario should
-                // not occur.
-                return formatVector(value);
-            }
-
-            StringBuilder sb = new StringBuilder(list.size() * 4);
-            sb.append('[');
-            sb.append('\n');
-            for (int i = 0; i < dimension; i++) {
-                sb.append("    "); //$NON-NLS-1$
-                JOINER.appendTo(sb, list.subList(i * dimension, (i + 1) * dimension));
-                sb.append('\n');
-            }
-            sb.append(']');
-            return sb.toString();
-        }
-
-        return value.toString();
-    }
-
-    /**
-     * Get the {@link GLStateType#PER_UNIFORM_STATE} property given a node in
-     * the state hierarchy.
-     */
-    private IGLProperty getShaderUniformProperty(IGLProperty state) {
-        if (state.getType() == GLStateType.PER_UNIFORM_STATE) {
-            return state;
-        }
-
-        state = state.getParent();
-        if (state != null && state.getType() == GLStateType.PER_UNIFORM_STATE) {
-            return state;
-        }
-
-        return null;
-    }
-
-    @Override
-    public List<IContributionItem> getToolBarItems() {
-        return Collections.emptyList();
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/views/detail/TextureImageDetailsProvider.java b/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/views/detail/TextureImageDetailsProvider.java
deleted file mode 100644
index 4dcbb10..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/views/detail/TextureImageDetailsProvider.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.eclipse.gltrace.views.detail;
-
-import com.android.ide.eclipse.gltrace.state.GLCompositeProperty;
-import com.android.ide.eclipse.gltrace.state.GLSparseArrayProperty;
-import com.android.ide.eclipse.gltrace.state.GLStateType;
-import com.android.ide.eclipse.gltrace.state.GLStringProperty;
-import com.android.ide.eclipse.gltrace.state.IGLProperty;
-import com.android.ide.eclipse.gltrace.views.FitToCanvasAction;
-import com.android.ide.eclipse.gltrace.views.SaveImageAction;
-import com.android.ide.eclipse.gltrace.widgets.ImageCanvas;
-
-import org.eclipse.jface.action.ActionContributionItem;
-import org.eclipse.jface.action.IContributionItem;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Display;
-
-import java.util.Arrays;
-import java.util.List;
-
-public class TextureImageDetailsProvider implements IStateDetailProvider {
-    private ImageCanvas mImageCanvas;
-    private FitToCanvasAction mFitToCanvasAction;
-    private SaveImageAction mSaveImageAction;
-    private List<IContributionItem> mToolBarItems;
-
-    @Override
-    public boolean isApplicable(IGLProperty state) {
-        return getTextureImageProperty(state) != null;
-    }
-
-    @Override
-    public void createControl(Composite parent) {
-        mImageCanvas = new ImageCanvas(parent);
-        mImageCanvas.setFitToCanvas(false);
-
-        mFitToCanvasAction = new FitToCanvasAction(false, mImageCanvas);
-        mSaveImageAction = new SaveImageAction(mImageCanvas);
-
-        mToolBarItems = Arrays.asList(
-                (IContributionItem) new ActionContributionItem(mFitToCanvasAction),
-                (IContributionItem) new ActionContributionItem(mSaveImageAction));
-    }
-
-    @Override
-    public void disposeControl() {
-        mImageCanvas.dispose();
-        mImageCanvas = null;
-    }
-
-    @Override
-    public Control getControl() {
-        return mImageCanvas;
-    }
-
-    @Override
-    public void updateControl(IGLProperty state) {
-        IGLProperty imageProperty = getTextureImageProperty(state);
-        if (imageProperty == null) {
-            return;
-        }
-
-        String texturePath = ((GLStringProperty) imageProperty).getStringValue();
-        if (texturePath != null) {
-            mImageCanvas.setImage(new Image(Display.getDefault(), texturePath));
-            mImageCanvas.setFitToCanvas(false);
-            return;
-        }
-    }
-
-    /**
-     * Get the {@link GLStateType#TEXTURE_IMAGE} property given a node in
-     * the state hierarchy.
-     * @param state any node in the GL state hierarchy
-     * @return The {@link GLStateType#TEXTURE_IMAGE} property if a unique instance
-     *         of it can be accessed from the given node. A unique instance can be
-     *         accessed if the given node is either the requested node itself, or
-     *         its parent or sibling. In cases where a unique instance cannot be
-     *         accessed, but one of the texture mipmap levels can be accessed, then
-     *         return the first texture mipmap level. This happens if the selected
-     *         state is a child of {@link GLStateType#PER_TEXTURE_STATE}. Returns
-     *         null otherwise.
-     */
-    private IGLProperty getTextureImageProperty(IGLProperty state) {
-        if (state.getType() == GLStateType.TEXTURE_IMAGE) {
-            // given node is the requested node
-            return state;
-        }
-
-        IGLProperty img = getImageFromPerTextureLevelState(state);
-        if (img != null) {
-            return img;
-        }
-
-        return getFirstMipmapImage(state);
-    }
-
-    /**
-     * Returns the {@link GLStateType#TEXTURE_IMAGE} if the provided state is either
-     * {@link GLStateType#PER_TEXTURE_LEVEL_STATE} or one of its children. Returns null otherwise.
-     */
-    private IGLProperty getImageFromPerTextureLevelState(IGLProperty state) {
-        if (state != null && state.getType() != GLStateType.PER_TEXTURE_LEVEL_STATE) {
-            state = state.getParent();
-        }
-
-        if (state == null || state.getType() != GLStateType.PER_TEXTURE_LEVEL_STATE) {
-            return null;
-        }
-
-        return ((GLCompositeProperty) state).getProperty(GLStateType.TEXTURE_IMAGE);
-    }
-
-    /**
-     * Returns the first mipmap level's image entry if the provided state is either
-     * {@link GLStateType#PER_TEXTURE_STATE} or one of its immediate children, null otherwise.
-     */
-    private IGLProperty getFirstMipmapImage(IGLProperty state) {
-        if (state != null && state.getType() != GLStateType.PER_TEXTURE_STATE) {
-            state = state.getParent();
-        }
-
-        if (state == null || state.getType() != GLStateType.PER_TEXTURE_STATE) {
-            return null;
-        }
-
-        IGLProperty mipmaps =
-                ((GLCompositeProperty) state).getProperty(GLStateType.TEXTURE_MIPMAPS);
-        if (!(mipmaps instanceof GLSparseArrayProperty)) {
-            return null;
-        }
-
-        IGLProperty perTextureLevelState = ((GLSparseArrayProperty) mipmaps).getProperty(0);
-        return getImageFromPerTextureLevelState(perTextureLevelState);
-    }
-
-    @Override
-    public List<IContributionItem> getToolBarItems() {
-        return mToolBarItems;
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/views/detail/VboDetailProvider.java b/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/views/detail/VboDetailProvider.java
deleted file mode 100644
index e0ba947..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/views/detail/VboDetailProvider.java
+++ /dev/null
@@ -1,189 +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.eclipse.gltrace.views.detail;
-
-import com.android.ide.eclipse.gltrace.GLEnum;
-import com.android.ide.eclipse.gltrace.GLUtils;
-import com.android.ide.eclipse.gltrace.state.GLCompositeProperty;
-import com.android.ide.eclipse.gltrace.state.GLStateType;
-import com.android.ide.eclipse.gltrace.state.IGLProperty;
-
-import org.eclipse.jface.action.IContributionItem;
-import org.eclipse.jface.layout.GridDataFactory;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Combo;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Text;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
-public class VboDetailProvider implements IStateDetailProvider {
-    private static enum DisplayFormat {
-        GL_FLOAT,
-        GL_BYTE,
-        GL_UNSIGNED_BYTE,
-        GL_SHORT,
-        GL_UNSIGNED_SHORT,
-        GL_FIXED,
-    }
-
-    private Composite mComposite;
-
-    private Label mSizeLabel;
-    private Label mUsageLabel;
-    private Label mTypeLabel;
-    private Combo mDisplayFormatCombo;
-    private Text mTextControl;
-
-    private byte[] mBufferData;
-
-    @Override
-    public boolean isApplicable(IGLProperty state) {
-        return getVboProperty(state) != null;
-    }
-
-    @Override
-    public void createControl(Composite parent) {
-        mComposite = new Composite(parent, SWT.NONE);
-        GridLayout layout = new GridLayout(2, false);
-        layout.marginWidth = layout.marginHeight = 0;
-        mComposite.setLayout(layout);
-        GridDataFactory.fillDefaults().grab(true, true).applyTo(mComposite);
-
-        Label l = new Label(mComposite, SWT.NONE);
-        l.setText("Size: ");
-        GridDataFactory.fillDefaults().align(SWT.RIGHT, SWT.CENTER).applyTo(l);
-
-        mSizeLabel = new Label(mComposite, SWT.NONE);
-        GridDataFactory.fillDefaults().grab(true, false).applyTo(mSizeLabel);
-
-        l = new Label(mComposite, SWT.NONE);
-        l.setText("Usage: ");
-        GridDataFactory.fillDefaults().align(SWT.RIGHT, SWT.CENTER).applyTo(l);
-
-        mUsageLabel = new Label(mComposite, SWT.NONE);
-        GridDataFactory.fillDefaults().grab(true, false).applyTo(mUsageLabel);
-
-        l = new Label(mComposite, SWT.NONE);
-        l.setText("Type: ");
-        GridDataFactory.fillDefaults().align(SWT.RIGHT, SWT.CENTER).applyTo(l);
-
-        mTypeLabel = new Label(mComposite, SWT.NONE);
-        GridDataFactory.fillDefaults().grab(true, false).applyTo(mTypeLabel);
-
-        l = new Label(mComposite, SWT.NONE);
-        l.setText("Format Data As: ");
-        GridDataFactory.fillDefaults().align(SWT.RIGHT, SWT.CENTER).applyTo(l);
-
-        DisplayFormat[] values = DisplayFormat.values();
-        List<String> formats = new ArrayList<String>(values.length);
-        for (DisplayFormat format: values) {
-            formats.add(format.name());
-        }
-
-        mDisplayFormatCombo = new Combo(mComposite, SWT.DROP_DOWN | SWT.READ_ONLY);
-        mDisplayFormatCombo.setItems(formats.toArray(new String[formats.size()]));
-        mDisplayFormatCombo.select(0);
-        mDisplayFormatCombo.addSelectionListener(new SelectionAdapter() {
-            @Override
-            public void widgetSelected(SelectionEvent e) {
-                updateContents();
-            }
-        });
-        GridDataFactory.fillDefaults().grab(true, false).applyTo(mDisplayFormatCombo);
-
-        mTextControl = new Text(mComposite, SWT.BORDER | SWT.READ_ONLY | SWT.MULTI
-                                                   | SWT.WRAP | SWT.V_SCROLL | SWT.H_SCROLL);
-        GridDataFactory.fillDefaults().span(2, 1).grab(true, true).applyTo(mTextControl);
-        mTextControl.setEditable(false);
-    }
-
-    @Override
-    public void disposeControl() {
-    }
-
-    @Override
-    public Control getControl() {
-        return mComposite;
-    }
-
-    @Override
-    public void updateControl(IGLProperty state) {
-        IGLProperty vbo = getVboProperty(state);
-        if (vbo instanceof GLCompositeProperty) {
-            GLCompositeProperty vboProperty = (GLCompositeProperty) vbo;
-
-            IGLProperty sizeProperty = vboProperty.getProperty(GLStateType.BUFFER_SIZE);
-            mSizeLabel.setText(sizeProperty.getStringValue() + " bytes"); //$NON-NLS-1$
-
-            IGLProperty usageProperty = vboProperty.getProperty(GLStateType.BUFFER_USAGE);
-            mUsageLabel.setText(usageProperty.getStringValue());
-
-            IGLProperty typeProperty = vboProperty.getProperty(GLStateType.BUFFER_TYPE);
-            mTypeLabel.setText(typeProperty.getStringValue());
-
-            IGLProperty dataProperty = vboProperty.getProperty(GLStateType.BUFFER_DATA);
-            mBufferData = (byte[]) dataProperty.getValue();
-        } else {
-            mBufferData = null;
-        }
-
-        updateContents();
-    }
-
-    private void updateContents() {
-        if (mBufferData != null) {
-            mTextControl.setText(GLUtils.formatData(mBufferData,
-                    GLEnum.valueOf(mDisplayFormatCombo.getText())));
-            mTextControl.setEnabled(true);
-            mDisplayFormatCombo.setEnabled(true);
-        } else {
-            mTextControl.setText("");
-            mTextControl.setEnabled(false);
-            mDisplayFormatCombo.setEnabled(false);
-        }
-    }
-
-    @Override
-    public List<IContributionItem> getToolBarItems() {
-        return Collections.emptyList();
-    }
-
-    /**
-     * Get the {@link GLStateType#VBO_COMPOSITE} property given a node in
-     * the state hierarchy.
-     */
-    private IGLProperty getVboProperty(IGLProperty state) {
-        if (state.getType() == GLStateType.VBO_COMPOSITE) {
-            return state;
-        }
-
-        state = state.getParent();
-        if (state != null && state.getType() == GLStateType.VBO_COMPOSITE) {
-            return state;
-        }
-
-        return null;
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/views/detail/VertexAttribPointerDataDetailProvider.java b/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/views/detail/VertexAttribPointerDataDetailProvider.java
deleted file mode 100644
index 55f8d84..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/views/detail/VertexAttribPointerDataDetailProvider.java
+++ /dev/null
@@ -1,72 +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.eclipse.gltrace.views.detail;
-
-import com.android.ide.eclipse.gltrace.GLEnum;
-import com.android.ide.eclipse.gltrace.GLUtils;
-import com.android.ide.eclipse.gltrace.GLProtoBuf.GLMessage.Function;
-import com.android.ide.eclipse.gltrace.model.GLCall;
-import com.android.ide.eclipse.gltrace.model.GLTrace;
-import com.google.protobuf.ByteString;
-
-import org.eclipse.jface.action.IContributionItem;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Text;
-
-import java.util.Collections;
-import java.util.List;
-
-public class VertexAttribPointerDataDetailProvider implements ICallDetailProvider {
-    private Text mText;
-
-    @Override
-    public boolean isApplicable(GLCall call) {
-        return call.getFunction() == Function.glVertexAttribPointerData;
-    }
-
-    @Override
-    public void createControl(Composite parent) {
-        mText = new Text(parent, SWT.BORDER | SWT.READ_ONLY | SWT.MULTI
-                | SWT.WRAP | SWT.V_SCROLL | SWT.H_SCROLL);
-    }
-
-    @Override
-    public void disposeControl() {
-    }
-
-    @Override
-    public Control getControl() {
-        return mText;
-    }
-
-    @Override
-    public void updateControl(GLTrace trace, GLCall call) {
-        // void glVertexAttribPointerData(GLuint indx, GLint size, GLenum type, GLboolean norm,
-        //                      GLsizei stride, const GLvoid* ptr, int minIndex, int maxIndex)
-        GLEnum type = (GLEnum) call.getProperty(GLCall.PROPERTY_VERTEX_ATTRIB_POINTER_TYPE);
-        byte[] data = (byte[]) call.getProperty(GLCall.PROPERTY_VERTEX_ATTRIB_POINTER_DATA);
-
-        mText.setText(GLUtils.formatData(data, type));
-    }
-
-    @Override
-    public List<IContributionItem> getToolBarItems() {
-        return Collections.emptyList();
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/widgets/ImageCanvas.java b/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/widgets/ImageCanvas.java
deleted file mode 100644
index 23baf17..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/widgets/ImageCanvas.java
+++ /dev/null
@@ -1,250 +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.eclipse.gltrace.widgets;
-
-import com.android.ide.eclipse.gltrace.GlTracePlugin;
-
-import org.eclipse.core.runtime.Status;
-import org.eclipse.jface.dialogs.ErrorDialog;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.GC;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.graphics.ImageData;
-import org.eclipse.swt.graphics.ImageLoader;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.graphics.Rectangle;
-import org.eclipse.swt.widgets.Canvas;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.Listener;
-import org.eclipse.swt.widgets.ScrollBar;
-
-import java.io.File;
-
-public class ImageCanvas extends Canvas {
-    private static final int SCROLLBAR_INCREMENT = 20;
-
-    private Point mOrigin;
-
-    private ScrollBar mHorizontalScrollBar;
-    private ScrollBar mVerticalScrollBar;
-
-    private Image mImage;
-    private boolean mFitToCanvas;
-
-    public ImageCanvas(Composite parent) {
-        super(parent, SWT.NO_BACKGROUND | SWT.V_SCROLL | SWT.H_SCROLL);
-        mOrigin = new Point(0, 0);
-
-        mHorizontalScrollBar = getHorizontalBar();
-        mVerticalScrollBar = getVerticalBar();
-
-        mFitToCanvas = true;
-
-        setScrollBarIncrements();
-        setScrollBarPageIncrements(getClientArea());
-
-        updateScrollBars();
-
-        SelectionListener scrollBarSelectionListener = new SelectionAdapter() {
-            @Override
-            public void widgetSelected(SelectionEvent e) {
-                if (e.getSource() == mHorizontalScrollBar) {
-                    scrollHorizontally();
-                } else {
-                    scrollVertically();
-                }
-            }
-        };
-
-        mHorizontalScrollBar.addSelectionListener(scrollBarSelectionListener);
-        mVerticalScrollBar.addSelectionListener(scrollBarSelectionListener);
-
-        addListener(SWT.Resize,  new Listener() {
-            @Override
-            public void handleEvent(Event e) {
-                setScrollBarPageIncrements(getClientArea());
-                updateScrollBars();
-            }
-        });
-
-        addListener(SWT.Paint, new Listener() {
-            @Override
-            public void handleEvent(Event e) {
-                paintCanvas(e.gc);
-            }
-        });
-    }
-
-    public void setFitToCanvas(boolean en) {
-        mFitToCanvas = en;
-        updateScrollBars();
-        redraw();
-    }
-
-    public void setImage(Image image) {
-        if (mImage != null) {
-            mImage.dispose();
-        }
-
-        mImage = image;
-        mOrigin = new Point(0, 0);
-        updateScrollBars();
-        redraw();
-    }
-
-    private void updateScrollBars() {
-        Rectangle client = getClientArea();
-
-        int imageWidth, imageHeight;
-        if (mImage != null & !mFitToCanvas) {
-            imageWidth = mImage.getBounds().width;
-            imageHeight = mImage.getBounds().height;
-        } else {
-            imageWidth = client.width;
-            imageHeight = client.height;
-        }
-
-        mHorizontalScrollBar.setMaximum(imageWidth);
-        mVerticalScrollBar.setMaximum(imageHeight);
-        mHorizontalScrollBar.setThumb(Math.min(imageWidth, client.width));
-        mVerticalScrollBar.setThumb(Math.min(imageHeight, client.height));
-
-        int hPage = imageWidth - client.width;
-        int vPage = imageHeight - client.height;
-        int hSelection = mHorizontalScrollBar.getSelection();
-        int vSelection = mVerticalScrollBar.getSelection();
-        if (hSelection >= hPage) {
-            if (hPage <= 0) {
-                hSelection = 0;
-            }
-            mOrigin.x = -hSelection;
-        }
-
-        if (vSelection >= vPage) {
-            if (vPage <= 0) {
-                vSelection = 0;
-            }
-            mOrigin.y = -vSelection;
-        }
-
-        redraw();
-    }
-
-    private void setScrollBarPageIncrements(Rectangle clientArea) {
-        mHorizontalScrollBar.setPageIncrement(clientArea.width);
-        mVerticalScrollBar.setPageIncrement(clientArea.height);
-    }
-
-    private void setScrollBarIncrements() {
-        // The default increment is 1 pixel. Assign a saner default.
-        mHorizontalScrollBar.setIncrement(SCROLLBAR_INCREMENT);
-        mVerticalScrollBar.setIncrement(SCROLLBAR_INCREMENT);
-    }
-
-    private void scrollHorizontally() {
-        if (mImage == null) {
-            return;
-        }
-
-        int selection = mHorizontalScrollBar.getSelection();
-        int destX = -selection - mOrigin.x;
-        Rectangle imageBounds = mImage.getBounds();
-        scroll(destX, 0, 0, 0, imageBounds.width, imageBounds.height, false);
-        mOrigin.x = -selection;
-    }
-
-    private void scrollVertically() {
-        if (mImage == null) {
-            return;
-        }
-
-        int selection = mVerticalScrollBar.getSelection();
-        int destY = -selection - mOrigin.y;
-        Rectangle imageBounds = mImage.getBounds();
-        scroll(0, destY, 0, 0, imageBounds.width, imageBounds.height, false);
-        mOrigin.y = -selection;
-    }
-
-    private void paintCanvas(GC gc) {
-        gc.fillRectangle(getClientArea()); // clear entire client area
-        if (mImage == null) {
-            return;
-        }
-
-        Rectangle rect = mImage.getBounds();
-        Rectangle client = getClientArea();
-
-        if (mFitToCanvas && rect.width > 0 && rect.height > 0) {
-            double sx = (double) client.width / (double) rect.width;
-            double sy = (double) client.height / (double) rect.height;
-
-            if (sx < sy) {
-                // if we need to scale more horizontally, then reduce the client height
-                // appropriately so that aspect ratios are maintained
-                gc.drawImage(mImage,
-                        0, 0, rect.width, rect.height,
-                        0, 0, client.width, (int)(rect.height * sx));
-                drawBorder(gc, 0, 0, client.width, (int)(rect.height * sx));
-            } else {
-                // scale client width to maintain aspect ratio
-                gc.drawImage(mImage,
-                        0, 0, rect.width, rect.height,
-                        0, 0, (int)(rect.width * sy), client.height);
-                drawBorder(gc, 0, 0, (int)(rect.width * sy), client.height);
-            }
-        } else {
-            gc.drawImage(mImage, mOrigin.x, mOrigin.y);
-            drawBorder(gc, mOrigin.x, mOrigin.y, rect.width, rect.height);
-        }
-    }
-
-    private void drawBorder(GC gc, int x, int y, int width, int height) {
-        Color origFg = gc.getForeground();
-        gc.setForeground(Display.getDefault().getSystemColor(SWT.COLOR_WIDGET_NORMAL_SHADOW));
-        gc.drawRectangle(x, y, width, height);
-        gc.setForeground(origFg);
-    }
-
-    @Override
-    public void dispose() {
-        if (mImage != null && !mImage.isDisposed()) {
-            mImage.dispose();
-        }
-    }
-
-    public void exportImageTo(File file) {
-        if (mImage == null || file == null) {
-            return;
-        }
-
-        ImageLoader imageLoader = new ImageLoader();
-        imageLoader.data = new ImageData[] { mImage.getImageData() };
-
-        try {
-            imageLoader.save(file.getAbsolutePath(), SWT.IMAGE_PNG);
-        } catch (Exception e) {
-            ErrorDialog.openError(getShell(), "Save Image", "Error saving image",
-                    new Status(Status.ERROR, GlTracePlugin.PLUGIN_ID, e.toString()));
-        }
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.hierarchyviewer/.classpath b/eclipse/plugins/com.android.ide.eclipse.hierarchyviewer/.classpath
deleted file mode 100644
index 7073f20..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.hierarchyviewer/.classpath
+++ /dev/null
@@ -1,10 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="src" path="src"/>
-    <classpathentry kind="lib" path="libs/hierarchyviewer2lib.jar" sourcepath="/hierarchyviewer2lib"/>
-    <classpathentry combineaccessrules="false" kind="src" path="/ddmlib"/>
-    <classpathentry combineaccessrules="false" kind="src" path="/ddmuilib"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/eclipse/plugins/com.android.ide.eclipse.hierarchyviewer/.project b/eclipse/plugins/com.android.ide.eclipse.hierarchyviewer/.project
deleted file mode 100644
index c9e9696..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.hierarchyviewer/.project
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>plugin-hierarchyviewer</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.PluginNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/eclipse/plugins/com.android.ide.eclipse.hierarchyviewer/.settings/org.eclipse.jdt.core.prefs b/eclipse/plugins/com.android.ide.eclipse.hierarchyviewer/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index ea66196..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.hierarchyviewer/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,98 +0,0 @@
-eclipse.preferences.version=1
-org.eclipse.jdt.core.compiler.annotation.missingNonNullByDefaultAnnotation=ignore
-org.eclipse.jdt.core.compiler.annotation.nonnull=com.android.annotations.NonNull
-org.eclipse.jdt.core.compiler.annotation.nonnullbydefault=com.android.annotations.NonNullByDefault
-org.eclipse.jdt.core.compiler.annotation.nonnullisdefault=disabled
-org.eclipse.jdt.core.compiler.annotation.nullable=com.android.annotations.Nullable
-org.eclipse.jdt.core.compiler.annotation.nullanalysis=enabled
-org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6
-org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.6
-org.eclipse.jdt.core.compiler.debug.lineNumber=generate
-org.eclipse.jdt.core.compiler.debug.localVariable=generate
-org.eclipse.jdt.core.compiler.debug.sourceFile=generate
-org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
-org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
-org.eclipse.jdt.core.compiler.problem.comparingIdentical=warning
-org.eclipse.jdt.core.compiler.problem.deadCode=warning
-org.eclipse.jdt.core.compiler.problem.deprecation=warning
-org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
-org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
-org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
-org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=ignore
-org.eclipse.jdt.core.compiler.problem.fallthroughCase=warning
-org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
-org.eclipse.jdt.core.compiler.problem.fieldHiding=warning
-org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
-org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
-org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
-org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
-org.eclipse.jdt.core.compiler.problem.includeNullInfoFromAsserts=enabled
-org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
-org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=warning
-org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
-org.eclipse.jdt.core.compiler.problem.localVariableHiding=warning
-org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
-org.eclipse.jdt.core.compiler.problem.missingDefaultCase=ignore
-org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=warning
-org.eclipse.jdt.core.compiler.problem.missingEnumCaseDespiteDefault=disabled
-org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=warning
-org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=error
-org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled
-org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
-org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=ignore
-org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
-org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
-org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore
-org.eclipse.jdt.core.compiler.problem.nullAnnotationInferenceConflict=warning
-org.eclipse.jdt.core.compiler.problem.nullReference=warning
-org.eclipse.jdt.core.compiler.problem.nullSpecInsufficientInfo=warning
-org.eclipse.jdt.core.compiler.problem.nullSpecViolation=warning
-org.eclipse.jdt.core.compiler.problem.nullUncheckedConversion=ignore
-org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
-org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
-org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=warning
-org.eclipse.jdt.core.compiler.problem.potentialNullReference=warning
-org.eclipse.jdt.core.compiler.problem.potentialNullSpecViolation=error
-org.eclipse.jdt.core.compiler.problem.potentiallyUnclosedCloseable=warning
-org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
-org.eclipse.jdt.core.compiler.problem.redundantNullAnnotation=warning
-org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
-org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=ignore
-org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=warning
-org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=ignore
-org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=ignore
-org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
-org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
-org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=enabled
-org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
-org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
-org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
-org.eclipse.jdt.core.compiler.problem.unavoidableGenericTypeProblems=disabled
-org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
-org.eclipse.jdt.core.compiler.problem.unclosedCloseable=error
-org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
-org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
-org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=warning
-org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=warning
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.unusedImport=warning
-org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
-org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
-org.eclipse.jdt.core.compiler.problem.unusedObjectAllocation=warning
-org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
-org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
-org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
-org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
-org.eclipse.jdt.core.compiler.source=1.6
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
deleted file mode 100644
index b57d20c..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.hierarchyviewer/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,18 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: Hierarchy Viewer
-Bundle-SymbolicName: com.android.ide.eclipse.hierarchyviewer;singleton:=true
-Bundle-Version: 24.3.3.qualifier
-Bundle-Activator: com.android.ide.eclipse.hierarchyviewer.HierarchyViewerPlugin
-Bundle-Vendor: The Android Open Source Project
-Bundle-Localization: plugin
-Bundle-ActivationPolicy: lazy
-Require-Bundle: org.eclipse.ui,
- org.eclipse.core.runtime,
- org.eclipse.ui.console,
- com.android.ide.eclipse.ddms,
- com.android.ide.eclipse.base
-Bundle-ClassPath: .,
- libs/hierarchyviewer2lib.jar
-Export-Package: com.android.ide.eclipse.hierarchyviewer
-Bundle-RequiredExecutionEnvironment: JavaSE-1.6
diff --git a/eclipse/plugins/com.android.ide.eclipse.hierarchyviewer/MODULE_LICENSE_APACHE2 b/eclipse/plugins/com.android.ide.eclipse.hierarchyviewer/MODULE_LICENSE_APACHE2
deleted file mode 100644
index e69de29..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.hierarchyviewer/MODULE_LICENSE_APACHE2
+++ /dev/null
diff --git a/eclipse/plugins/com.android.ide.eclipse.hierarchyviewer/about.html b/eclipse/plugins/com.android.ide.eclipse.hierarchyviewer/about.html
deleted file mode 100644
index 380248c..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.hierarchyviewer/about.html
+++ /dev/null
@@ -1,218 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
-    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
-<title>About</title>
-</head>
-<body lang="EN-US">
-<h2>About This Content</h2>
- 
-<p>September 19, 2010</p>	
-<h3>License</h3>
-
-<pre>Apache License
-                           Version 2.0, January 2004
-                        http://www.apache.org/licenses/
-
-   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
-   1. Definitions.
-
-      &quot;License&quot; shall mean the terms and conditions for use, reproduction,
-      and distribution as defined by Sections 1 through 9 of this document.
-
-      &quot;Licensor&quot; shall mean the copyright owner or entity authorized by
-      the copyright owner that is granting the License.
-
-      &quot;Legal Entity&quot; shall mean the union of the acting entity and all
-      other entities that control, are controlled by, or are under common
-      control with that entity. For the purposes of this definition,
-      &quot;control&quot; means (i) the power, direct or indirect, to cause the
-      direction or management of such entity, whether by contract or
-      otherwise, or (ii) ownership of fifty percent (50%) or more of the
-      outstanding shares, or (iii) beneficial ownership of such entity.
-
-      &quot;You&quot; (or &quot;Your&quot;) shall mean an individual or Legal Entity
-      exercising permissions granted by this License.
-
-      &quot;Source&quot; form shall mean the preferred form for making modifications,
-      including but not limited to software source code, documentation
-      source, and configuration files.
-
-      &quot;Object&quot; form shall mean any form resulting from mechanical
-      transformation or translation of a Source form, including but
-      not limited to compiled object code, generated documentation,
-      and conversions to other media types.
-
-      &quot;Work&quot; shall mean the work of authorship, whether in Source or
-      Object form, made available under the License, as indicated by a
-      copyright notice that is included in or attached to the work
-      (an example is provided in the Appendix below).
-
-      &quot;Derivative Works&quot; shall mean any work, whether in Source or Object
-      form, that is based on (or derived from) the Work and for which the
-      editorial revisions, annotations, elaborations, or other modifications
-      represent, as a whole, an original work of authorship. For the purposes
-      of this License, Derivative Works shall not include works that remain
-      separable from, or merely link (or bind by name) to the interfaces of,
-      the Work and Derivative Works thereof.
-
-      &quot;Contribution&quot; shall mean any work of authorship, including
-      the original version of the Work and any modifications or additions
-      to that Work or Derivative Works thereof, that is intentionally
-      submitted to Licensor for inclusion in the Work by the copyright owner
-      or by an individual or Legal Entity authorized to submit on behalf of
-      the copyright owner. For the purposes of this definition, &quot;submitted&quot;
-      means any form of electronic, verbal, or written communication sent
-      to the Licensor or its representatives, including but not limited to
-      communication on electronic mailing lists, source code control systems,
-      and issue tracking systems that are managed by, or on behalf of, the
-      Licensor for the purpose of discussing and improving the Work, but
-      excluding communication that is conspicuously marked or otherwise
-      designated in writing by the copyright owner as &quot;Not a Contribution.&quot;
-
-      &quot;Contributor&quot; shall mean Licensor and any individual or Legal Entity
-      on behalf of whom a Contribution has been received by Licensor and
-      subsequently incorporated within the Work.
-
-   2. Grant of Copyright License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      copyright license to reproduce, prepare Derivative Works of,
-      publicly display, publicly perform, sublicense, and distribute the
-      Work and such Derivative Works in Source or Object form.
-
-   3. Grant of Patent License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      (except as stated in this section) patent license to make, have made,
-      use, offer to sell, sell, import, and otherwise transfer the Work,
-      where such license applies only to those patent claims licensable
-      by such Contributor that are necessarily infringed by their
-      Contribution(s) alone or by combination of their Contribution(s)
-      with the Work to which such Contribution(s) was submitted. If You
-      institute patent litigation against any entity (including a
-      cross-claim or counterclaim in a lawsuit) alleging that the Work
-      or a Contribution incorporated within the Work constitutes direct
-      or contributory patent infringement, then any patent licenses
-      granted to You under this License for that Work shall terminate
-      as of the date such litigation is filed.
-
-   4. Redistribution. You may reproduce and distribute copies of the
-      Work or Derivative Works thereof in any medium, with or without
-      modifications, and in Source or Object form, provided that You
-      meet the following conditions:
-
-      (a) You must give any other recipients of the Work or
-          Derivative Works a copy of this License; and
-
-      (b) You must cause any modified files to carry prominent notices
-          stating that You changed the files; and
-
-      (c) You must retain, in the Source form of any Derivative Works
-          that You distribute, all copyright, patent, trademark, and
-          attribution notices from the Source form of the Work,
-          excluding those notices that do not pertain to any part of
-          the Derivative Works; and
-
-      (d) If the Work includes a &quot;NOTICE&quot; text file as part of its
-          distribution, then any Derivative Works that You distribute must
-          include a readable copy of the attribution notices contained
-          within such NOTICE file, excluding those notices that do not
-          pertain to any part of the Derivative Works, in at least one
-          of the following places: within a NOTICE text file distributed
-          as part of the Derivative Works; within the Source form or
-          documentation, if provided along with the Derivative Works; or,
-          within a display generated by the Derivative Works, if and
-          wherever such third-party notices normally appear. The contents
-          of the NOTICE file are for informational purposes only and
-          do not modify the License. You may add Your own attribution
-          notices within Derivative Works that You distribute, alongside
-          or as an addendum to the NOTICE text from the Work, provided
-          that such additional attribution notices cannot be construed
-          as modifying the License.
-
-      You may add Your own copyright statement to Your modifications and
-      may provide additional or different license terms and conditions
-      for use, reproduction, or distribution of Your modifications, or
-      for any such Derivative Works as a whole, provided Your use,
-      reproduction, and distribution of the Work otherwise complies with
-      the conditions stated in this License.
-
-   5. Submission of Contributions. Unless You explicitly state otherwise,
-      any Contribution intentionally submitted for inclusion in the Work
-      by You to the Licensor shall be under the terms and conditions of
-      this License, without any additional terms or conditions.
-      Notwithstanding the above, nothing herein shall supersede or modify
-      the terms of any separate license agreement you may have executed
-      with Licensor regarding such Contributions.
-
-   6. Trademarks. This License does not grant permission to use the trade
-      names, trademarks, service marks, or product names of the Licensor,
-      except as required for reasonable and customary use in describing the
-      origin of the Work and reproducing the content of the NOTICE file.
-
-   7. Disclaimer of Warranty. Unless required by applicable law or
-      agreed to in writing, Licensor provides the Work (and each
-      Contributor provides its Contributions) on an &quot;AS IS&quot; BASIS,
-      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
-      implied, including, without limitation, any warranties or conditions
-      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
-      PARTICULAR PURPOSE. You are solely responsible for determining the
-      appropriateness of using or redistributing the Work and assume any
-      risks associated with Your exercise of permissions under this License.
-
-   8. Limitation of Liability. In no event and under no legal theory,
-      whether in tort (including negligence), contract, or otherwise,
-      unless required by applicable law (such as deliberate and grossly
-      negligent acts) or agreed to in writing, shall any Contributor be
-      liable to You for damages, including any direct, indirect, special,
-      incidental, or consequential damages of any character arising as a
-      result of this License or out of the use or inability to use the
-      Work (including but not limited to damages for loss of goodwill,
-      work stoppage, computer failure or malfunction, or any and all
-      other commercial damages or losses), even if such Contributor
-      has been advised of the possibility of such damages.
-
-   9. Accepting Warranty or Additional Liability. While redistributing
-      the Work or Derivative Works thereof, You may choose to offer,
-      and charge a fee for, acceptance of support, warranty, indemnity,
-      or other liability obligations and/or rights consistent with this
-      License. However, in accepting such obligations, You may act only
-      on Your own behalf and on Your sole responsibility, not on behalf
-      of any other Contributor, and only if You agree to indemnify,
-      defend, and hold each Contributor harmless for any liability
-      incurred by, or claims asserted against, such Contributor by reason
-      of your accepting any such warranty or additional liability.
-
-   END OF TERMS AND CONDITIONS
-
-   APPENDIX: How to apply the Apache License to your work.
-
-      To apply the Apache License to your work, attach the following
-      boilerplate notice, with the fields enclosed by brackets &quot;[]&quot;
-      replaced with your own identifying information. (Don&apos;t include
-      the brackets!)  The text should be enclosed in the appropriate
-      comment syntax for the file format. We also recommend that a
-      file or class name and description of purpose be included on the
-      same &quot;printed page&quot; as the copyright notice for easier
-      identification within third-party archives.
-
-   Copyright [yyyy] [name of copyright owner]
-
-   Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
-   you may not use this file except in compliance with the License.
-   You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an &quot;AS IS&quot; BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
-   </pre>
-
-</body>
-</html>
\ No newline at end of file
diff --git a/eclipse/plugins/com.android.ide.eclipse.hierarchyviewer/about.ini b/eclipse/plugins/com.android.ide.eclipse.hierarchyviewer/about.ini
deleted file mode 100644
index 18f6ab0..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.hierarchyviewer/about.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-aboutText=%blurb
-featureImage=icons/hierarchyviewer-32.png
\ No newline at end of file
diff --git a/eclipse/plugins/com.android.ide.eclipse.hierarchyviewer/about.properties b/eclipse/plugins/com.android.ide.eclipse.hierarchyviewer/about.properties
deleted file mode 100755
index 207cbbe..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.hierarchyviewer/about.properties
+++ /dev/null
@@ -1,7 +0,0 @@
-blurb=Hierarchy Viewer\n\
-\n\
-Version\: {featureVersion}\n\
-\n\
-(c) Copyright 2010-2011 The Android Open Source Project.  All rights reserved.\n\
-Visit http://developer.android.com/sdk/eclipse-adt.html
-
diff --git a/eclipse/plugins/com.android.ide.eclipse.hierarchyviewer/build.properties b/eclipse/plugins/com.android.ide.eclipse.hierarchyviewer/build.properties
deleted file mode 100644
index f7e5d3f..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.hierarchyviewer/build.properties
+++ /dev/null
@@ -1,10 +0,0 @@
-source.. = src/
-output.. = bin/
-bin.includes = META-INF/,\
-               icons/,\
-               plugin.xml,\
-               .,\
-               libs/,\
-               about.html,\
-               about.ini,\
-               about.properties
diff --git a/eclipse/plugins/com.android.ide.eclipse.hierarchyviewer/icons/device.png b/eclipse/plugins/com.android.ide.eclipse.hierarchyviewer/icons/device.png
deleted file mode 100644
index 7dbbbb6..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.hierarchyviewer/icons/device.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.hierarchyviewer/icons/hierarchyviewer-16.png b/eclipse/plugins/com.android.ide.eclipse.hierarchyviewer/icons/hierarchyviewer-16.png
deleted file mode 100644
index 02073d4..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.hierarchyviewer/icons/hierarchyviewer-16.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.hierarchyviewer/icons/hierarchyviewer-32.png b/eclipse/plugins/com.android.ide.eclipse.hierarchyviewer/icons/hierarchyviewer-32.png
deleted file mode 100644
index fa21c24..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.hierarchyviewer/icons/hierarchyviewer-32.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.hierarchyviewer/icons/pixel-perfect.png b/eclipse/plugins/com.android.ide.eclipse.hierarchyviewer/icons/pixel-perfect.png
deleted file mode 100644
index 6e51701..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.hierarchyviewer/icons/pixel-perfect.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.hierarchyviewer/icons/tree-view.png b/eclipse/plugins/com.android.ide.eclipse.hierarchyviewer/icons/tree-view.png
deleted file mode 100644
index 8f01dda..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.hierarchyviewer/icons/tree-view.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.hierarchyviewer/plugin.xml b/eclipse/plugins/com.android.ide.eclipse.hierarchyviewer/plugin.xml
deleted file mode 100644
index a4c2994..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.hierarchyviewer/plugin.xml
+++ /dev/null
@@ -1,91 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.4"?>
-<plugin>
-   <extension
-         point="org.eclipse.ui.views">
-      <view
-            allowMultiple="false"
-            category="com.android.ide.eclipse.ddms.views.category"
-            class="com.android.ide.eclipse.hierarchyviewer.views.DeviceSelectorView"
-            icon="icons/device.png"
-            id="com.android.ide.eclipse.hierarchyviewer.views.DeviceSelectorView"
-            name="Windows">
-      </view>
-            <view
-            allowMultiple="false"
-            category="com.android.ide.eclipse.ddms.views.category"
-            class="com.android.ide.eclipse.hierarchyviewer.views.PixelPerfectView"
-            icon="icons/pixel-perfect.png"
-            id="com.android.ide.eclipse.hierarchyviewer.views.PixelPerfectView"
-            name="Pixel Perfect">
-      </view>
-      <view
-            allowMultiple="false"
-            category="com.android.ide.eclipse.ddms.views.category"
-            class="com.android.ide.eclipse.hierarchyviewer.views.PixelPerfectLoupeView"
-            icon="icons/pixel-perfect.png"
-            id="com.android.ide.eclipse.hierarchyviewer.views.PixelPerfectLoupeView"
-            name="Pixel Perfect Loupe">
-      </view>
-      <view
-            allowMultiple="false"
-            category="com.android.ide.eclipse.ddms.views.category"
-            class="com.android.ide.eclipse.hierarchyviewer.views.PixelPerfectTreeView"
-            icon="icons/pixel-perfect.png"
-            id="com.android.ide.eclipse.hierarchyviewer.views.PixelPerfectTreeView"
-            name="Pixel Perfect Tree">
-      </view>
-      <view
-            allowMultiple="false"
-            category="com.android.ide.eclipse.ddms.views.category"
-            class="com.android.ide.eclipse.hierarchyviewer.views.TreeViewView"
-            icon="icons/tree-view.png"
-            id="com.android.ide.eclipse.hierarchyviewer.views.TreeViewView"
-            name="Tree View">
-      </view>
-      <view
-            allowMultiple="false"
-            category="com.android.ide.eclipse.ddms.views.category"
-            class="com.android.ide.eclipse.hierarchyviewer.views.PropertyView"
-            icon="icons/tree-view.png"
-            id="com.android.ide.eclipse.hierarchyviewer.views.PropertyView"
-            name="View Properties">
-      </view>
-      <view
-            allowMultiple="false"
-            category="com.android.ide.eclipse.ddms.views.category"
-            class="com.android.ide.eclipse.hierarchyviewer.views.TreeOverviewView"
-            icon="icons/tree-view.png"
-            id="com.android.ide.eclipse.hierarchyviewer.views.TreeOverviewView"
-            name="Tree Overview">
-      </view>
-      <view
-            allowMultiple="false"
-            category="com.android.ide.eclipse.ddms.views.category"
-            class="com.android.ide.eclipse.hierarchyviewer.views.LayoutView"
-            icon="icons/tree-view.png"
-            id="com.android.ide.eclipse.hierarchyviewer.views.LayoutView"
-            name="Layout View">
-      </view>
-   </extension>
-   <extension
-         point="org.eclipse.ui.perspectives">
-      <perspective
-            class="com.android.ide.eclipse.hierarchyviewer.PixelPerfectPespective"
-            icon="icons/pixel-perfect.png"
-            id="com.android.ide.eclipse.hierarchyviewer.PixelPerfectPespective"
-            name="Pixel Perfect"/>
-      <perspective
-            class="com.android.ide.eclipse.hierarchyviewer.TreeViewPerspective"
-            icon="icons/hierarchyviewer-16.png"
-            id="com.android.ide.eclipse.hierarchyviewer.TreeViewPerspective"
-            name="Hierarchy View"/>
-   </extension>
-   <extension
-         point="org.eclipse.ui.perspectiveExtensions">
-      <perspectiveExtension targetID="org.eclipse.jdt.ui.JavaPerspective">
-         <perspectiveShortcut id="com.android.ide.eclipse.hierarchyviewer.PixelPerfectPespective"/>
-         <perspectiveShortcut id="com.android.ide.eclipse.hierarchyviewer.TreeViewPerspective"/>
-      </perspectiveExtension>
-   </extension>
-</plugin>
diff --git a/eclipse/plugins/com.android.ide.eclipse.hierarchyviewer/pom.xml b/eclipse/plugins/com.android.ide.eclipse.hierarchyviewer/pom.xml
deleted file mode 100644
index 133fe09..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.hierarchyviewer/pom.xml
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-    <modelVersion>4.0.0</modelVersion>
-
-    <version>24.3.3-SNAPSHOT</version>
-    <artifactId>com.android.ide.eclipse.hierarchyviewer</artifactId>
-    <packaging>eclipse-plugin</packaging>
-    <name>hierarchyviewer</name>
-
-    <parent>
-        <relativePath>../../pom.xml</relativePath>
-        <groupId>adt.group</groupId>
-        <artifactId>parent</artifactId>
-        <version>1.0.0-SNAPSHOT</version>
-    </parent>
-</project>
diff --git a/eclipse/plugins/com.android.ide.eclipse.hierarchyviewer/src/com/android/ide/eclipse/hierarchyviewer/HierarchyViewerPlugin.java b/eclipse/plugins/com.android.ide.eclipse.hierarchyviewer/src/com/android/ide/eclipse/hierarchyviewer/HierarchyViewerPlugin.java
deleted file mode 100644
index d4a64d0..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.hierarchyviewer/src/com/android/ide/eclipse/hierarchyviewer/HierarchyViewerPlugin.java
+++ /dev/null
@@ -1,200 +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.eclipse.hierarchyviewer;
-
-import com.android.ddmlib.AndroidDebugBridge;
-import com.android.ddmlib.AndroidDebugBridge.IDebugBridgeChangeListener;
-import com.android.ddmlib.Log;
-import com.android.ddmlib.Log.ILogOutput;
-import com.android.ddmlib.Log.LogLevel;
-import com.android.hierarchyviewerlib.HierarchyViewerDirector;
-
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.console.ConsolePlugin;
-import org.eclipse.ui.console.IConsole;
-import org.eclipse.ui.console.MessageConsole;
-import org.eclipse.ui.console.MessageConsoleStream;
-import org.eclipse.ui.plugin.AbstractUIPlugin;
-import org.osgi.framework.BundleContext;
-
-import java.util.Calendar;
-
-/**
- * The activator class controls the plug-in life cycle
- */
-public class HierarchyViewerPlugin extends AbstractUIPlugin {
-
-    public static final String PLUGIN_ID = "com.android.ide.eclipse.hierarchyviewer"; //$NON-NLS-1$
-
-    public static final String ADB_LOCATION = PLUGIN_ID + ".adb"; //$NON-NLS-1$
-
-    // The shared instance
-    private static HierarchyViewerPlugin sPlugin;
-
-    private Color mRedColor;
-
-    /**
-     * The constructor
-     */
-    public HierarchyViewerPlugin() {
-    }
-
-    @Override
-    public void start(BundleContext context) throws Exception {
-        super.start(context);
-        sPlugin = this;
-
-
-        // set the consoles.
-        final MessageConsole messageConsole = new MessageConsole("Hierarchy Viewer", null); //$NON-NLS-1$
-        ConsolePlugin.getDefault().getConsoleManager().addConsoles(new IConsole[] {
-            messageConsole
-        });
-
-        final MessageConsoleStream consoleStream = messageConsole.newMessageStream();
-        final MessageConsoleStream errorConsoleStream = messageConsole.newMessageStream();
-        mRedColor = new Color(Display.getDefault(), 0xFF, 0x00, 0x00);
-
-        // because this can be run, in some cases, by a non UI thread, and
-        // because
-        // changing the console properties update the UI, we need to make this
-        // change
-        // in the UI thread.
-        Display.getDefault().asyncExec(new Runnable() {
-            @Override
-            public void run() {
-                errorConsoleStream.setColor(mRedColor);
-            }
-        });
-
-        // set up the ddms log to use the ddms console.
-        Log.setLogOutput(new ILogOutput() {
-            @Override
-            public void printLog(LogLevel logLevel, String tag, String message) {
-                if (logLevel.getPriority() >= LogLevel.ERROR.getPriority()) {
-                    printToStream(errorConsoleStream, tag, message);
-                    ConsolePlugin.getDefault().getConsoleManager().showConsoleView(messageConsole);
-                } else {
-                    printToStream(consoleStream, tag, message);
-                }
-            }
-
-            @Override
-            public void printAndPromptLog(final LogLevel logLevel, final String tag,
-                    final String message) {
-                printLog(logLevel, tag, message);
-                // dialog box only run in UI thread..
-                Display.getDefault().asyncExec(new Runnable() {
-                    @Override
-                    public void run() {
-                        Shell shell = Display.getDefault().getActiveShell();
-                        if (logLevel == LogLevel.ERROR) {
-                            MessageDialog.openError(shell, tag, message);
-                        } else {
-                            MessageDialog.openWarning(shell, tag, message);
-                        }
-                    }
-                });
-            }
-
-        });
-
-        final HierarchyViewerDirector director = HierarchyViewerPluginDirector.createDirector();
-        director.startListenForDevices();
-
-        // make the director receive change in ADB.
-        AndroidDebugBridge.addDebugBridgeChangeListener(new IDebugBridgeChangeListener() {
-            @Override
-            public void bridgeChanged(AndroidDebugBridge bridge) {
-                director.acquireBridge(bridge);
-            }
-        });
-
-        // get the current ADB if any
-        director.acquireBridge(AndroidDebugBridge.getBridge());
-
-        // populate the UI with current devices (if any) in a thread
-        new Thread() {
-            @Override
-            public void run() {
-                director.populateDeviceSelectionModel();
-            }
-        }.start();
-    }
-
-    /*
-     * (non-Javadoc)
-     * @see
-     * org.eclipse.ui.plugin.AbstractUIPlugin#stop(org.osgi.framework.BundleContext
-     * )
-     */
-    @Override
-    public void stop(BundleContext context) throws Exception {
-        sPlugin = null;
-        super.stop(context);
-
-        mRedColor.dispose();
-
-        HierarchyViewerDirector director = HierarchyViewerDirector.getDirector();
-        director.stopListenForDevices();
-        director.stopDebugBridge();
-        director.terminate();
-    }
-
-    /**
-     * Returns the shared instance
-     *
-     * @return the shared instance
-     */
-    public static HierarchyViewerPlugin getPlugin() {
-        return sPlugin;
-    }
-
-    /**
-     * Prints a message, associated with a project to the specified stream
-     *
-     * @param stream The stream to write to
-     * @param tag The tag associated to the message. Can be null
-     * @param message The message to print.
-     */
-    private static synchronized void printToStream(MessageConsoleStream stream, String tag,
-            String message) {
-        String dateTag = getMessageTag(tag);
-
-        stream.print(dateTag);
-        stream.println(message);
-    }
-
-    /**
-     * Creates a string containing the current date/time, and the tag
-     *
-     * @param tag The tag associated to the message. Can be null
-     * @return The dateTag
-     */
-    private static String getMessageTag(String tag) {
-        Calendar c = Calendar.getInstance();
-
-        if (tag == null) {
-            return String.format("[%1$tF %1$tT]", c); //$NON-NLS-1$
-        }
-
-        return String.format("[%1$tF %1$tT - %2$s]", c, tag); //$NON-NLS-1$
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.hierarchyviewer/src/com/android/ide/eclipse/hierarchyviewer/HierarchyViewerPluginDirector.java b/eclipse/plugins/com.android.ide.eclipse.hierarchyviewer/src/com/android/ide/eclipse/hierarchyviewer/HierarchyViewerPluginDirector.java
deleted file mode 100644
index 597f7a4..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.hierarchyviewer/src/com/android/ide/eclipse/hierarchyviewer/HierarchyViewerPluginDirector.java
+++ /dev/null
@@ -1,122 +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.eclipse.hierarchyviewer;
-
-import com.android.hierarchyviewerlib.HierarchyViewerDirector;
-import com.android.hierarchyviewerlib.device.IHvDevice;
-import com.android.hierarchyviewerlib.models.Window;
-import com.android.ide.eclipse.hierarchyviewer.views.PixelPerfectTreeView;
-import com.android.ide.eclipse.hierarchyviewer.views.PropertyView;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.core.runtime.jobs.ISchedulingRule;
-import org.eclipse.core.runtime.jobs.Job;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PartInitException;
-
-public class HierarchyViewerPluginDirector extends HierarchyViewerDirector {
-
-    public static HierarchyViewerDirector createDirector() {
-        return sDirector = new HierarchyViewerPluginDirector();
-    }
-
-    @Override
-    public void executeInBackground(final String taskName, final Runnable task) {
-        Job job = new Job(taskName) {
-            @Override
-            protected IStatus run(IProgressMonitor monitor) {
-                task.run();
-                return Status.OK_STATUS;
-            }
-        };
-        job.setPriority(Job.SHORT);
-        job.setRule(mSchedulingRule);
-        job.schedule();
-    }
-
-    private ISchedulingRule mSchedulingRule = new ISchedulingRule() {
-        @Override
-        public boolean contains(ISchedulingRule rule) {
-            return rule == this;
-        }
-
-        @Override
-        public boolean isConflicting(ISchedulingRule rule) {
-            return rule == this;
-        }
-
-    };
-
-    @Override
-    public String getAdbLocation() {
-        return HierarchyViewerPlugin.getPlugin().getPreferenceStore().getString(
-                HierarchyViewerPlugin.ADB_LOCATION);
-    }
-
-    @Override
-    public void loadViewTreeData(Window window) {
-        super.loadViewTreeData(window);
-
-        // The windows tab hides the property tab, so let's bring the property
-        // tab
-        // forward.
-
-        IWorkbenchWindow[] windows =
-                HierarchyViewerPlugin.getPlugin().getWorkbench().getWorkbenchWindows();
-        for (IWorkbenchWindow currentWindow : windows) {
-            IWorkbenchPage page = currentWindow.getActivePage();
-            if (page.getPerspective().getId().equals(TreeViewPerspective.ID)) {
-                try {
-                    IWorkbenchPart part = page.findView(PropertyView.ID);
-                    if (part != null) {
-                        page.showView(PropertyView.ID);
-                    }
-                } catch (PartInitException e) {
-
-                }
-            }
-        }
-    }
-
-    @Override
-    public void loadPixelPerfectData(IHvDevice device) {
-        super.loadPixelPerfectData(device);
-
-        // The windows tab hides the tree tab, so let's bring the tree tab
-        // forward.
-
-        IWorkbenchWindow[] windows =
-                HierarchyViewerPlugin.getPlugin().getWorkbench().getWorkbenchWindows();
-        for (IWorkbenchWindow window : windows) {
-            IWorkbenchPage page = window.getActivePage();
-            if (page.getPerspective().getId().equals(PixelPerfectPespective.ID)) {
-                try {
-                    IWorkbenchPart part = page.findView(PixelPerfectTreeView.ID);
-                    if (part != null) {
-                        page.showView(PixelPerfectTreeView.ID);
-                    }
-                } catch (PartInitException e) {
-
-                }
-            }
-        }
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.hierarchyviewer/src/com/android/ide/eclipse/hierarchyviewer/PixelPerfectPespective.java b/eclipse/plugins/com.android.ide.eclipse.hierarchyviewer/src/com/android/ide/eclipse/hierarchyviewer/PixelPerfectPespective.java
deleted file mode 100644
index 973b30e..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.hierarchyviewer/src/com/android/ide/eclipse/hierarchyviewer/PixelPerfectPespective.java
+++ /dev/null
@@ -1,62 +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.eclipse.hierarchyviewer;
-
-import com.android.ide.eclipse.ddms.Perspective;
-import com.android.ide.eclipse.hierarchyviewer.views.DeviceSelectorView;
-import com.android.ide.eclipse.hierarchyviewer.views.PixelPerfectLoupeView;
-import com.android.ide.eclipse.hierarchyviewer.views.PixelPerfectTreeView;
-import com.android.ide.eclipse.hierarchyviewer.views.PixelPerfectView;
-
-import org.eclipse.ui.IFolderLayout;
-import org.eclipse.ui.IPageLayout;
-import org.eclipse.ui.IPerspectiveFactory;
-
-public class PixelPerfectPespective implements IPerspectiveFactory {
-
-    public static final String ID =
-            "com.android.ide.eclipse.hierarchyviewer.PixelPerfectPespective"; //$NON-NLS-1$
-
-    @Override
-    public void createInitialLayout(IPageLayout layout) {
-        layout.setEditorAreaVisible(false);
-
-        String editorArea = layout.getEditorArea();
-        IFolderLayout folder;
-
-        folder = layout.createFolder("tree", IPageLayout.LEFT, 0.25f, editorArea); //$NON-NLS-1$
-        folder.addView(DeviceSelectorView.ID);
-        folder.addView(PixelPerfectTreeView.ID);
-
-        folder = layout.createFolder("overview", IPageLayout.RIGHT, 0.4f, editorArea); //$NON-NLS-1$
-        folder.addView(PixelPerfectView.ID);
-
-        folder = layout.createFolder("main", IPageLayout.RIGHT, 0.35f, editorArea); //$NON-NLS-1$
-        folder.addView(PixelPerfectLoupeView.ID);
-
-
-        layout.addShowViewShortcut(DeviceSelectorView.ID);
-        layout.addShowViewShortcut(PixelPerfectTreeView.ID);
-        layout.addShowViewShortcut(PixelPerfectLoupeView.ID);
-        layout.addShowViewShortcut(PixelPerfectView.ID);
-
-        layout.addPerspectiveShortcut("org.eclipse.jdt.ui.JavaPerspective"); //$NON-NLS-1$
-        layout.addPerspectiveShortcut(TreeViewPerspective.ID);
-        layout.addPerspectiveShortcut(Perspective.ID);
-    }
-
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.hierarchyviewer/src/com/android/ide/eclipse/hierarchyviewer/TreeViewPerspective.java b/eclipse/plugins/com.android.ide.eclipse.hierarchyviewer/src/com/android/ide/eclipse/hierarchyviewer/TreeViewPerspective.java
deleted file mode 100644
index b6198d8..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.hierarchyviewer/src/com/android/ide/eclipse/hierarchyviewer/TreeViewPerspective.java
+++ /dev/null
@@ -1,66 +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.eclipse.hierarchyviewer;
-
-import com.android.ide.eclipse.ddms.Perspective;
-import com.android.ide.eclipse.hierarchyviewer.views.DeviceSelectorView;
-import com.android.ide.eclipse.hierarchyviewer.views.LayoutView;
-import com.android.ide.eclipse.hierarchyviewer.views.PropertyView;
-import com.android.ide.eclipse.hierarchyviewer.views.TreeOverviewView;
-import com.android.ide.eclipse.hierarchyviewer.views.TreeViewView;
-
-import org.eclipse.ui.IFolderLayout;
-import org.eclipse.ui.IPageLayout;
-import org.eclipse.ui.IPerspectiveFactory;
-
-public class TreeViewPerspective implements IPerspectiveFactory {
-
-    public static final String ID = "com.android.ide.eclipse.hierarchyviewer.TreeViewPerspective"; //$NON-NLS-1$
-
-    @Override
-    public void createInitialLayout(IPageLayout layout) {
-        layout.setEditorAreaVisible(false);
-
-        String editorArea = layout.getEditorArea();
-        IFolderLayout folder;
-
-        folder = layout.createFolder("properties", IPageLayout.LEFT, 0.10f, editorArea); //$NON-NLS-1$
-        folder.addView(DeviceSelectorView.ID);
-        folder.addView(PropertyView.ID);
-
-        folder = layout.createFolder("main", IPageLayout.RIGHT, 0.24f, "properties"); //$NON-NLS-1$ //$NON-NLS-2$
-        folder.addView(TreeViewView.ID);
-
-        folder = layout.createFolder("panel-top", IPageLayout.RIGHT, 0.7f, "main"); //$NON-NLS-1$ //$NON-NLS-2$
-        folder.addView(TreeOverviewView.ID);
-
-
-        folder = layout.createFolder("panel-bottom", IPageLayout.BOTTOM, 0.5f, "panel-top"); //$NON-NLS-1$ //$NON-NLS-2$
-        folder.addView(LayoutView.ID);
-
-        layout.addShowViewShortcut(DeviceSelectorView.ID);
-        layout.addShowViewShortcut(PropertyView.ID);
-        layout.addShowViewShortcut(TreeOverviewView.ID);
-        layout.addShowViewShortcut(LayoutView.ID);
-        layout.addShowViewShortcut(TreeViewView.ID);
-
-        layout.addPerspectiveShortcut("org.eclipse.jdt.ui.JavaPerspective"); //$NON-NLS-1$
-        layout.addPerspectiveShortcut(PixelPerfectPespective.ID);
-        layout.addPerspectiveShortcut(Perspective.ID);
-    }
-
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.hierarchyviewer/src/com/android/ide/eclipse/hierarchyviewer/views/DeviceSelectorView.java b/eclipse/plugins/com.android.ide.eclipse.hierarchyviewer/src/com/android/ide/eclipse/hierarchyviewer/views/DeviceSelectorView.java
deleted file mode 100644
index 1905cde..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.hierarchyviewer/src/com/android/ide/eclipse/hierarchyviewer/views/DeviceSelectorView.java
+++ /dev/null
@@ -1,119 +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.eclipse.hierarchyviewer.views;
-
-import com.android.hierarchyviewerlib.actions.InspectScreenshotAction;
-import com.android.hierarchyviewerlib.actions.LoadViewHierarchyAction;
-import com.android.hierarchyviewerlib.actions.RefreshWindowsAction;
-import com.android.hierarchyviewerlib.ui.DeviceSelector;
-import com.android.ide.eclipse.hierarchyviewer.PixelPerfectPespective;
-import com.android.ide.eclipse.hierarchyviewer.TreeViewPerspective;
-
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.action.IToolBarManager;
-import org.eclipse.swt.layout.FillLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.IActionBars;
-import org.eclipse.ui.IPerspectiveDescriptor;
-import org.eclipse.ui.IPerspectiveListener;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.part.ViewPart;
-
-public class DeviceSelectorView extends ViewPart implements IPerspectiveListener {
-
-    public static final String ID =
-            "com.android.ide.eclipse.hierarchyviewer.views.DeviceSelectorView"; //$NON-NLS-1$
-
-    private DeviceSelector mDeviceSelector;
-
-    @Override
-    public void createPartControl(Composite parent) {
-        parent.setLayout(new FillLayout());
-
-
-        IPerspectiveDescriptor perspective = getViewSite().getPage().getPerspective();
-        boolean doTreeViewStuff = true;
-        boolean doPixelPerfectStuff = true;
-        if (perspective.getId().equals(PixelPerfectPespective.ID)) {
-            doTreeViewStuff = false;
-        } else if (perspective.getId().equals(TreeViewPerspective.ID)) {
-            doPixelPerfectStuff = false;
-        }
-        mDeviceSelector = new DeviceSelector(parent, doTreeViewStuff, doPixelPerfectStuff);
-
-        placeActions(doTreeViewStuff, doPixelPerfectStuff);
-
-        getViewSite().getWorkbenchWindow().addPerspectiveListener(this);
-    }
-
-    @Override
-    public void dispose() {
-        super.dispose();
-        getViewSite().getWorkbenchWindow().removePerspectiveListener(this);
-    }
-
-    private void placeActions(boolean doTreeViewStuff, boolean doPixelPerfectStuff) {
-        IActionBars actionBars = getViewSite().getActionBars();
-
-        IMenuManager mm = actionBars.getMenuManager();
-        mm.removeAll();
-        mm.add(RefreshWindowsAction.getAction());
-
-        IToolBarManager tm = actionBars.getToolBarManager();
-        tm.removeAll();
-        tm.add(RefreshWindowsAction.getAction());
-
-        if (doTreeViewStuff) {
-            mm.add(LoadViewHierarchyAction.getAction());
-            tm.add(LoadViewHierarchyAction.getAction());
-        }
-        if (doPixelPerfectStuff) {
-            mm.add(InspectScreenshotAction.getAction());
-            tm.add(InspectScreenshotAction.getAction());
-        }
-
-        mm.updateAll(true);
-        tm.update(true);
-        actionBars.updateActionBars();
-    }
-
-    @Override
-    public void setFocus() {
-        mDeviceSelector.setFocus();
-    }
-
-    @Override
-    public void perspectiveActivated(IWorkbenchPage page, IPerspectiveDescriptor perspective) {
-        if (perspective.getId().equals(PixelPerfectPespective.ID)) {
-            mDeviceSelector.setMode(false, true);
-            placeActions(false, true);
-        } else if (perspective.getId().equals(TreeViewPerspective.ID)) {
-            mDeviceSelector.setMode(true, false);
-            placeActions(true, false);
-        } else {
-            mDeviceSelector.setMode(true, true);
-            placeActions(true, true);
-        }
-    }
-
-    @Override
-    public void perspectiveChanged(IWorkbenchPage page, IPerspectiveDescriptor perspective,
-            String changeId) {
-        // pass
-    }
-
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.hierarchyviewer/src/com/android/ide/eclipse/hierarchyviewer/views/LayoutView.java b/eclipse/plugins/com.android.ide.eclipse.hierarchyviewer/src/com/android/ide/eclipse/hierarchyviewer/views/LayoutView.java
deleted file mode 100644
index 83cf38b..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.hierarchyviewer/src/com/android/ide/eclipse/hierarchyviewer/views/LayoutView.java
+++ /dev/null
@@ -1,160 +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.eclipse.hierarchyviewer.views;
-
-import com.android.ddmuilib.ImageLoader;
-import com.android.hierarchyviewerlib.HierarchyViewerDirector;
-import com.android.hierarchyviewerlib.models.TreeViewModel;
-import com.android.hierarchyviewerlib.models.TreeViewModel.ITreeChangeListener;
-import com.android.hierarchyviewerlib.ui.LayoutViewer;
-
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.action.IToolBarManager;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.layout.FillLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.ui.IActionBars;
-import org.eclipse.ui.part.ViewPart;
-
-public class LayoutView extends ViewPart implements ITreeChangeListener {
-
-    public static final String ID = "com.android.ide.eclipse.hierarchyviewer.views.LayoutView"; //$NON-NLS-1$
-
-    private LayoutViewer mLayoutViewer;
-
-    private Image mOnBlack;
-
-    private Image mOnWhite;
-
-    private Action mShowExtrasAction = new Action("Show &Extras", Action.AS_CHECK_BOX) {
-        @Override
-        public void run() {
-            mLayoutViewer.setShowExtras(isChecked());
-        }
-    };
-
-    private Action mLoadAllViewsAction = new Action("Load All &Views") {
-        @Override
-        public void run() {
-            HierarchyViewerDirector.getDirector().loadAllViews();
-            mShowExtrasAction.setChecked(true);
-            mLayoutViewer.setShowExtras(true);
-        }
-    };
-
-    private Action mOnBlackWhiteAction = new Action("Change Background &Color") {
-        @Override
-        public void run() {
-            boolean newValue = !mLayoutViewer.getOnBlack();
-            mLayoutViewer.setOnBlack(newValue);
-            if (newValue) {
-                setImageDescriptor(ImageDescriptor.createFromImage(mOnWhite));
-            } else {
-                setImageDescriptor(ImageDescriptor.createFromImage(mOnBlack));
-            }
-        }
-    };
-
-    @Override
-    public void createPartControl(Composite parent) {
-        mShowExtrasAction.setAccelerator(SWT.MOD1 + 'E');
-        ImageLoader imageLoader = ImageLoader.getLoader(HierarchyViewerDirector.class);
-        Image image = imageLoader.loadImage("show-extras.png", Display.getDefault()); //$NON-NLS-1$
-        mShowExtrasAction.setImageDescriptor(ImageDescriptor.createFromImage(image));
-        mShowExtrasAction.setToolTipText("Show images");
-        mShowExtrasAction.setEnabled(TreeViewModel.getModel().getTree() != null);
-
-        mOnWhite = imageLoader.loadImage("on-white.png", Display.getDefault()); //$NON-NLS-1$
-        mOnBlack = imageLoader.loadImage("on-black.png", Display.getDefault()); //$NON-NLS-1$
-
-        mOnBlackWhiteAction.setAccelerator(SWT.MOD1 + 'C');
-        mOnBlackWhiteAction.setImageDescriptor(ImageDescriptor.createFromImage(mOnWhite));
-        mOnBlackWhiteAction.setToolTipText("Change layout viewer background color");
-
-        mLoadAllViewsAction.setAccelerator(SWT.MOD1 + 'V');
-        image = imageLoader.loadImage("load-all-views.png", Display.getDefault()); //$NON-NLS-1$
-        mLoadAllViewsAction.setImageDescriptor(ImageDescriptor.createFromImage(image));
-        mLoadAllViewsAction.setToolTipText("Load all view images");
-        mLoadAllViewsAction.setEnabled(TreeViewModel.getModel().getTree() != null);
-
-        parent.setLayout(new FillLayout());
-
-        mLayoutViewer = new LayoutViewer(parent);
-
-        placeActions();
-
-        TreeViewModel.getModel().addTreeChangeListener(this);
-    }
-
-    public void placeActions() {
-        IActionBars actionBars = getViewSite().getActionBars();
-
-        IMenuManager mm = actionBars.getMenuManager();
-        mm.removeAll();
-        mm.add(mOnBlackWhiteAction);
-        mm.add(mShowExtrasAction);
-        mm.add(mLoadAllViewsAction);
-
-        IToolBarManager tm = actionBars.getToolBarManager();
-        tm.removeAll();
-        tm.add(mOnBlackWhiteAction);
-        tm.add(mShowExtrasAction);
-        tm.add(mLoadAllViewsAction);
-    }
-
-    @Override
-    public void dispose() {
-        super.dispose();
-        TreeViewModel.getModel().removeTreeChangeListener(this);
-    }
-
-    @Override
-    public void setFocus() {
-        mLayoutViewer.setFocus();
-    }
-
-    @Override
-    public void selectionChanged() {
-        // pass
-    }
-
-    @Override
-    public void treeChanged() {
-        Display.getDefault().syncExec(new Runnable() {
-            @Override
-            public void run() {
-                mLoadAllViewsAction.setEnabled(TreeViewModel.getModel().getTree() != null);
-                mShowExtrasAction.setEnabled(TreeViewModel.getModel().getTree() != null);
-            }
-        });
-    }
-
-    @Override
-    public void viewportChanged() {
-        // pass
-    }
-
-    @Override
-    public void zoomChanged() {
-        // pass
-    }
-
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.hierarchyviewer/src/com/android/ide/eclipse/hierarchyviewer/views/PixelPerfectLoupeView.java b/eclipse/plugins/com.android.ide.eclipse.hierarchyviewer/src/com/android/ide/eclipse/hierarchyviewer/views/PixelPerfectLoupeView.java
deleted file mode 100644
index 93ad598..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.hierarchyviewer/src/com/android/ide/eclipse/hierarchyviewer/views/PixelPerfectLoupeView.java
+++ /dev/null
@@ -1,171 +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.eclipse.hierarchyviewer.views;
-
-import com.android.ddmuilib.ImageLoader;
-import com.android.hierarchyviewerlib.HierarchyViewerDirector;
-import com.android.hierarchyviewerlib.actions.PixelPerfectAutoRefreshAction;
-import com.android.hierarchyviewerlib.models.PixelPerfectModel;
-import com.android.hierarchyviewerlib.models.PixelPerfectModel.IImageChangeListener;
-import com.android.hierarchyviewerlib.ui.PixelPerfectControls;
-import com.android.hierarchyviewerlib.ui.PixelPerfectLoupe;
-import com.android.hierarchyviewerlib.ui.PixelPerfectPixelPanel;
-
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.action.IToolBarManager;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.ui.IActionBars;
-import org.eclipse.ui.part.ViewPart;
-
-public class PixelPerfectLoupeView extends ViewPart implements IImageChangeListener {
-
-    public static final String ID =
-            "com.android.ide.eclipse.hierarchyviewer.views.PixelPerfectLoupeView"; //$NON-NLS-1$
-
-    private PixelPerfectLoupe mPixelPerfectLoupe;
-
-    private Action mShowInLoupeAction = new Action("&Show Overlay", Action.AS_CHECK_BOX) {
-        @Override
-        public void run() {
-            mPixelPerfectLoupe.setShowOverlay(isChecked());
-        }
-    };
-    @Override
-    public void createPartControl(Composite parent) {
-        mShowInLoupeAction.setAccelerator(SWT.MOD1 + 'S');
-        ImageLoader imageLoader = ImageLoader.getLoader(HierarchyViewerDirector.class);
-        Image image = imageLoader.loadImage("show-overlay.png", Display.getDefault()); //$NON-NLS-1$
-        mShowInLoupeAction.setImageDescriptor(ImageDescriptor.createFromImage(image));
-        mShowInLoupeAction.setToolTipText("Show the overlay in the loupe view");
-        mShowInLoupeAction.setEnabled(PixelPerfectModel.getModel().getOverlayImage() != null);
-        PixelPerfectModel.getModel().addImageChangeListener(this);
-
-        GridLayout loupeLayout = new GridLayout();
-        loupeLayout.marginWidth = loupeLayout.marginHeight = 0;
-        loupeLayout.horizontalSpacing = loupeLayout.verticalSpacing = 0;
-        parent.setLayout(loupeLayout);
-
-        Composite pixelPerfectLoupeBorder = new Composite(parent, SWT.BORDER);
-        pixelPerfectLoupeBorder.setLayoutData(new GridData(GridData.FILL_BOTH));
-        GridLayout pixelPerfectLoupeBorderGridLayout = new GridLayout();
-        pixelPerfectLoupeBorderGridLayout.marginWidth =
-                pixelPerfectLoupeBorderGridLayout.marginHeight = 0;
-        pixelPerfectLoupeBorderGridLayout.horizontalSpacing =
-                pixelPerfectLoupeBorderGridLayout.verticalSpacing = 0;
-        pixelPerfectLoupeBorder.setLayout(pixelPerfectLoupeBorderGridLayout);
-
-        mPixelPerfectLoupe = new PixelPerfectLoupe(pixelPerfectLoupeBorder);
-        mPixelPerfectLoupe.setLayoutData(new GridData(GridData.FILL_BOTH));
-
-        PixelPerfectPixelPanel pixelPerfectPixelPanel =
-                new PixelPerfectPixelPanel(pixelPerfectLoupeBorder);
-        pixelPerfectPixelPanel.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-
-        // https://code.google.com/p/android/issues/detail?id=69199
-        // Disabled until accessibility issues are fixed
-        // PixelPerfectControls pixelPerfectControls =
-        //         new PixelPerfectControls(parent);
-        // pixelPerfectControls.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-
-        placeActions();
-    }
-
-    private void placeActions() {
-        IActionBars actionBars = getViewSite().getActionBars();
-
-        IMenuManager mm = actionBars.getMenuManager();
-        mm.removeAll();
-        mm.add(PixelPerfectAutoRefreshAction.getAction());
-        mm.add(mShowInLoupeAction);
-
-        IToolBarManager tm = actionBars.getToolBarManager();
-        tm.removeAll();
-        tm.add(PixelPerfectAutoRefreshAction.getAction());
-        tm.add(mShowInLoupeAction);
-    }
-
-    @Override
-    public void dispose() {
-        super.dispose();
-        PixelPerfectModel.getModel().removeImageChangeListener(this);
-    }
-
-    @Override
-    public void setFocus() {
-        mPixelPerfectLoupe.setFocus();
-    }
-
-    @Override
-    public void crosshairMoved() {
-        // pass
-    }
-
-    @Override
-    public void treeChanged() {
-        // pass
-    }
-
-    @Override
-    public void imageChanged() {
-        // pass
-    }
-
-    @Override
-    public void imageLoaded() {
-        Display.getDefault().syncExec(new Runnable() {
-            @Override
-            public void run() {
-                Image overlayImage = PixelPerfectModel.getModel().getOverlayImage();
-                mShowInLoupeAction.setEnabled(overlayImage != null);
-            }
-        });
-    }
-
-    @Override
-    public void overlayChanged() {
-        Display.getDefault().syncExec(new Runnable() {
-            @Override
-            public void run() {
-                mShowInLoupeAction
-                        .setEnabled(PixelPerfectModel.getModel().getOverlayImage() != null);
-            }
-        });
-    }
-
-    @Override
-    public void overlayTransparencyChanged() {
-        // pass
-    }
-
-    @Override
-    public void selectionChanged() {
-        // pass
-    }
-
-    @Override
-    public void zoomChanged() {
-        // pass
-    }
-
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.hierarchyviewer/src/com/android/ide/eclipse/hierarchyviewer/views/PixelPerfectTreeView.java b/eclipse/plugins/com.android.ide.eclipse.hierarchyviewer/src/com/android/ide/eclipse/hierarchyviewer/views/PixelPerfectTreeView.java
deleted file mode 100644
index f3591f7..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.hierarchyviewer/src/com/android/ide/eclipse/hierarchyviewer/views/PixelPerfectTreeView.java
+++ /dev/null
@@ -1,61 +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.eclipse.hierarchyviewer.views;
-
-import com.android.hierarchyviewerlib.actions.RefreshPixelPerfectTreeAction;
-import com.android.hierarchyviewerlib.ui.PixelPerfectTree;
-
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.action.IToolBarManager;
-import org.eclipse.swt.layout.FillLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.IActionBars;
-import org.eclipse.ui.part.ViewPart;
-
-public class PixelPerfectTreeView extends ViewPart {
-
-    public static final String ID =
-            "com.android.ide.eclipse.hierarchyviewer.views.PixelPerfectTreeView"; //$NON-NLS-1$
-
-    private PixelPerfectTree mPixelPerfectTree;
-
-    @Override
-    public void createPartControl(Composite parent) {
-        parent.setLayout(new FillLayout());
-        mPixelPerfectTree = new PixelPerfectTree(parent);
-
-        placeActions();
-    }
-
-    private void placeActions() {
-        IActionBars actionBars = getViewSite().getActionBars();
-
-        IMenuManager mm = actionBars.getMenuManager();
-        mm.removeAll();
-        mm.add(RefreshPixelPerfectTreeAction.getAction());
-
-        IToolBarManager tm = actionBars.getToolBarManager();
-        tm.removeAll();
-        tm.add(RefreshPixelPerfectTreeAction.getAction());
-    }
-
-    @Override
-    public void setFocus() {
-        mPixelPerfectTree.setFocus();
-    }
-
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.hierarchyviewer/src/com/android/ide/eclipse/hierarchyviewer/views/PixelPerfectView.java b/eclipse/plugins/com.android.ide.eclipse.hierarchyviewer/src/com/android/ide/eclipse/hierarchyviewer/views/PixelPerfectView.java
deleted file mode 100644
index 943a6c8..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.hierarchyviewer/src/com/android/ide/eclipse/hierarchyviewer/views/PixelPerfectView.java
+++ /dev/null
@@ -1,67 +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.eclipse.hierarchyviewer.views;
-
-import com.android.hierarchyviewerlib.actions.LoadOverlayAction;
-import com.android.hierarchyviewerlib.actions.RefreshPixelPerfectAction;
-import com.android.hierarchyviewerlib.actions.SavePixelPerfectAction;
-import com.android.hierarchyviewerlib.ui.PixelPerfect;
-
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.action.IToolBarManager;
-import org.eclipse.swt.layout.FillLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.IActionBars;
-import org.eclipse.ui.part.ViewPart;
-
-public class PixelPerfectView extends ViewPart {
-
-    public static final String ID =
-            "com.android.ide.eclipse.hierarchyviewer.views.PixelPerfectView"; //$NON-NLS-1$
-
-    private PixelPerfect mPixelPerfect;
-
-    @Override
-    public void createPartControl(Composite parent) {
-        parent.setLayout(new FillLayout());
-        mPixelPerfect = new PixelPerfect(parent);
-
-        placeActions();
-    }
-
-    private void placeActions() {
-        IActionBars actionBars = getViewSite().getActionBars();
-
-        IMenuManager mm = actionBars.getMenuManager();
-        mm.removeAll();
-        mm.add(SavePixelPerfectAction.getAction(getSite().getShell()));
-        mm.add(RefreshPixelPerfectAction.getAction());
-        mm.add(LoadOverlayAction.getAction(getSite().getShell()));
-
-        IToolBarManager tm = actionBars.getToolBarManager();
-        tm.removeAll();
-        tm.add(SavePixelPerfectAction.getAction(getSite().getShell()));
-        tm.add(RefreshPixelPerfectAction.getAction());
-        tm.add(LoadOverlayAction.getAction(getSite().getShell()));
-    }
-
-    @Override
-    public void setFocus() {
-        mPixelPerfect.setFocus();
-    }
-
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.hierarchyviewer/src/com/android/ide/eclipse/hierarchyviewer/views/PropertyView.java b/eclipse/plugins/com.android.ide.eclipse.hierarchyviewer/src/com/android/ide/eclipse/hierarchyviewer/views/PropertyView.java
deleted file mode 100644
index 74f50fd..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.hierarchyviewer/src/com/android/ide/eclipse/hierarchyviewer/views/PropertyView.java
+++ /dev/null
@@ -1,43 +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.eclipse.hierarchyviewer.views;
-
-import com.android.hierarchyviewerlib.ui.PropertyViewer;
-
-import org.eclipse.swt.layout.FillLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.part.ViewPart;
-
-public class PropertyView extends ViewPart {
-
-    public static final String ID = "com.android.ide.eclipse.hierarchyviewer.views.PropertyView"; //$NON-NLS-1$
-
-    private PropertyViewer mPropertyViewer;
-
-    @Override
-    public void createPartControl(Composite parent) {
-        parent.setLayout(new FillLayout());
-
-        mPropertyViewer = new PropertyViewer(parent);
-    }
-
-    @Override
-    public void setFocus() {
-        mPropertyViewer.setFocus();
-    }
-
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.hierarchyviewer/src/com/android/ide/eclipse/hierarchyviewer/views/TreeOverviewView.java b/eclipse/plugins/com.android.ide.eclipse.hierarchyviewer/src/com/android/ide/eclipse/hierarchyviewer/views/TreeOverviewView.java
deleted file mode 100644
index e18771b..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.hierarchyviewer/src/com/android/ide/eclipse/hierarchyviewer/views/TreeOverviewView.java
+++ /dev/null
@@ -1,43 +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.eclipse.hierarchyviewer.views;
-
-import com.android.hierarchyviewerlib.ui.TreeViewOverview;
-
-import org.eclipse.swt.layout.FillLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.part.ViewPart;
-
-public class TreeOverviewView extends ViewPart {
-
-    public static final String ID =
-            "com.android.ide.eclipse.hierarchyviewer.views.TreeOverviewView"; //$NON-NLS-1$
-
-    private TreeViewOverview mTreeViewOverview;
-    @Override
-    public void createPartControl(Composite parent) {
-        parent.setLayout(new FillLayout());
-
-        mTreeViewOverview = new TreeViewOverview(parent);
-    }
-
-    @Override
-    public void setFocus() {
-        mTreeViewOverview.setFocus();
-    }
-
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.hierarchyviewer/src/com/android/ide/eclipse/hierarchyviewer/views/TreeViewView.java b/eclipse/plugins/com.android.ide.eclipse.hierarchyviewer/src/com/android/ide/eclipse/hierarchyviewer/views/TreeViewView.java
deleted file mode 100644
index 98bd909..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.hierarchyviewer/src/com/android/ide/eclipse/hierarchyviewer/views/TreeViewView.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.ide.eclipse.hierarchyviewer.views;
-
-import com.android.hierarchyviewerlib.actions.CapturePSDAction;
-import com.android.hierarchyviewerlib.actions.DisplayViewAction;
-import com.android.hierarchyviewerlib.actions.DumpDisplayListAction;
-import com.android.hierarchyviewerlib.actions.InvalidateAction;
-import com.android.hierarchyviewerlib.actions.ProfileNodesAction;
-import com.android.hierarchyviewerlib.actions.RefreshViewAction;
-import com.android.hierarchyviewerlib.actions.RequestLayoutAction;
-import com.android.hierarchyviewerlib.actions.SaveTreeViewAction;
-import com.android.hierarchyviewerlib.ui.TreeView;
-import com.android.hierarchyviewerlib.ui.TreeViewControls;
-
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.action.IToolBarManager;
-import org.eclipse.jface.action.Separator;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.FillLayout;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.IActionBars;
-import org.eclipse.ui.part.ViewPart;
-
-// Awesome name.
-public class TreeViewView extends ViewPart {
-
-    public static final String ID = "com.android.ide.eclipse.hierarchyviewer.views.TreeViewView"; //$NON-NLS-1$
-
-    private TreeView mTreeView;
-
-    @Override
-    public void createPartControl(Composite parent) {
-        GridLayout layout = new GridLayout();
-        layout.marginWidth = layout.marginHeight = 0;
-        layout.horizontalSpacing = layout.verticalSpacing = 0;
-        parent.setLayout(layout);
-
-        Composite treeViewContainer = new Composite(parent, SWT.BORDER);
-        treeViewContainer.setLayoutData(new GridData(GridData.FILL_BOTH));
-        treeViewContainer.setLayout(new FillLayout());
-
-        mTreeView = new TreeView(treeViewContainer);
-
-        TreeViewControls treeViewControls = new TreeViewControls(parent);
-        treeViewControls.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-
-        placeActions();
-    }
-
-    public void placeActions() {
-        IActionBars actionBars = getViewSite().getActionBars();
-
-        IMenuManager mm = actionBars.getMenuManager();
-        mm.removeAll();
-        mm.add(SaveTreeViewAction.getAction(getSite().getShell()));
-        mm.add(CapturePSDAction.getAction(getSite().getShell()));
-        mm.add(new Separator());
-        mm.add(RefreshViewAction.getAction());
-        mm.add(DisplayViewAction.getAction(getSite().getShell()));
-        mm.add(new Separator());
-        mm.add(InvalidateAction.getAction());
-        mm.add(RequestLayoutAction.getAction());
-        mm.add(DumpDisplayListAction.getAction());
-        mm.add(ProfileNodesAction.getAction());
-
-        IToolBarManager tm = actionBars.getToolBarManager();
-        tm.removeAll();
-        tm.add(SaveTreeViewAction.getAction(getSite().getShell()));
-        tm.add(CapturePSDAction.getAction(getSite().getShell()));
-        tm.add(new Separator());
-        tm.add(RefreshViewAction.getAction());
-        tm.add(DisplayViewAction.getAction(getSite().getShell()));
-        tm.add(new Separator());
-        tm.add(InvalidateAction.getAction());
-        tm.add(RequestLayoutAction.getAction());
-        tm.add(DumpDisplayListAction.getAction());
-        tm.add(ProfileNodesAction.getAction());
-    }
-
-
-    @Override
-    public void setFocus() {
-        mTreeView.setFocus();
-    }
-
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.monitor/.classpath b/eclipse/plugins/com.android.ide.eclipse.monitor/.classpath
deleted file mode 100644
index fa341c0..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.monitor/.classpath
+++ /dev/null
@@ -1,10 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="src" path="src"/>
-    <classpathentry exported="true" kind="lib" path="libs/sdkuilib.jar"/>
-    <classpathentry combineaccessrules="false" kind="src" path="/ddmlib"/>
-    <classpathentry combineaccessrules="false" kind="src" path="/ddmuilib"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/eclipse/plugins/com.android.ide.eclipse.monitor/.project b/eclipse/plugins/com.android.ide.eclipse.monitor/.project
deleted file mode 100644
index e7ca0c9..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.monitor/.project
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>plugin-monitor</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.PluginNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/eclipse/plugins/com.android.ide.eclipse.monitor/.settings/org.eclipse.jdt.core.prefs b/eclipse/plugins/com.android.ide.eclipse.monitor/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index ea66196..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.monitor/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,98 +0,0 @@
-eclipse.preferences.version=1
-org.eclipse.jdt.core.compiler.annotation.missingNonNullByDefaultAnnotation=ignore
-org.eclipse.jdt.core.compiler.annotation.nonnull=com.android.annotations.NonNull
-org.eclipse.jdt.core.compiler.annotation.nonnullbydefault=com.android.annotations.NonNullByDefault
-org.eclipse.jdt.core.compiler.annotation.nonnullisdefault=disabled
-org.eclipse.jdt.core.compiler.annotation.nullable=com.android.annotations.Nullable
-org.eclipse.jdt.core.compiler.annotation.nullanalysis=enabled
-org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6
-org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.6
-org.eclipse.jdt.core.compiler.debug.lineNumber=generate
-org.eclipse.jdt.core.compiler.debug.localVariable=generate
-org.eclipse.jdt.core.compiler.debug.sourceFile=generate
-org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
-org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
-org.eclipse.jdt.core.compiler.problem.comparingIdentical=warning
-org.eclipse.jdt.core.compiler.problem.deadCode=warning
-org.eclipse.jdt.core.compiler.problem.deprecation=warning
-org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
-org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
-org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
-org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=ignore
-org.eclipse.jdt.core.compiler.problem.fallthroughCase=warning
-org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
-org.eclipse.jdt.core.compiler.problem.fieldHiding=warning
-org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
-org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
-org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
-org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
-org.eclipse.jdt.core.compiler.problem.includeNullInfoFromAsserts=enabled
-org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
-org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=warning
-org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
-org.eclipse.jdt.core.compiler.problem.localVariableHiding=warning
-org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
-org.eclipse.jdt.core.compiler.problem.missingDefaultCase=ignore
-org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=warning
-org.eclipse.jdt.core.compiler.problem.missingEnumCaseDespiteDefault=disabled
-org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=warning
-org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=error
-org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled
-org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
-org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=ignore
-org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
-org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
-org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore
-org.eclipse.jdt.core.compiler.problem.nullAnnotationInferenceConflict=warning
-org.eclipse.jdt.core.compiler.problem.nullReference=warning
-org.eclipse.jdt.core.compiler.problem.nullSpecInsufficientInfo=warning
-org.eclipse.jdt.core.compiler.problem.nullSpecViolation=warning
-org.eclipse.jdt.core.compiler.problem.nullUncheckedConversion=ignore
-org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
-org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
-org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=warning
-org.eclipse.jdt.core.compiler.problem.potentialNullReference=warning
-org.eclipse.jdt.core.compiler.problem.potentialNullSpecViolation=error
-org.eclipse.jdt.core.compiler.problem.potentiallyUnclosedCloseable=warning
-org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
-org.eclipse.jdt.core.compiler.problem.redundantNullAnnotation=warning
-org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
-org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=ignore
-org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=warning
-org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=ignore
-org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=ignore
-org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
-org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
-org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=enabled
-org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
-org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
-org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
-org.eclipse.jdt.core.compiler.problem.unavoidableGenericTypeProblems=disabled
-org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
-org.eclipse.jdt.core.compiler.problem.unclosedCloseable=error
-org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
-org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
-org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=warning
-org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=warning
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.unusedImport=warning
-org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
-org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
-org.eclipse.jdt.core.compiler.problem.unusedObjectAllocation=warning
-org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
-org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
-org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
-org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
-org.eclipse.jdt.core.compiler.source=1.6
diff --git a/eclipse/plugins/com.android.ide.eclipse.monitor/META-INF/MANIFEST.MF b/eclipse/plugins/com.android.ide.eclipse.monitor/META-INF/MANIFEST.MF
deleted file mode 100644
index 48a3aa3..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.monitor/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,17 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: %Bundle-Name
-Bundle-SymbolicName: com.android.ide.eclipse.monitor;singleton:=true
-Bundle-Version: 24.3.3.qualifier
-Bundle-Activator: com.android.ide.eclipse.monitor.MonitorPlugin
-Require-Bundle: org.eclipse.ui,
- org.eclipse.core.runtime,
- com.android.ide.eclipse.ddms,
- com.android.ide.eclipse.traceview,
- com.android.ide.eclipse.base
-Bundle-ActivationPolicy: lazy
-Bundle-Vendor: %Bundle-Vendor
-Bundle-ClassPath: .,
- libs/sdkuilib.jar
-Bundle-Localization: plugin
-Bundle-RequiredExecutionEnvironment: JavaSE-1.6
diff --git a/eclipse/plugins/com.android.ide.eclipse.monitor/build.properties b/eclipse/plugins/com.android.ide.eclipse.monitor/build.properties
deleted file mode 100644
index 643fe5e..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.monitor/build.properties
+++ /dev/null
@@ -1,10 +0,0 @@
-source.. = src/
-output.. = bin/
-bin.includes = META-INF/,\
-               .,\
-               plugin.xml,\
-               plugin_customization.ini,\
-               plugin.properties,\
-               images/,\
-               libs/,\
-               splash.bmp
diff --git a/eclipse/plugins/com.android.ide.eclipse.monitor/images/avd_manager.png b/eclipse/plugins/com.android.ide.eclipse.monitor/images/avd_manager.png
deleted file mode 100644
index f8a173c..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.monitor/images/avd_manager.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.monitor/images/ddms-128.png b/eclipse/plugins/com.android.ide.eclipse.monitor/images/ddms-128.png
deleted file mode 100644
index 392a8f3..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.monitor/images/ddms-128.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.monitor/images/ddms-16.png b/eclipse/plugins/com.android.ide.eclipse.monitor/images/ddms-16.png
deleted file mode 100644
index f77bee2..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.monitor/images/ddms-16.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.monitor/images/ddms-32.png b/eclipse/plugins/com.android.ide.eclipse.monitor/images/ddms-32.png
deleted file mode 100644
index 4fe6816..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.monitor/images/ddms-32.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.monitor/images/ddms.icns b/eclipse/plugins/com.android.ide.eclipse.monitor/images/ddms.icns
deleted file mode 100644
index eeacbde..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.monitor/images/ddms.icns
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.monitor/images/sdk_manager.png b/eclipse/plugins/com.android.ide.eclipse.monitor/images/sdk_manager.png
deleted file mode 100644
index 08ffda8..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.monitor/images/sdk_manager.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.monitor/monitor.launch b/eclipse/plugins/com.android.ide.eclipse.monitor/monitor.launch
deleted file mode 100644
index f56a37d..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.monitor/monitor.launch
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<launchConfiguration type="org.eclipse.pde.ui.RuntimeWorkbench">
-<booleanAttribute key="append.args" value="true"/>
-<booleanAttribute key="askclear" value="true"/>
-<booleanAttribute key="automaticAdd" value="true"/>
-<booleanAttribute key="automaticValidate" value="false"/>
-<stringAttribute key="bootstrap" value=""/>
-<stringAttribute key="checked" value="[NONE]"/>
-<booleanAttribute key="clearConfig" value="false"/>
-<booleanAttribute key="clearws" value="false"/>
-<booleanAttribute key="clearwslog" value="false"/>
-<stringAttribute key="configLocation" value="${workspace_loc}/.metadata/.plugins/org.eclipse.pde.core/monitor"/>
-<booleanAttribute key="default" value="false"/>
-<stringAttribute key="deselected_workspace_plugins" value="com.android.ide.eclipse.adt,com.android.ide.eclipse.adt.package,com.android.ide.eclipse.gldebugger.tests,overlay.com.android.ide.eclipse.adt.overlay"/>
-<booleanAttribute key="includeOptional" value="true"/>
-<stringAttribute key="location" value="${workspace_loc}/../runtime-monitor-idea133-ksr2"/>
-<booleanAttribute key="org.eclipse.jdt.launching.ATTR_USE_START_ON_FIRST_THREAD" value="true"/>
-<stringAttribute key="org.eclipse.jdt.launching.JRE_CONTAINER" value="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6"/>
-<stringAttribute key="org.eclipse.jdt.launching.PROGRAM_ARGUMENTS" value="-os ${target.os} -ws ${target.ws} -arch ${target.arch} -nl ${target.nl} -consoleLog -data @noDefault"/>
-<stringAttribute key="org.eclipse.jdt.launching.SOURCE_PATH_PROVIDER" value="org.eclipse.pde.ui.workbenchClasspathProvider"/>
-<stringAttribute key="pde.version" value="3.3"/>
-<stringAttribute key="product" value="com.android.ide.eclipse.monitor.product"/>
-<stringAttribute key="selected_target_plugins" value="com.android.tools.common@default:default,com.android.tools.ddms.ddmlib@default:default,com.android.tools.ddms.ddmuilib@default:default,com.android.tools.dvlib@default:default,com.android.tools.external.liblzf@default:default,com.android.tools.external.libprotobuf-java-lite@default:default,com.android.tools.hierarchyviewer2lib@default:default,com.android.tools.layoutlib.api@default:default,com.android.tools.sdklib@default:default,com.android.tools.sdkstats@default:default,com.android.tools.sdkuilib@default:default,com.android.tools.swtmenubar@default:default,com.android.tools.traceview@default:default,com.android.tools.uiautomatorviewer@default:default,com.google.guava@default:default,com.ibm.icu@default:default,javax.annotation@default:default,javax.inject@default:default,javax.servlet@default:default,javax.xml@default:default,jfree.chart-swt@default:default,jfree.chart@default:default,jfree.jcommon@default:default,net.sf.kxml.2@default:default,org.apache.batik.css@default:default,org.apache.batik.util.gui@default:default,org.apache.batik.util@default:default,org.apache.commons.codec*1.4.0.v201209201156@default:default,org.apache.commons.compress@default:default,org.apache.commons.logging*1.1.1.v201101211721@default:default,org.apache.httpcomponents.httpclient*4.1.3.v201209201135@default:default,org.apache.httpcomponents.httpcore*4.1.4.v201203221030@default:default,org.eclipse.ant.core@default:default,org.eclipse.compare.core@default:default,org.eclipse.core.commands@default:default,org.eclipse.core.contenttype@default:default,org.eclipse.core.databinding.observable@default:default,org.eclipse.core.databinding.property@default:default,org.eclipse.core.databinding@default:default,org.eclipse.core.expressions@default:default,org.eclipse.core.filesystem.linux.x86_64@default:false,org.eclipse.core.filesystem@default:default,org.eclipse.core.jobs@default:default,org.eclipse.core.resources@default:default,org.eclipse.core.runtime.compatibility.registry@default:false,org.eclipse.core.runtime@default:true,org.eclipse.core.variables@default:default,org.eclipse.e4.core.commands@default:default,org.eclipse.e4.core.contexts@default:default,org.eclipse.e4.core.di.extensions@default:default,org.eclipse.e4.core.di@default:default,org.eclipse.e4.core.services@default:default,org.eclipse.e4.ui.bindings@default:default,org.eclipse.e4.ui.css.core@default:default,org.eclipse.e4.ui.css.swt.theme@default:default,org.eclipse.e4.ui.css.swt@default:default,org.eclipse.e4.ui.di@default:default,org.eclipse.e4.ui.model.workbench@default:default,org.eclipse.e4.ui.services@default:default,org.eclipse.e4.ui.widgets@default:default,org.eclipse.e4.ui.workbench.addons.swt@default:default,org.eclipse.e4.ui.workbench.renderers.swt@default:default,org.eclipse.e4.ui.workbench.swt@default:default,org.eclipse.e4.ui.workbench3@default:default,org.eclipse.e4.ui.workbench@default:default,org.eclipse.emf.common@default:default,org.eclipse.emf.ecore.change@default:default,org.eclipse.emf.ecore.xmi@default:default,org.eclipse.emf.ecore@default:default,org.eclipse.equinox.app@default:default,org.eclipse.equinox.bidi@default:default,org.eclipse.equinox.common@2:true,org.eclipse.equinox.ds@1:true,org.eclipse.equinox.event@default:default,org.eclipse.equinox.p2.core@default:default,org.eclipse.equinox.p2.engine@default:default,org.eclipse.equinox.p2.metadata.repository@default:default,org.eclipse.equinox.p2.metadata@default:default,org.eclipse.equinox.p2.repository@default:default,org.eclipse.equinox.preferences@default:default,org.eclipse.equinox.registry@default:default,org.eclipse.equinox.security@default:default,org.eclipse.equinox.util@default:default,org.eclipse.help@default:default,org.eclipse.jface.databinding@default:default,org.eclipse.jface.text@default:default,org.eclipse.jface@default:default,org.eclipse.osgi.services@default:default,org.eclipse.osgi@-1:true,org.eclipse.swt.gtk.linux.x86_64@default:false,org.eclipse.swt@default:default,org.eclipse.text@default:default,org.eclipse.ui.console@default:default,org.eclipse.ui.forms@default:default,org.eclipse.ui.ide@default:default,org.eclipse.ui.views@default:default,org.eclipse.ui.workbench.texteditor@default:default,org.eclipse.ui.workbench@default:default,org.eclipse.ui@default:default,org.w3c.css.sac@default:default,org.w3c.dom.smil@default:default,org.w3c.dom.svg@default:default"/>
-<stringAttribute key="selected_workspace_plugins" value="com.android.ide.eclipse.base@default:default,com.android.ide.eclipse.ddms@default:default,com.android.ide.eclipse.gldebugger@default:default,com.android.ide.eclipse.hierarchyviewer@default:default,com.android.ide.eclipse.monitor@default:default,com.android.ide.eclipse.ndk@default:default,com.android.ide.eclipse.pdt@default:default,com.android.ide.eclipse.tests@default:false,com.android.ide.eclipse.traceview@default:default"/>
-<booleanAttribute key="show_selected_only" value="false"/>
-<stringAttribute key="templateConfig" value="${target_home}/configuration/config.ini"/>
-<booleanAttribute key="tracing" value="false"/>
-<booleanAttribute key="useCustomFeatures" value="false"/>
-<booleanAttribute key="useDefaultConfig" value="true"/>
-<booleanAttribute key="useDefaultConfigArea" value="true"/>
-<booleanAttribute key="useProduct" value="true"/>
-</launchConfiguration>
diff --git a/eclipse/plugins/com.android.ide.eclipse.monitor/plugin.properties b/eclipse/plugins/com.android.ide.eclipse.monitor/plugin.properties
deleted file mode 100644
index f25aa6e..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.monitor/plugin.properties
+++ /dev/null
@@ -1,8 +0,0 @@
-#Properties file for com.android.ide.eclipse.monitor
-#TODO: update with new year date (search this to find other occurrences to update)
-Bundle-Vendor = The Android Open Source Project
-Bundle-Name = Monitor
-aboutText = \n\
-Android Device Monitor\n\
-Version: 24.3.3 \n\
-Copyright 2012, The Android Open Source Project \n\
diff --git a/eclipse/plugins/com.android.ide.eclipse.monitor/plugin.xml b/eclipse/plugins/com.android.ide.eclipse.monitor/plugin.xml
deleted file mode 100644
index 32c44d0..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.monitor/plugin.xml
+++ /dev/null
@@ -1,132 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.4"?>
-<plugin>
-   <extension
-         id="com.android.ide.eclipse.monitor.Application"
-         point="org.eclipse.core.runtime.applications">
-      <application
-            cardinality="singleton-global"
-            thread="main"
-            visible="true">
-         <run
-               class="com.android.ide.eclipse.monitor.MonitorApplication">
-         </run>
-      </application>
-   </extension>
-   <extension
-         id="com.android.ide.eclipse.monitor.product"
-         point="org.eclipse.core.runtime.products">
-      <product
-            application="com.android.ide.eclipse.monitor.Application"
-            name="Android Device Monitor">
-         <property
-               name="appName"
-               value="Monitor">
-         </property>
-         <property
-               name="preferenceCustomization"
-               value="plugin_customization.ini">
-         </property>
-         <property
-               name="windowImages"
-               value="images/ddms-16.png,images/ddms-32.png,images/ddms-128.png">
-         </property>
-         <property
-               name="aboutImage"
-               value="images/ddms-128.png">
-         </property>
-         <property
-               name="aboutText"
-               value="%aboutText">
-         </property>
-
-      </product>
-   </extension>
-   <extension
-         point="com.android.ide.eclipse.ddms.toolsLocator">
-      <locator
-            class="com.android.ide.eclipse.monitor.ToolsLocator">
-      </locator>
-   </extension>
-   <extension
-         point="org.eclipse.ui.commands">
-      <command
-            defaultHandler="com.android.ide.eclipse.monitor.handlers.StaticPortConfigHandler"
-            id="com.android.monitor.commands.StaticPortConfiguration"
-            name="Static Port Configuration">
-      </command>
-   </extension>
-   <extension
-         point="org.eclipse.ui.menus">
-      <menuContribution
-            allPopups="false"
-            locationURI="menu:file?after=additions">
-         <command
-               commandId="com.android.monitor.commands.StaticPortConfiguration"
-               label="Static Port Configuration"
-               style="push"
-               tooltip="Configure static debug ports">
-         </command>
-      </menuContribution>
-      <menuContribution
-            allPopups="false"
-            locationURI="menu:window?after=additions">
-         <command
-               commandId="org.eclipse.ui.views.showView"
-               style="push">
-         </command>
-      </menuContribution>
-   </extension>
-   <extension
-         point="org.eclipse.ui.preferencePages">
-      <page
-            class="com.android.ide.eclipse.monitor.AndroidPreferencePage"
-            id="com.android.ide.eclipse.preferences.main"
-            name="Android">
-      </page>
-   </extension>
-   <extension
-         point="org.eclipse.ui.startup">
-      <startup
-            class="com.android.ide.eclipse.monitor.MonitorStartup">
-      </startup>
-   </extension>
-   <extension
-         point="org.eclipse.ui.actionSets">
-      <actionSet
-            id="monitor.actionSet.AvdSdkManager"
-            label="Android SDK and AVD Manager"
-            visible="true">
-            <action
-                class="com.android.ide.eclipse.monitor.actions.AvdManagerAction"
-                icon="images/avd_manager.png"
-                id="com.android.ide.eclipse.monitor.avdmanager"
-                label="Android Virtual Device Manager"
-                menubarPath="Window/additions"
-                style="push"
-                toolbarPath="android_project">
-            </action>
-            <action
-                class="com.android.ide.eclipse.monitor.actions.SdkManagerAction"
-                icon="images/sdk_manager.png"
-                id="com.android.ide.eclipse.monitor.sdkmanager"
-                label="Android SDK Manager"
-                menubarPath="Window/additions"
-                style="push"
-                toolbarPath="android_project">
-            </action>
-      </actionSet>
-   </extension>
-   <extension
-         id="product"
-         point="org.eclipse.core.runtime.products">
-      <product
-            application="com.android.ide.eclipse.monitor.Application"
-            name="monitor">
-         <property
-               name="appName"
-               value="monitor">
-         </property>
-      </product>
-   </extension>
-</plugin>
diff --git a/eclipse/plugins/com.android.ide.eclipse.monitor/plugin_customization.ini b/eclipse/plugins/com.android.ide.eclipse.monitor/plugin_customization.ini
deleted file mode 100644
index fa9d8a2..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.monitor/plugin_customization.ini
+++ /dev/null
@@ -1,6 +0,0 @@
-org.eclipse.ui/DOCK_PERSPECTIVE_BAR=topRight
-org.eclipse.ui/SHOW_TEXT_ON_PERSPECTIVE_BAR=true
-org.eclipse.ui/PERSPECTIVE_BAR_EXTRAS=com.android.ide.eclipse.ddms.Perspective,com.android.ide.eclipse.hierarchyviewer.TreeViewPerspective
-org.eclipse.ui/SHOW_TRADITIONAL_STYLE_TABS=true
-org.eclipse.ui/SHOW_MEMORY_MONITOR=true
-org.eclipse.ui/SHOW_PROGRESS_ON_STARTUP = false
diff --git a/eclipse/plugins/com.android.ide.eclipse.monitor/pom.xml b/eclipse/plugins/com.android.ide.eclipse.monitor/pom.xml
deleted file mode 100644
index 425057f..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.monitor/pom.xml
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-    <modelVersion>4.0.0</modelVersion>
-
-    <version>24.3.3-SNAPSHOT</version>
-    <artifactId>com.android.ide.eclipse.monitor</artifactId>
-    <packaging>eclipse-plugin</packaging>
-    <name>monitor</name>
-
-    <parent>
-        <relativePath>../../pom.xml</relativePath>
-        <groupId>adt.group</groupId>
-        <artifactId>parent</artifactId>
-        <version>1.0.0-SNAPSHOT</version>
-    </parent>
-</project>
diff --git a/eclipse/plugins/com.android.ide.eclipse.monitor/splash.bmp b/eclipse/plugins/com.android.ide.eclipse.monitor/splash.bmp
deleted file mode 100644
index 54880bf..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.monitor/splash.bmp
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.monitor/src/com/android/ide/eclipse/monitor/AndroidPreferencePage.java b/eclipse/plugins/com.android.ide.eclipse.monitor/src/com/android/ide/eclipse/monitor/AndroidPreferencePage.java
deleted file mode 100644
index b85f016..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.monitor/src/com/android/ide/eclipse/monitor/AndroidPreferencePage.java
+++ /dev/null
@@ -1,43 +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.eclipse.monitor;
-
-import org.eclipse.jface.preference.PreferencePage;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchPreferencePage;
-
-public class AndroidPreferencePage extends PreferencePage implements IWorkbenchPreferencePage {
-    public AndroidPreferencePage() {
-        super("");      //$NON-NLS-1$
-        setPreferenceStore(MonitorPlugin.getDefault().getPreferenceStore());
-    }
-
-    @Override
-    public void init(IWorkbench workbench) {
-    }
-
-    @Override
-    protected Control createContents(Composite parent) {
-        // TODO: This page is empty currently. It is only used as the top level
-        // to which DDMS & logcat attach their preference pages.
-        // ADT's root page contains the path to the Android SDK, and we should recreate
-        // that here once we figure out how to share this across plugins.
-        return null;
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.monitor/src/com/android/ide/eclipse/monitor/MonitorActionBarAdvisor.java b/eclipse/plugins/com.android.ide.eclipse.monitor/src/com/android/ide/eclipse/monitor/MonitorActionBarAdvisor.java
deleted file mode 100644
index e31e45e..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.monitor/src/com/android/ide/eclipse/monitor/MonitorActionBarAdvisor.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.ide.eclipse.monitor;
-
-import org.eclipse.jface.action.GroupMarker;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.action.MenuManager;
-import org.eclipse.ui.IWorkbenchActionConstants;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.actions.ActionFactory;
-import org.eclipse.ui.actions.ActionFactory.IWorkbenchAction;
-import org.eclipse.ui.application.ActionBarAdvisor;
-import org.eclipse.ui.application.IActionBarConfigurer;
-import org.eclipse.ui.internal.IWorkbenchGraphicConstants;
-import org.eclipse.ui.internal.WorkbenchImages;
-
-public class MonitorActionBarAdvisor extends ActionBarAdvisor {
-    private IWorkbenchAction mQuitAction;
-    private IWorkbenchAction mCopyAction;
-    private IWorkbenchAction mSelectAllAction;
-    private IWorkbenchAction mFindAction;
-    private IWorkbenchAction mOpenPerspectiveAction;
-    private IWorkbenchAction mResetPerspectiveAction;
-    private IWorkbenchAction mPreferencesAction;
-    private IWorkbenchAction mAboutAction;
-
-    public MonitorActionBarAdvisor(IActionBarConfigurer configurer) {
-        super(configurer);
-    }
-
-    @Override
-    protected void makeActions(IWorkbenchWindow window) {
-        mQuitAction = ActionFactory.QUIT.create(window);
-        register(mQuitAction);
-
-        mCopyAction = ActionFactory.COPY.create(window);
-        register(mCopyAction);
-
-        mSelectAllAction = ActionFactory.SELECT_ALL.create(window);
-        register(mSelectAllAction);
-
-        mFindAction = ActionFactory.FIND.create(window);
-        mFindAction.setText("Find...");     // replace the default "Find and Replace..."
-        register(mFindAction);
-
-        mOpenPerspectiveAction = ActionFactory.OPEN_PERSPECTIVE_DIALOG.create(window);
-        register(mOpenPerspectiveAction);
-
-        mResetPerspectiveAction = ActionFactory.RESET_PERSPECTIVE.create(window);
-        register(mResetPerspectiveAction);
-
-        mPreferencesAction = ActionFactory.PREFERENCES.create(window);
-        register(mPreferencesAction);
-
-        mAboutAction = ActionFactory.ABOUT.create(window);
-        register(mAboutAction);
-    }
-
-    @Override
-    protected void fillMenuBar(IMenuManager menuBar) {
-        MenuManager fileMenu = new MenuManager("&File", IWorkbenchActionConstants.M_FILE);
-        MenuManager editMenu = new MenuManager("&Edit", IWorkbenchActionConstants.M_EDIT);
-        MenuManager helpMenu = new MenuManager("&Help", IWorkbenchActionConstants.M_HELP);
-        MenuManager windowMenu = new MenuManager("&Window", IWorkbenchActionConstants.M_WINDOW);
-
-        menuBar.add(fileMenu);
-        menuBar.add(editMenu);
-        menuBar.add(new GroupMarker(IWorkbenchActionConstants.MB_ADDITIONS));
-        menuBar.add(windowMenu);
-        menuBar.add(helpMenu);
-
-        // contents of File menu
-        fileMenu.add(new GroupMarker(IWorkbenchActionConstants.MB_ADDITIONS));
-        fileMenu.add(mQuitAction);
-
-        // contents of Edit menu
-        editMenu.add(mCopyAction);
-        editMenu.add(mSelectAllAction);
-        editMenu.add(mFindAction);
-
-        // contents of Window menu
-        windowMenu.add(mOpenPerspectiveAction);
-        windowMenu.add(mResetPerspectiveAction);
-        windowMenu.add(new GroupMarker(IWorkbenchActionConstants.MB_ADDITIONS));
-        windowMenu.add(mPreferencesAction);
-
-        // contents of Help menu
-        helpMenu.add(new GroupMarker(IWorkbenchActionConstants.MB_ADDITIONS));
-        helpMenu.add(mAboutAction);
-    };
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.monitor/src/com/android/ide/eclipse/monitor/MonitorApplication.java b/eclipse/plugins/com.android.ide.eclipse.monitor/src/com/android/ide/eclipse/monitor/MonitorApplication.java
deleted file mode 100644
index 425786f..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.monitor/src/com/android/ide/eclipse/monitor/MonitorApplication.java
+++ /dev/null
@@ -1,179 +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.eclipse.monitor;
-
-import com.android.ide.eclipse.monitor.SdkToolsLocator.SdkInstallStatus;
-import com.android.prefs.AndroidLocation;
-import com.android.sdklib.SdkManager;
-import com.android.sdkstats.SdkStatsService;
-import com.android.sdkuilib.internal.repository.ui.AdtUpdateDialog;
-import com.android.utils.ILogger;
-import com.android.utils.NullLogger;
-
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.equinox.app.IApplication;
-import org.eclipse.equinox.app.IApplicationContext;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.jface.window.Window;
-import org.eclipse.osgi.service.datalocation.Location;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.PlatformUI;
-
-import java.io.File;
-
-public class MonitorApplication implements IApplication {
-    private static final String SDK_PATH_ENVVAR = "com.android.sdk.path";
-    private static final String MONITOR_WORKSPACE_PATH = "monitor-workspace";
-
-    @Override
-    public Object start(IApplicationContext context) throws Exception {
-        Display display = PlatformUI.createDisplay();
-
-        // set workspace location
-        Location instanceLoc = Platform.getInstanceLocation();
-        IPath workspacePath = new Path(AndroidLocation.getFolder()).append(MONITOR_WORKSPACE_PATH);
-        instanceLoc.set(workspacePath.toFile().toURI().toURL(), true);
-
-        // figure out path to SDK
-        String sdkPath = findSdkPath(display);
-        if (!isValidSdkLocation(sdkPath)) {
-            // exit with return code -1
-            return Integer.valueOf(-1);
-        }
-        MonitorPlugin.getDefault().setSdkFolder(new File(sdkPath));
-
-        // install platform tools if necessary
-        ILogger sdkLog = NullLogger.getLogger();
-        SdkManager manager = SdkManager.createManager(sdkPath, sdkLog);
-        if (manager.getPlatformToolsVersion() == null) {
-            boolean install = MessageDialog.openQuestion(new Shell(display),
-                    "Monitor",
-                    "The platform tools package that provides adb is missing from your SDK installation. "
-                    + "Monitor requires this package to work properly. Would you like to install that package now?");
-            if (!install) {
-                return Integer.valueOf(-1);
-            }
-            AdtUpdateDialog window = new AdtUpdateDialog(new Shell(display), sdkLog, sdkPath);
-            window.installPlatformTools();
-        }
-
-        // If this is the first time using ddms or adt, open up the stats service
-        // opt out dialog, and request user for permissions.
-        // Note that the actual ping is performed in MonitorStartup
-        SdkStatsService stats = new SdkStatsService();
-        stats.checkUserPermissionForPing(new Shell(display));
-
-        // open up RCP
-        try {
-            int returnCode = PlatformUI.createAndRunWorkbench(display,
-                    new MonitorWorkbenchAdvisor());
-            if (returnCode == PlatformUI.RETURN_RESTART) {
-                return IApplication.EXIT_RESTART;
-            }
-            return IApplication.EXIT_OK;
-        } finally {
-            display.dispose();
-        }
-    }
-
-    @Override
-    public void stop() {
-        if (!PlatformUI.isWorkbenchRunning())
-            return;
-        final IWorkbench workbench = PlatformUI.getWorkbench();
-        final Display display = workbench.getDisplay();
-        display.syncExec(new Runnable() {
-            @Override
-            public void run() {
-                if (!display.isDisposed())
-                    workbench.close();
-            }
-        });
-    }
-
-    private String findSdkPath(Display display) {
-        // see if there is a system property set (passed in via a command line arg)
-        String sdkLocation = System.getProperty(SDK_PATH_ENVVAR);
-        if (isValidSdkLocation(sdkLocation)) {
-            return sdkLocation;
-        }
-
-        // see if there is an environment variable set
-        sdkLocation = System.getenv(SDK_PATH_ENVVAR);
-        if (isValidSdkLocation(sdkLocation)) {
-            return sdkLocation;
-        }
-
-        // The monitor app should be located in "<sdk>/tools/lib/monitor-platform/"
-        // So see if the folder one level up from the install location is a valid SDK.
-        Location install = Platform.getInstallLocation();
-        if (install != null && install.getURL() != null) {
-            File libFolder = new File(install.getURL().getFile()).getParentFile();
-            if (libFolder != null) {
-                String toolsFolder = libFolder.getParent();
-                if (toolsFolder != null) {
-                    sdkLocation = new File(toolsFolder).getParent();
-                    if (isValidSdkLocation(sdkLocation)) {
-                        MonitorPlugin.getDdmsPreferenceStore().setLastSdkPath(sdkLocation);
-                        return sdkLocation;
-                    }
-                }
-
-            }
-        }
-
-        // check for the last used SDK
-        sdkLocation = MonitorPlugin.getDdmsPreferenceStore().getLastSdkPath();
-        if (isValidSdkLocation(sdkLocation)) {
-            return sdkLocation;
-        }
-
-        // if nothing else works, prompt the user
-        sdkLocation = getSdkLocationFromUser(new Shell(display));
-        if (isValidSdkLocation(sdkLocation)) {
-            MonitorPlugin.getDdmsPreferenceStore().setLastSdkPath(sdkLocation);
-        }
-
-        return sdkLocation;
-    }
-
-    private boolean isValidSdkLocation(String sdkLocation) {
-        if (sdkLocation == null) {
-            return false;
-        }
-
-        if (sdkLocation.trim().length() == 0) {
-            return false;
-        }
-
-        SdkToolsLocator locator = new SdkToolsLocator(new File(sdkLocation));
-        return locator.isValidInstallation() == SdkInstallStatus.VALID;
-    }
-
-    private String getSdkLocationFromUser(Shell shell) {
-        SdkLocationChooserDialog dlg = new SdkLocationChooserDialog(shell);
-        if (dlg.open() == Window.OK) {
-            return dlg.getPath();
-        } else {
-            return null;
-        }
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.monitor/src/com/android/ide/eclipse/monitor/MonitorPlugin.java b/eclipse/plugins/com.android.ide.eclipse.monitor/src/com/android/ide/eclipse/monitor/MonitorPlugin.java
deleted file mode 100644
index a61eb4a..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.monitor/src/com/android/ide/eclipse/monitor/MonitorPlugin.java
+++ /dev/null
@@ -1,65 +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.eclipse.monitor;
-
-import com.android.sdkstats.DdmsPreferenceStore;
-
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.ui.plugin.AbstractUIPlugin;
-import org.osgi.framework.BundleContext;
-
-import java.io.File;
-
-public class MonitorPlugin extends AbstractUIPlugin {
-    public static final String PLUGIN_ID = "com.android.ide.eclipse.monitor"; //$NON-NLS-1$
-    private static MonitorPlugin sPlugin;
-    private static final DdmsPreferenceStore sDdmsPreferenceStore = new DdmsPreferenceStore();
-    private File mSdkFolder;
-
-    @Override
-    public void start(BundleContext context) throws Exception {
-        super.start(context);
-
-        sPlugin = this;
-    }
-
-    @Override
-    public void stop(BundleContext context) throws Exception {
-        sPlugin = null;
-        super.stop(context);
-    }
-
-    public static MonitorPlugin getDefault() {
-        return sPlugin;
-    }
-
-    public static ImageDescriptor getImageDescriptor(String path) {
-        return imageDescriptorFromPlugin(PLUGIN_ID, path);
-    }
-
-    public static DdmsPreferenceStore getDdmsPreferenceStore() {
-        return sDdmsPreferenceStore;
-    }
-
-    public void setSdkFolder(File sdkFolder) {
-        mSdkFolder = sdkFolder;
-    }
-
-    public File getSdkFolder() {
-        return mSdkFolder;
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.monitor/src/com/android/ide/eclipse/monitor/MonitorStartup.java b/eclipse/plugins/com.android.ide.eclipse.monitor/src/com/android/ide/eclipse/monitor/MonitorStartup.java
deleted file mode 100644
index 2de260e..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.monitor/src/com/android/ide/eclipse/monitor/MonitorStartup.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.ide.eclipse.monitor;
-
-import com.android.SdkConstants;
-import com.android.sdkstats.SdkStatsService;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.core.runtime.jobs.Job;
-import org.eclipse.ui.IStartup;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.util.Properties;
-
-public class MonitorStartup implements IStartup {
-    @Override
-    public void earlyStartup() {
-        Job pingJob = new Job("Android SDK Ping") {
-            @Override
-            protected IStatus run(IProgressMonitor monitor) {
-                SdkStatsService stats = new SdkStatsService();
-                File sdkFolder = MonitorPlugin.getDefault().getSdkFolder();
-                if (sdkFolder == null) {
-                    return Status.OK_STATUS;
-                }
-
-                String toolsPath = new File(sdkFolder, SdkConstants.FD_TOOLS).getAbsolutePath();
-                ping(stats, toolsPath);
-                return Status.OK_STATUS;
-            }
-        };
-        pingJob.setPriority(Job.DECORATE); // lowest priority
-        pingJob.schedule();
-    }
-
-    private static void ping(SdkStatsService stats, String toolsLocation) {
-        Properties p = new Properties();
-        try{
-            File sourceProp;
-            if (toolsLocation != null && toolsLocation.length() > 0) {
-                sourceProp = new File(toolsLocation, "source.properties"); //$NON-NLS-1$
-            } else {
-                sourceProp = new File("source.properties"); //$NON-NLS-1$
-            }
-            FileInputStream fis = null;
-            try {
-                fis = new FileInputStream(sourceProp);
-                p.load(fis);
-            } finally {
-                if (fis != null) {
-                    try {
-                        fis.close();
-                    } catch (IOException ignore) {
-                    }
-                }
-            }
-
-            String revision = p.getProperty("Pkg.Revision"); //$NON-NLS-1$
-            if (revision != null && revision.length() > 0) {
-                stats.ping("ddms", revision);  //$NON-NLS-1$
-            }
-        } catch (FileNotFoundException e) {
-            // couldn't find the file? don't ping.
-        } catch (IOException e) {
-            // couldn't find the file? don't ping.
-        }
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.monitor/src/com/android/ide/eclipse/monitor/MonitorWorkbenchAdvisor.java b/eclipse/plugins/com.android.ide.eclipse.monitor/src/com/android/ide/eclipse/monitor/MonitorWorkbenchAdvisor.java
deleted file mode 100644
index c79803f..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.monitor/src/com/android/ide/eclipse/monitor/MonitorWorkbenchAdvisor.java
+++ /dev/null
@@ -1,43 +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.eclipse.monitor;
-
-import com.android.ide.eclipse.ddms.Perspective;
-
-import org.eclipse.ui.application.IWorkbenchConfigurer;
-import org.eclipse.ui.application.IWorkbenchWindowConfigurer;
-import org.eclipse.ui.application.WorkbenchAdvisor;
-import org.eclipse.ui.application.WorkbenchWindowAdvisor;
-
-public class MonitorWorkbenchAdvisor extends WorkbenchAdvisor {
-    @Override
-    public String getInitialWindowPerspectiveId() {
-        return Perspective.ID;
-    }
-
-    @Override
-    public void initialize(IWorkbenchConfigurer configurer) {
-        super.initialize(configurer);
-        configurer.setSaveAndRestore(true);
-    }
-
-    @Override
-    public WorkbenchWindowAdvisor createWorkbenchWindowAdvisor(
-            IWorkbenchWindowConfigurer configurer) {
-        return new MonitorWorkbenchWindowAdvisor(configurer);
-    };
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.monitor/src/com/android/ide/eclipse/monitor/MonitorWorkbenchWindowAdvisor.java b/eclipse/plugins/com.android.ide.eclipse.monitor/src/com/android/ide/eclipse/monitor/MonitorWorkbenchWindowAdvisor.java
deleted file mode 100644
index 137d3b1..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.monitor/src/com/android/ide/eclipse/monitor/MonitorWorkbenchWindowAdvisor.java
+++ /dev/null
@@ -1,41 +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.eclipse.monitor;
-
-import org.eclipse.ui.application.ActionBarAdvisor;
-import org.eclipse.ui.application.IActionBarConfigurer;
-import org.eclipse.ui.application.IWorkbenchWindowConfigurer;
-import org.eclipse.ui.application.WorkbenchWindowAdvisor;
-
-public class MonitorWorkbenchWindowAdvisor extends WorkbenchWindowAdvisor {
-    public MonitorWorkbenchWindowAdvisor(IWorkbenchWindowConfigurer configurer) {
-        super(configurer);
-    }
-
-    @Override
-    public ActionBarAdvisor createActionBarAdvisor(IActionBarConfigurer configurer) {
-        return new MonitorActionBarAdvisor(configurer);
-    };
-
-    @Override
-    public void preWindowOpen() {
-        IWorkbenchWindowConfigurer configurer = getWindowConfigurer();
-        configurer.setShowStatusLine(true);
-        configurer.setShowPerspectiveBar(true);
-        configurer.setTitle("Android Device Monitor");
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.monitor/src/com/android/ide/eclipse/monitor/SdkLocationChooserDialog.java b/eclipse/plugins/com.android.ide.eclipse.monitor/src/com/android/ide/eclipse/monitor/SdkLocationChooserDialog.java
deleted file mode 100644
index 04f60c7..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.monitor/src/com/android/ide/eclipse/monitor/SdkLocationChooserDialog.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.ide.eclipse.monitor;
-
-import com.android.ide.eclipse.monitor.SdkToolsLocator.SdkInstallStatus;
-
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.jface.layout.GridDataFactory;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.DirectoryDialog;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Text;
-
-import java.io.File;
-
-public class SdkLocationChooserDialog extends Dialog {
-    private static final String TITLE = "Android Device Monitor";
-    private static final String DEFAULT_MESSAGE = "Provide the path to the Android SDK";
-
-    private Label mStatusLabel;
-    private Text mTextBox;
-    private String mPath;
-
-    public SdkLocationChooserDialog(Shell parentShell) {
-        super(parentShell);
-    }
-
-    @Override
-    protected Control createDialogArea(Composite parent) {
-        getShell().setText(TITLE);
-
-        Composite c = new Composite((Composite) super.createDialogArea(parent), SWT.NONE);
-        c.setLayout(new GridLayout(2, false));
-        c.setLayoutData(new GridData(GridData.FILL_BOTH));
-
-        Label l = new Label(c, SWT.NONE);
-        l.setText(DEFAULT_MESSAGE);
-        GridDataFactory.fillDefaults().span(2, 1).applyTo(l);
-
-        mTextBox = new Text(c, SWT.BORDER);
-        mTextBox.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-        GridDataFactory.fillDefaults()
-                       .hint(SwtUtils.getFontWidth(mTextBox) * 80, SWT.DEFAULT)
-                       .applyTo(mTextBox);
-        mTextBox.addModifyListener(new ModifyListener() {
-            @Override
-            public void modifyText(ModifyEvent e) {
-                validateInstall();
-            }
-        });
-
-        Button browse = new Button(c, SWT.PUSH);
-        browse.setText("Browse");
-        browse.addSelectionListener(new SelectionAdapter() {
-            @Override
-            public void widgetSelected(SelectionEvent e) {
-                DirectoryDialog dlg = new DirectoryDialog(getShell(), SWT.OPEN);
-                dlg.setText("Android SDK location");
-                String dir = dlg.open();
-                if (dir != null) {
-                    mTextBox.setText(dir);
-                    validateInstall();
-                }
-            }
-        });
-
-        mStatusLabel = new Label(c, SWT.WRAP);
-        mStatusLabel.setText("");
-        mStatusLabel.setForeground(getShell().getDisplay().getSystemColor(SWT.COLOR_RED));
-        GridDataFactory.fillDefaults().span(2, 1).applyTo(mStatusLabel);
-
-        return super.createDialogArea(parent);
-    }
-
-    private void validateInstall() {
-        SdkToolsLocator locator = new SdkToolsLocator(new File(mTextBox.getText()));
-        SdkInstallStatus status = locator.isValidInstallation();
-        if (status.isValid()) {
-            mStatusLabel.setText("");
-            getButton(IDialogConstants.OK_ID).setEnabled(true);
-        } else {
-            mStatusLabel.setText(status.getErrorMessage());
-            mStatusLabel.pack();
-            getButton(IDialogConstants.OK_ID).setEnabled(false);
-        }
-    }
-
-    @Override
-    public boolean close() {
-        mPath = mTextBox.getText();
-        return super.close();
-    }
-
-    public String getPath() {
-        return mPath;
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.monitor/src/com/android/ide/eclipse/monitor/SdkToolsLocator.java b/eclipse/plugins/com.android.ide.eclipse.monitor/src/com/android/ide/eclipse/monitor/SdkToolsLocator.java
deleted file mode 100644
index bd8ef60..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.monitor/src/com/android/ide/eclipse/monitor/SdkToolsLocator.java
+++ /dev/null
@@ -1,116 +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.eclipse.monitor;
-
-import com.android.SdkConstants;
-import com.android.ide.eclipse.ddms.IToolsLocator;
-
-import java.io.File;
-import java.util.Arrays;
-import java.util.List;
-
-/**
- * {@link SdkToolsLocator} has two functions: <ul>
- *  <li> It implements all the methods of {@link IToolsLocator} interface, and
- *       so can be used as such. </li>
- *  <li> It provides the {@link #isValidInstallation()} method to check the validity
- *       of an installation. </li>
- *  The only reason this class does not explicitly implement the {@link IToolsLocator} interface
- *  is that it is used very early during the startup to check the validity of the installation.
- *  Actually implementing that interface causes other bundles to be activated before the
- *  Eclipse Platform is fully initialized, resulting in startup error.
- */
-public class SdkToolsLocator {
-    public static final String PLATFORM_EXECUTABLE_EXTENSION =
-            (SdkConstants.CURRENT_PLATFORM == SdkConstants.PLATFORM_WINDOWS) ?
-                    ".exe" : ""; //$NON-NLS-1$
-
-    public static final String PLATFORM_SCRIPT_EXTENSION =
-            (SdkConstants.CURRENT_PLATFORM == SdkConstants.PLATFORM_WINDOWS) ?
-                    ".bat" : ""; //$NON-NLS-1$
-
-    public static final String FN_HPROF_CONV = "hprof-conv" + PLATFORM_EXECUTABLE_EXTENSION; //$NON-NLS-1$
-    public static final String FN_TRACEVIEW = "traceview" + PLATFORM_SCRIPT_EXTENSION; //$NON-NLS-1$
-
-    private final File mSdkFolder;
-
-    public SdkToolsLocator(File sdkFolder) {
-        mSdkFolder = sdkFolder;
-    }
-
-    public String getAdbLocation() {
-        return new File(getSdkPlatformToolsFolder(), SdkConstants.FN_ADB).getAbsolutePath();
-    }
-
-    public String getTraceViewLocation() {
-        return new File(getSdkToolsFolder(), FN_TRACEVIEW).getAbsolutePath();
-    }
-
-    public String getHprofConvLocation() {
-        return new File(getSdkPlatformToolsFolder(), FN_HPROF_CONV).getAbsolutePath();
-    }
-
-    private String getSdkToolsFolder() {
-        return new File(mSdkFolder, SdkConstants.FD_TOOLS).getAbsolutePath();
-    }
-
-    private String getSdkPlatformToolsFolder() {
-        return new File(mSdkFolder, SdkConstants.FD_PLATFORM_TOOLS).getAbsolutePath();
-    }
-
-    public SdkInstallStatus isValidInstallation() {
-        List<String> executables = Arrays.asList(
-                getTraceViewLocation(),
-                getHprofConvLocation());
-
-        for (String exe : executables) {
-            File f = new File(exe);
-            if (!f.exists()) {
-                return SdkInstallStatus.invalidInstallation(exe + " not present.");
-            }
-            if (!f.canExecute()) {
-                return SdkInstallStatus.invalidInstallation(exe + " is not executable.");
-            }
-        }
-
-        return SdkInstallStatus.VALID;
-    }
-
-    public static class SdkInstallStatus {
-        private boolean mValid;
-        private String mCause;
-
-        private SdkInstallStatus(boolean valid, String errorMessage) {
-            mValid = valid;
-            mCause = errorMessage;
-        }
-
-        public boolean isValid() {
-            return mValid;
-        }
-
-        public String getErrorMessage() {
-            return mCause;
-        }
-
-        public static final SdkInstallStatus VALID = new SdkInstallStatus(true, "");
-
-        public static SdkInstallStatus invalidInstallation(String errorMessage) {
-            return new SdkInstallStatus(false, errorMessage);
-        }
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.monitor/src/com/android/ide/eclipse/monitor/SwtUtils.java b/eclipse/plugins/com.android.ide.eclipse.monitor/src/com/android/ide/eclipse/monitor/SwtUtils.java
deleted file mode 100644
index bae7f0b..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.monitor/src/com/android/ide/eclipse/monitor/SwtUtils.java
+++ /dev/null
@@ -1,29 +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.eclipse.monitor;
-
-import org.eclipse.swt.graphics.GC;
-import org.eclipse.swt.widgets.Control;
-
-public class SwtUtils {
-    public static int getFontWidth(Control c) {
-        GC gc = new GC(c);
-        int avgCharWidth = gc.getFontMetrics().getAverageCharWidth();
-        gc.dispose();
-        return avgCharWidth;
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.monitor/src/com/android/ide/eclipse/monitor/ToolsLocator.java b/eclipse/plugins/com.android.ide.eclipse.monitor/src/com/android/ide/eclipse/monitor/ToolsLocator.java
deleted file mode 100644
index 7597181..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.monitor/src/com/android/ide/eclipse/monitor/ToolsLocator.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.eclipse.monitor;
-
-import com.android.ide.eclipse.ddms.IToolsLocator;
-
-public class ToolsLocator implements IToolsLocator {
-    private SdkToolsLocator mLocator;
-
-    public ToolsLocator() {
-        mLocator = new SdkToolsLocator(MonitorPlugin.getDefault().getSdkFolder());
-    }
-
-    @Override
-    public String getAdbLocation() {
-        return mLocator.getAdbLocation();
-    }
-
-    @Override
-    public String getTraceViewLocation() {
-        return mLocator.getTraceViewLocation();
-    }
-
-    @Override
-    public String getHprofConvLocation() {
-        return mLocator.getHprofConvLocation();
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.monitor/src/com/android/ide/eclipse/monitor/actions/AvdManagerAction.java b/eclipse/plugins/com.android.ide.eclipse.monitor/src/com/android/ide/eclipse/monitor/actions/AvdManagerAction.java
deleted file mode 100644
index 2510bd3..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.monitor/src/com/android/ide/eclipse/monitor/actions/AvdManagerAction.java
+++ /dev/null
@@ -1,24 +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.eclipse.monitor.actions;
-
-public class AvdManagerAction extends SdkManagerAction {
-    @Override
-    protected String getAndroidBatArgument() {
-        return "avd";
-    }
-}
\ No newline at end of file
diff --git a/eclipse/plugins/com.android.ide.eclipse.monitor/src/com/android/ide/eclipse/monitor/actions/SdkManagerAction.java b/eclipse/plugins/com.android.ide.eclipse.monitor/src/com/android/ide/eclipse/monitor/actions/SdkManagerAction.java
deleted file mode 100644
index 573ed7c..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.monitor/src/com/android/ide/eclipse/monitor/actions/SdkManagerAction.java
+++ /dev/null
@@ -1,79 +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.eclipse.monitor.actions;
-
-import com.android.SdkConstants;
-import com.android.ide.eclipse.monitor.MonitorPlugin;
-
-import org.eclipse.core.runtime.Status;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.dialogs.ErrorDialog;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.IWorkbenchWindowActionDelegate;
-import org.eclipse.ui.PlatformUI;
-
-import java.io.File;
-import java.io.IOException;
-
-public class SdkManagerAction implements IWorkbenchWindowActionDelegate {
-    @Override
-    public void run(IAction action) {
-        File sdk = MonitorPlugin.getDefault().getSdkFolder();
-        if (sdk != null) {
-            File tools = new File(sdk, SdkConstants.FD_TOOLS);
-            File androidBat = new File(tools, SdkConstants.androidCmdName());
-            if (androidBat.exists()) {
-                String[] cmd = new String[] {
-                        androidBat.getAbsolutePath(),
-                        getAndroidBatArgument(),
-                        };
-                try {
-                    Runtime.getRuntime().exec(cmd);
-                } catch (IOException e) {
-                    IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
-                    if (window != null) {
-                        ErrorDialog.openError(
-                            window.getShell(),
-                            "Monitor",
-                            "Error while launching SDK Manager",
-                            new Status(Status.ERROR,
-                                    MonitorPlugin.PLUGIN_ID,
-                                    "Error while launching SDK Manager",
-                                    e));
-                    }
-                }
-            }
-        }
-    }
-
-    protected String getAndroidBatArgument() {
-        return "sdk";
-    }
-
-    @Override
-    public void selectionChanged(IAction action, ISelection selection) {
-    }
-
-    @Override
-    public void dispose() {
-    }
-
-    @Override
-    public void init(IWorkbenchWindow window) {
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.monitor/src/com/android/ide/eclipse/monitor/ddms/DebugPortProvider.java b/eclipse/plugins/com.android.ide.eclipse.monitor/src/com/android/ide/eclipse/monitor/ddms/DebugPortProvider.java
deleted file mode 100644
index a2ffa04..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.monitor/src/com/android/ide/eclipse/monitor/ddms/DebugPortProvider.java
+++ /dev/null
@@ -1,165 +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.eclipse.monitor.ddms;
-
-import com.android.ddmlib.DebugPortManager.IDebugPortProvider;
-import com.android.ddmlib.IDevice;
-import com.android.ide.eclipse.ddms.DdmsPlugin;
-
-import org.eclipse.jface.preference.IPreferenceStore;
-
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Set;
-
-/**
- * DDMS implementation of the IDebugPortProvider interface.
- * This class handles saving/loading the list of static debug port from
- * the preference store and provides the port number to the Device Monitor.
- */
-public class DebugPortProvider implements IDebugPortProvider {
-
-    private static DebugPortProvider sThis  = new DebugPortProvider();
-
-    /** Preference name for the static port list. */
-    public static final String PREFS_STATIC_PORT_LIST = "android.staticPortList"; //$NON-NLS-1$
-
-    /**
-     * Mapping device serial numbers to maps. The embedded maps are mapping application names to
-     * debugger ports.
-     */
-    private Map<String, Map<String, Integer>> mMap;
-
-    public static DebugPortProvider getInstance() {
-        return sThis;
-    }
-
-    private DebugPortProvider() {
-        computePortList();
-    }
-
-    /**
-         * Returns a static debug port for the specified application running on the
-         * specified {@link IDevice}.
-         * @param device The device the application is running on.
-         * @param appName The application name, as defined in the
-         *  AndroidManifest.xml package attribute.
-         * @return The static debug port or {@link #NO_STATIC_PORT} if there is none setup.
-     *
-     * @see IDebugPortProvider#getPort(IDevice, String)
-     */
-    @Override
-    public int getPort(IDevice device, String appName) {
-        if (mMap != null) {
-            Map<String, Integer> deviceMap = mMap.get(device.getSerialNumber());
-            if (deviceMap != null) {
-                Integer i = deviceMap.get(appName);
-                if (i != null) {
-                    return i.intValue();
-                }
-            }
-        }
-        return IDebugPortProvider.NO_STATIC_PORT;
-    }
-
-    /**
-     * Returns the map of Static debugger ports. The map links device serial numbers to
-     * a map linking application name to debugger ports.
-     */
-    public Map<String, Map<String, Integer>> getPortList() {
-        return mMap;
-    }
-
-    /**
-     * Create the map member from the values contained in the Preference Store.
-     */
-    private void computePortList() {
-        mMap = new HashMap<String, Map<String, Integer>>();
-
-        // get the prefs store
-        IPreferenceStore store = DdmsPlugin.getDefault().getPreferenceStore();
-        String value = store.getString(PREFS_STATIC_PORT_LIST);
-
-        if (value != null && value.length() > 0) {
-            // format is
-            // port1|port2|port3|...
-            // where port# is
-            // appPackageName:appPortNumber:device-serial-number
-            String[] portSegments = value.split("\\|");  //$NON-NLS-1$
-            for (String seg : portSegments) {
-                String[] entry = seg.split(":");  //$NON-NLS-1$
-
-                // backward compatibility support. if we have only 2 entry, we default
-                // to the first emulator.
-                String deviceName = null;
-                if (entry.length == 3) {
-                    deviceName = entry[2];
-                } else {
-                    deviceName = IDevice.FIRST_EMULATOR_SN;
-                }
-
-                // get the device map
-                Map<String, Integer> deviceMap = mMap.get(deviceName);
-                if (deviceMap == null) {
-                    deviceMap = new HashMap<String, Integer>();
-                    mMap.put(deviceName, deviceMap);
-                }
-
-                deviceMap.put(entry[0], Integer.valueOf(entry[1]));
-            }
-        }
-    }
-
-    /**
-     * Sets new [device, app, port] values.
-     * The values are also sync'ed in the preference store.
-     * @param map The map containing the new values.
-     */
-    public void setPortList(Map<String, Map<String,Integer>> map) {
-        // update the member map.
-        mMap.clear();
-        mMap.putAll(map);
-
-        // create the value to store in the preference store.
-        // see format definition in getPortList
-        StringBuilder sb = new StringBuilder();
-
-        Set<String> deviceKeys = map.keySet();
-        for (String deviceKey : deviceKeys) {
-            Map<String, Integer> deviceMap = map.get(deviceKey);
-            if (deviceMap != null) {
-                Set<String> appKeys = deviceMap.keySet();
-
-                for (String appKey : appKeys) {
-                    Integer port = deviceMap.get(appKey);
-                    if (port != null) {
-                        sb.append(appKey).append(':').append(port.intValue()).append(':').
-                            append(deviceKey).append('|');
-                    }
-                }
-            }
-        }
-
-        String value = sb.toString();
-
-        // get the prefs store.
-        IPreferenceStore store = DdmsPlugin.getDefault().getPreferenceStore();
-
-        // and give it the new value.
-        store.setValue(PREFS_STATIC_PORT_LIST, value);
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.monitor/src/com/android/ide/eclipse/monitor/ddms/StaticPortConfigDialog.java b/eclipse/plugins/com.android.ide.eclipse.monitor/src/com/android/ide/eclipse/monitor/ddms/StaticPortConfigDialog.java
deleted file mode 100644
index 456cdcf..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.monitor/src/com/android/ide/eclipse/monitor/ddms/StaticPortConfigDialog.java
+++ /dev/null
@@ -1,396 +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.eclipse.monitor.ddms;
-
-import com.android.ddmuilib.TableHelper;
-import com.android.ide.eclipse.ddms.DdmsPlugin;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.graphics.Rectangle;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Dialog;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.Listener;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.swt.widgets.TableItem;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Set;
-
-/**
- * Dialog to configure the static debug ports.
- *
- */
-public class StaticPortConfigDialog extends Dialog {
-
-    /** Preference name for the 0th column width */
-    private static final String PREFS_DEVICE_COL = "spcd.deviceColumn"; //$NON-NLS-1$
-
-    /** Preference name for the 1st column width */
-    private static final String PREFS_APP_COL = "spcd.AppColumn"; //$NON-NLS-1$
-
-    /** Preference name for the 2nd column width */
-    private static final String PREFS_PORT_COL = "spcd.PortColumn"; //$NON-NLS-1$
-
-    private static final int COL_DEVICE = 0;
-    private static final int COL_APPLICATION = 1;
-    private static final int COL_PORT = 2;
-
-
-    private static final int DLG_WIDTH = 500;
-    private static final int DLG_HEIGHT = 300;
-
-    private Shell mShell;
-    private Shell mParent;
-
-    private Table mPortTable;
-
-    /**
-     * Array containing the list of already used static port to avoid
-     * duplication.
-     */
-    private ArrayList<Integer> mPorts = new ArrayList<Integer>();
-
-    /**
-     * Basic constructor.
-     * @param parent
-     */
-    public StaticPortConfigDialog(Shell parent) {
-        super(parent, SWT.DIALOG_TRIM | SWT.BORDER | SWT.APPLICATION_MODAL);
-    }
-
-    /**
-     * Open and display the dialog. This method returns only when the
-     * user closes the dialog somehow.
-     *
-     */
-    public void open() {
-        createUI();
-
-        if (mParent == null || mShell == null) {
-            return;
-        }
-
-        updateFromStore();
-
-        // Set the dialog size.
-        mShell.setMinimumSize(DLG_WIDTH, DLG_HEIGHT);
-        Rectangle r = mParent.getBounds();
-        // get the center new top left.
-        int cx = r.x + r.width/2;
-        int x = cx - DLG_WIDTH / 2;
-        int cy = r.y + r.height/2;
-        int y = cy - DLG_HEIGHT / 2;
-        mShell.setBounds(x, y, DLG_WIDTH, DLG_HEIGHT);
-
-        mShell.pack();
-
-        // actually open the dialog
-        mShell.open();
-
-        // event loop until the dialog is closed.
-        Display display = mParent.getDisplay();
-        while (!mShell.isDisposed()) {
-            if (!display.readAndDispatch())
-                display.sleep();
-        }
-    }
-
-    /**
-     * Creates the dialog ui.
-     */
-    private void createUI() {
-        mParent = getParent();
-        mShell = new Shell(mParent, getStyle());
-        mShell.setText("Static Port Configuration");
-
-        mShell.setLayout(new GridLayout(1, true));
-
-        mShell.addListener(SWT.Close, new Listener() {
-            @Override
-            public void handleEvent(Event event) {
-                event.doit = true;
-            }
-        });
-
-        // center part with the list on the left and the buttons
-        // on the right.
-        Composite main = new Composite(mShell, SWT.NONE);
-        main.setLayoutData(new GridData(GridData.FILL_BOTH));
-        main.setLayout(new GridLayout(2, false));
-
-        // left part: list view
-        mPortTable = new Table(main, SWT.SINGLE | SWT.FULL_SELECTION);
-        mPortTable.setLayoutData(new GridData(GridData.FILL_BOTH));
-        mPortTable.setHeaderVisible(true);
-        mPortTable.setLinesVisible(true);
-
-        TableHelper.createTableColumn(mPortTable, "Device Serial Number",
-                SWT.LEFT, "emulator-5554", //$NON-NLS-1$
-                PREFS_DEVICE_COL, DdmsPlugin.getDefault().getPreferenceStore());
-
-        TableHelper.createTableColumn(mPortTable, "Application Package",
-                SWT.LEFT, "com.android.samples.phone", //$NON-NLS-1$
-                PREFS_APP_COL, DdmsPlugin.getDefault().getPreferenceStore());
-
-        TableHelper.createTableColumn(mPortTable, "Debug Port",
-                SWT.RIGHT, "Debug Port", //$NON-NLS-1$
-                PREFS_PORT_COL, DdmsPlugin.getDefault().getPreferenceStore());
-
-        // right part: buttons
-        Composite buttons = new Composite(main, SWT.NONE);
-        buttons.setLayoutData(new GridData(GridData.FILL_VERTICAL));
-        buttons.setLayout(new GridLayout(1, true));
-
-        Button newButton = new Button(buttons, SWT.NONE);
-        newButton.setText("New...");
-        newButton.addSelectionListener(new SelectionAdapter() {
-            @Override
-            public void widgetSelected(SelectionEvent e) {
-                StaticPortEditDialog dlg = new StaticPortEditDialog(mShell,
-                        mPorts);
-                if (dlg.open()) {
-                    // get the text
-                    String device = dlg.getDeviceSN();
-                    String app = dlg.getAppName();
-                    int port = dlg.getPortNumber();
-
-                    // add it to the list
-                    addEntry(device, app, port);
-                }
-            }
-        });
-
-        final Button editButton = new Button(buttons, SWT.NONE);
-        editButton.setText("Edit...");
-        editButton.setEnabled(false);
-        editButton.addSelectionListener(new SelectionAdapter() {
-            @Override
-            public void widgetSelected(SelectionEvent e) {
-                int index = mPortTable.getSelectionIndex();
-                String oldDeviceName = getDeviceName(index);
-                String oldAppName = getAppName(index);
-                String oldPortNumber = getPortNumber(index);
-                StaticPortEditDialog dlg = new StaticPortEditDialog(mShell,
-                        mPorts, oldDeviceName, oldAppName, oldPortNumber);
-                if (dlg.open()) {
-                    // get the text
-                    String deviceName = dlg.getDeviceSN();
-                    String app = dlg.getAppName();
-                    int port = dlg.getPortNumber();
-
-                    // add it to the list
-                    replaceEntry(index, deviceName, app, port);
-                }
-            }
-        });
-
-        final Button deleteButton = new Button(buttons, SWT.NONE);
-        deleteButton.setText("Delete");
-        deleteButton.setEnabled(false);
-        deleteButton.addSelectionListener(new SelectionAdapter() {
-            @Override
-            public void widgetSelected(SelectionEvent e) {
-                int index = mPortTable.getSelectionIndex();
-                removeEntry(index);
-            }
-        });
-
-        // bottom part with the ok/cancel
-        Composite bottomComp = new Composite(mShell, SWT.NONE);
-        bottomComp.setLayoutData(new GridData(
-                GridData.HORIZONTAL_ALIGN_CENTER));
-        bottomComp.setLayout(new GridLayout(2, true));
-
-        Button okButton = new Button(bottomComp, SWT.NONE);
-        okButton.setText("OK");
-        okButton.addSelectionListener(new SelectionAdapter() {
-            @Override
-            public void widgetSelected(SelectionEvent e) {
-                updateStore();
-                mShell.close();
-            }
-        });
-
-        Button cancelButton = new Button(bottomComp, SWT.NONE);
-        cancelButton.setText("Cancel");
-        cancelButton.addSelectionListener(new SelectionAdapter() {
-            @Override
-            public void widgetSelected(SelectionEvent e) {
-                mShell.close();
-            }
-        });
-
-        mPortTable.addSelectionListener(new SelectionAdapter() {
-            @Override
-            public void widgetSelected(SelectionEvent e) {
-                // get the selection index
-                int index = mPortTable.getSelectionIndex();
-
-                boolean enabled = index != -1;
-                editButton.setEnabled(enabled);
-                deleteButton.setEnabled(enabled);
-            }
-        });
-
-        mShell.pack();
-
-    }
-
-    /**
-     * Add a new entry in the list.
-     * @param deviceName the serial number of the device
-     * @param appName java package for the application
-     * @param portNumber port number
-     */
-    private void addEntry(String deviceName, String appName, int portNumber) {
-        // create a new item for the table
-        TableItem item = new TableItem(mPortTable, SWT.NONE);
-
-        item.setText(COL_DEVICE, deviceName);
-        item.setText(COL_APPLICATION, appName);
-        item.setText(COL_PORT, Integer.toString(portNumber));
-
-        // add the port to the list of port number used.
-        mPorts.add(portNumber);
-    }
-
-    /**
-     * Remove an entry from the list.
-     * @param index The index of the entry to be removed
-     */
-    private void removeEntry(int index) {
-        // remove from the ui
-        mPortTable.remove(index);
-
-        // and from the port list.
-        mPorts.remove(index);
-    }
-
-    /**
-     * Replace an entry in the list with new values.
-     * @param index The index of the item to be replaced
-     * @param deviceName the serial number of the device
-     * @param appName The new java package for the application
-     * @param portNumber The new port number.
-     */
-    private void replaceEntry(int index, String deviceName, String appName, int portNumber) {
-        // get the table item by index
-        TableItem item = mPortTable.getItem(index);
-
-        // set its new value
-        item.setText(COL_DEVICE, deviceName);
-        item.setText(COL_APPLICATION, appName);
-        item.setText(COL_PORT, Integer.toString(portNumber));
-
-        // and replace the port number in the port list.
-        mPorts.set(index, portNumber);
-    }
-
-
-    /**
-     * Returns the device name for a specific index
-     * @param index The index
-     * @return the java package name of the application
-     */
-    private String getDeviceName(int index) {
-        TableItem item = mPortTable.getItem(index);
-        return item.getText(COL_DEVICE);
-    }
-
-    /**
-     * Returns the application name for a specific index
-     * @param index The index
-     * @return the java package name of the application
-     */
-    private String getAppName(int index) {
-        TableItem item = mPortTable.getItem(index);
-        return item.getText(COL_APPLICATION);
-    }
-
-    /**
-     * Returns the port number for a specific index
-     * @param index The index
-     * @return the port number
-     */
-    private String getPortNumber(int index) {
-        TableItem item = mPortTable.getItem(index);
-        return item.getText(COL_PORT);
-    }
-
-    /**
-     * Updates the ui from the value in the preference store.
-     */
-    private void updateFromStore() {
-        // get the map from the debug port manager
-        DebugPortProvider provider = DebugPortProvider.getInstance();
-        Map<String, Map<String, Integer>> map = provider.getPortList();
-
-        // we're going to loop on the keys and fill the table.
-        Set<String> deviceKeys = map.keySet();
-
-        for (String deviceKey : deviceKeys) {
-            Map<String, Integer> deviceMap = map.get(deviceKey);
-            if (deviceMap != null) {
-                Set<String> appKeys = deviceMap.keySet();
-
-                for (String appKey : appKeys) {
-                    Integer port = deviceMap.get(appKey);
-                    if (port != null) {
-                        addEntry(deviceKey, appKey, port);
-                    }
-                }
-            }
-        }
-    }
-
-    /**
-     * Update the store from the content of the ui.
-     */
-    private void updateStore() {
-        // create a new Map object and fill it.
-        HashMap<String, Map<String, Integer>> map = new HashMap<String, Map<String, Integer>>();
-
-        int count = mPortTable.getItemCount();
-
-        for (int i = 0 ; i < count ; i++) {
-            TableItem item = mPortTable.getItem(i);
-            String deviceName = item.getText(COL_DEVICE);
-
-            Map<String, Integer> deviceMap = map.get(deviceName);
-            if (deviceMap == null) {
-                deviceMap = new HashMap<String, Integer>();
-                map.put(deviceName, deviceMap);
-            }
-
-            deviceMap.put(item.getText(COL_APPLICATION), Integer.valueOf(item.getText(COL_PORT)));
-        }
-
-        // set it in the store through the debug port manager.
-        DebugPortProvider provider = DebugPortProvider.getInstance();
-        provider.setPortList(map);
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.monitor/src/com/android/ide/eclipse/monitor/ddms/StaticPortEditDialog.java b/eclipse/plugins/com.android.ide.eclipse.monitor/src/com/android/ide/eclipse/monitor/ddms/StaticPortEditDialog.java
deleted file mode 100644
index a9b0cd4..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.monitor/src/com/android/ide/eclipse/monitor/ddms/StaticPortEditDialog.java
+++ /dev/null
@@ -1,334 +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.eclipse.monitor.ddms;
-
-import com.android.ddmlib.IDevice;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.graphics.Rectangle;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Dialog;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Listener;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Text;
-
-import java.util.ArrayList;
-
-/**
- * Small dialog box to edit a static port number.
- */
-public class StaticPortEditDialog extends Dialog {
-
-    private static final int DLG_WIDTH = 400;
-    private static final int DLG_HEIGHT = 200;
-
-    private Shell mParent;
-
-    private Shell mShell;
-
-    private boolean mOk = false;
-
-    private String mAppName;
-
-    private String mPortNumber;
-
-    private Button mOkButton;
-
-    private Label mWarning;
-
-    /** List of ports already in use */
-    private ArrayList<Integer> mPorts;
-
-    /** This is the port being edited. */
-    private int mEditPort = -1;
-    private String mDeviceSn;
-
-    /**
-     * Creates a dialog with empty fields.
-     * @param parent The parent Shell
-     * @param ports The list of already used port numbers.
-     */
-    public StaticPortEditDialog(Shell parent, ArrayList<Integer> ports) {
-        super(parent, SWT.DIALOG_TRIM | SWT.BORDER | SWT.APPLICATION_MODAL);
-        mPorts = ports;
-        mDeviceSn = IDevice.FIRST_EMULATOR_SN;
-    }
-
-    /**
-     * Creates a dialog with predefined values.
-     * @param shell The parent shell
-     * @param ports The list of already used port numbers.
-     * @param oldDeviceSN the device serial number to display
-     * @param oldAppName The application name to display
-     * @param oldPortNumber The port number to display
-     */
-    public StaticPortEditDialog(Shell shell, ArrayList<Integer> ports,
-            String oldDeviceSN, String oldAppName, String oldPortNumber) {
-        this(shell, ports);
-
-        mDeviceSn = oldDeviceSN;
-        mAppName = oldAppName;
-        mPortNumber = oldPortNumber;
-        mEditPort = Integer.valueOf(mPortNumber);
-    }
-
-    /**
-     * Opens the dialog. The method will return when the user closes the dialog
-     * somehow.
-     *
-     * @return true if ok was pressed, false if cancelled.
-     */
-    public boolean open() {
-        createUI();
-
-        if (mParent == null || mShell == null) {
-            return false;
-        }
-
-        mShell.setMinimumSize(DLG_WIDTH, DLG_HEIGHT);
-        Rectangle r = mParent.getBounds();
-        // get the center new top left.
-        int cx = r.x + r.width/2;
-        int x = cx - DLG_WIDTH / 2;
-        int cy = r.y + r.height/2;
-        int y = cy - DLG_HEIGHT / 2;
-        mShell.setBounds(x, y, DLG_WIDTH, DLG_HEIGHT);
-
-        mShell.open();
-
-        Display display = mParent.getDisplay();
-        while (!mShell.isDisposed()) {
-            if (!display.readAndDispatch())
-                display.sleep();
-        }
-
-        return mOk;
-    }
-
-    public String getDeviceSN() {
-        return mDeviceSn;
-    }
-
-    public String getAppName() {
-        return mAppName;
-    }
-
-    public int getPortNumber() {
-        return Integer.valueOf(mPortNumber);
-    }
-
-    private void createUI() {
-        mParent = getParent();
-        mShell = new Shell(mParent, getStyle());
-        mShell.setText("Static Port");
-
-        mShell.setLayout(new GridLayout(1, false));
-
-        mShell.addListener(SWT.Close, new Listener() {
-            @Override
-            public void handleEvent(Event event) {
-            }
-        });
-
-        // center part with the edit field
-        Composite main = new Composite(mShell, SWT.NONE);
-        main.setLayoutData(new GridData(GridData.FILL_BOTH));
-        main.setLayout(new GridLayout(2, false));
-
-        Label l0 = new Label(main, SWT.NONE);
-        l0.setText("Device Name:");
-
-        final Text deviceSNText = new Text(main, SWT.SINGLE | SWT.BORDER);
-        deviceSNText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-        if (mDeviceSn != null) {
-            deviceSNText.setText(mDeviceSn);
-        }
-        deviceSNText.addModifyListener(new ModifyListener() {
-            @Override
-            public void modifyText(ModifyEvent e) {
-                mDeviceSn = deviceSNText.getText().trim();
-                validate();
-            }
-        });
-
-        Label l = new Label(main, SWT.NONE);
-        l.setText("Application Name:");
-
-        final Text appNameText = new Text(main, SWT.SINGLE | SWT.BORDER);
-        if (mAppName != null) {
-            appNameText.setText(mAppName);
-        }
-        appNameText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-        appNameText.addModifyListener(new ModifyListener() {
-            @Override
-            public void modifyText(ModifyEvent e) {
-                mAppName = appNameText.getText().trim();
-                validate();
-            }
-        });
-
-        Label l2 = new Label(main, SWT.NONE);
-        l2.setText("Debug Port:");
-
-        final Text debugPortText = new Text(main, SWT.SINGLE | SWT.BORDER);
-        if (mPortNumber != null) {
-            debugPortText.setText(mPortNumber);
-        }
-        debugPortText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-        debugPortText.addModifyListener(new ModifyListener() {
-            @Override
-            public void modifyText(ModifyEvent e) {
-                mPortNumber = debugPortText.getText().trim();
-                validate();
-            }
-        });
-
-        // warning label
-        Composite warningComp = new Composite(mShell, SWT.NONE);
-        warningComp.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-        warningComp.setLayout(new GridLayout(1, true));
-
-        mWarning = new Label(warningComp, SWT.NONE);
-        mWarning.setText("");
-        mWarning.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-
-        // bottom part with the ok/cancel
-        Composite bottomComp = new Composite(mShell, SWT.NONE);
-        bottomComp
-                .setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_CENTER));
-        bottomComp.setLayout(new GridLayout(2, true));
-
-        mOkButton = new Button(bottomComp, SWT.NONE);
-        mOkButton.setText("OK");
-        mOkButton.addSelectionListener(new SelectionAdapter() {
-            @Override
-            public void widgetSelected(SelectionEvent e) {
-                mOk = true;
-                mShell.close();
-            }
-        });
-        mOkButton.setEnabled(false);
-        mShell.setDefaultButton(mOkButton);
-
-        Button cancelButton = new Button(bottomComp, SWT.NONE);
-        cancelButton.setText("Cancel");
-        cancelButton.addSelectionListener(new SelectionAdapter() {
-            @Override
-            public void widgetSelected(SelectionEvent e) {
-                mShell.close();
-            }
-        });
-
-        validate();
-    }
-
-    /**
-     * Validates the content of the 2 text fields and enable/disable "ok", while
-     * setting up the warning/error message.
-     */
-    private void validate() {
-        // first we reset the warning dialog. This allows us to latter
-        // display warnings.
-        mWarning.setText(""); //$NON-NLS-1$
-
-        // check the device name field is not empty
-        if (mDeviceSn == null || mDeviceSn.length() == 0) {
-            mWarning.setText("Device name missing.");
-            mOkButton.setEnabled(false);
-            return;
-        }
-
-        // check the application name field is not empty
-        if (mAppName == null || mAppName.length() == 0) {
-            mWarning.setText("Application name missing.");
-            mOkButton.setEnabled(false);
-            return;
-        }
-
-        String packageError = "Application name must be a valid Java package name.";
-
-        // validate the package name as well. It must be a fully qualified
-        // java package.
-        String[] packageSegments = mAppName.split("\\."); //$NON-NLS-1$
-        for (String p : packageSegments) {
-            if (p.matches("^[a-zA-Z][a-zA-Z0-9]*") == false) { //$NON-NLS-1$
-                mWarning.setText(packageError);
-                mOkButton.setEnabled(false);
-                return;
-            }
-
-            // lets also display a warning if the package contains upper case
-            // letters.
-            if (p.matches("^[a-z][a-z0-9]*") == false) { //$NON-NLS-1$
-                mWarning.setText("Lower case is recommended for Java packages.");
-            }
-        }
-
-        // the split will not detect the last char being a '.'
-        // so we test it manually
-        if (mAppName.charAt(mAppName.length()-1) == '.') {
-            mWarning.setText(packageError);
-            mOkButton.setEnabled(false);
-            return;
-        }
-
-        // now we test the package name field is not empty.
-        if (mPortNumber == null || mPortNumber.length() == 0) {
-            mWarning.setText("Port Number missing.");
-            mOkButton.setEnabled(false);
-            return;
-        }
-
-        // then we check it only contains digits.
-        if (mPortNumber.matches("[0-9]*") == false) { //$NON-NLS-1$
-            mWarning.setText("Port Number invalid.");
-            mOkButton.setEnabled(false);
-            return;
-        }
-
-        // get the int from the port number to validate
-        long port = Long.valueOf(mPortNumber);
-        if (port >= 32767) {
-            mOkButton.setEnabled(false);
-            return;
-        }
-
-        // check if its in the list of already used ports
-        if (port != mEditPort) {
-            for (Integer i : mPorts) {
-                if (port == i.intValue()) {
-                    mWarning.setText("Port already in use.");
-                    mOkButton.setEnabled(false);
-                    return;
-                }
-            }
-        }
-
-        // at this point there's not error, so we enable the ok button.
-        mOkButton.setEnabled(true);
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.monitor/src/com/android/ide/eclipse/monitor/handlers/StaticPortConfigHandler.java b/eclipse/plugins/com.android.ide.eclipse.monitor/src/com/android/ide/eclipse/monitor/handlers/StaticPortConfigHandler.java
deleted file mode 100644
index ff63aca..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.monitor/src/com/android/ide/eclipse/monitor/handlers/StaticPortConfigHandler.java
+++ /dev/null
@@ -1,33 +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.eclipse.monitor.handlers;
-
-import com.android.ide.eclipse.monitor.ddms.StaticPortConfigDialog;
-
-import org.eclipse.core.commands.AbstractHandler;
-import org.eclipse.core.commands.ExecutionEvent;
-import org.eclipse.core.commands.ExecutionException;
-import org.eclipse.ui.handlers.HandlerUtil;
-
-public class StaticPortConfigHandler extends AbstractHandler {
-    @Override
-    public Object execute(ExecutionEvent event) throws ExecutionException {
-        StaticPortConfigDialog dlg = new StaticPortConfigDialog(HandlerUtil.getActiveShell(event));
-        dlg.open();
-        return null;
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.ndk/.classpath b/eclipse/plugins/com.android.ide.eclipse.ndk/.classpath
deleted file mode 100644
index 36a1bda..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.ndk/.classpath
+++ /dev/null
@@ -1,10 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="output" path="bin"/>
-    <classpathentry combineaccessrules="false" kind="src" path="/ddmlib"/>
-    <classpathentry combineaccessrules="false" kind="src" path="/ddmuilib"/>
-    <classpathentry combineaccessrules="false" kind="src" path="/sdklib"/>
-</classpath>
diff --git a/eclipse/plugins/com.android.ide.eclipse.ndk/.project b/eclipse/plugins/com.android.ide.eclipse.ndk/.project
deleted file mode 100644
index 416aa2e..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.ndk/.project
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>plugin-ndk</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.PluginNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/eclipse/plugins/com.android.ide.eclipse.ndk/.settings/org.eclipse.jdt.core.prefs b/eclipse/plugins/com.android.ide.eclipse.ndk/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index ea66196..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.ndk/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,98 +0,0 @@
-eclipse.preferences.version=1
-org.eclipse.jdt.core.compiler.annotation.missingNonNullByDefaultAnnotation=ignore
-org.eclipse.jdt.core.compiler.annotation.nonnull=com.android.annotations.NonNull
-org.eclipse.jdt.core.compiler.annotation.nonnullbydefault=com.android.annotations.NonNullByDefault
-org.eclipse.jdt.core.compiler.annotation.nonnullisdefault=disabled
-org.eclipse.jdt.core.compiler.annotation.nullable=com.android.annotations.Nullable
-org.eclipse.jdt.core.compiler.annotation.nullanalysis=enabled
-org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6
-org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.6
-org.eclipse.jdt.core.compiler.debug.lineNumber=generate
-org.eclipse.jdt.core.compiler.debug.localVariable=generate
-org.eclipse.jdt.core.compiler.debug.sourceFile=generate
-org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
-org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
-org.eclipse.jdt.core.compiler.problem.comparingIdentical=warning
-org.eclipse.jdt.core.compiler.problem.deadCode=warning
-org.eclipse.jdt.core.compiler.problem.deprecation=warning
-org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
-org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
-org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
-org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=ignore
-org.eclipse.jdt.core.compiler.problem.fallthroughCase=warning
-org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
-org.eclipse.jdt.core.compiler.problem.fieldHiding=warning
-org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
-org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
-org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
-org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
-org.eclipse.jdt.core.compiler.problem.includeNullInfoFromAsserts=enabled
-org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
-org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=warning
-org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
-org.eclipse.jdt.core.compiler.problem.localVariableHiding=warning
-org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
-org.eclipse.jdt.core.compiler.problem.missingDefaultCase=ignore
-org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=warning
-org.eclipse.jdt.core.compiler.problem.missingEnumCaseDespiteDefault=disabled
-org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=warning
-org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=error
-org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled
-org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
-org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=ignore
-org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
-org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
-org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore
-org.eclipse.jdt.core.compiler.problem.nullAnnotationInferenceConflict=warning
-org.eclipse.jdt.core.compiler.problem.nullReference=warning
-org.eclipse.jdt.core.compiler.problem.nullSpecInsufficientInfo=warning
-org.eclipse.jdt.core.compiler.problem.nullSpecViolation=warning
-org.eclipse.jdt.core.compiler.problem.nullUncheckedConversion=ignore
-org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
-org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
-org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=warning
-org.eclipse.jdt.core.compiler.problem.potentialNullReference=warning
-org.eclipse.jdt.core.compiler.problem.potentialNullSpecViolation=error
-org.eclipse.jdt.core.compiler.problem.potentiallyUnclosedCloseable=warning
-org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
-org.eclipse.jdt.core.compiler.problem.redundantNullAnnotation=warning
-org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
-org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=ignore
-org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=warning
-org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=ignore
-org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=ignore
-org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
-org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
-org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=enabled
-org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
-org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
-org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
-org.eclipse.jdt.core.compiler.problem.unavoidableGenericTypeProblems=disabled
-org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
-org.eclipse.jdt.core.compiler.problem.unclosedCloseable=error
-org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
-org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
-org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=warning
-org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=warning
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.unusedImport=warning
-org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
-org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
-org.eclipse.jdt.core.compiler.problem.unusedObjectAllocation=warning
-org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
-org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
-org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
-org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
-org.eclipse.jdt.core.compiler.source=1.6
diff --git a/eclipse/plugins/com.android.ide.eclipse.ndk/META-INF/MANIFEST.MF b/eclipse/plugins/com.android.ide.eclipse.ndk/META-INF/MANIFEST.MF
deleted file mode 100644
index df1e88c..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.ndk/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,28 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: ADT CDT Integration
-Bundle-SymbolicName: com.android.ide.eclipse.ndk;singleton:=true
-Bundle-Version: 24.3.3.qualifier
-Bundle-Activator: com.android.ide.eclipse.ndk.internal.Activator
-Bundle-Vendor: The Android Open Source Project
-Require-Bundle: org.eclipse.core.runtime,
- org.eclipse.core.resources,
- org.eclipse.core.variables,
- org.eclipse.ui,
- org.eclipse.debug.core,
- org.eclipse.debug.ui,
- org.eclipse.cdt.core,
- org.eclipse.cdt.ui,
- org.eclipse.cdt.managedbuilder.core,
- org.eclipse.cdt.managedbuilder.ui,
- org.eclipse.cdt.debug.core,
- org.eclipse.cdt.debug.ui,
- org.eclipse.cdt.dsf,
- org.eclipse.cdt.dsf.gdb,
- org.eclipse.cdt.dsf.gdb.ui,
- org.eclipse.cdt.launch,
- com.android.ide.eclipse.adt,
- com.android.ide.eclipse.base,
- com.android.ide.eclipse.ddms
-Bundle-ActivationPolicy: lazy
-Bundle-ClassPath: .
diff --git a/eclipse/plugins/com.android.ide.eclipse.ndk/MODULE_LICENSE_EPL b/eclipse/plugins/com.android.ide.eclipse.ndk/MODULE_LICENSE_EPL
deleted file mode 100644
index e69de29..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.ndk/MODULE_LICENSE_EPL
+++ /dev/null
diff --git a/eclipse/plugins/com.android.ide.eclipse.ndk/NOTICE b/eclipse/plugins/com.android.ide.eclipse.ndk/NOTICE
deleted file mode 100644
index 49c101d..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.ndk/NOTICE
+++ /dev/null
@@ -1,224 +0,0 @@
-*Eclipse Public License - v 1.0*
-
-THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE
-PUBLIC LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION OF
-THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT.
-
-*1. DEFINITIONS*
-
-"Contribution" means:
-
-a) in the case of the initial Contributor, the initial code and
-documentation distributed under this Agreement, and
-b) in the case of each subsequent Contributor:
-
-i) changes to the Program, and
-
-ii) additions to the Program;
-
-where such changes and/or additions to the Program originate from and
-are distributed by that particular Contributor. A Contribution
-'originates' from a Contributor if it was added to the Program by such
-Contributor itself or anyone acting on such Contributor's behalf.
-Contributions do not include additions to the Program which: (i) are
-separate modules of software distributed in conjunction with the Program
-under their own license agreement, and (ii) are not derivative works of
-the Program.
-
-"Contributor" means any person or entity that distributes the Program.
-
-"Licensed Patents " mean patent claims licensable by a Contributor which
-are necessarily infringed by the use or sale of its Contribution alone
-or when combined with the Program.
-
-"Program" means the Contributions distributed in accordance with this
-Agreement.
-
-"Recipient" means anyone who receives the Program under this Agreement,
-including all Contributors.
-
-*2. GRANT OF RIGHTS*
-
-a) Subject to the terms of this Agreement, each Contributor hereby
-grants Recipient a non-exclusive, worldwide, royalty-free copyright
-license to reproduce, prepare derivative works of, publicly display,
-publicly perform, distribute and sublicense the Contribution of such
-Contributor, if any, and such derivative works, in source code and
-object code form.
-
-b) Subject to the terms of this Agreement, each Contributor hereby
-grants Recipient a non-exclusive, worldwide, royalty-free patent license
-under Licensed Patents to make, use, sell, offer to sell, import and
-otherwise transfer the Contribution of such Contributor, if any, in
-source code and object code form. This patent license shall apply to the
-combination of the Contribution and the Program if, at the time the
-Contribution is added by the Contributor, such addition of the
-Contribution causes such combination to be covered by the Licensed
-Patents. The patent license shall not apply to any other combinations
-which include the Contribution. No hardware per se is licensed hereunder.
-
-c) Recipient understands that although each Contributor grants the
-licenses to its Contributions set forth herein, no assurances are
-provided by any Contributor that the Program does not infringe the
-patent or other intellectual property rights of any other entity. Each
-Contributor disclaims any liability to Recipient for claims brought by
-any other entity based on infringement of intellectual property rights
-or otherwise. As a condition to exercising the rights and licenses
-granted hereunder, each Recipient hereby assumes sole responsibility to
-secure any other intellectual property rights needed, if any. For
-example, if a third party patent license is required to allow Recipient
-to distribute the Program, it is Recipient's responsibility to acquire
-that license before distributing the Program.
-
-d) Each Contributor represents that to its knowledge it has sufficient
-copyright rights in its Contribution, if any, to grant the copyright
-license set forth in this Agreement.
-
-*3. REQUIREMENTS*
-
-A Contributor may choose to distribute the Program in object code form
-under its own license agreement, provided that:
-
-a) it complies with the terms and conditions of this Agreement; and
-
-b) its license agreement:
-
-i) effectively disclaims on behalf of all Contributors all warranties
-and conditions, express and implied, including warranties or conditions
-of title and non-infringement, and implied warranties or conditions of
-merchantability and fitness for a particular purpose;
-
-ii) effectively excludes on behalf of all Contributors all liability for
-damages, including direct, indirect, special, incidental and
-consequential damages, such as lost profits;
-
-iii) states that any provisions which differ from this Agreement are
-offered by that Contributor alone and not by any other party; and
-
-iv) states that source code for the Program is available from such
-Contributor, and informs licensees how to obtain it in a reasonable
-manner on or through a medium customarily used for software exchange.
-
-When the Program is made available in source code form:
-
-a) it must be made available under this Agreement; and
-
-b) a copy of this Agreement must be included with each copy of the Program.
-
-Contributors may not remove or alter any copyright notices contained
-within the Program.
-
-Each Contributor must identify itself as the originator of its
-Contribution, if any, in a manner that reasonably allows subsequent
-Recipients to identify the originator of the Contribution.
-
-*4. COMMERCIAL DISTRIBUTION*
-
-Commercial distributors of software may accept certain responsibilities
-with respect to end users, business partners and the like. While this
-license is intended to facilitate the commercial use of the Program, the
-Contributor who includes the Program in a commercial product offering
-should do so in a manner which does not create potential liability for
-other Contributors. Therefore, if a Contributor includes the Program in
-a commercial product offering, such Contributor ("Commercial
-Contributor") hereby agrees to defend and indemnify every other
-Contributor ("Indemnified Contributor") against any losses, damages and
-costs (collectively "Losses") arising from claims, lawsuits and other
-legal actions brought by a third party against the Indemnified
-Contributor to the extent caused by the acts or omissions of such
-Commercial Contributor in connection with its distribution of the
-Program in a commercial product offering. The obligations in this
-section do not apply to any claims or Losses relating to any actual or
-alleged intellectual property infringement. In order to qualify, an
-Indemnified Contributor must: a) promptly notify the Commercial
-Contributor in writing of such claim, and b) allow the Commercial
-Contributor to control, and cooperate with the Commercial Contributor
-in, the defense and any related settlement negotiations. The Indemnified
-Contributor may participate in any such claim at its own expense.
-
-For example, a Contributor might include the Program in a commercial
-product offering, Product X. That Contributor is then a Commercial
-Contributor. If that Commercial Contributor then makes performance
-claims, or offers warranties related to Product X, those performance
-claims and warranties are such Commercial Contributor's responsibility
-alone. Under this section, the Commercial Contributor would have to
-defend claims against the other Contributors related to those
-performance claims and warranties, and if a court requires any other
-Contributor to pay any damages as a result, the Commercial Contributor
-must pay those damages.
-
-*5. NO WARRANTY*
-
-EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS PROVIDED
-ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
-EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES
-OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR
-A PARTICULAR PURPOSE. Each Recipient is solely responsible for
-determining the appropriateness of using and distributing the Program
-and assumes all risks associated with its exercise of rights under this
-Agreement , including but not limited to the risks and costs of program
-errors, compliance with applicable laws, damage to or loss of data,
-programs or equipment, and unavailability or interruption of operations.
-
-*6. DISCLAIMER OF LIABILITY*
-
-EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT NOR
-ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT,
-INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING
-WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF
-LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
-NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR
-DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED
-HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
-
-*7. GENERAL*
-
-If any provision of this Agreement is invalid or unenforceable under
-applicable law, it shall not affect the validity or enforceability of
-the remainder of the terms of this Agreement, and without further action
-by the parties hereto, such provision shall be reformed to the minimum
-extent necessary to make such provision valid and enforceable.
-
-If Recipient institutes patent litigation against any entity (including
-a cross-claim or counterclaim in a lawsuit) alleging that the Program
-itself (excluding combinations of the Program with other software or
-hardware) infringes such Recipient's patent(s), then such Recipient's
-rights granted under Section 2(b) shall terminate as of the date such
-litigation is filed.
-
-All Recipient's rights under this Agreement shall terminate if it fails
-to comply with any of the material terms or conditions of this Agreement
-and does not cure such failure in a reasonable period of time after
-becoming aware of such noncompliance. If all Recipient's rights under
-this Agreement terminate, Recipient agrees to cease use and distribution
-of the Program as soon as reasonably practicable. However, Recipient's
-obligations under this Agreement and any licenses granted by Recipient
-relating to the Program shall continue and survive.
-
-Everyone is permitted to copy and distribute copies of this Agreement,
-but in order to avoid inconsistency the Agreement is copyrighted and may
-only be modified in the following manner. The Agreement Steward reserves
-the right to publish new versions (including revisions) of this
-Agreement from time to time. No one other than the Agreement Steward has
-the right to modify this Agreement. The Eclipse Foundation is the
-initial Agreement Steward. The Eclipse Foundation may assign the
-responsibility to serve as the Agreement Steward to a suitable separate
-entity. Each new version of the Agreement will be given a distinguishing
-version number. The Program (including Contributions) may always be
-distributed subject to the version of the Agreement under which it was
-received. In addition, after a new version of the Agreement is
-published, Contributor may elect to distribute the Program (including
-its Contributions) under the new version. Except as expressly stated in
-Sections 2(a) and 2(b) above, Recipient receives no rights or licenses
-to the intellectual property of any Contributor under this Agreement,
-whether expressly, by implication, estoppel or otherwise. All rights in
-the Program not expressly granted under this Agreement are reserved.
-
-This Agreement is governed by the laws of the State of New York and the
-intellectual property laws of the United States of America. No party to
-this Agreement will bring a legal action under this Agreement more than
-one year after the cause of action arose. Each party waives its rights
-to a jury trial in any resulting litigation.
-
- 
-
diff --git a/eclipse/plugins/com.android.ide.eclipse.ndk/about.html b/eclipse/plugins/com.android.ide.eclipse.ndk/about.html
deleted file mode 100644
index bc621cb..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.ndk/about.html
+++ /dev/null
@@ -1,106 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
-    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
-<title>About</title>
-</head>
-<body lang="EN-US">
-<h2>About This Content</h2>
- 
-<p>September 19, 2010</p>	
-<h3>License</h3>
-
-<pre>
-      Eclipse Public License - v 1.0
-
-THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE PUBLIC LICENSE (&quot;AGREEMENT&quot;). ANY USE, REPRODUCTION OR DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT&apos;S ACCEPTANCE OF THIS AGREEMENT.
-
-1. DEFINITIONS
-
-&quot;Contribution&quot; means:
-
-a) in the case of the initial Contributor, the initial code and documentation distributed under this Agreement, and
-
-b) in the case of each subsequent Contributor:
-
-i) changes to the Program, and
-
-ii) additions to the Program;
-
-where such changes and/or additions to the Program originate from and are distributed by that particular Contributor. A Contribution &apos;originates&apos; from a Contributor if it was added to the Program by such Contributor itself or anyone acting on such Contributor&apos;s behalf. Contributions do not include additions to the Program which: (i) are separate modules of software distributed in conjunction with the Program under their own license agreement, and (ii) are not derivative works of the Program.
-
-&quot;Contributor&quot; means any person or entity that distributes the Program.
-
-&quot;Licensed Patents&quot; mean patent claims licensable by a Contributor which are necessarily infringed by the use or sale of its Contribution alone or when combined with the Program.
-
-&quot;Program&quot; means the Contributions distributed in accordance with this Agreement.
-
-&quot;Recipient&quot; means anyone who receives the Program under this Agreement, including all Contributors.
-
-2. GRANT OF RIGHTS
-
-a) Subject to the terms of this Agreement, each Contributor hereby grants Recipient a non-exclusive, worldwide, royalty-free copyright license to reproduce, prepare derivative works of, publicly display, publicly perform, distribute and sublicense the Contribution of such Contributor, if any, and such derivative works, in source code and object code form.
-
-b) Subject to the terms of this Agreement, each Contributor hereby grants Recipient a non-exclusive, worldwide, royalty-free patent license under Licensed Patents to make, use, sell, offer to sell, import and otherwise transfer the Contribution of such Contributor, if any, in source code and object code form. This patent license shall apply to the combination of the Contribution and the Program if, at the time the Contribution is added by the Contributor, such addition of the Contribution causes such combination to be covered by the Licensed Patents. The patent license shall not apply to any other combinations which include the Contribution. No hardware per se is licensed hereunder.
-
-c) Recipient understands that although each Contributor grants the licenses to its Contributions set forth herein, no assurances are provided by any Contributor that the Program does not infringe the patent or other intellectual property rights of any other entity. Each Contributor disclaims any liability to Recipient for claims brought by any other entity based on infringement of intellectual property rights or otherwise. As a condition to exercising the rights and licenses granted hereunder, each Recipient hereby assumes sole responsibility to secure any other intellectual property rights needed, if any. For example, if a third party patent license is required to allow Recipient to distribute the Program, it is Recipient&apos;s responsibility to acquire that license before distributing the Program.
-
-d) Each Contributor represents that to its knowledge it has sufficient copyright rights in its Contribution, if any, to grant the copyright license set forth in this Agreement.
-
-3. REQUIREMENTS
-
-A Contributor may choose to distribute the Program in object code form under its own license agreement, provided that:
-
-a) it complies with the terms and conditions of this Agreement; and
-
-b) its license agreement:
-
-i) effectively disclaims on behalf of all Contributors all warranties and conditions, express and implied, including warranties or conditions of title and non-infringement, and implied warranties or conditions of merchantability and fitness for a particular purpose;
-
-ii) effectively excludes on behalf of all Contributors all liability for damages, including direct, indirect, special, incidental and consequential damages, such as lost profits;
-
-iii) states that any provisions which differ from this Agreement are offered by that Contributor alone and not by any other party; and
-
-iv) states that source code for the Program is available from such Contributor, and informs licensees how to obtain it in a reasonable manner on or through a medium customarily used for software exchange.
-
-When the Program is made available in source code form:
-
-a) it must be made available under this Agreement; and
-
-b) a copy of this Agreement must be included with each copy of the Program.
-
-Contributors may not remove or alter any copyright notices contained within the Program.
-
-Each Contributor must identify itself as the originator of its Contribution, if any, in a manner that reasonably allows subsequent Recipients to identify the originator of the Contribution.
-
-4. COMMERCIAL DISTRIBUTION
-
-Commercial distributors of software may accept certain responsibilities with respect to end users, business partners and the like. While this license is intended to facilitate the commercial use of the Program, the Contributor who includes the Program in a commercial product offering should do so in a manner which does not create potential liability for other Contributors. Therefore, if a Contributor includes the Program in a commercial product offering, such Contributor (&quot;Commercial Contributor&quot;) hereby agrees to defend and indemnify every other Contributor (&quot;Indemnified Contributor&quot;) against any losses, damages and costs (collectively &quot;Losses&quot;) arising from claims, lawsuits and other legal actions brought by a third party against the Indemnified Contributor to the extent caused by the acts or omissions of such Commercial Contributor in connection with its distribution of the Program in a commercial product offering. The obligations in this section do not apply to any claims or Losses relating to any actual or alleged intellectual property infringement. In order to qualify, an Indemnified Contributor must: a) promptly notify the Commercial Contributor in writing of such claim, and b) allow the Commercial Contributor to control, and cooperate with the Commercial Contributor in, the defense and any related settlement negotiations. The Indemnified Contributor may participate in any such claim at its own expense.
-
-For example, a Contributor might include the Program in a commercial product offering, Product X. That Contributor is then a Commercial Contributor. If that Commercial Contributor then makes performance claims, or offers warranties related to Product X, those performance claims and warranties are such Commercial Contributor&apos;s responsibility alone. Under this section, the Commercial Contributor would have to defend claims against the other Contributors related to those performance claims and warranties, and if a court requires any other Contributor to pay any damages as a result, the Commercial Contributor must pay those damages.
-
-5. NO WARRANTY
-
-EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS PROVIDED ON AN &quot;AS IS&quot; BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely responsible for determining the appropriateness of using and distributing the Program and assumes all risks associated with its exercise of rights under this Agreement , including but not limited to the risks and costs of program errors, compliance with applicable laws, damage to or loss of data, programs or equipment, and unavailability or interruption of operations.
-
-6. DISCLAIMER OF LIABILITY
-
-EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
-
-7. GENERAL
-
-If any provision of this Agreement is invalid or unenforceable under applicable law, it shall not affect the validity or enforceability of the remainder of the terms of this Agreement, and without further action by the parties hereto, such provision shall be reformed to the minimum extent necessary to make such provision valid and enforceable.
-
-If Recipient institutes patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Program itself (excluding combinations of the Program with other software or hardware) infringes such Recipient&apos;s patent(s), then such Recipient&apos;s rights granted under Section 2(b) shall terminate as of the date such litigation is filed.
-
-All Recipient&apos;s rights under this Agreement shall terminate if it fails to comply with any of the material terms or conditions of this Agreement and does not cure such failure in a reasonable period of time after becoming aware of such noncompliance. If all Recipient&apos;s rights under this Agreement terminate, Recipient agrees to cease use and distribution of the Program as soon as reasonably practicable. However, Recipient&apos;s obligations under this Agreement and any licenses granted by Recipient relating to the Program shall continue and survive.
-
-Everyone is permitted to copy and distribute copies of this Agreement, but in order to avoid inconsistency the Agreement is copyrighted and may only be modified in the following manner. The Agreement Steward reserves the right to publish new versions (including revisions) of this Agreement from time to time. No one other than the Agreement Steward has the right to modify this Agreement. The Eclipse Foundation is the initial Agreement Steward. The Eclipse Foundation may assign the responsibility to serve as the Agreement Steward to a suitable separate entity. Each new version of the Agreement will be given a distinguishing version number. The Program (including Contributions) may always be distributed subject to the version of the Agreement under which it was received. In addition, after a new version of the Agreement is published, Contributor may elect to distribute the Program (including its Contributions) under the new version. Except as expressly stated in Sections 2(a) and 2(b) above, Recipient receives no rights or licenses to the intellectual property of any Contributor under this Agreement, whether expressly, by implication, estoppel or otherwise. All rights in the Program not expressly granted under this Agreement are reserved.
-
-This Agreement is governed by the laws of the State of New York and the intellectual property laws of the United States of America. No party to this Agreement will bring a legal action under this Agreement more than one year after the cause of action arose. Each party waives its rights to a jury trial in any resulting litigation.
-
-</pre>
-
-</body>
-</html>
diff --git a/eclipse/plugins/com.android.ide.eclipse.ndk/about.ini b/eclipse/plugins/com.android.ide.eclipse.ndk/about.ini
deleted file mode 100644
index 2d7cdaa..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.ndk/about.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-aboutText=%blurb
-featureImage=icons/android-32.png
\ No newline at end of file
diff --git a/eclipse/plugins/com.android.ide.eclipse.ndk/about.properties b/eclipse/plugins/com.android.ide.eclipse.ndk/about.properties
deleted file mode 100755
index 34218e9..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.ndk/about.properties
+++ /dev/null
@@ -1,7 +0,0 @@
-blurb=Android Development Toolkit\n\
-\n\
-Version\: {featureVersion}\n\
-\n\
-(c) Copyright 2007-2011 The Android Open Source Project.  All rights reserved.\n\
-Visit http://developer.android.com/sdk/eclipse-adt.html
-
diff --git a/eclipse/plugins/com.android.ide.eclipse.ndk/build.properties b/eclipse/plugins/com.android.ide.eclipse.ndk/build.properties
deleted file mode 100644
index 4842ac1..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.ndk/build.properties
+++ /dev/null
@@ -1,12 +0,0 @@
-source.. = src/
-output.. = bin/
-bin.includes = META-INF/,\
-               .,\
-               plugin.xml,\
-               icons/,\
-               templates/,\
-               discovery/,\
-               NOTICE,\
-               about.html,\
-               about.ini,\
-               about.properties
diff --git a/eclipse/plugins/com.android.ide.eclipse.ndk/discovery/test.c b/eclipse/plugins/com.android.ide.eclipse.ndk/discovery/test.c
deleted file mode 100644
index e69de29..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.ndk/discovery/test.c
+++ /dev/null
diff --git a/eclipse/plugins/com.android.ide.eclipse.ndk/discovery/test.cpp b/eclipse/plugins/com.android.ide.eclipse.ndk/discovery/test.cpp
deleted file mode 100644
index e69de29..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.ndk/discovery/test.cpp
+++ /dev/null
diff --git a/eclipse/plugins/com.android.ide.eclipse.ndk/icons/android-32.png b/eclipse/plugins/com.android.ide.eclipse.ndk/icons/android-32.png
deleted file mode 100644
index 4e0cc13..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.ndk/icons/android-32.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.ndk/icons/android_app.png b/eclipse/plugins/com.android.ide.eclipse.ndk/icons/android_app.png
deleted file mode 100644
index 8ca3770..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.ndk/icons/android_app.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.ndk/icons/obj16/c_app.gif b/eclipse/plugins/com.android.ide.eclipse.ndk/icons/obj16/c_app.gif
deleted file mode 100644
index 504ef50..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.ndk/icons/obj16/c_app.gif
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.ndk/icons/view16/debugger_tab.gif b/eclipse/plugins/com.android.ide.eclipse.ndk/icons/view16/debugger_tab.gif
deleted file mode 100644
index d90a29f..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.ndk/icons/view16/debugger_tab.gif
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.ndk/icons/view16/startup_tab.gif b/eclipse/plugins/com.android.ide.eclipse.ndk/icons/view16/startup_tab.gif
deleted file mode 100644
index 7b3a92e..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.ndk/icons/view16/startup_tab.gif
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.ndk/plugin.xml b/eclipse/plugins/com.android.ide.eclipse.ndk/plugin.xml
deleted file mode 100644
index 93e9bc4..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.ndk/plugin.xml
+++ /dev/null
@@ -1,208 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.4"?>
-<plugin>
-   <extension
-         point="org.eclipse.cdt.managedbuilder.core.buildDefinitions">
-      <managedBuildRevision
-            fileVersion="4.0.0">
-      </managedBuildRevision>
-      <toolChain
-            configurationEnvironmentSupplier="com.android.ide.eclipse.ndk.internal.build.NdkEnvSupplier"
-            id="com.android.toolchain.gcc"
-            isAbstract="false"
-            name="Android GCC">
-         <targetPlatform
-               binaryParser="org.eclipse.cdt.core.ELF"
-               id="com.android.targetPlatform"
-               isAbstract="false">
-         </targetPlatform>
-         <builder
-               cleanBuildTarget="clean"
-               command="ndk-build"
-               commandLauncher="com.android.ide.eclipse.ndk.internal.build.NdkCommandLauncher"
-               id="com.android.builder"
-               isAbstract="false"
-               isVariableCaseSensitive="false"
-               name="Android Builder">
-         </builder>
-         <tool
-               id="com.android.gcc.compiler"
-               isAbstract="false"
-               name="Android GCC Compiler"
-               natureFilter="both">
-            <option
-                  browseType="directory"
-                  id="com.android.gcc.option.includePath"
-                  isAbstract="false"
-                  resourceFilter="all"
-                  valueType="includePath">
-            </option>
-            <inputType
-                  id="com.android.gcc.inputType"
-                  scannerConfigDiscoveryProfileId="com.android.AndroidPerProjectProfile"
-                  sources="c,cpp">
-            </inputType>
-         </tool>
-      </toolChain>
-   </extension>
-   <extension
-         id="com.android.AndroidPerProjectProfile"
-         name="Android Per Project Profile"
-         point="org.eclipse.cdt.make.core.ScannerConfigurationDiscoveryProfile">
-      <scannerInfoCollector
-            class="com.android.ide.eclipse.ndk.internal.discovery.NdkScannerInfoCollector"
-            scope="project">
-      </scannerInfoCollector>
-   </extension>
-   <extension
-         point="org.eclipse.cdt.core.templateProcessTypes">
-      <processType
-            name="SetFolders"
-            processRunner="com.android.ide.eclipse.ndk.internal.templates.SetFolders">
-         <simple
-               name="projectName">
-         </simple>
-         <simpleArray
-               name="sourceFolders">
-         </simpleArray>
-         <simpleArray
-               name="outputFolders">
-         </simpleArray>
-      </processType>
-      <processType
-            name="SimpleFile"
-            processRunner="com.android.ide.eclipse.ndk.internal.templates.SimpleFile">
-         <simple
-               name="projectName">
-         </simple>
-         <complexArray
-               name="files">
-            <baseType>
-               <simple
-                     name="source">
-               </simple>
-               <simple
-                     name="destination">
-               </simple></baseType>
-         </complexArray>
-      </processType>
-   </extension>
-   <extension
-         point="org.eclipse.cdt.core.templates">
-      <template
-            id="com.android.ide.eclipse.ndk.addNdkSupport"
-            location="templates/addNdkSupport.xml"
-            projectType="none">
-      </template>
-   </extension>
-   <extension
-         point="org.eclipse.ui.preferencePages">
-      <page
-            category="com.android.ide.eclipse.preferences.main"
-            class="com.android.ide.eclipse.ndk.internal.preferences.NdkPreferencePage"
-            id="org.eclipse.cdt.android.page"
-            name="NDK">
-      </page>
-   </extension>
-   <extension
-         point="org.eclipse.ui.popupMenus">
-      <objectContribution
-            adaptable="true"
-            id="com.android.ide.eclipse.ndk.projectContribution"
-            objectClass="org.eclipse.core.resources.IProject">
-         <visibility>
-            <and>
-               <objectState
-                     name="projectNature"
-                     value="com.android.ide.eclipse.adt.AndroidNature">
-               </objectState>
-               <not>
-                  <objectState
-                        name="projectNature"
-                        value="org.eclipse.cdt.core.cnature">
-                  </objectState>
-               </not>
-            </and>
-         </visibility>
-         <action
-               class="com.android.ide.eclipse.ndk.internal.actions.AddNativeAction"
-               enablesFor="1"
-               id="org.eclipse.cdt.android.action1"
-               label="Add Native Support..."
-               menubarPath="com.android.ide.eclipse.adt.AndroidTools/ndk">
-         </action>
-      </objectContribution>
-   </extension>
-   <extension
-         point="org.eclipse.core.runtime.preferences">
-      <initializer
-            class="com.android.ide.eclipse.ndk.internal.preferences.NdkPreferenceInitializer">
-      </initializer>
-   </extension>
-   <extension
-         point="org.eclipse.debug.core.launchConfigurationTypes">
-      <launchConfigurationType
-            delegate="com.android.ide.eclipse.ndk.internal.launch.NdkGdbLaunchDelegate"
-            delegateName="Android ndk-gdb Launcher"
-            id="com.android.ide.eclipse.ndk.debug.LaunchConfigType"
-            modes="debug"
-            name="Android Native Application"
-            public="true"
-            sourceLocatorId="org.eclipse.cdt.debug.core.sourceLocator"
-            sourcePathComputerId="org.eclipse.cdt.debug.core.sourcePathComputer">
-      </launchConfigurationType>
-   </extension>
-   <extension
-         point="org.eclipse.debug.ui.launchConfigurationTypeImages">
-      <launchConfigurationTypeImage
-            configTypeID="com.android.ide.eclipse.ndk.debug.LaunchConfigType"
-            icon="icons/android_app.png"
-            id="com.android.ide.eclipse.ndk.debug.LaunchConfigTypeImage">
-      </launchConfigurationTypeImage>
-   </extension>
-   <extension
-         point="org.eclipse.debug.ui.launchConfigurationTabGroups">
-      <launchConfigurationTabGroup
-            class="com.android.ide.eclipse.ndk.internal.launch.NdkGdbLaunchConfigTabGroups"
-            description="Android Native Application"
-            id="com.android.ide.eclipse.ndk.debug.LaunchConfigTabGroup"
-            type="com.android.ide.eclipse.ndk.debug.LaunchConfigType">
-      </launchConfigurationTabGroup>
-   </extension>
-   <extension
-         point="org.eclipse.debug.ui.launchShortcuts">
-      <shortcut
-            class="com.android.ide.eclipse.ndk.internal.launch.NdkGdbLaunchShortcut"
-            id="com.android.ide.eclipse.ndk.debug.LaunchConfigShortcut"
-            label="Android Native Application"
-            modes="debug">
-            <contextualLaunch>
-                <enablement>
-                    <with variable="selection">
-                        <count value="1" />
-                        <iterate>
-                            <and>
-                                <test property="org.eclipse.jdt.launching.isContainer" />
-                                <test
-                                    property="org.eclipse.jdt.launching.hasProjectNature"
-                                    args="com.android.ide.eclipse.adt.AndroidNature" />
-                            </and>
-                        </iterate>
-                    </with>
-                </enablement>
-            </contextualLaunch>
-            <perspective id="org.eclipse.jdt.ui.JavaPerspective" />
-            <perspective id="org.eclipse.debug.ui.DebugPerspective" />
-            <perspective
-                  id="org.eclipse.cdt.ui.CPerspective">
-            </perspective>
-            <configurationType id="com.android.ide.eclipse.ndk.debug.LaunchConfigType">
-            </configurationType>
-            <description
-                description="Debug as Android Native Application"
-                mode="debug">
-            </description>
-      </shortcut>
-   </extension>
-
-</plugin>
diff --git a/eclipse/plugins/com.android.ide.eclipse.ndk/pom.xml b/eclipse/plugins/com.android.ide.eclipse.ndk/pom.xml
deleted file mode 100644
index 53d9c47..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.ndk/pom.xml
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-    <modelVersion>4.0.0</modelVersion>
-
-    <version>24.3.3-SNAPSHOT</version>
-    <artifactId>com.android.ide.eclipse.ndk</artifactId>
-    <packaging>eclipse-plugin</packaging>
-    <name>ndk</name>
-
-    <parent>
-        <relativePath>../../pom.xml</relativePath>
-        <groupId>adt.group</groupId>
-        <artifactId>parent</artifactId>
-        <version>1.0.0-SNAPSHOT</version>
-    </parent>
-</project>
diff --git a/eclipse/plugins/com.android.ide.eclipse.ndk/src/com/android/ide/eclipse/ndk/internal/Activator.java b/eclipse/plugins/com.android.ide.eclipse.ndk/src/com/android/ide/eclipse/ndk/internal/Activator.java
deleted file mode 100644
index e165df1..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.ndk/src/com/android/ide/eclipse/ndk/internal/Activator.java
+++ /dev/null
@@ -1,84 +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.eclipse.ndk.internal;
-
-import org.eclipse.core.runtime.FileLocator;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.ui.plugin.AbstractUIPlugin;
-import org.osgi.framework.Bundle;
-import org.osgi.framework.BundleContext;
-import org.osgi.framework.ServiceReference;
-
-import java.net.URL;
-
-/**
- * The activator class controls the plug-in life cycle
- */
-public class Activator extends AbstractUIPlugin {
-
-    // The plug-in ID
-    public static final String PLUGIN_ID = "com.android.ide.eclipse.ndk"; //$NON-NLS-1$
-
-    // The shared instance
-    private static Activator mPlugin;
-
-    @Override
-    public void start(BundleContext context) throws Exception {
-        super.start(context);
-        mPlugin = this;
-    }
-
-    @Override
-    public void stop(BundleContext context) throws Exception {
-        mPlugin = null;
-        super.stop(context);
-    }
-
-    public static Activator getDefault() {
-        return mPlugin;
-    }
-
-    public static <T> T getService(Class<T> clazz) {
-        BundleContext context = mPlugin.getBundle().getBundleContext();
-        ServiceReference ref = context.getServiceReference(clazz.getName());
-        return (ref != null) ? (T) context.getService(ref) : null;
-    }
-
-    public static Bundle getBundle(String id) {
-        for (Bundle bundle : mPlugin.getBundle().getBundleContext().getBundles()) {
-            if (bundle.getSymbolicName().equals(id)) {
-                return bundle;
-            }
-        }
-        return null;
-    }
-
-    public static IStatus newStatus(Exception e) {
-        return new Status(IStatus.ERROR, PLUGIN_ID, e.getMessage(), e);
-    }
-
-    public static void log(Exception e) {
-        mPlugin.getLog().log(newStatus(e));
-    }
-
-    public static URL findFile(IPath path) {
-        return FileLocator.find(mPlugin.getBundle(), path, null);
-    }
-
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.ndk/src/com/android/ide/eclipse/ndk/internal/Messages.java b/eclipse/plugins/com.android.ide.eclipse.ndk/src/com/android/ide/eclipse/ndk/internal/Messages.java
deleted file mode 100644
index cd6c4a3..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.ndk/src/com/android/ide/eclipse/ndk/internal/Messages.java
+++ /dev/null
@@ -1,63 +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.eclipse.ndk.internal;
-
-import org.eclipse.osgi.util.NLS;
-
-public class Messages extends NLS {
-    private static final String BUNDLE_NAME = "com.android.ide.eclipse.ndk.internal.messages"; //$NON-NLS-1$
-
-    public static String AddNativeWizardPage_Description;
-
-    public static String AddNativeWizardPage_LibraryName;
-
-    public static String AddNativeWizardPage_Location_not_valid;
-
-    public static String AddNativeWizardPage_Title;
-
-    public static String NDKPreferencePage_Location;
-
-    public static String NDKPreferencePage_not_a_valid_directory;
-
-    public static String NDKPreferencePage_not_a_valid_NDK_directory;
-
-    public static String NDKPreferencePage_Preferences;
-
-    public static String SetFolders_Missing_project_name;
-
-    public static String SetFolders_No_folders;
-
-    public static String SetFolders_Project_does_not_exist;
-
-    public static String SimpleFile_Bad_file_operation;
-
-    public static String SimpleFile_Bundle_not_found;
-
-    public static String SimpleFile_Could_not_fine_source;
-
-    public static String SimpleFile_No_project_name;
-
-    public static String SimpleFile_Project_does_not_exist;
-
-    static {
-        // initialize resource bundle
-        NLS.initializeMessages(BUNDLE_NAME, Messages.class);
-    }
-
-    private Messages() {
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.ndk/src/com/android/ide/eclipse/ndk/internal/NativeAbi.java b/eclipse/plugins/com.android.ide.eclipse.ndk/src/com/android/ide/eclipse/ndk/internal/NativeAbi.java
deleted file mode 100644
index 3c76542..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.ndk/src/com/android/ide/eclipse/ndk/internal/NativeAbi.java
+++ /dev/null
@@ -1,46 +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.ide.eclipse.ndk.internal;
-
-import com.android.SdkConstants;
-
-public enum NativeAbi {
-    armeabi(SdkConstants.ABI_ARMEABI),
-    armeabi_v7a(SdkConstants.ABI_ARMEABI_V7A),
-    mips(SdkConstants.ABI_MIPS),
-    x86(SdkConstants.ABI_INTEL_ATOM);
-
-    private final String mAbi;
-
-    private NativeAbi(String abi) {
-        mAbi = abi;
-    }
-
-    public String getAbi() {
-        return mAbi;
-    }
-
-    public static NativeAbi getByString(String abi) {
-        for (NativeAbi a: values()) {
-            if (a.getAbi().equals(abi)) {
-                return a;
-            }
-        }
-
-        throw new IllegalArgumentException("Unknown abi: " + abi);
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.ndk/src/com/android/ide/eclipse/ndk/internal/NdkHelper.java b/eclipse/plugins/com.android.ide.eclipse.ndk/src/com/android/ide/eclipse/ndk/internal/NdkHelper.java
deleted file mode 100644
index 8ad1f24..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.ndk/src/com/android/ide/eclipse/ndk/internal/NdkHelper.java
+++ /dev/null
@@ -1,184 +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.ide.eclipse.ndk.internal;
-
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.ide.eclipse.ndk.internal.launch.NdkLaunchConstants;
-
-import org.eclipse.cdt.core.CommandLauncher;
-import org.eclipse.cdt.core.ICommandLauncher;
-import org.eclipse.cdt.debug.core.ICDTLaunchConfigurationConstants;
-import org.eclipse.cdt.dsf.gdb.IGDBLaunchConfigurationConstants;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
-
-import java.io.ByteArrayOutputStream;
-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.Set;
-
-@SuppressWarnings("restriction")
-public class NdkHelper {
-    private static final String MAKE = "make";                                      //$NON-NLS-1$
-    private static final String CORE_MAKEFILE_PATH = "/build/core/build-local.mk";  //$NON-NLS-1$
-
-    /**
-     * Obtain the ABI's the application is compatible with.
-     * The ABI's are obtained by reading the result of the following command:
-     * make --no-print-dir -f ${NdkRoot}/build/core/build-local.mk -C <project-root> DUMP_APP_ABI
-     */
-    public static Collection<NativeAbi> getApplicationAbis(IProject project,
-                                                                IProgressMonitor monitor) {
-        ICommandLauncher launcher = new CommandLauncher();
-        launcher.setProject(project);
-        String[] args = new String[] {
-            "--no-print-dir",                                           //$NON-NLS-1$
-            "-f",                                                       //$NON-NLS-1$
-            NdkManager.getNdkLocation() + CORE_MAKEFILE_PATH,
-            "-C",                                                       //$NON-NLS-1$
-            project.getLocation().toOSString(),
-            "DUMP_APP_ABI",                                             //$NON-NLS-1$
-        };
-        try {
-            launcher.execute(getPathToMake(), args, null, project.getLocation(), monitor);
-        } catch (CoreException e) {
-            AdtPlugin.printErrorToConsole(e.getLocalizedMessage());
-            return Collections.emptyList();
-        }
-
-        ByteArrayOutputStream stdout = new ByteArrayOutputStream();
-        ByteArrayOutputStream stderr = new ByteArrayOutputStream();
-        launcher.waitAndRead(stdout, stderr, monitor);
-
-        String abis = stdout.toString().trim();
-        Set<NativeAbi> nativeAbis = EnumSet.noneOf(NativeAbi.class);
-        for (String abi: abis.split(" ")) {                             //$NON-NLS-1$
-            if (abi.equals("all")) {                                    //$NON-NLS-1$
-                return EnumSet.allOf(NativeAbi.class);
-            }
-
-            try {
-                nativeAbis.add(NativeAbi.getByString(abi));
-            } catch (IllegalArgumentException e) {
-                AdtPlugin.printErrorToConsole(project, "Unknown Application ABI: ", abi);
-            }
-        }
-
-        return nativeAbis;
-    }
-
-    /**
-     * Obtain the toolchain prefix to use for given project and abi.
-     * The prefix is obtained by reading the result of:
-     * make --no-print-dir -f ${NdkRoot}/build/core/build-local.mk \
-     *      -C <project-root> \
-     *      DUMP_TOOLCHAIN_PREFIX APP_ABI=abi
-     */
-    public static String getToolchainPrefix(IProject project, NativeAbi abi,
-            IProgressMonitor monitor) {
-        ICommandLauncher launcher = new CommandLauncher();
-        launcher.setProject(project);
-        String[] args = new String[] {
-            "--no-print-dir",                                           //$NON-NLS-1$
-            "-f",                                                       //$NON-NLS-1$
-            NdkManager.getNdkLocation() + CORE_MAKEFILE_PATH,
-            "-C",                                                       //$NON-NLS-1$
-            project.getLocation().toOSString(),
-            "DUMP_TOOLCHAIN_PREFIX",                                    //$NON-NLS-1$
-            "APP_ABI=" + abi.getAbi(),                                  //$NON-NLS-1$
-        };
-        try {
-            launcher.execute(getPathToMake(), args, null, project.getLocation(), monitor);
-        } catch (CoreException e) {
-            AdtPlugin.printErrorToConsole(e.getLocalizedMessage());
-            return null;
-        }
-
-        ByteArrayOutputStream stdout = new ByteArrayOutputStream();
-        ByteArrayOutputStream stderr = new ByteArrayOutputStream();
-        launcher.waitAndRead(stdout, stderr, monitor);
-        return stdout.toString().trim();
-    }
-
-    private static IPath getPathToMake() {
-        return getFullPathTo(MAKE);
-    }
-
-    /**
-     * Obtain a path to the utilities prebuilt folder in NDK. This is typically
-     * "${NdkRoot}/prebuilt/<platform>/bin/". If the executable is not found, it simply returns
-     * the name of the executable (which is equal to assuming that it is available on the path).
-     */
-    private static synchronized IPath getFullPathTo(String executable) {
-        if (Platform.getOS().equals(Platform.OS_WIN32)) {
-            executable += ".exe";
-        }
-
-        IPath ndkRoot = new Path(NdkManager.getNdkLocation());
-        IPath prebuilt = ndkRoot.append("prebuilt");                      //$NON-NLS-1$
-        if (!prebuilt.toFile().exists() || !prebuilt.toFile().canRead()) {
-            return new Path(executable);
-        }
-
-        File[] platforms = prebuilt.toFile().listFiles();
-        if (platforms != null) {
-            for (File p: platforms) {
-                IPath exePath = prebuilt.append(p.getName())
-                        .append("bin")          //$NON-NLS-1$
-                        .append(executable);
-                if (exePath.toFile().exists()) {
-                    return exePath;
-                }
-            }
-        }
-
-        return new Path(executable);
-    }
-
-    public static void setLaunchConfigDefaults(ILaunchConfigurationWorkingCopy config) {
-        config.setAttribute(IGDBLaunchConfigurationConstants.ATTR_REMOTE_TCP, true);
-        config.setAttribute(NdkLaunchConstants.ATTR_NDK_GDB, NdkLaunchConstants.DEFAULT_GDB);
-        config.setAttribute(IGDBLaunchConfigurationConstants.ATTR_GDB_INIT,
-                NdkLaunchConstants.DEFAULT_GDBINIT);
-        config.setAttribute(IGDBLaunchConfigurationConstants.ATTR_PORT,
-                NdkLaunchConstants.DEFAULT_GDB_PORT);
-        config.setAttribute(IGDBLaunchConfigurationConstants.ATTR_HOST, "localhost"); //$NON-NLS-1$
-        config.setAttribute(ICDTLaunchConfigurationConstants.ATTR_DEBUGGER_STOP_AT_MAIN, false);
-        config.setAttribute(ICDTLaunchConfigurationConstants.ATTR_DEBUGGER_START_MODE,
-                IGDBLaunchConfigurationConstants.DEBUGGER_MODE_REMOTE_ATTACH);
-        config.setAttribute(ICDTLaunchConfigurationConstants.ATTR_PROGRAM_NAME,
-                NdkLaunchConstants.DEFAULT_PROGRAM);
-
-        config.setAttribute(ICDTLaunchConfigurationConstants.ATTR_DEBUGGER_START_MODE,
-                IGDBLaunchConfigurationConstants.DEBUGGER_MODE_REMOTE);
-        config.setAttribute(ICDTLaunchConfigurationConstants.ATTR_DEBUGGER_ID,
-                "gdbserver"); //$NON-NLS-1$
-
-        List<String> solibPaths = new ArrayList<String>(2);
-        solibPaths.add(NdkLaunchConstants.DEFAULT_SOLIB_PATH);
-        config.setAttribute(NdkLaunchConstants.ATTR_NDK_SOLIB, solibPaths);
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.ndk/src/com/android/ide/eclipse/ndk/internal/NdkManager.java b/eclipse/plugins/com.android.ide.eclipse.ndk/src/com/android/ide/eclipse/ndk/internal/NdkManager.java
deleted file mode 100644
index 98fccff..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.ndk/src/com/android/ide/eclipse/ndk/internal/NdkManager.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * Copyright (C) 2010, 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.eclipse.ndk.internal;
-
-import org.eclipse.cdt.core.templateengine.TemplateCore;
-import org.eclipse.cdt.core.templateengine.TemplateEngine;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.SubProgressMonitor;
-
-import java.io.File;
-import java.util.Map;
-
-public class NdkManager {
-
-    public static final String NDK_LOCATION = "ndkLocation"; //$NON-NLS-1$
-
-    public static final String LIBRARY_NAME = "libraryName"; //$NON-NLS-1$
-
-    public static String getNdkLocation() {
-        return Activator.getDefault().getPreferenceStore().getString(NDK_LOCATION);
-    }
-
-    public static boolean isNdkLocationValid() {
-        String location = getNdkLocation();
-        if (location.length() == 0)
-            return false;
-
-        return isValidNdkLocation(location);
-    }
-
-    public static boolean isValidNdkLocation(String location) {
-        File dir = new File(location);
-        if (!dir.isDirectory())
-            return false;
-
-        // Must contain the ndk-build script which we call to build
-        if (!new File(dir, "ndk-build").isFile()) //$NON-NLS-1$
-            return false;
-
-        return true;
-    }
-
-    public static void addNativeSupport(final IProject project, Map<String, String> templateArgs,
-            IProgressMonitor monitor)
-            throws CoreException {
-        // Launch our template to set up the project contents
-        TemplateCore template = TemplateEngine.getDefault().getTemplateById("AddNdkSupport"); //$NON-NLS-1$
-        Map<String, String> valueStore = template.getValueStore();
-        valueStore.put("projectName", project.getName()); //$NON-NLS-1$
-        valueStore.putAll(templateArgs);
-        template.executeTemplateProcesses(monitor, false);
-
-        // refresh project resources
-        project.refreshLocal(IResource.DEPTH_INFINITE, new SubProgressMonitor(monitor, 10));
-    }
-
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.ndk/src/com/android/ide/eclipse/ndk/internal/NdkVariables.java b/eclipse/plugins/com.android.ide.eclipse.ndk/src/com/android/ide/eclipse/ndk/internal/NdkVariables.java
deleted file mode 100644
index 0e1cd20..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.ndk/src/com/android/ide/eclipse/ndk/internal/NdkVariables.java
+++ /dev/null
@@ -1,31 +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.ide.eclipse.ndk.internal;
-
-/** Eclipse variables that are understood by the NDK while launching programs. */
-public class NdkVariables {
-    /** Variable that expands to the full path of NDK's ABI specific gdb. */
-    public static final String NDK_GDB = "NdkGdb";
-
-    /** Variable that expands to point to the full path of the project used in the launch
-     * configuration. */
-    public static final String NDK_PROJECT = "NdkProject";
-
-    /** Variable that indicates the ABI that is compatible between the device and the
-     * application being launched. */
-    public static final String NDK_COMPAT_ABI = "NdkCompatAbi";
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.ndk/src/com/android/ide/eclipse/ndk/internal/actions/AddNativeAction.java b/eclipse/plugins/com.android.ide.eclipse.ndk/src/com/android/ide/eclipse/ndk/internal/actions/AddNativeAction.java
deleted file mode 100644
index 11f65a4..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.ndk/src/com/android/ide/eclipse/ndk/internal/actions/AddNativeAction.java
+++ /dev/null
@@ -1,69 +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.eclipse.ndk.internal.actions;
-
-import com.android.ide.eclipse.ndk.internal.wizards.AddNativeWizard;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.PlatformObject;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.wizard.WizardDialog;
-import org.eclipse.ui.IObjectActionDelegate;
-import org.eclipse.ui.IWorkbenchPart;
-
-public class AddNativeAction implements IObjectActionDelegate {
-
-    private IWorkbenchPart mPart;
-    private ISelection mSelection;
-
-    @Override
-    public void run(IAction action) {
-        IProject project = null;
-        if (mSelection instanceof IStructuredSelection) {
-            IStructuredSelection ss = (IStructuredSelection) mSelection;
-            if (ss.size() == 1) {
-                Object obj = ss.getFirstElement();
-                if (obj instanceof IProject) {
-                    project = (IProject) obj;
-                } else if (obj instanceof PlatformObject) {
-                    project = (IProject) ((PlatformObject) obj).getAdapter(IProject.class);
-                }
-            }
-        }
-
-        if (project != null) {
-            AddNativeWizard wizard = new AddNativeWizard(project, mPart.getSite()
-                    .getWorkbenchWindow());
-            WizardDialog dialog = new WizardDialog(mPart.getSite().getShell(), wizard);
-            dialog.open();
-        }
-
-    }
-
-    @Override
-    public void selectionChanged(IAction action, ISelection selection) {
-        mSelection = selection;
-    }
-
-    @Override
-    public void setActivePart(IAction action, IWorkbenchPart targetPart) {
-        mPart = targetPart;
-    }
-
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.ndk/src/com/android/ide/eclipse/ndk/internal/build/NdkCommandLauncher.java b/eclipse/plugins/com.android.ide.eclipse.ndk/src/com/android/ide/eclipse/ndk/internal/build/NdkCommandLauncher.java
deleted file mode 100644
index 0a1f7dc..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.ndk/src/com/android/ide/eclipse/ndk/internal/build/NdkCommandLauncher.java
+++ /dev/null
@@ -1,133 +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.eclipse.ndk.internal.build;
-
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.ide.eclipse.ndk.internal.NdkManager;
-
-import org.eclipse.cdt.core.CommandLauncher;
-import org.eclipse.cdt.utils.CygPath;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.core.runtime.Platform;
-
-import java.io.File;
-import java.io.IOException;
-import java.util.Arrays;
-import java.util.List;
-
-@SuppressWarnings("restriction") // for AdtPlugin internal classes
-public class NdkCommandLauncher extends CommandLauncher {
-    private static CygPath sCygPath = null;
-
-    private static final List<String> WINDOWS_NATIVE_EXECUTABLES = Arrays.asList(
-            "exe",      //$NON-NLS-1$
-            "cmd",      //$NON-NLS-1$
-            "bat"       //$NON-NLS-1$
-            );
-
-    static {
-        if (Platform.OS_WIN32.equals(Platform.getOS())) {
-            try {
-                sCygPath = new CygPath();
-            } catch (IOException e) {
-                AdtPlugin.printErrorToConsole("Unable to launch cygpath. Is Cygwin on the path?",
-                        e);
-            }
-        }
-    }
-
-    @Override
-    public Process execute(IPath commandPath, String[] args, String[] env, IPath changeToDirectory,
-            IProgressMonitor monitor)
-            throws CoreException {
-        if (!commandPath.isAbsolute())
-            commandPath = new Path(NdkManager.getNdkLocation()).append(commandPath);
-
-        if (Platform.getOS().equals(Platform.OS_WIN32)) {
-            // convert cygwin paths to standard paths
-            if (sCygPath != null && commandPath.toString().startsWith("/cygdrive")) { //$NON-NLS-1$
-                try {
-                    String path = sCygPath.getFileName(commandPath.toString());
-                    commandPath = new Path(path);
-                } catch (IOException e) {
-                    AdtPlugin.printErrorToConsole(
-                            "Unexpected error while transforming cygwin path.", e);
-                }
-            }
-
-            if (isWindowsExecutable(commandPath)) {
-                // append necessary extension
-                commandPath = appendExecutableExtension(commandPath);
-            } else {
-                // Invoke using Cygwin shell if this is not a native windows executable
-                String[] newargs = new String[args.length + 1];
-                newargs[0] = commandPath.toOSString();
-                System.arraycopy(args, 0, newargs, 1, args.length);
-
-                commandPath = new Path("sh"); //$NON-NLS-1$
-                args = newargs;
-            }
-        }
-
-        return super.execute(commandPath, args, env, changeToDirectory, monitor);
-    }
-
-    private boolean isWindowsExecutable(IPath commandPath) {
-        String ext = commandPath.getFileExtension();
-        if (isWindowsExecutableExtension(ext)) {
-            return true;
-        }
-
-        ext = findWindowsExecutableExtension(commandPath);
-        if (ext != null) {
-            return true;
-        }
-
-        return false;
-    }
-
-    private IPath appendExecutableExtension(IPath commandPath) {
-        if (isWindowsExecutableExtension(commandPath.getFileExtension())) {
-            return commandPath;
-        }
-
-        String ext = findWindowsExecutableExtension(commandPath);
-        if (ext != null) {
-            return commandPath.addFileExtension(ext);
-        }
-
-        return commandPath;
-    }
-
-    private String findWindowsExecutableExtension(IPath command) {
-        for (String e: WINDOWS_NATIVE_EXECUTABLES) {
-            File exeFile = command.addFileExtension(e).toFile();
-            if (exeFile.exists()) {
-                return e;
-            }
-        }
-
-        return null;
-    }
-
-    private boolean isWindowsExecutableExtension(String extension) {
-        return extension != null && WINDOWS_NATIVE_EXECUTABLES.contains(extension);
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.ndk/src/com/android/ide/eclipse/ndk/internal/build/NdkEnvSupplier.java b/eclipse/plugins/com.android.ide.eclipse.ndk/src/com/android/ide/eclipse/ndk/internal/build/NdkEnvSupplier.java
deleted file mode 100644
index 6564553..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.ndk/src/com/android/ide/eclipse/ndk/internal/build/NdkEnvSupplier.java
+++ /dev/null
@@ -1,121 +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.eclipse.ndk.internal.build;
-
-import org.eclipse.cdt.managedbuilder.core.IConfiguration;
-import org.eclipse.cdt.managedbuilder.envvar.IBuildEnvironmentVariable;
-import org.eclipse.cdt.managedbuilder.envvar.IConfigurationEnvironmentVariableSupplier;
-import org.eclipse.cdt.managedbuilder.envvar.IEnvironmentVariableProvider;
-import org.eclipse.core.runtime.Platform;
-
-import java.io.File;
-import java.util.HashMap;
-import java.util.Map;
-
-public class NdkEnvSupplier implements IConfigurationEnvironmentVariableSupplier {
-
-    private static Map<String, IBuildEnvironmentVariable> mEnvVars;
-
-    private synchronized void init() {
-        if (mEnvVars != null)
-            return;
-
-        mEnvVars = new HashMap<String, IBuildEnvironmentVariable>();
-
-        if (Platform.getOS().equals(Platform.OS_WIN32)) {
-            // For Windows, need to add a shell to the path
-            IBuildEnvironmentVariable path = new IBuildEnvironmentVariable() {
-                @Override
-                public String getName() {
-                    return "PATH"; //$NON-NLS-1$
-                }
-
-                @Override
-                public String getValue() {
-                    // I'm giving MSYS precedence over Cygwin. I'm biased that
-                    // way :)
-                    // TODO using the default paths for now, need smarter ways
-                    // to get at them
-                    // Alternatively the user can add the bin to their path
-                    // themselves.
-                    File bin = new File("C:\\MinGW\\msys\\1.0\\bin"); //$NON-NLS-1$
-                    if (bin.isDirectory()) {
-                        return bin.getAbsolutePath();
-                    }
-
-                    bin = new File("C:\\cygwin\\bin"); //$NON-NLS-1$
-                    if (bin.isDirectory())
-                        return bin.getAbsolutePath();
-
-                    return null;
-                }
-
-                @Override
-                public int getOperation() {
-                    return ENVVAR_PREPEND;
-                }
-
-                @Override
-                public String getDelimiter() {
-                    return ";"; //$NON-NLS-1$
-                }
-            };
-            if (path.getValue() != null)
-                mEnvVars.put(path.getName(), path);
-
-            // Since we're using real paths, need to tell cygwin it's OK
-            IBuildEnvironmentVariable cygwin = new IBuildEnvironmentVariable() {
-                @Override
-                public String getName() {
-                    return "CYGWIN"; //$NON-NLS-1$
-                }
-
-                @Override
-                public String getValue() {
-                    return "nodosfilewarning"; //$NON-NLS-1$
-                }
-
-                @Override
-                public int getOperation() {
-                    return ENVVAR_REPLACE;
-                }
-
-                @Override
-                public String getDelimiter() {
-                    return null;
-                }
-            };
-
-            mEnvVars.put(cygwin.getName(), cygwin);
-        }
-    }
-
-    @Override
-    public IBuildEnvironmentVariable getVariable(String variableName,
-            IConfiguration configuration, IEnvironmentVariableProvider provider) {
-        init();
-        return mEnvVars.get(variableName);
-    }
-
-    @Override
-    public IBuildEnvironmentVariable[] getVariables(
-            IConfiguration configuration, IEnvironmentVariableProvider provider) {
-        init();
-        return mEnvVars.values().toArray(new IBuildEnvironmentVariable[mEnvVars.size()]);
-    }
-
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.ndk/src/com/android/ide/eclipse/ndk/internal/discovery/NdkDiscoveredPathInfo.java b/eclipse/plugins/com.android.ide.eclipse.ndk/src/com/android/ide/eclipse/ndk/internal/discovery/NdkDiscoveredPathInfo.java
deleted file mode 100644
index 83ce7f4..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.ndk/src/com/android/ide/eclipse/ndk/internal/discovery/NdkDiscoveredPathInfo.java
+++ /dev/null
@@ -1,203 +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.eclipse.ndk.internal.discovery;
-
-import com.android.ide.eclipse.ndk.internal.Activator;
-
-import org.eclipse.cdt.core.CCorePlugin;
-import org.eclipse.cdt.core.model.CoreModel;
-import org.eclipse.cdt.make.core.scannerconfig.IDiscoveredPathManager.IDiscoveredPathInfo;
-import org.eclipse.cdt.make.core.scannerconfig.IDiscoveredPathManager.IDiscoveredScannerInfoSerializable;
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.Path;
-
-import java.io.BufferedReader;
-import java.io.File;
-import java.io.FileReader;
-import java.io.IOException;
-import java.io.PrintStream;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Map.Entry;
-
-public class NdkDiscoveredPathInfo implements IDiscoveredPathInfo {
-
-    private final IProject mProject;
-    private long mLastUpdate = IFile.NULL_STAMP;
-    private IPath[] mIncludePaths;
-    private Map<String, String> mSymbols;
-    private boolean mNeedReindexing = false;
-    private static final IPath ANDROID_MK = new Path("jni/Android.mk");
-
-    // Keys for preferences
-    public static final String LAST_UPDATE = "lastUpdate"; //$NON-NLS-1$
-
-    public NdkDiscoveredPathInfo(IProject project) {
-        this.mProject = project;
-        load();
-    }
-
-    @Override
-    public IProject getProject() {
-        return mProject;
-    }
-
-    @Override
-    public IPath[] getIncludePaths() {
-        if (mNeedReindexing) {
-            // Call for a reindex
-            // TODO this is probably a bug. a new include path should trigger
-            // reindexing anyway, no?
-            // BTW, can't do this in the update since the indexer runs before
-            // this gets called
-            CCorePlugin.getIndexManager().reindex(CoreModel.getDefault().create(mProject));
-            mNeedReindexing = false;
-        }
-        return mIncludePaths;
-    }
-
-    void setIncludePaths(List<String> pathStrings) {
-        mIncludePaths = new IPath[pathStrings.size()];
-        int i = 0;
-        for (String path : pathStrings)
-            mIncludePaths[i++] = new Path(path);
-        mNeedReindexing = true;
-    }
-
-    @Override
-    public Map<String, String> getSymbols() {
-        if (mSymbols == null)
-            mSymbols = new HashMap<String, String>();
-        return mSymbols;
-    }
-
-    void setSymbols(Map<String, String> symbols) {
-        this.mSymbols = symbols;
-    }
-
-    @Override
-    public IDiscoveredScannerInfoSerializable getSerializable() {
-        return null;
-    }
-
-    public void update(IProgressMonitor monitor) throws CoreException {
-        if (!needUpdating())
-            return;
-
-        new NdkDiscoveryUpdater(this).runUpdate(monitor);
-
-        if (mIncludePaths != null && mSymbols != null) {
-            recordUpdate();
-            save();
-        }
-    }
-
-    private boolean needUpdating() {
-        if (mLastUpdate == IFile.NULL_STAMP)
-            return true;
-        return mProject.getFile(ANDROID_MK).getLocalTimeStamp() > mLastUpdate;
-    }
-
-    private void recordUpdate() {
-        mLastUpdate = mProject.getFile(ANDROID_MK).getLocalTimeStamp();
-    }
-
-    public void delete() {
-        mLastUpdate = IFile.NULL_STAMP;
-    }
-
-    private File getInfoFile() {
-        File stateLoc = Activator.getDefault().getStateLocation().toFile();
-        return new File(stateLoc, mProject.getName() + ".pathInfo"); //$NON-NLS-1$
-    }
-
-    private void save() {
-        try {
-            File infoFile = getInfoFile();
-            infoFile.getParentFile().mkdirs();
-            PrintStream out = new PrintStream(infoFile);
-
-            // timestamp
-            out.print("t,"); //$NON-NLS-1$
-            out.print(mLastUpdate);
-            out.println();
-
-            for (IPath include : mIncludePaths) {
-                out.print("i,"); //$NON-NLS-1$
-                out.print(include.toPortableString());
-                out.println();
-            }
-
-            for (Entry<String, String> symbol : mSymbols.entrySet()) {
-                out.print("d,"); //$NON-NLS-1$
-                out.print(symbol.getKey());
-                out.print(","); //$NON-NLS-1$
-                out.print(symbol.getValue());
-                out.println();
-            }
-
-            out.close();
-        } catch (IOException e) {
-            Activator.log(e);
-        }
-
-    }
-
-    private void load() {
-        try {
-            File infoFile = getInfoFile();
-            if (!infoFile.exists())
-                return;
-
-            long timestamp = IFile.NULL_STAMP;
-            List<IPath> includes = new ArrayList<IPath>();
-            Map<String, String> defines = new HashMap<String, String>();
-
-            BufferedReader reader = new BufferedReader(new FileReader(infoFile));
-            for (String line = reader.readLine(); line != null; line = reader.readLine()) {
-                switch (line.charAt(0)) {
-                    case 't':
-                        timestamp = Long.valueOf(line.substring(2));
-                        break;
-                    case 'i':
-                        includes.add(Path.fromPortableString(line.substring(2)));
-                        break;
-                    case 'd':
-                        int n = line.indexOf(',', 2);
-                        if (n == -1)
-                            defines.put(line.substring(2), ""); //$NON-NLS-1$
-                        else
-                            defines.put(line.substring(2, n), line.substring(n + 1));
-                        break;
-                }
-            }
-            reader.close();
-
-            mLastUpdate = timestamp;
-            mIncludePaths = includes.toArray(new IPath[includes.size()]);
-            mSymbols = defines;
-        } catch (IOException e) {
-            Activator.log(e);
-        }
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.ndk/src/com/android/ide/eclipse/ndk/internal/discovery/NdkDiscoveryUpdater.java b/eclipse/plugins/com.android.ide.eclipse.ndk/src/com/android/ide/eclipse/ndk/internal/discovery/NdkDiscoveryUpdater.java
deleted file mode 100644
index a6b88f4..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.ndk/src/com/android/ide/eclipse/ndk/internal/discovery/NdkDiscoveryUpdater.java
+++ /dev/null
@@ -1,314 +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.eclipse.ndk.internal.discovery;
-
-import com.android.ide.eclipse.ndk.internal.Activator;
-import com.android.ide.eclipse.ndk.internal.build.NdkCommandLauncher;
-
-import org.eclipse.cdt.core.CCorePlugin;
-import org.eclipse.cdt.core.envvar.IEnvironmentVariable;
-import org.eclipse.cdt.core.envvar.IEnvironmentVariableManager;
-import org.eclipse.cdt.core.settings.model.ICConfigurationDescription;
-import org.eclipse.cdt.managedbuilder.core.IBuilder;
-import org.eclipse.cdt.managedbuilder.core.IManagedBuildInfo;
-import org.eclipse.cdt.managedbuilder.core.ManagedBuildManager;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.FileLocator;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.Path;
-
-import java.io.BufferedReader;
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.net.URISyntaxException;
-import java.net.URL;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Map.Entry;
-
-public class NdkDiscoveryUpdater {
-    private final NdkDiscoveredPathInfo mPathInfo;
-    private final IProject mProject;
-
-    private boolean mCPlusPlus = false;
-    private String mCommand;
-    private List<String> mArguments = new ArrayList<String>();
-
-    public NdkDiscoveryUpdater(NdkDiscoveredPathInfo pathInfo) {
-        mPathInfo = pathInfo;
-        mProject = pathInfo.getProject();
-    }
-
-    public void runUpdate(IProgressMonitor monitor) throws CoreException {
-        try {
-            // Run ndk-build -nB to get the list of commands
-            IPath commandPath = new Path("ndk-build"); //$NON-NLS-1$
-            String[] args = {
-                "-nB"}; //$NON-NLS-1$
-            String[] env = calcEnvironment();
-            File projectDir = new File(mProject.getLocationURI());
-            IPath changeToDirectory = new Path(projectDir.getAbsolutePath());
-            Process proc = new NdkCommandLauncher().execute(commandPath, args, env,
-                    changeToDirectory, monitor);
-            if (proc == null)
-                // proc failed to start
-                return;
-            BufferedReader reader = new BufferedReader(new InputStreamReader(proc.getInputStream()));
-            String line = reader.readLine();
-            while (line != null) {
-                checkBuildLine(line);
-                line = reader.readLine();
-            }
-
-            if (mCommand == null) {
-                return;
-            }
-
-            // Run the unique commands with special gcc options to extract the
-            // symbols and paths
-            // -E -P -v -dD
-            mArguments.add("-E"); //$NON-NLS-1$
-            mArguments.add("-P"); //$NON-NLS-1$
-            mArguments.add("-v"); //$NON-NLS-1$
-            mArguments.add("-dD"); //$NON-NLS-1$
-
-            URL url = Activator.findFile(new Path(
-                    "discovery/" + (mCPlusPlus ? "test.cpp" : "test.c"))); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-            File testFile = new File(FileLocator.toFileURL(url).toURI());
-            String testFileName = testFile.getAbsolutePath().replace('\\', '/');
-            mArguments.add(testFileName);
-
-            args = mArguments.toArray(new String[mArguments.size()]);
-            proc = new NdkCommandLauncher().execute(new Path(mCommand), args, env,
-                    changeToDirectory, monitor);
-            // Error stream has the includes
-            final InputStream errStream = proc.getErrorStream();
-            new Thread() {
-                @Override
-                public void run() {
-                    checkIncludes(errStream);
-                };
-            }.start();
-
-            // Input stream has the defines
-            checkDefines(proc.getInputStream());
-        } catch (IOException e) {
-            throw new CoreException(Activator.newStatus(e));
-        } catch (URISyntaxException e) {
-            throw new CoreException(Activator.newStatus(e));
-        }
-    }
-
-    private String[] calcEnvironment() throws CoreException {
-        IManagedBuildInfo info = ManagedBuildManager.getBuildInfo(mProject);
-        IBuilder builder = info.getDefaultConfiguration().getBuilder();
-        HashMap<String, String> envMap = new HashMap<String, String>();
-        if (builder.appendEnvironment()) {
-            ICConfigurationDescription cfgDes = ManagedBuildManager
-                    .getDescriptionForConfiguration(builder.getParent().getParent());
-            IEnvironmentVariableManager mngr = CCorePlugin.getDefault()
-                    .getBuildEnvironmentManager();
-            IEnvironmentVariable[] vars = mngr.getVariables(cfgDes, true);
-            for (IEnvironmentVariable var : vars) {
-                envMap.put(var.getName(), var.getValue());
-            }
-        }
-        // Add variables from build info
-        Map<String, String> builderEnv = builder.getExpandedEnvironment();
-        if (builderEnv != null)
-            envMap.putAll(builderEnv);
-        List<String> strings = new ArrayList<String>(envMap.size());
-        for (Entry<String, String> entry : envMap.entrySet()) {
-            StringBuffer buffer = new StringBuffer(entry.getKey());
-            buffer.append('=').append(entry.getValue());
-            strings.add(buffer.toString());
-        }
-        return strings.toArray(new String[strings.size()]);
-    }
-
-    private static class Line {
-        private final String line;
-        private int pos;
-
-        public Line(String line) {
-            this.line = line;
-        }
-
-        public Line(String line, int pos) {
-            this(line);
-            this.pos = pos;
-        }
-
-        public String getToken() {
-            skipWhiteSpace();
-            if (pos == line.length())
-                return null;
-
-            int start = pos;
-            boolean inQuote = false;
-
-            while (true) {
-                char c = line.charAt(pos);
-                if (c == ' ') {
-                    if (!inQuote)
-                        return line.substring(start, pos);
-                } else if (c == '"') {
-                    inQuote = !inQuote;
-                }
-
-                if (++pos == line.length())
-                    return null;
-            }
-
-        }
-
-        private String getRemaining() {
-            if (pos == line.length())
-                return null;
-
-            skipWhiteSpace();
-            String rc = line.substring(pos);
-            pos = line.length();
-            return rc;
-        }
-
-        private void skipWhiteSpace() {
-            while (true) {
-                if (pos == line.length())
-                    return;
-                char c = line.charAt(pos);
-                if (c == ' ')
-                    pos++;
-                else
-                    return;
-            }
-        }
-    }
-
-    private void checkBuildLine(String text) {
-        Line line = new Line(text);
-        String cmd = line.getToken();
-        if (cmd == null) {
-            return;
-        } else if (cmd.endsWith("g++")) {           //$NON-NLS-1$
-            if (mCommand == null || !mCPlusPlus) {
-                mCommand = cmd;
-                mCPlusPlus = true;
-            }
-            gatherOptions(line);
-        } else if (cmd.endsWith("gcc")) {   //$NON-NLS-1$
-            if (mCommand == null)
-                mCommand = cmd;
-            gatherOptions(line);
-        }
-    }
-
-    private void gatherOptions(Line line) {
-        for (String option = line.getToken(); option != null; option = line.getToken()) {
-            if (option.startsWith("-")) { //$NON-NLS-1$
-                // only look at options
-                if (option.equals("-I")) { //$NON-NLS-1$
-                    String dir = line.getToken();
-                    if (dir != null)
-                        addArg(option + dir);
-                } else if (option.startsWith("-I")) { //$NON-NLS-1$
-                    addArg(option);
-                } else if (option.equals("-D")) { //$NON-NLS-1$
-                    String def = line.getToken();
-                    if (def != null)
-                        addArg(option + def);
-                } else if (option.startsWith("-D")) { //$NON-NLS-1$
-                    addArg(option);
-                } else if (option.startsWith("-f")) { //$NON-NLS-1$
-                    addArg(option);
-                } else if (option.startsWith("-m")) { //$NON-NLS-1$
-                    addArg(option);
-                } else if (option.startsWith("--sysroot")) { //$NON-NLS-1$
-                    addArg(option);
-                }
-            }
-        }
-    }
-
-    private void addArg(String arg) {
-        if (!mArguments.contains(arg))
-            mArguments.add(arg);
-    }
-
-    private void checkIncludes(InputStream in) {
-        try {
-            List<String> includes = new ArrayList<String>();
-            boolean inIncludes1 = false;
-            boolean inIncludes2 = false;
-            BufferedReader reader = new BufferedReader(new InputStreamReader(in));
-            String line = reader.readLine();
-            while (line != null) {
-                if (!inIncludes1) {
-                    if (line.equals("#include \"...\" search starts here:")) //$NON-NLS-1$
-                        inIncludes1 = true;
-                } else {
-                    if (!inIncludes2) {
-                        if (line.equals("#include <...> search starts here:")) //$NON-NLS-1$
-                            inIncludes2 = true;
-                        else
-                            includes.add(line.trim());
-                    } else {
-                        if (line.equals("End of search list.")) { //$NON-NLS-1$
-                            mPathInfo.setIncludePaths(includes);
-                        } else {
-                            includes.add(line.trim());
-                        }
-                    }
-                }
-                line = reader.readLine();
-            }
-        } catch (IOException e) {
-            Activator.log(e);
-        }
-    }
-
-    private void checkDefines(InputStream in) {
-        try {
-            Map<String, String> defines = new HashMap<String, String>();
-            BufferedReader reader = new BufferedReader(new InputStreamReader(in));
-            String line = reader.readLine();
-            while (line != null) {
-                if (line.startsWith("#define")) { //$NON-NLS-1$
-                    Line l = new Line(line, 7);
-                    String var = l.getToken();
-                    if (var == null)
-                        continue;
-                    String value = l.getRemaining();
-                    if (value == null)
-                        value = ""; //$NON-NLS-1$
-                    defines.put(var, value);
-                }
-                line = reader.readLine();
-            }
-            mPathInfo.setSymbols(defines);
-        } catch (IOException e) {
-            Activator.log(e);
-        }
-    }
-
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.ndk/src/com/android/ide/eclipse/ndk/internal/discovery/NdkScannerInfoCollector.java b/eclipse/plugins/com.android.ide.eclipse.ndk/src/com/android/ide/eclipse/ndk/internal/discovery/NdkScannerInfoCollector.java
deleted file mode 100644
index 29f3e7f..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.ndk/src/com/android/ide/eclipse/ndk/internal/discovery/NdkScannerInfoCollector.java
+++ /dev/null
@@ -1,103 +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.eclipse.ndk.internal.discovery;
-
-import org.eclipse.cdt.make.core.scannerconfig.IDiscoveredPathManager.IDiscoveredPathInfo;
-import org.eclipse.cdt.make.core.scannerconfig.IScannerInfoCollector3;
-import org.eclipse.cdt.make.core.scannerconfig.IScannerInfoCollectorCleaner;
-import org.eclipse.cdt.make.core.scannerconfig.InfoContext;
-import org.eclipse.cdt.make.core.scannerconfig.ScannerInfoTypes;
-import org.eclipse.cdt.managedbuilder.scannerconfig.IManagedScannerInfoCollector;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-
-import java.util.List;
-import java.util.Map;
-
-public class NdkScannerInfoCollector implements IScannerInfoCollector3,
-        IScannerInfoCollectorCleaner, IManagedScannerInfoCollector {
-
-    private NdkDiscoveredPathInfo mPathInfo;
-
-    @Override
-    public void contributeToScannerConfig(Object resource, Map scannerInfo) {
-        throw new Error("Not implemented"); //$NON-NLS-1$
-    }
-
-    @Override
-    public List getCollectedScannerInfo(Object resource, ScannerInfoTypes type) {
-        throw new Error("Not implemented"); //$NON-NLS-1$
-    }
-
-    @Override
-    public void setProject(IProject project) {
-        throw new Error("Not implemented"); //$NON-NLS-1$
-    }
-
-    @Override
-    public void updateScannerConfiguration(IProgressMonitor monitor) throws CoreException {
-        mPathInfo.update(monitor);
-    }
-
-    @Override
-    public IDiscoveredPathInfo createPathInfoObject() {
-        return mPathInfo;
-    }
-
-    @Override
-    public Map<String, String> getDefinedSymbols() {
-        throw new Error("Not implemented"); //$NON-NLS-1$
-    }
-
-    @Override
-    public List getIncludePaths() {
-        throw new Error("Not implemented"); //$NON-NLS-1$
-    }
-
-    @Override
-    public void setInfoContext(InfoContext context) {
-        mPathInfo = new NdkDiscoveredPathInfo(context.getProject());
-    }
-
-    @Override
-    public void deleteAllPaths(IResource resource) {
-        throw new Error("Not implemented"); //$NON-NLS-1$
-    }
-
-    @Override
-    public void deleteAllSymbols(IResource resource) {
-        throw new Error("Not implemented"); //$NON-NLS-1$
-    }
-
-    @Override
-    public void deletePath(IResource resource, String path) {
-        throw new Error("Not implemented"); //$NON-NLS-1$
-    }
-
-    @Override
-    public void deleteSymbol(IResource resource, String symbol) {
-        throw new Error("Not implemented"); //$NON-NLS-1$
-    }
-
-    @Override
-    public void deleteAll(IResource resource) {
-        mPathInfo.delete();
-    }
-
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.ndk/src/com/android/ide/eclipse/ndk/internal/launch/GdbServerTask.java b/eclipse/plugins/com.android.ide.eclipse.ndk/src/com/android/ide/eclipse/ndk/internal/launch/GdbServerTask.java
deleted file mode 100644
index 23486ee..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.ndk/src/com/android/ide/eclipse/ndk/internal/launch/GdbServerTask.java
+++ /dev/null
@@ -1,118 +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.ide.eclipse.ndk.internal.launch;
-
-import com.android.ddmlib.IDevice;
-import com.android.ddmlib.IShellOutputReceiver;
-
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.atomic.AtomicBoolean;
-
-/**
- * The {@link GdbServerTask} launches gdbserver on the given device and attaches it to
- * provided pid.
- */
-public class GdbServerTask implements Runnable {
-    private IDevice mDevice;
-    private String mRunAs;
-    private String mSocket;
-    private int mPid;
-    private CountDownLatch mAttachLatch;
-
-    private GdbServerOutputReceiver mOutputReceiver;
-    private Exception mLaunchException;
-
-    private AtomicBoolean mCancelled = new AtomicBoolean(false);
-    private AtomicBoolean mHasCompleted = new AtomicBoolean(false);
-
-    /**
-     * Construct a gdbserver task.
-     * @param device device to run gdbserver on
-     * @param runAsPackage name of the package in which gdbserver resides
-     * @param socketName name of the local socket on which the server will listen
-     * @param pid pid of task to attach to
-     * @param attachLatch latch to notify when gdbserver gets attached to the task
-     */
-    public GdbServerTask(IDevice device, String runAsPackage, String socketName, int pid,
-            CountDownLatch attachLatch) {
-        mDevice = device;
-        mRunAs = runAsPackage;
-        mSocket = socketName;
-        mPid = pid;
-        mAttachLatch = attachLatch;
-
-        mOutputReceiver = new GdbServerOutputReceiver();
-    }
-
-    /**
-     * Runs gdbserver on the device and connects to the given task. If gdbserver manages to
-     * successfully attach itself to the process, then it counts down on its attach latch.
-     */
-    @Override
-    public void run() {
-        // Launch gdbserver on the device.
-        String command = String.format("run-as %s lib/gdbserver +%s --attach %d",
-                mRunAs, mSocket, mPid);
-        try {
-            mDevice.executeShellCommand(command, mOutputReceiver, 0);
-        } catch (Exception e) {
-            mLaunchException = e;
-        }
-    }
-
-    /** Returns any exceptions that might have occurred while launching gdbserver. */
-    public Exception getLaunchException() {
-        return mLaunchException;
-    }
-
-    /** Cancel gdbserver if it is running. */
-    public void setCancelled() {
-        mCancelled.set(true);
-    }
-
-    public String getShellOutput() {
-        return mOutputReceiver.getOutput();
-    }
-
-    private class GdbServerOutputReceiver implements IShellOutputReceiver {
-        private StringBuffer mOutput = new StringBuffer(100);
-
-        @Override
-        public synchronized void addOutput(byte[] data, int offset, int length) {
-            mOutput.append(new String(data, offset, length));
-
-            // notify other threads that gdbserver has attached to the task
-            if (mOutput.toString().contains("Attached")) {
-                mAttachLatch.countDown();
-            }
-        }
-
-        @Override
-        public void flush() {
-            mHasCompleted.set(true);
-        }
-
-        @Override
-        public boolean isCancelled() {
-            return mCancelled.get();
-        }
-
-        public synchronized String getOutput() {
-            return mOutput.toString();
-        }
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.ndk/src/com/android/ide/eclipse/ndk/internal/launch/Messages.java b/eclipse/plugins/com.android.ide.eclipse.ndk/src/com/android/ide/eclipse/ndk/internal/launch/Messages.java
deleted file mode 100644
index 10f68e4..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.ndk/src/com/android/ide/eclipse/ndk/internal/launch/Messages.java
+++ /dev/null
@@ -1,62 +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.ide.eclipse.ndk.internal.launch;
-
-import org.eclipse.osgi.util.NLS;
-
-public class Messages extends NLS {
-    private static final String BUNDLE_NAME = "com.android.ide.eclipse.ndk.internal.launch.messages"; //$NON-NLS-1$
-    public static String NdkGdbLaunchDelegate_LaunchError_gdbserverOutput;
-    public static String NdkGdbLaunchDelegate_Action_ActivityLaunch;
-    public static String NdkGdbLaunchDelegate_Action_CheckAndroidDeviceVersion;
-    public static String NdkGdbLaunchDelegate_Action_KillExistingGdbServer;
-    public static String NdkGdbLaunchDelegate_Action_LaunchHostGdb;
-    public static String NdkGdbLaunchDelegate_Action_LaunchingGdbServer;
-    public static String NdkGdbLaunchDelegate_Action_ObtainAppAbis;
-    public static String NdkGdbLaunchDelegate_Action_ObtainDevice;
-    public static String NdkGdbLaunchDelegate_Action_ObtainDeviceABI;
-    public static String NdkGdbLaunchDelegate_Action_PerformIncrementalBuild;
-    public static String NdkGdbLaunchDelegate_Action_SettingUpPortForward;
-    public static String NdkGdbLaunchDelegate_Action_SyncAppToDevice;
-    public static String NdkGdbLaunchDelegate_Action_WaitGdbServerAttach;
-    public static String NdkGdbLaunchDelegate_Action_WaitingForActivity;
-    public static String NdkGdbLaunchDelegate_LaunchError_ActivityLaunchError;
-    public static String NdkGdbLaunchDelegate_LaunchError_Api8Needed;
-    public static String NdkGdbLaunchDelegate_LaunchError_CouldNotGetProject;
-    public static String NdkGdbLaunchDelegate_LaunchError_gdbserverLaunchException;
-    public static String NdkGdbLaunchDelegate_LaunchError_InstallError;
-    public static String NdkGdbLaunchDelegate_LaunchError_InterruptedWaitingForGdbserver;
-    public static String NdkGdbLaunchDelegate_LaunchError_NoActivityInManifest;
-    public static String NdkGdbLaunchDelegate_LaunchError_NoCompatibleAbi;
-    public static String NdkGdbLaunchDelegate_LaunchError_NoLauncherActivity;
-    public static String NdkGdbLaunchDelegate_LaunchError_NoSuchActivity;
-    public static String NdkGdbLaunchDelegate_LaunchError_NullApk;
-    public static String NdkGdbLaunchDelegate_LaunchError_ObtainingAppFolder;
-    public static String NdkGdbLaunchDelegate_LaunchError_PortForwarding;
-    public static String NdkGdbLaunchDelegate_LaunchError_ProjectHasErrors;
-    public static String NdkGdbLaunchDelegate_LaunchError_PullFileError;
-    public static String NdkGdbLaunchDelegate_LaunchError_UnableToDetectAppAbi;
-    public static String NdkGdbLaunchDelegate_LaunchError_UnknownAndroidDeviceVersion;
-    public static String NdkGdbLaunchDelegate_LaunchError_VerifyIfDebugBuild;
-    static {
-        // initialize resource bundle
-        NLS.initializeMessages(BUNDLE_NAME, Messages.class);
-    }
-
-    private Messages() {
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.ndk/src/com/android/ide/eclipse/ndk/internal/launch/NdkDebuggerTab.java b/eclipse/plugins/com.android.ide.eclipse.ndk/src/com/android/ide/eclipse/ndk/internal/launch/NdkDebuggerTab.java
deleted file mode 100644
index 64e7dd8..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.ndk/src/com/android/ide/eclipse/ndk/internal/launch/NdkDebuggerTab.java
+++ /dev/null
@@ -1,311 +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.ide.eclipse.ndk.internal.launch;
-
-import com.android.ide.eclipse.ndk.internal.NdkHelper;
-import com.android.ide.eclipse.ndk.internal.NdkManager;
-
-import org.eclipse.cdt.dsf.gdb.IGDBLaunchConfigurationConstants;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.debug.core.ILaunchConfiguration;
-import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
-import org.eclipse.debug.ui.AbstractLaunchConfigurationTab;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.layout.RowLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.DirectoryDialog;
-import org.eclipse.swt.widgets.FileDialog;
-import org.eclipse.swt.widgets.Group;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Text;
-
-import java.io.File;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
-
-public class NdkDebuggerTab extends AbstractLaunchConfigurationTab {
-    private static String sLastGdbPath;
-    private static String sLastSolibPath;
-
-    private Text mGdbPathText;
-    private Text mGdbInitPathText;
-    private Text mGdbRemotePortText;
-
-    private org.eclipse.swt.widgets.List mSoliblist;
-    private Button mAddSolibButton;
-    private Button mDeleteSolibButton;
-
-    /**
-     * @wbp.parser.entryPoint (Window Builder Entry Point)
-     */
-    @Override
-    public void createControl(Composite parent) {
-        Composite comp = new Composite(parent, SWT.NONE);
-        setControl(comp);
-        comp.setLayout(new GridLayout(1, false));
-
-        Group grpGdb = new Group(comp, SWT.NONE);
-        grpGdb.setText("Launch Options");
-        grpGdb.setLayout(new GridLayout(3, false));
-        grpGdb.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-
-        Label lblDebugger = new Label(grpGdb, SWT.NONE);
-        lblDebugger.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1));
-        lblDebugger.setText("Debugger:");
-
-        mGdbPathText = new Text(grpGdb, SWT.BORDER);
-        mGdbPathText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
-
-        final Button btnBrowseGdb = new Button(grpGdb, SWT.NONE);
-        btnBrowseGdb.setText("Browse...");
-
-        Label lblNewLabel = new Label(grpGdb, SWT.NONE);
-        lblNewLabel.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1));
-        lblNewLabel.setText("GDB Command File:");
-
-        mGdbInitPathText = new Text(grpGdb, SWT.BORDER);
-        mGdbInitPathText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
-
-        final Button btnBrowseGdbInit = new Button(grpGdb, SWT.NONE);
-        btnBrowseGdbInit.setText("Browse...");
-
-        SelectionListener browseListener = new SelectionAdapter() {
-            @Override
-            public void widgetSelected(SelectionEvent e) {
-                Shell shell = ((Control) e.getSource()).getShell();
-                if (e.getSource() == btnBrowseGdb) {
-                    browseForGdb(shell);
-                } else {
-                    browseForGdbInit(shell);
-                }
-                checkParameters();
-                updateLaunchConfigurationDialog();
-            }
-        };
-        btnBrowseGdb.addSelectionListener(browseListener);
-        btnBrowseGdbInit.addSelectionListener(browseListener);
-
-        Label lblPort = new Label(grpGdb, SWT.NONE);
-        lblPort.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1));
-        lblPort.setText("Port:");
-
-        mGdbRemotePortText = new Text(grpGdb, SWT.BORDER);
-        GridData gd_text_2 = new GridData(SWT.LEFT, SWT.CENTER, false, false, 1, 1);
-        gd_text_2.widthHint = 100;
-        mGdbRemotePortText.setLayoutData(gd_text_2);
-
-        ModifyListener m = new ModifyListener() {
-            @Override
-            public void modifyText(ModifyEvent e) {
-                checkParameters();
-                updateLaunchConfigurationDialog();
-            }
-        };
-        mGdbPathText.addModifyListener(m);
-        mGdbInitPathText.addModifyListener(m);
-        mGdbRemotePortText.addModifyListener(m);
-
-        Group grpSharedLibraries = new Group(comp, SWT.NONE);
-        grpSharedLibraries.setText("Shared Libraries");
-        grpSharedLibraries.setLayout(new GridLayout(2, false));
-        GridData gd_grpSharedLibraries = new GridData(GridData.FILL_BOTH);
-        gd_grpSharedLibraries.verticalAlignment = SWT.TOP;
-        gd_grpSharedLibraries.grabExcessVerticalSpace = true;
-        grpSharedLibraries.setLayoutData(gd_grpSharedLibraries);
-
-        mSoliblist = new org.eclipse.swt.widgets.List(grpSharedLibraries,
-                SWT.BORDER | SWT.V_SCROLL | SWT.SINGLE);
-        GridData gd_list = new GridData(GridData.FILL_BOTH);
-        gd_list.heightHint = 133;
-        gd_list.grabExcessVerticalSpace = false;
-        gd_list.verticalSpan = 1;
-        mSoliblist.setLayoutData(gd_list);
-
-        Composite composite = new Composite(grpSharedLibraries, SWT.NONE);
-        composite.setLayoutData(new GridData(SWT.LEFT, SWT.TOP, false, false, 1, 1));
-        composite.setLayout(new RowLayout(SWT.VERTICAL));
-
-        mAddSolibButton = new Button(composite, SWT.NONE);
-        mAddSolibButton.setText("Add...");
-
-        mDeleteSolibButton = new Button(composite, SWT.NONE);
-        mDeleteSolibButton.setText("Remove");
-        mDeleteSolibButton.setEnabled(false);
-
-        SelectionListener l = new SelectionAdapter() {
-            @Override
-            public void widgetSelected(SelectionEvent e) {
-                Control c = (Control) e.getSource();
-                if (c == mSoliblist) {
-                    // enable delete only if there is a selection
-                    mDeleteSolibButton.setEnabled(mSoliblist.getSelectionCount() > 0);
-                } else if (c == mAddSolibButton) {
-                    addSolib(c.getShell());
-                } else {
-                    // delete current selection
-                    int index = mSoliblist.getSelectionIndex();
-                    if (index >= 0) {
-                        mSoliblist.remove(index);
-                    }
-                }
-                updateLaunchConfigurationDialog();
-            }
-        };
-
-        mSoliblist.addSelectionListener(l);
-        mAddSolibButton.addSelectionListener(l);
-        mDeleteSolibButton.addSelectionListener(l);
-    }
-
-    private void addSolib(Shell shell) {
-        DirectoryDialog dd = new DirectoryDialog(shell);
-        if (sLastSolibPath != null) {
-            dd.setFilterPath(sLastSolibPath);
-        }
-        String solibPath = dd.open();
-
-        if (solibPath != null) {
-            mSoliblist.add(solibPath);
-            sLastSolibPath = new File(solibPath).getParent();
-        }
-    }
-
-    private void browseForGdb(Shell shell) {
-        if (sLastGdbPath == null) {
-            sLastGdbPath = NdkManager.getNdkLocation();
-        }
-
-        FileDialog fd = new FileDialog(shell);
-        fd.setFilterPath(sLastGdbPath);
-
-        String gdbPath = fd.open();
-        if (gdbPath != null) {
-            mGdbPathText.setText(gdbPath);
-            sLastGdbPath = new File(gdbPath).getParent();
-        }
-    }
-
-    private void browseForGdbInit(Shell shell) {
-        FileDialog fd = new FileDialog(shell);
-        String gdbInit = fd.open();
-        if (gdbInit != null) {
-            mGdbInitPathText.setText(gdbInit);
-        }
-    }
-
-    private void checkParameters() {
-        // check gdb path
-        String gdb = mGdbPathText.getText().trim();
-        if (!gdb.equals(NdkLaunchConstants.DEFAULT_GDB)) {
-            File f = new File(gdb);
-            if (!f.exists() || !f.canExecute()) {
-                setErrorMessage("Invalid gdb location.");
-                return;
-            }
-        }
-
-        // check gdb init path
-        String gdbInit = mGdbInitPathText.getText().trim();
-        if (!gdbInit.isEmpty()) {
-            File f = new File(gdbInit);
-            if (!f.exists() || !f.isFile()) {
-                setErrorMessage("Invalid gdbinit location.");
-                return;
-            }
-        }
-
-        // port should be a valid integer
-        String port = mGdbRemotePortText.getText().trim();
-        try {
-            Integer.parseInt(port, 10);
-        } catch (NumberFormatException e) {
-            setErrorMessage("Port should be a valid integer");
-            return;
-        }
-
-        // no errors
-        setErrorMessage(null);
-        setMessage(null);
-    }
-
-    @Override
-    public void setDefaults(ILaunchConfigurationWorkingCopy config) {
-        NdkHelper.setLaunchConfigDefaults(config);
-    }
-
-    @Override
-    public void initializeFrom(ILaunchConfiguration config) {
-        mGdbPathText.setText(getAttribute(config, NdkLaunchConstants.ATTR_NDK_GDB,
-                NdkLaunchConstants.DEFAULT_GDB));
-        mGdbInitPathText.setText(getAttribute(config,
-                IGDBLaunchConfigurationConstants.ATTR_GDB_INIT,
-                NdkLaunchConstants.DEFAULT_GDBINIT));
-        mGdbRemotePortText.setText(getAttribute(config, IGDBLaunchConfigurationConstants.ATTR_PORT,
-                NdkLaunchConstants.DEFAULT_GDB_PORT));
-
-        List<String> solibs = getAttribute(config, NdkLaunchConstants.ATTR_NDK_SOLIB,
-                                                                    Collections.EMPTY_LIST);
-        mSoliblist.removeAll();
-        for (String s: solibs) {
-            mSoliblist.add(s);
-        }
-    }
-
-    private String getAttribute(ILaunchConfiguration config, String key, String defaultValue) {
-        try {
-            return config.getAttribute(key, defaultValue);
-        } catch (CoreException e) {
-            return defaultValue;
-        }
-    }
-
-    private List<String> getAttribute(ILaunchConfiguration config, String key,
-                                                            List<String> defaultValue) {
-        try {
-            return config.getAttribute(key, defaultValue);
-        } catch (CoreException e) {
-            return defaultValue;
-        }
-    }
-
-    @Override
-    public void performApply(ILaunchConfigurationWorkingCopy config) {
-        config.setAttribute(NdkLaunchConstants.ATTR_NDK_GDB, mGdbPathText.getText().trim());
-        config.setAttribute(IGDBLaunchConfigurationConstants.ATTR_GDB_INIT,
-                mGdbInitPathText.getText().trim());
-        config.setAttribute(IGDBLaunchConfigurationConstants.ATTR_PORT,
-                mGdbRemotePortText.getText().trim());
-        config.setAttribute(NdkLaunchConstants.ATTR_NDK_SOLIB,
-                Arrays.asList(mSoliblist.getItems()));
-    }
-
-    @Override
-    public String getName() {
-        return "Debugger";
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.ndk/src/com/android/ide/eclipse/ndk/internal/launch/NdkGdbLaunchConfigTabGroups.java b/eclipse/plugins/com.android.ide.eclipse.ndk/src/com/android/ide/eclipse/ndk/internal/launch/NdkGdbLaunchConfigTabGroups.java
deleted file mode 100644
index f8cf73c..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.ndk/src/com/android/ide/eclipse/ndk/internal/launch/NdkGdbLaunchConfigTabGroups.java
+++ /dev/null
@@ -1,39 +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.ide.eclipse.ndk.internal.launch;
-
-import org.eclipse.debug.ui.AbstractLaunchConfigurationTabGroup;
-import org.eclipse.debug.ui.CommonTab;
-import org.eclipse.debug.ui.ILaunchConfigurationDialog;
-import org.eclipse.debug.ui.ILaunchConfigurationTab;
-import org.eclipse.debug.ui.sourcelookup.SourceLookupTab;
-
-public class NdkGdbLaunchConfigTabGroups extends AbstractLaunchConfigurationTabGroup {
-    public NdkGdbLaunchConfigTabGroups() {
-    }
-
-    @Override
-    public void createTabs(ILaunchConfigurationDialog dialog, String mode) {
-        ILaunchConfigurationTab[] tabs = new ILaunchConfigurationTab[] {
-                new NdkMainLaunchConfigTab(),
-                new NdkDebuggerTab(),
-                new SourceLookupTab(),
-                new CommonTab()
-            };
-        setTabs(tabs);
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.ndk/src/com/android/ide/eclipse/ndk/internal/launch/NdkGdbLaunchDelegate.java b/eclipse/plugins/com.android.ide.eclipse.ndk/src/com/android/ide/eclipse/ndk/internal/launch/NdkGdbLaunchDelegate.java
deleted file mode 100644
index 0b124f2..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.ndk/src/com/android/ide/eclipse/ndk/internal/launch/NdkGdbLaunchDelegate.java
+++ /dev/null
@@ -1,506 +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.ide.eclipse.ndk.internal.launch;
-
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-import com.android.ddmlib.AdbCommandRejectedException;
-import com.android.ddmlib.AndroidDebugBridge;
-import com.android.ddmlib.Client;
-import com.android.ddmlib.CollectingOutputReceiver;
-import com.android.ddmlib.IDevice;
-import com.android.ddmlib.IDevice.DeviceUnixSocketNamespace;
-import com.android.ddmlib.InstallException;
-import com.android.ddmlib.ShellCommandUnresponsiveException;
-import com.android.ddmlib.SyncException;
-import com.android.ddmlib.TimeoutException;
-import com.android.ide.common.xml.ManifestData;
-import com.android.ide.common.xml.ManifestData.Activity;
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.ide.eclipse.adt.internal.editors.manifest.ManifestInfo;
-import com.android.ide.eclipse.adt.internal.launch.AndroidLaunchController;
-import com.android.ide.eclipse.adt.internal.launch.DeviceChooserDialog;
-import com.android.ide.eclipse.adt.internal.launch.DeviceChooserDialog.DeviceChooserResponse;
-import com.android.ide.eclipse.adt.internal.launch.LaunchConfigDelegate;
-import com.android.ide.eclipse.adt.internal.project.AndroidManifestHelper;
-import com.android.ide.eclipse.adt.internal.project.ProjectHelper;
-import com.android.ide.eclipse.adt.internal.sdk.Sdk;
-import com.android.ide.eclipse.ndk.internal.NativeAbi;
-import com.android.ide.eclipse.ndk.internal.NdkHelper;
-import com.android.ide.eclipse.ndk.internal.NdkVariables;
-import com.android.sdklib.AndroidVersion;
-import com.android.sdklib.IAndroidTarget;
-import com.google.common.base.Joiner;
-
-import org.eclipse.cdt.core.model.ICProject;
-import org.eclipse.cdt.debug.core.CDebugUtils;
-import org.eclipse.cdt.debug.core.ICDTLaunchConfigurationConstants;
-import org.eclipse.cdt.dsf.gdb.IGDBLaunchConfigurationConstants;
-import org.eclipse.cdt.dsf.gdb.launching.GdbLaunchDelegate;
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.core.variables.IStringVariableManager;
-import org.eclipse.core.variables.IValueVariable;
-import org.eclipse.core.variables.VariablesPlugin;
-import org.eclipse.debug.core.DebugPlugin;
-import org.eclipse.debug.core.ILaunch;
-import org.eclipse.debug.core.ILaunchConfiguration;
-import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
-import org.eclipse.jface.dialogs.Dialog;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.List;
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.TimeUnit;
-
-@SuppressWarnings("restriction")
-public class NdkGdbLaunchDelegate extends GdbLaunchDelegate {
-    public static final String LAUNCH_TYPE_ID =
-            "com.android.ide.eclipse.ndk.debug.LaunchConfigType"; //$NON-NLS-1$
-
-    private static final Joiner JOINER = Joiner.on(", ").skipNulls();
-
-    private static final String DEBUG_SOCKET = "debugsock";         //$NON-NLS-1$
-
-    @Override
-    public void launch(ILaunchConfiguration config, String mode, ILaunch launch,
-            IProgressMonitor monitor) throws CoreException {
-        boolean launched = doLaunch(config, mode, launch, monitor);
-        if (!launched) {
-            if (launch.canTerminate()) {
-                launch.terminate();
-            }
-            DebugPlugin.getDefault().getLaunchManager().removeLaunch(launch);
-        }
-    }
-
-    public boolean doLaunch(final ILaunchConfiguration config, String mode, ILaunch launch,
-            IProgressMonitor monitor) throws CoreException {
-        IProject project = null;
-        ICProject cProject = CDebugUtils.getCProject(config);
-        if (cProject != null) {
-            project = cProject.getProject();
-        }
-
-        if (project == null) {
-            AdtPlugin.printErrorToConsole(
-                    Messages.NdkGdbLaunchDelegate_LaunchError_CouldNotGetProject);
-            return false;
-        }
-
-        // make sure the project and its dependencies are built and PostCompilerBuilder runs.
-        // This is a synchronous call which returns when the build is done.
-        monitor.setTaskName(Messages.NdkGdbLaunchDelegate_Action_PerformIncrementalBuild);
-        ProjectHelper.doFullIncrementalDebugBuild(project, monitor);
-
-        // check if the project has errors, and abort in this case.
-        if (ProjectHelper.hasError(project, true)) {
-            AdtPlugin.printErrorToConsole(project,
-                     Messages.NdkGdbLaunchDelegate_LaunchError_ProjectHasErrors);
-            return false;
-        }
-
-        final ManifestData manifestData = AndroidManifestHelper.parseForData(project);
-        final ManifestInfo manifestInfo = ManifestInfo.get(project);
-        final AndroidVersion minSdkVersion = new AndroidVersion(
-                manifestInfo.getMinSdkVersion(),
-                manifestInfo.getMinSdkCodeName());
-
-        // Get the activity name to launch
-        String activityName = getActivityToLaunch(
-                getActivityNameInLaunchConfig(config),
-                manifestData.getLauncherActivity(),
-                manifestData.getActivities(),
-                project);
-
-        // Get ABI's supported by the application
-        monitor.setTaskName(Messages.NdkGdbLaunchDelegate_Action_ObtainAppAbis);
-        Collection<NativeAbi> appAbis = NdkHelper.getApplicationAbis(project, monitor);
-        if (appAbis.size() == 0) {
-            AdtPlugin.printErrorToConsole(project,
-                    Messages.NdkGdbLaunchDelegate_LaunchError_UnableToDetectAppAbi);
-            return false;
-        }
-
-        // Obtain device to use:
-        //  - if there is only 1 device, just use that
-        //  - if we have previously launched this config, and the device used is present, use that
-        //  - otherwise show the DeviceChooserDialog
-        final String configName = config.getName();
-        monitor.setTaskName(Messages.NdkGdbLaunchDelegate_Action_ObtainDevice);
-        IDevice device = null;
-        IDevice[] devices = AndroidDebugBridge.getBridge().getDevices();
-        if (devices.length == 1) {
-            device = devices[0];
-        } else if ((device = getLastUsedDevice(config, devices)) == null) {
-            final IAndroidTarget projectTarget = Sdk.getCurrent().getTarget(project);
-            final DeviceChooserResponse response = new DeviceChooserResponse();
-            final boolean continueLaunch[] = new boolean[] { false };
-            AdtPlugin.getDisplay().syncExec(new Runnable() {
-                @Override
-                public void run() {
-                    DeviceChooserDialog dialog = new DeviceChooserDialog(
-                            AdtPlugin.getDisplay().getActiveShell(),
-                            response,
-                            manifestData.getPackage(),
-                            projectTarget, minSdkVersion, false /*** FIXME! **/);
-                    if (dialog.open() == Dialog.OK) {
-                        AndroidLaunchController.updateLaunchConfigWithLastUsedDevice(config,
-                                response);
-                        continueLaunch[0] = true;
-                    }
-                };
-            });
-
-            if (!continueLaunch[0]) {
-                return false;
-            }
-
-            device = response.getDeviceToUse();
-        }
-
-        // ndk-gdb requires device > Froyo
-        monitor.setTaskName(Messages.NdkGdbLaunchDelegate_Action_CheckAndroidDeviceVersion);
-        AndroidVersion deviceVersion = Sdk.getDeviceVersion(device);
-        if (deviceVersion == null) {
-            AdtPlugin.printErrorToConsole(project,
-                    Messages.NdkGdbLaunchDelegate_LaunchError_UnknownAndroidDeviceVersion);
-            return false;
-        } else if (!deviceVersion.isGreaterOrEqualThan(8)) {
-            AdtPlugin.printErrorToConsole(project,
-                    Messages.NdkGdbLaunchDelegate_LaunchError_Api8Needed);
-            return false;
-        }
-
-        // get Device ABI
-        monitor.setTaskName(Messages.NdkGdbLaunchDelegate_Action_ObtainDeviceABI);
-        String deviceAbi1 = device.getProperty("ro.product.cpu.abi");   //$NON-NLS-1$
-        String deviceAbi2 = device.getProperty("ro.product.cpu.abi2");  //$NON-NLS-1$
-
-        // get the abi that is supported by both the device and the application
-        NativeAbi compatAbi = getCompatibleAbi(deviceAbi1, deviceAbi2, appAbis);
-        if (compatAbi == null) {
-            AdtPlugin.printErrorToConsole(project,
-                    Messages.NdkGdbLaunchDelegate_LaunchError_NoCompatibleAbi);
-            AdtPlugin.printErrorToConsole(project,
-                    String.format("ABI's supported by the application: %s", JOINER.join(appAbis)));
-            AdtPlugin.printErrorToConsole(project,
-                    String.format("ABI's supported by the device: %s, %s",      //$NON-NLS-1$
-                            deviceAbi1,
-                            deviceAbi2));
-            return false;
-        }
-
-        // sync app
-        monitor.setTaskName(Messages.NdkGdbLaunchDelegate_Action_SyncAppToDevice);
-        IFile apk = ProjectHelper.getApplicationPackage(project);
-        if (apk == null) {
-            AdtPlugin.printErrorToConsole(project,
-                    Messages.NdkGdbLaunchDelegate_LaunchError_NullApk);
-            return false;
-        }
-        try {
-            device.installPackage(apk.getLocation().toOSString(), true);
-        } catch (InstallException e1) {
-            AdtPlugin.printErrorToConsole(project,
-                    Messages.NdkGdbLaunchDelegate_LaunchError_InstallError, e1);
-            return false;
-        }
-
-        // launch activity
-        monitor.setTaskName(Messages.NdkGdbLaunchDelegate_Action_ActivityLaunch + activityName);
-        String command = String.format("am start -n %s/%s", manifestData.getPackage(), //$NON-NLS-1$
-                activityName);
-        try {
-            CountDownLatch launchedLatch = new CountDownLatch(1);
-            CollectingOutputReceiver receiver = new CollectingOutputReceiver(launchedLatch);
-            device.executeShellCommand(command, receiver);
-            launchedLatch.await(5, TimeUnit.SECONDS);
-            String shellOutput = receiver.getOutput();
-            if (shellOutput.contains("Error type")) {                   //$NON-NLS-1$
-                throw new RuntimeException(receiver.getOutput());
-            }
-        } catch (Exception e) {
-            AdtPlugin.printErrorToConsole(project,
-                    Messages.NdkGdbLaunchDelegate_LaunchError_ActivityLaunchError, e);
-            return false;
-        }
-
-        // kill existing gdbserver
-        monitor.setTaskName(Messages.NdkGdbLaunchDelegate_Action_KillExistingGdbServer);
-        for (Client c: device.getClients()) {
-            String description = c.getClientData().getClientDescription();
-            if (description != null && description.contains("gdbserver")) { //$NON-NLS-1$
-                c.kill();
-            }
-        }
-
-        // pull app_process & libc from the device
-        IPath solibFolder = project.getLocation().append("obj/local").append(compatAbi.getAbi());
-        try {
-            pull(device, "/system/bin/app_process", solibFolder);   //$NON-NLS-1$
-            pull(device, "/system/lib/libc.so", solibFolder);       //$NON-NLS-1$
-        } catch (Exception e) {
-            AdtPlugin.printErrorToConsole(project,
-                    Messages.NdkGdbLaunchDelegate_LaunchError_PullFileError, e);
-            return false;
-        }
-
-        // wait for a couple of seconds for activity to be launched
-        monitor.setTaskName(Messages.NdkGdbLaunchDelegate_Action_WaitingForActivity);
-        try {
-            Thread.sleep(2000);
-        } catch (InterruptedException e1) {
-            // uninterrupted
-        }
-
-        // get pid of activity
-        Client app = device.getClient(manifestData.getPackage());
-        int pid = app.getClientData().getPid();
-
-        // launch gdbserver
-        monitor.setTaskName(Messages.NdkGdbLaunchDelegate_Action_LaunchingGdbServer);
-        CountDownLatch attachLatch = new CountDownLatch(1);
-        GdbServerTask gdbServer = new GdbServerTask(device, manifestData.getPackage(),
-                DEBUG_SOCKET, pid, attachLatch);
-        new Thread(gdbServer,
-                String.format("gdbserver for %s", manifestData.getPackage())).start();  //$NON-NLS-1$
-
-        // wait for gdbserver to attach
-        monitor.setTaskName(Messages.NdkGdbLaunchDelegate_Action_WaitGdbServerAttach);
-        boolean attached = false;
-        try {
-            attached = attachLatch.await(3, TimeUnit.SECONDS);
-        } catch (InterruptedException e) {
-            AdtPlugin.printErrorToConsole(project,
-                    Messages.NdkGdbLaunchDelegate_LaunchError_InterruptedWaitingForGdbserver);
-            return false;
-        }
-
-        // if gdbserver failed to attach, we report any errors that may have occurred
-        if (!attached) {
-            if (gdbServer.getLaunchException() != null) {
-                AdtPlugin.printErrorToConsole(project,
-                        Messages.NdkGdbLaunchDelegate_LaunchError_gdbserverLaunchException,
-                        gdbServer.getLaunchException());
-            } else {
-                AdtPlugin.printErrorToConsole(project,
-                        Messages.NdkGdbLaunchDelegate_LaunchError_gdbserverOutput,
-                        gdbServer.getShellOutput());
-            }
-            AdtPlugin.printErrorToConsole(project,
-                    Messages.NdkGdbLaunchDelegate_LaunchError_VerifyIfDebugBuild);
-
-            // shut down the gdbserver thread
-            gdbServer.setCancelled();
-            return false;
-        }
-
-        // Obtain application working directory
-        String appDir = null;
-        try {
-            appDir = getAppDirectory(device, manifestData.getPackage(), 5, TimeUnit.SECONDS);
-        } catch (Exception e) {
-            AdtPlugin.printErrorToConsole(project,
-                    Messages.NdkGdbLaunchDelegate_LaunchError_ObtainingAppFolder, e);
-            return false;
-        }
-
-        // setup port forwarding between local port & remote (device) unix domain socket
-        monitor.setTaskName(Messages.NdkGdbLaunchDelegate_Action_SettingUpPortForward);
-        String localport = config.getAttribute(IGDBLaunchConfigurationConstants.ATTR_PORT,
-                NdkLaunchConstants.DEFAULT_GDB_PORT);
-        try {
-            device.createForward(Integer.parseInt(localport),
-                    String.format("%s/%s", appDir, DEBUG_SOCKET), //$NON-NLS-1$
-                    DeviceUnixSocketNamespace.FILESYSTEM);
-        } catch (Exception e) {
-            AdtPlugin.printErrorToConsole(project,
-                    Messages.NdkGdbLaunchDelegate_LaunchError_PortForwarding, e);
-            return false;
-        }
-
-        // update launch attributes based on device
-        ILaunchConfiguration config2 = performVariableSubstitutions(config, project, compatAbi,
-                monitor);
-
-        // launch gdb
-        monitor.setTaskName(Messages.NdkGdbLaunchDelegate_Action_LaunchHostGdb);
-        super.launch(config2, mode, launch, monitor);
-        return true;
-    }
-
-    @Nullable
-    private IDevice getLastUsedDevice(ILaunchConfiguration config, @NonNull IDevice[] devices) {
-        try {
-            boolean reuse = config.getAttribute(LaunchConfigDelegate.ATTR_REUSE_LAST_USED_DEVICE,
-                    false);
-            if (!reuse) {
-                return null;
-            }
-
-            String serial = config.getAttribute(LaunchConfigDelegate.ATTR_LAST_USED_DEVICE,
-                    (String)null);
-            return AndroidLaunchController.getDeviceIfOnline(serial, devices);
-        } catch (CoreException e) {
-            return null;
-        }
-    }
-
-    private void pull(IDevice device, String remote, IPath solibFolder) throws
-                        SyncException, IOException, AdbCommandRejectedException, TimeoutException {
-        String remoteFileName = new Path(remote).toFile().getName();
-        String targetFile = solibFolder.append(remoteFileName).toString();
-        device.pullFile(remote, targetFile);
-    }
-
-    private ILaunchConfiguration performVariableSubstitutions(ILaunchConfiguration config,
-            IProject project, NativeAbi compatAbi, IProgressMonitor monitor) throws CoreException {
-        ILaunchConfigurationWorkingCopy wcopy = config.getWorkingCopy();
-
-        String toolchainPrefix = NdkHelper.getToolchainPrefix(project, compatAbi, monitor);
-        String gdb = toolchainPrefix + "gdb";   //$NON-NLS-1$
-
-        IStringVariableManager manager = VariablesPlugin.getDefault().getStringVariableManager();
-        IValueVariable ndkGdb = manager.newValueVariable(NdkVariables.NDK_GDB,
-                NdkVariables.NDK_GDB, true, gdb);
-        IValueVariable ndkProject = manager.newValueVariable(NdkVariables.NDK_PROJECT,
-                NdkVariables.NDK_PROJECT, true, project.getLocation().toOSString());
-        IValueVariable ndkCompatAbi = manager.newValueVariable(NdkVariables.NDK_COMPAT_ABI,
-                NdkVariables.NDK_COMPAT_ABI, true, compatAbi.getAbi());
-
-        IValueVariable[] ndkVars = new IValueVariable[] { ndkGdb, ndkProject, ndkCompatAbi };
-        manager.addVariables(ndkVars);
-
-        // fix path to gdb
-        String userGdbPath = wcopy.getAttribute(NdkLaunchConstants.ATTR_NDK_GDB,
-                NdkLaunchConstants.DEFAULT_GDB);
-        wcopy.setAttribute(IGDBLaunchConfigurationConstants.ATTR_DEBUG_NAME,
-                elaborateExpression(manager, userGdbPath));
-
-        // setup program name
-        wcopy.setAttribute(ICDTLaunchConfigurationConstants.ATTR_PROGRAM_NAME,
-                elaborateExpression(manager, NdkLaunchConstants.DEFAULT_PROGRAM));
-
-        // fix solib paths
-        List<String> solibPaths = wcopy.getAttribute(
-                NdkLaunchConstants.ATTR_NDK_SOLIB,
-                Collections.singletonList(NdkLaunchConstants.DEFAULT_SOLIB_PATH));
-        List<String> fixedSolibPaths = new ArrayList<String>(solibPaths.size());
-        for (String u : solibPaths) {
-            fixedSolibPaths.add(elaborateExpression(manager, u));
-        }
-        wcopy.setAttribute(IGDBLaunchConfigurationConstants.ATTR_DEBUGGER_SOLIB_PATH,
-                fixedSolibPaths);
-
-        manager.removeVariables(ndkVars);
-
-        return wcopy.doSave();
-    }
-
-    private String elaborateExpression(IStringVariableManager manager, String expr)
-            throws CoreException{
-        boolean DEBUG = true;
-
-        String eval = manager.performStringSubstitution(expr);
-        if (DEBUG) {
-            AdtPlugin.printToConsole("Substitute: ", expr, " --> ", eval);
-        }
-
-        return eval;
-    }
-
-    /**
-     * Returns the activity name to launch. If the user has requested a particular activity to
-     * be launched, then this method will confirm that the requested activity is defined in the
-     * manifest. If the user has not specified any activities, then it returns the default
-     * launcher activity.
-     * @param activityNameInLaunchConfig activity to launch as requested by the user.
-     * @param activities list of activities as defined in the application's manifest
-     * @param project android project
-     * @return activity name that should be launched, or null if no launchable activity.
-     */
-    private String getActivityToLaunch(String activityNameInLaunchConfig, Activity launcherActivity,
-            Activity[] activities, IProject project) {
-        if (activities.length == 0) {
-            AdtPlugin.printErrorToConsole(project,
-                    Messages.NdkGdbLaunchDelegate_LaunchError_NoActivityInManifest);
-            return null;
-        } else if (activityNameInLaunchConfig == null && launcherActivity != null) {
-            return launcherActivity.getName();
-        } else {
-            for (Activity a : activities) {
-                if (a != null && a.getName().equals(activityNameInLaunchConfig)) {
-                    return activityNameInLaunchConfig;
-                }
-            }
-
-            AdtPlugin.printErrorToConsole(project,
-                    Messages.NdkGdbLaunchDelegate_LaunchError_NoSuchActivity);
-            if (launcherActivity != null) {
-                return launcherActivity.getName();
-            } else {
-                AdtPlugin.printErrorToConsole(
-                        Messages.NdkGdbLaunchDelegate_LaunchError_NoLauncherActivity);
-                return null;
-            }
-        }
-    }
-
-    private NativeAbi getCompatibleAbi(String deviceAbi1, String deviceAbi2,
-                                Collection<NativeAbi> appAbis) {
-        for (NativeAbi abi: appAbis) {
-            if (abi.getAbi().equals(deviceAbi1) || abi.getAbi().equals(deviceAbi2)) {
-                return abi;
-            }
-        }
-
-        return null;
-    }
-
-    /** Returns the name of the activity as defined in the launch configuration. */
-    private String getActivityNameInLaunchConfig(ILaunchConfiguration configuration) {
-        String empty = ""; //$NON-NLS-1$
-        String activityName;
-        try {
-            activityName = configuration.getAttribute(LaunchConfigDelegate.ATTR_ACTIVITY, empty);
-        } catch (CoreException e) {
-            return null;
-        }
-
-        return (activityName != empty) ? activityName : null;
-    }
-
-    private String getAppDirectory(IDevice device, String app, long timeout, TimeUnit timeoutUnit)
-            throws TimeoutException, AdbCommandRejectedException, ShellCommandUnresponsiveException,
-                   IOException, InterruptedException {
-        String command = String.format("run-as %s /system/bin/sh -c pwd", app); //$NON-NLS-1$
-
-        CountDownLatch commandCompleteLatch = new CountDownLatch(1);
-        CollectingOutputReceiver receiver = new CollectingOutputReceiver(commandCompleteLatch);
-        device.executeShellCommand(command, receiver);
-        commandCompleteLatch.await(timeout, timeoutUnit);
-        return receiver.getOutput().trim();
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.ndk/src/com/android/ide/eclipse/ndk/internal/launch/NdkGdbLaunchShortcut.java b/eclipse/plugins/com.android.ide.eclipse.ndk/src/com/android/ide/eclipse/ndk/internal/launch/NdkGdbLaunchShortcut.java
deleted file mode 100644
index 22eb118..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.ndk/src/com/android/ide/eclipse/ndk/internal/launch/NdkGdbLaunchShortcut.java
+++ /dev/null
@@ -1,127 +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.ide.eclipse.ndk.internal.launch;
-
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.ide.eclipse.adt.internal.launch.AndroidLaunchController;
-import com.android.ide.eclipse.adt.internal.sdk.ProjectState;
-import com.android.ide.eclipse.adt.internal.sdk.Sdk;
-import com.android.ide.eclipse.ndk.internal.NdkHelper;
-
-import org.eclipse.cdt.core.model.CoreModel;
-import org.eclipse.cdt.debug.core.ICDTLaunchConfigurationConstants;
-import org.eclipse.cdt.dsf.gdb.IGDBLaunchConfigurationConstants;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.debug.core.ILaunchConfiguration;
-import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
-import org.eclipse.debug.ui.DebugUITools;
-import org.eclipse.debug.ui.ILaunchShortcut;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.ui.IEditorPart;
-
-@SuppressWarnings("restriction") // for adt.internal classes
-public class NdkGdbLaunchShortcut implements ILaunchShortcut {
-    @Override
-    public void launch(ISelection selection, String mode) {
-        if (!(selection instanceof IStructuredSelection)) {
-            return;
-        }
-
-        Object s = ((IStructuredSelection) selection).getFirstElement();
-        if (!(s instanceof IAdaptable)) {
-            return;
-        }
-
-        IResource r = (IResource) ((IAdaptable) s).getAdapter(IResource.class);
-        if (r == null) {
-            return;
-        }
-
-        IProject project = r.getProject();
-        if (project == null) {
-            return;
-        }
-
-        // verify that this is a non library Android project
-        ProjectState state = Sdk.getProjectState(project);
-        if (state == null || state.isLibrary()) {
-            return;
-        }
-
-        // verify that this project has C/C++ nature
-        if (!CoreModel.hasCCNature(project) && !CoreModel.hasCNature(project)) {
-            AdtPlugin.printErrorToConsole(project,
-                    String.format("Selected project (%s) does not have C/C++ nature. "
-                            + "To add native support, right click on the project, "
-                            + "Android Tools -> Add Native Support",
-                            project.getName()));
-            return;
-        }
-
-        debugProject(project, mode);
-    }
-
-    @Override
-    public void launch(IEditorPart editor, String mode) {
-    }
-
-    private void debugProject(IProject project, String mode) {
-        // obtain existing native debug config for project
-        ILaunchConfiguration config = AndroidLaunchController.getLaunchConfig(project,
-                NdkGdbLaunchDelegate.LAUNCH_TYPE_ID);
-        if (config == null) {
-            return;
-        }
-
-        // Set the ndk gdb specific launch attributes in the config (if necessary)
-        if (!hasNdkAttributes(config)) {
-            try {
-                config = setNdkDefaults(config, project);
-            } catch (CoreException e) {
-                AdtPlugin.printErrorToConsole(project,
-                        "Unable to create launch configuration for project.");
-                return;
-            }
-        }
-
-        // launch
-        DebugUITools.launch(config, mode);
-    }
-
-    private boolean hasNdkAttributes(ILaunchConfiguration config) {
-        try {
-            // All NDK launch configurations have ATTR_REMOTE_TCP set to true
-            boolean isRemote = config.getAttribute(IGDBLaunchConfigurationConstants.ATTR_REMOTE_TCP,
-                    false);
-            return isRemote;
-        } catch (CoreException e) {
-            return false;
-        }
-    }
-
-    private ILaunchConfiguration setNdkDefaults(ILaunchConfiguration config, IProject project)
-            throws CoreException {
-        ILaunchConfigurationWorkingCopy wc = config.getWorkingCopy();
-        NdkHelper.setLaunchConfigDefaults(wc);
-        wc.setAttribute(ICDTLaunchConfigurationConstants.ATTR_PROJECT_NAME, project.getName());
-        return wc.doSave();
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.ndk/src/com/android/ide/eclipse/ndk/internal/launch/NdkLaunchConstants.java b/eclipse/plugins/com.android.ide.eclipse.ndk/src/com/android/ide/eclipse/ndk/internal/launch/NdkLaunchConstants.java
deleted file mode 100644
index ff70b2e..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.ndk/src/com/android/ide/eclipse/ndk/internal/launch/NdkLaunchConstants.java
+++ /dev/null
@@ -1,44 +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.ide.eclipse.ndk.internal.launch;
-
-import com.android.ide.eclipse.ndk.internal.Activator;
-import com.android.ide.eclipse.ndk.internal.NdkVariables;
-
-public class NdkLaunchConstants {
-    private static final String PREFIX = Activator.PLUGIN_ID + ".ndklaunch.";   //$NON-NLS-1$
-
-    public static final String ATTR_NDK_GDB = PREFIX + "gdb";                   //$NON-NLS-1$
-    public static final String ATTR_NDK_GDBINIT = PREFIX + "gdbinit";           //$NON-NLS-1$
-    public static final String ATTR_NDK_SOLIB = PREFIX + "solib";               //$NON-NLS-1$
-
-    public static final String DEFAULT_GDB_PORT = "5039";                       //$NON-NLS-1$
-    public static final String DEFAULT_GDB = getVar(NdkVariables.NDK_GDB);
-    public static final String DEFAULT_GDBINIT = "";                            //$NON-NLS-1$
-    public static final String DEFAULT_PROGRAM =
-            String.format("%1$s/obj/local/%2$s/app_process",                    //$NON-NLS-1$
-                    getVar(NdkVariables.NDK_PROJECT),
-                    getVar(NdkVariables.NDK_COMPAT_ABI));
-    public static final String DEFAULT_SOLIB_PATH =
-            String.format("%1$s/obj/local/%2$s/",                               //$NON-NLS-1$
-                    getVar(NdkVariables.NDK_PROJECT),
-                    getVar(NdkVariables.NDK_COMPAT_ABI));
-
-    private static String getVar(String varName) {
-        return "${" + varName + '}';                                            //$NON-NLS-1$
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.ndk/src/com/android/ide/eclipse/ndk/internal/launch/NdkMainLaunchConfigTab.java b/eclipse/plugins/com.android.ide.eclipse.ndk/src/com/android/ide/eclipse/ndk/internal/launch/NdkMainLaunchConfigTab.java
deleted file mode 100644
index 1e4b39e..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.ndk/src/com/android/ide/eclipse/ndk/internal/launch/NdkMainLaunchConfigTab.java
+++ /dev/null
@@ -1,61 +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.ide.eclipse.ndk.internal.launch;
-
-import com.android.ide.eclipse.adt.internal.launch.MainLaunchConfigTab;
-import com.android.ide.eclipse.adt.internal.project.ProjectChooserHelper.IProjectChooserFilter;
-import com.android.ide.eclipse.adt.internal.sdk.ProjectState;
-import com.android.ide.eclipse.adt.internal.sdk.Sdk;
-
-import org.eclipse.cdt.core.model.CoreModel;
-import org.eclipse.cdt.debug.core.ICDTLaunchConfigurationConstants;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
-
-@SuppressWarnings("restriction")
-public class NdkMainLaunchConfigTab extends MainLaunchConfigTab {
-    private static class NdkProjectOnlyFilter implements IProjectChooserFilter {
-        @Override
-        public boolean accept(IProject project) {
-            ProjectState state = Sdk.getProjectState(project);
-            if (state == null) {
-                return false;
-            }
-
-            return !state.isLibrary()
-                    && (CoreModel.hasCCNature(project) || CoreModel.hasCNature(project));
-        }
-
-        @Override
-        public boolean useCache() {
-            return true;
-        }
-    }
-
-    @Override
-    protected IProjectChooserFilter getProjectFilter() {
-        return new NdkProjectOnlyFilter();
-    }
-
-    @Override
-    public void performApply(ILaunchConfigurationWorkingCopy configuration) {
-        super.performApply(configuration);
-
-        configuration.setAttribute(ICDTLaunchConfigurationConstants.ATTR_PROJECT_NAME,
-                mProjText.getText().trim());
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.ndk/src/com/android/ide/eclipse/ndk/internal/launch/messages.properties b/eclipse/plugins/com.android.ide.eclipse.ndk/src/com/android/ide/eclipse/ndk/internal/launch/messages.properties
deleted file mode 100644
index 6770f2d..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.ndk/src/com/android/ide/eclipse/ndk/internal/launch/messages.properties
+++ /dev/null
@@ -1,32 +0,0 @@
-NdkGdbLaunchDelegate_Action_ActivityLaunch=Launching activity
-NdkGdbLaunchDelegate_Action_CheckAndroidDeviceVersion=Checking Android version on device
-NdkGdbLaunchDelegate_Action_KillExistingGdbServer=Killing existing gdbserver
-NdkGdbLaunchDelegate_Action_LaunchHostGdb=Launching host gdb
-NdkGdbLaunchDelegate_Action_LaunchingGdbServer=Launching gdbserver
-NdkGdbLaunchDelegate_Action_ObtainAppAbis=Obtaining ABI's supported by the application
-NdkGdbLaunchDelegate_Action_ObtainDevice=Obtaining device to use
-NdkGdbLaunchDelegate_Action_ObtainDeviceABI=Obtaining ABI's supported by the device
-NdkGdbLaunchDelegate_Action_PerformIncrementalBuild=Performing Incremental Build
-NdkGdbLaunchDelegate_Action_SettingUpPortForward=Setting up port forwarding
-NdkGdbLaunchDelegate_Action_SyncAppToDevice=Syncing application to device
-NdkGdbLaunchDelegate_Action_WaitGdbServerAttach=Waiting for gdbserver to attach to process
-NdkGdbLaunchDelegate_Action_WaitingForActivity=Waiting for activity to be launched
-NdkGdbLaunchDelegate_LaunchError_ActivityLaunchError=Error launching activity
-NdkGdbLaunchDelegate_LaunchError_Api8Needed=Native debugging requires API level 8 or above.
-NdkGdbLaunchDelegate_LaunchError_CouldNotGetProject=Couldn't get project object\!
-NdkGdbLaunchDelegate_LaunchError_gdbserverLaunchException=Exception while launching gdbserver:
-NdkGdbLaunchDelegate_LaunchError_gdbserverOutput=gdbserver output:
-NdkGdbLaunchDelegate_LaunchError_InstallError=Installation error
-NdkGdbLaunchDelegate_LaunchError_InterruptedWaitingForGdbserver=Interrupted while waiting for gdbserver to attach
-NdkGdbLaunchDelegate_LaunchError_NoActivityInManifest=The Manifest defines no activity\!
-NdkGdbLaunchDelegate_LaunchError_NoCompatibleAbi=Unable to find a compatible ABI
-NdkGdbLaunchDelegate_LaunchError_NoLauncherActivity=No launcher activity specified. Aborting launch.
-NdkGdbLaunchDelegate_LaunchError_NoSuchActivity=The specified activity does not exist\! Getting the launcher activity.
-NdkGdbLaunchDelegate_LaunchError_NullApk=Null APK
-NdkGdbLaunchDelegate_LaunchError_ObtainingAppFolder=Error while obtaining application data folder on device
-NdkGdbLaunchDelegate_LaunchError_PortForwarding=Error while setting up port forwarding
-NdkGdbLaunchDelegate_LaunchError_ProjectHasErrors=Your project contains error(s), please fix them before running your application.
-NdkGdbLaunchDelegate_LaunchError_PullFileError=Error while obtaining file from device
-NdkGdbLaunchDelegate_LaunchError_UnableToDetectAppAbi=Unable to detect application ABI's
-NdkGdbLaunchDelegate_LaunchError_UnknownAndroidDeviceVersion=Unknown Android version on device.
-NdkGdbLaunchDelegate_LaunchError_VerifyIfDebugBuild=Verify if the application was built with NDK_DEBUG=1
diff --git a/eclipse/plugins/com.android.ide.eclipse.ndk/src/com/android/ide/eclipse/ndk/internal/messages.properties b/eclipse/plugins/com.android.ide.eclipse.ndk/src/com/android/ide/eclipse/ndk/internal/messages.properties
deleted file mode 100644
index 63400ff..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.ndk/src/com/android/ide/eclipse/ndk/internal/messages.properties
+++ /dev/null
@@ -1,16 +0,0 @@
-AddNativeWizardPage_Description=Settings for generated native components for project.
-AddNativeWizardPage_LibraryName=Library Name:
-AddNativeWizardPage_Location_not_valid=NDK location not valid in preferences.
-AddNativeWizardPage_Title=Add Android Native Support
-NDKPreferencePage_Location=NDK Location
-NDKPreferencePage_not_a_valid_directory=Not a valid directory
-NDKPreferencePage_not_a_valid_NDK_directory=Not a valid NDK directory
-NDKPreferencePage_Preferences=Android NDK Preferences
-SetFolders_Missing_project_name=Missing project name
-SetFolders_No_folders=No folders
-SetFolders_Project_does_not_exist=Project does not exist
-SimpleFile_Bad_file_operation=bad file operation
-SimpleFile_Bundle_not_found=bundle not found
-SimpleFile_Could_not_fine_source=could not find source file: 
-SimpleFile_No_project_name=no project name
-SimpleFile_Project_does_not_exist=project does not exist
diff --git a/eclipse/plugins/com.android.ide.eclipse.ndk/src/com/android/ide/eclipse/ndk/internal/preferences/NdkPreferenceInitializer.java b/eclipse/plugins/com.android.ide.eclipse.ndk/src/com/android/ide/eclipse/ndk/internal/preferences/NdkPreferenceInitializer.java
deleted file mode 100644
index 9c03505..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.ndk/src/com/android/ide/eclipse/ndk/internal/preferences/NdkPreferenceInitializer.java
+++ /dev/null
@@ -1,33 +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.eclipse.ndk.internal.preferences;
-
-import com.android.ide.eclipse.ndk.internal.Activator;
-import com.android.ide.eclipse.ndk.internal.NdkManager;
-
-import org.eclipse.core.runtime.preferences.AbstractPreferenceInitializer;
-import org.eclipse.jface.preference.IPreferenceStore;
-
-public class NdkPreferenceInitializer extends AbstractPreferenceInitializer {
-
-    @Override
-    public void initializeDefaultPreferences() {
-        IPreferenceStore store = Activator.getDefault().getPreferenceStore();
-
-        store.setDefault(NdkManager.NDK_LOCATION, ""); //$NON-NLS-1$
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.ndk/src/com/android/ide/eclipse/ndk/internal/preferences/NdkPreferencePage.java b/eclipse/plugins/com.android.ide.eclipse.ndk/src/com/android/ide/eclipse/ndk/internal/preferences/NdkPreferencePage.java
deleted file mode 100644
index e1ab247..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.ndk/src/com/android/ide/eclipse/ndk/internal/preferences/NdkPreferencePage.java
+++ /dev/null
@@ -1,93 +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.eclipse.ndk.internal.preferences;
-
-import com.android.ide.eclipse.ndk.internal.Activator;
-import com.android.ide.eclipse.ndk.internal.Messages;
-import com.android.ide.eclipse.ndk.internal.NdkManager;
-
-import org.eclipse.jface.preference.DirectoryFieldEditor;
-import org.eclipse.jface.preference.FieldEditorPreferencePage;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchPreferencePage;
-
-public class NdkPreferencePage extends FieldEditorPreferencePage implements
-        IWorkbenchPreferencePage {
-
-    private NdkDirectoryFieldEditor mNdkDirectoryEditor;
-
-    public NdkPreferencePage() {
-        super(GRID);
-        setPreferenceStore(Activator.getDefault().getPreferenceStore());
-        setDescription(Messages.NDKPreferencePage_Preferences);
-    }
-
-    @Override
-    protected void createFieldEditors() {
-        mNdkDirectoryEditor = new NdkDirectoryFieldEditor(NdkManager.NDK_LOCATION,
-                Messages.NDKPreferencePage_Location, getFieldEditorParent());
-        addField(mNdkDirectoryEditor);
-    }
-
-    private static class NdkDirectoryFieldEditor extends DirectoryFieldEditor {
-        public NdkDirectoryFieldEditor(String name, String labelText, Composite parent) {
-            super(name, labelText, parent);
-            setEmptyStringAllowed(true);
-        }
-
-        @Override
-        protected boolean doCheckState() {
-            if (!super.doCheckState()) {
-                setErrorMessage(Messages.NDKPreferencePage_not_a_valid_directory);
-                return false;
-            }
-
-            String dirname = getTextControl().getText().trim();
-            if (!dirname.isEmpty() && !NdkManager.isValidNdkLocation(dirname)) {
-                setErrorMessage(Messages.NDKPreferencePage_not_a_valid_NDK_directory);
-                return false;
-            }
-
-            return true;
-        }
-
-        @Override
-        public Text getTextControl(Composite parent) {
-            setValidateStrategy(VALIDATE_ON_KEY_STROKE);
-            return super.getTextControl(parent);
-        }
-
-    }
-
-    @Override
-    public void init(IWorkbench workbench) {
-        // Nothing to do herea
-    }
-
-    @Override
-    public void dispose() {
-        super.dispose();
-
-        if (mNdkDirectoryEditor != null) {
-            mNdkDirectoryEditor.dispose();
-            mNdkDirectoryEditor = null;
-        }
-    }
-
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.ndk/src/com/android/ide/eclipse/ndk/internal/templates/SetFolders.java b/eclipse/plugins/com.android.ide.eclipse.ndk/src/com/android/ide/eclipse/ndk/internal/templates/SetFolders.java
deleted file mode 100644
index 2e8f714..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.ndk/src/com/android/ide/eclipse/ndk/internal/templates/SetFolders.java
+++ /dev/null
@@ -1,105 +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.eclipse.ndk.internal.templates;
-
-import com.android.ide.eclipse.ndk.internal.Messages;
-
-import org.eclipse.cdt.core.CCorePlugin;
-import org.eclipse.cdt.core.model.CoreModel;
-import org.eclipse.cdt.core.model.ICProject;
-import org.eclipse.cdt.core.model.IPathEntry;
-import org.eclipse.cdt.core.templateengine.TemplateCore;
-import org.eclipse.cdt.core.templateengine.process.ProcessArgument;
-import org.eclipse.cdt.core.templateengine.process.ProcessFailureException;
-import org.eclipse.cdt.core.templateengine.process.ProcessRunner;
-import org.eclipse.core.resources.IFolder;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.Path;
-
-import java.util.ArrayList;
-import java.util.List;
-
-public class SetFolders extends ProcessRunner {
-
-    @Override
-    public void process(TemplateCore template, ProcessArgument[] args, String processId,
-            IProgressMonitor monitor)
-            throws ProcessFailureException {
-        String projectName = null;
-        String[] sourceFolders = null;
-        String[] outputFolders = null;
-
-        for (ProcessArgument arg : args) {
-            String argName = arg.getName();
-            if (argName.equals("projectName")) { //$NON-NLS-1$
-                projectName = arg.getSimpleValue();
-            } else if (argName.equals("sourceFolders")) { //$NON-NLS-1$
-                sourceFolders = arg.getSimpleArrayValue();
-            } else if (argName.equals("outputFolders")) { //$NON-NLS-1$
-                outputFolders = arg.getSimpleArrayValue();
-            }
-        }
-
-        // Get the project
-        if (projectName == null)
-            throw new ProcessFailureException(Messages.SetFolders_Missing_project_name);
-
-        IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(projectName);
-        if (!project.exists())
-            throw new ProcessFailureException(Messages.SetFolders_Project_does_not_exist);
-
-        // Create the folders
-        if (sourceFolders == null && outputFolders == null)
-            throw new ProcessFailureException(Messages.SetFolders_No_folders);
-
-        try {
-            // Add them in
-            ICProject cproject = CCorePlugin.getDefault().getCoreModel().create(project);
-            IPathEntry[] pathEntries = cproject.getRawPathEntries();
-            List<IPathEntry> newEntries = new ArrayList<IPathEntry>(pathEntries.length);
-            for (IPathEntry pathEntry : pathEntries) {
-                // remove the old source and output entries
-                if (pathEntry.getEntryKind() != IPathEntry.CDT_SOURCE
-                        && pathEntry.getEntryKind() != IPathEntry.CDT_OUTPUT) {
-                    newEntries.add(pathEntry);
-                }
-            }
-            if (sourceFolders != null)
-                for (String sourceFolder : sourceFolders) {
-                    IFolder folder = project.getFolder(new Path(sourceFolder));
-                    if (!folder.exists())
-                        folder.create(true, true, monitor);
-                    newEntries.add(CoreModel.newSourceEntry(folder.getFullPath()));
-                }
-            if (outputFolders != null)
-                for (String outputFolder : outputFolders) {
-                    IFolder folder = project.getFolder(new Path(outputFolder));
-                    if (!folder.exists())
-                        folder.create(true, true, monitor);
-                    newEntries.add(CoreModel.newOutputEntry(folder.getFullPath()));
-                }
-            cproject.setRawPathEntries(newEntries.toArray(new IPathEntry[newEntries.size()]),
-                    monitor);
-        } catch (CoreException e) {
-            throw new ProcessFailureException(e);
-        }
-    }
-
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.ndk/src/com/android/ide/eclipse/ndk/internal/templates/SimpleFile.java b/eclipse/plugins/com.android.ide.eclipse.ndk/src/com/android/ide/eclipse/ndk/internal/templates/SimpleFile.java
deleted file mode 100644
index 7f249ca..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.ndk/src/com/android/ide/eclipse/ndk/internal/templates/SimpleFile.java
+++ /dev/null
@@ -1,125 +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.eclipse.ndk.internal.templates;
-
-import com.android.ide.eclipse.ndk.internal.Activator;
-import com.android.ide.eclipse.ndk.internal.Messages;
-
-import org.eclipse.cdt.core.templateengine.TemplateCore;
-import org.eclipse.cdt.core.templateengine.process.ProcessArgument;
-import org.eclipse.cdt.core.templateengine.process.ProcessFailureException;
-import org.eclipse.cdt.core.templateengine.process.ProcessRunner;
-import org.eclipse.core.resources.IContainer;
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IFolder;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.FileLocator;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.Path;
-import org.osgi.framework.Bundle;
-
-import java.io.IOException;
-import java.net.URL;
-import java.util.ArrayList;
-import java.util.List;
-
-public class SimpleFile extends ProcessRunner {
-
-    private static final class FileOp {
-        public String source;
-        public String destination;
-    }
-
-    @Override
-    public void process(TemplateCore template, ProcessArgument[] args, String processId,
-            IProgressMonitor monitor)
-            throws ProcessFailureException {
-
-        // Fetch the args
-        String projectName = null;
-        List<FileOp> fileOps = new ArrayList<FileOp>();
-
-        for (ProcessArgument arg : args) {
-            if (arg.getName().equals("projectName")) //$NON-NLS-1$
-                projectName = arg.getSimpleValue();
-            else if (arg.getName().equals("files")) { //$NON-NLS-1$
-                ProcessArgument[][] files = arg.getComplexArrayValue();
-                for (ProcessArgument[] file : files) {
-                    FileOp op = new FileOp();
-                    for (ProcessArgument fileArg : file) {
-                        if (fileArg.getName().equals("source")) //$NON-NLS-1$
-                            op.source = fileArg.getSimpleValue();
-                        else if (fileArg.getName().equals("destination")) //$NON-NLS-1$
-                            op.destination = fileArg.getSimpleValue();
-                    }
-                    if (op.source == null || op.destination == null)
-                        throw new ProcessFailureException(Messages.SimpleFile_Bad_file_operation);
-                    fileOps.add(op);
-                }
-            }
-        }
-
-        if (projectName == null)
-            throw new ProcessFailureException(Messages.SimpleFile_No_project_name);
-        IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(projectName);
-        if (!project.exists())
-            throw new ProcessFailureException(Messages.SimpleFile_Project_does_not_exist);
-
-        // Find bundle to find source files
-        Bundle bundle = Activator.getBundle(template.getTemplateInfo().getPluginId());
-        if (bundle == null)
-            throw new ProcessFailureException(Messages.SimpleFile_Bundle_not_found);
-
-        try {
-            for (FileOp op : fileOps) {
-                IFile destFile = project.getFile(new Path(op.destination));
-                if (destFile.exists())
-                    // don't overwrite files if they exist already
-                    continue;
-
-                // Make sure parent folders are created
-                mkDirs(project, destFile.getParent(), monitor);
-
-                URL sourceURL = FileLocator.find(bundle, new Path(op.source), null);
-                if (sourceURL == null)
-                    throw new ProcessFailureException(Messages.SimpleFile_Could_not_fine_source
-                            + op.source);
-
-                TemplatedInputStream in = new TemplatedInputStream(sourceURL.openStream(),
-                        template.getValueStore());
-                destFile.create(in, true, monitor);
-                in.close();
-            }
-        } catch (IOException e) {
-            throw new ProcessFailureException(e);
-        } catch (CoreException e) {
-            throw new ProcessFailureException(e);
-        }
-
-    }
-
-    private void mkDirs(IProject project, IContainer container, IProgressMonitor monitor)
-            throws CoreException {
-        if (container.exists())
-            return;
-        mkDirs(project, container.getParent(), monitor);
-        ((IFolder) container).create(true, true, monitor);
-    }
-
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.ndk/src/com/android/ide/eclipse/ndk/internal/templates/TemplatedInputStream.java b/eclipse/plugins/com.android.ide.eclipse.ndk/src/com/android/ide/eclipse/ndk/internal/templates/TemplatedInputStream.java
deleted file mode 100644
index 129caa3..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.ndk/src/com/android/ide/eclipse/ndk/internal/templates/TemplatedInputStream.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.ide.eclipse.ndk.internal.templates;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.Map;
-
-/**
- * Reads from a template substituting marked values from the supplied Map.
- */
-public class TemplatedInputStream extends InputStream {
-
-    private final InputStream mIn;
-    private final Map<String, String> mMap;
-    private char[] mSub;
-    private int mPos;
-    private int mMark;
-
-    public TemplatedInputStream(InputStream in, Map<String, String> map) {
-        this.mIn = in;
-        this.mMap = map;
-    }
-
-    @Override
-    public int read() throws IOException {
-        // if from a mark, return the char
-        if (mMark != 0) {
-            int c = mMark;
-            mMark = 0;
-            return c;
-        }
-
-        // return char from sub layer if available
-        if (mSub != null) {
-            char c = mSub[mPos++];
-            if (mPos >= mSub.length)
-                mSub = null;
-            return c;
-        }
-
-        int c = mIn.read();
-        if (c == '%') {
-            // check if it's a sub
-            c = mIn.read();
-            if (c == '{') {
-                // it's a sub
-                StringBuffer buff = new StringBuffer();
-                for (c = mIn.read(); c != '}' && c >= 0; c = mIn.read())
-                    buff.append((char) c);
-                String str = mMap.get(buff.toString());
-                if (str != null) {
-                    mSub = str.toCharArray();
-                    mPos = 0;
-                }
-                return read(); // recurse to get the real char
-            } else {
-                // not a sub
-                mMark = c;
-                return '%';
-            }
-        }
-
-        return c;
-    }
-
-    @Override
-    public void close() throws IOException {
-        super.close();
-        mIn.close();
-    }
-
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.ndk/src/com/android/ide/eclipse/ndk/internal/wizards/AddNativeWizard.java b/eclipse/plugins/com.android.ide.eclipse.ndk/src/com/android/ide/eclipse/ndk/internal/wizards/AddNativeWizard.java
deleted file mode 100644
index b3675ed..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.ndk/src/com/android/ide/eclipse/ndk/internal/wizards/AddNativeWizard.java
+++ /dev/null
@@ -1,130 +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.eclipse.ndk.internal.wizards;
-
-import com.android.ide.eclipse.ndk.internal.Activator;
-import com.android.ide.eclipse.ndk.internal.NdkManager;
-
-import org.eclipse.cdt.core.CCorePlugin;
-import org.eclipse.cdt.make.core.MakeCorePlugin;
-import org.eclipse.cdt.ui.CUIPlugin;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IWorkspace;
-import org.eclipse.core.resources.IWorkspaceRunnable;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.jface.operation.IRunnableWithProgress;
-import org.eclipse.jface.wizard.Wizard;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.WorkbenchException;
-
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-import java.util.HashMap;
-import java.util.Map;
-
-public class AddNativeWizard extends Wizard {
-
-    private final IProject mProject;
-    private final IWorkbenchWindow mWindow;
-
-    private AddNativeWizardPage mAddNativeWizardPage;
-    private Map<String, String> mTemplateArgs = new HashMap<String, String>();
-
-    public AddNativeWizard(IProject project, IWorkbenchWindow window) {
-        mProject = project;
-        mWindow = window;
-        mTemplateArgs.put(NdkManager.LIBRARY_NAME, project.getName());
-    }
-
-    @Override
-    public void addPages() {
-        mAddNativeWizardPage = new AddNativeWizardPage(mTemplateArgs);
-        addPage(mAddNativeWizardPage);
-    }
-
-    @Override
-    public boolean performFinish() {
-        // Switch to C/C++ Perspective
-        try {
-            mWindow.getWorkbench().showPerspective(CUIPlugin.ID_CPERSPECTIVE, mWindow);
-        } catch (WorkbenchException e1) {
-            Activator.log(e1);
-        }
-
-        mAddNativeWizardPage.updateArgs(mTemplateArgs);
-
-        IRunnableWithProgress op = new IRunnableWithProgress() {
-            @Override
-            public void run(IProgressMonitor monitor) throws InvocationTargetException,
-                    InterruptedException {
-                IWorkspaceRunnable op1 = new IWorkspaceRunnable() {
-                    @Override
-                    public void run(IProgressMonitor monitor1) throws CoreException {
-                        // Convert to CDT project
-                        CCorePlugin.getDefault().convertProjectToCC(mProject, monitor1,
-                                MakeCorePlugin.MAKE_PROJECT_ID);
-                        // Set up build information
-                        new NdkWizardHandler().convertProject(mProject, monitor1);
-
-                        // When using CDT 8.1.x, disable the language settings provider mechanism
-                        // for scanner discovery. Use the classloader to load the class since it
-                        // will not be available pre 8.1.
-                        try {
-                            @SuppressWarnings("rawtypes")
-                            Class c = getClass().getClassLoader().loadClass(
-                                    "org.eclipse.cdt.core.language.settings.providers.ScannerDiscoveryLegacySupport"); //$NON-NLS-1$
-
-                            @SuppressWarnings("unchecked")
-                            Method m = c.getMethod(
-                                    "setLanguageSettingsProvidersFunctionalityEnabled", //$NON-NLS-1$
-                                    IProject.class, boolean.class);
-
-                            m.invoke(null, mProject, false);
-                        } catch (Exception e) {
-                            // ignore all exceptions: On pre 8.1.x CDT, this class will not be
-                            // found, but this options only needs to be set in 8.1.x
-                        }
-
-                        // Run the template
-                        NdkManager.addNativeSupport(mProject, mTemplateArgs, monitor1);
-                    }
-                };
-                // TODO run from a job
-                IWorkspace workspace = ResourcesPlugin.getWorkspace();
-                try {
-                    workspace.run(op1, workspace.getRoot(), 0, new NullProgressMonitor());
-                } catch (CoreException e) {
-                    throw new InvocationTargetException(e);
-                }
-            }
-        };
-        try {
-            getContainer().run(false, true, op);
-            return true;
-        } catch (InterruptedException e) {
-            Activator.log(e);
-            return false;
-        } catch (InvocationTargetException e) {
-            Activator.log(e);
-            return false;
-        }
-    }
-
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.ndk/src/com/android/ide/eclipse/ndk/internal/wizards/AddNativeWizardPage.java b/eclipse/plugins/com.android.ide.eclipse.ndk/src/com/android/ide/eclipse/ndk/internal/wizards/AddNativeWizardPage.java
deleted file mode 100644
index 65af270..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.ndk/src/com/android/ide/eclipse/ndk/internal/wizards/AddNativeWizardPage.java
+++ /dev/null
@@ -1,82 +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.eclipse.ndk.internal.wizards;
-
-import com.android.ide.eclipse.ndk.internal.Messages;
-import com.android.ide.eclipse.ndk.internal.NdkManager;
-
-import org.eclipse.jface.wizard.WizardPage;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Text;
-
-import java.util.Map;
-
-public class AddNativeWizardPage extends WizardPage {
-
-    private final String defaultLibraryName;
-
-    private Text libraryNameText;
-
-    public AddNativeWizardPage(Map<String, String> templateArgs) {
-        super("addNativeWizardPage"); //$NON-NLS-1$
-        setDescription(Messages.AddNativeWizardPage_Description);
-        setTitle(Messages.AddNativeWizardPage_Title);
-
-        defaultLibraryName = templateArgs.get(NdkManager.LIBRARY_NAME);
-        if (!NdkManager.isNdkLocationValid()) {
-            setErrorMessage(Messages.AddNativeWizardPage_Location_not_valid);
-        }
-    }
-
-    @Override
-    public boolean isPageComplete() {
-        return NdkManager.isNdkLocationValid();
-    }
-
-    @Override
-    public void createControl(Composite parent) {
-        Composite container = new Composite(parent, SWT.NULL);
-        setControl(container);
-        container.setLayout(new GridLayout(2, false));
-
-        Label lblLibraryName = new Label(container, SWT.NONE);
-        lblLibraryName.setText(Messages.AddNativeWizardPage_LibraryName);
-
-        Composite composite = new Composite(container, SWT.NONE);
-        composite.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
-        composite.setLayout(new GridLayout(3, false));
-
-        Label lblLib = new Label(composite, SWT.NONE);
-        lblLib.setText("lib"); //$NON-NLS-1$
-
-        libraryNameText = new Text(composite, SWT.BORDER);
-        libraryNameText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
-        libraryNameText.setText(defaultLibraryName);
-
-        Label lblso = new Label(composite, SWT.NONE);
-        lblso.setText(".so"); //$NON-NLS-1$
-    }
-
-    public void updateArgs(Map<String, String> templateArgs) {
-        templateArgs.put(NdkManager.LIBRARY_NAME, libraryNameText.getText());
-    }
-
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.ndk/src/com/android/ide/eclipse/ndk/internal/wizards/NdkWizardHandler.java b/eclipse/plugins/com.android.ide.eclipse.ndk/src/com/android/ide/eclipse/ndk/internal/wizards/NdkWizardHandler.java
deleted file mode 100644
index fa0b92b..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.ndk/src/com/android/ide/eclipse/ndk/internal/wizards/NdkWizardHandler.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.ide.eclipse.ndk.internal.wizards;
-
-import org.eclipse.cdt.managedbuilder.core.IToolChain;
-import org.eclipse.cdt.managedbuilder.core.ManagedBuildManager;
-import org.eclipse.cdt.managedbuilder.ui.wizards.STDWizardHandler;
-
-public class NdkWizardHandler extends STDWizardHandler {
-
-    public NdkWizardHandler() {
-        super(null, null);
-    }
-
-    @Override
-    public IToolChain[] getSelectedToolChains() {
-        IToolChain[] tcs = ManagedBuildManager.getRealToolChains();
-        for (IToolChain tc : tcs) {
-            if (tc.getId().equals("com.android.toolchain.gcc")) //$NON-NLS-1$
-                return new IToolChain[] {
-                    tc
-                };
-        }
-        return super.getSelectedToolChains();
-    }
-
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.ndk/templates/addNdkSupport.xml b/eclipse/plugins/com.android.ide.eclipse.ndk/templates/addNdkSupport.xml
deleted file mode 100644
index 40c7954..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.ndk/templates/addNdkSupport.xml
+++ /dev/null
@@ -1,33 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-<template
-	type="ProjTempl"
-	version="1.0"
-	revision="1.0"
-	id="AddNdkSupport"
-	label="Add Android NDK Support"
-	description="Adds NDK support to Android Java projects"
-	help="help.html">
-	<process type="com.android.ide.eclipse.ndk.SetFolders">
-		<simple name="projectName" value="$(projectName)"/>
-		<simple-array name="sourceFolders">
-			<element value="jni"/>
-		</simple-array>
-		<simple-array name="outputFolders">
-			<element value="obj"/>
-			<element value="libs"/>
-		</simple-array>
-	</process>
-	<process type="com.android.ide.eclipse.ndk.SimpleFile">
-		<simple name="projectName" value="$(projectName)"/>
-		<complex-array name="files">
-			<element>
-				<simple name="source" value="templates/resources/tAndroid.mk"/>
-				<simple name="destination" value="jni/Android.mk"/>
-			</element>
-			<element>
-				<simple name="source" value="templates/resources/main.cpp"/>
-				<simple name="destination"	value="jni/$(libraryName).cpp"/>
-			</element>
-		</complex-array>
-	</process>
-</template>
diff --git a/eclipse/plugins/com.android.ide.eclipse.ndk/templates/resources/main.cpp b/eclipse/plugins/com.android.ide.eclipse.ndk/templates/resources/main.cpp
deleted file mode 100644
index 6434c66..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.ndk/templates/resources/main.cpp
+++ /dev/null
@@ -1 +0,0 @@
-#include <jni.h>
diff --git a/eclipse/plugins/com.android.ide.eclipse.ndk/templates/resources/tAndroid.mk b/eclipse/plugins/com.android.ide.eclipse.ndk/templates/resources/tAndroid.mk
deleted file mode 100644
index cd9d479..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.ndk/templates/resources/tAndroid.mk
+++ /dev/null
@@ -1,8 +0,0 @@
-LOCAL_PATH := $(call my-dir)
-
-include $(CLEAR_VARS)
-
-LOCAL_MODULE    := %{libraryName}
-LOCAL_SRC_FILES := %{libraryName}.cpp
-
-include $(BUILD_SHARED_LIBRARY)
diff --git a/eclipse/plugins/com.android.ide.eclipse.pdt/.classpath b/eclipse/plugins/com.android.ide.eclipse.pdt/.classpath
deleted file mode 100644
index 751c8f2..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.pdt/.classpath
+++ /dev/null
@@ -1,7 +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.pde.core.requiredPlugins"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/eclipse/plugins/com.android.ide.eclipse.pdt/.project b/eclipse/plugins/com.android.ide.eclipse.pdt/.project
deleted file mode 100644
index 091b013..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.pdt/.project
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>plugin-pdt</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.PluginNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/eclipse/plugins/com.android.ide.eclipse.pdt/.settings/org.eclipse.jdt.core.prefs b/eclipse/plugins/com.android.ide.eclipse.pdt/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index ea66196..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.pdt/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,98 +0,0 @@
-eclipse.preferences.version=1
-org.eclipse.jdt.core.compiler.annotation.missingNonNullByDefaultAnnotation=ignore
-org.eclipse.jdt.core.compiler.annotation.nonnull=com.android.annotations.NonNull
-org.eclipse.jdt.core.compiler.annotation.nonnullbydefault=com.android.annotations.NonNullByDefault
-org.eclipse.jdt.core.compiler.annotation.nonnullisdefault=disabled
-org.eclipse.jdt.core.compiler.annotation.nullable=com.android.annotations.Nullable
-org.eclipse.jdt.core.compiler.annotation.nullanalysis=enabled
-org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6
-org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.6
-org.eclipse.jdt.core.compiler.debug.lineNumber=generate
-org.eclipse.jdt.core.compiler.debug.localVariable=generate
-org.eclipse.jdt.core.compiler.debug.sourceFile=generate
-org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
-org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
-org.eclipse.jdt.core.compiler.problem.comparingIdentical=warning
-org.eclipse.jdt.core.compiler.problem.deadCode=warning
-org.eclipse.jdt.core.compiler.problem.deprecation=warning
-org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
-org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
-org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
-org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=ignore
-org.eclipse.jdt.core.compiler.problem.fallthroughCase=warning
-org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
-org.eclipse.jdt.core.compiler.problem.fieldHiding=warning
-org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
-org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
-org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
-org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
-org.eclipse.jdt.core.compiler.problem.includeNullInfoFromAsserts=enabled
-org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
-org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=warning
-org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
-org.eclipse.jdt.core.compiler.problem.localVariableHiding=warning
-org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
-org.eclipse.jdt.core.compiler.problem.missingDefaultCase=ignore
-org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=warning
-org.eclipse.jdt.core.compiler.problem.missingEnumCaseDespiteDefault=disabled
-org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=warning
-org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=error
-org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled
-org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
-org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=ignore
-org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
-org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
-org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore
-org.eclipse.jdt.core.compiler.problem.nullAnnotationInferenceConflict=warning
-org.eclipse.jdt.core.compiler.problem.nullReference=warning
-org.eclipse.jdt.core.compiler.problem.nullSpecInsufficientInfo=warning
-org.eclipse.jdt.core.compiler.problem.nullSpecViolation=warning
-org.eclipse.jdt.core.compiler.problem.nullUncheckedConversion=ignore
-org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
-org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
-org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=warning
-org.eclipse.jdt.core.compiler.problem.potentialNullReference=warning
-org.eclipse.jdt.core.compiler.problem.potentialNullSpecViolation=error
-org.eclipse.jdt.core.compiler.problem.potentiallyUnclosedCloseable=warning
-org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
-org.eclipse.jdt.core.compiler.problem.redundantNullAnnotation=warning
-org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
-org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=ignore
-org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=warning
-org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=ignore
-org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=ignore
-org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
-org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
-org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=enabled
-org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
-org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
-org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
-org.eclipse.jdt.core.compiler.problem.unavoidableGenericTypeProblems=disabled
-org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
-org.eclipse.jdt.core.compiler.problem.unclosedCloseable=error
-org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
-org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
-org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=warning
-org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=warning
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.unusedImport=warning
-org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
-org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
-org.eclipse.jdt.core.compiler.problem.unusedObjectAllocation=warning
-org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
-org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
-org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
-org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
-org.eclipse.jdt.core.compiler.source=1.6
diff --git a/eclipse/plugins/com.android.ide.eclipse.pdt/META-INF/MANIFEST.MF b/eclipse/plugins/com.android.ide.eclipse.pdt/META-INF/MANIFEST.MF
deleted file mode 100644
index a888ae4..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.pdt/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,21 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: Pdt
-Bundle-SymbolicName: com.android.ide.eclipse.pdt;singleton:=true
-Bundle-Version: 24.3.3.qualifier
-Bundle-Vendor: The Android Open Source Project
-Require-Bundle: org.eclipse.ui,
- org.eclipse.core.runtime,
- com.android.ide.eclipse.ddms,
- org.eclipse.core.resources,
- org.eclipse.jdt.core,
- org.eclipse.jdt.ui,
- org.eclipse.jface.text,
- org.eclipse.ui.editors,
- org.eclipse.jdt.launching,
- org.eclipse.debug.core,
- org.eclipse.debug.ui,
- org.eclipse.ui.ide
-Bundle-Activator: com.android.ide.eclipse.pdt.PdtPlugin
-Bundle-ActivationPolicy: lazy
-Bundle-RequiredExecutionEnvironment: JavaSE-1.6
diff --git a/eclipse/plugins/com.android.ide.eclipse.pdt/build.properties b/eclipse/plugins/com.android.ide.eclipse.pdt/build.properties
deleted file mode 100644
index e9863e2..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.pdt/build.properties
+++ /dev/null
@@ -1,5 +0,0 @@
-source.. = src/
-output.. = bin/
-bin.includes = META-INF/,\
-               .,\
-               plugin.xml
diff --git a/eclipse/plugins/com.android.ide.eclipse.pdt/plugin.xml b/eclipse/plugins/com.android.ide.eclipse.pdt/plugin.xml
deleted file mode 100644
index b2d622a..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.pdt/plugin.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.4"?>
-<plugin>
-   <extension
-         point="org.eclipse.ui.preferencePages">
-      <page
-            class="com.android.ide.eclipse.pdt.internal.preferences.PrefPage"
-            id="com.android.ide.eclipse.preferences.main"
-            name="Android"/>
-   </extension>
-   <extension
-         point="com.android.ide.eclipse.ddms.toolsLocator">
-      <locator
-            class="com.android.ide.eclipse.pdt.internal.ToolsLocator">
-      </locator>
-   </extension>
-   <extension
-         point="com.android.ide.eclipse.ddms.debuggerConnector">
-      <connector
-            class="com.android.ide.eclipse.pdt.internal.DebuggerConnector">
-      </connector>
-   </extension>
-   <extension
-         point="com.android.ide.eclipse.ddms.sourceRevealer">
-      <revealer
-            class="com.android.ide.eclipse.pdt.internal.SourceRevealer">
-      </revealer>
-   </extension>
-
-</plugin>
diff --git a/eclipse/plugins/com.android.ide.eclipse.pdt/src/com/android/ide/eclipse/pdt/PdtPlugin.java b/eclipse/plugins/com.android.ide.eclipse.pdt/src/com/android/ide/eclipse/pdt/PdtPlugin.java
deleted file mode 100644
index 3b53850..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.pdt/src/com/android/ide/eclipse/pdt/PdtPlugin.java
+++ /dev/null
@@ -1,146 +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.eclipse.pdt;
-
-import com.android.ide.eclipse.ddms.DdmsPlugin;
-import com.android.ide.eclipse.pdt.internal.preferences.PrefPage;
-
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.jface.util.IPropertyChangeListener;
-import org.eclipse.jface.util.PropertyChangeEvent;
-import org.eclipse.ui.plugin.AbstractUIPlugin;
-import org.osgi.framework.BundleContext;
-
-public class PdtPlugin extends AbstractUIPlugin {
-
-    public final static String PLUGIN_ID = "com.android.ide.eclipse.pdt"; //$NON-NLS-1$
-    private static PdtPlugin sPlugin;
-
-    public PdtPlugin() {
-        sPlugin = this;
-    }
-
-    /**
-     * Returns the shared instance
-     *
-     * @return the shared instance
-     */
-    public static synchronized PdtPlugin getDefault() {
-        return sPlugin;
-    }
-
-    @Override
-    public void start(BundleContext context) throws Exception {
-        super.start(context);
-
-        // set the listener for the preference change
-        getPreferenceStore().addPropertyChangeListener(new IPropertyChangeListener() {
-            @Override
-            public void propertyChange(PropertyChangeEvent event) {
-                // if the SDK changed, we have to do some extra work
-                if (PrefPage.PREFS_DEVTREE_DIR.equals(event.getProperty())) {
-                    // restart adb, in case it's a different version
-                    DdmsPlugin.setToolsLocation(getAdbLocation(), true /* startAdb */,
-                            getHprofConvLocation(), getTraceViewLocation());
-                }
-            }
-        });
-    }
-
-    /**
-     * Returns the location of the dev tree or <code>null</code> if unknown.
-     */
-    public static String getDevTree() {
-        // this always return a store, even a temp one if an error occurred.
-        IPreferenceStore store = sPlugin.getPreferenceStore();
-
-        // returns an empty, non-null, string if the preference is not found.
-        String devTree = store.getString(PrefPage.PREFS_DEVTREE_DIR);
-
-        if (devTree.length() == 0) {
-            devTree = System.getenv("ANDROID_BUILD_TOP"); //$NON-NLS-1$
-        }
-
-        return devTree;
-    }
-
-    /**
-     * Returns the location of adb or <code>null</code> if unknown.
-     */
-    public static String getAdbLocation() {
-        String devTreeBin = getDevTreeOutBin();
-
-        if (devTreeBin != null && devTreeBin.length() > 0) {
-            return devTreeBin + "adb"; //$NON-NLS-1$
-        }
-
-        return null;
-    }
-
-    /**
-     * Returns the location of hprof-conv or <code>null</code> if unknown.
-     */
-    public static String getHprofConvLocation() {
-        String devTreeBin = getDevTreeOutBin();
-
-        if (devTreeBin != null && devTreeBin.length() > 0) {
-            return devTreeBin + "hprof-conv"; //$NON-NLS-1$
-        }
-
-        return null;
-    }
-
-    /**
-     * Returns the location of traceview or <code>null</code> if unknown.
-     */
-    public static String getTraceViewLocation() {
-        String devTreeBin = getDevTreeOutBin();
-
-        if (devTreeBin != null && devTreeBin.length() > 0) {
-            return devTreeBin + "traceview"; //$NON-NLS-1$
-        }
-
-        return null;
-    }
-
-    private static String getDevTreeOutBin() {
-        String devTree = getDevTree();
-
-        if (devTree != null && devTree.length() > 0) {
-            return devTree + "/out/host/" + currentPlatform() + "/bin/"; //$NON-NLS-1$ //$NON-NLS-2$
-        }
-
-        return null;
-    }
-
-    /**
-     * Returns the current platform name as used by the Android build system
-     *
-     */
-    private static String currentPlatform() {
-        String os = System.getProperty("os.name");          //$NON-NLS-1$
-        if (os.startsWith("Mac OS")) {                      //$NON-NLS-1$
-            return "darwin-x86";                            //$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-x86";                             //$NON-NLS-1$
-        }
-
-        return ""; //$NON-NLS-1$
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.pdt/src/com/android/ide/eclipse/pdt/internal/DebuggerConnector.java b/eclipse/plugins/com.android.ide.eclipse.pdt/src/com/android/ide/eclipse/pdt/internal/DebuggerConnector.java
deleted file mode 100644
index 238cad3..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.pdt/src/com/android/ide/eclipse/pdt/internal/DebuggerConnector.java
+++ /dev/null
@@ -1,155 +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.eclipse.pdt.internal;
-
-import com.android.ide.eclipse.ddms.IDebuggerConnector;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.debug.core.DebugPlugin;
-import org.eclipse.debug.core.ILaunchConfiguration;
-import org.eclipse.debug.core.ILaunchConfigurationType;
-import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
-import org.eclipse.debug.core.ILaunchManager;
-import org.eclipse.debug.ui.DebugUITools;
-import org.eclipse.jdt.launching.IJavaLaunchConfigurationConstants;
-
-import java.util.HashMap;
-import java.util.Map;
-
-/**
- * Implementation of the com.android.ide.ddms.debuggerConnector extension point.
- */
-public class DebuggerConnector extends DevTreeProjectProvider implements IDebuggerConnector {
-
-    private final static String ATTR_CONNECT_MAP_PORT = "port"; //$NON-NLS-1$
-    private final static String ATTR_CONNECT_MAP_HOSTNAME = "hostname"; //$NON-NLS-1$
-
-    @Override
-    public boolean isWorkspaceApp(String appName) {
-        return getProject() != null;
-    }
-
-    @Override
-    public boolean connectDebugger(String appName, int appPort, int selectedPort) {
-        IProject project = getProject();
-
-        if (project != null) {
-            // get the launch manager
-            ILaunchManager manager = DebugPlugin.getDefault().getLaunchManager();
-
-            // get the config for the remote launch config.
-            ILaunchConfigurationType configType = manager.getLaunchConfigurationType(
-                            IJavaLaunchConfigurationConstants.ID_REMOTE_JAVA_APPLICATION);
-
-            String projectName = project.getName();
-
-            // look for an existing launch config
-            ILaunchConfiguration config = findConfig(manager, configType, projectName,
-                    selectedPort);
-
-            if (config == null) {
-                // Didn't find a matching config, so we make one.
-                // It'll be made in the "working copy" object first.
-                ILaunchConfigurationWorkingCopy wc = null;
-
-                try {
-                    // make the working copy object with a unique name
-                    wc = configType.newInstance(null,
-                            manager.generateUniqueLaunchConfigurationNameFrom(projectName));
-
-                    // set the project name
-                    wc.setAttribute(IJavaLaunchConfigurationConstants.ATTR_PROJECT_NAME,
-                            projectName);
-
-                    // set the connect map info
-                    Map<String, String> connectMap = new HashMap<String, String>();
-                    connectMap.put(ATTR_CONNECT_MAP_PORT, Integer.toString(selectedPort));
-                    connectMap.put(ATTR_CONNECT_MAP_HOSTNAME, "localhost"); //$NON-NLS-1$
-                    wc.setAttribute(IJavaLaunchConfigurationConstants.ATTR_CONNECT_MAP, connectMap);
-
-                    // set the VM connector ID
-                    wc.setAttribute(IJavaLaunchConfigurationConstants.ATTR_VM_CONNECTOR,
-                            IJavaLaunchConfigurationConstants.ID_SOCKET_ATTACH_VM_CONNECTOR);
-
-                    // save the working copy to get the launch config object which we return.
-                    config = wc.doSave();
-
-                } catch (CoreException e) {
-
-                }
-
-            }
-
-            if (config != null) {
-                DebugUITools.launch(config, ILaunchManager.DEBUG_MODE);
-                return true;
-            }
-        }
-
-        return false;
-    }
-
-    /**
-     * Looks for and returns an existing {@link ILaunchConfiguration} object for a
-     * specified project and connection port.
-     * @param manager The {@link ILaunchManager}.
-     * @param type The {@link ILaunchConfigurationType}.
-     * @param projectName The name of the project
-     * @param connectionPort the remote connection port.
-     * @return an existing <code>ILaunchConfiguration</code> object matching the project, or
-     *      <code>null</code>.
-     */
-    private static ILaunchConfiguration findConfig(ILaunchManager manager,
-            ILaunchConfigurationType type,
-            String projectName, int connectionPort) {
-        try {
-            ILaunchConfiguration[] configs = manager.getLaunchConfigurations(type);
-
-            // look for one set up for the project with a debug equal to the selected debug port.
-            for (ILaunchConfiguration config : configs) {
-
-                Map<?, ?> attributes = config.getAttributes();
-
-                String name = (String) attributes.get(
-                        IJavaLaunchConfigurationConstants.ATTR_PROJECT_NAME);
-
-                if (name == null || name.equals(projectName) == false) {
-                    continue;
-                }
-
-                Map<?, ?> connectMap = (Map<?, ?>) attributes.get(
-                        IJavaLaunchConfigurationConstants.ATTR_CONNECT_MAP);
-
-                if (connectMap != null) {
-                    String portStr = (String) connectMap.get(ATTR_CONNECT_MAP_PORT);
-                    if (portStr != null) {
-                        Integer port = Integer.valueOf(portStr);
-                        if (connectionPort == port) {
-                            return config;
-                        }
-                    }
-                }
-
-            }
-        } catch (CoreException e) {
-        }
-
-        // didn't find anything that matches. Return null
-        return null;
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.pdt/src/com/android/ide/eclipse/pdt/internal/DevTreeProjectProvider.java b/eclipse/plugins/com.android.ide.eclipse.pdt/src/com/android/ide/eclipse/pdt/internal/DevTreeProjectProvider.java
deleted file mode 100644
index b44d2cb..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.pdt/src/com/android/ide/eclipse/pdt/internal/DevTreeProjectProvider.java
+++ /dev/null
@@ -1,140 +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.eclipse.pdt.internal;
-
-import com.android.ide.eclipse.pdt.PdtPlugin;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IWorkspace;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.jdt.core.JavaCore;
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-import org.eclipse.jface.viewers.LabelProvider;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.window.Window;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.dialogs.ListDialog;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
-/**
- * Base class providing a {@link #getProject()} method to find the project matching the dev tree.
- *
- */
-class DevTreeProjectProvider {
-    protected IProject getProject() {
-        // Get the list of project for the current workspace
-        IWorkspace workspace = ResourcesPlugin.getWorkspace();
-        List<IProject> projects = Arrays.asList(workspace.getRoot().getProjects());
-        if (projects.size() == 0) {
-            return null;
-        }
-
-        // get the location of the Dev tree
-        String devTree = PdtPlugin.getDevTree();
-        IPath devTreePath = null;
-        if (devTree != null) {
-            devTreePath = new Path(devTree);
-        }
-
-        // filter the list of projects in workspace by 2 conditions:
-        //        1. Only look at Java projects
-        //        2. If dev tree location is set, only look at projects within the dev tree
-
-        List<IProject> devTreeProjects = new ArrayList<IProject>(projects.size());
-
-        for (IProject p: projects) {
-            if (!p.isOpen()) {
-                continue;
-            }
-
-            if (!hasJavaNature(p)) {
-                continue;
-            }
-
-            if (devTreePath == null || devTreePath.isPrefixOf(p.getLocation())) {
-                devTreeProjects.add(p);
-            }
-        }
-
-        return selectProject(devTreeProjects);
-    }
-
-    private IProject selectProject(List<IProject> devTreeProjects) {
-        if (devTreeProjects.size() == 0) {
-            return null;
-        }
-
-        if (devTreeProjects.size() == 1) {
-            return devTreeProjects.get(0);
-        }
-
-        // if there are multiple choices, prompt the user
-        IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
-        if (window == null) {
-            return null;
-        }
-
-        ListDialog dlg = new ListDialog(window.getShell());
-        dlg.setMessage("Select Project");
-        dlg.setInput(devTreeProjects);
-        dlg.setContentProvider(new IStructuredContentProvider() {
-            @Override
-            public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-            }
-
-            @Override
-            public void dispose() {
-            }
-
-            @Override
-            public Object[] getElements(Object inputElement) {
-                return ((List<?>) inputElement).toArray();
-            }
-        });
-        dlg.setLabelProvider(new LabelProvider() {
-            @Override
-            public String getText(Object element) {
-                return ((IProject) element).getName();
-            }
-        });
-        dlg.setHelpAvailable(false);
-
-        if (dlg.open() == Window.OK) {
-            Object[] selectedMatches = dlg.getResult();
-            if (selectedMatches.length > 0) {
-                return (IProject) selectedMatches[0];
-            }
-        }
-
-        return null;
-    }
-
-    private boolean hasJavaNature(IProject p) {
-        try {
-            return p.hasNature(JavaCore.NATURE_ID);
-        } catch (CoreException e) {
-            return false;
-        }
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.pdt/src/com/android/ide/eclipse/pdt/internal/SourceRevealer.java b/eclipse/plugins/com.android.ide.eclipse.pdt/src/com/android/ide/eclipse/pdt/internal/SourceRevealer.java
deleted file mode 100644
index 51011e1..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.pdt/src/com/android/ide/eclipse/pdt/internal/SourceRevealer.java
+++ /dev/null
@@ -1,180 +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.eclipse.pdt.internal;
-
-import com.android.ide.eclipse.ddms.ISourceRevealer;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.IMethod;
-import org.eclipse.jdt.core.IType;
-import org.eclipse.jdt.core.JavaCore;
-import org.eclipse.jdt.core.JavaModelException;
-import org.eclipse.jdt.core.search.IJavaSearchConstants;
-import org.eclipse.jdt.core.search.SearchEngine;
-import org.eclipse.jdt.core.search.SearchMatch;
-import org.eclipse.jdt.core.search.SearchParticipant;
-import org.eclipse.jdt.core.search.SearchPattern;
-import org.eclipse.jdt.core.search.SearchRequestor;
-import org.eclipse.jdt.ui.JavaUI;
-import org.eclipse.jdt.ui.actions.OpenJavaPerspectiveAction;
-import org.eclipse.jface.text.BadLocationException;
-import org.eclipse.jface.text.IDocument;
-import org.eclipse.jface.text.IRegion;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IPerspectiveRegistry;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.WorkbenchException;
-import org.eclipse.ui.texteditor.IDocumentProvider;
-import org.eclipse.ui.texteditor.ITextEditor;
-
-/**
- * Implementation of the com.android.ide.ddms.sourceRevealer extension point.
- * This implementation is a copy of com.android.ide.eclipse.adt.SourceRevealer.
- */
-public class SourceRevealer extends DevTreeProjectProvider implements ISourceRevealer {
-
-    @Override
-    public boolean reveal(String applicationName, String className, int line) {
-        IProject project = getProject();
-
-        if (project != null) {
-            // Inner classes are pointless: All we need is the enclosing type to find the file,
-            // and the line number.
-            // Since the anonymous ones will cause IJavaProject#findType to fail, we remove
-            // all of them.
-            int pos = className.indexOf('$');
-            if (pos != -1) {
-                className = className.substring(0, pos);
-            }
-
-            // get the java project
-            IJavaProject javaProject = JavaCore.create(project);
-
-            try {
-                // look for the IType matching the class name.
-                IType result = javaProject.findType(className);
-                if (result != null && result.exists()) {
-                    // before we show the type in an editor window, we make sure the current
-                    // workbench page has an editor area (typically the ddms perspective doesn't).
-                    IWorkbench workbench = PlatformUI.getWorkbench();
-                    IWorkbenchWindow window = workbench.getActiveWorkbenchWindow();
-                    IWorkbenchPage page = window.getActivePage();
-                    if (page.isEditorAreaVisible() == false) {
-                        // no editor area? we open the java perspective.
-                        new OpenJavaPerspectiveAction().run();
-                    }
-
-                    IEditorPart editor = JavaUI.openInEditor(result);
-                    if (editor instanceof ITextEditor) {
-                        // get the text editor that was just opened.
-                        ITextEditor textEditor = (ITextEditor)editor;
-
-                        IEditorInput input = textEditor.getEditorInput();
-
-                        // get the location of the line to show.
-                        IDocumentProvider documentProvider = textEditor.getDocumentProvider();
-                        IDocument document = documentProvider.getDocument(input);
-                        IRegion lineInfo = document.getLineInformation(line - 1);
-
-                        // select and reveal the line.
-                        textEditor.selectAndReveal(lineInfo.getOffset(), lineInfo.getLength());
-                    }
-
-                    return true;
-                }
-            } catch (JavaModelException e) {
-            } catch (PartInitException e) {
-            } catch (BadLocationException e) {
-            }
-        }
-
-        return false;
-    }
-
-    @Override
-    public boolean revealMethod(String fqmn, String fileName, int lineNumber, String perspective) {
-        SearchEngine se = new SearchEngine();
-        SearchPattern searchPattern = SearchPattern.createPattern(
-                fqmn,
-                IJavaSearchConstants.METHOD,
-                IJavaSearchConstants.DECLARATIONS,
-                SearchPattern.R_EXACT_MATCH | SearchPattern.R_CASE_SENSITIVE);
-        MethodSearchRequestor requestor = new MethodSearchRequestor(perspective);
-        try {
-            se.search(searchPattern,
-                    new SearchParticipant[] {SearchEngine.getDefaultSearchParticipant()},
-                    SearchEngine.createWorkspaceScope(),
-                    requestor,
-                    new NullProgressMonitor());
-        } catch (CoreException e) {
-            return false;
-        }
-
-        return requestor.didMatch();
-    }
-
-    private static class MethodSearchRequestor extends SearchRequestor {
-        private boolean mFoundMatch = false;
-        private final String mPerspective;
-
-        public MethodSearchRequestor(String perspective) {
-            mPerspective = perspective;
-        }
-
-        public boolean didMatch() {
-            return mFoundMatch;
-        }
-
-        @Override
-        public void acceptSearchMatch(SearchMatch match) throws CoreException {
-            Object element = match.getElement();
-            if (element instanceof IMethod && !mFoundMatch) {
-                if (mPerspective != null) {
-                    SourceRevealer.switchToPerspective(mPerspective);
-                }
-
-                IMethod method = (IMethod) element;
-                JavaUI.openInEditor(method);
-                mFoundMatch = true;
-            }
-        }
-    }
-
-    public static void switchToPerspective(String perspectiveId) {
-        IWorkbench workbench = PlatformUI.getWorkbench();
-        IWorkbenchWindow window = workbench.getActiveWorkbenchWindow();
-        IPerspectiveRegistry perspectiveRegistry = workbench.getPerspectiveRegistry();
-        if (perspectiveId != null
-                && perspectiveId.length() > 0
-                && perspectiveRegistry.findPerspectiveWithId(perspectiveId) != null) {
-            try {
-                workbench.showPerspective(perspectiveId, window);
-            } catch (WorkbenchException e) {
-                // ignore exception, perspective won't be switched
-            }
-        }
-    }
-
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.pdt/src/com/android/ide/eclipse/pdt/internal/ToolsLocator.java b/eclipse/plugins/com.android.ide.eclipse.pdt/src/com/android/ide/eclipse/pdt/internal/ToolsLocator.java
deleted file mode 100644
index a7291cb..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.pdt/src/com/android/ide/eclipse/pdt/internal/ToolsLocator.java
+++ /dev/null
@@ -1,41 +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.eclipse.pdt.internal;
-
-import com.android.ide.eclipse.ddms.IToolsLocator;
-import com.android.ide.eclipse.pdt.PdtPlugin;
-
-/**
- * Implementation of the com.android.ide.ddms.adbLocator extension point.
- */
-public class ToolsLocator implements IToolsLocator {
-
-    @Override
-    public String getAdbLocation() {
-        return PdtPlugin.getAdbLocation();
-    }
-
-    @Override
-    public String getHprofConvLocation() {
-        return PdtPlugin.getHprofConvLocation();
-    }
-
-    @Override
-    public String getTraceViewLocation() {
-        return PdtPlugin.getTraceViewLocation();
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.pdt/src/com/android/ide/eclipse/pdt/internal/preferences/PrefPage.java b/eclipse/plugins/com.android.ide.eclipse.pdt/src/com/android/ide/eclipse/pdt/internal/preferences/PrefPage.java
deleted file mode 100644
index 565b6ad..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.pdt/src/com/android/ide/eclipse/pdt/internal/preferences/PrefPage.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.eclipse.pdt.internal.preferences;
-
-import com.android.ide.eclipse.pdt.PdtPlugin;
-
-import org.eclipse.jface.preference.DirectoryFieldEditor;
-import org.eclipse.jface.preference.FieldEditorPreferencePage;
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchPreferencePage;
-
-public class PrefPage extends FieldEditorPreferencePage implements
-        IWorkbenchPreferencePage {
-
-    public final static String PREFS_DEVTREE_DIR = PdtPlugin.PLUGIN_ID + ".devtree"; //$NON-NLS-1$
-
-    private DirectoryFieldEditor mDirectoryField;
-
-    public PrefPage() {
-        super(GRID);
-        IPreferenceStore store = PdtPlugin.getDefault().getPreferenceStore();
-        setPreferenceStore(store);
-        setDescription("Android Preferences");
-    }
-
-    @Override
-    protected void createFieldEditors() {
-        mDirectoryField = new DirectoryFieldEditor(PREFS_DEVTREE_DIR,
-                "Dev Tree Location:", getFieldEditorParent());
-
-        addField(mDirectoryField);
-    }
-
-    @Override
-    public void init(IWorkbench workbench) {
-    }
-
-    @Override
-    public void dispose() {
-        super.dispose();
-
-        if (mDirectoryField != null) {
-            mDirectoryField.dispose();
-            mDirectoryField = null;
-        }
-    }
-
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/.classpath b/eclipse/plugins/com.android.ide.eclipse.tests/.classpath
deleted file mode 100644
index f760174..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/.classpath
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="src" path="unittests"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="output" path="bin"/>
-    <classpathentry kind="lib" path="libs/kxml2-2.3.0.jar"/>
-    <classpathentry kind="lib" path="libs/easymock.jar"/>
-    <classpathentry kind="lib" path="libs/testutils.jar"/>
-    <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"/>
-    <classpathentry kind="lib" path="/plugin-adt/libs/rule-api.jar" sourcepath="/rule-api"/>
-    <classpathentry kind="lib" path="/plugin-base/libs/common.jar" sourcepath="/common"/>
-    <classpathentry kind="lib" path="/plugin-adt/libs/lint-api.jar" sourcepath="/lint-api"/>
-    <classpathentry kind="lib" path="/plugin-adt/libs/lint-checks.jar" sourcepath="/lint-checks"/>
-    <classpathentry kind="lib" path="/plugin-base/libs/sdk-common.jar"/>
-    <classpathentry kind="lib" path="/plugin-adt/libs/lombok-ast-0.2.2.jar"/>
-    <classpathentry kind="lib" path="/plugin-adt/libs/asm-5.0.3.jar"/>
-    <classpathentry kind="lib" path="/plugin-adt/libs/asm-analysis-5.0.3.jar"/>
-    <classpathentry kind="lib" path="/plugin-adt/libs/asm-tree-5.0.3.jar"/>
-    <classpathentry kind="lib" path="/plugin-adt/libs/manifest-merger.jar" sourcepath="/manifest-merger"/>
-</classpath>
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/.project b/eclipse/plugins/com.android.ide.eclipse.tests/.project
deleted file mode 100644
index d37e27b..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/.project
+++ /dev/null
@@ -1,29 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>plugin-tests</name>
-	<comment></comment>
-	<projects>
-		<project>SdkLib</project>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.PluginNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/.settings/org.eclipse.jdt.core.prefs b/eclipse/plugins/com.android.ide.eclipse.tests/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index ea66196..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,98 +0,0 @@
-eclipse.preferences.version=1
-org.eclipse.jdt.core.compiler.annotation.missingNonNullByDefaultAnnotation=ignore
-org.eclipse.jdt.core.compiler.annotation.nonnull=com.android.annotations.NonNull
-org.eclipse.jdt.core.compiler.annotation.nonnullbydefault=com.android.annotations.NonNullByDefault
-org.eclipse.jdt.core.compiler.annotation.nonnullisdefault=disabled
-org.eclipse.jdt.core.compiler.annotation.nullable=com.android.annotations.Nullable
-org.eclipse.jdt.core.compiler.annotation.nullanalysis=enabled
-org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6
-org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.6
-org.eclipse.jdt.core.compiler.debug.lineNumber=generate
-org.eclipse.jdt.core.compiler.debug.localVariable=generate
-org.eclipse.jdt.core.compiler.debug.sourceFile=generate
-org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
-org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
-org.eclipse.jdt.core.compiler.problem.comparingIdentical=warning
-org.eclipse.jdt.core.compiler.problem.deadCode=warning
-org.eclipse.jdt.core.compiler.problem.deprecation=warning
-org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
-org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
-org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
-org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=ignore
-org.eclipse.jdt.core.compiler.problem.fallthroughCase=warning
-org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
-org.eclipse.jdt.core.compiler.problem.fieldHiding=warning
-org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
-org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
-org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
-org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
-org.eclipse.jdt.core.compiler.problem.includeNullInfoFromAsserts=enabled
-org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
-org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=warning
-org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
-org.eclipse.jdt.core.compiler.problem.localVariableHiding=warning
-org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
-org.eclipse.jdt.core.compiler.problem.missingDefaultCase=ignore
-org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=warning
-org.eclipse.jdt.core.compiler.problem.missingEnumCaseDespiteDefault=disabled
-org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=warning
-org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=error
-org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled
-org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
-org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=ignore
-org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
-org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
-org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore
-org.eclipse.jdt.core.compiler.problem.nullAnnotationInferenceConflict=warning
-org.eclipse.jdt.core.compiler.problem.nullReference=warning
-org.eclipse.jdt.core.compiler.problem.nullSpecInsufficientInfo=warning
-org.eclipse.jdt.core.compiler.problem.nullSpecViolation=warning
-org.eclipse.jdt.core.compiler.problem.nullUncheckedConversion=ignore
-org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
-org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
-org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=warning
-org.eclipse.jdt.core.compiler.problem.potentialNullReference=warning
-org.eclipse.jdt.core.compiler.problem.potentialNullSpecViolation=error
-org.eclipse.jdt.core.compiler.problem.potentiallyUnclosedCloseable=warning
-org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
-org.eclipse.jdt.core.compiler.problem.redundantNullAnnotation=warning
-org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
-org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=ignore
-org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=warning
-org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=ignore
-org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=ignore
-org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
-org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
-org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=enabled
-org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
-org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
-org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
-org.eclipse.jdt.core.compiler.problem.unavoidableGenericTypeProblems=disabled
-org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
-org.eclipse.jdt.core.compiler.problem.unclosedCloseable=error
-org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
-org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
-org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=warning
-org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=warning
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.unusedImport=warning
-org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
-org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
-org.eclipse.jdt.core.compiler.problem.unusedObjectAllocation=warning
-org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
-org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
-org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
-org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
-org.eclipse.jdt.core.compiler.source=1.6
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/META-INF/MANIFEST.MF b/eclipse/plugins/com.android.ide.eclipse.tests/META-INF/MANIFEST.MF
deleted file mode 100644
index 8289d64..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,16 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: Android Plugin Tests
-Bundle-SymbolicName: com.android.ide.eclipse.tests
-Bundle-Version: 24.3.3.qualifier
-Bundle-Vendor: The Android Open Source Project
-Fragment-Host: com.android.ide.eclipse.adt;bundle-version="21.0.0"
-Require-Bundle: org.junit
-Bundle-RequiredExecutionEnvironment: JavaSE-1.6
-Bundle-ClassPath: .,
- libs/kxml2-2.3.0.jar,
- libs/testutils.jar,
- libs/lint-api.jar,
- libs/lint-checks.jar,
- libs/easymock.jar
-Import-Package: com.android.tools.lint.detector.api
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/MODULE_LICENSE_EPL b/eclipse/plugins/com.android.ide.eclipse.tests/MODULE_LICENSE_EPL
deleted file mode 100644
index e69de29..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/MODULE_LICENSE_EPL
+++ /dev/null
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/NOTICE b/eclipse/plugins/com.android.ide.eclipse.tests/NOTICE
deleted file mode 100644
index 49c101d..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/NOTICE
+++ /dev/null
@@ -1,224 +0,0 @@
-*Eclipse Public License - v 1.0*
-
-THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE
-PUBLIC LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION OF
-THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT.
-
-*1. DEFINITIONS*
-
-"Contribution" means:
-
-a) in the case of the initial Contributor, the initial code and
-documentation distributed under this Agreement, and
-b) in the case of each subsequent Contributor:
-
-i) changes to the Program, and
-
-ii) additions to the Program;
-
-where such changes and/or additions to the Program originate from and
-are distributed by that particular Contributor. A Contribution
-'originates' from a Contributor if it was added to the Program by such
-Contributor itself or anyone acting on such Contributor's behalf.
-Contributions do not include additions to the Program which: (i) are
-separate modules of software distributed in conjunction with the Program
-under their own license agreement, and (ii) are not derivative works of
-the Program.
-
-"Contributor" means any person or entity that distributes the Program.
-
-"Licensed Patents " mean patent claims licensable by a Contributor which
-are necessarily infringed by the use or sale of its Contribution alone
-or when combined with the Program.
-
-"Program" means the Contributions distributed in accordance with this
-Agreement.
-
-"Recipient" means anyone who receives the Program under this Agreement,
-including all Contributors.
-
-*2. GRANT OF RIGHTS*
-
-a) Subject to the terms of this Agreement, each Contributor hereby
-grants Recipient a non-exclusive, worldwide, royalty-free copyright
-license to reproduce, prepare derivative works of, publicly display,
-publicly perform, distribute and sublicense the Contribution of such
-Contributor, if any, and such derivative works, in source code and
-object code form.
-
-b) Subject to the terms of this Agreement, each Contributor hereby
-grants Recipient a non-exclusive, worldwide, royalty-free patent license
-under Licensed Patents to make, use, sell, offer to sell, import and
-otherwise transfer the Contribution of such Contributor, if any, in
-source code and object code form. This patent license shall apply to the
-combination of the Contribution and the Program if, at the time the
-Contribution is added by the Contributor, such addition of the
-Contribution causes such combination to be covered by the Licensed
-Patents. The patent license shall not apply to any other combinations
-which include the Contribution. No hardware per se is licensed hereunder.
-
-c) Recipient understands that although each Contributor grants the
-licenses to its Contributions set forth herein, no assurances are
-provided by any Contributor that the Program does not infringe the
-patent or other intellectual property rights of any other entity. Each
-Contributor disclaims any liability to Recipient for claims brought by
-any other entity based on infringement of intellectual property rights
-or otherwise. As a condition to exercising the rights and licenses
-granted hereunder, each Recipient hereby assumes sole responsibility to
-secure any other intellectual property rights needed, if any. For
-example, if a third party patent license is required to allow Recipient
-to distribute the Program, it is Recipient's responsibility to acquire
-that license before distributing the Program.
-
-d) Each Contributor represents that to its knowledge it has sufficient
-copyright rights in its Contribution, if any, to grant the copyright
-license set forth in this Agreement.
-
-*3. REQUIREMENTS*
-
-A Contributor may choose to distribute the Program in object code form
-under its own license agreement, provided that:
-
-a) it complies with the terms and conditions of this Agreement; and
-
-b) its license agreement:
-
-i) effectively disclaims on behalf of all Contributors all warranties
-and conditions, express and implied, including warranties or conditions
-of title and non-infringement, and implied warranties or conditions of
-merchantability and fitness for a particular purpose;
-
-ii) effectively excludes on behalf of all Contributors all liability for
-damages, including direct, indirect, special, incidental and
-consequential damages, such as lost profits;
-
-iii) states that any provisions which differ from this Agreement are
-offered by that Contributor alone and not by any other party; and
-
-iv) states that source code for the Program is available from such
-Contributor, and informs licensees how to obtain it in a reasonable
-manner on or through a medium customarily used for software exchange.
-
-When the Program is made available in source code form:
-
-a) it must be made available under this Agreement; and
-
-b) a copy of this Agreement must be included with each copy of the Program.
-
-Contributors may not remove or alter any copyright notices contained
-within the Program.
-
-Each Contributor must identify itself as the originator of its
-Contribution, if any, in a manner that reasonably allows subsequent
-Recipients to identify the originator of the Contribution.
-
-*4. COMMERCIAL DISTRIBUTION*
-
-Commercial distributors of software may accept certain responsibilities
-with respect to end users, business partners and the like. While this
-license is intended to facilitate the commercial use of the Program, the
-Contributor who includes the Program in a commercial product offering
-should do so in a manner which does not create potential liability for
-other Contributors. Therefore, if a Contributor includes the Program in
-a commercial product offering, such Contributor ("Commercial
-Contributor") hereby agrees to defend and indemnify every other
-Contributor ("Indemnified Contributor") against any losses, damages and
-costs (collectively "Losses") arising from claims, lawsuits and other
-legal actions brought by a third party against the Indemnified
-Contributor to the extent caused by the acts or omissions of such
-Commercial Contributor in connection with its distribution of the
-Program in a commercial product offering. The obligations in this
-section do not apply to any claims or Losses relating to any actual or
-alleged intellectual property infringement. In order to qualify, an
-Indemnified Contributor must: a) promptly notify the Commercial
-Contributor in writing of such claim, and b) allow the Commercial
-Contributor to control, and cooperate with the Commercial Contributor
-in, the defense and any related settlement negotiations. The Indemnified
-Contributor may participate in any such claim at its own expense.
-
-For example, a Contributor might include the Program in a commercial
-product offering, Product X. That Contributor is then a Commercial
-Contributor. If that Commercial Contributor then makes performance
-claims, or offers warranties related to Product X, those performance
-claims and warranties are such Commercial Contributor's responsibility
-alone. Under this section, the Commercial Contributor would have to
-defend claims against the other Contributors related to those
-performance claims and warranties, and if a court requires any other
-Contributor to pay any damages as a result, the Commercial Contributor
-must pay those damages.
-
-*5. NO WARRANTY*
-
-EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS PROVIDED
-ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
-EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES
-OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR
-A PARTICULAR PURPOSE. Each Recipient is solely responsible for
-determining the appropriateness of using and distributing the Program
-and assumes all risks associated with its exercise of rights under this
-Agreement , including but not limited to the risks and costs of program
-errors, compliance with applicable laws, damage to or loss of data,
-programs or equipment, and unavailability or interruption of operations.
-
-*6. DISCLAIMER OF LIABILITY*
-
-EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT NOR
-ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT,
-INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING
-WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF
-LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
-NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR
-DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED
-HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
-
-*7. GENERAL*
-
-If any provision of this Agreement is invalid or unenforceable under
-applicable law, it shall not affect the validity or enforceability of
-the remainder of the terms of this Agreement, and without further action
-by the parties hereto, such provision shall be reformed to the minimum
-extent necessary to make such provision valid and enforceable.
-
-If Recipient institutes patent litigation against any entity (including
-a cross-claim or counterclaim in a lawsuit) alleging that the Program
-itself (excluding combinations of the Program with other software or
-hardware) infringes such Recipient's patent(s), then such Recipient's
-rights granted under Section 2(b) shall terminate as of the date such
-litigation is filed.
-
-All Recipient's rights under this Agreement shall terminate if it fails
-to comply with any of the material terms or conditions of this Agreement
-and does not cure such failure in a reasonable period of time after
-becoming aware of such noncompliance. If all Recipient's rights under
-this Agreement terminate, Recipient agrees to cease use and distribution
-of the Program as soon as reasonably practicable. However, Recipient's
-obligations under this Agreement and any licenses granted by Recipient
-relating to the Program shall continue and survive.
-
-Everyone is permitted to copy and distribute copies of this Agreement,
-but in order to avoid inconsistency the Agreement is copyrighted and may
-only be modified in the following manner. The Agreement Steward reserves
-the right to publish new versions (including revisions) of this
-Agreement from time to time. No one other than the Agreement Steward has
-the right to modify this Agreement. The Eclipse Foundation is the
-initial Agreement Steward. The Eclipse Foundation may assign the
-responsibility to serve as the Agreement Steward to a suitable separate
-entity. Each new version of the Agreement will be given a distinguishing
-version number. The Program (including Contributions) may always be
-distributed subject to the version of the Agreement under which it was
-received. In addition, after a new version of the Agreement is
-published, Contributor may elect to distribute the Program (including
-its Contributions) under the new version. Except as expressly stated in
-Sections 2(a) and 2(b) above, Recipient receives no rights or licenses
-to the intellectual property of any Contributor under this Agreement,
-whether expressly, by implication, estoppel or otherwise. All rights in
-the Program not expressly granted under this Agreement are reserved.
-
-This Agreement is governed by the laws of the State of New York and the
-intellectual property laws of the United States of America. No party to
-this Agreement will bring a legal action under this Agreement more than
-one year after the cause of action arose. Each party waives its rights
-to a jury trial in any resulting litigation.
-
- 
-
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/README.txt b/eclipse/plugins/com.android.ide.eclipse.tests/README.txt
deleted file mode 100644
index fe69958..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/README.txt
+++ /dev/null
@@ -1,101 +0,0 @@
-This project contains the tests for the Android Eclipse Plugins.
-
-You can do three things:
-1- Run the unit tests as a full "eclipse plugin" suite
-2- Run the unit tests as independent JUnit tests (not as plugin)
-3. Run the functional tests as a full "eclipse plugin" suite (require a real SDK)
-
-The unit tests are isolated tests that do not require external dependencies such as an SDK. 
-The functional tests are higher level tests that may require a real SDK.
-
-------------------------------------------
-1- Running the unit tests as a full "eclipse plugin" suite
-------------------------------------------
-
-Steps to run the test suite:
-
-A- In Eclipse, import following projects from development/tools/eclipse/plugins:
-	- adt-tests
-	- adt
-	- ddms
-
-B- Create a new "JUnit Plug-in Test" run configuration via the "Run > Open Run Dialog..." menu
-Set the launch configuration's data as follows:
-i. "Test" tab: 
-  Select "Run a single test"
-  Project: adt-tests 
-  Test class: com.android.ide.eclipse.tests.UnitTests
-  Test runner: JUnit 3
-ii. "Arguments" tab:
- Set "VM Arguments" to 
-"-Dtest_data=<adt>/plugins/com.android.ide.eclipse.tests/unittests/data/"
-replacing "<adt>" with absolute filesystem path to the android plugin source location
-
-All other fields can be left with their default values
-
-C. Run the newly created launch configuration
-
-Running the tests will run a secondary instance of Eclipse. 
-
-Please note the following constraints to be aware of when writing tests to run within a plugin environment:
-
-a. Access restrictions: cannot access package or protected members in a different
-plugin, even if they are in the same declared package 
-b. Using classloader.getResource or getResourceAsStream to access test data will 
-likely fail in the plugin environment. Instead, use AdtTestData to access test files
-in conjunction with the "test_data" environment variable mentioned above
-
-
--------------------------------------------
-2- Run the unit tests as independent JUnit tests (not plugin)
--------------------------------------------
-
-A- In Eclipse, import following projects from development/tools/eclipse/plugins:
-	- adt-tests
-	- adt
-	- ddms
-
-B- Select the "unittests" source folder, right-click and select
-	"Run As > JUnit Test" (i.e. not the plugin tests)
-
-This creates a debug configuration of type "JUnit Test" running all tests
-in the source folder "unittests". The runtime must be JUnit 3.
-
-Note: this method runs the tests within a regular JVM environment (ie not within
-an Eclipse instance). This method has the advantage of being quicker than running
-as a JUnit plugin test, and requires less potential set-up, but has the 
-disadvantage of not properly replicating how the tests will be run in the 
-continuous test environment. Tests that pass when run as "JUnit Tests" can
-fail when run as "JUnit Plugin Tests", due to the extra constraints imposed by
-running within an Eclipse plug-in noted in section 1.
-
-------------------------------------------
-3- Running the functional tests as a full "eclipse plugin" suite
-------------------------------------------
-
-Steps to run the test suite:
-
-A- In Eclipse, import following projects from development/tools/eclipse/plugins:
-	- adt-tests
-	- adt
-	- ddms
-
-B - Setup an SDK on host machine, that is compatible with the Eclipse ADT plugins under test
-
-C- Create a new "JUnit Plug-in Test" run configuration via the "Run > Open Run Dialog..." menu
-Set the launch configuration's data as follows:
-i. "Test" tab: 
-  Select "Run a single test"
-  Project: adt-tests 
-  Test class: com.android.ide.eclipse.tests.FuncTests
-  Test runner: JUnit 3
-ii. "Environment" tab:
- Add a "sdk_home" environment variable, setting its path to the SDK from step B
-
-All other fields can be left with their default values
-
-D. Run the newly created launch configuration
-
-Running the tests will run a secondary instance of Eclipse. 
-
-
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/build.properties b/eclipse/plugins/com.android.ide.eclipse.tests/build.properties
deleted file mode 100644
index 2a82227..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/build.properties
+++ /dev/null
@@ -1,17 +0,0 @@
-source.. = src/,\
-           unittests/
-output.. = bin/
-bin.includes = META-INF/,\
-               .,\
-               test.xml,\
-               prefs.template,\
-               unittest.xml,\
-               kxml2-2.3.0.jar,\
-               testutils.jar,\
-               layoutlib.jar,\
-               lint-api.jar,\
-               lint-checks.jar,\
-               unittests/com/android/sdklib/testdata/,\
-               unittests/com/android/layoutlib/testdata/,\
-               unittests/com/android/ide/eclipse/testdata/,\
-               easymock.jar
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/not_source_folder/jar/example/Class1.java b/eclipse/plugins/com.android.ide.eclipse.tests/not_source_folder/jar/example/Class1.java
deleted file mode 100644
index 3cf1027..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/not_source_folder/jar/example/Class1.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Copyright (C) 2007 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 jar.example;
-
-public class Class1 {
-
-    public static final int sStaticField = 1;
-    
-    /** constructor */
-    public Class1() {
-        int a = 1;
-    }
-    
-    public static class InnerStaticClass1 {
-        
-    }
-
-    public class InnerClass2 {
-        
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/not_source_folder/jar/example/Class2.java b/eclipse/plugins/com.android.ide.eclipse.tests/not_source_folder/jar/example/Class2.java
deleted file mode 100644
index 4d15c47..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/not_source_folder/jar/example/Class2.java
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * Copyright (C) 2007 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 jar.example;
-
-public class Class2 extends Class1 {
-
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/pom.xml b/eclipse/plugins/com.android.ide.eclipse.tests/pom.xml
deleted file mode 100644
index 71bbad8..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/pom.xml
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-    <modelVersion>4.0.0</modelVersion>
-
-    <version>24.3.3-SNAPSHOT</version>
-    <artifactId>com.android.ide.eclipse.tests</artifactId>
-    <packaging>eclipse-test-plugin</packaging>
-    <name>tests</name>
-
-    <parent>
-        <relativePath>../../pom.xml</relativePath>
-        <groupId>adt.group</groupId>
-        <artifactId>parent</artifactId>
-        <version>1.0.0-SNAPSHOT</version>
-    </parent>
-</project>
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/prefs.template b/eclipse/plugins/com.android.ide.eclipse.tests/prefs.template
deleted file mode 100644
index e0037de..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/prefs.template
+++ /dev/null
@@ -1,3 +0,0 @@
-#Wed Feb 20 16:56:40 PST 2008
-com.android.ide.eclipse.adt.sdk=sdk_home
-eclipse.preferences.version=1
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/build/AaptParserTest.java b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/build/AaptParserTest.java
deleted file mode 100644
index af4e2b7..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/build/AaptParserTest.java
+++ /dev/null
@@ -1,200 +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.eclipse.adt.internal.build;
-
-import com.android.ide.eclipse.adt.AdtConstants;
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.ide.eclipse.adt.internal.editors.layout.refactoring.AdtProjectTest;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-
-import java.io.File;
-import java.util.Collections;
-import java.util.List;
-
-public class AaptParserTest extends AdtProjectTest {
-
-    public void testBasic() throws Exception {
-        // Test the "at 'property' with value 'value' range matching included with most aapt errors
-        checkRanges("quickfix1.xml", "res/layout/quickfix1.xml",
-                "quickfix1.xml:7: error: Error: No resource found that matches the given name (at"
-                + " 'text' with value '@string/firststring').",
-                "android:text=\"^@string/firststring\"",
-                "android:text=\"@string/firststring^\"");
-    }
-
-    public void testRange1() throws Exception {
-        // Check that when the actual aapt error occurs on a line later than the original error
-        // line, the forward search which looks for a value match does not stop on an
-        // earlier line that happens to have the same value prefix
-        checkRanges("aapterror1.xml", "res/layout/aapterror1.xml",
-                "aapterror1.xml:5: error: Error: Integer types not allowed (at "
-                + "'layout_marginBottom' with value '50').",
-                "marginBottom=\"^50\"", "marginBottom=\"50^\"");
-    }
-
-    public void testRange2() throws Exception {
-        // Check that when we have a duplicate resource error, we highlight both the original
-        // property and the original definition.
-        // This tests the second, duplicate declaration ration.
-        checkRanges("aapterror2.xml", "res/values/aapterror2.xml",
-                "aapterror2.xml:7: error: Resource entry repeatedStyle1 already has bag item "
-                + "android:gravity.",
-                "<item name=\"^android:gravity\">bottom</item>",
-                "<item name=\"android:gravity^\">bottom</item>");
-    }
-
-    public void testRange3() throws Exception {
-        // Check that when we have a duplicate resource error, we highlight both the original
-        // property and the original definition.
-        // This tests the original definition. Note that we don't have enough position info
-        // so we simply highlight the whitespace portion of the line.
-        checkRanges("aapterror2.xml", "res/values/aapterror2.xml",
-                "aapterror2.xml:4: Originally defined here.",
-                "^<item name=\"android:gravity\">left</item>",
-                "<item name=\"android:gravity\">left</item>^");
-    }
-
-    public void testRange4() throws Exception {
-        // Check for aapt error which occurs when the attribute name in an item style declaration
-        // is nonexistent
-        checkRanges("aapterror3.xml", "res/values/aapterror3.xml",
-                "aapterror3.xml:4: error: Error: No resource found that matches the given name: "
-                + "attr 'nonexistent'.",
-                "<item name=\"^nonexistent\">5</item>",
-                "<item name=\"nonexistent^\">5</item>");
-    }
-
-    public void testRange5() throws Exception {
-        // Test missing resource name
-        checkRanges("aapterror4.xml", "res/values/aapterror4.xml",
-                "aapterror4.xml:3: error: A 'name' attribute is required for <style>",
-                "<^style>",
-                "<style^>");
-    }
-
-    public void testRange6() throws Exception {
-        checkRanges("aapterror4.xml", "res/values/aapterror4.xml",
-                "aapterror4.xml:6: error: A 'type' attribute is required for <item>",
-                "<^item></item>",
-                "<item^></item>");
-    }
-
-    public void testRange7() throws Exception {
-        // Test missing resource name
-        checkRanges("aapterror4.xml", "res/values/aapterror4.xml",
-                "aapterror4.xml:6: error: A 'name' attribute is required for <item>",
-                "<^item></item>",
-                "<item^></item>");
-    }
-
-    // This test is disabled because I can't find a useful scenario for handling this error
-    // message. When this error occurs, we will also get a warning on a missing attribute, and
-    // that warning already underlines the element name.
-    //public void testRange8() throws Exception {
-    //    // Test missing resource name
-    //    checkRanges("aapterror4.xml", "res/values/aapterror4.xml",
-    //           "aapterror4.xml:4: error: Error: Resource id cannot be an empty string: attr ''.",
-    //           "        ^<item />",
-    //           "        <item />^");
-    //}
-
-    public void testRange9() throws Exception {
-        // Test missing resource name
-        checkRanges("aapterror5.xml", "res/values/aapterror5.xml",
-                "aapterror5.xml:4: error: Error: String types not allowed (at "
-                + "'android:layout_width' with value '').",
-                "        <item name=\"^android:layout_width\"></item>",
-                "        <item name=\"android:layout_width^\"></item>");
-    }
-
-    public void testRange10() throws Exception {
-        // Test missing resource name
-        checkRanges("aapterror6.xml", "res/layout/aapterror6.xml",
-                "aapterror6.xml:5: error: Error: String types not allowed (at 'layout_marginTop'"
-                + " with value '').",
-                "android:layout_marginTop=^\"\"",
-                "android:layout_marginTop=\"\"^");
-    }
-
-    public void testRange11() throws Exception {
-        // Test missing resource name
-        checkRanges("aapterror6.xml", "res/layout/aapterror6.xml",
-                "aapterror1.xml:5: error: Error: String types not allowed (at 'layout_marginLeft'"
-                + " with value '').",
-                "android:layout_marginLeft=^''",
-                "android:layout_marginLeft=''^");
-    }
-
-    public void testRange12() throws Exception {
-        // Test missing resource name
-        checkRanges("aapterror7.xml", "res/layout/aapterror7.xml",
-                "aapterror7.xml:5: error: Error: String types not allowed (at 'id'"
-                + " with value '').",
-                "android:id=^\"\"",
-                "android:id=\"\"^");
-    }
-
-    private void checkRanges(String name, String destPath, String aaptError,
-            String expectCaretBegin, String expectCaretEnd)
-            throws Exception {
-        IProject project = getProject();
-        IFile file = getTestDataFile(project, name, destPath);
-
-        // Make file paths absolute
-        String osRoot = project.getLocation().toOSString();
-        String fileRelativePath = file.getProjectRelativePath().toPortableString();
-        String filePath = osRoot + File.separator + fileRelativePath;
-        String originalError = filePath + aaptError.substring(aaptError.indexOf(':'));
-        List<String> errors = Collections.singletonList(originalError);
-
-        // Remove anything already placed there by the project create/build automatic
-        // (this usually only happens while debugging so the background thread has a chance
-        // to get things going)
-        IMarker[] markers = file.findMarkers(AdtConstants.MARKER_AAPT_COMPILE, true,
-                IResource.DEPTH_ZERO);
-        for (IMarker marker : markers) {
-            marker.delete();
-        }
-
-        AaptParser.parseOutput(errors, project);
-        markers = file.findMarkers(AdtConstants.MARKER_AAPT_COMPILE, true,
-                IResource.DEPTH_ZERO);
-        assertNotNull(markers);
-        assertEquals(1, markers.length);
-
-        String fileContents = AdtPlugin.readFile(file);
-        int rangeBegin = getCaretOffset(file, expectCaretBegin);
-        int rangeEnd = getCaretOffset(file, expectCaretEnd);
-
-        // Check text range
-        IMarker marker = markers[0];
-        String message = marker.getAttribute(IMarker.MESSAGE, ""); //$NON-NLS-1$
-        String simplerMessage = aaptError.substring(aaptError.indexOf(' ') + 1);
-        assertEquals(simplerMessage, message);
-        int start = marker.getAttribute(IMarker.CHAR_START, 0);
-        int end = marker.getAttribute(IMarker.CHAR_END, 0);
-
-        assertEquals("Wrong start offset, expected " + expectCaretBegin + " but was "
-                + getCaretContext(fileContents, start), rangeBegin, start);
-        assertEquals("Wrong end offset, expected " + expectCaretEnd + " but was "
-                + getCaretContext(fileContents, end), rangeEnd, end);
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/build/AaptQuickFixTest.java b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/build/AaptQuickFixTest.java
deleted file mode 100644
index cc3504f..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/build/AaptQuickFixTest.java
+++ /dev/null
@@ -1,289 +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.eclipse.adt.internal.build;
-
-import static com.android.SdkConstants.FD_RES;
-import static com.android.SdkConstants.FD_RES_COLOR;
-import static com.android.SdkConstants.FD_RES_LAYOUT;
-
-import com.android.ide.eclipse.adt.AdtConstants;
-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.layout.refactoring.AdtProjectTest;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.jface.text.Document;
-import org.eclipse.jface.text.IDocument;
-import org.eclipse.jface.text.contentassist.ICompletionProposal;
-import org.eclipse.jface.text.quickassist.IQuickAssistInvocationContext;
-import org.eclipse.jface.text.source.ISourceViewer;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IMarkerResolution;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.ide.IDE;
-import org.eclipse.ui.part.FileEditorInput;
-
-import java.io.File;
-import java.util.ArrayList;
-import java.util.List;
-
-public class AaptQuickFixTest extends AdtProjectTest {
-    @Override
-    protected boolean testCaseNeedsUniqueProject() {
-        // Make a separate test project for this test such that we don't pollute code assist
-        // tests with our new resources
-        return true;
-    }
-
-    public void testQuickFix1() throws Exception {
-        // Test adding a value into an existing file (res/values/strings.xml)
-        checkResourceFix("quickfix1.xml", "android:text=\"@string/firs^tstring\"",
-                "res/values/strings.xml");
-    }
-
-    public void testQuickFix2() throws Exception {
-        // Test adding a value into a new file (res/values/dimens.xml, will be created)
-        checkResourceFix("quickfix1.xml", "android:layout_width=\"@dimen/^testdimen\"",
-                "res/values/dimens.xml");
-    }
-
-    public void testQuickFix3() throws Exception {
-        // Test adding a file based resource (uses new file wizard machinery)
-        checkResourceFix("quickfix1.xml", "layout=\"@layout/^testlayout\"",
-                "res/layout/testlayout.xml");
-    }
-
-    public void testQuickFix4() throws Exception {
-        // Test adding a value into a new file (res/values/dimens.xml, will be created)
-        checkNamespaceFix("quickfix2.xml", "<c^olor");
-    }
-
-    private void checkResourceFix(String name, String caretLocation, String expectedNewPath)
-            throws Exception {
-        IProject project = getProject();
-        IFile file = getTestDataFile(project, name, FD_RES + "/" + FD_RES_LAYOUT + "/" + name);
-
-        // Determine the offset
-        final int offset = getCaretOffset(file, caretLocation);
-
-
-        String osRoot = project.getLocation().toOSString();
-        List<String> errors = new ArrayList<String>();
-        String fileRelativePath = file.getProjectRelativePath().toPortableString();
-        String filePath = osRoot + File.separator + fileRelativePath;
-        // Run AaptParser such that markers are added...
-        // When debugging these tests, the project gets a chance to build itself so
-        // the real aapt errors are there. But when the test is run directly, aapt has
-        // not yet run. I tried waiting for the build (using the code in SampleProjectTest)
-        // but this had various adverse effects (exception popups from the Eclipse debugger
-        // etc) so instead this test just hardcodes the aapt errors that should be
-        // observed on quickfix1.xml.
-        assertEquals("Unit test is hardcoded to errors for quickfix1.xml", "quickfix1.xml", name);
-        errors.add(filePath + ":7: error: Error: No resource found that matches the given name"
-                + " (at 'text' with value '@string/firststring').");
-        errors.add(filePath + ":7: error: Error: No resource found that matches the given name"
-                + " (at 'layout_width' with value '@dimen/testdimen').");
-        errors.add(filePath + ":13: error: Error: No resource found that matches the given name"
-                + " (at 'layout' with value '@layout/testlayout').");
-        AaptParser.parseOutput(errors, project);
-
-        AaptQuickFix aaptQuickFix = new AaptQuickFix();
-
-        // Open file
-        IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
-        assertNotNull(page);
-        IEditorPart editor = IDE.openEditor(page, file);
-        assertTrue(editor instanceof AndroidXmlEditor);
-        AndroidXmlEditor layoutEditor = (AndroidXmlEditor) editor;
-        final ISourceViewer viewer = layoutEditor.getStructuredSourceViewer();
-
-        // Test marker resolution.
-         IMarker[] markers = file.findMarkers(AdtConstants.MARKER_AAPT_COMPILE, true,
-                 IResource.DEPTH_ZERO);
-         for (IMarker marker : markers) {
-             int start = marker.getAttribute(IMarker.CHAR_START, 0);
-             int end = marker.getAttribute(IMarker.CHAR_END, 0);
-             if (offset >= start && offset <= end) {
-                 // Found the target marker. Now check the marker resolution of it.
-                 assertTrue(aaptQuickFix.hasResolutions(marker));
-                 IMarkerResolution[] resolutions = aaptQuickFix.getResolutions(marker);
-                 assertNotNull(resolutions);
-                 assertEquals(1, resolutions.length);
-                 IMarkerResolution resolution = resolutions[0];
-                 assertNotNull(resolution);
-                 assertTrue(resolution.getLabel().contains("Create resource"));
-
-                 // Not running marker yet -- if we create the files here they already
-                 // exist when the quick assist code runs. (The quick fix and the quick assist
-                 // mostly share code for the implementation anyway.)
-                 //resolution.run(marker);
-                 break;
-             }
-         }
-
-        // Next test quick assist.
-
-        IQuickAssistInvocationContext invocationContext = new IQuickAssistInvocationContext() {
-            @Override
-            public int getLength() {
-                return 0;
-            }
-
-            @Override
-            public int getOffset() {
-                return offset;
-            }
-
-            @Override
-            public ISourceViewer getSourceViewer() {
-                return viewer;
-            }
-        };
-        ICompletionProposal[] proposals = aaptQuickFix
-                .computeQuickAssistProposals(invocationContext);
-        assertNotNull(proposals);
-        assertTrue(proposals.length == 1);
-        ICompletionProposal proposal = proposals[0];
-
-        assertNotNull(proposal.getAdditionalProposalInfo());
-        assertNotNull(proposal.getImage());
-        assertTrue(proposal.getDisplayString().contains("Create resource"));
-
-        IDocument document = new Document();
-        String fileContent = AdtPlugin.readFile(file);
-        document.set(fileContent);
-
-        // Apply quick fix
-        proposal.apply(document);
-
-        IPath path = new Path(expectedNewPath);
-        IFile newFile = project.getFile(path);
-        assertNotNull(path.toPortableString(), newFile);
-
-        // Ensure that the newly created file was opened
-        IEditorPart currentFile = AdtUtils.getActiveEditor();
-        assertEquals(newFile.getProjectRelativePath(),
-             ((FileEditorInput) currentFile.getEditorInput()).getFile().getProjectRelativePath());
-
-        // Look up caret offset
-        assertTrue(currentFile != null ? currentFile.getClass().getName() : "null",
-                currentFile instanceof AndroidXmlEditor);
-        AndroidXmlEditor newEditor = (AndroidXmlEditor) currentFile;
-        ISourceViewer newViewer = newEditor.getStructuredSourceViewer();
-        Point selectedRange = newViewer.getSelectedRange();
-
-        String newFileContents = AdtPlugin.readFile(newFile);
-
-        // Insert selection markers -- [ ] for the selection range, ^ for the caret
-        String newFileWithCaret = addSelection(newFileContents, selectedRange);
-        newFileWithCaret = removeSessionData(newFileWithCaret);
-
-        assertEqualsGolden(name, newFileWithCaret);
-    }
-
-    private void checkNamespaceFix(String name, String caretLocation)
-            throws Exception {
-        IProject project = getProject();
-        IFile file = getTestDataFile(project, name, FD_RES + "/" + FD_RES_COLOR + "/" + name);
-
-        // Determine the offset
-        final int offset = getCaretOffset(file, caretLocation);
-
-        String osRoot = project.getLocation().toOSString();
-        List<String> errors = new ArrayList<String>();
-        String fileRelativePath = file.getProjectRelativePath().toPortableString();
-        String filePath = osRoot + File.separator + fileRelativePath;
-        assertEquals("Unit test is hardcoded to errors for quickfix2.xml", "quickfix2.xml", name);
-        errors.add(filePath + ":5: error: Error parsing XML: unbound prefix");
-        AaptParser.parseOutput(errors, project);
-
-        AaptQuickFix aaptQuickFix = new AaptQuickFix();
-
-        // Open file
-        IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
-        assertNotNull(page);
-        IEditorPart editor = IDE.openEditor(page, file);
-        assertTrue(editor instanceof AndroidXmlEditor);
-        AndroidXmlEditor layoutEditor = (AndroidXmlEditor) editor;
-        final ISourceViewer viewer = layoutEditor.getStructuredSourceViewer();
-
-        // Test marker resolution.
-        IMarker[] markers = file.findMarkers(AdtConstants.MARKER_AAPT_COMPILE, true,
-                IResource.DEPTH_ZERO);
-        assertEquals(1, markers.length);
-        IMarker marker = markers[0];
-        // Found the target marker. Now check the marker resolution of it.
-        assertTrue(aaptQuickFix.hasResolutions(marker));
-        IMarkerResolution[] resolutions = aaptQuickFix.getResolutions(marker);
-        assertNotNull(resolutions);
-        assertEquals(1, resolutions.length);
-        IMarkerResolution resolution = resolutions[0];
-        assertNotNull(resolution);
-        assertTrue(resolution.getLabel().contains("Insert namespace"));
-
-        // Next test quick assist.
-
-        IQuickAssistInvocationContext invocationContext = new IQuickAssistInvocationContext() {
-            @Override
-            public int getLength() {
-                return 0;
-            }
-
-            @Override
-            public int getOffset() {
-                return offset;
-            }
-
-            @Override
-            public ISourceViewer getSourceViewer() {
-                return viewer;
-            }
-        };
-        ICompletionProposal[] proposals = aaptQuickFix
-                .computeQuickAssistProposals(invocationContext);
-        assertNotNull(proposals);
-        assertTrue(proposals.length == 1);
-        ICompletionProposal proposal = proposals[0];
-
-        assertNotNull(proposal.getAdditionalProposalInfo());
-        assertNotNull(proposal.getImage());
-        assertTrue(proposal.getDisplayString().contains("Insert namespace"));
-
-        // Open the file to ensure we can get an XML model with getExistingModelForEdit:
-        AdtPlugin.openFile(file, null);
-        IEditorPart newEditor = AdtUtils.getActiveEditor();
-        assertTrue(newEditor instanceof AndroidXmlEditor);
-
-        AndroidXmlEditor xmlEditor = (AndroidXmlEditor) newEditor;
-        IDocument document = xmlEditor.getStructuredSourceViewer().getDocument();
-
-        // Apply quick fix
-        String before = document.get();
-        proposal.apply(document);
-        String after = document.get();
-        String diff = getDiff(before, after);
-        assertEqualsGolden(name, diff);
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/AndroidContentAssistTest.java b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/AndroidContentAssistTest.java
deleted file mode 100644
index 700e68b..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/AndroidContentAssistTest.java
+++ /dev/null
@@ -1,990 +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.eclipse.adt.internal.editors;
-
-import static com.android.SdkConstants.FD_RES;
-import static com.android.SdkConstants.FD_RES_ANIM;
-import static com.android.SdkConstants.FD_RES_ANIMATOR;
-import static com.android.SdkConstants.FD_RES_COLOR;
-import static com.android.SdkConstants.FD_RES_DRAWABLE;
-
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.ide.eclipse.adt.internal.editors.animator.AnimationContentAssist;
-import com.android.ide.eclipse.adt.internal.editors.color.ColorContentAssist;
-import com.android.ide.eclipse.adt.internal.editors.common.CommonXmlEditor;
-import com.android.ide.eclipse.adt.internal.editors.descriptors.AttributeDescriptor;
-import com.android.ide.eclipse.adt.internal.editors.descriptors.ElementDescriptor;
-import com.android.ide.eclipse.adt.internal.editors.drawable.DrawableContentAssist;
-import com.android.ide.eclipse.adt.internal.editors.layout.LayoutContentAssist;
-import com.android.ide.eclipse.adt.internal.editors.layout.descriptors.ViewElementDescriptor;
-import com.android.ide.eclipse.adt.internal.editors.layout.refactoring.AdtProjectTest;
-import com.android.ide.eclipse.adt.internal.editors.manifest.ManifestContentAssist;
-import com.android.ide.eclipse.adt.internal.editors.manifest.ManifestEditor;
-import com.android.ide.eclipse.adt.internal.editors.uimodel.UiElementNode;
-import com.android.ide.eclipse.adt.internal.editors.values.ValuesContentAssist;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.jface.text.Document;
-import org.eclipse.jface.text.IDocument;
-import org.eclipse.jface.text.contentassist.ICompletionProposal;
-import org.eclipse.jface.text.source.ISourceViewer;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.ide.IDE;
-
-@SuppressWarnings("javadoc")
-public class AndroidContentAssistTest extends AdtProjectTest {
-    private static final String CARET = "^"; //$NON-NLS-1$
-
-    @Override
-    protected boolean testCaseNeedsUniqueProject() {
-        return true;
-    }
-
-    public void testStartsWith() {
-        assertTrue(AndroidContentAssist.startsWith("", ""));
-        assertTrue(AndroidContentAssist.startsWith("a", ""));
-        assertTrue(AndroidContentAssist.startsWith("A", ""));
-        assertTrue(AndroidContentAssist.startsWith("A", "a"));
-        assertTrue(AndroidContentAssist.startsWith("A", "A"));
-        assertTrue(AndroidContentAssist.startsWith("Ab", "a"));
-        assertTrue(AndroidContentAssist.startsWith("ab", "A"));
-        assertTrue(AndroidContentAssist.startsWith("ab", "AB"));
-        assertFalse(AndroidContentAssist.startsWith("ab", "ABc"));
-        assertFalse(AndroidContentAssist.startsWith("", "ABc"));
-    }
-
-    public void testNameStartsWith() {
-        String fullWord = "android:marginTop";
-        for (int i = 0; i < fullWord.length(); i++) {
-            assertTrue(i + ":" + fullWord.substring(0, i),
-                    AndroidContentAssist.nameStartsWith(
-                    "android:layout_marginTop", fullWord.substring(0, i), "android:"));
-        }
-
-        fullWord = "android:layout_marginTop";
-        for (int i = 0; i < fullWord.length(); i++) {
-            assertTrue(i + ":" + fullWord.substring(0, i),
-                    AndroidContentAssist.nameStartsWith("android:layout_marginTop", fullWord
-                    .substring(0, i), "android:"));
-        }
-
-        fullWord = "layout_marginTop";
-        for (int i = 0; i < fullWord.length(); i++) {
-            assertTrue(i + ":" + fullWord.substring(0, i),
-                    AndroidContentAssist.nameStartsWith("android:layout_marginTop", fullWord
-                    .substring(0, i), "android:"));
-        }
-
-        fullWord = "marginTop";
-        for (int i = 0; i < fullWord.length(); i++) {
-            assertTrue(i + ":" + fullWord.substring(0, i),
-                    AndroidContentAssist.nameStartsWith("android:layout_marginTop", fullWord
-                    .substring(0, i), "android:"));
-        }
-
-        assertFalse(AndroidContentAssist.nameStartsWith("ab", "ABc", null));
-        assertFalse(AndroidContentAssist.nameStartsWith("", "ABc", null));
-    }
-
-    public void testCompletion1() throws Exception {
-        // Change attribute name completion
-        checkLayoutCompletion("completion1.xml", "layout_w^idth=\"fill_parent\"");
-    }
-
-    public void testCompletion2() throws Exception {
-        // Check attribute value completion for enum
-        checkLayoutCompletion("completion1.xml", "layout_width=\"^fill_parent\"");
-    }
-
-    public void testCompletion3() throws Exception {
-        // Check attribute value completion for enum with a prefix
-        checkLayoutCompletion("completion1.xml", "layout_width=\"fi^ll_parent\"");
-    }
-
-    public void testCompletion4() throws Exception {
-        // Check attribute value completion on units
-        checkLayoutCompletion("completion1.xml", "marginBottom=\"50^\"");
-    }
-
-    public void testCompletion5() throws Exception {
-        // Check attribute value completion on units with prefix
-        checkLayoutCompletion("completion1.xml", "layout_marginLeft=\"50d^p\"");
-    }
-
-    public void testCompletion6() throws Exception {
-        // Check resource sorting - "style" should bubble to the top for a style attribute
-        checkLayoutCompletion("completion1.xml", "style=\"@android:^style/Widget.Button\"");
-    }
-
-    public void testCompletion7a() throws Exception {
-        // Check flags (multiple values inside a single XML value, separated by | - where
-        // the prefix is reset as soon as you pass each | )
-        checkLayoutCompletion("completion1.xml", "android:gravity=\"l^eft|bottom\"");
-    }
-
-    public void testCompletion7b() throws Exception {
-        checkLayoutCompletion("completion1.xml", "android:gravity=\"left|b^ottom\"");
-    }
-
-    public void testCompletion8() throws Exception {
-        // Test completion right at the "=" sign; this will be taken to be the last
-        // character of the attribute name (the caret is between the last char and before
-        // the = characters), so it should match a single attribute
-        checkLayoutCompletion("completion1.xml", "layout_width^=\"fill_parent\"");
-    }
-
-    public void testCompletion9() throws Exception {
-        // Test completion right after the "=" sign; this will be taken to be the beginning
-        // of the attribute value, but all values will also include a leading quote
-        checkLayoutCompletion("completion1.xml", "layout_width=^\"fill_parent\"");
-    }
-
-    public void testCompletion10() throws Exception {
-        // Test completion of element names
-        checkLayoutCompletion("completion1.xml", "<T^extView");
-    }
-
-    public void testCompletion11() throws Exception {
-        // Test completion of element names at the outside of the <. This should include
-        // all the elements too (along with the leading <).
-        checkLayoutCompletion("completion1.xml", "^<TextView");
-    }
-
-    public void testCompletion12() throws Exception {
-        // Test completion of element names inside a nested XML; ensure that this will
-        // correctly compute element names, not previous attribute
-        checkLayoutCompletion("completion1.xml", "btn_default\">^</FrameLayout>");
-    }
-
-    public void testCompletion13a() throws Exception {
-        checkLayoutCompletion("completion2.xml", "gravity=\"left|bottom|^cen");
-    }
-
-    public void testCompletion13b() throws Exception {
-        checkLayoutCompletion("completion2.xml", "gravity=\"left|bottom|cen^");
-    }
-
-    public void testCompletion13c() throws Exception {
-        checkLayoutCompletion("completion2.xml", "gravity=\"left|bottom^|cen");
-    }
-
-    public void testCompletion14() throws Exception {
-        // Test completion of permissions
-        checkManifestCompletion("manifest.xml", "android.permission.ACC^ESS_NETWORK_STATE");
-    }
-
-    public void testCompletion15() throws Exception {
-        // Test completion of intents
-        checkManifestCompletion("manifest.xml", "android.intent.category.L^AUNCHER");
-    }
-
-    public void testCompletion16() throws Exception {
-        // Test completion of top level elements
-        checkManifestCompletion("manifest.xml", "<^application android:i");
-    }
-
-    public void testCompletion17() throws Exception {
-        // Test completion of attributes on the manifest element
-        checkManifestCompletion("manifest.xml", "^android:versionCode=\"1\"");
-    }
-
-    public void testCompletion18() throws Exception {
-        // Test completion of attributes on the manifest element
-        checkManifestCompletion("manifest.xml",
-                "<activity android:^name=\".TestActivity\"");
-    }
-
-    public void testCompletion19() throws Exception {
-        // Test special case where completing on a new element in an otherwise blank line
-        // does not add in full completion (with closing tags)
-        checkLayoutCompletion("broken3.xml", "<EditT^");
-    }
-
-    public void testCompletion20() throws Exception {
-        checkLayoutCompletion("broken1.xml", "android:textColorHigh^");
-    }
-
-    public void testCompletion21() throws Exception {
-        checkLayoutCompletion("broken2.xml", "style=^");
-    }
-
-    public void testCompletion22() throws Exception {
-        // Test completion where the cursor is inside an element (e.g. the next
-        // char is NOT a <) - should not complete with end tags
-        checkLayoutCompletion("completion4.xml", "<Button^");
-    }
-
-    // Test completion in style files
-
-    public void testCompletion23() throws Exception {
-        checkResourceCompletion("completionvalues1.xml", "android:textS^ize");
-    }
-
-    public void testCompletion24() throws Exception {
-        checkResourceCompletion("completionvalues1.xml", "17^sp");
-    }
-
-    public void testCompletion25() throws Exception {
-        checkResourceCompletion("completionvalues1.xml", "textColor\">^@color/title_color</item>");
-    }
-
-    public void testCompletion26() throws Exception {
-        checkResourceCompletion("completionvalues1.xml",
-                "<item name=\"android:shadowColor\">@an^</item>");
-    }
-
-    public void testCompletion27() throws Exception {
-        checkResourceCompletion("completionvalues1.xml",
-                "<item name=\"android:gravity\">^  </item>");
-    }
-
-    public void testCompletion28() throws Exception {
-        checkResourceCompletion("completionvalues1.xml",
-                "<item name=\"android:gravity\">  ^</item>");
-    }
-
-    public void testCompletion29() throws Exception {
-        checkResourceCompletion("completionvalues1.xml", "<item name=\"gr^\">");
-    }
-
-    public void testCompletion30() throws Exception {
-        checkResourceCompletion("completionvalues1.xml", "<item name=\"an^\">");
-    }
-
-    public void testCompletion31() throws Exception {
-        checkResourceCompletion("completionvalues1.xml", "<item ^></item>");
-    }
-
-    public void testCompletion32() throws Exception {
-        checkResourceCompletion("completionvalues1.xml", "<item name=\"^\"></item>");
-    }
-
-    public void testCompletion33() throws Exception {
-        checkResourceCompletion("completionvalues1.xml",
-                "<item name=\"android:allowSingleTap\">^</item>");
-    }
-
-    public void testCompletion34() throws Exception {
-        checkResourceCompletion("completionvalues1.xml",
-                "<item name=\"android:alwaysDrawnWithCache\">^  false  </item>");
-    }
-
-    public void testCompletion35() throws Exception {
-        checkResourceCompletion("completionvalues1.xml",
-                "<item name=\"android:alwaysDrawnWithCache\">  ^false  </item>");
-    }
-
-    public void testCompletion36() throws Exception {
-        checkResourceCompletion("completionvalues1.xml",
-                "<item name=\"android:alwaysDrawnWithCache\">  f^alse  </item>");
-    }
-
-    public void testCompletion37() throws Exception {
-        checkResourceCompletion("completionvalues1.xml",
-                "<item name=\"android:orientation\">h^</item>");
-    }
-
-    public void testCompletion38() throws Exception {
-        checkResourceCompletion("completionvalues1.xml",
-                "           c^");
-    }
-
-    public void testCompletion39() throws Exception {
-        // If you are at the end of a closing quote (but with no space), completion should
-        // include a separating space.
-        checkLayoutCompletion("completion1.xml", "marginBottom=\"50\"^");
-    }
-
-    public void testCompletion40() throws Exception {
-        // Same as test 39 but with single quote
-        checkLayoutCompletion("completion5.xml",  "android:id='@+id/button2'^");
-    }
-
-    public void testCompletion41() throws Exception {
-        // Test prefix matching on layout_ with namespace prefix
-        checkLayoutCompletion("completion8.xml",  "android:mar^=\"50dp\"");
-    }
-
-    public void testCompletion42() throws Exception {
-        // Test prefix matching on layout_ with namespace prefix
-        checkLayoutCompletion("completion8.xml",  "android:w^i=\"100\"");
-    }
-
-    public void testCompletion43() throws Exception {
-        // Test prefix matching on layout_ without namespace prefix
-        checkLayoutCompletion("completion8.xml",  "mar^=\"60dp\"");
-    }
-
-    public void testCompletion44() throws Exception {
-        // Test prefix matching on layout_ without namespace prefix
-        checkLayoutCompletion("completion8.xml",  "android:layo^ut_width=\"fill_parent\"");
-    }
-
-    public void testCompletion45() throws Exception {
-        // Test top level elements in colors
-        checkColorCompletion("color1.xml",  "^<selector");
-    }
-
-    public void testCompletion46a() throws Exception {
-        // Test children of selector: should offer item
-        checkColorCompletion("color1.xml",  "^<item android");
-    }
-
-    public void testCompletion46b() throws Exception {
-        // Test attribute matching in color files
-        checkColorCompletion("color1.xml",  "<item ^android:state_focused=\"true\"/>");
-    }
-
-    public void testCompletion47() throws Exception {
-        // Check root completion in drawables: should list all drawable root elements
-        checkDrawableCompletion("drawable1.xml",  "^<layer-list");
-    }
-
-    public void testCompletion48() throws Exception {
-        // Check attributes of the layer list
-        checkDrawableCompletion("drawable1.xml",  "^xmlns:android");
-    }
-
-    public void testCompletion49() throws Exception {
-        // Check attributes of the <item> element inside a <layer-list>
-        checkDrawableCompletion("drawable1.xml",  "<item ^></item>");
-    }
-
-    public void testCompletion50() throws Exception {
-        // Check elements nested inside the <item> in a layer list: can use any drawable again
-        checkDrawableCompletion("drawable1.xml",  "<item >^</item>");
-    }
-
-    public void testCompletion51() throws Exception {
-        // Check attributes of <shape> element
-        checkDrawableCompletion("drawable2.xml",  "^android:innerRadiusRatio=\"2\"");
-    }
-
-    public void testCompletion52() throws Exception {
-        // Check list of available elements inside a shape
-        checkDrawableCompletion("drawable2.xml",  "^<gradient");
-    }
-
-    public void testCompletion53() throws Exception {
-        // Check list of root anim elements
-        checkAnimCompletion("anim1.xml",  "^<set xmlns");
-    }
-
-    public void testCompletion54() throws Exception {
-        // Check that we can nest inside <set>'s
-        checkAnimCompletion("anim1.xml",  "^<translate android:id=");
-    }
-
-    public void testCompletion55() throws Exception {
-        // translate properties
-        checkAnimCompletion("anim1.xml",  "android:^fromXDelta=");
-    }
-
-    public void testCompletion56() throws Exception {
-        // alpha properties
-        checkAnimCompletion("anim1.xml",  "android:^fromAlpha=");
-    }
-
-    public void testCompletion57() throws Exception {
-        // Fractional properties
-        checkAnimCompletion("anim1.xml",  "android:fromXDelta=\"100^%p\"");
-    }
-
-    public void testCompletion58() throws Exception {
-        // Top level animator elements
-        checkAnimatorCompletion("animator1.xml",  "^<set xmlns");
-    }
-
-    public void testCompletion59() throws Exception {
-        // objectAnimator properties
-        checkAnimatorCompletion("animator1.xml",  "android:^duration=\"2000\"");
-    }
-
-    public void testCompletion60() throws Exception {
-        // propertyName completion
-        checkAnimatorCompletion("animator1.xml",  "android:propertyName=\"scal^eX\"/>");
-    }
-
-    public void testCompletion61() throws Exception {
-        // Interpolator completion
-        checkAnimatorCompletion("animator1.xml",
-                "android:interpolator=\"^@android:anim/bounce_interpolator\"");
-    }
-
-    public void testCompletion62() throws Exception {
-        // Test completing inside an element that contains .'s, such as a custom view tag
-        checkLayoutCompletion("completion9.xml",  "android:layout_wi^dth=");
-    }
-
-    public void testCompletion63() throws Exception {
-        // Test attribute completion inside a custom view tag
-        // TODO: This works in a running IDE but not in a test context; figure out why.
-        //checkLayoutCompletion("completion9.xml",  "android:drawable^Top");
-    }
-
-    public void testCompletion64() throws Exception {
-        // Test element completion inside a custom view tag
-        checkLayoutCompletion("completion9.xml",  "^<Button");
-    }
-
-    public void testCompletion65() throws Exception {
-        // Test completion replacement when there is a selection
-        // (see issue http://code.google.com/p/android/issues/detail?id=18607 )
-        checkLayoutCompletion("completion10.xml", "\"[^wrap_content]\"");
-    }
-
-    public void testCompletion66() throws Exception {
-        checkResourceCompletion("completionvalues1.xml", "17[^sp]");
-    }
-
-    public void testCompletion67() throws Exception {
-        checkResourceCompletion("completionvalues1.xml", "17[^sp]");
-    }
-
-    public void testCompletion68() throws Exception {
-        checkResourceCompletion("completionvalues1.xml", "[^false]");
-    }
-
-    public void testCompletion69() throws Exception {
-        // Test minimum SDK completion
-        checkManifestCompletion("manifest.xml", "<uses-sdk android:minSdkVersion=\"^11\" />");
-    }
-
-    public void testCompletion70() throws Exception {
-        checkResourceCompletion("completionvalues2.xml",
-                "<item name=\"main_layout4\" type=\"layout\">^</item>");
-    }
-
-    public void testCompletion71() throws Exception {
-        checkResourceCompletion("completionvalues2.xml",
-                "<item name=\"main_layout5\" type=\"string\">@string/^app_name</item>");
-    }
-
-    public void testCompletion72() throws Exception {
-        // Test completion of theme attributes
-        checkLayoutCompletion("completion11.xml", "?^android:attr/Textapp");
-    }
-
-    public void testCompletion73() throws Exception {
-        checkLayoutCompletion("completion11.xml", "?android:attr/Textapp^");
-    }
-
-    public void testCompletion74() throws Exception {
-        checkLayoutCompletion("completion11.xml", "?and^roid:attr/Textapp");
-    }
-
-    public void testCompletion75() throws Exception {
-        // Test <include> attributes
-        checkLayoutCompletion("completion12.xml", "<include ^/>");
-    }
-
-    public void testComplation76() throws Exception {
-        // Test theme completion with implicit attr
-        checkLayoutCompletion("navigation1.xml", "?android:a^ttr/alertDialogStyle");
-    }
-
-    public void testComplation77() throws Exception {
-        // Test <fragment class="^" completion
-        checkLayoutCompletion("fragmentlayout.xml", "android:name=\"^com");
-    }
-
-    public void testComplation78() throws Exception {
-        // Test <fragment android:name="^" completion
-        checkLayoutCompletion("fragmentlayout.xml", "class=\"^com");
-    }
-
-    public void testComplation79() throws Exception {
-        // Test tools context completion
-        checkLayoutCompletion("completion11.xml", "tools:context=\"^.MainActivity\"");
-    }
-
-    public void testComplation80() throws Exception {
-        // Test manifest class completion
-        checkManifestCompletion("manifest.xml", "<activity android:name=\"^.");
-    }
-
-    // TODO: Test <view completion!
-
-    // ---- Test *applying* code completion ----
-
-    // The following tests check -applying- a specific code completion
-    // match - this verifies that the document is updated correctly, the
-    // caret is moved appropriately, etc.
-
-    public void testApplyCompletion1() throws Exception {
-        // Change attribute name completion
-        checkApplyLayoutCompletion("completion1.xml", "layout_w^idth=\"fill_parent\"",
-                "android:layout_weight");
-    }
-
-    public void testApplyCompletion2() throws Exception {
-        // Check attribute value completion for enum
-        checkApplyLayoutCompletion("completion1.xml", "layout_width=\"^fill_parent\"",
-                "match_parent");
-    }
-
-    public void testApplyCompletion3() throws Exception {
-        // Check attribute value completion for enum with a prefix
-        checkApplyLayoutCompletion("completion1.xml", "layout_width=\"fi^ll_parent\"",
-                "fill_parent");
-    }
-
-    public void testApplyCompletion4() throws Exception {
-        // Check attribute value completion on units
-        checkApplyLayoutCompletion("completion1.xml", "marginBottom=\"50^\"", "50mm");
-    }
-
-    public void testApplyCompletion5() throws Exception {
-        // Check attribute value completion on units with prefix
-        checkApplyLayoutCompletion("completion1.xml", "layout_marginLeft=\"50d^p\"", "50dp");
-    }
-
-    public void testApplyCompletion6() throws Exception {
-        // Check resource sorting - "style" should bubble to the top for a style attribute
-        checkApplyLayoutCompletion("completion1.xml", "style=\"@android:^style/Widget.Button\"",
-                "@android:drawable/");
-    }
-
-    public void testApplyCompletion7a() throws Exception {
-        // Check flags (multiple values inside a single XML value, separated by | - where
-        // the prefix is reset as soon as you pass each | )
-        checkApplyLayoutCompletion("completion1.xml", "android:gravity=\"l^eft|bottom\"",
-                "left");
-        // NOTE - this will replace all flag values with the newly selected value.
-        // That may not be the best behavior - perhaps we should only replace one portion
-        // of the value.
-    }
-
-    public void testApplyCompletion7b() throws Exception {
-        checkApplyLayoutCompletion("completion1.xml", "android:gravity=\"left|b^ottom\"",
-                "bottom");
-        // NOTE - this will replace all flag values with the newly selected value.
-        // That may not be the best behavior - perhaps we should only replace one portion
-        // of the value.
-    }
-
-    public void testApplyCompletion8() throws Exception {
-        // Test completion right at the "=" sign; this will be taken to be the last
-        // character of the attribute name (the caret is between the last char and before
-        // the = characters), so it should match a single attribute
-        checkApplyLayoutCompletion("completion1.xml", "layout_width^=\"fill_parent\"",
-                "android:layout_width");
-    }
-
-    public void testApplyCompletion9() throws Exception {
-        // Test completion right after the "=" sign; this will be taken to be the beginning
-        // of the attribute value, but all values will also include a leading quote
-        checkApplyLayoutCompletion("completion1.xml", "layout_width=^\"fill_parent\"",
-                "\"wrap_content\"");
-    }
-
-    public void testApplyCompletion10() throws Exception {
-        // Test completion of element names
-        checkApplyLayoutCompletion("completion1.xml", "<T^extView", "TableLayout");
-    }
-
-    public void testApplyCompletion11a() throws Exception {
-        // Test completion of element names at the outside of the <. This should include
-        // all the elements too (along with the leading <).
-        checkApplyLayoutCompletion("completion1.xml", "^<TextView", "<RadioGroup ></RadioGroup>");
-    }
-
-    public void testApplyCompletion11b() throws Exception {
-        // Similar to testApplyCompletion11a, but replacing with an element that does not
-        // have children (to test the closing tag insertion code)
-        checkApplyLayoutCompletion("completion1.xml", "^<TextView", "<CheckBox />");
-    }
-
-    public void testApplyCompletion12() throws Exception {
-        // Test completion of element names inside a nested XML; ensure that this will
-        // correctly compute element names, not previous attribute
-        checkApplyLayoutCompletion("completion1.xml", "btn_default\">^</FrameLayout>",
-                "<FrameLayout ></FrameLayout>");
-    }
-
-    public void testApplyCompletion13a() throws Exception {
-        checkApplyLayoutCompletion("completion2.xml", "gravity=\"left|bottom|^cen",
-                "fill_vertical");
-    }
-
-    public void testApplyCompletion13b() throws Exception {
-        checkApplyLayoutCompletion("completion2.xml", "gravity=\"left|bottom|cen^",
-                "center_horizontal");
-    }
-
-    public void testApplyCompletion13c() throws Exception {
-        checkApplyLayoutCompletion("completion2.xml", "gravity=\"left|bottom^|cen",
-                "bottom|fill_horizontal");
-    }
-
-    public void testApplyCompletion14() throws Exception {
-        // Test special case where completing on a new element in an otherwise blank line
-        // does not add in full completion (with closing tags)
-        checkApplyLayoutCompletion("broken3.xml", "<EditT^", "EditText />");
-    }
-
-    public void testApplyCompletion15() throws Exception {
-        checkApplyLayoutCompletion("broken1.xml", "android:textColorHigh^",
-                "android:textColorHighlight");
-    }
-
-    public void testApplyCompletion16() throws Exception {
-        checkApplyLayoutCompletion("broken2.xml", "style=^",
-                "\"@android:\"");
-    }
-
-    public void testApplyCompletion17() throws Exception {
-        // Make sure that completion right before a / inside an element still
-        // inserts the ="" part (e.g. handles it as "insertNew)
-        checkApplyLayoutCompletion("completion3.xml", "<EditText ^/>",
-                "android:textColorHighlight");
-    }
-
-    public void testApplyCompletion18() throws Exception {
-        // Make sure that completion right before a > inside an element still
-        // inserts the ="" part (e.g. handles it as "insertNew)
-        checkApplyLayoutCompletion("completion3.xml", "<Button ^></Button>",
-                "android:paddingRight");
-    }
-
-    public void testApplyCompletion19() throws Exception {
-        // Test completion with single quotes (apostrophe)
-        checkApplyLayoutCompletion("completion5.xml", "android:orientation='^'", "horizontal");
-    }
-
-    public void testApplyCompletion20() throws Exception {
-        // Test completion with single quotes (apostrophe)
-        checkApplyLayoutCompletion("completion5.xml", "android:layout_marginTop='50^dp'", "50pt");
-    }
-
-    public void testApplyCompletion21() throws Exception {
-        // Test completion with single quotes (apostrophe)
-        checkApplyLayoutCompletion("completion5.xml", "android:layout_width='^wrap_content'",
-                "match_parent");
-        // Still broken - but not a common case
-        //checkApplyLayoutCompletion("completion5.xml", "android:layout_width=^'wrap_content'",
-        //     "\"match_parent\"");
-    }
-
-    public void testApplyCompletion22() throws Exception {
-        // Test completion in an empty string
-        checkApplyLayoutCompletion("completion6.xml", "android:orientation=\"^\"", "horizontal");
-    }
-
-    public void testApplyCompletion23() throws Exception {
-        // Test completion in an empty string
-        checkApplyLayoutCompletion("completion7.xml", "android:orientation=\"^", "horizontal");
-    }
-
-    // Test completion in style files
-
-    public void testApplyCompletion24a() throws Exception {
-        checkApplyResourceCompletion("completionvalues1.xml", "android:textS^ize",
-                "android:textSelectHandleLeft");
-    }
-
-    public void testApplyCompletion24b() throws Exception {
-        checkApplyResourceCompletion("completionvalues1.xml", "17^sp", "17mm");
-    }
-
-    public void testApplyCompletion25() throws Exception {
-        checkApplyResourceCompletion("completionvalues1.xml",
-                "textColor\">^@color/title_color</item>", "@android:");
-    }
-
-    public void testApplyCompletion26() throws Exception {
-        checkApplyResourceCompletion("completionvalues1.xml",
-                "<item name=\"android:shadowColor\">@an^</item>", "@android:");
-    }
-
-    public void testApplyCompletion27() throws Exception {
-        checkApplyResourceCompletion("completionvalues1.xml",
-                "<item name=\"android:gravity\">^  </item>", "center_vertical");
-    }
-
-    public void testApplyCompletion28() throws Exception {
-        checkApplyResourceCompletion("completionvalues1.xml",
-                "<item name=\"android:gravity\">  ^</item>", "left");
-    }
-
-    public void testApplyCompletion29() throws Exception {
-        checkApplyResourceCompletion("completionvalues1.xml", "<item name=\"gr^\">",
-                "android:gravity");
-    }
-
-    public void testApplyCompletion30() throws Exception {
-        checkApplyResourceCompletion("completionvalues1.xml", "<item name=\"an^\">",
-                "android:animateOnClick");
-    }
-
-    public void testApplyCompletion31() throws Exception {
-        checkApplyResourceCompletion("completionvalues1.xml", "<item ^></item>", "name");
-    }
-
-    public void testApplyCompletion32() throws Exception {
-        checkApplyResourceCompletion("completionvalues1.xml", "<item name=\"^\"></item>",
-                "android:background");
-    }
-
-    public void testApplyCompletion33() throws Exception {
-        checkApplyResourceCompletion("completionvalues1.xml",
-                "<item name=\"android:allowSingleTap\">^</item>", "true");
-    }
-
-    public void testApplyCompletion34() throws Exception {
-        checkApplyResourceCompletion("completionvalues1.xml",
-                "<item name=\"android:alwaysDrawnWithCache\">^  false  </item>", "true");
-    }
-
-    public void testApplyCompletion35() throws Exception {
-        checkApplyResourceCompletion("completionvalues1.xml",
-                "<item name=\"android:alwaysDrawnWithCache\">  ^false  </item>", "true");
-    }
-
-    public void testApplyCompletion36() throws Exception {
-        checkApplyResourceCompletion("completionvalues1.xml",
-                "<item name=\"android:alwaysDrawnWithCache\">  f^alse  </item>", "false");
-    }
-
-    public void testApplyCompletion37() throws Exception {
-        checkApplyResourceCompletion("completionvalues1.xml",
-                "<item name=\"android:orientation\">h^</item>", "horizontal");
-    }
-
-    public void testApplyCompletion38() throws Exception {
-        checkApplyResourceCompletion("completionvalues1.xml",
-                "           c^", "center");
-    }
-
-    public void testApplyCompletion39() throws Exception {
-        // If you are at the end of a closing quote (but with no space), completion should
-        // include a separating space.
-        checkApplyLayoutCompletion("completion1.xml", "marginBottom=\"50\"^", " android:maxEms");
-    }
-
-    public void testApplyCompletion40() throws Exception {
-        // If you are at the end of a closing quote (but with no space), completion should
-        // include a separating space.
-        checkApplyLayoutCompletion("completion5.xml",  "android:id='@+id/button2'^",
-                " android:maxWidth");
-    }
-
-    public void testApplyCompletion41() throws Exception {
-        // Test prefix matching on layout_ with namespace prefix
-        checkApplyLayoutCompletion("completion8.xml",  "android:mar^=\"50dp\"",
-                "android:layout_marginRight");
-    }
-
-    public void testApplyCompletion42() throws Exception {
-        // Test completion replacement when there is a selection
-        // (see issue http://code.google.com/p/android/issues/detail?id=18607 )
-        checkApplyLayoutCompletion("completion10.xml", "\"[^wrap_content]\"", "fill_parent");
-    }
-
-    public void testApplyCompletion43() throws Exception {
-        // Same as testApplyCompletion42 but with a smaller selection range
-        checkApplyLayoutCompletion("completion10.xml", "\"[^wrap_c]ontent\"", "fill_parent");
-    }
-
-    public void testApplyCompletion44() throws Exception {
-        checkApplyResourceCompletion("completionvalues1.xml", "[^false]", "true");
-    }
-
-    public void testApplyCompletion45() throws Exception {
-        checkApplyResourceCompletion("completionvalues2.xml",
-                "@string/^app_name", "@string/hello");
-    }
-
-    public void testApplyCompletion46() throws Exception {
-        checkApplyLayoutCompletion("completion11.xml",
-                "?android:attr/Textapp^", "?android:attr/textAppearanceLargeInverse");
-    }
-
-    public void testApplyCompletion47() throws Exception {
-        // Test applying <fragment android:name="^" completion
-        checkApplyLayoutCompletion("fragmentlayout.xml", "class=\"^com",
-                "android.app.ListFragment");
-    }
-
-    // --- Code Completion test infrastructure ----
-
-    private void checkLayoutCompletion(String name, String caretLocation) throws Exception {
-        IFile file = getLayoutFile(getProject(), name);
-        IDE.setDefaultEditor(file, CommonXmlEditor.ID);
-        checkCompletion(name, file, caretLocation,
-                new LayoutContentAssist());
-    }
-
-    private void checkColorCompletion(String name, String caretLocation) throws Exception {
-        IFile file = getTestDataFile(getProject(), name, FD_RES + "/" + FD_RES_COLOR + "/" + name);
-        IDE.setDefaultEditor(file, CommonXmlEditor.ID);
-        checkCompletion(name, file, caretLocation, new ColorContentAssist());
-    }
-
-    private void checkAnimCompletion(String name, String caretLocation) throws Exception {
-        IFile file = getTestDataFile(getProject(), name, FD_RES + "/" + FD_RES_ANIM + "/" + name);
-        IDE.setDefaultEditor(file, CommonXmlEditor.ID);
-        checkCompletion(name, file, caretLocation, new AnimationContentAssist());
-    }
-
-    private void checkAnimatorCompletion(String name, String caretLocation) throws Exception {
-        IFile file = getTestDataFile(getProject(), name, FD_RES + "/" + FD_RES_ANIMATOR + "/"
-                + name);
-        IDE.setDefaultEditor(file, CommonXmlEditor.ID);
-        checkCompletion(name, file, caretLocation, new AnimationContentAssist());
-    }
-
-    private void checkDrawableCompletion(String name, String caretLocation) throws Exception {
-        IFile file = getTestDataFile(getProject(), name, FD_RES + "/" + FD_RES_DRAWABLE + "/"
-                + name);
-        IDE.setDefaultEditor(file, CommonXmlEditor.ID);
-        checkCompletion(name, file, caretLocation, new DrawableContentAssist());
-    }
-
-    private void checkManifestCompletion(String name, String caretLocation) throws Exception {
-        // Manifest files must be named AndroidManifest.xml. Must overwrite to replace
-        // the default manifest created in the test project.
-        IFile file = getTestDataFile(getProject(), name, "AndroidManifest.xml", true);
-        IDE.setDefaultEditor(file, ManifestEditor.ID);
-
-        checkCompletion(name, file, caretLocation,
-                new ManifestContentAssist());
-    }
-
-    private void checkApplyLayoutCompletion(String name, String caretLocation,
-            String match) throws Exception {
-        checkApplyCompletion(name, getLayoutFile(getProject(), name), caretLocation,
-                new LayoutContentAssist(), match);
-    }
-
-    private void checkResourceCompletion(String name, String caretLocation) throws Exception {
-        checkCompletion(name, getValueFile(getProject(), name), caretLocation,
-                new ValuesContentAssist());
-    }
-
-    private void checkApplyResourceCompletion(String name, String caretLocation,
-            String match) throws Exception {
-        checkApplyCompletion(name, getValueFile(getProject(), name), caretLocation,
-                new ValuesContentAssist(), match);
-    }
-
-    private ICompletionProposal[] complete(IFile file, String caretLocation,
-            AndroidContentAssist assist) throws Exception {
-
-        // Open file
-        IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
-        assertNotNull(page);
-        IEditorPart editor = IDE.openEditor(page, file);
-        assertTrue(editor instanceof AndroidXmlEditor);
-        AndroidXmlEditor xmlEditor = (AndroidXmlEditor) editor;
-
-        UiElementNode root = xmlEditor.getUiRootNode();
-        ElementDescriptor descriptor = root.getDescriptor();
-        if (descriptor instanceof ViewElementDescriptor) {
-            ViewElementDescriptor vd = (ViewElementDescriptor) descriptor;
-            AttributeDescriptor[] attributes = vd.getAttributes();
-            assertTrue(Integer.toString(attributes.length), attributes.length > 0);
-        }
-
-        ISourceViewer viewer = xmlEditor.getStructuredSourceViewer();
-
-        // Determine the offset, and possibly make text range selections as well
-        int offset = updateCaret(viewer, caretLocation);
-
-        // Run code completion
-        ICompletionProposal[] proposals = assist.computeCompletionProposals(viewer, offset);
-        if (proposals == null) {
-            proposals = new ICompletionProposal[0];
-        }
-
-        editor.getEditorSite().getPage().closeAllEditors(false);
-
-        return proposals;
-    }
-
-    private void checkApplyCompletion(String basename, IFile file, String caretLocation,
-            AndroidContentAssist assist, String match) throws Exception {
-        ICompletionProposal[] proposals = complete(file, caretLocation, assist);
-        ICompletionProposal chosen = null;
-        for (ICompletionProposal proposal : proposals) {
-            if (proposal.getDisplayString().equals(match)) {
-                chosen = proposal;
-                break;
-            }
-        }
-        assertNotNull(chosen);
-        assert chosen != null; // Eclipse null pointer analysis doesn't believe the JUnit assertion
-
-        String fileContent = AdtPlugin.readFile(file);
-        IDocument document = new Document();
-        document.set(fileContent);
-
-        // Apply code completion
-        chosen.apply(document);
-
-        // Insert caret location as well
-        Point location = chosen.getSelection(document);
-        document.replace(location.x, 0, CARET);
-
-        String actual = document.get();
-
-        int offset = getCaretOffset(fileContent, caretLocation);
-        String beforeWithCaret = fileContent.substring(0, offset) + CARET
-                + fileContent.substring(offset);
-
-        String diff = getDiff(beforeWithCaret, actual);
-        assertTrue(diff + " versus " + actual, diff.length() > 0 || beforeWithCaret.equals(actual));
-
-        StringBuilder summary = new StringBuilder();
-        summary.append("Code completion in " + basename + " for " + caretLocation + " selecting "
-                + match + ":\n");
-        if (diff.length() == 0) {
-            diff = "No changes";
-        }
-        summary.append(diff);
-
-        // assertEqualsGolden(basename, actual);
-        assertEqualsGolden(basename, summary.toString(), "diff");
-    }
-
-    private void checkCompletion(String basename, IFile file, String caretLocation,
-            AndroidContentAssist assist) throws Exception {
-        ICompletionProposal[] proposals = complete(file, caretLocation, assist);
-        StringBuilder sb = new StringBuilder(1000);
-        sb.append("Code completion in " + basename + " for " + caretLocation + ":\n");
-        for (ICompletionProposal proposal : proposals) {
-            // TODO: assertNotNull(proposal.getImage());
-            int length = sb.length();
-            sb.append(proposal.getDisplayString().trim());
-            String help = proposal.getAdditionalProposalInfo();
-            if (help != null && help.trim().length() > 0) {
-                sb.append(" : ");
-                sb.append(help.replace('\n', ' ').trim());
-                if (sb.length() > length + 300) {
-                    sb.setLength(length + 300 - "...".length());
-                    sb.append("...");
-                }
-            }
-            sb.append('\n');
-        }
-        assertEqualsGolden(basename, sb.toString(), "txt");
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/AndroidXmlAutoEditStrategyTest.java b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/AndroidXmlAutoEditStrategyTest.java
deleted file mode 100644
index 27661b3..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/AndroidXmlAutoEditStrategyTest.java
+++ /dev/null
@@ -1,473 +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.eclipse.adt.internal.editors;
-
-import com.android.ide.eclipse.adt.internal.editors.layout.refactoring.AdtProjectTest;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.jface.text.DocumentCommand;
-import org.eclipse.jface.text.IDocument;
-import org.eclipse.jface.text.source.ISourceViewer;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.ide.IDE;
-
-@SuppressWarnings("javadoc")
-public class AndroidXmlAutoEditStrategyTest extends AdtProjectTest {
-
-    public void checkInsertNewline(String before, String after) throws Exception {
-        AndroidXmlAutoEditStrategy s = new AndroidXmlAutoEditStrategy();
-
-        // All tests just operate on the "edithandling" document; the contents are
-        // ignored and replaced with the before-document passed in
-        IFile file = getLayoutFile(getProject(), "edithandling.xml");
-
-        IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
-        assertNotNull(page);
-        IEditorPart editor = IDE.openEditor(page, file);
-        assertTrue(editor instanceof AndroidXmlEditor);
-        AndroidXmlEditor layoutEditor = (AndroidXmlEditor) editor;
-        ISourceViewer viewer = layoutEditor.getStructuredSourceViewer();
-
-        String newDocumentContent = stripCaret(before);
-        IDocument document = viewer.getDocument();
-        document.replace(0, document.getLength(), newDocumentContent);
-
-        // Determine the offset, and possibly make text range selections as well
-        int offset = updateCaret(viewer, before);
-
-        DocumentCommand c = new TestDocumentCommand();
-        c.doit = true;
-        c.offset = offset;
-        c.caretOffset = -1;
-        c.length = 0;
-        c.text = "\n";
-
-        s.customizeDocumentCommand(document, c);
-
-        if (c.doit) {
-            if (c.length == 0 && c.text == null) {
-                return;
-            }
-
-            document.replace(c.offset, c.length, c.text);
-
-            int caretOffset = c.offset + c.text.length();
-
-            // The shiftsCaret flag doesn't behave the way it's documented to
-            //if (c.shiftsCaret && c.caretOffset != -1) {
-            if (c.caretOffset != -1) {
-                caretOffset = c.caretOffset;
-            }
-            viewer.setSelectedRange(caretOffset, 0);
-        }
-
-        String text = document.get();
-        Point selectedRange = viewer.getSelectedRange();
-        assert selectedRange.y == 0;
-        String textWithCaret = text;
-        if (selectedRange.x >= 0) {
-            textWithCaret = text.substring(0, selectedRange.x) + "^" +
-                text.substring(selectedRange.x);
-        }
-
-        assertEquals(after, textWithCaret);
-    }
-
-    private static String stripCaret(String s) {
-        int index = s.indexOf('^');
-        assertTrue(index != -1);
-        return s.substring(0, index) + s.substring(index + 1);
-    }
-
-    public void testCornerCase1() throws Exception {
-        checkInsertNewline("^", "\n^");
-    }
-
-    public void testCornerCase2() throws Exception {
-        checkInsertNewline(
-                "\n^",
-
-                "\n\n^");
-    }
-
-    public void testCornerCase3() throws Exception {
-        checkInsertNewline(
-                "    ^",
-
-                "    \n" +
-                "    ^");
-    }
-
-    public void testSimpleIndentation1() throws Exception {
-        checkInsertNewline(
-                "   ^ ",
-
-                "   \n" +
-                "   ^ ");
-    }
-
-    public void testSimpleIndentation2() throws Exception {
-        checkInsertNewline(
-                "\n" +
-                "   foo^\n",
-
-                "\n" +
-                "   foo\n" +
-                "   ^\n");
-    }
-
-    public void testSimpleIndentation3() throws Exception {
-        checkInsertNewline(
-                "\n" +
-                "    <newtag>^\n",
-
-                "\n" +
-                "    <newtag>\n" +
-                "        ^\n");
-    }
-
-    public void testSimpleIndentation4() throws Exception {
-        checkInsertNewline(
-                "\n" +
-                "    <newtag/>^\n",
-
-                "\n" +
-                "    <newtag/>\n" +
-                "    ^\n");
-    }
-
-    public void testSimpleIndentation5() throws Exception {
-        checkInsertNewline(
-                "\n" +
-                "    <newtag^\n",
-                "\n" +
-                "    <newtag\n" +
-                "        ^\n");
-    }
-
-    public void testSplitAttribute() throws Exception {
-        checkInsertNewline(
-                "\n" +
-                "    <newtag ^attribute='value'/>\n",
-
-                "\n" +
-                "    <newtag \n" +
-                "        ^attribute='value'/>\n");
-    }
-
-    public void testIndentationInComments1() throws Exception {
-        // Make sure that inside a comment we ignore tags etc
-        checkInsertNewline(
-                "<!--\n   foo^\n--->\n",
-
-                "<!--\n   foo\n   ^\n--->\n");
-    }
-
-    public void testIndentationInComments2() throws Exception {
-        // Make sure that inside a comment we ignore tags etc
-        checkInsertNewline(
-                "\n" +
-                "<!--\n" +
-                "<foo><^\n" +
-                "-->\n",
-
-                "\n" +
-                "<!--\n" +
-                "<foo><\n" +
-                "^\n" +
-                "-->\n");
-    }
-
-    public void testSurroundCaret() throws Exception {
-        checkInsertNewline(
-                "\n" +
-                "    <item>^</item>\n",
-
-                "\n" +
-                "    <item>\n" +
-                "        ^\n" +
-                "    </item>\n");
-    }
-
-    public void testSurroundCaret2() throws Exception {
-        // This test combines both surround with and continuing earlier lines (where
-        // it searches for a matching tag)
-        checkInsertNewline(
-                "\n" +
-                "    <foo\n" +
-                "        name='value'>^</foo>\n",
-
-                "\n" +
-                "    <foo\n" +
-                "        name='value'>\n" +
-                "        ^\n" +
-                "    </foo>\n");
-    }
-
-    public void testContinueEarlierLine1() throws Exception {
-        // Here we need to indent to the exact location of an earlier line
-        checkInsertNewline(
-                "\n" +
-                "    <foo\n" +
-                "        name='value'/>^\n",
-
-                "\n" +
-                "    <foo\n" +
-                "        name='value'/>\n" +
-                "    ^\n");
-    }
-
-    public void testContinueEarlierLine2() throws Exception {
-        checkInsertNewline(
-                "\n" +
-                "    <foo\n" +
-                "        name='value'></foo>^\n",
-
-                "\n" +
-                "    <foo\n" +
-                "        name='value'></foo>\n" +
-                "    ^\n");
-        // Note that
-        //    <foo
-        //           >
-        //    </foo>
-        // does not require special handling, this only happens with the closing tag is sharing
-        // a line.
-    }
-
-    public void testContinueEarlierLine3() throws Exception {
-        // Make sure the code to look up the corresponding opening tag works properly
-        checkInsertNewline(
-                "\n" +
-                "    <foo\n" +
-                "        name='value'><bar></bar><baz/></foo>^\n",
-
-                "\n" +
-                "    <foo\n" +
-                "        name='value'><bar></bar><baz/></foo>\n" +
-                "    ^\n");
-    }
-
-    public void testContinueEarlierLine4() throws Exception {
-        checkInsertNewline(
-                "    <Button\n" +
-                "        android:id=\"@+id/button1\"\n" +
-                "        android:layout_width=\"wrap_content\"\n" +
-                "        android:layout_height=\"wrap_content\"\n" +
-                "        android:text=\"Button\" >^\n" +
-                "    </Button>\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");
-    }
-
-    public void testIndent() throws Exception {
-        checkInsertNewline(
-                "    <Button\n" +
-                "        attr=\"value\"></Button>^\n",
-
-                "    <Button\n" +
-                "        attr=\"value\"></Button>\n" +
-                "    ^\n" +
-                "");
-    }
-
-    public void testLineBeginning1() throws Exception {
-        // Test that if you insert on a blank line, we just add a newline and indent
-        checkInsertNewline(
-                "<foo>\n" +
-                "^\n" +
-                "</foo>",
-
-                "<foo>\n" +
-                "\n" +
-                "    ^\n" +
-                "</foo>");
-    }
-
-    public void testLineBeginning2() throws Exception {
-        // Test that if you insert with the caret on the beginning of a line that has
-        // content, we insert an indent correctly
-        checkInsertNewline(
-                "<foo>\n" +
-                "^    <bar/>\n" +
-                "</foo>",
-
-                "<foo>\n" +
-                "\n" +
-                "    ^<bar/>\n" +
-                "</foo>");
-    }
-
-    public void testLineBeginning3() throws Exception {
-        checkInsertNewline(
-                "<foo>\n" +
-                "    <bar>\n" +
-                "^\n" +
-                "        <baz/>\n" +
-                "    </bar>\n" +
-                "</foo>",
-
-                "<foo>\n" +
-                "    <bar>\n" +
-                "\n" +
-                "        ^\n" +
-                "        <baz/>\n" +
-                "    </bar>\n" +
-                "</foo>");
-
-    }
-
-    public void testLineBeginning4() throws Exception {
-        // Test that if you insert with the caret on the beginning of a line that has
-        // content, we insert an indent correctly
-        checkInsertNewline(
-                "<foo>\n" +
-                "    <bar>\n" +
-                "\n" +
-                "^        <baz/>\n" +
-                "    </bar>\n" +
-                "</foo>",
-
-                "<foo>\n" +
-                "    <bar>\n" +
-                "\n" +
-                "\n" +
-                "        ^<baz/>\n" +
-                "    </bar>\n" +
-                "</foo>");
-    }
-
-    public void testLineBeginning5() throws Exception {
-        // Test that if you insert with the caret on the beginning of a line that has
-        // content, we insert an indent correctly
-        checkInsertNewline(
-                "<foo>\n" +
-                "    <bar>\n" +
-                "\n" +
-                "    ^    <baz/>\n" +
-                "    </bar>\n" +
-                "</foo>",
-
-                "<foo>\n" +
-                "    <bar>\n" +
-                "\n" +
-                "    \n" +
-                "        ^<baz/>\n" +
-                "    </bar>\n" +
-                "</foo>");
-    }
-
-    public void testLineBeginning6() throws Exception {
-
-        checkInsertNewline(
-                "    <foo>\n" +
-                "        <bar>\n" +
-                "            \n" +
-                "        \n" +
-                "^        </bar>\n" +
-                "    </foo>\n",
-
-                "    <foo>\n" +
-                "        <bar>\n" +
-                "            \n" +
-                "        \n" +
-                "\n" +
-                "        ^</bar>\n" +
-                "    </foo>\n");
-    }
-
-    public void testBlankContinuation() throws Exception {
-
-        checkInsertNewline(
-                "    <foo>\n" +
-                "        <bar>\n" +
-                "            ^\n" +
-                "        </bar>\n" +
-                "    </foo>\n" +
-                "",
-
-                "    <foo>\n" +
-                "        <bar>\n" +
-                "            \n" +
-                "            ^\n" +
-                "        </bar>\n" +
-                "    </foo>\n" +
-                "");
-    }
-
-    public void testIssue22332a() throws Exception {
-        checkInsertNewline(
-                "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" +
-                "<resources>\n" +
-                "\n" +
-                "    <string name=\"hello\">Hello World, MainActivity!</string>^\n" +
-                "\n" +
-                "</resources>",
-
-                "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" +
-                "<resources>\n" +
-                "\n" +
-                "    <string name=\"hello\">Hello World, MainActivity!</string>\n" +
-                "    ^\n" +
-                "\n" +
-                "</resources>");
-    }
-
-    public void testIssue22332b() throws Exception {
-        checkInsertNewline(
-                "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" +
-                        "<resources>\n" +
-                        "\n" +
-                        "    <string name=\"hello\">Hello World, MainActivity!</string>\n" +
-                        "    ^\n" +
-                        "\n" +
-                        "</resources>",
-
-                "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" +
-                        "<resources>\n" +
-                        "\n" +
-                        "    <string name=\"hello\">Hello World, MainActivity!</string>\n" +
-                        "    \n" +
-                        "    ^\n" +
-                        "\n" +
-                        "</resources>");
-    }
-
-    /**
-     * To test
-     *    When you press / after < I should reindent the current line. For example,
-     *    if you have
-     *        <foo>
-     *            <bar>
-     *            </ the moment you've typed this we should dedent it back out
-     *    When you press newline we need to reindent
-     */
-
-    /** Subclassed for test usage since constructor is protected */
-    private class TestDocumentCommand extends DocumentCommand {
-        public TestDocumentCommand() {
-        }
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/AndroidXmlCharacterMatcherTest.java b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/AndroidXmlCharacterMatcherTest.java
deleted file mode 100644
index acb2b04..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/AndroidXmlCharacterMatcherTest.java
+++ /dev/null
@@ -1,144 +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.eclipse.adt.internal.editors;
-
-import com.android.ide.eclipse.adt.internal.editors.layout.refactoring.AdtProjectTest;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.jface.text.IRegion;
-import org.eclipse.jface.text.source.ISourceViewer;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.ide.IDE;
-import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;
-
-@SuppressWarnings("restriction")
-public class AndroidXmlCharacterMatcherTest extends AdtProjectTest {
-    public void testGotoMatchingFwd1() throws Exception {
-        checkGotoMatching(
-                "<app^lication android:icon",
-                "^</application>");
-    }
-
-    public void testGotoMatchingFwd2() throws Exception {
-        checkGotoMatching(
-                "^<application android:icon",
-                "^</application>");
-    }
-
-    public void testGotoMatchingFwd3() throws Exception {
-        checkGotoMatching(
-                "<application^ android:icon",
-                "^</application>");
-    }
-
-    public void testGotoMatchingBwd1() throws Exception {
-        checkGotoMatching(
-                "^</application>",
-                "^<application android:icon");
-    }
-
-    public void testGotoMatchingBwd2() throws Exception {
-        checkGotoMatching(
-                "<^/application>",
-                "^<application android:icon");
-    }
-
-    public void testGotoMatchingBwd3() throws Exception {
-        checkGotoMatching(
-                "</^application>",
-                "^<application android:icon");
-    }
-
-    public void testGotoMatchingBwd4() throws Exception {
-        checkGotoMatching(
-                "</app^lication>",
-                "^<application android:icon");
-    }
-
-    public void testGotoMatchingBwd5() throws Exception {
-        checkGotoMatching(
-                "</^application>",
-                "^<application android:icon");
-    }
-
-    public void testGotoMatchingBwd6() throws Exception {
-        checkGotoMatching(
-                "</^application>",
-                "^<application android:icon");
-    }
-
-    public void testGotoMatchingFwd4() throws Exception {
-        checkGotoMatching(
-                "<intent-filter^>",
-                "^</intent-filter>");
-    }
-
-    public void testGotoMatchingFwd5() throws Exception {
-        checkGotoMatching(
-                "<intent-filter>^",
-                "^</intent-filter>");
-    }
-
-    public void testGotoMatchingFallback() throws Exception {
-        // Character matching is done by the superclass; ensure that fallback to the
-        // other XML matchers is working
-        checkGotoMatching(
-                "android:icon=^\"@drawable/icon\"",
-                "android:icon=\"@drawable/icon^\"");
-    }
-
-    private void checkGotoMatching(IFile file, String caretBefore,
-            String caretAfter) throws Exception {
-        IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
-        assertNotNull(page);
-        IEditorPart editor = IDE.openEditor(page, file);
-        assertTrue(editor instanceof AndroidXmlEditor);
-        AndroidXmlEditor layoutEditor = (AndroidXmlEditor) editor;
-        ISourceViewer viewer = layoutEditor.getStructuredSourceViewer();
-
-        int caretPosBefore = updateCaret(viewer, caretBefore);
-
-        AndroidXmlCharacterMatcher matcher = new AndroidXmlCharacterMatcher();
-        IStructuredDocument document = layoutEditor.getStructuredDocument();
-
-        IRegion match = matcher.match(document, caretPosBefore);
-        assertNotNull(match);
-
-        String text = document.get();
-        final String after = stripCaret(caretAfter);
-        int index = text.indexOf(after);
-        int caretPosAfter = match.getOffset() - index;
-        String textWithCaret = after.substring(0, caretPosAfter)
-                + "^" + after.substring(caretPosAfter);
-
-        assertEquals(caretAfter, textWithCaret);
-    }
-
-    private static String stripCaret(String s) {
-        int index = s.indexOf('^');
-        assertTrue(index != -1);
-        return s.substring(0, index) + s.substring(index + 1);
-    }
-
-    private void checkGotoMatching(String caretBefore,
-            String caretAfter) throws Exception {
-        checkGotoMatching(
-                getTestDataFile(getProject(), "manifest.xml", "AndroidManifest.xml", true),
-                caretBefore, caretAfter);
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/HyperlinksTest.java b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/HyperlinksTest.java
deleted file mode 100644
index 20aae84..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/HyperlinksTest.java
+++ /dev/null
@@ -1,320 +0,0 @@
-/*
- * Copyright (C) 2010 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.editors;
-
-import static com.android.SdkConstants.FD_SOURCES;
-
-import com.android.ide.common.resources.ResourceFile;
-import com.android.ide.eclipse.adt.AdtUtils;
-import com.android.ide.eclipse.adt.internal.editors.Hyperlinks.ResourceLink;
-import com.android.ide.eclipse.adt.internal.editors.Hyperlinks.XmlResolver;
-import com.android.ide.eclipse.adt.internal.editors.layout.refactoring.AdtProjectTest;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.jdt.internal.ui.javaeditor.JavaEditor;
-import org.eclipse.jface.text.IDocument;
-import org.eclipse.jface.text.IRegion;
-import org.eclipse.jface.text.Region;
-import org.eclipse.jface.text.hyperlink.IHyperlink;
-import org.eclipse.jface.text.source.ISourceViewer;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.ide.IDE;
-import org.eclipse.ui.internal.ErrorEditorPart;
-import org.eclipse.ui.internal.browser.WebBrowserEditor;
-import org.eclipse.wst.sse.ui.StructuredTextEditor;
-import org.eclipse.wst.sse.ui.internal.StructuredTextViewer;
-import org.eclipse.wst.xml.ui.internal.tabletree.XMLMultiPageEditorPart;
-
-import java.lang.reflect.Field;
-import java.lang.reflect.Method;
-
-@SuppressWarnings({
-        "restriction", "javadoc"
-})
-public class HyperlinksTest extends AdtProjectTest {
-    @Override
-    protected boolean testCaseNeedsUniqueProject() {
-        return true;
-    }
-
-    public void testFqnRegexp() throws Exception {
-        assertTrue(Hyperlinks.isViewClassName("com.android.Foo"));
-        assertTrue(Hyperlinks.isViewClassName("com.android.pk_g.Foo_Bar1"));
-        assertTrue(Hyperlinks.isViewClassName("com.android.Foo$Inner"));
-
-        // Should we allow non-standard packages and class names?
-        // For now, we're allowing it -- see how this works out in practice.
-        //assertFalse(XmlHyperlinkResolver.isViewClassName("Foo.bar"));
-        assertTrue(Hyperlinks.isViewClassName("Foo.bar"));
-
-        assertFalse(Hyperlinks.isViewClassName("LinearLayout"));
-        assertFalse(Hyperlinks.isViewClassName("."));
-        assertFalse(Hyperlinks.isViewClassName(".F"));
-        assertFalse(Hyperlinks.isViewClassName("f."));
-        assertFalse(Hyperlinks.isViewClassName("Foo"));
-        assertFalse(Hyperlinks.isViewClassName("com.android.1Foo"));
-        assertFalse(Hyperlinks.isViewClassName("1com.Foo"));
-    }
-
-    public void testNavigate1() throws Exception {
-        // Check navigating to a local resource
-        checkXmlNavigation("navigation1.xml", "res/layout/navigation1.xml",
-                "android:text=\"@string/app^_name\"");
-    }
-
-    public void testNavigate2() throws Exception {
-        // Check navigating to a framework resource
-        checkXmlNavigation("navigation1.xml", "res/layout/navigation1.xml",
-                "marginLeft=\"@android:dimen/app_ico^n_size\"");
-    }
-
-    public void testNavigate3() throws Exception {
-        // Check navigating to a style
-        checkXmlNavigation("navigation1.xml", "res/layout/navigation1.xml",
-                "style=\"@android:style/Widget.B^utton\"");
-    }
-
-    public void testNavigate4() throws Exception {
-        // Check navigating to resource with many resolutions
-        checkXmlNavigation("navigation1.xml", "res/layout/navigation1.xml",
-                "android:text=\"@android:st^ring/ok\"");
-    }
-
-    public void testNavigate5() throws Exception {
-        // Check navigating to styles
-        checkXmlNavigation("navigationstyles.xml", "res/values/navigationstyles.xml",
-                "parent=\"android:Theme.Li^ght\">");
-    }
-
-    public void testNavigate6() throws Exception {
-        // Check navigating to a portion of a style (this should pick android:Theme, not
-        // android:Theme.Light
-        checkXmlNavigation("navigationstyles.xml", "res/values/navigationstyles.xml",
-                "parent=\"android:The^me.Light\">");
-    }
-
-    public void testNavigate7() throws Exception {
-        // Check navigating to a resource inside text content
-        checkXmlNavigation("navigationstyles.xml", "res/values/navigationstyles.xml",
-                "popupBackground\">@android:drawable/spinner_dr^opdown_background</item>");
-    }
-
-    public void testNavigate8() throws Exception {
-        // Check navigating to a resource inside text content where there is space around
-        // the URL
-        checkXmlNavigation("navigationstyles.xml", "res/values/navigationstyles.xml",
-                "colorBackground\"> @color/cust^om_theme_color </item>");
-    }
-
-    public void testNavigate9a() throws Exception {
-        // Check navigating to a an activity
-        checkXmlNavigation("manifest.xml", "AndroidManifest.xml",
-                "<activity android:name=\".Test^Activity\"");
-    }
-
-    /* Not yet implemented
-    public void testNavigate9b() throws Exception {
-        // Check navigating to a an activity - clicking on the activity element should
-        // work too
-        checkXmlNavigation("manifest.xml", "AndroidManifest.xml",
-                "<acti^vity android:name=\".TestActivity\"");
-    }
-    */
-
-    public void testNavigate10() throws Exception {
-        // Check navigating to a permission
-        checkXmlNavigation("manifest.xml", "AndroidManifest.xml",
-                "<uses-permission android:name=\"android.permission.AC^CESS_NETWORK_STATE\" />");
-    }
-
-    public void testNavigate11a() throws Exception {
-        // Check navigating to an intent
-        checkXmlNavigation("manifest.xml", "AndroidManifest.xml",
-                "<action android:name=\"android.intent.ac^tion.MAIN\" />");
-    }
-
-    public void testNavigate11g() throws Exception {
-        // Check navigating to an intent
-        checkXmlNavigation("manifest.xml", "AndroidManifest.xml",
-                "<category android:name=\"android.intent.category.LA^UNCHER\" />");
-    }
-
-    public void testNavigate12() throws Exception {
-        // Check navigating to a custom view class
-        checkXmlNavigation("navigation1.xml", "res/layout/navigation1.xml",
-                "<my.Cust^omView></my.CustomView>");
-    }
-
-    public void testNavigate13() throws Exception {
-        // Check jumping to classes pointed to by fragments
-
-        getTestDataFile(getProject(), "TestFragment.java.txt",
-                FD_SOURCES + "/" + TEST_PROJECT_PACKAGE.replace('.', '/') + "/TestFragment.java");
-        checkXmlNavigation("fragmentlayout.xml", "res/layout/fragmentlayout.xml",
-                "android:name=\"com.android.ecl^ipse.tests.TestFragment\"");
-    }
-
-    public void testNavigate14() throws Exception {
-        // Check jumping to classes pointed to by fragments
-
-        getTestDataFile(getProject(), "TestFragment.java.txt",
-                FD_SOURCES + "/" + TEST_PROJECT_PACKAGE.replace('.', '/') + "/TestFragment.java");
-        checkXmlNavigation("fragmentlayout.xml", "res/layout/fragmentlayout.xml",
-                "class=\"com.and^roid.eclipse.tests.TestFragment\"");
-    }
-
-    public void testNavigate15() throws Exception {
-        // Check navigating to a theme resource
-        checkXmlNavigation("navigation1.xml", "res/layout/navigation1.xml",
-                "?android:attr/alert^DialogStyle");
-    }
-
-    public void testNavigate16() throws Exception {
-        // Check navigating to a theme resource
-        checkXmlNavigation("navigation1.xml", "res/layout/navigation1.xml",
-                "?android:alert^DialogStyle");
-    }
-
-    // Left to test:
-    // onClick handling
-    // class attributes
-    // Test that the correct file is actually opened!
-
-    private void checkXmlNavigation(String basename, String targetPath,
-            String caretLocation) throws Exception {
-        IFile file = getTestDataFile(getProject(), basename, targetPath, true);
-
-        // Determine the offset
-        int offset = getCaretOffset(file, caretLocation);
-
-        // Open file
-        IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
-        assertNotNull(page);
-        IEditorPart editor = IDE.openEditor(page, file);
-        assertTrue(editor.getClass().getName(), editor instanceof AndroidXmlEditor);
-        AndroidXmlEditor layoutEditor = (AndroidXmlEditor) editor;
-        ISourceViewer viewer = layoutEditor.getStructuredSourceViewer();
-
-        XmlResolver resolver = new Hyperlinks.XmlResolver();
-        IHyperlink[] links = resolver.detectHyperlinks(viewer, new Region(offset, 0), true);
-        assertNotNull(links);
-
-        StringBuilder sb = new StringBuilder(1000);
-        sb.append("Go To Declaration in " + basename + " for " + caretLocation + ":\n");
-        for (IHyperlink link : links) {
-            sb.append(link.getHyperlinkText());
-            sb.append(" : ");
-            sb.append(" [");
-            IRegion region = link.getHyperlinkRegion();
-            sb.append(viewer.getDocument().get(region.getOffset(), region.getLength()));
-            sb.append("]");
-            if (link instanceof Hyperlinks.ResourceLink) {
-                Hyperlinks.ResourceLink resourceLink = (ResourceLink) link;
-                sb.append("\n    ");
-                ResourceFile resourceFile = resourceLink.getFile();
-                String desc = resourceFile.toString();
-                desc = desc.replace('\\', '/');
-                // For files in the SDK folder, strip out file prefix
-                int dataRes = desc.indexOf("data/res");
-                if (dataRes != -1) {
-                    desc = desc.substring(dataRes);
-                }
-                desc = removeSessionData(desc);
-                sb.append(desc);
-            }
-            sb.append('\n');
-        }
-
-        // Open the first link
-        IHyperlink link = links[0];
-        link.open();
-        IEditorPart newEditor = AdtUtils.getActiveEditor();
-        // Ensure that this isn't an invalid file (e.g. opening the SDK platform files
-        // with incorrect content binding could cause this)
-        assertTrue(!(newEditor instanceof ErrorEditorPart));
-
-        IDocument document = null;
-        Point selection = null;
-
-        if (newEditor instanceof AndroidXmlEditor) {
-            AndroidXmlEditor xmlEditor = (AndroidXmlEditor) newEditor;
-            document = xmlEditor.getStructuredSourceViewer().getDocument();
-            selection = xmlEditor.getStructuredSourceViewer().getSelectedRange();
-        } else if (newEditor instanceof XMLMultiPageEditorPart) {
-            XMLMultiPageEditorPart xmlEditor = (XMLMultiPageEditorPart) newEditor;
-            Field field = xmlEditor.getClass().getDeclaredField("fTextEditor");
-            field.setAccessible(true);
-            StructuredTextEditor ste = (StructuredTextEditor) field.get(newEditor);
-            if (ste == null) {
-                Method method = xmlEditor.getClass().getMethod("getTextEditor", new Class[0]);
-                ste = (StructuredTextEditor) method.invoke(newEditor, new Object[0]);
-            }
-            StructuredTextViewer textViewer = ste.getTextViewer();
-            document = textViewer.getDocument();
-            selection = textViewer.getSelectedRange();
-        } else if (newEditor instanceof WebBrowserEditor) {
-            WebBrowserEditor browser = (WebBrowserEditor) newEditor;
-            Field field = browser.getClass().getDeclaredField("initialURL");
-            field.setAccessible(true);
-            String initialUrl = (String) field.get(newEditor);
-            int index = initialUrl.indexOf("reference");
-            if (index != -1) {
-                initialUrl = initialUrl.substring(index);
-            }
-            initialUrl = initialUrl.replace('\\', '/');
-            sb.append("\n\nAfter open, a browser is shown with this URL:\n");
-            sb.append("  ");
-            sb.append(initialUrl);
-            sb.append("\n");
-        } else if (newEditor instanceof JavaEditor) {
-            JavaEditor javaEditor = (JavaEditor) newEditor;
-            document = javaEditor.getDocumentProvider().getDocument(javaEditor.getEditorInput());
-            IRegion range = javaEditor.getHighlightRange();
-            selection = new Point(range.getOffset(), range.getLength());
-        } else {
-            fail("Unhandled editor type: " + newEditor.getClass().getName());
-            return;
-        }
-
-        if (document != null && selection != null) {
-            int lineStart = document.getLineInformationOfOffset(selection.x).getOffset();
-            IRegion lineEndInfo = document.getLineInformationOfOffset(selection.x + selection.y);
-            int lineEnd = lineEndInfo.getOffset() + lineEndInfo.getLength();
-            String text = document.get(lineStart, lineEnd - lineStart);
-            int selectionStart = selection.x - lineStart;
-            int selectionEnd = selectionStart + selection.y;
-            if (selectionEnd > selectionStart) {
-                // Selection range
-                text = text.substring(0, selectionStart) + "[^" +
-                   text.substring(selectionStart, selectionEnd) + "]" +
-                   text.substring(selectionEnd);
-            } else {
-                text = text.substring(0, selectionStart) + "^" +
-                    text.substring(selectionStart);
-            }
-            text = removeSessionData(text);
-
-            sb.append("\n\nAfter open, the selected text is:\n");
-            sb.append(text);
-            sb.append("\n");
-        }
-
-        assertEqualsGolden(basename, sb.toString(), "txt");
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/formatting/EclipseXmlPrettyPrinterTest.java b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/formatting/EclipseXmlPrettyPrinterTest.java
deleted file mode 100644
index ac5fd01..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/formatting/EclipseXmlPrettyPrinterTest.java
+++ /dev/null
@@ -1,978 +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.eclipse.adt.internal.editors.formatting;
-
-import com.android.ide.common.xml.XmlFormatStyle;
-import com.android.ide.eclipse.adt.internal.editors.layout.gle2.DomUtilities;
-import com.android.ide.eclipse.adt.internal.preferences.AdtPrefs;
-
-import org.eclipse.jface.preference.PreferenceStore;
-import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
-import org.w3c.dom.Document;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-
-import junit.framework.TestCase;
-
-@SuppressWarnings({
-        "javadoc", "restriction"
-})
-public class EclipseXmlPrettyPrinterTest extends TestCase {
-    @Override
-    protected void setUp() throws Exception {
-        super.setUp();
-        PreferenceStore store = new PreferenceStore();
-        AdtPrefs.init(store);
-        AdtPrefs prefs = AdtPrefs.getPrefs();
-        prefs.initializeStoreWithDefaults(store);
-        prefs.loadValues(null);
-        EclipseXmlFormatPreferences formatPrefs = EclipseXmlFormatPreferences.create();
-        assertTrue(formatPrefs.oneAttributeOnFirstLine);
-    }
-
-    private void checkFormat(EclipseXmlFormatPreferences prefs, String baseLocation,
-            String xml,
-            String expected, String delimiter, String startNodeName,
-            boolean openTagOnly, String endNodeName) throws Exception {
-
-        IStructuredModel model = DomUtilities.createStructuredModel(xml);
-        assertNotNull(model);
-        model.setBaseLocation(baseLocation);
-        Document document = null;
-        if (model instanceof IDOMModel) {
-            IDOMModel domModel = (IDOMModel) model;
-            document = domModel.getDocument();
-        } else {
-            fail("Can't get DOM model");
-            return;
-        }
-        XmlFormatStyle style = AndroidXmlFormattingStrategy.guessStyle(model, document);
-
-        EclipseXmlPrettyPrinter printer = new EclipseXmlPrettyPrinter(prefs, style, delimiter);
-        printer.setEndWithNewline(xml.endsWith("\n"));
-
-        StringBuilder sb = new StringBuilder(1000);
-        Node startNode = document;
-        Node endNode = document;
-        if (startNodeName != null) {
-            startNode = findNode(document.getDocumentElement(), startNodeName);
-        }
-        if (endNodeName != null) {
-            endNode = findNode(document.getDocumentElement(), endNodeName);
-        }
-
-        printer.prettyPrint(-1, document, startNode, endNode, sb, false/*openTagOnly*/);
-        String formatted = sb.toString();
-        if (!expected.equals(formatted)) {
-            System.out.println(formatted);
-        }
-        assertEquals(expected, formatted);
-    }
-
-    private Node findNode(Node node, String nodeName) {
-        if (node.getNodeName().equals(nodeName)) {
-            return node;
-        }
-
-        NodeList children = node.getChildNodes();
-        for (int i = 0, n = children.getLength(); i < n; i++) {
-            Node child = children.item(i);
-            Node result = findNode(child, nodeName);
-            if (result != null) {
-                return result;
-            }
-        }
-
-        return null;
-    }
-
-    protected int getCaretOffset(String fileContent, String caretLocation) {
-        int caretDelta = caretLocation.indexOf("^"); //$NON-NLS-1$
-        assertTrue(caretLocation, caretDelta != -1);
-
-        String caretContext = caretLocation.substring(0, caretDelta)
-                + caretLocation.substring(caretDelta + 1); // +1: skip "^"
-        int caretContextIndex = fileContent.indexOf(caretContext);
-        assertTrue("Caret content " + caretContext + " not found in file",
-                caretContextIndex != -1);
-        return caretContextIndex + caretDelta;
-    }
-
-    private void checkFormat(EclipseXmlFormatPreferences prefs, String baseLocation, String xml,
-            String expected, String delimiter) throws Exception {
-        checkFormat(prefs, baseLocation, xml, expected, delimiter, null, false, null);
-    }
-
-    private void checkFormat(EclipseXmlFormatPreferences prefs, String baseLocation, String xml,
-            String expected) throws Exception {
-        checkFormat(prefs, baseLocation, xml, expected, "\n"); //$NON-NLS-1$
-    }
-    private void checkFormat(String baseLocation, String xml, String expected)
-            throws Exception {
-        EclipseXmlFormatPreferences prefs = EclipseXmlFormatPreferences.create();
-        checkFormat(prefs, baseLocation, xml, expected);
-    }
-
-    public void testLayout1() throws Exception {
-        checkFormat(
-                "res/layout-port/layout1.xml",
-                "<LinearLayout><Button></Button></LinearLayout>",
-
-                "<LinearLayout>\n" +
-                "\n" +
-                "    <Button>\n" +
-                "    </Button>\n" +
-                "\n" +
-                "</LinearLayout>");
-    }
-
-    public void testLayout2() throws Exception {
-        checkFormat(
-                "res/layout-port/layout2.xml",
-                "<LinearLayout><Button foo=\"bar\"></Button></LinearLayout>",
-
-                "<LinearLayout>\n" +
-                "\n" +
-                "    <Button foo=\"bar\" >\n" +
-                "    </Button>\n" +
-                "\n" +
-                "</LinearLayout>");
-    }
-
-    public void testLayout3() throws Exception {
-        EclipseXmlFormatPreferences prefs = EclipseXmlFormatPreferences.create();
-        prefs.oneAttributeOnFirstLine = true;
-        checkFormat(
-                prefs, "res/layout-land/layout3.xml",
-                "<LinearLayout><Button foo=\"bar\"></Button></LinearLayout>",
-
-                "<LinearLayout>\n" +
-                "\n" +
-                "    <Button foo=\"bar\" >\n" +
-                "    </Button>\n" +
-                "\n" +
-                "</LinearLayout>");
-    }
-
-    public void testClosedElements() throws Exception {
-        checkFormat(
-                "res/values/strings.xml",
-                "<resources>\n" +
-                "<item   name=\"title_container\"  type=\"id\"   />\n" +
-                "<item name=\"title_logo\" type=\"id\"/>\n" +
-                "</resources>\n",
-
-                "<resources>\n" +
-                "\n" +
-                "    <item name=\"title_container\" type=\"id\"/>\n" +
-                "    <item name=\"title_logo\" type=\"id\"/>\n" +
-                "\n" +
-                "</resources>\n");
-    }
-
-    public void testResources() throws Exception {
-        checkFormat(
-                "res/values-us/strings.xml",
-                "<resources><item name=\"foo\">Text value here </item></resources>",
-                "<resources>\n\n" +
-                "    <item name=\"foo\">Text value here </item>\n" +
-                "\n</resources>");
-    }
-
-    public void testNodeTypes() throws Exception {
-        // Ensures that a document with all kinds of node types is serialized correctly
-        checkFormat(
-                "res/layout-xlarge/layout.xml",
-                "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" +
-                "<!--\n" +
-                "/**\n" +
-                " * Licensed under the Apache License, Version 2.0 (the \"License\");\n" +
-                " */\n" +
-                "-->\n" +
-                "<!DOCTYPE metadata [\n" +
-                "<!ELEMENT metadata (category)*>\n" +
-                "<!ENTITY % ISOLat2\n" +
-                "         SYSTEM \"http://www.xml.com/iso/isolat2-xml.entities\" >\n" +
-                "]>\n" +
-                "<LinearLayout\n" +
-                "    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n" +
-                "    android:orientation=\"vertical\">\n" +
-                "<![CDATA[\n" +
-                "This is character data!\n" +
-                "<!-- This is not a comment! -->\n" +
-                "and <this is not an element>\n" +
-                "]]>         \n" +
-                "This is text: &lt; and &amp;\n" +
-                "<!-- comment 1 \"test\"... -->\n" +
-                "<!-- ... comment2 -->\n" +
-                "%ISOLat2;        \n" +
-                "<!-- \n" +
-                "Type <key>less-than</key> (&#x3C;)\n" +
-                "-->        \n" +
-                "</LinearLayout>",
-
-                "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" +
-                "<!--\n" +
-                "/**\n" +
-                " * Licensed under the Apache License, Version 2.0 (the \"License\");\n" +
-                " */\n" +
-                "-->\n" +
-                "<!DOCTYPE metadata [\n" +
-                "<!ELEMENT metadata (category)*>\n" +
-                "<!ENTITY % ISOLat2\n" +
-                "         SYSTEM \"http://www.xml.com/iso/isolat2-xml.entities\" >\n" +
-                "]>\n" +
-                "<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n" +
-                "    android:orientation=\"vertical\" >\n" +
-                "<![CDATA[\n" +
-                "This is character data!\n" +
-                "<!-- This is not a comment! -->\n" +
-                "and <this is not an element>\n" +
-                "]]>\n" +
-                "This is text: &lt; and &amp;\n" +
-                "    <!-- comment 1 \"test\"... -->\n" +
-                "    <!-- ... comment2 -->\n" +
-                "%ISOLat2;        \n" +
-                "<!-- Type <key>less-than</key> (&#x3C;) -->\n" +
-                "\n" +
-                "</LinearLayout>");
-    }
-
-    public void testWindowsDelimiters() throws Exception {
-        checkFormat(
-                EclipseXmlFormatPreferences.create(), "res/layout-xlarge/layout.xml",
-                "<LinearLayout><Button foo=\"bar\"></Button></LinearLayout>",
-
-                "<LinearLayout>\r\n" +
-                "\r\n" +
-                "    <Button foo=\"bar\" >\r\n" +
-                "    </Button>\r\n" +
-                "\r\n" +
-                "</LinearLayout>",
-                "\r\n");
-    }
-
-    public void testRemoveBlanklines() throws Exception {
-        EclipseXmlFormatPreferences prefs = EclipseXmlFormatPreferences.create();
-        prefs.removeEmptyLines = true;
-        checkFormat(
-                prefs, "res/layout-xlarge/layout.xml",
-                "<foo><bar><baz1></baz1><baz2></baz2></bar><bar2></bar2><bar3><baz12></baz12></bar3></foo>",
-
-                "<foo>\n" +
-                "    <bar>\n" +
-                "        <baz1>\n" +
-                "        </baz1>\n" +
-                "        <baz2>\n" +
-                "        </baz2>\n" +
-                "    </bar>\n" +
-                "    <bar2>\n" +
-                "    </bar2>\n" +
-                "    <bar3>\n" +
-                "        <baz12>\n" +
-                "        </baz12>\n" +
-                "    </bar3>\n" +
-                "</foo>");
-    }
-
-    public void testRange() throws Exception {
-        checkFormat(
-                EclipseXmlFormatPreferences.create(), "res/layout-xlarge/layout.xml",
-                "<LinearLayout><Button foo=\"bar\"></Button><CheckBox/></LinearLayout>",
-                "\n" +
-                "    <Button foo=\"bar\" >\n" +
-                "    </Button>\n" +
-                "\n" +
-                "    <CheckBox />\n",
-                "\n",
-                "Button", false, "CheckBox");
-    }
-
-    public void testOpenTagOnly() throws Exception {
-        checkFormat(
-                EclipseXmlFormatPreferences.create(), "res/layout-xlarge/layout.xml",
-                "<LinearLayout><Button foo=\"bar\"></Button><CheckBox/></LinearLayout>",
-                "\n" +
-                "    <Button foo=\"bar\" >\n" +
-                "    </Button>\n",
-                "\n",
-
-                "Button", true, "Button");
-    }
-
-    public void testRange2() throws Exception {
-        EclipseXmlFormatPreferences prefs = EclipseXmlFormatPreferences.create();
-        prefs.removeEmptyLines = true;
-        checkFormat(
-                prefs, "res/layout-xlarge/layout.xml",
-                "<foo><bar><baz1></baz1><baz2></baz2></bar><bar2></bar2><bar3><baz12></baz12></bar3></foo>",
-
-                "        <baz1>\n" +
-                "        </baz1>\n" +
-                "        <baz2>\n" +
-                "        </baz2>\n" +
-                "    </bar>\n" +
-                "    <bar2>\n" +
-                "    </bar2>\n" +
-                "    <bar3>\n" +
-                "        <baz12>\n" +
-                "        </baz12>\n",
-                "\n",
-                "baz1", false, "baz12");
-    }
-
-    public void testEOLcomments() throws Exception {
-        checkFormat(
-                "res/drawable-mdpi/states.xml",
-                "<selector xmlns:android=\"http://schemas.android.com/apk/res/android\">\n" +
-                "    <item android:state_pressed=\"true\"\n" +
-                "          android:color=\"#ffff0000\"/> <!-- pressed -->\n" +
-                "    <item android:state_focused=\"true\"\n" +
-                "          android:color=\"#ff0000ff\"/> <!-- focused -->\n" +
-                "    <item android:color=\"#ff000000\"/> <!-- default -->\n" +
-                "</selector>",
-                "<selector xmlns:android=\"http://schemas.android.com/apk/res/android\">\n" +
-                "\n" +
-                "    <item android:state_pressed=\"true\" android:color=\"#ffff0000\"/> <!-- pressed -->\n" +
-                "    <item android:state_focused=\"true\" android:color=\"#ff0000ff\"/> <!-- focused -->\n" +
-                "    <item android:color=\"#ff000000\"/> <!-- default -->\n" +
-                "\n" +
-                "</selector>");
-    }
-
-    public void testFormatColorList() throws Exception {
-        checkFormat(
-                "res/drawable-hdpi/states.xml",
-                "<selector xmlns:android=\"http://schemas.android.com/apk/res/android\">\n" +
-                "<item android:state_activated=\"true\" android:color=\"#FFFFFF\"/>\n" +
-                "<item android:color=\"#777777\" /> <!-- not selected -->\n" +
-                "</selector>",
-                "<selector xmlns:android=\"http://schemas.android.com/apk/res/android\">\n" +
-                "\n" +
-                "    <item android:state_activated=\"true\" android:color=\"#FFFFFF\"/>\n" +
-                "    <item android:color=\"#777777\"/> <!-- not selected -->\n" +
-                "\n" +
-                "</selector>");
-    }
-
-    public void testPreserveNewlineAfterComment() throws Exception {
-        checkFormat(
-                "res/values/dimen.xml",
-                "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" +
-                "<resources><dimen name=\"colorstrip_height\">6dip</dimen>\n" +
-                "    <!-- comment1 --><dimen name=\"title_height\">45dip</dimen>\n" +
-                "\n" +
-                "    <!-- comment2: newline above --><dimen name=\"now_playing_height\">90dip</dimen>\n" +
-                "    <dimen name=\"text_size_small\">14sp</dimen>\n" +
-                "\n" +
-                "\n" +
-                "    <!-- comment3: newline above and below -->\n" +
-                "\n" +
-                "\n" +
-                "\n" +
-                "    <dimen name=\"text_size_medium\">18sp</dimen><dimen name=\"text_size_large\">22sp</dimen>\n" +
-                "</resources>",
-                "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" +
-                "<resources>\n" +
-                "\n" +
-                "    <dimen name=\"colorstrip_height\">6dip</dimen>\n" +
-                "    <!-- comment1 -->\n" +
-                "    <dimen name=\"title_height\">45dip</dimen>\n" +
-                "\n" +
-                "    <!-- comment2: newline above -->\n" +
-                "    <dimen name=\"now_playing_height\">90dip</dimen>\n" +
-                "    <dimen name=\"text_size_small\">14sp</dimen>\n" +
-                "\n" +
-                "    <!-- comment3: newline above and below -->\n" +
-                "\n" +
-                "    <dimen name=\"text_size_medium\">18sp</dimen>\n" +
-                "    <dimen name=\"text_size_large\">22sp</dimen>\n" +
-                "\n" +
-                "</resources>");
-    }
-
-    public void testPlurals() throws Exception {
-        checkFormat(
-                "res/values-us/strings.xml",
-                "<resources xmlns:xliff=\"urn:oasis:names:tc:xliff:document:1.2\">\n" +
-                "<string name=\"toast_sync_error\">Sync error: <xliff:g id=\"error\">%1$s</xliff:g></string>\n" +
-                "<string name=\"session_subtitle\"><xliff:g id=\"time\">%1$s</xliff:g> in <xliff:g id=\"room\">%2$s</xliff:g></string>\n" +
-                "<plurals name=\"now_playing_countdown\">\n" +
-                "<item quantity=\"zero\"><xliff:g id=\"remaining_time\">%2$s</xliff:g></item>\n" +
-                "<item quantity=\"one\"><xliff:g id=\"number_of_days\">%1$s</xliff:g> day, <xliff:g id=\"remaining_time\">%2$s</xliff:g></item>\n" +
-                "<item quantity=\"other\"><xliff:g id=\"number_of_days\">%1$s</xliff:g> days, <xliff:g id=\"remaining_time\">%2$s</xliff:g></item>\n" +
-                "</plurals>\n" +
-                "</resources>",
-                "<resources xmlns:xliff=\"urn:oasis:names:tc:xliff:document:1.2\">\n" +
-                "\n" +
-                "    <string name=\"toast_sync_error\">Sync error: <xliff:g id=\"error\">%1$s</xliff:g></string>\n" +
-                "    <string name=\"session_subtitle\"><xliff:g id=\"time\">%1$s</xliff:g> in <xliff:g id=\"room\">%2$s</xliff:g></string>\n" +
-                "\n" +
-                "    <plurals name=\"now_playing_countdown\">\n" +
-                "        <item quantity=\"zero\"><xliff:g id=\"remaining_time\">%2$s</xliff:g></item>\n" +
-                "        <item quantity=\"one\"><xliff:g id=\"number_of_days\">%1$s</xliff:g> day, <xliff:g id=\"remaining_time\">%2$s</xliff:g></item>\n" +
-                "        <item quantity=\"other\"><xliff:g id=\"number_of_days\">%1$s</xliff:g> days, <xliff:g id=\"remaining_time\">%2$s</xliff:g></item>\n" +
-                "    </plurals>\n" +
-                "\n" +
-                "</resources>");
-    }
-
-    public void testMultiAttributeResource() throws Exception {
-        checkFormat(
-                "res/values-us/strings.xml",
-                "<resources><string name=\"debug_enable_debug_logging_label\" translatable=\"false\">Enable extra debug logging?</string></resources>",
-                "<resources>\n" +
-                "\n" +
-                "    <string name=\"debug_enable_debug_logging_label\" translatable=\"false\">Enable extra debug logging?</string>\n" +
-                "\n" +
-                "</resources>");
-    }
-
-    public void testMultilineCommentAlignment() throws Exception {
-        checkFormat(
-                "res/values-us/strings.xml",
-                "<resources>" +
-                "    <!-- Deprecated strings - Move the identifiers to this section, mark as DO NOT TRANSLATE,\n" +
-                "         and remove the actual text.  These will be removed in a bulk operation. -->\n" +
-                "    <!-- Do Not Translate.  Unused string. -->\n" +
-                "    <string name=\"meeting_invitation\"></string>\n" +
-                "</resources>",
-                "<resources>\n" +
-                "\n" +
-                "    <!--\n" +
-                "         Deprecated strings - Move the identifiers to this section, mark as DO NOT TRANSLATE,\n" +
-                "         and remove the actual text.  These will be removed in a bulk operation.\n" +
-                "    -->\n" +
-                "    <!-- Do Not Translate.  Unused string. -->\n" +
-                "    <string name=\"meeting_invitation\"></string>\n" +
-                "\n" +
-                "</resources>");
-    }
-
-    public void testLineCommentSpacing() throws Exception {
-        checkFormat(
-                "res/values-us/strings.xml",
-                "<resources>\n" +
-                "\n" +
-                "    <dimen name=\"colorstrip_height\">6dip</dimen>\n" +
-                "    <!-- comment1 -->\n" +
-                "    <dimen name=\"title_height\">45dip</dimen>\n" +
-                "    <!-- comment2: no newlines -->\n" +
-                "    <dimen name=\"now_playing_height\">90dip</dimen>\n" +
-                "    <dimen name=\"text_size_small\">14sp</dimen>\n" +
-                "\n" +
-                "    <!-- comment3: newline above and below -->\n" +
-                "\n" +
-                "    <dimen name=\"text_size_medium\">18sp</dimen>\n" +
-                "    <dimen name=\"text_size_large\">22sp</dimen>\n" +
-                "\n" +
-                "</resources>",
-
-                "<resources>\n" +
-                "\n" +
-                "    <dimen name=\"colorstrip_height\">6dip</dimen>\n" +
-                "    <!-- comment1 -->\n" +
-                "    <dimen name=\"title_height\">45dip</dimen>\n" +
-                "    <!-- comment2: no newlines -->\n" +
-                "    <dimen name=\"now_playing_height\">90dip</dimen>\n" +
-                "    <dimen name=\"text_size_small\">14sp</dimen>\n" +
-                "\n" +
-                "    <!-- comment3: newline above and below -->\n" +
-                "\n" +
-                "    <dimen name=\"text_size_medium\">18sp</dimen>\n" +
-                "    <dimen name=\"text_size_large\">22sp</dimen>\n" +
-                "\n" +
-                "</resources>");
-    }
-
-    public void testCommentHandling() throws Exception {
-        checkFormat(
-                EclipseXmlFormatPreferences.create(), "res/layout/layout1.xml",
-                "<foo >\n" +
-                "\n" +
-                "    <!-- abc\n" +
-                "         def\n" +
-                "         ghi -->\n" +
-                "\n" +
-                "    <!-- abc\n" +
-                "    def\n" +
-                "    ghi -->\n" +
-                "    \n" +
-                "<!-- abc\n" +
-                "def\n" +
-                "ghi -->\n" +
-                "\n" +
-                "</foo>",
-
-                "<foo>\n" +
-                "\n" +
-                "    <!--\n" +
-                "         abc\n" +
-                "         def\n" +
-                "         ghi\n" +
-                "    -->\n" +
-                "\n" +
-                "\n" +
-                "    <!--\n" +
-                "    abc\n" +
-                "    def\n" +
-                "    ghi\n" +
-                "    -->\n" +
-                "\n" +
-                "\n" +
-                "    <!--\n" +
-                "abc\n" +
-                "def\n" +
-                "ghi\n" +
-                "    -->\n" +
-                "\n" +
-                "</foo>");
-    }
-
-    public void testCommentHandling2() throws Exception {
-        checkFormat(
-                EclipseXmlFormatPreferences.create(), "res/layout-xlarge/layout.xml",
-                "<foo >\n" +
-                "    <!-- multi -->\n" +
-                "\n" +
-                "    <bar />\n" +
-                "</foo>",
-
-                "<foo>\n" +
-                "\n" +
-                "    <!-- multi -->\n" +
-                "\n" +
-                "    <bar />\n" +
-                "\n" +
-                "</foo>");
-    }
-
-    public void testMenus1() throws Exception {
-        checkFormat(
-                EclipseXmlFormatPreferences.create(), "res/menu/menu1.xml",
-                // http://code.google.com/p/android/issues/detail?id=21383
-                "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" +
-                "<menu xmlns:android=\"http://schemas.android.com/apk/res/android\" >\n" +
-                "\n" +
-                "    <item\n" +
-                "        android:id=\"@+id/menu_debug\"\n" +
-                "        android:icon=\"@android:drawable/ic_menu_more\"\n" +
-                "        android:showAsAction=\"ifRoom|withText\"\n" +
-                "        android:title=\"@string/menu_debug\">\n" +
-                "    \n" +
-                "        <menu>\n" +
-                "                <item\n" +
-                "                    android:id=\"@+id/menu_debug_clearCache_memory\"\n" +
-                "                    android:icon=\"@android:drawable/ic_menu_delete\"\n" +
-                "                    android:showAsAction=\"ifRoom|withText\"\n" +
-                "                    android:title=\"@string/menu_debug_clearCache_memory\"/>\n" +
-                "    \n" +
-                "                <item\n" +
-                "                    android:id=\"@+id/menu_debug_clearCache_file\"\n" +
-                "                    android:icon=\"@android:drawable/ic_menu_delete\"\n" +
-                "                    android:showAsAction=\"ifRoom|withText\"\n" +
-                "                    android:title=\"@string/menu_debug_clearCache_file\"/>\n" +
-                "        </menu>\n" +
-                "    </item>\n" +
-                "</menu>",
-
-                "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" +
-                "<menu xmlns:android=\"http://schemas.android.com/apk/res/android\" >\n" +
-                "\n" +
-                "    <item\n" +
-                "        android:id=\"@+id/menu_debug\"\n" +
-                "        android:icon=\"@android:drawable/ic_menu_more\"\n" +
-                "        android:showAsAction=\"ifRoom|withText\"\n" +
-                "        android:title=\"@string/menu_debug\">\n" +
-                "        <menu>\n" +
-                "            <item\n" +
-                "                android:id=\"@+id/menu_debug_clearCache_memory\"\n" +
-                "                android:icon=\"@android:drawable/ic_menu_delete\"\n" +
-                "                android:showAsAction=\"ifRoom|withText\"\n" +
-                "                android:title=\"@string/menu_debug_clearCache_memory\"/>\n" +
-                "            <item\n" +
-                "                android:id=\"@+id/menu_debug_clearCache_file\"\n" +
-                "                android:icon=\"@android:drawable/ic_menu_delete\"\n" +
-                "                android:showAsAction=\"ifRoom|withText\"\n" +
-                "                android:title=\"@string/menu_debug_clearCache_file\"/>\n" +
-                "        </menu>\n" +
-                "    </item>\n" +
-                "\n" +
-                "</menu>");
-    }
-
-    public void testMenus2() throws Exception {
-        EclipseXmlFormatPreferences prefs = EclipseXmlFormatPreferences.create();
-        prefs.removeEmptyLines = true;
-        checkFormat(
-                prefs, "res/drawable-hdpi/layerlist.xml",
-                // http://code.google.com/p/android/issues/detail?id=21346
-                "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" +
-                "<layer-list xmlns:android=\"http://schemas.android.com/apk/res/android\">\n" +
-                "  <item>\n" +
-                "    <shape android:shape=\"rectangle\">\n" +
-                "      <stroke\n" +
-                "        android:width=\"1dip\"\n" +
-                "        android:color=\"@color/line_separator\"/>\n" +
-                "      <solid android:color=\"@color/event_header_background\"/>\n" +
-                "    </shape>\n" +
-                "  </item>\n" +
-                "  <item\n" +
-                "    android:bottom=\"1dip\"\n" +
-                "    android:top=\"1dip\">\n" +
-                "    <shape android:shape=\"rectangle\">\n" +
-                "      <stroke\n" +
-                "        android:width=\"1dip\"\n" +
-                "        android:color=\"@color/event_header_background\"/>\n" +
-                "      <solid android:color=\"@color/transparent\"/>\n" +
-                "    </shape>\n" +
-                "  </item>\n" +
-                "</layer-list>",
-
-                "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" +
-                "<layer-list xmlns:android=\"http://schemas.android.com/apk/res/android\" >\n" +
-                "    <item>\n" +
-                "        <shape android:shape=\"rectangle\" >\n" +
-                "            <stroke\n" +
-                "                android:width=\"1dip\"\n" +
-                "                android:color=\"@color/line_separator\" />\n" +
-                "            <solid android:color=\"@color/event_header_background\" />\n" +
-                "        </shape>\n" +
-                "    </item>\n" +
-                "    <item\n" +
-                "        android:bottom=\"1dip\"\n" +
-                "        android:top=\"1dip\">\n" +
-                "        <shape android:shape=\"rectangle\" >\n" +
-                "            <stroke\n" +
-                "                android:width=\"1dip\"\n" +
-                "                android:color=\"@color/event_header_background\" />\n" +
-                "            <solid android:color=\"@color/transparent\" />\n" +
-                "        </shape>\n" +
-                "    </item>\n" +
-                "</layer-list>");
-    }
-
-    public void testMenus3() throws Exception {
-        checkFormat(
-                EclipseXmlFormatPreferences.create(), "res/menu/menu1.xml",
-                // http://code.google.com/p/android/issues/detail?id=21227
-                "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" +
-                "<menu xmlns:android=\"http://schemas.android.com/apk/res/android\" >\n" +
-                "\n" +
-                "    <item\n" +
-                "        android:icon=\"@android:drawable/ic_menu_more\"\n" +
-                "        android:title=\"@string/account_list_menu_more\">\n" +
-                "        <menu>\n" +
-                "            <item\n" +
-                "                android:id=\"@+id/account_list_menu_backup_restore\"\n" +
-                "                android:icon=\"@android:drawable/ic_menu_save\"\n" +
-                "                android:title=\"@string/account_list_menu_backup_restore\"/>\n" +
-                "        </menu>\n" +
-                "    </item>\n" +
-                "\n" +
-                "</menu>",
-
-                "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" +
-                "<menu xmlns:android=\"http://schemas.android.com/apk/res/android\" >\n" +
-                "\n" +
-                "    <item\n" +
-                "        android:icon=\"@android:drawable/ic_menu_more\"\n" +
-                "        android:title=\"@string/account_list_menu_more\">\n" +
-                "        <menu>\n" +
-                "            <item\n" +
-                "                android:id=\"@+id/account_list_menu_backup_restore\"\n" +
-                "                android:icon=\"@android:drawable/ic_menu_save\"\n" +
-                "                android:title=\"@string/account_list_menu_backup_restore\"/>\n" +
-                "        </menu>\n" +
-                "    </item>\n" +
-                "\n" +
-                "</menu>");
-
-    }
-
-    public void testColors1() throws Exception {
-        checkFormat(
-                EclipseXmlFormatPreferences.create(), "res/values/colors.xml",
-                "<resources>\n" +
-                "  <color name=\"enrollment_error\">#99e21f14</color>\n" +
-                "\n" +
-                "  <color name=\"service_starting_up\">#99000000</color>\n" +
-                "</resources>",
-
-                "<resources>\n" +
-                "\n" +
-                "    <color name=\"enrollment_error\">#99e21f14</color>\n" +
-                "    <color name=\"service_starting_up\">#99000000</color>\n" +
-                "\n" +
-                "</resources>");
-    }
-
-    public void testEclipseFormatStyle1() throws Exception {
-        EclipseXmlFormatPreferences prefs = new EclipseXmlFormatPreferences() {
-            @Override
-            public String getOneIndentUnit() {
-                return "\t";
-            }
-
-            @Override
-            public int getTabWidth() {
-                return 8;
-            }
-        };
-        checkFormat(
-                prefs, "res/values/colors.xml",
-                "<resources>\n" +
-                "  <color name=\"enrollment_error\">#99e21f14</color>\n" +
-                "\n" +
-                "  <color name=\"service_starting_up\">#99000000</color>\n" +
-                "</resources>",
-
-                "<resources>\n" +
-                "\n" +
-                "\t<color name=\"enrollment_error\">#99e21f14</color>\n" +
-                "\t<color name=\"service_starting_up\">#99000000</color>\n" +
-                "\n" +
-                "</resources>");
-    }
-
-    public void testEclipseFormatStyle2() throws Exception {
-        EclipseXmlFormatPreferences prefs = new EclipseXmlFormatPreferences() {
-            @Override
-            public String getOneIndentUnit() {
-                return "  ";
-            }
-
-            @Override
-            public int getTabWidth() {
-                return 2;
-            }
-        };
-        prefs.useEclipseIndent = true;
-        checkFormat(
-                prefs, "res/values/colors.xml",
-                "<resources>\n" +
-                "  <color name=\"enrollment_error\">#99e21f14</color>\n" +
-                "\n" +
-                "  <color name=\"service_starting_up\">#99000000</color>\n" +
-                "</resources>",
-
-                "<resources>\n" +
-                "\n" +
-                "  <color name=\"enrollment_error\">#99e21f14</color>\n" +
-                "  <color name=\"service_starting_up\">#99000000</color>\n" +
-                "\n" +
-                "</resources>");
-    }
-
-    public void testNameSorting() throws Exception {
-        checkFormat(
-                "res/values/dimen.xml",
-                "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" +
-                "<resources>\n" +
-                "    <attr format=\"integer\" name=\"no\" />\n" +
-                "</resources>",
-
-                "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" +
-                "<resources>\n" +
-                "\n" +
-                "    <attr name=\"no\" format=\"integer\" />\n" +
-                "\n" +
-                "</resources>");
-    }
-
-    public void testStableText() throws Exception {
-        checkFormat(
-                "res/layout/stable.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=\"match_parent\"\n" +
-                "    android:orientation=\"vertical\">\n" +
-                "    Hello World\n" +
-                "\n" +
-                "</LinearLayout>",
-
-                "<?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=\"match_parent\"\n" +
-                "    android:orientation=\"vertical\" >\n" +
-                "    Hello World\n" +
-                "\n" +
-                "</LinearLayout>");
-    }
-
-    public void testResources1() throws Exception {
-        checkFormat(
-                "res/values/strings.xml",
-                "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" +
-                "<resources>\n" +
-                "\n" +
-                "        <string name=\"test_string\">a\n" +
-                "                </string>\n" +
-                "\n" +
-                "</resources>",
-
-                "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" +
-                "<resources>\n" +
-                "\n" +
-                "    <string name=\"test_string\">a</string>\n" +
-                "\n" +
-                "</resources>");
-    }
-
-    public void testMarkup() throws Exception {
-        checkFormat(
-                "res/values/strings.xml",
-                "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" +
-                "<resources>\n" +
-                "\n" +
-                "<string name=\"welcome\">Welcome to <b>Android</b>!</string>" +
-                "<string name=\"glob_settings_top_text\"><b>To install a 24 Clock Widget, " +
-                "please <i>long press</i> in Home Screen.</b> Configure the Global Settings " +
-                "here.</string>" +
-                "" +
-                "\n" +
-                "</resources>",
-
-                "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" +
-                "<resources>\n" +
-                "\n" +
-                "    <string name=\"welcome\">Welcome to <b>Android</b>!</string>\n" +
-                "    <string name=\"glob_settings_top_text\"><b>To install a 24 Clock Widget, " +
-                "please <i>long press</i> in Home Screen.</b> Configure the Global Settings " +
-                "here.</string>\n" +
-                "\n" +
-                "</resources>");
-    }
-
-    public void testPreserveEntities() throws Exception {
-        // Ensure that entities such as &gt; in the input string are preserved in the output
-        // format
-        checkFormat(
-                "res/values/strings.xml",
-                "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" +
-                "<resources><string name=\"untitled\">&lt;untitled2></string>\n" +
-                "<string name=\"untitled2\">&lt;untitled2&gt;</string>\n" +
-                "<string name=\"untitled3\">&apos;untitled3&quot;</string></resources>\n",
-
-                "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" +
-                "<resources>\n" +
-                "\n" +
-                "    <string name=\"untitled\">&lt;untitled2></string>\n" +
-                "    <string name=\"untitled2\">&lt;untitled2&gt;</string>\n" +
-                "    <string name=\"untitled3\">&apos;untitled3&quot;</string>\n" +
-                "\n" +
-                "</resources>\n");
-    }
-
-    public void testCData1() throws Exception {
-        checkFormat(
-                "res/values/strings.xml",
-                "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" +
-                "<resources>\n" +
-                "    <string name=\"foo\"><![CDATA[bar]]></string>\n" +
-                "</resources>",
-
-                "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" +
-                "<resources>\n" +
-                "\n" +
-                "    <string name=\"foo\"><![CDATA[bar]]></string>\n" +
-                "\n" +
-                "</resources>");
-    }
-
-    public void testCData2() throws Exception {
-        checkFormat(
-                "res/values/strings.xml",
-                "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" +
-                "<resources>\n" +
-                "    <string name=\"foo1\"><![CDATA[bar1\n" +
-                "bar2\n" +
-                "bar3]]></string>\n" +
-                "    <string name=\"foo2\"><![CDATA[bar]]></string>\n" +
-                "</resources>",
-
-                "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" +
-                "<resources>\n" +
-                "\n" +
-                "    <string name=\"foo1\">\n" +
-                "<![CDATA[bar1\n" +
-                "bar2\n" +
-                "bar3]]>\n" +
-                "    </string>\n" +
-                "    <string name=\"foo2\"><![CDATA[bar]]></string>\n" +
-                "\n" +
-                "</resources>");
-    }
-
-    public void testComplexString() throws Exception {
-        checkFormat(
-                "res/values/strings.xml",
-                "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" +
-                "<resources>\n" +
-                "<string name=\"progress_completed_export_all\">The database has " +
-                "<b>successfully</b> been exported into: <br /><br /><font size=\"14\">" +
-                "\\\"<i>%s</i>\\\"</font></string>" +
-                "</resources>",
-
-                "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" +
-                "<resources>\n" +
-                "\n" +
-                "    <string name=\"progress_completed_export_all\">The database has " +
-                "<b>successfully</b> been exported into: <br /><br /><font size=\"14\">" +
-                "\\\"<i>%s</i>\\\"</font></string>\n" +
-                "\n" +
-                "</resources>");
-    }
-
-    public void test52887() throws Exception {
-        // https://code.google.com/p/android/issues/detail?id=52887
-        checkFormat(
-                "res/layout/relative.xml",
-
-                "<!--Comment-->\n" +
-                "<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n" +
-                "  android:layout_width=\"match_parent\"\n" +
-                "  android:layout_height=\"match_parent\"/>\n",
-
-                "<!-- Comment -->\n" +
-                "<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n" +
-                "    android:layout_width=\"match_parent\"\n" +
-                "    android:layout_height=\"match_parent\" />\n");
-    }
-
-    public void testPreserveLastNewline() throws Exception {
-        checkFormat(
-                "res/values/strings.xml",
-                "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" +
-                "<resources>\n" +
-                "<string name=\"progress_completed_export_all\">The database has " +
-                "<b>successfully</b> been exported into: <br /><br /><font size=\"14\">" +
-                "\\\"<i>%s</i>\\\"</font></string>" +
-                "</resources>\n",
-
-                "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" +
-                "<resources>\n" +
-                "\n" +
-                "    <string name=\"progress_completed_export_all\">The database has " +
-                "<b>successfully</b> been exported into: <br /><br /><font size=\"14\">" +
-                "\\\"<i>%s</i>\\\"</font></string>\n" +
-                "\n" +
-                "</resources>\n");
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/LayoutMetadataTest.java b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/LayoutMetadataTest.java
deleted file mode 100644
index c71064e..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/LayoutMetadataTest.java
+++ /dev/null
@@ -1,109 +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.eclipse.adt.internal.editors.layout.gle2;
-
-import static com.android.SdkConstants.ATTR_ID;
-import static com.android.SdkConstants.ID_PREFIX;
-import static com.android.SdkConstants.NEW_ID_PREFIX;
-import static com.android.SdkConstants.TOOLS_PREFIX;
-import static com.android.SdkConstants.TOOLS_URI;
-
-import com.android.ide.common.layout.BaseLayoutRule;
-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.layout.refactoring.AdtProjectTest;
-import com.android.ide.eclipse.adt.internal.editors.uimodel.UiElementNode;
-import com.android.utils.Pair;
-import com.android.utils.XmlUtils;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.jface.text.IDocument;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.wst.sse.core.internal.provisional.IndexedRegion;
-import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-
-/**
- *
- */
-@SuppressWarnings({"restriction", "javadoc", "deprecation"}) // XML DOM model
-public class LayoutMetadataTest extends AdtProjectTest {
-
-    public void testMetadata1() throws Exception {
-        Pair<IDocument, UiElementNode> pair = getNode("metadata.xml", "listView1");
-        UiElementNode uiNode = pair.getSecond();
-        Node node = uiNode.getXmlNode();
-
-        assertNull(LayoutMetadata.getProperty(node, "foo"));
-
-        Element element = (Element) node;
-        String prefix = XmlUtils.lookupNamespacePrefix(element, TOOLS_URI, null, false);
-        if (prefix == null) {
-            // Add in new prefix...
-            prefix = XmlUtils.lookupNamespacePrefix(element,
-                    TOOLS_URI, TOOLS_PREFIX, true);
-        }
-        element.setAttribute(prefix + ':' + "foo", "bar");
-    }
-
-    // ==== Test utilities ====
-
-    private static String getText(IDocument document, Node node) throws Exception {
-        IndexedRegion region = (IndexedRegion) node;
-        // This often returns the wrong value:
-        //int length = region.getLength();
-        int length = region.getEndOffset() - region.getStartOffset();
-        return document.get(region.getStartOffset(), length);
-    }
-
-    private Pair<IDocument, UiElementNode> getNode(String filename, String targetId)
-            throws Exception, PartInitException {
-        IFile file = getLayoutFile(getProject(), filename);
-        AdtPlugin.openFile(file, null);
-        IEditorPart newEditor = AdtUtils.getActiveEditor();
-        assertTrue(newEditor instanceof AndroidXmlEditor);
-        AndroidXmlEditor xmlEditor = (AndroidXmlEditor) newEditor;
-        IStructuredDocument document = xmlEditor.getStructuredDocument();
-        UiElementNode root = xmlEditor.getUiRootNode();
-        assertNotNull(root);
-        UiElementNode node = findById(root, targetId);
-        assertNotNull(node);
-        Pair<IDocument, UiElementNode> pair = Pair.<IDocument, UiElementNode>of(document, node);
-        return pair;
-    }
-
-    private static UiElementNode findById(UiElementNode node, String targetId) {
-        assertFalse(targetId.startsWith(NEW_ID_PREFIX));
-        assertFalse(targetId.startsWith(ID_PREFIX));
-
-        String id = node.getAttributeValue(ATTR_ID);
-        if (id != null && targetId.equals(BaseLayoutRule.stripIdPrefix(id))) {
-            return node;
-        }
-
-        for (UiElementNode child : node.getUiChildren()) {
-            UiElementNode result = findById(child, targetId);
-            if (result != null) {
-                return result;
-            }
-        }
-
-        return null;
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/AdtProjectTest.java b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/AdtProjectTest.java
deleted file mode 100644
index 9c48ccd..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/AdtProjectTest.java
+++ /dev/null
@@ -1,495 +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.eclipse.adt.internal.editors.layout.refactoring;
-
-import static com.android.SdkConstants.FD_RES;
-import static com.android.SdkConstants.FD_RES_LAYOUT;
-import static com.android.SdkConstants.FD_RES_VALUES;
-
-import com.android.ide.common.sdk.LoadStatus;
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.ide.eclipse.adt.AdtUtils;
-import com.android.ide.eclipse.adt.internal.editors.common.CommonXmlEditor;
-import com.android.ide.eclipse.adt.internal.editors.descriptors.AttributeDescriptor;
-import com.android.ide.eclipse.adt.internal.editors.descriptors.ElementDescriptor;
-import com.android.ide.eclipse.adt.internal.editors.layout.LayoutEditorDelegate;
-import com.android.ide.eclipse.adt.internal.editors.layout.descriptors.LayoutDescriptors;
-import com.android.ide.eclipse.adt.internal.editors.layout.descriptors.ViewElementDescriptor;
-import com.android.ide.eclipse.adt.internal.editors.layout.uimodel.UiViewElementNode;
-import com.android.ide.eclipse.adt.internal.editors.uimodel.UiDocumentNode;
-import com.android.ide.eclipse.adt.internal.preferences.AdtPrefs;
-import com.android.ide.eclipse.adt.internal.project.BaseProjectHelper;
-import com.android.ide.eclipse.adt.internal.sdk.AndroidTargetData;
-import com.android.ide.eclipse.adt.internal.sdk.Sdk;
-import com.android.ide.eclipse.adt.internal.wizards.newproject.NewProjectCreator;
-import com.android.ide.eclipse.adt.internal.wizards.newproject.NewProjectWizardState;
-import com.android.ide.eclipse.adt.internal.wizards.newproject.NewProjectWizardState.Mode;
-import com.android.ide.eclipse.tests.SdkLoadingTestCase;
-import com.android.sdklib.IAndroidTarget;
-
-import org.eclipse.core.resources.IContainer;
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IFolder;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jface.operation.IRunnableContext;
-import org.eclipse.jface.operation.IRunnableWithProgress;
-import org.eclipse.jface.text.source.ISourceViewer;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.wst.sse.core.StructuredModelManager;
-import org.eclipse.wst.sse.core.internal.provisional.IModelManager;
-import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
-import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;
-
-import java.io.ByteArrayInputStream;
-import java.io.File;
-import java.io.InputStream;
-import java.lang.reflect.InvocationTargetException;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-@SuppressWarnings({"restriction", "javadoc"})
-public abstract class AdtProjectTest extends SdkLoadingTestCase {
-    private static final int TARGET_API_LEVEL = 16;
-    public static final String TEST_PROJECT_PACKAGE = "com.android.eclipse.tests"; //$NON-NLS-1$
-    private static final long TESTS_START_TIME = System.currentTimeMillis();
-    private static final String PROJECTNAME_PREFIX = "testproject-";
-
-    /**
-     * We don't stash the project used by each test case as a field such that test cases
-     * can share a single project instance (which is typically much faster).
-     * However, see {@link #getProjectName()} for exceptions to this sharing scheme.
-     */
-    private static Map<String, IProject> sProjectMap = new HashMap<String, IProject>();
-
-    @Override
-    protected String getTestDataRelPath() {
-        return "eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/"
-                + "internal/editors/layout/refactoring/testdata";
-    }
-
-    @Override
-    protected InputStream getTestResource(String relativePath, boolean expectExists) {
-        String path = "testdata" + File.separator + relativePath; //$NON-NLS-1$
-        InputStream stream =
-            AdtProjectTest.class.getResourceAsStream(path);
-        if (!expectExists && stream == null) {
-            return null;
-        }
-        return stream;
-    }
-
-    @Override
-    protected void setUp() throws Exception {
-        super.setUp();
-
-        // Prevent preview icon computation during plugin test to make test faster
-        if (AdtPlugin.getDefault() == null) {
-            fail("This test must be run as an Eclipse plugin test, not a plain JUnit test!");
-        }
-        AdtPrefs.getPrefs().setPaletteModes("ICON_TEXT"); //$NON-NLS-1$
-
-        getProject();
-
-        Sdk current = Sdk.getCurrent();
-        assertNotNull(current);
-        LoadStatus sdkStatus = AdtPlugin.getDefault().getSdkLoadStatus();
-        assertSame(LoadStatus.LOADED, sdkStatus);
-        IAndroidTarget target = current.getTarget(getProject());
-        IJavaProject javaProject = BaseProjectHelper.getJavaProject(getProject());
-        assertNotNull(javaProject);
-        int iterations = 0;
-        while (true) {
-            if (iterations == 100) {
-                fail("Couldn't load target; ran out of time");
-            }
-            LoadStatus status = current.checkAndLoadTargetData(target, javaProject);
-            if (status == LoadStatus.FAILED) {
-                fail("Couldn't load target " + target);
-            }
-            if (status != LoadStatus.LOADING) {
-                break;
-            }
-            Thread.sleep(250);
-            iterations++;
-        }
-        AndroidTargetData targetData = current.getTargetData(target);
-        assertNotNull(targetData);
-        LayoutDescriptors layoutDescriptors = targetData.getLayoutDescriptors();
-        assertNotNull(layoutDescriptors);
-        List<ViewElementDescriptor> viewDescriptors = layoutDescriptors.getViewDescriptors();
-        assertNotNull(viewDescriptors);
-        assertTrue(viewDescriptors.size() > 0);
-        List<ViewElementDescriptor> layoutParamDescriptors =
-                layoutDescriptors.getLayoutDescriptors();
-        assertNotNull(layoutParamDescriptors);
-        assertTrue(layoutParamDescriptors.size() > 0);
-    }
-
-    /** Set to true if the subclass test case should use a per-instance project rather
-     * than a shared project. This is needed by projects which modify the project in such
-     * a way that it affects what other tests see (for example, the quickfix resource creation
-     * tests will add in new resources, which the code completion tests will then list as
-     * possible matches if the code completion test is run after the quickfix test.)
-     * @return true to create a per-instance project instead of the default shared project
-     */
-    protected boolean testCaseNeedsUniqueProject() {
-        return false;
-    }
-
-    protected boolean testNeedsUniqueProject() {
-        return false;
-    }
-
-    @Override
-    protected boolean validateSdk(IAndroidTarget target) {
-        // Not quite working yet. When enabled will make tests run faster.
-        //if (target.getVersion().getApiLevel() < TARGET_API_LEVEL) {
-        //    return false;
-        //}
-
-        return true;
-    }
-
-    /** Returns a name to use for the project used in this test. Subclasses do not need to
-     * override this if they can share a project with others - which is the case if they do
-     * not modify the project in a way that does not affect other tests. For example
-     * the resource quickfix test will create new resources which affect what shows up
-     * in the code completion results, so the quickfix tests will override this method
-     * to produce a unique project for its own tests.
-     */
-    private String getProjectName() {
-        if (testNeedsUniqueProject()) {
-            return PROJECTNAME_PREFIX + getClass().getSimpleName() + "-" + getName();
-        } else if (testCaseNeedsUniqueProject()) {
-            return PROJECTNAME_PREFIX + getClass().getSimpleName();
-        } else {
-            return PROJECTNAME_PREFIX + TESTS_START_TIME;
-        }
-    }
-
-    protected IProject getProject() {
-        String projectName = getProjectName();
-        IProject project = sProjectMap.get(projectName);
-        if (project == null) {
-            project = createProject(projectName);
-            assertNotNull(project);
-            sProjectMap.put(projectName, project);
-        }
-        if (!testCaseNeedsUniqueProject() && !testNeedsUniqueProject()) {
-            addCleanupDir(AdtUtils.getAbsolutePath(project).toFile());
-        }
-        addCleanupDir(project.getFullPath().toFile());
-        return project;
-    }
-
-    protected IFile getTestDataFile(IProject project, String name) throws Exception {
-        return getTestDataFile(project, name, name);
-    }
-
-    protected IFile getLayoutFile(IProject project, String name) throws Exception {
-        return getTestDataFile(project, name, FD_RES + "/" + FD_RES_LAYOUT + "/" + name);
-    }
-
-    protected IFile getValueFile(IProject project, String name) throws Exception {
-        return getTestDataFile(project, name, FD_RES + "/" + FD_RES_VALUES + "/" + name);
-    }
-
-    protected IFile getTestDataFile(IProject project, String sourceName,
-            String destPath) throws Exception {
-        return getTestDataFile(project, sourceName, destPath, false);
-    }
-
-    protected IFile getTestDataFile(IProject project, String sourceName,
-            String destPath, boolean overwrite) throws Exception {
-        String[] split = destPath.split("/"); //$NON-NLS-1$
-        IContainer parent;
-        String name;
-        if (split.length == 1) {
-            parent = project;
-            name = destPath;
-        } else {
-            IFolder folder = project.getFolder(split[0]);
-            NullProgressMonitor monitor = new NullProgressMonitor();
-            if (!folder.exists()) {
-                folder.create(true /* force */, true /* local */, monitor);
-            }
-            for (int i = 1, n = split.length; i < n -1; i++) {
-                IFolder subFolder = folder.getFolder(split[i]);
-                if (!subFolder.exists()) {
-                    subFolder.create(true /* force */, true /* local */, monitor);
-                }
-                folder = subFolder;
-            }
-            name = split[split.length - 1];
-            parent = folder;
-        }
-        IFile file = parent.getFile(new Path(name));
-        if (overwrite && file.exists()) {
-            String currentContents = AdtPlugin.readFile(file);
-            String newContents = readTestFile(sourceName, true);
-            if (currentContents == null || !currentContents.equals(newContents)) {
-                file.delete(true, new NullProgressMonitor());
-            } else {
-                return file;
-            }
-        }
-        if (!file.exists()) {
-            String xml = readTestFile(sourceName, true);
-            InputStream bstream = new ByteArrayInputStream(xml.getBytes("UTF-8")); //$NON-NLS-1$
-            NullProgressMonitor monitor = new NullProgressMonitor();
-            file.create(bstream, false /* force */, monitor);
-        }
-
-        return file;
-    }
-
-    protected IProject createProject(String name) {
-        IAndroidTarget target = null;
-
-        IAndroidTarget[] targets = getSdk().getTargets();
-        for (IAndroidTarget t : targets) {
-            if (!t.isPlatform()) {
-                continue;
-            }
-            if (t.getVersion().getApiLevel() >= TARGET_API_LEVEL) {
-                target = t;
-                break;
-            }
-        }
-        assertNotNull(target);
-
-        IRunnableContext context = new IRunnableContext() {
-            @Override
-            public void run(boolean fork, boolean cancelable, IRunnableWithProgress runnable)
-                    throws InvocationTargetException, InterruptedException {
-                runnable.run(new NullProgressMonitor());
-            }
-        };
-        NewProjectWizardState state = new NewProjectWizardState(Mode.ANY);
-        state.projectName = name;
-        state.target = target;
-        state.packageName = TEST_PROJECT_PACKAGE;
-        state.activityName = name;
-        state.applicationName = name;
-        state.createActivity = false;
-        state.useDefaultLocation = true;
-        if (getMinSdk() != -1) {
-            state.minSdk = Integer.toString(getMinSdk());
-        }
-
-        NewProjectCreator creator = new NewProjectCreator(state, context);
-        creator.createAndroidProjects();
-        return validateProjectExists(name);
-    }
-
-    protected int getMinSdk() {
-        return -1;
-    }
-
-    public void createTestProject() {
-        IAndroidTarget target = null;
-
-        IAndroidTarget[] targets = getSdk().getTargets();
-        for (IAndroidTarget t : targets) {
-            if (t.getVersion().getApiLevel() >= TARGET_API_LEVEL) {
-                target = t;
-                break;
-            }
-        }
-        assertNotNull(target);
-    }
-
-    protected static IProject validateProjectExists(String name) {
-        IProject iproject = getProject(name);
-        assertTrue(String.format("%s project not created", name), iproject.exists());
-        assertTrue(String.format("%s project not opened", name), iproject.isOpen());
-        return iproject;
-    }
-
-    private static IProject getProject(String name) {
-        IProject iproject = ResourcesPlugin.getWorkspace().getRoot().getProject(name);
-        return iproject;
-    }
-
-    protected int getCaretOffset(IFile file, String caretLocation) {
-        assertTrue(caretLocation, caretLocation.contains("^"));
-
-        String fileContent = AdtPlugin.readFile(file);
-        return getCaretOffset(fileContent, caretLocation);
-    }
-
-    /**
-     * If the given caret location string contains a selection range, select that range in
-     * the given viewer
-     *
-     * @param viewer the viewer to contain the selection
-     * @param caretLocation the location string
-     */
-    protected int updateCaret(ISourceViewer viewer, String caretLocation) {
-        assertTrue(caretLocation, caretLocation.contains("^")); //$NON-NLS-1$
-
-        int caretDelta = caretLocation.indexOf("^"); //$NON-NLS-1$
-        assertTrue(caretLocation, caretDelta != -1);
-        String text = viewer.getTextWidget().getText();
-
-        int length = 0;
-
-        // String around caret/range without the range and caret marker characters
-        String caretContext;
-
-        if (caretLocation.contains("[^")) { //$NON-NLS-1$
-            caretDelta--;
-            assertTrue(caretLocation, caretLocation.startsWith("[^", caretDelta)); //$NON-NLS-1$
-
-            int caretRangeEnd = caretLocation.indexOf(']', caretDelta + 2);
-            assertTrue(caretLocation, caretRangeEnd != -1);
-            length = caretRangeEnd - caretDelta - 2;
-            assertTrue(length > 0);
-            caretContext = caretLocation.substring(0, caretDelta)
-                    + caretLocation.substring(caretDelta + 2, caretRangeEnd)
-                    + caretLocation.substring(caretRangeEnd + 1);
-        } else {
-            caretContext = caretLocation.substring(0, caretDelta)
-                    + caretLocation.substring(caretDelta + 1); // +1: skip "^"
-        }
-
-        int caretContextIndex = text.indexOf(caretContext);
-
-        assertTrue("Caret content " + caretContext + " not found in file",
-                caretContextIndex != -1);
-
-        int offset = caretContextIndex + caretDelta;
-        viewer.setSelectedRange(offset, length);
-
-        return offset;
-    }
-
-    protected String addSelection(String newFileContents, Point selectedRange) {
-        int selectionBegin = selectedRange.x;
-        int selectionEnd = selectionBegin + selectedRange.y;
-        return addSelection(newFileContents, selectionBegin, selectionEnd);
-    }
-
-    @Override
-    protected String removeSessionData(String data) {
-        data = super.removeSessionData(data);
-        if (getProject() != null) {
-            data = data.replace(getProject().getName(), "PROJECTNAME");
-        }
-
-        return data;
-    }
-
-    public static ViewElementDescriptor createDesc(String name, String fqn, boolean hasChildren) {
-        if (hasChildren) {
-            return new ViewElementDescriptor(name, name, fqn, "", "", new AttributeDescriptor[0],
-                    new AttributeDescriptor[0], new ElementDescriptor[1], false);
-        } else {
-            return new ViewElementDescriptor(name, fqn);
-        }
-    }
-
-    public static UiViewElementNode createNode(UiViewElementNode parent, String fqn,
-            boolean hasChildren) {
-        String name = fqn.substring(fqn.lastIndexOf('.') + 1);
-        ViewElementDescriptor descriptor = createDesc(name, fqn, hasChildren);
-        if (parent == null) {
-            // All node hierarchies should be wrapped inside a document node at the root
-            parent = new UiViewElementNode(createDesc("doc", "doc", true));
-        }
-        return (UiViewElementNode) parent.appendNewUiChild(descriptor);
-    }
-
-    public static UiViewElementNode createNode(String fqn, boolean hasChildren) {
-        return createNode(null, fqn, hasChildren);
-    }
-
-    /** Special editor context set on the model to be rendered */
-    protected static class TestLayoutEditorDelegate extends LayoutEditorDelegate {
-
-        public TestLayoutEditorDelegate(
-                IFile file,
-                IStructuredDocument structuredDocument,
-                UiDocumentNode uiRootNode) {
-            super(new TestAndroidXmlCommonEditor(file, structuredDocument, uiRootNode));
-        }
-
-        static class TestAndroidXmlCommonEditor extends CommonXmlEditor {
-
-            private final IFile mFile;
-            private final IStructuredDocument mStructuredDocument;
-            private UiDocumentNode mUiRootNode;
-
-            TestAndroidXmlCommonEditor(
-                    IFile file,
-                    IStructuredDocument structuredDocument,
-                    UiDocumentNode uiRootNode) {
-                mFile = file;
-                mStructuredDocument = structuredDocument;
-                mUiRootNode = uiRootNode;
-            }
-
-            @Override
-            public IFile getInputFile() {
-                return mFile;
-            }
-
-            @Override
-            public IProject getProject() {
-                return mFile.getProject();
-            }
-
-            @Override
-            public IStructuredDocument getStructuredDocument() {
-                return mStructuredDocument;
-            }
-
-            @Override
-            public UiDocumentNode getUiRootNode() {
-                return mUiRootNode;
-            }
-
-            @Override
-            public void editorDirtyStateChanged() {
-            }
-
-            @Override
-            public IStructuredModel getModelForRead() {
-                IModelManager mm = StructuredModelManager.getModelManager();
-                if (mm != null) {
-                    try {
-                        return mm.getModelForRead(mFile);
-                    } catch (Exception e) {
-                        fail(e.toString());
-                    }
-                }
-
-                return null;
-            }
-        }
-    }
-
-    public void testDummy() {
-        // This class contains shared test functionality for testcase subclasses,
-        // but without an actual test in the class JUnit complains (even if we make
-        // it abstract)
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/ChangeLayoutRefactoringTest.java b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/ChangeLayoutRefactoringTest.java
deleted file mode 100644
index a716a75..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/ChangeLayoutRefactoringTest.java
+++ /dev/null
@@ -1,136 +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.eclipse.adt.internal.editors.layout.refactoring;
-
-import static com.android.SdkConstants.FQCN_GRID_LAYOUT;
-import static com.android.SdkConstants.FQCN_LINEAR_LAYOUT;
-import static com.android.SdkConstants.FQCN_RELATIVE_LAYOUT;
-
-import com.android.ide.eclipse.adt.internal.editors.layout.gle2.CanvasViewInfo;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.ltk.core.refactoring.Change;
-import org.w3c.dom.Element;
-
-import java.util.Collections;
-import java.util.List;
-
-@SuppressWarnings("javadoc")
-public class ChangeLayoutRefactoringTest extends RefactoringTest {
-
-    public void testChangeLayout1a() throws Exception {
-        // Test a basic layout which performs some nesting -- tests basic grid layout conversion
-        checkRefactoring("sample1a.xml", true);
-    }
-
-    public void testChangeLayout1b() throws Exception {
-        // Same as 1a, but with different formatting to look for edit handling to for example
-        // remove a line that is made empty when its only attribute is removed
-        checkRefactoring("sample1b.xml", true);
-    }
-
-    public void testChangeLayout2() throws Exception {
-        // Test code which analyzes an embedded RelativeLayout
-        checkRefactoring("sample2.xml", true);
-    }
-
-    public void testChangeLayout3() throws Exception {
-        // Test handling of LinearLayout "weight" attributes on its children: the child with
-        // weight > 0 should fill and subsequent children attach on the bottom/right
-        checkRefactoring("sample3.xml", true);
-    }
-
-    public void testChangeLayout4() throws Exception {
-        checkRefactoring("sample4.xml", true);
-    }
-
-    public void testChangeLayout5() throws Exception {
-        // Test handling of LinearLayout "gravity" attributes on its children
-        checkRefactoring("sample5.xml", true);
-    }
-
-    public void testChangeLayout6() throws Exception {
-        // Check handling of the LinearLayout "baseline" attribute
-        checkRefactoring("sample6.xml", true);
-    }
-
-    public void testGridLayout1() throws Exception {
-        checkRefactoring(FQCN_GRID_LAYOUT, "sample1a.xml", true);
-    }
-
-    public void testGridLayout2() throws Exception {
-        // Test code which analyzes an embedded RelativeLayout
-        checkRefactoring(FQCN_GRID_LAYOUT, "sample2.xml", true);
-    }
-
-    public void testGridLayout5() throws Exception {
-        // Test handling of LinearLayout "gravity" attributes on its children
-        checkRefactoring(FQCN_GRID_LAYOUT, "sample5.xml", true);
-    }
-
-    public void testConvertToGrid() throws Exception {
-        checkRefactoring(FQCN_GRID_LAYOUT, "sample9.xml", true);
-    }
-
-    public void testConvertFromGrid() throws Exception {
-        checkRefactoring(FQCN_LINEAR_LAYOUT, "sample10.xml", true);
-    }
-
-    private void checkRefactoring(String basename, boolean flatten) throws Exception {
-        checkRefactoring(FQCN_RELATIVE_LAYOUT, basename, flatten);
-    }
-
-    public void testInitialAttributes() throws Exception {
-        checkRefactoring(FQCN_LINEAR_LAYOUT, "sample10.xml", true, "android:orientation=vertical");
-    }
-
-    public void testInsertSpacer() throws Exception {
-        checkRefactoring(FQCN_GRID_LAYOUT, "sample11.xml", true);
-    }
-
-    private void checkRefactoring(String newLayoutType, String basename,
-            boolean flatten) throws Exception {
-        checkRefactoring(newLayoutType, basename, flatten, null);
-    }
-
-    @Override
-    protected int getMinSdk() {
-        return 14;
-    }
-
-    private void checkRefactoring(String newLayoutType, String basename,
-            boolean flatten, String initialAttributes) throws Exception {
-        IFile file = getLayoutFile(getProject(), basename);
-        TestContext info = setupTestContext(file, basename);
-        TestLayoutEditorDelegate layoutEditor = info.mLayoutEditorDelegate;
-        CanvasViewInfo rootView = info.mRootView;
-        Element element = info.mElement;
-
-        List<Element> selectedElements = Collections.singletonList(element);
-        ChangeLayoutRefactoring refactoring = new ChangeLayoutRefactoring(selectedElements,
-                layoutEditor);
-        refactoring.setFlatten(flatten);
-        refactoring.setType(newLayoutType);
-        if (initialAttributes != null) {
-            refactoring.setInitializedAttributes(initialAttributes);
-        }
-        refactoring.setRootView(rootView);
-
-        List<Change> changes = refactoring.computeChanges(new NullProgressMonitor());
-        checkEdits(basename, changes);
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/ChangeViewRefactoringTest.java b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/ChangeViewRefactoringTest.java
deleted file mode 100644
index 582ed0f..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/ChangeViewRefactoringTest.java
+++ /dev/null
@@ -1,59 +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.eclipse.adt.internal.editors.layout.refactoring;
-
-import static com.android.SdkConstants.FQCN_RADIO_BUTTON;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.ltk.core.refactoring.Change;
-import org.w3c.dom.Element;
-
-import java.util.List;
-
-public class ChangeViewRefactoringTest extends RefactoringTest {
-
-    public void testChangeView1() throws Exception {
-        checkRefactoring("sample1a.xml", FQCN_RADIO_BUTTON, "@+id/button1", "@+id/button6");
-    }
-
-    public void testChangeView2() throws Exception {
-        // Tests (1) updating references to the renamed id of the changed widgets
-        // (e.g. button3 is renamed to imageButton1 and layout references to button3
-        // must be updated), and (2) removal of attributes not available in the new type
-        // (the text property is removed since it is not available on the new widget
-        // type ImageButton)
-        checkRefactoring("sample2.xml", "android.widget.ImageButton",
-                "@+id/button3", "@+id/button5");
-    }
-
-    private void checkRefactoring(String basename, String newType,
-            String... ids) throws Exception {
-        assertTrue(ids.length > 0);
-
-        IFile file = getLayoutFile(getProject(), basename);
-        TestContext info = setupTestContext(file, basename);
-        TestLayoutEditorDelegate layoutEditor = info.mLayoutEditorDelegate;
-        List<Element> selectedElements = getElements(info.mElement, ids);
-
-        ChangeViewRefactoring refactoring = new ChangeViewRefactoring(selectedElements,
-                layoutEditor);
-        refactoring.setType(newType);
-
-        List<Change> changes = refactoring.computeChanges(new NullProgressMonitor());
-        checkEdits(basename, changes);
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/ExtractIncludeRefactoringTest.java b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/ExtractIncludeRefactoringTest.java
deleted file mode 100644
index 1667649..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/ExtractIncludeRefactoringTest.java
+++ /dev/null
@@ -1,170 +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.eclipse.adt.internal.editors.layout.refactoring;
-
-import static com.android.SdkConstants.DOT_XML;
-
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.ide.eclipse.adt.internal.preferences.AdtPrefs;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.ltk.core.refactoring.Change;
-import org.eclipse.ltk.core.refactoring.TextFileChange;
-import org.w3c.dom.Element;
-
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-public class ExtractIncludeRefactoringTest extends RefactoringTest {
-
-    @Override
-    protected boolean autoFormat() {
-        return false;
-    }
-
-    @Override
-    protected boolean testCaseNeedsUniqueProject() {
-        // Because some of these tests look at ALL layouts in the project
-        // to identify matches
-        return true;
-    }
-
-    public void testExtract1() throws Exception {
-        // Basic: Extract a single button
-        checkRefactoring("sample3.xml", "newlayout1", false, null, 2, false /* diffs */,
-                "@+id/button2");
-    }
-
-    public void testExtract2() throws Exception {
-        // Extract a couple of elements
-        checkRefactoring("sample3.xml", "newlayout2",  false, null, 2, false /* diffs */,
-                "@+id/button2", "@+id/android_logo");
-    }
-
-    public void testExtract3() throws Exception {
-        // Test to make sure layout attributes are updated
-        checkRefactoring("sample2.xml", "newlayout3", false, null, 2, false /* diffs */,
-                "@+id/button3");
-    }
-
-    public void testExtract4() throws Exception {
-        // Tests extracting from -multiple- files (as well as with custom android namespace
-        // prefix)
-
-        // Make sure the variation-files exist
-        Map<IPath, String> extraFiles = new HashMap<IPath, String>();
-        extraFiles.put(getTestDataFile(getProject(), "sample3-variation1.xml",
-                "res/layout-land/sample3.xml").getProjectRelativePath(),
-                "sample3-variation1.xml");
-        extraFiles.put(getTestDataFile(getProject(), "sample3-variation2.xml",
-                "res/layout-xlarge-land/sample3.xml").getProjectRelativePath(),
-                "sample3-variation2.xml");
-
-        checkRefactoring("sample3.xml", "newlayout3", true, extraFiles, 4, false /* diffs */,
-                "@+id/android_logo");
-    }
-
-    public void testExtract5() throws Exception {
-        // Tests extracting from multiple files with -contiguous regions-.
-
-        // Make sure the variation-files exist
-        Map<IPath, String> extraFiles = new HashMap<IPath, String>();
-        extraFiles.put(getTestDataFile(getProject(), "sample3-variation1.xml",
-                "res/layout-land/sample3.xml").getProjectRelativePath(),
-                "sample3-variation1.xml");
-        extraFiles.put(getTestDataFile(getProject(), "sample3-variation2.xml",
-                "res/layout-xlarge-land/sample3.xml").getProjectRelativePath(),
-                "sample3-variation2.xml");
-
-        checkRefactoring("sample3.xml", "newlayout3", true, extraFiles, 4,  false /* diffs */,
-                "@+id/android_logo", "@+id/button1");
-    }
-
-    public void testExtract6() throws Exception {
-        // Tests extracting from multiple files where the layouts are completely
-        // different/unrelated files
-
-        // Create the duplicate files
-        Map<IPath, String> extraFiles = new HashMap<IPath, String>();
-        extraFiles.put(getTestDataFile(getProject(), "sample1a.xml",
-                "res/layout/sample1a.xml").getProjectRelativePath(),
-                "sample1a.xml");
-        extraFiles.put(getTestDataFile(getProject(), "sample7.xml", "res/layout/sample7.xml")
-                .getProjectRelativePath(), "sample7.xml");
-        extraFiles.put(getTestDataFile(getProject(), "sample8.xml", "res/layout/sample8.xml")
-                .getProjectRelativePath(), "sample8.xml");
-
-        checkRefactoring("sample7.xml", "newlayout6", true, extraFiles, 4, true /* diffs */,
-                "@+id/linearLayout4");
-    }
-
-    public void testExtract7() throws Exception {
-        // Just like testExtract6, except we turn on auto-formatting
-        IPreferenceStore store = AdtPlugin.getDefault().getPreferenceStore();
-        AdtPrefs.init(store);
-        AdtPrefs prefs = AdtPrefs.getPrefs();
-        prefs.initializeStoreWithDefaults(store);
-        store.setValue(AdtPrefs.PREFS_FORMAT_GUI_XML, true);
-        prefs.loadValues(null);
-
-        assertTrue(AdtPrefs.getPrefs().getFormatGuiXml());
-
-        testExtract6();
-    }
-
-
-    private void checkRefactoring(String basename, String layoutName,
-            boolean replaceOccurrences, Map<IPath,String> extraFiles,
-            int expectedModifiedFileCount, boolean createDiffs, String... ids) throws Exception {
-        assertTrue(ids.length > 0);
-
-        IFile file = getLayoutFile(getProject(), basename);
-        TestContext info = setupTestContext(file, basename);
-        TestLayoutEditorDelegate layoutEditor = info.mLayoutEditorDelegate;
-        List<Element> selectedElements = getElements(info.mElement, ids);
-
-        ExtractIncludeRefactoring refactoring = new ExtractIncludeRefactoring(selectedElements,
-                layoutEditor);
-        refactoring.setLayoutName(layoutName);
-        refactoring.setReplaceOccurrences(replaceOccurrences);
-        List<Change> changes = refactoring.computeChanges(new NullProgressMonitor());
-
-        assertTrue(changes.size() >= 3);
-
-        Map<IPath,String> fileToGolden = new HashMap<IPath,String>();
-        IPath sourcePath = file.getProjectRelativePath();
-        fileToGolden.put(sourcePath, basename);
-        IPath newPath = sourcePath.removeLastSegments(1).append(layoutName + DOT_XML);
-        fileToGolden.put(newPath, layoutName + DOT_XML);
-        if (extraFiles != null) {
-            fileToGolden.putAll(extraFiles);
-        }
-
-        checkEdits(changes, fileToGolden, createDiffs);
-
-        int modifiedFileCount = 0;
-        for (Change change : changes) {
-            if (change instanceof TextFileChange) {
-                modifiedFileCount++;
-            }
-        }
-        assertEquals(expectedModifiedFileCount, modifiedFileCount);
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/ExtractStyleRefactoringTest.java b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/ExtractStyleRefactoringTest.java
deleted file mode 100644
index f64555d..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/ExtractStyleRefactoringTest.java
+++ /dev/null
@@ -1,232 +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.eclipse.adt.internal.editors.layout.refactoring;
-
-import com.android.utils.Pair;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.jface.text.ITextSelection;
-import org.eclipse.jface.text.TextSelection;
-import org.eclipse.ltk.core.refactoring.Change;
-import org.eclipse.ltk.core.refactoring.TextFileChange;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.ide.IDE;
-import org.w3c.dom.Attr;
-import org.w3c.dom.Element;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-public class ExtractStyleRefactoringTest extends RefactoringTest {
-    @Override
-    protected boolean testCaseNeedsUniqueProject() {
-        return true;
-    }
-
-    public void testExtract1() throws Exception {
-        // Test extracting into a new style file
-        checkRefactoring("extractstyle1.xml", "newstyles.xml", "newstyle",
-                false /* removeExtracted */, false /* applyStyle */, null, 1, "@+id/button2");
-    }
-
-    public void testExtract1b() throws Exception {
-        // Extract and apply new style
-        checkRefactoring("extractstyle1.xml", "newstyles2.xml", "newstyle",
-                false /* removeExtracted */, true /* applyStyle */, null, 2, "@+id/button2");
-    }
-
-    public void testExtract1c() throws Exception {
-        // Extract and remove extracted
-        checkRefactoring("extractstyle1.xml", "newstyles3.xml", "newstyle",
-                true /* removeExtracted */, false /* applyStyle */, null, 2, "@+id/button2");
-    }
-
-    public void testExtract1d() throws Exception {
-        // Extract and apply style and remove extracted
-        checkRefactoring("extractstyle1.xml", "newstyles4.xml", "newstyle",
-                true /* removeExtracted */, true /* applyStyle */, null, 2, "@+id/button2");
-    }
-
-    public void testExtract2() throws Exception {
-        getTestDataFile(getProject(), "navigationstyles.xml", "res/values/navigationstyles.xml");
-
-        // -Modify- the existing styles.xml file
-        checkRefactoring("extractstyle1.xml", "navigationstyles.xml", "newstyle",
-                true /* removeExtracted */, true /* applyStyle */, null, 2, "@+id/button2");
-    }
-
-    public void testExtract3() throws Exception {
-        // Select multiple elements - overlap in values.
-        checkRefactoring("extractstyle1.xml", "newstyles4.xml", "newstyle",
-                true /* removeExtracted */, true /* applyStyle */, null, 2,
-                "@+id/button1", "@+id/button2");
-    }
-
-    // This test fails for some reason - not in the refactoring (checked manually)
-    // but the DOM model returns null when run in a test context.
-    public void testExtract4() throws Exception {
-        // Test extracting on a single caret position over an attribute: Should extract
-        // just that one attribute
-        checkRefactoringByOffset("extractstyle1.xml", "newstyles5.xml", "newstyle",
-                true /* removeExtracted */, true /* applyStyle */, null, 2,
-                "android:text^Color=\"#FF00FF\"", "android:text^Color=\"#FF00FF\"");
-    }
-
-    public void testExtract5() throws Exception {
-        // Test extracting on a range selection inside an element: should extract just
-        // the attributes that overlap the selection
-        checkRefactoringByOffset("extractstyle1.xml", "newstyles6.xml", "newstyle",
-                true /* removeExtracted */, true /* applyStyle */, null, 2,
-                "android:^textSize=\"20pt",
-                "android:id=\"@+id/button1\" android:layout_a^lignParentBottom");
-    }
-
-    public void testExtract6() throws Exception {
-        // Test extracting on a single caret position which is not over any attributes:
-        checkRefactoringByOffset("extractstyle1.xml", "newstyles7.xml", "newstyle",
-                true /* removeExtracted */, true /* applyStyle */, null, 0,
-                "<Bu^tton", "<Bu^tton");
-    }
-
-    public void testExtract7() throws Exception {
-        // Verify that even with a different namespace prefix we end up with android:
-        // in the extracted style
-        checkRefactoring("extractstyle2.xml", "newstyles8.xml", "newstyle",
-                true /* removeExtracted */, true /* applyStyle */, null, 2,
-                "@+id/button1", "@+id/button2");
-    }
-
-    public void testExtract8() throws Exception {
-        // Test setting parent style
-        checkRefactoring("extractstyle1.xml", "newstyles3.xml", "newstyle",
-                true /* removeExtracted */, false /* applyStyle */, "android:Widget.Button",
-                2, "@+id/button2");
-    }
-
-    // Check extract style on a selection of elements
-    private void checkRefactoring(String basename, String styleFileName, String newStyleName,
-            boolean removeExtracted, boolean applyStyle, String parentStyle,
-            int expectedModifiedFileCount, String... ids) throws Exception {
-        assertTrue(ids.length > 0);
-
-        IFile file = getLayoutFile(getProject(), basename);
-        TestContext info = setupTestContext(file, basename);
-        TestLayoutEditorDelegate layoutEditor = info.mLayoutEditorDelegate;
-        List<Element> selectedElements = getElements(info.mElement, ids);
-
-        // Open the file such that ModelManager.getExistingModelForRead() in DomUtilities
-        // will succeed
-        IWorkbench workbench = PlatformUI.getWorkbench();
-        IWorkbenchWindow activeWorkbenchWindow = workbench.getActiveWorkbenchWindow();
-        IWorkbenchPage page = activeWorkbenchWindow.getActivePage();
-        IDE.openEditor(page, file);
-
-        ExtractStyleRefactoring refactoring = new ExtractStyleRefactoring(selectedElements,
-                layoutEditor);
-        checkRefactoring(basename, styleFileName, newStyleName, removeExtracted, applyStyle,
-                parentStyle, expectedModifiedFileCount, file, refactoring);
-    }
-
-    // Check extract style against a set of editor text locations
-    private void checkRefactoringByOffset(String basename, String styleFileName,
-            String newStyleName, boolean removeExtracted, boolean applyStyle,
-            String parentStyle,
-            int expectedModifiedFileCount, String beginCaretLocation, String endCaretLocation)
-            throws Exception {
-        IFile file = getLayoutFile(getProject(), basename);
-        int beginOffset = getCaretOffset(file, beginCaretLocation);
-        int endOffset = getCaretOffset(file, endCaretLocation);
-
-        TestContext info = setupTestContext(file, basename);
-        TestLayoutEditorDelegate layoutEditor = info.mLayoutEditorDelegate;
-
-        // Open the file such that ModelManager.getExistingModelForRead() in DomUtilities
-        // will succeed
-        IWorkbench workbench = PlatformUI.getWorkbench();
-        IWorkbenchWindow activeWorkbenchWindow = workbench.getActiveWorkbenchWindow();
-        IWorkbenchPage page = activeWorkbenchWindow.getActivePage();
-        IDE.openEditor(page, file);
-
-        ITextSelection selection = new TextSelection(beginOffset, endOffset - beginOffset);
-        ExtractStyleRefactoring refactoring = new ExtractStyleRefactoring(file,
-                layoutEditor, selection, null);
-        checkRefactoring(basename, styleFileName, newStyleName, removeExtracted, applyStyle,
-                parentStyle, expectedModifiedFileCount, file, refactoring);
-    }
-
-    // Common test code used by the other two check methods
-    private void checkRefactoring(String basename, String styleFileName, String newStyleName,
-            boolean removeExtracted, boolean applyStyle, String parentStyle,
-            int expectedModifiedFileCount, IFile file,
-            ExtractStyleRefactoring refactoring) throws Exception {
-        refactoring.setStyleName(newStyleName);
-        refactoring.setApplyStyle(applyStyle);
-        refactoring.setRemoveExtracted(removeExtracted);
-        refactoring.setStyleFileName(styleFileName);
-        refactoring.setParent(parentStyle);
-
-        // Pick the attributes to extract -- for now everything (and where there are
-        // conflicting values, pick the first one)
-        Pair<Map<String, List<Attr>>, Set<Attr>> result = refactoring.getAvailableAttributes();
-        Map<String, List<Attr>> availableAttributes = result.getFirst();
-        Set<Attr> selected = result.getSecond();
-        List<Attr> chosenAttributes = new ArrayList<Attr>();
-        for (List<Attr> list : availableAttributes.values()) {
-            Collections.sort(list, new Comparator<Attr>() {
-                @Override
-                public int compare(Attr a1, Attr a2) {
-                    return a1.getValue().compareTo(a2.getValue());
-                }
-            });
-            Attr attr = list.get(0);
-            if (selected.contains(attr)) {
-                chosenAttributes.add(attr);
-            }
-        }
-        refactoring.setChosenAttributes(chosenAttributes);
-
-        List<Change> changes = refactoring.computeChanges(new NullProgressMonitor());
-        assertEquals(expectedModifiedFileCount, changes.size());
-
-        Map<IPath,String> fileToGolden = new HashMap<IPath,String>();
-        IPath sourcePath = file.getProjectRelativePath();
-        fileToGolden.put(sourcePath, basename);
-        IPath newPath = refactoring.getStyleFile(getProject()).getProjectRelativePath();
-        fileToGolden.put(newPath, styleFileName);
-
-        checkEdits(changes, fileToGolden, true);
-
-        int modifiedFileCount = 0;
-        for (Change change : changes) {
-            if (change instanceof TextFileChange) {
-                modifiedFileCount++;
-            }
-        }
-        assertEquals(expectedModifiedFileCount, modifiedFileCount);
-    }
-
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/RefactoringAssistantTest.java b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/RefactoringAssistantTest.java
deleted file mode 100644
index b227179..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/RefactoringAssistantTest.java
+++ /dev/null
@@ -1,128 +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.eclipse.adt.internal.editors.layout.refactoring;
-
-import static com.android.SdkConstants.FD_RES;
-import static com.android.SdkConstants.FD_RES_LAYOUT;
-
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.ide.eclipse.adt.internal.editors.AndroidXmlEditor;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.jface.text.contentassist.ICompletionProposal;
-import org.eclipse.jface.text.quickassist.IQuickAssistInvocationContext;
-import org.eclipse.jface.text.source.ISourceViewer;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.ide.IDE;
-
-public class RefactoringAssistantTest extends AdtProjectTest {
-    public void testAssistant1() throws Exception {
-        // "Extract String"
-        checkFixes("sample1a.xml", "<Button android:text=\"Fir^stButton\"");
-    }
-
-    public void testAssistant2() throws Exception {
-        // Visual refactoring operations
-        checkFixes("sample1a.xml", "<Bu^tton android:text");
-    }
-
-    public void testAssistant3() throws Exception {
-        checkFixes("sample1a.xml", "<Button andr^oid:text=\"FirstButton\"");
-    }
-
-    public void testAssistant4() throws Exception {
-        // Check for resource rename refactoring (and don't offer extract string)
-        checkFixes("sample1a.xml", "android:id=\"@+id/Linea^rLayout2\"");
-    }
-
-    private void checkFixes(String name, String caretLocation)
-            throws Exception {
-        IProject project = getProject();
-        IFile file = getTestDataFile(project, name, FD_RES + "/" + FD_RES_LAYOUT + "/" + name);
-
-        // Determine the offset
-        String fileContent = AdtPlugin.readFile(file);
-        int caretDelta = caretLocation.indexOf("^");
-        assertTrue(caretLocation, caretDelta != -1);
-        String caretContext = caretLocation.substring(0, caretDelta)
-                + caretLocation.substring(caretDelta + "^".length());
-        int caretContextIndex = fileContent.indexOf(caretContext);
-        assertTrue("Caret content " + caretContext + " not found in file",
-                caretContextIndex != -1);
-        final int offset = caretContextIndex + caretDelta;
-
-
-        RefactoringAssistant refactoringAssistant = new RefactoringAssistant();
-
-        // Open file
-        IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
-        assertNotNull(page);
-        IEditorPart editor = IDE.openEditor(page, file);
-        assertTrue(editor instanceof AndroidXmlEditor);
-        AndroidXmlEditor layoutEditor = (AndroidXmlEditor) editor;
-        final ISourceViewer viewer = layoutEditor.getStructuredSourceViewer();
-
-        IQuickAssistInvocationContext invocationContext = new IQuickAssistInvocationContext() {
-            @Override
-            public int getLength() {
-                return 0;
-            }
-
-            @Override
-            public int getOffset() {
-                return offset;
-            }
-
-            @Override
-            public ISourceViewer getSourceViewer() {
-                return viewer;
-            }
-        };
-        ICompletionProposal[] proposals = refactoringAssistant
-                .computeQuickAssistProposals(invocationContext);
-
-        if (proposals != null) {
-            for (ICompletionProposal proposal : proposals) {
-                assertNotNull(proposal.getAdditionalProposalInfo());
-                assertNotNull(proposal.getImage());
-            }
-        }
-
-        StringBuilder sb = new StringBuilder(1000);
-        sb.append("Quick assistant in " + name + " for " + caretLocation + ":\n");
-        if (proposals != null) {
-            for (ICompletionProposal proposal : proposals) {
-                sb.append(proposal.getDisplayString());
-                String help = proposal.getAdditionalProposalInfo();
-                if (help != null && help.trim().length() > 0) {
-                    sb.append(" : ");
-                    sb.append(help.replace('\n', ' '));
-                }
-                sb.append('\n');
-            }
-        } else {
-            sb.append("None found.\n");
-        }
-        assertEqualsGolden(name, sb.toString(), "txt");
-
-        // No "apply" test on these assists since they are interactive. Refactoring
-        // is tested elsewhere.
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/RefactoringTest.java b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/RefactoringTest.java
deleted file mode 100644
index 9565183..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/RefactoringTest.java
+++ /dev/null
@@ -1,334 +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.eclipse.adt.internal.editors.layout.refactoring;
-
-import static com.android.SdkConstants.ANDROID_WIDGET_PREFIX;
-import static com.android.SdkConstants.DOT_XML;
-
-import com.android.ide.common.rendering.api.ViewInfo;
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.ide.eclipse.adt.internal.editors.layout.gle2.CanvasViewInfo;
-import com.android.ide.eclipse.adt.internal.editors.layout.gle2.DomUtilities;
-import com.android.ide.eclipse.adt.internal.editors.layout.uimodel.UiViewElementNode;
-import com.android.ide.eclipse.adt.internal.editors.uimodel.UiElementNode;
-import com.android.ide.eclipse.adt.internal.preferences.AdtPrefs;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.jface.text.BadLocationException;
-import org.eclipse.jface.text.Document;
-import org.eclipse.jface.text.IDocument;
-import org.eclipse.ltk.core.refactoring.Change;
-import org.eclipse.ltk.core.refactoring.TextFileChange;
-import org.eclipse.text.edits.MultiTextEdit;
-import org.eclipse.text.edits.TextEdit;
-import org.eclipse.wst.sse.core.StructuredModelManager;
-import org.eclipse.wst.sse.core.internal.provisional.IModelManager;
-import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
-import org.eclipse.wst.sse.core.internal.provisional.IndexedRegion;
-import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
-import org.w3c.dom.Element;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-@SuppressWarnings("restriction")
-public class RefactoringTest extends AdtProjectTest {
-
-    protected boolean autoFormat() {
-        return true;
-    }
-
-    @Override
-    protected void setUp() throws Exception {
-
-        // Ensure that the defaults are initialized so for example formatting options are
-        // initialized properly
-        IPreferenceStore store = AdtPlugin.getDefault().getPreferenceStore();
-        AdtPrefs.init(store);
-        AdtPrefs prefs = AdtPrefs.getPrefs();
-        prefs.initializeStoreWithDefaults(store);
-
-        store.setValue(AdtPrefs.PREFS_FORMAT_GUI_XML, autoFormat());
-
-        prefs.loadValues(null);
-
-        super.setUp();
-    }
-
-    protected static Element findElementById(Element root, String id) {
-        if (id.equals(VisualRefactoring.getId(root))) {
-            return root;
-        }
-
-        for (Element child : DomUtilities.getChildren(root)) {
-            Element result = findElementById(child, id);
-            if (result != null) {
-                return result;
-            }
-        }
-
-        return null;
-    }
-
-    protected static List<Element> getElements(Element root, String... ids) {
-        List<Element> selectedElements = new ArrayList<Element>();
-        for (String id : ids) {
-            Element element = findElementById(root, id);
-            assertNotNull(element);
-            selectedElements.add(element);
-        }
-        return selectedElements;
-    }
-
-    protected void checkEdits(String basename, List<Change> changes) throws BadLocationException,
-            IOException {
-        IDocument document = new Document();
-
-        String xml = readTestFile(basename, false);
-        if (xml == null) { // New file
-            xml = ""; //$NON-NLS-1$
-        }
-        document.set(xml);
-
-        for (Change change : changes) {
-            if (change instanceof TextFileChange) {
-                TextFileChange tf = (TextFileChange) change;
-                TextEdit edit = tf.getEdit();
-                IFile file = tf.getFile();
-                String contents = AdtPlugin.readFile(file);
-                assertEquals(contents, xml);
-                if (edit instanceof MultiTextEdit) {
-                    MultiTextEdit edits = (MultiTextEdit) edit;
-                    edits.apply(document);
-                } else {
-                    edit.apply(document);
-                }
-            } else {
-                System.out.println("Ignoring non-textfilechange in refactoring result");
-            }
-        }
-
-        String actual = document.get();
-
-        // Ensure that the document is still valid to make sure the edits don't
-        // mangle it:
-        org.w3c.dom.Document doc = DomUtilities.parseDocument(actual, true);
-        assertNotNull(actual, doc);
-
-        assertEqualsGolden(basename, actual);
-    }
-
-    protected void checkEdits(List<Change> changes,
-            Map<IPath, String> fileToGoldenName) throws BadLocationException, IOException {
-        checkEdits(changes, fileToGoldenName, false);
-    }
-
-    protected void checkEdits(List<Change> changes,
-            Map<IPath, String> fileToGoldenName, boolean createDiffs)
-                    throws BadLocationException, IOException {
-        for (Change change : changes) {
-            if (change instanceof TextFileChange) {
-                TextFileChange tf = (TextFileChange) change;
-                IFile file = tf.getFile();
-                assertNotNull(file);
-                IPath path = file.getProjectRelativePath();
-                String goldenName = fileToGoldenName.get(path);
-                assertNotNull("Not found: " + path.toString(), goldenName);
-
-                String xml = readTestFile(goldenName, false);
-                if (xml == null) { // New file
-                    xml = ""; //$NON-NLS-1$
-                }
-                IDocument document = new Document();
-                document.set(xml);
-
-                String before = document.get();
-
-                TextEdit edit = tf.getEdit();
-                if (edit instanceof MultiTextEdit) {
-                    MultiTextEdit edits = (MultiTextEdit) edit;
-                    edits.apply(document);
-                } else {
-                    edit.apply(document);
-                }
-
-                String actual = document.get();
-
-                if (createDiffs) {
-                    // Use a diff as the golden file instead of the after
-                    actual = getDiff(before, actual);
-                    if (goldenName.endsWith(DOT_XML)) {
-                        goldenName = goldenName.substring(0,
-                                goldenName.length() - DOT_XML.length())
-                                + ".diff";
-                    }
-                }
-
-                assertEqualsGolden(goldenName, actual);
-            } else {
-                System.out.println("Ignoring non-textfilechange in refactoring result");
-                assertNull(change.getAffectedObjects());
-            }
-        }
-    }
-
-    protected UiViewElementNode createModel(UiViewElementNode parent, Element element) {
-        List<Element> children = DomUtilities.getChildren(element);
-        String fqcn = ANDROID_WIDGET_PREFIX + element.getTagName();
-        boolean hasChildren = children.size() > 0;
-        UiViewElementNode node = createNode(parent, fqcn, hasChildren);
-        node.setXmlNode(element);
-        for (Element child : children) {
-            createModel(node, child);
-        }
-
-        return node;
-    }
-
-    /**
-     * Builds up a ViewInfo hierarchy for the given model. This is done by
-     * reading .info dump files which record the exact pixel sizes of each
-     * ViewInfo object. These files are assumed to match up exactly with the
-     * model objects. This is done rather than rendering an actual layout
-     * hierarchy to insulate the test from pixel difference (in say font size)
-     * among platforms, as well as tying the test to particulars about relative
-     * sizes of things which may change with theme adjustments etc.
-     * <p>
-     * Each file can be generated by the dump method in the ViewHierarchy.
-     */
-    protected ViewInfo createInfos(UiElementNode model, String relativePath) throws IOException {
-        String basename = relativePath.substring(0, relativePath.lastIndexOf('.') + 1);
-        String relative = basename + "info"; //$NON-NLS-1$
-        String info = readTestFile(relative, true);
-        // Parse the info file and build up a model from it
-        // Each line contains a new info.
-        // If indented it is a child of the parent.
-        String[] lines = info.split("\n"); //$NON-NLS-1$
-
-        // Iteration order for the info file should match exactly the UI model so
-        // we can just advance the line index sequentially as we traverse
-
-        return create(model, Arrays.asList(lines).iterator());
-    }
-
-    protected ViewInfo create(UiElementNode node, Iterator<String> lineIterator) {
-        // android.widget.LinearLayout [0,36,240,320]
-        Pattern pattern = Pattern.compile("(\\s*)(\\S+) \\[(\\d+),(\\d+),(\\d+),(\\d+)\\].*");
-        assertTrue(lineIterator.hasNext());
-        String description = lineIterator.next();
-        Matcher matcher = pattern.matcher(description);
-        assertTrue(matcher.matches());
-        //String indent = matcher.group(1);
-        //String fqcn = matcher.group(2);
-        String left = matcher.group(3);
-        String top = matcher.group(4);
-        String right = matcher.group(5);
-        String bottom = matcher.group(6);
-
-        ViewInfo view = new ViewInfo(node.getXmlNode().getLocalName(), node,
-                Integer.parseInt(left), Integer.parseInt(top),
-                Integer.parseInt(right), Integer.parseInt(bottom));
-
-        List<UiElementNode> childNodes = node.getUiChildren();
-        if (childNodes.size() > 0) {
-            List<ViewInfo> children = new ArrayList<ViewInfo>();
-            for (UiElementNode child : childNodes) {
-                children.add(create(child, lineIterator));
-            }
-            view.setChildren(children);
-        }
-
-        return view;
-    }
-
-    protected TestContext setupTestContext(IFile file, String relativePath) throws Exception {
-        IStructuredModel structuredModel = null;
-        org.w3c.dom.Document domDocument = null;
-        IStructuredDocument structuredDocument = null;
-        Element element = null;
-
-        try {
-            IModelManager modelManager = StructuredModelManager.getModelManager();
-            structuredModel = modelManager.getModelForRead(file);
-            if (structuredModel instanceof IDOMModel) {
-                IDOMModel domModel = (IDOMModel) structuredModel;
-                domDocument = domModel.getDocument();
-                element = domDocument.getDocumentElement();
-                structuredDocument = structuredModel.getStructuredDocument();
-            }
-        } finally {
-            if (structuredModel != null) {
-                structuredModel.releaseFromRead();
-            }
-        }
-
-        assertNotNull(structuredModel);
-        assertNotNull(domDocument);
-        assertNotNull(element);
-        assertNotNull(structuredDocument);
-        assertTrue(element instanceof IndexedRegion);
-
-        UiViewElementNode model = createModel(null, element);
-        ViewInfo info = createInfos(model, relativePath);
-        CanvasViewInfo rootView = CanvasViewInfo.create(info, true /* layoutlib5 */).getFirst();
-        TestLayoutEditorDelegate layoutEditor =
-            new TestLayoutEditorDelegate(file, structuredDocument, null);
-
-        TestContext testInfo = createTestContext();
-        testInfo.mFile = file;
-        testInfo.mStructuredModel = structuredModel;
-        testInfo.mStructuredDocument = structuredDocument;
-        testInfo.mElement = element;
-        testInfo.mDomDocument = domDocument;
-        testInfo.mUiModel = model;
-        testInfo.mViewInfo = info;
-        testInfo.mRootView = rootView;
-        testInfo.mLayoutEditorDelegate = layoutEditor;
-
-        return testInfo;
-    }
-
-    protected TestContext createTestContext() {
-        return new TestContext();
-    }
-
-    protected static class TestContext {
-        protected IFile mFile;
-        protected IStructuredModel mStructuredModel;
-        protected IStructuredDocument mStructuredDocument;
-        protected org.w3c.dom.Document mDomDocument;
-        protected Element mElement;
-        protected UiViewElementNode mUiModel;
-        protected ViewInfo mViewInfo;
-        protected CanvasViewInfo mRootView;
-        protected TestLayoutEditorDelegate mLayoutEditorDelegate;
-    }
-
-    @Override
-    public void testDummy() {
-        // To avoid JUnit warning that this class contains no tests, even though
-        // this is an abstract class and JUnit shouldn't try
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/UnwrapRefactoringTest.java b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/UnwrapRefactoringTest.java
deleted file mode 100644
index e03ea9e..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/UnwrapRefactoringTest.java
+++ /dev/null
@@ -1,58 +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.eclipse.adt.internal.editors.layout.refactoring;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.ltk.core.refactoring.Change;
-import org.eclipse.ltk.core.refactoring.RefactoringStatus;
-import org.w3c.dom.Element;
-
-import java.util.List;
-
-public class UnwrapRefactoringTest extends RefactoringTest {
-
-    public void testUnwrap1() throws Exception {
-        // Unwrap view with parent, no children - this will unwrap the parent (frame layout)
-        checkRefactoring("unwrap.xml", "@+id/button");
-    }
-
-    public void testUnwrap2() throws Exception {
-        // Unwrap view with parent and children; this should unwrap the element itself
-        checkRefactoring("unwrap.xml", "@+id/frame");
-    }
-
-    public void testUnwrap3() throws Exception {
-        // Unwrap root: should transfer namespace
-        checkRefactoring("unwrap.xml", "@+id/linear");
-    }
-
-    private void checkRefactoring(String basename, String id) throws Exception {
-        IFile file = getLayoutFile(getProject(), basename);
-        TestContext info = setupTestContext(file, basename);
-        TestLayoutEditorDelegate layoutEditor = info.mLayoutEditorDelegate;
-        List<Element> selectedElements = getElements(info.mElement, id);
-        assertEquals(1, selectedElements.size());
-
-        UnwrapRefactoring refactoring = new UnwrapRefactoring(selectedElements,
-                layoutEditor);
-
-        RefactoringStatus status = refactoring.checkInitialConditions(new NullProgressMonitor());
-        assertFalse(status.hasError());
-        List<Change> changes = refactoring.computeChanges(new NullProgressMonitor());
-        checkEdits(basename, changes);
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/UseCompoundDrawableRefactoringTest.java b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/UseCompoundDrawableRefactoringTest.java
deleted file mode 100644
index 01a0e1e..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/UseCompoundDrawableRefactoringTest.java
+++ /dev/null
@@ -1,114 +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.eclipse.adt.internal.editors.layout.refactoring;
-
-import static com.android.ide.eclipse.adt.internal.editors.layout.refactoring.UseCompoundDrawableRefactoring.combine;
-
-import com.android.ide.eclipse.adt.AdtUtils;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.ltk.core.refactoring.Change;
-import org.eclipse.ltk.core.refactoring.CompositeChange;
-import org.w3c.dom.Element;
-
-import java.util.List;
-
-@SuppressWarnings("javadoc")
-public class UseCompoundDrawableRefactoringTest extends RefactoringTest {
-    public void testCombine() throws Exception {
-        assertNull(combine(null, null));
-        assertNull(combine("@dimen/foo", "@dimen/bar"));
-        assertNull(combine("@dimen/foo", "@dimen/bar"));
-        assertNull(combine("1sp", "@dimen/bar"));
-        assertNull(combine("1sp", "2dp"));
-        assertNull(combine(null, ""));
-        assertNull(combine("", null));
-
-        assertEquals("@dimen/foo", combine(null, "@dimen/foo"));
-        assertEquals("@dimen/foo", combine("@dimen/foo", null));
-        assertEquals("5sp", combine("5sp", null));
-
-        assertEquals("10sp", combine("8sp", "2sp"));
-        assertEquals("50dp", combine("30dp", "20dp"));
-    }
-
-    public void test1() throws Exception {
-        // Test converting an image above a text view
-        checkRefactoring("refactoring/usecompound/compound1.xml", "@+id/layout1");
-    }
-
-    public void test2() throws Exception {
-        // Test converting an image below a text view
-        checkRefactoring("refactoring/usecompound/compound2.xml", "@+id/layout2");
-    }
-
-    public void test3() throws Exception {
-        // Test converting an image to the left of a text view
-        checkRefactoring("refactoring/usecompound/compound3.xml", "@+id/layout3");
-    }
-
-    public void test4() throws Exception {
-        // Test converting an image to the right of a text view
-        checkRefactoring("refactoring/usecompound/compound4.xml", "@+id/layout4");
-    }
-
-    public void test5() throws Exception {
-        // Test converting an image where the LinearLayout is referenced (in a relative layout)
-        // and the text view has an id
-        checkRefactoring("refactoring/usecompound/compound_all.xml", "@+id/layout2");
-    }
-
-    public void test6() throws Exception {
-        // Test converting an image where the LinearLayout is referenced (in a relative layout)
-        // and the text view does not have an id
-        checkRefactoring("refactoring/usecompound/compound_all.xml", "@+id/layout3");
-    }
-
-    public void test7() throws Exception {
-        // Test converting where a namespace needs to be migrated
-        checkRefactoring("refactoring/usecompound/compound5.xml", "@+id/layout");
-    }
-
-    public void test8() throws Exception {
-        // Test padding handling
-        checkRefactoring("refactoring/usecompound/compound6.xml", "@+id/layout1");
-    }
-
-    public void test9() throws Exception {
-        // Test margin combination
-        checkRefactoring("refactoring/usecompound/compound7.xml", "@+id/layout1");
-    }
-
-    private void checkRefactoring(String basename, String id)
-            throws Exception {
-        IFile file = getLayoutFile(getProject(), basename);
-        TestContext info = setupTestContext(file, basename);
-        TestLayoutEditorDelegate layoutEditor = info.mLayoutEditorDelegate;
-        List<Element> selectedElements = getElements(info.mElement, new String[] { id });
-
-        UseCompoundDrawableRefactoring refactoring = new UseCompoundDrawableRefactoring(
-                selectedElements, layoutEditor);
-        List<Change> changes = refactoring.computeChanges(new NullProgressMonitor());
-
-        CompositeChange cc = new CompositeChange("Combined from unit test",
-                changes.toArray(new Change[changes.size()]));
-        cc.markAsSynthetic();
-        addCleanupDir(AdtUtils.getAbsolutePath(getProject()).toFile());
-
-        checkEdits(basename, changes);
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/WrapInRefactoringTest.java b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/WrapInRefactoringTest.java
deleted file mode 100644
index 2dc6744..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/WrapInRefactoringTest.java
+++ /dev/null
@@ -1,59 +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.eclipse.adt.internal.editors.layout.refactoring;
-
-import static com.android.SdkConstants.FQCN_GESTURE_OVERLAY_VIEW;
-import static com.android.SdkConstants.FQCN_LINEAR_LAYOUT;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.ltk.core.refactoring.Change;
-import org.w3c.dom.Element;
-
-import java.util.List;
-
-public class WrapInRefactoringTest extends RefactoringTest {
-
-    public void testWrapIn1() throws Exception {
-        // Test wrapping view: should indent view
-        checkRefactoring("sample3.xml", FQCN_LINEAR_LAYOUT, "@+id/button2");
-    }
-
-    public void testWrapIn2() throws Exception {
-        // Test wrapping the root: should move namespace
-        checkRefactoring("sample3.xml", FQCN_GESTURE_OVERLAY_VIEW, "@+id/newlinear");
-    }
-
-    public void testWrapIn3() throws Exception {
-        // Test wrap multiple adjacent elements - should wrap all as a unit
-        checkRefactoring("sample3.xml", FQCN_LINEAR_LAYOUT, "@+id/button2", "@+id/android_logo");
-    }
-
-    private void checkRefactoring(String basename, String fqcn, String... ids) throws Exception {
-        assertTrue(ids.length > 0);
-
-        IFile file = getLayoutFile(getProject(), basename);
-        TestContext info = setupTestContext(file, basename);
-        TestLayoutEditorDelegate layoutEditor = info.mLayoutEditorDelegate;
-        List<Element> selectedElements = getElements(info.mElement, ids);
-
-        WrapInRefactoring refactoring = new WrapInRefactoring(selectedElements,
-                layoutEditor);
-        refactoring.setType(fqcn);
-        List<Change> changes = refactoring.computeChanges(new NullProgressMonitor());
-        checkEdits(basename, changes);
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/TestFragment.java.txt b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/TestFragment.java.txt
deleted file mode 100644
index 0942a19..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/TestFragment.java.txt
+++ /dev/null
@@ -1,15 +0,0 @@
-package com.android.eclipse.tests;
-
-import android.app.Fragment;
-import android.os.Bundle;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-
-public class TestFragment extends Fragment {
-    @Override
-    public View onCreateView(LayoutInflater inflater, ViewGroup container,
-            Bundle savedInstanceState) {
-        return null;
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/aapterror1.xml b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/aapterror1.xml
deleted file mode 100644
index d72f4ba..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/aapterror1.xml
+++ /dev/null
@@ -1,12 +0,0 @@
-<FrameLayout
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="wrap_content"
-    android:layout_height="match_parent">
-    <TextView
-        android:layout_width="fill_parent"
-        android:layout_height="wrap_content"
-        android:layout_marginTop="50pt"
-        android:layout_marginLeft="50dp"
-        android:layout_marginBottom="50"
-    />
-</FrameLayout>
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/aapterror2.xml b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/aapterror2.xml
deleted file mode 100644
index b720daa..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/aapterror2.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<resources xmlns:android="http://schemas.android.com/apk/res/android">
-	<style name="repeatedStyle1">
-		<item name="android:gravity">left</item>
-	</style>
-	<style name="repeatedStyle1">
-		<item name="android:gravity">bottom</item>
-	</style>
-</resources>
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/aapterror3.xml b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/aapterror3.xml
deleted file mode 100644
index bc9c134..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/aapterror3.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<resources xmlns:android="http://schemas.android.com/apk/res/android">
-	<style name="wrongAttribute">
-		<item name="nonexistent">5</item>
-	</style>
-</resources>
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/aapterror4.xml b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/aapterror4.xml
deleted file mode 100644
index 28dd467..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/aapterror4.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<resources>
-    <style>
-        <item />
-    </style>
-    <item></item>
-</resources>
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/aapterror5.xml b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/aapterror5.xml
deleted file mode 100644
index ee89ac4..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/aapterror5.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<resources>
-    <style name="test">
-        <item name="android:layout_width"></item>
-    </style>
-</resources>
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/aapterror6.xml b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/aapterror6.xml
deleted file mode 100644
index e552ff7..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/aapterror6.xml
+++ /dev/null
@@ -1,11 +0,0 @@
-<FrameLayout
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="wrap_content"
-    android:layout_height="match_parent">
-    <TextView
-        android:layout_width="fill_parent"
-        android:layout_height="wrap_content"
-        android:layout_marginTop=""
-        android:layout_marginLeft=''
-    />
-</FrameLayout>
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/aapterror7.xml b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/aapterror7.xml
deleted file mode 100644
index d47f4ae..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/aapterror7.xml
+++ /dev/null
@@ -1,10 +0,0 @@
-<FrameLayout
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="wrap_content"
-    android:layout_height="match_parent">
-    <TextView
-        android:id=""
-        android:layout_width="fill_parent"
-        android:layout_height="wrap_content"
-    />
-</FrameLayout>
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/anim1-expected-completion53.txt b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/anim1-expected-completion53.txt
deleted file mode 100644
index 3e44918..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/anim1-expected-completion53.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-Code completion in anim1.xml for ^<set xmlns:
-<alpha />
-<rotate />
-<scale />
-<set ></set>
-<translate />
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/anim1-expected-completion54.txt b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/anim1-expected-completion54.txt
deleted file mode 100644
index f5e5cba..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/anim1-expected-completion54.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-Code completion in anim1.xml for ^<translate android:id=:
-<alpha />
-<rotate />
-<scale />
-<set ></set>
-<translate />
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/anim1-expected-completion55.txt b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/anim1-expected-completion55.txt
deleted file mode 100644
index 385f476..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/anim1-expected-completion55.txt
+++ /dev/null
@@ -1,16 +0,0 @@
-Code completion in anim1.xml for android:^fromXDelta=:
-android:fromXDelta : [float, fraction]
-android:toXDelta : [float, fraction]
-android:fromYDelta : [float, fraction]
-android:toYDelta : [float, fraction]
-android:interpolator : Defines the interpolator used to smooth the animation movement  in time.  [reference]
-android:fillEnabled : When set to true, the value of fillBefore is taken into account.  [boolean]
-android:fillBefore : When set to true or when fillEnabled is not set to true, the  animation transformation is applied before the animation has  started.  [boolean]
-android:fillAfter : When set to true, the animation transformation is applied after  the animation is over.  [boolean]
-android:duration : Amount of time (in milliseconds) for the animation to run.  [integer]
-android:startOffset : Delay in milliseconds before the animation runs, once start time  is reached.  [integer]
-android:repeatCount : Defines how many times the animation should repeat.  [integer, enum]
-android:repeatMode : Defines the animation behavior when it reaches the end and the  repeat count is greater than 0 or infinite.  [enum]
-android:zAdjustment : Allows for an adjustment of the Z ordering of the content being  animated for the duration of the animation.  [enum]
-android:background : Special background behind animation.  [color, reference]
-android:detachWallpaper : Special option for window animations: if this window is on top  of a wallpaper, don't animate the wallpaper with it.  [boolean]
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/anim1-expected-completion56.txt b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/anim1-expected-completion56.txt
deleted file mode 100644
index e12a66f..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/anim1-expected-completion56.txt
+++ /dev/null
@@ -1,14 +0,0 @@
-Code completion in anim1.xml for android:^fromAlpha=:
-android:fromAlpha : [float]
-android:toAlpha : [float]
-android:interpolator : Defines the interpolator used to smooth the animation movement  in time.  [reference]
-android:fillEnabled : When set to true, the value of fillBefore is taken into account.  [boolean]
-android:fillBefore : When set to true or when fillEnabled is not set to true, the  animation transformation is applied before the animation has  started.  [boolean]
-android:fillAfter : When set to true, the animation transformation is applied after  the animation is over.  [boolean]
-android:duration : Amount of time (in milliseconds) for the animation to run.  [integer]
-android:startOffset : Delay in milliseconds before the animation runs, once start time  is reached.  [integer]
-android:repeatCount : Defines how many times the animation should repeat.  [integer, enum]
-android:repeatMode : Defines the animation behavior when it reaches the end and the  repeat count is greater than 0 or infinite.  [enum]
-android:zAdjustment : Allows for an adjustment of the Z ordering of the content being  animated for the duration of the animation.  [enum]
-android:background : Special background behind animation.  [color, reference]
-android:detachWallpaper : Special option for window animations: if this window is on top  of a wallpaper, don't animate the wallpaper with it.  [boolean]
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/anim1-expected-completion57.txt b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/anim1-expected-completion57.txt
deleted file mode 100644
index 9225dac..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/anim1-expected-completion57.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-Code completion in anim1.xml for android:fromXDelta="100^%p":
-100% : <b>Fraction</b> - a percentage of the base size
-100%p : <b>Fraction</b> - a percentage relative to parent container
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/anim1.xml b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/anim1.xml
deleted file mode 100644
index 48fefc2..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/anim1.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<set xmlns:android="http://schemas.android.com/apk/res/android">
-    <translate android:id="@+id/test1"
-        android:fromXDelta="100%p"
-        android:pivotY="60%p"
-        android:toXDelta="40%p"
-        android:toYDelta="33%p"
-        android:fillBefore="true"
-        android:fillAfter="true"
-        android:startOffset="1000"
-        android:duration="1000" />
-    <alpha 
-        android:id="@+id/test2"
-        android:fromAlpha="1.0" 
-        android:toAlpha="0.0" 
-        android:startOffset="3000"
-        android:duration="250"
-        android:fillBefore="true"
-        android:fillAfter="false"
-    />
-</set>
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/animator1-expected-completion58.txt b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/animator1-expected-completion58.txt
deleted file mode 100644
index 0759415..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/animator1-expected-completion58.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-Code completion in animator1.xml for ^<set xmlns:
-<animator ></animator>
-<objectAnimator ></objectAnimator>
-<set ></set>
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/animator1-expected-completion59.txt b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/animator1-expected-completion59.txt
deleted file mode 100644
index 474fe77..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/animator1-expected-completion59.txt
+++ /dev/null
@@ -1,10 +0,0 @@
-Code completion in animator1.xml for android:^duration="2000":
-android:propertyName : Name of the property being animated.  [string]
-android:interpolator : Defines the interpolator used to smooth the animation movement  in time.  [reference]
-android:duration : Amount of time (in milliseconds) for the animation to run.  [integer]
-android:startOffset : Delay in milliseconds before the animation runs, once start time  is reached.  [integer]
-android:repeatCount : Defines how many times the animation should repeat.  [integer, enum]
-android:repeatMode : Defines the animation behavior when it reaches the end and the  repeat count is greater than 0 or infinite.  [enum]
-android:valueFrom : Value the animation starts from.  [integer, float, color, dimension]
-android:valueTo : Value the animation animates to.  [integer, float, color, dimension]
-android:valueType : The type of valueFrom and valueTo.  [enum]
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/animator1-expected-completion60.txt b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/animator1-expected-completion60.txt
deleted file mode 100644
index 3e5e6b1..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/animator1-expected-completion60.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-Code completion in animator1.xml for android:propertyName="scal^eX"/>:
-scaleX : scale of the view in the x direction.
-scaleY : scale of the view in the y direction.
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/animator1-expected-completion61.txt b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/animator1-expected-completion61.txt
deleted file mode 100644
index b298ac0..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/animator1-expected-completion61.txt
+++ /dev/null
@@ -1,19 +0,0 @@
-Code completion in animator1.xml for android:interpolator="^@android:anim/bounce_interpolator":
-@android:anim/accelerate_decelerate_interpolator
-@android:anim/accelerate_interpolator
-@android:anim/decelerate_interpolator
-@android:anim/anticipate_interpolator
-@android:anim/overshoot_interpolator
-@android:anim/anticipate_overshoot_interpolator
-@android:anim/bounce_interpolator
-@android:anim/linear_interpolator
-@android:anim/cycle_interpolator
-@android:
-@+id/
-@anim/
-@color/
-@drawable/
-@id/
-@layout/
-@string/
-@style/
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/animator1.xml b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/animator1.xml
deleted file mode 100644
index bdf10dc..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/animator1.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-<!-- Simple bounce animation -->
-<set xmlns:android="http://schemas.android.com/apk/res/android"
-    android:ordering="sequentially">
-    <set>
-	    <objectAnimator
-	        android:duration="2000"
-	        android:valueTo="310"
-	        android:propertyName="x"/>
-	    <objectAnimator
-	        android:duration="2000"
-	        android:valueTo="130"
-	        android:propertyName="y"
-	        android:interpolator="@android:anim/bounce_interpolator"/>
-	    <objectAnimator
-	        android:duration="2000"
-	        android:valueTo=".4"
-	        android:propertyName="scaleX"/>
-	    <objectAnimator
-	        android:duration="2000"
-	        android:valueTo=".4"
-	        android:propertyName="scaleY"/>
-    </set>
-    <objectAnimator
-        android:duration="500"
-        android:valueTo="0"
-        android:propertyName="alpha"/>
-</set>
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/broken1-expected-applyCompletion15.diff b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/broken1-expected-applyCompletion15.diff
deleted file mode 100644
index 4ce3540..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/broken1-expected-applyCompletion15.diff
+++ /dev/null
@@ -1,4 +0,0 @@
-Code completion in broken1.xml for android:textColorHigh^ selecting android:textColorHighlight:
-@@ -8 +8
--         android:textColorHigh^
-+         android:textColorHighlight="^"
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/broken1-expected-completion20.txt b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/broken1-expected-completion20.txt
deleted file mode 100644
index 063dc8c..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/broken1-expected-completion20.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-Code completion in broken1.xml for android:textColorHigh^:
-android:textColorHighlight : Color of the text selection highlight.  [color, reference]
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/broken1.xml b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/broken1.xml
deleted file mode 100644
index 161b981..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/broken1.xml
+++ /dev/null
@@ -1,12 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<LinearLayout
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent">
-    <Button
-        android:text="@string/app_name"
-        android:textColorHigh
-        android:layout_marginLeft="@android:dimen/app_icon_size"
-        android:id="@+id/button1"
-        ></Button>
-</LinearLayout>
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/broken2-expected-applyCompletion16.diff b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/broken2-expected-applyCompletion16.diff
deleted file mode 100644
index 3337ad2..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/broken2-expected-applyCompletion16.diff
+++ /dev/null
@@ -1,4 +0,0 @@
-Code completion in broken2.xml for style=^ selecting "@android:":
-@@ -9 +9
--         style=^
-+         style="@android:^"
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/broken2-expected-completion21.txt b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/broken2-expected-completion21.txt
deleted file mode 100644
index 1ee2585..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/broken2-expected-completion21.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-Code completion in broken2.xml for style=^:
-"@android:"
-"@+id/"
-"@drawable/"
-"@id/"
-"@layout/"
-"@string/"
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/broken2.xml b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/broken2.xml
deleted file mode 100644
index 60644b9..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/broken2.xml
+++ /dev/null
@@ -1,12 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<LinearLayout
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent">
-    <Button
-        android:text="@string/app_name"
-        android:layout_marginLeft="@android:dimen/app_icon_size"
-        style=
-        android:id="@+id/button1"
-        ></Button>
-</LinearLayout>
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/broken3-expected-applyCompletion14.diff b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/broken3-expected-applyCompletion14.diff
deleted file mode 100644
index 2787380..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/broken3-expected-applyCompletion14.diff
+++ /dev/null
@@ -1,4 +0,0 @@
-Code completion in broken3.xml for <EditT^ selecting EditText />:
-@@ -6 +6
--     <EditT^
-+     <EditText ^/>
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/broken3-expected-completion19.txt b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/broken3-expected-completion19.txt
deleted file mode 100644
index ccc6a4c..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/broken3-expected-completion19.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-Code completion in broken3.xml for <EditT^:
-EditText />
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/broken3.xml b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/broken3.xml
deleted file mode 100644
index b8b1685..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/broken3.xml
+++ /dev/null
@@ -1,12 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<LinearLayout
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent">
-    <EditT
-    <Button
-        android:text="@string/app_name"
-        android:layout_marginLeft="@android:dimen/app_icon_size"
-        android:id="@+id/button1"
-        ></Button>
-</LinearLayout>
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/color1-expected-completion45.txt b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/color1-expected-completion45.txt
deleted file mode 100644
index c799b80..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/color1-expected-completion45.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-Code completion in color1.xml for ^<selector:
-<selector ></selector> : Required. This must be the root element. Contains one or more <item> elements.
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/color1-expected-completion46a.txt b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/color1-expected-completion46a.txt
deleted file mode 100644
index 32f0066..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/color1-expected-completion46a.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-Code completion in color1.xml for ^<item android:
-<item /> : Drawable states.
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/color1-expected-completion46b.txt b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/color1-expected-completion46b.txt
deleted file mode 100644
index def6d13..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/color1-expected-completion46b.txt
+++ /dev/null
@@ -1,20 +0,0 @@
-Code completion in color1.xml for <item ^android:state_focused="true"/>:
-android:state_focused : State value for StateListDrawable, set when a view has input  focus.  [boolean]
-android:state_window_focused : State value for StateListDrawable, set when a view's window has  input focus.  [boolean]
-android:state_enabled : State value for StateListDrawable, set when a view is enabled.  [boolean]
-android:state_checkable : State identifier indicating that the object <var>may</var> display  a check mark.  [boolean]
-android:state_checked : State identifier indicating that the object is currently checked.  [boolean]
-android:state_selected : State value for StateListDrawable, set when a view (or one of  its parents) is currently selected.  [boolean]
-android:state_pressed : State value for StateListDrawable, set when the user is pressing  down in a view.  [boolean]
-android:state_activated : State value for StateListDrawable, set when a view or its parent  has been "activated" meaning the user has currently marked it  as being of interest.  [boolean]
-android:state_active : State value for StateListDrawable.  [boolean]
-android:state_single : State value for StateListDrawable.  [boolean]
-android:state_first : State value for StateListDrawable.  [boolean]
-android:state_middle : State value for StateListDrawable.  [boolean]
-android:state_last : State value for StateListDrawable.  [boolean]
-android:state_accelerated : State value for StateListDrawable, indicating that the Drawable  is in a view that is hardware accelerated.  [boolean]
-android:state_hovered : State value for StateListDrawable, set when a pointer is hovering  over the view.  [boolean]
-android:state_drag_can_accept : State for StateListDrawable indicating that the Drawable is in  a view that is capable of accepting a drop of the content currently  being manipulated in a drag-and-drop operation.  [boolean]
-android:state_drag_hovered : State for StateListDrawable indicating that a drag operation  (for which the Drawable's view is a valid recipient) is currently  positioned over the Drawable.  [boolean]
-android:state_accessibility_focused : State for StateListDrawable indicating that a View has accessibility  focus.  [boolean]
-android:color : Hexadeximal color. Required. The color is specified with an RGB value and optional alpha channel. The value always begins with a pound (#) character and then followed by the Alpha-Red-Green-Blue information in one of the following formats: * RGB * ARGB * RRGGBB * AARRGGBB
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/color1.xml b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/color1.xml
deleted file mode 100644
index a8482ab..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/color1.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<selector
-  xmlns:android="http://schemas.android.com/apk/res/android">
-    <item android:state_focused="true"/>
-    <item />
-</selector>
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion1-actual-applyCompletion1.xml b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion1-actual-applyCompletion1.xml
deleted file mode 100644
index 2413658..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion1-actual-applyCompletion1.xml
+++ /dev/null
@@ -1,19 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android">
-<!--  
-  This file deliberately contains errors - it represents partial keyboard
-  typing for interactive code completion
--->
-    <TextView
-        android:layout_weight^="fill_parent"
-        android:layout_height="wrap_content"
-        android:layout_marginTop="@android:dimen/app_icon_size"
-        android:layout_marginLeft="50dp"
-        android:layout_marginBottom="50"
-        android:textColor="#000000"
-        style="@android:style/Widget.Button"
-        android:gravity="left|bottom"
-        android:text="@string/hello"
-        android:hint="hint" />
-    <FrameLayout android:foreground="@android:drawable/btn_default"></FrameLayout> 
-</LinearLayout>
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion1-expected-applyCompletion1.diff b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion1-expected-applyCompletion1.diff
deleted file mode 100644
index 6b05566..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion1-expected-applyCompletion1.diff
+++ /dev/null
@@ -1,4 +0,0 @@
-Code completion in completion1.xml for layout_w^idth="fill_parent" selecting android:layout_weight:
-@@ -8 +8
--         android:layout_w^idth="fill_parent"
-+         android:layout_weight^="fill_parent"
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion1-expected-applyCompletion10.diff b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion1-expected-applyCompletion10.diff
deleted file mode 100644
index 7b448c2..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion1-expected-applyCompletion10.diff
+++ /dev/null
@@ -1,4 +0,0 @@
-Code completion in completion1.xml for <T^extView selecting TableLayout:
-@@ -7 +7
--     <T^extView
-+     <TableLayout^
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion1-expected-applyCompletion11a.diff b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion1-expected-applyCompletion11a.diff
deleted file mode 100644
index 1a5f24d..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion1-expected-applyCompletion11a.diff
+++ /dev/null
@@ -1,4 +0,0 @@
-Code completion in completion1.xml for ^<TextView selecting <RadioGroup ></RadioGroup>:
-@@ -7 +7
--     ^<TextView
-+     <RadioGroup ^></RadioGroup><TextView
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion1-expected-applyCompletion11b.diff b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion1-expected-applyCompletion11b.diff
deleted file mode 100644
index 9010bf6..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion1-expected-applyCompletion11b.diff
+++ /dev/null
@@ -1,4 +0,0 @@
-Code completion in completion1.xml for ^<TextView selecting <CheckBox />:
-@@ -7 +7
--     ^<TextView
-+     <CheckBox ^/><TextView
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion1-expected-applyCompletion12.diff b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion1-expected-applyCompletion12.diff
deleted file mode 100644
index a7a4638..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion1-expected-applyCompletion12.diff
+++ /dev/null
@@ -1,4 +0,0 @@
-Code completion in completion1.xml for btn_default">^</FrameLayout> selecting <FrameLayout ></FrameLayout>:
-@@ -18 +18
--     <FrameLayout android:foreground="@android:drawable/btn_default">^</FrameLayout> 
-+     <FrameLayout android:foreground="@android:drawable/btn_default"><FrameLayout ^></FrameLayout></FrameLayout> 
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion1-expected-applyCompletion2.diff b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion1-expected-applyCompletion2.diff
deleted file mode 100644
index 7776131..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion1-expected-applyCompletion2.diff
+++ /dev/null
@@ -1,4 +0,0 @@
-Code completion in completion1.xml for layout_width="^fill_parent" selecting match_parent:
-@@ -8 +8
--         android:layout_width="^fill_parent"
-+         android:layout_width="match_parent"^
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion1-expected-applyCompletion3.diff b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion1-expected-applyCompletion3.diff
deleted file mode 100644
index e67a336..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion1-expected-applyCompletion3.diff
+++ /dev/null
@@ -1,4 +0,0 @@
-Code completion in completion1.xml for layout_width="fi^ll_parent" selecting fill_parent:
-@@ -8 +8
--         android:layout_width="fi^ll_parent"
-+         android:layout_width="fill_parent"^
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion1-expected-applyCompletion39.diff b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion1-expected-applyCompletion39.diff
deleted file mode 100644
index fe63acd..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion1-expected-applyCompletion39.diff
+++ /dev/null
@@ -1,4 +0,0 @@
-Code completion in completion1.xml for marginBottom="50"^ selecting  android:maxEms:
-@@ -12 +12
--         android:layout_marginBottom="50"^
-+         android:layout_marginBottom="50" android:maxEms="^"
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion1-expected-applyCompletion4.diff b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion1-expected-applyCompletion4.diff
deleted file mode 100644
index 2d229f3..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion1-expected-applyCompletion4.diff
+++ /dev/null
@@ -1,4 +0,0 @@
-Code completion in completion1.xml for marginBottom="50^" selecting 50mm:
-@@ -12 +12
--         android:layout_marginBottom="50^"
-+         android:layout_marginBottom="50mm"^
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion1-expected-applyCompletion5.diff b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion1-expected-applyCompletion5.diff
deleted file mode 100644
index 5a2b413..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion1-expected-applyCompletion5.diff
+++ /dev/null
@@ -1,4 +0,0 @@
-Code completion in completion1.xml for layout_marginLeft="50d^p" selecting 50dp:
-@@ -11 +11
--         android:layout_marginLeft="50d^p"
-+         android:layout_marginLeft="50dp"^
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion1-expected-applyCompletion6.diff b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion1-expected-applyCompletion6.diff
deleted file mode 100644
index d3a8c11..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion1-expected-applyCompletion6.diff
+++ /dev/null
@@ -1,4 +0,0 @@
-Code completion in completion1.xml for style="@android:^style/Widget.Button" selecting @android:drawable/:
-@@ -14 +14
--         style="@android:^style/Widget.Button"
-+         style="@android:drawable/^"
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion1-expected-applyCompletion7a.diff b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion1-expected-applyCompletion7a.diff
deleted file mode 100644
index afd7e21..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion1-expected-applyCompletion7a.diff
+++ /dev/null
@@ -1,4 +0,0 @@
-Code completion in completion1.xml for android:gravity="l^eft|bottom" selecting left:
-@@ -15 +15
--         android:gravity="l^eft|bottom"
-+         android:gravity="left^"
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion1-expected-applyCompletion7b.diff b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion1-expected-applyCompletion7b.diff
deleted file mode 100644
index 73f2bd4..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion1-expected-applyCompletion7b.diff
+++ /dev/null
@@ -1,4 +0,0 @@
-Code completion in completion1.xml for android:gravity="left|b^ottom" selecting bottom:
-@@ -15 +15
--         android:gravity="left|b^ottom"
-+         android:gravity="left|bottom^"
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion1-expected-applyCompletion8.diff b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion1-expected-applyCompletion8.diff
deleted file mode 100644
index 655afc5..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion1-expected-applyCompletion8.diff
+++ /dev/null
@@ -1,2 +0,0 @@
-Code completion in completion1.xml for layout_width^="fill_parent" selecting android:layout_width:
-No changes
\ No newline at end of file
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion1-expected-applyCompletion9.diff b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion1-expected-applyCompletion9.diff
deleted file mode 100644
index 1b4198e..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion1-expected-applyCompletion9.diff
+++ /dev/null
@@ -1,4 +0,0 @@
-Code completion in completion1.xml for layout_width=^"fill_parent" selecting "wrap_content":
-@@ -8 +8
--         android:layout_width=^"fill_parent"
-+         android:layout_width="wrap_content"^
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion1-expected-completion1.txt b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion1-expected-completion1.txt
deleted file mode 100644
index c3e75ad..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion1-expected-completion1.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-Code completion in completion1.xml for layout_w^idth="fill_parent":
-android:layout_width : Specifies the basic width of the view.  [dimension, enum]
-android:layout_weight : [float]
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion1-expected-completion10.txt b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion1-expected-completion10.txt
deleted file mode 100644
index 973d95e..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion1-expected-completion10.txt
+++ /dev/null
@@ -1,11 +0,0 @@
-Code completion in completion1.xml for <T^extView:
-TabHost
-TabWidget
-TableLayout
-TableRow
-TextSwitcher
-TextView
-TextureView
-TimePicker
-ToggleButton
-TwoLineListItem
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion1-expected-completion11.txt b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion1-expected-completion11.txt
deleted file mode 100644
index 20dad3a..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion1-expected-completion11.txt
+++ /dev/null
@@ -1,67 +0,0 @@
-Code completion in completion1.xml for ^<TextView:
-<AbsoluteLayout ></AbsoluteLayout>
-<AdapterViewFlipper ></AdapterViewFlipper>
-<AnalogClock />
-<AutoCompleteTextView />
-<Button />
-<CalendarView />
-<CheckBox />
-<CheckedTextView />
-<Chronometer />
-<DatePicker />
-<DialerFilter ></DialerFilter>
-<DigitalClock />
-<EditText />
-<ExpandableListView ></ExpandableListView>
-<FrameLayout ></FrameLayout>
-<Gallery />
-<GridLayout ></GridLayout>
-<GridView ></GridView>
-<HorizontalScrollView ></HorizontalScrollView>
-<ImageButton />
-<ImageSwitcher ></ImageSwitcher>
-<ImageView />
-<LinearLayout ></LinearLayout>
-<ListView ></ListView>
-<MediaController ></MediaController>
-<MultiAutoCompleteTextView />
-<NumberPicker />
-<ProgressBar />
-<QuickContactBadge />
-<RadioButton />
-<RadioGroup ></RadioGroup>
-<RatingBar />
-<RelativeLayout ></RelativeLayout>
-<ScrollView ></ScrollView>
-<SearchView ></SearchView>
-<SeekBar />
-<SlidingDrawer ></SlidingDrawer> : SlidingDrawer specific attributes.
-<Space />
-<Spinner />
-<StackView ></StackView>
-<SurfaceView />
-<Switch />
-<TabHost ></TabHost>
-<TabWidget ></TabWidget>
-<TableLayout ></TableLayout>
-<TableRow ></TableRow>
-<TextSwitcher ></TextSwitcher>
-<TextView />
-<TextureView />
-<TimePicker />
-<ToggleButton />
-<TwoLineListItem />
-<VideoView />
-<View /> : Attributes that can be used with android.view.View or any of its subclasses.
-<ViewAnimator ></ViewAnimator>
-<ViewFlipper ></ViewFlipper>
-<ViewStub /> : A android.view.ViewStub lets you lazily include other XML layouts inside your application  at runtime.
-<ViewSwitcher ></ViewSwitcher>
-<WebView />
-<ZoomButton />
-<ZoomControls />
-<android.gesture.GestureOverlayView ></android.gesture.GestureOverlayView> : GestureOverlayView specific attributes.
-<fragment /> : A Fragment is a piece of an application's user interface or behavior  that can be placed in an Activity
-<include /> : Lets you statically include XML layouts inside other XML layouts.
-<requestFocus /> : Requests focus for the parent element or one of its descendants
-<view /> : A view tag whose class attribute names the class to be instantiated
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion1-expected-completion12.txt b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion1-expected-completion12.txt
deleted file mode 100644
index 8da18db..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion1-expected-completion12.txt
+++ /dev/null
@@ -1,67 +0,0 @@
-Code completion in completion1.xml for btn_default">^</FrameLayout>:
-<AbsoluteLayout ></AbsoluteLayout>
-<AdapterViewFlipper ></AdapterViewFlipper>
-<AnalogClock />
-<AutoCompleteTextView />
-<Button />
-<CalendarView />
-<CheckBox />
-<CheckedTextView />
-<Chronometer />
-<DatePicker />
-<DialerFilter ></DialerFilter>
-<DigitalClock />
-<EditText />
-<ExpandableListView ></ExpandableListView>
-<FrameLayout ></FrameLayout>
-<Gallery />
-<GridLayout ></GridLayout>
-<GridView ></GridView>
-<HorizontalScrollView ></HorizontalScrollView>
-<ImageButton />
-<ImageSwitcher ></ImageSwitcher>
-<ImageView />
-<LinearLayout ></LinearLayout>
-<ListView ></ListView>
-<MediaController ></MediaController>
-<MultiAutoCompleteTextView />
-<NumberPicker />
-<ProgressBar />
-<QuickContactBadge />
-<RadioButton />
-<RadioGroup ></RadioGroup>
-<RatingBar />
-<RelativeLayout ></RelativeLayout>
-<ScrollView ></ScrollView>
-<SearchView ></SearchView>
-<SeekBar />
-<SlidingDrawer ></SlidingDrawer> : SlidingDrawer specific attributes.
-<Space />
-<Spinner />
-<StackView ></StackView>
-<SurfaceView />
-<Switch />
-<TabHost ></TabHost>
-<TabWidget ></TabWidget>
-<TableLayout ></TableLayout>
-<TableRow ></TableRow>
-<TextSwitcher ></TextSwitcher>
-<TextView />
-<TextureView />
-<TimePicker />
-<ToggleButton />
-<TwoLineListItem />
-<VideoView />
-<View /> : Attributes that can be used with android.view.View or any of its subclasses.
-<ViewAnimator ></ViewAnimator>
-<ViewFlipper ></ViewFlipper>
-<ViewStub /> : A android.view.ViewStub lets you lazily include other XML layouts inside your application  at runtime.
-<ViewSwitcher ></ViewSwitcher>
-<WebView />
-<ZoomButton />
-<ZoomControls />
-<android.gesture.GestureOverlayView ></android.gesture.GestureOverlayView> : GestureOverlayView specific attributes.
-<fragment /> : A Fragment is a piece of an application's user interface or behavior  that can be placed in an Activity
-<include /> : Lets you statically include XML layouts inside other XML layouts.
-<requestFocus /> : Requests focus for the parent element or one of its descendants
-<view /> : A view tag whose class attribute names the class to be instantiated
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion1-expected-completion2.txt b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion1-expected-completion2.txt
deleted file mode 100644
index 136a6fe..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion1-expected-completion2.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-Code completion in completion1.xml for layout_width="^fill_parent":
-fill_parent
-match_parent
-wrap_content
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion1-expected-completion3.txt b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion1-expected-completion3.txt
deleted file mode 100644
index 09c27ce..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion1-expected-completion3.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-Code completion in completion1.xml for layout_width="fi^ll_parent":
-fill_parent
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion1-expected-completion39.txt b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion1-expected-completion39.txt
deleted file mode 100644
index 2ac2d31..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion1-expected-completion39.txt
+++ /dev/null
@@ -1,156 +0,0 @@
-Code completion in completion1.xml for marginBottom="50"^:
-style : A reference to a custom style  [reference]
-android:bufferType : Determines the minimum type that getText() will return.  [enum]
-android:text : Text to display.  [string]
-android:hint : Hint text to display when the text is empty.  [string]
-android:textColor : Text color.  [color, reference]
-android:textColorHighlight : Color of the text selection highlight.  [color, reference]
-android:textColorHint : Color of the hint text.  [color, reference]
-android:textAppearance : Base text color, typeface, size, and style.  [reference]
-android:textSize : Size of the text.  [dimension]
-android:textScaleX : Sets the horizontal scaling factor for the text.  [float]
-android:typeface : Typeface (normal, sans, serif, monospace) for the text.  [enum]
-android:textStyle : Style (bold, italic, bolditalic) for the text.  [flag]
-android:fontFamily : Font family (named by string) for the text.  [string]
-android:textColorLink : Text color for links.  [color, reference]
-android:cursorVisible : Makes the cursor visible (the default) or invisible.  [boolean]
-android:maxLines : Makes the TextView be at most this many lines tall.  [integer]
-android:maxHeight : Makes the TextView be at most this many pixels tall.  [dimension]
-android:lines : Makes the TextView be exactly this many lines tall.  [integer]
-android:height : Makes the TextView be exactly this many pixels tall.  [dimension]
-android:minLines : Makes the TextView be at least this many lines tall.  [integer]
-android:minHeight : Makes the TextView be at least this many pixels tall.  [dimension]
-android:maxEms : Makes the TextView be at most this many ems wide.  [integer]
-android:maxWidth : Makes the TextView be at most this many pixels wide.  [dimension]
-android:ems : Makes the TextView be exactly this many ems wide.  [integer]
-android:width : Makes the TextView be exactly this many pixels wide.  [dimension]
-android:minEms : Makes the TextView be at least this many ems wide.  [integer]
-android:minWidth : Makes the TextView be at least this many pixels wide.  [dimension]
-android:gravity : Specifies how to align the text by the view's x- and/or y-axis  when the text is smaller than the view.  [flag]
-android:scrollHorizontally : Whether the text is allowed to be wider than the view (and therefore  can be scrolled horizontally).  [boolean]
-android:password : Whether the characters of the field are displayed as password  dots instead of themselves. * Deprecated: Use inputType instead.  [boolean]
-android:singleLine : Constrains the text to a single horizontally scrolling line instead  of letting it wrap onto multiple lines, and advances focus instead  of inserting a newline when you press the enter key. * Deprecated: This attribute is deprecated. Use "maxLines" instead  to change the layo...
-android:enabled : Specifies whether the widget is enabled.  [boolean]
-android:selectAllOnFocus : If the text is selectable, select it all when the view takes  focus.  [boolean]
-android:includeFontPadding : Leave enough room for ascenders and descenders instead of using  the font ascent and descent strictly.  [boolean]
-android:maxLength : Set an input filter to constrain the text length to the specified  number.  [integer]
-android:shadowColor : Place a shadow of the specified color behind the text.  [color]
-android:shadowDx : Horizontal offset of the shadow.  [float]
-android:shadowDy : Vertical offset of the shadow.  [float]
-android:shadowRadius : Radius of the shadow.  [float]
-android:autoLink : Controls whether links such as urls and email addresses are automatically  found and converted to clickable links.  [flag]
-android:linksClickable : If set to false, keeps the movement method from being set to  the link movement method even if autoLink causes links to be  found.  [boolean]
-android:numeric : If set, specifies that this TextView has a numeric input method. * Deprecated: Use inputType instead.  [flag]
-android:digits : If set, specifies that this TextView has a numeric input method  and that these specific characters are the ones that it will  accept.  [string]
-android:phoneNumber : If set, specifies that this TextView has a phone number input  method. * Deprecated: Use inputType instead.  [boolean]
-android:inputMethod : If set, specifies that this TextView should use the specified  input method (specified by fully-qualified class name). * Deprecated: Use inputType instead.  [string]
-android:capitalize : If set, specifies that this TextView has a textual input method  and should automatically capitalize what the user types. * Deprecated: Use inputType instead.  [enum]
-android:autoText : If set, specifies that this TextView has a textual input method  and automatically corrects some common spelling errors. * Deprecated: Use inputType instead.  [boolean]
-android:editable : If set, specifies that this TextView has an input method. * Deprecated: Use inputType instead.  [boolean]
-android:freezesText : If set, the text view will include its current complete text  inside of its frozen icicle in addition to meta-data such as  the current cursor position.  [boolean]
-android:ellipsize : If set, causes words that are longer than the view is wide to  be ellipsized instead of broken in the middle.  [enum]
-android:drawableTop : The drawable to be drawn above the text.  [color, reference]
-android:drawableBottom : The drawable to be drawn below the text.  [color, reference]
-android:drawableLeft : The drawable to be drawn to the left of the text.  [color, reference]
-android:drawableRight : The drawable to be drawn to the right of the text.  [color, reference]
-android:drawableStart : The drawable to be drawn to the start of the text.  [color, reference]
-android:drawableEnd : The drawable to be drawn to the end of the text.  [color, reference]
-android:drawablePadding : The padding between the drawables and the text.  [dimension]
-android:lineSpacingExtra : Extra spacing between lines of text.  [dimension]
-android:lineSpacingMultiplier : Extra spacing between lines of text, as a multiplier.  [float]
-android:marqueeRepeatLimit : The number of times to repeat the marquee animation.  [integer, enum]
-android:inputType : The type of data being placed in a text field, used to help an  input method decide how to let the user enter text.  [flag]
-android:imeOptions : Additional features you can enable in an IME associated with  an editor to improve the integration with your application.  [flag]
-android:privateImeOptions : An addition content type description to supply to the input method  attached to the text view, which is private to the implementation  of the input method.  [string]
-android:imeActionLabel : Supply a value for EditorInfo.actionLabel used when an input  method is connected to the text view.  [string]
-android:imeActionId : Supply a value for EditorInfo.actionId used when an input method  is connected to the text view.  [integer]
-android:editorExtras : Reference to an "input-extras" XML resource containing additional  data to supply to an input method, which is private to the implementation  of the input method.  [reference]
-android:textSelectHandleLeft : Reference to a drawable that will be used to display a text selection  anchor on the left side of a selection region.  [reference]
-android:textSelectHandleRight : Reference to a drawable that will be used to display a text selection  anchor on the right side of a selection region.  [reference]
-android:textSelectHandle : Reference to a drawable that will be used to display a text selection  anchor for positioning the cursor within text.  [reference]
-android:textEditPasteWindowLayout : The layout of the view that is displayed on top of the cursor  to paste inside a TextEdit field.  [reference]
-android:textEditNoPasteWindowLayout : Variation of textEditPasteWindowLayout displayed when the clipboard  is empty.  [reference]
-android:textEditSidePasteWindowLayout : Used instead of textEditPasteWindowLayout when the window is  moved on the side of the insertion cursor because it would be  clipped if it were positioned on top.  [reference]
-android:textEditSideNoPasteWindowLayout : Variation of textEditSidePasteWindowLayout displayed when the  clipboard is empty.  [reference]
-android:textEditSuggestionItemLayout : Layout of the TextView item that will populate the suggestion  popup window.  [reference]
-android:textCursorDrawable : Reference to a drawable that will be drawn under the insertion  cursor.  [reference]
-android:textIsSelectable : Indicates that the content of a non-editable text can be selected.  [boolean]
-android:textAllCaps : Present the text in ALL CAPS.  [boolean]
-android:id : Supply an identifier name for this view, to later retrieve it  with View.findViewById() or Activity.findViewById().  [reference]
-android:tag : Supply a tag for this view containing a String, to be retrieved  later with View.getTag() or searched for with View.findViewWithTag() .  [string]
-android:scrollX : The initial horizontal scroll offset, in pixels.  [dimension]
-android:scrollY : The initial vertical scroll offset, in pixels.  [dimension]
-android:background : A drawable to use as the background.  [color, reference]
-android:padding : Sets the padding, in pixels, of all four edges.  [dimension]
-android:paddingLeft : Sets the padding, in pixels, of the left edge; see padding.  [dimension]
-android:paddingTop : Sets the padding, in pixels, of the top edge; see padding.  [dimension]
-android:paddingRight : Sets the padding, in pixels, of the right edge; see padding.  [dimension]
-android:paddingBottom : Sets the padding, in pixels, of the bottom edge; see padding.  [dimension]
-android:paddingStart : Sets the padding, in pixels, of the start edge; see padding.  [dimension]
-android:paddingEnd : Sets the padding, in pixels, of the end edge; see padding.  [dimension]
-android:focusable : Boolean that controls whether a view can take focus.  [boolean]
-android:focusableInTouchMode : Boolean that controls whether a view can take focus while in  touch mode.  [boolean]
-android:visibility : Controls the initial visibility of the view.  [enum]
-android:fitsSystemWindows : Boolean internal attribute to adjust view layout based on system  windows such as the status bar.  [boolean]
-android:scrollbars : Defines which scrollbars should be displayed on scrolling or  not.  [flag]
-android:scrollbarStyle : Controls the scrollbar style and position.  [enum]
-android:isScrollContainer : Set this if the view will serve as a scrolling container, meaing  that it can be resized to shrink its overall window so that there  will be space for an input method.  [boolean]
-android:fadeScrollbars : Defines whether to fade out scrollbars when they are not in use.  [boolean]
-android:scrollbarFadeDuration : Defines the delay in milliseconds that a scrollbar takes to fade  out.  [integer]
-android:scrollbarDefaultDelayBeforeFade : Defines the delay in milliseconds that a scrollbar waits before  fade out.  [integer]
-android:scrollbarSize : Sets the width of vertical scrollbars and height of horizontal  scrollbars.  [dimension]
-android:scrollbarThumbHorizontal : Defines the horizontal scrollbar thumb drawable.  [reference]
-android:scrollbarThumbVertical : Defines the vertical scrollbar thumb drawable.  [reference]
-android:scrollbarTrackHorizontal : Defines the horizontal scrollbar track drawable.  [reference]
-android:scrollbarTrackVertical : Defines the vertical scrollbar track drawable.  [reference]
-android:scrollbarAlwaysDrawHorizontalTrack : Defines whether the horizontal scrollbar track should always  be drawn.  [boolean]
-android:scrollbarAlwaysDrawVerticalTrack : Defines whether the vertical scrollbar track should always be  drawn.  [boolean]
-android:fadingEdge : This attribute is deprecated and will be ignored as of API level  14 (ICE_CREAM_SANDWICH).  [flag]
-android:requiresFadingEdge : Defines which edges should be faded on scrolling.  [flag]
-android:fadingEdgeLength : Defines the length of the fading edges.  [dimension]
-android:nextFocusLeft : Defines the next view to give focus to when the next focus is FOCUS_LEFT.  [reference]
-android:nextFocusRight : Defines the next view to give focus to when the next focus is FOCUS_RIGHT If the reference refers to a view that does not exist or is  part of a hierarchy that is invisible, a java.lang.RuntimeException will result when the  reference is accessed.  [reference]
-android:nextFocusUp : Defines the next view to give focus to when the next focus is FOCUS_UP If the reference refers to a view that does not exist or is  part of a hierarchy that is invisible, a java.lang.RuntimeException will result when the  reference is accessed.  [reference]
-android:nextFocusDown : Defines the next view to give focus to when the next focus is FOCUS_DOWN If the reference refers to a view that does not exist or is  part of a hierarchy that is invisible, a java.lang.RuntimeException will result when the  reference is accessed.  [reference]
-android:nextFocusForward : Defines the next view to give focus to when the next focus is FOCUS_FORWARD If the reference refers to a view that does not exist or is  part of a hierarchy that is invisible, a java.lang.RuntimeException will result when the  reference is accessed.  [reference]
-android:clickable : Defines whether this view reacts to click events.  [boolean]
-android:longClickable : Defines whether this view reacts to long click events.  [boolean]
-android:saveEnabled : If unset, no state will be saved for this view when it is being  frozen.  [boolean]
-android:filterTouchesWhenObscured : Specifies whether to filter touches when the view's window is  obscured by another visible window.  [boolean]
-android:drawingCacheQuality : Defines the quality of translucent drawing caches.  [enum]
-android:keepScreenOn : Controls whether the view's window should keep the screen on  while visible.  [boolean]
-android:duplicateParentState : When this attribute is set to true, the view gets its drawable  state (focused, pressed, etc.) from its direct parent rather  than from itself.  [boolean]
-android:minHeight : Defines the minimum height of the view.
-android:minWidth : Defines the minimum width of the view.
-android:soundEffectsEnabled : Boolean that controls whether a view should have sound effects  enabled for events such as clicking and touching.  [boolean]
-android:hapticFeedbackEnabled : Boolean that controls whether a view should have haptic feedback  enabled for events such as long presses.  [boolean]
-android:contentDescription : Defines text that briefly describes content of the view.  [string]
-android:onClick : Name of the method in this View's context to invoke when the  view is clicked.  [string]
-android:overScrollMode : Defines over-scrolling behavior.  [enum]
-android:alpha : alpha property of the view, as a value between 0 (completely  transparent) and 1 (completely opaque).  [float]
-android:translationX : translation in x of the view.  [dimension]
-android:translationY : translation in y of the view.  [dimension]
-android:transformPivotX : x location of the pivot point around which the view will rotate  and scale.  [dimension]
-android:transformPivotY : y location of the pivot point around which the view will rotate  and scale.  [dimension]
-android:rotation : rotation of the view, in degrees.  [float]
-android:rotationX : rotation of the view around the x axis, in degrees.  [float]
-android:rotationY : rotation of the view around the y axis, in degrees.  [float]
-android:scaleX : scale of the view in the x direction.  [float]
-android:scaleY : scale of the view in the y direction.  [float]
-android:verticalScrollbarPosition : Determines which side the vertical scroll bar should be placed  on.  [enum]
-android:layerType : Specifies the type of layer backing this view.  [enum]
-android:layoutDirection : Defines the direction of layout drawing.  [enum]
-android:textDirection : Direction of the text.  [integer, enum]
-android:textAlignment : Alignment of the text.  [integer, enum]
-android:importantForAccessibility : Controls how this View is important for accessibility which is  if it fires accessibility events and if it is reported to accessibility  services that query the screen.  [integer, enum]
-android:layout_width : Specifies the basic width of the view.  [dimension, enum]
-android:layout_height : Specifies the basic height of the view.  [dimension, enum]
-android:layout_weight : [float]
-android:layout_gravity : Standard gravity constant that a child can supply to its parent.  [flag]
-android:layout_margin : Specifies extra space on the left, top, right and bottom sides  of this view.  [dimension]
-android:layout_marginLeft : Specifies extra space on the left side of this view.  [dimension]
-android:layout_marginTop : Specifies extra space on the top side of this view.  [dimension]
-android:layout_marginRight : Specifies extra space on the right side of this view.  [dimension]
-android:layout_marginBottom : Specifies extra space on the bottom side of this view.  [dimension]
-android:layout_marginStart : Specifies extra space on the start side of this view.  [dimension]
-android:layout_marginEnd : Specifies extra space on the end side of this view.  [dimension]
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion1-expected-completion4.txt b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion1-expected-completion4.txt
deleted file mode 100644
index a9111eb..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion1-expected-completion4.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-Code completion in completion1.xml for marginBottom="50^":
-50dp : <b>Density-independent Pixels</b> - an abstract unit that is based on the physical density of the screen.
-50sp : <b>Scale-independent Pixels</b> - this is like the dp unit, but it is also scaled by the user's font size preference.
-50pt : <b>Points</b> - 1/72 of an inch based on the physical size of the screen.
-50mm : <b>Millimeters</b> - based on the physical size of the screen.
-50in : <b>Inches</b> - based on the physical size of the screen.
-50px : <b>Pixels</b> - corresponds to actual pixels on the screen. Not recommended.
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion1-expected-completion5.txt b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion1-expected-completion5.txt
deleted file mode 100644
index 6b1c993..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion1-expected-completion5.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-Code completion in completion1.xml for layout_marginLeft="50d^p":
-50dp : <b>Density-independent Pixels</b> - an abstract unit that is based on the physical density of the screen.
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion1-expected-completion6.txt b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion1-expected-completion6.txt
deleted file mode 100644
index 99f92b8..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion1-expected-completion6.txt
+++ /dev/null
@@ -1,23 +0,0 @@
-Code completion in completion1.xml for style="@android:^style/Widget.Button":
-@android:style/
-@android:anim/
-@android:animator/
-@android:array/
-@android:attr/
-@android:bool/
-@android:color/
-@android:declare-styleable/
-@android:dimen/
-@android:drawable/
-@android:fraction/
-@android:id/
-@android:integer/
-@android:interpolator/
-@android:layout/
-@android:menu/
-@android:mipmap/
-@android:plurals/
-@android:public/
-@android:raw/
-@android:string/
-@android:xml/
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion1-expected-completion7a.txt b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion1-expected-completion7a.txt
deleted file mode 100644
index cf373ad..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion1-expected-completion7a.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-Code completion in completion1.xml for android:gravity="l^eft|bottom":
-left
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion1-expected-completion7b.txt b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion1-expected-completion7b.txt
deleted file mode 100644
index 66276d6..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion1-expected-completion7b.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-Code completion in completion1.xml for android:gravity="left|b^ottom":
-bottom
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion1-expected-completion8.txt b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion1-expected-completion8.txt
deleted file mode 100644
index a364bc3..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion1-expected-completion8.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-Code completion in completion1.xml for layout_width^="fill_parent":
-android:layout_width : Specifies the basic width of the view.  [dimension, enum]
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion1-expected-completion9.txt b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion1-expected-completion9.txt
deleted file mode 100644
index ab6a0d2..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion1-expected-completion9.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-Code completion in completion1.xml for layout_width=^"fill_parent":
-"fill_parent"
-"match_parent"
-"wrap_content"
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion1.xml b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion1.xml
deleted file mode 100644
index d523eeb..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion1.xml
+++ /dev/null
@@ -1,19 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android">
-<!--  
-  This file deliberately contains errors - it represents partial keyboard
-  typing for interactive code completion
--->
-    <TextView
-        android:layout_width="fill_parent"
-        android:layout_height="wrap_content"
-        android:layout_marginTop="@android:dimen/app_icon_size"
-        android:layout_marginLeft="50dp"
-        android:layout_marginBottom="50"
-        android:textColor="#000000"
-        style="@android:style/Widget.Button"
-        android:gravity="left|bottom"
-        android:text="@string/hello"
-        android:hint="hint" />
-    <FrameLayout android:foreground="@android:drawable/btn_default"></FrameLayout> 
-</LinearLayout>
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion10-expected-applyCompletion42.diff b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion10-expected-applyCompletion42.diff
deleted file mode 100644
index af28a13..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion10-expected-applyCompletion42.diff
+++ /dev/null
@@ -1,4 +0,0 @@
-Code completion in completion10.xml for "[^wrap_content]" selecting fill_parent:
-@@ -9 +9
--     android:layout_height="^wrap_content"/>
-+     android:layout_height="fill_parent"^/>
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion10-expected-applyCompletion43.diff b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion10-expected-applyCompletion43.diff
deleted file mode 100644
index 0a4d338..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion10-expected-applyCompletion43.diff
+++ /dev/null
@@ -1,4 +0,0 @@
-Code completion in completion10.xml for "[^wrap_c]ontent" selecting fill_parent:
-@@ -9 +9
--     android:layout_height="^wrap_content"/>
-+     android:layout_height="fill_parent"^/>
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion10-expected-completion65.txt b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion10-expected-completion65.txt
deleted file mode 100644
index 69fae0d..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion10-expected-completion65.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-Code completion in completion10.xml for "[^wrap_content]":
-fill_parent
-match_parent
-wrap_content
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion10.xml b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion10.xml
deleted file mode 100644
index 57b38ee..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion10.xml
+++ /dev/null
@@ -1,10 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    android:gravity="center_vertical">
-<Gallery xmlns:android="http://schemas.android.com/apk/res/android"
-    android:id="@+id/gallery"
-    android:layout_width="fill_parent"
-    android:layout_height="wrap_content"/>
-</RelativeLayout>
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion11-expected-applyCompletion46.diff b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion11-expected-applyCompletion46.diff
deleted file mode 100644
index 321deaa..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion11-expected-applyCompletion46.diff
+++ /dev/null
@@ -1,4 +0,0 @@
-Code completion in completion11.xml for ?android:attr/Textapp^ selecting ?android:attr/textAppearanceLargeInverse:
-@@ -7 +7
--         style="?android:attr/Textapp^"
-+         style="?android:attr/textAppearanceLargeInverse^"
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion11-expected-complation79.txt b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion11-expected-complation79.txt
deleted file mode 100644
index 3748c77..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion11-expected-complation79.txt
+++ /dev/null
@@ -1,10 +0,0 @@
-Code completion in completion11.xml for tools:context="^.MainActivity":
-android.accounts.AccountAuthenticatorActivity : <p>See <code><a href="/reference/android/app/SearchManager.html">android.app.SearchManager</a></code> for more details.</td>     </tr>               <tr class=" api apilevel-1" >         <td class="jd-typecol">int</td>         <td class="jd-linkcol"...
-android.app.ActivityGroup : <p>   <p class="caution">       <strong>This class was deprecated       in API level 13</strong>.<br/> Use the new <code><a href="/reference/android/app/Fragment.html">Fragment</a></code> and <code><a href="/reference/android/app/FragmentManager.html">FragmentManager</...
-android.app.AliasActivity : <p>See <code><a href="/reference/android/app/SearchManager.html">android.app.SearchManager</a></code> for more details.</td>     </tr>               <tr class=" api apilevel-1" >         <td class="jd-typecol">int</td>         <td class="jd-linkcol"><a href="/reference...
-android.app.ExpandableListActivity : <p>  ExpandableListActivity hosts a  <code><a href="/reference/android/widget/ExpandableListView.html">ExpandableListView</a></code> object that can  be bound to different data sources that provide a two-levels of data (the  top-level is group, and below each ...
-android.app.LauncherActivity : <div id="jd-header">     public                 abstract     class <h1 itemprop="name">LauncherActivity</h1>                                                             extends <a href="/reference/android/app/ListActivity.html">ListActivity</a><br/>                 ...
-android.app.ListActivity : <p>  ListActivity hosts a <code><a href="/reference/android/widget/ListView.html">ListView</a></code> object that can  be bound to different data sources, typically either an array or a Cursor  holding query results. Binding, screen layout, and row layout are discussed ...
-android.app.NativeActivity : <p>A typical manifest would look like:   <pre>&lt;manifest xmlns:android="http://schemas.android.com/apk/res/android"         package="com.example.native_activity"         android:versionCode="1"         android:versionName="1.0"&gt;      &lt;!-- This is the platform ...
-android.app.TabActivity : <p>   <p class="caution">       <strong>This class was deprecated       in API level 13</strong>.<br/> New applications should use Fragments instead of this class;  to continue to run on older devices, you can use the v4 support library  which provides a version of the F...
-android.preference.PreferenceActivity : <p>This activity shows one or more headers of preferences, each of which  is associated with a <code><a href="/reference/android/preference/PreferenceFragment.html">PreferenceFragment</a></code> to display the preferences  of that header.  The actual layout...
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion11-expected-completion72.txt b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion11-expected-completion72.txt
deleted file mode 100644
index e4c21f9..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion11-expected-completion72.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-Code completion in completion11.xml for ?^android:attr/Textapp:
-?android:attr/
-?attr/
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion11-expected-completion73.txt b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion11-expected-completion73.txt
deleted file mode 100644
index 04cbbce..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion11-expected-completion73.txt
+++ /dev/null
@@ -1,16 +0,0 @@
-Code completion in completion11.xml for ?android:attr/Textapp^:
-?android:attr/textAppearance : Base text color, typeface, size, and style.
-?android:attr/textAppearanceButton
-?android:attr/textAppearanceInverse
-?android:attr/textAppearanceLarge
-?android:attr/textAppearanceLargeInverse
-?android:attr/textAppearanceLargePopupMenu
-?android:attr/textAppearanceListItem
-?android:attr/textAppearanceListItemSmall
-?android:attr/textAppearanceMedium
-?android:attr/textAppearanceMediumInverse
-?android:attr/textAppearanceSearchResultSubtitle
-?android:attr/textAppearanceSearchResultTitle
-?android:attr/textAppearanceSmall
-?android:attr/textAppearanceSmallInverse
-?android:attr/textAppearanceSmallPopupMenu
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion11-expected-completion74.txt b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion11-expected-completion74.txt
deleted file mode 100644
index 9579c93..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion11-expected-completion74.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-Code completion in completion11.xml for ?and^roid:attr/Textapp:
-?android:attr/
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion11.xml b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion11.xml
deleted file mode 100644
index e15b830..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion11.xml
+++ /dev/null
@@ -1,15 +0,0 @@
-<RelativeLayout 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" >
-
-    <TextView
-        style="?android:attr/Textapp"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_centerHorizontal="true"
-        android:layout_centerVertical="true"
-        android:text="@string/hello_world"
-        tools:context=".MainActivity" />
-
-</RelativeLayout>
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion12-expected-completion75.txt b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion12-expected-completion75.txt
deleted file mode 100644
index 5ad38e6..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion12-expected-completion75.txt
+++ /dev/null
@@ -1,96 +0,0 @@
-Code completion in completion12.xml for <include ^/>:
-layout : [reference]. * Required.
-style : A reference to a custom style  [reference]
-android:id : Supply an identifier name for this view, to later retrieve it  with View.findViewById() or Activity.findViewById().  [reference]
-android:tag : Supply a tag for this view containing a String, to be retrieved  later with View.getTag() or searched for with View.findViewWithTag() .  [string]
-android:scrollX : The initial horizontal scroll offset, in pixels.  [dimension]
-android:scrollY : The initial vertical scroll offset, in pixels.  [dimension]
-android:background : A drawable to use as the background.  [color, reference]
-android:padding : Sets the padding, in pixels, of all four edges.  [dimension]
-android:paddingLeft : Sets the padding, in pixels, of the left edge; see padding.  [dimension]
-android:paddingTop : Sets the padding, in pixels, of the top edge; see padding.  [dimension]
-android:paddingRight : Sets the padding, in pixels, of the right edge; see padding.  [dimension]
-android:paddingBottom : Sets the padding, in pixels, of the bottom edge; see padding.  [dimension]
-android:paddingStart : Sets the padding, in pixels, of the start edge; see padding.  [dimension]
-android:paddingEnd : Sets the padding, in pixels, of the end edge; see padding.  [dimension]
-android:focusable : Boolean that controls whether a view can take focus.  [boolean]
-android:focusableInTouchMode : Boolean that controls whether a view can take focus while in  touch mode.  [boolean]
-android:visibility : Controls the initial visibility of the view.  [enum]
-android:fitsSystemWindows : Boolean internal attribute to adjust view layout based on system  windows such as the status bar.  [boolean]
-android:scrollbars : Defines which scrollbars should be displayed on scrolling or  not.  [flag]
-android:scrollbarStyle : Controls the scrollbar style and position.  [enum]
-android:isScrollContainer : Set this if the view will serve as a scrolling container, meaing  that it can be resized to shrink its overall window so that there  will be space for an input method.  [boolean]
-android:fadeScrollbars : Defines whether to fade out scrollbars when they are not in use.  [boolean]
-android:scrollbarFadeDuration : Defines the delay in milliseconds that a scrollbar takes to fade  out.  [integer]
-android:scrollbarDefaultDelayBeforeFade : Defines the delay in milliseconds that a scrollbar waits before  fade out.  [integer]
-android:scrollbarSize : Sets the width of vertical scrollbars and height of horizontal  scrollbars.  [dimension]
-android:scrollbarThumbHorizontal : Defines the horizontal scrollbar thumb drawable.  [reference]
-android:scrollbarThumbVertical : Defines the vertical scrollbar thumb drawable.  [reference]
-android:scrollbarTrackHorizontal : Defines the horizontal scrollbar track drawable.  [reference]
-android:scrollbarTrackVertical : Defines the vertical scrollbar track drawable.  [reference]
-android:scrollbarAlwaysDrawHorizontalTrack : Defines whether the horizontal scrollbar track should always  be drawn.  [boolean]
-android:scrollbarAlwaysDrawVerticalTrack : Defines whether the vertical scrollbar track should always be  drawn.  [boolean]
-android:fadingEdge : This attribute is deprecated and will be ignored as of API level  14 (ICE_CREAM_SANDWICH).  [flag]
-android:requiresFadingEdge : Defines which edges should be faded on scrolling.  [flag]
-android:fadingEdgeLength : Defines the length of the fading edges.  [dimension]
-android:nextFocusLeft : Defines the next view to give focus to when the next focus is FOCUS_LEFT.  [reference]
-android:nextFocusRight : Defines the next view to give focus to when the next focus is FOCUS_RIGHT If the reference refers to a view that does not exist or is  part of a hierarchy that is invisible, a java.lang.RuntimeException will result when the  reference is accessed.  [reference]
-android:nextFocusUp : Defines the next view to give focus to when the next focus is FOCUS_UP If the reference refers to a view that does not exist or is  part of a hierarchy that is invisible, a java.lang.RuntimeException will result when the  reference is accessed.  [reference]
-android:nextFocusDown : Defines the next view to give focus to when the next focus is FOCUS_DOWN If the reference refers to a view that does not exist or is  part of a hierarchy that is invisible, a java.lang.RuntimeException will result when the  reference is accessed.  [reference]
-android:nextFocusForward : Defines the next view to give focus to when the next focus is FOCUS_FORWARD If the reference refers to a view that does not exist or is  part of a hierarchy that is invisible, a java.lang.RuntimeException will result when the  reference is accessed.  [reference]
-android:clickable : Defines whether this view reacts to click events.  [boolean]
-android:longClickable : Defines whether this view reacts to long click events.  [boolean]
-android:saveEnabled : If unset, no state will be saved for this view when it is being  frozen.  [boolean]
-android:filterTouchesWhenObscured : Specifies whether to filter touches when the view's window is  obscured by another visible window.  [boolean]
-android:drawingCacheQuality : Defines the quality of translucent drawing caches.  [enum]
-android:keepScreenOn : Controls whether the view's window should keep the screen on  while visible.  [boolean]
-android:duplicateParentState : When this attribute is set to true, the view gets its drawable  state (focused, pressed, etc.) from its direct parent rather  than from itself.  [boolean]
-android:minHeight : Defines the minimum height of the view.
-android:minWidth : Defines the minimum width of the view.
-android:soundEffectsEnabled : Boolean that controls whether a view should have sound effects  enabled for events such as clicking and touching.  [boolean]
-android:hapticFeedbackEnabled : Boolean that controls whether a view should have haptic feedback  enabled for events such as long presses.  [boolean]
-android:contentDescription : Defines text that briefly describes content of the view.  [string]
-android:onClick : Name of the method in this View's context to invoke when the  view is clicked.  [string]
-android:overScrollMode : Defines over-scrolling behavior.  [enum]
-android:alpha : alpha property of the view, as a value between 0 (completely  transparent) and 1 (completely opaque).  [float]
-android:translationX : translation in x of the view.  [dimension]
-android:translationY : translation in y of the view.  [dimension]
-android:transformPivotX : x location of the pivot point around which the view will rotate  and scale.  [dimension]
-android:transformPivotY : y location of the pivot point around which the view will rotate  and scale.  [dimension]
-android:rotation : rotation of the view, in degrees.  [float]
-android:rotationX : rotation of the view around the x axis, in degrees.  [float]
-android:rotationY : rotation of the view around the y axis, in degrees.  [float]
-android:scaleX : scale of the view in the x direction.  [float]
-android:scaleY : scale of the view in the y direction.  [float]
-android:verticalScrollbarPosition : Determines which side the vertical scroll bar should be placed  on.  [enum]
-android:layerType : Specifies the type of layer backing this view.  [enum]
-android:layoutDirection : Defines the direction of layout drawing.  [enum]
-android:textDirection : Direction of the text.  [integer, enum]
-android:textAlignment : Alignment of the text.  [integer, enum]
-android:importantForAccessibility : Controls how this View is important for accessibility which is  if it fires accessibility events and if it is reported to accessibility  services that query the screen.  [integer, enum]
-android:layout_toLeftOf : Positions the right edge of this view to the left of the given  anchor view ID.  [reference]
-android:layout_toRightOf : Positions the left edge of this view to the right of the given  anchor view ID.  [reference]
-android:layout_above : Positions the bottom edge of this view above the given anchor  view ID.  [reference]
-android:layout_below : Positions the top edge of this view below the given anchor view  ID.  [reference]
-android:layout_alignBaseline : Positions the baseline of this view on the baseline of the given  anchor view ID.  [reference]
-android:layout_alignLeft : Makes the left edge of this view match the left edge of the given  anchor view ID.  [reference]
-android:layout_alignTop : Makes the top edge of this view match the top edge of the given  anchor view ID.  [reference]
-android:layout_alignRight : Makes the right edge of this view match the right edge of the  given anchor view ID.  [reference]
-android:layout_alignBottom : Makes the bottom edge of this view match the bottom edge of the  given anchor view ID.  [reference]
-android:layout_alignParentLeft : If true, makes the left edge of this view match the left edge  of the parent.  [boolean]
-android:layout_alignParentTop : If true, makes the top edge of this view match the top edge of  the parent.  [boolean]
-android:layout_alignParentRight : If true, makes the right edge of this view match the right edge  of the parent.  [boolean]
-android:layout_alignParentBottom : If true, makes the bottom edge of this view match the bottom  edge of the parent.  [boolean]
-android:layout_centerInParent : If true, centers this child horizontally and vertically within  its parent.  [boolean]
-android:layout_centerHorizontal : If true, centers this child horizontally within its parent.  [boolean]
-android:layout_centerVertical : If true, centers this child vertically within its parent.  [boolean]
-android:layout_alignWithParentIfMissing : If set to true, the parent will be used as the anchor when the  anchor cannot be be found for layout_toLeftOf, layout_toRightOf,  etc.  [boolean]
-android:layout_width : Specifies the basic width of the view.  [dimension, enum]
-android:layout_height : Specifies the basic height of the view.  [dimension, enum]
-android:layout_margin : Specifies extra space on the left, top, right and bottom sides  of this view.  [dimension]
-android:layout_marginLeft : Specifies extra space on the left side of this view.  [dimension]
-android:layout_marginTop : Specifies extra space on the top side of this view.  [dimension]
-android:layout_marginRight : Specifies extra space on the right side of this view.  [dimension]
-android:layout_marginBottom : Specifies extra space on the bottom side of this view.  [dimension]
-android:layout_marginStart : Specifies extra space on the start side of this view.  [dimension]
-android:layout_marginEnd : Specifies extra space on the end side of this view.  [dimension]
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion12.xml b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion12.xml
deleted file mode 100644
index 946a232..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion12.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent" >
-
-    <include />
-
-</RelativeLayout>
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion2-expected-applyCompletion13a.diff b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion2-expected-applyCompletion13a.diff
deleted file mode 100644
index b365736..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion2-expected-applyCompletion13a.diff
+++ /dev/null
@@ -1,4 +0,0 @@
-Code completion in completion2.xml for gravity="left|bottom|^cen selecting fill_vertical:
-@@ -4 +4
--     <TextView android:gravity="left|bottom|^cen"></TextView>
-+     <TextView android:gravity="left|bottom|fill_vertical^"></TextView>
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion2-expected-applyCompletion13b.diff b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion2-expected-applyCompletion13b.diff
deleted file mode 100644
index 46268af..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion2-expected-applyCompletion13b.diff
+++ /dev/null
@@ -1,4 +0,0 @@
-Code completion in completion2.xml for gravity="left|bottom|cen^ selecting center_horizontal:
-@@ -4 +4
--     <TextView android:gravity="left|bottom|cen^"></TextView>
-+     <TextView android:gravity="left|bottom|center_horizontal^"></TextView>
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion2-expected-applyCompletion13c.diff b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion2-expected-applyCompletion13c.diff
deleted file mode 100644
index bcac56d..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion2-expected-applyCompletion13c.diff
+++ /dev/null
@@ -1,4 +0,0 @@
-Code completion in completion2.xml for gravity="left|bottom^|cen selecting bottom|fill_horizontal:
-@@ -4 +4
--     <TextView android:gravity="left|bottom^|cen"></TextView>
-+     <TextView android:gravity="left|bottom|fill_horizontal^"></TextView>
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion2-expected-completion13a.txt b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion2-expected-completion13a.txt
deleted file mode 100644
index dd28c73..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion2-expected-completion13a.txt
+++ /dev/null
@@ -1,15 +0,0 @@
-Code completion in completion2.xml for gravity="left|bottom|^cen:
-top
-bottom
-left
-right
-center_vertical
-fill_vertical
-center_horizontal
-fill_horizontal
-center
-fill
-clip_vertical
-clip_horizontal
-start
-end
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion2-expected-completion13b.txt b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion2-expected-completion13b.txt
deleted file mode 100644
index 8e6d4d8..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion2-expected-completion13b.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-Code completion in completion2.xml for gravity="left|bottom|cen^:
-center_vertical
-center_horizontal
-center
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion2-expected-completion13c.txt b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion2-expected-completion13c.txt
deleted file mode 100644
index 0aebfed..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion2-expected-completion13c.txt
+++ /dev/null
@@ -1,14 +0,0 @@
-Code completion in completion2.xml for gravity="left|bottom^|cen:
-bottom
-bottom|top
-bottom|right
-bottom|center_vertical
-bottom|fill_vertical
-bottom|center_horizontal
-bottom|fill_horizontal
-bottom|center
-bottom|fill
-bottom|clip_vertical
-bottom|clip_horizontal
-bottom|start
-bottom|end
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion2.xml b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion2.xml
deleted file mode 100644
index 0921674..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion2.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android">
-    <!-- Test multiple pipes in the flag value -->
-    <TextView android:gravity="left|bottom|cen"></TextView>
-</LinearLayout>
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion3-expected-applyCompletion17.diff b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion3-expected-applyCompletion17.diff
deleted file mode 100644
index ef070b2..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion3-expected-applyCompletion17.diff
+++ /dev/null
@@ -1,4 +0,0 @@
-Code completion in completion3.xml for <EditText ^/> selecting android:textColorHighlight:
-@@ -3 +3
--     <EditText ^/>
-+     <EditText android:textColorHighlight="^"/>
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion3-expected-applyCompletion18.diff b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion3-expected-applyCompletion18.diff
deleted file mode 100644
index 283636b..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion3-expected-applyCompletion18.diff
+++ /dev/null
@@ -1,4 +0,0 @@
-Code completion in completion3.xml for <Button ^></Button> selecting android:paddingRight:
-@@ -4 +4
--     <Button ^></Button>
-+     <Button android:paddingRight="^"></Button>
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion3.xml b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion3.xml
deleted file mode 100644
index afb64b8..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion3.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android">
-    <EditText />
-    <Button ></Button>
-</LinearLayout>
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion4-expected-completion22.txt b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion4-expected-completion22.txt
deleted file mode 100644
index c7170df..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion4-expected-completion22.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-Code completion in completion4.xml for <Button^:
-Button
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion4.xml b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion4.xml
deleted file mode 100644
index 0047772..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion4.xml
+++ /dev/null
@@ -1,11 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<LinearLayout
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent">
-    <Button
-        android:text="@string/app_name"
-        android:layout_marginLeft="@android:dimen/app_icon_size"
-        android:id="@+id/button1"
-        ></Button>
-</LinearLayout>
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion5-expected-applyCompletion19.diff b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion5-expected-applyCompletion19.diff
deleted file mode 100644
index 3f78663..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion5-expected-applyCompletion19.diff
+++ /dev/null
@@ -1,4 +0,0 @@
-Code completion in completion5.xml for android:orientation='^' selecting horizontal:
-@@ -5 +5
--     android:orientation='^'
-+     android:orientation='horizontal'^
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion5-expected-applyCompletion20.diff b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion5-expected-applyCompletion20.diff
deleted file mode 100644
index 4933d13..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion5-expected-applyCompletion20.diff
+++ /dev/null
@@ -1,4 +0,0 @@
-Code completion in completion5.xml for android:layout_marginTop='50^dp' selecting 50pt:
-@@ -10 +10
--         android:layout_marginTop='50^dp'
-+         android:layout_marginTop='50pt'^
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion5-expected-applyCompletion21.diff b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion5-expected-applyCompletion21.diff
deleted file mode 100644
index a4c88d7..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion5-expected-applyCompletion21.diff
+++ /dev/null
@@ -1,4 +0,0 @@
-Code completion in completion5.xml for android:layout_width='^wrap_content' selecting match_parent:
-@@ -11 +11
--         android:layout_width='^wrap_content'
-+         android:layout_width='match_parent'^
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion5-expected-applyCompletion40.diff b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion5-expected-applyCompletion40.diff
deleted file mode 100644
index 705f865..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion5-expected-applyCompletion40.diff
+++ /dev/null
@@ -1,4 +0,0 @@
-Code completion in completion5.xml for android:id='@+id/button2'^ selecting  android:maxWidth:
-@@ -15 +15
--         android:id='@+id/button2'^
-+         android:id='@+id/button2' android:maxWidth="^"
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion5-expected-completion40.txt b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion5-expected-completion40.txt
deleted file mode 100644
index a4cf0fa..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion5-expected-completion40.txt
+++ /dev/null
@@ -1,156 +0,0 @@
-Code completion in completion5.xml for android:id='@+id/button2'^:
-style : A reference to a custom style  [reference]
-android:bufferType : Determines the minimum type that getText() will return.  [enum]
-android:text : Text to display.  [string]
-android:hint : Hint text to display when the text is empty.  [string]
-android:textColor : Text color.  [color, reference]
-android:textColorHighlight : Color of the text selection highlight.  [color, reference]
-android:textColorHint : Color of the hint text.  [color, reference]
-android:textAppearance : Base text color, typeface, size, and style.  [reference]
-android:textSize : Size of the text.  [dimension]
-android:textScaleX : Sets the horizontal scaling factor for the text.  [float]
-android:typeface : Typeface (normal, sans, serif, monospace) for the text.  [enum]
-android:textStyle : Style (bold, italic, bolditalic) for the text.  [flag]
-android:fontFamily : Font family (named by string) for the text.  [string]
-android:textColorLink : Text color for links.  [color, reference]
-android:cursorVisible : Makes the cursor visible (the default) or invisible.  [boolean]
-android:maxLines : Makes the TextView be at most this many lines tall.  [integer]
-android:maxHeight : Makes the TextView be at most this many pixels tall.  [dimension]
-android:lines : Makes the TextView be exactly this many lines tall.  [integer]
-android:height : Makes the TextView be exactly this many pixels tall.  [dimension]
-android:minLines : Makes the TextView be at least this many lines tall.  [integer]
-android:minHeight : Makes the TextView be at least this many pixels tall.  [dimension]
-android:maxEms : Makes the TextView be at most this many ems wide.  [integer]
-android:maxWidth : Makes the TextView be at most this many pixels wide.  [dimension]
-android:ems : Makes the TextView be exactly this many ems wide.  [integer]
-android:width : Makes the TextView be exactly this many pixels wide.  [dimension]
-android:minEms : Makes the TextView be at least this many ems wide.  [integer]
-android:minWidth : Makes the TextView be at least this many pixels wide.  [dimension]
-android:gravity : Specifies how to align the text by the view's x- and/or y-axis  when the text is smaller than the view.  [flag]
-android:scrollHorizontally : Whether the text is allowed to be wider than the view (and therefore  can be scrolled horizontally).  [boolean]
-android:password : Whether the characters of the field are displayed as password  dots instead of themselves. * Deprecated: Use inputType instead.  [boolean]
-android:singleLine : Constrains the text to a single horizontally scrolling line instead  of letting it wrap onto multiple lines, and advances focus instead  of inserting a newline when you press the enter key. * Deprecated: This attribute is deprecated. Use "maxLines" instead  to change the layo...
-android:enabled : Specifies whether the widget is enabled.  [boolean]
-android:selectAllOnFocus : If the text is selectable, select it all when the view takes  focus.  [boolean]
-android:includeFontPadding : Leave enough room for ascenders and descenders instead of using  the font ascent and descent strictly.  [boolean]
-android:maxLength : Set an input filter to constrain the text length to the specified  number.  [integer]
-android:shadowColor : Place a shadow of the specified color behind the text.  [color]
-android:shadowDx : Horizontal offset of the shadow.  [float]
-android:shadowDy : Vertical offset of the shadow.  [float]
-android:shadowRadius : Radius of the shadow.  [float]
-android:autoLink : Controls whether links such as urls and email addresses are automatically  found and converted to clickable links.  [flag]
-android:linksClickable : If set to false, keeps the movement method from being set to  the link movement method even if autoLink causes links to be  found.  [boolean]
-android:numeric : If set, specifies that this TextView has a numeric input method. * Deprecated: Use inputType instead.  [flag]
-android:digits : If set, specifies that this TextView has a numeric input method  and that these specific characters are the ones that it will  accept.  [string]
-android:phoneNumber : If set, specifies that this TextView has a phone number input  method. * Deprecated: Use inputType instead.  [boolean]
-android:inputMethod : If set, specifies that this TextView should use the specified  input method (specified by fully-qualified class name). * Deprecated: Use inputType instead.  [string]
-android:capitalize : If set, specifies that this TextView has a textual input method  and should automatically capitalize what the user types. * Deprecated: Use inputType instead.  [enum]
-android:autoText : If set, specifies that this TextView has a textual input method  and automatically corrects some common spelling errors. * Deprecated: Use inputType instead.  [boolean]
-android:editable : If set, specifies that this TextView has an input method. * Deprecated: Use inputType instead.  [boolean]
-android:freezesText : If set, the text view will include its current complete text  inside of its frozen icicle in addition to meta-data such as  the current cursor position.  [boolean]
-android:ellipsize : If set, causes words that are longer than the view is wide to  be ellipsized instead of broken in the middle.  [enum]
-android:drawableTop : The drawable to be drawn above the text.  [color, reference]
-android:drawableBottom : The drawable to be drawn below the text.  [color, reference]
-android:drawableLeft : The drawable to be drawn to the left of the text.  [color, reference]
-android:drawableRight : The drawable to be drawn to the right of the text.  [color, reference]
-android:drawableStart : The drawable to be drawn to the start of the text.  [color, reference]
-android:drawableEnd : The drawable to be drawn to the end of the text.  [color, reference]
-android:drawablePadding : The padding between the drawables and the text.  [dimension]
-android:lineSpacingExtra : Extra spacing between lines of text.  [dimension]
-android:lineSpacingMultiplier : Extra spacing between lines of text, as a multiplier.  [float]
-android:marqueeRepeatLimit : The number of times to repeat the marquee animation.  [integer, enum]
-android:inputType : The type of data being placed in a text field, used to help an  input method decide how to let the user enter text.  [flag]
-android:imeOptions : Additional features you can enable in an IME associated with  an editor to improve the integration with your application.  [flag]
-android:privateImeOptions : An addition content type description to supply to the input method  attached to the text view, which is private to the implementation  of the input method.  [string]
-android:imeActionLabel : Supply a value for EditorInfo.actionLabel used when an input  method is connected to the text view.  [string]
-android:imeActionId : Supply a value for EditorInfo.actionId used when an input method  is connected to the text view.  [integer]
-android:editorExtras : Reference to an "input-extras" XML resource containing additional  data to supply to an input method, which is private to the implementation  of the input method.  [reference]
-android:textSelectHandleLeft : Reference to a drawable that will be used to display a text selection  anchor on the left side of a selection region.  [reference]
-android:textSelectHandleRight : Reference to a drawable that will be used to display a text selection  anchor on the right side of a selection region.  [reference]
-android:textSelectHandle : Reference to a drawable that will be used to display a text selection  anchor for positioning the cursor within text.  [reference]
-android:textEditPasteWindowLayout : The layout of the view that is displayed on top of the cursor  to paste inside a TextEdit field.  [reference]
-android:textEditNoPasteWindowLayout : Variation of textEditPasteWindowLayout displayed when the clipboard  is empty.  [reference]
-android:textEditSidePasteWindowLayout : Used instead of textEditPasteWindowLayout when the window is  moved on the side of the insertion cursor because it would be  clipped if it were positioned on top.  [reference]
-android:textEditSideNoPasteWindowLayout : Variation of textEditSidePasteWindowLayout displayed when the  clipboard is empty.  [reference]
-android:textEditSuggestionItemLayout : Layout of the TextView item that will populate the suggestion  popup window.  [reference]
-android:textCursorDrawable : Reference to a drawable that will be drawn under the insertion  cursor.  [reference]
-android:textIsSelectable : Indicates that the content of a non-editable text can be selected.  [boolean]
-android:textAllCaps : Present the text in ALL CAPS.  [boolean]
-android:id : Supply an identifier name for this view, to later retrieve it  with View.findViewById() or Activity.findViewById().  [reference]
-android:tag : Supply a tag for this view containing a String, to be retrieved  later with View.getTag() or searched for with View.findViewWithTag() .  [string]
-android:scrollX : The initial horizontal scroll offset, in pixels.  [dimension]
-android:scrollY : The initial vertical scroll offset, in pixels.  [dimension]
-android:background : A drawable to use as the background.  [color, reference]
-android:padding : Sets the padding, in pixels, of all four edges.  [dimension]
-android:paddingLeft : Sets the padding, in pixels, of the left edge; see padding.  [dimension]
-android:paddingTop : Sets the padding, in pixels, of the top edge; see padding.  [dimension]
-android:paddingRight : Sets the padding, in pixels, of the right edge; see padding.  [dimension]
-android:paddingBottom : Sets the padding, in pixels, of the bottom edge; see padding.  [dimension]
-android:paddingStart : Sets the padding, in pixels, of the start edge; see padding.  [dimension]
-android:paddingEnd : Sets the padding, in pixels, of the end edge; see padding.  [dimension]
-android:focusable : Boolean that controls whether a view can take focus.  [boolean]
-android:focusableInTouchMode : Boolean that controls whether a view can take focus while in  touch mode.  [boolean]
-android:visibility : Controls the initial visibility of the view.  [enum]
-android:fitsSystemWindows : Boolean internal attribute to adjust view layout based on system  windows such as the status bar.  [boolean]
-android:scrollbars : Defines which scrollbars should be displayed on scrolling or  not.  [flag]
-android:scrollbarStyle : Controls the scrollbar style and position.  [enum]
-android:isScrollContainer : Set this if the view will serve as a scrolling container, meaing  that it can be resized to shrink its overall window so that there  will be space for an input method.  [boolean]
-android:fadeScrollbars : Defines whether to fade out scrollbars when they are not in use.  [boolean]
-android:scrollbarFadeDuration : Defines the delay in milliseconds that a scrollbar takes to fade  out.  [integer]
-android:scrollbarDefaultDelayBeforeFade : Defines the delay in milliseconds that a scrollbar waits before  fade out.  [integer]
-android:scrollbarSize : Sets the width of vertical scrollbars and height of horizontal  scrollbars.  [dimension]
-android:scrollbarThumbHorizontal : Defines the horizontal scrollbar thumb drawable.  [reference]
-android:scrollbarThumbVertical : Defines the vertical scrollbar thumb drawable.  [reference]
-android:scrollbarTrackHorizontal : Defines the horizontal scrollbar track drawable.  [reference]
-android:scrollbarTrackVertical : Defines the vertical scrollbar track drawable.  [reference]
-android:scrollbarAlwaysDrawHorizontalTrack : Defines whether the horizontal scrollbar track should always  be drawn.  [boolean]
-android:scrollbarAlwaysDrawVerticalTrack : Defines whether the vertical scrollbar track should always be  drawn.  [boolean]
-android:fadingEdge : This attribute is deprecated and will be ignored as of API level  14 (ICE_CREAM_SANDWICH).  [flag]
-android:requiresFadingEdge : Defines which edges should be faded on scrolling.  [flag]
-android:fadingEdgeLength : Defines the length of the fading edges.  [dimension]
-android:nextFocusLeft : Defines the next view to give focus to when the next focus is FOCUS_LEFT.  [reference]
-android:nextFocusRight : Defines the next view to give focus to when the next focus is FOCUS_RIGHT If the reference refers to a view that does not exist or is  part of a hierarchy that is invisible, a java.lang.RuntimeException will result when the  reference is accessed.  [reference]
-android:nextFocusUp : Defines the next view to give focus to when the next focus is FOCUS_UP If the reference refers to a view that does not exist or is  part of a hierarchy that is invisible, a java.lang.RuntimeException will result when the  reference is accessed.  [reference]
-android:nextFocusDown : Defines the next view to give focus to when the next focus is FOCUS_DOWN If the reference refers to a view that does not exist or is  part of a hierarchy that is invisible, a java.lang.RuntimeException will result when the  reference is accessed.  [reference]
-android:nextFocusForward : Defines the next view to give focus to when the next focus is FOCUS_FORWARD If the reference refers to a view that does not exist or is  part of a hierarchy that is invisible, a java.lang.RuntimeException will result when the  reference is accessed.  [reference]
-android:clickable : Defines whether this view reacts to click events.  [boolean]
-android:longClickable : Defines whether this view reacts to long click events.  [boolean]
-android:saveEnabled : If unset, no state will be saved for this view when it is being  frozen.  [boolean]
-android:filterTouchesWhenObscured : Specifies whether to filter touches when the view's window is  obscured by another visible window.  [boolean]
-android:drawingCacheQuality : Defines the quality of translucent drawing caches.  [enum]
-android:keepScreenOn : Controls whether the view's window should keep the screen on  while visible.  [boolean]
-android:duplicateParentState : When this attribute is set to true, the view gets its drawable  state (focused, pressed, etc.) from its direct parent rather  than from itself.  [boolean]
-android:minHeight : Defines the minimum height of the view.
-android:minWidth : Defines the minimum width of the view.
-android:soundEffectsEnabled : Boolean that controls whether a view should have sound effects  enabled for events such as clicking and touching.  [boolean]
-android:hapticFeedbackEnabled : Boolean that controls whether a view should have haptic feedback  enabled for events such as long presses.  [boolean]
-android:contentDescription : Defines text that briefly describes content of the view.  [string]
-android:onClick : Name of the method in this View's context to invoke when the  view is clicked.  [string]
-android:overScrollMode : Defines over-scrolling behavior.  [enum]
-android:alpha : alpha property of the view, as a value between 0 (completely  transparent) and 1 (completely opaque).  [float]
-android:translationX : translation in x of the view.  [dimension]
-android:translationY : translation in y of the view.  [dimension]
-android:transformPivotX : x location of the pivot point around which the view will rotate  and scale.  [dimension]
-android:transformPivotY : y location of the pivot point around which the view will rotate  and scale.  [dimension]
-android:rotation : rotation of the view, in degrees.  [float]
-android:rotationX : rotation of the view around the x axis, in degrees.  [float]
-android:rotationY : rotation of the view around the y axis, in degrees.  [float]
-android:scaleX : scale of the view in the x direction.  [float]
-android:scaleY : scale of the view in the y direction.  [float]
-android:verticalScrollbarPosition : Determines which side the vertical scroll bar should be placed  on.  [enum]
-android:layerType : Specifies the type of layer backing this view.  [enum]
-android:layoutDirection : Defines the direction of layout drawing.  [enum]
-android:textDirection : Direction of the text.  [integer, enum]
-android:textAlignment : Alignment of the text.  [integer, enum]
-android:importantForAccessibility : Controls how this View is important for accessibility which is  if it fires accessibility events and if it is reported to accessibility  services that query the screen.  [integer, enum]
-android:layout_width : Specifies the basic width of the view.  [dimension, enum]
-android:layout_height : Specifies the basic height of the view.  [dimension, enum]
-android:layout_weight : [float]
-android:layout_gravity : Standard gravity constant that a child can supply to its parent.  [flag]
-android:layout_margin : Specifies extra space on the left, top, right and bottom sides  of this view.  [dimension]
-android:layout_marginLeft : Specifies extra space on the left side of this view.  [dimension]
-android:layout_marginTop : Specifies extra space on the top side of this view.  [dimension]
-android:layout_marginRight : Specifies extra space on the right side of this view.  [dimension]
-android:layout_marginBottom : Specifies extra space on the bottom side of this view.  [dimension]
-android:layout_marginStart : Specifies extra space on the start side of this view.  [dimension]
-android:layout_marginEnd : Specifies extra space on the end side of this view.  [dimension]
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion5.xml b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion5.xml
deleted file mode 100644
index 757be8b..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion5.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version='1.0' encoding='utf-8'?>
-<LinearLayout
-    xmlns:android='http://schemas.android.com/apk/res/android'
-    android:layout_width='match_parent'
-    android:orientation=''
-    android:layout_height='match_parent'>
-    <Button
-        android:text="what's up doc?"
-        android:id='@+id/button1'
-        android:layout_marginTop='50dp'
-        android:layout_width='wrap_content'
-        android:layout_height='wrap_content'></Button>
-    <Button
-        android:text="quote='"
-        android:id='@+id/button2'
-        android:layout_width='wrap_content'
-        android:layout_height='wrap_content'></Button>
-    <Button
-        android:text='quote="'
-        android:id='@+id/button2'
-        android:layout_width='wrap_content'
-        android:layout_height='wrap_content'></Button>
-</LinearLayout>
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion6-expected-applyCompletion22.diff b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion6-expected-applyCompletion22.diff
deleted file mode 100644
index 92cd2f2..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion6-expected-applyCompletion22.diff
+++ /dev/null
@@ -1,4 +0,0 @@
-Code completion in completion6.xml for android:orientation="^" selecting horizontal:
-@@ -5 +5
--     android:orientation="^"
-+     android:orientation="horizontal"^
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion6.xml b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion6.xml
deleted file mode 100644
index 55bfa0c..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion6.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version='1.0' encoding='utf-8'?>
-<LinearLayout
-    xmlns:android='http://schemas.android.com/apk/res/android'
-    android:layout_width='match_parent'
-    android:orientation=""
-    android:layout_height='match_parent'>
-</LinearLayout>
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion7-expected-applyCompletion23.diff b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion7-expected-applyCompletion23.diff
deleted file mode 100644
index 1aaadc2..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion7-expected-applyCompletion23.diff
+++ /dev/null
@@ -1,4 +0,0 @@
-Code completion in completion7.xml for android:orientation="^ selecting horizontal:
-@@ -5 +5
--     android:orientation="^
-+     android:orientation="horizontal^
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion7.xml b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion7.xml
deleted file mode 100644
index 30afbaf..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion7.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version='1.0' encoding='utf-8'?>
-<LinearLayout
-    xmlns:android='http://schemas.android.com/apk/res/android'
-    android:layout_width='match_parent'
-    android:orientation="
-    android:layout_height='match_parent'>
-</LinearLayout>
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion8-expected-applyCompletion41.diff b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion8-expected-applyCompletion41.diff
deleted file mode 100644
index 7678740..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion8-expected-applyCompletion41.diff
+++ /dev/null
@@ -1,4 +0,0 @@
-Code completion in completion8.xml for android:mar^="50dp" selecting android:layout_marginRight:
-@@ -6 +6
--         android:mar^="50dp"
-+         android:layout_marginRight^="50dp"
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion8-expected-completion41.txt b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion8-expected-completion41.txt
deleted file mode 100644
index 0c2e215..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion8-expected-completion41.txt
+++ /dev/null
@@ -1,9 +0,0 @@
-Code completion in completion8.xml for android:mar^="50dp":
-android:layout_margin : Specifies extra space on the left, top, right and bottom sides  of this view.  [dimension]
-android:layout_marginLeft : Specifies extra space on the left side of this view.  [dimension]
-android:layout_marginTop : Specifies extra space on the top side of this view.  [dimension]
-android:layout_marginRight : Specifies extra space on the right side of this view.  [dimension]
-android:layout_marginBottom : Specifies extra space on the bottom side of this view.  [dimension]
-android:layout_marginStart : Specifies extra space on the start side of this view.  [dimension]
-android:layout_marginEnd : Specifies extra space on the end side of this view.  [dimension]
-android:marqueeRepeatLimit : The number of times to repeat the marquee animation.  [integer, enum]
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion8-expected-completion42.txt b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion8-expected-completion42.txt
deleted file mode 100644
index f5b0720..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion8-expected-completion42.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-Code completion in completion8.xml for android:w^i="100":
-android:layout_width : Specifies the basic width of the view.  [dimension, enum]
-android:layout_weight : [float]
-android:width : Makes the TextView be exactly this many pixels wide.  [dimension]
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion8-expected-completion43.txt b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion8-expected-completion43.txt
deleted file mode 100644
index 50f13d1..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion8-expected-completion43.txt
+++ /dev/null
@@ -1,9 +0,0 @@
-Code completion in completion8.xml for mar^="60dp":
-android:layout_margin : Specifies extra space on the left, top, right and bottom sides  of this view.  [dimension]
-android:layout_marginLeft : Specifies extra space on the left side of this view.  [dimension]
-android:layout_marginTop : Specifies extra space on the top side of this view.  [dimension]
-android:layout_marginRight : Specifies extra space on the right side of this view.  [dimension]
-android:layout_marginBottom : Specifies extra space on the bottom side of this view.  [dimension]
-android:layout_marginStart : Specifies extra space on the start side of this view.  [dimension]
-android:layout_marginEnd : Specifies extra space on the end side of this view.  [dimension]
-android:marqueeRepeatLimit : The number of times to repeat the marquee animation.  [integer, enum]
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion8-expected-completion44.txt b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion8-expected-completion44.txt
deleted file mode 100644
index 3578145..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion8-expected-completion44.txt
+++ /dev/null
@@ -1,13 +0,0 @@
-Code completion in completion8.xml for android:layo^ut_width="fill_parent":
-android:layout_width : Specifies the basic width of the view.  [dimension, enum]
-android:layout_height : Specifies the basic height of the view.  [dimension, enum]
-android:layout_weight : [float]
-android:layout_gravity : Standard gravity constant that a child can supply to its parent.  [flag]
-android:layout_margin : Specifies extra space on the left, top, right and bottom sides  of this view.  [dimension]
-android:layout_marginLeft : Specifies extra space on the left side of this view.  [dimension]
-android:layout_marginTop : Specifies extra space on the top side of this view.  [dimension]
-android:layout_marginRight : Specifies extra space on the right side of this view.  [dimension]
-android:layout_marginBottom : Specifies extra space on the bottom side of this view.  [dimension]
-android:layout_marginStart : Specifies extra space on the start side of this view.  [dimension]
-android:layout_marginEnd : Specifies extra space on the end side of this view.  [dimension]
-android:layoutDirection : Defines the direction of layout drawing.  [enum]
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion8.xml b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion8.xml
deleted file mode 100644
index 3f9d6b5..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion8.xml
+++ /dev/null
@@ -1,10 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android">
-    <TextView
-        android:layout_width="fill_parent"
-        android:layout_height="wrap_content"
-        android:mar="50dp"
-        android:wi="100"
-        mar="60dp"
-    />
-</LinearLayout>
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion9-expected-completion62.txt b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion9-expected-completion62.txt
deleted file mode 100644
index 9189a82..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion9-expected-completion62.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-Code completion in completion9.xml for android:layout_wi^dth=:
-android:layout_width : Specifies the basic width of the view.  [dimension, enum]
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion9-expected-completion63.txt b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion9-expected-completion63.txt
deleted file mode 100644
index c6ee31d..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion9-expected-completion63.txt
+++ /dev/null
@@ -1 +0,0 @@
-Code completion in completion9.xml for android:drawable^Top:
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion9-expected-completion64.txt b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion9-expected-completion64.txt
deleted file mode 100644
index 2085e96..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion9-expected-completion64.txt
+++ /dev/null
@@ -1,68 +0,0 @@
-Code completion in completion9.xml for ^<Button:
-<AbsoluteLayout ></AbsoluteLayout>
-<AdapterViewFlipper ></AdapterViewFlipper>
-<AnalogClock />
-<AutoCompleteTextView />
-<Button />
-<CalendarView />
-<CheckBox />
-<CheckedTextView />
-<Chronometer />
-<DatePicker />
-<DialerFilter ></DialerFilter>
-<DigitalClock />
-<EditText />
-<ExpandableListView ></ExpandableListView>
-<FrameLayout ></FrameLayout>
-<Gallery />
-<GridLayout ></GridLayout>
-<GridView ></GridView>
-<HorizontalScrollView ></HorizontalScrollView>
-<ImageButton />
-<ImageSwitcher ></ImageSwitcher>
-<ImageView />
-<LinearLayout ></LinearLayout>
-<ListView ></ListView>
-<MediaController ></MediaController>
-<MultiAutoCompleteTextView />
-<NumberPicker />
-<ProgressBar />
-<QuickContactBadge />
-<RadioButton />
-<RadioGroup ></RadioGroup>
-<RatingBar />
-<RelativeLayout ></RelativeLayout>
-<ScrollView ></ScrollView>
-<SearchView ></SearchView>
-<SeekBar />
-<SlidingDrawer ></SlidingDrawer> : SlidingDrawer specific attributes.
-<Space />
-<Spinner />
-<StackView ></StackView>
-<SurfaceView />
-<Switch />
-<TabHost ></TabHost>
-<TabWidget ></TabWidget>
-<TableLayout ></TableLayout>
-<TableRow ></TableRow>
-<TextSwitcher ></TextSwitcher>
-<TextView />
-<TextureView />
-<TimePicker />
-<ToggleButton />
-<TwoLineListItem />
-<VideoView />
-<View /> : Attributes that can be used with android.view.View or any of its subclasses.
-<ViewAnimator ></ViewAnimator>
-<ViewFlipper ></ViewFlipper>
-<ViewStub /> : A android.view.ViewStub lets you lazily include other XML layouts inside your application  at runtime.
-<ViewSwitcher ></ViewSwitcher>
-<WebView />
-<ZoomButton />
-<ZoomControls />
-<android.gesture.GestureOverlayView ></android.gesture.GestureOverlayView> : GestureOverlayView specific attributes.
-<fragment /> : A Fragment is a piece of an application's user interface or behavior  that can be placed in an Activity
-<include /> : Lets you statically include XML layouts inside other XML layouts.
-<merge ></merge> : A root tag useful for XML layouts inflated using a ViewStub.
-<requestFocus /> : Requests focus for the parent element or one of its descendants
-<view /> : A view tag whose class attribute names the class to be instantiated
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion9.xml b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion9.xml
deleted file mode 100644
index 9040d8c..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completion9.xml
+++ /dev/null
@@ -1,10 +0,0 @@
-<com.google.android.apps.iosched.ui.widget.DashboardLayout
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="fill_parent"
-    android:layout_height="fill_parent">
-
-    <Button android:id="@+id/home_btn_schedule"
-        style="@style/DashboardButton"
-        android:text="@string/btn_schedule"
-        android:drawableTop="@drawable/home_btn_schedule" />
-</com.google.android.apps.iosched.ui.widget.DashboardLayout>
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completionvalues1-expected-applyCompletion24a.diff b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completionvalues1-expected-applyCompletion24a.diff
deleted file mode 100644
index d323219..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completionvalues1-expected-applyCompletion24a.diff
+++ /dev/null
@@ -1,4 +0,0 @@
-Code completion in completionvalues1.xml for android:textS^ize selecting android:textSelectHandleLeft:
-@@ -4 +4
--         <item name="android:textS^ize">17sp</item>
-+         <item name="android:textSelectHandleLeft"^>17sp</item>
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completionvalues1-expected-applyCompletion24b.diff b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completionvalues1-expected-applyCompletion24b.diff
deleted file mode 100644
index ac71df7..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completionvalues1-expected-applyCompletion24b.diff
+++ /dev/null
@@ -1,4 +0,0 @@
-Code completion in completionvalues1.xml for 17^sp selecting 17mm:
-@@ -4 +4
--         <item name="android:textSize">17^sp</item>
-+         <item name="android:textSize">17mm^</item>
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completionvalues1-expected-applyCompletion25.diff b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completionvalues1-expected-applyCompletion25.diff
deleted file mode 100644
index df6fceb..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completionvalues1-expected-applyCompletion25.diff
+++ /dev/null
@@ -1,4 +0,0 @@
-Code completion in completionvalues1.xml for textColor">^@color/title_color</item> selecting @android::
-@@ -5 +5
--         <item name="android:textColor">^@color/title_color</item>
-+         <item name="android:textColor">@android:^</item>
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completionvalues1-expected-applyCompletion26.diff b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completionvalues1-expected-applyCompletion26.diff
deleted file mode 100644
index 36fce8b..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completionvalues1-expected-applyCompletion26.diff
+++ /dev/null
@@ -1,4 +0,0 @@
-Code completion in completionvalues1.xml for <item name="android:shadowColor">@an^</item> selecting @android::
-@@ -6 +6
--         <item name="android:shadowColor">@an^</item>
-+         <item name="android:shadowColor">@android:^</item>
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completionvalues1-expected-applyCompletion27.diff b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completionvalues1-expected-applyCompletion27.diff
deleted file mode 100644
index 6315fc4..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completionvalues1-expected-applyCompletion27.diff
+++ /dev/null
@@ -1,4 +0,0 @@
-Code completion in completionvalues1.xml for <item name="android:gravity">^  </item> selecting center_vertical:
-@@ -7 +7
--         <item name="android:gravity">^  </item>
-+         <item name="android:gravity">center_vertical^</item>
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completionvalues1-expected-applyCompletion28.diff b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completionvalues1-expected-applyCompletion28.diff
deleted file mode 100644
index 1db9773..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completionvalues1-expected-applyCompletion28.diff
+++ /dev/null
@@ -1,4 +0,0 @@
-Code completion in completionvalues1.xml for <item name="android:gravity">  ^</item> selecting left:
-@@ -7 +7
--         <item name="android:gravity">  ^</item>
-+         <item name="android:gravity">  left^</item>
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completionvalues1-expected-applyCompletion29.diff b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completionvalues1-expected-applyCompletion29.diff
deleted file mode 100644
index 6307646..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completionvalues1-expected-applyCompletion29.diff
+++ /dev/null
@@ -1,4 +0,0 @@
-Code completion in completionvalues1.xml for <item name="gr^"> selecting android:gravity:
-@@ -8 +8
--         <item name="gr^">@color/title_color</item>
-+         <item name="android:gravity"^>@color/title_color</item>
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completionvalues1-expected-applyCompletion30.diff b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completionvalues1-expected-applyCompletion30.diff
deleted file mode 100644
index c8a119f..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completionvalues1-expected-applyCompletion30.diff
+++ /dev/null
@@ -1,4 +0,0 @@
-Code completion in completionvalues1.xml for <item name="an^"> selecting android:animateOnClick:
-@@ -9 +9
--         <item name="an^">@color/title_color</item>
-+         <item name="android:animateOnClick"^>@color/title_color</item>
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completionvalues1-expected-applyCompletion31.diff b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completionvalues1-expected-applyCompletion31.diff
deleted file mode 100644
index 9b37438..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completionvalues1-expected-applyCompletion31.diff
+++ /dev/null
@@ -1,4 +0,0 @@
-Code completion in completionvalues1.xml for <item ^></item> selecting name:
-@@ -10 +10
--         <item ^></item>
-+         <item name="^"></item>
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completionvalues1-expected-applyCompletion32.diff b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completionvalues1-expected-applyCompletion32.diff
deleted file mode 100644
index b34a8ec..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completionvalues1-expected-applyCompletion32.diff
+++ /dev/null
@@ -1,4 +0,0 @@
-Code completion in completionvalues1.xml for <item name="^"></item> selecting android:background:
-@@ -11 +11
--         <item name="^"></item>
-+         <item name="android:background"^></item>
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completionvalues1-expected-applyCompletion33.diff b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completionvalues1-expected-applyCompletion33.diff
deleted file mode 100644
index b78adee..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completionvalues1-expected-applyCompletion33.diff
+++ /dev/null
@@ -1,4 +0,0 @@
-Code completion in completionvalues1.xml for <item name="android:allowSingleTap">^</item> selecting true:
-@@ -12 +12
--         <item name="android:allowSingleTap">^</item>
-+         <item name="android:allowSingleTap">true^</item>
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completionvalues1-expected-applyCompletion34.diff b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completionvalues1-expected-applyCompletion34.diff
deleted file mode 100644
index 5af6c92..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completionvalues1-expected-applyCompletion34.diff
+++ /dev/null
@@ -1,4 +0,0 @@
-Code completion in completionvalues1.xml for <item name="android:alwaysDrawnWithCache">^  false  </item> selecting true:
-@@ -13 +13
--         <item name="android:alwaysDrawnWithCache">^  false  </item>
-+         <item name="android:alwaysDrawnWithCache">true^</item>
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completionvalues1-expected-applyCompletion35.diff b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completionvalues1-expected-applyCompletion35.diff
deleted file mode 100644
index f48f101..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completionvalues1-expected-applyCompletion35.diff
+++ /dev/null
@@ -1,4 +0,0 @@
-Code completion in completionvalues1.xml for <item name="android:alwaysDrawnWithCache">  ^false  </item> selecting true:
-@@ -13 +13
--         <item name="android:alwaysDrawnWithCache">  ^false  </item>
-+         <item name="android:alwaysDrawnWithCache">  true^</item>
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completionvalues1-expected-applyCompletion36.diff b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completionvalues1-expected-applyCompletion36.diff
deleted file mode 100644
index 8c246a8..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completionvalues1-expected-applyCompletion36.diff
+++ /dev/null
@@ -1,4 +0,0 @@
-Code completion in completionvalues1.xml for <item name="android:alwaysDrawnWithCache">  f^alse  </item> selecting false:
-@@ -13 +13
--         <item name="android:alwaysDrawnWithCache">  f^alse  </item>
-+         <item name="android:alwaysDrawnWithCache">  false^</item>
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completionvalues1-expected-applyCompletion37.diff b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completionvalues1-expected-applyCompletion37.diff
deleted file mode 100644
index 082f2b2..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completionvalues1-expected-applyCompletion37.diff
+++ /dev/null
@@ -1,4 +0,0 @@
-Code completion in completionvalues1.xml for <item name="android:orientation">h^</item> selecting horizontal:
-@@ -14 +14
--         <item name="android:orientation">h^</item>
-+         <item name="android:orientation">horizontal^</item>
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completionvalues1-expected-applyCompletion38.diff b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completionvalues1-expected-applyCompletion38.diff
deleted file mode 100644
index 47580e1..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completionvalues1-expected-applyCompletion38.diff
+++ /dev/null
@@ -1,4 +0,0 @@
-Code completion in completionvalues1.xml for            c^ selecting center:
-@@ -16 +16
--            c^
-+            center^
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completionvalues1-expected-applyCompletion44.diff b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completionvalues1-expected-applyCompletion44.diff
deleted file mode 100644
index 57fe472..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completionvalues1-expected-applyCompletion44.diff
+++ /dev/null
@@ -1,4 +0,0 @@
-Code completion in completionvalues1.xml for [^false] selecting true:
-@@ -13 +13
--         <item name="android:alwaysDrawnWithCache">  ^false  </item>
-+         <item name="android:alwaysDrawnWithCache">  true^</item>
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completionvalues1-expected-completion23.txt b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completionvalues1-expected-completion23.txt
deleted file mode 100644
index a2f64dc..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completionvalues1-expected-completion23.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-Code completion in completionvalues1.xml for android:textS^ize:
-android:textScaleX : Sets the horizontal scaling factor for the text.  [float]
-android:textSelectHandle : Reference to a drawable that will be used to display a text selection  anchor for positioning the cursor within text.  [reference]
-android:textSelectHandleLeft : Reference to a drawable that will be used to display a text selection  anchor on the left side of a selection region.  [reference]
-android:textSelectHandleRight : Reference to a drawable that will be used to display a text selection  anchor on the right side of a selection region.  [reference]
-android:textSize : Size of the text.  [dimension]
-android:textStyle : Style (bold, italic, bolditalic) for the text.  [flag]
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completionvalues1-expected-completion24.txt b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completionvalues1-expected-completion24.txt
deleted file mode 100644
index c1de9ec..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completionvalues1-expected-completion24.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-Code completion in completionvalues1.xml for 17^sp:
-17dp : <b>Density-independent Pixels</b> - an abstract unit that is based on the physical density of the screen.
-17sp : <b>Scale-independent Pixels</b> - this is like the dp unit, but it is also scaled by the user's font size preference.
-17pt : <b>Points</b> - 1/72 of an inch based on the physical size of the screen.
-17mm : <b>Millimeters</b> - based on the physical size of the screen.
-17in : <b>Inches</b> - based on the physical size of the screen.
-17px : <b>Pixels</b> - corresponds to actual pixels on the screen. Not recommended.
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completionvalues1-expected-completion25.txt b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completionvalues1-expected-completion25.txt
deleted file mode 100644
index b57246d..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completionvalues1-expected-completion25.txt
+++ /dev/null
@@ -1,8 +0,0 @@
-Code completion in completionvalues1.xml for textColor">^@color/title_color</item>:
-@android:
-@+id/
-@drawable/
-@id/
-@layout/
-@string/
-@style/
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completionvalues1-expected-completion26.txt b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completionvalues1-expected-completion26.txt
deleted file mode 100644
index b1c541c..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completionvalues1-expected-completion26.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-Code completion in completionvalues1.xml for <item name="android:shadowColor">@an^</item>:
-@android:
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completionvalues1-expected-completion27.txt b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completionvalues1-expected-completion27.txt
deleted file mode 100644
index 22b636d..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completionvalues1-expected-completion27.txt
+++ /dev/null
@@ -1,15 +0,0 @@
-Code completion in completionvalues1.xml for <item name="android:gravity">^  </item>:
-top
-bottom
-left
-right
-center_vertical
-fill_vertical
-center_horizontal
-fill_horizontal
-center
-fill
-clip_vertical
-clip_horizontal
-start
-end
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completionvalues1-expected-completion28.txt b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completionvalues1-expected-completion28.txt
deleted file mode 100644
index 2a85029..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completionvalues1-expected-completion28.txt
+++ /dev/null
@@ -1,15 +0,0 @@
-Code completion in completionvalues1.xml for <item name="android:gravity">  ^</item>:
-top
-bottom
-left
-right
-center_vertical
-fill_vertical
-center_horizontal
-fill_horizontal
-center
-fill
-clip_vertical
-clip_horizontal
-start
-end
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completionvalues1-expected-completion29.txt b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completionvalues1-expected-completion29.txt
deleted file mode 100644
index c082ce4..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completionvalues1-expected-completion29.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-Code completion in completionvalues1.xml for <item name="gr^">:
-android:gravity : Specifies how to place the content of an object, both on the  x- and y-axis, within the object itself.  [flag]
-android:groupIndicator : Indicator shown beside the group View.  [reference]
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completionvalues1-expected-completion30.txt b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completionvalues1-expected-completion30.txt
deleted file mode 100644
index efee2bc..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completionvalues1-expected-completion30.txt
+++ /dev/null
@@ -1,8 +0,0 @@
-Code completion in completionvalues1.xml for <item name="an^">:
-android:
-android:animateFirstView : Defines whether to animate the current View when the ViewAnimation  is first displayed.  [boolean]
-android:animateLayoutChanges : Defines whether changes in layout (caused by adding and removing  items) should cause a LayoutTransition to run.  [boolean]
-android:animateOnClick : Indicates whether the drawer should be opened/closed with an  animation when the user clicks the handle.  [boolean]
-android:animationCache : Defines whether layout animations should create a drawing cache  for their children.  [boolean]
-android:animationDuration : Sets how long a transition animation should run (in milliseconds)  when layout has changed.  [integer]
-android:animationResolution : Timeout between frames of animation in milliseconds  * Deprecated: Not used by the framework.  [integer]
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completionvalues1-expected-completion31.txt b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completionvalues1-expected-completion31.txt
deleted file mode 100644
index 9044164..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completionvalues1-expected-completion31.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-Code completion in completionvalues1.xml for <item ^></item>:
-name : The mandatory name used in referring to this item.
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completionvalues1-expected-completion32.txt b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completionvalues1-expected-completion32.txt
deleted file mode 100644
index 57684d7..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completionvalues1-expected-completion32.txt
+++ /dev/null
@@ -1,317 +0,0 @@
-Code completion in completionvalues1.xml for <item name="^"></item>:
-android:
-android:addStatesFromChildren : Sets whether this ViewGroup's drawable states also include its  children's drawable states.  [boolean]
-android:adjustViewBounds : Set this to true if you want the ImageView to adjust its bounds  to preserve the aspect ratio of its drawable.  [boolean]
-android:alignmentMode : When set to alignMargins, causes alignment to take place between  the outer boundary of a view, as defined by its margins.  [enum]
-android:allowSingleTap : Indicates whether the drawer can be opened/closed by a single  tap on the handle.  [boolean]
-android:alpha : alpha property of the view, as a value between 0 (completely  transparent) and 1 (completely opaque).  [float]
-android:alwaysDrawnWithCache : Defines whether the ViewGroup should always draw its children  using their drawing cache or not.  [boolean]
-android:animateFirstView : Defines whether to animate the current View when the ViewAnimation  is first displayed.  [boolean]
-android:animateLayoutChanges : Defines whether changes in layout (caused by adding and removing  items) should cause a LayoutTransition to run.  [boolean]
-android:animateOnClick : Indicates whether the drawer should be opened/closed with an  animation when the user clicks the handle.  [boolean]
-android:animationCache : Defines whether layout animations should create a drawing cache  for their children.  [boolean]
-android:animationDuration : Sets how long a transition animation should run (in milliseconds)  when layout has changed.  [integer]
-android:animationResolution : Timeout between frames of animation in milliseconds  * Deprecated: Not used by the framework.  [integer]
-android:autoLink : Controls whether links such as urls and email addresses are automatically  found and converted to clickable links.  [flag]
-android:autoStart : When true, automatically start animating  [boolean]
-android:autoText : If set, specifies that this TextView has a textual input method  and automatically corrects some common spelling errors. * Deprecated: Use inputType instead.  [boolean]
-android:background : A drawable to use as the background.  [color, reference]
-android:baseline : The offset of the baseline within this view.  [dimension]
-android:baselineAlignBottom : If true, the image view will be baseline aligned with based on  its bottom edge.  [boolean]
-android:baselineAligned : When set to false, prevents the layout from aligning its children's  baselines.  [boolean]
-android:baselineAlignedChildIndex : When a linear layout is part of another layout that is baseline  aligned, it can specify which of its children to baseline align  to (that is, which child TextView).  [integer]
-android:bottomOffset : Extra offset for the handle at the bottom of the SlidingDrawer.  [dimension]
-android:bufferType : Determines the minimum type that getText() will return.  [enum]
-android:button : Drawable used for the button graphic (e.g. checkbox, radio button,  etc).  [reference]
-android:cacheColorHint : Indicates that this list will always be drawn on top of solid,  single-color opaque background.  [color]
-android:calendarViewShown : Whether the calendar view is shown.  [boolean]
-android:capitalize : If set, specifies that this TextView has a textual input method  and should automatically capitalize what the user types. * Deprecated: Use inputType instead.  [enum]
-android:checkMark : Drawable used for the check mark graphic.  [reference]
-android:checked : Indicates the initial checked state of this button.  [boolean]
-android:checkedButton : The id of the child radio button that should be checked by default  within this radio group.  [integer]
-android:childDivider : Drawable or color that is used as a divider for children.  [color, reference]
-android:childIndicator : Indicator shown beside the child View.  [reference]
-android:childIndicatorLeft : The left bound for a child's indicator.  [dimension]
-android:childIndicatorRight : The right bound for a child's indicator.  [dimension]
-android:choiceMode : Defines the choice behavior for the view.  [enum]
-class : Supply the name of the view class to instantiate
-android:clickColor : Color of the outline of click feedback.  [color]
-android:clickable : Defines whether this view reacts to click events.  [boolean]
-android:clipChildren : Defines whether a child is limited to draw inside of its bounds  or not.  [boolean]
-android:clipToPadding : Defines whether the ViewGroup will clip its drawing surface so  as to exclude the padding area.  [boolean]
-android:collapseColumns : The zero-based index of the columns to collapse.  [string]
-android:columnCount : The maxmimum number of columns to create when automatically positioning  children.  [integer]
-android:columnOrderPreserved : When set to true, forces column boundaries to appear in the same  order as column indices.  [boolean]
-android:columnWidth : Specifies the fixed width for each column.  [dimension]
-android:completionHint : Defines the hint displayed in the drop down menu.  [string]
-android:completionHintView : Defines the hint view displayed in the drop down menu.  [reference]
-android:completionThreshold : Defines the number of characters that the user must type before  completion suggestions are displayed in a drop down menu.  [integer]
-android:content : Identifier for the child that represents the drawer's content.  [reference]
-android:contentDescription : Defines text that briefly describes content of the view.  [string]
-android:cropToPadding : If true, the image will be cropped to fit within its padding.  [boolean]
-android:cursorVisible : Makes the cursor visible (the default) or invisible.  [boolean]
-android:dateTextAppearance : The text appearance for the calendar dates.  [reference]
-android:descendantFocusability : Defines the relationship between the ViewGroup and its descendants  when looking for a View to take focus.  [enum]
-android:dial : [reference]
-android:digits : If set, specifies that this TextView has a numeric input method  and that these specific characters are the ones that it will  accept.  [string]
-android:disableChildrenWhenDisabled : Whether this spinner should mark child views as enabled/disabled  when the spinner itself is enabled/disabled.  [boolean]
-android:disabledAlpha : The alpha to apply to the indicator when disabled.  [float]
-android:divider : Drawable to use as a vertical divider between buttons.
-android:dividerHeight : Height of the divider.  [dimension]
-android:dividerPadding : Size of padding on either end of a divider.  [dimension]
-android:drawSelectorOnTop : When set to true, the selector will be drawn over the selected  item.  [boolean]
-android:drawableBottom : The drawable to be drawn below the text.  [color, reference]
-android:drawableEnd : The drawable to be drawn to the end of the text.  [color, reference]
-android:drawableLeft : The drawable to be drawn to the left of the text.  [color, reference]
-android:drawablePadding : The padding between the drawables and the text.  [dimension]
-android:drawableRight : The drawable to be drawn to the right of the text.  [color, reference]
-android:drawableStart : The drawable to be drawn to the start of the text.  [color, reference]
-android:drawableTop : The drawable to be drawn above the text.  [color, reference]
-android:drawingCacheQuality : Defines the quality of translucent drawing caches.  [enum]
-android:dropDownAnchor : View to anchor the auto-complete dropdown to.  [reference]
-android:dropDownHeight : Specifies the basic height of the dropdown.  [dimension, enum]
-android:dropDownHorizontalOffset : Horizontal offset from the spinner widget for positioning the  dropdown in spinnerMode="dropdown".  [dimension]
-android:dropDownSelector : List selector to use for spinnerMode="dropdown" display.  [color, reference]
-android:dropDownVerticalOffset : Vertical offset from the spinner widget for positioning the dropdown  in spinnerMode="dropdown".  [dimension]
-android:dropDownWidth : Width of the dropdown in spinnerMode="dropdown".  [dimension, enum]
-android:duplicateParentState : When this attribute is set to true, the view gets its drawable  state (focused, pressed, etc.) from its direct parent rather  than from itself.  [boolean]
-android:editable : If set, specifies that this TextView has an input method. * Deprecated: Use inputType instead.  [boolean]
-android:editorExtras : Reference to an "input-extras" XML resource containing additional  data to supply to an input method, which is private to the implementation  of the input method.  [reference]
-android:ellipsize : If set, causes words that are longer than the view is wide to  be ellipsized instead of broken in the middle.  [enum]
-android:ems : Makes the TextView be exactly this many ems wide.  [integer]
-android:enabled : Specifies whether the widget is enabled.  [boolean]
-android:endYear : The last year (inclusive), for example "2010". * Deprecated: Use maxDate instead.  [integer]
-android:entries : Reference to an array resource that will populate the Spinner.  [reference]
-android:eventsInterceptionEnabled : Defines whether the overlay should intercept the motion events  when a gesture is recognized.  [boolean]
-android:fadeDuration : Duration, in milliseconds, of the fade out effect after the user  is done drawing a gesture.  [integer]
-android:fadeEnabled : Defines whether the gesture will automatically fade out after  being recognized.  [boolean]
-android:fadeOffset : Time, in milliseconds, to wait before the gesture fades out after  the user is done drawing it.  [integer]
-android:fadeScrollbars : Defines whether to fade out scrollbars when they are not in use.  [boolean]
-android:fadingEdge : This attribute is deprecated and will be ignored as of API level  14 (ICE_CREAM_SANDWICH).  [flag]
-android:fadingEdgeLength : Defines the length of the fading edges.  [dimension]
-android:fastScrollAlwaysVisible : When set to true, the list will always show the fast scroll interface.  [boolean]
-android:fastScrollEnabled : Enables the fast scroll thumb that can be dragged to quickly  scroll through the list.  [boolean]
-android:fillViewport : Defines whether the scrollview should stretch its content to  fill the viewport.  [boolean]
-android:filterTouchesWhenObscured : Specifies whether to filter touches when the view's window is  obscured by another visible window.  [boolean]
-android:firstDayOfWeek : The first day of week according to java.util.Calendar.  [integer]
-android:fitsSystemWindows : Boolean internal attribute to adjust view layout based on system  windows such as the status bar.  [boolean]
-android:flipInterval : [integer]
-android:focusable : Boolean that controls whether a view can take focus.  [boolean]
-android:focusableInTouchMode : Boolean that controls whether a view can take focus while in  touch mode.  [boolean]
-android:focusedMonthDateColor : The color for the dates of the focused month.  [color, reference]
-android:fontFamily : Font family (named by string) for the text.  [string]
-android:footerDividersEnabled : When set to false, the ListView will not draw the divider before  each footer view.  [boolean]
-android:foreground : Defines the drawable to draw over the content.  [color, reference]
-android:foregroundGravity : Defines the gravity to apply to the foreground drawable.  [flag]
-android:foregroundInsidePadding : Defines whether the foreground drawable should be drawn inside  the padding.  [boolean]
-android:format : Format string: if specified, the Chronometer will display this  string, with the first "%s" replaced by the current timer value  in "MM:SS" or "H:MM:SS" form.  [string]
-android:freezesText : If set, the text view will include its current complete text  inside of its frozen icicle in addition to meta-data such as  the current cursor position.  [boolean]
-android:gestureColor : Color used to draw a gesture.  [color]
-android:gestureStrokeAngleThreshold : Minimum curve angle a stroke must contain before it is recognized  as a gesture.  [float]
-android:gestureStrokeLengthThreshold : Minimum length of a stroke before it is recognized as a gesture.  [float]
-android:gestureStrokeSquarenessThreshold : Squareness threshold of a stroke before it is recognized as a  gesture.  [float]
-android:gestureStrokeType : Defines the type of strokes that define a gesture.  [enum]
-android:gestureStrokeWidth : Width of the stroke used to draw the gesture.  [float]
-android:gravity : Specifies how to place the content of an object, both on the  x- and y-axis, within the object itself.  [flag]
-android:groupIndicator : Indicator shown beside the group View.  [reference]
-android:hand_hour : [reference]
-android:hand_minute : [reference]
-android:handle : Identifier for the child that represents the drawer's handle.  [reference]
-android:hapticFeedbackEnabled : Boolean that controls whether a view should have haptic feedback  enabled for events such as long presses.  [boolean]
-android:headerDividersEnabled : When set to false, the ListView will not draw the divider after  each header view.  [boolean]
-android:height : Makes the TextView be exactly this many pixels tall.  [dimension]
-android:hint : Hint text to display when the text is empty.  [string]
-android:horizontalSpacing : Defines the default horizontal spacing between columns.  [dimension]
-android:iconifiedByDefault : The default state of the SearchView.  [boolean]
-android:id : Supply an identifier name for the top-level view, to later retrieve  it with View.findViewById() or Activity.findViewById().  [reference]
-android:ignoreGravity : Indicates what view should not be affected by gravity.  [reference]
-android:imeActionId : Supply a value for EditorInfo.actionId used when an input method  is connected to the text view.  [integer]
-android:imeActionLabel : Supply a value for EditorInfo.actionLabel used when an input  method is connected to the text view.  [string]
-android:imeOptions : Additional features you can enable in an IME associated with  an editor to improve the integration with your application.  [flag]
-android:importantForAccessibility : Controls how this View is important for accessibility which is  if it fires accessibility events and if it is reported to accessibility  services that query the screen.  [integer, enum]
-android:inAnimation : Identifier for the animation to use when a view is shown.  [reference]
-android:includeFontPadding : Leave enough room for ascenders and descenders instead of using  the font ascent and descent strictly.  [boolean]
-android:indeterminate : Allows to enable the indeterminate mode.  [boolean]
-android:indeterminateBehavior : Defines how the indeterminate mode should behave when the progress  reaches max.  [enum]
-android:indeterminateDrawable : Drawable used for the indeterminate mode.  [reference]
-android:indeterminateDuration : Duration of the indeterminate animation.  [integer]
-android:indeterminateOnly : Restricts to ONLY indeterminate mode (state-keeping progress  mode will not work).  [boolean]
-android:indicatorLeft : The left bound for an item's indicator.  [dimension]
-android:indicatorRight : The right bound for an item's indicator.  [dimension]
-android:inflatedId : Overrides the id of the inflated View with this value.  [reference]
-android:inputMethod : If set, specifies that this TextView should use the specified  input method (specified by fully-qualified class name). * Deprecated: Use inputType instead.  [string]
-android:inputType : The type of data being placed in a text field, used to help an  input method decide how to let the user enter text.  [flag]
-android:interpolator : [reference]
-android:isIndicator : Whether this rating bar is an indicator (and non-changeable by  the user).  [boolean]
-android:isScrollContainer : Set this if the view will serve as a scrolling container, meaing  that it can be resized to shrink its overall window so that there  will be space for an input method.  [boolean]
-android:keepScreenOn : Controls whether the view's window should keep the screen on  while visible.  [boolean]
-android:layerType : Specifies the type of layer backing this view.  [enum]
-layout : [reference]. * Required.
-android:layoutAnimation : Defines the layout animation to use the first time the ViewGroup  is laid out.  [reference]
-android:layoutDirection : Defines the direction of layout drawing.  [enum]
-android:lineSpacingExtra : Extra spacing between lines of text.  [dimension]
-android:lineSpacingMultiplier : Extra spacing between lines of text, as a multiplier.  [float]
-android:lines : Makes the TextView be exactly this many lines tall.  [integer]
-android:linksClickable : If set to false, keeps the movement method from being set to  the link movement method even if autoLink causes links to be  found.  [boolean]
-android:listSelector : Drawable used to indicate the currently selected item in the  list.  [color, reference]
-android:longClickable : Defines whether this view reacts to long click events.  [boolean]
-android:loopViews : Defines whether the animator loops to the first view once it  has reached the end of the list.  [boolean]
-android:marqueeRepeatLimit : The number of times to repeat the marquee animation.  [integer, enum]
-android:max : Defines the maximum value the progress can take.  [integer]
-android:maxDate : The minimal date shown by this calendar view in mm/dd/yyyy format.  [string]
-android:maxEms : Makes the TextView be at most this many ems wide.  [integer]
-android:maxHeight : An optional argument to supply a maximum height for this view.  [dimension]
-android:maxLength : Set an input filter to constrain the text length to the specified  number.  [integer]
-android:maxLines : Makes the TextView be at most this many lines tall.  [integer]
-android:maxWidth : An optional argument to supply a maximum width for this view.  [dimension]
-android:measureAllChildren : Determines whether to measure all children or just those in the  VISIBLE or INVISIBLE state when measuring.  [boolean]
-android:measureWithLargestChild : When set to true, all children with a weight will be considered  having the minimum size of the largest child.  [boolean]
-android:minDate : The minimal date shown by this calendar view in mm/dd/yyyy format.  [string]
-android:minEms : Makes the TextView be at least this many ems wide.  [integer]
-android:minHeight : Defines the minimum height of the view.
-android:minLines : Makes the TextView be at least this many lines tall.  [integer]
-android:minWidth : Defines the minimum width of the view.
-android:mode : [enum]
-android:name : Supply the name of the fragment class to instantiate.
-android:nextFocusDown : Defines the next view to give focus to when the next focus is FOCUS_DOWN If the reference refers to a view that does not exist or is  part of a hierarchy that is invisible, a java.lang.RuntimeException will result when the  reference is accessed.  [reference]
-android:nextFocusForward : Defines the next view to give focus to when the next focus is FOCUS_FORWARD If the reference refers to a view that does not exist or is  part of a hierarchy that is invisible, a java.lang.RuntimeException will result when the  reference is accessed.  [reference]
-android:nextFocusLeft : Defines the next view to give focus to when the next focus is FOCUS_LEFT.  [reference]
-android:nextFocusRight : Defines the next view to give focus to when the next focus is FOCUS_RIGHT If the reference refers to a view that does not exist or is  part of a hierarchy that is invisible, a java.lang.RuntimeException will result when the  reference is accessed.  [reference]
-android:nextFocusUp : Defines the next view to give focus to when the next focus is FOCUS_UP If the reference refers to a view that does not exist or is  part of a hierarchy that is invisible, a java.lang.RuntimeException will result when the  reference is accessed.  [reference]
-android:numColumns : Defines how many columns to show.  [integer, enum]
-android:numStars : The number of stars (or rating items) to show.  [integer]
-android:numeric : If set, specifies that this TextView has a numeric input method. * Deprecated: Use inputType instead.  [flag]
-android:onClick : Name of the method in this View's context to invoke when the  view is clicked.  [string]
-android:orientation : Should the layout be a column or a row? Use "horizontal" for  a row, "vertical" for a column.  [enum]
-android:outAnimation : Identifier for the animation to use when a view is hidden.  [reference]
-android:overScrollFooter : Drawable to draw below list content.  [color, reference]
-android:overScrollHeader : Drawable to draw above list content.  [color, reference]
-android:overScrollMode : Defines over-scrolling behavior.  [enum]
-android:padding : Sets the padding, in pixels, of all four edges.  [dimension]
-android:paddingBottom : Sets the padding, in pixels, of the bottom edge; see padding.  [dimension]
-android:paddingEnd : Sets the padding, in pixels, of the end edge; see padding.  [dimension]
-android:paddingLeft : Sets the padding, in pixels, of the left edge; see padding.  [dimension]
-android:paddingRight : Sets the padding, in pixels, of the right edge; see padding.  [dimension]
-android:paddingStart : Sets the padding, in pixels, of the start edge; see padding.  [dimension]
-android:paddingTop : Sets the padding, in pixels, of the top edge; see padding.  [dimension]
-android:password : Whether the characters of the field are displayed as password  dots instead of themselves. * Deprecated: Use inputType instead.  [boolean]
-android:persistentDrawingCache : Defines the persistence of the drawing cache.  [flag]
-android:phoneNumber : If set, specifies that this TextView has a phone number input  method. * Deprecated: Use inputType instead.  [boolean]
-android:popupBackground : Background drawable to use for the dropdown in spinnerMode="dropdown".  [color, reference]
-android:popupPromptView : Reference to a layout to use for displaying a prompt in the dropdown  for spinnerMode="dropdown".  [reference]
-android:privateImeOptions : An addition content type description to supply to the input method  attached to the text view, which is private to the implementation  of the input method.  [string]
-android:progress : Defines the default progress value, between 0 and max.  [integer]
-android:progressDrawable : Drawable used for the progress mode.  [reference]
-android:prompt : The prompt to display when the spinner's dialog is shown.  [reference]
-android:queryHint : An optional query hint string to be displayed in the empty query  field.  [string]
-android:quickContactWindowSize : [enum]
-android:rating : The rating to set by default.  [float]
-android:requiresFadingEdge : Defines which edges should be faded on scrolling.  [flag]
-android:resOutColor : Color of the res-out outline.  [color]
-android:rotation : rotation of the view, in degrees.  [float]
-android:rotationX : rotation of the view around the x axis, in degrees.  [float]
-android:rotationY : rotation of the view around the y axis, in degrees.  [float]
-android:rowCount : The maxmimum number of rows to create when automatically positioning  children.  [integer]
-android:rowOrderPreserved : When set to true, forces row boundaries to appear in the same  order as row indices.  [boolean]
-android:saveEnabled : If unset, no state will be saved for this view when it is being  frozen.  [boolean]
-android:scaleType : Controls how the image should be resized or moved to match the  size of this ImageView.  [enum]
-android:scaleX : scale of the view in the x direction.  [float]
-android:scaleY : scale of the view in the y direction.  [float]
-android:scrollHorizontally : Whether the text is allowed to be wider than the view (and therefore  can be scrolled horizontally).  [boolean]
-android:scrollX : The initial horizontal scroll offset, in pixels.  [dimension]
-android:scrollY : The initial vertical scroll offset, in pixels.  [dimension]
-android:scrollbarAlwaysDrawHorizontalTrack : Defines whether the horizontal scrollbar track should always  be drawn.  [boolean]
-android:scrollbarAlwaysDrawVerticalTrack : Defines whether the vertical scrollbar track should always be  drawn.  [boolean]
-android:scrollbarDefaultDelayBeforeFade : Defines the delay in milliseconds that a scrollbar waits before  fade out.  [integer]
-android:scrollbarFadeDuration : Defines the delay in milliseconds that a scrollbar takes to fade  out.  [integer]
-android:scrollbarSize : Sets the width of vertical scrollbars and height of horizontal  scrollbars.  [dimension]
-android:scrollbarStyle : Controls the scrollbar style and position.  [enum]
-android:scrollbarThumbHorizontal : Defines the horizontal scrollbar thumb drawable.  [reference]
-android:scrollbarThumbVertical : Defines the vertical scrollbar thumb drawable.  [reference]
-android:scrollbarTrackHorizontal : Defines the horizontal scrollbar track drawable.  [reference]
-android:scrollbarTrackVertical : Defines the vertical scrollbar track drawable.  [reference]
-android:scrollbars : Defines which scrollbars should be displayed on scrolling or  not.  [flag]
-android:scrollingCache : When set to true, the list uses a drawing cache during scrolling.  [boolean]
-android:secondaryProgress : Defines the secondary progress value, between 0 and max.  [integer]
-android:selectAllOnFocus : If the text is selectable, select it all when the view takes  focus.  [boolean]
-android:selectedDateVerticalBar : Drawable for the vertical bar shown at the beginning and at the  end of the selected date.  [reference]
-android:selectedWeekBackgroundColor : The background color for the selected week.  [color, reference]
-android:shadowColor : Place a shadow of the specified color behind the text.  [color]
-android:shadowDx : Horizontal offset of the shadow.  [float]
-android:shadowDy : Vertical offset of the shadow.  [float]
-android:shadowRadius : Radius of the shadow.  [float]
-android:showDividers : Setting for which dividers to show.  [flag]
-android:showWeekNumber : Whether do show week numbers.  [boolean]
-android:shownWeekCount : The number of weeks to be shown.  [integer]
-android:shrinkColumns : The zero-based index of the columns to shrink.  [string]
-android:singleLine : Constrains the text to a single horizontally scrolling line instead  of letting it wrap onto multiple lines, and advances focus instead  of inserting a newline when you press the enter key. * Deprecated: This attribute is deprecated. Use "maxLines" instead  to change the layo...
-android:smoothScrollbar : When set to true, the list will use a more refined calculation  method based on the pixels height of the items visible on screen.  [boolean]
-android:soundEffectsEnabled : Boolean that controls whether a view should have sound effects  enabled for events such as clicking and touching.  [boolean]
-android:spacing : [dimension]
-android:spinnerMode : Display mode for spinner options.  [enum]
-android:spinnersShown : Whether the spinners are shown.  [boolean]
-android:splitMotionEvents : Sets whether this ViewGroup should split MotionEvents to separate  child views during touch event dispatch.  [boolean]
-android:src : Sets a drawable as the content of this ImageView.  [color, reference]
-android:stackFromBottom : Used by ListView and GridView to stack their content from the  bottom.  [boolean]
-android:startYear : The first year (inclusive), for example "1940". * Deprecated: Use minDate instead.  [integer]
-android:stepSize : The step size of the rating.  [float]
-android:stretchColumns : The zero-based index of the columns to stretch.  [string]
-android:stretchMode : Defines how columns should stretch to fill the available empty  space, if any.  [enum]
-style : A reference to a custom style  [reference]
-android:switchMinWidth : Minimum width for the switch component  [dimension]
-android:switchPadding : Minimum space between the switch and caption text  [dimension]
-android:switchTextAppearance : TextAppearance style for text displayed on the switch thumb.  [reference]
-android:tabLayout : Layout used to organize each tab's content.  [reference]
-android:tabStripEnabled : Determines whether the strip under the tab indicators is drawn  or not.  [boolean]
-android:tabStripLeft : Drawable used to draw the left part of the strip underneath the  tabs.  [reference]
-android:tabStripRight : Drawable used to draw the right part of the strip underneath  the tabs.  [reference]
-android:tag : Supply a tag for the top-level view containing a String, to be  retrieved later with View.getTag() or searched for with View.findViewWithTag() .  [string]
-android:text : Text to display.  [string]
-android:textAlignment : Alignment of the text.  [integer, enum]
-android:textAllCaps : Present the text in ALL CAPS.  [boolean]
-android:textAppearance : Base text color, typeface, size, and style.  [reference]
-android:textColor : Text color.  [color, reference]
-android:textColorHighlight : Color of the text selection highlight.  [color, reference]
-android:textColorHint : Color of the hint text.  [color, reference]
-android:textColorLink : Text color for links.  [color, reference]
-android:textCursorDrawable : Reference to a drawable that will be drawn under the insertion  cursor.  [reference]
-android:textDirection : Direction of the text.  [integer, enum]
-android:textEditNoPasteWindowLayout : Variation of textEditPasteWindowLayout displayed when the clipboard  is empty.  [reference]
-android:textEditPasteWindowLayout : The layout of the view that is displayed on top of the cursor  to paste inside a TextEdit field.  [reference]
-android:textEditSideNoPasteWindowLayout : Variation of textEditSidePasteWindowLayout displayed when the  clipboard is empty.  [reference]
-android:textEditSidePasteWindowLayout : Used instead of textEditPasteWindowLayout when the window is  moved on the side of the insertion cursor because it would be  clipped if it were positioned on top.  [reference]
-android:textEditSuggestionItemLayout : Layout of the TextView item that will populate the suggestion  popup window.  [reference]
-android:textFilterEnabled : When set to true, the list will filter results as the user types.  [boolean]
-android:textIsSelectable : Indicates that the content of a non-editable text can be selected.  [boolean]
-android:textOff : The text for the button when it is not checked.  [string]
-android:textOn : The text for the button when it is checked.  [string]
-android:textScaleX : Sets the horizontal scaling factor for the text.  [float]
-android:textSelectHandle : Reference to a drawable that will be used to display a text selection  anchor for positioning the cursor within text.  [reference]
-android:textSelectHandleLeft : Reference to a drawable that will be used to display a text selection  anchor on the left side of a selection region.  [reference]
-android:textSelectHandleRight : Reference to a drawable that will be used to display a text selection  anchor on the right side of a selection region.  [reference]
-android:textSize : Size of the text.  [dimension]
-android:textStyle : Style (bold, italic, bolditalic) for the text.  [flag]
-android:thumb : Drawable to use as the "thumb" that switches back and forth.  [reference]
-android:thumbOffset : An offset for the thumb that allows it to extend out of the range  of the track.  [dimension]
-android:thumbTextPadding : Amount of padding on either side of text within the switch thumb.  [dimension]
-android:tint : Set a tinting color for the image.  [color]
-android:topOffset : Extra offset for the handle at the top of the SlidingDrawer.  [dimension]
-android:track : Drawable to use as the "track" that the switch thumb slides within.  [reference]
-android:transcriptMode : Sets the transcript mode for the list.  [enum]
-android:transformPivotX : x location of the pivot point around which the view will rotate  and scale.  [dimension]
-android:transformPivotY : y location of the pivot point around which the view will rotate  and scale.  [dimension]
-android:translationX : translation in x of the view.  [dimension]
-android:translationY : translation in y of the view.  [dimension]
-android:typeface : Typeface (normal, sans, serif, monospace) for the text.  [enum]
-android:uncertainGestureColor : Color used to draw the user's strokes until we are sure it's  a gesture.  [color]
-android:unfocusedMonthDateColor : The color for the dates of an unfocused month.  [color, reference]
-android:unselectedAlpha : Sets the alpha on the items that are not selected.  [float]
-android:useDefaultMargins : When set to true, tells GridLayout to use default margins when  none are specified in a view's layout parameters.  [boolean]
-android:verticalScrollbarPosition : Determines which side the vertical scroll bar should be placed  on.  [enum]
-android:verticalSpacing : Defines the default vertical spacing between rows.  [dimension]
-android:visibility : Controls the initial visibility of the view.  [enum]
-android:weekDayTextAppearance : The text appearance for the week day abbreviation of the calendar  header.  [reference]
-android:weekNumberColor : The color for the week numbers.  [color, reference]
-android:weekSeparatorLineColor : The color for the separator line between weeks.  [color, reference]
-android:weightSum : Defines the maximum weight sum.  [float]
-android:width : Makes the TextView be exactly this many pixels wide.  [dimension]
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completionvalues1-expected-completion33.txt b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completionvalues1-expected-completion33.txt
deleted file mode 100644
index f9c008d..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completionvalues1-expected-completion33.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-Code completion in completionvalues1.xml for <item name="android:allowSingleTap">^</item>:
-true
-false
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completionvalues1-expected-completion34.txt b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completionvalues1-expected-completion34.txt
deleted file mode 100644
index 861a413..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completionvalues1-expected-completion34.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-Code completion in completionvalues1.xml for <item name="android:alwaysDrawnWithCache">^  false  </item>:
-true
-false
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completionvalues1-expected-completion35.txt b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completionvalues1-expected-completion35.txt
deleted file mode 100644
index 25e8a0b..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completionvalues1-expected-completion35.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-Code completion in completionvalues1.xml for <item name="android:alwaysDrawnWithCache">  ^false  </item>:
-true
-false
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completionvalues1-expected-completion36.txt b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completionvalues1-expected-completion36.txt
deleted file mode 100644
index d85133f..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completionvalues1-expected-completion36.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-Code completion in completionvalues1.xml for <item name="android:alwaysDrawnWithCache">  f^alse  </item>:
-false
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completionvalues1-expected-completion37.txt b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completionvalues1-expected-completion37.txt
deleted file mode 100644
index 1d41351..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completionvalues1-expected-completion37.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-Code completion in completionvalues1.xml for <item name="android:orientation">h^</item>:
-horizontal
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completionvalues1-expected-completion38.txt b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completionvalues1-expected-completion38.txt
deleted file mode 100644
index 8819bcd..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completionvalues1-expected-completion38.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-Code completion in completionvalues1.xml for            c^:
-center_vertical
-center_horizontal
-center
-clip_vertical
-clip_horizontal
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completionvalues1-expected-completion66.txt b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completionvalues1-expected-completion66.txt
deleted file mode 100644
index 4f29a8b..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completionvalues1-expected-completion66.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-Code completion in completionvalues1.xml for 17[^sp]:
-17dp : <b>Density-independent Pixels</b> - an abstract unit that is based on the physical density of the screen.
-17sp : <b>Scale-independent Pixels</b> - this is like the dp unit, but it is also scaled by the user's font size preference.
-17pt : <b>Points</b> - 1/72 of an inch based on the physical size of the screen.
-17mm : <b>Millimeters</b> - based on the physical size of the screen.
-17in : <b>Inches</b> - based on the physical size of the screen.
-17px : <b>Pixels</b> - corresponds to actual pixels on the screen. Not recommended.
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completionvalues1-expected-completion67.txt b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completionvalues1-expected-completion67.txt
deleted file mode 100644
index 4f29a8b..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completionvalues1-expected-completion67.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-Code completion in completionvalues1.xml for 17[^sp]:
-17dp : <b>Density-independent Pixels</b> - an abstract unit that is based on the physical density of the screen.
-17sp : <b>Scale-independent Pixels</b> - this is like the dp unit, but it is also scaled by the user's font size preference.
-17pt : <b>Points</b> - 1/72 of an inch based on the physical size of the screen.
-17mm : <b>Millimeters</b> - based on the physical size of the screen.
-17in : <b>Inches</b> - based on the physical size of the screen.
-17px : <b>Pixels</b> - corresponds to actual pixels on the screen. Not recommended.
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completionvalues1-expected-completion68.txt b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completionvalues1-expected-completion68.txt
deleted file mode 100644
index 5aa1d43..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completionvalues1-expected-completion68.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-Code completion in completionvalues1.xml for [^false]:
-true
-false
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completionvalues1.xml b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completionvalues1.xml
deleted file mode 100644
index 89b5f46..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completionvalues1.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<resources xmlns:android="http://schemas.android.com/apk/res/android">
-    <style name="stylename">
-        <item name="android:textSize">17sp</item>
-        <item name="android:textColor">@color/title_color</item>
-        <item name="android:shadowColor">@an</item>
-        <item name="android:gravity">  </item>
-        <item name="gr">@color/title_color</item>
-        <item name="an">@color/title_color</item>
-        <item ></item>
-        <item name=""></item>
-        <item name="android:allowSingleTap"></item>
-        <item name="android:alwaysDrawnWithCache">  false  </item>
-        <item name="android:orientation">h</item>
-        <item name="android:gravity">
-           c
-        </item>
-    </style>
-</resources>
-
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completionvalues2-expected-applyCompletion45.diff b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completionvalues2-expected-applyCompletion45.diff
deleted file mode 100644
index 6498668..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completionvalues2-expected-applyCompletion45.diff
+++ /dev/null
@@ -1,4 +0,0 @@
-Code completion in completionvalues2.xml for @string/^app_name selecting @string/hello:
-<      <item name="main_layout5" type="string">@string/^app_name</item>
----
->      <item name="main_layout5" type="string">@string/hello^</item>
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completionvalues2-expected-completion70.txt b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completionvalues2-expected-completion70.txt
deleted file mode 100644
index 20f8a74..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completionvalues2-expected-completion70.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-Code completion in completionvalues2.xml for <item name="main_layout4" type="layout">^</item>:
-@android:
-@layout/
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completionvalues2-expected-completion71.txt b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completionvalues2-expected-completion71.txt
deleted file mode 100644
index c491fea..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completionvalues2-expected-completion71.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-Code completion in completionvalues2.xml for <item name="main_layout5" type="string">@string/^app_name</item>:
-@string/app_name
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completionvalues2.xml b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completionvalues2.xml
deleted file mode 100644
index 293abc0..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/completionvalues2.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<resources>
-     <item name="main_layout" type="layout">@layout/main2</item>
-     <item name="main_layout2" type="layout"> @layout/main_layout </item>
-     <item name="main_layout3" type="layout"> </item>
-     <item name="main_layout4" type="layout"></item>
-     <item name="main_layout5" type="string">@string/app_name</item>
-</resources>
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/drawable1-expected-completion47.txt b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/drawable1-expected-completion47.txt
deleted file mode 100644
index c7f495b..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/drawable1-expected-completion47.txt
+++ /dev/null
@@ -1,12 +0,0 @@
-Code completion in drawable1.xml for ^<layer-list:
-<animation-list /> : Drawable used to render several animated frames.
-<bitmap /> : Drawable used to draw bitmaps.
-<clip />
-<color /> : Drawable used to draw a single color.
-<inset />
-<layer-list ></layer-list> : Drawable used to render several drawables stacked on top of each  other.
-<nine-patch /> : Drawable used to draw 9-patches.
-<rotate /> : Drawable used to rotate another drawable.
-<scale />
-<selector ></selector> : Drawable used to render several states.
-<shape ></shape> : Drawable used to render a geometric shape, with a gradient or  a solid color.
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/drawable1-expected-completion48.txt b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/drawable1-expected-completion48.txt
deleted file mode 100644
index 024cdeb..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/drawable1-expected-completion48.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-Code completion in drawable1.xml for ^xmlns:android:
-android:opacity : Indicates the opacity of the layer.  [enum]
-xmlns:android
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/drawable1-expected-completion49.txt b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/drawable1-expected-completion49.txt
deleted file mode 100644
index 269fd86..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/drawable1-expected-completion49.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-Code completion in drawable1.xml for <item ^></item>:
-android:left : Left coordinate of the layer.  [dimension]
-android:top : Top coordinate of the layer.  [dimension]
-android:right : Right coordinate of the layer.  [dimension]
-android:bottom : Bottom coordinate of the layer.  [dimension]
-android:drawable : Drawable used to render the layer.  [reference]
-android:id : Identifier of the layer.  [reference]
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/drawable1-expected-completion50.txt b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/drawable1-expected-completion50.txt
deleted file mode 100644
index d05bc76..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/drawable1-expected-completion50.txt
+++ /dev/null
@@ -1,12 +0,0 @@
-Code completion in drawable1.xml for <item >^</item>:
-<animation-list /> : Drawable used to render several animated frames.
-<bitmap /> : Drawable used to draw bitmaps.
-<clip />
-<color /> : Drawable used to draw a single color.
-<inset />
-<layer-list ></layer-list> : Drawable used to render several drawables stacked on top of each  other.
-<nine-patch /> : Drawable used to draw 9-patches.
-<rotate /> : Drawable used to rotate another drawable.
-<scale />
-<selector ></selector> : Drawable used to render several states.
-<shape ></shape> : Drawable used to render a geometric shape, with a gradient or  a solid color.
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/drawable1.xml b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/drawable1.xml
deleted file mode 100644
index 9513f17..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/drawable1.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<layer-list
-  xmlns:android="http://schemas.android.com/apk/res/android">
-  <item ></item>
-</layer-list>
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/drawable2-expected-completion51.txt b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/drawable2-expected-completion51.txt
deleted file mode 100644
index 438bd76..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/drawable2-expected-completion51.txt
+++ /dev/null
@@ -1,10 +0,0 @@
-Code completion in drawable2.xml for ^android:innerRadiusRatio="2":
-android:visible : Indicates whether the drawable should intially be visible.  [boolean]
-android:dither : Enables or disables dithering.  [boolean]
-android:shape : Indicates what shape to fill with a gradient.  [enum]
-android:innerRadiusRatio : Inner radius of the ring expressed as a ratio of the ring's width.  [float]
-android:thicknessRatio : Thickness of the ring expressed as a ratio of the ring's width.  [float]
-android:innerRadius : Inner radius of the ring.  [dimension]
-android:thickness : Thickness of the ring.  [dimension]
-android:useLevel : Indicates whether the drawable's level affects the way the gradient  is drawn.
-xmlns:android
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/drawable2-expected-completion52.txt b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/drawable2-expected-completion52.txt
deleted file mode 100644
index 2a28533..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/drawable2-expected-completion52.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-Code completion in drawable2.xml for ^<gradient:
-<corners /> : Describes the corners for the rectangle shape of a GradientDrawable.
-<gradient /> : Used to describe the gradient used to fill the shape of a GradientDrawable.
-<padding /> : Used to specify the optional padding of a GradientDrawable.
-<size /> : Used to specify the size of the shape for GradientDrawable.
-<solid /> : Used to fill the shape of GradientDrawable with a solid color.
-<stroke /> : Used to describe the optional stroke of a GradientDrawable.
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/drawable2.xml b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/drawable2.xml
deleted file mode 100644
index c6a672f..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/drawable2.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<shape xmlns:android="http://schemas.android.com/apk/res/android"
-    android:innerRadiusRatio="2">
-    <gradient />
-</shape>
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/edithandling.xml b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/edithandling.xml
deleted file mode 100644
index 0488fd6..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/edithandling.xml
+++ /dev/null
@@ -1,3 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android">
-</LinearLayout>
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/extractstyle1-expected-extract1b.diff b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/extractstyle1-expected-extract1b.diff
deleted file mode 100644
index e21c594..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/extractstyle1-expected-extract1b.diff
+++ /dev/null
@@ -1,34 +0,0 @@
-@@ -2 +2
--     android:layout_width="wrap_content" android:layout_height="match_parent">
--     <Button android:text="Button"
--         android:layout_width="wrap_content" android:layout_height="wrap_content"
--         android:textColor="#FF0000" android:textSize="20pt"
--         android:id="@+id/button1" android:layout_alignParentBottom="true"></Button>
--     <Button android:text="Button"
--         android:layout_width="wrap_content" android:layout_height="fill_parent"
--         android:textColor="#FF00FF" android:textSize="20pt"
--         android:id="@+id/button2" android:layout_alignParentBottom="true"></Button>
-+     android:layout_width="wrap_content"
-+     android:layout_height="match_parent" >
-+
-+     <Button
-+         android:id="@+id/button1"
-+         android:layout_width="wrap_content"
-+         android:layout_height="wrap_content"
-+         android:layout_alignParentBottom="true"
-+         android:text="Button"
-+         android:textColor="#FF0000"
-+         android:textSize="20pt" >
-+     </Button>
-+
-+     <Button
-+         android:id="@+id/button2"
-+         style="@style/newstyle"
-+         android:layout_width="wrap_content"
-+         android:layout_height="fill_parent"
-+         android:layout_alignParentBottom="true"
-+         android:text="Button"
-+         android:textColor="#FF00FF"
-+         android:textSize="20pt" >
-+     </Button>
-+
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/extractstyle1-expected-extract1c.diff b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/extractstyle1-expected-extract1c.diff
deleted file mode 100644
index 8c12b7c..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/extractstyle1-expected-extract1c.diff
+++ /dev/null
@@ -1,31 +0,0 @@
-@@ -2 +2
--     android:layout_width="wrap_content" android:layout_height="match_parent">
--     <Button android:text="Button"
--         android:layout_width="wrap_content" android:layout_height="wrap_content"
--         android:textColor="#FF0000" android:textSize="20pt"
--         android:id="@+id/button1" android:layout_alignParentBottom="true"></Button>
--     <Button android:text="Button"
--         android:layout_width="wrap_content" android:layout_height="fill_parent"
--         android:textColor="#FF00FF" android:textSize="20pt"
--         android:id="@+id/button2" android:layout_alignParentBottom="true"></Button>
-+     android:layout_width="wrap_content"
-+     android:layout_height="match_parent" >
-+
-+     <Button
-+         android:id="@+id/button1"
-+         android:layout_width="wrap_content"
-+         android:layout_height="wrap_content"
-+         android:layout_alignParentBottom="true"
-+         android:text="Button"
-+         android:textColor="#FF0000"
-+         android:textSize="20pt" >
-+     </Button>
-+
-+     <Button
-+         android:id="@+id/button2"
-+         android:layout_width="wrap_content"
-+         android:layout_height="fill_parent"
-+         android:layout_alignParentBottom="true"
-+         android:text="Button" >
-+     </Button>
-+
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/extractstyle1-expected-extract1d.diff b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/extractstyle1-expected-extract1d.diff
deleted file mode 100644
index c819b09..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/extractstyle1-expected-extract1d.diff
+++ /dev/null
@@ -1,32 +0,0 @@
-@@ -2 +2
--     android:layout_width="wrap_content" android:layout_height="match_parent">
--     <Button android:text="Button"
--         android:layout_width="wrap_content" android:layout_height="wrap_content"
--         android:textColor="#FF0000" android:textSize="20pt"
--         android:id="@+id/button1" android:layout_alignParentBottom="true"></Button>
--     <Button android:text="Button"
--         android:layout_width="wrap_content" android:layout_height="fill_parent"
--         android:textColor="#FF00FF" android:textSize="20pt"
--         android:id="@+id/button2" android:layout_alignParentBottom="true"></Button>
-+     android:layout_width="wrap_content"
-+     android:layout_height="match_parent" >
-+
-+     <Button
-+         android:id="@+id/button1"
-+         android:layout_width="wrap_content"
-+         android:layout_height="wrap_content"
-+         android:layout_alignParentBottom="true"
-+         android:text="Button"
-+         android:textColor="#FF0000"
-+         android:textSize="20pt" >
-+     </Button>
-+
-+     <Button
-+         android:id="@+id/button2"
-+         style="@style/newstyle"
-+         android:layout_width="wrap_content"
-+         android:layout_height="fill_parent"
-+         android:layout_alignParentBottom="true"
-+         android:text="Button" >
-+     </Button>
-+
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/extractstyle1-expected-extract2.diff b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/extractstyle1-expected-extract2.diff
deleted file mode 100644
index c819b09..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/extractstyle1-expected-extract2.diff
+++ /dev/null
@@ -1,32 +0,0 @@
-@@ -2 +2
--     android:layout_width="wrap_content" android:layout_height="match_parent">
--     <Button android:text="Button"
--         android:layout_width="wrap_content" android:layout_height="wrap_content"
--         android:textColor="#FF0000" android:textSize="20pt"
--         android:id="@+id/button1" android:layout_alignParentBottom="true"></Button>
--     <Button android:text="Button"
--         android:layout_width="wrap_content" android:layout_height="fill_parent"
--         android:textColor="#FF00FF" android:textSize="20pt"
--         android:id="@+id/button2" android:layout_alignParentBottom="true"></Button>
-+     android:layout_width="wrap_content"
-+     android:layout_height="match_parent" >
-+
-+     <Button
-+         android:id="@+id/button1"
-+         android:layout_width="wrap_content"
-+         android:layout_height="wrap_content"
-+         android:layout_alignParentBottom="true"
-+         android:text="Button"
-+         android:textColor="#FF0000"
-+         android:textSize="20pt" >
-+     </Button>
-+
-+     <Button
-+         android:id="@+id/button2"
-+         style="@style/newstyle"
-+         android:layout_width="wrap_content"
-+         android:layout_height="fill_parent"
-+         android:layout_alignParentBottom="true"
-+         android:text="Button" >
-+     </Button>
-+
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/extractstyle1-expected-extract3.diff b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/extractstyle1-expected-extract3.diff
deleted file mode 100644
index 36186b8..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/extractstyle1-expected-extract3.diff
+++ /dev/null
@@ -1,32 +0,0 @@
-@@ -2 +2
--     android:layout_width="wrap_content" android:layout_height="match_parent">
--     <Button android:text="Button"
--         android:layout_width="wrap_content" android:layout_height="wrap_content"
--         android:textColor="#FF0000" android:textSize="20pt"
--         android:id="@+id/button1" android:layout_alignParentBottom="true"></Button>
--     <Button android:text="Button"
--         android:layout_width="wrap_content" android:layout_height="fill_parent"
--         android:textColor="#FF00FF" android:textSize="20pt"
--         android:id="@+id/button2" android:layout_alignParentBottom="true"></Button>
-+     android:layout_width="wrap_content"
-+     android:layout_height="match_parent" >
-+
-+     <Button
-+         android:id="@+id/button1"
-+         style="@style/newstyle"
-+         android:layout_width="wrap_content"
-+         android:layout_height="wrap_content"
-+         android:layout_alignParentBottom="true"
-+         android:text="Button" >
-+     </Button>
-+
-+     <Button
-+         android:id="@+id/button2"
-+         style="@style/newstyle"
-+         android:layout_width="wrap_content"
-+         android:layout_height="fill_parent"
-+         android:layout_alignParentBottom="true"
-+         android:text="Button"
-+         android:textColor="#FF00FF" >
-+     </Button>
-+
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/extractstyle1-expected-extract4.diff b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/extractstyle1-expected-extract4.diff
deleted file mode 100644
index 83837f5..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/extractstyle1-expected-extract4.diff
+++ /dev/null
@@ -1,33 +0,0 @@
-@@ -2 +2
--     android:layout_width="wrap_content" android:layout_height="match_parent">
--     <Button android:text="Button"
--         android:layout_width="wrap_content" android:layout_height="wrap_content"
--         android:textColor="#FF0000" android:textSize="20pt"
--         android:id="@+id/button1" android:layout_alignParentBottom="true"></Button>
--     <Button android:text="Button"
--         android:layout_width="wrap_content" android:layout_height="fill_parent"
--         android:textColor="#FF00FF" android:textSize="20pt"
--         android:id="@+id/button2" android:layout_alignParentBottom="true"></Button>
-+     android:layout_width="wrap_content"
-+     android:layout_height="match_parent" >
-+
-+     <Button
-+         android:id="@+id/button1"
-+         android:layout_width="wrap_content"
-+         android:layout_height="wrap_content"
-+         android:layout_alignParentBottom="true"
-+         android:text="Button"
-+         android:textColor="#FF0000"
-+         android:textSize="20pt" >
-+     </Button>
-+
-+     <Button
-+         android:id="@+id/button2"
-+         style="@style/newstyle"
-+         android:layout_width="wrap_content"
-+         android:layout_height="fill_parent"
-+         android:layout_alignParentBottom="true"
-+         android:text="Button"
-+         android:textSize="20pt" >
-+     </Button>
-+
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/extractstyle1-expected-extract5.diff b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/extractstyle1-expected-extract5.diff
deleted file mode 100644
index 55d658d..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/extractstyle1-expected-extract5.diff
+++ /dev/null
@@ -1,33 +0,0 @@
-@@ -2 +2
--     android:layout_width="wrap_content" android:layout_height="match_parent">
--     <Button android:text="Button"
--         android:layout_width="wrap_content" android:layout_height="wrap_content"
--         android:textColor="#FF0000" android:textSize="20pt"
--         android:id="@+id/button1" android:layout_alignParentBottom="true"></Button>
--     <Button android:text="Button"
--         android:layout_width="wrap_content" android:layout_height="fill_parent"
--         android:textColor="#FF00FF" android:textSize="20pt"
--         android:id="@+id/button2" android:layout_alignParentBottom="true"></Button>
-+     android:layout_width="wrap_content"
-+     android:layout_height="match_parent" >
-+
-+     <Button
-+         android:id="@+id/button1"
-+         style="@style/newstyle"
-+         android:layout_width="wrap_content"
-+         android:layout_height="wrap_content"
-+         android:layout_alignParentBottom="true"
-+         android:text="Button"
-+         android:textColor="#FF0000" >
-+     </Button>
-+
-+     <Button
-+         android:id="@+id/button2"
-+         android:layout_width="wrap_content"
-+         android:layout_height="fill_parent"
-+         android:layout_alignParentBottom="true"
-+         android:text="Button"
-+         android:textColor="#FF00FF"
-+         android:textSize="20pt" >
-+     </Button>
-+
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/extractstyle1-expected-extract6.diff b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/extractstyle1-expected-extract6.diff
deleted file mode 100644
index 1db5e38..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/extractstyle1-expected-extract6.diff
+++ /dev/null
@@ -1,6 +0,0 @@
-<     <Button android:text="Button"
-<         android:layout_width="wrap_content" android:layout_height="wrap_content"
-<         android:textColor="#FF0000" android:textSize="20pt"
-<         android:id="@+id/button1" android:layout_alignParentBottom="true"></Button>
----
->     <Button style="@style/newstyle" android:id="@+id/button1" ></Button>
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/extractstyle1-expected-extract8.diff b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/extractstyle1-expected-extract8.diff
deleted file mode 100644
index 8c12b7c..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/extractstyle1-expected-extract8.diff
+++ /dev/null
@@ -1,31 +0,0 @@
-@@ -2 +2
--     android:layout_width="wrap_content" android:layout_height="match_parent">
--     <Button android:text="Button"
--         android:layout_width="wrap_content" android:layout_height="wrap_content"
--         android:textColor="#FF0000" android:textSize="20pt"
--         android:id="@+id/button1" android:layout_alignParentBottom="true"></Button>
--     <Button android:text="Button"
--         android:layout_width="wrap_content" android:layout_height="fill_parent"
--         android:textColor="#FF00FF" android:textSize="20pt"
--         android:id="@+id/button2" android:layout_alignParentBottom="true"></Button>
-+     android:layout_width="wrap_content"
-+     android:layout_height="match_parent" >
-+
-+     <Button
-+         android:id="@+id/button1"
-+         android:layout_width="wrap_content"
-+         android:layout_height="wrap_content"
-+         android:layout_alignParentBottom="true"
-+         android:text="Button"
-+         android:textColor="#FF0000"
-+         android:textSize="20pt" >
-+     </Button>
-+
-+     <Button
-+         android:id="@+id/button2"
-+         android:layout_width="wrap_content"
-+         android:layout_height="fill_parent"
-+         android:layout_alignParentBottom="true"
-+         android:text="Button" >
-+     </Button>
-+
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/extractstyle1.info b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/extractstyle1.info
deleted file mode 100644
index 69f7739..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/extractstyle1.info
+++ /dev/null
@@ -1,3 +0,0 @@
-android.widget.LinearLayout [0,36,140,320] <LinearLayout>
-    android.widget.Button [0,0,140,62] <Button>
-    android.widget.Button [0,62,140,284] <Button>
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/extractstyle1.xml b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/extractstyle1.xml
deleted file mode 100644
index 64c49b2..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/extractstyle1.xml
+++ /dev/null
@@ -1,11 +0,0 @@
-<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="wrap_content" android:layout_height="match_parent">
-    <Button android:text="Button"
-        android:layout_width="wrap_content" android:layout_height="wrap_content"
-        android:textColor="#FF0000" android:textSize="20pt"
-        android:id="@+id/button1" android:layout_alignParentBottom="true"></Button>
-    <Button android:text="Button"
-        android:layout_width="wrap_content" android:layout_height="fill_parent"
-        android:textColor="#FF00FF" android:textSize="20pt"
-        android:id="@+id/button2" android:layout_alignParentBottom="true"></Button>
-</FrameLayout>
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/extractstyle2-expected-extract7.diff b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/extractstyle2-expected-extract7.diff
deleted file mode 100644
index bb2960e..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/extractstyle2-expected-extract7.diff
+++ /dev/null
@@ -1,33 +0,0 @@
-@@ -2 +2
--     foo:layout_width="wrap_content" foo:layout_height="match_parent" foo:orientation="vertical">
--     <Button foo:text="Button"
--         foo:layout_width="wrap_content" foo:layout_height="wrap_content"
--         foo:textColor="#FF0000" foo:textSize="20pt"
--         foo:id="@+id/button1" foo:layout_alignParentBottom="true"></Button>
--     <Button foo:text="Button"
--         foo:layout_width="wrap_content" foo:layout_height="fill_parent"
--         foo:textColor="#00FF00" foo:textSize="20pt"
--         foo:id="@+id/button2" foo:layout_alignParentBottom="true"></Button>
-+     foo:layout_width="wrap_content"
-+     foo:layout_height="match_parent"
-+     foo:orientation="vertical" >
-+
-+     <Button
-+         foo:id="@+id/button1"
-+         style="@style/newstyle"
-+         foo:layout_width="wrap_content"
-+         foo:layout_height="wrap_content"
-+         foo:layout_alignParentBottom="true"
-+         foo:text="Button"
-+         foo:textColor="#FF0000" >
-+     </Button>
-+
-+     <Button
-+         foo:id="@+id/button2"
-+         style="@style/newstyle"
-+         foo:layout_width="wrap_content"
-+         foo:layout_height="fill_parent"
-+         foo:layout_alignParentBottom="true"
-+         foo:text="Button" >
-+     </Button>
-+
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/extractstyle2.info b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/extractstyle2.info
deleted file mode 100644
index 69f7739..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/extractstyle2.info
+++ /dev/null
@@ -1,3 +0,0 @@
-android.widget.LinearLayout [0,36,140,320] <LinearLayout>
-    android.widget.Button [0,0,140,62] <Button>
-    android.widget.Button [0,62,140,284] <Button>
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/extractstyle2.xml b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/extractstyle2.xml
deleted file mode 100644
index 3cb966f..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/extractstyle2.xml
+++ /dev/null
@@ -1,11 +0,0 @@
-<LinearLayout xmlns:foo="http://schemas.android.com/apk/res/android"
-    foo:layout_width="wrap_content" foo:layout_height="match_parent" foo:orientation="vertical">
-    <Button foo:text="Button"
-        foo:layout_width="wrap_content" foo:layout_height="wrap_content"
-        foo:textColor="#FF0000" foo:textSize="20pt"
-        foo:id="@+id/button1" foo:layout_alignParentBottom="true"></Button>
-    <Button foo:text="Button"
-        foo:layout_width="wrap_content" foo:layout_height="fill_parent"
-        foo:textColor="#00FF00" foo:textSize="20pt"
-        foo:id="@+id/button2" foo:layout_alignParentBottom="true"></Button>
-</LinearLayout>
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/fragmentlayout-expected-applyCompletion47.diff b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/fragmentlayout-expected-applyCompletion47.diff
deleted file mode 100644
index 3ed60f1..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/fragmentlayout-expected-applyCompletion47.diff
+++ /dev/null
@@ -1,4 +0,0 @@
-Code completion in fragmentlayout.xml for class="^com selecting android.app.ListFragment:
-@@ -16 +16
--         <fragment class="^com.android.eclipse.tests.TestFragment"
-+         <fragment class="android.app.ListFragment^"
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/fragmentlayout-expected-complation77.txt b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/fragmentlayout-expected-complation77.txt
deleted file mode 100644
index 6e8687f..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/fragmentlayout-expected-complation77.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-Code completion in fragmentlayout.xml for android:name="^com:
-android.app.DialogFragment : <p>Implementations should override this class and implement  <code><a href="/reference/android/app/Fragment.html#onCreateView(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle)">onCreateView(LayoutInflater, ViewGroup, Bundle)</a></code> to supply ...
-android.app.ListFragment : <p>  ListFragment hosts a <code><a href="/reference/android/widget/ListView.html">ListView</a></code> object that can  be bound to different data sources, typically either an array or a Cursor  holding query results. Binding, screen layout, and row layout are discussed ...
-android.preference.PreferenceFragment : <p>  Furthermore, the preferences shown will follow the visual style of system  preferences. It is easy to create a hierarchy of preferences (that can be  shown on multiple screens) via XML. For these reasons, it is recommended to  use this fragment (as a s...
-android.webkit.WebViewFragment : <p>  The WebView is automically paused or resumed when the Fragment is paused or resumed. </p>      </div><!-- jd-descr -->                 <div class="jd-descr">   <h2>Summary</h2>                 <!-- =========== ENUM CONSTANT SUMMARY =========== --> <table id="...
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/fragmentlayout-expected-complation78.txt b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/fragmentlayout-expected-complation78.txt
deleted file mode 100644
index e02637c..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/fragmentlayout-expected-complation78.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-Code completion in fragmentlayout.xml for class="^com:
-android.app.DialogFragment : <p>Implementations should override this class and implement  <code><a href="/reference/android/app/Fragment.html#onCreateView(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle)">onCreateView(LayoutInflater, ViewGroup, Bundle)</a></code> to supply ...
-android.app.ListFragment : <p>  ListFragment hosts a <code><a href="/reference/android/widget/ListView.html">ListView</a></code> object that can  be bound to different data sources, typically either an array or a Cursor  holding query results. Binding, screen layout, and row layout are discussed ...
-android.preference.PreferenceFragment : <p>  Furthermore, the preferences shown will follow the visual style of system  preferences. It is easy to create a hierarchy of preferences (that can be  shown on multiple screens) via XML. For these reasons, it is recommended to  use this fragment (as a s...
-android.webkit.WebViewFragment : <p>  The WebView is automically paused or resumed when the Fragment is paused or resumed. </p>      </div><!-- jd-descr -->                 <div class="jd-descr">   <h2>Summary</h2>                 <!-- =========== ENUM CONSTANT SUMMARY =========== --> <table id="...
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/fragmentlayout-expected-navigate13.txt b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/fragmentlayout-expected-navigate13.txt
deleted file mode 100644
index ae30d58..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/fragmentlayout-expected-navigate13.txt
+++ /dev/null
@@ -1,12 +0,0 @@
-Go To Declaration in fragmentlayout.xml for android:name="com.android.ecl^ipse.tests.TestFragment":
-Open XML Declaration :  [com.android.eclipse.tests.TestFragment]
-
-
-After open, the selected text is:
-[^public class TestFragment extends Fragment {
-    @Override
-    public View onCreateView(LayoutInflater inflater, ViewGroup container,
-            Bundle savedInstanceState) {
-        return null;
-    }
-}]
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/fragmentlayout-expected-navigate14.txt b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/fragmentlayout-expected-navigate14.txt
deleted file mode 100644
index 0046483..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/fragmentlayout-expected-navigate14.txt
+++ /dev/null
@@ -1,12 +0,0 @@
-Go To Declaration in fragmentlayout.xml for class="com.and^roid.eclipse.tests.TestFragment":
-Open XML Declaration :  [com.android.eclipse.tests.TestFragment]
-
-
-After open, the selected text is:
-[^public class TestFragment extends Fragment {
-    @Override
-    public View onCreateView(LayoutInflater inflater, ViewGroup container,
-            Bundle savedInstanceState) {
-        return null;
-    }
-}]
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/fragmentlayout.xml b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/fragmentlayout.xml
deleted file mode 100644
index 758599c..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/fragmentlayout.xml
+++ /dev/null
@@ -1,19 +0,0 @@
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:id="@+id/home_root"
-    android:orientation="horizontal"
-    android:layout_width="fill_parent"
-    android:layout_height="fill_parent">
-
-    <LinearLayout android:orientation="vertical"
-        android:layout_width="wrap_content"
-        android:layout_height="fill_parent">
-        <fragment android:name="com.android.eclipse.tests.TestFragment"
-            android:id="@+id/test_fragment"
-            android:layout_marginLeft="20dp"
-            android:layout_weight="1"
-            android:layout_width="fill_parent"
-            android:layout_height="0dp" />
-        <fragment class="com.android.eclipse.tests.TestFragment"
-             android:id="@+id/test_fragment2" />
-    </LinearLayout>
-</LinearLayout>
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/manifest-expected-complation80.txt b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/manifest-expected-complation80.txt
deleted file mode 100644
index cb1d0ce..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/manifest-expected-complation80.txt
+++ /dev/null
@@ -1,8 +0,0 @@
-Code completion in manifest.xml for <activity android:name="^.:
-android.accounts.AccountAuthenticatorActivity
-android.app.ActivityGroup
-android.app.AliasActivity
-android.app.ExpandableListActivity
-android.app.ListActivity
-android.app.NativeActivity
-android.app.TabActivity
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/manifest-expected-completion14.txt b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/manifest-expected-completion14.txt
deleted file mode 100644
index 478e435..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/manifest-expected-completion14.txt
+++ /dev/null
@@ -1,10 +0,0 @@
-Code completion in manifest.xml for android.permission.ACC^ESS_NETWORK_STATE:
-android.permission.ACCESS_CHECKIN_PROPERTIES
-android.permission.ACCESS_COARSE_LOCATION
-android.permission.ACCESS_FINE_LOCATION
-android.permission.ACCESS_LOCATION_EXTRA_COMMANDS
-android.permission.ACCESS_MOCK_LOCATION
-android.permission.ACCESS_NETWORK_STATE
-android.permission.ACCESS_SURFACE_FLINGER
-android.permission.ACCESS_WIFI_STATE
-android.permission.ACCOUNT_MANAGER
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/manifest-expected-completion15.txt b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/manifest-expected-completion15.txt
deleted file mode 100644
index c6b3538..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/manifest-expected-completion15.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-Code completion in manifest.xml for android.intent.category.L^AUNCHER:
-android.intent.category.LAUNCHER
-android.intent.category.LE_DESK_DOCK
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/manifest-expected-completion16.txt b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/manifest-expected-completion16.txt
deleted file mode 100644
index f3367c7..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/manifest-expected-completion16.txt
+++ /dev/null
@@ -1,15 +0,0 @@
-Code completion in manifest.xml for <^application android:i:
-application : The "application" tag describes application-level components contained  in the package, as well as general application attributes.
-compatible-screens
-instrumentation : Attributes that can be supplied in an AndroidManifest.xml "instrumentation"  tag, a child of the root manifest tag.
-original-package : Private tag to declare the original package name that this package  is based on.
-package-verifier : Attributes relating to a package verifier.
-permission : The "permission" tag declares a security permission that can be  used to control access from other packages to specific components  or features in your package (or other packages).
-permission-group : The "permission-group" tag declares a logical grouping of related  permissions.
-permission-tree : The "permission-tree" tag declares the base of a tree of permission  values: it declares that this package has ownership of the given  permission name, as well as all names underneath it (separated  by '.').
-protected-broadcast : Private tag to declare system protected broadcast actions.
-supports-screens : The "supports-screens" specifies the screen dimensions an application  supports.
-uses-configuration : The "uses-configuration" tag specifies a specific hardware configuration  value used by the application.
-uses-feature : The "uses-feature" tag specifies a specific feature used by the  application.
-uses-permission : The "uses-permission" tag requests a "permission" that the containing  package must be granted in order for it to operate correctly.
-uses-sdk : The "uses-sdk" tag describes the SDK features that the containing  package must be running on to operate correctly.
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/manifest-expected-completion17.txt b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/manifest-expected-completion17.txt
deleted file mode 100644
index 8244f0a..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/manifest-expected-completion17.txt
+++ /dev/null
@@ -1,8 +0,0 @@
-Code completion in manifest.xml for ^android:versionCode="1":
-xmlns:android
-package : This attribute gives a unique name for the package, using a Java-style naming convention to avoid name collisions. For example, applications published by Google could have names of the form com.google.app.appname
-android:versionCode : Internal version code.  [integer]
-android:versionName : The text shown to the user to indicate the version they have.  [string]
-android:sharedUserId : Specify the name of a user ID that will be shared between multiple  packages.  [string]
-android:sharedUserLabel : Specify a label for the shared user UID of this package.  [reference]
-android:installLocation : The default install location defined by an application.  [enum]
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/manifest-expected-completion18.txt b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/manifest-expected-completion18.txt
deleted file mode 100644
index 1215244..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/manifest-expected-completion18.txt
+++ /dev/null
@@ -1,29 +0,0 @@
-Code completion in manifest.xml for <activity android:^name=".TestActivity":
-android:name : Required name of the class implementing the activity, deriving  from android.app.Activity.  [string]. * Required.
-android:theme : The overall theme to use for an activity.  [reference]
-android:label : A user-legible name for the given item.  [string, reference]
-android:description : Descriptive text for the associated data.  [reference]
-android:icon : [reference]
-android:logo : A Drawable resource providing an extended graphical logo for  its associated item.  [reference]
-android:launchMode : Specify how an activity should be launched.  [enum]
-android:screenOrientation : Specify the orientation an activity should be run in.  [enum]
-android:configChanges : Specify one or more configuration changes that the activity will  handle itself.  [flag]
-android:permission : Specify a permission that a client is required to have in order  to use the associated object.  [string]
-android:multiprocess : Specify whether a component is allowed to have multiple instances  of itself running in different processes.  [boolean]
-android:process : Specify a specific process that the associated code is to run  in.  [string]
-android:taskAffinity : Specify a task name that activities have an "affinity" to.  [string]
-android:allowTaskReparenting : Specify that an activity can be moved out of a task it is in  to the task it has an affinity for when appropriate.  [boolean]
-android:finishOnTaskLaunch : Specify whether an activity should be finished when its task  is brought to the foreground by relaunching from the home screen.  [boolean]
-android:finishOnCloseSystemDialogs : Specify whether an activity should be finished when a "close  system windows" request has been made.  [boolean]
-android:clearTaskOnLaunch : Specify whether an activity's task should be cleared when it  is re-launched from the home screen.  [boolean]
-android:noHistory : Specify whether an activity should be kept in its history stack.  [boolean]
-android:alwaysRetainTaskState : Specify whether an acitivty's task state should always be maintained  by the system, or if it is allowed to reset the task to its initial  state in certain situations.  [boolean]
-android:stateNotNeeded : Indicates that an Activity does not need to have its freeze state  (as returned by onSaveInstanceState retained in order to be restarted.  [boolean]
-android:excludeFromRecents : Indicates that an Activity should be excluded from the list of  recently launched activities.  [boolean]
-android:enabled : Specify whether the activity is enabled or not (that is, can  be instantiated by the system).  [boolean]
-android:exported : Flag indicating whether the given application component is available  to other applications.  [boolean]
-android:windowSoftInputMode : Specify the default soft-input mode for the main window of this  activity.  [flag]
-android:immersive : Flag declaring this activity to be 'immersive'; immersive activities  should not be interrupted with other activities or notifications.  [boolean]
-android:hardwareAccelerated : <p>Flag indicating whether the application's rendering should  be hardware accelerated if possible.  [boolean]
-android:uiOptions : Extra options for an activity's UI.  [flag]
-android:parentActivityName : The name of the logical parent of the activity as it appears  in the manifest.  [string]
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/manifest-expected-completion69.txt b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/manifest-expected-completion69.txt
deleted file mode 100644
index cf7e0f4..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/manifest-expected-completion69.txt
+++ /dev/null
@@ -1,18 +0,0 @@
-Code completion in manifest.xml for <uses-sdk android:minSdkVersion="^11" />:
-17 : API 17: Android 4.2 (Jelly Bean)
-16 : API 16: Android 4.1 (Jelly Bean)
-15 : API 15: Android 4.0.3 (IceCreamSandwich)
-14 : API 14: Android 4.0 (IceCreamSandwich)
-13 : API 13: Android 3.2 (Honeycomb)
-12 : API 12: Android 3.1 (Honeycomb)
-11 : API 11: Android 3.0 (Honeycomb)
-10 : API 10: Android 2.3.3 (Gingerbread)
-9 : API 9: Android 2.3 (Gingerbread)
-8 : API 8: Android 2.2 (Froyo)
-7 : API 7: Android 2.1 (Eclair)
-6 : API 6: Android 2.0.1 (Eclair)
-5 : API 5: Android 2.0 (Eclair)
-4 : API 4: Android 1.6 (Donut)
-3 : API 3: Android 1.5 (Cupcake)
-2 : API 2: Android 1.1
-1 : API 1: Android 1.0
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/manifest-expected-navigate10.txt b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/manifest-expected-navigate10.txt
deleted file mode 100644
index c745f54..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/manifest-expected-navigate10.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-Go To Declaration in manifest.xml for <uses-permission android:name="android.permission.AC^CESS_NETWORK_STATE" />:
-Open XML Declaration :  [android.permission.ACCESS_NETWORK_STATE]
-
-
-After open, a browser is shown with this URL:
-  reference/android/Manifest.permission.html#ACCESS_NETWORK_STATE
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/manifest-expected-navigate11a.txt b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/manifest-expected-navigate11a.txt
deleted file mode 100644
index eaeddf9..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/manifest-expected-navigate11a.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-Go To Declaration in manifest.xml for <action android:name="android.intent.ac^tion.MAIN" />:
-Open XML Declaration :  [android.intent.action.MAIN]
-
-
-After open, a browser is shown with this URL:
-  reference/android/content/Intent.html#ACTION_MAIN
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/manifest-expected-navigate11g.txt b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/manifest-expected-navigate11g.txt
deleted file mode 100644
index 9acb330..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/manifest-expected-navigate11g.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-Go To Declaration in manifest.xml for <category android:name="android.intent.category.LA^UNCHER" />:
-Open XML Declaration :  [android.intent.category.LAUNCHER]
-
-
-After open, a browser is shown with this URL:
-  reference/android/content/Intent.html#CATEGORY_LAUNCHER
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/manifest-expected-navigate9a.txt b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/manifest-expected-navigate9a.txt
deleted file mode 100644
index 2221e37..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/manifest-expected-navigate9a.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-Go To Declaration in manifest.xml for <activity android:name=".Test^Activity":
-Open XML Declaration :  [.TestActivity]
-
-
-After open, the selected text is:
-^<?xml version="1.0" encoding="utf-8"?>
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/manifest.xml b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/manifest.xml
deleted file mode 100644
index 2c0024f..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/manifest.xml
+++ /dev/null
@@ -1,19 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
-      package="foo.bar"
-      android:versionCode="1"
-      android:versionName="1.0">
-    <uses-sdk android:minSdkVersion="11" />
-    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
-
-    <application android:icon="@drawable/icon" android:label="@string/app_name">
-        <activity android:name=".TestActivity"
-                  android:label="@string/app_name">
-            <intent-filter>
-                <action android:name="android.intent.action.MAIN" />
-                <category android:name="android.intent.category.LAUNCHER" />
-            </intent-filter>
-        </activity>
-
-    </application>
-</manifest>
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/metadata.xml b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/metadata.xml
deleted file mode 100644
index 9262f97..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/metadata.xml
+++ /dev/null
@@ -1,10 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<LinearLayout android:id="@+id/LinearLayout1"
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    android:orientation="vertical" android:layout_width="match_parent"
-    android:layout_height="match_parent">
-    <ListView android:layout_width="match_parent" android:id="@+id/listView1"
-        android:layout_height="wrap_content">
-    </ListView>
-    <Button android:text="Button" android:id="@+id/button1"/>
-</LinearLayout>
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/navigation1-expected-complation76.txt b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/navigation1-expected-complation76.txt
deleted file mode 100644
index 6b9cf5b..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/navigation1-expected-complation76.txt
+++ /dev/null
@@ -1,76 +0,0 @@
-Code completion in navigation1.xml for ?android:a^ttr/alertDialogStyle:
-?android:attr/
-?android:allowClearUserData
-?android:authorities
-?android:action
-?android:alertDialogStyle
-?android:absListViewStyle
-?android:autoCompleteTextViewStyle
-?android:autoLink
-?android:activityOpenEnterAnimation
-?android:activityOpenExitAnimation
-?android:activityCloseEnterAnimation
-?android:activityCloseExitAnimation
-?android:animationCache
-?android:alwaysDrawnWithCache
-?android:addStatesFromChildren
-?android:animationDuration
-?android:antialias
-?android:adjustViewBounds
-?android:autoText
-?android:angle
-?android:animation
-?android:animationOrder
-?android:alphabeticShortcut
-?android:alwaysRetainTaskState
-?android:allowTaskReparenting
-?android:apiKey
-?android:allowSingleTap
-?android:animateOnClick
-?android:anyDensity
-?android:allowBackup
-?android:autoUrlDetect
-?android:accountType
-?android:accountPreferences
-?android:author
-?android:autoStart
-?android:allContactsName
-?android:actionBarStyle
-?android:animateFirstView
-?android:actionDropDownStyle
-?android:actionButtonStyle
-?android:actionModeBackground
-?android:actionModeCloseDrawable
-?android:actionBarSize
-?android:animateLayoutChanges
-?android:actionBarTabStyle
-?android:actionBarTabBarStyle
-?android:actionBarTabTextStyle
-?android:actionOverflowButtonStyle
-?android:actionModeCloseButtonStyle
-?android:actionLayout
-?android:actionViewClass
-?android:activatedBackgroundIndicator
-?android:alertDialogTheme
-?android:autoAdvanceViewId
-?android:actionModeCutDrawable
-?android:actionModeCopyDrawable
-?android:actionModePasteDrawable
-?android:animationResolution
-?android:alpha
-?android:allowParallelSyncs
-?android:alertDialogIcon
-?android:actionMenuTextAppearance
-?android:actionMenuTextColor
-?android:alignmentMode
-?android:actionModeSelectAllDrawable
-?android:accessibilityEventTypes
-?android:accessibilityFeedbackType
-?android:accessibilityFlags
-?android:actionBarSplitStyle
-?android:actionProviderClass
-?android:actionModeStyle
-?android:actionBarWidgetTheme
-?android:actionBarDivider
-?android:actionBarItemBackground
-?android:actionModeSplitBackground
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/navigation1-expected-navigate1.txt b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/navigation1-expected-navigate1.txt
deleted file mode 100644
index 7308a48..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/navigation1-expected-navigate1.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-Go To Declaration in navigation1.xml for android:text="@string/app^_name":
-Open Declaration in values/strings.xml :  [@string/app_name]
-    L/PROJECTNAME/res/values/strings.xml
-
-
-After open, the selected text is:
-    [^<string name="app_name">PROJECTNAME</string>]
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/navigation1-expected-navigate12.txt b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/navigation1-expected-navigate12.txt
deleted file mode 100644
index 23fa07e..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/navigation1-expected-navigate12.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-Go To Declaration in navigation1.xml for <my.Cust^omView></my.CustomView>:
-Open XML Declaration :  [my.CustomView]
-
-
-After open, the selected text is:
-^<?xml version="1.0" encoding="utf-8"?>
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/navigation1-expected-navigate15.txt b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/navigation1-expected-navigate15.txt
deleted file mode 100644
index e36c5f3..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/navigation1-expected-navigate15.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-Go To Declaration in navigation1.xml for ?android:attr/alert^DialogStyle:
-Open Declaration in values/attrs.xml :  [?android:attr/alertDialogStyle]
-    data/res/values/attrs.xml
-
-
-After open, the selected text is:
-        <attr name="alertDialogStyle" format="reference" />^
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/navigation1-expected-navigate16.txt b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/navigation1-expected-navigate16.txt
deleted file mode 100644
index b6f6cb2..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/navigation1-expected-navigate16.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-Go To Declaration in navigation1.xml for ?android:alert^DialogStyle:
-Open Declaration in values/attrs.xml :  [?android:alertDialogStyle]
-    data/res/values/attrs.xml
-
-
-After open, the selected text is:
-        <attr name="alertDialogStyle" format="reference" />^
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/navigation1-expected-navigate2.txt b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/navigation1-expected-navigate2.txt
deleted file mode 100644
index f91e1f9..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/navigation1-expected-navigate2.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-Go To Declaration in navigation1.xml for marginLeft="@android:dimen/app_ico^n_size":
-Open Declaration in values/dimens.xml :  [@android:dimen/app_icon_size]
-    data/res/values/dimens.xml
-
-
-After open, the selected text is:
-    <dimen name="app_icon_size">^48dip</dimen>
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/navigation1-expected-navigate3.txt b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/navigation1-expected-navigate3.txt
deleted file mode 100644
index 53776a0..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/navigation1-expected-navigate3.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-Go To Declaration in navigation1.xml for style="@android:style/Widget.B^utton":
-Open Declaration in values/styles.xml :  [@android:style/Widget.Button]
-    data/res/values/styles.xml
-
-
-After open, the selected text is:
-    <style name="Widget.Button">^
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/navigation1-expected-navigate4.txt b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/navigation1-expected-navigate4.txt
deleted file mode 100644
index ec5ee38..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/navigation1-expected-navigate4.txt
+++ /dev/null
@@ -1,89 +0,0 @@
-Go To Declaration in navigation1.xml for android:text="@android:st^ring/ok":
-Open Declaration in values-en-rGB/strings.xml :  [@android:string/ok]
-    data/res/values-en-rGB/strings.xml
-Open Declaration in values/strings.xml :  [@android:string/ok]
-    data/res/values/strings.xml
-Open Declaration in values-ar/strings.xml :  [@android:string/ok]
-    data/res/values-ar/strings.xml
-Open Declaration in values-bg/strings.xml :  [@android:string/ok]
-    data/res/values-bg/strings.xml
-Open Declaration in values-ca/strings.xml :  [@android:string/ok]
-    data/res/values-ca/strings.xml
-Open Declaration in values-cs/strings.xml :  [@android:string/ok]
-    data/res/values-cs/strings.xml
-Open Declaration in values-da/strings.xml :  [@android:string/ok]
-    data/res/values-da/strings.xml
-Open Declaration in values-de/strings.xml :  [@android:string/ok]
-    data/res/values-de/strings.xml
-Open Declaration in values-el/strings.xml :  [@android:string/ok]
-    data/res/values-el/strings.xml
-Open Declaration in values-es/strings.xml :  [@android:string/ok]
-    data/res/values-es/strings.xml
-Open Declaration in values-es-rUS/strings.xml :  [@android:string/ok]
-    data/res/values-es-rUS/strings.xml
-Open Declaration in values-fa/strings.xml :  [@android:string/ok]
-    data/res/values-fa/strings.xml
-Open Declaration in values-fi/strings.xml :  [@android:string/ok]
-    data/res/values-fi/strings.xml
-Open Declaration in values-fr/strings.xml :  [@android:string/ok]
-    data/res/values-fr/strings.xml
-Open Declaration in values-hr/strings.xml :  [@android:string/ok]
-    data/res/values-hr/strings.xml
-Open Declaration in values-hu/strings.xml :  [@android:string/ok]
-    data/res/values-hu/strings.xml
-Open Declaration in values-in/strings.xml :  [@android:string/ok]
-    data/res/values-in/strings.xml
-Open Declaration in values-it/strings.xml :  [@android:string/ok]
-    data/res/values-it/strings.xml
-Open Declaration in values-iw/strings.xml :  [@android:string/ok]
-    data/res/values-iw/strings.xml
-Open Declaration in values-ja/strings.xml :  [@android:string/ok]
-    data/res/values-ja/strings.xml
-Open Declaration in values-ko/strings.xml :  [@android:string/ok]
-    data/res/values-ko/strings.xml
-Open Declaration in values-lt/strings.xml :  [@android:string/ok]
-    data/res/values-lt/strings.xml
-Open Declaration in values-lv/strings.xml :  [@android:string/ok]
-    data/res/values-lv/strings.xml
-Open Declaration in values-nb/strings.xml :  [@android:string/ok]
-    data/res/values-nb/strings.xml
-Open Declaration in values-nl/strings.xml :  [@android:string/ok]
-    data/res/values-nl/strings.xml
-Open Declaration in values-pl/strings.xml :  [@android:string/ok]
-    data/res/values-pl/strings.xml
-Open Declaration in values-pt/strings.xml :  [@android:string/ok]
-    data/res/values-pt/strings.xml
-Open Declaration in values-pt-rPT/strings.xml :  [@android:string/ok]
-    data/res/values-pt-rPT/strings.xml
-Open Declaration in values-rm/strings.xml :  [@android:string/ok]
-    data/res/values-rm/strings.xml
-Open Declaration in values-ro/strings.xml :  [@android:string/ok]
-    data/res/values-ro/strings.xml
-Open Declaration in values-ru/strings.xml :  [@android:string/ok]
-    data/res/values-ru/strings.xml
-Open Declaration in values-sk/strings.xml :  [@android:string/ok]
-    data/res/values-sk/strings.xml
-Open Declaration in values-sl/strings.xml :  [@android:string/ok]
-    data/res/values-sl/strings.xml
-Open Declaration in values-sr/strings.xml :  [@android:string/ok]
-    data/res/values-sr/strings.xml
-Open Declaration in values-sv/strings.xml :  [@android:string/ok]
-    data/res/values-sv/strings.xml
-Open Declaration in values-th/strings.xml :  [@android:string/ok]
-    data/res/values-th/strings.xml
-Open Declaration in values-tl/strings.xml :  [@android:string/ok]
-    data/res/values-tl/strings.xml
-Open Declaration in values-tr/strings.xml :  [@android:string/ok]
-    data/res/values-tr/strings.xml
-Open Declaration in values-uk/strings.xml :  [@android:string/ok]
-    data/res/values-uk/strings.xml
-Open Declaration in values-vi/strings.xml :  [@android:string/ok]
-    data/res/values-vi/strings.xml
-Open Declaration in values-zh-rCN/strings.xml :  [@android:string/ok]
-    data/res/values-zh-rCN/strings.xml
-Open Declaration in values-zh-rTW/strings.xml :  [@android:string/ok]
-    data/res/values-zh-rTW/strings.xml
-
-
-After open, the selected text is:
-    <string name="ok" msgid="5970060430562524910">^"OK"</string>
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/navigation1.xml b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/navigation1.xml
deleted file mode 100644
index c5b292e..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/navigation1.xml
+++ /dev/null
@@ -1,18 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<LinearLayout
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent">
-    <Button
-        android:text="@string/app_name"
-        android:layout_marginLeft="@android:dimen/app_icon_size"
-        style="@android:style/Widget.Button"
-        android:id="@+id/button1"
-        ></Button>
-    <my.CustomView></my.CustomView>
-    <EditText
-        android:text="@android:string/ok"
-    </EditText>
-    <EditText android:text="?android:attr/alertDialogStyle" />
-    <EditText android:text="?android:alertDialogStyle" />
-</LinearLayout>
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/navigationstyles-expected-extract2.diff b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/navigationstyles-expected-extract2.diff
deleted file mode 100644
index 8890f79..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/navigationstyles-expected-extract2.diff
+++ /dev/null
@@ -1,5 +0,0 @@
-@@ -28 +28
-+     <style name="newstyle">
-+         <item name="android:textColor">#FF00FF</item>
-+         <item name="android:textSize">20pt</item>
-+     </style>
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/navigationstyles-expected-navigate5.txt b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/navigationstyles-expected-navigate5.txt
deleted file mode 100644
index 15c91d1..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/navigationstyles-expected-navigate5.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-Go To Declaration in navigationstyles.xml for parent="android:Theme.Li^ght">:
-Open Declaration in values/themes.xml :  [android:Theme.Light]
-    data/res/values/themes.xml
-
-
-After open, the selected text is:
-    <style name="Theme.Light">^
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/navigationstyles-expected-navigate6.txt b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/navigationstyles-expected-navigate6.txt
deleted file mode 100644
index 5a4f40a..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/navigationstyles-expected-navigate6.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-Go To Declaration in navigationstyles.xml for parent="android:The^me.Light">:
-Open Declaration in values/themes.xml :  [android:Theme]
-    data/res/values/themes.xml
-
-
-After open, the selected text is:
-    <style name="Theme">^
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/navigationstyles-expected-navigate7.txt b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/navigationstyles-expected-navigate7.txt
deleted file mode 100644
index 8f7eb46..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/navigationstyles-expected-navigate7.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-Go To Declaration in navigationstyles.xml for popupBackground">@android:drawable/spinner_dr^opdown_background</item>:
-Open Declaration in drawable/spinner_dropdown_background.xml :  [@android:drawable/spinner_dropdown_background]
-    data/res/drawable/spinner_dropdown_background.xml
-
-
-After open, the selected text is:
-^<?xml version="1.0" encoding="utf-8"?>
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/navigationstyles-expected-navigate8.txt b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/navigationstyles-expected-navigate8.txt
deleted file mode 100644
index b74c676..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/navigationstyles-expected-navigate8.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-Go To Declaration in navigationstyles.xml for colorBackground"> @color/cust^om_theme_color </item>:
-Open Declaration in values/navigationstyles.xml :  [@color/custom_theme_color]
-    L/PROJECTNAME/res/values/navigationstyles.xml
-
-
-After open, the selected text is:
-    [^<color name="custom_theme_color">#b0b0ff</color>]
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/navigationstyles.xml b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/navigationstyles.xml
deleted file mode 100644
index da4bbf2..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/navigationstyles.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<resources>
-    <color name="custom_theme_color">#b0b0ff</color>
-    <style name="CustomTheme" parent="android:Theme.Light">
-        <item name="android:windowBackground">@color/custom_theme_color</item>
-        <item name="android:colorBackground"> @color/custom_theme_color </item>
-    </style>
-
-    <style name="BrowserTheme" parent="@android:Theme.Black">
-        <item name="android:autoCompleteTextViewStyle">@style/AutoCompleteTextView</item>
-        <item name="android:windowNoTitle">true</item>
-    </style>
-
-    <style name="AutoCompleteTextView">
-        <item name="android:focusable">true</item>
-        <item name="android:focusableInTouchMode">true</item>
-        <item name="android:clickable">true</item>
-        <item name="android:completionHintView">@android:layout/simple_dropdown_item_1line</item>
-        <item name="android:textAppearance">?android:attr/textAppearanceLargeInverse</item>
-        <item name="android:completionThreshold">2</item>
-        <item name="android:dropDownSelector">@android:drawable/list_selector_background</item>
-        <item name="android:popupBackground">@android:drawable/spinner_dropdown_background</item>
-    </style>
-
-    <style name="CustomTitle" parent="@android:Theme">
-        <item name="android:windowTitleSize">60dip</item>
-    </style>
-</resources>
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/newlayout1-expected-extract1.xml b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/newlayout1-expected-extract1.xml
deleted file mode 100644
index 2a0e947..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/newlayout1-expected-extract1.xml
+++ /dev/null
@@ -1,2 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Button xmlns:android="http://schemas.android.com/apk/res/android" android:text="Button" android:id="@+id/button2" android:layout_width="wrap_content" android:layout_height="wrap_content"></Button>
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/newlayout2-expected-extract2.xml b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/newlayout2-expected-extract2.xml
deleted file mode 100644
index b2d1789..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/newlayout2-expected-extract2.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<merge xmlns:android="http://schemas.android.com/apk/res/android">
-    <ImageView android:id="@+id/android_logo" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/android_button" android:focusable="false" android:clickable="false" android:layout_weight="1.0" />
-    <Button android:text="Button" android:id="@+id/button2" android:layout_width="wrap_content" android:layout_height="wrap_content"></Button>
-</merge>
-
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/newlayout3-expected-extract3.xml b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/newlayout3-expected-extract3.xml
deleted file mode 100644
index 6ba61c8..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/newlayout3-expected-extract3.xml
+++ /dev/null
@@ -1,2 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Button xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="wrap_content" android:id="@+id/button3" android:layout_height="wrap_content" android:text="Button" ></Button>
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/newlayout3-expected-extract4.xml b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/newlayout3-expected-extract4.xml
deleted file mode 100644
index ee8568e..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/newlayout3-expected-extract4.xml
+++ /dev/null
@@ -1,2 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<ImageView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/android_logo" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/android_button" android:focusable="false" android:clickable="false" />
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/newlayout3-expected-extract5.xml b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/newlayout3-expected-extract5.xml
deleted file mode 100644
index be57066..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/newlayout3-expected-extract5.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<merge xmlns:android="http://schemas.android.com/apk/res/android">
-    <Button android:text="Button" android:id="@+id/button1" android:layout_width="wrap_content" android:layout_height="wrap_content"></Button>
-    <ImageView android:id="@+id/android_logo" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/android_button" android:focusable="false" android:clickable="false" android:layout_weight="1.0" />
-</merge>
-
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/newlayout6-expected-extract6.diff b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/newlayout6-expected-extract6.diff
deleted file mode 100644
index 6772a8f..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/newlayout6-expected-extract6.diff
+++ /dev/null
@@ -1,12 +0,0 @@
-@@ -1 +1
--
-@@ -2 +1
-+ <?xml version="1.0" encoding="utf-8"?>
-+ <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_height="wrap_content" android:id="@+id/linearLayout4" android:layout_width="match_parent">
-+     <LinearLayout android:layout_height="match_parent" android:id="@+id/linearLayout5" android:layout_width="wrap_content">
-+         <LinearLayout android:layout_height="match_parent" android:id="@+id/linearLayout6" android:layout_width="wrap_content">
-+             <!-- Comment -->
-+             <Button android:text="Button" android:id="@+id/button6" android:layout_width="wrap_content" android:layout_height="wrap_content"></Button>
-+         </LinearLayout>
-+     </LinearLayout>
-+ </LinearLayout>
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/newlayout6-expected-extract7.diff b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/newlayout6-expected-extract7.diff
deleted file mode 100644
index d0fdc92..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/newlayout6-expected-extract7.diff
+++ /dev/null
@@ -1,29 +0,0 @@
-@@ -1 +1
-+ <?xml version="1.0" encoding="utf-8"?>
-+ <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-+     android:id="@+id/linearLayout4"
-+     android:layout_width="match_parent"
-+     android:layout_height="wrap_content" >
-@@ -2 +7
-+     <LinearLayout
-+         android:id="@+id/linearLayout5"
-+         android:layout_width="wrap_content"
-+         android:layout_height="match_parent" >
-+
-+         <LinearLayout
-+             android:id="@+id/linearLayout6"
-+             android:layout_width="wrap_content"
-+             android:layout_height="match_parent" >
-+
-+             <!-- Comment -->
-+
-+             <Button
-+                 android:id="@+id/button6"
-+                 android:layout_width="wrap_content"
-+                 android:layout_height="wrap_content"
-+                 android:text="Button" >
-+             </Button>
-+         </LinearLayout>
-+     </LinearLayout>
-+
-+ </LinearLayout>
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/newstyles-expected-extract1.diff b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/newstyles-expected-extract1.diff
deleted file mode 100644
index 0949fbd..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/newstyles-expected-extract1.diff
+++ /dev/null
@@ -1,10 +0,0 @@
-@@ -1 +1
--
-@@ -2 +1
-+ <?xml version="1.0" encoding="utf-8"?>
-+ <resources xmlns:android="http://schemas.android.com/apk/res/android">
-+     <style name="newstyle">
-+         <item name="android:textColor">#FF00FF</item>
-+         <item name="android:textSize">20pt</item>
-+     </style>
-+ </resources>
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/newstyles2-expected-extract1b.diff b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/newstyles2-expected-extract1b.diff
deleted file mode 100644
index 0949fbd..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/newstyles2-expected-extract1b.diff
+++ /dev/null
@@ -1,10 +0,0 @@
-@@ -1 +1
--
-@@ -2 +1
-+ <?xml version="1.0" encoding="utf-8"?>
-+ <resources xmlns:android="http://schemas.android.com/apk/res/android">
-+     <style name="newstyle">
-+         <item name="android:textColor">#FF00FF</item>
-+         <item name="android:textSize">20pt</item>
-+     </style>
-+ </resources>
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/newstyles3-expected-extract1c.diff b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/newstyles3-expected-extract1c.diff
deleted file mode 100644
index 0949fbd..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/newstyles3-expected-extract1c.diff
+++ /dev/null
@@ -1,10 +0,0 @@
-@@ -1 +1
--
-@@ -2 +1
-+ <?xml version="1.0" encoding="utf-8"?>
-+ <resources xmlns:android="http://schemas.android.com/apk/res/android">
-+     <style name="newstyle">
-+         <item name="android:textColor">#FF00FF</item>
-+         <item name="android:textSize">20pt</item>
-+     </style>
-+ </resources>
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/newstyles3-expected-extract8.diff b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/newstyles3-expected-extract8.diff
deleted file mode 100644
index e8b553e..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/newstyles3-expected-extract8.diff
+++ /dev/null
@@ -1,10 +0,0 @@
-@@ -1 +1
--
-@@ -2 +1
-+ <?xml version="1.0" encoding="utf-8"?>
-+ <resources xmlns:android="http://schemas.android.com/apk/res/android">
-+     <style name="newstyle" parent="android:Widget.Button">
-+         <item name="android:textColor">#FF00FF</item>
-+         <item name="android:textSize">20pt</item>
-+     </style>
-+ </resources>
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/newstyles4-expected-extract1d.diff b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/newstyles4-expected-extract1d.diff
deleted file mode 100644
index 0949fbd..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/newstyles4-expected-extract1d.diff
+++ /dev/null
@@ -1,10 +0,0 @@
-@@ -1 +1
--
-@@ -2 +1
-+ <?xml version="1.0" encoding="utf-8"?>
-+ <resources xmlns:android="http://schemas.android.com/apk/res/android">
-+     <style name="newstyle">
-+         <item name="android:textColor">#FF00FF</item>
-+         <item name="android:textSize">20pt</item>
-+     </style>
-+ </resources>
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/newstyles4-expected-extract3.diff b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/newstyles4-expected-extract3.diff
deleted file mode 100644
index 88a94e7..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/newstyles4-expected-extract3.diff
+++ /dev/null
@@ -1,10 +0,0 @@
-@@ -1 +1
--
-@@ -2 +1
-+ <?xml version="1.0" encoding="utf-8"?>
-+ <resources xmlns:android="http://schemas.android.com/apk/res/android">
-+     <style name="newstyle">
-+         <item name="android:textColor">#FF0000</item>
-+         <item name="android:textSize">20pt</item>
-+     </style>
-+ </resources>
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/newstyles5-expected-extract4.diff b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/newstyles5-expected-extract4.diff
deleted file mode 100644
index 49043b9..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/newstyles5-expected-extract4.diff
+++ /dev/null
@@ -1,9 +0,0 @@
-@@ -1 +1
--
-@@ -2 +1
-+ <?xml version="1.0" encoding="utf-8"?>
-+ <resources xmlns:android="http://schemas.android.com/apk/res/android">
-+     <style name="newstyle">
-+         <item name="android:textColor">#FF00FF</item>
-+     </style>
-+ </resources>
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/newstyles6-expected-extract5.diff b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/newstyles6-expected-extract5.diff
deleted file mode 100644
index 49ab2c3..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/newstyles6-expected-extract5.diff
+++ /dev/null
@@ -1,9 +0,0 @@
-@@ -1 +1
--
-@@ -2 +1
-+ <?xml version="1.0" encoding="utf-8"?>
-+ <resources xmlns:android="http://schemas.android.com/apk/res/android">
-+     <style name="newstyle">
-+         <item name="android:textSize">20pt</item>
-+     </style>
-+ </resources>
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/newstyles7-expected-extract6.diff b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/newstyles7-expected-extract6.diff
deleted file mode 100644
index 51f0812..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/newstyles7-expected-extract6.diff
+++ /dev/null
@@ -1,13 +0,0 @@
-< 
----
-> <?xml version="1.0" encoding="utf-8"?>
-> <resources xmlns:android="http://schemas.android.com/apk/res/android">
->     <style name="newstyle">
->         <item name="android:layout_alignParentBottom">true</item>
->         <item name="android:layout_height">wrap_content</item>
->         <item name="android:layout_width">wrap_content</item>
->         <item name="android:text">Button</item>
->         <item name="android:textColor">#FF0000</item>
->         <item name="android:textSize">20pt</item>
->     </style>
-> </resources>
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/newstyles8-expected-extract7.diff b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/newstyles8-expected-extract7.diff
deleted file mode 100644
index 6bcd6ff..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/newstyles8-expected-extract7.diff
+++ /dev/null
@@ -1,10 +0,0 @@
-@@ -1 +1
--
-@@ -2 +1
-+ <?xml version="1.0" encoding="utf-8"?>
-+ <resources xmlns:android="http://schemas.android.com/apk/res/android">
-+     <style name="newstyle">
-+         <item name="android:textColor">#00FF00</item>
-+         <item name="android:textSize">20pt</item>
-+     </style>
-+ </resources>
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/quickfix1-expected-quickFix1.xml b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/quickfix1-expected-quickFix1.xml
deleted file mode 100644
index a51abf4..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/quickfix1-expected-quickFix1.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<resources>
-
-    <string name="app_name">PROJECTNAME</string>
-    <string name="firststring">[^TODO]</string>
-
-</resources>
\ No newline at end of file
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/quickfix1-expected-quickFix2.xml b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/quickfix1-expected-quickFix2.xml
deleted file mode 100644
index a0d04fb..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/quickfix1-expected-quickFix2.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<resources>
-    <dimen name="testdimen">[^1dp]</dimen>
-</resources>
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/quickfix1-expected-quickFix3.xml b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/quickfix1-expected-quickFix3.xml
deleted file mode 100644
index 900c420..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/quickfix1-expected-quickFix3.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    android:orientation="vertical" >
-    ^
-
-</LinearLayout>
\ No newline at end of file
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/quickfix1.xml b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/quickfix1.xml
deleted file mode 100644
index 927c8d1..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/quickfix1.xml
+++ /dev/null
@@ -1,16 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<LinearLayout
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent">
-
-    <Button android:text="@string/firststring"
-            android:id="@+id/button1"
-            android:layout_width="@dimen/testdimen"
-            android:layout_height="wrap_content">
-    </Button>
-
-    <include layout="@layout/testlayout" android:layout_width="wrap_content" android:layout_height="wrap_content"/>
-
-</LinearLayout>
-
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/quickfix2-expected-quickFix4.xml b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/quickfix2-expected-quickFix4.xml
deleted file mode 100644
index 7b638c6..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/quickfix2-expected-quickFix4.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-@@ -5 +5
-- <color android:color="#0000000"/>
-@@ -6 +5
-+ <color android:color="#0000000" xmlns:android="http://schemas.android.com/apk/res/android"/>
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/quickfix2.xml b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/quickfix2.xml
deleted file mode 100644
index 4f2a925..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/quickfix2.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-    <!--
-        Random comment here
-    -->
-<color android:color="#0000000"/>
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/refactoring/usecompound/compound1-expected-1.xml b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/refactoring/usecompound/compound1-expected-1.xml
deleted file mode 100644
index e72638f..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/refactoring/usecompound/compound1-expected-1.xml
+++ /dev/null
@@ -1,16 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="fill_parent"
-    android:layout_height="fill_parent"
-    android:orientation="vertical" >
-
-    <TextView
-        android:id="@+id/TextView1"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:drawableTop="@drawable/ic_launcher"
-        android:gravity="center"
-        android:text="Hello World" >
-    </TextView>
-
-</LinearLayout>
\ No newline at end of file
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/refactoring/usecompound/compound1.info b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/refactoring/usecompound/compound1.info
deleted file mode 100644
index 4f0aea5..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/refactoring/usecompound/compound1.info
+++ /dev/null
@@ -1,4 +0,0 @@
-android.widget.LinearLayout [0,121,800,480] <LinearLayout>
-    android.widget.LinearLayout [0,0,109,97] <LinearLayout>
-        android.widget.ImageView [18,0,90,72] <ImageView>
-        android.widget.TextView [0,72,109,97] <TextView>
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/refactoring/usecompound/compound1.xml b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/refactoring/usecompound/compound1.xml
deleted file mode 100644
index e4f5bf2..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/refactoring/usecompound/compound1.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="fill_parent"
-    android:layout_height="fill_parent"
-    android:orientation="vertical" >
-
-    <LinearLayout
-        android:id="@+id/layout1"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:gravity="center"
-        android:orientation="vertical" >
-
-        <ImageView
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:src="@drawable/ic_launcher" />
-
-        <TextView
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:text="Hello World" />
-    </LinearLayout>
-
-</LinearLayout>
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/refactoring/usecompound/compound2-expected-2.xml b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/refactoring/usecompound/compound2-expected-2.xml
deleted file mode 100644
index 2b9d338..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/refactoring/usecompound/compound2-expected-2.xml
+++ /dev/null
@@ -1,16 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="fill_parent"
-    android:layout_height="fill_parent"
-    android:orientation="vertical" >
-
-    <TextView
-        android:id="@+id/TextView1"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:drawableBottom="@drawable/ic_launcher"
-        android:gravity="center"
-        android:text="Hello World" >
-    </TextView>
-
-</LinearLayout>
\ No newline at end of file
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/refactoring/usecompound/compound2.info b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/refactoring/usecompound/compound2.info
deleted file mode 100644
index 37084fb..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/refactoring/usecompound/compound2.info
+++ /dev/null
@@ -1,5 +0,0 @@
-android.widget.LinearLayout [0,121,800,480] <LinearLayout>
-    android.widget.LinearLayout [0,0,109,97] <LinearLayout>
-        android.widget.TextView [0,0,109,25] <TextView>
-        android.widget.ImageView [18,25,90,97] <ImageView>
-
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/refactoring/usecompound/compound2.xml b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/refactoring/usecompound/compound2.xml
deleted file mode 100644
index c24fb21..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/refactoring/usecompound/compound2.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="fill_parent"
-    android:layout_height="fill_parent"
-    android:orientation="vertical" >
-
-    <LinearLayout
-        android:id="@+id/layout2"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:gravity="center"
-        android:orientation="vertical" >
-
-        <TextView
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:text="Hello World" />
-
-        <ImageView
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:src="@drawable/ic_launcher" />
-    </LinearLayout>
-    
-</LinearLayout>
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/refactoring/usecompound/compound3-expected-3.xml b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/refactoring/usecompound/compound3-expected-3.xml
deleted file mode 100644
index ac8ffa8..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/refactoring/usecompound/compound3-expected-3.xml
+++ /dev/null
@@ -1,16 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="fill_parent"
-    android:layout_height="fill_parent"
-    android:orientation="vertical" >
-
-    <TextView
-        android:id="@+id/TextView1"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:drawableLeft="@drawable/ic_launcher"
-        android:gravity="center"
-        android:text="Hello World" >
-    </TextView>
-
-</LinearLayout>
\ No newline at end of file
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/refactoring/usecompound/compound3.info b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/refactoring/usecompound/compound3.info
deleted file mode 100644
index 01d1127..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/refactoring/usecompound/compound3.info
+++ /dev/null
@@ -1,4 +0,0 @@
-android.widget.LinearLayout [0,121,800,480] <LinearLayout>
-    android.widget.LinearLayout [0,0,181,72] <LinearLayout>
-        android.widget.ImageView [0,0,72,72] <ImageView>
-        android.widget.TextView [72,23,181,48] <TextView>
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/refactoring/usecompound/compound3.xml b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/refactoring/usecompound/compound3.xml
deleted file mode 100644
index 2444e48..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/refactoring/usecompound/compound3.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="fill_parent"
-    android:layout_height="fill_parent"
-    android:orientation="vertical" >
-
-    <LinearLayout
-        android:id="@+id/layout3"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:gravity="center"
-        android:orientation="horizontal" >
-
-        <ImageView
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:src="@drawable/ic_launcher" />
-
-        <TextView
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:text="Hello World" />
-    </LinearLayout>
-
-</LinearLayout>
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/refactoring/usecompound/compound4-expected-4.xml b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/refactoring/usecompound/compound4-expected-4.xml
deleted file mode 100644
index af9b1c9..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/refactoring/usecompound/compound4-expected-4.xml
+++ /dev/null
@@ -1,16 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="fill_parent"
-    android:layout_height="fill_parent"
-    android:orientation="vertical" >
-
-    <TextView
-        android:id="@+id/TextView1"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:drawableRight="@drawable/ic_launcher"
-        android:gravity="center"
-        android:text="Hello World" >
-    </TextView>
-
-</LinearLayout>
\ No newline at end of file
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/refactoring/usecompound/compound4.info b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/refactoring/usecompound/compound4.info
deleted file mode 100644
index 4b39be8..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/refactoring/usecompound/compound4.info
+++ /dev/null
@@ -1,4 +0,0 @@
-android.widget.LinearLayout [0,121,800,480] <LinearLayout>
-    android.widget.LinearLayout [0,0,181,72] <LinearLayout>
-        android.widget.TextView [0,23,109,48] <TextView>
-        android.widget.ImageView [109,0,181,72] <ImageView>
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/refactoring/usecompound/compound4.xml b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/refactoring/usecompound/compound4.xml
deleted file mode 100644
index 2f6afd2..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/refactoring/usecompound/compound4.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="fill_parent"
-    android:layout_height="fill_parent"
-    android:orientation="vertical" >
-
-    <LinearLayout
-        android:id="@+id/layout4"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:gravity="center"
-        android:orientation="horizontal" >
-
-        <TextView
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:text="Hello World" />
-
-        <ImageView
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:src="@drawable/ic_launcher" />
-    </LinearLayout>
-    
-</LinearLayout>
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/refactoring/usecompound/compound5-expected-7.xml b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/refactoring/usecompound/compound5-expected-7.xml
deleted file mode 100644
index e909811..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/refactoring/usecompound/compound5-expected-7.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<TextView xmlns:android="http://schemas.android.com/apk/res/android"
-    android:id="@+id/TextView1"
-    android:layout_width="wrap_content"
-    android:layout_height="wrap_content"
-    android:drawableBottom="@drawable/ic_launcher"
-    android:text="Hello World" >
-
-</TextView>
\ No newline at end of file
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/refactoring/usecompound/compound5.info b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/refactoring/usecompound/compound5.info
deleted file mode 100644
index 8eb5c4b..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/refactoring/usecompound/compound5.info
+++ /dev/null
@@ -1,3 +0,0 @@
-android.widget.LinearLayout [0,74,480,800] <LinearLayout>
-    android.widget.TextView [0,0,107,26] <TextView>
-    android.widget.ImageView [0,26,72,98] <ImageView>
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/refactoring/usecompound/compound5.xml b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/refactoring/usecompound/compound5.xml
deleted file mode 100644
index 49c0594..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/refactoring/usecompound/compound5.xml
+++ /dev/null
@@ -1,18 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="fill_parent"
-    android:layout_height="fill_parent"
-    android:id="@+id/layout"
-    android:orientation="vertical" >
-
-    <TextView
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:text="Hello World" />
-
-    <ImageView
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:src="@drawable/ic_launcher" />
-
-</LinearLayout>
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/refactoring/usecompound/compound6-expected-8.xml b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/refactoring/usecompound/compound6-expected-8.xml
deleted file mode 100644
index 1ef5d78..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/refactoring/usecompound/compound6-expected-8.xml
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="fill_parent"
-    android:layout_height="fill_parent"
-    android:orientation="vertical" >
-
-    <TextView
-        android:id="@+id/TextView1"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:drawableLeft="@drawable/ic_launcher"
-        android:drawablePadding="@android:dimen/thumbnail_width"
-        android:gravity="center"
-        android:text="Hello World" >
-    </TextView>
-
-</LinearLayout>
\ No newline at end of file
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/refactoring/usecompound/compound6.info b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/refactoring/usecompound/compound6.info
deleted file mode 100644
index 4f0aea5..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/refactoring/usecompound/compound6.info
+++ /dev/null
@@ -1,4 +0,0 @@
-android.widget.LinearLayout [0,121,800,480] <LinearLayout>
-    android.widget.LinearLayout [0,0,109,97] <LinearLayout>
-        android.widget.ImageView [18,0,90,72] <ImageView>
-        android.widget.TextView [0,72,109,97] <TextView>
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/refactoring/usecompound/compound6.xml b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/refactoring/usecompound/compound6.xml
deleted file mode 100644
index 94a363b..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/refactoring/usecompound/compound6.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="fill_parent"
-    android:layout_height="fill_parent"
-    android:orientation="vertical" >
-
-    <LinearLayout
-        android:id="@+id/layout1"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:gravity="center" >
-
-        <ImageView
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:layout_marginRight="@android:dimen/thumbnail_width"
-            android:src="@drawable/ic_launcher" />
-
-        <TextView
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:text="Hello World" />
-    </LinearLayout>
-
-</LinearLayout>
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/refactoring/usecompound/compound7-expected-9.xml b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/refactoring/usecompound/compound7-expected-9.xml
deleted file mode 100644
index 1b2a864..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/refactoring/usecompound/compound7-expected-9.xml
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="fill_parent"
-    android:layout_height="fill_parent"
-    android:orientation="vertical" >
-
-    <TextView
-        android:id="@+id/TextView1"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:drawablePadding="35dp"
-        android:drawableTop="@drawable/ic_launcher"
-        android:gravity="center"
-        android:text="Hello World" >
-    </TextView>
-
-</LinearLayout>
\ No newline at end of file
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/refactoring/usecompound/compound7.info b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/refactoring/usecompound/compound7.info
deleted file mode 100644
index 4f0aea5..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/refactoring/usecompound/compound7.info
+++ /dev/null
@@ -1,4 +0,0 @@
-android.widget.LinearLayout [0,121,800,480] <LinearLayout>
-    android.widget.LinearLayout [0,0,109,97] <LinearLayout>
-        android.widget.ImageView [18,0,90,72] <ImageView>
-        android.widget.TextView [0,72,109,97] <TextView>
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/refactoring/usecompound/compound7.xml b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/refactoring/usecompound/compound7.xml
deleted file mode 100644
index 46393fe..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/refactoring/usecompound/compound7.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="fill_parent"
-    android:layout_height="fill_parent"
-    android:orientation="vertical" >
-
-    <LinearLayout
-        android:id="@+id/layout1"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:gravity="center"
-        android:orientation="vertical" >
-
-        <ImageView
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:layout_marginBottom="10dp"
-            android:src="@drawable/ic_launcher" />
-
-        <TextView
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:layout_marginTop="25dp"
-            android:text="Hello World" />
-    </LinearLayout>
-
-</LinearLayout>
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/refactoring/usecompound/compound_all-expected-5.xml b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/refactoring/usecompound/compound_all-expected-5.xml
deleted file mode 100644
index 35bebf5..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/refactoring/usecompound/compound_all-expected-5.xml
+++ /dev/null
@@ -1,73 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:id="@+id/RelativeLayout1"
-    android:layout_width="fill_parent"
-    android:layout_height="fill_parent" >
-
-    <LinearLayout
-        android:id="@+id/layout1"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:gravity="center"
-        android:orientation="vertical" >
-
-        <ImageView
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:src="@drawable/ic_launcher" />
-
-        <TextView
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:text="Hello World" />
-    </LinearLayout>
-
-    <TextView
-        android:id="@+id/textView2"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_below="@+id/layout1"
-        android:drawableBottom="@drawable/ic_launcher"
-        android:gravity="center"
-        android:text="Hello World" >
-    </TextView>
-
-    <LinearLayout
-        android:id="@+id/layout3"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_below="@+id/textView2"
-        android:gravity="center"
-        android:orientation="horizontal" >
-
-        <ImageView
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:src="@drawable/ic_launcher" />
-
-        <TextView
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:text="Hello World" />
-    </LinearLayout>
-
-    <LinearLayout
-        android:id="@+id/layout4"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_below="@+id/layout3"
-        android:gravity="center"
-        android:orientation="horizontal" >
-
-        <TextView
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:text="Hello World" />
-
-        <ImageView
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:src="@drawable/ic_launcher" />
-    </LinearLayout>
-
-</RelativeLayout>
\ No newline at end of file
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/refactoring/usecompound/compound_all-expected-6.xml b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/refactoring/usecompound/compound_all-expected-6.xml
deleted file mode 100644
index 6d99256..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/refactoring/usecompound/compound_all-expected-6.xml
+++ /dev/null
@@ -1,74 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:id="@+id/RelativeLayout1"
-    android:layout_width="fill_parent"
-    android:layout_height="fill_parent" >
-
-    <LinearLayout
-        android:id="@+id/layout1"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:gravity="center"
-        android:orientation="vertical" >
-
-        <ImageView
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:src="@drawable/ic_launcher" />
-
-        <TextView
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:text="Hello World" />
-    </LinearLayout>
-
-    <LinearLayout
-        android:id="@+id/layout2"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_below="@+id/layout1"
-        android:gravity="center"
-        android:orientation="vertical" >
-
-        <TextView
-            android:id="@+id/textView2"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:text="Hello World" />
-
-        <ImageView
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:src="@drawable/ic_launcher" />
-    </LinearLayout>
-
-    <TextView
-        android:id="@+id/TextView1"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_below="@+id/layout2"
-        android:drawableLeft="@drawable/ic_launcher"
-        android:gravity="center"
-        android:text="Hello World" >
-    </TextView>
-
-    <LinearLayout
-        android:id="@+id/layout4"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_below="@+id/TextView1"
-        android:gravity="center"
-        android:orientation="horizontal" >
-
-        <TextView
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:text="Hello World" />
-
-        <ImageView
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:src="@drawable/ic_launcher" />
-    </LinearLayout>
-
-</RelativeLayout>
\ No newline at end of file
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/refactoring/usecompound/compound_all.info b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/refactoring/usecompound/compound_all.info
deleted file mode 100644
index 57508bd..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/refactoring/usecompound/compound_all.info
+++ /dev/null
@@ -1,13 +0,0 @@
-android.widget.RelativeLayout [0,121,800,480] <RelativeLayout>
-    android.widget.LinearLayout [0,0,109,97] <LinearLayout>
-        android.widget.ImageView [18,0,90,72] <ImageView>
-        android.widget.TextView [0,72,109,97] <TextView>
-    android.widget.LinearLayout [0,97,109,194] <LinearLayout>
-        android.widget.TextView [0,0,109,25] <TextView>
-        android.widget.ImageView [18,25,90,97] <ImageView>
-    android.widget.LinearLayout [0,194,181,266] <LinearLayout>
-        android.widget.ImageView [0,0,72,72] <ImageView>
-        android.widget.TextView [72,23,181,48] <TextView>
-    android.widget.LinearLayout [0,266,181,338] <LinearLayout>
-        android.widget.TextView [0,23,109,48] <TextView>
-        android.widget.ImageView [109,0,181,72] <ImageView>
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/refactoring/usecompound/compound_all.xml b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/refactoring/usecompound/compound_all.xml
deleted file mode 100644
index 0406b17..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/refactoring/usecompound/compound_all.xml
+++ /dev/null
@@ -1,83 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:id="@+id/RelativeLayout1"
-    android:layout_width="fill_parent"
-    android:layout_height="fill_parent" >
-
-    <LinearLayout
-        android:id="@+id/layout1"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:gravity="center"
-        android:orientation="vertical" >
-
-        <ImageView
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:src="@drawable/ic_launcher" />
-
-        <TextView
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:text="Hello World" />
-    </LinearLayout>
-
-    <LinearLayout
-        android:id="@+id/layout2"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_below="@+id/layout1"
-        android:gravity="center"
-        android:orientation="vertical" >
-
-        <TextView
-            android:id="@+id/textView2"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:text="Hello World" />
-
-        <ImageView
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:src="@drawable/ic_launcher" />
-    </LinearLayout>
-
-    <LinearLayout
-        android:id="@+id/layout3"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_below="@+id/layout2"
-        android:gravity="center"
-        android:orientation="horizontal" >
-
-        <ImageView
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:src="@drawable/ic_launcher" />
-
-        <TextView
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:text="Hello World" />
-    </LinearLayout>
-
-    <LinearLayout
-        android:id="@+id/layout4"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_below="@+id/layout3"
-        android:gravity="center"
-        android:orientation="horizontal" >
-
-        <TextView
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:text="Hello World" />
-
-        <ImageView
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:src="@drawable/ic_launcher" />
-    </LinearLayout>
-
-</RelativeLayout>
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/sample10-expected-convertFromGrid.xml b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/sample10-expected-convertFromGrid.xml
deleted file mode 100644
index 98e1f36..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/sample10-expected-convertFromGrid.xml
+++ /dev/null
@@ -1,35 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:id="@+id/LinearLayout1"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    android:columnCount="2"
-    android:orientation="horizontal" >
-
-    <Button
-        android:id="@+id/button1"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:text="Button" />
-
-    <RadioButton
-        android:id="@+id/radioButton1"
-        android:layout_width="150dp"
-        android:layout_height="wrap_content"
-        android:layout_column="0"
-        android:layout_row="1"
-        android:text="RadioButton" />
-
-    <RadioButton
-        android:id="@+id/radioButton2"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:text="RadioButton" />
-
-    <CheckBox
-        android:id="@+id/checkBox1"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:text="CheckBox" />
-
-</LinearLayout>
\ No newline at end of file
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/sample10-expected-initialAttributes.xml b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/sample10-expected-initialAttributes.xml
deleted file mode 100644
index aa8ecda..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/sample10-expected-initialAttributes.xml
+++ /dev/null
@@ -1,35 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:id="@+id/LinearLayout1"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    android:columnCount="2"
-    android:orientation="vertical" >
-
-    <Button
-        android:id="@+id/button1"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:text="Button" />
-
-    <RadioButton
-        android:id="@+id/radioButton1"
-        android:layout_width="150dp"
-        android:layout_height="wrap_content"
-        android:layout_column="0"
-        android:layout_row="1"
-        android:text="RadioButton" />
-
-    <RadioButton
-        android:id="@+id/radioButton2"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:text="RadioButton" />
-
-    <CheckBox
-        android:id="@+id/checkBox1"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:text="CheckBox" />
-
-</LinearLayout>
\ No newline at end of file
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/sample10.info b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/sample10.info
deleted file mode 100644
index c964b0e..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/sample10.info
+++ /dev/null
@@ -1,5 +0,0 @@
-android.widget.GridLayout [0,73,320,480] <GridLayout>
-    android.widget.Button [0,0,79,48] <Button>
-    android.widget.RadioButton [0,48,150,86] <RadioButton>
-    android.widget.RadioButton [150,48,273,86] <RadioButton>
-    android.widget.CheckBox [0,86,107,124] <CheckBox>
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/sample10.xml b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/sample10.xml
deleted file mode 100644
index 1fcaab5..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/sample10.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<GridLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:id="@+id/GridLayout1"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    android:columnCount="2"
-    android:orientation="horizontal" >
-
-    <Button
-        android:id="@+id/button1"
-        android:text="Button" />
-
-    <RadioButton
-        android:id="@+id/radioButton1"
-        android:layout_width="150dp"
-        android:layout_column="0"
-        android:layout_row="1"
-        android:text="RadioButton" />
-
-    <RadioButton
-        android:id="@+id/radioButton2"
-        android:text="RadioButton" />
-
-    <CheckBox
-        android:id="@+id/checkBox1"
-        android:text="CheckBox" />
-
-</GridLayout>
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/sample11-expected-insertSpacer.xml b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/sample11-expected-insertSpacer.xml
deleted file mode 100644
index d10626a..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/sample11-expected-insertSpacer.xml
+++ /dev/null
@@ -1,59 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-    Copyright 2010 Google Inc.
-
-    Licensed under the Apache License, Version 2.0 (the "License");
-    you may not use this file except in compliance with the License.
-    You may obtain a copy of the License at
-
-         http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing, software
-    distributed under the License is distributed on an "AS IS" BASIS,
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-    See the License for the specific language governing permissions and
-    limitations under the License.
--->
-<GridLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:id="@+id/home_root"
-    android:layout_width="fill_parent"
-    android:layout_height="fill_parent"
-    android:columnCount="3"
-    android:orientation="horizontal" >
-
-    <Button
-        android:layout_gravity="fill_horizontal"
-        android:layout_weight="1" />
-
-    <Button
-        android:layout_gravity="fill_horizontal"
-        android:layout_weight="1" />
-
-    <Button
-        android:layout_column="0"
-        android:layout_gravity="fill_horizontal"
-        android:layout_weight="1"
-        android:gravity="center_horizontal" />
-
-    <Button
-        android:layout_gravity="fill_horizontal"
-        android:layout_weight="1"
-        android:gravity="center_horizontal" />
-
-    <Button
-        android:layout_column="0"
-        android:layout_gravity="fill_horizontal"
-        android:layout_weight="1"
-        android:gravity="center_horizontal" />
-
-    <Button
-        android:layout_gravity="fill_horizontal"
-        android:layout_weight="1"
-        android:gravity="center_horizontal" />
-
-    <Space
-        android:layout_column="2"
-        android:layout_gravity="fill_vertical"
-        android:layout_row="3" />
-
-</GridLayout>
\ No newline at end of file
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/sample11.info b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/sample11.info
deleted file mode 100644
index 560e8a8..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/sample11.info
+++ /dev/null
@@ -1,11 +0,0 @@
-android.widget.LinearLayout [0,50,480,320] <LinearLayout>
-    android.widget.LinearLayout [0,0,480,270] <LinearLayout>
-        android.widget.LinearLayout [6,6,474,92] <LinearLayout>
-            android.widget.Button [0,19,234,67] <Button>
-            android.widget.Button [234,19,468,67] <Button>
-        android.widget.LinearLayout [6,92,474,178] <LinearLayout>
-            android.widget.Button [0,19,234,67] <Button>
-            android.widget.Button [234,19,468,67] <Button>
-        android.widget.LinearLayout [6,178,474,264] <LinearLayout>
-            android.widget.Button [0,19,234,67] <Button>
-            android.widget.Button [234,19,468,67] <Button>
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/sample11.xml b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/sample11.xml
deleted file mode 100644
index 4df91a1..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/sample11.xml
+++ /dev/null
@@ -1,92 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-    Copyright 2010 Google Inc.
-
-    Licensed under the Apache License, Version 2.0 (the "License");
-    you may not use this file except in compliance with the License.
-    You may obtain a copy of the License at
-
-         http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing, software
-    distributed under the License is distributed on an "AS IS" BASIS,
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-    See the License for the specific language governing permissions and
-    limitations under the License.
--->
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:id="@+id/home_root"
-    android:layout_width="fill_parent"
-    android:layout_height="fill_parent"
-    android:orientation="vertical" >
-
-    <LinearLayout
-        android:layout_width="fill_parent"
-        android:layout_height="wrap_content"
-        android:layout_weight="1"
-        android:orientation="vertical"
-        android:padding="6dip" >
-
-        <LinearLayout
-            android:layout_width="fill_parent"
-            android:layout_height="wrap_content"
-            android:layout_weight="1"
-            android:orientation="horizontal" >
-
-            <Button
-                android:layout_width="fill_parent"
-                android:layout_height="wrap_content"
-                android:layout_gravity="center_vertical"
-                android:layout_weight="1" />
-
-            <Button
-                android:layout_width="fill_parent"
-                android:layout_height="wrap_content"
-                android:layout_gravity="center_vertical"
-                android:layout_weight="1" />
-        </LinearLayout>
-
-        <LinearLayout
-            android:layout_width="fill_parent"
-            android:layout_height="wrap_content"
-            android:layout_weight="1"
-            android:orientation="horizontal" >
-
-            <Button
-                android:layout_width="fill_parent"
-                android:layout_height="wrap_content"
-                android:layout_gravity="center_vertical"
-                android:layout_weight="1"
-                android:gravity="center_horizontal" />
-
-            <Button
-                android:layout_width="fill_parent"
-                android:layout_height="wrap_content"
-                android:layout_gravity="center_vertical"
-                android:layout_weight="1"
-                android:gravity="center_horizontal" />
-        </LinearLayout>
-
-        <LinearLayout
-            android:layout_width="fill_parent"
-            android:layout_height="wrap_content"
-            android:layout_weight="1"
-            android:orientation="horizontal" >
-
-            <Button
-                android:layout_width="fill_parent"
-                android:layout_height="wrap_content"
-                android:layout_gravity="center_vertical"
-                android:layout_weight="1"
-                android:gravity="center_horizontal" />
-
-            <Button
-                android:layout_width="fill_parent"
-                android:layout_height="wrap_content"
-                android:layout_gravity="center_vertical"
-                android:layout_weight="1"
-                android:gravity="center_horizontal" />
-        </LinearLayout>
-    </LinearLayout>
-
-</LinearLayout>
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/sample1a-expected-assistant1.txt b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/sample1a-expected-assistant1.txt
deleted file mode 100644
index 8eccdfc..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/sample1a-expected-assistant1.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-Quick assistant in sample1a.xml for <Button android:text="Fir^stButton":
-Extract Android String : Initiates the "Extract Android String" refactoring
-Extract Style : Initiates the "Extract Style" refactoring
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/sample1a-expected-assistant2.txt b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/sample1a-expected-assistant2.txt
deleted file mode 100644
index b435ef4..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/sample1a-expected-assistant2.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-Quick assistant in sample1a.xml for <Bu^tton android:text:
-Wrap in Container : Initiates the "Wrap in Container" refactoring
-Remove Container : Initiates the "Remove Container" refactoring
-Change Widget Type : Initiates the "Change Widget Type" refactoring
-Change Layout : Initiates the "Change Layout" refactoring
-Extract as Include : Initiates the "Extract as Include" refactoring
-Extract Style : Initiates the "Extract Style" refactoring
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/sample1a-expected-assistant3.txt b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/sample1a-expected-assistant3.txt
deleted file mode 100644
index a7c46c0..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/sample1a-expected-assistant3.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-Quick assistant in sample1a.xml for <Button andr^oid:text="FirstButton":
-Wrap in Container : Initiates the "Wrap in Container" refactoring
-Remove Container : Initiates the "Remove Container" refactoring
-Change Widget Type : Initiates the "Change Widget Type" refactoring
-Change Layout : Initiates the "Change Layout" refactoring
-Extract as Include : Initiates the "Extract as Include" refactoring
-Extract Style : Initiates the "Extract Style" refactoring
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/sample1a-expected-assistant4.txt b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/sample1a-expected-assistant4.txt
deleted file mode 100644
index 30bb00b..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/sample1a-expected-assistant4.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-Quick assistant in sample1a.xml for android:id="@+id/Linea^rLayout2":
-Rename Android Resource : Initiates the "Rename Android Resource" refactoring
-Extract Style : Initiates the "Extract Style" refactoring
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/sample1a-expected-changeLayout1a.xml b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/sample1a-expected-changeLayout1a.xml
deleted file mode 100644
index d03c925..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/sample1a-expected-changeLayout1a.xml
+++ /dev/null
@@ -1,75 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:id="@+id/RelativeLayout1"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    android:orientation="vertical" >
-
-    <Button
-        android:id="@+id/button1"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_alignParentLeft="true"
-        android:layout_alignParentTop="true"
-        android:text="FirstButton" >
-    </Button>
-
-    <Button
-        android:id="@+id/button2"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_alignParentLeft="true"
-        android:layout_below="@+id/button1"
-        android:layout_marginTop="2dp"
-        android:text="SecondButton" >
-    </Button>
-
-    <Button
-        android:id="@+id/button3"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_alignBaseline="@+id/button2"
-        android:layout_alignTop="@+id/button2"
-        android:layout_toRightOf="@+id/button2"
-        android:text="ThirdButton" >
-    </Button>
-
-    <CheckBox
-        android:id="@+id/checkBox1"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_alignBaseline="@+id/button2"
-        android:layout_below="@+id/button1"
-        android:layout_toRightOf="@+id/button3"
-        android:text="CheckBox" >
-    </CheckBox>
-
-    <Button
-        android:id="@+id/button4"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:layout_alignParentLeft="true"
-        android:layout_below="@+id/checkBox1"
-        android:text="FourthButton" >
-    </Button>
-
-    <Button
-        android:id="@+id/button5"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_alignParentLeft="true"
-        android:layout_below="@+id/button4"
-        android:layout_gravity="right"
-        android:text="FifthButton" >
-    </Button>
-
-    <Button
-        android:id="@+id/button6"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_alignParentLeft="true"
-        android:layout_below="@+id/button5"
-        android:text="Button" >
-    </Button>
-
-</RelativeLayout>
\ No newline at end of file
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/sample1a-expected-changeView1.xml b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/sample1a-expected-changeView1.xml
deleted file mode 100644
index f4a08d0..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/sample1a-expected-changeView1.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<LinearLayout android:id="@+id/LinearLayout2" xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical">
-    <RadioButton android:text="FirstButton" android:id="@+id/RadioButton1" android:layout_width="wrap_content" android:layout_height="wrap_content"></RadioButton>
-    <LinearLayout android:layout_width="match_parent" android:id="@+id/linearLayout1" android:layout_height="wrap_content">
-        <Button android:text="SecondButton" android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/button2"></Button>
-        <Button android:text="ThirdButton" android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/button3"></Button>
-        <CheckBox android:id="@+id/checkBox1" android:text="CheckBox" android:layout_width="wrap_content" android:layout_height="wrap_content"></CheckBox>
-    </LinearLayout>
-    <Button android:layout_height="wrap_content" android:text="FourthButton" android:id="@+id/button4" android:layout_width="match_parent"></Button>
-    <LinearLayout android:layout_height="wrap_content" android:id="@+id/linearLayout3" android:layout_width="match_parent">
-        <Button android:layout_gravity="right" android:id="@+id/button5" android:text="FifthButton" android:layout_height="wrap_content" android:layout_width="wrap_content"></Button>
-    </LinearLayout>
-    <LinearLayout android:layout_height="wrap_content" android:id="@+id/linearLayout4" android:layout_width="match_parent">
-        <LinearLayout android:layout_height="match_parent" android:id="@+id/linearLayout5" android:layout_width="wrap_content">
-            <LinearLayout android:layout_height="match_parent" android:id="@+id/linearLayout6" android:layout_width="wrap_content">
-                <RadioButton android:text="Button" android:id="@+id/RadioButton2" android:layout_width="wrap_content" android:layout_height="wrap_content"></RadioButton>
-            </LinearLayout>
-        </LinearLayout>
-    </LinearLayout>
-</LinearLayout>
-
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/sample1a-expected-extract6.diff b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/sample1a-expected-extract6.diff
deleted file mode 100644
index 1ae5748..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/sample1a-expected-extract6.diff
+++ /dev/null
@@ -1,9 +0,0 @@
-@@ -13 +13
--     <LinearLayout android:layout_height="wrap_content" android:id="@+id/linearLayout4" android:layout_width="match_parent">
--         <LinearLayout android:layout_height="match_parent" android:id="@+id/linearLayout5" android:layout_width="wrap_content">
--             <LinearLayout android:layout_height="match_parent" android:id="@+id/linearLayout6" android:layout_width="wrap_content">
--                 <Button android:text="Button" android:id="@+id/button6" android:layout_width="wrap_content" android:layout_height="wrap_content"></Button>
--             </LinearLayout>
--         </LinearLayout>
--     </LinearLayout>
-+     <include layout="@layout/newlayout6" android:id="@+id/linearLayout4_ref"  android:layout_width="match_parent" android:layout_height="wrap_content"/>
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/sample1a-expected-extract7.diff b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/sample1a-expected-extract7.diff
deleted file mode 100644
index 6d18aab..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/sample1a-expected-extract7.diff
+++ /dev/null
@@ -1,84 +0,0 @@
-@@ -2 +2
-- <LinearLayout android:id="@+id/LinearLayout2" xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical">
--     <Button android:text="FirstButton" android:id="@+id/button1" android:layout_width="wrap_content" android:layout_height="wrap_content"></Button>
--     <LinearLayout android:layout_width="match_parent" android:id="@+id/linearLayout1" android:layout_height="wrap_content">
--         <Button android:text="SecondButton" android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/button2"></Button>
--         <Button android:text="ThirdButton" android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/button3"></Button>
--         <CheckBox android:id="@+id/checkBox1" android:text="CheckBox" android:layout_width="wrap_content" android:layout_height="wrap_content"></CheckBox>
--     </LinearLayout>
--     <Button android:layout_height="wrap_content" android:text="FourthButton" android:id="@+id/button4" android:layout_width="match_parent"></Button>
--     <LinearLayout android:layout_height="wrap_content" android:id="@+id/linearLayout3" android:layout_width="match_parent">
--         <Button android:layout_gravity="right" android:id="@+id/button5" android:text="FifthButton" android:layout_height="wrap_content" android:layout_width="wrap_content"></Button>
-+ <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-+     android:id="@+id/LinearLayout2"
-+     android:layout_width="match_parent"
-+     android:layout_height="match_parent"
-+     android:orientation="vertical" >
-+
-+     <Button
-+         android:id="@+id/button1"
-+         android:layout_width="wrap_content"
-+         android:layout_height="wrap_content"
-+         android:text="FirstButton" >
-+     </Button>
-+
-+     <LinearLayout
-+         android:id="@+id/linearLayout1"
-+         android:layout_width="match_parent"
-+         android:layout_height="wrap_content" >
-+
-+         <Button
-+             android:id="@+id/button2"
-+             android:layout_width="wrap_content"
-+             android:layout_height="wrap_content"
-+             android:text="SecondButton" >
-+         </Button>
-+
-+         <Button
-+             android:id="@+id/button3"
-+             android:layout_width="wrap_content"
-+             android:layout_height="wrap_content"
-+             android:text="ThirdButton" >
-+         </Button>
-+
-+         <CheckBox
-+             android:id="@+id/checkBox1"
-+             android:layout_width="wrap_content"
-+             android:layout_height="wrap_content"
-+             android:text="CheckBox" >
-+         </CheckBox>
-@@ -13 +41
--     <LinearLayout android:layout_height="wrap_content" android:id="@+id/linearLayout4" android:layout_width="match_parent">
--         <LinearLayout android:layout_height="match_parent" android:id="@+id/linearLayout5" android:layout_width="wrap_content">
--             <LinearLayout android:layout_height="match_parent" android:id="@+id/linearLayout6" android:layout_width="wrap_content">
--                 <Button android:text="Button" android:id="@+id/button6" android:layout_width="wrap_content" android:layout_height="wrap_content"></Button>
--             </LinearLayout>
--         </LinearLayout>
-+
-+     <Button
-+         android:id="@+id/button4"
-+         android:layout_width="match_parent"
-+         android:layout_height="wrap_content"
-+         android:text="FourthButton" >
-+     </Button>
-+
-+     <LinearLayout
-+         android:id="@+id/linearLayout3"
-+         android:layout_width="match_parent"
-+         android:layout_height="wrap_content" >
-+
-+         <Button
-+             android:id="@+id/button5"
-+             android:layout_width="wrap_content"
-+             android:layout_height="wrap_content"
-+             android:layout_gravity="right"
-+             android:text="FifthButton" >
-+         </Button>
-@@ -20 +62
-+
-+     <include
-+         android:id="@+id/linearLayout4_ref"
-+         android:layout_width="match_parent"
-+         android:layout_height="wrap_content"
-+         layout="@layout/newlayout6" />
-+
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/sample1a-expected-gridLayout1.xml b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/sample1a-expected-gridLayout1.xml
deleted file mode 100644
index 72fe214..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/sample1a-expected-gridLayout1.xml
+++ /dev/null
@@ -1,61 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<GridLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:id="@+id/GridLayout1"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    android:columnCount="4"
-    android:orientation="horizontal" >
-
-    <Button
-        android:id="@+id/button1"
-        android:layout_gravity="left"
-        android:text="FirstButton" >
-    </Button>
-
-    <Button
-        android:id="@+id/button2"
-        android:layout_column="0"
-        android:layout_gravity="left"
-        android:text="SecondButton" >
-    </Button>
-
-    <Button
-        android:id="@+id/button3"
-        android:layout_gravity="left"
-        android:text="ThirdButton" >
-    </Button>
-
-    <CheckBox
-        android:id="@+id/checkBox1"
-        android:layout_gravity="left"
-        android:text="CheckBox" >
-    </CheckBox>
-
-    <Button
-        android:id="@+id/button4"
-        android:layout_column="0"
-        android:layout_columnSpan="3"
-        android:layout_gravity="fill_horizontal"
-        android:text="FourthButton" >
-    </Button>
-
-    <Button
-        android:id="@+id/button5"
-        android:layout_column="0"
-        android:layout_gravity="right"
-        android:text="FifthButton" >
-    </Button>
-
-    <Button
-        android:id="@+id/button6"
-        android:layout_column="0"
-        android:layout_gravity="left"
-        android:text="Button" >
-    </Button>
-
-    <Space
-        android:layout_column="3"
-        android:layout_gravity="fill_vertical"
-        android:layout_row="5" />
-
-</GridLayout>
\ No newline at end of file
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/sample1a.info b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/sample1a.info
deleted file mode 100644
index 20a23b0..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/sample1a.info
+++ /dev/null
@@ -1,13 +0,0 @@
-android.widget.LinearLayout [0,36,240,320]  <LinearLayout>
-    android.widget.Button [0,0,70,36]  <Button>
-    android.widget.LinearLayout [0,36,240,72]  <LinearLayout>
-        android.widget.Button [0,2,84,38]  <Button>
-        android.widget.Button [84,2,158,38]  <Button>
-        android.widget.CheckBox [158,0,238,36]  <CheckBox>
-    android.widget.Button [0,72,240,108]  <Button>
-    android.widget.LinearLayout [0,108,240,144]  <LinearLayout>
-        android.widget.Button [0,0,71,36]  <Button>
-    android.widget.LinearLayout [0,144,240,180]  <LinearLayout>
-        android.widget.LinearLayout [0,0,49,36]  <LinearLayout>
-            android.widget.LinearLayout [0,0,49,36]  <LinearLayout>
-                android.widget.Button [0,0,49,36]  <Button>
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/sample1a.xml b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/sample1a.xml
deleted file mode 100644
index 9a94935..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/sample1a.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<LinearLayout android:id="@+id/LinearLayout2" xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical">
-    <Button android:text="FirstButton" android:id="@+id/button1" android:layout_width="wrap_content" android:layout_height="wrap_content"></Button>
-    <LinearLayout android:layout_width="match_parent" android:id="@+id/linearLayout1" android:layout_height="wrap_content">
-        <Button android:text="SecondButton" android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/button2"></Button>
-        <Button android:text="ThirdButton" android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/button3"></Button>
-        <CheckBox android:id="@+id/checkBox1" android:text="CheckBox" android:layout_width="wrap_content" android:layout_height="wrap_content"></CheckBox>
-    </LinearLayout>
-    <Button android:layout_height="wrap_content" android:text="FourthButton" android:id="@+id/button4" android:layout_width="match_parent"></Button>
-    <LinearLayout android:layout_height="wrap_content" android:id="@+id/linearLayout3" android:layout_width="match_parent">
-        <Button android:layout_gravity="right" android:id="@+id/button5" android:text="FifthButton" android:layout_height="wrap_content" android:layout_width="wrap_content"></Button>
-    </LinearLayout>
-    <LinearLayout android:layout_height="wrap_content" android:id="@+id/linearLayout4" android:layout_width="match_parent">
-        <LinearLayout android:layout_height="match_parent" android:id="@+id/linearLayout5" android:layout_width="wrap_content">
-            <LinearLayout android:layout_height="match_parent" android:id="@+id/linearLayout6" android:layout_width="wrap_content">
-                <Button android:text="Button" android:id="@+id/button6" android:layout_width="wrap_content" android:layout_height="wrap_content"></Button>
-            </LinearLayout>
-        </LinearLayout>
-    </LinearLayout>
-</LinearLayout>
-
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/sample1b-expected-changeLayout1b.xml b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/sample1b-expected-changeLayout1b.xml
deleted file mode 100644
index d03c925..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/sample1b-expected-changeLayout1b.xml
+++ /dev/null
@@ -1,75 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:id="@+id/RelativeLayout1"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    android:orientation="vertical" >
-
-    <Button
-        android:id="@+id/button1"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_alignParentLeft="true"
-        android:layout_alignParentTop="true"
-        android:text="FirstButton" >
-    </Button>
-
-    <Button
-        android:id="@+id/button2"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_alignParentLeft="true"
-        android:layout_below="@+id/button1"
-        android:layout_marginTop="2dp"
-        android:text="SecondButton" >
-    </Button>
-
-    <Button
-        android:id="@+id/button3"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_alignBaseline="@+id/button2"
-        android:layout_alignTop="@+id/button2"
-        android:layout_toRightOf="@+id/button2"
-        android:text="ThirdButton" >
-    </Button>
-
-    <CheckBox
-        android:id="@+id/checkBox1"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_alignBaseline="@+id/button2"
-        android:layout_below="@+id/button1"
-        android:layout_toRightOf="@+id/button3"
-        android:text="CheckBox" >
-    </CheckBox>
-
-    <Button
-        android:id="@+id/button4"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:layout_alignParentLeft="true"
-        android:layout_below="@+id/checkBox1"
-        android:text="FourthButton" >
-    </Button>
-
-    <Button
-        android:id="@+id/button5"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_alignParentLeft="true"
-        android:layout_below="@+id/button4"
-        android:layout_gravity="right"
-        android:text="FifthButton" >
-    </Button>
-
-    <Button
-        android:id="@+id/button6"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_alignParentLeft="true"
-        android:layout_below="@+id/button5"
-        android:text="Button" >
-    </Button>
-
-</RelativeLayout>
\ No newline at end of file
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/sample1b.info b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/sample1b.info
deleted file mode 100644
index 7807227..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/sample1b.info
+++ /dev/null
@@ -1,14 +0,0 @@
-android.widget.LinearLayout [0,36,240,320]  <LinearLayout>
-    android.widget.Button [0,0,70,36]  <Button>
-    android.widget.LinearLayout [0,36,240,72]  <LinearLayout>
-        android.widget.Button [0,2,84,38]  <Button>
-        android.widget.Button [84,2,158,38]  <Button>
-        android.widget.CheckBox [158,0,238,36]  <CheckBox>
-    android.widget.Button [0,72,240,108]  <Button>
-    android.widget.LinearLayout [0,108,240,144]  <LinearLayout>
-        android.widget.Button [0,0,71,36]  <Button>
-    android.widget.LinearLayout [0,144,240,180]  <LinearLayout>
-        android.widget.LinearLayout [0,0,49,36]  <LinearLayout>
-            android.widget.LinearLayout [0,0,49,36]  <LinearLayout>
-                android.widget.Button [0,0,49,36]  <Button>
-
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/sample1b.xml b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/sample1b.xml
deleted file mode 100644
index 6b800ae..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/sample1b.xml
+++ /dev/null
@@ -1,70 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<LinearLayout
-    android:id="@+id/LinearLayout2"
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    android:orientation="vertical">
-    <Button
-        android:text="FirstButton"
-        android:id="@+id/button1"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"></Button>
-    <LinearLayout
-        android:layout_width="match_parent"
-        android:id="@+id/linearLayout1"
-        android:layout_height="wrap_content">
-        <Button
-            android:text="SecondButton"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:id="@+id/button2"></Button>
-        <Button
-            android:text="ThirdButton"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:id="@+id/button3"></Button>
-        <CheckBox
-            android:id="@+id/checkBox1"
-            android:text="CheckBox"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"></CheckBox>
-    </LinearLayout>
-    <Button
-        android:layout_height="wrap_content"
-        android:text="FourthButton"
-        android:id="@+id/button4"
-        android:layout_width="match_parent"></Button>
-    <LinearLayout
-        android:layout_height="wrap_content"
-        android:id="@+id/linearLayout3"
-        android:layout_width="match_parent">
-        <Button
-            android:layout_gravity="right"
-            android:id="@+id/button5"
-            android:text="FifthButton"
-            android:layout_height="wrap_content"
-            android:layout_width="wrap_content"></Button>
-    </LinearLayout>
-    <LinearLayout
-        android:layout_height="wrap_content"
-        android:id="@+id/linearLayout4"
-        android:layout_width="match_parent">
-        <LinearLayout
-            android:layout_height="match_parent"
-            android:id="@+id/linearLayout5"
-            android:layout_width="wrap_content">
-            <LinearLayout
-                android:layout_height="match_parent"
-                android:id="@+id/linearLayout6"
-                android:layout_width="wrap_content">
-                <Button
-                    android:text="Button"
-                    android:id="@+id/button6"
-                    android:layout_width="wrap_content"
-                    android:layout_height="wrap_content"></Button>
-            </LinearLayout>
-        </LinearLayout>
-    </LinearLayout>
-</LinearLayout>
-
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/sample2-expected-changeLayout2.xml b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/sample2-expected-changeLayout2.xml
deleted file mode 100644
index 06420c4..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/sample2-expected-changeLayout2.xml
+++ /dev/null
@@ -1,62 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:id="@+id/RelativeLayout1"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    android:orientation="vertical" >
-
-    <Button
-        android:id="@+id/button1"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_alignParentLeft="true"
-        android:layout_alignParentTop="true"
-        android:text="Button" >
-    </Button>
-
-    <Button
-        android:id="@+id/button2"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_alignParentLeft="true"
-        android:layout_below="@+id/button1"
-        android:text="Button" >
-    </Button>
-
-    <Button
-        android:id="@+id/button3"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_below="@+id/button2"
-        android:layout_toRightOf="@+id/button2"
-        android:text="Button" >
-    </Button>
-
-    <Button
-        android:id="@+id/button4"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_below="@+id/button3"
-        android:layout_toRightOf="@+id/button3"
-        android:text="Button" >
-    </Button>
-
-    <CheckBox
-        android:id="@+id/checkBox1"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_below="@+id/button4"
-        android:layout_toLeftOf="@+id/button4"
-        android:text="CheckBox" >
-    </CheckBox>
-
-    <Button
-        android:id="@+id/button5"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_alignParentRight="true"
-        android:layout_alignTop="@+id/button2"
-        android:text="Button" >
-    </Button>
-
-</RelativeLayout>
\ No newline at end of file
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/sample2-expected-changeView2.xml b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/sample2-expected-changeView2.xml
deleted file mode 100644
index 366c8df..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/sample2-expected-changeView2.xml
+++ /dev/null
@@ -1,13 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical">
-    <Button android:text="Button" android:id="@+id/button1" android:layout_width="wrap_content" android:layout_height="wrap_content"></Button>
-    <RelativeLayout android:layout_height="match_parent" android:id="@+id/relativeLayout1" android:layout_width="match_parent">
-        <Button android:layout_width="wrap_content" android:layout_alignParentLeft="true" android:id="@+id/button2" android:layout_height="wrap_content" android:text="Button"></Button>
-        <ImageButton android:layout_width="wrap_content" android:id="@+id/ImageButton1" android:layout_below="@+id/button2" android:layout_height="wrap_content" android:text="Button" android:layout_toRightOf="@+id/button2"></ImageButton>
-        <Button android:layout_width="wrap_content" android:id="@+id/button4" android:layout_below="@+id/ImageButton1" android:layout_height="wrap_content" android:text="Button" android:layout_toRightOf="@+id/ImageButton1"></Button>
-        <CheckBox android:layout_width="wrap_content" android:layout_below="@+id/button4" android:id="@+id/checkBox1" android:layout_height="wrap_content" android:text="CheckBox" android:layout_toLeftOf="@+id/button4"></CheckBox>
-        <ImageButton android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Button" android:id="@+id/ImageButton2" android:layout_alignParentRight="true"></ImageButton>
-    </RelativeLayout>
-</LinearLayout>
-
-
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/sample2-expected-extract3.xml b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/sample2-expected-extract3.xml
deleted file mode 100644
index e4ff731..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/sample2-expected-extract3.xml
+++ /dev/null
@@ -1,13 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical">
-    <Button android:text="Button" android:id="@+id/button1" android:layout_width="wrap_content" android:layout_height="wrap_content"></Button>
-    <RelativeLayout android:layout_height="match_parent" android:id="@+id/relativeLayout1" android:layout_width="match_parent">
-        <Button android:layout_width="wrap_content" android:layout_alignParentLeft="true" android:id="@+id/button2" android:layout_height="wrap_content" android:text="Button"></Button>
-        <include layout="@layout/newlayout3" android:id="@+id/button3_ref"  android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/button2" android:layout_toRightOf="@+id/button2"/>
-        <Button android:layout_width="wrap_content" android:id="@+id/button4" android:layout_below="@+id/button3_ref" android:layout_height="wrap_content" android:text="Button" android:layout_toRightOf="@+id/button3_ref"></Button>
-        <CheckBox android:layout_width="wrap_content" android:layout_below="@+id/button4" android:id="@+id/checkBox1" android:layout_height="wrap_content" android:text="CheckBox" android:layout_toLeftOf="@+id/button4"></CheckBox>
-        <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Button" android:id="@+id/button5" android:layout_alignParentRight="true"></Button>
-    </RelativeLayout>
-</LinearLayout>
-
-
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/sample2-expected-gridLayout2.xml b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/sample2-expected-gridLayout2.xml
deleted file mode 100644
index 8b90562..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/sample2-expected-gridLayout2.xml
+++ /dev/null
@@ -1,67 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<GridLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:id="@+id/GridLayout1"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    android:columnCount="6"
-    android:orientation="horizontal" >
-
-    <Button
-        android:id="@+id/button1"
-        android:layout_columnSpan="2"
-        android:layout_gravity="left"
-        android:text="Button" >
-    </Button>
-
-    <Button
-        android:id="@+id/button2"
-        android:layout_alignParentLeft="true"
-        android:layout_column="0"
-        android:layout_columnSpan="2"
-        android:layout_gravity="left"
-        android:text="Button" >
-    </Button>
-
-    <Button
-        android:id="@+id/button3"
-        android:layout_below="@+id/button2"
-        android:layout_gravity="left"
-        android:layout_row="2"
-        android:layout_toRightOf="@+id/button2"
-        android:text="Button" >
-    </Button>
-
-    <Button
-        android:id="@+id/button4"
-        android:layout_below="@+id/button3"
-        android:layout_gravity="left"
-        android:layout_row="3"
-        android:layout_toRightOf="@+id/button3"
-        android:text="Button" >
-    </Button>
-
-    <CheckBox
-        android:id="@+id/checkBox1"
-        android:layout_below="@+id/button4"
-        android:layout_column="1"
-        android:layout_columnSpan="2"
-        android:layout_gravity="left"
-        android:layout_toLeftOf="@+id/button4"
-        android:text="CheckBox" >
-    </CheckBox>
-
-    <Button
-        android:id="@+id/button5"
-        android:layout_alignParentRight="true"
-        android:layout_column="4"
-        android:layout_gravity="left"
-        android:layout_row="1"
-        android:text="Button" >
-    </Button>
-
-    <Space
-        android:layout_column="5"
-        android:layout_gravity="fill_vertical"
-        android:layout_row="5" />
-
-</GridLayout>
\ No newline at end of file
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/sample2.info b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/sample2.info
deleted file mode 100644
index 44d3b62..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/sample2.info
+++ /dev/null
@@ -1,9 +0,0 @@
-android.widget.LinearLayout [0,36,240,320]  <LinearLayout>
-    android.widget.Button [0,0,49,36]  <Button>
-    android.widget.RelativeLayout [0,36,240,284]  <RelativeLayout>
-        android.widget.Button [0,0,49,36]  <Button>
-        android.widget.Button [49,36,98,72]  <Button>
-        android.widget.Button [98,72,147,108]  <Button>
-        android.widget.CheckBox [18,108,98,144]  <CheckBox>
-        android.widget.Button [191,0,240,36]  <Button>
-
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/sample2.xml b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/sample2.xml
deleted file mode 100644
index 0697c64..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/sample2.xml
+++ /dev/null
@@ -1,13 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical">
-    <Button android:text="Button" android:id="@+id/button1" android:layout_width="wrap_content" android:layout_height="wrap_content"></Button>
-    <RelativeLayout android:layout_height="match_parent" android:id="@+id/relativeLayout1" android:layout_width="match_parent">
-        <Button android:layout_width="wrap_content" android:layout_alignParentLeft="true" android:id="@+id/button2" android:layout_height="wrap_content" android:text="Button"></Button>
-        <Button android:layout_width="wrap_content" android:id="@+id/button3" android:layout_below="@+id/button2" android:layout_height="wrap_content" android:text="Button" android:layout_toRightOf="@+id/button2"></Button>
-        <Button android:layout_width="wrap_content" android:id="@+id/button4" android:layout_below="@+id/button3" android:layout_height="wrap_content" android:text="Button" android:layout_toRightOf="@+id/button3"></Button>
-        <CheckBox android:layout_width="wrap_content" android:layout_below="@+id/button4" android:id="@+id/checkBox1" android:layout_height="wrap_content" android:text="CheckBox" android:layout_toLeftOf="@+id/button4"></CheckBox>
-        <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Button" android:id="@+id/button5" android:layout_alignParentRight="true"></Button>
-    </RelativeLayout>
-</LinearLayout>
-
-
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/sample3-expected-changeLayout3.xml b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/sample3-expected-changeLayout3.xml
deleted file mode 100644
index 268688b..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/sample3-expected-changeLayout3.xml
+++ /dev/null
@@ -1,38 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:id="@+id/newlinear"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    android:orientation="vertical" >
-
-    <Button
-        android:id="@+id/button1"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_alignParentLeft="true"
-        android:layout_alignParentTop="true"
-        android:text="Button" >
-    </Button>
-
-    <ImageView
-        android:id="@+id/android_logo"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_above="@+id/button2"
-        android:layout_alignParentLeft="true"
-        android:layout_below="@+id/button1"
-        android:layout_weight="1.0"
-        android:clickable="false"
-        android:focusable="false"
-        android:src="@drawable/android_button" />
-
-    <Button
-        android:id="@+id/button2"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_alignParentBottom="true"
-        android:layout_alignParentLeft="true"
-        android:text="Button" >
-    </Button>
-
-</RelativeLayout>
\ No newline at end of file
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/sample3-expected-extract1.xml b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/sample3-expected-extract1.xml
deleted file mode 100644
index 70f576e..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/sample3-expected-extract1.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/newlinear" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent">
-    <Button android:text="Button" android:id="@+id/button1" android:layout_width="wrap_content" android:layout_height="wrap_content"></Button>
-    <ImageView android:id="@+id/android_logo" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/android_button" android:focusable="false" android:clickable="false" android:layout_weight="1.0" />
-    <include layout="@layout/newlayout1" android:id="@+id/button2_ref"  android:layout_width="wrap_content" android:layout_height="wrap_content"/>
-</LinearLayout>
-
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/sample3-expected-extract2.xml b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/sample3-expected-extract2.xml
deleted file mode 100644
index 9a30a96..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/sample3-expected-extract2.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/newlinear" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent">
-    <Button android:text="Button" android:id="@+id/button1" android:layout_width="wrap_content" android:layout_height="wrap_content"></Button>
-    <include layout="@layout/newlayout2"  android:layout_width="wrap_content" android:layout_height="wrap_content"/>
-</LinearLayout>
-
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/sample3-expected-extract4.xml b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/sample3-expected-extract4.xml
deleted file mode 100644
index 445f88a..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/sample3-expected-extract4.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/newlinear" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent">
-    <Button android:text="Button" android:id="@+id/button1" android:layout_width="wrap_content" android:layout_height="wrap_content"></Button>
-    <include layout="@layout/newlayout3" android:id="@+id/android_logo_ref"  android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1.0"/>
-    <Button android:text="Button" android:id="@+id/button2" android:layout_width="wrap_content" android:layout_height="wrap_content"></Button>
-</LinearLayout>
-
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/sample3-expected-extract5.xml b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/sample3-expected-extract5.xml
deleted file mode 100644
index 8df41ca..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/sample3-expected-extract5.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/newlinear" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent">
-    <include layout="@layout/newlayout3"  android:layout_width="wrap_content" android:layout_height="wrap_content"/>
-    <Button android:text="Button" android:id="@+id/button2" android:layout_width="wrap_content" android:layout_height="wrap_content"></Button>
-</LinearLayout>
-
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/sample3-expected-wrapIn1.xml b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/sample3-expected-wrapIn1.xml
deleted file mode 100644
index 097f870..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/sample3-expected-wrapIn1.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:id="@+id/newlinear"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    android:orientation="vertical" >
-
-    <Button
-        android:id="@+id/button1"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:text="Button" >
-    </Button>
-
-    <ImageView
-        android:id="@+id/android_logo"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_weight="1.0"
-        android:clickable="false"
-        android:focusable="false"
-        android:src="@drawable/android_button" />
-
-    <LinearLayout
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content" >
-
-        <Button
-            android:id="@+id/button2"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:text="Button" >
-        </Button>
-    </LinearLayout>
-
-</LinearLayout>
\ No newline at end of file
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/sample3-expected-wrapIn2.xml b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/sample3-expected-wrapIn2.xml
deleted file mode 100644
index 2921e40..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/sample3-expected-wrapIn2.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<android.gesture.GestureOverlayView xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent" >
-
-    <LinearLayout
-        android:id="@+id/newlinear"
-        android:layout_width="match_parent"
-        android:layout_height="match_parent"
-        android:orientation="vertical" >
-
-        <Button
-            android:id="@+id/button1"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:text="Button" >
-        </Button>
-
-        <ImageView
-            android:id="@+id/android_logo"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:layout_weight="1.0"
-            android:clickable="false"
-            android:focusable="false"
-            android:src="@drawable/android_button" />
-
-        <Button
-            android:id="@+id/button2"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:text="Button" >
-        </Button>
-    </LinearLayout>
-
-</android.gesture.GestureOverlayView>
\ No newline at end of file
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/sample3-expected-wrapIn3.xml b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/sample3-expected-wrapIn3.xml
deleted file mode 100644
index 6b57216..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/sample3-expected-wrapIn3.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:id="@+id/newlinear"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    android:orientation="vertical" >
-
-    <Button
-        android:id="@+id/button1"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:text="Button" >
-    </Button>
-
-    <LinearLayout
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content" >
-
-        <ImageView
-            android:id="@+id/android_logo"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:layout_weight="1.0"
-            android:clickable="false"
-            android:focusable="false"
-            android:src="@drawable/android_button" />
-
-        <Button
-            android:id="@+id/button2"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:text="Button" >
-        </Button>
-    </LinearLayout>
-
-</LinearLayout>
\ No newline at end of file
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/sample3-variation1-expected-extract4.xml b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/sample3-variation1-expected-extract4.xml
deleted file mode 100644
index d616269..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/sample3-variation1-expected-extract4.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/newlinear" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent">
-    <Button android:text="Button" android:id="@+id/button2" android:layout_width="wrap_content" android:layout_height="wrap_content"></Button>
-    <LinearLayout android:id="@+id/newlinear2" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent">
-        <Button android:text="Button" android:id="@+id/button1" android:layout_width="wrap_content" android:layout_height="wrap_content"></Button>
-        <include layout="@layout/newlayout3" android:id="@+id/android_logo_ref"  android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1.0"/>
-    </LinearLayout>
-</LinearLayout>
-
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/sample3-variation1-expected-extract5.xml b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/sample3-variation1-expected-extract5.xml
deleted file mode 100644
index b37e7be..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/sample3-variation1-expected-extract5.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/newlinear" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent">
-    <Button android:text="Button" android:id="@+id/button2" android:layout_width="wrap_content" android:layout_height="wrap_content"></Button>
-    <LinearLayout android:id="@+id/newlinear2" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent">
-        <include layout="@layout/newlayout3"  android:layout_width="wrap_content" android:layout_height="wrap_content"/>
-    </LinearLayout>
-</LinearLayout>
-
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/sample3-variation1.xml b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/sample3-variation1.xml
deleted file mode 100644
index 9cf3c43..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/sample3-variation1.xml
+++ /dev/null
@@ -1,10 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/newlinear" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent">
-    <Button android:text="Button" android:id="@+id/button2" android:layout_width="wrap_content" android:layout_height="wrap_content"></Button>
-    <LinearLayout android:id="@+id/newlinear2" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent">
-        <Button android:text="Button" android:id="@+id/button1" android:layout_width="wrap_content" android:layout_height="wrap_content"></Button>
-        <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/android_button" 
-         android:focusable="false" android:clickable="false" android:layout_weight="1.0" android:id="@+id/android_logo" />
-    </LinearLayout>
-</LinearLayout>
-
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/sample3-variation2-expected-extract4.xml b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/sample3-variation2-expected-extract4.xml
deleted file mode 100644
index 40676ab..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/sample3-variation2-expected-extract4.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<LinearLayout xmlns:customprefix="http://schemas.android.com/apk/res/android" customprefix:id="@+id/newlinear" customprefix:orientation="vertical" customprefix:layout_width="match_parent" customprefix:layout_height="match_parent">
-    <include layout="@layout/newlayout3" customprefix:id="@+id/android_logo_ref"  customprefix:layout_width="wrap_content" customprefix:layout_height="wrap_content" customprefix:layout_weight="1.0"/>
-    <Button customprefix:text="Button" customprefix:id="@+id/button1" customprefix:layout_width="wrap_content" customprefix:layout_height="wrap_content"></Button>
-    <Button customprefix:text="Button" customprefix:id="@+id/button2" customprefix:layout_width="wrap_content" customprefix:layout_height="wrap_content"></Button>
-</LinearLayout>
-
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/sample3-variation2-expected-extract5.xml b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/sample3-variation2-expected-extract5.xml
deleted file mode 100644
index c51dc37..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/sample3-variation2-expected-extract5.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<LinearLayout xmlns:customprefix="http://schemas.android.com/apk/res/android" customprefix:id="@+id/newlinear" customprefix:orientation="vertical" customprefix:layout_width="match_parent" customprefix:layout_height="match_parent">
-    <include layout="@layout/newlayout3"  customprefix:layout_width="wrap_content" customprefix:layout_height="wrap_content"/>
-    <Button customprefix:text="Button" customprefix:id="@+id/button2" customprefix:layout_width="wrap_content" customprefix:layout_height="wrap_content"></Button>
-</LinearLayout>
-
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/sample3-variation2.xml b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/sample3-variation2.xml
deleted file mode 100644
index 48d4790..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/sample3-variation2.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<LinearLayout xmlns:customprefix="http://schemas.android.com/apk/res/android" customprefix:id="@+id/newlinear" customprefix:orientation="vertical" customprefix:layout_width="match_parent" customprefix:layout_height="match_parent">
-    <ImageView customprefix:id="@+id/android_logo" customprefix:layout_width="wrap_content" 
-         customprefix:layout_height="wrap_content" customprefix:src="@drawable/android_button" customprefix:focusable="false" customprefix:clickable="false" customprefix:layout_weight="1.0" />
-    <Button customprefix:text="Button" customprefix:id="@+id/button1" customprefix:layout_width="wrap_content" customprefix:layout_height="wrap_content"></Button>
-    <Button customprefix:text="Button" customprefix:id="@+id/button2" customprefix:layout_width="wrap_content" customprefix:layout_height="wrap_content"></Button>
-</LinearLayout>
-
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/sample3.info b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/sample3.info
deleted file mode 100644
index ef3324e..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/sample3.info
+++ /dev/null
@@ -1,5 +0,0 @@
-android.widget.LinearLayout [0,36,240,320]  <LinearLayout>
-    android.widget.Button [0,0,49,36]  <Button>
-    android.widget.ImageView [0,36,128,248]  <ImageView>
-    android.widget.Button [0,248,49,284]  <Button>
-
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/sample3.xml b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/sample3.xml
deleted file mode 100644
index ddd136c..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/sample3.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/newlinear" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent">
-    <Button android:text="Button" android:id="@+id/button1" android:layout_width="wrap_content" android:layout_height="wrap_content"></Button>
-    <ImageView android:id="@+id/android_logo" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/android_button" android:focusable="false" android:clickable="false" android:layout_weight="1.0" />
-    <Button android:text="Button" android:id="@+id/button2" android:layout_width="wrap_content" android:layout_height="wrap_content"></Button>
-</LinearLayout>
-
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/sample4-expected-changeLayout4.xml b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/sample4-expected-changeLayout4.xml
deleted file mode 100644
index 6e55529..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/sample4-expected-changeLayout4.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:id="@+id/RelativeLayout1"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    android:orientation="vertical" >
-
-    <CheckBox
-        android:id="@+id/checkBox1"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_alignParentLeft="true"
-        android:layout_alignParentTop="true"
-        android:text="CheckBox" >
-    </CheckBox>
-
-    <Button
-        android:id="@+id/button5"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_alignParentRight="true"
-        android:layout_below="@+id/checkBox1"
-        android:text="Button" >
-    </Button>
-
-</RelativeLayout>
\ No newline at end of file
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/sample4.info b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/sample4.info
deleted file mode 100644
index 605c177..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/sample4.info
+++ /dev/null
@@ -1,5 +0,0 @@
-android.widget.LinearLayout [0,36,240,320]  <LinearLayout>
-    android.widget.CheckBox [0,0,80,36]  <CheckBox>
-    android.widget.RelativeLayout [0,36,240,284]  <RelativeLayout>
-        android.widget.Button [191,0,240,36]  <Button>
-
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/sample4.xml b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/sample4.xml
deleted file mode 100644
index a56f272..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/sample4.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical">
-    <CheckBox android:text="CheckBox" android:id="@+id/checkBox1" android:layout_width="wrap_content" android:layout_height="wrap_content"></CheckBox>
-    <RelativeLayout android:layout_height="match_parent" android:id="@+id/relativeLayout1" android:layout_width="match_parent">
-        <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Button" android:id="@+id/button5" android:layout_alignParentRight="true"></Button>
-    </RelativeLayout>
-</LinearLayout>
-
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/sample5-expected-changeLayout5.xml b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/sample5-expected-changeLayout5.xml
deleted file mode 100644
index 06b236d..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/sample5-expected-changeLayout5.xml
+++ /dev/null
@@ -1,70 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:id="@+id/RelativeLayout1"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    android:orientation="vertical" >
-
-    <Button
-        android:id="@+id/button1"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_alignParentTop="true"
-        android:layout_centerHorizontal="true"
-        android:layout_gravity="center_horizontal"
-        android:text="Button" >
-    </Button>
-
-    <Button
-        android:id="@+id/button2"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_below="@+id/button1"
-        android:layout_centerHorizontal="true"
-        android:layout_gravity="center"
-        android:text="Button" >
-    </Button>
-
-    <Button
-        android:id="@+id/button3"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_alignParentRight="true"
-        android:layout_below="@+id/button2"
-        android:layout_gravity="right"
-        android:text="Button" >
-    </Button>
-
-    <Button
-        android:id="@+id/button4"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_alignParentLeft="true"
-        android:layout_below="@+id/button3"
-        android:layout_gravity="center"
-        android:layout_marginTop="70dp"
-        android:text="Button" >
-    </Button>
-
-    <Button
-        android:id="@+id/button5"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_alignBaseline="@+id/button4"
-        android:layout_alignTop="@+id/button4"
-        android:layout_gravity="center_vertical"
-        android:layout_toRightOf="@+id/button4"
-        android:text="Button" >
-    </Button>
-
-    <Button
-        android:id="@+id/button6"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_alignParentBottom="true"
-        android:layout_gravity="bottom"
-        android:layout_toRightOf="@+id/button5"
-        android:text="Button" >
-    </Button>
-
-</RelativeLayout>
\ No newline at end of file
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/sample5-expected-gridLayout5.xml b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/sample5-expected-gridLayout5.xml
deleted file mode 100644
index dd9f18c..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/sample5-expected-gridLayout5.xml
+++ /dev/null
@@ -1,51 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<GridLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:id="@+id/GridLayout1"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    android:columnCount="4"
-    android:orientation="horizontal" >
-
-    <Button
-        android:id="@+id/button1"
-        android:layout_columnSpan="2"
-        android:layout_gravity="center_horizontal"
-        android:text="Button" >
-    </Button>
-
-    <Button
-        android:id="@+id/button2"
-        android:layout_columnSpan="2"
-        android:layout_gravity="center"
-        android:layout_row="1"
-        android:text="Button" >
-    </Button>
-
-    <Button
-        android:id="@+id/button3"
-        android:layout_column="2"
-        android:layout_columnSpan="2"
-        android:layout_gravity="right"
-        android:text="Button" >
-    </Button>
-
-    <Button
-        android:id="@+id/button4"
-        android:layout_gravity="center"
-        android:text="Button" >
-    </Button>
-
-    <Button
-        android:id="@+id/button5"
-        android:layout_columnSpan="2"
-        android:layout_gravity="center_vertical"
-        android:text="Button" >
-    </Button>
-
-    <Button
-        android:id="@+id/button6"
-        android:layout_gravity="bottom"
-        android:text="Button" >
-    </Button>
-
-</GridLayout>
\ No newline at end of file
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/sample5.info b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/sample5.info
deleted file mode 100644
index fce532e..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/sample5.info
+++ /dev/null
@@ -1,9 +0,0 @@
-android.widget.LinearLayout [0,36,240,320]  <LinearLayout>
-    android.widget.Button [95,0,144,36]  <Button>
-    android.widget.Button [95,36,144,72]  <Button>
-    android.widget.Button [191,72,240,108]  <Button>
-    android.widget.LinearLayout [0,108,240,284]  <LinearLayout>
-        android.widget.Button [0,70,49,106]  <Button>
-        android.widget.Button [49,70,98,106]  <Button>
-        android.widget.Button [98,140,147,176]  <Button>
-
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/sample5.xml b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/sample5.xml
deleted file mode 100644
index afc1938..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/sample5.xml
+++ /dev/null
@@ -1,12 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical">
-    <Button android:text="Button" android:id="@+id/button1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal"></Button>
-    <Button android:text="Button" android:id="@+id/button2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center"></Button>
-    <Button android:text="Button" android:id="@+id/button3" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="right"></Button>
-    <LinearLayout android:id="@+id/linearLayout1" android:layout_width="match_parent" android:layout_height="match_parent">
-        <Button android:layout_height="wrap_content" android:layout_gravity="center" android:text="Button" android:id="@+id/button4" android:layout_width="wrap_content"></Button>
-        <Button android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:text="Button" android:id="@+id/button5" android:layout_width="wrap_content"></Button>
-        <Button android:layout_height="wrap_content" android:text="Button" android:id="@+id/button6" android:layout_width="wrap_content" android:layout_gravity="bottom"></Button>
-    </LinearLayout>
-</LinearLayout>
-
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/sample6-expected-changeLayout6.xml b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/sample6-expected-changeLayout6.xml
deleted file mode 100644
index a91ad1e..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/sample6-expected-changeLayout6.xml
+++ /dev/null
@@ -1,37 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:id="@+id/RelativeLayout1"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    android:baselineAligned="true" >
-
-    <Button
-        android:id="@+id/button1"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_alignBaseline="@+id/button2"
-        android:layout_alignParentLeft="true"
-        android:layout_alignParentTop="true"
-        android:text="Button" >
-    </Button>
-
-    <RadioButton
-        android:id="@+id/radioButton1"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_alignBaseline="@+id/button2"
-        android:layout_alignParentTop="true"
-        android:layout_toRightOf="@+id/button1"
-        android:text="RadioButton" >
-    </RadioButton>
-
-    <Button
-        android:id="@+id/button2"
-        android:layout_width="wrap_content"
-        android:layout_height="150dip"
-        android:layout_alignParentTop="true"
-        android:layout_toRightOf="@+id/radioButton1"
-        android:text="Button" >
-    </Button>
-
-</RelativeLayout>
\ No newline at end of file
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/sample6.info b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/sample6.info
deleted file mode 100644
index 7a7a44a..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/sample6.info
+++ /dev/null
@@ -1,5 +0,0 @@
-android.widget.LinearLayout [0,36,240,320]  <LinearLayout>
-    android.widget.Button [0,38,49,74]  <Button>
-    android.widget.RadioButton [49,36,143,72]  <RadioButton>
-    android.widget.Button [143,0,192,113]  <Button>
-
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/sample6.xml b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/sample6.xml
deleted file mode 100644
index 5cdc824..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/sample6.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/LinearLayout1" android:layout_width="match_parent" android:layout_height="match_parent" android:baselineAligned="true">
-    <Button android:text="Button" android:id="@+id/button1" android:layout_width="wrap_content" android:layout_height="wrap_content"></Button>
-    <RadioButton android:text="RadioButton" android:id="@+id/radioButton1" android:layout_width="wrap_content" android:layout_height="wrap_content"></RadioButton>
-    <Button android:layout_width="wrap_content" android:id="@+id/button2" android:text="Button" android:layout_height="150dip"></Button>
-</LinearLayout>
-
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/sample7-expected-extract6.diff b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/sample7-expected-extract6.diff
deleted file mode 100644
index 8a01599..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/sample7-expected-extract6.diff
+++ /dev/null
@@ -1,10 +0,0 @@
-@@ -4 +4
--     <LinearLayout android:layout_height="wrap_content" android:id="@+id/linearLayout4" android:layout_width="match_parent">
--         <LinearLayout android:layout_height="match_parent" android:id="@+id/linearLayout5" android:layout_width="wrap_content">
--             <LinearLayout android:layout_height="match_parent" android:id="@+id/linearLayout6" android:layout_width="wrap_content">
--                 <!-- Comment -->
--                 <Button android:text="Button" android:id="@+id/button6" android:layout_width="wrap_content" android:layout_height="wrap_content"></Button>
--             </LinearLayout>
--         </LinearLayout>
--     </LinearLayout>
-+     <include layout="@layout/newlayout6" android:id="@+id/linearLayout4_ref"  android:layout_width="match_parent" android:layout_height="wrap_content"/>
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/sample7-expected-extract7.diff b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/sample7-expected-extract7.diff
deleted file mode 100644
index 3de135d..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/sample7-expected-extract7.diff
+++ /dev/null
@@ -1,69 +0,0 @@
-@@ -2 +2
-- <LinearLayout android:id="@+id/LinearLayout2" xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical">
--     <Button android:text="FirstButton" android:id="@+id/button1" android:layout_width="wrap_content" android:layout_height="wrap_content"></Button>
--     <LinearLayout android:layout_height="wrap_content" android:id="@+id/linearLayout4" android:layout_width="match_parent">
--         <LinearLayout android:layout_height="match_parent" android:id="@+id/linearLayout5" android:layout_width="wrap_content">
--             <LinearLayout android:layout_height="match_parent" android:id="@+id/linearLayout6" android:layout_width="wrap_content">
--                 <!-- Comment -->
--                 <Button android:text="Button" android:id="@+id/button6" android:layout_width="wrap_content" android:layout_height="wrap_content"></Button>
--             </LinearLayout>
--         </LinearLayout>
--     </LinearLayout>
--     <LinearLayout android:layout_width="match_parent" android:id="@+id/linearLayout9" android:layout_height="wrap_content">
--         <Button android:text="SecondButton" android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/button2"></Button>
--         <Button android:text="ThirdButton" android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/button3"></Button>
--         <CheckBox android:id="@+id/checkBox1" android:text="CheckBox" android:layout_width="wrap_content" android:layout_height="wrap_content"></CheckBox>
-+ <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-+     android:id="@+id/LinearLayout2"
-+     android:layout_width="match_parent"
-+     android:layout_height="match_parent"
-+     android:orientation="vertical" >
-+
-+     <Button
-+         android:id="@+id/button1"
-+         android:layout_width="wrap_content"
-+         android:layout_height="wrap_content"
-+         android:text="FirstButton" >
-+     </Button>
-+
-+     <include
-+         android:id="@+id/linearLayout4_ref"
-+         android:layout_width="match_parent"
-+         android:layout_height="wrap_content"
-+         layout="@layout/newlayout6" />
-+
-+     <LinearLayout
-+         android:id="@+id/linearLayout9"
-+         android:layout_width="match_parent"
-+         android:layout_height="wrap_content" >
-+
-+         <Button
-+             android:id="@+id/button2"
-+             android:layout_width="wrap_content"
-+             android:layout_height="wrap_content"
-+             android:text="SecondButton" >
-+         </Button>
-+
-+         <Button
-+             android:id="@+id/button3"
-+             android:layout_width="wrap_content"
-+             android:layout_height="wrap_content"
-+             android:text="ThirdButton" >
-+         </Button>
-+
-+         <CheckBox
-+             android:id="@+id/checkBox1"
-+             android:layout_width="wrap_content"
-+             android:layout_height="wrap_content"
-+             android:text="CheckBox" >
-+         </CheckBox>
-@@ -17 +47
--     <Button android:layout_height="wrap_content" android:text="FourthButton" android:id="@+id/button4" android:layout_width="match_parent"></Button>
-+
-+     <Button
-+         android:id="@+id/button4"
-+         android:layout_width="match_parent"
-+         android:layout_height="wrap_content"
-+         android:text="FourthButton" >
-+     </Button>
-+
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/sample7.info b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/sample7.info
deleted file mode 100644
index 134234c..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/sample7.info
+++ /dev/null
@@ -1,11 +0,0 @@
-android.widget.LinearLayout [0,0,240,320] <LinearLayout>
-    android.widget.Button [0,0,101,36] <Button>
-    android.widget.LinearLayout [0,36,240,72] <LinearLayout>
-        android.widget.LinearLayout [0,0,73,36] <LinearLayout>
-            android.widget.LinearLayout [0,0,73,36] <LinearLayout>
-                android.widget.Button [0,0,73,36] <Button>
-    android.widget.LinearLayout [0,72,240,192] <LinearLayout>
-        android.widget.Button [0,0,117,36] <Button>
-        android.widget.Button [117,0,223,36] <Button>
-        android.widget.CheckBox [223,10,240,130] <CheckBox>
-    android.widget.Button [0,192,240,228] <Button>
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/sample7.xml b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/sample7.xml
deleted file mode 100644
index 0445bbf..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/sample7.xml
+++ /dev/null
@@ -1,19 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<LinearLayout android:id="@+id/LinearLayout2" xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical">
-    <Button android:text="FirstButton" android:id="@+id/button1" android:layout_width="wrap_content" android:layout_height="wrap_content"></Button>
-    <LinearLayout android:layout_height="wrap_content" android:id="@+id/linearLayout4" android:layout_width="match_parent">
-        <LinearLayout android:layout_height="match_parent" android:id="@+id/linearLayout5" android:layout_width="wrap_content">
-            <LinearLayout android:layout_height="match_parent" android:id="@+id/linearLayout6" android:layout_width="wrap_content">
-                <!-- Comment -->
-                <Button android:text="Button" android:id="@+id/button6" android:layout_width="wrap_content" android:layout_height="wrap_content"></Button>
-            </LinearLayout>
-        </LinearLayout>
-    </LinearLayout>
-    <LinearLayout android:layout_width="match_parent" android:id="@+id/linearLayout9" android:layout_height="wrap_content">
-        <Button android:text="SecondButton" android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/button2"></Button>
-        <Button android:text="ThirdButton" android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/button3"></Button>
-        <CheckBox android:id="@+id/checkBox1" android:text="CheckBox" android:layout_width="wrap_content" android:layout_height="wrap_content"></CheckBox>
-    </LinearLayout>
-    <Button android:layout_height="wrap_content" android:text="FourthButton" android:id="@+id/button4" android:layout_width="match_parent"></Button>
-</LinearLayout>
-
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/sample8-expected-extract6.diff b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/sample8-expected-extract6.diff
deleted file mode 100644
index ea3afc2..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/sample8-expected-extract6.diff
+++ /dev/null
@@ -1,15 +0,0 @@
-@@ -10 +10
--         <LinearLayout android:layout_height="wrap_content"
--             android:id="@+id/linearLayout4" android:layout_width="match_parent">
--             <LinearLayout android:layout_height="match_parent"
--                 android:layout_width="wrap_content" android:id="@+id/linearLayout5">
--                 <LinearLayout android:layout_height="match_parent"
--                     android:id="@+id/linearLayout6"
--                     android:layout_width="wrap_content">
--                     <Button android:text="Button" android:id="@+id/button6"
--                         android:layout_width="wrap_content"
--                         android:layout_height="wrap_content"></Button>
--                 </LinearLayout>
--             </LinearLayout>
--         </LinearLayout>
-+         <include layout="@layout/newlayout6" android:id="@+id/linearLayout4_ref"  android:layout_width="match_parent" android:layout_height="wrap_content"/>
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/sample8-expected-extract7.diff b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/sample8-expected-extract7.diff
deleted file mode 100644
index 8228b59..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/sample8-expected-extract7.diff
+++ /dev/null
@@ -1,85 +0,0 @@
-@@ -2 +2
-- <LinearLayout android:id="@+id/LinearLayout2"
--     xmlns:android="http://schemas.android.com/apk/res/android"
--     android:layout_width="match_parent" android:layout_height="match_parent"
--     android:orientation="vertical">
--     <Button android:text="FirstButton" android:id="@+id/button1"
--         android:layout_width="wrap_content" android:layout_height="wrap_content"></Button>
--     <FrameLayout android:id="@+id/outer"
--         android:layout_width="match_parent" android:layout_height="wrap_content">
--         <LinearLayout android:layout_height="wrap_content"
--             android:id="@+id/linearLayout4" android:layout_width="match_parent">
--             <LinearLayout android:layout_height="match_parent"
--                 android:layout_width="wrap_content" android:id="@+id/linearLayout5">
--                 <LinearLayout android:layout_height="match_parent"
--                     android:id="@+id/linearLayout6"
--                     android:layout_width="wrap_content">
--                     <Button android:text="Button" android:id="@+id/button6"
--                         android:layout_width="wrap_content"
--                         android:layout_height="wrap_content"></Button>
--                 </LinearLayout>
--             </LinearLayout>
--         </LinearLayout>
-+ <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-+     android:id="@+id/LinearLayout2"
-+     android:layout_width="match_parent"
-+     android:layout_height="match_parent"
-+     android:orientation="vertical" >
-+
-+     <Button
-+         android:id="@+id/button1"
-+         android:layout_width="wrap_content"
-+         android:layout_height="wrap_content"
-+         android:text="FirstButton" >
-+     </Button>
-+
-+     <FrameLayout
-+         android:id="@+id/outer"
-+         android:layout_width="match_parent"
-+         android:layout_height="wrap_content" >
-+
-+         <include
-+             android:id="@+id/linearLayout4_ref"
-+             android:layout_width="match_parent"
-+             android:layout_height="wrap_content"
-+             layout="@layout/newlayout6" />
-@@ -24 +26
--     <FrameLayout android:id="@+id/outer"
--         android:layout_width="match_parent" android:layout_height="wrap_content">
--         <LinearLayout android:layout_height="wrap_content"
--             android:id="@+id/linearLayout4" android:layout_width="match_parent">
--             <LinearLayout android:layout_height="match_parent"
--                 android:layout_width="wrap_content" android:id="@+id/linearLayout5">
--                 <LinearLayout android:layout_height="match_parent"
-+
-+     <FrameLayout
-+         android:id="@+id/outer"
-+         android:layout_width="match_parent"
-+         android:layout_height="wrap_content" >
-+
-+         <LinearLayout
-+             android:id="@+id/linearLayout4"
-+             android:layout_width="match_parent"
-+             android:layout_height="wrap_content" >
-+
-+             <LinearLayout
-+                 android:id="@+id/linearLayout5"
-+                 android:layout_width="wrap_content"
-+                 android:layout_height="match_parent" >
-+
-+                 <LinearLayout
-@@ -32 +44
--                     android:layout_width="wrap_content">
--                     <Button android:text="Button" android:id="@+id/button6"
-+                     android:layout_width="wrap_content"
-+                     android:layout_height="match_parent" >
-+
-+                     <Button
-+                         android:id="@+id/button6"
-@@ -35 +50
--                         android:layout_height="wrap_content"></Button>
-+                         android:layout_height="wrap_content"
-+                         android:text="Button" >
-+                     </Button>
-@@ -40 +57
-+
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/sample8.info b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/sample8.info
deleted file mode 100644
index ca294ba..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/sample8.info
+++ /dev/null
@@ -1,12 +0,0 @@
-android.widget.LinearLayout [0,0,240,320] <LinearLayout>
-    android.widget.Button [0,0,101,36] <Button>
-    android.widget.FrameLayout [0,36,240,72] <FrameLayout>
-        android.widget.LinearLayout [0,0,240,36] <LinearLayout>
-            android.widget.LinearLayout [0,0,73,36] <LinearLayout>
-                android.widget.LinearLayout [0,0,73,36] <LinearLayout>
-                    android.widget.Button [0,0,73,36] <Button>
-    android.widget.FrameLayout [0,72,240,108] <FrameLayout>
-        android.widget.LinearLayout [0,0,240,36] <LinearLayout>
-            android.widget.LinearLayout [0,0,73,36] <LinearLayout>
-                android.widget.LinearLayout [0,0,73,36] <LinearLayout>
-                    android.widget.Button [0,0,73,36] <Button>
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/sample8.xml b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/sample8.xml
deleted file mode 100644
index c798469..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/sample8.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<LinearLayout android:id="@+id/LinearLayout2"
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="match_parent" android:layout_height="match_parent"
-    android:orientation="vertical">
-    <Button android:text="FirstButton" android:id="@+id/button1"
-        android:layout_width="wrap_content" android:layout_height="wrap_content"></Button>
-    <FrameLayout android:id="@+id/outer"
-        android:layout_width="match_parent" android:layout_height="wrap_content">
-        <LinearLayout android:layout_height="wrap_content"
-            android:id="@+id/linearLayout4" android:layout_width="match_parent">
-            <LinearLayout android:layout_height="match_parent"
-                android:layout_width="wrap_content" android:id="@+id/linearLayout5">
-                <LinearLayout android:layout_height="match_parent"
-                    android:id="@+id/linearLayout6"
-                    android:layout_width="wrap_content">
-                    <Button android:text="Button" android:id="@+id/button6"
-                        android:layout_width="wrap_content"
-                        android:layout_height="wrap_content"></Button>
-                </LinearLayout>
-            </LinearLayout>
-        </LinearLayout>
-    </FrameLayout>
-    <FrameLayout android:id="@+id/outer"
-        android:layout_width="match_parent" android:layout_height="wrap_content">
-        <LinearLayout android:layout_height="wrap_content"
-            android:id="@+id/linearLayout4" android:layout_width="match_parent">
-            <LinearLayout android:layout_height="match_parent"
-                android:layout_width="wrap_content" android:id="@+id/linearLayout5">
-                <LinearLayout android:layout_height="match_parent"
-                    android:id="@+id/linearLayout6"
-                    android:layout_width="wrap_content">
-                    <Button android:text="Button" android:id="@+id/button6"
-                        android:layout_width="wrap_content"
-                        android:layout_height="wrap_content"></Button>
-                </LinearLayout>
-            </LinearLayout>
-        </LinearLayout>
-    </FrameLayout>
-</LinearLayout>
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/sample9-expected-convertToGrid.xml b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/sample9-expected-convertToGrid.xml
deleted file mode 100644
index 03ffac7..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/sample9-expected-convertToGrid.xml
+++ /dev/null
@@ -1,37 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<GridLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:id="@+id/GridLayout1"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    android:columnCount="3"
-    android:orientation="horizontal" >
-
-    <Button
-        android:id="@+id/button1"
-        android:layout_gravity="left"
-        android:text="Button" />
-
-    <RadioButton
-        android:id="@+id/radioButton1"
-        android:layout_width="150dp"
-        android:layout_column="0"
-        android:layout_gravity="left"
-        android:text="RadioButton" />
-
-    <RadioButton
-        android:id="@+id/radioButton2"
-        android:layout_gravity="left"
-        android:text="RadioButton" />
-
-    <CheckBox
-        android:id="@+id/checkBox1"
-        android:layout_column="0"
-        android:layout_gravity="left"
-        android:text="CheckBox" />
-
-    <Space
-        android:layout_column="2"
-        android:layout_gravity="fill_vertical"
-        android:layout_row="3" />
-
-</GridLayout>
\ No newline at end of file
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/sample9.info b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/sample9.info
deleted file mode 100644
index 3085ff0..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/sample9.info
+++ /dev/null
@@ -1,6 +0,0 @@
-android.widget.LinearLayout [0,73,320,480] <LinearLayout>
-    android.widget.Button [0,0,79,48] <Button>
-    android.widget.LinearLayout [0,48,320,86] <LinearLayout>
-        android.widget.RadioButton [0,0,150,38] <RadioButton>
-        android.widget.RadioButton [150,0,273,38] <RadioButton>
-    android.widget.CheckBox [0,86,107,124] <CheckBox>
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/sample9.xml b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/sample9.xml
deleted file mode 100644
index 13068e7..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/sample9.xml
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:id="@+id/LinearLayout1"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    android:orientation="vertical" >
-
-    <Button
-        android:id="@+id/button1"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:text="Button" />
-
-    <LinearLayout
-        android:id="@+id/linearLayout2"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content" >
-
-        <RadioButton
-            android:id="@+id/radioButton1"
-            android:layout_width="150dp"
-            android:layout_height="wrap_content"
-            android:text="RadioButton" />
-
-        <RadioButton
-            android:id="@+id/radioButton2"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:text="RadioButton" />
-
-    </LinearLayout>
-
-    <CheckBox
-        android:id="@+id/checkBox1"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:text="CheckBox" />
-
-</LinearLayout>
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/unwrap-expected-unwrap1.xml b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/unwrap-expected-unwrap1.xml
deleted file mode 100644
index e5aba11..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/unwrap-expected-unwrap1.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:id="@+id/linear"
-    android:layout_width="fill_parent"
-    android:layout_height="wrap_content"
-    android:orientation="vertical" >
-
-    <TextView
-        android:id="@+id/text"
-        android:layout_width="fill_parent"
-        android:layout_height="wrap_content"
-        android:text="@string/hello" />
-
-    <Button
-        android:id="@+id/button"
-        android:layout_width="fill_parent"
-        android:layout_height="wrap_content"
-        android:text="@string/hello" />
-
-</LinearLayout>
\ No newline at end of file
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/unwrap-expected-unwrap2.xml b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/unwrap-expected-unwrap2.xml
deleted file mode 100644
index e5aba11..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/unwrap-expected-unwrap2.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:id="@+id/linear"
-    android:layout_width="fill_parent"
-    android:layout_height="wrap_content"
-    android:orientation="vertical" >
-
-    <TextView
-        android:id="@+id/text"
-        android:layout_width="fill_parent"
-        android:layout_height="wrap_content"
-        android:text="@string/hello" />
-
-    <Button
-        android:id="@+id/button"
-        android:layout_width="fill_parent"
-        android:layout_height="wrap_content"
-        android:text="@string/hello" />
-
-</LinearLayout>
\ No newline at end of file
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/unwrap-expected-unwrap3.xml b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/unwrap-expected-unwrap3.xml
deleted file mode 100644
index 348b2bc..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/unwrap-expected-unwrap3.xml
+++ /dev/null
@@ -1,19 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:id="@+id/frame"
-    android:layout_width="fill_parent"
-    android:layout_height="wrap_content" >
-
-    <TextView
-        android:id="@+id/text"
-        android:layout_width="fill_parent"
-        android:layout_height="wrap_content"
-        android:text="@string/hello" />
-
-    <Button
-        android:id="@+id/button"
-        android:layout_width="fill_parent"
-        android:layout_height="wrap_content"
-        android:text="@string/hello" />
-
-</FrameLayout>
\ No newline at end of file
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/unwrap.info b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/unwrap.info
deleted file mode 100644
index c5461b3..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/unwrap.info
+++ /dev/null
@@ -1,4 +0,0 @@
-android.widget.LinearLayout [0,56,1280,104] <LinearLayout>
-    android.widget.FrameLayout [0,0,1280,48] <FrameLayout>
-        android.widget.TextView [0,0,1280,17] <TextView>
-        android.widget.Button [0,0,1280,48] <Button>
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/unwrap.xml b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/unwrap.xml
deleted file mode 100644
index db94dc3..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/unwrap.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:id="@+id/linear"
-    android:layout_width="fill_parent"
-    android:layout_height="wrap_content"
-    android:orientation="vertical" >
-
-    <FrameLayout
-        android:id="@+id/frame"
-        android:layout_width="fill_parent"
-        android:layout_height="wrap_content" >
-
-        <TextView
-            android:id="@+id/text"
-            android:layout_width="fill_parent"
-            android:layout_height="wrap_content"
-            android:text="@string/hello" />
-
-        <Button
-            android:id="@+id/button"
-            android:layout_width="fill_parent"
-            android:layout_height="wrap_content"
-            android:text="@string/hello" />
-    </FrameLayout>
-
-</LinearLayout>
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/manifest/ManifestInfoTest.java b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/manifest/ManifestInfoTest.java
deleted file mode 100644
index 43f9d68..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/manifest/ManifestInfoTest.java
+++ /dev/null
@@ -1,424 +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.eclipse.adt.internal.editors.manifest;
-
-import static com.android.resources.ScreenSize.LARGE;
-import static com.android.resources.ScreenSize.NORMAL;
-import static com.android.resources.ScreenSize.XLARGE;
-
-import com.android.annotations.NonNull;
-import com.android.ide.eclipse.adt.internal.editors.layout.refactoring.AdtProjectTest;
-import com.android.ide.eclipse.adt.internal.editors.manifest.ManifestInfo.ActivityAttributes;
-import com.android.ide.eclipse.adt.internal.resources.ResourceHelper;
-import com.android.sdklib.AndroidVersion;
-import com.android.sdklib.BuildToolInfo;
-import com.android.sdklib.IAndroidTarget;
-import com.android.sdklib.ISystemImage;
-import com.android.sdklib.repository.descriptors.IdDisplay;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.runtime.NullProgressMonitor;
-
-import java.io.ByteArrayInputStream;
-import java.io.File;
-import java.io.InputStream;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-
-@SuppressWarnings("javadoc")
-public class ManifestInfoTest extends AdtProjectTest {
-    @Override
-    protected boolean testCaseNeedsUniqueProject() {
-        return true;
-    }
-
-    public void testGetActivityThemes1() throws Exception {
-        ManifestInfo info = getManifestInfo(
-                "<manifest xmlns:android='http://schemas.android.com/apk/res/android'\n" +
-                "    package='com.android.unittest'>\n" +
-                "    <uses-sdk android:minSdkVersion='3' android:targetSdkVersion='4'/>\n" +
-                "</manifest>\n");
-        Map<String, ActivityAttributes> map = info.getActivityAttributesMap();
-        assertEquals(map.toString(), 0, map.size());
-        assertEquals("com.android.unittest", info.getPackage());
-        assertEquals("Theme", ResourceHelper.styleToTheme(info.getDefaultTheme(null, NORMAL)));
-        assertEquals("@android:style/Theme", info.getDefaultTheme(null, null));
-        assertEquals("Theme", ResourceHelper.styleToTheme(info.getDefaultTheme(null, XLARGE)));
-    }
-
-    public void testGetActivityThemes2() throws Exception {
-        ManifestInfo info = getManifestInfo(
-                "<manifest xmlns:android='http://schemas.android.com/apk/res/android'\n" +
-                "    package='com.android.unittest'>\n" +
-                "    <uses-sdk android:minSdkVersion='3' android:targetSdkVersion='11'/>\n" +
-                "</manifest>\n");
-        Map<String, ActivityAttributes> map = info.getActivityAttributesMap();
-        assertEquals(map.toString(), 0, map.size());
-        assertEquals("com.android.unittest", info.getPackage());
-        assertEquals("Theme.Holo", ResourceHelper.styleToTheme(info.getDefaultTheme(null,
-                XLARGE)));
-        assertEquals("Theme", ResourceHelper.styleToTheme(info.getDefaultTheme(null, LARGE)));
-    }
-
-    public void testGetActivityThemes3() throws Exception {
-        ManifestInfo info = getManifestInfo(
-                "<manifest xmlns:android='http://schemas.android.com/apk/res/android'\n" +
-                "    package='com.android.unittest'>\n" +
-                "    <uses-sdk android:minSdkVersion='11'/>\n" +
-                "</manifest>\n");
-        Map<String, ActivityAttributes> map = info.getActivityAttributesMap();
-        assertEquals(map.toString(), 0, map.size());
-        assertEquals("com.android.unittest", info.getPackage());
-        assertEquals("Theme.Holo", ResourceHelper.styleToTheme(info.getDefaultTheme(null,
-                XLARGE)));
-        assertEquals("Theme", ResourceHelper.styleToTheme(info.getDefaultTheme(null, NORMAL)));
-    }
-
-    public void testGetActivityThemes4() throws Exception {
-        ManifestInfo info = getManifestInfo(
-                "<manifest xmlns:android='http://schemas.android.com/apk/res/android'\n" +
-                "    package='com.android.unittest'>\n" +
-                "    <application\n" +
-                "        android:label='@string/app_name'\n" +
-                "        android:name='.app.TestApp' android:icon='@drawable/app_icon'>\n" +
-                "\n" +
-                "        <activity\n" +
-                "            android:name='.prefs.PrefsActivity'\n" +
-                "            android:label='@string/prefs_title' />\n" +
-                "\n" +
-                "        <activity\n" +
-                "            android:name='.app.IntroActivity'\n" +
-                "            android:label='@string/intro_title'\n" +
-                "            android:theme='@android:style/Theme.Dialog' />\n" +
-                "    </application>\n" +
-                "    <uses-sdk android:minSdkVersion='3' android:targetSdkVersion='4'/>\n" +
-                "</manifest>\n" +
-                ""
-                );
-        assertEquals("com.android.unittest", info.getPackage());
-        assertEquals("Theme", ResourceHelper.styleToTheme(info.getDefaultTheme(null, XLARGE)));
-
-        Map<String, ActivityAttributes> map = info.getActivityAttributesMap();
-        assertEquals(map.toString(), 2, map.size());
-        assertNull(map.get("com.android.unittest.prefs.PrefsActivity").getTheme());
-        assertEquals("@android:style/Theme.Dialog",
-                map.get("com.android.unittest.app.IntroActivity").getTheme());
-    }
-
-    public void testGetActivityThemes5() throws Exception {
-        ManifestInfo info = getManifestInfo(
-                "<manifest xmlns:android='http://schemas.android.com/apk/res/android'\n" +
-                "    package='com.android.unittest'>\n" +
-                "    <application\n" +
-                "        android:label='@string/app_name'\n" +
-                "        android:theme='@style/NoBackground'\n" +
-                "        android:name='.app.TestApp' android:icon='@drawable/app_icon'>\n" +
-                "\n" +
-                "        <activity\n" +
-                "            android:name='.prefs.PrefsActivity'\n" +
-                "            android:label='@string/prefs_title' />\n" +
-                "\n" +
-                "        <activity\n" +
-                "            android:name='.app.IntroActivity'\n" +
-                "            android:label='@string/intro_title'\n" +
-                "            android:theme='@android:style/Theme.Dialog' />\n" +
-                "    </application>\n" +
-                "    <uses-sdk android:minSdkVersion='3' android:targetSdkVersion='4'/>\n" +
-                "</manifest>\n" +
-                ""
-                );
-
-        assertEquals("@style/NoBackground", info.getDefaultTheme(null, XLARGE));
-        assertEquals("@style/NoBackground", info.getDefaultTheme(null, NORMAL));
-        assertEquals("NoBackground", ResourceHelper.styleToTheme(info.getDefaultTheme(null,
-                NORMAL)));
-
-        Map<String, ActivityAttributes> map = info.getActivityAttributesMap();
-        assertEquals(map.toString(), 2, map.size());
-        assertNull(map.get("com.android.unittest.prefs.PrefsActivity").getTheme());
-        assertEquals("@android:style/Theme.Dialog",
-                map.get("com.android.unittest.app.IntroActivity").getTheme());
-    }
-
-    public void testGetActivityThemes6() throws Exception {
-        // Ensures that when the *rendering* target is less than version 11, we don't
-        // use Holo even though the manifest SDK version calls for it.
-        ManifestInfo info = getManifestInfo(
-                "<manifest xmlns:android='http://schemas.android.com/apk/res/android'\n" +
-                "    package='com.android.unittest'>\n" +
-                "    <uses-sdk android:minSdkVersion='3' android:targetSdkVersion='11'/>\n" +
-                "</manifest>\n");
-        Map<String, ActivityAttributes> map = info.getActivityAttributesMap();
-        assertEquals(map.toString(), 0, map.size());
-        assertEquals("com.android.unittest", info.getPackage());
-        assertEquals("Theme.Holo", ResourceHelper.styleToTheme(info.getDefaultTheme(null,
-                XLARGE)));
-
-        // Here's the check
-        IAndroidTarget olderVersion = new TestAndroidTarget(4);
-        assertEquals("Theme", ResourceHelper.styleToTheme(info.getDefaultTheme(olderVersion,
-                XLARGE)));
-
-    }
-
-    public void testGetApplicationLabelAndIcon() throws Exception {
-        ManifestInfo info = getManifestInfo(
-                "<manifest xmlns:android='http://schemas.android.com/apk/res/android'\n" +
-                "    package='com.android.unittest'>\n" +
-                "    <application android:icon=\"@drawable/icon\"\n" +
-                "                 android:label=\"@string/app_name\">\n" +
-                "    </application>\n" +
-                "" +
-                "</manifest>\n");
-        Map<String, ActivityAttributes> map = info.getActivityAttributesMap();
-        assertEquals(map.toString(), 0, map.size());
-        assertEquals("com.android.unittest", info.getPackage());
-
-        assertEquals("Theme", ResourceHelper.styleToTheme(info.getDefaultTheme(null, NORMAL)));
-        assertEquals("@drawable/icon", info.getApplicationIcon());
-        assertEquals("@string/app_name", info.getApplicationLabel());
-    }
-
-    public void testGetApplicationNoLabelOrIcon() throws Exception {
-        ManifestInfo info = getManifestInfo(
-                "<manifest xmlns:android='http://schemas.android.com/apk/res/android'\n" +
-                "    package='com.android.unittest'>\n" +
-                "    <application>\n" +
-                "    </application>\n" +
-                "" +
-                "</manifest>\n");
-        Map<String, ActivityAttributes> map = info.getActivityAttributesMap();
-        assertEquals(map.toString(), 0, map.size());
-        assertEquals("com.android.unittest", info.getPackage());
-
-        assertEquals("Theme", ResourceHelper.styleToTheme(info.getDefaultTheme(null, NORMAL)));
-        assertNull(info.getApplicationIcon());
-        assertNull(info.getApplicationLabel());
-    }
-
-    private ManifestInfo getManifestInfo(String manifestContents) throws Exception {
-        InputStream bstream = new ByteArrayInputStream(
-                manifestContents.getBytes("UTF-8")); //$NON-NLS-1$
-
-        IFile file = getProject().getFile("AndroidManifest.xml");
-        if (file.exists()) {
-            file.setContents(bstream, IFile.FORCE, new NullProgressMonitor());
-        } else {
-            file.create(bstream, false /* force */, new NullProgressMonitor());
-        }
-        ManifestInfo info = ManifestInfo.get(getProject());
-        info.clear();
-        return info;
-    }
-
-    public void testGetMinSdkVersionName() throws Exception {
-        ManifestInfo info;
-
-        info = getManifestInfo(
-                "<manifest xmlns:android='http://schemas.android.com/apk/res/android'\n" +
-                "    package='com.android.unittest'>\n" +
-                "    <uses-sdk android:minSdkVersion='3' android:targetSdkVersion='4'/>\n" +
-                "</manifest>\n");
-        assertEquals(3, info.getMinSdkVersion());
-        assertEquals("3", info.getMinSdkName());
-        assertEquals(4, info.getTargetSdkVersion());
-        assertNull(info.getMinSdkCodeName());
-
-        info = getManifestInfo(
-                "<manifest xmlns:android='http://schemas.android.com/apk/res/android'\n" +
-                "    package='com.android.unittest'>\n" +
-                "    <uses-sdk android:targetSdkVersion='4'/>\n" +
-                "</manifest>\n");
-        assertEquals("1", info.getMinSdkName());
-        assertEquals(1, info.getMinSdkVersion());
-        assertEquals(4, info.getTargetSdkVersion());
-        assertNull(info.getMinSdkCodeName());
-
-        info = getManifestInfo(
-                "<manifest xmlns:android='http://schemas.android.com/apk/res/android'\n" +
-                "    package='com.android.unittest'>\n" +
-                "    <uses-sdk android:minSdkVersion='JellyBean' />\n" +
-                "</manifest>\n");
-        assertEquals("JellyBean", info.getMinSdkName());
-        assertEquals("JellyBean", info.getMinSdkCodeName());
-    }
-
-    private static class TestAndroidTarget implements IAndroidTarget {
-        private final int mApiLevel;
-
-        public TestAndroidTarget(int apiLevel) {
-            mApiLevel = apiLevel;
-        }
-
-        @Override
-        public boolean canRunOn(IAndroidTarget target) {
-            return false;
-        }
-
-        @Override
-        public String getClasspathName() {
-            return null;
-        }
-
-        @Override
-        public File getDefaultSkin() {
-            return null;
-        }
-
-        @Override
-        public String getDescription() {
-            return null;
-        }
-
-        @Override
-        public String getFullName() {
-            return null;
-        }
-
-        @Override
-        public ISystemImage getSystemImage(IdDisplay tag, String abiType) {
-            return null;
-        }
-
-        @Override
-        public ISystemImage[] getSystemImages() {
-            return new ISystemImage[0];
-        }
-
-        @Override
-        public String getLocation() {
-            return null;
-        }
-
-        @Override
-        public String getName() {
-            return null;
-        }
-
-        @Override
-        public IOptionalLibrary[] getOptionalLibraries() {
-            return null;
-        }
-
-        @Override
-        public IAndroidTarget getParent() {
-            return null;
-        }
-
-        @Override
-        public String getPath(int pathId) {
-            return null;
-        }
-
-        @Override
-        public File getFile(int pathId) {
-          return null;
-        }
-
-
-        @Override
-        public String[] getPlatformLibraries() {
-            return null;
-        }
-
-        @Override
-        public Map<String, String> getProperties() {
-            return null;
-        }
-
-        @Override
-        public String getProperty(String name) {
-            return null;
-        }
-
-        @Override
-        public Integer getProperty(String name, Integer defaultValue) {
-            return null;
-        }
-
-        @Override
-        public Boolean getProperty(String name, Boolean defaultValue) {
-            return null;
-        }
-
-        @Override
-        public int getRevision() {
-            return 0;
-        }
-
-        @Override
-        public File[] getSkins() {
-            return null;
-        }
-
-        @Override
-        public int getUsbVendorId() {
-            return 0;
-        }
-
-        @Override
-        public String getVendor() {
-            return null;
-        }
-
-        @Override
-        public AndroidVersion getVersion() {
-            return new AndroidVersion(mApiLevel, null);
-        }
-
-        @Override
-        public String getVersionName() {
-            return null;
-        }
-
-        @Override
-        public String hashString() {
-            return null;
-        }
-
-        @Override
-        public boolean isPlatform() {
-            return false;
-        }
-
-        @Override
-        public int compareTo(IAndroidTarget o) {
-            return 0;
-        }
-
-        @Override
-        public boolean hasRenderingLibrary() {
-            return false;
-        }
-
-        @Override
-        public String getShortClasspathName() {
-            return null;
-        }
-
-        @Override
-        @NonNull
-        public List<String> getBootClasspath() {
-            return new ArrayList<String>();
-        }
-
-        @Override
-        public BuildToolInfo getBuildToolInfo() {
-            return null;
-        }
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/launch/JUnitLaunchConfigDelegateTest.java b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/launch/JUnitLaunchConfigDelegateTest.java
deleted file mode 100644
index 58f686a..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/launch/JUnitLaunchConfigDelegateTest.java
+++ /dev/null
@@ -1,114 +0,0 @@
-/*
- * Copyright (C) 2009 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.launch;
-
-import com.android.ide.eclipse.adt.internal.launch.JUnitLaunchConfigDelegate;
-
-import java.io.IOException;
-import java.util.Arrays;
-import junit.framework.TestCase;
-
-public class JUnitLaunchConfigDelegateTest extends TestCase {
-
-    public void testAbleToFetchJunitJar() throws IOException {
-        assertTrue(JUnitLaunchConfigDelegate.getJunitJarLocation().endsWith("junit.jar"));
-    }
-
-    public void testFixBootpathExtWithAndroidJar() {
-        String[][] testArray = {
-                null,
-                {},
-                { "android.jar"},
-                null,
-                { "some_other_jar.jar" },
-        };
-
-        String[][] expectedArray = {
-                null,
-                {},
-                null,
-                null,
-                { "some_other_jar.jar" },
-        };
-
-       assertEqualsArrays(expectedArray, JUnitLaunchConfigDelegate.fixBootpathExt(testArray));
-    }
-
-    public void testFixBootpathExtWithNoAndroidJar() {
-        String[][] testArray = {
-                null,
-                { "somejar.jar"},
-                null,
-        };
-
-        String[][] expectedArray = {
-                null,
-                { "somejar.jar"},
-                null,
-        };
-
-        assertEqualsArrays(expectedArray, JUnitLaunchConfigDelegate.fixBootpathExt(testArray));
-    }
-
-    public void testFixClasspathWithJunitJar() throws IOException {
-        String[] testArray = {
-                JUnitLaunchConfigDelegate.getJunitJarLocation(),
-        };
-
-        String[] expectedArray = {
-                JUnitLaunchConfigDelegate.getJunitJarLocation(),
-        };
-
-        assertEqualsArrays(expectedArray,
-                JUnitLaunchConfigDelegate.fixClasspath(testArray, "test"));
-    }
-
-    public void testFixClasspathWithoutJunitJar() throws IOException {
-        String[] testArray = {
-                "random.jar",
-        };
-
-        String[] expectedArray = {
-                "random.jar",
-                JUnitLaunchConfigDelegate.getJunitJarLocation(),
-        };
-
-        assertEqualsArrays(expectedArray,
-                JUnitLaunchConfigDelegate.fixClasspath(testArray, "test"));
-    }
-
-
-    public void testFixClasspathWithNoJars() throws IOException {
-        String[] testArray = {
-        };
-
-        String[] expectedArray = {
-                JUnitLaunchConfigDelegate.getJunitJarLocation(),
-        };
-
-        assertEqualsArrays(expectedArray,
-                JUnitLaunchConfigDelegate.fixClasspath(testArray, "test"));
-    }
-
-    private void assertEqualsArrays(String[][] a1, String[][] a2) {
-        assertTrue(Arrays.deepEquals(a1, a2));
-    }
-
-    private void assertEqualsArrays(String[] a1, String[] a2) {
-        assertTrue(Arrays.deepEquals(a1, a2));
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/lint/ProjectLintConfigurationTest.java b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/lint/ProjectLintConfigurationTest.java
deleted file mode 100644
index f8ea8c4..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/lint/ProjectLintConfigurationTest.java
+++ /dev/null
@@ -1,218 +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.eclipse.adt.internal.lint;
-
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-import com.android.ide.eclipse.adt.internal.editors.layout.refactoring.AdtProjectTest;
-import com.android.tools.lint.checks.DuplicateIdDetector;
-import com.android.tools.lint.checks.UnusedResourceDetector;
-import com.android.tools.lint.client.api.Configuration;
-import com.android.tools.lint.client.api.JavaParser;
-import com.android.tools.lint.client.api.LintClient;
-import com.android.tools.lint.client.api.XmlParser;
-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.android.tools.lint.detector.api.TextFormat;
-
-import org.eclipse.core.resources.IProject;
-
-import java.io.File;
-
-@SuppressWarnings("javadoc")
-public class ProjectLintConfigurationTest extends AdtProjectTest {
-    public void testBasic() {
-        Configuration parent = null;
-        LintClient client = new TestClient();
-
-        File dir = getTargetDir();
-        if (!dir.exists()) {
-            boolean ok = dir.mkdirs();
-            assertTrue(dir.getPath(), ok);
-        }
-        Project project = client.getProject(dir, dir);
-
-        ProjectLintConfiguration config =
-                new ProjectLintConfiguration(client, project, parent, false /*fatalOnly*/);
-
-        Issue usuallyEnabledIssue = DuplicateIdDetector.WITHIN_LAYOUT;
-        Issue usuallyDisabledIssue = UnusedResourceDetector.ISSUE_IDS;
-
-        assertTrue(config.isEnabled(usuallyEnabledIssue));
-        assertFalse(config.isEnabled(usuallyDisabledIssue));
-
-        config.setSeverity(usuallyEnabledIssue, Severity.IGNORE);
-        config.setSeverity(usuallyDisabledIssue, Severity.ERROR);
-        assertFalse(config.isEnabled(usuallyEnabledIssue));
-        assertTrue(config.isEnabled(usuallyDisabledIssue));
-
-        // Make a NEW config object to ensure the state is persisted properly, not just
-        // kept on the config object!
-        config = new ProjectLintConfiguration(client, project, parent, false /*fatalOnly*/);
-        assertFalse(config.isEnabled(usuallyEnabledIssue));
-        assertTrue(config.isEnabled(usuallyDisabledIssue));
-    }
-
-    public void testInheritance() {
-        Configuration parent = null;
-        LintClient client = new TestClient();
-
-        File dir = getTargetDir();
-        assertTrue(dir.mkdirs());
-        Project project = client.getProject(dir, dir);
-
-        File otherDir = new File(dir, "otherConfig");
-        assertTrue(otherDir.mkdir());
-        Project otherProject = client.getProject(otherDir, otherDir);
-
-        ProjectLintConfiguration otherConfig =
-                new ProjectLintConfiguration(client, otherProject, parent, false);
-
-        ProjectLintConfiguration config =
-                new ProjectLintConfiguration(client, project, otherConfig, false);
-
-        Issue usuallyEnabledIssue = DuplicateIdDetector.WITHIN_LAYOUT;
-        Issue usuallyDisabledIssue = UnusedResourceDetector.ISSUE_IDS;
-
-        assertTrue(config.isEnabled(usuallyEnabledIssue));
-        assertFalse(config.isEnabled(usuallyDisabledIssue));
-
-        otherConfig.setSeverity(usuallyEnabledIssue, Severity.IGNORE);
-        otherConfig.setSeverity(usuallyDisabledIssue, Severity.ERROR);
-
-        // Ensure inheritance works
-        assertFalse(config.isEnabled(usuallyEnabledIssue));
-        assertTrue(config.isEnabled(usuallyDisabledIssue));
-
-        // Revert
-        otherConfig.setSeverity(usuallyEnabledIssue, Severity.ERROR);
-        otherConfig.setSeverity(usuallyDisabledIssue, Severity.IGNORE);
-        assertTrue(config.isEnabled(usuallyEnabledIssue));
-        assertFalse(config.isEnabled(usuallyDisabledIssue));
-
-        // Now override in child
-        config.setSeverity(usuallyEnabledIssue, Severity.ERROR);
-        config.setSeverity(usuallyDisabledIssue, Severity.IGNORE);
-        assertTrue(config.isEnabled(usuallyEnabledIssue));
-        assertFalse(config.isEnabled(usuallyDisabledIssue));
-
-        // Now change in parent: no change in child
-        otherConfig.setSeverity(usuallyEnabledIssue, Severity.IGNORE);
-        otherConfig.setSeverity(usuallyDisabledIssue, Severity.ERROR);
-        assertTrue(config.isEnabled(usuallyEnabledIssue));
-        assertFalse(config.isEnabled(usuallyDisabledIssue));
-        assertFalse(otherConfig.isEnabled(usuallyEnabledIssue));
-        assertTrue(otherConfig.isEnabled(usuallyDisabledIssue));
-
-        // Clear override in child
-        config.setSeverity(usuallyEnabledIssue, null);
-        config.setSeverity(usuallyDisabledIssue, null);
-        assertFalse(config.isEnabled(usuallyEnabledIssue));
-        assertTrue(config.isEnabled(usuallyDisabledIssue));
-    }
-
-    public void testBulkEditing() {
-        Configuration parent = null;
-        LintClient client = new TestClient();
-
-        File dir = getTargetDir();
-        assertTrue(dir.mkdirs());
-        Project project = client.getProject(dir, dir);
-
-        ProjectLintConfiguration config =
-                new ProjectLintConfiguration(client, project, parent, false /*fatalOnly*/);
-
-        Issue usuallyEnabledIssue = DuplicateIdDetector.WITHIN_LAYOUT;
-        Issue usuallyDisabledIssue = UnusedResourceDetector.ISSUE_IDS;
-
-        assertTrue(config.isEnabled(usuallyEnabledIssue));
-        assertFalse(config.isEnabled(usuallyDisabledIssue));
-
-        config.setSeverity(usuallyEnabledIssue, Severity.IGNORE);
-        assertFalse(config.isEnabled(usuallyEnabledIssue));
-        assertFalse(config.isEnabled(usuallyDisabledIssue));
-
-        File configFile = new File(dir, "lint.xml");
-        assertTrue(configFile.getPath(), configFile.exists());
-        long lastModified = configFile.lastModified();
-
-        // We need to make sure that the timestamp of the file is a couple of seconds
-        // after the last update or we can't tell whether the file was updated or not
-
-        try {
-            Thread.sleep(1000);
-        } catch (InterruptedException e) {
-            System.err.println("Sleep interrupted, test may not work.");
-        }
-        config.startBulkEditing();
-        assertFalse(lastModified < configFile.lastModified());
-        assertEquals(lastModified, configFile.lastModified());
-        config.setSeverity(usuallyDisabledIssue, Severity.ERROR);
-        config.finishBulkEditing();
-        assertTrue(lastModified < configFile.lastModified());
-
-        assertTrue(config.isEnabled(usuallyDisabledIssue));
-    }
-
-    public void testPersistence() {
-        // Ensure that we use the same configuration object repeatedly for a
-        // single project, such that we don't recompute and parse XML for each and
-        // every lint run!
-        IProject project = getProject();
-        TestClient client = new TestClient();
-        ProjectLintConfiguration config1 = ProjectLintConfiguration.get(client, project, false);
-        ProjectLintConfiguration config2 = ProjectLintConfiguration.get(client, project, false);
-        assertSame(config1, config2);
-    }
-
-    @Override
-    protected File getTargetDir() {
-        File targetDir = new File(getTempDir(), getClass().getSimpleName() + "_" + getName());
-        addCleanupDir(targetDir);
-        return targetDir;
-    }
-
-    private static class TestClient extends LintClient {
-        @Override
-        public void report(@NonNull Context context, @NonNull Issue issue,
-                @NonNull Severity severity, @Nullable Location location,
-                @NonNull String message, @NonNull TextFormat format) {
-        }
-
-        @Override
-        public void log(@NonNull Severity severity, @Nullable Throwable exception,
-                @Nullable String format, @Nullable Object... args) {
-        }
-
-        @Override
-        public XmlParser getXmlParser() {
-            return null;
-        }
-
-        @Override
-        public @NonNull String readFile(@NonNull File file) {
-            return null;
-        }
-
-        @Override
-        public JavaParser getJavaParser(@Nullable Project project) {
-            return null;
-        }
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/refactorings/core/AndroidPackageRenameParticipantTest.java b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/refactorings/core/AndroidPackageRenameParticipantTest.java
deleted file mode 100644
index 1df0b0c..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/refactorings/core/AndroidPackageRenameParticipantTest.java
+++ /dev/null
@@ -1,293 +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.ide.eclipse.adt.internal.refactorings.core;
-
-import com.android.annotations.NonNull;
-import com.android.ide.eclipse.adt.internal.editors.manifest.ManifestInfo;
-import com.android.ide.eclipse.adt.internal.project.BaseProjectHelper;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.IPackageFragment;
-import org.eclipse.jdt.core.JavaModelException;
-import org.eclipse.jdt.internal.corext.refactoring.rename.RenamePackageProcessor;
-import org.eclipse.ltk.core.refactoring.participants.RenameRefactoring;
-
-/**
- * TODO: Test renaming a DIFFERENT package than the application package!
- */
-@SuppressWarnings({"javadoc", "restriction"})
-public class AndroidPackageRenameParticipantTest extends RefactoringTestBase {
-    public void testRefactor1() throws Exception {
-        renamePackage(
-                TEST_PROJECT,
-                false /*renameSubpackages*/,
-                true /*updateReferences*/,
-                "my.pkg.name",
-
-                "CHANGES:\n" +
-                "-------\n" +
-                "[x] Rename package 'com.example.refactoringtest' to 'my.pkg.name'\n" +
-                "\n" +
-                "[x] MainActivity.java - /testRefactor1/src/com/example/refactoringtest/MainActivity.java\n" +
-                "  @@ -3 +3\n" +
-                "  + import com.example.refactoringtest.R;\n" +
-                "  +\n" +
-                "\n" +
-                "\n" +
-                "[x] activity_main.xml - /testRefactor1/res/layout/activity_main.xml\n" +
-                "  @@ -33 +33\n" +
-                "  -     <fragment android:name=\"com.example.refactoringtest.MyFragment\"/>\n" +
-                "  +     <fragment android:name=\"my.pkg.name.MyFragment\"/>\n" +
-                "\n" +
-                "\n" +
-                "[x] AndroidManifest.xml - /testRefactor1/AndroidManifest.xml\n" +
-                "  @@ -16 +16\n" +
-                "  -             android:name=\"com.example.refactoringtest.MainActivity\"\n" +
-                "  +             android:name=\"my.pkg.name.MainActivity\"\n" +
-                "  @@ -25 +25\n" +
-                "  -             android:name=\".MainActivity2\"\n" +
-                "  +             android:name=\"my.pkg.name.MainActivity2\"",
-                true);
-    }
-
-    public void testRefactor1_noreferences() throws Exception {
-        renamePackage(
-                TEST_PROJECT,
-                false /*renameSubpackages*/,
-                false /*updateReferences*/,
-                "my.pkg.name",
-
-                "CHANGES:\n" +
-                "-------\n" +
-                "[x] Rename package 'com.example.refactoringtest' to 'my.pkg.name'",
-                false);
-    }
-
-    public void testRefactor2() throws Exception {
-        // Tests custom view handling
-        renamePackage(
-                TEST_PROJECT2,
-                false /*renameSubpackages*/,
-                true /*updateReferences*/,
-                "my.pkg.name",
-
-                "CHANGES:\n" +
-                "-------\n" +
-                "[x] Rename package 'com.example.refactoringtest' to 'my.pkg.name'\n" +
-                "\n" +
-                "[x] MainActivity.java - /testRefactor2/src/com/example/refactoringtest/MainActivity.java\n" +
-                "  @@ -3 +3\n" +
-                "  + import com.example.refactoringtest.R;\n" +
-                "  +\n" +
-                "\n" +
-                "\n" +
-                "[x] customviews.xml - /testRefactor2/res/layout/customviews.xml\n" +
-                "  @@ -9 +9\n" +
-                "  -     <com.example.refactoringtest.CustomView1\n" +
-                "  +     <my.pkg.name.CustomView1\n" +
-                "\n" +
-                "\n" +
-                "[x] activity_main.xml - /testRefactor2/res/layout/activity_main.xml\n" +
-                "  @@ -33 +33\n" +
-                "  -     <fragment android:name=\"com.example.refactoringtest.MyFragment\"/>\n" +
-                "  +     <fragment android:name=\"my.pkg.name.MyFragment\"/>\n" +
-                "\n" +
-                "\n" +
-                "[x] customviews.xml - /testRefactor2/res/layout-land/customviews.xml\n" +
-                "  @@ -9 +9\n" +
-                "  -     <com.example.refactoringtest.CustomView1\n" +
-                "  +     <my.pkg.name.CustomView1\n" +
-                "\n" +
-                "\n" +
-                "[x] AndroidManifest.xml - /testRefactor2/AndroidManifest.xml\n" +
-                "  @@ -16 +16\n" +
-                "  -             android:name=\"com.example.refactoringtest.MainActivity\"\n" +
-                "  +             android:name=\"my.pkg.name.MainActivity\"\n" +
-                "  @@ -25 +25\n" +
-                "  -             android:name=\".MainActivity2\"\n" +
-                "  +             android:name=\"my.pkg.name.MainActivity2\"",
-                true);
-    }
-
-    public void testRefactor2_renamesub() throws Exception {
-        // Tests custom view handling
-        renamePackage(
-                TEST_PROJECT2,
-                true /*renameSubpackages*/,
-                true /*updateReferences*/,
-                "my.pkg.name",
-
-                "CHANGES:\n" +
-                "-------\n" +
-                "[x] Rename package 'com.example.refactoringtest' and subpackages to 'my.pkg.name'\n" +
-                "\n" +
-                "[x] MainActivity.java - /testRefactor2_renamesub/src/com/example/refactoringtest/MainActivity.java\n" +
-                "  @@ -3 +3\n" +
-                "  + import com.example.refactoringtest.R;\n" +
-                "  +\n" +
-                "\n" +
-                "\n" +
-                "[x] customviews.xml - /testRefactor2_renamesub/res/layout/customviews.xml\n" +
-                "  @@ -9 +9\n" +
-                "  -     <com.example.refactoringtest.CustomView1\n" +
-                "  +     <my.pkg.name.CustomView1\n" +
-                "\n" +
-                "\n" +
-                "[x] activity_main.xml - /testRefactor2_renamesub/res/layout/activity_main.xml\n" +
-                "  @@ -33 +33\n" +
-                "  -     <fragment android:name=\"com.example.refactoringtest.MyFragment\"/>\n" +
-                "  +     <fragment android:name=\"my.pkg.name.MyFragment\"/>\n" +
-                "\n" +
-                "\n" +
-                "[x] customviews.xml - /testRefactor2_renamesub/res/layout-land/customviews.xml\n" +
-                "  @@ -9 +9\n" +
-                "  -     <com.example.refactoringtest.CustomView1\n" +
-                "  +     <my.pkg.name.CustomView1\n" +
-                "\n" +
-                "\n" +
-                "[x] AndroidManifest.xml - /testRefactor2_renamesub/AndroidManifest.xml\n" +
-                "  @@ -16 +16\n" +
-                "  -             android:name=\"com.example.refactoringtest.MainActivity\"\n" +
-                "  +             android:name=\"my.pkg.name.MainActivity\"\n" +
-                "  @@ -25 +25\n" +
-                "  -             android:name=\".MainActivity2\"\n" +
-                "  +             android:name=\"my.pkg.name.MainActivity2\"\n" +
-                "\n" +
-                "\n" +
-                "[x] customviews.xml - /testRefactor2_renamesub/res/layout/customviews.xml\n" +
-                "  @@ -15 +15\n" +
-                "  -     <com.example.refactoringtest.subpackage.CustomView2\n" +
-                "  +     <my.pkg.name.subpackage.CustomView2\n" +
-                "\n" +
-                "\n" +
-                "[x] customviews.xml - /testRefactor2_renamesub/res/layout-land/customviews.xml\n" +
-                "  @@ -15 +15\n" +
-                "  -     <com.example.refactoringtest.subpackage.CustomView2\n" +
-                "  +     <my.pkg.name.subpackage.CustomView2",
-                true);
-    }
-
-    public void testRefactor2_renamesub_norefs() throws Exception {
-        // Tests custom view handling
-        renamePackage(
-                TEST_PROJECT2,
-                true /*renameSubpackages*/,
-                false /*updateReferences*/,
-                "my.pkg.name",
-
-                "CHANGES:\n" +
-                "-------\n" +
-                "[x] Rename package 'com.example.refactoringtest' and subpackages to 'my.pkg.name'",
-                false);
-    }
-
-
-    // ---- Test infrastructure ----
-
-    protected void renamePackage(
-            @NonNull Object[] testData,
-            boolean renameSubpackages,
-            boolean updateReferences,
-            @NonNull String newName,
-            @NonNull String expected,
-            boolean expectedAppPackageRenameWarning) throws Exception {
-        IProject project = createProject(testData);
-        String expectedWarnings = expectedAppPackageRenameWarning ?
-                EXPECTED_WARNINGS_TEMPLATE.replace("PROJECTNAME", project.getName()) : null;
-        renamePackage(project, renameSubpackages, updateReferences, newName, expected,
-                expectedWarnings);
-    }
-
-    protected void renamePackage(
-            @NonNull IProject project,
-            boolean renameSubpackages,
-            boolean updateReferences,
-            @NonNull String newName,
-            @NonNull String expected,
-            @NonNull String expectedWarnings) throws Exception {
-        ManifestInfo info = ManifestInfo.get(project);
-        String currentPackage = info.getPackage();
-        assertNotNull(currentPackage);
-
-        IPackageFragment pkgFragment = getPackageFragment(project, currentPackage);
-        RenamePackageProcessor processor = new RenamePackageProcessor(pkgFragment);
-        processor.setNewElementName(newName);
-        processor.setRenameSubpackages(renameSubpackages);
-        processor.setUpdateReferences(updateReferences);
-        assertNotNull(processor);
-
-        RenameRefactoring refactoring = new RenameRefactoring(processor);
-        checkRefactoring(refactoring, expected, expectedWarnings);
-    }
-
-    private static IPackageFragment getPackageFragment(IProject project, String pkg)
-            throws CoreException, JavaModelException {
-        IPackageFragment pkgFragment = null;
-        IJavaProject javaProject = BaseProjectHelper.getJavaProject(project);
-        assertNotNull(javaProject);
-        IPackageFragment[] fragments = javaProject.getPackageFragments();
-        for (IPackageFragment fragment : fragments) {
-            String name = fragment.getElementName();
-            if (pkg.equals(name)) {
-                pkgFragment = fragment;
-                break;
-            }
-        }
-        return pkgFragment;
-    }
-
-    private static String EXPECTED_WARNINGS_TEMPLATE =
-            "<INFO\n" +
-            "\t\n" +
-            "INFO: You are refactoring the same package as your application's package (specified in the manifest).\n" +
-            "\n" +
-            "Context: L/PROJECTNAME/AndroidManifest.xml\n" +
-            "code: none\n" +
-            "Data: null\n" +
-            "\t\n" +
-            "INFO: Note that this refactoring does NOT also update your application package.\n" +
-            "Context: L/PROJECTNAME/AndroidManifest.xml\n" +
-            "code: none\n" +
-            "Data: null\n" +
-            "\t\n" +
-            "INFO: The application package defines your application's identity.\n" +
-            "Context: L/PROJECTNAME/AndroidManifest.xml\n" +
-            "code: none\n" +
-            "Data: null\n" +
-            "\t\n" +
-            "INFO: If you change it, then it is considered to be a different application.\n" +
-            "Context: L/PROJECTNAME/AndroidManifest.xml\n" +
-            "code: none\n" +
-            "Data: null\n" +
-            "\t\n" +
-            "INFO: (Users of the previous version cannot update to the new version.)\n" +
-            "Context: L/PROJECTNAME/AndroidManifest.xml\n" +
-            "code: none\n" +
-            "Data: null\n" +
-            "\t\n" +
-            "INFO: The application package, and the package containing the code, can differ.\n" +
-            "Context: L/PROJECTNAME/AndroidManifest.xml\n" +
-            "code: none\n" +
-            "Data: null\n" +
-            "\t\n" +
-            "INFO: To really change application package, choose \"Android Tools\" > \"Rename  Application Package.\" from the project context menu.\n" +
-            "Context: L/PROJECTNAME/AndroidManifest.xml\n" +
-            "code: none\n" +
-            "Data: null\n" +
-            ">";
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/refactorings/core/RefactoringTestBase.java b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/refactorings/core/RefactoringTestBase.java
deleted file mode 100644
index 41838e2..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/refactorings/core/RefactoringTestBase.java
+++ /dev/null
@@ -1,757 +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.ide.eclipse.adt.internal.refactorings.core;
-
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-import com.android.ide.eclipse.adt.AdtUtils;
-import com.android.ide.eclipse.adt.internal.editors.layout.refactoring.AdtProjectTest;
-import com.google.common.base.Charsets;
-import com.google.common.base.Splitter;
-import com.google.common.io.ByteStreams;
-import com.google.common.io.Files;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.jdt.internal.corext.refactoring.changes.RenameCompilationUnitChange;
-import org.eclipse.jdt.internal.corext.refactoring.changes.RenamePackageChange;
-import org.eclipse.jface.text.Document;
-import org.eclipse.jface.text.IDocument;
-import org.eclipse.ltk.core.refactoring.Change;
-import org.eclipse.ltk.core.refactoring.CompositeChange;
-import org.eclipse.ltk.core.refactoring.Refactoring;
-import org.eclipse.ltk.core.refactoring.RefactoringStatus;
-import org.eclipse.ltk.core.refactoring.TextChange;
-import org.eclipse.ltk.core.refactoring.TextFileChange;
-import org.eclipse.ltk.core.refactoring.resource.MoveResourceChange;
-import org.eclipse.ltk.core.refactoring.resource.RenameResourceChange;
-import org.eclipse.text.edits.TextEdit;
-
-import java.io.File;
-import java.io.IOException;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.List;
-
-@SuppressWarnings({"javadoc","restriction"})
-public abstract class RefactoringTestBase extends AdtProjectTest {
-    protected void checkRefactoring(Refactoring refactoring, String expected) throws Exception {
-        checkRefactoring(refactoring, expected, null);
-    }
-
-    @Override
-    protected void setUp() throws Exception {
-        // Not calling super.setUp
-    }
-
-    protected void checkRefactoring(Refactoring refactoring, String expected,
-            @Nullable String expectedWarnings) throws Exception {
-        RefactoringStatus status = refactoring.checkAllConditions(new NullProgressMonitor());
-        assertNotNull(status);
-        if (expectedWarnings == null) {
-            expectedWarnings = "<OK\n>";
-        }
-        if (status.toString().trim().startsWith(
-            "<WARNING\n" +
-            "\t\n" +
-            "WARNING: Code modification may not be accurate as affected resource '")) {
-            // Test instability, probably a timing issue with getting the new project
-            // compiled (to recognize Android classpath entries)
-            // Just continue to ensure that the refactoring list matches.
-        } else {
-            assertEquals(status.toString().trim(), expectedWarnings.trim());
-        }
-        if (!status.isOK()) {
-            return;
-        }
-        assertTrue(status.toString(), status.isOK());
-        Change change = refactoring.createChange(new NullProgressMonitor());
-        assertNotNull(change);
-        String explanation = "CHANGES:\n-------\n" + describe(change);
-        if (!expected.trim().equals(explanation.trim())) { // allow trimming endlines in expected
-            assertEquals(expected, explanation);
-        }
-    }
-
-    private IProject mProject;
-
-    @Override
-    protected IProject getProject() {
-        return mProject;
-    }
-
-    protected IProject createProject(Object[] testData) throws Exception {
-        String name = getName();
-        IProject project = createProject(name);
-        mProject = project;
-        File projectDir = AdtUtils.getAbsolutePath(project).toFile();
-        assertNotNull(projectDir);
-        assertTrue(projectDir.getPath(), projectDir.exists());
-        createTestDataDir(projectDir, testData);
-        project.refreshLocal(IResource.DEPTH_INFINITE, new NullProgressMonitor());
-
-        for (int i = 0; i < testData.length; i+= 2) {
-            assertTrue(testData[i].toString(), testData[i] instanceof String);
-            String relative = (String) testData[i];
-            IResource member = project.findMember(relative);
-            assertNotNull(relative, member);
-            assertTrue(member.getClass().getSimpleName(), member instanceof IFile);
-        }
-
-        return project;
-    }
-
-    public static String describe(Change change) throws Exception {
-        StringBuilder sb = new StringBuilder(1000);
-        describe(sb, change, 0);
-
-        // Trim trailing space
-        for (int i = sb.length() - 1; i >= 0; i--) {
-            if (!Character.isWhitespace(sb.charAt(i))) {
-                sb.setLength(i + 1);
-                break;
-            }
-        }
-
-        return sb.toString();
-    }
-
-    protected static void describe(StringBuilder sb, Change change, int indent) throws Exception {
-        if (change instanceof CompositeChange
-                && ((CompositeChange) change).isSynthetic()) {
-            // Don't display information about synthetic changes
-        } else {
-            String changeName = change.getName();
-
-            if (changeName.contains("MoreUnit")) {
-                // If MoreUnit plugin is installed, don't include in unit test results
-                return;
-            }
-
-            // Describe this change
-            indent(sb, indent);
-            if (change.isEnabled()) {
-                sb.append("[x] ");
-            } else {
-                sb.append("[ ] ");
-            }
-            sb.append(changeName);
-
-            IFile file = getFile(change);
-            if (file != null) {
-                sb.append(" - ");
-                sb.append(file.getFullPath());
-                sb.append('\n');
-            } else {
-                sb.append('\n');
-            }
-
-            if (change instanceof TextFileChange) {
-                assertNotNull(file);
-                if (file != null) {
-                    TextChange tc = (TextChange) change;
-                    TextEdit edit = tc.getEdit();
-                    byte[] bytes = ByteStreams.toByteArray(file.getContents());
-                    String before = new String(bytes, Charsets.UTF_8);
-                    IDocument document = new Document();
-                    document.replace(0, 0, before);
-                    // Make a copy: edits are sometimes destructive when run repeatedly!
-                    edit.copy().apply(document);
-                    String after = document.get();
-
-                    String diff = getDiff(before, after);
-                    for (String line : Splitter.on('\n').split(diff)) {
-                        if (!line.trim().isEmpty()) {
-                            indent(sb, indent + 1);
-                            sb.append(line);
-                        }
-                        sb.append('\n');
-                    }
-                }
-            } else if (change instanceof RenameCompilationUnitChange) {
-                // Change name, appended above, is adequate
-            } else if (change instanceof RenameResourceChange) {
-                // Change name, appended above, is adequate
-            } else if (change instanceof RenamePackageChange) {
-                // Change name, appended above, is adequate
-            } else if (change instanceof MoveResourceChange) {
-                // Change name, appended above, is adequate
-            } else if (change instanceof CompositeChange) {
-                // Don't print details about children here; they'll be nested below
-            } else {
-                indent(sb, indent);
-                sb.append("<UNKNOWN CHANGE TYPE " + change.getClass().getName() + ">");
-            }
-            sb.append('\n');
-        }
-
-        if (change instanceof CompositeChange) {
-            CompositeChange composite = (CompositeChange) change;
-            Change[] children = composite.getChildren();
-            List<Change> sorted = Arrays.asList(children);
-            // Process children in a fixed (output-alphabetical) order to ensure stable output
-            Collections.sort(sorted, new Comparator<Change>() {
-                @Override
-                public int compare(Change change1, Change change2) {
-                    try {
-                        IFile file1 = getFile(change1);
-                        IFile file2 = getFile(change2);
-                        if (file1 != null && file2 != null) {
-                            // Sort in decreasing order. This places the most interesting
-                            // files first: res > src > gen
-                            int fileDelta = file2.getFullPath().toOSString().compareToIgnoreCase(
-                                    file1.getFullPath().toOSString());
-                            if (fileDelta != 0) {
-                                return fileDelta;
-                            }
-                        }
-
-                        int nameDelta = change2.getName().compareTo(change1.getName());
-                        if (nameDelta != 0) {
-                            return nameDelta;
-                        }
-
-                        // This is pretty inefficient but ensures stable output
-                        return describe(change2).compareTo(describe(change1));
-                    } catch (Exception e) {
-                        fail(e.getLocalizedMessage());
-                        return 0;
-                    }
-                }
-
-            });
-            for (Change child : sorted) {
-                describe(sb, child, indent + (composite.isSynthetic() ? 0 : 1));
-            }
-        }
-    }
-
-    @Nullable
-    private static IFile getFile(@NonNull Change change) {
-        if (change instanceof TextFileChange) {
-            TextFileChange tfc = (TextFileChange) change;
-            return tfc.getFile();
-        }
-
-        return null;
-    }
-
-    protected static void indent(StringBuilder sb, int indent) {
-        for (int i = 0; i < indent; i++) {
-            sb.append("  ");
-        }
-    }
-
-    protected void createTestDataDir(File dir, Object[] data) throws IOException {
-        for (int i = 0, n = data.length; i < n; i += 2) {
-            assertTrue("Must be a path: " + data[i], data[i] instanceof String);
-            String relativePath = ((String) data[i]).replace('/', File.separatorChar);
-            File to = new File(dir, relativePath);
-            File parent = to.getParentFile();
-            if (!parent.exists()) {
-                boolean mkdirs = parent.mkdirs();
-                assertTrue(to.getPath(), mkdirs);
-            }
-
-            Object o = data[i + 1];
-            if (o instanceof String) {
-                String contents = (String) o;
-                Files.write(contents, to, Charsets.UTF_8);
-            } else if (o instanceof byte[]) {
-                Files.write((byte[]) o, to);
-            } else {
-                fail("Data must be a String or a byte[] for " + to);
-            }
-        }
-    }
-
-    // Test sources
-
-    protected static final String SAMPLE_MANIFEST =
-            "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" +
-            "<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n" +
-            "    package=\"com.example.refactoringtest\"\n" +
-            "    android:versionCode=\"1\"\n" +
-            "    android:versionName=\"1.0\" >\n" +
-            "\n" +
-            "    <uses-sdk\n" +
-            "        android:minSdkVersion=\"8\"\n" +
-            "        android:targetSdkVersion=\"17\" />\n" +
-            "\n" +
-            "    <application\n" +
-            "        android:icon=\"@drawable/ic_launcher\"\n" +
-            "        android:label=\"@string/app_name\"\n" +
-            "        android:theme=\"@style/AppTheme\" >\n" +
-            "        <activity\n" +
-            "            android:name=\"com.example.refactoringtest.MainActivity\"\n" +
-            "            android:label=\"@string/app_name\" >\n" +
-            "            <intent-filter>\n" +
-            "                <action android:name=\"android.intent.action.MAIN\" />\n" +
-            "\n" +
-            "                <category android:name=\"android.intent.category.LAUNCHER\" />\n" +
-            "            </intent-filter>\n" +
-            "        </activity>\n" +
-            "        <activity\n" +
-            "            android:name=\".MainActivity2\"\n" +
-            "            android:label=\"@string/app_name2\" >\n" +
-            "        </activity>\n" +
-            "    </application>\n" +
-            "\n" +
-            "</manifest>";
-
-    protected static final String SAMPLE_MAIN_ACTIVITY =
-            "package com.example.refactoringtest;\n" +
-            "\n" +
-            "import android.os.Bundle;\n" +
-            "import android.app.Activity;\n" +
-            "import android.view.Menu;\n" +
-            "import android.view.View;\n" +
-            "\n" +
-            "public class MainActivity extends Activity {\n" +
-            "\n" +
-            "    @Override\n" +
-            "    protected void onCreate(Bundle savedInstanceState) {\n" +
-            "        super.onCreate(savedInstanceState);\n" +
-            "        setContentView(R.layout.activity_main);\n" +
-            "        View view1 = findViewById(R.id.textView1);\n" +
-            "    }\n" +
-            "\n" +
-            "    @Override\n" +
-            "    public boolean onCreateOptionsMenu(Menu menu) {\n" +
-            "        // Inflate the menu; this adds items to the action bar if it is present.\n" +
-            "        getMenuInflater().inflate(R.menu.activity_main, menu);\n" +
-            "        return true;\n" +
-            "    }\n" +
-            "\n" +
-            "}\n";
-
-    protected static final String SAMPLE_MAIN_ACTIVITY2 =
-            "package com.example.refactoringtest;\n" +
-            "\n" +
-            "import android.os.Bundle;\n" +
-            "import android.app.Activity;\n" +
-            "import android.view.Menu;\n" +
-            "import android.view.View;\n" +
-            "\n" +
-            "public class MainActivity2 extends Activity {\n" +
-            "\n" +
-            "    @Override\n" +
-            "    protected void onCreate(Bundle savedInstanceState) {\n" +
-            "        super.onCreate(savedInstanceState);\n" +
-            "    }\n" +
-            "\n" +
-            "}\n";
-
-    protected static final String MY_FRAGMENT =
-            "package com.example.refactoringtest;\n" +
-            "import android.support.v4.app.ListFragment;\n" +
-            "\n" +
-            "public class MyFragment extends ListFragment {\n" +
-            "\n" +
-            "}\n";
-
-    protected static final String SAMPLE_LAYOUT =
-            "<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n" +
-            "    xmlns:tools=\"http://schemas.android.com/tools\"\n" +
-            "    android:layout_width=\"match_parent\"\n" +
-            "    android:layout_height=\"match_parent\"\n" +
-            "    tools:context=\".MainActivity\" >\n" +
-            "\n" +
-            "    <TextView\n" +
-            "        android:id=\"@+id/textView1\"\n" +
-            "        android:layout_width=\"wrap_content\"\n" +
-            "        android:layout_height=\"wrap_content\"\n" +
-            "        android:layout_centerVertical=\"true\"\n" +
-            "        android:layout_toRightOf=\"@+id/button2\"\n" +
-            "        android:text=\"@string/hello_world\" />\n" +
-            "\n" +
-            "    <Button\n" +
-            "        android:id=\"@+id/button1\"\n" +
-            "        android:layout_width=\"wrap_content\"\n" +
-            "        android:layout_height=\"wrap_content\"\n" +
-            "        android:layout_alignLeft=\"@+id/textView1\"\n" +
-            "        android:layout_below=\"@+id/textView1\"\n" +
-            "        android:layout_marginLeft=\"22dp\"\n" +
-            "        android:layout_marginTop=\"24dp\"\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:layout_alignParentLeft=\"true\"\n" +
-            "        android:layout_alignParentTop=\"true\"\n" +
-            "        android:text=\"Button\" />\n" +
-            "\n" +
-            "    <fragment android:name=\"com.example.refactoringtest.MyFragment\"/>" +
-            "\n" +
-            "</RelativeLayout>";
-
-    protected static final String SAMPLE_LAYOUT_2 =
-            "<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n" +
-            "    xmlns:tools=\"http://schemas.android.com/tools\"\n" +
-            "    android:layout_width=\"match_parent\"\n" +
-            "    android:layout_height=\"match_parent\"\n" +
-            "    tools:context=\".MainActivity\" >\n" +
-            "\n" +
-            "    <ListView\n" +
-            "        android:layout_width=\"match_parent\"\n" +
-            "        android:layout_height=\"wrap_content\"\n" +
-            "        tools:listitem=\"@layout/preview\" >\n" +
-            "    </ListView>\n" +
-            "\n" +
-            "    <fragment\n" +
-            "        android:name=\"android.support.v4.app.ListFragment\"\n" +
-            "        android:layout_width=\"wrap_content\"\n" +
-            "        android:layout_height=\"wrap_content\"\n" +
-            "        tools:layout=\"@layout/preview\" />\n" +
-            "\n" +
-            "\n" +
-            "</RelativeLayout>";
-
-
-    protected static final String SAMPLE_MENU =
-            "<menu xmlns:android=\"http://schemas.android.com/apk/res/android\" >\n" +
-            "\n" +
-            "    <item\n" +
-            "        android:id=\"@+id/menu_settings\"\n" +
-            "        android:orderInCategory=\"100\"\n" +
-            "        android:showAsAction=\"never\"\n" +
-            "        android:title=\"@string/menu_settings\"/>\n" +
-            "\n" +
-            "</menu>";
-
-    protected static final String SAMPLE_STRINGS =
-            "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" +
-            "<resources>\n" +
-            "\n" +
-            "    <string name=\"app_name\">RefactoringTest</string>\n" +
-            "    <string name=\"hello_world\">Hello world!</string>\n" +
-            "    <string name=\"menu_settings\">Settings</string>\n" +
-            "\n" +
-            "</resources>";
-
-    protected static final String SAMPLE_STYLES =
-            "<resources>\n" +
-            "\n" +
-            "    <!--\n" +
-            "        Base application theme, dependent on API level. This theme is replaced\n" +
-            "        by AppBaseTheme from res/values-vXX/styles.xml on newer devices.\n" +
-            "    -->\n" +
-            "    <style name=\"AppBaseTheme\" parent=\"android:Theme.Light\">\n" +
-            "        <!--\n" +
-            "            Theme customizations available in newer API levels can go in\n" +
-            "            res/values-vXX/styles.xml, while customizations related to\n" +
-            "            backward-compatibility can go here.\n" +
-            "        -->\n" +
-            "    </style>\n" +
-            "\n" +
-            "    <!-- Application theme. -->\n" +
-            "    <style name=\"AppTheme\" parent=\"AppBaseTheme\">\n" +
-            "        <!-- All customizations that are NOT specific to a particular API-level can go here. -->\n" +
-            "    </style>\n" +
-            "\n" +
-            "</resources>";
-
-    protected static final String SAMPLE_R =
-            "/* AUTO-GENERATED FILE.  DO NOT MODIFY.\n" +
-            " *\n" +
-            " * This class was automatically generated by the\n" +
-            " * aapt tool from the resource data it found.  It\n" +
-            " * should not be modified by hand.\n" +
-            " */\n" +
-            "\n" +
-            "package com.example.refactoringtest;\n" +
-            "\n" +
-            "public final class R {\n" +
-            "    public static final class attr {\n" +
-            "    }\n" +
-            "    public static final class drawable {\n" +
-            "        public static final int ic_launcher=0x7f020000;\n" +
-            "    }\n" +
-            "    public static final class id {\n" +
-            "        public static final int button1=0x7f070002;\n" +
-            "        public static final int button2=0x7f070001;\n" +
-            "        public static final int menu_settings=0x7f070003;\n" +
-            "        public static final int textView1=0x7f070000;\n" +
-            "    }\n" +
-            "    public static final class layout {\n" +
-            "        public static final int activity_main=0x7f030000;\n" +
-            "    }\n" +
-            "    public static final class menu {\n" +
-            "        public static final int activity_main=0x7f060000;\n" +
-            "    }\n" +
-            "    public static final class string {\n" +
-            "        public static final int app_name=0x7f040000;\n" +
-            "        public static final int hello_world=0x7f040001;\n" +
-            "        public static final int menu_settings=0x7f040002;\n" +
-            "    }\n" +
-            "    public static final class style {\n" +
-            "        /** \n" +
-            "        Base application theme, dependent on API level. This theme is replaced\n" +
-            "        by AppBaseTheme from res/values-vXX/styles.xml on newer devices.\n" +
-            "    \n" +
-            "\n" +
-            "            Theme customizations available in newer API levels can go in\n" +
-            "            res/values-vXX/styles.xml, while customizations related to\n" +
-            "            backward-compatibility can go here.\n" +
-            "        \n" +
-            "\n" +
-            "        Base application theme for API 11+. This theme completely replaces\n" +
-            "        AppBaseTheme from res/values/styles.xml on API 11+ devices.\n" +
-            "    \n" +
-            " API 11 theme customizations can go here. \n" +
-            "\n" +
-            "        Base application theme for API 14+. This theme completely replaces\n" +
-            "        AppBaseTheme from BOTH res/values/styles.xml and\n" +
-            "        res/values-v11/styles.xml on API 14+ devices.\n" +
-            "    \n" +
-            " API 14 theme customizations can go here. \n" +
-            "         */\n" +
-            "        public static final int AppBaseTheme=0x7f050000;\n" +
-            "        /**  Application theme. \n" +
-            " All customizations that are NOT specific to a particular API-level can go here. \n" +
-            "         */\n" +
-            "        public static final int AppTheme=0x7f050001;\n" +
-            "    }\n" +
-            "}\n";
-
-    protected static final Object[] TEST_PROJECT = new Object[] {
-        "AndroidManifest.xml",
-        SAMPLE_MANIFEST,
-
-        "src/com/example/refactoringtest/MainActivity.java",
-        SAMPLE_MAIN_ACTIVITY,
-
-        "src/com/example/refactoringtest/MainActivity2.java",
-        SAMPLE_MAIN_ACTIVITY2,
-
-        "gen/com/example/refactoringtest/R.java",
-        SAMPLE_R,
-
-        "res/drawable-xhdpi/ic_launcher.png",
-        new byte[] { 0 },
-        "res/drawable-hdpi/ic_launcher.png",
-        new byte[] { 0 },
-        "res/drawable-ldpi/ic_launcher.png",
-        new byte[] { 0 },
-        "res/drawable-mdpi/ic_launcher.png",
-        new byte[] { 0 },
-
-        "res/layout/activity_main.xml",
-        SAMPLE_LAYOUT,
-
-        "res/layout-land/activity_main.xml",
-        SAMPLE_LAYOUT_2,
-
-        "res/menu/activity_main.xml",
-        SAMPLE_MENU,
-
-        "res/values/strings.xml",   // file 3
-        SAMPLE_STRINGS,
-
-        "res/values/styles.xml",   // file 3
-        SAMPLE_STYLES,
-    };
-
-    // More test data
-
-    protected static final String CUSTOM_VIEW_1 =
-            "package com.example.refactoringtest;\n" +
-            "\n" +
-            "import android.content.Context;\n" +
-            "import android.widget.Button;\n" +
-            "\n" +
-            "public class CustomView1 extends Button {\n" +
-            "    public CustomView1(Context context) {\n" +
-            "        super(context);\n" +
-            "    }\n" +
-            "}\n";
-
-    protected static final String CUSTOM_VIEW_1_STYLES =
-            "<resources>\n" +
-            "\n" +
-            "    <!-- Aattributes for the custom view -->\n" +
-            "    <declare-styleable name=\"CustomView1\">\n" +
-            "        <attr name=\"exampleString\" format=\"string\" />\n" +
-            "        <attr name=\"exampleDimension\" format=\"dimension\" />\n" +
-            "        <attr name=\"exampleColor\" format=\"color\" />\n" +
-            "        <attr name=\"exampleDrawable\" format=\"color|reference\" />\n" +
-            "    </declare-styleable>\n" +
-            "\n" +
-            "</resources>";
-
-    protected static final String CUSTOM_VIEW_2 =
-            "package com.example.refactoringtest.subpackage;\n" +
-            "\n" +
-            "import android.content.Context;\n" +
-            "import android.widget.Button;\n" +
-            "\n" +
-            "public class CustomView2 extends Button {\n" +
-            "    public CustomView2(Context context) {\n" +
-            "        super(context);\n" +
-            "    }\n" +
-            "}\n";
-
-    protected static final String CUSTOM_VIEW_LAYOUT =
-            "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" +
-            "<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n" +
-            "    xmlns:tools=\"http://schemas.android.com/tools\"\n" +
-            "    android:layout_width=\"match_parent\"\n" +
-            "    android:layout_height=\"match_parent\"\n" +
-            "    android:orientation=\"vertical\"\n" +
-            "    tools:ignore=\"HardcodedText\" >\n" +
-            "\n" +
-            "    <com.example.refactoringtest.CustomView1\n" +
-            "        android:id=\"@+id/customView1\"\n" +
-            "        android:layout_width=\"wrap_content\"\n" +
-            "        android:layout_height=\"wrap_content\"\n" +
-            "        android:text=\"CustomView1\" />\n" +
-            "\n" +
-            "    <com.example.refactoringtest.subpackage.CustomView2\n" +
-            "        android:id=\"@+id/customView2\"\n" +
-            "        android:layout_width=\"wrap_content\"\n" +
-            "        android:layout_height=\"wrap_content\"\n" +
-            "        android:text=\"CustomView2\" />\n" +
-            "\n" +
-            "</LinearLayout>";
-
-    protected static final Object[] TEST_PROJECT2 = new Object[] {
-        "AndroidManifest.xml",
-        SAMPLE_MANIFEST,
-
-        "src/com/example/refactoringtest/MainActivity.java",
-        SAMPLE_MAIN_ACTIVITY,
-
-        "src/com/example/refactoringtest/CustomView1.java",
-        CUSTOM_VIEW_1,
-
-        "res/values/attrs_custom_view.xml",
-        CUSTOM_VIEW_1_STYLES,
-
-        "src/com/example/refactoringtest/subpackage/CustomView2.java",
-        CUSTOM_VIEW_2,
-
-        "src/com/example/refactoringtest/MyFragment.java",
-        MY_FRAGMENT,
-
-        "gen/com/example/refactoringtest/R.java",
-        SAMPLE_R,
-
-        "res/drawable-xhdpi/ic_launcher.png",
-        new byte[] { 0 },
-        "res/drawable-hdpi/ic_launcher.png",
-        new byte[] { 0 },
-        "res/drawable-ldpi/ic_launcher.png",
-        new byte[] { 0 },
-        "res/drawable-mdpi/ic_launcher.png",
-        new byte[] { 0 },
-
-        "res/layout/activity_main.xml",
-        SAMPLE_LAYOUT,
-
-        "res/layout-land/activity_main.xml",
-        SAMPLE_LAYOUT_2,
-
-        "res/layout/customviews.xml",
-        CUSTOM_VIEW_LAYOUT,
-
-        "res/layout-land/customviews.xml",
-        CUSTOM_VIEW_LAYOUT,
-
-        "res/menu/activity_main.xml",
-        SAMPLE_MENU,
-
-        "res/values/strings.xml",   // file 3
-        SAMPLE_STRINGS,
-
-        "res/values/styles.xml",   // file 3
-        SAMPLE_STYLES,
-
-        // Just a gen file, should not be refactored
-        "bin/AndroidManifest.xml",
-        SAMPLE_MANIFEST,
-
-    };
-
-
-    protected static final String MANIFEST =
-            "/* AUTO-GENERATED FILE.  DO NOT MODIFY.\n" +
-            " *\n" +
-            " * This class was automatically generated by the\n" +
-            " * aapt tool from the resource data it found.  It\n" +
-            " * should not be modified by hand.\n" +
-            " */\n" +
-            "\n" +
-            "package com.example.refactoringtest;\n" +
-            "\n" +
-            "public final class Manifest {\n" +
-            "    public static final class permission {\n" +
-            "        public static final String WRITE_SCHEDULE=\"com.example.refactoringtest.permission.WRITE_SCHEDULE\";\n" +
-            "    }\n" +
-            "}";
-
-    protected static final String BUILD_CONFIG =
-            "/** Automatically generated file. DO NOT MODIFY */\n" +
-            "package com.example.refactoringtest;\n" +
-            "\n" +
-            "public final class BuildConfig {\n" +
-            "    public final static boolean DEBUG = true;\n" +
-            "}";
-
-    protected static final String MORE_CODE_JAVA =
-            "package com.example.refactoringtest.subpkg;\n" +
-            "\n" +
-            "import android.os.Bundle;\n" +
-            "import android.app.Activity;\n" +
-            "import android.view.Menu;\n" +
-            "import android.view.View;\n" +
-            "import com.example.refactoringtest.BuildConfig;\n" +
-            "import com.example.refactoringtest.Manifest;\n" +
-            "import com.example.refactoringtest.R;\n" +
-            "\n" +
-            "public class MoreCode extends Activity {\n" +
-            "\n" +
-            "    protected void code() {\n" +
-            "        if (BuildConfig.DEBUG) {\n" +
-            "            System.out.println(Manifest.permission);\n" +
-            "        }" +
-            "        System.out.println(com.example.refactoringtest.BuildConfig.DEBUG);\n" +
-            "    }\n" +
-            "\n" +
-            "}\n";
-
-    /** Project which includes references to BuildConfig, Manifest, and R */
-    protected static final Object[] TEST_PROJECT3;
-    static {
-        Object[] additional = new Object[] {
-                "src/com/example/refactoringtest/subpkg/MoreCode.java",
-                MORE_CODE_JAVA,
-
-                "gen/com/example/refactoringtest/BuildConfig.java",
-                BUILD_CONFIG,
-
-                "gen/com/example/refactoringtest/Manifest.java",
-                MANIFEST,
-        };
-        TEST_PROJECT3 = new Object[TEST_PROJECT2.length + additional.length];
-        System.arraycopy(TEST_PROJECT2, 0, TEST_PROJECT3, 0, TEST_PROJECT2.length);
-        System.arraycopy(additional, 0, TEST_PROJECT3, TEST_PROJECT2.length, additional.length);
-    };
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/refactorings/core/RenameResourceParticipantTest.java b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/refactorings/core/RenameResourceParticipantTest.java
deleted file mode 100644
index 3f029b9..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/refactorings/core/RenameResourceParticipantTest.java
+++ /dev/null
@@ -1,402 +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.ide.eclipse.adt.internal.refactorings.core;
-
-import com.android.annotations.NonNull;
-import com.android.ide.common.resources.ResourceUrl;
-import com.android.ide.eclipse.adt.internal.project.BaseProjectHelper;
-import com.android.resources.ResourceType;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.jdt.core.IField;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.IType;
-import org.eclipse.jdt.internal.corext.refactoring.rename.RenameFieldProcessor;
-import org.eclipse.ltk.core.refactoring.participants.RenameProcessor;
-import org.eclipse.ltk.core.refactoring.participants.RenameRefactoring;
-
-@SuppressWarnings({"javadoc", "restriction"})
-public class RenameResourceParticipantTest extends RefactoringTestBase {
-    public void testRefactor1() throws Exception {
-        renameResource(
-                TEST_PROJECT,
-                "@string/app_name",
-                true /*updateReferences*/,
-                "myname",
-
-                "CHANGES:\n" +
-                "-------\n" +
-                "[x] strings.xml - /testRefactor1/res/values/strings.xml\n" +
-                "  @@ -4 +4\n" +
-                "  -     <string name=\"app_name\">RefactoringTest</string>\n" +
-                "  +     <string name=\"myname\">RefactoringTest</string>\n" +
-                "\n" +
-                "\n" +
-                "[ ] R.java - /testRefactor1/gen/com/example/refactoringtest/R.java\n" +
-                "  @@ -29 +29\n" +
-                "  -         public static final int app_name=0x7f040000;\n" +
-                "  +         public static final int myname=0x7f040000;\n" +
-                "\n" +
-                "\n" +
-                "[x] AndroidManifest.xml - /testRefactor1/AndroidManifest.xml\n" +
-                "  @@ -13 +13\n" +
-                "  -         android:label=\"@string/app_name\"\n" +
-                "  +         android:label=\"@string/myname\"\n" +
-                "  @@ -17 +17\n" +
-                "  -             android:label=\"@string/app_name\" >\n" +
-                "  +             android:label=\"@string/myname\" >");
-    }
-
-    public void testRefactor2() throws Exception {
-        renameResource(
-                TEST_PROJECT,
-                "@+id/menu_settings",
-                true /*updateReferences*/,
-                "new_id_for_the_action_bar",
-
-                "CHANGES:\n" +
-                "-------\n" +
-                "[x] activity_main.xml - /testRefactor2/res/menu/activity_main.xml\n" +
-                "  @@ -4 +4\n" +
-                "  -         android:id=\"@+id/menu_settings\"\n" +
-                "  +         android:id=\"@+id/new_id_for_the_action_bar\"\n" +
-                "\n" +
-                "\n" +
-                "[ ] R.java - /testRefactor2/gen/com/example/refactoringtest/R.java\n" +
-                "  @@ -19 +19\n" +
-                "  -         public static final int menu_settings=0x7f070003;\n" +
-                "  +         public static final int new_id_for_the_action_bar=0x7f070003;");
-    }
-
-    public void testRefactor3() throws Exception {
-        renameResource(
-                TEST_PROJECT,
-                "@+id/textView1",
-                true /*updateReferences*/,
-                "output",
-
-                "CHANGES:\n" +
-                "-------\n" +
-                "[x] activity_main.xml - /testRefactor3/res/layout/activity_main.xml\n" +
-                "  @@ -8 +8\n" +
-                "  -         android:id=\"@+id/textView1\"\n" +
-                "  +         android:id=\"@+id/output\"\n" +
-                "  @@ -19 +19\n" +
-                "  -         android:layout_alignLeft=\"@+id/textView1\"\n" +
-                "  -         android:layout_below=\"@+id/textView1\"\n" +
-                "  +         android:layout_alignLeft=\"@+id/output\"\n" +
-                "  +         android:layout_below=\"@+id/output\"\n" +
-                "\n" +
-                "\n" +
-                "[x] MainActivity.java - /testRefactor3/src/com/example/refactoringtest/MainActivity.java\n" +
-                "  @@ -14 +14\n" +
-                "  -         View view1 = findViewById(R.id.textView1);\n" +
-                "  +         View view1 = findViewById(R.id.output);\n" +
-                "\n" +
-                "\n" +
-                "[ ] R.java - /testRefactor3/gen/com/example/refactoringtest/R.java\n" +
-                "  @@ -20 +20\n" +
-                "  -         public static final int textView1=0x7f070000;\n" +
-                "  +         public static final int output=0x7f070000;");
-    }
-
-    public void testRefactor4() throws Exception {
-        renameResource(
-                TEST_PROJECT,
-                // same as testRefactor3, but use @id rather than @+id even though @+id is in file
-                "@id/textView1",
-                true /*updateReferences*/,
-                "output",
-
-                "CHANGES:\n" +
-                "-------\n" +
-                "[x] activity_main.xml - /testRefactor4/res/layout/activity_main.xml\n" +
-                "  @@ -8 +8\n" +
-                "  -         android:id=\"@+id/textView1\"\n" +
-                "  +         android:id=\"@+id/output\"\n" +
-                "  @@ -19 +19\n" +
-                "  -         android:layout_alignLeft=\"@+id/textView1\"\n" +
-                "  -         android:layout_below=\"@+id/textView1\"\n" +
-                "  +         android:layout_alignLeft=\"@+id/output\"\n" +
-                "  +         android:layout_below=\"@+id/output\"\n" +
-                "\n" +
-                "\n" +
-                "[x] MainActivity.java - /testRefactor4/src/com/example/refactoringtest/MainActivity.java\n" +
-                "  @@ -14 +14\n" +
-                "  -         View view1 = findViewById(R.id.textView1);\n" +
-                "  +         View view1 = findViewById(R.id.output);\n" +
-                "\n" +
-                "\n" +
-                "[ ] R.java - /testRefactor4/gen/com/example/refactoringtest/R.java\n" +
-                "  @@ -20 +20\n" +
-                "  -         public static final int textView1=0x7f070000;\n" +
-                "  +         public static final int output=0x7f070000;");
-    }
-
-    public void testRefactor5() throws Exception {
-        renameResource(
-                TEST_PROJECT,
-                "@layout/activity_main",
-                true /*updateReferences*/,
-                "newlayout",
-
-                "CHANGES:\n" +
-                "-------\n" +
-                "[x] MainActivity.java - /testRefactor5/src/com/example/refactoringtest/MainActivity.java\n" +
-                "  @@ -13 +13\n" +
-                "  -         setContentView(R.layout.activity_main);\n" +
-                "  +         setContentView(R.layout.newlayout);\n" +
-                "\n" +
-                "\n" +
-                "[ ] R.java - /testRefactor5/gen/com/example/refactoringtest/R.java\n" +
-                "  @@ -23 +23\n" +
-                "  -         public static final int activity_main=0x7f030000;\n" +
-                "  +         public static final int newlayout=0x7f030000;\n" +
-                "\n" +
-                "\n" +
-                "[x] Rename 'testRefactor5/res/layout/activity_main.xml' to 'newlayout.xml'\n" +
-                "\n" +
-                "[x] Rename 'testRefactor5/res/layout-land/activity_main.xml' to 'newlayout.xml'");
-    }
-
-    public void testRefactor6() throws Exception {
-        renameResource(
-                TEST_PROJECT,
-                "@drawable/ic_launcher",
-                true /*updateReferences*/,
-                "newlauncher",
-
-                "CHANGES:\n" +
-                "-------\n" +
-                "[ ] R.java - /testRefactor6/gen/com/example/refactoringtest/R.java\n" +
-                "  @@ -14 +14\n" +
-                "  -         public static final int ic_launcher=0x7f020000;\n" +
-                "  +         public static final int newlauncher=0x7f020000;\n" +
-                "\n" +
-                "\n" +
-                "[x] Rename 'testRefactor6/res/drawable-xhdpi/ic_launcher.png' to 'newlauncher.png'\n" +
-                "\n" +
-                "[x] Rename 'testRefactor6/res/drawable-mdpi/ic_launcher.png' to 'newlauncher.png'\n" +
-                "\n" +
-                "[x] Rename 'testRefactor6/res/drawable-ldpi/ic_launcher.png' to 'newlauncher.png'\n" +
-                "\n" +
-                "[x] Rename 'testRefactor6/res/drawable-hdpi/ic_launcher.png' to 'newlauncher.png'\n" +
-                "\n" +
-                "[x] AndroidManifest.xml - /testRefactor6/AndroidManifest.xml\n" +
-                "  @@ -12 +12\n" +
-                "  -         android:icon=\"@drawable/ic_launcher\"\n" +
-                "  +         android:icon=\"@drawable/newlauncher\"");
-    }
-
-    public void testRefactor7() throws Exception {
-        // Test refactoring initiated on a file rename
-        IProject project = createProject(TEST_PROJECT);
-        IFile file = project.getFile("res/layout/activity_main.xml");
-        renameResource(
-                project,
-                file,
-                true /*updateReferences*/,
-                "newlayout",
-
-                "CHANGES:\n" +
-                "-------\n" +
-                "[x] MainActivity.java - /testRefactor7/src/com/example/refactoringtest/MainActivity.java\n" +
-                "  @@ -13 +13\n" +
-                "  -         setContentView(R.layout.activity_main);\n" +
-                "  +         setContentView(R.layout.newlayout);\n" +
-                "\n" +
-                "\n" +
-                "[ ] R.java - /testRefactor7/gen/com/example/refactoringtest/R.java\n" +
-                "  @@ -23 +23\n" +
-                "  -         public static final int activity_main=0x7f030000;\n" +
-                "  +         public static final int newlayout=0x7f030000;\n" +
-                "\n" +
-                "\n" +
-                "[x] Rename 'testRefactor7/res/layout-land/activity_main.xml' to 'newlayout.xml'\n" +
-                "\n" +
-                "[x] Rename 'testRefactor7/res/layout/activity_main.xml' to 'newlayout.xml'",
-                null);
-    }
-
-    public void testRefactor8() throws Exception {
-        // Test refactoring initiated on a Java field rename
-        IProject project = createProject(TEST_PROJECT);
-        IJavaProject javaProject = BaseProjectHelper.getJavaProject(project);
-        assertNotNull(javaProject);
-        IType type = javaProject.findType("com.example.refactoringtest.R.layout");
-        if (type == null || !type.exists()) {
-            type = javaProject.findType("com.example.refactoringtest.R$layout");
-            System.out.println("Had to switch to $ notation");
-        }
-        assertNotNull(type);
-        assertTrue(type.exists());
-        IField field = type.getField("activity_main");
-        assertNotNull(field);
-        assertTrue(field.exists());
-
-        renameResource(
-                project,
-                field,
-                true /*updateReferences*/,
-                "newlauncher",
-
-                "CHANGES:\n" +
-                "-------\n" +
-                "[x] Rename 'testRefactor8/res/layout/activity_main.xml' to 'newlauncher.xml'\n" +
-                "\n" +
-                "[x] Rename 'testRefactor8/res/layout-land/activity_main.xml' to 'newlauncher.xml'\n" +
-                "\n" +
-                "[x] MainActivity.java - /testRefactor8/src/com/example/refactoringtest/MainActivity.java\n" +
-                "  @@ -13 +13\n" +
-                "  -         setContentView(R.layout.activity_main);\n" +
-                "  +         setContentView(R.layout.newlauncher);\n" +
-                "\n" +
-                "\n" +
-                "[ ] R.java - /testRefactor8/gen/com/example/refactoringtest/R.java\n" +
-                "  @@ -23 +23\n" +
-                "  -         public static final int activity_main=0x7f030000;\n" +
-                "  +         public static final int newlauncher=0x7f030000;",
-                null);
-    }
-
-    public void testInvalidName() throws Exception {
-        renameResource(
-                TEST_PROJECT,
-                "@drawable/ic_launcher",
-                true /*updateReferences*/,
-                "Newlauncher",
-
-                "",
-                "<ERROR\n" +
-                "\t\n" +
-                "ERROR: File-based resource names must start with a lowercase letter.\n" +
-                "Context: <Unspecified context>\n" +
-                "code: none\n" +
-                "Data: null\n" +
-                ">");
-    }
-
-    public void testRefactor9() throws Exception {
-        // same as testRefactor4, but not updating references
-        renameResource(
-                TEST_PROJECT,
-                "@id/textView1",
-                false /*updateReferences*/,
-                "output",
-
-                "CHANGES:\n" +
-                "-------\n" +
-                "[x] activity_main.xml - /testRefactor9/res/layout/activity_main.xml\n" +
-                "  @@ -8 +8\n" +
-                "  -         android:id=\"@+id/textView1\"\n" +
-                "  +         android:id=\"@+id/output\"\n" +
-                "\n" +
-                "\n" +
-                "[ ] R.java - /testRefactor9/gen/com/example/refactoringtest/R.java\n" +
-                "  @@ -20 +20\n" +
-                "  -         public static final int textView1=0x7f070000;\n" +
-                "  +         public static final int output=0x7f070000;");
-    }
-
-    public void testRefactor10() throws Exception {
-        // Check updating tools: attributes
-        renameResource(
-                TEST_PROJECT,
-                "@layout/preview",
-                true /*updateReferences*/,
-                "newlayout",
-
-                "CHANGES:\n" +
-                "-------\n" +
-                "[x] activity_main.xml - /testRefactor10/res/layout-land/activity_main.xml\n" +
-                "  @@ -10 +10\n" +
-                "  -         tools:listitem=\"@layout/preview\" >\n" +
-                "  +         tools:listitem=\"@layout/newlayout\" >\n" +
-                "  @@ -17 +17\n" +
-                "  -         tools:layout=\"@layout/preview\" />\n" +
-                "  +         tools:layout=\"@layout/newlayout\" />");
-    }
-
-    // ---- Test infrastructure ----
-
-    protected void renameResource(
-            @NonNull Object[] testData,
-            @NonNull Object resource,
-            boolean updateReferences,
-            @NonNull String newName,
-            @NonNull String expected) throws Exception {
-        renameResource(testData, resource, updateReferences, newName, expected, null);
-    }
-
-    protected void renameResource(
-            @NonNull Object[] testData,
-            @NonNull Object resource,
-            boolean updateReferences,
-            @NonNull String newName,
-            @NonNull String expected,
-            @NonNull String expectedWarnings) throws Exception {
-        IProject project = createProject(testData);
-        renameResource(project, resource, updateReferences, newName, expected, expectedWarnings);
-    }
-
-    protected void renameResource(
-            @NonNull IProject project,
-            @NonNull Object resource,
-            boolean updateReferences,
-            @NonNull String newName,
-            @NonNull String expected,
-            @NonNull String expectedWarnings) throws Exception {
-        RenameProcessor processor = null;
-        if (resource instanceof String) {
-            String url = (String) resource;
-            assert url.startsWith("@") : resource;
-
-            ResourceUrl parsedUrl = ResourceUrl.parse(url);
-            assertNotNull(url, parsedUrl);
-            assert parsedUrl != null; // null analysis doesn't recognize assertNotNull
-            ResourceType type = parsedUrl.type;
-            String currentName = parsedUrl.name;
-            RenameResourceProcessor p;
-            p = new RenameResourceProcessor(project, type, currentName, newName);
-            p.setUpdateReferences(updateReferences);
-            processor = p;
-        } else if (resource instanceof IResource) {
-            IResource r = (IResource) resource;
-            org.eclipse.ltk.internal.core.refactoring.resource.RenameResourceProcessor p;
-            p = new org.eclipse.ltk.internal.core.refactoring.resource.RenameResourceProcessor(r);
-            String fileName = r.getName();
-            int dot = fileName.indexOf('.');
-            String extension = (dot != -1) ? fileName.substring(dot) : "";
-            p.setNewResourceName(newName + extension);
-            p.setUpdateReferences(updateReferences);
-            processor = p;
-        } else if (resource instanceof IField) {
-            RenameFieldProcessor p = new RenameFieldProcessor((IField) resource);
-            p.setNewElementName(newName);
-            p.setUpdateReferences(updateReferences);
-            processor = p;
-        } else {
-            fail("Unsupported resource element in tests: " + resource);
-        }
-
-        assertNotNull(processor);
-
-        RenameRefactoring refactoring = new RenameRefactoring(processor);
-        checkRefactoring(refactoring, expected, expectedWarnings);
-    }
-}
\ No newline at end of file
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/refactorings/renamepackage/ApplicationPackageNameRefactoringTest.java b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/refactorings/renamepackage/ApplicationPackageNameRefactoringTest.java
deleted file mode 100644
index 0ac0344..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/refactorings/renamepackage/ApplicationPackageNameRefactoringTest.java
+++ /dev/null
@@ -1,128 +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.ide.eclipse.adt.internal.refactorings.renamepackage;
-
-import com.android.annotations.NonNull;
-import com.android.ide.eclipse.adt.internal.editors.manifest.ManifestInfo;
-import com.android.ide.eclipse.adt.internal.refactorings.core.RefactoringTestBase;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.jdt.core.dom.AST;
-import org.eclipse.jdt.core.dom.Name;
-
-@SuppressWarnings("javadoc")
-public class ApplicationPackageNameRefactoringTest extends RefactoringTestBase {
-    public void testRefactor1() throws Exception {
-        renamePackage(
-                TEST_PROJECT,
-                "my.pkg.name",
-
-                "CHANGES:\n" +
-                "-------\n" +
-                "[x] MainActivity.java - /testRefactor1/src/com/example/refactoringtest/MainActivity.java\n" +
-                "  @@ -7 +7\n" +
-                "  + import my.pkg.name.R;\n" +
-                "\n" +
-                "\n" +
-                "[x] Make Manifest edits - /testRefactor1/AndroidManifest.xml\n" +
-                "  @@ -3 +3\n" +
-                "  -     package=\"com.example.refactoringtest\"\n" +
-                "  +     package=\"my.pkg.name\"\n" +
-                "  @@ -25 +25\n" +
-                "  -             android:name=\".MainActivity2\"\n" +
-                "  +             android:name=\"com.example.refactoringtest.MainActivity2\"");
-    }
-
-    public void testRefactor2() throws Exception {
-        // Tests custom view handling
-        renamePackage(
-                TEST_PROJECT2,
-                "my.pkg.name",
-
-                "CHANGES:\n" +
-                "-------\n" +
-                "[x] MainActivity.java - /testRefactor2/src/com/example/refactoringtest/MainActivity.java\n" +
-                "  @@ -7 +7\n" +
-                "  + import my.pkg.name.R;\n" +
-                "\n" +
-                "\n" +
-                "[x] Make Manifest edits - /testRefactor2/AndroidManifest.xml\n" +
-                "  @@ -3 +3\n" +
-                "  -     package=\"com.example.refactoringtest\"\n" +
-                "  +     package=\"my.pkg.name\"\n" +
-                "  @@ -25 +25\n" +
-                "  -             android:name=\".MainActivity2\"\n" +
-                "  +             android:name=\"com.example.refactoringtest.MainActivity2\"");
-    }
-
-    public void testRefactor3() throws Exception {
-        // Tests BuildConfig imports and updates
-        renamePackage(
-                TEST_PROJECT3,
-                "my.pkg.name",
-
-                "CHANGES:\n" +
-                "-------\n" +
-                "[x] MoreCode.java - /testRefactor3/src/com/example/refactoringtest/subpkg/MoreCode.java\n" +
-                "  @@ -7 +7\n" +
-                "  - import com.example.refactoringtest.BuildConfig;\n" +
-                "  - import com.example.refactoringtest.Manifest;\n" +
-                "  - import com.example.refactoringtest.R;\n" +
-                "  + import my.pkg.name.BuildConfig;\n" +
-                "  + import my.pkg.name.Manifest;\n" +
-                "  + import my.pkg.name.R;\n" +
-                "\n" +
-                "\n" +
-                "[x] MainActivity.java - /testRefactor3/src/com/example/refactoringtest/MainActivity.java\n" +
-                "  @@ -7 +7\n" +
-                "  + import my.pkg.name.R;\n" +
-                "\n" +
-                "\n" +
-                "[x] Make Manifest edits - /testRefactor3/AndroidManifest.xml\n" +
-                "  @@ -3 +3\n" +
-                "  -     package=\"com.example.refactoringtest\"\n" +
-                "  +     package=\"my.pkg.name\"\n" +
-                "  @@ -25 +25\n" +
-                "  -             android:name=\".MainActivity2\"\n" +
-                "  +             android:name=\"com.example.refactoringtest.MainActivity2\"");
-    }
-
-    // ---- Test infrastructure ----
-
-    protected void renamePackage(
-            @NonNull Object[] testData,
-            @NonNull String newName,
-            @NonNull String expected) throws Exception {
-        IProject project = createProject(testData);
-        renamePackage(project, newName, expected);
-    }
-
-    protected void renamePackage(
-            @NonNull IProject project,
-            @NonNull String newName,
-            @NonNull String expected) throws Exception {
-        ManifestInfo info = ManifestInfo.get(project);
-        String currentPackage = info.getPackage();
-        assertNotNull(currentPackage);
-
-        final AST astValidator = AST.newAST(AST.JLS3);
-        Name oldPackageName = astValidator.newName(currentPackage);
-        Name newPackageName = astValidator.newName(newName);
-        ApplicationPackageNameRefactoring refactoring =
-                new ApplicationPackageNameRefactoring(project, oldPackageName, newPackageName);
-        checkRefactoring(refactoring, expected);
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/wizards/exportgradle/ExportGradleTest.java b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/wizards/exportgradle/ExportGradleTest.java
deleted file mode 100644
index f5cc58b..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/wizards/exportgradle/ExportGradleTest.java
+++ /dev/null
@@ -1,303 +0,0 @@
-/*
- * Copyright (C) 2013 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.wizards.exportgradle;
-
-import static com.android.sdklib.internal.project.ProjectProperties.PROPERTY_LIBRARY;
-
-import com.android.SdkConstants;
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.ide.eclipse.adt.AdtUtils;
-import com.android.ide.eclipse.adt.internal.editors.layout.refactoring.AdtProjectTest;
-import com.android.ide.eclipse.adt.internal.project.BaseProjectHelper;
-import com.android.ide.eclipse.adt.internal.sdk.ProjectState;
-import com.android.ide.eclipse.adt.internal.sdk.Sdk;
-import com.android.ide.eclipse.adt.internal.wizards.newproject.NewProjectCreator;
-import com.android.ide.eclipse.adt.internal.wizards.newproject.NewProjectWizardState;
-import com.android.ide.eclipse.adt.internal.wizards.newproject.NewProjectWizardState.Mode;
-import com.android.sdklib.internal.project.ProjectPropertiesWorkingCopy;
-import com.google.common.base.Charsets;
-import com.google.common.io.Files;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.core.runtime.QualifiedName;
-import org.eclipse.core.runtime.jobs.Job;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jface.operation.IRunnableContext;
-import org.eclipse.jface.operation.IRunnableWithProgress;
-
-import java.io.File;
-import java.lang.reflect.InvocationTargetException;
-import java.util.Collections;
-
-public class ExportGradleTest extends AdtProjectTest {
-    private QualifiedName ERROR_KEY = new QualifiedName(AdtPlugin.PLUGIN_ID, "JobErrorKey");
-    private Throwable mLastThrown;
-
-    @Override
-    public void setUp() throws Exception {
-        super.setUp();
-        mLastThrown = null;
-    }
-
-    @Override
-    protected boolean testCaseNeedsUniqueProject() {
-        return true;
-    }
-
-    public void testSimpleAndroidApp() throws Throwable {
-        IProject project = getProject("simple-app");
-        final IJavaProject javaProject = BaseProjectHelper.getJavaProject(project);
-
-        final ProjectSetupBuilder builder = new ProjectSetupBuilder();
-        builder.setProject(Collections.singletonList(javaProject));
-
-        Job job = new Job("Validate project") {
-            @Override
-            protected IStatus run(IProgressMonitor monitor) {
-                try {
-                    BuildFileCreator.createBuildFiles(builder, null, monitor);
-                    File buildfile = new File(javaProject.getResource().getLocation().toString(),
-                            BuildFileCreator.BUILD_FILE);
-                    assertTrue(buildfile.exists());
-                    String contents = Files.toString(buildfile, Charsets.UTF_8);
-                    String expectedContents =
-                            "buildscript {\n" +
-                            "    repositories {\n" +
-                            "        " + BuildFileCreator.MAVEN_REPOSITORY + "\n" +
-                            "    }\n" +
-                            "    dependencies {\n" +
-                            "        " + BuildFileCreator.PLUGIN_CLASSPATH + "\n" +
-                            "    }\n" +
-                            "}\n" +
-                            "apply plugin: 'android'\n" +
-                            "\n" +
-                            "dependencies {\n" +
-                            "}\n" +
-                            "\n" +
-                            "android {\n" +
-                            "    compileSdkVersion 16\n" +
-                            "    buildToolsVersion \"16\"\n" +
-                            "\n" +
-                            "    defaultConfig {\n" +
-                            "        minSdkVersion 1\n" +
-                            "        targetSdkVersion 1\n" +
-                            "    }\n" +
-                            "    sourceSets {\n" +
-                            "        main {\n" +
-                            "            manifest.srcFile 'AndroidManifest.xml'\n" +
-                            "            java.srcDirs = ['src']\n" +
-                            "            resources.srcDirs = ['src']\n" +
-                            "            aidl.srcDirs = ['src']\n" +
-                            "            renderscript.srcDirs = ['src']\n" +
-                            "            res.srcDirs = ['res']\n" +
-                            "            assets.srcDirs = ['assets']\n" +
-                            "        }\n" +
-                            "        instrumentTest.setRoot('tests')\n" +
-                            "    }\n" +
-                            "}";
-
-                    assertEqualsWhitespaceInsensitive(expectedContents, contents);
-                } catch (Throwable t) {
-                    mLastThrown = t;
-                }
-                return null;
-            }
-        };
-        job.schedule(1000);
-        job.join();
-        Object property = job.getProperty(ERROR_KEY);
-        assertNull(property);
-        if (mLastThrown != null) {
-            throw mLastThrown;
-        }
-    }
-
-    public void testSimpleAndroidLib() throws Throwable {
-        final IProject project = getProject("simple-library");
-        ProjectState projectState = Sdk.getProjectState(project.getProject());
-        ProjectPropertiesWorkingCopy propertiesWorkingCopy = projectState.getProperties().makeWorkingCopy();
-        propertiesWorkingCopy.setProperty(PROPERTY_LIBRARY, "true");
-        propertiesWorkingCopy.save();
-        IResource projectProp = project.findMember(SdkConstants.FN_PROJECT_PROPERTIES);
-        if (projectProp != null) {
-            projectProp.refreshLocal(IResource.DEPTH_ZERO, new NullProgressMonitor());
-        }
-
-        Job job = new Job("Validate project") {
-            @Override
-            protected IStatus run(IProgressMonitor monitor) {
-                try {
-                    IJavaProject javaProject = BaseProjectHelper.getJavaProject(project);
-
-                    final ProjectSetupBuilder builder = new ProjectSetupBuilder();
-                    builder.setProject(Collections.singletonList(javaProject));
-
-                    BuildFileCreator.createBuildFiles(builder, null, monitor);
-                    File buildfile = new File(javaProject.getResource().getLocation().toString(),
-                            BuildFileCreator.BUILD_FILE);
-                    assertTrue(buildfile.exists());
-                    String contents = Files.toString(buildfile, Charsets.UTF_8);
-                    String expectedContents =
-                            "buildscript {\n" +
-                            "    repositories {\n" +
-                            "        " + BuildFileCreator.MAVEN_REPOSITORY + "\n" +
-                            "    }\n" +
-                            "    dependencies {\n" +
-                            "        " + BuildFileCreator.PLUGIN_CLASSPATH + "\n" +
-                            "    }\n" +
-                            "}\n" +
-                            "apply plugin: 'android-library'\n" +
-                            "\n" +
-                            "dependencies {\n" +
-                            "}\n" +
-                            "\n" +
-                            "android {\n" +
-                            "    compileSdkVersion 16\n" +
-                            "    buildToolsVersion \"16\"\n" +
-                            "\n" +
-                            "    defaultConfig {\n" +
-                            "        minSdkVersion 1\n" +
-                            "        targetSdkVersion 1\n" +
-                            "    }\n" +
-                            "    sourceSets {\n" +
-                            "        main {\n" +
-                            "            manifest.srcFile 'AndroidManifest.xml'\n" +
-                            "            java.srcDirs = ['src']\n" +
-                            "            resources.srcDirs = ['src']\n" +
-                            "            aidl.srcDirs = ['src']\n" +
-                            "            renderscript.srcDirs = ['src']\n" +
-                            "            res.srcDirs = ['res']\n" +
-                            "            assets.srcDirs = ['assets']\n" +
-                            "        }\n" +
-                            "        instrumentTest.setRoot('tests')\n" +
-                            "    }\n" +
-                            "}";
-
-                    assertEqualsWhitespaceInsensitive(expectedContents, contents);
-                } catch (Throwable t) {
-                    mLastThrown = t;
-                }
-                return null;
-            }
-        };
-        job.schedule(1000);
-        job.join();
-        Object property = job.getProperty(ERROR_KEY);
-        assertNull(property);
-        if (mLastThrown != null) {
-            throw mLastThrown;
-        }
-    }
-
-    public void testPlainJavaProject() throws Throwable {
-        IProject project = getJavaProject("simple-java");
-        final IJavaProject javaProject = BaseProjectHelper.getJavaProject(project);
-
-        final ProjectSetupBuilder builder = new ProjectSetupBuilder();
-        builder.setProject(Collections.singletonList(javaProject));
-
-        BuildFileCreator.createBuildFiles(builder, null, null);
-        Job job = new Job("Validate project") {
-            @Override
-            protected IStatus run(IProgressMonitor monitor) {
-                try {
-                    File buildfile = new File(javaProject.getResource().getLocation().toString(), "build.gradle");
-                    assertTrue(buildfile.exists());
-                    String contents = Files.toString(buildfile, Charsets.UTF_8);
-                    String expectedContents =
-                            "apply plugin: 'java'\n" +
-                            "sourceSets {\n" +
-                            "    main.java.srcDirs = ['src']\n" +
-                            "}";
-
-                    assertEqualsWhitespaceInsensitive(expectedContents, contents);
-                } catch (Throwable t) {
-                    mLastThrown = t;
-                }
-                return null;
-            }
-        };
-        job.schedule(1000);
-        job.join();
-        Object property = job.getProperty(ERROR_KEY);
-        assertNull(property);
-        if (mLastThrown != null) {
-            throw mLastThrown;
-        }
-    }
-
-    protected IProject getProject(String projectName) {
-        IProject project = createProject(projectName);
-        assertNotNull(project);
-        if (!testCaseNeedsUniqueProject() && !testNeedsUniqueProject()) {
-            addCleanupDir(AdtUtils.getAbsolutePath(project).toFile());
-        }
-        addCleanupDir(project.getFullPath().toFile());
-        return project;
-    }
-
-    protected IProject getJavaProject(String projectName) {
-        IProject project = createJavaProject(projectName);
-        assertNotNull(project);
-        if (!testCaseNeedsUniqueProject() && !testNeedsUniqueProject()) {
-            addCleanupDir(AdtUtils.getAbsolutePath(project).toFile());
-        }
-        addCleanupDir(project.getFullPath().toFile());
-        return project;
-    }
-
-    protected IProject createJavaProject(String name) {
-        IRunnableContext context = new IRunnableContext() {
-            @Override
-            public void run(boolean fork, boolean cancelable, IRunnableWithProgress runnable)
-                    throws InvocationTargetException, InterruptedException {
-                runnable.run(new NullProgressMonitor());
-            }
-        };
-        NewProjectWizardState state = new NewProjectWizardState(Mode.ANY);
-        state.projectName = name;
-        state.packageName = TEST_PROJECT_PACKAGE;
-        state.activityName = name;
-        state.applicationName = name;
-        state.createActivity = false;
-        state.useDefaultLocation = true;
-        if (getMinSdk() != -1) {
-            state.minSdk = Integer.toString(getMinSdk());
-        }
-
-        NewProjectCreator creator = new NewProjectCreator(state, context);
-        creator.createJavaProjects();
-        return validateProjectExists(name);
-    }
-
-    /**
-     * Compares two strings, disregarding whitespace. This makes the test less brittle with respect
-     * to insignificant changes.
-     */
-    protected void assertEqualsWhitespaceInsensitive(String a, String b) {
-        a = stripWhitespace(a);
-        b = stripWhitespace(b);
-        assertEquals("Expected:\n" + a + "\nbut was:\n" + b + "\n\n", a, b);
-    }
-
-    protected String stripWhitespace(String s) {
-        return s.replaceAll("\\s","");
-    }
-}
\ No newline at end of file
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
deleted file mode 100644
index 9d3bc60..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/wizards/templates/TemplateHandlerTest.java
+++ /dev/null
@@ -1,901 +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.ide.eclipse.adt.internal.wizards.templates;
-
-import static com.android.SdkConstants.CURRENT_PLATFORM;
-import static com.android.SdkConstants.FD_TOOLS;
-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;
-import static com.android.ide.eclipse.adt.internal.wizards.templates.TemplateHandler.ATTR_ID;
-
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-import com.android.sdklib.SdkVersionInfo;
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.ide.eclipse.adt.AdtUtils;
-import com.android.ide.eclipse.adt.internal.lint.EclipseLintClient;
-import com.android.ide.eclipse.adt.internal.preferences.AdtPrefs;
-import com.android.ide.eclipse.adt.internal.sdk.Sdk;
-import com.android.ide.eclipse.tests.SdkLoadingTestCase;
-import com.android.sdklib.IAndroidTarget;
-import com.android.utils.GrabProcessOutput;
-import com.android.utils.GrabProcessOutput.IProcessOutput;
-import com.android.utils.GrabProcessOutput.Wait;
-import com.android.tools.lint.checks.ManifestDetector;
-import com.android.tools.lint.checks.SecurityDetector;
-import com.android.tools.lint.client.api.Configuration;
-import com.android.tools.lint.client.api.DefaultConfiguration;
-import com.android.tools.lint.client.api.JavaParser;
-import com.android.tools.lint.client.api.LintClient;
-import com.android.tools.lint.client.api.LintDriver;
-import com.android.tools.lint.client.api.XmlParser;
-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.Project;
-import com.android.tools.lint.detector.api.Scope;
-import com.android.tools.lint.detector.api.Severity;
-import com.android.tools.lint.detector.api.TextFormat;
-import com.google.common.base.Charsets;
-import com.google.common.base.Stopwatch;
-import com.google.common.collect.Lists;
-import com.google.common.collect.Sets;
-import com.google.common.io.Files;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.core.runtime.QualifiedName;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.core.runtime.jobs.Job;
-import org.eclipse.ltk.core.refactoring.Change;
-import org.eclipse.ltk.core.refactoring.CompositeChange;
-import org.w3c.dom.Element;
-
-import java.io.File;
-import java.io.IOException;
-import java.lang.reflect.InvocationTargetException;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-import java.util.Set;
-
-/**
- * Unit tests for template instantiation.
- * <p>
- * Note: This test can take multiple hours to run!
- *
- * <p>
- * TODO: Test all permutations of variables (it currently just varies one at a time with the
- *    rest of the defaults)
- * TODO: Test trying to change strings arguments (currently just varies enums and booleans)
- * TODO: Test adding multiple instances of the templates (to look for resource conflicts)
- */
-@SuppressWarnings("javadoc")
-public class TemplateHandlerTest extends SdkLoadingTestCase {
-    /**
-     * Flag used to quickly check each template once (for one version), to get
-     * quicker feedback on whether something is broken instead of waiting for
-     * all the versions for each template first
-     */
-    private static final boolean TEST_FEWER_API_VERSIONS = true;
-    private static final boolean TEST_JUST_ONE_MIN_SDK = false;
-    private static final boolean TEST_JUST_ONE_BUILD_TARGET = true;
-    private static final boolean TEST_JUST_ONE_TARGET_SDK_VERSION = true;
-    private QualifiedName ERROR_KEY = new QualifiedName(AdtPlugin.PLUGIN_ID, "JobErrorKey");
-    private static int sCount = 0;
-    /**
-     * If true, check this template with all the interesting (
-     * {@link #isInterestingApiLevel(int)}) api versions
-     */
-    private boolean mApiSensitiveTemplate;
-    /**
-     * Set of templates already tested with separate unit test; remainder is
-     * checked in {@link #testCreateRemainingProjects()}
-     */
-    private static final Set<File> sProjectTestedSeparately = Sets.newHashSet();
-    /**
-     * Set of templates already tested with separate unit test; remainder is
-     * checked in {@link #testCreateRemainingTemplates()}
-     */
-    private static final Set<File> sTemplateTestedSeparately = Sets.newHashSet();
-
-    @Override
-    protected void setUp() throws Exception {
-        super.setUp();
-        mApiSensitiveTemplate = true;
-    }
-
-    /**
-     * Is the given api level interesting for testing purposes? This is used to
-     * skip gaps, such that we for example only check say api 8, 9, 11, 14, etc
-     * -- versions where the <b>templates</b> are doing conditional changes. To
-     * be EXTRA comprehensive, occasionally try returning true unconditionally
-     * here to test absolutely everything.
-     */
-    private boolean isInterestingApiLevel(int api) {
-        // For templates that aren't API sensitive, only test with API = 16
-        if (!mApiSensitiveTemplate) {
-            return api == 16;
-        }
-
-        switch (api) {
-            case 1:
-            case 8:
-                return true;
-            case 11:
-                return true;
-            case 14:
-                return true;
-            case 9:
-            case 16:
-                return !TEST_FEWER_API_VERSIONS;
-            default:
-                return false;
-        }
-    }
-
-    public void testNewBlankProject() throws Exception {
-        Stopwatch stopwatch = Stopwatch.createUnstarted();
-        stopwatch.start();
-        checkProjectWithActivity(null);
-        stopwatch.stop();
-        System.out.println("Checked blank project successfully in "
-                + stopwatch.toString());
-    }
-
-    public void testNewBlankActivity() throws Exception {
-        checkCreateTemplate("activities", "BlankActivity");
-    }
-
-    public void testBlankActivityInProject() throws Exception {
-        checkCreateActivityInProject("BlankActivity");
-    }
-
-    public void testNewMasterDetailFlow() throws Exception {
-        checkCreateTemplate("activities", "MasterDetailFlow");
-    }
-
-    public void testMasterDetailFlowInProject() throws Exception {
-        checkCreateActivityInProject("MasterDetailFlow");
-    }
-
-    public void testNewFullscreen() throws Exception {
-        checkCreateTemplate("activities", "FullscreenActivity");
-    }
-
-    public void testFullscreenInProject() throws Exception {
-        checkCreateActivityInProject("FullscreenActivity");
-    }
-
-    public void testNewLoginActivity() throws Exception {
-        checkCreateTemplate("activities", "LoginActivity");
-    }
-
-    public void testLoginActivityInProject() throws Exception {
-        checkCreateActivityInProject("MasterDetailFlow");
-    }
-
-    public void testNewSettingsActivity() throws Exception {
-        checkCreateTemplate("activities", "SettingsActivity");
-    }
-
-    public void testSettingsActivityInProject() throws Exception {
-        checkCreateActivityInProject("SettingsActivity");
-    }
-
-    public void testNewBroadcastReceiver() throws Exception {
-        // No need to try this template with multiple platforms, one is adequate
-        mApiSensitiveTemplate = false;
-        checkCreateTemplate("other", "BroadcastReceiver");
-    }
-
-    public void testNewContentProvider() throws Exception {
-        mApiSensitiveTemplate = false;
-        checkCreateTemplate("other", "ContentProvider");
-    }
-
-    public void testNewCustomView() throws Exception {
-        mApiSensitiveTemplate = false;
-        checkCreateTemplate("other", "CustomView");
-    }
-
-    public void testNewService() throws Exception {
-        mApiSensitiveTemplate = false;
-        checkCreateTemplate("other", "Service");
-    }
-
-    public void testCreateRemainingTemplates() throws Exception {
-        sCount = 0;
-        long begin = System.currentTimeMillis();
-        TemplateManager manager = new TemplateManager();
-        List<File> other = manager.getTemplates("other");
-        for (File templateFile : other) {
-            if (sTemplateTestedSeparately.contains(templateFile)) {
-                continue;
-            }
-            checkTemplate(templateFile);
-        }
-        // Also try creating templates, not as part of creating a project
-        List<File> activities = manager.getTemplates("activities");
-        for (File templateFile : activities) {
-            if (sTemplateTestedSeparately.contains(templateFile)) {
-                continue;
-            }
-            checkTemplate(templateFile);
-        }
-        long end = System.currentTimeMillis();
-        System.out.println("Successfully checked " + sCount + " template permutations in "
-                + ((end - begin) / (1000 * 60)) + " minutes");
-    }
-
-    public void testCreateRemainingProjects() throws Exception {
-        sCount = 0;
-        long begin = System.currentTimeMillis();
-        TemplateManager manager = new TemplateManager();
-        List<File> templates = manager.getTemplates("activities");
-        for (File activityFile : templates) {
-            if (sTemplateTestedSeparately.contains(activityFile)) {
-                continue;
-            }
-            checkProjectWithActivity(activityFile.getName());
-        }
-        long end = System.currentTimeMillis();
-        System.out.println("Successfully checked " + sCount + " project permutations in "
-                + ((end - begin) / (1000 * 60)) + " minutes");
-    }
-
-    // ---- Test support code below ----
-
-    private void checkCreateActivityInProject(String activityName) throws Exception {
-        Stopwatch stopwatch = Stopwatch.createUnstarted();
-        stopwatch.start();
-        File templateFile = findTemplate("activities", activityName);
-        sProjectTestedSeparately.add(templateFile);
-        checkProjectWithActivity(templateFile.getName());
-        stopwatch.stop();
-        System.out.println("Checked " + templateFile.getName() + " successfully in "
-                + stopwatch.toString());
-    }
-
-    private void checkCreateTemplate(String category, String name) throws Exception {
-        Stopwatch stopwatch = Stopwatch.createUnstarted();
-        stopwatch.start();
-        File templateFile = findTemplate(category, name);
-        assertNotNull(templateFile);
-        sTemplateTestedSeparately.add(templateFile);
-        checkTemplate(templateFile);
-        stopwatch.stop();
-        System.out.println("Checked " + templateFile.getName() + " successfully in "
-                + stopwatch.toString());
-    }
-
-    private static File findTemplate(String category, String name) {
-        File templateRootFolder = TemplateManager.getTemplateRootFolder();
-        assertNotNull(templateRootFolder);
-        File file = new File(templateRootFolder, category + File.separator + name);
-        assertTrue(file.getPath(), file.exists());
-        return file;
-    }
-
-    private void checkTemplate(File templateFile) throws Exception {
-        NewProjectWizardState values = new NewProjectWizardState();
-        values.applicationName = "My Application";
-        values.packageName = "my.pkg2";
-
-        values.isLibrary = false;
-        values.createIcon = false;
-        values.useDefaultLocation = true;
-        values.createActivity = false;
-
-        String projectNameBase = "MyTemplateProject_" + templateFile.getName();
-        values.projectName = projectNameBase;
-        values.createActivity = false;
-
-        // Create the new template
-
-        NewTemplateWizardState state = new NewTemplateWizardState();
-        state.setTemplateLocation(templateFile);
-        state.minSdkLevel = values.minSdkLevel;
-
-        // Iterate over all (valid) combinations of build target, minSdk and targetSdk
-        IAndroidTarget[] targets = Sdk.getCurrent().getTargets();
-        for (int i = targets.length - 1; i >= 0; i--) {
-            IAndroidTarget target = targets[i];
-            if (!target.isPlatform()) {
-                continue;
-            }
-            if (!isInterestingApiLevel(target.getVersion().getApiLevel())) {
-                continue;
-            }
-
-            for (int minSdk = 1;
-                     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 <= SdkVersionInfo.HIGHEST_KNOWN_API;
-                         targetSdk++) {
-                    if (!isInterestingApiLevel(targetSdk)) {
-                        continue;
-                    }
-
-                    // Make sure this template is supported with these versions
-                    IStatus status = values.template.validateTemplate(
-                            minSdk, target.getVersion().getApiLevel());
-                    if (status != null && !status.isOK()) {
-                        continue;
-                    }
-
-                    // Also make sure activity is enabled for these versions
-                    status = state.getTemplateHandler().validateTemplate(
-                            minSdk, target.getVersion().getApiLevel());
-                    if (status != null && !status.isOK()) {
-                        continue;
-                    }
-
-                    // Iterate over all new new project templates
-
-                    // should I try all options of theme with all platforms?
-                    // or just try all platforms, with one setting for each?
-                    // doesn't seem like I need to multiply
-                    // just pick the best setting that applies instead for each platform
-                    List<Parameter> parameters = values.template.getTemplate().getParameters();
-                projectParameters:
-                    for (Parameter parameter : parameters) {
-                        List<Element> options = parameter.getOptions();
-                        if (parameter.type == Parameter.Type.ENUM) {
-                            for (Element element : options) {
-                                Option option = Option.get(element);
-                                String optionId = option.id;
-                                int optionMinSdk = option.minSdk;
-                                int optionMinBuildApi = option.minBuild;
-                                if (optionMinSdk <= minSdk &&
-                                        optionMinBuildApi <= target.getVersion().getApiLevel()) {
-                                    values.parameters.put(parameter.id, optionId);
-                                    if (parameter.id.equals("baseTheme")) {
-                                        String base = projectNameBase + "_min_" + minSdk
-                                                + "_target_" + targetSdk
-                                                + "_build_" + target.getVersion().getApiLevel()
-                                                + "_theme_" + optionId;
-                                        System.out.println("checking base " + base);
-
-                                        checkApiTarget(minSdk, targetSdk, target, values, base,
-                                                state);
-                                        break projectParameters;
-                                    }
-                                }
-                            }
-                        }
-                    }
-
-                    if (TEST_JUST_ONE_TARGET_SDK_VERSION) {
-                        break;
-                    }
-                }
-
-                if (TEST_JUST_ONE_MIN_SDK) {
-                    break;
-                }
-            }
-
-            if (TEST_JUST_ONE_BUILD_TARGET) {
-                break;
-            }
-        }
-    }
-
-    private void checkProjectWithActivity(String activity) throws Exception {
-        NewProjectWizardState values = new NewProjectWizardState();
-        values.applicationName = "My Application";
-        values.packageName = "my.pkg";
-
-        values.isLibrary = false;
-        values.createIcon = false;
-        values.useDefaultLocation = true;
-
-        // These are basically unused; passed as defaults
-        values.activityName = activity == null ? "Blank" : activity;
-        values.activityTitle = "My Activity Title";
-
-        String projectNameBase = "MyProject_" + values.activityName;
-        values.projectName = projectNameBase;
-
-        values.createActivity = activity != null;
-        NewTemplateWizardState activityValues = values.activityValues;
-        assertNotNull(activityValues);
-        activityValues.minSdkLevel = values.minSdkLevel;
-
-
-        // Iterate over all (valid) combinations of build target, minSdk and targetSdk
-        IAndroidTarget[] targets = Sdk.getCurrent().getTargets();
-        for (int i = targets.length - 1; i >= 0; i--) {
-            IAndroidTarget target = targets[i];
-            if (!target.isPlatform()) {
-                continue;
-            }
-            if (!isInterestingApiLevel(target.getVersion().getApiLevel())) {
-                continue;
-            }
-
-            for (int minSdk = 1;
-                     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 <= SdkVersionInfo.HIGHEST_KNOWN_API;
-                         targetSdk++) {
-                    if (!isInterestingApiLevel(targetSdk)) {
-                        continue;
-                    }
-
-                    // Make sure this template is supported with these versions
-                    IStatus status = values.template.validateTemplate(
-                            values.minSdkLevel, values.getBuildApi());
-                    if (status != null && !status.isOK()) {
-                        continue;
-                    }
-
-                    // Also make sure activity is enabled for these versions
-                    status = values.activityValues.getTemplateHandler().validateTemplate(
-                            values.minSdkLevel, values.getBuildApi());
-                    if (status != null && !status.isOK()) {
-                        continue;
-                    }
-
-                    // Iterate over all new new project templates
-
-                    // should I try all options of theme with all platforms?
-                    // or just try all platforms, with one setting for each?
-                    // doesn't seem like I need to multiply
-                    // just pick the best setting that applies instead for each platform
-                    List<Parameter> parameters = values.template.getTemplate().getParameters();
-                    for (Parameter parameter : parameters) {
-                        List<Element> options = parameter.getOptions();
-                        if (parameter.type == Parameter.Type.ENUM) {
-                            for (Element element : options) {
-                                Option option = Option.get(element);
-                                String optionId = option.id;
-                                int optionMinSdk = option.minSdk;
-                                int optionMinBuildApi = option.minBuild;
-                                if (optionMinSdk <= minSdk &&
-                                        optionMinBuildApi <= target.getVersion().getApiLevel()) {
-                                    values.parameters.put(parameter.id, optionId);
-                                    if (parameter.id.equals("baseTheme")) {
-                                        String base = projectNameBase + "_min_" + minSdk
-                                                + "_target_" + targetSdk
-                                                + "_build_" + target.getVersion().getApiLevel()
-                                                + "_theme_" + optionId;
-                                        System.out.println("checking base " + base);
-
-                                        checkApiTarget(minSdk, targetSdk, target, values, base,
-                                                null);
-
-                                    }
-                                }
-                            }
-                        }
-                    }
-
-                    if (TEST_JUST_ONE_TARGET_SDK_VERSION) {
-                        break;
-                    }
-                }
-
-                if (TEST_JUST_ONE_MIN_SDK) {
-                    break;
-                }
-            }
-
-            if (TEST_JUST_ONE_BUILD_TARGET) {
-                break;
-            }
-        }
-    }
-
-    private void checkApiTarget(
-            int minSdk,
-            int targetSdk,
-            @NonNull IAndroidTarget target,
-            @NonNull NewProjectWizardState projectValues,
-            @NonNull String projectNameBase,
-            @Nullable NewTemplateWizardState templateValues)
-            throws Exception {
-        NewTemplateWizardState values =
-                projectValues.createActivity ? projectValues.activityValues : templateValues;
-
-        projectValues.minSdk = Integer.toString(minSdk);
-        projectValues.minSdkLevel = minSdk;
-        projectValues.targetSdkLevel = targetSdk;
-        projectValues.target = target;
-
-        if (values == null) {
-            checkProject(projectValues, templateValues);
-            return;
-        }
-
-        // Next check all other parameters, cycling through booleans and enums.
-        TemplateHandler templateHandler = values.getTemplateHandler();
-        TemplateMetadata template = templateHandler.getTemplate();
-        assertNotNull(template);
-        List<Parameter> parameters = template.getParameters();
-
-        if (!projectValues.createActivity) {
-            for (Parameter parameter : parameters) {
-                values.parameters.put(parameter.id, parameter.value);
-            }
-        }
-
-        for (Parameter parameter : parameters) {
-            if (parameter.type == Parameter.Type.SEPARATOR
-                    || parameter.type == Parameter.Type.STRING) {
-                // TODO: Consider whether we should attempt some strings here
-                continue;
-            }
-
-            // The initial (default value); revert to this one after cycling,
-            Object initial = values.parameters.get(parameter.id);
-
-            if (parameter.type == Parameter.Type.ENUM) {
-                List<Element> options = parameter.getOptions();
-                for (Element element : options) {
-                    Option option = Option.get(element);
-                    String optionId = option.id;
-                    int optionMinSdk = option.minSdk;
-                    int optionMinBuildApi = option.minBuild;
-                    if (projectValues.minSdkLevel >= optionMinSdk &&
-                            projectValues.getBuildApi() >= optionMinBuildApi) {
-                        values.parameters.put(parameter.id, optionId);
-                        projectValues.projectName = projectNameBase + "_" + parameter.id
-                                + "_" + optionId;
-                        checkProject(projectValues, templateValues);
-                    }
-                }
-            } else {
-                assert parameter.type == Parameter.Type.BOOLEAN;
-                if (parameter.id.equals("isLauncher") && projectValues.createActivity) {
-                    // Skipping this one: always true when launched from new project
-                    continue;
-                }
-                boolean value = false;
-                values.parameters.put(parameter.id, value);
-                projectValues.projectName = projectNameBase + "_" + parameter.id
-                        + "_" + value;
-                checkProject(projectValues, templateValues);
-
-                value = true;
-                values.parameters.put(parameter.id, value);
-                projectValues.projectName = projectNameBase + "_" + parameter.id
-                        + "_" + value;
-                checkProject(projectValues, templateValues);
-            }
-
-            values.parameters.put(parameter.id, initial);
-        }
-    }
-
-    private final class OutputGrabber implements IProcessOutput {
-        private final List<String> output = Lists.newArrayList();
-        private final List<String> error = Lists.newArrayList();
-
-        @Override
-        public void out(@Nullable String line) {
-            if (line != null) {
-                output.add(line);
-            }
-        }
-
-        @Override
-        public void err(@Nullable String line) {
-            if (line != null) {
-                error.add(line);
-            }
-        }
-
-        @NonNull
-        private List<String> getOutput() {
-            return output;
-        }
-
-        @NonNull
-        private List<String> getError() {
-            return error;
-        }
-    }
-
-    private static class Option {
-        private String id;
-        private int minSdk;
-        private int minBuild;
-
-        public Option(String id, int minSdk, int minBuild) {
-            this.id = id;
-            this.minSdk = minSdk;
-            this.minBuild = minBuild;
-        }
-
-        private static Option get(Element option) {
-            String optionId = option.getAttribute(ATTR_ID);
-            String minApiString = option.getAttribute(ATTR_MIN_API);
-            int optionMinSdk = 1;
-            if (minApiString != null && !minApiString.isEmpty()) {
-                try {
-                    optionMinSdk = Integer.parseInt(minApiString);
-                } catch (NumberFormatException nufe) {
-                    // Templates aren't allowed to contain codenames, should
-                    // always be an integer
-                    AdtPlugin.log(nufe, null);
-                    optionMinSdk = 1;
-                }
-            }
-            String minBuildApiString = option.getAttribute(ATTR_MIN_BUILD_API);
-            int optionMinBuildApi = 1;
-            if (minBuildApiString != null && !minBuildApiString.isEmpty()) {
-                try {
-                    optionMinBuildApi = Integer.parseInt(minBuildApiString);
-                } catch (NumberFormatException nufe) {
-                    // Templates aren't allowed to contain codenames, should
-                    // always be an integer
-                    AdtPlugin.log(nufe, null);
-                    optionMinBuildApi = 1;
-                }
-            }
-
-
-            return new Option(optionId, optionMinSdk, optionMinBuildApi);
-        }
-    }
-
-    private void checkProject(
-            @NonNull NewProjectWizardState projectValues,
-            @Nullable NewTemplateWizardState templateValues) throws Exception {
-        NewTemplateWizardState values =
-                projectValues.createActivity ? projectValues.activityValues : templateValues;
-        if (values != null) { // if not, creating blank project
-            // Validate that a template is only being used in a context it is compatible with!
-            IStatus status = values.getTemplateHandler().validateTemplate(
-                    projectValues.minSdkLevel, projectValues.getBuildApi());
-            if (status != null && !status.isOK()) {
-                fail(status.toString());
-            }
-        }
-
-        assertNotNull(projectValues.projectName);
-        projectValues.projectName = AdtUtils.getUniqueProjectName(projectValues.projectName, "");
-        IPath workspace = Platform.getLocation();
-        String projectLocation = workspace.append(projectValues.projectName).toOSString();
-        projectValues.projectLocation = projectLocation;
-
-        // Create project with the given parameter map
-        final IProject project = createProject(projectValues);
-        assertNotNull(project);
-
-        if (templateValues != null) {
-            templateValues.project = project;
-            List<Change> changes = templateValues.computeChanges();
-            if (!changes.isEmpty()) {
-                try {
-                    CompositeChange composite = new CompositeChange("",
-                            changes.toArray(new Change[changes.size()]));
-                    composite.perform(new NullProgressMonitor());
-                } catch (CoreException e) {
-                    fail(e.getLocalizedMessage());
-                }
-            }
-        }
-
-        // Project creation has some async hooks so don't attempt to build it *right* away
-        Job job = new Job("Validate project") {
-            @Override
-            protected IStatus run(IProgressMonitor monitor) {
-                try {
-                    ensureValidProject(this, project);
-                    return Status.OK_STATUS;
-                } catch (Exception e) {
-                    fail(e.toString());
-                }
-                return null;
-            }
-        };
-        job.schedule(1000);
-        job.join();
-        Object property = job.getProperty(ERROR_KEY);
-        assertNull(property);
-    }
-
-    private IProject createProject(NewProjectWizardState values) throws InvocationTargetException {
-        NewProjectWizard wizard = new NewProjectWizard();
-        wizard.setValues(values);
-        wizard.performFinish(new NullProgressMonitor());
-
-        if (TemplateHandler.sMostRecentException != null) {
-            fail(values.projectName + ": " + TemplateHandler.sMostRecentException.toString());
-        }
-
-        IProject project = wizard.getProject();
-        assertNotNull(project);
-        assertTrue(project.exists());
-        System.out.println("Created project " + project + " : " + AdtUtils.getAbsolutePath(project));
-        return project;
-    }
-
-    private void ensureValidProject(@NonNull Job job, @NonNull IProject project) throws Exception {
-        System.out.println("Begin build error check");
-        ensureNoBuildErrors(job, project);
-        System.out.println("Finished build error check");
-
-        System.out.println("Begin lint check");
-        ensureNoLintWarnings(job, project);
-        System.out.println("Finished lint check");
-
-        sCount++;
-    }
-
-    private void ensureNoLintWarnings(final Job job, IProject project) {
-        System.setProperty("com.android.tools.lint.bindir", AdtPrefs.getPrefs().getOsSdkFolder()
-                + File.separator + FD_TOOLS);
-
-        LintDriver driver = new LintDriver(EclipseLintClient.getRegistry(), new LintClient() {
-            @Override
-            public void report(@NonNull Context context,
-                    @NonNull Issue issue, @NonNull Severity severity,
-                    @Nullable Location location, @NonNull String message, @NonNull TextFormat format) {
-                String s = "Found lint error: " + issue.getId() + ": " + message + " at " + location;
-                job.setProperty(ERROR_KEY, s);
-                fail(s);
-            }
-
-            @Override
-            public Configuration getConfiguration(@NonNull Project p) {
-                return new DefaultConfiguration(this, p, null, new File("dummy.xml")) {
-                    @Override
-                    public boolean isEnabled(@NonNull Issue issue) {
-                        // Doesn't work: hangs in unit test context, something about
-                        // loading native libs.
-                        if (issue.getCategory() == Category.ICONS){
-                            return false;
-                        }
-
-                        if (issue == ManifestDetector.TARGET_NEWER) {
-                            // Don't complain about targetSdk < latest: we're deliberately
-                            // testing that (to make sure templates compile etc in compat
-                            // mode)
-                            return false;
-                        }
-
-                        if (issue == SecurityDetector.EXPORTED_SERVICE
-                                || issue == SecurityDetector.EXPORTED_PROVIDER
-                                || issue == SecurityDetector.EXPORTED_RECEIVER) {
-                            // Don't complain about missing permissions when exporting: the
-                            // unit test is deliberately turning on exported
-                            return false;
-                        }
-
-                        return true;
-                    }
-                };
-            }
-
-            @Override
-            @NonNull
-            public String readFile(@NonNull File file) {
-                try {
-                    return Files.toString(file, Charsets.UTF_8);
-                } catch (IOException e) {
-                    fail(e.toString() + " for " + file.getPath());
-                    return "";
-                }
-            }
-
-            @Override
-            public void log(@NonNull Severity severity, @Nullable Throwable exception,
-                    @Nullable String format, @Nullable Object... args) {
-                if (exception != null) {
-                    exception.printStackTrace();
-                }
-                if (format != null) {
-                    if (args != null) {
-                        System.err.println("Log: " + String.format(format, args));
-                    } else {
-                        System.err.println("Unexpected log message " + format);
-                    }
-                }
-            }
-
-            @Override
-            @Nullable
-            public JavaParser getJavaParser(@Nullable Project project) {
-                return new EclipseLintClient(null, null, null, false).getJavaParser(project);
-            }
-
-            @Override
-            public XmlParser getXmlParser() {
-                return new EclipseLintClient(null, null, null, false).getXmlParser();
-            }
-        });
-        File projectDir = AdtUtils.getAbsolutePath(project).toFile();
-        assertNotNull(projectDir);
-        assertTrue(projectDir.getPath(), projectDir.isDirectory());
-        driver.analyze(Collections.singletonList(projectDir), Scope.ALL);
-    }
-
-    // Wait for test build support.
-    // This is copied from {@link SampleProjectTest}
-
-    private void ensureNoBuildErrors(final Job job, final IProject project) throws Exception {
-        File projectDir = AdtUtils.getAbsolutePath(project).toFile();
-
-        // Checking the build in Eclipse doesn't work well, because of asynchronous issues
-        // (it looks like not all necessary changes are applied, and even adding waits works
-        // unpredictably.)
-        //
-        // So instead we do it via the command line.
-        // First add ant support:
-        //     $ android update project -p .
-        // Then we run ant and look at the exit code to make sure it worked.
-
-        List<String> command = new ArrayList<String>();
-        command.add(AdtPlugin.getOsSdkToolsFolder() + "android" +
-                (CURRENT_PLATFORM == PLATFORM_WINDOWS ? ".bat" : ""));
-        command.add("update");
-        command.add("project");
-        command.add("-p");
-        command.add(projectDir.getPath());
-
-        // launch the command line process
-        Process process = Runtime.getRuntime().exec(command.toArray(new String[command.size()]));
-
-
-        OutputGrabber processOutput = new OutputGrabber();
-        int status = GrabProcessOutput.grabProcessOutput(
-                process,
-                Wait.WAIT_FOR_READERS, // we really want to make sure we get all the output!
-                processOutput);
-        if (status != 0) {
-            fail(processOutput.getOutput().toString() + processOutput.getError().toString());
-        }
-        assertEquals(0, status);
-
-        // Run ant
-        String antCmd = "ant" + (CURRENT_PLATFORM == PLATFORM_WINDOWS ? ".bat" : "");
-        String antTarget = "debug";
-        process = Runtime.getRuntime().exec(antCmd + " " + antTarget, null, projectDir);
-        processOutput = new OutputGrabber();
-        status = GrabProcessOutput.grabProcessOutput(
-                process,
-                Wait.WAIT_FOR_READERS, // we really want to make sure we get all the output!
-                processOutput);
-        if (status != 0) {
-            fail(processOutput.getOutput().toString() + processOutput.getError().toString());
-        }
-        assertEquals(0, status);
-        System.out.println("Ant succeeded (code=" + status + ")");
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/tests/AdtTestData.java b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/tests/AdtTestData.java
deleted file mode 100644
index c86f4cf..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/tests/AdtTestData.java
+++ /dev/null
@@ -1,135 +0,0 @@
-/*
- * 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.tests;
-
-import com.android.SdkConstants;
-import com.android.ide.eclipse.adt.AdtConstants;
-import com.android.ide.eclipse.adt.AdtPlugin;
-
-import org.eclipse.core.runtime.FileLocator;
-import org.eclipse.core.runtime.Platform;
-
-import java.io.File;
-import java.io.IOException;
-import java.net.URL;
-import java.util.logging.Logger;
-
-/**
- * Helper class for retrieving test data
- * <p/>
- * All tests which need to retrieve paths to test data files should go through this class.
- */
-public class AdtTestData {
-
-    /** singleton instance */
-    private static AdtTestData sInstance = null;
-    private static final Logger sLogger = Logger.getLogger(AdtTestData.class.getName());
-
-    /** The prefered directory separator to use. */
-    private static final String DIR_SEP_STR  = "/";
-    private static final char   DIR_SEP_CHAR = '/';
-
-    /** The absolute file path to the plugin's contents. */
-    private String mOsRootDataPath;
-
-    private AdtTestData() {
-        // can set test_data env variable to override default behavior of
-        // finding data using class loader
-        // useful when running in plugin environment, where test data is inside
-        // bundled jar, and must be extracted to temp filesystem location to be
-        // accessed normally
-        mOsRootDataPath = System.getProperty("test_data");
-        if (mOsRootDataPath == null) {
-            sLogger.info("Cannot find test_data environment variable, init to class loader");
-            URL url = this.getClass().getClassLoader().getResource(".");  //$NON-NLS-1$
-
-            if (Platform.isRunning()) {
-                sLogger.info("Running as an Eclipse Plug-in JUnit test, using FileLocator");
-                try {
-                    mOsRootDataPath = FileLocator.resolve(url).getFile();
-                    if (SdkConstants.currentPlatform() == SdkConstants.PLATFORM_WINDOWS) {
-                        // Fix the path returned by the URL resolver
-                        // so that it actually works on Windows.
-
-                        // First, Windows paths don't start with a / especially
-                        // if they contain a drive spec such as C:/...
-                        int pos = mOsRootDataPath.indexOf(':');
-                        if (pos > 0 && mOsRootDataPath.charAt(0) == '/') {
-                            mOsRootDataPath = mOsRootDataPath.substring(1);
-                        }
-
-                        // Looking for "." probably inserted a /./, so clean it up
-                        mOsRootDataPath = mOsRootDataPath.replace("/./", "/");
-                    }
-                } catch (IOException e) {
-                    sLogger.warning("IOException while using FileLocator, reverting to url");
-                    mOsRootDataPath = url.getFile();
-                }
-            } else {
-                sLogger.info("Running as an plain JUnit test, using url as-is");
-                mOsRootDataPath = url.getFile();
-            }
-        }
-
-        if (mOsRootDataPath.equals(AdtConstants.WS_SEP)) {
-            sLogger.warning("Resource data not found using class loader!, Defaulting to no path");
-        }
-
-        if (File.separatorChar == '\\') {
-            // On Windows, uniformize all separators to use the / convention
-            mOsRootDataPath.replace('\\', DIR_SEP_CHAR);
-        }
-
-        if (!mOsRootDataPath.endsWith(File.separator) && !mOsRootDataPath.endsWith(DIR_SEP_STR)) {
-            sLogger.info("Fixing test_data env variable (does not end with path separator)");
-            mOsRootDataPath += DIR_SEP_STR;
-        }
-    }
-
-    /** Get the singleton instance of AdtTestData */
-    public static AdtTestData getInstance() {
-        if (sInstance == null) {
-            sInstance = new AdtTestData();
-        }
-        return sInstance;
-    }
-
-    /**
-     * Returns the absolute file path to a file located in this plugin.
-     *
-     * @param osRelativePath {@link String} path to file contained in plugin. Must
-     * use path separators appropriate to host OS
-     *
-     * @return absolute OS path to test file
-     */
-    public String getTestFilePath(String osRelativePath) {
-        File path = new File(mOsRootDataPath, osRelativePath);
-
-        if (!path.exists()) {
-            // On Windows at least this ends up using the wrong plugin path.
-            String pkgAdt   = AdtPlugin  .class.getPackage().getName();
-            String pkgTests = AdtTestData.class.getPackage().getName();
-
-            if (mOsRootDataPath.contains(pkgAdt)) {
-                path = new File(mOsRootDataPath.replace(pkgAdt, pkgTests), osRelativePath);
-            }
-
-            assert path.exists();
-        }
-
-        return path.getAbsolutePath();
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/tests/AllTests.java b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/tests/AllTests.java
deleted file mode 100644
index 5386142..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/tests/AllTests.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * 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.tests;
-
-import junit.framework.TestSuite;
-
-
-/**
- * Container TestSuite for all eclipse tests, both functional and unit
- */
-public class AllTests extends TestSuite {
-
-    public AllTests() {
-
-    }
-
-    /**
-     * Returns a suite of test cases to be run.
-     */
-    public static TestSuite suite() {
-        TestSuite suite = new TestSuite();
-        suite.addTest(FuncTests.suite());
-        suite.addTest(UnitTests.suite());
-        return suite;
-    }
-
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/tests/EclipseTestCollector.java b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/tests/EclipseTestCollector.java
deleted file mode 100644
index 6bbc955..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/tests/EclipseTestCollector.java
+++ /dev/null
@@ -1,121 +0,0 @@
-/*
- * 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.tests;
-
-import org.eclipse.core.runtime.Plugin;
-
-import java.lang.reflect.Modifier;
-import java.net.URL;
-import java.util.Enumeration;
-
-import junit.framework.TestCase;
-import junit.framework.TestSuite;
-
-/**
- * Class for collecting all test cases in an eclipse plugin
- *
- */
-public class EclipseTestCollector {
-
-    /**
-     * Constructor
-     */
-    public EclipseTestCollector() {
-
-    }
-
-    /**
-     * Searches through given plugin, adding all TestCase classes to given suite
-     * @param suite - TestSuite to add to
-     * @param plugin - Plugin to search for tests
-     * @param expectedPackage - expected package for tests. Only test classes
-     *  that start with this package name will be added to suite
-     */
-    @SuppressWarnings({"cast", "unchecked"})
-    public void addTestCases(TestSuite suite, Plugin plugin, String expectedPackage) {
-        if (plugin != null) {
-            Enumeration<?> entries = plugin.getBundle().findEntries("/", "*.class", true);
-
-            while (entries.hasMoreElements()) {
-                URL entry = (URL)entries.nextElement();
-                String filePath = entry.getPath().replace(".class", "");
-                try {
-                  Class<?> testClass = getClass(filePath, expectedPackage);
-                  if (isTestClass(testClass)) {
-                      // In Eclipse 3.6 RCP Windows-x64, the signature has changed from
-                      //    addTestSuite(Class)
-                      // to:
-                      //    addTestSuite(Class<? extends TestCase>)
-                      // which is enough to create an error. To solve it, we cast into the
-                      // generics expected by the JUnit framework used by 3.6 and suppress the
-                      // warnings generated by the compiler under 3.5
-                      suite.addTestSuite((Class<? extends TestCase>)testClass);
-                  }
-                }
-                catch (ClassNotFoundException e) {
-                  // ignore, this is not the class we're looking for
-                  //sLogger.log(Level.INFO, "Could not load class " + filePath);
-              }
-            }
-        }
-    }
-
-    /**
-     * Returns true if given class should be added to suite
-     */
-    protected boolean isTestClass(Class<?> testClass) {
-        return TestCase.class.isAssignableFrom(testClass) &&
-          Modifier.isPublic(testClass.getModifiers()) &&
-          hasPublicConstructor(testClass);
-    }
-
-    /**
-     * Returns true if given class has a public constructor
-     */
-    @SuppressWarnings({"unchecked", "cast"})
-    protected boolean hasPublicConstructor(Class<?> testClass) {
-        try {
-            // In Eclipse 3.6 RCP Windows-x64, the signature has changed from
-            //    getTestConstructor(Class)
-            // to:
-            //    getTestConstructor(Class<? extends TestCase>)
-            // which is enough to create an error. To solve it, we cast into the
-            // generics expected by the JUnit framework used by 3.6 and suppress the
-            // warnings generated by the compiler under 3.5
-            TestSuite.getTestConstructor((Class<? extends TestCase>) testClass);
-        } catch(NoSuchMethodException e) {
-            return false;
-        }
-        return true;
-    }
-
-    /**
-     * Load the class given by the plugin aka bundle file path
-     * @param filePath - path of class in bundle
-     * @param expectedPackage - expected package of class
-     * @throws ClassNotFoundException
-     */
-    protected Class<?> getClass(String filePath, String expectedPackage) throws ClassNotFoundException {
-        String dotPath = filePath.replace('/', '.');
-        // remove the output folders, by finding where package name starts
-        int index = dotPath.indexOf(expectedPackage);
-        if (index == -1) {
-            throw new ClassNotFoundException();
-        }
-        String packagePath = dotPath.substring(index);
-        return Class.forName(packagePath);
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/tests/FuncTests.java b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/tests/FuncTests.java
deleted file mode 100644
index efa8801..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/tests/FuncTests.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * 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.tests;
-
-import com.android.ide.eclipse.tests.functests.layoutRendering.ApiDemosRenderingTest;
-
-import junit.framework.TestSuite;
-
-/**
- * Container TestSuite for all eclipse tests to be run
- */
-
-public class FuncTests extends TestSuite {
-
-    static final String FUNC_TEST_PACKAGE = "com.android.ide.eclipse.tests.functests";
-
-    public FuncTests() {
-
-    }
-
-    /**
-     * Returns a suite of test cases to be run.
-     * Needed for JUnit3 compliant command line test runner
-     */
-    public static TestSuite suite() {
-        TestSuite suite = new TestSuite();
-
-        // TODO: uncomment this when 'gen' folder error on create is fixed
-        // suite.addTestSuite(SampleProjectTest.class);
-        suite.addTestSuite(ApiDemosRenderingTest.class);
-
-        return suite;
-    }
-
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/tests/SdkLoadingTestCase.java b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/tests/SdkLoadingTestCase.java
deleted file mode 100644
index 65ce8e1..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/tests/SdkLoadingTestCase.java
+++ /dev/null
@@ -1,117 +0,0 @@
-/*
- * 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.tests;
-
-import com.android.ide.common.sdk.LoadStatus;
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.ide.eclipse.adt.internal.preferences.AdtPrefs;
-import com.android.ide.eclipse.adt.internal.sdk.AndroidTargetParser;
-import com.android.ide.eclipse.adt.internal.sdk.Sdk;
-import com.android.sdklib.IAndroidTarget;
-import com.android.testutils.SdkTestCase;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.NullProgressMonitor;
-
-/**
- * A test case which uses the SDK loaded by the ADT plugin.
- */
-public abstract class SdkLoadingTestCase extends SdkTestCase {
-
-    private Sdk mSdk;
-
-    protected SdkLoadingTestCase() {
-    }
-
-    /**
-     * Retrieve the {@link Sdk} under test.
-     */
-    protected Sdk getSdk() {
-        if (mSdk == null) {
-            mSdk = loadSdk();
-            assertNotNull(mSdk);
-            validateSdk(mSdk);
-        }
-        return mSdk;
-    }
-
-    /**
-     * Gets the current SDK from ADT, waiting if necessary.
-     */
-    private Sdk loadSdk() {
-        AdtPlugin adt = AdtPlugin.getDefault();
-
-        // We'll never get an AdtPlugin object when running this with the
-        // non-Eclipse jUnit test runner.
-        if (adt == null) {
-            return null;
-        }
-
-        // We'll never break out of the SDK load-wait-loop if the AdtPlugin doesn't
-        // actually have a valid SDK location because it won't have started an async load:
-        String sdkLocation = AdtPrefs.getPrefs().getOsSdkFolder();
-        assertTrue("No valid SDK installation is set; for tests you typically need to set the"
-                + " environment variable ADT_TEST_SDK_PATH to point to an SDK folder",
-                sdkLocation != null && sdkLocation.length() > 0);
-
-        Object sdkLock = Sdk.getLock();
-        LoadStatus loadStatus = LoadStatus.LOADING;
-        // wait for ADT to load the SDK on a separate thread
-        // loop max of 600 times * 200 ms =  2 minutes
-        final int maxWait = 600;
-        for (int i=0; i < maxWait && loadStatus == LoadStatus.LOADING; i++) {
-            try {
-                Thread.sleep(200);
-            }
-            catch (InterruptedException e) {
-                // ignore
-            }
-            synchronized (sdkLock) {
-                loadStatus = adt.getSdkLoadStatus();
-            }
-        }
-        Sdk sdk = null;
-        synchronized (sdkLock) {
-            assertEquals(LoadStatus.LOADED, loadStatus);
-            sdk = Sdk.getCurrent();
-        }
-        assertNotNull(sdk);
-        return sdk;
-    }
-
-    protected boolean validateSdk(IAndroidTarget target) {
-        return true;
-    }
-
-    /**
-     * Checks that the provided sdk contains one or more valid targets.
-     * @param sdk the {@link Sdk} to validate.
-     */
-    private void validateSdk(Sdk sdk) {
-        assertTrue("sdk has no targets", sdk.getTargets().length > 0);
-        for (IAndroidTarget target : sdk.getTargets()) {
-            if (!validateSdk(target)) {
-                continue;
-            }
-            if (false) { // This takes forEVER
-            IStatus status = new AndroidTargetParser(target).run(new NullProgressMonitor());
-            if (status.getCode() != IStatus.OK) {
-                fail("Failed to parse targets data");
-            }
-            }
-        }
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/tests/UnitTests.java b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/tests/UnitTests.java
deleted file mode 100644
index 15d3871..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/tests/UnitTests.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * 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.tests;
-
-
-import com.android.ide.eclipse.adt.AdtPlugin;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-/**
- * Container TestSuite for all eclipse unit tests to be run
- *
- * Uses Eclipse OSGI to find and then run all junit.junit.framework.Tests in
- * this plugin, excluding tests in the FuncTests.FUNC_TEST_PACKAGE package
- *
- * Since it uses Eclipse OSGI, it must be run in a Eclipse plugin environment
- * i.e. from Eclipse workbench, this suite must be run using the
- * "JUnit Plug-in Test" launch configuration as opposed to as a "JUnit Test"
- *
- */
-public class UnitTests {
-    private static final String TEST_PACKAGE = "com.android";
-
-    public static Test suite() {
-        TestSuite suite = new TestSuite();
-
-        UnitTestCollector collector = new UnitTestCollector();
-        // since this plugin is a fragment which runs insde adt, gather tests from AdtPlugin
-        collector.addTestCases(suite, AdtPlugin.getDefault(), TEST_PACKAGE);
-
-        return suite;
-    }
-
-    /**
-     * Specialized test collector which will skip adding functional tests
-     */
-    private static class UnitTestCollector extends EclipseTestCollector {
-        /**
-         * Override parent class to exclude functional tests
-         */
-        @Override
-        protected boolean isTestClass(Class<?> testClass) {
-            return super.isTestClass(testClass) &&
-            !testClass.getPackage().getName().startsWith(FuncTests.FUNC_TEST_PACKAGE);
-        }
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/tests/functests/layoutRendering/ApiDemosRenderingTest.java b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/tests/functests/layoutRendering/ApiDemosRenderingTest.java
deleted file mode 100644
index d6b401b..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/tests/functests/layoutRendering/ApiDemosRenderingTest.java
+++ /dev/null
@@ -1,328 +0,0 @@
-/*
- * Copyright (C) 2009 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.tests.functests.layoutRendering;
-
-import com.android.SdkConstants;
-import com.android.ide.common.rendering.LayoutLibrary;
-import com.android.ide.common.rendering.api.ActionBarCallback;
-import com.android.ide.common.rendering.api.AdapterBinding;
-import com.android.ide.common.rendering.api.HardwareConfig;
-import com.android.ide.common.rendering.api.ILayoutPullParser;
-import com.android.ide.common.rendering.api.IProjectCallback;
-import com.android.ide.common.rendering.api.RenderSession;
-import com.android.ide.common.rendering.api.ResourceReference;
-import com.android.ide.common.rendering.api.ResourceValue;
-import com.android.ide.common.rendering.api.SessionParams;
-import com.android.ide.common.rendering.api.SessionParams.RenderingMode;
-import com.android.ide.common.resources.ResourceItem;
-import com.android.ide.common.resources.ResourceRepository;
-import com.android.ide.common.resources.ResourceResolver;
-import com.android.ide.common.resources.configuration.DensityQualifier;
-import com.android.ide.common.resources.configuration.FolderConfiguration;
-import com.android.ide.common.resources.configuration.KeyboardStateQualifier;
-import com.android.ide.common.resources.configuration.NavigationMethodQualifier;
-import com.android.ide.common.resources.configuration.NavigationStateQualifier;
-import com.android.ide.common.resources.configuration.ScreenDimensionQualifier;
-import com.android.ide.common.resources.configuration.ScreenHeightQualifier;
-import com.android.ide.common.resources.configuration.ScreenOrientationQualifier;
-import com.android.ide.common.resources.configuration.ScreenRatioQualifier;
-import com.android.ide.common.resources.configuration.ScreenSizeQualifier;
-import com.android.ide.common.resources.configuration.ScreenWidthQualifier;
-import com.android.ide.common.resources.configuration.SmallestScreenWidthQualifier;
-import com.android.ide.common.resources.configuration.TextInputMethodQualifier;
-import com.android.ide.common.resources.configuration.TouchScreenQualifier;
-import com.android.ide.common.sdk.LoadStatus;
-import com.android.ide.eclipse.adt.internal.resources.manager.ResourceManager;
-import com.android.ide.eclipse.adt.internal.sdk.AndroidTargetData;
-import com.android.ide.eclipse.tests.SdkLoadingTestCase;
-import com.android.io.FolderWrapper;
-import com.android.resources.Density;
-import com.android.resources.Keyboard;
-import com.android.resources.KeyboardState;
-import com.android.resources.Navigation;
-import com.android.resources.NavigationState;
-import com.android.resources.ResourceType;
-import com.android.resources.ScreenOrientation;
-import com.android.resources.ScreenRatio;
-import com.android.resources.ScreenSize;
-import com.android.resources.TouchScreen;
-import com.android.sdklib.IAndroidTarget;
-import com.android.util.Pair;
-
-import org.kxml2.io.KXmlParser;
-import org.xmlpull.v1.XmlPullParser;
-import org.xmlpull.v1.XmlPullParserException;
-
-import java.io.File;
-import java.io.FileReader;
-import java.io.IOException;
-import java.util.HashMap;
-import java.util.Map;
-
-import javax.imageio.ImageIO;
-
-public class ApiDemosRenderingTest extends SdkLoadingTestCase {
-
-    /**
-     * Custom parser that implements {@link ILayoutPullParser} (which itself extends
-     * {@link XmlPullParser}).
-     */
-    private final static class TestParser extends KXmlParser implements ILayoutPullParser {
-        /**
-         * Since we're not going to go through the result of the rendering/layout, we can return
-         * null for the View Key.
-         */
-        @Override
-        public Object getViewCookie() {
-            return null;
-        }
-
-        @Override
-        public ILayoutPullParser getParser(String layoutName) {
-            return null;
-        }
-    }
-
-    private final static class ProjectCallBack implements IProjectCallback {
-        // resource id counter.
-        // We start at 0x7f000000 to avoid colliding with the framework id
-        // since we have no access to the project R.java and we need to generate them automatically.
-        private int mIdCounter = 0x7f000000;
-
-        // in some cases, the id that getResourceValue(String type, String name) returns
-        // will be sent back to get the type/name. This map stores the id/type/name we generate
-        // to be able to do the reverse resolution.
-        private Map<Integer, Pair<ResourceType, String>> mResourceMap =
-            new HashMap<Integer, Pair<ResourceType, String>>();
-
-        private boolean mCustomViewAttempt = false;
-
-        @Override
-        public String getNamespace() {
-            // TODO: read from the ApiDemos manifest.
-            return "com.example.android.apis";
-        }
-
-        @Override
-        @SuppressWarnings("unchecked")
-        public Object loadView(String name, Class[] constructorSignature, Object[] constructorArgs)
-                throws ClassNotFoundException, Exception {
-            mCustomViewAttempt = true;
-            return null;
-        }
-
-        @Override
-        public Integer getResourceId(ResourceType type, String name) {
-            Integer result = ++mIdCounter;
-            mResourceMap.put(result, Pair.of(type, name));
-            return result;
-        }
-
-        @Override
-        public Pair<ResourceType, String> resolveResourceId(int id) {
-            return mResourceMap.get(id);
-        }
-
-        @Override
-        public String resolveResourceId(int[] id) {
-            return null;
-        }
-
-        @Override
-        public ILayoutPullParser getParser(String layoutName) {
-            return null;
-        }
-
-        @Override
-        public Object getAdapterItemValue(ResourceReference adapterView, Object adapterCookie,
-                ResourceReference itemRef, int fullPosition, int typePosition,
-                int fullChildPosition, int typeChildPosition,
-                ResourceReference viewRef, ViewAttribute viewAttribute, Object defaultValue) {
-            return null;
-        }
-
-        @Override
-        public AdapterBinding getAdapterBinding(ResourceReference adapterView,
-                Object adapterCookie, Object viewObject) {
-            return null;
-        }
-
-        @Override
-        public ILayoutPullParser getParser(ResourceValue layoutResource) {
-            return null;
-        }
-
-        @Override
-        public ActionBarCallback getActionBarCallback() {
-            return new ActionBarCallback();
-        }
-    }
-
-    public void testApiDemos() throws IOException, XmlPullParserException {
-        findApiDemos();
-    }
-
-    private void findApiDemos() throws IOException, XmlPullParserException {
-        IAndroidTarget[] targets = getSdk().getTargets();
-
-        for (IAndroidTarget target : targets) {
-            String path = target.getPath(IAndroidTarget.SAMPLES);
-            File samples = new File(path);
-            if (samples.isDirectory()) {
-                File[] files = samples.listFiles();
-                for (File file : files) {
-                    if ("apidemos".equalsIgnoreCase(file.getName())) {
-                        testSample(target, file);
-                        return;
-                    }
-                }
-            }
-        }
-
-        fail("Failed to find ApiDemos!");
-    }
-
-    private void testSample(IAndroidTarget target, File sampleProject) throws IOException, XmlPullParserException {
-        AndroidTargetData data = getSdk().getTargetData(target);
-        if (data == null) {
-            fail("No AndroidData!");
-        }
-
-        LayoutLibrary layoutLib = data.getLayoutLibrary();
-        if (layoutLib.getStatus() != LoadStatus.LOADED) {
-            fail("Fail to load the bridge: " + layoutLib.getLoadMessage());
-        }
-
-        FolderWrapper resFolder = new FolderWrapper(sampleProject, SdkConstants.FD_RES);
-        if (resFolder.exists() == false) {
-            fail("Sample project has no res folder!");
-        }
-
-        // look for the layout folder
-        File layoutFolder = new File(resFolder, SdkConstants.FD_RES_LAYOUT);
-        if (layoutFolder.isDirectory() == false) {
-            fail("Sample project has no layout folder!");
-        }
-
-        // first load the project's target framework resource
-        ResourceRepository framework = ResourceManager.getInstance().loadFrameworkResources(target);
-
-        // now load the project resources
-        ResourceRepository project = new ResourceRepository(resFolder, false) {
-            @Override
-            protected ResourceItem createResourceItem(String name) {
-                return new ResourceItem(name);
-            }
-
-        };
-
-        // Create a folder configuration that will be used for the rendering:
-        FolderConfiguration config = getConfiguration();
-
-        // get the configured resources
-        Map<ResourceType, Map<String, ResourceValue>> configuredFramework =
-                framework.getConfiguredResources(config);
-        Map<ResourceType, Map<String, ResourceValue>> configuredProject =
-                project.getConfiguredResources(config);
-
-        boolean saveFiles = System.getenv("save_file") != null;
-
-        // loop on the layouts and render them
-        File[] layouts = layoutFolder.listFiles();
-        for (File layout : layouts) {
-            // create a parser for the layout file
-            TestParser parser = new TestParser();
-            parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, true);
-            parser.setInput(new FileReader(layout));
-
-            System.out.println("Rendering " + layout.getName());
-
-            ProjectCallBack projectCallBack = new ProjectCallBack();
-
-            ResourceResolver resolver = ResourceResolver.create(
-                    configuredProject, configuredFramework,
-                    "Theme", false /*isProjectTheme*/);
-
-            HardwareConfig hardwareConfig = new HardwareConfig(
-                    320,
-                    480,
-                    Density.MEDIUM,
-                    160, //xdpi
-                    160, // ydpi
-                    ScreenSize.NORMAL,
-                    ScreenOrientation.PORTRAIT,
-                    false /*software buttons */);
-
-            RenderSession session = layoutLib.createSession(new SessionParams(
-                    parser,
-                    RenderingMode.NORMAL,
-                    null /*projectKey*/,
-                    hardwareConfig,
-                    resolver,
-                    projectCallBack,
-                    1, // minSdkVersion
-                    1, // targetSdkVersion
-                    null //logger
-                    ));
-
-            if (session.getResult().isSuccess() == false) {
-                if (projectCallBack.mCustomViewAttempt == false) {
-                    System.out.println("FAILED");
-                    fail(String.format("Rendering %1$s: %2$s", layout.getName(),
-                            session.getResult().getErrorMessage()));
-                } else {
-                    System.out.println("Ignore custom views for now");
-                }
-            } else {
-                if (saveFiles) {
-                    File tmp = File.createTempFile(layout.getName(), ".png");
-                    ImageIO.write(session.getImage(), "png", tmp);
-                }
-                System.out.println("Success!");
-            }
-        }
-    }
-
-    /**
-     * Returns a config. This must be a valid config like a device would return. This is to
-     * prevent issues where some resources don't exist in all cases and not in the default
-     * (for instance only available in hdpi and mdpi but not in default).
-     * @return
-     */
-    private FolderConfiguration getConfiguration() {
-        FolderConfiguration config = new FolderConfiguration();
-
-        // this matches an ADP1.
-        config.addQualifier(new SmallestScreenWidthQualifier(320));
-        config.addQualifier(new ScreenWidthQualifier(320));
-        config.addQualifier(new ScreenHeightQualifier(480));
-        config.addQualifier(new ScreenSizeQualifier(ScreenSize.NORMAL));
-        config.addQualifier(new ScreenRatioQualifier(ScreenRatio.NOTLONG));
-        config.addQualifier(new ScreenOrientationQualifier(ScreenOrientation.PORTRAIT));
-        config.addQualifier(new DensityQualifier(Density.MEDIUM));
-        config.addQualifier(new TouchScreenQualifier(TouchScreen.FINGER));
-        config.addQualifier(new KeyboardStateQualifier(KeyboardState.HIDDEN));
-        config.addQualifier(new TextInputMethodQualifier(Keyboard.QWERTY));
-        config.addQualifier(new NavigationStateQualifier(NavigationState.HIDDEN));
-        config.addQualifier(new NavigationMethodQualifier(Navigation.TRACKBALL));
-        config.addQualifier(new ScreenDimensionQualifier(480, 320));
-
-        config.updateScreenWidthAndHeight();
-
-        return config;
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/tests/functests/sampleProjects/AndroidManifestWriter.java b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/tests/functests/sampleProjects/AndroidManifestWriter.java
deleted file mode 100644
index 141e7e0..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/tests/functests/sampleProjects/AndroidManifestWriter.java
+++ /dev/null
@@ -1,131 +0,0 @@
-/*
- * Copyright (C) 2009 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.tests.functests.sampleProjects;
-
-import com.android.SdkConstants;
-import com.android.ide.eclipse.adt.internal.project.AndroidManifestHelper;
-import com.android.xml.AndroidManifest;
-
-import org.w3c.dom.Attr;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-import org.w3c.dom.NodeList;
-import org.xml.sax.SAXException;
-
-import java.io.File;
-import java.io.IOException;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
-import javax.xml.parsers.DocumentBuilder;
-import javax.xml.parsers.DocumentBuilderFactory;
-import javax.xml.parsers.ParserConfigurationException;
-import javax.xml.transform.Result;
-import javax.xml.transform.Source;
-import javax.xml.transform.Transformer;
-import javax.xml.transform.TransformerConfigurationException;
-import javax.xml.transform.TransformerException;
-import javax.xml.transform.TransformerFactory;
-import javax.xml.transform.dom.DOMSource;
-import javax.xml.transform.stream.StreamResult;
-
-/**
- * Helper class for modifying an AndroidManifest.
- * <p/>
- * TODO: consider merging this with AndroidManifestParser.
- */
-class AndroidManifestWriter {
-
-    private static final Logger sLogger = Logger.getLogger(AndroidManifestWriter.class.getName());
-
-    private final Document mDoc;
-    private final String mOsManifestFilePath;
-
-    private AndroidManifestWriter(Document doc, String osManifestFilePath) {
-        mDoc = doc;
-        mOsManifestFilePath = osManifestFilePath;
-    }
-
-    /**
-     * Sets the minimum SDK version for this manifest
-     * @param minSdkVersion - the minimim sdk version to use
-     * @returns <code>true</code> on success, false otherwise
-     */
-    public boolean setMinSdkVersion(String minSdkVersion) {
-        Element usesSdkElement = null;
-        NodeList nodeList = mDoc.getElementsByTagName(AndroidManifest.NODE_USES_SDK);
-        if (nodeList.getLength() > 0) {
-            usesSdkElement = (Element) nodeList.item(0);
-        } else {
-            usesSdkElement = mDoc.createElement(AndroidManifest.NODE_USES_SDK);
-            mDoc.getDocumentElement().appendChild(usesSdkElement);
-        }
-        Attr minSdkAttr = mDoc.createAttributeNS(SdkConstants.NS_RESOURCES,
-                AndroidManifest.ATTRIBUTE_MIN_SDK_VERSION);
-        String prefix = mDoc.lookupPrefix(SdkConstants.NS_RESOURCES);
-        minSdkAttr.setPrefix(prefix);
-        minSdkAttr.setValue(minSdkVersion);
-        usesSdkElement.setAttributeNodeNS(minSdkAttr);
-        return saveXmlToFile();
-    }
-
-    private boolean saveXmlToFile() {
-        try {
-            // Prepare the DOM document for writing
-            Source source = new DOMSource(mDoc);
-
-            // Prepare the output file
-            File file = new File(mOsManifestFilePath);
-            Result result = new StreamResult(file);
-
-            // Write the DOM document to the file
-            Transformer xformer = TransformerFactory.newInstance().newTransformer();
-            xformer.transform(source, result);
-        } catch (TransformerConfigurationException e) {
-            sLogger.log(Level.SEVERE, "Failed to write xml file", e);
-            return false;
-        } catch (TransformerException e) {
-            sLogger.log(Level.SEVERE, "Failed to write xml file", e);
-            return false;
-        }
-        return true;
-    }
-
-    /**
-     * Parses the manifest file, and collects data.
-     *
-     * @param osManifestFilePath The OS path of the manifest file to parse.
-     * @return an {@link AndroidManifestHelper} or null if parsing failed
-     */
-    public static AndroidManifestWriter parse(String osManifestFilePath) {
-        try {
-            DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
-            docFactory.setNamespaceAware(true);
-            DocumentBuilder docBuilder = docFactory.newDocumentBuilder();
-            Document doc = docBuilder.parse(osManifestFilePath);
-            return new AndroidManifestWriter(doc, osManifestFilePath);
-        } catch (ParserConfigurationException e) {
-            sLogger.log(Level.SEVERE, "Error parsing file", e);
-            return null;
-        } catch (SAXException e) {
-            sLogger.log(Level.SEVERE, "Error parsing file", e);
-            return null;
-        } catch (IOException e) {
-            sLogger.log(Level.SEVERE, "Error parsing file", e);
-            return null;
-        }
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/tests/functests/sampleProjects/SampleProjectTest.java b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/tests/functests/sampleProjects/SampleProjectTest.java
deleted file mode 100644
index 3fb705d..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/tests/functests/sampleProjects/SampleProjectTest.java
+++ /dev/null
@@ -1,263 +0,0 @@
-/*
- * 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.tests.functests.sampleProjects;
-
-import com.android.SdkConstants;
-import com.android.ide.eclipse.adt.AdtUtils;
-import com.android.ide.eclipse.adt.internal.wizards.newproject.NewProjectCreator;
-import com.android.ide.eclipse.adt.internal.wizards.newproject.NewProjectWizardState;
-import com.android.ide.eclipse.adt.internal.wizards.newproject.NewProjectWizardState.Mode;
-import com.android.ide.eclipse.tests.SdkLoadingTestCase;
-import com.android.sdklib.IAndroidTarget;
-
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IResourceChangeEvent;
-import org.eclipse.core.resources.IResourceChangeListener;
-import org.eclipse.core.resources.IResourceDelta;
-import org.eclipse.core.resources.IResourceDeltaVisitor;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.jface.operation.IRunnableContext;
-import org.eclipse.jface.operation.IRunnableWithProgress;
-import org.eclipse.swt.widgets.Display;
-
-import java.io.File;
-import java.lang.reflect.InvocationTargetException;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
-/**
- * Test case that verifies all SDK sample projects can be imported, and built in
- * Eclipse.
- * <p/>
- * TODO: add support for deploying apps onto emulator and verifying successful
- * execution there
- *
- */
-public class SampleProjectTest extends SdkLoadingTestCase {
-
-    private static final Logger sLogger = Logger.getLogger(SampleProjectTest.class.getName());
-
-    /**
-     * Finds all samples projects in set SDK and verify they can be built in Eclipse.
-     * <p/>
-     * TODO: add install and run on emulator test
-     * @throws CoreException
-     */
-    public void testSamples() throws CoreException {
-        // TODO: For reporting purposes, it would be better if a separate test success or failure
-        // could be reported for each sample
-        IAndroidTarget[] targets = getSdk().getTargets();
-        for (IAndroidTarget target : targets) {
-            doTestSamplesForTarget(target);
-        }
-    }
-
-    private void doTestSamplesForTarget(IAndroidTarget target) throws CoreException {
-        String path = target.getPath(IAndroidTarget.SAMPLES);
-        File samples = new File(path);
-        if (samples.isDirectory()) {
-            File[] files = samples.listFiles();
-            for (File file : files) {
-                if (file.isDirectory()) {
-                    doTestSampleProject(file.getName(), file.getAbsolutePath(), target);
-                }
-            }
-        }
-    }
-
-    /**
-     * Tests the sample project with the given name
-     *
-     * @param target - SDK target of project
-     * @param name - name of sample project to test
-     * @param path - absolute file system path
-     * @throws CoreException
-     */
-    private void doTestSampleProject(String name, String path, IAndroidTarget target)
-             throws CoreException {
-        IProject iproject = null;
-        try {
-            sLogger.log(Level.INFO, String.format("Testing sample %s for target %s", name,
-                    target.getName()));
-
-            prepareProject(path, target);
-
-            IRunnableContext context = new IRunnableContext() {
-                @Override
-                public void run(boolean fork, boolean cancelable, IRunnableWithProgress runnable)
-                        throws InvocationTargetException, InterruptedException {
-                    runnable.run(new NullProgressMonitor());
-                }
-            };
-            NewProjectWizardState state = new NewProjectWizardState(Mode.SAMPLE);
-            state.projectName = name;
-            state.target = target;
-            state.packageName = "com.android.samples";
-            state.activityName = name;
-            state.applicationName = name;
-            state.chosenSample = new File(path);
-            state.useDefaultLocation = false;
-            state.createActivity = false;
-
-            NewProjectCreator creator = new NewProjectCreator(state, context);
-            creator.createAndroidProjects();
-            iproject = validateProjectExists(name);
-            validateNoProblems(iproject);
-        }
-        catch (CoreException e) {
-            sLogger.log(Level.SEVERE,
-                    String.format("Unexpected exception when creating sample project %s " +
-                            "for target %s", name, target.getName()));
-            throw e;
-        } finally {
-            if (iproject != null) {
-                iproject.delete(false, true, new NullProgressMonitor());
-            }
-        }
-    }
-
-    private void prepareProject(String path, IAndroidTarget target) {
-        if (target.getVersion().isPreview()) {
-            // need to explicitly set preview's version in manifest for project to compile
-            final String manifestPath = path + File.separatorChar +
-                    SdkConstants.FN_ANDROID_MANIFEST_XML;
-            AndroidManifestWriter manifestWriter =
-                AndroidManifestWriter.parse(manifestPath);
-            assertNotNull(String.format("could not read manifest %s", manifestPath),
-                    manifestWriter);
-            assertTrue(manifestWriter.setMinSdkVersion(target.getVersion().getApiString()));
-        }
-    }
-
-    private IProject validateProjectExists(String name) {
-        IProject iproject = getIProject(name);
-        assertTrue(String.format("%s project not created", name), iproject.exists());
-        assertTrue(String.format("%s project not opened", name), iproject.isOpen());
-        return iproject;
-    }
-
-    private IProject getIProject(String name) {
-        IProject iproject = ResourcesPlugin.getWorkspace().getRoot()
-                .getProject(name);
-        return iproject;
-    }
-
-    private void validateNoProblems(IProject iproject) throws CoreException {
-        waitForBuild(iproject);
-
-        boolean hasErrors = false;
-        StringBuilder failureBuilder = new StringBuilder(String.format("%s project has errors:",
-                iproject.getName()));
-        IMarker[] markers = iproject.findMarkers(IMarker.PROBLEM, true, IResource.DEPTH_INFINITE);
-        if (markers != null && markers.length > 0) {
-            // the project has marker(s). even though they are "problem" we
-            // don't know their severity. so we loop on them and figure if they
-            // are warnings or errors
-            for (IMarker m : markers) {
-                int s = m.getAttribute(IMarker.SEVERITY, -1);
-                if (s == IMarker.SEVERITY_ERROR) {
-                    hasErrors = true;
-                    failureBuilder.append("\n");
-                    failureBuilder.append(m.getAttribute(IMarker.MESSAGE, ""));
-                }
-            }
-        }
-        failureBuilder.append("Project location: " + AdtUtils.getAbsolutePath(iproject));
-        assertFalse(failureBuilder.toString(), hasErrors);
-    }
-
-    /**
-     * Waits for build to complete.
-     *
-     * @param iproject
-     */
-    private void waitForBuild(final IProject iproject) {
-
-        final BuiltProjectDeltaVisitor deltaVisitor = new BuiltProjectDeltaVisitor(iproject);
-        IResourceChangeListener newBuildListener = new IResourceChangeListener() {
-
-            @Override
-            public void resourceChanged(IResourceChangeEvent event) {
-                try {
-                    event.getDelta().accept(deltaVisitor);
-                }
-                catch (CoreException e) {
-                    fail();
-                }
-            }
-
-        };
-        iproject.getWorkspace().addResourceChangeListener(newBuildListener,
-          IResourceChangeEvent.POST_BUILD);
-
-        // poll build listener to determine when build is done
-        // loop max of 1200 times * 50 ms = 60 seconds
-        final int maxWait = 1200;
-        for (int i=0; i < maxWait; i++) {
-            if (deltaVisitor.isProjectBuilt()) {
-                return;
-            }
-            try {
-                Thread.sleep(50);
-            }
-            catch (InterruptedException e) {
-                // ignore
-            }
-           if (Display.getCurrent() != null) {
-               Display.getCurrent().readAndDispatch();
-           }
-        }
-
-        sLogger.log(Level.SEVERE, "expected build event never happened?");
-        fail(String.format("Expected build event never happened for %s", iproject.getName()));
-    }
-
-    /**
-     * Scans a given IResourceDelta looking for a "build event" change for given IProject
-     *
-     */
-    private class BuiltProjectDeltaVisitor implements IResourceDeltaVisitor {
-
-        private IProject mIProject;
-        private boolean  mIsBuilt;
-
-        public BuiltProjectDeltaVisitor(IProject iproject) {
-            mIProject = iproject;
-            mIsBuilt = false;
-        }
-
-        @Override
-        public boolean visit(IResourceDelta delta) {
-            if (mIProject.equals(delta.getResource())) {
-                setBuilt(true);
-                return false;
-            }
-            return true;
-        }
-
-        private synchronized void setBuilt(boolean b) {
-            mIsBuilt = b;
-        }
-
-        public synchronized boolean isProjectBuilt() {
-            return mIsBuilt;
-        }
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/test.xml b/eclipse/plugins/com.android.ide.eclipse.tests/test.xml
deleted file mode 100644
index e5519b0..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/test.xml
+++ /dev/null
@@ -1,76 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-
-<!-- test launcher file for Android Eclipse tests -->
-<project name="testsuite" default="run" basedir="."> 
-    <!--The following properties should be passed into this script, set to some default value for now -->
-    <property name="eclipse.home" value="/opt/eclipse" />
-    <property name="sdk_home" value="/tmp/sdk" />
-    <property name="eclipse_test" value="${eclipse.home}/plugins/org.eclipse.test_3.2.0" />
-	
-    <!-- eclipse scripts use an annoying mixture of eclipse-home and eclipse.home -->
-    <!-- lets define both...-->
-    <property name="eclipse-home" value="${eclipse.home}" />
-    <property name="test-folder" value="${eclipse.home}/test_folder" />
-        
-    <!-- sets the properties eclipse.home, and library-file -->
-    <property name="plugin-name" value="com.android.ide.eclipse.tests" />
-    <property name="library-file" value="${eclipse_test}/library.xml" />
-
-    <!-- location of adt preference file (within workspace) -->
-    <property name="prefs_path" value="${test-folder}/.metadata/.plugins/org.eclipse.core.runtime/.settings/com.android.ide.eclipse.adt.prefs" />
-    <!-- location of pref template file relative to this file -->
-
-    <property name="prefs_template" value="prefs.template" />
-
-    <!-- This target holds all initialization code that needs to be done for -->
-    <!-- all tests that are to be run.         -->
-    <target name="init">
-        <tstamp />
-        <echo message="eclipse.home:  ${eclipse.home}" />
-        <echo message="libfile:  ${library-file}" />
-        
-        <!-- delete test eclipse workspace -->
-        <delete dir="${test-folder}" quiet="true" />
-    	
-    	<!-- delete test results dir -->
-    	<delete dir="${eclipse.home}/results" quiet="true" />
-
-        <!-- Copy a preference file into the test workspace. -->
-        <!-- This is done to ensure Android SDK preference is set on startup -->
-        <copy file="${prefs_template}" tofile="${prefs_path}" />
-        <!-- replace sdk path placeholder token with actual sdk path -->
-        <replace file="${prefs_path}" token="sdk_home" value="${sdk_home}" />
-        
-        <!-- if this is on windows, escape the drive and file separators -->
-        <replace file="${prefs_path}" token="\" value="\\" />
-        <replace file="${prefs_path}" token=":" value="\:" />
-    </target>
-
-    <!-- This target defines the tests that need to be run. -->
-    <target name="suite">
-        <!-- launch as ui-test ie as a test which needs Eclipse workbench -->
-        <ant target="ui-test" antfile="${library-file}" dir="${eclipse.home}">
-            <property name="data-dir" value="${test-folder}" />
-            <property name="plugin-name" value="${plugin-name}" />
-            <property name="classname" value="com.android.ide.eclipse.tests.AllTests" />
-            <!-- pass extra vm arg to set sdk_home env and test_data env variable -->
-            <property name="extraVMargs" value="-Dtest_data=${test_data}" />
-        </ant>
-    </target>
-
-    <!-- This target holds code to cleanup the testing environment after -->
-    <!-- after all of the tests have been run. You can use this target to -->
-    <!-- delete temporary files that have been created. -->
-    <target name="cleanup">
-    </target>
-
-    <!-- This target runs the test suite. Any actions that need to happen -->
-    <!-- after all the tests have been run should go here. -->
-    <target name="run" depends="init,suite,cleanup">
-        <ant target="collect" antfile="${library-file}" dir="${eclipse.home}/results">
-            <property name="includes" value="com*.xml" />
-            <property name="output-file" value="${plugin-name}.xml" />
-        </ant>
-    </target>
-</project>
-
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/unittest.xml b/eclipse/plugins/com.android.ide.eclipse.tests/unittest.xml
deleted file mode 100644
index 83e00ec..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/unittest.xml
+++ /dev/null
@@ -1,54 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-
-<!-- test launcher file for Android Eclipse unit tests -->
-<project name="testsuite" default="run" basedir="."> 
-    <!--The following properties should be passed into this script, set to some default value for now -->
-    <property name="eclipse.home" value="/opt/eclipse" />
-    <property name="eclipse_test" value="${eclipse.home}/plugins/org.eclipse.test_3.2.0" />
-
-    <!-- eclipse scripts use an annoying mixture of eclipse-home and eclipse.home -->
-    <!-- lets define both...-->
-    <property name="eclipse-home" value="${eclipse.home}" />
-    <property name="test-folder" value="${eclipse.home}/unittest_ws" />
-        
-    <!-- sets the properties eclipse.home, and library-file -->
-    <property name="plugin-name" value="com.android.ide.eclipse.tests" />
-    <property name="library-file" value="${eclipse_test}/library.xml" />
-	
-    <!-- This target holds all initialization code that needs to be done for -->
-    <!-- all tests that are to be run.         -->
-    <target name="init">
-    	<ant antfile="test.xml" target="init">
-    		<property name="test-folder" value="${test-folder}" />
-        </ant>
-    </target>
-
-    <!-- This target defines the tests that need to be run. -->
-    <target name="suite">
-        <!-- need to launch as ui-test since all ADT plugins depend on ui-->
-    	<!-- otherwise other plugins will not load -->
-        <ant target="ui-test" antfile="${library-file}" dir="${eclipse.home}">
-            <property name="data-dir" value="${test-folder}" />
-            <property name="plugin-name" value="${plugin-name}" />
-            <property name="classname" value="com.android.ide.eclipse.tests.UnitTests" />
-            <!-- pass extra vm arg to set test_data env variable -->
-            <property name="extraVMargs" value="-Dtest_data=${test_data}" />
-        </ant>
-    </target>
-
-    <!-- This target holds code to cleanup the testing environment after -->
-    <!-- after all of the tests have been run. You can use this target to -->
-    <!-- delete temporary files that have been created. -->
-    <target name="cleanup">
-    </target>
-
-    <!-- This target runs the test suite. Any actions that need to happen -->
-    <!-- after all the tests have been run should go here. -->
-    <target name="run" depends="init,suite,cleanup">
-        <ant target="collect" antfile="${library-file}" dir="${eclipse.home}/results">
-            <property name="includes" value="com*.xml" />
-            <property name="output-file" value="${plugin-name}.xml" />
-        </ant>
-    </target>
-</project>
-
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/common/api/PointTest.java b/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/common/api/PointTest.java
deleted file mode 100755
index 54b6ff6..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/common/api/PointTest.java
+++ /dev/null
@@ -1,123 +0,0 @@
-/*
- * Copyright (C) 2010 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.api;
-
-import com.android.ide.common.api.Point;
-
-import junit.framework.TestCase;
-
-public class PointTest extends TestCase {
-
-    @Override
-    protected void setUp() throws Exception {
-        super.setUp();
-    }
-
-    public final void testPointIntInt() {
-        Point p = new Point(1, 2);
-        assertEquals(1, p.x);
-        assertEquals(2, p.y);
-
-        p = new Point(-3, -4);
-        assertEquals(-3, p.x);
-        assertEquals(-4, p.y);
-    }
-
-    public final void testSet() {
-        Point p = new Point(1, 2);
-        assertEquals(1, p.x);
-        assertEquals(2, p.y);
-
-        p.set(-3, -4);
-        assertEquals(-3, p.x);
-        assertEquals(-4, p.y);
-    }
-
-    public final void testPointPoint() {
-        Point p = new Point(1, 2);
-        Point p2 = new Point(p);
-
-        assertNotSame(p, p2);
-        assertEquals(p, p2);
-    }
-
-    public final void testPointPoint_Null() {
-        // Constructing a point with null throws an NPE
-        try {
-            new Point(null);
-        } catch (NullPointerException ignore) {
-            return; // success
-        }
-
-        fail("new Point(null) failed to throew NullPointerException");
-    }
-
-    public final void testCopy() {
-        Point p = new Point(1, 2);
-        Point p2 = p.copy();
-
-        assertNotSame(p, p2);
-        assertEquals(p, p2);
-    }
-
-    public final void testOffsetBy() {
-        Point p = new Point(1, 2);
-        Point p2 = p.offsetBy(3, 4);
-
-        assertSame(p, p2);
-        assertEquals(1+3, p.x);
-        assertEquals(2+4, p.y);
-    }
-
-    public final void testEquals_Null() {
-        Point p = new Point(1, 2);
-        assertFalse(p.equals(null));
-    }
-
-    public final void testEquals_UnknownObject() {
-        Point p = new Point(1, 2);
-        assertFalse(p.equals(new Object()));
-    }
-
-    public final void testEquals_Point() {
-        Point p = new Point(1, 2);
-        Point p1 = new Point(1, 2);
-        Point p2 = new Point(-3, -4);
-
-        assertNotSame(p1, p);
-        assertTrue(p.equals(p1));
-
-        assertFalse(p.equals(p2));
-    }
-
-    public final void testHashCode() {
-        Point p = new Point(1, 2);
-        Point p1 = new Point(1, 2);
-        Point p2 = new Point(-3, -4);
-
-        assertNotSame(p1, p);
-        assertEquals(p1.hashCode(), p.hashCode());
-
-        assertFalse(p2.hashCode() == p.hashCode());
-    }
-
-    public final void testToString() {
-        Point p = new Point(1, 2);
-        assertEquals("Point [1x2]", p.toString());
-    }
-
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/common/api/RectTest.java b/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/common/api/RectTest.java
deleted file mode 100755
index 2f2c59a..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/common/api/RectTest.java
+++ /dev/null
@@ -1,301 +0,0 @@
-/*
- * Copyright (C) 2010 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.api;
-
-import junit.framework.TestCase;
-
-public class RectTest extends TestCase {
-
-    @Override
-    protected void setUp() throws Exception {
-        super.setUp();
-    }
-
-    public final void testRect() {
-        Rect r = new Rect();
-        assertEquals(0, r.x);
-        assertEquals(0, r.y);
-        assertEquals(0, r.w);
-        assertEquals(0, r.h);
-    }
-
-    public final void testRectIntIntIntInt() {
-        Rect r = new Rect(1, 2, 3, 4);
-        assertEquals(1, r.x);
-        assertEquals(2, r.y);
-        assertEquals(3, r.w);
-        assertEquals(4, r.h);
-    }
-
-    public final void testRectRect() {
-        Rect r = new Rect(1, 2, 3, 4);
-        Rect r2 = new Rect(r);
-
-        assertNotSame(r2, r);
-        assertEquals(r2, r);
-    }
-
-    public final void testSetIntIntIntInt() {
-        Rect r = new Rect(1, 2, 3, 4);
-        Rect r2 = r.set(3, 4, 20, 30);
-
-        assertSame(r2, r);
-        assertEquals(3, r2.x);
-        assertEquals(4, r2.y);
-        assertEquals(20, r2.w);
-        assertEquals(30, r2.h);
-    }
-
-    public final void testSetRect() {
-        Rect r = new Rect(1, 2, 3, 4);
-        Rect r2 = new Rect(3, 4, 20, 30);
-        Rect r3 = r.set(r2);
-
-        assertSame(r3, r);
-        assertNotSame(r3, r2);
-        assertEquals(3, r.x);
-        assertEquals(4, r.y);
-        assertEquals(20, r.w);
-        assertEquals(30, r.h);
-    }
-
-    public final void testCopy() {
-        Rect r = new Rect(1, 2, 3, 4);
-        Rect r2 = r.copy();
-
-        assertNotSame(r2, r);
-        assertEquals(r2, r);
-    }
-
-    public final void testIsValid() {
-        Rect r = new Rect();
-        assertFalse(r.isValid());
-
-        r = new Rect(1, 2, 3, 4);
-        assertTrue(r.isValid());
-
-        // Rectangles must have a width > 0 to be valid
-        r = new Rect(1, 2, 0, 4);
-        assertFalse(r.isValid());
-        r = new Rect(1, 2, -5, 4);
-        assertFalse(r.isValid());
-
-        // Rectangles must have a height > 0 to be valid
-        r = new Rect(1, 2, 3, 0);
-        assertFalse(r.isValid());
-        r = new Rect(1, 2, 3, -5);
-        assertFalse(r.isValid());
-
-        r = new Rect(1, 2, 0, 0);
-        assertFalse(r.isValid());
-        r = new Rect(1, 2, -20, -5);
-        assertFalse(r.isValid());
-    }
-
-    public final void testContainsIntInt() {
-        Rect r = new Rect(3, 4, 20, 30);
-
-        assertTrue(r.contains(3,    4));
-        assertTrue(r.contains(3+19, 4));
-        assertTrue(r.contains(3+19, 4+29));
-        assertTrue(r.contains(3,    4+29));
-
-        assertFalse(r.contains(3-1, 4));
-        assertFalse(r.contains(3,   4-1));
-        assertFalse(r.contains(3-1, 4-1));
-
-        assertFalse(r.contains(3+20, 4));
-        assertFalse(r.contains(3+20, 4+30));
-        assertFalse(r.contains(3,    4+30));
-    }
-
-    public final void testContainsIntInt_Invalid() {
-        // Invalid rects always return false
-        Rect r = new Rect(3, 4, -20, -30);
-        assertFalse(r.contains(3,    4));
-    }
-
-    public final void testContainsPoint_Null() {
-        // contains(null) returns false rather than an NPE
-        Rect r = new Rect(3, 4, -20, -30);
-        assertFalse(r.contains((Point) null));
-    }
-
-    public final void testContainsRect_Null() {
-        // contains(null) returns false rather than an NPE
-        Rect r = new Rect(3, 4, -20, -30);
-        assertFalse(r.contains((Rect) null));
-    }
-
-    public final void testContainsPoint() {
-        Rect r = new Rect(3, 4, 20, 30);
-
-        assertTrue(r.contains(new Point(3,    4)));
-        assertTrue(r.contains(new Point(3+19, 4)));
-        assertTrue(r.contains(new Point(3+19, 4+29)));
-        assertTrue(r.contains(new Point(3,    4+29)));
-
-        assertFalse(r.contains(new Point(3-1, 4)));
-        assertFalse(r.contains(new Point(3,   4-1)));
-        assertFalse(r.contains(new Point(3-1, 4-1)));
-
-        assertFalse(r.contains(new Point(3+20, 4)));
-        assertFalse(r.contains(new Point(3+20, 4+30)));
-        assertFalse(r.contains(new Point(3,    4+30)));
-    }
-
-    public final void testContainsRect() {
-        Rect r = new Rect(3, 4, 20, 30);
-
-        assertTrue(r.contains(new Rect(3, 4, 5, 10)));
-        assertFalse(r.contains(new Rect(3 - 1, 4, 5, 10)));
-    }
-
-    public final void testIntersects() {
-        Rect r1 = new Rect(0, 0, 10, 10);
-        Rect r2 = new Rect(1, 1, 5, 5);
-        Rect r3 = new Rect(10, 0, 1, 1);
-        Rect r4 = new Rect(5, 5, 10, 10);
-        Rect r5 = new Rect(-1, 0, 1, 1);
-        Rect r6 = new Rect(0, 10, 1, 1);
-
-        assertTrue(r1.intersects(r2));
-        assertTrue(r2.intersects(r1));
-        assertTrue(r1.intersects(r4));
-        assertFalse(r1.intersects(r3));
-        assertFalse(r1.intersects(r5));
-        assertFalse(r1.intersects(r6));
-    }
-
-    public final void testMoveTo() {
-        Rect r = new Rect(3, 4, 20, 30);
-        Rect r2 = r.moveTo(100, 200);
-
-        assertSame(r2, r);
-        assertEquals(100, r.x);
-        assertEquals(200, r.y);
-        assertEquals(20, r.w);
-        assertEquals(30, r.h);
-    }
-
-    public final void testOffsetBy() {
-        Rect r = new Rect(3, 4, 20, 30);
-        Rect r2 = r.offsetBy(100, 200);
-
-        assertSame(r2, r);
-        assertEquals(103, r.x);
-        assertEquals(204, r.y);
-        assertEquals(20, r.w);
-        assertEquals(30, r.h);
-    }
-
-    public final void testGetCenter() {
-        Rect r = new Rect(3, 4, 20, 30);
-        Point p = r.getCenter();
-
-        assertEquals(3+20/2, p.x);
-        assertEquals(4+30/2, p.y);
-    }
-
-    public final void testGetTopLeft() {
-        Rect r = new Rect(3, 4, 20, 30);
-        Point p = r.getTopLeft();
-
-        assertEquals(3, p.x);
-        assertEquals(4, p.y);
-    }
-
-    public final void testGetBottomLeft() {
-        Rect r = new Rect(3, 4, 20, 30);
-        Point p = r.getBottomLeft();
-
-        assertEquals(3, p.x);
-        assertEquals(4+30, p.y);
-    }
-
-    public final void testGetTopRight() {
-        Rect r = new Rect(3, 4, 20, 30);
-        Point p = r.getTopRight();
-
-        assertEquals(3+20, p.x);
-        assertEquals(4, p.y);
-    }
-
-    public final void testGetBottomRight() {
-        Rect r = new Rect(3, 4, 20, 30);
-        Point p = r.getBottomRight();
-
-        assertEquals(3+20, p.x);
-        assertEquals(4+30, p.y);
-    }
-
-    public final void testToString() {
-        Rect r = new Rect(3, 4, 20, 30);
-
-        assertEquals("Rect [(3,4)-(23,34): 20x30]", r.toString());
-    }
-
-    public final void testEqualsObject() {
-        Rect r = new Rect(3, 4, 20, 30);
-
-        assertFalse(r.equals(null));
-        assertFalse(r.equals(new Object()));
-        assertTrue(r.equals(new Rect(3, 4, 20, 30)));
-    }
-
-    public final void testEqualsObject_Invalid() {
-        Rect r = new Rect(3, 4, 20, 30);
-        assertTrue(r.isValid());
-
-        Rect i1 = new Rect(3, 4, 0, 0);
-        assertFalse(i1.isValid());
-        Rect i2 = new Rect(10, 20, 0, 0);
-        assertFalse(i2.isValid());
-
-        // valid rects can't be equal to invalid rects
-        assertFalse(r.equals(i1));
-        assertFalse(r.equals(i2));
-
-        // invalid rects are equal to each other whatever their content is
-        assertEquals(i2, i1);
-    }
-
-    public final void testHashCode() {
-        Rect r = new Rect(1, 2, 3, 4);
-        Rect r1 = new Rect(3, 4, 20, 30);
-        Rect r2 = new Rect(3, 4, 20, 30);
-
-        assertFalse(r1.hashCode() == r.hashCode());
-        assertEquals(r2.hashCode(), r1.hashCode());
-    }
-
-
-    public final void testCenter() {
-        Rect r = new Rect(10, 20, 30, 40);
-        Point center = r.center();
-        assertEquals(25, center.x);
-        assertEquals(40, center.y);
-        assertEquals(25, r.centerX());
-        assertEquals(40, r.centerY());
-    }
-
-    public final void testX2Y2() {
-        Rect r = new Rect(1, 2, 3, 4);
-        assertEquals(4, r.x2());
-        assertEquals(6, r.y2());
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/common/layout/AbsoluteLayoutRuleTest.java b/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/common/layout/AbsoluteLayoutRuleTest.java
deleted file mode 100644
index 1a14bdd..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/common/layout/AbsoluteLayoutRuleTest.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * Copyright (C) 2010 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.layout;
-
-import static com.android.SdkConstants.ANDROID_URI;
-
-import com.android.ide.common.api.INode;
-import com.android.ide.common.api.Point;
-import com.android.ide.common.api.Rect;
-
-/** Test the {@link AbsoluteLayoutRule} */
-public class AbsoluteLayoutRuleTest extends LayoutTestBase {
-    // Utility for other tests
-    protected INode dragInto(Rect dragBounds, Point dragPoint, int insertIndex, int currentIndex,
-            String... graphicsFragments) {
-        INode layout = TestNode.create("android.widget.AbsoluteLayout").id("@+id/AbsoluteLayout01")
-                .bounds(new Rect(0, 0, 240, 480)).add(
-                        TestNode.create("android.widget.Button").id("@+id/Button01").bounds(
-                                new Rect(0, 0, 100, 80)),
-                        TestNode.create("android.widget.Button").id("@+id/Button02").bounds(
-                                new Rect(0, 100, 100, 80)),
-                        TestNode.create("android.widget.Button").id("@+id/Button03").bounds(
-                                new Rect(0, 200, 100, 80)),
-                        TestNode.create("android.widget.Button").id("@+id/Button04").bounds(
-                                new Rect(0, 300, 100, 80)));
-
-        return super.dragInto(new AbsoluteLayoutRule(), layout, dragBounds, dragPoint, null,
-                insertIndex, currentIndex, graphicsFragments);
-    }
-
-    public void testDragMiddle() {
-        INode inserted = dragInto(
-                // Bounds of the dragged item
-                new Rect(0, 0, 105, 80),
-                // Drag point
-                new Point(30, -10),
-                // Expected insert location: We just append in absolute layout
-                4,
-                // Not dragging one of the existing children
-                -1,
-
-
-                // Bounds rectangle
-                "useStyle(DROP_RECIPIENT), drawRect(Rect[0,0,240,480])",
-
-                // Drop preview
-                "useStyle(DROP_PREVIEW), drawRect(30,-10,135,70)");
-
-        assertEquals("30dp", inserted.getStringAttr(ANDROID_URI, "layout_x"));
-        assertEquals("-10dp", inserted.getStringAttr(ANDROID_URI, "layout_y"));
-
-        // Without drag bounds we should just draw guide lines instead
-        inserted = dragInto(new Rect(0, 0, 0, 0), new Point(30, -10), 4, -1,
-                "useStyle(DROP_RECIPIENT), drawRect(Rect[0,0,240,480])",
-                // Guideline
-                "useStyle(GUIDELINE), drawLine(30,0,30,480), drawLine(0,-10,240,-10)",
-                // Drop preview
-                "useStyle(DROP_PREVIEW), drawLine(30,-10,240,-10), drawLine(30,-10,30,480)");
-        assertEquals("30dp", inserted.getStringAttr(ANDROID_URI, "layout_x"));
-        assertEquals("-10dp", inserted.getStringAttr(ANDROID_URI, "layout_y"));
-    }
-
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/common/layout/BaseLayoutRuleTest.java b/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/common/layout/BaseLayoutRuleTest.java
deleted file mode 100644
index d176fe7..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/common/layout/BaseLayoutRuleTest.java
+++ /dev/null
@@ -1,245 +0,0 @@
-/*
- * Copyright (C) 2010 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.layout;
-
-import static com.android.SdkConstants.ANDROID_URI;
-import static com.android.SdkConstants.ATTR_ID;
-
-import com.android.ide.common.api.IDragElement;
-import com.android.ide.common.api.INode;
-import com.android.ide.common.api.Rect;
-import com.android.ide.common.layout.BaseLayoutRule.AttributeFilter;
-import com.android.utils.Pair;
-
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Set;
-
-// TODO: Check assertions
-// TODO: Check equals() but not == strings by using new String("") to prevent interning
-// TODO: Rename BaseLayout to BaseLayoutRule, and tests too of course
-
-public class BaseLayoutRuleTest extends LayoutTestBase {
-
-    /** Provides test data used by other test cases */
-    private IDragElement[] createSampleElements() {
-        IDragElement[] elements = TestDragElement.create(TestDragElement.create(
-                "android.widget.Button", new Rect(0, 0, 100, 80)).id("@+id/Button01"),
-                TestDragElement.create("android.widget.LinearLayout", new Rect(0, 80, 100, 280))
-                        .id("@+id/LinearLayout01").add(
-                                TestDragElement.create("android.widget.Button",
-                                        new Rect(0, 80, 100, 80)).id("@+id/Button011"),
-                                TestDragElement.create("android.widget.Button",
-                                        new Rect(0, 180, 100, 80)).id("@+id/Button012")),
-                TestDragElement.create("android.widget.Button", new Rect(100, 0, 100, 80)).id(
-                        "@+id/Button02"));
-        return elements;
-    }
-
-    /** Test {@link BaseLayoutRule#collectIds}: Check that basic lookup of id works */
-    public final void testCollectIds1() {
-        IDragElement[] elements = TestDragElement.create(TestDragElement.create(
-                "android.widget.Button", new Rect(0, 0, 100, 80)).id("@+id/Button01"));
-        Map<String, Pair<String, String>> idMap = new HashMap<String, Pair<String, String>>();
-        Map<String, Pair<String, String>> ids = new BaseLayoutRule().collectIds(idMap, elements);
-        assertEquals(1, ids.size());
-        assertEquals("@+id/Button01", ids.keySet().iterator().next());
-    }
-
-    /**
-     * Test {@link BaseLayoutRule#collectIds}: Check that with the wrong URI we
-     * don't pick up the ID
-     */
-    public final void testCollectIds2() {
-        IDragElement[] elements = TestDragElement.create(TestDragElement.create(
-                "android.widget.Button", new Rect(0, 0, 100, 80)).set("myuri", ATTR_ID,
-                "@+id/Button01"));
-
-        Map<String, Pair<String, String>> idMap = new HashMap<String, Pair<String, String>>();
-        Map<String, Pair<String, String>> ids = new BaseLayoutRule().collectIds(idMap, elements);
-        assertEquals(0, ids.size());
-    }
-
-    /**
-     * Test {@link BaseLayoutRule#normalizeId(String)}
-     */
-    public final void testNormalizeId() {
-        assertEquals("foo", new BaseLayoutRule().normalizeId("foo"));
-        assertEquals("@+id/name", new BaseLayoutRule().normalizeId("@id/name"));
-        assertEquals("@+id/name", new BaseLayoutRule().normalizeId("@+id/name"));
-    }
-
-    /**
-     * Test {@link BaseLayoutRule#collectExistingIds}
-     */
-    public final void testCollectExistingIds1() {
-        Set<String> existing = new HashSet<String>();
-        INode node = TestNode.create("android.widget.Button").id("@+id/Button012").add(
-                TestNode.create("android.widget.Button").id("@+id/Button2"));
-
-        new BaseLayoutRule().collectExistingIds(node, existing);
-
-        assertEquals(2, existing.size());
-        assertContainsSame(Arrays.asList("@+id/Button2", "@+id/Button012"), existing);
-    }
-
-    /**
-     * Test {@link BaseLayoutRule#collectIds}: Check that with multiple elements and
-     * some children we still pick up all the right id's
-     */
-    public final void testCollectIds3() {
-        Map<String, Pair<String, String>> idMap = new HashMap<String, Pair<String, String>>();
-
-        IDragElement[] elements = createSampleElements();
-        Map<String, Pair<String, String>> ids = new BaseLayoutRule().collectIds(idMap, elements);
-        assertEquals(5, ids.size());
-        assertContainsSame(Arrays.asList("@+id/Button01", "@+id/Button02", "@+id/Button011",
-                "@+id/Button012", "@+id/LinearLayout01"), ids.keySet());
-
-        // Make sure the Pair has the right stuff too;
-        // (having the id again in the pair seems redundant; see if I really
-        // need it in the implementation)
-        assertEquals(Pair.of("@+id/LinearLayout01", "android.widget.LinearLayout"), ids
-                .get("@+id/LinearLayout01"));
-    }
-
-    /**
-     * Test {@link BaseLayoutRule#remapIds}: Ensure that it identifies a conflict
-     */
-    public final void testRemapIds1() {
-        Map<String, Pair<String, String>> idMap = new HashMap<String, Pair<String, String>>();
-        BaseLayoutRule baseLayout = new BaseLayoutRule();
-        IDragElement[] elements = createSampleElements();
-        baseLayout.collectIds(idMap, elements);
-        INode node = TestNode.create("android.widget.Button").id("@+id/Button012").add(
-                TestNode.create("android.widget.Button").id("@+id/Button2"));
-
-        assertEquals(5, idMap.size());
-        Map<String, Pair<String, String>> remapped = baseLayout.remapIds(node, idMap);
-        // 4 original from the sample elements, plus overlap with one
-        // (Button012) - one new
-        // button added in
-        assertEquals(6, remapped.size());
-
-        // TODO: I'm a little confused about what exactly this method should do;
-        // check with Raphael.
-    }
-
-
-    /**
-     * Test {@link BaseLayoutRule#getDropIdMap}
-     */
-    public final void testGetDropIdMap() {
-        BaseLayoutRule baseLayout = new BaseLayoutRule();
-        IDragElement[] elements = createSampleElements();
-        INode node = TestNode.create("android.widget.Button").id("@+id/Button012").add(
-                TestNode.create("android.widget.Button").id("@+id/Button2"));
-
-        Map<String, Pair<String, String>> idMap = baseLayout.getDropIdMap(node, elements, true);
-        assertContainsSame(Arrays.asList("@+id/Button01", "@+id/Button012", "@+id/Button011",
-                "@id/Button012", "@+id/Button02", "@+id/LinearLayout01"), idMap
-                .keySet());
-
-        // TODO: I'm a little confused about what exactly this method should do;
-        // check with Raphael.
-    }
-
-    public final void testAddAttributes1() {
-        BaseLayoutRule layout = new BaseLayoutRule();
-
-        // First try with no filter
-        IDragElement oldElement = TestDragElement.create("a.w.B").id("@+id/foo");
-        INode newNode = TestNode.create("a.w.B").id("@+id/foo").set("u", "key", "value").set("u",
-                "nothidden", "nothiddenvalue");
-        ;
-        AttributeFilter filter = null;
-        // No references in this test case
-        Map<String, Pair<String, String>> idMap = null;
-
-        layout.addAttributes(newNode, oldElement, idMap, filter);
-        assertEquals("value", newNode.getStringAttr("u", "key"));
-        assertEquals("nothiddenvalue", newNode.getStringAttr("u", "nothidden"));
-    }
-
-    public final void testAddAttributes2() {
-        // Test filtering
-        BaseLayoutRule layout = new BaseLayoutRule();
-
-        // First try with no filter
-        IDragElement oldElement = TestDragElement.create("a.w.B").id("@+id/foo");
-        INode newNode = TestNode.create("a.w.B").id("@+id/foo").set("u", "key", "value").set("u",
-                "hidden", "hiddenvalue");
-        AttributeFilter filter = new AttributeFilter() {
-
-            @Override
-            public String replace(String attributeUri, String attributeName,
-                    String attributeValue) {
-                if (attributeName.equals("hidden")) {
-                    return null;
-                }
-
-                return attributeValue;
-            }
-        };
-        // No references in this test case
-        Map<String, Pair<String, String>> idMap = null;
-
-        layout.addAttributes(newNode, oldElement, idMap, filter);
-        assertEquals("value", newNode.getStringAttr("u", "key"));
-    }
-
-    public final void testFindNewId() {
-        BaseLayoutRule baseLayout = new BaseLayoutRule();
-        Set<String> existing = new HashSet<String>();
-        assertEquals("@+id/Widget01", baseLayout.findNewId("a.w.Widget", existing));
-
-        existing.add("@+id/Widget01");
-        assertEquals("@+id/Widget02", baseLayout.findNewId("a.w.Widget", existing));
-
-        existing.add("@+id/Widget02");
-        assertEquals("@+id/Widget03", baseLayout.findNewId("a.w.Widget", existing));
-
-        existing.remove("@+id/Widget02");
-        assertEquals("@+id/Widget02", baseLayout.findNewId("a.w.Widget", existing));
-    }
-
-    public final void testDefaultAttributeFilter() {
-        assertEquals("true", BaseLayoutRule.DEFAULT_ATTR_FILTER.replace("myuri", "layout_alignRight",
-                "true"));
-        assertEquals(null, BaseLayoutRule.DEFAULT_ATTR_FILTER.replace(ANDROID_URI,
-                "layout_alignRight", "true"));
-        assertEquals("true", BaseLayoutRule.DEFAULT_ATTR_FILTER.replace(ANDROID_URI,
-                "myproperty", "true"));
-    }
-
-    public final void testAddInnerElements() {
-        IDragElement oldElement = TestDragElement.create("root").add(
-                TestDragElement.create("a.w.B").id("@+id/child1")
-                        .set("uri", "childprop1", "value1"),
-                TestDragElement.create("a.w.B").id("@+id/child2").set("uri", "childprop2a",
-                        "value2a").set("uri", "childprop2b", "value2b"));
-        INode newNode = TestNode.create("a.w.B").id("@+id/foo");
-        Map<String, Pair<String, String>> idMap = new HashMap<String, Pair<String, String>>();
-        BaseLayoutRule layout = new BaseLayoutRule();
-        layout.addInnerElements(newNode, oldElement, idMap);
-        assertEquals(2, newNode.getChildren().length);
-
-        assertEquals("value2b", newNode.getChildren()[1].getStringAttr("uri", "childprop2b"));
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/common/layout/BaseViewRuleTest.java b/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/common/layout/BaseViewRuleTest.java
deleted file mode 100644
index 6d46b1e..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/common/layout/BaseViewRuleTest.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Copyright (C) 2010 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.layout;
-
-import java.util.Arrays;
-import java.util.Collections;
-
-import junit.framework.TestCase;
-
-public class BaseViewRuleTest extends TestCase {
-
-    public final void testGetAttributeDisplayName() {
-        assertEquals(null, BaseViewRule.getAttributeDisplayName(null));
-        assertEquals("", BaseViewRule.getAttributeDisplayName(""));
-        assertEquals("Foo", BaseViewRule.getAttributeDisplayName("foo"));
-        assertEquals("FooBar", BaseViewRule.getAttributeDisplayName("fooBar"));
-        assertEquals("Foo Bar", BaseViewRule.getAttributeDisplayName("foo_bar"));
-        // TBD: Should we also handle CamelCase properties?
-        // assertEquals("Foo Bar", BaseViewRule.getAttributeDisplayName("fooBar"));
-    }
-
-    public final void testJoin() {
-        assertEquals("foo", BaseViewRule.join('|', Arrays.asList("foo")));
-        assertEquals("", BaseViewRule.join('|', Collections.<String>emptyList()));
-        assertEquals("foo,bar", BaseViewRule.join(',', Arrays.asList("foo", "bar")));
-        assertEquals("foo|bar", BaseViewRule.join('|', Arrays.asList("foo", "bar")));
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/common/layout/FrameLayoutRuleTest.java b/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/common/layout/FrameLayoutRuleTest.java
deleted file mode 100644
index 4a60566..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/common/layout/FrameLayoutRuleTest.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- * Copyright (C) 2010 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.layout;
-
-import com.android.ide.common.api.INode;
-import com.android.ide.common.api.Point;
-import com.android.ide.common.api.Rect;
-
-/** Test the {@link FrameLayoutRule} */
-public class FrameLayoutRuleTest extends LayoutTestBase {
-    // Utility for other tests
-    protected void dragInto(Rect dragBounds, Point dragPoint, int insertIndex, int currentIndex,
-            String... graphicsFragments) {
-        INode layout = TestNode.create("android.widget.FrameLayout").id("@+id/FrameLayout01")
-                .bounds(new Rect(0, 0, 240, 480)).add(
-                        TestNode.create("android.widget.Button").id("@+id/Button01").bounds(
-                                new Rect(0, 0, 100, 80)),
-                        TestNode.create("android.widget.Button").id("@+id/Button02").bounds(
-                                new Rect(0, 100, 100, 80)),
-                        TestNode.create("android.widget.Button").id("@+id/Button03").bounds(
-                                new Rect(0, 200, 100, 80)),
-                        TestNode.create("android.widget.Button").id("@+id/Button04").bounds(
-                                new Rect(0, 300, 100, 80)));
-
-        super.dragInto(new FrameLayoutRule(), layout, dragBounds, dragPoint, null,
-                insertIndex, currentIndex, graphicsFragments);
-    }
-
-    public void testDragMiddle() {
-        dragInto(
-        // Bounds of the dragged item
-                new Rect(0, 0, 105, 80),
-                // Drag point
-                new Point(30, -10),
-                // Expected insert location: We just append in absolute layout
-                4,
-                // Not dragging one of the existing children
-                -1,
-                // Bounds rectangle
-                "useStyle(DROP_RECIPIENT), drawRect(Rect[0,0,240,480])",
-
-                // Drop Preview
-                "useStyle(DROP_PREVIEW), drawRect(0,0,105,80)");
-        // Without drag bounds we should just draw guide lines instead
-        dragInto(new Rect(0, 0, 0, 0), new Point(30, -10), 4, -1,
-                "useStyle(DROP_RECIPIENT), drawRect(Rect[0,0,240,480])",
-                "useStyle(DROP_PREVIEW), drawLine(1,0,1,480), drawLine(0,1,240,1)");
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/common/layout/GravityHelperTest.java b/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/common/layout/GravityHelperTest.java
deleted file mode 100644
index 8161bab..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/common/layout/GravityHelperTest.java
+++ /dev/null
@@ -1,127 +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.layout;
-
-import static com.android.ide.common.layout.GravityHelper.GRAVITY_BOTTOM;
-import static com.android.ide.common.layout.GravityHelper.GRAVITY_CENTER_HORIZ;
-import static com.android.ide.common.layout.GravityHelper.GRAVITY_CENTER_VERT;
-import static com.android.ide.common.layout.GravityHelper.GRAVITY_END;
-import static com.android.ide.common.layout.GravityHelper.GRAVITY_FILL_HORIZ;
-import static com.android.ide.common.layout.GravityHelper.GRAVITY_FILL_VERT;
-import static com.android.ide.common.layout.GravityHelper.GRAVITY_LEFT;
-import static com.android.ide.common.layout.GravityHelper.GRAVITY_RIGHT;
-import static com.android.ide.common.layout.GravityHelper.GRAVITY_START;
-import static com.android.ide.common.layout.GravityHelper.GRAVITY_TOP;
-import static com.android.ide.common.layout.GravityHelper.getGravity;
-
-import com.android.utils.XmlUtils;
-
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-
-import junit.framework.TestCase;
-
-@SuppressWarnings("javadoc")
-public class GravityHelperTest extends TestCase {
-    public void testGravity() throws Exception {
-        assertEquals(GRAVITY_BOTTOM, GravityHelper.getGravity("bottom", 0));
-        assertEquals(GRAVITY_BOTTOM | GRAVITY_LEFT, GravityHelper.getGravity("bottom|left", 0));
-        assertEquals(GRAVITY_BOTTOM | GRAVITY_LEFT | GRAVITY_START,
-                GravityHelper.getGravity("bottom|left|start", 0));
-        assertEquals(GRAVITY_BOTTOM | GRAVITY_LEFT | GRAVITY_START,
-                GravityHelper.getGravity("bottom|start|left", 0));
-        assertEquals(GRAVITY_BOTTOM | GRAVITY_RIGHT | GRAVITY_END,
-                GravityHelper.getGravity("bottom|right|end", 0));
-        assertEquals(GRAVITY_BOTTOM | GRAVITY_RIGHT | GRAVITY_END,
-                GravityHelper.getGravity("bottom|end|right", 0));
-        assertEquals(GRAVITY_CENTER_HORIZ | GRAVITY_CENTER_VERT,
-                GravityHelper.getGravity("center", 0));
-    }
-
-    public void testGravityString() throws Exception {
-        assertEquals("left", getGravity(GRAVITY_LEFT));
-        assertEquals("start", getGravity(GRAVITY_START));
-        assertEquals("right", getGravity(GRAVITY_RIGHT));
-        assertEquals("end", getGravity(GRAVITY_END));
-        assertEquals("top", getGravity(GRAVITY_TOP));
-        assertEquals("bottom", getGravity(GRAVITY_BOTTOM));
-        assertEquals("center_horizontal", getGravity(GRAVITY_CENTER_HORIZ));
-        assertEquals("center_vertical", getGravity(GRAVITY_CENTER_VERT));
-        assertEquals("fill_horizontal", getGravity(GRAVITY_FILL_HORIZ));
-        assertEquals("fill_vertical", getGravity(GRAVITY_FILL_VERT));
-
-        assertEquals("center", getGravity(GRAVITY_CENTER_HORIZ|GRAVITY_CENTER_VERT));
-
-        assertEquals("left|bottom", getGravity(GRAVITY_LEFT|GRAVITY_BOTTOM));
-        assertEquals("left|start|bottom", getGravity(GRAVITY_LEFT|GRAVITY_START|GRAVITY_BOTTOM));
-        assertEquals("center_horizontal|top", getGravity(GRAVITY_CENTER_HORIZ|GRAVITY_TOP));
-    }
-
-    public void testConstrained() throws Exception {
-        assertTrue(GravityHelper.isConstrainedHorizontally(GRAVITY_LEFT));
-        assertTrue(GravityHelper.isConstrainedHorizontally(GRAVITY_START));
-        assertTrue(GravityHelper.isConstrainedHorizontally(GRAVITY_RIGHT));
-        assertTrue(GravityHelper.isConstrainedHorizontally(GRAVITY_END));
-        assertTrue(GravityHelper.isConstrainedHorizontally(GRAVITY_CENTER_HORIZ));
-        assertTrue(GravityHelper.isConstrainedHorizontally(GRAVITY_FILL_HORIZ));
-
-        assertFalse(GravityHelper.isConstrainedVertically(GRAVITY_LEFT));
-        assertFalse(GravityHelper.isConstrainedVertically(GRAVITY_START));
-        assertFalse(GravityHelper.isConstrainedVertically(GRAVITY_RIGHT));
-        assertFalse(GravityHelper.isConstrainedVertically(GRAVITY_END));
-        assertFalse(GravityHelper.isConstrainedVertically(GRAVITY_CENTER_HORIZ));
-        assertFalse(GravityHelper.isConstrainedVertically(GRAVITY_FILL_HORIZ));
-
-        assertTrue(GravityHelper.isConstrainedVertically(GRAVITY_TOP));
-        assertTrue(GravityHelper.isConstrainedVertically(GRAVITY_BOTTOM));
-        assertTrue(GravityHelper.isConstrainedVertically(GRAVITY_CENTER_VERT));
-        assertTrue(GravityHelper.isConstrainedVertically(GRAVITY_FILL_VERT));
-
-        assertFalse(GravityHelper.isConstrainedHorizontally(GRAVITY_TOP));
-        assertFalse(GravityHelper.isConstrainedHorizontally(GRAVITY_BOTTOM));
-        assertFalse(GravityHelper.isConstrainedHorizontally(GRAVITY_CENTER_VERT));
-        assertFalse(GravityHelper.isConstrainedHorizontally(GRAVITY_FILL_VERT));
-    }
-
-    public void testAligned() throws Exception {
-        assertTrue(GravityHelper.isLeftAligned(GRAVITY_LEFT|GRAVITY_TOP));
-        assertTrue(GravityHelper.isLeftAligned(GRAVITY_START|GRAVITY_TOP));
-        assertTrue(GravityHelper.isLeftAligned(GRAVITY_LEFT));
-        assertTrue(GravityHelper.isLeftAligned(GRAVITY_START));
-        assertFalse(GravityHelper.isLeftAligned(GRAVITY_RIGHT));
-        assertFalse(GravityHelper.isLeftAligned(GRAVITY_END));
-
-        assertTrue(GravityHelper.isTopAligned(GRAVITY_LEFT|GRAVITY_TOP));
-        assertTrue(GravityHelper.isTopAligned(GRAVITY_START|GRAVITY_TOP));
-        assertTrue(GravityHelper.isTopAligned(GRAVITY_TOP));
-        assertFalse(GravityHelper.isTopAligned(GRAVITY_BOTTOM));
-    }
-
-    public void testElement() throws Exception {
-        Document document = XmlUtils.parseDocumentSilently(""
-                + "<?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:layout_gravity=\"start|center_vertical|left\""
-                + "    android:orientation=\"vertical\" />\n", true);
-        assertNotNull(document);
-        Element element = document.getDocumentElement();
-        assertNotNull(element);
-        int gravity = GravityHelper.getGravity(element);
-        assertEquals("left|start|center_vertical", GravityHelper.getGravity(gravity));
-    }
-}
\ No newline at end of file
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/common/layout/GridLayoutRuleTest.java b/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/common/layout/GridLayoutRuleTest.java
deleted file mode 100644
index f048365..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/common/layout/GridLayoutRuleTest.java
+++ /dev/null
@@ -1,23 +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.layout;
-
-
-public class GridLayoutRuleTest extends LayoutTestBase {
-    @Override
-    public void testDummy() {
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/common/layout/LayoutTestBase.java b/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/common/layout/LayoutTestBase.java
deleted file mode 100644
index 4b4bb81..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/common/layout/LayoutTestBase.java
+++ /dev/null
@@ -1,375 +0,0 @@
-/*
- * Copyright (C) 2010 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.layout;
-
-import static com.android.SdkConstants.ANDROID_URI;
-import static com.android.SdkConstants.ATTR_ID;
-
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-import com.android.ide.common.api.DropFeedback;
-import com.android.ide.common.api.IClientRulesEngine;
-import com.android.ide.common.api.IDragElement;
-import com.android.ide.common.api.INode;
-import com.android.ide.common.api.IValidator;
-import com.android.ide.common.api.IViewMetadata;
-import com.android.ide.common.api.IViewRule;
-import com.android.ide.common.api.Margins;
-import com.android.ide.common.api.Point;
-import com.android.ide.common.api.Rect;
-import com.android.ide.eclipse.adt.internal.editors.layout.gre.ViewMetadataRepository;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.List;
-import java.util.Map;
-
-import junit.framework.TestCase;
-
-/**
- * Common layout helpers from LayoutRule tests
- */
-@SuppressWarnings("javadoc")
-public class LayoutTestBase extends TestCase {
-    /**
-     * Helper function used by tests to drag a button into a canvas containing
-     * the given children.
-     *
-     * @param rule The rule to test on
-     * @param targetNode The target layout node to drag into
-     * @param dragBounds The (original) bounds of the dragged item
-     * @param dropPoint The drag point we should drag to and drop
-     * @param secondDropPoint An optional second drag point to drag to before
-     *            drawing graphics and dropping (or null if not applicable)
-     * @param insertIndex The expected insert position we end up with after
-     *            dropping at the dropPoint
-     * @param currentIndex If the dragged widget is already in the canvas this
-     *            should be its child index; if not, pass in -1
-     * @param graphicsFragments This is a varargs array of String fragments
-     *            we expect to see in the graphics output on the drag over
-     *            event.
-     * @return The inserted node
-     */
-    protected INode dragInto(IViewRule rule, INode targetNode, Rect dragBounds, Point dropPoint,
-            Point secondDropPoint, int insertIndex, int currentIndex,
-            String... graphicsFragments) {
-
-        String draggedButtonId = (currentIndex == -1) ? "@+id/DraggedButton" : targetNode
-                .getChildren()[currentIndex].getStringAttr(ANDROID_URI, ATTR_ID);
-
-        IDragElement[] elements = TestDragElement.create(TestDragElement.create(
-                "android.widget.Button", dragBounds).id(draggedButtonId));
-
-        // Enter target
-        DropFeedback feedback = rule.onDropEnter(targetNode, null/*targetView*/, elements);
-        assertNotNull(feedback);
-        assertFalse(feedback.invalidTarget);
-        assertNotNull(feedback.painter);
-
-        if (currentIndex != -1) {
-            feedback.sameCanvas = true;
-        }
-
-        // Move near top left corner of the target
-        feedback = rule.onDropMove(targetNode, elements, feedback, dropPoint);
-        assertNotNull(feedback);
-
-        if (secondDropPoint != null) {
-            feedback = rule.onDropMove(targetNode, elements, feedback, secondDropPoint);
-            assertNotNull(feedback);
-        }
-
-        if (insertIndex == -1) {
-            assertTrue(feedback.invalidTarget);
-        } else {
-            assertFalse(feedback.invalidTarget);
-        }
-
-        // Paint feedback and make sure it's what we expect
-        TestGraphics graphics = new TestGraphics();
-        assertNotNull(feedback.painter);
-        feedback.painter.paint(graphics, targetNode, feedback);
-        String drawn = graphics.getDrawn().toString();
-
-        // Check that each graphics fragment is drawn
-        for (String fragment : graphicsFragments) {
-            if (!drawn.contains(fragment)) {
-                // Get drawn-output since unit test truncates message in below
-                // contains-assertion
-                System.out.println("Could not find: " + fragment);
-                System.out.println("Full graphics output: " + drawn);
-            }
-            assertTrue(fragment + " not found; full=" + drawn, drawn.contains(fragment));
-        }
-
-        // Attempt a drop?
-        if (insertIndex == -1) {
-            // No, not expected to succeed (for example, when drop point is over an
-            // invalid region in RelativeLayout) - just return.
-            return null;
-        }
-        int childrenCountBefore = targetNode.getChildren().length;
-        rule.onDropped(targetNode, elements, feedback, dropPoint);
-
-        if (currentIndex == -1) {
-            // Inserting new from outside
-            assertEquals(childrenCountBefore+1, targetNode.getChildren().length);
-        } else {
-            // Moving from existing; must remove in old position first
-            ((TestNode) targetNode).removeChild(currentIndex);
-
-            assertEquals(childrenCountBefore, targetNode.getChildren().length);
-        }
-        // Ensure that it's inserted in the right place
-        String actualId = targetNode.getChildren()[insertIndex].getStringAttr(
-                ANDROID_URI, ATTR_ID);
-        if (!draggedButtonId.equals(actualId)) {
-            // Using assertEquals instead of fail to get nice diff view on test
-            // failure
-            List<String> childrenIds = new ArrayList<String>();
-            for (INode child : targetNode.getChildren()) {
-                childrenIds.add(child.getStringAttr(ANDROID_URI, ATTR_ID));
-            }
-            int index = childrenIds.indexOf(draggedButtonId);
-            String message = "Button found at index " + index + " instead of " + insertIndex
-                    + " among " + childrenIds;
-            System.out.println(message);
-            assertEquals(message, draggedButtonId, actualId);
-        }
-
-
-        return targetNode.getChildren()[insertIndex];
-    }
-
-    /**
-     * Utility method for asserting that two collections contain exactly the
-     * same elements (regardless of order)
-     * @param expected expected collection
-     * @param actual  actual collection
-     */
-    public static void assertContainsSame(Collection<String> expected, Collection<String> actual) {
-        if (expected.size() != actual.size()) {
-            fail("Collection sizes differ; expected " + expected.size() + " but was "
-                    + actual.size());
-        }
-
-        // Sort prior to comparison to ensure we have the same elements
-        // regardless of order
-        List<String> expectedList = new ArrayList<String>(expected);
-        Collections.sort(expectedList);
-        List<String> actualList = new ArrayList<String>(actual);
-        Collections.sort(actualList);
-        // Instead of just assertEquals(expectedList, actualList);
-        // we iterate one element at a time so we can show the first
-        // -difference-.
-        for (int i = 0; i < expectedList.size(); i++) {
-            String expectedElement = expectedList.get(i);
-            String actualElement = actualList.get(i);
-            if (!expectedElement.equals(actualElement)) {
-                System.out.println("Expected items: " + expectedList);
-                System.out.println("Actual items  : " + actualList);
-            }
-            assertEquals("Collections differ; first difference:", expectedElement, actualElement);
-        }
-    }
-
-    protected void initialize(IViewRule rule, String fqn) {
-        rule.onInitialize(fqn, new TestRulesEngine(fqn));
-    }
-
-    public static class TestRulesEngine implements IClientRulesEngine {
-        private final String mFqn;
-
-        public TestRulesEngine(String fqn) {
-            mFqn = fqn;
-        }
-
-        @Override
-        public void debugPrintf(@NonNull String msg, Object... params) {
-            fail("Not supported in tests yet");
-        }
-
-        @Override
-        public void displayAlert(@NonNull String message) {
-            fail("Not supported in tests yet");
-        }
-
-        @Override
-        public String displayInput(@NonNull String message, @Nullable String value,
-                @Nullable IValidator filter) {
-            fail("Not supported in tests yet");
-            return null;
-        }
-
-        @Override
-        public @NonNull String getFqcn() {
-            return mFqn;
-        }
-
-        @Override
-        public @NonNull IViewMetadata getMetadata(final @NonNull String fqcn) {
-            return new IViewMetadata() {
-                @Override
-                public @NonNull String getDisplayName() {
-                    // This also works when there is no "."
-                    return fqcn.substring(fqcn.lastIndexOf('.') + 1);
-                }
-
-                @Override
-                public @NonNull FillPreference getFillPreference() {
-                    return ViewMetadataRepository.get().getFillPreference(fqcn);
-                }
-
-                @Override
-                public @NonNull Margins getInsets() {
-                    return null;
-                }
-
-                @Override
-                public @NonNull List<String> getTopAttributes() {
-                    return ViewMetadataRepository.get().getTopAttributes(fqcn);
-                }
-            };
-        }
-
-        @Override
-        public int getMinApiLevel() {
-            return 8;
-        }
-
-        @Override
-        public IViewRule loadRule(@NonNull String fqcn) {
-            fail("Not supported in tests yet");
-            return null;
-        }
-
-        @Override
-        public String displayReferenceInput(String currentValue) {
-            fail("Not supported in tests yet");
-            return null;
-        }
-
-        @Override
-        public IValidator getResourceValidator(String resourceTypeName, boolean uniqueInProject,
-                boolean uniqueInLayout, boolean exists, String... allowed) {
-            fail("Not supported in tests yet");
-            return null;
-        }
-
-        @Override
-        public String displayResourceInput(@NonNull String resourceTypeName,
-                @Nullable String currentValue) {
-            fail("Not supported in tests yet");
-            return null;
-        }
-
-        @Override
-        public String[] displayMarginInput(@Nullable String all, @Nullable String left,
-                @Nullable String right, @Nullable String top, @Nullable String bottom) {
-            fail("Not supported in tests yet");
-            return null;
-        }
-
-        @Override
-        public String displayIncludeSourceInput() {
-            fail("Not supported in tests yet");
-            return null;
-        }
-
-        @Override
-        public void select(@NonNull Collection<INode> nodes) {
-            fail("Not supported in tests yet");
-        }
-
-        @Override
-        public String displayFragmentSourceInput() {
-            fail("Not supported in tests yet");
-            return null;
-        }
-
-        @Override
-        public void layout() {
-            fail("Not supported in tests yet");
-        }
-
-        @Override
-        public void redraw() {
-            fail("Not supported in tests yet");
-        }
-
-        @Override
-        public Map<INode, Rect> measureChildren(@NonNull INode parent,
-                @Nullable AttributeFilter filter) {
-            return null;
-        }
-
-        @Override
-        public int pxToDp(int px) {
-            // Arbitrary conversion
-            return px / 3;
-        }
-
-        @Override
-        public int dpToPx(int dp) {
-            // Arbitrary conversion
-            return 3 * dp;
-        }
-
-        @Override
-        public @NonNull String getUniqueId(@NonNull String prefix) {
-            fail("Not supported in tests yet");
-            return null;
-        }
-
-        @Override
-        public int screenToLayout(int pixels) {
-            fail("Not supported in tests yet");
-            return pixels;
-        }
-
-        @Override
-        public @NonNull String getAppNameSpace() {
-            fail("Not supported in tests yet");
-            return null;
-        }
-
-        @Override
-        public @Nullable Object getViewObject(@NonNull INode node) {
-            fail("Not supported in tests yet");
-            return null;
-        }
-
-        @Override
-        public boolean rename(INode node) {
-            fail("Not supported in tests yet");
-            return false;
-        }
-
-        @Override
-        @Nullable
-        public String displayCustomViewClassInput() {
-            fail("Not supported in tests yet");
-            return null;
-        }
-    }
-
-    public void testDummy() {
-        // To avoid JUnit warning that this class contains no tests, even though
-        // this is an abstract class and JUnit shouldn't try
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/common/layout/LinearLayoutRuleTest.java b/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/common/layout/LinearLayoutRuleTest.java
deleted file mode 100644
index 9c4c934..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/common/layout/LinearLayoutRuleTest.java
+++ /dev/null
@@ -1,466 +0,0 @@
-/*
- * Copyright (C) 2010 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.layout;
-
-import static com.android.SdkConstants.ANDROID_URI;
-import static com.android.SdkConstants.ATTR_ID;
-import static com.android.SdkConstants.ATTR_LAYOUT_HEIGHT;
-import static com.android.SdkConstants.ATTR_LAYOUT_WIDTH;
-import static com.android.SdkConstants.ATTR_ORIENTATION;
-import static com.android.SdkConstants.VALUE_HORIZONTAL;
-import static com.android.SdkConstants.VALUE_VERTICAL;
-
-import com.android.ide.common.api.DropFeedback;
-import com.android.ide.common.api.IAttributeInfo.Format;
-import com.android.ide.common.api.IDragElement;
-import com.android.ide.common.api.IMenuCallback;
-import com.android.ide.common.api.INode;
-import com.android.ide.common.api.IViewRule;
-import com.android.ide.common.api.Point;
-import com.android.ide.common.api.Rect;
-import com.android.ide.common.api.RuleAction;
-import com.android.ide.common.api.RuleAction.NestedAction;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
-
-/** Test the {@link LinearLayoutRule} */
-public class LinearLayoutRuleTest extends LayoutTestBase {
-    // Utility for other tests
-    protected void dragIntoEmpty(Rect dragBounds) {
-        boolean haveBounds = dragBounds.isValid();
-
-        IViewRule rule = new LinearLayoutRule();
-
-        INode targetNode = TestNode.create("android.widget.LinearLayout").id(
-        "@+id/LinearLayout01").bounds(new Rect(0, 0, 240, 480));
-        Point dropPoint = new Point(10, 5);
-
-        IDragElement[] elements = TestDragElement.create(TestDragElement.create(
-                "android.widget.Button", dragBounds).id("@+id/Button01"));
-
-        // Enter target
-        DropFeedback feedback = rule.onDropEnter(targetNode, null/*targetView*/, elements);
-        assertNotNull(feedback);
-        assertFalse(feedback.invalidTarget);
-        assertNotNull(feedback.painter);
-
-        feedback = rule.onDropMove(targetNode, elements, feedback, dropPoint);
-        assertNotNull(feedback);
-        assertFalse(feedback.invalidTarget);
-
-        // Paint feedback and make sure it's what we expect
-        TestGraphics graphics = new TestGraphics();
-        assertNotNull(feedback.painter);
-        feedback.painter.paint(graphics, targetNode, feedback);
-        assertEquals(
-                // Expect to see a recipient rectangle around the bounds of the
-                // LinearLayout,
-                // as well as a single vertical line as a drop preview located
-                // along the left
-                // edge (for this horizontal linear layout) showing insert
-                // position at index 0,
-                // and finally a rectangle for the bounds of the inserted button
-                // centered over
-                // the middle
-                "[useStyle(DROP_RECIPIENT), "
-                        +
-                        // Bounds rectangle
-                        "drawRect(Rect[0,0,240,480]), "
-                        + "useStyle(DROP_ZONE), drawLine(1,0,1,480), "
-                        + "useStyle(DROP_ZONE_ACTIVE), " + "useStyle(DROP_PREVIEW), " +
-                        // Insert position line
-                        "drawLine(1,0,1,480)" + (haveBounds ?
-                        // Outline of dragged node centered over position line
-                        ", useStyle(DROP_PREVIEW), " + "drawRect(1,0,101,80)"
-                                // Nothing when we don't have bounds
-                                : "") + "]", graphics.getDrawn().toString());
-
-        // Attempt a drop
-        assertEquals(0, targetNode.getChildren().length);
-        rule.onDropped(targetNode, elements, feedback, dropPoint);
-        assertEquals(1, targetNode.getChildren().length);
-        assertEquals("@+id/Button01", targetNode.getChildren()[0].getStringAttr(
-                ANDROID_URI, ATTR_ID));
-    }
-
-    // Utility for other tests
-    protected INode dragInto(boolean vertical, Rect dragBounds, Point dragPoint,
-            int insertIndex, int currentIndex,
-            String... graphicsFragments) {
-        INode linearLayout = TestNode.create("android.widget.LinearLayout").id(
-                "@+id/LinearLayout01").bounds(new Rect(0, 0, 240, 480)).set(ANDROID_URI,
-                ATTR_ORIENTATION,
-                vertical ? VALUE_VERTICAL : VALUE_HORIZONTAL)
-                .add(
-                        TestNode.create("android.widget.Button").id("@+id/Button01").bounds(
-                                new Rect(0, 0, 100, 80)),
-                        TestNode.create("android.widget.Button").id("@+id/Button02").bounds(
-                                new Rect(0, 100, 100, 80)),
-                        TestNode.create("android.widget.Button").id("@+id/Button03").bounds(
-                                new Rect(0, 200, 100, 80)),
-                        TestNode.create("android.widget.Button").id("@+id/Button04").bounds(
-                                new Rect(0, 300, 100, 80)));
-
-        return super.dragInto(new LinearLayoutRule(), linearLayout, dragBounds, dragPoint, null,
-                insertIndex, currentIndex, graphicsFragments);
-    }
-
-    // Check that the context menu registers the expected menu items
-    public void testContextMenu() {
-        LinearLayoutRule rule = new LinearLayoutRule();
-        initialize(rule, "android.widget.LinearLayout");
-        INode node = TestNode.create("android.widget.Button").id("@+id/Button012");
-
-        List<RuleAction> contextMenu = new ArrayList<RuleAction>();
-        rule.addContextMenuActions(contextMenu, node);
-        assertEquals(6, contextMenu.size());
-        assertEquals("Edit ID...", contextMenu.get(0).getTitle());
-        assertTrue(contextMenu.get(1) instanceof RuleAction.Separator);
-        assertEquals("Layout Width", contextMenu.get(2).getTitle());
-        assertEquals("Layout Height", contextMenu.get(3).getTitle());
-        assertTrue(contextMenu.get(4) instanceof RuleAction.Separator);
-        assertEquals("Other Properties", contextMenu.get(5).getTitle());
-
-        RuleAction propertiesMenu = contextMenu.get(5);
-        assertTrue(propertiesMenu.getClass().getName(),
-                propertiesMenu instanceof NestedAction);
-    }
-
-    public void testContextMenuCustom() {
-        LinearLayoutRule rule = new LinearLayoutRule();
-        initialize(rule, "android.widget.LinearLayout");
-        INode node = TestNode.create("android.widget.LinearLayout").id("@+id/LinearLayout")
-            .set(ANDROID_URI, ATTR_LAYOUT_WIDTH, "42dip")
-            .set(ANDROID_URI, ATTR_LAYOUT_HEIGHT, "50sp");
-
-        List<RuleAction> contextMenu = new ArrayList<RuleAction>();
-        rule.addContextMenuActions(contextMenu, node);
-        assertEquals(6, contextMenu.size());
-        assertEquals("Layout Width", contextMenu.get(2).getTitle());
-        RuleAction menuAction = contextMenu.get(2);
-        assertTrue(menuAction instanceof RuleAction.Choices);
-        RuleAction.Choices choices = (RuleAction.Choices) menuAction;
-        List<String> titles = choices.getTitles();
-        List<String> ids = choices.getIds();
-        assertEquals("Wrap Content", titles.get(0));
-        assertEquals("wrap_content", ids.get(0));
-        assertEquals("Match Parent", titles.get(1));
-        assertEquals("match_parent", ids.get(1));
-        assertEquals("42dip", titles.get(2));
-        assertEquals("42dip", ids.get(2));
-        assertEquals("42dip", choices.getCurrent());
-    }
-
-    // Check that the context menu manipulates the orientation attribute
-    public void testOrientation() {
-        LinearLayoutRule rule = new LinearLayoutRule();
-        initialize(rule, "android.widget.LinearLayout");
-        TestNode node = TestNode.create("android.widget.LinearLayout").id("@+id/LinearLayout012");
-        node.putAttributeInfo(ANDROID_URI, "orientation",
-                new TestAttributeInfo(ATTR_ORIENTATION, Format.ENUM_SET,
-                        "android.widget.LinearLayout",
-                        new String[] {"horizontal", "vertical"}, null, null));
-
-        assertNull(node.getStringAttr(ANDROID_URI, ATTR_ORIENTATION));
-
-        List<RuleAction> contextMenu = new ArrayList<RuleAction>();
-        rule.addContextMenuActions(contextMenu, node);
-        assertEquals(7, contextMenu.size());
-        RuleAction orientationAction = contextMenu.get(1);
-        assertEquals("Orientation", orientationAction.getTitle());
-
-        assertTrue(orientationAction.getClass().getName(),
-                orientationAction instanceof RuleAction.Choices);
-
-        RuleAction.Choices choices = (RuleAction.Choices) orientationAction;
-        IMenuCallback callback = choices.getCallback();
-        callback.action(orientationAction, Collections.singletonList(node), VALUE_VERTICAL, true);
-
-        String orientation = node.getStringAttr(ANDROID_URI,
-                ATTR_ORIENTATION);
-        assertEquals(VALUE_VERTICAL, orientation);
-        callback.action(orientationAction, Collections.singletonList(node), VALUE_HORIZONTAL,
-                true);
-        orientation = node.getStringAttr(ANDROID_URI, ATTR_ORIENTATION);
-        assertEquals(VALUE_HORIZONTAL, orientation);
-    }
-
-    // Check that the context menu manipulates the orientation attribute
-    public void testProperties() {
-        LinearLayoutRule rule = new LinearLayoutRule();
-        initialize(rule, "android.widget.LinearLayout");
-        TestNode node = TestNode.create("android.widget.LinearLayout").id("@+id/LinearLayout012");
-        node.putAttributeInfo(ANDROID_URI, "orientation",
-                new TestAttributeInfo(ATTR_ORIENTATION, Format.ENUM_SET,
-                        "android.widget.LinearLayout",
-                        new String[] {"horizontal", "vertical"}, null, null));
-        node.setAttributeSources(Arrays.asList("android.widget.LinearLayout",
-                "android.view.ViewGroup", "android.view.View"));
-        node.putAttributeInfo(ANDROID_URI, "gravity",
-                new TestAttributeInfo("gravity", Format.INTEGER_SET,
-                        "android.widget.LinearLayout", null, null, null));
-
-
-        assertNull(node.getStringAttr(ANDROID_URI, ATTR_ORIENTATION));
-
-        List<RuleAction> contextMenu = new ArrayList<RuleAction>();
-        rule.addContextMenuActions(contextMenu, node);
-        assertEquals(8, contextMenu.size());
-
-        assertEquals("Orientation", contextMenu.get(1).getTitle());
-        assertEquals("Edit Gravity...", contextMenu.get(2).getTitle());
-
-        assertEquals("Other Properties", contextMenu.get(7).getTitle());
-
-        RuleAction propertiesMenu = contextMenu.get(7);
-        assertTrue(propertiesMenu.getClass().getName(),
-                propertiesMenu instanceof NestedAction);
-        NestedAction nested = (NestedAction) propertiesMenu;
-        List<RuleAction> nestedActions = nested.getNestedActions(node);
-        assertEquals(9, nestedActions.size());
-        assertEquals("Recent", nestedActions.get(0).getTitle());
-        assertTrue(nestedActions.get(1) instanceof RuleAction.Separator);
-        assertEquals("Defined by LinearLayout", nestedActions.get(2).getTitle());
-        assertEquals("Inherited from ViewGroup", nestedActions.get(3).getTitle());
-        assertEquals("Inherited from View", nestedActions.get(4).getTitle());
-        assertTrue(nestedActions.get(5) instanceof RuleAction.Separator);
-        assertEquals("Layout Parameters", nestedActions.get(6).getTitle());
-        assertTrue(nestedActions.get(7) instanceof RuleAction.Separator);
-        assertEquals("All By Name", nestedActions.get(8).getTitle());
-
-        BaseViewRule.editedProperty(ATTR_ORIENTATION);
-
-        RuleAction recentAction = nestedActions.get(0);
-        assertTrue(recentAction instanceof NestedAction);
-        NestedAction recentChoices = (NestedAction) recentAction;
-        List<RuleAction> recentItems = recentChoices.getNestedActions(node);
-
-        assertEquals(1, recentItems.size());
-        assertEquals("Orientation", recentItems.get(0).getTitle());
-
-        BaseViewRule.editedProperty("gravity");
-        recentItems = recentChoices.getNestedActions(node);
-        assertEquals(2, recentItems.size());
-        assertEquals("Gravity...", recentItems.get(0).getTitle());
-        assertEquals("Orientation", recentItems.get(1).getTitle());
-
-        BaseViewRule.editedProperty(ATTR_ORIENTATION);
-        recentItems = recentChoices.getNestedActions(node);
-        assertEquals(2, recentItems.size());
-        assertEquals("Orientation", recentItems.get(0).getTitle());
-        assertEquals("Gravity...", recentItems.get(1).getTitle());
-
-        // Lots of other properties -- flushes out properties that apply to this view
-        for (int i = 0; i < 30; i++) {
-            BaseViewRule.editedProperty("dummy_" + i);
-        }
-        recentItems = recentChoices.getNestedActions(node);
-        assertEquals(0, recentItems.size());
-
-        BaseViewRule.editedProperty("gravity");
-        recentItems = recentChoices.getNestedActions(node);
-        assertEquals(1, recentItems.size());
-        assertEquals("Gravity...", recentItems.get(0).getTitle());
-    }
-
-    public void testDragInEmptyWithBounds() {
-        dragIntoEmpty(new Rect(0, 0, 100, 80));
-    }
-
-    public void testDragInEmptyWithoutBounds() {
-        dragIntoEmpty(new Rect(0, 0, 0, 0));
-    }
-
-    public void testDragInVerticalTop() {
-        dragInto(true,
-                // Bounds of the dragged item
-                new Rect(0, 0, 105, 80),
-                // Drag point
-                new Point(30, -10),
-                // Expected insert location
-                0,
-                // Not dragging one of the existing children
-                -1,
-                // Bounds rectangle
-                "useStyle(DROP_RECIPIENT), drawRect(Rect[0,0,240,480])",
-
-                // Drop zones
-                "useStyle(DROP_ZONE), drawLine(0,0,240,0), drawLine(0,90,240,90), "
-                        + "drawLine(0,190,240,190), drawLine(0,290,240,290), "
-                        + "drawLine(0,381,240,381)",
-
-                // Active nearest line
-                "useStyle(DROP_ZONE_ACTIVE), useStyle(DROP_PREVIEW), drawLine(0,0,240,0)",
-
-                // Preview of the dropped rectangle
-                "useStyle(DROP_PREVIEW), drawRect(0,-40,105,40)");
-
-        // Without drag bounds it should be identical except no preview
-        // rectangle
-        dragInto(true,
-                new Rect(0, 0, 0, 0), // Invalid
-                new Point(30, -10), 0, -1,
-                "useStyle(DROP_ZONE_ACTIVE), useStyle(DROP_PREVIEW), drawLine(0,0,240,0)");
-    }
-
-    public void testDragInVerticalBottom() {
-        dragInto(true,
-                // Bounds of the dragged item
-                new Rect(0, 0, 105, 80),
-                // Drag point
-                new Point(30, 500),
-                // Expected insert location
-                4,
-                // Not dragging one of the existing children
-                -1,
-                // Bounds rectangle
-                "useStyle(DROP_RECIPIENT), drawRect(Rect[0,0,240,480])",
-
-                // Drop zones
-                "useStyle(DROP_ZONE), drawLine(0,0,240,0), drawLine(0,90,240,90), "
-                        + "drawLine(0,190,240,190), drawLine(0,290,240,290), drawLine(0,381,240,381), ",
-
-                // Active nearest line
-                "useStyle(DROP_ZONE_ACTIVE), useStyle(DROP_PREVIEW), drawLine(0,381,240,381)",
-
-                // Preview of the dropped rectangle
-                "useStyle(DROP_PREVIEW), drawRect(0,381,105,461)");
-
-        // Check without bounds too
-        dragInto(true, new Rect(0, 0, 105, 80), new Point(30, 500), 4, -1,
-                "useStyle(DROP_PREVIEW), drawRect(0,381,105,461)");
-    }
-
-    public void testDragInVerticalMiddle() {
-        dragInto(true,
-                // Bounds of the dragged item
-                new Rect(0, 0, 105, 80),
-                // Drag point
-                new Point(0, 170),
-                // Expected insert location
-                2,
-                // Not dragging one of the existing children
-                -1,
-                // Bounds rectangle
-                "useStyle(DROP_RECIPIENT), drawRect(Rect[0,0,240,480])",
-
-                // Drop zones
-                "useStyle(DROP_ZONE), drawLine(0,0,240,0), drawLine(0,90,240,90), "
-                        + "drawLine(0,190,240,190), drawLine(0,290,240,290)",
-
-                // Active nearest line
-                "useStyle(DROP_ZONE_ACTIVE), useStyle(DROP_PREVIEW), drawLine(0,190,240,190)",
-
-                // Preview of the dropped rectangle
-                "useStyle(DROP_PREVIEW), drawRect(0,150,105,230)");
-
-        // Check without bounds too
-        dragInto(true, new Rect(0, 0, 105, 80), new Point(0, 170), 2, -1,
-                "useStyle(DROP_PREVIEW), drawRect(0,150,105,230)");
-    }
-
-    public void testDragInVerticalMiddleSelfPos() {
-        // Drag the 2nd button, down to the position between 3rd and 4th
-        dragInto(true,
-                // Bounds of the dragged item
-                new Rect(0, 100, 100, 80),
-                // Drag point
-                new Point(0, 250),
-                // Expected insert location
-                2,
-                // Dragging 1st item
-                1,
-                // Bounds rectangle
-
-                "useStyle(DROP_RECIPIENT), drawRect(Rect[0,0,240,480])",
-
-                // Drop zones - these are different because we exclude drop
-                // zones around the
-                // dragged item itself (it doesn't make sense to insert directly
-                // before or after
-                // myself
-                "useStyle(DROP_ZONE), drawLine(0,0,240,0), drawLine(0,290,240,290), "
-                        + "drawLine(0,381,240,381)",
-
-                // Preview line along insert axis
-                "useStyle(DROP_ZONE_ACTIVE), useStyle(DROP_PREVIEW), drawLine(0,290,240,290)",
-
-                // Preview of dropped rectangle
-                "useStyle(DROP_PREVIEW), drawRect(0,250,100,330)");
-
-        // Test dropping on self (no position change):
-        dragInto(true,
-                // Bounds of the dragged item
-                new Rect(0, 100, 100, 80),
-                // Drag point
-                new Point(0, 210),
-                // Expected insert location
-                1,
-                // Dragging from same pos
-                1,
-                // Bounds rectangle
-                "useStyle(DROP_RECIPIENT), drawRect(Rect[0,0,240,480])",
-
-                // Drop zones - these are different because we exclude drop
-                // zones around the
-                // dragged item itself (it doesn't make sense to insert directly
-                // before or after
-                // myself
-                "useStyle(DROP_ZONE), drawLine(0,0,240,0), drawLine(0,290,240,290), "
-                        + "drawLine(0,381,240,381)",
-
-                // No active nearest line when you're over the self pos!
-
-                // Preview of the dropped rectangle
-                "useStyle(DROP_ZONE_ACTIVE), useStyle(DROP_PREVIEW), drawRect(0,100,100,180)");
-    }
-
-    public void testDragToLastPosition() {
-        // Drag a button to the last position -- and confirm that the preview rectangle
-        // is now shown midway between the second to last and last positions, but fully
-        // below the drop zone line:
-        dragInto(true,
-                // Bounds of the dragged item
-                new Rect(0, 100, 100, 80),
-                // Drag point
-                new Point(0, 400),
-                // Expected insert location
-                3,
-                // Dragging 1st item
-                1,
-
-                // Bounds rectangle
-                "useStyle(DROP_RECIPIENT), drawRect(Rect[0,0,240,480])",
-
-                // Drop Zones
-                "useStyle(DROP_ZONE), drawLine(0,0,240,0), drawLine(0,290,240,290), " +
-                "drawLine(0,381,240,381), ",
-
-                // Active Drop Zone
-                "useStyle(DROP_ZONE_ACTIVE), useStyle(DROP_PREVIEW), drawLine(0,381,240,381)",
-
-                // Drop Preview
-                "useStyle(DROP_PREVIEW), drawRect(0,381,100,461)");
-    }
-
-    // Left to test:
-    // Check inserting at last pos with multiple children
-    // Check inserting with no bounds rectangle for dragged element
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/common/layout/RelativeLayoutRuleTest.java b/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/common/layout/RelativeLayoutRuleTest.java
deleted file mode 100644
index f9747f3..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/common/layout/RelativeLayoutRuleTest.java
+++ /dev/null
@@ -1,167 +0,0 @@
-/*
- * Copyright (C) 2010 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.layout;
-
-
-import static com.android.SdkConstants.ANDROID_URI;
-
-import com.android.ide.common.api.INode;
-import com.android.ide.common.api.Point;
-import com.android.ide.common.api.Rect;
-
-/** Test the {@link RelativeLayoutRule} */
-public class RelativeLayoutRuleTest extends LayoutTestBase {
-    // Utility for other tests
-    protected INode dragInto(Rect dragBounds, Point dragPoint, Point secondDragPoint,
-            int insertIndex, int currentIndex, String... graphicsFragments) {
-        INode layout = TestNode.create("android.widget.RelativeLayout").id("@+id/RelativeLayout01")
-                .bounds(new Rect(0, 0, 240, 480)).add(
-                // Add centered button as the anchor
-                        TestNode.create("android.widget.Button").id("@+id/Centered").bounds(
-                                new Rect(70, 200, 100, 80)).set(ANDROID_URI,
-                                "layout_centerInParent", "true"),
-                        // Add a second button anchored to it
-                        TestNode.create("android.widget.Button").id("@+id/Below").bounds(
-                                new Rect(70, 280, 100, 80)).set(ANDROID_URI, "layout_below",
-                                "@+id/Centered").set(ANDROID_URI, "layout_alignLeft",
-                                "@+id/Centered"));
-
-        return super.dragInto(new RelativeLayoutRule(), layout, dragBounds, dragPoint,
-                secondDragPoint, insertIndex, currentIndex, graphicsFragments);
-    }
-
-    protected INode dragInto(Rect dragBounds, Point dragPoint, Point secondDragPoint,
-            int insertIndex, int currentIndex, String[] extraFragments,
-            String... graphicsFragments) {
-
-        // When we switch to JDK6, use Arrays#copyOf instead
-        String[] combined = new String[extraFragments.length + graphicsFragments.length];
-        System.arraycopy(graphicsFragments, 0, combined, 0, graphicsFragments.length);
-        System.arraycopy(extraFragments, 0, combined, graphicsFragments.length,
-                extraFragments.length);
-
-        return dragInto(dragBounds, dragPoint, secondDragPoint, insertIndex,
-                currentIndex, combined);
-    }
-
-    /* This needs to be updated for the new interaction
-    public void testDropTopEdge() {
-        // If we drag right into the button itself, not a valid drop position
-        INode inserted = dragInto(
-                new Rect(0, 0, 105, 80), new Point(30, -10), null, 2, -1,
-                // Bounds rectangle
-                "useStyle(DROP_RECIPIENT), drawRect(Rect[0,0,240,480])",
-
-                // Preview line + drop zone rectangle along the top
-                "useStyle(DROP_ZONE), drawRect(Rect[0,-10,240,20])",
-                "useStyle(DROP_ZONE_ACTIVE), fillRect(Rect[0,-10,240,20])",
-                "useStyle(DROP_PREVIEW), drawLine(0,0,240,0)",
-
-                // Tip
-                "useStyle(HELP), drawBoxedStrings(5,15,[alignParentTop])",
-
-                // Drop preview
-                "useStyle(DROP_PREVIEW), drawRect(Rect[0,0,105,80])");
-
-        assertEquals("true", inserted.getStringAttr(ANDROID_URI,
-                "layout_alignParentTop"));
-    }
-
-    public void testDropZones() {
-        List<Pair<Point,String[]>> zones = new ArrayList<Pair<Point,String[]>>();
-
-        zones.add(Pair.of(new Point(51+10, 181+10),
-                new String[] {"above=@+id/Centered", "toLeftOf=@+id/Centered"}));
-        zones.add(Pair.of(new Point(71+10, 181+10),
-                new String[] {"above=@+id/Centered", "alignLeft=@+id/Centered"}));
-        zones.add(Pair.of(new Point(104+10, 181+10),
-                new String[] {"above=@+id/Centered", "alignRight=@+id/Centered"}));
-        zones.add(Pair.of(new Point(137+10, 181+10),
-                new String[] {"above=@+id/Centered", "alignRight=@+id/Centered"}));
-        zones.add(Pair.of(new Point(170+10, 181+10),
-                new String[] {"above=@+id/Centered", "toRightOf=@+id/Centered"}));
-        zones.add(Pair.of(new Point(51+10, 279+10),
-                new String[] {"below=@+id/Centered", "toLeftOf=@+id/Centered"}));
-        zones.add(Pair.of(new Point(71+10, 279+10),
-                new String[] {"below=@+id/Centered", "alignLeft=@+id/Centered"}));
-        zones.add(Pair.of(new Point(104+10, 279+10),
-                new String[] {"below=@+id/Centered", "alignLeft=@+id/Centered"}));
-        zones.add(Pair.of(new Point(137+10, 279+10),
-                new String[] {"below=@+id/Centered", "alignRight=@+id/Centered"}));
-        zones.add(Pair.of(new Point(170+10, 279+10),
-                new String[] {"below=@+id/Centered", "toRightOf=@+id/Centered"}));
-        zones.add(Pair.of(new Point(51+10, 201+10),
-                new String[] {"toLeftOf=@+id/Centered", "alignTop=@+id/Centered"}));
-        zones.add(Pair.of(new Point(51+10, 227+10),
-                new String[] {"toLeftOf=@+id/Centered", "alignTop=@+id/Centered"}));
-        zones.add(Pair.of(new Point(170+10, 201+10),
-                new String[] {"toRightOf=@+id/Centered", "alignTop=@+id/Centered"}));
-        zones.add(Pair.of(new Point(51+10, 253+10),
-                new String[] {"toLeftOf=@+id/Centered", "alignBottom=@+id/Centered"}));
-        zones.add(Pair.of(new Point(170+10, 227+10),
-                new String[] {"toRightOf=@+id/Centered", "alignTop=@+id/Centered",
-            "alignBottom=@+id/Centered"}));
-        zones.add(Pair.of(new Point(170+10, 253+10),
-                new String[] {"toRightOf=@+id/Centered", "alignBottom=@+id/Centered"}));
-
-        for (Pair<Point,String[]> zonePair : zones) {
-            Point dropPoint = zonePair.getFirst();
-            String[] attachments = zonePair.getSecond();
-            // If we drag right into the button itself, not a valid drop position
-
-            INode inserted = dragInto(
-                    new Rect(0, 0, 105, 80), new Point(120, 240), dropPoint, 1, -1,
-                    attachments,
-
-                    // Bounds rectangle
-                    "useStyle(DROP_RECIPIENT), drawRect(Rect[0,0,240,480])",
-
-                    // Drop zones
-                    "useStyle(DROP_ZONE), "
-                            + "drawRect(Rect[51,181,20,20]), drawRect(Rect[71,181,33,20]), "
-                            + "drawRect(Rect[104,181,33,20]), drawRect(Rect[137,181,33,20]), "
-                            + "drawRect(Rect[170,181,20,20]), drawRect(Rect[51,279,20,20]), "
-                            + "drawRect(Rect[71,279,33,20]), drawRect(Rect[104,279,33,20]), "
-                            + "drawRect(Rect[137,279,33,20]), drawRect(Rect[170,279,20,20]), "
-                            + "drawRect(Rect[51,201,20,26]), drawRect(Rect[51,227,20,26]), "
-                            + "drawRect(Rect[51,253,20,26]), drawRect(Rect[170,201,20,26]), "
-                            + "drawRect(Rect[170,227,20,26]), drawRect(Rect[170,253,20,26])");
-
-            for (String attachment : attachments) {
-                String[] elements = attachment.split("=");
-                String name = "layout_" + elements[0];
-                String value = elements[1];
-                assertEquals(value, inserted.getStringAttr(ANDROID_URI, name));
-            }
-        }
-    }
-
-
-    public void testDragInvalid() {
-        // If we drag right into the button itself, not a valid drop position
-        dragInto(new Rect(70, 200, 100, 80), new Point(120, 240), new Point(120, 240), -1, 0,
-        // Bounds rectangle
-                "useStyle(DROP_RECIPIENT), drawRect(Rect[0,0,240,480])",
-
-                // Invalid marker
-                "useStyle(INVALID), fillRect(Rect[70,200,100,80]), drawLine(70,200,170,280), "
-                        + "drawLine(70,280,170,200)");
-    }
-
-    // TODO: Test error (dragging on ancestor)
-     */
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/common/layout/TestAttribute.java b/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/common/layout/TestAttribute.java
deleted file mode 100644
index 752d61c..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/common/layout/TestAttribute.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * Copyright (C) 2010 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.layout;
-
-import com.android.annotations.NonNull;
-import com.android.ide.common.api.IDragElement.IDragAttribute;
-import com.android.ide.common.api.INode.IAttribute;
-import com.android.ide.common.xml.XmlAttributeSortOrder;
-
-/** Test/mock implementation of {@link IAttribute} and {@link IDragAttribute} */
-public class TestAttribute implements IAttribute, IDragAttribute {
-    private String mUri;
-
-    private String mName;
-
-    private String mValue;
-
-    public TestAttribute(String mUri, String mName, String mValue) {
-        super();
-        this.mName = mName;
-        this.mUri = mUri;
-        this.mValue = mValue;
-    }
-
-    @Override
-    public @NonNull String getName() {
-        return mName;
-    }
-
-    @Override
-    public @NonNull String getUri() {
-        return mUri;
-    }
-
-    @Override
-    public @NonNull String getValue() {
-        return mValue;
-    }
-
-    @Override
-    public String toString() {
-        return "TestAttribute [name=" + mName + ", uri=" + mUri + ", value=" + mValue + "]";
-    }
-
-    public int compareTo(IDragAttribute o) {
-        return XmlAttributeSortOrder.compareAttributes(mName, o.getName());
-    }
-}
\ No newline at end of file
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/common/layout/TestAttributeInfo.java b/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/common/layout/TestAttributeInfo.java
deleted file mode 100644
index 69984bd..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/common/layout/TestAttributeInfo.java
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
- * Copyright (C) 2010 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.layout;
-
-import com.android.annotations.NonNull;
-import com.android.ide.common.api.IAttributeInfo;
-
-import java.util.EnumSet;
-
-/** Test/mock implementation of {@link IAttributeInfo} */
-public class TestAttributeInfo implements IAttributeInfo {
-    private final String mName;
-    private final EnumSet<Format> mFormats;
-    private final String mDefinedBy;
-    private final String[] mEnumValues;
-    private final String[] mFlagValues;
-    private final String mJavadoc;
-
-    public TestAttributeInfo(String name) {
-        this(name, null, null, null, null, null);
-    }
-
-    public TestAttributeInfo(String name, EnumSet<Format> formats, String definedBy,
-            String[] enumValues, String[] flagValues, String javadoc) {
-        super();
-        this.mName = name;
-        this.mFormats = formats;
-        this.mDefinedBy = definedBy;
-        this.mEnumValues = enumValues;
-        this.mFlagValues = flagValues;
-        this.mJavadoc = javadoc;
-    }
-
-    @Override
-    public String getDeprecatedDoc() {
-        return null;
-    }
-
-    @Override
-    public String[] getEnumValues() {
-        return mEnumValues;
-    }
-
-    @Override
-    public String[] getFlagValues() {
-        return mFlagValues;
-    }
-
-    @Override
-    public @NonNull EnumSet<Format> getFormats() {
-        return mFormats;
-    }
-
-    @Override
-    public @NonNull String getJavaDoc() {
-        return mJavadoc;
-    }
-
-    @Override
-    public @NonNull String getName() {
-        return mName;
-    }
-
-    @Override
-    public @NonNull String getDefinedBy() {
-        return mDefinedBy;
-    }
-}
\ No newline at end of file
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/common/layout/TestColor.java b/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/common/layout/TestColor.java
deleted file mode 100644
index 449ad5e..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/common/layout/TestColor.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Copyright (C) 2010 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.layout;
-
-import com.android.ide.common.api.IColor;
-
-public class TestColor implements IColor {
-    private int mRgb;
-
-    public TestColor(int rgb) {
-        this.mRgb = rgb;
-    }
-
-    public int getRgb() {
-        return mRgb;
-    }
-
-    @Override
-    public String toString() {
-        return String.format("#%6x", mRgb);
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/common/layout/TestDragElement.java b/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/common/layout/TestDragElement.java
deleted file mode 100644
index b96de60..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/common/layout/TestDragElement.java
+++ /dev/null
@@ -1,158 +0,0 @@
-/*
- * Copyright (C) 2010 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.layout;
-
-import static com.android.SdkConstants.ANDROID_URI;
-import static com.android.SdkConstants.ATTR_ID;
-
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-import com.android.ide.common.api.IDragElement;
-import com.android.ide.common.api.INode;
-import com.android.ide.common.api.Rect;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-/** Test/mock implementation of {@link IDragElement} */
-public class TestDragElement implements IDragElement {
-    private Rect mRect;
-
-    private final String mFqcn;
-
-    private Map<String, TestAttribute> mAttributes = new HashMap<String, TestAttribute>();
-
-    private List<TestDragElement> mChildren = new ArrayList<TestDragElement>();
-
-    private TestDragElement mParent;
-
-    public TestDragElement(String mFqcn, Rect mRect, List<TestDragElement> mChildren,
-            TestDragElement mParent) {
-        super();
-        this.mRect = mRect;
-        this.mFqcn = mFqcn;
-        this.mChildren = mChildren;
-        this.mParent = mParent;
-    }
-
-    public TestDragElement(String fqn) {
-        this(fqn, null, null, null);
-    }
-
-    public TestDragElement setBounds(Rect bounds) {
-        this.mRect = bounds;
-
-        return this;
-    }
-
-    // Builder stuff
-    public TestDragElement set(String uri, String name, String value) {
-        if (mAttributes == null) {
-            mAttributes = new HashMap<String, TestAttribute>();
-        }
-
-        mAttributes.put(uri + name, new TestAttribute(uri, name, value));
-
-        return this;
-    }
-
-    public TestDragElement add(TestDragElement... children) {
-        if (mChildren == null) {
-            mChildren = new ArrayList<TestDragElement>();
-        }
-
-        for (TestDragElement child : children) {
-            mChildren.add(child);
-            child.mParent = this;
-        }
-
-        return this;
-    }
-
-    public TestDragElement id(String id) {
-        return set(ANDROID_URI, ATTR_ID, id);
-    }
-
-    public static TestDragElement create(String fqn, Rect bounds) {
-        return create(fqn).setBounds(bounds);
-    }
-
-    public static TestDragElement create(String fqn) {
-        return new TestDragElement(fqn);
-    }
-
-    public static IDragElement[] create(TestDragElement... elements) {
-        return elements;
-    }
-
-    // ==== IDragElement ====
-
-    @Override
-    public IDragAttribute getAttribute(@Nullable String uri, @NonNull String localName) {
-        if (mAttributes == null) {
-            return new TestAttribute(uri, localName, "");
-        }
-
-        return mAttributes.get(uri + localName);
-    }
-
-    @Override
-    public @NonNull IDragAttribute[] getAttributes() {
-        return mAttributes.values().toArray(new IDragAttribute[mAttributes.size()]);
-    }
-
-    @Override
-    public @NonNull Rect getBounds() {
-        return mRect;
-    }
-
-    @Override
-    public @NonNull String getFqcn() {
-        return mFqcn;
-    }
-
-    @Override
-    public @NonNull IDragElement[] getInnerElements() {
-        if (mChildren == null) {
-            return new IDragElement[0];
-        }
-
-        return mChildren.toArray(new IDragElement[mChildren.size()]);
-    }
-
-    @Override
-    public @NonNull Rect getParentBounds() {
-        return mParent != null ? mParent.getBounds() : null;
-    }
-
-    @Override
-    public String getParentFqcn() {
-        return mParent != null ? mParent.getFqcn() : null;
-    }
-
-    @Override
-    public String toString() {
-        return "TestDragElement [fqn=" + mFqcn + ", attributes=" + mAttributes + ", bounds="
-                + mRect + "]";
-    }
-
-    @Override
-    public boolean isSame(INode node) {
-        return node.getBounds().equals(getBounds());
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/common/layout/TestGraphics.java b/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/common/layout/TestGraphics.java
deleted file mode 100644
index ec93210..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/common/layout/TestGraphics.java
+++ /dev/null
@@ -1,181 +0,0 @@
-/*
- * Copyright (C) 2010 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.layout;
-
-import com.android.annotations.NonNull;
-import com.android.ide.common.api.DrawingStyle;
-import com.android.ide.common.api.IColor;
-import com.android.ide.common.api.IGraphics;
-import com.android.ide.common.api.Point;
-import com.android.ide.common.api.Rect;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
-// TODO: Create box of ascii art
-
-public class TestGraphics implements IGraphics {
-    /** List of things we have drawn */
-    private List<String> mDrawn = new ArrayList<String>();
-
-    private IColor mBackground = new TestColor(0x000000);
-
-    private IColor mForeground = new TestColor(0xFFFFFF);
-
-    private int mAlpha = 128;
-
-    /** Return log of graphics calls */
-    public List<String> getDrawn() {
-        return Collections.unmodifiableList(mDrawn);
-    }
-
-    /** Wipe out log of graphics calls */
-    public void clear() {
-        mDrawn.clear();
-    }
-
-    // ==== IGraphics ====
-
-    @Override
-    public void drawBoxedStrings(int x, int y, @NonNull List<?> strings) {
-        mDrawn.add("drawBoxedStrings(" + x + "," + y + "," + strings + ")");
-    }
-
-    @Override
-    public void drawLine(int x1, int y1, int x2, int y2) {
-        mDrawn.add("drawLine(" + x1 + "," + y1 + "," + x2 + "," + y2 + ")");
-    }
-
-    @Override
-    public void drawLine(@NonNull Point p1, @NonNull Point p2) {
-        mDrawn.add("drawLine(" + p1 + "," + p2 + ")");
-    }
-
-    @Override
-    public void drawRect(int x1, int y1, int x2, int y2) {
-        mDrawn.add("drawRect(" + x1 + "," + y1 + "," + x2 + "," + y2 + ")");
-    }
-
-    @Override
-    public void drawRect(@NonNull Point p1, @NonNull Point p2) {
-        mDrawn.add("drawRect(" + p1 + "," + p2 + ")");
-    }
-
-    @Override
-    public void drawRect(@NonNull Rect r) {
-        mDrawn.add("drawRect(" + rectToString(r) + ")");
-    }
-
-    @Override
-    public void drawString(@NonNull String string, int x, int y) {
-        mDrawn.add("drawString(" + x + "," + y + "," + string + ")");
-    }
-
-    @Override
-    public void drawString(@NonNull String string, @NonNull Point topLeft) {
-        mDrawn.add("drawString(" + string + "," + topLeft + ")");
-    }
-
-    @Override
-    public void fillRect(int x1, int y1, int x2, int y2) {
-        mDrawn.add("fillRect(" + x1 + "," + y1 + "," + x2 + "," + y2 + ")");
-    }
-
-    @Override
-    public void fillRect(@NonNull Point p1, @NonNull Point p2) {
-        mDrawn.add("fillRect(" + p1 + "," + p2 + ")");
-    }
-
-    @Override
-    public void fillRect(@NonNull Rect r) {
-        mDrawn.add("fillRect(" + rectToString(r) + ")");
-    }
-
-    @Override
-    public int getAlpha() {
-        return mAlpha;
-    }
-
-    @Override
-    public @NonNull IColor getBackground() {
-        return mBackground;
-    }
-
-    @Override
-    public int getFontHeight() {
-        return 12;
-    }
-
-    @Override
-    public @NonNull IColor getForeground() {
-        return mForeground;
-    }
-
-    @Override
-    public @NonNull IColor registerColor(int rgb) {
-        mDrawn.add("registerColor(" + Integer.toHexString(rgb) + ")");
-        return new TestColor(rgb);
-    }
-
-    @Override
-    public void setAlpha(int alpha) {
-        mAlpha = alpha;
-        mDrawn.add("setAlpha(" + alpha + ")");
-    }
-
-    @Override
-    public void setBackground(@NonNull IColor color) {
-        mDrawn.add("setBackground(" + color + ")");
-        mBackground = color;
-    }
-
-    @Override
-    public void setForeground(@NonNull IColor color) {
-        mDrawn.add("setForeground(" + color + ")");
-        mForeground = color;
-    }
-
-    @Override
-    public void setLineStyle(@NonNull LineStyle style) {
-        mDrawn.add("setLineStyle(" + style + ")");
-    }
-
-    @Override
-    public void setLineWidth(int width) {
-        mDrawn.add("setLineWidth(" + width + ")");
-    }
-
-    @Override
-    public void useStyle(@NonNull DrawingStyle style) {
-        mDrawn.add("useStyle(" + style + ")");
-    }
-
-    @Override
-    public void drawArrow(int x1, int y1, int x2, int y2, int size) {
-        mDrawn.add("drawArrow(" + x1 + "," + y1 + "," + x2 + "," + y2 + ")");
-    }
-
-    @Override
-    public void drawPoint(int x, int y) {
-        mDrawn.add("drawPoint(" + x + "," + y + ")");
-    }
-
-    private static String rectToString(Rect rect) {
-        return "Rect[" + rect.x + "," + rect.y + "," + rect.w + "," + rect.h + "]";
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/common/layout/TestNode.java b/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/common/layout/TestNode.java
deleted file mode 100644
index 30886e4..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/common/layout/TestNode.java
+++ /dev/null
@@ -1,477 +0,0 @@
-/*
- * Copyright (C) 2010 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.layout;
-
-import static com.android.SdkConstants.ANDROID_URI;
-import static com.android.SdkConstants.ANDROID_WIDGET_PREFIX;
-import static com.android.SdkConstants.ATTR_ID;
-import static junit.framework.Assert.assertEquals;
-import static junit.framework.Assert.assertNotNull;
-import static junit.framework.Assert.assertTrue;
-import static junit.framework.Assert.fail;
-
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-import com.android.ide.common.api.IAttributeInfo;
-import com.android.ide.common.api.INode;
-import com.android.ide.common.api.INodeHandler;
-import com.android.ide.common.api.Margins;
-import com.android.ide.common.api.Rect;
-import com.android.ide.common.xml.XmlFormatStyle;
-import com.android.ide.common.xml.XmlPrettyPrinter;
-import com.android.ide.eclipse.adt.internal.editors.formatting.EclipseXmlFormatPreferences;
-import com.android.ide.eclipse.adt.internal.editors.formatting.EclipseXmlPrettyPrinter;
-import com.android.ide.eclipse.adt.internal.editors.layout.gle2.DomUtilities;
-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 java.io.IOException;
-import java.io.StringWriter;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-/** Test/mock implementation of {@link INode} */
-@SuppressWarnings("javadoc")
-public class TestNode implements INode {
-    private TestNode mParent;
-
-    private final List<TestNode> mChildren = new ArrayList<TestNode>();
-
-    private final String mFqcn;
-
-    private Rect mBounds = new Rect(); // Invalid bounds initially
-
-    private Map<String, IAttribute> mAttributes = new HashMap<String, IAttribute>();
-
-    private Map<String, IAttributeInfo> mAttributeInfos = new HashMap<String, IAttributeInfo>();
-
-    private List<String> mAttributeSources;
-
-    public TestNode(String fqcn) {
-        this.mFqcn = fqcn;
-    }
-
-    public TestNode bounds(Rect bounds) {
-        this.mBounds = bounds;
-
-        return this;
-    }
-
-    public TestNode id(String id) {
-        return set(ANDROID_URI, ATTR_ID, id);
-    }
-
-    public TestNode set(String uri, String name, String value) {
-        setAttribute(uri, name, value);
-
-        return this;
-    }
-
-    public TestNode add(TestNode child) {
-        mChildren.add(child);
-        child.mParent = this;
-
-        return this;
-    }
-
-    public TestNode add(TestNode... children) {
-        for (TestNode child : children) {
-            mChildren.add(child);
-            child.mParent = this;
-        }
-
-        return this;
-    }
-
-    public static TestNode create(String fcqn) {
-        return new TestNode(fcqn);
-    }
-
-    public void removeChild(int index) {
-        TestNode removed = mChildren.remove(index);
-        removed.mParent = null;
-    }
-
-    // ==== INODE ====
-
-    @Override
-    public @NonNull INode appendChild(@NonNull String viewFqcn) {
-        return insertChildAt(viewFqcn, mChildren.size());
-    }
-
-    @Override
-    public void editXml(@NonNull String undoName, @NonNull INodeHandler callback) {
-        callback.handle(this);
-    }
-
-    public void putAttributeInfo(String uri, String attrName, IAttributeInfo info) {
-        mAttributeInfos.put(uri + attrName, info);
-    }
-
-    @Override
-    public IAttributeInfo getAttributeInfo(@Nullable String uri, @NonNull String attrName) {
-        return mAttributeInfos.get(uri + attrName);
-    }
-
-    @Override
-    public @NonNull Rect getBounds() {
-        return mBounds;
-    }
-
-    @Override
-    public @NonNull INode[] getChildren() {
-        return mChildren.toArray(new INode[mChildren.size()]);
-    }
-
-    @Override
-    public @NonNull IAttributeInfo[] getDeclaredAttributes() {
-        return mAttributeInfos.values().toArray(new IAttributeInfo[mAttributeInfos.size()]);
-    }
-
-    @Override
-    public @NonNull String getFqcn() {
-        return mFqcn;
-    }
-
-    @Override
-    public @NonNull IAttribute[] getLiveAttributes() {
-        return mAttributes.values().toArray(new IAttribute[mAttributes.size()]);
-    }
-
-    @Override
-    public INode getParent() {
-        return mParent;
-    }
-
-    @Override
-    public INode getRoot() {
-        TestNode curr = this;
-        while (curr.mParent != null) {
-            curr = curr.mParent;
-        }
-
-        return curr;
-    }
-
-    @Override
-    public String getStringAttr(@Nullable String uri, @NonNull String attrName) {
-        IAttribute attr = mAttributes.get(uri + attrName);
-        if (attr == null) {
-            return null;
-        }
-
-        return attr.getValue();
-    }
-
-    @Override
-    public @NonNull INode insertChildAt(@NonNull String viewFqcn, int index) {
-        TestNode child = new TestNode(viewFqcn);
-        if (index == -1) {
-            mChildren.add(child);
-        } else {
-            mChildren.add(index, child);
-        }
-        child.mParent = this;
-        return child;
-    }
-
-    @Override
-    public void removeChild(@NonNull INode node) {
-        int index = mChildren.indexOf(node);
-        if (index != -1) {
-            removeChild(index);
-        }
-    }
-
-    @Override
-    public boolean setAttribute(@Nullable String uri, @NonNull String localName,
-            @Nullable String value) {
-        mAttributes.put(uri + localName, new TestAttribute(uri, localName, value));
-        return true;
-    }
-
-    @Override
-    public String toString() {
-        String id = getStringAttr(ANDROID_URI, ATTR_ID);
-        return "TestNode [id=" + (id != null ? id : "?") + ", fqn=" + mFqcn + ", infos="
-                + mAttributeInfos + ", attributes=" + mAttributes + ", bounds=" + mBounds + "]";
-    }
-
-    @Override
-    public int getBaseline() {
-        return -1;
-    }
-
-    @Override
-    public @NonNull Margins getMargins() {
-        return null;
-    }
-
-    @Override
-    public @NonNull List<String> getAttributeSources() {
-        return mAttributeSources != null ? mAttributeSources : Collections.<String>emptyList();
-    }
-
-    public void setAttributeSources(List<String> attributeSources) {
-        mAttributeSources = attributeSources;
-    }
-
-    /** Create a test node from the given XML */
-    public static TestNode createFromXml(String xml) {
-        Document document = DomUtilities.parseDocument(xml, false);
-        assertNotNull(document);
-        assertNotNull(document.getDocumentElement());
-
-        return createFromNode(document.getDocumentElement());
-    }
-
-    public static String toXml(TestNode node) {
-        assertTrue("This method only works with nodes constructed from XML",
-                node instanceof TestXmlNode);
-        Document document = ((TestXmlNode) node).mElement.getOwnerDocument();
-        // Insert new whitespace nodes etc
-        String xml = dumpDocument(document);
-        document = DomUtilities.parseDocument(xml, false);
-
-        XmlPrettyPrinter printer = new EclipseXmlPrettyPrinter(EclipseXmlFormatPreferences.create(),
-                XmlFormatStyle.LAYOUT, "\n");
-        StringBuilder sb = new StringBuilder(1000);
-        sb.append("<?xml version=\"1.0\" encoding=\"utf-8\"?>\n");
-        printer.prettyPrint(-1, document, null, null, sb, false);
-        return sb.toString();
-    }
-
-    @SuppressWarnings("deprecation")
-    private static String dumpDocument(Document document) {
-        // Diagnostics: print out the XML that we're about to render
-        org.apache.xml.serialize.OutputFormat outputFormat =
-                new org.apache.xml.serialize.OutputFormat(
-                        "XML", "ISO-8859-1", true); //$NON-NLS-1$ //$NON-NLS-2$
-        outputFormat.setIndent(2);
-        outputFormat.setLineWidth(100);
-        outputFormat.setIndenting(true);
-        outputFormat.setOmitXMLDeclaration(true);
-        outputFormat.setOmitDocumentType(true);
-        StringWriter stringWriter = new StringWriter();
-        // Using FQN here to avoid having an import above, which will result
-        // in a deprecation warning, and there isn't a way to annotate a single
-        // import element with a SuppressWarnings.
-        org.apache.xml.serialize.XMLSerializer serializer =
-                new org.apache.xml.serialize.XMLSerializer(stringWriter, outputFormat);
-        serializer.setNamespaces(true);
-        try {
-            serializer.serialize(document.getDocumentElement());
-            return stringWriter.toString();
-        } catch (IOException e) {
-            e.printStackTrace();
-        }
-        return null;
-    }
-
-    private static TestNode createFromNode(Element element) {
-        String fqcn = ANDROID_WIDGET_PREFIX + element.getTagName();
-        TestNode node = new TestXmlNode(fqcn, element);
-
-        for (Element child : DomUtilities.getChildren(element)) {
-            node.add(createFromNode(child));
-        }
-
-        return node;
-    }
-
-    @Nullable
-    public static TestNode findById(TestNode node, String id) {
-        id = BaseLayoutRule.stripIdPrefix(id);
-        return node.findById(id);
-    }
-
-    private TestNode findById(String targetId) {
-        String id = getStringAttr(ANDROID_URI, ATTR_ID);
-        if (id != null && targetId.equals(BaseLayoutRule.stripIdPrefix(id))) {
-            return this;
-        }
-
-        for (TestNode child : mChildren) {
-            TestNode result = child.findById(targetId);
-            if (result != null) {
-                return result;
-            }
-        }
-
-        return null;
-    }
-
-    private static String getTagName(String fqcn) {
-        return fqcn.substring(fqcn.lastIndexOf('.') + 1);
-    }
-
-    private static class TestXmlNode extends TestNode {
-        private final Element mElement;
-
-        public TestXmlNode(String fqcn, Element element) {
-            super(fqcn);
-            mElement = element;
-        }
-
-        @Override
-        public @NonNull IAttribute[] getLiveAttributes() {
-            List<IAttribute> result = new ArrayList<IAttribute>();
-
-            NamedNodeMap attributes = mElement.getAttributes();
-            for (int i = 0, n = attributes.getLength(); i < n; i++) {
-                Attr attribute = (Attr) attributes.item(i);
-                result.add(new TestXmlAttribute(attribute));
-            }
-            return result.toArray(new IAttribute[result.size()]);
-        }
-
-        @Override
-        public boolean setAttribute(String uri, String localName, String value) {
-            if (value == null) {
-                mElement.removeAttributeNS(uri, localName);
-            } else {
-                mElement.setAttributeNS(uri, localName, value);
-            }
-            return super.setAttribute(uri, localName, value);
-        }
-
-        @Override
-        public INode appendChild(String viewFqcn) {
-            Element child = mElement.getOwnerDocument().createElement(getTagName(viewFqcn));
-            mElement.appendChild(child);
-            return new TestXmlNode(viewFqcn, child);
-        }
-
-        @Override
-        public INode insertChildAt(String viewFqcn, int index) {
-            if (index == -1) {
-                return appendChild(viewFqcn);
-            }
-            Element child = mElement.getOwnerDocument().createElement(getTagName(viewFqcn));
-            List<Element> children = DomUtilities.getChildren(mElement);
-            if (children.size() >= index) {
-                Element before = children.get(index);
-                mElement.insertBefore(child, before);
-            } else {
-                fail("Unexpected index");
-                mElement.appendChild(child);
-            }
-            return new TestXmlNode(viewFqcn, child);
-        }
-
-        @Override
-        public String getStringAttr(String uri, String name) {
-            String value;
-            if (uri == null) {
-                value = mElement.getAttribute(name);
-            } else {
-                value = mElement.getAttributeNS(uri, name);
-            }
-            if (value.isEmpty()) {
-                value = null;
-            }
-
-            return value;
-        }
-
-        @Override
-        public void removeChild(INode node) {
-            assert node instanceof TestXmlNode;
-            mElement.removeChild(((TestXmlNode) node).mElement);
-        }
-
-        @Override
-        public void removeChild(int index) {
-            List<Element> children = DomUtilities.getChildren(mElement);
-            assertTrue(index < children.size());
-            Element oldChild = children.get(index);
-            mElement.removeChild(oldChild);
-        }
-    }
-
-    public static class TestXmlAttribute implements IAttribute {
-        private Attr mAttribute;
-
-        public TestXmlAttribute(Attr attribute) {
-            this.mAttribute = attribute;
-        }
-
-        @Override
-        public String getUri() {
-            return mAttribute.getNamespaceURI();
-        }
-
-        @Override
-        public String getName() {
-            String name = mAttribute.getLocalName();
-            if (name == null) {
-                name = mAttribute.getName();
-            }
-            return name;
-        }
-
-        @Override
-        public String getValue() {
-            return mAttribute.getValue();
-        }
-    }
-
-    // Recursively initialize this node with the bounds specified in the given hierarchy
-    // dump (from ViewHierarchy's DUMP_INFO flag
-    public void assignBounds(String bounds) {
-        Iterable<String> split = Splitter.on('\n').trimResults().split(bounds);
-        assignBounds(split.iterator());
-    }
-
-    private void assignBounds(Iterator<String> iterator) {
-        assertTrue(iterator.hasNext());
-        String desc = iterator.next();
-
-        Pattern pattern = Pattern.compile("^\\s*(.+)\\s+\\[(.+)\\]\\s*(<.+>)?\\s*(\\S+)?\\s*$");
-        Matcher matcher = pattern.matcher(desc);
-        assertTrue(matcher.matches());
-        String fqn = matcher.group(1);
-        assertEquals(getFqcn(), fqn);
-        String boundsString = matcher.group(2);
-        String[] bounds = boundsString.split(",");
-        assertEquals(boundsString, 4, bounds.length);
-        try {
-            int left = Integer.parseInt(bounds[0]);
-            int top = Integer.parseInt(bounds[1]);
-            int right = Integer.parseInt(bounds[2]);
-            int bottom = Integer.parseInt(bounds[3]);
-            mBounds = new Rect(left, top, right - left, bottom - top);
-        } catch (NumberFormatException nufe) {
-            fail(nufe.getLocalizedMessage());
-        }
-        String tag = matcher.group(3);
-
-        for (INode child : getChildren()) {
-            assertTrue(iterator.hasNext());
-            ((TestNode) child).assignBounds(iterator);
-        }
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/common/layout/ZoomControlsRuleTest.java b/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/common/layout/ZoomControlsRuleTest.java
deleted file mode 100644
index daa487e..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/common/layout/ZoomControlsRuleTest.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Copyright (C) 2010 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.layout;
-
-import com.android.ide.common.api.DropFeedback;
-import com.android.ide.common.api.IDragElement;
-import com.android.ide.common.api.INode;
-import com.android.ide.common.api.Rect;
-
-/** Test the {@link ZoomControlsRule} */
-public class ZoomControlsRuleTest extends LayoutTestBase {
-    public void testDoNothing() {
-        String draggedButtonId = "@+id/DraggedButton";
-
-        IDragElement[] elements = TestDragElement.create(TestDragElement.create(
-                "android.widget.Button").id(draggedButtonId));
-
-        INode layout = TestNode.create("android.widget.ZoomControls").id("@+id/ZoomControls01")
-        .bounds(new Rect(0, 0, 240, 480)).add(
-                TestNode.create("android.widget.Button").id("@+id/Button01").bounds(
-                        new Rect(0, 0, 100, 80)),
-                TestNode.create("android.widget.Button").id("@+id/Button02").bounds(
-                        new Rect(0, 100, 100, 80)),
-                TestNode.create("android.widget.Button").id("@+id/Button03").bounds(
-                        new Rect(0, 200, 100, 80)),
-                TestNode.create("android.widget.Button").id("@+id/Button04").bounds(
-                        new Rect(0, 300, 100, 80)));
-
-        ZoomControlsRule rule = new ZoomControlsRule();
-
-        // Enter target
-        DropFeedback feedback = rule.onDropEnter(layout, null/*targetView*/, elements);
-        // Zoom controls don't respond to drags
-        assertNull(feedback);
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/common/layout/grid/GridModelTest.java b/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/common/layout/grid/GridModelTest.java
deleted file mode 100644
index c4a58c6..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/common/layout/grid/GridModelTest.java
+++ /dev/null
@@ -1,852 +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.layout.grid;
-
-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_COLUMN_SPAN;
-import static com.android.SdkConstants.ATTR_LAYOUT_ROW;
-import static com.android.SdkConstants.FQCN_BUTTON;
-
-import com.android.ide.common.api.INode;
-import com.android.ide.common.api.Rect;
-import com.android.ide.common.layout.LayoutTestBase;
-import com.android.ide.common.layout.TestNode;
-import com.android.ide.common.layout.grid.GridModel.ViewData;
-
-import java.util.Arrays;
-import java.util.Collections;
-
-
-@SuppressWarnings("javadoc")
-public class GridModelTest extends LayoutTestBase {
-    public void testRemoveFlag() {
-        assertEquals("left", GridModel.removeFlag("top", "top|left"));
-        assertEquals("left", GridModel.removeFlag("top", "top | left"));
-        assertEquals("top", GridModel.removeFlag("left", "top|left"));
-        assertEquals("top", GridModel.removeFlag("left", "top | left"));
-        assertEquals("left | center", GridModel.removeFlag("top", "top | left | center"));
-        assertEquals(null, GridModel.removeFlag("top", "top"));
-    }
-
-    public void testReadModel1() {
-        TestNode targetNode = TestNode.create("android.widget.GridLayout").id("@+id/GridLayout1")
-                .bounds(new Rect(0, 0, 240, 480)).set(ANDROID_URI, ATTR_COLUMN_COUNT, "3");
-
-        GridModel model = GridModel.get(null, targetNode, null);
-        assertEquals(3, model.declaredColumnCount);
-        assertEquals(1, model.actualColumnCount);
-        assertEquals(1, model.actualRowCount);
-
-        targetNode.add(TestNode.create(FQCN_BUTTON).id("@+id/Button1"));
-        targetNode.add(TestNode.create(FQCN_BUTTON).id("@+id/Button2"));
-        targetNode.add(TestNode.create(FQCN_BUTTON).id("@+id/Button3"));
-        targetNode.add(TestNode.create(FQCN_BUTTON).id("@+id/Button4"));
-
-        model = GridModel.get(null, targetNode, null);
-        assertEquals(3, model.declaredColumnCount);
-        assertEquals(3, model.actualColumnCount);
-        assertEquals(2, model.actualRowCount);
-    }
-
-    public void testSplitColumn() {
-        TestNode targetNode = TestNode.create("android.widget.GridLayout").id("@+id/GridLayout1")
-                .bounds(new Rect(0, 0, 240, 480)).set(ANDROID_URI, ATTR_COLUMN_COUNT, "3");
-        TestNode b1 = TestNode.create(FQCN_BUTTON).id("@+id/Button1");
-        TestNode b2 = TestNode.create(FQCN_BUTTON).id("@+id/Button2");
-        TestNode b3 = TestNode.create(FQCN_BUTTON).id("@+id/Button3");
-        TestNode b4 = TestNode.create(FQCN_BUTTON).id("@+id/Button4");
-        targetNode.add(b1);
-        targetNode.add(b2);
-        targetNode.add(b3);
-        targetNode.add(b4);
-        b4.setAttribute(ANDROID_URI, ATTR_LAYOUT_COLUMN_SPAN, "2");
-
-        GridModel model = GridModel.get(new LayoutTestBase.TestRulesEngine(targetNode.getFqcn()),
-                targetNode, null);
-        assertEquals(3, model.declaredColumnCount);
-        assertEquals(3, model.actualColumnCount);
-        assertEquals(2, model.actualRowCount);
-
-        model.applyPositionAttributes();
-        assertEquals("0", b1.getStringAttr(ANDROID_URI, ATTR_LAYOUT_COLUMN));
-        assertEquals("0", b1.getStringAttr(ANDROID_URI, ATTR_LAYOUT_ROW));
-
-        assertEquals("1", b2.getStringAttr(ANDROID_URI, ATTR_LAYOUT_COLUMN));
-        assertEquals("0", b2.getStringAttr(ANDROID_URI, ATTR_LAYOUT_ROW));
-
-        assertEquals("2", b3.getStringAttr(ANDROID_URI, ATTR_LAYOUT_COLUMN));
-        assertEquals("0", b3.getStringAttr(ANDROID_URI, ATTR_LAYOUT_ROW));
-
-        assertEquals("0", b4.getStringAttr(ANDROID_URI, ATTR_LAYOUT_COLUMN));
-        assertEquals("1", b4.getStringAttr(ANDROID_URI, ATTR_LAYOUT_ROW));
-        assertEquals("2", b4.getStringAttr(ANDROID_URI, ATTR_LAYOUT_COLUMN_SPAN));
-
-        model.splitColumn(1, false /*insertMarginColumn*/, 100 /*columnWidthDp*/, 300 /* x */);
-        model.applyPositionAttributes();
-
-        assertEquals(4, model.declaredColumnCount);
-        assertEquals(4, model.actualColumnCount);
-        assertEquals(2, model.actualRowCount);
-
-        assertEquals("0", b1.getStringAttr(ANDROID_URI, ATTR_LAYOUT_COLUMN));
-        assertEquals("0", b1.getStringAttr(ANDROID_URI, ATTR_LAYOUT_ROW));
-
-        assertEquals("1", b2.getStringAttr(ANDROID_URI, ATTR_LAYOUT_COLUMN));
-        assertEquals("2", b2.getStringAttr(ANDROID_URI, ATTR_LAYOUT_COLUMN_SPAN));
-        assertEquals("0", b2.getStringAttr(ANDROID_URI, ATTR_LAYOUT_ROW));
-
-        assertEquals("3", b3.getStringAttr(ANDROID_URI, ATTR_LAYOUT_COLUMN));
-        assertEquals("0", b3.getStringAttr(ANDROID_URI, ATTR_LAYOUT_ROW));
-
-        assertEquals("0", b4.getStringAttr(ANDROID_URI, ATTR_LAYOUT_COLUMN));
-        assertEquals("1", b4.getStringAttr(ANDROID_URI, ATTR_LAYOUT_ROW));
-        assertEquals("3", b4.getStringAttr(ANDROID_URI, ATTR_LAYOUT_COLUMN_SPAN));
-    }
-
-    public void testDeletion1() {
-        String xml =
-            "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" +
-            "<GridLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n" +
-            "    android:layout_width=\"match_parent\"\n" +
-            "    android:layout_height=\"match_parent\"\n" +
-            "    android:columnCount=\"4\" >\n" +
-            "\n" +
-            "    <Button\n" +
-            "        android:id=\"@+id/button1\"\n" +
-            "        android:layout_column=\"1\"\n" +
-            "        android:layout_gravity=\"left|top\"\n" +
-            "        android:layout_row=\"1\"\n" +
-            "        android:text=\"Button\" />\n" +
-            "\n" +
-            "    <TextView\n" +
-            "        android:id=\"@+id/TextView1\"\n" +
-            "        android:layout_column=\"3\"\n" +
-            "        android:layout_gravity=\"left|top\"\n" +
-            "        android:layout_row=\"1\"\n" +
-            "        android:text=\"Text\" />\n" +
-            "\n" +
-            "    <Space\n" +
-            "        android:id=\"@+id/wspace1\"\n" +
-            "        android:layout_width=\"21dp\"\n" +
-            "        android:layout_height=\"1dp\"\n" +
-            "        android:layout_column=\"0\"\n" +
-            "        android:layout_row=\"0\" />\n" +
-            "\n" +
-            "    <Space\n" +
-            "        android:id=\"@+id/hspace1\"\n" +
-            "        android:layout_width=\"1dp\"\n" +
-            "        android:layout_height=\"55dp\"\n" +
-            "        android:layout_column=\"0\"\n" +
-            "        android:layout_row=\"0\" />\n" +
-            "\n" +
-            "    <Space\n" +
-            "        android:id=\"@+id/wspace2\"\n" +
-            "        android:layout_width=\"10dp\"\n" +
-            "        android:layout_height=\"1dp\"\n" +
-            "        android:layout_column=\"2\"\n" +
-            "        android:layout_row=\"0\" />\n" +
-            "\n" +
-            "</GridLayout>";
-
-        TestNode targetNode = TestNode.createFromXml(xml);
-        assertNotNull(targetNode);
-
-        TestNode button1 = TestNode.findById(targetNode, "@+id/button1");
-        TestNode textView1 = TestNode.findById(targetNode, "@+id/TextView1");
-        TestNode wspace1 = TestNode.findById(targetNode, "@+id/wspace1");
-        TestNode wspace2 = TestNode.findById(targetNode, "@+id/wspace2");
-        TestNode hspace1 = TestNode.findById(targetNode, "@+id/hspace1");
-        assertNotNull(wspace1);
-        assertNotNull(hspace1);
-        assertNotNull(wspace2);
-        assertNotNull(button1);
-        assertNotNull(textView1);
-
-        // Assign some bounds such that the model makes sense when merging spacer sizes
-        // TODO: MAke test utility method to automatically assign half divisions!!
-        button1.bounds(new Rect(90, 10, 100, 40));
-        textView1.bounds(new Rect(200, 10, 100, 40));
-        wspace1.bounds(new Rect(0, 0, 90, 1));
-        wspace1.bounds(new Rect(190, 0, 10, 1));
-        hspace1.bounds(new Rect(0, 0, 1, 10));
-
-        GridModel model = GridModel.get(new LayoutTestBase.TestRulesEngine(targetNode.getFqcn()),
-                targetNode, null);
-        assertEquals(4, model.declaredColumnCount);
-        assertEquals(4, model.actualColumnCount);
-        assertEquals(2, model.actualRowCount);
-
-        ViewData textViewData = model.getView(textView1);
-        assertEquals(3, textViewData.column);
-
-        // Delete button1
-        button1.getParent().removeChild(button1);
-        model.onDeleted(Arrays.<INode>asList(button1));
-        model.applyPositionAttributes();
-
-        assertEquals(2, model.declaredColumnCount);
-        assertEquals(2, model.actualColumnCount);
-        assertEquals(2, model.actualRowCount);
-        assertNotNull(model.getView(textView1));
-        assertNull(model.getView(button1));
-
-        assertEquals(
-                "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" +
-                "<GridLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n" +
-                "    android:layout_width=\"match_parent\"\n" +
-                "    android:layout_height=\"match_parent\"\n" +
-                "    android:columnCount=\"2\">\n" +
-                "\n" +
-                "    <TextView\n" +
-                "        android:id=\"@+id/TextView1\"\n" +
-                "        android:layout_column=\"1\"\n" +
-                "        android:layout_gravity=\"left|top\"\n" +
-                "        android:layout_row=\"1\"\n" +
-                "        android:text=\"Text\">\n" +
-                "    </TextView>\n" +
-                "\n" +
-                "    <Space\n" +
-                "        android:id=\"@+id/wspace1\"\n" +
-                "        android:layout_width=\"66dp\"\n" +
-                "        android:layout_height=\"1dp\"\n" +
-                "        android:layout_column=\"0\"\n" +
-                "        android:layout_row=\"0\">\n" +
-                "    </Space>\n" +
-                "\n" +
-                "    <Space\n" +
-                "        android:id=\"@+id/hspace1\"\n" +
-                "        android:layout_width=\"1dp\"\n" +
-                "        android:layout_height=\"55dp\"\n" +
-                "        android:layout_column=\"0\"\n" +
-                "        android:layout_row=\"0\">\n" +
-                "    </Space>\n" +
-                "\n" +
-                "</GridLayout>", TestNode.toXml(targetNode));
-
-        // Delete textView1
-
-        textView1.getParent().removeChild(textView1);
-        model.onDeleted(Arrays.<INode>asList(textView1));
-        model.applyPositionAttributes();
-
-        assertEquals(2, model.declaredColumnCount);
-        assertEquals(0, model.actualColumnCount);
-        assertEquals(0, model.actualRowCount);
-        assertNull(model.getView(textView1));
-        assertNull(model.getView(button1));
-
-        assertEquals(
-                "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" +
-                "<GridLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n" +
-                "    android:layout_width=\"match_parent\"\n" +
-                "    android:layout_height=\"match_parent\"\n" +
-                "    android:columnCount=\"0\">\n" +
-                "\n" +
-                "</GridLayout>", TestNode.toXml(targetNode));
-
-    }
-
-    public void testDelete2() throws Exception {
-        String xml =
-            "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" +
-            "<GridLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n" +
-            "    android:layout_width=\"match_parent\"\n" +
-            "    android:layout_height=\"match_parent\"\n" +
-            "    android:columnCount=\"4\"\n" +
-            "    android:orientation=\"vertical\" >\n" +
-            "\n" +
-            "    <Button\n" +
-            "        android:id=\"@+id/button1\"\n" +
-            "        android:layout_column=\"0\"\n" +
-            "        android:layout_columnSpan=\"2\"\n" +
-            "        android:layout_gravity=\"left|top\"\n" +
-            "        android:layout_row=\"0\"\n" +
-            "        android:text=\"Button1\" />\n" +
-            "\n" +
-            "    <Button\n" +
-            "        android:id=\"@+id/button3\"\n" +
-            "        android:layout_column=\"1\"\n" +
-            "        android:layout_columnSpan=\"2\"\n" +
-            "        android:layout_gravity=\"left|top\"\n" +
-            "        android:layout_row=\"1\"\n" +
-            "        android:text=\"Button2\" />\n" +
-            "\n" +
-            "    <Button\n" +
-            "        android:id=\"@+id/button2\"\n" +
-            "        android:layout_column=\"2\"\n" +
-            "        android:layout_gravity=\"left|top\"\n" +
-            "        android:layout_row=\"0\"\n" +
-            "        android:text=\"Button3\" />\n" +
-            "\n" +
-            "    <Space\n" +
-            "        android:id=\"@+id/spacer_177\"\n" +
-            "        android:layout_width=\"46dp\"\n" +
-            "        android:layout_height=\"1dp\"\n" +
-            "        android:layout_column=\"0\"\n" +
-            "        android:layout_row=\"0\" />\n" +
-            "\n" +
-            "</GridLayout>";
-
-        TestNode targetNode = TestNode.createFromXml(xml);
-        assertNotNull(targetNode);
-
-        TestNode button1 = TestNode.findById(targetNode, "@+id/button1");
-        TestNode button2 = TestNode.findById(targetNode, "@+id/button2");
-        TestNode button3 = TestNode.findById(targetNode, "@+id/button3");
-        TestNode hspacer = TestNode.findById(targetNode, "@+id/spacer_177");
-        assertNotNull(button1);
-        assertNotNull(button2);
-        assertNotNull(button3);
-        assertNotNull(hspacer);
-
-        // Assign some bounds such that the model makes sense when merging spacer sizes
-        // TODO: MAke test utility method to automatically assign half divisions!!
-        button1.bounds(new Rect(0, 0, 100, 40));
-        button2.bounds(new Rect(100, 0, 100, 40));
-        button3.bounds(new Rect(50, 40, 100, 40));
-        hspacer.bounds(new Rect(0, 0, 50, 1));
-
-        GridModel model = GridModel.get(new LayoutTestBase.TestRulesEngine(targetNode.getFqcn()),
-                targetNode, null);
-        assertEquals(4, model.declaredColumnCount);
-        assertEquals(3, model.actualColumnCount);
-        assertEquals(2, model.actualRowCount);
-
-        ViewData buttonData = model.getView(button1);
-        assertEquals(0, buttonData.column);
-
-        // Delete button1
-        button1.getParent().removeChild(button1);
-        model.onDeleted(Arrays.<INode>asList(button1));
-        model.applyPositionAttributes();
-
-        assertEquals(3, model.declaredColumnCount);
-        assertEquals(3, model.actualColumnCount);
-        assertEquals(2, model.actualRowCount);
-        assertNull(model.getView(button1));
-
-        assertEquals(
-                "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" +
-                "<GridLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n" +
-                "    android:layout_width=\"match_parent\"\n" +
-                "    android:layout_height=\"match_parent\"\n" +
-                "    android:columnCount=\"3\"\n" +
-                "    android:orientation=\"vertical\">\n" +
-                "\n" +
-                "    <Button\n" +
-                "        android:id=\"@+id/button3\"\n" +
-                "        android:layout_column=\"1\"\n" +
-                "        android:layout_columnSpan=\"2\"\n" +
-                "        android:layout_gravity=\"left|top\"\n" +
-                "        android:layout_row=\"1\"\n" +
-                "        android:text=\"Button2\">\n" +
-                "    </Button>\n" +
-                "\n" +
-                "    <Button\n" +
-                "        android:id=\"@+id/button2\"\n" +
-                "        android:layout_column=\"2\"\n" +
-                "        android:layout_gravity=\"left|top\"\n" +
-                "        android:layout_row=\"0\"\n" +
-                "        android:text=\"Button3\">\n" +
-                "    </Button>\n" +
-                "\n" +
-                "    <Space\n" +
-                "        android:id=\"@+id/spacer_177\"\n" +
-                "        android:layout_width=\"46dp\"\n" +
-                "        android:layout_height=\"1dp\"\n" +
-                "        android:layout_column=\"0\"\n" +
-                "        android:layout_row=\"0\">\n" +
-                "    </Space>\n" +
-                "\n" +
-                "</GridLayout>", TestNode.toXml(targetNode));
-    }
-
-    public void testDelete3_INCOMPLETE() throws Exception {
-        String xml =
-            "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" +
-            "<GridLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n" +
-            "  android:layout_width=\"match_parent\" android:layout_height=\"match_parent\"\n" +
-            "  android:columnCount=\"6\">\n" +
-            "  <Button android:id=\"@+id/button1\" android:layout_column=\"1\"\n" +
-            "    android:layout_columnSpan=\"2\" android:layout_gravity=\"left|top\"\n" +
-            "    android:layout_row=\"1\" android:layout_rowSpan=\"2\" android:text=\"Button\" />\n" +
-            "  <TextView android:id=\"@+id/TextView1\" android:layout_column=\"4\"\n" +
-            "    android:layout_gravity=\"left|top\" android:layout_row=\"1\"\n" +
-            "    android:text=\"Text\" />\n" +
-            "  <Button android:id=\"@+id/button3\" android:layout_column=\"5\"\n" +
-            "    android:layout_gravity=\"left|top\" android:layout_row=\"2\"\n" +
-            "    android:layout_rowSpan=\"2\" android:text=\"Button\" />\n" +
-            "  <Button android:id=\"@+id/button2\" android:layout_column=\"2\"\n" +
-            "    android:layout_columnSpan=\"3\" android:layout_gravity=\"left|top\"\n" +
-            "    android:layout_row=\"4\" android:text=\"Button\" />\n" +
-            "  <Space android:id=\"@+id/wspace1\" android:layout_width=\"21dp\"\n" +
-            "    android:layout_height=\"1dp\" android:layout_column=\"0\"\n" +
-            "    android:layout_row=\"0\" />\n" +
-            "  <Space android:id=\"@+id/spacer_630\" android:layout_width=\"1dp\"\n" +
-            "    android:layout_height=\"55dp\" android:layout_column=\"0\"\n" +
-            "    android:layout_row=\"0\" />\n" +
-            "  <Space android:id=\"@+id/wspace2\" android:layout_width=\"10dp\"\n" +
-            "    android:layout_height=\"1dp\" android:layout_column=\"3\"\n" +
-            "    android:layout_row=\"0\" />\n" +
-            "  <Space android:id=\"@+id/spacer_619\" android:layout_width=\"59dp\"\n" +
-            "    android:layout_height=\"1dp\" android:layout_column=\"1\"\n" +
-            "    android:layout_row=\"0\" />\n" +
-            "  <Space android:id=\"@+id/spacer_102\" android:layout_width=\"1dp\"\n" +
-            "    android:layout_height=\"30dp\" android:layout_column=\"0\"\n" +
-            "    android:layout_row=\"1\" />\n" +
-            "  <Space android:id=\"@+id/spacer_109\" android:layout_width=\"1dp\"\n" +
-            "    android:layout_height=\"28dp\" android:layout_column=\"0\"\n" +
-            "    android:layout_row=\"2\" />\n" +
-            "  <Space android:id=\"@+id/spacer_146\" android:layout_width=\"1dp\"\n" +
-            "    android:layout_height=\"70dp\" android:layout_column=\"0\"\n" +
-            "    android:layout_row=\"3\" />\n" +
-            "</GridLayout>";
-        TestNode targetNode = TestNode.createFromXml(xml);
-        assertNotNull(targetNode);
-        targetNode.assignBounds(
-            "android.widget.GridLayout [0,109,480,800] <GridLayout>\n" +
-            "    android.widget.Button [32,83,148,155] <Button> @+id/button1\n" +
-            "    android.widget.TextView [163,83,205,109] <TextView> @+id/TextView1\n" +
-            "    android.widget.Button [237,128,353,200] <Button> @+id/button3\n" +
-            "    android.widget.Button [121,275,237,347] <Button> @+id/button2\n" +
-            "    android.widget.Space [0,0,32,2] <Space> @+id/wspace1\n" +
-            "    android.widget.Space [0,0,2,83] <Space> @+id/spacer_630\n" +
-            "    android.widget.Space [148,0,163,2] <Space> @+id/wspace2\n" +
-            "    android.widget.Space [32,0,121,2] <Space> @+id/spacer_619\n" +
-            "    android.widget.Space [0,83,2,128] <Space> @+id/spacer_102\n" +
-            "    android.widget.Space [0,128,2,170] <Space> @+id/spacer_109\n" +
-            "    android.widget.Space [0,170,2,275] <Space> @+id/spacer_146\n");
-        TestNode layout = TestNode.findById(targetNode, "@+id/GridLayout1");
-        //TestNode button1 = TestNode.findById(targetNode, "@+id/button1");
-        TestNode button2 = TestNode.findById(targetNode, "@+id/button2");
-        TestNode button3 = TestNode.findById(targetNode, "@+id/button3");
-
-        GridModel model = GridModel.get(new LayoutTestBase.TestRulesEngine(targetNode.getFqcn()),
-                targetNode, null);
-        assertEquals(6, model.declaredColumnCount);
-        assertEquals(6, model.actualColumnCount);
-        assertEquals(5, model.actualRowCount);
-
-        // TODO: Delete button2 or button3: bad stuff happens visually
-        fail("Finish test");
-    }
-
-    public void testDelete4_INCOMPLETE() {
-        String xml = "" +
-            "<GridLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n" +
-            "  xmlns:tools=\"http://schemas.android.com/tools\" " +
-            "  android:layout_width=\"match_parent\"\n" +
-            "  android:layout_height=\"match_parent\" android:columnCount=\"3\"\n" +
-            "  android:gravity=\"center\" android:text=\"@string/hello_world\"\n" +
-            "  tools:context=\".MainActivity\">\n" +
-            "  <Button android:id=\"@+id/button2\" android:layout_column=\"1\"\n" +
-            "    android:layout_columnSpan=\"2\" android:layout_gravity=\"left|top\"\n" +
-            "    android:layout_row=\"1\" android:text=\"Button\" />\n" +
-            "  <Button android:id=\"@+id/button1\" android:layout_column=\"1\"\n" +
-            "    android:layout_columnSpan=\"2\" android:layout_gravity=\"left|top\"\n" +
-            "    android:layout_row=\"3\" android:text=\"Button\" />\n" +
-            "  <Space android:id=\"@+id/spacer_167\" android:layout_width=\"74dp\"\n" +
-            "    android:layout_height=\"1dp\" android:layout_column=\"0\"\n" +
-            "    android:layout_row=\"0\" />\n" +
-            "  <Space android:id=\"@+id/spacer_133\" android:layout_width=\"1dp\"\n" +
-            "    android:layout_height=\"21dp\" android:layout_column=\"0\"\n" +
-            "    android:layout_row=\"0\" />\n" +
-            "  <Space android:id=\"@+id/spacer_142\" android:layout_width=\"1dp\"\n" +
-            "    android:layout_height=\"26dp\" android:layout_column=\"0\"\n" +
-            "    android:layout_row=\"2\" />\n" +
-            "  <Space android:id=\"@+id/spacer_673\" android:layout_width=\"43dp\"\n" +
-            "    android:layout_height=\"1dp\" android:layout_column=\"1\"\n" +
-            "    android:layout_row=\"0\" />\n" +
-            "  <Space android:id=\"@+id/spacer_110\" android:layout_width=\"202dp\"\n" +
-            "    android:layout_height=\"15dp\" android:layout_column=\"2\" />\n" +
-            "</GridLayout>";
-        TestNode targetNode = TestNode.createFromXml(xml);
-        assertNotNull(targetNode);
-        targetNode.assignBounds(
-                "android.widget.GridLayout [0,109,480,800] <GridLayout>\n" +
-                "    android.widget.Button [111,32,227,104] <Button> @+id/button2\n" +
-                "    android.widget.Button [111,143,227,215] <Button> @+id/button1\n" +
-                "    android.widget.Space [0,0,111,2] <Space> @+id/spacer_167\n" +
-                "    android.widget.Space [0,0,2,32] <Space> @+id/spacer_133\n" +
-                "    android.widget.Space [0,104,2,143] <Space> @+id/spacer_142\n" +
-                "    android.widget.Space [111,0,176,2] <Space> @+id/spacer_673\n" +
-                "    android.widget.Space [176,668,479,691] <Space> @+id/spacer_110");
-
-
-        // Remove button2; button1 shifts to the right!
-
-        //TestNode layout = TestNode.findById(targetNode, "@+id/GridLayout1");
-        //TestNode button1 = TestNode.findById(targetNode, "@+id/button1");
-        TestNode button2 = TestNode.findById(targetNode, "@+id/button2");
-        TestNode button3 = TestNode.findById(targetNode, "@+id/button3");
-        assertEquals(new Rect(111, 32, 227 - 111, 104 - 32), button2.getBounds());
-
-        GridModel model = GridModel.get(new LayoutTestBase.TestRulesEngine(targetNode.getFqcn()),
-                targetNode, null);
-        assertEquals(3, model.declaredColumnCount);
-        assertEquals(3, model.actualColumnCount);
-        assertEquals(4, model.actualRowCount);
-        fail("Finish test");
-    }
-
-    public void testDelete5_INCOMPLETE() {
-        String xml =
-                "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" +
-                "<GridLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n" +
-                "  android:id=\"@+id/GridLayout1\" android:layout_width=\"match_parent\"\n" +
-                "  android:layout_height=\"match_parent\" android:columnCount=\"4\"\n" +
-                "  android:orientation=\"vertical\">\n" +
-                "  <Button android:id=\"@+id/button1\" android:layout_column=\"0\"\n" +
-                "    android:layout_gravity=\"center_horizontal|bottom\"\n" +
-                "    android:layout_row=\"0\" android:text=\"Button\" />\n" +
-                "  <Space android:layout_width=\"66dp\" android:layout_height=\"1dp\"\n" +
-                "    android:layout_column=\"0\" android:layout_row=\"0\" />\n" +
-                "  <Button android:id=\"@+id/button3\" android:layout_column=\"2\"\n" +
-                "    android:layout_gravity=\"left|bottom\" android:layout_row=\"0\"\n" +
-                "    android:text=\"Button\" />\n" +
-                "  <Button android:id=\"@+id/button2\" android:layout_column=\"3\"\n" +
-                "    android:layout_columnSpan=\"2\" android:layout_gravity=\"left|bottom\"\n" +
-                "    android:layout_row=\"0\" android:text=\"Button\" />\n" +
-                "  <Space android:id=\"@+id/spacer_109\" android:layout_width=\"51dp\"\n" +
-                "    android:layout_height=\"1dp\" android:layout_column=\"1\"\n" +
-                "    android:layout_row=\"0\" />\n" +
-                "  <Space android:layout_width=\"129dp\" android:layout_height=\"1dp\"\n" +
-                "    android:layout_column=\"2\" android:layout_row=\"0\" />\n" +
-                "  <Space android:layout_width=\"62dp\" android:layout_height=\"1dp\"\n" +
-                "    android:layout_column=\"3\" android:layout_row=\"0\" />\n" +
-                "  <Space android:id=\"@+id/spacer_397\" android:layout_width=\"1dp\"\n" +
-                "    android:layout_height=\"103dp\" android:layout_column=\"0\"\n" +
-                "    android:layout_row=\"0\" />\n" +
-                "  <Space android:layout_width=\"1dp\" android:layout_height=\"356dp\"\n" +
-                "    android:layout_column=\"0\" android:layout_row=\"1\" />\n" +
-                "</GridLayout>";
-        TestNode targetNode = TestNode.createFromXml(xml);
-        assertNotNull(targetNode);
-
-        targetNode.assignBounds(
-                "android.widget.GridLayout [0,109,480,800] <GridLayout> @+id/GridLayout1\n" +
-                "    android.widget.Button [0,83,116,155] <Button> @+id/button1\n" +
-                "    android.widget.Space [0,0,99,2] <Space>\n" +
-                "    android.widget.Button [193,83,309,155] <Button> @+id/button3\n" +
-                "    android.widget.Button [387,83,503,155] <Button> @+id/button2\n" +
-                "    android.widget.Space [116,0,193,2] <Space> @+id/spacer_109\n" +
-                "    android.widget.Space [193,0,387,2] <Space>\n" +
-                "    android.widget.Space [387,0,480,2] <Space>\n" +
-                "    android.widget.Space [0,0,2,155] <Space> @+id/spacer_397\n" +
-                "    android.widget.Space [0,155,2,689] <Space>");
-
-        // Delete button3. This causes an array out of bounds exception currently.
-
-        //TestNode layout = TestNode.findById(targetNode, "@+id/GridLayout1");
-        //TestNode button1 = TestNode.findById(targetNode, "@+id/button1");
-        TestNode button2 = TestNode.findById(targetNode, "@+id/button2");
-        TestNode button3 = TestNode.findById(targetNode, "@+id/button3");
-        assertEquals(new Rect(387, 83, 503 - 387, 155- 83), button2.getBounds());
-
-        GridModel model = GridModel.get(new LayoutTestBase.TestRulesEngine(targetNode.getFqcn()),
-                targetNode, null);
-        assertEquals(4, model.declaredColumnCount);
-        assertEquals(4, model.actualColumnCount);
-        assertEquals(2, model.actualRowCount);
-
-        model.onDeleted(Collections.<INode>singletonList(button3));
-        // Exception fixed; todo: Test that the model updates are correct.
-
-        assertEquals(3, model.declaredColumnCount);
-        assertEquals(3, model.actualColumnCount);
-        assertEquals(2, model.actualRowCount);
-
-        fail("Finish test");
-    }
-
-    public void testInsert1() throws Exception {
-        String xml =
-            "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" +
-            "<GridLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n" +
-            "    android:id=\"@+id/GridLayout1\"\n" +
-            "    android:layout_width=\"match_parent\"\n" +
-            "    android:layout_height=\"match_parent\"\n" +
-            "    android:columnCount=\"4\"\n" +
-            "    android:orientation=\"vertical\" >\n" +
-            "\n" +
-            "    <Button\n" +
-            "        android:id=\"@+id/button1\"\n" +
-            "        android:layout_column=\"0\"\n" +
-            "        android:layout_columnSpan=\"4\"\n" +
-            "        android:layout_gravity=\"center_horizontal|bottom\"\n" +
-            "        android:layout_row=\"0\"\n" +
-            "        android:text=\"Button\" />\n" +
-            "\n" +
-            "    <Button\n" +
-            "        android:id=\"@+id/button2\"\n" +
-            "        android:layout_column=\"2\"\n" +
-            "        android:layout_gravity=\"left|top\"\n" +
-            "        android:layout_row=\"1\"\n" +
-            "        android:text=\"Button\" />\n" +
-            "\n" +
-            "    <Button\n" +
-            "        android:id=\"@+id/button3\"\n" +
-            "        android:layout_column=\"3\"\n" +
-            "        android:layout_gravity=\"left|top\"\n" +
-            "        android:layout_row=\"1\"\n" +
-            "        android:text=\"Button\" />\n" +
-            "\n" +
-            "    <Space\n" +
-            "        android:id=\"@+id/spacer_393\"\n" +
-            "        android:layout_width=\"81dp\"\n" +
-            "        android:layout_height=\"1dp\"\n" +
-            "        android:layout_column=\"1\"\n" +
-            "        android:layout_row=\"0\" />\n" +
-            "\n" +
-            "    <Space\n" +
-            "        android:id=\"@+id/spacer_397\"\n" +
-            "        android:layout_width=\"1dp\"\n" +
-            "        android:layout_height=\"103dp\"\n" +
-            "        android:layout_column=\"0\"\n" +
-            "        android:layout_row=\"0\" />\n" +
-            "\n" +
-            "</GridLayout>";
-
-        TestNode targetNode = TestNode.createFromXml(xml);
-        assertNotNull(targetNode);
-
-        TestNode layout = TestNode.findById(targetNode, "@+id/GridLayout1");
-        TestNode button1 = TestNode.findById(targetNode, "@+id/button1");
-        TestNode button2 = TestNode.findById(targetNode, "@+id/button2");
-        TestNode button3 = TestNode.findById(targetNode, "@+id/button3");
-        TestNode hspacer = TestNode.findById(targetNode, "@+id/spacer_393");
-        TestNode vspacer = TestNode.findById(targetNode, "@+id/spacer_397");
-        assertNotNull(layout);
-        assertNotNull(button1);
-        assertNotNull(button2);
-        assertNotNull(button3);
-        assertNotNull(hspacer);
-
-        // Obtained by setting ViewHierarchy.DUMP_INFO=true:
-        layout.bounds(new Rect(0, 109, 480, 800-109));
-        button1.bounds(new Rect(182, 83, 298-182, 155-83));
-        button2.bounds(new Rect(124, 155, 240-124, 227-155));
-        button3.bounds(new Rect(240, 155, 356-240, 227-155));
-        hspacer.bounds(new Rect(2, 0, 124-2, 2));
-        vspacer.bounds(new Rect(0, 0, 2, 155));
-
-        GridModel model = GridModel.get(new LayoutTestBase.TestRulesEngine(targetNode.getFqcn()),
-                targetNode, null);
-        assertEquals(4, model.declaredColumnCount);
-        assertEquals(4, model.actualColumnCount);
-        assertEquals(2, model.actualRowCount);
-
-
-        model.splitColumn(1, false, 21, 32);
-        int index = model.getInsertIndex(2, 1);
-        GridModel.ViewData next = model.getView(index);
-        INode newChild = targetNode.insertChildAt(FQCN_BUTTON, index);
-        next.applyPositionAttributes();
-        model.setGridAttribute(newChild, ATTR_LAYOUT_COLUMN, 1);
-        model.setGridAttribute(newChild, ATTR_LAYOUT_COLUMN_SPAN, 3);
-    }
-
-    public void testInsert2() throws Exception {
-        // Drop into a view where there is a centered view: when dropping to the right of
-        // it (on a row further down), ensure that the row span is increased for the
-        // non-left-justified centered view which does not horizontally overlap the view
-        String xml =
-                "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" +
-                "<GridLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n" +
-                "    android:id=\"@+id/GridLayout1\"\n" +
-                "    android:layout_width=\"match_parent\"\n" +
-                "    android:layout_height=\"match_parent\"\n" +
-                "    android:columnCount=\"3\"\n" +
-                "    android:orientation=\"vertical\" >\n" +
-                "\n" +
-                "    <Button\n" +
-                "        android:id=\"@+id/button1\"\n" +
-                "        android:layout_column=\"0\"\n" +
-                "        android:layout_columnSpan=\"3\"\n" +
-                "        android:layout_gravity=\"center_horizontal|bottom\"\n" +
-                "        android:layout_row=\"0\"\n" +
-                "        android:text=\"Button\" />\n" +
-                "\n" +
-                "    <Button\n" +
-                "        android:id=\"@+id/button2\"\n" +
-                "        android:layout_column=\"1\"\n" +
-                "        android:layout_gravity=\"left|top\"\n" +
-                "        android:layout_row=\"1\"\n" +
-                "        android:text=\"Button\" />\n" +
-                "\n" +
-                "    <Button\n" +
-                "        android:id=\"@+id/button3\"\n" +
-                "        android:layout_column=\"2\"\n" +
-                "        android:layout_gravity=\"left|top\"\n" +
-                "        android:layout_row=\"1\"\n" +
-                "        android:text=\"Button\" />\n" +
-                "\n" +
-                "    <Space\n" +
-                "        android:id=\"@+id/spacer_393\"\n" +
-                "        android:layout_width=\"81dp\"\n" +
-                "        android:layout_height=\"1dp\"\n" +
-                "        android:layout_column=\"0\"\n" +
-                "        android:layout_row=\"0\" />\n" +
-                "\n" +
-                "    \n" +
-                "    <Space\n" +
-                "        android:id=\"@+id/spacer_397\"\n" +
-                "        android:layout_width=\"1dp\"\n" +
-                "        android:layout_height=\"103dp\"\n" +
-                "        android:layout_column=\"0\"\n" +
-                "        android:layout_row=\"0\" />\n" +
-                "\n" +
-                "    \n" +
-                "</GridLayout>";
-
-        TestNode targetNode = TestNode.createFromXml(xml);
-        assertNotNull(targetNode);
-
-        TestNode layout = TestNode.findById(targetNode, "@+id/GridLayout1");
-        TestNode button1 = TestNode.findById(targetNode, "@+id/button1");
-        TestNode button2 = TestNode.findById(targetNode, "@+id/button2");
-        TestNode button3 = TestNode.findById(targetNode, "@+id/button3");
-        TestNode hspacer = TestNode.findById(targetNode, "@+id/spacer_393");
-        TestNode vspacer = TestNode.findById(targetNode, "@+id/spacer_397");
-        assertNotNull(layout);
-        assertNotNull(button1);
-        assertNotNull(button2);
-        assertNotNull(button3);
-        assertNotNull(hspacer);
-
-        // Obtained by setting ViewHierarchy.DUMP_INFO=true:
-        layout.bounds(new Rect(0, 109, 480, 800-109));
-        button1.bounds(new Rect(182, 83, 298-182, 155-83));
-        button2.bounds(new Rect(122, 155, 238-122, 227-155));
-        button3.bounds(new Rect(238, 155, 354-238, 227-155));
-        hspacer.bounds(new Rect(0, 0, 122, 2));
-        vspacer.bounds(new Rect(0, 0, 2, 155));
-
-        GridModel model = GridModel.get(new LayoutTestBase.TestRulesEngine(targetNode.getFqcn()),
-                targetNode, null);
-        assertEquals(3, model.declaredColumnCount);
-        assertEquals(3, model.actualColumnCount);
-        assertEquals(2, model.actualRowCount);
-
-        ViewData view = model.getView(button1);
-        assertNotNull(view);
-        assertEquals(0, view.column);
-        assertEquals(3, view.columnSpan);
-        assertEquals("3", view.node.getStringAttr(ANDROID_URI, ATTR_LAYOUT_COLUMN_SPAN));
-
-        model.splitColumn(3, false, 53, 318);
-        assertEquals(0, view.column);
-        assertEquals(4, view.columnSpan);
-        assertEquals("4", view.node.getStringAttr(ANDROID_URI, ATTR_LAYOUT_COLUMN_SPAN));
-    }
-
-    public void testInsert3_BROKEN() throws Exception {
-        // Check that when we insert a new gap column near an existing column, the
-        // view in that new column does not get moved
-        String xml =
-                "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" +
-                "<GridLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n" +
-                "    android:id=\"@+id/GridLayout1\"\n" +
-                "    android:layout_width=\"match_parent\"\n" +
-                "    android:layout_height=\"match_parent\"\n" +
-                "    android:columnCount=\"3\"\n" +
-                "    android:orientation=\"vertical\" >\n" +
-                "\n" +
-                "    <Button\n" +
-                "        android:id=\"@+id/button1\"\n" +
-                "        android:layout_column=\"0\"\n" +
-                "        android:layout_columnSpan=\"3\"\n" +
-                "        android:layout_gravity=\"center_horizontal|bottom\"\n" +
-                "        android:layout_row=\"0\"\n" +
-                "        android:text=\"Button\" />\n" +
-                "\n" +
-                "    <Button\n" +
-                "        android:id=\"@+id/button2\"\n" +
-                "        android:layout_column=\"1\"\n" +
-                "        android:layout_gravity=\"left|top\"\n" +
-                "        android:layout_row=\"1\"\n" +
-                "        android:text=\"Button\" />\n" +
-                "\n" +
-                "    <Button\n" +
-                "        android:id=\"@+id/button3\"\n" +
-                "        android:layout_column=\"2\"\n" +
-                "        android:layout_gravity=\"left|top\"\n" +
-                "        android:layout_row=\"1\"\n" +
-                "        android:text=\"Button\" />\n" +
-                "\n" +
-                "    <Space\n" +
-                "        android:id=\"@+id/spacer_393\"\n" +
-                "        android:layout_width=\"81dp\"\n" +
-                "        android:layout_height=\"1dp\"\n" +
-                "        android:layout_column=\"0\"\n" +
-                "        android:layout_row=\"0\" />\n" +
-                "\n" +
-                "    \n" +
-                "    <Space\n" +
-                "        android:id=\"@+id/spacer_397\"\n" +
-                "        android:layout_width=\"1dp\"\n" +
-                "        android:layout_height=\"103dp\"\n" +
-                "        android:layout_column=\"0\"\n" +
-                "        android:layout_row=\"0\" />\n" +
-                "\n" +
-                "    \n" +
-                "</GridLayout>";
-
-        TestNode targetNode = TestNode.createFromXml(xml);
-        assertNotNull(targetNode);
-
-        TestNode layout = TestNode.findById(targetNode, "@+id/GridLayout1");
-        TestNode button1 = TestNode.findById(targetNode, "@+id/button1");
-        TestNode button2 = TestNode.findById(targetNode, "@+id/button2");
-        TestNode button3 = TestNode.findById(targetNode, "@+id/button3");
-        TestNode hspacer = TestNode.findById(targetNode, "@+id/spacer_393");
-        TestNode vspacer = TestNode.findById(targetNode, "@+id/spacer_397");
-        assertNotNull(layout);
-        assertNotNull(button1);
-        assertNotNull(button2);
-        assertNotNull(button3);
-        assertNotNull(hspacer);
-
-        // Obtained by setting ViewHierarchy.DUMP_INFO=true:
-        layout.bounds(new Rect(0, 109, 480, 800-109));
-        button1.bounds(new Rect(182, 83, 298-182, 155-83));
-        button2.bounds(new Rect(122, 155, 238-122, 227-155));
-        button3.bounds(new Rect(238, 155, 354-238, 227-155));
-        hspacer.bounds(new Rect(0, 0, 122, 2));
-        vspacer.bounds(new Rect(0, 0, 2, 155));
-
-        GridModel model = GridModel.get(new LayoutTestBase.TestRulesEngine(targetNode.getFqcn()),
-                targetNode, null);
-        assertEquals(3, model.declaredColumnCount);
-        assertEquals(3, model.actualColumnCount);
-        assertEquals(2, model.actualRowCount);
-
-        ViewData view = model.getView(button3);
-        assertNotNull(view);
-        assertEquals(2, view.column);
-        assertEquals(1, view.columnSpan);
-        assertNull("1", view.node.getStringAttr(ANDROID_URI, ATTR_LAYOUT_COLUMN_SPAN));
-
-        model.splitColumn(2, true, 10, 253);
-        // TODO: Finish this test: Assert that the cells are in the right place
-        //assertEquals(4, view.column);
-        //assertEquals(1, view.columnSpan);
-        //assertEquals("4", view.node.getStringAttr(ANDROID_URI, ATTR_LAYOUT_COLUMN_SPAN));
-        fail("Finish test");
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/common/layout/relative/DeletionHandlerTest.java b/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/common/layout/relative/DeletionHandlerTest.java
deleted file mode 100644
index d629a38..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/common/layout/relative/DeletionHandlerTest.java
+++ /dev/null
@@ -1,445 +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.ide.common.layout.relative;
-
-import static com.android.SdkConstants.ATTR_ID;
-import static com.android.SdkConstants.ANDROID_URI;
-
-import com.android.ide.common.api.INode;
-import com.android.ide.common.layout.BaseViewRule;
-import com.android.ide.common.layout.TestNode;
-
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
-
-import junit.framework.TestCase;
-
-@SuppressWarnings("javadoc")
-public class DeletionHandlerTest extends TestCase {
-    public void testSimple() {
-        String xml = "" +
-            "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" +
-            "<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n" +
-            "    xmlns:tools=\"http://schemas.android.com/tools\"\n" +
-            "    android:layout_width=\"match_parent\"\n" +
-            "    android:layout_height=\"match_parent\"\n" +
-            "    tools:ignore=\"HardcodedText\" >\n" +
-            "\n" +
-            "    <Button\n" +
-            "        android:id=\"@+id/button1\"\n" +
-            "        android:layout_width=\"wrap_content\"\n" +
-            "        android:layout_height=\"wrap_content\"\n" +
-            "        android:layout_alignParentLeft=\"true\"\n" +
-            "        android:text=\"A\" />\n" +
-            "\n" +
-            "    <Button\n" +
-            "        android:id=\"@+id/button2\"\n" +
-            "        android:layout_width=\"wrap_content\"\n" +
-            "        android:layout_height=\"wrap_content\"\n" +
-            "        android:layout_alignBaseline=\"@+id/button1\"\n" +
-            "        android:layout_alignBottom=\"@+id/button1\"\n" +
-            "        android:layout_toRightOf=\"@+id/button1\"\n" +
-            "        android:text=\"B\" />\n" +
-            "\n" +
-            "    <Button\n" +
-            "        android:id=\"@+id/button3\"\n" +
-            "        android:layout_width=\"wrap_content\"\n" +
-            "        android:layout_height=\"wrap_content\"\n" +
-            "        android:layout_alignBottom=\"@+id/button2\"\n" +
-            "        android:layout_toRightOf=\"@+id/button2\"\n" +
-            "        android:text=\"C\" />\n" +
-            "\n" +
-            "</RelativeLayout>";
-        TestNode targetNode = TestNode.createFromXml(xml);
-        assertNotNull(targetNode);
-
-        TestNode button2 = TestNode.findById(targetNode, "@+id/button2");
-
-        INode layout = button2.getParent();
-        List<INode> deletedNodes = Collections.<INode>singletonList(button2);
-        List<INode> movedNodes = Collections.<INode>emptyList();
-        assertSame(layout, targetNode);
-        layout.removeChild(button2);
-
-        DeletionHandler handler = new DeletionHandler(deletedNodes, movedNodes, layout);
-        handler.updateConstraints();
-
-        String updated = TestNode.toXml(targetNode);
-        assertEquals(
-                "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" +
-                "<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n" +
-                "    xmlns:tools=\"http://schemas.android.com/tools\"\n" +
-                "    android:layout_width=\"match_parent\"\n" +
-                "    android:layout_height=\"match_parent\"\n" +
-                "    tools:ignore=\"HardcodedText\">\n" +
-                "\n" +
-                "    <Button\n" +
-                "        android:id=\"@+id/button1\"\n" +
-                "        android:layout_width=\"wrap_content\"\n" +
-                "        android:layout_height=\"wrap_content\"\n" +
-                "        android:layout_alignParentLeft=\"true\"\n" +
-                "        android:text=\"A\">\n" +
-                "    </Button>\n" +
-                "\n" +
-                "    <Button\n" +
-                "        android:id=\"@+id/button3\"\n" +
-                "        android:layout_width=\"wrap_content\"\n" +
-                "        android:layout_height=\"wrap_content\"\n" +
-                "        android:layout_alignBaseline=\"@+id/button1\"\n" +
-                "        android:layout_alignBottom=\"@+id/button1\"\n" +
-                "        android:layout_toRightOf=\"@+id/button1\"\n" +
-                "        android:text=\"C\">\n" +
-                "    </Button>\n" +
-                "\n" +
-                "</RelativeLayout>",
-                updated);
-        assertFalse(updated.contains(BaseViewRule.stripIdPrefix(button2.getStringAttr(ANDROID_URI,
-                ATTR_ID))));
-    }
-
-    public void testTransitive() {
-        String xml = "" +
-            "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" +
-            "<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n" +
-            "    xmlns:tools=\"http://schemas.android.com/tools\"\n" +
-            "    android:layout_width=\"match_parent\"\n" +
-            "    android:layout_height=\"match_parent\"\n" +
-            "    tools:ignore=\"HardcodedText\" >\n" +
-            "\n" +
-            "    <Button\n" +
-            "        android:id=\"@+id/button1\"\n" +
-            "        android:layout_width=\"wrap_content\"\n" +
-            "        android:layout_height=\"wrap_content\"\n" +
-            "        android:layout_alignParentLeft=\"true\"\n" +
-            "        android:layout_alignParentTop=\"true\"\n" +
-            "        android:text=\"Above\" />\n" +
-            "\n" +
-            "    <Button\n" +
-            "        android:id=\"@+id/button2\"\n" +
-            "        android:layout_width=\"wrap_content\"\n" +
-            "        android:layout_height=\"wrap_content\"\n" +
-            "        android:layout_alignParentLeft=\"true\"\n" +
-            "        android:layout_below=\"@+id/button1\"\n" +
-            "        android:text=\"A\" />\n" +
-            "\n" +
-            "    <Button\n" +
-            "        android:id=\"@+id/button3\"\n" +
-            "        android:layout_width=\"wrap_content\"\n" +
-            "        android:layout_height=\"wrap_content\"\n" +
-            "        android:layout_alignBaseline=\"@+id/button2\"\n" +
-            "        android:layout_alignBottom=\"@+id/button2\"\n" +
-            "        android:layout_toRightOf=\"@+id/button2\"\n" +
-            "        android:text=\"B\" />\n" +
-            "\n" +
-            "    <Button\n" +
-            "        android:id=\"@+id/button4\"\n" +
-            "        android:layout_width=\"wrap_content\"\n" +
-            "        android:layout_height=\"wrap_content\"\n" +
-            "        android:layout_alignBottom=\"@+id/button3\"\n" +
-            "        android:layout_toRightOf=\"@+id/button3\"\n" +
-            "        android:text=\"C\" />\n" +
-            "\n" +
-            "    <Button\n" +
-            "        android:id=\"@+id/button5\"\n" +
-            "        android:layout_width=\"wrap_content\"\n" +
-            "        android:layout_height=\"wrap_content\"\n" +
-            "        android:layout_alignBaseline=\"@+id/button4\"\n" +
-            "        android:layout_alignBottom=\"@+id/button4\"\n" +
-            "        android:layout_toRightOf=\"@+id/button4\"\n" +
-            "        android:text=\"D\" />\n" +
-            "\n" +
-            "    <Button\n" +
-            "        android:id=\"@+id/button6\"\n" +
-            "        android:layout_width=\"wrap_content\"\n" +
-            "        android:layout_height=\"wrap_content\"\n" +
-            "        android:layout_alignBottom=\"@+id/button5\"\n" +
-            "        android:layout_toRightOf=\"@+id/button5\"\n" +
-            "        android:text=\"E\" />\n" +
-            "\n" +
-            "    <Button\n" +
-            "        android:id=\"@+id/button7\"\n" +
-            "        android:layout_width=\"wrap_content\"\n" +
-            "        android:layout_height=\"wrap_content\"\n" +
-            "        android:layout_alignLeft=\"@+id/button3\"\n" +
-            "        android:layout_below=\"@+id/button3\"\n" +
-            "        android:text=\"Button\" />\n" +
-            "\n" +
-            "    <CheckBox\n" +
-            "        android:id=\"@+id/checkBox1\"\n" +
-            "        android:layout_width=\"wrap_content\"\n" +
-            "        android:layout_height=\"wrap_content\"\n" +
-            "        android:layout_alignBaseline=\"@+id/button7\"\n" +
-            "        android:layout_alignBottom=\"@+id/button7\"\n" +
-            "        android:layout_toRightOf=\"@+id/button7\"\n" +
-            "        android:text=\"CheckBox\" />\n" +
-            "\n" +
-            "    <Button\n" +
-            "        android:id=\"@+id/button8\"\n" +
-            "        android:layout_width=\"wrap_content\"\n" +
-            "        android:layout_height=\"wrap_content\"\n" +
-            "        android:layout_below=\"@+id/checkBox1\"\n" +
-            "        android:layout_toRightOf=\"@+id/checkBox1\"\n" +
-            "        android:text=\"Button\" />\n" +
-            "\n" +
-            "</RelativeLayout>";
-        TestNode targetNode = TestNode.createFromXml(xml);
-        assertNotNull(targetNode);
-        TestNode button7 = TestNode.findById(targetNode, "@+id/button7");
-        TestNode checkBox = TestNode.findById(targetNode, "@+id/checkBox1");
-
-        INode layout = button7.getParent();
-        List<INode> deletedNodes = Arrays.<INode>asList(button7, checkBox);
-        List<INode> movedNodes = Collections.<INode>emptyList();
-        assertSame(layout, targetNode);
-        layout.removeChild(button7);
-        layout.removeChild(checkBox);
-
-        DeletionHandler handler = new DeletionHandler(deletedNodes, movedNodes, layout);
-        handler.updateConstraints();
-
-        String updated = TestNode.toXml(targetNode);
-        assertEquals(
-                "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" +
-                "<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n" +
-                "    xmlns:tools=\"http://schemas.android.com/tools\"\n" +
-                "    android:layout_width=\"match_parent\"\n" +
-                "    android:layout_height=\"match_parent\"\n" +
-                "    tools:ignore=\"HardcodedText\">\n" +
-                "\n" +
-                "    <Button\n" +
-                "        android:id=\"@+id/button1\"\n" +
-                "        android:layout_width=\"wrap_content\"\n" +
-                "        android:layout_height=\"wrap_content\"\n" +
-                "        android:layout_alignParentLeft=\"true\"\n" +
-                "        android:layout_alignParentTop=\"true\"\n" +
-                "        android:text=\"Above\">\n" +
-                "    </Button>\n" +
-                "\n" +
-                "    <Button\n" +
-                "        android:id=\"@+id/button2\"\n" +
-                "        android:layout_width=\"wrap_content\"\n" +
-                "        android:layout_height=\"wrap_content\"\n" +
-                "        android:layout_alignParentLeft=\"true\"\n" +
-                "        android:layout_below=\"@+id/button1\"\n" +
-                "        android:text=\"A\">\n" +
-                "    </Button>\n" +
-                "\n" +
-                "    <Button\n" +
-                "        android:id=\"@+id/button3\"\n" +
-                "        android:layout_width=\"wrap_content\"\n" +
-                "        android:layout_height=\"wrap_content\"\n" +
-                "        android:layout_alignBaseline=\"@+id/button2\"\n" +
-                "        android:layout_alignBottom=\"@+id/button2\"\n" +
-                "        android:layout_toRightOf=\"@+id/button2\"\n" +
-                "        android:text=\"B\">\n" +
-                "    </Button>\n" +
-                "\n" +
-                "    <Button\n" +
-                "        android:id=\"@+id/button4\"\n" +
-                "        android:layout_width=\"wrap_content\"\n" +
-                "        android:layout_height=\"wrap_content\"\n" +
-                "        android:layout_alignBottom=\"@+id/button3\"\n" +
-                "        android:layout_toRightOf=\"@+id/button3\"\n" +
-                "        android:text=\"C\">\n" +
-                "    </Button>\n" +
-                "\n" +
-                "    <Button\n" +
-                "        android:id=\"@+id/button5\"\n" +
-                "        android:layout_width=\"wrap_content\"\n" +
-                "        android:layout_height=\"wrap_content\"\n" +
-                "        android:layout_alignBaseline=\"@+id/button4\"\n" +
-                "        android:layout_alignBottom=\"@+id/button4\"\n" +
-                "        android:layout_toRightOf=\"@+id/button4\"\n" +
-                "        android:text=\"D\">\n" +
-                "    </Button>\n" +
-                "\n" +
-                "    <Button\n" +
-                "        android:id=\"@+id/button6\"\n" +
-                "        android:layout_width=\"wrap_content\"\n" +
-                "        android:layout_height=\"wrap_content\"\n" +
-                "        android:layout_alignBottom=\"@+id/button5\"\n" +
-                "        android:layout_toRightOf=\"@+id/button5\"\n" +
-                "        android:text=\"E\">\n" +
-                "    </Button>\n" +
-                "\n" +
-                "    <Button\n" +
-                "        android:id=\"@+id/button8\"\n" +
-                "        android:layout_width=\"wrap_content\"\n" +
-                "        android:layout_height=\"wrap_content\"\n" +
-                "        android:layout_alignLeft=\"@+id/button3\"\n" +
-                "        android:layout_below=\"@+id/button3\"\n" +
-                "        android:text=\"Button\">\n" +
-                "    </Button>\n" +
-                "\n" +
-                "</RelativeLayout>",
-                updated);
-        assertFalse(updated.contains(BaseViewRule.stripIdPrefix(button7.getStringAttr(ANDROID_URI,
-                ATTR_ID))));
-    }
-
-    public void testCenter() {
-        String xml =
-            "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" +
-            "<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n" +
-            "    xmlns:tools=\"http://schemas.android.com/tools\"\n" +
-            "    android:layout_width=\"match_parent\"\n" +
-            "    android:layout_height=\"match_parent\"\n" +
-            "    tools:ignore=\"HardcodedText\" >\n" +
-            "\n" +
-            "    <Button\n" +
-            "        android:id=\"@+id/button1\"\n" +
-            "        android:layout_width=\"wrap_content\"\n" +
-            "        android:layout_height=\"wrap_content\"\n" +
-            "        android:layout_centerInParent=\"true\"\n" +
-            "        android:text=\"Button\" />\n" +
-            "\n" +
-            "    <CheckBox\n" +
-            "        android:id=\"@+id/checkBox1\"\n" +
-            "        android:layout_width=\"wrap_content\"\n" +
-            "        android:layout_height=\"wrap_content\"\n" +
-            "        android:layout_below=\"@+id/button1\"\n" +
-            "        android:layout_toRightOf=\"@+id/button1\"\n" +
-            "        android:text=\"CheckBox\" />\n" +
-            "\n" +
-            "</RelativeLayout>";
-
-        TestNode targetNode = TestNode.createFromXml(xml);
-        assertNotNull(targetNode);
-        TestNode button1 = TestNode.findById(targetNode, "@+id/button1");
-
-        INode layout = button1.getParent();
-        List<INode> deletedNodes = Collections.<INode>singletonList(button1);
-        List<INode> movedNodes = Collections.<INode>emptyList();
-        assertSame(layout, targetNode);
-        layout.removeChild(button1);
-
-        DeletionHandler handler = new DeletionHandler(deletedNodes, movedNodes, layout);
-        handler.updateConstraints();
-
-        String updated = TestNode.toXml(targetNode);
-        assertEquals(
-                "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" +
-                "<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n" +
-                "    xmlns:tools=\"http://schemas.android.com/tools\"\n" +
-                "    android:layout_width=\"match_parent\"\n" +
-                "    android:layout_height=\"match_parent\"\n" +
-                "    tools:ignore=\"HardcodedText\">\n" +
-                "\n" +
-                "    <CheckBox\n" +
-                "        android:id=\"@+id/checkBox1\"\n" +
-                "        android:layout_width=\"wrap_content\"\n" +
-                "        android:layout_height=\"wrap_content\"\n" +
-                "        android:layout_centerInParent=\"true\"\n" +
-                "        android:text=\"CheckBox\">\n" +
-                "    </CheckBox>\n" +
-                "\n" +
-                "</RelativeLayout>",
-                updated);
-        assertFalse(updated.contains(BaseViewRule.stripIdPrefix(button1.getStringAttr(ANDROID_URI,
-                ATTR_ID))));
-
-    }
-
-    public void testMove() {
-        String xml = "" +
-            "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" +
-            "<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n" +
-            "    xmlns:tools=\"http://schemas.android.com/tools\"\n" +
-            "    android:layout_width=\"match_parent\"\n" +
-            "    android:layout_height=\"match_parent\"\n" +
-            "    tools:ignore=\"HardcodedText\" >\n" +
-            "\n" +
-            "    <Button\n" +
-            "        android:id=\"@+id/button1\"\n" +
-            "        android:layout_width=\"wrap_content\"\n" +
-            "        android:layout_height=\"wrap_content\"\n" +
-            "        android:layout_alignParentLeft=\"true\"\n" +
-            "        android:text=\"A\" />\n" +
-            "\n" +
-            "    <Button\n" +
-            "        android:id=\"@+id/button2\"\n" +
-            "        android:layout_width=\"wrap_content\"\n" +
-            "        android:layout_height=\"wrap_content\"\n" +
-            "        android:layout_alignBaseline=\"@+id/button1\"\n" +
-            "        android:layout_alignBottom=\"@+id/button1\"\n" +
-            "        android:layout_toRightOf=\"@+id/button1\"\n" +
-            "        android:text=\"B\" />\n" +
-            "\n" +
-            "    <Button\n" +
-            "        android:id=\"@+id/button3\"\n" +
-            "        android:layout_width=\"wrap_content\"\n" +
-            "        android:layout_height=\"wrap_content\"\n" +
-            "        android:layout_alignBottom=\"@+id/button2\"\n" +
-            "        android:layout_toRightOf=\"@+id/button2\"\n" +
-            "        android:text=\"C\" />\n" +
-            "\n" +
-            "</RelativeLayout>";
-        TestNode targetNode = TestNode.createFromXml(xml);
-        assertNotNull(targetNode);
-
-        TestNode button2 = TestNode.findById(targetNode, "@+id/button2");
-
-        INode layout = button2.getParent();
-        List<INode> deletedNodes = Collections.<INode>singletonList(button2);
-        List<INode> movedNodes = Collections.<INode>singletonList(button2);
-        assertSame(layout, targetNode);
-
-        DeletionHandler handler = new DeletionHandler(deletedNodes, movedNodes, layout);
-        handler.updateConstraints();
-
-        String updated = TestNode.toXml(targetNode);
-        assertEquals(
-                "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" +
-                "<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n" +
-                "    xmlns:tools=\"http://schemas.android.com/tools\"\n" +
-                "    android:layout_width=\"match_parent\"\n" +
-                "    android:layout_height=\"match_parent\"\n" +
-                "    tools:ignore=\"HardcodedText\">\n" +
-                "\n" +
-                "    <Button\n" +
-                "        android:id=\"@+id/button1\"\n" +
-                "        android:layout_width=\"wrap_content\"\n" +
-                "        android:layout_height=\"wrap_content\"\n" +
-                "        android:layout_alignParentLeft=\"true\"\n" +
-                "        android:text=\"A\">\n" +
-                "    </Button>\n" +
-                "\n" +
-                "    <Button\n" +
-                "        android:id=\"@+id/button2\"\n" +
-                "        android:layout_width=\"wrap_content\"\n" +
-                "        android:layout_height=\"wrap_content\"\n" +
-                "        android:layout_alignBaseline=\"@+id/button1\"\n" +
-                "        android:layout_alignBottom=\"@+id/button1\"\n" +
-                "        android:layout_toRightOf=\"@+id/button1\"\n" +
-                "        android:text=\"B\">\n" +
-                "    </Button>\n" +
-                "\n" +
-                "    <Button\n" +
-                "        android:id=\"@+id/button3\"\n" +
-                "        android:layout_width=\"wrap_content\"\n" +
-                "        android:layout_height=\"wrap_content\"\n" +
-                "        android:layout_alignBottom=\"@+id/button2\"\n" +
-                "        android:layout_toRightOf=\"@+id/button2\"\n" +
-                "        android:text=\"C\">\n" +
-                "    </Button>\n" +
-                "\n" +
-                "</RelativeLayout>",
-                updated);
-        assertTrue(updated.contains(BaseViewRule.stripIdPrefix(button2.getStringAttr(ANDROID_URI,
-                ATTR_ID))));
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/common/resources/platform/AttributeInfoTest.java b/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/common/resources/platform/AttributeInfoTest.java
deleted file mode 100644
index b562922..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/common/resources/platform/AttributeInfoTest.java
+++ /dev/null
@@ -1,382 +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.ide.common.resources.platform;
-
-import static com.android.SdkConstants.ANDROID_URI;
-import static com.android.SdkConstants.DOT_XML;
-
-import com.android.SdkConstants;
-import com.android.annotations.NonNull;
-import com.android.ide.common.api.IAttributeInfo.Format;
-import com.android.ide.common.resources.ResourceItem;
-import com.android.ide.common.resources.ResourceRepository;
-import com.android.ide.eclipse.adt.internal.editors.layout.gle2.DomUtilities;
-import com.android.ide.eclipse.mock.Mocks;
-import com.android.io.IAbstractFolder;
-import com.android.io.IAbstractResource;
-import com.android.resources.ResourceType;
-import com.android.utils.StdLogger;
-import com.google.common.base.Charsets;
-import com.google.common.collect.ArrayListMultimap;
-import com.google.common.collect.Multimap;
-import com.google.common.collect.Sets;
-import com.google.common.io.Files;
-
-import junit.framework.TestCase;
-
-import org.w3c.dom.Attr;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-import org.w3c.dom.NamedNodeMap;
-
-import java.io.File;
-import java.io.IOException;
-import java.util.Collection;
-import java.util.EnumSet;
-import java.util.Map;
-import java.util.Set;
-
-@SuppressWarnings("javadoc")
-public class AttributeInfoTest extends TestCase {
-    public void testSimple() throws Exception {
-        AttributeInfo info = new AttributeInfo("test", EnumSet.noneOf(Format.class));
-        assertTrue(info.isValid("", null, null));
-        assertTrue(info.isValid("a b c", null, null));
-        assertTrue(info.isValid("@android foo bar", null, null));
-    }
-
-    public void testIsValidString() throws Exception {
-        AttributeInfo info = new AttributeInfo("test", Format.STRING_SET);
-        assertTrue(info.isValid("", null, null));
-        assertTrue(info.isValid("a b c", null, null));
-        assertTrue(info.isValid("@android foo bar", null, null));
-    }
-
-    public void testIsValidBoolean() throws Exception {
-        AttributeInfo info = new AttributeInfo("test", Format.BOOLEAN_SET);
-        assertTrue(info.isValid("true", null, null));
-        assertTrue(info.isValid("false", null, null));
-        assertFalse(info.isValid("", null, null));
-        assertTrue(info.isValid("TRUE", null, null));
-        assertTrue(info.isValid("True", null, null));
-        assertTrue(info.isValid("FALSE", null, null));
-        assertTrue(info.isValid("False", null, null));
-    }
-
-    public void testIsValidInteger() throws Exception {
-        AttributeInfo info = new AttributeInfo("test", Format.INTEGER_SET);
-        assertTrue(info.isValid("0", null, null));
-        assertTrue(info.isValid("1", null, null));
-        assertTrue(info.isValid("10", null, null));
-        assertTrue(info.isValid("-10", null, null));
-        assertTrue(info.isValid(Integer.toString(Integer.MAX_VALUE), null, null));
-
-        assertFalse(info.isValid("", null, null));
-        assertFalse(info.isValid("a", null, null));
-        assertFalse(info.isValid("a1", null, null));
-        assertFalse(info.isValid("1a", null, null));
-        assertFalse(info.isValid("1.0", null, null));
-    }
-
-    public void testIsValidFloat() throws Exception {
-        AttributeInfo info = new AttributeInfo("test", Format.FLOAT_SET);
-        assertTrue(info.isValid("0", null, null));
-        assertTrue(info.isValid("1", null, null));
-        assertTrue(info.isValid("10", null, null));
-        assertTrue(info.isValid("-10", null, null));
-        assertTrue(info.isValid("-10.1234", null, null));
-        assertTrue(info.isValid(".1", null, null));
-        assertTrue(info.isValid("-.1", null, null));
-        assertTrue(info.isValid("1.5e22", null, null));
-        assertTrue(info.isValid(Integer.toString(Integer.MAX_VALUE), null, null));
-
-        assertFalse(info.isValid("", null, null));
-        assertFalse(info.isValid(".", null, null));
-        assertFalse(info.isValid("-.", null, null));
-        assertFalse(info.isValid("a", null, null));
-        assertFalse(info.isValid("a1", null, null));
-        assertFalse(info.isValid("1a", null, null));
-    }
-
-    public void testIsValidDimension() throws Exception {
-        AttributeInfo info = new AttributeInfo("test", Format.DIMENSION_SET);
-        assertTrue(info.isValid("0dp", null, null));
-        assertTrue(info.isValid("1dp", null, null));
-        assertTrue(info.isValid("10dip", null, null));
-        assertTrue(info.isValid("-10px", null, null));
-        assertTrue(info.isValid("-10.1234mm", null, null));
-        assertTrue(info.isValid("14sp", null, null));
-        assertTrue(info.isValid("72pt", null, null));
-
-        assertFalse(info.isValid("", null, null));
-        assertFalse(info.isValid("5", null, null));
-        assertFalse(info.isValid("50ps", null, null));
-        // Since we allow resources even when not specified in format, don't assert
-        // this:
-        //assertFalse(info.isValid("@dimen/foo"));
-    }
-
-    public void testIsValidColor() throws Exception {
-        AttributeInfo info = new AttributeInfo("test", Format.COLOR_SET);
-        assertTrue(info.isValid("#fff", null, null));
-        assertTrue(info.isValid("#ffffff", null, null));
-        assertTrue(info.isValid("#12345678", null, null));
-        assertTrue(info.isValid("#abcdef00", null, null));
-
-        assertFalse(info.isValid("", null, null));
-        assertFalse(info.isValid("#fffffffff", null, null));
-        assertFalse(info.isValid("red", null, null));
-        assertFalse(info.isValid("rgb(1,2,3)", null, null));
-    }
-
-    public void testIsValidFraction() throws Exception {
-        AttributeInfo info = new AttributeInfo("test", EnumSet.<Format>of(Format.FRACTION));
-        assertTrue(info.isValid("5%", null, null));
-        assertTrue(info.isValid("25%p", null, null));
-
-        // We don't validate fractions accurately yet
-        //assertFalse(info.isValid(""));
-        //assertFalse(info.isValid("50%%"));
-        //assertFalse(info.isValid("50"));
-        //assertFalse(info.isValid("-2%"));
-    }
-
-    public void testIsValidReference() throws Exception {
-        AttributeInfo info = new AttributeInfo("test", Format.REFERENCE_SET);
-        assertTrue(info.isValid("@android:string/foo", null, null));
-        assertTrue(info.isValid("@string/foo", null, null));
-        assertTrue(info.isValid("@dimen/foo", null, null));
-        assertTrue(info.isValid("@color/foo", null, null));
-        assertTrue(info.isValid("@animator/foo", null, null));
-        assertTrue(info.isValid("@anim/foo", null, null));
-        assertTrue(info.isValid("?android:attr/textAppearanceMedium", null, null));
-        assertTrue(info.isValid("?textAppearanceMedium", null, null));
-
-        assertFalse(info.isValid("", null, null));
-        assertFalse(info.isValid("foo", null, null));
-        assertFalse(info.isValid("3.4", null, null));
-    }
-
-    public void testIsValidEnum() throws Exception {
-        AttributeInfo info = new AttributeInfo("test", Format.ENUM_SET);
-        info.setEnumValues(new String[] { "wrap_content", "match_parent" });
-        assertTrue(info.isValid("wrap_content", null, null));
-        assertTrue(info.isValid("match_parent", null, null));
-        assertFalse(info.isValid("", null, null));
-        assertFalse(info.isValid("other", null, null));
-        assertFalse(info.isValid("50", null, null));
-    }
-
-    public void testIsValidFlag() throws Exception {
-        AttributeInfo info = new AttributeInfo("test", Format.FLAG_SET);
-        info.setFlagValues(new String[] { "left", "top", "right", "bottom" });
-        assertTrue(info.isValid("left", null, null));
-        assertTrue(info.isValid("top", null, null));
-        assertTrue(info.isValid("left|top", null, null));
-        assertTrue(info.isValid("", null, null));
-
-        assertFalse(info.isValid("other", null, null));
-        assertFalse(info.isValid("50", null, null));
-    }
-
-    public void testCombined1() throws Exception {
-        AttributeInfo info = new AttributeInfo("test", EnumSet.<Format>of(Format.INTEGER,
-                Format.REFERENCE));
-        assertTrue(info.isValid("1", null, null));
-        assertTrue(info.isValid("@dimen/foo", null, null));
-        assertFalse(info.isValid("foo", null, null));
-    }
-
-    public void testCombined2() throws Exception {
-        AttributeInfo info = new AttributeInfo("test", EnumSet.<Format>of(Format.COLOR,
-                Format.REFERENCE));
-        assertTrue(info.isValid("#ff00ff00", null, null));
-        assertTrue(info.isValid("@color/foo", null, null));
-        assertFalse(info.isValid("foo", null, null));
-    }
-
-    public void testCombined3() throws Exception {
-        AttributeInfo info = new AttributeInfo("test", EnumSet.<Format>of(Format.STRING,
-                Format.REFERENCE));
-        assertTrue(info.isValid("test", null, null));
-        assertTrue(info.isValid("@color/foo", null, null));
-    }
-
-    public void testCombined4() throws Exception {
-        AttributeInfo info = new AttributeInfo("test", EnumSet.<Format>of(Format.ENUM,
-                Format.DIMENSION));
-        info.setEnumValues(new String[] { "wrap_content", "match_parent" });
-        assertTrue(info.isValid("wrap_content", null, null));
-        assertTrue(info.isValid("match_parent", null, null));
-        assertTrue(info.isValid("50dp", null, null));
-        assertFalse(info.isValid("50", null, null));
-        assertFalse(info.isValid("test", null, null));
-    }
-
-    public void testResourcesExist() throws Exception {
-        IAbstractFolder folder = Mocks.createAbstractFolder(
-                SdkConstants.FD_RESOURCES, new IAbstractResource[0]);
-
-        AttributeInfo info = new AttributeInfo("test", Format.REFERENCE_SET);
-        TestResourceRepository projectResources = new TestResourceRepository(folder,false);
-        projectResources.addResource(ResourceType.STRING, "mystring");
-        projectResources.addResource(ResourceType.DIMEN, "mydimen");
-        TestResourceRepository frameworkResources = new TestResourceRepository(folder, true);
-        frameworkResources.addResource(ResourceType.LAYOUT, "mylayout");
-
-        assertTrue(info.isValid("@string/mystring", null, null));
-        assertTrue(info.isValid("@dimen/mydimen", null, null));
-        assertTrue(info.isValid("@android:layout/mylayout", null, null));
-        assertTrue(info.isValid("?android:attr/listPreferredItemHeigh", null, null));
-
-        assertTrue(info.isValid("@string/mystring", projectResources, frameworkResources));
-        assertTrue(info.isValid("@dimen/mydimen", projectResources, frameworkResources));
-        assertTrue(info.isValid("@android:layout/mylayout", projectResources, frameworkResources));
-
-        assertFalse(info.isValid("@android:string/mystring", projectResources,
-                frameworkResources));
-        assertFalse(info.isValid("@android:dimen/mydimen", projectResources, frameworkResources));
-        assertFalse(info.isValid("@layout/mylayout", projectResources, frameworkResources));
-        assertFalse(info.isValid("@layout/foo", projectResources, frameworkResources));
-        assertFalse(info.isValid("@anim/foo", projectResources, frameworkResources));
-        assertFalse(info.isValid("@android:anim/foo", projectResources, frameworkResources));
-    }
-
-    private class TestResourceRepository extends ResourceRepository {
-        private Multimap<ResourceType, String> mResources = ArrayListMultimap.create();
-
-        protected TestResourceRepository(IAbstractFolder resFolder, boolean isFrameworkRepository) {
-            super(resFolder, isFrameworkRepository);
-        }
-
-        void addResource(ResourceType type, String name) {
-            mResources.put(type, name);
-        }
-
-        @Override
-        @NonNull
-        protected ResourceItem createResourceItem(@NonNull String name) {
-            fail("Not used in test");
-            return null;
-        }
-
-        @Override
-        public boolean hasResourceItem(@NonNull ResourceType type, @NonNull String name) {
-            Collection<String> names = mResources.get(type);
-            if (names != null) {
-                return names.contains(name);
-            }
-
-            return false;
-        }
-    };
-
-
-    public void testIsValid() throws Exception {
-        // This test loads the full attrs.xml file and then processes a bunch of platform
-        // resource file and makes sure that they're all considered valid. This helps
-        // make sure that isValid() closely matches what aapt accepts.
-        String sdkPath = System.getenv("ADT_SDK_SOURCE_PATH");
-        assertNotNull("This test requires ADT_SDK_SOURCE_PATH to be set to point to the" +
-                "SDK git repository", sdkPath);
-        File sdk = new File(sdkPath);
-        assertNotNull("$ADT_SDK_SOURCE_PATH (" + sdk.getPath() + ") is not a directory",
-                sdk.isDirectory());
-        File git = sdk.getParentFile();
-        File attrsPath = new File(git, "frameworks" + File.separator + "base"
-                + File.separator + "core" + File.separator + "res" + File.separator + "res"
-                + File.separator + "values" + File.separator + "attrs.xml");
-        assertTrue(attrsPath.getPath(), attrsPath.exists());
-        AttrsXmlParser parser = new AttrsXmlParser(attrsPath.getPath(),
-                new StdLogger(StdLogger.Level.VERBOSE), 1100);
-        parser.preload();
-        Map<String, AttributeInfo> attributeMap = parser.getAttributeMap();
-        assertNotNull(attributeMap);
-        assertNotNull(attributeMap.get("layout_width"));
-        Set<String> seen = Sets.newHashSet();
-
-        checkDir(new File(git, "packages" + File.separator + "apps"), false, attributeMap, seen);
-    }
-
-    private void checkDir(File dir, boolean isResourceDir,
-            Map<String, AttributeInfo> map, Set<String> seen) throws IOException {
-        assertTrue(dir.isDirectory());
-        File[] list = dir.listFiles();
-        if (list != null) {
-            for (File file : list) {
-                if (isResourceDir && file.isFile() && file.getPath().endsWith(DOT_XML)) {
-                    checkXmlFile(file, map, seen);
-                } else if (file.isDirectory()) {
-                    checkDir(file, isResourceDir || file.getName().equals("res"), map, seen);
-                }
-            }
-        }
-    }
-
-    private void checkXmlFile(File file, Map<String, AttributeInfo> map,
-            Set<String> seen) throws IOException {
-        String xml = Files.toString(file, Charsets.UTF_8);
-        if (xml != null) {
-            //Document doc = DomUtilities.parseStructuredDocument(xml);
-            Document doc = DomUtilities.parseDocument(xml, false);
-            if (doc != null && doc.getDocumentElement() != null) {
-                checkElement(file, doc.getDocumentElement(), map, seen);
-            }
-        }
-    }
-
-    private void checkElement(File file, Element element, Map<String, AttributeInfo> map,
-            Set<String> seen) {
-        NamedNodeMap attributes = element.getAttributes();
-        for (int i = 0, n = attributes.getLength(); i < n; i++) {
-            Attr attribute = (Attr) attributes.item(i);
-
-            String uri = attribute.getNamespaceURI();
-            String name = attribute.getLocalName();
-            String value = attribute.getValue();
-            if (ANDROID_URI.equals(uri)) {
-                AttributeInfo info = map.get(name);
-                if (info == null) {
-                    System.out.println("Warning: Unknown attribute '" + name + "' in " + file);
-                            return;
-                }
-                if (!info.isValid(value, null, null)) {
-                    if (name.equals("duration") || name.equals("exitFadeDuration")) {
-                        // Already known
-                        return;
-                    }
-                    String message = "In file " +
-                            file.getPath() + ":\nCould not validate value \"" + value
-                            + "\" for attribute '"
-                            + name + "' where the attribute info has formats " + info.getFormats()
-                            + "\n";
-                    System.out.println("\n" + message);
-                    fail(message);
-                }
-                if ((value.startsWith("@") || value.startsWith("?")) &&
-                        !info.getFormats().contains(Format.REFERENCE)) {
-                    // Print out errors in attrs.xml
-
-                    if (!seen.contains(name)) {
-                        seen.add(name);
-                        System.out.println("\"" + name + "\" with formats " + info.getFormats()
-                                + " was passed a reference (" + value + ") in file " + file);
-                    }
-                }
-            }
-        }
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/common/resources/platform/AttrsXmlParserManifestTest.java b/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/common/resources/platform/AttrsXmlParserManifestTest.java
deleted file mode 100755
index 82d6aca..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/common/resources/platform/AttrsXmlParserManifestTest.java
+++ /dev/null
@@ -1,94 +0,0 @@
-/*
- * Copyright (C) 2010 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.platform;
-
-import com.android.ide.eclipse.mock.TestLogger;
-import com.android.ide.eclipse.tests.AdtTestData;
-
-import java.util.Arrays;
-import java.util.Map;
-import java.util.TreeMap;
-
-import junit.framework.TestCase;
-
-public class AttrsXmlParserManifestTest extends TestCase {
-
-    private AttrsXmlParser mParser;
-    private String mFilePath;
-
-    private static final String MOCK_DATA_PATH =
-        "com/android/ide/eclipse/testdata/mock_manifest_attrs.xml"; //$NON-NLS-1$
-
-    @Override
-    public void setUp() throws Exception {
-        mFilePath = AdtTestData.getInstance().getTestFilePath(MOCK_DATA_PATH);
-        mParser = new AttrsXmlParser(mFilePath, new TestLogger(), 100);
-    }
-
-    @Override
-    public void tearDown() throws Exception {
-    }
-
-    public void testGetOsAttrsXmlPath() throws Exception {
-        assertEquals(mFilePath, mParser.getOsAttrsXmlPath());
-    }
-
-    private Map<String, DeclareStyleableInfo> preloadAndGetStyleables() {
-        assertSame(mParser, mParser.preload());
-
-        Map<String, DeclareStyleableInfo> styleableList = mParser.getDeclareStyleableList();
-        // For testing purposes, we want the strings sorted
-        if (!(styleableList instanceof TreeMap<?, ?>)) {
-            styleableList = new TreeMap<String, DeclareStyleableInfo>(styleableList);
-        }
-        return styleableList;
-    }
-
-    public final void testPreload() throws Exception {
-        Map<String, DeclareStyleableInfo> styleableList = preloadAndGetStyleables();
-
-        assertEquals(
-                "[AndroidManifest, " +
-                "AndroidManifestActivityAlias, " +
-                "AndroidManifestApplication, " +
-                "AndroidManifestNewElement, " +
-                "AndroidManifestNewParent, " +
-                "AndroidManifestPermission" +
-                "]",
-                Arrays.toString(styleableList.keySet().toArray()));
-    }
-
-    /**
-     * Tests that AndroidManifestNewParentNewElement got renamed to AndroidManifestNewElement
-     * and a parent named AndroidManifestNewParent was automatically created.
-     */
-    public final void testNewParent() throws Exception {
-        Map<String, DeclareStyleableInfo> styleableList = preloadAndGetStyleables();
-
-        DeclareStyleableInfo newElement = styleableList.get("AndroidManifestNewElement");
-        assertNotNull(newElement);
-        assertEquals("AndroidManifestNewElement", newElement.getStyleName());
-        assertEquals("[AndroidManifestNewParent]",
-                     Arrays.toString(newElement.getParents()));
-
-        DeclareStyleableInfo newParent = styleableList.get("AndroidManifestNewParent");
-        assertNotNull(newParent);
-        assertEquals("[AndroidManifest]",
-                     Arrays.toString(newParent.getParents()));
-
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/common/resources/platform/AttrsXmlParserTest.java b/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/common/resources/platform/AttrsXmlParserTest.java
deleted file mode 100644
index 883577b..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/common/resources/platform/AttrsXmlParserTest.java
+++ /dev/null
@@ -1,120 +0,0 @@
-/*
- * 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.common.resources.platform;
-
-
-import com.android.ide.common.api.IAttributeInfo.Format;
-import com.android.ide.eclipse.mock.TestLogger;
-import com.android.ide.eclipse.tests.AdtTestData;
-
-import java.util.Map;
-
-import junit.framework.TestCase;
-
-public class AttrsXmlParserTest extends TestCase {
-
-    private AttrsXmlParser mParser;
-    private String mFilePath;
-
-    private static final String MOCK_DATA_PATH =
-        "com/android/ide/eclipse/testdata/mock_attrs.xml"; //$NON-NLS-1$
-
-    @Override
-    public void setUp() throws Exception {
-        mFilePath = AdtTestData.getInstance().getTestFilePath(MOCK_DATA_PATH);
-        mParser = new AttrsXmlParser(mFilePath, new TestLogger(), 100);
-    }
-
-    @Override
-    public void tearDown() throws Exception {
-    }
-
-    public void testGetOsAttrsXmlPath() throws Exception {
-        assertEquals(mFilePath, mParser.getOsAttrsXmlPath());
-    }
-
-    public final void testPreload() throws Exception {
-        assertSame(mParser, mParser.preload());
-    }
-
-
-    public final void testLoadViewAttributes() throws Exception {
-        mParser.preload();
-        ViewClassInfo info = new ViewClassInfo(
-                false /* isLayout */,
-                "mock_android.something.Theme",      //$NON-NLS-1$
-                "Theme");                            //$NON-NLS-1$
-        mParser.loadViewAttributes(info);
-
-        assertEquals("These are the standard attributes that make up a complete theme.", //$NON-NLS-1$
-                info.getJavaDoc());
-        AttributeInfo[] attrs = info.getAttributes();
-        assertEquals(1, attrs.length);
-        assertEquals("scrollbarSize", info.getAttributes()[0].getName());
-        assertEquals(1, info.getAttributes()[0].getFormats().size());
-        assertEquals(Format.DIMENSION, info.getAttributes()[0].getFormats().iterator().next());
-    }
-
-    public final void testEnumFlagValues() throws Exception {
-        /* The XML being read contains:
-            <!-- Standard orientation constant. -->
-            <attr name="orientation">
-                <!-- Defines an horizontal widget. -->
-                <enum name="horizontal" value="0" />
-                <!-- Defines a vertical widget. -->
-                <enum name="vertical" value="1" />
-            </attr>
-         */
-
-        mParser.preload();
-        Map<String, Map<String, Integer>> attrMap = mParser.getEnumFlagValues();
-        assertTrue(attrMap.containsKey("orientation"));
-
-        Map<String, Integer> valueMap = attrMap.get("orientation");
-        assertTrue(valueMap.containsKey("horizontal"));
-        assertTrue(valueMap.containsKey("vertical"));
-        assertEquals(Integer.valueOf(0), valueMap.get("horizontal"));
-        assertEquals(Integer.valueOf(1), valueMap.get("vertical"));
-    }
-
-    public final void testDeprecated() throws Exception {
-        mParser.preload();
-
-        DeclareStyleableInfo dep = mParser.getDeclareStyleableList().get("DeprecatedTest");
-        assertNotNull(dep);
-
-        AttributeInfo[] attrs = dep.getAttributes();
-        assertEquals(4, attrs.length);
-
-        assertEquals("deprecated-inline", attrs[0].getName());
-        assertEquals("In-line deprecated.", attrs[0].getDeprecatedDoc());
-        assertEquals("Deprecated comments using delimiters.", attrs[0].getJavaDoc());
-
-        assertEquals("deprecated-multiline", attrs[1].getName());
-        assertEquals("Multi-line version of deprecated that works till the next tag.",
-                attrs[1].getDeprecatedDoc());
-        assertEquals("Deprecated comments on their own line.", attrs[1].getJavaDoc());
-
-        assertEquals("deprecated-not", attrs[2].getName());
-        assertEquals(null, attrs[2].getDeprecatedDoc());
-        assertEquals("This attribute is not deprecated.", attrs[2].getJavaDoc());
-
-        assertEquals("deprecated-no-javadoc", attrs[3].getName());
-        assertEquals("There is no other javadoc here.", attrs[3].getDeprecatedDoc());
-        assertEquals("", attrs[3].getJavaDoc());
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/adt/AdtPluginTest.java b/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/adt/AdtPluginTest.java
deleted file mode 100644
index e198c6e..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/adt/AdtPluginTest.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Copyright (C) 2010 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;
-
-import java.io.File;
-import java.io.StringReader;
-
-import junit.framework.TestCase;
-
-public class AdtPluginTest extends TestCase {
-    public void testReaderContains() throws Exception {
-        String input = "this is a test";
-        assertFalse(AdtPlugin.streamContains(new StringReader(input), "hello"));
-        assertTrue(AdtPlugin.streamContains(new StringReader(input), "this"));
-        assertFalse(AdtPlugin.streamContains(new StringReader(input), "thiss"));
-        assertTrue(AdtPlugin.streamContains(new StringReader(input), "is a"));
-        assertTrue(AdtPlugin.streamContains(new StringReader("ABC ABCDAB ABCDABCDABDE"),
-                "ABCDABD"));
-        assertFalse(AdtPlugin.streamContains(new StringReader("ABC ABCDAB ABCDABCDABDE"),
-                "ABCEABD"));
-    }
-
-    public void testReadStream() throws Exception {
-        String input = "this is a test";
-        String contents = AdtPlugin.readFile(new StringReader(input));
-        assertEquals(input, contents);
-    }
-
-    public void testReadWriteFile() throws Exception {
-        File temp = File.createTempFile("test", ".txt");
-        String myContent = "this is\na test";
-        AdtPlugin.writeFile(temp, myContent);
-        String readBack = AdtPlugin.readFile(temp);
-        assertEquals(myContent, readBack);
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/adt/AdtUtilsTest.java b/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/adt/AdtUtilsTest.java
deleted file mode 100644
index c1e94ac..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/adt/AdtUtilsTest.java
+++ /dev/null
@@ -1,127 +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.eclipse.adt;
-
-import junit.framework.TestCase;
-
-import java.util.Locale;
-
-@SuppressWarnings("javadoc")
-public class AdtUtilsTest extends TestCase {
-    public void testExtractClassName() {
-        assertEquals("Foo", AdtUtils.extractClassName("foo"));
-        assertEquals("Foobar", AdtUtils.extractClassName("foo bar"));
-        assertEquals("JavasTypeSystem", AdtUtils.extractClassName("Java's Type System"));
-        assertEquals("Foo", AdtUtils.extractClassName("1foo "));
-    }
-
-    public void testStripAllExtensions() {
-        assertEquals("", AdtUtils.stripAllExtensions(""));
-        assertEquals("foobar", AdtUtils.stripAllExtensions("foobar"));
-        assertEquals("foobar", AdtUtils.stripAllExtensions("foobar.png"));
-        assertEquals("foobar", AdtUtils.stripAllExtensions("foobar.9.png"));
-        assertEquals(".profile", AdtUtils.stripAllExtensions(".profile"));
-    }
-
-    public void testStripLastExtension() {
-        assertEquals("", AdtUtils.stripLastExtension(""));
-        assertEquals("foobar", AdtUtils.stripLastExtension("foobar"));
-        assertEquals("foobar", AdtUtils.stripLastExtension("foobar.png"));
-        assertEquals("foobar.9", AdtUtils.stripLastExtension("foobar.9.png"));
-        assertEquals(".profile", AdtUtils.stripLastExtension(".profile"));
-    }
-
-    public void testCapitalize() {
-        assertEquals("UPPER", AdtUtils.capitalize("UPPER"));
-        assertEquals("Lower", AdtUtils.capitalize("lower"));
-        assertEquals("Capital", AdtUtils.capitalize("Capital"));
-        assertEquals("CamelCase", AdtUtils.capitalize("camelCase"));
-        assertEquals("", AdtUtils.capitalize(""));
-        assertSame("Foo", AdtUtils.capitalize("Foo"));
-        assertNull(null, AdtUtils.capitalize(null));
-    }
-
-    public void testCamelCaseToUnderlines() {
-        assertEquals("", AdtUtils.camelCaseToUnderlines(""));
-        assertEquals("foo", AdtUtils.camelCaseToUnderlines("foo"));
-        assertEquals("foo", AdtUtils.camelCaseToUnderlines("Foo"));
-        assertEquals("foo_bar", AdtUtils.camelCaseToUnderlines("FooBar"));
-        assertEquals("test_xml", AdtUtils.camelCaseToUnderlines("testXML"));
-        assertEquals("test_foo", AdtUtils.camelCaseToUnderlines("testFoo"));
-    }
-
-    public void testUnderlinesToCamelCase() {
-        assertEquals("", AdtUtils.underlinesToCamelCase(""));
-        assertEquals("", AdtUtils.underlinesToCamelCase("_"));
-        assertEquals("Foo", AdtUtils.underlinesToCamelCase("foo"));
-        assertEquals("FooBar", AdtUtils.underlinesToCamelCase("foo_bar"));
-        assertEquals("FooBar", AdtUtils.underlinesToCamelCase("foo__bar"));
-        assertEquals("Foo", AdtUtils.underlinesToCamelCase("foo_"));
-    }
-
-    public void testStripSuffix() {
-        assertEquals("Foo", AdtUtils.stripSuffix("Foo", ""));
-        assertEquals("Fo", AdtUtils.stripSuffix("Foo", "o"));
-        assertEquals("F", AdtUtils.stripSuffix("Fo", "o"));
-        assertEquals("", AdtUtils.stripSuffix("Foo", "Foo"));
-        assertEquals("LinearLayout_Layout",
-                AdtUtils.stripSuffix("LinearLayout_LayoutParams", "Params"));
-        assertEquals("Foo", AdtUtils.stripSuffix("Foo", "Bar"));
-    }
-
-    public void testFormatFloatValue() throws Exception {
-        assertEquals("1", AdtUtils.formatFloatAttribute(1.0f));
-        assertEquals("2", AdtUtils.formatFloatAttribute(2.0f));
-        assertEquals("1.50", AdtUtils.formatFloatAttribute(1.5f));
-        assertEquals("1.50", AdtUtils.formatFloatAttribute(1.50f));
-        assertEquals("1.51", AdtUtils.formatFloatAttribute(1.51f));
-        assertEquals("1.51", AdtUtils.formatFloatAttribute(1.514542f));
-        assertEquals("1.52", AdtUtils.formatFloatAttribute(1.516542f));
-        assertEquals("-1.51", AdtUtils.formatFloatAttribute(-1.51f));
-        assertEquals("-1", AdtUtils.formatFloatAttribute(-1f));
-    }
-
-    public void testFormatFloatValueLocale() throws Exception {
-        // Ensure that the layout float values aren't affected by
-        // locale settings, like using commas instead of of periods
-        Locale originalDefaultLocale = Locale.getDefault();
-
-        try {
-            Locale.setDefault(Locale.FRENCH);
-
-            // Ensure that this is a locale which uses a comma instead of a period:
-            assertEquals("5,24", String.format("%.2f", 5.236f));
-
-            // Ensure that the formatFloatAttribute is immune
-            assertEquals("1.50", AdtUtils.formatFloatAttribute(1.5f));
-        } finally {
-            Locale.setDefault(originalDefaultLocale);
-        }
-    }
-
-    public void testEscapeUnicodeChars() throws Exception {
-        assertEquals("", AdtUtils.replaceUnicodeEscapes(""));
-        assertEquals("foo bar", AdtUtils.replaceUnicodeEscapes("foo bar"));
-        assertEquals("\u25C0", AdtUtils.replaceUnicodeEscapes("\\u25C0"));
-        assertEquals("!\u25C0\u25C1!", AdtUtils.replaceUnicodeEscapes("!\\u25C0\\u25C1!"));
-        assertEquals("\u1234\\", AdtUtils.replaceUnicodeEscapes("\\u1234\\"));
-
-        assertEquals("\\U25C0", AdtUtils.replaceUnicodeEscapes("\\U25C0")); // no unicode expand
-        assertEquals("\\u25C", AdtUtils.replaceUnicodeEscapes("\\u25C")); // no unicode expand
-        assertEquals("\\\\u25C0", AdtUtils.replaceUnicodeEscapes("\\\\u25C0")); // escaped
-        assertEquals("\\u123\\", AdtUtils.replaceUnicodeEscapes("\\u123\\")); // broken
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/adt/internal/build/BaseBuilderTest.java b/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/adt/internal/build/BaseBuilderTest.java
deleted file mode 100644
index a1d658b..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/adt/internal/build/BaseBuilderTest.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Copyright (C) 2007 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.build;
-
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-import junit.framework.TestCase;
-
-public class BaseBuilderTest extends TestCase {
-
-    public void testParseAaptOutput() {
-        Pattern p = Pattern.compile( "^(.+):(\\d+):\\s(.+)$"); //$NON-NLS-1$
-        String s = "C:\\java\\workspace-android\\AndroidApp\\res\\values\\strings.xml:11: WARNING: empty 'some warning text";
-
-        Matcher m = p.matcher(s);
-        assertEquals(true, m.matches());
-        assertEquals("C:\\java\\workspace-android\\AndroidApp\\res\\values\\strings.xml", m.group(1));
-        assertEquals("11", m.group(2));
-        assertEquals("WARNING: empty 'some warning text", m.group(3));
-    }
-
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/adt/internal/editors/AndroidDoubleClickStrategyTest.java b/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/adt/internal/editors/AndroidDoubleClickStrategyTest.java
deleted file mode 100644
index 3c0805a..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/adt/internal/editors/AndroidDoubleClickStrategyTest.java
+++ /dev/null
@@ -1,71 +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.ide.eclipse.adt.internal.editors;
-
-import org.eclipse.swt.graphics.Point;
-
-import junit.framework.TestCase;
-
-@SuppressWarnings("javadoc")
-public class AndroidDoubleClickStrategyTest extends TestCase {
-    public void test_getWord_plain() throws Exception {
-        checkWord("^foo", "[foo]");
-        checkWord("'fo^o'", "'[foo]'");
-        checkWord("\"foo^\"", "\"[foo]\"");
-    }
-
-    public void test_getWord_resources() throws Exception {
-        checkWord("'@and^roid:string/ok'", "'[@android:string/ok]'");
-        checkWord("'@android^:string/ok'", "'[@android:string/ok]'");
-        checkWord("'^@android:string/ok'", "'[@android:string/ok]'");
-        checkWord("'@android:^string/ok'", "'[@android:string/ok]'");
-        checkWord("'@android:string^/ok'", "'[@android:string/ok]'");
-        checkWord("'@android:string/^ok'", "'@android:string/[ok]'");
-        checkWord("'@android:string/o^k'", "'@android:string/[ok]'");
-        checkWord("'@android:string/ok^'", "'@android:string/[ok]'");
-        checkWord("'@string/ok^'", "'@string/[ok]'");
-        checkWord("'@str^ing/ok'", "'[@string/ok]'");
-    }
-
-    public void test_getWord_classnames() throws Exception {
-        checkWord("\"co^m.example.templatetest1\"", "\"[com.example.templatetest1]\"");
-        checkWord("\"com.exam^ple.templatetest1\"", "\"[com.example.templatetest1]\"");
-        checkWord("\"com.example^.templatetest1\"", "\"[com.example.templatetest1]\"");
-        checkWord("\"com.example.templat^etest1\"", "\"com.example.[templatetest1]\"");
-        checkWord("\"com.example.^templatetest1\"", "\"com.example.[templatetest1]\"");
-        checkWord("\"com.example.templatetest1^\"", "\"com.example.[templatetest1]\"");
-        checkWord("\"...^\"", "\"[...]\"");
-        checkWord("\"..^.\"", "\"[...]\"");
-    }
-
-    private void checkWord(String before, String expected) throws Exception {
-        AndroidDoubleClickStrategy strategy = new AndroidDoubleClickStrategy();
-        int cursor = before.indexOf('^');
-        assertTrue("Must set cursor position with ^ in " + before, cursor != -1);
-        before = before.substring(0, cursor) + before.substring(cursor + 1);
-        assertEquals(-1, before.indexOf('^'));
-        assertEquals(-1, before.indexOf('['));
-        assertEquals(-1, before.indexOf(']'));
-
-        Point positions = strategy.getWord(before, cursor);
-        assertNotNull(positions);
-        assertTrue(positions.y >= positions.x);
-        String after = before.substring(0, positions.x) + '[' +
-                before.substring(positions.x, positions.y) + ']' +
-                before.substring(positions.y);
-        assertEquals(expected, after);
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/adt/internal/editors/descriptors/DescriptorsUtilsTest.java b/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/adt/internal/editors/descriptors/DescriptorsUtilsTest.java
deleted file mode 100644
index 03db189..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/adt/internal/editors/descriptors/DescriptorsUtilsTest.java
+++ /dev/null
@@ -1,297 +0,0 @@
-/*
- * 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.editors.descriptors;
-
-import com.android.ide.eclipse.adt.internal.editors.layout.descriptors.ViewElementDescriptor;
-import com.android.ide.eclipse.adt.internal.editors.uimodel.UiDocumentNode;
-import com.android.ide.eclipse.adt.internal.editors.uimodel.UiElementNode;
-
-import junit.framework.TestCase;
-
-/**
- * Unit tests for DescriptorsUtils in the editors plugin
- */
-@SuppressWarnings("javadoc")
-public class DescriptorsUtilsTest extends TestCase {
-
-    @Override
-    protected void setUp() throws Exception {
-        super.setUp();
-    }
-
-    @Override
-    protected void tearDown() throws Exception {
-        super.tearDown();
-    }
-
-    public void testPrettyAttributeUiName() {
-        assertEquals("", DescriptorsUtils.prettyAttributeUiName(""));
-
-        assertEquals("Max width for view",
-                DescriptorsUtils.prettyAttributeUiName("maxWidthForView"));
-
-        assertEquals("Layout width",
-                DescriptorsUtils.prettyAttributeUiName("layout_width"));
-
-        // X Y and Z are capitalized when used as single words (so "T" becomes "t")
-        assertEquals("Axis X", DescriptorsUtils.prettyAttributeUiName("axisX"));
-        assertEquals("Axis Y", DescriptorsUtils.prettyAttributeUiName("axisY"));
-        assertEquals("Axis Z", DescriptorsUtils.prettyAttributeUiName("axisZ"));
-        assertEquals("Axis t", DescriptorsUtils.prettyAttributeUiName("axisT"));
-
-        assertEquals("The X axis", DescriptorsUtils.prettyAttributeUiName("theXAxis"));
-        assertEquals("The Y axis", DescriptorsUtils.prettyAttributeUiName("theYAxis"));
-        assertEquals("The Z axis", DescriptorsUtils.prettyAttributeUiName("theZAxis"));
-        assertEquals("The t axis", DescriptorsUtils.prettyAttributeUiName("theTAxis"));
-
-        // Special cases for "uri" and "sdk" etc
-        assertEquals("Grant URI permission",
-                DescriptorsUtils.prettyAttributeUiName("grantUriPermission"));
-        assertEquals("URI permission",
-                DescriptorsUtils.prettyAttributeUiName("uriPermission"));
-        assertEquals("Min SDK version", DescriptorsUtils.prettyAttributeUiName("minSdkVersion"));
-        assertEquals("SDK version", DescriptorsUtils.prettyAttributeUiName("sdkVersion"));
-        assertEquals("IME action method",
-                DescriptorsUtils.prettyAttributeUiName("imeActionMethod"));
-        assertEquals("VM safe mode", DescriptorsUtils.prettyAttributeUiName("vmSafeMode"));
-        assertEquals("UI options", DescriptorsUtils.prettyAttributeUiName("uiOptions"));
-    }
-
-    public void testCapitalize() {
-        assertEquals("", DescriptorsUtils.capitalize(""));
-
-        assertEquals("Max Width For View",
-                DescriptorsUtils.capitalize("maxWidthForView"));
-
-        assertEquals("Layout Width",
-                DescriptorsUtils.capitalize("layout_width"));
-
-        assertEquals("Axis X", DescriptorsUtils.capitalize("axisX"));
-        assertEquals("Axis Y", DescriptorsUtils.capitalize("axisY"));
-        assertEquals("Axis Z", DescriptorsUtils.capitalize("axisZ"));
-        assertEquals("Axis T", DescriptorsUtils.capitalize("axisT"));
-
-        assertEquals("The X Axis", DescriptorsUtils.capitalize("theXAxis"));
-        assertEquals("The Y Axis", DescriptorsUtils.capitalize("theYAxis"));
-        assertEquals("The Z Axis", DescriptorsUtils.capitalize("theZAxis"));
-        assertEquals("The T Axis", DescriptorsUtils.capitalize("theTAxis"));
-
-        // Special cases for "uri" and "sdk" etc
-        assertEquals("Grant URI Permission", DescriptorsUtils.capitalize("grantUriPermission"));
-        assertEquals("Min SDK Version", DescriptorsUtils.capitalize("minSdkVersion"));
-        assertEquals("IME Action Method", DescriptorsUtils.capitalize("imeActionMethod"));
-        assertEquals("URI Permission", DescriptorsUtils.capitalize("uriPermission"));
-        assertEquals("SDK Version", DescriptorsUtils.capitalize("sdkVersion"));
-        assertEquals("Grant IME", DescriptorsUtils.capitalize("GrantIme"));
-        assertEquals("VM Safe Mode", DescriptorsUtils.capitalize("vmSafeMode"));
-        assertEquals("UI Options", DescriptorsUtils.capitalize("uiOptions"));
-    }
-
-    public void testFormatTooltip() {
-        assertEquals("", DescriptorsUtils.formatTooltip(""));
-
-        assertEquals("\"application\"",
-                DescriptorsUtils.formatTooltip(
-                        "<code>application</code>"));
-
-        assertEquals("android.content.Intent",
-                DescriptorsUtils.formatTooltip(
-                        "{@link android.content.Intent}"));
-
-        assertEquals("FLAG_ACTIVITY_SINGLE_TOP",
-                DescriptorsUtils.formatTooltip(
-                        "{@link android.content.Intent#FLAG_ACTIVITY_SINGLE_TOP}"));
-
-        assertEquals("activity-alias",
-                DescriptorsUtils.formatTooltip(
-                        "{@link \t  #AndroidManifestActivityAlias  \tactivity-alias }"));
-
-        assertEquals("\"permission\"",
-                DescriptorsUtils.formatTooltip(
-                        "{@link #AndroidManifestPermission &lt;permission&gt;}"));
-
-        assertEquals("and etc.",
-                DescriptorsUtils.formatTooltip(
-                        "{@link #IntentCategory <category> and etc. }"));
-
-        assertEquals("Activity.onNewIntent()",
-                DescriptorsUtils.formatTooltip(
-                        "{@link android.app.Activity#onNewIntent Activity.onNewIntent()}"));
-    }
-
-    public void testFormatFormText() {
-        ElementDescriptor desc = new ElementDescriptor("application");
-        desc.setSdkUrl(DescriptorsUtils.MANIFEST_SDK_URL + "TagApplication");
-        String docBaseUrl = "http://base";
-        assertEquals("<form><li style=\"image\" value=\"image\"></li></form>", DescriptorsUtils.formatFormText("", desc, docBaseUrl));
-
-        assertEquals("<form><li style=\"image\" value=\"image\"><a href=\"http://base/reference/android/R.styleable.html#TagApplication\">application</a></li></form>",
-                DescriptorsUtils.formatFormText(
-                        "<code>application</code>",
-                        desc, docBaseUrl));
-
-        assertEquals("<form><li style=\"image\" value=\"image\"><b>android.content.Intent</b></li></form>",
-                DescriptorsUtils.formatFormText(
-                        "{@link android.content.Intent}",
-                        desc, docBaseUrl));
-
-        assertEquals("<form><li style=\"image\" value=\"image\"><a href=\"http://base/reference/android/R.styleable.html#AndroidManifestPermission\">AndroidManifestPermission</a></li></form>",
-                DescriptorsUtils.formatFormText(
-                        "{@link #AndroidManifestPermission}",
-                        desc, docBaseUrl));
-
-        assertEquals("<form><li style=\"image\" value=\"image\"><a href=\"http://base/reference/android/R.styleable.html#AndroidManifestPermission\">\"permission\"</a></li></form>",
-                DescriptorsUtils.formatFormText(
-                        "{@link #AndroidManifestPermission &lt;permission&gt;}",
-                        desc, docBaseUrl));
-    }
-
-    public void testGetFreeWidgetId() throws Exception {
-        DocumentDescriptor documentDescriptor =
-            new DocumentDescriptor("layout_doc", null); //$NON-NLS-1$
-        UiDocumentNode model = new UiDocumentNode(documentDescriptor);
-        UiElementNode uiRoot = model.getUiRoot();
-
-        assertEquals("@+id/button1", DescriptorsUtils.getFreeWidgetId(uiRoot, "Button"));
-        assertEquals("@+id/linearLayout1",
-                DescriptorsUtils.getFreeWidgetId(uiRoot, "LinearLayout"));
-    }
-
-    public void testNeedsDefaultId() throws Exception {
-        assertTrue(DescriptorsUtils.needsDefaultId(new ElementDescriptor("Button")));
-        assertTrue(DescriptorsUtils.needsDefaultId(new ElementDescriptor("EditText")));
-        assertTrue(DescriptorsUtils.needsDefaultId(new ElementDescriptor("TextView")));
-
-        assertFalse(DescriptorsUtils.needsDefaultId(new ElementDescriptor("LinearLayout")));
-        assertFalse(DescriptorsUtils.needsDefaultId(new ElementDescriptor("GridLayout")));
-        assertFalse(DescriptorsUtils.needsDefaultId(new ElementDescriptor("RelativeLayout")));
-        assertFalse(DescriptorsUtils.needsDefaultId(new ElementDescriptor("include")));
-        assertFalse(DescriptorsUtils.needsDefaultId(new ElementDescriptor("merge")));
-        assertFalse(DescriptorsUtils.needsDefaultId(new ElementDescriptor("fragment")));
-        assertFalse(DescriptorsUtils.needsDefaultId(new ElementDescriptor("Space")));
-    }
-
-    private static ViewElementDescriptor createDesc(String name, String fqn, boolean hasChildren) {
-        if (hasChildren) {
-            return new ViewElementDescriptor(name, name, fqn, "", "", new AttributeDescriptor[0],
-                    new AttributeDescriptor[0], new ElementDescriptor[1], false);
-        } else {
-            return new ViewElementDescriptor(name, fqn);
-        }
-    }
-
-    public void testCanInsertChildren() throws Exception {
-        assertFalse(DescriptorsUtils.canInsertChildren(createDesc("android:Button",
-                "android.widget.Button", false), null));
-        assertTrue(DescriptorsUtils.canInsertChildren(createDesc("android:LinearLayout",
-                "android.view.LinearLayout", true), null));
-        assertFalse(DescriptorsUtils.canInsertChildren(createDesc("android:ListView",
-                "android.widget.ListView", true), null));
-        assertFalse(DescriptorsUtils.canInsertChildren(createDesc("android:ExpandableListView",
-                "android.widget.ExpandableListView", true), null));
-        assertFalse(DescriptorsUtils.canInsertChildren(createDesc("android:Gallery",
-                "android.widget.Gallery", true), null));
-        assertFalse(DescriptorsUtils.canInsertChildren(createDesc("android:GridView",
-                "android.widget.GridView", true), null));
-
-        // This isn't the Android one (missing android: namespace prefix):
-        // This test is disabled since I had to remove the namespace enforcement
-        // (see namespace-related comment in canInsertChildren)
-        //assertTrue(DescriptorsUtils.canInsertChildren(createDesc("mynamespace:ListView",
-        //        "android.widget.ListView", true), null));
-
-        // Custom view without known view object
-        assertTrue(DescriptorsUtils.canInsertChildren(createDesc("MyView",
-                "foo.bar.MyView", true), null));
-
-        // Custom view with known view object that extends AdapterView
-        Object view = new MyClassLoader().findClass("foo.bar.MyView").newInstance();
-        assertFalse(DescriptorsUtils.canInsertChildren(createDesc("MyView",
-                "foo.bar.MyView", true), view));
-    }
-
-    /** Test class loader which finds foo.bar.MyView extends android.widget.AdapterView */
-    private static class MyClassLoader extends ClassLoader {
-        public MyClassLoader() {
-            super(null);
-        }
-
-        @Override
-        protected Class<?> findClass(String name) throws ClassNotFoundException {
-            if (name.equals("foo.bar.MyView")) {
-                // Simple class stub compiled by javac and dumped as bytes:
-                //package foo.bar;
-                //public class MyView extends android.widget.AdapterView {
-                //    public MyView() {
-                //        super(null);
-                //    }
-                //}
-                byte[] classData = new byte[] {
-                        -54,-2,-70,-66,0,0,0,49,0,17,10,0,3,0,13,7,0,14,7,0,15,1,0,6,60,105,110,
-                        105,116,62,1,0,3,40,41,86,1,0,4,67,111,100,101,1,0,15,76,105,110,101,78,
-                        117,109,98,101,114,84,97,98,108,101,1,0,18,76,111,99,97,108,86,97,114,
-                        105,97,98,108,101,84,97,98,108,101,1,0,4,116,104,105,115,1,0,16,76,102,
-                        111,111,47,98,97,114,47,77,121,86,105,101,119,59,1,0,10,83,111,117,114,
-                        99,101,70,105,108,101,1,0,11,77,121,86,105,101,119,46,106,97,118,97,12,
-                        0,4,0,16,1,0,14,102,111,111,47,98,97,114,47,77,121,86,105,101,119,1,0,
-                        26,97,110,100,114,111,105,100,47,119,105,100,103,101,116,47,65,100,97,
-                        112,116,101,114,86,105,101,119,1,0,28,40,76,97,110,100,114,111,105,100,
-                        47,99,111,110,116,101,110,116,47,67,111,110,116,101,120,116,59,41,86,0,
-                        33,0,2,0,3,0,0,0,0,0,1,0,1,0,4,0,5,0,1,0,6,0,0,0,52,0,2,0,1,0,0,0,6,42,
-                        1,-73,0,1,-79,0,0,0,2,0,7,0,0,0,10,0,2,0,0,0,9,0,5,0,10,0,8,0,0,0,12,0,
-                        1,0,0,0,6,0,9,0,10,0,0,0,1,0,11,0,0,0,2,0,12
-                };
-                return defineClass("foo.bar.MyView", classData, 0, classData.length);
-            }
-            if (name.equals("android.widget.AdapterView")) {
-                // Simple class stub compiled by javac and dumped as bytes:
-                //package android.widget;
-                //public class AdapterView {
-                //    public AdapterView(android.content.Context context) { }
-                //}
-                byte[] classData = new byte[] {
-                        -54,-2,-70,-66,0,0,0,49,0,19,10,0,3,0,15,7,0,16,7,0,17,1,0,6,60,105,110,
-                        105,116,62,1,0,28,40,76,97,110,100,114,111,105,100,47,99,111,110,116,101,
-                        110,116,47,67,111,110,116,101,120,116,59,41,86,1,0,4,67,111,100,101,1,0,
-                        15,76,105,110,101,78,117,109,98,101,114,84,97,98,108,101,1,0,18,76,111,
-                        99,97,108,86,97,114,105,97,98,108,101,84,97,98,108,101,1,0,4,116,104,105,
-                        115,1,0,28,76,97,110,100,114,111,105,100,47,119,105,100,103,101,116,47,
-                        65,100,97,112,116,101,114,86,105,101,119,59,1,0,7,99,111,110,116,101,120,
-                        116,1,0,25,76,97,110,100,114,111,105,100,47,99,111,110,116,101,110,116,
-                        47,67,111,110,116,101,120,116,59,1,0,10,83,111,117,114,99,101,70,105,108,
-                        101,1,0,16,65,100,97,112,116,101,114,86,105,101,119,46,106,97,118,97,12,
-                        0,4,0,18,1,0,26,97,110,100,114,111,105,100,47,119,105,100,103,101,116,
-                        47,65,100,97,112,116,101,114,86,105,101,119,1,0,16,106,97,118,97,47,108,
-                        97,110,103,47,79,98,106,101,99,116,1,0,3,40,41,86,0,33,0,2,0,3,0,0,0,0,0,
-                        1,0,1,0,4,0,5,0,1,0,6,0,0,0,57,0,1,0,2,0,0,0,5,42,-73,0,1,-79,0,0,0,2,0,
-                        7,0,0,0,6,0,1,0,0,0,8,0,8,0,0,0,22,0,2,0,0,0,5,0,9,0,10,0,0,0,0,0,5,0,11,
-                        0,12,0,1,0,1,0,13,0,0,0,2,0,14
-                };
-                return defineClass("android.widget.AdapterView", classData, 0, classData.length);
-            }
-
-            return super.findClass(name);
-        }
-    }
-
-    public void testGetBasename() {
-        assertEquals("Foo", DescriptorsUtils.getBasename("Foo"));
-        assertEquals("Foo", DescriptorsUtils.getBasename("foo.Foo"));
-        assertEquals("String", DescriptorsUtils.getBasename("java.util.String"));
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/adt/internal/editors/draw9patch/graphics/GraphicsUtilitiesTest.java b/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/adt/internal/editors/draw9patch/graphics/GraphicsUtilitiesTest.java
deleted file mode 100644
index 4f00097..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/adt/internal/editors/draw9patch/graphics/GraphicsUtilitiesTest.java
+++ /dev/null
@@ -1,313 +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.eclipse.adt.internal.editors.draw9patch.graphics;
-
-import java.util.Arrays;
-
-import junit.framework.TestCase;
-
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.graphics.ImageData;
-import org.eclipse.swt.widgets.Display;
-
-public class GraphicsUtilitiesTest extends TestCase {
-    private static final int MASK_ALPHA = 0xFF000000;
-
-    private static final String DIR = "/com/android/ide/eclipse/testdata/draw9patch/";
-
-    public void testConvertToNinePatchNull() throws Exception {
-        ImageData result = GraphicsUtilities.convertToNinePatch(null);
-        assertNull(result);
-    }
-
-    public void testConvertToNinePatch() throws Exception {
-        String fileName = DIR + "no-patched.png";
-        Image image = new Image(Display.getDefault(),
-                getClass().getResourceAsStream(fileName));
-        ImageData baseData = image.getImageData();
-
-        ImageData result = GraphicsUtilities.convertToNinePatch(baseData);
-
-        assertEquals(baseData.width + 2, result.width);
-        assertEquals(baseData.height + 2, result.height);
-
-        // horizontal
-        for (int x = 0; x < result.width; x++) {
-
-            // top row
-            assertEquals(0x0, result.getPixel(x, 0) & MASK_ALPHA);
-
-            // bottom row
-            assertEquals(0x0, result.getPixel(x, result.height - 1) & MASK_ALPHA);
-        }
-
-        // vertical
-        for (int y = 0; y < result.height; y++) {
-
-            // left column
-            assertEquals(0x0, result.getPixel(0, y) & MASK_ALPHA);
-
-            // right column
-            assertEquals(0x0, result.getPixel(result.width - 1, y) & MASK_ALPHA);
-        }
-    }
-
-    public void testClearImageDataNull() throws Exception {
-        try {
-            GraphicsUtilities.clearImageData(null);
-            fail();
-        } catch (IllegalArgumentException e) {
-        }
-    }
-
-    public void testClearImageData() throws Exception {
-        String fileName = DIR + "no-patched.png";
-        Image image = new Image(Display.getDefault(),
-                getClass().getResourceAsStream(fileName));
-
-        ImageData baseData = image.getImageData();
-        GraphicsUtilities.clearImageData(baseData);
-        for (int y = 0; y < baseData.height; y++) {
-            for (int x = 0; x < baseData.width; x++) {
-                assertEquals(0x000000, baseData.getPixel(x, y));
-                assertEquals(0x00, baseData.getAlpha(x, y));
-            }
-        }
-
-    }
-
-    public void testCopyNull() throws Exception {
-        ImageData result = GraphicsUtilities.copy(null);
-        assertNull(result);
-    }
-
-    public void testCopy() throws Exception {
-        String fileName = DIR + "no-patched.png";
-        Image image = new Image(Display.getDefault(),
-                getClass().getResourceAsStream(fileName));
-
-        ImageData baseData = image.getImageData();
-        ImageData copiedData = GraphicsUtilities.copy(baseData);
-
-        assertEquals(baseData.width, copiedData.width);
-        assertEquals(baseData.height, copiedData.height);
-        assertEquals(baseData.depth, copiedData.depth);
-        assertEquals(baseData.transparentPixel, copiedData.transparentPixel);
-        assertEquals(baseData.alpha, copiedData.alpha);
-        assertTrue(baseData.palette.equals(copiedData.palette));
-
-        final int[] baseColors = new int[baseData.width];
-        final byte[] baseAlpha = new byte[baseData.width];
-
-        final int[] copiedColors = new int[copiedData.width];
-        final byte[] copiedAlpha = new byte[copiedData.width];
-
-        for (int y = 0; y < baseData.height; y++) {
-
-            baseData.getPixels(0, y, baseData.width, baseColors, 0);
-            baseData.getPixels(0, y, baseData.width, copiedColors, 0);
-            assertTrue(Arrays.equals(baseColors, copiedColors));
-
-            baseData.getAlphas(0, y, baseData.width, baseAlpha, 0);
-            baseData.getAlphas(0, y, baseData.width, copiedAlpha, 0);
-            assertTrue(Arrays.equals(baseAlpha, copiedAlpha));
-
-        }
-    }
-
-    public void testGetVerticalPixelsIllegalArgument() throws Exception {
-        String fileName = DIR + "no-patched.png";
-        Image image = new Image(Display.getDefault(),
-                getClass().getResourceAsStream(fileName));
-
-        ImageData baseData = image.getImageData();
-        int[] temp = new int[baseData.width];
-
-        // data must not be null
-        try {
-            GraphicsUtilities.getVerticalPixels(null, 0, 0, 1, temp);
-            fail();
-        } catch (IllegalArgumentException e) {
-        }
-
-        // out must not be null
-        try {
-            GraphicsUtilities.getVerticalPixels(baseData, 0, 0, 1, null);
-            fail();
-        } catch (IllegalArgumentException e) {
-        }
-
-        // out length must be > height
-        try {
-            GraphicsUtilities.getVerticalPixels(baseData, 0, 0, 1, new int[0]);
-            fail();
-        } catch (IllegalArgumentException e) {
-        }
-
-        // x must be > 0
-        try {
-            GraphicsUtilities.getVerticalPixels(baseData, -1, 0, 1, temp);
-            fail();
-        } catch (IllegalArgumentException e) {
-        }
-
-        // y must be > 0
-        try {
-            GraphicsUtilities.getVerticalPixels(baseData, 0, -1, 1, temp);
-            fail();
-        } catch (IllegalArgumentException e) {
-        }
-
-        // height must be >= 0
-        try {
-            GraphicsUtilities.getVerticalPixels(baseData, 0, 0, 0, temp);
-            fail();
-        } catch (IllegalArgumentException e) {
-        }
-
-        // argument x must be < data.width
-        try {
-            GraphicsUtilities.getVerticalPixels(baseData, baseData.width, 0, baseData.height, temp);
-            fail();
-        } catch (IllegalArgumentException e) {
-        }
-
-        // argument y must be < data.height
-        try {
-            GraphicsUtilities
-                    .getVerticalPixels(baseData, 0, baseData.height, baseData.height, temp);
-            fail();
-        } catch (IllegalArgumentException e) {
-        }
-
-        // argument height must be > (y + data.height)
-        try {
-            GraphicsUtilities.getVerticalPixels(baseData, 0, 1, baseData.height, temp);
-            fail();
-        } catch (IllegalArgumentException e) {
-        }
-
-    }
-
-    public void testGetVerticalPixels() throws Exception {
-        String fileName = DIR + "no-patched.png";
-        Image image = new Image(Display.getDefault(),
-                getClass().getResourceAsStream(fileName));
-
-        ImageData baseData = image.getImageData();
-        int[] temp = new int[baseData.width];
-
-        GraphicsUtilities.getVerticalPixels(baseData, 0, 0, baseData.height, temp);
-
-        int height = baseData.height;
-        for (int y = 0; y < height; y++) {
-            assertEquals(baseData.getPixel(0, y), temp[y]);
-        }
-    }
-
-    public void testGetHorizontalPixelsIllegalArgument() throws Exception {
-        String fileName = DIR + "no-patched.png";
-        Image image = new Image(Display.getDefault(),
-                getClass().getResourceAsStream(fileName));
-
-        ImageData baseData = image.getImageData();
-        int[] temp = new int[baseData.width];
-
-        // data must not be null
-        try {
-            GraphicsUtilities.getHorizontalPixels(null, 0, 0, 1, temp);
-            fail();
-        } catch (IllegalArgumentException e) {
-        }
-
-        // out must not be null
-        try {
-            GraphicsUtilities.getHorizontalPixels(baseData, 0, 0, 1, null);
-            fail();
-        } catch (IllegalArgumentException e) {
-        }
-
-        // out length must be > width
-        try {
-            GraphicsUtilities.getHorizontalPixels(baseData, 0, 0, 1, new int[0]);
-            fail();
-        } catch (IllegalArgumentException e) {
-        }
-
-        // x must be > 0
-        try {
-            GraphicsUtilities.getHorizontalPixels(baseData, -1, 0, 1, temp);
-            fail();
-        } catch (IllegalArgumentException e) {
-        }
-
-        // y must be > 0
-        try {
-            GraphicsUtilities.getHorizontalPixels(baseData, 0, -1, 1, temp);
-            fail();
-        } catch (IllegalArgumentException e) {
-        }
-
-        // width must be >= 0
-        try {
-            GraphicsUtilities.getHorizontalPixels(baseData, 0, 0, 0, temp);
-            fail();
-        } catch (IllegalArgumentException e) {
-        }
-
-        // argument x must be < data.width
-        try {
-            GraphicsUtilities
-                    .getHorizontalPixels(baseData, baseData.width, 0, baseData.width, temp);
-            fail();
-        } catch (IllegalArgumentException e) {
-        }
-
-        // argument y must be < data.height
-        try {
-            GraphicsUtilities
-                    .getHorizontalPixels(baseData, 0, baseData.height, baseData.width, temp);
-            fail();
-        } catch (IllegalArgumentException e) {
-        }
-
-        // argument width must be > (x + data.width)
-        try {
-            GraphicsUtilities.getHorizontalPixels(baseData, 1, 0, baseData.width, temp);
-            fail();
-        } catch (IllegalArgumentException e) {
-        }
-
-    }
-
-    public void testGetHorizontalPixels() throws Exception {
-        String fileName = DIR + "no-patched.png";
-        Image image = new Image(Display.getDefault(),
-                getClass().getResourceAsStream(fileName));
-
-        ImageData baseData = image.getImageData();
-        int[] temp = new int[baseData.width];
-
-        GraphicsUtilities.getHorizontalPixels(baseData, 0, 0, baseData.width, temp);
-
-        int width = baseData.width;
-        for (int x = 0; x < width; x++) {
-            assertEquals(baseData.getPixel(x, 0), temp[x]);
-        }
-    }
-
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/adt/internal/editors/draw9patch/graphics/NinePatchedImageTest.java b/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/adt/internal/editors/draw9patch/graphics/NinePatchedImageTest.java
deleted file mode 100644
index 72c9296..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/adt/internal/editors/draw9patch/graphics/NinePatchedImageTest.java
+++ /dev/null
@@ -1,914 +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.eclipse.adt.internal.editors.draw9patch.graphics;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import junit.framework.TestCase;
-
-import org.eclipse.swt.graphics.ImageData;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.graphics.Rectangle;
-
-import com.android.ide.eclipse.adt.internal.editors.draw9patch.graphics.NinePatchedImage.Chunk;
-import com.android.ide.eclipse.adt.internal.editors.draw9patch.graphics.NinePatchedImage.Projection;
-import com.android.ide.eclipse.adt.internal.editors.draw9patch.graphics.NinePatchedImage.Tick;
-
-public class NinePatchedImageTest extends TestCase {
-
-    private static final String DIR = "/com/android/ide/eclipse/testdata/draw9patch/";
-
-    public void testReadNoPatchedImage() throws Exception {
-        String fileName = DIR + "no-patched.png";
-        NinePatchedImage image = new NinePatchedImage(getClass()
-                .getResourceAsStream(fileName), fileName);
-        assertNotNull(image);
-
-        ImageData data = image.getImageData();
-        int width = data.width;
-        int height = data.height;
-
-        assertEquals(72, width);
-        assertEquals(50, height);
-
-        assertFalse(image.hasNinePatchExtension());
-    }
-
-    public void testReadNoPatchedInteraceImage() throws Exception {
-        String fileName = DIR + "no-patched-interlace.png";
-        NinePatchedImage image = new NinePatchedImage(getClass()
-                .getResourceAsStream(fileName), fileName);
-        assertNotNull(image);
-
-        ImageData data = image.getImageData();
-        int width = data.width;
-        int height = data.height;
-
-        assertEquals(72, width);
-        assertEquals(50, height);
-
-        assertFalse(image.hasNinePatchExtension());
-    }
-
-    public void testConvert9PatchedImage() throws Exception {
-        String fileName = DIR + "no-patched.png";
-        NinePatchedImage image = new NinePatchedImage(getClass()
-                .getResourceAsStream(fileName), fileName);
-        assertNotNull(image);
-
-        ImageData data = image.getImageData();
-        int width = data.width;
-        int height = data.height;
-
-        assertEquals(72, width);
-        assertEquals(50, height);
-
-        assertFalse(image.hasNinePatchExtension());
-
-        image.convertToNinePatch();
-
-        data = image.getImageData();
-        width = data.width;
-        height = data.height;
-
-        // increased patch size
-        assertEquals(72 + 2, width);
-        assertEquals(50 + 2, height);
-
-        assertTrue(image.hasNinePatchExtension());
-        assertFalse(image.isDirty());
-
-        // initialized patches
-        List<Tick> horizontalPatches = image.getHorizontalPatches();
-        List<Tick> verticalPatches = image.getVerticalPatches();
-        assertEquals(1, horizontalPatches.size());
-        assertEquals(1, verticalPatches.size());
-
-        // initialized contents area
-        List<Tick> horizontalContentsArea = image.getHorizontalContents();
-        List<Tick> verticalContentsArea = image.getVerticalContents();
-        assertEquals(1, horizontalContentsArea.size());
-        assertEquals(1, verticalContentsArea.size());
-
-        // content area rectangle
-        Rectangle contentsArea = image.getContentArea();
-        assertEquals(new Rectangle(1, 1, width - 2, height - 2), contentsArea);
-    }
-
-    public void testReadInvalidPatchedImageCorners() throws Exception {
-
-        // top-left
-        String fileName = DIR + "invalid-patched1.9.png";
-        NinePatchedImage image = new NinePatchedImage(getClass()
-                .getResourceAsStream(fileName), fileName);
-        assertNotNull(image);
-        assertTrue(image.hasNinePatchExtension());
-        assertFalse(image.ensure9Patch());
-
-        // top-right
-        fileName = DIR + "invalid-patched2.9.png";
-        image = new NinePatchedImage(getClass()
-                .getResourceAsStream(fileName), fileName);
-        assertNotNull(image);
-        assertTrue(image.hasNinePatchExtension());
-        assertFalse(image.ensure9Patch());
-
-        // bottom-left
-        fileName = DIR + "invalid-patched3.9.png";
-        image = new NinePatchedImage(getClass()
-                .getResourceAsStream(fileName), fileName);
-        assertNotNull(image);
-        assertTrue(image.hasNinePatchExtension());
-        assertFalse(image.ensure9Patch());
-
-        // bottom-right
-        fileName = DIR + "invalid-patched4.9.png";
-        image = new NinePatchedImage(getClass()
-                .getResourceAsStream(fileName), fileName);
-        assertNotNull(image);
-        assertTrue(image.hasNinePatchExtension());
-        assertFalse(image.ensure9Patch());
-    }
-
-    public void testReadInvalidPatchedImageLine() throws Exception {
-
-        // top
-        String fileName = DIR + "invalid-patched5.9.png";
-        NinePatchedImage image = new NinePatchedImage(getClass()
-                .getResourceAsStream(fileName), fileName);
-        assertNotNull(image);
-        assertTrue(image.hasNinePatchExtension());
-        assertFalse(image.ensure9Patch());
-
-        // right
-        fileName = DIR + "invalid-patched6.9.png";
-        image = new NinePatchedImage(getClass()
-                .getResourceAsStream(fileName), fileName);
-        assertNotNull(image);
-        assertTrue(image.hasNinePatchExtension());
-        assertFalse(image.ensure9Patch());
-
-        // bottom
-        fileName = DIR + "invalid-patched7.9.png";
-        image = new NinePatchedImage(getClass()
-                .getResourceAsStream(fileName), fileName);
-        assertNotNull(image);
-        assertTrue(image.hasNinePatchExtension());
-        assertFalse(image.ensure9Patch());
-
-        // left
-        fileName = DIR + "invalid-patched8.9.png";
-        image = new NinePatchedImage(getClass()
-                .getResourceAsStream(fileName), fileName);
-        assertNotNull(image);
-        assertTrue(image.hasNinePatchExtension());
-        assertFalse(image.ensure9Patch());
-    }
-
-    public void testEnsure9PatchIgnoreInvalidPixels() throws Exception {
-        // top
-        String fileName = DIR + "invalid-patched5.9.png";
-        NinePatchedImage image = new NinePatchedImage(getClass()
-                .getResourceAsStream(fileName), fileName);
-        assertNotNull(image);
-
-        // invalid pixel
-        int invalidPixel = image.getImageData().getPixel(33, 0);
-        assertTrue(0x0 != invalidPixel);
-
-        assertTrue(image.hasNinePatchExtension());
-        assertFalse(image.ensure9Patch());
-
-        // ensure9path() ignored invalid pixels
-        int invalidPixelAlpha = image.getImageData().getAlpha(33, 0);
-        assertEquals(0x00, invalidPixelAlpha);
-    }
-
-    public void test9Patch1() throws Exception {
-        String fileName = DIR + "patched1.9.png";
-        NinePatchedImage image = new NinePatchedImage(getClass()
-                .getResourceAsStream(fileName), fileName);
-        assertNotNull(image);
-
-        assertTrue(image.hasNinePatchExtension());
-        assertTrue(image.ensure9Patch());
-
-        // patches
-        List<Tick> horizontalPatches = image.getHorizontalPatches();
-        List<Tick> verticalPatches = image.getVerticalPatches();
-        assertEquals(3, horizontalPatches.size());
-        assertEquals(3, verticalPatches.size());
-
-        Chunk[][] chunks = null;
-        chunks = image.getChunks(chunks);
-
-        // vertical chunk size
-        assertEquals(3, chunks.length);
-
-        // horizontal chunk size
-        for (int i = 0; i < chunks.length; i++) {
-            assertEquals(3, chunks[i].length);
-        }
-
-        Chunk c = null;
-        Rectangle rect = null;
-
-        // Row 1
-        c = chunks[0][0];
-        rect = c.rect;
-        assertEquals(Chunk.TYPE_HORIZONTAL | Chunk.TYPE_VERTICAL, c.type);
-        assertEquals(1, rect.x);
-        assertEquals(1, rect.y);
-        assertEquals(1, rect.width);
-        assertEquals(1, rect.height);
-
-        c = chunks[0][1];
-        rect = c.rect;
-        assertEquals(Chunk.TYPE_VERTICAL, c.type);
-        assertEquals(2, rect.x);
-        assertEquals(1, rect.y);
-        assertEquals(70, rect.width);
-        assertEquals(1, rect.height);
-
-        c = chunks[0][2];
-        rect = c.rect;
-        assertEquals(Chunk.TYPE_HORIZONTAL | Chunk.TYPE_VERTICAL, c.type);
-        assertEquals(72, rect.x);
-        assertEquals(1, rect.y);
-        assertEquals(1, rect.width);
-        assertEquals(1, rect.height);
-
-        // Row 2
-        c = chunks[1][0];
-        rect = c.rect;
-        assertEquals(Chunk.TYPE_HORIZONTAL, c.type);
-        assertEquals(1, rect.x);
-        assertEquals(2, rect.y);
-        assertEquals(1, rect.width);
-        assertEquals(48, rect.height);
-
-        c = chunks[1][1];
-        rect = c.rect;
-        assertEquals(Chunk.TYPE_FIXED, c.type);
-        assertEquals(2, rect.x);
-        assertEquals(2, rect.y);
-        assertEquals(70, rect.width);
-        assertEquals(48, rect.height);
-
-        c = chunks[1][2];
-        rect = c.rect;
-        assertEquals(Chunk.TYPE_HORIZONTAL, c.type);
-        assertEquals(72, rect.x);
-        assertEquals(2, rect.y);
-        assertEquals(1, rect.width);
-        assertEquals(48, rect.height);
-
-        // Row 3
-        c = chunks[2][0];
-        rect = c.rect;
-        assertEquals(Chunk.TYPE_HORIZONTAL | Chunk.TYPE_VERTICAL, c.type);
-        assertEquals(1, rect.x);
-        assertEquals(50, rect.y);
-        assertEquals(1, rect.width);
-        assertEquals(1, rect.height);
-
-        c = chunks[2][1];
-        rect = c.rect;
-        assertEquals(Chunk.TYPE_VERTICAL, c.type);
-        assertEquals(2, rect.x);
-        assertEquals(50, rect.y);
-        assertEquals(70, rect.width);
-        assertEquals(1, rect.height);
-
-        c = chunks[2][2];
-        rect = c.rect;
-        assertEquals(Chunk.TYPE_HORIZONTAL | Chunk.TYPE_VERTICAL, c.type);
-        assertEquals(72, rect.x);
-        assertEquals(50, rect.y);
-        assertEquals(1, rect.width);
-        assertEquals(1, rect.height);
-    }
-
-    public void test9Patch2() throws Exception {
-        String fileName = DIR + "patched2.9.png";
-        NinePatchedImage image = new NinePatchedImage(getClass()
-                .getResourceAsStream(fileName), fileName);
-        assertNotNull(image);
-
-        assertTrue(image.hasNinePatchExtension());
-        assertTrue(image.ensure9Patch());
-
-        // patches
-        List<Tick> horizontalPatches = image.getHorizontalPatches();
-        List<Tick> verticalPatches = image.getVerticalPatches();
-        assertEquals(5, horizontalPatches.size());
-        assertEquals(7, verticalPatches.size());
-
-        NinePatchedImage.Chunk[][] chunks = null;
-        chunks = image.getChunks(chunks);
-
-        // vertical chunk size
-        assertEquals(7, chunks.length);
-
-        // horizontal chunk size
-        for (int i = 0; i < chunks.length; i++) {
-            assertEquals(5, chunks[i].length);
-        }
-
-        NinePatchedImage.Chunk c = null;
-        Rectangle rect = null;
-
-        // Row 1
-        c = chunks[0][0];
-        rect = c.rect;
-        assertEquals(Chunk.TYPE_HORIZONTAL | Chunk.TYPE_VERTICAL, c.type);
-        assertEquals(1, rect.x);
-        assertEquals(1, rect.y);
-        assertEquals(1, rect.width);
-        assertEquals(1, rect.height);
-
-        c = chunks[0][1];
-        rect = c.rect;
-        assertEquals(Chunk.TYPE_VERTICAL, c.type);
-        assertEquals(2, rect.x);
-        assertEquals(1, rect.y);
-        assertEquals(34, rect.width);
-        assertEquals(1, rect.height);
-
-        c = chunks[0][2];
-        rect = c.rect;
-        assertEquals(Chunk.TYPE_HORIZONTAL | Chunk.TYPE_VERTICAL, c.type);
-        assertEquals(36, rect.x);
-        assertEquals(1, rect.y);
-        assertEquals(1, rect.width);
-        assertEquals(1, rect.height);
-
-        c = chunks[0][3];
-        rect = c.rect;
-        assertEquals(Chunk.TYPE_VERTICAL, c.type);
-        assertEquals(37, rect.x);
-        assertEquals(1, rect.y);
-        assertEquals(35, rect.width);
-        assertEquals(1, rect.height);
-
-        c = chunks[0][4];
-        rect = c.rect;
-        assertEquals(Chunk.TYPE_HORIZONTAL | Chunk.TYPE_VERTICAL, c.type);
-        assertEquals(72, rect.x);
-        assertEquals(1, rect.y);
-        assertEquals(1, rect.width);
-        assertEquals(1, rect.height);
-
-        // Row 2
-        c = chunks[1][0];
-        rect = c.rect;
-        assertEquals(Chunk.TYPE_HORIZONTAL, c.type);
-        assertEquals(1, rect.x);
-        assertEquals(2, rect.y);
-        assertEquals(1, rect.width);
-        assertEquals(7, rect.height);
-
-        c = chunks[1][1];
-        rect = c.rect;
-        assertEquals(Chunk.TYPE_FIXED, c.type);
-        assertEquals(2, rect.x);
-        assertEquals(2, rect.y);
-        assertEquals(34, rect.width);
-        assertEquals(7, rect.height);
-
-        c = chunks[1][2];
-        rect = c.rect;
-        assertEquals(Chunk.TYPE_HORIZONTAL, c.type);
-        assertEquals(36, rect.x);
-        assertEquals(2, rect.y);
-        assertEquals(1, rect.width);
-        assertEquals(7, rect.height);
-
-        c = chunks[1][3];
-        rect = c.rect;
-        assertEquals(Chunk.TYPE_FIXED, c.type);
-        assertEquals(37, rect.x);
-        assertEquals(2, rect.y);
-        assertEquals(35, rect.width);
-        assertEquals(7, rect.height);
-
-        c = chunks[1][4];
-        rect = c.rect;
-        assertEquals(Chunk.TYPE_HORIZONTAL, c.type);
-        assertEquals(72, rect.x);
-        assertEquals(2, rect.y);
-        assertEquals(1, rect.width);
-        assertEquals(7, rect.height);
-
-        // Row 3
-        c = chunks[2][0];
-        rect = c.rect;
-        assertEquals(Chunk.TYPE_HORIZONTAL | Chunk.TYPE_VERTICAL, c.type);
-        assertEquals(1, rect.x);
-        assertEquals(9, rect.y);
-        assertEquals(1, rect.width);
-        assertEquals(4, rect.height);
-
-        c = chunks[2][1];
-        rect = c.rect;
-        assertEquals(Chunk.TYPE_VERTICAL, c.type);
-        assertEquals(2, rect.x);
-        assertEquals(9, rect.y);
-        assertEquals(34, rect.width);
-        assertEquals(4, rect.height);
-
-        c = chunks[2][2];
-        rect = c.rect;
-        assertEquals(Chunk.TYPE_HORIZONTAL | Chunk.TYPE_VERTICAL, c.type);
-        assertEquals(36, rect.x);
-        assertEquals(9, rect.y);
-        assertEquals(1, rect.width);
-        assertEquals(4, rect.height);
-
-        c = chunks[2][3];
-        rect = c.rect;
-        assertEquals(Chunk.TYPE_VERTICAL, c.type);
-        assertEquals(37, rect.x);
-        assertEquals(9, rect.y);
-        assertEquals(35, rect.width);
-        assertEquals(4, rect.height);
-
-        c = chunks[2][4];
-        rect = c.rect;
-        assertEquals(Chunk.TYPE_HORIZONTAL | Chunk.TYPE_VERTICAL, c.type);
-        assertEquals(72, rect.x);
-        assertEquals(9, rect.y);
-        assertEquals(1, rect.width);
-        assertEquals(4, rect.height);
-
-        // Row 4
-        c = chunks[3][0];
-        rect = c.rect;
-        assertEquals(Chunk.TYPE_HORIZONTAL, c.type);
-        assertEquals(1, rect.x);
-        assertEquals(13, rect.y);
-        assertEquals(1, rect.width);
-        assertEquals(13, rect.height);
-
-        c = chunks[3][1];
-        rect = c.rect;
-        assertEquals(Chunk.TYPE_FIXED, c.type);
-        assertEquals(2, rect.x);
-        assertEquals(13, rect.y);
-        assertEquals(34, rect.width);
-        assertEquals(13, rect.height);
-
-        c = chunks[3][2];
-        rect = c.rect;
-        assertEquals(Chunk.TYPE_HORIZONTAL, c.type);
-        assertEquals(36, rect.x);
-        assertEquals(13, rect.y);
-        assertEquals(1, rect.width);
-        assertEquals(13, rect.height);
-
-        c = chunks[3][3];
-        rect = c.rect;
-        assertEquals(Chunk.TYPE_FIXED, c.type);
-        assertEquals(37, rect.x);
-        assertEquals(13, rect.y);
-        assertEquals(35, rect.width);
-        assertEquals(13, rect.height);
-
-        c = chunks[3][4];
-        rect = c.rect;
-        assertEquals(Chunk.TYPE_HORIZONTAL, c.type);
-        assertEquals(72, rect.x);
-        assertEquals(13, rect.y);
-        assertEquals(1, rect.width);
-        assertEquals(13, rect.height);
-
-        // Row 5
-        c = chunks[4][0];
-        rect = c.rect;
-        assertEquals(Chunk.TYPE_HORIZONTAL | Chunk.TYPE_VERTICAL, c.type);
-        assertEquals(1, rect.x);
-        assertEquals(26, rect.y);
-        assertEquals(1, rect.width);
-        assertEquals(12, rect.height);
-
-        c = chunks[4][1];
-        rect = c.rect;
-        assertEquals(Chunk.TYPE_VERTICAL, c.type);
-        assertEquals(2, rect.x);
-        assertEquals(26, rect.y);
-        assertEquals(34, rect.width);
-        assertEquals(12, rect.height);
-
-        c = chunks[4][2];
-        rect = c.rect;
-        assertEquals(Chunk.TYPE_HORIZONTAL | Chunk.TYPE_VERTICAL, c.type);
-        assertEquals(36, rect.x);
-        assertEquals(26, rect.y);
-        assertEquals(1, rect.width);
-        assertEquals(12, rect.height);
-
-        c = chunks[4][3];
-        rect = c.rect;
-        assertEquals(Chunk.TYPE_VERTICAL, c.type);
-        assertEquals(37, rect.x);
-        assertEquals(26, rect.y);
-        assertEquals(35, rect.width);
-        assertEquals(12, rect.height);
-
-        c = chunks[4][4];
-        rect = c.rect;
-        assertEquals(Chunk.TYPE_HORIZONTAL | Chunk.TYPE_VERTICAL, c.type);
-        assertEquals(72, rect.x);
-        assertEquals(26, rect.y);
-        assertEquals(1, rect.width);
-        assertEquals(12, rect.height);
-
-        // Row 6
-        c = chunks[5][0];
-        rect = c.rect;
-        assertEquals(Chunk.TYPE_HORIZONTAL, c.type);
-        assertEquals(1, rect.x);
-        assertEquals(38, rect.y);
-        assertEquals(1, rect.width);
-        assertEquals(12, rect.height);
-
-        c = chunks[5][1];
-        rect = c.rect;
-        assertEquals(Chunk.TYPE_FIXED, c.type);
-        assertEquals(2, rect.x);
-        assertEquals(38, rect.y);
-        assertEquals(34, rect.width);
-        assertEquals(12, rect.height);
-
-        c = chunks[5][2];
-        rect = c.rect;
-        assertEquals(Chunk.TYPE_HORIZONTAL, c.type);
-        assertEquals(36, rect.x);
-        assertEquals(38, rect.y);
-        assertEquals(1, rect.width);
-        assertEquals(12, rect.height);
-
-        c = chunks[5][3];
-        rect = c.rect;
-        assertEquals(Chunk.TYPE_FIXED, c.type);
-        assertEquals(37, rect.x);
-        assertEquals(38, rect.y);
-        assertEquals(35, rect.width);
-        assertEquals(12, rect.height);
-
-        c = chunks[5][4];
-        rect = c.rect;
-        assertEquals(Chunk.TYPE_HORIZONTAL, c.type);
-        assertEquals(72, rect.x);
-        assertEquals(38, rect.y);
-        assertEquals(1, rect.width);
-        assertEquals(12, rect.height);
-
-        // Row 7
-        c = chunks[6][0];
-        rect = c.rect;
-        assertEquals(Chunk.TYPE_HORIZONTAL | Chunk.TYPE_VERTICAL, c.type);
-        assertEquals(1, rect.x);
-        assertEquals(50, rect.y);
-        assertEquals(1, rect.width);
-        assertEquals(1, rect.height);
-
-        c = chunks[6][1];
-        rect = c.rect;
-        assertEquals(Chunk.TYPE_VERTICAL, c.type);
-        assertEquals(2, rect.x);
-        assertEquals(50, rect.y);
-        assertEquals(34, rect.width);
-        assertEquals(1, rect.height);
-
-        c = chunks[6][2];
-        rect = c.rect;
-        assertEquals(Chunk.TYPE_HORIZONTAL | Chunk.TYPE_VERTICAL, c.type);
-        assertEquals(36, rect.x);
-        assertEquals(50, rect.y);
-        assertEquals(1, rect.width);
-        assertEquals(1, rect.height);
-
-        c = chunks[6][3];
-        rect = c.rect;
-        assertEquals(Chunk.TYPE_VERTICAL, c.type);
-        assertEquals(37, rect.x);
-        assertEquals(50, rect.y);
-        assertEquals(35, rect.width);
-        assertEquals(1, rect.height);
-
-        c = chunks[6][4];
-        rect = c.rect;
-        assertEquals(Chunk.TYPE_HORIZONTAL | Chunk.TYPE_VERTICAL, c.type);
-        assertEquals(72, rect.x);
-        assertEquals(50, rect.y);
-        assertEquals(1, rect.width);
-        assertEquals(1, rect.height);
-    }
-
-    public void testContentArea() throws Exception {
-        String fileName = DIR + "content-area.9.png";
-        NinePatchedImage image = new NinePatchedImage(getClass()
-                .getResourceAsStream(fileName), fileName);
-        assertNotNull(image);
-
-        assertTrue(image.hasNinePatchExtension());
-        assertTrue(image.ensure9Patch());
-
-        // contents area
-        List<Tick> horizontalContentsArea = image.getHorizontalContents();
-        List<Tick> verticalContentsArea = image.getVerticalContents();
-        assertEquals(3, horizontalContentsArea.size());
-        assertEquals(3, verticalContentsArea.size());
-
-        // content area rectangle
-        Rectangle contentsArea = image.getContentArea();
-        assertEquals(new Rectangle(19, 13, 35, 25), contentsArea);
-    }
-
-    public void testContentAreaOneDot() throws Exception {
-        String fileName = DIR + "content-area-one-dot.9.png";
-        NinePatchedImage image = new NinePatchedImage(getClass()
-                .getResourceAsStream(fileName), fileName);
-        assertNotNull(image);
-
-        assertTrue(image.hasNinePatchExtension());
-        assertTrue(image.ensure9Patch());
-
-        // contents area
-        List<Tick> horizontalContentsArea = image.getHorizontalContents();
-        List<Tick> verticalContentsArea = image.getVerticalContents();
-        assertEquals(3, horizontalContentsArea.size());
-        assertEquals(3, verticalContentsArea.size());
-
-        // content area rectangle
-        Rectangle contentsArea = image.getContentArea();
-        assertEquals(new Rectangle(19, 13, 1, 1), contentsArea);
-    }
-
-    public void testContentAreaTwoDots() throws Exception {
-        String fileName = DIR + "content-area-two-dots.9.png";
-        NinePatchedImage image = new NinePatchedImage(getClass()
-                .getResourceAsStream(fileName), fileName);
-        assertNotNull(image);
-
-        assertTrue(image.hasNinePatchExtension());
-        assertTrue(image.ensure9Patch());
-
-        // contents area
-        List<Tick> horizontalContentsArea = image.getHorizontalContents();
-        List<Tick> verticalContentsArea = image.getVerticalContents();
-        assertEquals(5, horizontalContentsArea.size());
-        assertEquals(5, verticalContentsArea.size());
-
-        // content area rectangle
-        Rectangle contentsArea = image.getContentArea();
-        assertEquals(new Rectangle(19, 13, 35, 25), contentsArea);
-
-        String fileName2 = DIR + "content-area.9.png";
-        NinePatchedImage image2 = new NinePatchedImage(getClass()
-                .getResourceAsStream(fileName2), fileName2);
-        assertNotNull(image2);
-
-        assertTrue(image2.hasNinePatchExtension());
-        assertTrue(image2.ensure9Patch());
-
-        // content area rectangle
-        Rectangle contentsArea2 = image2.getContentArea();
-        assertEquals(contentsArea2, contentsArea);
-    }
-
-    public void testBadPatches() throws Exception {
-        String fileName = DIR + "patched-with-badpatches.9.png";
-        NinePatchedImage image = new NinePatchedImage(getClass()
-                .getResourceAsStream(fileName), fileName);
-        assertNotNull(image);
-
-        assertTrue(image.hasNinePatchExtension());
-        assertTrue(image.ensure9Patch());
-
-        Chunk[][] chunks = null;
-        chunks = image.getChunks(chunks);
-
-        // vertical chunk size
-        assertEquals(5, chunks.length);
-
-        // horizontal chunk size
-        for (int i = 0; i < chunks.length; i++) {
-            assertEquals(7, chunks[i].length);
-        }
-
-        chunks = image.getCorruptedChunks(chunks);
-
-        Chunk c = null;
-
-        // collect bad patches
-        List<Point> badPatches = new ArrayList<Point>(5 * 7);
-        for (int y = 0; y < chunks.length; y++) {
-            for (int x = 0; x < chunks[0].length; x++) {
-                c = chunks[y][x];
-                if ((c.type & Chunk.TYPE_CORRUPT) != 0x0) {
-                    badPatches.add(new Point(y, x));
-                }
-            }
-        }
-
-        assertEquals(15, badPatches.size());
-
-        assertTrue(badPatches.contains(new Point(0, 3)));
-
-        assertTrue(badPatches.contains(new Point(1, 1)));
-        assertTrue(badPatches.contains(new Point(1, 2)));
-        assertTrue(badPatches.contains(new Point(1, 3)));
-        assertTrue(badPatches.contains(new Point(1, 4)));
-        assertTrue(badPatches.contains(new Point(1, 5)));
-
-        assertTrue(badPatches.contains(new Point(2, 1)));
-        assertTrue(badPatches.contains(new Point(2, 5)));
-
-        assertTrue(badPatches.contains(new Point(3, 0)));
-        assertTrue(badPatches.contains(new Point(3, 1)));
-        assertTrue(badPatches.contains(new Point(3, 5)));
-        assertTrue(badPatches.contains(new Point(3, 6)));
-
-        assertTrue(badPatches.contains(new Point(4, 1)));
-        assertTrue(badPatches.contains(new Point(4, 3)));
-        assertTrue(badPatches.contains(new Point(4, 5)));
-    }
-
-    public void testProjection() throws Exception {
-        // top
-        String fileName = DIR + "patched3.9.png";
-        NinePatchedImage image = new NinePatchedImage(getClass()
-                .getResourceAsStream(fileName), fileName);
-        assertNotNull(image);
-
-        assertTrue(image.hasNinePatchExtension());
-        assertTrue(image.ensure9Patch());
-
-        ImageData data = image.getImageData();
-        assertEquals(72 + 2, data.width);
-        assertEquals(50 + 2, data.height);
-
-        int width = 72 * 2;
-        int height = 50 * 2;
-
-        Chunk[][] chunks = null;
-        chunks = image.getChunks(chunks);
-
-        Projection[][] projections = null;
-        projections = image.getProjections(width, height, projections);
-
-        assertEquals(chunks.length, projections.length);
-        for (int i = 0; i < chunks.length; i++) {
-            assertEquals(chunks[i].length, projections[i].length);
-        }
-
-        for (int y = 0; y < projections.length; y++) {
-            for (int x = 0; x < projections[y].length; x++) {
-                assertEquals(projections[y][x].src, chunks[y][x].rect);
-
-                // If chunk type is FIXED. Same projection size as original
-                // chunk.
-                if (projections[y][x].chunk.type == Chunk.TYPE_FIXED) {
-                    assertEquals(projections[y][x].dest.width, chunks[y][x].rect.width);
-                    assertEquals(projections[y][x].dest.height, chunks[y][x].rect.height);
-                }
-            }
-        }
-
-        Projection p = null;
-        Rectangle rect = null;
-
-        // Check start position
-        p = projections[0][0];
-
-        // src position start from 1, 9-patch row and column included.
-        assertEquals(1, p.src.x);
-        assertEquals(1, p.src.y);
-
-        // dest position start from 0, 9-patch row and column ignored.
-        assertEquals(0, p.dest.x);
-        assertEquals(0, p.dest.y);
-
-        // row 1
-        p = projections[0][0];
-        rect = p.dest;
-        assertEquals(0, rect.x);
-        assertEquals(0, rect.y);
-        assertEquals(74, rect.width);
-        assertEquals(5, rect.height);
-
-        p = projections[0][1];
-        rect = p.dest;
-        assertEquals(74, rect.x);
-        assertEquals(0, rect.y);
-        assertEquals(62, rect.width);
-        assertEquals(5, rect.height);
-
-        p = projections[0][2];
-        rect = p.dest;
-        assertEquals(136, rect.x);
-        assertEquals(0, rect.y);
-        assertEquals(8, rect.width);
-        assertEquals(5, rect.height);
-
-        // row 2
-        p = projections[1][0];
-        rect = p.dest;
-        assertEquals(0, rect.x);
-        assertEquals(5, rect.y);
-        assertEquals(74, rect.width);
-        assertEquals(24, rect.height);
-
-        p = projections[1][1];
-        rect = p.dest;
-        assertEquals(74, rect.x);
-        assertEquals(5, rect.y);
-        assertEquals(62, rect.width);
-        assertEquals(24, rect.height);
-
-        p = projections[1][2];
-        rect = p.dest;
-        assertEquals(136, rect.x);
-        assertEquals(5, rect.y);
-        assertEquals(8, rect.width);
-        assertEquals(24, rect.height);
-
-        // row 3
-        p = projections[2][0];
-        rect = p.dest;
-        assertEquals(0, rect.x);
-        assertEquals(29, rect.y);
-        assertEquals(74, rect.width);
-        assertEquals(58, rect.height);
-
-        p = projections[2][1];
-        rect = p.dest;
-        assertEquals(74, rect.x);
-        assertEquals(29, rect.y);
-        assertEquals(62, rect.width);
-        assertEquals(58, rect.height);
-
-        p = projections[2][2];
-        rect = p.dest;
-        assertEquals(136, rect.x);
-        assertEquals(29, rect.y);
-        assertEquals(8, rect.width);
-        assertEquals(58, rect.height);
-
-        // row 4
-        p = projections[3][0];
-        rect = p.dest;
-        assertEquals(0, rect.x);
-        assertEquals(87, rect.y);
-        assertEquals(74, rect.width);
-        assertEquals(13, rect.height);
-
-        p = projections[3][1];
-        rect = p.dest;
-        assertEquals(74, rect.x);
-        assertEquals(87, rect.y);
-        assertEquals(62, rect.width);
-        assertEquals(13, rect.height);
-
-        p = projections[3][2];
-        rect = p.dest;
-        assertEquals(136, rect.x);
-        assertEquals(87, rect.y);
-        assertEquals(8, rect.width);
-        assertEquals(13, rect.height);
-    }
-
-    public void testReadLayoutBoundsOnlyImage() throws Exception {
-        String fileName = DIR + "layout-bounds-only.9.png";
-        NinePatchedImage image = new NinePatchedImage(getClass()
-                .getResourceAsStream(fileName), fileName);
-        assertNotNull(image);
-
-        ImageData data = image.getImageData();
-        int width = data.width;
-        int height = data.height;
-
-        assertEquals(74, width);
-        assertEquals(52, height);
-
-        assertTrue(image.hasNinePatchExtension());
-        assertTrue(image.ensure9Patch());
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/adt/internal/editors/formatting/AndroidXmlFormattingStrategyTest.java b/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/adt/internal/editors/formatting/AndroidXmlFormattingStrategyTest.java
deleted file mode 100644
index 9c7e25d..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/adt/internal/editors/formatting/AndroidXmlFormattingStrategyTest.java
+++ /dev/null
@@ -1,335 +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.ide.eclipse.adt.internal.editors.formatting;
-
-import com.android.ide.common.xml.XmlFormatPreferences;
-
-import org.eclipse.jface.text.BadLocationException;
-import org.eclipse.jface.text.Document;
-import org.eclipse.text.edits.MalformedTreeException;
-import org.eclipse.text.edits.ReplaceEdit;
-
-import junit.framework.TestCase;
-
-@SuppressWarnings("javadoc")
-public class AndroidXmlFormattingStrategyTest extends TestCase {
-    // In the given before document, replace in the range replaceStart to replaceEnd
-    // the formatted string, and assert that it's identical to the given after string
-    private void check(String before, int replaceStart, int replaceEnd, String formatted,
-            String expected, XmlFormatPreferences prefs)
-                    throws MalformedTreeException, BadLocationException {
-        Document document = new Document();
-        document.set(before);
-        ReplaceEdit edit = AndroidXmlFormattingStrategy.createReplaceEdit(document, replaceStart,
-                replaceEnd, formatted, prefs);
-        assertNotNull(edit);
-        edit.apply(document);
-        String contents = document.get();
-        // Ensure that we don't have any mangled CRLFs
-        char prev =  0;
-        boolean haveCrlf = false;
-        for (int i = 0, n = contents.length(); i < n; i++) {
-            char c = contents.charAt(i);
-            if (c == '\r') {
-                haveCrlf = true;
-            }
-            if (!(c != '\r' || prev != '\r')) {
-                fail("Mangled document: Found adjacent \\r's starting at " + i
-                        + ": " + contents.substring(i - 1, Math.min(contents.length(), i + 10))
-                                + "...");
-            }
-            if (haveCrlf && c == '\n' && prev != '\r') {
-                fail("Mangled document: In a CRLF document, found \\n without preceeding \\r");
-            }
-
-            prev = c;
-        }
-
-        assertEquals(expected, contents);
-    }
-
-    // In the given before document, replace the range indicated by [ and ] with the given
-    // formatted string, and assert that it's identical to the given after string
-    private void check(
-            String before, String insert, String expected,
-            XmlFormatPreferences prefs)
-            throws MalformedTreeException, BadLocationException {
-        int replaceStart = before.indexOf('[');
-        assertTrue(replaceStart != -1);
-        before = before.substring(0, replaceStart) + before.substring(replaceStart + 1);
-
-        int replaceEnd = before.indexOf(']');
-        assertTrue(replaceEnd != -1);
-        before = before.substring(0, replaceEnd) + before.substring(replaceEnd + 1);
-
-        check(before, replaceStart, replaceEnd, insert, expected, prefs);
-    }
-
-    public void test1() throws Exception {
-        check(
-            // Before
-            "<root>\n" +
-            "[     <element/>\n" +
-            "   <second/>\n" +
-            "]\n" +
-            "</root>\n",
-
-            // Insert
-            "    <element/>\n" +
-            "    <second/>\n",
-
-            // After
-            "<root>\n" +
-            "    <element/>\n" +
-            "    <second/>\n" +
-            "\n" +
-            "</root>\n",
-
-            XmlFormatPreferences.defaults());
-    }
-
-    public void test2() throws Exception {
-        XmlFormatPreferences prefs = XmlFormatPreferences.defaults();
-        prefs.removeEmptyLines = true;
-
-        check(
-                // Before
-                "<root>\n" +
-                "\n" +
-                "\n" +
-                "[     <element/>\n" +
-                "   <second/>\n" +
-                "]\n" +
-                "\n" +
-                "\n" +
-                "</root>\n",
-
-                // Insert
-                "    <element/>\n" +
-                "    <second/>\n",
-
-                // After
-                "<root>\n" +
-                "    <element/>\n" +
-                "    <second/>\n" +
-                "</root>\n",
-
-                prefs);
-    }
-
-    public void test3() throws Exception {
-        XmlFormatPreferences prefs = XmlFormatPreferences.defaults();
-        prefs.removeEmptyLines = true;
-
-        check(
-                // Before
-                "<root>\n" +
-                "\n" +
-                "\n" +
-                "     [<element/>\n" +
-                "   <second/>]\n" +
-                "\n" +
-                "\n" +
-                "\n" +
-                "</root>\n",
-
-                // Insert
-                "    <element/>\n" +
-                "    <second/>",
-
-                // After
-                "<root>\n" +
-                "    <element/>\n" +
-                "    <second/>\n" +
-                "</root>\n",
-
-                prefs);
-    }
-
-    public void test4() throws Exception {
-        check(
-            "<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n" +
-            "    xmlns:tools=\"http://schemas.android.com/tools\"\n" +
-            "    android:layout_width=\"match_parent\"\n" +
-            "    android:layout_height=\"match_parent\" >\n" +
-            "\n" +
-            "    [<TextView\n" +
-            "        android:layout_width=\"wrap_content\"\n" +
-            "        android:layout_height=\"wrap_content\"\n" +
-            "          android:layout_centerHorizontal=\"true\"\n" +
-            "        android:layout_centerVertical=\"true\"\n" +
-            "        android:text=\"foo\"\n" +
-            "        tools:context=\".MainActivity\" />]\n" +
-            "\n" +
-            "</RelativeLayout>\n",
-
-            // Insert
-            "\n" +
-            "    <TextView\n" +
-            "        android:layout_width=\"wrap_content\"\n" +
-            "        android:layout_height=\"wrap_content\"\n" +
-            "        android:layout_centerHorizontal=\"true\"\n" +
-            "        android:layout_centerVertical=\"true\"\n" +
-            "        android:text=\"foo\"\n" +
-            "        tools:context=\".MainActivity\" />\n",
-
-            // After
-            "<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n" +
-            "    xmlns:tools=\"http://schemas.android.com/tools\"\n" +
-            "    android:layout_width=\"match_parent\"\n" +
-            "    android:layout_height=\"match_parent\" >\n" +
-            "\n" +
-            "    <TextView\n" +
-            "        android:layout_width=\"wrap_content\"\n" +
-            "        android:layout_height=\"wrap_content\"\n" +
-            "        android:layout_centerHorizontal=\"true\"\n" +
-            "        android:layout_centerVertical=\"true\"\n" +
-            "        android:text=\"foo\"\n" +
-            "        tools:context=\".MainActivity\" />\n" +
-            "\n" +
-            "</RelativeLayout>\n",
-
-            XmlFormatPreferences.defaults());
-    }
-
-    public void testCrLf1() throws Exception {
-        check(
-            // Before
-            "<root>\r\n" +
-            "[     <element/>\r\n" +
-            "   <second/>\r\n" +
-            "]\r\n" +
-            "</root>\r\n",
-
-            // Insert
-            "    <element/>\r\n" +
-            "    <second/>\r\n",
-
-            // After
-            "<root>\r\n" +
-            "    <element/>\r\n" +
-            "    <second/>\r\n" +
-            "\r\n" +
-            "</root>\r\n",
-
-            XmlFormatPreferences.defaults());
-    }
-
-    public void testCrLf2() throws Exception {
-        XmlFormatPreferences prefs = XmlFormatPreferences.defaults();
-        prefs.removeEmptyLines = true;
-
-        check(
-                // Before
-                "<root>\r\n" +
-                "\r\n" +
-                "\r\n" +
-                "[     <element/>\r\n" +
-                "   <second/>\r\n" +
-                "]\r\n" +
-                "\r\n" +
-                "\r\n" +
-                "</root>\r\n",
-
-                // Insert
-                "    <element/>\r\n" +
-                "    <second/>\r\n",
-
-                // After
-                "<root>\r\n" +
-                "    <element/>\r\n" +
-                "    <second/>\r\n" +
-                "</root>\r\n",
-
-                prefs);
-    }
-
-    public void testCrLf3() throws Exception {
-        XmlFormatPreferences prefs = XmlFormatPreferences.defaults();
-        prefs.removeEmptyLines = true;
-
-        check(
-                // Before
-                "<root>\r\n" +
-                "\r\n" +
-                "\r\n" +
-                "     [<element/>\r\n" +
-                "   <second/>]\r\n" +
-                "\r\n" +
-                "\r\n" +
-                "\r\n" +
-                "</root>\r\n",
-
-                // Insert
-                "    <element/>\r\n" +
-                "    <second/>",
-
-                // After
-                "<root>\r\n" +
-                "    <element/>\r\n" +
-                "    <second/>\r\n" +
-                "</root>\r\n",
-
-                prefs);
-    }
-
-
-    public void testCrlf4() throws Exception {
-        check(
-            "<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\r\n" +
-            "    xmlns:tools=\"http://schemas.android.com/tools\"\r\n" +
-            "    android:layout_width=\"match_parent\"\r\n" +
-            "    android:layout_height=\"match_parent\" >\r\n" +
-            "\r\n" +
-            "    [<TextView\r\n" +
-            "        android:layout_width=\"wrap_content\"\r\n" +
-            "        android:layout_height=\"wrap_content\"\r\n" +
-            "          android:layout_centerHorizontal=\"true\"\r\n" +
-            "        android:layout_centerVertical=\"true\"\r\n" +
-            "        android:text=\"foo\"\r\n" +
-            "        tools:context=\".MainActivity\" />]\r\n" +
-            "\r\n" +
-            "</RelativeLayout>\r\n",
-
-            // Insert
-            "\r\n" +
-            "    <TextView\r\n" +
-            "        android:layout_width=\"wrap_content\"\r\n" +
-            "        android:layout_height=\"wrap_content\"\r\n" +
-            "        android:layout_centerHorizontal=\"true\"\r\n" +
-            "        android:layout_centerVertical=\"true\"\r\n" +
-            "        android:text=\"foo\"\r\n" +
-            "        tools:context=\".MainActivity\" />\r\n",
-
-            // After
-            "<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\r\n" +
-            "    xmlns:tools=\"http://schemas.android.com/tools\"\r\n" +
-            "    android:layout_width=\"match_parent\"\r\n" +
-            "    android:layout_height=\"match_parent\" >\r\n" +
-            "\r\n" +
-            "    <TextView\r\n" +
-            "        android:layout_width=\"wrap_content\"\r\n" +
-            "        android:layout_height=\"wrap_content\"\r\n" +
-            "        android:layout_centerHorizontal=\"true\"\r\n" +
-            "        android:layout_centerVertical=\"true\"\r\n" +
-            "        android:text=\"foo\"\r\n" +
-            "        tools:context=\".MainActivity\" />\r\n" +
-            "\r\n" +
-            "</RelativeLayout>\r\n",
-
-            XmlFormatPreferences.defaults());
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/adt/internal/editors/layout/ExplodeRenderingHelperTest.java b/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/adt/internal/editors/layout/ExplodeRenderingHelperTest.java
deleted file mode 100644
index 0e52867..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/adt/internal/editors/layout/ExplodeRenderingHelperTest.java
+++ /dev/null
@@ -1,256 +0,0 @@
-/*
- * Copyright (C) 2010 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.editors.layout;
-
-import com.android.SdkConstants;
-import com.android.ide.eclipse.adt.internal.editors.mock.MockXmlNode;
-
-import org.w3c.dom.Node;
-
-import java.util.HashSet;
-
-import junit.framework.TestCase;
-
-public class ExplodeRenderingHelperTest extends TestCase {
-
-    private final HashSet<String> mLayoutNames = new HashSet<String>();
-
-    @Override
-    protected void setUp() throws Exception {
-        super.setUp();
-
-        mLayoutNames.add("LinearLayout");
-        mLayoutNames.add("RelativeLayout");
-    }
-
-    public void testSingleHorizontalLinearLayout() {
-        // Single layout, horizontal, 2 buttons.
-        MockXmlNode layout = createLinearLayout(true /*horizontal*/,
-                new MockXmlNode[] { createButton(), createButton()} );
-
-        ExplodedRenderingHelper helper = new ExplodedRenderingHelper(layout, mLayoutNames);
-        assertEquals(1, helper.getHeightPadding());
-        assertEquals(1, helper.getWidthPadding());
-    }
-
-    public void testSingleVerticalLinearLayout() {
-        // Single layout, horizontal, with 2 buttons.
-        // LinearLayout(H:[Button Button])
-        MockXmlNode layout = createLinearLayout(false /*horizontal*/,
-                new MockXmlNode[] { createButton(), createButton()} );
-
-        ExplodedRenderingHelper helper = new ExplodedRenderingHelper(layout, mLayoutNames);
-        assertEquals(1, helper.getWidthPadding());
-        assertEquals(1, helper.getHeightPadding());
-    }
-
-    public void testEmbeddedLinearLayouts() {
-        /*
-         *  LinearLayout(vertical):
-         *    LinearLayout(H:[Button Button])
-         *    LinearLayout(H:[Button Button Button])
-         *
-         * Result should be 2 in x, 3 in y
-         */
-        MockXmlNode layout = createLinearLayout(false /*horizontal*/,
-                new MockXmlNode[] {
-                    createLinearLayout(true /*horizontal*/,
-                            new MockXmlNode[] { createButton(), createButton()}),
-                    createLinearLayout(true /*horizontal*/,
-                            new MockXmlNode[] { createButton(), createButton(), createButton()}),
-                } );
-
-        ExplodedRenderingHelper helper = new ExplodedRenderingHelper(layout, mLayoutNames);
-        assertEquals(2, helper.getWidthPadding());
-        assertEquals(3, helper.getHeightPadding());
-    }
-
-    public void testSimpleRelativeLayoutWithOneLinearLayouts() {
-        /*
-         *  RelativeLayout:
-         *    LinearLayout(H:[Button Button])
-         *
-         * Result should be 2 in x, 2 in y
-         */
-        MockXmlNode layout = createRelativeLayout(
-                new MockXmlNode[] {
-                    createLinearLayout(true /*horizontal*/,
-                            new MockXmlNode[] { createButton(), createButton()}),
-                } );
-
-        ExplodedRenderingHelper helper = new ExplodedRenderingHelper(layout, mLayoutNames);
-        assertEquals(2, helper.getWidthPadding());
-        assertEquals(2, helper.getHeightPadding());
-    }
-
-    public void /*test*/RelativeLayoutWithVerticalLinearLayouts() {
-        //FIXME: Reenable once the relative layout are properly supported.
-        /*
-         * Children of the relative layouts, one below the other.
-         * Each with only buttons in them.
-         *  RelativeLayout:
-         *    LinearLayout(H:[Button Button])
-         *          ^
-         *    LinearLayout(H:[Button Button])
-         *
-         * Result should be 2 in x, 3 in y
-         */
-
-        // create the linearlayouts.
-        MockXmlNode linear1 = createLinearLayout(true /*horizontal*/,
-                new MockXmlNode[] { createButton(), createButton()});
-        linear1.addAttributes(SdkConstants.NS_RESOURCES, "id", "@+id/linear1");
-
-        MockXmlNode linear2 = createLinearLayout(true /*horizontal*/,
-                        new MockXmlNode[] { createButton(), createButton()});
-        linear2.addAttributes(SdkConstants.NS_RESOURCES, "id", "@+id/linear2");
-
-        // position linear2 below linear1
-        linear2.addAttributes(SdkConstants.NS_RESOURCES, "layout_below", "@+id/linear1");
-
-
-        MockXmlNode layout = createRelativeLayout(new MockXmlNode[] { linear1, linear2 } );
-
-        ExplodedRenderingHelper helper = new ExplodedRenderingHelper(layout, mLayoutNames);
-        assertEquals(2, helper.getWidthPadding());
-        assertEquals(3, helper.getHeightPadding());
-    }
-
-    public void /*test*/RelativeLayoutWithVerticalLinearLayouts2() {
-        //FIXME: Reenable once the relative layout are properly supported.
-        /*
-         * Children of the relative layouts, one above the other.
-         * Each with only buttons in them.
-         *  RelativeLayout:
-         *    LinearLayout(H:[Button Button])
-         *          v
-         *    LinearLayout(H:[Button Button])
-         *
-         * Result should be 2 in x, 3 in y
-         */
-
-        // create the linearlayouts.
-        MockXmlNode linear1 = createLinearLayout(true /*horizontal*/,
-                new MockXmlNode[] { createButton(), createButton() } );
-        linear1.addAttributes(SdkConstants.NS_RESOURCES, "id", "@+id/linear1");
-
-        MockXmlNode linear2 = createLinearLayout(true /*horizontal*/,
-                        new MockXmlNode[] { createButton(), createButton() } );
-        linear2.addAttributes(SdkConstants.NS_RESOURCES, "id", "@+id/linear2");
-
-        // position linear2 below linear1
-        linear2.addAttributes(SdkConstants.NS_RESOURCES, "layout_above", "@+id/linear1");
-
-
-        MockXmlNode layout = createRelativeLayout(new MockXmlNode[] { linear1, linear2 } );
-
-        ExplodedRenderingHelper helper = new ExplodedRenderingHelper(layout, mLayoutNames);
-        assertEquals(2, helper.getWidthPadding());
-        assertEquals(3, helper.getHeightPadding());
-    }
-
-    public void /*test*/ComplexRelativeLayout() {
-        //FIXME: Reenable once the relative layout are properly supported.
-        /*
-         *  RelativeLayout:
-         *
-         *                                       < LinearLayout1(V: [button]) > LinearLayout2(V: [button])
-         *                                            v
-         *  Button1 > LinearLayout3(V: [button]) < Button2
-         *                  v
-         *          < LinearLayout4(V: [button])
-         *                                     ^
-         *                                     <LinearLayout5(V: [button])
-         *
-         * Result should be 4 in x, 5 in y
-         */
-
-        // create the elements
-        MockXmlNode button1 = createButton();
-        button1.addAttributes(SdkConstants.NS_RESOURCES, "id", "@+id/button1");
-
-        MockXmlNode button2 = createButton();
-        button2.addAttributes(SdkConstants.NS_RESOURCES, "id", "@+id/button2");
-
-        MockXmlNode linear1 = createLinearLayout(true /*horizontal*/,
-                new MockXmlNode[] { createButton() } );
-        linear1.addAttributes(SdkConstants.NS_RESOURCES, "id", "@+id/linear1");
-
-        MockXmlNode linear2 = createLinearLayout(true /*horizontal*/,
-                new MockXmlNode[] { createButton() } );
-        linear2.addAttributes(SdkConstants.NS_RESOURCES, "id", "@+id/linear2");
-
-        MockXmlNode linear3 = createLinearLayout(true /*horizontal*/,
-                new MockXmlNode[] { createButton() } );
-        linear3.addAttributes(SdkConstants.NS_RESOURCES, "id", "@+id/linear3");
-
-        MockXmlNode linear4 = createLinearLayout(true /*horizontal*/,
-                new MockXmlNode[] { createButton() } );
-        linear4.addAttributes(SdkConstants.NS_RESOURCES, "id", "@+id/linear4");
-
-        MockXmlNode linear5 = createLinearLayout(true /*horizontal*/,
-                new MockXmlNode[] { createButton() } );
-        linear5.addAttributes(SdkConstants.NS_RESOURCES, "id", "@+id/linear5");
-
-
-        // link them
-        button1.addAttributes(SdkConstants.NS_RESOURCES, "layout_toLeftOf",  "@+id/linear3");
-
-        button2.addAttributes(SdkConstants.NS_RESOURCES, "layout_toRightOf", "@+id/linear3");
-
-        linear1.addAttributes(SdkConstants.NS_RESOURCES, "layout_toRightOf", "@+id/linear3");
-        linear1.addAttributes(SdkConstants.NS_RESOURCES, "layout_toLeftOf",  "@+id/linear2");
-        linear1.addAttributes(SdkConstants.NS_RESOURCES, "layout_above",     "@+id/button2");
-
-        linear3.addAttributes(SdkConstants.NS_RESOURCES, "layout_above",     "@+id/linear4");
-
-        linear4.addAttributes(SdkConstants.NS_RESOURCES, "layout_toRightOf", "@+id/button1");
-
-        linear5.addAttributes(SdkConstants.NS_RESOURCES, "layout_toRightOf", "@+id/linear4");
-        linear5.addAttributes(SdkConstants.NS_RESOURCES, "layout_below",     "@+id/linear4");
-
-        MockXmlNode layout = createRelativeLayout(
-                new MockXmlNode[] {
-                        button1, button2, linear1, linear2, linear3, linear4, linear5 } );
-
-        ExplodedRenderingHelper helper = new ExplodedRenderingHelper(layout, mLayoutNames);
-        assertEquals(4, helper.getWidthPadding());
-        assertEquals(5, helper.getHeightPadding());
-    }
-
-
-    // ----- helper to deal with mocks
-
-    private MockXmlNode createButton() {
-        return new MockXmlNode(null, "Button", Node.ELEMENT_NODE, null);
-    }
-
-    private MockXmlNode createLinearLayout(boolean horizontal, MockXmlNode[] children) {
-        MockXmlNode layout = new MockXmlNode(null, "LinearLayout", Node.ELEMENT_NODE, children);
-
-        layout.addAttributes(SdkConstants.NS_RESOURCES, "orientation",
-                horizontal ? "horizontal" : "vertical");
-
-        return layout;
-    }
-
-    private MockXmlNode createRelativeLayout(MockXmlNode[] children) {
-        MockXmlNode layout = new MockXmlNode(null, "RelativeLayout", Node.ELEMENT_NODE, children);
-
-        return layout;
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/adt/internal/editors/layout/UiElementPullParserTest.java b/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/adt/internal/editors/layout/UiElementPullParserTest.java
deleted file mode 100644
index 5cac663..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/adt/internal/editors/layout/UiElementPullParserTest.java
+++ /dev/null
@@ -1,256 +0,0 @@
-/*
- * 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.editors.layout;
-
-import com.android.SdkConstants;
-import com.android.ide.common.api.IAttributeInfo.Format;
-import com.android.ide.common.resources.platform.AttributeInfo;
-import com.android.ide.eclipse.adt.internal.editors.descriptors.AttributeDescriptor;
-import com.android.ide.eclipse.adt.internal.editors.descriptors.ElementDescriptor;
-import com.android.ide.eclipse.adt.internal.editors.descriptors.TextAttributeDescriptor;
-import com.android.ide.eclipse.adt.internal.editors.mock.MockXmlNode;
-import com.android.ide.eclipse.adt.internal.editors.uimodel.UiElementNode;
-import com.android.resources.Density;
-
-import org.w3c.dom.Node;
-import org.xmlpull.v1.XmlPullParser;
-import org.xmlpull.v1.XmlPullParserException;
-
-import java.util.HashMap;
-
-import junit.framework.TestCase;
-
-public class UiElementPullParserTest extends TestCase {
-
-    private UiElementNode ui;
-    private HashMap<String, String> button1Map;
-    private HashMap<String, String> button2Map;
-    private HashMap<String, String> textMap;
-
-    private TextAttributeDescriptor createTextAttrDesc(String xmlName) {
-        return new TextAttributeDescriptor(
-                xmlName,    // xmlLocalName
-                SdkConstants.NS_RESOURCES,
-                new AttributeInfo(xmlName, Format.STRING_SET)
-                );
-    }
-
-    @Override
-    protected void setUp() throws Exception {
-        // set up some basic descriptors.
-        // We have button, textview, linear layout, relative layout.
-        // only the layouts have children (all 4 descriptors possible)
-        // Also add some dummy attributes.
-        ElementDescriptor buttonDescriptor = new ElementDescriptor("Button", "Button", "", "",
-                new AttributeDescriptor[] {
-                        createTextAttrDesc("name"),
-                        createTextAttrDesc("text"),
-                    },
-                new ElementDescriptor[] {}, false);
-
-        ElementDescriptor textDescriptor = new ElementDescriptor("TextView", "TextView", "", "",
-                new AttributeDescriptor[] {
-                        createTextAttrDesc("name"),
-                        createTextAttrDesc("text"),
-                    },
-                new ElementDescriptor[] {}, false);
-
-        ElementDescriptor linearDescriptor = new ElementDescriptor("LinearLayout", "Linear Layout",
-                "", "",
-                new AttributeDescriptor[] {
-                        createTextAttrDesc("orientation"),
-                    },
-                new ElementDescriptor[] { }, false);
-
-        ElementDescriptor relativeDescriptor = new ElementDescriptor("RelativeLayout",
-                "Relative Layout", "", "",
-                new AttributeDescriptor[] {
-                        createTextAttrDesc("orientation"),
-                    },
-                new ElementDescriptor[] { }, false);
-
-        ElementDescriptor[] a = new ElementDescriptor[] {
-                buttonDescriptor, textDescriptor, linearDescriptor, relativeDescriptor
-        };
-
-        linearDescriptor.setChildren(a);
-        relativeDescriptor.setChildren(a);
-
-        // document descriptor
-        ElementDescriptor rootDescriptor = new ElementDescriptor("root", "", "", "",
-                new AttributeDescriptor[] { }, a, false);
-
-
-        ui = new UiElementNode(rootDescriptor);
-
-        /* create a dummy XML file.
-         * <LinearLayout android:orientation="vertical">
-         *      <Button android:name="button1" android:text="button1text"/>
-         *      <RelativeLayout android:orientation="toto">
-         *          <Button android:name="button2" android:text="button2text"/>
-         *          <TextView android:name="text1" android:text="text1text"/>
-         *      </RelativeLayout>
-         * </LinearLayout>
-         */
-        MockXmlNode button1 = new MockXmlNode(null /* namespace */, "Button", Node.ELEMENT_NODE,
-                null);
-        button1.addAttributes(SdkConstants.NS_RESOURCES, "name", "button1");
-        button1.addAttributes(SdkConstants.NS_RESOURCES, "text", "button1text");
-
-        // create a map of the attributes we add to the multi-attribute nodes so that
-        // we can more easily test the values when we parse the XML.
-        // This is due to some attributes showing in a certain order for a node and in a different
-        // order in another node. Since the order doesn't matter, we just simplify the test.
-        button1Map = new HashMap<String, String>();
-        button1Map.put("name", "button1");
-        button1Map.put("text", "button1text");
-
-        MockXmlNode button2 = new MockXmlNode(null /* namespace */, "Button", Node.ELEMENT_NODE,
-                null);
-        button2.addAttributes(SdkConstants.NS_RESOURCES, "name", "button2");
-        button2.addAttributes(SdkConstants.NS_RESOURCES, "text", "button2text");
-
-        button2Map = new HashMap<String, String>();
-        button2Map.put("name", "button2");
-        button2Map.put("text", "button2text");
-
-        MockXmlNode text = new MockXmlNode(null /* namespace */, "TextView", Node.ELEMENT_NODE,
-                null);
-        text.addAttributes(SdkConstants.NS_RESOURCES, "name", "text1");
-        text.addAttributes(SdkConstants.NS_RESOURCES, "text", "text1text");
-
-        textMap = new HashMap<String, String>();
-        textMap.put("name", "text1");
-        textMap.put("text", "text1text");
-
-        MockXmlNode relative = new MockXmlNode(null /* namespace */, "RelativeLayout",
-                Node.ELEMENT_NODE, new MockXmlNode[] { button2, text });
-        relative.addAttributes(SdkConstants.NS_RESOURCES, "orientation", "toto");
-
-        MockXmlNode linear = new MockXmlNode(null /* namespace */, "LinearLayout",
-                Node.ELEMENT_NODE, new MockXmlNode[] { button1, relative });
-        linear.addAttributes(SdkConstants.NS_RESOURCES, "orientation", "vertical");
-
-        MockXmlNode root = new MockXmlNode(null /* namespace */, "root", Node.ELEMENT_NODE,
-                new MockXmlNode[] { linear });
-
-        // put the namespace/prefix in place
-        root.setPrefix(SdkConstants.NS_RESOURCES, "android");
-
-        // load the xml into the UiElementNode
-        ui.loadFromXmlNode(root);
-
-        super.setUp();
-    }
-
-    @Override
-    protected void tearDown() throws Exception {
-        super.tearDown();
-    }
-
-    public void testParser() {
-        try {
-            // wrap the parser around the ui element node, and start parsing
-            UiElementPullParser parser = new UiElementPullParser(
-                    ui, // model
-                    false, // explodedView
-                    null, // explodeNodes
-                    Density.MEDIUM, // density (default from ConfigurationComposite)
-                    null // iProject
-                    );
-
-            assertEquals(XmlPullParser.START_DOCUMENT, parser.getEventType());
-
-            // top level Linear layout
-            assertEquals(XmlPullParser.START_TAG, parser.next());
-            assertEquals("LinearLayout", parser.getName());
-            assertEquals(1, parser.getAttributeCount());
-            assertEquals("orientation", parser.getAttributeName(0));
-            assertEquals(SdkConstants.NS_RESOURCES, parser.getAttributeNamespace(0));
-            assertEquals("android", parser.getAttributePrefix(0));
-            assertEquals("vertical", parser.getAttributeValue(0));
-
-            // Button
-            assertEquals(XmlPullParser.START_TAG, parser.next());
-            assertEquals("Button", parser.getName());
-            assertEquals(2, parser.getAttributeCount());
-            check(parser, 0, button1Map);
-            check(parser, 1, button1Map);
-            // end of button
-            assertEquals(XmlPullParser.END_TAG, parser.next());
-
-            // Relative Layout
-            assertEquals(XmlPullParser.START_TAG, parser.next());
-            assertEquals("RelativeLayout", parser.getName());
-            assertEquals(1, parser.getAttributeCount());
-            assertEquals("orientation", parser.getAttributeName(0));
-            assertEquals(SdkConstants.NS_RESOURCES, parser.getAttributeNamespace(0));
-            assertEquals("android", parser.getAttributePrefix(0));
-            assertEquals("toto", parser.getAttributeValue(0));
-
-            // Button
-            assertEquals(XmlPullParser.START_TAG, parser.next());
-            assertEquals("Button", parser.getName());
-            assertEquals(2, parser.getAttributeCount());
-            check(parser, 0, button2Map);
-            check(parser, 1, button2Map);
-            // end of button
-            assertEquals(XmlPullParser.END_TAG, parser.next());
-
-            // TextView
-            assertEquals(XmlPullParser.START_TAG, parser.next());
-            assertEquals("TextView", parser.getName());
-            assertEquals(2, parser.getAttributeCount());
-            check(parser, 0, textMap);
-            check(parser, 1, textMap);
-            // end of TextView
-            assertEquals(XmlPullParser.END_TAG, parser.next());
-
-            // end of RelativeLayout
-            assertEquals(XmlPullParser.END_TAG, parser.next());
-
-
-            // end of top level linear layout
-            assertEquals(XmlPullParser.END_TAG, parser.next());
-
-            assertEquals(XmlPullParser.END_DOCUMENT, parser.next());
-        } catch (XmlPullParserException e) {
-            e.printStackTrace();
-            assertTrue(false);
-        }
-    }
-
-    /**
-     * Receives a {@link XmlPullParser} at the START_TAG level, and checks the i-th attribute
-     * to be present in the {@link HashMap} with the proper (name, value)
-     * @param parser
-     * @param i
-     * @param map
-     */
-    private void check(UiElementPullParser parser, int i, HashMap<String, String> map) {
-        String name = parser.getAttributeName(i);
-        String value = parser.getAttributeValue(i);
-
-        String referenceValue = map.get(name);
-        assertNotNull(referenceValue);
-        assertEquals(referenceValue, value);
-
-        assertEquals(SdkConstants.NS_RESOURCES, parser.getAttributeNamespace(i));
-        assertEquals("android", parser.getAttributePrefix(i));
-    }
-
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/adt/internal/editors/layout/configuration/ConfigurationTest.java b/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/adt/internal/editors/layout/configuration/ConfigurationTest.java
deleted file mode 100644
index 5b07d7b..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/adt/internal/editors/layout/configuration/ConfigurationTest.java
+++ /dev/null
@@ -1,143 +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.ide.eclipse.adt.internal.editors.layout.configuration;
-
-import static com.android.ide.common.resources.configuration.LocaleQualifier.FAKE_VALUE;
-
-import com.android.ide.common.resources.configuration.FolderConfiguration;
-import com.android.ide.common.resources.configuration.LocaleQualifier;
-import com.android.resources.Density;
-import com.android.sdklib.devices.Device;
-import com.android.sdklib.devices.DeviceManager;
-import com.android.sdklib.devices.Screen;
-import com.android.utils.StdLogger;
-import com.google.common.collect.Lists;
-
-import java.lang.reflect.Constructor;
-import java.util.Collection;
-import java.util.EnumSet;
-import java.util.List;
-
-import junit.framework.TestCase;
-
-@SuppressWarnings("javadoc")
-public class ConfigurationTest extends TestCase {
-    private Configuration createConfiguration() throws Exception {
-        // Using reflection instead since we want to pass null to
-        // a constructor marked with @NonNull, so the test won't compile.
-        Constructor<Configuration> constructor =
-                Configuration.class.getDeclaredConstructor(ConfigurationChooser.class);
-        constructor.setAccessible(true);
-        ConfigurationChooser chooser = null;
-        return constructor.newInstance(chooser);
-    }
-
-    public void test() throws Exception {
-        Configuration configuration = createConfiguration();
-        assertNotNull(configuration);
-        configuration.setTheme("@style/Theme");
-        assertEquals("@style/Theme", configuration.getTheme());
-
-        DeviceManager deviceManager = DeviceManager.createInstance(
-                                                        null /*osSdkPath*/,
-                                                        new StdLogger(StdLogger.Level.VERBOSE));
-        Collection<Device> devices = deviceManager.getDevices(DeviceManager.DeviceFilter.DEFAULT);
-        assertNotNull(devices);
-        assertTrue(devices.size() > 0);
-        configuration.setDevice(devices.iterator().next(), false);
-
-        // Check syncing
-        FolderConfiguration folderConfig = configuration.getFullConfig();
-        assertEquals(FAKE_VALUE, folderConfig.getLocaleQualifier().getLanguage());
-        assertEquals(FAKE_VALUE, folderConfig.getLocaleQualifier().getRegion());
-        assertEquals(Locale.ANY, configuration.getLocale());
-
-        Locale language = Locale.create(new LocaleQualifier("nb"));
-        configuration.setLocale(language, true /* skipSync */);
-        assertEquals(FAKE_VALUE, folderConfig.getLocaleQualifier().getLanguage());
-        assertEquals(FAKE_VALUE, folderConfig.getLocaleQualifier().getRegion());
-
-        configuration.setLocale(language, false /* skipSync */);
-        assertEquals(FAKE_VALUE, folderConfig.getLocaleQualifier().getRegion());
-        assertEquals("nb", folderConfig.getLocaleQualifier().getLanguage());
-
-        assertEquals("2.7in QVGA::nb-__:+Theme::notnight::", configuration.toPersistentString());
-
-        configuration.setActivity("foo.bar.FooActivity");
-        configuration.setTheme("@android:style/Theme.Holo.Light");
-
-        assertEquals("2.7in QVGA",
-                ConfigurationChooser.getDeviceLabel(configuration.getDevice(), true));
-        assertEquals("2.7in QVGA",
-                ConfigurationChooser.getDeviceLabel(configuration.getDevice(), false));
-        assertEquals("Light",
-                ConfigurationChooser.getThemeLabel(configuration.getTheme(), true));
-        assertEquals("Theme.Holo.Light",
-                ConfigurationChooser.getThemeLabel(configuration.getTheme(), false));
-        assertEquals("nb",
-                ConfigurationChooser.getLocaleLabel(null, configuration.getLocale(), true));
-        assertEquals("Norwegian Bokm\u00e5l (nb)",
-                ConfigurationChooser.getLocaleLabel(null, configuration.getLocale(), false));
-
-        assertEquals("FooActivity",
-                ConfigurationChooser.getActivityLabel(configuration.getActivity(), true));
-        assertEquals("foo.bar.FooActivity",
-                ConfigurationChooser.getActivityLabel(configuration.getActivity(), false));
-
-        assertEquals("2.7in QVGA::nb-__:-Theme.Holo.Light::notnight::foo.bar.FooActivity",
-                configuration.toPersistentString());
-
-        assertEquals(Density.MEDIUM, configuration.getDensity());
-        Screen screen = configuration.getDevice().getDefaultHardware().getScreen();
-        assertEquals(145.0f, screen.getXdpi(), 0.001);
-        assertEquals(145.0f, screen.getYdpi(), 0.001);
-    }
-
-    public void testCopy() throws Exception {
-        Configuration configuration = createConfiguration();
-        assertNotNull(configuration);
-        configuration.setTheme("@style/Theme");
-        assertEquals("@style/Theme", configuration.getTheme());
-        DeviceManager deviceManager = DeviceManager.createInstance(
-                                            null /*osSdkPath*/,
-                                            new StdLogger(StdLogger.Level.VERBOSE));
-        List<Device> devices = Lists.newArrayList(deviceManager.getDevices(DeviceManager.DeviceFilter.DEFAULT));
-        assertNotNull(devices);
-        assertTrue(devices.size() > 0);
-        configuration.setDevice(devices.get(0), false);
-        configuration.setActivity("foo.bar.FooActivity");
-        configuration.setTheme("@android:style/Theme.Holo.Light");
-        Locale locale = Locale.create(new LocaleQualifier("nb"));
-        configuration.setLocale(locale, false /* skipSync */);
-
-        Configuration copy = Configuration.copy(configuration);
-        assertEquals(locale, copy.getLocale());
-        assertEquals("foo.bar.FooActivity", copy.getActivity());
-        assertEquals("@android:style/Theme.Holo.Light", copy.getTheme());
-        assertEquals(devices.get(0), copy.getDevice());
-
-        // Make sure edits to master does not affect the child
-        configuration.setLocale(Locale.ANY, false);
-        configuration.setTheme("@android:style/Theme.Holo");
-        configuration.setDevice(devices.get(1), true);
-
-        assertTrue(copy.getFullConfig().getLocaleQualifier().equals(locale.qualifier));
-        assertEquals(locale, copy.getLocale());
-        assertEquals("foo.bar.FooActivity", copy.getActivity());
-        assertEquals("@android:style/Theme.Holo.Light", copy.getTheme());
-        assertEquals(devices.get(0), copy.getDevice());
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/adt/internal/editors/layout/configuration/FlagManagerTest.java b/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/adt/internal/editors/layout/configuration/FlagManagerTest.java
deleted file mode 100644
index 4286aaa..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/adt/internal/editors/layout/configuration/FlagManagerTest.java
+++ /dev/null
@@ -1,185 +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.ide.eclipse.adt.internal.editors.layout.configuration;
-
-import com.android.SdkConstants;
-import com.android.ide.common.resources.LocaleManager;
-import com.google.common.base.Function;
-import com.google.common.collect.ArrayListMultimap;
-import com.google.common.collect.Multimap;
-import com.google.common.collect.Sets;
-
-import org.eclipse.swt.graphics.Image;
-
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Locale;
-import java.util.Map;
-import java.util.Set;
-
-import junit.framework.TestCase;
-
-@SuppressWarnings("javadoc")
-public class FlagManagerTest extends TestCase {
-    public void testGetFlagImage() {
-        FlagManager manager = FlagManager.get();
-        Image us = manager.getFlag("US");
-        Image gb = manager.getFlag("GB");
-        Image ca = manager.getFlag("CA");
-        Image es = manager.getFlag("ES");
-        Image br = manager.getFlag("BR");
-        Image pt = manager.getFlag("PT");
-        assertSame(us, manager.getFlag("en", "US"));
-        assertSame(gb, manager.getFlag("en", "GB"));
-        assertSame(ca, manager.getFlag("en", "CA"));
-        Locale.setDefault(Locale.US);
-        assertSame(us, manager.getFlag("en", null));
-        Locale.setDefault(Locale.UK);
-        assertSame(gb, manager.getFlag("en", null));
-        Locale.setDefault(Locale.CANADA);
-        assertSame(ca, manager.getFlag("en", null));
-        assertSame(manager.getFlag("NO"), manager.getFlag("nb", null));
-        assertSame(manager.getFlag("FR"), manager.getFlag("fr", null));
-
-        Locale.setDefault(new Locale("pt", "br"));
-        assertSame(br, manager.getFlag("pt", null));
-        assertSame(pt, manager.getFlag("pt", "PT"));
-        Locale.setDefault(new Locale("pt", "pt"));
-        assertSame(pt, manager.getFlag("pt", null));
-        assertSame(br, manager.getFlag("pt", "BR"));
-
-        // Special cases where we have custom flags
-        assertNotSame(gb, manager.getFlag("cy", null)); // Wales
-        assertNotSame(es, manager.getFlag("ca", null)); // Catalonia
-
-        // Aliases - http://developer.android.com/reference/java/util/Locale.html
-        assertSame(manager.getFlag("yi", null), manager.getFlag("ji", null));
-        assertSame(manager.getFlag("in", null), manager.getFlag("id", null));
-        assertSame(manager.getFlag("iw", null), manager.getFlag("he", null));
-        assertSame(us, manager.getFlagForFolderName("values-en-rUS"));
-        assertSame(gb, manager.getFlagForFolderName("values-en-rGB"));
-        Locale.setDefault(Locale.CANADA);
-        assertSame(ca, manager.getFlagForFolderName("values-en"));
-    }
-
-    public void testAvailableImages() {
-        // Images we have from WindowBuilder (which are really the famfamfam
-        // icons;
-        // see http://www.famfamfam.com/lab/icons/flags)
-        String[] icons = new String[] {
-                "ad", "ae", "af", "ag", "ai", "al", "am", "ao", "ar", "as", "at", "au", "aw", "ax",
-                "az", "ba", "bb", "bd", "be", "bf", "bg", "bh", "bi", "bj", "bm", "bn", "bo", "br",
-                "bs", "bt", "bv", "bw", "by", "bz", "ca", "catalonia", "cc", "cd", "cf", "cg",
-                "ch", "ci", "ck", "cl", "cm", "cn", "co", "cr", "cu", "cv", "cx", "cy", "cz", "de",
-                "dj", "dk", "dm", "do", "dz", "ec", "ee", "eg", "eh", "england", "er", "es", "et",
-                "fi", "fj", "fk", "fm", "fo", "fr", "ga", "gb", "gd", "ge", "gf", "gg", "gh", "gi",
-                "gl", "gm", "gn", "gp", "gq", "gr", "gs", "gt", "gu", "gw", "gy", "hk", "hm", "hn",
-                "hr", "ht", "hu", "id", "ie", "il", "im", "in", "io", "iq", "ir", "is", "it", "jm",
-                "jo", "jp", "ke", "kg", "kh", "ki", "km", "kn", "kp", "kr", "kw", "ky", "kz", "la",
-                "lb", "lc", "li", "lk", "lr", "ls", "lt", "lu", "lv", "ly", "ma", "mc", "md", "me",
-                "mg", "mh", "mk", "ml", "mm", "mn", "mo", "mp", "mq", "mr", "ms", "mt", "mu", "mv",
-                "mw", "mx", "my", "mz", "na", "nc", "ne", "nf", "ng", "ni", "nl", "no", "np", "nr",
-                "nu", "nz", "om", "pa", "pe", "pf", "pg", "ph", "pk", "pl", "pm", "pn", "pr", "ps",
-                "pt", "pw", "py", "qa", "re", "ro", "rs", "ru", "rw", "sa", "sb", "sc", "scotland",
-                "sd", "se", "sg", "sh", "si", "sj", "sk", "sl", "sm", "sn", "so", "sr", "ss", "st",
-                "sv", "sy", "sz", "tc", "td", "tf", "tg", "th", "tj", "tk", "tl", "tm", "tn", "to",
-                "tr", "tt", "tv", "tw", "tz", "ua", "ug", "um", "us", "uy", "uz", "va", "vc", "ve",
-                "vg", "vi", "vn", "vu", "wales", "wf", "ws", "ye", "yt", "za", "zm", "zw"
-        };
-
-        Set<String> sImages = new HashSet<String>(100);
-        for (String code : icons) {
-            if (code.length() > 2) {
-                continue;
-            }
-            code = code.toUpperCase(Locale.US);
-            sImages.add(code);
-
-            if (!LocaleManager.isValidRegionCode(code)) {
-                System.out.println("No region name found for region code " + code);
-            }
-        }
-
-        Set<String> unused = Sets.newHashSet(LocaleManager.getRegionCodes(false));
-        Set<String> reachable = Sets.newHashSet();
-        Multimap<String, String> regionToLanguages = ArrayListMultimap.create();
-        for (String language : LocaleManager.getLanguageCodes(false)) {
-            for (String region : LocaleManager.getRelevantRegions(language)) {
-                reachable.add(region);
-                regionToLanguages.put(region, language);
-            }
-        }
-        unused.removeAll(reachable);
-
-        for (String region : reachable) {
-            if (!sImages.contains(region)) {
-                StringBuilder sb = new StringBuilder();
-
-                sb.append("No icon found for region ").append(region).append("  ")
-                        .append(LocaleManager.getRegionName(region));
-                sb.append(", used for languages ");
-
-                for (String language : regionToLanguages.get(region)) {
-                    sb.append(language).append("(").append(LocaleManager.getLanguageName(language))
-                            .append(") ");
-                }
-                System.out.println(sb.toString());
-            }
-        }
-
-        // Known regions that we don't have language to region mappings for
-        unused.remove("AQ");
-        unused.remove("VA");
-        unused.remove("GS");
-        unused.remove("TF");
-        unused.remove("BV");
-        unused.remove("HM");
-
-        if (!unused.isEmpty()) {
-            StringBuilder sb = new StringBuilder();
-            sb.append("The following icons are not referenced by any of the "
-                    + "language to country bindings:");
-            for (String code : unused) {
-                sb.append(code.toLowerCase(Locale.US)).append(SdkConstants.DOT_PNG).append(" (");
-                sb.append(LocaleManager.getRegionName(code)).append(") ");
-            }
-            System.out.println(sb.toString());
-        }
-    }
-
-    public void testMissingFlag() {
-        Image icon = FlagManager.get().getFlag("AQ");
-        assertNotNull(icon);
-        assertSame(FlagManager.get().getEmptyIcon(), icon);
-
-        icon = FlagManager.get().getFlag("AQ");
-        assertNotNull(icon);
-        assertSame(FlagManager.get().getEmptyIcon(), icon);
-
-        icon = FlagManager.get().getFlag("WO"); // Not used in ISO 3166-1
-        assertNotNull(icon);
-        assertSame(FlagManager.get().getEmptyIcon(), icon);
-    }
-
-    public void testKnownFlag() {
-        Image icon = FlagManager.get().getFlag("US");
-        assertNotNull(icon);
-        assertNotSame(FlagManager.get().getEmptyIcon(), icon);
-    }
-}
-
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/adt/internal/editors/layout/configuration/LocaleTest.java b/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/adt/internal/editors/layout/configuration/LocaleTest.java
deleted file mode 100644
index 904ade3..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/adt/internal/editors/layout/configuration/LocaleTest.java
+++ /dev/null
@@ -1,99 +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.ide.eclipse.adt.internal.editors.layout.configuration;
-
-import com.android.ide.common.resources.configuration.FolderConfiguration;
-import com.android.ide.common.resources.configuration.LocaleQualifier;
-
-import junit.framework.TestCase;
-
-@SuppressWarnings("javadoc")
-public class LocaleTest extends TestCase {
-    public void test1() {
-        Locale locale = Locale.create("en-rUS");
-        assertEquals("en", locale.qualifier.getLanguage());
-        assertEquals("US", locale.qualifier.getRegion());
-        assertTrue(locale.hasLanguage());
-        assertTrue(locale.hasRegion());
-    }
-
-    public void test2() {
-        Locale locale = Locale.create("zh");
-        assertEquals("zh", locale.qualifier.getLanguage());
-        assertNull(locale.qualifier.getRegion());
-        assertTrue(locale.hasLanguage());
-        assertFalse(locale.hasRegion());
-    }
-
-    public void testEquals() {
-        Locale locale = Locale.create("zh");
-        assertEquals("zh", locale.qualifier.getLanguage());
-        assertNull(locale.qualifier.getRegion());
-        assertTrue(locale.hasLanguage());
-        assertFalse(locale.hasRegion());
-    }
-
-    public void test() {
-        LocaleQualifier qualifier1 = LocaleQualifier.getQualifier("nb");
-        LocaleQualifier qualifier2 = LocaleQualifier.getQualifier("no");
-        LocaleQualifier qualifier3 = LocaleQualifier.getQualifier("nb-rNO");
-        LocaleQualifier qualifier4 = LocaleQualifier.getQualifier("nb-rSE");
-        LocaleQualifier qualifier5 = LocaleQualifier.getQualifier("no-rSE");
-        assertNotNull(qualifier1);
-        assertNotNull(qualifier2);
-        assertNotNull(qualifier3);
-        assertNotNull(qualifier4);
-        assertNotNull(qualifier5);
-
-        assertEquals(Locale.ANY, Locale.ANY);
-        assertFalse(Locale.ANY.hasLanguage());
-        assertFalse(Locale.ANY.hasRegion());
-        // noinspection ConstantConditions
-        assertFalse(Locale.create(new LocaleQualifier(LocaleQualifier.FAKE_VALUE)).hasLanguage());
-        // noinspection ConstantConditions
-        assertFalse(Locale.create(new LocaleQualifier(LocaleQualifier.FAKE_VALUE)).hasRegion());
-
-        assertEquals(Locale.create(qualifier1), Locale.create(qualifier1));
-        assertTrue(Locale.create(qualifier1).hasLanguage());
-        assertFalse(Locale.create(qualifier1).hasRegion());
-        assertTrue(Locale.create(qualifier3).hasLanguage());
-        assertTrue(Locale.create(qualifier3).hasRegion());
-
-        assertEquals(Locale.create(qualifier3), Locale.create(qualifier3));
-        assertEquals(Locale.create(qualifier1), Locale.create(qualifier1));
-        assertTrue(Locale.create(qualifier1).equals(Locale.create(qualifier1)));
-        assertTrue(Locale.create(qualifier3).equals(Locale.create(qualifier3)));
-        assertFalse(Locale.create(qualifier3).equals(Locale.create(qualifier4)));
-        assertFalse(Locale.create(qualifier1).equals(Locale.create(qualifier3)));
-        assertFalse(Locale.create(qualifier1).equals(Locale.create(qualifier2)));
-        assertFalse(Locale.create(qualifier3).equals(Locale.create(qualifier5)));
-        assertEquals("nb", Locale.create(qualifier1).toString());
-        assertEquals("nb-NO", Locale.create(qualifier3).toString());
-
-        assertEquals(Locale.create(qualifier1), Locale.create("b+nb"));
-        assertEquals(Locale.create(qualifier3), Locale.create("b+nb+NO"));
-    }
-
-    public void testFolderConfig() {
-        FolderConfiguration config = new FolderConfiguration();
-        assertEquals(Locale.ANY, Locale.create(config));
-        config.setLocaleQualifier(LocaleQualifier.getQualifier("en"));
-        assertEquals(Locale.create("en"), Locale.create(config));
-        config.setLocaleQualifier(LocaleQualifier.getQualifier("en-rUS"));
-        assertEquals(Locale.create("en-rUS"), Locale.create(config));
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/adt/internal/editors/layout/gle2/CanvasViewInfoTest.java b/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/adt/internal/editors/layout/gle2/CanvasViewInfoTest.java
deleted file mode 100644
index 5996f01..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/adt/internal/editors/layout/gle2/CanvasViewInfoTest.java
+++ /dev/null
@@ -1,797 +0,0 @@
-/*
- * Copyright (C) 2010 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.editors.layout.gle2;
-
-import com.android.ide.common.rendering.api.Capability;
-import com.android.ide.common.rendering.api.DataBindingItem;
-import com.android.ide.common.rendering.api.MergeCookie;
-import com.android.ide.common.rendering.api.ViewInfo;
-import com.android.ide.eclipse.adt.internal.editors.descriptors.AttributeDescriptor;
-import com.android.ide.eclipse.adt.internal.editors.descriptors.ElementDescriptor;
-import com.android.ide.eclipse.adt.internal.editors.layout.descriptors.ViewElementDescriptor;
-import com.android.ide.eclipse.adt.internal.editors.layout.uimodel.UiViewElementNode;
-import com.android.utils.Pair;
-
-import org.eclipse.swt.graphics.Rectangle;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Set;
-
-import junit.framework.TestCase;
-
-@SuppressWarnings("javadoc")
-public class CanvasViewInfoTest extends TestCase {
-
-    public static ViewElementDescriptor createDesc(String name, String fqn, boolean hasChildren) {
-        if (hasChildren) {
-            return new ViewElementDescriptor(name, name, fqn, "", "", new AttributeDescriptor[0],
-                    new AttributeDescriptor[0], new ElementDescriptor[1], false);
-        } else {
-            return new ViewElementDescriptor(name, fqn);
-        }
-    }
-
-    public static UiViewElementNode createNode(UiViewElementNode parent, String fqn,
-            boolean hasChildren) {
-        String name = fqn.substring(fqn.lastIndexOf('.') + 1);
-        ViewElementDescriptor descriptor = createDesc(name, fqn, hasChildren);
-        if (parent == null) {
-            // All node hierarchies should be wrapped inside a document node at the root
-            parent = new UiViewElementNode(createDesc("doc", "doc", true));
-        }
-        return (UiViewElementNode) parent.appendNewUiChild(descriptor);
-    }
-
-    public static UiViewElementNode createNode(String fqn, boolean hasChildren) {
-        return createNode(null, fqn, hasChildren);
-    }
-
-    public void testNormalCreate() throws Exception {
-        normal(true);
-    }
-
-    public void testNormalCreateLayoutLib5() throws Exception {
-        normal(false);
-    }
-
-    private void normal(boolean layoutlib5) {
-
-        // Normal view hierarchy, no null keys anywhere
-
-        UiViewElementNode rootNode = createNode("android.widget.LinearLayout", true);
-        ViewInfo root = new ViewInfo("LinearLayout", rootNode, 10, 10, 100, 100);
-        UiViewElementNode child1Node = createNode(rootNode, "android.widget.Button", false);
-        ViewInfo child1 = new ViewInfo("Button", child1Node, 0, 0, 50, 20);
-        UiViewElementNode child2Node = createNode(rootNode, "android.widget.Button", false);
-        ViewInfo child2 = new ViewInfo("Button", child2Node, 0, 20, 70, 25);
-        root.setChildren(Arrays.asList(child1, child2));
-
-        CanvasViewInfo rootView = CanvasViewInfo.create(root, layoutlib5).getFirst();
-        assertNotNull(rootView);
-        assertEquals("LinearLayout", rootView.getName());
-        assertEquals(new Rectangle(10, 10, 89, 89), rootView.getAbsRect());
-        assertEquals(new Rectangle(10, 10, 89, 89), rootView.getSelectionRect());
-        assertNull(rootView.getParent());
-        assertSame(rootView.getUiViewNode(), rootNode);
-        assertEquals(2, rootView.getChildren().size());
-        CanvasViewInfo childView1 = rootView.getChildren().get(0);
-        CanvasViewInfo childView2 = rootView.getChildren().get(1);
-
-        assertEquals("Button", childView1.getName());
-        assertSame(rootView, childView1.getParent());
-        assertEquals(new Rectangle(10, 10, 49, 19), childView1.getAbsRect());
-        assertEquals(new Rectangle(10, 10, 49, 19), childView1.getSelectionRect());
-        assertSame(childView1.getUiViewNode(), child1Node);
-
-        assertEquals("Button", childView2.getName());
-        assertSame(rootView, childView2.getParent());
-        assertEquals(new Rectangle(10, 30, 69, 4), childView2.getAbsRect());
-        assertEquals(new Rectangle(10, 30, 69, 5), childView2.getSelectionRect());
-        assertSame(childView2.getUiViewNode(), child2Node);
-    }
-
-    public void testShowIn() throws Exception {
-        showIn(false);
-    }
-
-    public void testShowInLayoutLib5() throws Exception {
-        showIn(true);
-    }
-
-    public void showIn(boolean layoutlib5) throws Exception {
-
-        // Test rendering of "Show Included In" (included content rendered
-        // within an outer content that has null keys)
-
-        ViewInfo root = new ViewInfo("LinearLayout", null, 10, 10, 100, 100);
-        ViewInfo child1 = new ViewInfo("CheckBox", null, 0, 0, 50, 20);
-        UiViewElementNode child2Node = createNode("android.widget.RelativeLayout", true);
-        ViewInfo child2 = new ViewInfo("RelativeLayout", child2Node, 0, 20, 70, 25);
-        root.setChildren(Arrays.asList(child1, child2));
-        UiViewElementNode child21Node = createNode("android.widget.Button", false);
-        ViewInfo child21 = new ViewInfo("RadioButton", child21Node, 0, 20, 70, 25);
-        child2.setChildren(Arrays.asList(child21));
-
-        CanvasViewInfo rootView = CanvasViewInfo.create(root, layoutlib5).getFirst();
-        assertNotNull(rootView);
-        assertEquals("LinearLayout", rootView.getName());
-        assertEquals(new Rectangle(10, 10, 89, 89), rootView.getAbsRect());
-        assertEquals(new Rectangle(10, 10, 89, 89), rootView.getSelectionRect());
-        assertNull(rootView.getParent());
-        assertNull(rootView.getUiViewNode());
-        assertEquals(1, rootView.getChildren().size());
-        CanvasViewInfo includedView = rootView.getChildren().get(0);
-
-        assertEquals("RelativeLayout", includedView.getName());
-        assertSame(rootView, includedView.getParent());
-        assertEquals(new Rectangle(10, 30, 69, 4), includedView.getAbsRect());
-        assertEquals(new Rectangle(10, 30, 69, 5), includedView.getSelectionRect());
-        assertSame(includedView.getUiViewNode(), child2Node);
-
-        CanvasViewInfo grandChild = includedView.getChildren().get(0);
-        assertNotNull(grandChild);
-        assertEquals("RadioButton", grandChild.getName());
-        assertSame(child21Node, grandChild.getUiViewNode());
-        assertEquals(new Rectangle(10, 50, 69, 4), grandChild.getAbsRect());
-        assertEquals(new Rectangle(10, 50, 69, 5), grandChild.getSelectionRect());
-    }
-
-    public void testIncludeTag() throws Exception {
-        boolean layoutlib5 = true;
-
-        // Test rendering of included views on layoutlib 5+ (e.g. has <include> tag)
-
-        UiViewElementNode rootNode = createNode("android.widget.LinearLayout", true);
-        ViewInfo root = new ViewInfo("LinearLayout", rootNode, 10, 10, 100, 100);
-        UiViewElementNode child1Node = createNode(rootNode, "android.widget.Button", false);
-        ViewInfo child1 = new ViewInfo("CheckBox", child1Node, 0, 0, 50, 20);
-        UiViewElementNode child2Node = createNode(rootNode, "include", true);
-        ViewInfo child2 = new ViewInfo("RelativeLayout", child2Node, 0, 20, 70, 25);
-        root.setChildren(Arrays.asList(child1, child2));
-        ViewInfo child21 = new ViewInfo("RadioButton", null, 0, 20, 70, 25);
-        child2.setChildren(Arrays.asList(child21));
-
-        CanvasViewInfo rootView = CanvasViewInfo.create(root, layoutlib5).getFirst();
-        assertNotNull(rootView);
-        assertEquals("LinearLayout", rootView.getName());
-        assertEquals(new Rectangle(10, 10, 89, 89), rootView.getAbsRect());
-        assertEquals(new Rectangle(10, 10, 89, 89), rootView.getSelectionRect());
-        assertNull(rootView.getParent());
-        assertSame(rootNode, rootView.getUiViewNode());
-        assertEquals(2, rootView.getChildren().size());
-
-        CanvasViewInfo childView1 = rootView.getChildren().get(0);
-        CanvasViewInfo includedView = rootView.getChildren().get(1);
-
-        assertEquals("CheckBox", childView1.getName());
-        assertSame(rootView, childView1.getParent());
-        assertEquals(new Rectangle(10, 10, 49, 19), childView1.getAbsRect());
-        assertEquals(new Rectangle(10, 10, 49, 19), childView1.getSelectionRect());
-        assertSame(childView1.getUiViewNode(), child1Node);
-
-        assertEquals("RelativeLayout", includedView.getName());
-        assertSame(rootView, includedView.getParent());
-        assertEquals(new Rectangle(10, 30, 69, 4), includedView.getAbsRect());
-        assertEquals(new Rectangle(10, 30, 69, 5), includedView.getSelectionRect());
-        assertSame(includedView.getUiViewNode(), child2Node);
-        assertEquals(0, includedView.getChildren().size());
-    }
-
-    public void testNoIncludeTag() throws Exception {
-        boolean layoutlib5 = false;
-
-        // Test rendering of included views on layoutlib 4- (e.g. no <include> tag cookie
-        // in view info)
-
-        UiViewElementNode rootNode = createNode("android.widget.LinearLayout", true);
-        ViewInfo root = new ViewInfo("LinearLayout", rootNode, 10, 10, 100, 100);
-        UiViewElementNode child1Node = createNode(rootNode, "android.widget.Button", false);
-        ViewInfo child1 = new ViewInfo("CheckBox", child1Node, 0, 0, 50, 20);
-        UiViewElementNode child2Node = createNode(rootNode, "include", true);
-        ViewInfo child2 = new ViewInfo("RelativeLayout", null /* layoutlib 4 */, 0, 20, 70, 25);
-        root.setChildren(Arrays.asList(child1, child2));
-        ViewInfo child21 = new ViewInfo("RadioButton", null, 0, 20, 70, 25);
-        child2.setChildren(Arrays.asList(child21));
-
-        CanvasViewInfo rootView = CanvasViewInfo.create(root, layoutlib5).getFirst();
-        assertNotNull(rootView);
-        assertEquals("LinearLayout", rootView.getName());
-        assertEquals(new Rectangle(10, 10, 89, 89), rootView.getAbsRect());
-        assertEquals(new Rectangle(10, 10, 89, 89), rootView.getSelectionRect());
-        assertNull(rootView.getParent());
-        assertSame(rootNode, rootView.getUiViewNode());
-        assertEquals(2, rootView.getChildren().size());
-
-        CanvasViewInfo childView1 = rootView.getChildren().get(0);
-        CanvasViewInfo includedView = rootView.getChildren().get(1);
-
-        assertEquals("CheckBox", childView1.getName());
-        assertSame(rootView, childView1.getParent());
-        assertEquals(new Rectangle(10, 10, 49, 19), childView1.getAbsRect());
-        assertEquals(new Rectangle(10, 10, 49, 19), childView1.getSelectionRect());
-        assertSame(childView1.getUiViewNode(), child1Node);
-
-        assertEquals("RelativeLayout", includedView.getName());
-        assertSame(rootView, includedView.getParent());
-        assertEquals(new Rectangle(10, 30, 69, 4), includedView.getAbsRect());
-        assertEquals(new Rectangle(10, 30, 69, 5), includedView.getSelectionRect());
-        assertSame(includedView.getUiViewNode(), child2Node);
-        assertEquals(0, includedView.getChildren().size());
-    }
-
-    public void testMergeMatching() throws Exception {
-        boolean layoutlib5 = false;
-
-        // Test rendering of MULTIPLE included views or when there is no simple match
-        // between view info and ui element node children
-
-        UiViewElementNode rootNode = createNode("android.widget.LinearLayout", true);
-        ViewInfo root = new ViewInfo("LinearLayout", rootNode, 10, 10, 100, 100);
-        UiViewElementNode child1Node = createNode(rootNode, "android.widget.Button", false);
-        ViewInfo child1 = new ViewInfo("CheckBox", child1Node, 0, 0, 50, 20);
-        UiViewElementNode multiChildNode1 = createNode(rootNode, "foo", true);
-        UiViewElementNode multiChildNode2 = createNode(rootNode, "bar", true);
-        ViewInfo child2 = new ViewInfo("RelativeLayout", null, 0, 20, 70, 25);
-        ViewInfo child3 = new ViewInfo("AbsoluteLayout", null, 10, 40, 50, 15);
-        root.setChildren(Arrays.asList(child1, child2, child3));
-        ViewInfo child21 = new ViewInfo("RadioButton", null, 0, 20, 70, 25);
-        child2.setChildren(Arrays.asList(child21));
-
-        CanvasViewInfo rootView = CanvasViewInfo.create(root, layoutlib5).getFirst();
-        assertNotNull(rootView);
-        assertEquals("LinearLayout", rootView.getName());
-        assertEquals(new Rectangle(10, 10, 89, 89), rootView.getAbsRect());
-        assertEquals(new Rectangle(10, 10, 89, 89), rootView.getSelectionRect());
-        assertNull(rootView.getParent());
-        assertTrue(rootView.isRoot());
-        assertSame(rootNode, rootView.getUiViewNode());
-        assertEquals(3, rootView.getChildren().size());
-
-        CanvasViewInfo childView1 = rootView.getChildren().get(0);
-        assertFalse(childView1.isRoot());
-        CanvasViewInfo includedView1 = rootView.getChildren().get(1);
-        assertFalse(includedView1.isRoot());
-        CanvasViewInfo includedView2 = rootView.getChildren().get(2);
-        assertFalse(includedView1.isRoot());
-
-        assertEquals("CheckBox", childView1.getName());
-        assertSame(rootView, childView1.getParent());
-        assertEquals(new Rectangle(10, 10, 49, 19), childView1.getAbsRect());
-        assertEquals(new Rectangle(10, 10, 49, 19), childView1.getSelectionRect());
-        assertSame(childView1.getUiViewNode(), child1Node);
-
-        assertEquals("RelativeLayout", includedView1.getName());
-        assertSame(multiChildNode1, includedView1.getUiViewNode());
-        assertEquals("foo", includedView1.getUiViewNode().getDescriptor().getXmlName());
-        assertSame(multiChildNode2, includedView2.getUiViewNode());
-        assertEquals("AbsoluteLayout", includedView2.getName());
-        assertEquals("bar", includedView2.getUiViewNode().getDescriptor().getXmlName());
-        assertSame(rootView, includedView1.getParent());
-        assertSame(rootView, includedView2.getParent());
-        assertEquals(new Rectangle(10, 30, 69, 4), includedView1.getAbsRect());
-        assertEquals(new Rectangle(10, 30, 69, 5), includedView1.getSelectionRect());
-        assertEquals(new Rectangle(20, 50, 39, -26), includedView2.getAbsRect());
-        assertEquals(new Rectangle(20, 35, 39, 5), includedView2.getSelectionRect());
-        assertEquals(0, includedView1.getChildren().size());
-        assertEquals(0, includedView2.getChildren().size());
-    }
-
-    public void testMerge() throws Exception {
-        boolean layoutlib5 = false;
-
-        // Test rendering of MULTIPLE included views or when there is no simple match
-        // between view info and ui element node children
-
-        UiViewElementNode rootNode = createNode("android.widget.LinearLayout", true);
-        ViewInfo root = new ViewInfo("LinearLayout", rootNode, 10, 10, 100, 100);
-        UiViewElementNode child1Node = createNode(rootNode, "android.widget.Button", false);
-        ViewInfo child1 = new ViewInfo("CheckBox", child1Node, 0, 0, 50, 20);
-        UiViewElementNode multiChildNode = createNode(rootNode, "foo", true);
-        ViewInfo child2 = new ViewInfo("RelativeLayout", null, 0, 20, 70, 25);
-        ViewInfo child3 = new ViewInfo("AbsoluteLayout", null, 10, 40, 50, 15);
-        root.setChildren(Arrays.asList(child1, child2, child3));
-        ViewInfo child21 = new ViewInfo("RadioButton", null, 0, 20, 70, 25);
-        child2.setChildren(Arrays.asList(child21));
-
-        CanvasViewInfo rootView = CanvasViewInfo.create(root, layoutlib5).getFirst();
-        assertNotNull(rootView);
-        assertEquals("LinearLayout", rootView.getName());
-        assertEquals(new Rectangle(10, 10, 89, 89), rootView.getAbsRect());
-        assertEquals(new Rectangle(10, 10, 89, 89), rootView.getSelectionRect());
-        assertNull(rootView.getParent());
-        assertSame(rootNode, rootView.getUiViewNode());
-        assertEquals(2, rootView.getChildren().size());
-
-        CanvasViewInfo childView1 = rootView.getChildren().get(0);
-        CanvasViewInfo includedView = rootView.getChildren().get(1);
-
-        assertEquals("CheckBox", childView1.getName());
-        assertSame(rootView, childView1.getParent());
-        assertEquals(new Rectangle(10, 10, 49, 19), childView1.getAbsRect());
-        assertEquals(new Rectangle(10, 10, 49, 19), childView1.getSelectionRect());
-        assertSame(childView1.getUiViewNode(), child1Node);
-
-        assertEquals("RelativeLayout", includedView.getName());
-        assertSame(rootView, includedView.getParent());
-        assertEquals(new Rectangle(10, 30, 69, 4), includedView.getAbsRect());
-        assertEquals(new Rectangle(10, 30, 69, 5), includedView.getSelectionRect());
-        assertEquals(0, includedView.getChildren().size());
-        assertSame(multiChildNode, includedView.getUiViewNode());
-    }
-
-    public void testInsertMerge() throws Exception {
-        boolean layoutlib5 = false;
-
-        // Test rendering of MULTIPLE included views or when there is no simple match
-        // between view info and ui element node children
-
-        UiViewElementNode mergeNode = createNode("merge", true);
-        UiViewElementNode rootNode = createNode(mergeNode, "android.widget.Button", false);
-        ViewInfo root = new ViewInfo("Button", rootNode, 10, 10, 100, 100);
-
-        CanvasViewInfo rootView = CanvasViewInfo.create(root, layoutlib5).getFirst();
-        assertNotNull(rootView);
-        assertEquals("merge", rootView.getName());
-        assertSame(rootView.getUiViewNode(), mergeNode);
-        assertEquals(new Rectangle(10, 10, 89, 89), rootView.getAbsRect());
-        assertEquals(new Rectangle(10, 10, 89, 89), rootView.getSelectionRect());
-        assertNull(rootView.getParent());
-        assertSame(mergeNode, rootView.getUiViewNode());
-        assertEquals(1, rootView.getChildren().size());
-
-        CanvasViewInfo childView1 = rootView.getChildren().get(0);
-
-        assertEquals("Button", childView1.getName());
-        assertSame(rootView, childView1.getParent());
-        assertEquals(new Rectangle(10, 10, 89, 89), childView1.getAbsRect());
-        assertEquals(new Rectangle(10, 10, 89, 89), childView1.getSelectionRect());
-        assertSame(childView1.getUiViewNode(), rootNode);
-    }
-
-    public void testUnmatchedMissing() throws Exception {
-        boolean layoutlib5 = false;
-
-        UiViewElementNode rootNode = createNode("android.widget.LinearLayout", true);
-        ViewInfo root = new ViewInfo("LinearLayout", rootNode, 0, 0, 100, 100);
-        List<ViewInfo> children = new ArrayList<ViewInfo>();
-        // Should be matched up with corresponding node:
-        Set<Integer> missingKeys = new HashSet<Integer>();
-        // Should not be matched with any views, but should get view created:
-        Set<Integer> extraKeys = new HashSet<Integer>();
-        // Should not be matched with any nodes
-        Set<Integer> extraViews = new HashSet<Integer>();
-        int numViews = 30;
-        missingKeys.add(0);
-        missingKeys.add(4);
-        missingKeys.add(14);
-        missingKeys.add(29);
-        extraKeys.add(9);
-        extraKeys.add(20);
-        extraKeys.add(22);
-        extraViews.add(18);
-        extraViews.add(24);
-
-        List<String> expectedViewNames = new ArrayList<String>();
-        List<String> expectedNodeNames = new ArrayList<String>();
-
-        for (int i = 0; i < numViews; i++) {
-            UiViewElementNode childNode = null;
-            if (!extraViews.contains(i)) {
-                childNode = createNode(rootNode, "childNode" + i, false);
-            }
-            Object cookie = missingKeys.contains(i) || extraViews.contains(i) ? null : childNode;
-            ViewInfo childView = new ViewInfo("childView" + i, cookie,
-                    0, i * 20, 50, (i + 1) * 20);
-            children.add(childView);
-
-            if (!extraViews.contains(i)) {
-                expectedViewNames.add("childView" + i);
-                expectedNodeNames.add("childNode" + i);
-            }
-
-            if (extraKeys.contains(i)) {
-                createNode(rootNode, "extraNodeAt" + i, false);
-
-                expectedViewNames.add("extraNodeAt" + i);
-                expectedNodeNames.add("extraNodeAt" + i);
-            }
-        }
-        root.setChildren(children);
-
-        CanvasViewInfo rootView = CanvasViewInfo.create(root, layoutlib5).getFirst();
-        assertNotNull(rootView);
-
-        // dump(root, 0);
-        // dump(rootView, 0);
-
-        assertEquals("LinearLayout", rootView.getName());
-        assertNull(rootView.getParent());
-        assertSame(rootNode, rootView.getUiViewNode());
-        assertEquals(numViews + extraKeys.size() - extraViews.size(), rootNode.getUiChildren()
-                .size());
-        assertEquals(numViews + extraKeys.size() - extraViews.size(),
-                rootView.getChildren().size());
-        assertEquals(expectedViewNames.size(), rootView.getChildren().size());
-        for (int i = 0, n = rootView.getChildren().size(); i < n; i++) {
-            CanvasViewInfo childView = rootView.getChildren().get(i);
-            String expectedViewName = expectedViewNames.get(i);
-            String expectedNodeName = expectedNodeNames.get(i);
-            assertEquals(expectedViewName, childView.getName());
-            assertNotNull(childView.getUiViewNode());
-            assertEquals(expectedNodeName, childView.getUiViewNode().getDescriptor().getXmlName());
-        }
-    }
-
-    public void testMergeCookies() throws Exception {
-        boolean layoutlib5 = true;
-
-        UiViewElementNode rootNode = createNode("android.widget.LinearLayout", true);
-        ViewInfo root = new ViewInfo("LinearLayout", rootNode, 0, 0, 100, 100);
-
-        // Create the merge cookies in the opposite order to ensure that we don't
-        // apply our own logic when matching up views with nodes
-        LinkedList<MergeCookie> cookies = new LinkedList<MergeCookie>();
-        for (int i = 0; i < 10; i++) {
-            UiViewElementNode node = createNode(rootNode, "childNode" + i, false);
-            cookies.addFirst(new MergeCookie(node));
-        }
-        Iterator<MergeCookie> it = cookies.iterator();
-        ArrayList<ViewInfo> children = new ArrayList<ViewInfo>();
-        for (int i = 0; i < 10; i++) {
-            ViewInfo childView = new ViewInfo("childView" + i, it.next(), 0, i * 20, 50,
-                    (i + 1) * 20);
-            children.add(childView);
-        }
-        root.setChildren(children);
-
-        CanvasViewInfo rootView = CanvasViewInfo.create(root, layoutlib5).getFirst();
-        assertNotNull(rootView);
-
-        assertEquals("LinearLayout", rootView.getName());
-        assertNull(rootView.getParent());
-        assertSame(rootNode, rootView.getUiViewNode());
-        for (int i = 0, n = rootView.getChildren().size(); i < n; i++) {
-            CanvasViewInfo childView = rootView.getChildren().get(i);
-            assertEquals("childView" + i, childView.getName());
-            assertEquals("childNode" + (9 - i), childView.getUiViewNode().getDescriptor()
-                    .getXmlName());
-        }
-    }
-
-    public void testMergeCookies2() throws Exception {
-        boolean layoutlib5 = true;
-
-        UiViewElementNode rootNode = createNode("android.widget.LinearLayout", true);
-        ViewInfo root = new ViewInfo("LinearLayout", rootNode, 0, 0, 100, 100);
-
-        UiViewElementNode node1 = createNode(rootNode, "childNode1", false);
-        UiViewElementNode node2 = createNode(rootNode, "childNode2", false);
-        MergeCookie cookie1 = new MergeCookie(node1);
-        MergeCookie cookie2 = new MergeCookie(node2);
-
-        // Sets alternating merge cookies and checks whether the node sibling lists are
-        // okay and merged correctly
-
-        ArrayList<ViewInfo> children = new ArrayList<ViewInfo>();
-        for (int i = 0; i < 10; i++) {
-            Object cookie = (i % 2) == 0 ? cookie1 : cookie2;
-            ViewInfo childView = new ViewInfo("childView" + i, cookie, 0, i * 20, 50,
-                    (i + 1) * 20);
-            children.add(childView);
-        }
-        root.setChildren(children);
-
-        Pair<CanvasViewInfo, List<Rectangle>> result = CanvasViewInfo.create(root, layoutlib5);
-        CanvasViewInfo rootView = result.getFirst();
-        List<Rectangle> bounds = result.getSecond();
-        assertNull(bounds);
-        assertNotNull(rootView);
-
-        assertEquals("LinearLayout", rootView.getName());
-        assertNull(rootView.getParent());
-        assertSame(rootNode, rootView.getUiViewNode());
-        assertEquals(10, rootView.getChildren().size());
-        assertEquals(2, rootView.getUniqueChildren().size());
-        for (int i = 0, n = rootView.getChildren().size(); i < n; i++) {
-            CanvasViewInfo childView = rootView.getChildren().get(i);
-            assertEquals("childView" + i, childView.getName());
-            Object cookie = (i % 2) == 0 ? node1 : node2;
-            assertSame(cookie, childView.getUiViewNode());
-            List<CanvasViewInfo> nodeSiblings = childView.getNodeSiblings();
-            assertEquals(5, nodeSiblings.size());
-        }
-        List<CanvasViewInfo> nodeSiblings = rootView.getChildren().get(0).getNodeSiblings();
-        for (int j = 0; j < 5; j++) {
-            assertEquals("childView" + (j * 2), nodeSiblings.get(j).getName());
-        }
-        nodeSiblings = rootView.getChildren().get(1).getNodeSiblings();
-        for (int j = 0; j < 5; j++) {
-            assertEquals("childView" + (j * 2 + 1), nodeSiblings.get(j).getName());
-        }
-    }
-
-    public void testIncludeBounds() throws Exception {
-        boolean layoutlib5 = true;
-
-        UiViewElementNode rootNode = createNode("android.widget.LinearLayout", true);
-        ViewInfo root = new ViewInfo("included", null, 0, 0, 100, 100);
-
-        UiViewElementNode node1 = createNode(rootNode, "childNode1", false);
-        UiViewElementNode node2 = createNode(rootNode, "childNode2", false);
-        MergeCookie cookie1 = new MergeCookie(node1);
-        MergeCookie cookie2 = new MergeCookie(node2);
-
-        // Sets alternating merge cookies and checks whether the node sibling lists are
-        // okay and merged correctly
-
-        ArrayList<ViewInfo> children = new ArrayList<ViewInfo>();
-        for (int i = 0; i < 10; i++) {
-            Object cookie = (i % 2) == 0 ? cookie1 : cookie2;
-            ViewInfo childView = new ViewInfo("childView" + i, cookie, 0, i * 20, 50,
-                    (i + 1) * 20);
-            children.add(childView);
-        }
-        root.setChildren(children);
-
-        Pair<CanvasViewInfo, List<Rectangle>> result = CanvasViewInfo.create(root, layoutlib5);
-        CanvasViewInfo rootView = result.getFirst();
-        List<Rectangle> bounds = result.getSecond();
-        assertNotNull(rootView);
-
-        assertEquals("included", rootView.getName());
-        assertNull(rootView.getParent());
-        assertNull(rootView.getUiViewNode());
-        assertEquals(10, rootView.getChildren().size());
-        assertEquals(2, rootView.getUniqueChildren().size());
-        for (int i = 0, n = rootView.getChildren().size(); i < n; i++) {
-            CanvasViewInfo childView = rootView.getChildren().get(i);
-            assertEquals("childView" + i, childView.getName());
-            Object cookie = (i % 2) == 0 ? node1 : node2;
-            assertSame(cookie, childView.getUiViewNode());
-            List<CanvasViewInfo> nodeSiblings = childView.getNodeSiblings();
-            assertEquals(5, nodeSiblings.size());
-        }
-        List<CanvasViewInfo> nodeSiblings = rootView.getChildren().get(0).getNodeSiblings();
-        for (int j = 0; j < 5; j++) {
-            assertEquals("childView" + (j * 2), nodeSiblings.get(j).getName());
-        }
-        nodeSiblings = rootView.getChildren().get(1).getNodeSiblings();
-        for (int j = 0; j < 5; j++) {
-            assertEquals("childView" + (j * 2 + 1), nodeSiblings.get(j).getName());
-        }
-
-        // Only show the primary bounds as included
-        assertEquals(2, bounds.size());
-        assertEquals(new Rectangle(0, 0, 49, 19), bounds.get(0));
-        assertEquals(new Rectangle(0, 20, 49, 19), bounds.get(1));
-    }
-
-    public void testIncludeBounds2() throws Exception {
-        includeBounds2(false);
-    }
-
-    public void testIncludeBounds2LayoutLib5() throws Exception {
-        includeBounds2(true);
-    }
-
-    public void includeBounds2(boolean layoutlib5) throws Exception {
-
-        UiViewElementNode rootNode = createNode("android.widget.LinearLayout", true);
-        ViewInfo root = new ViewInfo("included", null, 0, 0, 100, 100);
-
-        UiViewElementNode node1 = createNode(rootNode, "childNode1", false);
-        UiViewElementNode node2 = createNode(rootNode, "childNode2", false);
-
-        ViewInfo childView1 = new ViewInfo("childView1", node1, 0, 20, 50, 40);
-        ViewInfo childView2 = new ViewInfo("childView2", node2, 0, 40, 50, 60);
-
-        root.setChildren(Arrays.asList(childView1, childView2));
-
-        Pair<CanvasViewInfo, List<Rectangle>> result = CanvasViewInfo.create(root, layoutlib5);
-        CanvasViewInfo rootView = result.getFirst();
-        List<Rectangle> bounds = result.getSecond();
-        assertNotNull(rootView);
-
-        assertEquals("included", rootView.getName());
-        assertNull(rootView.getParent());
-        assertNull(rootView.getUiViewNode());
-        assertEquals(2, rootView.getChildren().size());
-        assertEquals(2, rootView.getUniqueChildren().size());
-
-        Rectangle bounds1 = bounds.get(0);
-        Rectangle bounds2 = bounds.get(1);
-        assertEquals(new Rectangle(0, 20, 49, 19), bounds1);
-        assertEquals(new Rectangle(0, 40, 49, 19), bounds2);
-    }
-
-    public void testCookieWorkaround() throws Exception {
-        UiViewElementNode rootNode = createNode("android.widget.LinearLayout", true);
-        ViewInfo root = new ViewInfo("included", null, 0, 0, 100, 100);
-
-        UiViewElementNode node2 = createNode(rootNode, "childNode2", false);
-        MergeCookie mergeCookie = new MergeCookie(root);
-
-        ViewInfo childView1 = new ViewInfo("childView1", mergeCookie, 0, 20, 50, 40);
-        ViewInfo childView2 = new ViewInfo("childView2", node2, 0, 40, 50, 60);
-
-        root.setChildren(Arrays.asList(childView1, childView2));
-
-        Pair<CanvasViewInfo, List<Rectangle>> result = CanvasViewInfo.create(root, true);
-        CanvasViewInfo rootView = result.getFirst();
-        List<Rectangle> bounds = result.getSecond();
-        assertNotNull(rootView);
-
-        assertEquals("included", rootView.getName());
-        assertNull(rootView.getParent());
-        assertNull(rootView.getUiViewNode());
-        // childView1 should have been removed since it has the wrong merge cookie
-        assertEquals(1, rootView.getChildren().size());
-        assertEquals(1, rootView.getUniqueChildren().size());
-
-        Rectangle bounds1 = bounds.get(0);
-        assertEquals(new Rectangle(0, 40, 49, 19), bounds1);
-    }
-
-    public void testGestureOverlayView() throws Exception {
-        boolean layoutlib5 = true;
-
-        // Test rendering of included views on layoutlib 5+ (e.g. has <include> tag)
-
-        UiViewElementNode rootNode = createNode("android.gesture.GestureOverlayView", true);
-        UiViewElementNode childNode = createNode(rootNode, "android.widget.LinearLayout", false);
-        UiViewElementNode grandChildNode = createNode(childNode, "android.widget.Button", false);
-        ViewInfo root = new ViewInfo("GestureOverlayView", rootNode, 10, 10, 100, 100);
-        ViewInfo child = new ViewInfo("LinearLayout", childNode, 0, 0, 50, 20);
-        root.setChildren(Collections.singletonList(child));
-        ViewInfo grandChild = new ViewInfo("Button", grandChildNode, 0, 20, 70, 25);
-        child.setChildren(Collections.singletonList(grandChild));
-        CanvasViewInfo rootView = CanvasViewInfo.create(root, layoutlib5).getFirst();
-        assertNotNull(rootView);
-        assertEquals("GestureOverlayView", rootView.getName());
-
-        assertTrue(rootView.isRoot());
-        assertNull(rootView.getParent());
-        assertSame(rootNode, rootView.getUiViewNode());
-        assertEquals(1, rootView.getChildren().size());
-
-        CanvasViewInfo childView = rootView.getChildren().get(0);
-        assertEquals("LinearLayout", childView.getName());
-
-        // This should also be a root for the special case that the root is
-        assertTrue(childView.isRoot());
-
-        assertEquals(1, childView.getChildren().size());
-        CanvasViewInfo grandChildView = childView.getChildren().get(0);
-        assertEquals("Button", grandChildView.getName());
-        assertFalse(grandChildView.isRoot());
-    }
-
-    public void testListView() throws Exception {
-        // For ListViews we get AdapterItemReferences as cookies. Ensure that this
-        // works properly.
-        //
-        // android.widget.FrameLayout [0,50,320,480] <FrameLayout>
-        //     android.widget.ListView [0,0,320,430] <ListView>
-        //        android.widget.LinearLayout [0,0,320,17] SessionParams$AdapterItemReference
-        //            android.widget.TextView [0,0,73,17]
-        //        android.widget.LinearLayout [0,18,320,35] SessionParams$AdapterItemReference
-        //            android.widget.TextView [0,0,73,17]
-        //        android.widget.LinearLayout [0,36,320,53] SessionParams$AdapterItemReference
-        //            android.widget.TextView [0,0,73,17]
-        //        ...
-
-        UiViewElementNode rootNode = createNode("FrameLayout", true);
-        UiViewElementNode childNode = createNode(rootNode, "ListView", false);
-        /*UiViewElementNode grandChildNode =*/ createNode(childNode, "LinearLayout", false);
-        /*UiViewElementNode greatGrandChildNode =*/ createNode(childNode, "TextView", false);
-        DataBindingItem dataBindingItem = new DataBindingItem("foo");
-
-        ViewInfo root = new ViewInfo("FrameLayout", rootNode, 0, 50, 320, 480);
-        ViewInfo child = new ViewInfo("ListView", childNode, 0, 0, 320, 430);
-        root.setChildren(Collections.singletonList(child));
-        ViewInfo grandChild = new ViewInfo("LinearLayout", dataBindingItem, 0, 0, 320, 17);
-        child.setChildren(Collections.singletonList(grandChild));
-        ViewInfo greatGrandChild = new ViewInfo("Button", null, 0, 0, 73, 17);
-        grandChild.setChildren(Collections.singletonList(greatGrandChild));
-        CanvasViewInfo rootView = CanvasViewInfo.create(root, true /*layoutlib5*/).getFirst();
-        assertNotNull(rootView);
-
-        assertEquals("FrameLayout", rootView.getName());
-        assertEquals(1, rootView.getChildren().size());
-        assertSame(rootNode, rootView.getUiViewNode());
-
-        CanvasViewInfo childView = rootView.getChildren().get(0);
-        assertEquals("ListView", childView.getName());
-        assertEquals(0, childView.getChildren().size());
-        assertSame(childNode, childView.getUiViewNode());
-    }
-
-    /**
-     * Dumps out the given {@link ViewInfo} hierarchy to standard out.
-     * Useful during development.
-     *
-     * @param graphicalEditor the editor associated with this hierarchy
-     * @param root the root of the {@link ViewInfo} hierarchy
-     */
-    public static void dump(GraphicalEditorPart graphicalEditor, ViewInfo root) {
-        System.out.println("\n\nRendering:");
-        boolean supportsEmbedding = graphicalEditor.renderingSupports(Capability.EMBEDDED_LAYOUT);
-        System.out.println("Supports Embedded Layout=" + supportsEmbedding);
-        System.out.println("Rendering context=" + graphicalEditor.getIncludedWithin());
-        dump(root, 0);
-    }
-
-    /** Helper for {@link #dump(GraphicalEditorPart, ViewInfo)} */
-    public static void dump(ViewInfo info, int depth) {
-        StringBuilder sb = new StringBuilder();
-        for (int i = 0; i < depth; i++) {
-            sb.append("    ");
-        }
-        sb.append(info.getClassName());
-        sb.append(" [");
-        sb.append(info.getLeft());
-        sb.append(",");
-        sb.append(info.getTop());
-        sb.append(",");
-        sb.append(info.getRight());
-        sb.append(",");
-        sb.append(info.getBottom());
-        sb.append("] ");
-        Object cookie = info.getCookie();
-        if (cookie instanceof UiViewElementNode) {
-            sb.append(" ");
-            UiViewElementNode node = (UiViewElementNode) cookie;
-            sb.append("<");
-            sb.append(node.getDescriptor().getXmlName());
-            sb.append("> ");
-        } else if (cookie != null) {
-            sb.append(" cookie=" + cookie);
-        }
-
-        System.out.println(sb.toString());
-
-        for (ViewInfo child : info.getChildren()) {
-            dump(child, depth + 1);
-        }
-    }
-
-    /** Helper for {@link #dump(GraphicalEditorPart, ViewInfo)} */
-    public static void dump(CanvasViewInfo info, int depth) {
-        StringBuilder sb = new StringBuilder();
-        for (int i = 0; i < depth; i++) {
-            sb.append("    ");
-        }
-        sb.append(info.getName());
-        sb.append(" [");
-        sb.append(info.getAbsRect());
-        sb.append("], node=");
-        sb.append(info.getUiViewNode());
-
-        System.out.println(sb.toString());
-
-        for (CanvasViewInfo child : info.getChildren()) {
-            dump(child, depth + 1);
-        }
-    }
-
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/adt/internal/editors/layout/gle2/ControlPointTest.java b/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/adt/internal/editors/layout/gle2/ControlPointTest.java
deleted file mode 100644
index 366691e..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/adt/internal/editors/layout/gle2/ControlPointTest.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * Copyright (C) 2010 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.editors.layout.gle2;
-
-import org.eclipse.swt.events.MouseEvent;
-
-public class ControlPointTest extends PointTestCases {
-    public void testCreateFromMouseEvent() throws Exception {
-        MouseEvent mouseEvent = canvasMouseEvent(10, 20, 0);
-
-        ControlPoint point = ControlPoint.create(mCanvas, mouseEvent);
-        assertEquals(10, point.x);
-        assertEquals(20, point.y);
-    }
-
-    public void testCreateFromCoordinates() throws Exception {
-        ControlPoint point = ControlPoint.create(mCanvas, 10, 20);
-        assertEquals(10, point.x);
-        assertEquals(20, point.y);
-    }
-
-    public void testConvertToLayout() throws Exception {
-        ControlPoint point = ControlPoint.create(new TestLayoutCanvas(), 10, 20);
-        assertEquals(10, point.x);
-        assertEquals(20, point.y);
-
-        LayoutPoint layoutPoint = point.toLayout();
-        assertNotNull(layoutPoint);
-        assertEquals(40, layoutPoint.x);
-        assertEquals(60, layoutPoint.y);
-
-        // For sanity let's also convert back and verify
-        ControlPoint controlPoint = layoutPoint.toControl();
-        assertNotNull(controlPoint);
-        assertNotSame(controlPoint, point);
-        assertEquals(point, controlPoint);
-        assertEquals(10, controlPoint.x);
-        assertEquals(20, controlPoint.y);
-    }
-
-    public void testEquals() throws Exception {
-        ControlPoint point1 = ControlPoint.create(mCanvas, 1, 1);
-        ControlPoint point2 = ControlPoint.create(mCanvas, 1, 2);
-        ControlPoint point3 = ControlPoint.create(mCanvas, 2, 1);
-        ControlPoint point2b = ControlPoint.create(mCanvas, 1, 2);
-
-        assertFalse(point2.equals(null));
-
-        assertEquals(point2, point2);
-        assertEquals(point2, point2b);
-        assertEquals(point2.hashCode(), point2b.hashCode());
-        assertNotSame(point2, point2b);
-
-        assertFalse(point1.equals(point2));
-        assertFalse(point1.equals(point3));
-        assertFalse(point2.equals(point3));
-        assertFalse(point1.equals(point2));
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/adt/internal/editors/layout/gle2/DomUtilitiesTest.java b/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/adt/internal/editors/layout/gle2/DomUtilitiesTest.java
deleted file mode 100644
index 6576bea..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/adt/internal/editors/layout/gle2/DomUtilitiesTest.java
+++ /dev/null
@@ -1,206 +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.eclipse.adt.internal.editors.layout.gle2;
-
-import static com.android.SdkConstants.ANDROID_URI;
-import static com.android.SdkConstants.TOOLS_URI;
-
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-
-import java.util.Arrays;
-
-import javax.xml.parsers.DocumentBuilder;
-import javax.xml.parsers.DocumentBuilderFactory;
-
-import junit.framework.TestCase;
-
-@SuppressWarnings("javadoc")
-public class DomUtilitiesTest extends TestCase {
-
-    public void testIsEquivalent() throws Exception {
-        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
-        factory.setNamespaceAware(true);
-        factory.setValidating(false);
-        DocumentBuilder builder = factory.newDocumentBuilder();
-        Document document1 = builder.newDocument();
-        Document document2 = builder.newDocument();
-        document1.appendChild(document1.createElement("root"));
-        document2.appendChild(document2.createElement("root"));
-
-        assertFalse(DomUtilities.isEquivalent(null, null));
-        Element root1 = document1.getDocumentElement();
-        assertFalse(DomUtilities.isEquivalent(null, root1));
-        Element root2 = document2.getDocumentElement();
-        assertFalse(DomUtilities.isEquivalent(root2, null));
-        assertTrue(DomUtilities.isEquivalent(root1, root2));
-
-        root1.appendChild(document1.createTextNode("    "));
-        // Differences in text are NOT significant!
-        assertTrue(DomUtilities.isEquivalent(root1, root2));
-        root2.appendChild(document2.createTextNode("    "));
-        assertTrue(DomUtilities.isEquivalent(root1, root2));
-
-        Element foo1 = document1.createElement("foo");
-        Element foo2 = document2.createElement("foo");
-        root1.appendChild(foo1);
-        assertFalse(DomUtilities.isEquivalent(root1, root2));
-        root2.appendChild(foo2);
-        assertTrue(DomUtilities.isEquivalent(root1, root2));
-
-        root1.appendChild(document1.createElement("bar"));
-        assertFalse(DomUtilities.isEquivalent(root1, root2));
-        root2.appendChild(document2.createElement("bar"));
-        assertTrue(DomUtilities.isEquivalent(root1, root2));
-
-        // Add attributes in opposite order
-        foo1.setAttribute("attribute1", "value1");
-        foo1.setAttribute("attribute2", "value2");
-        assertFalse(DomUtilities.isEquivalent(root1, root2));
-        foo2.setAttribute("attribute2", "value2");
-        foo2.setAttribute("attribute1", "valueWrong");
-        assertFalse(DomUtilities.isEquivalent(root1, root2));
-        foo2.setAttribute("attribute1", "value1");
-        assertTrue(DomUtilities.isEquivalent(root1, root2));
-        foo2.setAttributeNS(TOOLS_URI, "foo", "bar");
-        assertTrue(DomUtilities.isEquivalent(root1, root2));
-        foo2.setAttributeNS(ANDROID_URI, "foo", "bar");
-        assertFalse(DomUtilities.isEquivalent(root1, root2));
-
-        // TODO - test different tag names
-        // TODO - test different name spaces!
-    }
-
-    public void testIsContiguous() throws Exception {
-        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
-        factory.setNamespaceAware(true);
-        factory.setValidating(false);
-        DocumentBuilder builder = factory.newDocumentBuilder();
-        Document document = builder.newDocument();
-        document.appendChild(document.createElement("root"));
-        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);
-
-        assertTrue(DomUtilities.isContiguous(Arrays.asList(foo)));
-        assertTrue(DomUtilities.isContiguous(Arrays.asList(foo, bar)));
-        assertTrue(DomUtilities.isContiguous(Arrays.asList(foo, bar, baz)));
-        assertTrue(DomUtilities.isContiguous(Arrays.asList(foo, bar, baz)));
-        assertTrue(DomUtilities.isContiguous(Arrays.asList(bar, baz, foo)));
-        assertTrue(DomUtilities.isContiguous(Arrays.asList(baz, bar, foo)));
-        assertTrue(DomUtilities.isContiguous(Arrays.asList(baz, foo, bar)));
-
-        assertFalse(DomUtilities.isContiguous(Arrays.asList(foo, baz)));
-        assertFalse(DomUtilities.isContiguous(Arrays.asList(root, baz)));
-    }
-
-    public void testGetCommonAncestor() throws Exception {
-        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
-        factory.setNamespaceAware(true);
-        factory.setValidating(false);
-        DocumentBuilder builder = factory.newDocumentBuilder();
-        Document document = builder.newDocument();
-
-        //            A
-        //          /   \
-        //         B     C
-        //              / \
-        //             D   E
-
-        document.appendChild(document.createElement("A"));
-        Element a = document.getDocumentElement();
-        assertSame(a, DomUtilities.getCommonAncestor(a, a));
-
-        Element b = document.createElement("B");
-        a.appendChild(b);
-        Element c = document.createElement("C");
-        a.appendChild(c);
-        Element d = document.createElement("D");
-        c.appendChild(d);
-        Element e = document.createElement("E");
-        c.appendChild(e);
-
-        assertSame(a, DomUtilities.getCommonAncestor(a, b));
-        assertSame(a, DomUtilities.getCommonAncestor(b, a));
-        assertSame(a, DomUtilities.getCommonAncestor(b, c));
-        assertSame(a, DomUtilities.getCommonAncestor(b, d));
-        assertSame(a, DomUtilities.getCommonAncestor(b, e));
-        assertSame(a, DomUtilities.getCommonAncestor(a, e));
-
-        assertSame(c, DomUtilities.getCommonAncestor(d, e));
-        assertSame(c, DomUtilities.getCommonAncestor(c, e));
-        assertSame(c, DomUtilities.getCommonAncestor(d, c));
-        assertSame(c, DomUtilities.getCommonAncestor(c, c));
-    }
-
-    public void testGetDepth() throws Exception {
-        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
-        factory.setNamespaceAware(true);
-        factory.setValidating(false);
-        DocumentBuilder builder = factory.newDocumentBuilder();
-        Document document = builder.newDocument();
-
-        //            A
-        //          /   \
-        //         B     C
-        //              / \
-        //             D   E
-
-        document.appendChild(document.createElement("A"));
-        Element a = document.getDocumentElement();
-        assertSame(a, DomUtilities.getCommonAncestor(a, a));
-        Element b = document.createElement("B");
-        a.appendChild(b);
-        Element c = document.createElement("C");
-        a.appendChild(c);
-        Element d = document.createElement("D");
-        c.appendChild(d);
-        Element e = document.createElement("E");
-        c.appendChild(e);
-
-        assertEquals(0, DomUtilities.getDepth(document));
-
-        assertEquals(1, DomUtilities.getDepth(a));
-        assertEquals(2, DomUtilities.getDepth(b));
-        assertEquals(2, DomUtilities.getDepth(c));
-        assertEquals(3, DomUtilities.getDepth(d));
-        assertEquals(3, DomUtilities.getDepth(e));
-    }
-
-    public void testHasChildren() throws Exception {
-        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
-        factory.setNamespaceAware(true);
-        factory.setValidating(false);
-        DocumentBuilder builder = factory.newDocumentBuilder();
-        Document document = builder.newDocument();
-        assertFalse(DomUtilities.hasElementChildren(document));
-        document.appendChild(document.createElement("A"));
-        Element a = document.getDocumentElement();
-        assertFalse(DomUtilities.hasElementChildren(a));
-        a.appendChild(document.createTextNode("foo"));
-        assertFalse(DomUtilities.hasElementChildren(a));
-        Element b = document.createElement("B");
-        a.appendChild(b);
-        assertTrue(DomUtilities.hasElementChildren(a));
-        assertFalse(DomUtilities.hasElementChildren(b));
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/adt/internal/editors/layout/gle2/ImageUtilsTest.java b/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/adt/internal/editors/layout/gle2/ImageUtilsTest.java
deleted file mode 100644
index d1c56c2..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/adt/internal/editors/layout/gle2/ImageUtilsTest.java
+++ /dev/null
@@ -1,368 +0,0 @@
-/*
- * Copyright (C) 2010 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.editors.layout.gle2;
-
-import com.android.ide.common.api.Rect;
-
-import org.eclipse.swt.graphics.RGB;
-import org.eclipse.swt.graphics.Rectangle;
-
-import java.awt.Color;
-import java.awt.Graphics;
-import java.awt.Graphics2D;
-import java.awt.image.BufferedImage;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
-
-import junit.framework.TestCase;
-
-@SuppressWarnings("javadoc")
-public class ImageUtilsTest extends TestCase {
-    public void testCropBlank() throws Exception {
-        BufferedImage image = new BufferedImage(100, 100, BufferedImage.TYPE_INT_ARGB_PRE);
-        Graphics g = image.getGraphics();
-        g.setColor(new Color(0, true));
-        g.fillRect(0, 0, image.getWidth(), image.getHeight());
-        g.dispose();
-
-        BufferedImage crop = ImageUtils.cropBlank(image, null);
-        assertNull(crop);
-    }
-
-    public void testCropBlankPre() throws Exception {
-        BufferedImage image = new BufferedImage(100, 100, BufferedImage.TYPE_INT_ARGB_PRE);
-        Graphics g = image.getGraphics();
-        g.setColor(new Color(0, true));
-        g.fillRect(0, 0, image.getWidth(), image.getHeight());
-        g.dispose();
-
-        BufferedImage crop = ImageUtils.cropBlank(image, new Rect(5, 5, 80, 80));
-        assertNull(crop);
-    }
-
-    public void testCropNonblank() throws Exception {
-        BufferedImage image = new BufferedImage(100, 100, BufferedImage.TYPE_INT_ARGB_PRE);
-        Graphics g = image.getGraphics();
-        g.setColor(new Color(0, false));
-        g.fillRect(0, 0, image.getWidth(), image.getHeight());
-        g.dispose();
-
-        BufferedImage crop = ImageUtils.cropBlank(image, null);
-        assertNotNull(crop);
-        assertEquals(image.getWidth(), crop.getWidth());
-        assertEquals(image.getHeight(), crop.getHeight());
-    }
-
-    public void testCropSomething() throws Exception {
-        BufferedImage image = new BufferedImage(100, 100, BufferedImage.TYPE_INT_ARGB_PRE);
-        Graphics g = image.getGraphics();
-        g.setColor(new Color(0, true));
-        g.fillRect(0, 0, image.getWidth(), image.getHeight());
-        g.setColor(new Color(0xFF00FF00, true));
-        g.fillRect(25, 25, 50, 50);
-        g.dispose();
-
-        BufferedImage crop = ImageUtils.cropBlank(image, null);
-        assertNotNull(crop);
-        assertEquals(50, crop.getWidth());
-        assertEquals(50, crop.getHeight());
-        assertEquals(0xFF00FF00, crop.getRGB(0, 0));
-        assertEquals(0xFF00FF00, crop.getRGB(49, 49));
-    }
-
-    public void testCropSomethingPre() throws Exception {
-        BufferedImage image = new BufferedImage(100, 100, BufferedImage.TYPE_INT_ARGB_PRE);
-        Graphics g = image.getGraphics();
-        g.setColor(new Color(0, true));
-        g.fillRect(0, 0, image.getWidth(), image.getHeight());
-        g.setColor(new Color(0xFF00FF00, true));
-        g.fillRect(25, 25, 50, 50);
-        g.dispose();
-
-        BufferedImage crop = ImageUtils.cropBlank(image, new Rect(0, 0, 100, 100));
-        assertNotNull(crop);
-        assertEquals(50, crop.getWidth());
-        assertEquals(50, crop.getHeight());
-        assertEquals(0xFF00FF00, crop.getRGB(0, 0));
-        assertEquals(0xFF00FF00, crop.getRGB(49, 49));
-    }
-
-    public void testCropSomethingPre2() throws Exception {
-        BufferedImage image = new BufferedImage(100, 100, BufferedImage.TYPE_INT_ARGB_PRE);
-        Graphics g = image.getGraphics();
-        g.setColor(new Color(0, true));
-        g.fillRect(0, 0, image.getWidth(), image.getHeight());
-        g.setColor(new Color(0xFF00FF00, true));
-        g.fillRect(25, 25, 50, 50);
-        g.dispose();
-
-        BufferedImage crop = ImageUtils.cropBlank(image, new Rect(5, 5, 80, 80));
-        assertNotNull(crop);
-        assertEquals(50, crop.getWidth());
-        assertEquals(50, crop.getHeight());
-        assertEquals(0xFF00FF00, crop.getRGB(0, 0));
-        assertEquals(0xFF00FF00, crop.getRGB(49, 49));
-    }
-
-    public void testCropColor() throws Exception {
-        BufferedImage image = new BufferedImage(100, 100, BufferedImage.TYPE_INT_ARGB_PRE);
-        Graphics g = image.getGraphics();
-        g.setColor(new Color(0xFF00FF00, true));
-        g.fillRect(0, 0, image.getWidth(), image.getHeight());
-        g.dispose();
-
-        BufferedImage crop = ImageUtils.cropColor(image, 0xFF00FF00, null);
-        assertNull(crop);
-    }
-
-    public void testCropNonColor() throws Exception {
-        BufferedImage image = new BufferedImage(100, 100, BufferedImage.TYPE_INT_ARGB_PRE);
-        Graphics g = image.getGraphics();
-        g.setColor(new Color(0xFF00FF00, true));
-        g.fillRect(0, 0, image.getWidth(), image.getHeight());
-        g.dispose();
-
-        BufferedImage crop = ImageUtils.cropColor(image, 0xFFFF0000, null);
-        assertNotNull(crop);
-        assertEquals(image.getWidth(), crop.getWidth());
-        assertEquals(image.getHeight(), crop.getHeight());
-    }
-
-    public void testCropColorSomething() throws Exception {
-        BufferedImage image = new BufferedImage(100, 100, BufferedImage.TYPE_INT_ARGB_PRE);
-        Graphics g = image.getGraphics();
-        g.setColor(new Color(0xFF00FF00, true));
-        g.fillRect(0, 0, image.getWidth(), image.getHeight());
-        g.setColor(new Color(0xFFFF0000, true));
-        g.fillRect(25, 25, 50, 50);
-        g.dispose();
-
-        BufferedImage crop = ImageUtils.cropColor(image, 0xFF00FF00, null);
-        assertEquals(50, crop.getWidth());
-        assertEquals(50, crop.getHeight());
-        assertEquals(0xFFFF0000, crop.getRGB(0, 0));
-        assertEquals(0xFFFF0000, crop.getRGB(49, 49));
-    }
-
-    public void testNothingTodo() throws Exception {
-        BufferedImage image = new BufferedImage(100, 100, BufferedImage.TYPE_INT_ARGB_PRE);
-        Graphics g = image.getGraphics();
-        g.setColor(new Color(0xFF00FF00, true));
-        g.fillRect(0, 0, image.getWidth(), image.getHeight());
-        g.dispose();
-
-        BufferedImage crop = ImageUtils.cropColor(image, 0xFFFF0000, new Rect(40, 40, 0, 0));
-        assertNull(crop);
-    }
-
-    public void testContainsDarkPixels() throws Exception {
-        BufferedImage image = new BufferedImage(100, 100, BufferedImage.TYPE_INT_ARGB_PRE);
-        Graphics g = image.getGraphics();
-        g.setColor(new Color(0, true));
-        g.fillRect(0, 0, image.getWidth(), image.getHeight());
-        g.dispose();
-
-        assertFalse(ImageUtils.containsDarkPixels(image));
-
-        image.setRGB(50, 50, 0xFFFFFFFF);
-        assertFalse(ImageUtils.containsDarkPixels(image));
-        image.setRGB(50, 50, 0xFFAAAAAA);
-        assertFalse(ImageUtils.containsDarkPixels(image));
-        image.setRGB(50, 50, 0xFF00FF00);
-        assertFalse(ImageUtils.containsDarkPixels(image));
-        image.setRGB(50, 50, 0xFFFF8800);
-        assertFalse(ImageUtils.containsDarkPixels(image));
-        image.setRGB(50, 50, 0xFF333333);
-        assertTrue(ImageUtils.containsDarkPixels(image));
-
-    }
-
-    public void testGetBoundingRectangle() {
-        assertEquals(null, ImageUtils.getBoundingRectangle(Collections.<Rectangle> emptyList()));
-
-        assertEquals(new Rectangle(1, 2, 3, 4), ImageUtils.getBoundingRectangle(Arrays
-                .asList(new Rectangle(1, 2, 3, 4))));
-        assertEquals(new Rectangle(1, 2, 3, 4), ImageUtils.getBoundingRectangle(Arrays
-                .asList(new Rectangle(1, 2, 3, 4), new Rectangle(1, 2, 1, 1))));
-        assertEquals(new Rectangle(5, 5, 25, 25), ImageUtils.getBoundingRectangle(Arrays.asList(
-                new Rectangle(10, 10, 20, 20), new Rectangle(5, 5, 1, 1))));
-    }
-
-    /**
-     * Paints a set of {@link Rectangle} object out of a rendered {@link BufferedImage}
-     * such that the resulting image is transparent except for a minimum bounding
-     * rectangle of the selected elements.
-     *
-     * @param image the source image
-     * @param rectangles the set of rectangles to copy
-     * @param boundingBox the bounding rectangle of the set of rectangles to copy, can be
-     *            computed by {@link ImageUtils#getBoundingRectangle}
-     * @param scale a scale factor to apply to the result, e.g. 0.5 to shrink the
-     *            destination down 50%, 1.0 to leave it alone and 2.0 to zoom in by
-     *            doubling the image size
-     * @return a rendered image, or null
-     */
-    public static BufferedImage drawRectangles(BufferedImage image,
-            List<Rectangle> rectangles, Rectangle boundingBox, double scale) {
-
-        // This code is not a test. When I implemented image cropping, I first implemented
-        // it for BufferedImages (since it's easier; easy image painting, easy scaling,
-        // easy transparency handling, etc). However, this meant that we would need to
-        // convert the SWT images from the ImageOverlay to BufferedImages, crop and convert
-        // back; not ideal, so I rewrote it in SWT (see SwtUtils). However, I
-        // don't want to throw away the code in case we start keeping BufferedImages rather
-        // than SWT images or need it for other purposes, but rather than place it in the
-        // production codebase I'm leaving this utility here in the associated ImageUtils
-        // test class. It was used like this:
-        // @formatter:off
-        //
-        //    BufferedImage wholeImage = SwtUtils.convertToAwt(image);
-        //    BufferedImage result = ImageUtils.cropSelection(wholeImage,
-        //        rectangles, boundingBox, scale);
-        //    e.image = SwtUtils.convertToSwt(image.getDevice(), result, true,
-        //        DRAG_TRANSPARENCY);
-        //
-        // @formatter:on
-
-        if (boundingBox == null) {
-            return null;
-        }
-
-        int destWidth = (int) (scale * boundingBox.width);
-        int destHeight = (int) (scale * boundingBox.height);
-        BufferedImage dest = new BufferedImage(destWidth, destHeight, image.getType());
-
-        Graphics2D g = dest.createGraphics();
-
-        for (Rectangle bounds : rectangles) {
-            int dx1 = bounds.x - boundingBox.x;
-            int dy1 = bounds.y - boundingBox.y;
-            int dx2 = dx1 + bounds.width;
-            int dy2 = dy1 + bounds.height;
-
-            dx1 *= scale;
-            dy1 *= scale;
-            dx2 *= scale;
-            dy2 *= scale;
-
-            int sx1 = bounds.x;
-            int sy1 = bounds.y;
-            int sx2 = sx1 + bounds.width;
-            int sy2 = sy1 + bounds.height;
-
-            g.drawImage(image, dx1, dy1, dx2, dy2, sx1, sy1, sx2, sy2, null);
-        }
-
-        g.dispose();
-
-        return dest;
-    }
-
-    public void testSubImage() throws Exception {
-        BufferedImage image = new BufferedImage(100, 100, BufferedImage.TYPE_INT_ARGB_PRE);
-        Graphics g = image.getGraphics();
-        g.setColor(new Color(0xFF00FF00, true));
-        g.fillRect(0, 0, image.getWidth(), image.getHeight());
-        g.setColor(new Color(0xFFFF0000, true));
-        g.fillRect(25, 25, 50, 50);
-        g.dispose();
-
-        BufferedImage sub = ImageUtils.subImage(image, 25, 25, 35, 45);
-        assertEquals(10, sub.getWidth());
-        assertEquals(20, sub.getHeight());
-        assertEquals(0xFFFF0000, sub.getRGB(0, 0));
-        assertEquals(0xFFFF0000, sub.getRGB(9, 9));
-
-        sub = ImageUtils.subImage(image, 23, 23, 23 + 5, 23 + 5);
-        assertEquals(5, sub.getWidth());
-        assertEquals(5, sub.getHeight());
-        assertEquals(0xFF00FF00, sub.getRGB(0, 0));
-        assertEquals(0xFFFF0000, sub.getRGB(4, 4));
-    }
-
-    public void testGetColor() throws Exception {
-        assertEquals(0xFF000000, ImageUtils.getColor("#000"));
-        assertEquals(0xFF000000, ImageUtils.getColor("#000000"));
-        assertEquals(0xABCDEF91, ImageUtils.getColor("#ABCDEF91"));
-    }
-
-    public void testGetBrightness() throws Exception {
-        assertEquals(96, ImageUtils.getBrightness(0x456789));
-        assertEquals(198, ImageUtils.getBrightness(0xABCDEF));
-
-        assertEquals(0, ImageUtils.getBrightness(0x0));
-        assertEquals(255, ImageUtils.getBrightness(0xFFFFFF));
-        assertEquals(299*255/1000, ImageUtils.getBrightness(0xFF0000));
-        assertEquals(587*255/1000, ImageUtils.getBrightness(0x00FF00));
-        assertEquals(114*255/1000, ImageUtils.getBrightness(0x0000FF));
-    }
-
-    public void testColorConversion() throws Exception {
-        assertEquals(0, ImageUtils.rgbToInt(ImageUtils.intToRgb(0), 0));
-        assertEquals(0xFFFFFFFF, ImageUtils.rgbToInt(ImageUtils.intToRgb(0xFFFFFF), 0xFF));
-        assertEquals(0x12345678, ImageUtils.rgbToInt(ImageUtils.intToRgb(0x345678), 0x12));
-    }
-
-    public void testScaleImage() throws Exception {
-        BufferedImage image = new BufferedImage(100, 100, BufferedImage.TYPE_INT_ARGB_PRE);
-        Graphics g = image.getGraphics();
-        g.setColor(new Color(0xFF00FF00, true));
-        g.fillRect(0, 0, image.getWidth(), image.getHeight());
-        g.setColor(new Color(0xFFFF0000, true));
-        g.fillRect(25, 25, 50, 50);
-        g.dispose();
-
-        BufferedImage scaled = ImageUtils.scale(image, 0.5, 0.5);
-        assertEquals(50, scaled.getWidth());
-        assertEquals(50, scaled.getHeight());
-        assertEquals(0xFF00FF00, scaled.getRGB(0, 0));
-        assertEquals(0xFF00FF00, scaled.getRGB(49, 49));
-        assertEquals(0xFFFF0000, scaled.getRGB(25, 25));
-
-        scaled = ImageUtils.scale(image, 2.0, 2.0);
-        assertEquals(200, scaled.getWidth());
-        assertEquals(200, scaled.getHeight());
-        assertEquals(0xFF00FF00, scaled.getRGB(0, 0));
-        assertEquals(0xFF00FF00, scaled.getRGB(48, 48));
-        assertEquals(0xFFFF0000, scaled.getRGB(100, 100));
-        assertEquals(0xFF00FF00, scaled.getRGB(199, 199));
-
-        scaled = ImageUtils.scale(image, 0.25, 0.25);
-        assertEquals(25, scaled.getWidth());
-        assertEquals(25, scaled.getHeight());
-        assertEquals(0xFF00FF00, scaled.getRGB(0, 0));
-        assertEquals(0xFF00FF00, scaled.getRGB(24, 24));
-        assertEquals(0xFFFF0000, scaled.getRGB(13, 13));
-
-        scaled = ImageUtils.scale(image, 0.25, 0.25, 75, 95);
-        assertEquals(100, scaled.getWidth());
-        assertEquals(120, scaled.getHeight());
-        assertEquals(0xFF00FF00, scaled.getRGB(0, 0));
-        assertEquals(0xFF00FF00, scaled.getRGB(24, 24));
-        assertEquals(0xFFFF0000, scaled.getRGB(13, 13));
-
-    }
-
-    public void testCreateColoredImage() throws Exception {
-        BufferedImage image = ImageUtils.createColoredImage(120, 110, new RGB(0xFE, 0xFD, 0xFC));
-        assertEquals(120, image.getWidth());
-        assertEquals(110, image.getHeight());
-        assertEquals(0xFFFEFDFC, image.getRGB(0, 0));
-        assertEquals(0xFFFEFDFC, image.getRGB(50, 50));
-        assertEquals(0xFFFEFDFC, image.getRGB(119, 109));
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/adt/internal/editors/layout/gle2/IncludeFinderTest.java b/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/adt/internal/editors/layout/gle2/IncludeFinderTest.java
deleted file mode 100644
index c86623c..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/adt/internal/editors/layout/gle2/IncludeFinderTest.java
+++ /dev/null
@@ -1,128 +0,0 @@
-/*
- * Copyright (C) 2010 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.editors.layout.gle2;
-
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
-
-import junit.framework.TestCase;
-
-@SuppressWarnings("javadoc")
-public class IncludeFinderTest extends TestCase {
-    public void testEncodeDecode1() throws Exception {
-        // Test ending with just a key
-        String s = "bar,baz,foo";
-        assertEquals(s, IncludeFinder.encodeMap(IncludeFinder.decodeMap(s)));
-    }
-
-    public void testDecode1() throws Exception {
-        // Test ending with just a key
-        String s = "foo";
-        assertTrue(IncludeFinder.decodeMap(s).containsKey("foo"));
-        assertEquals(0, IncludeFinder.decodeMap(s).get("foo").size());
-    }
-
-    public void testDecode2() throws Exception {
-        // Test ending with just a key
-        String s = "foo=>{bar,baz}";
-        assertTrue(IncludeFinder.decodeMap(s).containsKey("foo"));
-        assertEquals("[bar, baz]",
-                IncludeFinder.decodeMap(s).get("foo").toString());
-    }
-
-    public void testNoBlanks() throws Exception {
-        // Make sure we skip the },
-        String s = "foo=>{bar,baz},bar";
-        assertNull(IncludeFinder.decodeMap(s).get(""));
-    }
-
-    public void testEncodeDecode2() throws Exception {
-        // Test ending with just a key
-        String s = "bar,key1=>{value1,value2},key2=>{value3,value4}";
-        assertEquals(s, IncludeFinder.encodeMap(IncludeFinder.decodeMap(s)));
-    }
-
-    public void testUpdates() throws Exception {
-        IncludeFinder finder = IncludeFinder.create();
-        assertEquals(null, finder.getIncludedBy("foo"));
-
-        finder.setIncluded("bar", Arrays.<String>asList("foo", "baz"), false);
-        finder.setIncluded("baz", Arrays.<String>asList("foo"), false);
-        assertEquals(Arrays.asList("bar", "baz"), finder.getIncludedBy("foo"));
-        finder.setIncluded("bar", Collections.<String>emptyList(), false);
-        assertEquals(Arrays.asList("baz"), finder.getIncludedBy("foo"));
-        finder.setIncluded("baz", Collections.<String>emptyList(), false);
-        assertEquals(Collections.emptyList(), finder.getIncludedBy("foo"));
-    }
-
-    public void testFindIncludes() 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=\"match_parent\"\n" +
-            "    android:orientation=\"vertical\" >\n" +
-            "\n" +
-            "    <RadioButton\n" +
-            "        android:id=\"@+id/radioButton1\"\n" +
-            "        android:layout_width=\"wrap_content\"\n" +
-            "        android:layout_height=\"wrap_content\"\n" +
-            "        android:text=\"RadioButton\" />\n" +
-            "\n" +
-            "    <include\n" +
-            "        android:layout_width=\"wrap_content\"\n" +
-            "        android:layout_height=\"wrap_content\"\n" +
-            "        layout=\"@layout/layout3\" />\n" +
-            "\n" +
-            "    <include\n" +
-            "        android:layout_width=\"wrap_content\"\n" +
-            "        android:layout_height=\"wrap_content\"\n" +
-            "        layout=\"@layout/layout4\" />\n" +
-            "\n" +
-            "</LinearLayout>";
-        List<String> includes = IncludeFinder.findIncludes(xml);
-        Collections.sort(includes);
-        assertEquals(Arrays.asList("layout3", "layout4"), includes);
-    }
-
-    public void testFindFragments() throws Exception {
-        String xml =
-            "<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n" +
-            "    xmlns:tools=\"http://schemas.android.com/tools\"\n" +
-            "    android:layout_width=\"match_parent\"\n" +
-            "    android:layout_height=\"match_parent\"\n" +
-            "    tools:context=\".MainActivity\" >\n" +
-            "\n" +
-            "    <fragment\n" +
-            "        android:id=\"@+id/fragment1\"\n" +
-            "        android:name=\"android.app.ListFragment\"\n" +
-            "        android:layout_width=\"wrap_content\"\n" +
-            "        android:layout_height=\"wrap_content\"\n" +
-            "        android:layout_alignParentLeft=\"true\"\n" +
-            "        android:layout_alignParentTop=\"true\"\n" +
-            "        android:layout_marginLeft=\"58dp\"\n" +
-            "        android:layout_marginTop=\"74dp\"\n" +
-            "        tools:layout=\"@layout/myfragment\" />\n" +
-            "\n" +
-            "</RelativeLayout>";
-        List<String> includes = IncludeFinder.findIncludes(xml);
-        Collections.sort(includes);
-        assertEquals(Arrays.asList("myfragment"), includes);
-    }
-
-
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/adt/internal/editors/layout/gle2/IncludeOverlayTest.java b/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/adt/internal/editors/layout/gle2/IncludeOverlayTest.java
deleted file mode 100644
index a96b1a3..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/adt/internal/editors/layout/gle2/IncludeOverlayTest.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * Copyright (C) 2010 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.editors.layout.gle2;
-
-import org.eclipse.swt.graphics.Rectangle;
-
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.List;
-import java.util.Random;
-
-import junit.framework.TestCase;
-
-public class IncludeOverlayTest extends TestCase {
-
-    public void testSubtractRectangles() throws Exception {
-        checkSubtract(new Rectangle(0, 0, 100, 80), Collections.<Rectangle> emptyList());
-
-        checkSubtract(new Rectangle(0, 0, 100, 80), Arrays.asList(new Rectangle(50, 50, 20, 20)));
-
-        checkSubtract(new Rectangle(0, 0, 100, 80), Arrays.asList(new Rectangle(50, 50, 20, 20),
-                new Rectangle(90, 90, 10, 10)));
-
-        checkSubtract(new Rectangle(0, 0, 100, 80), Arrays.asList(new Rectangle(50, 50, 20, 20),
-                new Rectangle(90, 90, 10, 10), new Rectangle(0, 0, 10, 10)));
-
-    }
-
-    private void checkSubtract(Rectangle rectangle, List<Rectangle> holes) {
-        Collection<Rectangle> result = IncludeOverlay.subtractRectangles(rectangle, holes);
-
-        // Do some Monte Carlo testing - pick random coordinates and check that if they
-        // are within one of the holes then they are not in the result list and vice versa
-        Random random = new Random(42L);
-        for (int i = 0; i < 1000; i++) {
-            int x = random.nextInt(rectangle.width);
-            int y = random.nextInt(rectangle.height);
-
-            boolean inHole = false;
-            for (Rectangle hole : holes) {
-                if (hole.contains(x, y)) {
-                    inHole = true;
-                }
-            }
-
-            boolean inResult = false;
-            for (Rectangle r : result) {
-                if (r.contains(x, y)) {
-                    inResult = true;
-                    break;
-                }
-            }
-
-            if (inHole == inResult) {
-                fail("Wrong result at (" + x + "," + y + ") for rectangle=" + rectangle
-                        + " and holes=" + holes + " where inHole=inResult="
-                        + inResult);
-            }
-        }
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/adt/internal/editors/layout/gle2/LayoutPointTest.java b/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/adt/internal/editors/layout/gle2/LayoutPointTest.java
deleted file mode 100644
index c053de8..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/adt/internal/editors/layout/gle2/LayoutPointTest.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * Copyright (C) 2010 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.editors.layout.gle2;
-
-public class LayoutPointTest extends PointTestCases {
-    public void testCreateFromCoordinates() throws Exception {
-        LayoutPoint point = LayoutPoint.create(mCanvas, 10, 20);
-        assertEquals(10, point.x);
-        assertEquals(20, point.y);
-    }
-
-    public void testEquals() throws Exception {
-        LayoutPoint point1 = LayoutPoint.create(mCanvas, 1, 1);
-        LayoutPoint point2 = LayoutPoint.create(mCanvas, 1, 2);
-        LayoutPoint point3 = LayoutPoint.create(mCanvas, 2, 1);
-        LayoutPoint point2b = LayoutPoint.create(mCanvas, 1, 2);
-
-        assertFalse(point2.equals(null));
-
-        assertEquals(point2, point2);
-        assertEquals(point2, point2b);
-        assertEquals(point2.hashCode(), point2b.hashCode());
-        assertNotSame(point2, point2b);
-
-        assertFalse(point1.equals(point2));
-        assertFalse(point1.equals(point3));
-        assertFalse(point2.equals(point3));
-        assertFalse(point1.equals(point2));
-    }
-
-    public void testConvertToControl() throws Exception {
-        LayoutPoint point = LayoutPoint.create(new TestLayoutCanvas(), 10, 20);
-        assertEquals(10, point.x);
-        assertEquals(20, point.y);
-
-        ControlPoint controlPoint = point.toControl();
-        assertNotNull(controlPoint);
-        assertEquals(-5, controlPoint.x);
-        assertEquals(0, controlPoint.y);
-
-        // For sanity let's also convert back and verify
-        LayoutPoint layoutPoint = controlPoint.toLayout();
-        assertNotNull(layoutPoint);
-        assertNotSame(layoutPoint, point);
-        assertEquals(point, layoutPoint);
-        assertEquals(10, layoutPoint.x);
-        assertEquals(20, layoutPoint.y);
-    }
-
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/adt/internal/editors/layout/gle2/PointTestCases.java b/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/adt/internal/editors/layout/gle2/PointTestCases.java
deleted file mode 100644
index 91d0e13..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/adt/internal/editors/layout/gle2/PointTestCases.java
+++ /dev/null
@@ -1,107 +0,0 @@
-/*
- * Copyright (C) 2010 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.editors.layout.gle2;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.MouseEvent;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.List;
-import org.eclipse.swt.widgets.ScrollBar;
-import org.eclipse.swt.widgets.Shell;
-
-import junit.framework.TestCase;
-
-/**
- * Common utilities for the point tests {@link LayoutPointTest} and
- * {@link ControlPointTest}
- */
-public class PointTestCases extends TestCase {
-    LayoutCanvas mCanvas = new TestLayoutCanvas();
-
-    protected MouseEvent canvasMouseEvent(int x, int y, int stateMask) {
-        Event event = new Event();
-        event.x = x;
-        event.y = y;
-        event.stateMask = stateMask;
-        event.widget = mCanvas;
-        MouseEvent mouseEvent = new MouseEvent(event);
-        return mouseEvent;
-    }
-
-    /** Mock implementation of LayoutCanvas */
-    protected static class TestLayoutCanvas extends LayoutCanvas {
-        float mScaleX;
-
-        float mScaleY;
-
-        float mTranslateX;
-
-        float mTranslateY;
-
-        public TestLayoutCanvas(float scaleX, float scaleY, float translateX, float translateY) {
-            super(null, null, new Shell(), 0);
-
-            this.mScaleX = scaleX;
-            this.mScaleY = scaleY;
-            this.mTranslateX = translateX;
-            this.mTranslateY = translateY;
-        }
-
-        public TestLayoutCanvas() {
-            this(2.0f, 2.0f, 20.0f, 20.0f);
-        }
-
-        @Override
-        CanvasTransform getHorizontalTransform() {
-            ScrollBar scrollBar = new List(this, SWT.V_SCROLL|SWT.H_SCROLL).getHorizontalBar();
-            return new TestCanvasTransform(scrollBar, mScaleX, mTranslateX);
-        }
-
-        @Override
-        CanvasTransform getVerticalTransform() {
-            ScrollBar scrollBar = new List(this, SWT.V_SCROLL|SWT.H_SCROLL).getVerticalBar();
-            return new TestCanvasTransform(scrollBar, mScaleY, mTranslateY);
-        }
-    }
-
-    static class TestCanvasTransform extends CanvasTransform {
-        float mScale;
-
-        float mTranslate;
-
-        public TestCanvasTransform(ScrollBar scrollBar, float scale, float translate) {
-            super(null, scrollBar);
-            this.mScale = scale;
-            this.mTranslate = translate;
-        }
-
-        @Override
-        public int translate(int value) {
-            return (int) ((value - mTranslate) / mScale);
-        }
-
-        @Override
-        public int inverseTranslate(int value) {
-            return (int) (value * mScale + mTranslate);
-        }
-    }
-
-    public void testDummy() {
-        // To avoid JUnit warning that this class contains no tests, even though
-        // this is an abstract class and JUnit shouldn't try
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/adt/internal/editors/layout/gle2/RenderLoggerTest.java b/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/adt/internal/editors/layout/gle2/RenderLoggerTest.java
deleted file mode 100644
index c28d9a9..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/adt/internal/editors/layout/gle2/RenderLoggerTest.java
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- * Copyright (C) 2010 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.editors.layout.gle2;
-
-import junit.framework.TestCase;
-
-public class RenderLoggerTest extends TestCase {
-    public void testLogger1() throws Exception {
-        RenderLogger l = new RenderLogger("foo", null);
-        assertFalse(l.hasProblems());
-    }
-
-    public void testLogger2() throws Exception {
-        RenderLogger l = new RenderLogger("foo", null);
-        assertFalse(l.hasProblems());
-        l.fidelityWarning(null, "No perspective Transforms", null, null);
-        l.fidelityWarning(null, "No GPS", null, null);
-        assertTrue(l.hasProblems());
-        assertEquals("The graphics preview in the layout editor may not be accurate:\n"
-                + "* No perspective Transforms\n" + "* No GPS\n", l.getProblems(true));
-        assertFalse(l.seenTag("foo"));
-        assertFalse(l.seenTag(null));
-    }
-
-    public void testLogger3() throws Exception {
-        RenderLogger l = new RenderLogger("foo", null);
-        assertFalse(l.hasProblems());
-        l.error("timeout", "Sample Error", new RuntimeException(), null);
-        l.warning("slow", "Sample warning", null);
-        assertTrue(l.hasProblems());
-        assertEquals("Sample Error\n" + "Sample warning\n"
-                + "Exception details are logged in Window > Show View > Error Log",
-                l.getProblems(true));
-        assertFalse(l.seenTag("foo"));
-        assertTrue(l.seenTag("timeout"));
-        assertTrue(l.seenTag("slow"));
-        assertFalse(l.seenTagPrefix("foo"));
-        assertTrue(l.seenTagPrefix("timeout"));
-        assertTrue(l.seenTagPrefix("slow"));
-        assertTrue(l.seenTagPrefix("time"));
-        assertFalse(l.seenTagPrefix("timeouts"));
-    }
-
-    public void testLoggerSuppressWarnings() throws Exception {
-        RenderLogger l = new RenderLogger("foo", null);
-        assertFalse(l.hasProblems());
-        RenderLogger.ignoreFidelityWarning("No perspective Transforms");
-        l.fidelityWarning(null, "No perspective Transforms", null, null);
-        l.fidelityWarning(null, "No GPS", null, null);
-        assertTrue(l.hasProblems());
-        assertEquals("The graphics preview in the layout editor may not be accurate:\n"
-                + "* No GPS\n", l.getProblems(true));
-        assertEquals("", l.getProblems(false));
-        assertFalse(l.seenTag("foo"));
-        assertFalse(l.seenTag(null));
-
-        l = new RenderLogger("foo", null);
-        assertFalse(l.hasProblems());
-        RenderLogger.ignoreFidelityWarning("No perspective Transforms");
-        RenderLogger.ignoreFidelityWarning("No GPS");
-        l.fidelityWarning(null, "No perspective Transforms", null, null);
-        l.fidelityWarning(null, "No GPS", null, null);
-        assertFalse(l.hasProblems());
-        assertEquals("", l.getProblems(true));
-        assertFalse(l.seenTag("foo"));
-        assertFalse(l.seenTag(null));
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/adt/internal/editors/layout/gle2/SelectionManagerTest.java b/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/adt/internal/editors/layout/gle2/SelectionManagerTest.java
deleted file mode 100644
index b29f9f3..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/adt/internal/editors/layout/gle2/SelectionManagerTest.java
+++ /dev/null
@@ -1,120 +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.eclipse.adt.internal.editors.layout.gle2;
-
-import com.android.ide.common.rendering.api.ViewInfo;
-import com.android.ide.eclipse.adt.internal.editors.layout.uimodel.UiViewElementNode;
-
-import org.eclipse.swt.widgets.Shell;
-
-import java.util.Arrays;
-
-import junit.framework.TestCase;
-
-public class SelectionManagerTest extends TestCase {
-    private SelectionManager createManager() {
-        LayoutCanvas canvas = new LayoutCanvas(null, null, new Shell(), 0);
-        return new SelectionManager(canvas);
-    }
-
-    public void testEmpty() {
-        SelectionManager manager = createManager();
-
-        assertNotNull(manager.getSelections());
-        assertEquals(0, manager.getSelections().size());
-        assertFalse(manager.hasMultiSelection());
-        assertTrue(manager.isEmpty());
-    }
-
-    public void testBasic() {
-        SelectionManager manager = createManager();
-        assertTrue(manager.isEmpty());
-
-        UiViewElementNode rootNode = CanvasViewInfoTest.createNode("android.widget.LinearLayout",
-                true);
-        ViewInfo root = new ViewInfo("LinearLayout", rootNode, 10, 10, 100, 100);
-        UiViewElementNode child1Node = CanvasViewInfoTest.createNode(rootNode,
-                "android.widget.Button", false);
-        ViewInfo child1 = new ViewInfo("Button1", child1Node, 0, 0, 50, 20);
-        UiViewElementNode child2Node = CanvasViewInfoTest.createNode(rootNode,
-                "android.widget.Button", false);
-        ViewInfo child2 = new ViewInfo("Button2", child2Node, 0, 20, 70, 25);
-        root.setChildren(Arrays.asList(child1, child2));
-        CanvasViewInfo rootView = CanvasViewInfo.create(root, true /* layoutlib5 */).getFirst();
-        assertNotNull(rootView);
-
-        manager.selectMultiple(Arrays.asList(rootView, rootView.getChildren().get(0), rootView
-                .getChildren().get(1)));
-        assertEquals(3, manager.getSelections().size());
-        assertFalse(manager.isEmpty());
-        assertTrue(manager.hasMultiSelection());
-
-        // Expect read-only result; ensure that's the case
-        try {
-            manager.getSelections().remove(0);
-            fail("Result should be read only collection");
-        } catch (Exception e) {
-            ; //ok, what we expected
-        }
-
-        manager.selectNone();
-        assertEquals(0, manager.getSelections().size());
-        assertTrue(manager.isEmpty());
-
-        manager.selectSingle(rootView);
-        assertEquals(1, manager.getSelections().size());
-        assertFalse(manager.isEmpty());
-        assertSame(rootView, manager.getSelections().get(0).getViewInfo());
-
-        manager.selectMultiple(Arrays.asList(rootView, rootView.getChildren().get(0), rootView
-                .getChildren().get(1)));
-        assertEquals(3, manager.getSelections().size());
-
-        manager.deselect(rootView.getChildren().get(0));
-        assertEquals(2, manager.getSelections().size());
-        manager.deselect(rootView);
-        assertEquals(1, manager.getSelections().size());
-        assertSame(rootView.getChildren().get(1), manager.getSelections().get(0).getViewInfo());
-    }
-
-    public void testSelectParent() {
-        SelectionManager manager = createManager();
-        assertTrue(manager.isEmpty());
-
-        UiViewElementNode rootNode = CanvasViewInfoTest.createNode("android.widget.LinearLayout",
-                true);
-        ViewInfo root = new ViewInfo("LinearLayout", rootNode, 10, 10, 100, 100);
-        UiViewElementNode child1Node = CanvasViewInfoTest.createNode(rootNode,
-                "android.widget.Button", false);
-        ViewInfo child1 = new ViewInfo("Button1", child1Node, 0, 0, 50, 20);
-        UiViewElementNode child2Node = CanvasViewInfoTest.createNode(rootNode,
-                "android.widget.Button", false);
-        ViewInfo child2 = new ViewInfo("Button2", child2Node, 0, 20, 70, 25);
-        root.setChildren(Arrays.asList(child1, child2));
-        CanvasViewInfo rootView = CanvasViewInfo.create(root, true /* layoutlib5 */).getFirst();
-        assertNotNull(rootView);
-
-        manager.selectMultiple(Arrays.asList(rootView.getChildren().get(0)));
-        assertEquals(1, manager.getSelections().size());
-        assertFalse(manager.isEmpty());
-        assertSame(rootView.getChildren().get(0), manager.getSelections().get(0).getViewInfo());
-
-        manager.selectParent();
-        assertEquals(1, manager.getSelections().size());
-        assertFalse(manager.isEmpty());
-        assertSame(rootView, manager.getSelections().get(0).getViewInfo());
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/adt/internal/editors/layout/gle2/SimpleAttributeTest.java b/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/adt/internal/editors/layout/gle2/SimpleAttributeTest.java
deleted file mode 100755
index f4f8eb8..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/adt/internal/editors/layout/gle2/SimpleAttributeTest.java
+++ /dev/null
@@ -1,109 +0,0 @@
-/*
- * Copyright (C) 2010 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.editors.layout.gle2;
-
-import com.android.SdkConstants;
-
-import junit.framework.TestCase;
-
-public class SimpleAttributeTest extends TestCase {
-
-    private SimpleAttribute a;
-
-    @Override
-    protected void setUp() throws Exception {
-        super.setUp();
-        a = new SimpleAttribute(SdkConstants.NS_RESOURCES, "name", "value = with space ");
-    }
-
-    public final void testSimpleAttribute() {
-        assertEquals(SdkConstants.NS_RESOURCES, a.getUri());
-        assertEquals("name", a.getName());
-        assertEquals("value = with space ", a.getValue());
-    }
-
-    public final void testGetUri() {
-        assertEquals(SdkConstants.NS_RESOURCES, a.getUri());
-    }
-
-    public final void testGetName() {
-        assertEquals("name", a.getName());
-    }
-
-    public final void testGetValue() {
-        assertEquals("value = with space ", a.getValue());
-    }
-
-    public final void testToString() {
-        assertEquals(
-                "@name:" + SdkConstants.NS_RESOURCES + "=value = with space \n",
-                a.toString());
-    }
-
-    public final void testParseString() {
-        String s = "@name:" + SdkConstants.NS_RESOURCES + "=value = with space \n";
-        SimpleAttribute b = SimpleAttribute.parseString(s);
-        assertEquals(a, b);
-    }
-
-    public final void testEqualsObject() {
-        assertFalse(a.equals(null));
-        assertFalse(a.equals(new Object()));
-
-        // wrong name
-        assertFalse(a.equals(new SimpleAttribute(SdkConstants.NS_RESOURCES,
-                                                 "wrong name",
-                                                 "value = with space ")));
-        // wrong value
-        assertFalse(a.equals(new SimpleAttribute(SdkConstants.NS_RESOURCES,
-                                                 "name",
-                                                 "value")));
-        // wrong uri
-        assertFalse(a.equals(new SimpleAttribute("uri", "name", "value = with space ")));
-        // all fields wrong
-        assertFalse(a.equals(new SimpleAttribute("uri", "wrong name", "value")));
-
-        assertTrue(a.equals(new SimpleAttribute(SdkConstants.NS_RESOURCES,
-                                                "name",
-                                                "value = with space ")));
-    }
-
-    public final void testHashCode() {
-
-        int ah = a.hashCode();
-
-        assertFalse(ah == new Object().hashCode());
-
-        // wrong name
-        assertFalse(ah == new SimpleAttribute(SdkConstants.NS_RESOURCES,
-                                              "wrong name",
-                                              "value = with space ").hashCode());
-        // wrong value
-        assertFalse(ah == new SimpleAttribute(SdkConstants.NS_RESOURCES,
-                                              "name",
-                                              "value").hashCode());
-        // wrong uri
-        assertFalse(ah == new SimpleAttribute("uri", "name", "value = with space ").hashCode());
-        // all fields wrong
-        assertFalse(ah == new SimpleAttribute("uri", "wrong name", "value").hashCode());
-
-        assertEquals(ah, new SimpleAttribute(SdkConstants.NS_RESOURCES,
-                                             "name",
-                                              "value = with space ").hashCode());
-    }
-
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/adt/internal/editors/layout/gle2/SimpleElementTest.java b/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/adt/internal/editors/layout/gle2/SimpleElementTest.java
deleted file mode 100755
index 091aa37..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/adt/internal/editors/layout/gle2/SimpleElementTest.java
+++ /dev/null
@@ -1,343 +0,0 @@
-/*
- * Copyright (C) 2010 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.editors.layout.gle2;
-
-import com.android.ide.common.api.Rect;
-
-import java.util.Arrays;
-
-import junit.framework.TestCase;
-
-public class SimpleElementTest extends TestCase {
-
-    private SimpleElement e;
-
-    /**
-     * Helper method to compare arrays' *content* is equal (instead of object identity).
-     * Also produces a suitable output to understand mismatch, if any.
-     * <p/>
-     * Pre-requisite: The arrays' elements must properly implement {@link Object#equals(Object)}
-     * and a sensible {@link Object#toString()}.
-     */
-    private static void assertArrayEquals(Object[] expected, Object[] actual) {
-        if (!Arrays.equals(expected, actual)) {
-            // In case of failure, transform the arguments into strings and let
-            // assertEquals(string) handle it as it can produce a nice diff of the string.
-            String strExpected = expected == null ? "(null)" : Arrays.toString(expected);
-            String strActual = actual == null ? "(null)" : Arrays.toString(actual);
-
-            if (strExpected.equals(strActual)) {
-                fail(String.format("Array not equal:\n Expected[%d]=%s\n Actual[%d]=%s",
-                        expected == null ? 0 : expected.length,
-                        strExpected,
-                        actual == null ? 0 : actual.length,
-                        strActual));
-            } else {
-                assertEquals(strExpected, strActual);
-            }
-        }
-    }
-
-    @Override
-    protected void setUp() throws Exception {
-        super.setUp();
-
-        e = new SimpleElement("android.view.LinearLayout", // fqcn
-                "android.view.FrameLayout", // parentFqcn
-                new Rect(10, 5, 60, 40),    // bounds
-                new Rect(0, 0, 320, 480));  // parentBounds
-    }
-
-    public final void testGetFqcn() {
-        assertEquals("android.view.LinearLayout", e.getFqcn());
-    }
-
-    public final void testGetParentFqcn() {
-        assertEquals("android.view.FrameLayout", e.getParentFqcn());
-    }
-
-    public final void testGetBounds() {
-        assertEquals(new Rect(10, 5, 60, 40), e.getBounds());
-    }
-
-    public final void testGetParentBounds() {
-        assertEquals(new Rect(0, 0, 320, 480), e.getParentBounds());
-    }
-
-    public final void testToString() {
-        assertEquals("{V=3,N=android.view.LinearLayout,P=android.view.FrameLayout,R=10 5 60 40,Q=0 0 320 480\n" +
-                     "}\n",
-                e.toString());
-
-        e.addAttribute(new SimpleAttribute("uri", "name", "value"));
-        e.addAttribute(new SimpleAttribute("my-uri", "second-name", "my = value "));
-
-        assertEquals("{V=3,N=android.view.LinearLayout,P=android.view.FrameLayout,R=10 5 60 40,Q=0 0 320 480\n" +
-                "@name:uri=value\n" +
-                "@second-name:my-uri=my = value \n" +
-                "}\n",
-           e.toString());
-
-        SimpleElement e2 = new SimpleElement("android.view.Button",
-                                             "android.view.LinearLayout",
-                                             new Rect(10, 20, 30, 40),
-                                             new Rect(0, 0, 320, 480));
-        e2.addAttribute(new SimpleAttribute("uri1", "name1", "value1"));
-        SimpleElement e3 = new SimpleElement("android.view.CheckBox",
-                                             "android.view.LinearLayout",
-                                             new Rect(-1, -2, -3, -4), // invalid rect is ignored
-                                             new Rect(-1, -2, -3, -4)); // invalid rectis ignored
-        e3.addAttribute(new SimpleAttribute("uri2", "name2", "value2"));
-        e3.addAttribute(new SimpleAttribute("uri3", "name3", "value3"));
-        e.addInnerElement(e2);
-        e.addInnerElement(e3);
-
-        assertEquals("{V=3,N=android.view.LinearLayout,P=android.view.FrameLayout,R=10 5 60 40,Q=0 0 320 480\n" +
-                "@name:uri=value\n" +
-                "@second-name:my-uri=my = value \n" +
-                "{V=3,N=android.view.Button,P=android.view.LinearLayout,R=10 20 30 40,Q=0 0 320 480\n" +
-                "@name1:uri1=value1\n" +
-                "}\n" +
-                "{V=3,N=android.view.CheckBox,P=android.view.LinearLayout\n" +
-                "@name2:uri2=value2\n" +
-                "@name3:uri3=value3\n" +
-                "}\n" +
-                "}\n",
-           e.toString());
-    }
-
-    public final void testParseString() {
-        assertArrayEquals(
-            new SimpleElement[] { new SimpleElement("android.view.LinearLayout",
-                                                    null, null, null) },
-            SimpleElement.parseString(
-                "{V=3,N=android.view.LinearLayout\n" +
-                "}\n"));
-
-        assertArrayEquals(
-                new SimpleElement[] { new SimpleElement("android.view.LinearLayout",
-                                                        "android.view.FrameLayout",
-                                                        null, null) },
-                SimpleElement.parseString(
-                    "{V=3,N=android.view.LinearLayout,P=android.view.FrameLayout\n" +
-                    "}\n"));
-
-        assertArrayEquals(
-                new SimpleElement[] { new SimpleElement("android.view.LinearLayout",
-                                                        null,
-                                                        new Rect(10, 5, 60, 40),
-                                                        new Rect(0, 0, 320, 480)) },
-                SimpleElement.parseString(
-                    "{V=3,N=android.view.LinearLayout,R=10 5 60 40,Q=0 0 320 480\n" +
-                    "}\n"));
-
-
-        assertArrayEquals(
-            new SimpleElement[] { e },
-            SimpleElement.parseString(
-                "{V=3,N=android.view.LinearLayout,P=android.view.FrameLayout,R=10 5 60 40,Q=0 0 320 480\n" +
-                "}\n"));
-
-
-        e.addAttribute(new SimpleAttribute("uri", "name", "value"));
-        e.addAttribute(new SimpleAttribute("my-uri", "second-name", "my = value "));
-
-        assertArrayEquals(
-                new SimpleElement[] { e },
-                SimpleElement.parseString(
-                        "{V=3,N=android.view.LinearLayout,P=android.view.FrameLayout,R=10 5 60 40,Q=0 0 320 480\n" +
-                        "@name:uri=value\n" +
-                        "@second-name:my-uri=my = value \n" +
-                        "}\n"));
-
-
-        SimpleElement e2 = new SimpleElement("android.view.Button",
-                                             "android.view.LinearLayout",
-                                             new Rect(10, 20, 30, 40),
-                                             new Rect(0, 0, 320, 480));
-        e2.addAttribute(new SimpleAttribute("uri1", "name1", "value1"));
-        SimpleElement e3 = new SimpleElement("android.view.CheckBox",
-                                             "android.view.LinearLayout",
-                                             new Rect(-1, -2, -3, -4),
-                                             new Rect(-1, -2, -3, -4));
-        e3.addAttribute(new SimpleAttribute("uri2", "name2", "value2"));
-        e3.addAttribute(new SimpleAttribute("uri3", "name3", "value3"));
-        e.addInnerElement(e2);
-        e.addInnerElement(e3);
-
-        assertArrayEquals(
-                new SimpleElement[] { e },
-                SimpleElement.parseString(
-                        "{V=3,N=android.view.LinearLayout,P=android.view.FrameLayout,R=10 5 60 40,Q=0 0 320 480\n" +
-                        "@name:uri=value\n" +
-                        "@second-name:my-uri=my = value \n" +
-                        "{V=3,N=android.view.Button,P=android.view.LinearLayout,R=10 20 30 40,Q=0 0 320 480\n" +
-                        "@name1:uri1=value1\n" +
-                        "}\n" +
-                        "{V=3,N=android.view.CheckBox,P=android.view.LinearLayout,R=-1 -2 -3 -4,Q=-1 -2 -3 -4\n" +
-                        "@name2:uri2=value2\n" +
-                        "@name3:uri3=value3\n" +
-                        "}\n" +
-                        "}\n"));
-
-        // Parse string can also parse an array of elements
-        assertArrayEquals(
-                new SimpleElement[] { e, e2, e3 },
-                SimpleElement.parseString(
-                        "{V=3,N=android.view.LinearLayout,P=android.view.FrameLayout,R=10 5 60 40,Q=0 0 320 480\n" +
-                        "@name:uri=value\n" +
-                        "@second-name:my-uri=my = value \n" +
-                        "{V=3,N=android.view.Button,P=android.view.LinearLayout,R=10 20 30 40,Q=0 0 320 480\n" +
-                        "@name1:uri1=value1\n" +
-                        "}\n" +
-                        "{V=3,N=android.view.CheckBox,P=android.view.LinearLayout,R=-1 -2 -3 -4\n" +
-                        "@name2:uri2=value2\n" +
-                        "@name3:uri3=value3\n" +
-                        "}\n" +
-                        "}\n" +
-                        "{V=3,N=android.view.Button,P=android.view.LinearLayout,R=10 20 30 40,Q=0 0 320 480\n" +
-                        "@name1:uri1=value1\n" +
-                        "}\n" +
-                        "{V=3,N=android.view.CheckBox,P=android.view.LinearLayout,R=-1 -2 -3 -4,Q=-1 -2 -3 -4\n" +
-                        "@name2:uri2=value2\n" +
-                        "@name3:uri3=value3\n" +
-                        "}\n"));
-
-    }
-
-    public final void testAddGetAttribute() {
-        assertNotNull(e.getAttributes());
-        assertArrayEquals(
-                new SimpleAttribute[] {},
-                e.getAttributes());
-
-        e.addAttribute(new SimpleAttribute("uri", "name", "value"));
-        assertArrayEquals(
-                new SimpleAttribute[] { new SimpleAttribute("uri", "name", "value") },
-                e.getAttributes());
-
-        e.addAttribute(new SimpleAttribute("my-uri", "second-name", "value"));
-        assertArrayEquals(
-                new SimpleAttribute[] { new SimpleAttribute("uri", "name", "value"),
-                                        new SimpleAttribute("my-uri", "second-name", "value") },
-                e.getAttributes());
-
-        assertNull(e.getAttribute("unknown uri", "name"));
-        assertNull(e.getAttribute("uri", "unknown name"));
-        assertEquals(new SimpleAttribute("uri", "name", "value"),
-                     e.getAttribute("uri", "name"));
-        assertEquals(new SimpleAttribute("my-uri", "second-name", "value"),
-                     e.getAttribute("my-uri", "second-name"));
-    }
-
-    public final void testAddGetInnerElements() {
-        assertNotNull(e.getInnerElements());
-        assertArrayEquals(
-                new SimpleElement[] {},
-                e.getInnerElements());
-
-        e.addInnerElement(new SimpleElement("android.view.Button", null, null, null));
-        assertArrayEquals(
-                new SimpleElement[] { new SimpleElement("android.view.Button", null, null, null) },
-                e.getInnerElements());
-
-        e.addInnerElement(new SimpleElement("android.view.CheckBox", null, null, null));
-        assertArrayEquals(
-               new SimpleElement[] { new SimpleElement("android.view.Button", null, null, null),
-                                     new SimpleElement("android.view.CheckBox", null, null, null) },
-               e.getInnerElements());
-    }
-
-    public final void testEqualsObject() {
-        assertFalse(e.equals(null));
-        assertFalse(e.equals(new Object()));
-
-        assertNotSame(new SimpleElement("android.view.LinearLayout",
-                                        "android.view.FrameLayout",
-                                        new Rect(10, 5, 60, 40),
-                                        new Rect(0, 0, 320, 480)),
-                      e);
-        assertEquals(new SimpleElement("android.view.LinearLayout",
-                                       "android.view.FrameLayout",
-                                       new Rect(10, 5, 60, 40),
-                                       new Rect(0, 0, 320, 480)),
-                      e);
-        assertTrue(e.equals(new SimpleElement("android.view.LinearLayout",
-                                              "android.view.FrameLayout",
-                                              new Rect(10, 5, 60, 40),
-                                              new Rect(0, 0, 320, 480))));
-
-        // not the same FQCN
-        assertFalse(e.equals(new SimpleElement("android.view.Button",
-                                               "android.view.FrameLayout",
-                                               new Rect(10, 5, 60, 40),
-                                               new Rect(0, 0, 320, 480))));
-
-        // not the same parent
-        assertFalse(e.equals(new SimpleElement("android.view.LinearLayout",
-                                               "android.view.LinearLayout",
-                                               new Rect(10, 5, 60, 40),
-                                               new Rect(0, 0, 320, 480))));
-
-        // not the same bounds
-        assertFalse(e.equals(new SimpleElement("android.view.LinearLayout",
-                                               "android.view.FrameLayout",
-                                               new Rect(10, 25, 30, 40),
-                                               new Rect(0, 0, 320, 480))));
-
-        // not the same parent bounds
-        assertFalse(e.equals(new SimpleElement("android.view.LinearLayout",
-                                               "android.view.FrameLayout",
-                                               new Rect(10, 5, 60, 40),
-                                               new Rect(10, 100, 160, 240))));
-    }
-
-    public final void testHashCode() {
-        int he = e.hashCode();
-
-        assertEquals(he, new SimpleElement("android.view.LinearLayout",
-                                           "android.view.FrameLayout",
-                                           new Rect(10, 5, 60, 40),
-                                           new Rect(0, 0, 320, 480)).hashCode());
-
-
-        // not the same FQCN
-        assertFalse(he == new SimpleElement("android.view.Button",
-                                            "android.view.FrameLayout",
-                                            new Rect(10, 5, 60, 40),
-                                            new Rect(0, 0, 320, 480)).hashCode());
-
-        // not the same parent
-        assertFalse(he == new SimpleElement("android.view.LinearLayout",
-                                            "android.view.Button",
-                                            new Rect(10, 5, 60, 40),
-                                            new Rect(0, 0, 320, 480)).hashCode());
-
-        // not the same bounds
-        assertFalse(he == new SimpleElement("android.view.LinearLayout",
-                                            "android.view.FrameLayout",
-                                            new Rect(10, 25, 30, 40),
-                                            new Rect(0, 0, 320, 480)).hashCode());
-
-        // not the same parent bounds
-        assertFalse(he == new SimpleElement("android.view.LinearLayout",
-                                            "android.view.FrameLayout",
-                                            new Rect(10, 25, 30, 40),
-                                            new Rect(10, 100, 160, 240)).hashCode());
-    }
-
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/adt/internal/editors/layout/gle2/SwtUtilsTest.java b/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/adt/internal/editors/layout/gle2/SwtUtilsTest.java
deleted file mode 100644
index de7999c..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/adt/internal/editors/layout/gle2/SwtUtilsTest.java
+++ /dev/null
@@ -1,343 +0,0 @@
-/*
- * Copyright (C) 2010 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.editors.layout.gle2;
-
-import com.android.ide.common.api.Rect;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.graphics.ImageData;
-import org.eclipse.swt.graphics.PaletteData;
-import org.eclipse.swt.graphics.RGB;
-import org.eclipse.swt.graphics.Rectangle;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Shell;
-
-import java.awt.Color;
-import java.awt.Graphics;
-import java.awt.image.BufferedImage;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
-import junit.framework.TestCase;
-
-public class SwtUtilsTest extends TestCase {
-
-    public void testImageConvertNoAlpha() throws Exception {
-        // Note: We need an TYPE_INT_ARGB SWT image here (instead of TYPE_INT_ARGB_PRE) to
-        // prevent the alpha from being pre-multiplied into the RGB when drawing the image.
-        BufferedImage inImage = new BufferedImage(100, 100, BufferedImage.TYPE_INT_ARGB);
-        Graphics g = inImage.getGraphics();
-        g.setColor(new Color(0xAA112233, true));
-        g.fillRect(0, 0, inImage.getWidth(), inImage.getHeight());
-        g.dispose();
-
-        Shell shell = new Shell();
-        Display display = shell.getDisplay();
-
-        // Convert the RGB image, effectively discarding the alpha channel entirely.
-        Image outImage = SwtUtils.convertToSwt(display, inImage, false, -1);
-        assertNotNull(outImage);
-
-        ImageData outData = outImage.getImageData();
-        assertEquals(inImage.getWidth(), outData.width);
-        assertEquals(inImage.getHeight(), outData.height);
-        assertNull(outData.alphaData);
-        assertEquals(SWT.TRANSPARENCY_NONE, outData.getTransparencyType());
-
-        PaletteData inPalette  = SwtUtils.getAwtPaletteData(inImage.getType());
-        PaletteData outPalette = outData.palette;
-
-        for (int y = 0; y < outData.height; y++) {
-            for (int x = 0; x < outData.width; x++) {
-                // Note: we can't compare pixel directly as integers since convertToSwt() might
-                // have changed the RGBA ordering depending on the platform (e.g. it will on
-                // Windows.)
-                RGB expected = inPalette.getRGB( inImage.getRGB(  x, y));
-                RGB actual   = outPalette.getRGB(outData.getPixel(x, y));
-                assertEquals(expected, actual);
-            }
-        }
-
-        // Convert back to AWT and compare with original AWT image
-        BufferedImage awtImage = SwtUtils.convertToAwt(outImage);
-        assertNotNull(awtImage);
-
-        // Both image have the same RGBA ordering
-        assertEquals(BufferedImage.TYPE_INT_ARGB, inImage.getType());
-        assertEquals(BufferedImage.TYPE_INT_ARGB, awtImage.getType());
-
-        int awtAlphaMask = 0xFF000000;
-
-        for (int y = 0; y < outData.height; y++) {
-            for (int x = 0; x < outData.width; x++) {
-                // Note: we can compare pixels as integers since we just
-                // asserted both images have the same color image type except
-                // for the content of the alpha channel.
-                int actual = awtImage.getRGB(x, y);
-                assertEquals(awtAlphaMask, actual & awtAlphaMask);
-                assertEquals(awtAlphaMask | inImage.getRGB(x, y), awtImage.getRGB(x, y));
-            }
-        }
-    }
-
-    public void testImageConvertGlobalAlpha() throws Exception {
-        BufferedImage inImage = new BufferedImage(100, 100, BufferedImage.TYPE_INT_ARGB);
-        Graphics g = inImage.getGraphics();
-        g.setColor(new Color(0xAA112233, true));
-        g.fillRect(0, 0, inImage.getWidth(), inImage.getHeight());
-        g.dispose();
-
-        Shell shell = new Shell();
-        Display display = shell.getDisplay();
-
-        Image outImage = SwtUtils.convertToSwt(display, inImage, false, 128);
-        assertNotNull(outImage);
-
-        ImageData outData = outImage.getImageData();
-        assertEquals(inImage.getWidth(), outData.width);
-        assertEquals(inImage.getHeight(), outData.height);
-        assertEquals(128, outData.alpha);
-        assertEquals(SWT.TRANSPARENCY_NONE, outData.getTransparencyType());
-        assertNull(outData.alphaData);
-
-        PaletteData inPalette  = SwtUtils.getAwtPaletteData(inImage.getType());
-        PaletteData outPalette = outData.palette;
-
-        for (int y = 0; y < outData.height; y++) {
-            for (int x = 0; x < outData.width; x++) {
-
-                RGB expected = inPalette.getRGB( inImage.getRGB(  x, y));
-                RGB actual   = outPalette.getRGB(outData.getPixel(x, y));
-                assertEquals(expected, actual);
-            }
-        }
-    }
-
-    public void testImageConvertAlpha() throws Exception {
-        BufferedImage inImage = new BufferedImage(100, 100, BufferedImage.TYPE_INT_ARGB);
-        Graphics g = inImage.getGraphics();
-        g.setColor(new Color(0xAA112233, true));
-        g.fillRect(0, 0, inImage.getWidth(), inImage.getHeight());
-        g.dispose();
-
-        Shell shell = new Shell();
-        Display display = shell.getDisplay();
-
-        Image outImage = SwtUtils.convertToSwt(display, inImage, true, -1);
-        assertNotNull(outImage);
-
-        ImageData outData = outImage.getImageData();
-        assertEquals(inImage.getWidth(), outData.width);
-        assertEquals(inImage.getHeight(), outData.height);
-        assertEquals(SWT.TRANSPARENCY_ALPHA, outData.getTransparencyType());
-
-        PaletteData inPalette  = SwtUtils.getAwtPaletteData(inImage.getType());
-        PaletteData outPalette = outData.palette;
-
-        for (int y = 0; y < outData.height; y++) {
-            for (int x = 0; x < outData.width; x++) {
-                RGB expected = inPalette.getRGB( inImage.getRGB(  x, y));
-                RGB actual   = outPalette.getRGB(outData.getPixel(x, y));
-                assertEquals(expected, actual);
-
-                // Note: >> instead of >>> since we will compare with byte (a signed number)
-                int expectedAlpha = inImage.getRGB(x, y) >> 24;
-                int actualAlpha = outData.alphaData[y * outData.width + x];
-                assertEquals(expectedAlpha, actualAlpha);
-            }
-        }
-    }
-
-    public void testImageConvertAlphaMultiplied() throws Exception {
-        BufferedImage inImage = new BufferedImage(100, 100, BufferedImage.TYPE_INT_ARGB);
-        Graphics g = inImage.getGraphics();
-        g.setColor(new Color(0xAA112233, true));
-        g.fillRect(0, 0, inImage.getWidth(), inImage.getHeight());
-        g.dispose();
-
-        Shell shell = new Shell();
-        Display display = shell.getDisplay();
-        Image outImage = SwtUtils.convertToSwt(display, inImage, true, 32);
-        assertNotNull(outImage);
-
-        // Expected alpha is 0xAA from the AWT input image pre-multiplied by 32 in convertToSwt.
-        int expectedAlpha = (0xAA * 32) >> 8;
-
-        ImageData outData = outImage.getImageData();
-        assertEquals(inImage.getWidth(), outData.width);
-        assertEquals(inImage.getHeight(), outData.height);
-        assertEquals(SWT.TRANSPARENCY_ALPHA, outData.getTransparencyType());
-
-        PaletteData inPalette  = SwtUtils.getAwtPaletteData(inImage.getType());
-        PaletteData outPalette = outData.palette;
-
-        for (int y = 0; y < outData.height; y++) {
-            for (int x = 0; x < outData.width; x++) {
-                RGB expected = inPalette.getRGB( inImage.getRGB(  x, y));
-                RGB actual   = outPalette.getRGB(outData.getPixel(x, y));
-                assertEquals(expected, actual);
-
-                byte actualAlpha = outData.alphaData[y * outData.width + x];
-                assertEquals(expectedAlpha, actualAlpha);
-            }
-        }
-    }
-
-    public final void testSetRectangle() {
-        Rect r = new Rect(1, 2, 3, 4);
-        Rectangle r2 = new Rectangle(3, 4, 20, 30);
-        SwtUtils.set(r, r2);
-
-        assertEquals(3, r.x);
-        assertEquals(4, r.y);
-        assertEquals(20, r.w);
-        assertEquals(30, r.h);
-    }
-
-    public final void testRectRectangle() {
-        Rectangle r = new Rectangle(3, 4, 20, 30);
-        Rect r2 = SwtUtils.toRect(r);
-
-        assertEquals(3, r2.x);
-        assertEquals(4, r2.y);
-        assertEquals(20, r2.w);
-        assertEquals(30, r2.h);
-    }
-
-    public final void testCropEmpty() {
-        Image image = createSampleImage(256, 256);
-        Image result = SwtUtils.drawRectangles(image, Collections.<Rectangle> emptyList(), null,
-                1.0, (byte) 121);
-        assertNull(result);
-    }
-
-    public final void testCrop1() {
-        Image image = createSampleImage(256, 256);
-
-        byte alpha = 121;
-        double scale = 1.0;
-
-        List<Rectangle> items = new ArrayList<Rectangle>();
-        items.add(new Rectangle(30, 60, 20, 20));
-        Image result =
-            SwtUtils.drawRectangles(image, items, ImageUtils.getBoundingRectangle(items),
-                    scale, alpha);
-
-        assertNotNull(result);
-        ImageData outData = result.getImageData();
-        assertEquals(20, outData.width);
-        assertEquals(20, outData.height);
-
-        PaletteData outPalette = outData.palette;
-        assertNotNull(outPalette);
-
-        byte[] outAlphaData = outData.alphaData;
-        assertNotNull(outAlphaData);
-
-        for (int y = 0; y < 20; y++) {
-            for (int x = 0; x < 20; x++) {
-                int r = y + 60;
-                int g = x + 30;
-
-                RGB expected = new RGB(r, g, 0);
-                RGB actual = outPalette.getRGB(outData.getPixel(x, y));
-                assertEquals(expected, actual);
-
-                byte actualAlpha = outAlphaData[y*20+x];
-                assertEquals(alpha, actualAlpha);
-            }
-        }
-    }
-
-    public final void testCrop2() {
-        Image image = createSampleImage(256, 256);
-
-        byte alpha = 121;
-        double scale = 1.0;
-
-        List<Rectangle> items = new ArrayList<Rectangle>();
-        items.add(new Rectangle(10, 10, 20, 20));
-        items.add(new Rectangle(110, 80, 20, 20));
-        Image result =
-            SwtUtils.drawRectangles(image, items, ImageUtils.getBoundingRectangle(items),
-                    scale, alpha);
-
-        assertNotNull(result);
-        ImageData outData = result.getImageData();
-        assertEquals(120, outData.width);
-        assertEquals(90, outData.height);
-
-        PaletteData outPalette = outData.palette;
-        assertNotNull(outPalette);
-
-        byte[] outAlphaData = outData.alphaData;
-        assertNotNull(outAlphaData);
-
-        for (int y = 0; y < 20; y++) {
-            for (int x = 0; x < 20; x++) {
-                int r = y + 10;
-                int g = x + 10;
-
-                RGB expected = new RGB(r, g, 0);
-                RGB actual = outPalette.getRGB(outData.getPixel(x, y));
-                assertEquals(expected, actual);
-
-                assertEquals(alpha, outAlphaData[y*120+x]);
-            }
-        }
-        for (int y = 70; y < 90; y++) {
-            for (int x = 100; x < 120; x++) {
-                int r = y + 10;
-                int g = x + 10;
-
-                RGB expected = new RGB(r, g, 0);
-                RGB actual = outPalette.getRGB(outData.getPixel(x, y));
-                assertEquals(expected, actual);
-
-                assertEquals(alpha, outAlphaData[y*120+x]);
-            }
-        }
-        assertEquals(0, outAlphaData[40]);
-    }
-
-    /**
-     * Crop test utility: Create a sample image patterned with red=y and green=x, suitable
-     * for checking that in image copying operations we've copied and scaled the right
-     * bits. (Obviously the red/green will be mod'ed with 256).
-     *
-     * @param imageWidth the width of the target image
-     * @param imageHeight the height of the target image
-     * @return a new image with a red/green pattern
-     */
-    private Image createSampleImage(int imageWidth, int imageHeight) {
-        Shell shell = new Shell();
-        Display display = shell.getDisplay();
-
-        ImageData data = new ImageData(imageWidth, imageHeight, 32, new PaletteData(0x00FF0000,
-                0x0000FF00, 0x000000FF));
-        for (int y = 0; y < imageHeight; y++) {
-            for (int x = 0; x < imageWidth; x++) {
-                int pixelValue = (y & 0xFF) << 16 | (x & 0xFF) << 8;
-                data.setPixel(x, y, pixelValue);
-            }
-        }
-        Image image = new Image(display, data);
-        return image;
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/adt/internal/editors/layout/gre/MockNodeProxy.java b/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/adt/internal/editors/layout/gre/MockNodeProxy.java
deleted file mode 100755
index 433d390..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/adt/internal/editors/layout/gre/MockNodeProxy.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- * Copyright (C) 2010 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.editors.layout.gre;
-
-import com.android.ide.eclipse.adt.internal.editors.layout.descriptors.ViewElementDescriptor;
-import com.android.ide.eclipse.adt.internal.editors.layout.uimodel.UiViewElementNode;
-
-import org.eclipse.swt.graphics.Rectangle;
-import org.eclipse.ui.internal.registry.ViewDescriptor;
-
-/**
- * Mocks a {@link NodeProxy}, creating it using an XML local name and generating
- * a made-up {@link UiViewElementNode} and a {@link ViewDescriptor} on the fly.
- */
-public class MockNodeProxy extends NodeProxy {
-
-    /**
-     * Generates a {@link NodeProxy} using an FQCN (e.g. android.view.View)
-     * and making the last segment of the FQCN the XML name of the view (e.g. "View")
-     * and wraps it as a {@link NodeProxy}.
-     *
-     * @param fqcn The fully qualified name of the class to wrap, e.g. "android.view.Button".
-     * @param bounds The bounds of a the view in the canvas. Must be either: <br/>
-     *   - a valid rect for a view that is actually in the canvas <br/>
-     *   - <b>*or*</b> null (or an invalid rect) for a view that has just been added dynamically
-     *   to the model. We never store a null bounds rectangle in the node, a null rectangle
-     *   will be converted to an invalid rectangle.
-     * @param factory A {@link NodeFactory} to create unique children nodes.
-     */
-    public MockNodeProxy(String fqcn, Rectangle bounds, NodeFactory factory) {
-        super(makeUiViewNode(fqcn), bounds, factory);
-    }
-
-    /**
-     * Generates a {@link ViewElementDescriptor} using an FQCN (e.g. android.view.View)
-     * and making the last segment of the FQCN the XML name of the view (e.g. "View").
-     *
-     * @param fqcn The fully qualified name of the class to wrap, e.g. "android.view.Button"
-     * @return A new view element node with a new descriptor for the FQCN and an XML name
-     *  matching the last FQCN segment (e.g. "Button")
-     */
-    private static UiViewElementNode makeUiViewNode(String fqcn) {
-        String xmlName = fqcn;
-        int pos = xmlName.lastIndexOf('.');
-        if (pos > 0) {
-            xmlName = xmlName.substring(pos + 1);
-        }
-
-        ViewElementDescriptor desc = new ViewElementDescriptor(xmlName, fqcn);
-        UiViewElementNode uiNode = new UiViewElementNode(desc);
-        return uiNode;
-    }
-
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/adt/internal/editors/layout/gre/NodeFactoryTest.java b/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/adt/internal/editors/layout/gre/NodeFactoryTest.java
deleted file mode 100755
index 0e6d33d..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/adt/internal/editors/layout/gre/NodeFactoryTest.java
+++ /dev/null
@@ -1,123 +0,0 @@
-/*
- * Copyright (C) 2010 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.editors.layout.gre;
-
-import com.android.ide.common.api.INode;
-import com.android.ide.common.api.Rect;
-import com.android.ide.common.rendering.api.ViewInfo;
-import com.android.ide.eclipse.adt.internal.editors.layout.descriptors.ViewElementDescriptor;
-import com.android.ide.eclipse.adt.internal.editors.layout.gle2.CanvasViewInfo;
-import com.android.ide.eclipse.adt.internal.editors.layout.uimodel.UiViewElementNode;
-
-import java.util.Arrays;
-
-import junit.framework.TestCase;
-
-public class NodeFactoryTest extends TestCase {
-
-    private NodeFactory m;
-
-    @Override
-    protected void setUp() throws Exception {
-        super.setUp();
-        m = new NodeFactory(null);
-
-    }
-
-    @Override
-    protected void tearDown() throws Exception {
-        super.tearDown();
-        m = null;
-    }
-
-    public final void testCreateCanvasViewInfo() {
-        ViewElementDescriptor ved = new ViewElementDescriptor("xml", "com.example.MyJavaClass");
-        UiViewElementNode uiv = new UiViewElementNode(ved);
-        ViewInfo lvi = new ViewInfo("name", uiv, 10, 12, 110, 120);
-        CanvasViewInfo cvi = CanvasViewInfo.create(lvi, true /* layoutlib5 */).getFirst();
-
-        // Create a NodeProxy.
-        NodeProxy proxy = m.create(cvi);
-
-        // getNode() is our only internal implementation method.
-        assertNotNull(proxy);
-        assertSame(uiv, proxy.getNode());
-
-        // Groovy scripts only see the INode interface so we want to primarily test that.
-        INode inode = proxy;
-        assertEquals(new Rect(10, 12, 110-10-1, 120-12-1), inode.getBounds());
-        assertTrue(Arrays.equals(new INode[0], inode.getChildren()));
-        assertEquals("com.example.MyJavaClass", inode.getFqcn());
-        assertNull(inode.getParent());
-        assertSame(inode, inode.getRoot());
-
-    }
-
-    public final void testCreateUiViewElementNode() {
-        ViewElementDescriptor ved = new ViewElementDescriptor("xml", "com.example.MyJavaClass");
-        UiViewElementNode uiv = new UiViewElementNode(ved);
-
-        // Create a NodeProxy.
-        NodeProxy proxy = m.create(uiv);
-
-        // getNode() is our only internal implementation method.
-        assertNotNull(proxy);
-        assertSame(uiv, proxy.getNode());
-
-        // Groovy scripts only see the INode interface so we want to primarily test that.
-        INode inode = proxy;
-        // Nodes constructed using this create() method do not have valid bounds.
-        // There should be one invalid bound rectangle.
-        assertNotNull(inode.getBounds());
-        assertFalse(inode.getBounds().isValid());
-        // All the other properties should be set correctly.
-        assertTrue(Arrays.equals(new INode[0], inode.getChildren()));
-        assertEquals("com.example.MyJavaClass", inode.getFqcn());
-        assertNull(inode.getParent());
-        assertSame(inode, inode.getRoot());
-    }
-
-    public final void testCreateDup() {
-        ViewElementDescriptor ved = new ViewElementDescriptor("xml", "com.example.MyJavaClass");
-        UiViewElementNode uiv = new UiViewElementNode(ved);
-        ViewInfo lvi = new ViewInfo("name", uiv, 10, 12, 110, 120);
-        CanvasViewInfo cvi = CanvasViewInfo.create(lvi, true /* layoutlib5 */).getFirst();
-
-        // NodeProxies are cached. Creating the same one twice returns the same proxy.
-        NodeProxy proxy1 = m.create(cvi);
-        NodeProxy proxy2 = m.create(cvi);
-        assertSame(proxy2, proxy1);
-    }
-
-    public final void testClear() {
-        ViewElementDescriptor ved = new ViewElementDescriptor("xml", "com.example.MyJavaClass");
-        UiViewElementNode uiv = new UiViewElementNode(ved);
-        ViewInfo lvi = new ViewInfo("name", uiv, 10, 12, 110, 120);
-        CanvasViewInfo cvi = CanvasViewInfo.create(lvi, true /* layoutlib5 */).getFirst();
-
-        // NodeProxies are cached. Creating the same one twice returns the same proxy.
-        NodeProxy proxy1 = m.create(cvi);
-        NodeProxy proxy2 = m.create(cvi);
-        assertSame(proxy2, proxy1);
-
-        // Clearing the cache will force it create a new proxy.
-        m.clear();
-        NodeProxy proxy3 = m.create(cvi);
-        assertNotSame(proxy1, proxy3);
-    }
-
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/adt/internal/editors/layout/gre/RulesEngineTest.java b/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/adt/internal/editors/layout/gre/RulesEngineTest.java
deleted file mode 100755
index d9a1a3d..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/adt/internal/editors/layout/gre/RulesEngineTest.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Copyright (C) 2010 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.editors.layout.gre;
-
-import junit.framework.TestCase;
-
-public class RulesEngineTest extends TestCase {
-
-    @Override
-    protected void setUp() throws Exception {
-        super.setUp();
-    }
-
-    @Override
-    protected void tearDown() throws Exception {
-        super.tearDown();
-    }
-
-    public void testDummy() {
-        // Here to avoid warning that RulesEngineTest is empty
-    }
-
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/adt/internal/editors/layout/gre/ViewMetadataRepositoryTest.java b/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/adt/internal/editors/layout/gre/ViewMetadataRepositoryTest.java
deleted file mode 100644
index 50d438c..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/adt/internal/editors/layout/gre/ViewMetadataRepositoryTest.java
+++ /dev/null
@@ -1,77 +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.eclipse.adt.internal.editors.layout.gre;
-
-import com.android.ide.common.api.IViewMetadata.FillPreference;
-import com.android.ide.eclipse.adt.internal.editors.layout.gre.ViewMetadataRepository.RenderMode;
-
-import java.util.Arrays;
-
-import junit.framework.TestCase;
-
-public class ViewMetadataRepositoryTest extends TestCase {
-    public void testSingleton() throws Exception {
-        assertSame(ViewMetadataRepository.get(), ViewMetadataRepository.get());
-    }
-
-    public void testBasic() throws Exception {
-        ViewMetadataRepository repository = ViewMetadataRepository.get();
-
-        assertEquals(FillPreference.WIDTH_IN_VERTICAL,
-                repository.getFillPreference("android.widget.Spinner"));
-        assertEquals(FillPreference.NONE,
-                repository.getFillPreference("foo.bar"));
-    }
-
-    // Ensure that all basenames referenced in the metadata refer to other views in the file
-    // (e.g. no typos)
-    public void testRelatedTo() throws Exception {
-        // Make sure unit tests are run with assertions on
-        boolean assertionsEnabled = false;
-        assert assertionsEnabled = true; // Intentional assignment
-        assertTrue("This unit test must be run with assertions enabled (-ea)", assertionsEnabled);
-
-        ViewMetadataRepository repository = ViewMetadataRepository.get();
-        for (String fqcn : repository.getAllFqcns()) {
-            repository.getRelatedTo(fqcn);
-        }
-    }
-
-    public void testSkip() throws Exception {
-        ViewMetadataRepository repository = ViewMetadataRepository.get();
-        assertTrue(repository.getSkip("merge"));
-        assertFalse(repository.getSkip("android.widget.Button"));
-    }
-
-    public void testRenderMode() throws Exception {
-        ViewMetadataRepository repository = ViewMetadataRepository.get();
-        assertEquals(RenderMode.NORMAL, repository.getRenderMode("android.widget.Button"));
-        assertEquals(RenderMode.SKIP, repository.getRenderMode("android.widget.LinearLayout"));
-        assertEquals(RenderMode.ALONE, repository.getRenderMode("android.widget.TabHost"));
-    }
-
-    public void testGetTopAttributes() throws Exception {
-        ViewMetadataRepository repository = ViewMetadataRepository.get();
-        assertEquals(Arrays.asList("id", "text", "style"),
-                repository.getTopAttributes("android.widget.RadioButton"));
-        assertEquals(Arrays.asList("id", "gravity", "paddingLeft", "paddingRight", "checkMark",
-                "textAppearance"),
-                repository.getTopAttributes("android.widget.CheckedTextView"));
-        assertEquals(Arrays.asList("id"),
-                repository.getTopAttributes("android.widget.NonExistent"));
-    }
-
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/adt/internal/editors/layout/properties/ValueCompleterTest.java b/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/adt/internal/editors/layout/properties/ValueCompleterTest.java
deleted file mode 100644
index 0014fe5..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/adt/internal/editors/layout/properties/ValueCompleterTest.java
+++ /dev/null
@@ -1,151 +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.ide.eclipse.adt.internal.editors.layout.properties;
-
-import static com.android.SdkConstants.ANDROID_URI;
-
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-import com.android.ide.common.api.IAttributeInfo;
-import com.android.ide.common.api.IAttributeInfo.Format;
-import com.android.ide.common.layout.TestAttributeInfo;
-import com.android.ide.eclipse.adt.internal.editors.common.CommonXmlEditor;
-import com.android.ide.eclipse.adt.internal.editors.descriptors.AttributeDescriptor;
-import com.android.ide.eclipse.adt.internal.editors.descriptors.TextAttributeDescriptor;
-
-import org.eclipse.jface.fieldassist.IContentProposal;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.EnumSet;
-import java.util.List;
-
-import junit.framework.TestCase;
-
-@SuppressWarnings("javadoc")
-public class ValueCompleterTest extends TestCase {
-    private void checkCompletion(String text, int offset,
-            String property, EnumSet<Format> formats, String[] values,
-            List<String> expected) {
-        assertTrue(text.length() >= offset);
-
-        TestAttributeInfo info =
-                new TestAttributeInfo(property, formats, "unittest", values, values, null);
-        TestValueCompleter completer = new TestValueCompleter(
-                new TestTextAttributeDescriptor(property, info));
-        IContentProposal[] proposals = completer.getProposals(text, offset);
-        List<String> actual = new ArrayList<String>();
-        for (IContentProposal proposal : proposals) {
-            String content = proposal.getContent();
-            actual.add(content);
-        }
-        assertEquals(expected.toString(), actual.toString());
-    }
-
-    public void test() throws Exception {
-        checkCompletion("@android:string", 3, "text",
-                EnumSet.of(Format.REFERENCE), null,
-                Arrays.asList(new String[] { }));
-    }
-
-    public void test1a() throws Exception {
-        checkCompletion("matc", 4, "layout_width",
-                EnumSet.of(Format.DIMENSION, Format.ENUM),
-                new String[] { "fill_parent", "match_parent", "wrap_content" },
-
-                Arrays.asList(new String[] { "match_parent", "fill_parent", "wrap_content" }));
-    }
-
-    public void test1b() throws Exception {
-        checkCompletion("fi", 2, "layout_width",
-                EnumSet.of(Format.DIMENSION, Format.ENUM),
-                new String[] { "fill_parent", "match_parent", "wrap_content" },
-
-                Arrays.asList(new String[] { "fill_parent", "match_parent", "wrap_content" }));
-    }
-
-    public void test2() throws Exception {
-        checkCompletion("50", 2, "layout_width",
-                EnumSet.of(Format.DIMENSION, Format.ENUM),
-                new String[] { "fill_parent", "match_parent", "wrap_content" },
-
-                Arrays.asList(new String[] { "50dp", "fill_parent", "match_parent",
-                        "wrap_content" }));
-    }
-
-    public void test3() throws Exception {
-        checkCompletion("42", 2, "textSize",
-                EnumSet.of(Format.DIMENSION),
-                null,
-
-                Arrays.asList(new String[] { "42sp", "42dp" }));
-    }
-
-    public void test4() throws Exception {
-        checkCompletion("", 0, "gravity",
-                EnumSet.of(Format.FLAG),
-                new String[] { "top", "bottom", "left", "right", "center" },
-
-                Arrays.asList(new String[] { "top", "bottom", "left", "right", "center" }));
-    }
-
-    public void test5() throws Exception {
-        checkCompletion("left", 4, "gravity",
-                EnumSet.of(Format.FLAG),
-                new String[] { "top", "bottom", "left", "right", "center" },
-
-                Arrays.asList(new String[] {
-                        "left", "left|top", "left|bottom", "left|right", "left|center" }));
-    }
-
-    public void test6() throws Exception {
-        checkCompletion("left|top", 8, "gravity",
-                EnumSet.of(Format.FLAG),
-                new String[] { "top", "bottom", "left", "right", "center" },
-
-                Arrays.asList(new String[] {
-                        "left|top", "left|top|bottom", "left|top|right", "left|top|center" }));
-    }
-
-    // TODO ?android
-
-    private class TestTextAttributeDescriptor extends TextAttributeDescriptor {
-        public TestTextAttributeDescriptor(String xmlLocalName, IAttributeInfo attrInfo) {
-            super(xmlLocalName, ANDROID_URI, attrInfo);
-        }
-    }
-
-    private class TestValueCompleter extends ValueCompleter {
-        private final AttributeDescriptor mDescriptor;
-
-        TestValueCompleter(AttributeDescriptor descriptor) {
-            mDescriptor = descriptor;
-            assert descriptor.getAttributeInfo() != null;
-        }
-
-        @Override
-        @Nullable
-        protected CommonXmlEditor getEditor() {
-            return null;
-        }
-
-        @Override
-        @NonNull
-        protected AttributeDescriptor getDescriptor() {
-            return mDescriptor;
-        }
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/adt/internal/editors/manifest/model/UiElementNodeTest.java b/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/adt/internal/editors/manifest/model/UiElementNodeTest.java
deleted file mode 100644
index d19f933..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/adt/internal/editors/manifest/model/UiElementNodeTest.java
+++ /dev/null
@@ -1,284 +0,0 @@
-/*
- * Copyright (C) 2007 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.editors.manifest.model;
-
-import com.android.SdkConstants;
-import com.android.ide.eclipse.adt.internal.editors.descriptors.ElementDescriptor;
-import com.android.ide.eclipse.adt.internal.editors.descriptors.ElementDescriptor.Mandatory;
-import com.android.ide.eclipse.adt.internal.editors.mock.MockXmlNode;
-import com.android.ide.eclipse.adt.internal.editors.uimodel.UiElementNode;
-import com.android.utils.XmlUtils;
-
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-
-import java.util.Iterator;
-
-import javax.xml.parsers.DocumentBuilder;
-import javax.xml.parsers.DocumentBuilderFactory;
-
-import junit.framework.TestCase;
-
-@SuppressWarnings("javadoc")
-public class UiElementNodeTest extends TestCase {
-
-    private UiElementNode ui;
-    private ElementDescriptor mManifestDesc;
-    private ElementDescriptor mAppDesc;
-    private ElementDescriptor mUsesSdkDesc;
-
-    @Override
-    protected void setUp() throws Exception {
-        mAppDesc = new ElementDescriptor("application", new ElementDescriptor[] {
-                new ElementDescriptor("provider"),
-                new ElementDescriptor("activity", new ElementDescriptor[] {
-                    new ElementDescriptor("intent-filter")
-                }),
-            }, Mandatory.MANDATORY_LAST);
-
-        mUsesSdkDesc = new ElementDescriptor("uses-sdk", new ElementDescriptor[] {},
-                Mandatory.MANDATORY);
-
-        mManifestDesc = new ElementDescriptor("manifest", new ElementDescriptor[] {
-                mAppDesc,
-                mUsesSdkDesc,
-                new ElementDescriptor("permission")
-            }, Mandatory.MANDATORY);
-
-        ui = new UiElementNode(mManifestDesc);
-
-        super.setUp();
-    }
-
-    @Override
-    protected void tearDown() throws Exception {
-        super.tearDown();
-        // pass
-    }
-
-    /**
-     * Check initialization values for ui node
-     */
-    public void testInit() {
-        assertSame(mManifestDesc, ui.getDescriptor());
-        assertNull(ui.getUiParent());
-        assertEquals(0, ui.getUiChildren().size());
-        assertEquals(0, ui.getAllUiAttributes().size());
-    }
-
-    /**
-     * We declared the descriptors as having a "mandatory last" application element
-     * and a mandatory non-last uses-sdk element. This means if we create an empty
-     * UiModel, we should get these two created, with the application element after
-     * the uses-sdk.
-     */
-    public void testMandatoryOrder() {
-        // Add the mandatory nodes with no XML backing, do it explicitly in the wrong order.
-        assertEquals(0, ui.getUiChildren().size());
-        ui.appendNewUiChild(mAppDesc);
-        ui.appendNewUiChild(mUsesSdkDesc);
-
-        assertEquals(2, ui.getUiChildren().size());
-        assertSame(mAppDesc,     ui.getUiChildren().get(0).getDescriptor());
-        assertSame(mUsesSdkDesc, ui.getUiChildren().get(1).getDescriptor());
-
-        // Parse an XML with just a manifest.
-        MockXmlNode root = new MockXmlNode(null /* namespace */, "manifest", Node.ELEMENT_NODE,
-            new MockXmlNode[] {
-                new MockXmlNode(null /* namespace */, "application", Node.ELEMENT_NODE, null)
-            });
-
-        ui.loadFromXmlNode(root);
-
-        // We should get 2 children, the 2 mandatory nodes but this time with uses-sdk
-        // before application since it's a mandatory-last so it "moves" to the end if possible.
-        assertEquals(2, ui.getUiChildren().size());
-        assertSame(mUsesSdkDesc, ui.getUiChildren().get(0).getDescriptor());
-        assertNull(ui.getUiChildren().get(0).getXmlNode());
-        assertSame(mAppDesc, ui.getUiChildren().get(1).getDescriptor());
-        assertNotNull(ui.getUiChildren().get(1).getXmlNode());
-    }
-
-    /**
-     * loadFrom() does nothing if the root node doesn't match what's expected
-     */
-    public void testLoadFrom_InvalidRoot() {
-        assertEquals(0, ui.getUiChildren().size());
-        MockXmlNode root = new MockXmlNode(null /* namespace */, "blah", Node.ELEMENT_NODE, null);
-        ui.loadFromXmlNode(root);
-        assertEquals(0, ui.getUiChildren().size());
-    }
-
-    /**
-     * UiElementNode.loadFrom should be used to populate an empty ui node from an
-     * existing XML node tree.
-     */
-    public void testLoadFrom_NewTree_1_Node() {
-        MockXmlNode root = new MockXmlNode(null /* namespace */, "manifest", Node.ELEMENT_NODE,
-            new MockXmlNode[] {
-                new MockXmlNode(null /* namespace */, "application", Node.ELEMENT_NODE, null)
-            });
-
-        // get /manifest
-        ui.loadFromXmlNode(root);
-        assertEquals("manifest", ui.getDescriptor().getXmlName());
-        assertEquals(1, ui.getUiChildren().size());
-        assertEquals(0, ui.getAllUiAttributes().size());
-
-        // get /manifest/application
-        Iterator<UiElementNode> ui_child_it = ui.getUiChildren().iterator();
-        UiElementNode application = ui_child_it.next();
-        assertEquals("application", application.getDescriptor().getXmlName());
-        assertEquals(0, application.getUiChildren().size());
-        assertEquals(0, application.getAllUiAttributes().size());
-    }
-
-
-    public void testLoadFrom_NewTree_2_Nodes() {
-        MockXmlNode root = new MockXmlNode(null /* namespace */, "manifest", Node.ELEMENT_NODE,
-            new MockXmlNode[] {
-                new MockXmlNode(null /* namespace */, "application", Node.ELEMENT_NODE, null),
-                new MockXmlNode(null /* namespace */, "permission", Node.ELEMENT_NODE, null),
-            });
-
-        // get /manifest
-        ui.loadFromXmlNode(root);
-        assertEquals("manifest", ui.getDescriptor().getXmlName());
-        assertEquals(2, ui.getUiChildren().size());
-        assertEquals(0, ui.getAllUiAttributes().size());
-
-        // get /manifest/application
-        Iterator<UiElementNode> ui_child_it = ui.getUiChildren().iterator();
-        UiElementNode application = ui_child_it.next();
-        assertEquals("application", application.getDescriptor().getXmlName());
-        assertEquals(0, application.getUiChildren().size());
-        assertEquals(0, application.getAllUiAttributes().size());
-        assertEquals(0, application.getUiSiblingIndex());
-
-        // get /manifest/permission
-        UiElementNode first_permission = ui_child_it.next();
-        assertEquals("permission", first_permission.getDescriptor().getXmlName());
-        assertEquals(0, first_permission.getUiChildren().size());
-        assertEquals(0, first_permission.getAllUiAttributes().size());
-        assertEquals(1, first_permission.getUiSiblingIndex());
-    }
-
-    public void testLoadFrom_NewTree_N_Nodes() {
-        MockXmlNode root = new MockXmlNode(null /* namespace */, "manifest", Node.ELEMENT_NODE,
-            new MockXmlNode[] {
-                new MockXmlNode(null /* namespace */, "application", Node.ELEMENT_NODE,
-                    new MockXmlNode[] {
-                        new MockXmlNode(null /* namespace */, "activity", Node.ELEMENT_NODE,
-                            null),
-                        new MockXmlNode(null /* namespace */, "activity", Node.ELEMENT_NODE,
-                            new MockXmlNode[] {
-                                new MockXmlNode(null /* namespace */, "intent-filter",
-                                        Node.ELEMENT_NODE, null),
-                            }),
-                        new MockXmlNode(null /* namespace */, "provider", Node.ELEMENT_NODE,
-                                null),
-                        new MockXmlNode(null /* namespace */, "provider", Node.ELEMENT_NODE,
-                                null),
-                    }),
-                new MockXmlNode(null /* namespace */, "permission", Node.ELEMENT_NODE,
-                        null),
-                new MockXmlNode(null /* namespace */, "permission", Node.ELEMENT_NODE,
-                        null),
-            });
-
-        // get /manifest
-        ui.loadFromXmlNode(root);
-        assertEquals("manifest", ui.getDescriptor().getXmlName());
-        assertEquals(3, ui.getUiChildren().size());
-        assertEquals(0, ui.getAllUiAttributes().size());
-
-        // get /manifest/application
-        Iterator<UiElementNode> ui_child_it = ui.getUiChildren().iterator();
-        UiElementNode application = ui_child_it.next();
-        assertEquals("application", application.getDescriptor().getXmlName());
-        assertEquals(4, application.getUiChildren().size());
-        assertEquals(0, application.getAllUiAttributes().size());
-
-        // get /manifest/application/activity #1
-        Iterator<UiElementNode> app_child_it = application.getUiChildren().iterator();
-        UiElementNode first_activity = app_child_it.next();
-        assertEquals("activity", first_activity.getDescriptor().getXmlName());
-        assertEquals(0, first_activity.getUiChildren().size());
-        assertEquals(0, first_activity.getAllUiAttributes().size());
-
-        // get /manifest/application/activity #2
-        UiElementNode second_activity = app_child_it.next();
-        assertEquals("activity", second_activity.getDescriptor().getXmlName());
-        assertEquals(1, second_activity.getUiChildren().size());
-        assertEquals(0, second_activity.getAllUiAttributes().size());
-
-        // get /manifest/application/activity #2/intent-filter #1
-        Iterator<UiElementNode> activity_child_it = second_activity.getUiChildren().iterator();
-        UiElementNode intent_filter = activity_child_it.next();
-        assertEquals("intent-filter", intent_filter.getDescriptor().getXmlName());
-        assertEquals(0, intent_filter.getUiChildren().size());
-        assertEquals(0, intent_filter.getAllUiAttributes().size());
-
-        // get /manifest/application/provider #1
-        UiElementNode first_provider = app_child_it.next();
-        assertEquals("provider", first_provider.getDescriptor().getXmlName());
-        assertEquals(0, first_provider.getUiChildren().size());
-        assertEquals(0, first_provider.getAllUiAttributes().size());
-
-        // get /manifest/application/provider #2
-        UiElementNode second_provider = app_child_it.next();
-        assertEquals("provider", second_provider.getDescriptor().getXmlName());
-        assertEquals(0, second_provider.getUiChildren().size());
-        assertEquals(0, second_provider.getAllUiAttributes().size());
-
-        // get /manifest/permission #1
-        UiElementNode first_permission = ui_child_it.next();
-        assertEquals("permission", first_permission.getDescriptor().getXmlName());
-        assertEquals(0, first_permission.getUiChildren().size());
-        assertEquals(0, first_permission.getAllUiAttributes().size());
-
-        // get /manifest/permission #1
-        UiElementNode second_permission = ui_child_it.next();
-        assertEquals("permission", second_permission.getDescriptor().getXmlName());
-        assertEquals(0, second_permission.getUiChildren().size());
-        assertEquals(0, second_permission.getAllUiAttributes().size());
-    }
-
-    public void testCreateNameSpace() 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");
-        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("android", prefix);
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/adt/internal/editors/mock/MockNamedNodeMap.java b/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/adt/internal/editors/mock/MockNamedNodeMap.java
deleted file mode 100644
index 0330216..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/adt/internal/editors/mock/MockNamedNodeMap.java
+++ /dev/null
@@ -1,112 +0,0 @@
-/*
- * 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.editors.mock;
-
-import org.w3c.dom.DOMException;
-import org.w3c.dom.NamedNodeMap;
-import org.w3c.dom.Node;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-
-class MockNamedNodeMap implements NamedNodeMap {
-
-    /** map for access by namespace/name */
-    private final HashMap<String, HashMap<String, Node>> mNodeMap =
-        new HashMap<String, HashMap<String, Node>>();
-
-    /** list for access by index */
-    private final ArrayList<Node> mNodeList = new ArrayList<Node>();
-
-    public MockXmlNode addAttribute(String namespace, String localName, String value) {
-        MockXmlNode node = new MockXmlNode(namespace, localName, value);
-
-        if (namespace == null) {
-            namespace = ""; // no namespace
-        }
-
-        // get the map for the namespace
-        HashMap<String, Node> map = mNodeMap.get(namespace);
-        if (map == null) {
-            map = new HashMap<String, Node>();
-            mNodeMap.put(namespace, map);
-        }
-
-
-        map.put(localName, node);
-        mNodeList.add(node);
-
-        return node;
-    }
-
-    // --------- NamedNodeMap -------
-
-    @Override
-    public int getLength() {
-        return mNodeList.size();
-    }
-
-    @Override
-    public Node getNamedItem(String name) {
-        HashMap<String, Node> map = mNodeMap.get(""); // no namespace
-        if (map != null) {
-            return map.get(name);
-        }
-
-        return null;
-    }
-
-    @Override
-    public Node getNamedItemNS(String namespaceURI, String localName) throws DOMException {
-        if (namespaceURI == null) {
-            namespaceURI = ""; //no namespace
-        }
-
-        HashMap<String, Node> map = mNodeMap.get(namespaceURI);
-        if (map != null) {
-            return map.get(localName);
-        }
-
-        return null;
-    }
-
-    @Override
-    public Node item(int index) {
-        return mNodeList.get(index);
-    }
-
-    @Override
-    public Node removeNamedItem(String name) throws DOMException {
-        throw new UnsupportedOperationException("Operation not implemented.");  //$NON-NLS-1$
-    }
-
-    @Override
-    public Node removeNamedItemNS(String namespaceURI, String localName) throws DOMException {
-        throw new UnsupportedOperationException("Operation not implemented.");  //$NON-NLS-1$
-    }
-
-    @Override
-    public Node setNamedItem(Node arg) throws DOMException {
-        throw new UnsupportedOperationException("Operation not implemented.");  //$NON-NLS-1$
-    }
-
-    @Override
-    public Node setNamedItemNS(Node arg) throws DOMException {
-        throw new UnsupportedOperationException("Operation not implemented.");  //$NON-NLS-1$
-    }
-
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/adt/internal/editors/mock/MockNodeList.java b/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/adt/internal/editors/mock/MockNodeList.java
deleted file mode 100644
index ff9df19..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/adt/internal/editors/mock/MockNodeList.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * Copyright (C) 2007 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.editors.mock;
-
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-
-import java.util.ArrayList;
-
-
-/**
- * A quick mock implementation of NodeList on top of ArrayList.
- */
-public class MockNodeList implements NodeList {
-
-    ArrayList<MockXmlNode> mChildren;
-
-    /**
-    * Constructs a node list from a given children list.
-    *
-    * @param children The children list. Can be null.
-     */
-    public MockNodeList(MockXmlNode[] children) {
-        mChildren = new ArrayList<MockXmlNode>();
-        if (children != null) {
-            for (MockXmlNode n : children) {
-                mChildren.add(n);
-            }
-        }
-    }
-
-    @Override
-    public int getLength() {
-        return mChildren.size();
-    }
-
-    @Override
-    public Node item(int index) {
-        if (index >= 0 && index < mChildren.size()) {
-            return mChildren.get(index);
-        }
-        return null;
-    }
-
-    public ArrayList<MockXmlNode> getArrayList() {
-        return mChildren;
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/adt/internal/editors/mock/MockXmlNode.java b/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/adt/internal/editors/mock/MockXmlNode.java
deleted file mode 100644
index 77de2c8..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/adt/internal/editors/mock/MockXmlNode.java
+++ /dev/null
@@ -1,319 +0,0 @@
-/*
- * Copyright (C) 2007 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.editors.mock;
-
-import org.w3c.dom.DOMException;
-import org.w3c.dom.Document;
-import org.w3c.dom.NamedNodeMap;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-import org.w3c.dom.UserDataHandler;
-
-import java.util.HashMap;
-
-
-/**
- * A mock XML node with only a minimal set of information.
- */
-public class MockXmlNode implements Node {
-
-    MockNodeList mNodeList;
-    private String mLocalName;
-    private String mNamespace;
-    private short mNodeType;
-    private MockXmlNode mParent;
-    private MockXmlNode mPreviousSibling;
-    private MockXmlNode mNextSibling;
-    private String mAttrValue;
-    private MockNamedNodeMap mAttributes;
-
-    // namespace stuff only set in the root node
-    /** map from namespace to prefix. */
-    private HashMap<String, String> mNsMap = null;
-
-    /**
-     * Constructs a node from a given children list.
-     *
-     * @param namespace The namespace of the node or null if none
-     * @param localName The XML local node name.
-     * @param node_type One of Node.xxx_NODE constants, e.g. Node.ELEMENT_NODE
-     * @param children The children list. Can be null.
-     */
-    public MockXmlNode(String namespace, String localName, short node_type,
-            MockXmlNode[] children) {
-        mLocalName = localName;
-        mNamespace = namespace;
-        mNodeType = node_type;
-        mNodeList = new MockNodeList(children);
-        fixNavigation();
-    }
-
-    /**
-     * Constructs an attribute node
-     *
-     * @param namespace The namespace of the node or null if none
-     * @param localName The XML local node name.
-     * @param value the value of the attribute
-     */
-    public MockXmlNode(String namespace, String localName, String value) {
-        mLocalName = localName;
-        mNamespace = namespace;
-        mAttrValue = value;
-        mNodeType = Node.ATTRIBUTE_NODE;
-        mNodeList = new MockNodeList(new MockXmlNode[0]);
-        fixNavigation();
-    }
-
-    private void fixNavigation() {
-        MockXmlNode prev = null;
-        for (MockXmlNode n : mNodeList.getArrayList()) {
-            n.mParent = this;
-            n.mPreviousSibling = prev;
-            if (prev != null) {
-                prev.mNextSibling = n;
-            }
-            n.fixNavigation();
-            prev = n;
-        }
-    }
-
-    public void addAttributes(String namespaceURI, String localName, String value) {
-        if (mAttributes == null) {
-            mAttributes = new MockNamedNodeMap();
-        }
-
-        MockXmlNode node = mAttributes.addAttribute(namespaceURI, localName, value);
-        node.mParent = this;
-    }
-
-    public void setPrefix(String namespace, String prefix) {
-        if (mNsMap == null) {
-            mNsMap = new HashMap<String, String>();
-        }
-
-        mNsMap.put(namespace, prefix);
-    }
-
-    public String getPrefix(String namespace) {
-        if (mNsMap != null) {
-            return mNsMap.get(namespace);
-        }
-
-        return mParent.getPrefix(namespace);
-    }
-
-
-    // ----------- Node methods
-
-    @Override
-    public Node appendChild(Node newChild) throws DOMException {
-        mNodeList.getArrayList().add((MockXmlNode) newChild);
-        return newChild;
-    }
-
-    @Override
-    public NamedNodeMap getAttributes() {
-        return mAttributes;
-    }
-
-    @Override
-    public NodeList getChildNodes() {
-        return mNodeList;
-    }
-
-    @Override
-    public Node getFirstChild() {
-        if (mNodeList.getLength() > 0) {
-            return mNodeList.item(0);
-        }
-        return null;
-    }
-
-    @Override
-    public Node getLastChild() {
-        if (mNodeList.getLength() > 0) {
-            return mNodeList.item(mNodeList.getLength() - 1);
-        }
-        return null;
-    }
-
-    @Override
-    public Node getNextSibling() {
-        return mNextSibling;
-    }
-
-    @Override
-    public String getNodeName() {
-        return mLocalName;
-    }
-
-    @Override
-    public String getLocalName() {
-        return mLocalName;
-    }
-
-    @Override
-    public short getNodeType() {
-        return mNodeType;
-    }
-
-    @Override
-    public Node getParentNode() {
-        return mParent;
-    }
-
-    @Override
-    public Node getPreviousSibling() {
-        return mPreviousSibling;
-    }
-
-    @Override
-    public boolean hasChildNodes() {
-        return mNodeList.getLength() > 0;
-    }
-
-    @Override
-    public boolean hasAttributes() {
-        throw new UnsupportedOperationException("Operation not implemented.");  //$NON-NLS-1$
-    }
-
-    @Override
-    public boolean isSameNode(Node other) {
-        return this == other;
-    }
-
-    @Override
-    public String getNodeValue() throws DOMException {
-        return mAttrValue;
-    }
-
-    @Override
-    public String getPrefix() {
-        return getPrefix(getNamespaceURI());
-    }
-
-    @Override
-    public String getNamespaceURI() {
-        return mNamespace;
-    }
-
-
-    // --- methods not implemented ---
-
-    @Override
-    public Node cloneNode(boolean deep) {
-        throw new UnsupportedOperationException("Operation not implemented.");  //$NON-NLS-1$
-    }
-
-    @Override
-    public short compareDocumentPosition(Node other) throws DOMException {
-        throw new UnsupportedOperationException("Operation not implemented.");  //$NON-NLS-1$
-    }
-
-    @Override
-    public String getBaseURI() {
-        throw new UnsupportedOperationException("Operation not implemented.");  //$NON-NLS-1$
-    }
-
-    @Override
-    public Object getFeature(String feature, String version) {
-        throw new UnsupportedOperationException("Operation not implemented.");  //$NON-NLS-1$
-    }
-
-    @Override
-    public Document getOwnerDocument() {
-        throw new UnsupportedOperationException("Operation not implemented.");  //$NON-NLS-1$
-    }
-
-    @Override
-    public String getTextContent() throws DOMException {
-        throw new UnsupportedOperationException("Operation not implemented.");  //$NON-NLS-1$
-    }
-
-    @Override
-    public Object getUserData(String key) {
-        throw new UnsupportedOperationException("Operation not implemented.");  //$NON-NLS-1$
-    }
-
-    @Override
-    public Node insertBefore(Node newChild, Node refChild)
-            throws DOMException {
-        throw new UnsupportedOperationException("Operation not implemented.");  //$NON-NLS-1$
-    }
-
-    @Override
-    public boolean isDefaultNamespace(String namespaceURI) {
-        throw new UnsupportedOperationException("Operation not implemented.");  //$NON-NLS-1$
-    }
-
-    @Override
-    public boolean isEqualNode(Node arg) {
-        throw new UnsupportedOperationException("Operation not implemented.");  //$NON-NLS-1$
-    }
-
-    @Override
-    public boolean isSupported(String feature, String version) {
-        throw new UnsupportedOperationException("Operation not implemented.");  //$NON-NLS-1$
-    }
-
-    @Override
-    public String lookupNamespaceURI(String prefix) {
-        throw new UnsupportedOperationException("Operation not implemented.");  //$NON-NLS-1$
-    }
-
-    @Override
-    public String lookupPrefix(String namespaceURI) {
-        throw new UnsupportedOperationException("Operation not implemented.");  //$NON-NLS-1$
-    }
-
-    @Override
-    public void normalize() {
-        throw new UnsupportedOperationException("Operation not implemented.");  //$NON-NLS-1$
-    }
-
-    @Override
-    public Node removeChild(Node oldChild) throws DOMException {
-        throw new UnsupportedOperationException("Operation not implemented.");  //$NON-NLS-1$
-    }
-
-    @Override
-    public Node replaceChild(Node newChild, Node oldChild)
-            throws DOMException {
-        throw new UnsupportedOperationException("Operation not implemented.");  //$NON-NLS-1$
-    }
-
-    @Override
-    public void setNodeValue(String nodeValue) throws DOMException {
-        throw new UnsupportedOperationException("Operation not implemented.");  //$NON-NLS-1$
-    }
-
-    @Override
-    public void setPrefix(String prefix) throws DOMException {
-        throw new UnsupportedOperationException("Operation not implemented.");  //$NON-NLS-1$
-    }
-
-    @Override
-    public void setTextContent(String textContent) throws DOMException {
-        throw new UnsupportedOperationException("Operation not implemented.");  //$NON-NLS-1$
-    }
-
-    @Override
-    public Object setUserData(String key, Object data,
-            UserDataHandler handler) {
-        throw new UnsupportedOperationException("Operation not implemented.");  //$NON-NLS-1$
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/adt/internal/editors/resources/manager/ConfigMatchTest.java b/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/adt/internal/editors/resources/manager/ConfigMatchTest.java
deleted file mode 100644
index a6da135..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/adt/internal/editors/resources/manager/ConfigMatchTest.java
+++ /dev/null
@@ -1,297 +0,0 @@
-/*
- * 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.editors.resources.manager;
-
-import com.android.SdkConstants;
-import com.android.ide.common.resources.ResourceFile;
-import com.android.ide.common.resources.ResourceFolder;
-import com.android.ide.common.resources.ResourceItem;
-import com.android.ide.common.resources.ResourceRepository;
-import com.android.ide.common.resources.SingleResourceFile;
-import com.android.ide.common.resources.configuration.FolderConfiguration;
-import com.android.ide.eclipse.adt.internal.resources.manager.ProjectResources;
-import com.android.ide.eclipse.adt.io.IFileWrapper;
-import com.android.ide.eclipse.adt.io.IFolderWrapper;
-import com.android.ide.eclipse.mock.Mocks;
-import com.android.io.IAbstractFolder;
-import com.android.io.IAbstractResource;
-import com.android.resources.Keyboard;
-import com.android.resources.KeyboardState;
-import com.android.resources.Navigation;
-import com.android.resources.NavigationState;
-import com.android.resources.NightMode;
-import com.android.resources.ResourceFolderType;
-import com.android.resources.ScreenOrientation;
-import com.android.resources.TouchScreen;
-import com.android.resources.UiMode;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IFolder;
-
-import junit.framework.TestCase;
-
-public class ConfigMatchTest extends TestCase {
-    private static final String SEARCHED_FILENAME = "main.xml"; //$NON-NLS-1$
-    private static final String MISC1_FILENAME = "foo.xml"; //$NON-NLS-1$
-    private static final String MISC2_FILENAME = "bar.xml"; //$NON-NLS-1$
-
-    private FolderConfiguration mDefaultConfig;
-    private ResourceRepository mResources;
-    private FolderConfiguration config4;
-    private FolderConfiguration config3;
-    private FolderConfiguration config2;
-    private FolderConfiguration config1;
-
-    @Override
-    protected void setUp() throws Exception {
-        super.setUp();
-
-        // create a default config with all qualifiers.
-        mDefaultConfig = new FolderConfiguration();
-        mDefaultConfig.createDefault();
-
-        IAbstractFolder folder = Mocks.createAbstractFolder(
-                SdkConstants.FD_RESOURCES, new IAbstractResource[0]);
-
-        // create the project resources.
-        mResources = new ResourceRepository(folder, false) {
-            @Override
-            protected ResourceItem createResourceItem(String name) {
-                return new ResourceItem(name);
-            }
-        };
-
-        // create 2 arrays of IResource. one with the filename being looked up, and one without.
-        // Since the required API uses IResource, we can use MockFolder for them.
-        IFile[] validMemberList = new IFile[] {
-                Mocks.createFile(MISC1_FILENAME),
-                Mocks.createFile(SEARCHED_FILENAME),
-                Mocks.createFile(MISC2_FILENAME),
-        };
-        IFile[] invalidMemberList = new IFile[] {
-                Mocks.createFile(MISC1_FILENAME),
-                Mocks.createFile(MISC2_FILENAME),
-        };
-
-        // add multiple ResourceFolder to the project resource.
-        FolderConfiguration defaultConfig = getConfiguration(
-                null, // country code
-                null, // network code
-                null, // language
-                null, // region
-                null, // smallest width dp
-                null, // width dp
-                null, // height dp
-                null, // screen size
-                null, // screen ratio
-                null, // screen orientation
-                null, // dock mode
-                null, // night mode
-                null, // dpi
-                null, // touch mode
-                null, // keyboard state
-                null, // text input
-                null, // navigation state
-                null, // navigation method
-                null, // screen dimension
-                null);// version
-
-        addFolder(mResources, defaultConfig, validMemberList);
-
-        config1 = getConfiguration(
-                null, // country code
-                null, // network code
-                "en", // language
-                null, // region
-                null, // smallest width dp
-                null, // width dp
-                null, // height dp
-                null, // screen size
-                null, // screen ratio
-                null, // screen orientation
-                null, // dock mode
-                null, // night mode
-                null, // dpi
-                null, // touch mode
-                KeyboardState.EXPOSED.getResourceValue(), // keyboard state
-                null, // text input
-                null, // navigation state
-                null, // navigation method
-                null, // screen dimension
-                null);// version
-
-        addFolder(mResources, config1, validMemberList);
-
-        config2 = getConfiguration(
-                null, // country code
-                null, // network code
-                "en", // language
-                null, // region
-                null, // smallest width dp
-                null, // width dp
-                null, // height dp
-                null, // screen size
-                null, // screen ratio
-                null, // screen orientation
-                null, // dock mode
-                null, // night mode
-                null, // dpi
-                null, // touch mode
-                KeyboardState.HIDDEN.getResourceValue(), // keyboard state
-                null, // text input
-                null, // navigation state
-                null, // navigation method
-                null, // screen dimension
-                null);// version
-
-        addFolder(mResources, config2, validMemberList);
-
-        config3 = getConfiguration(
-                null, // country code
-                null, // network code
-                "en", // language
-                null, // region
-                null, // smallest width dp
-                null, // width dp
-                null, // height dp
-                null, // screen size
-                null, // screen ratio
-                ScreenOrientation.LANDSCAPE.getResourceValue(), // screen orientation
-                null, // dock mode
-                null, // night mode
-                null, // dpi
-                null, // touch mode
-                null, // keyboard state
-                null, // text input
-                null, // navigation state
-                null, // navigation method
-                null, // screen dimension
-                null);// version
-
-        addFolder(mResources, config3, validMemberList);
-
-        config4 = getConfiguration(
-                "mcc310", // country code
-                "mnc435", // network code
-                "en", // language
-                "rUS", // region
-                null, // smallest width dp
-                null, // width dp
-                null, // height dp
-                "normal", // screen size
-                "notlong", // screen ratio
-                ScreenOrientation.LANDSCAPE.getResourceValue(), // screen orientation
-                UiMode.DESK.getResourceValue(), // dock mode
-                NightMode.NIGHT.getResourceValue(), // night mode
-                "mdpi", // dpi
-                TouchScreen.FINGER.getResourceValue(), // touch mode
-                KeyboardState.EXPOSED.getResourceValue(), // keyboard state
-                Keyboard.QWERTY.getResourceValue(), // text input
-                NavigationState.EXPOSED.getResourceValue(), // navigation state
-                Navigation.DPAD.getResourceValue(), // navigation method
-                "480x320", // screen dimension
-                "v3"); // version
-
-        addFolder(mResources, config4, invalidMemberList);
-    }
-
-    @Override
-    protected void tearDown() throws Exception {
-        super.tearDown();
-        mResources = null;
-    }
-
-    public void test1() {
-        FolderConfiguration testConfig = getConfiguration(
-                "mcc310", // country code
-                "mnc435", // network code
-                "en", // language
-                "rUS", // region
-                null, // smallest width dp
-                null, // width dp
-                null, // height dp
-                "normal", // screen size
-                "notlong", // screen ratio
-                ScreenOrientation.LANDSCAPE.getResourceValue(), // screen orientation
-                UiMode.DESK.getResourceValue(), // dock mode
-                NightMode.NIGHT.getResourceValue(), // night mode
-                "mdpi", // dpi
-                TouchScreen.FINGER.getResourceValue(), // touch mode
-                KeyboardState.EXPOSED.getResourceValue(), // keyboard state
-                Keyboard.QWERTY.getResourceValue(), // text input
-                NavigationState.EXPOSED.getResourceValue(), // navigation state
-                Navigation.DPAD.getResourceValue(), // navigation method
-                "480x320", // screen dimension
-                "v3"); // version
-
-        ResourceFile result = mResources.getMatchingFile(SEARCHED_FILENAME,
-                ResourceFolderType.LAYOUT, testConfig);
-
-        boolean bresult = result.getFolder().getConfiguration().equals(config3);
-        assertEquals(bresult, true);
-    }
-
-    /**
-     * Creates a {@link FolderConfiguration}.
-     * @param qualifierValues The list of qualifier values. The length must equals the total number
-     * of Qualifiers. <code>null</code> is permitted and will make the FolderConfiguration not use
-     * this particular qualifier.
-     */
-    private FolderConfiguration getConfiguration(String... qualifierValues) {
-        // FolderConfiguration.getQualifierCount is always valid and up to date.
-        final int count = FolderConfiguration.getQualifierCount();
-
-        // Check we have the right number of qualifier.
-        assertEquals(qualifierValues.length, count);
-
-        FolderConfiguration config = new FolderConfiguration();
-
-        for (int i = 0 ; i < count ; i++) {
-            String value = qualifierValues[i];
-            if (value != null) {
-                assertTrue(mDefaultConfig.getQualifier(i).checkAndSet(value, config));
-            }
-        }
-
-        return config;
-    }
-
-    /**
-     * Adds a folder to the given {@link ProjectResources} with the given
-     * {@link FolderConfiguration}. The folder is filled with files from the provided list.
-     * @param resources the {@link ResourceRepository} in which to add the folder.
-     * @param config the {@link FolderConfiguration} for the created folder.
-     * @param memberList the list of files for the folder.
-     */
-    private void addFolder(ResourceRepository resources, FolderConfiguration config,
-            IFile[] memberList) throws Exception {
-
-        // figure out the folder name based on the configuration
-        String folderName = config.getFolderName(ResourceFolderType.LAYOUT);
-
-        // create the folder mock
-        IFolder folder = Mocks.createFolder(folderName, memberList);
-
-        // add it to the resource, and get back a ResourceFolder object.
-        ResourceFolder resFolder = resources.processFolder(new IFolderWrapper(folder));
-
-        // and fill it with files from the list.
-        for (IFile file : memberList) {
-            resFolder.addFile(new SingleResourceFile(new IFileWrapper(file), resFolder));
-        }
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/adt/internal/project/ProjectHelperTest.java b/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/adt/internal/project/ProjectHelperTest.java
deleted file mode 100644
index 22bfef5..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/adt/internal/project/ProjectHelperTest.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * 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.project;
-
-import com.android.ide.eclipse.mock.Mocks;
-
-import org.eclipse.core.runtime.Path;
-import org.eclipse.jdt.core.IClasspathEntry;
-import org.eclipse.jdt.core.IJavaProject;
-
-import junit.framework.TestCase;
-
-public class ProjectHelperTest extends TestCase {
-
-    /** The old container id */
-    private final static String OLD_CONTAINER_ID =
-        "com.android.ide.eclipse.adt.project.AndroidClasspathContainerInitializer"; //$NON-NLS-1$
-
-    /** The container id for the android framework jar file */
-    private final static String CONTAINER_ID =
-        "com.android.ide.eclipse.adt.ANDROID_FRAMEWORK"; //$NON-NLS-1$
-
-    @Override
-    public void setUp() throws Exception {
-        // pass for now
-    }
-
-    @Override
-    public void tearDown() throws Exception {
-        // pass for now
-    }
-
-    public final void testFixProjectClasspathEntriesFromOldContainer() throws Exception {
-        // create a project with a path to an android .zip
-        IJavaProject javaProject = Mocks.createProject(
-                new IClasspathEntry[] {
-                        Mocks.createClasspathEntry(new Path("Project/src"), //$NON-NLS-1$
-                                IClasspathEntry.CPE_SOURCE),
-                        Mocks.createClasspathEntry(new Path(OLD_CONTAINER_ID),
-                                IClasspathEntry.CPE_CONTAINER),
-                },
-                new Path("Project/bin"));
-
-        ProjectHelper.fixProjectClasspathEntries(javaProject);
-
-        IClasspathEntry[] fixedEntries = javaProject.getRawClasspath();
-        assertEquals(3, fixedEntries.length);
-        assertEquals("Project/src", fixedEntries[0].getPath().toString());
-        assertEquals(OLD_CONTAINER_ID, fixedEntries[1].getPath().toString());
-        assertEquals(CONTAINER_ID, fixedEntries[2].getPath().toString());
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/adt/internal/refactorings/core/AndroidTypeMoveParticipantTest.java b/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/adt/internal/refactorings/core/AndroidTypeMoveParticipantTest.java
deleted file mode 100644
index 262ea42..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/adt/internal/refactorings/core/AndroidTypeMoveParticipantTest.java
+++ /dev/null
@@ -1,135 +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.ide.eclipse.adt.internal.refactorings.core;
-
-import com.android.annotations.NonNull;
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.ide.eclipse.adt.internal.project.BaseProjectHelper;
-
-import org.eclipse.core.resources.IFolder;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.jdt.core.IJavaElement;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.IType;
-import org.eclipse.jdt.internal.corext.refactoring.reorg.IReorgPolicy.IMovePolicy;
-import org.eclipse.jdt.internal.corext.refactoring.reorg.JavaMoveProcessor;
-import org.eclipse.jdt.internal.corext.refactoring.reorg.ReorgDestinationFactory;
-import org.eclipse.jdt.internal.corext.refactoring.reorg.ReorgPolicyFactory;
-import org.eclipse.jdt.internal.ui.refactoring.reorg.CreateTargetQueries;
-import org.eclipse.jdt.internal.ui.refactoring.reorg.ReorgQueries;
-import org.eclipse.ltk.core.refactoring.participants.MoveRefactoring;
-import org.eclipse.swt.widgets.Shell;
-
-
-@SuppressWarnings({"javadoc", "restriction"})
-public class AndroidTypeMoveParticipantTest extends RefactoringTestBase {
-    public void testRefactor1() throws Exception {
-        moveType(
-                TEST_PROJECT2,
-                "com.example.refactoringtest.CustomView1",
-                "src/com/example/refactoringtest/subpackage",
-                true /*updateReferences*/,
-
-                "CHANGES:\n" +
-                "-------\n" +
-                "[x] Move resource 'testRefactor1/src/com/example/refactoringtest/CustomView1.java' to 'subpackage'\n" +
-                "\n" +
-                "[x] Move resource 'testRefactor1/src/com/example/refactoringtest/CustomView1.java' to 'subpackage'\n" +
-                "\n" +
-                "[x] customviews.xml - /testRefactor1/res/layout/customviews.xml\n" +
-                "  @@ -9 +9\n" +
-                "  -     <com.example.refactoringtest.CustomView1\n" +
-                "  +     <com.example.refactoringtest.subpackage.CustomView1\n" +
-                "\n" +
-                "\n" +
-                "[x] customviews.xml - /testRefactor1/res/layout-land/customviews.xml\n" +
-                "  @@ -9 +9\n" +
-                "  -     <com.example.refactoringtest.CustomView1\n" +
-                "  +     <com.example.refactoringtest.subpackage.CustomView1");
-    }
-
-    public void testRefactorFragment() throws Exception {
-        moveType(
-                TEST_PROJECT2,
-                "com.example.refactoringtest.MyFragment",
-                "src/com/example/refactoringtest/subpackage",
-                true /*updateReferences*/,
-
-                "CHANGES:\n" +
-                "-------\n" +
-                "[x] Move resource 'testRefactorFragment/src/com/example/refactoringtest/MyFragment.java' to 'subpackage'\n" +
-                "\n" +
-                "[x] Move resource 'testRefactorFragment/src/com/example/refactoringtest/MyFragment.java' to 'subpackage'\n" +
-                "\n" +
-                "[x] activity_main.xml - /testRefactorFragment/res/layout/activity_main.xml\n" +
-                "  @@ -33 +33\n" +
-                "  -     <fragment android:name=\"com.example.refactoringtest.MyFragment\"/>\n" +
-                "  +     <fragment android:name=\"com.example.refactoringtest.subpackage.MyFragment\"/>");
-    }
-
-    public void testRefactor1_norefs() throws Exception {
-        moveType(
-                TEST_PROJECT2,
-                "com.example.refactoringtest.CustomView1",
-                "src/com/example/refactoringtest/subpackage",
-                false /*updateReferences*/,
-
-                "CHANGES:\n" +
-                "-------\n" +
-                "[x] Move resource 'testRefactor1_norefs/src/com/example/refactoringtest/CustomView1.java' to 'subpackage'\n" +
-                "\n" +
-                "[x] Move resource 'testRefactor1_norefs/src/com/example/refactoringtest/CustomView1.java' to 'subpackage'");
-    }
-
-    // ---- Test infrastructure ----
-
-    protected void moveType(
-            @NonNull Object[] testData,
-            @NonNull String typeFqcn,
-            @NonNull String destination,
-            boolean updateReferences,
-            @NonNull String expected) throws Exception {
-        IProject project = createProject(testData);
-
-        IFolder destinationFolder = project.getFolder(destination);
-
-        IJavaProject javaProject = BaseProjectHelper.getJavaProject(project);
-        assertNotNull(javaProject);
-        IType type = javaProject.findType(typeFqcn);
-        assertNotNull(typeFqcn, type);
-        assertTrue(typeFqcn, type.exists());
-        IResource resource = type.getResource();
-        assertNotNull(typeFqcn, resource);
-        assertTrue(typeFqcn, resource.exists());
-
-        IResource[] resources = new IResource[] { resource };
-        IJavaElement[] elements = new IJavaElement[] { type };
-        IMovePolicy policy = ReorgPolicyFactory.createMovePolicy(resources, elements);
-        JavaMoveProcessor processor = new JavaMoveProcessor(policy);
-        processor.setUpdateReferences(updateReferences);
-        processor.setUpdateQualifiedNames(true);
-        assertTrue(policy.canEnable());
-        processor.setDestination(ReorgDestinationFactory.createDestination(destinationFolder));
-        Shell parent = AdtPlugin.getShell();
-        assertNotNull(parent);
-        processor.setCreateTargetQueries(new CreateTargetQueries(parent));
-        processor.setReorgQueries(new ReorgQueries(parent));
-
-        MoveRefactoring refactoring = new MoveRefactoring(processor);
-        checkRefactoring(refactoring, expected);
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/adt/internal/refactorings/core/AndroidTypeRenameParticipantTest.java b/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/adt/internal/refactorings/core/AndroidTypeRenameParticipantTest.java
deleted file mode 100644
index f65124a..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/adt/internal/refactorings/core/AndroidTypeRenameParticipantTest.java
+++ /dev/null
@@ -1,160 +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.ide.eclipse.adt.internal.refactorings.core;
-
-import com.android.annotations.NonNull;
-import com.android.ide.eclipse.adt.internal.project.BaseProjectHelper;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.IType;
-import org.eclipse.jdt.internal.corext.refactoring.rename.RenameTypeProcessor;
-import org.eclipse.ltk.core.refactoring.participants.RenameRefactoring;
-
-
-@SuppressWarnings({"javadoc", "restriction"})
-public class AndroidTypeRenameParticipantTest extends RefactoringTestBase {
-    public void testRefactor1() throws Exception {
-        renameType(
-                TEST_PROJECT,
-                "com.example.refactoringtest.MainActivity",
-                true /*updateReferences*/,
-                "NewActivityName",
-
-                "CHANGES:\n" +
-                "-------\n" +
-                "[x] Rename compilation unit 'MainActivity.java' to 'NewActivityName.java'\n" +
-                "\n" +
-                "[x] activity_main.xml - /testRefactor1/res/layout/activity_main.xml\n" +
-                "  @@ -5 +5\n" +
-                "  -     tools:context=\".MainActivity\" >\n" +
-                "  +     tools:context=\".NewActivityName\" >\n" +
-                "\n" +
-                "\n" +
-                "[x] activity_main.xml - /testRefactor1/res/layout-land/activity_main.xml\n" +
-                "  @@ -5 +5\n" +
-                "  -     tools:context=\".MainActivity\" >\n" +
-                "  +     tools:context=\".NewActivityName\" >\n" +
-                "\n" +
-                "\n" +
-                "[x] AndroidManifest.xml - /testRefactor1/AndroidManifest.xml\n" +
-                "  @@ -16 +16\n" +
-                "  -             android:name=\"com.example.refactoringtest.MainActivity\"\n" +
-                "  +             android:name=\"com.example.refactoringtest.NewActivityName\"");
-    }
-
-    public void testRefactor1b() throws Exception {
-        renameType(
-                TEST_PROJECT,
-                "com.example.refactoringtest.MainActivity2",
-                true /*updateReferences*/,
-                "NewActivityName",
-
-                "CHANGES:\n" +
-                "-------\n" +
-                "[x] Rename compilation unit 'MainActivity2.java' to 'NewActivityName.java'\n" +
-                "\n" +
-                "[x] AndroidManifest.xml - /testRefactor1b/AndroidManifest.xml\n" +
-                "  @@ -25 +25\n" +
-                "  -             android:name=\".MainActivity2\"\n" +
-                "  +             android:name=\".NewActivityName\"");
-    }
-
-    public void testRefactor1_noreferences() throws Exception {
-        renameType(
-                TEST_PROJECT,
-                "com.example.refactoringtest.MainActivity",
-                false /*updateReferences*/,
-                "NewActivityName",
-
-                "CHANGES:\n" +
-                "-------\n" +
-                "[x] Rename compilation unit 'MainActivity.java' to 'NewActivityName.java'");
-    }
-
-    public void testRefactor2() throws Exception {
-        renameType(
-                TEST_PROJECT2,
-                "com.example.refactoringtest.CustomView1",
-                true /*updateReferences*/,
-                "NewCustomViewName",
-
-                "CHANGES:\n" +
-                "-------\n" +
-                "[x] Rename compilation unit 'CustomView1.java' to 'NewCustomViewName.java'\n" +
-                "\n" +
-                "[x] attrs_custom_view.xml - /testRefactor2/res/values/attrs_custom_view.xml\n" +
-                "  @@ -4 +4\n" +
-                "  -     <declare-styleable name=\"CustomView1\">\n" +
-                "  +     <declare-styleable name=\"NewCustomViewName\">\n" +
-                "\n" +
-                "\n" +
-                "[x] customviews.xml - /testRefactor2/res/layout/customviews.xml\n" +
-                "  @@ -9 +9\n" +
-                "  -     <com.example.refactoringtest.CustomView1\n" +
-                "  +     <com.example.refactoringtest.NewCustomViewName\n" +
-                "\n" +
-                "\n" +
-                "[x] customviews.xml - /testRefactor2/res/layout-land/customviews.xml\n" +
-                "  @@ -9 +9\n" +
-                "  -     <com.example.refactoringtest.CustomView1\n" +
-                "  +     <com.example.refactoringtest.NewCustomViewName");
-    }
-
-    public void testRefactorFragment() throws Exception {
-        renameType(
-            TEST_PROJECT2,
-            "com.example.refactoringtest.MyFragment",
-            true /*updateReferences*/,
-            "NewFragmentName",
-
-            "CHANGES:\n" +
-            "-------\n" +
-            "[x] Rename compilation unit 'MyFragment.java' to 'NewFragmentName.java'\n" +
-            "\n" +
-            "[x] activity_main.xml - /testRefactorFragment/res/layout/activity_main.xml\n" +
-            "  @@ -33 +33\n" +
-            "  -     <fragment android:name=\"com.example.refactoringtest.MyFragment\"/>\n" +
-            "  +     <fragment android:name=\"com.example.refactoringtest.NewFragmentName\"/>");
-    }
-
-    // ---- Test infrastructure ----
-
-    protected void renameType(
-            @NonNull Object[] testData,
-            @NonNull String typeFqcn,
-            boolean updateReferences,
-            @NonNull String newName,
-            @NonNull String expected) throws Exception {
-        IProject project = createProject(testData);
-        IJavaProject javaProject = BaseProjectHelper.getJavaProject(project);
-        assertNotNull(javaProject);
-        IType type = javaProject.findType(typeFqcn);
-        assertNotNull(typeFqcn, type);
-        assertTrue(typeFqcn, type.exists());
-        RenameTypeProcessor processor = new RenameTypeProcessor(type);
-        processor.setNewElementName(newName);
-        processor.setUpdateQualifiedNames(true);
-        processor.setUpdateSimilarDeclarations(false);
-        //processor.setMatchStrategy(?);
-        //processor.setFilePatterns(patterns);
-        processor.setUpdateReferences(updateReferences);
-        assertNotNull(processor);
-
-        RenameRefactoring refactoring = new RenameRefactoring(processor);
-        checkRefactoring(refactoring, expected);
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/adt/internal/refactorings/core/RenameResourceXmlTextActionTest.java b/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/adt/internal/refactorings/core/RenameResourceXmlTextActionTest.java
deleted file mode 100644
index e00a44b..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/adt/internal/refactorings/core/RenameResourceXmlTextActionTest.java
+++ /dev/null
@@ -1,110 +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.ide.eclipse.adt.internal.refactorings.core;
-
-import com.android.ide.common.resources.ResourceUrl;
-import com.android.resources.ResourceType;
-
-import org.eclipse.jface.text.Document;
-import org.eclipse.jface.text.IDocument;
-
-import junit.framework.TestCase;
-
-@SuppressWarnings("javadoc")
-public class RenameResourceXmlTextActionTest extends TestCase {
-    public void test_Simple() throws Exception {
-        checkWord("^foo", null);
-        checkWord("'foo'^", null);
-        checkWord("^@bogus", null);
-        checkWord("@bo^gus", null);
-        checkWord("bogus@^", null);
-        checkWord("  @string/nam^e ", getUrl(ResourceType.STRING, "name"));
-        checkWord("@string/nam^e ", getUrl(ResourceType.STRING, "name"));
-        checkWord("\"^@string/name ", getUrl(ResourceType.STRING, "name"));
-        checkWord("^@string/name ", getUrl(ResourceType.STRING, "name"));
-        checkWord("\n^@string/name ", getUrl(ResourceType.STRING, "name"));
-        checkWord("\n^@string/name(", getUrl(ResourceType.STRING, "name"));
-        checkWord("\n^@string/name;", getUrl(ResourceType.STRING, "name"));
-        checkWord("\n^@string/name5", getUrl(ResourceType.STRING, "name5"));
-        checkWord("\n@string/name5^", getUrl(ResourceType.STRING, "name5"));
-        checkWord("\n@string/name5^(", getUrl(ResourceType.STRING, "name5"));
-        checkWord("\n@stri^ng/name5(", getUrl(ResourceType.STRING, "name5"));
-        checkWord("\n@string^/name5(", getUrl(ResourceType.STRING, "name5"));
-        checkWord("\n@string/^name5(", getUrl(ResourceType.STRING, "name5"));
-        checkWord("\n@string^name5(", null);
-        checkWord("\n@strings^/name5(", null);
-        checkWord("\n@+id/^myid(", getUrl(ResourceType.ID, "myid"));
-        checkWord("\n?a^ttr/foo\"", getUrl(ResourceType.ATTR, "foo"));
-        checkWord("\n?f^oo\"", getUrl(ResourceType.ATTR, "foo"));
-        checkWord("\n^?foo\"", getUrl(ResourceType.ATTR, "foo"));
-    }
-
-    private static ResourceUrl getUrl(ResourceType type, String name) {
-        return ResourceUrl.create(type, name, false, false);
-    }
-
-    public void testClassNames() throws Exception {
-        checkClassName("^foo", null);
-        checkClassName("<^foo>", null);
-        checkClassName("'foo.bar.Baz'^", null);
-        checkClassName("<^foo.bar.Baz ", "foo.bar.Baz");
-        checkClassName("<^foo.bar.Baz>", "foo.bar.Baz");
-        checkClassName("<foo.^bar.Baz>", "foo.bar.Baz");
-        checkClassName("<foo.bar.Baz^>", "foo.bar.Baz");
-        checkClassName("<foo.bar.Baz^ >", "foo.bar.Baz");
-        checkClassName("<foo.bar$Baz^ >", "foo.bar.Baz");
-        checkClassName("</^foo.bar.Baz>", "foo.bar.Baz");
-        checkClassName("</foo.^bar.Baz>", "foo.bar.Baz");
-
-        checkClassName("\"^foo.bar.Baz\"", "foo.bar.Baz");
-        checkClassName("\"foo.^bar.Baz\"", "foo.bar.Baz");
-        checkClassName("\"foo.bar.Baz^\"", "foo.bar.Baz");
-        checkClassName("\"foo.bar$Baz^\"", "foo.bar.Baz");
-
-        checkClassName("<foo.^bar@Baz>", null);
-    }
-
-    private void checkClassName(String contents, String expectedClassName)
-            throws Exception {
-        int cursor = contents.indexOf('^');
-        assertTrue("Must set cursor position with ^ in " + contents, cursor != -1);
-        contents = contents.substring(0, cursor) + contents.substring(cursor + 1);
-        assertEquals(-1, contents.indexOf('^'));
-        assertEquals(-1, contents.indexOf('['));
-        assertEquals(-1, contents.indexOf(']'));
-
-        IDocument document = new Document();
-        document.replace(0, 0, contents);
-        String className =
-                RenameResourceXmlTextAction.findClassName(document, null, cursor);
-        assertEquals(expectedClassName, className);
-    }
-
-    private void checkWord(String contents, ResourceUrl expectedResource)
-            throws Exception {
-        int cursor = contents.indexOf('^');
-        assertTrue("Must set cursor position with ^ in " + contents, cursor != -1);
-        contents = contents.substring(0, cursor) + contents.substring(cursor + 1);
-        assertEquals(-1, contents.indexOf('^'));
-        assertEquals(-1, contents.indexOf('['));
-        assertEquals(-1, contents.indexOf(']'));
-
-        IDocument document = new Document();
-        document.replace(0, 0, contents);
-        ResourceUrl resource = RenameResourceXmlTextAction.findResource(document, cursor);
-        assertEquals(expectedResource, resource);
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/adt/internal/resources/ResourceHelperTest.java b/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/adt/internal/resources/ResourceHelperTest.java
deleted file mode 100644
index de4e591..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/adt/internal/resources/ResourceHelperTest.java
+++ /dev/null
@@ -1,183 +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.eclipse.adt.internal.resources;
-
-import com.android.ide.common.resources.ResourceDeltaKind;
-import com.android.ide.common.resources.configuration.FolderConfiguration;
-import com.android.ide.common.resources.configuration.ResourceQualifier;
-import com.android.resources.ResourceType;
-
-import org.eclipse.core.resources.IResourceDelta;
-
-import junit.framework.TestCase;
-
-
-/**
- * Test ResourceHelper
- */
-@SuppressWarnings("javadoc")
-public class ResourceHelperTest extends TestCase {
-
-    /**
-     * temp fake qualifier class.
-     */
-    private static class FakeQualifierClass extends ResourceQualifier {
-
-        @Override
-        public boolean checkAndSet(String value, FolderConfiguration config) {
-            return false;
-        }
-
-        @Override
-        public boolean equals(Object object) {
-            return false;
-        }
-
-        @Override
-        public String getFolderSegment() {
-            return null;
-        }
-
-        @Override
-        public String getLongDisplayValue() {
-            return null;
-        }
-
-        @Override
-        public String getName() {
-            return null;
-        }
-
-        @Override
-        public String getShortDisplayValue() {
-            return null;
-        }
-
-        @Override
-        public String getShortName() {
-            return null;
-        }
-
-        @Override
-        public boolean hasFakeValue() {
-            return false;
-        }
-
-        @Override
-        public int hashCode() {
-            return 0;
-        }
-
-        @Override
-        public boolean isValid() {
-            return false;
-        }
-
-        @Override
-        public int since() {
-            return 0;
-        }
-    }
-
-    public void testGetIcon() throws Exception {
-        // check that the method returns null for an unknown qualifier class
-        assertNull(ResourceHelper.getIcon(FakeQualifierClass.class));
-
-        // find all the qualifiers through FolderConfiguration.createdefault()
-        FolderConfiguration config = new FolderConfiguration();
-        config.createDefault();
-        final int count = FolderConfiguration.getQualifierCount();
-        for (int i = 0 ; i < count ; i++) {
-            ResourceQualifier qual = config.getQualifier(i);
-            assertNotNull(qual);
-            assertNotNull(qual.getClass().getCanonicalName(),
-                    ResourceHelper.getIcon(qual.getClass()));
-        }
-    }
-
-    public void testGetResourceDeltaKind() {
-        assertEquals(ResourceDeltaKind.ADDED,
-                ResourceHelper.getResourceDeltaKind(IResourceDelta.ADDED));
-        assertEquals(ResourceDeltaKind.REMOVED,
-                ResourceHelper.getResourceDeltaKind(IResourceDelta.REMOVED));
-        assertEquals(ResourceDeltaKind.CHANGED,
-                ResourceHelper.getResourceDeltaKind(IResourceDelta.CHANGED));
-
-        assertNull(ResourceHelper.getResourceDeltaKind(IResourceDelta.ADDED_PHANTOM));
-    }
-
-    public void testIsFileBasedResourceType() throws Exception {
-        assertTrue(ResourceHelper.isFileBasedResourceType(ResourceType.ANIMATOR));
-        assertTrue(ResourceHelper.isFileBasedResourceType(ResourceType.LAYOUT));
-
-        assertFalse(ResourceHelper.isFileBasedResourceType(ResourceType.STRING));
-        assertFalse(ResourceHelper.isFileBasedResourceType(ResourceType.DIMEN));
-        assertFalse(ResourceHelper.isFileBasedResourceType(ResourceType.ID));
-
-        // Both:
-        assertTrue(ResourceHelper.isFileBasedResourceType(ResourceType.DRAWABLE));
-        assertTrue(ResourceHelper.isFileBasedResourceType(ResourceType.COLOR));
-    }
-
-    public void testIsValueBasedResourceType() throws Exception {
-        assertTrue(ResourceHelper.isValueBasedResourceType(ResourceType.STRING));
-        assertTrue(ResourceHelper.isValueBasedResourceType(ResourceType.DIMEN));
-        assertTrue(ResourceHelper.isValueBasedResourceType(ResourceType.ID));
-
-        assertFalse(ResourceHelper.isValueBasedResourceType(ResourceType.LAYOUT));
-
-        // These can be both:
-        assertTrue(ResourceHelper.isValueBasedResourceType(ResourceType.DRAWABLE));
-        assertTrue(ResourceHelper.isValueBasedResourceType(ResourceType.COLOR));
-    }
-
-    public void testCanCreateResource() throws Exception {
-        assertTrue(ResourceHelper.canCreateResource("@layout/foo"));
-        assertTrue(ResourceHelper.canCreateResource("@string/foo"));
-        assertTrue(ResourceHelper.canCreateResource("@dimen/foo"));
-        assertTrue(ResourceHelper.canCreateResource("@color/foo"));
-
-        assertFalse(ResourceHelper.canCreateResource("@typo/foo")); // nonexistent type
-        assertFalse(ResourceHelper.canCreateResource("@layout/foo bar")); // space
-        assertFalse(ResourceHelper.canCreateResource("@layout/new")); // keyword
-        assertFalse(ResourceHelper.canCreateResource("@android:string/foo")); // framework
-        assertFalse(ResourceHelper.canCreateResource("@android:dimen/foo"));
-        assertFalse(ResourceHelper.canCreateResource("@android:color/foo"));
-    }
-
-    public void testCanCreateResourceType() throws Exception {
-        assertTrue(ResourceHelper.canCreateResourceType(ResourceType.LAYOUT));
-        assertTrue(ResourceHelper.canCreateResourceType(ResourceType.STRING));
-        assertTrue(ResourceHelper.canCreateResourceType(ResourceType.DIMEN));
-        assertTrue(ResourceHelper.canCreateResourceType(ResourceType.COLOR));
-
-        assertFalse(ResourceHelper.canCreateResourceType(ResourceType.RAW));
-        assertFalse(ResourceHelper.canCreateResourceType(ResourceType.XML));
-    }
-
-    public void testStyleToTheme() throws Exception {
-        assertEquals("Foo", ResourceHelper.styleToTheme("Foo"));
-        assertEquals("Theme", ResourceHelper.styleToTheme("@android:style/Theme"));
-        assertEquals("LocalTheme", ResourceHelper.styleToTheme("@style/LocalTheme"));
-        //assertEquals("LocalTheme", ResourceHelper.styleToTheme("@foo.bar:style/LocalTheme"));
-    }
-
-    public void testIsProjectStyle() throws Exception {
-        assertFalse(ResourceHelper.isProjectStyle("@android:style/Theme"));
-        assertTrue(ResourceHelper.isProjectStyle("@style/LocalTheme"));
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/adt/internal/resources/ResourceNameValidatorTest.java b/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/adt/internal/resources/ResourceNameValidatorTest.java
deleted file mode 100644
index 2cc2c93..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/adt/internal/resources/ResourceNameValidatorTest.java
+++ /dev/null
@@ -1,101 +0,0 @@
-/*
- * Copyright (C) 2010 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.resources;
-
-import com.android.resources.ResourceFolderType;
-import com.android.resources.ResourceType;
-
-import org.eclipse.core.resources.IProject;
-
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.Set;
-
-import junit.framework.TestCase;
-
-@SuppressWarnings("javadoc")
-public class ResourceNameValidatorTest extends TestCase {
-    public void testValidator() throws Exception {
-        // Valid
-        ResourceNameValidator validator = ResourceNameValidator.create(true,
-                ResourceFolderType.VALUES);
-        assertTrue(validator.isValid("foo") == null);
-        assertTrue(validator.isValid("foo.xml") == null);
-        assertTrue(validator.isValid("Foo123_$") == null);
-        assertTrue(validator.isValid("foo.xm") == null); // For non-file types, . => _
-
-        // Invalid
-        assertTrue(validator.isValid("") != null);
-        assertTrue(validator.isValid(" ") != null);
-        assertTrue(validator.isValid("foo bar") != null);
-        assertTrue(validator.isValid("1foo") != null);
-        assertTrue(validator.isValid("foo%bar") != null);
-        assertTrue(ResourceNameValidator.create(true, Collections.singleton("foo"),
-                ResourceType.STRING).isValid("foo") != null);
-        assertTrue(ResourceNameValidator.create(true,
-                ResourceFolderType.DRAWABLE).isValid("foo.xm") != null);
-        assertTrue(ResourceNameValidator.create(false,
-                ResourceFolderType.DRAWABLE).isValid("foo.xm") != null);
-
-        // Only lowercase chars allowed in file-based resource names
-        assertTrue(ResourceNameValidator.create(true, ResourceFolderType.LAYOUT)
-                .isValid("Foo123_$") != null);
-        assertTrue(ResourceNameValidator.create(true, ResourceFolderType.LAYOUT)
-                .isValid("foo123_") == null);
-
-        // Can't start with _ in file-based resource names, is okay for value based resources
-        assertTrue(ResourceNameValidator.create(true, ResourceFolderType.VALUES)
-                .isValid("_foo") == null);
-        assertTrue(ResourceNameValidator.create(true, ResourceFolderType.LAYOUT)
-                .isValid("_foo") != null);
-        assertTrue(ResourceNameValidator.create(true, ResourceFolderType.DRAWABLE)
-                .isValid("_foo") != null);
-    }
-
-    public void testIds() throws Exception {
-        ResourceNameValidator validator = ResourceNameValidator.create(false, (IProject) null,
-                ResourceType.ID);
-        assertTrue(validator.isValid("foo") == null);
-        assertTrue(validator.isValid(" foo") != null);
-        assertTrue(validator.isValid("foo ") != null);
-        assertTrue(validator.isValid("foo@") != null);
-    }
-
-    public void testUniqueOrExists() throws Exception {
-        Set<String> existing = new HashSet<String>();
-        existing.add("foo1");
-        existing.add("foo2");
-        existing.add("foo3");
-
-        ResourceNameValidator validator = ResourceNameValidator.create(true, existing,
-                ResourceType.ID);
-        validator.unique();
-
-        assertNull(validator.isValid("foo")); // null: ok (no error message)
-        assertNull(validator.isValid("foo4"));
-        assertNotNull(validator.isValid("foo1"));
-        assertNotNull(validator.isValid("foo2"));
-        assertNotNull(validator.isValid("foo3"));
-
-        validator.exist();
-        assertNotNull(validator.isValid("foo"));
-        assertNotNull(validator.isValid("foo4"));
-        assertNull(validator.isValid("foo1"));
-        assertNull(validator.isValid("foo2"));
-        assertNull(validator.isValid("foo3"));
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/adt/internal/resources/manager/IdeScanningContextTest.java b/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/adt/internal/resources/manager/IdeScanningContextTest.java
deleted file mode 100644
index 3104c85..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/adt/internal/resources/manager/IdeScanningContextTest.java
+++ /dev/null
@@ -1,22 +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.ide.eclipse.adt.internal.resources.manager;
-
-import junit.framework.TestCase;
-
-@SuppressWarnings("javadoc")
-public class IdeScanningContextTest extends TestCase {
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/adt/internal/sdk/AndroidJarLoaderTest.java b/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/adt/internal/sdk/AndroidJarLoaderTest.java
deleted file mode 100644
index 5f7de42..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/adt/internal/sdk/AndroidJarLoaderTest.java
+++ /dev/null
@@ -1,166 +0,0 @@
-/*
- * 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.sdk;
-
-import com.android.ide.eclipse.adt.internal.sdk.AndroidJarLoader;
-import com.android.ide.eclipse.adt.internal.sdk.IAndroidClassLoader.IClassDescriptor;
-import com.android.ide.eclipse.tests.AdtTestData;
-
-import java.lang.reflect.Field;
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-import java.util.ArrayList;
-import java.util.HashMap;
-
-import junit.framework.TestCase;
-
-/**
- * Unit Test for {@link AndroidJarLoader}.
- * 
- * Uses the classes jar.example.Class1/Class2 stored in tests/data/jar_example.jar.
- */
-public class AndroidJarLoaderTest extends TestCase {
-
-    private AndroidJarLoader mFrameworkClassLoader;
-
-    /** Creates an instance of {@link AndroidJarLoader} on our test data JAR */ 
-    @Override
-    public void setUp() throws Exception {
-        String jarfilePath = AdtTestData.getInstance().getTestFilePath(
-                "com/android/ide/eclipse/testdata/jar_example.jar");  //$NON-NLS-1$
-        mFrameworkClassLoader = new AndroidJarLoader(jarfilePath);
-    }
-
-    @Override
-    public void tearDown() throws Exception {
-        mFrameworkClassLoader = null;
-        System.gc();
-    }
-
-    /** Preloads classes. They should load just fine. */
-    public final void testPreLoadClasses() throws Exception {
-        mFrameworkClassLoader.preLoadClasses("jar.example.", null, null); //$NON-NLS-1$
-        HashMap<String, Class<?>> map = getPrivateClassCache();
-        assertEquals(0, map.size());
-        HashMap<String,byte[]> data = getPrivateEntryCache();
-        assertTrue(data.containsKey("jar.example.Class1"));                    //$NON-NLS-1$
-        assertTrue(data.containsKey("jar.example.Class2"));                    //$NON-NLS-1$
-        assertTrue(data.containsKey("jar.example.Class1$InnerStaticClass1"));  //$NON-NLS-1$
-        assertTrue(data.containsKey("jar.example.Class1$InnerClass2"));  //$NON-NLS-1$
-        assertEquals(4, data.size());
-    }
-
-    /** Preloads a class not in the JAR. Preloading does nothing in this case. */
-    public final void testPreLoadClasses_classNotFound() throws Exception {
-        mFrameworkClassLoader.preLoadClasses("not.a.package.", null, null);  //$NON-NLS-1$
-        HashMap<String, Class<?>> map = getPrivateClassCache();
-        assertEquals(0, map.size());
-        HashMap<String,byte[]> data = getPrivateEntryCache();
-        assertEquals(0, data.size());
-    }
-
-    /** Finds a class we just preloaded. It should work. */
-    public final void testFindClass_classFound() throws Exception {
-        Class<?> c = _findClass(mFrameworkClassLoader, "jar.example.Class2");  //$NON-NLS-1$
-        assertEquals("jar.example.Class2", c.getName());              //$NON-NLS-1$
-        HashMap<String, Class<?>> map = getPrivateClassCache();
-        assertTrue(map.containsKey("jar.example.Class1"));            //$NON-NLS-1$
-        assertTrue(map.containsKey("jar.example.Class2"));            //$NON-NLS-1$
-        assertEquals(2, map.size());
-    }
-    
-    /** call the protected method findClass */
-    private Class<?> _findClass(AndroidJarLoader jarLoader, String name) throws Exception {
-        Method findClassMethod = AndroidJarLoader.class.getDeclaredMethod(
-                "findClass", String.class);  //$NON-NLS-1$
-        findClassMethod.setAccessible(true);
-        try {
-            return (Class<?>)findClassMethod.invoke(jarLoader, name);
-        }
-        catch (InvocationTargetException e) {
-           throw (Exception)e.getCause();
-        }
-    }
-
-    /** Trying to find a class that we fail to preload should throw a CNFE. */
-    public final void testFindClass_classNotFound() throws Exception {
-        try {
-            // Will throw ClassNotFoundException
-            _findClass(mFrameworkClassLoader, "not.a.valid.ClassName");  //$NON-NLS-1$
-        } catch (ClassNotFoundException e) {
-            // check the message in the CNFE
-            assertEquals("not.a.valid.ClassName", e.getMessage());  //$NON-NLS-1$
-            return;
-        }
-        // Exception not thrown - this is a failure
-        fail("Expected ClassNotFoundException not thrown");
-    }
-    
-    public final void testFindClassesDerivingFrom() throws Exception {
-        HashMap<String, ArrayList<IClassDescriptor>> found =
-            mFrameworkClassLoader.findClassesDerivingFrom("jar.example.", new String[] {  //$NON-NLS-1$
-                "jar.example.Class1",       //$NON-NLS-1$
-                "jar.example.Class2" });    //$NON-NLS-1$
-
-        assertTrue(found.containsKey("jar.example.Class1"));  //$NON-NLS-1$
-        assertTrue(found.containsKey("jar.example.Class2"));  //$NON-NLS-1$
-        assertEquals(2, found.size());  
-        // Only Class2 derives from Class1..
-        // Class1 and Class1$InnerStaticClass1 derive from Object and are thus ignored.
-        // Class1$InnerClass2 should never be seen either.
-        assertEquals("jar.example.Class2",  //$NON-NLS-1$
-                found.get("jar.example.Class1").get(0).getFullClassName());  //$NON-NLS-1$
-        assertEquals(1, found.get("jar.example.Class1").size());      //$NON-NLS-1$
-        assertEquals(0, found.get("jar.example.Class2").size());      //$NON-NLS-1$
-    }
-
-    // --- Utilities ---
-    
-    /**
-     * Retrieves the private mFrameworkClassLoader.mClassCache field using reflection.
-     * 
-     * @throws NoSuchFieldException 
-     * @throws SecurityException 
-     * @throws IllegalAccessException 
-     * @throws IllegalArgumentException 
-     */
-    @SuppressWarnings("unchecked")
-    private HashMap<String, Class<?> > getPrivateClassCache()
-            throws SecurityException, NoSuchFieldException,
-                IllegalArgumentException, IllegalAccessException {
-        Field field = AndroidJarLoader.class.getDeclaredField("mClassCache");  //$NON-NLS-1$
-        field.setAccessible(true);
-        return (HashMap<String, Class<?>>) field.get(mFrameworkClassLoader);
-    }
-
-    /**
-     * Retrieves the private mFrameworkClassLoader.mEntryCache field using reflection.
-     * 
-     * @throws NoSuchFieldException 
-     * @throws SecurityException 
-     * @throws IllegalAccessException 
-     * @throws IllegalArgumentException 
-     */
-    @SuppressWarnings("unchecked")
-    private HashMap<String,byte[]> getPrivateEntryCache()
-            throws SecurityException, NoSuchFieldException,
-                IllegalArgumentException, IllegalAccessException {
-        Field field = AndroidJarLoader.class.getDeclaredField("mEntryCache");  //$NON-NLS-1$
-        field.setAccessible(true);
-        return (HashMap<String, byte[]>) field.get(mFrameworkClassLoader);
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/adt/internal/sdk/LayoutParamsParserTest.java b/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/adt/internal/sdk/LayoutParamsParserTest.java
deleted file mode 100644
index c89dd06..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/adt/internal/sdk/LayoutParamsParserTest.java
+++ /dev/null
@@ -1,182 +0,0 @@
-/*
- * 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.sdk;
-
-import com.android.ide.common.resources.platform.AttrsXmlParser;
-import com.android.ide.common.resources.platform.ViewClassInfo;
-import com.android.ide.common.resources.platform.ViewClassInfo.LayoutParamsInfo;
-import com.android.ide.eclipse.adt.internal.sdk.AndroidJarLoader.ClassWrapper;
-import com.android.ide.eclipse.adt.internal.sdk.IAndroidClassLoader.IClassDescriptor;
-import com.android.ide.eclipse.mock.TestLogger;
-import com.android.ide.eclipse.tests.AdtTestData;
-
-import java.lang.reflect.Constructor;
-import java.lang.reflect.Method;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.TreeMap;
-
-import junit.framework.TestCase;
-
-/**
- * Test the inner private methods of PlatformDataParser.
- *
- * Convention: method names that start with an underscore are actually local wrappers
- * that call private methods from {@link AndroidTargetParser} using reflection.
- * This is inspired by the Python coding rule which mandates underscores prefixes for
- * "private" methods.
- */
-public class LayoutParamsParserTest extends TestCase {
-
-    private static final String MOCK_DATA_PATH =
-        "com/android/ide/eclipse/testdata/mock_attrs.xml"; //$NON-NLS-1$
-
-    private static class MockFrameworkClassLoader extends AndroidJarLoader {
-        MockFrameworkClassLoader() {
-            super(null /* osFrameworkLocation */);
-        }
-
-        @Override
-        public HashMap<String, ArrayList<IClassDescriptor>> findClassesDerivingFrom(
-                String rootPackage, String[] superClasses) throws ClassFormatError {
-            return new HashMap<String, ArrayList<IClassDescriptor>>();
-        }
-    }
-
-    private static class MockLayoutParamsParser extends LayoutParamsParser {
-        public MockLayoutParamsParser() {
-            super(new MockFrameworkClassLoader(),
-                  new AttrsXmlParser(
-                          AdtTestData.getInstance().getTestFilePath(MOCK_DATA_PATH),
-                          new TestLogger(), 100).preload());
-
-            mTopViewClass = new ClassWrapper(mock_android.view.View.class);
-            mTopGroupClass = new ClassWrapper(mock_android.view.ViewGroup.class);
-            mTopLayoutParamsClass = new ClassWrapper(mock_android.view.ViewGroup.LayoutParams.class);
-
-            mViewList = new ArrayList<IClassDescriptor>();
-            mGroupList = new ArrayList<IClassDescriptor>();
-            mViewMap = new TreeMap<String, ExtViewClassInfo>();
-            mGroupMap = new TreeMap<String, ExtViewClassInfo>();
-            mLayoutParamsMap = new HashMap<String, LayoutParamsInfo>();
-        }
-    }
-
-    private MockLayoutParamsParser mParser;
-
-    @Override
-    public void setUp() throws Exception {
-        mParser = new MockLayoutParamsParser();
-    }
-
-    @Override
-    public void tearDown() throws Exception {
-    }
-
-    public final void testFindLayoutParams() throws Exception {
-        assertEquals(mock_android.view.ViewGroup.LayoutParams.class,
-            ((ClassWrapper)_findLayoutParams(mock_android.view.ViewGroup.class)).wrappedClass());
-
-        assertEquals(mock_android.widget.LinearLayout.LayoutParams.class,
-            ((ClassWrapper)_findLayoutParams(mock_android.widget.LinearLayout.class)).wrappedClass());
-
-        assertEquals(mock_android.widget.TableLayout.LayoutParams.class,
-            ((ClassWrapper)_findLayoutParams(mock_android.widget.TableLayout.class)).wrappedClass());
-    }
-
-    public final void testGetLayoutParamsInfo() throws Exception {
-        LayoutParamsInfo info1 = _getLayoutParamsInfo(
-                mock_android.view.ViewGroup.LayoutParams.class);
-        assertNotNull(info1);
-        // ViewGroup.LayoutData has Object for superClass, which we don't map
-        assertNull(info1.getSuperClass());
-
-        LayoutParamsInfo info2 = _getLayoutParamsInfo(
-                mock_android.widget.LinearLayout.LayoutParams.class);
-        assertNotNull(info2);
-        // LinearLayout.LayoutData links to ViewGroup.LayoutParams
-        assertSame(info1, info2.getSuperClass());
-
-        LayoutParamsInfo info3 = _getLayoutParamsInfo(
-                mock_android.widget.TableLayout.LayoutParams.class);
-        assertNotNull(info3);
-        // TableLayout.LayoutData does not link to ViewGroup.LayoutParams nor
-        // LinearLayout.LayoutParams
-        assertNotSame(info1, info3.getSuperClass());
-        assertNotSame(info2, info3.getSuperClass());
-        // TableLayout.LayoutParams => ViewGroup.MarginLayoutParams => ViewGroup.LayoutParams
-        assertSame(info1, info3.getSuperClass().getSuperClass());
-    }
-
-    public final void testGetLayoutClasses() throws Exception {
-        // _getLayoutClasses();
-    }
-
-    //---- access to private methods
-
-    /** Calls the private constructor of the parser */
-    @SuppressWarnings("unused")
-    private AndroidTargetParser _Constructor(String osJarPath) throws Exception {
-        Constructor<AndroidTargetParser> constructor =
-            AndroidTargetParser.class.getDeclaredConstructor(String.class);
-        constructor.setAccessible(true);
-        return constructor.newInstance(osJarPath);
-    }
-
-    /** calls the private getLayoutClasses() of the parser */
-    @SuppressWarnings("unused")
-    private void _getLayoutClasses() throws Exception {
-        Method method = AndroidTargetParser.class.getDeclaredMethod("getLayoutClasses");  //$NON-NLS-1$
-        method.setAccessible(true);
-        method.invoke(mParser);
-    }
-
-    /** calls the private addGroup() of the parser */
-    @SuppressWarnings("unused")
-    private ViewClassInfo _addGroup(Class<?> groupClass) throws Exception {
-        Method method = LayoutParamsParser.class.getDeclaredMethod("addGroup",  //$NON-NLS-1$
-                IClassDescriptor.class);
-        method.setAccessible(true);
-        return (ViewClassInfo) method.invoke(mParser, new ClassWrapper(groupClass));
-    }
-
-    /** calls the private addLayoutParams() of the parser */
-    @SuppressWarnings("unused")
-    private LayoutParamsInfo _addLayoutParams(Class<?> groupClass) throws Exception {
-        Method method = LayoutParamsParser.class.getDeclaredMethod("addLayoutParams",   //$NON-NLS-1$
-                IClassDescriptor.class);
-        method.setAccessible(true);
-        return (LayoutParamsInfo) method.invoke(mParser, new ClassWrapper(groupClass));
-    }
-
-    /** calls the private getLayoutParamsInfo() of the parser */
-    private LayoutParamsInfo _getLayoutParamsInfo(Class<?> layoutParamsClass) throws Exception {
-        Method method = LayoutParamsParser.class.getDeclaredMethod("getLayoutParamsInfo",   //$NON-NLS-1$
-                IClassDescriptor.class);
-        method.setAccessible(true);
-        return (LayoutParamsInfo) method.invoke(mParser, new ClassWrapper(layoutParamsClass));
-    }
-
-    /** calls the private findLayoutParams() of the parser */
-    private IClassDescriptor _findLayoutParams(Class<?> groupClass) throws Exception {
-        Method method = LayoutParamsParser.class.getDeclaredMethod("findLayoutParams",  //$NON-NLS-1$
-                IClassDescriptor.class);
-        method.setAccessible(true);
-        return (IClassDescriptor) method.invoke(mParser, new ClassWrapper(groupClass));
-    }
-
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/adt/internal/wizards/templates/FmActivityToLayoutMethodTest.java b/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/adt/internal/wizards/templates/FmActivityToLayoutMethodTest.java
deleted file mode 100644
index 9caeab2..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/adt/internal/wizards/templates/FmActivityToLayoutMethodTest.java
+++ /dev/null
@@ -1,50 +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.ide.eclipse.adt.internal.wizards.templates;
-
-import freemarker.template.SimpleScalar;
-import freemarker.template.TemplateModelException;
-
-import java.util.Collections;
-import java.util.List;
-
-import junit.framework.TestCase;
-
-@SuppressWarnings("javadoc")
-public class FmActivityToLayoutMethodTest extends TestCase {
-    @SuppressWarnings("rawtypes")
-    private void check(String s, String expected) throws TemplateModelException {
-        FmActivityToLayoutMethod method = new FmActivityToLayoutMethod();
-        List list = Collections.singletonList(new SimpleScalar(s));
-        assertEquals(expected, ((SimpleScalar) method.exec(list)).getAsString());
-    }
-
-    public void test1() throws Exception {
-        check("FooActivity", "activity_foo");
-    }
-
-    public void test2() throws Exception {
-        check("FooActiv", "activity_foo");
-    }
-
-    public void test3() throws Exception {
-        check("Foo", "activity_foo");
-    }
-
-    public void test4() throws Exception {
-        check("", "");
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/adt/internal/wizards/templates/FmCamelCaseToUnderscoreMethodTest.java b/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/adt/internal/wizards/templates/FmCamelCaseToUnderscoreMethodTest.java
deleted file mode 100644
index dee0ce6..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/adt/internal/wizards/templates/FmCamelCaseToUnderscoreMethodTest.java
+++ /dev/null
@@ -1,58 +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.ide.eclipse.adt.internal.wizards.templates;
-
-import freemarker.template.SimpleScalar;
-import freemarker.template.TemplateModelException;
-
-import java.util.Collections;
-import java.util.List;
-
-import junit.framework.TestCase;
-
-@SuppressWarnings("javadoc")
-public class FmCamelCaseToUnderscoreMethodTest extends TestCase {
-    @SuppressWarnings("rawtypes")
-    private void check(String s, String expected) throws TemplateModelException {
-        FmCamelCaseToUnderscoreMethod method = new FmCamelCaseToUnderscoreMethod();
-        List list = Collections.singletonList(new SimpleScalar(s));
-        assertEquals(expected, ((SimpleScalar) method.exec(list)).getAsString());
-    }
-
-    public void test1() throws Exception {
-        check("", "");
-    }
-
-    public void test2() throws Exception {
-        check("foo", "foo");
-    }
-
-    public void test3() throws Exception {
-        check("Foo", "foo");
-    }
-
-    public void test4() throws Exception {
-        check("FooBar", "foo_bar");
-    }
-
-    public void test5() throws Exception {
-        check("testXML", "test_xml");
-    }
-
-    public void test6() throws Exception {
-        check("testFoo", "test_foo");
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/adt/internal/wizards/templates/FmClassNameToResourceMethodTest.java b/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/adt/internal/wizards/templates/FmClassNameToResourceMethodTest.java
deleted file mode 100644
index ff90ea0..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/adt/internal/wizards/templates/FmClassNameToResourceMethodTest.java
+++ /dev/null
@@ -1,66 +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.ide.eclipse.adt.internal.wizards.templates;
-
-import freemarker.template.SimpleScalar;
-import freemarker.template.TemplateModelException;
-
-import java.util.Collections;
-import java.util.List;
-
-import junit.framework.TestCase;
-
-@SuppressWarnings("javadoc")
-public class FmClassNameToResourceMethodTest extends TestCase {
-    @SuppressWarnings("rawtypes")
-    private void check(String s, String expected) throws TemplateModelException {
-        FmClassNameToResourceMethod method = new FmClassNameToResourceMethod();
-        List list = Collections.singletonList(new SimpleScalar(s));
-        assertEquals(expected, ((SimpleScalar) method.exec(list)).getAsString());
-    }
-
-    public void test1() throws Exception {
-        check("FooActivity", "foo");
-    }
-
-    public void test2() throws Exception {
-        check("FooActiv", "foo");
-    }
-
-    public void test3() throws Exception {
-        check("Foo", "foo");
-    }
-
-    public void test4() throws Exception {
-        check("", "");
-    }
-
-    public void test5() throws Exception {
-        check("FooFragment", "foo");
-    }
-
-    public void test6() throws Exception {
-        check("FooService", "foo");
-    }
-
-    public void test7() throws Exception {
-        check("FooProvider", "foo");
-    }
-
-    public void test8() throws Exception {
-        check("FooBar", "foo_bar");
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/adt/internal/wizards/templates/FmEscapeXmlAttributeMethodTest.java b/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/adt/internal/wizards/templates/FmEscapeXmlAttributeMethodTest.java
deleted file mode 100644
index eb1e949..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/adt/internal/wizards/templates/FmEscapeXmlAttributeMethodTest.java
+++ /dev/null
@@ -1,50 +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.ide.eclipse.adt.internal.wizards.templates;
-
-import freemarker.template.SimpleScalar;
-import freemarker.template.TemplateModelException;
-
-import java.util.Collections;
-import java.util.List;
-
-import junit.framework.TestCase;
-
-@SuppressWarnings("javadoc")
-public class FmEscapeXmlAttributeMethodTest extends TestCase {
-    @SuppressWarnings("rawtypes")
-    private void check(String s, String expected) throws TemplateModelException {
-        FmEscapeXmlAttributeMethod method = new FmEscapeXmlAttributeMethod();
-        List list = Collections.singletonList(new SimpleScalar(s));
-        assertEquals(expected, ((SimpleScalar) method.exec(list)).getAsString());
-    }
-
-    public void test1() throws Exception {
-        check("", "");
-    }
-
-    public void test2() throws Exception {
-        check("foo", "foo");
-    }
-
-    public void test3() throws Exception {
-        check("<\"'>&", "&lt;&quot;&apos;>&amp;");
-    }
-
-    public void test4() throws Exception {
-        check("foo>bar", "foo>bar");
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/adt/internal/wizards/templates/FmEscapeXmlStringMethodTest.java b/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/adt/internal/wizards/templates/FmEscapeXmlStringMethodTest.java
deleted file mode 100644
index 1a4289a..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/adt/internal/wizards/templates/FmEscapeXmlStringMethodTest.java
+++ /dev/null
@@ -1,66 +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.ide.eclipse.adt.internal.wizards.templates;
-
-import freemarker.template.SimpleScalar;
-import freemarker.template.TemplateModelException;
-
-import java.util.Collections;
-import java.util.List;
-
-import junit.framework.TestCase;
-
-@SuppressWarnings("javadoc")
-public class FmEscapeXmlStringMethodTest extends TestCase {
-    @SuppressWarnings("rawtypes")
-    private void check(String s, String expected) throws TemplateModelException {
-        FmEscapeXmlStringMethod method = new FmEscapeXmlStringMethod();
-        List list = Collections.singletonList(new SimpleScalar(s));
-        assertEquals(expected, ((SimpleScalar) method.exec(list)).getAsString());
-    }
-
-    public void test1() throws Exception {
-        check("", "");
-    }
-
-    public void test2() throws Exception {
-        check("foo", "foo");
-    }
-
-    public void test3() throws Exception {
-        check(" Foo Bar ", "\" Foo Bar \"");
-    }
-
-    public void test4() throws Exception {
-        check("@foo", "\\@foo");
-    }
-
-    public void test5() throws Exception {
-        check("Hello\nWorld", "Hello\\nWorld");
-    }
-
-    public void test6() throws Exception {
-        check("A & B", "A &amp; B");
-    }
-
-    public void test7() throws Exception {
-        check("Foo's Bar", "Foo\\'s Bar");
-    }
-
-    public void test8() throws Exception {
-        check("'\"\\", "\\'\\\"\\\\");
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/adt/internal/wizards/templates/FmEscapeXmlTextMethodTest.java b/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/adt/internal/wizards/templates/FmEscapeXmlTextMethodTest.java
deleted file mode 100644
index c08b834..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/adt/internal/wizards/templates/FmEscapeXmlTextMethodTest.java
+++ /dev/null
@@ -1,46 +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.ide.eclipse.adt.internal.wizards.templates;
-
-import freemarker.template.SimpleScalar;
-import freemarker.template.TemplateModelException;
-
-import java.util.Collections;
-import java.util.List;
-
-import junit.framework.TestCase;
-
-@SuppressWarnings("javadoc")
-public class FmEscapeXmlTextMethodTest extends TestCase {
-    @SuppressWarnings("rawtypes")
-    private void check(String s, String expected) throws TemplateModelException {
-        FmEscapeXmlTextMethod method = new FmEscapeXmlTextMethod();
-        List list = Collections.singletonList(new SimpleScalar(s));
-        assertEquals(expected, ((SimpleScalar) method.exec(list)).getAsString());
-    }
-
-    public void test1() throws Exception {
-        check("", "");
-    }
-
-    public void test2() throws Exception {
-        check("foo", "foo");
-    }
-
-    public void test3() throws Exception {
-        check("<\"'>&", "&lt;\"'>&amp;");
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/adt/internal/wizards/templates/FmExtractLettersMethodTest.java b/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/adt/internal/wizards/templates/FmExtractLettersMethodTest.java
deleted file mode 100644
index b1d3cee..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/adt/internal/wizards/templates/FmExtractLettersMethodTest.java
+++ /dev/null
@@ -1,46 +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.ide.eclipse.adt.internal.wizards.templates;
-
-import freemarker.template.SimpleScalar;
-import freemarker.template.TemplateModelException;
-
-import java.util.Collections;
-import java.util.List;
-
-import junit.framework.TestCase;
-
-@SuppressWarnings("javadoc")
-public class FmExtractLettersMethodTest extends TestCase {
-    @SuppressWarnings("rawtypes")
-    private void check(String s, String expected) throws TemplateModelException {
-        FmExtractLettersMethod method = new FmExtractLettersMethod();
-        List list = Collections.singletonList(new SimpleScalar(s));
-        assertEquals(expected, ((SimpleScalar) method.exec(list)).getAsString());
-    }
-
-    public void test1() throws Exception {
-        check("", "");
-    }
-
-    public void test2() throws Exception {
-        check("foo", "foo");
-    }
-
-    public void test3() throws Exception {
-        check("<\"'>&foo ", "foo");
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/adt/internal/wizards/templates/FmLayoutToActivityMethodTest.java b/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/adt/internal/wizards/templates/FmLayoutToActivityMethodTest.java
deleted file mode 100644
index af0a1db..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/adt/internal/wizards/templates/FmLayoutToActivityMethodTest.java
+++ /dev/null
@@ -1,54 +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.ide.eclipse.adt.internal.wizards.templates;
-
-import freemarker.template.SimpleScalar;
-import freemarker.template.TemplateModelException;
-
-import java.util.Collections;
-import java.util.List;
-
-import junit.framework.TestCase;
-
-@SuppressWarnings("javadoc")
-public class FmLayoutToActivityMethodTest extends TestCase {
-    @SuppressWarnings("rawtypes")
-    private void check(String s, String expected) throws TemplateModelException {
-        FmLayoutToActivityMethod method = new FmLayoutToActivityMethod();
-        List list = Collections.singletonList(new SimpleScalar(s));
-        assertEquals(expected, ((SimpleScalar) method.exec(list)).getAsString());
-    }
-
-    public void test1() throws Exception {
-        check("foo", "FooActivity");
-    }
-
-    public void test2() throws Exception {
-        check("activity_foo", "FooActivity");
-    }
-
-    public void test3() throws Exception {
-        check("activity_", "MyActivity");
-    }
-
-    public void test4() throws Exception {
-        check("activ", "ActivActivity");
-    }
-
-    public void test5() throws Exception {
-        check("", "MyActivity");
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/adt/internal/wizards/templates/FmSlashedPackageNameMethodTest.java b/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/adt/internal/wizards/templates/FmSlashedPackageNameMethodTest.java
deleted file mode 100644
index 4391102..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/adt/internal/wizards/templates/FmSlashedPackageNameMethodTest.java
+++ /dev/null
@@ -1,50 +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.ide.eclipse.adt.internal.wizards.templates;
-
-import freemarker.template.SimpleScalar;
-import freemarker.template.TemplateModelException;
-
-import java.util.Collections;
-import java.util.List;
-
-import junit.framework.TestCase;
-
-@SuppressWarnings("javadoc")
-public class FmSlashedPackageNameMethodTest extends TestCase {
-    @SuppressWarnings("rawtypes")
-    private void check(String s, String expected) throws TemplateModelException {
-        FmSlashedPackageNameMethod method = new FmSlashedPackageNameMethod();
-        List list = Collections.singletonList(new SimpleScalar(s));
-        assertEquals(expected, ((SimpleScalar) method.exec(list)).getAsString());
-    }
-
-    public void test1() throws Exception {
-        check("", "");
-    }
-
-    public void test2() throws Exception {
-        check("foo", "foo");
-    }
-
-    public void test3() throws Exception {
-        check("foo.bar.baz", "foo/bar/baz");
-    }
-
-    public void test4() throws Exception {
-        check("foo/bar/baz", "foo/bar/baz");
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/adt/internal/wizards/templates/FmUnderscoreToCamelCaseMethodTest.java b/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/adt/internal/wizards/templates/FmUnderscoreToCamelCaseMethodTest.java
deleted file mode 100644
index 4955dae..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/adt/internal/wizards/templates/FmUnderscoreToCamelCaseMethodTest.java
+++ /dev/null
@@ -1,58 +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.ide.eclipse.adt.internal.wizards.templates;
-
-import freemarker.template.SimpleScalar;
-import freemarker.template.TemplateModelException;
-
-import java.util.Collections;
-import java.util.List;
-
-import junit.framework.TestCase;
-
-@SuppressWarnings("javadoc")
-public class FmUnderscoreToCamelCaseMethodTest extends TestCase {
-    @SuppressWarnings("rawtypes")
-    private void check(String s, String expected) throws TemplateModelException {
-        FmUnderscoreToCamelCaseMethod method = new FmUnderscoreToCamelCaseMethod();
-        List list = Collections.singletonList(new SimpleScalar(s));
-        assertEquals(expected, ((SimpleScalar) method.exec(list)).getAsString());
-    }
-
-    public void test1() throws Exception {
-        check("", "");
-    }
-
-    public void test2() throws Exception {
-        check("_", "");
-    }
-
-    public void test3() throws Exception {
-        check("foo", "Foo");
-    }
-
-    public void test4() throws Exception {
-        check("foo_bar", "FooBar");
-    }
-
-    public void test5() throws Exception {
-        check("foo__bar", "FooBar");
-    }
-
-    public void test6() throws Exception {
-        check("foo_", "Foo");
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/mock/Mocks.java b/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/mock/Mocks.java
deleted file mode 100644
index 65e2144..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/mock/Mocks.java
+++ /dev/null
@@ -1,189 +0,0 @@
-/*
- * Copyright (C) 2010 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.mock;
-
-import static org.easymock.EasyMock.capture;
-import static org.easymock.EasyMock.createMock;
-import static org.easymock.EasyMock.createNiceMock;
-import static org.easymock.EasyMock.eq;
-import static org.easymock.EasyMock.expect;
-import static org.easymock.EasyMock.expectLastCall;
-import static org.easymock.EasyMock.isA;
-import static org.easymock.EasyMock.replay;
-
-import com.android.io.IAbstractFolder;
-import com.android.io.IAbstractResource;
-
-import org.easymock.Capture;
-import org.easymock.EasyMock;
-import org.easymock.IAnswer;
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IFolder;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.jdt.core.IClasspathEntry;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.JavaCore;
-
-import java.util.Map;
-
-public class Mocks {
-    public static IJavaProject createProject(IClasspathEntry[] entries, IPath outputLocation)
-            throws Exception {
-        IJavaProject javaProject = createMock(IJavaProject.class);
-        final Capture<IClasspathEntry[]> capturedEntries = new Capture<IClasspathEntry[]>();
-        Capture<IPath> capturedOutput = new Capture<IPath>();
-        capturedEntries.setValue(entries);
-        capturedOutput.setValue(outputLocation);
-
-        IProject project = createProject();
-        expect(javaProject.getProject()).andReturn(project).anyTimes();
-        expect(javaProject.getOutputLocation()).andReturn(capturedOutput.getValue()).anyTimes();
-
-        expect(javaProject.getRawClasspath()).andAnswer(new IAnswer<IClasspathEntry[]>() {
-            @Override
-            public IClasspathEntry[] answer() throws Throwable {
-                return capturedEntries.getValue();
-            }
-        }).anyTimes();
-
-        javaProject.setRawClasspath(capture(capturedEntries), isA(IProgressMonitor.class));
-        expectLastCall().anyTimes();
-
-        javaProject.setRawClasspath(capture(capturedEntries), capture(capturedOutput),
-                isA(IProgressMonitor.class));
-        expectLastCall().anyTimes();
-
-        final Capture<String> capturedCompliance = new Capture<String>();
-        capturedCompliance.setValue("1.4");
-        final Capture<String> capturedSource = new Capture<String>();
-        capturedSource.setValue("1.4");
-        final Capture<String> capturedTarget = new Capture<String>();
-        capturedTarget.setValue("1.4");
-
-        expect(javaProject.getOption(JavaCore.COMPILER_COMPLIANCE, true)).andAnswer(
-                new IAnswer<String>() {
-                    @Override
-                    public String answer() throws Throwable {
-                        return capturedCompliance.getValue();
-                    }
-                });
-        expect(javaProject.getOption(JavaCore.COMPILER_SOURCE, true)).andAnswer(
-                new IAnswer<String>() {
-                    @Override
-                    public String answer() throws Throwable {
-                        return capturedSource.getValue();
-                    }
-                });
-        expect(javaProject.getOption(JavaCore.COMPILER_CODEGEN_TARGET_PLATFORM, true)).andAnswer(
-                new IAnswer<String>() {
-                    @Override
-                    public String answer() throws Throwable {
-                        return capturedTarget.getValue();
-                    }
-                });
-
-        javaProject.setOption(eq(JavaCore.COMPILER_COMPLIANCE), capture(capturedCompliance));
-        expectLastCall().anyTimes();
-        javaProject.setOption(eq(JavaCore.COMPILER_SOURCE), capture(capturedSource));
-        expectLastCall().anyTimes();
-        javaProject.setOption(eq(JavaCore.COMPILER_CODEGEN_TARGET_PLATFORM),
-                capture(capturedTarget));
-        expectLastCall().anyTimes();
-
-        replay(javaProject);
-
-        return javaProject;
-    }
-
-    /**
-     * Creates a mock implementation of {@link IFile}.
-     * <p/>
-     * Supported methods:
-     * <ul>
-     * <li>IFile#getName()</li>
-     * <li>IFile#getLocation()</li>
-     * </ul>
-     */
-    public static IFile createFile(String fileName) {
-        IFile file = createNiceMock(IFile.class);
-        expect(file.getName()).andReturn(fileName).anyTimes();
-        expect(file.getLocation()).andReturn(new Path(fileName)).anyTimes();
-        replay(file);
-        return file;
-    }
-
-    /**
-     * Creates a mock implementation of {@link IFolder}.
-     * <p/>
-     * Supported methods:
-     * <ul>
-     * <li>{@link IFolder#getName()}</li>
-     * <li>{@link IFolder#members()}</li>
-     * </ul>
-     */
-    public static IFolder createFolder(String name, IResource[] members) throws Exception {
-        IFolder file = createNiceMock(IFolder.class);
-        expect(file.getName()).andReturn(name).anyTimes();
-        // expect(file.getLocation()).andReturn(new Path(name)).anyTimes();
-        expect(file.members()).andReturn(members).anyTimes();
-        replay(file);
-        return file;
-    }
-
-    public static IAbstractFolder createAbstractFolder(String name, IAbstractResource[] members) {
-        IAbstractFolder folder = createNiceMock(IAbstractFolder.class);
-        expect(folder.getName()).andReturn(name).anyTimes();
-        // expect(file.getLocation()).andReturn(new Path(name)).anyTimes();
-        expect(folder.listMembers()).andReturn(members).anyTimes();
-        replay(folder);
-
-        return folder;
-    }
-
-    /**
-     * Mock implementation of {@link IProject}.
-     * <p/>
-     * Supported methods:
-     * <ul>
-     * <li>{@link IProject#build(int kind, IProgressMonitor monitor)}</li>
-     * <li>
-     * {@link IProject#build(int kind, String builderName, Map args, IProgressMonitor monitor)}
-     * </li>
-     * </ul>
-     */
-    public static IProject createProject() {
-        IProject project = EasyMock.createNiceMock(IProject.class);
-        replay(project);
-        return project;
-    }
-
-    /**
-     * Creates a mock implementation of an {@link IClasspathEntry}, which supports
-     * {@link IClasspathEntry#getEntryKind} and {@link IClasspathEntry#getPath}.
-     */
-    public static IClasspathEntry createClasspathEntry(IPath path, int kind) {
-        IClasspathEntry entry = createNiceMock(IClasspathEntry.class);
-        expect(entry.getEntryKind()).andReturn(kind).anyTimes();
-        expect(entry.getPath()).andReturn(path).anyTimes();
-        replay(entry);
-        return entry;
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/mock/TestLogger.java b/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/mock/TestLogger.java
deleted file mode 100644
index f8bf4b3..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/mock/TestLogger.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Copyright (C) 2010 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.mock;
-
-
-import com.android.utils.ILogger;
-
-import junit.framework.Assert;
-
-/**
- * Implementation of {@link ILogger} suitable for test use; will fail the current test if
- * {@link #error} is called, and prints everything else to standard error.
- */
-public class TestLogger implements ILogger {
-
-    @Override
-    public void error(Throwable t, String errorFormat, Object... args) {
-        String message = String.format(errorFormat, args);
-        if (t != null) {
-            message = t.toString() + ":" + message; //$NON-NLS-1$
-        }
-        Assert.fail(message);
-    }
-
-    @Override
-    public void info(String msgFormat, Object... args) {
-        System.out.println(String.format(msgFormat, args));
-    }
-
-    @Override
-    public void verbose(String msgFormat, Object... args) {
-        info(msgFormat, args);
-    }
-
-    @Override
-    public void warning(String warningFormat, Object... args) {
-        System.err.println(String.format(warningFormat, args));
-    }
-
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/testdata/draw9patch/content-area-one-dot.9.png b/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/testdata/draw9patch/content-area-one-dot.9.png
deleted file mode 100644
index 690d76e..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/testdata/draw9patch/content-area-one-dot.9.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/testdata/draw9patch/content-area-two-dots.9.png b/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/testdata/draw9patch/content-area-two-dots.9.png
deleted file mode 100644
index c3d3e4c..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/testdata/draw9patch/content-area-two-dots.9.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/testdata/draw9patch/content-area.9.png b/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/testdata/draw9patch/content-area.9.png
deleted file mode 100644
index 6a7a62c..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/testdata/draw9patch/content-area.9.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/testdata/draw9patch/invalid-patched1.9.png b/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/testdata/draw9patch/invalid-patched1.9.png
deleted file mode 100644
index 9e5ffbf..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/testdata/draw9patch/invalid-patched1.9.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/testdata/draw9patch/invalid-patched2.9.png b/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/testdata/draw9patch/invalid-patched2.9.png
deleted file mode 100644
index cfd9c1d..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/testdata/draw9patch/invalid-patched2.9.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/testdata/draw9patch/invalid-patched3.9.png b/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/testdata/draw9patch/invalid-patched3.9.png
deleted file mode 100644
index 0f2c3eb..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/testdata/draw9patch/invalid-patched3.9.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/testdata/draw9patch/invalid-patched4.9.png b/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/testdata/draw9patch/invalid-patched4.9.png
deleted file mode 100644
index ce73210..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/testdata/draw9patch/invalid-patched4.9.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/testdata/draw9patch/invalid-patched5.9.png b/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/testdata/draw9patch/invalid-patched5.9.png
deleted file mode 100644
index 97d9cd8..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/testdata/draw9patch/invalid-patched5.9.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/testdata/draw9patch/invalid-patched6.9.png b/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/testdata/draw9patch/invalid-patched6.9.png
deleted file mode 100644
index f9b8a48..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/testdata/draw9patch/invalid-patched6.9.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/testdata/draw9patch/invalid-patched7.9.png b/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/testdata/draw9patch/invalid-patched7.9.png
deleted file mode 100644
index bbbb3ad..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/testdata/draw9patch/invalid-patched7.9.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/testdata/draw9patch/invalid-patched8.9.png b/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/testdata/draw9patch/invalid-patched8.9.png
deleted file mode 100644
index 35f04b5..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/testdata/draw9patch/invalid-patched8.9.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/testdata/draw9patch/layout-bounds-only.9.png b/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/testdata/draw9patch/layout-bounds-only.9.png
deleted file mode 100644
index 6f70473..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/testdata/draw9patch/layout-bounds-only.9.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/testdata/draw9patch/no-patched-interlace.png b/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/testdata/draw9patch/no-patched-interlace.png
deleted file mode 100644
index a6d0e94..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/testdata/draw9patch/no-patched-interlace.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/testdata/draw9patch/no-patched.png b/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/testdata/draw9patch/no-patched.png
deleted file mode 100644
index 742b1e8..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/testdata/draw9patch/no-patched.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/testdata/draw9patch/patched-with-badpatches.9.png b/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/testdata/draw9patch/patched-with-badpatches.9.png
deleted file mode 100644
index 1a38972..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/testdata/draw9patch/patched-with-badpatches.9.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/testdata/draw9patch/patched1.9.png b/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/testdata/draw9patch/patched1.9.png
deleted file mode 100644
index 6a7a62c..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/testdata/draw9patch/patched1.9.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/testdata/draw9patch/patched2.9.png b/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/testdata/draw9patch/patched2.9.png
deleted file mode 100644
index 11a1a6d..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/testdata/draw9patch/patched2.9.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/testdata/draw9patch/patched3.9.png b/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/testdata/draw9patch/patched3.9.png
deleted file mode 100644
index 8d288c9..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/testdata/draw9patch/patched3.9.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/testdata/jar_example.jar b/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/testdata/jar_example.jar
deleted file mode 100644
index f95b595..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/testdata/jar_example.jar
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/testdata/jar_example.jardesc b/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/testdata/jar_example.jardesc
deleted file mode 100644
index 14cd44f..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/testdata/jar_example.jardesc
+++ /dev/null
@@ -1,16 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1" standalone="no"?>
-<jardesc>
-    <jar path="jar_example.jar"/>
-    <options buildIfNeeded="true" compress="true" descriptionLocation="/common/tests/data/jar_example.jardesc" exportErrors="false" exportWarnings="true" includeDirectoryEntries="false" overwrite="false" saveDescription="true" storeRefactorings="false" useSourceFolders="false"/>
-    <storedRefactorings deprecationInfo="true" structuralOnly="false"/>
-    <selectedProjects/>
-    <manifest generateManifest="true" manifestLocation="" manifestVersion="1.0" reuseManifest="false" saveManifest="false" usesManifest="true">
-        <sealing sealJar="false">
-            <packagesToSeal/>
-            <packagesToUnSeal/>
-        </sealing>
-    </manifest>
-    <selectedElements exportClassFiles="true" exportJavaFiles="false" exportOutputFolder="false">
-        <javaElement handleIdentifier="=common/tests&lt;jar.example"/>
-    </selectedElements>
-</jardesc>
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/testdata/mock_attrs.xml b/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/testdata/mock_attrs.xml
deleted file mode 100644
index db77e17..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/testdata/mock_attrs.xml
+++ /dev/null
@@ -1,340 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
- * 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.
- */
--->
-<resources>
-    <!-- WARNING !!! THIS IS A MOCK FILE. DO NOT USE FOR DOCUMENTATION PURPOSES.
-         This file has been trimmed down to only extract a number of interesting cases 
-         for unit tests.
-         
-         What this contains:
-         - View
-         - ViewGroup
-         - some attributes which format are defined in Theme
-         - orientation, gravity and layout_gravity defined before they are used
-         - ViewGroup_Layout
-         - ViewGroup_MarginLayout
-         - LinearLayout
-         - LinearLayout_Layout
-         - TableLayout
-         
-         Note that TableLayout does not have a TableLayout_Layout definition here
-         where these is a class TableLayout.LayoutData.
-    -->
-
-    <!-- These are the standard attributes that make up a complete theme. -->
-    <declare-styleable name="Theme">
-
-        <!-- Defines the scrollbars size. -->
-        <attr name="scrollbarSize" format="dimension" />
-
-    </declare-styleable>
-
-        
-    <!-- Standard orientation constant. -->
-    <attr name="orientation">
-        <!-- Defines an horizontal widget. -->
-        <enum name="horizontal" value="0" />
-        <!-- Defines a vertical widget. -->
-        <enum name="vertical" value="1" />
-    </attr>
-
-    <!-- Specifies how to place an object, both
-         its x and y axis, within a larger containing object. -->
-    <attr name="gravity">
-        <!-- Push object to the top of its container, not changing its size. -->
-        <flag name="top" value="0x30" />
-        <!-- Push object to the bottom of its container, not changing its size. -->
-        <flag name="bottom" value="0x50" />
-        <!-- Push object to the left of its container, not changing its size. -->
-        <flag name="left" value="0x03" />
-        <!-- Push object to the right of its container, not changing its size. -->
-        <flag name="right" value="0x05" />
-        <!-- Place object in the vertical center of its container, not changing its size. -->
-        <flag name="center_vertical" value="0x10" />
-        <!-- Grow the vertical size of the object if needed so it completely fills its container. -->
-        <flag name="fill_vertical" value="0x70" />
-        <!-- Place object in the horizontal center of its container, not changing its size. -->
-        <flag name="center_horizontal" value="0x01" />
-        <!-- Grow the horizontal size of the object if needed so it completely fills its container. -->
-        <flag name="fill_horizontal" value="0x07" />
-        <!-- Place the object in the center of its container in both the vertical and horizontal axis, not changing its size. -->
-        <flag name="center" value="0x11" />
-        <!-- Grow the horizontal and vertical size of the object if needed so it completely fills its container. -->
-        <flag name="fill" value="0x77" />
-    </attr>
-
-    <!-- Standard gravity constant that a child can supply to its parent.
-         Defines how to place an object, both
-         its x and y axis, within a larger containing object. -->
-    <attr name="layout_gravity">
-        <!-- Push object to the top of its container, not changing its size. -->
-        <flag name="top" value="0x30" />
-        <!-- Push object to the bottom of its container, not changing its size. -->
-        <flag name="bottom" value="0x50" />
-        <!-- Push object to the left of its container, not changing its size. -->
-        <flag name="left" value="0x03" />
-        <!-- Push object to the right of its container, not changing its size. -->
-        <flag name="right" value="0x05" />
-        <!-- Place object in the vertical center of its container, not changing its size. -->
-        <flag name="center_vertical" value="0x10" />
-        <!-- Grow the vertical size of the object if needed so it completely fills its container. -->
-        <flag name="fill_vertical" value="0x70" />
-        <!-- Place object in the horizontal center of its container, not changing its size. -->
-        <flag name="center_horizontal" value="0x01" />
-        <!-- Grow the horizontal size of the object if needed so it completely fills its container. -->
-        <flag name="fill_horizontal" value="0x07" />
-        <!-- Place the object in the center of its container in both the vertical and horizontal axis, not changing its size. -->
-        <flag name="center" value="0x11" />
-        <!-- Grow the horizontal and vertical size of the object if needed so it completely fills its container. -->
-        <flag name="fill" value="0x77" />
-    </attr>
-
-    <declare-styleable name="View">
-    <!-- NOTE: View does not have a javadoc. Do not place a comment BEFORE View to make sure it
-         is NOT interpreted as Javadoc -->
-    
-        <!-- Supply an identifier name for this view, to later retrieve it
-             with {@link android.view.View#findViewById View.findViewById()} or
-             {@link android.app.Activity#findViewById Activity.findViewById()}.
-             This must be a
-             resource reference; typically you set this using the
-             <code>@+</code> syntax to create a new ID resources.
-             For example: <code>android:id="@+id/my_id"</code> which
-             allows you to later retrieve the view
-             with <code>findViewById(R.id.my_id)</code>. -->
-        <attr name="id" format="reference" />
-        
-        <!-- Supply a tag for this view containing a String, to be retrieved
-             later with {@link android.view.View#getTag View.getTag()} or
-             searched for with {@link android.view.View#findViewWithTag
-             View.findViewWithTag()}.  It is generally preferable to use
-             IDs (through the android:id attribute) instead of tags because
-             they are faster and allow for compile-time type checking. -->
-        <attr name="tag" format="string" />
-        
-        <!-- The initial horizontal scroll offset, in pixels.-->
-        <attr name="scrollX" format="dimension" />
-
-        <!-- The initial vertical scroll offset, in pixels. -->
-        <attr name="scrollY" format="dimension" />
-
-        <!-- A drawable to use as the background.  This can be either a reference
-             to a full drawable resource (such as a PNG image, 9-patch,
-             XML state list description, etc), or a solid color such as "#ff000000"
-            (black). -->
-        <attr name="background" format="reference|color" />
-
-        <!-- Boolean that controls whether a view can take focus.  By default the user can not
-             move focus to a view; by setting this attribute to true the view is
-             allowed to take focus.  This value does not impact the behavior of
-             directly calling {@link android.view.View#requestFocus}, which will
-             always request focus regardless of this view.  It only impacts where
-             focus navigation will try to move focus. -->
-        <attr name="focusable" format="boolean" />
-
-        <!-- Sets the circumstances under which this view will take focus. There are
-             two choices: "weak" or "normal". The default value is "normal" for
-             any focusable views. The focus type only applies if the view
-             has been set to be focusable. -->
-        <attr name="focusType">
-            <!-- This view is focusable, but only if none of its descendants are already focused. -->
-            <enum name="normal" value="0" />
-            <!-- This view will always claim to be focusable. -->
-            <enum name="weak" value="1" />
-        </attr>
-        
-        <!-- Controls the initial visibility of the view.  -->
-        <attr name="visibility">
-            <!-- Visible on screen; the default value. -->
-            <enum name="visible" value="0" />
-            <!-- Not displayed, but taken into account during layout (space is left for it). -->
-            <enum name="invisible" value="1" />
-            <!-- Completely hidden, as if the view had not been added. -->
-            <enum name="gone" value="2" />
-        </attr>
-
-        <!-- Defines which scrollbars should be displayed on scrolling or not. -->
-        <attr name="scrollbars">
-            <!-- No scrollbar is displayed. -->
-            <flag name="none" value="0x00000000" />
-            <!-- Displays horizontal scrollbar only. -->
-            <flag name="horizontal" value="0x00000100" />
-            <!-- Displays vertical scrollbar only. -->
-            <flag name="vertical" value="0x00000200" />
-        </attr>
-
-        <!-- Sets the width of vertical scrollbars and height of horizontal scrollbars. -->
-        <attr name="scrollbarSize" />
-        
-        <!-- Text to display. (copied from TextView for the extra localization) -->
-        <attr name="text" format="string" localization="suggested" />
-        
-    </declare-styleable>
-
-    <!-- Attributes that can be used with a {@link android.view.ViewGroup} or any
-         of its subclasses.  Also see {@link #ViewGroup_Layout} for
-         attributes that this class processes in its children. -->
-    <declare-styleable name="ViewGroup">
-        <!-- Defines whether a child is limited to draw inside of its bounds or not.
-             This is useful with animations that scale the size of the children to more
-             than 100% for instance. In such a case, this property should be set to false
-             to allow the children to draw outside of their bounds. The default value of
-             this property is true. -->
-        <attr name="clipChildren" format="boolean" />
-        <!-- Defines the layout animation to use the first time the ViewGroup is laid out.
-             Layout animations can also be started manually after the first layout. -->
-        <attr name="layoutAnimation" format="reference" />
-        <!-- Defines whether a child's animation should be kept when it is over. Keeping
-             the animations is useful with animation whose final state is different from
-             the initial state of the View. This is particularly useful with animation
-             whose fillAfter property is enabled. This property is set to false by default. -->
-        <attr name="persistentDrawingCache">
-            <!-- The drawing cache is not persisted after use. -->
-            <flag name="none" value="0x0" />
-            <!-- The drawing cache is persisted after a layout animation. -->
-            <flag name="animation" value="0x1" />
-            <!-- The drawing cache is persisted after a scroll. -->
-            <flag name="scrolling" value="0x2" />
-            <!-- The drawing cache is always persisted. -->            
-            <flag name="all" value="0x3" />
-        </attr>
-    </declare-styleable>
-
-    <!-- This is the basic set of layout attributes that are common to all
-         layout managers.  These attributes are specified with the rest of
-         a view's normal attributes (such as {@link android.R.attr#background},
-         but will be parsed by the view's parent and ignored by the child.
-        <p>The values defined here correspond to the base layout attribute
-        class {@link android.view.ViewGroup.LayoutParams}. -->
-    <declare-styleable name="ViewGroup_Layout">
-        <!-- Specifies the basic width of the view.  This is a required attribute
-             for any view inside of a containing layout manager.  Its value may
-             be a dimension (such as "12dip") for a constant width or one of
-             the special constants. -->
-        <attr name="layout_width" format="dimension">
-            <!-- The view should be as big as its parent (minus padding). -->
-            <enum name="match_parent" value="-1" />
-            <!-- The view should be only big enough to enclose its content (plus padding). -->
-            <enum name="wrap_content" value="-2" />
-        </attr>
-
-        <!-- Specifies the basic height of the view.  This is a required attribute
-             for any view inside of a containing layout manager.  Its value may
-             be a dimension (such as "12dip") for a constant height or one of
-             the special constants. -->
-        <attr name="layout_height" format="dimension">
-            <!-- The view should be as big as its parent (minus padding). -->
-            <enum name="match_parent" value="-1" />
-            <!-- The view should be only big enough to enclose its content (plus padding). -->
-            <enum name="wrap_content" value="-2" />
-        </attr>
-    </declare-styleable>
-
-    <!-- This is the basic set of layout attributes for layout managers that
-         wish to place margins around their child views.
-         These attributes are specified with the rest of
-         a view's normal attributes (such as {@link android.R.attr#background},
-         but will be parsed by the view's parent and ignored by the child.
-        <p>The values defined here correspond to the base layout attribute
-        class {@link android.view.ViewGroup.MarginLayoutParams}. -->
-    <declare-styleable name="ViewGroup_MarginLayout">
-        <attr name="layout_width" />
-        <attr name="layout_height" />
-        <!--  Specifies extra space on the left side of this view.
-            This space is outside this view's bounds. -->
-        <attr name="layout_marginLeft" format="dimension"  />
-        <!--  Specifies extra space on the top side of this view.
-            This space is outside this view's bounds. -->
-        <attr name="layout_marginTop" format="dimension" />
-        <!--  Specifies extra space on the right side of this view.
-            This space is outside this view's bounds. -->
-        <attr name="layout_marginRight" format="dimension"  />
-        <!--  Specifies extra space on the bottom side of this view.
-            This space is outside this view's bounds. -->
-        <attr name="layout_marginBottom" format="dimension"  />
-    </declare-styleable>
-
-    <!-- This is a linear layout. -->
-    <declare-styleable name="LinearLayout">
-        <!-- Should the layout be a column or a row?  Use "horizontal"
-             for a row, "vertical" for a column.  The default is
-             horizontal. -->
-        <attr name="orientation" />
-        <attr name="baselineAligned" format="boolean|reference" />
-        <!-- When a linear layout is part of another layout that is baseline
-          aligned, it can specify which of its children to baseline align to
-          (i.e which child TextView).-->
-        <attr name="baselineAlignedChildIndex" format="integer|color" min="0"/>
-        <!-- Defines the maximum weight sum. If unspecified, the sum is computed
-             by adding the layout_weight of all of the children. This can be
-             used for instance to give a single child 50% of the total available
-             space by giving it a layout_weight of 0.5 and setting the weightSum
-             to 1.0. -->
-        <attr name="weightSum" format="float" />
-    </declare-styleable>
-
-    <declare-styleable name="LinearLayout_Layout">
-        <attr name="layout_width" />
-        <attr name="layout_height" />
-        <attr name="layout_weight" format="float" />
-        <attr name="layout_gravity" />
-    </declare-styleable>
-
-    <declare-styleable name="TableLayout">
-        <!-- The 0 based index of the columns to stretch. The column indices
-             must be separated by a comma: 1, 2, 5. Illegal and duplicate
-             indices are ignored. You can stretch all columns by using the
-             value "*" instead. Note that a column can be marked stretchable
-             and shrinkable at the same time. -->
-        <attr name="stretchColumns" format="string" />
-       <!-- The 0 based index of the columns to shrink. The column indices
-             must be separated by a comma: 1, 2, 5. Illegal and duplicate
-             indices are ignored. You can shrink all columns by using the
-             value "*" instead. Note that a column can be marked stretchable
-             and shrinkable at the same time. -->
-        <attr name="shrinkColumns" format="string" /> 
-        <!-- The 0 based index of the columns to collapse. The column indices
-             must be separated by a comma: 1, 2, 5. Illegal and duplicate
-             indices are ignored. -->
-        <attr name="collapseColumns" format="string" />
-    </declare-styleable>
-
-	<!-- Test for deprecated attributes. -->
-	<declare-styleable name="DeprecatedTest">
-		<!-- Deprecated comments using delimiters.
-			 Ignored. {@deprecated In-line deprecated.} {@ignore Ignored}.
-		 -->
-		<attr name="deprecated-inline" /> 
-
-		<!-- Deprecated comments on their own line.
-			 @deprecated Multi-line version of deprecated
-			    that works till the next tag.
-			 @ignore This tag must be ignored
-		 -->
-		<attr name="deprecated-multiline" />
-		
-		<!-- This attribute is not deprecated. -->
-		<attr name="deprecated-not" />
-		
-        <!-- {@deprecated There is no other javadoc here. } -->
-        <attr name="deprecated-no-javadoc" format="boolean" />
-		
-	</declare-styleable>
-
-</resources>
-
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/testdata/mock_manifest_attrs.xml b/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/testdata/mock_manifest_attrs.xml
deleted file mode 100755
index 2335d25..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/testdata/mock_manifest_attrs.xml
+++ /dev/null
@@ -1,180 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
- * 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.
- */
--->
-<resources>
-    <!-- WARNING !!! THIS IS A MOCK FILE. DO NOT USE FOR DOCUMENTATION PURPOSES.
-         This file has been trimmed down to only extract a number of interesting cases
-         for unit tests.
-
-    -->
-
-    <!-- **************************************************************** -->
-    <!-- These are the attributes used in AndroidManifest.xml. -->
-    <!-- **************************************************************** -->
-    <eat-comment />
-
-    <!-- The overall theme to use for an activity.  Use with either the
-         application tag (to supply a default theme for all activities) or
-         the activity tag (to supply a specific theme for that activity).
-
-         <p>This automatically sets
-         your activity's Context to use this theme, and may also be used
-         for "starting" animations prior to the activity being launched (to
-         better match what the activity actually looks like).  It is a reference
-         to a style resource defining the theme.  If not set, the default
-         system theme will be used. -->
-    <attr name="theme" format="reference" />
-
-    <!-- A user-legible name for the given item.  Use with the
-         application tag (to supply a default label for all application
-         components), or with the activity, receiver, service, or instrumentation
-         tag (to supply a specific label for that component).  It may also be
-         used with the intent-filter tag to supply a label to show to the
-         user when an activity is being selected based on a particular Intent.
-
-         <p>The given label will be used wherever the user sees information
-         about its associated component; for example, as the name of a
-         main activity that is displayed in the launcher.  You should
-         generally set this to a reference to a string resource, so that
-         it can be localized, however it is also allowed to supply a plain
-         string for quick and dirty programming. -->
-    <attr name="label" format="reference|string" />
-
-    <!-- A Drawable resource providing a graphical representation of its
-         associated item.  Use with the
-         application tag (to supply a default icon for all application
-         components), or with the activity, receiver, service, or instrumentation
-         tag (to supply a specific icon for that component).  It may also be
-         used with the intent-filter tag to supply an icon to show to the
-         user when an activity is being selected based on a particular Intent.
-
-         <p>The given icon will be used to display to the user a graphical
-         representation of its associated component; for example, as the icon
-         for main activity that is displayed in the launcher.  This must be
-         a reference to a Drawable resource containing the image definition. -->
-    <attr name="icon" format="reference" />
-
-    <!-- A unique name for the given item.  This must use a Java-style naming
-         convention to ensure the name is unique, for example
-         "com.mycompany.MyName". -->
-    <attr name="name" format="string" />
-
-    <!-- Internal version code.  This is the number used to determine whether
-         one version is more recent than another: it has no other meaning than
-         that higher numbers are more recent.  You could use this number to
-         encode a "x.y" in the lower and upper 16 bits, make it a build
-         number, simply increase it by one each time a new version is
-         released, or define it however else you want, as long as each
-         successive version has a higher number.  This is not a version
-         number generally shown to the user, that is usually supplied
-         with {@link android.R.attr#versionName}. -->
-    <attr name="versionCode" format="integer" />
-
-    <!-- The text shown to the user to indicate the version they have.  This
-         is used for no other purpose than display to the user; the actual
-         significant version number is given by {@link android.R.attr#versionCode}. -->
-    <attr name="versionName" format="string" />
-
-    <!-- .............. -->
-
-    <!-- The <code>manifest</code> tag is the root of an
-         <code>AndroidManifest.xml</code> file,
-         describing the contents of an Android package (.apk) file.  One
-         attribute must always be supplied: <code>package</code> gives a
-         unique name for the package, using a Java-style naming convention
-         to avoid name collisions.  For example, applications published
-         by Google could have names of the form
-         <code>com.google.app.<em>appname</em></code> -->
-    <declare-styleable name="AndroidManifest">
-        <attr name="versionCode" />
-        <attr name="versionName" />
-    </declare-styleable>
-
-    <!-- The <code>application</code> tag describes application-level components
-         contained in the package, as well as general application
-         attributes.  Many of the attributes you can supply here (such
-         as theme, label, icon, permission, process, taskAffinity,
-         and allowTaskReparenting) serve
-         as default values for the corresponding attributes of components
-         declared inside of the application.
-
-         <p>Inside of this element you specify what the application contains,
-         using the elements {@link #AndroidManifestProvider provider},
-         {@link #AndroidManifestService service},
-         {@link #AndroidManifestReceiver receiver},
-         {@link #AndroidManifestActivity activity},
-         {@link #AndroidManifestActivityAlias activity-alias}, and
-         {@link #AndroidManifestUsesLibrary uses-library}.  The application tag
-         appears as a child of the root {@link #AndroidManifest manifest} tag. -->
-    <declare-styleable name="AndroidManifestApplication" parent="AndroidManifest">
-        <attr name="name" />
-        <attr name="theme" />
-        <attr name="label" />
-        <attr name="icon" />
-        <attr name="cantSaveState" format="boolean" />
-    </declare-styleable>
-
-    <!-- The <code>permission</code> tag declares a security permission that can be
-         used to control access from other packages to specific components or
-         features in your package (or other packages).  See the
-         <a href="{@docRoot}guide/topics/security/security.html">Security and Permissions</a>
-         document for more information on permissions.
-
-         <p>This appears as a child tag of the root
-         {@link #AndroidManifest manifest} tag. -->
-    <declare-styleable name="AndroidManifestPermission" parent="AndroidManifest">
-        <!-- Required public name of the permission, which other components and
-        packages will use when referring to this permission.  This is a string using
-        Java-style scoping to ensure it is unique.  The prefix will often
-        be the same as our overall package name, for example
-        "com.mycompany.android.myapp.SomePermission". -->
-        <attr name="name" />
-        <attr name="label" />
-        <attr name="icon" />
-    </declare-styleable>
-
-
-    <!-- The <code>activity-alias</code> tag declares a new
-         name for an existing {@link #AndroidManifestActivity activity}
-         tag.
-
-         <p>Zero or more {@link #AndroidManifestIntentFilter intent-filter}
-         tags can be included inside of an activity-alias, to specify the Intents
-         that it can handle.  If none are specified, the activity can
-         only be started through direct specification of its class name.
-         The activity-alias tag appears as a child tag of the
-         {@link #AndroidManifestApplication application} tag. -->
-    <declare-styleable name="AndroidManifestActivityAlias" parent="AndroidManifestApplication">
-        <!-- Required name of the class implementing the activity, deriving from
-            {@link android.app.Activity}.  This is a fully
-            qualified class name (for example, com.mycompany.myapp.MyActivity); as a
-            short-hand if the first character of the class
-            is a period then it is appended to your package name. -->
-        <attr name="name" />
-        <attr name="label" />
-        <attr name="icon" />
-    </declare-styleable>
-
-    <declare-styleable name="AndroidManifestNewParentNewElement"
-            parent="AndroidManifest.AndroidManifestNewParent">
-        <attr name="name" />
-        <attr name="label" />
-        <attr name="icon" />
-    </declare-styleable>
-
-</resources>
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/mock_android/view/View.java b/eclipse/plugins/com.android.ide.eclipse.tests/unittests/mock_android/view/View.java
deleted file mode 100644
index a80a98d..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/mock_android/view/View.java
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * 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 mock_android.view;
-
-public class View {
-
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/mock_android/view/ViewGroup.java b/eclipse/plugins/com.android.ide.eclipse.tests/unittests/mock_android/view/ViewGroup.java
deleted file mode 100644
index 466470f..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/mock_android/view/ViewGroup.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * 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 mock_android.view;
-
-public class ViewGroup extends View {
-
-    public class MarginLayoutParams extends LayoutParams {
-
-    }
-
-    public class LayoutParams {
-
-    }
-
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/mock_android/widget/LinearLayout.java b/eclipse/plugins/com.android.ide.eclipse.tests/unittests/mock_android/widget/LinearLayout.java
deleted file mode 100644
index 3870a63..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/mock_android/widget/LinearLayout.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * 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 mock_android.widget;
-
-import mock_android.view.ViewGroup;
-
-public class LinearLayout extends ViewGroup {
-
-    public class LayoutParams extends mock_android.view.ViewGroup.LayoutParams {
-
-    }
-
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/mock_android/widget/TableLayout.java b/eclipse/plugins/com.android.ide.eclipse.tests/unittests/mock_android/widget/TableLayout.java
deleted file mode 100644
index e455e7d..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/mock_android/widget/TableLayout.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * 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 mock_android.widget;
-
-import mock_android.view.ViewGroup;
-
-public class TableLayout extends ViewGroup {
-
-    public class LayoutParams extends MarginLayoutParams {
-
-    }
-
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.traceview/.classpath b/eclipse/plugins/com.android.ide.eclipse.traceview/.classpath
deleted file mode 100644
index 3083795..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.traceview/.classpath
+++ /dev/null
@@ -1,8 +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.pde.core.requiredPlugins"/>
-    <classpathentry kind="lib" path="libs/traceview.jar" sourcepath="/traceview"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/eclipse/plugins/com.android.ide.eclipse.traceview/.project b/eclipse/plugins/com.android.ide.eclipse.traceview/.project
deleted file mode 100644
index 0cb5d18..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.traceview/.project
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>plugin-traceview</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.PluginNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/eclipse/plugins/com.android.ide.eclipse.traceview/.settings/org.eclipse.jdt.core.prefs b/eclipse/plugins/com.android.ide.eclipse.traceview/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index ea66196..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.traceview/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,98 +0,0 @@
-eclipse.preferences.version=1
-org.eclipse.jdt.core.compiler.annotation.missingNonNullByDefaultAnnotation=ignore
-org.eclipse.jdt.core.compiler.annotation.nonnull=com.android.annotations.NonNull
-org.eclipse.jdt.core.compiler.annotation.nonnullbydefault=com.android.annotations.NonNullByDefault
-org.eclipse.jdt.core.compiler.annotation.nonnullisdefault=disabled
-org.eclipse.jdt.core.compiler.annotation.nullable=com.android.annotations.Nullable
-org.eclipse.jdt.core.compiler.annotation.nullanalysis=enabled
-org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6
-org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.6
-org.eclipse.jdt.core.compiler.debug.lineNumber=generate
-org.eclipse.jdt.core.compiler.debug.localVariable=generate
-org.eclipse.jdt.core.compiler.debug.sourceFile=generate
-org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
-org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
-org.eclipse.jdt.core.compiler.problem.comparingIdentical=warning
-org.eclipse.jdt.core.compiler.problem.deadCode=warning
-org.eclipse.jdt.core.compiler.problem.deprecation=warning
-org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
-org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
-org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
-org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=ignore
-org.eclipse.jdt.core.compiler.problem.fallthroughCase=warning
-org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
-org.eclipse.jdt.core.compiler.problem.fieldHiding=warning
-org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
-org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
-org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
-org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
-org.eclipse.jdt.core.compiler.problem.includeNullInfoFromAsserts=enabled
-org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
-org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=warning
-org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
-org.eclipse.jdt.core.compiler.problem.localVariableHiding=warning
-org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
-org.eclipse.jdt.core.compiler.problem.missingDefaultCase=ignore
-org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=warning
-org.eclipse.jdt.core.compiler.problem.missingEnumCaseDespiteDefault=disabled
-org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=warning
-org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=error
-org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled
-org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
-org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=ignore
-org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
-org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
-org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore
-org.eclipse.jdt.core.compiler.problem.nullAnnotationInferenceConflict=warning
-org.eclipse.jdt.core.compiler.problem.nullReference=warning
-org.eclipse.jdt.core.compiler.problem.nullSpecInsufficientInfo=warning
-org.eclipse.jdt.core.compiler.problem.nullSpecViolation=warning
-org.eclipse.jdt.core.compiler.problem.nullUncheckedConversion=ignore
-org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
-org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
-org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=warning
-org.eclipse.jdt.core.compiler.problem.potentialNullReference=warning
-org.eclipse.jdt.core.compiler.problem.potentialNullSpecViolation=error
-org.eclipse.jdt.core.compiler.problem.potentiallyUnclosedCloseable=warning
-org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
-org.eclipse.jdt.core.compiler.problem.redundantNullAnnotation=warning
-org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
-org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=ignore
-org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=warning
-org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=ignore
-org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=ignore
-org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
-org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
-org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=enabled
-org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
-org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
-org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
-org.eclipse.jdt.core.compiler.problem.unavoidableGenericTypeProblems=disabled
-org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
-org.eclipse.jdt.core.compiler.problem.unclosedCloseable=error
-org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
-org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
-org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=warning
-org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=warning
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.unusedImport=warning
-org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
-org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
-org.eclipse.jdt.core.compiler.problem.unusedObjectAllocation=warning
-org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
-org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
-org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
-org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
-org.eclipse.jdt.core.compiler.source=1.6
diff --git a/eclipse/plugins/com.android.ide.eclipse.traceview/META-INF/MANIFEST.MF b/eclipse/plugins/com.android.ide.eclipse.traceview/META-INF/MANIFEST.MF
deleted file mode 100644
index 8e03134..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.traceview/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,17 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: Traceview
-Bundle-SymbolicName: com.android.ide.eclipse.traceview;singleton:=true
-Bundle-Version: 24.3.3.qualifier
-Bundle-Activator: com.android.ide.eclipse.traceview.TraceviewPlugin
-Require-Bundle: org.eclipse.ui,
- org.eclipse.core.runtime,
- org.eclipse.ui.ide,
- com.android.ide.eclipse.ddms;bundle-version="21.0.0",
- org.eclipse.core.filesystem,
- org.eclipse.core.resources
-Bundle-ActivationPolicy: lazy
-Bundle-ClassPath: .,
- libs/traceview.jar
-Bundle-Vendor: The Android Open Source Project
-Bundle-RequiredExecutionEnvironment: JavaSE-1.6
diff --git a/eclipse/plugins/com.android.ide.eclipse.traceview/about.ini b/eclipse/plugins/com.android.ide.eclipse.traceview/about.ini
deleted file mode 100644
index b61f646..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.traceview/about.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-aboutText=%blurb
-featureImage=icons/traceview-32.png
\ No newline at end of file
diff --git a/eclipse/plugins/com.android.ide.eclipse.traceview/about.properties b/eclipse/plugins/com.android.ide.eclipse.traceview/about.properties
deleted file mode 100755
index b33e9f3..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.traceview/about.properties
+++ /dev/null
@@ -1,7 +0,0 @@
-blurb=Traceview\n\
-\n\
-Version\: {featureVersion}\n\
-\n\
-(c) Copyright 2011 The Android Open Source Project.  All rights reserved.\n\
-Visit http://developer.android.com/sdk/eclipse-adt.html
-
diff --git a/eclipse/plugins/com.android.ide.eclipse.traceview/build.properties b/eclipse/plugins/com.android.ide.eclipse.traceview/build.properties
deleted file mode 100644
index 4895f9f..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.traceview/build.properties
+++ /dev/null
@@ -1,9 +0,0 @@
-source.. = src/
-output.. = bin/
-bin.includes = META-INF/,\
-               .,\
-               libs/,\
-               plugin.xml,\
-               icons/,\
-               about.ini,\
-               about.properties
diff --git a/eclipse/plugins/com.android.ide.eclipse.traceview/icons/android.png b/eclipse/plugins/com.android.ide.eclipse.traceview/icons/android.png
deleted file mode 100644
index a8dc35e..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.traceview/icons/android.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.traceview/icons/traceview-32.png b/eclipse/plugins/com.android.ide.eclipse.traceview/icons/traceview-32.png
deleted file mode 100644
index 4916737..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.traceview/icons/traceview-32.png
+++ /dev/null
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.traceview/plugin.xml b/eclipse/plugins/com.android.ide.eclipse.traceview/plugin.xml
deleted file mode 100644
index 042a630..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.traceview/plugin.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.4"?>
-<plugin>
-   <extension
-         point="org.eclipse.ui.editors">
-      <editor
-            class="com.android.ide.eclipse.traceview.editors.TraceviewEditor"
-            default="true"
-            extensions="trace"
-            icon="icons/android.png"
-            id="com.android.ide.eclipse.traceview.editors.TraceviewEditor"
-            name="Traceview">
-      </editor>
-   </extension>
-   <extension
-         point="com.android.ide.eclipse.ddms.traceviewLauncher">
-      <launcher
-            class="com.android.ide.eclipse.traceview.TraceviewLauncher">
-      </launcher>
-   </extension>
-
-</plugin>
diff --git a/eclipse/plugins/com.android.ide.eclipse.traceview/pom.xml b/eclipse/plugins/com.android.ide.eclipse.traceview/pom.xml
deleted file mode 100644
index e0a4df7..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.traceview/pom.xml
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-    <modelVersion>4.0.0</modelVersion>
-
-    <version>24.3.3-SNAPSHOT</version>
-    <artifactId>com.android.ide.eclipse.traceview</artifactId>
-    <packaging>eclipse-plugin</packaging>
-    <name>traceview</name>
-
-    <parent>
-        <relativePath>../../pom.xml</relativePath>
-        <groupId>adt.group</groupId>
-        <artifactId>parent</artifactId>
-        <version>1.0.0-SNAPSHOT</version>
-    </parent>
-</project>
diff --git a/eclipse/plugins/com.android.ide.eclipse.traceview/src/com/android/ide/eclipse/traceview/TraceviewLauncher.java b/eclipse/plugins/com.android.ide.eclipse.traceview/src/com/android/ide/eclipse/traceview/TraceviewLauncher.java
deleted file mode 100644
index b232bac..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.traceview/src/com/android/ide/eclipse/traceview/TraceviewLauncher.java
+++ /dev/null
@@ -1,77 +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.eclipse.traceview;
-
-import com.android.ide.eclipse.ddms.ITraceviewLauncher;
-
-import org.eclipse.core.filesystem.EFS;
-import org.eclipse.core.filesystem.IFileStore;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.WorkbenchException;
-import org.eclipse.ui.ide.IDE;
-
-public class TraceviewLauncher implements ITraceviewLauncher {
-
-    @Override
-    public boolean openFile(String osPath) {
-        final IFileStore fileStore =  EFS.getLocalFileSystem().getStore(new Path(osPath));
-        if (!fileStore.fetchInfo().isDirectory() && fileStore.fetchInfo().exists()) {
-            // before we open the file in an editor window, we make sure the current
-            // workbench page has an editor area (typically the ddms perspective doesn't).
-            final IWorkbench workbench = PlatformUI.getWorkbench();
-            Display display = workbench.getDisplay();
-            final boolean[] result = new boolean[] { false };
-            display.syncExec(new Runnable() {
-                @Override
-                public void run() {
-                    IWorkbenchWindow window = workbench.getActiveWorkbenchWindow();
-                    IWorkbenchPage page = window.getActivePage();
-                    if (page.isEditorAreaVisible() == false) {
-                        IAdaptable input;
-                        if (page != null)
-                            input= page.getInput();
-                        else
-                            input= ResourcesPlugin.getWorkspace().getRoot();
-                        try {
-                            workbench.showPerspective("org.eclipse.debug.ui.DebugPerspective",
-                                    window, input);
-                        } catch (WorkbenchException e) {
-                        }
-                    }
-
-                    try {
-                        result[0] = IDE.openEditorOnFileStore(page, fileStore) != null;
-                    } catch (PartInitException e) {
-                        // return false below
-                    }
-                }
-            });
-
-            return result[0];
-        }
-
-        return false;
-    }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.traceview/src/com/android/ide/eclipse/traceview/TraceviewPlugin.java b/eclipse/plugins/com.android.ide.eclipse.traceview/src/com/android/ide/eclipse/traceview/TraceviewPlugin.java
deleted file mode 100644
index e11f7c9..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.traceview/src/com/android/ide/eclipse/traceview/TraceviewPlugin.java
+++ /dev/null
@@ -1,67 +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.eclipse.traceview;
-
-import org.eclipse.ui.plugin.AbstractUIPlugin;
-import org.osgi.framework.BundleContext;
-
-/**
- * The activator class controls the plug-in life cycle
- */
-public class TraceviewPlugin extends AbstractUIPlugin {
-
-    // The plug-in ID
-    public static final String PLUGIN_ID = "com.android.ide.eclipse.traceview"; // $NON-NLS-1$
-
-    // The shared instance
-    private static TraceviewPlugin sPlugin;
-
-    /**
-     * The constructor
-     */
-    public TraceviewPlugin() {
-    }
-
-    /*
-     * (non-Javadoc)
-     * @see org.eclipse.ui.plugin.AbstractUIPlugin#start(org.osgi.framework.BundleContext)
-     */
-    @Override
-    public void start(BundleContext context) throws Exception {
-        super.start(context);
-        sPlugin = this;
-    }
-
-    /*
-     * (non-Javadoc)
-     * @see org.eclipse.ui.plugin.AbstractUIPlugin#stop(org.osgi.framework.BundleContext)
-     */
-    @Override
-    public void stop(BundleContext context) throws Exception {
-        sPlugin = null;
-        super.stop(context);
-    }
-
-    /**
-     * Returns the shared instance
-     *
-     * @return the shared instance
-     */
-    public static TraceviewPlugin getDefault() {
-        return sPlugin;
-    }
-
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.traceview/src/com/android/ide/eclipse/traceview/editors/TraceviewEditor.java b/eclipse/plugins/com.android.ide.eclipse.traceview/src/com/android/ide/eclipse/traceview/editors/TraceviewEditor.java
deleted file mode 100644
index 6d07018..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.traceview/src/com/android/ide/eclipse/traceview/editors/TraceviewEditor.java
+++ /dev/null
@@ -1,316 +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.eclipse.traceview.editors;
-
-import com.android.ide.eclipse.ddms.JavaSourceRevealer;
-import com.android.ide.eclipse.traceview.TraceviewPlugin;
-import com.android.traceview.ColorController;
-import com.android.traceview.DmTraceReader;
-import com.android.traceview.MethodData;
-import com.android.traceview.ProfileView;
-import com.android.traceview.ProfileView.MethodHandler;
-import com.android.traceview.SelectionController;
-import com.android.traceview.TimeLineView;
-import com.android.traceview.TraceReader;
-import com.android.traceview.TraceUnits;
-
-import org.eclipse.core.filesystem.EFS;
-import org.eclipse.core.filesystem.IFileStore;
-import org.eclipse.core.filesystem.URIUtil;
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IWorkspace;
-import org.eclipse.core.resources.IWorkspaceRoot;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.jface.dialogs.IMessageProvider;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.jface.window.Window;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.SashForm;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.FileDialog;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorSite;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.dialogs.SaveAsDialog;
-import org.eclipse.ui.ide.FileStoreEditorInput;
-import org.eclipse.ui.part.EditorPart;
-import org.eclipse.ui.part.FileEditorInput;
-
-import java.io.File;
-import java.io.IOException;
-import java.net.URI;
-
-public class TraceviewEditor extends EditorPart implements MethodHandler {
-
-    private Composite mParent;
-    private String mFilename;
-    private Composite mContents;
-
-    @Override
-    public void doSave(IProgressMonitor monitor) {
-        // We do not modify the file
-    }
-
-    /*
-     * Copied from org.eclipse.ui.texteditor.AbstractDecoratedTextEditor.
-     */
-    /**
-     * Checks whether there given file store points to a file in the workspace.
-     * Only returns a workspace file if there's a single match.
-     *
-     * @param fileStore the file store
-     * @return the <code>IFile</code> that matches the given file store
-     */
-    private IFile getWorkspaceFile(IFileStore fileStore) {
-        IWorkspaceRoot workspaceRoot = ResourcesPlugin.getWorkspace().getRoot();
-        IFile[] files = workspaceRoot.findFilesForLocationURI(fileStore.toURI());
-        if (files != null && files.length == 1)
-            return files[0];
-        return null;
-    }
-
-    /*
-     * Based on the performSaveAs() method defined in class
-     * org.eclipse.ui.texteditor.AbstractDecoratedTextEditor of the
-     * org.eclipse.ui.editors plugin.
-     */
-    @Override
-    public void doSaveAs() {
-        Shell shell = getSite().getShell();
-        final IEditorInput input = getEditorInput();
-
-        final IEditorInput newInput;
-
-        if (input instanceof FileEditorInput) {
-            // the file is part of the current workspace
-            FileEditorInput fileEditorInput = (FileEditorInput) input;
-            SaveAsDialog dialog = new SaveAsDialog(shell);
-
-            IFile original = fileEditorInput.getFile();
-            if (original != null) {
-                dialog.setOriginalFile(original);
-            }
-
-            dialog.create();
-
-            if (original != null && !original.isAccessible()) {
-                String message = String.format(
-                        "The original file ''%s'' has been deleted or is not accessible.",
-                        original.getName());
-                dialog.setErrorMessage(null);
-                dialog.setMessage(message, IMessageProvider.WARNING);
-            }
-
-            if (dialog.open() == Window.CANCEL) {
-                return;
-            }
-
-            IPath filePath = dialog.getResult();
-            if (filePath == null) {
-                return;
-            }
-
-            IWorkspace workspace = ResourcesPlugin.getWorkspace();
-            IFile file = workspace.getRoot().getFile(filePath);
-
-            if (copy(shell, fileEditorInput.getURI(), file.getLocationURI()) == null) {
-                return;
-            }
-
-            try {
-                file.refreshLocal(IFile.DEPTH_ZERO, null);
-            } catch (CoreException e) {
-                // TODO Auto-generated catch block
-                e.printStackTrace();
-            }
-            newInput = new FileEditorInput(file);
-            setInput(newInput);
-            setPartName(newInput.getName());
-        } else if (input instanceof FileStoreEditorInput) {
-            // the file is not part of the current workspace
-            FileStoreEditorInput fileStoreEditorInput = (FileStoreEditorInput) input;
-            FileDialog dialog = new FileDialog(shell, SWT.SAVE);
-            IPath oldPath = URIUtil.toPath(fileStoreEditorInput.getURI());
-            if (oldPath != null) {
-                dialog.setFileName(oldPath.lastSegment());
-                dialog.setFilterPath(oldPath.toOSString());
-            }
-
-            String path = dialog.open();
-            if (path == null) {
-                return;
-            }
-
-            // Check whether file exists and if so, confirm overwrite
-            final File localFile = new File(path);
-            if (localFile.exists()) {
-                MessageDialog overwriteDialog = new MessageDialog(
-                        shell,
-                        "Save As",
-                        null,
-                        String.format(
-                                "%s already exists.\nDo you want to replace it?"
-                                , path),
-                        MessageDialog.WARNING,
-                        new String[] {
-                                IDialogConstants.YES_LABEL, IDialogConstants.NO_LABEL
-                        }, 1); // 'No' is the default
-                if (overwriteDialog.open() != Window.OK) {
-                    return;
-                }
-            }
-
-            IFileStore destFileStore = copy(shell, fileStoreEditorInput.getURI(), localFile.toURI());
-            if (destFileStore != null) {
-                IFile file = getWorkspaceFile(destFileStore);
-                if (file != null) {
-                    newInput = new FileEditorInput(file);
-                } else {
-                    newInput = new FileStoreEditorInput(destFileStore);
-                }
-                setInput(newInput);
-                setPartName(newInput.getName());
-            }
-        }
-    }
-
-    private IFileStore copy(Shell shell, URI source, URI dest) {
-        IFileStore destFileStore = null;
-        IFileStore sourceFileStore = null;
-        try {
-            destFileStore = EFS.getStore(dest);
-            sourceFileStore = EFS.getStore(source);
-            sourceFileStore.copy(destFileStore, EFS.OVERWRITE, null);
-        } catch (CoreException ex) {
-            String title = "Problems During Save As...";
-            String msg = String.format("Save could not be completed. %s",
-                    ex.getMessage());
-            MessageDialog.openError(shell, title, msg);
-            return null;
-        }
-        return destFileStore;
-    }
-
-    @Override
-    public void init(IEditorSite site, IEditorInput input) throws PartInitException {
-        // The contract of init() mentions we need to fail if we can't
-        // understand the input.
-        if (input instanceof FileEditorInput) {
-            // We try to open a file that is part of the current workspace
-            FileEditorInput fileEditorInput = (FileEditorInput) input;
-            mFilename = fileEditorInput.getPath().toOSString();
-            setSite(site);
-            setInput(input);
-            setPartName(input.getName());
-        } else if (input instanceof FileStoreEditorInput) {
-            // We try to open a file that is not part of the current workspace
-            FileStoreEditorInput fileStoreEditorInput = (FileStoreEditorInput) input;
-            mFilename = fileStoreEditorInput.getURI().getPath();
-            setSite(site);
-            setInput(input);
-            setPartName(input.getName());
-        } else {
-            throw new PartInitException("Input is not of type FileEditorInput " + //$NON-NLS-1$
-                    "nor FileStoreEditorInput: " + //$NON-NLS-1$
-                    input == null ? "null" : input.toString()); //$NON-NLS-1$
-        }
-    }
-
-    @Override
-    public boolean isDirty() {
-        return false;
-    }
-
-    @Override
-    public boolean isSaveAsAllowed() {
-        return true;
-    }
-
-    @Override
-    public void createPartControl(Composite parent) {
-        mParent = parent;
-        try {
-            TraceReader reader = new DmTraceReader(mFilename, false);
-            reader.getTraceUnits().setTimeScale(TraceUnits.TimeScale.MilliSeconds);
-
-            mContents = new Composite(mParent, SWT.NONE);
-
-            Display display = mContents.getDisplay();
-            ColorController.assignMethodColors(display, reader.getMethods());
-            SelectionController selectionController = new SelectionController();
-
-            GridLayout gridLayout = new GridLayout(1, false);
-            gridLayout.marginWidth = 0;
-            gridLayout.marginHeight = 0;
-            gridLayout.horizontalSpacing = 0;
-            gridLayout.verticalSpacing = 0;
-            mContents.setLayout(gridLayout);
-
-            Color darkGray = display.getSystemColor(SWT.COLOR_DARK_GRAY);
-
-            // Create a sash form to separate the timeline view (on top)
-            // and the profile view (on bottom)
-            SashForm sashForm1 = new SashForm(mContents, SWT.VERTICAL);
-            sashForm1.setBackground(darkGray);
-            sashForm1.SASH_WIDTH = 3;
-            GridData data = new GridData(GridData.FILL_BOTH);
-            sashForm1.setLayoutData(data);
-
-            // Create the timeline view
-            new TimeLineView(sashForm1, reader, selectionController);
-
-            // Create the profile view
-            new ProfileView(sashForm1, reader, selectionController).setMethodHandler(this);
-        } catch (IOException e) {
-            Label l = new Label(parent, 0);
-            l.setText("Failed to read the stack trace.");
-
-            Status status = new Status(IStatus.ERROR, TraceviewPlugin.PLUGIN_ID,
-                    "Failed to read the stack trace.", e);
-            TraceviewPlugin.getDefault().getLog().log(status);
-        }
-
-        mParent.layout();
-    }
-
-    @Override
-    public void setFocus() {
-        mParent.setFocus();
-    }
-
-    // ---- MethodHandler methods
-
-    @Override
-    public void handleMethod(MethodData method) {
-        String methodName = method.getMethodName();
-        String className = method.getClassName().replaceAll("/", ".");  //$NON-NLS-1$ //$NON-NLS-2$
-        String fqmn = className + "." + methodName; //$NON-NLS-1$
-
-        JavaSourceRevealer.revealMethod(fqmn, null, -1, null);
-    }
-}
diff --git a/eclipse/pom.xml b/eclipse/pom.xml
deleted file mode 100644
index 36e500c..0000000
--- a/eclipse/pom.xml
+++ /dev/null
@@ -1,168 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- This script builds the monitor product which is composed of a bunch of Eclipse plugins.
-
- To run this script:
-   - Have Maven3 in your path
-   - $ mvn package -DANDROID_OUT=/path/to/android/out
-
- See http://wiki.eclipse.org/Tycho/Reference_Card#Examplary_parent_POM
- -->
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-    <modelVersion>4.0.0</modelVersion>
-
-    <groupId>adt.group</groupId>
-    <artifactId>parent</artifactId>
-    <version>1.0.0-SNAPSHOT</version>
-    <packaging>pom</packaging>
-    <name>ADT</name>
-
-    <!-- Common properties used in all modules -->
-    <properties>
-        <tycho-version>0.20.0</tycho-version>
-        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
-    </properties>
-
-    <!--
-    The following profiles allow us to change the build environment easily. The first profile uses
-    the target platform as present inside the Android tree's out folder, while the other profile
-    uses the target platform directly from eclipse.org.
-
-    The first profile is automatically activated if the ANDROID_OUT system property is set:
-        $ mvn clean install -DANDROID_OUT=/path/to/android/out
-    The other profile can be tested out by:
-        $ mvn clean install -Pexternal-p2-repositories
-    -->
-    <profiles>
-        <profile>
-            <id>mirrored-p2-repositories</id>
-            <activation>
-                <property>
-                    <name>ANDROID_OUT</name>
-                </property>
-            </activation>
-            <properties>
-                <!-- The target platform should have been created under the Android ANDROID_OUT folder -->
-                <target-platform.base.url>file://${ANDROID_OUT}/host/maven/target</target-platform.base.url>
-            </properties>
-            <repositories>
-                <repository>
-                    <id>kepler</id>
-                    <url>${target-platform.base.url}/platform</url>
-                    <layout>p2</layout>
-                </repository>
-                <repository>
-                    <id>jdt</id>
-                    <url>${target-platform.base.url}/jdt</url>
-                    <layout>p2</layout>
-                </repository>
-            </repositories>
-        </profile>
-        <profile>
-            <id>external-p2-repositories</id>
-            <repositories>
-               <repository>
-                   <id>kepler</id>
-                   <url>http://download.eclipse.org/releases/kepler</url>
-                   <layout>p2</layout>
-               </repository>
-            </repositories>
-        </profile>
-    </profiles>
-
-    <modules>
-        <module>plugins/com.android.ide.eclipse.base</module>
-        <module>plugins/com.android.ide.eclipse.ddms</module>
-        <module>plugins/com.android.ide.eclipse.gldebugger</module>
-        <module>plugins/com.android.ide.eclipse.hierarchyviewer</module>
-        <module>plugins/com.android.ide.eclipse.monitor</module>
-        <module>plugins/com.android.ide.eclipse.traceview</module>
-
-        <module>features/com.android.ide.eclipse.ddms</module>
-        <module>features/com.android.ide.eclipse.gldebugger</module>
-        <module>features/com.android.ide.eclipse.hierarchyviewer</module>
-        <module>features/com.android.ide.eclipse.traceview</module>
-        <module>features/com.android.ide.eclipse.monitor</module>
-
-        <module>artifacts/bundles</module>
-    </modules>
-
-    <build>
-        <!-- Path is relative to each of the build modules defined above. -->
-        <directory>../../../../out/host/maven/${project.artifactId}-${project.version}</directory>
-
-        <plugins>
-            <plugin>
-                <groupId>org.eclipse.tycho</groupId>
-                <artifactId>target-platform-configuration</artifactId>
-                <version>${tycho-version}</version>
-                <configuration>
-                    <environments>
-                        <environment>
-                            <os>win32</os>
-                            <ws>win32</ws>
-                            <arch>x86</arch>
-                        </environment>
-                        <environment>
-                            <os>win32</os>
-                            <ws>win32</ws>
-                            <arch>x86_64</arch>
-                        </environment>
-                        <environment>
-                            <os>linux</os>
-                            <ws>gtk</ws>
-                            <arch>x86</arch>
-                        </environment>
-                        <environment>
-                            <os>macosx</os>
-                            <ws>cocoa</ws>
-                            <arch>x86_64</arch>
-                        </environment>
-                        <environment>
-                            <os>linux</os>
-                            <ws>gtk</ws>
-                            <arch>x86_64</arch>
-                        </environment>
-                    </environments>
-                </configuration>
-            </plugin>
-
-            <plugin>
-                <groupId>org.eclipse.tycho</groupId>
-                <artifactId>tycho-maven-plugin</artifactId>
-                <version>${tycho-version}</version>
-                <extensions>true</extensions>
-            </plugin>
-
-            <plugin>
-                <groupId>org.eclipse.tycho</groupId>
-                <artifactId>tycho-p2-repository-plugin</artifactId>
-                <version>${tycho-version}</version>
-                <configuration>
-                    <includeAllDependencies>true</includeAllDependencies>
-                </configuration>
-            </plugin>
-        </plugins>
-        <!--
-          Don't include META-INF/maven in the jar files, this causes an unnecessary increase in the
-          path length as that folder contained the files with the longest paths (one path was 190 chars).
-          Windows has a limit of ~260 chars, but removing all the maven info lowers our max path length
-          from 190 to about 150.
-        -->
-        <pluginManagement>
-            <plugins>
-                <plugin>
-                    <groupId>org.eclipse.tycho</groupId>
-                    <artifactId>tycho-packaging-plugin</artifactId>
-                    <version>${tycho-version}</version>
-                    <configuration>
-                        <archive>
-                            <addMavenDescriptor>false</addMavenDescriptor>
-                        </archive>
-                    </configuration>
-                </plugin>
-            </plugins>
-        </pluginManagement>
-    </build>
-</project>
diff --git a/eclipse/scripts/_mk_icons.sh b/eclipse/scripts/_mk_icons.sh
deleted file mode 100755
index b3ea35b..0000000
--- a/eclipse/scripts/_mk_icons.sh
+++ /dev/null
@@ -1,55 +0,0 @@
-#!/bin/bash
-
-function icon() {
-  # $1=letter, $2=letter's color (e.g. A red), $3=filename
-  ./gen_icon.py ${3}.png 16 white black $2 $1
-}
-
-icon M green  manifest
-  icon S blue   sharedUserId
-  icon S red    signature
-  icon P green  package
-
-icon I green  instrumentation
-  icon F green  functionalTest
-  icon H green  handleProfiling
-  icon I green  icon
-  icon T green  targetPackage
-
-icon U blue   uses-permission
-icon P red    permission
-  icon N green  name
-  icon L blue   label
-
-icon A blue     application
-    icon P red    permission
-    icon P blue   persistent
-    icon P green  process
-    icon T green  taskAffinity
-    icon T blue   theme
-  icon P red    provider
-    icon A green  authorities
-    icon I green  initOrder
-    icon M green  multiprocess
-    icon R green  readPermission
-    icon W green  writePermission
-    icon S green  syncable
-  icon R green  receiver
-  icon S blue   service
-  icon A green  activity
-      icon C blue   clearOnBackground
-      icon C green  configChanges
-      icon E green  excludeFromRecents
-      icon L green  launchMode
-      icon S green  stateNotNeeded
-    icon F blue  intent-filter
-        icon P green  priority
-      icon A red    action
-      icon C green  category
-      icon D green  data
-        icon M green    mimeType
-        icon S green    scheme
-        icon H green    host
-        icon P green    port
-        icon P blue     path
-
diff --git a/eclipse/scripts/build_adt.sh b/eclipse/scripts/build_adt.sh
deleted file mode 100755
index 7006aab..0000000
--- a/eclipse/scripts/build_adt.sh
+++ /dev/null
@@ -1,49 +0,0 @@
-#!/bin/bash
-# Expected arguments:
-# $1 = out_dir
-# $2 = dist_dir
-# $3 = build_number
-
-# exit on error
-set -e
-
-if [ $# -ne 3 ]
-then
-  echo "Usage: $0 <out_dir> <dest_dir> <build_number>" > /dev/stderr
-  echo "Given arguments: $*" > /dev/stderr
-  exit 1
-fi
-
-PROG_DIR=$(dirname "$0")
-
-cd "$PROG_DIR"/../../..
-ANDROID_SRC="$PWD"
-
-OUT="$1"
-DIST="$2"
-BNUM="$3"
-
-echo "ANDROID_SRC=$ANDROID_SRC"
-echo "OUT=$OUT"
-echo "DIST=$DIST"
-echo "BNUM=$BNUM"
-
-# Steps to build Eclipse
-# 1. Generate Maven repository containing all tools
-echo Running gradle to build tools libraries...
-cd "$ANDROID_SRC"/tools
-./gradlew --no-daemon publishLocal
-
-# 2. Copy dependent jars into the libs folder of each plugin
-echo Copying jars to be embedded inside the ADT plugins
-cd "$ANDROID_SRC"
-./tools/gradlew -i -b sdk/eclipse/build.gradle --no-daemon copydeps
-
-# 3. Launch Tycho build
-echo Launching Tycho to build ADT plugins and bundle
-( set -x ; BUILD_NUMBER="$BNUM" ./tools/gradlew -i -b sdk/eclipse/build.gradle --no-daemon buildEclipse)
-
-echo Copying ADT plugins and bundle into destination folder
-cd "$ANDROID_SRC"
-cp -rv out/host/maven/bundles-*/products/*.zip "$DIST"/
-cp -rv out/host/maven/p2repo-*/p2repo-*.zip "$DIST"/p2repo-$BNUM.zip
diff --git a/eclipse/scripts/build_update_site.sh b/eclipse/scripts/build_update_site.sh
deleted file mode 100755
index 5998756..0000000
--- a/eclipse/scripts/build_update_site.sh
+++ /dev/null
@@ -1,34 +0,0 @@
-#!/bin/bash
-# Entry point to build the Eclipse plugins for local deployment.
-#
-# Input parameters:
-# $1: Optional build number. If present, will be appended to the date qualifier.
-#     The build number cannot contain spaces *nor* periods (dashes are ok.)
-# -i: Optional, if present, the Google internal update site will be built. Otherwise, 
-#     the external site will be built
-#
-# Workflow:
-# - calls buildserver with /home/$USER/www/no_crawl and -z
-#   to build and create the update size but do not zip it in the destination directory.
-
-set -e  # Fail this script as soon as a command fails -- fail early, fail fast
-
-D=`dirname $0`
-BUILD_NUMBER=""
-INTERNAL_BUILD=""
-# parse input parameters
-while [ $# -gt 0 ]; do
-  if [ "$1" == "-i" ]; then
-    INTERNAL_BUILD="-i"
-  elif [ "$1" != "" ]; then
-    BUILD_NUMBER="$1"
-  fi
-  shift
-done
-
-DEST_DIR="$HOME"
-[ -z "$DEST_DIR" ] && [ -n "$USER" ] && DEST_DIR="/home/$USER"
-[ -z "$DEST_DIR" ] && DEST_DIR="~"
-DEST_DIR="$DEST_DIR/www/no_crawl"
-
-"$D/build_server.sh" "$DEST_DIR" "$BUILD_NUMBER" -z "$INTERNAL_BUILD"
diff --git a/eclipse/scripts/collect_sources_for_sdk.py b/eclipse/scripts/collect_sources_for_sdk.py
deleted file mode 100755
index b95ae62..0000000
--- a/eclipse/scripts/collect_sources_for_sdk.py
+++ /dev/null
@@ -1,180 +0,0 @@
-#!/usr/bin/python
-#
-# 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.
-#
-"""
-Description:
-   This script collects all framework Java sources from the current android
-   source code and places them in a source folder suitable for the eclipse ADT
-   plugin.
-
-See usage() below.
-
-Copyright (C) 2009 The Android Open Source Project
-Licensed under the Apache License, Version 2.0 (the "License").
-"""
-
-import re
-import os
-import sys
-import getopt
-import shutil
-
-_RE_PKG = re.compile("^\s*package\s+([^\s;]+)\s*;.*")
-
-# Holds cmd-line arguments
-class Params(object):
-    def __init__(self):
-        self.DRY = False
-        self.DIR = "frameworks libcore"
-        self.SRC = None
-        self.DST = None
-        self.CNT_USED = 0
-        self.CNT_NOPKG = 0
-
-
-# Prints a usage summary
-def usage(error=None):
-    print """
- Description:
-   This script collects all framework Java sources from the current android
-   source code and places them in a source folder suitable for the eclipse ADT
-   plugin.
-
- Usage:
-   %s [-n] <android-git-repo root> <sdk/platforms/xyz/sources>
- 
- The source and destination directories must already exist.
- Use -n for a dry-run.
-
-""" % sys.argv[0]
-
-    if error:
-        print >>sys.stderr, "Error:", error
-
-
-# Parse command line args, returns a Params instance or sys.exit(2) on error
-# after printing the error and the usage.
-def parseArgs(argv):
-    p = Params()
-    error = None
-
-    try:
-        opts, args = getopt.getopt(argv[1:],
-                                   "ns:",
-                                   [ "--dry", "--sourcedir=" ])
-    except getopt.GetoptError, e:
-        error = str(e)
-
-    if error is None:
-        for o, a in opts:
-            if o in [ "-n", "--dry" ]:
-                p.DRY = True
-            elif o in [ "-s", "--sourcedir" ]:
-                p.DIR = a
-
-        if len(args) != 2:
-            error = "Missing arguments: <source> <dest>"
-        else:
-            p.SRC = args[0]
-            p.DST = args[1]
-
-            if not os.path.isdir(p.SRC):
-                error = "%s is not a directory" % p.SRC
-            elif not os.path.isdir(p.DST):
-                error = "%s is not a directory" % p.DST
-
-    if error:
-        usage(error)
-        sys.exit(2)
-
-    return p
-
-
-# Recursively parses the given directory and process java files found
-def parseSrcDir(p, srcdir):
-    if not os.path.exists(srcdir):
-        print >>sys.stderr, "Error: Skipping unknown directory", srcdir
-        return
-
-    for f in os.listdir(srcdir):
-        fp = os.path.join(srcdir, f)
-        if f.endswith(".java") and os.path.isfile(fp):
-            pkg = checkJavaFile(fp)
-            if pkg:
-                pkg = pkg.replace(".", os.path.sep)  # e.g. android.view => android/view
-                copy(p, fp, f, pkg)
-                p.CNT_USED += 1   # one more copied
-            else:
-                p.CNT_NOPKG += 1  # this java file lacked a package declaration
-        elif os.path.isdir(fp):
-            parseSrcDir(p, fp)
-
-
-# Check a java file to find its package declaration, if any
-def checkJavaFile(path):
-    print "Process", path
-
-    try:
-        f = None
-        try:
-            f = file(path)
-            for l in f.readlines():
-                m = _RE_PKG.match(l)
-                if m:
-                    return m.group(1)
-        finally:
-            if f: f.close()
-    except Exception:
-        pass
-
-    return None
-
-
-# Create destination directory based on package name then copy the
-# source file in there
-def copy(p, fp, f, pkg):
-    dstdir = os.path.join(p.DST, pkg)
-    _mkdir(p, dstdir)
-    _cp(p, fp, os.path.join(dstdir, f))
-
-
-def _mkdir(p, dir):
-    if not os.path.isdir(dir):
-        if p.DRY:
-            print "mkdir", dir
-        else:
-            os.makedirs(dir)
-
-
-def _cp(p, src, dst):
-    if p.DRY:
-        print "cp", src, dst
-    else:
-        shutil.copyfile(src, dst)
-
-
-def main():
-    p = parseArgs(sys.argv)
-    for d in p.DIR.split():
-        if d:
-            parseSrcDir(p, os.path.join(p.SRC, d))
-    print "%d java files copied" % p.CNT_USED
-    if p.CNT_NOPKG: print "%d java files ignored (no package)" % p.CNT_NOPKG
-    if p.DRY: print "This was in *DRY* mode. No copies done."
-
-
-if __name__ == "__main__":
-    main()
diff --git a/eclipse/scripts/gen_icon.py b/eclipse/scripts/gen_icon.py
deleted file mode 100755
index f6274e1..0000000
--- a/eclipse/scripts/gen_icon.py
+++ /dev/null
@@ -1,71 +0,0 @@
-#!/usr/bin/python
-
-import sys
-import StringIO
-try:
-    import Image, ImageDraw, ImageFont
-except ImportError, e:
-    print str(e)
-    print "Are you missing the Python Imaging Library? (apt-get install python-imaging)"
-    sys.exit(1)
-
-FONT_PATH = "/usr/share/fonts/truetype/msttcorefonts/arial.ttf"
-
-class Args(object):
-    def __init__(self, dest_name, size, circle_color, border_color,
-                 letter_color, letter):
-        self.dest_name = dest_name
-        self.size = size
-        self.circle_color = circle_color
-        self.border_color = border_color
-        self.letter_color = letter_color
-        self.letter = letter
-
-def main(args):
-    data = process_args(args)
-    if data:
-        createImage(data)
-
-def process_args(args):
-    if not args or len(args) != 6:
-        usage()
-    return Args(*args)
-    
-def usage():
-    print """Usage: %s <file_name> <size> <circle-color> <border-color> <letter-color> <letter>""" % sys.argv[0]
-    sys.exit(1)
-
-def createImage(data):
-    zoom = 4
-    rmin = -zoom/2
-    rmax = zoom/2
-    if zoom > 1:
-        r = range(-zoom/2, zoom/2+1)
-    else:
-        r = [ 0 ]
-    sz = int(data.size)
-    sz4 = sz * zoom
-    
-    img = Image.new("RGBA", (sz4, sz4), (255,255,255,0))
-    draw = ImageDraw.Draw(img)
-
-    draw.ellipse((0, 0, sz4-zoom, sz4-zoom),
-                     fill=data.circle_color, outline=None)
-    for i in r:
-        draw.ellipse((i, i, sz4-i-zoom, sz4-i-zoom),
-                     fill=None, outline=data.border_color)
-
-    font = ImageFont.truetype(FONT_PATH, int(sz4 * .75))
-    tsx, tsy = draw.textsize(data.letter, font=font)
-
-    ptx = (sz4 - tsx) / 2
-    pty = (sz4 - tsy) / 2
-    for i in r:
-        draw.text((ptx + i, pty), data.letter, font=font, fill=data.letter_color)
-
-    img = img.resize((sz, sz), Image.BICUBIC)
-    img.save(data.dest_name, "PNG")
-    print "Saved", data.dest_name
-
-if __name__ == "__main__":
-    main(sys.argv[1:])
diff --git a/eclipse/scripts/update_version.sh b/eclipse/scripts/update_version.sh
deleted file mode 100755
index 228be97..0000000
--- a/eclipse/scripts/update_version.sh
+++ /dev/null
@@ -1,80 +0,0 @@
-#!/bin/bash
-
-OLD="$1"
-NEW="$2"
-
-# sanity check in input args
-if [ -z "$OLD" ] || [ -z "$NEW" ]; then
-    cat <<EOF
-Usage: $0 <old> <new>
-Changes the ADT plugin revision number.
-Example:
-  cd sdk/eclipse
-  scripts/update_version.sh 0.1.2 0.2.3
-EOF
-    exit 1
-fi
-
-# sanity check on current dir
-if [ `basename "$PWD"` != "eclipse" ]; then
-    echo "Please run this from sdk/eclipse."
-    exit 1
-fi
-
-# sanity check the new version number
-if [[ "$NEW" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
-  echo "## Version $NEW: seems valid."
-else
-  echo "## Version $NEW: does not conform to major.mino.micro format."
-  exit 1
-fi
-
-function replace() {
-  if [[ -f "$1" ]]; then
-    echo "### Change $SED_OLD => $SED_NEW in $1"
-    if [[ $(uname) == "Linux" ]]; then
-      sed -i  "s/$SED_OLD/$SED_NEW/g" "$1"
-    else
-      # sed on Mac doesn't handle -i the same way as on Linux
-      sed -i ""  "s/$SED_OLD/$SED_NEW/g" "$1"
-    fi
-  fi
-}
-
-# ---1--- Change Eclipse's qualified version numbers
-# quote dots for regexps
-SED_OLD="${OLD//./\.}\.qualifier"
-SED_NEW="${NEW//./\.}\.qualifier"
-
-for i in $(grep -rl "$OLD" * | grep -E "\.xml$|\.MF$|\.product$"); do
-  if [[ -f "$i" && $(basename "$i") != "build.xml" ]]; then
-    replace "$i"
-  fi
-done
-
-# ---2--- Change unqualified version numbers in specific files
-SED_OLD="${OLD//./\.}"
-SED_NEW="${NEW//./\.}"
-for i in artifacts/*/pom.xml \
-         monitor/build.gradle \
-         plugins/com.android.ide.eclipse.adt.package/ide.product   \
-         plugins/com.android.ide.eclipse.monitor/monitor.product   \
-         plugins/com.android.ide.eclipse.monitor/plugin.properties \
-         plugins/com.android.ide.eclipse.*/pom.xml \
-         features/com.android.ide.eclipse.*/pom.xml \
-         features/com.android.ide.eclipse.adt.package/feature.xml ; do
-  if grep -qs "$OLD" "$i"; then
-    replace "$i"
-  fi
-done
-
-# do another grep for older version without the qualifier. We don't
-# want to replace those automatically as it could be something else.
-# Printing out occurence helps find ones to update manually, but exclude
-# some known useless files.
-echo
-echo "#### ----------------"
-echo "#### Remaining instances of $OLD"
-echo
-grep -r "$OLD" * | grep -v -E "/build.xml:|/javaCompiler\.\.\.args:"
-
diff --git a/eclipse/settings.xml b/eclipse/settings.xml
deleted file mode 100644
index e5e53b2..0000000
--- a/eclipse/settings.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Run as: mvn -s /path/to/settings.xml -->
-<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
-          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-          xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">
-  <localRepository>../../prebuilts/eclipse/mavenplugins/tycho/tycho-dependencies-m2repo/</localRepository>
-  <offline>true</offline>
-</settings>
diff --git a/eclipse/sites/external/.gitignore b/eclipse/sites/external/.gitignore
deleted file mode 100644
index ccfee1d..0000000
--- a/eclipse/sites/external/.gitignore
+++ /dev/null
@@ -1,2 +0,0 @@
-*.jar
-*/*.jar
\ No newline at end of file
diff --git a/eclipse/sites/external/.project b/eclipse/sites/external/.project
deleted file mode 100644
index 3a6f889..0000000
--- a/eclipse/sites/external/.project
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>site-external</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.pde.UpdateSiteBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.UpdateSiteNature</nature>
-	</natures>
-</projectDescription>
diff --git a/eclipse/sites/external/index.html b/eclipse/sites/external/index.html
deleted file mode 100644
index 784be4b..0000000
--- a/eclipse/sites/external/index.html
+++ /dev/null
@@ -1,60 +0,0 @@
-<html>
-<head>
-<title>Android Development Toolkit update site.</title>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<style>@import url("web/site.css");</style>
-<script type="text/javascript">
-	var returnval = 0;
-	var stylesheet, xmlFile, cache, doc;
-	function init(){
-		// NSCP 7.1+ / Mozilla 1.4.1+ / Safari
-		// Use the standard DOM Level 2 technique, if it is supported
-		if (document.implementation && document.implementation.createDocument) {
-			xmlFile = document.implementation.createDocument("", "", null);
-			stylesheet = document.implementation.createDocument("", "", null);
-			if (xmlFile.load){
-				xmlFile.load("site.xml");
-				stylesheet.load("web/site.xsl");
-			} else {
-				alert("Document could not be loaded by browser.");
-			}
-			xmlFile.addEventListener("load", transform, false);
-			stylesheet.addEventListener("load", transform, false);
-		}
-		//IE 6.0+ solution
-		else if (window.ActiveXObject) {
-			xmlFile = new ActiveXObject("msxml2.DOMDocument.3.0");
-			xmlFile.async = false;
-			xmlFile.load("site.xml");
-			stylesheet = new ActiveXObject("msxml2.FreeThreadedDOMDocument.3.0");
-			stylesheet.async = false;
-			stylesheet.load("web/site.xsl");
-			cache = new ActiveXObject("msxml2.XSLTemplate.3.0");
-			cache.stylesheet = stylesheet;
-			transformData();
-		}
-	}
-	// separate transformation function for IE 6.0+
-	function transformData(){
-		var processor = cache.createProcessor();
-		processor.input = xmlFile;
-		processor.transform();
-		data.innerHTML = processor.output;
-	}
-	// separate transformation function for NSCP 7.1+ and Mozilla 1.4.1+
-	function transform(){
-		returnval+=1;
-		if (returnval==2){
-			var processor = new XSLTProcessor();
-			processor.importStylesheet(stylesheet);
-			doc = processor.transformToDocument(xmlFile);
-			document.getElementById("data").innerHTML = doc.documentElement.innerHTML;
-		}
-	}
-</script>
-</head>
-<body onload="init();">
-<!--[insert static HTML here]-->
-<div id="data"><!-- this is where the transformed data goes --></div>
-</body>
-</html>
diff --git a/eclipse/sites/external/site.xml b/eclipse/sites/external/site.xml
deleted file mode 100644
index f16898c..0000000
--- a/eclipse/sites/external/site.xml
+++ /dev/null
@@ -1,34 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<site>
-   <description url="https://dl-ssl.google.com/android/eclipse/">
-      Update Site for Android Development Toolkit
-   </description>
-   <feature url="features/com.android.ide.eclipse.adt_24.3.3.qualifier.jar" id="com.android.ide.eclipse.adt" version="24.3.3.qualifier">
-      <category name="developer"/>
-   </feature>
-   <feature url="features/com.android.ide.eclipse.ddms_24.3.3.qualifier.jar" id="com.android.ide.eclipse.ddms" version="24.3.3.qualifier">
-      <category name="developer"/>
-   </feature>
-   <feature url="features/com.android.ide.eclipse.hierarchyviewer_24.3.3.qualifier.jar" id="com.android.ide.eclipse.hierarchyviewer" version="24.3.3.qualifier">
-      <category name="developer"/>
-   </feature>
-   <feature url="features/com.android.ide.eclipse.traceview_24.3.3.qualifier.jar" id="com.android.ide.eclipse.traceview" version="24.3.3.qualifier">
-      <category name="developer"/>
-   </feature>
-   <feature url="features/com.android.ide.eclipse.gldebugger_24.3.3.qualifier.jar" id="com.android.ide.eclipse.gldebugger" version="24.3.3.qualifier">
-      <category name="developer"/>
-   </feature>
-   <feature url="features/com.android.ide.eclipse.ndk_24.3.3.qualifier.jar" id="com.android.ide.eclipse.ndk" version="24.3.3.qualifier">
-      <category name="ndk"/>
-   </feature>
-   <category-def name="developer" label="Developer Tools">
-      <description>
-         Features that add Android support to Eclipse for application developers.
-      </description>
-   </category-def>
-   <category-def name="ndk" label="NDK Plugins">
-      <description>
-         Support for NDK build and debug in Eclipse.
-      </description>
-   </category-def>
-</site>
diff --git a/eclipse/sites/external/web/site.css b/eclipse/sites/external/web/site.css
deleted file mode 100644
index 62c6f9f..0000000
--- a/eclipse/sites/external/web/site.css
+++ /dev/null
@@ -1,12 +0,0 @@
-<STYLE type="text/css">
-td.spacer {padding-bottom: 10px; padding-top: 10px;}
-.title { font-family: sans-serif; color: #99AACC;}
-.bodyText { font-family: sans-serif; font-size: 9pt; color:#000000;  }
-.sub-header { font-family: sans-serif; font-style: normal; font-weight: bold; font-size: 9pt; color: white;}
-.log-text {font-family: sans-serif; font-style: normal; font-weight: lighter; font-size: 8pt; color:black;}
-.big-header { font-family: sans-serif; font-style: normal; font-weight: bold; font-size: 9pt; color: white; border-top:10px solid white;}
-.light-row {background:#FFFFFF}
-.dark-row {background:#EEEEFF}
-.header {background:#99AADD}
-#indent {word-wrap : break-word;width :300px;text-indent:10px;}
-</STYLE>
diff --git a/eclipse/sites/external/web/site.xsl b/eclipse/sites/external/web/site.xsl
deleted file mode 100644
index a94157d..0000000
--- a/eclipse/sites/external/web/site.xsl
+++ /dev/null
@@ -1,214 +0,0 @@
-<xsl:stylesheet version = '1.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform' xmlns:msxsl="urn:schemas-microsoft-com:xslt">
-<xsl:output method="html" encoding="UTF-8"/>
-<xsl:key name="cat" match="category" use="@name"/>
-<xsl:template match="/">
-<xsl:for-each select="site">
-	<html>
-	<head>
-	<title>update-site</title>
-	<style>@import url("web/site.css");</style>
-	</head>
-	<body>
-	<h1 class="title">update-site</h1>
-	<p class="bodyText"><xsl:value-of select="description"/></p>
-	<table width="100%" border="0" cellspacing="1" cellpadding="2">
-	<xsl:for-each select="category-def">
-		<xsl:sort select="@label" order="ascending" case-order="upper-first"/>
-		<xsl:sort select="@name" order="ascending" case-order="upper-first"/>
-	<xsl:if test="count(key('cat',@name)) != 0">
-			<tr class="header">
-				<td class="sub-header" width="30%">
-					<xsl:value-of select="@name"/>
-				</td>
-				<td class="sub-header" width="70%">
-					<xsl:value-of select="@label"/>
-				</td>
-			</tr>
-			<xsl:for-each select="key('cat',@name)">
-			<xsl:sort select="ancestor::feature//@version" order="ascending"/>
-			<xsl:sort select="ancestor::feature//@id" order="ascending" case-order="upper-first"/>
-			<tr>
-				<xsl:choose>
-				<xsl:when test="(position() mod 2 = 1)">
-					<xsl:attribute name="class">dark-row</xsl:attribute>
-				</xsl:when>
-				<xsl:otherwise>
-					<xsl:attribute name="class">light-row</xsl:attribute>
-				</xsl:otherwise>
-				</xsl:choose>
-				<td class="log-text" id="indent">
-						<xsl:choose>
-						<xsl:when test="ancestor::feature//@label">
-							<a href="{ancestor::feature//@url}"><xsl:value-of select="ancestor::feature//@label"/></a>
-							<br/>
-							<div id="indent">
-							(<xsl:value-of select="ancestor::feature//@id"/> - <xsl:value-of select="ancestor::feature//@version"/>)
-							</div>
-						</xsl:when>
-						<xsl:otherwise>
-						<a href="{ancestor::feature//@url}"><xsl:value-of select="ancestor::feature//@id"/> - <xsl:value-of select="ancestor::feature//@version"/></a>
-						</xsl:otherwise>
-						</xsl:choose>
-						<br />
-				</td>
-				<td>
-					<table>
-						<xsl:if test="ancestor::feature//@os">
-							<tr><td class="log-text" id="indent">Operating Systems:</td>
-							<td class="log-text" id="indent"><xsl:value-of select="ancestor::feature//@os"/></td>
-							</tr>
-						</xsl:if>
-						<xsl:if test="ancestor::feature//@ws">
-							<tr><td class="log-text" id="indent">Windows Systems:</td>
-							<td class="log-text" id="indent"><xsl:value-of select="ancestor::feature//@ws"/></td>
-							</tr>
-						</xsl:if>
-						<xsl:if test="ancestor::feature//@nl">
-							<tr><td class="log-text" id="indent">Languages:</td>
-							<td class="log-text" id="indent"><xsl:value-of select="ancestor::feature//@nl"/></td>
-							</tr>
-						</xsl:if>
-						<xsl:if test="ancestor::feature//@arch">
-							<tr><td class="log-text" id="indent">Architecture:</td>
-							<td class="log-text" id="indent"><xsl:value-of select="ancestor::feature//@arch"/></td>
-							</tr>
-						</xsl:if>
-					</table>
-				</td>
-			</tr>
-			</xsl:for-each>
-			<tr><td class="spacer"><br/></td><td class="spacer"><br/></td></tr>
-		</xsl:if>
-	</xsl:for-each>
-	<xsl:if test="count(feature)  &gt; count(feature/category)">
-	<tr class="header">
-		<td class="sub-header" colspan="2">
-		Uncategorized
-		</td>
-	</tr>
-	</xsl:if>
-	<xsl:choose>
-	<xsl:when test="function-available('msxsl:node-set')">
-	   <xsl:variable name="rtf-nodes">
-		<xsl:for-each select="feature[not(category)]">
-			<xsl:sort select="@id" order="ascending" case-order="upper-first"/>
-			<xsl:sort select="@version" order="ascending" />
-			<xsl:value-of select="."/>
-			<xsl:copy-of select="." />
-		</xsl:for-each>
-	   </xsl:variable>
-	   <xsl:variable name="myNodeSet" select="msxsl:node-set($rtf-nodes)/*"/>
-	<xsl:for-each select="$myNodeSet">
-	<tr>
-		<xsl:choose>
-		<xsl:when test="position() mod 2 = 1">
-		<xsl:attribute name="class">dark-row</xsl:attribute>
-		</xsl:when>
-		<xsl:otherwise>
-		<xsl:attribute name="class">light-row</xsl:attribute>
-		</xsl:otherwise>
-		</xsl:choose>
-		<td class="log-text" id="indent">
-			<xsl:choose>
-			<xsl:when test="@label">
-				<a href="{@url}"><xsl:value-of select="@label"/></a>
-				<br />
-				<div id="indent">
-				(<xsl:value-of select="@id"/> - <xsl:value-of select="@version"/>)
-				</div>
-			</xsl:when>
-			<xsl:otherwise>
-				<a href="{@url}"><xsl:value-of select="@id"/> - <xsl:value-of select="@version"/></a>
-			</xsl:otherwise>
-			</xsl:choose>
-			<br /><br />
-		</td>
-		<td>
-			<table>
-				<xsl:if test="@os">
-					<tr><td class="log-text" id="indent">Operating Systems:</td>
-					<td class="log-text" id="indent"><xsl:value-of select="@os"/></td>
-					</tr>
-				</xsl:if>
-				<xsl:if test="@ws">
-					<tr><td class="log-text" id="indent">Windows Systems:</td>
-					<td class="log-text" id="indent"><xsl:value-of select="@ws"/></td>
-					</tr>
-				</xsl:if>
-				<xsl:if test="@nl">
-					<tr><td class="log-text" id="indent">Languages:</td>
-					<td class="log-text" id="indent"><xsl:value-of select="@nl"/></td>
-					</tr>
-				</xsl:if>
-				<xsl:if test="@arch">
-					<tr><td class="log-text" id="indent">Architecture:</td>
-					<td class="log-text" id="indent"><xsl:value-of select="@arch"/></td>
-					</tr>
-				</xsl:if>
-			</table>
-		</td>
-	</tr>
-	</xsl:for-each>
-	</xsl:when>
-	<xsl:otherwise>
-	<xsl:for-each select="feature[not(category)]">
-	<xsl:sort select="@id" order="ascending" case-order="upper-first"/>
-	<xsl:sort select="@version" order="ascending" />
-	<tr>
-		<xsl:choose>
-		<xsl:when test="count(preceding-sibling::feature[not(category)]) mod 2 = 1">
-		<xsl:attribute name="class">dark-row</xsl:attribute>
-		</xsl:when>
-		<xsl:otherwise>
-		<xsl:attribute name="class">light-row</xsl:attribute>
-		</xsl:otherwise>
-		</xsl:choose>
-		<td class="log-text" id="indent">
-			<xsl:choose>
-			<xsl:when test="@label">
-				<a href="{@url}"><xsl:value-of select="@label"/></a>
-				<br />
-				<div id="indent">
-				(<xsl:value-of select="@id"/> - <xsl:value-of select="@version"/>)
-				</div>
-			</xsl:when>
-			<xsl:otherwise>
-				<a href="{@url}"><xsl:value-of select="@id"/> - <xsl:value-of select="@version"/></a>
-			</xsl:otherwise>
-			</xsl:choose>
-			<br /><br />
-		</td>
-		<td>
-			<table>
-				<xsl:if test="@os">
-					<tr><td class="log-text" id="indent">Operating Systems:</td>
-					<td class="log-text" id="indent"><xsl:value-of select="@os"/></td>
-					</tr>
-				</xsl:if>
-				<xsl:if test="@ws">
-					<tr><td class="log-text" id="indent">Windows Systems:</td>
-					<td class="log-text" id="indent"><xsl:value-of select="@ws"/></td>
-					</tr>
-				</xsl:if>
-				<xsl:if test="@nl">
-					<tr><td class="log-text" id="indent">Languages:</td>
-					<td class="log-text" id="indent"><xsl:value-of select="@nl"/></td>
-					</tr>
-				</xsl:if>
-				<xsl:if test="@arch">
-					<tr><td class="log-text" id="indent">Architecture:</td>
-					<td class="log-text" id="indent"><xsl:value-of select="@arch"/></td>
-					</tr>
-				</xsl:if>
-			</table>
-		</td>
-	</tr>
-	</xsl:for-each>
-	</xsl:otherwise>
-	</xsl:choose>
-	</table>
-	</body>
-	</html>
-</xsl:for-each>
-</xsl:template>
-</xsl:stylesheet>
diff --git a/eclipse/sites/internal/.gitignore b/eclipse/sites/internal/.gitignore
deleted file mode 100644
index ccfee1d..0000000
--- a/eclipse/sites/internal/.gitignore
+++ /dev/null
@@ -1,2 +0,0 @@
-*.jar
-*/*.jar
\ No newline at end of file
diff --git a/eclipse/sites/internal/.project b/eclipse/sites/internal/.project
deleted file mode 100644
index d1ef73b..0000000
--- a/eclipse/sites/internal/.project
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>site-internal</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.pde.UpdateSiteBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.UpdateSiteNature</nature>
-	</natures>
-</projectDescription>
diff --git a/eclipse/sites/internal/index.html b/eclipse/sites/internal/index.html
deleted file mode 100644
index 784be4b..0000000
--- a/eclipse/sites/internal/index.html
+++ /dev/null
@@ -1,60 +0,0 @@
-<html>
-<head>
-<title>Android Development Toolkit update site.</title>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<style>@import url("web/site.css");</style>
-<script type="text/javascript">
-	var returnval = 0;
-	var stylesheet, xmlFile, cache, doc;
-	function init(){
-		// NSCP 7.1+ / Mozilla 1.4.1+ / Safari
-		// Use the standard DOM Level 2 technique, if it is supported
-		if (document.implementation && document.implementation.createDocument) {
-			xmlFile = document.implementation.createDocument("", "", null);
-			stylesheet = document.implementation.createDocument("", "", null);
-			if (xmlFile.load){
-				xmlFile.load("site.xml");
-				stylesheet.load("web/site.xsl");
-			} else {
-				alert("Document could not be loaded by browser.");
-			}
-			xmlFile.addEventListener("load", transform, false);
-			stylesheet.addEventListener("load", transform, false);
-		}
-		//IE 6.0+ solution
-		else if (window.ActiveXObject) {
-			xmlFile = new ActiveXObject("msxml2.DOMDocument.3.0");
-			xmlFile.async = false;
-			xmlFile.load("site.xml");
-			stylesheet = new ActiveXObject("msxml2.FreeThreadedDOMDocument.3.0");
-			stylesheet.async = false;
-			stylesheet.load("web/site.xsl");
-			cache = new ActiveXObject("msxml2.XSLTemplate.3.0");
-			cache.stylesheet = stylesheet;
-			transformData();
-		}
-	}
-	// separate transformation function for IE 6.0+
-	function transformData(){
-		var processor = cache.createProcessor();
-		processor.input = xmlFile;
-		processor.transform();
-		data.innerHTML = processor.output;
-	}
-	// separate transformation function for NSCP 7.1+ and Mozilla 1.4.1+
-	function transform(){
-		returnval+=1;
-		if (returnval==2){
-			var processor = new XSLTProcessor();
-			processor.importStylesheet(stylesheet);
-			doc = processor.transformToDocument(xmlFile);
-			document.getElementById("data").innerHTML = doc.documentElement.innerHTML;
-		}
-	}
-</script>
-</head>
-<body onload="init();">
-<!--[insert static HTML here]-->
-<div id="data"><!-- this is where the transformed data goes --></div>
-</body>
-</html>
diff --git a/eclipse/sites/internal/site.xml b/eclipse/sites/internal/site.xml
deleted file mode 100644
index d5cb3fd..0000000
--- a/eclipse/sites/internal/site.xml
+++ /dev/null
@@ -1,50 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<site>
-   <description url="https://android.corp.google.com/adt/">
-      Update Site for Android Development Toolkit
-   </description>
-   <feature url="features/com.android.ide.eclipse.adt_24.3.3.qualifier.jar" id="com.android.ide.eclipse.adt" version="24.3.3.qualifier">
-      <category name="developer"/>
-   </feature>
-   <feature url="features/com.android.ide.eclipse.ddms_24.3.3.qualifier.jar" id="com.android.ide.eclipse.ddms" version="24.3.3.qualifier">
-      <category name="developer"/>
-      <category name="platform"/>
-   </feature>
-   <feature url="features/com.android.ide.eclipse.hierarchyviewer_24.3.3.qualifier.jar" id="com.android.ide.eclipse.hierarchyviewer" version="24.3.3.qualifier">
-      <category name="developer"/>
-      <category name="platform"/>
-   </feature>
-   <feature url="features/com.android.ide.eclipse.tests_24.3.3.qualifier.jar" id="com.android.ide.eclipse.tests" version="24.3.3.qualifier">
-      <category name="test"/>
-   </feature>
-   <feature url="features/com.android.ide.eclipse.pdt_24.3.3.qualifier.jar" id="com.android.ide.eclipse.pdt" version="24.3.3.qualifier">
-      <category name="platform"/>
-   </feature>
-   <feature url="features/com.android.ide.eclipse.traceview_24.3.3.qualifier.jar" id="com.android.ide.eclipse.traceview" version="24.3.3.qualifier">
-      <category name="developer"/>
-      <category name="platform"/>
-   </feature>
-   <feature url="features/com.android.ide.eclipse.gldebugger_24.3.3.qualifier.jar" id="com.android.ide.eclipse.gldebugger" version="24.3.3.qualifier">
-      <category name="developer"/>
-      <category name="platform"/>
-   </feature>
-   <feature url="features/com.android.ide.eclipse.ndk_24.3.3.qualifier.jar" id="com.android.ide.eclipse.ndk" version="24.3.3.qualifier">
-      <category name="developer"/>
-      <category name="platform"/>
-   </feature>
-   <category-def name="developer" label="Application Developer Tools">
-      <description>
-         Features that add Android support to Eclipse for application developers.
-      </description>
-   </category-def>
-   <category-def name="test" label="Plugin Developer Tests">
-      <description>
-         Tests for the other Android plugins
-      </description>
-   </category-def>
-   <category-def name="platform" label="Platform Tools">
-      <description>
-         Features that add Android support to Eclipse for platform developers.
-      </description>
-   </category-def>
-</site>
diff --git a/eclipse/sites/internal/web/site.css b/eclipse/sites/internal/web/site.css
deleted file mode 100644
index 62c6f9f..0000000
--- a/eclipse/sites/internal/web/site.css
+++ /dev/null
@@ -1,12 +0,0 @@
-<STYLE type="text/css">
-td.spacer {padding-bottom: 10px; padding-top: 10px;}
-.title { font-family: sans-serif; color: #99AACC;}
-.bodyText { font-family: sans-serif; font-size: 9pt; color:#000000;  }
-.sub-header { font-family: sans-serif; font-style: normal; font-weight: bold; font-size: 9pt; color: white;}
-.log-text {font-family: sans-serif; font-style: normal; font-weight: lighter; font-size: 8pt; color:black;}
-.big-header { font-family: sans-serif; font-style: normal; font-weight: bold; font-size: 9pt; color: white; border-top:10px solid white;}
-.light-row {background:#FFFFFF}
-.dark-row {background:#EEEEFF}
-.header {background:#99AADD}
-#indent {word-wrap : break-word;width :300px;text-indent:10px;}
-</STYLE>
diff --git a/eclipse/sites/internal/web/site.xsl b/eclipse/sites/internal/web/site.xsl
deleted file mode 100644
index a94157d..0000000
--- a/eclipse/sites/internal/web/site.xsl
+++ /dev/null
@@ -1,214 +0,0 @@
-<xsl:stylesheet version = '1.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform' xmlns:msxsl="urn:schemas-microsoft-com:xslt">
-<xsl:output method="html" encoding="UTF-8"/>
-<xsl:key name="cat" match="category" use="@name"/>
-<xsl:template match="/">
-<xsl:for-each select="site">
-	<html>
-	<head>
-	<title>update-site</title>
-	<style>@import url("web/site.css");</style>
-	</head>
-	<body>
-	<h1 class="title">update-site</h1>
-	<p class="bodyText"><xsl:value-of select="description"/></p>
-	<table width="100%" border="0" cellspacing="1" cellpadding="2">
-	<xsl:for-each select="category-def">
-		<xsl:sort select="@label" order="ascending" case-order="upper-first"/>
-		<xsl:sort select="@name" order="ascending" case-order="upper-first"/>
-	<xsl:if test="count(key('cat',@name)) != 0">
-			<tr class="header">
-				<td class="sub-header" width="30%">
-					<xsl:value-of select="@name"/>
-				</td>
-				<td class="sub-header" width="70%">
-					<xsl:value-of select="@label"/>
-				</td>
-			</tr>
-			<xsl:for-each select="key('cat',@name)">
-			<xsl:sort select="ancestor::feature//@version" order="ascending"/>
-			<xsl:sort select="ancestor::feature//@id" order="ascending" case-order="upper-first"/>
-			<tr>
-				<xsl:choose>
-				<xsl:when test="(position() mod 2 = 1)">
-					<xsl:attribute name="class">dark-row</xsl:attribute>
-				</xsl:when>
-				<xsl:otherwise>
-					<xsl:attribute name="class">light-row</xsl:attribute>
-				</xsl:otherwise>
-				</xsl:choose>
-				<td class="log-text" id="indent">
-						<xsl:choose>
-						<xsl:when test="ancestor::feature//@label">
-							<a href="{ancestor::feature//@url}"><xsl:value-of select="ancestor::feature//@label"/></a>
-							<br/>
-							<div id="indent">
-							(<xsl:value-of select="ancestor::feature//@id"/> - <xsl:value-of select="ancestor::feature//@version"/>)
-							</div>
-						</xsl:when>
-						<xsl:otherwise>
-						<a href="{ancestor::feature//@url}"><xsl:value-of select="ancestor::feature//@id"/> - <xsl:value-of select="ancestor::feature//@version"/></a>
-						</xsl:otherwise>
-						</xsl:choose>
-						<br />
-				</td>
-				<td>
-					<table>
-						<xsl:if test="ancestor::feature//@os">
-							<tr><td class="log-text" id="indent">Operating Systems:</td>
-							<td class="log-text" id="indent"><xsl:value-of select="ancestor::feature//@os"/></td>
-							</tr>
-						</xsl:if>
-						<xsl:if test="ancestor::feature//@ws">
-							<tr><td class="log-text" id="indent">Windows Systems:</td>
-							<td class="log-text" id="indent"><xsl:value-of select="ancestor::feature//@ws"/></td>
-							</tr>
-						</xsl:if>
-						<xsl:if test="ancestor::feature//@nl">
-							<tr><td class="log-text" id="indent">Languages:</td>
-							<td class="log-text" id="indent"><xsl:value-of select="ancestor::feature//@nl"/></td>
-							</tr>
-						</xsl:if>
-						<xsl:if test="ancestor::feature//@arch">
-							<tr><td class="log-text" id="indent">Architecture:</td>
-							<td class="log-text" id="indent"><xsl:value-of select="ancestor::feature//@arch"/></td>
-							</tr>
-						</xsl:if>
-					</table>
-				</td>
-			</tr>
-			</xsl:for-each>
-			<tr><td class="spacer"><br/></td><td class="spacer"><br/></td></tr>
-		</xsl:if>
-	</xsl:for-each>
-	<xsl:if test="count(feature)  &gt; count(feature/category)">
-	<tr class="header">
-		<td class="sub-header" colspan="2">
-		Uncategorized
-		</td>
-	</tr>
-	</xsl:if>
-	<xsl:choose>
-	<xsl:when test="function-available('msxsl:node-set')">
-	   <xsl:variable name="rtf-nodes">
-		<xsl:for-each select="feature[not(category)]">
-			<xsl:sort select="@id" order="ascending" case-order="upper-first"/>
-			<xsl:sort select="@version" order="ascending" />
-			<xsl:value-of select="."/>
-			<xsl:copy-of select="." />
-		</xsl:for-each>
-	   </xsl:variable>
-	   <xsl:variable name="myNodeSet" select="msxsl:node-set($rtf-nodes)/*"/>
-	<xsl:for-each select="$myNodeSet">
-	<tr>
-		<xsl:choose>
-		<xsl:when test="position() mod 2 = 1">
-		<xsl:attribute name="class">dark-row</xsl:attribute>
-		</xsl:when>
-		<xsl:otherwise>
-		<xsl:attribute name="class">light-row</xsl:attribute>
-		</xsl:otherwise>
-		</xsl:choose>
-		<td class="log-text" id="indent">
-			<xsl:choose>
-			<xsl:when test="@label">
-				<a href="{@url}"><xsl:value-of select="@label"/></a>
-				<br />
-				<div id="indent">
-				(<xsl:value-of select="@id"/> - <xsl:value-of select="@version"/>)
-				</div>
-			</xsl:when>
-			<xsl:otherwise>
-				<a href="{@url}"><xsl:value-of select="@id"/> - <xsl:value-of select="@version"/></a>
-			</xsl:otherwise>
-			</xsl:choose>
-			<br /><br />
-		</td>
-		<td>
-			<table>
-				<xsl:if test="@os">
-					<tr><td class="log-text" id="indent">Operating Systems:</td>
-					<td class="log-text" id="indent"><xsl:value-of select="@os"/></td>
-					</tr>
-				</xsl:if>
-				<xsl:if test="@ws">
-					<tr><td class="log-text" id="indent">Windows Systems:</td>
-					<td class="log-text" id="indent"><xsl:value-of select="@ws"/></td>
-					</tr>
-				</xsl:if>
-				<xsl:if test="@nl">
-					<tr><td class="log-text" id="indent">Languages:</td>
-					<td class="log-text" id="indent"><xsl:value-of select="@nl"/></td>
-					</tr>
-				</xsl:if>
-				<xsl:if test="@arch">
-					<tr><td class="log-text" id="indent">Architecture:</td>
-					<td class="log-text" id="indent"><xsl:value-of select="@arch"/></td>
-					</tr>
-				</xsl:if>
-			</table>
-		</td>
-	</tr>
-	</xsl:for-each>
-	</xsl:when>
-	<xsl:otherwise>
-	<xsl:for-each select="feature[not(category)]">
-	<xsl:sort select="@id" order="ascending" case-order="upper-first"/>
-	<xsl:sort select="@version" order="ascending" />
-	<tr>
-		<xsl:choose>
-		<xsl:when test="count(preceding-sibling::feature[not(category)]) mod 2 = 1">
-		<xsl:attribute name="class">dark-row</xsl:attribute>
-		</xsl:when>
-		<xsl:otherwise>
-		<xsl:attribute name="class">light-row</xsl:attribute>
-		</xsl:otherwise>
-		</xsl:choose>
-		<td class="log-text" id="indent">
-			<xsl:choose>
-			<xsl:when test="@label">
-				<a href="{@url}"><xsl:value-of select="@label"/></a>
-				<br />
-				<div id="indent">
-				(<xsl:value-of select="@id"/> - <xsl:value-of select="@version"/>)
-				</div>
-			</xsl:when>
-			<xsl:otherwise>
-				<a href="{@url}"><xsl:value-of select="@id"/> - <xsl:value-of select="@version"/></a>
-			</xsl:otherwise>
-			</xsl:choose>
-			<br /><br />
-		</td>
-		<td>
-			<table>
-				<xsl:if test="@os">
-					<tr><td class="log-text" id="indent">Operating Systems:</td>
-					<td class="log-text" id="indent"><xsl:value-of select="@os"/></td>
-					</tr>
-				</xsl:if>
-				<xsl:if test="@ws">
-					<tr><td class="log-text" id="indent">Windows Systems:</td>
-					<td class="log-text" id="indent"><xsl:value-of select="@ws"/></td>
-					</tr>
-				</xsl:if>
-				<xsl:if test="@nl">
-					<tr><td class="log-text" id="indent">Languages:</td>
-					<td class="log-text" id="indent"><xsl:value-of select="@nl"/></td>
-					</tr>
-				</xsl:if>
-				<xsl:if test="@arch">
-					<tr><td class="log-text" id="indent">Architecture:</td>
-					<td class="log-text" id="indent"><xsl:value-of select="@arch"/></td>
-					</tr>
-				</xsl:if>
-			</table>
-		</td>
-	</tr>
-	</xsl:for-each>
-	</xsl:otherwise>
-	</xsl:choose>
-	</table>
-	</body>
-	</html>
-</xsl:for-each>
-</xsl:template>
-</xsl:stylesheet>
diff --git a/emulator/NOTICE b/emulator/NOTICE
deleted file mode 100644
index 06a9081..0000000
--- a/emulator/NOTICE
+++ /dev/null
@@ -1,190 +0,0 @@
-
-   Copyright (c) 2005-2014, The Android Open Source Project
-
-   Licensed under the Apache License, Version 2.0 (the "License");
-   you may not use this file except in compliance with the License.
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
-
-
-                                 Apache License
-                           Version 2.0, January 2004
-                        http://www.apache.org/licenses/
-
-   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
-   1. Definitions.
-
-      "License" shall mean the terms and conditions for use, reproduction,
-      and distribution as defined by Sections 1 through 9 of this document.
-
-      "Licensor" shall mean the copyright owner or entity authorized by
-      the copyright owner that is granting the License.
-
-      "Legal Entity" shall mean the union of the acting entity and all
-      other entities that control, are controlled by, or are under common
-      control with that entity. For the purposes of this definition,
-      "control" means (i) the power, direct or indirect, to cause the
-      direction or management of such entity, whether by contract or
-      otherwise, or (ii) ownership of fifty percent (50%) or more of the
-      outstanding shares, or (iii) beneficial ownership of such entity.
-
-      "You" (or "Your") shall mean an individual or Legal Entity
-      exercising permissions granted by this License.
-
-      "Source" form shall mean the preferred form for making modifications,
-      including but not limited to software source code, documentation
-      source, and configuration files.
-
-      "Object" form shall mean any form resulting from mechanical
-      transformation or translation of a Source form, including but
-      not limited to compiled object code, generated documentation,
-      and conversions to other media types.
-
-      "Work" shall mean the work of authorship, whether in Source or
-      Object form, made available under the License, as indicated by a
-      copyright notice that is included in or attached to the work
-      (an example is provided in the Appendix below).
-
-      "Derivative Works" shall mean any work, whether in Source or Object
-      form, that is based on (or derived from) the Work and for which the
-      editorial revisions, annotations, elaborations, or other modifications
-      represent, as a whole, an original work of authorship. For the purposes
-      of this License, Derivative Works shall not include works that remain
-      separable from, or merely link (or bind by name) to the interfaces of,
-      the Work and Derivative Works thereof.
-
-      "Contribution" shall mean any work of authorship, including
-      the original version of the Work and any modifications or additions
-      to that Work or Derivative Works thereof, that is intentionally
-      submitted to Licensor for inclusion in the Work by the copyright owner
-      or by an individual or Legal Entity authorized to submit on behalf of
-      the copyright owner. For the purposes of this definition, "submitted"
-      means any form of electronic, verbal, or written communication sent
-      to the Licensor or its representatives, including but not limited to
-      communication on electronic mailing lists, source code control systems,
-      and issue tracking systems that are managed by, or on behalf of, the
-      Licensor for the purpose of discussing and improving the Work, but
-      excluding communication that is conspicuously marked or otherwise
-      designated in writing by the copyright owner as "Not a Contribution."
-
-      "Contributor" shall mean Licensor and any individual or Legal Entity
-      on behalf of whom a Contribution has been received by Licensor and
-      subsequently incorporated within the Work.
-
-   2. Grant of Copyright License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      copyright license to reproduce, prepare Derivative Works of,
-      publicly display, publicly perform, sublicense, and distribute the
-      Work and such Derivative Works in Source or Object form.
-
-   3. Grant of Patent License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      (except as stated in this section) patent license to make, have made,
-      use, offer to sell, sell, import, and otherwise transfer the Work,
-      where such license applies only to those patent claims licensable
-      by such Contributor that are necessarily infringed by their
-      Contribution(s) alone or by combination of their Contribution(s)
-      with the Work to which such Contribution(s) was submitted. If You
-      institute patent litigation against any entity (including a
-      cross-claim or counterclaim in a lawsuit) alleging that the Work
-      or a Contribution incorporated within the Work constitutes direct
-      or contributory patent infringement, then any patent licenses
-      granted to You under this License for that Work shall terminate
-      as of the date such litigation is filed.
-
-   4. Redistribution. You may reproduce and distribute copies of the
-      Work or Derivative Works thereof in any medium, with or without
-      modifications, and in Source or Object form, provided that You
-      meet the following conditions:
-
-      (a) You must give any other recipients of the Work or
-          Derivative Works a copy of this License; and
-
-      (b) You must cause any modified files to carry prominent notices
-          stating that You changed the files; and
-
-      (c) You must retain, in the Source form of any Derivative Works
-          that You distribute, all copyright, patent, trademark, and
-          attribution notices from the Source form of the Work,
-          excluding those notices that do not pertain to any part of
-          the Derivative Works; and
-
-      (d) If the Work includes a "NOTICE" text file as part of its
-          distribution, then any Derivative Works that You distribute must
-          include a readable copy of the attribution notices contained
-          within such NOTICE file, excluding those notices that do not
-          pertain to any part of the Derivative Works, in at least one
-          of the following places: within a NOTICE text file distributed
-          as part of the Derivative Works; within the Source form or
-          documentation, if provided along with the Derivative Works; or,
-          within a display generated by the Derivative Works, if and
-          wherever such third-party notices normally appear. The contents
-          of the NOTICE file are for informational purposes only and
-          do not modify the License. You may add Your own attribution
-          notices within Derivative Works that You distribute, alongside
-          or as an addendum to the NOTICE text from the Work, provided
-          that such additional attribution notices cannot be construed
-          as modifying the License.
-
-      You may add Your own copyright statement to Your modifications and
-      may provide additional or different license terms and conditions
-      for use, reproduction, or distribution of Your modifications, or
-      for any such Derivative Works as a whole, provided Your use,
-      reproduction, and distribution of the Work otherwise complies with
-      the conditions stated in this License.
-
-   5. Submission of Contributions. Unless You explicitly state otherwise,
-      any Contribution intentionally submitted for inclusion in the Work
-      by You to the Licensor shall be under the terms and conditions of
-      this License, without any additional terms or conditions.
-      Notwithstanding the above, nothing herein shall supersede or modify
-      the terms of any separate license agreement you may have executed
-      with Licensor regarding such Contributions.
-
-   6. Trademarks. This License does not grant permission to use the trade
-      names, trademarks, service marks, or product names of the Licensor,
-      except as required for reasonable and customary use in describing the
-      origin of the Work and reproducing the content of the NOTICE file.
-
-   7. Disclaimer of Warranty. Unless required by applicable law or
-      agreed to in writing, Licensor provides the Work (and each
-      Contributor provides its Contributions) on an "AS IS" BASIS,
-      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
-      implied, including, without limitation, any warranties or conditions
-      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
-      PARTICULAR PURPOSE. You are solely responsible for determining the
-      appropriateness of using or redistributing the Work and assume any
-      risks associated with Your exercise of permissions under this License.
-
-   8. Limitation of Liability. In no event and under no legal theory,
-      whether in tort (including negligence), contract, or otherwise,
-      unless required by applicable law (such as deliberate and grossly
-      negligent acts) or agreed to in writing, shall any Contributor be
-      liable to You for damages, including any direct, indirect, special,
-      incidental, or consequential damages of any character arising as a
-      result of this License or out of the use or inability to use the
-      Work (including but not limited to damages for loss of goodwill,
-      work stoppage, computer failure or malfunction, or any and all
-      other commercial damages or losses), even if such Contributor
-      has been advised of the possibility of such damages.
-
-   9. Accepting Warranty or Additional Liability. While redistributing
-      the Work or Derivative Works thereof, You may choose to offer,
-      and charge a fee for, acceptance of support, warranty, indemnity,
-      or other liability obligations and/or rights consistent with this
-      License. However, in accepting such obligations, You may act only
-      on Your own behalf and on Your sole responsibility, not on behalf
-      of any other Contributor, and only if You agree to indemnify,
-      defend, and hold each Contributor harmless for any liability
-      incurred by, or claims asserted against, such Contributor by reason
-      of your accepting any such warranty or additional liability.
-
-   END OF TERMS AND CONDITIONS
-
diff --git a/emulator/opengl/README b/emulator/opengl/README
deleted file mode 100644
index 11b10aa..0000000
--- a/emulator/opengl/README
+++ /dev/null
@@ -1,3 +0,0 @@
-The sources in this directory have been moved to:
-
-  external/qemu/distrib/android-emugl
diff --git a/emulator/skins/assets/README.txt b/emulator/skins/assets/README.txt
deleted file mode 100644
index 9311f6c..0000000
--- a/emulator/skins/assets/README.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-The svg files in these folder were used to generate the corresponding
-png images in the 'dynamic' skin folder. Edit these in Inkscape or some
-other SVG editor and just export as png to update the assets.
diff --git a/emulator/skins/assets/basic_controls.png b/emulator/skins/assets/basic_controls.png
deleted file mode 100644
index 69fccc0..0000000
--- a/emulator/skins/assets/basic_controls.png
+++ /dev/null
Binary files differ
diff --git a/emulator/skins/assets/basic_controls.svg b/emulator/skins/assets/basic_controls.svg
deleted file mode 100644
index ca1d912..0000000
--- a/emulator/skins/assets/basic_controls.svg
+++ /dev/null
@@ -1,125 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-
-<svg
-   xmlns:dc="http://purl.org/dc/elements/1.1/"
-   xmlns:cc="http://creativecommons.org/ns#"
-   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-   xmlns:svg="http://www.w3.org/2000/svg"
-   xmlns="http://www.w3.org/2000/svg"
-   xmlns:xlink="http://www.w3.org/1999/xlink"
-   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
-   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
-   width="159"
-   height="54.617188"
-   id="svg2"
-   version="1.1"
-   inkscape:version="0.47 r22583"
-   sodipodi:docname="basic_controls.svg"
-   inkscape:export-filename="basic.png"
-   inkscape:export-xdpi="90"
-   inkscape:export-ydpi="90">
-  <defs
-     id="defs4">
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 526.18109 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="744.09448 : 526.18109 : 1"
-       inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
-       id="perspective10" />
-    <inkscape:perspective
-       id="perspective2904"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_x="0 : 0.5 : 1"
-       sodipodi:type="inkscape:persp3d" />
-    <inkscape:perspective
-       id="perspective2886"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_x="0 : 0.5 : 1"
-       sodipodi:type="inkscape:persp3d" />
-    <inkscape:perspective
-       id="perspective2898"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_x="0 : 0.5 : 1"
-       sodipodi:type="inkscape:persp3d" />
-    <inkscape:perspective
-       id="perspective2887"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_x="0 : 0.5 : 1"
-       sodipodi:type="inkscape:persp3d" />
-  </defs>
-  <sodipodi:namedview
-     id="base"
-     pagecolor="#ffffff"
-     bordercolor="#666666"
-     borderopacity="1.0"
-     inkscape:pageopacity="0.0"
-     inkscape:pageshadow="2"
-     inkscape:zoom="4.4724839"
-     inkscape:cx="138.91446"
-     inkscape:cy="13.828558"
-     inkscape:document-units="px"
-     inkscape:current-layer="layer1"
-     showgrid="true"
-     inkscape:window-width="1438"
-     inkscape:window-height="774"
-     inkscape:window-x="84"
-     inkscape:window-y="123"
-     inkscape:window-maximized="0">
-    <inkscape:grid
-       type="xygrid"
-       id="grid2816"
-       empspacing="5"
-       visible="true"
-       enabled="true"
-       snapvisiblegridlinesonly="true" />
-  </sodipodi:namedview>
-  <metadata
-     id="metadata7">
-    <rdf:RDF>
-      <cc:Work
-         rdf:about="">
-        <dc:format>image/svg+xml</dc:format>
-        <dc:type
-           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
-        <dc:title></dc:title>
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <g
-     inkscape:label="Layer 1"
-     inkscape:groupmode="layer"
-     id="layer1"
-     transform="translate(-25.654297,-779.745)">
-    <text
-       xml:space="preserve"
-       style="font-size:14px;font-style:normal;font-weight:normal;line-height:125%;fill:#bbbbbb;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
-       x="25"
-       y="787.36218"
-       id="text2910"
-       sodipodi:linespacing="125%"
-       inkscape:export-xdpi="90"
-       inkscape:export-ydpi="90"><tspan
-         sodipodi:role="line"
-         id="tspan2912"
-         x="25"
-         y="787.36218"
-         style="font-size:10px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#bbbbbb;fill-opacity:1;font-family:Roboto;-inkscape-font-specification:Roboto Medium">Basic Controls </tspan></text>
-    <image
-       y="792.36218"
-       x="30.654297"
-       id="image2889"
-       height="42"
-       width="154"
-       xlink:href="basic_controls.png" />
-  </g>
-</svg>
diff --git a/emulator/skins/assets/dpad.png b/emulator/skins/assets/dpad.png
deleted file mode 100644
index db4dd60..0000000
--- a/emulator/skins/assets/dpad.png
+++ /dev/null
Binary files differ
diff --git a/emulator/skins/assets/dpad_off.svg b/emulator/skins/assets/dpad_off.svg
deleted file mode 100644
index 3eea70e..0000000
--- a/emulator/skins/assets/dpad_off.svg
+++ /dev/null
@@ -1,109 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-
-<svg
-   xmlns:dc="http://purl.org/dc/elements/1.1/"
-   xmlns:cc="http://creativecommons.org/ns#"
-   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-   xmlns:svg="http://www.w3.org/2000/svg"
-   xmlns="http://www.w3.org/2000/svg"
-   xmlns:xlink="http://www.w3.org/1999/xlink"
-   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
-   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
-   width="111.48926"
-   height="90.617188"
-   id="svg2"
-   version="1.1"
-   inkscape:version="0.47 r22583"
-   sodipodi:docname="dpad_off.svg"
-   inkscape:export-filename="dpad_off.png"
-   inkscape:export-xdpi="90"
-   inkscape:export-ydpi="90">
-  <defs
-     id="defs4">
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 526.18109 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="744.09448 : 526.18109 : 1"
-       inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
-       id="perspective10" />
-    <inkscape:perspective
-       id="perspective2904"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_x="0 : 0.5 : 1"
-       sodipodi:type="inkscape:persp3d" />
-  </defs>
-  <sodipodi:namedview
-     id="base"
-     pagecolor="#ffffff"
-     bordercolor="#666666"
-     borderopacity="1.0"
-     inkscape:pageopacity="0.0"
-     inkscape:pageshadow="2"
-     inkscape:zoom="4.4724839"
-     inkscape:cx="138.91446"
-     inkscape:cy="38.761468"
-     inkscape:document-units="px"
-     inkscape:current-layer="layer1"
-     showgrid="true"
-     inkscape:window-width="1570"
-     inkscape:window-height="1089"
-     inkscape:window-x="436"
-     inkscape:window-y="347"
-     inkscape:window-maximized="0">
-    <inkscape:grid
-       type="xygrid"
-       id="grid2816"
-       empspacing="5"
-       visible="true"
-       enabled="true"
-       snapvisiblegridlinesonly="true" />
-  </sodipodi:namedview>
-  <metadata
-     id="metadata7">
-    <rdf:RDF>
-      <cc:Work
-         rdf:about="">
-        <dc:format>image/svg+xml</dc:format>
-        <dc:type
-           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
-        <dc:title />
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <g
-     inkscape:label="Layer 1"
-     inkscape:groupmode="layer"
-     id="layer1"
-     transform="translate(-25.654297,-779.745)">
-    <image
-       sodipodi:absref="dpad.png"
-       xlink:href="dpad.png"
-       inkscape:export-ydpi="90"
-       inkscape:export-xdpi="90"
-       width="109"
-       height="77"
-       id="image2906"
-       x="27"
-       y="793.36218" />
-    <text
-       xml:space="preserve"
-       style="font-size:14px;font-style:normal;font-weight:normal;line-height:112.99999952%;fill:#bbbbbb;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
-       x="25"
-       y="787.36218"
-       id="text2910"
-       sodipodi:linespacing="113%"
-       inkscape:export-xdpi="90"
-       inkscape:export-ydpi="90"><tspan
-         sodipodi:role="line"
-         id="tspan2912"
-         x="25"
-         y="787.36218"
-         style="font-size:10px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:112.99999952%;writing-mode:lr-tb;text-anchor:start;fill:#bbbbbb;fill-opacity:1;font-family:Roboto;-inkscape-font-specification:Roboto Medium">DPAD <tspan
-   style="font-size:10px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:112.99999952%;writing-mode:lr-tb;text-anchor:start;fill:#999999;fill-opacity:1;font-family:Roboto;-inkscape-font-specification:Roboto Medium"
-   id="tspan3589">not enabled in AVD</tspan></tspan></text>
-  </g>
-</svg>
diff --git a/emulator/skins/assets/dpad_on.svg b/emulator/skins/assets/dpad_on.svg
deleted file mode 100644
index 7a8f99a..0000000
--- a/emulator/skins/assets/dpad_on.svg
+++ /dev/null
@@ -1,107 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-
-<svg
-   xmlns:dc="http://purl.org/dc/elements/1.1/"
-   xmlns:cc="http://creativecommons.org/ns#"
-   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-   xmlns:svg="http://www.w3.org/2000/svg"
-   xmlns="http://www.w3.org/2000/svg"
-   xmlns:xlink="http://www.w3.org/1999/xlink"
-   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
-   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
-   width="110"
-   height="88.109375"
-   id="svg2"
-   version="1.1"
-   inkscape:version="0.47 r22583"
-   sodipodi:docname="dpad_on.svg"
-   inkscape:export-filename="dpad_on.png"
-   inkscape:export-xdpi="90"
-   inkscape:export-ydpi="90">
-  <defs
-     id="defs4">
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 526.18109 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="744.09448 : 526.18109 : 1"
-       inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
-       id="perspective10" />
-    <inkscape:perspective
-       id="perspective2904"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_x="0 : 0.5 : 1"
-       sodipodi:type="inkscape:persp3d" />
-  </defs>
-  <sodipodi:namedview
-     id="base"
-     pagecolor="#ffffff"
-     bordercolor="#666666"
-     borderopacity="1.0"
-     inkscape:pageopacity="0.0"
-     inkscape:pageshadow="2"
-     inkscape:zoom="6.3250474"
-     inkscape:cx="96.012951"
-     inkscape:cy="42.761466"
-     inkscape:document-units="px"
-     inkscape:current-layer="layer1"
-     showgrid="true"
-     inkscape:window-width="1570"
-     inkscape:window-height="1089"
-     inkscape:window-x="436"
-     inkscape:window-y="347"
-     inkscape:window-maximized="0">
-    <inkscape:grid
-       type="xygrid"
-       id="grid2816"
-       empspacing="5"
-       visible="true"
-       enabled="true"
-       snapvisiblegridlinesonly="true" />
-  </sodipodi:namedview>
-  <metadata
-     id="metadata7">
-    <rdf:RDF>
-      <cc:Work
-         rdf:about="">
-        <dc:format>image/svg+xml</dc:format>
-        <dc:type
-           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
-        <dc:title></dc:title>
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <g
-     inkscape:label="Layer 1"
-     inkscape:groupmode="layer"
-     id="layer1"
-     transform="translate(-25.654297,-786.25281)">
-    <image
-       sodipodi:absref="dpad.png"
-       xlink:href="dpad.png"
-       inkscape:export-ydpi="90"
-       inkscape:export-xdpi="90"
-       width="109"
-       height="77"
-       id="image2906"
-       x="26.654297"
-       y="797.36218" />
-    <text
-       xml:space="preserve"
-       style="font-size:14px;font-style:normal;font-weight:normal;line-height:125%;fill:#bbbbbb;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
-       x="25"
-       y="793.36218"
-       id="text2910"
-       sodipodi:linespacing="125%"
-       inkscape:export-xdpi="90"
-       inkscape:export-ydpi="90"><tspan
-         sodipodi:role="line"
-         id="tspan2912"
-         x="25"
-         y="793.36218"
-         style="font-size:10px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#bbbbbb;fill-opacity:1;font-family:Roboto;-inkscape-font-specification:Roboto Medium">DPAD</tspan></text>
-  </g>
-</svg>
diff --git a/emulator/skins/assets/hwkeys.png b/emulator/skins/assets/hwkeys.png
deleted file mode 100644
index 3a468f1..0000000
--- a/emulator/skins/assets/hwkeys.png
+++ /dev/null
Binary files differ
diff --git a/emulator/skins/assets/hwkeys_off.svg b/emulator/skins/assets/hwkeys_off.svg
deleted file mode 100644
index f14ac10..0000000
--- a/emulator/skins/assets/hwkeys_off.svg
+++ /dev/null
@@ -1,114 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-
-<svg
-   xmlns:dc="http://purl.org/dc/elements/1.1/"
-   xmlns:cc="http://creativecommons.org/ns#"
-   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-   xmlns:svg="http://www.w3.org/2000/svg"
-   xmlns="http://www.w3.org/2000/svg"
-   xmlns:xlink="http://www.w3.org/1999/xlink"
-   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
-   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
-   width="211.91211"
-   height="57.617188"
-   id="svg2"
-   version="1.1"
-   inkscape:version="0.47 r22583"
-   sodipodi:docname="hwkeys_off.svg"
-   inkscape:export-filename="hwkeys_off.png"
-   inkscape:export-xdpi="90"
-   inkscape:export-ydpi="90">
-  <defs
-     id="defs4">
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 526.18109 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="744.09448 : 526.18109 : 1"
-       inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
-       id="perspective10" />
-    <inkscape:perspective
-       id="perspective2904"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_x="0 : 0.5 : 1"
-       sodipodi:type="inkscape:persp3d" />
-    <inkscape:perspective
-       id="perspective2886"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_x="0 : 0.5 : 1"
-       sodipodi:type="inkscape:persp3d" />
-  </defs>
-  <sodipodi:namedview
-     id="base"
-     pagecolor="#ffffff"
-     bordercolor="#666666"
-     borderopacity="1.0"
-     inkscape:pageopacity="0.0"
-     inkscape:pageshadow="2"
-     inkscape:zoom="4.4724839"
-     inkscape:cx="138.91446"
-     inkscape:cy="16.828573"
-     inkscape:document-units="px"
-     inkscape:current-layer="layer1"
-     showgrid="true"
-     inkscape:window-width="1570"
-     inkscape:window-height="1089"
-     inkscape:window-x="468"
-     inkscape:window-y="267"
-     inkscape:window-maximized="0">
-    <inkscape:grid
-       type="xygrid"
-       id="grid2816"
-       empspacing="5"
-       visible="true"
-       enabled="true"
-       snapvisiblegridlinesonly="true" />
-  </sodipodi:namedview>
-  <metadata
-     id="metadata7">
-    <rdf:RDF>
-      <cc:Work
-         rdf:about="">
-        <dc:format>image/svg+xml</dc:format>
-        <dc:type
-           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
-        <dc:title />
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <g
-     inkscape:label="Layer 1"
-     inkscape:groupmode="layer"
-     id="layer1"
-     transform="translate(-25.654297,-779.745)">
-    <text
-       xml:space="preserve"
-       style="font-size:14px;font-style:normal;font-weight:normal;line-height:112.99999952%;fill:#bbbbbb;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
-       x="25"
-       y="787.36218"
-       id="text2910"
-       sodipodi:linespacing="113%"
-       inkscape:export-xdpi="90"
-       inkscape:export-ydpi="90"><tspan
-         sodipodi:role="line"
-         id="tspan2912"
-         x="25"
-         y="787.36218"
-         style="font-size:10px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:112.99999952%;writing-mode:lr-tb;text-anchor:start;fill:#bbbbbb;fill-opacity:1;font-family:Roboto;-inkscape-font-specification:Roboto Medium">Hardware Buttons <tspan
-   style="font-size:10px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:112.99999952%;writing-mode:lr-tb;text-anchor:start;fill:#999999;fill-opacity:1;font-family:Roboto;-inkscape-font-specification:Roboto Medium"
-   id="tspan3589">not enabled in AVD</tspan></tspan></text>
-    <image
-       sodipodi:absref="hwkeys.png"
-       xlink:href="hwkeys.png"
-       width="210"
-       height="42"
-       id="image2888"
-       x="27.566406"
-       y="795.36218" />
-  </g>
-</svg>
diff --git a/emulator/skins/assets/hwkeys_on.svg b/emulator/skins/assets/hwkeys_on.svg
deleted file mode 100644
index 0ea1eac..0000000
--- a/emulator/skins/assets/hwkeys_on.svg
+++ /dev/null
@@ -1,112 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-
-<svg
-   xmlns:dc="http://purl.org/dc/elements/1.1/"
-   xmlns:cc="http://creativecommons.org/ns#"
-   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-   xmlns:svg="http://www.w3.org/2000/svg"
-   xmlns="http://www.w3.org/2000/svg"
-   xmlns:xlink="http://www.w3.org/1999/xlink"
-   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
-   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
-   width="213.91211"
-   height="57.617188"
-   id="svg2"
-   version="1.1"
-   inkscape:version="0.47 r22583"
-   sodipodi:docname="hwkeys_on.svg"
-   inkscape:export-filename="hwkeys_on.png"
-   inkscape:export-xdpi="90"
-   inkscape:export-ydpi="90">
-  <defs
-     id="defs4">
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 526.18109 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="744.09448 : 526.18109 : 1"
-       inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
-       id="perspective10" />
-    <inkscape:perspective
-       id="perspective2904"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_x="0 : 0.5 : 1"
-       sodipodi:type="inkscape:persp3d" />
-    <inkscape:perspective
-       id="perspective2886"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_x="0 : 0.5 : 1"
-       sodipodi:type="inkscape:persp3d" />
-  </defs>
-  <sodipodi:namedview
-     id="base"
-     pagecolor="#ffffff"
-     bordercolor="#666666"
-     borderopacity="1.0"
-     inkscape:pageopacity="0.0"
-     inkscape:pageshadow="2"
-     inkscape:zoom="4.4724839"
-     inkscape:cx="138.91446"
-     inkscape:cy="16.828571"
-     inkscape:document-units="px"
-     inkscape:current-layer="layer1"
-     showgrid="true"
-     inkscape:window-width="1570"
-     inkscape:window-height="1089"
-     inkscape:window-x="436"
-     inkscape:window-y="347"
-     inkscape:window-maximized="0">
-    <inkscape:grid
-       type="xygrid"
-       id="grid2816"
-       empspacing="5"
-       visible="true"
-       enabled="true"
-       snapvisiblegridlinesonly="true" />
-  </sodipodi:namedview>
-  <metadata
-     id="metadata7">
-    <rdf:RDF>
-      <cc:Work
-         rdf:about="">
-        <dc:format>image/svg+xml</dc:format>
-        <dc:type
-           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
-        <dc:title></dc:title>
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <g
-     inkscape:label="Layer 1"
-     inkscape:groupmode="layer"
-     id="layer1"
-     transform="translate(-25.654297,-779.745)">
-    <text
-       xml:space="preserve"
-       style="font-size:14px;font-style:normal;font-weight:normal;line-height:125%;fill:#bbbbbb;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
-       x="25"
-       y="787.36218"
-       id="text2910"
-       sodipodi:linespacing="125%"
-       inkscape:export-xdpi="90"
-       inkscape:export-ydpi="90"><tspan
-         sodipodi:role="line"
-         id="tspan2912"
-         x="25"
-         y="787.36218"
-         style="font-size:10px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#bbbbbb;fill-opacity:1;font-family:Roboto;-inkscape-font-specification:Roboto Medium">Hardware Buttons</tspan></text>
-    <image
-       sodipodi:absref="hwkeys.png"
-       xlink:href="hwkeys.png"
-       y="795.36218"
-       x="29.566406"
-       id="image2888"
-       height="42"
-       width="210" />
-  </g>
-</svg>
diff --git a/emulator/skins/assets/keyboard_off.svg b/emulator/skins/assets/keyboard_off.svg
deleted file mode 100644
index ceb2b57..0000000
--- a/emulator/skins/assets/keyboard_off.svg
+++ /dev/null
@@ -1,103 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-
-<svg
-   xmlns:dc="http://purl.org/dc/elements/1.1/"
-   xmlns:cc="http://creativecommons.org/ns#"
-   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-   xmlns:svg="http://www.w3.org/2000/svg"
-   xmlns="http://www.w3.org/2000/svg"
-   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
-   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
-   width="174.07715"
-   height="21.050976"
-   id="svg2"
-   version="1.1"
-   inkscape:version="0.47 r22583"
-   sodipodi:docname="keyboard_off.svg"
-   inkscape:export-filename="keyboard_off.png"
-   inkscape:export-xdpi="90"
-   inkscape:export-ydpi="90">
-  <defs
-     id="defs4">
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 526.18109 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="744.09448 : 526.18109 : 1"
-       inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
-       id="perspective10" />
-    <inkscape:perspective
-       id="perspective2904"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_x="0 : 0.5 : 1"
-       sodipodi:type="inkscape:persp3d" />
-  </defs>
-  <sodipodi:namedview
-     id="base"
-     pagecolor="#ffffff"
-     bordercolor="#666666"
-     borderopacity="1.0"
-     inkscape:pageopacity="0.0"
-     inkscape:pageshadow="2"
-     inkscape:zoom="4.4724839"
-     inkscape:cx="138.98282"
-     inkscape:cy="-30.804743"
-     inkscape:document-units="px"
-     inkscape:current-layer="layer1"
-     showgrid="true"
-     inkscape:window-width="1570"
-     inkscape:window-height="1089"
-     inkscape:window-x="436"
-     inkscape:window-y="347"
-     inkscape:window-maximized="0">
-    <inkscape:grid
-       type="xygrid"
-       id="grid2816"
-       empspacing="5"
-       visible="true"
-       enabled="true"
-       snapvisiblegridlinesonly="true" />
-  </sodipodi:namedview>
-  <metadata
-     id="metadata7">
-    <rdf:RDF>
-      <cc:Work
-         rdf:about="">
-        <dc:format>image/svg+xml</dc:format>
-        <dc:type
-           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
-        <dc:title></dc:title>
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <g
-     inkscape:label="Layer 1"
-     inkscape:groupmode="layer"
-     id="layer1"
-     transform="translate(-25.585937,-779.745)">
-    <text
-       xml:space="preserve"
-       style="font-size:14px;font-style:normal;font-weight:normal;line-height:112.99999952%;fill:#bbbbbb;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
-       x="25"
-       y="787.36218"
-       id="text2910"
-       sodipodi:linespacing="113%"
-       inkscape:export-xdpi="90"
-       inkscape:export-ydpi="90"><tspan
-         sodipodi:role="line"
-         id="tspan2912"
-         x="25"
-         y="787.36218"
-         style="font-size:10px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:112.99999952%;writing-mode:lr-tb;text-anchor:start;fill:#bbbbbb;fill-opacity:1;font-family:Roboto;-inkscape-font-specification:Roboto Medium">Hardware Keyboard <tspan
-   style="font-size:10px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:112.99999952%;writing-mode:lr-tb;text-anchor:start;fill:#999999;fill-opacity:1;font-family:Roboto;-inkscape-font-specification:Roboto Medium"
-   id="tspan3589">not enabled in AVD</tspan></tspan><tspan
-         sodipodi:role="line"
-         x="25"
-         y="798.66217"
-         style="font-size:10px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:112.99999952%;writing-mode:lr-tb;text-anchor:start;fill:#bbbbbb;fill-opacity:1;font-family:Roboto;-inkscape-font-specification:Roboto Medium"
-         id="tspan2818">Use on screen keyboard</tspan></text>
-  </g>
-</svg>
diff --git a/emulator/skins/assets/keyboard_on.svg b/emulator/skins/assets/keyboard_on.svg
deleted file mode 100644
index 9504f3e..0000000
--- a/emulator/skins/assets/keyboard_on.svg
+++ /dev/null
@@ -1,103 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-
-<svg
-   xmlns:dc="http://purl.org/dc/elements/1.1/"
-   xmlns:cc="http://creativecommons.org/ns#"
-   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-   xmlns:svg="http://www.w3.org/2000/svg"
-   xmlns="http://www.w3.org/2000/svg"
-   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
-   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
-   width="195.49316"
-   height="21.050976"
-   id="svg2"
-   version="1.1"
-   inkscape:version="0.47 r22583"
-   sodipodi:docname="keyboard_on.svg"
-   inkscape:export-filename="keyboard_on.png"
-   inkscape:export-xdpi="90"
-   inkscape:export-ydpi="90">
-  <defs
-     id="defs4">
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 526.18109 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="744.09448 : 526.18109 : 1"
-       inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
-       id="perspective10" />
-    <inkscape:perspective
-       id="perspective2904"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_x="0 : 0.5 : 1"
-       sodipodi:type="inkscape:persp3d" />
-  </defs>
-  <sodipodi:namedview
-     id="base"
-     pagecolor="#ffffff"
-     bordercolor="#666666"
-     borderopacity="1.0"
-     inkscape:pageopacity="0.0"
-     inkscape:pageshadow="2"
-     inkscape:zoom="4.4724839"
-     inkscape:cx="138.98282"
-     inkscape:cy="-30.804747"
-     inkscape:document-units="px"
-     inkscape:current-layer="layer1"
-     showgrid="true"
-     inkscape:window-width="1570"
-     inkscape:window-height="1089"
-     inkscape:window-x="436"
-     inkscape:window-y="347"
-     inkscape:window-maximized="0">
-    <inkscape:grid
-       type="xygrid"
-       id="grid2816"
-       empspacing="5"
-       visible="true"
-       enabled="true"
-       snapvisiblegridlinesonly="true" />
-  </sodipodi:namedview>
-  <metadata
-     id="metadata7">
-    <rdf:RDF>
-      <cc:Work
-         rdf:about="">
-        <dc:format>image/svg+xml</dc:format>
-        <dc:type
-           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
-        <dc:title></dc:title>
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <g
-     inkscape:label="Layer 1"
-     inkscape:groupmode="layer"
-     id="layer1"
-     transform="translate(-25.585937,-779.745)">
-    <text
-       xml:space="preserve"
-       style="font-size:14px;font-style:normal;font-weight:normal;line-height:112.99999952%;fill:#bbbbbb;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
-       x="25"
-       y="787.36218"
-       id="text2910"
-       sodipodi:linespacing="113%"
-       inkscape:export-xdpi="90"
-       inkscape:export-ydpi="90"><tspan
-         sodipodi:role="line"
-         id="tspan2912"
-         x="25"
-         y="787.36218"
-         style="font-size:10px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:112.99999952%;writing-mode:lr-tb;text-anchor:start;fill:#bbbbbb;fill-opacity:1;font-family:Roboto;-inkscape-font-specification:Roboto Medium">Hardware Keyboard<tspan
-   style="font-size:10px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:112.99999952%;writing-mode:lr-tb;text-anchor:start;fill:#999999;fill-opacity:1;font-family:Roboto;-inkscape-font-specification:Roboto Medium"
-   id="tspan3589" /></tspan><tspan
-         sodipodi:role="line"
-         x="25"
-         y="798.66217"
-         style="font-size:10px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:112.99999952%;writing-mode:lr-tb;text-anchor:start;fill:#bbbbbb;fill-opacity:1;font-family:Roboto;-inkscape-font-specification:Roboto Medium"
-         id="tspan2818">Use your physical keyboard to provide input</tspan></text>
-  </g>
-</svg>
diff --git a/emulator/skins/dynamic/arrow_down.png b/emulator/skins/dynamic/arrow_down.png
deleted file mode 100644
index b9fde22..0000000
--- a/emulator/skins/dynamic/arrow_down.png
+++ /dev/null
Binary files differ
diff --git a/emulator/skins/dynamic/arrow_left.png b/emulator/skins/dynamic/arrow_left.png
deleted file mode 100644
index 281b192..0000000
--- a/emulator/skins/dynamic/arrow_left.png
+++ /dev/null
Binary files differ
diff --git a/emulator/skins/dynamic/arrow_right.png b/emulator/skins/dynamic/arrow_right.png
deleted file mode 100644
index 4cbc65d..0000000
--- a/emulator/skins/dynamic/arrow_right.png
+++ /dev/null
Binary files differ
diff --git a/emulator/skins/dynamic/arrow_up.png b/emulator/skins/dynamic/arrow_up.png
deleted file mode 100644
index 29c7121..0000000
--- a/emulator/skins/dynamic/arrow_up.png
+++ /dev/null
Binary files differ
diff --git a/emulator/skins/dynamic/basic.png b/emulator/skins/dynamic/basic.png
deleted file mode 100644
index 585ccfe..0000000
--- a/emulator/skins/dynamic/basic.png
+++ /dev/null
Binary files differ
diff --git a/emulator/skins/dynamic/button.png b/emulator/skins/dynamic/button.png
deleted file mode 100644
index 8281d20..0000000
--- a/emulator/skins/dynamic/button.png
+++ /dev/null
Binary files differ
diff --git a/emulator/skins/dynamic/dpad_off.png b/emulator/skins/dynamic/dpad_off.png
deleted file mode 100644
index 84a7d2a..0000000
--- a/emulator/skins/dynamic/dpad_off.png
+++ /dev/null
Binary files differ
diff --git a/emulator/skins/dynamic/dpad_on.png b/emulator/skins/dynamic/dpad_on.png
deleted file mode 100644
index 9813a53..0000000
--- a/emulator/skins/dynamic/dpad_on.png
+++ /dev/null
Binary files differ
diff --git a/emulator/skins/dynamic/hwkeys_off.png b/emulator/skins/dynamic/hwkeys_off.png
deleted file mode 100644
index 468e727..0000000
--- a/emulator/skins/dynamic/hwkeys_off.png
+++ /dev/null
Binary files differ
diff --git a/emulator/skins/dynamic/hwkeys_on.png b/emulator/skins/dynamic/hwkeys_on.png
deleted file mode 100644
index e4f732f..0000000
--- a/emulator/skins/dynamic/hwkeys_on.png
+++ /dev/null
Binary files differ
diff --git a/emulator/skins/dynamic/keyboard_off.png b/emulator/skins/dynamic/keyboard_off.png
deleted file mode 100644
index c8b486a..0000000
--- a/emulator/skins/dynamic/keyboard_off.png
+++ /dev/null
Binary files differ
diff --git a/emulator/skins/dynamic/keyboard_on.png b/emulator/skins/dynamic/keyboard_on.png
deleted file mode 100644
index 97b45bf..0000000
--- a/emulator/skins/dynamic/keyboard_on.png
+++ /dev/null
Binary files differ
diff --git a/emulator/skins/dynamic/layout b/emulator/skins/dynamic/layout
deleted file mode 100644
index 5fa7d97..0000000
--- a/emulator/skins/dynamic/layout
+++ /dev/null
@@ -1,138 +0,0 @@
-# This layout file only defines all the parts. The layouts section
-# that is missing is filled in at runtime by the skin parser.
-# Many of the parts in this layout have both _on and _off versions
-# which correspond to the part to be used if that control is actually
-# available in the AVD.
-parts {
-    device {
-        display {
-            width   320
-            height  480
-            x       0
-            y       0
-        }
-    }
-
-    dpad_on {
-        background {
-            image   dpad_on.png
-            width   110
-            height  88
-        }
-        buttons {
-            dpad-up {
-                    image arrow_up.png
-                    x 24
-                    y 8
-            }
-            dpad-down {
-                    image arrow_down.png
-                    x 24
-                    y 60
-            }
-            dpad-left {
-                    image arrow_left.png
-                    x 0
-                    y 8
-            }
-            dpad-right {
-                    image arrow_right.png
-                    x 70
-                    y 8
-            }
-            dpad-center {
-                    image select.png
-                    x 24
-                    y 36
-            }
-        }
-    }
-
-    dpad_off {
-        background {
-            image   dpad_off.png
-            width   111
-            height  91
-        }
-    }
-
-    hwkeys_on {
-        background {
-            image   hwkeys_on.png
-            width   212
-            height  58
-        }
-        buttons {
-            home {
-                    image button.png
-                    x 0
-                    y 12
-            }
-            soft-left {
-                    image button.png
-                    x 56
-                    y 12
-            }
-            back {
-                    image button.png
-                    x 112
-                    y 12
-            }
-            search {
-                    image button.png
-                    x 166
-                    y 12
-            }
-        }
-    }
-
-    hwkeys_off {
-        background {
-            image   hwkeys_off.png
-            width   212
-            height  58
-        }
-    }
-
-    keyboard_on {
-        background {
-            image   keyboard_on.png
-            width   195
-            height  21
-        }
-    }
-
-    keyboard_off {
-        background {
-            image   keyboard_off.png
-            width   174
-            height  21
-        }
-    }
-
-    basic_controls {
-        background {
-            image   basic.png
-            width   159
-            height  55
-        }
-
-        buttons {
-            volume-down {
-                    image button.png
-                    x 1
-                    y 9
-            }
-            volume-up {
-                    image button.png
-                    x 57
-                    y 9
-            }
-            power {
-                    image button.png
-                    x 113
-                    y 9
-            }
-        }
-    }
-}
diff --git a/emulator/skins/dynamic/select.png b/emulator/skins/dynamic/select.png
deleted file mode 100644
index f4a65d3..0000000
--- a/emulator/skins/dynamic/select.png
+++ /dev/null
Binary files differ
diff --git a/emulator/snapshot/snapshots.img b/emulator/snapshot/snapshots.img
deleted file mode 100644
index c05bbda..0000000
--- a/emulator/snapshot/snapshots.img
+++ /dev/null
Binary files differ
diff --git a/eventanalyzer/.classpath b/eventanalyzer/.classpath
deleted file mode 100644
index b0326c8..0000000
--- a/eventanalyzer/.classpath
+++ /dev/null
@@ -1,7 +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 combineaccessrules="false" kind="src" path="/ddmlib"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/eventanalyzer/.gitignore b/eventanalyzer/.gitignore
deleted file mode 100644
index ba077a4..0000000
--- a/eventanalyzer/.gitignore
+++ /dev/null
@@ -1 +0,0 @@
-bin
diff --git a/eventanalyzer/.project b/eventanalyzer/.project
deleted file mode 100644
index 2862978..0000000
--- a/eventanalyzer/.project
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>eventanalyzer</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/eventanalyzer/Android.bp b/eventanalyzer/Android.bp
deleted file mode 100644
index 40f8276..0000000
--- a/eventanalyzer/Android.bp
+++ /dev/null
@@ -1,25 +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.
-//
-
-java_binary_host {
-    name: "eventanalyzer",
-
-    srcs: ["src/**/*.java"],
-
-    wrapper: "etc/eventanalyzer",
-    main_class: "com.android.eventanalyzer.EventAnalyzer",
-    libs: ["ddmlib-prebuilt"],
-}
diff --git a/eventanalyzer/NOTICE b/eventanalyzer/NOTICE
deleted file mode 100644
index c5b1efa..0000000
--- a/eventanalyzer/NOTICE
+++ /dev/null
@@ -1,190 +0,0 @@
-
-   Copyright (c) 2005-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.
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
-
-
-                                 Apache License
-                           Version 2.0, January 2004
-                        http://www.apache.org/licenses/
-
-   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
-   1. Definitions.
-
-      "License" shall mean the terms and conditions for use, reproduction,
-      and distribution as defined by Sections 1 through 9 of this document.
-
-      "Licensor" shall mean the copyright owner or entity authorized by
-      the copyright owner that is granting the License.
-
-      "Legal Entity" shall mean the union of the acting entity and all
-      other entities that control, are controlled by, or are under common
-      control with that entity. For the purposes of this definition,
-      "control" means (i) the power, direct or indirect, to cause the
-      direction or management of such entity, whether by contract or
-      otherwise, or (ii) ownership of fifty percent (50%) or more of the
-      outstanding shares, or (iii) beneficial ownership of such entity.
-
-      "You" (or "Your") shall mean an individual or Legal Entity
-      exercising permissions granted by this License.
-
-      "Source" form shall mean the preferred form for making modifications,
-      including but not limited to software source code, documentation
-      source, and configuration files.
-
-      "Object" form shall mean any form resulting from mechanical
-      transformation or translation of a Source form, including but
-      not limited to compiled object code, generated documentation,
-      and conversions to other media types.
-
-      "Work" shall mean the work of authorship, whether in Source or
-      Object form, made available under the License, as indicated by a
-      copyright notice that is included in or attached to the work
-      (an example is provided in the Appendix below).
-
-      "Derivative Works" shall mean any work, whether in Source or Object
-      form, that is based on (or derived from) the Work and for which the
-      editorial revisions, annotations, elaborations, or other modifications
-      represent, as a whole, an original work of authorship. For the purposes
-      of this License, Derivative Works shall not include works that remain
-      separable from, or merely link (or bind by name) to the interfaces of,
-      the Work and Derivative Works thereof.
-
-      "Contribution" shall mean any work of authorship, including
-      the original version of the Work and any modifications or additions
-      to that Work or Derivative Works thereof, that is intentionally
-      submitted to Licensor for inclusion in the Work by the copyright owner
-      or by an individual or Legal Entity authorized to submit on behalf of
-      the copyright owner. For the purposes of this definition, "submitted"
-      means any form of electronic, verbal, or written communication sent
-      to the Licensor or its representatives, including but not limited to
-      communication on electronic mailing lists, source code control systems,
-      and issue tracking systems that are managed by, or on behalf of, the
-      Licensor for the purpose of discussing and improving the Work, but
-      excluding communication that is conspicuously marked or otherwise
-      designated in writing by the copyright owner as "Not a Contribution."
-
-      "Contributor" shall mean Licensor and any individual or Legal Entity
-      on behalf of whom a Contribution has been received by Licensor and
-      subsequently incorporated within the Work.
-
-   2. Grant of Copyright License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      copyright license to reproduce, prepare Derivative Works of,
-      publicly display, publicly perform, sublicense, and distribute the
-      Work and such Derivative Works in Source or Object form.
-
-   3. Grant of Patent License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      (except as stated in this section) patent license to make, have made,
-      use, offer to sell, sell, import, and otherwise transfer the Work,
-      where such license applies only to those patent claims licensable
-      by such Contributor that are necessarily infringed by their
-      Contribution(s) alone or by combination of their Contribution(s)
-      with the Work to which such Contribution(s) was submitted. If You
-      institute patent litigation against any entity (including a
-      cross-claim or counterclaim in a lawsuit) alleging that the Work
-      or a Contribution incorporated within the Work constitutes direct
-      or contributory patent infringement, then any patent licenses
-      granted to You under this License for that Work shall terminate
-      as of the date such litigation is filed.
-
-   4. Redistribution. You may reproduce and distribute copies of the
-      Work or Derivative Works thereof in any medium, with or without
-      modifications, and in Source or Object form, provided that You
-      meet the following conditions:
-
-      (a) You must give any other recipients of the Work or
-          Derivative Works a copy of this License; and
-
-      (b) You must cause any modified files to carry prominent notices
-          stating that You changed the files; and
-
-      (c) You must retain, in the Source form of any Derivative Works
-          that You distribute, all copyright, patent, trademark, and
-          attribution notices from the Source form of the Work,
-          excluding those notices that do not pertain to any part of
-          the Derivative Works; and
-
-      (d) If the Work includes a "NOTICE" text file as part of its
-          distribution, then any Derivative Works that You distribute must
-          include a readable copy of the attribution notices contained
-          within such NOTICE file, excluding those notices that do not
-          pertain to any part of the Derivative Works, in at least one
-          of the following places: within a NOTICE text file distributed
-          as part of the Derivative Works; within the Source form or
-          documentation, if provided along with the Derivative Works; or,
-          within a display generated by the Derivative Works, if and
-          wherever such third-party notices normally appear. The contents
-          of the NOTICE file are for informational purposes only and
-          do not modify the License. You may add Your own attribution
-          notices within Derivative Works that You distribute, alongside
-          or as an addendum to the NOTICE text from the Work, provided
-          that such additional attribution notices cannot be construed
-          as modifying the License.
-
-      You may add Your own copyright statement to Your modifications and
-      may provide additional or different license terms and conditions
-      for use, reproduction, or distribution of Your modifications, or
-      for any such Derivative Works as a whole, provided Your use,
-      reproduction, and distribution of the Work otherwise complies with
-      the conditions stated in this License.
-
-   5. Submission of Contributions. Unless You explicitly state otherwise,
-      any Contribution intentionally submitted for inclusion in the Work
-      by You to the Licensor shall be under the terms and conditions of
-      this License, without any additional terms or conditions.
-      Notwithstanding the above, nothing herein shall supersede or modify
-      the terms of any separate license agreement you may have executed
-      with Licensor regarding such Contributions.
-
-   6. Trademarks. This License does not grant permission to use the trade
-      names, trademarks, service marks, or product names of the Licensor,
-      except as required for reasonable and customary use in describing the
-      origin of the Work and reproducing the content of the NOTICE file.
-
-   7. Disclaimer of Warranty. Unless required by applicable law or
-      agreed to in writing, Licensor provides the Work (and each
-      Contributor provides its Contributions) on an "AS IS" BASIS,
-      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
-      implied, including, without limitation, any warranties or conditions
-      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
-      PARTICULAR PURPOSE. You are solely responsible for determining the
-      appropriateness of using or redistributing the Work and assume any
-      risks associated with Your exercise of permissions under this License.
-
-   8. Limitation of Liability. In no event and under no legal theory,
-      whether in tort (including negligence), contract, or otherwise,
-      unless required by applicable law (such as deliberate and grossly
-      negligent acts) or agreed to in writing, shall any Contributor be
-      liable to You for damages, including any direct, indirect, special,
-      incidental, or consequential damages of any character arising as a
-      result of this License or out of the use or inability to use the
-      Work (including but not limited to damages for loss of goodwill,
-      work stoppage, computer failure or malfunction, or any and all
-      other commercial damages or losses), even if such Contributor
-      has been advised of the possibility of such damages.
-
-   9. Accepting Warranty or Additional Liability. While redistributing
-      the Work or Derivative Works thereof, You may choose to offer,
-      and charge a fee for, acceptance of support, warranty, indemnity,
-      or other liability obligations and/or rights consistent with this
-      License. However, in accepting such obligations, You may act only
-      on Your own behalf and on Your sole responsibility, not on behalf
-      of any other Contributor, and only if You agree to indemnify,
-      defend, and hold each Contributor harmless for any liability
-      incurred by, or claims asserted against, such Contributor by reason
-      of your accepting any such warranty or additional liability.
-
-   END OF TERMS AND CONDITIONS
-
diff --git a/eventanalyzer/etc/eventanalyzer b/eventanalyzer/etc/eventanalyzer
deleted file mode 100755
index d6c7895..0000000
--- a/eventanalyzer/etc/eventanalyzer
+++ /dev/null
@@ -1,73 +0,0 @@
-#!/bin/sh
-# Copyright 2005-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.
-
-# Set up prog to be the path of this script, including following symlinks,
-# and set up progdir to be the fully-qualified pathname of its directory.
-prog="$0"
-while [ -h "${prog}" ]; do
-    newProg=`/bin/ls -ld "${prog}"`
-    newProg=`expr "${newProg}" : ".* -> \(.*\)$"`
-    if expr "x${newProg}" : 'x/' >/dev/null; then
-        prog="${newProg}"
-    else
-        progdir=`dirname "${prog}"`
-        prog="${progdir}/${newProg}"
-    fi
-done
-oldwd=`pwd`
-progdir=`dirname "${prog}"`
-cd "${progdir}"
-progdir=`pwd`
-prog="${progdir}"/`basename "${prog}"`
-cd "${oldwd}"
-
-jarfile=eventanalyzer.jar
-frameworkdir="$progdir"
-libdir="$progdir"
-if [ ! -r "$frameworkdir/$jarfile" ]
-then
-    frameworkdir=`dirname "$progdir"`/tools/lib
-    libdir=`dirname "$progdir"`/tools/lib
-fi
-if [ ! -r "$frameworkdir/$jarfile" ]
-then
-    frameworkdir=`dirname "$progdir"`/framework
-    libdir=`dirname "$progdir"`/lib
-fi
-if [ ! -r "$frameworkdir/$jarfile" ]
-then
-    echo `basename "$prog"`": can't find $jarfile"
-    exit 1
-fi
-
-
-# Check args.
-# Mac OS X needs an additional arg, or you get an "illegal thread" complaint.
-if [ `uname` = "Darwin" ]; then
-    os_opts="-XstartOnFirstThread"
-else
-    os_opts=
-fi
-
-if [ "$OSTYPE" = "cygwin" ] ; then
-    jarpath=`cygpath -w  "$frameworkdir/$jarfile"`
-    progdir=`cygpath -w  "$progdir"`
-else
-    jarpath="$frameworkdir/$jarfile"
-fi
-
-# need to use "java.ext.dirs" because "-jar" causes classpath to be ignored
-# might need more memory, e.g. -Xmx128M
-exec java -Xmx128M $os_opts -Djava.ext.dirs="$frameworkdir" -Djava.library.path="$libdir" -jar "$jarpath" "$@"
diff --git a/eventanalyzer/src/com/android/eventanalyzer/EventAnalyzer.java b/eventanalyzer/src/com/android/eventanalyzer/EventAnalyzer.java
deleted file mode 100644
index 691bf0c..0000000
--- a/eventanalyzer/src/com/android/eventanalyzer/EventAnalyzer.java
+++ /dev/null
@@ -1,488 +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.eventanalyzer;
-
-import com.android.ddmlib.AdbCommandRejectedException;
-import com.android.ddmlib.AndroidDebugBridge;
-import com.android.ddmlib.IDevice;
-import com.android.ddmlib.Log;
-import com.android.ddmlib.TimeoutException;
-import com.android.ddmlib.Log.ILogOutput;
-import com.android.ddmlib.Log.LogLevel;
-import com.android.ddmlib.log.EventContainer;
-import com.android.ddmlib.log.EventLogParser;
-import com.android.ddmlib.log.InvalidTypeException;
-import com.android.ddmlib.log.LogReceiver;
-import com.android.ddmlib.log.LogReceiver.ILogListener;
-import com.android.ddmlib.log.LogReceiver.LogEntry;
-
-import java.io.BufferedReader;
-import java.io.BufferedWriter;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileWriter;
-import java.io.FilenameFilter;
-import java.io.IOException;
-import java.io.InputStreamReader;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Set;
-import java.util.TreeMap;
-
-/**
- * Connects to a device using ddmlib and analyze its event log.
- */
-public class EventAnalyzer implements ILogListener {
-
-    private final static int TAG_ACTIVITY_LAUNCH_TIME = 30009;
-    private final static char DATA_SEPARATOR = ',';
-
-    private final static String CVS_EXT = ".csv";
-    private final static String TAG_FILE_EXT = ".tag"; //$NON-NLS-1$
-
-    private EventLogParser mParser;
-    private TreeMap<String, ArrayList<Long>> mLaunchMap = new TreeMap<String, ArrayList<Long>>();
-
-    String mInputTextFile = null;
-    String mInputBinaryFile = null;
-    String mInputDevice = null;
-    String mInputFolder = null;
-    String mAlternateTagFile = null;
-    String mOutputFile = null;
-
-    public static void main(String[] args) {
-        new EventAnalyzer().run(args);
-    }
-
-    private void run(String[] args) {
-        if (args.length == 0) {
-            printUsageAndQuit();
-        }
-
-        int index = 0;
-        do {
-            String argument = args[index++];
-
-            if ("-s".equals(argument)) {
-                checkInputValidity("-s");
-
-                if (index == args.length) {
-                    printUsageAndQuit();
-                }
-
-                mInputDevice = args[index++];
-            } else if ("-fb".equals(argument)) {
-                checkInputValidity("-fb");
-
-                if (index == args.length) {
-                    printUsageAndQuit();
-                }
-
-                mInputBinaryFile = args[index++];
-            } else if ("-ft".equals(argument)) {
-                checkInputValidity("-ft");
-
-                if (index == args.length) {
-                    printUsageAndQuit();
-                }
-
-                mInputTextFile = args[index++];
-            } else if ("-F".equals(argument)) {
-                checkInputValidity("-F");
-
-                if (index == args.length) {
-                    printUsageAndQuit();
-                }
-
-                mInputFolder = args[index++];
-            } else if ("-t".equals(argument)) {
-                if (index == args.length) {
-                    printUsageAndQuit();
-                }
-
-                mAlternateTagFile = args[index++];
-            } else {
-                // get the filepath and break.
-                mOutputFile = argument;
-
-                // should not be any other device.
-                if (index < args.length) {
-                    printAndExit("Too many arguments!", false /* terminate */);
-                }
-            }
-        } while (index < args.length);
-
-        if ((mInputTextFile == null && mInputBinaryFile == null && mInputFolder == null &&
-                mInputDevice == null)) {
-            printUsageAndQuit();
-        }
-
-        File outputParent = new File(mOutputFile).getParentFile();
-        if (outputParent == null || outputParent.isDirectory() == false) {
-            printAndExit(String.format("%1$s is not a valid ouput file", mOutputFile),
-                    false /* terminate */);
-        }
-
-        // redirect the log output to /dev/null
-        Log.setLogOutput(new ILogOutput() {
-            public void printAndPromptLog(LogLevel logLevel, String tag, String message) {
-                // pass
-            }
-
-            public void printLog(LogLevel logLevel, String tag, String message) {
-                // pass
-            }
-        });
-
-        try {
-            if (mInputBinaryFile != null) {
-                parseBinaryLogFile();
-            } else if (mInputTextFile != null) {
-                parseTextLogFile(mInputTextFile);
-            } else if (mInputFolder != null) {
-                parseFolder(mInputFolder);
-            } else if (mInputDevice != null) {
-                parseLogFromDevice();
-            }
-
-            // analyze the data gathered by the parser methods
-            analyzeData();
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
-    }
-
-    /**
-     * Parses a binary event log file located at {@link #mInputBinaryFile}.
-     * @throws IOException
-     */
-    private void parseBinaryLogFile() throws IOException {
-        mParser = new EventLogParser();
-
-        String tagFile = mInputBinaryFile + TAG_FILE_EXT;
-        if (mParser.init(tagFile) == false) {
-            // if we have an alternate location
-            if (mAlternateTagFile != null) {
-                if (mParser.init(mAlternateTagFile) == false) {
-                    printAndExit("Failed to get event tags from " + mAlternateTagFile,
-                            false /* terminate*/);
-                }
-            } else {
-                printAndExit("Failed to get event tags from " + tagFile, false /* terminate*/);
-            }
-        }
-
-        LogReceiver receiver = new LogReceiver(this);
-
-        byte[] buffer = new byte[256];
-
-        FileInputStream fis = new FileInputStream(mInputBinaryFile);
-
-        int count;
-        while ((count = fis.read(buffer)) != -1) {
-            receiver.parseNewData(buffer, 0, count);
-        }
-    }
-
-    /**
-     * Parse a text Log file.
-     * @param filePath the location of the file.
-     * @throws IOException
-     */
-    private void parseTextLogFile(String filePath) throws IOException {
-        mParser = new EventLogParser();
-
-        String tagFile = filePath + TAG_FILE_EXT;
-        if (mParser.init(tagFile) == false) {
-            // if we have an alternate location
-            if (mAlternateTagFile != null) {
-                if (mParser.init(mAlternateTagFile) == false) {
-                    printAndExit("Failed to get event tags from " + mAlternateTagFile,
-                            false /* terminate*/);
-                }
-            } else {
-                printAndExit("Failed to get event tags from " + tagFile, false /* terminate*/);
-            }
-        }
-
-        // read the lines from the file and process them.
-        BufferedReader reader = new BufferedReader(
-                new InputStreamReader(new FileInputStream(filePath)));
-
-        String line;
-        while ((line = reader.readLine()) != null) {
-            processEvent(mParser.parse(line));
-        }
-    }
-
-    private void parseLogFromDevice() throws IOException, TimeoutException,
-            AdbCommandRejectedException {
-        // init the lib
-        AndroidDebugBridge.init(false /* debugger support */);
-
-        try {
-            AndroidDebugBridge bridge = AndroidDebugBridge.createBridge();
-
-            // we can't just ask for the device list right away, as the internal thread getting
-            // them from ADB may not be done getting the first list.
-            // Since we don't really want getDevices() to be blocking, we wait here manually.
-            int count = 0;
-            while (bridge.hasInitialDeviceList() == false) {
-                try {
-                    Thread.sleep(100);
-                    count++;
-                } catch (InterruptedException e) {
-                    // pass
-                }
-
-                // let's not wait > 10 sec.
-                if (count > 100) {
-                    printAndExit("Timeout getting device list!", true /* terminate*/);
-                }
-            }
-
-            // now get the devices
-            IDevice[] devices = bridge.getDevices();
-
-            for (IDevice device : devices) {
-                if (device.getSerialNumber().equals(mInputDevice)) {
-                    grabLogFrom(device);
-                    return;
-                }
-            }
-
-            System.err.println("Could not find " + mInputDevice);
-        } finally {
-            AndroidDebugBridge.terminate();
-        }
-    }
-
-    /**
-     * Parses the log files located in the folder, and its sub-folders.
-     * @param folderPath the path to the folder.
-     */
-    private void parseFolder(String folderPath) {
-        File f = new File(folderPath);
-        if (f.isDirectory() == false) {
-            printAndExit(String.format("%1$s is not a valid folder", folderPath),
-                    false /* terminate */);
-        }
-
-        String[] files = f.list(new FilenameFilter() {
-            public boolean accept(File dir, String name) {
-                name = name.toLowerCase();
-                return name.endsWith(".tag") == false;
-            }
-        });
-
-        for (String file : files) {
-            try {
-                f = new File(folderPath + File.separator + file);
-                if (f.isDirectory()) {
-                    parseFolder(f.getAbsolutePath());
-                } else {
-                    parseTextLogFile(f.getAbsolutePath());
-                }
-            } catch (IOException e) {
-                // ignore this file.
-            }
-        }
-    }
-
-    private void grabLogFrom(IDevice device) throws IOException, TimeoutException,
-            AdbCommandRejectedException {
-        mParser = new EventLogParser();
-        if (mParser.init(device) == false) {
-            printAndExit("Failed to get event-log-tags from " + device.getSerialNumber(),
-                    true /* terminate*/);
-        }
-
-        LogReceiver receiver = new LogReceiver(this);
-
-        device.runEventLogService(receiver);
-    }
-
-    /**
-     * Analyze the data and writes it to {@link #mOutputFile}
-     * @throws IOException
-     */
-    private void analyzeData() throws IOException {
-        BufferedWriter writer = null;
-        try {
-            // make sure the file name has the proper extension.
-            if (mOutputFile.toLowerCase().endsWith(CVS_EXT) == false) {
-                mOutputFile = mOutputFile + CVS_EXT;
-            }
-
-            writer = new BufferedWriter(new FileWriter(mOutputFile));
-            StringBuilder builder = new StringBuilder();
-
-            // write the list of launch start. One column per activity.
-            Set<String> activities = mLaunchMap.keySet();
-
-            // write the column headers.
-            for (String activity : activities) {
-                builder.append(activity).append(DATA_SEPARATOR);
-            }
-            writer.write(builder.append('\n').toString());
-
-            // loop on the activities and write their values.
-            boolean moreValues = true;
-            int index = 0;
-            while (moreValues) {
-                moreValues = false;
-                builder.setLength(0);
-
-                for (String activity : activities) {
-                    // get the activity list.
-                    ArrayList<Long> list = mLaunchMap.get(activity);
-                    if (index < list.size()) {
-                        moreValues = true;
-                        builder.append(list.get(index).longValue()).append(DATA_SEPARATOR);
-                    } else {
-                        builder.append(DATA_SEPARATOR);
-                    }
-                }
-
-                // write the line.
-                if (moreValues) {
-                    writer.write(builder.append('\n').toString());
-                }
-
-                index++;
-            }
-
-            // write per-activity stats.
-            for (String activity : activities) {
-                builder.setLength(0);
-                builder.append(activity).append(DATA_SEPARATOR);
-
-                // get the activity list.
-                ArrayList<Long> list = mLaunchMap.get(activity);
-
-                // sort the list
-                Collections.sort(list);
-
-                // write min/max
-                builder.append(list.get(0).longValue()).append(DATA_SEPARATOR);
-                builder.append(list.get(list.size()-1).longValue()).append(DATA_SEPARATOR);
-
-                // write median value
-                builder.append(list.get(list.size()/2).longValue()).append(DATA_SEPARATOR);
-
-                // compute and write average
-                long total = 0; // despite being encoded on a long, the values are low enough that
-                                // a Long should be enough to compute the total
-                for (Long value : list) {
-                    total += value.longValue();
-                }
-                builder.append(total / list.size()).append(DATA_SEPARATOR);
-
-                // finally write the data.
-                writer.write(builder.append('\n').toString());
-            }
-        } finally {
-            writer.close();
-        }
-    }
-
-    /*
-     * (non-Javadoc)
-     * @see com.android.ddmlib.log.LogReceiver.ILogListener#newData(byte[], int, int)
-     */
-    public void newData(byte[] data, int offset, int length) {
-        // we ignore raw data. New entries are processed in #newEntry(LogEntry)
-    }
-
-    /*
-     * (non-Javadoc)
-     * @see com.android.ddmlib.log.LogReceiver.ILogListener#newEntry(com.android.ddmlib.log.LogReceiver.LogEntry)
-     */
-    public void newEntry(LogEntry entry) {
-        // parse and process the entry data.
-        processEvent(mParser.parse(entry));
-    }
-
-    private void processEvent(EventContainer event) {
-        if (event != null && event.mTag == TAG_ACTIVITY_LAUNCH_TIME) {
-            // get the activity name
-            try {
-                String name = event.getValueAsString(0);
-
-                // get the launch time
-                Object value = event.getValue(1);
-                if (value instanceof Long) {
-                    addLaunchTime(name, (Long)value);
-                }
-
-            } catch (InvalidTypeException e) {
-                // Couldn't get the name as a string...
-                // Ignore this event.
-            }
-        }
-    }
-
-    private void addLaunchTime(String name, Long value) {
-        ArrayList<Long> list = mLaunchMap.get(name);
-
-        if (list == null) {
-            list = new ArrayList<Long>();
-            mLaunchMap.put(name, list);
-        }
-
-        list.add(value);
-    }
-
-    private void checkInputValidity(String option) {
-        if (mInputTextFile != null || mInputBinaryFile != null) {
-            printAndExit(String.format("ERROR: %1$s cannot be used with an input file.", option),
-                    false /* terminate */);
-        } else if (mInputFolder != null) {
-            printAndExit(String.format("ERROR: %1$s cannot be used with an input file.", option),
-                    false /* terminate */);
-        } else if (mInputDevice != null) {
-            printAndExit(String.format("ERROR: %1$s cannot be used with an input device serial number.",
-                    option), false /* terminate */);
-        }
-    }
-
-    private static void printUsageAndQuit() {
-        // 80 cols marker:  01234567890123456789012345678901234567890123456789012345678901234567890123456789
-        System.out.println("Usage:");
-        System.out.println("   eventanalyzer [-t <TAG_FILE>] <SOURCE> <OUTPUT>");
-        System.out.println("");
-        System.out.println("Possible sources:");
-        System.out.println("   -fb <file>    The path to a binary event log, gathered by dumpeventlog");
-        System.out.println("   -ft <file>    The path to a text event log, gathered by adb logcat -b events");
-        System.out.println("   -F <folder>   The path to a folder containing multiple text log files.");
-        System.out.println("   -s <serial>   The serial number of the Device to grab the event log from.");
-        System.out.println("Options:");
-        System.out.println("   -t <file>     The path to tag file to use in case the one associated with");
-        System.out.println("                 the source is missing");
-
-        System.exit(1);
-    }
-
-
-    private static void printAndExit(String message, boolean terminate) {
-        System.out.println(message);
-        if (terminate) {
-            AndroidDebugBridge.terminate();
-        }
-        System.exit(1);
-    }
-}
diff --git a/files/NOTICE b/files/NOTICE
deleted file mode 100644
index 06a9081..0000000
--- a/files/NOTICE
+++ /dev/null
@@ -1,190 +0,0 @@
-
-   Copyright (c) 2005-2014, The Android Open Source Project
-
-   Licensed under the Apache License, Version 2.0 (the "License");
-   you may not use this file except in compliance with the License.
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
-
-
-                                 Apache License
-                           Version 2.0, January 2004
-                        http://www.apache.org/licenses/
-
-   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
-   1. Definitions.
-
-      "License" shall mean the terms and conditions for use, reproduction,
-      and distribution as defined by Sections 1 through 9 of this document.
-
-      "Licensor" shall mean the copyright owner or entity authorized by
-      the copyright owner that is granting the License.
-
-      "Legal Entity" shall mean the union of the acting entity and all
-      other entities that control, are controlled by, or are under common
-      control with that entity. For the purposes of this definition,
-      "control" means (i) the power, direct or indirect, to cause the
-      direction or management of such entity, whether by contract or
-      otherwise, or (ii) ownership of fifty percent (50%) or more of the
-      outstanding shares, or (iii) beneficial ownership of such entity.
-
-      "You" (or "Your") shall mean an individual or Legal Entity
-      exercising permissions granted by this License.
-
-      "Source" form shall mean the preferred form for making modifications,
-      including but not limited to software source code, documentation
-      source, and configuration files.
-
-      "Object" form shall mean any form resulting from mechanical
-      transformation or translation of a Source form, including but
-      not limited to compiled object code, generated documentation,
-      and conversions to other media types.
-
-      "Work" shall mean the work of authorship, whether in Source or
-      Object form, made available under the License, as indicated by a
-      copyright notice that is included in or attached to the work
-      (an example is provided in the Appendix below).
-
-      "Derivative Works" shall mean any work, whether in Source or Object
-      form, that is based on (or derived from) the Work and for which the
-      editorial revisions, annotations, elaborations, or other modifications
-      represent, as a whole, an original work of authorship. For the purposes
-      of this License, Derivative Works shall not include works that remain
-      separable from, or merely link (or bind by name) to the interfaces of,
-      the Work and Derivative Works thereof.
-
-      "Contribution" shall mean any work of authorship, including
-      the original version of the Work and any modifications or additions
-      to that Work or Derivative Works thereof, that is intentionally
-      submitted to Licensor for inclusion in the Work by the copyright owner
-      or by an individual or Legal Entity authorized to submit on behalf of
-      the copyright owner. For the purposes of this definition, "submitted"
-      means any form of electronic, verbal, or written communication sent
-      to the Licensor or its representatives, including but not limited to
-      communication on electronic mailing lists, source code control systems,
-      and issue tracking systems that are managed by, or on behalf of, the
-      Licensor for the purpose of discussing and improving the Work, but
-      excluding communication that is conspicuously marked or otherwise
-      designated in writing by the copyright owner as "Not a Contribution."
-
-      "Contributor" shall mean Licensor and any individual or Legal Entity
-      on behalf of whom a Contribution has been received by Licensor and
-      subsequently incorporated within the Work.
-
-   2. Grant of Copyright License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      copyright license to reproduce, prepare Derivative Works of,
-      publicly display, publicly perform, sublicense, and distribute the
-      Work and such Derivative Works in Source or Object form.
-
-   3. Grant of Patent License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      (except as stated in this section) patent license to make, have made,
-      use, offer to sell, sell, import, and otherwise transfer the Work,
-      where such license applies only to those patent claims licensable
-      by such Contributor that are necessarily infringed by their
-      Contribution(s) alone or by combination of their Contribution(s)
-      with the Work to which such Contribution(s) was submitted. If You
-      institute patent litigation against any entity (including a
-      cross-claim or counterclaim in a lawsuit) alleging that the Work
-      or a Contribution incorporated within the Work constitutes direct
-      or contributory patent infringement, then any patent licenses
-      granted to You under this License for that Work shall terminate
-      as of the date such litigation is filed.
-
-   4. Redistribution. You may reproduce and distribute copies of the
-      Work or Derivative Works thereof in any medium, with or without
-      modifications, and in Source or Object form, provided that You
-      meet the following conditions:
-
-      (a) You must give any other recipients of the Work or
-          Derivative Works a copy of this License; and
-
-      (b) You must cause any modified files to carry prominent notices
-          stating that You changed the files; and
-
-      (c) You must retain, in the Source form of any Derivative Works
-          that You distribute, all copyright, patent, trademark, and
-          attribution notices from the Source form of the Work,
-          excluding those notices that do not pertain to any part of
-          the Derivative Works; and
-
-      (d) If the Work includes a "NOTICE" text file as part of its
-          distribution, then any Derivative Works that You distribute must
-          include a readable copy of the attribution notices contained
-          within such NOTICE file, excluding those notices that do not
-          pertain to any part of the Derivative Works, in at least one
-          of the following places: within a NOTICE text file distributed
-          as part of the Derivative Works; within the Source form or
-          documentation, if provided along with the Derivative Works; or,
-          within a display generated by the Derivative Works, if and
-          wherever such third-party notices normally appear. The contents
-          of the NOTICE file are for informational purposes only and
-          do not modify the License. You may add Your own attribution
-          notices within Derivative Works that You distribute, alongside
-          or as an addendum to the NOTICE text from the Work, provided
-          that such additional attribution notices cannot be construed
-          as modifying the License.
-
-      You may add Your own copyright statement to Your modifications and
-      may provide additional or different license terms and conditions
-      for use, reproduction, or distribution of Your modifications, or
-      for any such Derivative Works as a whole, provided Your use,
-      reproduction, and distribution of the Work otherwise complies with
-      the conditions stated in this License.
-
-   5. Submission of Contributions. Unless You explicitly state otherwise,
-      any Contribution intentionally submitted for inclusion in the Work
-      by You to the Licensor shall be under the terms and conditions of
-      this License, without any additional terms or conditions.
-      Notwithstanding the above, nothing herein shall supersede or modify
-      the terms of any separate license agreement you may have executed
-      with Licensor regarding such Contributions.
-
-   6. Trademarks. This License does not grant permission to use the trade
-      names, trademarks, service marks, or product names of the Licensor,
-      except as required for reasonable and customary use in describing the
-      origin of the Work and reproducing the content of the NOTICE file.
-
-   7. Disclaimer of Warranty. Unless required by applicable law or
-      agreed to in writing, Licensor provides the Work (and each
-      Contributor provides its Contributions) on an "AS IS" BASIS,
-      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
-      implied, including, without limitation, any warranties or conditions
-      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
-      PARTICULAR PURPOSE. You are solely responsible for determining the
-      appropriateness of using or redistributing the Work and assume any
-      risks associated with Your exercise of permissions under this License.
-
-   8. Limitation of Liability. In no event and under no legal theory,
-      whether in tort (including negligence), contract, or otherwise,
-      unless required by applicable law (such as deliberate and grossly
-      negligent acts) or agreed to in writing, shall any Contributor be
-      liable to You for damages, including any direct, indirect, special,
-      incidental, or consequential damages of any character arising as a
-      result of this License or out of the use or inability to use the
-      Work (including but not limited to damages for loss of goodwill,
-      work stoppage, computer failure or malfunction, or any and all
-      other commercial damages or losses), even if such Contributor
-      has been advised of the possibility of such damages.
-
-   9. Accepting Warranty or Additional Liability. While redistributing
-      the Work or Derivative Works thereof, You may choose to offer,
-      and charge a fee for, acceptance of support, warranty, indemnity,
-      or other liability obligations and/or rights consistent with this
-      License. However, in accepting such obligations, You may act only
-      on Your own behalf and on Your sole responsibility, not on behalf
-      of any other Contributor, and only if You agree to indemnify,
-      defend, and hold each Contributor harmless for any liability
-      incurred by, or claims asserted against, such Contributor by reason
-      of your accepting any such warranty or additional liability.
-
-   END OF TERMS AND CONDITIONS
-
diff --git a/files/README_add-ons.txt b/files/README_add-ons.txt
deleted file mode 100644
index b8eb1d6..0000000
--- a/files/README_add-ons.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-Add-on folder.
-Drop vendor supplied SDK add-on in this folder.
\ No newline at end of file
diff --git a/files/adb_has_moved.txt b/files/adb_has_moved.txt
deleted file mode 100644
index ab7cfd2..0000000
--- a/files/adb_has_moved.txt
+++ /dev/null
@@ -1,10 +0,0 @@
-The adb tool has moved to platform-tools/
-
-If you don't see this directory in your SDK,
-launch the SDK and AVD Manager (execute the android tool)
-and install "Android SDK Platform-tools"
-
-Please also update your PATH environment variable to
-include the platform-tools/ directory, so you can
-execute adb from any location.
-
diff --git a/files/alias_rules.xml b/files/alias_rules.xml
deleted file mode 100644
index 273da45..0000000
--- a/files/alias_rules.xml
+++ /dev/null
@@ -1,56 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-ALIAS PROJECTS ARE CURRENT NOT SUPPORTED.
-THIS FILE IS CURRENTLY BROKEN AND SHOULD NOT BE USED.
--->
-<project name="alias_rules" default="package">
-
-    <!-- No user serviceable parts below. -->
-
-    <!-- Input directories -->
-    <property name="resource.dir" value="res" />
-
-    <!-- The final package file to generate -->
-    <property name="out.package" value="${ant.project.name}.apk" />
-
-    <!-- Tools -->
-    <condition property="aapt" value="${android.tools.dir}/aapt.exe" else="${android.tools.dir}/aapt">
-        <os family="windows" />
-    </condition>
-    <condition property="adb" value="${android.tools.dir}/adb.exe" else="${android.tools.dir}/adb">
-        <os family="windows" />
-    </condition>
-    <property name="android.jar" value="${sdk.dir}/android.jar" />
-
-    <!-- Rules -->
-
-    <!-- Packages the manifest and the resource files -->
-    <target name="package-res">
-        <echo>Packaging resources...</echo>
-        <exec executable="${aapt}" failonerror="true">
-            <arg value="package" />
-            <arg value="-f" />
-            <arg value="-M" />
-            <arg value="AndroidManifest.xml" />
-            <arg value="-S" />
-            <arg value="${resource.dir}" />
-            <arg value="-I" />
-            <arg value="${android.jar}" />
-            <arg value="-F" />
-            <arg value="${out.package}" />
-        </exec>
-    </target>
-
-    <!-- Create the package file for this project from the sources. -->
-    <target name="package" depends="package-res" />
-
-    <!-- Create the package and install package on the default emulator -->
-    <target name="install" depends="package">
-        <echo>Sending package to default emulator...</echo>
-        <exec executable="${adb}" failonerror="true">
-            <arg value="install" />
-            <arg value="${out.package}" />
-        </exec>
-    </target>
-
-</project>
diff --git a/files/android.el b/files/android.el
deleted file mode 100644
index 5c66218..0000000
--- a/files/android.el
+++ /dev/null
@@ -1,131 +0,0 @@
-;;;; Copyright 2007 The Android Open Source Project
-
-;;; Set up GUD+JDB to attach to a Java process running on the phone or
-;;; under the emulator.
-
-(defvar android-jdb-port-history '("8700")
- "history of ports supplied to `android-jdb'")
-
-(defvar android-jdb-project-root-history '()
- "history of project roots supplied to `android-jdb'")
-(defvar android-jdb-history nil
- "history of commands supplied to `android-jdb'")
-
-(defvar android-jdb-activity-class-history ()
- "history of activity classes supplied to `start-android-activity'")
-
-(defcustom  android-jdb-command-name "jdb"
-  "Name of Java debugger."
-  :type 'string
-  :group 'android)
-
-(defgroup android nil
-  "Android Applications."
-  :group 'applications)
-
-(defcustom android-project-root nil
- "This is where your Android project root is stored."
-  :type 'directory
- :group 'android )
-
-(defcustom android-apk nil
- "This is where your Android Application Package is stored."
- :type 'string
- :group 'android)
-
-(defcustom android-activity-class nil
- "This is where your Android Activity class is stored."
- :type 'string
- :group 'android)
-
-(defun android-read-project-root ()
- (if (or (string-match "XEmacs" emacs-version)
-         (>= emacs-major-version 22))
-     (read-file-name "Android project root: "
-                     android-project-root
-                     nil
-                     t
-                     nil
-                     'file-directory-p)
-   (labels ((read-directory ()
-                            (read-file-name "Android project root: "
-                                            android-project-root
-                                            nil
-                                            t
-                                            nil)))
-     (do ((entered-root (read-directory) (read-directory)))
-         ((and entered-root
-               (file-directory-p entered-root))
-          (expand-file-name entered-root))))))
-
-(defun android-jdb (port root)
- "Set GUD+JDB up to run against Android on PORT in directory ROOT."
- (interactive
-  (list
-   (read-from-minibuffer "Activity's JDWP DDMS port: "
-                     (car android-jdb-port-history)
-                     nil
-                     t
-                     'android-jdb-port-history)
-                    (android-read-project-root)))
- (setq android-project-root root)
- (let ((jdb-command
-        (format "%s -attach localhost:%s -sourcepath%s"
-                android-jdb-command-name
-                port
-                (format "%s/src" root))))
-   (if (not (string= jdb-command (car android-jdb-history)))
-       (push jdb-command android-jdb-history))
-   (jdb jdb-command)))
-
-(defun android-emulate ()
- "Run the Android emulator. This expects the SDK tools directory to be in the current path."
- (interactive)
- (compile "emulator"))
-
-(defun android-install-app (apk)
-  "Install an Android application package APK in the Android emulator. This expects the SDK tools directory to be in the current path."
-  (interactive (list (expand-file-name
-                      (read-file-name "Android Application Package (.apk): "
-                                      nil
-                                      android-apk
-                                      t
-                                      nil
-                                      nil))))
-  (setq android-apk apk)
-  (compile (format "adb install -r %s" apk)))
-
-(defun android-uninstall-app (package-name)
-  "Uninstall an Android application package APK in the Android emulator. This expects the SDK tools directory to be in the current path.
-Specify the package name --- and not the name of the application e.g., com.android.foo."
-  (interactive
-   (list
-    (read-from-minibuffer "Package: ")))
-  (compile (format "adb uninstall %s" package-name)))
-
-(defun android-start-activity (package class)
- "Start the activity PACKAGE/CLASS in the Android emulator. This expects the SDK tools directory to be in the current path."
- (interactive
-  (list
-   (read-from-minibuffer "Package: ")
-   (read-from-minibuffer "Activity Java class: "
-         (car android-jdb-activity-class-history)
-         nil
-         t
-         'android-jdb-activity-class-history)))
- (compile (format "adb shell am start -n %s/%s" package class)))
-
-(defun android-debug-activity (package class)
- "Start the activity PACKAGE/CLASS within the debugger in the Android emulator. This expects the SDK tools directory to be in the current path."
- (interactive
-  (list
-   (read-from-minibuffer "Package: ")
-   (read-from-minibuffer "Activity Java class: "
-         (car android-jdb-activity-class-history)
-         nil
-         t
-         'android-jdb-activity-class-history)))
- (compile (format "adb shell am start -D -n %s/%s" package class)))
-
-(provide 'android)
-
diff --git a/files/ant/NOTICE b/files/ant/NOTICE
deleted file mode 100644
index 06a9081..0000000
--- a/files/ant/NOTICE
+++ /dev/null
@@ -1,190 +0,0 @@
-
-   Copyright (c) 2005-2014, The Android Open Source Project
-
-   Licensed under the Apache License, Version 2.0 (the "License");
-   you may not use this file except in compliance with the License.
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
-
-
-                                 Apache License
-                           Version 2.0, January 2004
-                        http://www.apache.org/licenses/
-
-   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
-   1. Definitions.
-
-      "License" shall mean the terms and conditions for use, reproduction,
-      and distribution as defined by Sections 1 through 9 of this document.
-
-      "Licensor" shall mean the copyright owner or entity authorized by
-      the copyright owner that is granting the License.
-
-      "Legal Entity" shall mean the union of the acting entity and all
-      other entities that control, are controlled by, or are under common
-      control with that entity. For the purposes of this definition,
-      "control" means (i) the power, direct or indirect, to cause the
-      direction or management of such entity, whether by contract or
-      otherwise, or (ii) ownership of fifty percent (50%) or more of the
-      outstanding shares, or (iii) beneficial ownership of such entity.
-
-      "You" (or "Your") shall mean an individual or Legal Entity
-      exercising permissions granted by this License.
-
-      "Source" form shall mean the preferred form for making modifications,
-      including but not limited to software source code, documentation
-      source, and configuration files.
-
-      "Object" form shall mean any form resulting from mechanical
-      transformation or translation of a Source form, including but
-      not limited to compiled object code, generated documentation,
-      and conversions to other media types.
-
-      "Work" shall mean the work of authorship, whether in Source or
-      Object form, made available under the License, as indicated by a
-      copyright notice that is included in or attached to the work
-      (an example is provided in the Appendix below).
-
-      "Derivative Works" shall mean any work, whether in Source or Object
-      form, that is based on (or derived from) the Work and for which the
-      editorial revisions, annotations, elaborations, or other modifications
-      represent, as a whole, an original work of authorship. For the purposes
-      of this License, Derivative Works shall not include works that remain
-      separable from, or merely link (or bind by name) to the interfaces of,
-      the Work and Derivative Works thereof.
-
-      "Contribution" shall mean any work of authorship, including
-      the original version of the Work and any modifications or additions
-      to that Work or Derivative Works thereof, that is intentionally
-      submitted to Licensor for inclusion in the Work by the copyright owner
-      or by an individual or Legal Entity authorized to submit on behalf of
-      the copyright owner. For the purposes of this definition, "submitted"
-      means any form of electronic, verbal, or written communication sent
-      to the Licensor or its representatives, including but not limited to
-      communication on electronic mailing lists, source code control systems,
-      and issue tracking systems that are managed by, or on behalf of, the
-      Licensor for the purpose of discussing and improving the Work, but
-      excluding communication that is conspicuously marked or otherwise
-      designated in writing by the copyright owner as "Not a Contribution."
-
-      "Contributor" shall mean Licensor and any individual or Legal Entity
-      on behalf of whom a Contribution has been received by Licensor and
-      subsequently incorporated within the Work.
-
-   2. Grant of Copyright License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      copyright license to reproduce, prepare Derivative Works of,
-      publicly display, publicly perform, sublicense, and distribute the
-      Work and such Derivative Works in Source or Object form.
-
-   3. Grant of Patent License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      (except as stated in this section) patent license to make, have made,
-      use, offer to sell, sell, import, and otherwise transfer the Work,
-      where such license applies only to those patent claims licensable
-      by such Contributor that are necessarily infringed by their
-      Contribution(s) alone or by combination of their Contribution(s)
-      with the Work to which such Contribution(s) was submitted. If You
-      institute patent litigation against any entity (including a
-      cross-claim or counterclaim in a lawsuit) alleging that the Work
-      or a Contribution incorporated within the Work constitutes direct
-      or contributory patent infringement, then any patent licenses
-      granted to You under this License for that Work shall terminate
-      as of the date such litigation is filed.
-
-   4. Redistribution. You may reproduce and distribute copies of the
-      Work or Derivative Works thereof in any medium, with or without
-      modifications, and in Source or Object form, provided that You
-      meet the following conditions:
-
-      (a) You must give any other recipients of the Work or
-          Derivative Works a copy of this License; and
-
-      (b) You must cause any modified files to carry prominent notices
-          stating that You changed the files; and
-
-      (c) You must retain, in the Source form of any Derivative Works
-          that You distribute, all copyright, patent, trademark, and
-          attribution notices from the Source form of the Work,
-          excluding those notices that do not pertain to any part of
-          the Derivative Works; and
-
-      (d) If the Work includes a "NOTICE" text file as part of its
-          distribution, then any Derivative Works that You distribute must
-          include a readable copy of the attribution notices contained
-          within such NOTICE file, excluding those notices that do not
-          pertain to any part of the Derivative Works, in at least one
-          of the following places: within a NOTICE text file distributed
-          as part of the Derivative Works; within the Source form or
-          documentation, if provided along with the Derivative Works; or,
-          within a display generated by the Derivative Works, if and
-          wherever such third-party notices normally appear. The contents
-          of the NOTICE file are for informational purposes only and
-          do not modify the License. You may add Your own attribution
-          notices within Derivative Works that You distribute, alongside
-          or as an addendum to the NOTICE text from the Work, provided
-          that such additional attribution notices cannot be construed
-          as modifying the License.
-
-      You may add Your own copyright statement to Your modifications and
-      may provide additional or different license terms and conditions
-      for use, reproduction, or distribution of Your modifications, or
-      for any such Derivative Works as a whole, provided Your use,
-      reproduction, and distribution of the Work otherwise complies with
-      the conditions stated in this License.
-
-   5. Submission of Contributions. Unless You explicitly state otherwise,
-      any Contribution intentionally submitted for inclusion in the Work
-      by You to the Licensor shall be under the terms and conditions of
-      this License, without any additional terms or conditions.
-      Notwithstanding the above, nothing herein shall supersede or modify
-      the terms of any separate license agreement you may have executed
-      with Licensor regarding such Contributions.
-
-   6. Trademarks. This License does not grant permission to use the trade
-      names, trademarks, service marks, or product names of the Licensor,
-      except as required for reasonable and customary use in describing the
-      origin of the Work and reproducing the content of the NOTICE file.
-
-   7. Disclaimer of Warranty. Unless required by applicable law or
-      agreed to in writing, Licensor provides the Work (and each
-      Contributor provides its Contributions) on an "AS IS" BASIS,
-      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
-      implied, including, without limitation, any warranties or conditions
-      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
-      PARTICULAR PURPOSE. You are solely responsible for determining the
-      appropriateness of using or redistributing the Work and assume any
-      risks associated with Your exercise of permissions under this License.
-
-   8. Limitation of Liability. In no event and under no legal theory,
-      whether in tort (including negligence), contract, or otherwise,
-      unless required by applicable law (such as deliberate and grossly
-      negligent acts) or agreed to in writing, shall any Contributor be
-      liable to You for damages, including any direct, indirect, special,
-      incidental, or consequential damages of any character arising as a
-      result of this License or out of the use or inability to use the
-      Work (including but not limited to damages for loss of goodwill,
-      work stoppage, computer failure or malfunction, or any and all
-      other commercial damages or losses), even if such Contributor
-      has been advised of the possibility of such damages.
-
-   9. Accepting Warranty or Additional Liability. While redistributing
-      the Work or Derivative Works thereof, You may choose to offer,
-      and charge a fee for, acceptance of support, warranty, indemnity,
-      or other liability obligations and/or rights consistent with this
-      License. However, in accepting such obligations, You may act only
-      on Your own behalf and on Your sole responsibility, not on behalf
-      of any other Contributor, and only if You agree to indemnify,
-      defend, and hold each Contributor harmless for any liability
-      incurred by, or claims asserted against, such Contributor by reason
-      of your accepting any such warranty or additional liability.
-
-   END OF TERMS AND CONDITIONS
-
diff --git a/files/ant/build.xml b/files/ant/build.xml
deleted file mode 100644
index aab440c..0000000
--- a/files/ant/build.xml
+++ /dev/null
@@ -1,1534 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project name="android_rules" default="debug">
-
-    <!--
-        This build file is imported by the project build file. It contains
-        all the targets and tasks necessary to build Android projects, be they
-        regular projects, library projects, or test projects.
-
-        At the beginning of the file is a list of properties that can be overridden
-        by adding them to your ant.properties (properties are immutable, so their
-        first definition sticks and is never changed).
-
-        Follows:
-        - custom task definitions,
-        - more properties (do not override those unless the whole build system is modified).
-        - macros used throughout the build,
-        - base build targets,
-        - debug-specific build targets,
-        - release-specific build targets,
-        - instrument-specific build targets,
-        - test project-specific build targets,
-        - install targets,
-        - help target
-    -->
-
-    <!-- ******************************************************* -->
-    <!-- **************** Overridable Properties *************** -->
-    <!-- ******************************************************* -->
-
-    <!-- You can override these values in your build.xml or ant.properties.
-         Overriding any other properties may result in broken build. -->
-
-    <!-- Tells adb which device to target. You can change this from the command line
-         by invoking "ant -Dadb.device.arg=-d" for device "ant -Dadb.device.arg=-e" for
-         the emulator. -->
-    <property name="adb.device.arg" value="" />
-
-    <!-- fileset exclude patterns (space separated) to prevent
-         files inside src/ from being packaged. -->
-    <property name="android.package.excludes" value="" />
-
-    <!-- set some properties used for filtering/override. If those weren't defined
-         before, then this will create them with empty values, which are then ignored
-         by the custom tasks receiving them. -->
-    <property name="version.code" value="" />
-    <property name="version.name" value="" />
-    <property name="aapt.resource.filter" value="" />
-    <!-- 'aapt.ignore.assets' is the list of file patterns to ignore under /res and /assets.
-         Default is "!.svn:!.git:.*:<dir>_*:!CVS:!thumbs.db:!picasa.ini:!*.scc:*~"
-
-         Overall patterns syntax is:
-           [!][<dir>|<file>][*suffix-match|prefix-match*|full-match]:more:patterns...
-
-         - The first character flag ! avoids printing a warning.
-         - Pattern can have the flag "<dir>" to match only directories
-           or "<file>" to match only files. Default is to match both.
-         - Match is not case-sensitive.
-    -->
-    <property name="aapt.ignore.assets" value="" />
-
-    <!-- dex force jumbo options, to be used when dex merging fails with
-         UNEXPECTED TOP-LEVEL EXCEPTION: com.android.dx.util.DexException: Cannot handle conversion to jumbo index!
-           at com.android.dx.merge.InstructionTransformer.jumboCheck(InstructionTransformer.java:103)
-           ...
-    -->
-    <property name="dex.force.jumbo" value="false" />
-    <property name="dex.disable.merger" value="false" />
-
-    <!-- compilation options -->
-    <property name="java.encoding" value="UTF-8" />
-    <property name="java.target" value="1.5" />
-    <property name="java.source" value="1.5" />
-    <property name="java.compilerargs" value="" />
-    <property name="java.compiler.classpath" value="" />
-
-    <!-- Renderscript options -->
-    <property name="renderscript.debug.opt.level" value="O0" />
-    <property name="renderscript.release.opt.level" value="O3" />
-    <property name="renderscript.support.mode" value="false" />
-
-    <!-- manifest merger default value -->
-    <property name="manifestmerger.enabled" value="false" />
-
-    <!-- instrumentation options -->
-    <property name="emma.filter" value="" />
-
-    <!-- Verbosity -->
-    <property name="verbose" value="false" />
-
-    <!-- Output location of the HTML report for the "lint" target.
-         Ideally this would be specified as
-            value="${out.dir}/lint-results.html"
-         but we can't make a forward reference to the definition for
-         ${out.dir}, and it is not a configurable property (yet).
-     -->
-    <property name="lint.out.html" value="bin/lint-results.html" />
-
-    <!-- Output location of the XML report for the "lint" target -->
-    <property name="lint.out.xml" value="bin/lint-results.xml" />
-
-    <!-- ******************************************************* -->
-    <!-- ********************* Custom Tasks ******************** -->
-    <!-- ******************************************************* -->
-
-    <!-- jar file from where the tasks are loaded -->
-    <path id="android.antlibs">
-        <pathelement path="${sdk.dir}/tools/lib/ant-tasks.jar" />
-    </path>
-
-    <!-- Custom tasks -->
-    <taskdef resource="anttasks.properties" classpathref="android.antlibs" />
-
-    <!-- Emma configuration -->
-    <property name="emma.dir" value="${sdk.dir}/tools/lib" />
-    <path id="emma.lib">
-        <pathelement location="${emma.dir}/emma.jar" />
-        <pathelement location="${emma.dir}/emma_ant.jar" />
-    </path>
-    <taskdef resource="emma_ant.properties" classpathref="emma.lib" />
-    <!-- End of emma configuration -->
-
-
-    <!-- ******************************************************* -->
-    <!-- ******************* Other Properties ****************** -->
-    <!-- ******************************************************* -->
-    <!-- overriding these properties may break the build
-         unless the whole file is updated -->
-
-    <!-- Input directories -->
-    <property name="source.dir" value="src" />
-    <property name="source.absolute.dir" location="${source.dir}" />
-    <property name="gen.absolute.dir" location="gen" />
-    <property name="resource.absolute.dir" location="res" />
-    <property name="asset.dir" value="assets" />
-    <property name="asset.absolute.dir" location="${asset.dir}" />
-    <property name="jar.libs.dir" value="libs" />
-    <property name="jar.libs.absolute.dir" location="${jar.libs.dir}" />
-    <property name="native.libs.absolute.dir" location="libs" />
-
-    <property name="manifest.file" value="AndroidManifest.xml" />
-    <property name="manifest.abs.file" location="${manifest.file}" />
-
-    <!-- Output directories -->
-    <property name="out.dir" value="bin" />
-    <property name="out.absolute.dir" location="${out.dir}" />
-    <property name="out.classes.absolute.dir" location="${out.dir}/classes" />
-    <property name="out.res.absolute.dir" location="${out.dir}/res" />
-    <property name="out.rs.obj.absolute.dir" location="${out.dir}/rsObj" />
-    <property name="out.rs.libs.absolute.dir" location="${out.dir}/rsLibs" />
-    <property name="out.aidl.absolute.dir" location="${out.dir}/aidl" />
-    <property name="out.dexed.absolute.dir" location="${out.dir}/dexedLibs" />
-    <property name="out.manifest.abs.file" location="${out.dir}/AndroidManifest.xml" />
-
-    <!-- tools location -->
-    <property name="android.tools.dir" location="${sdk.dir}/tools" />
-    <property name="android.platform.tools.dir" location="${sdk.dir}/platform-tools" />
-    <condition property="exe" value=".exe" else=""><os family="windows" /></condition>
-    <condition property="bat" value=".bat" else=""><os family="windows" /></condition>
-    <property name="adb" location="${android.platform.tools.dir}/adb${exe}" />
-    <property name="lint" location="${android.tools.dir}/lint${bat}" />
-
-    <!-- Intermediate files -->
-    <property name="dex.file.name" value="classes.dex" />
-    <property name="intermediate.dex.file" location="${out.absolute.dir}/${dex.file.name}" />
-    <property name="resource.package.file.name" value="${ant.project.name}.ap_" />
-
-    <!-- Build property file -->
-    <property name="out.build.prop.file" location="${out.absolute.dir}/build.prop" />
-
-
-    <!-- This is needed by emma as it uses multilevel verbosity instead of simple 'true' or 'false'
-         The property 'verbosity' is not user configurable and depends exclusively on 'verbose'
-         value.-->
-    <condition property="verbosity" value="verbose" else="quiet">
-        <istrue value="${verbose}" />
-    </condition>
-
-    <!-- properties for signing in release mode -->
-    <condition property="has.keystore">
-        <and>
-            <isset property="key.store" />
-            <length string="${key.store}" when="greater" length="0" />
-            <isset property="key.alias" />
-        </and>
-    </condition>
-    <condition property="has.password">
-        <and>
-            <isset property="has.keystore" />
-            <isset property="key.store.password" />
-            <isset property="key.alias.password" />
-        </and>
-    </condition>
-
-    <!-- properties for packaging -->
-    <property name="build.packaging.nocrunch" value="true" />
-
-    <!-- whether we need to fork javac.
-         This is only needed on Windows when running Java < 7 -->
-    <condition else="false" property="need.javac.fork">
-        <and>
-            <matches pattern="1\.[56]" string="${java.specification.version}"/>
-            <not>
-                <os family="unix"/>
-            </not>
-        </and>
-    </condition>
-
-    <!-- ******************************************************* -->
-    <!-- ************************ Macros *********************** -->
-    <!-- ******************************************************* -->
-
-    <!-- macro to do a task on if project.is.library is false.
-         elseText attribute is displayed otherwise -->
-    <macrodef name="do-only-if-not-library">
-        <attribute name="elseText" />
-        <element name="task-to-do" implicit="yes" />
-        <sequential>
-        <if condition="${project.is.library}">
-            <else>
-                <task-to-do />
-            </else>
-            <then>
-                <echo level="info">@{elseText}</echo>
-            </then>
-        </if>
-        </sequential>
-    </macrodef>
-
-    <!-- macro to do a task on if manifest.hasCode is true.
-         elseText attribute is displayed otherwise -->
-    <macrodef name="do-only-if-manifest-hasCode">
-        <attribute name="elseText" default=""/>
-        <element name="task-to-do" implicit="yes" />
-        <sequential>
-        <if condition="${manifest.hasCode}">
-            <then>
-                <task-to-do />
-            </then>
-            <else>
-                <if>
-                    <condition>
-                        <length string="@{elseText}" trim="true" when="greater" length="0" />
-                    </condition>
-                    <then>
-                        <echo level="info">@{elseText}</echo>
-                    </then>
-                </if>
-            </else>
-        </if>
-        </sequential>
-    </macrodef>
-
-
-    <!-- Configurable macro, which allows to pass as parameters output directory,
-         output dex filename and external libraries to dex (optional) -->
-    <macrodef name="dex-helper">
-        <element name="external-libs" optional="yes" />
-        <attribute name="nolocals" default="false" />
-        <sequential>
-            <!-- sets the primary input for dex. If a pre-dex task sets it to
-                 something else this has no effect -->
-            <property name="out.dex.input.absolute.dir" value="${out.classes.absolute.dir}" />
-
-            <!-- set the secondary dx input: the project (and library) jar files
-                 If a pre-dex task sets it to something else this has no effect -->
-            <if>
-                <condition>
-                    <isreference refid="out.dex.jar.input.ref" />
-                </condition>
-                <else>
-                    <path id="out.dex.jar.input.ref">
-                        <path refid="project.all.jars.path" />
-                    </path>
-                </else>
-            </if>
-
-            <dex executable="${dx}"
-                    output="${intermediate.dex.file}"
-                    dexedlibs="${out.dexed.absolute.dir}"
-                    nolocals="@{nolocals}"
-                    forceJumbo="${dex.force.jumbo}"
-                    disableDexMerger="${dex.disable.merger}"
-                    verbose="${verbose}">
-                <path path="${out.dex.input.absolute.dir}"/>
-                <path refid="out.dex.jar.input.ref" />
-                <external-libs />
-            </dex>
-        </sequential>
-    </macrodef>
-
-    <!-- This is macro that enable passing variable list of external jar files to ApkBuilder
-         Example of use:
-         <package-helper>
-             <extra-jars>
-                <jarfolder path="my_jars" />
-                <jarfile path="foo/bar.jar" />
-                <jarfolder path="your_jars" />
-             </extra-jars>
-         </package-helper> -->
-    <macrodef name="package-helper">
-        <element name="extra-jars" optional="yes" />
-        <sequential>
-            <apkbuilder
-                    outfolder="${out.absolute.dir}"
-                    resourcefile="${resource.package.file.name}"
-                    apkfilepath="${out.packaged.file}"
-                    debugpackaging="${build.is.packaging.debug}"
-                    debugsigning="${build.is.signing.debug}"
-                    verbose="${verbose}"
-                    hascode="${manifest.hasCode}"
-                    previousBuildType="${build.last.is.packaging.debug}/${build.last.is.signing.debug}"
-                    buildType="${build.is.packaging.debug}/${build.is.signing.debug}">
-                <dex path="${intermediate.dex.file}"/>
-                <sourcefolder path="${source.absolute.dir}"/>
-                <jarfile refid="project.all.jars.path" />
-                <nativefolder path="${native.libs.absolute.dir}" />
-                <nativefolder refid="project.library.native.folder.path" />
-                <nativefolder refid="project.rs.support.libs.path" />
-                <nativefolder path="${out.rs.libs.absolute.dir}" />
-                <extra-jars/>
-            </apkbuilder>
-        </sequential>
-    </macrodef>
-
-    <!-- This is macro which zipaligns in.package and outputs it to out.package. Used by targets
-         debug, -debug-with-emma and release.-->
-    <macrodef name="zipalign-helper">
-        <attribute name="in.package" />
-        <attribute name="out.package" />
-        <sequential>
-            <zipalign
-                    executable="${zipalign}"
-                    input="@{in.package}"
-                    output="@{out.package}"
-                    verbose="${verbose}" />
-        </sequential>
-    </macrodef>
-
-    <macrodef name="run-tests-helper">
-        <attribute name="emma.enabled" default="false" />
-        <element name="extra-instrument-args" optional="yes" />
-        <sequential>
-            <echo level="info">Running tests ...</echo>
-            <exec executable="${adb}" failonerror="true">
-                <arg line="${adb.device.arg}" />
-                <arg value="shell" />
-                <arg value="am" />
-                <arg value="instrument" />
-                <arg value="-w" />
-                <arg value="-e" />
-                <arg value="coverage" />
-                <arg value="@{emma.enabled}" />
-                <extra-instrument-args />
-                <arg value="${project.app.package}/${test.runner}" />
-            </exec>
-        </sequential>
-    </macrodef>
-
-    <macrodef name="record-build-key">
-        <attribute name="key" default="false" />
-        <attribute name="value" default="false" />
-        <sequential>
-            <propertyfile file="${out.build.prop.file}" comment="Last build type">
-                <entry key="@{key}" value="@{value}"/>
-            </propertyfile>
-        </sequential>
-    </macrodef>
-
-    <macrodef name="record-build-info">
-        <sequential>
-            <record-build-key key="build.last.target" value="${build.target}" />
-            <record-build-key key="build.last.is.instrumented" value="${build.is.instrumented}" />
-            <record-build-key key="build.last.is.packaging.debug" value="${build.is.packaging.debug}" />
-            <record-build-key key="build.last.is.signing.debug" value="${build.is.signing.debug}" />
-        </sequential>
-    </macrodef>
-
-    <macrodef name="uninstall-helper">
-        <attribute name="app.package" default="false" />
-        <sequential>
-            <echo level="info">Uninstalling @{app.package} from the default emulator or device...</echo>
-            <exec executable="${adb}" failonerror="true">
-                <arg line="${adb.device.arg}" />
-                <arg value="uninstall" />
-                <arg value="@{app.package}" />
-            </exec>
-        </sequential>
-    </macrodef>
-
-    <!-- ******************************************************* -->
-    <!-- ******************** Build Targets ******************** -->
-    <!-- ******************************************************* -->
-
-    <!-- Basic Ant + SDK check -->
-    <target name="-check-env">
-        <checkenv />
-    </target>
-
-    <!-- target to disable building dependencies -->
-    <target name="nodeps">
-        <property name="dont.do.deps" value="true" />
-    </target>
-
-    <!-- generic setup -->
-    <target name="-setup" depends="-check-env">
-        <echo level="info">Project Name: ${ant.project.name}</echo>
-        <gettype projectTypeOut="project.type" />
-
-        <!-- sets a few boolean based on project.type
-             to make the if task easier -->
-        <condition property="project.is.library" value="true" else="false">
-            <equals arg1="${project.type}" arg2="library" />
-        </condition>
-        <condition property="project.is.test" value="true" else="false">
-            <equals arg1="${project.type}" arg2="test" />
-        </condition>
-        <condition property="project.is.testapp" value="true" else="false">
-            <equals arg1="${project.type}" arg2="test-app" />
-        </condition>
-
-        <!-- If a test project, resolve absolute path to tested project. -->
-        <if condition="${project.is.test}">
-            <then>
-                <property name="tested.project.absolute.dir" location="${tested.project.dir}" />
-            </then>
-        </if>
-
-        <!-- get the project manifest package -->
-        <xpath input="${manifest.abs.file}"
-                expression="/manifest/@package" output="project.app.package" />
-
-    </target>
-
-    <!-- empty default pre-clean target. Create a similar target in
-         your build.xml and it'll be called instead of this one. -->
-    <target name="-pre-clean"/>
-
-    <!-- clean target -->
-    <target name="clean" depends="-setup, -pre-clean"
-            description="Removes output files created by other targets.">
-        <delete dir="${out.absolute.dir}" verbose="${verbose}" />
-        <delete dir="${gen.absolute.dir}" verbose="${verbose}" />
-
-        <!-- if we know about a tested project or libraries, we clean them too. -->
-        <if condition="${project.is.test}">
-            <then>
-                <property name="tested.project.absolute.dir" location="${tested.project.dir}" />
-                <subant failonerror="true">
-                    <fileset dir="${tested.project.absolute.dir}" includes="build.xml" />
-                    <target name="clean" />
-                </subant>
-            </then>
-        </if>
-
-        <!-- get all the libraries -->
-        <if>
-            <condition><not><isset property="dont.do.deps" /></not></condition>
-            <then>
-                <getlibpath libraryFolderPathOut="project.library.folder.path" />
-                <if>
-                    <condition>
-                        <isreference refid="project.library.folder.path" />
-                    </condition>
-                    <then>
-                        <!-- clean the libraries with nodeps since we already
-                             know about all the libraries even the indirect one -->
-                        <subant
-                                buildpathref="project.library.folder.path"
-                                antfile="build.xml"
-                                failonerror="true">
-                            <target name="nodeps" />
-                            <target name="clean" />
-                        </subant>
-                    </then>
-                </if>
-            </then>
-        </if>
-    </target>
-
-    <!-- Pre build setup -->
-    <target name="-build-setup" depends="-setup">
-        <!-- find location of build tools -->
-        <getbuildtools name="android.build.tools.dir" verbose="${verbose}" />
-
-        <!-- read the previous build mode -->
-        <property file="${out.build.prop.file}" />
-        <!-- if empty the props won't be set, meaning it's a new build.
-             To force a build, set the prop to empty values. -->
-        <property name="build.last.target" value="" />
-        <property name="build.last.is.instrumented" value="" />
-        <property name="build.last.is.packaging.debug" value="" />
-        <property name="build.last.is.signing.debug" value="" />
-
-        <!-- If the "debug" build type changed, clear out the compiled code.
-             This is to make sure the new BuildConfig.DEBUG value is picked up
-             as javac can't deal with this type of change in its dependency computation. -->
-        <if>
-            <condition>
-                <and>
-                    <length string="${build.last.is.packaging.debug}" trim="true" when="greater" length="0" />
-                    <not><equals
-                            arg1="${build.is.packaging.debug}"
-                            arg2="${build.last.is.packaging.debug}" /></not>
-                </and>
-            </condition>
-            <then>
-                <echo level="info">Switching between debug and non debug build: Deleting previous compilation output...</echo>
-                <delete dir="${out.classes.absolute.dir}" verbose="${verbose}" />
-            </then>
-            <else>
-                <!-- Else, we may still need to clean the code, for another reason.
-                     special case for instrumented: if the previous build was
-                     instrumented but not this one, clear out the compiled code -->
-                <if>
-                    <condition>
-                        <and>
-                            <istrue value="${build.last.is.instrumented}" />
-                            <isfalse value="${build.is.instrumented}" />
-                        </and>
-                    </condition>
-                    <then>
-                        <echo level="info">Switching from instrumented to non-instrumented build: Deleting previous compilation output...</echo>
-                        <delete dir="${out.classes.absolute.dir}" verbose="${verbose}" />
-                    </then>
-                </if>
-            </else>
-        </if>
-
-        <echo level="info">Resolving Build Target for ${ant.project.name}...</echo>
-        <!-- load project properties, resolve Android target, library dependencies
-             and set some properties with the results.
-             All property names are passed as parameters ending in -Out -->
-        <gettarget
-                androidJarFileOut="project.target.android.jar"
-                androidAidlFileOut="project.target.framework.aidl"
-                bootClassPathOut="project.target.class.path"
-                targetApiOut="project.target.apilevel"
-                minSdkVersionOut="project.minSdkVersion" />
-
-        <!-- Value of the hasCode attribute (Application node) extracted from manifest file -->
-        <xpath input="${manifest.abs.file}" expression="/manifest/application/@android:hasCode"
-                    output="manifest.hasCode" default="true"/>
-
-        <echo level="info">----------</echo>
-        <echo level="info">Creating output directories if needed...</echo>
-        <mkdir dir="${resource.absolute.dir}" />
-        <mkdir dir="${jar.libs.absolute.dir}" />
-        <mkdir dir="${out.absolute.dir}" />
-        <mkdir dir="${out.res.absolute.dir}" />
-        <mkdir dir="${out.rs.obj.absolute.dir}" />
-        <mkdir dir="${out.rs.libs.absolute.dir}" />
-        <do-only-if-manifest-hasCode>
-            <mkdir dir="${gen.absolute.dir}" />
-            <mkdir dir="${out.classes.absolute.dir}" />
-            <mkdir dir="${out.dexed.absolute.dir}" />
-        </do-only-if-manifest-hasCode>
-
-        <echo level="info">----------</echo>
-        <echo level="info">Resolving Dependencies for ${ant.project.name}...</echo>
-        <dependency
-                libraryFolderPathOut="project.library.folder.path"
-                libraryPackagesOut="project.library.packages"
-                libraryManifestFilePathOut="project.library.manifest.file.path"
-                libraryResFolderPathOut="project.library.res.folder.path"
-                libraryBinAidlFolderPathOut="project.library.bin.aidl.folder.path"
-                libraryRFilePathOut="project.library.bin.r.file.path"
-                libraryNativeFolderPathOut="project.library.native.folder.path"
-                jarLibraryPathOut="project.all.jars.path"
-                targetApi="${project.target.apilevel}"
-                renderscriptSupportMode="${renderscript.support.mode}"
-                buildToolsFolder="${android.build.tools.dir}"
-                renderscriptSupportLibsOut="project.rs.support.libs.path"
-                verbose="${verbose}" />
-
-        <!-- compile the libraries if any -->
-        <if>
-            <condition>
-                <and>
-                    <isreference refid="project.library.folder.path" />
-                    <not><isset property="dont.do.deps" /></not>
-                </and>
-            </condition>
-            <then>
-                <!-- figure out which target must be used to build the library projects.
-                     If emma is enabled, then use 'instrument' otherwise, use 'debug' -->
-                <condition property="project.libraries.target" value="instrument" else="${build.target}">
-                    <istrue value="${build.is.instrumented}" />
-                </condition>
-
-                <echo level="info">----------</echo>
-                <echo level="info">Building Libraries with '${project.libraries.target}'...</echo>
-
-                <!-- no need to build the deps as we have already
-                     the full list of libraries -->
-                <subant failonerror="true"
-                        buildpathref="project.library.folder.path"
-                        antfile="build.xml">
-                    <target name="nodeps" />
-                    <target name="${project.libraries.target}" />
-                    <property name="emma.coverage.absolute.file" location="${out.absolute.dir}/coverage.em" />
-                </subant>
-            </then>
-        </if>
-
-        <!-- compile the main project if this is a test project -->
-        <if condition="${project.is.test}">
-            <then>
-                <!-- figure out which target must be used to build the tested project.
-                     If emma is enabled, then use 'instrument' otherwise, use 'debug' -->
-                <condition property="tested.project.target" value="instrument" else="debug">
-                    <isset property="emma.enabled" />
-                </condition>
-
-                <echo level="info">----------</echo>
-                <echo level="info">Building tested project at ${tested.project.absolute.dir} with '${tested.project.target}'...</echo>
-                <subant target="${tested.project.target}" failonerror="true">
-                    <fileset dir="${tested.project.absolute.dir}" includes="build.xml" />
-                </subant>
-
-                <!-- get the tested project full classpath to be able to build
-                     the test project -->
-                <testedprojectclasspath
-                        projectLocation="${tested.project.absolute.dir}"
-                        projectClassPathOut="tested.project.classpath"/>
-            </then>
-            <else>
-                <!-- no tested project, make an empty Path object so that javac doesn't
-                     complain -->
-                <path id="tested.project.classpath" />
-            </else>
-        </if>
-    </target>
-
-    <!-- empty default pre-build target. Create a similar target in
-         your build.xml and it'll be called instead of this one. -->
-    <target name="-pre-build"/>
-
-    <!-- Code Generation: compile resources (aapt -> R.java), aidl, renderscript -->
-    <target name="-code-gen">
-        <!-- always merge manifest -->
-        <mergemanifest
-                appManifest="${manifest.abs.file}"
-                outManifest="${out.manifest.abs.file}"
-                enabled="${manifestmerger.enabled}">
-            <library refid="project.library.manifest.file.path" />
-        </mergemanifest>
-
-        <do-only-if-manifest-hasCode
-                elseText="hasCode = false. Skipping aidl/renderscript/R.java">
-            <echo level="info">Handling aidl files...</echo>
-            <aidl executable="${aidl}"
-                    framework="${project.target.framework.aidl}"
-                    libraryBinAidlFolderPathRefid="project.library.bin.aidl.folder.path"
-                    genFolder="${gen.absolute.dir}"
-                    aidlOutFolder="${out.aidl.absolute.dir}">
-                <source path="${source.absolute.dir}"/>
-            </aidl>
-
-            <!-- renderscript generates resources so it must be called before aapt -->
-            <echo level="info">----------</echo>
-            <echo level="info">Handling RenderScript files...</echo>
-            <!-- set the rs target prop in case it hasn't been set. -->
-            <property name="renderscript.target" value="${project.minSdkVersion}" />
-            <renderscript
-                    buildToolsRoot="${android.build.tools.dir}"
-                    genFolder="${gen.absolute.dir}"
-                    resFolder="${out.res.absolute.dir}"
-                    rsObjFolder="${out.rs.obj.absolute.dir}"
-                    libsFolder="${out.rs.libs.absolute.dir}"
-                    targetApi="${renderscript.target}"
-                    optLevel="${renderscript.opt.level}"
-                    supportMode="${renderscript.support.mode}"
-                    binFolder="${out.absolute.dir}"
-                    buildType="${build.is.packaging.debug}"
-                    previousBuildType="${build.last.is.packaging.debug}">
-                <source path="${source.absolute.dir}"/>
-            </renderscript>
-
-            <echo level="info">----------</echo>
-            <echo level="info">Handling Resources...</echo>
-            <aapt executable="${aapt}"
-                    command="package"
-                    verbose="${verbose}"
-                    manifest="${out.manifest.abs.file}"
-                    originalManifestPackage="${project.app.package}"
-                    androidjar="${project.target.android.jar}"
-                    rfolder="${gen.absolute.dir}"
-                    nonConstantId="${android.library}"
-                    libraryResFolderPathRefid="project.library.res.folder.path"
-                    libraryPackagesRefid="project.library.packages"
-                    libraryRFileRefid="project.library.bin.r.file.path"
-                    ignoreAssets="${aapt.ignore.assets}"
-                    binFolder="${out.absolute.dir}"
-                    proguardFile="${out.absolute.dir}/proguard.txt">
-                <res path="${out.res.absolute.dir}" />
-                <res path="${resource.absolute.dir}" />
-            </aapt>
-
-            <echo level="info">----------</echo>
-            <echo level="info">Handling BuildConfig class...</echo>
-            <buildconfig
-                    genFolder="${gen.absolute.dir}"
-                    package="${project.app.package}"
-                    buildType="${build.is.packaging.debug}"
-                    previousBuildType="${build.last.is.packaging.debug}"/>
-
-        </do-only-if-manifest-hasCode>
-    </target>
-
-    <!-- empty default pre-compile target. Create a similar target in
-         your build.xml and it'll be called instead of this one. -->
-    <target name="-pre-compile"/>
-
-    <!-- Compiles this project's .java files into .class files. -->
-    <target name="-compile" depends="-pre-build, -build-setup, -code-gen, -pre-compile">
-        <do-only-if-manifest-hasCode elseText="hasCode = false. Skipping...">
-            <!-- merge the project's own classpath and the tested project's classpath -->
-            <path id="project.javac.classpath">
-                <path refid="project.all.jars.path" />
-                <path refid="tested.project.classpath" />
-                <path path="${java.compiler.classpath}" />
-            </path>
-            <javac encoding="${java.encoding}"
-                    source="${java.source}" target="${java.target}"
-                    debug="true" extdirs="" includeantruntime="false"
-                    destdir="${out.classes.absolute.dir}"
-                    bootclasspathref="project.target.class.path"
-                    verbose="${verbose}"
-                    classpathref="project.javac.classpath"
-                    fork="${need.javac.fork}">
-                <src path="${source.absolute.dir}" />
-                <src path="${gen.absolute.dir}" />
-                <compilerarg line="${java.compilerargs}" />
-            </javac>
-
-            <!-- if the project is instrumented, intrument the classes -->
-            <if condition="${build.is.instrumented}">
-                <then>
-                    <echo level="info">Instrumenting classes from ${out.absolute.dir}/classes...</echo>
-
-                    <!-- build the filter to remove R, Manifest, BuildConfig -->
-                    <getemmafilter
-                            appPackage="${project.app.package}"
-                            libraryPackagesRefId="project.library.packages"
-                            filterOut="emma.default.filter"/>
-
-                    <!-- define where the .em file is going. This may have been
-                         setup already if this is a library -->
-                    <property name="emma.coverage.absolute.file" location="${out.absolute.dir}/coverage.em" />
-
-                    <!-- It only instruments class files, not any external libs -->
-                    <emma enabled="true">
-                        <instr verbosity="${verbosity}"
-                               mode="overwrite"
-                               instrpath="${out.absolute.dir}/classes"
-                               outdir="${out.absolute.dir}/classes"
-                               metadatafile="${emma.coverage.absolute.file}">
-                            <filter excludes="${emma.default.filter}" />
-                            <filter value="${emma.filter}" />
-                        </instr>
-                    </emma>
-                </then>
-            </if>
-
-            <!-- if the project is a library then we generate a jar file -->
-            <if condition="${project.is.library}">
-                <then>
-                    <echo level="info">Creating library output jar file...</echo>
-                    <property name="out.library.jar.file" location="${out.absolute.dir}/classes.jar" />
-                    <if>
-                        <condition>
-                            <length string="${android.package.excludes}" trim="true" when="greater" length="0" />
-                        </condition>
-                        <then>
-                            <echo level="info">Custom jar packaging exclusion: ${android.package.excludes}</echo>
-                        </then>
-                    </if>
-
-                    <propertybyreplace name="project.app.package.path" input="${project.app.package}" replace="." with="/" />
-
-                    <jar destfile="${out.library.jar.file}">
-                        <fileset dir="${out.classes.absolute.dir}"
-                                includes="**/*.class"
-                                excludes="${project.app.package.path}/R.class ${project.app.package.path}/R$*.class ${project.app.package.path}/BuildConfig.class"/>
-                        <fileset dir="${source.absolute.dir}" excludes="**/*.java ${android.package.excludes}" />
-                    </jar>
-                </then>
-            </if>
-
-        </do-only-if-manifest-hasCode>
-    </target>
-
-    <!-- empty default post-compile target. Create a similar target in
-         your build.xml and it'll be called instead of this one. -->
-    <target name="-post-compile"/>
-
-    <!-- Obfuscate target
-        This is only active in release builds when proguard.config is defined
-        in default.properties.
-
-        To replace Proguard with a different obfuscation engine:
-        Override the following targets in your build.xml, before the call to <setup>
-            -release-obfuscation-check
-                Check whether obfuscation should happen, and put the result in a property.
-            -debug-obfuscation-check
-                Obfuscation should not happen. Set the same property to false.
-            -obfuscate
-                check if the property set in -debug/release-obfuscation-check is set to true.
-                If true:
-                    Perform obfuscation
-                    Set property out.dex.input.absolute.dir to be the output of the obfuscation
-    -->
-    <target name="-obfuscate">
-        <if condition="${proguard.enabled}">
-            <then>
-                <property name="obfuscate.absolute.dir" location="${out.absolute.dir}/proguard" />
-                <property name="preobfuscate.jar.file" value="${obfuscate.absolute.dir}/original.jar" />
-                <property name="obfuscated.jar.file" value="${obfuscate.absolute.dir}/obfuscated.jar" />
-                <!-- input for dex will be proguard's output -->
-                <property name="out.dex.input.absolute.dir" value="${obfuscated.jar.file}" />
-
-                <!-- Add Proguard Tasks -->
-                <property name="proguard.jar" location="${android.tools.dir}/proguard/lib/proguard.jar" />
-                <taskdef name="proguard" classname="proguard.ant.ProGuardTask" classpath="${proguard.jar}" />
-
-                <!-- Set the android classpath Path object into a single property. It'll be
-                     all the jar files separated by a platform path-separator.
-                     Each path must be quoted if it contains spaces.
-                -->
-                <pathconvert property="project.target.classpath.value" refid="project.target.class.path">
-                    <firstmatchmapper>
-                        <regexpmapper from='^([^ ]*)( .*)$$' to='"\1\2"'/>
-                        <identitymapper/>
-                    </firstmatchmapper>
-                </pathconvert>
-
-                <!-- Build a path object with all the jar files that must be obfuscated.
-                     This include the project compiled source code and any 3rd party jar
-                     files. -->
-                <path id="project.all.classes.path">
-                    <pathelement location="${preobfuscate.jar.file}" />
-                    <path refid="project.all.jars.path" />
-                </path>
-                <!-- Set the project jar files Path object into a single property. It'll be
-                     all the jar files separated by a platform path-separator.
-                     Each path must be quoted if it contains spaces.
-                -->
-                <pathconvert property="project.all.classes.value" refid="project.all.classes.path">
-                    <firstmatchmapper>
-                        <regexpmapper from='^([^ ]*)( .*)$$' to='"\1\2"'/>
-                        <identitymapper/>
-                    </firstmatchmapper>
-                </pathconvert>
-
-                <!-- Turn the path property ${proguard.config} from an A:B:C property
-                     into a series of includes: -include A -include B -include C
-                     suitable for processing by the ProGuard task. Note - this does
-                     not include the leading '-include "' or the closing '"'; those
-                     are added under the <proguard> call below.
-                -->
-                <path id="proguard.configpath">
-                    <pathelement path="${proguard.config}"/>
-                </path>
-                <pathconvert pathsep='" -include "' property="proguard.configcmd" refid="proguard.configpath"/>
-
-                <mkdir   dir="${obfuscate.absolute.dir}" />
-                <delete file="${preobfuscate.jar.file}"/>
-                <delete file="${obfuscated.jar.file}"/>
-                <jar basedir="${out.classes.absolute.dir}"
-                    destfile="${preobfuscate.jar.file}" />
-                <proguard>
-                    -include      "${proguard.configcmd}"
-                    -include      "${out.absolute.dir}/proguard.txt"
-                    -injars       ${project.all.classes.value}
-                    -outjars      "${obfuscated.jar.file}"
-                    -libraryjars  ${project.target.classpath.value}
-                    -dump         "${obfuscate.absolute.dir}/dump.txt"
-                    -printseeds   "${obfuscate.absolute.dir}/seeds.txt"
-                    -printusage   "${obfuscate.absolute.dir}/usage.txt"
-                    -printmapping "${obfuscate.absolute.dir}/mapping.txt"
-                </proguard>
-            </then>
-        </if>
-    </target>
-
-    <!-- Converts this project's .class files into .dex files -->
-    <target name="-dex" depends="-compile, -post-compile, -obfuscate">
-        <do-only-if-manifest-hasCode elseText="hasCode = false. Skipping...">
-            <!-- only convert to dalvik bytecode is *not* a library -->
-            <do-only-if-not-library elseText="Library project: do not convert bytecode..." >
-                <!-- special case for instrumented builds: need to use no-locals and need
-                     to pass in the emma jar. -->
-                <if condition="${build.is.instrumented}">
-                    <then>
-                        <dex-helper nolocals="true">
-                            <external-libs>
-                                <fileset file="${emma.dir}/emma_device.jar" />
-                            </external-libs>
-                        </dex-helper>
-                    </then>
-                    <else>
-                        <dex-helper />
-                    </else>
-                </if>
-            </do-only-if-not-library>
-        </do-only-if-manifest-hasCode>
-    </target>
-
-<!-- Updates the pre-processed PNG cache -->
-    <target name="-crunch">
-        <exec executable="${aapt}" taskName="crunch">
-            <arg value="crunch" />
-            <arg value="-v" />
-            <arg value="-S" />
-            <arg path="${resource.absolute.dir}" />
-            <arg value="-C" />
-            <arg path="${out.res.absolute.dir}" />
-        </exec>
-    </target>
-
-    <!-- Puts the project's resources into the output package file
-         This actually can create multiple resource package in case
-         Some custom apk with specific configuration have been
-         declared in default.properties.
-         -->
-    <target name="-package-resources" depends="-crunch">
-        <!-- only package resources if *not* a library project -->
-        <do-only-if-not-library elseText="Library project: do not package resources..." >
-            <aapt executable="${aapt}"
-                    command="package"
-                    versioncode="${version.code}"
-                    versionname="${version.name}"
-                    debug="${build.is.packaging.debug}"
-                    manifest="${out.manifest.abs.file}"
-                    assets="${asset.absolute.dir}"
-                    androidjar="${project.target.android.jar}"
-                    apkfolder="${out.absolute.dir}"
-                    nocrunch="${build.packaging.nocrunch}"
-                    resourcefilename="${resource.package.file.name}"
-                    resourcefilter="${aapt.resource.filter}"
-                    libraryResFolderPathRefid="project.library.res.folder.path"
-                    libraryPackagesRefid="project.library.packages"
-                    libraryRFileRefid="project.library.bin.r.file.path"
-                    previousBuildType="${build.last.target}"
-                    buildType="${build.target}"
-                    ignoreAssets="${aapt.ignore.assets}">
-                <res path="${out.res.absolute.dir}" />
-                <res path="${resource.absolute.dir}" />
-                <!-- <nocompress /> forces no compression on any files in assets or res/raw -->
-                <!-- <nocompress extension="xml" /> forces no compression on specific file extensions in assets and res/raw -->
-            </aapt>
-        </do-only-if-not-library>
-    </target>
-
-    <!-- Packages the application. -->
-    <target name="-package" depends="-dex, -package-resources">
-        <!-- only package apk if *not* a library project -->
-        <do-only-if-not-library elseText="Library project: do not package apk..." >
-            <if condition="${build.is.instrumented}">
-                <then>
-                    <package-helper>
-                        <extra-jars>
-                            <!-- Injected from external file -->
-                            <jarfile path="${emma.dir}/emma_device.jar" />
-                        </extra-jars>
-                    </package-helper>
-                </then>
-                <else>
-                    <package-helper />
-                </else>
-            </if>
-        </do-only-if-not-library>
-    </target>
-
-    <target name="-post-package" />
-    <target name="-post-build" />
-
-    <target name="-set-mode-check">
-        <fail if="build.is.mode.set"
-                message="Cannot run two different modes at the same time. If you are running more than one debug/release/instrument type targets, call them from different Ant calls." />
-    </target>
-
-    <!-- ******************************************************* -->
-    <!-- **************** Debug specific targets *************** -->
-    <!-- ******************************************************* -->
-
-    <target name="-set-debug-files" depends="-set-mode-check">
-
-        <property name="out.packaged.file" location="${out.absolute.dir}/${ant.project.name}-debug-unaligned.apk" />
-        <property name="out.final.file" location="${out.absolute.dir}/${ant.project.name}-debug.apk" />
-        <property name="build.is.mode.set" value="true" />
-    </target>
-
-
-    <target name="-set-debug-mode" depends="-setup">
-        <!-- record the current build target -->
-        <property name="build.target" value="debug" />
-
-        <if>
-            <condition>
-                <and>
-                    <istrue value="${project.is.testapp}" />
-                    <istrue value="${emma.enabled}" />
-                </and>
-            </condition>
-            <then>
-                <property name="build.is.instrumented" value="true" />
-            </then>
-            <else>
-                <property name="build.is.instrumented" value="false" />
-            </else>
-        </if>
-
-        <!-- whether the build is a debug build. always set. -->
-        <property name="build.is.packaging.debug" value="true" />
-
-        <!-- signing mode: debug -->
-        <property name="build.is.signing.debug" value="true" />
-
-        <!-- Renderscript optimization level: none -->
-        <property name="renderscript.opt.level" value="${renderscript.debug.opt.level}" />
-
-    </target>
-
-    <target name="-debug-obfuscation-check">
-        <!-- proguard is never enabled in debug mode -->
-        <property name="proguard.enabled" value="false"/>
-    </target>
-
-    <!-- Builds debug output package -->
-    <target name="-do-debug" depends="-set-debug-mode, -debug-obfuscation-check, -package, -post-package">
-        <!-- only create apk if *not* a library project -->
-        <do-only-if-not-library elseText="Library project: do not create apk..." >
-            <sequential>
-                <zipalign-helper in.package="${out.packaged.file}" out.package="${out.final.file}" />
-                <echo level="info">Debug Package: ${out.final.file}</echo>
-            </sequential>
-        </do-only-if-not-library>
-        <record-build-info />
-    </target>
-
-    <!-- Builds debug output package -->
-    <target name="debug" depends="-set-debug-files, -do-debug, -post-build"
-                description="Builds the application and signs it with a debug key.">
-    </target>
-
-
-    <!-- ******************************************************* -->
-    <!-- *************** Release specific targets ************** -->
-    <!-- ******************************************************* -->
-
-    <!-- called through target 'release'. Only executed if the keystore and
-         key alias are known but not their password. -->
-    <target name="-release-prompt-for-password" if="has.keystore" unless="has.password">
-        <!-- Gets passwords -->
-        <input
-                message="Please enter keystore password (store:${key.store}):"
-                addproperty="key.store.password" />
-        <input
-                message="Please enter password for alias '${key.alias}':"
-                addproperty="key.alias.password" />
-    </target>
-
-    <!-- called through target 'release'. Only executed if there's no
-         keystore/key alias set -->
-    <target name="-release-nosign" unless="has.keystore">
-        <!-- no release builds for library project -->
-        <do-only-if-not-library elseText="" >
-            <sequential>
-                <echo level="info">No key.store and key.alias properties found in build.properties.</echo>
-                <echo level="info">Please sign ${out.packaged.file} manually</echo>
-                <echo level="info">and run zipalign from the Android SDK tools.</echo>
-            </sequential>
-        </do-only-if-not-library>
-        <record-build-info />
-    </target>
-
-    <target name="-release-obfuscation-check">
-        <echo level="info">proguard.config is ${proguard.config}</echo>
-        <condition property="proguard.enabled" value="true" else="false">
-            <and>
-                <isset property="build.is.mode.release" />
-                <isset property="proguard.config" />
-            </and>
-        </condition>
-        <if condition="${proguard.enabled}">
-            <then>
-                <echo level="info">Proguard.config is enabled</echo>
-                <!-- Secondary dx input (jar files) is empty since all the
-                     jar files will be in the obfuscated jar -->
-                <path id="out.dex.jar.input.ref" />
-            </then>
-        </if>
-    </target>
-
-    <target name="-set-release-mode" depends="-set-mode-check">
-        <property name="out.packaged.file" location="${out.absolute.dir}/${ant.project.name}-release-unsigned.apk" />
-        <property name="out.final.file" location="${out.absolute.dir}/${ant.project.name}-release.apk" />
-        <property name="build.is.mode.set" value="true" />
-
-        <!-- record the current build target -->
-        <property name="build.target" value="release" />
-
-        <property name="build.is.instrumented" value="false" />
-
-        <!-- release mode is only valid if the manifest does not explicitly
-             set debuggable to true. default is false. -->
-        <xpath input="${manifest.abs.file}" expression="/manifest/application/@android:debuggable"
-                output="build.is.packaging.debug" default="false"/>
-
-        <!-- signing mode: release -->
-        <property name="build.is.signing.debug" value="false" />
-
-        <!-- Renderscript optimization level: aggressive -->
-        <property name="renderscript.opt.level" value="${renderscript.release.opt.level}" />
-
-        <if condition="${build.is.packaging.debug}">
-            <then>
-                <echo>*************************************************</echo>
-                <echo>****  Android Manifest has debuggable=true   ****</echo>
-                <echo>**** Doing DEBUG packaging with RELEASE keys ****</echo>
-                <echo>*************************************************</echo>
-            </then>
-            <else>
-                <!-- property only set in release mode.
-                     Useful for if/unless attributes in target node
-                     when using Ant before 1.8 -->
-                <property name="build.is.mode.release" value="true"/>
-            </else>
-        </if>
-    </target>
-
-    <target name="-release-sign" if="has.keystore" >
-        <!-- only create apk if *not* a library project -->
-        <do-only-if-not-library elseText="Library project: do not create apk..." >
-            <sequential>
-                <property name="out.unaligned.file" location="${out.absolute.dir}/${ant.project.name}-release-unaligned.apk" />
-
-                <!-- Signs the APK -->
-                <echo level="info">Signing final apk...</echo>
-                <signapk
-                        input="${out.packaged.file}"
-                        output="${out.unaligned.file}"
-                        keystore="${key.store}"
-                        storepass="${key.store.password}"
-                        alias="${key.alias}"
-                        keypass="${key.alias.password}"/>
-
-                <!-- Zip aligns the APK -->
-                <zipalign-helper
-                        in.package="${out.unaligned.file}"
-                        out.package="${out.final.file}" />
-                <echo level="info">Release Package: ${out.final.file}</echo>
-            </sequential>
-        </do-only-if-not-library>
-        <record-build-info />
-    </target>
-
-    <!-- This runs -package-release and -release-nosign first and then runs
-         only if release-sign is true (set in -release-check,
-         called by -release-no-sign)-->
-    <target name="release"
-                depends="-set-release-mode, -release-obfuscation-check, -package, -post-package, -release-prompt-for-password, -release-nosign, -release-sign, -post-build"
-                description="Builds the application in release mode.">
-    </target>
-
-    <!-- ******************************************************* -->
-    <!-- ************ Instrumented specific targets ************ -->
-    <!-- ******************************************************* -->
-
-    <!-- These targets are specific for the project under test when it
-         gets compiled by the test projects in a way that will make it
-         support emma code coverage -->
-
-    <target name="-set-instrumented-mode" depends="-set-mode-check">
-        <property name="out.packaged.file" location="${out.absolute.dir}/${ant.project.name}-instrumented-unaligned.apk" />
-        <property name="out.final.file" location="${out.absolute.dir}/${ant.project.name}-instrumented.apk" />
-        <property name="build.is.mode.set" value="true" />
-
-        <!-- whether the build is an instrumented build. -->
-        <property name="build.is.instrumented" value="true" />
-    </target>
-
-    <!-- Builds instrumented output package -->
-    <target name="instrument" depends="-set-instrumented-mode, -do-debug"
-                description="Builds an instrumented packaged.">
-        <!-- only create apk if *not* a library project -->
-        <do-only-if-not-library elseText="Library project: do not create apk..." >
-            <sequential>
-                <zipalign-helper in.package="${out.packaged.file}" out.package="${out.final.file}" />
-                <echo level="info">Instrumented Package: ${out.final.file}</echo>
-            </sequential>
-        </do-only-if-not-library>
-        <record-build-info />
-    </target>
-
-    <!-- ******************************************************* -->
-    <!-- ************ Test project specific targets ************ -->
-    <!-- ******************************************************* -->
-
-    <!-- enable code coverage -->
-    <target name="emma">
-        <property name="emma.enabled" value="true" />
-    </target>
-
-    <!-- fails if the project is not a test project -->
-    <target name="-test-project-check" depends="-setup">
-        <if>
-            <condition>
-                <and>
-                    <isfalse value="${project.is.test}" />
-                    <isfalse value="${project.is.testapp}" />
-                </and>
-            </condition>
-            <then>
-                <fail message="Project is not a test project." />
-            </then>
-        </if>
-    </target>
-
-    <target name="test" depends="-test-project-check"
-                description="Runs tests from the package defined in test.package property">
-        <property name="test.runner" value="android.test.InstrumentationTestRunner" />
-
-        <if condition="${project.is.test}">
-        <then>
-            <property name="tested.project.absolute.dir" location="${tested.project.dir}" />
-
-            <!-- Application package of the tested project extracted from its manifest file -->
-            <xpath input="${tested.project.absolute.dir}/AndroidManifest.xml"
-                    expression="/manifest/@package" output="tested.project.app.package" />
-
-            <if condition="${emma.enabled}">
-                <then>
-                    <getprojectpaths projectPath="${tested.project.absolute.dir}"
-                            binOut="tested.project.out.absolute.dir"
-                            srcOut="tested.project.source.absolute.dir" />
-
-                    <getlibpath projectPath="${tested.project.absolute.dir}"
-                            libraryFolderPathOut="tested.project.lib.source.path"
-                            leaf="@{source.dir}" />
-
-                </then>
-            </if>
-
-        </then>
-        <else>
-            <!-- this is a test app, the tested package is the app's own package -->
-            <property name="tested.project.app.package" value="${project.app.package}" />
-
-            <if condition="${emma.enabled}">
-                <then>
-                    <property name="tested.project.out.absolute.dir" value="${out.absolute.dir}" />
-                    <property name="tested.project.source.absolute.dir" value="${source.absolute.dir}" />
-
-                    <getlibpath
-                            libraryFolderPathOut="tested.project.lib.source.path"
-                            leaf="@{source.dir}" />
-
-                </then>
-            </if>
-
-        </else>
-        </if>
-
-        <property name="emma.dump.file"
-                value="/data/data/${tested.project.app.package}/coverage.ec" />
-
-        <if condition="${emma.enabled}">
-            <then>
-                <echo>Running tests...</echo>
-                <run-tests-helper emma.enabled="true">
-                    <extra-instrument-args>
-                        <arg value="-e" />
-                           <arg value="coverageFile" />
-                           <arg value="${emma.dump.file}" />
-                    </extra-instrument-args>
-                </run-tests-helper>
-
-                <echo level="info">Setting permission to download the coverage file...</echo>
-                <exec executable="${adb}" failonerror="true">
-                    <arg line="${adb.device.arg}" />
-                    <arg value="shell" />
-                    <arg value="run-as" />
-                    <arg value="${tested.project.app.package}" />
-                    <arg value="chmod" />
-                    <arg value="644" />
-                    <arg value="${emma.dump.file}" />
-                </exec>
-                <echo level="info">Downloading coverage file into project directory...</echo>
-                <exec executable="${adb}" failonerror="true">
-                    <arg line="${adb.device.arg}" />
-                    <arg value="pull" />
-                    <arg value="${emma.dump.file}" />
-                    <arg path="${out.absolute.dir}/coverage.ec" />
-                </exec>
-
-                <pathconvert property="tested.project.lib.source.path.value" refid="tested.project.lib.source.path">
-                    <firstmatchmapper>
-                        <regexpmapper from='^([^ ]*)( .*)$$' to='"\1\2"'/>
-                        <identitymapper/>
-                    </firstmatchmapper>
-                </pathconvert>
-
-                <echo level="info">Extracting coverage report...</echo>
-                <emma>
-                    <property name="report.html.out.encoding" value="UTF-8" />
-                    <report sourcepath="${tested.project.source.absolute.dir}:${tested.project.lib.source.path.value}"
-                            verbosity="${verbosity}">
-                        <!-- TODO: report.dir or something like should be introduced if necessary -->
-                        <infileset file="${out.absolute.dir}/coverage.ec" />
-                        <infileset file="${tested.project.out.absolute.dir}/coverage.em" />
-                        <!-- TODO: reports in other, indicated by user formats -->
-                        <html outfile="${out.absolute.dir}/coverage.html" />
-                        <txt outfile="${out.absolute.dir}/coverage.txt" />
-                        <xml outfile="${out.absolute.dir}/coverage.xml" />
-                   </report>
-                </emma>
-                <echo level="info">Cleaning up temporary files...</echo>
-                <delete file="${out.absolute.dir}/coverage.ec" />
-                <delete file="${tested.project.out.absolute.dir}/coverage.em" />
-                <exec executable="${adb}" failonerror="true">
-                    <arg line="${adb.device.arg}" />
-                    <arg value="shell" />
-                    <arg value="run-as" />
-                    <arg value="${tested.project.app.package}" />
-                    <arg value="rm" />
-                    <arg value="${emma.dump.file}" />
-                </exec>
-                <echo level="info">Saving the coverage reports in ${out.absolute.dir}</echo>
-            </then>
-            <else>
-                <run-tests-helper />
-            </else>
-        </if>
-    </target>
-
-    <!-- ******************************************************* -->
-    <!-- **********        Run Lint on the project     ********* -->
-    <!-- ******************************************************* -->
-
-    <target name="lint"
-            description="Runs lint on the project to look for potential bugs" >
-        <lint executable="${lint}"
-              html="${lint.out.html}"
-              xml="${lint.out.xml}"
-              src="${source.absolute.dir}:${gen.absolute.dir}"
-              classpath="${out.classes.absolute.dir}" />
-    </target>
-
-    <!-- ******************************************************* -->
-    <!-- ********** Install/uninstall specific targets ********* -->
-    <!-- ******************************************************* -->
-
-    <target name="install"
-                description="Installs the newly build package. Must be used in conjunction with a build target
-                            (debug/release/instrument). If the application was previously installed, the application
-                            is reinstalled if the signature matches." >
-        <!-- only do install if *not* a library project -->
-        <do-only-if-not-library elseText="Library project: nothing to install!" >
-            <if>
-                <condition>
-                    <isset property="out.final.file" />
-                </condition>
-                <then>
-                    <if>
-                        <condition>
-                            <resourceexists>
-                                <file file="${out.final.file}"/>
-                            </resourceexists>
-                        </condition>
-                        <then>
-                            <echo level="info">Installing ${out.final.file} onto default emulator or device...</echo>
-                            <exec executable="${adb}" failonerror="true">
-                                <arg line="${adb.device.arg}" />
-                                <arg value="install" />
-                                <arg value="-r" />
-                                <arg path="${out.final.file}" />
-                            </exec>
-
-                            <!-- now install the tested project if applicable -->
-                            <!-- can't use project.is.test since the setup target might not have run -->
-                            <if>
-                                <condition>
-                                    <and>
-                                        <isset property="tested.project.dir" />
-                                        <not>
-                                            <isset property="dont.do.deps" />
-                                        </not>
-                                    </and>
-                                </condition>
-                                <then>
-                                    <property name="tested.project.absolute.dir" location="${tested.project.dir}" />
-
-                                    <!-- figure out which tested package to install based on emma.enabled -->
-                                    <condition property="tested.project.install.target" value="installi" else="installd">
-                                        <isset property="emma.enabled" />
-                                    </condition>
-                                    <subant target="${tested.project.install.target}" failonerror="true">
-                                        <fileset dir="${tested.project.absolute.dir}" includes="build.xml" />
-                                    </subant>
-                                </then>
-                            </if>
-                        </then>
-                        <else>
-                            <fail message="File ${out.final.file} does not exist." />
-                        </else>
-                    </if>
-                </then>
-                <else>
-                    <echo>Install file not specified.</echo>
-                    <echo></echo>
-                    <echo>'ant install' now requires the build target to be specified as well.</echo>
-                    <echo></echo>
-                    <echo></echo>
-                    <echo>    ant debug install</echo>
-                    <echo>    ant release install</echo>
-                    <echo>    ant instrument install</echo>
-                    <echo>This will build the given package and install it.</echo>
-                    <echo></echo>
-                    <echo>Alternatively, you can use</echo>
-                    <echo>    ant installd</echo>
-                    <echo>    ant installr</echo>
-                    <echo>    ant installi</echo>
-                    <echo>    ant installt</echo>
-                    <echo>to only install an existing package (this will not rebuild the package.)</echo>
-                    <fail />
-                </else>
-            </if>
-        </do-only-if-not-library>
-    </target>
-
-    <target name="installd" depends="-set-debug-files, install"
-            description="Installs (only) the debug package." />
-    <target name="installr" depends="-set-release-mode, install"
-            description="Installs (only) the release package." />
-    <target name="installi" depends="-set-instrumented-mode, install"
-            description="Installs (only) the instrumented package." />
-    <target name="installt" depends="-test-project-check, installd"
-            description="Installs (only) the test and tested packages." />
-
-
-    <!-- Uninstalls the package from the default emulator/device -->
-    <target name="uninstall" depends="-setup"
-                description="Uninstalls the application from a running emulator or device.">
-        <if>
-            <condition>
-                <isset property="project.app.package" />
-            </condition>
-            <then>
-                <uninstall-helper app.package="${project.app.package}" />
-            </then>
-            <else>
-                <fail message="Could not find application package in manifest. Cannot run 'adb uninstall'." />
-            </else>
-        </if>
-
-        <!-- Now uninstall the tested project, if applicable -->
-        <if>
-            <condition>
-                <and>
-                    <istrue value="${project.is.test}" />
-                    <not>
-                        <isset property="dont.do.deps" />
-                    </not>
-                </and>
-            </condition>
-            <then>
-                <property name="tested.project.absolute.dir" location="${tested.project.dir}" />
-
-                <!-- Application package of the tested project extracted from its manifest file -->
-                <xpath input="${tested.project.absolute.dir}/AndroidManifest.xml"
-                    expression="/manifest/@package" output="tested.project.app.package" />
-                <if>
-                    <condition>
-                        <isset property="tested.project.app.package" />
-                    </condition>
-                    <then>
-                        <uninstall-helper app.package="${tested.project.app.package}" />
-                    </then>
-                    <else>
-                        <fail message="Could not find tested application package in manifest. Cannot run 'adb uninstall'." />
-                    </else>
-                </if>
-            </then>
-        </if>
-
-    </target>
-
-
-    <!-- ******************************************************* -->
-    <!-- ************************* Help ************************ -->
-    <!-- ******************************************************* -->
-
-    <target name="help">
-        <!-- displays starts at col 13
-              |13                                                              80| -->
-        <echo>Android Ant Build. Available targets:</echo>
-        <echo>   help:      Displays this help.</echo>
-        <echo>   clean:     Removes output files created by other targets.</echo>
-        <echo>              This calls the same target on all dependent projects.</echo>
-        <echo>              Use 'ant nodeps clean' to only clean the local project</echo>
-        <echo>   debug:     Builds the application and signs it with a debug key.</echo>
-        <echo>              The 'nodeps' target can be used to only build the</echo>
-        <echo>              current project and ignore the libraries using:</echo>
-        <echo>              'ant nodeps debug'</echo>
-        <echo>   release:   Builds the application. The generated apk file must be</echo>
-        <echo>              signed before it is published.</echo>
-        <echo>              The 'nodeps' target can be used to only build the</echo>
-        <echo>              current project and ignore the libraries using:</echo>
-        <echo>              'ant nodeps release'</echo>
-        <echo>   instrument:Builds an instrumented package and signs it with a</echo>
-        <echo>              debug key.</echo>
-        <echo>   test:      Runs the tests. Project must be a test project and</echo>
-        <echo>              must have been built. Typical usage would be:</echo>
-        <echo>                  ant [emma] debug install test</echo>
-        <echo>   emma:      Transiently enables code coverage for subsequent</echo>
-        <echo>              targets.</echo>
-        <echo>   install:   Installs the newly build package. Must either be used</echo>
-        <echo>              in conjunction with a build target (debug/release/</echo>
-        <echo>              instrument) or with the proper suffix indicating</echo>
-        <echo>              which package to install (see below).</echo>
-        <echo>              If the application was previously installed, the</echo>
-        <echo>              application is reinstalled if the signature matches.</echo>
-        <echo>   installd:  Installs (only) the debug package.</echo>
-        <echo>   installr:  Installs (only) the release package.</echo>
-        <echo>   installi:  Installs (only) the instrumented package.</echo>
-        <echo>   installt:  Installs (only) the test and tested packages (unless</echo>
-        <echo>              nodeps is used as well.</echo>
-        <echo>   uninstall: Uninstalls the application from a running emulator or</echo>
-        <echo>              device. Also uninstall tested package if applicable</echo>
-        <echo>              unless 'nodeps' is used as well.</echo>
-    </target>
-</project>
diff --git a/files/ant/uibuild.xml b/files/ant/uibuild.xml
deleted file mode 100644
index 788ca77..0000000
--- a/files/ant/uibuild.xml
+++ /dev/null
@@ -1,260 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project name="android_rules" default="debug">
-
-    <!--
-        This build file is imported by the project build file. It contains
-        all the targets and tasks necessary to build Android projects, be they
-        regular projects, library projects, or test projects.
-
-        At the beginning of the file is a list of properties that can be overridden
-        by adding them to your ant.properties (properties are immutable, so their
-        first definition sticks and is never changed).
-
-        Follows:
-        - custom task definitions,
-        - more properties (do not override those unless the whole build system is modified).
-        - macros used throughout the build,
-        - base build targets,
-        - debug-specific build targets,
-        - release-specific build targets,
-        - instrument-specific build targets,
-        - test project-specific build targets,
-        - install targets,
-        - help target
-    -->
-
-    <!-- ******************************************************* -->
-    <!-- **************** Overridable Properties *************** -->
-    <!-- ******************************************************* -->
-
-    <!-- You can override these values in your build.xml or ant.properties.
-         Overriding any other properties may result in broken build. -->
-
-    <!-- Tells adb which device to target. You can change this from the command line
-         by invoking "ant -Dadb.device.arg=-d" for device "ant -Dadb.device.arg=-e" for
-         the emulator. -->
-    <property name="adb.device.arg" value="" />
-
-    <!-- filename only of the output file. Cannot be a path -->
-    <property name="out.filename" value="${ant.project.name}.jar" />
-
-    <!-- compilation options -->
-    <property name="java.encoding" value="UTF-8" />
-    <property name="java.target" value="1.5" />
-    <property name="java.source" value="1.5" />
-    <property name="java.compilerargs" value="" />
-
-    <!-- Verbosity -->
-    <property name="verbose" value="false" />
-
-    <!-- ******************************************************* -->
-    <!-- ********************* Custom Tasks ******************** -->
-    <!-- ******************************************************* -->
-
-    <!-- jar file from where the tasks are loaded -->
-    <path id="android.antlibs">
-        <pathelement path="${sdk.dir}/tools/lib/ant-tasks.jar" />
-    </path>
-
-    <!-- Custom tasks -->
-    <taskdef resource="anttasks.properties" classpathref="android.antlibs" />
-
-    <!-- Emma configuration -->
-    <property name="emma.dir" value="${sdk.dir}/tools/lib" />
-    <path id="emma.lib">
-        <pathelement location="${emma.dir}/emma.jar" />
-        <pathelement location="${emma.dir}/emma_ant.jar" />
-    </path>
-    <taskdef resource="emma_ant.properties" classpathref="emma.lib" />
-    <!-- End of emma configuration -->
-
-
-    <!-- ******************************************************* -->
-    <!-- ******************* Other Properties ****************** -->
-    <!-- ******************************************************* -->
-    <!-- overriding these properties may break the build
-         unless the whole file is updated -->
-
-    <!-- Input directories -->
-    <property name="source.dir" value="src" />
-    <property name="source.absolute.dir" location="${source.dir}" />
-    <property name="jar.libs.dir" value="libs" />
-    <property name="jar.libs.absolute.dir" location="${jar.libs.dir}" />
-
-    <!-- Output directories -->
-    <property name="out.dir" value="bin" />
-    <property name="out.absolute.dir" location="${out.dir}" />
-    <property name="out.classes.absolute.dir" location="${out.dir}/classes" />
-
-    <property name="out.file" value="${out.absolute.dir}/${out.filename}" />
-
-    <!-- tools location -->
-    <property name="android.tools.dir" location="${sdk.dir}/tools" />
-    <property name="android.platform.tools.dir" location="${sdk.dir}/platform-tools" />
-    <condition property="exe" value=".exe" else=""><os family="windows" /></condition>
-    <condition property="bat" value=".bat" else=""><os family="windows" /></condition>
-    <property name="adb" location="${android.platform.tools.dir}/adb${exe}" />
-
-    <!-- Intermediate files -->
-    <property name="dex.file.name" value="classes.dex" />
-    <property name="intermediate.dex.file" location="${out.absolute.dir}/${dex.file.name}" />
-    <property name="resource.package.file.name" value="${ant.project.name}.ap_" />
-
-    <!-- whether we need to fork javac.
-         This is only needed on Windows when running Java < 7 -->
-    <condition else="false" property="need.javac.fork">
-        <and>
-            <matches pattern="1\.[56]" string="${java.specification.version}"/>
-            <not>
-                <os family="unix"/>
-            </not>
-        </and>
-    </condition>
-
-    <macrodef name="run-tests-helper">
-        <attribute name="emma.enabled" default="false" />
-        <element name="extra-instrument-args" optional="yes" />
-        <sequential>
-            <echo level="info">Running tests ...</echo>
-            <exec executable="${adb}" failonerror="true">
-                <arg line="${adb.device.arg}" />
-                <arg value="shell" />
-                <arg value="am" />
-                <arg value="instrument" />
-                <arg value="-w" />
-                <arg value="-e" />
-                <arg value="coverage" />
-                <arg value="@{emma.enabled}" />
-                <extra-instrument-args />
-                <arg value="${project.app.package}/${test.runner}" />
-            </exec>
-        </sequential>
-    </macrodef>
-
-    <!-- ******************************************************* -->
-    <!-- ******************** Build Targets ******************** -->
-    <!-- ******************************************************* -->
-
-    <!-- Basic Ant + SDK check -->
-    <target name="-check-env">
-        <checkenv />
-    </target>
-
-    <!-- empty default pre-clean target. Create a similar target in
-         your build.xml and it'll be called instead of this one. -->
-    <target name="-pre-clean"/>
-
-    <!-- clean target -->
-    <target name="clean" depends="-check-env, -pre-clean"
-            description="Removes output files created by other targets.">
-        <delete dir="${out.absolute.dir}" verbose="${verbose}" />
-    </target>
-
-    <!-- Pre build setup -->
-    <target name="-build-setup" depends="-check-env">
-        <getbuildtools name="android.build.tools.dir" />
-        <property name="dx" location="${android.build.tools.dir}/dx${bat}" />
-
-        <echo level="info">Resolving Build Target for ${ant.project.name}...</echo>
-        <!-- load project properties, resolve Android target, library dependencies
-             and set some properties with the results.
-             All property names are passed as parameters ending in -Out -->
-        <getuitarget compileClassPathOut="project.target.class.path" />
-
-        <echo level="info">----------</echo>
-        <echo level="info">Creating output directories if needed...</echo>
-        <mkdir dir="${out.absolute.dir}" />
-        <mkdir dir="${out.classes.absolute.dir}" />
-
-    </target>
-
-    <!-- empty default pre-compile target. Create a similar target in
-         your build.xml and it'll be called instead of this one. -->
-    <target name="-pre-compile"/>
-
-    <!-- Compiles this project's .java files into .class files. -->
-    <target name="compile" depends="-build-setup, -pre-compile">
-        <javac encoding="${java.encoding}"
-                source="${java.source}" target="${java.target}"
-                debug="true" extdirs="" includeantruntime="false"
-                destdir="${out.classes.absolute.dir}"
-                bootclasspathref="project.target.class.path"
-                verbose="${verbose}"
-                fork="${need.javac.fork}">
-            <src path="${source.absolute.dir}" />
-            <compilerarg line="${java.compilerargs}" />
-        </javac>
-    </target>
-
-    <!-- empty default post-compile target. Create a similar target in
-         your build.xml and it'll be called instead of this one. -->
-    <target name="-post-compile"/>
-
-    <!-- Converts this project's .class files into .dex files -->
-    <target name="-dex" depends="compile, -post-compile">
-        <dex executable="${dx}"
-                output="${intermediate.dex.file}"
-                nolocals="@{nolocals}"
-                verbose="${verbose}">
-            <path path="${out.classes.absolute.dir}"/>
-        </dex>
-    </target>
-
-    <!-- empty default post-dex target. Create a similar target in
-         your build.xml and it'll be called instead of this one. -->
-    <target name="-post-dex"/>
-
-    <target name="-jar" depends="-dex, -post-dex" >
-        <jar destfile="${out.file}">
-            <fileset file="${intermediate.dex.file}" />
-        </jar>
-    </target>
-
-    <!-- empty default post-jar target. Create a similar target in
-         your build.xml and it'll be called instead of this one. -->
-    <target name="-post-jar"/>
-
-    <target name="build" depends="-jar, -post-jar" />
-
-    <target name="install" description="Install the test package">
-         <exec executable="${adb}" failonerror="true">
-            <arg line="${adb.device.arg}" />
-            <arg value="push" />
-            <arg value="${out.file}" />
-            <arg value="/data/local/tmp" />
-        </exec>
-    </target>
-
-    <target name="test" description="Runs tests">
-        <!-- todo: fix this -->
-        <fail message="Launching tests from Ant not supported yet" />
-
-         <exec executable="${adb}" failonerror="true">
-            <arg line="${adb.device.arg}" />
-            <arg value="shell" />
-            <arg value="uiautomator" />
-            <arg value="runtest" />
-            <arg value="${out.filename}" />
-            <arg value="-e" />
-            <arg value="class" />
-            <arg value="com.android.uiautomator.samples.skeleton.DemoTestCase" />
-        </exec>
-    </target>
-
-    <target name="help">
-        <!-- displays starts at col 13
-              |13                                                              80| -->
-        <echo>Android Ant Build. Available targets:</echo>
-        <echo>   help:      Displays this help.</echo>
-        <echo>   clean:     Removes output files created by other targets.</echo>
-        <echo>   build:     Builds the test library.</echo>
-        <echo>   install:   Installs the library on a connected device or</echo>
-        <echo>              emulator.</echo>
-        <echo>   test:      Runs the tests.</echo>
-        <echo></echo>
-        <echo>It is possible to mix targets. For instance:</echo>
-        <echo>   ant build install test</echo>
-        <echo>This will build, install and run the test in a single command.</echo>
-    </target>
-
-</project>
diff --git a/files/devices.xml b/files/devices.xml
deleted file mode 100644
index 0c7cb96..0000000
--- a/files/devices.xml
+++ /dev/null
@@ -1,595 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-
-<d:devices xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-           xmlns:d="http://schemas.android.com/sdk/devices/1">
-
-    <d:device>
-        <d:name>Nexus One</d:name>
-        <d:manufacturer>Google</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>800</d:y-dimension>
-                </d:dimensions>
-                <d:xdpi>254</d:xdpi>
-                <d:ydpi>254</d:ydpi>
-                <d:touch>
-                    <d:multitouch>basic</d:multitouch>
-                    <d:mechanism>finger</d:mechanism>
-                    <d:screen-type>capacitive</d:screen-type>
-                </d:touch>
-            </d:screen>
-            <d:networking>
-                Wifi
-                Bluetooth
-            </d:networking>
-            <d:sensors>
-                Accelerometer
-                Compass
-                GPS
-                LightSensor
-                ProximitySensor
-            </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>nokeys</d:keyboard>
-            <d:nav>trackball</d:nav>
-            <d:ram unit="MiB">512</d:ram>
-            <d:buttons>hard</d:buttons>
-            <d:internal-storage unit="MiB">503</d:internal-storage>
-            <d:removable-storage unit="MiB">0</d:removable-storage>
-            <d:cpu>Qualcomm Scorpion</d:cpu>
-            <d:gpu>Qualcomm Adreno 200</d:gpu>
-            <d:abi>
-                armeabi-v7a
-                armeabi
-            </d:abi>
-            <d:dock> </d:dock>
-            <d:power-type>battery</d:power-type>
-        </d:hardware>
-        <d:software>
-            <d:api-level>7-10</d:api-level>
-            <d:live-wallpaper-support>true</d:live-wallpaper-support>
-            <d:bluetooth-profiles> </d:bluetooth-profiles>
-            <d:gl-version>2.0</d:gl-version>
-            <d:gl-extensions>
-            </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>Nexus S</d:name>
-        <d:manufacturer>Google</d:manufacturer>
-        <d:hardware>
-            <d:screen>
-                <d:screen-size>normal</d:screen-size>
-                <d:diagonal-length>4</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>800</d:y-dimension>
-                </d:dimensions>
-                <d:xdpi>235</d:xdpi>
-                <d:ydpi>235</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>
-                Wifi
-                Bluetooth
-                NFC
-            </d:networking>
-            <d:sensors>
-                Accelerometer
-                Compass
-                GPS
-                Gyroscope
-                LightSensor
-                ProximitySensor
-            </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:camera>
-                <d:location>front</d:location>
-                <d:autofocus>false</d:autofocus>
-                <d:flash>false</d:flash>
-            </d:camera>
-            <d:keyboard>nokeys</d:keyboard>
-            <d:nav>nonav</d:nav>
-            <d:ram unit="KiB">351428</d:ram>
-            <d:buttons>hard</d:buttons>
-            <d:internal-storage unit="MiB">503</d:internal-storage>
-            <d:removable-storage unit="MiB">0</d:removable-storage>
-            <d:cpu>Samsung Exynos 3110</d:cpu>
-            <d:gpu>PowerVR SGX 540</d:gpu>
-            <d:abi>
-                armeabi-v7a
-                armeabi
-            </d:abi>
-            <d:dock> </d:dock>
-            <d:power-type>battery</d:power-type>
-        </d:hardware>
-        <d:software>
-            <d:api-level>9-16</d:api-level>
-            <d:live-wallpaper-support>true</d:live-wallpaper-support>
-            <d:bluetooth-profiles> </d:bluetooth-profiles>
-            <d:gl-version>2.0</d:gl-version>
-            <d:gl-extensions>
-                GL_EXT_debug_marker
-                GL_OES_rgb8_rgba8
-                GL_OES_depth24
-                GL_OES_vertex_half_float
-                GL_OES_texture_float
-                GL_OES_texture_half_float
-                GL_OES_element_index_uint
-                GL_OES_mapbuffer
-                GL_OES_fragment_precision_high
-                GL_OES_compressed_ETC1_RGB8_texture
-                GL_OES_EGL_image
-                GL_OES_EGL_image_external
-                GL_OES_required_internalformat
-                GL_OES_depth_texture
-                GL_OES_get_program_binary
-                GL_OES_packed_depth_stencil
-                GL_OES_standard_derivatives
-                GL_OES_vertex_array_object
-                GL_OES_egl_sync
-                GL_EXT_multi_draw_arrays
-                GL_EXT_texture_format_BGRA8888
-                GL_EXT_discard_framebuffer
-                GL_EXT_shader_texture_lod
-                GL_IMG_shader_binary
-                GL_IMG_texture_compression_pvrtc
-                GL_IMG_texture_npot
-                GL_IMG_texture_format_BGRA8888
-                GL_IMG_read_format
-                GL_IMG_program_binary
-                GL_IMG_multisampled_render_to_texture
-            </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>Galaxy Nexus</d:name>
-        <d:manufacturer>Google</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>
-            <!-- power-type (battery, plugged-in) -->
-            <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>Nexus 7</d:name>
-        <d:manufacturer>Google</d:manufacturer>
-        <d:hardware>
-            <d:screen>
-                <d:screen-size>large</d:screen-size>
-                <d:diagonal-length>7.27</d:diagonal-length>
-                <d:pixel-density>tvdpi</d:pixel-density>
-                <d:screen-ratio>notlong</d:screen-ratio>
-                <d:dimensions>
-                    <d:x-dimension>800</d:x-dimension>
-                    <d:y-dimension>1280</d:y-dimension>
-                </d:dimensions>
-                <d:xdpi>195</d:xdpi>
-                <d:ydpi>200</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>
-                Wifi
-                Bluetooth
-                NFC
-            </d:networking>
-            <d:sensors>
-                Accelerometer
-                Compass
-                GPS
-                Gyroscope
-                LightSensor
-            </d:sensors>
-            <d:mic>true</d:mic>
-            <d:camera>
-                <d:location>front</d:location>
-                <d:autofocus>false</d:autofocus>
-                <d:flash>false</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">8</d:internal-storage>
-            <d:removable-storage unit="MiB"> </d:removable-storage>
-            <d:cpu> Tegra3 </d:cpu>
-            <d:gpu> Tegra3 </d:gpu>
-            <d:abi>
-                armeabi-v7a
-                armeabi
-            </d:abi>
-            <d:dock> </d:dock>
-            <d:power-type>battery</d:power-type>
-        </d:hardware>
-
-        <d:software>
-            <d:api-level>16</d:api-level>
-            <d:live-wallpaper-support>true</d:live-wallpaper-support>
-            <d:bluetooth-profiles> </d:bluetooth-profiles>
-            <d:gl-version>2.0</d:gl-version>
-            <d:gl-extensions> </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>Nexus 4</d:name>
-        <d:manufacturer>Google</d:manufacturer>
-        <d:hardware>
-            <d:screen>
-                <d:screen-size>normal</d:screen-size>
-                <d:diagonal-length>4.7</d:diagonal-length>
-                <d:pixel-density>xhdpi</d:pixel-density>
-                <d:screen-ratio>notlong</d:screen-ratio>
-                <d:dimensions>
-                    <d:x-dimension>768</d:x-dimension>
-                    <d:y-dimension>1280</d:y-dimension>
-                </d:dimensions>
-                <d:xdpi>320</d:xdpi>
-                <d:ydpi>320</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>
-                Wifi
-                Bluetooth
-                NFC
-            </d:networking>
-            <d:sensors>
-                Accelerometer
-                Barometer
-                Compass
-                GPS
-                Gyroscope
-                LightSensor
-                ProximitySensor
-            </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:camera>
-                <d:location>front</d:location>
-                <d:autofocus>false</d:autofocus>
-                <d:flash>false</d:flash>
-            </d:camera>
-            <d:keyboard>nokeys</d:keyboard>
-            <d:nav>nonav</d:nav>
-            <d:ram unit="KiB">1953125</d:ram>
-            <d:buttons>soft</d:buttons>
-            <d:internal-storage unit="KiB">7811891</d:internal-storage>
-            <d:removable-storage unit="MiB"></d:removable-storage>
-            <d:cpu>Qualcomm Snapdragon S4 Pro</d:cpu>
-            <d:gpu>Adreno 320</d:gpu>
-            <d:abi>
-                armeabi-v7a
-                armeabi
-            </d:abi>
-            <d:dock></d:dock>
-            <d:power-type>battery</d:power-type>
-        </d:hardware>
-        <d:software>
-            <d:api-level>16</d:api-level>
-            <d:live-wallpaper-support>true</d:live-wallpaper-support>
-            <d:bluetooth-profiles></d:bluetooth-profiles>
-            <d:gl-version>2.0</d:gl-version>
-            <d:gl-extensions>GL_EXT_debug_marker GL_AMD_compressed_ATC_texture
-                GL_AMD_performance_monitor GL_AMD_program_binary_Z400 GL_EXT_robustness
-                GL_EXT_texture_format_BGRA8888 GL_EXT_texture_type_2_10_10_10_REV GL_NV_fence
-                GL_OES_compressed_ETC1_RGB8_texture GL_OES_depth_texture GL_OES_depth24
-                GL_OES_EGL_image GL_OES_EGL_image_external GL_OES_element_index_uint
-                GL_OES_fbo_render_mipmap GL_OES_fragment_precision_high GL_OES_get_program_binary
-                GL_OES_packed_depth_stencil GL_OES_rgb8_rgba8 GL_OES_standard_derivatives
-                GL_OES_texture_3D GL_OES_texture_float GL_OES_texture_half_float
-                GL_OES_texture_half_float_linear GL_OES_texture_npot GL_OES_vertex_half_float
-                GL_OES_vertex_type_10_10_10_2 GL_OES_vertex_array_object GL_QCOM_alpha_test
-                GL_QCOM_binning_control GL_QCOM_driver_control GL_QCOM_perfmon_global_mode
-                GL_QCOM_extended_get GL_QCOM_extended_get2 GL_QCOM_tiled_rendering
-                GL_QCOM_writeonly_rendering GL_EXT_sRGB
-            </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>Nexus 10</d:name>
-        <d:manufacturer>Google</d:manufacturer>
-        <d:hardware>
-            <d:screen>
-                <d:screen-size>xlarge</d:screen-size>
-                <d:diagonal-length>10.055</d:diagonal-length>
-                <d:pixel-density>xhdpi</d:pixel-density>
-                <d:screen-ratio>notlong</d:screen-ratio>
-                <d:dimensions>
-                    <d:x-dimension>2560</d:x-dimension>
-                    <d:y-dimension>1600</d:y-dimension>
-                </d:dimensions>
-                <d:xdpi>300</d:xdpi>
-                <d:ydpi>300</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>
-                Wifi
-                Bluetooth
-                NFC
-            </d:networking>
-            <d:sensors>
-                Accelerometer
-                Barometer
-                Compass
-                GPS
-                Gyroscope
-                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:camera>
-                <d:location>front</d:location>
-                <d:autofocus>false</d:autofocus>
-                <d:flash>false</d:flash>
-            </d:camera>
-            <d:keyboard>nokeys</d:keyboard>
-            <d:nav>nonav</d:nav>
-            <d:ram unit="KiB">1953125</d:ram>
-            <d:buttons>soft</d:buttons>
-            <d:internal-storage unit="KiB">15623782</d:internal-storage>
-            <d:removable-storage unit="MiB"></d:removable-storage>
-            <d:cpu>Dual-core A15</d:cpu>
-            <d:gpu>Quad-core Mali T604</d:gpu>
-            <d:abi>
-                armeabi-v7a
-                armeabi
-            </d:abi>
-            <d:dock></d:dock>
-            <d:power-type>battery</d:power-type>
-        </d:hardware>
-        <d:software>
-            <d:api-level>16</d:api-level>
-            <d:live-wallpaper-support>true</d:live-wallpaper-support>
-            <d:bluetooth-profiles></d:bluetooth-profiles>
-            <d:gl-version>2.0</d:gl-version>
-            <d:gl-extensions>GL_EXT_debug_marker GL_ARM_rgba8 GL_ARM_mali_shader_binary
-                GL_OES_depth24 GL_OES_depth_texture GL_OES_depth_texture_cube_map
-                GL_OES_packed_depth_stencil GL_OES_rgb8_rgba8 GL_EXT_read_format_bgra
-                GL_OES_compressed_paletted_texture GL_OES_compressed_ETC1_RGB8_texture
-                GL_OES_standard_derivatives GL_OES_EGL_image GL_OES_EGL_image_external
-                GL_OES_EGL_sync GL_OES_texture_npot GL_OES_vertex_half_float
-                GL_OES_required_internalformat GL_OES_vertex_array_object GL_OES_mapbuffer
-                GL_EXT_texture_format_BGRA8888 GL_EXT_texture_rg GL_EXT_texture_type_2_10_10_10_REV
-                GL_OES_fbo_render_mipmap GL_OES_element_index_uint GL_EXT_shadow_samplers
-                GL_EXT_occlusion_query_boolean GL_EXT_blend_minmax GL_EXT_discard_framebuffer
-                GL_OES_get_program_binary GL_OES_texture_3D GL_EXT_texture_storage
-                GL_EXT_multisampled_render_to_texture GL_OES_surfaceless_context
-                GL_ARM_mali_program_binary
-            </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: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/files/plugin.prop b/files/plugin.prop
deleted file mode 100644
index 44a6a1b..0000000
--- a/files/plugin.prop
+++ /dev/null
@@ -1,3 +0,0 @@
-# begin plugin.prop
-plugin.version=23.0.0
-# end plugin.prop
diff --git a/files/post_tools_install.bat b/files/post_tools_install.bat
deleted file mode 100644
index 287dbc1..0000000
--- a/files/post_tools_install.bat
+++ /dev/null
@@ -1,53 +0,0 @@
-@echo off
-rem Copyright (C) 2010 The Android Open Source Project
-rem
-rem Licensed under the Apache License, Version 2.0 (the "License");
-rem you may not use this file except in compliance with the License.
-rem You may obtain a copy of the License at
-rem
-rem      http://www.apache.org/licenses/LICENSE-2.0
-rem
-rem Unless required by applicable law or agreed to in writing, software
-rem distributed under the License is distributed on an "AS IS" BASIS,
-rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-rem See the License for the specific language governing permissions and
-rem limitations under the License.
-
-rem This script is called by the SDK Manager once a new version of the tools
-rem package as been installed.
-
-rem don't modify the caller's environment
-setlocal
-
-rem Set up prog to be the path of this script, including following symlinks,
-rem and set up progdir to be the fully-qualified pathname of its directory.
-set prog=%~f0
-
-rem Grab current directory before we change it
-set work_dir=%cd%
-
-rem Change current directory and drive to where the script is, to avoid
-rem issues with directories containing whitespaces.
-cd /d %~dp0
-
-:Step1
-set src=SDK Manager.exe
-set dst=..\..\%src%
-
-if not exist "%src%" goto Step2
-  echo Updating %src%
-  copy /V /Y "%src%" "%dst%"
-
-:Step2
-set src=AVD Manager.exe
-set dst=..\..\%src%
-
-if not exist "%src%" goto Cleanup
-  echo Updating %src%
-  copy /V /Y "%src%" "%dst%"
-
-:Cleanup
-set old_dst=..\..\SDK Setup.exe
-if not exist "%old_dst%" goto :EOF
-  echo Removing obsolete %old_dst%
-  del /F /Q "%old_dst%"
diff --git a/files/proguard-android-optimize.txt b/files/proguard-android-optimize.txt
deleted file mode 100644
index 3e671f7..0000000
--- a/files/proguard-android-optimize.txt
+++ /dev/null
@@ -1,64 +0,0 @@
-# This is a configuration file for ProGuard.
-# http://proguard.sourceforge.net/index.html#manual/usage.html
-
-# Optimizations: If you don't want to optimize, use the
-# proguard-android.txt configuration file instead of this one, which
-# turns off the optimization flags.  Adding optimization introduces
-# certain risks, since for example not all optimizations performed by
-# ProGuard works on all versions of Dalvik.  The following flags turn
-# off various optimizations known to have issues, but the list may not
-# be complete or up to date. (The "arithmetic" optimization can be
-# used if you are only targeting Android 2.0 or later.)  Make sure you
-# test thoroughly if you go this route.
--optimizations !code/simplification/arithmetic,!code/simplification/cast,!field/*,!class/merging/*
--optimizationpasses 5
--allowaccessmodification
--dontpreverify
-
-# The remainder of this file is identical to the non-optimized version
-# of the Proguard configuration file (except that the other file has
-# flags to turn off optimization).
-
--dontusemixedcaseclassnames
--dontskipnonpubliclibraryclasses
--verbose
-
--keepattributes *Annotation*
--keep public class com.google.vending.licensing.ILicensingService
--keep public class com.android.vending.licensing.ILicensingService
-
-# For native methods, see http://proguard.sourceforge.net/manual/examples.html#native
--keepclasseswithmembernames class * {
-    native <methods>;
-}
-
-# keep setters in Views so that animations can still work.
-# see http://proguard.sourceforge.net/manual/examples.html#beans
--keepclassmembers public class * extends android.view.View {
-   void set*(***);
-   *** get*();
-}
-
-# We want to keep methods in Activity that could be used in the XML attribute onClick
--keepclassmembers class * extends android.app.Activity {
-   public void *(android.view.View);
-}
-
-# For enumeration classes, see http://proguard.sourceforge.net/manual/examples.html#enumerations
--keepclassmembers enum * {
-    public static **[] values();
-    public static ** valueOf(java.lang.String);
-}
-
--keepclassmembers class * implements android.os.Parcelable {
-  public static final android.os.Parcelable$Creator CREATOR;
-}
-
--keepclassmembers class **.R$* {
-    public static <fields>;
-}
-
-# The support library contains references to newer platform versions.
-# Don't warn about those in case this app is linking against an older
-# platform version.  We know about them, and they are safe.
--dontwarn android.support.**
diff --git a/files/proguard-android.txt b/files/proguard-android.txt
deleted file mode 100644
index 5f25493..0000000
--- a/files/proguard-android.txt
+++ /dev/null
@@ -1,57 +0,0 @@
-# This is a configuration file for ProGuard.
-# http://proguard.sourceforge.net/index.html#manual/usage.html
-
--dontusemixedcaseclassnames
--dontskipnonpubliclibraryclasses
--verbose
-
-# Optimization is turned off by default. Dex does not like code run
-# through the ProGuard optimize and preverify steps (and performs some
-# of these optimizations on its own).
--dontoptimize
--dontpreverify
-# Note that if you want to enable optimization, you cannot just
-# include optimization flags in your own project configuration file;
-# instead you will need to point to the
-# "proguard-android-optimize.txt" file instead of this one from your
-# project.properties file.
-
--keepattributes *Annotation*
--keep public class com.google.vending.licensing.ILicensingService
--keep public class com.android.vending.licensing.ILicensingService
-
-# For native methods, see http://proguard.sourceforge.net/manual/examples.html#native
--keepclasseswithmembernames class * {
-    native <methods>;
-}
-
-# keep setters in Views so that animations can still work.
-# see http://proguard.sourceforge.net/manual/examples.html#beans
--keepclassmembers public class * extends android.view.View {
-   void set*(***);
-   *** get*();
-}
-
-# We want to keep methods in Activity that could be used in the XML attribute onClick
--keepclassmembers class * extends android.app.Activity {
-   public void *(android.view.View);
-}
-
-# For enumeration classes, see http://proguard.sourceforge.net/manual/examples.html#enumerations
--keepclassmembers enum * {
-    public static **[] values();
-    public static ** valueOf(java.lang.String);
-}
-
--keepclassmembers class * implements android.os.Parcelable {
-  public static final android.os.Parcelable$Creator CREATOR;
-}
-
--keepclassmembers class **.R$* {
-    public static <fields>;
-}
-
-# The support library contains references to newer platform versions.
-# Don't warn about those in case this app is linking against an older
-# platform version.  We know about them, and they are safe.
--dontwarn android.support.**
diff --git a/files/proguard-project.txt b/files/proguard-project.txt
deleted file mode 100644
index f2fe155..0000000
--- a/files/proguard-project.txt
+++ /dev/null
@@ -1,20 +0,0 @@
-# To enable ProGuard in your project, edit project.properties
-# to define the proguard.config property as described in that file.
-#
-# Add project specific ProGuard rules here.
-# By default, the flags in this file are appended to flags specified
-# in ${sdk.dir}/tools/proguard/proguard-android.txt
-# You can edit the include path and order by changing the ProGuard
-# include property in project.properties.
-#
-# For more details, see
-#   http://developer.android.com/guide/developing/tools/proguard.html
-
-# Add any project specific keep options here:
-
-# If your project uses WebView with JS, uncomment the following
-# and specify the fully qualified class name to the JavaScript interface
-# class:
-#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
-#   public *;
-#}
diff --git a/files/proguard/bin/proguard.bat b/files/proguard/bin/proguard.bat
deleted file mode 100755
index 52cc990..0000000
--- a/files/proguard/bin/proguard.bat
+++ /dev/null
@@ -1,17 +0,0 @@
-@ECHO OFF
-
-REM Start-up script for ProGuard -- free class file shrinker, optimizer,
-REM obfuscator, and preverifier for Java bytecode.
-
-rem Change current directory and drive to where the script is, to avoid
-rem issues with directories containing whitespaces.
-cd /d %~dp0
-
-IF EXIST "%PROGUARD_HOME%" GOTO home
-SET PROGUARD_HOME=..
-:home
-
-set java_exe=
-call "%PROGUARD_HOME%"\..\lib\find_java.bat
-
-call %java_exe% -jar "%PROGUARD_HOME%"\lib\proguard.jar %*
diff --git a/files/proguard/bin/proguardgui.bat b/files/proguard/bin/proguardgui.bat
deleted file mode 100755
index 4e41570..0000000
--- a/files/proguard/bin/proguardgui.bat
+++ /dev/null
@@ -1,17 +0,0 @@
-@ECHO OFF
-
-REM Start-up script for the GUI of ProGuard -- free class file shrinker,
-REM optimizer, obfuscator, and preverifier for Java bytecode.
-
-rem Change current directory and drive to where the script is, to avoid
-rem issues with directories containing whitespaces.
-cd /d %~dp0
-
-IF EXIST "%PROGUARD_HOME%" GOTO home
-SET PROGUARD_HOME=..
-:home
-
-set java_exe=
-call %PROGUARD_HOME%\..\lib\find_java.bat
-
-call %java_exe% -jar "%PROGUARD_HOME%"\lib\proguardgui.jar %1 %2 %3 %4 %5 %6 %7 %8 %9
diff --git a/files/proguard/bin/retrace.bat b/files/proguard/bin/retrace.bat
deleted file mode 100755
index 94ec615..0000000
--- a/files/proguard/bin/retrace.bat
+++ /dev/null
@@ -1,17 +0,0 @@
-@ECHO OFF
-
-REM Start-up script for Retrace -- companion tool for ProGuard, free class file
-REM shrinker, optimizer, obfuscator, and preverifier for Java bytecode.
-
-rem Change current directory and drive to where the script is, to avoid
-rem issues with directories containing whitespaces.
-cd /d %~dp0
-
-IF EXIST "%PROGUARD_HOME%" GOTO home
-SET PROGUARD_HOME=..
-:home
-
-set java_exe=
-call %PROGUARD_HOME%\..\lib\find_java.bat
-
-call %java_exe% -jar "%PROGUARD_HOME%"\lib\retrace.jar %1 %2 %3 %4 %5 %6 %7 %8 %9
diff --git a/files/sdk.properties b/files/sdk.properties
deleted file mode 100644
index a1affe4..0000000
--- a/files/sdk.properties
+++ /dev/null
@@ -1,4 +0,0 @@
-# THIS FILE IS OBSOLETE AND IS ONLY THERE TO BUILD
-# OLDER VERSION OF THE PLATFORM
-#
-# THE NEW FILE IS LOCATED IN development.git/sdk
diff --git a/files/tools_source.properties b/files/tools_source.properties
deleted file mode 100644
index 0be07dc..0000000
--- a/files/tools_source.properties
+++ /dev/null
@@ -1,3 +0,0 @@
-Pkg.UserSrc=false
-Pkg.Revision=24.3.3
-Platform.MinPlatformToolsRev=20
diff --git a/files/typos/typos-de.txt b/files/typos/typos-de.txt
deleted file mode 100644
index 5bcdffc..0000000
--- a/files/typos/typos-de.txt
+++ /dev/null
@@ -1,2219 +0,0 @@
-# This file contains a number of common German typos:
-andriod->android
-
-# The remainder of this file contains misspellings from
-# http://de.m.wikipedia.org/wiki/Wikipedia:Liste_von_Tippfehlern/F%C3%BCr_Maschinen
-# plus some post-processing to fix invalid entries, remove duplicates, etc.
-#
-# The content is available under the
-# "Creative Commons Attribution-ShareAlike License"
-# http://creativecommons.org/licenses/by-sa/3.0/
-#
-# THE WORK (AS DEFINED BELOW) IS PROVIDED UNDER THE TERMS OF THIS CREATIVE
-# COMMONS PUBLIC LICENSE ("CCPL" OR "LICENSE"). THE WORK IS PROTECTED BY
-# COPYRIGHT AND/OR OTHER APPLICABLE LAW. ANY USE OF THE WORK OTHER THAN AS
-# AUTHORIZED UNDER THIS LICENSE OR COPYRIGHT LAW IS PROHIBITED.
-#
-# BY EXERCISING ANY RIGHTS TO THE WORK PROVIDED HERE, YOU ACCEPT AND AGREE
-# TO BE BOUND BY THE TERMS OF THIS LICENSE. TO THE EXTENT THIS LICENSE MAY
-# BE CONSIDERED TO BE A CONTRACT, THE LICENSOR GRANTS YOU THE RIGHTS
-# CONTAINED HERE IN CONSIDERATION OF YOUR ACCEPTANCE OF SUCH TERMS AND
-# CONDITIONS.
-#
-# *1. Definitions*
-#
-#  1. *"Adaptation"* means a work based upon the Work, or upon the Work
-#     and other pre-existing works, such as a translation, adaptation,
-#     derivative work, arrangement of music or other alterations of a
-#     literary or artistic work, or phonogram or performance and includes
-#     cinematographic adaptations or any other form in which the Work may
-#     be recast, transformed, or adapted including in any form
-#     recognizably derived from the original, except that a work that
-#     constitutes a Collection will not be considered an Adaptation for
-#     the purpose of this License. For the avoidance of doubt, where the
-#     Work is a musical work, performance or phonogram, the
-#     synchronization of the Work in timed-relation with a moving image
-#     ("synching") will be considered an Adaptation for the purpose of
-#     this License.
-#  2. *"Collection"* means a collection of literary or artistic works,
-#     such as encyclopedias and anthologies, or performances, phonograms
-#     or broadcasts, or other works or subject matter other than works
-#     listed in Section 1(f) below, which, by reason of the selection and
-#     arrangement of their contents, constitute intellectual creations, in
-#     which the Work is included in its entirety in unmodified form along
-#     with one or more other contributions, each constituting separate and
-#     independent works in themselves, which together are assembled into a
-#     collective whole. A work that constitutes a Collection will not be
-#     considered an Adaptation (as defined below) for the purposes of this
-#     License.
-#  3. *"Creative Commons Compatible License"* means a license that is
-#     listed at http://creativecommons.org/compatiblelicenses that has
-#     been approved by Creative Commons as being essentially equivalent to
-#     this License, including, at a minimum, because that license: (i)
-#     contains terms that have the same purpose, meaning and effect as the
-#     License Elements of this License; and, (ii) explicitly permits the
-#     relicensing of adaptations of works made available under that
-#     license under this License or a Creative Commons jurisdiction
-#     license with the same License Elements as this License.
-#  4. *"Distribute"* means to make available to the public the original
-#     and copies of the Work or Adaptation, as appropriate, through sale
-#     or other transfer of ownership.
-#  5. *"License Elements"* means the following high-level license
-#     attributes as selected by Licensor and indicated in the title of
-#     this License: Attribution, ShareAlike.
-#  6. *"Licensor"* means the individual, individuals, entity or entities
-#     that offer(s) the Work under the terms of this License.
-#  7. *"Original Author"* means, in the case of a literary or artistic
-#     work, the individual, individuals, entity or entities who created
-#     the Work or if no individual or entity can be identified, the
-#     publisher; and in addition (i) in the case of a performance the
-#     actors, singers, musicians, dancers, and other persons who act,
-#     sing, deliver, declaim, play in, interpret or otherwise perform
-#     literary or artistic works or expressions of folklore; (ii) in the
-#     case of a phonogram the producer being the person or legal entity
-#     who first fixes the sounds of a performance or other sounds; and,
-#     (iii) in the case of broadcasts, the organization that transmits the
-#     broadcast.
-#  8. *"Work"* means the literary and/or artistic work offered under the
-#     terms of this License including without limitation any production in
-#     the literary, scientific and artistic domain, whatever may be the
-#     mode or form of its expression including digital form, such as a
-#     book, pamphlet and other writing; a lecture, address, sermon or
-#     other work of the same nature; a dramatic or dramatico-musical work;
-#     a choreographic work or entertainment in dumb show; a musical
-#     composition with or without words; a cinematographic work to which
-#     are assimilated works expressed by a process analogous to
-#     cinematography; a work of drawing, painting, architecture,
-#     sculpture, engraving or lithography; a photographic work to which
-#     are assimilated works expressed by a process analogous to
-#     photography; a work of applied art; an illustration, map, plan,
-#     sketch or three-dimensional work relative to geography, topography,
-#     architecture or science; a performance; a broadcast; a phonogram; a
-#     compilation of data to the extent it is protected as a copyrightable
-#     work; or a work performed by a variety or circus performer to the
-#     extent it is not otherwise considered a literary or artistic work.
-#  9. *"You"* means an individual or entity exercising rights under this
-#     License who has not previously violated the terms of this License
-#     with respect to the Work, or who has received express permission
-#     from the Licensor to exercise rights under this License despite a
-#     previous violation.
-# 10. *"Publicly Perform"* means to perform public recitations of the Work
-#     and to communicate to the public those public recitations, by any
-#     means or process, including by wire or wireless means or public
-#     digital performances; to make available to the public Works in such
-#     a way that members of the public may access these Works from a place
-#     and at a place individually chosen by them; to perform the Work to
-#     the public by any means or process and the communication to the
-#     public of the performances of the Work, including by public digital
-#     performance; to broadcast and rebroadcast the Work by any means
-#     including signs, sounds or images.
-# 11. *"Reproduce"* means to make copies of the Work by any means
-#     including without limitation by sound or visual recordings and the
-#     right of fixation and reproducing fixations of the Work, including
-#     storage of a protected performance or phonogram in digital form or
-#     other electronic medium.
-#
-# *2. Fair Dealing Rights.* Nothing in this License is intended to reduce,
-# limit, or restrict any uses free from copyright or rights arising from
-# limitations or exceptions that are provided for in connection with the
-# copyright protection under copyright law or other applicable laws.
-#
-# *3. License Grant.* Subject to the terms and conditions of this License,
-# Licensor hereby grants You a worldwide, royalty-free, non-exclusive,
-# perpetual (for the duration of the applicable copyright) license to
-# exercise the rights in the Work as stated below:
-#
-#  1. to Reproduce the Work, to incorporate the Work into one or more
-#     Collections, and to Reproduce the Work as incorporated in the
-#     Collections;
-#  2. to create and Reproduce Adaptations provided that any such
-#     Adaptation, including any translation in any medium, takes
-#     reasonable steps to clearly label, demarcate or otherwise identify
-#     that changes were made to the original Work. For example, a
-#     translation could be marked "The original work was translated from
-#     English to Spanish," or a modification could indicate "The original
-#     work has been modified.";
-#  3. to Distribute and Publicly Perform the Work including as
-#     incorporated in Collections; and,
-#  4. to Distribute and Publicly Perform Adaptations.
-#  5.
-#
-#     For the avoidance of doubt:
-#
-#      1. *Non-waivable Compulsory License Schemes*. In those
-#         jurisdictions in which the right to collect royalties through
-#         any statutory or compulsory licensing scheme cannot be waived,
-#         the Licensor reserves the exclusive right to collect such
-#         royalties for any exercise by You of the rights granted under
-#         this License;
-#      2. *Waivable Compulsory License Schemes*. In those jurisdictions in
-#         which the right to collect royalties through any statutory or
-#         compulsory licensing scheme can be waived, the Licensor waives
-#         the exclusive right to collect such royalties for any exercise
-#         by You of the rights granted under this License; and,
-#      3. *Voluntary License Schemes*. The Licensor waives the right to
-#         collect royalties, whether individually or, in the event that
-#         the Licensor is a member of a collecting society that
-#         administers voluntary licensing schemes, via that society, from
-#         any exercise by You of the rights granted under this License.
-#
-# The above rights may be exercised in all media and formats whether now
-# known or hereafter devised. The above rights include the right to make
-# such modifications as are technically necessary to exercise the rights
-# in other media and formats. Subject to Section 8(f), all rights not
-# expressly granted by Licensor are hereby reserved.
-#
-# *4. Restrictions.* The license granted in Section 3 above is expressly
-# made subject to and limited by the following restrictions:
-#
-#  1. You may Distribute or Publicly Perform the Work only under the terms
-#     of this License. You must include a copy of, or the Uniform Resource
-#     Identifier (URI) for, this License with every copy of the Work You
-#     Distribute or Publicly Perform. You may not offer or impose any
-#     terms on the Work that restrict the terms of this License or the
-#     ability of the recipient of the Work to exercise the rights granted
-#     to that recipient under the terms of the License. You may not
-#     sublicense the Work. You must keep intact all notices that refer to
-#     this License and to the disclaimer of warranties with every copy of
-#     the Work You Distribute or Publicly Perform. When You Distribute or
-#     Publicly Perform the Work, You may not impose any effective
-#     technological measures on the Work that restrict the ability of a
-#     recipient of the Work from You to exercise the rights granted to
-#     that recipient under the terms of the License. This Section 4(a)
-#     applies to the Work as incorporated in a Collection, but this does
-#     not require the Collection apart from the Work itself to be made
-#     subject to the terms of this License. If You create a Collection,
-#     upon notice from any Licensor You must, to the extent practicable,
-#     remove from the Collection any credit as required by Section 4(c),
-#     as requested. If You create an Adaptation, upon notice from any
-#     Licensor You must, to the extent practicable, remove from the
-#     Adaptation any credit as required by Section 4(c), as requested.
-#  2. You may Distribute or Publicly Perform an Adaptation only under the
-#     terms of: (i) this License; (ii) a later version of this License
-#     with the same License Elements as this License; (iii) a Creative
-#     Commons jurisdiction license (either this or a later license
-#     version) that contains the same License Elements as this License
-#     (e.g., Attribution-ShareAlike 3.0 US)); (iv) a Creative Commons
-#     Compatible License. If you license the Adaptation under one of the
-#     licenses mentioned in (iv), you must comply with the terms of that
-#     license. If you license the Adaptation under the terms of any of the
-#     licenses mentioned in (i), (ii) or (iii) (the "Applicable License"),
-#     you must comply with the terms of the Applicable License generally
-#     and the following provisions: (I) You must include a copy of, or the
-#     URI for, the Applicable License with every copy of each Adaptation
-#     You Distribute or Publicly Perform; (II) You may not offer or impose
-#     any terms on the Adaptation that restrict the terms of the
-#     Applicable License or the ability of the recipient of the Adaptation
-#     to exercise the rights granted to that recipient under the terms of
-#     the Applicable License; (III) You must keep intact all notices that
-#     refer to the Applicable License and to the disclaimer of warranties
-#     with every copy of the Work as included in the Adaptation You
-#     Distribute or Publicly Perform; (IV) when You Distribute or Publicly
-#     Perform the Adaptation, You may not impose any effective
-#     technological measures on the Adaptation that restrict the ability
-#     of a recipient of the Adaptation from You to exercise the rights
-#     granted to that recipient under the terms of the Applicable License.
-#     This Section 4(b) applies to the Adaptation as incorporated in a
-#     Collection, but this does not require the Collection apart from the
-#     Adaptation itself to be made subject to the terms of the Applicable
-#     License.
-#  3. If You Distribute, or Publicly Perform the Work or any Adaptations
-#     or Collections, You must, unless a request has been made pursuant to
-#     Section 4(a), keep intact all copyright notices for the Work and
-#     provide, reasonable to the medium or means You are utilizing: (i)
-#     the name of the Original Author (or pseudonym, if applicable) if
-#     supplied, and/or if the Original Author and/or Licensor designate
-#     another party or parties (e.g., a sponsor institute, publishing
-#     entity, journal) for attribution ("Attribution Parties") in
-#     Licensor's copyright notice, terms of service or by other reasonable
-#     means, the name of such party or parties; (ii) the title of the Work
-#     if supplied; (iii) to the extent reasonably practicable, the URI, if
-#     any, that Licensor specifies to be associated with the Work, unless
-#     such URI does not refer to the copyright notice or licensing
-#     information for the Work; and (iv) , consistent with Ssection 3(b),
-#     in the case of an Adaptation, a credit identifying the use of the
-#     Work in the Adaptation (e.g., "French translation of the Work by
-#     Original Author," or "Screenplay based on original Work by Original
-#     Author"). The credit required by this Section 4(c) may be
-#     implemented in any reasonable manner; provided, however, that in the
-#     case of a Adaptation or Collection, at a minimum such credit will
-#     appear, if a credit for all contributing authors of the Adaptation
-#     or Collection appears, then as part of these credits and in a manner
-#     at least as prominent as the credits for the other contributing
-#     authors. For the avoidance of doubt, You may only use the credit
-#     required by this Section for the purpose of attribution in the
-#     manner set out above and, by exercising Your rights under this
-#     License, You may not implicitly or explicitly assert or imply any
-#     connection with, sponsorship or endorsement by the Original Author,
-#     Licensor and/or Attribution Parties, as appropriate, of You or Your
-#     use of the Work, without the separate, express prior written
-#     permission of the Original Author, Licensor and/or Attribution Parties.
-#  4. Except as otherwise agreed in writing by the Licensor or as may be
-#     otherwise permitted by applicable law, if You Reproduce, Distribute
-#     or Publicly Perform the Work either by itself or as part of any
-#     Adaptations or Collections, You must not distort, mutilate, modify
-#     or take other derogatory action in relation to the Work which would
-#     be prejudicial to the Original Author's honor or reputation.
-#     Licensor agrees that in those jurisdictions (e.g. Japan), in which
-#     any exercise of the right granted in Section 3(b) of this License
-#     (the right to make Adaptations) would be deemed to be a distortion,
-#     mutilation, modification or other derogatory action prejudicial to
-#     the Original Author's honor and reputation, the Licensor will waive
-#     or not assert, as appropriate, this Section, to the fullest extent
-#     permitted by the applicable national law, to enable You to
-#     reasonably exercise Your right under Section 3(b) of this License
-#     (right to make Adaptations) but not otherwise.
-#
-# *5. Representations, Warranties and Disclaimer*
-#
-# UNLESS OTHERWISE MUTUALLY AGREED TO BY THE PARTIES IN WRITING, LICENSOR
-# OFFERS THE WORK AS-IS AND MAKES NO REPRESENTATIONS OR WARRANTIES OF ANY
-# KIND CONCERNING THE WORK, EXPRESS, IMPLIED, STATUTORY OR OTHERWISE,
-# INCLUDING, WITHOUT LIMITATION, WARRANTIES OF TITLE, MERCHANTIBILITY,
-# FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT, OR THE ABSENCE OF
-# LATENT OR OTHER DEFECTS, ACCURACY, OR THE PRESENCE OF ABSENCE OF ERRORS,
-# WHETHER OR NOT DISCOVERABLE. SOME JURISDICTIONS DO NOT ALLOW THE
-# EXCLUSION OF IMPLIED WARRANTIES, SO SUCH EXCLUSION MAY NOT APPLY TO YOU.
-#
-# *6. Limitation on Liability.* EXCEPT TO THE EXTENT REQUIRED BY
-# APPLICABLE LAW, IN NO EVENT WILL LICENSOR BE LIABLE TO YOU ON ANY LEGAL
-# THEORY FOR ANY SPECIAL, INCIDENTAL, CONSEQUENTIAL, PUNITIVE OR EXEMPLARY
-# DAMAGES ARISING OUT OF THIS LICENSE OR THE USE OF THE WORK, EVEN IF
-# LICENSOR HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
-#
-# *7. Termination*
-#
-#  1. This License and the rights granted hereunder will terminate
-#     automatically upon any breach by You of the terms of this License.
-#     Individuals or entities who have received Adaptations or Collections
-#     from You under this License, however, will not have their licenses
-#     terminated provided such individuals or entities remain in full
-#     compliance with those licenses. Sections 1, 2, 5, 6, 7, and 8 will
-#     survive any termination of this License.
-#  2. Subject to the above terms and conditions, the license granted here
-#     is perpetual (for the duration of the applicable copyright in the
-#     Work). Notwithstanding the above, Licensor reserves the right to
-#     release the Work under different license terms or to stop
-#     distributing the Work at any time; provided, however that any such
-#     election will not serve to withdraw this License (or any other
-#     license that has been, or is required to be, granted under the terms
-#     of this License), and this License will continue in full force and
-#     effect unless terminated as stated above.
-#
-# *8. Miscellaneous*
-#
-#  1. Each time You Distribute or Publicly Perform the Work or a
-#     Collection, the Licensor offers to the recipient a license to the
-#     Work on the same terms and conditions as the license granted to You
-#     under this License.
-#  2. Each time You Distribute or Publicly Perform an Adaptation, Licensor
-#     offers to the recipient a license to the original Work on the same
-#     terms and conditions as the license granted to You under this License.
-#  3. If any provision of this License is invalid or unenforceable under
-#     applicable law, it shall not affect the validity or enforceability
-#     of the remainder of the terms of this License, and without further
-#     action by the parties to this agreement, such provision shall be
-#     reformed to the minimum extent necessary to make such provision
-#     valid and enforceable.
-#  4. No term or provision of this License shall be deemed waived and no
-#     breach consented to unless such waiver or consent shall be in
-#     writing and signed by the party to be charged with such waiver or
-#     consent.
-#  5. This License constitutes the entire agreement between the parties
-#     with respect to the Work licensed here. There are no understandings,
-#     agreements or representations with respect to the Work not specified
-#     here. Licensor shall not be bound by any additional provisions that
-#     may appear in any communication from You. This License may not be
-#     modified without the mutual written agreement of the Licensor and You.
-#  6. The rights granted under, and the subject matter referenced, in this
-#     License were drafted utilizing the terminology of the Berne
-#     Convention for the Protection of Literary and Artistic Works (as
-#     amended on September 28, 1979), the Rome Convention of 1961, the
-#     WIPO Copyright Treaty of 1996, the WIPO Performances and Phonograms
-#     Treaty of 1996 and the Universal Copyright Convention (as revised on
-#     July 24, 1971). These rights and subject matter take effect in the
-#     relevant jurisdiction in which the License terms are sought to be
-#     enforced according to the corresponding provisions of the
-#     implementation of those treaty provisions in the applicable national
-#     law. If the standard suite of rights granted under applicable
-#     copyright law includes additional rights not granted under this
-#     License, such additional rights are deemed to be included in the
-#     License; this License is not intended to restrict the license of any
-#     rights under applicable law.
-Aaachen->Aachen
-aberufen->abgerufen
-abgekürtzt->abgekürzt
-abgeschloßen->abgeschlossen
-Abhängikeit->Abhängigkeit
-Abhängkeit->Abhängigkeit
-abolvieren->absolvieren
-abolviert->absolviert
-abschliessen->abschließen
-abschliessend->abschließend
-abschliessende->abschließende
-abschliessenden->abschließenden
-abschliessender->abschließender
-abschliesst->abschließt
-Absorbtion->Absorption
-abzuschliessen->abzuschließen
-achsial*->axial*
-achzig->achtzig
-Addresse->Adresse
-addressiert->adressiert
-Adjudant->Adjutant
-Aeropag->Areopag
-Aeropagos->Areopag
-afrz->afrz.
-agberufen->abgerufen
-Agendas->Agenden
-agerufen->abgerufen
-agraisch->agrarisch
-agressiv->aggressiv
-akkomodieren->akkommodieren
-Akkustik->Akustik
-akreditiert->akkreditiert
-Aktivitiäten->Aktivitäten
-Aktzeptanz->Akzeptanz
-alamiert->alarmiert
-aler->aller
-alerdings->allerdings
-Algorhitmus->Algorithmus
-Algoritmus->Algorithmus
-aliiert->alliiert
-allerding->allerdings
-allgmein->allgemein
-alliert->alliiert
-allredings->allerdings
-all zu->allzu
-Alstadt->Altstadt
-am einem->an einem,am einen
-amerikanich->amerikanisch
-amerikansch->amerikanisch
-amerkanisch->amerikanisch
-am seinem->an seinem
-Amtsitz->Amtssitz
-Amtsprache->Amtssprache
-Amtsprachen->Amtssprachen
-Anaesthesie->Anästhesie
-Analen->Annalen
-anderere->andere
-andereren->anderen
-andererer->anderer
-andereseits->andererseits
-anders herum->andersherum
-andersrum->besser: andersherum
-angelsächisch->angelsächsisch
-angelsächsiche->angelsächsische
-angelsächsichen->angelsächsischen
-angesehendsten->angesehensten
-anlaesslich->anlässlich
-anlaeßlich->anlässlich
-änlich->ähnlich
-annährend->annähernd
-Annährung->Annäherung
-Annektion->Annexion
-annerkannt->anerkannt
-annerkannte->anerkannte
-Annerkennung->Anerkennung
-annuliert->annulliert
-Annulierung->Annullierung
-Anordung->Anordnung
-Anschaung->Anschauung
-anschliessen->anschließen
-anschliessend->anschließend
-anschliessende->anschließende
-anschliessenden->anschließenden
-anschliessender->anschließender
-anschliessendes->anschließendes
-anschliesst->anschließt
-Anstoss->Anstoß
-anvisiert->angekündigt,avisiert
-Anwendund->Anwendung
-Anwort->Antwort
-Appartment*->Apartment*,Appartement*
-aquirieren->akquirieren
-Aquisition->Akquisition
-archälogische->archäologische
-archälogischen->archäologischen
-Archeologe->Archäologe
-Argentur*->Agentur*
-Arikel->Artikel
-arithmetrisch->arithmetisch
-Artzt->Arzt
-assozial->asozial
-asymetrisch*->asymmetrisch*
-Atacke->Attacke
-atackieren->attackieren
-atakieren->attackieren
-Athleth*->Athlet*
-Athmosphäre*->Atmosphäre*
-athmosphärisch*->atmosphärisch*
-Atrappe->Attrappe
-attakieren->attackieren
-Aufällig->Auffällig
-Aufassung->Auffassung
-Aufassungen->Auffassungen
-auf dem ersten Blick->auf den ersten Blick
-auf eigenem Wunsch->auf eigenen Wunsch,aus eigenem Wunsch
-Aufenhalt->Aufenthalt
-Aufname->Aufnahme
-Auforderung->Aufforderung
-aufrecht erhält->aufrechterhält
-aufrecht erhalten->aufrechterhalten
-aufrecht erhielt->aufrechterhielt
-aufrecht zu erhalten->aufrechtzuerhalten
-Aufsteig->Aufstieg
-Auftieg->Aufstieg
-auftretenen->auftretenden
-auftretten->auftreten
-Augenlied->Augenlid
-augenommen->aufgenommen,ausgenommen
-auml->Ä,ä
-Ausage->Aussage
-Ausagen->Aussagen
-auschliesslich->ausschließlich
-auschließlich->ausschließlich
-auschliessliche->ausschließliche
-auschliesslichen->ausschließlichen
-Auseinadersetzung->Auseinandersetzung
-Auseindersetzung->Auseinandersetzung
-auserdem->außerdem
-auserhalb->außerhalb
-Ausgangpunkt->Ausgangspunkt
-ausgeschalten->ausgeschaltet
-Ausicht->Aussicht
-Ausmass->Ausmaß
-Ausprache->Aussprache
-Auspruch->Ausspruch
-ausschliessen->ausschließen
-ausschliesslich->ausschließlich
-ausschliesst->ausschließt
-Ausschwitz->Auschwitz
-aussen->außen
-Aussenminister->Außenminister
-ausser->außer
-ausserdem->außerdem
-äussere->äußere
-äusseren->äußeren
-äusserer->äußerer
-äusseres->äußeres
-aussergewöhnlich->außergewöhnlich
-aussergewöhnlichen->außergewöhnlichen
-ausserhalb->außerhalb
-ausserirdisch->außerirdisch
-ausserirdische->außerirdische
-ausserirdischen->außerirdischen
-äussern->äußern
-ausserordentlich->außerordentlich
-ausserordentliche->außerordentliche
-ausserordentlichem->außerordentlichem
-ausserordentlichen->außerordentlichen
-ausserordentlicher->außerordentlicher
-ausserordentliches->außerordentliches
-äusserst->äußerst
-äusserste->äußerste
-äussersten->äußersten
-äusserte->äußerte
-äusserten->äußerten
-Äusserung->Äußerung
-Äusserungen->Äußerungen
-aussschliesslich->ausschließlich
-aussschließlich->ausschließlich
-außschließlich->ausschließlich
-Austattung->Ausstattung
-Austellung->Ausstellung
-Austellungen->Ausstellungen
-Austerben->Aussterben
-Auszeichung->Auszeichnung
-Auszeichungen->Auszeichnungen
-auszuschliessen->auszuschließen
-Author des->Autor des
-authorisieren->autorisieren
-authorisiert->autorisiert
-Authorisierung*->Autorisierung*
-Authorität->Autorität
-dem Autoren->dem Autor
-des Autoren->des Autors
-vom Autoren->vom Autor
-Babies->Babys
-bafand->befand
-Balett->Ballett
-bassierend->basierend
-Batallion->Bataillon
-Battaillon->Bataillon
-Battallion->Bataillon
-Bauerhof->Bauernhof
-Bauerhöfe->Bauernhöfe
-bedeudend->bedeutend
-bedeudende->bedeutende
-bedeudenden->bedeutenden
-bedeudender->bedeutender
-bedeudendes->bedeutendes
-bedeudet->bedeutet
-bedeudete->bedeutete
-bedeutendeste->bedeutendste
-bedeutenste->bedeutendste
-bedeutensten->bedeutendsten
-bedeutenster->bedeutendster
-bedeutenstes->bedeutendstes
-bedeutesten->bedeutendsten
-Bedinung->Bedingung/Bedienung
-Bedürfniss->Bedürfnis
-beeinflußen->beeinflussen
-Beeinflußung->Beeinflussung
-beeinhalten->beinhalten
-beeinhaltet->beinhaltet
-befindet auf->befindet sich auf
-befindet ein*->befindet sich ein*
-befindet in->befindet sich in
-begang->beging,begann
-beherrbergt->beherbergt
-beherschen->beherrschen
-beherscht->beherrscht
-beherschte->beherrschte
-beidemale->beide Male
-beim dem->bei dem,beim
-beim der->bei der,beim,bei dem
-beindrucken->beeindrucken
-beinflussen->beeinflussen
-beinflusst*->beeinflusst*
-Beipiel*->Beispiel*
-Beispeil*->Beispiel*
-beispielswiese->beispielsweise
-beispielweise->beispielsweise
-Beitag->Beitrag
-bekammen->bekamen
-Bekenntniss->Bekenntnis
-Benefitz->Benefiz
-bennant->benannt
-Bennenung->Benennung
-Berechung->Berechnung
-bereit gehalten->bereitgehalten
-bereit gestellt->bereitgestellt
-bereit hält->bereithält
-bereit stand->bereitstand
-bereit stehen->bereitstehen
-bereit steht->bereitsteht
-bereit stellt->bereitstellt
-bereit zu halten->bereitzuhalten
-bereit zu stellen->bereitzustellen
-Berfung->Berufung
-Berreich->Bereich
-berücksichtig->berücksichtigt
-berümt->berühmt
-berümte->berühmte
-besass->besaß
-besassen->besaßen
-besitzten->besitzen
-Bespiel->Beispiel
-Bestandsteil->Bestandteil
-Bestandtteil->Bestandteil
-bestbezahltest*->bestbezahlt*
-bestimmmt->bestimmt
-bestreitete->bestritt
-Betreung->Betreuung
-Betriebsystem*->Betriebssystem*
-Bevökerung->Bevölkerung
-Beweiß->Beweis
-bezeichent->bezeichnet
-bezeichet->bezeichnet
-Bezeichung*->Bezeichnung*
-Biograpfie->Biografie
-bischen->bisschen
-Bischofsitz->Bischofssitz
-Bisquit->Biskuit
-bloss->bloß
-blosse->bloße
-blossen->bloßen
-blosser->bloßer
-blosses->bloßes
-an Board->an Bord
-on Bord->an Bord
-bombadieren->bombardieren
-bombadiert->bombardiert
-Bombadierung->Bombardierung
-boolsch->boolesch
-brilliant->brillant
-britsch->britisch
-britsche->britische
-britschen->britischen
-britscher->britischer
-britsches->britisches
-Bronzemedaillie*->Bronzemedaille*
-Bronzemedallie*->Bronzemedaille*
-Bügermeister->Bürgermeister
-Bundesaussenminister->Bundesaußenminister
-Bundesstrasse->Bundesstraße
-Bundestaat*->Bundesstaat*
-Bundestraße->Bundesstraße
-Bundsandstein*->Buntsandstein*
-byzantisch*->byzantinisch*
-chinesiche->chinesische
-chinesichen->chinesischen
-chinesicher->chinesischer
-Chirugie->Chirurgie
-Chonik->Chronik
-Chonist->Chronist
-chonologisch->chronologisch
-cirka->zirka,circa
-dadruch->dadurch
-daduch->dadurch
-danaben->daneben
-danch->danach
-dannach->danach
-deuten daraufhin->deuten darauf hin
-deutet daraufhin->deutet darauf hin
-weisen daraufhin->weisen darauf hin
-weist daraufhin->weist darauf hin
-darüberhinaus->darüber hinaus
-daruf->darauf
-darufhin->daraufhin
-das es sich bei->dass es sich bei
-das es sich um->dass es sich um
-so das der->so dass der
-so das die->so dass die
-so das er->so dass er
-so das sie->so dass sie
-dass heißt->das heißt
-dastellt->darstellt
-dazu gehörige*->dazugehörige*
-Debutalbum->Debütalbum
-Definiton->Definition
-definitv->definitiv
-Defintion->Definition
-deligiert->delegiert
-dem selben->demselben
-denoch->dennoch
-den selben->denselben
-derem->deren
-der Niederlanden->der Niederlande,den Niederlanden
-der selbe->derselbe
-der selben->derselben
-in der USA->in den USA
-des des->des
-des eines->eines,des,der eines,dem eines
-des selben->desselben
-dessem->dessen
-desshalb->deshalb
-desweiteren->des Weiteren
-desweitern->des Weiteren
-des Weitern->des Weiteren
-detailiert*->detailliert*
-detalliert->detailliert
-dezeit->derzeit
-Dezmber->Dezember
-die selbe->dieselbe
-die selben->dieselben
-Differentation->Differentiation
-Dikator->Diktator
-Dikatur->Diktatur
-Diphterie->Diphtherie
-Diphtong->Diphthong
-Dirgent->Dirigent
-Discografie->Diskografie
-Discographie->Diskographie
-diskreminieren->diskriminieren
-diskrimierend*->diskriminierend*
-Diskrimierung*->Diskriminierung*
-Diskusion->Diskussion
-Disseration->Dissertation
-Divison*->Division*
-Divsion*->Division*
-Diziplin*->Disziplin*
-Dollmetscher->Dolmetscher
-dort hin->dorthin
-draufhin->daraufhin
-draussen->draußen
-Dreick->Dreieck
-dreissig->dreißig
-dreissiger->dreißiger
-druch->durch
-druchgeführt->durchgeführt
-duch->durch
-duchführen->durchführen
-Duchführung->Durchführung
-duchgeführt->durchgeführt
-Duchschnitt->Durchschnitt
-durch geführt->durchgeführt
-Durchschlagkraft->Durchschlagskraft
-Durchsetztung->Durchsetzung
-durchstossen->durchstoßen
-Durschnitt->Durchschnitt
-durschnittlich->durchschnittlich
-durschnittliche->durchschnittliche
-durschnittlichen->durchschnittlichen
-ebefalls->ebenfalls
-eben dies->ebendies
-eben diese->ebendiese
-eben diesem->ebendiesem
-eben diesen->ebendiesen
-eben dieser->ebendieser
-eben dieses->ebendieses
-ebendso->ebenso
-ebenfall->ebenfalls
-ebenfals->ebenfalls
-Editon->Edition
-Edtion->Edition
-einem eigenem->einem eigenen
-ihrem eigenem->ihrem eigenen
-seinem eigenem->seinem eigenen
-eigenen sich->eignen sich
-mit einen->mit einem
-eines des->eines der
-Einflüße->Einflüsse
-Einfuss->Einfluss
-einge->einige
-eingen->einigen
-eingentlich->eigentlich
-einger->einiger
-einges->einiges
-eingesetz->eingesetzt
-eingesetzen->eingesetzten
-einigemal->einige Mal
-einklich->eigentlich
-Einordung->Einordnung
-einschliessen->einschließen
-einschliesslich->einschließlich
-einschliesst->einschließt
-einzelen->einzelne
-einzigste->einzige
-einzigster->einziger
-einzigstes->einziges
-ekklektizistisch->eklektizistisch
-ekstasisch->ekstatisch
-elekrisch->elektrisch
-elekronisch->elektronisch
-eleminieren->eliminieren
-eleminiert->eliminiert
-emigiert->emigriert
-emigiriert->emigriert
-Emmigrant->Emigrant
-Emmigration->Emigration
-emmigriert->emigriert
-emprisch->empirisch
-Emsemble->Ensemble
-endeckt->entdeckt
-endeckte->entdeckte
-Endeckung*->Entdeckung*
-enfernt->entfernt
-enfernte->entfernte
-Enfernung->Entfernung
-Enfernungen->Entfernungen
-Engeneering->Engineering
-englsich->englisch
-engültig->endgültig
-enhält->enthält
-enhalten->enthalten
-Enscheidung->Entscheidung
-enstand->entstand
-enstanden->entstanden
-enstehen->entstehen
-ensteht->entsteht
-Enstehung->Entstehung
-entgegen gebracht*->entgegengebracht*
-entgegen gesetzt*->entgegengesetzt*
-entgegen kam->entgegenkam
-entgegen nahm->entgegennahm
-entgegen zu gehen->entgegenzugehen
-entgegen zu kommen->entgegenzukommen
-entgegen zu nehmen->entgegenzunehmen
-entgegen zu schleudern->entgegenzuschleudern
-entgegen zu setzen->entgegenzusetzen
-entgegen zu stellen->entgegenzustellen
-entgegen zu treten->entgegenzutreten
-entgegen zu wirken->entgegenzuwirken
-Entgeld->Entgelt
-entgültig*->endgültig*
-entlang führt*->entlangführt*
-entlang geführt*->entlanggeführt*
-entprechend->entsprechend
-entprechende->entsprechende
-entprechender->entsprechender
-entsant->entsandt
-entscheidene*->entscheidende*
-entscheident->entscheidend
-entschloß->entschloss
-entspechen*->entsprechen*
-entsprechene->entsprechende
-entsprechenen->entsprechenden
-entstandt->entstand
-enwickelt->entwickelt
-enwickelte->entwickelte
-enwickelten->entwickelten
-enwickelter->entwickelter
-enwickeltes->entwickeltes
-Enwicklung->Entwicklung
-Enwicklungen->Entwicklungen
-ereichen->erreichen
-ereicht->erreicht
-ereichte->erreichte
-Ereignise->Ereignisse
-Ereignisen->Ereignissen
-Ereigniss->Ereignis
-Erfog->Erfolg
-erfogreich->erfolgreich
-erfolgslos->erfolglos
-erfolgsversprechend->erfolgversprechend
-Erfurcht->Ehrfurcht
-Ergebniss->Ergebnis
-Erkentnis->Erkenntnis
-Erkentnisse->Erkenntnisse
-erklährt->erklärt
-ermöglich->ermöglicht,ermöglichen
-erorbert->erobert
-errinnern->erinnern
-errinnert->erinnert
-errreichen->erreichen
-errreicht->erreicht
-errreichte->erreichte
-errrichtet->errichtet
-ersmals->erstmals
-dem erstem->dem ersten
-im erstem->im ersten
-erzeilt->erzielt
-erzeilte->erzielte
-erziehlen->erzielen
-erziehlt->erzielt
-estisch->estnisch
-Ettikett*->Etikett*
-dem europäischem->dem europäischen
-im europäischem->im europäischen
-Examplar->Exemplar
-examplarisch->exemplarisch
-exellent->exzellent
-exisitiert->existiert
-Existens->Existenz
-Expediton->Expedition
-experimentiell->experimentell
-Extase->Ekstase
-Fahradtour->Fahrradtour
-fälschlicher Weise->fälschlicherweise
-familär*->familiär*
-Famile->Familie
-Familen*->Familien*
-Famlie*->Familie*
-Februrar->Februar
-Feburar->Februar
-fern geblieben->ferngeblieben
-fern gehalten->ferngehalten
-fern zu halten->fernzuhalten
-Fersehen->Fernsehen
-Ferseh*->Fernseh*
-fertigestellt->fertiggestellt
-festellen->feststellen
-Festellung->Feststellung
-fidet->findet
-Fiedrich->Friedrich
-Flagschiff->Flaggschiff
-Flektion->Flexion
-fliessen->fließen
-fliesst->fließt
-des Flughafen->des Flughafens
-Fluß->Fluss
-Flüße->Flüsse
-fokusieren->fokussieren
-fokusiert->fokussiert
-Fokusierung->Fokussierung
-Foschung->Forschung
-Fotographie->Fotografie,Photographie
-Fotographien->Fotografien,Photographien
-fotographiert->fotografiert
-franösisch*->französisch*
-frantösisch*->französisch*
-franzöisch*->französisch*
-französich*->französisch*
-dem französischem->dem französischen
-einem französischem->einem französischen
-im französischem->im französischen
-Freidrich->Friedrich
-frei gestellt->freigestellt
-Freimauerei->Freimaurerei
-Fremsprache->Fremdsprache
-Friedenschluss->Friedensschluss
-Friedich->Friedrich
-Frima->Firma
-fröhnen->frönen
-Frühjar->Frühjahr
-frühre->frühere
-fuer->für
-füher*->früher*,Führer*
-Fuktion*->Funktion*
-Funier*->Furnier*
-für für->für
-Fuss->Fuß
-Fussball->Fußball
-Fussballer->Fußballer
-Fussballerin->Fußballerin
-Fussballspieler->Fußballspieler
-Fussballspielerin->Fußballspielerin
-Fußballstadium->Fußballstadion
-Fusse->Fuße
-Füsse->Füße
-Füst->Fürst
-gabe es->gab es
-Gallerie->Galerie
-Gallerien->Galerien
-Gallionsfigur->Galionsfigur
-garnicht->gar nicht
-Garnision->Garnison
-Garnision*->Garnison*
-Gebäde->Gebäude
-Gebahren->Gebaren
-gebähren->gebären
-Gebaüde->Gebäude
-Gebaude->Gebäude
-Gebäuder->Gebäude
-gebornen->geborenen
-Gedult->Geduld
-Gedänk*->Gedenk*
-einem geeignetem->einem geeigneten
-Gefäss->Gefäß
-gegebenfalls->gegebenenfalls
-gegen einander->gegeneinander
-gegenüber gestellt->gegenübergestellt
-gegn->gegen
-gegnüber->gegenüber
-gehöhren->gehören
-gehöhrt*->gehört*
-gekührt->gekürt
-gelanden->geladen
-gemäss->gemäß
-gemeinsammen->gemeinsamen
-gemeisam->gemeinsam
-genant->genannt
-genanten->genannten
-Genaral*->General*
-geniessen->genießen
-gennant*->genannt*
-gennannt*->genannt*
-Gerneral*->General*
-gesäht->gesät
-gesammt->gesamt
-gesammten->gesamten
-gesammter->gesamter
-Gesandschaft*->Gesandtschaft*
-Geschichtschreiber->Geschichtsschreiber
-Geschichtschreibung->Geschichtsschreibung
-geschiet->geschieht
-geschlosssen->geschlossen
-gesetztlich->gesetzlich
-Gesichtpunkt->Gesichtspunkt
-gesponsort->gesponsert
-gesteift->gestreift
-gewan->gewann
-gewissermassen->gewissermaßen
-gewunken->gewinkt
-Ghandi->Gandhi
-giebt->gibt
-Giessen->Gießen
-gleichbleiben->gleich bleiben
-gleich zu tun->gleichzutun
-Gogle->Google
-Goldmedaillie*->Goldmedaille*
-Goldmedallie*->Goldmedaille*
-Gothik->Gotik
-gothisch->gotisch
-Grabmahl->Grabmal
-Gradwanderung->Gratwanderung
-Graftschaft*->Grafschaft*
-groesse->größe
-groeße->größe
-gröhlen->grölen
-Grossaufgebot->Großaufgebot
-Grossbritanien->Großbritannien
-Großbritanien->Großbritannien
-Grossbritannien->Großbritannien
-Grossbrittanien->Großbritannien
-Großbrittanien->Großbritannien
-Grossbrittannien->Großbritannien
-Großbrittannien->Großbritannien
-grosse->große
-grösse->größe
-grossem->großem
-einem großem->einem großen
-grossen->großen
-grossenteils->großenteils
-größenteils->größtenteils
-grosser->großer
-grösser->größer
-grössere->größere
-grösserem->größerem
-grösseren->größeren
-grösserer->größerer
-grösseres->größeres
-grosses->großes
-grösste->größte
-Grossteil->Großteil
-grossteils->großteils
-grössten->größten
-grösstenteils->größtenteils
-grösster->größter
-grösstes->größtes
-Gründstück*->Grundstück*
-einem grünem->einem grünen
-Guerrillakampf->Guerillakampf
-Guiness->Guinness
-Guiseppe->Giuseppe
-einem gutem->einem guten
-Güterloh*->Gütersloh*
-Häckchen->Häkchen
-haetten->hätten
-Handelschiff->Handelsschiff
-Handies->Handys
-hahnebüchen->hanebüchen
-hattte->hatte,hatten
-Haupstadt->Hauptstadt
-haupsächlich->hauptsächlich
-Haupstädte->Hauptstädte
-des Haus->des Hauses
-heiratetet->heiratet
-heiss->heiß
-heisser->heißer
-heisst->heißt
-heraus gebracht->herausgebracht
-herausragenste->herausragendste
-Herausvorderung->Herausforderung
-herraus->heraus
-herrausragend->herausragend
-Herrrschaft->Herrschaft
-Herrrscher->Herrscher
-Herschaft->Herrschaft
-Herscher->Herrscher
-hervoragen->hervorragen
-hervoragend->hervorragend
-hervor gegangen*->hervorgegangen*
-hervor ging->hervorging
-hervorragenste->hervorragendste
-Hierachie->Hierarchie
-hierachisch->hierarchisch
-hiess->hieß
-hinaus gehende*->hinausgehende*
-hingegegen->hingegen
-Hintegrund->Hintergrund
-Hintergund->Hintergrund
-hinterliess->hinterließ
-hinterliessen->hinterließen
-hinweg täuschen->hinwegtäuschen
-hinzu gefügt*->hinzugefügt*
-hinzu gekommen*->hinzugekommen*
-Hobbies->Hobbys
-Hochaus->Hochhaus
-Hochäuser->Hochhäuser
-höchst gelegene*->höchstgelegene*
-Hofffnung->Hoffnung
-Hoffung->Hoffnung
-höherere*->höhere*
-höherwertigere*->höherwertige*
-höhren->hören,höheren
-höhrt->hört
-Homage->Hommage
-hunderste*->hundertste*
-idendifiziert->identifiziert
-idenfiziert->identifiziert
-idiopatisch->idiopathisch
-im besonderen Maße->in besonderem Maße
-im Bezug auf->in Bezug auf
-Imbus->Inbus
-im dem->in dem,im
-im den->in den,in dem,ihm den
-im der->in der,im,ihm der
-im deutschsprachigem->im deutschsprachigen
-im einem->in einem
-im großem->in großem,im großen
-im großen Umfang->in großem Umfang
-im hohen Maße->in hohem Maße
-immernoch->immer noch
-immmer->immer
-Impendanz->Impedanz
-im seinem->in seinem
-im selbem->im selben
-inbesondere->insbesondere
-inclusive->inklusive
-Independet->Independent
-indeß->indes
-individiuell->individuell
-Industie->Industrie
-Industriealisierung->Industrialisierung
-in englisch->in Englisch
-inerhalb->innerhalb
-Infantrie->Infanterie
-infiszieren->infizieren
-in Folge->infolge
-in Folge der->infolge der
-in Folge des->infolge des
-in Folge einer->infolge einer
-in Folge eines->infolge eines
-in Folge von->infolge von
-in Folge dessen->infolgedessen,infolge dessen,in dessen Folge
-Ingeneur->Ingenieur
-ingesamt->insgesamt
-Ingredenzien->Ingredienzien
-Inhaltstoff->Inhaltsstoff
-Initation->Initiation,Imitation
-Initative->Initiative
-Initator->Initiator
-Initialie->Initiale
-Initialien->Initialen
-initieren->initiieren
-initiert->initiiert
-Inititative->Initiative
-Iniziative->Initiative
-in mitten->inmitten
-inne gehabt->innegehabt
-inne haben->innehaben
-inne hat->innehat
-inne hatte->innehatte
-inne hatten->innehatten
-Innenaustattung->Innenausstattung
-innnerhalb->innerhalb
-Insbruck->Innsbruck
-in selben Jahr->im selben Jahr
-insgeamt->insgesamt
-insgesammt->insgesamt
-Insitut->Institut
-Insitution->Institution
-in so fern->insofern
-in sofern->insofern
-instandgehalten->instand gehalten,in Stand gehalten
-instandgesetzt->instand gesetzt,in Stand gesetzt
-instandhalten->instand halten,in Stand halten
-instandsetzen->instand setzen,in Stand setzen
-instandzusetzen->instand zu setzen,in Stand zu setzen
-Instituion->Institution
-Instiut->Institut
-Instiution->Institution
-Instutition*->Institution*
-inszinieren->inszenieren
-Inszinierung->Inszenierung
-integiert->integriert
-intelektuell*->intellektuell*
-intenational->international
-intepretiert->interpretiert
-Interese->Interesse
-interesiert->interessiert
-Intergration->Integration
-intergriert->integriert
-Internetpräsens->Internetpräsenz
-interresiert->interessiert
-Interresse->Interesse
-interressiert->interessiert
-Intiative->Initiative
-intressiert->interessiert
-Intrument*->Instrument*
-Inverstor->Investor
-in wie weit->inwieweit
-in wieweit->inwieweit
-inwischen->inzwischen
-irgend ein->irgendein
-irgend eine->irgendeine
-irgend einem->irgendeinem
-irgend einen->irgendeinen
-irgend einer->irgendeiner
-irgend eines->irgendeines
-irgentwie->irgendwie
-irrtümlicher Weise->irrtümlicherweise
-ist meis->ist meist
-ist meisten->ist meistens
-italenisch->italienisch
-italiensch->italienisch
-italiensich->italienisch
-Jägerbatallion->Jägerbataillon
-Jahhundert->Jahrhundert
-Jahhunderte->Jahrhunderte
-Jahhunderts->Jahrhunderts
-des Jahre->des Jahres
-Jahrhudert->Jahrhundert
-Jahrhunder->Jahrhundert
-Jahrundert->Jahrhundert
-Jahrunderte->Jahrhunderte
-Jahrunderts->Jahrhunderts
-Jahrzent->Jahrzehnt
-Jahrzente->Jahrzehnte
-Jahundert->Jahrhundert
-Jahunderte->Jahrhunderte
-Jahunderts->Jahrhunderts
-Jäner->Jänner
-Janur->Januar
-Jarh->Jahr
-Jarhundert->Jahrhundert
-Jarhunderte->Jahrhunderte
-Jarhunderts->Jahrhunderts
-jdoch->jedoch
-jedch->jedoch
-jeoch->jedoch
-jeodch->jedoch
-jeweil->jeweils
-jeweis->jeweils
-Jounalist->Journalist
-Jubiliäum->Jubiläum
-Jungend*->Jugend*
-Justitz->Justiz
-Kabaret->Kabarett
-Kaiserlautern->Kaiserslautern
-Kandidad->Kandidat
-Kanditat->Kandidat
-Kappelle->Kapelle
-Karierre->Karriere
-Karrikaturist->Karikaturist
-karrikieren->karikieren
-Kasette*->Kassette*
-kathegorisch->kategorisch
-Kenntnise->Kenntnis
-Kenntniss->Kenntnis
-Kennzeichnug->Kennzeichnung
-Kentnis->Kenntnis
-Kentnisse->Kenntnisse
-Kirchtum->Kirchturm
-klassich->klassisch
-klassiche->klassische
-klassichen->klassischen
-klassicher->klassischer
-Klink->Klinik
-des Kloster->des Klosters
-km2->km²
-kmh->km/h
-Kofession*->Konfession*
-Kollission*->Kollision*
-Kollonade->Kolonnade
-Komandant->Kommandant
-Komandanten->Kommandanten
-Komando->Kommando
-Komandos->Kommandos
-komerziell->kommerziell
-Komissar->Kommissar
-Komissariat->Kommissariat
-komissarisch->kommissarisch
-Komission->Kommission
-komlett->komplett
-Kommilitionen->Kommilitonen
-Kommision->Kommission
-Kommitee->Komitee
-Kommittee->Komitee
-kommmen->kommen
-Kommunkation->Kommunikation
-Kompentenz->Kompetenz
-Könföderierte->Konföderierte
-Konförderierte->Konföderierte
-könglich->königlich
-Köngreich->Königreich
-Königsreich->Königreich
-Königstum->Königtum
-Konkurenz*->Konkurrenz*
-konkurieren*->konkurrieren*
-konkuriert*->konkurriert*
-könnnen->können,Können
-Konservationslexikon->Konversationslexikon
-Kontak->Kontakt
-konte->konnte
-Kontigent*->Kontingent*
-konventionnell->konventionell
-korregieren->korrigieren
-korregiert->korrigiert
-Krankeit*->Krankheit*
-Krankenaus->Krankenhaus
-Kreuzug*->Kreuzung*,Kreuzzug*
-Kriche->Kirche
-Kriegschiff->Kriegsschiff
-kummulieren->kumulieren
-Kunsstoff*->Kunststoff*
-Kunstaustellung*->Kunstausstellung*
-Kunstoff->Kunststoff
-Kunstoffe->Kunststoffe
-Kurfüst*->Kurfürst*
-kurzeitig*->kurzzeitig*
-läd->lädt
-Landesaustellung->Landesausstellung
-Landesprache->Landessprache
-Landwirschaft->Landwirtschaft
-landwirschaftlich->landwirtschaftlich
-langläufig->landläufig
-Lapalie->Lappalie
-Lassithi->Lasithi
-läst->lässt
-lateinsch->lateinisch
-lateinsche->lateinische
-lateinschen->lateinischen
-lateinscher->lateinischer
-lateinsches->lateinisches
-Lebenstil->Lebensstil
-Lebenweise->Lebensweise
-legänder->legendär
-Leibzig->Leipzig
-Leichathlet*->Leichtathlet*
-Leichnahm->Leichnam
-letze->letzte
-letzem->letztem
-letzen->letzten
-letzendlich->letztendlich
-letzer->letzter
-letzere->letztere
-letzerem->letzterem
-letzeren->letzteren
-letzerer->letzterer
-letzeres->letzteres
-letzes->letztes
-letzlich->letztlich
-letztenendes->letzten Endes
-Lexikas->Lexika
-Liason->Liaison
-liess->ließ
-liesse->ließe
-liessen->ließen
-ließt->er/sie/es liest; ließ; fließt
-Lilliputaner->Liliputaner
-literaisch->literarisch
-literatisch->literarisch
-lizensieren->lizenzieren
-lizensiert->lizenziert
-lizensierte->lizenzierte
-lizensiertem->lizenziertem
-lizensierten->lizenzierten
-lizensierter->lizenzierter
-lizensiertes->lizenziertes
-Lizensierung->Lizenzierung
-los zu werden->loszuwerden
-Louisana->Louisiana
-Lousiana->Louisiana
-Luwig->Ludwig
-Lybien->Libyen
-lybisch->libysch
-lybische->libysche
-lybischem->libyschem
-lybischen->libyschen
-lybischer->libyscher
-lybisches->libysches
-machmal->manchmal
-Manhatan->Manhattan
-Manhatta->Manhattan
-Manhatten->Manhattan
-Manhetten->Manhattan
-Manschaft->Mannschaft
-Manmschaft->Mannschaft
-Mannhattan->Manhattan
-Mannöver->Manöver
-Mannschaf->Mannschaft
-Mannschaftt->Mannschaft
-Mannshcaft->Mannschaft
-Mansardach->Mansarddach
-Mansardendach->Mansarddach
-Mansnchaften->Mannschaft
-Manssarddach->Mansarddach
-marrokanisch*->marokkanisch*
-marrokkanisch*->marokkanisch*
-Marrokko->Marokko
-Marroko->Marokko
-Marylin->meist Marilyn
-Marytrium->Martyrium
-Märtyrium->Martyrium
-Maschiene->Maschine
-Maschienen->Maschinen
-mässig->mäßig
-mässige->mäßige
-mässigem->mäßigem
-mässigen->mäßigen
-mässiger->mäßiger
-mässiges->mäßiges
-Mass->Maß
-Massgabe->Maßgabe
-Massgaben->Maßgaben
-massgebend->maßgebend
-massgebende->maßgebende
-massgebendem->maßgebendem
-massgebenden->maßgebenden
-massgebender->maßgebender
-massgebendes->maßgebendes
-massgeblich->maßgeblich
-massgebliche->maßgebliche
-massgeblichem->maßgeblichem
-massgeblichen->maßgeblichen
-massgeblicher->maßgeblicher
-massgebliches->maßgebliches
-masslos->maßlos
-masslose->maßlose
-masslosen->maßlosen
-massloser->maßloser
-massloses->maßloses
-Massnahme->Maßnahme
-Massnahmen->Maßnahmen
-Matraze->Matratze
-Matritze->Matrize,Matrix
-Maximillian->meist Maximilian
-Medailie->Medaille
-Medaillie->Medaille
-Medailliengewinner->Medaillengewinner
-Medailliengewinnerin->Medaillengewinnerin
-Medallie->Medaille
-Medalliengewinner->Medaillengewinner
-Medalliengewinnerin->Medaillengewinnerin
-medizinsch->medizinisch
-medizisch->medizinisch
-medizische->medizinische
-medizischem->medizinischem
-medizischen->medizinischen
-medizischer->medizinischer
-medizisches->medizinisches
-Meerespiegel->Meeresspiegel
-Meeresspegel->Meeresspiegel
-mehere->mehrere
-meheren->mehreren
-meherer->mehrerer
-mehre->meist mehrere
-mehren->gelegentlich mehreren
-mehrer->häufig mehrerer,mehrere
-mehrerere->mehrere
-mehrtätige->mehrtägige
-meisst->meist
-meißt->meist
-meißten->meisten
-meißtens->meistens
-meistbesuchtesten->meistbesuchten
-meist gelesene*->meistgelesene*
-meist gesehene*->meistgesehene*
-meist gesuchte*->meistgesuchte*
-meits->meist
-mengemässig->mengenmäßig
-mengenmässig->mengenmäßig
-Mensche->Menschen
-Menscheit->Menschheit
-Menschens->Menschen
-Meßgerät->Messgerät
-Meßgeräte->Messgeräte
-Messystem->Messsystem
-Meßsystem->Messsystem
-Metallegierung->Metalllegierung
-Metereologe->Meteorologe
-Metereologie->Meteorologie
-metereologisch->meteorologisch
-Meterologie->Meteorologie
-meterologisch->meteorologisch
-Mettal->Metall
-mhd->mittelhochdeutsch
-Micheal->meist Michael
-Miglied->Mitglied
-Milionen->Millionen
-Militärdikatur->Militärdiktatur
-Millarde->Milliarde
-Millarden*->Milliarden*
-Millenium->Millennium
-Millione->Millionen
-Millitär->Militär
-millitärisch->militärisch
-eine Millionen->eine Million
-Millon->Million
-Millonen->Millionen
-Miltär->Militär
-miltärisch->militärisch
-Miltitär->Militär
-miltitärisch->militärisch
-minimalste->minimale
-minimalster->minimaler
-minimalstes->minimales
-Ministerpäsident->Ministerpräsident
-mit einander->miteinander
-Mitgleid->Mitglied
-mitlerweile->mittlerweile
-mittlerweilen->mittlerweile
-Mitlgiled->Mitglied
-Mitlied->Mitglied
-mit samt->mitsamt
-Mittelater->Mittelalter
-mittelaterlich->mittelalterlich
-mittelständige->mittelständische
-mittelständigen->mittelständischen
-mittelständiger->mittelständischer
-mittelständiges->mittelständisches
-Mitteralter->Mittelalter
-mitteralterlich->mittelalterlich
-Mitterand->Mitterrand
-Mittglied->Mitglied
-Mittschnitt->Mitschnitt
-mnachmal->manchmal
-Mobiletelefon->Mobiltelefon
-moeglich->möglich
-moegliche->mögliche
-moeglichen->möglichen
-moeglicher->möglicher
-moegliches->mögliches
-möglicht->möglich,möglichst
-mordern->modern
-morderne->moderne
-mordernen->modernen
-morderner->moderner
-mordernes->modernes
-morgentlich*->morgendlich*
-morgends->morgens
-muß->muss
-mußte->musste
-mußten->mussten
-Museeum->Museum
-mutmasslich->mutmaßlich
-mutmassliche->mutmaßliche
-mutmasslichem->mutmaßlichem
-mutmasslichen->mutmaßlichen
-mutmasslicher->mutmaßlicher
-mutmassliches->mutmaßliches
-nachdem Krieg->nach dem Krieg
-Nachkommens->Nachkommen
-nächst gelegene*->nächstgelegene*
-nächst größere*->nächstgrößere*
-nächst höhere*->nächsthöhere*
-nächst kleinere*->nächstkleinere*
-nächst niedrigere*->nächstniedrigere*
-nächst tiefere*->nächsttiefere*
-Nahaufname->Nahaufnahme
-nahegelegenste->nächstgelegene
-naheste->nächste
-nahesten->nächsten
-nähmlich->nämlich
-namenlich->namentlich
-namenslos->namenlos
-des Names->des Namens
-Namne->Namen
-narzistisch->narzisstisch
-Natiomnal*->National*
-Nazionalsoz*->Nationalsoz*
-nciht->nicht
-Nervösität->Nervosität
-nich->nicht
-die Niederlanden->die Niederlande
-niedersächisch->niedersächsisch
-niedersächsiche->niedersächsische
-niedersächsichen->niedersächsischen
-niedrieg->niedrig
-Niesche->Nische
-nihct->nicht
-nix->nichts
-nocheinmal->noch einmal
-nordeutsch->norddeutsch
-Nordeutschland->Norddeutschland
-nordlich->nördlich
-nördöstlich*->nordöstlich*
-nördwestlich*->nordwestlich*
-normanisch*->normannisch*
-notwenig*->notwendig*
-numehr->nunmehr
-Numerus Clausus->Numerus clausus
-objekiv->objektiv
-obrige->obige
-obrigen->obigen
-obriger->obiger
-offizell*->offiziell*
-Offizer->Offizier
-offiziel->offiziell
-offiziele*->offizielle*
-offziell->offiziell
-offzielle->offizielle
-ofiziell->offiziell
-Olympiamedaillie*->Olympiamedaille*
-Olympiamedallie*->Olympiamedaille*
-Olympische Bronzemedaille->olympische Bronzemedaille
-Olympische Goldmedaille->olympische Goldmedaille
-Olympische Silbermedaille->olympische Silbermedaille
-Omlett->Omelett
-optimalste->optimale
-optimalster->optimaler
-optimalstes->optimales
-Ordnug->Ordnung
-Ordung->Ordnung
-Orgeon->Oregon
-Organistion->Organisation
-Organsiation->Organisation
-organsich->organisch
-Organsisation->Organisation
-organisert->organisiert
-orginal->original
-orginale->originale
-orginalen->originalen
-orginell->originell
-orignal->original
-orignell->originell
-Orsteil->Ortsteil
-Orsteile->Ortsteile
-Ortteil->Ortsteil
-ouml->Ö/ö
-Overtüre->Ouvertüre
-öffenlich->öffentlich
-Ökö->Öko
-Östereich->Österreich
-Österrreich->Österreich
-Österreisch->Österreich
-östereichisch*->österreichisch*
-österreichich->österreichisch
-Packet->Paket
-palästinesisch->palästinensisch
-Palete->Palette
-Paleten->Paletten
-Pallete->Palette
-Palleten->Paletten
-Pallette->Palette
-Palletten->Paletten
-paralell->parallel
-Parcour->Parcours
-parralel->parallel
-parrallel->parallel
-Päsident->Präsident
-patroullieren->patrouillieren
-patroulliert->patrouilliert
-Pavillion->Pavillon
-Peleponnes*->Peloponnes*
-Pepperoni->Peperoni
-Perlmut->Perlmutt
-perönlich*->persönlich*
-persöhnlich*->persönlich*
-Persönlichleit->Persönlichkeit
-Philantrop*->Philanthrop*
-Philipinen->Philippinen
-Philipinisch->Philippinisch
-philipinischer->philippinischer
-Philippienen->Philippinen
-Philisoph->Philosoph
-Philisophie->Philosophie
-philisophisch->philosophisch
-Phillipinen->Philippinen
-Philosopie->Philosophie
-Philosph->Philosoph
-Philosphie->Philosophie
-philosphisch->philosophisch
-Philsophie->Philosophie
-philsophisch->philosophisch
-photografiert->fotografiert,photographiert
-piktoresk->pittoresk
-Planze->Pflanze
-Planzen*->Pflanzen*
-Politk->Politik
-Politker->Politiker
-politsch->politisch
-politsche->politische
-politschen->politischen
-politscher->politischer
-politsches->politisches
-poltisch*->politisch*
-portugiesich*->portugiesisch*
-Positon->Position
-postiv->positiv
-prinzipell*->prinzipiell*
-Prinzipen->Prinzipien
-Priveleg->Privileg
-priveligiert->privilegiert
-Priviligien*->Privilegien*
-priviligiert->privilegiert
-Progrom->Pogrom
-projezieren->projizieren
-projeziert->projiziert
-Prophezeihung*->Prophezeiung*
-Provinzhaupstadt->Provinzhauptstadt
-Prozeße->Prozesse
-Psychatrie->Psychiatrie
-pysikalisch->physikalisch
-Quattrologie->Tetralogie
-Ralley->Rallye
-Ralleyfahrer->Rallyefahrer
-rechlich->rechtlich
-Rechtsprache->Rechtssprache
-Rechtspruch->Rechtsspruch
-Rechtssprechung->Rechtsprechung
-Rechtstaat->Rechtsstaat
-rechtstaatlich->rechtsstaatlich
-rechtwinklich->rechtwinklig
-rechtwinkling->rechtwinklig
-rechzeitig->rechtzeitig
-Reeling->Reling
-Reflektion->Reflexion
-regelmässig->regelmäßig
-regelmässige->regelmäßige
-regelmässigen->regelmäßigen
-regelmässiger->regelmäßiger
-regelmässiges->regelmäßiges
-Reichtags*->Reichstags*
-Relgion*->Religion*
-relgiös->religiös
-Religiösität->Religiosität
-Religon->Religion
-Religonen->Religionen
-religös->religiös
-religösen->religiösen
-Relion->Religion
-reliösen->religiösen
-Remineszenz->Reminiszenz
-Rendevous->Rendezvous
-Rennaisance->Renaissance
-Rennaissance->Renaissance
-des Rennes->des Rennens
-Renomee->Renommee
-renomiert->renommiert
-Renomme->Renommee
-repäsentieren->repräsentieren
-repäsentiert->repräsentiert
-Reperatur->Reparatur
-Resourcen->Ressourcen
-Rhytmen->Rhythmen
-rhytmisch->rhythmisch
-rhytmische->rhythmische
-Rhytmus->Rhythmus
-Richtline->Richtlinie
-Richung->Richtung
-rigde->ridge
-rihgt->right
-Riskio->Risiko
-Risko->Risiko
-Rossevelt->Roosevelt
-Rückgrad->Rückgrat
-Rückrad->Rückgrat
-Rückrat->Rückgrat
-russich->russisch
-russiche->russische
-russichen->russischen
-russicher->russischer
-russsich->russisch
-russsisch->russisch
-russsische->russische
-russsischen->russischen
-Rythmen->Rhythmen
-rythmisch->rhythmisch
-rythmische->rhythmische
-Rythmus->Rhythmus
-sächisch->sächsisch
-sächsich->sächsisch
-sächsiche->sächsische
-sächsichen->sächsischen
-Santiago de Compostella->Santiago de Compostela
-Sarkopharg->Sarkophag
-sassen->saßen
-satzungsgemäss->satzungsgemäß
-S-Bahnstation->S-Bahn-Station
-schafte->schaffte
-Schaupiel*->Schauspiel*
-Scheiz->Schweiz
-schillernste*->schillerndste*
-schliessen->schließen
-schliesslich->schließlich
-schliesst->schließt
-Schrifsteller*->Schriftsteller*
-Schriftseller->Schriftsteller
-schweizer->Schweizer
-Seeman->Seemann
-seemänisch->seemännisch
-sehenwert->sehenswert
-Sehenwürdigkeit->Sehenswürdigkeit
-Sehenwürdigkeiten->Sehenswürdigkeiten
-seit dem->seitdem
-seit dem die->seitdem die
-seit dem ein->seitdem ein
-seit dem hat->seitdem hat
-seit dem ist->seitdem ist
-seit dem war->seitdem war
-seperat->separat
-seperate->separate
-seperatem->separatem
-seperaten->separaten
-Seperation->Separation
-Seperatist*->Separatist*
-Septmber->September
-Septmeber->September
-Seriösität->Seriosität
-sicher gestellt->sichergestellt
-sich er sich->er sich
-sicher stellen->sicherstellen
-sicher stellt*->sicherstellt*
-sicher zu stellen->sicherzustellen
-Silbermedaillie*->Silbermedaille*
-Silbermedallie*->Silbermedaille*
-Siluette->Silhouette
-sinvoll->sinnvoll
-Situtation->Situation
-Skagerak->Skagerrak
-sobald wie möglich->so bald wie möglich
-sobald als möglich->so bald als möglich
-sodas->sodass,so dass
-sodaß->sodass,so dass
-sogenante->sogenannte
-sogenanten->sogenannten
-sonder->sondern
-Souveranität->Souveränität
-soweit wie->so weit wie
-Sowietunion->Sowjetunion
-spezialiseren->spezialisieren
-spezialisert*->spezialisiert*
-speziel->speziell
-sponsorte->sponserte
-Spritualität->Spiritualität
-sprituell->spirituell
-Staatstreich->Staatsstreich
-Stadbild->Stadtbild
-Staddteil->Stadtteil
-Stadteil->Stadtteil
-Stadteile->Stadtteile
-Stadteilen->Stadtteilen
-Stadteils->Stadtteils
-Standart->Standard
-Standarts->Standards
-statt fand->stattfand
-statt finden->stattfinden
-statt findet->stattfindet
-statt gegeben->stattgegeben
-Stehgreif->Stegreif
-stellverteten->stellvertreten
-Stellverteter->Stellvertreter
-stiess->stieß
-Stimmulation->Stimulation
-Stömung->Strömung
-Stoss->Stoß
-stossen->stoßen
-Stossfänger->Stoßfänger
-Stossstange->Stoßstange
-stösst->stößt
-Strasse->Straße
-strukur*->struktur*
-subsummieren->subsumieren
-subsummiert->subsumiert
-sumieren->summieren
-sumiert->summiert
-svw->svw., bzw., so viel wie
-symetrisch->symmetrisch
-symphatisiert->sympathisiert
-Synomym->Synonym
-Synomyn->Synonym
-Syphon->Siphon
-Sytem->System
-Sytematik->Systematik
-sytematisch->systematisch
-Tag- und Nachtgleiche->Tagundnachtgleiche,Tag-und-Nacht-Gleiche
-Taiwanese->Taiwaner
-Taiwanesen->Taiwaner
-tasächlich->tatsächlich
-tatächlich->tatsächlich
-Teakwondo->Taekwondo
-teiweise->teilweise
-Temparatur->Temperatur
-tendentiell*->tendenziell*
-Terasse->Terrasse
-Terassen->Terrassen
-Terrabyte->Terabyte
-Tocher->Tochter
-Tolleranz->Toleranz
-tollerieren->tolerieren
-tolleriert->toleriert
-Tradion*->Tradition*
-traditionel->traditionell
-Traditon*->Tradition*
-Tradtion*->Tradition*
-Trainig*->Training*
-Transskript->Transkript
-Triologie->Trilogie
-Triumpf->Triumph
-trotzdessen->trotzdem
-trozdem->trotzdem
-Tryptichon->Triptychon
-Triptichon->Triptychon
-Tryptychon->Triptychon
-Tunier->Turnier
-Turismus->Tourismus
-Turist->Tourist
-U-Bahnnetz->U-Bahn-Netz
-U-Bahnstation->U-Bahn-Station
-U-Bahntunnel->U-Bahn-Tunnel
-überarbeitetet->überarbeitet
-überlegende->überlegene
-überlegenden->überlegenen
-überlicherweise->üblicherweise
-Überwachungstaat->Überwachungsstaat
-U-Bootkrieg->U-Boot-Krieg
-umbennen->umbenennen
-umbennenen->umbenennen
-umbennennen->umbenennen
-umbennant->umbenannt
-Umbennennung->Umbenennung
-Umbennenung->Umbenennung
-Umbennung->Umbenennung,Umnennung
-umd->und,um
-Umgangsprache->Umgangssprache
-umgangsprachlich->umgangssprachlich
-umgangsprachliche->umgangssprachliche
-umgangsprachlicher->umgangssprachlicher
-umgenannt->umbenannt
-umittelbar->unmittelbar
-umstrittend*->umstritten*
-umzubennen->umzubenennen,umzunennen
-Unabhängikeit->Unabhängigkeit
-Unabhängkeit->Unabhängigkeit
-unabhänig->unabhängig
-Unabhänigkeit->Unabhängigkeit
-unauthorisiert->unautorisiert
-unbenannt wurde->umbenannt wurde
-und sowie->und/sowie
-und und->und
-Unfang->Umfang
-ungekehrt->umgekehrt
-Univerität->Universität
-Universiät->Universität
-Universtät->Universität
-Universtität->Universität
-unsymetrisch->unsymmetrisch
-unteranderem->unter anderem
-Untergund->Untergrund
-Untericht->Unterricht
-unterichtet->unterrichtet
-unteriridisch->unterirdisch
-Unternehmes*->Unternehmens*
-Unternehms*->Unternehmens*
-unterstüzt->unterstützt
-Unterstüzung->Unterstützung
-Unversität->Universität
-unwegbar->unwägbar,unwegsam
-Urprung->Ursprung
-urprünglich*->ursprünglich*
-ürsprünglich*->ursprünglich*
-urspünglich*->ursprünglich*
-Ursurpator->Usurpator
-us-amerikanischen->US-amerikanischen,amerikanischen
-usprünglich*->ursprünglich*
-variert->variiert
-varrieren->variieren
-Vehrkehr*->Verkehr*
-Vekehr*->Verkehr*
-venezuelanisch*->venezolanisch*
-venizianisch*->venezianisch*
-verabeitet->verarbeitet
-Verabeitung*->Verarbeitung*
-veraltert*->veraltet*
-verantworlich*->verantwortlich*
-Veranwtortung->Verantwortung
-Verbauch*->Verbrauch*
-verbeitet*->verbreitet*
-Verbeitung*->Verbreitung*
-verbreiteste*->verbreitetste*
-verbreiteteste*->verbreitetste*
-vereingt*->vereinigt*
-vereiningt->vereinigt
-vergleichweise->vergleichsweise
-vergößert*->vergrößert*
-Vergößerung->Vergrößerung
-vergrössern->vergrößern
-vergrössert->vergrößert
-vergrösserte->vergrößerte
-vergrösserten->vergrößerten
-vergrösserter->vergrößerter
-Vergrösserung->Vergrößerung
-verhaeltnismaessig->verhältnismäßig
-verhältnismässig->verhältnismäßig
-verheiratetet->verheiratet
-verkündetet->verkündet
-verliess->verließ
-veröffendlicht->veröffentlicht
-Veröffendlichung->Veröffentlichung
-veröffentlich->veröffentlicht
-verplichtet->verpflichtet
-verschiedende*->verschiedene*
-verschiedendste*->verschiedenste*
-Verschleiss->Verschleiß
-verschohnen->verschonen
-verspühren->verspüren
-verspührt->verspürt
-Verständis->Verständnis
-Vertäge->Verträge
-vertaglich->vertraglich
-Verteidung->Verteidigung
-Verwaltungsitz->Verwaltungssitz
-Verwandschaft->Verwandtschaft
-verwandschaftlich*->verwandtschaftlich*
-Vetrag->Vertrag
-Veträge->Verträge
-vetraglich->vertraglich
-vetraut->vertraut
-vieleicht->vielleicht
-vom dem->von dem,vom
-vom der->von der,vom,der
-von einander->voneinander
-getrennt von einander->getrennt voneinander
-unabhängig von einander->unabhängig voneinander
-von einander entfernt->voneinander entfernt
-von einander getrennt->voneinander getrennt
-von einander unterscheiden->voneinander unterscheiden
-von einander unterschieden->voneinander unterschieden
-von einander zu->voneinander zu
-von nöten->vonnöten,z. B. vonnöten sein
-von statten->vonstatten
-von von->von
-vorallem->vor allem
-vorallen->vor allem
-vor allen in->vor allem in
-voran bringen->voranbringen
-Vorang->Vorrang
-voran gegangen*->vorangegangen*
-vorangig->vorrangig
-voran zu bringen->voranzubringen
-voran zu treiben->voranzutreiben
-Vorausetzung->Voraussetzung
-Vorausetzungen->Voraussetzungen
-voraus gegangen*->vorausgegangen*
-vorausichtlich->voraussichtlich
-Vorfahrens->Vorfahren
-Vorgesetze->Vorgesetzte
-vorkommene->vorkommende
-Vormachtsstellung->Vormachtstellung
-vorranging->vorrangig
-vorraus*->voraus*
-vorrüber*->vorüber*
-vorweg genommen*->vorweggenommen*
-Wachholder->Wacholder
-wachesen->wachsen
-währe->wäre
-währendessen->währenddessen
-wahr genommen->wahrgenommen
-Walfahrer->Wallfahrer
-Walfahrt->Wallfahrt
-Walfahrtskirche->Wallfahrtskirche
-Walfahrtsort->Wallfahrtsort
-wärend->während
-Warheit->Wahrheit
-warscheinlich->wahrscheinlich
-Webblog*->Weblog*
-Webpräsens->Webpräsenz
-Wehrmutstropfen->Wermutstropfen
-weiss->weiß
-Weisswein->Weißwein
-einem weiterem->einem weiteren
-im weiterem->im weiteren
-weiterere->weitere
-weitereren->weiteren
-weitesgehend->weitestgehend
-Weltanschaung->Weltanschauung
-Wepräsenz->Webpräsenz
-wesendlich->wesentlich
-im Wesentlichem->im Wesentlichen
-wichig->wichtig
-wichtigeste->wichtigste
-Widerstandkämpfer->Widerstandskämpfer
-widerum->wiederum
-Wiedererichtung->Wiedererrichtung
-wieder kehrend*->wiederkehrend*
-Wiedersacher->Widersacher
-wiedersetzen->widersetzen
-wiederspiegeln->widerspiegeln
-wiederspiegelt->widerspiegelt
-wiederspiegelte->widerspiegelte
-wiederspiegelten->widerspiegelten
-wiedersprechen->widersprechen
-wiedersprechend->widersprechend
-wiedersprechende->widersprechende
-Wiederspruch->Widerspruch
-Wiedersprüche->Widersprüche
-wiedersprüchlich->widersprüchlich
-wiedersprüchliche->widersprüchliche
-wiedersprüchlichen->widersprüchlichen
-Wiederstand->Widerstand
-Wiederstandskampf->Widerstandskampf
-wiederstehen->widerstehen
-wiederzuspiegeln->widerzuspiegeln
-Wihelm->Wilhelm
-Wikipeda->Wikipedia
-Wikpedia->Wikipedia
-wirtschaflich->wirtschaftlich
-wissenschaflich->wissenschaftlich
-wissenschafltich->wissenschaftlich
-Wissentschaft->Wissenschaft
-wissentschaftlich->wissenschaftlich
-Wochende->Wochenende
-woduch->wodurch
-Wolfang->Wolfgang
-wurd->wurde
-wurde wurde->wurde
-Würtemberg->Württemberg
-würtembergische->württembergische
-zahreich->zahlreich
-zeimlich->ziemlich
-der Zeit seines Lebens->der zeit seines Lebens
-er Zeit seines Lebens->er zeit seines Lebens
-sie Zeit ihres Lebens->sie zeit ihres Lebens
-war Zeit ihres Lebens->war zeit ihres Lebens
-war Zeit seines Lebens->war zeit seines Lebens
-zeitgenösisch->zeitgenössisch
-zeitgenössich->zeitgenössisch
-zerissen->zerrissen
-Ziffernblatt->Zifferblatt
-Zohne->Zone
-zu allererst->zuallererst
-zuammen->zusammen
-Zuammenhang->Zusammenhang
-zueigen->zu eigen
-zuende->zu Ende
-zu Folge->zufolge,zur Folge
-zufrieden geben->zufriedengeben
-zugrundeliegen->zugrunde liegen,zu Grunde liegen
-zugrundeliegt->zugrunde liegt,zu Grunde liegt
-zu letzt->zuletzt
-zum dem->zu dem,zum
-zum den->zu den,zu dem,zum
-zum erstem->zum ersten
-zumindestens->zumindest
-in zunehmenden Maße->in zunehmendem Maße
-mit zunehmenden Alter->mit zunehmendem Alter
-zunehmends->zunehmend
-zur der->zu der,zur
-zur dieser->zu dieser
-zur einem->zu einem
-zur einer->zu einer,zur
-zur ihr->zu ihr
-zur ihrem->zu ihrem
-zur ihren->zu ihren
-zur ihrer->zu ihrer,zur
-zur seiner->zu seiner,zur
-zurecht->zurecht
-zurecht finden->zurechtfinden
-zurecht kam->zurechtkam
-zurecht kommen->zurechtkommen
-zurecht kommt->zurechtkommt
-zurecht zu finden->zurechtzufinden
-zurecht zu kommen->zurechtzukommen
-zurfolge->zur Folge,zufolge
-zurück ge*->zurückge*
-zurück gegangen*->zurückgegangen*
-zurück blicken->zurückblicken
-zurück erobert->zurückerobert
-zurück ging->zurückging
-zurück greif*->zurückgreif*
-zurück kehrte->zurückkehrte
-zurück trat->zurücktrat
-zurück verfolgen->zurückverfolgen
-zurück verfolgt->zurückverfolgt
-zurück ziehen->zurückziehen
-zurück zog->zurückzog
-zurück zu bekommen->zurückzubekommen
-zurück zu bringen->zurückzubringen
-zurück zu drängen->zurückzudrängen
-zurück zu erobern->zurückzuerobern
-zurück zu führen->zurückzuführen
-zurück zuführen->zurückzuführen
-zurück zu gewinnen->zurückzugewinnen
-zurück zu holen->zurückzuholen
-zurück zu kehren->zurückzukehren
-zurück zu ziehen->zurückzuziehen
-zusamen->zusammen
-Zusamenhang->Zusammenhang
-zusammen arbeiten->zusammenarbeiten
-zusammen arbeitete->zusammenarbeitete
-zusammen arbeiteten->zusammenarbeiteten
-zusammen gearbeitet->zusammengearbeitet
-zusammen gefasst->zusammengefasst
-zusammen geschlossen*->zusammengeschlossen*
-zusammen schloss*->zusammenschloss*
-zusammen zu arbeiten->zusammenzuarbeiten
-zusammen zu schließen->zusammenzuschließen
-zusammmen->zusammen
-zusätlich->zusätzlich
-zusehens->zusehends
-zustandegekommen->zustande gekommen,zu Stande gekommen
-zustandekam->zustande kam,zu Stande kam
-zustandekommt->zustande kommt,zu Stande kommt
-zustätzlich->zusätzlich
-zu teil werden->zuteilwerden
-zu teil wird->zuteilwird
-zu teil wurde->zuteilwurde
-zu zu->zu,zuzu
-zu zuordnen*->zuzuordnen*
-zu zuwenden*->zuzuwenden*
-Zweidrittel->zwei Drittel
-Zweidrittel-Mehrheit->Zweidrittelmehrheit
-Zweiliga*->Zweitliga*
-dem zweitem->dem zweiten
-im zweitem->im zweiten
diff --git a/files/typos/typos-en.txt b/files/typos/typos-en.txt
deleted file mode 100644
index 74fbd08..0000000
--- a/files/typos/typos-en.txt
+++ /dev/null
@@ -1,4576 +0,0 @@
-# This file contains a number of common English typos:
-andriod->android
-
-# The remainder of this file contains misspellings from
-# http://en.wikipedia.org/wiki/Wikipedia:Lists_of_common_misspellings/For_machines
-# plus some post-processing to fix invalid entries, remove duplicates, etc.
-#
-# The content is available under the
-# "Creative Commons Attribution-ShareAlike License"
-# http://creativecommons.org/licenses/by-sa/3.0/
-#
-# THE WORK (AS DEFINED BELOW) IS PROVIDED UNDER THE TERMS OF THIS CREATIVE
-# COMMONS PUBLIC LICENSE ("CCPL" OR "LICENSE"). THE WORK IS PROTECTED BY
-# COPYRIGHT AND/OR OTHER APPLICABLE LAW. ANY USE OF THE WORK OTHER THAN AS
-# AUTHORIZED UNDER THIS LICENSE OR COPYRIGHT LAW IS PROHIBITED.
-#
-# BY EXERCISING ANY RIGHTS TO THE WORK PROVIDED HERE, YOU ACCEPT AND AGREE
-# TO BE BOUND BY THE TERMS OF THIS LICENSE. TO THE EXTENT THIS LICENSE MAY
-# BE CONSIDERED TO BE A CONTRACT, THE LICENSOR GRANTS YOU THE RIGHTS
-# CONTAINED HERE IN CONSIDERATION OF YOUR ACCEPTANCE OF SUCH TERMS AND
-# CONDITIONS.
-#
-# *1. Definitions*
-#
-#  1. *"Adaptation"* means a work based upon the Work, or upon the Work
-#     and other pre-existing works, such as a translation, adaptation,
-#     derivative work, arrangement of music or other alterations of a
-#     literary or artistic work, or phonogram or performance and includes
-#     cinematographic adaptations or any other form in which the Work may
-#     be recast, transformed, or adapted including in any form
-#     recognizably derived from the original, except that a work that
-#     constitutes a Collection will not be considered an Adaptation for
-#     the purpose of this License. For the avoidance of doubt, where the
-#     Work is a musical work, performance or phonogram, the
-#     synchronization of the Work in timed-relation with a moving image
-#     ("synching") will be considered an Adaptation for the purpose of
-#     this License.
-#  2. *"Collection"* means a collection of literary or artistic works,
-#     such as encyclopedias and anthologies, or performances, phonograms
-#     or broadcasts, or other works or subject matter other than works
-#     listed in Section 1(f) below, which, by reason of the selection and
-#     arrangement of their contents, constitute intellectual creations, in
-#     which the Work is included in its entirety in unmodified form along
-#     with one or more other contributions, each constituting separate and
-#     independent works in themselves, which together are assembled into a
-#     collective whole. A work that constitutes a Collection will not be
-#     considered an Adaptation (as defined below) for the purposes of this
-#     License.
-#  3. *"Creative Commons Compatible License"* means a license that is
-#     listed at http://creativecommons.org/compatiblelicenses that has
-#     been approved by Creative Commons as being essentially equivalent to
-#     this License, including, at a minimum, because that license: (i)
-#     contains terms that have the same purpose, meaning and effect as the
-#     License Elements of this License; and, (ii) explicitly permits the
-#     relicensing of adaptations of works made available under that
-#     license under this License or a Creative Commons jurisdiction
-#     license with the same License Elements as this License.
-#  4. *"Distribute"* means to make available to the public the original
-#     and copies of the Work or Adaptation, as appropriate, through sale
-#     or other transfer of ownership.
-#  5. *"License Elements"* means the following high-level license
-#     attributes as selected by Licensor and indicated in the title of
-#     this License: Attribution, ShareAlike.
-#  6. *"Licensor"* means the individual, individuals, entity or entities
-#     that offer(s) the Work under the terms of this License.
-#  7. *"Original Author"* means, in the case of a literary or artistic
-#     work, the individual, individuals, entity or entities who created
-#     the Work or if no individual or entity can be identified, the
-#     publisher; and in addition (i) in the case of a performance the
-#     actors, singers, musicians, dancers, and other persons who act,
-#     sing, deliver, declaim, play in, interpret or otherwise perform
-#     literary or artistic works or expressions of folklore; (ii) in the
-#     case of a phonogram the producer being the person or legal entity
-#     who first fixes the sounds of a performance or other sounds; and,
-#     (iii) in the case of broadcasts, the organization that transmits the
-#     broadcast.
-#  8. *"Work"* means the literary and/or artistic work offered under the
-#     terms of this License including without limitation any production in
-#     the literary, scientific and artistic domain, whatever may be the
-#     mode or form of its expression including digital form, such as a
-#     book, pamphlet and other writing; a lecture, address, sermon or
-#     other work of the same nature; a dramatic or dramatico-musical work;
-#     a choreographic work or entertainment in dumb show; a musical
-#     composition with or without words; a cinematographic work to which
-#     are assimilated works expressed by a process analogous to
-#     cinematography; a work of drawing, painting, architecture,
-#     sculpture, engraving or lithography; a photographic work to which
-#     are assimilated works expressed by a process analogous to
-#     photography; a work of applied art; an illustration, map, plan,
-#     sketch or three-dimensional work relative to geography, topography,
-#     architecture or science; a performance; a broadcast; a phonogram; a
-#     compilation of data to the extent it is protected as a copyrightable
-#     work; or a work performed by a variety or circus performer to the
-#     extent it is not otherwise considered a literary or artistic work.
-#  9. *"You"* means an individual or entity exercising rights under this
-#     License who has not previously violated the terms of this License
-#     with respect to the Work, or who has received express permission
-#     from the Licensor to exercise rights under this License despite a
-#     previous violation.
-# 10. *"Publicly Perform"* means to perform public recitations of the Work
-#     and to communicate to the public those public recitations, by any
-#     means or process, including by wire or wireless means or public
-#     digital performances; to make available to the public Works in such
-#     a way that members of the public may access these Works from a place
-#     and at a place individually chosen by them; to perform the Work to
-#     the public by any means or process and the communication to the
-#     public of the performances of the Work, including by public digital
-#     performance; to broadcast and rebroadcast the Work by any means
-#     including signs, sounds or images.
-# 11. *"Reproduce"* means to make copies of the Work by any means
-#     including without limitation by sound or visual recordings and the
-#     right of fixation and reproducing fixations of the Work, including
-#     storage of a protected performance or phonogram in digital form or
-#     other electronic medium.
-#
-# *2. Fair Dealing Rights.* Nothing in this License is intended to reduce,
-# limit, or restrict any uses free from copyright or rights arising from
-# limitations or exceptions that are provided for in connection with the
-# copyright protection under copyright law or other applicable laws.
-#
-# *3. License Grant.* Subject to the terms and conditions of this License,
-# Licensor hereby grants You a worldwide, royalty-free, non-exclusive,
-# perpetual (for the duration of the applicable copyright) license to
-# exercise the rights in the Work as stated below:
-#
-#  1. to Reproduce the Work, to incorporate the Work into one or more
-#     Collections, and to Reproduce the Work as incorporated in the
-#     Collections;
-#  2. to create and Reproduce Adaptations provided that any such
-#     Adaptation, including any translation in any medium, takes
-#     reasonable steps to clearly label, demarcate or otherwise identify
-#     that changes were made to the original Work. For example, a
-#     translation could be marked "The original work was translated from
-#     English to Spanish," or a modification could indicate "The original
-#     work has been modified.";
-#  3. to Distribute and Publicly Perform the Work including as
-#     incorporated in Collections; and,
-#  4. to Distribute and Publicly Perform Adaptations.
-#  5.
-#
-#     For the avoidance of doubt:
-#
-#      1. *Non-waivable Compulsory License Schemes*. In those
-#         jurisdictions in which the right to collect royalties through
-#         any statutory or compulsory licensing scheme cannot be waived,
-#         the Licensor reserves the exclusive right to collect such
-#         royalties for any exercise by You of the rights granted under
-#         this License;
-#      2. *Waivable Compulsory License Schemes*. In those jurisdictions in
-#         which the right to collect royalties through any statutory or
-#         compulsory licensing scheme can be waived, the Licensor waives
-#         the exclusive right to collect such royalties for any exercise
-#         by You of the rights granted under this License; and,
-#      3. *Voluntary License Schemes*. The Licensor waives the right to
-#         collect royalties, whether individually or, in the event that
-#         the Licensor is a member of a collecting society that
-#         administers voluntary licensing schemes, via that society, from
-#         any exercise by You of the rights granted under this License.
-#
-# The above rights may be exercised in all media and formats whether now
-# known or hereafter devised. The above rights include the right to make
-# such modifications as are technically necessary to exercise the rights
-# in other media and formats. Subject to Section 8(f), all rights not
-# expressly granted by Licensor are hereby reserved.
-#
-# *4. Restrictions.* The license granted in Section 3 above is expressly
-# made subject to and limited by the following restrictions:
-#
-#  1. You may Distribute or Publicly Perform the Work only under the terms
-#     of this License. You must include a copy of, or the Uniform Resource
-#     Identifier (URI) for, this License with every copy of the Work You
-#     Distribute or Publicly Perform. You may not offer or impose any
-#     terms on the Work that restrict the terms of this License or the
-#     ability of the recipient of the Work to exercise the rights granted
-#     to that recipient under the terms of the License. You may not
-#     sublicense the Work. You must keep intact all notices that refer to
-#     this License and to the disclaimer of warranties with every copy of
-#     the Work You Distribute or Publicly Perform. When You Distribute or
-#     Publicly Perform the Work, You may not impose any effective
-#     technological measures on the Work that restrict the ability of a
-#     recipient of the Work from You to exercise the rights granted to
-#     that recipient under the terms of the License. This Section 4(a)
-#     applies to the Work as incorporated in a Collection, but this does
-#     not require the Collection apart from the Work itself to be made
-#     subject to the terms of this License. If You create a Collection,
-#     upon notice from any Licensor You must, to the extent practicable,
-#     remove from the Collection any credit as required by Section 4(c),
-#     as requested. If You create an Adaptation, upon notice from any
-#     Licensor You must, to the extent practicable, remove from the
-#     Adaptation any credit as required by Section 4(c), as requested.
-#  2. You may Distribute or Publicly Perform an Adaptation only under the
-#     terms of: (i) this License; (ii) a later version of this License
-#     with the same License Elements as this License; (iii) a Creative
-#     Commons jurisdiction license (either this or a later license
-#     version) that contains the same License Elements as this License
-#     (e.g., Attribution-ShareAlike 3.0 US)); (iv) a Creative Commons
-#     Compatible License. If you license the Adaptation under one of the
-#     licenses mentioned in (iv), you must comply with the terms of that
-#     license. If you license the Adaptation under the terms of any of the
-#     licenses mentioned in (i), (ii) or (iii) (the "Applicable License"),
-#     you must comply with the terms of the Applicable License generally
-#     and the following provisions: (I) You must include a copy of, or the
-#     URI for, the Applicable License with every copy of each Adaptation
-#     You Distribute or Publicly Perform; (II) You may not offer or impose
-#     any terms on the Adaptation that restrict the terms of the
-#     Applicable License or the ability of the recipient of the Adaptation
-#     to exercise the rights granted to that recipient under the terms of
-#     the Applicable License; (III) You must keep intact all notices that
-#     refer to the Applicable License and to the disclaimer of warranties
-#     with every copy of the Work as included in the Adaptation You
-#     Distribute or Publicly Perform; (IV) when You Distribute or Publicly
-#     Perform the Adaptation, You may not impose any effective
-#     technological measures on the Adaptation that restrict the ability
-#     of a recipient of the Adaptation from You to exercise the rights
-#     granted to that recipient under the terms of the Applicable License.
-#     This Section 4(b) applies to the Adaptation as incorporated in a
-#     Collection, but this does not require the Collection apart from the
-#     Adaptation itself to be made subject to the terms of the Applicable
-#     License.
-#  3. If You Distribute, or Publicly Perform the Work or any Adaptations
-#     or Collections, You must, unless a request has been made pursuant to
-#     Section 4(a), keep intact all copyright notices for the Work and
-#     provide, reasonable to the medium or means You are utilizing: (i)
-#     the name of the Original Author (or pseudonym, if applicable) if
-#     supplied, and/or if the Original Author and/or Licensor designate
-#     another party or parties (e.g., a sponsor institute, publishing
-#     entity, journal) for attribution ("Attribution Parties") in
-#     Licensor's copyright notice, terms of service or by other reasonable
-#     means, the name of such party or parties; (ii) the title of the Work
-#     if supplied; (iii) to the extent reasonably practicable, the URI, if
-#     any, that Licensor specifies to be associated with the Work, unless
-#     such URI does not refer to the copyright notice or licensing
-#     information for the Work; and (iv) , consistent with Ssection 3(b),
-#     in the case of an Adaptation, a credit identifying the use of the
-#     Work in the Adaptation (e.g., "French translation of the Work by
-#     Original Author," or "Screenplay based on original Work by Original
-#     Author"). The credit required by this Section 4(c) may be
-#     implemented in any reasonable manner; provided, however, that in the
-#     case of a Adaptation or Collection, at a minimum such credit will
-#     appear, if a credit for all contributing authors of the Adaptation
-#     or Collection appears, then as part of these credits and in a manner
-#     at least as prominent as the credits for the other contributing
-#     authors. For the avoidance of doubt, You may only use the credit
-#     required by this Section for the purpose of attribution in the
-#     manner set out above and, by exercising Your rights under this
-#     License, You may not implicitly or explicitly assert or imply any
-#     connection with, sponsorship or endorsement by the Original Author,
-#     Licensor and/or Attribution Parties, as appropriate, of You or Your
-#     use of the Work, without the separate, express prior written
-#     permission of the Original Author, Licensor and/or Attribution Parties.
-#  4. Except as otherwise agreed in writing by the Licensor or as may be
-#     otherwise permitted by applicable law, if You Reproduce, Distribute
-#     or Publicly Perform the Work either by itself or as part of any
-#     Adaptations or Collections, You must not distort, mutilate, modify
-#     or take other derogatory action in relation to the Work which would
-#     be prejudicial to the Original Author's honor or reputation.
-#     Licensor agrees that in those jurisdictions (e.g. Japan), in which
-#     any exercise of the right granted in Section 3(b) of this License
-#     (the right to make Adaptations) would be deemed to be a distortion,
-#     mutilation, modification or other derogatory action prejudicial to
-#     the Original Author's honor and reputation, the Licensor will waive
-#     or not assert, as appropriate, this Section, to the fullest extent
-#     permitted by the applicable national law, to enable You to
-#     reasonably exercise Your right under Section 3(b) of this License
-#     (right to make Adaptations) but not otherwise.
-#
-# *5. Representations, Warranties and Disclaimer*
-#
-# UNLESS OTHERWISE MUTUALLY AGREED TO BY THE PARTIES IN WRITING, LICENSOR
-# OFFERS THE WORK AS-IS AND MAKES NO REPRESENTATIONS OR WARRANTIES OF ANY
-# KIND CONCERNING THE WORK, EXPRESS, IMPLIED, STATUTORY OR OTHERWISE,
-# INCLUDING, WITHOUT LIMITATION, WARRANTIES OF TITLE, MERCHANTIBILITY,
-# FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT, OR THE ABSENCE OF
-# LATENT OR OTHER DEFECTS, ACCURACY, OR THE PRESENCE OF ABSENCE OF ERRORS,
-# WHETHER OR NOT DISCOVERABLE. SOME JURISDICTIONS DO NOT ALLOW THE
-# EXCLUSION OF IMPLIED WARRANTIES, SO SUCH EXCLUSION MAY NOT APPLY TO YOU.
-#
-# *6. Limitation on Liability.* EXCEPT TO THE EXTENT REQUIRED BY
-# APPLICABLE LAW, IN NO EVENT WILL LICENSOR BE LIABLE TO YOU ON ANY LEGAL
-# THEORY FOR ANY SPECIAL, INCIDENTAL, CONSEQUENTIAL, PUNITIVE OR EXEMPLARY
-# DAMAGES ARISING OUT OF THIS LICENSE OR THE USE OF THE WORK, EVEN IF
-# LICENSOR HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
-#
-# *7. Termination*
-#
-#  1. This License and the rights granted hereunder will terminate
-#     automatically upon any breach by You of the terms of this License.
-#     Individuals or entities who have received Adaptations or Collections
-#     from You under this License, however, will not have their licenses
-#     terminated provided such individuals or entities remain in full
-#     compliance with those licenses. Sections 1, 2, 5, 6, 7, and 8 will
-#     survive any termination of this License.
-#  2. Subject to the above terms and conditions, the license granted here
-#     is perpetual (for the duration of the applicable copyright in the
-#     Work). Notwithstanding the above, Licensor reserves the right to
-#     release the Work under different license terms or to stop
-#     distributing the Work at any time; provided, however that any such
-#     election will not serve to withdraw this License (or any other
-#     license that has been, or is required to be, granted under the terms
-#     of this License), and this License will continue in full force and
-#     effect unless terminated as stated above.
-#
-# *8. Miscellaneous*
-#
-#  1. Each time You Distribute or Publicly Perform the Work or a
-#     Collection, the Licensor offers to the recipient a license to the
-#     Work on the same terms and conditions as the license granted to You
-#     under this License.
-#  2. Each time You Distribute or Publicly Perform an Adaptation, Licensor
-#     offers to the recipient a license to the original Work on the same
-#     terms and conditions as the license granted to You under this License.
-#  3. If any provision of this License is invalid or unenforceable under
-#     applicable law, it shall not affect the validity or enforceability
-#     of the remainder of the terms of this License, and without further
-#     action by the parties to this agreement, such provision shall be
-#     reformed to the minimum extent necessary to make such provision
-#     valid and enforceable.
-#  4. No term or provision of this License shall be deemed waived and no
-#     breach consented to unless such waiver or consent shall be in
-#     writing and signed by the party to be charged with such waiver or
-#     consent.
-#  5. This License constitutes the entire agreement between the parties
-#     with respect to the Work licensed here. There are no understandings,
-#     agreements or representations with respect to the Work not specified
-#     here. Licensor shall not be bound by any additional provisions that
-#     may appear in any communication from You. This License may not be
-#     modified without the mutual written agreement of the Licensor and You.
-#  6. The rights granted under, and the subject matter referenced, in this
-#     License were drafted utilizing the terminology of the Berne
-#     Convention for the Protection of Literary and Artistic Works (as
-#     amended on September 28, 1979), the Rome Convention of 1961, the
-#     WIPO Copyright Treaty of 1996, the WIPO Performances and Phonograms
-#     Treaty of 1996 and the Universal Copyright Convention (as revised on
-#     July 24, 1971). These rights and subject matter take effect in the
-#     relevant jurisdiction in which the License terms are sought to be
-#     enforced according to the corresponding provisions of the
-#     implementation of those treaty provisions in the applicable national
-#     law. If the standard suite of rights granted under applicable
-#     copyright law includes additional rights not granted under this
-#     License, such additional rights are deemed to be included in the
-#     License; this License is not intended to restrict the license of any
-#     rights under applicable law.
-
-abandonned->abandoned
-aberation->aberration
-abilties->abilities
-abilty->ability
-abondon->abandon
-abbout->about
-abotu->about
-abouta->about a
-aboutit->about it
-aboutthe->about the
-abscence->absence
-abondoned->abandoned
-abondoning->abandoning
-abondons->abandons
-aborigene->aborigine
-accesories->accessories
-accidant->accident
-abortificant->abortifacient
-abreviate->abbreviate
-abreviated->abbreviated
-abreviation->abbreviation
-abritrary->arbitrary
-absail->abseil
-absailing->abseiling
-absense->absence
-absolutly->absolutely
-absorbsion->absorption
-absorbtion->absorption
-abudance->abundance
-abundacies->abundances
-abundancies->abundances
-abundunt->abundant
-abutts->abuts
-acadamy->academy
-acadmic->academic
-accademic->academic
-accademy->academy
-acccused->accused
-accelleration->acceleration
-accension->accession, ascension
-acceptence->acceptance
-acceptible->acceptable
-accessable->accessible
-accidentaly->accidentally
-accidently->accidentally
-acclimitization->acclimatization
-accomadate->accommodate
-accomadated->accommodated
-accomadates->accommodates
-accomadating->accommodating
-accomadation->accommodation
-accomadations->accommodations
-accomdate->accommodate
-accomodate->accommodate
-accomodated->accommodated
-accomodates->accommodates
-accomodating->accommodating
-accomodation->accommodation
-accomodations->accommodations
-accompanyed->accompanied
-accordeon->accordion
-accordian->accordion
-accoring->according
-accoustic->acoustic
-accquainted->acquainted
-accrediation->accreditation
-accredidation->accreditation
-accross->across
-accussed->accused
-acedemic->academic
-acheive->achieve
-acheived->achieved
-acheivement->achievement
-acheivements->achievements
-acheives->achieves
-acheiving->achieving
-acheivment->achievement
-acheivments->achievements
-achievment->achievement
-achievments->achievements
-achive->achieve, archive
-achived->achieved, archived
-achivement->achievement
-achivements->achievements
-acknowldeged->acknowledged
-acknowledgeing->acknowledging
-ackward->awkward, backward
-acommodate->accommodate
-acomplish->accomplish
-acomplished->accomplished
-acomplishment->accomplishment
-acomplishments->accomplishments
-acording->according
-acordingly->accordingly
-acquaintence->acquaintance
-acquaintences->acquaintances
-acquiantence->acquaintance
-acquiantences->acquaintances
-acquited->acquitted
-activites->activities
-activly->actively
-actualy->actually
-acuracy->accuracy
-acused->accused
-acustom->accustom
-acustommed->accustomed
-adavanced->advanced
-adbandon->abandon
-addional->additional
-addionally->additionally
-additinally->additionally
-additionaly->additionally
-additonal->additional
-additonally->additionally
-addmission->admission
-addopt->adopt
-addopted->adopted
-addoptive->adoptive
-addres->address, adders
-addresable->addressable
-addresed->addressed
-addresing->addressing
-addressess->addresses
-addtion->addition
-addtional->additional
-adecuate->adequate
-adequit->adequate
-adhearing->adhering
-adherance->adherence
-admendment->amendment
-admininistrative->administrative
-adminstered->administered
-adminstrate->administrate
-adminstration->administration
-adminstrative->administrative
-adminstrator->administrator
-admissability->admissibility
-admissable->admissible
-admited->admitted
-admitedly->admittedly
-adn->and
-adolecent->adolescent
-adquire->acquire
-adquired->acquired
-adquires->acquires
-adquiring->acquiring
-adres->address
-adresable->addressable
-adresing->addressing
-adress->address
-adressable->addressable
-adressed->addressed
-adressing->addressing, dressing
-adventrous->adventurous
-advertisment->advertisement
-advertisments->advertisements
-advesary->adversary
-adviced->advised
-aeriel->aerial
-aeriels->aerials
-afair->affair
-afficianados->aficionados
-afficionado->aficionado
-afficionados->aficionados
-affilate->affiliate
-affilliate->affiliate
-affort->afford, effort
-aforememtioned->aforementioned
-againnst->against
-agains->against
-agaisnt->against
-aganist->against
-aggaravates->aggravates
-aggreed->agreed
-aggreement->agreement
-aggregious->egregious
-aggresive->aggressive
-agian->again
-agianst->against
-agin->again
-agina->again, angina
-aginst->against
-agravate->aggravate
-agre->agree
-agred->agreed
-agreeement->agreement
-agreemnt->agreement
-agregate->aggregate
-agregates->aggregates
-agreing->agreeing
-agression->aggression
-agressive->aggressive
-agressively->aggressively
-agressor->aggressor
-agricultue->agriculture
-agriculure->agriculture
-agricuture->agriculture
-agrieved->aggrieved
-ahev->have
-ahppen->happen
-ahve->have
-aicraft->aircraft
-aiport->airport
-airbourne->airborne
-aircaft->aircraft
-aircrafts->aircraft
-airporta->airports
-airrcraft->aircraft
-aisian->asian
-albiet->albeit
-alchohol->alcohol
-alchoholic->alcoholic
-alchol->alcohol
-alcholic->alcoholic
-alcohal->alcohol
-alcoholical->alcoholic
-aledge->allege
-aledged->alleged
-aledges->alleges
-alege->allege
-aleged->alleged
-alegience->allegiance
-algebraical->algebraic
-algorhitms->algorithms
-algoritm->algorithm
-algoritms->algorithms
-alientating->alienating
-alledge->allege
-alledged->alleged
-alledgedly->allegedly
-alledges->alleges
-allegedely->allegedly
-allegedy->allegedly
-allegely->allegedly
-allegence->allegiance
-allegience->allegiance
-allign->align
-alligned->aligned
-alliviate->alleviate
-allopone->allophone
-allopones->allophones
-allready->already
-allthough->although
-alltime->all-time
-alltogether->altogether
-almsot->almost
-alochol->alcohol
-alomst->almost
-alot->a lot, allot
-alotted->allotted
-alowed->allowed
-alowing->allowing
-alreayd->already
-alse->else
-alsot->also
-alternitives->alternatives
-altho->although
-althought->although
-altough->although
-alusion->allusion, illusion
-alwasy->always
-alwyas->always
-amalgomated->amalgamated
-amatuer->amateur
-amature->armature, amateur
-amendmant->amendment
-Amercia->America
-amerliorate->ameliorate
-amke->make
-amking->making
-ammend->amend
-ammended->amended
-ammendment->amendment
-ammendments->amendments
-ammount->amount
-ammused->amused
-amoung->among
-amoungst->amongst
-amung->among
-amunition->ammunition
-analagous->analogous
-analitic->analytic
-analogeous->analogous
-anarchim->anarchism
-anarchistm->anarchism
-anbd->and
-ancestory->ancestry
-ancilliary->ancillary
-andd->and
-androgenous->androgynous
-androgeny->androgyny
-anihilation->annihilation
-aniversary->anniversary
-annoint->anoint
-annointed->anointed
-annointing->anointing
-annoints->anoints
-annouced->announced
-annualy->annually
-annuled->annulled
-anohter->another
-anomolies->anomalies
-anomolous->anomalous
-anomoly->anomaly
-anonimity->anonymity
-anounced->announced
-anouncement->announcement
-ansalisation->nasalisation
-ansalization->nasalization
-ansestors->ancestors
-antartic->antarctic
-anthromorphization->anthropomorphization
-anthropolgist->anthropologist
-anthropolgy->anthropology
-anual->annual
-anulled->annulled
-anwsered->answered
-anyhwere->anywhere
-anyother->any other
-anytying->anything
-aparent->apparent
-aparment->apartment
-apenines->apennines, Apennines
-aplication->application
-aplied->applied
-apolegetics->apologetics
-apon->upon, apron
-apparant->apparent
-apparantly->apparently
-appart->apart
-appartment->apartment
-appartments->apartments
-appealling->appealing, appalling
-appeareance->appearance
-appearence->appearance
-appearences->appearances
-appenines->apennines, Apennines
-apperance->appearance
-apperances->appearances
-appereance->appearance
-appereances->appearances
-applicaiton->application
-applicaitons->applications
-appologies->apologies
-appology->apology
-apprearance->appearance
-apprieciate->appreciate
-approachs->approaches
-appropiate->appropriate
-appropraite->appropriate
-appropropiate->appropriate
-approproximate->approximate
-approxamately->approximately
-approxiately->approximately
-approximitely->approximately
-aprehensive->apprehensive
-apropriate->appropriate
-aproval->approval
-aproximate->approximate
-aproximately->approximately
-aquaduct->aqueduct
-aquaintance->acquaintance
-aquainted->acquainted
-aquiantance->acquaintance
-aquire->acquire
-aquired->acquired
-aquiring->acquiring
-aquisition->acquisition
-aquitted->acquitted
-aranged->arranged
-arangement->arrangement
-arbitarily->arbitrarily
-arbitary->arbitrary
-archaelogical->archaeological
-archaelogists->archaeologists
-archaelogy->archaeology
-archaoelogy->archeology, archaeology
-archaology->archeology, archaeology
-archeaologist->archeologist, archaeologist
-archeaologists->archeologists, archaeologists
-archetect->architect
-archetects->architects
-archetectural->architectural
-archetecturally->architecturally
-archetecture->architecture
-archiac->archaic
-archictect->architect
-archimedian->archimedean
-architecht->architect
-architechturally->architecturally
-architechture->architecture
-architechtures->architectures
-architectual->architectural
-archtype->archetype
-archtypes->archetypes
-aready->already
-areodynamics->aerodynamics
-argubly->arguably
-arguement->argument
-arguements->arguments
-arised->arose
-arival->arrival
-armamant->armament
-armistace->armistice
-arogant->arrogant
-arogent->arrogant
-aroud->around
-arrangment->arrangement
-arrangments->arrangements
-arrengement->arrangement
-arrengements->arrangements
-arround->around
-artcile->article
-artical->article
-artice->article
-articel->article
-artifical->artificial
-artifically->artificially
-artillary->artillery
-arund->around
-asetic->ascetic
-asfar->as far
-asign->assign
-aslo->also
-asociated->associated
-asorbed->absorbed
-asphyxation->asphyxiation
-assasin->assassin
-assasinate->assassinate
-assasinated->assassinated
-assasinates->assassinates
-assasination->assassination
-assasinations->assassinations
-assasined->assassinated
-assasins->assassins
-assassintation->assassination
-assemple->assemble
-assertation->assertion
-asside->aside
-assisnate->assassinate
-assit->assist
-assitant->assistant
-assocation->association
-assoicate->associate
-assoicated->associated
-assoicates->associates
-assosication->assassination
-asssassans->assassins
-assualt->assault
-assualted->assaulted
-assymetric->asymmetric
-assymetrical->asymmetrical
-asteriod->asteroid
-asthetic->aesthetic
-asthetical->aesthetical
-asthetically->aesthetically
-asume->assume
-aswell->as well
-atain->attain
-atempting->attempting
-atheistical->atheistic
-athenean->athenian
-atheneans->athenians
-athiesm->atheism
-athiest->atheist
-atorney->attorney
-atribute->attribute
-atributed->attributed
-atributes->attributes
-attaindre->attainder, attained
-attemp->attempt
-attemped->attempted
-attemt->attempt
-attemted->attempted
-attemting->attempting
-attemts->attempts
-attendence->attendance
-attendent->attendant
-attendents->attendants
-attened->attended
-attension->attention
-attitide->attitude
-attributred->attributed
-attrocities->atrocities
-audeince->audience
-auromated->automated
-austrailia->Australia
-austrailian->Australian
-auther->author
-authobiographic->autobiographic
-authobiography->autobiography
-authorative->authoritative
-authorites->authorities
-authorithy->authority
-authoritiers->authorities
-authoritive->authoritative
-authrorities->authorities
-autochtonous->autochthonous
-autoctonous->autochthonous
-automaticly->automatically
-automibile->automobile
-automonomous->autonomous
-autor->author
-autority->authority
-auxilary->auxiliary
-auxillaries->auxiliaries
-auxillary->auxiliary
-auxilliaries->auxiliaries
-auxilliary->auxiliary
-availabe->available
-availablity->availability
-availaible->available
-availble->available
-availiable->available
-availible->available
-avalable->available
-avalance->avalanche
-avaliable->available
-avation->aviation
-avengence->a vengeance
-averageed->averaged
-avilable->available
-awared->awarded
-awya->away
-azn->asian
-baceause->because
-backgorund->background
-backrounds->backgrounds
-bakc->back
-banannas->bananas
-bandwith->bandwidth
-bankrupcy->bankruptcy
-banruptcy->bankruptcy
-baout->about, bout
-basicaly->basically
-basicly->basically
-bcak->back
-beachead->beachhead
-beacuse->because
-beastiality->bestiality
-beatiful->beautiful
-beaurocracy->bureaucracy
-beaurocratic->bureaucratic
-beautyfull->beautiful
-becamae->became
-becames->becomes, became
-becasue->because
-beccause->because
-becomeing->becoming
-becomming->becoming
-becouse->because
-becuase->because
-bedore->before
-beeing->being
-befoer->before
-beggin->begin, begging
-begginer->beginner
-begginers->beginners
-beggining->beginning
-begginings->beginnings
-beggins->begins
-begining->beginning
-beginnig->beginning
-behavour->behavior, behaviour
-beleagured->beleaguered
-beleif->belief
-beleive->believe
-beleived->believed
-beleives->believes
-beleiving->believing
-beligum->belgium
-belive->believe
-belived->believed, beloved
-belives->believes, beliefs
-belligerant->belligerent
-bellweather->bellwether
-bemusemnt->bemusement
-beneficary->beneficiary
-beng->being
-benificial->beneficial
-benifit->benefit
-benifits->benefits
-bergamont->bergamot
-Bernouilli->Bernoulli
-beseige->besiege
-beseiged->besieged
-beseiging->besieging
-beteen->between
-betwen->between
-beween->between
-bewteen->between
-bilateraly->bilaterally
-billingualism->bilingualism
-binominal->binomial
-bizzare->bizarre
-blaim->blame
-blaimed->blamed
-blessure->blessing
-Blitzkreig->Blitzkrieg
-boaut->bout, boat, about
-bodydbuilder->bodybuilder
-bombardement->bombardment
-bombarment->bombardment
-bondary->boundary
-Bonnano->Bonanno
-borke->broke
-boundry->boundary
-bouyancy->buoyancy
-bouyant->buoyant
-boyant->buoyant
-Brasillian->Brazilian
-breakthough->breakthrough
-breakthroughts->breakthroughs
-breif->brief
-breifly->briefly
-brethen->brethren
-bretheren->brethren
-briliant->brilliant
-brillant->brilliant
-brimestone->brimstone
-Britian->Britain
-Brittish->British
-broacasted->broadcast
-broadacasting->broadcasting
-broady->broadly
-Buddah->Buddha
-Buddist->Buddhist
-buisness->business
-buisnessman->businessman
-buoancy->buoyancy
-buring->burying, burning, burin, during
-burried->buried
-busines->business
-busineses->business, businesses
-busness->business
-bussiness->business
-caculater->calculator
-cacuses->caucuses
-cahracters->characters
-calaber->caliber
-calander->calendar, calender, colander
-calculater->calculator
-calculs->calculus
-calenders->calendars
-caligraphy->calligraphy
-caluclate->calculate
-caluclated->calculated
-caluculate->calculate
-caluculated->calculated
-calulate->calculate
-calulated->calculated
-calulater->calculator
-Cambrige->Cambridge
-camoflage->camouflage
-campain->campaign
-campains->campaigns
-candadate->candidate
-candiate->candidate
-candidiate->candidate
-cannister->canister
-cannisters->canisters
-cannnot->cannot
-cannonical->canonical
-cannotation->connotation
-cannotations->connotations
-cant->cannot, can not, can't
-caost->coast
-caperbility->capability
-Capetown->Cape Town
-capible->capable
-captial->capital
-captued->captured
-capturd->captured
-carachter->character
-caracterized->characterized
-carcas->carcass, Caracas
-carefull->careful
-careing->caring
-carismatic->charismatic
-Carmalite->Carmelite
-Carnagie->Carnegie
-Carnagie-Mellon->Carnegie-Mellon
-carnege->carnage, Carnegie
-carnige->carnage, Carnegie
-Carnigie->Carnegie
-Carnigie-Mellon->Carnegie-Mellon
-carniverous->carnivorous
-carreer->career
-carrers->careers
-Carribbean->Caribbean
-Carribean->Caribbean
-cartdridge->cartridge
-Carthagian->Carthaginian
-carthographer->cartographer
-cartilege->cartilage
-cartilidge->cartilage
-cartrige->cartridge
-casette->cassette
-casion->caisson
-cassawory->cassowary
-cassowarry->cassowary
-casue->cause
-casued->caused
-casues->causes
-casuing->causing
-casulaties->casualties
-casulaty->casualty
-catagories->categories
-catagorized->categorized
-catagory->category
-Cataline->Catiline, Catalina
-catapillar->caterpillar
-catapillars->caterpillars
-catapiller->caterpillar
-catapillers->caterpillars
-catepillar->caterpillar
-catepillars->caterpillars
-catergorize->categorize
-catergorized->categorized
-caterpilar->caterpillar
-caterpilars->caterpillars
-caterpiller->caterpillar
-caterpillers->caterpillars
-cathlic->catholic
-catholocism->catholicism
-catterpilar->caterpillar
-catterpilars->caterpillars
-catterpillar->caterpillar
-catterpillars->caterpillars
-cattleship->battleship
-causalities->casualties
-Ceasar->Caesar
-Celcius->Celsius
-cellpading->cellpadding
-cementary->cemetery
-cemetarey->cemetery
-cemetaries->cemeteries
-cemetary->cemetery
-cencus->census
-censur->censor, censure
-cententenial->centennial
-centruies->centuries
-centruy->century
-centuties->centuries
-centuty->century
-ceratin->certain, keratin
-cerimonial->ceremonial
-cerimonies->ceremonies
-cerimonious->ceremonious
-cerimony->ceremony
-ceromony->ceremony
-certainity->certainty
-certian->certain
-cervial->cervical, servile, serval
-chalenging->challenging
-challange->challenge
-challanged->challenged
-challege->challenge
-Champange->Champagne
-changable->changeable
-charachter->character
-charachters->characters
-charactersistic->characteristic
-charactor->character
-charactors->characters
-charasmatic->charismatic
-charaterized->characterized
-chariman->chairman
-charistics->characteristics
-chasr->chaser, chase
-cheif->chief
-cheifs->chiefs
-chemcial->chemical
-chemcially->chemically
-chemestry->chemistry
-chemicaly->chemically
-childbird->childbirth
-childen->children
-choosen->chosen
-chracter->character
-chuch->church
-churchs->churches
-Cincinatti->Cincinnati
-Cincinnatti->Cincinnati
-circulaton->circulation
-circumsicion->circumcision
-circut->circuit
-ciricuit->circuit
-ciriculum->curriculum
-civillian->civilian
-claer->clear
-claerer->clearer
-claerly->clearly
-claimes->claims
-clas->class
-clasic->classic
-clasical->classical
-clasically->classically
-cleareance->clearance
-clera->clear, sclera
-clincial->clinical
-clinicaly->clinically
-cmo->com
-cmoputer->computer
-co-incided->coincided
-coctail->cocktail
-coform->conform
-cognizent->cognizant
-coincedentally->coincidentally
-colaborations->collaborations
-colateral->collateral
-colelctive->collective
-collaberative->collaborative
-collecton->collection
-collegue->colleague
-collegues->colleagues
-collonade->colonnade
-collonies->colonies
-collony->colony
-collosal->colossal
-colonizators->colonizers
-comander->commander, commandeer
-comando->commando
-comandos->commandos
-comany->company
-comapany->company
-comback->comeback
-combanations->combinations
-combinatins->combinations
-combusion->combustion
-comdemnation->condemnation
-comemmorates->commemorates
-comemoretion->commemoration
-comision->commission
-comisioned->commissioned
-comisioner->commissioner
-comisioning->commissioning
-comisions->commissions
-comission->commission
-comissioned->commissioned
-comissioner->commissioner
-comissioning->commissioning
-comissions->commissions
-comited->committed
-comiting->committing
-comitted->committed
-comittee->committee
-comitting->committing
-commandoes->commandos
-commedic->comedic
-commemerative->commemorative
-commemmorate->commemorate
-commemmorating->commemorating
-commerical->commercial
-commerically->commercially
-commericial->commercial
-commericially->commercially
-commerorative->commemorative
-comming->coming
-comminication->communication
-commision->commission
-commisioned->commissioned
-commisioner->commissioner
-commisioning->commissioning
-commisions->commissions
-commited->committed
-commitee->committee
-commiting->committing
-committe->committee
-committment->commitment
-committments->commitments
-commmemorated->commemorated
-commongly->commonly
-commonweath->commonwealth
-commuications->communications
-commuinications->communications
-communciation->communication
-communiation->communication
-communites->communities
-compability->compatibility
-comparision->comparison
-comparisions->comparisons
-comparitive->comparative
-comparitively->comparatively
-compatabilities->compatibilities
-compatability->compatibility
-compatable->compatible
-compatablities->compatibilities
-compatablity->compatibility
-compatiable->compatible
-compatiblities->compatibilities
-compatiblity->compatibility
-compeitions->competitions
-compensantion->compensation
-competance->competence
-competant->competent
-competative->competitive
-competion->competition, completion
-competitiion->competition
-competive->competitive
-competiveness->competitiveness
-comphrehensive->comprehensive
-compitent->competent
-completedthe->completed the
-completelyl->completely
-completetion->completion
-complier->compiler
-componant->component
-comprable->comparable
-comprimise->compromise
-compulsary->compulsory
-compulsery->compulsory
-computarized->computerized
-concensus->consensus
-concider->consider
-concidered->considered
-concidering->considering
-conciders->considers
-concieted->conceited
-concieved->conceived
-concious->conscious
-conciously->consciously
-conciousness->consciousness
-condamned->condemned
-condemmed->condemned
-condidtion->condition
-condidtions->conditions
-conditionsof->conditions of
-conected->connected
-conection->connection
-conesencus->consensus
-confidental->confidential
-confidentally->confidentially
-confids->confides
-configureable->configurable
-confortable->comfortable
-congradulations->congratulations
-congresional->congressional
-conived->connived
-conjecutre->conjecture
-conjuction->conjunction
-Conneticut->Connecticut
-conotations->connotations
-conquerd->conquered
-conquerer->conqueror
-conquerers->conquerors
-conqured->conquered
-conscent->consent
-consciouness->consciousness
-consdider->consider
-consdidered->considered
-consdiered->considered
-consectutive->consecutive
-consenquently->consequently
-consentrate->concentrate
-consentrated->concentrated
-consentrates->concentrates
-consept->concept
-consequentually->consequently
-consequeseces->consequences
-consern->concern
-conserned->concerned
-conserning->concerning
-conservitive->conservative
-consiciousness->consciousness
-consicousness->consciousness
-considerd->considered
-consideres->considered
-consious->conscious
-consistant->consistent
-consistantly->consistently
-consituencies->constituencies
-consituency->constituency
-consituted->constituted
-consitution->constitution
-consitutional->constitutional
-consolodate->consolidate
-consolodated->consolidated
-consonent->consonant
-consonents->consonants
-consorcium->consortium
-conspiracys->conspiracies
-conspiriator->conspirator
-constaints->constraints
-constanly->constantly
-constarnation->consternation
-constatn->constant
-constinually->continually
-constituant->constituent
-constituants->constituents
-constituion->constitution
-constituional->constitutional
-consttruction->construction
-constuction->construction
-contstruction->construction
-consulant->consultant
-consumate->consummate
-consumated->consummated
-contaiminate->contaminate
-containes->contains
-contamporaries->contemporaries
-contamporary->contemporary
-contempoary->contemporary
-contemporaneus->contemporaneous
-contempory->contemporary
-contendor->contender
-contibute->contribute
-contibuted->contributed
-contibutes->contributes
-contigent->contingent
-contined->continued
-continous->continuous
-continously->continuously
-continueing->continuing
-contravercial->controversial
-contraversy->controversy
-contributer->contributor
-contributers->contributors
-contritutions->contributions
-controled->controlled
-controling->controlling
-controll->control
-controlls->controls
-controvercial->controversial
-controvercy->controversy
-controveries->controversies
-controversal->controversial
-controversey->controversy
-controvertial->controversial
-controvery->controversy
-contruction->construction
-conveinent->convenient
-convenant->covenant
-convential->conventional
-convertables->convertibles
-convertion->conversion
-conviced->convinced
-convienient->convenient
-coordiantion->coordination
-coorperation->cooperation, corporation
-coorperations->corporations
-copmetitors->competitors
-coputer->computer
-copywrite->copyright
-coridal->cordial
-cornmitted->committed
-corosion->corrosion
-corparate->corporate
-corperations->corporations
-correcters->correctors
-correponding->corresponding
-correposding->corresponding
-correspondant->correspondent
-correspondants->correspondents
-corridoors->corridors
-corrispond->correspond
-corrispondant->correspondent
-corrispondants->correspondents
-corrisponded->corresponded
-corrisponding->corresponding
-corrisponds->corresponds
-costitution->constitution
-coucil->council
-coudl->could, cloud
-councellor->councillor, counselor, councilor
-councellors->councillors, counselors, councilors
-counries->countries
-countains->contains
-countires->countries
-countrie's->countries, countries', country's
-coururier->courier, couturier
-coverted->converted, covered, coveted
-cpoy->coy, copy
-creaeted->created
-creche->crèche
-creedence->credence
-critereon->criterion
-criterias->criteria
-criticists->critics
-critising->criticising, criticizing
-critisising->criticising
-critisism->criticism
-critisisms->criticisms
-critisize->criticise, criticize
-critisized->criticised, criticized
-critisizes->criticises, criticizes
-critisizing->criticising, criticizing
-critized->criticized
-critizing->criticizing
-crockodiles->crocodiles
-crowm->crown
-crtical->critical
-crticised->criticised
-crucifiction->crucifixion
-crusies->cruises
-crystalisation->crystallisation
-culiminating->culminating
-cumulatative->cumulative
-curch->church
-curcuit->circuit
-currenly->currently
-curriculem->curriculum
-cxan->cyan
-cyclinder->cylinder
-dacquiri->daiquiri
-daed->dead
-dael->deal, dial, dahl
-dalmation->dalmatian
-damenor->demeanor
-dammage->damage
-Dardenelles->Dardanelles
-daugher->daughter
-debateable->debatable
-decendant->descendant
-decendants->descendants
-decendent->descendant
-decendents->descendants
-decideable->decidable
-decidely->decidedly
-decieved->deceived
-decison->decision
-decomissioned->decommissioned
-decomposit->decompose
-decomposited->decomposed
-decompositing->decomposing
-decomposits->decomposes
-decress->decrees
-decribe->describe
-decribed->described
-decribes->describes
-decribing->describing
-dectect->detect
-defendent->defendant
-defendents->defendants
-deffensively->defensively
-deffine->define
-deffined->defined
-definance->defiance
-definate->definite
-definately->definitely
-definatly->definitely
-definetly->definitely
-definining->defining
-definit->definite
-definitly->definitely
-definiton->definition
-defintion->definition
-degrate->degrade
-delagates->delegates
-delapidated->dilapidated
-delerious->delirious
-delevopment->development
-deliberatly->deliberately
-delusionally->delusively
-demenor->demeanor
-demographical->demographic
-demolision->demolition
-demorcracy->democracy
-demostration->demonstration
-denegrating->denigrating
-densly->densely
-deparment->department
-deparmental->departmental
-deparments->departments
-dependance->dependence
-dependancy->dependency
-dependant->dependent
-deram->dram, dream
-deriviated->derived
-derivitive->derivative
-derogitory->derogatory
-descendands->descendants
-descibed->described
-descision->decision
-descisions->decisions
-descriibes->describes
-descripters->descriptors
-descripton->description
-desctruction->destruction
-descuss->discuss
-desgined->designed
-deside->decide
-desigining->designing
-desinations->destinations
-desintegrated->disintegrated
-desintegration->disintegration
-desireable->desirable
-desitned->destined
-desktiop->desktop
-desorder->disorder
-desoriented->disoriented
-desparate->desperate, disparate
-despict->depict
-despiration->desperation
-dessicated->desiccated
-dessigned->designed
-destablized->destabilized
-destory->destroy
-detailled->detailed
-detatched->detached
-deteoriated->deteriorated
-deteriate->deteriorate
-deterioriating->deteriorating
-determinining->determining
-detremental->detrimental
-devasted->devastated
-develope->develop
-developement->development
-developped->developed
-develpment->development
-devels->delves
-devestated->devastated
-devestating->devastating
-devide->divide
-devided->divided
-devistating->devastating
-devolopement->development
-diablical->diabolical
-diamons->diamonds
-diaster->disaster
-dichtomy->dichotomy
-diconnects->disconnects
-dicover->discover
-dicovered->discovered
-dicovering->discovering
-dicovers->discovers
-dicovery->discovery
-dicussed->discussed
-didnt->didn't
-diea->idea, die
-dieing->dying, dyeing
-dieties->deities
-diety->deity
-diferent->different
-diferrent->different
-differentiatiations->differentiations
-differnt->different
-difficulity->difficulty
-diffrent->different
-dificulties->difficulties
-dificulty->difficulty
-dimenions->dimensions
-dimention->dimension
-dimentional->dimensional
-dimentions->dimensions
-dimesnional->dimensional
-diminuitive->diminutive
-dimunitive->diminutive
-diosese->diocese
-diphtong->diphthong
-diphtongs->diphthongs
-diplomancy->diplomacy
-dipthong->diphthong
-dipthongs->diphthongs
-dirived->derived
-disagreeed->disagreed
-disapeared->disappeared
-disapointing->disappointing
-disappearred->disappeared
-disaproval->disapproval
-disasterous->disastrous
-disatisfaction->dissatisfaction
-disatisfied->dissatisfied
-disatrous->disastrous
-discontentment->discontent
-discribe->describe
-discribed->described
-discribes->describes
-discribing->describing
-disctinction->distinction
-disctinctive->distinctive
-disemination->dissemination
-disenchanged->disenchanted
-disiplined->disciplined
-disobediance->disobedience
-disobediant->disobedient
-disolved->dissolved
-disover->discover
-dispair->despair
-disparingly->disparagingly
-dispence->dispense
-dispenced->dispensed
-dispencing->dispensing
-dispicable->despicable
-dispite->despite
-dispostion->disposition
-disproportiate->disproportionate
-disputandem->disputandum
-disricts->districts
-dissagreement->disagreement
-dissapear->disappear
-dissapearance->disappearance
-dissapeared->disappeared
-dissapearing->disappearing
-dissapears->disappears
-dissappear->disappear
-dissappears->disappears
-dissappointed->disappointed
-dissarray->disarray
-dissobediance->disobedience
-dissobediant->disobedient
-dissobedience->disobedience
-dissobedient->disobedient
-distiction->distinction
-distingish->distinguish
-distingished->distinguished
-distingishes->distinguishes
-distingishing->distinguishing
-distingquished->distinguished
-distrubution->distribution
-distruction->destruction
-distructive->destructive
-ditributed->distributed
-diversed->diverse, diverged
-divice->device
-divison->division
-divisons->divisions
-dum->dumb
-doccument->document
-doccumented->documented
-doccuments->documents
-docrines->doctrines
-doctines->doctrines
-documenatry->documentary
-doens->does
-doesnt->doesn't
-doign->doing
-dominaton->domination
-dominent->dominant
-dominiant->dominant
-donig->doing
-dosen't->doesn't
-doub->doubt, daub
-doulbe->double
-dowloads->downloads
-dramtic->dramatic
-draughtman->draughtsman
-Dravadian->Dravidian
-dreasm->dreams
-driectly->directly
-drnik->drink
-druming->drumming
-drummless->drumless
-dupicate->duplicate
-durig->during
-durring->during
-duting->during
-dyas->dryas
-eahc->each
-ealier->earlier
-earlies->earliest
-earnt->earned
-ecclectic->eclectic
-eceonomy->economy
-ecidious->deciduous
-eclispe->eclipse
-ecomonic->economic
-ect->etc
-eearly->early
-efel->evil
-effeciency->efficiency
-effecient->efficient
-effeciently->efficiently
-efficency->efficiency
-efficent->efficient
-efficently->efficiently
-efford->effort, afford
-effords->efforts, affords
-effulence->effluence
-eigth->eighth, eight
-eiter->either
-elction->election
-electic->eclectic, electric
-electon->election, electron
-electrial->electrical
-electricly->electrically
-electricty->electricity
-elementay->elementary
-eleminated->eliminated
-eleminating->eliminating
-eles->eels
-eletricity->electricity
-elicided->elicited
-eligable->eligible
-elimentary->elementary
-ellected->elected
-elphant->elephant
-embarass->embarrass
-embarassed->embarrassed
-embarassing->embarrassing
-embarassment->embarrassment
-embargos->embargoes
-embarras->embarrass
-embarrased->embarrassed
-embarrasing->embarrassing
-embarrasment->embarrassment
-embezelled->embezzled
-emblamatic->emblematic
-eminate->emanate
-eminated->emanated
-emision->emission
-emited->emitted
-emiting->emitting
-emition->emission, emotion
-emmediately->immediately
-emmigrated->emigrated, immigrated
-emminent->eminent, imminent
-emminently->eminently
-emmisaries->emissaries
-emmisarries->emissaries
-emmisarry->emissary
-emmisary->emissary
-emmision->emission
-emmisions->emissions
-emmited->emitted
-emmiting->emitting
-emmitted->emitted
-emmitting->emitting
-emnity->enmity
-emperical->empirical
-emphaised->emphasised
-emphsis->emphasis
-emphysyma->emphysema
-empirial->empirical, imperial
-emprisoned->imprisoned
-enameld->enameled
-enchancement->enhancement
-encouraing->encouraging
-encryptiion->encryption
-encylopedia->encyclopedia
-endevors->endeavors
-endevour->endeavour
-endig->ending
-endolithes->endoliths
-enduce->induce
-ened->need
-enflamed->inflamed
-enforceing->enforcing
-engagment->engagement
-engeneer->engineer
-engeneering->engineering
-engieneer->engineer
-engieneers->engineers
-enlargment->enlargement
-enlargments->enlargements
-Enlish->English, enlist
-enourmous->enormous
-enourmously->enormously
-ensconsed->ensconced
-entaglements->entanglements
-enteratinment->entertainment
-enthusiatic->enthusiastic
-entitity->entity
-entitlied->entitled
-entrepeneur->entrepreneur
-entrepeneurs->entrepreneurs
-enviorment->environment
-enviormental->environmental
-enviormentally->environmentally
-enviorments->environments
-enviornment->environment
-enviornmental->environmental
-enviornmentalist->environmentalist
-enviornmentally->environmentally
-enviornments->environments
-enviroment->environment
-enviromental->environmental
-enviromentalist->environmentalist
-enviromentally->environmentally
-enviroments->environments
-envolutionary->evolutionary
-envrionments->environments
-enxt->next
-epidsodes->episodes
-epsiode->episode
-equialent->equivalent
-equilibium->equilibrium
-equilibrum->equilibrium
-equiped->equipped
-equippment->equipment
-equitorial->equatorial
-equivelant->equivalent
-equivelent->equivalent
-equivilant->equivalent
-equivilent->equivalent
-equivlalent->equivalent
-erally->orally, really
-eratic->erratic
-eratically->erratically
-eraticly->erratically
-erested->arrested, erected
-errupted->erupted
-esential->essential
-esitmated->estimated
-esle->else
-especialy->especially
-essencial->essential
-essense->essence
-essentail->essential
-essentialy->essentially
-essentual->essential
-essesital->essential
-estabishes->establishes
-establising->establishing
-ethnocentricm->ethnocentrism
-ethose->those, ethos
-Europian->European
-Europians->Europeans
-Eurpean->European
-Eurpoean->European
-evenhtually->eventually
-eventally->eventually
-eventhough->even though
-eventially->eventually
-eventualy->eventually
-everthing->everything
-everytime->every time
-everyting->everything
-eveyr->every
-evidentally->evidently
-exagerate->exaggerate
-exagerated->exaggerated
-exagerates->exaggerates
-exagerating->exaggerating
-exagerrate->exaggerate
-exagerrated->exaggerated
-exagerrates->exaggerates
-exagerrating->exaggerating
-examinated->examined
-exampt->exempt
-exapansion->expansion
-excact->exact
-excange->exchange
-excecute->execute
-excecuted->executed
-excecutes->executes
-excecuting->executing
-excecution->execution
-excedded->exceeded
-excelent->excellent
-excell->excel
-excellance->excellence
-excellant->excellent
-excells->excels
-excercise->exercise
-exchanching->exchanging
-excisted->existed
-exculsivly->exclusively
-execising->exercising
-exection->execution
-exectued->executed
-exeedingly->exceedingly
-exelent->excellent
-exellent->excellent
-exemple->example
-exept->except
-exeptional->exceptional
-exerbate->exacerbate
-exerbated->exacerbated
-exerciese->exercises
-exerpt->excerpt
-exerpts->excerpts
-exersize->exercise
-exerternal->external
-exhalted->exalted
-exhibtion->exhibition
-exibition->exhibition
-exibitions->exhibitions
-exicting->exciting
-exinct->extinct
-existance->existence
-existant->existent
-existince->existence
-exliled->exiled
-exludes->excludes
-exmaple->example
-exonorate->exonerate
-exoskelaton->exoskeleton
-expalin->explain
-expatriot->expatriate
-expeced->expected
-expecially->especially
-expeditonary->expeditionary
-expeiments->experiments
-expell->expel
-expells->expels
-experiance->experience
-experianced->experienced
-expiditions->expeditions
-expierence->experience
-explaination->explanation
-explaning->explaining
-explictly->explicitly
-exploititive->exploitative
-explotation->exploitation
-expropiated->expropriated
-expropiation->expropriation
-exressed->expressed
-extemely->extremely
-extention->extension
-extentions->extensions
-extered->exerted
-extermist->extremist
-extint->extinct, extant
-extradiction->extradition
-extraterrestial->extraterrestrial
-extraterrestials->extraterrestrials
-extravagent->extravagant
-extrememly->extremely
-extremeophile->extremophile
-extremly->extremely
-extrordinarily->extraordinarily
-extrordinary->extraordinary
-eyar->year, eyas
-eyars->years, eyas
-eyasr->years, eyas
-faciliate->facilitate
-faciliated->facilitated
-faciliates->facilitates
-facilites->facilities
-facillitate->facilitate
-facinated->fascinated
-facist->fascist
-familes->families
-familliar->familiar
-famoust->famous
-fanatism->fanaticism
-Farenheit->Fahrenheit
-fatc->fact
-faught->fought
-favoutrable->favourable
-feasable->feasible
-Febuary->February
-Feburary->February
-fedreally->federally
-feromone->pheromone
-fertily->fertility
-fianite->finite
-fianlly->finally
-ficticious->fictitious
-fictious->fictitious
-fidn->find
-fiel->feel, field, file, phial
-fiels->feels, fields, files, phials
-fiercly->fiercely
-fightings->fighting
-filiament->filament
-fimilies->families
-finacial->financial
-finaly->finally
-financialy->financially
-firends->friends
-firts->flirts, first
-fisionable->fissionable
-flamable->flammable
-flawess->flawless
-fleed->fled, freed
-Flemmish->Flemish
-florescent->fluorescent
-flourescent->fluorescent
-flourine->fluorine
-fluorish->flourish
-flourishment->flourishing
-follwoing->following
-folowing->following
-fomed->formed
-fomr->from, form
-fonetic->phonetic
-fontrier->fontier
-foootball->football
-forbad->forbade
-forbiden->forbidden
-foreward->foreword
-forfiet->forfeit
-forhead->forehead
-foriegn->foreign
-Formalhaut->Fomalhaut
-formallize->formalize
-formallized->formalized
-formaly->formally, formerly
-formelly->formerly
-formidible->formidable
-formost->foremost
-forsaw->foresaw
-forseeable->foreseeable
-fortelling->foretelling
-forunner->forerunner
-foucs->focus
-foudn->found
-fougth->fought
-foundaries->foundries
-foundary->foundry
-Foundland->Newfoundland
-fourties->forties
-fourty->forty
-fouth->fourth
-foward->forward
-Fransiscan->Franciscan
-Fransiscans->Franciscans
-freind->friend
-freindly->friendly
-frequentily->frequently
-frome->from
-fromed->formed
-froniter->frontier
-fucntion->function
-fucntioning->functioning
-fufill->fulfill
-fufilled->fulfilled
-fulfiled->fulfilled
-fullfill->fulfill
-fullfilled->fulfilled
-fundametal->fundamental
-fundametals->fundamentals
-funguses->fungi
-funtion->function
-furuther->further
-futher->further
-futhermore->furthermore
-futhroc->futhark, futhorc
-gae->game, Gael, gale
-galatic->galactic
-Galations->Galatians
-gallaxies->galaxies
-galvinized->galvanized
-Gameboy->Game Boy
-ganerate->generate
-ganes->games
-ganster->gangster
-garantee->guarantee
-garanteed->guaranteed
-garantees->guarantees
-gardai->gardaí
-garnison->garrison
-gauarana->guaraná
-gaurantee->guarantee
-gauranteed->guaranteed
-gaurantees->guarantees
-gaurd->guard, gourd
-gaurentee->guarantee
-gaurenteed->guaranteed
-gaurentees->guarantees
-geneological->genealogical
-geneologies->genealogies
-geneology->genealogy
-generaly->generally
-generatting->generating
-genialia->genitalia
-geographicial->geographical
-geometrician->geometer
-geometricians->geometers
-gerat->great
-Ghandi->Gandhi
-glight->flight
-gnawwed->gnawed
-godess->goddess
-godesses->goddesses
-Godounov->Godunov
-gogin->going, Gauguin
-goign->going
-gonig->going
-Gothenberg->Gothenburg
-Gottleib->Gottlieb
-gouvener->governor
-govement->government
-govenment->government
-govenrment->government
-goverance->governance
-goverment->government
-govermental->governmental
-governer->governor
-governmnet->government
-govorment->government
-govormental->governmental
-govornment->government
-gracefull->graceful
-graet->great
-grafitti->graffiti
-gramatically->grammatically
-grammaticaly->grammatically
-grammer->grammar
-grat->great
-gratuitious->gratuitous
-greatful->grateful
-greatfully->gratefully
-greif->grief
-gridles->griddles
-gropu->group
-grwo->grow
-Guaduloupe->Guadalupe, Guadeloupe
-Guadulupe->Guadalupe, Guadeloupe
-guage->gauge
-guarentee->guarantee
-guarenteed->guaranteed
-guarentees->guarantees
-Guatamala->Guatemala
-Guatamalan->Guatemalan
-guerrila->guerrilla
-guerrilas->guerrillas
-guidence->guidance
-Guilia->Giulia
-Guilio->Giulio
-Guiness->Guinness
-Guiseppe->Giuseppe
-gunanine->guanine
-gurantee->guarantee
-guranteed->guaranteed
-gurantees->guarantees
-guttaral->guttural
-gutteral->guttural
-habaeus->habeas
-habeus->habeas
-Habsbourg->Habsburg
-haemorrage->haemorrhage
-haev->have, heave
-halarious->hilarious
-Hallowean->Hallowe'en, Halloween
-halp->help
-hapen->happen
-hapened->happened
-hapening->happening
-happend->happened
-happended->happened
-happenned->happened
-harased->harassed
-harases->harasses
-harasment->harassment
-harasments->harassments
-harassement->harassment
-harras->harass
-harrased->harassed
-harrases->harasses
-harrasing->harassing
-harrasment->harassment
-harrasments->harassments
-harrassed->harassed
-harrasses->harassed
-harrassing->harassing
-harrassment->harassment
-harrassments->harassments
-hasnt->hasn't
-Hatian->Haitian
-haviest->heaviest
-headquarer->headquarter
-headquater->headquarter
-headquatered->headquartered
-headquaters->headquarters
-healthercare->healthcare
-heared->heard
-heathy->healthy
-Heidelburg->Heidelberg
-heigher->higher
-heirarchy->hierarchy
-heiroglyphics->hieroglyphics
-helment->helmet
-helpfull->helpful
-helpped->helped
-hemmorhage->hemorrhage
-herad->heard, Hera
-heridity->heredity
-heroe->hero
-heros->heroes
-hertiage->heritage
-hertzs->hertz
-hesistant->hesitant
-heterogenous->heterogeneous
-hieght->height
-hierachical->hierarchical
-hierachies->hierarchies
-hierachy->hierarchy
-hierarcical->hierarchical
-hierarcy->hierarchy
-hieroglph->hieroglyph
-hieroglphs->hieroglyphs
-higer->higher
-higest->highest
-higway->highway
-hillarious->hilarious
-himselv->himself
-hinderance->hindrance
-hinderence->hindrance
-hindrence->hindrance
-hipopotamus->hippopotamus
-hismelf->himself
-histocompatability->histocompatibility
-historicians->historians
-hitsingles->hit singles
-holf->hold
-holliday->holiday
-homestate->home state
-homogeneize->homogenize
-homogeneized->homogenized
-honory->honorary
-horrifing->horrifying
-hosited->hoisted
-hospitible->hospitable
-hounour->honour
-housr->hours, house
-howver->however
-hsitorians->historians
-hstory->history
-hten->then, hen, the
-htere->there, here
-htey->they
-htikn->think
-hting->thing
-htink->think
-htis->this
-humer->humor, humour
-humerous->humorous, humerus
-huminoid->humanoid
-humoural->humoral
-humurous->humorous
-husban->husband
-hvae->have
-hvaing->having
-hvea->have, heave
-hwihc->which
-hwile->while
-hwole->whole
-hydogen->hydrogen
-hydropile->hydrophile
-hydropilic->hydrophilic
-hydropobe->hydrophobe
-hydropobic->hydrophobic
-hygeine->hygiene
-hypocracy->hypocrisy
-hypocrasy->hypocrisy
-hypocricy->hypocrisy
-hypocrit->hypocrite
-hypocrits->hypocrites
-iconclastic->iconoclastic
-idaeidae->idea
-idaes->ideas
-idealogies->ideologies
-idealogy->ideology
-identicial->identical
-identifers->identifiers
-ideosyncratic->idiosyncratic
-idesa->ideas, ides
-idiosyncracy->idiosyncrasy
-Ihaca->Ithaca
-illegimacy->illegitimacy
-illegitmate->illegitimate
-illess->illness
-illiegal->illegal
-illution->illusion
-ilness->illness
-ilogical->illogical
-imagenary->imaginary
-imagin->imagine
-imaginery->imaginary, imagery
-imanent->eminent, imminent
-imcomplete->incomplete
-imediately->immediately
-imense->immense
-imigrant->emigrant, immigrant
-imigrated->emigrated, immigrated
-imigration->emigration, immigration
-iminent->eminent, imminent, immanent
-immediatley->immediately
-immediatly->immediately
-immidately->immediately
-immidiately->immediately
-immitate->imitate
-immitated->imitated
-immitating->imitating
-immitator->imitator
-immunosupressant->immunosuppressant
-impecabbly->impeccably
-impedence->impedance
-implamenting->implementing
-impliment->implement
-implimented->implemented
-imploys->employs
-importamt->important
-impressario->impresario
-imprioned->imprisoned
-imprisonned->imprisoned
-improvision->improvisation
-improvments->improvements
-inablility->inability
-inaccessable->inaccessible
-inadiquate->inadequate
-inadquate->inadequate
-inadvertant->inadvertent
-inadvertantly->inadvertently
-inagurated->inaugurated
-inaguration->inauguration
-inappropiate->inappropriate
-inaugures->inaugurates
-inbalance->imbalance
-inbalanced->imbalanced
-inbetween->between
-incarcirated->incarcerated
-incidentially->incidentally
-incidently->incidentally
-inclreased->increased
-includ->include
-includng->including
-incompatabilities->incompatibilities
-incompatability->incompatibility
-incompatable->incompatible
-incompatablities->incompatibilities
-incompatablity->incompatibility
-incompatiblities->incompatibilities
-incompatiblity->incompatibility
-incompetance->incompetence
-incompetant->incompetent
-incomptable->incompatible
-incomptetent->incompetent
-inconsistant->inconsistent
-incoroporated->incorporated
-incorperation->incorporation
-incorportaed->incorporated
-incorprates->incorporates
-incorruptable->incorruptible
-incramentally->incrementally
-increadible->incredible
-incredable->incredible
-inctroduce->introduce
-inctroduced->introduced
-incuding->including
-incunabla->incunabula
-indefinately->indefinitely
-indefineable->undefinable
-indefinitly->indefinitely
-indentical->identical
-indepedantly->independently
-indepedence->independence
-independance->independence
-independant->independent
-independantly->independently
-independece->independence
-independendet->independent
-indespensable->indispensable
-indespensible->indispensable
-indictement->indictment
-indigineous->indigenous
-indipendence->independence
-indipendent->independent
-indipendently->independently
-indispensible->indispensable
-indisputible->indisputable
-indisputibly->indisputably
-indite->indict
-individualy->individually
-indpendent->independent
-indpendently->independently
-indulgue->indulge
-indutrial->industrial
-indviduals->individuals
-inefficienty->inefficiently
-inevatible->inevitable
-inevitible->inevitable
-inevititably->inevitably
-infalability->infallibility
-infallable->infallible
-infectuous->infectious
-infered->inferred
-infilitrate->infiltrate
-infilitrated->infiltrated
-infilitration->infiltration
-infinit->infinite
-inflamation->inflammation
-influencial->influential
-influented->influenced
-infomation->information
-informtion->information
-infrantryman->infantryman
-infrigement->infringement
-ingenius->ingenious
-ingreediants->ingredients
-inhabitans->inhabitants
-inherantly->inherently
-inheritage->heritage, inheritance
-inheritence->inheritance
-inital->initial
-initally->initially
-initation->initiation
-initiaitive->initiative
-inlcuding->including
-inmigrant->immigrant
-inmigrants->immigrants
-innoculated->inoculated
-inocence->innocence
-inofficial->unofficial
-inot->into
-inpeach->impeach
-inpolite->impolite
-inprisonment->imprisonment
-inproving->improving
-insectiverous->insectivorous
-insensative->insensitive
-inseperable->inseparable
-insistance->insistence
-insitution->institution
-insitutions->institutions
-inspite->in spite, inspire
-instade->instead
-instatance->instance
-institue->institute
-instuction->instruction
-instuments->instruments
-instutionalized->institutionalized
-instutions->intuitions
-insurence->insurance
-intelectual->intellectual
-inteligence->intelligence
-inteligent->intelligent
-intenational->international
-intented->intended, indented
-intepretation->interpretation
-intepretator->interpretor
-interational->international
-interbread->interbreed, interbred
-interchangable->interchangeable
-interchangably->interchangeably
-intercontinetal->intercontinental
-intered->interred, interned
-interelated->interrelated
-interferance->interference
-interfereing->interfering
-intergrated->integrated
-intergration->integration
-interm->interim
-internation->international
-interpet->interpret
-interrim->interim
-interrugum->interregnum
-intertaining->entertaining
-interupt->interrupt
-intervines->intervenes
-intevene->intervene
-intial->initial
-intially->initially
-intrduced->introduced
-intrest->interest
-introdued->introduced
-intruduced->introduced
-intrument->instrument
-intrumental->instrumental
-intruments->instruments
-intrusted->entrusted
-intutive->intuitive
-intutively->intuitively
-inudstry->industry
-inumerable->enumerable, innumerable
-inventer->inventor
-invertibrates->invertebrates
-investingate->investigate
-involvment->involvement
-irelevent->irrelevant
-iresistable->irresistible
-iresistably->irresistibly
-iresistible->irresistible
-iresistibly->irresistibly
-iritable->irritable
-iritated->irritated
-ironicly->ironically
-irregardless->regardless
-irrelevent->irrelevant
-irreplacable->irreplaceable
-irresistable->irresistible
-irresistably->irresistibly
-isnt->isn't
-Israelies->Israelis
-issueing->issuing
-itnroduced->introduced
-iunior->junior
-iwll->will
-iwth->with
-Janurary->January
-Januray->January
-Japanes->Japanese
-jaques->jacques
-jeapardy->jeopardy
-jewllery->jewellery
-Johanine->Johannine
-jorunal->journal
-Jospeh->Joseph
-jouney->journey
-journied->journeyed
-journies->journeys
-jstu->just
-jsut->just
-Juadaism->Judaism
-Juadism->Judaism
-judical->judicial
-judisuary->judiciary
-juducial->judicial
-juristiction->jurisdiction
-juristictions->jurisdictions
-kindergarden->kindergarten
-klenex->kleenex
-knifes->knives
-knive->knife
-knowlege->knowledge
-knowlegeable->knowledgeable
-knwo->know
-knwos->knows
-konw->know
-konws->knows
-kwno->know
-labatory->lavatory, laboratory
-labled->labelled, labeled
-labratory->laboratory
-laguage->language
-laguages->languages
-larg->large
-largst->largest
-larrry->larry
-lastr->last
-lattitude->latitude
-launchs->launch, launches
-launhed->launched
-lavae->larvae
-layed->laid
-lazyness->laziness
-leage->league
-leanr->lean, learn, leaner
-leathal->lethal
-lefted->left
-legitamate->legitimate
-legitmate->legitimate
-leibnitz->leibniz
-lenght->length
-leran->learn
-lerans->learns
-leutenant->lieutenant
-levetate->levitate
-levetated->levitated
-levetates->levitates
-levetating->levitating
-levle->level
-liasion->liaison
-liason->liaison
-liasons->liaisons
-libary->library
-libell->libel
-libguistic->linguistic
-libguistics->linguistics
-libitarianisn->libertarianism
-lible->libel, liable
-lieing->lying
-liek->like
-liekd->liked
-liesure->leisure
-lieuenant->lieutenant
-lieved->lived
-liftime->lifetime
-lightyear->light year
-lightyears->light years
-likelyhood->likelihood
-linnaena->linnaean
-lippizaner->lipizzaner
-liquify->liquefy
-liscense->license, licence
-lisence->license, licence
-lisense->license, licence
-listners->listeners
-litature->literature
-literaly->literally
-literture->literature
-littel->little
-litterally->literally
-liuke->like
-livley->lively
-lmits->limits
-loev->love
-lonelyness->loneliness
-longitudonal->longitudinal
-lonley->lonely
-lonly->lonely, only
-loosing->losing
-lotharingen->lothringen
-lsat->last
-lukid->likud
-lveo->love
-lvoe->love
-Lybia->Libya
-maching->machine, marching, matching
-mackeral->mackerel
-magasine->magazine
-magincian->magician
-magnificient->magnificent
-magolia->magnolia
-mailny->mainly
-maintainance->maintenance
-maintainence->maintenance
-maintance->maintenance
-maintenence->maintenance
-maintinaing->maintaining
-maintioned->mentioned
-majoroty->majority
-maked->marked, made
-makse->makes
-Malcom->Malcolm
-maltesian->Maltese
-mamal->mammal
-mamalian->mammalian
-managable->manageable, manageably
-managment->management
-maneouvre->manoeuvre
-maneouvred->manoeuvred
-maneouvres->manoeuvres
-maneouvring->manoeuvring
-manisfestations->manifestations
-manoeuverability->maneuverability
-manouver->maneuver, manoeuvre
-manouverability->maneuverability, manoeuvrability, manoeuverability
-manouverable->maneuverable, manoeuvrable
-manouvers->maneuvers, manoeuvres
-mantained->maintained
-manuever->maneuver, manoeuvre
-manuevers->maneuvers, manoeuvres
-manufacturedd->manufactured
-manufature->manufacture
-manufatured->manufactured
-manufaturing->manufacturing
-manuver->maneuver
-mariage->marriage
-marjority->majority
-markes->marks
-marketting->marketing
-marmelade->marmalade
-marrage->marriage
-marraige->marriage
-marrtyred->martyred
-marryied->married
-Massachussets->Massachusetts
-Massachussetts->Massachusetts
-massmedia->mass media
-masterbation->masturbation
-mataphysical->metaphysical
-materalists->materialist
-mathamatics->mathematics
-mathematican->mathematician
-mathematicas->mathematics
-matheticians->mathematicians
-mathmatically->mathematically
-mathmatician->mathematician
-mathmaticians->mathematicians
-mccarthyst->mccarthyist
-mchanics->mechanics
-meaninng->meaning
-mear->wear, mere, mare
-mechandise->merchandise
-medacine->medicine
-medeival->medieval
-medevial->medieval
-mediciney->mediciny
-medievel->medieval
-mediterainnean->mediterranean
-Mediteranean->Mediterranean
-meerkrat->meerkat
-melieux->milieux
-membranaphone->membranophone
-memeber->member
-menally->mentally
-meranda->veranda, Miranda
-mercentile->mercantile
-messanger->messenger
-messenging->messaging
-metalic->metallic
-metalurgic->metallurgic
-metalurgical->metallurgical
-metalurgy->metallurgy
-metamorphysis->metamorphosis
-metaphoricial->metaphorical
-meterologist->meteorologist
-meterology->meteorology
-methaphor->metaphor
-methaphors->metaphors
-Michagan->Michigan
-micoscopy->microscopy
-midwifes->midwives
-mileau->milieu
-milennia->millennia
-milennium->millennium
-mileu->milieu
-miliary->military
-milion->million
-miliraty->military
-millenia->millennia
-millenial->millennial
-millenialism->millennialism
-millenium->millennium
-millepede->millipede
-millioniare->millionaire
-millitary->military
-millon->million
-miltary->military
-minature->miniature
-minerial->mineral
-miniscule->minuscule
-ministery->ministry
-minstries->ministries
-minstry->ministry
-minumum->minimum
-mirrorred->mirrored
-miscelaneous->miscellaneous
-miscellanious->miscellaneous
-miscellanous->miscellaneous
-mischeivous->mischievous
-mischevious->mischievous
-mischievious->mischievous
-misdameanor->misdemeanor
-misdameanors->misdemeanors
-misdemenor->misdemeanor
-misdemenors->misdemeanors
-misfourtunes->misfortunes
-misile->missile
-Misouri->Missouri
-mispell->misspell
-mispelled->misspelled
-mispelling->misspelling
-missen->mizzen
-Missisipi->Mississippi
-Missisippi->Mississippi
-missle->missile
-missonary->missionary
-misterious->mysterious
-mistery->mystery
-misteryous->mysterious
-mkae->make
-mkaes->makes
-mkaing->making
-mkea->make
-moderm->modem
-modle->model
-moent->moment
-moeny->money
-mohammedans->muslims
-moil->mohel,soil
-moleclues->molecules
-momento->memento
-monestaries->monasteries
-monestary->monastery, monetary
-monickers->monikers
-monolite->monolithic
-Monserrat->Montserrat
-montains->mountains
-montanous->mountainous
-Montnana->Montana
-monts->months
-montypic->monotypic
-moreso->more, more so
-morgage->mortgage
-Morisette->Morissette
-Morrisette->Morissette
-morroccan->moroccan
-morrocco->morocco
-morroco->morocco
-mortage->mortgage
-mosture->moisture
-motiviated->motivated
-mounth->month
-movei->movie
-movment->movement
-mroe->more
-mucuous->mucous
-muder->murder
-mudering->murdering
-muhammadan->muslim
-multicultralism->multiculturalism
-multipled->multiplied
-multiplers->multipliers
-munbers->numbers
-muncipalities->municipalities
-muncipality->municipality
-munnicipality->municipality
-muscels->mussels, muscles
-muscial->musical
-muscician->musician
-muscicians->musicians
-mutiliated->mutilated
-myraid->myriad
-mysef->myself
-mysogynist->misogynist
-mysogyny->misogyny
-mysterous->mysterious
-Mythraic->Mithraic
-naieve->naive
-Naploeon->Napoleon
-Napolean->Napoleon
-Napoleonian->Napoleonic
-naturaly->naturally
-naturely->naturally
-naturual->natural
-naturually->naturally
-Nazereth->Nazareth
-neccesarily->necessarily
-neccesary->necessary
-neccessarily->necessarily
-neccessary->necessary
-neccessities->necessities
-necesarily->necessarily
-necesary->necessary
-necessiate->necessitate
-neglible->negligible
-negligable->negligible
-negociate->negotiate
-negociation->negotiation
-negociations->negotiations
-negotation->negotiation
-neice->niece, nice
-neigborhood->neighborhood
-neigbour->neighbour, neighbor
-neigbourhood->neighbourhood
-neigbouring->neighbouring, neighboring
-neigbours->neighbours, neighbors
-neolitic->neolithic
-nessasarily->necessarily
-nessecary->necessary
-nestin->nesting
-neverthless->nevertheless
-newletters->newsletters
-Newyorker->New Yorker
-nickle->nickel
-nightfa;;->nightfall
-nightime->nighttime
-nineth->ninth
-ninteenth->nineteenth
-ninties->1990s
-ninty->ninety
-nkow->know
-nkwo->know
-nmae->name
-noncombatents->noncombatants
-nonsence->nonsense
-nontheless->nonetheless
-noone->no one
-norhern->northern
-northen->northern
-northereastern->northeastern
-notabley->notably
-noteable->notable
-noteably->notably
-noteriety->notoriety
-noth->north
-nothern->northern
-noticable->noticeable
-noticably->noticeably
-noticeing->noticing
-noticible->noticeable
-notwhithstanding->notwithstanding
-noveau->nouveau
-Novermber->November
-nowdays->nowadays
-nowe->now
-nto->not
-nucular->nuclear
-nuculear->nuclear
-nuisanse->nuisance
-Nullabour->Nullarbor
-numberous->numerous
-Nuremburg->Nuremberg
-nusance->nuisance
-nutritent->nutrient
-nutritents->nutrients
-nuturing->nurturing
-obediance->obedience
-obediant->obedient
-obession->obsession
-obssessed->obsessed
-obstacal->obstacle
-obstancles->obstacles
-obstruced->obstructed
-ocasion->occasion
-ocasional->occasional
-ocasionally->occasionally
-ocasionaly->occasionally
-ocasioned->occasioned
-ocasions->occasions
-ocassion->occasion
-ocassional->occasional
-ocassionally->occasionally
-ocassionaly->occasionally
-ocassioned->occasioned
-ocassions->occasions
-occaison->occasion
-occassion->occasion
-occassional->occasional
-occassionally->occasionally
-occassionaly->occasionally
-occassioned->occasioned
-occassions->occasions
-occationally->occasionally
-occour->occur
-occurance->occurrence
-occurances->occurrences
-occured->occurred
-occurence->occurrence
-occurences->occurrences
-occuring->occurring
-occurr->occur
-occurrance->occurrence
-occurrances->occurrences
-octohedra->octahedra
-octohedral->octahedral
-octohedron->octahedron
-ocuntries->countries
-ocuntry->country
-ocurr->occur
-ocurrance->occurrence
-ocurred->occurred
-ocurrence->occurrence
-offcers->officers
-offcially->officially
-offereings->offerings
-offical->official
-offically->officially
-officals->officials
-officaly->officially
-officialy->officially
-offred->offered
-oftenly->often
-oging->going, ogling
-ok->OK
-omision->omission
-omited->omitted
-omiting->omitting
-omlette->omelette
-ommision->omission
-ommited->omitted
-ommiting->omitting
-ommitted->omitted
-ommitting->omitting
-omniverous->omnivorous
-omniverously->omnivorously
-omre->more
-onot->note, not
-onyl->only
-openess->openness
-oponent->opponent
-oportunity->opportunity
-opose->oppose
-oposite->opposite
-oposition->opposition
-oppenly->openly
-oppinion->opinion
-opponant->opponent
-oppononent->opponent
-oppositition->opposition
-oppossed->opposed
-opprotunity->opportunity
-opression->oppression
-opressive->oppressive
-opthalmic->ophthalmic
-opthalmologist->ophthalmologist
-opthalmology->ophthalmology
-opthamologist->ophthalmologist
-optmizations->optimizations
-optomism->optimism
-orded->ordered
-organim->organism
-organistion->organisation
-organiztion->organization
-orgin->origin, organ
-orginal->original
-orginally->originally
-orginize->organise
-oridinarily->ordinarily
-origanaly->originally
-originall->original, originally
-originaly->originally
-originially->originally
-originnally->originally
-origional->original
-orignally->originally
-orignially->originally
-otehr->other
-oublisher->publisher
-ouevre->oeuvre
-oustanding->outstanding
-overshaddowed->overshadowed
-overthere->over there
-overwelming->overwhelming
-overwheliming->overwhelming
-owrk->work
-owudl->would
-oxigen->oxygen
-oximoron->oxymoron
-p0enis->penis
-paide->paid
-paitience->patience
-palce->place, palace
-paleolitic->paleolithic
-paliamentarian->parliamentarian
-Palistian->Palestinian
-Palistinian->Palestinian
-Palistinians->Palestinians
-pallete->palette
-pamflet->pamphlet
-pamplet->pamphlet
-pantomine->pantomime
-Papanicalou->Papanicolaou
-paralel->parallel
-paralell->parallel
-paralelly->parallelly
-paralely->parallelly
-parallely->parallelly
-paranthesis->parenthesis
-paraphenalia->paraphernalia
-parellels->parallels
-parituclar->particular
-parliment->parliament
-parrakeets->parakeets
-parralel->parallel
-parrallel->parallel
-parrallell->parallel
-parrallelly->parallelly
-parrallely->parallelly
-partialy->partially
-particually->particularly
-particualr->particular
-particuarly->particularly
-particularily->particularly
-particulary->particularly
-pary->party
-pased->passed
-pasengers->passengers
-passerbys->passersby
-pasttime->pastime
-pastural->pastoral
-paticular->particular
-pattented->patented
-pavillion->pavilion
-payed->paid
-pblisher->publisher
-pbulisher->publisher
-peacefuland->peaceful and
-peageant->pageant
-peculure->peculiar
-pedestrain->pedestrian
-peformed->performed
-peice->piece
-Peloponnes->Peloponnesus
-penatly->penalty
-penerator->penetrator
-penisula->peninsula
-penisular->peninsular
-penninsula->peninsula
-penninsular->peninsular
-pennisula->peninsula
-Pennyslvania->Pennsylvania
-pensinula->peninsula
-peom->poem
-peoms->poems
-peopel->people
-peotry->poetry
-perade->parade
-percepted->perceived
-percieve->perceive
-percieved->perceived
-perenially->perennially
-perfomance->performance
-perfomers->performers
-performence->performance
-performes->performed, performs
-perhasp->perhaps
-perheaps->perhaps
-perhpas->perhaps
-peripathetic->peripatetic
-peristent->persistent
-perjery->perjury
-perjorative->pejorative
-permanant->permanent
-permenant->permanent
-permenantly->permanently
-permissable->permissible
-perogative->prerogative
-peronal->personal
-perosnality->personality
-perphas->perhaps
-perpindicular->perpendicular
-perseverence->perseverance
-persistance->persistence
-persistant->persistent
-personel->personnel, personal
-personell->personnel
-personnell->personnel
-persuded->persuaded
-persue->pursue
-persued->pursued
-persuing->pursuing
-persuit->pursuit
-persuits->pursuits
-pertubation->perturbation
-pertubations->perturbations
-pessiary->pessary
-petetion->petition
-Pharoah->Pharaoh
-phenomenom->phenomenon
-phenomenonal->phenomenal
-phenomenonly->phenomenally
-phenomonenon->phenomenon
-phenomonon->phenomenon
-phenonmena->phenomena
-Philipines->Philippines
-philisopher->philosopher
-philisophical->philosophical
-philisophy->philosophy
-Phillipine->Philippine
-Phillipines->Philippines
-Phillippines->Philippines
-phillosophically->philosophically
-philospher->philosopher
-philosphies->philosophies
-philosphy->philosophy
-Phonecian->Phoenecian
-phongraph->phonograph
-phylosophical->philosophical
-physicaly->physically
-piblisher->publisher
-pich->pitch
-pilgrimmage->pilgrimage
-pilgrimmages->pilgrimages
-pinapple->pineapple
-pinnaple->pineapple
-pinoneered->pioneered
-plagarism->plagiarism
-planation->plantation
-planed->planned
-plantiff->plaintiff
-plateu->plateau
-plausable->plausible
-playright->playwright
-playwrite->playwright
-playwrites->playwrights
-pleasent->pleasant
-plebicite->plebiscite
-plesant->pleasant
-poenis->penis
-poeoples->peoples
-poety->poetry
-poisin->poison
-polical->political
-polinator->pollinator
-polinators->pollinators
-politican->politician
-politicans->politicians
-poltical->political
-polute->pollute
-poluted->polluted
-polutes->pollutes
-poluting->polluting
-polution->pollution
-polyphonyic->polyphonic
-polysaccaride->polysaccharide
-polysaccharid->polysaccharide
-pomegranite->pomegranate
-pomotion->promotion
-poportional->proportional
-popoulation->population
-popularaty->popularity
-populare->popular
-populer->popular
-portait->portrait
-portayed->portrayed
-portraing->portraying
-Portugese->Portuguese
-portuguease->portuguese
-portugues->Portuguese
-posess->possess
-posessed->possessed
-posesses->possesses
-posessing->possessing
-posession->possession
-posessions->possessions
-posion->poison
-positon->position, positron
-possable->possible
-possably->possibly
-posseses->possesses
-possesing->possessing
-possesion->possession
-possessess->possesses
-possibile->possible
-possibilty->possibility
-possiblility->possibility
-possiblilty->possibility
-possiblities->possibilities
-possiblity->possibility
-possition->position
-Postdam->Potsdam
-posthomous->posthumous
-postion->position
-postive->positive
-potatos->potatoes
-potrait->portrait
-potrayed->portrayed
-poulations->populations
-poverful->powerful
-poweful->powerful
-powerfull->powerful
-ppublisher->publisher
-practial->practical
-practially->practically
-practicaly->practically
-practicioner->practitioner
-practicioners->practitioners
-practicly->practically
-practioner->practitioner
-practioners->practitioners
-prairy->prairie
-prarie->prairie
-praries->prairies
-pratice->practice
-preample->preamble
-precedessor->predecessor
-preceed->precede
-preceeded->preceded
-preceeding->preceding
-preceeds->precedes
-precentage->percentage
-precice->precise
-precisly->precisely
-precurser->precursor
-predecesors->predecessors
-predicatble->predictable
-predicitons->predictions
-predomiantly->predominately
-prefered->preferred
-prefering->preferring
-preferrably->preferably
-pregancies->pregnancies
-preiod->period
-preliferation->proliferation
-premeire->premiere
-premeired->premiered
-premillenial->premillennial
-preminence->preeminence
-premission->permission
-Premonasterians->Premonstratensians
-preocupation->preoccupation
-prepair->prepare
-prepartion->preparation
-prepatory->preparatory
-preperation->preparation
-preperations->preparations
-preriod->period
-presedential->presidential
-presense->presence
-presidenital->presidential
-presidental->presidential
-presitgious->prestigious
-prespective->perspective
-prestigeous->prestigious
-prestigous->prestigious
-presumabely->presumably
-presumibly->presumably
-pretection->protection
-prevelant->prevalent
-preverse->perverse
-previvous->previous
-pricipal->principal
-priciple->principle
-priestood->priesthood
-primarly->primarily
-primative->primitive
-primatively->primitively
-primatives->primitives
-primordal->primordial
-principlaity->principality
-principaly->principality
-principial->principal
-principly->principally
-prinicipal->principal
-privalege->privilege
-privaleges->privileges
-priveledges->privileges
-privelege->privilege
-priveleged->privileged
-priveleges->privileges
-privelige->privilege
-priveliged->privileged
-priveliges->privileges
-privelleges->privileges
-privilage->privilege
-priviledge->privilege
-priviledges->privileges
-privledge->privilege
-privte->private
-probabilaty->probability
-probablistic->probabilistic
-probablly->probably
-probalibity->probability
-probaly->probably
-probelm->problem
-proccess->process
-proccessing->processing
-procede->proceed, precede
-proceded->proceeded, preceded
-procedes->proceeds, precedes
-procedger->procedure
-proceding->proceeding, preceding
-procedings->proceedings
-proceedure->procedure
-proces->process
-processer->processor
-proclaimation->proclamation
-proclamed->proclaimed
-proclaming->proclaiming
-proclomation->proclamation
-profesion->profusion, profession
-profesor->professor
-professer->professor
-proffesed->professed
-proffesion->profession
-proffesional->professional
-proffesor->professor
-profilic->prolific
-progessed->progressed
-programable->programmable
-progrom->pogrom, program
-progroms->pogroms, programs
-prohabition->prohibition
-prologomena->prolegomena
-prominance->prominence
-prominant->prominent
-prominantly->prominently
-prominately->prominently, predominately
-promiscous->promiscuous
-promotted->promoted
-pronomial->pronominal
-pronouced->pronounced
-pronounched->pronounced
-pronounciation->pronunciation
-proove->prove
-prooved->proved
-prophacy->prophecy
-propietary->proprietary
-propmted->prompted
-propoganda->propaganda
-propogate->propagate
-propogates->propagates
-propogation->propagation
-propostion->proposition
-propotions->proportions
-propper->proper
-propperly->properly
-proprietory->proprietary
-proseletyzing->proselytizing
-protaganist->protagonist
-protaganists->protagonists
-protocal->protocol
-protoganist->protagonist
-protrayed->portrayed
-protruberance->protuberance
-protruberances->protuberances
-prouncements->pronouncements
-provacative->provocative
-provded->provided
-provicial->provincial
-provinicial->provincial
-provisiosn->provision
-provisonal->provisional
-proximty->proximity
-pseudononymous->pseudonymous
-pseudonyn->pseudonym
-psuedo->pseudo
-psycology->psychology
-psyhic->psychic
-pubilsher->publisher
-pubisher->publisher
-publiaher->publisher
-publically->publicly
-publicaly->publicly
-publicher->publisher
-publihser->publisher
-publisehr->publisher
-publiser->publisher
-publisger->publisher
-publisheed->published
-publisherr->publisher
-publishher->publisher
-publishor->publisher
-publishre->publisher
-publissher->publisher
-publlisher->publisher
-publsiher->publisher
-publusher->publisher
-puchasing->purchasing
-Pucini->Puccini
-Puertorrican->Puerto Rican
-Puertorricans->Puerto Ricans
-pulisher->publisher
-pumkin->pumpkin
-puplisher->publisher
-puritannical->puritanical
-purposedly->purposely
-purpotedly->purportedly
-pursuade->persuade
-pursuaded->persuaded
-pursuades->persuades
-pususading->persuading
-puting->putting
-pwoer->power
-pyscic->psychic
-qtuie->quite, quiet
-quantaty->quantity
-quantitiy->quantity
-quarantaine->quarantine
-Queenland->Queensland
-questonable->questionable
-quicklyu->quickly
-quinessential->quintessential
-quitted->quit
-quizes->quizzes
-qutie->quite, quiet
-rabinnical->rabbinical
-racaus->raucous
-radiactive->radioactive
-radify->ratify
-raelly->really
-rarified->rarefied
-reaccurring->recurring
-reacing->reaching
-reacll->recall
-readmition->readmission
-realitvely->relatively
-realsitic->realistic
-realtions->relations
-realy->really
-realyl->really
-reasearch->research
-rebiulding->rebuilding
-rebllions->rebellions
-rebounce->rebound
-reccomend->recommend
-reccomendations->recommendations
-reccomended->recommended
-reccomending->recommending
-reccommend->recommend
-reccommended->recommended
-reccommending->recommending
-reccuring->recurring
-receeded->receded
-receeding->receding
-receivedfrom->received from
-recepient->recipient
-recepients->recipients
-receving->receiving
-rechargable->rechargeable
-reched->reached
-recide->reside
-recided->resided
-recident->resident
-recidents->residents
-reciding->residing
-reciepents->recipients
-reciept->receipt
-recieve->receive
-recieved->received
-reciever->receiver
-recievers->receivers
-recieves->receives
-recieving->receiving
-recipiant->recipient
-recipiants->recipients
-recived->received
-recivership->receivership
-recogise->recognise
-recogize->recognize
-recomend->recommend
-recomended->recommended
-recomending->recommending
-recomends->recommends
-recommedations->recommendations
-recompence->recompense
-reconaissance->reconnaissance
-reconcilation->reconciliation
-reconized->recognized
-reconnaisance->reconnaissance
-reconnaissence->reconnaissance
-recontructed->reconstructed
-recordproducer->record producer
-recquired->required
-recrational->recreational
-recrod->record
-recuiting->recruiting
-recuring->recurring
-recurrance->recurrence
-rediculous->ridiculous
-reedeming->redeeming
-reenforced->reinforced
-refect->reflect
-refedendum->referendum
-referal->referral
-referece->reference
-refereces->references
-refered->referred
-referemce->reference
-referemces->references
-referencs->references
-referenece->reference
-refereneced->referenced
-refereneces->references
-referiang->referring
-refering->referring
-refernce->reference,references
-refernces->references
-referrence->reference
-referrences->references
-referrs->refers
-reffered->referred
-refference->reference
-reffering->referring
-refrence->reference
-refrences->references
-refrers->refers
-refridgeration->refrigeration
-refridgerator->refrigerator
-refromist->reformist
-refusla->refusal
-regardes->regards
-regluar->regular
-reguarly->regularly
-regulaion->regulation
-regulaotrs->regulators
-regularily->regularly
-rehersal->rehearsal
-reicarnation->reincarnation
-reigining->reigning
-reknown->renown
-reknowned->renowned
-rela->real
-relaly->really
-relatiopnship->relationship
-relativly->relatively
-relected->reelected
-releive->relieve
-releived->relieved
-releiver->reliever
-releses->releases
-relevence->relevance
-relevent->relevant
-reliablity->reliability
-relient->reliant
-religeous->religious
-religous->religious
-religously->religiously
-relinqushment->relinquishment
-relitavely->relatively
-relized->realised, realized
-relpacement->replacement
-remaing->remaining
-remeber->remember
-rememberable->memorable
-rememberance->remembrance
-remembrence->remembrance
-remenant->remnant
-remenicent->reminiscent
-reminent->remnant
-reminescent->reminiscent
-reminscent->reminiscent
-reminsicent->reminiscent
-rendevous->rendezvous
-rendezous->rendezvous
-renedered->rende
-renewl->renewal
-rennovate->renovate
-rennovated->renovated
-rennovating->renovating
-rennovation->renovation
-rentors->renters
-reoccurrence->recurrence
-reorganision->reorganisation
-repatition->repetition, repartition
-repblic->republic
-repblican->republican
-repblicans->republicans
-repblics->republics
-repectively->respectively
-repeition->repetition
-repentence->repentance
-repentent->repentant
-repeteadly->repeatedly
-repetion->repetition
-repid->rapid
-reponse->response
-reponsible->responsible
-reportadly->reportedly
-represantative->representative
-representive->representative
-representives->representatives
-reproducable->reproducible
-reprtoire->repertoire
-repsectively->respectively
-reptition->repetition
-repubic->republic
-repubican->republican
-repubicans->republicans
-repubics->republics
-republi->republic
-republian->republican
-republians->republicans
-republis->republics
-repulic->republic
-repulican->republican
-repulicans->republicans
-repulics->republics
-requirment->requirement
-requred->required
-resaurant->restaurant
-resembelance->resemblance
-resembes->resembles
-resemblence->resemblance
-resevoir->reservoir
-residental->residential
-resignement->resignment
-resistable->resistible
-resistence->resistance
-resistent->resistant
-respectivly->respectively
-responce->response
-responibilities->responsibilities
-responisble->responsible
-responnsibilty->responsibility
-responsability->responsibility
-responsibile->responsible
-responsibilites->responsibilities
-responsiblities->responsibilities
-responsiblity->responsibility
-ressemblance->resemblance
-ressemble->resemble
-ressembled->resembled
-ressemblence->resemblance
-ressembling->resembling
-resssurecting->resurrecting
-ressurect->resurrect
-ressurected->resurrected
-ressurection->resurrection
-ressurrection->resurrection
-restarant->restaurant
-restarants->restaurants
-restaraunt->restaurant
-restaraunteur->restaurateur
-restaraunteurs->restaurateurs
-restaraunts->restaurants
-restauranteurs->restaurateurs
-restauration->restoration
-restauraunt->restaurant
-resteraunt->restaurant
-resteraunts->restaurants
-resticted->restricted
-restraunt->restraint, restaurant
-resturant->restaurant
-resturants->restaurants
-resturaunt->restaurant
-resturaunts->restaurants
-resurecting->resurrecting
-retalitated->retaliated
-retalitation->retaliation
-retreive->retrieve
-returnd->returned
-revaluated->reevaluated
-reveiw->review
-reveral->reversal
-reversable->reversible
-revolutionar->revolutionary
-rewitten->rewritten
-rewriet->rewrite
-rference->reference
-rferences->references
-rhymme->rhyme
-rhythem->rhythm
-rhythim->rhythm
-rhytmic->rhythmic
-rigeur->rigueur, rigour, rigor
-rigourous->rigorous
-rininging->ringing
-rised->rose
-Rockerfeller->Rockefeller
-rococco->rococo
-rocord->record
-roomate->roommate
-rougly->roughly
-rucuperate->recuperate
-rudimentatry->rudimentary
-rulle->rule
-runing->running
-runnung->running
-russina->Russian
-Russion->Russian
-rwite->write
-rythem->rhythm
-rythim->rhythm
-rythm->rhythm
-rythmic->rhythmic
-rythyms->rhythms
-sacrafice->sacrifice
-sacreligious->sacrilegious
-sacrifical->sacrificial
-saftey->safety
-safty->safety
-salery->salary
-sanctionning->sanctioning
-sandwhich->sandwich
-Sanhedrim->Sanhedrin
-santioned->sanctioned
-sargant->sergeant
-sargeant->sergeant
-sasy->says, sassy
-satelite->satellite
-satelites->satellites
-Saterday->Saturday
-Saterdays->Saturdays
-satisfactority->satisfactorily
-satric->satiric
-satrical->satirical
-satrically->satirically
-sattelite->satellite
-sattelites->satellites
-saught->sought
-saveing->saving
-saxaphone->saxophone
-scaleable->scalable
-scandanavia->Scandinavia
-scaricity->scarcity
-scavanged->scavenged
-schedual->schedule
-scholarhip->scholarship
-scholarstic->scholastic, scholarly
-scientfic->scientific
-scientifc->scientific
-scientis->scientist
-scince->science
-scinece->science
-scirpt->script
-scoll->scroll
-screenwrighter->screenwriter
-scrutinity->scrutiny
-scuptures->sculptures
-seach->search
-seached->searched
-seaches->searches
-secceeded->seceded, succeeded
-seceed->succeed, secede
-seceeded->succeeded, seceded
-secratary->secretary
-secretery->secretary
-sedereal->sidereal
-seeked->sought
-segementation->segmentation
-seguoys->segues
-seige->siege
-seing->seeing
-seinor->senior
-seldomly->seldom
-senarios->scenarios
-sence->sense, since
-senstive->sensitive
-sensure->censure
-seperate->separate
-seperated->separated
-seperately->separately
-seperates->separates
-seperating->separating
-seperation->separation
-seperatism->separatism
-seperatist->separatist
-sepina->subpoena
-sepulchure->sepulchre, sepulcher
-sepulcre->sepulchre, sepulcher
-sergent->sergeant
-settelement->settlement
-settlment->settlement
-severeal->several
-severley->severely
-severly->severely
-sevice->service
-shadasloo->shadaloo
-shaddow->shadow
-shadoloo->shadaloo
-shamen->shaman, shamans
-sheat->sheath, sheet, cheat
-sheild->shield
-sherif->sheriff
-shineing->shining
-shiped->shipped
-shiping->shipping
-shopkeeepers->shopkeepers
-shorly->shortly
-shortwhile->short while
-shoudl->should
-shoudln->should, shouldn't
-shouldnt->shouldn't
-shreak->shriek
-shrinked->shrunk
-sicne->since
-sideral->sidereal
-sieze->seize, size
-siezed->seized, sized
-siezing->seizing, sizing
-siezure->seizure
-siezures->seizures
-siginificant->significant
-signficant->significant
-signficiant->significant
-signfies->signifies
-signifantly->significantly
-significently->significantly
-signifigant->significant
-signifigantly->significantly
-signitories->signatories
-signitory->signatory
-similarily->similarly
-similiar->similar
-similiarity->similarity
-similiarly->similarly
-simmilar->similar
-simpley->simply
-simplier->simpler
-simultanous->simultaneous
-simultanously->simultaneously
-sincerley->sincerely
-singsog->singsong
-sinse->sines, since
-Sionist->Zionist
-Sionists->Zionists
-Sixtin->Sistine
-Skagerak->Skagerrak
-skateing->skating
-slaugterhouses->slaughterhouses
-slighly->slightly
-slippy->slippery
-slowy->slowly
-smae->same
-smealting->smelting
-smoe->some
-sneeks->sneaks
-snese->sneeze
-socalism->socialism
-socities->societies
-soem->some
-sofware->software
-sohw->show
-soilders->soldiers
-solatary->solitary
-soley->solely
-soliders->soldiers
-soliliquy->soliloquy
-soluable->soluble
-somene->someone
-somtimes->sometimes
-somwhere->somewhere
-sophicated->sophisticated
-sophmore->sophomore
-sorceror->sorcerer
-sorrounding->surrounding
-sotry->story
-sotyr->satyr, story
-soudn->sound
-soudns->sounds
-sould->could, should, sold, soul
-sountrack->soundtrack
-sourth->south
-sourthern->southern
-souvenier->souvenir
-souveniers->souvenirs
-soveits->soviets
-sovereignity->sovereignty
-soverign->sovereign
-soverignity->sovereignty
-soverignty->sovereignty
-spainish->Spanish
-speach->speech
-specfic->specific
-speciallized->specialised, specialized
-specif->specific, specify
-specifiying->specifying
-speciman->specimen
-spectauclar->spectacular
-spectaulars->spectaculars
-spects->aspects, expects
-spectum->spectrum
-speices->species
-spendour->splendour
-spermatozoan->spermatozoon
-spoace->space
-sponser->sponsor
-sponsered->sponsored
-spontanous->spontaneous
-sponzored->sponsored
-spoonfulls->spoonfuls
-sppeches->speeches
-spreaded->spread
-sprech->speech
-spred->spread
-spriritual->spiritual
-spritual->spiritual
-sqaure->square
-stablility->stability
-stainlees->stainless
-staion->station
-standars->standards
-stange->strange
-startegic->strategic
-startegies->strategies
-startegy->strategy
-stateman->statesman
-statememts->statements
-statment->statement
-steriods->steroids
-sterotypes->stereotypes
-stilus->stylus
-stingent->stringent
-stiring->stirring
-stirrs->stirs
-stlye->style
-stomache->stomach
-stong->strong
-stopry->story
-storeis->stories
-storise->stories
-stornegst->strongest
-stoyr->story
-stpo->stop
-stradegies->strategies
-stradegy->strategy
-strat->start, strata
-stratagically->strategically
-streemlining->streamlining
-stregth->strength
-strenghen->strengthen
-strenghened->strengthened
-strenghening->strengthening
-strenght->strength
-strenghten->strengthen
-strenghtened->strengthened
-strenghtening->strengthening
-strengtened->strengthened
-strenous->strenuous
-strictist->strictest
-strikely->strikingly
-strnad->strand
-stroy->story, destroy
-structual->structural
-stubborness->stubbornness
-stucture->structure
-stuctured->structured
-studdy->study
-studing->studying
-stuggling->struggling
-sturcture->structure
-subcatagories->subcategories
-subcatagory->subcategory
-subconsiously->subconsciously
-subjudgation->subjugation
-submachne->submachine
-subpecies->subspecies
-subsidary->subsidiary
-subsiduary->subsidiary
-subsquent->subsequent
-subsquently->subsequently
-substace->substance
-substancial->substantial
-substatial->substantial
-substituded->substituted
-substract->subtract
-substracted->subtracted
-substracting->subtracting
-substraction->subtraction
-substracts->subtracts
-subtances->substances
-subterranian->subterranean
-suburburban->suburban
-succceeded->succeeded
-succcesses->successes
-succedded->succeeded
-succeded->succeeded
-succeds->succeeds
-succesful->successful
-succesfully->successfully
-succesfuly->successfully
-succesion->succession
-succesive->successive
-successfull->successful
-successully->successfully
-succsess->success
-succsessfull->successful
-suceed->succeed
-suceeded->succeeded
-suceeding->succeeding
-suceeds->succeeds
-sucesful->successful
-sucesfully->successfully
-sucesfuly->successfully
-sucesion->succession
-sucess->success
-sucesses->successes
-sucessful->successful
-sucessfull->successful
-sucessfully->successfully
-sucessfuly->successfully
-sucession->succession
-sucessive->successive
-sucessor->successor
-sucessot->successor
-sucide->suicide
-sucidial->suicidal
-sufferage->suffrage
-sufferred->suffered
-sufferring->suffering
-sufficent->sufficient
-sufficently->sufficiently
-sumary->summary
-sunglases->sunglasses
-suop->soup
-superceeded->superseded
-superintendant->superintendent
-suphisticated->sophisticated
-suplimented->supplemented
-supose->suppose
-suposed->supposed
-suposedly->supposedly
-suposes->supposes
-suposing->supposing
-supplamented->supplemented
-suppliementing->supplementing
-suppoed->supposed
-supposingly->supposedly
-suppy->supply
-supress->suppress
-supressed->suppressed
-supresses->suppresses
-supressing->suppressing
-suprise->surprise
-suprised->surprised
-suprising->surprising
-suprisingly->surprisingly
-suprize->surprise
-suprized->surprised
-suprizing->surprising
-suprizingly->surprisingly
-surfce->surface
-surley->surly, surely
-suround->surround
-surounded->surrounded
-surounding->surrounding
-suroundings->surroundings
-surounds->surrounds
-surplanted->supplanted
-surpress->suppress
-surpressed->suppressed
-surprize->surprise
-surprized->surprised
-surprizing->surprising
-surprizingly->surprisingly
-surrended->surrounded, surrendered
-surrepetitious->surreptitious
-surrepetitiously->surreptitiously
-surreptious->surreptitious
-surreptiously->surreptitiously
-surronded->surrounded
-surrouded->surrounded
-surrouding->surrounding
-surrundering->surrendering
-surveilence->surveillance
-surveill->surveil
-surveyer->surveyor
-surviver->survivor
-survivers->survivors
-survivied->survived
-suseptable->susceptible
-suseptible->susceptible
-suspention->suspension
-swaer->swear
-swaers->swears
-swepth->swept
-swiming->swimming
-syas->says
-symetrical->symmetrical
-symetrically->symmetrically
-symetry->symmetry
-symettric->symmetric
-symmetral->symmetric
-symmetricaly->symmetrically
-synagouge->synagogue
-syncronization->synchronization
-synonomous->synonymous
-synonymns->synonyms
-synphony->symphony
-syphyllis->syphilis
-sypmtoms->symptoms
-syrap->syrup
-sysmatically->systematically
-sytem->system
-sytle->style
-tabacco->tobacco
-tahn->than
-taht->that
-talekd->talked
-targetted->targeted
-targetting->targeting
-tast->taste
-tath->that
-tattooes->tattoos
-taxanomic->taxonomic
-taxanomy->taxonomy
-teached->taught
-techician->technician
-techicians->technicians
-techiniques->techniques
-technitian->technician
-technnology->technology
-technolgy->technology
-teh->the
-tehy->they
-telelevision->television
-televsion->television
-telphony->telephony
-temerature->temperature
-tempalte->template
-tempaltes->templates
-temparate->temperate
-temperarily->temporarily
-temperment->temperament
-tempertaure->temperature
-temperture->temperature
-temprary->temporary
-tenacle->tentacle
-tenacles->tentacles
-tendacy->tendency
-tendancies->tendencies
-tendancy->tendency
-tennisplayer->tennis player
-tepmorarily->temporarily
-terrestial->terrestrial
-terriories->territories
-terriory->territory
-territorist->terrorist
-territoy->territory
-terroist->terrorist
-testiclular->testicular
-tghe->the
-thast->that, that's
-theather->theater
-theese->these
-theif->thief
-theives->thieves
-themselfs->themselves
-themslves->themselves
-ther->there, their, the
-therafter->thereafter
-therby->thereby
-theri->their
-theyre->they're
-thgat->that
-thge->the
-thier->their
-thign->thing
-thigns->things
-thigsn->things
-thikn->think
-thikning->thinking, thickening
-thikns->thinks
-thiunk->think
-thn->then
-thna->than
-thne->then
-thnig->thing
-thnigs->things
-thoughout->throughout
-threatend->threatened
-threatning->threatening
-threee->three
-threshhold->threshold
-thrid->third
-throrough->thorough
-throughly->thoroughly
-throught->thought, through, throughout
-througout->throughout
-thru->through
-thsi->this
-thsoe->those
-thta->that
-thyat->that
-tiem->time, Tim
-tihkn->think
-tihs->this
-timne->time
-tiome->time, tome
-tje->the
-tjhe->the
-tjpanishad->upanishad
-tkae->take
-tkaes->takes
-tkaing->taking
-tlaking->talking
-tobbaco->tobacco
-todays->today's
-todya->today
-toghether->together
-toke->took
-tolerence->tolerance
-Tolkein->Tolkien
-tomatos->tomatoes
-tommorow->tomorrow
-tommorrow->tomorrow
-tongiht->tonight
-toriodal->toroidal
-tormenters->tormentors
-tornadoe->tornado
-torpeados->torpedoes
-torpedos->torpedoes
-tothe->to the
-toubles->troubles
-tounge->tongue
-tourch->torch, touch
-towords->towards
-towrad->toward
-tradionally->traditionally
-traditionaly->traditionally
-traditionnal->traditional
-traditition->tradition
-tradtionally->traditionally
-trafficed->trafficked
-trafficing->trafficking
-trafic->traffic
-trancendent->transcendent
-trancending->transcending
-tranform->transform
-tranformed->transformed
-transcendance->transcendence
-transcendant->transcendent
-transcendentational->transcendental
-transcripting->transcribing, transcription
-transending->transcending
-transesxuals->transsexuals
-transfered->transferred
-transfering->transferring
-transformaton->transformation
-transistion->transition
-translater->translator
-translaters->translators
-transmissable->transmissible
-transporation->transportation
-tremelo->tremolo
-tremelos->tremolos
-triguered->triggered
-triology->trilogy
-troling->trolling
-troup->troupe
-troups->troupes, troops
-truely->truly
-trustworthyness->trustworthiness
-turnk->turnkey, trunk
-Tuscon->Tucson
-tust->trust
-twelth->twelfth
-twon->town
-twpo->two
-tyhat->that
-tyhe->they
-typcial->typical
-typicaly->typically
-tyranies->tyrannies
-tyrany->tyranny
-tyrranies->tyrannies
-tyrrany->tyranny
-ubiquitious->ubiquitous
-ublisher->publisher
-uise->use
-Ukranian->Ukrainian
-ultimely->ultimately
-unacompanied->unaccompanied
-unahppy->unhappy
-unanymous->unanimous
-unathorised->unauthorised
-unavailible->unavailable
-unballance->unbalance
-unbeknowst->unbeknownst
-unbeleivable->unbelievable
-uncertainity->uncertainty
-unchallengable->unchallengeable
-unchangable->unchangeable
-uncompetive->uncompetitive
-unconcious->unconscious
-unconciousness->unconsciousness
-unconfortability->discomfort
-uncontitutional->unconstitutional
-unconvential->unconventional
-undecideable->undecidable
-understoon->understood
-undesireable->undesirable
-undetecable->undetectable
-undoubtely->undoubtedly
-undreground->underground
-uneccesary->unnecessary
-unecessary->unnecessary
-unequalities->inequalities
-unforetunately->unfortunately
-unforgetable->unforgettable
-unforgiveable->unforgivable
-unfortunatley->unfortunately
-unfortunatly->unfortunately
-unfourtunately->unfortunately
-unihabited->uninhabited
-unilateraly->unilaterally
-unilatreal->unilateral
-unilatreally->unilaterally
-uninterruped->uninterrupted
-uninterupted->uninterrupted
-UnitesStates->UnitedStates
-univeral->universal
-univeristies->universities
-univeristy->university
-univerity->university
-universtiy->university
-univesities->universities
-univesity->university
-unkown->unknown
-unlikey->unlikely
-unmanouverable->unmaneuverable, unmanoeuvrable
-unmistakeably->unmistakably
-unneccesarily->unnecessarily
-unneccesary->unnecessary
-unneccessarily->unnecessarily
-unneccessary->unnecessary
-unnecesarily->unnecessarily
-unnecesary->unnecessary
-unoffical->unofficial
-unoperational->nonoperational
-unoticeable->unnoticeable
-unplease->displease
-unplesant->unpleasant
-unprecendented->unprecedented
-unprecidented->unprecedented
-unrepentent->unrepentant
-unrepetant->unrepentant
-unrepetent->unrepentant
-unsed->used, unused, unsaid
-unsubstanciated->unsubstantiated
-unsuccesful->unsuccessful
-unsuccesfully->unsuccessfully
-unsuccessfull->unsuccessful
-unsucesful->unsuccessful
-unsucesfuly->unsuccessfully
-unsucessful->unsuccessful
-unsucessfull->unsuccessful
-unsucessfully->unsuccessfully
-unsuprised->unsurprised
-unsuprising->unsurprising
-unsuprisingly->unsurprisingly
-unsuprized->unsurprised
-unsuprizing->unsurprising
-unsuprizingly->unsurprisingly
-unsurprized->unsurprised
-unsurprizing->unsurprising
-unsurprizingly->unsurprisingly
-untill->until
-untranslateable->untranslatable
-unuseable->unusable
-unusuable->unusable
-unviersity->university
-unwarrented->unwarranted
-unweildly->unwieldy
-unwieldly->unwieldy
-upcomming->upcoming
-upgradded->upgraded
-upto->up to
-usally->usually
-useage->usage
-usefull->useful
-usefuly->usefully
-useing->using
-usualy->usually
-ususally->usually
-vaccum->vacuum
-vaccume->vacuum
-vacinity->vicinity
-vaguaries->vagaries
-vaieties->varieties
-vailidty->validity
-valetta->valletta
-valuble->valuable
-valueable->valuable
-varations->variations
-varient->variant
-variey->variety
-varing->varying
-varities->varieties
-varity->variety
-vasall->vassal
-vasalls->vassals
-vegatarian->vegetarian
-vegitable->vegetable
-vegitables->vegetables
-vegtable->vegetable
-vehicule->vehicle
-vell->well
-venemous->venomous
-vengance->vengeance
-vengence->vengeance
-verfication->verification
-verison->version
-verisons->versions
-vermillion->vermilion
-versitilaty->versatility
-versitlity->versatility
-vetween->between
-veyr->very
-vigeur->vigueur, vigour, vigor
-vigilence->vigilance
-vigourous->vigorous
-villian->villain
-villification->vilification
-villify->vilify
-villin->villi, villain, villein
-vincinity->vicinity
-violentce->violence
-virtualy->virtually
-virutal->virtual
-virutally->virtually
-visable->visible
-visably->visibly
-visting->visiting
-vistors->visitors
-vitories->victories
-volcanoe->volcano
-voleyball->volleyball
-volontary->voluntary
-volonteer->volunteer
-volonteered->volunteered
-volonteering->volunteering
-volonteers->volunteers
-volounteer->volunteer
-volounteered->volunteered
-volounteering->volunteering
-volounteers->volunteers
-volumne->volume
-vreity->variety
-vrey->very
-vriety->variety
-vulnerablility->vulnerability
-vyer->very
-vyre->very
-waht->what
-wanna->want to
-warantee->warranty
-wardobe->wardrobe
-warrent->warrant
-warrriors->warriors
-wasnt->wasn't
-wass->was
-watn->want
-wayword->wayward
-weaponary->weaponry
-weas->was
-wehn->when
-weild->wield, wild
-weilded->wielded
-wendsay->Wednesday
-wensday->Wednesday
-wereabouts->whereabouts
-whant->want
-whants->wants
-whcih->which
-wheras->whereas
-wherease->whereas
-whereever->wherever
-whic->which
-whihc->which
-whith->with
-whlch->which
-whn->when
-wholey->wholly
-wholy->wholly, holy
-whta->what
-whther->whether
-wich->which, witch
-widesread->widespread
-wief->wife
-wierd->weird
-wiew->view
-wih->with
-wiht->with
-wille->will
-willk->will
-willingless->willingness
-wirting->writing
-withdrawl->withdrawal, withdraw
-witheld->withheld
-withh->with
-withing->within
-withold->withhold
-witht->with
-witn->with
-wiull->will
-wnat->want
-wnated->wanted
-wnats->wants
-wohle->whole
-wokr->work
-wokring->working
-wonderfull->wonderful
-wordlwide->worldwide
-workststion->workstation
-worls->world
-worstened->worsened
-woudl->would
-wresters->wrestlers
-wriet->write
-writen->written
-wroet->wrote
-wrok->work
-wroking->working
-wtih->with
-wupport->support
-xenophoby->xenophobia
-yaching->yachting
-yaer->year
-yaerly->yearly
-yaers->years
-yatch->yacht
-yearm->year
-yeasr->years
-yeild->yield
-yeilding->yielding
-yera->year
-yrea->year
-yeras->years
-yersa->years
-yotube->youtube
-youseff->yousef
-youself->yourself
-ytou->you
-yuo->you
-zeebra->zebra
diff --git a/files/typos/typos-es.txt b/files/typos/typos-es.txt
deleted file mode 100644
index af2bccb..0000000
--- a/files/typos/typos-es.txt
+++ /dev/null
@@ -1,733 +0,0 @@
-# This file contains a number of common Spanish typos:
-andriod->android
-
-# The remainder of this file contains misspellings from
-# http://es.wikipedia.org/wiki/Wikipedia:Lista_de_errores_ortogr%C3%A1ficos_comunes/M%C3%A1quinas
-# plus some post-processing to fix invalid entries, remove duplicates, etc.
-#
-# The content is available under the
-# "Creative Commons Attribution-ShareAlike License"
-# http://creativecommons.org/licenses/by-sa/3.0/
-#
-# THE WORK (AS DEFINED BELOW) IS PROVIDED UNDER THE TERMS OF THIS CREATIVE
-# COMMONS PUBLIC LICENSE ("CCPL" OR "LICENSE"). THE WORK IS PROTECTED BY
-# COPYRIGHT AND/OR OTHER APPLICABLE LAW. ANY USE OF THE WORK OTHER THAN AS
-# AUTHORIZED UNDER THIS LICENSE OR COPYRIGHT LAW IS PROHIBITED.
-#
-# BY EXERCISING ANY RIGHTS TO THE WORK PROVIDED HERE, YOU ACCEPT AND AGREE
-# TO BE BOUND BY THE TERMS OF THIS LICENSE. TO THE EXTENT THIS LICENSE MAY
-# BE CONSIDERED TO BE A CONTRACT, THE LICENSOR GRANTS YOU THE RIGHTS
-# CONTAINED HERE IN CONSIDERATION OF YOUR ACCEPTANCE OF SUCH TERMS AND
-# CONDITIONS.
-#
-# *1. Definitions*
-#
-#  1. *"Adaptation"* means a work based upon the Work, or upon the Work
-#     and other pre-existing works, such as a translation, adaptation,
-#     derivative work, arrangement of music or other alterations of a
-#     literary or artistic work, or phonogram or performance and includes
-#     cinematographic adaptations or any other form in which the Work may
-#     be recast, transformed, or adapted including in any form
-#     recognizably derived from the original, except that a work that
-#     constitutes a Collection will not be considered an Adaptation for
-#     the purpose of this License. For the avoidance of doubt, where the
-#     Work is a musical work, performance or phonogram, the
-#     synchronization of the Work in timed-relation with a moving image
-#     ("synching") will be considered an Adaptation for the purpose of
-#     this License.
-#  2. *"Collection"* means a collection of literary or artistic works,
-#     such as encyclopedias and anthologies, or performances, phonograms
-#     or broadcasts, or other works or subject matter other than works
-#     listed in Section 1(f) below, which, by reason of the selection and
-#     arrangement of their contents, constitute intellectual creations, in
-#     which the Work is included in its entirety in unmodified form along
-#     with one or more other contributions, each constituting separate and
-#     independent works in themselves, which together are assembled into a
-#     collective whole. A work that constitutes a Collection will not be
-#     considered an Adaptation (as defined below) for the purposes of this
-#     License.
-#  3. *"Creative Commons Compatible License"* means a license that is
-#     listed at http://creativecommons.org/compatiblelicenses that has
-#     been approved by Creative Commons as being essentially equivalent to
-#     this License, including, at a minimum, because that license: (i)
-#     contains terms that have the same purpose, meaning and effect as the
-#     License Elements of this License; and, (ii) explicitly permits the
-#     relicensing of adaptations of works made available under that
-#     license under this License or a Creative Commons jurisdiction
-#     license with the same License Elements as this License.
-#  4. *"Distribute"* means to make available to the public the original
-#     and copies of the Work or Adaptation, as appropriate, through sale
-#     or other transfer of ownership.
-#  5. *"License Elements"* means the following high-level license
-#     attributes as selected by Licensor and indicated in the title of
-#     this License: Attribution, ShareAlike.
-#  6. *"Licensor"* means the individual, individuals, entity or entities
-#     that offer(s) the Work under the terms of this License.
-#  7. *"Original Author"* means, in the case of a literary or artistic
-#     work, the individual, individuals, entity or entities who created
-#     the Work or if no individual or entity can be identified, the
-#     publisher; and in addition (i) in the case of a performance the
-#     actors, singers, musicians, dancers, and other persons who act,
-#     sing, deliver, declaim, play in, interpret or otherwise perform
-#     literary or artistic works or expressions of folklore; (ii) in the
-#     case of a phonogram the producer being the person or legal entity
-#     who first fixes the sounds of a performance or other sounds; and,
-#     (iii) in the case of broadcasts, the organization that transmits the
-#     broadcast.
-#  8. *"Work"* means the literary and/or artistic work offered under the
-#     terms of this License including without limitation any production in
-#     the literary, scientific and artistic domain, whatever may be the
-#     mode or form of its expression including digital form, such as a
-#     book, pamphlet and other writing; a lecture, address, sermon or
-#     other work of the same nature; a dramatic or dramatico-musical work;
-#     a choreographic work or entertainment in dumb show; a musical
-#     composition with or without words; a cinematographic work to which
-#     are assimilated works expressed by a process analogous to
-#     cinematography; a work of drawing, painting, architecture,
-#     sculpture, engraving or lithography; a photographic work to which
-#     are assimilated works expressed by a process analogous to
-#     photography; a work of applied art; an illustration, map, plan,
-#     sketch or three-dimensional work relative to geography, topography,
-#     architecture or science; a performance; a broadcast; a phonogram; a
-#     compilation of data to the extent it is protected as a copyrightable
-#     work; or a work performed by a variety or circus performer to the
-#     extent it is not otherwise considered a literary or artistic work.
-#  9. *"You"* means an individual or entity exercising rights under this
-#     License who has not previously violated the terms of this License
-#     with respect to the Work, or who has received express permission
-#     from the Licensor to exercise rights under this License despite a
-#     previous violation.
-# 10. *"Publicly Perform"* means to perform public recitations of the Work
-#     and to communicate to the public those public recitations, by any
-#     means or process, including by wire or wireless means or public
-#     digital performances; to make available to the public Works in such
-#     a way that members of the public may access these Works from a place
-#     and at a place individually chosen by them; to perform the Work to
-#     the public by any means or process and the communication to the
-#     public of the performances of the Work, including by public digital
-#     performance; to broadcast and rebroadcast the Work by any means
-#     including signs, sounds or images.
-# 11. *"Reproduce"* means to make copies of the Work by any means
-#     including without limitation by sound or visual recordings and the
-#     right of fixation and reproducing fixations of the Work, including
-#     storage of a protected performance or phonogram in digital form or
-#     other electronic medium.
-#
-# *2. Fair Dealing Rights.* Nothing in this License is intended to reduce,
-# limit, or restrict any uses free from copyright or rights arising from
-# limitations or exceptions that are provided for in connection with the
-# copyright protection under copyright law or other applicable laws.
-#
-# *3. License Grant.* Subject to the terms and conditions of this License,
-# Licensor hereby grants You a worldwide, royalty-free, non-exclusive,
-# perpetual (for the duration of the applicable copyright) license to
-# exercise the rights in the Work as stated below:
-#
-#  1. to Reproduce the Work, to incorporate the Work into one or more
-#     Collections, and to Reproduce the Work as incorporated in the
-#     Collections;
-#  2. to create and Reproduce Adaptations provided that any such
-#     Adaptation, including any translation in any medium, takes
-#     reasonable steps to clearly label, demarcate or otherwise identify
-#     that changes were made to the original Work. For example, a
-#     translation could be marked "The original work was translated from
-#     English to Spanish," or a modification could indicate "The original
-#     work has been modified.";
-#  3. to Distribute and Publicly Perform the Work including as
-#     incorporated in Collections; and,
-#  4. to Distribute and Publicly Perform Adaptations.
-#  5.
-#
-#     For the avoidance of doubt:
-#
-#      1. *Non-waivable Compulsory License Schemes*. In those
-#         jurisdictions in which the right to collect royalties through
-#         any statutory or compulsory licensing scheme cannot be waived,
-#         the Licensor reserves the exclusive right to collect such
-#         royalties for any exercise by You of the rights granted under
-#         this License;
-#      2. *Waivable Compulsory License Schemes*. In those jurisdictions in
-#         which the right to collect royalties through any statutory or
-#         compulsory licensing scheme can be waived, the Licensor waives
-#         the exclusive right to collect such royalties for any exercise
-#         by You of the rights granted under this License; and,
-#      3. *Voluntary License Schemes*. The Licensor waives the right to
-#         collect royalties, whether individually or, in the event that
-#         the Licensor is a member of a collecting society that
-#         administers voluntary licensing schemes, via that society, from
-#         any exercise by You of the rights granted under this License.
-#
-# The above rights may be exercised in all media and formats whether now
-# known or hereafter devised. The above rights include the right to make
-# such modifications as are technically necessary to exercise the rights
-# in other media and formats. Subject to Section 8(f), all rights not
-# expressly granted by Licensor are hereby reserved.
-#
-# *4. Restrictions.* The license granted in Section 3 above is expressly
-# made subject to and limited by the following restrictions:
-#
-#  1. You may Distribute or Publicly Perform the Work only under the terms
-#     of this License. You must include a copy of, or the Uniform Resource
-#     Identifier (URI) for, this License with every copy of the Work You
-#     Distribute or Publicly Perform. You may not offer or impose any
-#     terms on the Work that restrict the terms of this License or the
-#     ability of the recipient of the Work to exercise the rights granted
-#     to that recipient under the terms of the License. You may not
-#     sublicense the Work. You must keep intact all notices that refer to
-#     this License and to the disclaimer of warranties with every copy of
-#     the Work You Distribute or Publicly Perform. When You Distribute or
-#     Publicly Perform the Work, You may not impose any effective
-#     technological measures on the Work that restrict the ability of a
-#     recipient of the Work from You to exercise the rights granted to
-#     that recipient under the terms of the License. This Section 4(a)
-#     applies to the Work as incorporated in a Collection, but this does
-#     not require the Collection apart from the Work itself to be made
-#     subject to the terms of this License. If You create a Collection,
-#     upon notice from any Licensor You must, to the extent practicable,
-#     remove from the Collection any credit as required by Section 4(c),
-#     as requested. If You create an Adaptation, upon notice from any
-#     Licensor You must, to the extent practicable, remove from the
-#     Adaptation any credit as required by Section 4(c), as requested.
-#  2. You may Distribute or Publicly Perform an Adaptation only under the
-#     terms of: (i) this License; (ii) a later version of this License
-#     with the same License Elements as this License; (iii) a Creative
-#     Commons jurisdiction license (either this or a later license
-#     version) that contains the same License Elements as this License
-#     (e.g., Attribution-ShareAlike 3.0 US)); (iv) a Creative Commons
-#     Compatible License. If you license the Adaptation under one of the
-#     licenses mentioned in (iv), you must comply with the terms of that
-#     license. If you license the Adaptation under the terms of any of the
-#     licenses mentioned in (i), (ii) or (iii) (the "Applicable License"),
-#     you must comply with the terms of the Applicable License generally
-#     and the following provisions: (I) You must include a copy of, or the
-#     URI for, the Applicable License with every copy of each Adaptation
-#     You Distribute or Publicly Perform; (II) You may not offer or impose
-#     any terms on the Adaptation that restrict the terms of the
-#     Applicable License or the ability of the recipient of the Adaptation
-#     to exercise the rights granted to that recipient under the terms of
-#     the Applicable License; (III) You must keep intact all notices that
-#     refer to the Applicable License and to the disclaimer of warranties
-#     with every copy of the Work as included in the Adaptation You
-#     Distribute or Publicly Perform; (IV) when You Distribute or Publicly
-#     Perform the Adaptation, You may not impose any effective
-#     technological measures on the Adaptation that restrict the ability
-#     of a recipient of the Adaptation from You to exercise the rights
-#     granted to that recipient under the terms of the Applicable License.
-#     This Section 4(b) applies to the Adaptation as incorporated in a
-#     Collection, but this does not require the Collection apart from the
-#     Adaptation itself to be made subject to the terms of the Applicable
-#     License.
-#  3. If You Distribute, or Publicly Perform the Work or any Adaptations
-#     or Collections, You must, unless a request has been made pursuant to
-#     Section 4(a), keep intact all copyright notices for the Work and
-#     provide, reasonable to the medium or means You are utilizing: (i)
-#     the name of the Original Author (or pseudonym, if applicable) if
-#     supplied, and/or if the Original Author and/or Licensor designate
-#     another party or parties (e.g., a sponsor institute, publishing
-#     entity, journal) for attribution ("Attribution Parties") in
-#     Licensor's copyright notice, terms of service or by other reasonable
-#     means, the name of such party or parties; (ii) the title of the Work
-#     if supplied; (iii) to the extent reasonably practicable, the URI, if
-#     any, that Licensor specifies to be associated with the Work, unless
-#     such URI does not refer to the copyright notice or licensing
-#     information for the Work; and (iv) , consistent with Ssection 3(b),
-#     in the case of an Adaptation, a credit identifying the use of the
-#     Work in the Adaptation (e.g., "French translation of the Work by
-#     Original Author," or "Screenplay based on original Work by Original
-#     Author"). The credit required by this Section 4(c) may be
-#     implemented in any reasonable manner; provided, however, that in the
-#     case of a Adaptation or Collection, at a minimum such credit will
-#     appear, if a credit for all contributing authors of the Adaptation
-#     or Collection appears, then as part of these credits and in a manner
-#     at least as prominent as the credits for the other contributing
-#     authors. For the avoidance of doubt, You may only use the credit
-#     required by this Section for the purpose of attribution in the
-#     manner set out above and, by exercising Your rights under this
-#     License, You may not implicitly or explicitly assert or imply any
-#     connection with, sponsorship or endorsement by the Original Author,
-#     Licensor and/or Attribution Parties, as appropriate, of You or Your
-#     use of the Work, without the separate, express prior written
-#     permission of the Original Author, Licensor and/or Attribution Parties.
-#  4. Except as otherwise agreed in writing by the Licensor or as may be
-#     otherwise permitted by applicable law, if You Reproduce, Distribute
-#     or Publicly Perform the Work either by itself or as part of any
-#     Adaptations or Collections, You must not distort, mutilate, modify
-#     or take other derogatory action in relation to the Work which would
-#     be prejudicial to the Original Author's honor or reputation.
-#     Licensor agrees that in those jurisdictions (e.g. Japan), in which
-#     any exercise of the right granted in Section 3(b) of this License
-#     (the right to make Adaptations) would be deemed to be a distortion,
-#     mutilation, modification or other derogatory action prejudicial to
-#     the Original Author's honor and reputation, the Licensor will waive
-#     or not assert, as appropriate, this Section, to the fullest extent
-#     permitted by the applicable national law, to enable You to
-#     reasonably exercise Your right under Section 3(b) of this License
-#     (right to make Adaptations) but not otherwise.
-#
-# *5. Representations, Warranties and Disclaimer*
-#
-# UNLESS OTHERWISE MUTUALLY AGREED TO BY THE PARTIES IN WRITING, LICENSOR
-# OFFERS THE WORK AS-IS AND MAKES NO REPRESENTATIONS OR WARRANTIES OF ANY
-# KIND CONCERNING THE WORK, EXPRESS, IMPLIED, STATUTORY OR OTHERWISE,
-# INCLUDING, WITHOUT LIMITATION, WARRANTIES OF TITLE, MERCHANTIBILITY,
-# FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT, OR THE ABSENCE OF
-# LATENT OR OTHER DEFECTS, ACCURACY, OR THE PRESENCE OF ABSENCE OF ERRORS,
-# WHETHER OR NOT DISCOVERABLE. SOME JURISDICTIONS DO NOT ALLOW THE
-# EXCLUSION OF IMPLIED WARRANTIES, SO SUCH EXCLUSION MAY NOT APPLY TO YOU.
-#
-# *6. Limitation on Liability.* EXCEPT TO THE EXTENT REQUIRED BY
-# APPLICABLE LAW, IN NO EVENT WILL LICENSOR BE LIABLE TO YOU ON ANY LEGAL
-# THEORY FOR ANY SPECIAL, INCIDENTAL, CONSEQUENTIAL, PUNITIVE OR EXEMPLARY
-# DAMAGES ARISING OUT OF THIS LICENSE OR THE USE OF THE WORK, EVEN IF
-# LICENSOR HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
-#
-# *7. Termination*
-#
-#  1. This License and the rights granted hereunder will terminate
-#     automatically upon any breach by You of the terms of this License.
-#     Individuals or entities who have received Adaptations or Collections
-#     from You under this License, however, will not have their licenses
-#     terminated provided such individuals or entities remain in full
-#     compliance with those licenses. Sections 1, 2, 5, 6, 7, and 8 will
-#     survive any termination of this License.
-#  2. Subject to the above terms and conditions, the license granted here
-#     is perpetual (for the duration of the applicable copyright in the
-#     Work). Notwithstanding the above, Licensor reserves the right to
-#     release the Work under different license terms or to stop
-#     distributing the Work at any time; provided, however that any such
-#     election will not serve to withdraw this License (or any other
-#     license that has been, or is required to be, granted under the terms
-#     of this License), and this License will continue in full force and
-#     effect unless terminated as stated above.
-#
-# *8. Miscellaneous*
-#
-#  1. Each time You Distribute or Publicly Perform the Work or a
-#     Collection, the Licensor offers to the recipient a license to the
-#     Work on the same terms and conditions as the license granted to You
-#     under this License.
-#  2. Each time You Distribute or Publicly Perform an Adaptation, Licensor
-#     offers to the recipient a license to the original Work on the same
-#     terms and conditions as the license granted to You under this License.
-#  3. If any provision of this License is invalid or unenforceable under
-#     applicable law, it shall not affect the validity or enforceability
-#     of the remainder of the terms of this License, and without further
-#     action by the parties to this agreement, such provision shall be
-#     reformed to the minimum extent necessary to make such provision
-#     valid and enforceable.
-#  4. No term or provision of this License shall be deemed waived and no
-#     breach consented to unless such waiver or consent shall be in
-#     writing and signed by the party to be charged with such waiver or
-#     consent.
-#  5. This License constitutes the entire agreement between the parties
-#     with respect to the Work licensed here. There are no understandings,
-#     agreements or representations with respect to the Work not specified
-#     here. Licensor shall not be bound by any additional provisions that
-#     may appear in any communication from You. This License may not be
-#     modified without the mutual written agreement of the Licensor and You.
-#  6. The rights granted under, and the subject matter referenced, in this
-#     License were drafted utilizing the terminology of the Berne
-#     Convention for the Protection of Literary and Artistic Works (as
-#     amended on September 28, 1979), the Rome Convention of 1961, the
-#     WIPO Copyright Treaty of 1996, the WIPO Performances and Phonograms
-#     Treaty of 1996 and the Universal Copyright Convention (as revised on
-#     July 24, 1971). These rights and subject matter take effect in the
-#     relevant jurisdiction in which the License terms are sought to be
-#     enforced according to the corresponding provisions of the
-#     implementation of those treaty provisions in the applicable national
-#     law. If the standard suite of rights granted under applicable
-#     copyright law includes additional rights not granted under this
-#     License, such additional rights are deemed to be included in the
-#     License; this License is not intended to restrict the license of any
-#     rights under applicable law.
-absorver->absorber
-absorviendo->absorbiendo
-aca->acá
-academica->académica
-academicamente->académicamente
-academico->académico
-accion->acción
-aceptacion->aceptación
-acetado->aceptado
-ademas->además
-administracion->administración
-aerea->aérea
-aereo->aéreo
-aficion->afición
-aficcion->afición
-aficción->afición
-ahi->ahí
-al Cairo->a El Cairo
-album->álbum
-alevin->alevín
-algun->algún
-alli->allí
-alla->allá
-al rededor->alrededor
-aprobechar->aprovechar
-aqui->aquí
-arabe->árabe
-arbol->árbol
-area->área
-articulacion->articulación
-asi->así
-atencion->atención
-atlantico->atlántico
-automovil->automóvil
-avion->avión
-azucar->azúcar
-bibliografia->bibliografía
-bién->bien
-Bogota->Bogotá
-Brasilero->brasileño
-Brasilera->brasileña
-buho->búho
-cadaver->cadáver
-cafe->café
-cafeteria->cafetería
-camaleon->camaleón
-camara->cámara
-cancion->canción
-candadear->candear
-caracter->carácter
-caracteristica->característica
-carroceria->carrocería
-catastrofe->catástrofe
-catastrofica->catastrófica
-catastrofico->catastrófico
-categoria->categoría
-cién->cien
-CD's->CD
-CDs->CD
-cogeran->cogerán
-cogia->cogía
-cogian->cogían
-cojer->coger
-cojen->cogen
-cojerán->cogerán
-cojía->cogía
-cojia->cogía
-cojían->cogían
-cojió->cogió
-companía->compañía
-compañia->compañía
-compasion->compasión
-comun->común
-comunmente->comúnmente
-conección->conexión
-cono urbano->conurbano
-consideracion->consideración
-constituída->constituida
-constituído->constituido
-construído->construido
-construír->construir
-continuan->continúan
-contínuo->continuo
-convirtio->convirtió
-cortesmente->cortésmente
-cronologica->cronológica
-cronologicamente->cronológicamente
-cronologico->cronológico
-da a lugar a->da lugar a
-dar a lugar a->dar lugar a
-daría a lugar a->daría lugar a
-dá->da
-definio->definió
-del Cairo->de El Cairo
-del interfaz->de la interfaz
-delfin->delfín
-desconto->descontó
-desovediente->desobediente
-deshechar->desechar
-deshechando->desechando
-despues->después
-dia->día
-dias->días
-dieciseis->dieciséis
-diéz->diez
-dificil->difícil
-dificilmente->difícilmente
-dio a lugar a->dio lugar a
-dió->dio
-discusion->discusión
-disolucion->disolución
-distorción->distorsión
-distorcionado->distorsionado
-distribuído->distribuido
-duodecimo->duodécimo
-e hielo->y hielo
-e hierro->y hierro
-e iones->y iones
-ebano->ébano
-eclesiastico->eclesiástico
-eclesiasticos->eclesiásticos
-el fue->él fue
-el interfaz->la interfaz
-el Osasuna->Osasuna
-embarcacion->embarcación
-enbarcacion->embarcación
-enbarcación->embarcación
-empezo->empezó
-enlaze->enlace
-eolico->eólico
-equalización->ecualización
-equalizador->ecualizador
-equalizar->ecualizar
-espiritu->espíritu
-estan->están
-estandard->estándar
-estándard->estándar
-etc...->etc.
-etimologia->etimología
-exámen->examen
-examenes->exámenes
-exitar->excitar
-exito->éxito
-exemplo->ejemplo
-explendor->esplendor
-extrangero->extranjero
-estranjero->extranjero
-estrangero->extranjero
-extricta->estricta
-extricto->estricto
-extrictamente->estrictamente
-espia->espía
-esprecion->expresión
-espreción->expresión
-espresion->expresión
-espresión->expresión
-expresion->expresión
-facil->fácil
-facilmente->fácilmente
-fanatica->fanática
-fanaticamente->fanáticamente
-fanatico->fanático
-fé->fe
-ficcion->ficción
-fisica->física
-fluído->fluido
-fricion->fricción
-frición->fricción
-friccion->fricción
-fucion->fusión
-fución->fusión
-fué->fue
-fuí->fui
-funcion->función
-fusion->fusión
-futbol->fútbol
-futil->fútil
-garage->garaje
-guión->guion
-Guipuzcoa->Guipúzcoa
-gustaria->gustaría
-Gutierrez->Gutiérrez
-habia->había
-haiga->haya
-habian->habían
-hechar->echar
-hechado->echado
-herbivoro->herbívoro
-herviboro->herbívoro
-hervíboro->herbívoro
-hervivoro->herbívoro
-hervívoro->herbívoro
-hermita->ermita
-heroe->héroe
-heróica->heroica
-heróico->heroico
-hibridización->hibridación
-hinduísmo->hinduismo
-hinduísta->hinduista
-homogenea->homogénea
-homogeneo->homogéneo
-hormigon->hormigón
-ideologia->ideología
-ideologica->ideológica
-ideologicamente->ideológicamente
-ideologico->ideológico
-imágen->imagen
-imagenes->imágenes
-IMDB->IMDb
-incluído->incluido
-incluír->incluir
-indice->índice
-interface->interfaz
-interperie->intemperie
-inutil->inútil
-invasion->invasión
-israeli->israelí
-israelies->israelíes
-jardin->jardín
-jente->gente
-jóven->joven
-judia->judía
-judias->judías
-judio->judío
-judios->judíos
-Km->km
-km2->km²
-lampara->lámpara
-le hecha->le echa
-leido->leído
-leon->león
-lider->líder
-linea->línea
-lineas->líneas
-linia->línea
-llendo->yendo
-llevada acabo->llevada a cabo
-llevado acabo->llevado a cabo
-llevaron acabo->llevaron a cabo
-llevó acabo->llevó a cabo
-logica->lógica
-logicamente->lógicamente
-logico->lógico
-lo hecha->lo echa
-lonjeva->longeva
-lonjevo->longevo
-mecanica->mecánica
-mecanicamente->mecánicamente
-mecanico->mecánico
-magica->mágica
-magico->mágico
-martir->mártir
-maxima->máxima
-maximo->máximo
-mayoria->mayoría
-mayuscula->mayúscula
-mayusculo->mayúsculo
-metodologia->metodología
-Mexico->México
-míl->mil
-minima->mínima
-minimo->mínimo
-minoria->minoría
-minuscula->minúscula
-minusculo->minúsculo
-mitologia->mitología
-mitologica->mitológica
-mitologico->mitológico
-mitomana->mitómana
-mitomania->mitomanía
-mitomano->mitómano
-monton->montón
-movil->móvil
-murciegalo->murciélago
-murciégalo->murciélago
-murio->murió
-musica->música
-nacio->nació
-nadien->nadie
-ningun->ningún
-oceano->océano
-olimpica->olímpica
-olimpicamente->olímpicamente
-olimpico->olímpico
-operacion->operación
-oraculo->oráculo
-órden->orden
-organica->orgánica
-organico->orgánico
-organo->órgano
-orígen->origen
-origenes->orígenes
-osea->o sea
-oceano pacifico->océano pacífico
-ONG's->ONG
-ONGs-> ONG
-OVNI's->OVNI
-OVNIs->OVNI
-pagina->página
-pais->país
-paparazzis->paparazzi
-participacion->participación
-pasion->pasión
-pelicula->película
-peloton->pelotón
-perfíl->perfil
-persuación->persuasión
-politica->política
-politicamente->políticamente
-politico->político
-por contra-> por el contrario
-practicamente->prácticamente
-prerequisito->prerrequisito
-pre-requisito->prerrequisito
-preveer->prever
-prevencion->prevención
-programacion->programación
-promocion->promoción
-protejer->proteger
-publicamente->públicamente
-quiza->quizá
-quizas->quizás
-rapido->rápido
-rapida->rápida
-regilla->rejilla
-remplazar->reemplazar
-republica->república
-resolucion->resolución
-restaurant->restaurante
-revizado->revisado
-revizar->revisar
-revolucion->revolución
-rocin->rocín
-ruído->ruido
-sacerdotiza->sacerdotisa
-sazon->sazón
-se a->se ha
-séis->seis
-segun->según
-sera->será
-serpentin->serpentín
-sinembargo->sin embargo
-sinfin->sinfín
-slogan->eslogan
-sóla->sola
-sólamente->solamente
-solucion->solución
-stándard->estándar
-subrraya->subraya
-subrrayado->subrayado
-subrrayar->subrayar
-superfície->superficie
-supérflua->superflua
-tagea->tajea
-talvez->tal vez
-tambien->también
-tanbien->también
-tanbién->también
-tecnica->técnica
-tecnicamente->técnicamente
-tecnico->técnico
-tí->ti
-tia->tía
-tio->tío
-tipica->típica
-tipicamente->típicamente
-tipico->típico
-tradució->tradujo,traducción
-traducion->traducción
-tradución->traducción
-traduccion->traducción
-traf->tráf
-tunel->túnel
-ubicacion->ubicación
-ultimamente->últimamente
-ultimo->último
-ultimos->últimos
-un interfaz->una interfaz
-undecimo->undécimo
-unica->única
-unicamente->únicamente
-unico->único
-util->útil
-vease->véase
-veintidos->veintidós
-veintiseis->veintiséis
-veintitres->veintitrés
-vision->visión
-via->vía
-vió->vio
-watios->vatios
diff --git a/files/typos/typos-hu.txt b/files/typos/typos-hu.txt
deleted file mode 100644
index e0586bf..0000000
--- a/files/typos/typos-hu.txt
+++ /dev/null
@@ -1,431 +0,0 @@
-# This file contains a number of common Hungarian typos:
-andriod->android
-
-# The remainder of this file contains misspellings from
-# http://hu.wikipedia.org/wiki/Szerkeszt%C5%91:AntiVandal/Hiba
-# plus some post-processing to fix invalid entries, remove duplicates, etc.
-#
-# The content is available under the
-# "Creative Commons Attribution-ShareAlike License"
-# http://creativecommons.org/licenses/by-sa/3.0/
-#
-# THE WORK (AS DEFINED BELOW) IS PROVIDED UNDER THE TERMS OF THIS CREATIVE
-# COMMONS PUBLIC LICENSE ("CCPL" OR "LICENSE"). THE WORK IS PROTECTED BY
-# COPYRIGHT AND/OR OTHER APPLICABLE LAW. ANY USE OF THE WORK OTHER THAN AS
-# AUTHORIZED UNDER THIS LICENSE OR COPYRIGHT LAW IS PROHIBITED.
-#
-# BY EXERCISING ANY RIGHTS TO THE WORK PROVIDED HERE, YOU ACCEPT AND AGREE
-# TO BE BOUND BY THE TERMS OF THIS LICENSE. TO THE EXTENT THIS LICENSE MAY
-# BE CONSIDERED TO BE A CONTRACT, THE LICENSOR GRANTS YOU THE RIGHTS
-# CONTAINED HERE IN CONSIDERATION OF YOUR ACCEPTANCE OF SUCH TERMS AND
-# CONDITIONS.
-#
-# *1. Definitions*
-#
-#  1. *"Adaptation"* means a work based upon the Work, or upon the Work
-#     and other pre-existing works, such as a translation, adaptation,
-#     derivative work, arrangement of music or other alterations of a
-#     literary or artistic work, or phonogram or performance and includes
-#     cinematographic adaptations or any other form in which the Work may
-#     be recast, transformed, or adapted including in any form
-#     recognizably derived from the original, except that a work that
-#     constitutes a Collection will not be considered an Adaptation for
-#     the purpose of this License. For the avoidance of doubt, where the
-#     Work is a musical work, performance or phonogram, the
-#     synchronization of the Work in timed-relation with a moving image
-#     ("synching") will be considered an Adaptation for the purpose of
-#     this License.
-#  2. *"Collection"* means a collection of literary or artistic works,
-#     such as encyclopedias and anthologies, or performances, phonograms
-#     or broadcasts, or other works or subject matter other than works
-#     listed in Section 1(f) below, which, by reason of the selection and
-#     arrangement of their contents, constitute intellectual creations, in
-#     which the Work is included in its entirety in unmodified form along
-#     with one or more other contributions, each constituting separate and
-#     independent works in themselves, which together are assembled into a
-#     collective whole. A work that constitutes a Collection will not be
-#     considered an Adaptation (as defined below) for the purposes of this
-#     License.
-#  3. *"Creative Commons Compatible License"* means a license that is
-#     listed at http://creativecommons.org/compatiblelicenses that has
-#     been approved by Creative Commons as being essentially equivalent to
-#     this License, including, at a minimum, because that license: (i)
-#     contains terms that have the same purpose, meaning and effect as the
-#     License Elements of this License; and, (ii) explicitly permits the
-#     relicensing of adaptations of works made available under that
-#     license under this License or a Creative Commons jurisdiction
-#     license with the same License Elements as this License.
-#  4. *"Distribute"* means to make available to the public the original
-#     and copies of the Work or Adaptation, as appropriate, through sale
-#     or other transfer of ownership.
-#  5. *"License Elements"* means the following high-level license
-#     attributes as selected by Licensor and indicated in the title of
-#     this License: Attribution, ShareAlike.
-#  6. *"Licensor"* means the individual, individuals, entity or entities
-#     that offer(s) the Work under the terms of this License.
-#  7. *"Original Author"* means, in the case of a literary or artistic
-#     work, the individual, individuals, entity or entities who created
-#     the Work or if no individual or entity can be identified, the
-#     publisher; and in addition (i) in the case of a performance the
-#     actors, singers, musicians, dancers, and other persons who act,
-#     sing, deliver, declaim, play in, interpret or otherwise perform
-#     literary or artistic works or expressions of folklore; (ii) in the
-#     case of a phonogram the producer being the person or legal entity
-#     who first fixes the sounds of a performance or other sounds; and,
-#     (iii) in the case of broadcasts, the organization that transmits the
-#     broadcast.
-#  8. *"Work"* means the literary and/or artistic work offered under the
-#     terms of this License including without limitation any production in
-#     the literary, scientific and artistic domain, whatever may be the
-#     mode or form of its expression including digital form, such as a
-#     book, pamphlet and other writing; a lecture, address, sermon or
-#     other work of the same nature; a dramatic or dramatico-musical work;
-#     a choreographic work or entertainment in dumb show; a musical
-#     composition with or without words; a cinematographic work to which
-#     are assimilated works expressed by a process analogous to
-#     cinematography; a work of drawing, painting, architecture,
-#     sculpture, engraving or lithography; a photographic work to which
-#     are assimilated works expressed by a process analogous to
-#     photography; a work of applied art; an illustration, map, plan,
-#     sketch or three-dimensional work relative to geography, topography,
-#     architecture or science; a performance; a broadcast; a phonogram; a
-#     compilation of data to the extent it is protected as a copyrightable
-#     work; or a work performed by a variety or circus performer to the
-#     extent it is not otherwise considered a literary or artistic work.
-#  9. *"You"* means an individual or entity exercising rights under this
-#     License who has not previously violated the terms of this License
-#     with respect to the Work, or who has received express permission
-#     from the Licensor to exercise rights under this License despite a
-#     previous violation.
-# 10. *"Publicly Perform"* means to perform public recitations of the Work
-#     and to communicate to the public those public recitations, by any
-#     means or process, including by wire or wireless means or public
-#     digital performances; to make available to the public Works in such
-#     a way that members of the public may access these Works from a place
-#     and at a place individually chosen by them; to perform the Work to
-#     the public by any means or process and the communication to the
-#     public of the performances of the Work, including by public digital
-#     performance; to broadcast and rebroadcast the Work by any means
-#     including signs, sounds or images.
-# 11. *"Reproduce"* means to make copies of the Work by any means
-#     including without limitation by sound or visual recordings and the
-#     right of fixation and reproducing fixations of the Work, including
-#     storage of a protected performance or phonogram in digital form or
-#     other electronic medium.
-#
-# *2. Fair Dealing Rights.* Nothing in this License is intended to reduce,
-# limit, or restrict any uses free from copyright or rights arising from
-# limitations or exceptions that are provided for in connection with the
-# copyright protection under copyright law or other applicable laws.
-#
-# *3. License Grant.* Subject to the terms and conditions of this License,
-# Licensor hereby grants You a worldwide, royalty-free, non-exclusive,
-# perpetual (for the duration of the applicable copyright) license to
-# exercise the rights in the Work as stated below:
-#
-#  1. to Reproduce the Work, to incorporate the Work into one or more
-#     Collections, and to Reproduce the Work as incorporated in the
-#     Collections;
-#  2. to create and Reproduce Adaptations provided that any such
-#     Adaptation, including any translation in any medium, takes
-#     reasonable steps to clearly label, demarcate or otherwise identify
-#     that changes were made to the original Work. For example, a
-#     translation could be marked "The original work was translated from
-#     English to Spanish," or a modification could indicate "The original
-#     work has been modified.";
-#  3. to Distribute and Publicly Perform the Work including as
-#     incorporated in Collections; and,
-#  4. to Distribute and Publicly Perform Adaptations.
-#  5.
-#
-#     For the avoidance of doubt:
-#
-#      1. *Non-waivable Compulsory License Schemes*. In those
-#         jurisdictions in which the right to collect royalties through
-#         any statutory or compulsory licensing scheme cannot be waived,
-#         the Licensor reserves the exclusive right to collect such
-#         royalties for any exercise by You of the rights granted under
-#         this License;
-#      2. *Waivable Compulsory License Schemes*. In those jurisdictions in
-#         which the right to collect royalties through any statutory or
-#         compulsory licensing scheme can be waived, the Licensor waives
-#         the exclusive right to collect such royalties for any exercise
-#         by You of the rights granted under this License; and,
-#      3. *Voluntary License Schemes*. The Licensor waives the right to
-#         collect royalties, whether individually or, in the event that
-#         the Licensor is a member of a collecting society that
-#         administers voluntary licensing schemes, via that society, from
-#         any exercise by You of the rights granted under this License.
-#
-# The above rights may be exercised in all media and formats whether now
-# known or hereafter devised. The above rights include the right to make
-# such modifications as are technically necessary to exercise the rights
-# in other media and formats. Subject to Section 8(f), all rights not
-# expressly granted by Licensor are hereby reserved.
-#
-# *4. Restrictions.* The license granted in Section 3 above is expressly
-# made subject to and limited by the following restrictions:
-#
-#  1. You may Distribute or Publicly Perform the Work only under the terms
-#     of this License. You must include a copy of, or the Uniform Resource
-#     Identifier (URI) for, this License with every copy of the Work You
-#     Distribute or Publicly Perform. You may not offer or impose any
-#     terms on the Work that restrict the terms of this License or the
-#     ability of the recipient of the Work to exercise the rights granted
-#     to that recipient under the terms of the License. You may not
-#     sublicense the Work. You must keep intact all notices that refer to
-#     this License and to the disclaimer of warranties with every copy of
-#     the Work You Distribute or Publicly Perform. When You Distribute or
-#     Publicly Perform the Work, You may not impose any effective
-#     technological measures on the Work that restrict the ability of a
-#     recipient of the Work from You to exercise the rights granted to
-#     that recipient under the terms of the License. This Section 4(a)
-#     applies to the Work as incorporated in a Collection, but this does
-#     not require the Collection apart from the Work itself to be made
-#     subject to the terms of this License. If You create a Collection,
-#     upon notice from any Licensor You must, to the extent practicable,
-#     remove from the Collection any credit as required by Section 4(c),
-#     as requested. If You create an Adaptation, upon notice from any
-#     Licensor You must, to the extent practicable, remove from the
-#     Adaptation any credit as required by Section 4(c), as requested.
-#  2. You may Distribute or Publicly Perform an Adaptation only under the
-#     terms of: (i) this License; (ii) a later version of this License
-#     with the same License Elements as this License; (iii) a Creative
-#     Commons jurisdiction license (either this or a later license
-#     version) that contains the same License Elements as this License
-#     (e.g., Attribution-ShareAlike 3.0 US)); (iv) a Creative Commons
-#     Compatible License. If you license the Adaptation under one of the
-#     licenses mentioned in (iv), you must comply with the terms of that
-#     license. If you license the Adaptation under the terms of any of the
-#     licenses mentioned in (i), (ii) or (iii) (the "Applicable License"),
-#     you must comply with the terms of the Applicable License generally
-#     and the following provisions: (I) You must include a copy of, or the
-#     URI for, the Applicable License with every copy of each Adaptation
-#     You Distribute or Publicly Perform; (II) You may not offer or impose
-#     any terms on the Adaptation that restrict the terms of the
-#     Applicable License or the ability of the recipient of the Adaptation
-#     to exercise the rights granted to that recipient under the terms of
-#     the Applicable License; (III) You must keep intact all notices that
-#     refer to the Applicable License and to the disclaimer of warranties
-#     with every copy of the Work as included in the Adaptation You
-#     Distribute or Publicly Perform; (IV) when You Distribute or Publicly
-#     Perform the Adaptation, You may not impose any effective
-#     technological measures on the Adaptation that restrict the ability
-#     of a recipient of the Adaptation from You to exercise the rights
-#     granted to that recipient under the terms of the Applicable License.
-#     This Section 4(b) applies to the Adaptation as incorporated in a
-#     Collection, but this does not require the Collection apart from the
-#     Adaptation itself to be made subject to the terms of the Applicable
-#     License.
-#  3. If You Distribute, or Publicly Perform the Work or any Adaptations
-#     or Collections, You must, unless a request has been made pursuant to
-#     Section 4(a), keep intact all copyright notices for the Work and
-#     provide, reasonable to the medium or means You are utilizing: (i)
-#     the name of the Original Author (or pseudonym, if applicable) if
-#     supplied, and/or if the Original Author and/or Licensor designate
-#     another party or parties (e.g., a sponsor institute, publishing
-#     entity, journal) for attribution ("Attribution Parties") in
-#     Licensor's copyright notice, terms of service or by other reasonable
-#     means, the name of such party or parties; (ii) the title of the Work
-#     if supplied; (iii) to the extent reasonably practicable, the URI, if
-#     any, that Licensor specifies to be associated with the Work, unless
-#     such URI does not refer to the copyright notice or licensing
-#     information for the Work; and (iv) , consistent with Ssection 3(b),
-#     in the case of an Adaptation, a credit identifying the use of the
-#     Work in the Adaptation (e.g., "French translation of the Work by
-#     Original Author," or "Screenplay based on original Work by Original
-#     Author"). The credit required by this Section 4(c) may be
-#     implemented in any reasonable manner; provided, however, that in the
-#     case of a Adaptation or Collection, at a minimum such credit will
-#     appear, if a credit for all contributing authors of the Adaptation
-#     or Collection appears, then as part of these credits and in a manner
-#     at least as prominent as the credits for the other contributing
-#     authors. For the avoidance of doubt, You may only use the credit
-#     required by this Section for the purpose of attribution in the
-#     manner set out above and, by exercising Your rights under this
-#     License, You may not implicitly or explicitly assert or imply any
-#     connection with, sponsorship or endorsement by the Original Author,
-#     Licensor and/or Attribution Parties, as appropriate, of You or Your
-#     use of the Work, without the separate, express prior written
-#     permission of the Original Author, Licensor and/or Attribution Parties.
-#  4. Except as otherwise agreed in writing by the Licensor or as may be
-#     otherwise permitted by applicable law, if You Reproduce, Distribute
-#     or Publicly Perform the Work either by itself or as part of any
-#     Adaptations or Collections, You must not distort, mutilate, modify
-#     or take other derogatory action in relation to the Work which would
-#     be prejudicial to the Original Author's honor or reputation.
-#     Licensor agrees that in those jurisdictions (e.g. Japan), in which
-#     any exercise of the right granted in Section 3(b) of this License
-#     (the right to make Adaptations) would be deemed to be a distortion,
-#     mutilation, modification or other derogatory action prejudicial to
-#     the Original Author's honor and reputation, the Licensor will waive
-#     or not assert, as appropriate, this Section, to the fullest extent
-#     permitted by the applicable national law, to enable You to
-#     reasonably exercise Your right under Section 3(b) of this License
-#     (right to make Adaptations) but not otherwise.
-#
-# *5. Representations, Warranties and Disclaimer*
-#
-# UNLESS OTHERWISE MUTUALLY AGREED TO BY THE PARTIES IN WRITING, LICENSOR
-# OFFERS THE WORK AS-IS AND MAKES NO REPRESENTATIONS OR WARRANTIES OF ANY
-# KIND CONCERNING THE WORK, EXPRESS, IMPLIED, STATUTORY OR OTHERWISE,
-# INCLUDING, WITHOUT LIMITATION, WARRANTIES OF TITLE, MERCHANTIBILITY,
-# FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT, OR THE ABSENCE OF
-# LATENT OR OTHER DEFECTS, ACCURACY, OR THE PRESENCE OF ABSENCE OF ERRORS,
-# WHETHER OR NOT DISCOVERABLE. SOME JURISDICTIONS DO NOT ALLOW THE
-# EXCLUSION OF IMPLIED WARRANTIES, SO SUCH EXCLUSION MAY NOT APPLY TO YOU.
-#
-# *6. Limitation on Liability.* EXCEPT TO THE EXTENT REQUIRED BY
-# APPLICABLE LAW, IN NO EVENT WILL LICENSOR BE LIABLE TO YOU ON ANY LEGAL
-# THEORY FOR ANY SPECIAL, INCIDENTAL, CONSEQUENTIAL, PUNITIVE OR EXEMPLARY
-# DAMAGES ARISING OUT OF THIS LICENSE OR THE USE OF THE WORK, EVEN IF
-# LICENSOR HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
-#
-# *7. Termination*
-#
-#  1. This License and the rights granted hereunder will terminate
-#     automatically upon any breach by You of the terms of this License.
-#     Individuals or entities who have received Adaptations or Collections
-#     from You under this License, however, will not have their licenses
-#     terminated provided such individuals or entities remain in full
-#     compliance with those licenses. Sections 1, 2, 5, 6, 7, and 8 will
-#     survive any termination of this License.
-#  2. Subject to the above terms and conditions, the license granted here
-#     is perpetual (for the duration of the applicable copyright in the
-#     Work). Notwithstanding the above, Licensor reserves the right to
-#     release the Work under different license terms or to stop
-#     distributing the Work at any time; provided, however that any such
-#     election will not serve to withdraw this License (or any other
-#     license that has been, or is required to be, granted under the terms
-#     of this License), and this License will continue in full force and
-#     effect unless terminated as stated above.
-#
-# *8. Miscellaneous*
-#
-#  1. Each time You Distribute or Publicly Perform the Work or a
-#     Collection, the Licensor offers to the recipient a license to the
-#     Work on the same terms and conditions as the license granted to You
-#     under this License.
-#  2. Each time You Distribute or Publicly Perform an Adaptation, Licensor
-#     offers to the recipient a license to the original Work on the same
-#     terms and conditions as the license granted to You under this License.
-#  3. If any provision of this License is invalid or unenforceable under
-#     applicable law, it shall not affect the validity or enforceability
-#     of the remainder of the terms of this License, and without further
-#     action by the parties to this agreement, such provision shall be
-#     reformed to the minimum extent necessary to make such provision
-#     valid and enforceable.
-#  4. No term or provision of this License shall be deemed waived and no
-#     breach consented to unless such waiver or consent shall be in
-#     writing and signed by the party to be charged with such waiver or
-#     consent.
-#  5. This License constitutes the entire agreement between the parties
-#     with respect to the Work licensed here. There are no understandings,
-#     agreements or representations with respect to the Work not specified
-#     here. Licensor shall not be bound by any additional provisions that
-#     may appear in any communication from You. This License may not be
-#     modified without the mutual written agreement of the Licensor and You.
-#  6. The rights granted under, and the subject matter referenced, in this
-#     License were drafted utilizing the terminology of the Berne
-#     Convention for the Protection of Literary and Artistic Works (as
-#     amended on September 28, 1979), the Rome Convention of 1961, the
-#     WIPO Copyright Treaty of 1996, the WIPO Performances and Phonograms
-#     Treaty of 1996 and the Universal Copyright Convention (as revised on
-#     July 24, 1971). These rights and subject matter take effect in the
-#     relevant jurisdiction in which the License terms are sought to be
-#     enforced according to the corresponding provisions of the
-#     implementation of those treaty provisions in the applicable national
-#     law. If the standard suite of rights granted under applicable
-#     copyright law includes additional rights not granted under this
-#     License, such additional rights are deemed to be included in the
-#     License; this License is not intended to restrict the license of any
-#     rights under applicable law.
-0-át->0-t
-1.-én->1-jén
-10.-én->10-én
-11.-én->11-én
-12.-én->12-én
-13.-án->13-án
-14.-én->14-én
-15.-én->15-én
-16.-án->16-án
-17.-én->17-én
-18.-án->18-án
-19.-én->19-én
-1-e->1-je
-1-el->1-gyel
-1-én->1-jén
-2.-án->2-án
-20.-án->20-án
-21.-én->21-én
-22.-én->22-én
-23.-án->23-án
-24.-én->24-én
-25.-én->25-én
-26.-án->26-án
-27.-én->27-én
-28.-án->28-án
-29.-én->29-én
-2-őt->2-t
-3.-án->3-án
-30.-án->30-án
-31.-én->31-én
-4.-én->4-én
-5.-én->5-én
-6.-án->6-án
-7.-én->7-én
-8.-án->8-án
-9.-én->9-én
-abszolut->abszolút
-ambíciózus->ambiciózus
-asszimetrikus->aszimmetrikus
-árú->áru
-azomban->azonban
-bejjebb->beljebb
-bisztos->biztos
-brilliáns->briliáns
-cimke->címke
-dícséret->dicséret
-egyenlőre->egyelőre
-egyértelmüsítő->egyértelműsítő
-eggyütt->együtt
-elipszis->ellipszis
-follyon->folyjon
-hektóliter->hektoliter
-hellénista->hellenista
-hellénisztikus->hellenisztikus
-hellénizmus->hellenizmus
-Horatiussal->Horatiusszal
-igéret->ígéret
-irígy->irigy
-kálcium->kalcium
-kellet->kellett
-keveseb->kevesebb
-kilóméter->kilométer
-kisseb->kisebb
-kissebb->kisebb
-konkurrencia->konkurencia
-konkurrens->konkurens
-könnyeb->könnyebb
-könyebb->könnyebb
-kultura->kultúra
-kultúrális->kulturális
-külömbség->különbség
-külömböző->különböző
-legjob->legjobb
-legkeveseb->legkevesebb
-legnagyob->legnagyobb
-lessz->lesz
-mellet->mellett
-mindíg->mindig
-muszály->muszáj
-new yorki->New York-i
-orzság->ország
-önnálló->önálló
-raffinált->rafinált
-szinvonal->színvonal
-Szovjetúnió->Szovjetunió
-Torino-i->torinói
-únió->unió
-vákum->vákuum
-Vietnám->Vietnam
diff --git a/files/typos/typos-it.txt b/files/typos/typos-it.txt
deleted file mode 100644
index 5c2d496..0000000
--- a/files/typos/typos-it.txt
+++ /dev/null
@@ -1,665 +0,0 @@
-# This file contains a number of common Italian typos:
-andriod->android
-
-# The remainder of this file contains misspellings from
-# http://it.m.wikipedia.org/wiki/Utente:Senpai/Lista_degli_errori_comuni/Formato_macchina
-# plus some post-processing to fix invalid entries, remove duplicates, etc.
-#
-# The content is available under the
-# "Creative Commons Attribution-ShareAlike License"
-# http://creativecommons.org/licenses/by-sa/3.0/
-#
-# THE WORK (AS DEFINED BELOW) IS PROVIDED UNDER THE TERMS OF THIS CREATIVE
-# COMMONS PUBLIC LICENSE ("CCPL" OR "LICENSE"). THE WORK IS PROTECTED BY
-# COPYRIGHT AND/OR OTHER APPLICABLE LAW. ANY USE OF THE WORK OTHER THAN AS
-# AUTHORIZED UNDER THIS LICENSE OR COPYRIGHT LAW IS PROHIBITED.
-#
-# BY EXERCISING ANY RIGHTS TO THE WORK PROVIDED HERE, YOU ACCEPT AND AGREE
-# TO BE BOUND BY THE TERMS OF THIS LICENSE. TO THE EXTENT THIS LICENSE MAY
-# BE CONSIDERED TO BE A CONTRACT, THE LICENSOR GRANTS YOU THE RIGHTS
-# CONTAINED HERE IN CONSIDERATION OF YOUR ACCEPTANCE OF SUCH TERMS AND
-# CONDITIONS.
-#
-# *1. Definitions*
-#
-#  1. *"Adaptation"* means a work based upon the Work, or upon the Work
-#     and other pre-existing works, such as a translation, adaptation,
-#     derivative work, arrangement of music or other alterations of a
-#     literary or artistic work, or phonogram or performance and includes
-#     cinematographic adaptations or any other form in which the Work may
-#     be recast, transformed, or adapted including in any form
-#     recognizably derived from the original, except that a work that
-#     constitutes a Collection will not be considered an Adaptation for
-#     the purpose of this License. For the avoidance of doubt, where the
-#     Work is a musical work, performance or phonogram, the
-#     synchronization of the Work in timed-relation with a moving image
-#     ("synching") will be considered an Adaptation for the purpose of
-#     this License.
-#  2. *"Collection"* means a collection of literary or artistic works,
-#     such as encyclopedias and anthologies, or performances, phonograms
-#     or broadcasts, or other works or subject matter other than works
-#     listed in Section 1(f) below, which, by reason of the selection and
-#     arrangement of their contents, constitute intellectual creations, in
-#     which the Work is included in its entirety in unmodified form along
-#     with one or more other contributions, each constituting separate and
-#     independent works in themselves, which together are assembled into a
-#     collective whole. A work that constitutes a Collection will not be
-#     considered an Adaptation (as defined below) for the purposes of this
-#     License.
-#  3. *"Creative Commons Compatible License"* means a license that is
-#     listed at http://creativecommons.org/compatiblelicenses that has
-#     been approved by Creative Commons as being essentially equivalent to
-#     this License, including, at a minimum, because that license: (i)
-#     contains terms that have the same purpose, meaning and effect as the
-#     License Elements of this License; and, (ii) explicitly permits the
-#     relicensing of adaptations of works made available under that
-#     license under this License or a Creative Commons jurisdiction
-#     license with the same License Elements as this License.
-#  4. *"Distribute"* means to make available to the public the original
-#     and copies of the Work or Adaptation, as appropriate, through sale
-#     or other transfer of ownership.
-#  5. *"License Elements"* means the following high-level license
-#     attributes as selected by Licensor and indicated in the title of
-#     this License: Attribution, ShareAlike.
-#  6. *"Licensor"* means the individual, individuals, entity or entities
-#     that offer(s) the Work under the terms of this License.
-#  7. *"Original Author"* means, in the case of a literary or artistic
-#     work, the individual, individuals, entity or entities who created
-#     the Work or if no individual or entity can be identified, the
-#     publisher; and in addition (i) in the case of a performance the
-#     actors, singers, musicians, dancers, and other persons who act,
-#     sing, deliver, declaim, play in, interpret or otherwise perform
-#     literary or artistic works or expressions of folklore; (ii) in the
-#     case of a phonogram the producer being the person or legal entity
-#     who first fixes the sounds of a performance or other sounds; and,
-#     (iii) in the case of broadcasts, the organization that transmits the
-#     broadcast.
-#  8. *"Work"* means the literary and/or artistic work offered under the
-#     terms of this License including without limitation any production in
-#     the literary, scientific and artistic domain, whatever may be the
-#     mode or form of its expression including digital form, such as a
-#     book, pamphlet and other writing; a lecture, address, sermon or
-#     other work of the same nature; a dramatic or dramatico-musical work;
-#     a choreographic work or entertainment in dumb show; a musical
-#     composition with or without words; a cinematographic work to which
-#     are assimilated works expressed by a process analogous to
-#     cinematography; a work of drawing, painting, architecture,
-#     sculpture, engraving or lithography; a photographic work to which
-#     are assimilated works expressed by a process analogous to
-#     photography; a work of applied art; an illustration, map, plan,
-#     sketch or three-dimensional work relative to geography, topography,
-#     architecture or science; a performance; a broadcast; a phonogram; a
-#     compilation of data to the extent it is protected as a copyrightable
-#     work; or a work performed by a variety or circus performer to the
-#     extent it is not otherwise considered a literary or artistic work.
-#  9. *"You"* means an individual or entity exercising rights under this
-#     License who has not previously violated the terms of this License
-#     with respect to the Work, or who has received express permission
-#     from the Licensor to exercise rights under this License despite a
-#     previous violation.
-# 10. *"Publicly Perform"* means to perform public recitations of the Work
-#     and to communicate to the public those public recitations, by any
-#     means or process, including by wire or wireless means or public
-#     digital performances; to make available to the public Works in such
-#     a way that members of the public may access these Works from a place
-#     and at a place individually chosen by them; to perform the Work to
-#     the public by any means or process and the communication to the
-#     public of the performances of the Work, including by public digital
-#     performance; to broadcast and rebroadcast the Work by any means
-#     including signs, sounds or images.
-# 11. *"Reproduce"* means to make copies of the Work by any means
-#     including without limitation by sound or visual recordings and the
-#     right of fixation and reproducing fixations of the Work, including
-#     storage of a protected performance or phonogram in digital form or
-#     other electronic medium.
-#
-# *2. Fair Dealing Rights.* Nothing in this License is intended to reduce,
-# limit, or restrict any uses free from copyright or rights arising from
-# limitations or exceptions that are provided for in connection with the
-# copyright protection under copyright law or other applicable laws.
-#
-# *3. License Grant.* Subject to the terms and conditions of this License,
-# Licensor hereby grants You a worldwide, royalty-free, non-exclusive,
-# perpetual (for the duration of the applicable copyright) license to
-# exercise the rights in the Work as stated below:
-#
-#  1. to Reproduce the Work, to incorporate the Work into one or more
-#     Collections, and to Reproduce the Work as incorporated in the
-#     Collections;
-#  2. to create and Reproduce Adaptations provided that any such
-#     Adaptation, including any translation in any medium, takes
-#     reasonable steps to clearly label, demarcate or otherwise identify
-#     that changes were made to the original Work. For example, a
-#     translation could be marked "The original work was translated from
-#     English to Spanish," or a modification could indicate "The original
-#     work has been modified.";
-#  3. to Distribute and Publicly Perform the Work including as
-#     incorporated in Collections; and,
-#  4. to Distribute and Publicly Perform Adaptations.
-#  5.
-#
-#     For the avoidance of doubt:
-#
-#      1. *Non-waivable Compulsory License Schemes*. In those
-#         jurisdictions in which the right to collect royalties through
-#         any statutory or compulsory licensing scheme cannot be waived,
-#         the Licensor reserves the exclusive right to collect such
-#         royalties for any exercise by You of the rights granted under
-#         this License;
-#      2. *Waivable Compulsory License Schemes*. In those jurisdictions in
-#         which the right to collect royalties through any statutory or
-#         compulsory licensing scheme can be waived, the Licensor waives
-#         the exclusive right to collect such royalties for any exercise
-#         by You of the rights granted under this License; and,
-#      3. *Voluntary License Schemes*. The Licensor waives the right to
-#         collect royalties, whether individually or, in the event that
-#         the Licensor is a member of a collecting society that
-#         administers voluntary licensing schemes, via that society, from
-#         any exercise by You of the rights granted under this License.
-#
-# The above rights may be exercised in all media and formats whether now
-# known or hereafter devised. The above rights include the right to make
-# such modifications as are technically necessary to exercise the rights
-# in other media and formats. Subject to Section 8(f), all rights not
-# expressly granted by Licensor are hereby reserved.
-#
-# *4. Restrictions.* The license granted in Section 3 above is expressly
-# made subject to and limited by the following restrictions:
-#
-#  1. You may Distribute or Publicly Perform the Work only under the terms
-#     of this License. You must include a copy of, or the Uniform Resource
-#     Identifier (URI) for, this License with every copy of the Work You
-#     Distribute or Publicly Perform. You may not offer or impose any
-#     terms on the Work that restrict the terms of this License or the
-#     ability of the recipient of the Work to exercise the rights granted
-#     to that recipient under the terms of the License. You may not
-#     sublicense the Work. You must keep intact all notices that refer to
-#     this License and to the disclaimer of warranties with every copy of
-#     the Work You Distribute or Publicly Perform. When You Distribute or
-#     Publicly Perform the Work, You may not impose any effective
-#     technological measures on the Work that restrict the ability of a
-#     recipient of the Work from You to exercise the rights granted to
-#     that recipient under the terms of the License. This Section 4(a)
-#     applies to the Work as incorporated in a Collection, but this does
-#     not require the Collection apart from the Work itself to be made
-#     subject to the terms of this License. If You create a Collection,
-#     upon notice from any Licensor You must, to the extent practicable,
-#     remove from the Collection any credit as required by Section 4(c),
-#     as requested. If You create an Adaptation, upon notice from any
-#     Licensor You must, to the extent practicable, remove from the
-#     Adaptation any credit as required by Section 4(c), as requested.
-#  2. You may Distribute or Publicly Perform an Adaptation only under the
-#     terms of: (i) this License; (ii) a later version of this License
-#     with the same License Elements as this License; (iii) a Creative
-#     Commons jurisdiction license (either this or a later license
-#     version) that contains the same License Elements as this License
-#     (e.g., Attribution-ShareAlike 3.0 US)); (iv) a Creative Commons
-#     Compatible License. If you license the Adaptation under one of the
-#     licenses mentioned in (iv), you must comply with the terms of that
-#     license. If you license the Adaptation under the terms of any of the
-#     licenses mentioned in (i), (ii) or (iii) (the "Applicable License"),
-#     you must comply with the terms of the Applicable License generally
-#     and the following provisions: (I) You must include a copy of, or the
-#     URI for, the Applicable License with every copy of each Adaptation
-#     You Distribute or Publicly Perform; (II) You may not offer or impose
-#     any terms on the Adaptation that restrict the terms of the
-#     Applicable License or the ability of the recipient of the Adaptation
-#     to exercise the rights granted to that recipient under the terms of
-#     the Applicable License; (III) You must keep intact all notices that
-#     refer to the Applicable License and to the disclaimer of warranties
-#     with every copy of the Work as included in the Adaptation You
-#     Distribute or Publicly Perform; (IV) when You Distribute or Publicly
-#     Perform the Adaptation, You may not impose any effective
-#     technological measures on the Adaptation that restrict the ability
-#     of a recipient of the Adaptation from You to exercise the rights
-#     granted to that recipient under the terms of the Applicable License.
-#     This Section 4(b) applies to the Adaptation as incorporated in a
-#     Collection, but this does not require the Collection apart from the
-#     Adaptation itself to be made subject to the terms of the Applicable
-#     License.
-#  3. If You Distribute, or Publicly Perform the Work or any Adaptations
-#     or Collections, You must, unless a request has been made pursuant to
-#     Section 4(a), keep intact all copyright notices for the Work and
-#     provide, reasonable to the medium or means You are utilizing: (i)
-#     the name of the Original Author (or pseudonym, if applicable) if
-#     supplied, and/or if the Original Author and/or Licensor designate
-#     another party or parties (e.g., a sponsor institute, publishing
-#     entity, journal) for attribution ("Attribution Parties") in
-#     Licensor's copyright notice, terms of service or by other reasonable
-#     means, the name of such party or parties; (ii) the title of the Work
-#     if supplied; (iii) to the extent reasonably practicable, the URI, if
-#     any, that Licensor specifies to be associated with the Work, unless
-#     such URI does not refer to the copyright notice or licensing
-#     information for the Work; and (iv) , consistent with Ssection 3(b),
-#     in the case of an Adaptation, a credit identifying the use of the
-#     Work in the Adaptation (e.g., "French translation of the Work by
-#     Original Author," or "Screenplay based on original Work by Original
-#     Author"). The credit required by this Section 4(c) may be
-#     implemented in any reasonable manner; provided, however, that in the
-#     case of a Adaptation or Collection, at a minimum such credit will
-#     appear, if a credit for all contributing authors of the Adaptation
-#     or Collection appears, then as part of these credits and in a manner
-#     at least as prominent as the credits for the other contributing
-#     authors. For the avoidance of doubt, You may only use the credit
-#     required by this Section for the purpose of attribution in the
-#     manner set out above and, by exercising Your rights under this
-#     License, You may not implicitly or explicitly assert or imply any
-#     connection with, sponsorship or endorsement by the Original Author,
-#     Licensor and/or Attribution Parties, as appropriate, of You or Your
-#     use of the Work, without the separate, express prior written
-#     permission of the Original Author, Licensor and/or Attribution Parties.
-#  4. Except as otherwise agreed in writing by the Licensor or as may be
-#     otherwise permitted by applicable law, if You Reproduce, Distribute
-#     or Publicly Perform the Work either by itself or as part of any
-#     Adaptations or Collections, You must not distort, mutilate, modify
-#     or take other derogatory action in relation to the Work which would
-#     be prejudicial to the Original Author's honor or reputation.
-#     Licensor agrees that in those jurisdictions (e.g. Japan), in which
-#     any exercise of the right granted in Section 3(b) of this License
-#     (the right to make Adaptations) would be deemed to be a distortion,
-#     mutilation, modification or other derogatory action prejudicial to
-#     the Original Author's honor and reputation, the Licensor will waive
-#     or not assert, as appropriate, this Section, to the fullest extent
-#     permitted by the applicable national law, to enable You to
-#     reasonably exercise Your right under Section 3(b) of this License
-#     (right to make Adaptations) but not otherwise.
-#
-# *5. Representations, Warranties and Disclaimer*
-#
-# UNLESS OTHERWISE MUTUALLY AGREED TO BY THE PARTIES IN WRITING, LICENSOR
-# OFFERS THE WORK AS-IS AND MAKES NO REPRESENTATIONS OR WARRANTIES OF ANY
-# KIND CONCERNING THE WORK, EXPRESS, IMPLIED, STATUTORY OR OTHERWISE,
-# INCLUDING, WITHOUT LIMITATION, WARRANTIES OF TITLE, MERCHANTIBILITY,
-# FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT, OR THE ABSENCE OF
-# LATENT OR OTHER DEFECTS, ACCURACY, OR THE PRESENCE OF ABSENCE OF ERRORS,
-# WHETHER OR NOT DISCOVERABLE. SOME JURISDICTIONS DO NOT ALLOW THE
-# EXCLUSION OF IMPLIED WARRANTIES, SO SUCH EXCLUSION MAY NOT APPLY TO YOU.
-#
-# *6. Limitation on Liability.* EXCEPT TO THE EXTENT REQUIRED BY
-# APPLICABLE LAW, IN NO EVENT WILL LICENSOR BE LIABLE TO YOU ON ANY LEGAL
-# THEORY FOR ANY SPECIAL, INCIDENTAL, CONSEQUENTIAL, PUNITIVE OR EXEMPLARY
-# DAMAGES ARISING OUT OF THIS LICENSE OR THE USE OF THE WORK, EVEN IF
-# LICENSOR HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
-#
-# *7. Termination*
-#
-#  1. This License and the rights granted hereunder will terminate
-#     automatically upon any breach by You of the terms of this License.
-#     Individuals or entities who have received Adaptations or Collections
-#     from You under this License, however, will not have their licenses
-#     terminated provided such individuals or entities remain in full
-#     compliance with those licenses. Sections 1, 2, 5, 6, 7, and 8 will
-#     survive any termination of this License.
-#  2. Subject to the above terms and conditions, the license granted here
-#     is perpetual (for the duration of the applicable copyright in the
-#     Work). Notwithstanding the above, Licensor reserves the right to
-#     release the Work under different license terms or to stop
-#     distributing the Work at any time; provided, however that any such
-#     election will not serve to withdraw this License (or any other
-#     license that has been, or is required to be, granted under the terms
-#     of this License), and this License will continue in full force and
-#     effect unless terminated as stated above.
-#
-# *8. Miscellaneous*
-#
-#  1. Each time You Distribute or Publicly Perform the Work or a
-#     Collection, the Licensor offers to the recipient a license to the
-#     Work on the same terms and conditions as the license granted to You
-#     under this License.
-#  2. Each time You Distribute or Publicly Perform an Adaptation, Licensor
-#     offers to the recipient a license to the original Work on the same
-#     terms and conditions as the license granted to You under this License.
-#  3. If any provision of this License is invalid or unenforceable under
-#     applicable law, it shall not affect the validity or enforceability
-#     of the remainder of the terms of this License, and without further
-#     action by the parties to this agreement, such provision shall be
-#     reformed to the minimum extent necessary to make such provision
-#     valid and enforceable.
-#  4. No term or provision of this License shall be deemed waived and no
-#     breach consented to unless such waiver or consent shall be in
-#     writing and signed by the party to be charged with such waiver or
-#     consent.
-#  5. This License constitutes the entire agreement between the parties
-#     with respect to the Work licensed here. There are no understandings,
-#     agreements or representations with respect to the Work not specified
-#     here. Licensor shall not be bound by any additional provisions that
-#     may appear in any communication from You. This License may not be
-#     modified without the mutual written agreement of the Licensor and You.
-#  6. The rights granted under, and the subject matter referenced, in this
-#     License were drafted utilizing the terminology of the Berne
-#     Convention for the Protection of Literary and Artistic Works (as
-#     amended on September 28, 1979), the Rome Convention of 1961, the
-#     WIPO Copyright Treaty of 1996, the WIPO Performances and Phonograms
-#     Treaty of 1996 and the Universal Copyright Convention (as revised on
-#     July 24, 1971). These rights and subject matter take effect in the
-#     relevant jurisdiction in which the License terms are sought to be
-#     enforced according to the corresponding provisions of the
-#     implementation of those treaty provisions in the applicable national
-#     law. If the standard suite of rights granted under applicable
-#     copyright law includes additional rights not granted under this
-#     License, such additional rights are deemed to be included in the
-#     License; this License is not intended to restrict the license of any
-#     rights under applicable law.
-accellerare->accelerare
-acellerare->accelerare
-accellerata->accelerata
-accellerato->accelerato
-accellerazione->accelerazione
-aereonautica->aeronautica
-aereoporti->aeroporti
-aereoporto->aeroporto
-aereosilurante->aerosilurante
-aereosiluranti->aerosiluranti
-affianco->a fianco
-affilliate->affiliate
-aggiottaggio->aggiotaggio
-aggresive->aggressive
-agravate->aggravate
-alse->else
-appropiata->appropriata
-appropiate->appropriate
-appropiati->appropriati
-appropiato->appropriato
-approposito->a proposito
-appropraite->appropriate
-appropropiate->appropriate
-approvigionamento->approvvigionamento
-apropriate->appropriate
-areazione->aerazione
-areoporti->aeroporti
-areoporto->aeroporto
-assisnate->assassinate
-assit->assist
-asume->assume
-audeince->audience
-austrailia->Australia
-automibile->automobile
-avvallo->avallo
-backgorund->background
-backrounds->backgrounds
-benchè->benché
-Bernouilli->Bernoulli
-biricchino->birichino
-bizzare->bizzarre
-Buddah->Buddha
-buisness->business
-busness->business
-bussiness->business
-caffé->caffè
-Caltanisetta->Caltanissetta
-Cambrige->Cambridge
-candadate->candidate
-candiate->candidate
-candidiate->candidate
-casette->cassette
-Celcius->Celsius
-Champange->Champagne
-cioé->cioè
-ciriculum->curriculum
-cmoputer->computer
-coctail->cocktail
-coefficente->coefficiente
-coefficenti->coefficienti
-collaberative->collaborative
-collutazione->colluttazione
-commemerative->commemorative
-commemmorate->commemorate
-comparitive->comparative
-competative->competitive
-competive->competitive
-comprimise->compromise
-compropietari->comproprietari
-compropietaria->comproprietaria
-compropietarie->comproprietarie
-compropietario->comproprietario
-Conneticut->Connecticut
-conosciente->conoscente
-conoscienti->conoscenti
-conoscienza->conoscenza
-consectutive->consecutive
-consentrate->concentrate
-conservitive->conservative
-consolodate->consolidate
-contaiminate->contaminate
-contendor->contender
-coputer->computer
-copywrite->copyright
-corelate->correlate
-correzzione->correzione
-coscente->cosciente
-coscenti->coscienti
-coscenza->coscienza
-cosi->così
-cosidetto->cosiddetto
-cumulatative->cumulative
-curch->church
-curriculem->curriculum
-dasse->desse
-decomposit->decompose
-deficente->deficiente
-deficenti->deficienti
-deficenza->deficienza
-definate->definite
-derivitive->derivative
-deside->decide
-desktiop->desktop
-deteriate->deteriorate
-devide->divide
-diminuitive->diminutive
-dispence->dispense
-doesnt->doesn't
-dosen't->doesn't
-drnik->drink
-dupicate->duplicate
-E'->È
-É->È
-etc.->ecc.
-eccezzionale->eccezionale
-eccezzionali->eccezionali
-eccezzione->eccezione
-ect->etc
-eminate->emanate
-enduce->induce
-esle->else
-esterefatto->esterrefatto
-faciliate->facilitate
-facillitate->facilitate
-Farenheit->Fahrenheit
-fianite->finite
-foootball->football
-foucs->focus
-Gameboy->Game Boy
-ganerate->generate
-Ghandi->Gandhi
-gia->già
-gia'->già
-giacchè->giacché
-giaccue->giacque
-grafitti->graffiti
-Guilia->Giulia
-Guilio->Giulio
-Guiness->Guinness
-Guiseppe->Giuseppe
-halp->help
-hapening->happening
-hertzs->hertz
-imcomplete->incomplete
-imense->immense
-immitate->imitate
-inappropiate->inappropriate
-includ->include
-incoscente->incosciente
-incoscenti->incoscienti
-incoscenza->incoscienza
-inctroduce->introduce
-indulgue->indulge
-infilitrate->infiltrate
-infinit->infinite
-ingegniere->ingegnere
-innoquo->innocuo
-inpolite->impolite
-inquanto->in quanto
-insufficente->insufficiente
-insufficenti->insufficienti
-insufficenza->insufficienza
-interm->interim
-interrim->interim
-intutive->intuitive
-investingate->investigate
-iunior->junior
-knwo->know
-konw->know
-kwno->know
-levetate->levitate
-loev->love
-lveo->love
-lvoe->love
-Macchiavelli->Machiavelli
-maggiorparte->maggior parte
-magolia->magnolia
-managment->management
-marketting->marketing
-Massachussets->Massachusetts
-Massachussetts->Massachusetts
-medacine->medicine
-mercentile->mercantile
-messanger->messenger
-metereologia->meteorologia
-metereologico->meteorologico
-Michagan->Michigan
-minature->miniature
-misile->missile
-Misouri->Missouri
-Missisipi->Mississippi
-Missisippi->Mississippi
-missle->missile
-moderm->modem
-modle->model
-Monserrat->Montserrat
-mroe->more
-muscial->musical
-mussulmano->musulmano
-naturual->natural
-Nazereth->Nazareth
-necessiate->necessitate
-nkow->know
-nkwo->know
-noveau->nouveau
-ocuntry->country
-omlette->omelette
-omre->more
-onniscente->onnisciente
-onniscenti->onniscienti
-onoreficenze->onorificenze
-onyl->only
-ovverossia->ovverosia
-pallete->palette
-pantomine->pantomime
-pary->party
-penatly->penalty
-perchè->perché
-perche'->perché
-percui->per cui
-performence->performance
-pero'->però
-perogative->prerogative
-peronospera->peronospora
-piu->più
-piu'->più
-plateu->plateau
-pò->po'
-poiche'->poiché
-poichè->poiché
-preceed->precede
-pressocche'->pressoché
-pressocché->pressoché
-preverse->perverse
-primative->primitive
-privte->private
-proceedure->procedure
-processer->processor
-profesor->professor
-professer->professor
-proffesed->professed
-proffesor->professor
-profiquo->proficuo
-proove->prove
-propietà->proprietà
-propietari->proprietari
-propietaria->proprietaria
-propietarie->proprietarie
-propietario->proprietario
-propio->proprio
-propoganda->propaganda
-propogate->propagate
-prospicente->prospiciente
-prospicenti->prospicienti
-provacative->provocative
-psuedo->pseudo
-Pucini->Puccini
-pursuade->persuade
-pwoer->power
-recrod->record
-redarre->redigere
-refedendum->referendum
-rela->real
-riconosciente->riconoscente
-riconoscienti->riconoscenti
-riconoscienza->riconoscenza
-rocord->record
-rubgy->rugby
-sandwhich->sandwich
-satelite->satellite
-sattelite->satellite
-scandanavia->Scandinavia
-scenza->scienza
-scenze->scienze
-scirpt->script
-se'->sé
-sè->sé
-sensa->senza
-senstive->sensitive
-sensure->censure
-senzo->senso
-smoe->some
-soem->some
-sofware->software
-sohw->show
-sopratutto->soprattutto
-soudn->sound
-speci->specie
-spoace->space
-sponser->sponsor
-staion->station
-stasse->stesse
-stong->strong
-stpo->stop
-strazzio->strazio
-su'->sù
-succesiva->successiva
-succesive->successive
-succesivi->successivi
-succesivo->successivo
-sucessiva->successiva
-sucessive->successive
-sucessivi->successivi
-sucessivo->successivo
-sufficente->sufficiente
-sufficenti->sufficienti
-sufficenza->sufficienza
-sytem->system
-tast->taste
-té->tè
-tghe->the
-timne->time
-tje->the
-tjhe->the
-transare->transigere
-tremelo->tremolo
-troup->troupe
-tust->trust
-vadino->vadano
-valetta->valletta
-ventitrè->ventitré
-vicere->viceré
-zeebra->zebra
diff --git a/files/typos/typos-nb.txt b/files/typos/typos-nb.txt
deleted file mode 100644
index 1043627..0000000
--- a/files/typos/typos-nb.txt
+++ /dev/null
@@ -1,449 +0,0 @@
-# This file contains a number of common Norwegian typos:
-andriod->android
-
-# The remainder of this file contains misspellings from
-# http://no.wikipedia.org/wiki/Wikipedia:Liste_over_alminnelige_stavefeil/Maskinform
-# plus some post-processing to fix invalid entries, remove duplicates, etc.
-#
-# The content is available under the
-# "Creative Commons Attribution-ShareAlike License"
-# http://creativecommons.org/licenses/by-sa/3.0/
-#
-# THE WORK (AS DEFINED BELOW) IS PROVIDED UNDER THE TERMS OF THIS CREATIVE
-# COMMONS PUBLIC LICENSE ("CCPL" OR "LICENSE"). THE WORK IS PROTECTED BY
-# COPYRIGHT AND/OR OTHER APPLICABLE LAW. ANY USE OF THE WORK OTHER THAN AS
-# AUTHORIZED UNDER THIS LICENSE OR COPYRIGHT LAW IS PROHIBITED.
-#
-# BY EXERCISING ANY RIGHTS TO THE WORK PROVIDED HERE, YOU ACCEPT AND AGREE
-# TO BE BOUND BY THE TERMS OF THIS LICENSE. TO THE EXTENT THIS LICENSE MAY
-# BE CONSIDERED TO BE A CONTRACT, THE LICENSOR GRANTS YOU THE RIGHTS
-# CONTAINED HERE IN CONSIDERATION OF YOUR ACCEPTANCE OF SUCH TERMS AND
-# CONDITIONS.
-#
-# *1. Definitions*
-#
-#  1. *"Adaptation"* means a work based upon the Work, or upon the Work
-#     and other pre-existing works, such as a translation, adaptation,
-#     derivative work, arrangement of music or other alterations of a
-#     literary or artistic work, or phonogram or performance and includes
-#     cinematographic adaptations or any other form in which the Work may
-#     be recast, transformed, or adapted including in any form
-#     recognizably derived from the original, except that a work that
-#     constitutes a Collection will not be considered an Adaptation for
-#     the purpose of this License. For the avoidance of doubt, where the
-#     Work is a musical work, performance or phonogram, the
-#     synchronization of the Work in timed-relation with a moving image
-#     ("synching") will be considered an Adaptation for the purpose of
-#     this License.
-#  2. *"Collection"* means a collection of literary or artistic works,
-#     such as encyclopedias and anthologies, or performances, phonograms
-#     or broadcasts, or other works or subject matter other than works
-#     listed in Section 1(f) below, which, by reason of the selection and
-#     arrangement of their contents, constitute intellectual creations, in
-#     which the Work is included in its entirety in unmodified form along
-#     with one or more other contributions, each constituting separate and
-#     independent works in themselves, which together are assembled into a
-#     collective whole. A work that constitutes a Collection will not be
-#     considered an Adaptation (as defined below) for the purposes of this
-#     License.
-#  3. *"Creative Commons Compatible License"* means a license that is
-#     listed at http://creativecommons.org/compatiblelicenses that has
-#     been approved by Creative Commons as being essentially equivalent to
-#     this License, including, at a minimum, because that license: (i)
-#     contains terms that have the same purpose, meaning and effect as the
-#     License Elements of this License; and, (ii) explicitly permits the
-#     relicensing of adaptations of works made available under that
-#     license under this License or a Creative Commons jurisdiction
-#     license with the same License Elements as this License.
-#  4. *"Distribute"* means to make available to the public the original
-#     and copies of the Work or Adaptation, as appropriate, through sale
-#     or other transfer of ownership.
-#  5. *"License Elements"* means the following high-level license
-#     attributes as selected by Licensor and indicated in the title of
-#     this License: Attribution, ShareAlike.
-#  6. *"Licensor"* means the individual, individuals, entity or entities
-#     that offer(s) the Work under the terms of this License.
-#  7. *"Original Author"* means, in the case of a literary or artistic
-#     work, the individual, individuals, entity or entities who created
-#     the Work or if no individual or entity can be identified, the
-#     publisher; and in addition (i) in the case of a performance the
-#     actors, singers, musicians, dancers, and other persons who act,
-#     sing, deliver, declaim, play in, interpret or otherwise perform
-#     literary or artistic works or expressions of folklore; (ii) in the
-#     case of a phonogram the producer being the person or legal entity
-#     who first fixes the sounds of a performance or other sounds; and,
-#     (iii) in the case of broadcasts, the organization that transmits the
-#     broadcast.
-#  8. *"Work"* means the literary and/or artistic work offered under the
-#     terms of this License including without limitation any production in
-#     the literary, scientific and artistic domain, whatever may be the
-#     mode or form of its expression including digital form, such as a
-#     book, pamphlet and other writing; a lecture, address, sermon or
-#     other work of the same nature; a dramatic or dramatico-musical work;
-#     a choreographic work or entertainment in dumb show; a musical
-#     composition with or without words; a cinematographic work to which
-#     are assimilated works expressed by a process analogous to
-#     cinematography; a work of drawing, painting, architecture,
-#     sculpture, engraving or lithography; a photographic work to which
-#     are assimilated works expressed by a process analogous to
-#     photography; a work of applied art; an illustration, map, plan,
-#     sketch or three-dimensional work relative to geography, topography,
-#     architecture or science; a performance; a broadcast; a phonogram; a
-#     compilation of data to the extent it is protected as a copyrightable
-#     work; or a work performed by a variety or circus performer to the
-#     extent it is not otherwise considered a literary or artistic work.
-#  9. *"You"* means an individual or entity exercising rights under this
-#     License who has not previously violated the terms of this License
-#     with respect to the Work, or who has received express permission
-#     from the Licensor to exercise rights under this License despite a
-#     previous violation.
-# 10. *"Publicly Perform"* means to perform public recitations of the Work
-#     and to communicate to the public those public recitations, by any
-#     means or process, including by wire or wireless means or public
-#     digital performances; to make available to the public Works in such
-#     a way that members of the public may access these Works from a place
-#     and at a place individually chosen by them; to perform the Work to
-#     the public by any means or process and the communication to the
-#     public of the performances of the Work, including by public digital
-#     performance; to broadcast and rebroadcast the Work by any means
-#     including signs, sounds or images.
-# 11. *"Reproduce"* means to make copies of the Work by any means
-#     including without limitation by sound or visual recordings and the
-#     right of fixation and reproducing fixations of the Work, including
-#     storage of a protected performance or phonogram in digital form or
-#     other electronic medium.
-#
-# *2. Fair Dealing Rights.* Nothing in this License is intended to reduce,
-# limit, or restrict any uses free from copyright or rights arising from
-# limitations or exceptions that are provided for in connection with the
-# copyright protection under copyright law or other applicable laws.
-#
-# *3. License Grant.* Subject to the terms and conditions of this License,
-# Licensor hereby grants You a worldwide, royalty-free, non-exclusive,
-# perpetual (for the duration of the applicable copyright) license to
-# exercise the rights in the Work as stated below:
-#
-#  1. to Reproduce the Work, to incorporate the Work into one or more
-#     Collections, and to Reproduce the Work as incorporated in the
-#     Collections;
-#  2. to create and Reproduce Adaptations provided that any such
-#     Adaptation, including any translation in any medium, takes
-#     reasonable steps to clearly label, demarcate or otherwise identify
-#     that changes were made to the original Work. For example, a
-#     translation could be marked "The original work was translated from
-#     English to Spanish," or a modification could indicate "The original
-#     work has been modified.";
-#  3. to Distribute and Publicly Perform the Work including as
-#     incorporated in Collections; and,
-#  4. to Distribute and Publicly Perform Adaptations.
-#  5.
-#
-#     For the avoidance of doubt:
-#
-#      1. *Non-waivable Compulsory License Schemes*. In those
-#         jurisdictions in which the right to collect royalties through
-#         any statutory or compulsory licensing scheme cannot be waived,
-#         the Licensor reserves the exclusive right to collect such
-#         royalties for any exercise by You of the rights granted under
-#         this License;
-#      2. *Waivable Compulsory License Schemes*. In those jurisdictions in
-#         which the right to collect royalties through any statutory or
-#         compulsory licensing scheme can be waived, the Licensor waives
-#         the exclusive right to collect such royalties for any exercise
-#         by You of the rights granted under this License; and,
-#      3. *Voluntary License Schemes*. The Licensor waives the right to
-#         collect royalties, whether individually or, in the event that
-#         the Licensor is a member of a collecting society that
-#         administers voluntary licensing schemes, via that society, from
-#         any exercise by You of the rights granted under this License.
-#
-# The above rights may be exercised in all media and formats whether now
-# known or hereafter devised. The above rights include the right to make
-# such modifications as are technically necessary to exercise the rights
-# in other media and formats. Subject to Section 8(f), all rights not
-# expressly granted by Licensor are hereby reserved.
-#
-# *4. Restrictions.* The license granted in Section 3 above is expressly
-# made subject to and limited by the following restrictions:
-#
-#  1. You may Distribute or Publicly Perform the Work only under the terms
-#     of this License. You must include a copy of, or the Uniform Resource
-#     Identifier (URI) for, this License with every copy of the Work You
-#     Distribute or Publicly Perform. You may not offer or impose any
-#     terms on the Work that restrict the terms of this License or the
-#     ability of the recipient of the Work to exercise the rights granted
-#     to that recipient under the terms of the License. You may not
-#     sublicense the Work. You must keep intact all notices that refer to
-#     this License and to the disclaimer of warranties with every copy of
-#     the Work You Distribute or Publicly Perform. When You Distribute or
-#     Publicly Perform the Work, You may not impose any effective
-#     technological measures on the Work that restrict the ability of a
-#     recipient of the Work from You to exercise the rights granted to
-#     that recipient under the terms of the License. This Section 4(a)
-#     applies to the Work as incorporated in a Collection, but this does
-#     not require the Collection apart from the Work itself to be made
-#     subject to the terms of this License. If You create a Collection,
-#     upon notice from any Licensor You must, to the extent practicable,
-#     remove from the Collection any credit as required by Section 4(c),
-#     as requested. If You create an Adaptation, upon notice from any
-#     Licensor You must, to the extent practicable, remove from the
-#     Adaptation any credit as required by Section 4(c), as requested.
-#  2. You may Distribute or Publicly Perform an Adaptation only under the
-#     terms of: (i) this License; (ii) a later version of this License
-#     with the same License Elements as this License; (iii) a Creative
-#     Commons jurisdiction license (either this or a later license
-#     version) that contains the same License Elements as this License
-#     (e.g., Attribution-ShareAlike 3.0 US)); (iv) a Creative Commons
-#     Compatible License. If you license the Adaptation under one of the
-#     licenses mentioned in (iv), you must comply with the terms of that
-#     license. If you license the Adaptation under the terms of any of the
-#     licenses mentioned in (i), (ii) or (iii) (the "Applicable License"),
-#     you must comply with the terms of the Applicable License generally
-#     and the following provisions: (I) You must include a copy of, or the
-#     URI for, the Applicable License with every copy of each Adaptation
-#     You Distribute or Publicly Perform; (II) You may not offer or impose
-#     any terms on the Adaptation that restrict the terms of the
-#     Applicable License or the ability of the recipient of the Adaptation
-#     to exercise the rights granted to that recipient under the terms of
-#     the Applicable License; (III) You must keep intact all notices that
-#     refer to the Applicable License and to the disclaimer of warranties
-#     with every copy of the Work as included in the Adaptation You
-#     Distribute or Publicly Perform; (IV) when You Distribute or Publicly
-#     Perform the Adaptation, You may not impose any effective
-#     technological measures on the Adaptation that restrict the ability
-#     of a recipient of the Adaptation from You to exercise the rights
-#     granted to that recipient under the terms of the Applicable License.
-#     This Section 4(b) applies to the Adaptation as incorporated in a
-#     Collection, but this does not require the Collection apart from the
-#     Adaptation itself to be made subject to the terms of the Applicable
-#     License.
-#  3. If You Distribute, or Publicly Perform the Work or any Adaptations
-#     or Collections, You must, unless a request has been made pursuant to
-#     Section 4(a), keep intact all copyright notices for the Work and
-#     provide, reasonable to the medium or means You are utilizing: (i)
-#     the name of the Original Author (or pseudonym, if applicable) if
-#     supplied, and/or if the Original Author and/or Licensor designate
-#     another party or parties (e.g., a sponsor institute, publishing
-#     entity, journal) for attribution ("Attribution Parties") in
-#     Licensor's copyright notice, terms of service or by other reasonable
-#     means, the name of such party or parties; (ii) the title of the Work
-#     if supplied; (iii) to the extent reasonably practicable, the URI, if
-#     any, that Licensor specifies to be associated with the Work, unless
-#     such URI does not refer to the copyright notice or licensing
-#     information for the Work; and (iv) , consistent with Ssection 3(b),
-#     in the case of an Adaptation, a credit identifying the use of the
-#     Work in the Adaptation (e.g., "French translation of the Work by
-#     Original Author," or "Screenplay based on original Work by Original
-#     Author"). The credit required by this Section 4(c) may be
-#     implemented in any reasonable manner; provided, however, that in the
-#     case of a Adaptation or Collection, at a minimum such credit will
-#     appear, if a credit for all contributing authors of the Adaptation
-#     or Collection appears, then as part of these credits and in a manner
-#     at least as prominent as the credits for the other contributing
-#     authors. For the avoidance of doubt, You may only use the credit
-#     required by this Section for the purpose of attribution in the
-#     manner set out above and, by exercising Your rights under this
-#     License, You may not implicitly or explicitly assert or imply any
-#     connection with, sponsorship or endorsement by the Original Author,
-#     Licensor and/or Attribution Parties, as appropriate, of You or Your
-#     use of the Work, without the separate, express prior written
-#     permission of the Original Author, Licensor and/or Attribution Parties.
-#  4. Except as otherwise agreed in writing by the Licensor or as may be
-#     otherwise permitted by applicable law, if You Reproduce, Distribute
-#     or Publicly Perform the Work either by itself or as part of any
-#     Adaptations or Collections, You must not distort, mutilate, modify
-#     or take other derogatory action in relation to the Work which would
-#     be prejudicial to the Original Author's honor or reputation.
-#     Licensor agrees that in those jurisdictions (e.g. Japan), in which
-#     any exercise of the right granted in Section 3(b) of this License
-#     (the right to make Adaptations) would be deemed to be a distortion,
-#     mutilation, modification or other derogatory action prejudicial to
-#     the Original Author's honor and reputation, the Licensor will waive
-#     or not assert, as appropriate, this Section, to the fullest extent
-#     permitted by the applicable national law, to enable You to
-#     reasonably exercise Your right under Section 3(b) of this License
-#     (right to make Adaptations) but not otherwise.
-#
-# *5. Representations, Warranties and Disclaimer*
-#
-# UNLESS OTHERWISE MUTUALLY AGREED TO BY THE PARTIES IN WRITING, LICENSOR
-# OFFERS THE WORK AS-IS AND MAKES NO REPRESENTATIONS OR WARRANTIES OF ANY
-# KIND CONCERNING THE WORK, EXPRESS, IMPLIED, STATUTORY OR OTHERWISE,
-# INCLUDING, WITHOUT LIMITATION, WARRANTIES OF TITLE, MERCHANTIBILITY,
-# FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT, OR THE ABSENCE OF
-# LATENT OR OTHER DEFECTS, ACCURACY, OR THE PRESENCE OF ABSENCE OF ERRORS,
-# WHETHER OR NOT DISCOVERABLE. SOME JURISDICTIONS DO NOT ALLOW THE
-# EXCLUSION OF IMPLIED WARRANTIES, SO SUCH EXCLUSION MAY NOT APPLY TO YOU.
-#
-# *6. Limitation on Liability.* EXCEPT TO THE EXTENT REQUIRED BY
-# APPLICABLE LAW, IN NO EVENT WILL LICENSOR BE LIABLE TO YOU ON ANY LEGAL
-# THEORY FOR ANY SPECIAL, INCIDENTAL, CONSEQUENTIAL, PUNITIVE OR EXEMPLARY
-# DAMAGES ARISING OUT OF THIS LICENSE OR THE USE OF THE WORK, EVEN IF
-# LICENSOR HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
-#
-# *7. Termination*
-#
-#  1. This License and the rights granted hereunder will terminate
-#     automatically upon any breach by You of the terms of this License.
-#     Individuals or entities who have received Adaptations or Collections
-#     from You under this License, however, will not have their licenses
-#     terminated provided such individuals or entities remain in full
-#     compliance with those licenses. Sections 1, 2, 5, 6, 7, and 8 will
-#     survive any termination of this License.
-#  2. Subject to the above terms and conditions, the license granted here
-#     is perpetual (for the duration of the applicable copyright in the
-#     Work). Notwithstanding the above, Licensor reserves the right to
-#     release the Work under different license terms or to stop
-#     distributing the Work at any time; provided, however that any such
-#     election will not serve to withdraw this License (or any other
-#     license that has been, or is required to be, granted under the terms
-#     of this License), and this License will continue in full force and
-#     effect unless terminated as stated above.
-#
-# *8. Miscellaneous*
-#
-#  1. Each time You Distribute or Publicly Perform the Work or a
-#     Collection, the Licensor offers to the recipient a license to the
-#     Work on the same terms and conditions as the license granted to You
-#     under this License.
-#  2. Each time You Distribute or Publicly Perform an Adaptation, Licensor
-#     offers to the recipient a license to the original Work on the same
-#     terms and conditions as the license granted to You under this License.
-#  3. If any provision of this License is invalid or unenforceable under
-#     applicable law, it shall not affect the validity or enforceability
-#     of the remainder of the terms of this License, and without further
-#     action by the parties to this agreement, such provision shall be
-#     reformed to the minimum extent necessary to make such provision
-#     valid and enforceable.
-#  4. No term or provision of this License shall be deemed waived and no
-#     breach consented to unless such waiver or consent shall be in
-#     writing and signed by the party to be charged with such waiver or
-#     consent.
-#  5. This License constitutes the entire agreement between the parties
-#     with respect to the Work licensed here. There are no understandings,
-#     agreements or representations with respect to the Work not specified
-#     here. Licensor shall not be bound by any additional provisions that
-#     may appear in any communication from You. This License may not be
-#     modified without the mutual written agreement of the Licensor and You.
-#  6. The rights granted under, and the subject matter referenced, in this
-#     License were drafted utilizing the terminology of the Berne
-#     Convention for the Protection of Literary and Artistic Works (as
-#     amended on September 28, 1979), the Rome Convention of 1961, the
-#     WIPO Copyright Treaty of 1996, the WIPO Performances and Phonograms
-#     Treaty of 1996 and the Universal Copyright Convention (as revised on
-#     July 24, 1971). These rights and subject matter take effect in the
-#     relevant jurisdiction in which the License terms are sought to be
-#     enforced according to the corresponding provisions of the
-#     implementation of those treaty provisions in the applicable national
-#     law. If the standard suite of rights granted under applicable
-#     copyright law includes additional rights not granted under this
-#     License, such additional rights are deemed to be included in the
-#     License; this License is not intended to restrict the license of any
-#     rights under applicable law.
-
-abbonement->abonnement
-addresse->adresse
-agresiv->aggressiv
-aggresiv->aggressiv
-agressiv->aggressiv
-aldrig->aldri
-alldri->aldri
-allè->allé
-allminnelig->alminnelig
-alminnlig->alminnelig
-altid->alltid
-annerkjenne->anerkjenne
-apelere->appellere
-apellere->appellere
-appelere->appellere
-apetitt->appetitt
-appetit->appetitt
-artikel->artikkel
-artikkler->artikler
-avlegs->avleggs
-biblotek->bibliotek
-bilett->billett
-blandt->blant
-brylupp->bryllup
-colloseum->colosseum
-desverre->dessverre
-editere->redigere
-ein->en
-eit->et
-fasinerende->fascinerende
-foresten->forresten
-genetiv->genitiv
-gjordt->gjort
-grafitti->graffiti
-hovedsaklig->hovedsakelig
-ikkje->ikke
-iakta->iaktta
-insjiativ->initiativ
-inttiativ->initiativ
-intiativ->initiativ
-inteligent->intelligent
-intligent->intelligent
-innteligent->intelligent
-internett->Internett
-Internet->Internett
-interresant->interessant
-interressant->interessant
-interrese->interesse
-interresse->interesse
-km2->km²
-kakkerlakk->kakerlakk
-kammerat->kamerat
-kammere->kamre
-kanate->kantate
-kansje->kanskje
-karriære->karrière
-kariere->karrière
-kasett->kassett
-komune->kommune
-konstantere->konstatere
-kontigent->kontingent
-konkuranse->konkurranse
-konkurere->konkurrere
-m.o.h.->moh
-Majorstua->Majorstuen
-media->medier
-medlemsskap->medlemskap
-mennsker->mennesker
-metrolog->meteorolog
-metrologi->meteorologi
-Midt-Østen->Midtøsten
-Midt-østen->Midtøsten
-millenium->millennium
-missvisende->misvisende
-morro->moro
-musikker->musiker
-nysjerrig->nysgjerrig
-nyskjerrig->nysgjerrig
-oksyd->oksid
-oksydere->oksidere
-orginal->original
-paralell->parallell
-parallel->parallell
-parantes->parentes
-prevansjon->prevensjon
-risici->risikoer
-risiki->risikoer
-satelitt->satellitt
-simpelten->simpelthen
-sinnsyk->sinnssyk
-skjelden->sjelden
-skriftelig->skriftlig
-slalom->slalåm
-terasse->terrasse
-triologi->trilogi
-tydlig->tydelig
-tunell->tunnel
-tunnell->tunnel
-untatt->unntatt
-usakelig->usaklig
-utdybende->utdypende
-underholdene->underholdende
-vakum->vakuum
-viderekommende->viderekomne
-værre->verre
-værste->verste
diff --git a/files/typos/typos-pt.txt b/files/typos/typos-pt.txt
deleted file mode 100644
index 6285d37..0000000
--- a/files/typos/typos-pt.txt
+++ /dev/null
@@ -1,1647 +0,0 @@
-# This file contains a number of common Portuguese typos:
-andriod->android
-
-# The remainder of this file contains misspellings from
-# http://pt.wikipedia.org/wiki/Wikip%C3%A9dia:Software/Anti-vandal_tool/Ortografia
-# plus some post-processing to fix invalid entries, remove duplicates, etc.
-#
-# The content is available under the
-# "Creative Commons Attribution-ShareAlike License"
-# http://creativecommons.org/licenses/by-sa/3.0/
-#
-# THE WORK (AS DEFINED BELOW) IS PROVIDED UNDER THE TERMS OF THIS CREATIVE
-# COMMONS PUBLIC LICENSE ("CCPL" OR "LICENSE"). THE WORK IS PROTECTED BY
-# COPYRIGHT AND/OR OTHER APPLICABLE LAW. ANY USE OF THE WORK OTHER THAN AS
-# AUTHORIZED UNDER THIS LICENSE OR COPYRIGHT LAW IS PROHIBITED.
-#
-# BY EXERCISING ANY RIGHTS TO THE WORK PROVIDED HERE, YOU ACCEPT AND AGREE
-# TO BE BOUND BY THE TERMS OF THIS LICENSE. TO THE EXTENT THIS LICENSE MAY
-# BE CONSIDERED TO BE A CONTRACT, THE LICENSOR GRANTS YOU THE RIGHTS
-# CONTAINED HERE IN CONSIDERATION OF YOUR ACCEPTANCE OF SUCH TERMS AND
-# CONDITIONS.
-#
-# *1. Definitions*
-#
-#  1. *"Adaptation"* means a work based upon the Work, or upon the Work
-#     and other pre-existing works, such as a translation, adaptation,
-#     derivative work, arrangement of music or other alterations of a
-#     literary or artistic work, or phonogram or performance and includes
-#     cinematographic adaptations or any other form in which the Work may
-#     be recast, transformed, or adapted including in any form
-#     recognizably derived from the original, except that a work that
-#     constitutes a Collection will not be considered an Adaptation for
-#     the purpose of this License. For the avoidance of doubt, where the
-#     Work is a musical work, performance or phonogram, the
-#     synchronization of the Work in timed-relation with a moving image
-#     ("synching") will be considered an Adaptation for the purpose of
-#     this License.
-#  2. *"Collection"* means a collection of literary or artistic works,
-#     such as encyclopedias and anthologies, or performances, phonograms
-#     or broadcasts, or other works or subject matter other than works
-#     listed in Section 1(f) below, which, by reason of the selection and
-#     arrangement of their contents, constitute intellectual creations, in
-#     which the Work is included in its entirety in unmodified form along
-#     with one or more other contributions, each constituting separate and
-#     independent works in themselves, which together are assembled into a
-#     collective whole. A work that constitutes a Collection will not be
-#     considered an Adaptation (as defined below) for the purposes of this
-#     License.
-#  3. *"Creative Commons Compatible License"* means a license that is
-#     listed at http://creativecommons.org/compatiblelicenses that has
-#     been approved by Creative Commons as being essentially equivalent to
-#     this License, including, at a minimum, because that license: (i)
-#     contains terms that have the same purpose, meaning and effect as the
-#     License Elements of this License; and, (ii) explicitly permits the
-#     relicensing of adaptations of works made available under that
-#     license under this License or a Creative Commons jurisdiction
-#     license with the same License Elements as this License.
-#  4. *"Distribute"* means to make available to the public the original
-#     and copies of the Work or Adaptation, as appropriate, through sale
-#     or other transfer of ownership.
-#  5. *"License Elements"* means the following high-level license
-#     attributes as selected by Licensor and indicated in the title of
-#     this License: Attribution, ShareAlike.
-#  6. *"Licensor"* means the individual, individuals, entity or entities
-#     that offer(s) the Work under the terms of this License.
-#  7. *"Original Author"* means, in the case of a literary or artistic
-#     work, the individual, individuals, entity or entities who created
-#     the Work or if no individual or entity can be identified, the
-#     publisher; and in addition (i) in the case of a performance the
-#     actors, singers, musicians, dancers, and other persons who act,
-#     sing, deliver, declaim, play in, interpret or otherwise perform
-#     literary or artistic works or expressions of folklore; (ii) in the
-#     case of a phonogram the producer being the person or legal entity
-#     who first fixes the sounds of a performance or other sounds; and,
-#     (iii) in the case of broadcasts, the organization that transmits the
-#     broadcast.
-#  8. *"Work"* means the literary and/or artistic work offered under the
-#     terms of this License including without limitation any production in
-#     the literary, scientific and artistic domain, whatever may be the
-#     mode or form of its expression including digital form, such as a
-#     book, pamphlet and other writing; a lecture, address, sermon or
-#     other work of the same nature; a dramatic or dramatico-musical work;
-#     a choreographic work or entertainment in dumb show; a musical
-#     composition with or without words; a cinematographic work to which
-#     are assimilated works expressed by a process analogous to
-#     cinematography; a work of drawing, painting, architecture,
-#     sculpture, engraving or lithography; a photographic work to which
-#     are assimilated works expressed by a process analogous to
-#     photography; a work of applied art; an illustration, map, plan,
-#     sketch or three-dimensional work relative to geography, topography,
-#     architecture or science; a performance; a broadcast; a phonogram; a
-#     compilation of data to the extent it is protected as a copyrightable
-#     work; or a work performed by a variety or circus performer to the
-#     extent it is not otherwise considered a literary or artistic work.
-#  9. *"You"* means an individual or entity exercising rights under this
-#     License who has not previously violated the terms of this License
-#     with respect to the Work, or who has received express permission
-#     from the Licensor to exercise rights under this License despite a
-#     previous violation.
-# 10. *"Publicly Perform"* means to perform public recitations of the Work
-#     and to communicate to the public those public recitations, by any
-#     means or process, including by wire or wireless means or public
-#     digital performances; to make available to the public Works in such
-#     a way that members of the public may access these Works from a place
-#     and at a place individually chosen by them; to perform the Work to
-#     the public by any means or process and the communication to the
-#     public of the performances of the Work, including by public digital
-#     performance; to broadcast and rebroadcast the Work by any means
-#     including signs, sounds or images.
-# 11. *"Reproduce"* means to make copies of the Work by any means
-#     including without limitation by sound or visual recordings and the
-#     right of fixation and reproducing fixations of the Work, including
-#     storage of a protected performance or phonogram in digital form or
-#     other electronic medium.
-#
-# *2. Fair Dealing Rights.* Nothing in this License is intended to reduce,
-# limit, or restrict any uses free from copyright or rights arising from
-# limitations or exceptions that are provided for in connection with the
-# copyright protection under copyright law or other applicable laws.
-#
-# *3. License Grant.* Subject to the terms and conditions of this License,
-# Licensor hereby grants You a worldwide, royalty-free, non-exclusive,
-# perpetual (for the duration of the applicable copyright) license to
-# exercise the rights in the Work as stated below:
-#
-#  1. to Reproduce the Work, to incorporate the Work into one or more
-#     Collections, and to Reproduce the Work as incorporated in the
-#     Collections;
-#  2. to create and Reproduce Adaptations provided that any such
-#     Adaptation, including any translation in any medium, takes
-#     reasonable steps to clearly label, demarcate or otherwise identify
-#     that changes were made to the original Work. For example, a
-#     translation could be marked "The original work was translated from
-#     English to Spanish," or a modification could indicate "The original
-#     work has been modified.";
-#  3. to Distribute and Publicly Perform the Work including as
-#     incorporated in Collections; and,
-#  4. to Distribute and Publicly Perform Adaptations.
-#  5.
-#
-#     For the avoidance of doubt:
-#
-#      1. *Non-waivable Compulsory License Schemes*. In those
-#         jurisdictions in which the right to collect royalties through
-#         any statutory or compulsory licensing scheme cannot be waived,
-#         the Licensor reserves the exclusive right to collect such
-#         royalties for any exercise by You of the rights granted under
-#         this License;
-#      2. *Waivable Compulsory License Schemes*. In those jurisdictions in
-#         which the right to collect royalties through any statutory or
-#         compulsory licensing scheme can be waived, the Licensor waives
-#         the exclusive right to collect such royalties for any exercise
-#         by You of the rights granted under this License; and,
-#      3. *Voluntary License Schemes*. The Licensor waives the right to
-#         collect royalties, whether individually or, in the event that
-#         the Licensor is a member of a collecting society that
-#         administers voluntary licensing schemes, via that society, from
-#         any exercise by You of the rights granted under this License.
-#
-# The above rights may be exercised in all media and formats whether now
-# known or hereafter devised. The above rights include the right to make
-# such modifications as are technically necessary to exercise the rights
-# in other media and formats. Subject to Section 8(f), all rights not
-# expressly granted by Licensor are hereby reserved.
-#
-# *4. Restrictions.* The license granted in Section 3 above is expressly
-# made subject to and limited by the following restrictions:
-#
-#  1. You may Distribute or Publicly Perform the Work only under the terms
-#     of this License. You must include a copy of, or the Uniform Resource
-#     Identifier (URI) for, this License with every copy of the Work You
-#     Distribute or Publicly Perform. You may not offer or impose any
-#     terms on the Work that restrict the terms of this License or the
-#     ability of the recipient of the Work to exercise the rights granted
-#     to that recipient under the terms of the License. You may not
-#     sublicense the Work. You must keep intact all notices that refer to
-#     this License and to the disclaimer of warranties with every copy of
-#     the Work You Distribute or Publicly Perform. When You Distribute or
-#     Publicly Perform the Work, You may not impose any effective
-#     technological measures on the Work that restrict the ability of a
-#     recipient of the Work from You to exercise the rights granted to
-#     that recipient under the terms of the License. This Section 4(a)
-#     applies to the Work as incorporated in a Collection, but this does
-#     not require the Collection apart from the Work itself to be made
-#     subject to the terms of this License. If You create a Collection,
-#     upon notice from any Licensor You must, to the extent practicable,
-#     remove from the Collection any credit as required by Section 4(c),
-#     as requested. If You create an Adaptation, upon notice from any
-#     Licensor You must, to the extent practicable, remove from the
-#     Adaptation any credit as required by Section 4(c), as requested.
-#  2. You may Distribute or Publicly Perform an Adaptation only under the
-#     terms of: (i) this License; (ii) a later version of this License
-#     with the same License Elements as this License; (iii) a Creative
-#     Commons jurisdiction license (either this or a later license
-#     version) that contains the same License Elements as this License
-#     (e.g., Attribution-ShareAlike 3.0 US)); (iv) a Creative Commons
-#     Compatible License. If you license the Adaptation under one of the
-#     licenses mentioned in (iv), you must comply with the terms of that
-#     license. If you license the Adaptation under the terms of any of the
-#     licenses mentioned in (i), (ii) or (iii) (the "Applicable License"),
-#     you must comply with the terms of the Applicable License generally
-#     and the following provisions: (I) You must include a copy of, or the
-#     URI for, the Applicable License with every copy of each Adaptation
-#     You Distribute or Publicly Perform; (II) You may not offer or impose
-#     any terms on the Adaptation that restrict the terms of the
-#     Applicable License or the ability of the recipient of the Adaptation
-#     to exercise the rights granted to that recipient under the terms of
-#     the Applicable License; (III) You must keep intact all notices that
-#     refer to the Applicable License and to the disclaimer of warranties
-#     with every copy of the Work as included in the Adaptation You
-#     Distribute or Publicly Perform; (IV) when You Distribute or Publicly
-#     Perform the Adaptation, You may not impose any effective
-#     technological measures on the Adaptation that restrict the ability
-#     of a recipient of the Adaptation from You to exercise the rights
-#     granted to that recipient under the terms of the Applicable License.
-#     This Section 4(b) applies to the Adaptation as incorporated in a
-#     Collection, but this does not require the Collection apart from the
-#     Adaptation itself to be made subject to the terms of the Applicable
-#     License.
-#  3. If You Distribute, or Publicly Perform the Work or any Adaptations
-#     or Collections, You must, unless a request has been made pursuant to
-#     Section 4(a), keep intact all copyright notices for the Work and
-#     provide, reasonable to the medium or means You are utilizing: (i)
-#     the name of the Original Author (or pseudonym, if applicable) if
-#     supplied, and/or if the Original Author and/or Licensor designate
-#     another party or parties (e.g., a sponsor institute, publishing
-#     entity, journal) for attribution ("Attribution Parties") in
-#     Licensor's copyright notice, terms of service or by other reasonable
-#     means, the name of such party or parties; (ii) the title of the Work
-#     if supplied; (iii) to the extent reasonably practicable, the URI, if
-#     any, that Licensor specifies to be associated with the Work, unless
-#     such URI does not refer to the copyright notice or licensing
-#     information for the Work; and (iv) , consistent with Ssection 3(b),
-#     in the case of an Adaptation, a credit identifying the use of the
-#     Work in the Adaptation (e.g., "French translation of the Work by
-#     Original Author," or "Screenplay based on original Work by Original
-#     Author"). The credit required by this Section 4(c) may be
-#     implemented in any reasonable manner; provided, however, that in the
-#     case of a Adaptation or Collection, at a minimum such credit will
-#     appear, if a credit for all contributing authors of the Adaptation
-#     or Collection appears, then as part of these credits and in a manner
-#     at least as prominent as the credits for the other contributing
-#     authors. For the avoidance of doubt, You may only use the credit
-#     required by this Section for the purpose of attribution in the
-#     manner set out above and, by exercising Your rights under this
-#     License, You may not implicitly or explicitly assert or imply any
-#     connection with, sponsorship or endorsement by the Original Author,
-#     Licensor and/or Attribution Parties, as appropriate, of You or Your
-#     use of the Work, without the separate, express prior written
-#     permission of the Original Author, Licensor and/or Attribution Parties.
-#  4. Except as otherwise agreed in writing by the Licensor or as may be
-#     otherwise permitted by applicable law, if You Reproduce, Distribute
-#     or Publicly Perform the Work either by itself or as part of any
-#     Adaptations or Collections, You must not distort, mutilate, modify
-#     or take other derogatory action in relation to the Work which would
-#     be prejudicial to the Original Author's honor or reputation.
-#     Licensor agrees that in those jurisdictions (e.g. Japan), in which
-#     any exercise of the right granted in Section 3(b) of this License
-#     (the right to make Adaptations) would be deemed to be a distortion,
-#     mutilation, modification or other derogatory action prejudicial to
-#     the Original Author's honor and reputation, the Licensor will waive
-#     or not assert, as appropriate, this Section, to the fullest extent
-#     permitted by the applicable national law, to enable You to
-#     reasonably exercise Your right under Section 3(b) of this License
-#     (right to make Adaptations) but not otherwise.
-#
-# *5. Representations, Warranties and Disclaimer*
-#
-# UNLESS OTHERWISE MUTUALLY AGREED TO BY THE PARTIES IN WRITING, LICENSOR
-# OFFERS THE WORK AS-IS AND MAKES NO REPRESENTATIONS OR WARRANTIES OF ANY
-# KIND CONCERNING THE WORK, EXPRESS, IMPLIED, STATUTORY OR OTHERWISE,
-# INCLUDING, WITHOUT LIMITATION, WARRANTIES OF TITLE, MERCHANTIBILITY,
-# FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT, OR THE ABSENCE OF
-# LATENT OR OTHER DEFECTS, ACCURACY, OR THE PRESENCE OF ABSENCE OF ERRORS,
-# WHETHER OR NOT DISCOVERABLE. SOME JURISDICTIONS DO NOT ALLOW THE
-# EXCLUSION OF IMPLIED WARRANTIES, SO SUCH EXCLUSION MAY NOT APPLY TO YOU.
-#
-# *6. Limitation on Liability.* EXCEPT TO THE EXTENT REQUIRED BY
-# APPLICABLE LAW, IN NO EVENT WILL LICENSOR BE LIABLE TO YOU ON ANY LEGAL
-# THEORY FOR ANY SPECIAL, INCIDENTAL, CONSEQUENTIAL, PUNITIVE OR EXEMPLARY
-# DAMAGES ARISING OUT OF THIS LICENSE OR THE USE OF THE WORK, EVEN IF
-# LICENSOR HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
-#
-# *7. Termination*
-#
-#  1. This License and the rights granted hereunder will terminate
-#     automatically upon any breach by You of the terms of this License.
-#     Individuals or entities who have received Adaptations or Collections
-#     from You under this License, however, will not have their licenses
-#     terminated provided such individuals or entities remain in full
-#     compliance with those licenses. Sections 1, 2, 5, 6, 7, and 8 will
-#     survive any termination of this License.
-#  2. Subject to the above terms and conditions, the license granted here
-#     is perpetual (for the duration of the applicable copyright in the
-#     Work). Notwithstanding the above, Licensor reserves the right to
-#     release the Work under different license terms or to stop
-#     distributing the Work at any time; provided, however that any such
-#     election will not serve to withdraw this License (or any other
-#     license that has been, or is required to be, granted under the terms
-#     of this License), and this License will continue in full force and
-#     effect unless terminated as stated above.
-#
-# *8. Miscellaneous*
-#
-#  1. Each time You Distribute or Publicly Perform the Work or a
-#     Collection, the Licensor offers to the recipient a license to the
-#     Work on the same terms and conditions as the license granted to You
-#     under this License.
-#  2. Each time You Distribute or Publicly Perform an Adaptation, Licensor
-#     offers to the recipient a license to the original Work on the same
-#     terms and conditions as the license granted to You under this License.
-#  3. If any provision of this License is invalid or unenforceable under
-#     applicable law, it shall not affect the validity or enforceability
-#     of the remainder of the terms of this License, and without further
-#     action by the parties to this agreement, such provision shall be
-#     reformed to the minimum extent necessary to make such provision
-#     valid and enforceable.
-#  4. No term or provision of this License shall be deemed waived and no
-#     breach consented to unless such waiver or consent shall be in
-#     writing and signed by the party to be charged with such waiver or
-#     consent.
-#  5. This License constitutes the entire agreement between the parties
-#     with respect to the Work licensed here. There are no understandings,
-#     agreements or representations with respect to the Work not specified
-#     here. Licensor shall not be bound by any additional provisions that
-#     may appear in any communication from You. This License may not be
-#     modified without the mutual written agreement of the Licensor and You.
-#  6. The rights granted under, and the subject matter referenced, in this
-#     License were drafted utilizing the terminology of the Berne
-#     Convention for the Protection of Literary and Artistic Works (as
-#     amended on September 28, 1979), the Rome Convention of 1961, the
-#     WIPO Copyright Treaty of 1996, the WIPO Performances and Phonograms
-#     Treaty of 1996 and the Universal Copyright Convention (as revised on
-#     July 24, 1971). These rights and subject matter take effect in the
-#     relevant jurisdiction in which the License terms are sought to be
-#     enforced according to the corresponding provisions of the
-#     implementation of those treaty provisions in the applicable national
-#     law. If the standard suite of rights granted under applicable
-#     copyright law includes additional rights not granted under this
-#     License, such additional rights are deemed to be included in the
-#     License; this License is not intended to restrict the license of any
-#     rights under applicable law.
-a a->a
-à cavalo->a cavalo
-a muito tempo->há muito tempo
-à muito tempo->há muito tempo
-a nível de->em nível de, ao nível de
-à pé->a pé
-aandeija->bandeja
-abitual->habitual
-acêrca->acerca
-àcerca->acerca
-acessiveis->acessíveis
-acessivel->acessível
-acessor->assessor
-acessora->assessora
-acessoras->assessoras
-acessores->assessores
-acessoria->assessoria
-acessorio->acessório
-acessorios->acessórios
-acesssada->acessada
-acesssadas->acessadas
-acesssado->acessado
-acesssados->acessados
-açoes->acções
-aconselhaveis->aconselháveis
-aconselhavel->aconselhável
-açoreana->açoriana
-açoreanas->açorianas
-açoreano->açoriano
-açoreanos->açorianos
-actris->atriz
-açucar ->açúcar
-acustica->acústica
-acusticas->acústicas
-acustico->acústico
-acusticos->acústicos
-adimite->admite
-adimitir->admitir
-adimitiram->admitiram
-adimitiu->admitiu
-admnistração->administração
-admnistrar->administrar
-adolescencia->adolescência
-afim->a fim
-Africa->África
-agencia->agência
-agradaveis->agradáveis
-agradavel->agradável
-agricola->agrícola
-agricolas->agrícolas
-agua->água
-aguas->águas
-aki->aqui
-album->álbum
-albúm->álbum
-albùm->álbum
-albums->álbuns
-albun->álbum
-albuns->álbuns
-albúns->álbuns
-albùns->álbuns
-alcolémia->alcoolemia
-alcolico->alcoólico
-alcólico->alcoólico
-alcolicos->alcoólicos
-alcólicos->alcoólicos
-alcoolémia->alcoolemia
-alcóolica->alcoólica
-alcoolico->alcoólico
-alcóolico->alcoólico
-alcoolicos->alcoólicos
-aleatorios->aleatórios
-algeriano->argelino
-algorítmo->algoritmo
-algorítmos->algoritmos
-alguem->alguém
-altoridade->autoridade
-altoridades->autoridades
-amanha->amanhã
-amargúra->amargura
-amargúria->amargura
-ambulancia->ambulância
-ambulancias->ambulâncias
-anciosa->ansiosa
-ancioso->ansioso
-anciosas->ansiosas
-anciosos->ansiosos
-anciosamente->ansiosamente
-anemona->anémona,anêmona
-anglofona->anglófona
-anglófonas->anglófonas
-anglofono->anglófono
-anglofonos->anglófonos
-angulo->ângulo
-angulos->ângulos
-anonimo->anónimo, anônimo
-antepôr->antepor
-anti aéreo->antiaéreo
-anti depressivo->antidepressivo
-anti-vírus->antivírus
-anuncio->anúncio
-ao meu ver->a meu ver
-aparencia->aparência, aparecia
-aparencias->aparências
-aplicaçao->aplicação
-Aracajú->Aracaju
-arco-iris->arco-íris
-arcoiris->arco-íris
-arcoíris->arco-íris
-areas->áreas
-argerino->argelino
-aristocratica->aristocrática
-aristocraticas->aristocráticas
-aristocratico->aristocrático
-aristocraticos->aristocráticos
-armonia->harmonia
-arquipelago->arquipélago
-arquipelagos->arquipélagos
-arquipelogo->arquipélago
-artistica->artística
-artisticas->artísticas
-artistico->artístico
-artisticos->artísticos
-ascençao->ascensão
-ascenção->ascensão
-ascensao->ascensão
-Asia->Ásia
-asiatica->asiática
-asim->assim
-assasinato->assassinato
-assistencia->assistência
-associção->associação
-aste->haste
-ateismo->ateísmo
-aterisagem->aterrissagem
-aterissagem->aterrissagem
-aterrisagem->aterrissagem
-aterrizagem->aterrissagem
-atras->atrás
-atraves->através
-atravez->através
-atravéz->através
-atraz->atrás
-atráz->atrás
-atribuida->atribuída
-atribuidas->atribuídas
-atribuido->atribuído
-atribuidos->atribuídos
-atris->atriz, actriz, atris
-audiencia->audiência
-audiencias->audiências
-ausencia->ausência
-ausencias->ausências
-autentica->autêntica
-autenticas->autênticas
-autentico->autêntico
-autenticos->autênticos
-automoveis->automóveis
-automovel->automóvel
-autonoma->autónoma, autônoma
-autonomas->autónomas, autônomas
-autonomo->autónomo, autônomo
-autonomos->autónomos, autônomos
-autopsia->autópsia
-aver->haver
-aviacao->aviação
-aviacão->aviação
-aviasão->aviação
-avogrado->Avogadro
-avulsso->avulso
-azaléia->azaléa
-azas->asas
-bahiana->baiana
-bahiano->baiano
-baínha->bainha
-baínhas->bainhas
-banca-rota->bancarrota
-banca-rrota->bancarrota
-bancarota->bancarrota
-barbarie->barbárie
-barbaries->barbáries
-bébe->bebé
-bébé->bebé
-bébes->bebés
-bébés->bebés
-beige->bege
-beiges->beges
-beije->bege
-beijes->beges
-bem vindo->bem-vindo
-benção->bênção
-bençãos->bênçãos
-beneficencia->beneficência
-beneficio->benefício
-beneficios->benefícios
-benvindo->bem-vindo
-Bertold Brecht->Bertolt Brecht
-bevocar->invocar
-bi-campeão->bicampeão
-bibliografica->bibliográfica
-bibliograficas->bibliográficas
-bibliografico->bibliográfico
-bibliograficos->bibliográficos
-biografico->biográfico
-biograficos->biográficos
-biograifa->biografia
-biograifas->biografias
-biópsia->biopsia
-biópsias->biopsias
-boas vindas->Boas-vindas
-boeiro->bueiro
-borburinho->burburinho
-brasao->brasão
-brazão->brasão
-Brazil->Brasil
-britanico->britânico
-burborinho->burburinho
-bussula->bússola
-cadaço->cadarço
-caiem->caem
-calsado->calçado
-calvice->calvície
-calvíce->calvície
-camara->câmara
-camera->câmera
-caminhoes->caminhões, camiões
-camioes->camiões, caminhões
-campeao->campeão
-campeoes->campeões
-campiao->campeão
-campião->campeão
-campioes->campeões
-campiões->campeões
-campionato->campeonato
-campionatos->campeonatos
-cançao->canção
-cansão->canção
-capitão mor->capitão-mor
-capitulo->capítulo
-capitulos->capítulos
-caracteristica->característica
-caracteristicas->características
-caracteristico->característico
-caracteristicos->característicos
-carissimo->caríssimo
-cassar->caçar, casar, cassar
-catalizador->catalisador
-catalogo->catálogo
-catalogos->catálogos
-catequisador->catequizador
-catequisar->catequizar
-cazamento->casamento
-cazar->casar
-cazara->casara
-cazaram->casaram
-cazou->casou
-Ceara->Ceará
-celebro->cérebro
-cemiterio->cemitério
-cemiterios->cemitérios
-cenario->cenário
-cenarios->cenários
-cerebro->cérebro
-cerebros->cérebros
-chopp->chope
-ciclano->sicrano
-cidadães->cidadãos
-cidadões->cidadãos
-ciencia->ciência
-ciencias->ciências
-cientifica->científica
-cientificas->científicas
-cientifico->científico
-cientificos->científicos
-circulo->círculo
-circulos->círculos
-classica->clássica
-classicas->clássicas
-classico->clássico
-classicos->clássicos
-clinica->clínica
-cms->cm
-co-habitação->coabitação
-coalisão->coalizão
-côco->coco
-coerencia->coerência
-coerencias->coerências
-cohabitação->coabitação
-comcerteza->com certeza
-comecou->começou
-comedia->comédia
-comercio->comércio
-comercios->comércios
-comisão->comissão
-comisoes->comissões
-comisões->comissões
-comissao->comissão
-comnosco->connosco
-compôr->compor
-compreenção->compreensão
-compreenções->compreensões
-compreenssão->compreensão
-compreenssões->compreensões
-concerteza->com certeza
-conciderada->considerada
-concideradas->consideradas
-conciderado->considerado
-conciderados->considerados
-concluíndo->concluindo
-concretisar->concretizar
-condiçao->condição
-condissao->condição
-condissão->condição
-conseguírem->conseguirem
-constituia->constituía
-constituiam->constituíam
-constituiram->constituíram
-constroi->constrói
-construia->construía
-construida->construída
-construidas->construídas
-construido->construído
-construidos->construído
-contemporaneo->contemporâneo
-contemporaneos->contemporâneos
-contribue->contribui
-contrução->construção
-contruído->construído
-contruir->construir
-converçao->conversão
-converção->conversão
-conversao->conversão
-converssão->conversão
-côr->cor
-corçario->corsário
-côres->cores
-cornea->córnea
-corneas->córneas
-corografico->corográfico
-corograficos->corográficos
-correiro eletronico->correio electrónico, correio eletrônico
-corrijiam->corrigiam
-corrijir->corrigir
-corrijiram->corrigiram
-crâneo->crânio
-crâneos->crânios
-criaça->criança
-criacao->criação
-criaçao->criação
-criaças->crianças
-crianca->criança
-criancas->crianças
-cristianizacao->cristianização
-cristianizacão->cristianização
-cristianizacoes->cristianizações
-cristianizacões->cristianizações
-criticas->críticas
-critícas->críticas
-criticos->críticos
-critícos->críticos
-crueis->cruéis
-culinaria->culinária
-custuma->costuma
-custumava->costumava
-custumavam->costumavam
-custume->costume
-custumes->costumes
-decada->década
-decadas->décadas
-decadencia->decadência
-decadencias->decadências
-decer->descer
-deceram->desceram
-declinio->declínio
-declinios->declínios
-defeniçao->definição
-defenição->definição
-defenições->definições
-defenido->definido
-defenir->definir
-definitamente->definitivamente
-deiche->deixe
-deisponiveis->disponíveis
-deisponivel->disponível
-democratica->democrática
-demonio->demónio, demônio
-demonios->demónios, demônios
-depedente->dependente
-depedentes->dependentes
-deposito->depósito
-depositos->depósitos
-desagradaveis->desagradáveis
-desagradavel->desagradável
-descubrimento->descobrimento
-descubrimentos->descobrimentos
-descubrir->descobrir
-descubriram->descobriram
-descubrire->descobrire
-deseçeis->dezesseis
-desembro->Dezembro
-desesseis->dezesseis
-desnecessario->desnecessário
-despensaveis->dispensáveis
-despensáveis->dispensáveis
-despensavel->dispensável
-despensável->dispensável
-desprotejida->desprotegida
-desprotejidas->desprotegidas
-desprotejido->desprotegido
-desprotejidos->desprotegidos
-destruida->destruída
-devocao->devoção
-devocão->devoção
-devoçao->devoção
-diagnostico->diagnóstico
-diagnosticos->diagnósticos
-diaria->diária
-diáriamente->diariamente
-diario->diário
-dibre->drible
-diferencas->diferenças
-díficeis->difíceis
-dificil->difícil
-díficil->difícil
-dificulidade->dificuldade
-difusao->difusão
-dignatária->dignitária
-dignatárias->dignitárias
-dignatário->dignitário
-dignatários->dignitários
-dijita->digita
-dijitar->digitar
-dijitara->digitara
-dijitaram->digitaram
-dijitou->digitou
-diminue->diminui
-dinamico->dinâmico
-discuções->discussões
-discursso->discurso
-dispender->despender
-dispenderam->despenderam
-dispendio->dispêndio
-dispendios->dispêndios
-dispensaveis->dispensáveis
-dispensavel->dispensável
-disponiveis->disponíveis
-disponivel->disponível
-distribuida->distribuída
-distribuidas->distribuídas
-distribuido->distribuído
-distribuidos->distribuídos
-disturbio->distúrbio
-disturbios->distúrbios
-diverssas->diversas
-diverssos->diversos
-documentario->documentário
-documentarios->documentários
-dragao->dragão
-druída->druida
-druídas->druidas
-dsenho->desenho
-duvidas->dúvidas
-ecessão->exceção
-ecessões->exceções
-eciclopedia->enciclopédia
-eciclopédia->enciclopédia
-economica->económica, econômica
-ect->etc
-egipcios->egípcios
-egipsio->egípcio
-elacção->elação
-electrônica->electrónica, eletrônica
-electrônicas->electrónicas, eletrônicas
-electrônico->electrónico, eletrônico
-electrônicos->electrónicos, eletrônicos
-eletroima->eletroímã
-eletroimã->eletroímã
-eletronica->electrónica, eletrônica
-eletrónica->electrónica, eletrônica
-eletronicas->electrónicas, eletrônicas
-eletrónicas->electrónicas, eletrônicas
-eletronico->electrónico, eletrônico
-eletrónico->electrónico, eletrônico
-eletronicos->electrónicos, eletrônicos
-eletrónicos->electrónicos, eletrônicos
-elice->hélice
-emaili->e-mail, email, correio electrónico, correio eletrônico
-eminencia->eminência
-eminencias->eminências
-empresario->empresário
-empresarios->empresários
-enciclopedia->enciclopédia
-enciclopedias->enciclopédias
-enfase->ênfase
-enfases->ênfases
-entao->então
-entertido->entretido
-entitular->intitular
-entretando->entretanto
-entreteram->entretiveram
-entreterimento->entretenimento
-entreteu->entreteve
-epecial->especial
-epica->épica
-epicas->épicas
-epico->épico
-epicos->épicos
-eplepsia->epilepsia
-epoca->época
-epocas->épocas
-equilibrio->equilíbrio
-ernegia->energia
-erói->herói
-errupção->erupção
-escerda->esquerda
-escerdas->esquerdas
-esitaram->hesitaram
-esitou->hesitou
-especialisada->especializada
-especialisadas->especializadas
-especialisado->especializado
-especialisados->especializados
-espectativa->expectativa
-espectativas->expectativas
-esperanca->esperança
-esperancas->esperanças
-espetativa->expectativa
-espetativas->expectativas
-espirita->espírita
-espiritas->espíritas
-espirito->espírito
-espiritos->espíritos
-espulsou->expulsou
-esquesita->esquisita
-esquesitas->esquisitas
-esquesito->esquisito
-esquesitos->esquisitos
-estabelecimente->estabelecimento
-estabelecimentes->estabelecimentos
-estaçãoos->estações
-estadio->estádio
-estadios->estádios
-estao->estão
-esteje->esteja
-estinto->extinto
-estintos->extintos
-estorquir->extorquir
-estorquiram->extorquiram
-estorquiu->extorquiu
-estudio->estúdio
-estudios->estúdios
-esturquir->extorquir
-esturquiram->extorquiram
-esturquiu->extorquiu
-ethanol->etanol
-etica->ética
-eticas->éticas
-excavação->escavação
-excavar->escavar
-excessão->exceção
-exdrúxula->esdrúxula
-exdrúxulas->esdrúxulas
-exdrúxulo->esdrúxulo
-exdrúxulos->esdrúxulos
-exepto->excepto, exceto
-exercicio->exercício
-exercicios->exercícios
-exeto->exceto, excepto
-exijência->exigência
-exijências->exigências
-exitar->hesitar
-exitaram->hesitaram
-exitou->hesitou
-expectador->espectador
-expontânea->espontânea
-expontâneas->espontâneas
-expontâneo->espontâneo
-expontâneos->espontâneos
-extende-se->estende-se
-extender->estender
-extenderam->estenderam
-facil->fácil
-familia->família
-familias->famílias
-farmaceutica->farmacêutica
-farmaceuticas->farmacêuticas
-farmaceutico->farmacêutico
-farmaceuticos->farmacêuticos
-faser->fazer
-fecula->fécula
-fémea->fêmea
-femeninismo->femininismo
-femeninismos->femininismos
-femenino->feminino
-femeninos->femininos
-ferverosos->fervorosos
-fimeninismo->femininismo
-fimeninismos->femininismos
-fimenino->feminino
-fimeninos->femininos
-Finlandia->finlândia
-fisica->física
-fizestes->fizeste
-flôr->flor
-flôres->flores
-flôrs->flores
-fluído->fluido
-fluídos->fluidos
-forão->foram
-fortuíto->fortuito
-fortuítos->fortuitos
-fotografica->fotográfica
-frageis->frágeis
-fragil->frágil
-Frankstein->Frankenstein
-funeraria->funerária
-funerarias->funerárias
-funerario->funerário
-funerarios->funerários
-furá->furar
-furacao->furacão
-furacoes->furacões
-galaxia->galáxia
-gas->gás
-gaz->gás
-gáz->gás
-geito->jeito
-geneceu->gineceu
-generico->genérico
-genericos->genéricos
-genero->género
-generos->géneros
-genio->génio, gênio
-geometrica->geométrico
-geometricas->geométricos
-geometrico->geométrico
-geometricos->geométricos
-gipe->jipe
-gipes->jipes
-giria->gíria
-girias->gírias
-giroscopico->giroscópio
-giroscopio->giroscópio
-gorgeta->gorjeta
-gorgetas->gorjetas
-Grã Bretanha->Grã-Bretanha
-graca->graça
-gracas->graças
-grafico->gráfico
-graficos->gráficos
-grangear->granjear
-gratuíto->gratuito
-gratuítos->gratuitos
-grau centigrado->grau Celsius
-grau centígrado->grau Celsius
-grau centígrados->grau Celsius
-grau kelvin->kelvin
-guizar->guisar
-hà->há
-hambiente->ambiente
-hambientes->ambientes
-haviam muitos->havia muitos
-haviam poucos->havia poucos
-hectar->hectare
-heraldica->heráldica
-heraldico->heráldico
-heranca->herança
-Herodoto->Heródoto
-heróico->heroico
-hexa-campeão->hexacampeão
-hilariedade->hilaridade
-historia->história
-historica->histórica
-historicas->históricas
-historico->histórico
-historicos->históricos
-homosexual->homossexual
-homosexualidade->homossexualidade
-horario->horário
-horarios->horários
-hoxigenio->oxigênio
-hoxigênio->oxigênio
-humoristica->humorística
-humoristico->humorístico
-ideología->ideologia
-idolo->ídolo
-idolos->ídolos
-igiene->higiene
-igienico->higiênico
-iguasu->Iguaçu
-ilacção->ilação
-imenência->iminência
-imenente->iminente
-imoveis->imóveis
-imovel->imóvel
-imperio->império
-imperios->impérios
-importancia->importância
-importancias->importâncias
-impresa->empresa
-imuno-deficiência->imunodeficiência
-imuno-deficiências->imunodeficiências
-incluiam->incluíam
-inclusivé->inclusive
-indefenição->indefinição
-indefenições->indefinições
-indefenir->indefinir
-indentidade->identidade
-indentidades->identidades
-India->Índia
-indice->índice
-indigena->indígena
-indiguinação->indignação
-indiguinado->indignado
-indiguinar->indignar
-indioma->idioma
-indiomas->idiomas
-individada->endividada
-individadas->endividadas
-individado->endividado
-individados->endividados
-individuo->indivíduo
-individuos->indivíduos
-inedita->inédita
-ineditas->inéditas
-inedito->inédito
-ineditos->inéditos
-infancia->infância
-infelismente->infelizmente
-inflacção->inflação
-infra vermelho->infravermelho
-infra vermelhos->infravermelhos
-infra-vermelho->infravermelho
-infra-vermelhos->infravermelhos
-ingenuo->ingénuo
-ingles->inglês
-inglêsa->inglesa
-inglêsas->inglesas
-inglêses->ingleses
-ingreja->igreja
-inícia->inicia
-inicio->início
-inicios->inícios
-inteligencia->inteligência
-inteligencias->inteligências
-intensão->intenção
-intertido->entretido
-intervemos->intervimos
-intervi->intervim
-intervido->intervindo
-interviram->intervieram
-interviste->intervieste
-interviu->interveio
-intigração->integração
-intrumental->instrumental
-intrumento->instrumento
-inumeras->inúmeras
-inumeros->inúmeros
-invensivel->invencível
-invensível->invencível
-invenssível->invencível
-inves->invés
-invez->invés
-invéz->invés
-iorgute->iogurte
-iper->hiper
-ipopótamo->hipopótamo
-ipslon->ípslon
-irisar->irizar
-irmao->irmão
-irmaos->irmãos
-irupção->irrupção
-ispirar->inspirar
-ispirou->inspirou
-issu->isso
-jamelão->jamelada,rabada
-japones->japonês
-jeropiga->geropiga
-Joana d´Arc->Joana d'Arc
-judiciaria->judiciária
-judiciarias->judiciárias
-juíz->juiz
-juiza->juíza
-juizas->juízas
-juizes->juízes
-junior->júnior
-júniores->juniores
-juridica->jurídica
-juridição->jurisdição
-juridicas->jurídicas
-juridico->jurídico
-juridicos->jurídicos
-juz->jus
-kilo->quilograma
-kilômetro->quilômetro
-kilometro->quilómetro, quilômetro
-kilómetro->quilómetro, quilômetro
-kilometros->quilómetros, quilômetros
-kilómetros->quilómetros, quilômetros
-km2->km²
-largartixa->lagartixa
-largarto->lagarto
-leem->lêem
-leêm->lêem
-lêm->lêem
-lendaria->lendária
-lendarias->lendárias
-lendario->lendário
-lendarios->lendários
-leucémia->leucemia
-licenca->licença
-licencas->licenças
-licensa->licença
-lider->líder
-lideres->líderes
-lingua->língua
-linguas->línguas
-linguísta->linguista
-línguísta->linguista
-linguístas->linguistas
-línguístas->linguistas
-lisongea->lisonjeia
-lisongear->lisonjear
-lisongeara->lisonjeara
-lisongearam->lisonjearam
-lisongearou->lisonjearou
-lisonjea->lisonjeia
-logica->lógica
-lógicamente->logicamente
-logista->lojista
-logistas->lojistas
-lojica->lógica
-lójica->lógica
-lusofona->lusófona
-lusofonas->lusófonas
-lusofono->lusófono
-lusofonos->lusófonos
-magestade->majestade
-magestades->majestades
-magica->mágica
-magico->mágico
-mangerico->manjerico
-mangericos->manjericos
-manteram->mantiveram
-manteu->manteve
-maritima->marítima
-maritimas->marítimas
-maritimo->marítimo
-maritimos->marítimos
-massiça->maciça
-massiças->maciças
-massiço->maciço
-massiços->maciços
-meche->mexe
-mecher->mexer
-mecheram->mexeram
-mecheu->mexeu
-médico cirurgião->médico-cirurgião
-memoria->memória
-memorias->memórias
-menas->menos
-mercenaria->mercenária
-mercenarias->mercenárias
-mercenario->mercenário
-mercenarios->mercenários
-mêses->meses
-metereologia->meteorologia
-metodo->método
-metodos->métodos
-miceis->mísseis
-míceis->mísseis
-micil->míssil
-mícil->míssil
-minerio->minério
-minimo->mínimo
-missao->missão
-mistica->mística
-misticas->místicas
-mistico->místico
-misticos->místicos
-miticas->míticas
-molar->mol/L
-molaridade->concentração em quantidade de matéria
-muinto->muito
-muintos->muitos
-multi-uso-> multiúso
-multimedia->multimedia, multimídia
-multimedias->multimédias, multimídias
-multimidia->multimídia, multimédia
-multimidias-> multimídias, multimédias
-multiuso-> multiúso
-municipio->município
-munícipio->município
-munícípio->município
-municipios->municípios
-munícipios->municípios
-munícípios->municípios
-munto->muito
-muntos->muitos
-musica->música
-musicas->músicas
-musico->músico
-musicos->músicos
-ñ->não
-nanômetro->nanometro
-nao->não
-naum->não
-negocios->negócios
-nenum->nenhum
-neo darwinismo->neodarwinismo
-neo liberais->neoliberais
-neo liberal->neoliberal
-neo liberalismo->neoliberalismo
-neo zelandês->neozelandês
-neo zelandesa->neozelandesa
-neo-darwinismo->neodarwinismo
-neo-liberais->neoliberais
-neo-liberal->neoliberal
-neo-liberalismo->neoliberalismo
-neo-zelandês->neozelandês
-neo-zelandesa->neozelandesa
-nescessário->necessário
-ninguem->ninguém
-nivel->nível
-nonagesima->nonagésima
-nonagesimo->nonagésimo
-nonagessima->nonagésima
-nonagéssima->nonagésima
-nonagessimo->nonagésimo
-nonagéssimo->nonagésimo
-nostalgico->nostálgico
-nostalgicos->nostálgicos
-notávelmente->notavelmente
-númerais->numerais
-númeral->numeral
-número de Avogadro->constante de Avogadro
-número de moles->quantidade de matéria
-número de mols->quantidade de matéria
-numero->número
-numeros->números
-numismatica->numismática
-numismatico->numismático
-núvem->nuvem
-núvens->nuvens
-obrigatoria->obrigatória
-obrigatorias->obrigatórias
-obrigatorio->obrigatório
-obrigatorios->obrigatórios
-obtem->obtém, obtêm
-obteram->obtiveram
-obteu->obteve
-ºC->°C
-odio->ódio
-ºF->°F
-oje->hoje
-olimpico->olímpico
-olimpicos->olímpicos
-omem->homem
-optima->óptima, ótima
-optimo->óptimo, ótimo
-orta->horta
-otima->ótima, óptima
-otimisadas->otimizadas, optimizadas
-otimo->ótimo, óptimo
-oxido-redução->oxirredução
-pagaos->pagãos
-pagina->página
-paises->países
-paleolitica->paleolítica
-paleolitico->paleolítico
-papeis->papéis
-para mim fazer->para eu fazer
-paraiso->paraíso
-paraisos->paraísos
-paraizo->paraíso
-paraízo->paraíso
-paraizos->paraísos
-paraízos->paraísos
-paralização->paralisação
-paralizado->paralisado
-paralizar->paralisar
-paroco->pároco
-parocos->párocos
-pascais->pascals
-patria->pátria
-Paulinia->Paulínia
-pedigri->pedigree
-penta-campeão->pentacampeão
-percursora->precursora
-percursoras->precursoras
-periodo->período
-periodos->períodos
-periudo->período
-períudo->período
-periudos->períodos
-períudos->períodos
-permenor->pormenor
-permenores->pormenores
-perola->pérola
-perolas->pérolas
-personalisação->personalização
-personalisar->personalizar
-personalisou->personalizou
-pertubar->perturbar
-peso atômico->massa atômica
-peso molecular->massa molecular
-pesquiza->pesquisa
-picômetro->picometro
-plásticamente->plasticamente
-plasticas->plásticas
-plastico->plástico
-plasticos->plásticos
-poblema->problema
-pobrema->problema
-politica->política
-politicas->políticas
-politico->político
-politicos->políticos
-poluicao->poluição
-Portugual->Portugal
-posivel->possível
-possiveis->possíveis
-possivel->possível
-possue->possui
-pq->porque,porquê,por que,por quê
-praca->praça
-prefêrencias->preferências
-prescisa->precisa
-prestaçãões->prestações
-pretenção->pretensão
-pretenssão->pretensão
-previlegio->privilégio
-previlégio->privilégio
-previlegios->privilégios
-previlégios->privilégios
-primaria->primária
-primarias->primárias
-primario->primário
-primarios->primários
-primeiro ministro->primeiro-ministro
-princípalmente->principalmente
-príncipalmente->principalmente
-principios->princípios
-prisao->prisão
-prisoes->prisões
-privatizaçao->privatização
-privilegio->privilégio
-privilegios->privilégios
-proceço->processo
-proceços->processos
-proceso->processo
-procesos->processos
-producao->produção
-progama->programa
-progamas->programas
-proibe->proíbe
-proíbido->proibido
-propia->própria
-própia->própria
-propias->próprias
-propiedade->propriedade
-propio->próprio
-própio->próprio
-propios->próprios
-proposito->propósito
-prosceço->processo
-prosceços->processos
-prosceso->processo
-proscesos->processos
-proseço->processo
-proseços->processos
-prosseço->processo
-prosseços->processos
-protejida->protegida
-protejidas->protegidas
-protejido->protegido
-protejidos->protegidos
-prototipo->protótipo
-prototipos->protótipos
-provincia->província
-provincias->províncias
-proxima->próxima
-proximas->próximas
-proximo->próximo
-proximos->próximos
-pseudo-ciência->pseudociência
-publico->público
-publicos->públicos
-qeu->que
-questao->questão
-quilómetro->quilômetro
-quilometro->quilómetro, quilômetro
-quilometros->quilómetros, quilômetros
-quimica->química
-quimicas->químicas
-quimico->químico
-quimicos->químicos
-quizer->quiser
-quizesse->quisesse
-quizessem->quisessem
-radiaçao->radiação
-radio->rádio
-raíz->raiz
-raizes->raízes
-rarissimo->raríssimo
-rarissimos->raríssimos
-razao->razão
-razoes->razões
-récorde->recorde
-referencia->referência
-referencias->referências
-reibi->râguebi
-reinterar->reiterar
-reinvidicação->reivindicação
-reinvidicar->reivindicar
-renovaveis->renováveis
-repertorio->repertório
-repertorios->repertórios
-reportorio->reportório
-reportorios->reportórios
-requesito->requisito
-responsaveis->responsáveis
-responsavel->responsável
-retem->retém, retêm
-reteram->retiveram
-reteu->reteve
-reune->reúne
-reunem->reúnem
-reuniao->reunião
-reunioes->reuniões
-reuso-> reúso
-riquissimo->riquíssimo
-riquissimos->riquíssimos
-ritualistico->ritualístico
-rúbrica->rubrica
-rúbricas->rubricas
-sacerdocio->sacerdócio
-sacrificio->sacrifício
-saira->saíra, sairá
-santuario->santuário
-sao->são
-saude->saúde
-secudaria->secudária
-secudarias->secudárias
-secudario->secudário
-secudarios->secudários
-seculo->século
-seculos->séculos
-seissentos->seiscentos
-seje->seja
-semaforo->semáforo
-semaforos->semáforos
-semi círculo->semicírculo
-semi círculos->semicírculos
-semi finais->semifinais
-semi final->semifinal
-semi precioso->semiprecioso
-semi preciosos->semipreciosos
-semi presidencialismos->semipresidencialismos
-semi presidencialistas->semipresidencialistas
-semi-círculo->semicírculo
-semi-círculos->semicírculos
-semi-finais->semifinais
-semi-final->semifinal
-semi-precioso->semiprecioso
-semi-preciosos->semipreciosos
-semi-presidencialismos->semipresidencialismos
-semi-presidencialistas->semipresidencialistas
-sensiveis->sensíveis
-sensivel->sensível
-separaçoes->separações
-serie->série
-serio->sério, série, seriado
-setessentos->setecentos
-siclano->sicrano
-simbolo->símbolo
-simbolos->símbolos
-simplemente->simplesmente
-sindrome->síndrome
-sinonimo->sinónimo, sinônimo
-síntaze->síntaxe
-sistemico->sistémico
-sobrevivencia->sobrevivência
-sombrancelha->sobrancelha
-subdivisáo->subdivisão
-substituida->substituída
-substituidas->substituídas
-substituido->substituído
-substituidos->substituídos
-suçeso->sucesso
-suçesos->sucessos
-suçesso->sucesso
-suçessos->sucessos
-Suiça->Suíça
-suiço->suíço
-suino->suíno
-suseço->sucesso
-suseços->sucessos
-susseço->sucesso
-susseços->sucessos
-sussesso->sucesso
-sussessos->sucessos
-tambem->também
-támbem->também
-támbém->também
-tao->tão
-tb->também
-tbm->também
-tecnica->técnica
-tecnico->técnico
-têmporo-mandibular->temporomandibular
-tendencia->tendência
-tendencias->tendências
-tetra-hidrofurano->tetraidrofurano
-tipica->típica
-tipicas->típicas
-tipico->típico
-tipicos->típicos
-titulos->títulos
-tracao->tracção, tração
-tranformar->transformar
-transmissiveis->transmissíveis
-transmissivel->transmissível
-traser->trazer
-trasnporta->transporta
-trasnporte->transporte
-trasnportes->transportes
-tratrahidrofurano->tetraidrofurano
-tres->três
-treslagoense->três-lagoense
-tri-campeão->tricampeão
-trovao->trovão
-Tupí-guarani->Tupi-guarani
-turistico->turístico
-turisticos->turísticos
-u.m.a->u
-ultima->última
-ultimo->último
-ultimos->últimos
-um um->um
-úmidade->umidade, humidade
-unica->única
-unicas->únicas
-unico->único
-unicos->únicos
-univercidade->universidade
-univercidades->universidades
-universitaria->universitária
-universitarias->universitárias
-universitario->universitário
-universitarios->universitários
-uqe->que
-usuario->usuário, utilizador
-util->útil
-utilisador->utilizador, usuário
-uzada->usada
-uzadas->usadas
-uzado->usado
-uzados->usados
-uzar->usar
-uzo->uso
-uzou->usou
-váriados->variados
-varias->várias
-varios->vários
-vc->você
-veiculo->veículo
-veiculos->veículos
-verçao->versão
-verção->versão
-verçoes->versões
-verções->versões
-ves->vez, vês
-veses->vezes
-vestigio->vestígio
-vestigios->vestígios
-vezis->vezes
-viajem->viagem
-vice governador->vice-governador
-vice governadores->vice-governadores
-vice prefeito->vice-prefeito
-vice prefeitos->vice-prefeitos
-vice presidente->vice-presidente
-vice presidentes->vice-presidentes
-video game->videogame
-video->vídeo
-videoclip->videoclipe
-vigilancia->vigilância
-violencia->violência
-viros->vírus
-víros->vírus
-virus->vírus
-virús->vírus
-vírús->vírus
-vitoria->vitória
-vitorias->vitórias
-viuva->viúva
-voçe->você
-voçê->você
-Wikimapa->WikiMapia
-Wikimapia->WikiMapia
-xafariz->chafariz
-xuxu->chuchu
-yoga->ioga
-yôga->ioga
diff --git a/files/typos/typos-tr.txt b/files/typos/typos-tr.txt
deleted file mode 100644
index 4db11e7..0000000
--- a/files/typos/typos-tr.txt
+++ /dev/null
@@ -1,604 +0,0 @@
-# This file contains a number of common Turkish typos:
-andriod->android
-
-# The remainder of this file contains misspellings from
-# http://tr.wikipedia.org/wiki/Vikipedi:Yaygin_kelime_hatalari/makinalar_icin
-# plus some post-processing to fix invalid entries, remove duplicates, etc.
-#
-# The content is available under the
-# "Creative Commons Attribution-ShareAlike License"
-# http://creativecommons.org/licenses/by-sa/3.0/
-#
-# THE WORK (AS DEFINED BELOW) IS PROVIDED UNDER THE TERMS OF THIS CREATIVE
-# COMMONS PUBLIC LICENSE ("CCPL" OR "LICENSE"). THE WORK IS PROTECTED BY
-# COPYRIGHT AND/OR OTHER APPLICABLE LAW. ANY USE OF THE WORK OTHER THAN AS
-# AUTHORIZED UNDER THIS LICENSE OR COPYRIGHT LAW IS PROHIBITED.
-#
-# BY EXERCISING ANY RIGHTS TO THE WORK PROVIDED HERE, YOU ACCEPT AND AGREE
-# TO BE BOUND BY THE TERMS OF THIS LICENSE. TO THE EXTENT THIS LICENSE MAY
-# BE CONSIDERED TO BE A CONTRACT, THE LICENSOR GRANTS YOU THE RIGHTS
-# CONTAINED HERE IN CONSIDERATION OF YOUR ACCEPTANCE OF SUCH TERMS AND
-# CONDITIONS.
-#
-# *1. Definitions*
-#
-#  1. *"Adaptation"* means a work based upon the Work, or upon the Work
-#     and other pre-existing works, such as a translation, adaptation,
-#     derivative work, arrangement of music or other alterations of a
-#     literary or artistic work, or phonogram or performance and includes
-#     cinematographic adaptations or any other form in which the Work may
-#     be recast, transformed, or adapted including in any form
-#     recognizably derived from the original, except that a work that
-#     constitutes a Collection will not be considered an Adaptation for
-#     the purpose of this License. For the avoidance of doubt, where the
-#     Work is a musical work, performance or phonogram, the
-#     synchronization of the Work in timed-relation with a moving image
-#     ("synching") will be considered an Adaptation for the purpose of
-#     this License.
-#  2. *"Collection"* means a collection of literary or artistic works,
-#     such as encyclopedias and anthologies, or performances, phonograms
-#     or broadcasts, or other works or subject matter other than works
-#     listed in Section 1(f) below, which, by reason of the selection and
-#     arrangement of their contents, constitute intellectual creations, in
-#     which the Work is included in its entirety in unmodified form along
-#     with one or more other contributions, each constituting separate and
-#     independent works in themselves, which together are assembled into a
-#     collective whole. A work that constitutes a Collection will not be
-#     considered an Adaptation (as defined below) for the purposes of this
-#     License.
-#  3. *"Creative Commons Compatible License"* means a license that is
-#     listed at http://creativecommons.org/compatiblelicenses that has
-#     been approved by Creative Commons as being essentially equivalent to
-#     this License, including, at a minimum, because that license: (i)
-#     contains terms that have the same purpose, meaning and effect as the
-#     License Elements of this License; and, (ii) explicitly permits the
-#     relicensing of adaptations of works made available under that
-#     license under this License or a Creative Commons jurisdiction
-#     license with the same License Elements as this License.
-#  4. *"Distribute"* means to make available to the public the original
-#     and copies of the Work or Adaptation, as appropriate, through sale
-#     or other transfer of ownership.
-#  5. *"License Elements"* means the following high-level license
-#     attributes as selected by Licensor and indicated in the title of
-#     this License: Attribution, ShareAlike.
-#  6. *"Licensor"* means the individual, individuals, entity or entities
-#     that offer(s) the Work under the terms of this License.
-#  7. *"Original Author"* means, in the case of a literary or artistic
-#     work, the individual, individuals, entity or entities who created
-#     the Work or if no individual or entity can be identified, the
-#     publisher; and in addition (i) in the case of a performance the
-#     actors, singers, musicians, dancers, and other persons who act,
-#     sing, deliver, declaim, play in, interpret or otherwise perform
-#     literary or artistic works or expressions of folklore; (ii) in the
-#     case of a phonogram the producer being the person or legal entity
-#     who first fixes the sounds of a performance or other sounds; and,
-#     (iii) in the case of broadcasts, the organization that transmits the
-#     broadcast.
-#  8. *"Work"* means the literary and/or artistic work offered under the
-#     terms of this License including without limitation any production in
-#     the literary, scientific and artistic domain, whatever may be the
-#     mode or form of its expression including digital form, such as a
-#     book, pamphlet and other writing; a lecture, address, sermon or
-#     other work of the same nature; a dramatic or dramatico-musical work;
-#     a choreographic work or entertainment in dumb show; a musical
-#     composition with or without words; a cinematographic work to which
-#     are assimilated works expressed by a process analogous to
-#     cinematography; a work of drawing, painting, architecture,
-#     sculpture, engraving or lithography; a photographic work to which
-#     are assimilated works expressed by a process analogous to
-#     photography; a work of applied art; an illustration, map, plan,
-#     sketch or three-dimensional work relative to geography, topography,
-#     architecture or science; a performance; a broadcast; a phonogram; a
-#     compilation of data to the extent it is protected as a copyrightable
-#     work; or a work performed by a variety or circus performer to the
-#     extent it is not otherwise considered a literary or artistic work.
-#  9. *"You"* means an individual or entity exercising rights under this
-#     License who has not previously violated the terms of this License
-#     with respect to the Work, or who has received express permission
-#     from the Licensor to exercise rights under this License despite a
-#     previous violation.
-# 10. *"Publicly Perform"* means to perform public recitations of the Work
-#     and to communicate to the public those public recitations, by any
-#     means or process, including by wire or wireless means or public
-#     digital performances; to make available to the public Works in such
-#     a way that members of the public may access these Works from a place
-#     and at a place individually chosen by them; to perform the Work to
-#     the public by any means or process and the communication to the
-#     public of the performances of the Work, including by public digital
-#     performance; to broadcast and rebroadcast the Work by any means
-#     including signs, sounds or images.
-# 11. *"Reproduce"* means to make copies of the Work by any means
-#     including without limitation by sound or visual recordings and the
-#     right of fixation and reproducing fixations of the Work, including
-#     storage of a protected performance or phonogram in digital form or
-#     other electronic medium.
-#
-# *2. Fair Dealing Rights.* Nothing in this License is intended to reduce,
-# limit, or restrict any uses free from copyright or rights arising from
-# limitations or exceptions that are provided for in connection with the
-# copyright protection under copyright law or other applicable laws.
-#
-# *3. License Grant.* Subject to the terms and conditions of this License,
-# Licensor hereby grants You a worldwide, royalty-free, non-exclusive,
-# perpetual (for the duration of the applicable copyright) license to
-# exercise the rights in the Work as stated below:
-#
-#  1. to Reproduce the Work, to incorporate the Work into one or more
-#     Collections, and to Reproduce the Work as incorporated in the
-#     Collections;
-#  2. to create and Reproduce Adaptations provided that any such
-#     Adaptation, including any translation in any medium, takes
-#     reasonable steps to clearly label, demarcate or otherwise identify
-#     that changes were made to the original Work. For example, a
-#     translation could be marked "The original work was translated from
-#     English to Spanish," or a modification could indicate "The original
-#     work has been modified.";
-#  3. to Distribute and Publicly Perform the Work including as
-#     incorporated in Collections; and,
-#  4. to Distribute and Publicly Perform Adaptations.
-#  5.
-#
-#     For the avoidance of doubt:
-#
-#      1. *Non-waivable Compulsory License Schemes*. In those
-#         jurisdictions in which the right to collect royalties through
-#         any statutory or compulsory licensing scheme cannot be waived,
-#         the Licensor reserves the exclusive right to collect such
-#         royalties for any exercise by You of the rights granted under
-#         this License;
-#      2. *Waivable Compulsory License Schemes*. In those jurisdictions in
-#         which the right to collect royalties through any statutory or
-#         compulsory licensing scheme can be waived, the Licensor waives
-#         the exclusive right to collect such royalties for any exercise
-#         by You of the rights granted under this License; and,
-#      3. *Voluntary License Schemes*. The Licensor waives the right to
-#         collect royalties, whether individually or, in the event that
-#         the Licensor is a member of a collecting society that
-#         administers voluntary licensing schemes, via that society, from
-#         any exercise by You of the rights granted under this License.
-#
-# The above rights may be exercised in all media and formats whether now
-# known or hereafter devised. The above rights include the right to make
-# such modifications as are technically necessary to exercise the rights
-# in other media and formats. Subject to Section 8(f), all rights not
-# expressly granted by Licensor are hereby reserved.
-#
-# *4. Restrictions.* The license granted in Section 3 above is expressly
-# made subject to and limited by the following restrictions:
-#
-#  1. You may Distribute or Publicly Perform the Work only under the terms
-#     of this License. You must include a copy of, or the Uniform Resource
-#     Identifier (URI) for, this License with every copy of the Work You
-#     Distribute or Publicly Perform. You may not offer or impose any
-#     terms on the Work that restrict the terms of this License or the
-#     ability of the recipient of the Work to exercise the rights granted
-#     to that recipient under the terms of the License. You may not
-#     sublicense the Work. You must keep intact all notices that refer to
-#     this License and to the disclaimer of warranties with every copy of
-#     the Work You Distribute or Publicly Perform. When You Distribute or
-#     Publicly Perform the Work, You may not impose any effective
-#     technological measures on the Work that restrict the ability of a
-#     recipient of the Work from You to exercise the rights granted to
-#     that recipient under the terms of the License. This Section 4(a)
-#     applies to the Work as incorporated in a Collection, but this does
-#     not require the Collection apart from the Work itself to be made
-#     subject to the terms of this License. If You create a Collection,
-#     upon notice from any Licensor You must, to the extent practicable,
-#     remove from the Collection any credit as required by Section 4(c),
-#     as requested. If You create an Adaptation, upon notice from any
-#     Licensor You must, to the extent practicable, remove from the
-#     Adaptation any credit as required by Section 4(c), as requested.
-#  2. You may Distribute or Publicly Perform an Adaptation only under the
-#     terms of: (i) this License; (ii) a later version of this License
-#     with the same License Elements as this License; (iii) a Creative
-#     Commons jurisdiction license (either this or a later license
-#     version) that contains the same License Elements as this License
-#     (e.g., Attribution-ShareAlike 3.0 US)); (iv) a Creative Commons
-#     Compatible License. If you license the Adaptation under one of the
-#     licenses mentioned in (iv), you must comply with the terms of that
-#     license. If you license the Adaptation under the terms of any of the
-#     licenses mentioned in (i), (ii) or (iii) (the "Applicable License"),
-#     you must comply with the terms of the Applicable License generally
-#     and the following provisions: (I) You must include a copy of, or the
-#     URI for, the Applicable License with every copy of each Adaptation
-#     You Distribute or Publicly Perform; (II) You may not offer or impose
-#     any terms on the Adaptation that restrict the terms of the
-#     Applicable License or the ability of the recipient of the Adaptation
-#     to exercise the rights granted to that recipient under the terms of
-#     the Applicable License; (III) You must keep intact all notices that
-#     refer to the Applicable License and to the disclaimer of warranties
-#     with every copy of the Work as included in the Adaptation You
-#     Distribute or Publicly Perform; (IV) when You Distribute or Publicly
-#     Perform the Adaptation, You may not impose any effective
-#     technological measures on the Adaptation that restrict the ability
-#     of a recipient of the Adaptation from You to exercise the rights
-#     granted to that recipient under the terms of the Applicable License.
-#     This Section 4(b) applies to the Adaptation as incorporated in a
-#     Collection, but this does not require the Collection apart from the
-#     Adaptation itself to be made subject to the terms of the Applicable
-#     License.
-#  3. If You Distribute, or Publicly Perform the Work or any Adaptations
-#     or Collections, You must, unless a request has been made pursuant to
-#     Section 4(a), keep intact all copyright notices for the Work and
-#     provide, reasonable to the medium or means You are utilizing: (i)
-#     the name of the Original Author (or pseudonym, if applicable) if
-#     supplied, and/or if the Original Author and/or Licensor designate
-#     another party or parties (e.g., a sponsor institute, publishing
-#     entity, journal) for attribution ("Attribution Parties") in
-#     Licensor's copyright notice, terms of service or by other reasonable
-#     means, the name of such party or parties; (ii) the title of the Work
-#     if supplied; (iii) to the extent reasonably practicable, the URI, if
-#     any, that Licensor specifies to be associated with the Work, unless
-#     such URI does not refer to the copyright notice or licensing
-#     information for the Work; and (iv) , consistent with Ssection 3(b),
-#     in the case of an Adaptation, a credit identifying the use of the
-#     Work in the Adaptation (e.g., "French translation of the Work by
-#     Original Author," or "Screenplay based on original Work by Original
-#     Author"). The credit required by this Section 4(c) may be
-#     implemented in any reasonable manner; provided, however, that in the
-#     case of a Adaptation or Collection, at a minimum such credit will
-#     appear, if a credit for all contributing authors of the Adaptation
-#     or Collection appears, then as part of these credits and in a manner
-#     at least as prominent as the credits for the other contributing
-#     authors. For the avoidance of doubt, You may only use the credit
-#     required by this Section for the purpose of attribution in the
-#     manner set out above and, by exercising Your rights under this
-#     License, You may not implicitly or explicitly assert or imply any
-#     connection with, sponsorship or endorsement by the Original Author,
-#     Licensor and/or Attribution Parties, as appropriate, of You or Your
-#     use of the Work, without the separate, express prior written
-#     permission of the Original Author, Licensor and/or Attribution Parties.
-#  4. Except as otherwise agreed in writing by the Licensor or as may be
-#     otherwise permitted by applicable law, if You Reproduce, Distribute
-#     or Publicly Perform the Work either by itself or as part of any
-#     Adaptations or Collections, You must not distort, mutilate, modify
-#     or take other derogatory action in relation to the Work which would
-#     be prejudicial to the Original Author's honor or reputation.
-#     Licensor agrees that in those jurisdictions (e.g. Japan), in which
-#     any exercise of the right granted in Section 3(b) of this License
-#     (the right to make Adaptations) would be deemed to be a distortion,
-#     mutilation, modification or other derogatory action prejudicial to
-#     the Original Author's honor and reputation, the Licensor will waive
-#     or not assert, as appropriate, this Section, to the fullest extent
-#     permitted by the applicable national law, to enable You to
-#     reasonably exercise Your right under Section 3(b) of this License
-#     (right to make Adaptations) but not otherwise.
-#
-# *5. Representations, Warranties and Disclaimer*
-#
-# UNLESS OTHERWISE MUTUALLY AGREED TO BY THE PARTIES IN WRITING, LICENSOR
-# OFFERS THE WORK AS-IS AND MAKES NO REPRESENTATIONS OR WARRANTIES OF ANY
-# KIND CONCERNING THE WORK, EXPRESS, IMPLIED, STATUTORY OR OTHERWISE,
-# INCLUDING, WITHOUT LIMITATION, WARRANTIES OF TITLE, MERCHANTIBILITY,
-# FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT, OR THE ABSENCE OF
-# LATENT OR OTHER DEFECTS, ACCURACY, OR THE PRESENCE OF ABSENCE OF ERRORS,
-# WHETHER OR NOT DISCOVERABLE. SOME JURISDICTIONS DO NOT ALLOW THE
-# EXCLUSION OF IMPLIED WARRANTIES, SO SUCH EXCLUSION MAY NOT APPLY TO YOU.
-#
-# *6. Limitation on Liability.* EXCEPT TO THE EXTENT REQUIRED BY
-# APPLICABLE LAW, IN NO EVENT WILL LICENSOR BE LIABLE TO YOU ON ANY LEGAL
-# THEORY FOR ANY SPECIAL, INCIDENTAL, CONSEQUENTIAL, PUNITIVE OR EXEMPLARY
-# DAMAGES ARISING OUT OF THIS LICENSE OR THE USE OF THE WORK, EVEN IF
-# LICENSOR HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
-#
-# *7. Termination*
-#
-#  1. This License and the rights granted hereunder will terminate
-#     automatically upon any breach by You of the terms of this License.
-#     Individuals or entities who have received Adaptations or Collections
-#     from You under this License, however, will not have their licenses
-#     terminated provided such individuals or entities remain in full
-#     compliance with those licenses. Sections 1, 2, 5, 6, 7, and 8 will
-#     survive any termination of this License.
-#  2. Subject to the above terms and conditions, the license granted here
-#     is perpetual (for the duration of the applicable copyright in the
-#     Work). Notwithstanding the above, Licensor reserves the right to
-#     release the Work under different license terms or to stop
-#     distributing the Work at any time; provided, however that any such
-#     election will not serve to withdraw this License (or any other
-#     license that has been, or is required to be, granted under the terms
-#     of this License), and this License will continue in full force and
-#     effect unless terminated as stated above.
-#
-# *8. Miscellaneous*
-#
-#  1. Each time You Distribute or Publicly Perform the Work or a
-#     Collection, the Licensor offers to the recipient a license to the
-#     Work on the same terms and conditions as the license granted to You
-#     under this License.
-#  2. Each time You Distribute or Publicly Perform an Adaptation, Licensor
-#     offers to the recipient a license to the original Work on the same
-#     terms and conditions as the license granted to You under this License.
-#  3. If any provision of this License is invalid or unenforceable under
-#     applicable law, it shall not affect the validity or enforceability
-#     of the remainder of the terms of this License, and without further
-#     action by the parties to this agreement, such provision shall be
-#     reformed to the minimum extent necessary to make such provision
-#     valid and enforceable.
-#  4. No term or provision of this License shall be deemed waived and no
-#     breach consented to unless such waiver or consent shall be in
-#     writing and signed by the party to be charged with such waiver or
-#     consent.
-#  5. This License constitutes the entire agreement between the parties
-#     with respect to the Work licensed here. There are no understandings,
-#     agreements or representations with respect to the Work not specified
-#     here. Licensor shall not be bound by any additional provisions that
-#     may appear in any communication from You. This License may not be
-#     modified without the mutual written agreement of the Licensor and You.
-#  6. The rights granted under, and the subject matter referenced, in this
-#     License were drafted utilizing the terminology of the Berne
-#     Convention for the Protection of Literary and Artistic Works (as
-#     amended on September 28, 1979), the Rome Convention of 1961, the
-#     WIPO Copyright Treaty of 1996, the WIPO Performances and Phonograms
-#     Treaty of 1996 and the Universal Copyright Convention (as revised on
-#     July 24, 1971). These rights and subject matter take effect in the
-#     relevant jurisdiction in which the License terms are sought to be
-#     enforced according to the corresponding provisions of the
-#     implementation of those treaty provisions in the applicable national
-#     law. If the standard suite of rights granted under applicable
-#     copyright law includes additional rights not granted under this
-#     License, such additional rights are deemed to be included in the
-#     License; this License is not intended to restrict the license of any
-#     rights under applicable law.
-acizane->âcizane
-alamanya->almanya
-aferim->aferin
-agrasif->agresif
-ağostos->ağustos
-ahret->ahiret
-ayle->aile
-alarım->alarm
-atmış->altmış
-alemiyon->alüminyum
-amarika->amerika
-anfi->amfi
-aparetif->aperitif
-arabeks->arabesk
-artiz->artist
-aşşağı->aşağı
-ahçı->aşçı
-avut->aut
-ayakıbı->ayakkabı
-azarbeycan->azerbaycan
-azerbeycan->azerbaycan
-avusturalya->avustralya
-bangledeş->bangladeş
-pıçak->bıçak
-bilmukavele->bilmukabele
-birşey->bir şey
-bir kaç->birkaç
-bir çok->birçok
-pisiklet->bisiklet
-püsküüt->bisküvi
-canbaz->cambaz
-çoçuk->çocuk
-çoşku->coşku
-cıplak->çıplak
-çiflik->çiftlik
-çünki->çünkü
-dekarasyon->dekorasyon
-debrem->deprem
-dohtor->doktor
-doktur->doktor
-doktör->doktor
-tiken->diken
-dinazor->dinozor
-diplamat->diplomat
-distibütör->distribütör
-dinayet->diyanet
-domat->domates
-domtiz->domates
-domatis->domates
-domatiz->domates
-döküman->doküman
-döndermek->döndürmek
-dükkan->dükkân
-tukkan->dükkân
-egsos->egzoz
-egsoz->egzoz
-egsozt->egzoz
-egzos->egzoz
-egzost->egzoz
-eksos->egzoz
-eksoz->egzoz
-eksozt->egzoz
-ekzos->egzoz
-ekzost->egzoz
-eşki->ekşi
-eylence->eğlence
-elenktirik->elektrik
-elenktrik->elektrik
-elektirik->elektrik
-entellektüel->entelektüel
-aşortman->eşofman
-eşortman->eşofman
-felan->falan
-filim->film
-formil->formül
-gardırop->gardrop
-gardolap->gardrop
-gaste->gazete
-goometri->geometri
-girişgen->girişken
-greyfirut->greyfurt
-greyfrut->greyfurt
-gürcüstan->gürcistan
-güzelgah->güzergâh
-güzergah->güzergâh
-harfiyat->hafriyat
-hastene->hastane
-havunç->havuç
-herhangibir->herhangi bir
-herşey->her şey,her şey
-haparlör->hoparlör
-hopollo->hoparlör
-hoporlör->hoparlör
-operlo->hoparlör
-operlor->hoparlör
-hakkari->hakkâri
-heralda->herhalde
-herkez->herkes
-#hiç bir->hiçbir
-hiç birşey->hiçbir şey
-hükümet->hükûmet
-holanda->hollanda
-istakoz->ıstakoz
-imkan->imkân
-imlâ->imla
-inkilap->inkılap
-insiyatif->inisiyatif
-iskan->iskân
-ıstanbul->istanbul
-istambul->istanbul
-istinâden->istinaden
-itibariyle->itibarıyla
-celatin->jelatin
-capon->Japon
-ceton->jeton
-jöton->jeton
-kağıt->kâğıt
-kağat->kâğıt
-kayfaltı->kahvaltı
-gahfe->kahve
-gayfe->kahve
-kaave->kahve
-kayfe->kahve
-kave->kahve
-gangren->kangren
-kankıran->kangren
-karekter->karakter
-kaysı->kayısı
-kebelek->kelebek
-keşki->keşke
-kırahatane->kıraathane
-kirbit->kibrit
-kipri->kirpi
-kiprik->kirpik,kirpik
-kokreç->kokoreç
-komonis->komünist
-komonist->komünist
-komonizm->komünizm
-kontür->kontör
-kopye->kopya
-kareografi->koreografi
-gipür->kupür
-küpür->kupür
-lahap->lakap
-leplepi->leblebi
-nalet->lanet
-leyen->leğen
-liğen->leğen
-liyen->leğen
-lüx->lüks
-makadonya->makedonya
-makina->makine
-maaşallah->maşallah
-matamatik->matematik
-menejer->menajer
-menapoz->menopoz
-mentalite->mantalite
-meraba->merhaba
-meyva->meyve
-mihendis->mühendis
-moğalistan->moğolistan
-müdehale->müdahale
-münübüs->minibüs
-müracat->müracaat
-mütahit->müteahhit
-mütevazi->mütevazı
-nacizane->naçizane
-laylon->naylon
-nufüs->nüfus
-nülüfer->nilüfer
-netekim->nitekim
-oce->oje
-okşizen->oksijen
-orjinal->orijinal
-otibis->otobüs
-#öğe->öge
-ötenazi->ötanazi
-palyanço->palyaço
-panaroma->panorama
-pantalon->pantolon
-pattes->patates
-pattis->patates
-peçeta->peçete
-penbe->pembe
-pelisilin->penilisin
-poaça->poğaça
-pohaça->poğaça
-poğçe->poğaça
-pırofösör->profesör
-prefesör->profesör
-profösör->profesör
-profütür->profiterol
-proğram->program
-promasyon->promosyon
-radyosyon->radyasyon
-romenya->romanya
-ruc->ruj
-sandaviç->sandviç
-sandeviç->sandviç
-sandoviç->sandviç
-sandöviç->sandviç
-sarmısak->sarımsak
-sarumsak->sarımsak
-satlık->satılık
-santranç->satranç
-santraç->satranç
-satraç->satranç
-skayner->scanner
-zebze->sebze
-seramoni->seremoni
-seromoni->seremoni
-sikorta->sigorta
-sinama->sinema
-siyasî->siyasi
-sıkandal->skandal
-sovan->soğan
-sosyel->sosyal
-sitretoskop->stetoskop
-siteteskop->stetoskop
-süpriz->sürpriz
-südyen->sütyen
-şartel->şalter
-şaltel->şalter
-şarz->şarj
-şindi->şimdi
-şöfer->şoför
-şöför->şoför
-tetbir->tedbir
-temis->temiz
-telafuz->telaffuz
-tenefüs->teneffüs
-tellik->terlik
-tranvay->tramvay
-törörist->terörist
-teşebüs->teşebbüs
-teşeppüs->teşebbüs
-tiskinmek->tiksinmek
-tos->tost
-tükrük->tükürük
-tüprük->tükürük
-traş->tıraş
-türkiya->türkiye
-ukele->ukala
-ükela->ukala
-ukranya->ukrayna
-ukrayin->ukrayna
-ünvan->unvan
-üçken->üçgen
-vucüt->vücut
-vucud->vücut
-vürüs->virüs
-fites->vites
-valeybol->voleybol
-veleybol->voleybol
-yada->ya da
-yanlız->yalnız
-yannış->yanlış
-yalnış->yanlış
-yimek->yemek
-yeni zellanda->yeni zelanda
-gine->yine
-zerafet->zarafet
diff --git a/find_java/.gitignore b/find_java/.gitignore
deleted file mode 100644
index d15bd0c..0000000
--- a/find_java/.gitignore
+++ /dev/null
@@ -1,6 +0,0 @@
-images/find_java_icon.o
-*.ncb
-*.suo
-*.user
-Debug
-Release
diff --git a/find_java/NOTICE b/find_java/NOTICE
deleted file mode 100644
index 7317ae2..0000000
--- a/find_java/NOTICE
+++ /dev/null
@@ -1,190 +0,0 @@
-
-   Copyright (c) 2005-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.
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
-
-
-                                 Apache License
-                           Version 2.0, January 2004
-                        http://www.apache.org/licenses/
-
-   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
-   1. Definitions.
-
-      "License" shall mean the terms and conditions for use, reproduction,
-      and distribution as defined by Sections 1 through 9 of this document.
-
-      "Licensor" shall mean the copyright owner or entity authorized by
-      the copyright owner that is granting the License.
-
-      "Legal Entity" shall mean the union of the acting entity and all
-      other entities that control, are controlled by, or are under common
-      control with that entity. For the purposes of this definition,
-      "control" means (i) the power, direct or indirect, to cause the
-      direction or management of such entity, whether by contract or
-      otherwise, or (ii) ownership of fifty percent (50%) or more of the
-      outstanding shares, or (iii) beneficial ownership of such entity.
-
-      "You" (or "Your") shall mean an individual or Legal Entity
-      exercising permissions granted by this License.
-
-      "Source" form shall mean the preferred form for making modifications,
-      including but not limited to software source code, documentation
-      source, and configuration files.
-
-      "Object" form shall mean any form resulting from mechanical
-      transformation or translation of a Source form, including but
-      not limited to compiled object code, generated documentation,
-      and conversions to other media types.
-
-      "Work" shall mean the work of authorship, whether in Source or
-      Object form, made available under the License, as indicated by a
-      copyright notice that is included in or attached to the work
-      (an example is provided in the Appendix below).
-
-      "Derivative Works" shall mean any work, whether in Source or Object
-      form, that is based on (or derived from) the Work and for which the
-      editorial revisions, annotations, elaborations, or other modifications
-      represent, as a whole, an original work of authorship. For the purposes
-      of this License, Derivative Works shall not include works that remain
-      separable from, or merely link (or bind by name) to the interfaces of,
-      the Work and Derivative Works thereof.
-
-      "Contribution" shall mean any work of authorship, including
-      the original version of the Work and any modifications or additions
-      to that Work or Derivative Works thereof, that is intentionally
-      submitted to Licensor for inclusion in the Work by the copyright owner
-      or by an individual or Legal Entity authorized to submit on behalf of
-      the copyright owner. For the purposes of this definition, "submitted"
-      means any form of electronic, verbal, or written communication sent
-      to the Licensor or its representatives, including but not limited to
-      communication on electronic mailing lists, source code control systems,
-      and issue tracking systems that are managed by, or on behalf of, the
-      Licensor for the purpose of discussing and improving the Work, but
-      excluding communication that is conspicuously marked or otherwise
-      designated in writing by the copyright owner as "Not a Contribution."
-
-      "Contributor" shall mean Licensor and any individual or Legal Entity
-      on behalf of whom a Contribution has been received by Licensor and
-      subsequently incorporated within the Work.
-
-   2. Grant of Copyright License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      copyright license to reproduce, prepare Derivative Works of,
-      publicly display, publicly perform, sublicense, and distribute the
-      Work and such Derivative Works in Source or Object form.
-
-   3. Grant of Patent License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      (except as stated in this section) patent license to make, have made,
-      use, offer to sell, sell, import, and otherwise transfer the Work,
-      where such license applies only to those patent claims licensable
-      by such Contributor that are necessarily infringed by their
-      Contribution(s) alone or by combination of their Contribution(s)
-      with the Work to which such Contribution(s) was submitted. If You
-      institute patent litigation against any entity (including a
-      cross-claim or counterclaim in a lawsuit) alleging that the Work
-      or a Contribution incorporated within the Work constitutes direct
-      or contributory patent infringement, then any patent licenses
-      granted to You under this License for that Work shall terminate
-      as of the date such litigation is filed.
-
-   4. Redistribution. You may reproduce and distribute copies of the
-      Work or Derivative Works thereof in any medium, with or without
-      modifications, and in Source or Object form, provided that You
-      meet the following conditions:
-
-      (a) You must give any other recipients of the Work or
-          Derivative Works a copy of this License; and
-
-      (b) You must cause any modified files to carry prominent notices
-          stating that You changed the files; and
-
-      (c) You must retain, in the Source form of any Derivative Works
-          that You distribute, all copyright, patent, trademark, and
-          attribution notices from the Source form of the Work,
-          excluding those notices that do not pertain to any part of
-          the Derivative Works; and
-
-      (d) If the Work includes a "NOTICE" text file as part of its
-          distribution, then any Derivative Works that You distribute must
-          include a readable copy of the attribution notices contained
-          within such NOTICE file, excluding those notices that do not
-          pertain to any part of the Derivative Works, in at least one
-          of the following places: within a NOTICE text file distributed
-          as part of the Derivative Works; within the Source form or
-          documentation, if provided along with the Derivative Works; or,
-          within a display generated by the Derivative Works, if and
-          wherever such third-party notices normally appear. The contents
-          of the NOTICE file are for informational purposes only and
-          do not modify the License. You may add Your own attribution
-          notices within Derivative Works that You distribute, alongside
-          or as an addendum to the NOTICE text from the Work, provided
-          that such additional attribution notices cannot be construed
-          as modifying the License.
-
-      You may add Your own copyright statement to Your modifications and
-      may provide additional or different license terms and conditions
-      for use, reproduction, or distribution of Your modifications, or
-      for any such Derivative Works as a whole, provided Your use,
-      reproduction, and distribution of the Work otherwise complies with
-      the conditions stated in this License.
-
-   5. Submission of Contributions. Unless You explicitly state otherwise,
-      any Contribution intentionally submitted for inclusion in the Work
-      by You to the Licensor shall be under the terms and conditions of
-      this License, without any additional terms or conditions.
-      Notwithstanding the above, nothing herein shall supersede or modify
-      the terms of any separate license agreement you may have executed
-      with Licensor regarding such Contributions.
-
-   6. Trademarks. This License does not grant permission to use the trade
-      names, trademarks, service marks, or product names of the Licensor,
-      except as required for reasonable and customary use in describing the
-      origin of the Work and reproducing the content of the NOTICE file.
-
-   7. Disclaimer of Warranty. Unless required by applicable law or
-      agreed to in writing, Licensor provides the Work (and each
-      Contributor provides its Contributions) on an "AS IS" BASIS,
-      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
-      implied, including, without limitation, any warranties or conditions
-      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
-      PARTICULAR PURPOSE. You are solely responsible for determining the
-      appropriateness of using or redistributing the Work and assume any
-      risks associated with Your exercise of permissions under this License.
-
-   8. Limitation of Liability. In no event and under no legal theory,
-      whether in tort (including negligence), contract, or otherwise,
-      unless required by applicable law (such as deliberate and grossly
-      negligent acts) or agreed to in writing, shall any Contributor be
-      liable to You for damages, including any direct, indirect, special,
-      incidental, or consequential damages of any character arising as a
-      result of this License or out of the use or inability to use the
-      Work (including but not limited to damages for loss of goodwill,
-      work stoppage, computer failure or malfunction, or any and all
-      other commercial damages or losses), even if such Contributor
-      has been advised of the possibility of such damages.
-
-   9. Accepting Warranty or Additional Liability. While redistributing
-      the Work or Derivative Works thereof, You may choose to offer,
-      and charge a fee for, acceptance of support, warranty, indemnity,
-      or other liability obligations and/or rights consistent with this
-      License. However, in accepting such obligations, You may act only
-      on Your own behalf and on Your sole responsibility, not on behalf
-      of any other Contributor, and only if You agree to indemnify,
-      defend, and hold each Contributor harmless for any liability
-      incurred by, or claims asserted against, such Contributor by reason
-      of your accepting any such warranty or additional liability.
-
-   END OF TERMS AND CONDITIONS
-
diff --git a/find_java/build.gradle b/find_java/build.gradle
deleted file mode 100644
index b359e0a..0000000
--- a/find_java/build.gradle
+++ /dev/null
@@ -1,47 +0,0 @@
-apply plugin: 'cpp'
-apply plugin: 'sdk-files'
-apply plugin: 'windows-setup'
-
-executables {
-    findJava {}
-}
-
-sources {
-    findJava {
-        cpp {
-            source {
-                srcDir "src/source"
-                include "**/*.cpp"
-            }
-        }
-    }
-}
-
-sdk {
-    windows {
-        item( { getExeName("windows32FindJavaExecutable") } ) {
-            into 'lib'
-            name 'find_java32.exe'
-            builtBy 'windows32FindJavaExecutable'
-            notice 'NOTICE'
-        }
-        item( { getExeName("windows64FindJavaExecutable") } ) {
-            into 'lib'
-            name 'find_java64.exe'
-            builtBy 'windows64FindJavaExecutable'
-            notice 'NOTICE'
-        }
-        item('find_java.bat') {
-            into 'lib'
-            notice 'NOTICE'
-        }
-    }
-}
-
-def getExeName(String name) {
-    // binaries will return a set of binaries
-    def binaries = executables.findJava.binaries.matching { it.name == name }
-    // calling .exeFile on the set returns an array with the result from each item in the set...
-    return binaries.executableFile.get(0)
-}
-
diff --git a/find_java/find_java.bat b/find_java/find_java.bat
deleted file mode 100755
index 01367c1..0000000
--- a/find_java/find_java.bat
+++ /dev/null
@@ -1,68 +0,0 @@
-@echo off
-rem Copyright (C) 2007 The Android Open Source Project
-rem
-rem Licensed under the Apache License, Version 2.0 (the "License");
-rem you may not use this file except in compliance with the License.
-rem You may obtain a copy of the License at
-rem
-rem      http://www.apache.org/licenses/LICENSE-2.0
-rem
-rem Unless required by applicable law or agreed to in writing, software
-rem distributed under the License is distributed on an "AS IS" BASIS,
-rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-rem See the License for the specific language governing permissions and
-rem limitations under the License.
-
-rem This script is called by the other batch files to find a suitable Java.exe
-rem to use. The script changes the "java_exe" env variable. The variable
-rem is left unset if Java.exe was not found.
-
-rem Useful links:
-rem Command-line reference:
-rem   http://technet.microsoft.com/en-us/library/bb490890.aspx
-
-rem Query whether this system is 32-bit or 64-bit
-rem Note: Some users report that reg.exe is missing on their machine, so we
-rem check for that first, as we'd like to use it if we can.
-set sys_32=%SYSTEMROOT%\system32
-if exist %sys_32%\reg.exe (
-    rem This first-pass solution returns the correct architecture even if you
-    rem call this .bat file from a 32-bit process.
-    rem See also: http://stackoverflow.com/a/24590583/1299302
-    %sys_32%\reg query "HKLM\Hardware\Description\System\CentralProcessor\0"^
-    | %sys_32%\find /i "x86" > NUL && set arch_ext=32|| set arch_ext=64
-) else (
-    rem This fallback approach is simpler, but may misreport your architecture as
-    rem 32-bit if running from a 32-bit process. Still, it should serve to help
-    rem our users without reg.exe, at least.
-    if "%PROCESSOR_ARCHITECTURE%" == "x86" (set arch_ext=32) else (set arch_ext=64)
-)
-
-rem Check we have a valid Java.exe in the path. The return code will
-rem be 0 if the command worked or 1 if the exec failed (program not found).
-for /f "delims=" %%a in ('"%~dps0\find_java%arch_ext%.exe" -s') do set java_exe=%%a
-if not defined java_exe goto :CheckFailed
-
-:SearchJavaW
-rem Check if we can find a javaw.exe at the same location than java.exe.
-rem If that doesn't work, just fall back on the java.exe we just found.
-for /f "delims=" %%a in ('"%~dps0\find_java%arch_ext%.exe" -s -w') do set javaw_exe=%%a
-if not exist "%javaw_exe%" set javaw_exe=%java_exe%
-goto :EOF
-
-
-:CheckFailed
-echo.
-echo ERROR: No suitable Java found. In order to properly use the Android Developer
-echo Tools, you need a suitable version of Java JDK installed on your system.
-echo We recommend that you install the JDK version of JavaSE, available here:
-echo   http://www.oracle.com/technetwork/java/javase/downloads
-echo.
-echo If you already have Java installed, you can define the JAVA_HOME environment
-echo variable in Control Panel / System / Avanced System Settings to point to the
-echo JDK folder.
-echo.
-echo You can find the complete Android SDK requirements here:
-echo   http://developer.android.com/sdk/requirements.html
-echo.
-goto :EOF
diff --git a/find_java/find_java.exe.manifest b/find_java/find_java.exe.manifest
deleted file mode 100755
index d949f07..0000000
--- a/find_java/find_java.exe.manifest
+++ /dev/null
@@ -1,33 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-
-<!--
-  For details on the Assembly Manifest, please look here:
-  http://msdn.microsoft.com/en-us/library/aa374191(VS.85).aspx
--->
-
-<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
-
-    <application>
-        <!--The ID below indicates application support for Windows Vista -->
-        <supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}" />
-        <!--The ID below indicates application support for Windows 7 -->
-        <supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}" />
-    </application>
-
-    <assemblyIdentity version="1.0.0.0"
-        processorArchitecture="x86"
-        name="Android.SDK.FindJava"
-        type="win32"
-        />
-
-    <description>Utility to find java.exe on the local system.</description>
-
-    <!-- Identify the application security requirements. -->
-    <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
-        <security>
-            <requestedPrivileges>
-                <requestedExecutionLevel level="asInvoker" uiAccess="false" />
-            </requestedPrivileges>
-        </security>
-    </trustInfo>
-</assembly>
diff --git a/find_java/find_java.sln b/find_java/find_java.sln
deleted file mode 100755
index 510ab9b..0000000
--- a/find_java/find_java.sln
+++ /dev/null
@@ -1,56 +0,0 @@
-﻿
-Microsoft Visual Studio Solution File, Format Version 11.00
-# Visual Studio 2010
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "FindJavaLib", "find_java_lib.vcxproj", "{D194C98B-3FA4-4DAB-908A-16C03C15EC35}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "FindJavaExe", "find_java_exe.vcxproj", "{F116176E-AE3E-42E6-9249-663F49FAAFAE}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "FindLock", "..\find_lock\find_lock_exe.vcxproj", "{42701EC1-6226-47FD-8817-57A3DEC7A1E2}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "sdklauncher", "..\sdklauncher\sdklauncher.vcxproj", "{331EADA4-DC19-429D-AAD0-5B9632B4CBC1}"
-EndProject
-Global
-	GlobalSection(SolutionConfigurationPlatforms) = preSolution
-		Debug|Win32 = Debug|Win32
-		Debug|Win64 = Debug|Win64
-		Release|Win32 = Release|Win32
-		Release|Win64 = Release|Win64
-	EndGlobalSection
-	GlobalSection(ProjectConfigurationPlatforms) = postSolution
-		{D194C98B-3FA4-4DAB-908A-16C03C15EC35}.Debug|Win32.ActiveCfg = Debug|Win32
-		{D194C98B-3FA4-4DAB-908A-16C03C15EC35}.Debug|Win32.Build.0 = Debug|Win32
-		{D194C98B-3FA4-4DAB-908A-16C03C15EC35}.Debug|Win64.ActiveCfg = Debug|x64
-		{D194C98B-3FA4-4DAB-908A-16C03C15EC35}.Debug|Win64.Build.0 = Debug|x64
-		{D194C98B-3FA4-4DAB-908A-16C03C15EC35}.Release|Win32.ActiveCfg = Release|Win32
-		{D194C98B-3FA4-4DAB-908A-16C03C15EC35}.Release|Win32.Build.0 = Release|Win32
-		{D194C98B-3FA4-4DAB-908A-16C03C15EC35}.Release|Win64.ActiveCfg = Release|x64
-		{D194C98B-3FA4-4DAB-908A-16C03C15EC35}.Release|Win64.Build.0 = Release|x64
-		{F116176E-AE3E-42E6-9249-663F49FAAFAE}.Debug|Win32.ActiveCfg = Debug|Win32
-		{F116176E-AE3E-42E6-9249-663F49FAAFAE}.Debug|Win32.Build.0 = Debug|Win32
-		{F116176E-AE3E-42E6-9249-663F49FAAFAE}.Debug|Win64.ActiveCfg = Debug|x64
-		{F116176E-AE3E-42E6-9249-663F49FAAFAE}.Debug|Win64.Build.0 = Debug|x64
-		{F116176E-AE3E-42E6-9249-663F49FAAFAE}.Release|Win32.ActiveCfg = Release|Win32
-		{F116176E-AE3E-42E6-9249-663F49FAAFAE}.Release|Win32.Build.0 = Release|Win32
-		{F116176E-AE3E-42E6-9249-663F49FAAFAE}.Release|Win64.ActiveCfg = Release|x64
-		{F116176E-AE3E-42E6-9249-663F49FAAFAE}.Release|Win64.Build.0 = Release|x64
-		{42701EC1-6226-47FD-8817-57A3DEC7A1E2}.Debug|Win32.ActiveCfg = Debug|Win32
-		{42701EC1-6226-47FD-8817-57A3DEC7A1E2}.Debug|Win32.Build.0 = Debug|Win32
-		{42701EC1-6226-47FD-8817-57A3DEC7A1E2}.Debug|Win64.ActiveCfg = Debug|x64
-		{42701EC1-6226-47FD-8817-57A3DEC7A1E2}.Debug|Win64.Build.0 = Debug|x64
-		{42701EC1-6226-47FD-8817-57A3DEC7A1E2}.Release|Win32.ActiveCfg = Release|Win32
-		{42701EC1-6226-47FD-8817-57A3DEC7A1E2}.Release|Win32.Build.0 = Release|Win32
-		{42701EC1-6226-47FD-8817-57A3DEC7A1E2}.Release|Win64.ActiveCfg = Release|x64
-		{42701EC1-6226-47FD-8817-57A3DEC7A1E2}.Release|Win64.Build.0 = Release|x64
-		{331EADA4-DC19-429D-AAD0-5B9632B4CBC1}.Debug|Win32.ActiveCfg = Debug|Win32
-		{331EADA4-DC19-429D-AAD0-5B9632B4CBC1}.Debug|Win32.Build.0 = Debug|Win32
-		{331EADA4-DC19-429D-AAD0-5B9632B4CBC1}.Debug|Win64.ActiveCfg = Debug|x64
-		{331EADA4-DC19-429D-AAD0-5B9632B4CBC1}.Debug|Win64.Build.0 = Debug|x64
-		{331EADA4-DC19-429D-AAD0-5B9632B4CBC1}.Release|Win32.ActiveCfg = Release|Win32
-		{331EADA4-DC19-429D-AAD0-5B9632B4CBC1}.Release|Win32.Build.0 = Release|Win32
-		{331EADA4-DC19-429D-AAD0-5B9632B4CBC1}.Release|Win64.ActiveCfg = Release|x64
-		{331EADA4-DC19-429D-AAD0-5B9632B4CBC1}.Release|Win64.Build.0 = Release|x64
-	EndGlobalSection
-	GlobalSection(SolutionProperties) = preSolution
-		HideSolutionNode = FALSE
-	EndGlobalSection
-EndGlobal
diff --git a/find_java/find_java_exe.vcxproj b/find_java/find_java_exe.vcxproj
deleted file mode 100644
index 67ebf71..0000000
--- a/find_java/find_java_exe.vcxproj
+++ /dev/null
@@ -1,174 +0,0 @@
-﻿<?xml version="1.0" encoding="utf-8"?>
-<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <ItemGroup Label="ProjectConfigurations">
-    <ProjectConfiguration Include="Debug|Win32">
-      <Configuration>Debug</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Debug|x64">
-      <Configuration>Debug</Configuration>
-      <Platform>x64</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Release|Win32">
-      <Configuration>Release</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Release|x64">
-      <Configuration>Release</Configuration>
-      <Platform>x64</Platform>
-    </ProjectConfiguration>
-  </ItemGroup>
-  <PropertyGroup Label="Globals">
-    <ProjectName>FindJavaExe</ProjectName>
-    <ProjectGuid>{F116176E-AE3E-42E6-9249-663F49FAAFAE}</ProjectGuid>
-    <RootNamespace>FindJavaExe</RootNamespace>
-    <Keyword>Win32Proj</Keyword>
-  </PropertyGroup>
-  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <CharacterSet>MultiByte</CharacterSet>
-    <WholeProgramOptimization>true</WholeProgramOptimization>
-    <UseOfMfc>Static</UseOfMfc>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <CharacterSet>MultiByte</CharacterSet>
-    <WholeProgramOptimization>true</WholeProgramOptimization>
-    <UseOfMfc>Static</UseOfMfc>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <CharacterSet>MultiByte</CharacterSet>
-    <UseOfMfc>Static</UseOfMfc>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <CharacterSet>MultiByte</CharacterSet>
-    <UseOfMfc>Static</UseOfMfc>
-  </PropertyGroup>
-  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
-  <ImportGroup Label="ExtensionSettings">
-  </ImportGroup>
-  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
-    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
-  </ImportGroup>
-  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
-    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
-  </ImportGroup>
-  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
-    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
-  </ImportGroup>
-  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">
-    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
-  </ImportGroup>
-  <PropertyGroup Label="UserMacros" />
-  <PropertyGroup>
-    <_ProjectFileVersion>10.0.40219.1</_ProjectFileVersion>
-    <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)..\..\out\host\windows-x86\$(Configuration)\$(ProjectName)\</OutDir>
-    <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(SolutionDir)..\..\out\host\windows-x64\$(Configuration)\$(ProjectName)\</OutDir>
-    <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)..\..\out\host\windows-x86\$(Configuration)\$(ProjectName)\</IntDir>
-    <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(SolutionDir)..\..\out\host\windows-x64\$(Configuration)\$(ProjectName)\</IntDir>
-    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</LinkIncremental>
-    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</LinkIncremental>
-    <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)..\..\out\host\windows-x86\$(Configuration)\$(ProjectName)\</OutDir>
-    <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(SolutionDir)..\..\out\host\windows-x64\$(Configuration)\$(ProjectName)\</OutDir>
-    <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)..\..\out\host\windows-x86\$(Configuration)\$(ProjectName)\</IntDir>
-    <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(SolutionDir)..\..\out\host\windows-x64\$(Configuration)\$(ProjectName)\</IntDir>
-    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>
-    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</LinkIncremental>
-    <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">find_java64</TargetName>
-    <TargetName Condition="'$(Configuration)|$(Platform)'=='Release|x64'">find_java64</TargetName>
-    <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(ProjectName)32</TargetName>
-    <TargetName Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">find_java32</TargetName>
-  </PropertyGroup>
-  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
-    <ClCompile>
-      <Optimization>Disabled</Optimization>
-      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <MinimalRebuild>true</MinimalRebuild>
-      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
-      <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
-      <PrecompiledHeader>
-      </PrecompiledHeader>
-      <WarningLevel>Level3</WarningLevel>
-      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
-    </ClCompile>
-    <Link>
-      <GenerateDebugInformation>true</GenerateDebugInformation>
-      <SubSystem>Console</SubSystem>
-      <TargetMachine>MachineX86</TargetMachine>
-      <AdditionalDependencies>user32.lib;advapi32.lib;shell32.lib</AdditionalDependencies>
-    </Link>
-  </ItemDefinitionGroup>
-  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
-    <ClCompile>
-      <Optimization>Disabled</Optimization>
-      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
-      <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
-      <PrecompiledHeader>
-      </PrecompiledHeader>
-      <WarningLevel>Level3</WarningLevel>
-      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
-    </ClCompile>
-    <Link>
-      <GenerateDebugInformation>true</GenerateDebugInformation>
-      <SubSystem>Console</SubSystem>
-      <AdditionalDependencies>user32.lib;advapi32.lib;shell32.lib</AdditionalDependencies>
-    </Link>
-  </ItemDefinitionGroup>
-  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
-    <ClCompile>
-      <Optimization>MaxSpeed</Optimization>
-      <IntrinsicFunctions>true</IntrinsicFunctions>
-      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
-      <FunctionLevelLinking>true</FunctionLevelLinking>
-      <PrecompiledHeader>
-      </PrecompiledHeader>
-      <WarningLevel>Level3</WarningLevel>
-      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
-    </ClCompile>
-    <Link>
-      <GenerateDebugInformation>true</GenerateDebugInformation>
-      <SubSystem>Console</SubSystem>
-      <OptimizeReferences>true</OptimizeReferences>
-      <EnableCOMDATFolding>true</EnableCOMDATFolding>
-      <TargetMachine>MachineX86</TargetMachine>
-      <AdditionalDependencies>user32.lib;advapi32.lib;shell32.lib</AdditionalDependencies>
-    </Link>
-  </ItemDefinitionGroup>
-  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
-    <ClCompile>
-      <Optimization>MaxSpeed</Optimization>
-      <IntrinsicFunctions>true</IntrinsicFunctions>
-      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
-      <FunctionLevelLinking>true</FunctionLevelLinking>
-      <PrecompiledHeader>
-      </PrecompiledHeader>
-      <WarningLevel>Level3</WarningLevel>
-      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
-    </ClCompile>
-    <Link>
-      <GenerateDebugInformation>true</GenerateDebugInformation>
-      <SubSystem>Console</SubSystem>
-      <OptimizeReferences>true</OptimizeReferences>
-      <EnableCOMDATFolding>true</EnableCOMDATFolding>
-      <AdditionalDependencies>user32.lib;advapi32.lib;shell32.lib</AdditionalDependencies>
-    </Link>
-  </ItemDefinitionGroup>
-  <ItemGroup>
-    <ClCompile Include="src\source\find_java_exe.cpp" />
-    <ClCompile Include="src\source\find_java_lib.cpp" />
-    <ClCompile Include="src\source\utils.cpp" />
-  </ItemGroup>
-  <ItemGroup>
-    <ClInclude Include="src\source\find_java.h" />
-    <ClInclude Include="src\source\utils.h" />
-  </ItemGroup>
-  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
-  <ImportGroup Label="ExtensionTargets">
-  </ImportGroup>
-</Project>
\ No newline at end of file
diff --git a/find_java/find_java_exe.vcxproj.filters b/find_java/find_java_exe.vcxproj.filters
deleted file mode 100644
index 7cc0be1..0000000
--- a/find_java/find_java_exe.vcxproj.filters
+++ /dev/null
@@ -1,36 +0,0 @@
-﻿<?xml version="1.0" encoding="utf-8"?>
-<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <ItemGroup>
-    <Filter Include="Source Files">
-      <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
-      <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
-    </Filter>
-    <Filter Include="Header Files">
-      <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
-      <Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions>
-    </Filter>
-    <Filter Include="Resource Files">
-      <UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
-      <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav</Extensions>
-    </Filter>
-  </ItemGroup>
-  <ItemGroup>
-    <ClCompile Include="src\source\find_java_exe.cpp">
-      <Filter>Source Files</Filter>
-    </ClCompile>
-    <ClCompile Include="src\source\utils.cpp">
-      <Filter>Source Files</Filter>
-    </ClCompile>
-    <ClCompile Include="src\source\find_java_lib.cpp">
-      <Filter>Source Files</Filter>
-    </ClCompile>
-  </ItemGroup>
-  <ItemGroup>
-    <ClInclude Include="src\source\find_java.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="src\source\utils.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-  </ItemGroup>
-</Project>
\ No newline at end of file
diff --git a/find_java/find_java_lib.vcxproj b/find_java/find_java_lib.vcxproj
deleted file mode 100644
index 7ca3499..0000000
--- a/find_java/find_java_lib.vcxproj
+++ /dev/null
@@ -1,135 +0,0 @@
-﻿<?xml version="1.0" encoding="utf-8"?>
-<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <ItemGroup Label="ProjectConfigurations">
-    <ProjectConfiguration Include="Debug|Win32">
-      <Configuration>Debug</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Debug|x64">
-      <Configuration>Debug</Configuration>
-      <Platform>x64</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Release|Win32">
-      <Configuration>Release</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Release|x64">
-      <Configuration>Release</Configuration>
-      <Platform>x64</Platform>
-    </ProjectConfiguration>
-  </ItemGroup>
-  <PropertyGroup Label="Globals">
-    <ProjectName>FindJavaLib</ProjectName>
-    <ProjectGuid>{D194C98B-3FA4-4DAB-908A-16C03C15EC35}</ProjectGuid>
-    <RootNamespace>FindJavaLib</RootNamespace>
-    <Keyword>Win32Proj</Keyword>
-  </PropertyGroup>
-  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
-    <ConfigurationType>StaticLibrary</ConfigurationType>
-    <CharacterSet>MultiByte</CharacterSet>
-    <WholeProgramOptimization>true</WholeProgramOptimization>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
-    <ConfigurationType>StaticLibrary</ConfigurationType>
-    <CharacterSet>MultiByte</CharacterSet>
-    <WholeProgramOptimization>true</WholeProgramOptimization>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
-    <ConfigurationType>StaticLibrary</ConfigurationType>
-    <CharacterSet>MultiByte</CharacterSet>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
-    <ConfigurationType>StaticLibrary</ConfigurationType>
-    <CharacterSet>MultiByte</CharacterSet>
-  </PropertyGroup>
-  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
-  <ImportGroup Label="ExtensionSettings">
-  </ImportGroup>
-  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
-    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
-  </ImportGroup>
-  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
-    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
-  </ImportGroup>
-  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
-    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
-  </ImportGroup>
-  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">
-    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
-  </ImportGroup>
-  <PropertyGroup Label="UserMacros" />
-  <PropertyGroup>
-    <_ProjectFileVersion>10.0.40219.1</_ProjectFileVersion>
-    <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)..\..\out\host\windows-x86\$(Configuration)\$(ProjectName)\</OutDir>
-    <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(SolutionDir)..\..\out\host\windows-x64\$(Configuration)\$(ProjectName)\</OutDir>
-    <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)..\..\out\host\windows-x86\$(Configuration)\$(ProjectName)\</IntDir>
-    <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(SolutionDir)..\..\out\host\windows-x64\$(Configuration)\$(ProjectName)\</IntDir>
-    <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)..\..\out\host\windows-x86\$(Configuration)\$(ProjectName)\</OutDir>
-    <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(SolutionDir)..\..\out\host\windows-x64\$(Configuration)\$(ProjectName)\</OutDir>
-    <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)..\..\out\host\windows-x86\$(Configuration)\$(ProjectName)\</IntDir>
-    <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(SolutionDir)..\..\out\host\windows-x64\$(Configuration)\$(ProjectName)\</IntDir>
-  </PropertyGroup>
-  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
-    <ClCompile>
-      <Optimization>Disabled</Optimization>
-      <PreprocessorDefinitions>WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <MinimalRebuild>true</MinimalRebuild>
-      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
-      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
-      <PrecompiledHeader>
-      </PrecompiledHeader>
-      <WarningLevel>Level3</WarningLevel>
-      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
-    </ClCompile>
-  </ItemDefinitionGroup>
-  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
-    <ClCompile>
-      <Optimization>Disabled</Optimization>
-      <PreprocessorDefinitions>WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
-      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
-      <PrecompiledHeader>
-      </PrecompiledHeader>
-      <WarningLevel>Level3</WarningLevel>
-      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
-    </ClCompile>
-  </ItemDefinitionGroup>
-  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
-    <ClCompile>
-      <Optimization>MaxSpeed</Optimization>
-      <IntrinsicFunctions>true</IntrinsicFunctions>
-      <PreprocessorDefinitions>WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
-      <FunctionLevelLinking>true</FunctionLevelLinking>
-      <PrecompiledHeader>
-      </PrecompiledHeader>
-      <WarningLevel>Level3</WarningLevel>
-      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
-    </ClCompile>
-  </ItemDefinitionGroup>
-  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
-    <ClCompile>
-      <Optimization>MaxSpeed</Optimization>
-      <IntrinsicFunctions>true</IntrinsicFunctions>
-      <PreprocessorDefinitions>WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
-      <FunctionLevelLinking>true</FunctionLevelLinking>
-      <PrecompiledHeader>
-      </PrecompiledHeader>
-      <WarningLevel>Level3</WarningLevel>
-      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
-    </ClCompile>
-  </ItemDefinitionGroup>
-  <ItemGroup>
-    <ClCompile Include="src\source\find_java_lib.cpp" />
-    <ClCompile Include="src\source\utils.cpp" />
-  </ItemGroup>
-  <ItemGroup>
-    <ClInclude Include="src\source\find_java.h" />
-    <ClInclude Include="src\source\utils.h" />
-  </ItemGroup>
-  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
-  <ImportGroup Label="ExtensionTargets">
-  </ImportGroup>
-</Project>
\ No newline at end of file
diff --git a/find_java/find_java_lib.vcxproj.filters b/find_java/find_java_lib.vcxproj.filters
deleted file mode 100644
index 4bc439b..0000000
--- a/find_java/find_java_lib.vcxproj.filters
+++ /dev/null
@@ -1,33 +0,0 @@
-﻿<?xml version="1.0" encoding="utf-8"?>
-<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <ItemGroup>
-    <Filter Include="Source Files">
-      <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
-      <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
-    </Filter>
-    <Filter Include="Header Files">
-      <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
-      <Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions>
-    </Filter>
-    <Filter Include="Resource Files">
-      <UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
-      <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav</Extensions>
-    </Filter>
-  </ItemGroup>
-  <ItemGroup>
-    <ClCompile Include="src\source\find_java_lib.cpp">
-      <Filter>Source Files</Filter>
-    </ClCompile>
-    <ClCompile Include="src\source\utils.cpp">
-      <Filter>Source Files</Filter>
-    </ClCompile>
-  </ItemGroup>
-  <ItemGroup>
-    <ClInclude Include="src\source\find_java.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="src\source\utils.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-  </ItemGroup>
-</Project>
\ No newline at end of file
diff --git a/find_java/images/android_icon.ico b/find_java/images/android_icon.ico
deleted file mode 100644
index bd25179..0000000
--- a/find_java/images/android_icon.ico
+++ /dev/null
Binary files differ
diff --git a/find_java/images/android_icon.rc b/find_java/images/android_icon.rc
deleted file mode 100644
index 7ff37f2..0000000
--- a/find_java/images/android_icon.rc
+++ /dev/null
@@ -1,2 +0,0 @@
-1 ICON "../images/android_icon.ico"
-1 RT_MANIFEST "../find_java.exe.manifest"
diff --git a/find_java/src/source/find_java.h b/find_java/src/source/find_java.h
deleted file mode 100755
index 49b5fd9..0000000
--- a/find_java/src/source/find_java.h
+++ /dev/null
@@ -1,45 +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.
- */
-
-#ifndef _H_FIND_JAVA
-#define _H_FIND_JAVA
-
-#ifdef _WIN32
-
-#include "utils.h"
-
-#define TO_JAVA_VERSION(major, minor) ((major) * 1000 + (minor))
-#define JAVA_MAJOR(version) ((version) / 1000)
-#define JAVA_MINOR(version) ((version) % 1000)
-
-// We currently search for a Java version for at least 1.6 by default
-#define MIN_JAVA_VERSION_MAJOR 1
-#define MIN_JAVA_VERSION_MINOR 6
-#define MIN_JAVA_VERSION TO_JAVA_VERSION(MIN_JAVA_VERSION_MAJOR, MIN_JAVA_VERSION_MINOR)
-
-int findJavaInPath(const CPath &path, CPath *outJavaPath, bool isJdk = false,
-    int minVersion = MIN_JAVA_VERSION);
-int findJavaInEnvPath(CPath *outJavaPath, bool isJdk = false,
-    int minVersion = MIN_JAVA_VERSION);
-int findJavaInRegistry(CPath *outJavaPath, bool isJdk = false,
-    int minVersion = MIN_JAVA_VERSION);
-int findJavaInProgramFiles(CPath *outJavaPath, bool isJdk = false,
-    int minVersion = MIN_JAVA_VERSION);
-
-bool getJavaVersion(CPath &javaPath, CString *outVersionStr, int *outVersionInt);
-
-#endif /* _WIN32 */
-#endif /* _H_FIND_JAVA */
diff --git a/find_java/src/source/find_java_exe.cpp b/find_java/src/source/find_java_exe.cpp
deleted file mode 100644
index a8be377..0000000
--- a/find_java/src/source/find_java_exe.cpp
+++ /dev/null
@@ -1,237 +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.
- */
-
-/*
- * "find_java.exe", for Windows only.
- * Tries to find a Java binary in a variety of places and prints the
- * first one found on STDOUT and returns 0.
- *
- * If not found, returns error 1 with no message
- * (unless ANDROID_SDKMAN_DEBUG or -d if set, in which case there's a message on STDERR).
- *
- * Implementation details:
- * - We don't have access to ATL or MFC.
- * - We don't want to pull in things like STL.
- * - No Unicode/MBCS support for now.
- *
- * TODO for later version:
- * - provide an env variable to let users override which version is being used.
- * - if there's more than one java.exe found, enumerate them all.
- * - and in that case take the one with the highest Java version number.
- * - since that operation is expensive, do it only once and cache the result
- *   in a temp file. If the temp file is not found or the java binary no
- *   longer exists, re-run the enumaration.
- */
-
-#ifdef _WIN32
-
-#include "utils.h"
-#include "find_java.h"
-#include <io.h>
-#include <fcntl.h>
-
-static int showHelpMessage() {
-    printf(
-        "Outputs the path of the first Java.exe found on the local system.\n"
-        "Returns code 0 when found, 1 when not found.\n"
-        "Options:\n"
-        "-h / -help       : This help.\n"
-        "-t / -test       : Internal test.\n"
-        "-e / -error      : Print an error message to the console if Java.exe isn't found.\n"
-        "-j / -jdk        : Only returns java.exe found in a JDK.\n"
-        "-s / -short      : Print path in short DOS form.\n"
-        "-p / -path `dir` : A custom path to search first. Pass in JDK base dir if -j is set.\n"
-        "-w / -javaw      : Search a matching javaw.exe; defaults to java.exe if not found.\n"
-        "-m / -minv #     : Pass in a minimum version to use (default: 1.6).\n"
-        "-v / -version: Only prints the Java version found.\n"
-    );
-    return 2;
-}
-
-static void printError(const char *message) {
-
-    CString error;
-    error.setLastWin32Error(message);
-    printf(error.cstr());
-}
-
-static void testFindJava(bool isJdk, int minVersion) {
-
-    CPath javaPath("<not found>");
-    int v = findJavaInEnvPath(&javaPath, isJdk, minVersion);
-    printf("  findJavaInEnvPath: [%d] %s\n", v, javaPath.cstr());
-
-    javaPath.set("<not found>");
-    v = findJavaInRegistry(&javaPath, isJdk, minVersion);
-    printf("  findJavaInRegistry [%d] %s\n", v, javaPath.cstr());
-
-    javaPath.set("<not found>");
-    v = findJavaInProgramFiles(&javaPath, isJdk, minVersion);
-    printf("  findJavaInProgramFiles [%d] %s\n", v, javaPath.cstr());
-}
-
-static void testFindJava(int minVersion) {
-
-    printf("Searching for version %d.%d or newer...\n", JAVA_MAJOR(minVersion),
-        JAVA_MINOR(minVersion));
-
-    printf("\n");
-    printf("Searching for any java.exe:\n");
-    testFindJava(false, minVersion);
-
-    printf("\n");
-    printf("Searching for java.exe within a JDK:\n");
-    testFindJava(true, minVersion);
-}
-
-// Returns 0 on failure or a java version on success.
-int parseMinVersionArg(char* arg) {
-
-    int versionMajor = -1;
-    int versionMinor = -1;
-    if (sscanf(arg, "%d.%d", &versionMajor, &versionMinor) != 2) {
-        // -m arg is malformatted
-        return 0;
-    }
-    return TO_JAVA_VERSION(versionMajor, versionMinor);
-}
-
-int main(int argc, char* argv[]) {
-
-    gIsConsole = true; // tell utils to to print errors to stderr
-    gIsDebug = (getenv("ANDROID_SDKMAN_DEBUG") != NULL);
-    bool doShortPath = false;
-    bool doVersion = false;
-    bool doJavaW = false;
-    bool isJdk = false;
-    bool shouldPrintError = false;
-    int minVersion = MIN_JAVA_VERSION;
-    const char *customPathStr = NULL;
-
-    for (int i = 1; i < argc; i++) {
-        if (strncmp(argv[i], "-t", 2) == 0) {
-            testFindJava(minVersion);
-            return 0;
-
-        } else if (strncmp(argv[i], "-j", 2) == 0) {
-            isJdk = true;
-
-        } else if (strncmp(argv[i], "-e", 2) == 0) {
-            shouldPrintError = true;
-
-        } else if (strncmp(argv[i], "-p", 2) == 0) {
-            i++;
-            if (i == argc) {
-                return showHelpMessage();
-            }
-            customPathStr = argv[i];
-        } else if (strncmp(argv[i], "-d", 2) == 0) {
-            gIsDebug = true;
-
-        } else if (strncmp(argv[i], "-s", 2) == 0) {
-            doShortPath = true;
-
-        } else if (strncmp(argv[i], "-v", 2) == 0) {
-            doVersion = true;
-
-        } else if (strncmp(argv[i], "-m", 2) == 0) {
-            i++;
-            if (i == argc ||
-                ((minVersion = parseMinVersionArg(argv[i])) == 0)) {
-                return showHelpMessage();
-            }
-        }
-        else if (strcmp(argv[i], "-w") == 0 || strcmp(argv[i], "-javaw") == 0) {
-            doJavaW = true;
-
-        }
-        else {
-            return showHelpMessage();
-        }
-    }
-
-    // Find the first suitable version of Java we can use.
-    CPath javaPath;
-
-    int version = 0;
-    if (customPathStr != NULL) {
-        CPath customPath(customPathStr);
-        version = findJavaInPath(customPath, &javaPath, isJdk, minVersion);
-    }
-    if (version == 0) {
-        version = findJavaInEnvPath(&javaPath, isJdk, minVersion);
-    }
-    if (version == 0) {
-        version = findJavaInRegistry(&javaPath, isJdk, minVersion);
-    }
-    if (version == 0) {
-        version = findJavaInProgramFiles(&javaPath, isJdk, minVersion);
-    }
-
-    if (version == 0) {
-        CString s;
-        s.setf("Failed to find Java %d.%d (or newer) on your system. ", JAVA_MAJOR(minVersion),
-            JAVA_MINOR(minVersion));
-
-        if (gIsDebug) {
-            fprintf(stderr, s.cstr());
-        }
-
-        if (shouldPrintError) {
-            printError(s.cstr());
-        }
-
-        return 1;
-    }
-    _ASSERT(!javaPath.isEmpty());
-
-    if (doShortPath) {
-        if (!javaPath.toShortPath(&javaPath)) {
-            CString s;
-            s.setf("Failed to convert path (%s) to a short DOS path. ", javaPath.cstr());
-            fprintf(stderr, s.cstr());
-
-            if (shouldPrintError) {
-                printError(s.cstr());
-            }
-
-            return 1;
-        }
-    }
-
-    if (doVersion) {
-        // Print version found. We already have the version as an integer
-        // so we don't need to run java -version a second time.
-        printf("%d.%d", JAVA_MAJOR(version), JAVA_MINOR(version));
-        return 0;
-    }
-
-    if (doJavaW) {
-        // Try to find a javaw.exe instead of java.exe at the same location.
-        CPath javawPath(javaPath);
-        javawPath.replaceName("java.exe", "javaw.exe");
-        // Only accept it if we can actually find the exec
-        if (javawPath.fileExists()) {
-            javaPath.set(javawPath.cstr());
-        }
-    }
-
-    // Print java.exe path found
-    printf(javaPath.cstr());
-    return 0;
-}
-
-#endif /* _WIN32 */
diff --git a/find_java/src/source/find_java_lib.cpp b/find_java/src/source/find_java_lib.cpp
deleted file mode 100755
index fe50f83..0000000
--- a/find_java/src/source/find_java_lib.cpp
+++ /dev/null
@@ -1,573 +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.
- */
-
-#ifdef _WIN32
-
-// Indicate we want at least all Windows Server 2003 (5.2) APIs.
-// Note: default is set by system/core/include/arch/windows/AndroidConfig.h to 0x0500
-// which is Win2K. However our minimum SDK tools requirement is Win XP (0x0501).
-// However we do need 0x0502 to get access to the WOW-64-32 constants for the
-// registry, except we'll need to be careful since they are not available on XP.
-#undef  _WIN32_WINNT
-#define _WIN32_WINNT 0x0502
-// Indicate we want at least all IE 5 shell APIs
-#define _WIN32_IE    0x0500
-
-#include "find_java.h"
-#include <shlobj.h>
-#include <ctype.h>
-
-// Define some types missing in MingW
-#ifndef LSTATUS
-typedef LONG LSTATUS;
-#endif
-
-// Check to see if the application is running in 32-bit or 64-bit mode. In other words, this will
-// return false if you run a 32-bit build even on a 64-bit machine.
-static bool isApplication64() {
-    SYSTEM_INFO sysInfo;
-    GetSystemInfo(&sysInfo);
-
-    // Note: The constant name here is a bit misleading, as it actually covers all 64-bit processors
-    // and not just AMD.
-    // See also: http://msdn.microsoft.com/en-us/library/windows/desktop/ms724958(v=vs.85).aspx
-    return (sysInfo.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64);
-}
-
-// Extract the first thing that looks like (digit.digit+).
-// Note: this will break when java reports a version with major > 9.
-// However it will reasonably cope with "1.10", if that ever happens.
-static bool extractJavaVersion(const char *start,
-                               int length,
-                               CString *outVersionStr,
-                               int *outVersionInt) {
-    const char *end = start + length;
-    for (const char *c = start; c < end - 2; c++) {
-        if (isdigit(c[0]) &&
-                c[1] == '.' &&
-                isdigit(c[2])) {
-            const char *e = c+2;
-            while (isdigit(e[1])) {
-                e++;
-            }
-            if (outVersionStr != NULL) {
-                outVersionStr->set(c, e - c + 1);
-            }
-            if (outVersionInt != NULL) {
-                // add major * 1000, currently only 1 digit
-                int value = (*c - '0') * 1000;
-                // add minor
-                for (int m = 1; *e != '.'; e--, m *= 10) {
-                    value += (*e - '0') * m;
-                }
-                *outVersionInt = value;
-            }
-            return true;
-        }
-    }
-    return false;
-}
-
-// Check if the passed in path is a path to a JDK
-static bool isJdkPath(const CPath &path) {
-
-    // If the files "bin/java.exe" and "lib/tools.jar" exist, we're probably a JDK.
-    CPath pathBin(path);
-    pathBin.addPath("bin");
-    pathBin.addPath("java.exe");
-
-    CPath pathTools(path);
-    pathTools.addPath("lib");
-    pathTools.addPath("tools.jar");
-
-    return (pathBin.fileExists() && pathTools.fileExists());
-}
-
-// Check whether we can find $PATH/java.exe.
-// inOutPath should be the directory where we're looking at.
-// In output, it will be the java path we tested.
-// Returns the java version integer found (e.g. 1006 for 1.6).
-// Return 0 in case of error.
-static int checkPath(CPath *inOutPath) {
-    inOutPath->addPath("java.exe");
-
-    int result = 0;
-    if (inOutPath->fileExists()) {
-        // Run java -version
-        // Reject the version if it's not at least our current minimum.
-        if (!getJavaVersion(*inOutPath, NULL /*versionStr*/, &result)) {
-            result = 0;
-        }
-    }
-
-    return result;
-}
-
-// Check whether we can find $PATH/bin/java.exe
-// Returns the Java version found (e.g. 1006 for 1.6) or 0 in case of error.
-static int checkBinPath(CPath *inOutPath) {
-    inOutPath->addPath("bin");
-    return checkPath(inOutPath);
-}
-
-// Test for the existence of java.exe in a custom path
-int findJavaInPath(const CPath &path, CPath *outJavaPath, bool isJdk, int minVersion) {
-    SetLastError(0);
-
-    int version = 0;
-    CPath temp(path);
-    if (!isJdk) {
-        version = checkPath(&temp);
-    }
-    else {
-        if (isJdkPath(temp)) {
-            version = checkBinPath(&temp);
-        }
-    }
-
-    if (version >= minVersion) {
-        if (gIsDebug) {
-            fprintf(stderr, "Java %d found in path: %s\n", version, temp.cstr());
-        }
-        *outJavaPath = temp;
-        return version;
-    }
-    return 0;
-}
-
-// Search java.exe in the environment
-int findJavaInEnvPath(CPath *outJavaPath, bool isJdk, int minVersion) {
-    SetLastError(0);
-
-    const char* envPath = getenv("JAVA_HOME");
-    if (envPath != NULL) {
-        CPath p(envPath);
-
-        if (!isJdk || isJdkPath(p)) {
-            int v = checkBinPath(&p);
-            if (v >= minVersion) {
-                if (gIsDebug) {
-                    fprintf(stderr, "Java %d found via JAVA_HOME: %s\n", v, p.cstr());
-                }
-                *outJavaPath = p;
-                // As an optimization for runtime, if we find a suitable java
-                // version in JAVA_HOME we won't waste time looking at the PATH.
-                return v;
-            }
-        }
-    }
-
-    int currVersion = 0;
-    envPath = getenv("PATH");
-    if (!envPath) return currVersion;
-
-    // Otherwise look at the entries in the current path.
-    // If we find more than one, keep the one with the highest version.
-
-    CArray<CString> *paths = CString(envPath).split(';');
-    for(int i = 0; i < paths->size(); i++) {
-        CPath p((*paths)[i].cstr());
-
-        if (isJdk && !isJdkPath(p)) {
-            continue;
-        }
-
-        int v = checkPath(&p);
-        if (v >= minVersion && v > currVersion) {
-            if (gIsDebug) {
-                fprintf(stderr, "Java %d found via env PATH: %s\n", v, p.cstr());
-            }
-
-            currVersion = v;
-            *outJavaPath = p;
-        }
-    }
-
-    delete paths;
-    return currVersion;
-}
-
-// --------------
-
-static bool getRegValue(const char *keyPath,
-                        const char *keyName,
-                        REGSAM access,
-                        CString *outValue) {
-    HKEY key;
-    LSTATUS status = RegOpenKeyExA(
-        HKEY_LOCAL_MACHINE,         // hKey
-        keyPath,                    // lpSubKey
-        0,                          // ulOptions
-        KEY_READ | access,          // samDesired,
-        &key);                      // phkResult
-    if (status == ERROR_SUCCESS) {
-
-        LSTATUS ret = ERROR_MORE_DATA;
-        DWORD size = 4096; // MAX_PATH is 260, so 4 KB should be good enough
-        char* buffer = (char*) malloc(size);
-
-        while (ret == ERROR_MORE_DATA && size < (1<<16) /*64 KB*/) {
-            ret = RegQueryValueExA(
-                key,                // hKey
-                keyName,            // lpValueName
-                NULL,               // lpReserved
-                NULL,               // lpType
-                (LPBYTE) buffer,    // lpData
-                &size);             // lpcbData
-
-            if (ret == ERROR_MORE_DATA) {
-                size *= 2;
-                buffer = (char*) realloc(buffer, size);
-            } else {
-                buffer[size] = 0;
-            }
-        }
-
-        if (ret != ERROR_MORE_DATA) outValue->set(buffer);
-
-        free(buffer);
-        RegCloseKey(key);
-
-        return (ret != ERROR_MORE_DATA);
-    }
-
-    return false;
-}
-
-// Explore the registry to find a suitable version of Java.
-// Returns an int which is the version of Java found (e.g. 1006 for 1.6) and the
-// matching path in outJavaPath.
-// Returns 0 if nothing suitable was found.
-static int exploreJavaRegistry(const char *entry, REGSAM access, int minVersion,
-    CPath *outJavaPath) {
-
-    // Let's visit HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Runtime Environment [CurrentVersion]
-    CPath rootKey("SOFTWARE\\JavaSoft\\");
-    rootKey.addPath(entry);
-
-    int versionInt = 0;
-    CString currentVersion;
-    CPath subKey(rootKey);
-    if (getRegValue(subKey.cstr(), "CurrentVersion", access, &currentVersion)) {
-        // CurrentVersion should be something like "1.7".
-        // We want to read HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Runtime Environment\1.7 [JavaHome]
-        subKey.addPath(currentVersion);
-        CPath javaHome;
-        if (getRegValue(subKey.cstr(), "JavaHome", access, &javaHome)) {
-            versionInt = checkBinPath(&javaHome);
-            if (versionInt >= 0) {
-                if (gIsDebug) {
-                    fprintf(stderr,
-                            "Java %d found via registry: %s\n",
-                            versionInt, javaHome.cstr());
-                }
-                *outJavaPath = javaHome;
-            }
-            if (versionInt >= minVersion) {
-                // Heuristic: if the current version is good enough, stop here
-                return versionInt;
-            }
-        }
-    }
-
-    // Try again, but this time look at all the versions available
-    HKEY javaHomeKey;
-    LSTATUS status = RegOpenKeyExA(
-        HKEY_LOCAL_MACHINE,         // hKey
-        "SOFTWARE\\JavaSoft",       // lpSubKey
-        0,                          // ulOptions
-        KEY_READ | access,          // samDesired
-        &javaHomeKey);              // phkResult
-    if (status == ERROR_SUCCESS) {
-        char name[256];
-        DWORD index = 0;
-        CPath javaHome;
-        for (LONG result = ERROR_SUCCESS; result == ERROR_SUCCESS; index++) {
-            DWORD nameLen = 255;
-            name[nameLen] = 0;
-            result = RegEnumKeyExA(
-                            javaHomeKey,  // hKey
-                            index,        // dwIndex
-                            name,         // lpName
-                            &nameLen,     // lpcName
-                            NULL,         // lpReserved
-                            NULL,         // lpClass
-                            NULL,         // lpcClass,
-                            NULL);        // lpftLastWriteTime
-            if (result == ERROR_SUCCESS && nameLen < 256) {
-                name[nameLen] = 0;
-                CPath subKey(rootKey);
-                subKey.addPath(name);
-
-                if (getRegValue(subKey.cstr(), "JavaHome", access, &javaHome)) {
-                    int v = checkBinPath(&javaHome);
-                    if (v > versionInt) {
-                        if (gIsDebug) {
-                            fprintf(stderr,
-                                    "Java %d found via registry: %s\n",
-                                    versionInt, javaHome.cstr());
-                        }
-                        *outJavaPath = javaHome;
-                        versionInt = v;
-                    }
-                }
-            }
-        }
-
-        RegCloseKey(javaHomeKey);
-    }
-
-    return 0;
-}
-
-static bool getMaxJavaInRegistry(const char *entry, REGSAM access, CPath *outJavaPath, int *inOutVersion) {
-    CPath path;
-    int version = exploreJavaRegistry(entry, access, *inOutVersion, &path);
-    if (version > *inOutVersion) {
-        *outJavaPath  = path;
-        *inOutVersion = version;
-        return true;
-    }
-    return false;
-}
-
-int findJavaInRegistry(CPath *outJavaPath, bool isJdk, int minVersion) {
-    // Check the JRE first, then the JDK.
-    int version = minVersion - 1; // Inner methods check if they're greater than this version.
-    bool result = false;
-    result |= (!isJdk && getMaxJavaInRegistry("Java Runtime Environment", 0, outJavaPath, &version));
-    result |= getMaxJavaInRegistry("Java Development Kit", 0, outJavaPath, &version);
-
-    // Even if we're 64-bit, try again but check the 32-bit registry, looking for 32-bit java.
-    if (isApplication64()) {
-        result |= (!isJdk &&
-            getMaxJavaInRegistry("Java Runtime Environment", KEY_WOW64_32KEY, outJavaPath, &version));
-        result |= getMaxJavaInRegistry("Java Development Kit", KEY_WOW64_32KEY, outJavaPath, &version);
-    }
-
-    return result ? version : 0;
-}
-
-// --------------
-
-static bool checkProgramFiles(CPath *outJavaPath, int *inOutVersion, bool isJdk,
-    bool force32bit) {
-
-    char programFilesPath[MAX_PATH + 1];
-    int nFolder = force32bit ? CSIDL_PROGRAM_FILESX86 : CSIDL_PROGRAM_FILES;
-    HRESULT result = SHGetFolderPathA(
-        NULL,                       // hwndOwner
-        nFolder,
-        NULL,                       // hToken
-        SHGFP_TYPE_CURRENT,         // dwFlags
-        programFilesPath);          // pszPath
-    if (FAILED(result)) return false;
-
-    CPath path(programFilesPath);
-    path.addPath("Java");
-
-    // Do we have a C:\Program Files\Java directory?
-    if (!path.dirExists()) return false;
-
-    CPath glob(path);
-    glob.addPath("j*");
-
-    bool found = false;
-    WIN32_FIND_DATAA findData;
-    HANDLE findH = FindFirstFileA(glob.cstr(), &findData);
-    if (findH == INVALID_HANDLE_VALUE) return false;
-    do {
-        if ((findData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) != 0) {
-            CPath temp(path);
-            temp.addPath(findData.cFileName);
-            // Check C:\Program Files\Java\j*\bin\java.exe
-
-            if (!isJdk || isJdkPath(temp)) {
-                int v = checkBinPath(&temp);
-                if (v > *inOutVersion) {
-                    found = true;
-                    *inOutVersion = v;
-                    *outJavaPath = temp;
-                }
-            }
-        }
-    } while (!found && FindNextFileA(findH, &findData) != 0);
-    FindClose(findH);
-
-    return found;
-}
-
-int findJavaInProgramFiles(CPath *outJavaPath, bool isJdk, int minVersion) {
-
-    // Check the C:\Program Files directory
-    bool result = false;
-    int version = minVersion - 1; // Inner methods check if they're greater than this version.
-    result |= checkProgramFiles(outJavaPath, &version, isJdk, false);
-
-    // Even if we're 64-bit, try again but check the C:\Program Files (x86) directory, looking for
-    // 32-bit java.
-    if (isApplication64()) {
-        result |= checkProgramFiles(outJavaPath, &version, isJdk, true);
-    }
-
-    return result ? version : 0;
-}
-
-// --------------
-
-// Tries to invoke the java.exe at the given path and extract it's
-// version number.
-// - outVersionStr: if not null, will capture version as a string (e.g. "1.6")
-// - outVersionInt: if not null, will capture version as an int (major * 1000 + minor, e.g. 1006).
-bool getJavaVersion(CPath &javaPath, CString *outVersionStr, int *outVersionInt) {
-    bool result = false;
-
-    // Run "java -version", which outputs something like to *STDERR*:
-    //
-    // java version "1.6.0_29"
-    // Java(TM) SE Runtime Environment (build 1.6.0_29-b11)
-    // Java HotSpot(TM) Client VM (build 20.4-b02, mixed mode, sharing)
-    //
-    // We want to capture the first line, and more exactly the "1.6" part.
-
-
-    CString cmd;
-    cmd.setf("\"%s\" -version", javaPath.cstr());
-
-    SECURITY_ATTRIBUTES   saAttr;
-    STARTUPINFO           startup;
-    PROCESS_INFORMATION   pinfo;
-
-    // Want to inherit pipe handle
-    ZeroMemory(&saAttr, sizeof(saAttr));
-    saAttr.nLength = sizeof(SECURITY_ATTRIBUTES); 
-    saAttr.bInheritHandle = TRUE; 
-    saAttr.lpSecurityDescriptor = NULL; 
-
-    // Create pipe for stdout
-    HANDLE stdoutPipeRd, stdoutPipeWt;
-    if (!CreatePipe(
-            &stdoutPipeRd,      // hReadPipe,
-            &stdoutPipeWt,      // hWritePipe,
-            &saAttr,            // lpPipeAttributes,
-            0)) {               // nSize (0=default buffer size)
-        if (gIsConsole || gIsDebug) displayLastError("CreatePipe failed: ");
-        return false;
-    }
-    if (!SetHandleInformation(stdoutPipeRd, HANDLE_FLAG_INHERIT, 0)) {
-        if (gIsConsole || gIsDebug) displayLastError("SetHandleInformation failed: ");
-        return false;
-    }
-
-    ZeroMemory(&pinfo, sizeof(pinfo));
-
-    ZeroMemory(&startup, sizeof(startup));
-    startup.cb          = sizeof(startup);
-    startup.dwFlags     = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;
-    startup.wShowWindow = SW_HIDE|SW_MINIMIZE;
-    // Capture both stderr and stdout
-    startup.hStdError   = stdoutPipeWt;
-    startup.hStdOutput  = stdoutPipeWt;
-    startup.hStdInput   = GetStdHandle(STD_INPUT_HANDLE);
-
-    BOOL ok = CreateProcessA(
-            NULL,                   // program path
-            (LPSTR) cmd.cstr(),     // command-line
-            NULL,                   // process handle is not inheritable
-            NULL,                   // thread handle is not inheritable
-            TRUE,                   // yes, inherit some handles
-            0,                      // process creation flags
-            NULL,                   // use parent's environment block
-            NULL,                   // use parent's starting directory
-            &startup,               // startup info, i.e. std handles
-            &pinfo);
-
-    if ((gIsConsole || gIsDebug) && !ok) displayLastError("CreateProcess failed: ");
-
-    // Close the write-end of the output pipe (we're only reading from it)
-    CloseHandle(stdoutPipeWt);
-
-    // Read from the output pipe. We don't need to read everything,
-    // the first line should be 'Java version "1.2.3_45"\r\n'
-    // so reading about 32 chars is all we need.
-    char first32[32 + 1];
-    int index = 0;
-    first32[0] = 0;
-
-    if (ok) {
-
-        #define SIZE 1024
-        char buffer[SIZE];
-        DWORD sizeRead = 0;
-
-        while (ok) {
-            // Keep reading in the same buffer location
-            ok = ReadFile(stdoutPipeRd,     // hFile
-                          buffer,           // lpBuffer
-                          SIZE,             // DWORD buffer size to read
-                          &sizeRead,        // DWORD buffer size read
-                          NULL);            // overlapped
-            if (!ok || sizeRead == 0 || sizeRead > SIZE) break;
-
-            // Copy up to the first 32 characters
-            if (index < 32) {
-                DWORD n = 32 - index;
-                if (n > sizeRead) n = sizeRead;
-                // copy as lowercase to simplify checks later
-                for (char *b = buffer; n > 0; n--, b++, index++) {
-                    char c = *b;
-                    if (c >= 'A' && c <= 'Z') c += 'a' - 'A';
-                    first32[index] = c;
-                }
-                first32[index] = 0;
-            }
-        }
-
-        WaitForSingleObject(pinfo.hProcess, INFINITE);
-
-        DWORD exitCode;
-        if (GetExitCodeProcess(pinfo.hProcess, &exitCode)) {
-            // this should not return STILL_ACTIVE (259)
-            result = exitCode == 0;
-        }
-
-        CloseHandle(pinfo.hProcess);
-        CloseHandle(pinfo.hThread);
-    }
-    CloseHandle(stdoutPipeRd);
-
-    if (result && index > 0) {
-        // Look for a few keywords in the output however we don't
-        // care about specific ordering or case-senstiviness.
-        // We only captures roughtly the first line in lower case.
-        char *j = strstr(first32, "java");
-        if (!j) {
-            j = strstr(first32, "openjdk");
-        }
-        char *v = strstr(first32, "version");
-        if ((gIsConsole || gIsDebug) && (!j || !v)) {
-            fprintf(stderr, "Error: keywords 'java|openjdk version' not found in '%s'\n", first32);
-        }
-        if (j != NULL && v != NULL) {
-            result = extractJavaVersion(first32, index, outVersionStr, outVersionInt);
-        }
-    }
-
-    return result;
-}
-
-
-#endif /* _WIN32 */
diff --git a/find_java/src/source/utils.cpp b/find_java/src/source/utils.cpp
deleted file mode 100755
index e2ce58f..0000000
--- a/find_java/src/source/utils.cpp
+++ /dev/null
@@ -1,202 +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.
- */
-
-#ifdef _WIN32
-
-#include "utils.h"
-
-#define _CRT_SECURE_NO_WARNINGS 1
-
-// Set to true to get some extra debug information
-bool gIsDebug = false;
-// Set to true to output errors to stderr (for a Console app)
-// or to false to output using msg box (for a Windows UI app)
-bool gIsConsole = false;
-
-// Displays a message in an ok+info dialog box.
-void msgBox(const char* text, ...) {
-    CString formatted;
-    va_list ap;
-    va_start(ap, text);
-    formatted.setv(text, ap);
-    va_end(ap);
-
-    MessageBoxA(NULL, formatted.cstr(), "Android SDK Manager", MB_OK | MB_ICONINFORMATION);
-}
-
-// Displays GetLastError prefixed with a description in an error dialog box
-void displayLastError(const char *description, ...) {
-    CString formatted;
-    va_list ap;
-    va_start(ap, description);
-    formatted.setv(description, ap);
-    va_end(ap);
-
-    CString error;
-    error.setLastWin32Error(NULL);
-    formatted.add("\r\n");
-    formatted.add(error.cstr());
-
-    if (gIsConsole) {
-        fprintf(stderr, "%s\n", formatted.cstr());
-    } else {
-        MessageBox(NULL, formatted.cstr(), "Android SDK Manager - Error", MB_OK | MB_ICONERROR);
-    }
-}
-
-// Executes the command line. Does not wait for the program to finish.
-// The return code is from CreateProcess (0 means failure), not the running app.
-int execNoWait(const char *app, const char *params, const char *workDir) {
-    STARTUPINFO           startup;
-    PROCESS_INFORMATION   pinfo;
-
-    ZeroMemory(&pinfo, sizeof(pinfo));
-
-    ZeroMemory(&startup, sizeof(startup));
-    startup.cb          = sizeof(startup);
-    startup.dwFlags     = STARTF_USESHOWWINDOW;
-    startup.wShowWindow = SW_SHOWDEFAULT;
-
-    int ret = CreateProcessA(
-            (LPSTR) app,                                /* program path */
-            (LPSTR) params,                             /* command-line */
-            NULL,                  /* process handle is not inheritable */
-            NULL,                   /* thread handle is not inheritable */
-            TRUE,                          /* yes, inherit some handles */
-            0,                                          /* create flags */
-            NULL,                     /* use parent's environment block */
-            workDir,                 /* use parent's starting directory */
-            &startup,                 /* startup info, i.e. std handles */
-            &pinfo);
-
-    if (ret) {
-        CloseHandle(pinfo.hProcess);
-        CloseHandle(pinfo.hThread);
-    }
-
-    return ret;
-}
-
-// Executes command, waits for completion and returns exit code.
-// As indicated in MSDN for CreateProcess, callers should double-quote the program name
-// e.g. cmd="\"c:\program files\myapp.exe\" arg1 arg2";
-int execWait(const char *cmd) {
-    STARTUPINFO           startup;
-    PROCESS_INFORMATION   pinfo;
-
-    ZeroMemory(&pinfo, sizeof(pinfo));
-
-    ZeroMemory(&startup, sizeof(startup));
-    startup.cb          = sizeof(startup);
-    startup.dwFlags     = STARTF_USESHOWWINDOW;
-    startup.wShowWindow = SW_HIDE|SW_MINIMIZE;
-
-    int ret = CreateProcessA(
-            NULL,                                       /* program path */
-            (LPSTR) cmd,                                /* command-line */
-            NULL,                  /* process handle is not inheritable */
-            NULL,                   /* thread handle is not inheritable */
-            TRUE,                          /* yes, inherit some handles */
-            CREATE_NO_WINDOW,                /* we don't want a console */
-            NULL,                     /* use parent's environment block */
-            NULL,                    /* use parent's starting directory */
-            &startup,                 /* startup info, i.e. std handles */
-            &pinfo);
-
-    int result = -1;
-    if (ret) {
-        WaitForSingleObject(pinfo.hProcess, INFINITE);
-
-        DWORD exitCode;
-        if (GetExitCodeProcess(pinfo.hProcess, &exitCode)) {
-            // this should not return STILL_ACTIVE (259)
-            result = exitCode;
-        }
-        CloseHandle(pinfo.hProcess);
-        CloseHandle(pinfo.hThread);
-    }
-
-    return result;
-}
-
-bool getModuleDir(CPath *outDir) {
-    CHAR programDir[MAX_PATH];
-    int ret = GetModuleFileName(NULL, programDir, sizeof(programDir));
-    if (ret != 0) {
-        // Remove the last segment to keep only the directory.
-        int pos = ret - 1;
-        while (pos > 0 && programDir[pos] != '\\') {
-            --pos;
-        }
-        outDir->set(programDir, pos);
-        return true;
-    }
-    return false;
-}
-
-// Disables the FS redirection done by WOW64.
-// Because this runs as a 32-bit app, Windows automagically remaps some
-// folder under the hood (e.g. "Programs Files(x86)" is mapped as "Program Files").
-// This prevents the app from correctly searching for java.exe in these folders.
-// The registry is also remapped. This method disables this redirection.
-// Caller should restore the redirection later by using revertWow64FsRedirection().
-PVOID disableWow64FsRedirection() {
-
-    // The call we want to make is the following:
-    //    PVOID oldWow64Value;
-    //    Wow64DisableWow64FsRedirection(&oldWow64Value);
-    // However that method may not exist (e.g. on XP non-64 systems) so
-    // we must not call it directly.
-
-    PVOID oldWow64Value = 0;
-
-    HMODULE hmod = LoadLibrary("kernel32.dll");
-    if (hmod != NULL) {
-        FARPROC proc = GetProcAddress(hmod, "Wow64DisableWow64FsRedirection");
-        if (proc != NULL) {
-            typedef BOOL (WINAPI *disableWow64FuncType)(PVOID *);
-            disableWow64FuncType funcPtr = (disableWow64FuncType)proc;
-            funcPtr(&oldWow64Value);
-        }
-
-        FreeLibrary(hmod);
-    }
-
-    return oldWow64Value;
-}
-
-// Reverts the redirection disabled in disableWow64FsRedirection.
-void revertWow64FsRedirection(PVOID oldWow64Value) {
-
-    // The call we want to make is the following:
-    //    Wow64RevertWow64FsRedirection(oldWow64Value);
-    // However that method may not exist (e.g. on XP non-64 systems) so
-    // we must not call it directly.
-
-    HMODULE hmod = LoadLibrary("kernel32.dll");
-    if (hmod != NULL) {
-        FARPROC proc = GetProcAddress(hmod, "Wow64RevertWow64FsRedirection");
-        if (proc != NULL) {
-            typedef BOOL (WINAPI *revertWow64FuncType)(PVOID);
-            revertWow64FuncType funcPtr = (revertWow64FuncType)proc;
-            funcPtr(oldWow64Value);
-        }
-
-        FreeLibrary(hmod);
-    }
-}
-
-#endif /* _WIN32 */
diff --git a/find_java/src/source/utils.h b/find_java/src/source/utils.h
deleted file mode 100755
index a65e6fe..0000000
--- a/find_java/src/source/utils.h
+++ /dev/null
@@ -1,370 +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.
- */
-
-#ifndef _H_UTILS
-#define _H_UTILS
-
-#ifdef _WIN32
-
-#define _CRT_SECURE_NO_WARNINGS 1
-
-#include <direct.h>
-#include <stdio.h>
-#include <stdarg.h>
-#include <string.h>
-#include <windows.h>
-
-// VS vs MINGW specific includes
-#ifdef USE_VS_CRT
-    #include <crtdbg.h>     // for _ASSERT
-#else
-    #define _ASSERT(x)      // undef
-#endif
-
-extern bool gIsDebug;
-extern bool gIsConsole;
-
-// An array that knows its own size. Not dynamically resizable.
-template <class T> class CArray {
-    T* mPtr;
-    int mSize;
-public:
-    explicit CArray(int size) {
-        mSize = size;
-        mPtr = new T[size];
-    }
-
-    ~CArray() {
-        if (mPtr != NULL) {
-            delete[] mPtr;
-            mPtr = NULL;
-        }
-        mSize = 0;
-    }
-
-    T& operator[](int i) {
-        _ASSERT(i >= 0 && i < mSize);
-        return mPtr[i];
-    }
-
-    int size() const {
-        return mSize;
-    }
-};
-
-// A simple string class wrapper.
-class CString {
-protected:
-    char *mStr;
-public:
-    CString()                              { mStr = NULL; }
-    CString(const CString &str)            { mStr = NULL; set(str.mStr); }
-    explicit CString(const char *str)      { mStr = NULL; set(str); }
-    CString(const char *start, size_t length) { mStr = NULL; set(start, length); }
-
-    CString& operator=(const CString &str) {
-        return set(str.cstr());
-    }
-
-    CString& set(const char *str) {
-        if (str != mStr) {
-            _free();
-            if (str != NULL) {
-                mStr = _strdup(str);
-            }
-        }
-        return *this;
-    }
-
-    CString& set(const char *start, size_t length) {
-        _free();
-        if (start != NULL) {
-            mStr = (char *)malloc(length + 1);
-            strncpy(mStr, start, length);
-            mStr[length] = 0;
-        }
-        return *this;
-    }
-
-    CString& setv(const char *str, va_list ap) {
-        _free();
-        // _vscprintf(str, ap) is only available with the MSVCRT, not MinGW.
-        // Instead we'll iterate till we have enough space to generate the string.
-        size_t len = strlen(str) + 1024;
-        mStr = (char *)malloc(len);
-        strcpy(mStr, str); // provide a default in case vsnprintf totally fails
-        for (int guard = 0; guard < 10; guard++) {
-            int ret = vsnprintf(mStr, len, str, ap);
-            if (ret == -1) {
-                // Some implementations don't give the proper size needed
-                // so double the space and try again.
-                len *= 2;
-            } else if (ret >= len) {
-                len = ret + 1;
-            } else {
-                // There was enough space to write.
-                break;
-            }
-            mStr = (char *)realloc((void *)mStr, len);
-            strcpy(mStr, str); // provide a default in case vsnprintf totally fails
-        }
-        return *this;
-    }
-
-    CString& setf(const char *str, ...) {
-        _free();
-        va_list ap;
-        va_start(ap, str);
-        setv(str, ap);
-        va_end(ap);
-        return *this;
-    }
-
-    virtual ~CString() { _free(); }
-
-    // Returns the C string owned by this CString. It will be
-    // invalid as soon as this CString is deleted or out of scope.
-    const char * cstr() const {
-        return mStr;
-    }
-
-    bool isEmpty() const {
-        return mStr == NULL || *mStr == 0;
-    }
-
-    size_t length() const {
-        return mStr == NULL ? 0 : strlen(mStr);
-    }
-
-    CString& add(const char *str) {
-        if (mStr == NULL) {
-            set(str);
-        } else {
-            mStr = (char *)realloc((void *)mStr, strlen(mStr) + strlen(str) + 1);
-            strcat(mStr, str);
-        }
-        return *this;
-    }
-
-    CString& add(const char *str, int length) {
-        if (mStr == NULL) {
-            set(str, length);
-        } else {
-            size_t l1 = strlen(mStr);
-            mStr = (char *)realloc((void *)mStr, l1 + length + 1);
-            strncpy(mStr + l1, str, length);
-            mStr[l1 + length] = 0;
-        }
-        return *this;
-    }
-
-    CArray<CString> * split(char sep) const {
-        if (mStr == NULL) {
-            return new CArray<CString>(0);
-        }
-        const char *last = NULL;
-        int n = 0;
-        for (const char *s = mStr; *s; s++) {
-            if (*s == sep && s != mStr && (last == NULL || s > last+1)) {
-                n++;
-                last = s;
-            }
-        }
-
-        CArray<CString> *result = new CArray<CString>(n);
-        last = NULL;
-        n = 0;
-        for (const char *s = mStr; *s; s++) {
-            if (*s == sep) {
-                if (s != mStr && (last == NULL || s > last+1)) {
-                    const char *start = last ? last : mStr;
-                    (*result)[n++].set(start, s-start);
-                }
-                last = s+1;
-            }
-        }
-
-        return result;
-    }
-
-    // Sets the string to the message matching Win32 GetLastError.
-    // If message is non-null, it is prepended to the last error string.
-    CString& setLastWin32Error(const char *message) {
-        DWORD err = GetLastError();
-        LPSTR errStr;
-        if (FormatMessageA(FORMAT_MESSAGE_ALLOCATE_BUFFER | /* dwFlags */
-                          FORMAT_MESSAGE_FROM_SYSTEM,
-                          NULL,                             /* lpSource */
-                          err,                              /* dwMessageId */
-                          0,                                /* dwLanguageId */
-                          (LPSTR)&errStr,                   /* lpBuffer */
-                          0,                                /* nSize */
-                          NULL) != 0) {                     /* va_list args */
-            if (message == NULL) {
-                setf("[%d] %s", err, errStr);
-            } else {
-                setf("%s[%d] %s", message, err, errStr);
-            }
-            LocalFree(errStr);
-        }
-        return *this;
-    }
-
-private:
-    void _free() {
-        if (mStr != NULL) {
-            free((void *)mStr);
-            mStr = NULL;
-        }
-    }
-
-};
-
-// A simple path class wrapper.
-class CPath : public CString {
-public:
-    CPath()                              : CString()    { }
-    CPath(const CString &str)            : CString(str) { }
-    CPath(const CPath &str)              : CString(str) { }
-    explicit CPath(const char *str)      : CString(str) { }
-    CPath(const char *start, int length) : CString(start, length) { }
-
-    CPath& operator=(const CPath &str) {
-        set(str.cstr());
-        return *this;
-    }
-
-    // Appends a path segment, adding a \ as necessary.
-    CPath& addPath(const CString &s) {
-        return addPath(s.cstr());
-    }
-
-    // Appends a path segment, adding a \ as necessary.
-    CPath& addPath(const char *s) {
-        _ASSERT(s != NULL);
-        if (s != NULL && s[0] != 0) {
-            size_t n = length();
-            if (n > 0 && s[0] != '\\' && mStr[n-1] != '\\') add("\\");
-            add(s);
-        }
-        return *this;
-    }
-
-    // Returns true if file exist and is not a directory.
-    // There's no garantee we have rights to access it.
-    bool fileExists() const {
-        if (mStr == NULL) return false;
-        DWORD attribs = GetFileAttributesA(mStr);
-        return attribs != INVALID_FILE_ATTRIBUTES &&
-             !(attribs & FILE_ATTRIBUTE_DIRECTORY);
-    }
-
-    // Returns true if file exist and is a directory.
-    // There's no garantee we have rights to access it.
-    bool dirExists() const {
-        if (mStr == NULL) return false;
-        DWORD attribs = GetFileAttributesA(mStr);
-        return attribs != INVALID_FILE_ATTRIBUTES &&
-              (attribs & FILE_ATTRIBUTE_DIRECTORY) != 0;
-    }
-
-    // Returns a copy of the directory portion of the path, if any
-    CPath dirName() const {
-        CPath result;
-        if (mStr != NULL) {
-            char *pos = strrchr(mStr, '\\');
-            if (pos != NULL) {
-                result.set(mStr, pos - mStr);
-            }
-        }
-        return result;
-    }
-
-    // Returns a pointer to the baseName part of the path.
-    // It becomes invalid if the path changes.
-    const char * baseName() const {
-        if (mStr != NULL) {
-            char *pos = strrchr(mStr, '\\');
-            if (pos != NULL) {
-                return pos + 1;
-            }
-        }
-        return NULL;
-    }
-
-    // If the path ends with the given searchName, replace in-place by the new name
-    void replaceName(const char *searchName, const char* newName) {
-        if (mStr == NULL) return;
-        size_t n = length();
-        size_t sn = strlen(searchName);
-        if (n < sn) return;
-        // if mStr ends with searchName
-        if (strcmp(mStr + n - sn, searchName) == 0) {
-            size_t sn2 = strlen(newName);
-            if (sn2 > sn) {
-                mStr = (char *)realloc((void *)mStr, n + sn2 - sn + 1);
-            }
-            strcpy(mStr + n - sn, newName);
-            mStr[n + sn2 - sn] = 0;
-        }
-    }
-
-    // Returns a copy of this path as a DOS short path in the destination.
-    // Returns true if the Win32 getShortPathName method worked.
-    // In case of error, returns false and does not change the destination.
-    // It's OK to invoke this->toShortPath(this).
-    bool toShortPath(CPath *dest) {
-        const char *longPath = mStr;
-        if (mStr == NULL) return false;
-
-        DWORD lenShort = (DWORD)strlen(longPath) + 1; // GetShortPathName deals with DWORDs
-        char * shortPath = (char *)malloc(lenShort);
-
-        DWORD length = GetShortPathName(longPath, shortPath, lenShort);
-        if (length > lenShort) {
-            // The buffer wasn't big enough, this is the size to use.
-            free(shortPath);
-            lenShort = length;
-            shortPath = (char *)malloc(length);
-            length = GetShortPathName(longPath, shortPath, lenShort);
-        }
-
-        if (length != 0) dest->set(shortPath);
-
-        free(shortPath);
-        return length != 0;
-    }
-};
-
-// Displays a message in an ok+info dialog box.
-void msgBox(const char* text, ...);
-
-// Displays GetLastError prefixed with a description in an error dialog box
-void displayLastError(const char *description, ...);
-
-// Executes the command line. Does not wait for the program to finish.
-// The return code is from CreateProcess (0 means failure), not the running app.
-int execNoWait(const char *app, const char *params, const char *workDir);
-
-// Executes command, waits for completion and returns exit code.
-// As indicated in MSDN for CreateProcess, callers should double-quote the program name
-// e.g. cmd="\"c:\program files\myapp.exe\" arg1 arg2";
-int execWait(const char *cmd);
-
-bool getModuleDir(CPath *outDir);
-
-#endif /* _WIN32 */
-#endif /* _H_UTILS */
diff --git a/find_java2/.gitignore b/find_java2/.gitignore
deleted file mode 100644
index 3117960..0000000
--- a/find_java2/.gitignore
+++ /dev/null
@@ -1,10 +0,0 @@
-ipch
-*.aps
-*.sdf
-*.opensdf
-*.suo
-*.filters
-*.user
-Debug
-Release
-
diff --git a/find_java2/FindJava2.sln b/find_java2/FindJava2.sln
deleted file mode 100755
index 459e3a7..0000000
--- a/find_java2/FindJava2.sln
+++ /dev/null
@@ -1,28 +0,0 @@
-﻿
-Microsoft Visual Studio Solution File, Format Version 12.00
-# Visual Studio 2013
-VisualStudioVersion = 12.0.30723.0
-MinimumVisualStudioVersion = 10.0.40219.1
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "WinLauncher2", "WinLauncher2\WinLauncher2.vcxproj", "{64980924-B76E-4E00-90A4-647E67CEB050}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "FindJava2", "FindJava2\FindJava2.vcxproj", "{E696008D-A1B8-4434-B6B4-24ED251B1676}"
-EndProject
-Global
-	GlobalSection(SolutionConfigurationPlatforms) = preSolution
-		Debug|Win32 = Debug|Win32
-		Release|Win32 = Release|Win32
-	EndGlobalSection
-	GlobalSection(ProjectConfigurationPlatforms) = postSolution
-		{64980924-B76E-4E00-90A4-647E67CEB050}.Debug|Win32.ActiveCfg = Debug|Win32
-		{64980924-B76E-4E00-90A4-647E67CEB050}.Debug|Win32.Build.0 = Debug|Win32
-		{64980924-B76E-4E00-90A4-647E67CEB050}.Release|Win32.ActiveCfg = Release|Win32
-		{64980924-B76E-4E00-90A4-647E67CEB050}.Release|Win32.Build.0 = Release|Win32
-		{E696008D-A1B8-4434-B6B4-24ED251B1676}.Debug|Win32.ActiveCfg = Debug|Win32
-		{E696008D-A1B8-4434-B6B4-24ED251B1676}.Debug|Win32.Build.0 = Debug|Win32
-		{E696008D-A1B8-4434-B6B4-24ED251B1676}.Release|Win32.ActiveCfg = Release|Win32
-		{E696008D-A1B8-4434-B6B4-24ED251B1676}.Release|Win32.Build.0 = Release|Win32
-	EndGlobalSection
-	GlobalSection(SolutionProperties) = preSolution
-		HideSolutionNode = FALSE
-	EndGlobalSection
-EndGlobal
diff --git a/find_java2/FindJava2/FindJava2.cpp b/find_java2/FindJava2/FindJava2.cpp
deleted file mode 100755
index 1435e1b..0000000
--- a/find_java2/FindJava2/FindJava2.cpp
+++ /dev/null
@@ -1,199 +0,0 @@
-/*
-* Copyright (C) 2014 The Android Open Source Project
-*
-* Licensed under the Apache License, Version 2.0 (the "License");
-* you may not use this file except in compliance with the License.
-* You may obtain a copy of the License at
-*
-*      http://www.apache.org/licenses/LICENSE-2.0
-*
-* Unless required by applicable law or agreed to in writing, software
-* distributed under the License is distributed on an "AS IS" BASIS,
-* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-* See the License for the specific language governing permissions and
-* limitations under the License.
-*/
-
-#include "stdafx.h"
-#include "FindJava2.h"
-#include "utils.h"
-#include "JavaFinder.h"
-#include "FindJava2Dlg.h"
-
-#ifdef _DEBUG
-#define new DEBUG_NEW
-#endif
-
-// The one and only MFC application object
-class CFindJava2App : public CWinApp {
-public:
-    CFindJava2App() {
-    }
-
-    // Set CWinApp default registry key. Must be consistent with all apps using findjava2.
-    void initRegistryKey() {
-        SetRegistryKey(_T("Android-FindJava2"));
-    }
-};
-
-CFindJava2App theApp;
-
-using namespace std;
-
-int _tmain(int argc, TCHAR* argv[], TCHAR* envp[]) {
-
-    // Init utils; use default app name based on VERSIONINFO.FileDescription
-    initUtils(NULL);
-
-    // initialize MFC and print and error on failure
-    HMODULE hModule = ::GetModuleHandle(NULL);
-    if (hModule == NULL) {
-        displayLastError(_T("Fatal Error: "));
-        return -2;
-    }
-    if (!AfxWinInit(hModule, NULL, ::GetCommandLine(), 0)) {
-        displayLastError(_T("Fatal Error: "));
-        return -3;
-    }
-
-    theApp.initRegistryKey();
-
-    gIsConsole = true; // tell utils to to print errors to stderr
-    gIsDebug = (getenv("ANDROID_SDKMAN_DEBUG") != NULL);
-
-    // Parse command line
-    bool doTests = false;
-    bool doShortPath = false;
-    bool doVersion = false;
-    bool doJavaW = false;
-    bool doForceUi = false;
-    bool doJava1_7 = false;
-
-    for (int i = 1; i < argc; i++) {
-        if (_tcsnccmp(argv[i], _T("-t"), 2) == 0) {
-            doTests = true;
-
-        } else if (_tcsnccmp(argv[i], _T("-d"), 2) == 0) {
-            gIsDebug = true;
-
-        } else if (_tcsnccmp(argv[i], _T("-s"), 2) == 0) {
-            doShortPath = true;
-
-        } else if (_tcsnccmp(argv[i], _T("-v"), 2) == 0) {
-            doVersion = true;
-
-        } else if (_tcsnccmp(argv[i], _T("-f"), 2) == 0) {
-            doForceUi = true;
-
-        } else if (_tcsnccmp(argv[i], _T("-7"), 2) == 0) {
-            doJava1_7 = true;
-
-        } else if (_tcscmp(argv[i], _T("-w")) == 0 || _tcscmp(argv[i], _T("-javaw")) == 0) {
-            doJavaW = true;
-
-        } else {
-            printf(
-                "Outputs the path of the first Java.exe found on the local system.\n"
-                "Returns code 0 when found, 1 when not found.\n"
-                "Options:\n"
-                "-h / -help   : This help.\n"
-                "-t / -test   : Internal test.\n"
-                "-f / -force  : Force UI selection.\n"
-                "-7           : Java 1.7 minimum instead of 1.6.\n"
-                "-s / -short  : Print path in short DOS form.\n"
-                "-w / -javaw  : Search a matching javaw.exe; defaults to java.exe if not found.\n"
-                "-v / -version: Only prints the Java version found.\n"
-                );
-            return 2;
-        }
-    }
-
-
-    CJavaFinder javaFinder(JAVA_VERS_TO_INT(1, doJava1_7 ? 7 : 6));
-    CJavaPath javaPath = javaFinder.getRegistryPath();
-
-    if (doTests) {
-        std::set<CJavaPath> paths;
-        javaFinder.findJavaPaths(&paths);
-        bool regPrinted = false;
-        for (const CJavaPath &p : paths) {
-            bool isReg = (p == javaPath);
-            if (isReg) {
-                regPrinted = true;
-            }
-            _tprintf(_T("%c [%s] %s\n"), isReg ? '*' : ' ', p.getVersion(), p.mPath);
-        }
-
-        if (!regPrinted && !javaPath.isEmpty()) {
-            const CJavaPath &p = javaPath;
-            _tprintf(_T("* [%s] %s\n"), p.getVersion(), p.mPath);
-        }
-        return 0;
-    }
-
-    if (doForceUi || javaPath.isEmpty()) {
-        CFindJava2Dlg dlg;
-        dlg.setJavaFinder(&javaFinder);
-        INT_PTR nResponse = dlg.DoModal();
-
-        if (nResponse == IDOK) {
-            // Get java path selected by user and save into registry for later re-use
-            javaPath = dlg.getSelectedPath();
-            javaFinder.setRegistryPath(javaPath);
-        } else if (nResponse == -1) {   // MFC boilerplate
-            TRACE(traceAppMsg, 0, "Warning: dialog creation failed, so application is terminating unexpectedly.\n");
-            return 1;
-        }
-    }
-
-    if (javaPath.isEmpty()) {
-        fprintf(stderr, "No java.exe path found");
-        return 1;
-    }
-
-    if (doShortPath) {
-        PVOID oldWow64Value = disableWow64FsRedirection();
-        if (!javaPath.toShortPath()) {
-            revertWow64FsRedirection(&oldWow64Value);
-            _ftprintf(stderr,
-                    _T("Failed to convert path to a short DOS path: %s\n"),
-                    javaPath.mPath);
-            return 1;
-        }
-        revertWow64FsRedirection(&oldWow64Value);
-    }
-
-    if (doVersion) {
-        // Print version found. We already have the version as an integer
-        // so we don't need to run java -version a second time.
-        _tprintf(_T("%s"), javaPath.getVersion());
-        return 0;
-    }
-
-    if (doJavaW) {
-        // Try to find a javaw.exe instead of java.exe at the same location.
-        CPath javawPath = javaPath.mPath;
-        javawPath.RemoveFileSpec();
-        javawPath.Append(_T("javaw.exe"));
-        javawPath.Canonicalize();
-
-        // Only accept it if we can actually find the exec
-        PVOID oldWow64Value = disableWow64FsRedirection();
-        bool exists = javawPath.FileExists() == TRUE; // skip BOOL-to-bool warning
-        revertWow64FsRedirection(&oldWow64Value);
-
-        if (!exists) {
-            _ftprintf(stderr,
-                    _T("Failed to find javaw at: %s\n"),
-                    javawPath);
-            return 1;
-        }
-
-        javaPath.mPath = javawPath;
-    }
-
-    // Print java.exe path found
-    _tprintf(_T("%s"), javaPath.mPath);
-    return 0;
-
-}
diff --git a/find_java2/FindJava2/FindJava2.h b/find_java2/FindJava2/FindJava2.h
deleted file mode 100755
index a144bfc..0000000
--- a/find_java2/FindJava2/FindJava2.h
+++ /dev/null
@@ -1,19 +0,0 @@
-/*
-* Copyright (C) 2014 The Android Open Source Project
-*
-* Licensed under the Apache License, Version 2.0 (the "License");
-* you may not use this file except in compliance with the License.
-* You may obtain a copy of the License at
-*
-*      http://www.apache.org/licenses/LICENSE-2.0
-*
-* Unless required by applicable law or agreed to in writing, software
-* distributed under the License is distributed on an "AS IS" BASIS,
-* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-* See the License for the specific language governing permissions and
-* limitations under the License.
-*/
-
-#pragma once
-
-#include "resource.h"
diff --git a/find_java2/FindJava2/FindJava2.rc b/find_java2/FindJava2/FindJava2.rc
deleted file mode 100755
index ff767c6..0000000
--- a/find_java2/FindJava2/FindJava2.rc
+++ /dev/null
@@ -1,142 +0,0 @@
-// Microsoft Visual C++ generated resource script.
-//
-#include "resource.h"
-
-#define APSTUDIO_READONLY_SYMBOLS
-/////////////////////////////////////////////////////////////////////////////
-//
-// Generated from the TEXTINCLUDE 2 resource.
-//
-#include "afxres.h"
-
-/////////////////////////////////////////////////////////////////////////////
-#undef APSTUDIO_READONLY_SYMBOLS
-
-/////////////////////////////////////////////////////////////////////////////
-// English (United States) resources
-
-#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
-LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
-
-#ifdef APSTUDIO_INVOKED
-/////////////////////////////////////////////////////////////////////////////
-//
-// TEXTINCLUDE
-//
-
-1 TEXTINCLUDE 
-BEGIN
-    "resource.h\0"
-END
-
-2 TEXTINCLUDE 
-BEGIN
-    "#include ""afxres.h""\r\n"
-    "\0"
-END
-
-3 TEXTINCLUDE 
-BEGIN
-    "\r\n"
-    "\0"
-END
-
-#endif    // APSTUDIO_INVOKED
-
-
-/////////////////////////////////////////////////////////////////////////////
-//
-// Version
-//
-
-VS_VERSION_INFO VERSIONINFO
- FILEVERSION 1,0,0,1
- PRODUCTVERSION 1,0,0,1
- FILEFLAGSMASK 0x3fL
-#ifdef _DEBUG
- FILEFLAGS 0x1L
-#else
- FILEFLAGS 0x0L
-#endif
- FILEOS 0x40004L
- FILETYPE 0x1L
- FILESUBTYPE 0x0L
-BEGIN
-    BLOCK "StringFileInfo"
-    BEGIN
-        BLOCK "040904b0"
-        BEGIN
-            VALUE "CompanyName", "Android"
-            VALUE "FileDescription", "Find Java for Android SDK"
-            VALUE "FileVersion", "2.0.0.1"
-            VALUE "InternalName", "FindJava2.exe"
-            VALUE "LegalCopyright", "(c) Android.  All rights reserved."
-            VALUE "OriginalFilename", "FindJava2.exe"
-            VALUE "ProductName", "Android SDK"
-            VALUE "ProductVersion", "2.0.0.1"
-        END
-    END
-    BLOCK "VarFileInfo"
-    BEGIN
-        VALUE "Translation", 0x409, 1200
-    END
-END
-
-
-/////////////////////////////////////////////////////////////////////////////
-//
-// Dialog
-//
-
-IDD_FINDJAVA2_DIALOG DIALOGEX 0, 0, 317, 196
-STYLE DS_SETFONT | DS_FIXEDSYS | WS_MINIMIZEBOX | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME
-EXSTYLE WS_EX_APPWINDOW
-CAPTION "Find Java 2 for Android"
-FONT 8, "MS Shell Dlg", 0, 0, 0x1
-BEGIN
-    DEFPUSHBUTTON   "Start",IDOK,205,174,50,14
-    PUSHBUTTON      "Quit",IDCANCEL,260,174,50,14
-    PUSHBUTTON      "Add...",IDC_BUTTON_ADD,7,174,50,14
-    LTEXT           "Select which version of Java to use:",IDC_STATIC,7,7,116,8
-    CONTROL         "",IDC_PATH_LIST,"SysListView32",LVS_REPORT | LVS_ALIGNLEFT | WS_BORDER | WS_TABSTOP,7,18,300,150
-END
-
-
-/////////////////////////////////////////////////////////////////////////////
-//
-// DESIGNINFO
-//
-
-#ifdef APSTUDIO_INVOKED
-GUIDELINES DESIGNINFO
-BEGIN
-    IDD_FINDJAVA2_DIALOG, DIALOG
-    BEGIN
-    END
-END
-#endif    // APSTUDIO_INVOKED
-
-
-/////////////////////////////////////////////////////////////////////////////
-//
-// Icon
-//
-
-// Icon with lowest ID value placed first to ensure application icon
-// remains consistent on all systems.
-IDI_ANDROID_ICON        ICON                    "..\\android_icon.ico"
-#endif    // English (United States) resources
-/////////////////////////////////////////////////////////////////////////////
-
-
-
-#ifndef APSTUDIO_INVOKED
-/////////////////////////////////////////////////////////////////////////////
-//
-// Generated from the TEXTINCLUDE 3 resource.
-//
-
-
-/////////////////////////////////////////////////////////////////////////////
-#endif    // not APSTUDIO_INVOKED
-
diff --git a/find_java2/FindJava2/FindJava2.vcxproj b/find_java2/FindJava2/FindJava2.vcxproj
deleted file mode 100755
index 3c9ac4e..0000000
--- a/find_java2/FindJava2/FindJava2.vcxproj
+++ /dev/null
@@ -1,112 +0,0 @@
-﻿<?xml version="1.0" encoding="utf-8"?>
-<Project DefaultTargets="Build" ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <ItemGroup Label="ProjectConfigurations">
-    <ProjectConfiguration Include="Debug|Win32">
-      <Configuration>Debug</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Release|Win32">
-      <Configuration>Release</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-  </ItemGroup>
-  <PropertyGroup Label="Globals">
-    <ProjectGuid>{E696008D-A1B8-4434-B6B4-24ED251B1676}</ProjectGuid>
-    <Keyword>Win32Proj</Keyword>
-    <RootNamespace>FindJava2</RootNamespace>
-  </PropertyGroup>
-  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <UseDebugLibraries>true</UseDebugLibraries>
-    <PlatformToolset>v120</PlatformToolset>
-    <CharacterSet>Unicode</CharacterSet>
-    <UseOfMfc>Dynamic</UseOfMfc>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <UseDebugLibraries>false</UseDebugLibraries>
-    <PlatformToolset>v120</PlatformToolset>
-    <WholeProgramOptimization>true</WholeProgramOptimization>
-    <CharacterSet>Unicode</CharacterSet>
-    <UseOfMfc>Dynamic</UseOfMfc>
-  </PropertyGroup>
-  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
-  <ImportGroup Label="ExtensionSettings">
-  </ImportGroup>
-  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
-    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
-  </ImportGroup>
-  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
-    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
-  </ImportGroup>
-  <PropertyGroup Label="UserMacros" />
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
-    <LinkIncremental>true</LinkIncremental>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
-    <LinkIncremental>false</LinkIncremental>
-  </PropertyGroup>
-  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
-    <ClCompile>
-      <PrecompiledHeader>Use</PrecompiledHeader>
-      <WarningLevel>Level3</WarningLevel>
-      <Optimization>Disabled</Optimization>
-      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>$(ProjectDir);$(SolutionDir)\src;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-    </ClCompile>
-    <Link>
-      <SubSystem>Console</SubSystem>
-      <GenerateDebugInformation>true</GenerateDebugInformation>
-      <AdditionalDependencies>version.lib</AdditionalDependencies>
-    </Link>
-  </ItemDefinitionGroup>
-  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
-    <ClCompile>
-      <WarningLevel>Level3</WarningLevel>
-      <PrecompiledHeader>Use</PrecompiledHeader>
-      <Optimization>MaxSpeed</Optimization>
-      <FunctionLevelLinking>true</FunctionLevelLinking>
-      <IntrinsicFunctions>true</IntrinsicFunctions>
-      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>$(ProjectDir);$(SolutionDir)\src;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-    </ClCompile>
-    <Link>
-      <SubSystem>Console</SubSystem>
-      <GenerateDebugInformation>true</GenerateDebugInformation>
-      <EnableCOMDATFolding>true</EnableCOMDATFolding>
-      <OptimizeReferences>true</OptimizeReferences>
-      <AdditionalDependencies>version.lib</AdditionalDependencies>
-    </Link>
-  </ItemDefinitionGroup>
-  <ItemGroup>
-    <ClInclude Include="..\src\FindJava2Dlg.h" />
-    <ClInclude Include="..\src\JavaFinder.h" />
-    <ClInclude Include="..\src\JavaPath.h" />
-    <ClInclude Include="..\src\utils.h" />
-    <ClInclude Include="FindJava2.h" />
-    <ClInclude Include="Resource.h" />
-    <ClInclude Include="stdafx.h" />
-    <ClInclude Include="targetver.h" />
-  </ItemGroup>
-  <ItemGroup>
-    <ClCompile Include="..\src\FindJava2Dlg.cpp" />
-    <ClCompile Include="..\src\JavaFinder.cpp" />
-    <ClCompile Include="..\src\JavaPath.cpp" />
-    <ClCompile Include="..\src\utils.cpp" />
-    <ClCompile Include="FindJava2.cpp" />
-    <ClCompile Include="stdafx.cpp">
-      <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Create</PrecompiledHeader>
-      <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Create</PrecompiledHeader>
-    </ClCompile>
-  </ItemGroup>
-  <ItemGroup>
-    <ResourceCompile Include="FindJava2.rc" />
-  </ItemGroup>
-  <ItemGroup>
-    <Image Include="..\android_icon.ico" />
-  </ItemGroup>
-  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
-  <ImportGroup Label="ExtensionTargets">
-  </ImportGroup>
-</Project>
\ No newline at end of file
diff --git a/find_java2/FindJava2/resource.h b/find_java2/FindJava2/resource.h
deleted file mode 100755
index 1d5f98f..0000000
--- a/find_java2/FindJava2/resource.h
+++ /dev/null
@@ -1,19 +0,0 @@
-//{{NO_DEPENDENCIES}}
-// Microsoft Visual C++ generated include file.
-// Used by FindJava2.rc
-//
-#define IDI_ANDROID_ICON                5
-#define IDD_FINDJAVA2_DIALOG            102
-#define IDC_BUTTON_ADD                  1000
-#define IDC_PATH_LIST                   1001
-
-// Next default values for new objects
-// 
-#ifdef APSTUDIO_INVOKED
-#ifndef APSTUDIO_READONLY_SYMBOLS
-#define _APS_NEXT_RESOURCE_VALUE        101
-#define _APS_NEXT_COMMAND_VALUE         40001
-#define _APS_NEXT_CONTROL_VALUE         1000
-#define _APS_NEXT_SYMED_VALUE           101
-#endif
-#endif
diff --git a/find_java2/FindJava2/stdafx.cpp b/find_java2/FindJava2/stdafx.cpp
deleted file mode 100755
index 3baa67f..0000000
--- a/find_java2/FindJava2/stdafx.cpp
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
-* Copyright (C) 2014 The Android Open Source Project
-*
-* Licensed under the Apache License, Version 2.0 (the "License");
-* you may not use this file except in compliance with the License.
-* You may obtain a copy of the License at
-*
-*      http://www.apache.org/licenses/LICENSE-2.0
-*
-* Unless required by applicable law or agreed to in writing, software
-* distributed under the License is distributed on an "AS IS" BASIS,
-* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-* See the License for the specific language governing permissions and
-* limitations under the License.
-*/
-
-// stdafx.cpp : source file that includes just the standard includes
-// FindJava2.pch will be the pre-compiled header
-// stdafx.obj will contain the pre-compiled type information
-
-#include "stdafx.h"
-
-// TODO: reference any additional headers you need in STDAFX.H
-// and not in this file
diff --git a/find_java2/FindJava2/stdafx.h b/find_java2/FindJava2/stdafx.h
deleted file mode 100755
index 7230def..0000000
--- a/find_java2/FindJava2/stdafx.h
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
-* Copyright (C) 2014 The Android Open Source Project
-*
-* Licensed under the Apache License, Version 2.0 (the "License");
-* you may not use this file except in compliance with the License.
-* You may obtain a copy of the License at
-*
-*      http://www.apache.org/licenses/LICENSE-2.0
-*
-* Unless required by applicable law or agreed to in writing, software
-* distributed under the License is distributed on an "AS IS" BASIS,
-* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-* See the License for the specific language governing permissions and
-* limitations under the License.
-*/
-
-// stdafx.h : include file for standard system include files,
-// or project specific include files that are used frequently,
-// but are changed infrequently.
-
-#pragma once
-
-#include "targetver.h"
-
-
-#define _CRT_SECURE_NO_WARNINGS
-
-#include <stdio.h>
-#include <tchar.h>
-#define _ATL_CSTRING_EXPLICIT_CONSTRUCTORS      // some CString constructors will be explicit
-#define _AFX_NO_MFC_CONTROLS_IN_DIALOGS         // remove support for MFC controls in dialogs
-
-#ifndef VC_EXTRALEAN
-#define VC_EXTRALEAN            // Exclude rarely-used stuff from Windows headers
-#endif
-
-#include <afx.h>
-#include <afxwin.h>         // MFC core and standard components
-#include <afxext.h>         // MFC extensions
-#ifndef _AFX_NO_OLE_SUPPORT
-#include <afxdtctl.h>           // MFC support for Internet Explorer 4 Common Controls
-#endif
-#ifndef _AFX_NO_AFXCMN_SUPPORT
-#include <afxcmn.h>                     // MFC support for Windows Common Controls
-#endif // _AFX_NO_AFXCMN_SUPPORT
-
-#include <iostream>
-
-
-#define _ATL_CSTRING_EXPLICIT_CONSTRUCTORS      // some CString constructors will be explicit
-
-#include <atlbase.h>
-#include <atlstr.h>
-
-// TODO: reference additional headers your program requires here
diff --git a/find_java2/FindJava2/targetver.h b/find_java2/FindJava2/targetver.h
deleted file mode 100755
index fc6d20b..0000000
--- a/find_java2/FindJava2/targetver.h
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
-* Copyright (C) 2014 The Android Open Source Project
-*
-* Licensed under the Apache License, Version 2.0 (the "License");
-* you may not use this file except in compliance with the License.
-* You may obtain a copy of the License at
-*
-*      http://www.apache.org/licenses/LICENSE-2.0
-*
-* Unless required by applicable law or agreed to in writing, software
-* distributed under the License is distributed on an "AS IS" BASIS,
-* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-* See the License for the specific language governing permissions and
-* limitations under the License.
-*/
-
-#pragma once
-
-// Including SDKDDKVer.h defines the highest available Windows platform.
-
-// If you wish to build your application for a previous Windows platform, include WinSDKVer.h and
-// set the _WIN32_WINNT macro to the platform you wish to support before including SDKDDKVer.h.
-
-#include <SDKDDKVer.h>
diff --git a/find_java2/WinLauncher2/Resource.h b/find_java2/WinLauncher2/Resource.h
deleted file mode 100755
index c3b2e0f..0000000
--- a/find_java2/WinLauncher2/Resource.h
+++ /dev/null
@@ -1,19 +0,0 @@
-//{{NO_DEPENDENCIES}}
-// Microsoft Visual C++ generated include file.
-// Used by WinLauncher2.rc
-//
-#define IDI_ANDROID_ICON                5
-#define IDD_FINDJAVA2_DIALOG            102
-#define IDC_BUTTON_ADD                  1000
-#define IDC_PATH_LIST                   1001
-
-// Next default values for new objects
-// 
-#ifdef APSTUDIO_INVOKED
-#ifndef APSTUDIO_READONLY_SYMBOLS
-#define _APS_NEXT_RESOURCE_VALUE        130
-#define _APS_NEXT_COMMAND_VALUE         32771
-#define _APS_NEXT_CONTROL_VALUE         1000
-#define _APS_NEXT_SYMED_VALUE           101
-#endif
-#endif
diff --git a/find_java2/WinLauncher2/WinLauncher2.rc b/find_java2/WinLauncher2/WinLauncher2.rc
deleted file mode 100755
index bee2edf..0000000
--- a/find_java2/WinLauncher2/WinLauncher2.rc
+++ /dev/null
@@ -1,174 +0,0 @@
-// Microsoft Visual C++ generated resource script.
-//
-#include "resource.h"
-
-#define APSTUDIO_READONLY_SYMBOLS
-/////////////////////////////////////////////////////////////////////////////
-//
-// Generated from the TEXTINCLUDE 2 resource.
-//
-#ifndef APSTUDIO_INVOKED
-#include "targetver.h"
-#endif
-#include "afxres.h"
-#include "verrsrc.h"
-
-/////////////////////////////////////////////////////////////////////////////
-#undef APSTUDIO_READONLY_SYMBOLS
-
-/////////////////////////////////////////////////////////////////////////////
-// English (United States) resources
-
-#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
-LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
-
-#ifdef APSTUDIO_INVOKED
-/////////////////////////////////////////////////////////////////////////////
-//
-// TEXTINCLUDE
-//
-
-1 TEXTINCLUDE 
-BEGIN
-    "resource.h\0"
-END
-
-2 TEXTINCLUDE 
-BEGIN
-    "#ifndef APSTUDIO_INVOKED\r\n"
-    "#include ""targetver.h""\r\n"
-    "#endif\r\n"
-    "#include ""afxres.h""\r\n"
-    "#include ""verrsrc.h""\r\n"
-    "\0"
-END
-
-3 TEXTINCLUDE 
-BEGIN
-    "#define _AFX_NO_SPLITTER_RESOURCES\r\n"
-    "#define _AFX_NO_OLE_RESOURCES\r\n"
-    "#define _AFX_NO_TRACKER_RESOURCES\r\n"
-    "#define _AFX_NO_PROPERTY_RESOURCES\r\n"
-    "\r\n"
-    "#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)\r\n"
-    "LANGUAGE 9, 1\r\n"
-    "#include ""res\\WinLauncher2.rc2""  // non-Microsoft Visual C++ edited resources\r\n"
-    "#include ""afxres.rc""      // Standard components\r\n"
-    "#if !defined(_AFXDLL)\r\n"
-    "#include ""afxribbon.rc""   // MFC ribbon and control bar resources\r\n"
-    "#endif\r\n"
-    "#endif\r\n"
-    "\0"
-END
-
-#endif    // APSTUDIO_INVOKED
-
-
-/////////////////////////////////////////////////////////////////////////////
-//
-// Version
-//
-
-VS_VERSION_INFO VERSIONINFO
- FILEVERSION 2,0,0,1
- PRODUCTVERSION 2,0,0,1
- FILEFLAGSMASK 0x3fL
-#ifdef _DEBUG
- FILEFLAGS 0x1L
-#else
- FILEFLAGS 0x0L
-#endif
- FILEOS 0x40004L
- FILETYPE 0x1L
- FILESUBTYPE 0x0L
-BEGIN
-    BLOCK "StringFileInfo"
-    BEGIN
-        BLOCK "040904b0"
-        BEGIN
-            VALUE "CompanyName", "Android"
-            VALUE "FileDescription", "Android Studio Windows Launcher"
-            VALUE "FileVersion", "2.0.0.1"
-            VALUE "InternalName", "WinLauncher2.exe"
-            VALUE "LegalCopyright", "(c) Android.  All rights reserved."
-            VALUE "OriginalFilename", "WinLauncher2.exe"
-            VALUE "ProductName", "Android SDK"
-            VALUE "ProductVersion", "2.0.0.1"
-        END
-    END
-    BLOCK "VarFileInfo"
-    BEGIN
-        VALUE "Translation", 0x409, 1200
-    END
-END
-
-
-/////////////////////////////////////////////////////////////////////////////
-//
-// Dialog
-//
-
-IDD_FINDJAVA2_DIALOG DIALOGEX 0, 0, 317, 197
-STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_MINIMIZEBOX | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
-EXSTYLE WS_EX_APPWINDOW
-CAPTION "Find Java 2 for Android"
-FONT 8, "MS Shell Dlg", 0, 0, 0x1
-BEGIN
-    DEFPUSHBUTTON   "Start",IDOK,205,174,50,14
-    PUSHBUTTON      "Quit",IDCANCEL,260,174,50,14
-    PUSHBUTTON      "Add...",IDC_BUTTON_ADD,7,174,50,14
-    LTEXT           "Select which version of Java to use:",IDC_STATIC,7,7,116,8
-    CONTROL         "",IDC_PATH_LIST,"SysListView32",LVS_REPORT | LVS_ALIGNLEFT | WS_BORDER | WS_TABSTOP,7,18,300,150
-END
-
-
-/////////////////////////////////////////////////////////////////////////////
-//
-// Icon
-//
-
-// Icon with lowest ID value placed first to ensure application icon
-// remains consistent on all systems.
-IDI_ANDROID_ICON        ICON                    "..\\android_icon.ico"
-
-/////////////////////////////////////////////////////////////////////////////
-//
-// DESIGNINFO
-//
-
-#ifdef APSTUDIO_INVOKED
-GUIDELINES DESIGNINFO
-BEGIN
-    IDD_FINDJAVA2_DIALOG, DIALOG
-    BEGIN
-        BOTTOMMARGIN, 196
-    END
-END
-#endif    // APSTUDIO_INVOKED
-
-#endif    // English (United States) resources
-/////////////////////////////////////////////////////////////////////////////
-
-
-
-#ifndef APSTUDIO_INVOKED
-/////////////////////////////////////////////////////////////////////////////
-//
-// Generated from the TEXTINCLUDE 3 resource.
-//
-#define _AFX_NO_SPLITTER_RESOURCES
-#define _AFX_NO_OLE_RESOURCES
-#define _AFX_NO_TRACKER_RESOURCES
-#define _AFX_NO_PROPERTY_RESOURCES
-
-#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
-LANGUAGE 9, 1
-#include "afxres.rc"      // Standard components
-#if !defined(_AFXDLL)
-#include "afxribbon.rc"   // MFC ribbon and control bar resources
-#endif
-#endif
-
-/////////////////////////////////////////////////////////////////////////////
-#endif    // not APSTUDIO_INVOKED
-
diff --git a/find_java2/WinLauncher2/WinLauncher2.vcxproj b/find_java2/WinLauncher2/WinLauncher2.vcxproj
deleted file mode 100755
index 9dfdca7..0000000
--- a/find_java2/WinLauncher2/WinLauncher2.vcxproj
+++ /dev/null
@@ -1,132 +0,0 @@
-﻿<?xml version="1.0" encoding="utf-8"?>
-<Project DefaultTargets="Build" ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <ItemGroup Label="ProjectConfigurations">
-    <ProjectConfiguration Include="Debug|Win32">
-      <Configuration>Debug</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Release|Win32">
-      <Configuration>Release</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-  </ItemGroup>
-  <PropertyGroup Label="Globals">
-    <ProjectGuid>{64980924-B76E-4E00-90A4-647E67CEB050}</ProjectGuid>
-    <RootNamespace>WinLauncher2</RootNamespace>
-    <Keyword>MFCProj</Keyword>
-  </PropertyGroup>
-  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <UseDebugLibraries>true</UseDebugLibraries>
-    <PlatformToolset>v120</PlatformToolset>
-    <CharacterSet>Unicode</CharacterSet>
-    <UseOfMfc>Dynamic</UseOfMfc>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <UseDebugLibraries>false</UseDebugLibraries>
-    <PlatformToolset>v120</PlatformToolset>
-    <WholeProgramOptimization>true</WholeProgramOptimization>
-    <CharacterSet>Unicode</CharacterSet>
-    <UseOfMfc>Dynamic</UseOfMfc>
-  </PropertyGroup>
-  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
-  <ImportGroup Label="ExtensionSettings">
-  </ImportGroup>
-  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
-    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
-  </ImportGroup>
-  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
-    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
-  </ImportGroup>
-  <PropertyGroup Label="UserMacros" />
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
-    <LinkIncremental>true</LinkIncremental>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
-    <LinkIncremental>false</LinkIncremental>
-  </PropertyGroup>
-  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
-    <ClCompile>
-      <PrecompiledHeader>Use</PrecompiledHeader>
-      <WarningLevel>Level3</WarningLevel>
-      <Optimization>Disabled</Optimization>
-      <PreprocessorDefinitions>WIN32;_WINDOWS;_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>$(ProjectDir);$(SolutionDir)\src;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-    </ClCompile>
-    <Link>
-      <SubSystem>Windows</SubSystem>
-      <GenerateDebugInformation>true</GenerateDebugInformation>
-      <AdditionalDependencies>version.lib</AdditionalDependencies>
-    </Link>
-    <Midl>
-      <MkTypLibCompatible>false</MkTypLibCompatible>
-      <ValidateAllParameters>true</ValidateAllParameters>
-      <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-    </Midl>
-    <ResourceCompile>
-      <Culture>0x0409</Culture>
-      <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>$(IntDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-    </ResourceCompile>
-  </ItemDefinitionGroup>
-  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
-    <ClCompile>
-      <WarningLevel>Level3</WarningLevel>
-      <PrecompiledHeader>Use</PrecompiledHeader>
-      <Optimization>MaxSpeed</Optimization>
-      <FunctionLevelLinking>true</FunctionLevelLinking>
-      <IntrinsicFunctions>true</IntrinsicFunctions>
-      <PreprocessorDefinitions>WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>$(ProjectDir);$(SolutionDir)\src;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-    </ClCompile>
-    <Link>
-      <SubSystem>Windows</SubSystem>
-      <GenerateDebugInformation>true</GenerateDebugInformation>
-      <EnableCOMDATFolding>true</EnableCOMDATFolding>
-      <OptimizeReferences>true</OptimizeReferences>
-      <AdditionalDependencies>version.lib</AdditionalDependencies>
-    </Link>
-    <Midl>
-      <MkTypLibCompatible>false</MkTypLibCompatible>
-      <ValidateAllParameters>true</ValidateAllParameters>
-      <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-    </Midl>
-    <ResourceCompile>
-      <Culture>0x0409</Culture>
-      <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>$(IntDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-    </ResourceCompile>
-  </ItemDefinitionGroup>
-  <ItemGroup>
-    <ClInclude Include="..\src\FindJava2Dlg.h" />
-    <ClInclude Include="..\src\JavaFinder.h" />
-    <ClInclude Include="..\src\JavaPath.h" />
-    <ClInclude Include="..\src\utils.h" />
-    <ClInclude Include="..\src\WinLauncher2App.h" />
-    <ClInclude Include="Resource.h" />
-    <ClInclude Include="stdafx.h" />
-    <ClInclude Include="targetver.h" />
-  </ItemGroup>
-  <ItemGroup>
-    <ClCompile Include="..\src\FindJava2Dlg.cpp" />
-    <ClCompile Include="..\src\JavaFinder.cpp" />
-    <ClCompile Include="..\src\JavaPath.cpp" />
-    <ClCompile Include="..\src\utils.cpp" />
-    <ClCompile Include="..\src\WinLauncher2App.cpp" />
-    <ClCompile Include="stdafx.cpp">
-      <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Create</PrecompiledHeader>
-      <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Create</PrecompiledHeader>
-    </ClCompile>
-  </ItemGroup>
-  <ItemGroup>
-    <ResourceCompile Include="WinLauncher2.rc" />
-  </ItemGroup>
-  <ItemGroup>
-    <Image Include="..\android_icon.ico" />
-  </ItemGroup>
-  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
-  <ImportGroup Label="ExtensionTargets">
-  </ImportGroup>
-</Project>
\ No newline at end of file
diff --git a/find_java2/WinLauncher2/res/WinLauncher2.ico b/find_java2/WinLauncher2/res/WinLauncher2.ico
deleted file mode 100755
index d56fbcd..0000000
--- a/find_java2/WinLauncher2/res/WinLauncher2.ico
+++ /dev/null
Binary files differ
diff --git a/find_java2/WinLauncher2/stdafx.cpp b/find_java2/WinLauncher2/stdafx.cpp
deleted file mode 100755
index 00a69d2..0000000
--- a/find_java2/WinLauncher2/stdafx.cpp
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
-* Copyright (C) 2014 The Android Open Source Project
-*
-* Licensed under the Apache License, Version 2.0 (the "License");
-* you may not use this file except in compliance with the License.
-* You may obtain a copy of the License at
-*
-*      http://www.apache.org/licenses/LICENSE-2.0
-*
-* Unless required by applicable law or agreed to in writing, software
-* distributed under the License is distributed on an "AS IS" BASIS,
-* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-* See the License for the specific language governing permissions and
-* limitations under the License.
-*/
-
-
-// stdafx.cpp : source file that includes just the standard includes
-// WinLauncher2.pch will be the pre-compiled header
-// stdafx.obj will contain the pre-compiled type information
-
-#include "stdafx.h"
-
-
diff --git a/find_java2/WinLauncher2/stdafx.h b/find_java2/WinLauncher2/stdafx.h
deleted file mode 100755
index 86caf00..0000000
--- a/find_java2/WinLauncher2/stdafx.h
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
-* Copyright (C) 2014 The Android Open Source Project
-*
-* Licensed under the Apache License, Version 2.0 (the "License");
-* you may not use this file except in compliance with the License.
-* You may obtain a copy of the License at
-*
-*      http://www.apache.org/licenses/LICENSE-2.0
-*
-* Unless required by applicable law or agreed to in writing, software
-* distributed under the License is distributed on an "AS IS" BASIS,
-* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-* See the License for the specific language governing permissions and
-* limitations under the License.
-*/
-
-// stdafx.h : include file for standard system include files,
-// or project specific include files that are used frequently,
-// but are changed infrequently
-
-#pragma once
-
-#ifndef VC_EXTRALEAN
-#define VC_EXTRALEAN            // Exclude rarely-used stuff from Windows headers
-#endif
-
-#include "targetver.h"
-
-#define _CRT_SECURE_NO_WARNINGS
-
-#define _ATL_CSTRING_EXPLICIT_CONSTRUCTORS      // some CString constructors will be explicit
-
-// turns off MFC's hiding of some common and often safely ignored warning messages
-#define _AFX_ALL_WARNINGS
-
-#include <afxwin.h>         // MFC core and standard components
-#include <afxext.h>         // MFC extensions
-
-
-#include <afxdisp.h>        // MFC Automation classes
-
-
-
-#ifndef _AFX_NO_OLE_SUPPORT
-#include <afxdtctl.h>           // MFC support for Internet Explorer 4 Common Controls
-#endif
-#ifndef _AFX_NO_AFXCMN_SUPPORT
-#include <afxcmn.h>             // MFC support for Windows Common Controls
-#endif // _AFX_NO_AFXCMN_SUPPORT
-
-#include <afxcontrolbars.h>     // MFC support for ribbons and control bars
-
-
-
-
-#ifdef _UNICODE
-#if defined _M_IX86
-#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='x86' publicKeyToken='6595b64144ccf1df' language='*'\"")
-#elif defined _M_X64
-#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='amd64' publicKeyToken='6595b64144ccf1df' language='*'\"")
-#else
-#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"")
-#endif
-#endif
-
-
diff --git a/find_java2/WinLauncher2/targetver.h b/find_java2/WinLauncher2/targetver.h
deleted file mode 100755
index fc6d20b..0000000
--- a/find_java2/WinLauncher2/targetver.h
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
-* Copyright (C) 2014 The Android Open Source Project
-*
-* Licensed under the Apache License, Version 2.0 (the "License");
-* you may not use this file except in compliance with the License.
-* You may obtain a copy of the License at
-*
-*      http://www.apache.org/licenses/LICENSE-2.0
-*
-* Unless required by applicable law or agreed to in writing, software
-* distributed under the License is distributed on an "AS IS" BASIS,
-* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-* See the License for the specific language governing permissions and
-* limitations under the License.
-*/
-
-#pragma once
-
-// Including SDKDDKVer.h defines the highest available Windows platform.
-
-// If you wish to build your application for a previous Windows platform, include WinSDKVer.h and
-// set the _WIN32_WINNT macro to the platform you wish to support before including SDKDDKVer.h.
-
-#include <SDKDDKVer.h>
diff --git a/find_java2/android_icon.ico b/find_java2/android_icon.ico
deleted file mode 100755
index 354bd5d..0000000
--- a/find_java2/android_icon.ico
+++ /dev/null
Binary files differ
diff --git a/find_java2/src/FindJava2Dlg.cpp b/find_java2/src/FindJava2Dlg.cpp
deleted file mode 100755
index fbdd899..0000000
--- a/find_java2/src/FindJava2Dlg.cpp
+++ /dev/null
@@ -1,268 +0,0 @@
-/*
-* Copyright (C) 2014 The Android Open Source Project
-*
-* Licensed under the Apache License, Version 2.0 (the "License");
-* you may not use this file except in compliance with the License.
-* You may obtain a copy of the License at
-*
-*      http://www.apache.org/licenses/LICENSE-2.0
-*
-* Unless required by applicable law or agreed to in writing, software
-* distributed under the License is distributed on an "AS IS" BASIS,
-* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-* See the License for the specific language governing permissions and
-* limitations under the License.
-*/
-
-
-#include "stdafx.h"
-#include "utils.h"
-#include "FindJava2Dlg.h"
-#include "afxdialogex.h"
-#include <atlpath.h>                            // ATL CPath
-
-#ifdef _DEBUG
-#define new DEBUG_NEW
-#endif
-
-#define COL_PATH 1
-
-
-CFindJava2Dlg::CFindJava2Dlg(CWnd* pParent /*=NULL*/)
-    : CDialog(CFindJava2Dlg::IDD, pParent), mSelectedIndex(-1) {
-    m_hIcon = AfxGetApp()->LoadIcon(IDI_ANDROID_ICON);
-}
-
-void CFindJava2Dlg::DoDataExchange(CDataExchange* pDX) {
-    CDialog::DoDataExchange(pDX);
-    DDX_Control(pDX, IDC_PATH_LIST, mPathsListCtrl);
-    DDX_Control(pDX, IDOK, mOkButton);
-}
-
-BEGIN_MESSAGE_MAP(CFindJava2Dlg, CDialog)
-    ON_WM_PAINT()
-    ON_WM_QUERYDRAGICON()
-    ON_BN_CLICKED(IDC_BUTTON_ADD, &CFindJava2Dlg::OnBnClickedButtonAdd)
-    ON_NOTIFY(NM_CLICK, IDC_PATH_LIST, &CFindJava2Dlg::OnNMClickPathList)
-    ON_NOTIFY(LVN_ITEMCHANGED, IDC_PATH_LIST, &CFindJava2Dlg::OnLvnItemchangedPathList)
-END_MESSAGE_MAP()
-
-
-// -----
-// CFindJava2Dlg message handlers
-
-BOOL CFindJava2Dlg::OnInitDialog() {
-    CDialog::OnInitDialog();
-
-    SetWindowText(getAppName());
-
-    // Set the icon for this dialog.  The framework does this automatically
-    //  when the application's main window is not a dialog
-    SetIcon(m_hIcon, TRUE);			// Set big icon
-    SetIcon(m_hIcon, FALSE);		// Set small icon
-
-    // Initialize list controls
-    mPathsListCtrl.SetExtendedStyle(
-        mPathsListCtrl.GetExtendedStyle() |
-        LVS_EX_CHECKBOXES | 
-        LVS_EX_FULLROWSELECT | 
-        LVS_EX_GRIDLINES);
-
-    // We want 2 columns: Java version and path
-    mPathsListCtrl.InsertColumn(0, _T("Version"), LVCFMT_RIGHT, 60,  0);
-    mPathsListCtrl.InsertColumn(1, _T("Path"),     LVCFMT_LEFT, 386, 0);
-
-    mJavaFinder->findJavaPaths(&mPaths);
-    fillPathsList();
-    adjustButtons();
-
-    return TRUE;  // return TRUE  unless you set the focus to a control
-}
-
-// If you add a minimize button to your dialog, you will need the code below
-// to draw the icon.  For MFC applications using the document/view model,
-// this is automatically done for you by the framework.
-// [Note: MFC boilerplate, keep as-is]
-void CFindJava2Dlg::OnPaint() {
-    if (IsIconic()) {
-        CPaintDC dc(this); // device context for painting
-
-        SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
-
-        // Center icon in client rectangle
-        int cxIcon = GetSystemMetrics(SM_CXICON);
-        int cyIcon = GetSystemMetrics(SM_CYICON);
-        CRect rect;
-        GetClientRect(&rect);
-        int x = (rect.Width() - cxIcon + 1) / 2;
-        int y = (rect.Height() - cyIcon + 1) / 2;
-
-        // Draw the icon
-        dc.DrawIcon(x, y, m_hIcon);
-    } else {
-        CDialog::OnPaint();
-    }
-}
-
-// The system calls this function to obtain the cursor to display while the user drags
-// the minimized window. [Note: MFC boilerplate, keep as-is]
-HCURSOR CFindJava2Dlg::OnQueryDragIcon() {
-    return static_cast<HCURSOR>(m_hIcon);
-}
-
-// Button add has been pressed; use file dialog and add path if it's a valid java.exe
-void CFindJava2Dlg::OnBnClickedButtonAdd() {
-    CFileDialog fileDlg(
-        TRUE,           // true=open dialog,  false=save-as dialog
-        _T("exe"),      // lpszDefExt 
-        _T("java.exe"), // lpszFileName 
-        OFN_FILEMUSTEXIST || OFN_PATHMUSTEXIST,
-        NULL,           // lpszFilter
-        this);          // pParentWnd
-
-    if (fileDlg.DoModal() == IDOK) {
-        CString path = fileDlg.GetPathName();
-
-        CJavaPath javaPath;
-        if (!mJavaFinder->checkJavaPath(path, &javaPath)) {
-            CString msg;
-            if (javaPath.mVersion > 0) {
-                msg.Format(_T("Insufficient Java Version found: expected %s, got %s"), 
-                           CJavaPath(mJavaFinder->getMinVersion(), CPath()).getVersion(),
-                           javaPath.getVersion());
-            } else {
-                msg.Format(_T("No valid Java Version found for %s"), path);
-            }
-            AfxMessageBox(msg, MB_OK);
-
-        } else {
-            if (mPaths.find(javaPath) == mPaths.end()) {
-                // Path isn't known yet so add it and refresh the list.
-                mPaths.insert(javaPath);
-                fillPathsList();
-            }
-
-            // Select item in list and set mSelectedIndex
-            selectPath(-1 /*index*/, &javaPath);
-        }
-    }
-}
-
-// An item in the list has been selected, select checkmark and set mSelectedIndex.
-void CFindJava2Dlg::OnNMClickPathList(NMHDR *pNMHDR, LRESULT *pResult) {
-    LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);
-    int index = pNMItemActivate->iItem;
-    selectPath(index, nullptr);
-    *pResult = TRUE;
-}
-
-// An item in the list has changed, toggle checkmark as needed.
-void CFindJava2Dlg::OnLvnItemchangedPathList(NMHDR *pNMHDR, LRESULT *pResult) {
-    *pResult = FALSE;
-    LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR);
-
-    if ((pNMLV->uChanged & LVIF_STATE) != 0) {
-        // Item's state has changed. Check the selection to see if it needs to be adjusted.
-        int index = pNMLV->iItem;
-
-        UINT oldState = pNMLV->uOldState;
-        UINT newState = pNMLV->uNewState;
-
-        if ((oldState & LVIS_STATEIMAGEMASK) != 0 || (newState & LVIS_STATEIMAGEMASK) != 0) {
-            // Checkbox uses the STATEIMAGE: 1 for unchecked, 2 for checked.
-            // Checkbox is checked when (old/new-state & state-image-mask) == INDEXTOSTATEIMAGEMASK(2).
-
-            bool oldChecked = (oldState & LVIS_STATEIMAGEMASK) == INDEXTOSTATEIMAGEMASK(2);
-            bool newChecked = (newState & LVIS_STATEIMAGEMASK) == INDEXTOSTATEIMAGEMASK(2);
-
-            if (oldChecked && !newChecked && index == mSelectedIndex) {
-                mSelectedIndex = -1;
-                adjustButtons();
-            } else if (!oldChecked && newChecked && index != mSelectedIndex) {
-                // Uncheck any checked rows if any
-                for (int n = mPathsListCtrl.GetItemCount() - 1; n >= 0; --n) {
-                    if (n != index && mPathsListCtrl.GetCheck(n)) {
-                        mPathsListCtrl.SetCheck(n, FALSE);
-                    }
-                }
-
-                mSelectedIndex = index;
-                adjustButtons();
-            }
-            // We handled this case, don't dispatch it further
-            *pResult = TRUE;
-        }
-    }
-}
-
-// -----
-
-const CJavaPath& CFindJava2Dlg::getSelectedPath() {
-    int i = 0;
-    for (const CJavaPath &p : mPaths) {
-        if (i == mSelectedIndex) {
-            return p;
-        }
-        ++i;
-    }
-
-    return CJavaPath::sEmpty;
-}
-
-
-void CFindJava2Dlg::fillPathsList() {
-    mPathsListCtrl.DeleteAllItems();
-    int index = 0;
-
-    for (const CJavaPath& pv : mPaths) {
-        mPathsListCtrl.InsertItem(index, pv.getVersion());        // column 0 = version
-        mPathsListCtrl.SetItemText(index, COL_PATH, pv.mPath);    // column 1 = path
-        mPathsListCtrl.SetCheck(index, mSelectedIndex == index);
-        ++index;
-    }
-}
-
-// Checks the given index if valid. Unchecks all other items.
-//
-// If index >= 0, it is used to select that item from the ListControl.
-// Otherwise if path != nullptr, it is used to find the item and select it.
-//
-// Side effect: in both cases, mSelectedIndex is set to the matching index or -1.
-//
-// If index is invalid and path isn't in the mPaths list, all items are unselected
-// so calling this with (0, nullptr) will clear the current selection.
-void CFindJava2Dlg::selectPath(int index, const CJavaPath *path) {
-
-    const CJavaPath *foundPath;
-    // If index is not defined, find the given path in the internal list.
-    // If path is not defined, find its index in the internal list.
-    int i = 0;
-    int n = mPathsListCtrl.GetItemCount();
-    for (const CJavaPath &p : mPaths) {
-        if (index < 0 && path != nullptr && p == *path) {
-            index = i;
-            foundPath = path;
-        } else if (index == i) {
-            foundPath = &p;
-        }
-
-        // uncheck any marked path
-        if (i != index && i < n && mPathsListCtrl.GetCheck(i)) {
-            mPathsListCtrl.SetCheck(i, FALSE);
-        }
-
-        ++i;
-    }
-
-    mSelectedIndex = index;
-    if (index >= 0 && index <= n) {
-        mPathsListCtrl.SetCheck(index, TRUE);
-    }
-
-    adjustButtons();
-}
-
-void CFindJava2Dlg::adjustButtons() {
-    int n = mPathsListCtrl.GetItemCount();
-    mOkButton.EnableWindow(mSelectedIndex >= 0 && mSelectedIndex < n);
-}
diff --git a/find_java2/src/FindJava2Dlg.h b/find_java2/src/FindJava2Dlg.h
deleted file mode 100755
index 7e0943c..0000000
--- a/find_java2/src/FindJava2Dlg.h
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
-* Copyright (C) 2014 The Android Open Source Project
-*
-* Licensed under the Apache License, Version 2.0 (the "License");
-* you may not use this file except in compliance with the License.
-* You may obtain a copy of the License at
-*
-*      http://www.apache.org/licenses/LICENSE-2.0
-*
-* Unless required by applicable law or agreed to in writing, software
-* distributed under the License is distributed on an "AS IS" BASIS,
-* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-* See the License for the specific language governing permissions and
-* limitations under the License.
-*/
-
-#pragma once
-#include "afxwin.h"
-#include "JavaFinder.h"
-
-#include "resource.h"		// main symbols
-
-
-// CFindJava2Dlg dialog
-class CFindJava2Dlg : public CDialog {
-    // Construction
-public:
-    CFindJava2Dlg(CWnd* pParent = NULL);	// standard constructor
-
-    void setJavaFinder(CJavaFinder *javaFinder) { mJavaFinder = javaFinder;  }
-    const CJavaPath& getSelectedPath();
-
-    // Dialog Data
-    enum { IDD = IDD_FINDJAVA2_DIALOG };
-
-protected:
-    virtual void DoDataExchange(CDataExchange* pDX);	// DDX/DDV support
-
-
-    // Implementation
-protected:
-    HICON m_hIcon;
-
-    // Generated message map functions
-    virtual BOOL OnInitDialog();
-    afx_msg void OnPaint();
-    afx_msg HCURSOR OnQueryDragIcon();
-    DECLARE_MESSAGE_MAP()
-
-    afx_msg void OnBnClickedButtonAdd();
-    afx_msg void OnNMClickPathList(NMHDR *pNMHDR, LRESULT *pResult);
-    afx_msg void OnLvnItemchangedPathList(NMHDR *pNMHDR, LRESULT *pResult);
-
-private:
-    std::set<CJavaPath> mPaths;
-    int mSelectedIndex;
-    CJavaFinder *mJavaFinder;
-    CListCtrl mPathsListCtrl;
-    CButton mOkButton;
-
-    void fillPathsList();
-    void adjustButtons();
-    void selectPath(int index = -1, const CJavaPath *path = nullptr);
-};
diff --git a/find_java2/src/JavaFinder.cpp b/find_java2/src/JavaFinder.cpp
deleted file mode 100755
index 60a2e23..0000000
--- a/find_java2/src/JavaFinder.cpp
+++ /dev/null
@@ -1,594 +0,0 @@
-/*
-* Copyright (C) 2014 The Android Open Source Project
-*
-* Licensed under the Apache License, Version 2.0 (the "License");
-* you may not use this file except in compliance with the License.
-* You may obtain a copy of the License at
-*
-*      http://www.apache.org/licenses/LICENSE-2.0
-*
-* Unless required by applicable law or agreed to in writing, software
-* distributed under the License is distributed on an "AS IS" BASIS,
-* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-* See the License for the specific language governing permissions and
-* limitations under the License.
-*/
-
-#include "stdafx.h"
-#include "JavaFinder.h"
-#include "utils.h"
-
-#include <algorithm>        // std::sort and std::unique
-
-#define  _CRT_SECURE_NO_WARNINGS
-
-// --------------
-
-#define JF_REGISTRY_KEY         _T("Software\\Android\\FindJava2")
-#define JF_REGISTRY_VALUE_PATH  _T("JavaPath")
-#define JF_REGISTRY_VALUE_VERS  _T("JavaVers")
-
-// --------------
-
-
-// Extract the first thing that looks like (digit.digit+).
-// Note: this will break when java reports a version with major > 9.
-// However it will reasonably cope with "1.10", if that ever happens.
-static bool extractJavaVersion(const TCHAR *start,
-                               int length,
-                               CString *outVersionStr,
-                               int *outVersionInt) {
-    const TCHAR *end = start + length;
-    for (const TCHAR *c = start; c < end - 2; c++) {
-        if (isdigit(c[0]) &&
-            c[1] == '.' &&
-            isdigit(c[2])) {
-            const TCHAR *e = c + 2;
-            while (isdigit(e[1])) {
-                e++;
-            }
-            outVersionStr->SetString(c, e - c + 1);
-
-            // major is currently only 1 digit
-            int major = (*c - '0');
-            // add minor
-            int minor = 0;
-            for (int m = 1; *e != '.'; e--, m *= 10) {
-                minor += (*e - '0') * m;
-            }
-            *outVersionInt = JAVA_VERS_TO_INT(major, minor);
-            return true;
-        }
-    }
-    return false;
-}
-
-// Tries to invoke the java.exe at the given path and extract it's
-// version number.
-// - outVersionStr: not null, will capture version as a string (e.g. "1.6")
-// - outVersionInt: not null, will capture version as an int (see JavaPath.h).
-bool getJavaVersion(CPath &javaPath, CString *outVersionStr, int *outVersionInt) {
-    bool result = false;
-
-    // Run "java -version", which outputs something to *STDERR* like this:
-    //
-    // java version "1.6.0_29"
-    // Java(TM) SE Runtime Environment (build 1.6.0_29-b11)
-    // Java HotSpot(TM) Client VM (build 20.4-b02, mixed mode, sharing)
-    //
-    // We want to capture the first line, and more exactly the "1.6" part.
-
-
-    CString cmd;
-    cmd.Format(_T("\"%s\" -version"), (LPCTSTR) javaPath);
-
-    SECURITY_ATTRIBUTES   saAttr;
-    STARTUPINFO           startup;
-    PROCESS_INFORMATION   pinfo;
-
-    // Want to inherit pipe handle
-    ZeroMemory(&saAttr, sizeof(saAttr));
-    saAttr.nLength = sizeof(SECURITY_ATTRIBUTES);
-    saAttr.bInheritHandle = TRUE;
-    saAttr.lpSecurityDescriptor = NULL;
-
-    // Create pipe for stdout
-    HANDLE stdoutPipeRd, stdoutPipeWt;
-    if (!CreatePipe(
-            &stdoutPipeRd,      // hReadPipe,
-            &stdoutPipeWt,      // hWritePipe,
-            &saAttr,            // lpPipeAttributes,
-            0)) {               // nSize (0=default buffer size)
-        // In FindJava2, we do not report these errors. Leave commented for reference.
-        // // if (gIsConsole || gIsDebug) displayLastError("CreatePipe failed: ");
-        return false;
-    }
-    if (!SetHandleInformation(stdoutPipeRd, HANDLE_FLAG_INHERIT, 0)) {
-        // In FindJava2, we do not report these errors. Leave commented for reference.
-        // // if (gIsConsole || gIsDebug) displayLastError("SetHandleInformation failed: ");
-        return false;
-    }
-
-    ZeroMemory(&pinfo, sizeof(pinfo));
-
-    ZeroMemory(&startup, sizeof(startup));
-    startup.cb = sizeof(startup);
-    startup.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;
-    startup.wShowWindow = SW_HIDE | SW_MINIMIZE;
-    // Capture both stderr and stdout
-    startup.hStdError = stdoutPipeWt;
-    startup.hStdOutput = stdoutPipeWt;
-    startup.hStdInput = GetStdHandle(STD_INPUT_HANDLE);
-
-    BOOL ok = CreateProcess(
-        NULL,                   // program path
-        (LPTSTR)((LPCTSTR) cmd),// command-line
-        NULL,                   // process handle is not inheritable
-        NULL,                   // thread handle is not inheritable
-        TRUE,                   // yes, inherit some handles
-        0,                      // process creation flags
-        NULL,                   // use parent's environment block
-        NULL,                   // use parent's starting directory
-        &startup,               // startup info, i.e. std handles
-        &pinfo);
-
-    // In FindJava2, we do not report these errors. Leave commented for reference.
-    // // if ((gIsConsole || gIsDebug) && !ok) displayLastError("CreateProcess failed: ");
-
-    // Close the write-end of the output pipe (we're only reading from it)
-    CloseHandle(stdoutPipeWt);
-
-    // Read from the output pipe. We don't need to read everything,
-    // the first line should be 'Java version "1.2.3_45"\r\n'
-    // so reading about 32 chars is all we need.
-    TCHAR first32[32 + 1];
-    int index = 0;
-    first32[0] = 0;
-
-    if (ok) {
-        #define SIZE 1024
-        char buffer[SIZE];
-        DWORD sizeRead = 0;
-
-        while (ok) {
-            // Keep reading in the same buffer location
-            // Note: ReadFile uses a char buffer, not a TCHAR one.
-            ok = ReadFile(stdoutPipeRd,     // hFile
-                          buffer,           // lpBuffer
-                          SIZE,             // DWORD buffer size to read
-                          &sizeRead,        // DWORD buffer size read
-                          NULL);            // overlapped
-            if (!ok || sizeRead == 0 || sizeRead > SIZE) break;
-
-            // Copy up to the first 32 characters
-            if (index < 32) {
-                DWORD n = 32 - index;
-                if (n > sizeRead) n = sizeRead;
-                // copy as lowercase to simplify checks later
-                for (char *b = buffer; n > 0; n--, b++, index++) {
-                    char c = *b;
-                    if (c >= 'A' && c <= 'Z') c += 'a' - 'A';
-                    first32[index] = c;
-                }
-                first32[index] = 0;
-            }
-        }
-
-        WaitForSingleObject(pinfo.hProcess, INFINITE);
-
-        DWORD exitCode;
-        if (GetExitCodeProcess(pinfo.hProcess, &exitCode)) {
-            // this should not return STILL_ACTIVE (259)
-            result = exitCode == 0;
-        }
-
-        CloseHandle(pinfo.hProcess);
-        CloseHandle(pinfo.hThread);
-    }
-    CloseHandle(stdoutPipeRd);
-
-    if (result && index > 0) {
-        // Look for a few keywords in the output however we don't
-        // care about specific ordering or case-senstiviness.
-        // We only capture roughtly the first line in lower case.
-        TCHAR *j = _tcsstr(first32, _T("java"));
-        TCHAR *v = _tcsstr(first32, _T("version"));
-        // In FindJava2, we do not report these errors. Leave commented for reference.
-        // // if ((gIsConsole || gIsDebug) && (!j || !v)) {
-        // //     fprintf(stderr, "Error: keywords 'java version' not found in '%s'\n", first32);
-        // // }
-        if (j != NULL && v != NULL) {
-            result = extractJavaVersion(first32, index, outVersionStr, outVersionInt);
-        }
-    }
-
-    return result;
-}
-
-// --------------
-
-// Checks whether we can find $PATH/java.exe.
-// inOutPath should be the directory where we're looking at.
-// In output, it will be the java path we tested.
-// Returns the java version integer found (e.g. 1006 for 1.6).
-// Return 0 in case of error.
-static int checkPath(CPath *inOutPath) {
-
-    // Append java.exe to path if not already present
-    CString &p = (CString&)*inOutPath;
-    int n = p.GetLength();
-    if (n < 9 || p.Right(9).CompareNoCase(_T("\\java.exe")) != 0) {
-        inOutPath->Append(_T("java.exe"));
-    }
-
-    int result = 0;
-    PVOID oldWow64Value = disableWow64FsRedirection();
-    if (inOutPath->FileExists()) {
-        // Run java -version
-        // Reject the version if it's not at least our current minimum.
-        CString versionStr;
-        if (!getJavaVersion(*inOutPath, &versionStr, &result)) {
-            result = 0;
-        }
-    }
-
-    revertWow64FsRedirection(oldWow64Value);
-    return result;
-}
-
-// Check whether we can find $PATH/bin/java.exe
-// Returns the Java version found (e.g. 1006 for 1.6) or 0 in case of error.
-static int checkBinPath(CPath *inOutPath) {
-
-    // Append bin to path if not already present
-    CString &p = (CString&)*inOutPath;
-    int n = p.GetLength();
-    if (n < 4 || p.Right(4).CompareNoCase(_T("\\bin")) != 0) {
-        inOutPath->Append(_T("bin"));
-    }
-
-    return checkPath(inOutPath);
-}
-
-// Search java.exe in the environment
-static void findJavaInEnvPath(std::set<CJavaPath> *outPaths) {
-    ::SetLastError(0);
-
-    const TCHAR* envPath = _tgetenv(_T("JAVA_HOME"));
-    if (envPath != NULL) {
-        CPath p(envPath);
-        int v = checkBinPath(&p);
-        if (v > 0) {
-            outPaths->insert(CJavaPath(v, p));
-        }
-    }
-
-    envPath = _tgetenv(_T("PATH"));
-    if (envPath != NULL) {
-        // Otherwise look at the entries in the current path.
-        // If we find more than one, keep the one with the highest version.
-        CString pathTokens(envPath);
-        int curPos = 0;
-        CString tok;
-        do {
-            tok = pathTokens.Tokenize(_T(";"), curPos);
-            if (!tok.IsEmpty()) {
-                CPath p(tok);
-                int v = checkPath(&p);
-                if (v > 0) {
-                    outPaths->insert(CJavaPath(v, p));
-                }
-            }
-        } while (!tok.IsEmpty());
-    }
-}
-
-
-// --------------
-
-static bool getRegValue(const TCHAR *keyPath,
-                        const TCHAR *keyName,
-                        REGSAM access,
-                        CString *outValue) {
-    HKEY key;
-    LSTATUS status = RegOpenKeyEx(
-        HKEY_LOCAL_MACHINE,         // hKey
-        keyPath,                    // lpSubKey
-        0,                          // ulOptions
-        KEY_READ | access,          // samDesired,
-        &key);                      // phkResult
-    if (status == ERROR_SUCCESS) {
-        LSTATUS ret = ERROR_MORE_DATA;
-        DWORD size = 4096; // MAX_PATH is 260, so 4 KB should be good enough
-        TCHAR* buffer = (TCHAR*)malloc(size);
-
-        while (ret == ERROR_MORE_DATA && size < (1 << 16) /*64 KB*/) {
-            ret = RegQueryValueEx(
-                key,                // hKey
-                keyName,            // lpValueName
-                NULL,               // lpReserved
-                NULL,               // lpType
-                (LPBYTE)buffer,     // lpData
-                &size);             // lpcbData
-
-            if (ret == ERROR_MORE_DATA) {
-                size *= 2;
-                buffer = (TCHAR*)realloc(buffer, size);
-            } else {
-                buffer[size] = 0;
-            }
-        }
-
-        if (ret != ERROR_MORE_DATA) {
-            outValue->SetString(buffer);
-        }
-
-        free(buffer);
-        RegCloseKey(key);
-
-        return (ret != ERROR_MORE_DATA);
-    }
-
-    return false;
-}
-
-// Explore the registry to find a suitable version of Java.
-// Returns an int which is the version of Java found (e.g. 1006 for 1.6) and the
-// matching path in outJavaPath.
-// Returns 0 if nothing suitable was found.
-static int exploreJavaRegistry(const TCHAR *entry, REGSAM access, std::set<CJavaPath> *outPaths) {
-
-    // Let's visit HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Runtime Environment [CurrentVersion]
-    CPath rootKey(_T("SOFTWARE\\JavaSoft\\"));
-    rootKey.Append(entry);
-
-    CString currentVersion;
-    CPath subKey(rootKey);
-    if (getRegValue(subKey, _T("CurrentVersion"), access, &currentVersion)) {
-        // CurrentVersion should be something like "1.7".
-        // We want to read HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Runtime Environment\1.7 [JavaHome]
-        subKey.Append(currentVersion);
-        CString value;
-        if (getRegValue(subKey, _T("JavaHome"), access, &value)) {
-            CPath javaHome(value);
-            int v = checkBinPath(&javaHome);
-            if (v > 0) {
-                outPaths->insert(CJavaPath(v, javaHome));
-            }
-        }
-    }
-
-    // Try again, but this time look at all the versions available
-    HKEY javaHomeKey;
-    LSTATUS status = RegOpenKeyEx(
-        HKEY_LOCAL_MACHINE,         // hKey
-        _T("SOFTWARE\\JavaSoft"),   // lpSubKey
-        0,                          // ulOptions
-        KEY_READ | access,          // samDesired
-        &javaHomeKey);              // phkResult
-    if (status == ERROR_SUCCESS) {
-        TCHAR name[MAX_PATH + 1];
-        DWORD index = 0;
-        CPath javaHome;
-        for (LONG result = ERROR_SUCCESS; result == ERROR_SUCCESS; index++) {
-            DWORD nameLen = MAX_PATH;
-            name[nameLen] = 0;
-            result = RegEnumKeyEx(
-                javaHomeKey,  // hKey
-                index,        // dwIndex
-                name,         // lpName
-                &nameLen,     // lpcName
-                NULL,         // lpReserved
-                NULL,         // lpClass
-                NULL,         // lpcClass,
-                NULL);        // lpftLastWriteTime
-            if (result == ERROR_SUCCESS && nameLen < MAX_PATH) {
-                name[nameLen] = 0;
-                CPath subKey(rootKey);
-                subKey.Append(name);
-
-                CString value;
-                if (getRegValue(subKey, _T("JavaHome"), access, &value)) {
-                    CPath javaHome(value);
-                    int v = checkBinPath(&javaHome);
-                    if (v > 0) {
-                        outPaths->insert(CJavaPath(v, javaHome));
-                    }
-                }
-            }
-        }
-
-        RegCloseKey(javaHomeKey);
-    }
-
-    return 0;
-}
-
-static void findJavaInRegistry(std::set<CJavaPath> *outPaths) {
-    // We'll do the registry test 3 times: first using the default mode,
-    // then forcing the use of the 32-bit registry then forcing the use of
-    // 64-bit registry. On Windows 2k, the 2 latter will fail since the
-    // flags are not supported. On a 32-bit OS the 64-bit is obviously
-    // useless and the 2 first tests should be equivalent so we just
-    // need the first case.
-
-    // Check the JRE first, then the JDK.
-    exploreJavaRegistry(_T("Java Runtime Environment"), 0, outPaths);
-    exploreJavaRegistry(_T("Java Development Kit"), 0, outPaths);
-
-    // Get the app sysinfo state (the one hidden by WOW64)
-    SYSTEM_INFO sysInfo;
-    GetSystemInfo(&sysInfo);
-    WORD programArch = sysInfo.wProcessorArchitecture;
-    // Check the real sysinfo state (not the one hidden by WOW64) for x86
-    GetNativeSystemInfo(&sysInfo);
-    WORD actualArch = sysInfo.wProcessorArchitecture;
-
-    // Only try to access the WOW64-32 redirected keys on a 64-bit system.
-    // There's no point in doing this on a 32-bit system.
-    if (actualArch == PROCESSOR_ARCHITECTURE_AMD64) {
-        if (programArch != PROCESSOR_ARCHITECTURE_INTEL) {
-            // If we did the 32-bit case earlier, don't do it twice.
-            exploreJavaRegistry(_T("Java Runtime Environment"), KEY_WOW64_32KEY, outPaths);
-            exploreJavaRegistry(_T("Java Development Kit"),     KEY_WOW64_32KEY, outPaths);
-
-        } else if (programArch != PROCESSOR_ARCHITECTURE_AMD64) {
-            // If we did the 64-bit case earlier, don't do it twice.
-            exploreJavaRegistry(_T("Java Runtime Environment"), KEY_WOW64_64KEY, outPaths);
-            exploreJavaRegistry(_T("Java Development Kit"),     KEY_WOW64_64KEY, outPaths);
-        }
-    }
-}
-
-// --------------
-
-static void checkProgramFiles(std::set<CJavaPath> *outPaths) {
-
-    TCHAR programFilesPath[MAX_PATH + 1];
-    HRESULT result = SHGetFolderPath(
-        NULL,                       // hwndOwner
-        CSIDL_PROGRAM_FILES,        // nFolder
-        NULL,                       // hToken
-        SHGFP_TYPE_CURRENT,         // dwFlags
-        programFilesPath);          // pszPath
-
-    CPath path(programFilesPath);
-    path.Append(_T("Java"));
-
-    // Do we have a C:\\Program Files\\Java directory?
-    if (!path.IsDirectory()) {
-        return;
-    }
-
-    CPath glob(path);
-    glob.Append(_T("j*"));
-
-    WIN32_FIND_DATA findData;
-    HANDLE findH = FindFirstFile(glob, &findData);
-    if (findH == INVALID_HANDLE_VALUE) {
-        return;
-    }
-    do {
-        if ((findData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) != 0) {
-            CPath temp(path);
-            temp.Append(findData.cFileName);
-            // Check C:\\Program Files[x86]\\Java\\j*\\bin\\java.exe
-            int v = checkBinPath(&temp);
-            if (v > 0) {
-                outPaths->insert(CJavaPath(v, temp));
-            }
-        }
-    } while (FindNextFile(findH, &findData) != 0);
-    FindClose(findH);
-}
-
-static void findJavaInProgramFiles(std::set<CJavaPath> *outPaths) {
-    // Check the C:\\Program Files (x86) directory
-    // With WOW64 fs redirection in place by default, we should get the x86
-    // version on a 64-bit OS since this app is a 32-bit itself.
-    checkProgramFiles(outPaths);
-
-    // Check the real sysinfo state (not the one hidden by WOW64) for x86
-    SYSTEM_INFO sysInfo;
-    GetNativeSystemInfo(&sysInfo);
-
-    if (sysInfo.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64) {
-        // On a 64-bit OS, try again by disabling the fs redirection so
-        // that we can try the real C:\\Program Files directory.
-        PVOID oldWow64Value = disableWow64FsRedirection();
-        checkProgramFiles(outPaths);
-        revertWow64FsRedirection(oldWow64Value);
-    }
-}
-
-//------
-
-
-CJavaFinder::CJavaFinder(int minVersion) : mMinVersion(minVersion) {
-}
-
-
-CJavaFinder::~CJavaFinder() {
-}
-
-/*
- * Checks whether there's a recorded path in the registry and whether
- * this path still points to a valid Java executable.
- * Returns false if any of these do not match,
- * Returns true if both condition match,
- * outPath contains the result path when returning true.
-*/
-CJavaPath CJavaFinder::getRegistryPath() {
-    CString existing;
-    CRegKey rk;
-
-    if (rk.Open(HKEY_CURRENT_USER, JF_REGISTRY_KEY, KEY_READ) == ERROR_SUCCESS) {
-        ULONG sLen = MAX_PATH;
-        TCHAR s[MAX_PATH + 1];
-        if (rk.QueryStringValue(JF_REGISTRY_VALUE_PATH, s, &sLen) == ERROR_SUCCESS) {
-            existing.SetString(s);
-        }
-        rk.Close();
-    }
-
-    if (!existing.IsEmpty()) {
-        CJavaPath javaPath;
-        if (checkJavaPath(existing, &javaPath)) {
-            return javaPath;
-        }
-    }
-
-    return CJavaPath::sEmpty;
-}
-
-bool CJavaFinder::setRegistryPath(const CJavaPath &javaPath) {
-    CRegKey rk;
-
-    if (rk.Create(HKEY_CURRENT_USER, JF_REGISTRY_KEY) == ERROR_SUCCESS) {
-        bool ok = rk.SetStringValue(JF_REGISTRY_VALUE_PATH, javaPath.mPath, REG_SZ) == ERROR_SUCCESS &&
-                  rk.SetStringValue(JF_REGISTRY_VALUE_VERS, javaPath.getVersion(), REG_SZ) == ERROR_SUCCESS;
-        rk.Close();
-        return ok;
-    }
-
-    return false;
-}
-
-void CJavaFinder::findJavaPaths(std::set<CJavaPath> *paths) {
-    findJavaInEnvPath(paths);
-    findJavaInProgramFiles(paths);
-    findJavaInRegistry(paths);
-
-    // Exclude any entries that do not match the minimum version.
-    // The set is going to be fairly small so it's easier to do it here
-    // than add the filter logic in all the static methods above.
-    if (mMinVersion > 0) {
-        for (auto it = paths->begin(); it != paths->end(); ) {
-            if (it->mVersion < mMinVersion) {
-                it = paths->erase(it);  // C++11 set.erase returns an iterator to the *next* element
-            } else {
-                ++it;
-            }
-        }
-    }
-}
-
-bool CJavaFinder::checkJavaPath(const CString &path, CJavaPath *outPath) {
-    CPath p(path);
-
-    // try this path (if it ends with java.exe) or path\\java.exe
-    int v = checkPath(&p);
-    if (v == 0) {
-        // reset path and try path\\bin\\java.exe
-        p = CPath(path);
-        v = checkBinPath(&p);
-    }
-
-    if (v > 0) {
-        outPath->set(v, p);
-        return v >= mMinVersion;
-    }
-
-    return false;
-}
-
diff --git a/find_java2/src/JavaFinder.h b/find_java2/src/JavaFinder.h
deleted file mode 100755
index c22b008..0000000
--- a/find_java2/src/JavaFinder.h
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
-* Copyright (C) 2014 The Android Open Source Project
-*
-* Licensed under the Apache License, Version 2.0 (the "License");
-* you may not use this file except in compliance with the License.
-* You may obtain a copy of the License at
-*
-*      http://www.apache.org/licenses/LICENSE-2.0
-*
-* Unless required by applicable law or agreed to in writing, software
-* distributed under the License is distributed on an "AS IS" BASIS,
-* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-* See the License for the specific language governing permissions and
-* limitations under the License.
-*/
-
-#pragma once
-
-
-#include <set>                                  // STL std::set
-#include "JavaPath.h"
-
-class CJavaFinder {
-public:
-    // Creates a new JavaFinder.
-    // minVersion to accept, using JAVA_VERS_TO_INT macro. 0 to accept everything.
-    CJavaFinder(int minVersion = 0);
-    ~CJavaFinder();
-
-    int getMinVersion() const { return mMinVersion;  }
-
-    // Returns the path recorded in the registry.
-    // If there is no path or it is no longer valid, returns an empty string.
-    CJavaPath getRegistryPath();
-
-    // Sets the given path as the default to use in the registry.
-    // Returns true on success.
-    bool setRegistryPath(const CJavaPath &javaPath);
-
-    // Scans the registry, the environment and program files for potential Java.exe locations.
-    // Fills the given set with the tuples (version, path) found, guaranteed sorted and unique.
-    void findJavaPaths(std::set<CJavaPath> *paths);
-
-    // Checks the given path for a given java.exe.
-    // Input path variation tried are: path as-is, path/java.exe or path/bin/java.exe.
-    // Places the java path and version in outPath;
-    // Returns true if a java path was found *and* its version is at least mMinVersion.
-    bool checkJavaPath(const CString &path, CJavaPath *outPath);
-
-private:
-    int mMinVersion;
-};
diff --git a/find_java2/src/JavaPath.cpp b/find_java2/src/JavaPath.cpp
deleted file mode 100755
index ebe30c5..0000000
--- a/find_java2/src/JavaPath.cpp
+++ /dev/null
@@ -1,97 +0,0 @@
-/*
-* Copyright (C) 2014 The Android Open Source Project
-*
-* Licensed under the Apache License, Version 2.0 (the "License");
-* you may not use this file except in compliance with the License.
-* You may obtain a copy of the License at
-*
-*      http://www.apache.org/licenses/LICENSE-2.0
-*
-* Unless required by applicable law or agreed to in writing, software
-* distributed under the License is distributed on an "AS IS" BASIS,
-* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-* See the License for the specific language governing permissions and
-* limitations under the License.
-*/
-
-#include "stdafx.h"
-#include "JavaPath.h"
-#include "utils.h"
-
-#define  _CRT_SECURE_NO_WARNINGS
-
-// --------------
-
-const CJavaPath CJavaPath::sEmpty = CJavaPath();
-
-CJavaPath::CJavaPath(int version, CPath path) : mVersion(version), mPath(path) {
-    mPath.Canonicalize();
-}
-
-bool CJavaPath::isEmpty() const {
-    return mVersion <= 0;
-}
-
-void CJavaPath::clear() {
-    mVersion = 0;
-    mPath = CPath();
-}
-
-void CJavaPath::set(int version, CPath path) {
-    mVersion = version;
-    mPath = path;
-    mPath.Canonicalize();
-}
-
-CString CJavaPath::getVersion() const {
-    CString s;
-    s.Format(_T("%d.%d"), JAVA_MAJOR(mVersion), JAVA_MINOR(mVersion));
-    return s;
-}
-
-
-bool CJavaPath::toShortPath() {
-    const TCHAR *longPath = mPath;
-    if (longPath == nullptr) {
-        return false;
-    }
-
-    DWORD lenShort = _tcslen(longPath) + 1;
-    TCHAR *shortPath = (TCHAR *)malloc(lenShort * sizeof(TCHAR));
-
-    DWORD length = GetShortPathName(longPath, shortPath, lenShort);
-    if (length > lenShort) {
-        // The buffer wasn't big enough, this is the size to use.
-        free(shortPath);
-        lenShort = length;
-        shortPath = (TCHAR *)malloc(length);
-        length = GetShortPathName(longPath, shortPath, lenShort);
-    }
-
-    if (length != 0) {
-        mPath = CPath(shortPath);
-    }
-
-    free(shortPath);
-    return length != 0;
-}
-
-bool CJavaPath::operator< (const CJavaPath& rhs) const {
-    if (mVersion != rhs.mVersion) {
-        // sort in reverse order on the version
-        return rhs.mVersion > mVersion;
-    }
-    // sort in normal order on the path
-    const CString &pl = mPath;
-    const CString &pr = rhs.mPath;
-    return pl.Compare(pr) < 0;
-}
-
-bool CJavaPath::operator== (const CJavaPath& rhs) const {
-    if (mVersion == rhs.mVersion) {
-        const CString &pl = mPath;
-        const CString &pr = rhs.mPath;
-        return pl.Compare(pr) == 0;
-    }
-    return false;
-}
diff --git a/find_java2/src/JavaPath.h b/find_java2/src/JavaPath.h
deleted file mode 100755
index b7f40a5..0000000
--- a/find_java2/src/JavaPath.h
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
-* Copyright (C) 2014 The Android Open Source Project
-*
-* Licensed under the Apache License, Version 2.0 (the "License");
-* you may not use this file except in compliance with the License.
-* You may obtain a copy of the License at
-*
-*      http://www.apache.org/licenses/LICENSE-2.0
-*
-* Unless required by applicable law or agreed to in writing, software
-* distributed under the License is distributed on an "AS IS" BASIS,
-* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-* See the License for the specific language governing permissions and
-* limitations under the License.
-*/
-
-#pragma once
-
-#include <atlpath.h>                            // ATL CPath
-
-
-// Transforms a Java major.minor number (e.g. "1.7") to internal int value (1007)
-#define JAVA_VERS_TO_INT(major, minor)  ((major) * 1000 + (minor))
-// Extracts the major part from the internal int major.minor number
-#define JAVA_MAJOR(majorMinor)          ((majorMinor) / 1000)
-// Extracts the minor part from the internal int major.minor number
-#define JAVA_MINOR(majorMinor)          ((majorMinor) % 1000)
-
-
-struct CJavaPath {
-    int mVersion;
-    CPath mPath;
-
-    // Static empty path that can be returned as a reference.
-    static const CJavaPath sEmpty;
-
-    CJavaPath() : mVersion(0) {}
-    CJavaPath(int version, CPath path);
-    void set(int version, CPath path);
-
-    // Returns true if path/version is empty/0
-    bool isEmpty() const;
-
-    // Clears path and version to 0
-    void clear();
-
-    // Converts the internal path into a short DOS path.
-    // Returns true if this was possible and false if the conversion failed.
-    bool toShortPath();
-
-    // Returns the version formatted as a string (e.g. "1.7" instead of 1007.)
-    CString getVersion() const;
-
-    // Operators < and == for this to be suitable in an ordered std::set
-    bool operator<  (const CJavaPath& rhs) const;
-    bool operator== (const CJavaPath& rhs) const;
-};
diff --git a/find_java2/src/WinLauncher2App.cpp b/find_java2/src/WinLauncher2App.cpp
deleted file mode 100755
index 392ad9e..0000000
--- a/find_java2/src/WinLauncher2App.cpp
+++ /dev/null
@@ -1,154 +0,0 @@
-/*
-* Copyright (C) 2014 The Android Open Source Project
-*
-* Licensed under the Apache License, Version 2.0 (the "License");
-* you may not use this file except in compliance with the License.
-* You may obtain a copy of the License at
-*
-*      http://www.apache.org/licenses/LICENSE-2.0
-*
-* Unless required by applicable law or agreed to in writing, software
-* distributed under the License is distributed on an "AS IS" BASIS,
-* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-* See the License for the specific language governing permissions and
-* limitations under the License.
-*/
-
-
-#include "stdafx.h"
-#include "WinLauncher2App.h"
-
-#include "utils.h"
-#include "JavaFinder.h"
-#include "FindJava2Dlg.h"
-
-#ifdef _DEBUG
-#define new DEBUG_NEW
-#endif
-
-
-// CWinLauncher2App
-
-BEGIN_MESSAGE_MAP(CWinLauncher2App, CWinApp)
-    ON_COMMAND(ID_HELP, &CWinApp::OnHelp)
-END_MESSAGE_MAP()
-
-
-// The one and only CWinLauncher2App object
-CWinLauncher2App theApp;
-
-class CLauncherCmdLineInfo : public CCommandLineInfo {
-public:
-    bool mDoHelp;
-    bool mDoForceUi;
-    bool mDoJava1_7;
-    CString mFilename;
-
-    CLauncherCmdLineInfo() : mDoHelp(false), mDoForceUi(false), mDoJava1_7(false) {}
-
-    virtual void ParseParam(const TCHAR* pszParam, BOOL bFlag, BOOL bLast) {
-        // Expected command line:
-        // /h | help  : msg box with command line arguments
-        // /f | force : force UI selection
-        // /7         : require java 1.7
-        // path-to-launch
-
-        if (!bFlag) {
-            mFilename = pszParam;
-        } else if (_tcsnccmp(pszParam, _T("h"), 2) == 0) {
-            mDoHelp = true;
-        } else if (_tcsnccmp(pszParam, _T("f"), 2) == 0) {
-            mDoForceUi = true;
-        } else if (_tcsnccmp(pszParam, _T("7"), 2) == 0) {
-            mDoJava1_7 = true;
-        }
-    }
-};
-
-
-CWinLauncher2App::CWinLauncher2App() {
-    // support Restart Manager
-    m_dwRestartManagerSupportFlags = AFX_RESTART_MANAGER_SUPPORT_RESTART;
-
-    // TODO: add construction code here,
-    // Place all significant initialization in InitInstance
-}
-
-BOOL CWinLauncher2App::InitInstance() {
-    // InitCommonControlsEx() is required on Windows XP if an application
-    // manifest specifies use of ComCtl32.dll version 6 or later to enable
-    // visual styles.  Otherwise, any window creation will fail.
-    INITCOMMONCONTROLSEX InitCtrls;
-    InitCtrls.dwSize = sizeof(InitCtrls);
-    // Set this to include all the common control classes you want to use
-    // in your application.
-    InitCtrls.dwICC = ICC_WIN95_CLASSES;
-    InitCommonControlsEx(&InitCtrls);
-
-    CWinApp::InitInstance();
-    AfxEnableControlContainer();
-
-    // Create the shell manager, in case the dialog contains
-    // any shell tree view or shell list view controls.
-    CShellManager *pShellManager = new CShellManager;
-
-    // Activate "Windows Native" visual manager for enabling themes in MFC controls
-    CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManagerWindows));
-
-    // Set CWinApp default registry key. Must be consistent with all apps using findjava2.
-    SetRegistryKey(_T("Android-FindJava2"));
-
-    // Use VERSIONINFO.FileDescription as the canonical app name
-    initUtils(NULL);
-
-    CLauncherCmdLineInfo cmdLine;
-    ParseCommandLine(cmdLine);
-
-    if (cmdLine.mDoHelp) {
-        const TCHAR *msg =
-            _T("WinLauncher2 [/7|/f|/h]\r\n")
-            _T("/7 : Requires Java 1.7 instead of 1.6\r\n")
-            _T("/f : Force UI\r\n")
-            _T("/h : Help\r\n");
-            AfxMessageBox(msg);
-        return FALSE; // quit without starting MFC app msg loop
-    }
-
-    CJavaFinder javaFinder(JAVA_VERS_TO_INT(1, cmdLine.mDoJava1_7 ? 7 : 6));
-    CJavaPath javaPath = javaFinder.getRegistryPath();
-    if (cmdLine.mDoForceUi || javaPath.isEmpty()) {
-        javaPath.clear();
-
-        CFindJava2Dlg dlg;
-        dlg.setJavaFinder(&javaFinder);
-        m_pMainWnd = &dlg;
-        INT_PTR nResponse = dlg.DoModal();
-
-        if (nResponse == IDOK) {
-            // Use choice selected by user and save in registry.
-            javaPath = dlg.getSelectedPath();
-            javaFinder.setRegistryPath(javaPath);
-        } else if (nResponse == IDCANCEL) {
-            // Canceled by user, exit silently.
-        } else if (nResponse == -1) {
-            TRACE(traceAppMsg, 0, "Warning: dialog creation failed, so application is terminating unexpectedly.\n");
-        }
-    }
-
-    if (!javaPath.isEmpty()) {
-        // TODO actually launch configured app instead of just printing path.
-        CString msg(_T("PLACEHOLDER TODO run app using "));
-        msg.Append(javaPath.mPath);
-        AfxMessageBox(msg);
-    }
-
-    // Delete the shell manager created above.
-    if (pShellManager != NULL) {
-        delete pShellManager;
-    }
-
-    // Since the dialog has been closed, return FALSE so that we exit the
-    // application, rather than start the application's message pump.
-    return FALSE;
-}
-
diff --git a/find_java2/src/WinLauncher2App.h b/find_java2/src/WinLauncher2App.h
deleted file mode 100755
index 11aca97..0000000
--- a/find_java2/src/WinLauncher2App.h
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
-* Copyright (C) 2014 The Android Open Source Project
-*
-* Licensed under the Apache License, Version 2.0 (the "License");
-* you may not use this file except in compliance with the License.
-* You may obtain a copy of the License at
-*
-*      http://www.apache.org/licenses/LICENSE-2.0
-*
-* Unless required by applicable law or agreed to in writing, software
-* distributed under the License is distributed on an "AS IS" BASIS,
-* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-* See the License for the specific language governing permissions and
-* limitations under the License.
-*/
-
-#pragma once
-
-#ifndef __AFXWIN_H__
-	#error "include 'stdafx.h' before including this file for PCH"
-#endif
-
-#include "resource.h"		// main symbols
-
-
-// CWinLauncher2App:
-// See WinLauncher2.cpp for the implementation of this class
-//
-
-class CWinLauncher2App : public CWinApp {
-public:
-	CWinLauncher2App();
-
-// Overrides
-public:
-	virtual BOOL InitInstance();
-
-// Implementation
-
-	DECLARE_MESSAGE_MAP()
-};
-
-extern CWinLauncher2App theApp;
\ No newline at end of file
diff --git a/find_java2/src/utils.cpp b/find_java2/src/utils.cpp
deleted file mode 100755
index 7c8c66b..0000000
--- a/find_java2/src/utils.cpp
+++ /dev/null
@@ -1,282 +0,0 @@
-/*
-* Copyright (C) 2014 The Android Open Source Project
-*
-* Licensed under the Apache License, Version 2.0 (the "License");
-* you may not use this file except in compliance with the License.
-* You may obtain a copy of the License at
-*
-*      http://www.apache.org/licenses/LICENSE-2.0
-*
-* Unless required by applicable law or agreed to in writing, software
-* distributed under the License is distributed on an "AS IS" BASIS,
-* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-* See the License for the specific language governing permissions and
-* limitations under the License.
-*/
-
-#include "stdafx.h"
-#include "utils.h"
-
-// Set to true to get some extra debug information
-bool gIsDebug = false;
-// Set to true to output errors to stderr (for a Console app)
-// or to false to output using msg box (for a Windows UI app)
-bool gIsConsole = false;
-
-// Application name used in error dialog. Defined using initUtils()
-static CString gAppName("Find Java 2");
-
-// Called by the application to initialize the app name used in error dialog boxes.
-void initUtils(const TCHAR *appName) {
-    if (appName != NULL) {
-        gAppName = CString(appName);
-        return;
-    }
-
-    // Try to get the VERSIONINFO.FileDescription and use as app name
-    // Errors are ignored, in which case the default app name is used.
-
-    // First get the module (aka app instance) filename.
-    TCHAR moduleName[MAX_PATH + 1];
-    DWORD sz = ::GetModuleFileName(NULL /*AfxGetInstanceHandle()*/, moduleName, MAX_PATH);
-    if (sz == 0) {
-        // GetModuleFileName failed. Do nothing.
-        return;
-    }
-    moduleName[sz] = '\0';  // make sure string is properly terminated.
-
-    // Get the size of the FileVersionInfo buffer
-    DWORD obsoleteHandle; // see http://blogs.msdn.com/b/oldnewthing/archive/2007/07/31/4138786.aspx
-    DWORD fviSize = ::GetFileVersionInfoSize(moduleName, &obsoleteHandle);
-    if (fviSize == 0) {
-        return; // do nothing on error
-    }
-
-    char *fviBuffer = new char[fviSize];
-    if (::GetFileVersionInfo(moduleName, 0, fviSize, fviBuffer) != 0) {
-        VOID *vBuffer;
-        UINT vLen;
-
-        struct LANGUAGE_CODEPAGE {
-            WORD mLanguage;
-            WORD mCodePage;
-        } *lgcpBuffer;
-
-        UINT lgcpSize;
-
-        // Read the list of languages and code pages (c.f. MSDN for VerQueryValue)
-        if (::VerQueryValue(fviBuffer, _T("\\VarFileInfo\\Translation"), (LPVOID*)&lgcpBuffer, &lgcpSize) != 0 &&
-                lgcpSize >= sizeof(LANGUAGE_CODEPAGE)) {
-            // Use the first available language and code page
-            CString subBlock;
-            subBlock.Format(_T("\\StringFileInfo\\%04x%04x\\FileDescription"),
-                            lgcpBuffer[0].mLanguage,
-                            lgcpBuffer[0].mCodePage);
-            if (::VerQueryValue(fviBuffer, subBlock, &vBuffer, &vLen) != 0) {
-                gAppName.SetString((LPCTSTR)vBuffer, vLen);
-            }
-        }
-    }
-    delete[] fviBuffer;
-}
-
-CString getAppName() {
-    return gAppName;
-}
-
-
-// Displays a message in an ok+info dialog box.
-void msgBox(const TCHAR* text, ...) {
-    CString formatted;
-    va_list ap;
-    va_start(ap, text);
-    formatted.FormatV(text, ap);
-    va_end(ap);
-
-    // TODO global CString to get app name
-    MessageBox(NULL, formatted, gAppName, MB_OK | MB_ICONINFORMATION);
-}
-
-// Sets the string to the message matching Win32 GetLastError.
-// If message is non-null, it is prepended to the last error string.
-CString getLastWin32Error(const TCHAR* message) {
-    DWORD err = GetLastError();
-    CString result;
-    LPTSTR errStr;
-    if (FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | /* dwFlags */
-                      FORMAT_MESSAGE_FROM_SYSTEM,
-                      NULL,                             /* lpSource */
-                      err,                              /* dwMessageId */
-                      0,                                /* dwLanguageId */
-                      (LPTSTR) &errStr,                 /* out lpBuffer */
-                      0,                                /* nSize */
-                      NULL) != 0) {                     /* va_list args */
-        if (message == NULL) {
-            result.Format(_T("[%d] %s"), err, errStr);
-        } else {
-            result.Format(_T("%s[%d] %s"), message, err, errStr);
-        }
-        LocalFree(errStr);
-    }
-    return result;
-}
-
-// Displays GetLastError prefixed with a description in an error dialog box
-void displayLastError(const TCHAR *description, ...) {
-    CString formatted;
-    va_list ap;
-    va_start(ap, description);
-    formatted.FormatV(description, ap);
-    va_end(ap);
-
-    CString error = getLastWin32Error(NULL);
-    formatted.Append(_T("\r\n"));
-    formatted.Append(error);
-
-    if (gIsConsole) {
-        _ftprintf(stderr, _T("%s\n"), (LPCTSTR) formatted);
-    } else {
-        CString name(gAppName);
-        name.Append(_T(" - Error"));
-        MessageBox(NULL, formatted, name, MB_OK | MB_ICONERROR);
-    }
-}
-
-// Executes the command line. Does not wait for the program to finish.
-// The return code is from CreateProcess (0 means failure), not the running app.
-int execNoWait(const TCHAR *app, const TCHAR *params, const TCHAR *workDir) {
-    STARTUPINFO           startup;
-    PROCESS_INFORMATION   pinfo;
-
-    ZeroMemory(&pinfo, sizeof(pinfo));
-
-    ZeroMemory(&startup, sizeof(startup));
-    startup.cb = sizeof(startup);
-    startup.dwFlags = STARTF_USESHOWWINDOW;
-    startup.wShowWindow = SW_SHOWDEFAULT;
-
-    int ret = CreateProcess(
-        app,                                        /* program path */
-        (TCHAR *)params,                            /* command-line */
-        NULL,                  /* process handle is not inheritable */
-        NULL,                   /* thread handle is not inheritable */
-        TRUE,                          /* yes, inherit some handles */
-        0,                                          /* create flags */
-        NULL,                     /* use parent's environment block */
-        workDir,                 /* use parent's starting directory */
-        &startup,                 /* startup info, i.e. std handles */
-        &pinfo);
-
-    if (ret) {
-        CloseHandle(pinfo.hProcess);
-        CloseHandle(pinfo.hThread);
-    }
-
-    return ret;
-}
-
-// Executes command, waits for completion and returns exit code.
-// As indicated in MSDN for CreateProcess, callers should double-quote the program name
-// e.g. cmd="\"c:\program files\myapp.exe\" arg1 arg2";
-int execWait(const TCHAR *cmd) {
-    STARTUPINFO           startup;
-    PROCESS_INFORMATION   pinfo;
-
-    ZeroMemory(&pinfo, sizeof(pinfo));
-
-    ZeroMemory(&startup, sizeof(startup));
-    startup.cb = sizeof(startup);
-    startup.dwFlags = STARTF_USESHOWWINDOW;
-    startup.wShowWindow = SW_HIDE | SW_MINIMIZE;
-
-    int ret = CreateProcess(
-        NULL,                                       /* program path */
-        (LPTSTR)cmd,                                /* command-line */
-        NULL,                  /* process handle is not inheritable */
-        NULL,                   /* thread handle is not inheritable */
-        TRUE,                          /* yes, inherit some handles */
-        CREATE_NO_WINDOW,                /* we don't want a console */
-        NULL,                     /* use parent's environment block */
-        NULL,                    /* use parent's starting directory */
-        &startup,                 /* startup info, i.e. std handles */
-        &pinfo);
-
-    int result = -1;
-    if (ret) {
-        WaitForSingleObject(pinfo.hProcess, INFINITE);
-
-        DWORD exitCode;
-        if (GetExitCodeProcess(pinfo.hProcess, &exitCode)) {
-            // this should not return STILL_ACTIVE (259)
-            result = exitCode;
-        }
-        CloseHandle(pinfo.hProcess);
-        CloseHandle(pinfo.hThread);
-    }
-
-    return result;
-}
-
-bool getModuleDir(CPath *outDir) {
-    TCHAR programDir[MAX_PATH];
-    int ret = GetModuleFileName(NULL, programDir, sizeof(programDir) / sizeof(programDir[0]));
-    if (ret != 0) {
-        CPath dir(programDir);
-        dir.RemoveFileSpec();
-        *outDir = dir;
-        return true;
-    }
-    return false;
-}
-
-// Disables the FS redirection done by WOW64.
-// Because this runs as a 32-bit app, Windows automagically remaps some
-// folder under the hood (e.g. "Programs Files(x86)" is mapped as "Program Files").
-// This prevents the app from correctly searching for java.exe in these folders.
-// The registry is also remapped. This method disables this redirection.
-// Caller should restore the redirection later by using revertWow64FsRedirection().
-PVOID disableWow64FsRedirection() {
-
-    // The call we want to make is the following:
-    //    PVOID oldWow64Value;
-    //    Wow64DisableWow64FsRedirection(&oldWow64Value);
-    // However that method may not exist (e.g. on XP non-64 systems) so
-    // we must not call it directly.
-
-    PVOID oldWow64Value = 0;
-
-    HMODULE hmod = LoadLibrary(_T("kernel32.dll"));
-    if (hmod != NULL) {
-        FARPROC proc = GetProcAddress(hmod, "Wow64DisableWow64FsRedirection");
-        if (proc != NULL) {
-            typedef BOOL(WINAPI *disableWow64FuncType)(PVOID *);
-            disableWow64FuncType funcPtr = (disableWow64FuncType)proc;
-            funcPtr(&oldWow64Value);
-        }
-
-        FreeLibrary(hmod);
-    }
-
-    return oldWow64Value;
-}
-
-// Reverts the redirection disabled in disableWow64FsRedirection.
-void revertWow64FsRedirection(PVOID oldWow64Value) {
-
-    // The call we want to make is the following:
-    //    Wow64RevertWow64FsRedirection(oldWow64Value);
-    // However that method may not exist (e.g. on XP non-64 systems) so
-    // we must not call it directly.
-
-    HMODULE hmod = LoadLibrary(_T("kernel32.dll"));
-    if (hmod != NULL) {
-        FARPROC proc = GetProcAddress(hmod, "Wow64RevertWow64FsRedirection");
-        if (proc != NULL) {
-            typedef BOOL(WINAPI *revertWow64FuncType)(PVOID);
-            revertWow64FuncType funcPtr = (revertWow64FuncType)proc;
-            funcPtr(oldWow64Value);
-        }
-
-        FreeLibrary(hmod);
-    }
-}
diff --git a/find_java2/src/utils.h b/find_java2/src/utils.h
deleted file mode 100755
index 3557f58..0000000
--- a/find_java2/src/utils.h
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
-* Copyright (C) 2014 The Android Open Source Project
-*
-* Licensed under the Apache License, Version 2.0 (the "License");
-* you may not use this file except in compliance with the License.
-* You may obtain a copy of the License at
-*
-*      http://www.apache.org/licenses/LICENSE-2.0
-*
-* Unless required by applicable law or agreed to in writing, software
-* distributed under the License is distributed on an "AS IS" BASIS,
-* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-* See the License for the specific language governing permissions and
-* limitations under the License.
-*/
-
-#pragma once
-
-#include <atlpath.h>                            // ATL CPath
-
-// Global flag indicating whether this is running in debug mode (more printfs)
-extern bool gIsDebug;
-// Global flag indicating whether this is running in console mode or GUI.
-// In console mode, errors are written on the console; in GUI they use a MsgBox.
-extern bool gIsConsole;
-
-// Must be called by the application to initialize the app name used in error dialog boxes.
-// If NULL is used, fetches VERSIONINFO.FileDescription from resources if available.
-void initUtils(const TCHAR *appName);
-
-// Returns the app name set in initUtils
-CString getAppName();
-
-// Displays a message in an ok+info dialog box. Useful in console mode.
-void msgBox(const TCHAR* text, ...);
-
-// Displays GetLastError prefixed with a description in an error dialog box. Useful in console mode.
-void displayLastError(const TCHAR *description, ...);
-
-// Executes the command line. Does not wait for the program to finish.
-// The return code is from CreateProcess (0 means failure), not the running app.
-int execNoWait(const TCHAR *app, const TCHAR *params, const TCHAR *workDir);
-
-// Executes command, waits for completion and returns exit code.
-// As indicated in MSDN for CreateProcess, callers should double-quote the program name
-// e.g. cmd="\"c:\program files\myapp.exe\" arg1 arg2";
-int execWait(const TCHAR *cmd);
-
-bool getModuleDir(CPath *outDir);
-
-// Disables the FS redirection done by WOW64.
-// Because this runs as a 32-bit app, Windows automagically remaps some
-// folder under the hood (e.g. "Programs Files(x86)" is mapped as "Program Files").
-// This prevents the app from correctly searching for java.exe in these folders.
-// The registry is also remapped.
-PVOID disableWow64FsRedirection();
-
-// Reverts the redirection disabled in disableWow64FsRedirection.
-void revertWow64FsRedirection(PVOID oldWow64Value);
diff --git a/find_lock/.gitignore b/find_lock/.gitignore
deleted file mode 100644
index 91e18b1..0000000
--- a/find_lock/.gitignore
+++ /dev/null
@@ -1,3 +0,0 @@
-images/find_lock_icon.o
-*.suo
-*.user
diff --git a/find_lock/NOTICE b/find_lock/NOTICE
deleted file mode 100644
index 7317ae2..0000000
--- a/find_lock/NOTICE
+++ /dev/null
@@ -1,190 +0,0 @@
-
-   Copyright (c) 2005-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.
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
-
-
-                                 Apache License
-                           Version 2.0, January 2004
-                        http://www.apache.org/licenses/
-
-   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
-   1. Definitions.
-
-      "License" shall mean the terms and conditions for use, reproduction,
-      and distribution as defined by Sections 1 through 9 of this document.
-
-      "Licensor" shall mean the copyright owner or entity authorized by
-      the copyright owner that is granting the License.
-
-      "Legal Entity" shall mean the union of the acting entity and all
-      other entities that control, are controlled by, or are under common
-      control with that entity. For the purposes of this definition,
-      "control" means (i) the power, direct or indirect, to cause the
-      direction or management of such entity, whether by contract or
-      otherwise, or (ii) ownership of fifty percent (50%) or more of the
-      outstanding shares, or (iii) beneficial ownership of such entity.
-
-      "You" (or "Your") shall mean an individual or Legal Entity
-      exercising permissions granted by this License.
-
-      "Source" form shall mean the preferred form for making modifications,
-      including but not limited to software source code, documentation
-      source, and configuration files.
-
-      "Object" form shall mean any form resulting from mechanical
-      transformation or translation of a Source form, including but
-      not limited to compiled object code, generated documentation,
-      and conversions to other media types.
-
-      "Work" shall mean the work of authorship, whether in Source or
-      Object form, made available under the License, as indicated by a
-      copyright notice that is included in or attached to the work
-      (an example is provided in the Appendix below).
-
-      "Derivative Works" shall mean any work, whether in Source or Object
-      form, that is based on (or derived from) the Work and for which the
-      editorial revisions, annotations, elaborations, or other modifications
-      represent, as a whole, an original work of authorship. For the purposes
-      of this License, Derivative Works shall not include works that remain
-      separable from, or merely link (or bind by name) to the interfaces of,
-      the Work and Derivative Works thereof.
-
-      "Contribution" shall mean any work of authorship, including
-      the original version of the Work and any modifications or additions
-      to that Work or Derivative Works thereof, that is intentionally
-      submitted to Licensor for inclusion in the Work by the copyright owner
-      or by an individual or Legal Entity authorized to submit on behalf of
-      the copyright owner. For the purposes of this definition, "submitted"
-      means any form of electronic, verbal, or written communication sent
-      to the Licensor or its representatives, including but not limited to
-      communication on electronic mailing lists, source code control systems,
-      and issue tracking systems that are managed by, or on behalf of, the
-      Licensor for the purpose of discussing and improving the Work, but
-      excluding communication that is conspicuously marked or otherwise
-      designated in writing by the copyright owner as "Not a Contribution."
-
-      "Contributor" shall mean Licensor and any individual or Legal Entity
-      on behalf of whom a Contribution has been received by Licensor and
-      subsequently incorporated within the Work.
-
-   2. Grant of Copyright License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      copyright license to reproduce, prepare Derivative Works of,
-      publicly display, publicly perform, sublicense, and distribute the
-      Work and such Derivative Works in Source or Object form.
-
-   3. Grant of Patent License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      (except as stated in this section) patent license to make, have made,
-      use, offer to sell, sell, import, and otherwise transfer the Work,
-      where such license applies only to those patent claims licensable
-      by such Contributor that are necessarily infringed by their
-      Contribution(s) alone or by combination of their Contribution(s)
-      with the Work to which such Contribution(s) was submitted. If You
-      institute patent litigation against any entity (including a
-      cross-claim or counterclaim in a lawsuit) alleging that the Work
-      or a Contribution incorporated within the Work constitutes direct
-      or contributory patent infringement, then any patent licenses
-      granted to You under this License for that Work shall terminate
-      as of the date such litigation is filed.
-
-   4. Redistribution. You may reproduce and distribute copies of the
-      Work or Derivative Works thereof in any medium, with or without
-      modifications, and in Source or Object form, provided that You
-      meet the following conditions:
-
-      (a) You must give any other recipients of the Work or
-          Derivative Works a copy of this License; and
-
-      (b) You must cause any modified files to carry prominent notices
-          stating that You changed the files; and
-
-      (c) You must retain, in the Source form of any Derivative Works
-          that You distribute, all copyright, patent, trademark, and
-          attribution notices from the Source form of the Work,
-          excluding those notices that do not pertain to any part of
-          the Derivative Works; and
-
-      (d) If the Work includes a "NOTICE" text file as part of its
-          distribution, then any Derivative Works that You distribute must
-          include a readable copy of the attribution notices contained
-          within such NOTICE file, excluding those notices that do not
-          pertain to any part of the Derivative Works, in at least one
-          of the following places: within a NOTICE text file distributed
-          as part of the Derivative Works; within the Source form or
-          documentation, if provided along with the Derivative Works; or,
-          within a display generated by the Derivative Works, if and
-          wherever such third-party notices normally appear. The contents
-          of the NOTICE file are for informational purposes only and
-          do not modify the License. You may add Your own attribution
-          notices within Derivative Works that You distribute, alongside
-          or as an addendum to the NOTICE text from the Work, provided
-          that such additional attribution notices cannot be construed
-          as modifying the License.
-
-      You may add Your own copyright statement to Your modifications and
-      may provide additional or different license terms and conditions
-      for use, reproduction, or distribution of Your modifications, or
-      for any such Derivative Works as a whole, provided Your use,
-      reproduction, and distribution of the Work otherwise complies with
-      the conditions stated in this License.
-
-   5. Submission of Contributions. Unless You explicitly state otherwise,
-      any Contribution intentionally submitted for inclusion in the Work
-      by You to the Licensor shall be under the terms and conditions of
-      this License, without any additional terms or conditions.
-      Notwithstanding the above, nothing herein shall supersede or modify
-      the terms of any separate license agreement you may have executed
-      with Licensor regarding such Contributions.
-
-   6. Trademarks. This License does not grant permission to use the trade
-      names, trademarks, service marks, or product names of the Licensor,
-      except as required for reasonable and customary use in describing the
-      origin of the Work and reproducing the content of the NOTICE file.
-
-   7. Disclaimer of Warranty. Unless required by applicable law or
-      agreed to in writing, Licensor provides the Work (and each
-      Contributor provides its Contributions) on an "AS IS" BASIS,
-      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
-      implied, including, without limitation, any warranties or conditions
-      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
-      PARTICULAR PURPOSE. You are solely responsible for determining the
-      appropriateness of using or redistributing the Work and assume any
-      risks associated with Your exercise of permissions under this License.
-
-   8. Limitation of Liability. In no event and under no legal theory,
-      whether in tort (including negligence), contract, or otherwise,
-      unless required by applicable law (such as deliberate and grossly
-      negligent acts) or agreed to in writing, shall any Contributor be
-      liable to You for damages, including any direct, indirect, special,
-      incidental, or consequential damages of any character arising as a
-      result of this License or out of the use or inability to use the
-      Work (including but not limited to damages for loss of goodwill,
-      work stoppage, computer failure or malfunction, or any and all
-      other commercial damages or losses), even if such Contributor
-      has been advised of the possibility of such damages.
-
-   9. Accepting Warranty or Additional Liability. While redistributing
-      the Work or Derivative Works thereof, You may choose to offer,
-      and charge a fee for, acceptance of support, warranty, indemnity,
-      or other liability obligations and/or rights consistent with this
-      License. However, in accepting such obligations, You may act only
-      on Your own behalf and on Your sole responsibility, not on behalf
-      of any other Contributor, and only if You agree to indemnify,
-      defend, and hold each Contributor harmless for any liability
-      incurred by, or claims asserted against, such Contributor by reason
-      of your accepting any such warranty or additional liability.
-
-   END OF TERMS AND CONDITIONS
-
diff --git a/find_lock/find_lock.cpp b/find_lock/find_lock.cpp
deleted file mode 100755
index bbbba81..0000000
--- a/find_lock/find_lock.cpp
+++ /dev/null
@@ -1,778 +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.
- */
-
-/*
- * "find_lock.exe", for Windows only.
- *
- * References used:
- *
- * http://drdobbs.com/windows/184411099
- * article by Sven B. Schreiber, November 01, 1999
- *
- * http://www.codeguru.com/Cpp/W-P/system/processesmodules/article.php/c2827/
- * by Zoltan Csizmadia, November 14, 2000
- *
- * http://stackoverflow.com/questions/860656/
- * (same technique, but written in unsafe C#)
- *
- * Starting with Vista, we can also use the Restart Manager API as
- * explained here: (TODO for next version)
- * http://msdn.microsoft.com/en-us/magazine/cc163450.aspx
- */
-
-#ifdef _WIN32
-
-#include "utils.h"
-#include <ctype.h>
-#include <fcntl.h>
-#include <io.h>
-#include <process.h>
-
-
-// NtDll structures from the the Dr Dobbs article, adjusted for our needs:
-
-typedef void *POBJECT;
-typedef LONG KPRIORITY;
-typedef LARGE_INTEGER QWORD;
-
-typedef struct {
-    WORD  Length;
-    WORD  MaximumLength;
-    PWORD Buffer;
-} UNICODE_STRING;
-
-typedef struct {
-    DWORD       dIdProcess;
-    BYTE        bObjectType;    // OB_TYPE_*
-    BYTE        bFlags;         // bits 0..2 HANDLE_FLAG_*
-    WORD        wValue;         // multiple of 4
-    POBJECT     pObject;
-    ACCESS_MASK GrantedAccess;
-} SYSTEM_HANDLE;
-
-typedef struct {
-    DWORD         dCount;
-    SYSTEM_HANDLE ash[1];
-} SYSTEM_HANDLE_INFORMATION;
-
-typedef struct {
-    DWORD PeakVirtualSize;
-    DWORD VirtualSize;
-    DWORD PageFaultCount;
-    DWORD PeakWorkingSetSize;
-    DWORD WorkingSetSize;
-    DWORD QuotaPeakPagedPoolUsage;
-    DWORD QuotaPagedPoolUsage;
-    DWORD QuotaPeakNonPagedPoolUsage;
-    DWORD QuotaNonPagedPoolUsage;
-    DWORD PagefileUsage;
-    DWORD PeakPagefileUsage;
-} VM_COUNTERS;
-
-typedef struct {
-    HANDLE UniqueProcess;
-    HANDLE UniqueThread;
-} CLIENT_ID;
-
-typedef enum {
-    // Ignored. We don't actually use these values.
-    Unused
-} KWAIT_REASON;
-
-typedef struct {
-    QWORD        qKernelTime;       // 100 nsec units
-    QWORD        qUserTime;         // 100 nsec units
-    QWORD        qCreateTime;       // relative to 01-01-1601
-    DWORD        d18;
-    PVOID        pStartAddress;
-    CLIENT_ID    Cid;               // process/thread ids
-    DWORD        dPriority;
-    DWORD        dBasePriority;
-    DWORD        dContextSwitches;
-    DWORD        dThreadState;      // 2=running, 5=waiting
-    KWAIT_REASON WaitReason;
-    DWORD        dReserved01;
-} SYSTEM_THREAD;
-
-typedef struct {
-    DWORD          dNext;           // relative offset
-    DWORD          dThreadCount;
-    DWORD          dReserved01;
-    DWORD          dReserved02;
-    DWORD          dReserved03;
-    DWORD          dReserved04;
-    DWORD          dReserved05;
-    DWORD          dReserved06;
-    QWORD          qCreateTime;     // relative to 01-01-1601
-    QWORD          qUserTime;       // 100 nsec units
-    QWORD          qKernelTime;     // 100 nsec units
-    UNICODE_STRING usName;
-    KPRIORITY      BasePriority;
-    DWORD          dUniqueProcessId;
-    DWORD          dInheritedFromUniqueProcessId;
-    DWORD          dHandleCount;
-    DWORD          dReserved07;
-    DWORD          dReserved08;
-    VM_COUNTERS    VmCounters;
-    DWORD          dCommitCharge;   // bytes
-    SYSTEM_THREAD  ast[1];
-} SYSTEM_PROCESS_INFORMATION;
-
-// The sic opcode for NtQuerySystemInformation
-typedef enum {
-    SystemProcessInformation = 5,
-    SystemHandleInformation = 16,
-} SYSTEMINFOCLASS;
-
-
-#define STATUS_SUCCESS               0x00000000
-#define STATUS_UNSUCCESSFUL          0xC0000001
-#define STATUS_NOT_IMPLEMENTED       0xC0000002
-#define STATUS_INVALID_INFO_CLASS    0xC0000003
-#define STATUS_INFO_LENGTH_MISMATCH  0xC0000004
-#define STATUS_INVALID_PARAMETER     0xC000000D
-
-typedef DWORD (WINAPI *NtQuerySystemInformationFuncPtr)(
-                                      DWORD sic, VOID* pData, DWORD sSize, ULONG* pdSize);
-typedef DWORD (WINAPI *NtQueryInformationFileFuncPtr)(HANDLE, PVOID, PVOID, DWORD, DWORD);
-typedef DWORD (WINAPI *NtQueryObjectFuncPtr)(HANDLE, DWORD, VOID*, DWORD, VOID*);
-
-static NtQuerySystemInformationFuncPtr sNtQuerySystemInformationFunc;
-static NtQueryInformationFileFuncPtr   sNtQueryInformationFileFunc;
-static NtQueryObjectFuncPtr            sNtQueryObjectFunc;
-
-//------------
-
-// Get the NT DLL functions we need to use.
-static bool init() {
-
-    sNtQuerySystemInformationFunc =
-        (NtQuerySystemInformationFuncPtr) GetProcAddress(
-            GetModuleHandleA("ntdll.dll"), "NtQuerySystemInformation");
-
-    sNtQueryInformationFileFunc =
-        (NtQueryInformationFileFuncPtr) GetProcAddress(
-            GetModuleHandleA("ntdll.dll"), "NtQueryInformationFile");
-
-    sNtQueryObjectFunc =
-        (NtQueryObjectFuncPtr) GetProcAddress(
-            GetModuleHandleA("ntdll.dll"), "NtQueryObject");
-
-    return sNtQuerySystemInformationFunc != NULL &&
-           sNtQueryInformationFileFunc   != NULL &&
-           sNtQueryObjectFunc            != NULL;
-}
-
-static void terminate() {
-    sNtQuerySystemInformationFunc = NULL;
-    sNtQueryInformationFileFunc = NULL;
-    sNtQueryObjectFunc = NULL;
-}
-
-static bool adjustPrivileges() {
-    char *error = NULL;
-    HANDLE tokenH;
-
-    // Open a process token that lets us adjust privileges
-    BOOL ok = OpenProcessToken(GetCurrentProcess(),   // ProcessHandle
-                               TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, // DesiredAccess
-                               &tokenH);              // TokenHandle
-    if (!ok) {
-        error = "OpenProcessToken failed: ";
-        goto bail_out;
-    }
-
-    // Lookup the privilege by name and get its local LUID token.
-    // What we request:
-    // SE_DEBUG_NAME, aka "SeDebugPrivilege"
-    // MSDN: Required to debug and adjust the memory of a process owned by another account.
-    //       User Right: Debug programs.
-    TOKEN_PRIVILEGES priv;
-    priv.PrivilegeCount = 1;
-    priv.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
-    ok = LookupPrivilegeValueA(NULL,                        // lpSystemName
-                               SE_DEBUG_NAME,               // lpName
-                               &(priv.Privileges[0].Luid)); // lpLuid
-    if (!ok) {
-        error = "LookupPrivilegeValue failed: ";
-        goto bail_out;
-    }
-
-    ok = AdjustTokenPrivileges(tokenH,  // TokenHandle
-                               FALSE,   // DisableAllPrivileges
-                               &priv,   // NewState
-                               0,       // BufferLength
-                               NULL,    // PreviousState
-                               0);      // ReturnLength
-    if (!ok) {
-        error = "AdjustTokenPrivileges failed: ";
-        goto bail_out;
-    }
-
-bail_out:
-    if (error != NULL && gIsDebug) {
-        CString err;
-        err.setLastWin32Error(error);
-        fprintf(stderr, "%s", err.cstr());
-    }
-
-    if (tokenH != NULL) {
-        CloseHandle(tokenH);
-    }
-
-    return !!ok;
-}
-
-static bool getHandleType(HANDLE h, CString *type) {
-    bool result = false;
-    ULONG size = 0;
-    // Get the size of the type string
-    int status = sNtQueryObjectFunc(h, 2, NULL, 0, &size);
-    if (status == STATUS_INFO_LENGTH_MISMATCH && size > 0) {
-        // Get the type string itself
-        char *buf = new char[size];
-        status = sNtQueryObjectFunc(h, 2, buf, size, NULL);
-        if (status == 0 && size > 96) {
-            // The type string we want is a wide unicode (UTF16)
-            // zero-terminated string located at offset 96 in the
-            // buffer. In our case we want the string to be
-            // "Directory" or "File" so we know the max useful length
-            // is 9.
-            // Since we can only deal with ansi strings in this program,
-            // we'll make a crude copy of every other byte and just check
-            // that the other bytes are zero.
-            const char *c = buf + 96;
-            const char *e = buf + 96 + size;
-            // we'll write at the beginning of our buffer
-            char *dest = buf;
-            char *dend = dest + 9;
-            for (; c < e && dest < dend && c[0] != '\0' && c[1] == '\0'; c += 2, dest++) {
-                *dest = *c;
-            }
-            *(dest++) = '\0';
-            type->set(buf, dest - buf);
-            result = true;
-        }
-
-        free(buf);
-    }
-    return result;
-}
-
-// These is the wide unicode representations of the type we want to find.
-static const char kFileW[] = "File";
-
-static char isFileHandleType(HANDLE handle) {
-    char type = 0;
-    ULONG size = 0;
-    // Get the size of the type string
-    int status = sNtQueryObjectFunc(handle, 2, NULL, 0, &size);
-    if (status == STATUS_INFO_LENGTH_MISMATCH && size > 0) {
-        // Get the type string itself
-        char *buf = new char[size];
-        status = sNtQueryObjectFunc(handle, 2, buf, size, NULL);
-        if (status == 0 && size > 96) {
-            // The type string we want is a wide unicode (UTF16-LE)
-            // zero-terminated string located at offset 96 in the
-            // buffer. In our case we want the string to be "File".
-            //
-            // Since we're reading wide unicode, we want each character
-            // to be the one from our string followed by a zero byte.
-            // e.g. c should point to F \0 i \0 l \0 e \0 \0 \0.
-            const char *c = buf + 96;
-            type = c[0];
-
-            int len = sizeof(kFileW);
-            const char *d = kFileW;
-
-            for (; type != 0 && len > 0; c+=2, d++, len--) {
-                if (c[0] != *d || c[1] != 0) {
-                    type = 0;
-                    break;
-                }
-            }
-        }
-
-        free(buf);
-    }
-    return type;
-}
-
-typedef struct {
-    HANDLE handle;
-    CString *outStr;
-    bool result;
-} SFileNameInfo;
-
-static unsigned __stdcall FileNameThreadFunc(void *param) {
-    SFileNameInfo *info = (SFileNameInfo *)param;
-    if (info == NULL) {
-        return 1;
-    }
-
-    char buf[MAX_PATH*2 + 4];
-    DWORD iob[2] = { 0, 0 };
-
-    DWORD status = sNtQueryInformationFileFunc(info->handle, iob, buf, sizeof(buf), 9);
-    if (status == STATUS_SUCCESS) {
-        // The result is a buffer with:
-        // - DWORD (4 bytes) for the *byte* length (so twice the character length)
-        // - Actual string in Unicode
-        // Not sure of the actual type, but it does look like a UNICODE_STRING struct.
-
-        DWORD len = ((DWORD *)buf)[0];
-        if (len <= MAX_PATH * 2) {
-            // We can't handle wide Unicode. What we do is convert it into
-            // straight ansi by just retaining the first of each couple bytes.
-            // Bytes that cannot be mapped (e.g. 2nd byte is != 0) will be
-            // simply converted to 0xFF.
-
-            unsigned char *dest = (unsigned char *)buf + 4;
-            unsigned char *src  = (unsigned char *)buf + 4;
-            for (DWORD i = 0; i < len; dest++, src += 2, i += 2) {
-                if (src[1] == 0) {
-                    *dest = *src;
-                } else {
-                    *dest = 0xFF;
-                }
-            }
-            *dest = '\0';
-            info->outStr->set(buf + 4, len);
-            info->result = true;
-            return 0;
-        }
-    }
-    return 1;
-}
-
-static bool getFileName(HANDLE handle, CString *outStr) {
-    SFileNameInfo info;
-    info.handle = handle;
-    info.outStr = outStr;
-    info.result = false;
-
-    // sNtQueryInformationFileFunc might hang on some handles.
-    // A trick is to do it in a thread and if it takes too loog then
-    // just shutdown the thread, since it's deadlocked anyway.
-    unsigned threadId;
-    HANDLE th = (HANDLE)_beginthreadex(NULL,                    // security
-                                       0,                       // stack_size
-                                       &FileNameThreadFunc,     // address
-                                       &info,                   // arglist
-                                       0,                       // initflag
-                                       &threadId);              // thrdaddr
-
-    if (th == NULL) {
-        // Failed to create thread. Shouldn't really happen.
-        outStr->set("<failed to create thread>");
-        return false;
-    }
-
-    bool result = false;
-
-    // Wait for thread or kill it if it takes too long.
-    if (WaitForSingleObject(th /*handle*/, 200 /*ms*/) == WAIT_TIMEOUT) {
-        TerminateThread(th /*handle*/, 0 /*retCode*/);
-        outStr->set("<timeout>");
-    } else {
-        result = info.result;
-    }
-
-    CloseHandle(th);
-    return result;
-}
-
-// Find the name of the process (e.g. "java.exe") given its id.
-// processesPtr must be the list returned by getAllProcesses().
-// Special handling for javaw.exe: this isn't quite useful so
-// we also try to find and append the parent process name.
-static bool getProcessName(SYSTEM_PROCESS_INFORMATION *processesPtr,
-                           DWORD remoteProcessId,
-                           CString *outStr) {
-    SYSTEM_PROCESS_INFORMATION *ptr = processesPtr;
-    while (ptr != NULL) {
-        if (ptr->dUniqueProcessId == remoteProcessId) {
-            // This is the process we want.
-
-            UNICODE_STRING *uniStr = &(ptr->usName);
-            WORD len = uniStr->Length;
-
-            char buf[MAX_PATH];
-            if (len <= MAX_PATH * 2) {
-                // We can't handle wide Unicode. What we do is convert it into
-                // straight ansi by just retaining the first of each couple bytes.
-                // Bytes that cannot be mapped (e.g. 2nd byte is != 0) will be
-                // simply converted to 0xFF.
-
-                unsigned char *dest = (unsigned char *)buf;
-                unsigned char *src  = (unsigned char *)uniStr->Buffer;
-                for (WORD i = 0; i < len; dest++, src += 2, i += 2) {
-                    if (src[1] == 0) {
-                        *dest = *src;
-                    } else {
-                        *dest = 0xFF;
-                    }
-                }
-                *dest = '\0';
-                outStr->set(buf, len);
-
-                if (strcmp(buf, "javaw.exe") == 0) {
-                    // Heuristic: eclipse often shows up as javaw.exe
-                    // but what is useful is to report eclipse to the user
-                    // instead.
-                    // So in this case, look at the parent and report it too.
-                    DWORD parentId = ptr->dInheritedFromUniqueProcessId;
-                    if (parentId > 0) {
-                        CString name2;
-                        bool ok2 = getProcessName(processesPtr,
-                                                  parentId,
-                                                  &name2);
-                        if (ok2) {
-                            outStr->add(" (");
-                            outStr->add(name2.cstr());
-                            outStr->add(")");
-                        }
-                    }
-                }
-
-                return true;
-            }
-        }
-
-        // Look at the next process, if any.
-        if (ptr->dNext == NULL) {
-            break;
-        } else {
-            ptr = (SYSTEM_PROCESS_INFORMATION *)((char *)ptr + ptr->dNext);
-        }
-    }
-
-    outStr->setf("<process id %08x name not found>", remoteProcessId);
-    return false;
-}
-
-// Query system for all processes information.
-// Returns an error string in case of error.
-// Returns the virtual_alloc-allocated buffer on success or NULL on error.
-// It's up to the caller to do a VirtualFree on the returned buffer.
-static SYSTEM_PROCESS_INFORMATION *queryAllProcess(const char **error) {
-    // Allocate a buffer for the process information. We don't know the
-    // exact size. A normal system might typically have between 100-200 processes.
-    // We'll resize the buffer if not big enough.
-    DWORD infoSize = 4096;
-    SYSTEM_PROCESS_INFORMATION *infoPtr =
-        (SYSTEM_PROCESS_INFORMATION *) VirtualAlloc(NULL, infoSize, MEM_COMMIT, PAGE_READWRITE);
-
-    if (infoPtr != NULL) {
-        // Query the actual size needed (or the data if it fits in the buffer)
-        DWORD needed = 0;
-        if (sNtQuerySystemInformationFunc(
-                SystemProcessInformation, infoPtr, infoSize, &needed) != 0) {
-            if (needed == 0) {
-                // Shouldn't happen.
-                *error = "No processes found";
-                goto bail_out;
-            }
-
-            // Realloc
-            VirtualFree(infoPtr, 0, MEM_RELEASE);
-            infoSize += needed;
-            infoPtr = (SYSTEM_PROCESS_INFORMATION *) VirtualAlloc(
-                            NULL, infoSize, MEM_COMMIT, PAGE_READWRITE);
-
-            // Query all the processes objects again
-            if (sNtQuerySystemInformationFunc(
-                    SystemProcessInformation, infoPtr, infoSize, NULL) != 0) {
-                *error = "Failed to query system processes";
-                goto bail_out;
-            }
-        }
-    }
-
-    if (infoPtr == NULL) {
-        *error = "Failed to allocate system processes info buffer";
-        goto bail_out;
-    }
-
-bail_out:
-    if (*error != NULL) {
-        VirtualFree(infoPtr, 0, MEM_RELEASE);
-        infoPtr = NULL;
-    }
-    return infoPtr;
-}
-
-// Query system for all handle information.
-// Returns an error string in case of error.
-// Returns the virtual_alloc-allocated buffer on success or NULL on error.
-// It's up to the caller to do a VirtualFree on the returned buffer.
-static SYSTEM_HANDLE_INFORMATION *queryAllHandles(const char **error) {
-    // Allocate a buffer. It won't be large enough to get the handles
-    // (e.g. there might be 10k or 40k handles around). We'll resize
-    // it once we know the actual size.
-    DWORD infoSize = 4096;
-    SYSTEM_HANDLE_INFORMATION *infoPtr =
-        (SYSTEM_HANDLE_INFORMATION *) VirtualAlloc(NULL, infoSize, MEM_COMMIT, PAGE_READWRITE);
-
-    if (infoPtr != NULL) {
-        // Query the actual size needed
-        DWORD needed = 0;
-        if (sNtQuerySystemInformationFunc(
-                SystemHandleInformation, infoPtr, infoSize, &needed) != 0) {
-            if (needed == 0) {
-                // Shouldn't happen.
-                *error = "No handles found";
-                goto bail_out;
-            }
-
-            // Realloc
-            VirtualFree(infoPtr, 0, MEM_RELEASE);
-            infoSize += needed;
-            infoPtr = (SYSTEM_HANDLE_INFORMATION *) VirtualAlloc(
-                            NULL, infoSize, MEM_COMMIT, PAGE_READWRITE);
-        }
-    }
-
-    if (infoPtr == NULL) {
-        *error = "Failed to allocate system handle info buffer";
-        goto bail_out;
-    }
-
-    // Query all the handle objects
-    if (sNtQuerySystemInformationFunc(SystemHandleInformation, infoPtr, infoSize, NULL) != 0) {
-        *error = "Failed to query system handles";
-        goto bail_out;
-    }
-
-bail_out:
-    if (*error != NULL) {
-        VirtualFree(infoPtr, 0, MEM_RELEASE);
-        infoPtr = NULL;
-    }
-    return infoPtr;
-}
-
-bool findLock(CPath &path, CString *outModule) {
-    bool result = false;
-    const char *error = NULL;
-
-    SYSTEM_PROCESS_INFORMATION *processesPtr = NULL;
-    SYSTEM_HANDLE_INFORMATION  *handlesPtr   = NULL;
-
-    const HANDLE currProcessH = GetCurrentProcess();
-    const DWORD currProcessId = GetCurrentProcessId();
-    HANDLE remoteProcessH = NULL;
-    DWORD remoteProcessId = 0;
-    DWORD matchProcessId = 0;
-
-    int numHandleFound = 0;
-    int numHandleChecked = 0;
-    int numHandleDirs = 0;
-    int numHandleFiles = 0;
-    int numProcessMatch = 0;
-
-    BYTE ob_type_file = 0;
-
-    // Get the path to search, without the drive letter.
-    const char *searchPath = path.cstr();
-    if (isalpha(searchPath[0]) && searchPath[1] == ':') {
-        searchPath += 2;
-    }
-    size_t searchPathLen = strlen(searchPath);
-
-    if (gIsDebug) fprintf(stderr, "Search path: '%s'\n", searchPath);
-
-    if (!init()) {
-        error = "Failed to bind to ntdll.dll";
-        goto bail_out;
-    }
-
-    if (!adjustPrivileges()) {
-        // We can still continue even if the privilege escalation failed.
-        // The apparent effect is that we'll fail to query the name of
-        // some processes, yet it will work for some of them.
-        if (gIsDebug) fprintf(stderr, "Warning: adusting privileges failed. Continuing anyway.\n");
-    } else {
-        if (gIsDebug) fprintf(stderr, "Privileges adjusted.\n"); // DEBUG remove lter
-    }
-
-    processesPtr = queryAllProcess(&error);
-    if (processesPtr == NULL) goto bail_out;
-
-    handlesPtr = queryAllHandles(&error);
-    if (handlesPtr == NULL) goto bail_out;
-
-    numHandleFound = handlesPtr->dCount;
-
-    // Check all the handles
-    for (int n = handlesPtr->dCount, i = 0; i < n; i++) {
-        SYSTEM_HANDLE sysh = handlesPtr->ash[i];
-
-        if (ob_type_file != 0 && sysh.bObjectType != ob_type_file) {
-            continue;
-        }
-
-        HANDLE handle = (HANDLE) sysh.wValue;
-        DWORD remoteId = sysh.dIdProcess;
-        HANDLE remoteH = NULL;
-
-        if (remoteId == matchProcessId) {
-            // We already matched that process, we can skip its other entries.
-            continue;
-        }
-
-        if (remoteId == currProcessId) {
-            // We don't match ourselves
-            continue;
-        }
-
-        // Open a remote process.
-        // Most entries of a given process seem to be consecutive, so we
-        // only open the remote process handle if it's a different id.
-        if (remoteProcessH == NULL && remoteId == remoteProcessId) {
-            // We already tried to open this process and it failed.
-            // It's not going to be any better the next time so skip it.
-            continue;
-        }
-        if (remoteProcessH == NULL || remoteId != remoteProcessId) {
-            if (remoteProcessH != NULL) {
-                CloseHandle(remoteProcessH);
-            }
-
-            remoteProcessId = remoteId;
-            remoteProcessH = OpenProcess(PROCESS_DUP_HANDLE,
-                                         FALSE /*inheritHandle*/,
-                                         remoteProcessId);
-            if (remoteProcessH == NULL) {
-                continue;
-            }
-        }
-
-        if (remoteProcessH != NULL) {
-            // Duplicate the remote handle
-            if (DuplicateHandle(remoteProcessH,     // hSourceProcessHandle
-                                handle,             // hSourceHandle
-                                currProcessH,       // hTargetProcessHandle
-                                &remoteH,           // lpTargetHandle
-                                0,                  // dwDesiredAccess (ignored by same access)
-                                FALSE,              // bInheritHandle
-                                DUPLICATE_SAME_ACCESS) == 0) {
-                continue;
-            }
-        }
-
-        numHandleChecked++;
-
-        char type = isFileHandleType(remoteH);
-
-        if (type != 0) {
-            if (type == 'D') numHandleDirs++;
-            else if (type == 'F') numHandleFiles++;
-
-            // TODO simplify by not keeping directory handles
-            if (ob_type_file == 0 && type == 'F') {
-                // We found the first file handle. Remember it's system_handle object type
-                // and then use it to filter the following system_handle.
-                // For some reason OB_TYPE_FILE should be 0x1A but empirically I find it
-                // to be 0x1C, so we just make this test more dynamic.
-                ob_type_file = sysh.bObjectType;
-            }
-
-            // Try to get a filename out of that file or directory handle.
-            CString name("<unknown>");
-            bool ok = getFileName(remoteH, &name);
-
-            if (gIsDebug) {
-                fprintf(stderr, "P:%08x | t:%02x | f:%02x | v:%08x | %c | %s %s\n",
-                    sysh.dIdProcess, sysh.bObjectType, sysh.bFlags, sysh.wValue,
-                    type,
-                    ok ? "OK" : "FAIL",
-                    name.cstr()
-                    );
-            }
-
-            if (ok) {
-                // We got a file path. Let's check if it matches our target path.
-                if (_strnicmp(searchPath, name.cstr(), searchPathLen) == 0) {
-                    // Remember this process id so that we can ignore all its following entries.
-                    matchProcessId = remoteId;
-
-                    // Find out its process name
-                    CString procName("<unknown>");
-                    ok = getProcessName(processesPtr, remoteProcessId, &procName);
-                    if (ok) {
-                        numProcessMatch++;
-
-                        if (!outModule->isEmpty()) {
-                            outModule->add(";");
-                        }
-                        outModule->add(procName.cstr());
-                        result = true;
-                    }
-
-                    if (gIsDebug) {
-                        fprintf(stderr, "==> MATCH FOUND: %s  %s\n",
-                            ok ? "OK" : "FAIL",
-                            procName.cstr()
-                            );
-                    }
-                }
-            }
-
-        }
-
-        if (remoteH != NULL) {
-            CloseHandle(remoteH);
-            remoteH = NULL;
-        }
-    }
-
-bail_out:
-
-    if (gIsDebug) {
-        fprintf(stderr, "Processes matched: %d\n", numProcessMatch);
-        fprintf(stderr, "Handles: %d found, %d checked, %d dirs, %d files\n",
-               numHandleFound,
-               numHandleChecked,
-               numHandleDirs,
-               numHandleFiles);
-    }
-
-    if (error != NULL) {
-        CString msg;
-        msg.setLastWin32Error(NULL);
-        if (gIsDebug) fprintf(stderr, "[ERROR] %s: %s", error, msg.cstr());
-    }
-
-    if (remoteProcessH != NULL) {
-        CloseHandle(remoteProcessH);
-    }
-
-    if (currProcessH != NULL) {
-        CloseHandle(currProcessH);
-    }
-
-    if (handlesPtr != NULL) {
-        VirtualFree(handlesPtr, 0, MEM_RELEASE);
-        handlesPtr = NULL;
-    }
-
-    terminate();
-
-    return result;
-}
-
-#endif /* _WIN32 */
diff --git a/find_lock/find_lock.exe.manifest b/find_lock/find_lock.exe.manifest
deleted file mode 100755
index b26b66b..0000000
--- a/find_lock/find_lock.exe.manifest
+++ /dev/null
@@ -1,33 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-
-<!--
-  For details on the Assembly Manifest, please look here:
-  http://msdn.microsoft.com/en-us/library/aa374191(VS.85).aspx
--->
-
-<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
-
-    <application>
-        <!--The ID below indicates application support for Windows Vista -->
-        <supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}" />
-        <!--The ID below indicates application support for Windows 7 -->
-        <supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}" />
-    </application>
-
-    <assemblyIdentity version="1.0.0.0"
-        processorArchitecture="x86"
-        name="Android.SDK.FindLock"
-        type="win32"
-        />
-
-    <description>Utility to find which processes are locking an SDK folder.</description>
-
-    <!-- Identify the application security requirements. -->
-    <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
-        <security>
-            <requestedPrivileges>
-                <requestedExecutionLevel level="asInvoker" uiAccess="false" />
-            </requestedPrivileges>
-        </security>
-    </trustInfo>
-</assembly>
diff --git a/find_lock/find_lock.h b/find_lock/find_lock.h
deleted file mode 100755
index d7ade0a..0000000
--- a/find_lock/find_lock.h
+++ /dev/null
@@ -1,25 +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.
- */
-
-#ifndef _H_FIND_LOCK
-#define _H_FIND_LOCK
-
-#ifdef _WIN32
-
-bool findLock(CPath &path, CString *outModule);
-
-#endif /* _WIN32 */
-#endif /* _H_FIND_LOCK */
diff --git a/find_lock/find_lock_exe.cpp b/find_lock/find_lock_exe.cpp
deleted file mode 100755
index d68b63e..0000000
--- a/find_lock/find_lock_exe.cpp
+++ /dev/null
@@ -1,80 +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.
- */
-
-/*
- * "find_lock.exe", for Windows only.
- */
-
-#ifdef _WIN32
-
-#include "utils.h"
-#include "find_lock.h"
-#include <io.h>
-#include <fcntl.h>
-
-int main(int argc, char* argv[]) {
-
-    gIsConsole = true; // tell utils to to print errors to stderr
-    gIsDebug = (getenv("ANDROID_SDKMAN_DEBUG") != NULL);
-    CPath dirPath;
-    bool doPrintUsage = false;
-
-    for (int i = 1; i < argc; i++) {
-        if (strncmp(argv[i], "-d", 2) == 0) {
-            gIsDebug = true;
-
-        } else if (dirPath.isEmpty()) {
-            dirPath.set(argv[i]);
-
-        } else {
-            doPrintUsage = true;
-        }
-    }
-
-    if (dirPath.isEmpty()) {
-        fprintf(stderr, "Error: Missing directory path\n");
-        doPrintUsage = true;
-
-    } else if (!dirPath.dirExists()) {
-        fprintf(stderr, "Error: '%s' is not a valid directory.\n", dirPath.cstr());
-        return 1;
-    }
-
-    if (doPrintUsage) {
-        printf(
-            "Usage: find_lock.exe [options] sdk_directory_path\n"
-            "\n"
-            "Outputs the names of modules that are locking the given directory.\n"
-            "Returns code 0 when found, 1 when not found.\n"
-            "\n"
-            "Options:\n"
-            "-h / -help   : This help.\n"
-            "-t / -test   : Internal test.\n"
-            );
-        return 2;
-    }
-
-    CString result;
-    if (findLock(dirPath, &result)) {
-        fflush(stdout);
-        fflush(stderr);
-        printf("%s", result.cstr());
-        return 0;
-    }
-    return 1;
-}
-
-#endif /* _WIN32 */
diff --git a/find_lock/find_lock_exe.vcxproj b/find_lock/find_lock_exe.vcxproj
deleted file mode 100644
index 9da38e6..0000000
--- a/find_lock/find_lock_exe.vcxproj
+++ /dev/null
@@ -1,168 +0,0 @@
-﻿<?xml version="1.0" encoding="utf-8"?>
-<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <ItemGroup Label="ProjectConfigurations">
-    <ProjectConfiguration Include="Debug|Win32">
-      <Configuration>Debug</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Debug|x64">
-      <Configuration>Debug</Configuration>
-      <Platform>x64</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Release|Win32">
-      <Configuration>Release</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Release|x64">
-      <Configuration>Release</Configuration>
-      <Platform>x64</Platform>
-    </ProjectConfiguration>
-  </ItemGroup>
-  <PropertyGroup Label="Globals">
-    <ProjectName>FindLock</ProjectName>
-    <ProjectGuid>{42701EC1-6226-47FD-8817-57A3DEC7A1E2}</ProjectGuid>
-    <RootNamespace>FindLock</RootNamespace>
-    <Keyword>Win32Proj</Keyword>
-  </PropertyGroup>
-  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <CharacterSet>MultiByte</CharacterSet>
-    <WholeProgramOptimization>true</WholeProgramOptimization>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <CharacterSet>MultiByte</CharacterSet>
-    <WholeProgramOptimization>true</WholeProgramOptimization>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <CharacterSet>MultiByte</CharacterSet>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <CharacterSet>MultiByte</CharacterSet>
-  </PropertyGroup>
-  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
-  <ImportGroup Label="ExtensionSettings">
-  </ImportGroup>
-  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
-    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
-  </ImportGroup>
-  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
-    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
-  </ImportGroup>
-  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
-    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
-  </ImportGroup>
-  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">
-    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
-  </ImportGroup>
-  <PropertyGroup Label="UserMacros" />
-  <PropertyGroup>
-    <_ProjectFileVersion>10.0.40219.1</_ProjectFileVersion>
-    <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)..\..\out\host\windows-x86\$(Configuration)\$(ProjectName)\</OutDir>
-    <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(SolutionDir)..\..\out\host\windows-x64\$(Configuration)\$(ProjectName)\</OutDir>
-    <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)..\..\out\host\windows-x86\$(Configuration)\$(ProjectName)\</IntDir>
-    <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(SolutionDir)..\..\out\host\windows-x64\$(Configuration)\$(ProjectName)\</IntDir>
-    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</LinkIncremental>
-    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</LinkIncremental>
-    <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)..\..\out\host\windows-x86\$(Configuration)\$(ProjectName)\</OutDir>
-    <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(SolutionDir)..\..\out\host\windows-x64\$(Configuration)\$(ProjectName)\</OutDir>
-    <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)..\..\out\host\windows-x86\$(Configuration)\$(ProjectName)\</IntDir>
-    <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(SolutionDir)..\..\out\host\windows-x64\$(Configuration)\$(ProjectName)\</IntDir>
-    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>
-    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</LinkIncremental>
-  </PropertyGroup>
-  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
-    <ClCompile>
-      <Optimization>Disabled</Optimization>
-      <AdditionalIncludeDirectories>..\find_java\src\source;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <MinimalRebuild>true</MinimalRebuild>
-      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
-      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
-      <DisableLanguageExtensions>false</DisableLanguageExtensions>
-      <PrecompiledHeader>
-      </PrecompiledHeader>
-      <WarningLevel>Level3</WarningLevel>
-      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
-    </ClCompile>
-    <Link>
-      <GenerateDebugInformation>true</GenerateDebugInformation>
-      <SubSystem>Console</SubSystem>
-      <TargetMachine>MachineX86</TargetMachine>
-    </Link>
-  </ItemDefinitionGroup>
-  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
-    <ClCompile>
-      <Optimization>Disabled</Optimization>
-      <AdditionalIncludeDirectories>..\find_java\src\source;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
-      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
-      <DisableLanguageExtensions>false</DisableLanguageExtensions>
-      <PrecompiledHeader>
-      </PrecompiledHeader>
-      <WarningLevel>Level3</WarningLevel>
-      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
-    </ClCompile>
-    <Link>
-      <GenerateDebugInformation>true</GenerateDebugInformation>
-      <SubSystem>Console</SubSystem>
-    </Link>
-  </ItemDefinitionGroup>
-  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
-    <ClCompile>
-      <Optimization>MaxSpeed</Optimization>
-      <IntrinsicFunctions>true</IntrinsicFunctions>
-      <AdditionalIncludeDirectories>..\find_java\src\source;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
-      <FunctionLevelLinking>true</FunctionLevelLinking>
-      <PrecompiledHeader>
-      </PrecompiledHeader>
-      <WarningLevel>Level3</WarningLevel>
-      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
-    </ClCompile>
-    <Link>
-      <GenerateDebugInformation>true</GenerateDebugInformation>
-      <SubSystem>Console</SubSystem>
-      <OptimizeReferences>true</OptimizeReferences>
-      <EnableCOMDATFolding>true</EnableCOMDATFolding>
-      <TargetMachine>MachineX86</TargetMachine>
-    </Link>
-  </ItemDefinitionGroup>
-  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
-    <ClCompile>
-      <Optimization>MaxSpeed</Optimization>
-      <IntrinsicFunctions>true</IntrinsicFunctions>
-      <AdditionalIncludeDirectories>..\find_java\src\source;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
-      <FunctionLevelLinking>true</FunctionLevelLinking>
-      <PrecompiledHeader>
-      </PrecompiledHeader>
-      <WarningLevel>Level3</WarningLevel>
-      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
-    </ClCompile>
-    <Link>
-      <GenerateDebugInformation>true</GenerateDebugInformation>
-      <SubSystem>Console</SubSystem>
-      <OptimizeReferences>true</OptimizeReferences>
-      <EnableCOMDATFolding>true</EnableCOMDATFolding>
-    </Link>
-  </ItemDefinitionGroup>
-  <ItemGroup>
-    <ClCompile Include="find_lock.cpp" />
-    <ClCompile Include="find_lock_exe.cpp" />
-    <ClCompile Include="..\find_java\src\source\utils.cpp" />
-  </ItemGroup>
-  <ItemGroup>
-    <ClInclude Include="find_lock.h" />
-    <ClInclude Include="..\find_java\src\source\utils.h" />
-  </ItemGroup>
-  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
-  <ImportGroup Label="ExtensionTargets">
-  </ImportGroup>
-</Project>
\ No newline at end of file
diff --git a/find_lock/find_lock_exe.vcxproj.filters b/find_lock/find_lock_exe.vcxproj.filters
deleted file mode 100644
index 85331fd..0000000
--- a/find_lock/find_lock_exe.vcxproj.filters
+++ /dev/null
@@ -1,36 +0,0 @@
-﻿<?xml version="1.0" encoding="utf-8"?>
-<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <ItemGroup>
-    <Filter Include="Source Files">
-      <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
-      <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
-    </Filter>
-    <Filter Include="Header Files">
-      <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
-      <Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions>
-    </Filter>
-    <Filter Include="Resource Files">
-      <UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
-      <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav</Extensions>
-    </Filter>
-  </ItemGroup>
-  <ItemGroup>
-    <ClCompile Include="find_lock.cpp">
-      <Filter>Source Files</Filter>
-    </ClCompile>
-    <ClCompile Include="find_lock_exe.cpp">
-      <Filter>Source Files</Filter>
-    </ClCompile>
-    <ClCompile Include="..\find_java\src\source\utils.cpp">
-      <Filter>Source Files</Filter>
-    </ClCompile>
-  </ItemGroup>
-  <ItemGroup>
-    <ClInclude Include="find_lock.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="..\find_java\src\source\utils.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-  </ItemGroup>
-</Project>
\ No newline at end of file
diff --git a/find_lock/images/android_icon.ico b/find_lock/images/android_icon.ico
deleted file mode 100644
index bd25179..0000000
--- a/find_lock/images/android_icon.ico
+++ /dev/null
Binary files differ
diff --git a/find_lock/images/android_icon.rc b/find_lock/images/android_icon.rc
deleted file mode 100644
index 2aa9985..0000000
--- a/find_lock/images/android_icon.rc
+++ /dev/null
@@ -1,2 +0,0 @@
-1 ICON "../images/android_icon.ico"
-1 RT_MANIFEST "../find_lock.exe.manifest"
diff --git a/hierarchyviewer/Android.bp b/hierarchyviewer/Android.bp
deleted file mode 100644
index 69134f0..0000000
--- a/hierarchyviewer/Android.bp
+++ /dev/null
@@ -1,27 +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.
-
-java_library_host {
-    name: "hierarchyviewer",
-
-    srcs: ["src/**/*.java"],
-    java_resource_dirs: ["src/resources"],
-
-    manifest: "etc/manifest.txt",
-    libs: [
-        "ddmlib-prebuilt",
-        "org-openide-util",
-        "org-netbeans-api-visual",
-    ],
-}
diff --git a/hierarchyviewer/MODULE_LICENSE_APACHE2 b/hierarchyviewer/MODULE_LICENSE_APACHE2
deleted file mode 100644
index e69de29..0000000
--- a/hierarchyviewer/MODULE_LICENSE_APACHE2
+++ /dev/null
diff --git a/hierarchyviewer/README.txt b/hierarchyviewer/README.txt
deleted file mode 100644
index 81fae95..0000000
--- a/hierarchyviewer/README.txt
+++ /dev/null
@@ -1,8 +0,0 @@
-This version of HierarchyViewer is deprecated and obsolete.
-The sources are left here just for reference. Please do not change them.
-
-HierarchyViewer2 is located in /tools/swt/hierarchyviewer2.
-This is the version that ships in the SDK.
-
---- RM 20130409
-
diff --git a/hierarchyviewer/etc/Android.bp b/hierarchyviewer/etc/Android.bp
deleted file mode 100644
index c1d8525..0000000
--- a/hierarchyviewer/etc/Android.bp
+++ /dev/null
@@ -1,18 +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.
-
-sh_binary_host {
-    name: "hierarchyviewer1",
-    src: "hierarchyviewer1",
-}
diff --git a/hierarchyviewer/etc/hierarchyviewer1 b/hierarchyviewer/etc/hierarchyviewer1
deleted file mode 100755
index 4244434..0000000
--- a/hierarchyviewer/etc/hierarchyviewer1
+++ /dev/null
@@ -1,63 +0,0 @@
-#!/bin/sh
-# Copyright 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.
-
-# Set up prog to be the path of this script, including following symlinks,
-# and set up progdir to be the fully-qualified pathname of its directory.
-prog="$0"
-while [ -h "${prog}" ]; do
-    newProg=`/bin/ls -ld "${prog}"`
-    newProg=`expr "${newProg}" : ".* -> \(.*\)$"`
-    if expr "x${newProg}" : 'x/' >/dev/null; then
-        prog="${newProg}"
-    else
-        progdir=`dirname "${prog}"`
-        prog="${progdir}/${newProg}"
-    fi
-done
-oldwd=`pwd`
-progdir=`dirname "${prog}"`
-cd "${progdir}"
-progdir=`pwd`
-prog="${progdir}"/`basename "${prog}"`
-cd "${oldwd}"
-
-jarfile=hierarchyviewer.jar
-frameworkdir="$progdir"
-if [ ! -r "$frameworkdir/$jarfile" ]
-then
-    frameworkdir=`dirname "$progdir"`/tools/lib
-    libdir=`dirname "$progdir"`/tools/lib
-fi
-if [ ! -r "$frameworkdir/$jarfile" ]
-then
-    frameworkdir=`dirname "$progdir"`/framework
-    libdir=`dirname "$progdir"`/lib
-fi
-if [ ! -r "$frameworkdir/$jarfile" ]
-then
-    echo `basename "$prog"`": can't find $jarfile"
-    exit 1
-fi
-
-if [ "$OSTYPE" = "cygwin" ] ; then
-    jarpath=`cygpath -w  "$frameworkdir/$jarfile"`
-    progdir=`cygpath -w  "$progdir"`
-else
-    jarpath="$frameworkdir/$jarfile"
-fi
-
-# need to use "java.ext.dirs" because "-jar" causes classpath to be ignored
-# might need more memory, e.g. -Xmx128M
-exec java -Xmx512M -Djava.ext.dirs="$frameworkdir" -Dhierarchyviewer.adb="$progdir" -jar "$jarpath" "$@"
diff --git a/hierarchyviewer/etc/hierarchyviewer1.bat b/hierarchyviewer/etc/hierarchyviewer1.bat
deleted file mode 100755
index b4da06a..0000000
--- a/hierarchyviewer/etc/hierarchyviewer1.bat
+++ /dev/null
@@ -1,46 +0,0 @@
-@echo off
-rem Copyright (C) 2008 The Android Open Source Project
-rem
-rem Licensed under the Apache License, Version 2.0 (the "License");
-rem you may not use this file except in compliance with the License.
-rem You may obtain a copy of the License at
-rem
-rem      http://www.apache.org/licenses/LICENSE-2.0
-rem
-rem Unless required by applicable law or agreed to in writing, software
-rem distributed under the License is distributed on an "AS IS" BASIS,
-rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-rem See the License for the specific language governing permissions and
-rem limitations under the License.
-
-rem don't modify the caller's environment
-setlocal
-
-rem Set up prog to be the path of this script, including following symlinks,
-rem and set up progdir to be the fully-qualified pathname of its directory.
-set prog=%~f0
-
-rem Change current directory and drive to where the script is, to avoid
-rem issues with directories containing whitespaces.
-cd /d %~dp0
-
-rem Check we have a valid Java.exe in the path.
-set java_exe=
-call lib\find_java.bat
-if not defined java_exe goto :EOF
-
-set jarfile=hierarchyviewer.jar
-set frameworkdir=.
-set libdir=
-
-if exist %frameworkdir%\%jarfile% goto JarFileOk
-    set frameworkdir=lib
-
-if exist %frameworkdir%\%jarfile% goto JarFileOk
-    set frameworkdir=..\framework
-
-:JarFileOk
-
-set jarpath=%frameworkdir%\%jarfile%
-
-call "%java_exe%" -Xmx512m "-Djava.ext.dirs=%frameworkdir%" -Dhierarchyviewer.adb= -jar %jarpath% %*
diff --git a/hierarchyviewer/etc/manifest.txt b/hierarchyviewer/etc/manifest.txt
deleted file mode 100644
index 06efd79..0000000
--- a/hierarchyviewer/etc/manifest.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-Main-Class: com.android.hierarchyviewer.HierarchyViewer
-Class-Path: ddmlib.jar org-openide-util.jar org-netbeans-api-visual.jar
diff --git a/hierarchyviewer/src/com/android/hierarchyviewer/HierarchyViewer.java b/hierarchyviewer/src/com/android/hierarchyviewer/HierarchyViewer.java
deleted file mode 100644
index 385ee79..0000000
--- a/hierarchyviewer/src/com/android/hierarchyviewer/HierarchyViewer.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.hierarchyviewer;
-
-import com.android.ddmlib.IDevice;
-import com.android.hierarchyviewer.device.Window;
-import com.android.hierarchyviewer.scene.CaptureLoader;
-import com.android.hierarchyviewer.ui.Workspace;
-import com.android.hierarchyviewer.device.DeviceBridge;
-
-import javax.swing.SwingUtilities;
-import javax.swing.UIManager;
-import javax.swing.UnsupportedLookAndFeelException;
-import java.io.File;
-
-public class HierarchyViewer {
-    private static final CharSequence OS_WINDOWS = "Windows";
-    private static final CharSequence OS_MACOSX = "Mac OS X";
-
-    private static boolean sProfilingEnabled = true;
-
-    public static boolean isProfilingEnabled() {
-        return sProfilingEnabled;
-    }
-
-    private static void initUserInterface() {
-        System.setProperty("apple.laf.useScreenMenuBar", "true");
-        System.setProperty("apple.awt.brushMetalLook", "true");
-        System.setProperty("com.apple.mrj.application.apple.menu.about.name", "HierarchyViewer");
-
-        final String os = System.getProperty("os.name");
-
-        try {
-            if (os.contains(OS_WINDOWS) || os.contains(OS_MACOSX)) {
-                UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
-            } else {
-                UIManager.setLookAndFeel(UIManager.getCrossPlatformLookAndFeelClassName());
-            }
-        } catch (ClassNotFoundException e) {
-            e.printStackTrace();
-        } catch (InstantiationException e) {
-            e.printStackTrace();
-        } catch (IllegalAccessException e) {
-            e.printStackTrace();
-        } catch (UnsupportedLookAndFeelException e) {
-            e.printStackTrace();
-        }
-    }
-
-    private static void listDevices() {
-        System.out.println("List of devices attached");
-        try {
-            Thread.sleep(500);
-        } catch (InterruptedException e) {
-            e.printStackTrace();
-        }
-        for (IDevice device : DeviceBridge.getDevices()) {
-            printDevice(device);
-        }
-        DeviceBridge.terminate();
-    }
-
-    private static void printDevice(IDevice device) {
-        System.out.println(device.toString() + "\t\t" +
-                (device.isEmulator() ? "emulator" : "device"));
-    }
-
-    private static void outputPsd(String deviceName, String file) {
-        IDevice device = selectDevice(deviceName);
-        if (device != null) {
-            if (DeviceBridge.isViewServerRunning(device)) {
-                DeviceBridge.stopViewServer(device);
-            }
-            DeviceBridge.startViewServer(device);
-            DeviceBridge.setupDeviceForward(device);
-            System.out.println("Capturing layers to " + file);
-            CaptureLoader.saveLayers(device, Window.FOCUSED_WINDOW, new File(file));
-        } else {
-            System.out.println("The selected device does not exist");
-        }
-        DeviceBridge.terminate();
-    }
-
-    private static IDevice selectDevice(String deviceName) {
-        try {
-            Thread.sleep(500);
-        } catch (InterruptedException e) {
-            e.printStackTrace();
-        }
-        if (DeviceBridge.getDevices() == null) return null;
-        if (deviceName == null) return DeviceBridge.getDevices()[0];
-        for (IDevice device : DeviceBridge.getDevices()) {
-            if (device.getSerialNumber().equalsIgnoreCase(deviceName)) {
-                return device;
-            }
-        }
-        return null;
-    }
-
-    public static void main(String[] args) {
-        DeviceBridge.initDebugBridge();
-
-        if (args.length > 0) {
-            for (int i = 0; i < args.length; i++) {
-                String arg = args[i];
-                if ("--help".equalsIgnoreCase(arg)) {
-                    System.out.println("Usage: hierarchyviewer1 [options]\n");
-                    System.out.println("Options:");
-                    System.out.println("  --help\t\t\t Show this help message and exit");
-                    System.out.println("  --no-profiling\t Disable views profiling");
-                    System.out.println("  --devices\t\t\t Show the list of available devices");
-                    System.out.println("  --psd [device] <file>\t Export psd and exit");
-                    System.exit(0);
-                } else if ("--no-profiling".equalsIgnoreCase(arg)) {
-                    sProfilingEnabled = false;
-                } else if ("--devices".equalsIgnoreCase(arg)) {
-                    listDevices();
-                    System.exit(0);
-                } else if ("--psd".equalsIgnoreCase(arg)) {
-                    if (i == args.length - 1) {
-                        System.out.println("You must specify at least an output file with --psd");
-                        System.exit(1);
-                    }
-                    String device = null;
-                    String file = null;
-                    if (i < args.length - 2) {
-                        device = args[++i];
-                    }
-                    if (i < args.length - 1) {
-                        file = args[++i];
-                    }
-                    outputPsd(device, file);
-                    System.exit(0);
-                }
-            }
-        }
-
-        initUserInterface();
-        SwingUtilities.invokeLater(new Runnable() {
-            public void run() {
-                Workspace workspace = new Workspace();
-                workspace.setDefaultCloseOperation(Workspace.EXIT_ON_CLOSE);
-                workspace.setLocationRelativeTo(null);
-                workspace.setVisible(true);
-            }
-        });
-    }
-}
diff --git a/hierarchyviewer/src/com/android/hierarchyviewer/device/Configuration.java b/hierarchyviewer/src/com/android/hierarchyviewer/device/Configuration.java
deleted file mode 100644
index 090730f..0000000
--- a/hierarchyviewer/src/com/android/hierarchyviewer/device/Configuration.java
+++ /dev/null
@@ -1,27 +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.hierarchyviewer.device;
-
-public class Configuration {
-    public static final int DEFAULT_SERVER_PORT = 4939;
-
-    // These codes must match the auto-generated codes in IWindowManager.java
-    // See IWindowManager.aidl as well
-    public static final int SERVICE_CODE_START_SERVER = 1;
-    public static final int SERVICE_CODE_STOP_SERVER = 2;
-    public static final int SERVICE_CODE_IS_SERVER_RUNNING = 3;
-}
diff --git a/hierarchyviewer/src/com/android/hierarchyviewer/device/DeviceBridge.java b/hierarchyviewer/src/com/android/hierarchyviewer/device/DeviceBridge.java
deleted file mode 100644
index f585ea6..0000000
--- a/hierarchyviewer/src/com/android/hierarchyviewer/device/DeviceBridge.java
+++ /dev/null
@@ -1,237 +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.hierarchyviewer.device;
-
-import com.android.ddmlib.AdbCommandRejectedException;
-import com.android.ddmlib.AndroidDebugBridge;
-import com.android.ddmlib.IDevice;
-import com.android.ddmlib.Log;
-import com.android.ddmlib.MultiLineReceiver;
-import com.android.ddmlib.ShellCommandUnresponsiveException;
-import com.android.ddmlib.TimeoutException;
-import com.android.hierarchyviewer.scene.VersionLoader;
-
-import java.io.IOException;
-import java.io.File;
-import java.util.HashMap;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-public class DeviceBridge {
-    private static AndroidDebugBridge bridge;
-
-    private static final HashMap<IDevice, Integer> devicePortMap = new HashMap<IDevice, Integer>();
-    private static int nextLocalPort = Configuration.DEFAULT_SERVER_PORT;
-
-    public static void initDebugBridge() {
-        if (bridge == null) {
-            AndroidDebugBridge.init(false /* debugger support */);
-        }
-        if (bridge == null || !bridge.isConnected()) {
-            String adbLocation = System.getProperty("hierarchyviewer.adb");
-            if (adbLocation != null && adbLocation.length() != 0) {
-                adbLocation += File.separator + "adb";
-            } else {
-                adbLocation = "adb";
-            }
-
-            bridge = AndroidDebugBridge.createBridge(adbLocation, true);
-        }
-    }
-
-    public static void startListenForDevices(AndroidDebugBridge.IDeviceChangeListener listener) {
-        AndroidDebugBridge.addDeviceChangeListener(listener);
-    }
-
-    public static IDevice[] getDevices() {
-        return bridge.getDevices();
-    }
-
-    public static boolean isViewServerRunning(IDevice device) {
-        initDebugBridge();
-        final boolean[] result = new boolean[1];
-        try {
-            if (device.isOnline()) {
-                device.executeShellCommand(buildIsServerRunningShellCommand(),
-                        new BooleanResultReader(result));
-                if (!result[0]) {
-                    if (VersionLoader.loadProtocolVersion(device) > 2) {
-                        result[0] = true;
-                    }
-                }
-            }
-        } catch (IOException e) {
-            e.printStackTrace();
-        } catch (TimeoutException e) {
-            e.printStackTrace();
-        } catch (AdbCommandRejectedException e) {
-            e.printStackTrace();
-        } catch (ShellCommandUnresponsiveException e) {
-            e.printStackTrace();
-        }
-        return result[0];
-    }
-
-    public static boolean startViewServer(IDevice device) {
-        return startViewServer(device, Configuration.DEFAULT_SERVER_PORT);
-    }
-
-    public static boolean startViewServer(IDevice device, int port) {
-        initDebugBridge();
-        final boolean[] result = new boolean[1];
-        try {
-            if (device.isOnline()) {
-                device.executeShellCommand(buildStartServerShellCommand(port),
-                        new BooleanResultReader(result));
-            }
-        } catch (IOException e) {
-            e.printStackTrace();
-        } catch (TimeoutException e) {
-            e.printStackTrace();
-        } catch (AdbCommandRejectedException e) {
-            e.printStackTrace();
-        } catch (ShellCommandUnresponsiveException e) {
-            e.printStackTrace();
-        }
-        return result[0];
-    }
-
-    public static boolean stopViewServer(IDevice device) {
-        initDebugBridge();
-        final boolean[] result = new boolean[1];
-        try {
-            if (device.isOnline()) {
-                device.executeShellCommand(buildStopServerShellCommand(),
-                        new BooleanResultReader(result));
-            }
-        } catch (IOException e) {
-            e.printStackTrace();
-        } catch (TimeoutException e) {
-            e.printStackTrace();
-        } catch (AdbCommandRejectedException e) {
-            e.printStackTrace();
-        } catch (ShellCommandUnresponsiveException e) {
-            e.printStackTrace();
-        }
-        return result[0];
-    }
-
-    public static void terminate() {
-        AndroidDebugBridge.terminate();
-    }
-
-    /**
-     * Sets up a just-connected device to work with the view server.
-     * <p/>This starts a port forwarding between a local port and a port on the device.
-     * @param device
-     */
-    public static void setupDeviceForward(IDevice device) {
-        synchronized (devicePortMap) {
-            if (device.getState() == IDevice.DeviceState.ONLINE) {
-                int localPort = nextLocalPort++;
-                try {
-                    device.createForward(localPort, Configuration.DEFAULT_SERVER_PORT);
-                    devicePortMap.put(device, localPort);
-                } catch (TimeoutException e) {
-                    Log.e("hierarchy", "Timeout setting up port forwarding for " + device);
-                } catch (AdbCommandRejectedException e) {
-                    Log.e("hierarchy", String.format(
-                            "Adb rejected forward command for device %1$s: %2$s",
-                            device, e.getMessage()));
-                } catch (IOException e) {
-                    Log.e("hierarchy", String.format(
-                            "Failed to create forward for device %1$s: %2$s",
-                            device, e.getMessage()));
-                }
-            }
-        }
-    }
-
-    public static void removeDeviceForward(IDevice device) {
-        synchronized (devicePortMap) {
-            final Integer localPort = devicePortMap.get(device);
-            if (localPort != null) {
-                try {
-                    device.removeForward(localPort, Configuration.DEFAULT_SERVER_PORT);
-                    devicePortMap.remove(device);
-                } catch (TimeoutException e) {
-                    Log.e("hierarchy", "Timeout removing port forwarding for " + device);
-                } catch (AdbCommandRejectedException e) {
-                    Log.e("hierarchy", String.format(
-                            "Adb rejected remove-forward command for device %1$s: %2$s",
-                            device, e.getMessage()));
-                } catch (IOException e) {
-                    Log.e("hierarchy", String.format(
-                            "Failed to remove forward for device %1$s: %2$s",
-                            device, e.getMessage()));
-                }
-            }
-        }
-    }
-
-    public static int getDeviceLocalPort(IDevice device) {
-        synchronized (devicePortMap) {
-            Integer port = devicePortMap.get(device);
-            if (port != null) {
-                return port;
-            }
-
-            Log.e("hierarchy", "Missing forwarded port for " + device.getSerialNumber());
-            return -1;
-        }
-
-    }
-
-    private static String buildStartServerShellCommand(int port) {
-        return String.format("service call window %d i32 %d",
-                Configuration.SERVICE_CODE_START_SERVER, port);
-    }
-
-    private static String buildStopServerShellCommand() {
-        return String.format("service call window %d", Configuration.SERVICE_CODE_STOP_SERVER);
-    }
-
-    private static String buildIsServerRunningShellCommand() {
-        return String.format("service call window %d",
-                Configuration.SERVICE_CODE_IS_SERVER_RUNNING);
-    }
-
-    private static class BooleanResultReader extends MultiLineReceiver {
-        private final boolean[] mResult;
-
-        public BooleanResultReader(boolean[] result) {
-            mResult = result;
-        }
-
-        @Override
-        public void processNewLines(String[] strings) {
-            if (strings.length > 0) {
-                Pattern pattern = Pattern.compile(".*?\\([0-9]{8} ([0-9]{8}).*");
-                Matcher matcher = pattern.matcher(strings[0]);
-                if (matcher.matches()) {
-                    if (Integer.parseInt(matcher.group(1)) == 1) {
-                        mResult[0] = true;
-                    }
-                }
-            }
-        }
-
-        public boolean isCancelled() {
-            return false;
-        }
-    }
-}
diff --git a/hierarchyviewer/src/com/android/hierarchyviewer/device/Window.java b/hierarchyviewer/src/com/android/hierarchyviewer/device/Window.java
deleted file mode 100644
index 5c87d33..0000000
--- a/hierarchyviewer/src/com/android/hierarchyviewer/device/Window.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.hierarchyviewer.device;
-
-public class Window {
-    public static final Window FOCUSED_WINDOW = new Window("<Focused Window>", -1);
-
-    private String title;
-    private int hashCode;
-
-    public Window(String title, int hashCode) {
-        this.title = title;
-        this.hashCode = hashCode;
-    }
-
-    public String getTitle() {
-        return title;
-    }
-
-    public int getHashCode() {
-        return hashCode;
-    }
-
-    public String encode() {
-        return Integer.toHexString(hashCode);
-    }
-
-    @Override
-    public String toString() {
-        return title;
-    }
-}
diff --git a/hierarchyviewer/src/com/android/hierarchyviewer/laf/UnifiedContentBorder.java b/hierarchyviewer/src/com/android/hierarchyviewer/laf/UnifiedContentBorder.java
deleted file mode 100644
index 873b275..0000000
--- a/hierarchyviewer/src/com/android/hierarchyviewer/laf/UnifiedContentBorder.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.hierarchyviewer.laf;
-
-import javax.swing.border.AbstractBorder;
-import java.awt.*;
-
-public class UnifiedContentBorder extends AbstractBorder {
-    private static final Color BORDER_TOP_COLOR1 = new Color(0x575757);
-    private static final Color BORDER_BOTTOM_COLOR1 = new Color(0x404040);
-    private static final Color BORDER_BOTTOM_COLOR2 = new Color(0xd8d8d8);
-
-    @Override
-    public void paintBorder(Component c, Graphics g, int x, int y, int width, int height) {
-        g.setColor(BORDER_TOP_COLOR1);
-        g.drawLine(x, y, x + width, y);
-        g.setColor(BORDER_BOTTOM_COLOR1);
-        g.drawLine(x, y + height - 2, x + width, y + height - 2);
-        g.setColor(BORDER_BOTTOM_COLOR2);
-        g.drawLine(x, y + height - 1, x + width, y + height - 1);
-    }
-
-    @Override
-    public Insets getBorderInsets(Component component) {
-        return new Insets(1, 0, 2, 0);
-    }
-
-    @Override
-    public boolean isBorderOpaque() {
-        return true;
-    }
-}
diff --git a/hierarchyviewer/src/com/android/hierarchyviewer/scene/CaptureLoader.java b/hierarchyviewer/src/com/android/hierarchyviewer/scene/CaptureLoader.java
deleted file mode 100644
index ca51b4e..0000000
--- a/hierarchyviewer/src/com/android/hierarchyviewer/scene/CaptureLoader.java
+++ /dev/null
@@ -1,167 +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.hierarchyviewer.scene;
-
-import com.android.ddmlib.IDevice;
-import com.android.hierarchyviewer.device.Window;
-import com.android.hierarchyviewer.device.DeviceBridge;
-import com.android.hierarchyviewer.ui.util.PsdFile;
-
-import java.awt.Graphics2D;
-import java.awt.Image;
-import java.awt.Point;
-import java.awt.image.BufferedImage;
-import java.io.BufferedInputStream;
-import java.io.BufferedWriter;
-import java.io.ByteArrayInputStream;
-import java.io.DataInputStream;
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.OutputStreamWriter;
-import java.net.InetSocketAddress;
-import java.net.Socket;
-import javax.imageio.ImageIO;
-
-public class CaptureLoader {
-    public static boolean saveLayers(IDevice device, Window window, File file) {
-        Socket socket = null;
-        DataInputStream in = null;
-        BufferedWriter out = null;
-        boolean result = false;
-
-        try {
-            socket = new Socket();
-            socket.connect(new InetSocketAddress("127.0.0.1",
-                    DeviceBridge.getDeviceLocalPort(device)));
-
-            out = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
-            in = new DataInputStream(new BufferedInputStream(socket.getInputStream()));
-
-            out.write("CAPTURE_LAYERS " + window.encode());
-            out.newLine();
-            out.flush();
-
-            int width = in.readInt();
-            int height = in.readInt();
-
-            PsdFile psd = new PsdFile(width, height);
-
-            while (readLayer(in, psd)) {
-            }
-            
-            psd.write(new FileOutputStream(file));
-
-            result = true;
-        } catch (IOException e) {
-            e.printStackTrace();
-        } finally {
-            try {
-                if (out != null) {
-                    out.close();
-                }
-                if (in != null) {
-                    in.close();
-                }
-                if (socket != null) {
-                    socket.close();
-                }
-            } catch (IOException ex) {
-                ex.printStackTrace();
-            }
-        }
-
-        return result;
-    }
-
-    private static boolean readLayer(DataInputStream in, PsdFile psd) {
-        try {
-            if (in.read() == 2) {
-                System.out.println("Found end of layers list");
-                return false;
-            }
-            String name = in.readUTF();
-            System.out.println("name = " + name);
-            boolean visible = in.read() == 1;
-            int x = in.readInt();
-            int y = in.readInt();
-            int dataSize = in.readInt();
-
-            byte[] data = new byte[dataSize];
-            int read = 0;
-            while (read < dataSize) {
-                read += in.read(data, read, dataSize - read);
-            }
-
-            ByteArrayInputStream arrayIn = new ByteArrayInputStream(data);
-            BufferedImage chunk = ImageIO.read(arrayIn);
-
-            // Ensure the image is in the right format
-            BufferedImage image = new BufferedImage(chunk.getWidth(), chunk.getHeight(),
-                    BufferedImage.TYPE_INT_ARGB);
-            Graphics2D g = image.createGraphics();
-            g.drawImage(chunk, null, 0, 0);
-            g.dispose();
-
-            psd.addLayer(name, image, new Point(x, y), visible);
-
-            return true;
-        } catch (Exception e) {
-            e.printStackTrace();
-            return false;
-        }
-    }
-
-    public static Image loadCapture(IDevice device, Window window, String params) {
-        Socket socket = null;
-        BufferedInputStream in = null;
-        BufferedWriter out = null;
-
-        try {
-            socket = new Socket();
-            socket.connect(new InetSocketAddress("127.0.0.1",
-                    DeviceBridge.getDeviceLocalPort(device)));
-
-            out = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
-            in = new BufferedInputStream(socket.getInputStream());
-
-            out.write("CAPTURE " + window.encode() + " " + params);
-            out.newLine();
-            out.flush();
-
-            return ImageIO.read(in);
-        } catch (IOException e) {
-            // Empty
-        } finally {
-            try {
-                if (out != null) {
-                    out.close();
-                }
-                if (in != null) {
-                    in.close();
-                }
-                if (socket != null) {
-                    socket.close();
-                }
-            } catch (IOException ex) {
-                ex.printStackTrace();
-            }
-        }
-
-        return null;
-    }
-}
diff --git a/hierarchyviewer/src/com/android/hierarchyviewer/scene/ProfilesLoader.java b/hierarchyviewer/src/com/android/hierarchyviewer/scene/ProfilesLoader.java
deleted file mode 100644
index 4b9d524..0000000
--- a/hierarchyviewer/src/com/android/hierarchyviewer/scene/ProfilesLoader.java
+++ /dev/null
@@ -1,82 +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.hierarchyviewer.scene;
-
-import com.android.ddmlib.IDevice;
-import com.android.hierarchyviewer.HierarchyViewer;
-import com.android.hierarchyviewer.device.Window;
-import com.android.hierarchyviewer.device.DeviceBridge;
-
-import java.net.Socket;
-import java.net.InetSocketAddress;
-import java.io.BufferedWriter;
-import java.io.OutputStreamWriter;
-import java.io.IOException;
-import java.io.BufferedReader;
-import java.io.InputStreamReader;
-
-public class ProfilesLoader {
-    public static double[] loadProfiles(IDevice device, Window window, String params) {
-        if (!HierarchyViewer.isProfilingEnabled()) {
-            return new double[] { 0.0, 0.0, 0.0 };
-        }
-        
-        Socket socket = null;
-        BufferedReader in = null;
-        BufferedWriter out = null;
-
-        try {
-            socket = new Socket();
-            socket.connect(new InetSocketAddress("127.0.0.1",
-                    DeviceBridge.getDeviceLocalPort(device)));
-
-            out = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
-            in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
-
-            out.write("PROFILE " + window.encode() + " " + params);
-            out.newLine();
-            out.flush();
-
-            String response = in.readLine();
-            String[] data = response.split(" ");
-
-            double[] profiles = new double[data.length];
-            for (int i = 0; i < data.length; i++) {
-                profiles[i] = (Long.parseLong(data[i]) / 1000.0) / 1000.0; // convert to ms
-            }
-            return profiles;
-        } catch (IOException e) {
-            // Empty
-        } finally {
-            try {
-                if (out != null) {
-                    out.close();
-                }
-                if (in != null) {
-                    in.close();
-                }
-                if (socket != null) {
-                    socket.close();
-                }
-            } catch (IOException ex) {
-                ex.printStackTrace();
-            }
-        }
-
-        return null;
-    }
-}
diff --git a/hierarchyviewer/src/com/android/hierarchyviewer/scene/VersionLoader.java b/hierarchyviewer/src/com/android/hierarchyviewer/scene/VersionLoader.java
deleted file mode 100644
index ccc187d..0000000
--- a/hierarchyviewer/src/com/android/hierarchyviewer/scene/VersionLoader.java
+++ /dev/null
@@ -1,79 +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.hierarchyviewer.scene;
-
-import com.android.ddmlib.IDevice;
-import com.android.hierarchyviewer.device.DeviceBridge;
-
-import java.io.BufferedReader;
-import java.io.BufferedWriter;
-import java.io.IOException;
-import java.io.InputStreamReader;
-import java.io.OutputStreamWriter;
-import java.net.InetSocketAddress;
-import java.net.Socket;
-
-public class VersionLoader {
-    public static int loadServerVersion(IDevice device) {
-        return loadVersion(device, "SERVER");
-    }
-    
-    public static int loadProtocolVersion(IDevice device) {
-        return loadVersion(device, "PROTOCOL");
-    }
-
-    private static int loadVersion(IDevice device, String command) {
-        Socket socket = null;
-        BufferedReader in = null;
-        BufferedWriter out = null;
-
-        try {
-            socket = new Socket();
-            socket.connect(new InetSocketAddress("127.0.0.1",
-                    DeviceBridge.getDeviceLocalPort(device)));
-
-            out = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
-            in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
-
-            out.write(command);
-            out.newLine();
-            out.flush();
-
-            return Integer.parseInt(in.readLine());
-        } catch (Exception e) {
-            // Empty
-        } finally {
-            try {
-                if (out != null) {
-                    out.close();
-                }
-                if (in != null) {
-                    in.close();
-                }
-                if (socket != null) {
-                    socket.close();
-                }
-            } catch (IOException ex) {
-                ex.printStackTrace();
-            }
-        }
-
-        // Versioning of the protocol and server was added with version 2
-        return 2;
-    }
-}
diff --git a/hierarchyviewer/src/com/android/hierarchyviewer/scene/ViewHierarchyLoader.java b/hierarchyviewer/src/com/android/hierarchyviewer/scene/ViewHierarchyLoader.java
deleted file mode 100644
index c9cb66d..0000000
--- a/hierarchyviewer/src/com/android/hierarchyviewer/scene/ViewHierarchyLoader.java
+++ /dev/null
@@ -1,190 +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.hierarchyviewer.scene;
-
-import com.android.ddmlib.IDevice;
-import com.android.hierarchyviewer.device.DeviceBridge;
-import com.android.hierarchyviewer.device.Window;
-
-import org.openide.util.Exceptions;
-
-import java.io.BufferedReader;
-import java.io.BufferedWriter;
-import java.io.IOException;
-import java.io.InputStreamReader;
-import java.io.OutputStreamWriter;
-import java.net.InetSocketAddress;
-import java.net.Socket;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.Stack;
-
-public class ViewHierarchyLoader {
-    @SuppressWarnings("empty-statement")
-    public static ViewHierarchyScene loadScene(IDevice device, Window window) {
-        ViewHierarchyScene scene = new ViewHierarchyScene();
-
-        // Read the views tree
-        Socket socket = null;
-        BufferedReader in = null;
-        BufferedWriter out = null;
-
-        String line;
-
-        try {
-            System.out.println("==> Starting client");
-
-            socket = new Socket();
-            socket.connect(new InetSocketAddress("127.0.0.1",
-                    DeviceBridge.getDeviceLocalPort(device)));
-
-            out = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
-            in = new BufferedReader(new InputStreamReader(socket.getInputStream(), "utf-8"));
-
-            System.out.println("==> DUMP");
-
-            out.write("DUMP " + window.encode());
-            out.newLine();
-            out.flush();
-
-            Stack<ViewNode> stack = new Stack<ViewNode>();
-
-            boolean setRoot = true;
-            ViewNode lastNode = null;
-            int lastWhitespaceCount = Integer.MAX_VALUE;
-
-            while ((line = in.readLine()) != null) {
-                if ("DONE.".equalsIgnoreCase(line)) {
-                    break;
-                }
-
-                int whitespaceCount = countFrontWhitespace(line);
-                if (lastWhitespaceCount < whitespaceCount) {
-                    stack.push(lastNode);
-                } else if (!stack.isEmpty()) {
-                    final int count = lastWhitespaceCount - whitespaceCount;
-                    for (int i = 0; i < count; i++) {
-                        stack.pop();
-                    }
-                }
-
-                lastWhitespaceCount = whitespaceCount;
-                line = line.trim();
-                int index = line.indexOf(' ');
-
-                lastNode = new ViewNode();
-                lastNode.name = line.substring(0, index);
-
-                line = line.substring(index + 1);
-                loadProperties(lastNode, line);
-
-                scene.addNode(lastNode);
-
-                if (setRoot) {
-                    scene.setRoot(lastNode);
-                    setRoot = false;
-                }
-
-                if (!stack.isEmpty()) {
-                    final ViewNode parent = stack.peek();
-                    final String edge = parent.name + lastNode.name;
-                    scene.addEdge(edge);
-                    scene.setEdgeSource(edge, parent);
-                    scene.setEdgeTarget(edge, lastNode);
-                    lastNode.parent = parent;
-                    parent.children.add(lastNode);
-                }
-            }
-
-            updateIndices(scene.getRoot());
-
-        } catch (IOException ex) {
-            Exceptions.printStackTrace(ex);
-        } finally {
-            try {
-                if (out != null) {
-                    out.close();
-                }
-                if (in != null) {
-                    in.close();
-                }
-                socket.close();
-            } catch (IOException ex) {
-                Exceptions.printStackTrace(ex);
-            }
-        }
-
-        System.out.println("==> DONE");
-
-        return scene;
-    }
-
-    private static void updateIndices(ViewNode root) {
-        if (root == null) return;
-
-        root.computeIndex();
-
-        for (ViewNode node : root.children) {
-            updateIndices(node);
-        }
-    }
-
-    private static int countFrontWhitespace(String line) {
-        int count = 0;
-        while (line.charAt(count) == ' ') {
-            count++;
-        }
-        return count;
-    }
-
-    private static void loadProperties(ViewNode node, String data) {
-        int start = 0;
-        boolean stop;
-
-        do {
-            int index = data.indexOf('=', start);
-            ViewNode.Property property = new ViewNode.Property();
-            property.name = data.substring(start, index);
-
-            int colonIndex = property.name.indexOf(':');
-            if (colonIndex != -1) {
-                property.name = property.name.substring(colonIndex + 1);
-            }
-
-            int index2 = data.indexOf(',', index + 1);
-            int length = Integer.parseInt(data.substring(index + 1, index2));
-            start = index2 + 1 + length;
-            property.value = data.substring(index2 + 1, index2 + 1 + length);
-
-            node.properties.add(property);
-            node.namedProperties.put(property.name, property);
-
-            stop = start >= data.length();
-            if (!stop) {
-                start += 1;
-            }
-        } while (!stop);
-
-        Collections.sort(node.properties, new Comparator<ViewNode.Property>() {
-            public int compare(ViewNode.Property source, ViewNode.Property destination) {
-                return source.name.compareTo(destination.name);
-            }
-        });
-
-        node.decode();
-    }
-}
diff --git a/hierarchyviewer/src/com/android/hierarchyviewer/scene/ViewHierarchyScene.java b/hierarchyviewer/src/com/android/hierarchyviewer/scene/ViewHierarchyScene.java
deleted file mode 100644
index 08dc395..0000000
--- a/hierarchyviewer/src/com/android/hierarchyviewer/scene/ViewHierarchyScene.java
+++ /dev/null
@@ -1,262 +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.hierarchyviewer.scene;
-
-import java.awt.Color;
-import java.awt.Font;
-import java.awt.GradientPaint;
-import java.awt.Graphics2D;
-import java.awt.Rectangle;
-import java.awt.geom.Point2D;
-
-import org.netbeans.api.visual.action.ActionFactory;
-import org.netbeans.api.visual.action.WidgetAction;
-import org.netbeans.api.visual.anchor.AnchorFactory;
-import org.netbeans.api.visual.border.BorderFactory;
-import org.netbeans.api.visual.graph.GraphScene;
-import org.netbeans.api.visual.layout.LayoutFactory;
-import org.netbeans.api.visual.model.ObjectState;
-import org.netbeans.api.visual.widget.ConnectionWidget;
-import org.netbeans.api.visual.widget.LabelWidget;
-import org.netbeans.api.visual.widget.LayerWidget;
-import org.netbeans.api.visual.widget.Widget;
-
-public class ViewHierarchyScene extends GraphScene<ViewNode, String> {
-    private ViewNode root;
-    private LayerWidget widgetLayer;
-    private LayerWidget connectionLayer;
-
-    private WidgetAction moveAction = ActionFactory.createMoveAction();
-
-    public ViewHierarchyScene() {
-        widgetLayer = new LayerWidget(this);
-        connectionLayer = new LayerWidget(this);
-
-        addChild(widgetLayer);
-        addChild(connectionLayer);
-    }
-    
-    public ViewNode getRoot() {
-        return root;
-    }
-    
-    void setRoot(ViewNode root) {
-        this.root = root;
-    }
-
-    @Override
-    protected Widget attachNodeWidget(ViewNode node) {
-        Widget widget = createBox(node, node.name, node.id);
-        widget.getActions().addAction(createSelectAction());
-        widget.getActions().addAction(moveAction);
-        widgetLayer.addChild(widget);
-        return widget;
-    }
-
-    private Widget createBox(ViewNode node, String nodeName, String id) {
-        final String shortName = getShortName(nodeName);
-        node.setShortName(shortName);
-
-        GradientWidget box = new GradientWidget(this, node);
-        box.setLayout(LayoutFactory.createVerticalFlowLayout());
-        box.setBorder(BorderFactory.createLineBorder(2, Color.BLACK));
-        box.setOpaque(true);
-
-        LabelWidget label = new LabelWidget(this);
-        label.setFont(getDefaultFont().deriveFont(Font.PLAIN, 12.0f));
-        label.setLabel(shortName);
-        label.setBorder(BorderFactory.createEmptyBorder(6, 6, 0, 6));
-        label.setAlignment(LabelWidget.Alignment.CENTER);
-
-        box.addChild(label);
-        
-        label = new LabelWidget(this);
-        label.setFont(getDefaultFont().deriveFont(Font.PLAIN, 10.0f));
-        label.setLabel(getAddress(nodeName));
-        label.setBorder(BorderFactory.createEmptyBorder(3, 6, 0, 6));
-        label.setAlignment(LabelWidget.Alignment.CENTER);
-
-        box.addressWidget = label;
-        
-        box.addChild(label);
-        
-        label = new LabelWidget(this);
-        label.setFont(getDefaultFont().deriveFont(Font.PLAIN, 10.0f));
-        label.setLabel(id);
-        label.setBorder(BorderFactory.createEmptyBorder(3, 6, 6, 6));
-        label.setAlignment(LabelWidget.Alignment.CENTER);
-        
-        box.addChild(label);
-
-        return box;
-    }
-    
-    private static String getAddress(String name) {
-        String[] nameAndHashcode = name.split("@");
-        return "@" + nameAndHashcode[1];
-    }
-    
-    private static String getShortName(String name) {
-        String[] nameAndHashcode = name.split("@");
-        String[] packages = nameAndHashcode[0].split("\\.");
-        return packages[packages.length - 1];
-    }
-
-    @Override
-    protected Widget attachEdgeWidget(String edge) {
-        ConnectionWidget connectionWidget = new ConnectionWidget(this);
-        connectionLayer.addChild(connectionWidget);
-        return connectionWidget;
-    }
-
-    @Override
-    protected void attachEdgeSourceAnchor(String edge, ViewNode oldSourceNode, ViewNode sourceNode) {
-        final ConnectionWidget connection = (ConnectionWidget) findWidget(edge);
-        final Widget source = findWidget(sourceNode);
-        connection.bringToBack();
-        source.bringToFront();
-        connection.setSourceAnchor(AnchorFactory.createRectangularAnchor(source));
-    }
-
-    @Override
-    protected void attachEdgeTargetAnchor(String edge, ViewNode oldTargetNode, ViewNode targetNode) {
-        final ConnectionWidget connection = (ConnectionWidget) findWidget(edge);
-        final Widget target = findWidget(targetNode);
-        connection.bringToBack();
-        target.bringToFront();
-        connection.setTargetAnchor(AnchorFactory.createRectangularAnchor(target));
-    }
-    
-    private static class GradientWidget extends Widget implements ViewNode.StateListener {
-        public static final GradientPaint BLUE_EXPERIENCE = new GradientPaint(
-                new Point2D.Double(0, 0),
-                new Color(168, 204, 241),
-                new Point2D.Double(0, 1),
-                new Color(44, 61, 146));
-        public static final GradientPaint MAC_OSX_SELECTED = new GradientPaint(
-                new Point2D.Double(0, 0),
-                new Color(81, 141, 236),
-                new Point2D.Double(0, 1),
-                new Color(36, 96, 192));
-        public static final GradientPaint MAC_OSX = new GradientPaint(
-                new Point2D.Double(0, 0),
-                new Color(167, 210, 250),
-                new Point2D.Double(0, 1),
-                new Color(99, 147, 206));
-        public static final GradientPaint AERITH = new GradientPaint(
-                new Point2D.Double(0, 0),
-                Color.WHITE,
-                new Point2D.Double(0, 1),
-                new Color(64, 110, 161));
-        public static final GradientPaint GRAY = new GradientPaint(
-                new Point2D.Double(0, 0),
-                new Color(226, 226, 226),
-                new Point2D.Double(0, 1),
-                new Color(250, 248, 248));
-        public static final GradientPaint RED_XP = new GradientPaint(
-                new Point2D.Double(0, 0),
-                new Color(236, 81, 81),
-                new Point2D.Double(0, 1),
-                new Color(192, 36, 36));
-        public static final GradientPaint NIGHT_GRAY = new GradientPaint(
-                new Point2D.Double(0, 0),
-                new Color(102, 111, 127),
-                new Point2D.Double(0, 1),
-                new Color(38, 45, 61));
-        public static final GradientPaint NIGHT_GRAY_LIGHT = new GradientPaint(
-                new Point2D.Double(0, 0),
-                new Color(129, 138, 155),
-                new Point2D.Double(0, 1),
-                new Color(58, 66, 82));
-        public static final GradientPaint NIGHT_GRAY_VERY_LIGHT = new GradientPaint(
-                new Point2D.Double(0, 0),
-                new Color(129, 138, 155, 60),
-                new Point2D.Double(0, 1),
-                new Color(58, 66, 82, 60));
-
-        private static Color UNSELECTED = Color.BLACK;
-        private static Color SELECTED = Color.WHITE;
-
-        private final ViewNode node;
-
-        private LabelWidget addressWidget;
-
-        private boolean isSelected = false;
-        private final GradientPaint selectedGradient = MAC_OSX_SELECTED;
-        private final GradientPaint filteredGradient = RED_XP;
-        private final GradientPaint focusGradient = NIGHT_GRAY_VERY_LIGHT;
-
-        public GradientWidget(ViewHierarchyScene scene, ViewNode node) {
-            super(scene);
-            this.node = node;
-            node.setStateListener(this);
-        }
-
-        @Override
-        protected void notifyStateChanged(ObjectState previous, ObjectState state) {
-            super.notifyStateChanged(previous, state);
-            isSelected = state.isSelected() || state.isFocused() || state.isWidgetFocused();
-
-            pickChildrenColor();
-        }
-
-        private void pickChildrenColor() {
-            for (Widget child : getChildren()) {
-                child.setForeground(isSelected || node.filtered ? SELECTED : UNSELECTED);
-            }
-
-            repaint();
-        }
-
-        @Override
-        protected void paintBackground() {
-            super.paintBackground();
-
-            Graphics2D g2 = getGraphics();
-            Rectangle bounds = getBounds();
-
-            if (!isSelected) {
-                if (!node.filtered) {
-                    if (!node.hasFocus) {
-                        g2.setColor(Color.WHITE);
-                    } else {
-                        g2.setPaint(new GradientPaint(bounds.x, bounds.y,
-                                focusGradient.getColor1(), bounds.x, bounds.x + bounds.height,
-                                focusGradient.getColor2()));
-                    }
-                } else {
-                    g2.setPaint(new GradientPaint(bounds.x, bounds.y, filteredGradient.getColor1(),
-                        bounds.x, bounds.x + bounds.height, filteredGradient.getColor2()));
-                }
-            } else {
-                g2.setPaint(new GradientPaint(bounds.x, bounds.y, selectedGradient.getColor1(),
-                        bounds.x, bounds.x + bounds.height, selectedGradient.getColor2()));
-            }
-            g2.fillRect(bounds.x, bounds.y, bounds.width, bounds.height);
-        }
-
-        public void nodeStateChanged(ViewNode node) {
-            pickChildrenColor();
-        }
-
-        public void nodeIndexChanged(ViewNode node) {
-            if (addressWidget != null) {
-                addressWidget.setLabel("#" + node.index + addressWidget.getLabel());
-            }
-        }
-    }
-}
diff --git a/hierarchyviewer/src/com/android/hierarchyviewer/scene/ViewManager.java b/hierarchyviewer/src/com/android/hierarchyviewer/scene/ViewManager.java
deleted file mode 100644
index ba346df..0000000
--- a/hierarchyviewer/src/com/android/hierarchyviewer/scene/ViewManager.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.hierarchyviewer.scene;
-
-import com.android.ddmlib.IDevice;
-import com.android.hierarchyviewer.device.Window;
-import com.android.hierarchyviewer.device.DeviceBridge;
-
-import java.io.BufferedWriter;
-import java.io.IOException;
-import java.io.OutputStreamWriter;
-import java.net.InetSocketAddress;
-import java.net.Socket;
-
-public class ViewManager {
-    public static void invalidate(IDevice device, Window window, String params) {
-        sendCommand("INVALIDATE", device, window, params);
-    }
-
-    public static void requestLayout(IDevice device, Window window, String params) {
-        sendCommand("REQUEST_LAYOUT", device, window, params);
-    }
-
-    public static void outputDisplayList(IDevice device, Window window, String params) {
-        sendCommand("OUTPUT_DISPLAYLIST", device, window, params);
-    }
-
-    private static void sendCommand(String command, IDevice device, Window window, String params) {
-        Socket socket = null;
-        BufferedWriter out = null;
-
-        try {
-            socket = new Socket();
-            socket.connect(new InetSocketAddress("127.0.0.1",
-                    DeviceBridge.getDeviceLocalPort(device)));
-
-            out = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
-
-            out.write(command + " " + window.encode() + " " + params);
-            out.newLine();
-            out.flush();
-        } catch (IOException e) {
-            // Empty
-        } finally {
-            try {
-                if (out != null) {
-                    out.close();
-                }
-                if (socket != null) {
-                    socket.close();
-                }
-            } catch (IOException ex) {
-                ex.printStackTrace();
-            }
-        }
-    }
-}
diff --git a/hierarchyviewer/src/com/android/hierarchyviewer/scene/ViewNode.java b/hierarchyviewer/src/com/android/hierarchyviewer/scene/ViewNode.java
deleted file mode 100644
index 64c0703..0000000
--- a/hierarchyviewer/src/com/android/hierarchyviewer/scene/ViewNode.java
+++ /dev/null
@@ -1,203 +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.hierarchyviewer.scene;
-
-import java.awt.Image;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.regex.Pattern;
-
-public class ViewNode {
-    public String id;
-    public String name;
-
-    public List<Property> properties = new ArrayList<Property>();
-    public Map<String, Property> namedProperties = new HashMap<String, Property>();
-
-    public ViewNode parent;
-    public List<ViewNode> children = new ArrayList<ViewNode>();
-
-    public Image image;
-    
-    public int left;
-    public int top;
-    public int width;
-    public int height;
-    public int scrollX;
-    public int scrollY;
-    public int paddingLeft;
-    public int paddingRight;
-    public int paddingTop;
-    public int paddingBottom;
-    public int marginLeft;
-    public int marginRight;
-    public int marginTop;
-    public int marginBottom;
-    public int baseline;
-    public boolean willNotDraw;
-    public boolean hasMargins;
-    
-    boolean hasFocus;
-    int index;
-
-    public boolean decoded;
-    public boolean filtered;
-
-    private String shortName;
-    private StateListener listener;
-
-    void decode() {
-        id = namedProperties.get("mID").value;
-
-        left = getInt("mLeft", 0);
-        top = getInt("mTop", 0);
-        width = getInt("getWidth()", 0);
-        height = getInt("getHeight()", 0);
-        scrollX = getInt("mScrollX", 0);
-        scrollY = getInt("mScrollY", 0);
-        paddingLeft = getInt("mPaddingLeft", 0);
-        paddingRight = getInt("mPaddingRight", 0);
-        paddingTop = getInt("mPaddingTop", 0);
-        paddingBottom = getInt("mPaddingBottom", 0);
-        marginLeft = getInt("layout_leftMargin", Integer.MIN_VALUE);
-        marginRight = getInt("layout_rightMargin", Integer.MIN_VALUE);
-        marginTop = getInt("layout_topMargin", Integer.MIN_VALUE);
-        marginBottom = getInt("layout_bottomMargin", Integer.MIN_VALUE);
-        baseline = getInt("getBaseline()", 0);
-        willNotDraw = getBoolean("willNotDraw()", false);
-        hasFocus = getBoolean("hasFocus()", false);
-
-        hasMargins = marginLeft != Integer.MIN_VALUE &&
-                marginRight != Integer.MIN_VALUE &&
-                marginTop != Integer.MIN_VALUE &&
-                marginBottom != Integer.MIN_VALUE;
-
-        decoded = true;
-    }
-
-    private boolean getBoolean(String name, boolean defaultValue) {
-        Property p = namedProperties.get(name);
-        if (p != null) {
-            try {
-                return Boolean.parseBoolean(p.value);
-            } catch (NumberFormatException e) {
-                return defaultValue;
-            }   
-        }
-        return defaultValue;
-    }
-
-    private int getInt(String name, int defaultValue) {
-        Property p = namedProperties.get(name);
-        if (p != null) {
-            try {
-                return Integer.parseInt(p.value);
-            } catch (NumberFormatException e) {
-                return defaultValue;
-            }
-        }
-        return defaultValue;
-    }
-
-    public void filter(Pattern pattern) {
-        if (pattern == null || pattern.pattern().length() == 0) {
-            filtered = false;
-        } else {
-            filtered = pattern.matcher(shortName).find() || pattern.matcher(id).find();
-        }
-        listener.nodeStateChanged(this);
-    }
-
-    void computeIndex() {
-        index = parent == null ? 0 : parent.children.indexOf(this);
-        listener.nodeIndexChanged(this);
-    }
-
-    void setShortName(String shortName) {
-        this.shortName = shortName;
-    }
-
-    void setStateListener(StateListener listener) {
-        this.listener = listener;
-    }
-
-    @SuppressWarnings({"StringEquality"})
-    @Override
-    public boolean equals(Object obj) {
-        if (obj == null) {
-            return false;
-        }
-        if (getClass() != obj.getClass()) {
-            return false;
-        }
-        final ViewNode other = (ViewNode) obj;
-        return !(this.name != other.name && (this.name == null || !this.name.equals(other.name)));
-    }
-
-    @Override
-    public String toString() {
-        return name;
-    }
-
-    @Override
-    public int hashCode() {
-        int hash = 5;
-        hash = 67 * hash + (this.name != null ? this.name.hashCode() : 0);
-        return hash;
-    }
-
-    public static class Property {
-        public String name;
-        public String value;
-
-        @Override
-        public String toString() {
-            return name + '=' + value;
-        }
-        
-        @SuppressWarnings({"StringEquality"})
-        @Override
-        public boolean equals(Object obj) {
-            if (obj == null) {
-                return false;
-            }
-            if (getClass() != obj.getClass()) {
-                return false;
-            }
-            final Property other = (Property) obj;
-            if (this.name != other.name && (this.name == null || !this.name.equals(other.name))) {
-                return false;
-            }
-            return !(this.value != other.value && (this.value == null || !this.value.equals(other.value)));
-        }
-
-        @Override
-        public int hashCode() {
-            int hash = 5;
-            hash = 61 * hash + (this.name != null ? this.name.hashCode() : 0);
-            hash = 61 * hash + (this.value != null ? this.value.hashCode() : 0);
-            return hash;
-        }
-    }
-
-    interface StateListener {
-        void nodeStateChanged(ViewNode node);
-        void nodeIndexChanged(ViewNode node);
-    }
-}
diff --git a/hierarchyviewer/src/com/android/hierarchyviewer/scene/WindowsLoader.java b/hierarchyviewer/src/com/android/hierarchyviewer/scene/WindowsLoader.java
deleted file mode 100644
index 75f179f..0000000
--- a/hierarchyviewer/src/com/android/hierarchyviewer/scene/WindowsLoader.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.hierarchyviewer.scene;
-
-import com.android.ddmlib.IDevice;
-import com.android.hierarchyviewer.device.DeviceBridge;
-import com.android.hierarchyviewer.device.Window;
-
-import java.io.BufferedReader;
-import java.io.BufferedWriter;
-import java.io.IOException;
-import java.io.InputStreamReader;
-import java.io.OutputStreamWriter;
-import java.net.InetSocketAddress;
-import java.net.Socket;
-import java.util.ArrayList;
-
-public class WindowsLoader {
-    public static Window[] loadWindows(IDevice device, int protocol, int server) {
-        Socket socket = null;
-        BufferedReader in = null;
-        BufferedWriter out = null;
-        System.out.println("protocol = " + protocol);
-        System.out.println("version = " + server);
-        try {
-            ArrayList<Window> windows = new ArrayList<Window>();
-
-            socket = new Socket();
-            socket.connect(new InetSocketAddress("127.0.0.1",
-                    DeviceBridge.getDeviceLocalPort(device)));
-
-            out = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
-            in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
-
-            out.write("LIST");
-            out.newLine();
-            out.flush();
-
-            String line;
-            while ((line = in.readLine()) != null) {
-                if ("DONE.".equalsIgnoreCase(line)) {
-                    break;
-                }
-
-                int index = line.indexOf(' ');
-                if (index != -1) {
-                    String windowId = line.substring(0, index);
-
-                    int id;
-                    if (server > 2) {
-                        id = (int) Long.parseLong(windowId, 16);
-                    } else {
-                        id = Integer.parseInt(windowId, 16);
-                    }
-
-                    Window w = new Window(line.substring(index + 1), id);
-                    windows.add(w);
-                }
-            }
-
-            return windows.toArray(new Window[windows.size()]);
-        } catch (IOException e) {
-            // Empty
-        } finally {
-            try {
-                if (out != null) {
-                    out.close();
-                }
-                if (in != null) {
-                    in.close();
-                }
-                if (socket != null) {
-                    socket.close();
-                }
-            } catch (IOException ex) {
-                ex.printStackTrace();
-            }
-        }
-
-        return new Window[0];
-    }
-}
diff --git a/hierarchyviewer/src/com/android/hierarchyviewer/ui/CaptureRenderer.java b/hierarchyviewer/src/com/android/hierarchyviewer/ui/CaptureRenderer.java
deleted file mode 100644
index 7ccc818..0000000
--- a/hierarchyviewer/src/com/android/hierarchyviewer/ui/CaptureRenderer.java
+++ /dev/null
@@ -1,86 +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.hierarchyviewer.ui;
-
-import com.android.hierarchyviewer.scene.ViewNode;
-
-import javax.swing.*;
-import java.awt.*;
-
-class CaptureRenderer extends JLabel {
-    private ViewNode node;
-    private boolean showExtras;
-
-    CaptureRenderer(ImageIcon icon, ViewNode node) {
-        super(icon);
-        this.node = node;
-        setBackground(Color.BLACK);
-    }
-
-    @Override
-    public Dimension getPreferredSize() {
-        Dimension d = super.getPreferredSize();
-
-        if (node.hasMargins) {
-            d.width += node.marginLeft + node.marginRight;
-            d.height += node.marginTop + node.marginBottom;
-        }
-
-        return d;
-    }
-
-    public void setShowExtras(boolean showExtras) {
-        this.showExtras = showExtras;
-        repaint();
-    }
-
-    @Override
-    protected void paintComponent(Graphics g) {
-        Icon icon = getIcon();
-        int width = icon.getIconWidth();
-        int height = icon.getIconHeight();
-
-        int x = (getWidth() - width) / 2;
-        int y = (getHeight() - height) / 2;
-
-        icon.paintIcon(this, g, x, y);
-
-        if (showExtras) {
-            g.translate(x, y);
-            g.setXORMode(Color.WHITE);
-            if ((node.paddingBottom | node.paddingLeft |
-                    node.paddingTop | node.paddingRight) != 0) {
-                g.setColor(Color.RED);
-                g.drawRect(node.paddingLeft, node.paddingTop,
-                        width - node.paddingRight - node.paddingLeft,
-                        height - node.paddingBottom - node.paddingTop);
-            }
-            if (node.baseline != -1) {
-                g.setColor(Color.BLUE);
-                g.drawLine(0, node.baseline, width, node.baseline);
-            }
-            if (node.hasMargins && (node.marginLeft | node.marginBottom |
-                    node.marginRight | node.marginRight) != 0) {
-                g.setColor(Color.BLACK);
-                g.drawRect(-node.marginLeft, -node.marginTop,
-                        node.marginLeft + width + node.marginRight,
-                        node.marginTop + height + node.marginBottom);
-            }
-            g.translate(-x, -y);
-        }
-    }
-}
diff --git a/hierarchyviewer/src/com/android/hierarchyviewer/ui/LayoutRenderer.java b/hierarchyviewer/src/com/android/hierarchyviewer/ui/LayoutRenderer.java
deleted file mode 100644
index 8943834..0000000
--- a/hierarchyviewer/src/com/android/hierarchyviewer/ui/LayoutRenderer.java
+++ /dev/null
@@ -1,177 +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.hierarchyviewer.ui;
-
-import com.android.hierarchyviewer.scene.ViewHierarchyScene;
-import com.android.hierarchyviewer.scene.ViewNode;
-
-import javax.swing.JComponent;
-import javax.swing.BorderFactory;
-import java.awt.Color;
-import java.awt.Dimension;
-import java.awt.Graphics;
-import java.awt.Insets;
-import java.awt.event.MouseAdapter;
-import java.awt.event.MouseEvent;
-import java.util.Set;
-
-class LayoutRenderer extends JComponent {
-    private static final int EMULATED_SCREEN_WIDTH = 320;
-    private static final int EMULATED_SCREEN_HEIGHT = 480;
-    private static final int SCREEN_MARGIN = 24;
-
-    private boolean showExtras;
-    private ViewHierarchyScene scene;
-    private JComponent sceneView;
-
-    LayoutRenderer(ViewHierarchyScene scene, JComponent sceneView) {
-        this.scene = scene;
-        this.sceneView = sceneView;
-
-        setOpaque(true);
-        setBorder(BorderFactory.createEmptyBorder(0, 0, 12, 0));
-        setBackground(Color.BLACK);
-        setForeground(Color.WHITE);
-
-        addMouseListener(new MouseAdapter() {
-            @Override
-            public void mousePressed(MouseEvent event) {
-                selectChild(event.getX(), event.getY());
-            }
-        });
-    }
-
-    @Override
-    public Dimension getPreferredSize() {
-        return new Dimension(EMULATED_SCREEN_WIDTH + SCREEN_MARGIN,
-                EMULATED_SCREEN_HEIGHT + SCREEN_MARGIN);
-    }
-
-    @Override
-    protected void paintComponent(Graphics g) {
-        g.setColor(getBackground());
-        g.fillRect(0, 0, getWidth(), getHeight());
-
-        Insets insets = getInsets();
-        g.clipRect(insets.left, insets.top,
-                getWidth() - insets.left - insets.right,
-                getHeight() - insets.top - insets.bottom);
-
-        if (scene == null) {
-            return;
-        }
-
-        ViewNode root = scene.getRoot();
-        if (root == null) {
-            return;
-        }
-
-        int x = (getWidth() - insets.left - insets.right - root.width) / 2;
-        int y = (getHeight() - insets.top - insets.bottom - root.height) / 2;
-        g.translate(insets.left + x, insets.top + y);
-
-        g.setColor(getForeground());
-        g.drawRect(root.left, root.top, root.width - 1, root.height - 1);
-        g.clipRect(root.left - 1, root.top - 1, root.width + 1, root.height + 1);
-        drawChildren(g, root, -root.scrollX, -root.scrollY);
-
-        Set<?> selection = scene.getSelectedObjects();
-        if (selection.size() > 0) {
-            ViewNode node = (ViewNode) selection.iterator().next();
-            g.setColor(Color.RED);
-            Graphics s = g.create();
-            ViewNode p = node.parent;
-            while (p != null) {
-                s.translate(p.left - p.scrollX, p.top - p.scrollY);
-                p = p.parent;
-            }
-            if (showExtras && node.image != null) {
-                s.drawImage(node.image, node.left, node.top, null);
-            }
-            s.drawRect(node.left, node.top, node.width - 1, node.height - 1);
-            s.dispose();
-        }
-
-        g.translate(-insets.left - x, -insets.top - y);
-    }
-
-    private void drawChildren(Graphics g, ViewNode root, int x, int y) {
-        g.translate(x, y);
-        for (ViewNode node : root.children) {
-            if (!node.willNotDraw) {
-                g.drawRect(node.left, node.top, node.width - 1, node.height - 1);
-            }
-
-            if (node.children.size() > 0) {
-                drawChildren(g, node,
-                        node.left - node.parent.scrollX,
-                        node.top - node.parent.scrollY);
-            }
-        }
-        g.translate(-x, -y);
-    }
-
-    public void setShowExtras(boolean showExtras) {
-        this.showExtras = showExtras;
-        repaint();
-    }
-
-    private void selectChild(int x, int y) {
-
-        if (scene == null) {
-            return;
-        }
-
-        ViewNode root = scene.getRoot();
-        if (root == null) {
-            return;
-        }
-
-        Insets insets = getInsets();
-
-        int xoffset = (getWidth() - insets.left - insets.right - root.width) / 2 + insets.left + 1;
-        int yoffset = (getHeight() - insets.top - insets.bottom - root.height) / 2 + insets.top + 1;
-
-        x -= xoffset;
-        y -= yoffset;
-        if (x >= 0 && x < EMULATED_SCREEN_WIDTH && y >= 0 && y < EMULATED_SCREEN_HEIGHT) {
-            ViewNode hit = findChild(root, root, x, y);
-            scene.setFocusedObject(hit);
-            sceneView.repaint();
-        }
-    }
-
-    private ViewNode findChild(ViewNode root, ViewNode besthit, int x, int y) {
-        ViewNode hit = besthit;
-        for (ViewNode node : root.children) {
-
-            if (node.left <= x && x < node.left + node.width &&
-                node.top <= y && y < node.top + node.height) {
-                if (node.width <= hit.width && node.height <= hit.height) {
-                    hit = node;
-                }
-            }
-
-            if (node.children.size() > 0) {
-                hit = findChild(node, hit,
-                        x - (node.left - node.parent.scrollX),
-                        y - (node.top - node.parent.scrollY));
-            }
-        }
-        return hit;
-    }
-}
diff --git a/hierarchyviewer/src/com/android/hierarchyviewer/ui/ScreenViewer.java b/hierarchyviewer/src/com/android/hierarchyviewer/ui/ScreenViewer.java
deleted file mode 100644
index bae1270..0000000
--- a/hierarchyviewer/src/com/android/hierarchyviewer/ui/ScreenViewer.java
+++ /dev/null
@@ -1,831 +0,0 @@
-package com.android.hierarchyviewer.ui;
-
-import com.android.ddmlib.IDevice;
-import com.android.ddmlib.RawImage;
-import com.android.hierarchyviewer.scene.ViewNode;
-import com.android.hierarchyviewer.ui.util.IconLoader;
-import com.android.hierarchyviewer.ui.util.PngFileFilter;
-import com.android.hierarchyviewer.util.WorkerThread;
-
-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.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;
-
-    private GetScreenshotTask task;
-    private BufferedImage image;
-    private int[] scanline;
-    private volatile boolean isLoading;
-
-    private BufferedImage overlay;
-    private AlphaComposite overlayAlpha = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.3f);
-
-    private ScreenViewer.LoupeStatus status;
-    private ScreenViewer.LoupeViewer loupe;
-    private ScreenViewer.Crosshair crosshair;
-
-    private int zoom = 8;
-    private int y = 0;
-
-    private Timer timer;
-    private ViewNode node;
-
-    private JSlider zoomSlider;
-
-    ScreenViewer(Workspace workspace, IDevice device, int spacing) {
-        setLayout(new GridBagLayout());
-        setOpaque(false);
-
-        this.workspace = workspace;
-        this.device = device;
-
-        timer = new Timer(5000, this);
-        timer.setInitialDelay(0);
-        timer.setRepeats(true);
-
-        JPanel panel = buildViewerAndControls();
-        add(panel, new GridBagConstraints(0, 0, 1, 1, 0.3f, 1.0f,
-                GridBagConstraints.FIRST_LINE_START, GridBagConstraints.BOTH,
-                new Insets(0, 0, 0, 0), 0, 0));
-
-        JPanel loupePanel = buildLoupePanel(spacing);
-        add(loupePanel, new GridBagConstraints(1, 0, 1, 1, 0.7f, 1.0f,
-                GridBagConstraints.FIRST_LINE_START, GridBagConstraints.BOTH,
-                new Insets(0, 0, 0, 0), 0, 0));
-
-        SwingUtilities.invokeLater(new Runnable() {
-            public void run() {
-                timer.start();
-            }
-        });
-    }
-
-    private JPanel buildLoupePanel(int spacing) {
-        loupe = new LoupeViewer();
-        loupe.addMouseWheelListener(new WheelZoomListener());
-        CrosshairPanel crosshairPanel = new CrosshairPanel(loupe);
-
-        JPanel loupePanel = new JPanel(new BorderLayout());
-        loupePanel.add(crosshairPanel);
-        status = new LoupeStatus();
-        loupePanel.add(status, BorderLayout.SOUTH);
-
-        loupePanel.setBorder(BorderFactory.createEmptyBorder(0, spacing, 0, 0));
-        return loupePanel;
-    }
-
-    private class WheelZoomListener implements MouseWheelListener {
-        public void mouseWheelMoved(MouseWheelEvent e) {
-            if (zoomSlider != null) {
-                int val = zoomSlider.getValue();
-                val -= e.getWheelRotation() * 2;
-                zoomSlider.setValue(val);
-            }
-        }
-    }
-
-    private JPanel buildViewerAndControls() {
-        JPanel panel = new JPanel(new GridBagLayout());
-        crosshair = new Crosshair(new ScreenshotViewer());
-        crosshair.addMouseWheelListener(new WheelZoomListener());
-        JScrollPane scroller = new JScrollPane(crosshair);
-        scroller.setPreferredSize(new Dimension(320, 480));
-        scroller.setBorder(null);
-        panel.add(scroller,
-                new GridBagConstraints(0, y++, 2, 1, 1.0f, 1.0f,
-                    GridBagConstraints.FIRST_LINE_START, GridBagConstraints.BOTH,
-                    new Insets(0, 0, 0, 0), 0, 0));
-        buildSlider(panel, "Overlay:", "0%", "100%", 0, 100, 30, 1).addChangeListener(
-                new ChangeListener() {
-                    public void stateChanged(ChangeEvent event) {
-                        float opacity = ((JSlider) event.getSource()).getValue() / 100.0f;
-                        overlayAlpha = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, opacity);
-                        repaint();
-                    }
-        });
-        buildOverlayExtraControls(panel);
-        buildSlider(panel, "Refresh Rate:", "1s", "40s", 1, 40, 5, 1).addChangeListener(
-                new ChangeListener() {
-                    public void stateChanged(ChangeEvent event) {
-                        int rate = ((JSlider) event.getSource()).getValue() * 1000;
-                        timer.setDelay(rate);
-                        timer.setInitialDelay(0);
-                        timer.restart();
-                    }
-        });
-        zoomSlider = buildSlider(panel, "Zoom:", "2x", "24x", 2, 24, 8, 2);
-        zoomSlider.addChangeListener(
-                new ChangeListener() {
-                    public void stateChanged(ChangeEvent event) {
-                        zoom = ((JSlider) event.getSource()).getValue();
-                        loupe.clearGrid = true;
-                        loupe.moveToPoint(crosshair.crosshair.x, crosshair.crosshair.y);
-                        repaint();
-                    }
-        });
-        panel.add(Box.createVerticalGlue(),
-                new GridBagConstraints(0, y++, 2, 1, 1.0f, 1.0f,
-                    GridBagConstraints.FIRST_LINE_START, GridBagConstraints.NONE,
-                    new Insets(0, 0, 0, 0), 0, 0));
-        return panel;
-    }
-
-    private void buildOverlayExtraControls(JPanel panel) {
-        JPanel extras = new JPanel(new FlowLayout(FlowLayout.LEFT, 0, 0));
-
-        JButton loadOverlay = new JButton("Load...");
-        loadOverlay.addActionListener(new ActionListener() {
-            public void actionPerformed(ActionEvent event) {
-                SwingWorker<?, ?> worker = openOverlay();
-                if (worker != null) {
-                    worker.execute();
-                }
-            }
-        });
-        extras.add(loadOverlay);
-
-        JCheckBox showInLoupe = new JCheckBox("Show in Loupe");
-        showInLoupe.setSelected(false);
-        showInLoupe.addActionListener(new ActionListener() {
-            public void actionPerformed(ActionEvent event) {
-                loupe.showOverlay = ((JCheckBox) event.getSource()).isSelected();
-                loupe.repaint();
-            }
-        });
-        extras.add(showInLoupe);
-
-        panel.add(extras, new GridBagConstraints(1, y++, 1, 1, 1.0f, 0.0f,
-                    GridBagConstraints.LINE_START, GridBagConstraints.NONE,
-                        new Insets(0, 0, 0, 0), 0, 0));
-    }
-
-    public SwingWorker<?, ?> openOverlay() {
-        JFileChooser chooser = new JFileChooser();
-        chooser.setFileFilter(new PngFileFilter());
-        int choice = chooser.showOpenDialog(this);
-        if (choice == JFileChooser.APPROVE_OPTION) {
-            return new OpenOverlayTask(chooser.getSelectedFile());
-        } else {
-            return null;
-        }
-    }
-
-    private JSlider buildSlider(JPanel panel, String title, String minName, String maxName,
-            int min, int max, int value, int tick) {
-        panel.add(new JLabel(title), new GridBagConstraints(0, y, 1, 1, 1.0f, 0.0f,
-                    GridBagConstraints.LINE_END, GridBagConstraints.NONE,
-                    new Insets(0, 0, 0, 6), 0, 0));
-        JPanel sliderPanel = new JPanel(new FlowLayout(FlowLayout.LEFT, 0, 0));
-        sliderPanel.add(new JLabel(minName));
-        JSlider slider = new JSlider(min, max, value);
-        slider.setMinorTickSpacing(tick);
-        slider.setMajorTickSpacing(tick);
-        slider.setSnapToTicks(true);
-        sliderPanel.add(slider);
-        sliderPanel.add(new JLabel(maxName));
-        panel.add(sliderPanel, new GridBagConstraints(1, y++, 1, 1, 1.0f, 0.0f,
-                    GridBagConstraints.FIRST_LINE_START, GridBagConstraints.NONE,
-                        new Insets(0, 0, 0, 0), 0, 0));
-        return slider;
-    }
-
-    void stop() {
-        timer.stop();
-    }
-
-    void start() {
-        timer.start();
-    }
-
-    void select(ViewNode node) {
-        this.node = node;
-        repaint();
-    }
-
-    class LoupeViewer extends JComponent {
-        private final Color lineColor = new Color(1.0f, 1.0f, 1.0f, 0.3f);
-
-        private int width;
-        private int height;
-        private BufferedImage grid;
-        private int left;
-        private int top;
-        public boolean clearGrid;
-
-        private final Rectangle clip = new Rectangle();
-        private boolean showOverlay = false;
-
-        LoupeViewer() {
-            addMouseListener(new MouseAdapter() {
-                @Override
-                public void mousePressed(MouseEvent event) {
-                    moveToPoint(event);
-                }
-            });
-            addMouseMotionListener(new MouseMotionAdapter() {
-                @Override
-                public void mouseDragged(MouseEvent event) {
-                    moveToPoint(event);
-                }
-            });
-        }
-
-        @Override
-        protected void paintComponent(Graphics g) {
-            if (isLoading) {
-                return;
-            }
-
-            g.translate(-left, -top);
-
-            if (image != null) {
-                Graphics2D g2 = (Graphics2D) g.create();
-                g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
-                        RenderingHints.VALUE_INTERPOLATION_NEAREST_NEIGHBOR);
-                g2.scale(zoom, zoom);
-                g2.drawImage(image, 0, 0, null);
-                if (overlay != null && showOverlay) {
-                    g2.setComposite(overlayAlpha);
-                    g2.drawImage(overlay, 0, image.getHeight() - overlay.getHeight(), null);
-                }
-                g2.dispose();
-            }
-
-            int width = getWidth();
-            int height = getHeight();
-
-            Graphics2D g2 = null;
-            if (width != this.width || height != this.height) {
-                this.width = width;
-                this.height = height;
-
-                grid = new BufferedImage(width + zoom + 1, height + zoom + 1,
-                        BufferedImage.TYPE_INT_ARGB);
-                clearGrid = true;
-                g2 = grid.createGraphics();
-            } else if (clearGrid) {
-                g2 = grid.createGraphics();
-                g2.setComposite(AlphaComposite.Clear);
-                g2.fillRect(0, 0, grid.getWidth(), grid.getHeight());
-                g2.setComposite(AlphaComposite.SrcOver);
-            }
-
-            if (clearGrid) {
-                clearGrid = false;
-
-                g2.setColor(lineColor);
-                width += zoom;
-                height += zoom;
-
-                for (int x = zoom; x <= width; x += zoom) {
-                    g2.drawLine(x, 0, x, height);
-                }
-
-                for (int y = 0; y <= height; y += zoom) {
-                    g2.drawLine(0, y, width, y);
-                }
-
-                g2.dispose();
-            }
-
-            if (image != null) {
-                g.getClipBounds(clip);
-                g.clipRect(0, 0, image.getWidth() * zoom + 1, image.getHeight() * zoom + 1);
-                g.drawImage(grid, clip.x - clip.x % zoom, clip.y - clip.y % zoom, null);
-            }
-
-            g.translate(left, top);
-        }
-
-        void moveToPoint(MouseEvent event) {
-            int x = Math.max(0, Math.min((event.getX() + left) / zoom, image.getWidth() - 1));
-            int y = Math.max(0, Math.min((event.getY() + top) / zoom, image.getHeight() - 1));
-            moveToPoint(x, y);
-            crosshair.moveToPoint(x, y);
-        }
-
-        void moveToPoint(int x, int y) {
-            left = x * zoom - width / 2 + zoom / 2;
-            top = y * zoom - height / 2 + zoom / 2;
-            repaint();
-        }
-    }
-
-    class LoupeStatus extends JPanel {
-        private JLabel xLabel;
-        private JLabel yLabel;
-        private JLabel rLabel;
-        private JLabel gLabel;
-        private JLabel bLabel;
-        private JLabel hLabel;
-        private ScreenViewer.LoupeStatus.ColoredSquare square;
-        private Color color;
-
-        LoupeStatus() {
-            setOpaque(true);
-            setLayout(new GridBagLayout());
-            setBorder(BorderFactory.createEmptyBorder(4, 4, 4, 4));
-
-            square = new ColoredSquare();
-            add(square, new GridBagConstraints(0, 0, 1, 2, 0.0f, 0.0f,
-                    GridBagConstraints.LINE_START, GridBagConstraints.NONE,
-                    new Insets(0, 0, 0, 12), 0, 0 ));
-
-            JLabel label;
-
-            add(label = new JLabel("#ffffff"), new GridBagConstraints(0, 2, 1, 1, 0.0f, 0.0f,
-                    GridBagConstraints.LINE_START, GridBagConstraints.NONE,
-                    new Insets(0, 0, 0, 12), 0, 0 ));
-            label.setForeground(Color.WHITE);
-            hLabel = label;
-
-            add(label = new JLabel("R:"), new GridBagConstraints(1, 0, 1, 1, 0.0f, 0.0f,
-                    GridBagConstraints.LINE_START, GridBagConstraints.NONE,
-                    new Insets(0, 6, 0, 6), 0, 0 ));
-            label.setForeground(Color.WHITE);
-            add(label = new JLabel("255"), new GridBagConstraints(2, 0, 1, 1, 0.0f, 0.0f,
-                    GridBagConstraints.LINE_START, GridBagConstraints.NONE,
-                    new Insets(0, 0, 0, 12), 0, 0 ));
-            label.setForeground(Color.WHITE);
-            rLabel = label;
-
-            add(label = new JLabel("G:"), new GridBagConstraints(1, 1, 1, 1, 0.0f, 0.0f,
-                    GridBagConstraints.LINE_START, GridBagConstraints.NONE,
-                    new Insets(0, 6, 0, 6), 0, 0 ));
-            label.setForeground(Color.WHITE);
-            add(label = new JLabel("255"), new GridBagConstraints(2, 1, 1, 1, 0.0f, 0.0f,
-                    GridBagConstraints.LINE_START, GridBagConstraints.NONE,
-                    new Insets(0, 0, 0, 12), 0, 0 ));
-            label.setForeground(Color.WHITE);
-            gLabel = label;
-
-            add(label = new JLabel("B:"), new GridBagConstraints(1, 2, 1, 1, 0.0f, 0.0f,
-                    GridBagConstraints.LINE_START, GridBagConstraints.NONE,
-                    new Insets(0, 6, 0, 6), 0, 0 ));
-            label.setForeground(Color.WHITE);
-            add(label = new JLabel("255"), new GridBagConstraints(2, 2, 1, 1, 0.0f, 0.0f,
-                    GridBagConstraints.LINE_START, GridBagConstraints.NONE,
-                    new Insets(0, 0, 0, 12), 0, 0 ));
-            label.setForeground(Color.WHITE);
-            bLabel = label;
-
-            add(label = new JLabel("X:"), new GridBagConstraints(3, 0, 1, 1, 0.0f, 0.0f,
-                    GridBagConstraints.LINE_START, GridBagConstraints.NONE,
-                    new Insets(0, 6, 0, 6), 0, 0 ));
-            label.setForeground(Color.WHITE);
-            add(label = new JLabel("0 px"), new GridBagConstraints(4, 0, 1, 1, 0.0f, 0.0f,
-                    GridBagConstraints.LINE_START, GridBagConstraints.NONE,
-                    new Insets(0, 0, 0, 12), 0, 0 ));
-            label.setForeground(Color.WHITE);
-            xLabel = label;
-
-            add(label = new JLabel("Y:"), new GridBagConstraints(3, 1, 1, 1, 0.0f, 0.0f,
-                    GridBagConstraints.LINE_START, GridBagConstraints.NONE,
-                    new Insets(0, 6, 0, 6), 0, 0 ));
-            label.setForeground(Color.WHITE);
-            add(label = new JLabel("0 px"), new GridBagConstraints(4, 1, 1, 1, 0.0f, 0.0f,
-                    GridBagConstraints.LINE_START, GridBagConstraints.NONE,
-                    new Insets(0, 0, 0, 12), 0, 0 ));
-            label.setForeground(Color.WHITE);
-            yLabel = label;
-
-            add(Box.createHorizontalGlue(), new GridBagConstraints(5, 0, 1, 1, 1.0f, 0.0f,
-                    GridBagConstraints.LINE_START, GridBagConstraints.BOTH,
-                    new Insets(0, 0, 0, 0), 0, 0 ));
-        }
-
-        @Override
-        protected void paintComponent(Graphics g) {
-            g.setColor(Color.BLACK);
-            g.fillRect(0, 0, getWidth(), getHeight());
-        }
-
-        void showPixel(int x, int y) {
-            xLabel.setText(x + " px");
-            yLabel.setText(y + " px");
-
-            int pixel = image.getRGB(x, y);
-            color = new Color(pixel);
-            hLabel.setText("#" + Integer.toHexString(pixel));
-            rLabel.setText(String.valueOf((pixel >> 16) & 0xff));
-            gLabel.setText(String.valueOf((pixel >>  8) & 0xff));
-            bLabel.setText(String.valueOf((pixel      ) & 0xff));
-
-            square.repaint();
-        }
-
-        private class ColoredSquare extends JComponent {
-            @Override
-            public Dimension getPreferredSize() {
-                Dimension d = super.getPreferredSize();
-                d.width = 60;
-                d.height = 30;
-                return d;
-            }
-
-            @Override
-            protected void paintComponent(Graphics g) {
-                g.setColor(color);
-                g.fillRect(0, 0, getWidth(), getHeight());
-
-                g.setColor(Color.WHITE);
-                g.drawRect(0, 0, getWidth() - 1, getHeight() - 1);
-            }
-        }
-    }
-
-    class Crosshair extends JPanel {
-        // magenta = 0xff5efe
-        private final Color crosshairColor = new Color(0x00ffff);
-        Point crosshair = new Point();
-        private int width;
-        private int height;
-        private final ScreenshotViewer screenshotViewer;
-
-        Crosshair(ScreenshotViewer screenshotViewer) {
-            this.screenshotViewer = screenshotViewer;
-            setOpaque(true);
-            setLayout(new BorderLayout());
-            add(screenshotViewer);
-            addMouseListener(new MouseAdapter() {
-                @Override
-                public void mousePressed(MouseEvent event) {
-                    moveToPoint(event);
-                }
-            });
-            addMouseMotionListener(new MouseMotionAdapter() {
-                @Override
-                public void mouseDragged(MouseEvent event) {
-                    moveToPoint(event);
-                }
-            });
-        }
-
-        void moveToPoint(int x, int y) {
-            crosshair.x = x;
-            crosshair.y = y;
-            status.showPixel(crosshair.x, crosshair.y);
-            repaint();
-        }
-
-        private void moveToPoint(MouseEvent event) {
-            crosshair.x = Math.max(0, Math.min(image.getWidth() - 1, event.getX()));
-            crosshair.y = Math.max(0, Math.min(image.getHeight() - 1, event.getY()));
-            loupe.moveToPoint(crosshair.x, crosshair.y);
-            status.showPixel(crosshair.x, crosshair.y);
-
-            repaint();
-        }
-
-        @Override
-        public Dimension getPreferredSize() {
-            return screenshotViewer.getPreferredSize();
-        }
-
-        @Override
-        public Dimension getMaximumSize() {
-            return screenshotViewer.getPreferredSize();
-        }
-
-        @Override
-        public void paint(Graphics g) {
-            super.paint(g);
-
-            if (crosshair == null || width != getWidth() || height != getHeight()) {
-                width = getWidth();
-                height = getHeight();
-                crosshair = new Point(width / 2, height / 2);
-            }
-
-            g.setColor(crosshairColor);
-
-            g.drawLine(crosshair.x, 0, crosshair.x, height);
-            g.drawLine(0, crosshair.y, width, crosshair.y);
-        }
-
-        @Override
-        protected void paintComponent(Graphics g) {
-            super.paintComponent(g);
-            g.setColor(Color.BLACK);
-            g.fillRect(0, 0, getWidth(), getHeight());
-        }
-    }
-
-    class ScreenshotViewer extends JComponent {
-        private final Color boundsColor = new Color(0xff5efe);
-
-        ScreenshotViewer() {
-            setOpaque(true);
-        }
-
-        @Override
-        protected void paintComponent(Graphics g) {
-            g.setColor(Color.BLACK);
-            g.fillRect(0, 0, getWidth(), getHeight());
-
-            if (isLoading) {
-                return;
-            }
-
-            if (image != null) {
-                g.drawImage(image, 0, 0, null);
-                if (overlay != null) {
-                    Graphics2D g2 = (Graphics2D) g.create();
-                    g2.setComposite(overlayAlpha);
-                    g2.drawImage(overlay, 0, image.getHeight() - overlay.getHeight(), null);
-                }
-            }
-
-            if (node != null) {
-                Graphics s = g.create();
-                s.setColor(boundsColor);
-                ViewNode p = node.parent;
-                while (p != null) {
-                    s.translate(p.left - p.scrollX, p.top - p.scrollY);
-                    p = p.parent;
-                }
-                s.drawRect(node.left, node.top, node.width - 1, node.height - 1);
-                s.translate(node.left, node.top);
-
-                s.setXORMode(Color.WHITE);
-                if ((node.paddingBottom | node.paddingLeft |
-                        node.paddingTop | node.paddingRight) != 0) {
-                    s.setColor(Color.BLACK);
-                    s.drawRect(node.paddingLeft, node.paddingTop,
-                            node.width - node.paddingRight - node.paddingLeft - 1,
-                            node.height - node.paddingBottom - node.paddingTop - 1);
-                }
-                if (node.hasMargins && (node.marginLeft | node.marginBottom |
-                        node.marginRight | node.marginRight) != 0) {
-                    s.setColor(Color.BLACK);
-                    s.drawRect(-node.marginLeft, -node.marginTop,
-                            node.marginLeft + node.width + node.marginRight - 1,
-                            node.marginTop + node.height + node.marginBottom - 1);
-                }
-
-                s.dispose();
-            }
-        }
-
-        @Override
-        public Dimension getPreferredSize() {
-            if (image == null) {
-                return new Dimension(320, 480);
-            }
-            return new Dimension(image.getWidth(), image.getHeight());
-        }
-    }
-
-    private class CrosshairPanel extends JPanel {
-        private final Color crosshairColor = new Color(0xff5efe);
-        private final Insets insets = new Insets(0, 0, 0, 0);
-
-        CrosshairPanel(LoupeViewer loupe) {
-            setLayout(new BorderLayout());
-            add(loupe);
-        }
-
-        @Override
-        public void paint(Graphics g) {
-            super.paint(g);
-
-            g.setColor(crosshairColor);
-
-            int width = getWidth();
-            int height = getHeight();
-
-            getInsets(insets);
-
-            int x = (width - insets.left - insets.right) / 2;
-            int y = (height - insets.top - insets.bottom) / 2;
-
-            g.drawLine(insets.left + x, insets.top, insets.left + x, height - insets.bottom);
-            g.drawLine(insets.left, insets.top + y, width - insets.right, insets.top + y);
-        }
-
-        @Override
-        protected void paintComponent(Graphics g) {
-            g.setColor(Color.BLACK);
-            Insets insets = getInsets();
-            g.fillRect(insets.left, insets.top, getWidth() - insets.left - insets.right,
-                    getHeight() - insets.top - insets.bottom);
-        }
-    }
-
-    public void actionPerformed(ActionEvent event) {
-        if (task != null && !task.isDone()) {
-            return;
-        }
-        task = new GetScreenshotTask();
-        task.execute();
-    }
-
-    private class GetScreenshotTask extends SwingWorker<Boolean, Void> {
-        private GetScreenshotTask() {
-            workspace.beginTask();
-        }
-
-        @Override
-        @WorkerThread
-        protected Boolean doInBackground() throws Exception {
-            RawImage rawImage;
-            try {
-                rawImage = device.getScreenshot();
-            } catch (IOException ioe) {
-                return false;
-            }
-
-            boolean resize = false;
-            isLoading = true;
-            try {
-                if (rawImage != null) {
-                    if (image == null || rawImage.width != image.getWidth() ||
-                            rawImage.height != image.getHeight()) {
-                        image = new BufferedImage(rawImage.width, rawImage.height,
-                                BufferedImage.TYPE_INT_ARGB);
-                        scanline = new int[rawImage.width];
-                        resize = true;
-                    }
-
-                    switch (rawImage.bpp) {
-                        case 16:
-                            rawImage16toARGB(rawImage);
-                            break;
-                        case 32:
-                            rawImage32toARGB(rawImage);
-                            break;
-                    }
-                }
-            } finally {
-                isLoading = false;
-            }
-
-            return resize;
-        }
-        
-        private int getMask(int length) {
-            int res = 0;
-            for (int i = 0 ; i < length ; i++) {
-                res = (res << 1) + 1;
-            }
-    
-            return res;
-        }
-
-        private void rawImage32toARGB(RawImage rawImage) {
-            byte[] buffer = rawImage.data;
-            int index = 0;
-
-            final int redOffset = rawImage.red_offset;
-            final int redLength = rawImage.red_length;
-            final int redMask = getMask(redLength);
-            final int greenOffset = rawImage.green_offset;
-            final int greenLength = rawImage.green_length;
-            final int greenMask = getMask(greenLength);
-            final int blueOffset = rawImage.blue_offset;
-            final int blueLength = rawImage.blue_length;
-            final int blueMask = getMask(blueLength);
-            final int alphaLength = rawImage.alpha_length;
-            final int alphaOffset = rawImage.alpha_offset;
-            final int alphaMask = getMask(alphaLength);
-
-            for (int y = 0 ; y < rawImage.height ; y++) {
-                for (int x = 0 ; x < rawImage.width ; x++) {
-                    int value = buffer[index++] & 0x00FF;
-                    value |= (buffer[index++] & 0x00FF) << 8;
-                    value |= (buffer[index++] & 0x00FF) << 16;
-                    value |= (buffer[index++] & 0x00FF) << 24;
-
-                    int r = ((value >>> redOffset) & redMask) << (8 - redLength);
-                    int g = ((value >>> greenOffset) & greenMask) << (8 - greenLength);
-                    int b = ((value >>> blueOffset) & blueMask) << (8 - blueLength);
-                    int a = 0xFF;
-
-                    if (alphaLength != 0) {
-                        a = ((value >>> alphaOffset) & alphaMask) << (8 - alphaLength);
-                    }
-
-                    scanline[x] = a << 24 | r << 16 | g << 8 | b;
-                }
-
-                image.setRGB(0, y, rawImage.width, 1, scanline,
-                        0, rawImage.width);
-            }
-        }
-
-        private void rawImage16toARGB(RawImage rawImage) {
-            byte[] buffer = rawImage.data;
-            int index = 0;
-
-            for (int y = 0 ; y < rawImage.height ; y++) {
-                for (int x = 0 ; x < rawImage.width ; x++) {
-                    int value = buffer[index++] & 0x00FF;
-                    value |= (buffer[index++] << 8) & 0x0FF00;
-
-                    int r = ((value >> 11) & 0x01F) << 3;
-                    int g = ((value >> 5) & 0x03F) << 2;
-                    int b = ((value     ) & 0x01F) << 3;
-
-                    scanline[x] = 0xFF << 24 | r << 16 | g << 8 | b;
-                }
-
-                image.setRGB(0, y, rawImage.width, 1, scanline,
-                        0, rawImage.width);
-            }
-        }
-
-        @Override
-        protected void done() {
-            workspace.endTask();
-            try {
-                if (get()) {
-                    validate();
-                    crosshair.crosshair = new Point(image.getWidth() / 2,
-                            image.getHeight() / 2);
-                    status.showPixel(image.getWidth() / 2, image.getHeight() / 2);
-                    loupe.moveToPoint(image.getWidth() / 2, image.getHeight() / 2);
-                }
-            } catch (InterruptedException e) {
-                e.printStackTrace();
-            } catch (ExecutionException e) {
-                e.printStackTrace();
-            }
-            repaint();
-        }
-    }
-
-    private class OpenOverlayTask extends SwingWorker<BufferedImage, Void> {
-        private File file;
-
-        private OpenOverlayTask(File file) {
-            this.file = file;
-            workspace.beginTask();
-        }
-
-        @Override
-        @WorkerThread
-        protected BufferedImage doInBackground() {
-            try {
-                return IconLoader.toCompatibleImage(ImageIO.read(file));
-            } catch (IOException ex) {
-                ex.printStackTrace();
-            }
-            return null;
-        }
-
-        @Override
-        protected void done() {
-            try {
-                overlay = get();
-                repaint();
-            } catch (InterruptedException e) {
-                e.printStackTrace();
-            } catch (ExecutionException e) {
-                e.printStackTrace();
-            } finally {
-                workspace.endTask();
-            }
-        }
-    }
-}
diff --git a/hierarchyviewer/src/com/android/hierarchyviewer/ui/Workspace.java b/hierarchyviewer/src/com/android/hierarchyviewer/ui/Workspace.java
deleted file mode 100644
index bfa15b3..0000000
--- a/hierarchyviewer/src/com/android/hierarchyviewer/ui/Workspace.java
+++ /dev/null
@@ -1,1621 +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.hierarchyviewer.ui;
-
-import com.android.ddmlib.AndroidDebugBridge;
-import com.android.ddmlib.IDevice;
-import com.android.hierarchyviewer.device.DeviceBridge;
-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.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 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;
-import javax.swing.JCheckBox;
-import javax.swing.JComponent;
-import javax.swing.JFileChooser;
-import javax.swing.JFrame;
-import javax.swing.JLabel;
-import javax.swing.JMenu;
-import javax.swing.JMenuBar;
-import javax.swing.JMenuItem;
-import javax.swing.JPanel;
-import javax.swing.JProgressBar;
-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.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.TreeSelectionEvent;
-import javax.swing.event.TreeSelectionListener;
-import javax.swing.table.DefaultTableModel;
-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;
-    private JSlider zoomSlider;
-    private JSplitPane sideSplitter;
-    private JSplitPane mainSplitter;
-    private JTable propertiesTable;
-    private JTable profilingTable;
-    private JComponent pixelPerfectPanel;
-    private JTree pixelPerfectTree;
-    private ScreenViewer screenViewer;
-
-    private JPanel extrasPanel;
-    private LayoutRenderer layoutView;
-
-    private JScrollPane sceneScroller;
-    private JComponent sceneView;
-
-    private ViewHierarchyScene scene;
-
-    private ActionMap actionsMap;
-    private JPanel mainPanel;
-    private JProgressBar progress;
-    private JToolBar buttonsPanel;
-    private JToolBar commandButtonsPanel;
-
-    private JComponent deviceSelector;
-    private DevicesTableModel devicesTableModel;
-    private WindowsTableModel windowsTableModel;
-
-    private IDevice currentDevice;
-    private Window currentWindow = Window.FOCUSED_WINDOW;
-
-    private JButton displayNodeButton;
-    private JButton dumpDisplayListButton;
-    private JButton captureLayersButton;
-    private JButton invalidateButton;
-    private JButton requestLayoutButton;
-    private JButton loadButton;
-    private JButton startButton;
-    private JButton stopButton;
-    private JButton showDevicesButton;
-    private JButton refreshButton;
-    private JToggleButton graphViewButton;
-    private JToggleButton pixelPerfectViewButton;
-    private JMenuItem saveMenuItem;
-    private JMenuItem showDevicesMenuItem;
-    private JMenuItem loadMenuItem;
-    private JMenuItem startMenuItem;
-    private JMenuItem stopMenuItem;
-    private JTable devices;
-    private JTable windows;
-    private JLabel minZoomLabel;
-    private JLabel maxZoomLabel;
-    private JTextField filterText;
-    private JLabel filterLabel;
-
-    private int protocolVersion;
-    private int serverVersion;
-
-    public Workspace() {
-        super("Hierarchy Viewer");
-
-        buildActions();
-        add(buildMainPanel());
-        setJMenuBar(buildMenuBar());
-
-        devices.changeSelection(0, 0, false, false);
-        currentDeviceChanged();
-
-        pack();
-    }
-
-    private void buildActions() {
-        actionsMap = new ActionMap();
-        actionsMap.put(ExitAction.ACTION_NAME, new ExitAction(this));
-        actionsMap.put(ShowDevicesAction.ACTION_NAME, new ShowDevicesAction(this));
-        actionsMap.put(LoadGraphAction.ACTION_NAME, new LoadGraphAction(this));
-        actionsMap.put(SaveSceneAction.ACTION_NAME, new SaveSceneAction(this));
-        actionsMap.put(StartServerAction.ACTION_NAME, new StartServerAction(this));
-        actionsMap.put(StopServerAction.ACTION_NAME, new StopServerAction(this));
-        actionsMap.put(InvalidateAction.ACTION_NAME, new InvalidateAction(this));
-        actionsMap.put(RequestLayoutAction.ACTION_NAME, new RequestLayoutAction(this));
-        actionsMap.put(DumpDisplayListAction.ACTION_NAME, new DumpDisplayListAction(this));
-        actionsMap.put(CaptureNodeAction.ACTION_NAME, new CaptureNodeAction(this));
-        actionsMap.put(CaptureLayersAction.ACTION_NAME, new CaptureLayersAction(this));
-        actionsMap.put(RefreshWindowsAction.ACTION_NAME, new RefreshWindowsAction(this));
-    }
-
-    private JComponent buildMainPanel() {
-        mainPanel = new JPanel();
-        mainPanel.setLayout(new BorderLayout());
-        commandButtonsPanel = buildToolBar();
-        mainPanel.add(commandButtonsPanel, BorderLayout.PAGE_START);
-        mainPanel.add(deviceSelector = buildDeviceSelector(), BorderLayout.CENTER);
-        mainPanel.add(buildStatusPanel(), BorderLayout.SOUTH);
-
-        mainPanel.setPreferredSize(new Dimension(1200, 800));
-
-        return mainPanel;
-    }
-
-    private JComponent buildGraphPanel() {
-        sceneScroller = new JScrollPane();
-        sceneScroller.setBorder(null);
-
-        mainSplitter = new JSplitPane();
-        mainSplitter.setResizeWeight(1.0);
-        mainSplitter.setContinuousLayout(true);
-        if (OS.isMacOsX() && OS.isLeopardOrLater()) {
-            mainSplitter.setBorder(new UnifiedContentBorder());
-        }
-
-        mainSplitter.setLeftComponent(sceneScroller);
-        mainSplitter.setRightComponent(buildSideSplitter());
-
-        return mainSplitter;
-    }
-
-    private JComponent buildDeviceSelector() {
-        JPanel panel = new JPanel(new GridBagLayout());
-        if (OS.isMacOsX() && OS.isLeopardOrLater()) {
-            panel.setBorder(new UnifiedContentBorder());
-        }
-
-        devicesTableModel = new DevicesTableModel();
-        for (IDevice device : DeviceBridge.getDevices()) {
-            DeviceBridge.setupDeviceForward(device);
-            devicesTableModel.addDevice(device);
-        }
-        DeviceBridge.startListenForDevices(devicesTableModel);
-
-        devices = new JTable(devicesTableModel);
-        devices.getSelectionModel().addListSelectionListener(new DeviceSelectedListener());
-        devices.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
-        devices.setBorder(null);
-        JScrollPane devicesScroller = new JScrollPane(devices);
-        devicesScroller.setBorder(null);
-        panel.add(devicesScroller, new GridBagConstraints(0, 0, 1, 1, 0.5, 1.0,
-                GridBagConstraints.LINE_START, GridBagConstraints.BOTH, new Insets(0, 0, 0, 0),
-                0, 0));
-
-        windowsTableModel = new WindowsTableModel();
-        windowsTableModel.setVisible(false);
-
-        windows = new JTable(windowsTableModel);
-        windows.getSelectionModel().addListSelectionListener(new WindowSelectedListener());
-        windows.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
-        windows.setBorder(null);
-        JScrollPane windowsScroller = new JScrollPane(windows);
-        windowsScroller.setBorder(null);
-        panel.add(windowsScroller, new GridBagConstraints(2, 0, 1, 1, 0.5, 1.0,
-                GridBagConstraints.LINE_START, GridBagConstraints.BOTH, new Insets(0, 0, 0, 0),
-                0, 0));
-
-        return panel;
-    }
-
-    private JComponent buildSideSplitter() {
-        propertiesTable = new JTable();
-        propertiesTable.setModel(new DefaultTableModel(new Object[][] { },
-                new String[] { "Property", "Value" }));
-        propertiesTable.setBorder(null);
-        propertiesTable.getTableHeader().setBorder(null);
-
-        JScrollPane tableScroller = new JScrollPane(propertiesTable);
-        tableScroller.setBorder(null);
-
-        profilingTable = new JTable();
-        profilingTable.setModel(new DefaultTableModel(new Object[][] {
-                { " " , " " }, { " " , " " }, { " " , " " } },
-                new String[] { "Operation", "Duration (ms)" }));
-        profilingTable.setBorder(null);
-        profilingTable.getTableHeader().setBorder(null);
-
-        JScrollPane firstTableScroller = new JScrollPane(profilingTable);
-        firstTableScroller.setBorder(null);
-
-        setVisibleRowCount(profilingTable, 5);
-        firstTableScroller.setMinimumSize(profilingTable.getPreferredScrollableViewportSize());
-
-        JSplitPane tablesSplitter = new JSplitPane();
-        tablesSplitter.setBorder(null);
-        tablesSplitter.setOrientation(JSplitPane.VERTICAL_SPLIT);
-        tablesSplitter.setResizeWeight(0);
-        tablesSplitter.setLeftComponent(firstTableScroller);
-        tablesSplitter.setBottomComponent(tableScroller);
-        tablesSplitter.setContinuousLayout(true);
-
-        sideSplitter = new JSplitPane();
-        sideSplitter.setBorder(null);
-        sideSplitter.setOrientation(JSplitPane.VERTICAL_SPLIT);
-        sideSplitter.setResizeWeight(0.5);
-        sideSplitter.setLeftComponent(tablesSplitter);
-        sideSplitter.setBottomComponent(null);
-        sideSplitter.setContinuousLayout(true);
-
-        return sideSplitter;
-    }
-
-    private JPanel buildStatusPanel() {
-        JPanel statusPanel = new JPanel();
-        statusPanel.setLayout(new BorderLayout());
-
-        JPanel leftSide = new JPanel();
-        leftSide.setOpaque(false);
-        leftSide.setLayout(new FlowLayout(FlowLayout.LEFT, 0, 5));
-        leftSide.add(Box.createHorizontalStrut(6));
-
-        ButtonGroup group = new ButtonGroup();
-
-        graphViewButton = new JToggleButton(IconLoader.load(getClass(),
-                "/images/icon-graph-view.png"));
-        graphViewButton.setSelectedIcon(IconLoader.load(getClass(),
-                "/images/icon-graph-view-selected.png"));
-        graphViewButton.putClientProperty("JButton.buttonType", "segmentedTextured");
-        graphViewButton.putClientProperty("JButton.segmentPosition", "first");
-        graphViewButton.addActionListener(new ActionListener() {
-            public void actionPerformed(ActionEvent e) {
-                toggleGraphView();
-            }
-        });
-        group.add(graphViewButton);
-        leftSide.add(graphViewButton);
-
-        pixelPerfectViewButton = new JToggleButton(IconLoader.load(getClass(),
-                "/images/icon-pixel-perfect-view.png"));
-        pixelPerfectViewButton.setSelectedIcon(IconLoader.load(getClass(),
-                "/images/icon-pixel-perfect-view-selected.png"));
-        pixelPerfectViewButton.putClientProperty("JButton.buttonType", "segmentedTextured");
-        pixelPerfectViewButton.putClientProperty("JButton.segmentPosition", "last");
-        pixelPerfectViewButton.addActionListener(new ActionListener() {
-            public void actionPerformed(ActionEvent e) {
-                togglePixelPerfectView();
-            }
-        });
-        group.add(pixelPerfectViewButton);
-        leftSide.add(pixelPerfectViewButton);
-
-        graphViewButton.setSelected(true);
-
-        filterText = new JTextField(20);
-        filterText.putClientProperty("JComponent.sizeVariant", "small");
-        filterText.getDocument().addDocumentListener(new DocumentListener() {
-            public void insertUpdate(DocumentEvent e) {
-                updateFilter(e);
-            }
-
-            public void removeUpdate(DocumentEvent e) {
-                updateFilter(e);
-            }
-
-            public void changedUpdate(DocumentEvent e) {
-                updateFilter(e);
-            }
-        });
-
-        filterLabel = new JLabel("Filter by class or id:");
-        filterLabel.putClientProperty("JComponent.sizeVariant", "small");
-        filterLabel.setBorder(BorderFactory.createEmptyBorder(0, 6, 0, 6));
-
-        leftSide.add(filterLabel);
-        leftSide.add(filterText);
-
-        minZoomLabel = new JLabel();
-        minZoomLabel.setText("20%");
-        minZoomLabel.putClientProperty("JComponent.sizeVariant", "small");
-        minZoomLabel.setBorder(BorderFactory.createEmptyBorder(0, 12, 0, 0));
-        leftSide.add(minZoomLabel);
-
-        zoomSlider = new JSlider();
-        zoomSlider.putClientProperty("JComponent.sizeVariant", "small");
-        zoomSlider.setMaximum(200);
-        zoomSlider.setMinimum(20);
-        zoomSlider.setValue(100);
-        zoomSlider.addChangeListener(new ChangeListener() {
-            public void stateChanged(ChangeEvent evt) {
-                zoomSliderStateChanged(evt);
-            }
-        });
-        leftSide.add(zoomSlider);
-
-        maxZoomLabel = new JLabel();
-        maxZoomLabel.putClientProperty("JComponent.sizeVariant", "small");
-        maxZoomLabel.setText("200%");
-        leftSide.add(maxZoomLabel);
-
-        viewCountLabel = new JLabel();
-        viewCountLabel.setText("0 views");
-        viewCountLabel.putClientProperty("JComponent.sizeVariant", "small");
-        viewCountLabel.setBorder(BorderFactory.createEmptyBorder(0, 12, 0, 0));
-        leftSide.add(viewCountLabel);
-
-        statusPanel.add(leftSide, BorderLayout.LINE_START);
-
-        JPanel rightSide = new JPanel();
-        rightSide.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 12));
-        rightSide.setLayout(new FlowLayout(FlowLayout.RIGHT));
-
-        progress = new JProgressBar();
-        progress.setVisible(false);
-        progress.setIndeterminate(true);
-        progress.putClientProperty("JComponent.sizeVariant", "mini");
-        progress.putClientProperty("JProgressBar.style", "circular");
-        rightSide.add(progress);
-
-        statusPanel.add(rightSide, BorderLayout.LINE_END);
-
-        hideStatusBarComponents();
-
-        return statusPanel;
-    }
-
-    private void hideStatusBarComponents() {
-        viewCountLabel.setVisible(false);
-        zoomSlider.setVisible(false);
-        minZoomLabel.setVisible(false);
-        maxZoomLabel.setVisible(false);
-        filterLabel.setVisible(false);
-        filterText.setVisible(false);
-    }
-
-    private JToolBar buildToolBar() {
-        JToolBar toolBar = new JToolBar();
-        toolBar.setFloatable(false);
-        toolBar.setRollover(true);
-
-        startButton = new JButton();
-        startButton.setAction(actionsMap.get(StartServerAction.ACTION_NAME));
-        startButton.putClientProperty("JButton.buttonType", "segmentedTextured");
-        startButton.putClientProperty("JButton.segmentPosition", "first");
-        toolBar.add(startButton);
-
-        stopButton = new JButton();
-        stopButton.setAction(actionsMap.get(StopServerAction.ACTION_NAME));
-        stopButton.putClientProperty("JButton.buttonType", "segmentedTextured");
-        stopButton.putClientProperty("JButton.segmentPosition", "middle");
-        toolBar.add(stopButton);
-
-        refreshButton = new JButton();
-        refreshButton.setAction(actionsMap.get(RefreshWindowsAction.ACTION_NAME));
-        refreshButton.putClientProperty("JButton.buttonType", "segmentedTextured");
-        refreshButton.putClientProperty("JButton.segmentPosition", "last");
-        toolBar.add(refreshButton);
-
-        showDevicesButton = new JButton();
-        showDevicesButton.setAction(actionsMap.get(ShowDevicesAction.ACTION_NAME));
-        showDevicesButton.putClientProperty("JButton.buttonType", "segmentedTextured");
-        showDevicesButton.putClientProperty("JButton.segmentPosition", "first");
-        toolBar.add(showDevicesButton);
-        showDevicesButton.setEnabled(false);
-
-        loadButton = new JButton();
-        loadButton.setAction(actionsMap.get(LoadGraphAction.ACTION_NAME));
-        loadButton.putClientProperty("JButton.buttonType", "segmentedTextured");
-        loadButton.putClientProperty("JButton.segmentPosition", "last");
-        toolBar.add(loadButton);
-
-        displayNodeButton = new JButton();
-        displayNodeButton.setAction(actionsMap.get(CaptureNodeAction.ACTION_NAME));
-        displayNodeButton.putClientProperty("JButton.buttonType", "segmentedTextured");
-        displayNodeButton.putClientProperty("JButton.segmentPosition", "first");
-        toolBar.add(displayNodeButton);
-
-        dumpDisplayListButton = new JButton();
-        dumpDisplayListButton.setAction(actionsMap.get(DumpDisplayListAction.ACTION_NAME));
-        dumpDisplayListButton.putClientProperty("JButton.buttonType", "segmentedTextured");
-        dumpDisplayListButton.putClientProperty("JButton.segmentPosition", "middle");
-
-        captureLayersButton = new JButton();
-        captureLayersButton.setAction(actionsMap.get(CaptureLayersAction.ACTION_NAME));
-        captureLayersButton.putClientProperty("JButton.buttonType", "segmentedTextured");
-        captureLayersButton.putClientProperty("JButton.segmentPosition", "middle");
-        toolBar.add(captureLayersButton);
-        
-        invalidateButton = new JButton();
-        invalidateButton.setAction(actionsMap.get(InvalidateAction.ACTION_NAME));
-        invalidateButton.putClientProperty("JButton.buttonType", "segmentedTextured");
-        invalidateButton.putClientProperty("JButton.segmentPosition", "middle");
-        toolBar.add(invalidateButton);
-
-        requestLayoutButton = new JButton();
-        requestLayoutButton.setAction(actionsMap.get(RequestLayoutAction.ACTION_NAME));
-        requestLayoutButton.putClientProperty("JButton.buttonType", "segmentedTextured");
-        requestLayoutButton.putClientProperty("JButton.segmentPosition", "last");
-        toolBar.add(requestLayoutButton);
-
-        return toolBar;
-    }
-
-    private void setupProtocolDependentToolbar() {
-        // Some functionality is only enabled in certain versions of the protocol.
-        // Add/remove those buttons here
-        if (protocolVersion < 4) {
-            commandButtonsPanel.remove(dumpDisplayListButton);
-        } else if (dumpDisplayListButton.getParent() == null) {
-            commandButtonsPanel.add(dumpDisplayListButton,
-                    commandButtonsPanel.getComponentCount() - 1);
-        }
-    }
-
-    private JMenuBar buildMenuBar() {
-        JMenuBar menuBar = new JMenuBar();
-
-        JMenu fileMenu = new JMenu();
-        JMenu viewMenu = new JMenu();
-        JMenu viewHierarchyMenu = new JMenu();
-        JMenu serverMenu = new JMenu();
-
-        saveMenuItem = new JMenuItem();
-        JMenuItem exitMenuItem = new JMenuItem();
-
-        showDevicesMenuItem = new JMenuItem();
-
-        loadMenuItem = new JMenuItem();
-
-        startMenuItem = new JMenuItem();
-        stopMenuItem = new JMenuItem();
-
-        fileMenu.setText("File");
-
-        saveMenuItem.setAction(actionsMap.get(SaveSceneAction.ACTION_NAME));
-        fileMenu.add(saveMenuItem);
-
-        exitMenuItem.setAction(actionsMap.get(ExitAction.ACTION_NAME));
-        fileMenu.add(exitMenuItem);
-
-        menuBar.add(fileMenu);
-
-        viewMenu.setText("View");
-
-        showDevicesMenuItem.setAction(actionsMap.get(ShowDevicesAction.ACTION_NAME));
-        showDevicesMenuItem.setEnabled(false);
-        viewMenu.add(showDevicesMenuItem);
-
-        menuBar.add(viewMenu);
-
-        viewHierarchyMenu.setText("Hierarchy");
-
-        loadMenuItem.setAction(actionsMap.get(LoadGraphAction.ACTION_NAME));
-        viewHierarchyMenu.add(loadMenuItem);
-
-        menuBar.add(viewHierarchyMenu);
-
-        serverMenu.setText("Server");
-
-        startMenuItem.setAction(actionsMap.get(StartServerAction.ACTION_NAME));
-        serverMenu.add(startMenuItem);
-
-        stopMenuItem.setAction(actionsMap.get(StopServerAction.ACTION_NAME));
-        serverMenu.add(stopMenuItem);
-
-        menuBar.add(serverMenu);
-
-        return menuBar;
-    }
-
-    private JComponent buildPixelPerfectPanel() {
-        JSplitPane splitter = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT);
-
-        pixelPerfectTree = new JTree(new Object[0]);
-        pixelPerfectTree.setBorder(null);
-        pixelPerfectTree.setBorder(BorderFactory.createEmptyBorder(6, 6, 6, 6));
-        pixelPerfectTree.addTreeSelectionListener(new TreeSelectionListener() {
-            public void valueChanged(TreeSelectionEvent event) {
-                ViewNode node = (ViewNode) event.getPath().getLastPathComponent();
-                screenViewer.select(node);
-            }
-        });
-
-        JScrollPane scroller = new JScrollPane(pixelPerfectTree);
-        scroller.setBorder(null);
-        scroller.getViewport().setBorder(null);
-
-        splitter.setContinuousLayout(true);
-        splitter.setLeftComponent(scroller);
-        splitter.setRightComponent(buildPixelPerfectViewer(splitter));
-        splitter.setBorder(null);
-
-        if (OS.isMacOsX() && OS.isLeopardOrLater()) {
-            splitter.setBorder(new UnifiedContentBorder());
-        }
-
-        return splitter;
-    }
-
-    private JComponent buildPixelPerfectViewer(JSplitPane splitter) {
-        screenViewer = new ScreenViewer(this, currentDevice, splitter.getDividerSize());
-        return screenViewer;
-    }
-
-    private void toggleGraphView() {
-        showStatusBarComponents();
-
-        screenViewer.stop();
-        mainPanel.remove(pixelPerfectPanel);
-        mainPanel.add(mainSplitter, BorderLayout.CENTER);
-
-        validate();
-        repaint();
-    }
-
-    private void showStatusBarComponents() {
-        viewCountLabel.setVisible(true);
-        zoomSlider.setVisible(true);
-        minZoomLabel.setVisible(true);
-        maxZoomLabel.setVisible(true);
-        filterLabel.setVisible(true);
-        filterText.setVisible(true);
-    }
-
-    private void togglePixelPerfectView() {
-        if (pixelPerfectPanel == null) {
-            pixelPerfectPanel = buildPixelPerfectPanel();
-            showPixelPerfectTree();
-        } else {
-            screenViewer.start();
-        }
-
-        hideStatusBarComponents();
-
-        mainPanel.remove(mainSplitter);
-        mainPanel.add(pixelPerfectPanel, BorderLayout.CENTER);
-
-        validate();
-        repaint();
-    }
-
-    private void zoomSliderStateChanged(ChangeEvent evt) {
-        JSlider slider = (JSlider) evt.getSource();
-        if (sceneView != null) {
-            scene.setZoomFactor(slider.getValue() / 100.0d);
-            sceneView.repaint();
-        }
-    }
-
-    private void showProperties(ViewNode node) {
-        propertiesTable.setModel(new PropertiesTableModel(node));
-    }
-
-    private void updateProfiles(double[] profiles) {
-        profilingTable.setModel(new ProfilesTableModel(profiles));
-        setVisibleRowCount(profilingTable, profiles.length + 1);
-    }
-
-    public static void setVisibleRowCount(JTable table, int rows) {
-        int height = 0;
-        for (int row = 0; row < rows; row++) {
-            height += table.getRowHeight(row);
-        }
-
-        Dimension size = new Dimension(table.getPreferredScrollableViewportSize().width, height);
-        table.setPreferredScrollableViewportSize(size);
-        table.revalidate();
-    }
-
-    private void showPixelPerfectTree() {
-        if (pixelPerfectTree == null) {
-            return;
-        }
-        pixelPerfectTree.setModel(new ViewsTreeModel(scene.getRoot()));
-        pixelPerfectTree.setCellRenderer(new ViewsTreeCellRenderer());
-        expandAll(pixelPerfectTree, true);
-
-    }
-
-    private static void expandAll(JTree tree, boolean expand) {
-        ViewNode root = (ViewNode) tree.getModel().getRoot();
-        expandAll(tree, new TreePath(root), expand);
-    }
-
-    private static void expandAll(JTree tree, TreePath parent, boolean expand) {
-        // Traverse children
-        ViewNode node = (ViewNode)parent.getLastPathComponent();
-        if (node.children != null) {
-            for (ViewNode n : node.children) {
-                TreePath path = parent.pathByAddingChild(n);
-                expandAll(tree, path, expand);
-            }
-        }
-
-        if (expand) {
-            tree.expandPath(parent);
-        } else {
-            tree.collapsePath(parent);
-        }
-    }
-
-    private void createGraph(ViewHierarchyScene scene) {
-        scene.addObjectSceneListener(new SceneFocusListener(),
-                ObjectSceneEventType.OBJECT_FOCUS_CHANGED);
-
-        if (mainSplitter == null) {
-            mainPanel.remove(deviceSelector);
-            mainPanel.add(buildGraphPanel(), BorderLayout.CENTER);
-            showDevicesButton.setEnabled(true);
-            showDevicesMenuItem.setEnabled(true);
-            graphViewButton.setEnabled(true);
-            pixelPerfectViewButton.setEnabled(true);
-
-            showStatusBarComponents();
-        }
-
-        sceneView = scene.createView();
-        sceneView.addMouseListener(new NodeClickListener());
-        sceneView.addMouseWheelListener(new WheelZoomListener());
-        sceneScroller.setViewportView(sceneView);
-
-        if (extrasPanel != null) {
-            sideSplitter.remove(extrasPanel);
-        }
-        sideSplitter.setBottomComponent(buildExtrasPanel());
-
-        mainSplitter.setDividerLocation(getWidth() - mainSplitter.getDividerSize() -
-                buttonsPanel.getPreferredSize().width);
-
-        captureLayersButton.setEnabled(true);        
-        saveMenuItem.setEnabled(true);
-        showPixelPerfectTree();
-
-        updateStatus();
-        layoutScene();
-    }
-
-    private void layoutScene() {
-        TreeGraphLayout<ViewNode, String> layout =
-                new TreeGraphLayout<ViewNode, String>(scene, 50, 50, 70, 30, true);
-        layout.layout(scene.getRoot());
-    }
-
-    private void updateStatus() {
-        viewCountLabel.setText("" + scene.getNodes().size() + " views");
-        zoomSlider.setEnabled(scene.getNodes().size() > 0);
-    }
-
-    private JPanel buildExtrasPanel() {
-        extrasPanel = new JPanel(new BorderLayout());
-        JScrollPane p = new JScrollPane(layoutView = new LayoutRenderer(scene, sceneView));
-        JScrollBar b = p.getVerticalScrollBar();
-        b.setUnitIncrement(10);
-        extrasPanel.add(p);
-        extrasPanel.add(scene.createSatelliteView(), BorderLayout.SOUTH);
-        extrasPanel.add(buildLayoutViewControlButtons(), BorderLayout.NORTH);
-        return extrasPanel;
-    }
-
-    private JComponent buildLayoutViewControlButtons() {
-        buttonsPanel = new JToolBar();
-        buttonsPanel.setFloatable(false);
-
-        ButtonGroup group = new ButtonGroup();
-
-        JToggleButton white = new JToggleButton("On White");
-        toggleColorOnSelect(white);
-        white.putClientProperty("JButton.buttonType", "segmentedTextured");
-        white.putClientProperty("JButton.segmentPosition", "first");
-        white.addActionListener(new ActionListener() {
-            public void actionPerformed(ActionEvent e) {
-                layoutView.setBackground(Color.WHITE);
-                layoutView.setForeground(Color.BLACK);
-            }
-        });
-        group.add(white);
-        buttonsPanel.add(white);
-
-        JToggleButton black = new JToggleButton("On Black");
-        toggleColorOnSelect(black);
-        black.putClientProperty("JButton.buttonType", "segmentedTextured");
-        black.putClientProperty("JButton.segmentPosition", "last");
-        black.addActionListener(new ActionListener() {
-            public void actionPerformed(ActionEvent e) {
-                layoutView.setBackground(Color.BLACK);
-                layoutView.setForeground(Color.WHITE);
-            }
-        });
-        group.add(black);
-        buttonsPanel.add(black);
-
-        black.setSelected(true);
-
-        JCheckBox showExtras = new JCheckBox("Show Extras");
-        showExtras.putClientProperty("JComponent.sizeVariant", "small");
-        showExtras.addChangeListener(new ChangeListener() {
-            public void stateChanged(ChangeEvent e) {
-                layoutView.setShowExtras(((JCheckBox) e.getSource()).isSelected());
-            }
-        });
-        buttonsPanel.add(showExtras);
-
-        return buttonsPanel;
-    }
-
-    private void showCaptureWindow(ViewNode node, String captureParams, Image image) {
-        if (image != null) {
-            layoutView.repaint();
-
-            JFrame frame = new JFrame(captureParams);
-            JPanel panel = new JPanel(new BorderLayout());
-
-            final CaptureRenderer label = new CaptureRenderer(new ImageIcon(image), node);
-            label.setBorder(BorderFactory.createEmptyBorder(24, 24, 24, 24));
-
-            final JPanel solidColor = new JPanel(new BorderLayout());
-            solidColor.setBackground(Color.BLACK);
-            solidColor.add(label);
-
-            JToolBar toolBar = new JToolBar();
-            toolBar.setFloatable(false);
-
-            ButtonGroup group = new ButtonGroup();
-
-            JToggleButton white = new JToggleButton("On White");
-            toggleColorOnSelect(white);
-            white.putClientProperty("JButton.buttonType", "segmentedTextured");
-            white.putClientProperty("JButton.segmentPosition", "first");
-            white.addActionListener(new ActionListener() {
-                public void actionPerformed(ActionEvent e) {
-                    solidColor.setBackground(Color.WHITE);
-                }
-            });
-            group.add(white);
-            toolBar.add(white);
-
-            JToggleButton black = new JToggleButton("On Black");
-            toggleColorOnSelect(black);
-            black.putClientProperty("JButton.buttonType", "segmentedTextured");
-            black.putClientProperty("JButton.segmentPosition", "last");
-            black.addActionListener(new ActionListener() {
-                public void actionPerformed(ActionEvent e) {
-                    solidColor.setBackground(Color.BLACK);
-                }
-            });
-            group.add(black);
-            toolBar.add(black);
-
-            black.setSelected(true);
-
-            JCheckBox showExtras = new JCheckBox("Show Extras");
-            showExtras.addChangeListener(new ChangeListener() {
-                public void stateChanged(ChangeEvent e) {
-                    label.setShowExtras(((JCheckBox) e.getSource()).isSelected());
-                }
-            });
-            toolBar.add(showExtras);
-
-            panel.add(toolBar, BorderLayout.NORTH);
-            panel.add(solidColor);
-            frame.add(panel);
-
-            frame.pack();
-            frame.setResizable(false);
-            frame.setLocationRelativeTo(Workspace.this);
-            frame.setVisible(true);
-        }
-    }
-
-    private void reset() {
-        currentDevice = null;
-        currentWindow = null;
-        currentDeviceChanged();
-        windowsTableModel.setVisible(false);
-        windowsTableModel.clear();
-
-        showDevicesSelector();
-    }
-
-    public void showDevicesSelector() {
-        if (mainSplitter != null) {
-            if (pixelPerfectPanel != null) {
-                screenViewer.start();
-            }
-            mainPanel.remove(graphViewButton.isSelected() ? mainSplitter : pixelPerfectPanel);
-            mainPanel.add(deviceSelector, BorderLayout.CENTER);
-            pixelPerfectPanel = mainSplitter = null;
-            graphViewButton.setSelected(true);
-
-            hideStatusBarComponents();
-
-            saveMenuItem.setEnabled(false);
-            showDevicesMenuItem.setEnabled(false);
-            showDevicesButton.setEnabled(false);
-            displayNodeButton.setEnabled(false);
-            captureLayersButton.setEnabled(false);
-            invalidateButton.setEnabled(false);
-            dumpDisplayListButton.setEnabled(false);
-            requestLayoutButton.setEnabled(false);
-            graphViewButton.setEnabled(false);
-            pixelPerfectViewButton.setEnabled(false);
-
-            if (currentDevice != null) {
-                if (!DeviceBridge.isViewServerRunning(currentDevice)) {
-                    DeviceBridge.startViewServer(currentDevice);
-                }
-                loadWindows().execute();
-                windowsTableModel.setVisible(true);
-            }
-
-            validate();
-            repaint();
-        }
-    }
-
-    private void currentDeviceChanged() {
-        if (currentDevice == null) {
-            startButton.setEnabled(false);
-            startMenuItem.setEnabled(false);
-            stopButton.setEnabled(false);
-            stopMenuItem.setEnabled(false);
-            refreshButton.setEnabled(false);
-            saveMenuItem.setEnabled(false);
-            loadButton.setEnabled(false);
-            displayNodeButton.setEnabled(false);
-            captureLayersButton.setEnabled(false);
-            invalidateButton.setEnabled(false);
-            dumpDisplayListButton.setEnabled(false);
-            graphViewButton.setEnabled(false);
-            pixelPerfectViewButton.setEnabled(false);
-            requestLayoutButton.setEnabled(false);
-            loadMenuItem.setEnabled(false);
-        } else {
-            loadMenuItem.setEnabled(true);
-            checkForServerOnCurrentDevice();
-        }
-    }
-
-    private void checkForServerOnCurrentDevice() {
-        if (DeviceBridge.isViewServerRunning(currentDevice)) {
-            startButton.setEnabled(false);
-            startMenuItem.setEnabled(false);
-            stopButton.setEnabled(true);
-            stopMenuItem.setEnabled(true);
-            loadButton.setEnabled(true);
-            refreshButton.setEnabled(true);
-        } else {
-            startButton.setEnabled(true);
-            startMenuItem.setEnabled(true);
-            stopButton.setEnabled(false);
-            stopMenuItem.setEnabled(false);
-            loadButton.setEnabled(false);
-            refreshButton.setEnabled(false);
-        }
-    }
-
-    public void cleanupDevices() {
-        for (IDevice device : devicesTableModel.getDevices()) {
-            DeviceBridge.removeDeviceForward(device);
-        }
-    }
-
-    private static void toggleColorOnSelect(JToggleButton button) {
-        if (!OS.isMacOsX() || !OS.isLeopardOrLater()) {
-            return;
-        }
-
-        button.addChangeListener(new ChangeListener() {
-            public void stateChanged(ChangeEvent event) {
-                JToggleButton button = (JToggleButton) event.getSource();
-                if (button.isSelected()) {
-                    button.setForeground(Color.WHITE);
-                } else {
-                    button.setForeground(Color.BLACK);
-                }
-            }
-        });
-    }
-
-    private void updateFilter(DocumentEvent e) {
-        final Document document = e.getDocument();
-        try {
-            updateFilteredNodes(document.getText(0, document.getLength()));
-        } catch (BadLocationException e1) {
-            e1.printStackTrace();
-        }
-    }
-
-    private void updateFilteredNodes(String filterText) {
-        final ViewNode root = scene.getRoot();
-        try {
-            final Pattern pattern = Pattern.compile(filterText, Pattern.CASE_INSENSITIVE);
-            filterNodes(pattern, root);
-        } catch (PatternSyntaxException e) {
-            filterNodes(null, root);
-        }
-        repaint();
-    }
-
-    private void filterNodes(Pattern pattern, ViewNode root) {
-        root.filter(pattern);
-
-        for (ViewNode node : root.children) {
-            filterNodes(pattern, node);
-        }
-    }
-
-    public void beginTask() {
-        progress.setVisible(true);
-    }
-
-    public void endTask() {
-        progress.setVisible(false);
-    }
-
-    public SwingWorker<?, ?> showNodeCapture() {
-        if (scene.getFocusedObject() == null) {
-            return null;
-        }
-        return new CaptureNodeTask();
-    }
-    
-    public SwingWorker<?, ?> outputDisplayList() {
-        if (scene.getFocusedObject() == null) {
-            return null;
-        }
-        return new DumpDisplayListTask();
-    }
-
-    public SwingWorker<?, ?> captureLayers() {
-        JFileChooser chooser = new JFileChooser();
-        chooser.setFileFilter(new PsdFileFilter());
-        int choice = chooser.showSaveDialog(sceneView);
-        if (choice == JFileChooser.APPROVE_OPTION) {
-            return new CaptureLayersTask(chooser.getSelectedFile());
-        } else {
-            return null;
-        }        
-    }
-
-    public SwingWorker<?, ?> startServer() {
-        return new StartServerTask();
-    }
-
-    public SwingWorker<?, ?> stopServer() {
-        return new StopServerTask();
-    }
-
-    public SwingWorker<?, ?> loadWindows() {
-        return new LoadWindowsTask();
-    }
-
-    public SwingWorker<?, ?> loadGraph() {
-        return new LoadGraphTask();
-    }
-
-    public SwingWorker<?, ?> invalidateView() {
-        if (scene.getFocusedObject() == null) {
-            return null;
-        }
-        return new InvalidateTask();
-    }
-
-    public SwingWorker<?, ?> requestLayout() {
-        if (scene.getFocusedObject() == null) {
-            return null;
-        }
-        return new RequestLayoutTask();
-    }
-
-    public SwingWorker<?, ?> saveSceneAsImage() {
-        JFileChooser chooser = new JFileChooser();
-        chooser.setFileFilter(new PngFileFilter());
-        int choice = chooser.showSaveDialog(sceneView);
-        if (choice == JFileChooser.APPROVE_OPTION) {
-            return new SaveSceneTask(chooser.getSelectedFile());
-        } else {
-            return null;
-        }
-    }
-
-    private class InvalidateTask extends SwingWorker<Object, Void> {
-        private String captureParams;
-
-        private InvalidateTask() {
-            captureParams = scene.getFocusedObject().toString();
-            beginTask();
-        }
-
-        @Override
-        @WorkerThread
-        protected Object doInBackground() throws Exception {
-            ViewManager.invalidate(currentDevice, currentWindow, captureParams);
-            return null;
-        }
-
-        @Override
-        protected void done() {
-            endTask();
-        }
-    }
-
-    private class DumpDisplayListTask extends SwingWorker<Object, Void> {
-        private String captureParams;
-
-        private DumpDisplayListTask() {
-            captureParams = scene.getFocusedObject().toString();
-            beginTask();
-        }
-
-        @Override
-        @WorkerThread
-        protected Object doInBackground() throws Exception {
-            ViewManager.outputDisplayList(currentDevice, currentWindow, captureParams);
-            return null;
-        }
-
-        @Override
-        protected void done() {
-            endTask();
-        }
-    }
-
-    private class RequestLayoutTask extends SwingWorker<Object, Void> {
-        private String captureParams;
-
-        private RequestLayoutTask() {
-            captureParams = scene.getFocusedObject().toString();
-            beginTask();
-        }
-
-        @Override
-        @WorkerThread
-        protected Object doInBackground() throws Exception {
-            ViewManager.requestLayout(currentDevice, currentWindow, captureParams);
-            return null;
-        }
-
-        @Override
-        protected void done() {
-            endTask();
-        }
-    }
-    
-    private class CaptureLayersTask extends SwingWorker<Boolean, Void> {
-        private File file;
-
-        private CaptureLayersTask(File file) {
-            this.file = file;
-            beginTask();
-        }
-
-        @Override
-        @WorkerThread
-        protected Boolean doInBackground() throws Exception {
-            return CaptureLoader.saveLayers(currentDevice, currentWindow, file);
-        }
-
-        @Override
-        protected void done() {
-            endTask();
-        }
-    }
-
-    private class CaptureNodeTask extends SwingWorker<Image, Void> {
-        private String captureParams;
-        private ViewNode node;
-
-        private CaptureNodeTask() {
-            node = (ViewNode) scene.getFocusedObject();
-            captureParams = node.toString();
-            beginTask();
-        }
-
-        @Override
-        @WorkerThread
-        protected Image doInBackground() throws Exception {
-            node.image = CaptureLoader.loadCapture(currentDevice, currentWindow, captureParams);
-            return node.image;
-        }
-
-        @Override
-        protected void done() {
-            try {
-                Image image = get();
-                showCaptureWindow(node, captureParams, image);
-            } catch (InterruptedException e) {
-                e.printStackTrace();
-            } catch (ExecutionException e) {
-                e.printStackTrace();
-            } finally {
-                endTask();
-            }
-        }
-    }
-    
-    static class WindowsResult {
-        Window[] windows;
-        int serverVersion;
-        int protocolVersion;
-    }
-
-    private class LoadWindowsTask extends SwingWorker<WindowsResult, Void> {
-        private LoadWindowsTask() {
-            beginTask();
-        }
-
-        @Override
-        @WorkerThread
-        protected WindowsResult doInBackground() throws Exception {
-            WindowsResult r = new WindowsResult();
-            r.protocolVersion = VersionLoader.loadProtocolVersion(currentDevice);
-            r.serverVersion = VersionLoader.loadServerVersion(currentDevice);
-            r.windows = WindowsLoader.loadWindows(currentDevice,
-                    r.protocolVersion, r.serverVersion);
-            return r;
-        }
-
-        @Override
-        protected void done() {
-            try {
-                WindowsResult result = get();
-                protocolVersion = result.protocolVersion;
-                serverVersion = result.serverVersion;
-                setupProtocolDependentToolbar();
-                windowsTableModel.clear();
-                windowsTableModel.addWindows(result.windows);
-            } catch (ExecutionException e) {
-                e.printStackTrace();
-            } catch (InterruptedException e) {
-                e.printStackTrace();
-            } finally {
-                endTask();
-            }
-        }
-    }
-
-    private class StartServerTask extends SwingWorker<Object, Void> {
-        public StartServerTask() {
-            beginTask();
-        }
-
-        @Override
-        @WorkerThread
-        protected Object doInBackground() {
-            DeviceBridge.startViewServer(currentDevice);
-            return null;
-        }
-
-        @Override
-        protected void done() {
-            new LoadWindowsTask().execute();
-            windowsTableModel.setVisible(true);
-            checkForServerOnCurrentDevice();
-            endTask();
-        }
-    }
-
-    private class StopServerTask extends SwingWorker<Object, Void> {
-        public StopServerTask() {
-            beginTask();
-        }
-
-        @Override
-        @WorkerThread
-        protected Object doInBackground() {
-            DeviceBridge.stopViewServer(currentDevice);
-            return null;
-        }
-
-        @Override
-        protected void done() {
-            windowsTableModel.setVisible(false);
-            windowsTableModel.clear();
-            checkForServerOnCurrentDevice();
-            endTask();
-        }
-    }
-
-    private class LoadGraphTask extends SwingWorker<double[], Void> {
-        public LoadGraphTask() {
-            beginTask();
-        }
-
-        @Override
-        @WorkerThread
-        protected double[] doInBackground() {
-            scene = ViewHierarchyLoader.loadScene(currentDevice, currentWindow);
-            return ProfilesLoader.loadProfiles(currentDevice, currentWindow,
-                    scene.getRoot().toString());
-        }
-
-        @Override
-        protected void done() {
-            try {
-                createGraph(scene);
-                updateProfiles(get());
-            } catch (InterruptedException e) {
-                e.printStackTrace();
-            } catch (ExecutionException e) {
-                e.printStackTrace();
-            } finally {
-                endTask();
-            }
-        }
-    }
-
-    private class SaveSceneTask extends SwingWorker<Object, Void> {
-        private File file;
-
-        private SaveSceneTask(File file) {
-            this.file = file;
-            beginTask();
-        }
-
-        @Override
-        @WorkerThread
-        protected Object doInBackground() {
-            if (sceneView == null) {
-                return null;
-            }
-
-            try {
-                BufferedImage image = new BufferedImage(sceneView.getWidth(),
-                        sceneView.getHeight(), BufferedImage.TYPE_INT_RGB);
-                Graphics2D g2 = image.createGraphics();
-                sceneView.paint(g2);
-                g2.dispose();
-                ImageIO.write(image, "PNG", file);
-            } catch (IOException ex) {
-                ex.printStackTrace();
-            }
-            return null;
-        }
-
-        @Override
-        protected void done() {
-            endTask();
-        }
-    }
-
-    private class SceneFocusListener implements ObjectSceneListener {
-
-        public void objectAdded(ObjectSceneEvent arg0, Object arg1) {
-        }
-
-        public void objectRemoved(ObjectSceneEvent arg0, Object arg1) {
-        }
-
-        public void objectStateChanged(ObjectSceneEvent arg0, Object arg1,
-                ObjectState arg2, ObjectState arg3) {
-        }
-
-        public void selectionChanged(ObjectSceneEvent e, Set<Object> previousSelection,
-                Set<Object> newSelection) {
-        }
-
-        public void highlightingChanged(ObjectSceneEvent arg0, Set<Object> arg1, Set<Object> arg2) {
-        }
-
-        public void hoverChanged(ObjectSceneEvent arg0, Object arg1, Object arg2) {
-        }
-
-        public void focusChanged(ObjectSceneEvent e, Object oldFocus, Object newFocus) {
-            displayNodeButton.setEnabled(true);
-            invalidateButton.setEnabled(true);
-            dumpDisplayListButton.setEnabled(true);
-            requestLayoutButton.setEnabled(true);
-
-            Set<Object> selection = new HashSet<Object>();
-            selection.add(newFocus);
-            scene.setSelectedObjects(selection);
-
-            showProperties((ViewNode) newFocus);
-            layoutView.repaint();
-        }
-    }
-
-    private class NodeClickListener extends MouseAdapter {
-        @Override
-        public void mouseClicked(MouseEvent e) {
-            if (e.getClickCount() == 2) {
-                showNodeCapture().execute();
-            }
-        }
-    }
-
-    private class WheelZoomListener implements MouseWheelListener {
-        public void mouseWheelMoved(MouseWheelEvent e) {
-            if (zoomSlider != null) {
-                int val = zoomSlider.getValue();
-                val -= e.getWheelRotation() * 10;
-                zoomSlider.setValue(val);
-            }
-        }
-    }
-    private class DevicesTableModel extends DefaultTableModel implements
-            AndroidDebugBridge.IDeviceChangeListener {
-
-        private ArrayList<IDevice> devices;
-
-        private DevicesTableModel() {
-            devices = new ArrayList<IDevice>();
-        }
-
-        @Override
-        public int getColumnCount() {
-            return 1;
-        }
-
-        @Override
-        public boolean isCellEditable(int row, int column) {
-            return false;
-        }
-
-        @Override
-        public Object getValueAt(int row, int column) {
-            return devices.get(row);
-        }
-
-        @Override
-        public String getColumnName(int column) {
-            return "Devices";
-        }
-
-        @WorkerThread
-        public void deviceConnected(final IDevice device) {
-            DeviceBridge.setupDeviceForward(device);
-
-            SwingUtilities.invokeLater(new Runnable() {
-                public void run() {
-                    addDevice(device);
-                }
-            });
-        }
-
-        @WorkerThread
-        public void deviceDisconnected(final IDevice device) {
-            DeviceBridge.removeDeviceForward(device);
-
-            SwingUtilities.invokeLater(new Runnable() {
-                public void run() {
-                    removeDevice(device);
-                }
-            });
-        }
-
-        public void addDevice(IDevice device) {
-            if (!devices.contains(device)) {
-                devices.add(device);
-                fireTableDataChanged();
-            }
-        }
-
-        public void removeDevice(IDevice device) {
-            if (device.equals(currentDevice)) {
-                reset();
-            }
-
-            if (devices.contains(device)) {
-                devices.remove(device);
-                fireTableDataChanged();
-            }
-        }
-
-        @WorkerThread
-        public void deviceChanged(IDevice device, int changeMask) {
-            if ((changeMask & IDevice.CHANGE_STATE) != 0 &&
-                    device.isOnline()) {
-                // if the device state changed and it's now online, we set up its port forwarding.
-                DeviceBridge.setupDeviceForward(device);
-            } else if (device == currentDevice && (changeMask & IDevice.CHANGE_CLIENT_LIST) != 0) {
-                // if the changed device is the current one and the client list changed, we update
-                // the UI.
-                loadWindows().execute();
-                windowsTableModel.setVisible(true);
-            }
-        }
-
-        @Override
-        public int getRowCount() {
-            return devices == null ? 0 : devices.size();
-        }
-
-        public IDevice getDevice(int index) {
-            return index < devices.size() ? devices.get(index) : null;
-        }
-
-        public IDevice[] getDevices() {
-            return devices.toArray(new IDevice[devices.size()]);
-        }
-    }
-
-    private static class WindowsTableModel extends DefaultTableModel {
-        private ArrayList<Window> windows;
-        private boolean visible;
-
-        private WindowsTableModel() {
-            windows = new ArrayList<Window>();
-            windows.add(Window.FOCUSED_WINDOW);
-        }
-
-        @Override
-        public int getColumnCount() {
-            return 1;
-        }
-
-        @Override
-        public boolean isCellEditable(int row, int column) {
-            return false;
-        }
-
-        @Override
-        public String getColumnName(int column) {
-            return "Windows";
-        }
-
-        @Override
-        public Object getValueAt(int row, int column) {
-            return windows.get(row);
-        }
-
-        @Override
-        public int getRowCount() {
-            return !visible || windows == null ? 0 : windows.size();
-        }
-
-        public void setVisible(boolean visible) {
-            this.visible = visible;
-            fireTableDataChanged();
-        }
-
-        public void addWindow(Window window) {
-            windows.add(window);
-            fireTableDataChanged();
-        }
-
-        public void addWindows(Window[] windowsList) {
-            //noinspection ManualArrayToCollectionCopy
-            for (Window window : windowsList) {
-                windows.add(window);
-            }
-            fireTableDataChanged();
-        }
-
-        public void clear() {
-            windows.clear();
-            windows.add(Window.FOCUSED_WINDOW);
-        }
-
-        public Window getWindow(int index) {
-            return windows.get(index);
-        }
-    }
-
-    private class DeviceSelectedListener implements ListSelectionListener {
-        public void valueChanged(ListSelectionEvent event) {
-            if (event.getValueIsAdjusting()) {
-                return;
-            }
-
-            int row = devices.getSelectedRow();
-            if (row >= 0) {
-                currentDevice = devicesTableModel.getDevice(row);
-                currentDeviceChanged();
-                if (currentDevice != null) {
-                    if (!DeviceBridge.isViewServerRunning(currentDevice)) {
-                        DeviceBridge.startViewServer(currentDevice);
-                        checkForServerOnCurrentDevice();
-                    }
-                    loadWindows().execute();
-                    windowsTableModel.setVisible(true);
-                }
-            } else {
-                currentDevice = null;
-                currentDeviceChanged();
-                windowsTableModel.setVisible(false);
-                windowsTableModel.clear();
-            }
-        }
-    }
-
-    private class WindowSelectedListener implements ListSelectionListener {
-        public void valueChanged(ListSelectionEvent event) {
-            if (event.getValueIsAdjusting()) {
-                return;
-            }
-
-            int row = windows.getSelectedRow();
-            if (row >= 0) {
-                currentWindow = windowsTableModel.getWindow(row);
-            } else {
-                currentWindow = Window.FOCUSED_WINDOW;
-            }
-        }
-    }
-
-    private static class ViewsTreeCellRenderer extends DefaultTreeCellRenderer {
-        public Component getTreeCellRendererComponent(JTree tree, Object value, boolean selected,
-                boolean expanded, boolean leaf, int row, boolean hasFocus) {
-
-            final String name = ((ViewNode) value).name;
-            value = name.substring(name.lastIndexOf('.') + 1, name.lastIndexOf('@'));
-            return super.getTreeCellRendererComponent(tree, value, selected, expanded,
-                    leaf, row, hasFocus);
-        }
-    }
-}
diff --git a/hierarchyviewer/src/com/android/hierarchyviewer/ui/action/BackgroundAction.java b/hierarchyviewer/src/com/android/hierarchyviewer/ui/action/BackgroundAction.java
deleted file mode 100644
index b2046fd..0000000
--- a/hierarchyviewer/src/com/android/hierarchyviewer/ui/action/BackgroundAction.java
+++ /dev/null
@@ -1,28 +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.hierarchyviewer.ui.action;
-
-import javax.swing.AbstractAction;
-import javax.swing.SwingWorker;
-
-public abstract class BackgroundAction extends AbstractAction {
-    protected void executeBackgroundTask(SwingWorker<?, ?> worker) {
-        if (worker != null) {
-            worker.execute();
-        }
-    }
-}
diff --git a/hierarchyviewer/src/com/android/hierarchyviewer/ui/action/CaptureLayersAction.java b/hierarchyviewer/src/com/android/hierarchyviewer/ui/action/CaptureLayersAction.java
deleted file mode 100644
index 2fff041..0000000
--- a/hierarchyviewer/src/com/android/hierarchyviewer/ui/action/CaptureLayersAction.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.hierarchyviewer.ui.action;
-
-import com.android.hierarchyviewer.ui.Workspace;
-
-import javax.swing.KeyStroke;
-import java.awt.event.KeyEvent;
-import java.awt.event.ActionEvent;
-import java.awt.Toolkit;
-
-public class CaptureLayersAction extends BackgroundAction {
-    public static final String ACTION_NAME = "captureLayers";
-    private Workspace mWorkspace;
-
-    public CaptureLayersAction(Workspace workspace) {
-        putValue(NAME, "Capture PSD");
-        putValue(SHORT_DESCRIPTION, "Capture PSD");
-        putValue(LONG_DESCRIPTION, "Capture current window into a Photoshop PSD file");
-        putValue(ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_P,
-                Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()));
-        this.mWorkspace = workspace;
-    }
-
-    public void actionPerformed(ActionEvent e) {
-        executeBackgroundTask(mWorkspace.captureLayers());
-    }
-}
diff --git a/hierarchyviewer/src/com/android/hierarchyviewer/ui/action/CaptureNodeAction.java b/hierarchyviewer/src/com/android/hierarchyviewer/ui/action/CaptureNodeAction.java
deleted file mode 100644
index a8aee3c..0000000
--- a/hierarchyviewer/src/com/android/hierarchyviewer/ui/action/CaptureNodeAction.java
+++ /dev/null
@@ -1,42 +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.hierarchyviewer.ui.action;
-
-import com.android.hierarchyviewer.ui.Workspace;
-
-import javax.swing.KeyStroke;
-import java.awt.event.KeyEvent;
-import java.awt.event.ActionEvent;
-import java.awt.Toolkit;
-
-public class CaptureNodeAction extends BackgroundAction {
-    public static final String ACTION_NAME = "captureNode";
-    private Workspace mWorkspace;
-
-    public CaptureNodeAction(Workspace workspace) {
-        putValue(NAME, "Display View");
-        putValue(SHORT_DESCRIPTION, "Display View");
-        putValue(LONG_DESCRIPTION, "Display View");
-        putValue(ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_D,
-                Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()));
-        this.mWorkspace = workspace;
-    }
-
-    public void actionPerformed(ActionEvent e) {
-        executeBackgroundTask(mWorkspace.showNodeCapture());
-    }
-}
diff --git a/hierarchyviewer/src/com/android/hierarchyviewer/ui/action/DumpDisplayListAction.java b/hierarchyviewer/src/com/android/hierarchyviewer/ui/action/DumpDisplayListAction.java
deleted file mode 100644
index 3e66794..0000000
--- a/hierarchyviewer/src/com/android/hierarchyviewer/ui/action/DumpDisplayListAction.java
+++ /dev/null
@@ -1,39 +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.hierarchyviewer.ui.action;
-
-import com.android.hierarchyviewer.ui.Workspace;
-
-import javax.swing.KeyStroke;
-import java.awt.event.KeyEvent;
-import java.awt.event.ActionEvent;
-import java.awt.Toolkit;
-
-public class DumpDisplayListAction extends BackgroundAction {
-    public static final String ACTION_NAME = "dumpDisplayList";
-    private Workspace mWorkspace;
-
-    public DumpDisplayListAction(Workspace workspace) {
-        putValue(NAME, "Dump DisplayList");
-        putValue(SHORT_DESCRIPTION, "Dump DisplayList");
-        putValue(LONG_DESCRIPTION, "Dump DisplayList");
-        this.mWorkspace = workspace;
-    }
-
-    public void actionPerformed(ActionEvent e) {
-        executeBackgroundTask(mWorkspace.outputDisplayList());
-    }
-}
diff --git a/hierarchyviewer/src/com/android/hierarchyviewer/ui/action/ExitAction.java b/hierarchyviewer/src/com/android/hierarchyviewer/ui/action/ExitAction.java
deleted file mode 100644
index e5aaed5..0000000
--- a/hierarchyviewer/src/com/android/hierarchyviewer/ui/action/ExitAction.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.hierarchyviewer.ui.action;
-
-import com.android.hierarchyviewer.ui.Workspace;
-import com.android.hierarchyviewer.device.DeviceBridge;
-
-import javax.swing.AbstractAction;
-import javax.swing.KeyStroke;
-import java.awt.event.KeyEvent;
-import java.awt.event.ActionEvent;
-import java.awt.Toolkit;
-
-public class ExitAction extends AbstractAction {
-    public static final String ACTION_NAME = "exit";
-    private Workspace mWorkspace;
-
-    public ExitAction(Workspace workspace) {
-        putValue(NAME, "Quit");
-        putValue(SHORT_DESCRIPTION, "Quit");
-        putValue(LONG_DESCRIPTION, "Quit");
-        putValue(MNEMONIC_KEY, KeyEvent.VK_Q);
-        putValue(ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_Q,
-                Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()));
-        this.mWorkspace = workspace;
-    }
-
-    public void actionPerformed(ActionEvent e) {
-        mWorkspace.cleanupDevices();
-        mWorkspace.dispose();
-        DeviceBridge.terminate();
-        System.exit(0);
-    }
-}
diff --git a/hierarchyviewer/src/com/android/hierarchyviewer/ui/action/InvalidateAction.java b/hierarchyviewer/src/com/android/hierarchyviewer/ui/action/InvalidateAction.java
deleted file mode 100644
index 7767cda..0000000
--- a/hierarchyviewer/src/com/android/hierarchyviewer/ui/action/InvalidateAction.java
+++ /dev/null
@@ -1,42 +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.hierarchyviewer.ui.action;
-
-import com.android.hierarchyviewer.ui.Workspace;
-
-import javax.swing.KeyStroke;
-import java.awt.event.KeyEvent;
-import java.awt.event.ActionEvent;
-import java.awt.Toolkit;
-
-public class InvalidateAction extends BackgroundAction {
-    public static final String ACTION_NAME = "invalidate";
-    private Workspace mWorkspace;
-
-    public InvalidateAction(Workspace workspace) {
-        putValue(NAME, "Invalidate");
-        putValue(SHORT_DESCRIPTION, "Invalidate");
-        putValue(LONG_DESCRIPTION, "Invalidate");
-        putValue(ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_I,
-                Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()));
-        this.mWorkspace = workspace;
-    }
-
-    public void actionPerformed(ActionEvent e) {
-        executeBackgroundTask(mWorkspace.invalidateView());
-    }
-}
diff --git a/hierarchyviewer/src/com/android/hierarchyviewer/ui/action/LoadGraphAction.java b/hierarchyviewer/src/com/android/hierarchyviewer/ui/action/LoadGraphAction.java
deleted file mode 100644
index 42c8b8e..0000000
--- a/hierarchyviewer/src/com/android/hierarchyviewer/ui/action/LoadGraphAction.java
+++ /dev/null
@@ -1,43 +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.hierarchyviewer.ui.action;
-
-import com.android.hierarchyviewer.ui.Workspace;
-
-import javax.swing.KeyStroke;
-import java.awt.event.KeyEvent;
-import java.awt.event.ActionEvent;
-import java.awt.Toolkit;
-
-public class LoadGraphAction extends BackgroundAction {
-    public static final String ACTION_NAME = "loadGraph";
-    private Workspace mWorkspace;
-
-    public LoadGraphAction(Workspace workspace) {
-        putValue(NAME, "Load View Hierarchy");
-        putValue(SHORT_DESCRIPTION, "Load");
-        putValue(LONG_DESCRIPTION, "Load View Hierarchy");
-        putValue(MNEMONIC_KEY, KeyEvent.VK_L);
-        putValue(ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_L,
-                Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()));
-        this.mWorkspace = workspace;
-    }
-
-    public void actionPerformed(ActionEvent e) {
-        executeBackgroundTask(mWorkspace.loadGraph());
-    }
-}
diff --git a/hierarchyviewer/src/com/android/hierarchyviewer/ui/action/RefreshWindowsAction.java b/hierarchyviewer/src/com/android/hierarchyviewer/ui/action/RefreshWindowsAction.java
deleted file mode 100644
index bcb7ea7..0000000
--- a/hierarchyviewer/src/com/android/hierarchyviewer/ui/action/RefreshWindowsAction.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.hierarchyviewer.ui.action;
-
-import com.android.hierarchyviewer.ui.Workspace;
-
-import javax.swing.KeyStroke;
-import java.awt.event.KeyEvent;
-import java.awt.event.ActionEvent;
-
-public class RefreshWindowsAction extends BackgroundAction {
-    public static final String ACTION_NAME = "refreshWindows";
-    private Workspace mWorkspace;
-
-    public RefreshWindowsAction(Workspace workspace) {
-        putValue(NAME, "Refresh Windows");
-        putValue(SHORT_DESCRIPTION, "Refresh");
-        putValue(LONG_DESCRIPTION, "Refresh Windows");
-        putValue(ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_F7, 0));
-        this.mWorkspace = workspace;
-    }
-
-    public void actionPerformed(ActionEvent e) {
-        executeBackgroundTask(mWorkspace.loadWindows());
-    }
-}
diff --git a/hierarchyviewer/src/com/android/hierarchyviewer/ui/action/RequestLayoutAction.java b/hierarchyviewer/src/com/android/hierarchyviewer/ui/action/RequestLayoutAction.java
deleted file mode 100644
index 6fc2832..0000000
--- a/hierarchyviewer/src/com/android/hierarchyviewer/ui/action/RequestLayoutAction.java
+++ /dev/null
@@ -1,42 +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.hierarchyviewer.ui.action;
-
-import com.android.hierarchyviewer.ui.Workspace;
-
-import javax.swing.KeyStroke;
-import java.awt.event.KeyEvent;
-import java.awt.event.ActionEvent;
-import java.awt.Toolkit;
-
-public class RequestLayoutAction extends BackgroundAction {
-    public static final String ACTION_NAME = "requestLayout";
-    private Workspace mWorkspace;
-
-    public RequestLayoutAction(Workspace workspace) {
-        putValue(NAME, "Request Layout");
-        putValue(SHORT_DESCRIPTION, "Request Layout");
-        putValue(LONG_DESCRIPTION, "Request Layout");
-        putValue(ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_R,
-                Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()));
-        this.mWorkspace = workspace;
-    }
-
-    public void actionPerformed(ActionEvent e) {
-        executeBackgroundTask(mWorkspace.requestLayout());
-    }
-}
diff --git a/hierarchyviewer/src/com/android/hierarchyviewer/ui/action/SaveSceneAction.java b/hierarchyviewer/src/com/android/hierarchyviewer/ui/action/SaveSceneAction.java
deleted file mode 100644
index 7c7a8a9..0000000
--- a/hierarchyviewer/src/com/android/hierarchyviewer/ui/action/SaveSceneAction.java
+++ /dev/null
@@ -1,43 +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.hierarchyviewer.ui.action;
-
-import com.android.hierarchyviewer.ui.Workspace;
-
-import javax.swing.KeyStroke;
-import java.awt.event.KeyEvent;
-import java.awt.event.ActionEvent;
-import java.awt.Toolkit;
-
-public class SaveSceneAction extends BackgroundAction {
-    public static final String ACTION_NAME = "saveScene";
-    private Workspace mWorkspace;
-
-    public SaveSceneAction(Workspace workspace) {
-        mWorkspace = workspace;
-        putValue(NAME, "Save as PNG...");
-        putValue(SHORT_DESCRIPTION, "Save");
-        putValue(LONG_DESCRIPTION, "Save as PNG...");
-        putValue(MNEMONIC_KEY, KeyEvent.VK_S);
-        putValue(ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_S,
-                Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()));
-    }
-
-    public void actionPerformed(ActionEvent e) {
-        executeBackgroundTask(mWorkspace.saveSceneAsImage());
-    }
-}
diff --git a/hierarchyviewer/src/com/android/hierarchyviewer/ui/action/ShowDevicesAction.java b/hierarchyviewer/src/com/android/hierarchyviewer/ui/action/ShowDevicesAction.java
deleted file mode 100644
index a91ab7a..0000000
--- a/hierarchyviewer/src/com/android/hierarchyviewer/ui/action/ShowDevicesAction.java
+++ /dev/null
@@ -1,44 +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.hierarchyviewer.ui.action;
-
-import com.android.hierarchyviewer.ui.Workspace;
-
-import javax.swing.AbstractAction;
-import javax.swing.KeyStroke;
-import java.awt.event.KeyEvent;
-import java.awt.event.ActionEvent;
-import java.awt.Toolkit;
-
-public class ShowDevicesAction extends AbstractAction {
-    public static final String ACTION_NAME = "showDevices";
-    private Workspace mWorkspace;
-
-    public ShowDevicesAction(Workspace workspace) {
-        putValue(NAME, "Devices");
-        putValue(SHORT_DESCRIPTION, "Devices");
-        putValue(LONG_DESCRIPTION, "Show Devices");
-        putValue(MNEMONIC_KEY, KeyEvent.VK_D);
-        putValue(ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_D,
-                Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()));
-        this.mWorkspace = workspace;
-    }
-
-    public void actionPerformed(ActionEvent e) {
-        mWorkspace.showDevicesSelector();
-    }
-}
diff --git a/hierarchyviewer/src/com/android/hierarchyviewer/ui/action/StartServerAction.java b/hierarchyviewer/src/com/android/hierarchyviewer/ui/action/StartServerAction.java
deleted file mode 100644
index ccb6ae0..0000000
--- a/hierarchyviewer/src/com/android/hierarchyviewer/ui/action/StartServerAction.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.hierarchyviewer.ui.action;
-
-import com.android.hierarchyviewer.ui.Workspace;
-
-import javax.swing.KeyStroke;
-import java.awt.event.KeyEvent;
-import java.awt.event.ActionEvent;
-
-public class StartServerAction extends BackgroundAction {
-    public static final String ACTION_NAME = "startServer";
-    private Workspace mWorkspace;
-
-    public StartServerAction(Workspace workspace) {
-        putValue(NAME, "Start Server");
-        putValue(SHORT_DESCRIPTION, "Start");
-        putValue(LONG_DESCRIPTION, "Start Server");
-        putValue(ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_F5, 0));
-        this.mWorkspace = workspace;
-    }
-
-    public void actionPerformed(ActionEvent e) {
-        executeBackgroundTask(mWorkspace.startServer());
-    }
-}
diff --git a/hierarchyviewer/src/com/android/hierarchyviewer/ui/action/StopServerAction.java b/hierarchyviewer/src/com/android/hierarchyviewer/ui/action/StopServerAction.java
deleted file mode 100644
index ac76e14..0000000
--- a/hierarchyviewer/src/com/android/hierarchyviewer/ui/action/StopServerAction.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.hierarchyviewer.ui.action;
-
-import com.android.hierarchyviewer.ui.Workspace;
-
-import javax.swing.KeyStroke;
-import java.awt.event.KeyEvent;
-import java.awt.event.ActionEvent;
-
-public class StopServerAction extends BackgroundAction {
-    public static final String ACTION_NAME = "stopServer";
-    private Workspace mWorkspace;
-
-    public StopServerAction(Workspace workspace) {
-        putValue(NAME, "Stop Server");
-        putValue(SHORT_DESCRIPTION, "Stop");
-        putValue(LONG_DESCRIPTION, "Stop Server");
-        putValue(ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_F6, 0));
-        this.mWorkspace = workspace;
-    }
-
-    public void actionPerformed(ActionEvent e) {
-        executeBackgroundTask(mWorkspace.stopServer());
-    }
-}
diff --git a/hierarchyviewer/src/com/android/hierarchyviewer/ui/model/ProfilesTableModel.java b/hierarchyviewer/src/com/android/hierarchyviewer/ui/model/ProfilesTableModel.java
deleted file mode 100644
index fcbe6b5..0000000
--- a/hierarchyviewer/src/com/android/hierarchyviewer/ui/model/ProfilesTableModel.java
+++ /dev/null
@@ -1,68 +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.hierarchyviewer.ui.model;
-
-import javax.swing.table.DefaultTableModel;
-import java.text.NumberFormat;
-
-public class ProfilesTableModel extends DefaultTableModel {
-    private static final String[] NAMES = { "measure", "layout", "draw" };
-
-    private final double[] profiles;
-    private final NumberFormat formatter;
-
-    public ProfilesTableModel(double[] profiles) {
-        this.profiles = profiles;
-        formatter = NumberFormat.getNumberInstance();
-    }
-
-    @Override
-    public int getRowCount() {
-        return profiles == null ? 0 : profiles.length;
-    }
-
-    @Override
-    public Object getValueAt(int row, int column) {
-        if (profiles == null) return "";
-
-        if (column == 0) {
-            return NAMES[row];
-        }
-
-
-        return formatter.format(profiles[row]) + "";
-    }
-
-    @Override
-    public int getColumnCount() {
-        return 2;
-    }
-
-    @Override
-    public String getColumnName(int column) {
-        return column == 0 ? "Operation" : "Duration (ms)";
-    }
-
-    @Override
-    public boolean isCellEditable(int arg0, int arg1) {
-        return false;
-    }
-
-    @Override
-    public void setValueAt(Object arg0, int arg1, int arg2) {
-    }
-}
diff --git a/hierarchyviewer/src/com/android/hierarchyviewer/ui/model/PropertiesTableModel.java b/hierarchyviewer/src/com/android/hierarchyviewer/ui/model/PropertiesTableModel.java
deleted file mode 100644
index cc4f7e3..0000000
--- a/hierarchyviewer/src/com/android/hierarchyviewer/ui/model/PropertiesTableModel.java
+++ /dev/null
@@ -1,92 +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.hierarchyviewer.ui.model;
-
-import com.android.hierarchyviewer.scene.ViewNode;
-
-import javax.swing.table.DefaultTableModel;
-import java.util.List;
-import java.util.ArrayList;
-
-public class PropertiesTableModel extends DefaultTableModel {
-    private List<ViewNode.Property> properties;
-    private List<ViewNode.Property> privateProperties = new ArrayList<ViewNode.Property>();
-
-    public PropertiesTableModel(ViewNode node) {
-        properties = node.properties;
-        loadPrivateProperties(node);
-    }
-
-    private void loadPrivateProperties(ViewNode node) {
-        int x = node.left;
-        int y = node.top;
-        ViewNode p = node.parent;
-        while (p != null) {
-            x += p.left - p.scrollX;
-            y += p.top - p.scrollY;
-            p = p.parent;
-        }
-
-        ViewNode.Property property = new ViewNode.Property();
-        property.name = "absolute_x";
-        property.value = String.valueOf(x);
-        privateProperties.add(property);
-
-        property = new ViewNode.Property();
-        property.name = "absolute_y";
-        property.value = String.valueOf(y);
-        privateProperties.add(property);
-    }
-
-    @Override
-    public int getRowCount() {
-        return (privateProperties == null ? 0 : privateProperties.size()) +
-                (properties == null ? 0 : properties.size());
-    }
-
-    @Override
-    public Object getValueAt(int row, int column) {
-        ViewNode.Property property;
-
-        if (row < privateProperties.size()) {
-            property = privateProperties.get(row);
-        } else {
-            property = properties.get(row - privateProperties.size());
-        }
-
-        return column == 0 ? property.name : property.value;
-    }
-
-    @Override
-    public int getColumnCount() {
-        return 2;
-    }
-
-    @Override
-    public String getColumnName(int column) {
-        return column == 0 ? "Property" : "Value";
-    }
-
-    @Override
-    public boolean isCellEditable(int arg0, int arg1) {
-        return false;
-    }
-
-    @Override
-    public void setValueAt(Object arg0, int arg1, int arg2) {
-    }
-}
diff --git a/hierarchyviewer/src/com/android/hierarchyviewer/ui/model/ViewsTreeModel.java b/hierarchyviewer/src/com/android/hierarchyviewer/ui/model/ViewsTreeModel.java
deleted file mode 100644
index f3a07f8..0000000
--- a/hierarchyviewer/src/com/android/hierarchyviewer/ui/model/ViewsTreeModel.java
+++ /dev/null
@@ -1,62 +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.hierarchyviewer.ui.model;
-
-import com.android.hierarchyviewer.scene.ViewNode;
-
-import javax.swing.tree.TreeModel;
-import javax.swing.tree.TreePath;
-import javax.swing.event.TreeModelListener;
-
-public class ViewsTreeModel implements TreeModel {
-    private final ViewNode root;
-
-    public ViewsTreeModel(ViewNode root) {
-        this.root = root;
-    }
-
-    public Object getRoot() {
-        return root;
-    }
-
-    public Object getChild(Object o, int i) {
-        return ((ViewNode) o).children.get(i);
-    }
-
-    public int getChildCount(Object o) {
-        return ((ViewNode) o).children.size();
-    }
-
-    public boolean isLeaf(Object child) {
-        ViewNode node = (ViewNode) child;
-        return node.children == null || node.children.size() == 0;
-    }
-
-    public void valueForPathChanged(TreePath treePath, Object child) {
-    }
-
-    public int getIndexOfChild(Object parent, Object child) {
-        //noinspection SuspiciousMethodCalls
-        return ((ViewNode) parent).children.indexOf(child);
-    }
-
-    public void addTreeModelListener(TreeModelListener treeModelListener) {
-    }
-
-    public void removeTreeModelListener(TreeModelListener treeModelListener) {
-    }
-}
diff --git a/hierarchyviewer/src/com/android/hierarchyviewer/ui/util/IconLoader.java b/hierarchyviewer/src/com/android/hierarchyviewer/ui/util/IconLoader.java
deleted file mode 100644
index ef73956..0000000
--- a/hierarchyviewer/src/com/android/hierarchyviewer/ui/util/IconLoader.java
+++ /dev/null
@@ -1,49 +0,0 @@
-package com.android.hierarchyviewer.ui.util;
-
-import javax.swing.Icon;
-import javax.swing.ImageIcon;
-import javax.imageio.ImageIO;
-import java.io.IOException;
-import java.awt.image.BufferedImage;
-import java.awt.Graphics;
-import java.awt.GraphicsEnvironment;
-import java.awt.GraphicsConfiguration;
-
-public class IconLoader {
-    public static Icon load(Class<?> klass, String path) {
-        try {
-            return new ImageIcon(ImageIO.read(klass.getResourceAsStream(path)));
-        } catch (IOException e) {
-            e.printStackTrace();
-        }
-        return null;
-    }
-
-    private static GraphicsConfiguration getGraphicsConfiguration() {
-        GraphicsEnvironment environment = GraphicsEnvironment.getLocalGraphicsEnvironment();
-        return environment.getDefaultScreenDevice().getDefaultConfiguration();
-    }
-
-    private static boolean isHeadless() {
-        return GraphicsEnvironment.isHeadless();
-    }
-
-    public static BufferedImage toCompatibleImage(BufferedImage image) {
-        if (isHeadless()) {
-            return image;
-        }
-
-        if (image.getColorModel().equals(
-                getGraphicsConfiguration().getColorModel())) {
-            return image;
-        }
-
-        BufferedImage compatibleImage = getGraphicsConfiguration().createCompatibleImage(
-                    image.getWidth(), image.getHeight(), image.getTransparency());
-        Graphics g = compatibleImage.getGraphics();
-        g.drawImage(image, 0, 0, null);
-        g.dispose();
-
-        return compatibleImage;
-    }
-}
diff --git a/hierarchyviewer/src/com/android/hierarchyviewer/ui/util/PngFileFilter.java b/hierarchyviewer/src/com/android/hierarchyviewer/ui/util/PngFileFilter.java
deleted file mode 100644
index 5d6472d..0000000
--- a/hierarchyviewer/src/com/android/hierarchyviewer/ui/util/PngFileFilter.java
+++ /dev/null
@@ -1,32 +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.hierarchyviewer.ui.util;
-
-import javax.swing.filechooser.FileFilter;
-import java.io.File;
-
-public class PngFileFilter extends FileFilter {
-    @Override
-    public boolean accept(File f) {
-        return f.isDirectory() || f.getName().toLowerCase().endsWith(".png");
-    }
-
-    @Override
-    public String getDescription() {
-        return "PNG Image (*.png)";
-    }
-}
diff --git a/hierarchyviewer/src/com/android/hierarchyviewer/ui/util/PsdFile.java b/hierarchyviewer/src/com/android/hierarchyviewer/ui/util/PsdFile.java
deleted file mode 100644
index 3768e41..0000000
--- a/hierarchyviewer/src/com/android/hierarchyviewer/ui/util/PsdFile.java
+++ /dev/null
@@ -1,442 +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.hierarchyviewer.ui.util;
-
-import java.awt.Graphics2D;
-import java.awt.Point;
-import java.awt.image.BufferedImage;
-import java.io.BufferedOutputStream;
-import java.io.DataOutputStream;
-import java.io.IOException;
-import java.io.OutputStream;
-import java.io.UnsupportedEncodingException;
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * Writes PSD file.
- * 
- * Supports only 8 bits, RGB images with 4 channels.
- */
-public class PsdFile {
-    private final Header mHeader;
-    private final ColorMode mColorMode;
-    private final ImageResources mImageResources;
-    private final LayersMasksInfo mLayersMasksInfo;
-    private final LayersInfo mLayersInfo;
-
-    private final BufferedImage mMergedImage;
-    private final Graphics2D mGraphics;
-
-    public PsdFile(int width, int height) {
-        mHeader = new Header(width, height);
-        mColorMode = new ColorMode();
-        mImageResources = new ImageResources();
-        mLayersMasksInfo = new LayersMasksInfo();
-        mLayersInfo = new LayersInfo();
-
-        mMergedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
-        mGraphics = mMergedImage.createGraphics();
-    }
-
-    public void addLayer(String name, BufferedImage image, Point offset) {
-        addLayer(name, image, offset, true);
-    }
-    
-    public void addLayer(String name, BufferedImage image, Point offset, boolean visible) {
-        mLayersInfo.addLayer(name, image, offset, visible);
-        if (visible) mGraphics.drawImage(image, null, offset.x, offset.y);
-    }
-    
-    public void write(OutputStream stream) {
-        mLayersMasksInfo.setLayersInfo(mLayersInfo);
-
-        DataOutputStream out = new DataOutputStream(new BufferedOutputStream(stream));
-        try {
-            mHeader.write(out);
-            out.flush();
-
-            mColorMode.write(out);
-            mImageResources.write(out);
-            mLayersMasksInfo.write(out);
-            mLayersInfo.write(out);
-            out.flush();
-
-            mLayersInfo.writeImageData(out);
-            out.flush();
-            
-            writeImage(mMergedImage, out, false);
-            out.flush();
-        } catch (IOException e) {
-            e.printStackTrace();
-        } finally {
-            try {
-                out.close();
-            } catch (IOException e) {
-                e.printStackTrace();
-            }
-        }
-    }
-
-    private static void writeImage(BufferedImage image, DataOutputStream out, boolean split)
-            throws IOException {
-
-        if (!split) out.writeShort(0);
-        
-        int width = image.getWidth();
-        int height = image.getHeight();
-
-        final int length = width * height;
-        int[] pixels = new int[length];
-
-        image.getData().getDataElements(0, 0, width, height, pixels);
-
-        byte[] a = new byte[length];
-        byte[] r = new byte[length];
-        byte[] g = new byte[length];
-        byte[] b = new byte[length];
-
-        for (int i = 0; i < length; i++) {
-            final int pixel = pixels[i];
-            a[i] = (byte) ((pixel >> 24) & 0xFF);
-            r[i] = (byte) ((pixel >> 16) & 0xFF);
-            g[i] = (byte) ((pixel >>  8) & 0xFF);
-            b[i] = (byte)  (pixel        & 0xFF);
-        }
-
-        if (split) out.writeShort(0);
-        if (split) out.write(a);
-        if (split) out.writeShort(0);
-        out.write(r);
-        if (split) out.writeShort(0);
-        out.write(g);
-        if (split) out.writeShort(0);
-        out.write(b);
-        if (!split) out.write(a);
-    }
-
-    @SuppressWarnings({"UnusedDeclaration"})
-    static class Header {
-        static final short MODE_BITMAP = 0;
-        static final short MODE_GRAYSCALE = 1;
-        static final short MODE_INDEXED = 2;
-        static final short MODE_RGB = 3;
-        static final short MODE_CMYK = 4;
-        static final short MODE_MULTI_CHANNEL = 7;
-        static final short MODE_DUOTONE = 8;
-        static final short MODE_LAB = 9;
-
-        final byte[] mSignature = "8BPS".getBytes();
-        final short mVersion = 1;
-        final byte[] mReserved = new byte[6];
-        final short mChannelCount = 4;
-        final int mHeight;
-        final int mWidth;
-        final short mDepth = 8;
-        final short mMode = MODE_RGB;
-        
-        Header(int width, int height) {
-            mWidth = width;
-            mHeight = height;
-        }
-
-        void write(DataOutputStream out) throws IOException {
-            out.write(mSignature);
-            out.writeShort(mVersion);
-            out.write(mReserved);
-            out.writeShort(mChannelCount);
-            out.writeInt(mHeight);
-            out.writeInt(mWidth);
-            out.writeShort(mDepth);
-            out.writeShort(mMode);
-        }
-    }
-
-    // Unused at the moment
-    @SuppressWarnings({"UnusedDeclaration"})
-    static class ColorMode {
-        final int mLength = 0;
-        
-        void write(DataOutputStream out) throws IOException {
-            out.writeInt(mLength);
-        }
-    }
-    
-    // Unused at the moment
-    @SuppressWarnings({"UnusedDeclaration"})
-    static class ImageResources {
-        static final short RESOURCE_RESOLUTION_INFO = 0x03ED;
-        
-        int mLength = 0;
-
-        final byte[] mSignature = "8BIM".getBytes();
-        final short mResourceId = RESOURCE_RESOLUTION_INFO;
-        
-        final short mPad = 0;
-        
-        final int mDataLength = 16;
-
-        final short mHorizontalDisplayUnit = 0x48; // 72 dpi
-        final int mHorizontalResolution = 1;
-        final short mWidthDisplayUnit = 1;
-
-        final short mVerticalDisplayUnit = 0x48; // 72 dpi
-        final int mVerticalResolution = 1;
-        final short mHeightDisplayUnit = 1;
-        
-        ImageResources() {
-            mLength = mSignature.length;
-            mLength += 2;
-            mLength += 2;            
-            mLength += 4;            
-            mLength += 8;            
-            mLength += 8;            
-        }
-
-        void write(DataOutputStream out) throws IOException {
-            out.writeInt(mLength);
-            out.write(mSignature);
-            out.writeShort(mResourceId);
-            out.writeShort(mPad);
-            out.writeInt(mDataLength);
-            out.writeShort(mHorizontalDisplayUnit);
-            out.writeInt(mHorizontalResolution);
-            out.writeShort(mWidthDisplayUnit);
-            out.writeShort(mVerticalDisplayUnit);
-            out.writeInt(mVerticalResolution);
-            out.writeShort(mHeightDisplayUnit);
-        }
-    }
-    
-    @SuppressWarnings({"UnusedDeclaration"})
-    static class LayersMasksInfo {
-        int mMiscLength;
-        int mLayerInfoLength;
-        
-        void setLayersInfo(LayersInfo layersInfo) {
-            mLayerInfoLength = layersInfo.getLength();
-            // Round to the next multiple of 2
-            if ((mLayerInfoLength & 0x1) == 0x1) mLayerInfoLength++;
-            mMiscLength = mLayerInfoLength + 8;
-        }
-
-        void write(DataOutputStream out) throws IOException {
-            out.writeInt(mMiscLength);
-            out.writeInt(mLayerInfoLength);
-        }
-    }
-    
-    @SuppressWarnings({"UnusedDeclaration"})
-    static class LayersInfo {
-        final List<Layer> mLayers = new ArrayList<Layer>();
-
-        void addLayer(String name, BufferedImage image, Point offset, boolean visible) {
-            mLayers.add(new Layer(name, image, offset, visible));
-        }
-
-        int getLength() {
-            int length = 2;
-            for (Layer layer : mLayers) {
-                length += layer.getLength();
-            }
-            return length;
-        }
-
-        void write(DataOutputStream out) throws IOException {
-            out.writeShort((short) -mLayers.size());
-            for (Layer layer : mLayers) {
-                layer.write(out);
-            }
-        }
-
-        void writeImageData(DataOutputStream out) throws IOException {
-            for (Layer layer : mLayers) {
-                layer.writeImageData(out);
-            }
-            // Global layer mask info length
-            out.writeInt(0);
-        }
-    }
-    
-    @SuppressWarnings({"UnusedDeclaration"})
-    static class Layer {
-        static final byte OPACITY_TRANSPARENT = 0x0;
-        static final byte OPACITY_OPAQUE = (byte) 0xFF;
-        
-        static final byte CLIPPING_BASE = 0x0;
-        static final byte CLIPPING_NON_BASE = 0x1;
-        
-        static final byte FLAG_TRANSPARENCY_PROTECTED = 0x1;
-        static final byte FLAG_INVISIBLE = 0x2;
-        
-        final int mTop;
-        final int mLeft;
-        final int mBottom;
-        final int mRight;
-
-        final short mChannelCount = 4;
-        final Channel[] mChannelInfo = new Channel[mChannelCount];
-
-        final byte[] mBlendSignature = "8BIM".getBytes();
-        final byte[] mBlendMode = "norm".getBytes();
-
-        final byte mOpacity = OPACITY_OPAQUE;
-        final byte mClipping = CLIPPING_BASE;
-        byte mFlags = 0x0;
-        final byte mFiller = 0x0;
-        
-        int mExtraSize = 4 + 4;
-
-        final int mMaskDataLength = 0;
-        final int mBlendRangeDataLength = 0;
-
-        final byte[] mName;
-
-        final byte[] mLayerExtraSignature = "8BIM".getBytes();
-        final byte[] mLayerExtraKey = "luni".getBytes();
-        int mLayerExtraLength;
-        final String mOriginalName;
-        
-        private BufferedImage mImage;
-
-        Layer(String name, BufferedImage image, Point offset, boolean visible) {
-            final int height = image.getHeight();
-            final int width = image.getWidth();
-            final int length = width * height;
-
-            mChannelInfo[0] = new Channel(Channel.ID_ALPHA, length);
-            mChannelInfo[1] = new Channel(Channel.ID_RED, length);
-            mChannelInfo[2] = new Channel(Channel.ID_GREEN, length);
-            mChannelInfo[3] = new Channel(Channel.ID_BLUE, length);
-
-            mTop = offset.y;
-            mLeft = offset.x;
-            mBottom = offset.y + height;
-            mRight = offset.x + width;
-
-            mOriginalName = name;
-            byte[] data = name.getBytes();
-
-            try {
-                mLayerExtraLength = 4 + mOriginalName.getBytes("UTF-16").length;
-            } catch (UnsupportedEncodingException e) {
-                e.printStackTrace();
-            }
-
-            final byte[] nameData = new byte[data.length + 1];
-            nameData[0] = (byte) (data.length & 0xFF);
-            System.arraycopy(data, 0, nameData, 1, data.length);
-
-            // This could be done in the same pass as above
-            if (nameData.length % 4 != 0) {
-                data = new byte[nameData.length + 4 - (nameData.length % 4)];
-                System.arraycopy(nameData, 0, data, 0, nameData.length);
-                mName = data;
-            } else {
-                mName = nameData;
-            }
-            mExtraSize += mName.length;
-            mExtraSize += mLayerExtraLength + 4 + mLayerExtraKey.length +
-                    mLayerExtraSignature.length;
-
-            mImage = image;
-            
-            if (!visible) {
-                mFlags |= FLAG_INVISIBLE;
-            }
-        }
-
-        int getLength() {
-            int length = 4 * 4 + 2;
-
-            for (Channel channel : mChannelInfo) {
-                length += channel.getLength();
-            }
-
-            length += mBlendSignature.length;
-            length += mBlendMode.length;
-            length += 4;
-            length += 4;
-            length += mExtraSize;
-
-            return length;
-        }
-
-        void write(DataOutputStream out) throws IOException {
-            out.writeInt(mTop);
-            out.writeInt(mLeft);
-            out.writeInt(mBottom);
-            out.writeInt(mRight);
-
-            out.writeShort(mChannelCount);
-            for (Channel channel : mChannelInfo) {
-                channel.write(out);
-            }            
-
-            out.write(mBlendSignature);
-            out.write(mBlendMode);
-
-            out.write(mOpacity);
-            out.write(mClipping);
-            out.write(mFlags);
-            out.write(mFiller);
-
-            out.writeInt(mExtraSize);
-            out.writeInt(mMaskDataLength);
-
-            out.writeInt(mBlendRangeDataLength);            
-
-            out.write(mName);
-
-            out.write(mLayerExtraSignature);
-            out.write(mLayerExtraKey);
-            out.writeInt(mLayerExtraLength);
-            out.writeInt(mOriginalName.length() + 1);
-            out.write(mOriginalName.getBytes("UTF-16"));
-        }
-
-        void writeImageData(DataOutputStream out) throws IOException {
-            writeImage(mImage, out, true);
-        }
-    }
-    
-    @SuppressWarnings({"UnusedDeclaration"})
-    static class Channel {
-        static final short ID_RED = 0;
-        static final short ID_GREEN = 1;
-        static final short ID_BLUE = 2;
-        static final short ID_ALPHA = -1;
-        static final short ID_LAYER_MASK = -2;
-        
-        final short mId;
-        final int mDataLength;
-
-        Channel(short id, int dataLength) {
-            mId = id;
-            mDataLength = dataLength + 2;
-        }
-        
-        int getLength() {
-            return 2 + 4 + mDataLength;
-        }
-
-        void write(DataOutputStream out) throws IOException {
-            out.writeShort(mId);
-            out.writeInt(mDataLength);
-        }
-    }
-}
diff --git a/hierarchyviewer/src/com/android/hierarchyviewer/ui/util/PsdFileFilter.java b/hierarchyviewer/src/com/android/hierarchyviewer/ui/util/PsdFileFilter.java
deleted file mode 100644
index 6a7ce5b..0000000
--- a/hierarchyviewer/src/com/android/hierarchyviewer/ui/util/PsdFileFilter.java
+++ /dev/null
@@ -1,32 +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.hierarchyviewer.ui.util;
-
-import javax.swing.filechooser.FileFilter;
-import java.io.File;
-
-public class PsdFileFilter extends FileFilter {
-    @Override
-    public boolean accept(File f) {
-        return f.isDirectory() || f.getName().toLowerCase().endsWith(".psd");
-    }
-
-    @Override
-    public String getDescription() {
-        return "Photoshop Document (*.psd)";
-    }
-}
\ No newline at end of file
diff --git a/hierarchyviewer/src/com/android/hierarchyviewer/util/OS.java b/hierarchyviewer/src/com/android/hierarchyviewer/util/OS.java
deleted file mode 100644
index fd619d6..0000000
--- a/hierarchyviewer/src/com/android/hierarchyviewer/util/OS.java
+++ /dev/null
@@ -1,51 +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.hierarchyviewer.util;
-
-public class OS {
-    private static boolean macOs;
-    private static boolean leopard;
-    private static boolean linux;
-    private static boolean windows;
-
-    static {
-        String osName = System.getProperty("os.name");
-        macOs = "Mac OS X".startsWith(osName);
-        linux = "Linux".startsWith(osName);
-        windows = "Windows".startsWith(osName);
-
-        String version = System.getProperty("os.version");
-        final String[] parts = version.split("\\.");
-        leopard = Integer.parseInt(parts[0]) >= 10 && Integer.parseInt(parts[1]) >= 5;
-    }
-
-    public static boolean isMacOsX() {
-        return macOs;
-    }
-
-    public static boolean isLeopardOrLater() {
-        return leopard;
-    }
-
-    public static boolean isLinux() {
-        return linux;
-    }
-
-    public static boolean isWindows() {
-        return windows;
-    }
-}
diff --git a/hierarchyviewer/src/com/android/hierarchyviewer/util/WorkerThread.java b/hierarchyviewer/src/com/android/hierarchyviewer/util/WorkerThread.java
deleted file mode 100644
index c714c1c..0000000
--- a/hierarchyviewer/src/com/android/hierarchyviewer/util/WorkerThread.java
+++ /dev/null
@@ -1,32 +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.hierarchyviewer.util;
-
-import java.lang.annotation.Target;
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-
-/**
- * Simple utility class used only to mark methods that are not executed on the UI thread
- * (or Event Dispatch Thread in Swing/AWT.) This annotation's sole purpose is to help
- * reading the source code. It has no additional effect.
- */
-@Target({ ElementType.METHOD })
-@Retention(RetentionPolicy.SOURCE)
-public @interface WorkerThread {
-}
diff --git a/hierarchyviewer/src/resources/images/icon-graph-view-selected.png b/hierarchyviewer/src/resources/images/icon-graph-view-selected.png
deleted file mode 100644
index 91f7119..0000000
--- a/hierarchyviewer/src/resources/images/icon-graph-view-selected.png
+++ /dev/null
Binary files differ
diff --git a/hierarchyviewer/src/resources/images/icon-graph-view.png b/hierarchyviewer/src/resources/images/icon-graph-view.png
deleted file mode 100644
index 9a7f68b..0000000
--- a/hierarchyviewer/src/resources/images/icon-graph-view.png
+++ /dev/null
Binary files differ
diff --git a/hierarchyviewer/src/resources/images/icon-pixel-perfect-view-selected.png b/hierarchyviewer/src/resources/images/icon-pixel-perfect-view-selected.png
deleted file mode 100644
index 1e44000..0000000
--- a/hierarchyviewer/src/resources/images/icon-pixel-perfect-view-selected.png
+++ /dev/null
Binary files differ
diff --git a/hierarchyviewer/src/resources/images/icon-pixel-perfect-view.png b/hierarchyviewer/src/resources/images/icon-pixel-perfect-view.png
deleted file mode 100644
index ec51cec..0000000
--- a/hierarchyviewer/src/resources/images/icon-pixel-perfect-view.png
+++ /dev/null
Binary files differ
diff --git a/icons/explorer/adt_project_closed.png b/icons/explorer/adt_project_closed.png
deleted file mode 100644
index 4e339f7..0000000
--- a/icons/explorer/adt_project_closed.png
+++ /dev/null
Binary files differ
diff --git a/icons/explorer/adt_project_open.png b/icons/explorer/adt_project_open.png
deleted file mode 100644
index e991ae6..0000000
--- a/icons/explorer/adt_project_open.png
+++ /dev/null
Binary files differ
diff --git a/icons/explorer/android_file.png b/icons/explorer/android_file.png
deleted file mode 100644
index 6e8535d..0000000
--- a/icons/explorer/android_file.png
+++ /dev/null
Binary files differ
diff --git a/icons/explorer/androidjunit_closed.png b/icons/explorer/androidjunit_closed.png
deleted file mode 100644
index 97e622d..0000000
--- a/icons/explorer/androidjunit_closed.png
+++ /dev/null
Binary files differ
diff --git a/icons/explorer/androidjunit_open.png b/icons/explorer/androidjunit_open.png
deleted file mode 100644
index 366647f..0000000
--- a/icons/explorer/androidjunit_open.png
+++ /dev/null
Binary files differ
diff --git a/icons/toolbar/adt_project_new.png b/icons/toolbar/adt_project_new.png
deleted file mode 100644
index eda27ca..0000000
--- a/icons/toolbar/adt_project_new.png
+++ /dev/null
Binary files differ
diff --git a/icons/toolbar/android_file_new.png b/icons/toolbar/android_file_new.png
deleted file mode 100644
index 6d969b1..0000000
--- a/icons/toolbar/android_file_new.png
+++ /dev/null
Binary files differ
diff --git a/icons/toolbar/androidjunit_new.png b/icons/toolbar/androidjunit_new.png
deleted file mode 100644
index dbae64e..0000000
--- a/icons/toolbar/androidjunit_new.png
+++ /dev/null
Binary files differ
diff --git a/icons/toolbar/avd_manager.png b/icons/toolbar/avd_manager.png
deleted file mode 100644
index 423f781..0000000
--- a/icons/toolbar/avd_manager.png
+++ /dev/null
Binary files differ
diff --git a/icons/toolbar/sdk_manager.png b/icons/toolbar/sdk_manager.png
deleted file mode 100644
index 8207e00..0000000
--- a/icons/toolbar/sdk_manager.png
+++ /dev/null
Binary files differ
diff --git a/release.md b/release.md
deleted file mode 100644
index 8752d27..0000000
--- a/release.md
+++ /dev/null
@@ -1,6 +0,0 @@
-## Building a release version
-
-By default builds use the -SNAPSHOT version.
-To run a release build that remove the SNAPSHOT qualifier, run:
-
-gradle --init-script release.gradle <tasks>
\ No newline at end of file
diff --git a/sdklauncher/.gitignore b/sdklauncher/.gitignore
deleted file mode 100644
index 0d02bac..0000000
--- a/sdklauncher/.gitignore
+++ /dev/null
@@ -1,4 +0,0 @@
-images/sdklauncher_icon.o
-*.ncb
-*.suo
-*.user
diff --git a/sdklauncher/NOTICE b/sdklauncher/NOTICE
deleted file mode 100644
index c5b1efa..0000000
--- a/sdklauncher/NOTICE
+++ /dev/null
@@ -1,190 +0,0 @@
-
-   Copyright (c) 2005-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.
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
-
-
-                                 Apache License
-                           Version 2.0, January 2004
-                        http://www.apache.org/licenses/
-
-   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
-   1. Definitions.
-
-      "License" shall mean the terms and conditions for use, reproduction,
-      and distribution as defined by Sections 1 through 9 of this document.
-
-      "Licensor" shall mean the copyright owner or entity authorized by
-      the copyright owner that is granting the License.
-
-      "Legal Entity" shall mean the union of the acting entity and all
-      other entities that control, are controlled by, or are under common
-      control with that entity. For the purposes of this definition,
-      "control" means (i) the power, direct or indirect, to cause the
-      direction or management of such entity, whether by contract or
-      otherwise, or (ii) ownership of fifty percent (50%) or more of the
-      outstanding shares, or (iii) beneficial ownership of such entity.
-
-      "You" (or "Your") shall mean an individual or Legal Entity
-      exercising permissions granted by this License.
-
-      "Source" form shall mean the preferred form for making modifications,
-      including but not limited to software source code, documentation
-      source, and configuration files.
-
-      "Object" form shall mean any form resulting from mechanical
-      transformation or translation of a Source form, including but
-      not limited to compiled object code, generated documentation,
-      and conversions to other media types.
-
-      "Work" shall mean the work of authorship, whether in Source or
-      Object form, made available under the License, as indicated by a
-      copyright notice that is included in or attached to the work
-      (an example is provided in the Appendix below).
-
-      "Derivative Works" shall mean any work, whether in Source or Object
-      form, that is based on (or derived from) the Work and for which the
-      editorial revisions, annotations, elaborations, or other modifications
-      represent, as a whole, an original work of authorship. For the purposes
-      of this License, Derivative Works shall not include works that remain
-      separable from, or merely link (or bind by name) to the interfaces of,
-      the Work and Derivative Works thereof.
-
-      "Contribution" shall mean any work of authorship, including
-      the original version of the Work and any modifications or additions
-      to that Work or Derivative Works thereof, that is intentionally
-      submitted to Licensor for inclusion in the Work by the copyright owner
-      or by an individual or Legal Entity authorized to submit on behalf of
-      the copyright owner. For the purposes of this definition, "submitted"
-      means any form of electronic, verbal, or written communication sent
-      to the Licensor or its representatives, including but not limited to
-      communication on electronic mailing lists, source code control systems,
-      and issue tracking systems that are managed by, or on behalf of, the
-      Licensor for the purpose of discussing and improving the Work, but
-      excluding communication that is conspicuously marked or otherwise
-      designated in writing by the copyright owner as "Not a Contribution."
-
-      "Contributor" shall mean Licensor and any individual or Legal Entity
-      on behalf of whom a Contribution has been received by Licensor and
-      subsequently incorporated within the Work.
-
-   2. Grant of Copyright License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      copyright license to reproduce, prepare Derivative Works of,
-      publicly display, publicly perform, sublicense, and distribute the
-      Work and such Derivative Works in Source or Object form.
-
-   3. Grant of Patent License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      (except as stated in this section) patent license to make, have made,
-      use, offer to sell, sell, import, and otherwise transfer the Work,
-      where such license applies only to those patent claims licensable
-      by such Contributor that are necessarily infringed by their
-      Contribution(s) alone or by combination of their Contribution(s)
-      with the Work to which such Contribution(s) was submitted. If You
-      institute patent litigation against any entity (including a
-      cross-claim or counterclaim in a lawsuit) alleging that the Work
-      or a Contribution incorporated within the Work constitutes direct
-      or contributory patent infringement, then any patent licenses
-      granted to You under this License for that Work shall terminate
-      as of the date such litigation is filed.
-
-   4. Redistribution. You may reproduce and distribute copies of the
-      Work or Derivative Works thereof in any medium, with or without
-      modifications, and in Source or Object form, provided that You
-      meet the following conditions:
-
-      (a) You must give any other recipients of the Work or
-          Derivative Works a copy of this License; and
-
-      (b) You must cause any modified files to carry prominent notices
-          stating that You changed the files; and
-
-      (c) You must retain, in the Source form of any Derivative Works
-          that You distribute, all copyright, patent, trademark, and
-          attribution notices from the Source form of the Work,
-          excluding those notices that do not pertain to any part of
-          the Derivative Works; and
-
-      (d) If the Work includes a "NOTICE" text file as part of its
-          distribution, then any Derivative Works that You distribute must
-          include a readable copy of the attribution notices contained
-          within such NOTICE file, excluding those notices that do not
-          pertain to any part of the Derivative Works, in at least one
-          of the following places: within a NOTICE text file distributed
-          as part of the Derivative Works; within the Source form or
-          documentation, if provided along with the Derivative Works; or,
-          within a display generated by the Derivative Works, if and
-          wherever such third-party notices normally appear. The contents
-          of the NOTICE file are for informational purposes only and
-          do not modify the License. You may add Your own attribution
-          notices within Derivative Works that You distribute, alongside
-          or as an addendum to the NOTICE text from the Work, provided
-          that such additional attribution notices cannot be construed
-          as modifying the License.
-
-      You may add Your own copyright statement to Your modifications and
-      may provide additional or different license terms and conditions
-      for use, reproduction, or distribution of Your modifications, or
-      for any such Derivative Works as a whole, provided Your use,
-      reproduction, and distribution of the Work otherwise complies with
-      the conditions stated in this License.
-
-   5. Submission of Contributions. Unless You explicitly state otherwise,
-      any Contribution intentionally submitted for inclusion in the Work
-      by You to the Licensor shall be under the terms and conditions of
-      this License, without any additional terms or conditions.
-      Notwithstanding the above, nothing herein shall supersede or modify
-      the terms of any separate license agreement you may have executed
-      with Licensor regarding such Contributions.
-
-   6. Trademarks. This License does not grant permission to use the trade
-      names, trademarks, service marks, or product names of the Licensor,
-      except as required for reasonable and customary use in describing the
-      origin of the Work and reproducing the content of the NOTICE file.
-
-   7. Disclaimer of Warranty. Unless required by applicable law or
-      agreed to in writing, Licensor provides the Work (and each
-      Contributor provides its Contributions) on an "AS IS" BASIS,
-      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
-      implied, including, without limitation, any warranties or conditions
-      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
-      PARTICULAR PURPOSE. You are solely responsible for determining the
-      appropriateness of using or redistributing the Work and assume any
-      risks associated with Your exercise of permissions under this License.
-
-   8. Limitation of Liability. In no event and under no legal theory,
-      whether in tort (including negligence), contract, or otherwise,
-      unless required by applicable law (such as deliberate and grossly
-      negligent acts) or agreed to in writing, shall any Contributor be
-      liable to You for damages, including any direct, indirect, special,
-      incidental, or consequential damages of any character arising as a
-      result of this License or out of the use or inability to use the
-      Work (including but not limited to damages for loss of goodwill,
-      work stoppage, computer failure or malfunction, or any and all
-      other commercial damages or losses), even if such Contributor
-      has been advised of the possibility of such damages.
-
-   9. Accepting Warranty or Additional Liability. While redistributing
-      the Work or Derivative Works thereof, You may choose to offer,
-      and charge a fee for, acceptance of support, warranty, indemnity,
-      or other liability obligations and/or rights consistent with this
-      License. However, in accepting such obligations, You may act only
-      on Your own behalf and on Your sole responsibility, not on behalf
-      of any other Contributor, and only if You agree to indemnify,
-      defend, and hold each Contributor harmless for any liability
-      incurred by, or claims asserted against, such Contributor by reason
-      of your accepting any such warranty or additional liability.
-
-   END OF TERMS AND CONDITIONS
-
diff --git a/sdklauncher/build.gradle b/sdklauncher/build.gradle
deleted file mode 100644
index 6c64f6d..0000000
--- a/sdklauncher/build.gradle
+++ /dev/null
@@ -1,36 +0,0 @@
-apply plugin: 'c'
-apply plugin: 'sdk-files'
-apply plugin: 'windows-setup'
-
-executables {
-    sdkLauncher {}
-}
-
-sources {
-    sdkLauncher {
-        c {
-            source {
-                srcDir "src/source"
-                include "**/*.c"
-            }
-        }
-    }
-}
-
-sdk {
-    windows {
-        item( { getExeName("windows32SdkLauncherExecutable") } ) {
-            into 'lib'
-            name 'SDK Manager.exe'
-            builtBy 'windows32SdkLauncherExecutable'
-        }
-    }
-}
-
-def getExeName(String name) {
-    // binaries will return a set of binaries
-    def binaries = executables.sdkLauncher.binaries.matching { it.name == name }
-    // calling .exeFile on the set returns an array with the result from each item in the set...
-    return binaries.executableFile.get(0)
-}
-
diff --git a/sdklauncher/images/android_icon.ico b/sdklauncher/images/android_icon.ico
deleted file mode 100644
index bd25179..0000000
--- a/sdklauncher/images/android_icon.ico
+++ /dev/null
Binary files differ
diff --git a/sdklauncher/images/android_icon.rc b/sdklauncher/images/android_icon.rc
deleted file mode 100644
index 25c904c..0000000
--- a/sdklauncher/images/android_icon.rc
+++ /dev/null
@@ -1,2 +0,0 @@
-1 ICON "../images/android_icon.ico"
-1 RT_MANIFEST "../sdklauncher.exe.manifest"
diff --git a/sdklauncher/sdklauncher.exe.manifest b/sdklauncher/sdklauncher.exe.manifest
deleted file mode 100755
index dc286ae..0000000
--- a/sdklauncher/sdklauncher.exe.manifest
+++ /dev/null
@@ -1,33 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-
-<!--
-  For details on the Assembly Manifest, please look here:
-  http://msdn.microsoft.com/en-us/library/aa374191(VS.85).aspx
--->
-
-<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> 
-
-    <application>
-        <!--The ID below indicates application support for Windows Vista -->
-        <supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}" />
-        <!--The ID below indicates application support for Windows 7 -->
-        <supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}" />
-    </application>
-  
-    <assemblyIdentity version="1.0.0.0"
-        processorArchitecture="x86"
-        name="Android.SDK.Launcher"
-        type="win32"
-        /> 
-
-    <description>Launches the Android SDK Manager to download Android SDK packages.</description> 
-
-    <!-- Identify the application security requirements. -->
-    <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
-        <security>
-            <requestedPrivileges>
-                <requestedExecutionLevel level="asInvoker" uiAccess="false" />
-            </requestedPrivileges>
-        </security>
-    </trustInfo>
-</assembly>
diff --git a/sdklauncher/sdklauncher.vcxproj b/sdklauncher/sdklauncher.vcxproj
deleted file mode 100644
index 306e243..0000000
--- a/sdklauncher/sdklauncher.vcxproj
+++ /dev/null
@@ -1,155 +0,0 @@
-﻿<?xml version="1.0" encoding="utf-8"?>
-<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <ItemGroup Label="ProjectConfigurations">
-    <ProjectConfiguration Include="Debug|Win32">
-      <Configuration>Debug</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Debug|x64">
-      <Configuration>Debug</Configuration>
-      <Platform>x64</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Release|Win32">
-      <Configuration>Release</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Release|x64">
-      <Configuration>Release</Configuration>
-      <Platform>x64</Platform>
-    </ProjectConfiguration>
-  </ItemGroup>
-  <PropertyGroup Label="Globals">
-    <ProjectGuid>{331EADA4-DC19-429D-AAD0-5B9632B4CBC1}</ProjectGuid>
-    <RootNamespace>sdklauncher</RootNamespace>
-    <Keyword>Win32Proj</Keyword>
-  </PropertyGroup>
-  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <CharacterSet>MultiByte</CharacterSet>
-    <WholeProgramOptimization>true</WholeProgramOptimization>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <CharacterSet>MultiByte</CharacterSet>
-    <WholeProgramOptimization>true</WholeProgramOptimization>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <CharacterSet>MultiByte</CharacterSet>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <CharacterSet>MultiByte</CharacterSet>
-  </PropertyGroup>
-  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
-  <ImportGroup Label="ExtensionSettings">
-  </ImportGroup>
-  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
-    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
-  </ImportGroup>
-  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
-    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
-  </ImportGroup>
-  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
-    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
-  </ImportGroup>
-  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">
-    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
-  </ImportGroup>
-  <PropertyGroup Label="UserMacros" />
-  <PropertyGroup>
-    <_ProjectFileVersion>10.0.40219.1</_ProjectFileVersion>
-    <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)..\..\out\host\windows-x86\$(Configuration)\$(ProjectName)\</OutDir>
-    <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(SolutionDir)..\..\out\host\windows-x64\$(Configuration)\$(ProjectName)\</OutDir>
-    <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)..\..\out\host\windows-x86\$(Configuration)\$(ProjectName)\</IntDir>
-    <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(SolutionDir)..\..\out\host\windows-x64\$(Configuration)\$(ProjectName)\</IntDir>
-    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</LinkIncremental>
-    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</LinkIncremental>
-    <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)..\..\out\host\windows-x86\$(Configuration)\$(ProjectName)\</OutDir>
-    <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(SolutionDir)..\..\out\host\windows-x64\$(Configuration)\$(ProjectName)\</OutDir>
-    <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)..\..\out\host\windows-x86\$(Configuration)\$(ProjectName)\</IntDir>
-    <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(SolutionDir)..\..\out\host\windows-x64\$(Configuration)\$(ProjectName)\</IntDir>
-    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>
-    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</LinkIncremental>
-  </PropertyGroup>
-  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
-    <ClCompile>
-      <Optimization>Disabled</Optimization>
-      <PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <MinimalRebuild>true</MinimalRebuild>
-      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
-      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
-      <PrecompiledHeader>
-      </PrecompiledHeader>
-      <WarningLevel>Level3</WarningLevel>
-      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
-    </ClCompile>
-    <Link>
-      <GenerateDebugInformation>true</GenerateDebugInformation>
-      <SubSystem>Console</SubSystem>
-      <TargetMachine>MachineX86</TargetMachine>
-    </Link>
-  </ItemDefinitionGroup>
-  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
-    <ClCompile>
-      <Optimization>Disabled</Optimization>
-      <PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
-      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
-      <PrecompiledHeader>
-      </PrecompiledHeader>
-      <WarningLevel>Level3</WarningLevel>
-      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
-    </ClCompile>
-    <Link>
-      <GenerateDebugInformation>true</GenerateDebugInformation>
-      <SubSystem>Console</SubSystem>
-    </Link>
-  </ItemDefinitionGroup>
-  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
-    <ClCompile>
-      <Optimization>MaxSpeed</Optimization>
-      <IntrinsicFunctions>true</IntrinsicFunctions>
-      <PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
-      <FunctionLevelLinking>true</FunctionLevelLinking>
-      <PrecompiledHeader>
-      </PrecompiledHeader>
-      <WarningLevel>Level3</WarningLevel>
-      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
-    </ClCompile>
-    <Link>
-      <GenerateDebugInformation>true</GenerateDebugInformation>
-      <SubSystem>Console</SubSystem>
-      <OptimizeReferences>true</OptimizeReferences>
-      <EnableCOMDATFolding>true</EnableCOMDATFolding>
-      <TargetMachine>MachineX86</TargetMachine>
-    </Link>
-  </ItemDefinitionGroup>
-  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
-    <ClCompile>
-      <Optimization>MaxSpeed</Optimization>
-      <IntrinsicFunctions>true</IntrinsicFunctions>
-      <PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
-      <FunctionLevelLinking>true</FunctionLevelLinking>
-      <PrecompiledHeader>
-      </PrecompiledHeader>
-      <WarningLevel>Level3</WarningLevel>
-      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
-    </ClCompile>
-    <Link>
-      <GenerateDebugInformation>true</GenerateDebugInformation>
-      <SubSystem>Console</SubSystem>
-      <OptimizeReferences>true</OptimizeReferences>
-      <EnableCOMDATFolding>true</EnableCOMDATFolding>
-    </Link>
-  </ItemDefinitionGroup>
-  <ItemGroup>
-    <ClCompile Include="src\source\sdklauncher.c" />
-  </ItemGroup>
-  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
-  <ImportGroup Label="ExtensionTargets">
-  </ImportGroup>
-</Project>
\ No newline at end of file
diff --git a/sdklauncher/sdklauncher.vcxproj.filters b/sdklauncher/sdklauncher.vcxproj.filters
deleted file mode 100644
index 9b92bf2..0000000
--- a/sdklauncher/sdklauncher.vcxproj.filters
+++ /dev/null
@@ -1,22 +0,0 @@
-﻿<?xml version="1.0" encoding="utf-8"?>
-<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <ItemGroup>
-    <Filter Include="Source Files">
-      <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
-      <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
-    </Filter>
-    <Filter Include="Header Files">
-      <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
-      <Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions>
-    </Filter>
-    <Filter Include="Resource Files">
-      <UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
-      <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav</Extensions>
-    </Filter>
-  </ItemGroup>
-  <ItemGroup>
-    <ClCompile Include="src\source\sdklauncher.c">
-      <Filter>Source Files</Filter>
-    </ClCompile>
-  </ItemGroup>
-</Project>
\ No newline at end of file
diff --git a/sdklauncher/src/source/sdklauncher.c b/sdklauncher/src/source/sdklauncher.c
deleted file mode 100644
index 6b2c45c..0000000
--- a/sdklauncher/src/source/sdklauncher.c
+++ /dev/null
@@ -1,154 +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.
- */
-
-/*
- * The "SDK Manager" is for Windows only.
- * This simple .exe will sit at the root of the Windows SDK
- * and currently simply executes tools\android.bat.
- *
- * TODO: replace by a jar-exe wrapper.
- */
-
-#ifdef _WIN32
-
-#include <stdio.h>
-#include <stdarg.h>
-#include <string.h>
-#include <windows.h>
-
-
-int _enable_dprintf = 0;
-
-void dprintf(char *msg, ...) {
-    va_list ap;
-    va_start(ap, msg);
-
-    if (_enable_dprintf) {
-        vfprintf(stderr, msg, ap);
-    }
-
-    va_end(ap);
-}
-
-void display_error(LPSTR description) {
-    DWORD err = GetLastError();
-    LPSTR s, s2;
-
-    fprintf(stderr, "%s, error %ld\n", description, err);
-
-    if (FormatMessageA(FORMAT_MESSAGE_ALLOCATE_BUFFER | /* dwFlags */
-                      FORMAT_MESSAGE_FROM_SYSTEM,
-                      NULL,                             /* lpSource */
-                      err,                              /* dwMessageId */
-                      0,                                /* dwLanguageId */
-                      (LPSTR)&s,                        /* lpBuffer */
-                      0,                                /* nSize */
-                      NULL) != 0) {                     /* va_list args */
-        fprintf(stderr, "%s", s);
-
-        s2 = (LPSTR) malloc(strlen(description) + strlen(s) + 5);
-        sprintf(s2, "%s\r\n%s", description, s);
-        MessageBox(NULL, s2, "Android SDK Manager - Error", MB_OK);
-        free(s2);
-        LocalFree(s);
-    }
-}
-
-
-int sdk_launcher() {
-    int                   result = 0;
-    STARTUPINFO           startup;
-    PROCESS_INFORMATION   pinfo;
-    CHAR                  program_dir[MAX_PATH];
-    int                   ret, pos;
-
-    ZeroMemory(&pinfo, sizeof(pinfo));
-
-    ZeroMemory(&startup, sizeof(startup));
-    startup.cb = sizeof(startup);
-    startup.dwFlags     = STARTF_USESHOWWINDOW;
-    startup.wShowWindow = SW_HIDE|SW_MINIMIZE;
-
-    /* get path of current program, to switch dirs here when executing the command. */
-    ret = GetModuleFileName(NULL, program_dir, sizeof(program_dir));
-    if (ret == 0) {
-        display_error("Failed to get program's filename:");
-        result = 1;
-    } else {
-        /* Remove the last segment to keep only the directory. */
-        pos = ret - 1;
-        while (pos > 0 && program_dir[pos] != '\\') {
-            --pos;
-        }
-        program_dir[pos] = 0;
-    }
-
-    if (!result) {
-        dprintf("Program dir: %s\n", program_dir);
-
-        // SDK Manager.exe is installed by the Windows Installer just below
-        // the tools directory and needs to access tools\android.bat
-        ret = CreateProcess(
-                NULL,                                       /* program path */
-                "tools\\android.bat sdk",                   /* command-line */
-                NULL,                  /* process handle is not inheritable */
-                NULL,                   /* thread handle is not inheritable */
-                TRUE,                          /* yes, inherit some handles */
-                CREATE_NO_WINDOW,                /* we don't want a console */
-                NULL,                     /* use parent's environment block */
-                program_dir,             /* use parent's starting directory */
-                &startup,                 /* startup info, i.e. std handles */
-                &pinfo);
-
-        if (!ret) {
-            dprintf("CreateProcess returned %d\n", ret);
-
-            // In the ADT bundle, SDK Manager.exe is located in the sdk folder
-            // and needs to access sdk\tools\android.bat
-            ret = CreateProcess(
-                    NULL,                                   /* program path */
-                    "sdk\\tools\\android.bat sdk",          /* command-line */
-                    NULL,              /* process handle is not inheritable */
-                    NULL,               /* thread handle is not inheritable */
-                    TRUE,                      /* yes, inherit some handles */
-                    CREATE_NO_WINDOW,            /* we don't want a console */
-                    NULL,                 /* use parent's environment block */
-                    program_dir,         /* use parent's starting directory */
-                    &startup,             /* startup info, i.e. std handles */
-                    &pinfo);
-        }
-
-        dprintf("CreateProcess returned %d\n", ret);
-
-        if (!ret) {
-            display_error("Failed to execute tools\\android.bat:");
-            result = 1;
-        }
-    }
-
-    dprintf("Cleanup.\n");
-
-    return result;
-}
-
-int main(int argc, char **argv) {
-    _enable_dprintf = argc > 1 && strcmp(argv[1], "-v") == 0;
-    dprintf("Verbose debug mode.\n");
-
-    return sdk_launcher();
-}
-
-#endif /* _WIN32 */
diff --git a/settings/README.txt b/settings/README.txt
deleted file mode 100644
index 7d0f143..0000000
--- a/settings/README.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-Copy this in eclipse project as a .settings folder at the root.
-This ensures proper compilation compliance and warning/error levels.
\ No newline at end of file
diff --git a/settings/org.eclipse.jdt.core.prefs b/settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index ea66196..0000000
--- a/settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,98 +0,0 @@
-eclipse.preferences.version=1
-org.eclipse.jdt.core.compiler.annotation.missingNonNullByDefaultAnnotation=ignore
-org.eclipse.jdt.core.compiler.annotation.nonnull=com.android.annotations.NonNull
-org.eclipse.jdt.core.compiler.annotation.nonnullbydefault=com.android.annotations.NonNullByDefault
-org.eclipse.jdt.core.compiler.annotation.nonnullisdefault=disabled
-org.eclipse.jdt.core.compiler.annotation.nullable=com.android.annotations.Nullable
-org.eclipse.jdt.core.compiler.annotation.nullanalysis=enabled
-org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6
-org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.6
-org.eclipse.jdt.core.compiler.debug.lineNumber=generate
-org.eclipse.jdt.core.compiler.debug.localVariable=generate
-org.eclipse.jdt.core.compiler.debug.sourceFile=generate
-org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
-org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
-org.eclipse.jdt.core.compiler.problem.comparingIdentical=warning
-org.eclipse.jdt.core.compiler.problem.deadCode=warning
-org.eclipse.jdt.core.compiler.problem.deprecation=warning
-org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
-org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
-org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
-org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=ignore
-org.eclipse.jdt.core.compiler.problem.fallthroughCase=warning
-org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
-org.eclipse.jdt.core.compiler.problem.fieldHiding=warning
-org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
-org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
-org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
-org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
-org.eclipse.jdt.core.compiler.problem.includeNullInfoFromAsserts=enabled
-org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
-org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=warning
-org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
-org.eclipse.jdt.core.compiler.problem.localVariableHiding=warning
-org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
-org.eclipse.jdt.core.compiler.problem.missingDefaultCase=ignore
-org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=warning
-org.eclipse.jdt.core.compiler.problem.missingEnumCaseDespiteDefault=disabled
-org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=warning
-org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=error
-org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled
-org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
-org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=ignore
-org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
-org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
-org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore
-org.eclipse.jdt.core.compiler.problem.nullAnnotationInferenceConflict=warning
-org.eclipse.jdt.core.compiler.problem.nullReference=warning
-org.eclipse.jdt.core.compiler.problem.nullSpecInsufficientInfo=warning
-org.eclipse.jdt.core.compiler.problem.nullSpecViolation=warning
-org.eclipse.jdt.core.compiler.problem.nullUncheckedConversion=ignore
-org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
-org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
-org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=warning
-org.eclipse.jdt.core.compiler.problem.potentialNullReference=warning
-org.eclipse.jdt.core.compiler.problem.potentialNullSpecViolation=error
-org.eclipse.jdt.core.compiler.problem.potentiallyUnclosedCloseable=warning
-org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
-org.eclipse.jdt.core.compiler.problem.redundantNullAnnotation=warning
-org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
-org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=ignore
-org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=warning
-org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=ignore
-org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=ignore
-org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
-org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
-org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=enabled
-org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
-org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
-org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
-org.eclipse.jdt.core.compiler.problem.unavoidableGenericTypeProblems=disabled
-org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
-org.eclipse.jdt.core.compiler.problem.unclosedCloseable=error
-org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
-org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
-org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=warning
-org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=warning
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.unusedImport=warning
-org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
-org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
-org.eclipse.jdt.core.compiler.problem.unusedObjectAllocation=warning
-org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
-org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
-org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
-org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
-org.eclipse.jdt.core.compiler.source=1.6
diff --git a/templates/NOTICE b/templates/NOTICE
deleted file mode 100644
index 06a9081..0000000
--- a/templates/NOTICE
+++ /dev/null
@@ -1,190 +0,0 @@
-
-   Copyright (c) 2005-2014, The Android Open Source Project
-
-   Licensed under the Apache License, Version 2.0 (the "License");
-   you may not use this file except in compliance with the License.
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
-
-
-                                 Apache License
-                           Version 2.0, January 2004
-                        http://www.apache.org/licenses/
-
-   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
-   1. Definitions.
-
-      "License" shall mean the terms and conditions for use, reproduction,
-      and distribution as defined by Sections 1 through 9 of this document.
-
-      "Licensor" shall mean the copyright owner or entity authorized by
-      the copyright owner that is granting the License.
-
-      "Legal Entity" shall mean the union of the acting entity and all
-      other entities that control, are controlled by, or are under common
-      control with that entity. For the purposes of this definition,
-      "control" means (i) the power, direct or indirect, to cause the
-      direction or management of such entity, whether by contract or
-      otherwise, or (ii) ownership of fifty percent (50%) or more of the
-      outstanding shares, or (iii) beneficial ownership of such entity.
-
-      "You" (or "Your") shall mean an individual or Legal Entity
-      exercising permissions granted by this License.
-
-      "Source" form shall mean the preferred form for making modifications,
-      including but not limited to software source code, documentation
-      source, and configuration files.
-
-      "Object" form shall mean any form resulting from mechanical
-      transformation or translation of a Source form, including but
-      not limited to compiled object code, generated documentation,
-      and conversions to other media types.
-
-      "Work" shall mean the work of authorship, whether in Source or
-      Object form, made available under the License, as indicated by a
-      copyright notice that is included in or attached to the work
-      (an example is provided in the Appendix below).
-
-      "Derivative Works" shall mean any work, whether in Source or Object
-      form, that is based on (or derived from) the Work and for which the
-      editorial revisions, annotations, elaborations, or other modifications
-      represent, as a whole, an original work of authorship. For the purposes
-      of this License, Derivative Works shall not include works that remain
-      separable from, or merely link (or bind by name) to the interfaces of,
-      the Work and Derivative Works thereof.
-
-      "Contribution" shall mean any work of authorship, including
-      the original version of the Work and any modifications or additions
-      to that Work or Derivative Works thereof, that is intentionally
-      submitted to Licensor for inclusion in the Work by the copyright owner
-      or by an individual or Legal Entity authorized to submit on behalf of
-      the copyright owner. For the purposes of this definition, "submitted"
-      means any form of electronic, verbal, or written communication sent
-      to the Licensor or its representatives, including but not limited to
-      communication on electronic mailing lists, source code control systems,
-      and issue tracking systems that are managed by, or on behalf of, the
-      Licensor for the purpose of discussing and improving the Work, but
-      excluding communication that is conspicuously marked or otherwise
-      designated in writing by the copyright owner as "Not a Contribution."
-
-      "Contributor" shall mean Licensor and any individual or Legal Entity
-      on behalf of whom a Contribution has been received by Licensor and
-      subsequently incorporated within the Work.
-
-   2. Grant of Copyright License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      copyright license to reproduce, prepare Derivative Works of,
-      publicly display, publicly perform, sublicense, and distribute the
-      Work and such Derivative Works in Source or Object form.
-
-   3. Grant of Patent License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      (except as stated in this section) patent license to make, have made,
-      use, offer to sell, sell, import, and otherwise transfer the Work,
-      where such license applies only to those patent claims licensable
-      by such Contributor that are necessarily infringed by their
-      Contribution(s) alone or by combination of their Contribution(s)
-      with the Work to which such Contribution(s) was submitted. If You
-      institute patent litigation against any entity (including a
-      cross-claim or counterclaim in a lawsuit) alleging that the Work
-      or a Contribution incorporated within the Work constitutes direct
-      or contributory patent infringement, then any patent licenses
-      granted to You under this License for that Work shall terminate
-      as of the date such litigation is filed.
-
-   4. Redistribution. You may reproduce and distribute copies of the
-      Work or Derivative Works thereof in any medium, with or without
-      modifications, and in Source or Object form, provided that You
-      meet the following conditions:
-
-      (a) You must give any other recipients of the Work or
-          Derivative Works a copy of this License; and
-
-      (b) You must cause any modified files to carry prominent notices
-          stating that You changed the files; and
-
-      (c) You must retain, in the Source form of any Derivative Works
-          that You distribute, all copyright, patent, trademark, and
-          attribution notices from the Source form of the Work,
-          excluding those notices that do not pertain to any part of
-          the Derivative Works; and
-
-      (d) If the Work includes a "NOTICE" text file as part of its
-          distribution, then any Derivative Works that You distribute must
-          include a readable copy of the attribution notices contained
-          within such NOTICE file, excluding those notices that do not
-          pertain to any part of the Derivative Works, in at least one
-          of the following places: within a NOTICE text file distributed
-          as part of the Derivative Works; within the Source form or
-          documentation, if provided along with the Derivative Works; or,
-          within a display generated by the Derivative Works, if and
-          wherever such third-party notices normally appear. The contents
-          of the NOTICE file are for informational purposes only and
-          do not modify the License. You may add Your own attribution
-          notices within Derivative Works that You distribute, alongside
-          or as an addendum to the NOTICE text from the Work, provided
-          that such additional attribution notices cannot be construed
-          as modifying the License.
-
-      You may add Your own copyright statement to Your modifications and
-      may provide additional or different license terms and conditions
-      for use, reproduction, or distribution of Your modifications, or
-      for any such Derivative Works as a whole, provided Your use,
-      reproduction, and distribution of the Work otherwise complies with
-      the conditions stated in this License.
-
-   5. Submission of Contributions. Unless You explicitly state otherwise,
-      any Contribution intentionally submitted for inclusion in the Work
-      by You to the Licensor shall be under the terms and conditions of
-      this License, without any additional terms or conditions.
-      Notwithstanding the above, nothing herein shall supersede or modify
-      the terms of any separate license agreement you may have executed
-      with Licensor regarding such Contributions.
-
-   6. Trademarks. This License does not grant permission to use the trade
-      names, trademarks, service marks, or product names of the Licensor,
-      except as required for reasonable and customary use in describing the
-      origin of the Work and reproducing the content of the NOTICE file.
-
-   7. Disclaimer of Warranty. Unless required by applicable law or
-      agreed to in writing, Licensor provides the Work (and each
-      Contributor provides its Contributions) on an "AS IS" BASIS,
-      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
-      implied, including, without limitation, any warranties or conditions
-      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
-      PARTICULAR PURPOSE. You are solely responsible for determining the
-      appropriateness of using or redistributing the Work and assume any
-      risks associated with Your exercise of permissions under this License.
-
-   8. Limitation of Liability. In no event and under no legal theory,
-      whether in tort (including negligence), contract, or otherwise,
-      unless required by applicable law (such as deliberate and grossly
-      negligent acts) or agreed to in writing, shall any Contributor be
-      liable to You for damages, including any direct, indirect, special,
-      incidental, or consequential damages of any character arising as a
-      result of this License or out of the use or inability to use the
-      Work (including but not limited to damages for loss of goodwill,
-      work stoppage, computer failure or malfunction, or any and all
-      other commercial damages or losses), even if such Contributor
-      has been advised of the possibility of such damages.
-
-   9. Accepting Warranty or Additional Liability. While redistributing
-      the Work or Derivative Works thereof, You may choose to offer,
-      and charge a fee for, acceptance of support, warranty, indemnity,
-      or other liability obligations and/or rights consistent with this
-      License. However, in accepting such obligations, You may act only
-      on Your own behalf and on Your sole responsibility, not on behalf
-      of any other Contributor, and only if You agree to indemnify,
-      defend, and hold each Contributor harmless for any liability
-      incurred by, or claims asserted against, such Contributor by reason
-      of your accepting any such warranty or additional liability.
-
-   END OF TERMS AND CONDITIONS
-
diff --git a/templates/build.template b/templates/build.template
deleted file mode 100644
index aea57a2..0000000
--- a/templates/build.template
+++ /dev/null
@@ -1,92 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project name="PROJECT_NAME" default="help">
-
-    <!-- The local.properties file is created and updated by the 'android' tool.
-         It contains the path to the SDK. It should *NOT* be checked into
-         Version Control Systems. -->
-    <property file="local.properties" />
-
-    <!-- The ant.properties file can be created by you. It is only edited by the
-         'android' tool to add properties to it.
-         This is the place to change some Ant specific build properties.
-         Here are some properties you may want to change/update:
-
-         source.dir
-             The name of the source directory. Default is 'src'.
-         out.dir
-             The name of the output directory. Default is 'bin'.
-
-         For other overridable properties, look at the beginning of the rules
-         files in the SDK, at tools/ant/build.xml
-
-         Properties related to the SDK location or the project target should
-         be updated using the 'android' tool with the 'update' action.
-
-         This file is an integral part of the build system for your
-         application and should be checked into Version Control Systems.
-
-         -->
-    <property file="ant.properties" />
-
-    <!-- if sdk.dir was not set from one of the property file, then
-         get it from the ANDROID_HOME env var.
-         This must be done before we load project.properties since
-         the proguard config can use sdk.dir -->
-    <property environment="env" />
-    <condition property="sdk.dir" value="${env.ANDROID_HOME}">
-        <isset property="env.ANDROID_HOME" />
-    </condition>
-
-    <!-- The project.properties file is created and updated by the 'android'
-         tool, as well as ADT.
-
-         This contains project specific properties such as project target, and library
-         dependencies. Lower level build properties are stored in ant.properties
-         (or in .classpath for Eclipse projects).
-
-         This file is an integral part of the build system for your
-         application and should be checked into Version Control Systems. -->
-    <loadproperties srcFile="project.properties" />
-
-    <!-- quick check on sdk.dir -->
-    <fail
-            message="sdk.dir is missing. Make sure to generate local.properties using 'android update project' or to inject it through the ANDROID_HOME environment variable."
-            unless="sdk.dir"
-    />
-
-    <!--
-        Import per project custom build rules if present at the root of the project.
-        This is the place to put custom intermediary targets such as:
-            -pre-build
-            -pre-compile
-            -post-compile (This is typically used for code obfuscation.
-                           Compiled code location: ${out.classes.absolute.dir}
-                           If this is not done in place, override ${out.dex.input.absolute.dir})
-            -post-package
-            -post-build
-            -pre-clean
-    -->
-    <import file="custom_rules.xml" optional="true" />
-
-    <!-- Import the actual build file.
-
-         To customize existing targets, there are two options:
-         - Customize only one target:
-             - copy/paste the target into this file, *before* the
-               <import> task.
-             - customize it to your needs.
-         - Customize the whole content of build.xml
-             - copy/paste the content of the rules files (minus the top node)
-               into this file, replacing the <import> task.
-             - customize to your needs.
-
-         ***********************
-         ****** IMPORTANT ******
-         ***********************
-         In all cases you must update the value of version-tag below to read 'custom' instead of an integer,
-         in order to avoid having your file be overridden by tools such as "android update project"
-    -->
-    <!-- version-tag: VERSION_TAG -->
-    <import file="${sdk.dir}/tools/ant/build.xml" />
-
-</project>
diff --git a/templates/build_gradle.template b/templates/build_gradle.template
deleted file mode 100644
index 6ec137c..0000000
--- a/templates/build_gradle.template
+++ /dev/null
@@ -1,21 +0,0 @@
-buildscript {
-    repositories {
-        mavenCentral()
-    }
-    dependencies {
-        classpath 'com.android.tools.build:gradle:ARTIFACT_VERSION'
-    }
-}
-apply plugin: 'PLUGIN'
-
-android {
-    compileSdkVersion 'TARGET'
-    buildToolsVersion 'BUILD_TOOL_REV'
-
-    buildTypes {
-        release {
-            runProguard false
-            proguardFile getDefaultProguardFile('proguard-android.txt')
-        }
-    }
-}
diff --git a/templates/docs/cssreset-min.css b/templates/docs/cssreset-min.css
deleted file mode 100644
index b0a6fe6..0000000
--- a/templates/docs/cssreset-min.css
+++ /dev/null
@@ -1,7 +0,0 @@
-/*
-YUI 3.6.0 (build 5521)
-Copyright 2012 Yahoo! Inc. All rights reserved.
-Licensed under the BSD License.
-http://yuilibrary.com/license/
-*/
-html{color:#000;background:#FFF}body,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,code,form,fieldset,legend,input,textarea,p,blockquote,th,td{margin:0;padding:0}table{border-collapse:collapse;border-spacing:0}fieldset,img{border:0}address,caption,cite,code,dfn,em,strong,th,var{font-style:normal;font-weight:normal}ol,ul{list-style:none}caption,th{text-align:left}h1,h2,h3,h4,h5,h6{font-size:100%;font-weight:normal}q:before,q:after{content:''}abbr,acronym{border:0;font-variant:normal}sup{vertical-align:text-top}sub{vertical-align:text-bottom}input,textarea,select{font-family:inherit;font-size:inherit;font-weight:inherit}input,textarea,select{*font-size:100%}legend{color:#000}#yui3-css-stamp.cssreset{display:none}
diff --git a/templates/docs/default.css b/templates/docs/default.css
deleted file mode 100644
index 76718ac..0000000
--- a/templates/docs/default.css
+++ /dev/null
@@ -1,268 +0,0 @@
-/*
- * Copyright 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.
- */
-
-/* Page stylesheet */
-
-html {
-  font-family: Roboto, sans-serif;
-  color: #333;
-  -webkit-font-smoothing: antialiased;
-}
-
-pre {
-  font-family: Inconsolata, monospace;
-  border: 0;
-  padding: 0;
-}
-
-code {
-  font-family: Inconsolata, monospace;
-  color: #060;
-}
-
-#page-content {
-  margin: 48px 64px 48px 320px;
-}
-
-a {
-  color: #33b5e5;
-  text-decoration: none;
-  border-bottom: 1px solid #33b5e5;
-}
-
-a:hover {
-  border-bottom: 2px solid #33b5e5;
-}
-
-a:visited {
-  color: #09c;
-}
-
-a:active, a:focus {
-  color: #fff;
-  background-color: #09c;
-  border-radius: 2px;
-  padding: 2px 0;
-  border: 0;
-}
-
-a:active *, a:focus * {
-  color: #fff;
-}
-
-nav {
-  position: fixed;
-  left: 0;
-  top: 0;
-  box-sizing: border-box;
-  width: 256px;
-  bottom: 0;
-  margin: 32px 0;
-  padding: 16px 0 16px 32px;
-  overflow-y: scroll;
-  font-size: 14px;
-  line-height: 16px;
-  border-top: 2px solid #eee;
-  border-bottom: 2px solid #eee;
-  border-right: 2px solid #eee;
-}
-
-nav span {
-  cursor: pointer;
-  display: block;
-  padding-left: 16px;
-  padding-top: 4px;
-  padding-bottom: 4px;
-}
-
-nav span:hover {
-  color: #09c;
-}
-
-nav .selected > span {
-  background-color: #eee;
-  border-right: 2px solid #333;
-}
-
-nav > .item > span {
-  font-weight: 600;
-}
-
-nav .children {
-  margin-left: 16px;
-}
-
-h2, h3, h4.includetoc {
-  color: #000;
-  cursor: pointer;
-  position: relative;
-}
-
-h2:hover:before, h3:hover:before, h4.includetoc:hover:before {
-  content: '';
-  opacity: 0.3;
-  position: absolute;
-  left: -32px;
-  bottom: 0;
-  width: 24px;
-  height: 24px;
-  /* "Link" symbol by David Waschbüsch, from The Noun Project (thenounproject.com) */
-  background-image: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB2ZXJzaW9uPSIxLjEiIGlkPSJMYXllcl8xIiB4PSIwcHgiIHk9IjBweCIgd2lkdGg9IjcwLjg2NnB4IiBoZWlnaHQ9IjcwLjg2NnB4IiB2aWV3Qm94PSItNTkuNDE4IDE0LjU2NyA3MC44NjYgNzAuODY2IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IC01OS40MTggMTQuNTY3IDcwLjg2NiA3MC44NjYiIHhtbDpzcGFjZT0icHJlc2VydmUiPgo8Zz4KCTxnPgoJCTxwYXRoIGQ9Ik0tMjguNTUyLDYxLjQ4NWMtMC4wMTcsMC4wMTYtMC4wMjksMC4wMzUtMC4wNDYsMC4wNTNsLTUuODI1LDUuNzI1Yy0wLjk1MiwwLjkzOC0yLjIxNCwxLjQ0NS0zLjU0OSwxLjQzNCAgICBzLTIuNTg2LTAuNTQzLTMuNTIyLTEuNDk0Yy0xLjkzMS0xLjk2Ny0xLjkwMy01LjEzOSwwLjA2My03LjA3Mmw1LjgyNi01LjcyNWMwLjAxNy0wLjAxNywwLjAzOC0wLjAyOCwwLjA1Ny0wLjA0Nmw2LjkyNS02LjgwNiAgICBjLTEuMDc2LTAuMzYyLTIuMjExLTAuNTcxLTMuMzgyLTAuNTgyYy0yLjkzOC0wLjAyNi01LjcwOSwxLjA5NS03LjgwNCwzLjE1MmwtNS44MjcsNS43MjcgICAgYy00LjMyNiw0LjI0OC00LjM4OCwxMS4yMjctMC4xMzcsMTUuNTU1YzIuMDU4LDIuMDk2LDQuODEzLDMuMjY2LDcuNzUsMy4yOTFzNS43MTEtMS4wOTQsNy44MDYtMy4xNTJsNS44MjUtNS43MjcgICAgYzIuMDk2LTIuMDU5LDMuMjY1LTQuODEzLDMuMjkyLTcuNzQ4YzAuMDA5LTEuMTcyLTAuMTgxLTIuMzA3LTAuNTIzLTMuMzkzTC0yOC41NTIsNjEuNDg1eiIvPgoJCTxwYXRoIGQ9Ik0tMi4yMDIsMjguNTk0Yy0yLjA2Mi0yLjA5Ni00LjgxMy0zLjI2NC03Ljc1LTMuMjljLTIuOTQtMC4wMjYtNS43MSwxLjA5NC03LjgwNywzLjE1NGwtNS44MjUsNS43MjMgICAgYy0zLjA0NCwyLjk5MS0zLjk2Niw3LjMyNy0yLjc3MSwxMS4xNDVsNi45MjItNi44MDFjMC4wMi0wLjAyMSwwLjAzMy0wLjA0NSwwLjA1My0wLjA2NGw1LjgyNi01LjcyNCAgICBjMC45NTQtMC45MzYsMi4yMTItMS40NDUsMy41NDktMS40MzNjMS4zMzUsMC4wMTEsMi41ODUsMC41NDMsMy41MjIsMS40OTVjMC45MzYsMC45NTIsMS40NDUsMi4yMTIsMS40MzQsMy41NDggICAgYy0wLjAxMywxLjMzNS0wLjU0NCwyLjU4Ny0xLjQ5NSwzLjUyM2wtNS44MjYsNS43MjNjLTAuMDE2LDAuMDE2LTAuMDM0LDAuMDI1LTAuMDUsMC4wNDFsLTYuOTMxLDYuODEgICAgYzEuMDc3LDAuMzYxLDIuMjEsMC41NzEsMy4zOCwwLjU4MmMyLjkzOCwwLjAyNCw1LjcxLTEuMDk1LDcuODA1LTMuMTU0bDUuODI3LTUuNzIzYzIuMDk1LTIuMDU5LDMuMjY0LTQuODEyLDMuMjktNy43NDkgICAgQzAuOTc2LDMzLjQ2MS0wLjE0NCwzMC42ODgtMi4yMDIsMjguNTk0eiIvPgoJPC9nPgoJPHBhdGggZD0iTS0xMy40MSwzOS42MDRjMS4xODMsMS4yMDMsMS4wMDEsMy4yOTktMC40MDUsNC42OEwtMjkuODgsNjAuMDY5Yy0xLjQwNSwxLjM4MS0zLjUwNSwxLjUyNy00LjY4OCwwLjMyNGwwLDAgICBjLTEuMTgtMS4yMDMtMC45OTgtMy4yOTcsMC40MDgtNC42OGwxNi4wNjUtMTUuNzg0Qy0xNi42ODgsMzguNTQ4LTE0LjU5MiwzOC40MDItMTMuNDEsMzkuNjA0TC0xMy40MSwzOS42MDR6Ii8+CjwvZz4KPC9zdmc+);
-  background-size: 24px 24px;
-}
-
-strong {
-  font-weight: 600;
-}
-
-em {
-  font-style: italic;
-}
-
-h1 {
-  font-size: 48px;
-  line-height: 48px;
-  font-weight: 100;
-  margin-bottom: 6px;
-}
-
-h2 {
-  font-weight: 600;
-  font-size: 24px;
-  line-height: 24px;
-  margin-top: 64px;
-  margin-bottom: 12px;
-  border-top: 2px solid #eee;
-  padding-top: 48px;
-}
-
-h3 {
-  font-size: 24px;
-  line-height: 24px;
-  font-weight: 300;
-  margin-bottom: 12px;
-  padding-top: 48px;
-  margin-top: -16px;
-}
-
-p, h4, ol, ul, dl {
-  font-size: 16px;
-  line-height: 24px;
-}
-
-p, ol, ul, dl {
-  font-weight: 400;
-  margin-bottom: 16px;
-}
-
-ol ol, ul ul {
-  margin-bottom: 0;
-}
-
-.note {
-  border-left: 4px solid #09c;
-  padding-left: 16px;
-}
-
-.note + .note {
-  margin-top: -16px;
-}
-
-.dim {
-  opacity: 0.33;
-}
-
-ol li {
-  list-style-type: decimal;
-  list-style-position: outside;
-  margin-left: 32px;
-}
-
-ul li {
-  list-style: square;
-  list-style-position: outside;
-  margin-left: 32px;
-}
-
-dl {
-  margin-left: 16px;
-}
-
-dl dt {
-  float: left;
-  display: inline-block;
-  vertical-align: top;
-  width: 120px;
-  clear: both;
-}
-
-dl dd {
-  margin-left: 120px;
-  margin-bottom: 8px;
-}
-
-dl dt code {
-  color: inherit;
-}
-
-h4 {
-  font-weight: 600;
-  margin-top: 24px;
-  margin-bottom: 0;
-  color: #000;
-}
-
-pre {
-  background-color: #fcfcfc;
-  border-radius: 4px;
-  box-shadow: inset 0 2px 8px rgba(0,0,0,0.1);
-  border: 1px solid #ddd;
-  padding: 24px;
-  margin-bottom: 16px;
-}
-
-.deprecated,
-.deprecated h4,
-.deprecated pre,
-.deprecated code {
-  color: #a77 !important;
-}
-
-.deprecated h4 {
-}
-
-.deprecated h4:after {
-  border-radius: 2px;
-  text-decoration: none;
-  background-color: #a77;
-  padding: 4px 6px;
-  margin-left: 10px;
-  color: #fff;
-  font-size: 12px;
-  content: 'DEPRECATED';
-}
-
-/* print */
-
-@media print {
-  nav {
-    display: none;
-  }
-
-  #page-content {
-    margin-left: 64px;
-  }
-}
diff --git a/templates/docs/default.js b/templates/docs/default.js
deleted file mode 100644
index 4be99c9..0000000
--- a/templates/docs/default.js
+++ /dev/null
@@ -1,155 +0,0 @@
-/*
- * Copyright 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.
- */
-
-$(document).ready(function() {
-  prettyPrint();
-  preventParentScrolls('nav');
-
-  var sluggify_ = function(s) {
-    return (s || '').replace(/ /g, '-').replace(/[^\w-]/g, '').toLowerCase();
-  };
-
-  $('h2, h3, h4.includetoc').each(function() {
-    $(this).attr('id', 'toc_' + sluggify_($(this).data('tocid') || $(this).data('toctitle') || $(this).text()));
-    $(this).click(function() {
-      smoothScrollToId($(this).attr('id'));
-    });
-  });
-
-  var buildNav_ = function(queries, $contentRoot, $navRoot) {
-    if (!queries || !queries.length) {
-      return;
-    }
-
-    $contentRoot.find(queries[0]).each(function() {
-      var $navNode = $('<div>')
-          .text($(this).html())
-          .appendTo($navRoot);
-      buildNav_(queries.splice(1), $(this), $navNode);
-    });
-  };
-
-  buildNav();
-});
-
-function buildNav() {
-  var currentLevel = 2;
-  var $currentParent = $('nav');
-  var $currentNode = null;
-
-  $('#page-content').find('h2, h3, h4.includetoc').each(function() {
-    var level = $(this).get(0).tagName.substring(1);
-
-    if (level < currentLevel) {
-      // ascend
-      for (var i = 0; i < (currentLevel - level); i++) {
-        $currentParent = $currentParent.parents('div.children, nav').first();
-      }
-
-    } else if (level > currentLevel) {
-      // descend
-      $currentParent = $('<div>')
-          .addClass('children')
-          .appendTo($currentNode);
-    }
-
-    var tocId = $(this).attr('id');
-    var navId = tocId.replace(/toc_/, 'nav_');
-
-    $interactionNode = $('<span>')
-        .html($(this).data('toctitle') || $(this).html())
-        .data('target', tocId)
-        .click(function() {
-          smoothScrollToId($(this).data('target'));
-        });
-
-    $currentNode = $('<div>')
-        .attr('id', navId)
-        .addClass('item')
-        .append($interactionNode)
-        .appendTo($currentParent);
-
-    currentLevel = level;
-  });
-
-  var headerPositionCache = [];
-  var rebuildHeaderPositionCache_ = function() {
-    headerPositionCache = [];
-    $('#page-content').find('h2, h3, h4.includetoc').each(function() {
-      headerPositionCache.push({
-        id: $(this).attr('id').replace(/toc_/, 'nav_'),
-        top: $(this).offset().top
-      });
-    });
-  };
-
-  var updateSelectedNavPosition_ = function() {
-    $('nav .item').removeClass('selected');
-    var scrollTop = $(window).scrollTop();
-    for (var i = headerPositionCache.length - 1; i >= 0; i--) {
-      if (scrollTop >= headerPositionCache[i].top) {
-        $('#' + headerPositionCache[i].id).addClass('selected');
-        break;
-      }
-    }
-  };
-
-  rebuildHeaderPositionCache_();
-  $(window).resize(function() {
-    rebuildHeaderPositionCache_();
-    updateSelectedNavPosition_();
-  });
-
-  $(window).scroll(function() {
-    updateSelectedNavPosition_();
-  });
-}
-
-function smoothScrollToId(id) {
-  var $target = $('#' + id);
-  $('body').animate({ scrollTop: $target.offset().top }, 200, 'swing', function() {
-    document.location.hash = id;
-  });
-}
-
-// Based on http://stackoverflow.com/questions/5802467/prevent-scrolling-of-parent-element
-function preventParentScrolls($el) {
-  $($el).on('DOMMouseScroll mousewheel', function(ev) {
-    var $this = $(this),
-        scrollTop = this.scrollTop,
-        scrollHeight = this.scrollHeight,
-        height = $this.height(),
-        delta = (ev.type == 'DOMMouseScroll' ?
-            ev.originalEvent.detail * -40 :
-            ev.originalEvent.wheelDelta),
-        up = delta > 0;
-
-    if (!up && -delta > scrollHeight - height - scrollTop) {
-      // Scrolling down, but this will take us past the bottom.
-      $this.scrollTop(scrollHeight);
-    } else if (up && delta > scrollTop) {
-      // Scrolling up, but this will take us past the top.
-      $this.scrollTop(0);
-    } else {
-      $this.scrollTop(scrollTop - delta);
-    }
-
-    ev.stopPropagation();
-    ev.preventDefault();
-    ev.returnValue = false;
-    return false;
-  });
-}
\ No newline at end of file
diff --git a/templates/docs/index.html b/templates/docs/index.html
deleted file mode 100755
index d127bfe..0000000
--- a/templates/docs/index.html
+++ /dev/null
@@ -1,731 +0,0 @@
-<!DOCTYPE html>
-<html>
-<!--
-  Copyright 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.
-  -->
-<head>
-  <meta charset="utf-8">
-  <title>Android IDE Template Format</title>
-  <link rel="stylesheet" href="cssreset-min.css">
-  <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:regular,medium,thin,italic,mediumitalic,bold;Inconsolata" title="roboto">
-  <link rel="stylesheet" href="prettify.css">
-  <link rel="stylesheet" href="default.css">
-  <script src="jquery-1.8.0.min.js"></script>
-  <script src="prettify.js"></script>
-  <script src="default.js"></script>
-</head>
-<body>
-  
-<nav>
-
-</nav>
-
-<div id="page-content">
-
-<h1>Android IDE Template Format</h1>
-<br>
-<dl style="margin:0">
-  <dt>Format Version</dt>
-  <dd style="margin:0">4</dd>
-
-  <dt>Last Updated</dt>
-  <dd style="margin:0">1/30/2014</dd>
-</dl>
-
-
-
-
-
-<h2>Overview</h2>
-
-<p>This document describes the format and syntax for Android code templates. These templates provide starting points for entire projects (e.g. <code>NewAndroidApplication</code>) or application components such as activities (e.g. <code>BlankActivity</code>).</p>
-
-<p>Although these templates were originally introduced in the <a href="http://developer.android.com/tools/sdk/eclipse-adt.html">ADT Plugin</a> for Eclipse, the template format is designed for use by any IDE or command-line tool.</p>
-
-<p>Templates are customizable. Each template exposes several options (called parameters) that allow developers to customize the generated code. The most common workflow for <em>using</em> a template is as follows:</p>
-
-<ol>
-  <li>Choose a template.</li>
-  <li>Populate template options (parameters).</li>
-  <li>Preview and then execute the additions/changes to your project.</li>
-</ol>
-
-<h3>FreeMarker</h3>
-
-<p>Templates make heavy use of <a href="http://freemarker.sourceforge.net/">FreeMarker</a>, a Java templating engine used to enable things like control flows and variable substitutions inside files. It's similar to PHP, Django templates, etc. For those more acquainted with C/C++, think of it as a <a href="http://en.wikipedia.org/wiki/C_preprocessor">preprocessor</a> language (i.e. <code>#ifdef</code>).</p>
-
-<p>By convention, any file in the template directory structure that is to be processed by FreeMarker should have the <code>.ftl</code> file extension. So if one of your source files is <code>MyActivity.java</code>, and it contains FreeMarker instructions, it should be named something like <code>MyActivity.java.ftl</code>.</p>
-
-<p>For more documentation on FreeMarker, see the <a href="http://freemarker.sourceforge.net/docs/index.html">docs</a>. In particular, the <a href="http://freemarker.sourceforge.net/docs/ref_builtins_string.html">reference on string operations</a>.</p>
-
-<p>An example, templated version of an Android manifest, normally named <code>AndroidManifest.xml.ftl</code> is shown below.</p>
-
-<pre class="prettyprint lang-xml">
-&lt;manifest xmlns:android="http://schemas.android.com/apk/res/android"&gt;
-    &lt;application&gt;
-        &lt;activity android:name="<strong>${packageName}.${activityClass}</strong>"
-            android:parentActivityName="<strong>${parentActivityClass}</strong>"
-            android:label="@string/title_<strong>${activityToLayout(activityClass)}</strong>">
-            <strong>&lt;#if parentActivityClass != ""&gt;</strong>
-            &lt;meta-data android:name="android.support.PARENT_ACTIVITY"
-                android:value="<strong>${parentActivityClass}</strong>" /&gt;
-            <strong>&lt;/#if&gt;</strong>
-            <strong>&lt;#if isLauncher&gt;</strong>
-            &lt;intent-filter&gt;
-                &lt;action android:name="android.intent.action.MAIN" /&gt;
-                &lt;category android:name="android.intent.category.LAUNCHER" /&gt;
-            &lt;/intent-filter&gt;
-            <strong>&lt;/#if&gt;</strong>
-        &lt;/activity&gt;
-    &lt;/application&gt;
-&lt;/manifest&gt;
-</pre>
-
-<p>In this example excerpt from the <code>BlankActivity</code> template:</p>
-
-<ul>
-  <li>The expression <code>${activityClass}</code> is bound to the value of the 'Activity Class' template parameter.</li>
-  <li>The expression <code>${activityToLayout(activityClass)}</code> uses the <code>activityToLayout</code> method built into the template engine to convert an activity class such as <code>MyFooActivity</code> to <code>activity_my_foo</code>.</li>
-  <li>The <code>isLauncher</code> boolean variable and <code>parentActivityClass</code> string variables are bound to the values of the 'Launcher Activity' and 'Hierarchical Parent' template parameter, respectively.</li>
-</ul>
-
-
-
-
-
-<h2>Directory Structure</h2>
-
-<p>A template is a directory containing a number of XML and FreeMarker files. The only two mandatory files are <code>template.xml</code> and <code>recipe.xml.ftl</code>. Template source files (PNG files, templated Java and XML files, etc.) belong in a <code>root/</code> subdirectory. An example directory structure for a template is below:</p>
-
-<ul>
-  <li><strong>MyTemplate/</strong> <span class="dim">&mdash; Root directory</span><ul>
-    <li><a href="#toc_templatexml">template.xml</a> <span class="dim">&mdash; Metadata (description, parameters, etc.)</span></li>
-    <li><a href="#toc_recipexmlftl">recipe.xml.ftl</a> <span class="dim">&mdash; Instructions/script (files to copy, etc.)</span></li>
-    <li><a href="#toc_globalsxmlftl">globals.xml.ftl </a><span class="dim">&mdash; Optional global variables</span></li>
-    <li>template.png <span class="dim">&mdash; Default template thumbnail</span></li>
-    <li>template_foo.png <span class="dim">&mdash; Thumbnail when option 'foo' is selected</span></li>
-    <li>template_bar.png</li>
-    <li><strong><a href="#toc_root">root/</a></strong> <span class="dim">&mdash; Source files (which get processed/copied/merged with the output project)</span><ul>
-      <li>AndroidManifest.xml.ftl</li>
-      <li><strong>res/</strong> <ul>
-        <li>&hellip;</li>
-      </ul></li>
-      <li><strong>src/</strong> <ul>
-        <li><strong>app_package/</strong> <ul>
-          <li>MyActivity.java.ftl</li>
-        </ul></li>
-      </ul></li>
-    </ul></li>
-  </ul>
-</li>
-</ul>
-<br>
-
-<p>More on the role of each of these files is discussed in the sections below.</p>
-
-<h3>template.xml</h3>
-
-<p>Each template directory must contain a <code>template.xml</code> file. This XML file contains metadata about the template, including the name, description, category and user-visible parameters that the IDE will present as options to the user. The XML file also indicates the name of the <a href="#toc_recipexmlftl">recipe XML file</a> (which gets processed by FreeMarker), and the <a href="#toc_globalsxmlftl">global variables XML file</a> if there are global variables besides the template parameter values that should be visible to all FreeMarker-processed files (<code>.ftl</code> files).</p>
-
-<p>An example <code>template.xml</code> is shown below.</p>
-
-<pre class="prettyprint lang-xml">
-&lt;!-- A template for a blank activity. Use template format
-     version 4, as described in this document. -->
-&lt;template
-    format="4"
-    revision="2"
-    minApi="7"
-    minBuildApi="16"
-    name="Blank Activity"
-    description="Creates a new blank activity, with navigation."&gt;
-
-    &lt;!-- A string parameter; the value is available to FreeMarker
-         processed files (.ftl files) as ${activityName}. -->
-    &lt;parameter
-        id="activityClass"
-        name="Activity Name"
-        type="string"
-        constraints="class|unique|nonempty"
-        suggest="${layoutToActivity(layoutName)}"
-        default="MainActivity"
-        help="The name of the activity class to create." /&gt;
-
-    &lt;parameter
-        id="layoutName"
-        name="Layout Name"
-        type="string"
-        constraints="layout|unique|nonempty"
-        suggest="${activityToLayout(activityClass)}"
-        default="activity_main"
-        help="The name of the layout to create for the activity" /&gt;
-
-    &lt;parameter
-        id="navType"
-        name="Navigation Type"
-        type="enum"
-        default="none"
-        help="The type of navigation to use for the activity"&gt;
-        &lt;option id="none"&gt;None&lt;/option&gt;
-        &lt;option id="tabs" minApi="11"&gt;Tabs&lt;/option&gt;
-        &lt;option id="pager" minApi="11"&gt;Swipe Views&lt;/option&gt;
-        &lt;option id="dropdown" minApi="11"&gt;Dropdown&lt;/option&gt;
-    &lt;/parameter&gt;
-
-    &lt;parameter
-        id="fragmentName"
-        name="Fragment Name"
-        type="string"
-        constraints="class|unique|nonempty"
-        default="MainFragment"
-        visibility="navType != 'none'"
-        help="The name of the fragment class to create" /&gt;
-
-    &lt;!-- 512x512 PNG thumbnails. --&gt;
-    &lt;thumbs&gt;
-        &lt;!-- Default thumbnail. --&gt;
-        &lt;thumb&gt;template_default.png&lt;/thumb&gt;
-        &lt;!-- Attributes act as selectors based on chosen parameters. --&gt;
-        &lt;thumb navType="tabs"&gt;template_tabs.png&lt;/thumb&gt;
-        &lt;thumb navType="dropdown"&gt;template_dropdown.png&lt;/thumb&gt;
-    &lt;/thumbs&gt;
-
-    &lt;!-- Optional global variables. --&gt;
-    &lt;globals file="globals.xml.ftl" /&gt;
-
-    &lt;!-- Required recipe (script) to run when instantiating
-         the template. --&gt;
-    &lt;execute file="recipe.xml.ftl" /&gt;
-&lt;/template&gt;
-</pre>
-
-<p>Below is a listing of supported tags in <code>template.xml</code>.</p>
-
-<h4 class="includetoc">&lt;template&gt;</h4>
-
-<p>The template root element.</p>
-
-<dl>
-  <dt><code>format</code></dt>
-  <dd>The template format version that this template adheres to. Should be <code>4</code>.</dd>
-
-  <dt><code>revision</code></dt>
-  <dd>Optional. The version of this template (which you can increment when updating the template), as an integer.</dd>
-
-  <dt><code>name</code></dt>
-  <dd>The template's display name.</dd>
-
-  <dt><code>description</code></dt>
-  <dd>The template's description.</dd>
-
-  <dt><code>minApi</code></dt>
-  <dd>Optional. The minimum API level required for this template. The IDE will ensure that the target project has a <code>minSdkVersion</code> no lower than this value before instantiating the template.</dd>
-
-  <dt><code>minBuildApi</code></dt>
-  <dd>Optional. The minimum build target (expressed as an API level) required for this template. The IDE will ensure that the target project is targeting an API level greater than or equal to this value before instantiating the template. This ensures that the template can safely use newer APIs (optionally guarded by runtime API level checks) without introducing compile-time errors into the target project.</dd>
-</dl>
-
-<div class="deprecated">
-<h4 class="includetoc">&lt;dependency&gt;</h4>
-
-<p>This tag is deprecated for use in <code>template.xml</code>. Use <a href="#toc_recipe_dependency"><code>&lt;dependency&gt;</code></a> in <code>recipe.xml.ftl</code> instead.</p>
-
-<p>Indicates that the template requires that a given library be present in the target project. If not present, the IDE will add the dependency to the project.</p>
-
-<dl>
-  <dt><code>name</code></dt>
-  <dd>The name of the library. Currently accepted values are:<ul>
-    <li><code>android-support-v4</code></li>
-    <li><code>android-support-v13</code></li>
-  </ul></dd>
-
-  <dt><code>revision</code></dt>
-  <dd>The minimum revision of the library required by this template.</dd>
-</dl>
-</div>
-
-<div class="deprecated">
-<h4 class="includetoc">&lt;category&gt;</h4>
-
-<p>The template type. This element is optional.</p>
-
-<dl>
-  <dt><code>value</code></dt>
-  <dd>The template type. Should be one of the following values: <ul>
-    <li><code>Applications</code></li>
-    <li><code>Activities</code></li>
-    <li><code>UI Components</code></li>
-  </ul></dd>
-</dl>
-</div>
-
-<h4 class="includetoc">&lt;parameter&gt;</h4>
-
-<p>Defines a user-customizable template parameter.</p>
-
-<dl>
-  <dt><code>id</code></dt>
-  <dd>The identifier representing this variable, made available as a global variable in FreeMarker files. If the identifier is <code>foo</code>, the parameter value will be available in FreeMarker files as <code>${foo}</code>.</dd>
-
-  <dt><code>name</code></dt>
-  <dd>The display name of the template parameter.</dd>
-
-  <dt><code>type</code></dt>
-  <dd>The data type of the parameter. Either <code>string</code>, <code>boolean</code>, <code>enum</code>, or <code>separator</code>.</dd>
-
-  <dt><code>constraints</code></dt>
-  <dd>Optional. Constraints to impose on the parameter's value. Constraints can be combined using <code>|</code>. Valid constraint types are: <ul>
-    <li><code>nonempty</code> &mdash; the value must not be empty</li>
-    <li><code>apilevel</code> &mdash; the value should represent a numeric API level</li>
-    <li><code>package</code> &mdash; the value should represent a valid Java package name</li>
-    <li><code>app_package</code> &mdash; the value should represent a valid Android app package name</li>
-    <li><code>module</code> &mdash; the value should represent a valid Module name</li>
-    <li><code>class</code> &mdash; the value should represent a valid Java class name</li>
-    <li><code>activity</code> &mdash; the value should represent a fully-qualified activity class name</li>
-    <li><code>layout</code> &mdash; the value should represent a valid layout resource name</li>
-    <li><code>drawable</code> &mdash; the value should represent a valid drawable resource name</li>
-    <li><code>string</code> &mdash; the value should represent a valid string resource name</li>
-    <li><code>id</code> &mdash; the value should represent a valid id resource name</li>
-    <li><code>unique</code> &mdash; the value must be unique; this constraint only makes sense when other constraints are specified, such as <code>layout</code>, which would mean that the value should not represent an existing layout resource name</li>
-    <li><code>exists</code> &mdash; the value must already exist; this constraint only makes sense when other constraints are specified, such as <code>layout</code>, which would mean that the value should represent an existing layout resource name</li>
-  </ul></dd>
-
-  <dt><code>suggest</code></dt>
-  <dd>Optional. A FreeMarker expression representing the auto-suggested parameter value (a 'dynamic default'). When the user modifies other parameter values, and if this parameter's value has not been changed from its default, then the value changes to the result of this expression. This may seem to be circular since parameters can <code>suggest</code> against each other's values, but these expressions are only updated for non-edited values, so this approach lets the user edit either parameter value, and the other will automatically be updated to a reasonable default.</dd>
-
-  <dt><code>default</code></dt>
-  <dd>Optional. The default value for this parameter.</dd>
-
-  <dt><code>visibility</code></dt>
-  <dd>Optional. A FreeMarker expression that determines whether this parameter should be visible. The expression should evaluate to a boolean value (i.e. true or false).</dd>
-
-  <dt><code>help</code></dt>
-  <dd>Optional. The help string to display to the user for this parameter.</dd>
-
-</dl>
-
-<h4 class="includetoc">&lt;option&gt;</h4>
-
-<p>For parameters of type <code>enum</code>, represents a choice for the value.</p>
-
-<dl>
-  <dt><code>id</code></dt>
-  <dd>The parameter value to set if this option is chosen.</dd>
-
-  <dt><code>minApi</code></dt>
-  <dd>Optional. The minimum API level required if this option is chosen. The IDE will ensure that the target project has a <code>minSdkVersion</code> no lower than this value before instantiating the template.</dd>
-
-  <dt><code>[text]</code></dt>
-  <dd>The text content of this element represents the display value of the choice.</dd>
-</dl>
-
-<h4 class="includetoc">&lt;thumb&gt;</h4>
-
-<p>Represents a thumbnail for the template. <code>&lt;thumb&gt;</code> elements should be contained inside a <code>&lt;thumbs&gt;</code> element. The text contents of this element represent the path to the thumbnail. If this element has any attributes, they will be treated as selectors for parameter values. For example, if there are two thumbnails:</p>
-
-<pre class="prettyprint lang-xml">
-&lt;thumbs&gt;
-  &lt;thumb&gt;template.png&lt;/thumb&gt;
-  &lt;thumb navType="tabs"&gt;template_tabs.png&lt;/thumb&gt;
-&lt;/thumbs&gt;
-</pre>
-
-<p>The template 'preview' thumbnail will show <code>template_tabs.png</code> if the value of the <code>navType</code> template parameter is <code>tabs</code> and <code>template.png</code> otherwise.</p>
-
-<h4 class="includetoc">&lt;icons&gt;</h4>
-
-<p>States that the template would like the Asset Studio icon creation tool of the given type to run, and save the output icons with the given name.</p>
-
-<dl>
-  <dt><code>type</code></dt>
-  <dd>The type of icon wizard to create. Valid values are <code>notification</code>, <code>actionbar</code>, <code>launcher</code>.</dd>
-
-  <dt><code>name</code></dt>
-  <dd>The base icon name to output, e.g. <code>ic_stat_my_notification</code>.</dd>
-</dl>
-
-<h3>globals.xml.ftl</h3>
-
-<p>The optional globals XML file contains global variable definitions, for use in all FreeMarker processing jobs for this template.</p>
-
-<p>An example <code>globals.xml.ftl</code> is shown below.</p>
-
-<pre class="prettyprint lang-xml">
-&lt;globals&gt;
-    &lt;global id="srcOut"
-            value="src/${slashedPackageName(packageName)}" /&gt;
-    &lt;global id="activityNameLower"
-            value="${activityName?lower_case}" /&gt;
-    &lt;global id="activityClass"
-            value="${activityName}Activity" /&gt;
-&lt;/globals&gt;
-</pre>
-
-<h3>recipe.xml.ftl</h3>
-
-<p>The recipe XML file contains the individual instructions that should be executed when generating code from this template. For example, you can copy certain files or directories (the copy instruction), optionally running the source files through FreeMarker (the instantiate instruction), and ask the IDE to open a file after the code has been generated (the open instruction).</p>
-
-<p class="note"><strong>Note:</strong> The name of the recipe file is up to you, and is defined in <code>template.xml</code>. By convention, however, it's best to call it <code>recipe.xml.ftl</code>.</p>
-
-<p class="note"><strong>Note:</strong> The global variables in <code>globals.xml.ftl</code> are available for use in <code>recipe.xml.ftl</code>.</p>
-
-<p>An example <code>recipe.xml.ftl</code> is shown below.</p>
-
-<pre class="prettyprint lang-xml">
-&lt;recipe&gt;
-    &lt;#if appCompat?has_content&gt;
-    &lt;dependency mavenUrl="com.android.support:appcompat-v7:+"/&gt;
-    &lt;/#if&gt;
-
-    &lt;!-- runs FreeMarker, then copies from
-         [template-directory]/root/ to [output-directory],
-         automatically creating directories as needed. --&gt;
-    &lt;merge from="AndroidManifest.xml.ftl"
-             to="${escapeXmlAttribute(manifestDir)}/AndroidManifest.xml" /&gt;
-
-    &lt;!-- simply copy file, don't run FreeMarker --&gt;
-    &lt;copy from="res/drawable-mdpi"
-            to="${escapeXmlAttribute(resDir)}/res/drawable-mdpi" /&gt;
-    &lt;copy from="res/drawable-hdpi"
-            to="${escapeXmlAttribute(resDir)}/res/drawable-hdpi" /&gt;
-    &lt;copy from="res/drawable-xhdpi"
-            to="${escapeXmlAttribute(resDir)}/res/drawable-xhdpi" /&gt;
-    &lt;copy from="res/drawable-xxhdpi"
-            to="${escapeXmlAttribute(resDir)}/res/drawable-xxhdpi" /&gt;
-    &lt;copy from="res/menu/main.xml"
-            to="${escapeXmlAttribute(resDir)}/res/menu/${activityNameLower}.xml" /&gt;
-
-    &lt;!-- run FreeMarker and then merge with existing files --&gt;
-    &lt;merge from="res/values/dimens.xml"
-             to="${escapeXmlAttribute(resDir)}/res/values/dimens.xml" /&gt;
-    &lt;merge from="res/values-large/dimens.xml"
-             to="${escapeXmlAttribute(resDir)}/res/values-large/dimens.xml" /&gt;
-    &lt;merge from="res/values/styles.xml"
-             to="${escapeXmlAttribute(resDir)}/res/values/styles.xml" /&gt;
-    &lt;merge from="res/values/strings.xml.ftl"
-             to="${escapeXmlAttribute(resDir)}/res/values/strings.xml" /&gt;
-
-    &lt;!-- Decide which layout to add --&gt;
-    &lt;#if navType?contains("pager")&gt;
-        &lt;instantiate
-            from="${escapeXmlAttribute(resDir)}/res/layout/activity_pager.xml.ftl"
-              to="${escapeXmlAttribute(resDir)}/res/layout/activity_${activityNameLower}.xml" /&gt;
-    &lt;#elseif navType == "tabs" || navType == "dropdown"&gt;
-        &lt;copy from="${escapeXmlAttribute(resDir)}/res/layout/activity_fragment_container.xml"
-                to="${escapeXmlAttribute(resDir)}/res/layout/activity_${activityNameLower}.xml" /&gt;
-    &lt;#else&gt;
-        &lt;copy from="${escapeXmlAttribute(resDir)}/res/layout/activity_simple.xml"
-                to="${escapeXmlAttribute(resDir)}/res/layout/activity_${activityNameLower}.xml" /&gt;
-    &lt;/#if&gt;
-
-    &lt;!-- Decide which activity code to add --&gt;
-    &lt;#if navType == "none"&gt;
-        &lt;instantiate from="src/app_package/SimpleActivity.java.ftl"
-                       to="${escapeXmlAttribute(srcOut)}/${activityClass}.java" /&gt;
-    &lt;#elseif navType == "pager"&gt;
-        &lt;instantiate from="src/app_package/PagerActivity.java.ftl"
-                       to="${escapeXmlAttribute(srcOut)}/${activityClass}.java" /&gt;
-    &lt;#elseif navType == "tabs"&gt;
-        &lt;instantiate from="src/app_package/TabsActivity.java.ftl"
-                       to="${escapeXmlAttribute(srcOut)}/${activityClass}.java" /&gt;
-    &lt;#elseif navType == "dropdown"&gt;
-        &lt;instantiate from="src/app_package/DropdownActivity.java.ftl"
-                       to="${escapeXmlAttribute(srcOut)}/${activityClass}.java" /&gt;
-    &lt;/#if&gt;
-
-    &lt;!-- open the layout file and Java class when done --&gt;
-    &lt;open file="${escapeXmlAttribute(resDir)}/res/layout/${activityNameLower}.xml" /&gt;
-    &lt;open file="${escapeXmlAttribute(srcOut)}/${activityClass}.java" /&gt;
-&lt;/recipe&gt;
-</pre>
-
-<p>The instructions below are supported:</p>
-
-<h4 class="includetoc" data-tocid="recipe_dependency">&lt;dependency&gt;</h4>
-
-<p>Indicates that the template requires that a given library be present in the target project. If not present, the IDE will add the dependency to the project.</p>
-
-<dl>
-  <dt><code>mavenUrl</code></dt>
-  <dd>The maven coordinates of the library. For example,
-    <code>com.android.support:appcompat-v7:+</code></dd>
-</dl>
-
-<h4 class="includetoc">&lt;copy&gt;</h4>
-
-<p>The only required argument is <code>from</code> which specifies the location of the source files to copy under the <code>root/</code> directory. All necessary ancestor directories are automatically created if needed.</p>
-
-<p>The default destination location is the same path under the output directory root (i.e. the location of the destination project). If the optional <code>to</code> argument is provided, this specifies the output directory. Note that if the from path ends with <code>.ftl</code>, it will automatically be stripped. For example <code>&lt;instantiate from="res/values/strings.xml.ftl" /&gt;</code> is adequate; this will create a file named <code>strings.xml</code>, not <code>strings.xml.ftl</code>.</p>
-
-<p>This argument works recursively, so if <code>from</code> is a directory, that directory is recursively copied.</p>
-
-<h4 class="includetoc">&lt;instantiate&gt;</h4>
-
-<p>Same as <code>&lt;copy&gt;</code>, but each source file is first run through FreeMarker.</p>
-
-<h4 class="includetoc">&lt;merge&gt;</h4>
-
-<p>This instruction will run the source file through FreeMarker and then merge the contents of the output into an existing file in the project, or create a new file. The most common use case for this is to add components to the <code>AndroidManifest.xml</code> file of the destination project, or to merge resources such as strings into an existing <code>strings.xml</code> file.</p>
-
-<h4 class="includetoc">&lt;open&gt;</h4>
-
-<p>Instruct the IDE to open the file created by the specified <code>file</code> argument after code generation is complete.</p>
-
-<h4 class="includetoc">&lt;mkdir&gt;</h4>
-
-<p>Ensures the directory provided in the <code>at</code> argument exists.</p>
-
-<h3>root/</h3>
-
-<p>The actual template files (resources, Java sources, Android Manifest changes) should be placed in the <code>root/</code> directory, in a directory structure that roughly resembles what the output directory structure should look like.</p>
-
-<p>One difference is that instead of placing source files in <code>src/com/google/...</code> you can just use a naming convention like <code>src/app_package/</code> to indicate that files under this directory will be placed in the destination project's source file package root.</p>
-
-
-
-
-<h2>Built-in Template Functions</h2>
-
-<p>Several functions are available to FreeMarker expressions and files beyond the standard set of built-in FreeMarker functions. These are listed below.</p>
-
-<h3 data-toctitle="activityToLayout">string <em>activityToLayout</em>(string)</h3>
-
-<p>This function converts an activity class-like identifer string, such as <code>FooActivity</code>, to a corresponding resource-friendly identifier string, such as <code>activity_foo</code>.</p>
-
-<h4>Arguments</h4>
-<dl>
-  <dt><code>activityClass</code></dt>
-  <dd>The activity class name, e.g. <code>FooActivity</code> to reformat.</dd>
-</dl>
-
-<h4>See also</h4>
-<p><a href="#toc_layouttoactivity"><code>layoutToActivity</code></a></p>
-
-<h3 data-toctitle="camelCaseToUnderscore">string <em>camelCaseToUnderscore</em>(string)</h3>
-
-<p>This function converts a camel-case identifer string, such as <code>FooBar</code>, to its corresponding underscore-separated identifier string, such as <code>foo_bar</code>.</p>
-
-<h4>Arguments</h4>
-<dl>
-  <dt><code>camelStr</code></dt>
-  <dd>The camel-case string, e.g. <code>FooBar</code> to convert to an underscore-delimited string.</dd>
-</dl>
-
-<h4>See also</h4>
-<p><a href="#toc_underscoretocamelcase"><code>underscoreToCamelCase</code></a></p>
-
-<h3 data-toctitle="escapePropertyValue">string <em>escapePropertyValue</em>(string)</h3>
-
-<p>This function escapes a string, such as <code>foo=bar</code> such that it is suitable to be inserted in a Java <code>.properties</code> file as a property value, such as <code>foo\=bar</code>.</p>
-
-<h4>Arguments</h4>
-<dl>
-  <dt><code>str</code></dt>
-  <dd>The string, e.g. <code>foo=bar</code> to escape to a proper property value.</dd>
-</dl>
-
-<h3 data-toctitle="escapeXmlAttribute">string <em>escapeXmlAttribute</em>(string)</h3>
-
-<p>This function escapes a string, such as <code>Android's</code> such that it can be used as an XML attribute value: <code>Android&amp;apos;s</code>. In particular, it will escape ', ", &lt; and &amp;.</p>
-
-<h4>Arguments</h4>
-<dl>
-  <dt><code>str</code></dt>
-  <dd>The string to be escaped.</dd>
-</dl>
-
-<h4>See also</h4>
-<p><a href="#toc_escapexmltext"><code>escapeXmlText</code></a></p>
-<p><a href="#toc_escapexmlstring"><code>escapeXmlString</code></a></p>
-
-<h3 data-toctitle="escapeXmlText">string <em>escapeXmlText</em>(string)</h3>
-
-<p>This function escapes a string, such as <code>A &amp; B's</code> such that it can be used as XML text. This means it will escape &lt; and &gt;, but unlike <a href="#toc_escapexmlattribute"><code>escapeXmlAttribute</code></a> it will <b>not</b> escape ' and ". In the preceeding example, it will escape the string to <code>A &amp;amp; B\s</code>. Note that if you plan to use the XML text as the value for a &lt;string&gt; resource value, you should consider using <a href="#toc_escapexmlstring"><code>escapeXmlString</code></a> instead, since it performs additional escapes necessary for string resources.</p>
-
-<h4>Arguments</h4>
-<dl>
-  <dt><code>str</code></dt>
-  <dd>The string to escape to proper XML text.</dd>
-</dl>
-
-<h4>See also</h4>
-<p><a href="#toc_escapexmlattribute"><code>escapeXmlAttribute</code></a></p>
-<p><a href="#toc_escapexmlstring"><code>escapeXmlString</code></a></p>
-
-<h3 data-toctitle="escapeXmlString">string <em>escapeXmlString</em>(string)</h3>
-
-<p>This function escapes a string, such as <code>A &amp; B's</code> such that it is suitable to be inserted in a string resource file as XML text, such as <code>A &amp;amp; B\s</code>. In addition to escaping XML characters like &lt; and &amp;, it also performs additional Android specific escapes, such as escaping apostrophes with a backslash, and so on.</p>
-
-<h4>Arguments</h4>
-<dl>
-  <dt><code>str</code></dt>
-  <dd>The string, e.g. <code>Activity's Title</code> to escape to a proper resource XML value.</dd>
-</dl>
-
-<h4>See also</h4>
-<p><a href="#toc_escapexmlattribute"><code>escapeXmlAttribute</code></a></p>
-<p><a href="#toc_escapexmltext"><code>escapeXmlText</code></a></p>
-
-<h3 data-toctitle="extractLetters">string <em>extractLetters</em>(string)</h3>
-
-<p>This function extracts all the letters from a string, effectively removing any punctuation and whitespace characters.</p>
-
-<h4>Arguments</h4>
-<dl>
-  <dt><code>str</code></dt>
-  <dd>The string to extract letters from</dd>
-</dl>
-
-<h3 data-toctitle="classToResource">string <em>classToResource</em>(string)</h3>
-
-<p>This function converts an Android class name, such as <code>FooActivity</code> or <code>FooFragment</code>, to a corresponding resource-friendly identifier string, such as <code>foo</code>, stripping the 'Activity' or 'Fragment' suffix. Currently stripped suffixes are listed below.</p>
-
-<ul>
-  <li>Activity</li>
-  <li>Fragment</li>
-  <li>Provider</li>
-  <li>Service</li>
-</ul>
-
-<h4>Arguments</h4>
-<dl>
-  <dt><code>className</code></dt>
-  <dd>The class name, e.g. <code>FooActivity</code> to reformat as an underscore-delimited string with suffixes removed.</dd>
-</dl>
-
-<h4>See also</h4>
-<p><a href="#toc_activitytolayout"><code>activityToLayout</code></a></p>
-
-<h3 data-toctitle="layoutToActivity">string <em>layoutToActivity</em>(string)</h3>
-
-<p>This function converts a resource-friendly identifer string, such as <code>activity_foo</code>, to a corresponding Java class-friendly identifier string, such as <code>FooActivity</code>.</p>
-
-<h4>Arguments</h4>
-<dl>
-  <dt><code>resourceName</code></dt>
-  <dd>The resource name, e.g. <code>activity_foo</code> to reformat.</dd>
-</dl>
-
-<h4>See also</h4>
-<p><a href="#toc_activitytolayout"><code>activityToLayout</code></a></p>
-
-<h3 data-toctitle="slashedPackageName">string <em>slashedPackageName</em>(string)</h3>
-
-<p>This function converts a full Java package name to its corresponding directory path. For example, if the given argument is <code>com.example.foo</code>, the return value will be <code>com/example/foo</code>.</p>
-
-<h4>Arguments</h4>
-<dl>
-  <dt><code>packageName</code></dt>
-  <dd>The package name to reformat, e.g. <code>com.example.foo</code>.</dd>
-</dl>
-
-<h3 data-toctitle="underscoreToCamelCase">string <em>underscoreToCamelCase</em>(string)</h3>
-
-<p>This function converts an underscore-delimited string, such as <code>foo_bar</code>, to its corresponding camel-case string, such as <code>FooBar</code>.</p>
-
-<h4>Arguments</h4>
-<dl>
-  <dt><code>underStr</code></dt>
-  <dd>The underscore-delimited string, e.g. <code>foo_bar</code> to convert to a camel-case string.</dd>
-</dl>
-
-<h4>See also</h4>
-<p><a href="#toc_camelcasetounderscore"><code>camelCaseToUnderscore</code></a></p>
-
-
-
-<h2>Built-in Template Parameters</h2>
-
-<p>Several parameters are available to FreeMarker expressions and files beyond <a href="#toc_parameter">those defined by the template</a>. These are listed below.</p>
-
-<h3>packageName</h3>
-
-<p>The Java-style Android package name for the project, e.g. <code>com.example.foo</code></p>
-
-<h3>applicationPackage</h3>
-
-<p>Will be the application package (i.e. the package name declared in the app manifest) if the target package for this template is not the application package. Otherwise, this parameter will be empty.</p>
-
-<h3>isNewProject</h3>
-
-<p>A boolean indicating whether or not this template is being instantiated as part of a New Project flow.</p>
-
-<h3>minApi</h3>
-
-<p>The minimum API level the project supports. Note that this value could be a string so consider using <a href="#toc_minapilevel"><code>minApiLevel</code></a> instead.</p>
-
-<h3>minApiLevel</h3>
-
-<p>The minimum API level the project supports, guaranteed to be a number. This is generally used to guard the generation of code based on the project's API level, for example:</p>
-
-<pre>
-int drawableResourceId = android.R.layout.simple_list_item_<strong>&lt;#if minApiLevel gte 11&gt;</strong>activated_<strong>&lt;/#if&gt;</strong>_1;
-</pre>
-
-<h3>buildApi</h3>
-
-<p>The API level that the project is building against, guaranteed to be a number. This is generally used to guard the generation of code based on what version of the Android SDK the project is being built against, for example:</p>
-
-<pre>
-&lt;TextView android:layout_width="wrap_content"
-    android:layout_height="<strong>&lt;#if buildApi gte 8&gt;</strong>match_parent<strong>&lt;#else&gt;</strong>fill_parent<strong>&lt;/#if&gt;</strong>" /&gt;
-</pre>
-
-<h3>manifestDir</h3>
-
-<p>The target output directory for the <code>AndroidManifest.xml</code> file. This varies depending on the project's directory structure (Gradle-style or Ant-style).</p>
-
-<h3>srcDir</h3>
-
-<p>The target Java source root directory for the project. This varies depending on the project's directory structure (Gradle-style or Ant-style). It's common to concatenate the package name:</p>
-
-<pre>
-${srcDir}/${slashedPackageName(packageName)}
-</pre>
-
-<h4>See also</h4>
-<p><a href="#toc_slashedpackagename"><code>slashedPackageName</code></a></p>
-
-<h3>resDir</h3>
-
-<p>The target resource directory root (<code>res/</code> folder) for the project. This varies depending on the project's directory structure (Gradle-style or Ant-style).</p>
-
-
-
-
-
-<h2>Notes for Template Authors</h2>
-
-<h3>Tools metadata</h3>
-
-<p>When creating activity layouts, make sure to include the activity name in the root view in the layout as part of the <code>tools</code> namespace, as shown in the following example:</p>
-
-<pre class="prettyprint lang-xml">
-&lt;TextView xmlns:android="http://schemas.android.com/apk/res/android"
-    <strong>xmlns:tools="http://schemas.android.com/tools"</strong>
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    android:gravity="center"
-    android:text="@string/hello_world"
-    android:padding="@dimen/padding_medium"
-    <strong>tools:context=".${activityClass}"</strong> /&gt;
-</pre>
-
-<p>As of ADT 20 we use this attribute in layouts to maintain a mapping to the active activity to use for a layout. (Yes, there can be more than one, but this attribute is showing the activity context you want to edit the layout as. For example, it will be used to look up a theme registration (which is per-activity rather than per-layout) in the manifest file, and we will use this for other features in the future&mdash;for example to preview the action bar, which also requires us to know the activity context.</p>
-
-</div>
-
-</body>
-</html>
diff --git a/templates/docs/jquery-1.8.0.min.js b/templates/docs/jquery-1.8.0.min.js
deleted file mode 100644
index f121291..0000000
--- a/templates/docs/jquery-1.8.0.min.js
+++ /dev/null
@@ -1,2 +0,0 @@
-/*! jQuery v@1.8.0 jquery.com | jquery.org/license */
-(function(a,b){function G(a){var b=F[a]={};return p.each(a.split(s),function(a,c){b[c]=!0}),b}function J(a,c,d){if(d===b&&a.nodeType===1){var e="data-"+c.replace(I,"-$1").toLowerCase();d=a.getAttribute(e);if(typeof d=="string"){try{d=d==="true"?!0:d==="false"?!1:d==="null"?null:+d+""===d?+d:H.test(d)?p.parseJSON(d):d}catch(f){}p.data(a,c,d)}else d=b}return d}function K(a){var b;for(b in a){if(b==="data"&&p.isEmptyObject(a[b]))continue;if(b!=="toJSON")return!1}return!0}function ba(){return!1}function bb(){return!0}function bh(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function bi(a,b){do a=a[b];while(a&&a.nodeType!==1);return a}function bj(a,b,c){b=b||0;if(p.isFunction(b))return p.grep(a,function(a,d){var e=!!b.call(a,d,a);return e===c});if(b.nodeType)return p.grep(a,function(a,d){return a===b===c});if(typeof b=="string"){var d=p.grep(a,function(a){return a.nodeType===1});if(be.test(b))return p.filter(b,d,!c);b=p.filter(b,d)}return p.grep(a,function(a,d){return p.inArray(a,b)>=0===c})}function bk(a){var b=bl.split("|"),c=a.createDocumentFragment();if(c.createElement)while(b.length)c.createElement(b.pop());return c}function bC(a,b){return a.getElementsByTagName(b)[0]||a.appendChild(a.ownerDocument.createElement(b))}function bD(a,b){if(b.nodeType!==1||!p.hasData(a))return;var c,d,e,f=p._data(a),g=p._data(b,f),h=f.events;if(h){delete g.handle,g.events={};for(c in h)for(d=0,e=h[c].length;d<e;d++)p.event.add(b,c,h[c][d])}g.data&&(g.data=p.extend({},g.data))}function bE(a,b){var c;if(b.nodeType!==1)return;b.clearAttributes&&b.clearAttributes(),b.mergeAttributes&&b.mergeAttributes(a),c=b.nodeName.toLowerCase(),c==="object"?(b.parentNode&&(b.outerHTML=a.outerHTML),p.support.html5Clone&&a.innerHTML&&!p.trim(b.innerHTML)&&(b.innerHTML=a.innerHTML)):c==="input"&&bv.test(a.type)?(b.defaultChecked=b.checked=a.checked,b.value!==a.value&&(b.value=a.value)):c==="option"?b.selected=a.defaultSelected:c==="input"||c==="textarea"?b.defaultValue=a.defaultValue:c==="script"&&b.text!==a.text&&(b.text=a.text),b.removeAttribute(p.expando)}function bF(a){return typeof a.getElementsByTagName!="undefined"?a.getElementsByTagName("*"):typeof a.querySelectorAll!="undefined"?a.querySelectorAll("*"):[]}function bG(a){bv.test(a.type)&&(a.defaultChecked=a.checked)}function bX(a,b){if(b in a)return b;var c=b.charAt(0).toUpperCase()+b.slice(1),d=b,e=bV.length;while(e--){b=bV[e]+c;if(b in a)return b}return d}function bY(a,b){return a=b||a,p.css(a,"display")==="none"||!p.contains(a.ownerDocument,a)}function bZ(a,b){var c,d,e=[],f=0,g=a.length;for(;f<g;f++){c=a[f];if(!c.style)continue;e[f]=p._data(c,"olddisplay"),b?(!e[f]&&c.style.display==="none"&&(c.style.display=""),c.style.display===""&&bY(c)&&(e[f]=p._data(c,"olddisplay",cb(c.nodeName)))):(d=bH(c,"display"),!e[f]&&d!=="none"&&p._data(c,"olddisplay",d))}for(f=0;f<g;f++){c=a[f];if(!c.style)continue;if(!b||c.style.display==="none"||c.style.display==="")c.style.display=b?e[f]||"":"none"}return a}function b$(a,b,c){var d=bO.exec(b);return d?Math.max(0,d[1]-(c||0))+(d[2]||"px"):b}function b_(a,b,c,d){var e=c===(d?"border":"content")?4:b==="width"?1:0,f=0;for(;e<4;e+=2)c==="margin"&&(f+=p.css(a,c+bU[e],!0)),d?(c==="content"&&(f-=parseFloat(bH(a,"padding"+bU[e]))||0),c!=="margin"&&(f-=parseFloat(bH(a,"border"+bU[e]+"Width"))||0)):(f+=parseFloat(bH(a,"padding"+bU[e]))||0,c!=="padding"&&(f+=parseFloat(bH(a,"border"+bU[e]+"Width"))||0));return f}function ca(a,b,c){var d=b==="width"?a.offsetWidth:a.offsetHeight,e=!0,f=p.support.boxSizing&&p.css(a,"boxSizing")==="border-box";if(d<=0){d=bH(a,b);if(d<0||d==null)d=a.style[b];if(bP.test(d))return d;e=f&&(p.support.boxSizingReliable||d===a.style[b]),d=parseFloat(d)||0}return d+b_(a,b,c||(f?"border":"content"),e)+"px"}function cb(a){if(bR[a])return bR[a];var b=p("<"+a+">").appendTo(e.body),c=b.css("display");b.remove();if(c==="none"||c===""){bI=e.body.appendChild(bI||p.extend(e.createElement("iframe"),{frameBorder:0,width:0,height:0}));if(!bJ||!bI.createElement)bJ=(bI.contentWindow||bI.contentDocument).document,bJ.write("<!doctype html><html><body>"),bJ.close();b=bJ.body.appendChild(bJ.createElement(a)),c=bH(b,"display"),e.body.removeChild(bI)}return bR[a]=c,c}function ch(a,b,c,d){var e;if(p.isArray(b))p.each(b,function(b,e){c||cd.test(a)?d(a,e):ch(a+"["+(typeof e=="object"?b:"")+"]",e,c,d)});else if(!c&&p.type(b)==="object")for(e in b)ch(a+"["+e+"]",b[e],c,d);else d(a,b)}function cy(a){return function(b,c){typeof b!="string"&&(c=b,b="*");var d,e,f,g=b.toLowerCase().split(s),h=0,i=g.length;if(p.isFunction(c))for(;h<i;h++)d=g[h],f=/^\+/.test(d),f&&(d=d.substr(1)||"*"),e=a[d]=a[d]||[],e[f?"unshift":"push"](c)}}function cz(a,c,d,e,f,g){f=f||c.dataTypes[0],g=g||{},g[f]=!0;var h,i=a[f],j=0,k=i?i.length:0,l=a===cu;for(;j<k&&(l||!h);j++)h=i[j](c,d,e),typeof h=="string"&&(!l||g[h]?h=b:(c.dataTypes.unshift(h),h=cz(a,c,d,e,h,g)));return(l||!h)&&!g["*"]&&(h=cz(a,c,d,e,"*",g)),h}function cA(a,c){var d,e,f=p.ajaxSettings.flatOptions||{};for(d in c)c[d]!==b&&((f[d]?a:e||(e={}))[d]=c[d]);e&&p.extend(!0,a,e)}function cB(a,c,d){var e,f,g,h,i=a.contents,j=a.dataTypes,k=a.responseFields;for(f in k)f in d&&(c[k[f]]=d[f]);while(j[0]==="*")j.shift(),e===b&&(e=a.mimeType||c.getResponseHeader("content-type"));if(e)for(f in i)if(i[f]&&i[f].test(e)){j.unshift(f);break}if(j[0]in d)g=j[0];else{for(f in d){if(!j[0]||a.converters[f+" "+j[0]]){g=f;break}h||(h=f)}g=g||h}if(g)return g!==j[0]&&j.unshift(g),d[g]}function cC(a,b){var c,d,e,f,g=a.dataTypes.slice(),h=g[0],i={},j=0;a.dataFilter&&(b=a.dataFilter(b,a.dataType));if(g[1])for(c in a.converters)i[c.toLowerCase()]=a.converters[c];for(;e=g[++j];)if(e!=="*"){if(h!=="*"&&h!==e){c=i[h+" "+e]||i["* "+e];if(!c)for(d in i){f=d.split(" ");if(f[1]===e){c=i[h+" "+f[0]]||i["* "+f[0]];if(c){c===!0?c=i[d]:i[d]!==!0&&(e=f[0],g.splice(j--,0,e));break}}}if(c!==!0)if(c&&a["throws"])b=c(b);else try{b=c(b)}catch(k){return{state:"parsererror",error:c?k:"No conversion from "+h+" to "+e}}}h=e}return{state:"success",data:b}}function cK(){try{return new a.XMLHttpRequest}catch(b){}}function cL(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}function cT(){return setTimeout(function(){cM=b},0),cM=p.now()}function cU(a,b){p.each(b,function(b,c){var d=(cS[b]||[]).concat(cS["*"]),e=0,f=d.length;for(;e<f;e++)if(d[e].call(a,b,c))return})}function cV(a,b,c){var d,e=0,f=0,g=cR.length,h=p.Deferred().always(function(){delete i.elem}),i=function(){var b=cM||cT(),c=Math.max(0,j.startTime+j.duration-b),d=1-(c/j.duration||0),e=0,f=j.tweens.length;for(;e<f;e++)j.tweens[e].run(d);return h.notifyWith(a,[j,d,c]),d<1&&f?c:(h.resolveWith(a,[j]),!1)},j=h.promise({elem:a,props:p.extend({},b),opts:p.extend(!0,{specialEasing:{}},c),originalProperties:b,originalOptions:c,startTime:cM||cT(),duration:c.duration,tweens:[],createTween:function(b,c,d){var e=p.Tween(a,j.opts,b,c,j.opts.specialEasing[b]||j.opts.easing);return j.tweens.push(e),e},stop:function(b){var c=0,d=b?j.tweens.length:0;for(;c<d;c++)j.tweens[c].run(1);return b?h.resolveWith(a,[j,b]):h.rejectWith(a,[j,b]),this}}),k=j.props;cW(k,j.opts.specialEasing);for(;e<g;e++){d=cR[e].call(j,a,k,j.opts);if(d)return d}return cU(j,k),p.isFunction(j.opts.start)&&j.opts.start.call(a,j),p.fx.timer(p.extend(i,{anim:j,queue:j.opts.queue,elem:a})),j.progress(j.opts.progress).done(j.opts.done,j.opts.complete).fail(j.opts.fail).always(j.opts.always)}function cW(a,b){var c,d,e,f,g;for(c in a){d=p.camelCase(c),e=b[d],f=a[c],p.isArray(f)&&(e=f[1],f=a[c]=f[0]),c!==d&&(a[d]=f,delete a[c]),g=p.cssHooks[d];if(g&&"expand"in g){f=g.expand(f),delete a[d];for(c in f)c in a||(a[c]=f[c],b[c]=e)}else b[d]=e}}function cX(a,b,c){var d,e,f,g,h,i,j,k,l=this,m=a.style,n={},o=[],q=a.nodeType&&bY(a);c.queue||(j=p._queueHooks(a,"fx"),j.unqueued==null&&(j.unqueued=0,k=j.empty.fire,j.empty.fire=function(){j.unqueued||k()}),j.unqueued++,l.always(function(){l.always(function(){j.unqueued--,p.queue(a,"fx").length||j.empty.fire()})})),a.nodeType===1&&("height"in b||"width"in b)&&(c.overflow=[m.overflow,m.overflowX,m.overflowY],p.css(a,"display")==="inline"&&p.css(a,"float")==="none"&&(!p.support.inlineBlockNeedsLayout||cb(a.nodeName)==="inline"?m.display="inline-block":m.zoom=1)),c.overflow&&(m.overflow="hidden",p.support.shrinkWrapBlocks||l.done(function(){m.overflow=c.overflow[0],m.overflowX=c.overflow[1],m.overflowY=c.overflow[2]}));for(d in b){f=b[d];if(cO.exec(f)){delete b[d];if(f===(q?"hide":"show"))continue;o.push(d)}}g=o.length;if(g){h=p._data(a,"fxshow")||p._data(a,"fxshow",{}),q?p(a).show():l.done(function(){p(a).hide()}),l.done(function(){var b;p.removeData(a,"fxshow",!0);for(b in n)p.style(a,b,n[b])});for(d=0;d<g;d++)e=o[d],i=l.createTween(e,q?h[e]:0),n[e]=h[e]||p.style(a,e),e in h||(h[e]=i.start,q&&(i.end=i.start,i.start=e==="width"||e==="height"?1:0))}}function cY(a,b,c,d,e){return new cY.prototype.init(a,b,c,d,e)}function cZ(a,b){var c,d={height:a},e=0;for(;e<4;e+=2-b)c=bU[e],d["margin"+c]=d["padding"+c]=a;return b&&(d.opacity=d.width=a),d}function c_(a){return p.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:!1}var c,d,e=a.document,f=a.location,g=a.navigator,h=a.jQuery,i=a.$,j=Array.prototype.push,k=Array.prototype.slice,l=Array.prototype.indexOf,m=Object.prototype.toString,n=Object.prototype.hasOwnProperty,o=String.prototype.trim,p=function(a,b){return new p.fn.init(a,b,c)},q=/[\-+]?(?:\d*\.|)\d+(?:[eE][\-+]?\d+|)/.source,r=/\S/,s=/\s+/,t=r.test(" ")?/^[\s\xA0]+|[\s\xA0]+$/g:/^\s+|\s+$/g,u=/^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,v=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,w=/^[\],:{}\s]*$/,x=/(?:^|:|,)(?:\s*\[)+/g,y=/\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g,z=/"[^"\\\r\n]*"|true|false|null|-?(?:\d\d*\.|)\d+(?:[eE][\-+]?\d+|)/g,A=/^-ms-/,B=/-([\da-z])/gi,C=function(a,b){return(b+"").toUpperCase()},D=function(){e.addEventListener?(e.removeEventListener("DOMContentLoaded",D,!1),p.ready()):e.readyState==="complete"&&(e.detachEvent("onreadystatechange",D),p.ready())},E={};p.fn=p.prototype={constructor:p,init:function(a,c,d){var f,g,h,i;if(!a)return this;if(a.nodeType)return this.context=this[0]=a,this.length=1,this;if(typeof a=="string"){a.charAt(0)==="<"&&a.charAt(a.length-1)===">"&&a.length>=3?f=[null,a,null]:f=u.exec(a);if(f&&(f[1]||!c)){if(f[1])return c=c instanceof p?c[0]:c,i=c&&c.nodeType?c.ownerDocument||c:e,a=p.parseHTML(f[1],i,!0),v.test(f[1])&&p.isPlainObject(c)&&this.attr.call(a,c,!0),p.merge(this,a);g=e.getElementById(f[2]);if(g&&g.parentNode){if(g.id!==f[2])return d.find(a);this.length=1,this[0]=g}return this.context=e,this.selector=a,this}return!c||c.jquery?(c||d).find(a):this.constructor(c).find(a)}return p.isFunction(a)?d.ready(a):(a.selector!==b&&(this.selector=a.selector,this.context=a.context),p.makeArray(a,this))},selector:"",jquery:"1.8.0",length:0,size:function(){return this.length},toArray:function(){return k.call(this)},get:function(a){return a==null?this.toArray():a<0?this[this.length+a]:this[a]},pushStack:function(a,b,c){var d=p.merge(this.constructor(),a);return d.prevObject=this,d.context=this.context,b==="find"?d.selector=this.selector+(this.selector?" ":"")+c:b&&(d.selector=this.selector+"."+b+"("+c+")"),d},each:function(a,b){return p.each(this,a,b)},ready:function(a){return p.ready.promise().done(a),this},eq:function(a){return a=+a,a===-1?this.slice(a):this.slice(a,a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(k.apply(this,arguments),"slice",k.call(arguments).join(","))},map:function(a){return this.pushStack(p.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:j,sort:[].sort,splice:[].splice},p.fn.init.prototype=p.fn,p.extend=p.fn.extend=function(){var a,c,d,e,f,g,h=arguments[0]||{},i=1,j=arguments.length,k=!1;typeof h=="boolean"&&(k=h,h=arguments[1]||{},i=2),typeof h!="object"&&!p.isFunction(h)&&(h={}),j===i&&(h=this,--i);for(;i<j;i++)if((a=arguments[i])!=null)for(c in a){d=h[c],e=a[c];if(h===e)continue;k&&e&&(p.isPlainObject(e)||(f=p.isArray(e)))?(f?(f=!1,g=d&&p.isArray(d)?d:[]):g=d&&p.isPlainObject(d)?d:{},h[c]=p.extend(k,g,e)):e!==b&&(h[c]=e)}return h},p.extend({noConflict:function(b){return a.$===p&&(a.$=i),b&&a.jQuery===p&&(a.jQuery=h),p},isReady:!1,readyWait:1,holdReady:function(a){a?p.readyWait++:p.ready(!0)},ready:function(a){if(a===!0?--p.readyWait:p.isReady)return;if(!e.body)return setTimeout(p.ready,1);p.isReady=!0;if(a!==!0&&--p.readyWait>0)return;d.resolveWith(e,[p]),p.fn.trigger&&p(e).trigger("ready").off("ready")},isFunction:function(a){return p.type(a)==="function"},isArray:Array.isArray||function(a){return p.type(a)==="array"},isWindow:function(a){return a!=null&&a==a.window},isNumeric:function(a){return!isNaN(parseFloat(a))&&isFinite(a)},type:function(a){return a==null?String(a):E[m.call(a)]||"object"},isPlainObject:function(a){if(!a||p.type(a)!=="object"||a.nodeType||p.isWindow(a))return!1;try{if(a.constructor&&!n.call(a,"constructor")&&!n.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}var d;for(d in a);return d===b||n.call(a,d)},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},error:function(a){throw new Error(a)},parseHTML:function(a,b,c){var d;return!a||typeof a!="string"?null:(typeof b=="boolean"&&(c=b,b=0),b=b||e,(d=v.exec(a))?[b.createElement(d[1])]:(d=p.buildFragment([a],b,c?null:[]),p.merge([],(d.cacheable?p.clone(d.fragment):d.fragment).childNodes)))},parseJSON:function(b){if(!b||typeof b!="string")return null;b=p.trim(b);if(a.JSON&&a.JSON.parse)return a.JSON.parse(b);if(w.test(b.replace(y,"@").replace(z,"]").replace(x,"")))return(new Function("return "+b))();p.error("Invalid JSON: "+b)},parseXML:function(c){var d,e;if(!c||typeof c!="string")return null;try{a.DOMParser?(e=new DOMParser,d=e.parseFromString(c,"text/xml")):(d=new ActiveXObject("Microsoft.XMLDOM"),d.async="false",d.loadXML(c))}catch(f){d=b}return(!d||!d.documentElement||d.getElementsByTagName("parsererror").length)&&p.error("Invalid XML: "+c),d},noop:function(){},globalEval:function(b){b&&r.test(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(A,"ms-").replace(B,C)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,c,d){var e,f=0,g=a.length,h=g===b||p.isFunction(a);if(d){if(h){for(e in a)if(c.apply(a[e],d)===!1)break}else for(;f<g;)if(c.apply(a[f++],d)===!1)break}else if(h){for(e in a)if(c.call(a[e],e,a[e])===!1)break}else for(;f<g;)if(c.call(a[f],f,a[f++])===!1)break;return a},trim:o?function(a){return a==null?"":o.call(a)}:function(a){return a==null?"":a.toString().replace(t,"")},makeArray:function(a,b){var c,d=b||[];return a!=null&&(c=p.type(a),a.length==null||c==="string"||c==="function"||c==="regexp"||p.isWindow(a)?j.call(d,a):p.merge(d,a)),d},inArray:function(a,b,c){var d;if(b){if(l)return l.call(b,a,c);d=b.length,c=c?c<0?Math.max(0,d+c):c:0;for(;c<d;c++)if(c in b&&b[c]===a)return c}return-1},merge:function(a,c){var d=c.length,e=a.length,f=0;if(typeof d=="number")for(;f<d;f++)a[e++]=c[f];else while(c[f]!==b)a[e++]=c[f++];return a.length=e,a},grep:function(a,b,c){var d,e=[],f=0,g=a.length;c=!!c;for(;f<g;f++)d=!!b(a[f],f),c!==d&&e.push(a[f]);return e},map:function(a,c,d){var e,f,g=[],h=0,i=a.length,j=a instanceof p||i!==b&&typeof i=="number"&&(i>0&&a[0]&&a[i-1]||i===0||p.isArray(a));if(j)for(;h<i;h++)e=c(a[h],h,d),e!=null&&(g[g.length]=e);else for(f in a)e=c(a[f],f,d),e!=null&&(g[g.length]=e);return g.concat.apply([],g)},guid:1,proxy:function(a,c){var d,e,f;return typeof c=="string"&&(d=a[c],c=a,a=d),p.isFunction(a)?(e=k.call(arguments,2),f=function(){return a.apply(c,e.concat(k.call(arguments)))},f.guid=a.guid=a.guid||f.guid||p.guid++,f):b},access:function(a,c,d,e,f,g,h){var i,j=d==null,k=0,l=a.length;if(d&&typeof d=="object"){for(k in d)p.access(a,c,k,d[k],1,g,e);f=1}else if(e!==b){i=h===b&&p.isFunction(e),j&&(i?(i=c,c=function(a,b,c){return i.call(p(a),c)}):(c.call(a,e),c=null));if(c)for(;k<l;k++)c(a[k],d,i?e.call(a[k],k,c(a[k],d)):e,h);f=1}return f?a:j?c.call(a):l?c(a[0],d):g},now:function(){return(new Date).getTime()}}),p.ready.promise=function(b){if(!d){d=p.Deferred();if(e.readyState==="complete"||e.readyState!=="loading"&&e.addEventListener)setTimeout(p.ready,1);else if(e.addEventListener)e.addEventListener("DOMContentLoaded",D,!1),a.addEventListener("load",p.ready,!1);else{e.attachEvent("onreadystatechange",D),a.attachEvent("onload",p.ready);var c=!1;try{c=a.frameElement==null&&e.documentElement}catch(f){}c&&c.doScroll&&function g(){if(!p.isReady){try{c.doScroll("left")}catch(a){return setTimeout(g,50)}p.ready()}}()}}return d.promise(b)},p.each("Boolean Number String Function Array Date RegExp Object".split(" "),function(a,b){E["[object "+b+"]"]=b.toLowerCase()}),c=p(e);var F={};p.Callbacks=function(a){a=typeof a=="string"?F[a]||G(a):p.extend({},a);var c,d,e,f,g,h,i=[],j=!a.once&&[],k=function(b){c=a.memory&&b,d=!0,h=f||0,f=0,g=i.length,e=!0;for(;i&&h<g;h++)if(i[h].apply(b[0],b[1])===!1&&a.stopOnFalse){c=!1;break}e=!1,i&&(j?j.length&&k(j.shift()):c?i=[]:l.disable())},l={add:function(){if(i){var b=i.length;(function d(b){p.each(b,function(b,c){p.isFunction(c)&&(!a.unique||!l.has(c))?i.push(c):c&&c.length&&d(c)})})(arguments),e?g=i.length:c&&(f=b,k(c))}return this},remove:function(){return i&&p.each(arguments,function(a,b){var c;while((c=p.inArray(b,i,c))>-1)i.splice(c,1),e&&(c<=g&&g--,c<=h&&h--)}),this},has:function(a){return p.inArray(a,i)>-1},empty:function(){return i=[],this},disable:function(){return i=j=c=b,this},disabled:function(){return!i},lock:function(){return j=b,c||l.disable(),this},locked:function(){return!j},fireWith:function(a,b){return b=b||[],b=[a,b.slice?b.slice():b],i&&(!d||j)&&(e?j.push(b):k(b)),this},fire:function(){return l.fireWith(this,arguments),this},fired:function(){return!!d}};return l},p.extend({Deferred:function(a){var b=[["resolve","done",p.Callbacks("once memory"),"resolved"],["reject","fail",p.Callbacks("once memory"),"rejected"],["notify","progress",p.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return p.Deferred(function(c){p.each(b,function(b,d){var f=d[0],g=a[b];e[d[1]](p.isFunction(g)?function(){var a=g.apply(this,arguments);a&&p.isFunction(a.promise)?a.promise().done(c.resolve).fail(c.reject).progress(c.notify):c[f+"With"](this===e?c:this,[a])}:c[f])}),a=null}).promise()},promise:function(a){return typeof a=="object"?p.extend(a,d):d}},e={};return d.pipe=d.then,p.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[a^1][2].disable,b[2][2].lock),e[f[0]]=g.fire,e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=k.call(arguments),d=c.length,e=d!==1||a&&p.isFunction(a.promise)?d:0,f=e===1?a:p.Deferred(),g=function(a,b,c){return function(d){b[a]=this,c[a]=arguments.length>1?k.call(arguments):d,c===h?f.notifyWith(b,c):--e||f.resolveWith(b,c)}},h,i,j;if(d>1){h=new Array(d),i=new Array(d),j=new Array(d);for(;b<d;b++)c[b]&&p.isFunction(c[b].promise)?c[b].promise().done(g(b,j,c)).fail(f.reject).progress(g(b,i,h)):--e}return e||f.resolveWith(j,c),f.promise()}}),p.support=function(){var b,c,d,f,g,h,i,j,k,l,m,n=e.createElement("div");n.setAttribute("className","t"),n.innerHTML="  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",c=n.getElementsByTagName("*"),d=n.getElementsByTagName("a")[0],d.style.cssText="top:1px;float:left;opacity:.5";if(!c||!c.length||!d)return{};f=e.createElement("select"),g=f.appendChild(e.createElement("option")),h=n.getElementsByTagName("input")[0],b={leadingWhitespace:n.firstChild.nodeType===3,tbody:!n.getElementsByTagName("tbody").length,htmlSerialize:!!n.getElementsByTagName("link").length,style:/top/.test(d.getAttribute("style")),hrefNormalized:d.getAttribute("href")==="/a",opacity:/^0.5/.test(d.style.opacity),cssFloat:!!d.style.cssFloat,checkOn:h.value==="on",optSelected:g.selected,getSetAttribute:n.className!=="t",enctype:!!e.createElement("form").enctype,html5Clone:e.createElement("nav").cloneNode(!0).outerHTML!=="<:nav></:nav>",boxModel:e.compatMode==="CSS1Compat",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0,boxSizingReliable:!0,pixelPosition:!1},h.checked=!0,b.noCloneChecked=h.cloneNode(!0).checked,f.disabled=!0,b.optDisabled=!g.disabled;try{delete n.test}catch(o){b.deleteExpando=!1}!n.addEventListener&&n.attachEvent&&n.fireEvent&&(n.attachEvent("onclick",m=function(){b.noCloneEvent=!1}),n.cloneNode(!0).fireEvent("onclick"),n.detachEvent("onclick",m)),h=e.createElement("input"),h.value="t",h.setAttribute("type","radio"),b.radioValue=h.value==="t",h.setAttribute("checked","checked"),h.setAttribute("name","t"),n.appendChild(h),i=e.createDocumentFragment(),i.appendChild(n.lastChild),b.checkClone=i.cloneNode(!0).cloneNode(!0).lastChild.checked,b.appendChecked=h.checked,i.removeChild(h),i.appendChild(n);if(n.attachEvent)for(k in{submit:!0,change:!0,focusin:!0})j="on"+k,l=j in n,l||(n.setAttribute(j,"return;"),l=typeof n[j]=="function"),b[k+"Bubbles"]=l;return p(function(){var c,d,f,g,h="padding:0;margin:0;border:0;display:block;overflow:hidden;",i=e.getElementsByTagName("body")[0];if(!i)return;c=e.createElement("div"),c.style.cssText="visibility:hidden;border:0;width:0;height:0;position:static;top:0;margin-top:1px",i.insertBefore(c,i.firstChild),d=e.createElement("div"),c.appendChild(d),d.innerHTML="<table><tr><td></td><td>t</td></tr></table>",f=d.getElementsByTagName("td"),f[0].style.cssText="padding:0;margin:0;border:0;display:none",l=f[0].offsetHeight===0,f[0].style.display="",f[1].style.display="none",b.reliableHiddenOffsets=l&&f[0].offsetHeight===0,d.innerHTML="",d.style.cssText="box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;",b.boxSizing=d.offsetWidth===4,b.doesNotIncludeMarginInBodyOffset=i.offsetTop!==1,a.getComputedStyle&&(b.pixelPosition=(a.getComputedStyle(d,null)||{}).top!=="1%",b.boxSizingReliable=(a.getComputedStyle(d,null)||{width:"4px"}).width==="4px",g=e.createElement("div"),g.style.cssText=d.style.cssText=h,g.style.marginRight=g.style.width="0",d.style.width="1px",d.appendChild(g),b.reliableMarginRight=!parseFloat((a.getComputedStyle(g,null)||{}).marginRight)),typeof d.style.zoom!="undefined"&&(d.innerHTML="",d.style.cssText=h+"width:1px;padding:1px;display:inline;zoom:1",b.inlineBlockNeedsLayout=d.offsetWidth===3,d.style.display="block",d.style.overflow="visible",d.innerHTML="<div></div>",d.firstChild.style.width="5px",b.shrinkWrapBlocks=d.offsetWidth!==3,c.style.zoom=1),i.removeChild(c),c=d=f=g=null}),i.removeChild(n),c=d=f=g=h=i=n=null,b}();var H=/^(?:\{.*\}|\[.*\])$/,I=/([A-Z])/g;p.extend({cache:{},deletedIds:[],uuid:0,expando:"jQuery"+(p.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(a){return a=a.nodeType?p.cache[a[p.expando]]:a[p.expando],!!a&&!K(a)},data:function(a,c,d,e){if(!p.acceptData(a))return;var f,g,h=p.expando,i=typeof c=="string",j=a.nodeType,k=j?p.cache:a,l=j?a[h]:a[h]&&h;if((!l||!k[l]||!e&&!k[l].data)&&i&&d===b)return;l||(j?a[h]=l=p.deletedIds.pop()||++p.uuid:l=h),k[l]||(k[l]={},j||(k[l].toJSON=p.noop));if(typeof c=="object"||typeof c=="function")e?k[l]=p.extend(k[l],c):k[l].data=p.extend(k[l].data,c);return f=k[l],e||(f.data||(f.data={}),f=f.data),d!==b&&(f[p.camelCase(c)]=d),i?(g=f[c],g==null&&(g=f[p.camelCase(c)])):g=f,g},removeData:function(a,b,c){if(!p.acceptData(a))return;var d,e,f,g=a.nodeType,h=g?p.cache:a,i=g?a[p.expando]:p.expando;if(!h[i])return;if(b){d=c?h[i]:h[i].data;if(d){p.isArray(b)||(b in d?b=[b]:(b=p.camelCase(b),b in d?b=[b]:b=b.split(" ")));for(e=0,f=b.length;e<f;e++)delete d[b[e]];if(!(c?K:p.isEmptyObject)(d))return}}if(!c){delete h[i].data;if(!K(h[i]))return}g?p.cleanData([a],!0):p.support.deleteExpando||h!=h.window?delete h[i]:h[i]=null},_data:function(a,b,c){return p.data(a,b,c,!0)},acceptData:function(a){var b=a.nodeName&&p.noData[a.nodeName.toLowerCase()];return!b||b!==!0&&a.getAttribute("classid")===b}}),p.fn.extend({data:function(a,c){var d,e,f,g,h,i=this[0],j=0,k=null;if(a===b){if(this.length){k=p.data(i);if(i.nodeType===1&&!p._data(i,"parsedAttrs")){f=i.attributes;for(h=f.length;j<h;j++)g=f[j].name,g.indexOf("data-")===0&&(g=p.camelCase(g.substring(5)),J(i,g,k[g]));p._data(i,"parsedAttrs",!0)}}return k}return typeof a=="object"?this.each(function(){p.data(this,a)}):(d=a.split(".",2),d[1]=d[1]?"."+d[1]:"",e=d[1]+"!",p.access(this,function(c){if(c===b)return k=this.triggerHandler("getData"+e,[d[0]]),k===b&&i&&(k=p.data(i,a),k=J(i,a,k)),k===b&&d[1]?this.data(d[0]):k;d[1]=c,this.each(function(){var b=p(this);b.triggerHandler("setData"+e,d),p.data(this,a,c),b.triggerHandler("changeData"+e,d)})},null,c,arguments.length>1,null,!1))},removeData:function(a){return this.each(function(){p.removeData(this,a)})}}),p.extend({queue:function(a,b,c){var d;if(a)return b=(b||"fx")+"queue",d=p._data(a,b),c&&(!d||p.isArray(c)?d=p._data(a,b,p.makeArray(c)):d.push(c)),d||[]},dequeue:function(a,b){b=b||"fx";var c=p.queue(a,b),d=c.shift(),e=p._queueHooks(a,b),f=function(){p.dequeue(a,b)};d==="inprogress"&&(d=c.shift()),d&&(b==="fx"&&c.unshift("inprogress"),delete e.stop,d.call(a,f,e)),!c.length&&e&&e.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return p._data(a,c)||p._data(a,c,{empty:p.Callbacks("once memory").add(function(){p.removeData(a,b+"queue",!0),p.removeData(a,c,!0)})})}}),p.fn.extend({queue:function(a,c){var d=2;return typeof a!="string"&&(c=a,a="fx",d--),arguments.length<d?p.queue(this[0],a):c===b?this:this.each(function(){var b=p.queue(this,a,c);p._queueHooks(this,a),a==="fx"&&b[0]!=="inprogress"&&p.dequeue(this,a)})},dequeue:function(a){return this.each(function(){p.dequeue(this,a)})},delay:function(a,b){return a=p.fx?p.fx.speeds[a]||a:a,b=b||"fx",this.queue(b,function(b,c){var d=setTimeout(b,a);c.stop=function(){clearTimeout(d)}})},clearQueue:function(a){return this.queue(a||"fx",[])},promise:function(a,c){var d,e=1,f=p.Deferred(),g=this,h=this.length,i=function(){--e||f.resolveWith(g,[g])};typeof a!="string"&&(c=a,a=b),a=a||"fx";while(h--)(d=p._data(g[h],a+"queueHooks"))&&d.empty&&(e++,d.empty.add(i));return i(),f.promise(c)}});var L,M,N,O=/[\t\r\n]/g,P=/\r/g,Q=/^(?:button|input)$/i,R=/^(?:button|input|object|select|textarea)$/i,S=/^a(?:rea|)$/i,T=/^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,U=p.support.getSetAttribute;p.fn.extend({attr:function(a,b){return p.access(this,p.attr,a,b,arguments.length>1)},removeAttr:function(a){return this.each(function(){p.removeAttr(this,a)})},prop:function(a,b){return p.access(this,p.prop,a,b,arguments.length>1)},removeProp:function(a){return a=p.propFix[a]||a,this.each(function(){try{this[a]=b,delete this[a]}catch(c){}})},addClass:function(a){var b,c,d,e,f,g,h;if(p.isFunction(a))return this.each(function(b){p(this).addClass(a.call(this,b,this.className))});if(a&&typeof a=="string"){b=a.split(s);for(c=0,d=this.length;c<d;c++){e=this[c];if(e.nodeType===1)if(!e.className&&b.length===1)e.className=a;else{f=" "+e.className+" ";for(g=0,h=b.length;g<h;g++)~f.indexOf(" "+b[g]+" ")||(f+=b[g]+" ");e.className=p.trim(f)}}}return this},removeClass:function(a){var c,d,e,f,g,h,i;if(p.isFunction(a))return this.each(function(b){p(this).removeClass(a.call(this,b,this.className))});if(a&&typeof a=="string"||a===b){c=(a||"").split(s);for(h=0,i=this.length;h<i;h++){e=this[h];if(e.nodeType===1&&e.className){d=(" "+e.className+" ").replace(O," ");for(f=0,g=c.length;f<g;f++)while(d.indexOf(" "+c[f]+" ")>-1)d=d.replace(" "+c[f]+" "," ");e.className=a?p.trim(d):""}}}return this},toggleClass:function(a,b){var c=typeof a,d=typeof b=="boolean";return p.isFunction(a)?this.each(function(c){p(this).toggleClass(a.call(this,c,this.className,b),b)}):this.each(function(){if(c==="string"){var e,f=0,g=p(this),h=b,i=a.split(s);while(e=i[f++])h=d?h:!g.hasClass(e),g[h?"addClass":"removeClass"](e)}else if(c==="undefined"||c==="boolean")this.className&&p._data(this,"__className__",this.className),this.className=this.className||a===!1?"":p._data(this,"__className__")||""})},hasClass:function(a){var b=" "+a+" ",c=0,d=this.length;for(;c<d;c++)if(this[c].nodeType===1&&(" "+this[c].className+" ").replace(O," ").indexOf(b)>-1)return!0;return!1},val:function(a){var c,d,e,f=this[0];if(!arguments.length){if(f)return c=p.valHooks[f.type]||p.valHooks[f.nodeName.toLowerCase()],c&&"get"in c&&(d=c.get(f,"value"))!==b?d:(d=f.value,typeof d=="string"?d.replace(P,""):d==null?"":d);return}return e=p.isFunction(a),this.each(function(d){var f,g=p(this);if(this.nodeType!==1)return;e?f=a.call(this,d,g.val()):f=a,f==null?f="":typeof f=="number"?f+="":p.isArray(f)&&(f=p.map(f,function(a){return a==null?"":a+""})),c=p.valHooks[this.type]||p.valHooks[this.nodeName.toLowerCase()];if(!c||!("set"in c)||c.set(this,f,"value")===b)this.value=f})}}),p.extend({valHooks:{option:{get:function(a){var b=a.attributes.value;return!b||b.specified?a.value:a.text}},select:{get:function(a){var b,c,d,e,f=a.selectedIndex,g=[],h=a.options,i=a.type==="select-one";if(f<0)return null;c=i?f:0,d=i?f+1:h.length;for(;c<d;c++){e=h[c];if(e.selected&&(p.support.optDisabled?!e.disabled:e.getAttribute("disabled")===null)&&(!e.parentNode.disabled||!p.nodeName(e.parentNode,"optgroup"))){b=p(e).val();if(i)return b;g.push(b)}}return i&&!g.length&&h.length?p(h[f]).val():g},set:function(a,b){var c=p.makeArray(b);return p(a).find("option").each(function(){this.selected=p.inArray(p(this).val(),c)>=0}),c.length||(a.selectedIndex=-1),c}}},attrFn:{},attr:function(a,c,d,e){var f,g,h,i=a.nodeType;if(!a||i===3||i===8||i===2)return;if(e&&p.isFunction(p.fn[c]))return p(a)[c](d);if(typeof a.getAttribute=="undefined")return p.prop(a,c,d);h=i!==1||!p.isXMLDoc(a),h&&(c=c.toLowerCase(),g=p.attrHooks[c]||(T.test(c)?M:L));if(d!==b){if(d===null){p.removeAttr(a,c);return}return g&&"set"in g&&h&&(f=g.set(a,d,c))!==b?f:(a.setAttribute(c,""+d),d)}return g&&"get"in g&&h&&(f=g.get(a,c))!==null?f:(f=a.getAttribute(c),f===null?b:f)},removeAttr:function(a,b){var c,d,e,f,g=0;if(b&&a.nodeType===1){d=b.split(s);for(;g<d.length;g++)e=d[g],e&&(c=p.propFix[e]||e,f=T.test(e),f||p.attr(a,e,""),a.removeAttribute(U?e:c),f&&c in a&&(a[c]=!1))}},attrHooks:{type:{set:function(a,b){if(Q.test(a.nodeName)&&a.parentNode)p.error("type property can't be changed");else if(!p.support.radioValue&&b==="radio"&&p.nodeName(a,"input")){var c=a.value;return a.setAttribute("type",b),c&&(a.value=c),b}}},value:{get:function(a,b){return L&&p.nodeName(a,"button")?L.get(a,b):b in a?a.value:null},set:function(a,b,c){if(L&&p.nodeName(a,"button"))return L.set(a,b,c);a.value=b}}},propFix:{tabindex:"tabIndex",readonly:"readOnly","for":"htmlFor","class":"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpadding:"cellPadding",rowspan:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder",contenteditable:"contentEditable"},prop:function(a,c,d){var e,f,g,h=a.nodeType;if(!a||h===3||h===8||h===2)return;return g=h!==1||!p.isXMLDoc(a),g&&(c=p.propFix[c]||c,f=p.propHooks[c]),d!==b?f&&"set"in f&&(e=f.set(a,d,c))!==b?e:a[c]=d:f&&"get"in f&&(e=f.get(a,c))!==null?e:a[c]},propHooks:{tabIndex:{get:function(a){var c=a.getAttributeNode("tabindex");return c&&c.specified?parseInt(c.value,10):R.test(a.nodeName)||S.test(a.nodeName)&&a.href?0:b}}}}),M={get:function(a,c){var d,e=p.prop(a,c);return e===!0||typeof e!="boolean"&&(d=a.getAttributeNode(c))&&d.nodeValue!==!1?c.toLowerCase():b},set:function(a,b,c){var d;return b===!1?p.removeAttr(a,c):(d=p.propFix[c]||c,d in a&&(a[d]=!0),a.setAttribute(c,c.toLowerCase())),c}},U||(N={name:!0,id:!0,coords:!0},L=p.valHooks.button={get:function(a,c){var d;return d=a.getAttributeNode(c),d&&(N[c]?d.value!=="":d.specified)?d.value:b},set:function(a,b,c){var d=a.getAttributeNode(c);return d||(d=e.createAttribute(c),a.setAttributeNode(d)),d.value=b+""}},p.each(["width","height"],function(a,b){p.attrHooks[b]=p.extend(p.attrHooks[b],{set:function(a,c){if(c==="")return a.setAttribute(b,"auto"),c}})}),p.attrHooks.contenteditable={get:L.get,set:function(a,b,c){b===""&&(b="false"),L.set(a,b,c)}}),p.support.hrefNormalized||p.each(["href","src","width","height"],function(a,c){p.attrHooks[c]=p.extend(p.attrHooks[c],{get:function(a){var d=a.getAttribute(c,2);return d===null?b:d}})}),p.support.style||(p.attrHooks.style={get:function(a){return a.style.cssText.toLowerCase()||b},set:function(a,b){return a.style.cssText=""+b}}),p.support.optSelected||(p.propHooks.selected=p.extend(p.propHooks.selected,{get:function(a){var b=a.parentNode;return b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex),null}})),p.support.enctype||(p.propFix.enctype="encoding"),p.support.checkOn||p.each(["radio","checkbox"],function(){p.valHooks[this]={get:function(a){return a.getAttribute("value")===null?"on":a.value}}}),p.each(["radio","checkbox"],function(){p.valHooks[this]=p.extend(p.valHooks[this],{set:function(a,b){if(p.isArray(b))return a.checked=p.inArray(p(a).val(),b)>=0}})});var V=/^(?:textarea|input|select)$/i,W=/^([^\.]*|)(?:\.(.+)|)$/,X=/(?:^|\s)hover(\.\S+|)\b/,Y=/^key/,Z=/^(?:mouse|contextmenu)|click/,$=/^(?:focusinfocus|focusoutblur)$/,_=function(a){return p.event.special.hover?a:a.replace(X,"mouseenter$1 mouseleave$1")};p.event={add:function(a,c,d,e,f){var g,h,i,j,k,l,m,n,o,q,r;if(a.nodeType===3||a.nodeType===8||!c||!d||!(g=p._data(a)))return;d.handler&&(o=d,d=o.handler,f=o.selector),d.guid||(d.guid=p.guid++),i=g.events,i||(g.events=i={}),h=g.handle,h||(g.handle=h=function(a){return typeof p!="undefined"&&(!a||p.event.triggered!==a.type)?p.event.dispatch.apply(h.elem,arguments):b},h.elem=a),c=p.trim(_(c)).split(" ");for(j=0;j<c.length;j++){k=W.exec(c[j])||[],l=k[1],m=(k[2]||"").split(".").sort(),r=p.event.special[l]||{},l=(f?r.delegateType:r.bindType)||l,r=p.event.special[l]||{},n=p.extend({type:l,origType:k[1],data:e,handler:d,guid:d.guid,selector:f,namespace:m.join(".")},o),q=i[l];if(!q){q=i[l]=[],q.delegateCount=0;if(!r.setup||r.setup.call(a,e,m,h)===!1)a.addEventListener?a.addEventListener(l,h,!1):a.attachEvent&&a.attachEvent("on"+l,h)}r.add&&(r.add.call(a,n),n.handler.guid||(n.handler.guid=d.guid)),f?q.splice(q.delegateCount++,0,n):q.push(n),p.event.global[l]=!0}a=null},global:{},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o,q,r=p.hasData(a)&&p._data(a);if(!r||!(m=r.events))return;b=p.trim(_(b||"")).split(" ");for(f=0;f<b.length;f++){g=W.exec(b[f])||[],h=i=g[1],j=g[2];if(!h){for(h in m)p.event.remove(a,h+b[f],c,d,!0);continue}n=p.event.special[h]||{},h=(d?n.delegateType:n.bindType)||h,o=m[h]||[],k=o.length,j=j?new RegExp("(^|\\.)"+j.split(".").sort().join("\\.(?:.*\\.|)")+"(\\.|$)"):null;for(l=0;l<o.length;l++)q=o[l],(e||i===q.origType)&&(!c||c.guid===q.guid)&&(!j||j.test(q.namespace))&&(!d||d===q.selector||d==="**"&&q.selector)&&(o.splice(l--,1),q.selector&&o.delegateCount--,n.remove&&n.remove.call(a,q));o.length===0&&k!==o.length&&((!n.teardown||n.teardown.call(a,j,r.handle)===!1)&&p.removeEvent(a,h,r.handle),delete m[h])}p.isEmptyObject(m)&&(delete r.handle,p.removeData(a,"events",!0))},customEvent:{getData:!0,setData:!0,changeData:!0},trigger:function(c,d,f,g){if(!f||f.nodeType!==3&&f.nodeType!==8){var h,i,j,k,l,m,n,o,q,r,s=c.type||c,t=[];if($.test(s+p.event.triggered))return;s.indexOf("!")>=0&&(s=s.slice(0,-1),i=!0),s.indexOf(".")>=0&&(t=s.split("."),s=t.shift(),t.sort());if((!f||p.event.customEvent[s])&&!p.event.global[s])return;c=typeof c=="object"?c[p.expando]?c:new p.Event(s,c):new p.Event(s),c.type=s,c.isTrigger=!0,c.exclusive=i,c.namespace=t.join("."),c.namespace_re=c.namespace?new RegExp("(^|\\.)"+t.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,m=s.indexOf(":")<0?"on"+s:"";if(!f){h=p.cache;for(j in h)h[j].events&&h[j].events[s]&&p.event.trigger(c,d,h[j].handle.elem,!0);return}c.result=b,c.target||(c.target=f),d=d!=null?p.makeArray(d):[],d.unshift(c),n=p.event.special[s]||{};if(n.trigger&&n.trigger.apply(f,d)===!1)return;q=[[f,n.bindType||s]];if(!g&&!n.noBubble&&!p.isWindow(f)){r=n.delegateType||s,k=$.test(r+s)?f:f.parentNode;for(l=f;k;k=k.parentNode)q.push([k,r]),l=k;l===(f.ownerDocument||e)&&q.push([l.defaultView||l.parentWindow||a,r])}for(j=0;j<q.length&&!c.isPropagationStopped();j++)k=q[j][0],c.type=q[j][1],o=(p._data(k,"events")||{})[c.type]&&p._data(k,"handle"),o&&o.apply(k,d),o=m&&k[m],o&&p.acceptData(k)&&o.apply(k,d)===!1&&c.preventDefault();return c.type=s,!g&&!c.isDefaultPrevented()&&(!n._default||n._default.apply(f.ownerDocument,d)===!1)&&(s!=="click"||!p.nodeName(f,"a"))&&p.acceptData(f)&&m&&f[s]&&(s!=="focus"&&s!=="blur"||c.target.offsetWidth!==0)&&!p.isWindow(f)&&(l=f[m],l&&(f[m]=null),p.event.triggered=s,f[s](),p.event.triggered=b,l&&(f[m]=l)),c.result}return},dispatch:function(c){c=p.event.fix(c||a.event);var d,e,f,g,h,i,j,k,l,m,n,o=(p._data(this,"events")||{})[c.type]||[],q=o.delegateCount,r=[].slice.call(arguments),s=!c.exclusive&&!c.namespace,t=p.event.special[c.type]||{},u=[];r[0]=c,c.delegateTarget=this;if(t.preDispatch&&t.preDispatch.call(this,c)===!1)return;if(q&&(!c.button||c.type!=="click")){g=p(this),g.context=this;for(f=c.target;f!=this;f=f.parentNode||this)if(f.disabled!==!0||c.type!=="click"){i={},k=[],g[0]=f;for(d=0;d<q;d++)l=o[d],m=l.selector,i[m]===b&&(i[m]=g.is(m)),i[m]&&k.push(l);k.length&&u.push({elem:f,matches:k})}}o.length>q&&u.push({elem:this,matches:o.slice(q)});for(d=0;d<u.length&&!c.isPropagationStopped();d++){j=u[d],c.currentTarget=j.elem;for(e=0;e<j.matches.length&&!c.isImmediatePropagationStopped();e++){l=j.matches[e];if(s||!c.namespace&&!l.namespace||c.namespace_re&&c.namespace_re.test(l.namespace))c.data=l.data,c.handleObj=l,h=((p.event.special[l.origType]||{}).handle||l.handler).apply(j.elem,r),h!==b&&(c.result=h,h===!1&&(c.preventDefault(),c.stopPropagation()))}}return t.postDispatch&&t.postDispatch.call(this,c),c.result},props:"attrChange attrName relatedNode srcElement altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(a,b){return a.which==null&&(a.which=b.charCode!=null?b.charCode:b.keyCode),a}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(a,c){var d,f,g,h=c.button,i=c.fromElement;return a.pageX==null&&c.clientX!=null&&(d=a.target.ownerDocument||e,f=d.documentElement,g=d.body,a.pageX=c.clientX+(f&&f.scrollLeft||g&&g.scrollLeft||0)-(f&&f.clientLeft||g&&g.clientLeft||0),a.pageY=c.clientY+(f&&f.scrollTop||g&&g.scrollTop||0)-(f&&f.clientTop||g&&g.clientTop||0)),!a.relatedTarget&&i&&(a.relatedTarget=i===a.target?c.toElement:i),!a.which&&h!==b&&(a.which=h&1?1:h&2?3:h&4?2:0),a}},fix:function(a){if(a[p.expando])return a;var b,c,d=a,f=p.event.fixHooks[a.type]||{},g=f.props?this.props.concat(f.props):this.props;a=p.Event(d);for(b=g.length;b;)c=g[--b],a[c]=d[c];return a.target||(a.target=d.srcElement||e),a.target.nodeType===3&&(a.target=a.target.parentNode),a.metaKey=!!a.metaKey,f.filter?f.filter(a,d):a},special:{ready:{setup:p.bindReady},load:{noBubble:!0},focus:{delegateType:"focusin"},blur:{delegateType:"focusout"},beforeunload:{setup:function(a,b,c){p.isWindow(this)&&(this.onbeforeunload=c)},teardown:function(a,b){this.onbeforeunload===b&&(this.onbeforeunload=null)}}},simulate:function(a,b,c,d){var e=p.extend(new p.Event,c,{type:a,isSimulated:!0,originalEvent:{}});d?p.event.trigger(e,null,b):p.event.dispatch.call(b,e),e.isDefaultPrevented()&&c.preventDefault()}},p.event.handle=p.event.dispatch,p.removeEvent=e.removeEventListener?function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c,!1)}:function(a,b,c){var d="on"+b;a.detachEvent&&(typeof a[d]=="undefined"&&(a[d]=null),a.detachEvent(d,c))},p.Event=function(a,b){if(this instanceof p.Event)a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||a.returnValue===!1||a.getPreventDefault&&a.getPreventDefault()?bb:ba):this.type=a,b&&p.extend(this,b),this.timeStamp=a&&a.timeStamp||p.now(),this[p.expando]=!0;else return new p.Event(a,b)},p.Event.prototype={preventDefault:function(){this.isDefaultPrevented=bb;var a=this.originalEvent;if(!a)return;a.preventDefault?a.preventDefault():a.returnValue=!1},stopPropagation:function(){this.isPropagationStopped=bb;var a=this.originalEvent;if(!a)return;a.stopPropagation&&a.stopPropagation(),a.cancelBubble=!0},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=bb,this.stopPropagation()},isDefaultPrevented:ba,isPropagationStopped:ba,isImmediatePropagationStopped:ba},p.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(a,b){p.event.special[a]={delegateType:b,bindType:b,handle:function(a){var c,d=this,e=a.relatedTarget,f=a.handleObj,g=f.selector;if(!e||e!==d&&!p.contains(d,e))a.type=f.origType,c=f.handler.apply(this,arguments),a.type=b;return c}}}),p.support.submitBubbles||(p.event.special.submit={setup:function(){if(p.nodeName(this,"form"))return!1;p.event.add(this,"click._submit keypress._submit",function(a){var c=a.target,d=p.nodeName(c,"input")||p.nodeName(c,"button")?c.form:b;d&&!p._data(d,"_submit_attached")&&(p.event.add(d,"submit._submit",function(a){a._submit_bubble=!0}),p._data(d,"_submit_attached",!0))})},postDispatch:function(a){a._submit_bubble&&(delete a._submit_bubble,this.parentNode&&!a.isTrigger&&p.event.simulate("submit",this.parentNode,a,!0))},teardown:function(){if(p.nodeName(this,"form"))return!1;p.event.remove(this,"._submit")}}),p.support.changeBubbles||(p.event.special.change={setup:function(){if(V.test(this.nodeName)){if(this.type==="checkbox"||this.type==="radio")p.event.add(this,"propertychange._change",function(a){a.originalEvent.propertyName==="checked"&&(this._just_changed=!0)}),p.event.add(this,"click._change",function(a){this._just_changed&&!a.isTrigger&&(this._just_changed=!1),p.event.simulate("change",this,a,!0)});return!1}p.event.add(this,"beforeactivate._change",function(a){var b=a.target;V.test(b.nodeName)&&!p._data(b,"_change_attached")&&(p.event.add(b,"change._change",function(a){this.parentNode&&!a.isSimulated&&!a.isTrigger&&p.event.simulate("change",this.parentNode,a,!0)}),p._data(b,"_change_attached",!0))})},handle:function(a){var b=a.target;if(this!==b||a.isSimulated||a.isTrigger||b.type!=="radio"&&b.type!=="checkbox")return a.handleObj.handler.apply(this,arguments)},teardown:function(){return p.event.remove(this,"._change"),V.test(this.nodeName)}}),p.support.focusinBubbles||p.each({focus:"focusin",blur:"focusout"},function(a,b){var c=0,d=function(a){p.event.simulate(b,a.target,p.event.fix(a),!0)};p.event.special[b]={setup:function(){c++===0&&e.addEventListener(a,d,!0)},teardown:function(){--c===0&&e.removeEventListener(a,d,!0)}}}),p.fn.extend({on:function(a,c,d,e,f){var g,h;if(typeof a=="object"){typeof c!="string"&&(d=d||c,c=b);for(h in a)this.on(h,c,d,a[h],f);return this}d==null&&e==null?(e=c,d=c=b):e==null&&(typeof c=="string"?(e=d,d=b):(e=d,d=c,c=b));if(e===!1)e=ba;else if(!e)return this;return f===1&&(g=e,e=function(a){return p().off(a),g.apply(this,arguments)},e.guid=g.guid||(g.guid=p.guid++)),this.each(function(){p.event.add(this,a,e,d,c)})},one:function(a,b,c,d){return this.on(a,b,c,d,1)},off:function(a,c,d){var e,f;if(a&&a.preventDefault&&a.handleObj)return e=a.handleObj,p(a.delegateTarget).off(e.namespace?e.origType+"."+e.namespace:e.origType,e.selector,e.handler),this;if(typeof a=="object"){for(f in a)this.off(f,c,a[f]);return this}if(c===!1||typeof c=="function")d=c,c=b;return d===!1&&(d=ba),this.each(function(){p.event.remove(this,a,d,c)})},bind:function(a,b,c){return this.on(a,null,b,c)},unbind:function(a,b){return this.off(a,null,b)},live:function(a,b,c){return p(this.context).on(a,this.selector,b,c),this},die:function(a,b){return p(this.context).off(a,this.selector||"**",b),this},delegate:function(a,b,c,d){return this.on(b,a,c,d)},undelegate:function(a,b,c){return arguments.length==1?this.off(a,"**"):this.off(b,a||"**",c)},trigger:function(a,b){return this.each(function(){p.event.trigger(a,b,this)})},triggerHandler:function(a,b){if(this[0])return p.event.trigger(a,b,this[0],!0)},toggle:function(a){var b=arguments,c=a.guid||p.guid++,d=0,e=function(c){var e=(p._data(this,"lastToggle"+a.guid)||0)%d;return p._data(this,"lastToggle"+a.guid,e+1),c.preventDefault(),b[e].apply(this,arguments)||!1};e.guid=c;while(d<b.length)b[d++].guid=c;return this.click(e)},hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}}),p.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(a,b){p.fn[b]=function(a,c){return c==null&&(c=a,a=null),arguments.length>0?this.on(b,null,a,c):this.trigger(b)},Y.test(b)&&(p.event.fixHooks[b]=p.event.keyHooks),Z.test(b)&&(p.event.fixHooks[b]=p.event.mouseHooks)}),function(a,b){function bd(a,b,c,d){var e=0,f=b.length;for(;e<f;e++)Z(a,b[e],c,d)}function be(a,b,c,d,e,f){var g,h=$.setFilters[b.toLowerCase()];return h||Z.error(b),(a||!(g=e))&&bd(a||"*",d,g=[],e),g.length>0?h(g,c,f):[]}function bf(a,c,d,e,f){var g,h,i,j,k,l,m,n,p=0,q=f.length,s=L.POS,t=new RegExp("^"+s.source+"(?!"+r+")","i"),u=function(){var a=1,c=arguments.length-2;for(;a<c;a++)arguments[a]===b&&(g[a]=b)};for(;p<q;p++){s.exec(""),a=f[p],j=[],i=0,k=e;while(g=s.exec(a)){n=s.lastIndex=g.index+g[0].length;if(n>i){m=a.slice(i,g.index),i=n,l=[c],B.test(m)&&(k&&(l=k),k=e);if(h=H.test(m))m=m.slice(0,-5).replace(B,"$&*");g.length>1&&g[0].replace(t,u),k=be(m,g[1],g[2],l,k,h)}}k?(j=j.concat(k),(m=a.slice(i))&&m!==")"?B.test(m)?bd(m,j,d,e):Z(m,c,d,e?e.concat(k):k):o.apply(d,j)):Z(a,c,d,e)}return q===1?d:Z.uniqueSort(d)}function bg(a,b,c){var d,e,f,g=[],i=0,j=D.exec(a),k=!j.pop()&&!j.pop(),l=k&&a.match(C)||[""],m=$.preFilter,n=$.filter,o=!c&&b!==h;for(;(e=l[i])!=null&&k;i++){g.push(d=[]),o&&(e=" "+e);while(e){k=!1;if(j=B.exec(e))e=e.slice(j[0].length),k=d.push({part:j.pop().replace(A," "),captures:j});for(f in n)(j=L[f].exec(e))&&(!m[f]||(j=m[f](j,b,c)))&&(e=e.slice(j.shift().length),k=d.push({part:f,captures:j}));if(!k)break}}return k||Z.error(a),g}function bh(a,b,e){var f=b.dir,g=m++;return a||(a=function(a){return a===e}),b.first?function(b,c){while(b=b[f])if(b.nodeType===1)return a(b,c)&&b}:function(b,e){var h,i=g+"."+d,j=i+"."+c;while(b=b[f])if(b.nodeType===1){if((h=b[q])===j)return b.sizset;if(typeof h=="string"&&h.indexOf(i)===0){if(b.sizset)return b}else{b[q]=j;if(a(b,e))return b.sizset=!0,b;b.sizset=!1}}}}function bi(a,b){return a?function(c,d){var e=b(c,d);return e&&a(e===!0?c:e,d)}:b}function bj(a,b,c){var d,e,f=0;for(;d=a[f];f++)$.relative[d.part]?e=bh(e,$.relative[d.part],b):(d.captures.push(b,c),e=bi(e,$.filter[d.part].apply(null,d.captures)));return e}function bk(a){return function(b,c){var d,e=0;for(;d=a[e];e++)if(d(b,c))return!0;return!1}}var c,d,e,f,g,h=a.document,i=h.documentElement,j="undefined",k=!1,l=!0,m=0,n=[].slice,o=[].push,q=("sizcache"+Math.random()).replace(".",""),r="[\\x20\\t\\r\\n\\f]",s="(?:\\\\.|[-\\w]|[^\\x00-\\xa0])+",t=s.replace("w","w#"),u="([*^$|!~]?=)",v="\\["+r+"*("+s+")"+r+"*(?:"+u+r+"*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|("+t+")|)|)"+r+"*\\]",w=":("+s+")(?:\\((?:(['\"])((?:\\\\.|[^\\\\])*?)\\2|((?:[^,]|\\\\,|(?:,(?=[^\\[]*\\]))|(?:,(?=[^\\(]*\\))))*))\\)|)",x=":(nth|eq|gt|lt|first|last|even|odd)(?:\\((\\d*)\\)|)(?=[^-]|$)",y=r+"*([\\x20\\t\\r\\n\\f>+~])"+r+"*",z="(?=[^\\x20\\t\\r\\n\\f])(?:\\\\.|"+v+"|"+w.replace(2,7)+"|[^\\\\(),])+",A=new RegExp("^"+r+"+|((?:^|[^\\\\])(?:\\\\.)*)"+r+"+$","g"),B=new RegExp("^"+y),C=new RegExp(z+"?(?="+r+"*,|$)","g"),D=new RegExp("^(?:(?!,)(?:(?:^|,)"+r+"*"+z+")*?|"+r+"*(.*?))(\\)|$)"),E=new RegExp(z.slice(19,-6)+"\\x20\\t\\r\\n\\f>+~])+|"+y,"g"),F=/^(?:#([\w\-]+)|(\w+)|\.([\w\-]+))$/,G=/[\x20\t\r\n\f]*[+~]/,H=/:not\($/,I=/h\d/i,J=/input|select|textarea|button/i,K=/\\(?!\\)/g,L={ID:new RegExp("^#("+s+")"),CLASS:new RegExp("^\\.("+s+")"),NAME:new RegExp("^\\[name=['\"]?("+s+")['\"]?\\]"),TAG:new RegExp("^("+s.replace("[-","[-\\*")+")"),ATTR:new RegExp("^"+v),PSEUDO:new RegExp("^"+w),CHILD:new RegExp("^:(only|nth|last|first)-child(?:\\("+r+"*(even|odd|(([+-]|)(\\d*)n|)"+r+"*(?:([+-]|)"+r+"*(\\d+)|))"+r+"*\\)|)","i"),POS:new RegExp(x,"ig"),needsContext:new RegExp("^"+r+"*[>+~]|"+x,"i")},M={},N=[],O={},P=[],Q=function(a){return a.sizzleFilter=!0,a},R=function(a){return function(b){return b.nodeName.toLowerCase()==="input"&&b.type===a}},S=function(a){return function(b){var c=b.nodeName.toLowerCase();return(c==="input"||c==="button")&&b.type===a}},T=function(a){var b=!1,c=h.createElement("div");try{b=a(c)}catch(d){}return c=null,b},U=T(function(a){a.innerHTML="<select></select>";var b=typeof a.lastChild.getAttribute("multiple");return b!=="boolean"&&b!=="string"}),V=T(function(a){a.id=q+0,a.innerHTML="<a name='"+q+"'></a><div name='"+q+"'></div>",i.insertBefore(a,i.firstChild);var b=h.getElementsByName&&h.getElementsByName(q).length===2+h.getElementsByName(q+0).length;return g=!h.getElementById(q),i.removeChild(a),b}),W=T(function(a){return a.appendChild(h.createComment("")),a.getElementsByTagName("*").length===0}),X=T(function(a){return a.innerHTML="<a href='#'></a>",a.firstChild&&typeof a.firstChild.getAttribute!==j&&a.firstChild.getAttribute("href")==="#"}),Y=T(function(a){return a.innerHTML="<div class='hidden e'></div><div class='hidden'></div>",!a.getElementsByClassName||a.getElementsByClassName("e").length===0?!1:(a.lastChild.className="e",a.getElementsByClassName("e").length!==1)}),Z=function(a,b,c,d){c=c||[],b=b||h;var e,f,g,i,j=b.nodeType;if(j!==1&&j!==9)return[];if(!a||typeof a!="string")return c;g=ba(b);if(!g&&!d)if(e=F.exec(a))if(i=e[1]){if(j===9){f=b.getElementById(i);if(!f||!f.parentNode)return c;if(f.id===i)return c.push(f),c}else if(b.ownerDocument&&(f=b.ownerDocument.getElementById(i))&&bb(b,f)&&f.id===i)return c.push(f),c}else{if(e[2])return o.apply(c,n.call(b.getElementsByTagName(a),0)),c;if((i=e[3])&&Y&&b.getElementsByClassName)return o.apply(c,n.call(b.getElementsByClassName(i),0)),c}return bm(a,b,c,d,g)},$=Z.selectors={cacheLength:50,match:L,order:["ID","TAG"],attrHandle:{},createPseudo:Q,find:{ID:g?function(a,b,c){if(typeof b.getElementById!==j&&!c){var d=b.getElementById(a);return d&&d.parentNode?[d]:[]}}:function(a,c,d){if(typeof c.getElementById!==j&&!d){var e=c.getElementById(a);return e?e.id===a||typeof e.getAttributeNode!==j&&e.getAttributeNode("id").value===a?[e]:b:[]}},TAG:W?function(a,b){if(typeof b.getElementsByTagName!==j)return b.getElementsByTagName(a)}:function(a,b){var c=b.getElementsByTagName(a);if(a==="*"){var d,e=[],f=0;for(;d=c[f];f++)d.nodeType===1&&e.push(d);return e}return c}},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(K,""),a[3]=(a[4]||a[5]||"").replace(K,""),a[2]==="~="&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),a[1]==="nth"?(a[2]||Z.error(a[0]),a[3]=+(a[3]?a[4]+(a[5]||1):2*(a[2]==="even"||a[2]==="odd")),a[4]=+(a[6]+a[7]||a[2]==="odd")):a[2]&&Z.error(a[0]),a},PSEUDO:function(a){var b,c=a[4];return L.CHILD.test(a[0])?null:(c&&(b=D.exec(c))&&b.pop()&&(a[0]=a[0].slice(0,b[0].length-c.length-1),c=b[0].slice(0,-1)),a.splice(2,3,c||a[3]),a)}},filter:{ID:g?function(a){return a=a.replace(K,""),function(b){return b.getAttribute("id")===a}}:function(a){return a=a.replace(K,""),function(b){var c=typeof b.getAttributeNode!==j&&b.getAttributeNode("id");return c&&c.value===a}},TAG:function(a){return a==="*"?function(){return!0}:(a=a.replace(K,"").toLowerCase(),function(b){return b.nodeName&&b.nodeName.toLowerCase()===a})},CLASS:function(a){var b=M[a];return b||(b=M[a]=new RegExp("(^|"+r+")"+a+"("+r+"|$)"),N.push(a),N.length>$.cacheLength&&delete M[N.shift()]),function(a){return b.test(a.className||typeof a.getAttribute!==j&&a.getAttribute("class")||"")}},ATTR:function(a,b,c){return b?function(d){var e=Z.attr(d,a),f=e+"";if(e==null)return b==="!=";switch(b){case"=":return f===c;case"!=":return f!==c;case"^=":return c&&f.indexOf(c)===0;case"*=":return c&&f.indexOf(c)>-1;case"$=":return c&&f.substr(f.length-c.length)===c;case"~=":return(" "+f+" ").indexOf(c)>-1;case"|=":return f===c||f.substr(0,c.length+1)===c+"-"}}:function(b){return Z.attr(b,a)!=null}},CHILD:function(a,b,c,d){if(a==="nth"){var e=m++;return function(a){var b,f,g=0,h=a;if(c===1&&d===0)return!0;b=a.parentNode;if(b&&(b[q]!==e||!a.sizset)){for(h=b.firstChild;h;h=h.nextSibling)if(h.nodeType===1){h.sizset=++g;if(h===a)break}b[q]=e}return f=a.sizset-d,c===0?f===0:f%c===0&&f/c>=0}}return function(b){var c=b;switch(a){case"only":case"first":while(c=c.previousSibling)if(c.nodeType===1)return!1;if(a==="first")return!0;c=b;case"last":while(c=c.nextSibling)if(c.nodeType===1)return!1;return!0}}},PSEUDO:function(a,b,c,d){var e=$.pseudos[a]||$.pseudos[a.toLowerCase()];return e||Z.error("unsupported pseudo: "+a),e.sizzleFilter?e(b,c,d):e}},pseudos:{not:Q(function(a,b,c){var d=bl(a.replace(A,"$1"),b,c);return function(a){return!d(a)}}),enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&!!a.checked||b==="option"&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},parent:function(a){return!$.pseudos.empty(a)},empty:function(a){var b;a=a.firstChild;while(a){if(a.nodeName>"@"||(b=a.nodeType)===3||b===4)return!1;a=a.nextSibling}return!0},contains:Q(function(a){return function(b){return(b.textContent||b.innerText||bc(b)).indexOf(a)>-1}}),has:Q(function(a){return function(b){return Z(a,b).length>0}}),header:function(a){return I.test(a.nodeName)},text:function(a){var b,c;return a.nodeName.toLowerCase()==="input"&&(b=a.type)==="text"&&((c=a.getAttribute("type"))==null||c.toLowerCase()===b)},radio:R("radio"),checkbox:R("checkbox"),file:R("file"),password:R("password"),image:R("image"),submit:S("submit"),reset:S("reset"),button:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&a.type==="button"||b==="button"},input:function(a){return J.test(a.nodeName)},focus:function(a){var b=a.ownerDocument;return a===b.activeElement&&(!b.hasFocus||b.hasFocus())&&(!!a.type||!!a.href)},active:function(a){return a===a.ownerDocument.activeElement}},setFilters:{first:function(a,b,c){return c?a.slice(1):[a[0]]},last:function(a,b,c){var d=a.pop();return c?a:[d]},even:function(a,b,c){var d=[],e=c?1:0,f=a.length;for(;e<f;e=e+2)d.push(a[e]);return d},odd:function(a,b,c){var d=[],e=c?0:1,f=a.length;for(;e<f;e=e+2)d.push(a[e]);return d},lt:function(a,b,c){return c?a.slice(+b):a.slice(0,+b)},gt:function(a,b,c){return c?a.slice(0,+b+1):a.slice(+b+1)},eq:function(a,b,c){var d=a.splice(+b,1);return c?a:d}}};$.setFilters.nth=$.setFilters.eq,$.filters=$.pseudos,X||($.attrHandle={href:function(a){return a.getAttribute("href",2)},type:function(a){return a.getAttribute("type")}}),V&&($.order.push("NAME"),$.find.NAME=function(a,b){if(typeof b.getElementsByName!==j)return b.getElementsByName(a)}),Y&&($.order.splice(1,0,"CLASS"),$.find.CLASS=function(a,b,c){if(typeof b.getElementsByClassName!==j&&!c)return b.getElementsByClassName(a)});try{n.call(i.childNodes,0)[0].nodeType}catch(_){n=function(a){var b,c=[];for(;b=this[a];a++)c.push(b);return c}}var ba=Z.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?b.nodeName!=="HTML":!1},bb=Z.contains=i.compareDocumentPosition?function(a,b){return!!(a.compareDocumentPosition(b)&16)}:i.contains?function(a,b){var c=a.nodeType===9?a.documentElement:a,d=b.parentNode;return a===d||!!(d&&d.nodeType===1&&c.contains&&c.contains(d))}:function(a,b){while(b=b.parentNode)if(b===a)return!0;return!1},bc=Z.getText=function(a){var b,c="",d=0,e=a.nodeType;if(e){if(e===1||e===9||e===11){if(typeof a.textContent=="string")return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=bc(a)}else if(e===3||e===4)return a.nodeValue}else for(;b=a[d];d++)c+=bc(b);return c};Z.attr=function(a,b){var c,d=ba(a);return d||(b=b.toLowerCase()),$.attrHandle[b]?$.attrHandle[b](a):U||d?a.getAttribute(b):(c=a.getAttributeNode(b),c?typeof a[b]=="boolean"?a[b]?b:null:c.specified?c.value:null:null)},Z.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},[0,0].sort(function(){return l=0}),i.compareDocumentPosition?e=function(a,b){return a===b?(k=!0,0):(!a.compareDocumentPosition||!b.compareDocumentPosition?a.compareDocumentPosition:a.compareDocumentPosition(b)&4)?-1:1}:(e=function(a,b){if(a===b)return k=!0,0;if(a.sourceIndex&&b.sourceIndex)return a.sourceIndex-b.sourceIndex;var c,d,e=[],g=[],h=a.parentNode,i=b.parentNode,j=h;if(h===i)return f(a,b);if(!h)return-1;if(!i)return 1;while(j)e.unshift(j),j=j.parentNode;j=i;while(j)g.unshift(j),j=j.parentNode;c=e.length,d=g.length;for(var l=0;l<c&&l<d;l++)if(e[l]!==g[l])return f(e[l],g[l]);return l===c?f(a,g[l],-1):f(e[l],b,1)},f=function(a,b,c){if(a===b)return c;var d=a.nextSibling;while(d){if(d===b)return-1;d=d.nextSibling}return 1}),Z.uniqueSort=function(a){var b,c=1;if(e){k=l,a.sort(e);if(k)for(;b=a[c];c++)b===a[c-1]&&a.splice(c--,1)}return a};var bl=Z.compile=function(a,b,c){var d,e,f,g=O[a];if(g&&g.context===b)return g;e=bg(a,b,c);for(f=0;d=e[f];f++)e[f]=bj(d,b,c);return g=O[a]=bk(e),g.context=b,g.runs=g.dirruns=0,P.push(a),P.length>$.cacheLength&&delete O[P.shift()],g};Z.matches=function(a,b){return Z(a,null,null,b)},Z.matchesSelector=function(a,b){return Z(b,null,null,[a]).length>0};var bm=function(a,b,e,f,g){a=a.replace(A,"$1");var h,i,j,k,l,m,p,q,r,s=a.match(C),t=a.match(E),u=b.nodeType;if(L.POS.test(a))return bf(a,b,e,f,s);if(f)h=n.call(f,0);else if(s&&s.length===1){if(t.length>1&&u===9&&!g&&(s=L.ID.exec(t[0]))){b=$.find.ID(s[1],b,g)[0];if(!b)return e;a=a.slice(t.shift().length)}q=(s=G.exec(t[0]))&&!s.index&&b.parentNode||b,r=t.pop(),m=r.split(":not")[0];for(j=0,k=$.order.length;j<k;j++){p=$.order[j];if(s=L[p].exec(m)){h=$.find[p]((s[1]||"").replace(K,""),q,g);if(h==null)continue;m===r&&(a=a.slice(0,a.length-r.length)+m.replace(L[p],""),a||o.apply(e,n.call(h,0)));break}}}if(a){i=bl(a,b,g),d=i.dirruns++,h==null&&(h=$.find.TAG("*",G.test(a)&&b.parentNode||b));for(j=0;l=h[j];j++)c=i.runs++,i(l,b)&&e.push(l)}return e};h.querySelectorAll&&function(){var a,b=bm,c=/'|\\/g,d=/\=[\x20\t\r\n\f]*([^'"\]]*)[\x20\t\r\n\f]*\]/g,e=[],f=[":active"],g=i.matchesSelector||i.mozMatchesSelector||i.webkitMatchesSelector||i.oMatchesSelector||i.msMatchesSelector;T(function(a){a.innerHTML="<select><option selected></option></select>",a.querySelectorAll("[selected]").length||e.push("\\["+r+"*(?:checked|disabled|ismap|multiple|readonly|selected|value)"),a.querySelectorAll(":checked").length||e.push(":checked")}),T(function(a){a.innerHTML="<p test=''></p>",a.querySelectorAll("[test^='']").length&&e.push("[*^$]="+r+"*(?:\"\"|'')"),a.innerHTML="<input type='hidden'>",a.querySelectorAll(":enabled").length||e.push(":enabled",":disabled")}),e=e.length&&new RegExp(e.join("|")),bm=function(a,d,f,g,h){if(!g&&!h&&(!e||!e.test(a)))if(d.nodeType===9)try{return o.apply(f,n.call(d.querySelectorAll(a),0)),f}catch(i){}else if(d.nodeType===1&&d.nodeName.toLowerCase()!=="object"){var j=d.getAttribute("id"),k=j||q,l=G.test(a)&&d.parentNode||d;j?k=k.replace(c,"\\$&"):d.setAttribute("id",k);try{return o.apply(f,n.call(l.querySelectorAll(a.replace(C,"[id='"+k+"'] $&")),0)),f}catch(i){}finally{j||d.removeAttribute("id")}}return b(a,d,f,g,h)},g&&(T(function(b){a=g.call(b,"div");try{g.call(b,"[test!='']:sizzle"),f.push($.match.PSEUDO)}catch(c){}}),f=new RegExp(f.join("|")),Z.matchesSelector=function(b,c){c=c.replace(d,"='$1']");if(!ba(b)&&!f.test(c)&&(!e||!e.test(c)))try{var h=g.call(b,c);if(h||a||b.document&&b.document.nodeType!==11)return h}catch(i){}return Z(c,null,null,[b]).length>0})}(),Z.attr=p.attr,p.find=Z,p.expr=Z.selectors,p.expr[":"]=p.expr.pseudos,p.unique=Z.uniqueSort,p.text=Z.getText,p.isXMLDoc=Z.isXML,p.contains=Z.contains}(a);var bc=/Until$/,bd=/^(?:parents|prev(?:Until|All))/,be=/^.[^:#\[\.,]*$/,bf=p.expr.match.needsContext,bg={children:!0,contents:!0,next:!0,prev:!0};p.fn.extend({find:function(a){var b,c,d,e,f,g,h=this;if(typeof a!="string")return p(a).filter(function(){for(b=0,c=h.length;b<c;b++)if(p.contains(h[b],this))return!0});g=this.pushStack("","find",a);for(b=0,c=this.length;b<c;b++){d=g.length,p.find(a,this[b],g);if(b>0)for(e=d;e<g.length;e++)for(f=0;f<d;f++)if(g[f]===g[e]){g.splice(e--,1);break}}return g},has:function(a){var b,c=p(a,this),d=c.length;return this.filter(function(){for(b=0;b<d;b++)if(p.contains(this,c[b]))return!0})},not:function(a){return this.pushStack(bj(this,a,!1),"not",a)},filter:function(a){return this.pushStack(bj(this,a,!0),"filter",a)},is:function(a){return!!a&&(typeof a=="string"?bf.test(a)?p(a,this.context).index(this[0])>=0:p.filter(a,this).length>0:this.filter(a).length>0)},closest:function(a,b){var c,d=0,e=this.length,f=[],g=bf.test(a)||typeof a!="string"?p(a,b||this.context):0;for(;d<e;d++){c=this[d];while(c&&c.ownerDocument&&c!==b&&c.nodeType!==11){if(g?g.index(c)>-1:p.find.matchesSelector(c,a)){f.push(c);break}c=c.parentNode}}return f=f.length>1?p.unique(f):f,this.pushStack(f,"closest",a)},index:function(a){return a?typeof a=="string"?p.inArray(this[0],p(a)):p.inArray(a.jquery?a[0]:a,this):this[0]&&this[0].parentNode?this.prevAll().length:-1},add:function(a,b){var c=typeof a=="string"?p(a,b):p.makeArray(a&&a.nodeType?[a]:a),d=p.merge(this.get(),c);return this.pushStack(bh(c[0])||bh(d[0])?d:p.unique(d))},addBack:function(a){return this.add(a==null?this.prevObject:this.prevObject.filter(a))}}),p.fn.andSelf=p.fn.addBack,p.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType!==11?b:null},parents:function(a){return p.dir(a,"parentNode")},parentsUntil:function(a,b,c){return p.dir(a,"parentNode",c)},next:function(a){return bi(a,"nextSibling")},prev:function(a){return bi(a,"previousSibling")},nextAll:function(a){return p.dir(a,"nextSibling")},prevAll:function(a){return p.dir(a,"previousSibling")},nextUntil:function(a,b,c){return p.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return p.dir(a,"previousSibling",c)},siblings:function(a){return p.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return p.sibling(a.firstChild)},contents:function(a){return p.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:p.merge([],a.childNodes)}},function(a,b){p.fn[a]=function(c,d){var e=p.map(this,b,c);return bc.test(a)||(d=c),d&&typeof d=="string"&&(e=p.filter(d,e)),e=this.length>1&&!bg[a]?p.unique(e):e,this.length>1&&bd.test(a)&&(e=e.reverse()),this.pushStack(e,a,k.call(arguments).join(","))}}),p.extend({filter:function(a,b,c){return c&&(a=":not("+a+")"),b.length===1?p.find.matchesSelector(b[0],a)?[b[0]]:[]:p.find.matches(a,b)},dir:function(a,c,d){var e=[],f=a[c];while(f&&f.nodeType!==9&&(d===b||f.nodeType!==1||!p(f).is(d)))f.nodeType===1&&e.push(f),f=f[c];return e},sibling:function(a,b){var c=[];for(;a;a=a.nextSibling)a.nodeType===1&&a!==b&&c.push(a);return c}});var bl="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",bm=/ jQuery\d+="(?:null|\d+)"/g,bn=/^\s+/,bo=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,bp=/<([\w:]+)/,bq=/<tbody/i,br=/<|&#?\w+;/,bs=/<(?:script|style|link)/i,bt=/<(?:script|object|embed|option|style)/i,bu=new RegExp("<(?:"+bl+")[\\s/>]","i"),bv=/^(?:checkbox|radio)$/,bw=/checked\s*(?:[^=]|=\s*.checked.)/i,bx=/\/(java|ecma)script/i,by=/^\s*<!(?:\[CDATA\[|\-\-)|[\]\-]{2}>\s*$/g,bz={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],area:[1,"<map>","</map>"],_default:[0,"",""]},bA=bk(e),bB=bA.appendChild(e.createElement("div"));bz.optgroup=bz.option,bz.tbody=bz.tfoot=bz.colgroup=bz.caption=bz.thead,bz.th=bz.td,p.support.htmlSerialize||(bz._default=[1,"X<div>","</div>"]),p.fn.extend({text:function(a){return p.access(this,function(a){return a===b?p.text(this):this.empty().append((this[0]&&this[0].ownerDocument||e).createTextNode(a))},null,a,arguments.length)},wrapAll:function(a){if(p.isFunction(a))return this.each(function(b){p(this).wrapAll(a.call(this,b))});if(this[0]){var b=p(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&a.firstChild.nodeType===1)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){return p.isFunction(a)?this.each(function(b){p(this).wrapInner(a.call(this,b))}):this.each(function(){var b=p(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=p.isFunction(a);return this.each(function(c){p(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){p.nodeName(this,"body")||p(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(a){(this.nodeType===1||this.nodeType===11)&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){(this.nodeType===1||this.nodeType===11)&&this.insertBefore(a,this.firstChild)})},before:function(){if(!bh(this[0]))return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)});if(arguments.length){var a=p.clean(arguments);return this.pushStack(p.merge(a,this),"before",this.selector)}},after:function(){if(!bh(this[0]))return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this.nextSibling)});if(arguments.length){var a=p.clean(arguments);return this.pushStack(p.merge(this,a),"after",this.selector)}},remove:function(a,b){var c,d=0;for(;(c=this[d])!=null;d++)if(!a||p.filter(a,[c]).length)!b&&c.nodeType===1&&(p.cleanData(c.getElementsByTagName("*")),p.cleanData([c])),c.parentNode&&c.parentNode.removeChild(c);return this},empty:function(){var a,b=0;for(;(a=this[b])!=null;b++){a.nodeType===1&&p.cleanData(a.getElementsByTagName("*"));while(a.firstChild)a.removeChild(a.firstChild)}return this},clone:function(a,b){return a=a==null?!1:a,b=b==null?a:b,this.map(function(){return p.clone(this,a,b)})},html:function(a){return p.access(this,function(a){var c=this[0]||{},d=0,e=this.length;if(a===b)return c.nodeType===1?c.innerHTML.replace(bm,""):b;if(typeof a=="string"&&!bs.test(a)&&(p.support.htmlSerialize||!bu.test(a))&&(p.support.leadingWhitespace||!bn.test(a))&&!bz[(bp.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(bo,"<$1></$2>");try{for(;d<e;d++)c=this[d]||{},c.nodeType===1&&(p.cleanData(c.getElementsByTagName("*")),c.innerHTML=a);c=0}catch(f){}}c&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(a){return bh(this[0])?this.length?this.pushStack(p(p.isFunction(a)?a():a),"replaceWith",a):this:p.isFunction(a)?this.each(function(b){var c=p(this),d=c.html();c.replaceWith(a.call(this,b,d))}):(typeof a!="string"&&(a=p(a).detach()),this.each(function(){var b=this.nextSibling,c=this.parentNode;p(this).remove(),b?p(b).before(a):p(c).append(a)}))},detach:function(a){return this.remove(a,!0)},domManip:function(a,c,d){a=[].concat.apply([],a);var e,f,g,h,i=0,j=a[0],k=[],l=this.length;if(!p.support.checkClone&&l>1&&typeof j=="string"&&bw.test(j))return this.each(function(){p(this).domManip(a,c,d)});if(p.isFunction(j))return this.each(function(e){var f=p(this);a[0]=j.call(this,e,c?f.html():b),f.domManip(a,c,d)});if(this[0]){e=p.buildFragment(a,this,k),g=e.fragment,f=g.firstChild,g.childNodes.length===1&&(g=f);if(f){c=c&&p.nodeName(f,"tr");for(h=e.cacheable||l-1;i<l;i++)d.call(c&&p.nodeName(this[i],"table")?bC(this[i],"tbody"):this[i],i===h?g:p.clone(g,!0,!0))}g=f=null,k.length&&p.each(k,function(a,b){b.src?p.ajax?p.ajax({url:b.src,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0}):p.error("no ajax"):p.globalEval((b.text||b.textContent||b.innerHTML||"").replace(by,"")),b.parentNode&&b.parentNode.removeChild(b)})}return this}}),p.buildFragment=function(a,c,d){var f,g,h,i=a[0];return c=c||e,c=(c[0]||c).ownerDocument||c[0]||c,typeof c.createDocumentFragment=="undefined"&&(c=e),a.length===1&&typeof i=="string"&&i.length<512&&c===e&&i.charAt(0)==="<"&&!bt.test(i)&&(p.support.checkClone||!bw.test(i))&&(p.support.html5Clone||!bu.test(i))&&(g=!0,f=p.fragments[i],h=f!==b),f||(f=c.createDocumentFragment(),p.clean(a,c,f,d),g&&(p.fragments[i]=h&&f)),{fragment:f,cacheable:g}},p.fragments={},p.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){p.fn[a]=function(c){var d,e=0,f=[],g=p(c),h=g.length,i=this.length===1&&this[0].parentNode;if((i==null||i&&i.nodeType===11&&i.childNodes.length===1)&&h===1)return g[b](this[0]),this;for(;e<h;e++)d=(e>0?this.clone(!0):this).get(),p(g[e])[b](d),f=f.concat(d);return this.pushStack(f,a,g.selector)}}),p.extend({clone:function(a,b,c){var d,e,f,g;p.support.html5Clone||p.isXMLDoc(a)||!bu.test("<"+a.nodeName+">")?g=a.cloneNode(!0):(bB.innerHTML=a.outerHTML,bB.removeChild(g=bB.firstChild));if((!p.support.noCloneEvent||!p.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!p.isXMLDoc(a)){bE(a,g),d=bF(a),e=bF(g);for(f=0;d[f];++f)e[f]&&bE(d[f],e[f])}if(b){bD(a,g);if(c){d=bF(a),e=bF(g);for(f=0;d[f];++f)bD(d[f],e[f])}}return d=e=null,g},clean:function(a,b,c,d){var f,g,h,i,j,k,l,m,n,o,q,r,s=0,t=[];if(!b||typeof b.createDocumentFragment=="undefined")b=e;for(g=b===e&&bA;(h=a[s])!=null;s++){typeof h=="number"&&(h+="");if(!h)continue;if(typeof h=="string")if(!br.test(h))h=b.createTextNode(h);else{g=g||bk(b),l=l||g.appendChild(b.createElement("div")),h=h.replace(bo,"<$1></$2>"),i=(bp.exec(h)||["",""])[1].toLowerCase(),j=bz[i]||bz._default,k=j[0],l.innerHTML=j[1]+h+j[2];while(k--)l=l.lastChild;if(!p.support.tbody){m=bq.test(h),n=i==="table"&&!m?l.firstChild&&l.firstChild.childNodes:j[1]==="<table>"&&!m?l.childNodes:[];for(f=n.length-1;f>=0;--f)p.nodeName(n[f],"tbody")&&!n[f].childNodes.length&&n[f].parentNode.removeChild(n[f])}!p.support.leadingWhitespace&&bn.test(h)&&l.insertBefore(b.createTextNode(bn.exec(h)[0]),l.firstChild),h=l.childNodes,l=g.lastChild}h.nodeType?t.push(h):t=p.merge(t,h)}l&&(g.removeChild(l),h=l=g=null);if(!p.support.appendChecked)for(s=0;(h=t[s])!=null;s++)p.nodeName(h,"input")?bG(h):typeof h.getElementsByTagName!="undefined"&&p.grep(h.getElementsByTagName("input"),bG);if(c){q=function(a){if(!a.type||bx.test(a.type))return d?d.push(a.parentNode?a.parentNode.removeChild(a):a):c.appendChild(a)};for(s=0;(h=t[s])!=null;s++)if(!p.nodeName(h,"script")||!q(h))c.appendChild(h),typeof h.getElementsByTagName!="undefined"&&(r=p.grep(p.merge([],h.getElementsByTagName("script")),q),t.splice.apply(t,[s+1,0].concat(r)),s+=r.length)}return t},cleanData:function(a,b){var c,d,e,f,g=0,h=p.expando,i=p.cache,j=p.support.deleteExpando,k=p.event.special;for(;(e=a[g])!=null;g++)if(b||p.acceptData(e)){d=e[h],c=d&&i[d];if(c){if(c.events)for(f in c.events)k[f]?p.event.remove(e,f):p.removeEvent(e,f,c.handle);i[d]&&(delete i[d],j?delete e[h]:e.removeAttribute?e.removeAttribute(h):e[h]=null,p.deletedIds.push(d))}}}}),function(){var a,b;p.uaMatch=function(a){a=a.toLowerCase();var b=/(chrome)[ \/]([\w.]+)/.exec(a)||/(webkit)[ \/]([\w.]+)/.exec(a)||/(opera)(?:.*version|)[ \/]([\w.]+)/.exec(a)||/(msie) ([\w.]+)/.exec(a)||a.indexOf("compatible")<0&&/(mozilla)(?:.*? rv:([\w.]+)|)/.exec(a)||[];return{browser:b[1]||"",version:b[2]||"0"}},a=p.uaMatch(g.userAgent),b={},a.browser&&(b[a.browser]=!0,b.version=a.version),b.webkit&&(b.safari=!0),p.browser=b,p.sub=function(){function a(b,c){return new a.fn.init(b,c)}p.extend(!0,a,this),a.superclass=this,a.fn=a.prototype=this(),a.fn.constructor=a,a.sub=this.sub,a.fn.init=function c(c,d){return d&&d instanceof p&&!(d instanceof a)&&(d=a(d)),p.fn.init.call(this,c,d,b)},a.fn.init.prototype=a.fn;var b=a(e);return a}}();var bH,bI,bJ,bK=/alpha\([^)]*\)/i,bL=/opacity=([^)]*)/,bM=/^(top|right|bottom|left)$/,bN=/^margin/,bO=new RegExp("^("+q+")(.*)$","i"),bP=new RegExp("^("+q+")(?!px)[a-z%]+$","i"),bQ=new RegExp("^([-+])=("+q+")","i"),bR={},bS={position:"absolute",visibility:"hidden",display:"block"},bT={letterSpacing:0,fontWeight:400,lineHeight:1},bU=["Top","Right","Bottom","Left"],bV=["Webkit","O","Moz","ms"],bW=p.fn.toggle;p.fn.extend({css:function(a,c){return p.access(this,function(a,c,d){return d!==b?p.style(a,c,d):p.css(a,c)},a,c,arguments.length>1)},show:function(){return bZ(this,!0)},hide:function(){return bZ(this)},toggle:function(a,b){var c=typeof a=="boolean";return p.isFunction(a)&&p.isFunction(b)?bW.apply(this,arguments):this.each(function(){(c?a:bY(this))?p(this).show():p(this).hide()})}}),p.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=bH(a,"opacity");return c===""?"1":c}}}},cssNumber:{fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":p.support.cssFloat?"cssFloat":"styleFloat"},style:function(a,c,d,e){if(!a||a.nodeType===3||a.nodeType===8||!a.style)return;var f,g,h,i=p.camelCase(c),j=a.style;c=p.cssProps[i]||(p.cssProps[i]=bX(j,i)),h=p.cssHooks[c]||p.cssHooks[i];if(d===b)return h&&"get"in h&&(f=h.get(a,!1,e))!==b?f:j[c];g=typeof d,g==="string"&&(f=bQ.exec(d))&&(d=(f[1]+1)*f[2]+parseFloat(p.css(a,c)),g="number");if(d==null||g==="number"&&isNaN(d))return;g==="number"&&!p.cssNumber[i]&&(d+="px");if(!h||!("set"in h)||(d=h.set(a,d,e))!==b)try{j[c]=d}catch(k){}},css:function(a,c,d,e){var f,g,h,i=p.camelCase(c);return c=p.cssProps[i]||(p.cssProps[i]=bX(a.style,i)),h=p.cssHooks[c]||p.cssHooks[i],h&&"get"in h&&(f=h.get(a,!0,e)),f===b&&(f=bH(a,c)),f==="normal"&&c in bT&&(f=bT[c]),d||e!==b?(g=parseFloat(f),d||p.isNumeric(g)?g||0:f):f},swap:function(a,b,c){var d,e,f={};for(e in b)f[e]=a.style[e],a.style[e]=b[e];d=c.call(a);for(e in b)a.style[e]=f[e];return d}}),a.getComputedStyle?bH=function(a,b){var c,d,e,f,g=getComputedStyle(a,null),h=a.style;return g&&(c=g[b],c===""&&!p.contains(a.ownerDocument.documentElement,a)&&(c=p.style(a,b)),bP.test(c)&&bN.test(b)&&(d=h.width,e=h.minWidth,f=h.maxWidth,h.minWidth=h.maxWidth=h.width=c,c=g.width,h.width=d,h.minWidth=e,h.maxWidth=f)),c}:e.documentElement.currentStyle&&(bH=function(a,b){var c,d,e=a.currentStyle&&a.currentStyle[b],f=a.style;return e==null&&f&&f[b]&&(e=f[b]),bP.test(e)&&!bM.test(b)&&(c=f.left,d=a.runtimeStyle&&a.runtimeStyle.left,d&&(a.runtimeStyle.left=a.currentStyle.left),f.left=b==="fontSize"?"1em":e,e=f.pixelLeft+"px",f.left=c,d&&(a.runtimeStyle.left=d)),e===""?"auto":e}),p.each(["height","width"],function(a,b){p.cssHooks[b]={get:function(a,c,d){if(c)return a.offsetWidth!==0||bH(a,"display")!=="none"?ca(a,b,d):p.swap(a,bS,function(){return ca(a,b,d)})},set:function(a,c,d){return b$(a,c,d?b_(a,b,d,p.support.boxSizing&&p.css(a,"boxSizing")==="border-box"):0)}}}),p.support.opacity||(p.cssHooks.opacity={get:function(a,b){return bL.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?.01*parseFloat(RegExp.$1)+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=p.isNumeric(b)?"alpha(opacity="+b*100+")":"",f=d&&d.filter||c.filter||"";c.zoom=1;if(b>=1&&p.trim(f.replace(bK,""))===""&&c.removeAttribute){c.removeAttribute("filter");if(d&&!d.filter)return}c.filter=bK.test(f)?f.replace(bK,e):f+" "+e}}),p(function(){p.support.reliableMarginRight||(p.cssHooks.marginRight={get:function(a,b){return p.swap(a,{display:"inline-block"},function(){if(b)return bH(a,"marginRight")})}}),!p.support.pixelPosition&&p.fn.position&&p.each(["top","left"],function(a,b){p.cssHooks[b]={get:function(a,c){if(c){var d=bH(a,b);return bP.test(d)?p(a).position()[b]+"px":d}}}})}),p.expr&&p.expr.filters&&(p.expr.filters.hidden=function(a){return a.offsetWidth===0&&a.offsetHeight===0||!p.support.reliableHiddenOffsets&&(a.style&&a.style.display||bH(a,"display"))==="none"},p.expr.filters.visible=function(a){return!p.expr.filters.hidden(a)}),p.each({margin:"",padding:"",border:"Width"},function(a,b){p.cssHooks[a+b]={expand:function(c){var d,e=typeof c=="string"?c.split(" "):[c],f={};for(d=0;d<4;d++)f[a+bU[d]+b]=e[d]||e[d-2]||e[0];return f}},bN.test(a)||(p.cssHooks[a+b].set=b$)});var cc=/%20/g,cd=/\[\]$/,ce=/\r?\n/g,cf=/^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,cg=/^(?:select|textarea)/i;p.fn.extend({serialize:function(){return p.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?p.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||cg.test(this.nodeName)||cf.test(this.type))}).map(function(a,b){var c=p(this).val();return c==null?null:p.isArray(c)?p.map(c,function(a,c){return{name:b.name,value:a.replace(ce,"\r\n")}}):{name:b.name,value:c.replace(ce,"\r\n")}}).get()}}),p.param=function(a,c){var d,e=[],f=function(a,b){b=p.isFunction(b)?b():b==null?"":b,e[e.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};c===b&&(c=p.ajaxSettings&&p.ajaxSettings.traditional);if(p.isArray(a)||a.jquery&&!p.isPlainObject(a))p.each(a,function(){f(this.name,this.value)});else for(d in a)ch(d,a[d],c,f);return e.join("&").replace(cc,"+")};var ci,cj,ck=/#.*$/,cl=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,cm=/^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,cn=/^(?:GET|HEAD)$/,co=/^\/\//,cp=/\?/,cq=/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,cr=/([?&])_=[^&]*/,cs=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+)|)|)/,ct=p.fn.load,cu={},cv={},cw=["*/"]+["*"];try{ci=f.href}catch(cx){ci=e.createElement("a"),ci.href="",ci=ci.href}cj=cs.exec(ci.toLowerCase())||[],p.fn.load=function(a,c,d){if(typeof a!="string"&&ct)return ct.apply(this,arguments);if(!this.length)return this;var e,f,g,h=this,i=a.indexOf(" ");return i>=0&&(e=a.slice(i,a.length),a=a.slice(0,i)),p.isFunction(c)?(d=c,c=b):typeof c=="object"&&(f="POST"),p.ajax({url:a,type:f,dataType:"html",data:c,complete:function(a,b){d&&h.each(d,g||[a.responseText,b,a])}}).done(function(a){g=arguments,h.html(e?p("<div>").append(a.replace(cq,"")).find(e):a)}),this},p.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){p.fn[b]=function(a){return this.on(b,a)}}),p.each(["get","post"],function(a,c){p[c]=function(a,d,e,f){return p.isFunction(d)&&(f=f||e,e=d,d=b),p.ajax({type:c,url:a,data:d,success:e,dataType:f})}}),p.extend({getScript:function(a,c){return p.get(a,b,c,"script")},getJSON:function(a,b,c){return p.get(a,b,c,"json")},ajaxSetup:function(a,b){return b?cA(a,p.ajaxSettings):(b=a,a=p.ajaxSettings),cA(a,b),a},ajaxSettings:{url:ci,isLocal:cm.test(cj[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded; charset=UTF-8",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":cw},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":a.String,"text html":!0,"text json":p.parseJSON,"text xml":p.parseXML},flatOptions:{context:!0,url:!0}},ajaxPrefilter:cy(cu),ajaxTransport:cy(cv),ajax:function(a,c){function y(a,c,f,i){var k,s,t,u,w,y=c;if(v===2)return;v=2,h&&clearTimeout(h),g=b,e=i||"",x.readyState=a>0?4:0,f&&(u=cB(l,x,f));if(a>=200&&a<300||a===304)l.ifModified&&(w=x.getResponseHeader("Last-Modified"),w&&(p.lastModified[d]=w),w=x.getResponseHeader("Etag"),w&&(p.etag[d]=w)),a===304?(y="notmodified",k=!0):(k=cC(l,u),y=k.state,s=k.data,t=k.error,k=!t);else{t=y;if(!y||a)y="error",a<0&&(a=0)}x.status=a,x.statusText=""+(c||y),k?o.resolveWith(m,[s,y,x]):o.rejectWith(m,[x,y,t]),x.statusCode(r),r=b,j&&n.trigger("ajax"+(k?"Success":"Error"),[x,l,k?s:t]),q.fireWith(m,[x,y]),j&&(n.trigger("ajaxComplete",[x,l]),--p.active||p.event.trigger("ajaxStop"))}typeof a=="object"&&(c=a,a=b),c=c||{};var d,e,f,g,h,i,j,k,l=p.ajaxSetup({},c),m=l.context||l,n=m!==l&&(m.nodeType||m instanceof p)?p(m):p.event,o=p.Deferred(),q=p.Callbacks("once memory"),r=l.statusCode||{},t={},u={},v=0,w="canceled",x={readyState:0,setRequestHeader:function(a,b){if(!v){var c=a.toLowerCase();a=u[c]=u[c]||a,t[a]=b}return this},getAllResponseHeaders:function(){return v===2?e:null},getResponseHeader:function(a){var c;if(v===2){if(!f){f={};while(c=cl.exec(e))f[c[1].toLowerCase()]=c[2]}c=f[a.toLowerCase()]}return c===b?null:c},overrideMimeType:function(a){return v||(l.mimeType=a),this},abort:function(a){return a=a||w,g&&g.abort(a),y(0,a),this}};o.promise(x),x.success=x.done,x.error=x.fail,x.complete=q.add,x.statusCode=function(a){if(a){var b;if(v<2)for(b in a)r[b]=[r[b],a[b]];else b=a[x.status],x.always(b)}return this},l.url=((a||l.url)+"").replace(ck,"").replace(co,cj[1]+"//"),l.dataTypes=p.trim(l.dataType||"*").toLowerCase().split(s),l.crossDomain==null&&(i=cs.exec(l.url.toLowerCase()),l.crossDomain=!(!i||i[1]==cj[1]&&i[2]==cj[2]&&(i[3]||(i[1]==="http:"?80:443))==(cj[3]||(cj[1]==="http:"?80:443)))),l.data&&l.processData&&typeof l.data!="string"&&(l.data=p.param(l.data,l.traditional)),cz(cu,l,c,x);if(v===2)return x;j=l.global,l.type=l.type.toUpperCase(),l.hasContent=!cn.test(l.type),j&&p.active++===0&&p.event.trigger("ajaxStart");if(!l.hasContent){l.data&&(l.url+=(cp.test(l.url)?"&":"?")+l.data,delete l.data),d=l.url;if(l.cache===!1){var z=p.now(),A=l.url.replace(cr,"$1_="+z);l.url=A+(A===l.url?(cp.test(l.url)?"&":"?")+"_="+z:"")}}(l.data&&l.hasContent&&l.contentType!==!1||c.contentType)&&x.setRequestHeader("Content-Type",l.contentType),l.ifModified&&(d=d||l.url,p.lastModified[d]&&x.setRequestHeader("If-Modified-Since",p.lastModified[d]),p.etag[d]&&x.setRequestHeader("If-None-Match",p.etag[d])),x.setRequestHeader("Accept",l.dataTypes[0]&&l.accepts[l.dataTypes[0]]?l.accepts[l.dataTypes[0]]+(l.dataTypes[0]!=="*"?", "+cw+"; q=0.01":""):l.accepts["*"]);for(k in l.headers)x.setRequestHeader(k,l.headers[k]);if(!l.beforeSend||l.beforeSend.call(m,x,l)!==!1&&v!==2){w="abort";for(k in{success:1,error:1,complete:1})x[k](l[k]);g=cz(cv,l,c,x);if(!g)y(-1,"No Transport");else{x.readyState=1,j&&n.trigger("ajaxSend",[x,l]),l.async&&l.timeout>0&&(h=setTimeout(function(){x.abort("timeout")},l.timeout));try{v=1,g.send(t,y)}catch(B){if(v<2)y(-1,B);else throw B}}return x}return x.abort()},active:0,lastModified:{},etag:{}});var cD=[],cE=/\?/,cF=/(=)\?(?=&|$)|\?\?/,cG=p.now();p.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var a=cD.pop()||p.expando+"_"+cG++;return this[a]=!0,a}}),p.ajaxPrefilter("json jsonp",function(c,d,e){var f,g,h,i=c.data,j=c.url,k=c.jsonp!==!1,l=k&&cF.test(j),m=k&&!l&&typeof i=="string"&&!(c.contentType||"").indexOf("application/x-www-form-urlencoded")&&cF.test(i);if(c.dataTypes[0]==="jsonp"||l||m)return f=c.jsonpCallback=p.isFunction(c.jsonpCallback)?c.jsonpCallback():c.jsonpCallback,g=a[f],l?c.url=j.replace(cF,"$1"+f):m?c.data=i.replace(cF,"$1"+f):k&&(c.url+=(cE.test(j)?"&":"?")+c.jsonp+"="+f),c.converters["script json"]=function(){return h||p.error(f+" was not called"),h[0]},c.dataTypes[0]="json",a[f]=function(){h=arguments},e.always(function(){a[f]=g,c[f]&&(c.jsonpCallback=d.jsonpCallback,cD.push(f)),h&&p.isFunction(g)&&g(h[0]),h=g=b}),"script"}),p.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(a){return p.globalEval(a),a}}}),p.ajaxPrefilter("script",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),p.ajaxTransport("script",function(a){if(a.crossDomain){var c,d=e.head||e.getElementsByTagName("head")[0]||e.documentElement;return{send:function(f,g){c=e.createElement("script"),c.async="async",a.scriptCharset&&(c.charset=a.scriptCharset),c.src=a.url,c.onload=c.onreadystatechange=function(a,e){if(e||!c.readyState||/loaded|complete/.test(c.readyState))c.onload=c.onreadystatechange=null,d&&c.parentNode&&d.removeChild(c),c=b,e||g(200,"success")},d.insertBefore(c,d.firstChild)},abort:function(){c&&c.onload(0,1)}}}});var cH,cI=a.ActiveXObject?function(){for(var a in cH)cH[a](0,1)}:!1,cJ=0;p.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&cK()||cL()}:cK,function(a){p.extend(p.support,{ajax:!!a,cors:!!a&&"withCredentials"in a})}(p.ajaxSettings.xhr()),p.support.ajax&&p.ajaxTransport(function(c){if(!c.crossDomain||p.support.cors){var d;return{send:function(e,f){var g,h,i=c.xhr();c.username?i.open(c.type,c.url,c.async,c.username,c.password):i.open(c.type,c.url,c.async);if(c.xhrFields)for(h in c.xhrFields)i[h]=c.xhrFields[h];c.mimeType&&i.overrideMimeType&&i.overrideMimeType(c.mimeType),!c.crossDomain&&!e["X-Requested-With"]&&(e["X-Requested-With"]="XMLHttpRequest");try{for(h in e)i.setRequestHeader(h,e[h])}catch(j){}i.send(c.hasContent&&c.data||null),d=function(a,e){var h,j,k,l,m;try{if(d&&(e||i.readyState===4)){d=b,g&&(i.onreadystatechange=p.noop,cI&&delete cH[g]);if(e)i.readyState!==4&&i.abort();else{h=i.status,k=i.getAllResponseHeaders(),l={},m=i.responseXML,m&&m.documentElement&&(l.xml=m);try{l.text=i.responseText}catch(a){}try{j=i.statusText}catch(n){j=""}!h&&c.isLocal&&!c.crossDomain?h=l.text?200:404:h===1223&&(h=204)}}}catch(o){e||f(-1,o)}l&&f(h,j,l,k)},c.async?i.readyState===4?setTimeout(d,0):(g=++cJ,cI&&(cH||(cH={},p(a).unload(cI)),cH[g]=d),i.onreadystatechange=d):d()},abort:function(){d&&d(0,1)}}}});var cM,cN,cO=/^(?:toggle|show|hide)$/,cP=new RegExp("^(?:([-+])=|)("+q+")([a-z%]*)$","i"),cQ=/queueHooks$/,cR=[cX],cS={"*":[function(a,b){var c,d,e,f=this.createTween(a,b),g=cP.exec(b),h=f.cur(),i=+h||0,j=1;if(g){c=+g[2],d=g[3]||(p.cssNumber[a]?"":"px");if(d!=="px"&&i){i=p.css(f.elem,a,!0)||c||1;do e=j=j||".5",i=i/j,p.style(f.elem,a,i+d),j=f.cur()/h;while(j!==1&&j!==e)}f.unit=d,f.start=i,f.end=g[1]?i+(g[1]+1)*c:c}return f}]};p.Animation=p.extend(cV,{tweener:function(a,b){p.isFunction(a)?(b=a,a=["*"]):a=a.split(" ");var c,d=0,e=a.length;for(;d<e;d++)c=a[d],cS[c]=cS[c]||[],cS[c].unshift(b)},prefilter:function(a,b){b?cR.unshift(a):cR.push(a)}}),p.Tween=cY,cY.prototype={constructor:cY,init:function(a,b,c,d,e,f){this.elem=a,this.prop=c,this.easing=e||"swing",this.options=b,this.start=this.now=this.cur(),this.end=d,this.unit=f||(p.cssNumber[c]?"":"px")},cur:function(){var a=cY.propHooks[this.prop];return a&&a.get?a.get(this):cY.propHooks._default.get(this)},run:function(a){var b,c=cY.propHooks[this.prop];return this.pos=b=p.easing[this.easing](a,this.options.duration*a,0,1,this.options.duration),this.now=(this.end-this.start)*b+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),c&&c.set?c.set(this):cY.propHooks._default.set(this),this}},cY.prototype.init.prototype=cY.prototype,cY.propHooks={_default:{get:function(a){var b;return a.elem[a.prop]==null||!!a.elem.style&&a.elem.style[a.prop]!=null?(b=p.css(a.elem,a.prop,!1,""),!b||b==="auto"?0:b):a.elem[a.prop]},set:function(a){p.fx.step[a.prop]?p.fx.step[a.prop](a):a.elem.style&&(a.elem.style[p.cssProps[a.prop]]!=null||p.cssHooks[a.prop])?p.style(a.elem,a.prop,a.now+a.unit):a.elem[a.prop]=a.now}}},cY.propHooks.scrollTop=cY.propHooks.scrollLeft={set:function(a){a.elem.nodeType&&a.elem.parentNode&&(a.elem[a.prop]=a.now)}},p.each(["toggle","show","hide"],function(a,b){var c=p.fn[b];p.fn[b]=function(d,e,f){return d==null||typeof d=="boolean"||!a&&p.isFunction(d)&&p.isFunction(e)?c.apply(this,arguments):this.animate(cZ(b,!0),d,e,f)}}),p.fn.extend({fadeTo:function(a,b,c,d){return this.filter(bY).css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){var e=p.isEmptyObject(a),f=p.speed(b,c,d),g=function(){var b=cV(this,p.extend({},a),f);e&&b.stop(!0)};return e||f.queue===!1?this.each(g):this.queue(f.queue,g)},stop:function(a,c,d){var e=function(a){var b=a.stop;delete a.stop,b(d)};return typeof a!="string"&&(d=c,c=a,a=b),c&&a!==!1&&this.queue(a||"fx",[]),this.each(function(){var b=!0,c=a!=null&&a+"queueHooks",f=p.timers,g=p._data(this);if(c)g[c]&&g[c].stop&&e(g[c]);else for(c in g)g[c]&&g[c].stop&&cQ.test(c)&&e(g[c]);for(c=f.length;c--;)f[c].elem===this&&(a==null||f[c].queue===a)&&(f[c].anim.stop(d),b=!1,f.splice(c,1));(b||!d)&&p.dequeue(this,a)})}}),p.each({slideDown:cZ("show"),slideUp:cZ("hide"),slideToggle:cZ("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){p.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),p.speed=function(a,b,c){var d=a&&typeof a=="object"?p.extend({},a):{complete:c||!c&&b||p.isFunction(a)&&a,duration:a,easing:c&&b||b&&!p.isFunction(b)&&b};d.duration=p.fx.off?0:typeof d.duration=="number"?d.duration:d.duration in p.fx.speeds?p.fx.speeds[d.duration]:p.fx.speeds._default;if(d.queue==null||d.queue===!0)d.queue="fx";return d.old=d.complete,d.complete=function(){p.isFunction(d.old)&&d.old.call(this),d.queue&&p.dequeue(this,d.queue)},d},p.easing={linear:function(a){return a},swing:function(a){return.5-Math.cos(a*Math.PI)/2}},p.timers=[],p.fx=cY.prototype.init,p.fx.tick=function(){var a,b=p.timers,c=0;for(;c<b.length;c++)a=b[c],!a()&&b[c]===a&&b.splice(c--,1);b.length||p.fx.stop()},p.fx.timer=function(a){a()&&p.timers.push(a)&&!cN&&(cN=setInterval(p.fx.tick,p.fx.interval))},p.fx.interval=13,p.fx.stop=function(){clearInterval(cN),cN=null},p.fx.speeds={slow:600,fast:200,_default:400},p.fx.step={},p.expr&&p.expr.filters&&(p.expr.filters.animated=function(a){return p.grep(p.timers,function(b){return a===b.elem}).length});var c$=/^(?:body|html)$/i;p.fn.offset=function(a){if(arguments.length)return a===b?this:this.each(function(b){p.offset.setOffset(this,a,b)});var c,d,e,f,g,h,i,j,k,l,m=this[0],n=m&&m.ownerDocument;if(!n)return;return(e=n.body)===m?p.offset.bodyOffset(m):(d=n.documentElement,p.contains(d,m)?(c=m.getBoundingClientRect(),f=c_(n),g=d.clientTop||e.clientTop||0,h=d.clientLeft||e.clientLeft||0,i=f.pageYOffset||d.scrollTop,j=f.pageXOffset||d.scrollLeft,k=c.top+i-g,l=c.left+j-h,{top:k,left:l}):{top:0,left:0})},p.offset={bodyOffset:function(a){var b=a.offsetTop,c=a.offsetLeft;return p.support.doesNotIncludeMarginInBodyOffset&&(b+=parseFloat(p.css(a,"marginTop"))||0,c+=parseFloat(p.css(a,"marginLeft"))||0),{top:b,left:c}},setOffset:function(a,b,c){var d=p.css(a,"position");d==="static"&&(a.style.position="relative");var e=p(a),f=e.offset(),g=p.css(a,"top"),h=p.css(a,"left"),i=(d==="absolute"||d==="fixed")&&p.inArray("auto",[g,h])>-1,j={},k={},l,m;i?(k=e.position(),l=k.top,m=k.left):(l=parseFloat(g)||0,m=parseFloat(h)||0),p.isFunction(b)&&(b=b.call(a,c,f)),b.top!=null&&(j.top=b.top-f.top+l),b.left!=null&&(j.left=b.left-f.left+m),"using"in b?b.using.call(a,j):e.css(j)}},p.fn.extend({position:function(){if(!this[0])return;var a=this[0],b=this.offsetParent(),c=this.offset(),d=c$.test(b[0].nodeName)?{top:0,left:0}:b.offset();return c.top-=parseFloat(p.css(a,"marginTop"))||0,c.left-=parseFloat(p.css(a,"marginLeft"))||0,d.top+=parseFloat(p.css(b[0],"borderTopWidth"))||0,d.left+=parseFloat(p.css(b[0],"borderLeftWidth"))||0,{top:c.top-d.top,left:c.left-d.left}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||e.body;while(a&&!c$.test(a.nodeName)&&p.css(a,"position")==="static")a=a.offsetParent;return a||e.body})}}),p.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(a,c){var d=/Y/.test(c);p.fn[a]=function(e){return p.access(this,function(a,e,f){var g=c_(a);if(f===b)return g?c in g?g[c]:g.document.documentElement[e]:a[e];g?g.scrollTo(d?p(g).scrollLeft():f,d?f:p(g).scrollTop()):a[e]=f},a,e,arguments.length,null)}}),p.each({Height:"height",Width:"width"},function(a,c){p.each({padding:"inner"+a,content:c,"":"outer"+a},function(d,e){p.fn[e]=function(e,f){var g=arguments.length&&(d||typeof e!="boolean"),h=d||(e===!0||f===!0?"margin":"border");return p.access(this,function(c,d,e){var f;return p.isWindow(c)?c.document.documentElement["client"+a]:c.nodeType===9?(f=c.documentElement,Math.max(c.body["scroll"+a],f["scroll"+a],c.body["offset"+a],f["offset"+a],f["client"+a])):e===b?p.css(c,d,e,h):p.style(c,d,e,h)},c,g?e:b,g)}})}),a.jQuery=a.$=p,typeof define=="function"&&define.amd&&define.amd.jQuery&&define("jquery",[],function(){return p})})(window);
\ No newline at end of file
diff --git a/templates/docs/prettify.css b/templates/docs/prettify.css
deleted file mode 100644
index 06012f0..0000000
--- a/templates/docs/prettify.css
+++ /dev/null
@@ -1,25 +0,0 @@
-.pln{color:#000}
-@media screen{
-  .str{color:#060}
-  .kwd{color:#036}
-  .com{color:#999}
-  .typ{color:#639}
-  .lit{color:#066}
-  .pun,.opn,.clo{color:#660}
-  .tag{color:#036}
-  .atn{color:#639}
-  .atv{color:#060}
-  .dec,.var{color:#606}
-  .fun{color:red}
-}
-@media print,projection{
-  .str{color:#060}
-  .kwd{color:#006}
-  .com{color:#999;font-style:italic}
-  .typ{color:#404}
-  .lit{color:#044}
-  .pun,.opn,.clo{color:#440}
-  .tag{color:#006}
-  .atn{color:#404}
-  .atv{color:#060}
-}
\ No newline at end of file
diff --git a/templates/docs/prettify.js b/templates/docs/prettify.js
deleted file mode 100644
index eef5ad7..0000000
--- a/templates/docs/prettify.js
+++ /dev/null
@@ -1,28 +0,0 @@
-var q=null;window.PR_SHOULD_USE_CONTINUATION=!0;
-(function(){function L(a){function m(a){var f=a.charCodeAt(0);if(f!==92)return f;var b=a.charAt(1);return(f=r[b])?f:"0"<=b&&b<="7"?parseInt(a.substring(1),8):b==="u"||b==="x"?parseInt(a.substring(2),16):a.charCodeAt(1)}function e(a){if(a<32)return(a<16?"\\x0":"\\x")+a.toString(16);a=String.fromCharCode(a);if(a==="\\"||a==="-"||a==="["||a==="]")a="\\"+a;return a}function h(a){for(var f=a.substring(1,a.length-1).match(/\\u[\dA-Fa-f]{4}|\\x[\dA-Fa-f]{2}|\\[0-3][0-7]{0,2}|\\[0-7]{1,2}|\\[\S\s]|[^\\]/g),a=
-[],b=[],o=f[0]==="^",c=o?1:0,i=f.length;c<i;++c){var j=f[c];if(/\\[bdsw]/i.test(j))a.push(j);else{var j=m(j),d;c+2<i&&"-"===f[c+1]?(d=m(f[c+2]),c+=2):d=j;b.push([j,d]);d<65||j>122||(d<65||j>90||b.push([Math.max(65,j)|32,Math.min(d,90)|32]),d<97||j>122||b.push([Math.max(97,j)&-33,Math.min(d,122)&-33]))}}b.sort(function(a,f){return a[0]-f[0]||f[1]-a[1]});f=[];j=[NaN,NaN];for(c=0;c<b.length;++c)i=b[c],i[0]<=j[1]+1?j[1]=Math.max(j[1],i[1]):f.push(j=i);b=["["];o&&b.push("^");b.push.apply(b,a);for(c=0;c<
-f.length;++c)i=f[c],b.push(e(i[0])),i[1]>i[0]&&(i[1]+1>i[0]&&b.push("-"),b.push(e(i[1])));b.push("]");return b.join("")}function y(a){for(var f=a.source.match(/\[(?:[^\\\]]|\\[\S\s])*]|\\u[\dA-Fa-f]{4}|\\x[\dA-Fa-f]{2}|\\\d+|\\[^\dux]|\(\?[!:=]|[()^]|[^()[\\^]+/g),b=f.length,d=[],c=0,i=0;c<b;++c){var j=f[c];j==="("?++i:"\\"===j.charAt(0)&&(j=+j.substring(1))&&j<=i&&(d[j]=-1)}for(c=1;c<d.length;++c)-1===d[c]&&(d[c]=++t);for(i=c=0;c<b;++c)j=f[c],j==="("?(++i,d[i]===void 0&&(f[c]="(?:")):"\\"===j.charAt(0)&&
-(j=+j.substring(1))&&j<=i&&(f[c]="\\"+d[i]);for(i=c=0;c<b;++c)"^"===f[c]&&"^"!==f[c+1]&&(f[c]="");if(a.ignoreCase&&s)for(c=0;c<b;++c)j=f[c],a=j.charAt(0),j.length>=2&&a==="["?f[c]=h(j):a!=="\\"&&(f[c]=j.replace(/[A-Za-z]/g,function(a){a=a.charCodeAt(0);return"["+String.fromCharCode(a&-33,a|32)+"]"}));return f.join("")}for(var t=0,s=!1,l=!1,p=0,d=a.length;p<d;++p){var g=a[p];if(g.ignoreCase)l=!0;else if(/[a-z]/i.test(g.source.replace(/\\u[\da-f]{4}|\\x[\da-f]{2}|\\[^UXux]/gi,""))){s=!0;l=!1;break}}for(var r=
-{b:8,t:9,n:10,v:11,f:12,r:13},n=[],p=0,d=a.length;p<d;++p){g=a[p];if(g.global||g.multiline)throw Error(""+g);n.push("(?:"+y(g)+")")}return RegExp(n.join("|"),l?"gi":"g")}function M(a){function m(a){switch(a.nodeType){case 1:if(e.test(a.className))break;for(var g=a.firstChild;g;g=g.nextSibling)m(g);g=a.nodeName;if("BR"===g||"LI"===g)h[s]="\n",t[s<<1]=y++,t[s++<<1|1]=a;break;case 3:case 4:g=a.nodeValue,g.length&&(g=p?g.replace(/\r\n?/g,"\n"):g.replace(/[\t\n\r ]+/g," "),h[s]=g,t[s<<1]=y,y+=g.length,
-t[s++<<1|1]=a)}}var e=/(?:^|\s)nocode(?:\s|$)/,h=[],y=0,t=[],s=0,l;a.currentStyle?l=a.currentStyle.whiteSpace:window.getComputedStyle&&(l=document.defaultView.getComputedStyle(a,q).getPropertyValue("white-space"));var p=l&&"pre"===l.substring(0,3);m(a);return{a:h.join("").replace(/\n$/,""),c:t}}function B(a,m,e,h){m&&(a={a:m,d:a},e(a),h.push.apply(h,a.e))}function x(a,m){function e(a){for(var l=a.d,p=[l,"pln"],d=0,g=a.a.match(y)||[],r={},n=0,z=g.length;n<z;++n){var f=g[n],b=r[f],o=void 0,c;if(typeof b===
-"string")c=!1;else{var i=h[f.charAt(0)];if(i)o=f.match(i[1]),b=i[0];else{for(c=0;c<t;++c)if(i=m[c],o=f.match(i[1])){b=i[0];break}o||(b="pln")}if((c=b.length>=5&&"lang-"===b.substring(0,5))&&!(o&&typeof o[1]==="string"))c=!1,b="src";c||(r[f]=b)}i=d;d+=f.length;if(c){c=o[1];var j=f.indexOf(c),k=j+c.length;o[2]&&(k=f.length-o[2].length,j=k-c.length);b=b.substring(5);B(l+i,f.substring(0,j),e,p);B(l+i+j,c,C(b,c),p);B(l+i+k,f.substring(k),e,p)}else p.push(l+i,b)}a.e=p}var h={},y;(function(){for(var e=a.concat(m),
-l=[],p={},d=0,g=e.length;d<g;++d){var r=e[d],n=r[3];if(n)for(var k=n.length;--k>=0;)h[n.charAt(k)]=r;r=r[1];n=""+r;p.hasOwnProperty(n)||(l.push(r),p[n]=q)}l.push(/[\S\s]/);y=L(l)})();var t=m.length;return e}function u(a){var m=[],e=[];a.tripleQuotedStrings?m.push(["str",/^(?:'''(?:[^'\\]|\\[\S\s]|''?(?=[^']))*(?:'''|$)|"""(?:[^"\\]|\\[\S\s]|""?(?=[^"]))*(?:"""|$)|'(?:[^'\\]|\\[\S\s])*(?:'|$)|"(?:[^"\\]|\\[\S\s])*(?:"|$))/,q,"'\""]):a.multiLineStrings?m.push(["str",/^(?:'(?:[^'\\]|\\[\S\s])*(?:'|$)|"(?:[^"\\]|\\[\S\s])*(?:"|$)|`(?:[^\\`]|\\[\S\s])*(?:`|$))/,
-q,"'\"`"]):m.push(["str",/^(?:'(?:[^\n\r'\\]|\\.)*(?:'|$)|"(?:[^\n\r"\\]|\\.)*(?:"|$))/,q,"\"'"]);a.verbatimStrings&&e.push(["str",/^@"(?:[^"]|"")*(?:"|$)/,q]);var h=a.hashComments;h&&(a.cStyleComments?(h>1?m.push(["com",/^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/,q,"#"]):m.push(["com",/^#(?:(?:define|elif|else|endif|error|ifdef|include|ifndef|line|pragma|undef|warning)\b|[^\n\r]*)/,q,"#"]),e.push(["str",/^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h|[a-z]\w*)>/,q])):m.push(["com",/^#[^\n\r]*/,
-q,"#"]));a.cStyleComments&&(e.push(["com",/^\/\/[^\n\r]*/,q]),e.push(["com",/^\/\*[\S\s]*?(?:\*\/|$)/,q]));a.regexLiterals&&e.push(["lang-regex",/^(?:^^\.?|[!+-]|!=|!==|#|%|%=|&|&&|&&=|&=|\(|\*|\*=|\+=|,|-=|->|\/|\/=|:|::|;|<|<<|<<=|<=|=|==|===|>|>=|>>|>>=|>>>|>>>=|[?@[^]|\^=|\^\^|\^\^=|{|\||\|=|\|\||\|\|=|~|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\s*(\/(?=[^*/])(?:[^/[\\]|\\[\S\s]|\[(?:[^\\\]]|\\[\S\s])*(?:]|$))+\/)/]);(h=a.types)&&e.push(["typ",h]);a=(""+a.keywords).replace(/^ | $/g,
-"");a.length&&e.push(["kwd",RegExp("^(?:"+a.replace(/[\s,]+/g,"|")+")\\b"),q]);m.push(["pln",/^\s+/,q," \r\n\t\xa0"]);e.push(["lit",/^@[$_a-z][\w$@]*/i,q],["typ",/^(?:[@_]?[A-Z]+[a-z][\w$@]*|\w+_t\b)/,q],["pln",/^[$_a-z][\w$@]*/i,q],["lit",/^(?:0x[\da-f]+|(?:\d(?:_\d+)*\d*(?:\.\d*)?|\.\d\+)(?:e[+-]?\d+)?)[a-z]*/i,q,"0123456789"],["pln",/^\\[\S\s]?/,q],["pun",/^.[^\s\w"-$'./@\\`]*/,q]);return x(m,e)}function D(a,m){function e(a){switch(a.nodeType){case 1:if(k.test(a.className))break;if("BR"===a.nodeName)h(a),
-a.parentNode&&a.parentNode.removeChild(a);else for(a=a.firstChild;a;a=a.nextSibling)e(a);break;case 3:case 4:if(p){var b=a.nodeValue,d=b.match(t);if(d){var c=b.substring(0,d.index);a.nodeValue=c;(b=b.substring(d.index+d[0].length))&&a.parentNode.insertBefore(s.createTextNode(b),a.nextSibling);h(a);c||a.parentNode.removeChild(a)}}}}function h(a){function b(a,d){var e=d?a.cloneNode(!1):a,f=a.parentNode;if(f){var f=b(f,1),g=a.nextSibling;f.appendChild(e);for(var h=g;h;h=g)g=h.nextSibling,f.appendChild(h)}return e}
-for(;!a.nextSibling;)if(a=a.parentNode,!a)return;for(var a=b(a.nextSibling,0),e;(e=a.parentNode)&&e.nodeType===1;)a=e;d.push(a)}var k=/(?:^|\s)nocode(?:\s|$)/,t=/\r\n?|\n/,s=a.ownerDocument,l;a.currentStyle?l=a.currentStyle.whiteSpace:window.getComputedStyle&&(l=s.defaultView.getComputedStyle(a,q).getPropertyValue("white-space"));var p=l&&"pre"===l.substring(0,3);for(l=s.createElement("LI");a.firstChild;)l.appendChild(a.firstChild);for(var d=[l],g=0;g<d.length;++g)e(d[g]);m===(m|0)&&d[0].setAttribute("value",
-m);var r=s.createElement("OL");r.className="linenums";for(var n=Math.max(0,m-1|0)||0,g=0,z=d.length;g<z;++g)l=d[g],l.className="L"+(g+n)%10,l.firstChild||l.appendChild(s.createTextNode("\xa0")),r.appendChild(l);a.appendChild(r)}function k(a,m){for(var e=m.length;--e>=0;){var h=m[e];A.hasOwnProperty(h)?window.console&&console.warn("cannot override language handler %s",h):A[h]=a}}function C(a,m){if(!a||!A.hasOwnProperty(a))a=/^\s*</.test(m)?"default-markup":"default-code";return A[a]}function E(a){var m=
-a.g;try{var e=M(a.h),h=e.a;a.a=h;a.c=e.c;a.d=0;C(m,h)(a);var k=/\bMSIE\b/.test(navigator.userAgent),m=/\n/g,t=a.a,s=t.length,e=0,l=a.c,p=l.length,h=0,d=a.e,g=d.length,a=0;d[g]=s;var r,n;for(n=r=0;n<g;)d[n]!==d[n+2]?(d[r++]=d[n++],d[r++]=d[n++]):n+=2;g=r;for(n=r=0;n<g;){for(var z=d[n],f=d[n+1],b=n+2;b+2<=g&&d[b+1]===f;)b+=2;d[r++]=z;d[r++]=f;n=b}for(d.length=r;h<p;){var o=l[h+2]||s,c=d[a+2]||s,b=Math.min(o,c),i=l[h+1],j;if(i.nodeType!==1&&(j=t.substring(e,b))){k&&(j=j.replace(m,"\r"));i.nodeValue=
-j;var u=i.ownerDocument,v=u.createElement("SPAN");v.className=d[a+1];var x=i.parentNode;x.replaceChild(v,i);v.appendChild(i);e<o&&(l[h+1]=i=u.createTextNode(t.substring(b,o)),x.insertBefore(i,v.nextSibling))}e=b;e>=o&&(h+=2);e>=c&&(a+=2)}}catch(w){"console"in window&&console.log(w&&w.stack?w.stack:w)}}var v=["break,continue,do,else,for,if,return,while"],w=[[v,"auto,case,char,const,default,double,enum,extern,float,goto,int,long,register,short,signed,sizeof,static,struct,switch,typedef,union,unsigned,void,volatile"],
-"catch,class,delete,false,import,new,operator,private,protected,public,this,throw,true,try,typeof"],F=[w,"alignof,align_union,asm,axiom,bool,concept,concept_map,const_cast,constexpr,decltype,dynamic_cast,explicit,export,friend,inline,late_check,mutable,namespace,nullptr,reinterpret_cast,static_assert,static_cast,template,typeid,typename,using,virtual,where"],G=[w,"abstract,boolean,byte,extends,final,finally,implements,import,instanceof,null,native,package,strictfp,super,synchronized,throws,transient"],
-H=[G,"as,base,by,checked,decimal,delegate,descending,dynamic,event,fixed,foreach,from,group,implicit,in,interface,internal,into,is,lock,object,out,override,orderby,params,partial,readonly,ref,sbyte,sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,var"],w=[w,"debugger,eval,export,function,get,null,set,undefined,var,with,Infinity,NaN"],I=[v,"and,as,assert,class,def,del,elif,except,exec,finally,from,global,import,in,is,lambda,nonlocal,not,or,pass,print,raise,try,with,yield,False,True,None"],
-J=[v,"alias,and,begin,case,class,def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,rescue,retry,self,super,then,true,undef,unless,until,when,yield,BEGIN,END"],v=[v,"case,done,elif,esac,eval,fi,function,in,local,set,then,until"],K=/^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map)|bitset|u?(int|float)\d*)/,N=/\S/,O=u({keywords:[F,H,w,"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END"+
-I,J,v],hashComments:!0,cStyleComments:!0,multiLineStrings:!0,regexLiterals:!0}),A={};k(O,["default-code"]);k(x([],[["pln",/^[^<?]+/],["dec",/^<!\w[^>]*(?:>|$)/],["com",/^<\!--[\S\s]*?(?:--\>|$)/],["lang-",/^<\?([\S\s]+?)(?:\?>|$)/],["lang-",/^<%([\S\s]+?)(?:%>|$)/],["pun",/^(?:<[%?]|[%?]>)/],["lang-",/^<xmp\b[^>]*>([\S\s]+?)<\/xmp\b[^>]*>/i],["lang-js",/^<script\b[^>]*>([\S\s]*?)(<\/script\b[^>]*>)/i],["lang-css",/^<style\b[^>]*>([\S\s]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i]]),
-["default-markup","htm","html","mxml","xhtml","xml","xsl"]);k(x([["pln",/^\s+/,q," \t\r\n"],["atv",/^(?:"[^"]*"?|'[^']*'?)/,q,"\"'"]],[["tag",/^^<\/?[a-z](?:[\w-.:]*\w)?|\/?>$/i],["atn",/^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i],["lang-uq.val",/^=\s*([^\s"'>]*(?:[^\s"'/>]|\/(?=\s)))/],["pun",/^[/<->]+/],["lang-js",/^on\w+\s*=\s*"([^"]+)"/i],["lang-js",/^on\w+\s*=\s*'([^']+)'/i],["lang-js",/^on\w+\s*=\s*([^\s"'>]+)/i],["lang-css",/^style\s*=\s*"([^"]+)"/i],["lang-css",/^style\s*=\s*'([^']+)'/i],["lang-css",
-/^style\s*=\s*([^\s"'>]+)/i]]),["in.tag"]);k(x([],[["atv",/^[\S\s]+/]]),["uq.val"]);k(u({keywords:F,hashComments:!0,cStyleComments:!0,types:K}),["c","cc","cpp","cxx","cyc","m"]);k(u({keywords:"null,true,false"}),["json"]);k(u({keywords:H,hashComments:!0,cStyleComments:!0,verbatimStrings:!0,types:K}),["cs"]);k(u({keywords:G,cStyleComments:!0}),["java"]);k(u({keywords:v,hashComments:!0,multiLineStrings:!0}),["bsh","csh","sh"]);k(u({keywords:I,hashComments:!0,multiLineStrings:!0,tripleQuotedStrings:!0}),
-["cv","py"]);k(u({keywords:"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END",hashComments:!0,multiLineStrings:!0,regexLiterals:!0}),["perl","pl","pm"]);k(u({keywords:J,hashComments:!0,multiLineStrings:!0,regexLiterals:!0}),["rb"]);k(u({keywords:w,cStyleComments:!0,regexLiterals:!0}),["js"]);k(u({keywords:"all,and,by,catch,class,else,extends,false,finally,for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,true,try,unless,until,when,while,yes",
-hashComments:3,cStyleComments:!0,multilineStrings:!0,tripleQuotedStrings:!0,regexLiterals:!0}),["coffee"]);k(x([],[["str",/^[\S\s]+/]]),["regex"]);window.prettyPrintOne=function(a,m,e){var h=document.createElement("PRE");h.innerHTML=a;e&&D(h,e);E({g:m,i:e,h:h});return h.innerHTML};window.prettyPrint=function(a){function m(){for(var e=window.PR_SHOULD_USE_CONTINUATION?l.now()+250:Infinity;p<h.length&&l.now()<e;p++){var n=h[p],k=n.className;if(k.indexOf("prettyprint")>=0){var k=k.match(g),f,b;if(b=
-!k){b=n;for(var o=void 0,c=b.firstChild;c;c=c.nextSibling)var i=c.nodeType,o=i===1?o?b:c:i===3?N.test(c.nodeValue)?b:o:o;b=(f=o===b?void 0:o)&&"CODE"===f.tagName}b&&(k=f.className.match(g));k&&(k=k[1]);b=!1;for(o=n.parentNode;o;o=o.parentNode)if((o.tagName==="pre"||o.tagName==="code"||o.tagName==="xmp")&&o.className&&o.className.indexOf("prettyprint")>=0){b=!0;break}b||((b=(b=n.className.match(/\blinenums\b(?::(\d+))?/))?b[1]&&b[1].length?+b[1]:!0:!1)&&D(n,b),d={g:k,h:n,i:b},E(d))}}p<h.length?setTimeout(m,
-250):a&&a()}for(var e=[document.getElementsByTagName("pre"),document.getElementsByTagName("code"),document.getElementsByTagName("xmp")],h=[],k=0;k<e.length;++k)for(var t=0,s=e[k].length;t<s;++t)h.push(e[k][t]);var e=q,l=Date;l.now||(l={now:function(){return+new Date}});var p=0,d,g=/\blang(?:uage)?-([\w.]+)(?!\S)/;m()};window.PR={createSimpleLexer:x,registerLangHandler:k,sourceDecorator:u,PR_ATTRIB_NAME:"atn",PR_ATTRIB_VALUE:"atv",PR_COMMENT:"com",PR_DECLARATION:"dec",PR_KEYWORD:"kwd",PR_LITERAL:"lit",
-PR_NOCODE:"nocode",PR_PLAIN:"pln",PR_PUNCTUATION:"pun",PR_SOURCE:"src",PR_STRING:"str",PR_TAG:"tag",PR_TYPE:"typ"}})();
diff --git a/templates/ic_launcher_hdpi.png b/templates/ic_launcher_hdpi.png
deleted file mode 100644
index 96a442e..0000000
--- a/templates/ic_launcher_hdpi.png
+++ /dev/null
Binary files differ
diff --git a/templates/ic_launcher_ldpi.png b/templates/ic_launcher_ldpi.png
deleted file mode 100644
index 9923872..0000000
--- a/templates/ic_launcher_ldpi.png
+++ /dev/null
Binary files differ
diff --git a/templates/ic_launcher_mdpi.png b/templates/ic_launcher_mdpi.png
deleted file mode 100644
index 359047d..0000000
--- a/templates/ic_launcher_mdpi.png
+++ /dev/null
Binary files differ
diff --git a/templates/ic_launcher_xhdpi.png b/templates/ic_launcher_xhdpi.png
deleted file mode 100644
index 71c6d76..0000000
--- a/templates/ic_launcher_xhdpi.png
+++ /dev/null
Binary files differ
diff --git a/templates/ic_launcher_xxhdpi.png b/templates/ic_launcher_xxhdpi.png
deleted file mode 100644
index 549135a..0000000
--- a/templates/ic_launcher_xxhdpi.png
+++ /dev/null
Binary files differ
diff --git a/templates/uibuild.template b/templates/uibuild.template
deleted file mode 100644
index 3170da6..0000000
--- a/templates/uibuild.template
+++ /dev/null
@@ -1,92 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project name="PROJECT_NAME" default="help">
-
-    <!-- The local.properties file is created and updated by the 'android' tool.
-         It contains the path to the SDK. It should *NOT* be checked into
-         Version Control Systems. -->
-    <property file="local.properties" />
-
-    <!-- The ant.properties file can be created by you. It is only edited by the
-         'android' tool to add properties to it.
-         This is the place to change some Ant specific build properties.
-         Here are some properties you may want to change/update:
-
-         source.dir
-             The name of the source directory. Default is 'src'.
-         out.dir
-             The name of the output directory. Default is 'bin'.
-
-         For other overridable properties, look at the beginning of the rules
-         files in the SDK, at tools/ant/build.xml
-
-         Properties related to the SDK location or the project target should
-         be updated using the 'android' tool with the 'update' action.
-
-         This file is an integral part of the build system for your
-         application and should be checked into Version Control Systems.
-
-         -->
-    <property file="ant.properties" />
-
-    <!-- if sdk.dir was not set from one of the property file, then
-         get it from the ANDROID_HOME env var.
-         This must be done before we load project.properties since
-         the proguard config can use sdk.dir -->
-    <property environment="env" />
-    <condition property="sdk.dir" value="${env.ANDROID_HOME}">
-        <isset property="env.ANDROID_HOME" />
-    </condition>
-
-    <!-- The project.properties file is created and updated by the 'android'
-         tool, as well as ADT.
-
-         This contains project specific properties such as project target, and library
-         dependencies. Lower level build properties are stored in ant.properties
-         (or in .classpath for Eclipse projects).
-
-         This file is an integral part of the build system for your
-         application and should be checked into Version Control Systems. -->
-    <loadproperties srcFile="project.properties" />
-
-    <!-- quick check on sdk.dir -->
-    <fail
-            message="sdk.dir is missing. Make sure to generate local.properties using 'android update project' or to inject it through the ANDROID_HOME environment variable."
-            unless="sdk.dir"
-    />
-
-    <!--
-        Import per project custom build rules if present at the root of the project.
-        This is the place to put custom intermediary targets such as:
-            -pre-build
-            -pre-compile
-            -post-compile (This is typically used for code obfuscation.
-                           Compiled code location: ${out.classes.absolute.dir}
-                           If this is not done in place, override ${out.dex.input.absolute.dir})
-            -post-package
-            -post-build
-            -pre-clean
-    -->
-    <import file="custom_rules.xml" optional="true" />
-
-    <!-- Import the actual build file.
-
-         To customize existing targets, there are two options:
-         - Customize only one target:
-             - copy/paste the target into this file, *before* the
-               <import> task.
-             - customize it to your needs.
-         - Customize the whole content of build.xml
-             - copy/paste the content of the rules files (minus the top node)
-               into this file, replacing the <import> task.
-             - customize to your needs.
-
-         ***********************
-         ****** IMPORTANT ******
-         ***********************
-         In all cases you must update the value of version-tag below to read 'custom' instead of an integer,
-         in order to avoid having your file be overridden by tools such as "android update project"
-    -->
-    <!-- version-tag: VERSION_TAG -->
-    <import file="${sdk.dir}/tools/ant/uibuild.xml" />
-
-</project>
diff --git a/testapps/.gitignore b/testapps/.gitignore
deleted file mode 100644
index 3d82821..0000000
--- a/testapps/.gitignore
+++ /dev/null
@@ -1,5 +0,0 @@
-bin
-coverage
-local.properties
-gen
-proguard
diff --git a/testapps/README.txt b/testapps/README.txt
deleted file mode 100644
index e76bc4d..0000000
--- a/testapps/README.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-This repository contains test applications used by the SDK automated tests.
-
-These are not meant to be packaged with the SDK.
-
-Each project represents a different test case. For more information, read
-the readme file located in the project directory.
\ No newline at end of file
diff --git a/testapps/aidlTest/libWithAidl/.classpath b/testapps/aidlTest/libWithAidl/.classpath
deleted file mode 100644
index a4763d1..0000000
--- a/testapps/aidlTest/libWithAidl/.classpath
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="src" path="gen"/>
-	<classpathentry kind="con" path="com.android.ide.eclipse.adt.ANDROID_FRAMEWORK"/>
-	<classpathentry kind="con" path="com.android.ide.eclipse.adt.LIBRARIES"/>
-	<classpathentry kind="output" path="bin/classes"/>
-</classpath>
diff --git a/testapps/aidlTest/libWithAidl/.project b/testapps/aidlTest/libWithAidl/.project
deleted file mode 100644
index 49d565f..0000000
--- a/testapps/aidlTest/libWithAidl/.project
+++ /dev/null
@@ -1,33 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>aidlTest-libWithAidl</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>com.android.ide.eclipse.adt.ResourceManagerBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>com.android.ide.eclipse.adt.PreCompilerBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>com.android.ide.eclipse.adt.ApkBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>com.android.ide.eclipse.adt.AndroidNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/testapps/aidlTest/libWithAidl/AndroidManifest.xml b/testapps/aidlTest/libWithAidl/AndroidManifest.xml
deleted file mode 100644
index d1d75dd..0000000
--- a/testapps/aidlTest/libWithAidl/AndroidManifest.xml
+++ /dev/null
@@ -1,18 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
-    package="com.android.tests.aidl.lib"
-    android:versionCode="1"
-    android:versionName="1.0" >
-
-    <permission
-        android:name="com.foo.mypermission"
-        android:description="@string/app_name"
-        android:label="@string/app_name" >
-    </permission>
-    <permission
-        android:name="com.foo.mypermission2"
-        android:description="@string/app_name"
-        android:label="@string/app_name" >
-    </permission>
-
-</manifest>
\ No newline at end of file
diff --git a/testapps/aidlTest/libWithAidl/ant.properties b/testapps/aidlTest/libWithAidl/ant.properties
deleted file mode 100644
index ee52d86..0000000
--- a/testapps/aidlTest/libWithAidl/ant.properties
+++ /dev/null
@@ -1,17 +0,0 @@
-# This file is used to override default values used by the Ant build system.
-#
-# This file must be checked in Version Control Systems, as it is
-# integral to the build system of your project.
-
-# This file is only used by the Ant script.
-
-# You can use this to override default values such as
-#  'source.dir' for the location of your java source folder and
-#  'out.dir' for the location of your output folder.
-
-# You can also use it define how the release builds are signed by declaring
-# the following properties:
-#  'key.store' for the location of your keystore and
-#  'key.alias' for the name of the key to use.
-# The password will be asked during the build when you use the 'release' target.
-
diff --git a/testapps/aidlTest/libWithAidl/build.xml b/testapps/aidlTest/libWithAidl/build.xml
deleted file mode 100644
index 07c2a49..0000000
--- a/testapps/aidlTest/libWithAidl/build.xml
+++ /dev/null
@@ -1,90 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project name="libWithAidl" default="help">
-
-    <!-- The local.properties file is created and updated by the 'android' tool.
-         It contains the path to the SDK. It should *NOT* be checked into
-         Version Control Systems. -->
-    <property file="local.properties" />
-
-    <!-- The ant.properties file can be created by you. It is only edited by the
-         'android' tool to add properties to it.
-         This is the place to change some Ant specific build properties.
-         Here are some properties you may want to change/update:
-
-         source.dir
-             The name of the source directory. Default is 'src'.
-         out.dir
-             The name of the output directory. Default is 'bin'.
-
-         For other overridable properties, look at the beginning of the rules
-         files in the SDK, at tools/ant/build.xml
-
-         Properties related to the SDK location or the project target should
-         be updated using the 'android' tool with the 'update' action.
-
-         This file is an integral part of the build system for your
-         application and should be checked into Version Control Systems.
-
-         -->
-    <property file="ant.properties" />
-
-    <!-- The project.properties file is created and updated by the 'android'
-         tool, as well as ADT.
-
-         This contains project specific properties such as project target, and library
-         dependencies. Lower level build properties are stored in ant.properties
-         (or in .classpath for Eclipse projects).
-
-         This file is an integral part of the build system for your
-         application and should be checked into Version Control Systems. -->
-    <loadproperties srcFile="project.properties" />
-
-    <!-- if sdk.dir was not set from one of the property file, then
-         get it from the ANDROID_HOME env var. -->
-    <property environment="env" />
-    <condition property="sdk.dir" value="${env.ANDROID_HOME}">
-        <isset property="env.ANDROID_HOME" />
-    </condition>
-
-    <!-- quick check on sdk.dir -->
-    <fail
-            message="sdk.dir is missing. Make sure to generate local.properties using 'android update project' or to inject it through the ANDROID_HOME environment variable."
-            unless="sdk.dir"
-    />
-
-    <!--
-        Import per project custom build rules if present at the root of the project.
-        This is the place to put custom intermediary targets such as:
-            -pre-build
-            -pre-compile
-            -post-compile (This is typically used for code obfuscation.
-                           Compiled code location: ${out.classes.absolute.dir}
-                           If this is not done in place, override ${out.dex.input.absolute.dir})
-            -post-package
-            -post-build
-            -pre-clean
-    -->
-    <import file="custom_rules.xml" optional="true" />
-
-    <!-- Import the actual build file.
-
-         To customize existing targets, there are two options:
-         - Customize only one target:
-             - copy/paste the target into this file, *before* the
-               <import> task.
-             - customize it to your needs.
-         - Customize the whole content of build.xml
-             - copy/paste the content of the rules files (minus the top node)
-               into this file, replacing the <import> task.
-             - customize to your needs.
-
-         ***********************
-         ****** IMPORTANT ******
-         ***********************
-         In all cases you must update the value of version-tag below to read 'custom' instead of an integer,
-         in order to avoid having your file be overridden by tools such as "android update project"
-    -->
-    <!-- version-tag: 1 -->
-    <import file="${sdk.dir}/tools/ant/build.xml" />
-
-</project>
diff --git a/testapps/aidlTest/libWithAidl/proguard-project.txt b/testapps/aidlTest/libWithAidl/proguard-project.txt
deleted file mode 100644
index f2fe155..0000000
--- a/testapps/aidlTest/libWithAidl/proguard-project.txt
+++ /dev/null
@@ -1,20 +0,0 @@
-# To enable ProGuard in your project, edit project.properties
-# to define the proguard.config property as described in that file.
-#
-# Add project specific ProGuard rules here.
-# By default, the flags in this file are appended to flags specified
-# in ${sdk.dir}/tools/proguard/proguard-android.txt
-# You can edit the include path and order by changing the ProGuard
-# include property in project.properties.
-#
-# For more details, see
-#   http://developer.android.com/guide/developing/tools/proguard.html
-
-# Add any project specific keep options here:
-
-# If your project uses WebView with JS, uncomment the following
-# and specify the fully qualified class name to the JavaScript interface
-# class:
-#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
-#   public *;
-#}
diff --git a/testapps/aidlTest/libWithAidl/project.properties b/testapps/aidlTest/libWithAidl/project.properties
deleted file mode 100644
index 23d80c4..0000000
--- a/testapps/aidlTest/libWithAidl/project.properties
+++ /dev/null
@@ -1,13 +0,0 @@
-# This file is automatically generated by Android Tools.
-# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
-#
-# This file must be checked in Version Control Systems.
-#
-# To customize properties used by the Ant build system use,
-# "ant.properties", and override values to adapt the script to your
-# project structure.
-
-# Project target.
-target=android-15
-android.library=true
-
diff --git a/testapps/aidlTest/libWithAidl/res/layout/main.xml b/testapps/aidlTest/libWithAidl/res/layout/main.xml
deleted file mode 100644
index d11d11a..0000000
--- a/testapps/aidlTest/libWithAidl/res/layout/main.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-     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.
--->
-
-<!-- Demonstrates defining custom views in a layout file. -->
-
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:app="http://schemas.android.com/apk/res-auto"
-    android:layout_width="match_parent"
-    android:layout_height="wrap_content"
-    android:orientation="vertical" >
-</LinearLayout>
\ No newline at end of file
diff --git a/testapps/aidlTest/libWithAidl/res/values/strings.xml b/testapps/aidlTest/libWithAidl/res/values/strings.xml
deleted file mode 100644
index 3fa203a..0000000
--- a/testapps/aidlTest/libWithAidl/res/values/strings.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<resources>
-    <string name="app_name">MyActivity</string>
-</resources>
diff --git a/testapps/aidlTest/libWithAidl/src/com/android/tests/aidl/lib/MyParcelable.aidl b/testapps/aidlTest/libWithAidl/src/com/android/tests/aidl/lib/MyParcelable.aidl
deleted file mode 100644
index b47faec..0000000
--- a/testapps/aidlTest/libWithAidl/src/com/android/tests/aidl/lib/MyParcelable.aidl
+++ /dev/null
@@ -1,3 +0,0 @@
-package com.android.tests.aidl.lib;
-
-parcelable MyParcelable;
\ No newline at end of file
diff --git a/testapps/aidlTest/libWithAidl/src/com/android/tests/aidl/lib/MyParcelable.java b/testapps/aidlTest/libWithAidl/src/com/android/tests/aidl/lib/MyParcelable.java
deleted file mode 100644
index ef9efdd..0000000
--- a/testapps/aidlTest/libWithAidl/src/com/android/tests/aidl/lib/MyParcelable.java
+++ /dev/null
@@ -1,46 +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.tests.aidl.lib;
-
-import android.os.Parcel;
-import android.os.Parcelable;
-
-public class MyParcelable implements Parcelable {
-    private int mData;
-
-    public int describeContents() {
-        return 0;
-    }
-
-    public void writeToParcel(Parcel out, int flags) {
-        out.writeInt(mData);
-    }
-
-    public static final Parcelable.Creator<MyParcelable> CREATOR = new Parcelable.Creator<MyParcelable>() {
-        public MyParcelable createFromParcel(Parcel in) {
-            return new MyParcelable(in);
-        }
-
-        public MyParcelable[] newArray(int size) {
-            return new MyParcelable[size];
-        }
-    };
-
-    private MyParcelable(Parcel in) {
-        mData = in.readInt();
-    }
-}
diff --git a/testapps/aidlTest/mainProject/.classpath b/testapps/aidlTest/mainProject/.classpath
deleted file mode 100644
index a4763d1..0000000
--- a/testapps/aidlTest/mainProject/.classpath
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="src" path="gen"/>
-	<classpathentry kind="con" path="com.android.ide.eclipse.adt.ANDROID_FRAMEWORK"/>
-	<classpathentry kind="con" path="com.android.ide.eclipse.adt.LIBRARIES"/>
-	<classpathentry kind="output" path="bin/classes"/>
-</classpath>
diff --git a/testapps/aidlTest/mainProject/.project b/testapps/aidlTest/mainProject/.project
deleted file mode 100644
index 81769cc..0000000
--- a/testapps/aidlTest/mainProject/.project
+++ /dev/null
@@ -1,33 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>aidlTest-mainProject</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>com.android.ide.eclipse.adt.ResourceManagerBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>com.android.ide.eclipse.adt.PreCompilerBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>com.android.ide.eclipse.adt.ApkBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>com.android.ide.eclipse.adt.AndroidNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/testapps/aidlTest/mainProject/AndroidManifest.xml b/testapps/aidlTest/mainProject/AndroidManifest.xml
deleted file mode 100644
index f7315b0..0000000
--- a/testapps/aidlTest/mainProject/AndroidManifest.xml
+++ /dev/null
@@ -1,19 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
-    package="com.android.tests.aidl.main"
-    android:versionCode="1"
-    android:versionName="1.0" >
-
-    <application android:label="@string/app_name" >
-        <activity
-            android:name="com.android.tests.aidl.main.MyActivity"
-            android:label="@string/app_name" >
-            <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/testapps/aidlTest/mainProject/ant.properties b/testapps/aidlTest/mainProject/ant.properties
deleted file mode 100644
index ee52d86..0000000
--- a/testapps/aidlTest/mainProject/ant.properties
+++ /dev/null
@@ -1,17 +0,0 @@
-# This file is used to override default values used by the Ant build system.
-#
-# This file must be checked in Version Control Systems, as it is
-# integral to the build system of your project.
-
-# This file is only used by the Ant script.
-
-# You can use this to override default values such as
-#  'source.dir' for the location of your java source folder and
-#  'out.dir' for the location of your output folder.
-
-# You can also use it define how the release builds are signed by declaring
-# the following properties:
-#  'key.store' for the location of your keystore and
-#  'key.alias' for the name of the key to use.
-# The password will be asked during the build when you use the 'release' target.
-
diff --git a/testapps/aidlTest/mainProject/build.xml b/testapps/aidlTest/mainProject/build.xml
deleted file mode 100644
index 30203f0..0000000
--- a/testapps/aidlTest/mainProject/build.xml
+++ /dev/null
@@ -1,90 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project name="aidlTest-mainProject" default="help">
-
-    <!-- The local.properties file is created and updated by the 'android' tool.
-         It contains the path to the SDK. It should *NOT* be checked into
-         Version Control Systems. -->
-    <property file="local.properties" />
-
-    <!-- The ant.properties file can be created by you. It is only edited by the
-         'android' tool to add properties to it.
-         This is the place to change some Ant specific build properties.
-         Here are some properties you may want to change/update:
-
-         source.dir
-             The name of the source directory. Default is 'src'.
-         out.dir
-             The name of the output directory. Default is 'bin'.
-
-         For other overridable properties, look at the beginning of the rules
-         files in the SDK, at tools/ant/build.xml
-
-         Properties related to the SDK location or the project target should
-         be updated using the 'android' tool with the 'update' action.
-
-         This file is an integral part of the build system for your
-         application and should be checked into Version Control Systems.
-
-         -->
-    <property file="ant.properties" />
-
-    <!-- The project.properties file is created and updated by the 'android'
-         tool, as well as ADT.
-
-         This contains project specific properties such as project target, and library
-         dependencies. Lower level build properties are stored in ant.properties
-         (or in .classpath for Eclipse projects).
-
-         This file is an integral part of the build system for your
-         application and should be checked into Version Control Systems. -->
-    <loadproperties srcFile="project.properties" />
-
-    <!-- if sdk.dir was not set from one of the property file, then
-         get it from the ANDROID_HOME env var. -->
-    <property environment="env" />
-    <condition property="sdk.dir" value="${env.ANDROID_HOME}">
-        <isset property="env.ANDROID_HOME" />
-    </condition>
-
-    <!-- quick check on sdk.dir -->
-    <fail
-            message="sdk.dir is missing. Make sure to generate local.properties using 'android update project' or to inject it through the ANDROID_HOME environment variable."
-            unless="sdk.dir"
-    />
-
-    <!--
-        Import per project custom build rules if present at the root of the project.
-        This is the place to put custom intermediary targets such as:
-            -pre-build
-            -pre-compile
-            -post-compile (This is typically used for code obfuscation.
-                           Compiled code location: ${out.classes.absolute.dir}
-                           If this is not done in place, override ${out.dex.input.absolute.dir})
-            -post-package
-            -post-build
-            -pre-clean
-    -->
-    <import file="custom_rules.xml" optional="true" />
-
-    <!-- Import the actual build file.
-
-         To customize existing targets, there are two options:
-         - Customize only one target:
-             - copy/paste the target into this file, *before* the
-               <import> task.
-             - customize it to your needs.
-         - Customize the whole content of build.xml
-             - copy/paste the content of the rules files (minus the top node)
-               into this file, replacing the <import> task.
-             - customize to your needs.
-
-         ***********************
-         ****** IMPORTANT ******
-         ***********************
-         In all cases you must update the value of version-tag below to read 'custom' instead of an integer,
-         in order to avoid having your file be overridden by tools such as "android update project"
-    -->
-    <!-- version-tag: 1 -->
-    <import file="${sdk.dir}/tools/ant/build.xml" />
-
-</project>
diff --git a/testapps/aidlTest/mainProject/proguard-project.txt b/testapps/aidlTest/mainProject/proguard-project.txt
deleted file mode 100644
index f2fe155..0000000
--- a/testapps/aidlTest/mainProject/proguard-project.txt
+++ /dev/null
@@ -1,20 +0,0 @@
-# To enable ProGuard in your project, edit project.properties
-# to define the proguard.config property as described in that file.
-#
-# Add project specific ProGuard rules here.
-# By default, the flags in this file are appended to flags specified
-# in ${sdk.dir}/tools/proguard/proguard-android.txt
-# You can edit the include path and order by changing the ProGuard
-# include property in project.properties.
-#
-# For more details, see
-#   http://developer.android.com/guide/developing/tools/proguard.html
-
-# Add any project specific keep options here:
-
-# If your project uses WebView with JS, uncomment the following
-# and specify the fully qualified class name to the JavaScript interface
-# class:
-#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
-#   public *;
-#}
diff --git a/testapps/aidlTest/mainProject/project.properties b/testapps/aidlTest/mainProject/project.properties
deleted file mode 100644
index 6335320..0000000
--- a/testapps/aidlTest/mainProject/project.properties
+++ /dev/null
@@ -1,15 +0,0 @@
-# This file is automatically generated by Android Tools.
-# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
-#
-# This file must be checked in Version Control Systems.
-#
-# To customize properties used by the Ant build system use,
-# "ant.properties", and override values to adapt the script to your
-# project structure.
-
-# Project target.
-target=android-15
-android.library.reference.1=../libWithAidl
-
-# To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home):
-proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt
diff --git a/testapps/aidlTest/mainProject/res/values/strings.xml b/testapps/aidlTest/mainProject/res/values/strings.xml
deleted file mode 100644
index 7dde733..0000000
--- a/testapps/aidlTest/mainProject/res/values/strings.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<resources>
-    <string name="app_name">aidlTest</string>
-</resources>
diff --git a/testapps/aidlTest/mainProject/src/com/android/tests/aidl/main/IRemoteService.aidl b/testapps/aidlTest/mainProject/src/com/android/tests/aidl/main/IRemoteService.aidl
deleted file mode 100644
index 62126c1..0000000
--- a/testapps/aidlTest/mainProject/src/com/android/tests/aidl/main/IRemoteService.aidl
+++ /dev/null
@@ -1,24 +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.tests.aidl.main;
-
-import com.android.tests.aidl.lib.MyParcelable;
-
-interface IRemoteService {
-    MyParcelable get();
-}
-
diff --git a/testapps/aidlTest/mainProject/src/com/android/tests/aidl/main/MyActivity.java b/testapps/aidlTest/mainProject/src/com/android/tests/aidl/main/MyActivity.java
deleted file mode 100644
index 117198d..0000000
--- a/testapps/aidlTest/mainProject/src/com/android/tests/aidl/main/MyActivity.java
+++ /dev/null
@@ -1,32 +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.tests.aidl.main;
-
-import android.app.Activity;
-import android.os.Bundle;
-
-public class MyActivity extends Activity
-{
-    /** Called when the activity is first created. */
-    @Override
-    public void onCreate(Bundle savedInstanceState)
-    {
-        super.onCreate(savedInstanceState);
-        setContentView(R.layout.main);
-    }
-}
diff --git a/testapps/basicJar/.classpath b/testapps/basicJar/.classpath
deleted file mode 100644
index 11a4c98..0000000
--- a/testapps/basicJar/.classpath
+++ /dev/null
@@ -1,6 +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="output" path="bin/classes"/>
-</classpath>
diff --git a/testapps/basicJar/.project b/testapps/basicJar/.project
deleted file mode 100644
index b7bfb91..0000000
--- a/testapps/basicJar/.project
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>basicJar</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/testapps/basicJar/build.xml b/testapps/basicJar/build.xml
deleted file mode 100644
index ebe77ff..0000000
--- a/testapps/basicJar/build.xml
+++ /dev/null
@@ -1,16 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project name="basicJar" default="compile">
-    <target name="compile">
-        <mkdir dir="${basedir}/bin" />
-        <mkdir dir="${basedir}/bin/classes" />
-        <javac encoding="ascii" target="1.5" source="1.5" debug="true" extdirs=""
-                srcdir="src" destdir="${basedir}/bin/classes" />
-        <jar destfile="${basedir}/bin/${ant.project.name}.jar">
-            <fileset dir="${basedir}/bin/classes" />
-            <fileset dir="src" excludes="**/*.java"/>
-        </jar>
-    </target>
-    <target name="clean">
-        <delete dir="bin" />
-    </target>
-</project>
diff --git a/testapps/basicJar/src/com/android/tests/basicjar/BasicJar.java b/testapps/basicJar/src/com/android/tests/basicjar/BasicJar.java
deleted file mode 100644
index 1046ce7..0000000
--- a/testapps/basicJar/src/com/android/tests/basicjar/BasicJar.java
+++ /dev/null
@@ -1,33 +0,0 @@
-package com.android.tests.basicjar;
-
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-
-public class BasicJar {
-    
-    public static String getContent() {
-        InputStream input = BasicJar.class.getResourceAsStream("/com/android/tests/basicjar/basicJar.txt");
-        if (input == null) {
-            return "FAILED TO FIND basicJar.txt";
-        }
-
-        BufferedReader reader = null;
-        try {
-            reader = new BufferedReader(new InputStreamReader(input, "UTF-8"));
-
-            return reader.readLine();
-        } catch (IOException e) {
-        } finally {
-            if (reader != null) {
-                try {
-                    reader.close();
-                } catch (IOException e) {
-                }
-            }
-        }
-        
-        return "FAILED TO READ CONTENT";
-    }
-}
\ No newline at end of file
diff --git a/testapps/basicJar/src/com/android/tests/basicjar/basicJar.txt b/testapps/basicJar/src/com/android/tests/basicjar/basicJar.txt
deleted file mode 100644
index d5a8285..0000000
--- a/testapps/basicJar/src/com/android/tests/basicjar/basicJar.txt
+++ /dev/null
@@ -1 +0,0 @@
-SUCCESS from basicJar.jar
\ No newline at end of file
diff --git a/testapps/basicJar2/.classpath b/testapps/basicJar2/.classpath
deleted file mode 100644
index 11a4c98..0000000
--- a/testapps/basicJar2/.classpath
+++ /dev/null
@@ -1,6 +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="output" path="bin/classes"/>
-</classpath>
diff --git a/testapps/basicJar2/.project b/testapps/basicJar2/.project
deleted file mode 100644
index b7bfb91..0000000
--- a/testapps/basicJar2/.project
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>basicJar</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/testapps/basicJar2/build.xml b/testapps/basicJar2/build.xml
deleted file mode 100644
index a5b0657..0000000
--- a/testapps/basicJar2/build.xml
+++ /dev/null
@@ -1,16 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project name="basicJar2" default="compile">
-    <target name="compile">
-        <mkdir dir="${basedir}/bin" />
-        <mkdir dir="${basedir}/bin/classes" />
-        <javac encoding="ascii" target="1.5" source="1.5" debug="true" extdirs=""
-                srcdir="src" destdir="${basedir}/bin/classes" />
-        <jar destfile="${basedir}/bin/${ant.project.name}.jar">
-            <fileset dir="${basedir}/bin/classes" />
-            <fileset dir="src" excludes="**/*.java"/>
-        </jar>
-    </target>
-    <target name="clean">
-        <delete dir="bin" />
-    </target>
-</project>
diff --git a/testapps/basicJar2/src/com/android/tests/basicjar2/BasicJar2.java b/testapps/basicJar2/src/com/android/tests/basicjar2/BasicJar2.java
deleted file mode 100644
index 906fbc0..0000000
--- a/testapps/basicJar2/src/com/android/tests/basicjar2/BasicJar2.java
+++ /dev/null
@@ -1,33 +0,0 @@
-package com.android.tests.basicjar2;
-
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-
-public class BasicJar2 {
-    
-    public static String getContent() {
-        InputStream input = BasicJar2.class.getResourceAsStream("/com/android/tests/basicjar2/basicJar2.txt");
-        if (input == null) {
-            return "FAILED TO FIND basicJar2.txt";
-        }
-
-        BufferedReader reader = null;
-        try {
-            reader = new BufferedReader(new InputStreamReader(input, "UTF-8"));
-
-            return reader.readLine();
-        } catch (IOException e) {
-        } finally {
-            if (reader != null) {
-                try {
-                    reader.close();
-                } catch (IOException e) {
-                }
-            }
-        }
-        
-        return "FAILED TO READ CONTENT";
-    }
-}
\ No newline at end of file
diff --git a/testapps/basicJar2/src/com/android/tests/basicjar2/basicJar2.txt b/testapps/basicJar2/src/com/android/tests/basicjar2/basicJar2.txt
deleted file mode 100644
index c08eda2..0000000
--- a/testapps/basicJar2/src/com/android/tests/basicjar2/basicJar2.txt
+++ /dev/null
@@ -1 +0,0 @@
-SUCCESS from basicJar2.jar
\ No newline at end of file
diff --git a/testapps/basicJar3/.classpath b/testapps/basicJar3/.classpath
deleted file mode 100644
index 11a4c98..0000000
--- a/testapps/basicJar3/.classpath
+++ /dev/null
@@ -1,6 +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="output" path="bin/classes"/>
-</classpath>
diff --git a/testapps/basicJar3/.project b/testapps/basicJar3/.project
deleted file mode 100644
index c9181f7..0000000
--- a/testapps/basicJar3/.project
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>basicJar3</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/testapps/basicJar3/build.xml b/testapps/basicJar3/build.xml
deleted file mode 100644
index 208501f..0000000
--- a/testapps/basicJar3/build.xml
+++ /dev/null
@@ -1,16 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project name="basicJar3" default="compile">
-    <target name="compile">
-        <mkdir dir="${basedir}/bin" />
-        <mkdir dir="${basedir}/bin/classes" />
-        <javac encoding="ascii" target="1.5" source="1.5" debug="true" extdirs=""
-                srcdir="src" destdir="${basedir}/bin/classes" />
-        <jar destfile="${basedir}/bin/${ant.project.name}.jar">
-            <fileset dir="${basedir}/bin/classes" />
-            <fileset dir="src" excludes="**/*.java"/>
-        </jar>
-    </target>
-    <target name="clean">
-        <delete dir="bin" />
-    </target>
-</project>
diff --git a/testapps/basicJar3/src/com/android/tests/basicjar3/BasicJar3.java b/testapps/basicJar3/src/com/android/tests/basicjar3/BasicJar3.java
deleted file mode 100644
index 684b584..0000000
--- a/testapps/basicJar3/src/com/android/tests/basicjar3/BasicJar3.java
+++ /dev/null
@@ -1,33 +0,0 @@
-package com.android.tests.basicjar3;
-
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-
-public class BasicJar3 {
-    
-    public static String getContent() {
-        InputStream input = BasicJar3.class.getResourceAsStream("/com/android/tests/basicjar3/basicJar3.txt");
-        if (input == null) {
-            return "FAILED TO FIND basicJar3.txt";
-        }
-
-        BufferedReader reader = null;
-        try {
-            reader = new BufferedReader(new InputStreamReader(input, "UTF-8"));
-
-            return reader.readLine();
-        } catch (IOException e) {
-        } finally {
-            if (reader != null) {
-                try {
-                    reader.close();
-                } catch (IOException e) {
-                }
-            }
-        }
-        
-        return "FAILED TO READ CONTENT";
-    }
-}
\ No newline at end of file
diff --git a/testapps/basicJar3/src/com/android/tests/basicjar3/basicJar3.txt b/testapps/basicJar3/src/com/android/tests/basicjar3/basicJar3.txt
deleted file mode 100644
index a2dc230..0000000
--- a/testapps/basicJar3/src/com/android/tests/basicjar3/basicJar3.txt
+++ /dev/null
@@ -1 +0,0 @@
-SUCCESS from basicJar3.jar
\ No newline at end of file
diff --git a/testapps/basicProjectWithAidl/.classpath b/testapps/basicProjectWithAidl/.classpath
deleted file mode 100644
index 765e549..0000000
--- a/testapps/basicProjectWithAidl/.classpath
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="src" path="gen"/>
-	<classpathentry kind="con" path="com.android.ide.eclipse.adt.ANDROID_FRAMEWORK"/>
-	<classpathentry kind="con" path="com.android.ide.eclipse.adt.LIBRARIES"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/testapps/basicProjectWithAidl/.project b/testapps/basicProjectWithAidl/.project
deleted file mode 100644
index 24ed854..0000000
--- a/testapps/basicProjectWithAidl/.project
+++ /dev/null
@@ -1,33 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>basicProjectWithAidl</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>com.android.ide.eclipse.adt.ResourceManagerBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>com.android.ide.eclipse.adt.PreCompilerBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>com.android.ide.eclipse.adt.ApkBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>com.android.ide.eclipse.adt.AndroidNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/testapps/basicProjectWithAidl/AndroidManifest.xml b/testapps/basicProjectWithAidl/AndroidManifest.xml
deleted file mode 100644
index 4cf7553..0000000
--- a/testapps/basicProjectWithAidl/AndroidManifest.xml
+++ /dev/null
@@ -1,15 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
-      android:versionCode="1"
-      android:versionName="1.0" package="com.android.tests.basicprojectwithaidl">
-    <application android:label="@string/app_name" android:icon="@drawable/icon">
-        <activity android:name="com.android.tests.basicprojectwithaidlwithaidl.Main"
-                  android:label="@string/app_name">
-            <intent-filter>
-                <action android:name="android.intent.action.MAIN" />
-                <category android:name="android.intent.category.LAUNCHER" />
-            </intent-filter>
-        </activity>
-    </application>
-    <uses-sdk android:minSdkVersion="AOSP"/>
-</manifest>
diff --git a/testapps/basicProjectWithAidl/ant.properties b/testapps/basicProjectWithAidl/ant.properties
deleted file mode 100644
index b0971e8..0000000
--- a/testapps/basicProjectWithAidl/ant.properties
+++ /dev/null
@@ -1,17 +0,0 @@
-# This file is used to override default values used by the Ant build system.
-#
-# This file must be checked into Version Control Systems, as it is
-# integral to the build system of your project.
-
-# This file is only used by the Ant script.
-
-# You can use this to override default values such as
-#  'source.dir' for the location of your java source folder and
-#  'out.dir' for the location of your output folder.
-
-# You can also use it define how the release builds are signed by declaring
-# the following properties:
-#  'key.store' for the location of your keystore and
-#  'key.alias' for the name of the key to use.
-# The password will be asked during the build when you use the 'release' target.
-
diff --git a/testapps/basicProjectWithAidl/build.xml b/testapps/basicProjectWithAidl/build.xml
deleted file mode 100644
index c0aff2d..0000000
--- a/testapps/basicProjectWithAidl/build.xml
+++ /dev/null
@@ -1,92 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project name="basicProject" default="help">
-
-    <!-- The local.properties file is created and updated by the 'android' tool.
-         It contains the path to the SDK. It should *NOT* be checked into
-         Version Control Systems. -->
-    <property file="local.properties" />
-
-    <!-- The ant.properties file can be created by you. It is only edited by the
-         'android' tool to add properties to it.
-         This is the place to change some Ant specific build properties.
-         Here are some properties you may want to change/update:
-
-         source.dir
-             The name of the source directory. Default is 'src'.
-         out.dir
-             The name of the output directory. Default is 'bin'.
-
-         For other overridable properties, look at the beginning of the rules
-         files in the SDK, at tools/ant/build.xml
-
-         Properties related to the SDK location or the project target should
-         be updated using the 'android' tool with the 'update' action.
-
-         This file is an integral part of the build system for your
-         application and should be checked into Version Control Systems.
-
-         -->
-    <property file="ant.properties" />
-
-    <!-- if sdk.dir was not set from one of the property file, then
-         get it from the ANDROID_HOME env var.
-         This must be done before we load project.properties since
-         the proguard config can use sdk.dir -->
-    <property environment="env" />
-    <condition property="sdk.dir" value="${env.ANDROID_HOME}">
-        <isset property="env.ANDROID_HOME" />
-    </condition>
-
-    <!-- The project.properties file is created and updated by the 'android'
-         tool, as well as ADT.
-
-         This contains project specific properties such as project target, and library
-         dependencies. Lower level build properties are stored in ant.properties
-         (or in .classpath for Eclipse projects).
-
-         This file is an integral part of the build system for your
-         application and should be checked into Version Control Systems. -->
-    <loadproperties srcFile="project.properties" />
-
-    <!-- quick check on sdk.dir -->
-    <fail
-            message="sdk.dir is missing. Make sure to generate local.properties using 'android update project' or to inject it through the ANDROID_HOME environment variable."
-            unless="sdk.dir"
-    />
-
-    <!--
-        Import per project custom build rules if present at the root of the project.
-        This is the place to put custom intermediary targets such as:
-            -pre-build
-            -pre-compile
-            -post-compile (This is typically used for code obfuscation.
-                           Compiled code location: ${out.classes.absolute.dir}
-                           If this is not done in place, override ${out.dex.input.absolute.dir})
-            -post-package
-            -post-build
-            -pre-clean
-    -->
-    <import file="custom_rules.xml" optional="true" />
-
-    <!-- Import the actual build file.
-
-         To customize existing targets, there are two options:
-         - Customize only one target:
-             - copy/paste the target into this file, *before* the
-               <import> task.
-             - customize it to your needs.
-         - Customize the whole content of build.xml
-             - copy/paste the content of the rules files (minus the top node)
-               into this file, replacing the <import> task.
-             - customize to your needs.
-
-         ***********************
-         ****** IMPORTANT ******
-         ***********************
-         In all cases you must update the value of version-tag below to read 'custom' instead of an integer,
-         in order to avoid having your file be overridden by tools such as "android update project"
-    -->
-    <!-- version-tag: 1 -->
-    <import file="${sdk.dir}/tools/ant/build.xml" />
-
-</project>
diff --git a/testapps/basicProjectWithAidl/project.properties b/testapps/basicProjectWithAidl/project.properties
deleted file mode 100644
index 38db660..0000000
--- a/testapps/basicProjectWithAidl/project.properties
+++ /dev/null
@@ -1,12 +0,0 @@
-# This file is automatically generated by Android Tools.
-# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
-#
-# This file must be checked in Version Control Systems.
-#
-# To customize properties used by the Ant build system use,
-# "build.properties", and override values to adapt the script to your
-# project structure.
-
-# Project target.
-target=android-AOSP
-proguard.config=../proguard.config
diff --git a/testapps/basicProjectWithAidl/res/drawable/icon.png b/testapps/basicProjectWithAidl/res/drawable/icon.png
deleted file mode 100644
index a07c69f..0000000
--- a/testapps/basicProjectWithAidl/res/drawable/icon.png
+++ /dev/null
Binary files differ
diff --git a/testapps/basicProjectWithAidl/res/layout/main.xml b/testapps/basicProjectWithAidl/res/layout/main.xml
deleted file mode 100644
index 783e4a0..0000000
--- a/testapps/basicProjectWithAidl/res/layout/main.xml
+++ /dev/null
@@ -1,13 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:orientation="vertical"
-    android:layout_width="fill_parent"
-    android:layout_height="fill_parent"
-    >
-<TextView
-    android:layout_width="fill_parent"
-    android:layout_height="wrap_content"
-    android:text="Basic Project"
-    />
-</LinearLayout>
-
diff --git a/testapps/basicProjectWithAidl/res/values/strings.xml b/testapps/basicProjectWithAidl/res/values/strings.xml
deleted file mode 100644
index a7322d3..0000000
--- a/testapps/basicProjectWithAidl/res/values/strings.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<resources>
-    <string name="app_name">basicProject</string>
-</resources>
diff --git a/testapps/basicProjectWithAidl/src/com/android/tests/basicprojectwithaidl/ITest.aidl b/testapps/basicProjectWithAidl/src/com/android/tests/basicprojectwithaidl/ITest.aidl
deleted file mode 100644
index 7185715..0000000
--- a/testapps/basicProjectWithAidl/src/com/android/tests/basicprojectwithaidl/ITest.aidl
+++ /dev/null
@@ -1,6 +0,0 @@
-package com.android.tests.basicprojectwithaidl;
-
-interface ITest {
-    Rect getRect();
-}
-
diff --git a/testapps/basicProjectWithAidl/src/com/android/tests/basicprojectwithaidl/Main.java b/testapps/basicProjectWithAidl/src/com/android/tests/basicprojectwithaidl/Main.java
deleted file mode 100644
index eaed510..0000000
--- a/testapps/basicProjectWithAidl/src/com/android/tests/basicprojectwithaidl/Main.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package com.android.tests.basicprojectwithaidl;
-
-import android.app.Activity;
-import android.os.Bundle;
-
-public class Main extends Activity
-{
-    /** Called when the activity is first created. */
-    @Override
-    public void onCreate(Bundle savedInstanceState)
-    {
-        super.onCreate(savedInstanceState);
-        setContentView(R.layout.main);
-    }
-}
diff --git a/testapps/basicProjectWithAidl/src/com/android/tests/basicprojectwithaidl/Rect.aidl b/testapps/basicProjectWithAidl/src/com/android/tests/basicprojectwithaidl/Rect.aidl
deleted file mode 100644
index 734cf77..0000000
--- a/testapps/basicProjectWithAidl/src/com/android/tests/basicprojectwithaidl/Rect.aidl
+++ /dev/null
@@ -1,5 +0,0 @@
-package com.android.tests.basicprojectwithaidl;
-
-// Declare Rect so AIDL can find it and knows that it implements
-// the parcelable protocol.
-parcelable Rect;
\ No newline at end of file
diff --git a/testapps/basicProjectWithAidl/src/com/android/tests/basicprojectwithaidl/Rect.java b/testapps/basicProjectWithAidl/src/com/android/tests/basicprojectwithaidl/Rect.java
deleted file mode 100644
index 8e16926..0000000
--- a/testapps/basicProjectWithAidl/src/com/android/tests/basicprojectwithaidl/Rect.java
+++ /dev/null
@@ -1,52 +0,0 @@
-package com.android.tests.basicprojectwithaidl;
-
-import android.os.Parcel;
-import android.os.Parcelable;
-
-public class Rect implements Parcelable {
-    public int left;
-    public int top;
-    public int right;
-    public int bottom;
-
-    public static final Parcelable.Creator<Rect> CREATOR = new Parcelable.Creator<Rect>() {
-        public Rect createFromParcel(Parcel in) {
-            return new Rect(in);
-        }
-
-        public Rect[] newArray(int size) {
-            return new Rect[size];
-        }
-    };
-
-    public Rect() {
-    }
-
-    private Rect(Parcel in) {
-        readFromParcel(in);
-    }
-
-    public void writeToParcel(Parcel out) {
-        out.writeInt(left);
-        out.writeInt(top);
-        out.writeInt(right);
-        out.writeInt(bottom);
-    }
-
-    public void readFromParcel(Parcel in) {
-        left = in.readInt();
-        top = in.readInt();
-        right = in.readInt();
-        bottom = in.readInt();
-    }
-
-    public int describeContents() {
-        // TODO Auto-generated method stub
-        return 0;
-    }
-
-    public void writeToParcel(Parcel arg0, int arg1) {
-        // TODO Auto-generated method stub
-
-    }
-}
diff --git a/testapps/buildConfigTest/COMPILE_AND_RUN b/testapps/buildConfigTest/COMPILE_AND_RUN
deleted file mode 100644
index e69de29..0000000
--- a/testapps/buildConfigTest/COMPILE_AND_RUN
+++ /dev/null
diff --git a/testapps/buildConfigTest/SUCCESS b/testapps/buildConfigTest/SUCCESS
deleted file mode 100644
index e69de29..0000000
--- a/testapps/buildConfigTest/SUCCESS
+++ /dev/null
diff --git a/testapps/buildConfigTest/app/.classpath b/testapps/buildConfigTest/app/.classpath
deleted file mode 100644
index a4763d1..0000000
--- a/testapps/buildConfigTest/app/.classpath
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="src" path="gen"/>
-	<classpathentry kind="con" path="com.android.ide.eclipse.adt.ANDROID_FRAMEWORK"/>
-	<classpathentry kind="con" path="com.android.ide.eclipse.adt.LIBRARIES"/>
-	<classpathentry kind="output" path="bin/classes"/>
-</classpath>
diff --git a/testapps/buildConfigTest/app/.project b/testapps/buildConfigTest/app/.project
deleted file mode 100644
index dd37abe..0000000
--- a/testapps/buildConfigTest/app/.project
+++ /dev/null
@@ -1,33 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>buildConfigTest-app</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>com.android.ide.eclipse.adt.ResourceManagerBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>com.android.ide.eclipse.adt.PreCompilerBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>com.android.ide.eclipse.adt.ApkBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>com.android.ide.eclipse.adt.AndroidNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/testapps/buildConfigTest/app/AndroidManifest.xml b/testapps/buildConfigTest/app/AndroidManifest.xml
deleted file mode 100644
index 50e30b9..0000000
--- a/testapps/buildConfigTest/app/AndroidManifest.xml
+++ /dev/null
@@ -1,15 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
-      package="com.android.tests.buildconfigtest"
-      android:versionCode="1"
-      android:versionName="1.0">
-    <application android:label="@string/app_name" android:icon="@drawable/ic_launcher">
-        <activity android:name="Main"
-                  android:label="@string/app_name">
-            <intent-filter>
-                <action android:name="android.intent.action.MAIN" />
-                <category android:name="android.intent.category.LAUNCHER" />
-            </intent-filter>
-        </activity>
-    </application>
-</manifest>
diff --git a/testapps/buildConfigTest/app/ant.properties b/testapps/buildConfigTest/app/ant.properties
deleted file mode 100644
index b0971e8..0000000
--- a/testapps/buildConfigTest/app/ant.properties
+++ /dev/null
@@ -1,17 +0,0 @@
-# This file is used to override default values used by the Ant build system.
-#
-# This file must be checked into Version Control Systems, as it is
-# integral to the build system of your project.
-
-# This file is only used by the Ant script.
-
-# You can use this to override default values such as
-#  'source.dir' for the location of your java source folder and
-#  'out.dir' for the location of your output folder.
-
-# You can also use it define how the release builds are signed by declaring
-# the following properties:
-#  'key.store' for the location of your keystore and
-#  'key.alias' for the name of the key to use.
-# The password will be asked during the build when you use the 'release' target.
-
diff --git a/testapps/buildConfigTest/app/build.xml b/testapps/buildConfigTest/app/build.xml
deleted file mode 100644
index 93dfe0f..0000000
--- a/testapps/buildConfigTest/app/build.xml
+++ /dev/null
@@ -1,92 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project name="buildConfigTest" default="help">
-
-    <!-- The local.properties file is created and updated by the 'android' tool.
-         It contains the path to the SDK. It should *NOT* be checked into
-         Version Control Systems. -->
-    <property file="local.properties" />
-
-    <!-- The ant.properties file can be created by you. It is only edited by the
-         'android' tool to add properties to it.
-         This is the place to change some Ant specific build properties.
-         Here are some properties you may want to change/update:
-
-         source.dir
-             The name of the source directory. Default is 'src'.
-         out.dir
-             The name of the output directory. Default is 'bin'.
-
-         For other overridable properties, look at the beginning of the rules
-         files in the SDK, at tools/ant/build.xml
-
-         Properties related to the SDK location or the project target should
-         be updated using the 'android' tool with the 'update' action.
-
-         This file is an integral part of the build system for your
-         application and should be checked into Version Control Systems.
-
-         -->
-    <property file="ant.properties" />
-
-    <!-- if sdk.dir was not set from one of the property file, then
-         get it from the ANDROID_HOME env var.
-         This must be done before we load project.properties since
-         the proguard config can use sdk.dir -->
-    <property environment="env" />
-    <condition property="sdk.dir" value="${env.ANDROID_HOME}">
-        <isset property="env.ANDROID_HOME" />
-    </condition>
-
-    <!-- The project.properties file is created and updated by the 'android'
-         tool, as well as ADT.
-
-         This contains project specific properties such as project target, and library
-         dependencies. Lower level build properties are stored in ant.properties
-         (or in .classpath for Eclipse projects).
-
-         This file is an integral part of the build system for your
-         application and should be checked into Version Control Systems. -->
-    <loadproperties srcFile="project.properties" />
-
-    <!-- quick check on sdk.dir -->
-    <fail
-            message="sdk.dir is missing. Make sure to generate local.properties using 'android update project' or to inject it through the ANDROID_HOME environment variable."
-            unless="sdk.dir"
-    />
-
-    <!--
-        Import per project custom build rules if present at the root of the project.
-        This is the place to put custom intermediary targets such as:
-            -pre-build
-            -pre-compile
-            -post-compile (This is typically used for code obfuscation.
-                           Compiled code location: ${out.classes.absolute.dir}
-                           If this is not done in place, override ${out.dex.input.absolute.dir})
-            -post-package
-            -post-build
-            -pre-clean
-    -->
-    <import file="custom_rules.xml" optional="true" />
-
-    <!-- Import the actual build file.
-
-         To customize existing targets, there are two options:
-         - Customize only one target:
-             - copy/paste the target into this file, *before* the
-               <import> task.
-             - customize it to your needs.
-         - Customize the whole content of build.xml
-             - copy/paste the content of the rules files (minus the top node)
-               into this file, replacing the <import> task.
-             - customize to your needs.
-
-         ***********************
-         ****** IMPORTANT ******
-         ***********************
-         In all cases you must update the value of version-tag below to read 'custom' instead of an integer,
-         in order to avoid having your file be overridden by tools such as "android update project"
-    -->
-    <!-- version-tag: 1 -->
-    <import file="${sdk.dir}/tools/ant/build.xml" />
-
-</project>
diff --git a/testapps/buildConfigTest/app/lint.xml b/testapps/buildConfigTest/app/lint.xml
deleted file mode 100644
index ee0eead..0000000
--- a/testapps/buildConfigTest/app/lint.xml
+++ /dev/null
@@ -1,3 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<lint>
-</lint>
\ No newline at end of file
diff --git a/testapps/buildConfigTest/app/proguard-project.txt b/testapps/buildConfigTest/app/proguard-project.txt
deleted file mode 100644
index f2fe155..0000000
--- a/testapps/buildConfigTest/app/proguard-project.txt
+++ /dev/null
@@ -1,20 +0,0 @@
-# To enable ProGuard in your project, edit project.properties
-# to define the proguard.config property as described in that file.
-#
-# Add project specific ProGuard rules here.
-# By default, the flags in this file are appended to flags specified
-# in ${sdk.dir}/tools/proguard/proguard-android.txt
-# You can edit the include path and order by changing the ProGuard
-# include property in project.properties.
-#
-# For more details, see
-#   http://developer.android.com/guide/developing/tools/proguard.html
-
-# Add any project specific keep options here:
-
-# If your project uses WebView with JS, uncomment the following
-# and specify the fully qualified class name to the JavaScript interface
-# class:
-#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
-#   public *;
-#}
diff --git a/testapps/buildConfigTest/app/project.properties b/testapps/buildConfigTest/app/project.properties
deleted file mode 100644
index c42f7ef..0000000
--- a/testapps/buildConfigTest/app/project.properties
+++ /dev/null
@@ -1,15 +0,0 @@
-# This file is automatically generated by Android Tools.
-# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
-#
-# This file must be checked in Version Control Systems.
-#
-# To customize properties used by the Ant build system edit
-# "ant.properties", and override values to adapt the script to your
-# project structure.
-#
-# To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home):
-#proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt
-
-# Project target.
-target=android-15
-android.library.reference.1=../lib1
diff --git a/testapps/buildConfigTest/app/res/drawable-hdpi/ic_launcher.png b/testapps/buildConfigTest/app/res/drawable-hdpi/ic_launcher.png
deleted file mode 100644
index 8074c4c..0000000
--- a/testapps/buildConfigTest/app/res/drawable-hdpi/ic_launcher.png
+++ /dev/null
Binary files differ
diff --git a/testapps/buildConfigTest/app/res/drawable-ldpi/ic_launcher.png b/testapps/buildConfigTest/app/res/drawable-ldpi/ic_launcher.png
deleted file mode 100644
index 1095584..0000000
--- a/testapps/buildConfigTest/app/res/drawable-ldpi/ic_launcher.png
+++ /dev/null
Binary files differ
diff --git a/testapps/buildConfigTest/app/res/drawable-mdpi/ic_launcher.png b/testapps/buildConfigTest/app/res/drawable-mdpi/ic_launcher.png
deleted file mode 100644
index a07c69f..0000000
--- a/testapps/buildConfigTest/app/res/drawable-mdpi/ic_launcher.png
+++ /dev/null
Binary files differ
diff --git a/testapps/buildConfigTest/app/res/layout/main.xml b/testapps/buildConfigTest/app/res/layout/main.xml
deleted file mode 100644
index 6a3de67..0000000
--- a/testapps/buildConfigTest/app/res/layout/main.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:tools="http://schemas.android.com/tools"
-    android:layout_width="fill_parent"
-    android:layout_height="fill_parent"
-    android:orientation="vertical" >
-
-    <TextView
-        android:id="@+id/app"
-        android:layout_width="fill_parent"
-        android:layout_height="wrap_content"
-        android:text="App: Release"
-        tools:ignore="HardcodedText" />
-
-    <TextView
-        android:id="@+id/lib1"
-        android:layout_width="fill_parent"
-        android:layout_height="wrap_content"
-        android:text="\\?"
-        tools:ignore="HardcodedText" />
-
-</LinearLayout>
\ No newline at end of file
diff --git a/testapps/buildConfigTest/app/res/values/strings.xml b/testapps/buildConfigTest/app/res/values/strings.xml
deleted file mode 100644
index 004b9f0..0000000
--- a/testapps/buildConfigTest/app/res/values/strings.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<resources>
-    <string name="app_name">BuildConfigTest</string>
-</resources>
diff --git a/testapps/buildConfigTest/app/src/com/android/tests/buildconfigtest/Main.java b/testapps/buildConfigTest/app/src/com/android/tests/buildconfigtest/Main.java
deleted file mode 100644
index 6421c60..0000000
--- a/testapps/buildConfigTest/app/src/com/android/tests/buildconfigtest/Main.java
+++ /dev/null
@@ -1,26 +0,0 @@
-package com.android.tests.buildconfigtest;
-
-import android.app.Activity;
-import android.os.Bundle;
-import android.widget.TextView;
-
-import com.android.tests.buildconfigtest.lib1.Lib1;
-
-public class Main extends Activity
-{
-    /** Called when the activity is first created. */
-    @Override
-    public void onCreate(Bundle savedInstanceState)
-    {
-        super.onCreate(savedInstanceState);
-        setContentView(R.layout.main);
-
-        if (BuildConfig.DEBUG) {
-            TextView tv = (TextView) findViewById(R.id.app);
-            tv.setText("App: DEBUG");
-        }
-
-        TextView tv = (TextView) findViewById(R.id.lib1);
-        tv.setText("Lib: " + Lib1.getContent());
-    }
-}
diff --git a/testapps/buildConfigTest/lib1/.classpath b/testapps/buildConfigTest/lib1/.classpath
deleted file mode 100644
index a4763d1..0000000
--- a/testapps/buildConfigTest/lib1/.classpath
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="src" path="gen"/>
-	<classpathentry kind="con" path="com.android.ide.eclipse.adt.ANDROID_FRAMEWORK"/>
-	<classpathentry kind="con" path="com.android.ide.eclipse.adt.LIBRARIES"/>
-	<classpathentry kind="output" path="bin/classes"/>
-</classpath>
diff --git a/testapps/buildConfigTest/lib1/.project b/testapps/buildConfigTest/lib1/.project
deleted file mode 100644
index 22c9a5b..0000000
--- a/testapps/buildConfigTest/lib1/.project
+++ /dev/null
@@ -1,33 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>buildConfigTest-Lib</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>com.android.ide.eclipse.adt.ResourceManagerBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>com.android.ide.eclipse.adt.PreCompilerBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>com.android.ide.eclipse.adt.ApkBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>com.android.ide.eclipse.adt.AndroidNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/testapps/buildConfigTest/lib1/AndroidManifest.xml b/testapps/buildConfigTest/lib1/AndroidManifest.xml
deleted file mode 100644
index 58aa624..0000000
--- a/testapps/buildConfigTest/lib1/AndroidManifest.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
-    package="com.android.tests.javaprojecttest.lib1"
-    android:versionCode="1"
-    android:versionName="1.0" >
-
-    <application
-        android:icon="@drawable/ic_launcher"
-        android:label="@string/app_name" >
-        <activity
-            android:name="com.android.tests.buildconfigtest.lib1.Main"
-            android:label="@string/app_name" >
-            <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/testapps/buildConfigTest/lib1/build.xml b/testapps/buildConfigTest/lib1/build.xml
deleted file mode 100644
index a111b4d..0000000
--- a/testapps/buildConfigTest/lib1/build.xml
+++ /dev/null
@@ -1,92 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project name="lib1" default="help">
-
-    <!-- The local.properties file is created and updated by the 'android' tool.
-         It contains the path to the SDK. It should *NOT* be checked into
-         Version Control Systems. -->
-    <property file="local.properties" />
-
-    <!-- The ant.properties file can be created by you. It is only edited by the
-         'android' tool to add properties to it.
-         This is the place to change some Ant specific build properties.
-         Here are some properties you may want to change/update:
-
-         source.dir
-             The name of the source directory. Default is 'src'.
-         out.dir
-             The name of the output directory. Default is 'bin'.
-
-         For other overridable properties, look at the beginning of the rules
-         files in the SDK, at tools/ant/build.xml
-
-         Properties related to the SDK location or the project target should
-         be updated using the 'android' tool with the 'update' action.
-
-         This file is an integral part of the build system for your
-         application and should be checked into Version Control Systems.
-
-         -->
-    <property file="ant.properties" />
-
-    <!-- if sdk.dir was not set from one of the property file, then
-         get it from the ANDROID_HOME env var.
-         This must be done before we load project.properties since
-         the proguard config can use sdk.dir -->
-    <property environment="env" />
-    <condition property="sdk.dir" value="${env.ANDROID_HOME}">
-        <isset property="env.ANDROID_HOME" />
-    </condition>
-
-    <!-- The project.properties file is created and updated by the 'android'
-         tool, as well as ADT.
-
-         This contains project specific properties such as project target, and library
-         dependencies. Lower level build properties are stored in ant.properties
-         (or in .classpath for Eclipse projects).
-
-         This file is an integral part of the build system for your
-         application and should be checked into Version Control Systems. -->
-    <loadproperties srcFile="project.properties" />
-
-    <!-- quick check on sdk.dir -->
-    <fail
-            message="sdk.dir is missing. Make sure to generate local.properties using 'android update project' or to inject it through the ANDROID_HOME environment variable."
-            unless="sdk.dir"
-    />
-
-    <!--
-        Import per project custom build rules if present at the root of the project.
-        This is the place to put custom intermediary targets such as:
-            -pre-build
-            -pre-compile
-            -post-compile (This is typically used for code obfuscation.
-                           Compiled code location: ${out.classes.absolute.dir}
-                           If this is not done in place, override ${out.dex.input.absolute.dir})
-            -post-package
-            -post-build
-            -pre-clean
-    -->
-    <import file="custom_rules.xml" optional="true" />
-
-    <!-- Import the actual build file.
-
-         To customize existing targets, there are two options:
-         - Customize only one target:
-             - copy/paste the target into this file, *before* the
-               <import> task.
-             - customize it to your needs.
-         - Customize the whole content of build.xml
-             - copy/paste the content of the rules files (minus the top node)
-               into this file, replacing the <import> task.
-             - customize to your needs.
-
-         ***********************
-         ****** IMPORTANT ******
-         ***********************
-         In all cases you must update the value of version-tag below to read 'custom' instead of an integer,
-         in order to avoid having your file be overridden by tools such as "android update project"
-    -->
-    <!-- version-tag: 1 -->
-    <import file="${sdk.dir}/tools/ant/build.xml" />
-
-</project>
diff --git a/testapps/buildConfigTest/lib1/proguard-project.txt b/testapps/buildConfigTest/lib1/proguard-project.txt
deleted file mode 100644
index f2fe155..0000000
--- a/testapps/buildConfigTest/lib1/proguard-project.txt
+++ /dev/null
@@ -1,20 +0,0 @@
-# To enable ProGuard in your project, edit project.properties
-# to define the proguard.config property as described in that file.
-#
-# Add project specific ProGuard rules here.
-# By default, the flags in this file are appended to flags specified
-# in ${sdk.dir}/tools/proguard/proguard-android.txt
-# You can edit the include path and order by changing the ProGuard
-# include property in project.properties.
-#
-# For more details, see
-#   http://developer.android.com/guide/developing/tools/proguard.html
-
-# Add any project specific keep options here:
-
-# If your project uses WebView with JS, uncomment the following
-# and specify the fully qualified class name to the JavaScript interface
-# class:
-#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
-#   public *;
-#}
diff --git a/testapps/buildConfigTest/lib1/project.properties b/testapps/buildConfigTest/lib1/project.properties
deleted file mode 100644
index 36f1594..0000000
--- a/testapps/buildConfigTest/lib1/project.properties
+++ /dev/null
@@ -1,15 +0,0 @@
-# This file is automatically generated by Android Tools.
-# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
-#
-# This file must be checked in Version Control Systems.
-#
-# To customize properties used by the Ant build system edit
-# "ant.properties", and override values to adapt the script to your
-# project structure.
-#
-# To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home):
-#proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt
-
-# Project target.
-target=android-15
-android.library=true
diff --git a/testapps/buildConfigTest/lib1/res/drawable-hdpi/ic_launcher.png b/testapps/buildConfigTest/lib1/res/drawable-hdpi/ic_launcher.png
deleted file mode 100644
index 8074c4c..0000000
--- a/testapps/buildConfigTest/lib1/res/drawable-hdpi/ic_launcher.png
+++ /dev/null
Binary files differ
diff --git a/testapps/buildConfigTest/lib1/res/drawable-ldpi/ic_launcher.png b/testapps/buildConfigTest/lib1/res/drawable-ldpi/ic_launcher.png
deleted file mode 100644
index 1095584..0000000
--- a/testapps/buildConfigTest/lib1/res/drawable-ldpi/ic_launcher.png
+++ /dev/null
Binary files differ
diff --git a/testapps/buildConfigTest/lib1/res/drawable-mdpi/ic_launcher.png b/testapps/buildConfigTest/lib1/res/drawable-mdpi/ic_launcher.png
deleted file mode 100644
index a07c69f..0000000
--- a/testapps/buildConfigTest/lib1/res/drawable-mdpi/ic_launcher.png
+++ /dev/null
Binary files differ
diff --git a/testapps/buildConfigTest/lib1/res/values/strings.xml b/testapps/buildConfigTest/lib1/res/values/strings.xml
deleted file mode 100644
index 549e4ea..0000000
--- a/testapps/buildConfigTest/lib1/res/values/strings.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<resources>
-    <string name="app_name">Main</string>
-</resources>
diff --git a/testapps/buildConfigTest/lib1/src/com/android/tests/buildconfigtest/lib1/Lib1.java b/testapps/buildConfigTest/lib1/src/com/android/tests/buildconfigtest/lib1/Lib1.java
deleted file mode 100644
index cca0eff..0000000
--- a/testapps/buildConfigTest/lib1/src/com/android/tests/buildconfigtest/lib1/Lib1.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package com.android.tests.buildconfigtest.lib1;
-
-import com.android.tests.javaprojecttest.lib1.BuildConfig;
-
-
-public class Lib1 {
-
-    public static String getContent() {
-        String a = "Release";
-        
-        if (BuildConfig.DEBUG) {
-            a = "DEBUG";
-        }
-        
-        return a;
-    }
-}
diff --git a/testapps/customPropAnimTest/.classpath b/testapps/customPropAnimTest/.classpath
deleted file mode 100644
index a4763d1..0000000
--- a/testapps/customPropAnimTest/.classpath
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="src" path="gen"/>
-	<classpathentry kind="con" path="com.android.ide.eclipse.adt.ANDROID_FRAMEWORK"/>
-	<classpathentry kind="con" path="com.android.ide.eclipse.adt.LIBRARIES"/>
-	<classpathentry kind="output" path="bin/classes"/>
-</classpath>
diff --git a/testapps/customPropAnimTest/.project b/testapps/customPropAnimTest/.project
deleted file mode 100644
index 0d12fe9..0000000
--- a/testapps/customPropAnimTest/.project
+++ /dev/null
@@ -1,33 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>customPropAnimTest</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>com.android.ide.eclipse.adt.ResourceManagerBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>com.android.ide.eclipse.adt.PreCompilerBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>com.android.ide.eclipse.adt.ApkBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>com.android.ide.eclipse.adt.AndroidNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/testapps/customPropAnimTest/AndroidManifest.xml b/testapps/customPropAnimTest/AndroidManifest.xml
deleted file mode 100644
index 72c58d0..0000000
--- a/testapps/customPropAnimTest/AndroidManifest.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
-    package="com.android.custompropertyanimation"
-    android:versionCode="1"
-    android:versionName="1.0" >
-
-    <uses-sdk android:minSdkVersion="15" />
-
-    <application
-        android:icon="@drawable/ic_launcher"
-        android:label="@string/app_name" >
-        <activity
-            android:name=".CustomPropertyAnimationActivity"
-            android:label="@string/app_name" >
-            <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/testapps/customPropAnimTest/build.xml b/testapps/customPropAnimTest/build.xml
deleted file mode 100644
index d6ee0bc..0000000
--- a/testapps/customPropAnimTest/build.xml
+++ /dev/null
@@ -1,90 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project name="CustomPropertyAnimationActivity" default="help">
-
-    <!-- The local.properties file is created and updated by the 'android' tool.
-         It contains the path to the SDK. It should *NOT* be checked into
-         Version Control Systems. -->
-    <property file="local.properties" />
-
-    <!-- The ant.properties file can be created by you. It is only edited by the
-         'android' tool to add properties to it.
-         This is the place to change some Ant specific build properties.
-         Here are some properties you may want to change/update:
-
-         source.dir
-             The name of the source directory. Default is 'src'.
-         out.dir
-             The name of the output directory. Default is 'bin'.
-
-         For other overridable properties, look at the beginning of the rules
-         files in the SDK, at tools/ant/build.xml
-
-         Properties related to the SDK location or the project target should
-         be updated using the 'android' tool with the 'update' action.
-
-         This file is an integral part of the build system for your
-         application and should be checked into Version Control Systems.
-
-         -->
-    <property file="ant.properties" />
-
-    <!-- The project.properties file is created and updated by the 'android'
-         tool, as well as ADT.
-
-         This contains project specific properties such as project target, and library
-         dependencies. Lower level build properties are stored in ant.properties
-         (or in .classpath for Eclipse projects).
-
-         This file is an integral part of the build system for your
-         application and should be checked into Version Control Systems. -->
-    <loadproperties srcFile="project.properties" />
-
-    <!-- if sdk.dir was not set from one of the property file, then
-         get it from the ANDROID_HOME env var. -->
-    <property environment="env" />
-    <condition property="sdk.dir" value="${env.ANDROID_HOME}">
-        <isset property="env.ANDROID_HOME" />
-    </condition>
-
-    <!-- quick check on sdk.dir -->
-    <fail
-            message="sdk.dir is missing. Make sure to generate local.properties using 'android update project' or to inject it through the ANDROID_HOME environment variable."
-            unless="sdk.dir"
-    />
-
-    <!--
-        Import per project custom build rules if present at the root of the project.
-        This is the place to put custom intermediary targets such as:
-            -pre-build
-            -pre-compile
-            -post-compile (This is typically used for code obfuscation.
-                           Compiled code location: ${out.classes.absolute.dir}
-                           If this is not done in place, override ${out.dex.input.absolute.dir})
-            -post-package
-            -post-build
-            -pre-clean
-    -->
-    <import file="custom_rules.xml" optional="true" />
-
-    <!-- Import the actual build file.
-
-         To customize existing targets, there are two options:
-         - Customize only one target:
-             - copy/paste the target into this file, *before* the
-               <import> task.
-             - customize it to your needs.
-         - Customize the whole content of build.xml
-             - copy/paste the content of the rules files (minus the top node)
-               into this file, replacing the <import> task.
-             - customize to your needs.
-
-         ***********************
-         ****** IMPORTANT ******
-         ***********************
-         In all cases you must update the value of version-tag below to read 'custom' instead of an integer,
-         in order to avoid having your file be overridden by tools such as "android update project"
-    -->
-    <!-- version-tag: 1 -->
-    <import file="${sdk.dir}/tools/ant/build.xml" />
-
-</project>
diff --git a/testapps/customPropAnimTest/proguard-project.txt b/testapps/customPropAnimTest/proguard-project.txt
deleted file mode 100644
index f2fe155..0000000
--- a/testapps/customPropAnimTest/proguard-project.txt
+++ /dev/null
@@ -1,20 +0,0 @@
-# To enable ProGuard in your project, edit project.properties
-# to define the proguard.config property as described in that file.
-#
-# Add project specific ProGuard rules here.
-# By default, the flags in this file are appended to flags specified
-# in ${sdk.dir}/tools/proguard/proguard-android.txt
-# You can edit the include path and order by changing the ProGuard
-# include property in project.properties.
-#
-# For more details, see
-#   http://developer.android.com/guide/developing/tools/proguard.html
-
-# Add any project specific keep options here:
-
-# If your project uses WebView with JS, uncomment the following
-# and specify the fully qualified class name to the JavaScript interface
-# class:
-#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
-#   public *;
-#}
diff --git a/testapps/customPropAnimTest/project.properties b/testapps/customPropAnimTest/project.properties
deleted file mode 100644
index 1a88dc6..0000000
--- a/testapps/customPropAnimTest/project.properties
+++ /dev/null
@@ -1,15 +0,0 @@
-# This file is automatically generated by Android Tools.
-# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
-#
-# This file must be checked in Version Control Systems.
-#
-# To customize properties used by the Ant build system edit
-# "ant.properties", and override values to adapt the script to your
-# project structure.
-#
-# To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home):
-proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt
-
-# Project target.
-target=android-15
-
diff --git a/testapps/customPropAnimTest/res/drawable-hdpi/ic_launcher.png b/testapps/customPropAnimTest/res/drawable-hdpi/ic_launcher.png
deleted file mode 100644
index 96a442e..0000000
--- a/testapps/customPropAnimTest/res/drawable-hdpi/ic_launcher.png
+++ /dev/null
Binary files differ
diff --git a/testapps/customPropAnimTest/res/drawable-ldpi/ic_launcher.png b/testapps/customPropAnimTest/res/drawable-ldpi/ic_launcher.png
deleted file mode 100644
index 9923872..0000000
--- a/testapps/customPropAnimTest/res/drawable-ldpi/ic_launcher.png
+++ /dev/null
Binary files differ
diff --git a/testapps/customPropAnimTest/res/drawable-mdpi/ic_launcher.png b/testapps/customPropAnimTest/res/drawable-mdpi/ic_launcher.png
deleted file mode 100644
index 359047d..0000000
--- a/testapps/customPropAnimTest/res/drawable-mdpi/ic_launcher.png
+++ /dev/null
Binary files differ
diff --git a/testapps/customPropAnimTest/res/drawable-xhdpi/ic_launcher.png b/testapps/customPropAnimTest/res/drawable-xhdpi/ic_launcher.png
deleted file mode 100644
index 71c6d76..0000000
--- a/testapps/customPropAnimTest/res/drawable-xhdpi/ic_launcher.png
+++ /dev/null
Binary files differ
diff --git a/testapps/customPropAnimTest/res/layout/main.xml b/testapps/customPropAnimTest/res/layout/main.xml
deleted file mode 100644
index 40f9f1a..0000000
--- a/testapps/customPropAnimTest/res/layout/main.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="fill_parent"
-    android:layout_height="fill_parent"
-    android:orientation="vertical" 
-    android:id="@+id/container">
-
-</LinearLayout>
\ No newline at end of file
diff --git a/testapps/customPropAnimTest/res/values/strings.xml b/testapps/customPropAnimTest/res/values/strings.xml
deleted file mode 100644
index 9c3c31b..0000000
--- a/testapps/customPropAnimTest/res/values/strings.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<resources>
-
-    <string name="hello">Hello World, CustomPropertyAnimationActivity!</string>
-    <string name="app_name">CustomPropertyAnimation</string>
-
-</resources>
\ No newline at end of file
diff --git a/testapps/customPropAnimTest/src/com/android/custompropertyanimation/CustomPropertyAnimationActivity.java b/testapps/customPropAnimTest/src/com/android/custompropertyanimation/CustomPropertyAnimationActivity.java
deleted file mode 100644
index b1b91b9..0000000
--- a/testapps/customPropAnimTest/src/com/android/custompropertyanimation/CustomPropertyAnimationActivity.java
+++ /dev/null
@@ -1,22 +0,0 @@
-package com.android.custompropertyanimation;
-
-import android.animation.ObjectAnimator;
-import android.app.Activity;
-import android.os.Bundle;
-import android.widget.LinearLayout;
-
-public class CustomPropertyAnimationActivity extends Activity {
-    /** Called when the activity is first created. */
-    @Override
-    public void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-        setContentView(R.layout.main);
-        LinearLayout container = (LinearLayout) findViewById(R.id.container);
-        
-        MyView view = new MyView(this);
-        container.addView(view);
-        
-        ObjectAnimator anim = ObjectAnimator.ofFloat(view, "foo", 1);
-        anim.start();
-    }
-}
\ No newline at end of file
diff --git a/testapps/customPropAnimTest/src/com/android/custompropertyanimation/MyView.java b/testapps/customPropAnimTest/src/com/android/custompropertyanimation/MyView.java
deleted file mode 100644
index e557fda..0000000
--- a/testapps/customPropAnimTest/src/com/android/custompropertyanimation/MyView.java
+++ /dev/null
@@ -1,24 +0,0 @@
-package com.android.custompropertyanimation;
-
-import android.content.Context;
-import android.view.View;
-
-public class MyView extends View {
-
-    float mFoo = 0;
-    
-    public MyView(Context context) {
-        super(context);
-    }
-    
-    public void setFoo(float foo) {
-        System.out.println("foo = " + foo);
-        mFoo = foo;
-    }
-
-    public float getFoo() {
-        System.out.println("getFoo() returning " + mFoo);
-        return mFoo;
-    }
-
-}
diff --git a/testapps/customViewTest/libWithCustomView/.classpath b/testapps/customViewTest/libWithCustomView/.classpath
deleted file mode 100644
index a4763d1..0000000
--- a/testapps/customViewTest/libWithCustomView/.classpath
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="src" path="gen"/>
-	<classpathentry kind="con" path="com.android.ide.eclipse.adt.ANDROID_FRAMEWORK"/>
-	<classpathentry kind="con" path="com.android.ide.eclipse.adt.LIBRARIES"/>
-	<classpathentry kind="output" path="bin/classes"/>
-</classpath>
diff --git a/testapps/customViewTest/libWithCustomView/.project b/testapps/customViewTest/libWithCustomView/.project
deleted file mode 100644
index 0be1f61..0000000
--- a/testapps/customViewTest/libWithCustomView/.project
+++ /dev/null
@@ -1,33 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>customViewTest-libWithCustomView</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>com.android.ide.eclipse.adt.ResourceManagerBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>com.android.ide.eclipse.adt.PreCompilerBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>com.android.ide.eclipse.adt.ApkBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>com.android.ide.eclipse.adt.AndroidNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/testapps/customViewTest/libWithCustomView/AndroidManifest.xml b/testapps/customViewTest/libWithCustomView/AndroidManifest.xml
deleted file mode 100644
index 89cff95..0000000
--- a/testapps/customViewTest/libWithCustomView/AndroidManifest.xml
+++ /dev/null
@@ -1,18 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
-    package="com.android.tests.libwithcustom"
-    android:versionCode="1"
-    android:versionName="1.0" >
-
-    <permission
-        android:name="com.foo.mypermission"
-        android:description="@string/app_name"
-        android:label="@string/app_name" >
-    </permission>
-    <permission
-        android:name="com.foo.mypermission2"
-        android:description="@string/app_name"
-        android:label="@string/app_name" >
-    </permission>
-
-</manifest>
\ No newline at end of file
diff --git a/testapps/customViewTest/libWithCustomView/ant.properties b/testapps/customViewTest/libWithCustomView/ant.properties
deleted file mode 100644
index ee52d86..0000000
--- a/testapps/customViewTest/libWithCustomView/ant.properties
+++ /dev/null
@@ -1,17 +0,0 @@
-# This file is used to override default values used by the Ant build system.
-#
-# This file must be checked in Version Control Systems, as it is
-# integral to the build system of your project.
-
-# This file is only used by the Ant script.
-
-# You can use this to override default values such as
-#  'source.dir' for the location of your java source folder and
-#  'out.dir' for the location of your output folder.
-
-# You can also use it define how the release builds are signed by declaring
-# the following properties:
-#  'key.store' for the location of your keystore and
-#  'key.alias' for the name of the key to use.
-# The password will be asked during the build when you use the 'release' target.
-
diff --git a/testapps/customViewTest/libWithCustomView/build.xml b/testapps/customViewTest/libWithCustomView/build.xml
deleted file mode 100644
index 7d9e032..0000000
--- a/testapps/customViewTest/libWithCustomView/build.xml
+++ /dev/null
@@ -1,90 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project name="libWithCustomView" default="help">
-
-    <!-- The local.properties file is created and updated by the 'android' tool.
-         It contains the path to the SDK. It should *NOT* be checked into
-         Version Control Systems. -->
-    <property file="local.properties" />
-
-    <!-- The ant.properties file can be created by you. It is only edited by the
-         'android' tool to add properties to it.
-         This is the place to change some Ant specific build properties.
-         Here are some properties you may want to change/update:
-
-         source.dir
-             The name of the source directory. Default is 'src'.
-         out.dir
-             The name of the output directory. Default is 'bin'.
-
-         For other overridable properties, look at the beginning of the rules
-         files in the SDK, at tools/ant/build.xml
-
-         Properties related to the SDK location or the project target should
-         be updated using the 'android' tool with the 'update' action.
-
-         This file is an integral part of the build system for your
-         application and should be checked into Version Control Systems.
-
-         -->
-    <property file="ant.properties" />
-
-    <!-- The project.properties file is created and updated by the 'android'
-         tool, as well as ADT.
-
-         This contains project specific properties such as project target, and library
-         dependencies. Lower level build properties are stored in ant.properties
-         (or in .classpath for Eclipse projects).
-
-         This file is an integral part of the build system for your
-         application and should be checked into Version Control Systems. -->
-    <loadproperties srcFile="project.properties" />
-
-    <!-- if sdk.dir was not set from one of the property file, then
-         get it from the ANDROID_HOME env var. -->
-    <property environment="env" />
-    <condition property="sdk.dir" value="${env.ANDROID_HOME}">
-        <isset property="env.ANDROID_HOME" />
-    </condition>
-
-    <!-- quick check on sdk.dir -->
-    <fail
-            message="sdk.dir is missing. Make sure to generate local.properties using 'android update project' or to inject it through the ANDROID_HOME environment variable."
-            unless="sdk.dir"
-    />
-
-    <!--
-        Import per project custom build rules if present at the root of the project.
-        This is the place to put custom intermediary targets such as:
-            -pre-build
-            -pre-compile
-            -post-compile (This is typically used for code obfuscation.
-                           Compiled code location: ${out.classes.absolute.dir}
-                           If this is not done in place, override ${out.dex.input.absolute.dir})
-            -post-package
-            -post-build
-            -pre-clean
-    -->
-    <import file="custom_rules.xml" optional="true" />
-
-    <!-- Import the actual build file.
-
-         To customize existing targets, there are two options:
-         - Customize only one target:
-             - copy/paste the target into this file, *before* the
-               <import> task.
-             - customize it to your needs.
-         - Customize the whole content of build.xml
-             - copy/paste the content of the rules files (minus the top node)
-               into this file, replacing the <import> task.
-             - customize to your needs.
-
-         ***********************
-         ****** IMPORTANT ******
-         ***********************
-         In all cases you must update the value of version-tag below to read 'custom' instead of an integer,
-         in order to avoid having your file be overridden by tools such as "android update project"
-    -->
-    <!-- version-tag: 1 -->
-    <import file="${sdk.dir}/tools/ant/build.xml" />
-
-</project>
diff --git a/testapps/customViewTest/libWithCustomView/proguard-project.txt b/testapps/customViewTest/libWithCustomView/proguard-project.txt
deleted file mode 100644
index f2fe155..0000000
--- a/testapps/customViewTest/libWithCustomView/proguard-project.txt
+++ /dev/null
@@ -1,20 +0,0 @@
-# To enable ProGuard in your project, edit project.properties
-# to define the proguard.config property as described in that file.
-#
-# Add project specific ProGuard rules here.
-# By default, the flags in this file are appended to flags specified
-# in ${sdk.dir}/tools/proguard/proguard-android.txt
-# You can edit the include path and order by changing the ProGuard
-# include property in project.properties.
-#
-# For more details, see
-#   http://developer.android.com/guide/developing/tools/proguard.html
-
-# Add any project specific keep options here:
-
-# If your project uses WebView with JS, uncomment the following
-# and specify the fully qualified class name to the JavaScript interface
-# class:
-#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
-#   public *;
-#}
diff --git a/testapps/customViewTest/libWithCustomView/proguard.cfg b/testapps/customViewTest/libWithCustomView/proguard.cfg
deleted file mode 100644
index b1cdf17..0000000
--- a/testapps/customViewTest/libWithCustomView/proguard.cfg
+++ /dev/null
@@ -1,40 +0,0 @@
--optimizationpasses 5
--dontusemixedcaseclassnames
--dontskipnonpubliclibraryclasses
--dontpreverify
--verbose
--optimizations !code/simplification/arithmetic,!field/*,!class/merging/*
-
--keep public class * extends android.app.Activity
--keep public class * extends android.app.Application
--keep public class * extends android.app.Service
--keep public class * extends android.content.BroadcastReceiver
--keep public class * extends android.content.ContentProvider
--keep public class * extends android.app.backup.BackupAgentHelper
--keep public class * extends android.preference.Preference
--keep public class com.android.vending.licensing.ILicensingService
-
--keepclasseswithmembernames class * {
-    native <methods>;
-}
-
--keepclasseswithmembers class * {
-    public <init>(android.content.Context, android.util.AttributeSet);
-}
-
--keepclasseswithmembers class * {
-    public <init>(android.content.Context, android.util.AttributeSet, int);
-}
-
--keepclassmembers class * extends android.app.Activity {
-   public void *(android.view.View);
-}
-
--keepclassmembers enum * {
-    public static **[] values();
-    public static ** valueOf(java.lang.String);
-}
-
--keep class * implements android.os.Parcelable {
-  public static final android.os.Parcelable$Creator *;
-}
diff --git a/testapps/customViewTest/libWithCustomView/project.properties b/testapps/customViewTest/libWithCustomView/project.properties
deleted file mode 100644
index 23d80c4..0000000
--- a/testapps/customViewTest/libWithCustomView/project.properties
+++ /dev/null
@@ -1,13 +0,0 @@
-# This file is automatically generated by Android Tools.
-# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
-#
-# This file must be checked in Version Control Systems.
-#
-# To customize properties used by the Ant build system use,
-# "ant.properties", and override values to adapt the script to your
-# project structure.
-
-# Project target.
-target=android-15
-android.library=true
-
diff --git a/testapps/customViewTest/libWithCustomView/res/layout/main.xml b/testapps/customViewTest/libWithCustomView/res/layout/main.xml
deleted file mode 100644
index c906a76..0000000
--- a/testapps/customViewTest/libWithCustomView/res/layout/main.xml
+++ /dev/null
@@ -1,46 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-     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.
--->
-
-<!-- Demonstrates defining custom views in a layout file. -->
-
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:app="http://schemas.android.com/apk/res-auto"
-    android:layout_width="match_parent"
-    android:layout_height="wrap_content"
-    android:orientation="vertical" >
-
-    <com.android.tests.libwithcustom.LabelView
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:background="@drawable/red"
-        app:text="Red" />
-
-    <com.android.tests.libwithcustom.LabelView
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:background="@drawable/blue"
-        app:text="Blue"
-        app:textSize="20dp" />
-
-    <com.android.tests.libwithcustom.LabelView
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:background="@drawable/green"
-        app:text="Green"
-        app:textColor="#ffffffff" />
-
-</LinearLayout>
\ No newline at end of file
diff --git a/testapps/customViewTest/libWithCustomView/res/values/attrs.xml b/testapps/customViewTest/libWithCustomView/res/values/attrs.xml
deleted file mode 100644
index f173e02..0000000
--- a/testapps/customViewTest/libWithCustomView/res/values/attrs.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-     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.
--->
-
-<resources>
-
-    <declare-styleable name="LabelView">
-        <attr name="text" format="string" />
-        <attr name="textColor" format="color" />
-        <attr name="textSize" format="dimension" />
-    </declare-styleable>
-
-    <drawable name="red">#7f00</drawable>
-    <drawable name="blue">#770000ff</drawable>
-    <drawable name="green">#7700ff00</drawable>
-
-</resources>
\ No newline at end of file
diff --git a/testapps/customViewTest/libWithCustomView/res/values/strings.xml b/testapps/customViewTest/libWithCustomView/res/values/strings.xml
deleted file mode 100644
index 3fa203a..0000000
--- a/testapps/customViewTest/libWithCustomView/res/values/strings.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<resources>
-    <string name="app_name">MyActivity</string>
-</resources>
diff --git a/testapps/customViewTest/libWithCustomView/src/com/android/tests/libwithcustom/LabelView.java b/testapps/customViewTest/libWithCustomView/src/com/android/tests/libwithcustom/LabelView.java
deleted file mode 100644
index d0b62e9..0000000
--- a/testapps/customViewTest/libWithCustomView/src/com/android/tests/libwithcustom/LabelView.java
+++ /dev/null
@@ -1,193 +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.tests.libwithcustom;
-
-// Need the following import to get access to the app resources, since this
-// class is in a sub-package.
-import android.content.Context;
-import android.content.res.TypedArray;
-import android.graphics.Canvas;
-import android.graphics.Paint;
-import android.util.AttributeSet;
-import android.view.View;
-
-
-/**
- * Example of how to write a custom subclass of View. LabelView
- * is used to draw simple text views. Note that it does not handle
- * styled text or right-to-left writing systems.
- *
- */
-public class LabelView extends View {
-    private Paint mTextPaint;
-    private String mText;
-    private int mAscent;
-    
-    /**
-     * Constructor.  This version is only needed if you will be instantiating
-     * the object manually (not from a layout XML file).
-     * @param context
-     */
-    public LabelView(Context context) {
-        super(context);
-        initLabelView();
-    }
-
-    /**
-     * Construct object, initializing with any attributes we understand from a
-     * layout file. These attributes are defined in
-     * SDK/assets/res/any/classes.xml.
-     * 
-     * @see android.view.View#View(android.content.Context, android.util.AttributeSet)
-     */
-    public LabelView(Context context, AttributeSet attrs) {
-        super(context, attrs);
-        initLabelView();
-
-        
-        TypedArray a = context.obtainStyledAttributes(attrs,
-                R.styleable.LabelView);
-
-        CharSequence s = a.getString(R.styleable.LabelView_text);
-        if (s != null) {
-            setText(s.toString());
-        }
-
-        // Retrieve the color(s) to be used for this view and apply them.
-        // Note, if you only care about supporting a single color, that you
-        // can instead call a.getColor() and pass that to setTextColor().
-        setTextColor(a.getColor(R.styleable.LabelView_textColor, 0xFF000000));
-
-        int textSize = a.getDimensionPixelOffset(R.styleable.LabelView_textSize, 0);
-        if (textSize > 0) {
-            setTextSize(textSize);
-        }
-
-        a.recycle();
-    }
-
-    private final void initLabelView() {
-        mTextPaint = new Paint();
-        mTextPaint.setAntiAlias(true);
-        // Must manually scale the desired text size to match screen density
-        mTextPaint.setTextSize(16 * getResources().getDisplayMetrics().density);
-        mTextPaint.setColor(0xFF000000);
-        setPadding(3, 3, 3, 3);
-    }
-
-    /**
-     * Sets the text to display in this label
-     * @param text The text to display. This will be drawn as one line.
-     */
-    public void setText(String text) {
-        mText = text;
-        requestLayout();
-        invalidate();
-    }
-
-    /**
-     * Sets the text size for this label
-     * @param size Font size
-     */
-    public void setTextSize(int size) {
-        // This text size has been pre-scaled by the getDimensionPixelOffset method
-        mTextPaint.setTextSize(size);
-        requestLayout();
-        invalidate();
-    }
-
-    /**
-     * Sets the text color for this label.
-     * @param color ARGB value for the text
-     */
-    public void setTextColor(int color) {
-        mTextPaint.setColor(color);
-        invalidate();
-    }
-
-    /**
-     * @see android.view.View#measure(int, int)
-     */
-    @Override
-    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
-        setMeasuredDimension(measureWidth(widthMeasureSpec),
-                measureHeight(heightMeasureSpec));
-    }
-
-    /**
-     * Determines the width of this view
-     * @param measureSpec A measureSpec packed into an int
-     * @return The width of the view, honoring constraints from measureSpec
-     */
-    private int measureWidth(int measureSpec) {
-        int result = 0;
-        int specMode = MeasureSpec.getMode(measureSpec);
-        int specSize = MeasureSpec.getSize(measureSpec);
-
-        if (specMode == MeasureSpec.EXACTLY) {
-            // We were told how big to be
-            result = specSize;
-        } else {
-            // Measure the text
-            result = (int) mTextPaint.measureText(mText) + getPaddingLeft()
-                    + getPaddingRight();
-            if (specMode == MeasureSpec.AT_MOST) {
-                // Respect AT_MOST value if that was what is called for by measureSpec
-                result = Math.min(result, specSize);
-            }
-        }
-
-        return result;
-    }
-
-    /**
-     * Determines the height of this view
-     * @param measureSpec A measureSpec packed into an int
-     * @return The height of the view, honoring constraints from measureSpec
-     */
-    private int measureHeight(int measureSpec) {
-        int result = 0;
-        int specMode = MeasureSpec.getMode(measureSpec);
-        int specSize = MeasureSpec.getSize(measureSpec);
-
-        mAscent = (int) mTextPaint.ascent();
-        if (specMode == MeasureSpec.EXACTLY) {
-            // We were told how big to be
-            result = specSize;
-        } else {
-            // Measure the text (beware: ascent is a negative number)
-            result = (int) (-mAscent + mTextPaint.descent()) + getPaddingTop()
-                    + getPaddingBottom();
-            if (specMode == MeasureSpec.AT_MOST) {
-                // Respect AT_MOST value if that was what is called for by measureSpec
-                result = Math.min(result, specSize);
-            }
-        }
-        return result;
-    }
-
-    /**
-     * Render the text
-     * 
-     * @see android.view.View#onDraw(android.graphics.Canvas)
-     */
-    @Override
-    protected void onDraw(Canvas canvas) {
-        super.onDraw(canvas);
-        canvas.drawText(mText, getPaddingLeft(), getPaddingTop() - mAscent, mTextPaint);
-    }
-}
diff --git a/testapps/customViewTest/mainProject/.classpath b/testapps/customViewTest/mainProject/.classpath
deleted file mode 100644
index a4763d1..0000000
--- a/testapps/customViewTest/mainProject/.classpath
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="src" path="gen"/>
-	<classpathentry kind="con" path="com.android.ide.eclipse.adt.ANDROID_FRAMEWORK"/>
-	<classpathentry kind="con" path="com.android.ide.eclipse.adt.LIBRARIES"/>
-	<classpathentry kind="output" path="bin/classes"/>
-</classpath>
diff --git a/testapps/customViewTest/mainProject/.project b/testapps/customViewTest/mainProject/.project
deleted file mode 100644
index 159296e..0000000
--- a/testapps/customViewTest/mainProject/.project
+++ /dev/null
@@ -1,33 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>customViewTest-mainProject</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>com.android.ide.eclipse.adt.ResourceManagerBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>com.android.ide.eclipse.adt.PreCompilerBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>com.android.ide.eclipse.adt.ApkBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>com.android.ide.eclipse.adt.AndroidNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/testapps/customViewTest/mainProject/AndroidManifest.xml b/testapps/customViewTest/mainProject/AndroidManifest.xml
deleted file mode 100644
index ff41761..0000000
--- a/testapps/customViewTest/mainProject/AndroidManifest.xml
+++ /dev/null
@@ -1,15 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
-      package="com.android.tests.projectwithsupport"
-      android:versionCode="1"
-      android:versionName="1.0">
-    <application android:label="@string/app_name">
-        <activity android:name=".MyActivity"
-                  android:label="@string/app_name">
-            <intent-filter>
-                <action android:name="android.intent.action.MAIN" />
-                <category android:name="android.intent.category.LAUNCHER" />
-            </intent-filter>
-        </activity>
-    </application>
-</manifest> 
diff --git a/testapps/customViewTest/mainProject/ant.properties b/testapps/customViewTest/mainProject/ant.properties
deleted file mode 100644
index ee52d86..0000000
--- a/testapps/customViewTest/mainProject/ant.properties
+++ /dev/null
@@ -1,17 +0,0 @@
-# This file is used to override default values used by the Ant build system.
-#
-# This file must be checked in Version Control Systems, as it is
-# integral to the build system of your project.
-
-# This file is only used by the Ant script.
-
-# You can use this to override default values such as
-#  'source.dir' for the location of your java source folder and
-#  'out.dir' for the location of your output folder.
-
-# You can also use it define how the release builds are signed by declaring
-# the following properties:
-#  'key.store' for the location of your keystore and
-#  'key.alias' for the name of the key to use.
-# The password will be asked during the build when you use the 'release' target.
-
diff --git a/testapps/customViewTest/mainProject/build.xml b/testapps/customViewTest/mainProject/build.xml
deleted file mode 100644
index 2f98bb5..0000000
--- a/testapps/customViewTest/mainProject/build.xml
+++ /dev/null
@@ -1,90 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project name="customViewTest-mainProject" default="help">
-
-    <!-- The local.properties file is created and updated by the 'android' tool.
-         It contains the path to the SDK. It should *NOT* be checked into
-         Version Control Systems. -->
-    <property file="local.properties" />
-
-    <!-- The ant.properties file can be created by you. It is only edited by the
-         'android' tool to add properties to it.
-         This is the place to change some Ant specific build properties.
-         Here are some properties you may want to change/update:
-
-         source.dir
-             The name of the source directory. Default is 'src'.
-         out.dir
-             The name of the output directory. Default is 'bin'.
-
-         For other overridable properties, look at the beginning of the rules
-         files in the SDK, at tools/ant/build.xml
-
-         Properties related to the SDK location or the project target should
-         be updated using the 'android' tool with the 'update' action.
-
-         This file is an integral part of the build system for your
-         application and should be checked into Version Control Systems.
-
-         -->
-    <property file="ant.properties" />
-
-    <!-- The project.properties file is created and updated by the 'android'
-         tool, as well as ADT.
-
-         This contains project specific properties such as project target, and library
-         dependencies. Lower level build properties are stored in ant.properties
-         (or in .classpath for Eclipse projects).
-
-         This file is an integral part of the build system for your
-         application and should be checked into Version Control Systems. -->
-    <loadproperties srcFile="project.properties" />
-
-    <!-- if sdk.dir was not set from one of the property file, then
-         get it from the ANDROID_HOME env var. -->
-    <property environment="env" />
-    <condition property="sdk.dir" value="${env.ANDROID_HOME}">
-        <isset property="env.ANDROID_HOME" />
-    </condition>
-
-    <!-- quick check on sdk.dir -->
-    <fail
-            message="sdk.dir is missing. Make sure to generate local.properties using 'android update project' or to inject it through the ANDROID_HOME environment variable."
-            unless="sdk.dir"
-    />
-
-    <!--
-        Import per project custom build rules if present at the root of the project.
-        This is the place to put custom intermediary targets such as:
-            -pre-build
-            -pre-compile
-            -post-compile (This is typically used for code obfuscation.
-                           Compiled code location: ${out.classes.absolute.dir}
-                           If this is not done in place, override ${out.dex.input.absolute.dir})
-            -post-package
-            -post-build
-            -pre-clean
-    -->
-    <import file="custom_rules.xml" optional="true" />
-
-    <!-- Import the actual build file.
-
-         To customize existing targets, there are two options:
-         - Customize only one target:
-             - copy/paste the target into this file, *before* the
-               <import> task.
-             - customize it to your needs.
-         - Customize the whole content of build.xml
-             - copy/paste the content of the rules files (minus the top node)
-               into this file, replacing the <import> task.
-             - customize to your needs.
-
-         ***********************
-         ****** IMPORTANT ******
-         ***********************
-         In all cases you must update the value of version-tag below to read 'custom' instead of an integer,
-         in order to avoid having your file be overridden by tools such as "android update project"
-    -->
-    <!-- version-tag: 1 -->
-    <import file="${sdk.dir}/tools/ant/build.xml" />
-
-</project>
diff --git a/testapps/customViewTest/mainProject/libs/foo.txt b/testapps/customViewTest/mainProject/libs/foo.txt
deleted file mode 100644
index fe0c852..0000000
--- a/testapps/customViewTest/mainProject/libs/foo.txt
+++ /dev/null
@@ -1 +0,0 @@
-sdf
\ No newline at end of file
diff --git a/testapps/customViewTest/mainProject/proguard-project.txt b/testapps/customViewTest/mainProject/proguard-project.txt
deleted file mode 100644
index f2fe155..0000000
--- a/testapps/customViewTest/mainProject/proguard-project.txt
+++ /dev/null
@@ -1,20 +0,0 @@
-# To enable ProGuard in your project, edit project.properties
-# to define the proguard.config property as described in that file.
-#
-# Add project specific ProGuard rules here.
-# By default, the flags in this file are appended to flags specified
-# in ${sdk.dir}/tools/proguard/proguard-android.txt
-# You can edit the include path and order by changing the ProGuard
-# include property in project.properties.
-#
-# For more details, see
-#   http://developer.android.com/guide/developing/tools/proguard.html
-
-# Add any project specific keep options here:
-
-# If your project uses WebView with JS, uncomment the following
-# and specify the fully qualified class name to the JavaScript interface
-# class:
-#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
-#   public *;
-#}
diff --git a/testapps/customViewTest/mainProject/project.properties b/testapps/customViewTest/mainProject/project.properties
deleted file mode 100644
index 21d68c5..0000000
--- a/testapps/customViewTest/mainProject/project.properties
+++ /dev/null
@@ -1,15 +0,0 @@
-# This file is automatically generated by Android Tools.
-# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
-#
-# This file must be checked in Version Control Systems.
-#
-# To customize properties used by the Ant build system use,
-# "ant.properties", and override values to adapt the script to your
-# project structure.
-
-# Project target.
-target=android-15
-android.library.reference.1=../libWithCustomView
-
-# To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home):
-proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt
diff --git a/testapps/customViewTest/mainProject/res/values/strings.xml b/testapps/customViewTest/mainProject/res/values/strings.xml
deleted file mode 100644
index e86ca41..0000000
--- a/testapps/customViewTest/mainProject/res/values/strings.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<resources>
-    <string name="app_name">customViewTest</string>
-</resources>
diff --git a/testapps/customViewTest/mainProject/src/com/android/tests/projectwithsupport/MyActivity.java b/testapps/customViewTest/mainProject/src/com/android/tests/projectwithsupport/MyActivity.java
deleted file mode 100644
index c065839..0000000
--- a/testapps/customViewTest/mainProject/src/com/android/tests/projectwithsupport/MyActivity.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package com.android.tests.projectwithsupport;
-
-import android.app.Activity;
-import android.os.Bundle;
-
-public class MyActivity extends Activity
-{
-    /** Called when the activity is first created. */
-    @Override
-    public void onCreate(Bundle savedInstanceState)
-    {
-        super.onCreate(savedInstanceState);
-        setContentView(R.layout.main);
-    }
-}
diff --git a/testapps/gridlayoutTest/COMPILE_AND_RUN b/testapps/gridlayoutTest/COMPILE_AND_RUN
deleted file mode 100644
index e69de29..0000000
--- a/testapps/gridlayoutTest/COMPILE_AND_RUN
+++ /dev/null
diff --git a/testapps/gridlayoutTest/SUCCESS b/testapps/gridlayoutTest/SUCCESS
deleted file mode 100644
index e69de29..0000000
--- a/testapps/gridlayoutTest/SUCCESS
+++ /dev/null
diff --git a/testapps/gridlayoutTest/app/.classpath b/testapps/gridlayoutTest/app/.classpath
deleted file mode 100644
index a4763d1..0000000
--- a/testapps/gridlayoutTest/app/.classpath
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="src" path="gen"/>
-	<classpathentry kind="con" path="com.android.ide.eclipse.adt.ANDROID_FRAMEWORK"/>
-	<classpathentry kind="con" path="com.android.ide.eclipse.adt.LIBRARIES"/>
-	<classpathentry kind="output" path="bin/classes"/>
-</classpath>
diff --git a/testapps/gridlayoutTest/app/.project b/testapps/gridlayoutTest/app/.project
deleted file mode 100644
index 9a73e09..0000000
--- a/testapps/gridlayoutTest/app/.project
+++ /dev/null
@@ -1,33 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>gridlayouttest-app</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>com.android.ide.eclipse.adt.ResourceManagerBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>com.android.ide.eclipse.adt.PreCompilerBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>com.android.ide.eclipse.adt.ApkBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>com.android.ide.eclipse.adt.AndroidNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/testapps/gridlayoutTest/app/AndroidManifest.xml b/testapps/gridlayoutTest/app/AndroidManifest.xml
deleted file mode 100644
index f85d20f..0000000
--- a/testapps/gridlayoutTest/app/AndroidManifest.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
-    package="com.android.test.gridlayout"
-    android:versionCode="1"
-    android:versionName="1.0" >
-
-    <uses-sdk android:minSdkVersion="7" />
-
-    <application
-        android:icon="@drawable/ic_launcher"
-        android:label="@string/app_name" >
-        <activity
-            android:name="Main"
-            android:label="@string/app_name" >
-            <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/testapps/gridlayoutTest/app/ant.properties b/testapps/gridlayoutTest/app/ant.properties
deleted file mode 100644
index b0971e8..0000000
--- a/testapps/gridlayoutTest/app/ant.properties
+++ /dev/null
@@ -1,17 +0,0 @@
-# This file is used to override default values used by the Ant build system.
-#
-# This file must be checked into Version Control Systems, as it is
-# integral to the build system of your project.
-
-# This file is only used by the Ant script.
-
-# You can use this to override default values such as
-#  'source.dir' for the location of your java source folder and
-#  'out.dir' for the location of your output folder.
-
-# You can also use it define how the release builds are signed by declaring
-# the following properties:
-#  'key.store' for the location of your keystore and
-#  'key.alias' for the name of the key to use.
-# The password will be asked during the build when you use the 'release' target.
-
diff --git a/testapps/gridlayoutTest/app/build.xml b/testapps/gridlayoutTest/app/build.xml
deleted file mode 100644
index 1160e8a..0000000
--- a/testapps/gridlayoutTest/app/build.xml
+++ /dev/null
@@ -1,83 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project name="app" default="help">
-
-    <!-- The local.properties file is created and updated by the 'android' tool.
-         It contains the path to the SDK. It should *NOT* be checked into
-         Version Control Systems. -->
-    <property file="local.properties" />
-
-    <!-- The ant.properties file can be created by you. It is only edited by the
-         'android' tool to add properties to it.
-         This is the place to change some Ant specific build properties.
-         Here are some properties you may want to change/update:
-
-         source.dir
-             The name of the source directory. Default is 'src'.
-         out.dir
-             The name of the output directory. Default is 'bin'.
-
-         For other overridable properties, look at the beginning of the rules
-         files in the SDK, at tools/ant/build.xml
-
-         Properties related to the SDK location or the project target should
-         be updated using the 'android' tool with the 'update' action.
-
-         This file is an integral part of the build system for your
-         application and should be checked into Version Control Systems.
-
-         -->
-    <property file="ant.properties" />
-
-    <!-- The project.properties file is created and updated by the 'android'
-         tool, as well as ADT.
-
-         This contains project specific properties such as project target, and library
-         dependencies. Lower level build properties are stored in ant.properties
-         (or in .classpath for Eclipse projects).
-
-         This file is an integral part of the build system for your
-         application and should be checked into Version Control Systems. -->
-    <loadproperties srcFile="project.properties" />
-
-    <!-- quick check on sdk.dir -->
-    <fail
-            message="sdk.dir is missing. Make sure to generate local.properties using 'android update project' or to inject it through an env var"
-            unless="sdk.dir"
-    />
-
-    <!--
-        Import per project custom build rules if present at the root of the project.
-        This is the place to put custom intermediary targets such as:
-            -pre-build
-            -pre-compile
-            -post-compile (This is typically used for code obfuscation.
-                           Compiled code location: ${out.classes.absolute.dir}
-                           If this is not done in place, override ${out.dex.input.absolute.dir})
-            -post-package
-            -post-build
-            -pre-clean
-    -->
-    <import file="custom_rules.xml" optional="true" />
-
-    <!-- Import the actual build file.
-
-         To customize existing targets, there are two options:
-         - Customize only one target:
-             - copy/paste the target into this file, *before* the
-               <import> task.
-             - customize it to your needs.
-         - Customize the whole content of build.xml
-             - copy/paste the content of the rules files (minus the top node)
-               into this file, replacing the <import> task.
-             - customize to your needs.
-
-         ***********************
-         ****** IMPORTANT ******
-         ***********************
-         In all cases you must update the value of version-tag below to read 'custom' instead of an integer,
-         in order to avoid having your file be overridden by tools such as "android update project"
-    -->
-    <!-- version-tag: 1 -->
-    <import file="${sdk.dir}/tools/ant/build.xml" />
-
-</project>
diff --git a/testapps/gridlayoutTest/app/proguard-project.txt b/testapps/gridlayoutTest/app/proguard-project.txt
deleted file mode 100644
index f2fe155..0000000
--- a/testapps/gridlayoutTest/app/proguard-project.txt
+++ /dev/null
@@ -1,20 +0,0 @@
-# To enable ProGuard in your project, edit project.properties
-# to define the proguard.config property as described in that file.
-#
-# Add project specific ProGuard rules here.
-# By default, the flags in this file are appended to flags specified
-# in ${sdk.dir}/tools/proguard/proguard-android.txt
-# You can edit the include path and order by changing the ProGuard
-# include property in project.properties.
-#
-# For more details, see
-#   http://developer.android.com/guide/developing/tools/proguard.html
-
-# Add any project specific keep options here:
-
-# If your project uses WebView with JS, uncomment the following
-# and specify the fully qualified class name to the JavaScript interface
-# class:
-#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
-#   public *;
-#}
diff --git a/testapps/gridlayoutTest/app/project.properties b/testapps/gridlayoutTest/app/project.properties
deleted file mode 100644
index 5fe06bd..0000000
--- a/testapps/gridlayoutTest/app/project.properties
+++ /dev/null
@@ -1,15 +0,0 @@
-# This file is automatically generated by Android Tools.
-# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
-#
-# This file must be checked in Version Control Systems.
-#
-# To customize properties used by the Ant build system edit
-# "ant.properties", and override values to adapt the script to your
-# project structure.
-#
-# To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home):
-#proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt
-
-# Project target.
-target=android-15
-android.library.reference.1=../v7-gridlayout
diff --git a/testapps/gridlayoutTest/app/res/drawable-hdpi/ic_launcher.png b/testapps/gridlayoutTest/app/res/drawable-hdpi/ic_launcher.png
deleted file mode 100644
index 8074c4c..0000000
--- a/testapps/gridlayoutTest/app/res/drawable-hdpi/ic_launcher.png
+++ /dev/null
Binary files differ
diff --git a/testapps/gridlayoutTest/app/res/drawable-ldpi/ic_launcher.png b/testapps/gridlayoutTest/app/res/drawable-ldpi/ic_launcher.png
deleted file mode 100644
index 1095584..0000000
--- a/testapps/gridlayoutTest/app/res/drawable-ldpi/ic_launcher.png
+++ /dev/null
Binary files differ
diff --git a/testapps/gridlayoutTest/app/res/drawable-mdpi/ic_launcher.png b/testapps/gridlayoutTest/app/res/drawable-mdpi/ic_launcher.png
deleted file mode 100644
index a07c69f..0000000
--- a/testapps/gridlayoutTest/app/res/drawable-mdpi/ic_launcher.png
+++ /dev/null
Binary files differ
diff --git a/testapps/gridlayoutTest/app/res/layout/main.xml b/testapps/gridlayoutTest/app/res/layout/main.xml
deleted file mode 100644
index 75f5600..0000000
--- a/testapps/gridlayoutTest/app/res/layout/main.xml
+++ /dev/null
@@ -1,72 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<android.support.v7.widget.GridLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:app="http://schemas.android.com/apk/res-auto"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    app:columnCount="6" >
-
-    <Button
-        android:id="@+id/button1"
-        app:layout_column="1"
-        app:layout_columnSpan="2"
-        app:layout_gravity="left"
-        app:layout_row="1"
-        android:text="Button" />
-
-    <CheckBox
-        android:id="@+id/checkBox1"
-        app:layout_column="4"
-        app:layout_gravity="left"
-        app:layout_row="2"
-        android:text="CheckBox" />
-
-    <Button
-        android:id="@+id/button2"
-        app:layout_column="5"
-        app:layout_gravity="left"
-        app:layout_row="3"
-        android:text="Button" />
-
-    <android.support.v7.widget.Space
-        android:layout_width="21dp"
-        android:layout_height="1dp"
-        app:layout_column="0"
-        app:layout_gravity="fill_horizontal"
-        app:layout_row="0" />
-
-    <android.support.v7.widget.Space
-        android:layout_width="1dp"
-        android:layout_height="21dp"
-        app:layout_column="0"
-        app:layout_gravity="fill_horizontal"
-        app:layout_row="0" />
-
-    <android.support.v7.widget.Space
-        android:layout_width="10dp"
-        android:layout_height="1dp"
-        app:layout_column="3"
-        app:layout_gravity="fill_horizontal"
-        app:layout_row="0" />
-
-    <android.support.v7.widget.Space
-        android:layout_width="122dp"
-        android:layout_height="1dp"
-        app:layout_column="4"
-        app:layout_gravity="fill_horizontal"
-        app:layout_row="0" />
-
-    <android.support.v7.widget.Space
-        android:layout_width="1dp"
-        android:layout_height="168dp"
-        app:layout_column="0"
-        app:layout_gravity="fill_horizontal"
-        app:layout_row="1" />
-
-    <android.support.v7.widget.Space
-        android:layout_width="1dp"
-        android:layout_height="168dp"
-        app:layout_column="0"
-        app:layout_gravity="fill_horizontal"
-        app:layout_row="2" />
-
-</android.support.v7.widget.GridLayout>
\ No newline at end of file
diff --git a/testapps/gridlayoutTest/app/res/values/strings.xml b/testapps/gridlayoutTest/app/res/values/strings.xml
deleted file mode 100644
index 549e4ea..0000000
--- a/testapps/gridlayoutTest/app/res/values/strings.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<resources>
-    <string name="app_name">Main</string>
-</resources>
diff --git a/testapps/gridlayoutTest/app/src/com/android/test/gridlayout/Main.java b/testapps/gridlayoutTest/app/src/com/android/test/gridlayout/Main.java
deleted file mode 100644
index bf817df..0000000
--- a/testapps/gridlayoutTest/app/src/com/android/test/gridlayout/Main.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package com.android.test.gridlayout;
-
-import android.app.Activity;
-import android.os.Bundle;
-
-public class Main extends Activity
-{
-    /** Called when the activity is first created. */
-    @Override
-    public void onCreate(Bundle savedInstanceState)
-    {
-        super.onCreate(savedInstanceState);
-        setContentView(R.layout.main);
-    }
-}
diff --git a/testapps/gridlayoutTest/v7-gridlayout/.classpath b/testapps/gridlayoutTest/v7-gridlayout/.classpath
deleted file mode 100644
index a4763d1..0000000
--- a/testapps/gridlayoutTest/v7-gridlayout/.classpath
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="src" path="gen"/>
-	<classpathentry kind="con" path="com.android.ide.eclipse.adt.ANDROID_FRAMEWORK"/>
-	<classpathentry kind="con" path="com.android.ide.eclipse.adt.LIBRARIES"/>
-	<classpathentry kind="output" path="bin/classes"/>
-</classpath>
diff --git a/testapps/gridlayoutTest/v7-gridlayout/.project b/testapps/gridlayoutTest/v7-gridlayout/.project
deleted file mode 100644
index 1e67516..0000000
--- a/testapps/gridlayoutTest/v7-gridlayout/.project
+++ /dev/null
@@ -1,33 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>android-support-v7-gridlayout</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>com.android.ide.eclipse.adt.ResourceManagerBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>com.android.ide.eclipse.adt.PreCompilerBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>com.android.ide.eclipse.adt.ApkBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>com.android.ide.eclipse.adt.AndroidNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/testapps/gridlayoutTest/v7-gridlayout/AndroidManifest.xml b/testapps/gridlayoutTest/v7-gridlayout/AndroidManifest.xml
deleted file mode 100644
index c3f7168..0000000
--- a/testapps/gridlayoutTest/v7-gridlayout/AndroidManifest.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
-    package="android.support.v7.gridlayout"
-    android:versionCode="1"
-    android:versionName="1.0" >
-
-    <uses-sdk android:minSdkVersion="7" />
-
-</manifest>
diff --git a/testapps/gridlayoutTest/v7-gridlayout/build.xml b/testapps/gridlayoutTest/v7-gridlayout/build.xml
deleted file mode 100644
index a03e2b6..0000000
--- a/testapps/gridlayoutTest/v7-gridlayout/build.xml
+++ /dev/null
@@ -1,83 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project name="v7-gridlayout" default="help">
-
-    <!-- The local.properties file is created and updated by the 'android' tool.
-         It contains the path to the SDK. It should *NOT* be checked into
-         Version Control Systems. -->
-    <property file="local.properties" />
-
-    <!-- The ant.properties file can be created by you. It is only edited by the
-         'android' tool to add properties to it.
-         This is the place to change some Ant specific build properties.
-         Here are some properties you may want to change/update:
-
-         source.dir
-             The name of the source directory. Default is 'src'.
-         out.dir
-             The name of the output directory. Default is 'bin'.
-
-         For other overridable properties, look at the beginning of the rules
-         files in the SDK, at tools/ant/build.xml
-
-         Properties related to the SDK location or the project target should
-         be updated using the 'android' tool with the 'update' action.
-
-         This file is an integral part of the build system for your
-         application and should be checked into Version Control Systems.
-
-         -->
-    <property file="ant.properties" />
-
-    <!-- The project.properties file is created and updated by the 'android'
-         tool, as well as ADT.
-
-         This contains project specific properties such as project target, and library
-         dependencies. Lower level build properties are stored in ant.properties
-         (or in .classpath for Eclipse projects).
-
-         This file is an integral part of the build system for your
-         application and should be checked into Version Control Systems. -->
-    <loadproperties srcFile="project.properties" />
-
-    <!-- quick check on sdk.dir -->
-    <fail
-            message="sdk.dir is missing. Make sure to generate local.properties using 'android update project' or to inject it through an env var"
-            unless="sdk.dir"
-    />
-
-    <!--
-        Import per project custom build rules if present at the root of the project.
-        This is the place to put custom intermediary targets such as:
-            -pre-build
-            -pre-compile
-            -post-compile (This is typically used for code obfuscation.
-                           Compiled code location: ${out.classes.absolute.dir}
-                           If this is not done in place, override ${out.dex.input.absolute.dir})
-            -post-package
-            -post-build
-            -pre-clean
-    -->
-    <import file="custom_rules.xml" optional="true" />
-
-    <!-- Import the actual build file.
-
-         To customize existing targets, there are two options:
-         - Customize only one target:
-             - copy/paste the target into this file, *before* the
-               <import> task.
-             - customize it to your needs.
-         - Customize the whole content of build.xml
-             - copy/paste the content of the rules files (minus the top node)
-               into this file, replacing the <import> task.
-             - customize to your needs.
-
-         ***********************
-         ****** IMPORTANT ******
-         ***********************
-         In all cases you must update the value of version-tag below to read 'custom' instead of an integer,
-         in order to avoid having your file be overridden by tools such as "android update project"
-    -->
-    <!-- version-tag: 1 -->
-    <import file="${sdk.dir}/tools/ant/build.xml" />
-
-</project>
diff --git a/testapps/gridlayoutTest/v7-gridlayout/libs/android-support-v7-gridlayout.jar b/testapps/gridlayoutTest/v7-gridlayout/libs/android-support-v7-gridlayout.jar
deleted file mode 100644
index 00a946d..0000000
--- a/testapps/gridlayoutTest/v7-gridlayout/libs/android-support-v7-gridlayout.jar
+++ /dev/null
Binary files differ
diff --git a/testapps/gridlayoutTest/v7-gridlayout/proguard-project.txt b/testapps/gridlayoutTest/v7-gridlayout/proguard-project.txt
deleted file mode 100644
index f2fe155..0000000
--- a/testapps/gridlayoutTest/v7-gridlayout/proguard-project.txt
+++ /dev/null
@@ -1,20 +0,0 @@
-# To enable ProGuard in your project, edit project.properties
-# to define the proguard.config property as described in that file.
-#
-# Add project specific ProGuard rules here.
-# By default, the flags in this file are appended to flags specified
-# in ${sdk.dir}/tools/proguard/proguard-android.txt
-# You can edit the include path and order by changing the ProGuard
-# include property in project.properties.
-#
-# For more details, see
-#   http://developer.android.com/guide/developing/tools/proguard.html
-
-# Add any project specific keep options here:
-
-# If your project uses WebView with JS, uncomment the following
-# and specify the fully qualified class name to the JavaScript interface
-# class:
-#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
-#   public *;
-#}
diff --git a/testapps/gridlayoutTest/v7-gridlayout/project.properties b/testapps/gridlayoutTest/v7-gridlayout/project.properties
deleted file mode 100644
index 36f1594..0000000
--- a/testapps/gridlayoutTest/v7-gridlayout/project.properties
+++ /dev/null
@@ -1,15 +0,0 @@
-# This file is automatically generated by Android Tools.
-# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
-#
-# This file must be checked in Version Control Systems.
-#
-# To customize properties used by the Ant build system edit
-# "ant.properties", and override values to adapt the script to your
-# project structure.
-#
-# To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home):
-#proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt
-
-# Project target.
-target=android-15
-android.library=true
diff --git a/testapps/gridlayoutTest/v7-gridlayout/res/values/attrs.xml b/testapps/gridlayoutTest/v7-gridlayout/res/values/attrs.xml
deleted file mode 100644
index ad2ef4e..0000000
--- a/testapps/gridlayoutTest/v7-gridlayout/res/values/attrs.xml
+++ /dev/null
@@ -1,198 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<resources>
-
-    <declare-styleable name="GridLayout">
-
-        <!--
-              support versions. All attributes not present in ViewGroup/View are
-              redefined in the support library namespace.
-        -->
-
-
-        <!--
-        The orientation property is not used during layout. It is only used to
-        allocate row and column parameters when they are not specified by its children's
-        layout parameters. GridLayout works like LinearLayout in this case;
-        putting all the components either in a single row or in a single column -
-        depending on the value of this flag. In the horizontal case, a columnCount
-        property may be additionally supplied to force new rows to be created when a
-        row is full. The rowCount attribute may be used similarly in the vertical case.
-        The default is horizontal.
-        -->
-        <attr name="orientation">
-
-            <!-- Defines an horizontal widget. -->
-            <enum name="horizontal" value="0" />
-            <!-- Defines a vertical widget. -->
-            <enum name="vertical" value="1" />
-        </attr>
-        <!-- The maximum number of rows to create when automatically positioning children. -->
-        <attr name="rowCount" format="integer" />
-        <!-- The maximum number of columns to create when automatically positioning children. -->
-        <attr name="columnCount" format="integer" />
-        <!--
-        When set to true, tells GridLayout to use default margins when none are specified
-        in a view's layout parameters.
-        The default value is false.
-        See {@link android.widget.GridLayout#setUseDefaultMargins(boolean)}.
-        -->
-        <attr name="useDefaultMargins" format="boolean" />
-        <!--
-        When set to alignMargins, causes alignment to take place between the outer
-        boundary of a view, as defined by its margins. When set to alignBounds,
-        causes alignment to take place between the edges of the view.
-        The default is alignMargins.
-        See {@link android.widget.GridLayout#setAlignmentMode(int)}.
-        -->
-        <attr name="alignmentMode">
-
-            <!--
-            Align the bounds of the children.
-            See {@link android.widget.GridLayout#ALIGN_BOUNDS}.
-            -->
-            <enum name="alignBounds" value="0" />
-            <!--
-            Align the margins of the children.
-            See {@link android.widget.GridLayout#ALIGN_MARGINS}.
-            -->
-            <enum name="alignMargins" value="1" />
-        </attr>
-        <!--
-        When set to true, forces row boundaries to appear in the same order
-        as row indices.
-        The default is true.
-        See {@link android.widget.GridLayout#setRowOrderPreserved(boolean)}.
-        -->
-        <attr name="rowOrderPreserved" format="boolean" />
-        <!--
-        When set to true, forces column boundaries to appear in the same order
-        as column indices.
-        The default is true.
-        See {@link android.widget.GridLayout#setColumnOrderPreserved(boolean)}.
-        -->
-        <attr name="columnOrderPreserved" format="boolean" />
-    </declare-styleable>
-    <declare-styleable name="GridLayout_Layout">
-
-        <!--
-              support versions. All attributes not present in MarginLayout are
-              redefined in the support library name space.
-        -->
-
-
-        <!-- START MarginLayout layoutparams -->
-
-        <attr name="android:layout_width" />
-        <attr name="android:layout_height" />
-        <!--
-              Specifies extra space on the left, top, right and bottom
-              sides of this view. This space is outside this view's bounds.
-        -->
-        <attr name="android:layout_margin" />
-        <!--
-              Specifies extra space on the left side of this view.
-              This space is outside this view's bounds.
-        -->
-        <attr name="android:layout_marginLeft" />
-        <!--
-              Specifies extra space on the top side of this view.
-              This space is outside this view's bounds.
-        -->
-        <attr name="android:layout_marginTop" />
-        <!--
-              Specifies extra space on the right side of this view.
-              This space is outside this view's bounds.
-        -->
-        <attr name="android:layout_marginRight" />
-        <!--
-              Specifies extra space on the bottom side of this view.
-              This space is outside this view's bounds.
-        -->
-        <attr name="android:layout_marginBottom" />
-        <!--
-              Specifies extra space on the start side of this view.
-              This space is outside this view's bounds.
-        -->
-        <attr name="android:layout_marginStart" />
-        <!--
-              Specifies extra space on the end side of this view.
-              This space is outside this view's bounds.
-        -->
-        <attr name="android:layout_marginEnd" />
-
-        <!-- END MarginLayout layoutparams -->
-
-
-        <!--
-        The row boundary delimiting the top of the group of cells
-        occupied by this view.
-        -->
-        <attr name="layout_row" format="integer" />
-        <!--
-        The row span: the difference between the bottom and top
-        boundaries delimiting the group of cells occupied by this view.
-        The default is one.
-        See {@link android.widget.GridLayout.Spec}.
-        -->
-        <attr name="layout_rowSpan" format="integer" min="1" />
-        <!--
-        The column boundary delimiting the left of the group of cells
-        occupied by this view.
-        -->
-        <attr name="layout_column" format="integer" />
-        <!--
-        The column span: the difference between the right and left
-        boundaries delimiting the group of cells occupied by this view.
-        The default is one.
-        See {@link android.widget.GridLayout.Spec}.
-        -->
-        <attr name="layout_columnSpan" format="integer" min="1" />
-        <!--
-        Gravity specifies how a component should be placed in its group of cells.
-        The default is LEFT | BASELINE.
-        See {@link android.widget.GridLayout.LayoutParams#setGravity(int)}.
-        -->
-        <attr name="layout_gravity">
-
-            <!-- Push object to the top of its container, not changing its size. -->
-            <flag name="top" value="0x30" />
-            <!-- Push object to the bottom of its container, not changing its size. -->
-            <flag name="bottom" value="0x50" />
-            <!-- Push object to the left of its container, not changing its size. -->
-            <flag name="left" value="0x03" />
-            <!-- Push object to the right of its container, not changing its size. -->
-            <flag name="right" value="0x05" />
-            <!-- Place object in the vertical center of its container, not changing its size. -->
-            <flag name="center_vertical" value="0x10" />
-            <!-- Grow the vertical size of the object if needed so it completely fills its container. -->
-            <flag name="fill_vertical" value="0x70" />
-            <!-- Place object in the horizontal center of its container, not changing its size. -->
-            <flag name="center_horizontal" value="0x01" />
-            <!-- Grow the horizontal size of the object if needed so it completely fills its container. -->
-            <flag name="fill_horizontal" value="0x07" />
-            <!-- Place the object in the center of its container in both the vertical and horizontal axis, not changing its size. -->
-            <flag name="center" value="0x11" />
-            <!-- Grow the horizontal and vertical size of the object if needed so it completely fills its container. -->
-            <flag name="fill" value="0x77" />
-            <!--
-             Additional option that can be set to have the top and/or bottom edges of
-             the child clipped to its container's bounds.
-             The clip will be based on the vertical gravity: a top gravity will clip the bottom
-             edge, a bottom gravity will clip the top edge, and neither will clip both edges.
-            -->
-            <flag name="clip_vertical" value="0x80" />
-            <!--
-             Additional option that can be set to have the left and/or right edges of
-             the child clipped to its container's bounds.
-             The clip will be based on the horizontal gravity: a left gravity will clip the right
-             edge, a right gravity will clip the left edge, and neither will clip both edges.
-            -->
-            <flag name="clip_horizontal" value="0x08" />
-            <!-- Push object to the beginning of its container, not changing its size. -->
-            <flag name="start" value="0x00800003" />
-            <!-- Push object to the end of its container, not changing its size. -->
-            <flag name="end" value="0x00800005" />
-        </attr>
-    </declare-styleable>
-
-</resources>
diff --git a/testapps/gridlayoutTest/v7-gridlayout/res/values/dimens.xml b/testapps/gridlayoutTest/v7-gridlayout/res/values/dimens.xml
deleted file mode 100644
index fda3feb..0000000
--- a/testapps/gridlayoutTest/v7-gridlayout/res/values/dimens.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<resources>
-
-    <!-- The default gap between components in a layout. -->
-    <dimen name="default_gap">16dip</dimen>
-
-</resources>
diff --git a/testapps/gridlayoutTest/v7-gridlayout/src/.readme b/testapps/gridlayoutTest/v7-gridlayout/src/.readme
deleted file mode 100644
index 4bcebad..0000000
--- a/testapps/gridlayoutTest/v7-gridlayout/src/.readme
+++ /dev/null
@@ -1,2 +0,0 @@
-This hidden file is there to ensure there is an src folder.
-Once we support binary library this will go away.
\ No newline at end of file
diff --git a/testapps/jarCheckTests1/SUCCESS b/testapps/jarCheckTests1/SUCCESS
deleted file mode 100644
index e69de29..0000000
--- a/testapps/jarCheckTests1/SUCCESS
+++ /dev/null
diff --git a/testapps/jarCheckTests1/app/.classpath b/testapps/jarCheckTests1/app/.classpath
deleted file mode 100644
index a4763d1..0000000
--- a/testapps/jarCheckTests1/app/.classpath
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="src" path="gen"/>
-	<classpathentry kind="con" path="com.android.ide.eclipse.adt.ANDROID_FRAMEWORK"/>
-	<classpathentry kind="con" path="com.android.ide.eclipse.adt.LIBRARIES"/>
-	<classpathentry kind="output" path="bin/classes"/>
-</classpath>
diff --git a/testapps/jarCheckTests1/app/.project b/testapps/jarCheckTests1/app/.project
deleted file mode 100644
index 101d553..0000000
--- a/testapps/jarCheckTests1/app/.project
+++ /dev/null
@@ -1,33 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>jarCheckTests1-app</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>com.android.ide.eclipse.adt.ResourceManagerBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>com.android.ide.eclipse.adt.PreCompilerBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>com.android.ide.eclipse.adt.ApkBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>com.android.ide.eclipse.adt.AndroidNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/testapps/jarCheckTests1/app/AndroidManifest.xml b/testapps/jarCheckTests1/app/AndroidManifest.xml
deleted file mode 100644
index ff41761..0000000
--- a/testapps/jarCheckTests1/app/AndroidManifest.xml
+++ /dev/null
@@ -1,15 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
-      package="com.android.tests.projectwithsupport"
-      android:versionCode="1"
-      android:versionName="1.0">
-    <application android:label="@string/app_name">
-        <activity android:name=".MyActivity"
-                  android:label="@string/app_name">
-            <intent-filter>
-                <action android:name="android.intent.action.MAIN" />
-                <category android:name="android.intent.category.LAUNCHER" />
-            </intent-filter>
-        </activity>
-    </application>
-</manifest> 
diff --git a/testapps/jarCheckTests1/app/ant.properties b/testapps/jarCheckTests1/app/ant.properties
deleted file mode 100644
index ee52d86..0000000
--- a/testapps/jarCheckTests1/app/ant.properties
+++ /dev/null
@@ -1,17 +0,0 @@
-# This file is used to override default values used by the Ant build system.
-#
-# This file must be checked in Version Control Systems, as it is
-# integral to the build system of your project.
-
-# This file is only used by the Ant script.
-
-# You can use this to override default values such as
-#  'source.dir' for the location of your java source folder and
-#  'out.dir' for the location of your output folder.
-
-# You can also use it define how the release builds are signed by declaring
-# the following properties:
-#  'key.store' for the location of your keystore and
-#  'key.alias' for the name of the key to use.
-# The password will be asked during the build when you use the 'release' target.
-
diff --git a/testapps/jarCheckTests1/app/build.xml b/testapps/jarCheckTests1/app/build.xml
deleted file mode 100644
index f3a3d91..0000000
--- a/testapps/jarCheckTests1/app/build.xml
+++ /dev/null
@@ -1,85 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project name="basicProjectWithSupport" default="help">
-
-    <!-- The local.properties file is created and updated by the 'android' tool.
-         It contains the path to the SDK. It should *NOT* be checked into
-         Version Control Systems. -->
-    <property file="local.properties" />
-
-    <!-- The ant.properties file can be created by you. It is only edited by the
-         'android' tool to add properties to it.
-         This is the place to change some Ant specific build properties.
-         Here are some properties you may want to change/update:
-
-         source.dir
-             The name of the source directory. Default is 'src'.
-         out.dir
-             The name of the output directory. Default is 'bin'.
-
-         For other overridable properties, look at the beginning of the rules
-         files in the SDK, at tools/ant/build.xml
-
-         Properties related to the SDK location or the project target should
-         be updated using the 'android' tool with the 'update' action.
-
-         This file is an integral part of the build system for your
-         application and should be checked into Version Control Systems.
-
-         -->
-    <property file="ant.properties" />
-
-    <!-- The project.properties file is created and updated by the 'android'
-         tool, as well as ADT.
-
-         This contains project specific properties such as project target, and library
-         dependencies. Lower level build properties are stored in ant.properties
-         (or in .classpath for Eclipse projects).
-
-         This file is an integral part of the build system for your
-         application and should be checked into Version Control Systems. -->
-    <loadproperties srcFile="project.properties" />
-
-    <!-- quick check on sdk.dir -->
-    <fail
-            message="sdk.dir is missing. Make sure to generate local.properties using 'android update project' or to inject it through an env var"
-            unless="sdk.dir"
-    />
-
-
-<!-- extension targets. Uncomment the ones where you want to do custom work
-     in between standard targets -->
-<!--
-    <target name="-pre-build">
-    </target>
-    <target name="-pre-compile">
-    </target>
-
-    /* This is typically used for code obfuscation.
-       Compiled code location: ${out.classes.absolute.dir}
-       If this is not done in place, override ${out.dex.input.absolute.dir} */
-    <target name="-post-compile">
-    </target>
--->
-
-    <!-- Import the actual build file.
-
-         To customize existing targets, there are two options:
-         - Customize only one target:
-             - copy/paste the target into this file, *before* the
-               <import> task.
-             - customize it to your needs.
-         - Customize the whole content of build.xml
-             - copy/paste the content of the rules files (minus the top node)
-               into this file, replacing the <import> task.
-             - customize to your needs.
-
-         ***********************
-         ****** IMPORTANT ******
-         ***********************
-         In all cases you must update the value of version-tag below to read 'custom' instead of an integer,
-         in order to avoid having your file be overridden by tools such as "android update project"
-    -->
-    <!-- version-tag: 1 -->
-    <import file="${sdk.dir}/tools/ant/build.xml" />
-
-</project>
diff --git a/testapps/jarCheckTests1/app/libs/android-support-v4.jar b/testapps/jarCheckTests1/app/libs/android-support-v4.jar
deleted file mode 100644
index d006198..0000000
--- a/testapps/jarCheckTests1/app/libs/android-support-v4.jar
+++ /dev/null
Binary files differ
diff --git a/testapps/jarCheckTests1/app/libs/foo.txt b/testapps/jarCheckTests1/app/libs/foo.txt
deleted file mode 100644
index fe0c852..0000000
--- a/testapps/jarCheckTests1/app/libs/foo.txt
+++ /dev/null
@@ -1 +0,0 @@
-sdf
\ No newline at end of file
diff --git a/testapps/jarCheckTests1/app/proguard-project.txt b/testapps/jarCheckTests1/app/proguard-project.txt
deleted file mode 100644
index f2fe155..0000000
--- a/testapps/jarCheckTests1/app/proguard-project.txt
+++ /dev/null
@@ -1,20 +0,0 @@
-# To enable ProGuard in your project, edit project.properties
-# to define the proguard.config property as described in that file.
-#
-# Add project specific ProGuard rules here.
-# By default, the flags in this file are appended to flags specified
-# in ${sdk.dir}/tools/proguard/proguard-android.txt
-# You can edit the include path and order by changing the ProGuard
-# include property in project.properties.
-#
-# For more details, see
-#   http://developer.android.com/guide/developing/tools/proguard.html
-
-# Add any project specific keep options here:
-
-# If your project uses WebView with JS, uncomment the following
-# and specify the fully qualified class name to the JavaScript interface
-# class:
-#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
-#   public *;
-#}
diff --git a/testapps/jarCheckTests1/app/project.properties b/testapps/jarCheckTests1/app/project.properties
deleted file mode 100644
index 1d28b51..0000000
--- a/testapps/jarCheckTests1/app/project.properties
+++ /dev/null
@@ -1,13 +0,0 @@
-# This file is automatically generated by Android Tools.
-# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
-#
-# This file must be checked in Version Control Systems.
-#
-# To customize properties used by the Ant build system use,
-# "ant.properties", and override values to adapt the script to your
-# project structure.
-
-# Project target.
-target=android-15
-android.library.reference.1=../lib1
-android.library.reference.2=../lib2
diff --git a/testapps/jarCheckTests1/app/res/layout/main.xml b/testapps/jarCheckTests1/app/res/layout/main.xml
deleted file mode 100644
index 7fe5dce..0000000
--- a/testapps/jarCheckTests1/app/res/layout/main.xml
+++ /dev/null
@@ -1,13 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:orientation="vertical"
-    android:layout_width="fill_parent"
-    android:layout_height="fill_parent"
-    >
-<TextView  
-    android:layout_width="fill_parent" 
-    android:layout_height="wrap_content" 
-    android:text="Hello World, MyActivity"
-    />
-</LinearLayout>
-
diff --git a/testapps/jarCheckTests1/app/res/values/strings.xml b/testapps/jarCheckTests1/app/res/values/strings.xml
deleted file mode 100644
index 3fa203a..0000000
--- a/testapps/jarCheckTests1/app/res/values/strings.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<resources>
-    <string name="app_name">MyActivity</string>
-</resources>
diff --git a/testapps/jarCheckTests1/app/src/com/android/tests/projectwithsupport/MyActivity.java b/testapps/jarCheckTests1/app/src/com/android/tests/projectwithsupport/MyActivity.java
deleted file mode 100644
index c065839..0000000
--- a/testapps/jarCheckTests1/app/src/com/android/tests/projectwithsupport/MyActivity.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package com.android.tests.projectwithsupport;
-
-import android.app.Activity;
-import android.os.Bundle;
-
-public class MyActivity extends Activity
-{
-    /** Called when the activity is first created. */
-    @Override
-    public void onCreate(Bundle savedInstanceState)
-    {
-        super.onCreate(savedInstanceState);
-        setContentView(R.layout.main);
-    }
-}
diff --git a/testapps/jarCheckTests1/lib1/.classpath b/testapps/jarCheckTests1/lib1/.classpath
deleted file mode 100644
index a4763d1..0000000
--- a/testapps/jarCheckTests1/lib1/.classpath
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="src" path="gen"/>
-	<classpathentry kind="con" path="com.android.ide.eclipse.adt.ANDROID_FRAMEWORK"/>
-	<classpathentry kind="con" path="com.android.ide.eclipse.adt.LIBRARIES"/>
-	<classpathentry kind="output" path="bin/classes"/>
-</classpath>
diff --git a/testapps/jarCheckTests1/lib1/.project b/testapps/jarCheckTests1/lib1/.project
deleted file mode 100644
index f5f0058..0000000
--- a/testapps/jarCheckTests1/lib1/.project
+++ /dev/null
@@ -1,33 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>jarCheckTests1-lib1</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>com.android.ide.eclipse.adt.ResourceManagerBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>com.android.ide.eclipse.adt.PreCompilerBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>com.android.ide.eclipse.adt.ApkBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>com.android.ide.eclipse.adt.AndroidNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/testapps/jarCheckTests1/lib1/AndroidManifest.xml b/testapps/jarCheckTests1/lib1/AndroidManifest.xml
deleted file mode 100644
index a634bdb..0000000
--- a/testapps/jarCheckTests1/lib1/AndroidManifest.xml
+++ /dev/null
@@ -1,15 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
-      package="com.android.tests.libwithsupport"
-      android:versionCode="1"
-      android:versionName="1.0">
-    <application android:label="@string/app_name">
-        <activity android:name=".MyActivity"
-                  android:label="@string/app_name">
-            <intent-filter>
-                <action android:name="android.intent.action.MAIN" />
-                <category android:name="android.intent.category.LAUNCHER" />
-            </intent-filter>
-        </activity>
-    </application>
-</manifest> 
diff --git a/testapps/jarCheckTests1/lib1/ant.properties b/testapps/jarCheckTests1/lib1/ant.properties
deleted file mode 100644
index ee52d86..0000000
--- a/testapps/jarCheckTests1/lib1/ant.properties
+++ /dev/null
@@ -1,17 +0,0 @@
-# This file is used to override default values used by the Ant build system.
-#
-# This file must be checked in Version Control Systems, as it is
-# integral to the build system of your project.
-
-# This file is only used by the Ant script.
-
-# You can use this to override default values such as
-#  'source.dir' for the location of your java source folder and
-#  'out.dir' for the location of your output folder.
-
-# You can also use it define how the release builds are signed by declaring
-# the following properties:
-#  'key.store' for the location of your keystore and
-#  'key.alias' for the name of the key to use.
-# The password will be asked during the build when you use the 'release' target.
-
diff --git a/testapps/jarCheckTests1/lib1/build.xml b/testapps/jarCheckTests1/lib1/build.xml
deleted file mode 100644
index 772f422..0000000
--- a/testapps/jarCheckTests1/lib1/build.xml
+++ /dev/null
@@ -1,85 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project name="basicLibWithSupport" default="help">
-
-    <!-- The local.properties file is created and updated by the 'android' tool.
-         It contains the path to the SDK. It should *NOT* be checked into
-         Version Control Systems. -->
-    <property file="local.properties" />
-
-    <!-- The ant.properties file can be created by you. It is only edited by the
-         'android' tool to add properties to it.
-         This is the place to change some Ant specific build properties.
-         Here are some properties you may want to change/update:
-
-         source.dir
-             The name of the source directory. Default is 'src'.
-         out.dir
-             The name of the output directory. Default is 'bin'.
-
-         For other overridable properties, look at the beginning of the rules
-         files in the SDK, at tools/ant/build.xml
-
-         Properties related to the SDK location or the project target should
-         be updated using the 'android' tool with the 'update' action.
-
-         This file is an integral part of the build system for your
-         application and should be checked into Version Control Systems.
-
-         -->
-    <property file="ant.properties" />
-
-    <!-- The project.properties file is created and updated by the 'android'
-         tool, as well as ADT.
-
-         This contains project specific properties such as project target, and library
-         dependencies. Lower level build properties are stored in ant.properties
-         (or in .classpath for Eclipse projects).
-
-         This file is an integral part of the build system for your
-         application and should be checked into Version Control Systems. -->
-    <loadproperties srcFile="project.properties" />
-
-    <!-- quick check on sdk.dir -->
-    <fail
-            message="sdk.dir is missing. Make sure to generate local.properties using 'android update project' or to inject it through an env var"
-            unless="sdk.dir"
-    />
-
-
-<!-- extension targets. Uncomment the ones where you want to do custom work
-     in between standard targets -->
-<!--
-    <target name="-pre-build">
-    </target>
-    <target name="-pre-compile">
-    </target>
-
-    /* This is typically used for code obfuscation.
-       Compiled code location: ${out.classes.absolute.dir}
-       If this is not done in place, override ${out.dex.input.absolute.dir} */
-    <target name="-post-compile">
-    </target>
--->
-
-    <!-- Import the actual build file.
-
-         To customize existing targets, there are two options:
-         - Customize only one target:
-             - copy/paste the target into this file, *before* the
-               <import> task.
-             - customize it to your needs.
-         - Customize the whole content of build.xml
-             - copy/paste the content of the rules files (minus the top node)
-               into this file, replacing the <import> task.
-             - customize to your needs.
-
-         ***********************
-         ****** IMPORTANT ******
-         ***********************
-         In all cases you must update the value of version-tag below to read 'custom' instead of an integer,
-         in order to avoid having your file be overridden by tools such as "android update project"
-    -->
-    <!-- version-tag: 1 -->
-    <import file="${sdk.dir}/tools/ant/build.xml" />
-
-</project>
diff --git a/testapps/jarCheckTests1/lib1/libs/android-support-v4.jar b/testapps/jarCheckTests1/lib1/libs/android-support-v4.jar
deleted file mode 100644
index d006198..0000000
--- a/testapps/jarCheckTests1/lib1/libs/android-support-v4.jar
+++ /dev/null
Binary files differ
diff --git a/testapps/jarCheckTests1/lib1/proguard-project.txt b/testapps/jarCheckTests1/lib1/proguard-project.txt
deleted file mode 100644
index f2fe155..0000000
--- a/testapps/jarCheckTests1/lib1/proguard-project.txt
+++ /dev/null
@@ -1,20 +0,0 @@
-# To enable ProGuard in your project, edit project.properties
-# to define the proguard.config property as described in that file.
-#
-# Add project specific ProGuard rules here.
-# By default, the flags in this file are appended to flags specified
-# in ${sdk.dir}/tools/proguard/proguard-android.txt
-# You can edit the include path and order by changing the ProGuard
-# include property in project.properties.
-#
-# For more details, see
-#   http://developer.android.com/guide/developing/tools/proguard.html
-
-# Add any project specific keep options here:
-
-# If your project uses WebView with JS, uncomment the following
-# and specify the fully qualified class name to the JavaScript interface
-# class:
-#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
-#   public *;
-#}
diff --git a/testapps/jarCheckTests1/lib1/project.properties b/testapps/jarCheckTests1/lib1/project.properties
deleted file mode 100644
index 23d80c4..0000000
--- a/testapps/jarCheckTests1/lib1/project.properties
+++ /dev/null
@@ -1,13 +0,0 @@
-# This file is automatically generated by Android Tools.
-# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
-#
-# This file must be checked in Version Control Systems.
-#
-# To customize properties used by the Ant build system use,
-# "ant.properties", and override values to adapt the script to your
-# project structure.
-
-# Project target.
-target=android-15
-android.library=true
-
diff --git a/testapps/jarCheckTests1/lib1/res/layout/main.xml b/testapps/jarCheckTests1/lib1/res/layout/main.xml
deleted file mode 100644
index 7fe5dce..0000000
--- a/testapps/jarCheckTests1/lib1/res/layout/main.xml
+++ /dev/null
@@ -1,13 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:orientation="vertical"
-    android:layout_width="fill_parent"
-    android:layout_height="fill_parent"
-    >
-<TextView  
-    android:layout_width="fill_parent" 
-    android:layout_height="wrap_content" 
-    android:text="Hello World, MyActivity"
-    />
-</LinearLayout>
-
diff --git a/testapps/jarCheckTests1/lib1/res/values/strings.xml b/testapps/jarCheckTests1/lib1/res/values/strings.xml
deleted file mode 100644
index 3fa203a..0000000
--- a/testapps/jarCheckTests1/lib1/res/values/strings.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<resources>
-    <string name="app_name">MyActivity</string>
-</resources>
diff --git a/testapps/jarCheckTests1/lib1/src/com/android/tests/libwithsupport/MyActivity.java b/testapps/jarCheckTests1/lib1/src/com/android/tests/libwithsupport/MyActivity.java
deleted file mode 100644
index 2c316ca..0000000
--- a/testapps/jarCheckTests1/lib1/src/com/android/tests/libwithsupport/MyActivity.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package com.android.tests.libwithsupport;
-
-import android.app.Activity;
-import android.os.Bundle;
-
-public class MyActivity extends Activity
-{
-    /** Called when the activity is first created. */
-    @Override
-    public void onCreate(Bundle savedInstanceState)
-    {
-        super.onCreate(savedInstanceState);
-        setContentView(R.layout.main);
-    }
-}
diff --git a/testapps/jarCheckTests1/lib2/.classpath b/testapps/jarCheckTests1/lib2/.classpath
deleted file mode 100644
index a4763d1..0000000
--- a/testapps/jarCheckTests1/lib2/.classpath
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="src" path="gen"/>
-	<classpathentry kind="con" path="com.android.ide.eclipse.adt.ANDROID_FRAMEWORK"/>
-	<classpathentry kind="con" path="com.android.ide.eclipse.adt.LIBRARIES"/>
-	<classpathentry kind="output" path="bin/classes"/>
-</classpath>
diff --git a/testapps/jarCheckTests1/lib2/.project b/testapps/jarCheckTests1/lib2/.project
deleted file mode 100644
index 1d49c52..0000000
--- a/testapps/jarCheckTests1/lib2/.project
+++ /dev/null
@@ -1,33 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>jarCheckTests1-lib2</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>com.android.ide.eclipse.adt.ResourceManagerBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>com.android.ide.eclipse.adt.PreCompilerBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>com.android.ide.eclipse.adt.ApkBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>com.android.ide.eclipse.adt.AndroidNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/testapps/jarCheckTests1/lib2/AndroidManifest.xml b/testapps/jarCheckTests1/lib2/AndroidManifest.xml
deleted file mode 100644
index 6fa91eb..0000000
--- a/testapps/jarCheckTests1/lib2/AndroidManifest.xml
+++ /dev/null
@@ -1,15 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
-      package="com.android.tests.libwithsupport2"
-      android:versionCode="1"
-      android:versionName="1.0">
-    <application android:label="@string/app_name">
-        <activity android:name=".MyActivity"
-                  android:label="@string/app_name">
-            <intent-filter>
-                <action android:name="android.intent.action.MAIN" />
-                <category android:name="android.intent.category.LAUNCHER" />
-            </intent-filter>
-        </activity>
-    </application>
-</manifest> 
diff --git a/testapps/jarCheckTests1/lib2/ant.properties b/testapps/jarCheckTests1/lib2/ant.properties
deleted file mode 100644
index ee52d86..0000000
--- a/testapps/jarCheckTests1/lib2/ant.properties
+++ /dev/null
@@ -1,17 +0,0 @@
-# This file is used to override default values used by the Ant build system.
-#
-# This file must be checked in Version Control Systems, as it is
-# integral to the build system of your project.
-
-# This file is only used by the Ant script.
-
-# You can use this to override default values such as
-#  'source.dir' for the location of your java source folder and
-#  'out.dir' for the location of your output folder.
-
-# You can also use it define how the release builds are signed by declaring
-# the following properties:
-#  'key.store' for the location of your keystore and
-#  'key.alias' for the name of the key to use.
-# The password will be asked during the build when you use the 'release' target.
-
diff --git a/testapps/jarCheckTests1/lib2/build.xml b/testapps/jarCheckTests1/lib2/build.xml
deleted file mode 100644
index 772f422..0000000
--- a/testapps/jarCheckTests1/lib2/build.xml
+++ /dev/null
@@ -1,85 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project name="basicLibWithSupport" default="help">
-
-    <!-- The local.properties file is created and updated by the 'android' tool.
-         It contains the path to the SDK. It should *NOT* be checked into
-         Version Control Systems. -->
-    <property file="local.properties" />
-
-    <!-- The ant.properties file can be created by you. It is only edited by the
-         'android' tool to add properties to it.
-         This is the place to change some Ant specific build properties.
-         Here are some properties you may want to change/update:
-
-         source.dir
-             The name of the source directory. Default is 'src'.
-         out.dir
-             The name of the output directory. Default is 'bin'.
-
-         For other overridable properties, look at the beginning of the rules
-         files in the SDK, at tools/ant/build.xml
-
-         Properties related to the SDK location or the project target should
-         be updated using the 'android' tool with the 'update' action.
-
-         This file is an integral part of the build system for your
-         application and should be checked into Version Control Systems.
-
-         -->
-    <property file="ant.properties" />
-
-    <!-- The project.properties file is created and updated by the 'android'
-         tool, as well as ADT.
-
-         This contains project specific properties such as project target, and library
-         dependencies. Lower level build properties are stored in ant.properties
-         (or in .classpath for Eclipse projects).
-
-         This file is an integral part of the build system for your
-         application and should be checked into Version Control Systems. -->
-    <loadproperties srcFile="project.properties" />
-
-    <!-- quick check on sdk.dir -->
-    <fail
-            message="sdk.dir is missing. Make sure to generate local.properties using 'android update project' or to inject it through an env var"
-            unless="sdk.dir"
-    />
-
-
-<!-- extension targets. Uncomment the ones where you want to do custom work
-     in between standard targets -->
-<!--
-    <target name="-pre-build">
-    </target>
-    <target name="-pre-compile">
-    </target>
-
-    /* This is typically used for code obfuscation.
-       Compiled code location: ${out.classes.absolute.dir}
-       If this is not done in place, override ${out.dex.input.absolute.dir} */
-    <target name="-post-compile">
-    </target>
--->
-
-    <!-- Import the actual build file.
-
-         To customize existing targets, there are two options:
-         - Customize only one target:
-             - copy/paste the target into this file, *before* the
-               <import> task.
-             - customize it to your needs.
-         - Customize the whole content of build.xml
-             - copy/paste the content of the rules files (minus the top node)
-               into this file, replacing the <import> task.
-             - customize to your needs.
-
-         ***********************
-         ****** IMPORTANT ******
-         ***********************
-         In all cases you must update the value of version-tag below to read 'custom' instead of an integer,
-         in order to avoid having your file be overridden by tools such as "android update project"
-    -->
-    <!-- version-tag: 1 -->
-    <import file="${sdk.dir}/tools/ant/build.xml" />
-
-</project>
diff --git a/testapps/jarCheckTests1/lib2/libs/android-support-v4.jar b/testapps/jarCheckTests1/lib2/libs/android-support-v4.jar
deleted file mode 100644
index d006198..0000000
--- a/testapps/jarCheckTests1/lib2/libs/android-support-v4.jar
+++ /dev/null
Binary files differ
diff --git a/testapps/jarCheckTests1/lib2/proguard-project.txt b/testapps/jarCheckTests1/lib2/proguard-project.txt
deleted file mode 100644
index f2fe155..0000000
--- a/testapps/jarCheckTests1/lib2/proguard-project.txt
+++ /dev/null
@@ -1,20 +0,0 @@
-# To enable ProGuard in your project, edit project.properties
-# to define the proguard.config property as described in that file.
-#
-# Add project specific ProGuard rules here.
-# By default, the flags in this file are appended to flags specified
-# in ${sdk.dir}/tools/proguard/proguard-android.txt
-# You can edit the include path and order by changing the ProGuard
-# include property in project.properties.
-#
-# For more details, see
-#   http://developer.android.com/guide/developing/tools/proguard.html
-
-# Add any project specific keep options here:
-
-# If your project uses WebView with JS, uncomment the following
-# and specify the fully qualified class name to the JavaScript interface
-# class:
-#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
-#   public *;
-#}
diff --git a/testapps/jarCheckTests1/lib2/project.properties b/testapps/jarCheckTests1/lib2/project.properties
deleted file mode 100644
index 23d80c4..0000000
--- a/testapps/jarCheckTests1/lib2/project.properties
+++ /dev/null
@@ -1,13 +0,0 @@
-# This file is automatically generated by Android Tools.
-# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
-#
-# This file must be checked in Version Control Systems.
-#
-# To customize properties used by the Ant build system use,
-# "ant.properties", and override values to adapt the script to your
-# project structure.
-
-# Project target.
-target=android-15
-android.library=true
-
diff --git a/testapps/jarCheckTests1/lib2/res/layout/main.xml b/testapps/jarCheckTests1/lib2/res/layout/main.xml
deleted file mode 100644
index 7fe5dce..0000000
--- a/testapps/jarCheckTests1/lib2/res/layout/main.xml
+++ /dev/null
@@ -1,13 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:orientation="vertical"
-    android:layout_width="fill_parent"
-    android:layout_height="fill_parent"
-    >
-<TextView  
-    android:layout_width="fill_parent" 
-    android:layout_height="wrap_content" 
-    android:text="Hello World, MyActivity"
-    />
-</LinearLayout>
-
diff --git a/testapps/jarCheckTests1/lib2/res/values/strings.xml b/testapps/jarCheckTests1/lib2/res/values/strings.xml
deleted file mode 100644
index 3fa203a..0000000
--- a/testapps/jarCheckTests1/lib2/res/values/strings.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<resources>
-    <string name="app_name">MyActivity</string>
-</resources>
diff --git a/testapps/jarCheckTests1/lib2/src/com/android/tests/libwithsupport2/MyActivity.java b/testapps/jarCheckTests1/lib2/src/com/android/tests/libwithsupport2/MyActivity.java
deleted file mode 100644
index fc97aa7..0000000
--- a/testapps/jarCheckTests1/lib2/src/com/android/tests/libwithsupport2/MyActivity.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package com.android.tests.libwithsupport2;
-
-import android.app.Activity;
-import android.os.Bundle;
-
-public class MyActivity extends Activity
-{
-    /** Called when the activity is first created. */
-    @Override
-    public void onCreate(Bundle savedInstanceState)
-    {
-        super.onCreate(savedInstanceState);
-        setContentView(R.layout.main);
-    }
-}
diff --git a/testapps/jarCheckTests2/FAIL b/testapps/jarCheckTests2/FAIL
deleted file mode 100644
index e69de29..0000000
--- a/testapps/jarCheckTests2/FAIL
+++ /dev/null
diff --git a/testapps/jarCheckTests2/app/.classpath b/testapps/jarCheckTests2/app/.classpath
deleted file mode 100644
index 3f9691c..0000000
--- a/testapps/jarCheckTests2/app/.classpath
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="con" path="com.android.ide.eclipse.adt.ANDROID_FRAMEWORK"/>
-	<classpathentry kind="con" path="com.android.ide.eclipse.adt.LIBRARIES"/>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="src" path="gen"/>
-	<classpathentry kind="output" path="bin/classes"/>
-</classpath>
diff --git a/testapps/jarCheckTests2/app/.project b/testapps/jarCheckTests2/app/.project
deleted file mode 100644
index fb6801c..0000000
--- a/testapps/jarCheckTests2/app/.project
+++ /dev/null
@@ -1,33 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>jarCheckTests2-app</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>com.android.ide.eclipse.adt.ResourceManagerBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>com.android.ide.eclipse.adt.PreCompilerBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>com.android.ide.eclipse.adt.ApkBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>com.android.ide.eclipse.adt.AndroidNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/testapps/jarCheckTests2/app/AndroidManifest.xml b/testapps/jarCheckTests2/app/AndroidManifest.xml
deleted file mode 100644
index ff41761..0000000
--- a/testapps/jarCheckTests2/app/AndroidManifest.xml
+++ /dev/null
@@ -1,15 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
-      package="com.android.tests.projectwithsupport"
-      android:versionCode="1"
-      android:versionName="1.0">
-    <application android:label="@string/app_name">
-        <activity android:name=".MyActivity"
-                  android:label="@string/app_name">
-            <intent-filter>
-                <action android:name="android.intent.action.MAIN" />
-                <category android:name="android.intent.category.LAUNCHER" />
-            </intent-filter>
-        </activity>
-    </application>
-</manifest> 
diff --git a/testapps/jarCheckTests2/app/ant.properties b/testapps/jarCheckTests2/app/ant.properties
deleted file mode 100644
index ee52d86..0000000
--- a/testapps/jarCheckTests2/app/ant.properties
+++ /dev/null
@@ -1,17 +0,0 @@
-# This file is used to override default values used by the Ant build system.
-#
-# This file must be checked in Version Control Systems, as it is
-# integral to the build system of your project.
-
-# This file is only used by the Ant script.
-
-# You can use this to override default values such as
-#  'source.dir' for the location of your java source folder and
-#  'out.dir' for the location of your output folder.
-
-# You can also use it define how the release builds are signed by declaring
-# the following properties:
-#  'key.store' for the location of your keystore and
-#  'key.alias' for the name of the key to use.
-# The password will be asked during the build when you use the 'release' target.
-
diff --git a/testapps/jarCheckTests2/app/build.xml b/testapps/jarCheckTests2/app/build.xml
deleted file mode 100644
index f3a3d91..0000000
--- a/testapps/jarCheckTests2/app/build.xml
+++ /dev/null
@@ -1,85 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project name="basicProjectWithSupport" default="help">
-
-    <!-- The local.properties file is created and updated by the 'android' tool.
-         It contains the path to the SDK. It should *NOT* be checked into
-         Version Control Systems. -->
-    <property file="local.properties" />
-
-    <!-- The ant.properties file can be created by you. It is only edited by the
-         'android' tool to add properties to it.
-         This is the place to change some Ant specific build properties.
-         Here are some properties you may want to change/update:
-
-         source.dir
-             The name of the source directory. Default is 'src'.
-         out.dir
-             The name of the output directory. Default is 'bin'.
-
-         For other overridable properties, look at the beginning of the rules
-         files in the SDK, at tools/ant/build.xml
-
-         Properties related to the SDK location or the project target should
-         be updated using the 'android' tool with the 'update' action.
-
-         This file is an integral part of the build system for your
-         application and should be checked into Version Control Systems.
-
-         -->
-    <property file="ant.properties" />
-
-    <!-- The project.properties file is created and updated by the 'android'
-         tool, as well as ADT.
-
-         This contains project specific properties such as project target, and library
-         dependencies. Lower level build properties are stored in ant.properties
-         (or in .classpath for Eclipse projects).
-
-         This file is an integral part of the build system for your
-         application and should be checked into Version Control Systems. -->
-    <loadproperties srcFile="project.properties" />
-
-    <!-- quick check on sdk.dir -->
-    <fail
-            message="sdk.dir is missing. Make sure to generate local.properties using 'android update project' or to inject it through an env var"
-            unless="sdk.dir"
-    />
-
-
-<!-- extension targets. Uncomment the ones where you want to do custom work
-     in between standard targets -->
-<!--
-    <target name="-pre-build">
-    </target>
-    <target name="-pre-compile">
-    </target>
-
-    /* This is typically used for code obfuscation.
-       Compiled code location: ${out.classes.absolute.dir}
-       If this is not done in place, override ${out.dex.input.absolute.dir} */
-    <target name="-post-compile">
-    </target>
--->
-
-    <!-- Import the actual build file.
-
-         To customize existing targets, there are two options:
-         - Customize only one target:
-             - copy/paste the target into this file, *before* the
-               <import> task.
-             - customize it to your needs.
-         - Customize the whole content of build.xml
-             - copy/paste the content of the rules files (minus the top node)
-               into this file, replacing the <import> task.
-             - customize to your needs.
-
-         ***********************
-         ****** IMPORTANT ******
-         ***********************
-         In all cases you must update the value of version-tag below to read 'custom' instead of an integer,
-         in order to avoid having your file be overridden by tools such as "android update project"
-    -->
-    <!-- version-tag: 1 -->
-    <import file="${sdk.dir}/tools/ant/build.xml" />
-
-</project>
diff --git a/testapps/jarCheckTests2/app/libs/foo.txt b/testapps/jarCheckTests2/app/libs/foo.txt
deleted file mode 100644
index fe0c852..0000000
--- a/testapps/jarCheckTests2/app/libs/foo.txt
+++ /dev/null
@@ -1 +0,0 @@
-sdf
\ No newline at end of file
diff --git a/testapps/jarCheckTests2/app/proguard-project.txt b/testapps/jarCheckTests2/app/proguard-project.txt
deleted file mode 100644
index f2fe155..0000000
--- a/testapps/jarCheckTests2/app/proguard-project.txt
+++ /dev/null
@@ -1,20 +0,0 @@
-# To enable ProGuard in your project, edit project.properties
-# to define the proguard.config property as described in that file.
-#
-# Add project specific ProGuard rules here.
-# By default, the flags in this file are appended to flags specified
-# in ${sdk.dir}/tools/proguard/proguard-android.txt
-# You can edit the include path and order by changing the ProGuard
-# include property in project.properties.
-#
-# For more details, see
-#   http://developer.android.com/guide/developing/tools/proguard.html
-
-# Add any project specific keep options here:
-
-# If your project uses WebView with JS, uncomment the following
-# and specify the fully qualified class name to the JavaScript interface
-# class:
-#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
-#   public *;
-#}
diff --git a/testapps/jarCheckTests2/app/project.properties b/testapps/jarCheckTests2/app/project.properties
deleted file mode 100644
index 1d28b51..0000000
--- a/testapps/jarCheckTests2/app/project.properties
+++ /dev/null
@@ -1,13 +0,0 @@
-# This file is automatically generated by Android Tools.
-# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
-#
-# This file must be checked in Version Control Systems.
-#
-# To customize properties used by the Ant build system use,
-# "ant.properties", and override values to adapt the script to your
-# project structure.
-
-# Project target.
-target=android-15
-android.library.reference.1=../lib1
-android.library.reference.2=../lib2
diff --git a/testapps/jarCheckTests2/app/res/layout/main.xml b/testapps/jarCheckTests2/app/res/layout/main.xml
deleted file mode 100644
index 7fe5dce..0000000
--- a/testapps/jarCheckTests2/app/res/layout/main.xml
+++ /dev/null
@@ -1,13 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:orientation="vertical"
-    android:layout_width="fill_parent"
-    android:layout_height="fill_parent"
-    >
-<TextView  
-    android:layout_width="fill_parent" 
-    android:layout_height="wrap_content" 
-    android:text="Hello World, MyActivity"
-    />
-</LinearLayout>
-
diff --git a/testapps/jarCheckTests2/app/res/values/strings.xml b/testapps/jarCheckTests2/app/res/values/strings.xml
deleted file mode 100644
index 3fa203a..0000000
--- a/testapps/jarCheckTests2/app/res/values/strings.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<resources>
-    <string name="app_name">MyActivity</string>
-</resources>
diff --git a/testapps/jarCheckTests2/app/src/com/android/tests/projectwithsupport/MyActivity.java b/testapps/jarCheckTests2/app/src/com/android/tests/projectwithsupport/MyActivity.java
deleted file mode 100644
index c065839..0000000
--- a/testapps/jarCheckTests2/app/src/com/android/tests/projectwithsupport/MyActivity.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package com.android.tests.projectwithsupport;
-
-import android.app.Activity;
-import android.os.Bundle;
-
-public class MyActivity extends Activity
-{
-    /** Called when the activity is first created. */
-    @Override
-    public void onCreate(Bundle savedInstanceState)
-    {
-        super.onCreate(savedInstanceState);
-        setContentView(R.layout.main);
-    }
-}
diff --git a/testapps/jarCheckTests2/lib1/.classpath b/testapps/jarCheckTests2/lib1/.classpath
deleted file mode 100644
index 3f9691c..0000000
--- a/testapps/jarCheckTests2/lib1/.classpath
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="con" path="com.android.ide.eclipse.adt.ANDROID_FRAMEWORK"/>
-	<classpathentry kind="con" path="com.android.ide.eclipse.adt.LIBRARIES"/>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="src" path="gen"/>
-	<classpathentry kind="output" path="bin/classes"/>
-</classpath>
diff --git a/testapps/jarCheckTests2/lib1/.project b/testapps/jarCheckTests2/lib1/.project
deleted file mode 100644
index 467950f..0000000
--- a/testapps/jarCheckTests2/lib1/.project
+++ /dev/null
@@ -1,33 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>test2Lib1</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>com.android.ide.eclipse.adt.ResourceManagerBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>com.android.ide.eclipse.adt.PreCompilerBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>com.android.ide.eclipse.adt.ApkBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>com.android.ide.eclipse.adt.AndroidNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/testapps/jarCheckTests2/lib1/AndroidManifest.xml b/testapps/jarCheckTests2/lib1/AndroidManifest.xml
deleted file mode 100644
index a634bdb..0000000
--- a/testapps/jarCheckTests2/lib1/AndroidManifest.xml
+++ /dev/null
@@ -1,15 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
-      package="com.android.tests.libwithsupport"
-      android:versionCode="1"
-      android:versionName="1.0">
-    <application android:label="@string/app_name">
-        <activity android:name=".MyActivity"
-                  android:label="@string/app_name">
-            <intent-filter>
-                <action android:name="android.intent.action.MAIN" />
-                <category android:name="android.intent.category.LAUNCHER" />
-            </intent-filter>
-        </activity>
-    </application>
-</manifest> 
diff --git a/testapps/jarCheckTests2/lib1/ant.properties b/testapps/jarCheckTests2/lib1/ant.properties
deleted file mode 100644
index ee52d86..0000000
--- a/testapps/jarCheckTests2/lib1/ant.properties
+++ /dev/null
@@ -1,17 +0,0 @@
-# This file is used to override default values used by the Ant build system.
-#
-# This file must be checked in Version Control Systems, as it is
-# integral to the build system of your project.
-
-# This file is only used by the Ant script.
-
-# You can use this to override default values such as
-#  'source.dir' for the location of your java source folder and
-#  'out.dir' for the location of your output folder.
-
-# You can also use it define how the release builds are signed by declaring
-# the following properties:
-#  'key.store' for the location of your keystore and
-#  'key.alias' for the name of the key to use.
-# The password will be asked during the build when you use the 'release' target.
-
diff --git a/testapps/jarCheckTests2/lib1/build.xml b/testapps/jarCheckTests2/lib1/build.xml
deleted file mode 100644
index 772f422..0000000
--- a/testapps/jarCheckTests2/lib1/build.xml
+++ /dev/null
@@ -1,85 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project name="basicLibWithSupport" default="help">
-
-    <!-- The local.properties file is created and updated by the 'android' tool.
-         It contains the path to the SDK. It should *NOT* be checked into
-         Version Control Systems. -->
-    <property file="local.properties" />
-
-    <!-- The ant.properties file can be created by you. It is only edited by the
-         'android' tool to add properties to it.
-         This is the place to change some Ant specific build properties.
-         Here are some properties you may want to change/update:
-
-         source.dir
-             The name of the source directory. Default is 'src'.
-         out.dir
-             The name of the output directory. Default is 'bin'.
-
-         For other overridable properties, look at the beginning of the rules
-         files in the SDK, at tools/ant/build.xml
-
-         Properties related to the SDK location or the project target should
-         be updated using the 'android' tool with the 'update' action.
-
-         This file is an integral part of the build system for your
-         application and should be checked into Version Control Systems.
-
-         -->
-    <property file="ant.properties" />
-
-    <!-- The project.properties file is created and updated by the 'android'
-         tool, as well as ADT.
-
-         This contains project specific properties such as project target, and library
-         dependencies. Lower level build properties are stored in ant.properties
-         (or in .classpath for Eclipse projects).
-
-         This file is an integral part of the build system for your
-         application and should be checked into Version Control Systems. -->
-    <loadproperties srcFile="project.properties" />
-
-    <!-- quick check on sdk.dir -->
-    <fail
-            message="sdk.dir is missing. Make sure to generate local.properties using 'android update project' or to inject it through an env var"
-            unless="sdk.dir"
-    />
-
-
-<!-- extension targets. Uncomment the ones where you want to do custom work
-     in between standard targets -->
-<!--
-    <target name="-pre-build">
-    </target>
-    <target name="-pre-compile">
-    </target>
-
-    /* This is typically used for code obfuscation.
-       Compiled code location: ${out.classes.absolute.dir}
-       If this is not done in place, override ${out.dex.input.absolute.dir} */
-    <target name="-post-compile">
-    </target>
--->
-
-    <!-- Import the actual build file.
-
-         To customize existing targets, there are two options:
-         - Customize only one target:
-             - copy/paste the target into this file, *before* the
-               <import> task.
-             - customize it to your needs.
-         - Customize the whole content of build.xml
-             - copy/paste the content of the rules files (minus the top node)
-               into this file, replacing the <import> task.
-             - customize to your needs.
-
-         ***********************
-         ****** IMPORTANT ******
-         ***********************
-         In all cases you must update the value of version-tag below to read 'custom' instead of an integer,
-         in order to avoid having your file be overridden by tools such as "android update project"
-    -->
-    <!-- version-tag: 1 -->
-    <import file="${sdk.dir}/tools/ant/build.xml" />
-
-</project>
diff --git a/testapps/jarCheckTests2/lib1/libs/android-support-v4.jar b/testapps/jarCheckTests2/lib1/libs/android-support-v4.jar
deleted file mode 100644
index d006198..0000000
--- a/testapps/jarCheckTests2/lib1/libs/android-support-v4.jar
+++ /dev/null
Binary files differ
diff --git a/testapps/jarCheckTests2/lib1/proguard-project.txt b/testapps/jarCheckTests2/lib1/proguard-project.txt
deleted file mode 100644
index f2fe155..0000000
--- a/testapps/jarCheckTests2/lib1/proguard-project.txt
+++ /dev/null
@@ -1,20 +0,0 @@
-# To enable ProGuard in your project, edit project.properties
-# to define the proguard.config property as described in that file.
-#
-# Add project specific ProGuard rules here.
-# By default, the flags in this file are appended to flags specified
-# in ${sdk.dir}/tools/proguard/proguard-android.txt
-# You can edit the include path and order by changing the ProGuard
-# include property in project.properties.
-#
-# For more details, see
-#   http://developer.android.com/guide/developing/tools/proguard.html
-
-# Add any project specific keep options here:
-
-# If your project uses WebView with JS, uncomment the following
-# and specify the fully qualified class name to the JavaScript interface
-# class:
-#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
-#   public *;
-#}
diff --git a/testapps/jarCheckTests2/lib1/project.properties b/testapps/jarCheckTests2/lib1/project.properties
deleted file mode 100644
index 23d80c4..0000000
--- a/testapps/jarCheckTests2/lib1/project.properties
+++ /dev/null
@@ -1,13 +0,0 @@
-# This file is automatically generated by Android Tools.
-# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
-#
-# This file must be checked in Version Control Systems.
-#
-# To customize properties used by the Ant build system use,
-# "ant.properties", and override values to adapt the script to your
-# project structure.
-
-# Project target.
-target=android-15
-android.library=true
-
diff --git a/testapps/jarCheckTests2/lib1/res/layout/main.xml b/testapps/jarCheckTests2/lib1/res/layout/main.xml
deleted file mode 100644
index 7fe5dce..0000000
--- a/testapps/jarCheckTests2/lib1/res/layout/main.xml
+++ /dev/null
@@ -1,13 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:orientation="vertical"
-    android:layout_width="fill_parent"
-    android:layout_height="fill_parent"
-    >
-<TextView  
-    android:layout_width="fill_parent" 
-    android:layout_height="wrap_content" 
-    android:text="Hello World, MyActivity"
-    />
-</LinearLayout>
-
diff --git a/testapps/jarCheckTests2/lib1/res/values/strings.xml b/testapps/jarCheckTests2/lib1/res/values/strings.xml
deleted file mode 100644
index 3fa203a..0000000
--- a/testapps/jarCheckTests2/lib1/res/values/strings.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<resources>
-    <string name="app_name">MyActivity</string>
-</resources>
diff --git a/testapps/jarCheckTests2/lib1/src/com/android/tests/libwithsupport/MyActivity.java b/testapps/jarCheckTests2/lib1/src/com/android/tests/libwithsupport/MyActivity.java
deleted file mode 100644
index 2c316ca..0000000
--- a/testapps/jarCheckTests2/lib1/src/com/android/tests/libwithsupport/MyActivity.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package com.android.tests.libwithsupport;
-
-import android.app.Activity;
-import android.os.Bundle;
-
-public class MyActivity extends Activity
-{
-    /** Called when the activity is first created. */
-    @Override
-    public void onCreate(Bundle savedInstanceState)
-    {
-        super.onCreate(savedInstanceState);
-        setContentView(R.layout.main);
-    }
-}
diff --git a/testapps/jarCheckTests2/lib2/.classpath b/testapps/jarCheckTests2/lib2/.classpath
deleted file mode 100644
index 3f9691c..0000000
--- a/testapps/jarCheckTests2/lib2/.classpath
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="con" path="com.android.ide.eclipse.adt.ANDROID_FRAMEWORK"/>
-	<classpathentry kind="con" path="com.android.ide.eclipse.adt.LIBRARIES"/>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="src" path="gen"/>
-	<classpathentry kind="output" path="bin/classes"/>
-</classpath>
diff --git a/testapps/jarCheckTests2/lib2/.project b/testapps/jarCheckTests2/lib2/.project
deleted file mode 100644
index efeaaae..0000000
--- a/testapps/jarCheckTests2/lib2/.project
+++ /dev/null
@@ -1,33 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>test2Lib2</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>com.android.ide.eclipse.adt.ResourceManagerBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>com.android.ide.eclipse.adt.PreCompilerBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>com.android.ide.eclipse.adt.ApkBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>com.android.ide.eclipse.adt.AndroidNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/testapps/jarCheckTests2/lib2/AndroidManifest.xml b/testapps/jarCheckTests2/lib2/AndroidManifest.xml
deleted file mode 100644
index 6fa91eb..0000000
--- a/testapps/jarCheckTests2/lib2/AndroidManifest.xml
+++ /dev/null
@@ -1,15 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
-      package="com.android.tests.libwithsupport2"
-      android:versionCode="1"
-      android:versionName="1.0">
-    <application android:label="@string/app_name">
-        <activity android:name=".MyActivity"
-                  android:label="@string/app_name">
-            <intent-filter>
-                <action android:name="android.intent.action.MAIN" />
-                <category android:name="android.intent.category.LAUNCHER" />
-            </intent-filter>
-        </activity>
-    </application>
-</manifest> 
diff --git a/testapps/jarCheckTests2/lib2/ant.properties b/testapps/jarCheckTests2/lib2/ant.properties
deleted file mode 100644
index ee52d86..0000000
--- a/testapps/jarCheckTests2/lib2/ant.properties
+++ /dev/null
@@ -1,17 +0,0 @@
-# This file is used to override default values used by the Ant build system.
-#
-# This file must be checked in Version Control Systems, as it is
-# integral to the build system of your project.
-
-# This file is only used by the Ant script.
-
-# You can use this to override default values such as
-#  'source.dir' for the location of your java source folder and
-#  'out.dir' for the location of your output folder.
-
-# You can also use it define how the release builds are signed by declaring
-# the following properties:
-#  'key.store' for the location of your keystore and
-#  'key.alias' for the name of the key to use.
-# The password will be asked during the build when you use the 'release' target.
-
diff --git a/testapps/jarCheckTests2/lib2/build.xml b/testapps/jarCheckTests2/lib2/build.xml
deleted file mode 100644
index 772f422..0000000
--- a/testapps/jarCheckTests2/lib2/build.xml
+++ /dev/null
@@ -1,85 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project name="basicLibWithSupport" default="help">
-
-    <!-- The local.properties file is created and updated by the 'android' tool.
-         It contains the path to the SDK. It should *NOT* be checked into
-         Version Control Systems. -->
-    <property file="local.properties" />
-
-    <!-- The ant.properties file can be created by you. It is only edited by the
-         'android' tool to add properties to it.
-         This is the place to change some Ant specific build properties.
-         Here are some properties you may want to change/update:
-
-         source.dir
-             The name of the source directory. Default is 'src'.
-         out.dir
-             The name of the output directory. Default is 'bin'.
-
-         For other overridable properties, look at the beginning of the rules
-         files in the SDK, at tools/ant/build.xml
-
-         Properties related to the SDK location or the project target should
-         be updated using the 'android' tool with the 'update' action.
-
-         This file is an integral part of the build system for your
-         application and should be checked into Version Control Systems.
-
-         -->
-    <property file="ant.properties" />
-
-    <!-- The project.properties file is created and updated by the 'android'
-         tool, as well as ADT.
-
-         This contains project specific properties such as project target, and library
-         dependencies. Lower level build properties are stored in ant.properties
-         (or in .classpath for Eclipse projects).
-
-         This file is an integral part of the build system for your
-         application and should be checked into Version Control Systems. -->
-    <loadproperties srcFile="project.properties" />
-
-    <!-- quick check on sdk.dir -->
-    <fail
-            message="sdk.dir is missing. Make sure to generate local.properties using 'android update project' or to inject it through an env var"
-            unless="sdk.dir"
-    />
-
-
-<!-- extension targets. Uncomment the ones where you want to do custom work
-     in between standard targets -->
-<!--
-    <target name="-pre-build">
-    </target>
-    <target name="-pre-compile">
-    </target>
-
-    /* This is typically used for code obfuscation.
-       Compiled code location: ${out.classes.absolute.dir}
-       If this is not done in place, override ${out.dex.input.absolute.dir} */
-    <target name="-post-compile">
-    </target>
--->
-
-    <!-- Import the actual build file.
-
-         To customize existing targets, there are two options:
-         - Customize only one target:
-             - copy/paste the target into this file, *before* the
-               <import> task.
-             - customize it to your needs.
-         - Customize the whole content of build.xml
-             - copy/paste the content of the rules files (minus the top node)
-               into this file, replacing the <import> task.
-             - customize to your needs.
-
-         ***********************
-         ****** IMPORTANT ******
-         ***********************
-         In all cases you must update the value of version-tag below to read 'custom' instead of an integer,
-         in order to avoid having your file be overridden by tools such as "android update project"
-    -->
-    <!-- version-tag: 1 -->
-    <import file="${sdk.dir}/tools/ant/build.xml" />
-
-</project>
diff --git a/testapps/jarCheckTests2/lib2/libs/android-support-v4.jar b/testapps/jarCheckTests2/lib2/libs/android-support-v4.jar
deleted file mode 100644
index 1e90718..0000000
--- a/testapps/jarCheckTests2/lib2/libs/android-support-v4.jar
+++ /dev/null
Binary files differ
diff --git a/testapps/jarCheckTests2/lib2/proguard-project.txt b/testapps/jarCheckTests2/lib2/proguard-project.txt
deleted file mode 100644
index f2fe155..0000000
--- a/testapps/jarCheckTests2/lib2/proguard-project.txt
+++ /dev/null
@@ -1,20 +0,0 @@
-# To enable ProGuard in your project, edit project.properties
-# to define the proguard.config property as described in that file.
-#
-# Add project specific ProGuard rules here.
-# By default, the flags in this file are appended to flags specified
-# in ${sdk.dir}/tools/proguard/proguard-android.txt
-# You can edit the include path and order by changing the ProGuard
-# include property in project.properties.
-#
-# For more details, see
-#   http://developer.android.com/guide/developing/tools/proguard.html
-
-# Add any project specific keep options here:
-
-# If your project uses WebView with JS, uncomment the following
-# and specify the fully qualified class name to the JavaScript interface
-# class:
-#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
-#   public *;
-#}
diff --git a/testapps/jarCheckTests2/lib2/project.properties b/testapps/jarCheckTests2/lib2/project.properties
deleted file mode 100644
index 23d80c4..0000000
--- a/testapps/jarCheckTests2/lib2/project.properties
+++ /dev/null
@@ -1,13 +0,0 @@
-# This file is automatically generated by Android Tools.
-# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
-#
-# This file must be checked in Version Control Systems.
-#
-# To customize properties used by the Ant build system use,
-# "ant.properties", and override values to adapt the script to your
-# project structure.
-
-# Project target.
-target=android-15
-android.library=true
-
diff --git a/testapps/jarCheckTests2/lib2/res/layout/main.xml b/testapps/jarCheckTests2/lib2/res/layout/main.xml
deleted file mode 100644
index 7fe5dce..0000000
--- a/testapps/jarCheckTests2/lib2/res/layout/main.xml
+++ /dev/null
@@ -1,13 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:orientation="vertical"
-    android:layout_width="fill_parent"
-    android:layout_height="fill_parent"
-    >
-<TextView  
-    android:layout_width="fill_parent" 
-    android:layout_height="wrap_content" 
-    android:text="Hello World, MyActivity"
-    />
-</LinearLayout>
-
diff --git a/testapps/jarCheckTests2/lib2/res/values/strings.xml b/testapps/jarCheckTests2/lib2/res/values/strings.xml
deleted file mode 100644
index 3fa203a..0000000
--- a/testapps/jarCheckTests2/lib2/res/values/strings.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<resources>
-    <string name="app_name">MyActivity</string>
-</resources>
diff --git a/testapps/jarCheckTests2/lib2/src/com/android/tests/libwithsupport2/MyActivity.java b/testapps/jarCheckTests2/lib2/src/com/android/tests/libwithsupport2/MyActivity.java
deleted file mode 100644
index fc97aa7..0000000
--- a/testapps/jarCheckTests2/lib2/src/com/android/tests/libwithsupport2/MyActivity.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package com.android.tests.libwithsupport2;
-
-import android.app.Activity;
-import android.os.Bundle;
-
-public class MyActivity extends Activity
-{
-    /** Called when the activity is first created. */
-    @Override
-    public void onCreate(Bundle savedInstanceState)
-    {
-        super.onCreate(savedInstanceState);
-        setContentView(R.layout.main);
-    }
-}
diff --git a/testapps/jarCheckTests3/SUCCESS b/testapps/jarCheckTests3/SUCCESS
deleted file mode 100644
index e69de29..0000000
--- a/testapps/jarCheckTests3/SUCCESS
+++ /dev/null
diff --git a/testapps/jarCheckTests3/app/.classpath b/testapps/jarCheckTests3/app/.classpath
deleted file mode 100644
index a4763d1..0000000
--- a/testapps/jarCheckTests3/app/.classpath
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="src" path="gen"/>
-	<classpathentry kind="con" path="com.android.ide.eclipse.adt.ANDROID_FRAMEWORK"/>
-	<classpathentry kind="con" path="com.android.ide.eclipse.adt.LIBRARIES"/>
-	<classpathentry kind="output" path="bin/classes"/>
-</classpath>
diff --git a/testapps/jarCheckTests3/app/.project b/testapps/jarCheckTests3/app/.project
deleted file mode 100644
index f2075af..0000000
--- a/testapps/jarCheckTests3/app/.project
+++ /dev/null
@@ -1,33 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>jarCheckTests3-app</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>com.android.ide.eclipse.adt.ResourceManagerBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>com.android.ide.eclipse.adt.PreCompilerBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>com.android.ide.eclipse.adt.ApkBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>com.android.ide.eclipse.adt.AndroidNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/testapps/jarCheckTests3/app/AndroidManifest.xml b/testapps/jarCheckTests3/app/AndroidManifest.xml
deleted file mode 100644
index ff41761..0000000
--- a/testapps/jarCheckTests3/app/AndroidManifest.xml
+++ /dev/null
@@ -1,15 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
-      package="com.android.tests.projectwithsupport"
-      android:versionCode="1"
-      android:versionName="1.0">
-    <application android:label="@string/app_name">
-        <activity android:name=".MyActivity"
-                  android:label="@string/app_name">
-            <intent-filter>
-                <action android:name="android.intent.action.MAIN" />
-                <category android:name="android.intent.category.LAUNCHER" />
-            </intent-filter>
-        </activity>
-    </application>
-</manifest> 
diff --git a/testapps/jarCheckTests3/app/ant.properties b/testapps/jarCheckTests3/app/ant.properties
deleted file mode 100644
index ee52d86..0000000
--- a/testapps/jarCheckTests3/app/ant.properties
+++ /dev/null
@@ -1,17 +0,0 @@
-# This file is used to override default values used by the Ant build system.
-#
-# This file must be checked in Version Control Systems, as it is
-# integral to the build system of your project.
-
-# This file is only used by the Ant script.
-
-# You can use this to override default values such as
-#  'source.dir' for the location of your java source folder and
-#  'out.dir' for the location of your output folder.
-
-# You can also use it define how the release builds are signed by declaring
-# the following properties:
-#  'key.store' for the location of your keystore and
-#  'key.alias' for the name of the key to use.
-# The password will be asked during the build when you use the 'release' target.
-
diff --git a/testapps/jarCheckTests3/app/build.xml b/testapps/jarCheckTests3/app/build.xml
deleted file mode 100644
index f3a3d91..0000000
--- a/testapps/jarCheckTests3/app/build.xml
+++ /dev/null
@@ -1,85 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project name="basicProjectWithSupport" default="help">
-
-    <!-- The local.properties file is created and updated by the 'android' tool.
-         It contains the path to the SDK. It should *NOT* be checked into
-         Version Control Systems. -->
-    <property file="local.properties" />
-
-    <!-- The ant.properties file can be created by you. It is only edited by the
-         'android' tool to add properties to it.
-         This is the place to change some Ant specific build properties.
-         Here are some properties you may want to change/update:
-
-         source.dir
-             The name of the source directory. Default is 'src'.
-         out.dir
-             The name of the output directory. Default is 'bin'.
-
-         For other overridable properties, look at the beginning of the rules
-         files in the SDK, at tools/ant/build.xml
-
-         Properties related to the SDK location or the project target should
-         be updated using the 'android' tool with the 'update' action.
-
-         This file is an integral part of the build system for your
-         application and should be checked into Version Control Systems.
-
-         -->
-    <property file="ant.properties" />
-
-    <!-- The project.properties file is created and updated by the 'android'
-         tool, as well as ADT.
-
-         This contains project specific properties such as project target, and library
-         dependencies. Lower level build properties are stored in ant.properties
-         (or in .classpath for Eclipse projects).
-
-         This file is an integral part of the build system for your
-         application and should be checked into Version Control Systems. -->
-    <loadproperties srcFile="project.properties" />
-
-    <!-- quick check on sdk.dir -->
-    <fail
-            message="sdk.dir is missing. Make sure to generate local.properties using 'android update project' or to inject it through an env var"
-            unless="sdk.dir"
-    />
-
-
-<!-- extension targets. Uncomment the ones where you want to do custom work
-     in between standard targets -->
-<!--
-    <target name="-pre-build">
-    </target>
-    <target name="-pre-compile">
-    </target>
-
-    /* This is typically used for code obfuscation.
-       Compiled code location: ${out.classes.absolute.dir}
-       If this is not done in place, override ${out.dex.input.absolute.dir} */
-    <target name="-post-compile">
-    </target>
--->
-
-    <!-- Import the actual build file.
-
-         To customize existing targets, there are two options:
-         - Customize only one target:
-             - copy/paste the target into this file, *before* the
-               <import> task.
-             - customize it to your needs.
-         - Customize the whole content of build.xml
-             - copy/paste the content of the rules files (minus the top node)
-               into this file, replacing the <import> task.
-             - customize to your needs.
-
-         ***********************
-         ****** IMPORTANT ******
-         ***********************
-         In all cases you must update the value of version-tag below to read 'custom' instead of an integer,
-         in order to avoid having your file be overridden by tools such as "android update project"
-    -->
-    <!-- version-tag: 1 -->
-    <import file="${sdk.dir}/tools/ant/build.xml" />
-
-</project>
diff --git a/testapps/jarCheckTests3/app/libs/foo.txt b/testapps/jarCheckTests3/app/libs/foo.txt
deleted file mode 100644
index fe0c852..0000000
--- a/testapps/jarCheckTests3/app/libs/foo.txt
+++ /dev/null
@@ -1 +0,0 @@
-sdf
\ No newline at end of file
diff --git a/testapps/jarCheckTests3/app/proguard-project.txt b/testapps/jarCheckTests3/app/proguard-project.txt
deleted file mode 100644
index f2fe155..0000000
--- a/testapps/jarCheckTests3/app/proguard-project.txt
+++ /dev/null
@@ -1,20 +0,0 @@
-# To enable ProGuard in your project, edit project.properties
-# to define the proguard.config property as described in that file.
-#
-# Add project specific ProGuard rules here.
-# By default, the flags in this file are appended to flags specified
-# in ${sdk.dir}/tools/proguard/proguard-android.txt
-# You can edit the include path and order by changing the ProGuard
-# include property in project.properties.
-#
-# For more details, see
-#   http://developer.android.com/guide/developing/tools/proguard.html
-
-# Add any project specific keep options here:
-
-# If your project uses WebView with JS, uncomment the following
-# and specify the fully qualified class name to the JavaScript interface
-# class:
-#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
-#   public *;
-#}
diff --git a/testapps/jarCheckTests3/app/project.properties b/testapps/jarCheckTests3/app/project.properties
deleted file mode 100644
index 1d28b51..0000000
--- a/testapps/jarCheckTests3/app/project.properties
+++ /dev/null
@@ -1,13 +0,0 @@
-# This file is automatically generated by Android Tools.
-# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
-#
-# This file must be checked in Version Control Systems.
-#
-# To customize properties used by the Ant build system use,
-# "ant.properties", and override values to adapt the script to your
-# project structure.
-
-# Project target.
-target=android-15
-android.library.reference.1=../lib1
-android.library.reference.2=../lib2
diff --git a/testapps/jarCheckTests3/app/res/layout/main.xml b/testapps/jarCheckTests3/app/res/layout/main.xml
deleted file mode 100644
index 7fe5dce..0000000
--- a/testapps/jarCheckTests3/app/res/layout/main.xml
+++ /dev/null
@@ -1,13 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:orientation="vertical"
-    android:layout_width="fill_parent"
-    android:layout_height="fill_parent"
-    >
-<TextView  
-    android:layout_width="fill_parent" 
-    android:layout_height="wrap_content" 
-    android:text="Hello World, MyActivity"
-    />
-</LinearLayout>
-
diff --git a/testapps/jarCheckTests3/app/res/values/strings.xml b/testapps/jarCheckTests3/app/res/values/strings.xml
deleted file mode 100644
index 3fa203a..0000000
--- a/testapps/jarCheckTests3/app/res/values/strings.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<resources>
-    <string name="app_name">MyActivity</string>
-</resources>
diff --git a/testapps/jarCheckTests3/app/src/com/android/tests/projectwithsupport/MyActivity.java b/testapps/jarCheckTests3/app/src/com/android/tests/projectwithsupport/MyActivity.java
deleted file mode 100644
index c065839..0000000
--- a/testapps/jarCheckTests3/app/src/com/android/tests/projectwithsupport/MyActivity.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package com.android.tests.projectwithsupport;
-
-import android.app.Activity;
-import android.os.Bundle;
-
-public class MyActivity extends Activity
-{
-    /** Called when the activity is first created. */
-    @Override
-    public void onCreate(Bundle savedInstanceState)
-    {
-        super.onCreate(savedInstanceState);
-        setContentView(R.layout.main);
-    }
-}
diff --git a/testapps/jarCheckTests3/lib1/.classpath b/testapps/jarCheckTests3/lib1/.classpath
deleted file mode 100644
index a4763d1..0000000
--- a/testapps/jarCheckTests3/lib1/.classpath
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="src" path="gen"/>
-	<classpathentry kind="con" path="com.android.ide.eclipse.adt.ANDROID_FRAMEWORK"/>
-	<classpathentry kind="con" path="com.android.ide.eclipse.adt.LIBRARIES"/>
-	<classpathentry kind="output" path="bin/classes"/>
-</classpath>
diff --git a/testapps/jarCheckTests3/lib1/.project b/testapps/jarCheckTests3/lib1/.project
deleted file mode 100644
index 14ffc89..0000000
--- a/testapps/jarCheckTests3/lib1/.project
+++ /dev/null
@@ -1,33 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>jarCheckTests3-lib1</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>com.android.ide.eclipse.adt.ResourceManagerBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>com.android.ide.eclipse.adt.PreCompilerBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>com.android.ide.eclipse.adt.ApkBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>com.android.ide.eclipse.adt.AndroidNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/testapps/jarCheckTests3/lib1/AndroidManifest.xml b/testapps/jarCheckTests3/lib1/AndroidManifest.xml
deleted file mode 100644
index a634bdb..0000000
--- a/testapps/jarCheckTests3/lib1/AndroidManifest.xml
+++ /dev/null
@@ -1,15 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
-      package="com.android.tests.libwithsupport"
-      android:versionCode="1"
-      android:versionName="1.0">
-    <application android:label="@string/app_name">
-        <activity android:name=".MyActivity"
-                  android:label="@string/app_name">
-            <intent-filter>
-                <action android:name="android.intent.action.MAIN" />
-                <category android:name="android.intent.category.LAUNCHER" />
-            </intent-filter>
-        </activity>
-    </application>
-</manifest> 
diff --git a/testapps/jarCheckTests3/lib1/ant.properties b/testapps/jarCheckTests3/lib1/ant.properties
deleted file mode 100644
index ee52d86..0000000
--- a/testapps/jarCheckTests3/lib1/ant.properties
+++ /dev/null
@@ -1,17 +0,0 @@
-# This file is used to override default values used by the Ant build system.
-#
-# This file must be checked in Version Control Systems, as it is
-# integral to the build system of your project.
-
-# This file is only used by the Ant script.
-
-# You can use this to override default values such as
-#  'source.dir' for the location of your java source folder and
-#  'out.dir' for the location of your output folder.
-
-# You can also use it define how the release builds are signed by declaring
-# the following properties:
-#  'key.store' for the location of your keystore and
-#  'key.alias' for the name of the key to use.
-# The password will be asked during the build when you use the 'release' target.
-
diff --git a/testapps/jarCheckTests3/lib1/build.xml b/testapps/jarCheckTests3/lib1/build.xml
deleted file mode 100644
index 772f422..0000000
--- a/testapps/jarCheckTests3/lib1/build.xml
+++ /dev/null
@@ -1,85 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project name="basicLibWithSupport" default="help">
-
-    <!-- The local.properties file is created and updated by the 'android' tool.
-         It contains the path to the SDK. It should *NOT* be checked into
-         Version Control Systems. -->
-    <property file="local.properties" />
-
-    <!-- The ant.properties file can be created by you. It is only edited by the
-         'android' tool to add properties to it.
-         This is the place to change some Ant specific build properties.
-         Here are some properties you may want to change/update:
-
-         source.dir
-             The name of the source directory. Default is 'src'.
-         out.dir
-             The name of the output directory. Default is 'bin'.
-
-         For other overridable properties, look at the beginning of the rules
-         files in the SDK, at tools/ant/build.xml
-
-         Properties related to the SDK location or the project target should
-         be updated using the 'android' tool with the 'update' action.
-
-         This file is an integral part of the build system for your
-         application and should be checked into Version Control Systems.
-
-         -->
-    <property file="ant.properties" />
-
-    <!-- The project.properties file is created and updated by the 'android'
-         tool, as well as ADT.
-
-         This contains project specific properties such as project target, and library
-         dependencies. Lower level build properties are stored in ant.properties
-         (or in .classpath for Eclipse projects).
-
-         This file is an integral part of the build system for your
-         application and should be checked into Version Control Systems. -->
-    <loadproperties srcFile="project.properties" />
-
-    <!-- quick check on sdk.dir -->
-    <fail
-            message="sdk.dir is missing. Make sure to generate local.properties using 'android update project' or to inject it through an env var"
-            unless="sdk.dir"
-    />
-
-
-<!-- extension targets. Uncomment the ones where you want to do custom work
-     in between standard targets -->
-<!--
-    <target name="-pre-build">
-    </target>
-    <target name="-pre-compile">
-    </target>
-
-    /* This is typically used for code obfuscation.
-       Compiled code location: ${out.classes.absolute.dir}
-       If this is not done in place, override ${out.dex.input.absolute.dir} */
-    <target name="-post-compile">
-    </target>
--->
-
-    <!-- Import the actual build file.
-
-         To customize existing targets, there are two options:
-         - Customize only one target:
-             - copy/paste the target into this file, *before* the
-               <import> task.
-             - customize it to your needs.
-         - Customize the whole content of build.xml
-             - copy/paste the content of the rules files (minus the top node)
-               into this file, replacing the <import> task.
-             - customize to your needs.
-
-         ***********************
-         ****** IMPORTANT ******
-         ***********************
-         In all cases you must update the value of version-tag below to read 'custom' instead of an integer,
-         in order to avoid having your file be overridden by tools such as "android update project"
-    -->
-    <!-- version-tag: 1 -->
-    <import file="${sdk.dir}/tools/ant/build.xml" />
-
-</project>
diff --git a/testapps/jarCheckTests3/lib1/libs/android-support-v4.jar b/testapps/jarCheckTests3/lib1/libs/android-support-v4.jar
deleted file mode 100644
index d006198..0000000
--- a/testapps/jarCheckTests3/lib1/libs/android-support-v4.jar
+++ /dev/null
Binary files differ
diff --git a/testapps/jarCheckTests3/lib1/proguard-project.txt b/testapps/jarCheckTests3/lib1/proguard-project.txt
deleted file mode 100644
index f2fe155..0000000
--- a/testapps/jarCheckTests3/lib1/proguard-project.txt
+++ /dev/null
@@ -1,20 +0,0 @@
-# To enable ProGuard in your project, edit project.properties
-# to define the proguard.config property as described in that file.
-#
-# Add project specific ProGuard rules here.
-# By default, the flags in this file are appended to flags specified
-# in ${sdk.dir}/tools/proguard/proguard-android.txt
-# You can edit the include path and order by changing the ProGuard
-# include property in project.properties.
-#
-# For more details, see
-#   http://developer.android.com/guide/developing/tools/proguard.html
-
-# Add any project specific keep options here:
-
-# If your project uses WebView with JS, uncomment the following
-# and specify the fully qualified class name to the JavaScript interface
-# class:
-#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
-#   public *;
-#}
diff --git a/testapps/jarCheckTests3/lib1/project.properties b/testapps/jarCheckTests3/lib1/project.properties
deleted file mode 100644
index 23d80c4..0000000
--- a/testapps/jarCheckTests3/lib1/project.properties
+++ /dev/null
@@ -1,13 +0,0 @@
-# This file is automatically generated by Android Tools.
-# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
-#
-# This file must be checked in Version Control Systems.
-#
-# To customize properties used by the Ant build system use,
-# "ant.properties", and override values to adapt the script to your
-# project structure.
-
-# Project target.
-target=android-15
-android.library=true
-
diff --git a/testapps/jarCheckTests3/lib1/res/layout/main.xml b/testapps/jarCheckTests3/lib1/res/layout/main.xml
deleted file mode 100644
index 7fe5dce..0000000
--- a/testapps/jarCheckTests3/lib1/res/layout/main.xml
+++ /dev/null
@@ -1,13 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:orientation="vertical"
-    android:layout_width="fill_parent"
-    android:layout_height="fill_parent"
-    >
-<TextView  
-    android:layout_width="fill_parent" 
-    android:layout_height="wrap_content" 
-    android:text="Hello World, MyActivity"
-    />
-</LinearLayout>
-
diff --git a/testapps/jarCheckTests3/lib1/res/values/strings.xml b/testapps/jarCheckTests3/lib1/res/values/strings.xml
deleted file mode 100644
index 3fa203a..0000000
--- a/testapps/jarCheckTests3/lib1/res/values/strings.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<resources>
-    <string name="app_name">MyActivity</string>
-</resources>
diff --git a/testapps/jarCheckTests3/lib1/src/com/android/tests/libwithsupport/MyActivity.java b/testapps/jarCheckTests3/lib1/src/com/android/tests/libwithsupport/MyActivity.java
deleted file mode 100644
index 2c316ca..0000000
--- a/testapps/jarCheckTests3/lib1/src/com/android/tests/libwithsupport/MyActivity.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package com.android.tests.libwithsupport;
-
-import android.app.Activity;
-import android.os.Bundle;
-
-public class MyActivity extends Activity
-{
-    /** Called when the activity is first created. */
-    @Override
-    public void onCreate(Bundle savedInstanceState)
-    {
-        super.onCreate(savedInstanceState);
-        setContentView(R.layout.main);
-    }
-}
diff --git a/testapps/jarCheckTests3/lib2/.classpath b/testapps/jarCheckTests3/lib2/.classpath
deleted file mode 100644
index a4763d1..0000000
--- a/testapps/jarCheckTests3/lib2/.classpath
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="src" path="gen"/>
-	<classpathentry kind="con" path="com.android.ide.eclipse.adt.ANDROID_FRAMEWORK"/>
-	<classpathentry kind="con" path="com.android.ide.eclipse.adt.LIBRARIES"/>
-	<classpathentry kind="output" path="bin/classes"/>
-</classpath>
diff --git a/testapps/jarCheckTests3/lib2/.project b/testapps/jarCheckTests3/lib2/.project
deleted file mode 100644
index 1441449..0000000
--- a/testapps/jarCheckTests3/lib2/.project
+++ /dev/null
@@ -1,33 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>jarCheckTests3-lib2</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>com.android.ide.eclipse.adt.ResourceManagerBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>com.android.ide.eclipse.adt.PreCompilerBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>com.android.ide.eclipse.adt.ApkBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>com.android.ide.eclipse.adt.AndroidNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/testapps/jarCheckTests3/lib2/AndroidManifest.xml b/testapps/jarCheckTests3/lib2/AndroidManifest.xml
deleted file mode 100644
index 6fa91eb..0000000
--- a/testapps/jarCheckTests3/lib2/AndroidManifest.xml
+++ /dev/null
@@ -1,15 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
-      package="com.android.tests.libwithsupport2"
-      android:versionCode="1"
-      android:versionName="1.0">
-    <application android:label="@string/app_name">
-        <activity android:name=".MyActivity"
-                  android:label="@string/app_name">
-            <intent-filter>
-                <action android:name="android.intent.action.MAIN" />
-                <category android:name="android.intent.category.LAUNCHER" />
-            </intent-filter>
-        </activity>
-    </application>
-</manifest> 
diff --git a/testapps/jarCheckTests3/lib2/ant.properties b/testapps/jarCheckTests3/lib2/ant.properties
deleted file mode 100644
index ee52d86..0000000
--- a/testapps/jarCheckTests3/lib2/ant.properties
+++ /dev/null
@@ -1,17 +0,0 @@
-# This file is used to override default values used by the Ant build system.
-#
-# This file must be checked in Version Control Systems, as it is
-# integral to the build system of your project.
-
-# This file is only used by the Ant script.
-
-# You can use this to override default values such as
-#  'source.dir' for the location of your java source folder and
-#  'out.dir' for the location of your output folder.
-
-# You can also use it define how the release builds are signed by declaring
-# the following properties:
-#  'key.store' for the location of your keystore and
-#  'key.alias' for the name of the key to use.
-# The password will be asked during the build when you use the 'release' target.
-
diff --git a/testapps/jarCheckTests3/lib2/build.xml b/testapps/jarCheckTests3/lib2/build.xml
deleted file mode 100644
index 772f422..0000000
--- a/testapps/jarCheckTests3/lib2/build.xml
+++ /dev/null
@@ -1,85 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project name="basicLibWithSupport" default="help">
-
-    <!-- The local.properties file is created and updated by the 'android' tool.
-         It contains the path to the SDK. It should *NOT* be checked into
-         Version Control Systems. -->
-    <property file="local.properties" />
-
-    <!-- The ant.properties file can be created by you. It is only edited by the
-         'android' tool to add properties to it.
-         This is the place to change some Ant specific build properties.
-         Here are some properties you may want to change/update:
-
-         source.dir
-             The name of the source directory. Default is 'src'.
-         out.dir
-             The name of the output directory. Default is 'bin'.
-
-         For other overridable properties, look at the beginning of the rules
-         files in the SDK, at tools/ant/build.xml
-
-         Properties related to the SDK location or the project target should
-         be updated using the 'android' tool with the 'update' action.
-
-         This file is an integral part of the build system for your
-         application and should be checked into Version Control Systems.
-
-         -->
-    <property file="ant.properties" />
-
-    <!-- The project.properties file is created and updated by the 'android'
-         tool, as well as ADT.
-
-         This contains project specific properties such as project target, and library
-         dependencies. Lower level build properties are stored in ant.properties
-         (or in .classpath for Eclipse projects).
-
-         This file is an integral part of the build system for your
-         application and should be checked into Version Control Systems. -->
-    <loadproperties srcFile="project.properties" />
-
-    <!-- quick check on sdk.dir -->
-    <fail
-            message="sdk.dir is missing. Make sure to generate local.properties using 'android update project' or to inject it through an env var"
-            unless="sdk.dir"
-    />
-
-
-<!-- extension targets. Uncomment the ones where you want to do custom work
-     in between standard targets -->
-<!--
-    <target name="-pre-build">
-    </target>
-    <target name="-pre-compile">
-    </target>
-
-    /* This is typically used for code obfuscation.
-       Compiled code location: ${out.classes.absolute.dir}
-       If this is not done in place, override ${out.dex.input.absolute.dir} */
-    <target name="-post-compile">
-    </target>
--->
-
-    <!-- Import the actual build file.
-
-         To customize existing targets, there are two options:
-         - Customize only one target:
-             - copy/paste the target into this file, *before* the
-               <import> task.
-             - customize it to your needs.
-         - Customize the whole content of build.xml
-             - copy/paste the content of the rules files (minus the top node)
-               into this file, replacing the <import> task.
-             - customize to your needs.
-
-         ***********************
-         ****** IMPORTANT ******
-         ***********************
-         In all cases you must update the value of version-tag below to read 'custom' instead of an integer,
-         in order to avoid having your file be overridden by tools such as "android update project"
-    -->
-    <!-- version-tag: 1 -->
-    <import file="${sdk.dir}/tools/ant/build.xml" />
-
-</project>
diff --git a/testapps/jarCheckTests3/lib2/libs/android-support-v13.jar b/testapps/jarCheckTests3/lib2/libs/android-support-v13.jar
deleted file mode 100644
index c9354ec..0000000
--- a/testapps/jarCheckTests3/lib2/libs/android-support-v13.jar
+++ /dev/null
Binary files differ
diff --git a/testapps/jarCheckTests3/lib2/proguard-project.txt b/testapps/jarCheckTests3/lib2/proguard-project.txt
deleted file mode 100644
index f2fe155..0000000
--- a/testapps/jarCheckTests3/lib2/proguard-project.txt
+++ /dev/null
@@ -1,20 +0,0 @@
-# To enable ProGuard in your project, edit project.properties
-# to define the proguard.config property as described in that file.
-#
-# Add project specific ProGuard rules here.
-# By default, the flags in this file are appended to flags specified
-# in ${sdk.dir}/tools/proguard/proguard-android.txt
-# You can edit the include path and order by changing the ProGuard
-# include property in project.properties.
-#
-# For more details, see
-#   http://developer.android.com/guide/developing/tools/proguard.html
-
-# Add any project specific keep options here:
-
-# If your project uses WebView with JS, uncomment the following
-# and specify the fully qualified class name to the JavaScript interface
-# class:
-#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
-#   public *;
-#}
diff --git a/testapps/jarCheckTests3/lib2/project.properties b/testapps/jarCheckTests3/lib2/project.properties
deleted file mode 100644
index 23d80c4..0000000
--- a/testapps/jarCheckTests3/lib2/project.properties
+++ /dev/null
@@ -1,13 +0,0 @@
-# This file is automatically generated by Android Tools.
-# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
-#
-# This file must be checked in Version Control Systems.
-#
-# To customize properties used by the Ant build system use,
-# "ant.properties", and override values to adapt the script to your
-# project structure.
-
-# Project target.
-target=android-15
-android.library=true
-
diff --git a/testapps/jarCheckTests3/lib2/res/layout/main.xml b/testapps/jarCheckTests3/lib2/res/layout/main.xml
deleted file mode 100644
index 7fe5dce..0000000
--- a/testapps/jarCheckTests3/lib2/res/layout/main.xml
+++ /dev/null
@@ -1,13 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:orientation="vertical"
-    android:layout_width="fill_parent"
-    android:layout_height="fill_parent"
-    >
-<TextView  
-    android:layout_width="fill_parent" 
-    android:layout_height="wrap_content" 
-    android:text="Hello World, MyActivity"
-    />
-</LinearLayout>
-
diff --git a/testapps/jarCheckTests3/lib2/res/values/strings.xml b/testapps/jarCheckTests3/lib2/res/values/strings.xml
deleted file mode 100644
index 3fa203a..0000000
--- a/testapps/jarCheckTests3/lib2/res/values/strings.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<resources>
-    <string name="app_name">MyActivity</string>
-</resources>
diff --git a/testapps/jarCheckTests3/lib2/src/com/android/tests/libwithsupport2/MyActivity.java b/testapps/jarCheckTests3/lib2/src/com/android/tests/libwithsupport2/MyActivity.java
deleted file mode 100644
index fc97aa7..0000000
--- a/testapps/jarCheckTests3/lib2/src/com/android/tests/libwithsupport2/MyActivity.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package com.android.tests.libwithsupport2;
-
-import android.app.Activity;
-import android.os.Bundle;
-
-public class MyActivity extends Activity
-{
-    /** Called when the activity is first created. */
-    @Override
-    public void onCreate(Bundle savedInstanceState)
-    {
-        super.onCreate(savedInstanceState);
-        setContentView(R.layout.main);
-    }
-}
diff --git a/testapps/javaProjectTest/COMPILE_AND_RUN b/testapps/javaProjectTest/COMPILE_AND_RUN
deleted file mode 100644
index e69de29..0000000
--- a/testapps/javaProjectTest/COMPILE_AND_RUN
+++ /dev/null
diff --git a/testapps/javaProjectTest/ECLIPSEONLY b/testapps/javaProjectTest/ECLIPSEONLY
deleted file mode 100644
index e69de29..0000000
--- a/testapps/javaProjectTest/ECLIPSEONLY
+++ /dev/null
diff --git a/testapps/javaProjectTest/README.txt b/testapps/javaProjectTest/README.txt
deleted file mode 100644
index 2035b7e..0000000
--- a/testapps/javaProjectTest/README.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-This test requires a workspace setup:
-
-- Create User Library called "USERLIBTEST2"
-- Add to this library the jar located in lib1/jars/basicJar3.jar
-- App should compile, and deploy on device and UI show show SUCCESS
\ No newline at end of file
diff --git a/testapps/javaProjectTest/SUCCESS b/testapps/javaProjectTest/SUCCESS
deleted file mode 100644
index e69de29..0000000
--- a/testapps/javaProjectTest/SUCCESS
+++ /dev/null
diff --git a/testapps/javaProjectTest/app/.classpath b/testapps/javaProjectTest/app/.classpath
deleted file mode 100644
index af64480..0000000
--- a/testapps/javaProjectTest/app/.classpath
+++ /dev/null
@@ -1,9 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="src" path="gen"/>
-	<classpathentry kind="con" path="com.android.ide.eclipse.adt.ANDROID_FRAMEWORK"/>
-	<classpathentry kind="con" path="com.android.ide.eclipse.adt.LIBRARIES"/>
-	<classpathentry combineaccessrules="false" exported="true" kind="src" path="/javaProjectTest-javaProject3"/>
-	<classpathentry kind="output" path="bin/classes"/>
-</classpath>
diff --git a/testapps/javaProjectTest/app/.project b/testapps/javaProjectTest/app/.project
deleted file mode 100644
index 187fb0e..0000000
--- a/testapps/javaProjectTest/app/.project
+++ /dev/null
@@ -1,33 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>javaProjectTest-app</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>com.android.ide.eclipse.adt.ResourceManagerBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>com.android.ide.eclipse.adt.PreCompilerBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>com.android.ide.eclipse.adt.ApkBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>com.android.ide.eclipse.adt.AndroidNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/testapps/javaProjectTest/app/AndroidManifest.xml b/testapps/javaProjectTest/app/AndroidManifest.xml
deleted file mode 100644
index 36ec8fb..0000000
--- a/testapps/javaProjectTest/app/AndroidManifest.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
-    package="com.android.tests.javaprojecttest.app"
-    android:versionCode="1"
-    android:versionName="1.0" >
-
-    <uses-sdk android:minSdkVersion="15" />
-
-    <application
-        android:icon="@drawable/icon"
-        android:label="@string/app_name" >
-        <activity
-            android:name="com.android.tests.javaprojecttest.app.Main"
-            android:label="@string/app_name" >
-            <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/testapps/javaProjectTest/app/proguard-project.txt b/testapps/javaProjectTest/app/proguard-project.txt
deleted file mode 100644
index 349f80f..0000000
--- a/testapps/javaProjectTest/app/proguard-project.txt
+++ /dev/null
@@ -1,22 +0,0 @@
-# To enable ProGuard in your project, edit project.properties
-# to define the proguard.config property as described in that file.
-#
-# Add project specific ProGuard rules here.
-# By default, the flags in this file are appended to flags specified
-# in ${sdk.dir}/tools/proguard/proguard-android.txt
-# You can edit the include path and order by changing the ProGuard
-# include property in project.properties.
-#
-# For more details, see
-#   http://developer.android.com/guide/developing/tools/proguard.html
-
-# Add any project specific keep options here:
-
-# If your project uses WebView with JS, uncomment the following
-# and specify the fully qualified class name to the JavaScript interface
-# class:
-#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
-#   public *;
-#}
-
--adaptclassstrings
\ No newline at end of file
diff --git a/testapps/javaProjectTest/app/project.properties b/testapps/javaProjectTest/app/project.properties
deleted file mode 100644
index 9384511..0000000
--- a/testapps/javaProjectTest/app/project.properties
+++ /dev/null
@@ -1,16 +0,0 @@
-# This file is automatically generated by Android Tools.
-# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
-#
-# This file must be checked in Version Control Systems.
-#
-# To customize properties used by the Ant build system edit
-# "ant.properties", and override values to adapt the script to your
-# project structure.
-#
-# To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home):
-proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt
-
-# Project target.
-target=android-15
-android.library.reference.1=../lib1
-android.library.reference.2=../lib2
diff --git a/testapps/javaProjectTest/app/res/drawable-hdpi/icon.png b/testapps/javaProjectTest/app/res/drawable-hdpi/icon.png
deleted file mode 100644
index 8074c4c..0000000
--- a/testapps/javaProjectTest/app/res/drawable-hdpi/icon.png
+++ /dev/null
Binary files differ
diff --git a/testapps/javaProjectTest/app/res/drawable-ldpi/icon.png b/testapps/javaProjectTest/app/res/drawable-ldpi/icon.png
deleted file mode 100644
index 1095584..0000000
--- a/testapps/javaProjectTest/app/res/drawable-ldpi/icon.png
+++ /dev/null
Binary files differ
diff --git a/testapps/javaProjectTest/app/res/drawable-mdpi/icon.png b/testapps/javaProjectTest/app/res/drawable-mdpi/icon.png
deleted file mode 100644
index a07c69f..0000000
--- a/testapps/javaProjectTest/app/res/drawable-mdpi/icon.png
+++ /dev/null
Binary files differ
diff --git a/testapps/javaProjectTest/app/res/layout/main.xml b/testapps/javaProjectTest/app/res/layout/main.xml
deleted file mode 100644
index 29accb3..0000000
--- a/testapps/javaProjectTest/app/res/layout/main.xml
+++ /dev/null
@@ -1,71 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:tools="http://schemas.android.com/tools"
-    android:layout_width="fill_parent"
-    android:layout_height="fill_parent"
-    android:orientation="vertical" >
-
-    <TextView
-        android:id="@+id/app"
-        android:layout_width="fill_parent"
-        android:layout_height="wrap_content"
-        android:text="\\?"
-        tools:ignore="HardcodedText" />
-
-    <TextView
-        android:id="@+id/lib1"
-        android:layout_width="fill_parent"
-        android:layout_height="wrap_content"
-        android:text="\\?"
-        tools:ignore="HardcodedText" />
-
-    <TextView
-        android:id="@+id/lib2"
-        android:layout_width="fill_parent"
-        android:layout_height="wrap_content"
-        android:text="\\?"
-        tools:ignore="HardcodedText" />
-
-    <TextView
-        android:id="@+id/javaProject1"
-        android:layout_width="fill_parent"
-        android:layout_height="wrap_content"
-        android:text="\\?"
-        tools:ignore="HardcodedText" />
-
-    <TextView
-        android:id="@+id/javaProject2"
-        android:layout_width="fill_parent"
-        android:layout_height="wrap_content"
-        android:text="\\?"
-        tools:ignore="HardcodedText" />
-
-    <TextView
-        android:id="@+id/javaProject3"
-        android:layout_width="fill_parent"
-        android:layout_height="wrap_content"
-        android:text="\\?"
-        tools:ignore="HardcodedText" />
-
-    <TextView
-        android:id="@+id/basicJar"
-        android:layout_width="fill_parent"
-        android:layout_height="wrap_content"
-        android:text="\\?"
-        tools:ignore="HardcodedText" />
-
-    <TextView
-        android:id="@+id/basicJar2"
-        android:layout_width="fill_parent"
-        android:layout_height="wrap_content"
-        android:text="\\?"
-        tools:ignore="HardcodedText" />
-
-    <TextView
-        android:id="@+id/basicJar3"
-        android:layout_width="fill_parent"
-        android:layout_height="wrap_content"
-        android:text="\\?"
-        tools:ignore="HardcodedText" />
-
-</LinearLayout>
\ No newline at end of file
diff --git a/testapps/javaProjectTest/app/res/values/strings.xml b/testapps/javaProjectTest/app/res/values/strings.xml
deleted file mode 100644
index 705a565..0000000
--- a/testapps/javaProjectTest/app/res/values/strings.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<resources>
-
-    <string name="app_name">javaProjectTest-app</string>
-
-</resources>
\ No newline at end of file
diff --git a/testapps/javaProjectTest/app/src/com/android/tests/javaprojecttest/app/App.java b/testapps/javaProjectTest/app/src/com/android/tests/javaprojecttest/app/App.java
deleted file mode 100644
index aa5d157..0000000
--- a/testapps/javaProjectTest/app/src/com/android/tests/javaprojecttest/app/App.java
+++ /dev/null
@@ -1,33 +0,0 @@
-package com.android.tests.javaprojecttest.app;
-
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-
-public class App {
-
-    public static String getContent() {
-        InputStream input = App.class.getResourceAsStream("App.txt");
-        if (input == null) {
-            return "FAILED TO FIND App.txt";
-        }
-
-        BufferedReader reader = null;
-        try {
-            reader = new BufferedReader(new InputStreamReader(input, "UTF-8"));
-
-            return reader.readLine();
-        } catch (IOException e) {
-        } finally {
-            if (reader != null) {
-                try {
-                    reader.close();
-                } catch (IOException e) {
-                }
-            }
-        }
-        
-        return "FAILED TO READ CONTENT";
-    }
-}
diff --git a/testapps/javaProjectTest/app/src/com/android/tests/javaprojecttest/app/App.txt b/testapps/javaProjectTest/app/src/com/android/tests/javaprojecttest/app/App.txt
deleted file mode 100644
index d488bc4..0000000
--- a/testapps/javaProjectTest/app/src/com/android/tests/javaprojecttest/app/App.txt
+++ /dev/null
@@ -1 +0,0 @@
-SUCCESS from App
\ No newline at end of file
diff --git a/testapps/javaProjectTest/app/src/com/android/tests/javaprojecttest/app/Main.java b/testapps/javaProjectTest/app/src/com/android/tests/javaprojecttest/app/Main.java
deleted file mode 100644
index 51b3228..0000000
--- a/testapps/javaProjectTest/app/src/com/android/tests/javaprojecttest/app/Main.java
+++ /dev/null
@@ -1,51 +0,0 @@
-package com.android.tests.javaprojecttest.app;
-
-import android.app.Activity;
-import android.os.Bundle;
-import android.widget.TextView;
-
-import com.android.tests.basicjar.BasicJar;
-import com.android.tests.basicjar2.BasicJar2;
-import com.android.tests.basicjar3.BasicJar3;
-import com.android.tests.javaprojecttest.javaproject.JavaProject;
-import com.android.tests.javaprojecttest.javaproject2.JavaProject2;
-import com.android.tests.javaprojecttest.javaproject3.JavaProject3;
-import com.android.tests.javaprojecttest.lib1.Lib1;
-import com.android.tests.javaprojecttest.lib2.Lib2;
-
-public class Main extends Activity {
-    /** Called when the activity is first created. */
-    @Override
-    public void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-        setContentView(R.layout.main);
-
-        TextView tv = (TextView) findViewById(R.id.app);
-        tv.setText("App: " + App.getContent());
-
-        tv = (TextView) findViewById(R.id.lib1);
-        tv.setText("Lib1: " + Lib1.getContent());
-
-        tv = (TextView) findViewById(R.id.lib2);
-        tv.setText("Lib2: " + Lib2.getContent());
-
-        tv = (TextView) findViewById(R.id.javaProject1);
-        tv.setText("JavaProject: " + JavaProject.getContent());
-
-        tv = (TextView) findViewById(R.id.javaProject2);
-        tv.setText("JavaProject2: " + JavaProject2.getContent());
-
-        tv = (TextView) findViewById(R.id.javaProject3);
-        tv.setText("JavaProject3: " + JavaProject3.getContent());
-
-        tv = (TextView) findViewById(R.id.basicJar);
-        tv.setText("BasicJar: " + BasicJar.getContent());
-
-        tv = (TextView) findViewById(R.id.basicJar2);
-        tv.setText("BasicJar2: " + BasicJar2.getContent());
-
-        tv = (TextView) findViewById(R.id.basicJar3);
-        tv.setText("BasicJar3: " + BasicJar3.getContent());
-
-    }
-}
\ No newline at end of file
diff --git a/testapps/javaProjectTest/javaProject/.classpath b/testapps/javaProjectTest/javaProject/.classpath
deleted file mode 100644
index f916720..0000000
--- a/testapps/javaProjectTest/javaProject/.classpath
+++ /dev/null
@@ -1,8 +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/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/>
-	<classpathentry combineaccessrules="false" exported="true" kind="src" path="/javaProjectTest-javaProject2"/>
-	<classpathentry kind="lib" path="libs/basicJar.jar"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/testapps/javaProjectTest/javaProject/.project b/testapps/javaProjectTest/javaProject/.project
deleted file mode 100644
index 8d99b08..0000000
--- a/testapps/javaProjectTest/javaProject/.project
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>javaProjectTest-javaProject</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/testapps/javaProjectTest/javaProject/libs/basicJar.jar b/testapps/javaProjectTest/javaProject/libs/basicJar.jar
deleted file mode 100644
index 319ed02..0000000
--- a/testapps/javaProjectTest/javaProject/libs/basicJar.jar
+++ /dev/null
Binary files differ
diff --git a/testapps/javaProjectTest/javaProject/src/com/android/tests/javaprojecttest/javaproject/JavaProject.java b/testapps/javaProjectTest/javaProject/src/com/android/tests/javaprojecttest/javaproject/JavaProject.java
deleted file mode 100644
index fe0e882..0000000
--- a/testapps/javaProjectTest/javaProject/src/com/android/tests/javaprojecttest/javaproject/JavaProject.java
+++ /dev/null
@@ -1,33 +0,0 @@
-package com.android.tests.javaprojecttest.javaproject;
-
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-
-public class JavaProject {
-
-    public static String getContent() {
-        InputStream input = JavaProject.class.getResourceAsStream("/com/android/tests/javaprojecttest/javaproject/JavaProject.txt");
-        if (input == null) {
-            return "FAILED TO FIND JavaProject.txt";
-        }
-
-        BufferedReader reader = null;
-        try {
-            reader = new BufferedReader(new InputStreamReader(input, "UTF-8"));
-
-            return reader.readLine();
-        } catch (IOException e) {
-        } finally {
-            if (reader != null) {
-                try {
-                    reader.close();
-                } catch (IOException e) {
-                }
-            }
-        }
-        
-        return "FAILED TO READ CONTENT";
-    }
-}
diff --git a/testapps/javaProjectTest/javaProject/src/com/android/tests/javaprojecttest/javaproject/JavaProject.txt b/testapps/javaProjectTest/javaProject/src/com/android/tests/javaprojecttest/javaproject/JavaProject.txt
deleted file mode 100644
index 5742eaa..0000000
--- a/testapps/javaProjectTest/javaProject/src/com/android/tests/javaprojecttest/javaproject/JavaProject.txt
+++ /dev/null
@@ -1 +0,0 @@
-SUCCESS from javaProject
\ No newline at end of file
diff --git a/testapps/javaProjectTest/javaProject2/.classpath b/testapps/javaProjectTest/javaProject2/.classpath
deleted file mode 100644
index bd5c4bf..0000000
--- a/testapps/javaProjectTest/javaProject2/.classpath
+++ /dev/null
@@ -1,7 +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/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/>
-	<classpathentry exported="true" kind="lib" path="libs/basicJar.jar"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/testapps/javaProjectTest/javaProject2/.project b/testapps/javaProjectTest/javaProject2/.project
deleted file mode 100644
index 70658ff..0000000
--- a/testapps/javaProjectTest/javaProject2/.project
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>javaProjectTest-javaProject2</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/testapps/javaProjectTest/javaProject2/libs/basicJar.jar b/testapps/javaProjectTest/javaProject2/libs/basicJar.jar
deleted file mode 100644
index 319ed02..0000000
--- a/testapps/javaProjectTest/javaProject2/libs/basicJar.jar
+++ /dev/null
Binary files differ
diff --git a/testapps/javaProjectTest/javaProject2/libs/basicJar_not_in_classpath.jar b/testapps/javaProjectTest/javaProject2/libs/basicJar_not_in_classpath.jar
deleted file mode 100644
index a81b929..0000000
--- a/testapps/javaProjectTest/javaProject2/libs/basicJar_not_in_classpath.jar
+++ /dev/null
Binary files differ
diff --git a/testapps/javaProjectTest/javaProject2/src/com/android/tests/javaprojecttest/javaproject2/JavaProject2.java b/testapps/javaProjectTest/javaProject2/src/com/android/tests/javaprojecttest/javaproject2/JavaProject2.java
deleted file mode 100644
index 5324fc1..0000000
--- a/testapps/javaProjectTest/javaProject2/src/com/android/tests/javaprojecttest/javaproject2/JavaProject2.java
+++ /dev/null
@@ -1,33 +0,0 @@
-package com.android.tests.javaprojecttest.javaproject2;
-
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-
-public class JavaProject2 {
-
-    public static String getContent() {
-        InputStream input = JavaProject2.class.getResourceAsStream("/com/android/tests/javaprojecttest/javaproject2/JavaProject2.txt");
-        if (input == null) {
-            return "FAILED TO FIND JavaProject2.txt";
-        }
-
-        BufferedReader reader = null;
-        try {
-            reader = new BufferedReader(new InputStreamReader(input, "UTF-8"));
-
-            return reader.readLine();
-        } catch (IOException e) {
-        } finally {
-            if (reader != null) {
-                try {
-                    reader.close();
-                } catch (IOException e) {
-                }
-            }
-        }
-        
-        return "FAILED TO READ CONTENT";
-    }
-}
diff --git a/testapps/javaProjectTest/javaProject2/src/com/android/tests/javaprojecttest/javaproject2/JavaProject2.txt b/testapps/javaProjectTest/javaProject2/src/com/android/tests/javaprojecttest/javaproject2/JavaProject2.txt
deleted file mode 100644
index 6ab43f7..0000000
--- a/testapps/javaProjectTest/javaProject2/src/com/android/tests/javaprojecttest/javaproject2/JavaProject2.txt
+++ /dev/null
@@ -1 +0,0 @@
-SUCCESS from javaProject2
\ No newline at end of file
diff --git a/testapps/javaProjectTest/javaProject3/.classpath b/testapps/javaProjectTest/javaProject3/.classpath
deleted file mode 100644
index 3ded304..0000000
--- a/testapps/javaProjectTest/javaProject3/.classpath
+++ /dev/null
@@ -1,7 +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/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/>
-	<classpathentry exported="true" kind="lib" path="libs/basicJar2.jar" sourcepath="/Volumes/Android/int/master/sdk/testapps/basicJar2/src"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/testapps/javaProjectTest/javaProject3/.project b/testapps/javaProjectTest/javaProject3/.project
deleted file mode 100644
index b3b3237..0000000
--- a/testapps/javaProjectTest/javaProject3/.project
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>javaProjectTest-javaProject3</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/testapps/javaProjectTest/javaProject3/libs/basicJar2.jar b/testapps/javaProjectTest/javaProject3/libs/basicJar2.jar
deleted file mode 100644
index 5af7cf0..0000000
--- a/testapps/javaProjectTest/javaProject3/libs/basicJar2.jar
+++ /dev/null
Binary files differ
diff --git a/testapps/javaProjectTest/javaProject3/src/com/android/tests/javaprojecttest/javaproject3/JavaProject3.java b/testapps/javaProjectTest/javaProject3/src/com/android/tests/javaprojecttest/javaproject3/JavaProject3.java
deleted file mode 100644
index bafe082..0000000
--- a/testapps/javaProjectTest/javaProject3/src/com/android/tests/javaprojecttest/javaproject3/JavaProject3.java
+++ /dev/null
@@ -1,33 +0,0 @@
-package com.android.tests.javaprojecttest.javaproject3;
-
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-
-public class JavaProject3 {
-
-    public static String getContent() {
-        InputStream input = JavaProject3.class.getResourceAsStream("/com/android/tests/javaprojecttest/javaproject3/JavaProject3.txt");
-        if (input == null) {
-            return "FAILED TO FIND JavaProject3.txt";
-        }
-
-        BufferedReader reader = null;
-        try {
-            reader = new BufferedReader(new InputStreamReader(input, "UTF-8"));
-
-            return reader.readLine();
-        } catch (IOException e) {
-        } finally {
-            if (reader != null) {
-                try {
-                    reader.close();
-                } catch (IOException e) {
-                }
-            }
-        }
-        
-        return "FAILED TO READ CONTENT";
-    }
-}
diff --git a/testapps/javaProjectTest/javaProject3/src/com/android/tests/javaprojecttest/javaproject3/JavaProject3.txt b/testapps/javaProjectTest/javaProject3/src/com/android/tests/javaprojecttest/javaproject3/JavaProject3.txt
deleted file mode 100644
index b47ec76..0000000
--- a/testapps/javaProjectTest/javaProject3/src/com/android/tests/javaprojecttest/javaproject3/JavaProject3.txt
+++ /dev/null
@@ -1 +0,0 @@
-SUCCESS from javaProject3
\ No newline at end of file
diff --git a/testapps/javaProjectTest/lib1/.classpath b/testapps/javaProjectTest/lib1/.classpath
deleted file mode 100644
index e609be1..0000000
--- a/testapps/javaProjectTest/lib1/.classpath
+++ /dev/null
@@ -1,10 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="src" path="gen"/>
-	<classpathentry kind="con" path="com.android.ide.eclipse.adt.ANDROID_FRAMEWORK"/>
-	<classpathentry kind="con" path="com.android.ide.eclipse.adt.LIBRARIES"/>
-	<classpathentry combineaccessrules="false" exported="true" kind="src" path="/javaProjectTest-javaProject"/>
-	<classpathentry exported="true" kind="con" path="org.eclipse.jdt.USER_LIBRARY/USERLIBTEST2"/>
-	<classpathentry kind="output" path="bin/classes"/>
-</classpath>
diff --git a/testapps/javaProjectTest/lib1/.project b/testapps/javaProjectTest/lib1/.project
deleted file mode 100644
index cac8ac1..0000000
--- a/testapps/javaProjectTest/lib1/.project
+++ /dev/null
@@ -1,33 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>javaProjectTest-Lib1</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>com.android.ide.eclipse.adt.ResourceManagerBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>com.android.ide.eclipse.adt.PreCompilerBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>com.android.ide.eclipse.adt.ApkBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>com.android.ide.eclipse.adt.AndroidNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/testapps/javaProjectTest/lib1/AndroidManifest.xml b/testapps/javaProjectTest/lib1/AndroidManifest.xml
deleted file mode 100644
index c51696b..0000000
--- a/testapps/javaProjectTest/lib1/AndroidManifest.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
-    package="com.android.tests.javaprojecttest.lib1"
-    android:versionCode="1"
-    android:versionName="1.0" >
-
-    <application
-        android:icon="@drawable/ic_launcher"
-        android:label="@string/app_name" >
-        <activity
-            android:name=".Main"
-            android:label="@string/app_name" >
-            <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/testapps/javaProjectTest/lib1/jars/basicJar3.jar b/testapps/javaProjectTest/lib1/jars/basicJar3.jar
deleted file mode 100644
index 3fbf064..0000000
--- a/testapps/javaProjectTest/lib1/jars/basicJar3.jar
+++ /dev/null
Binary files differ
diff --git a/testapps/javaProjectTest/lib1/libs/android-support-v4.jar b/testapps/javaProjectTest/lib1/libs/android-support-v4.jar
deleted file mode 100644
index d006198..0000000
--- a/testapps/javaProjectTest/lib1/libs/android-support-v4.jar
+++ /dev/null
Binary files differ
diff --git a/testapps/javaProjectTest/lib1/proguard-project.txt b/testapps/javaProjectTest/lib1/proguard-project.txt
deleted file mode 100644
index f2fe155..0000000
--- a/testapps/javaProjectTest/lib1/proguard-project.txt
+++ /dev/null
@@ -1,20 +0,0 @@
-# To enable ProGuard in your project, edit project.properties
-# to define the proguard.config property as described in that file.
-#
-# Add project specific ProGuard rules here.
-# By default, the flags in this file are appended to flags specified
-# in ${sdk.dir}/tools/proguard/proguard-android.txt
-# You can edit the include path and order by changing the ProGuard
-# include property in project.properties.
-#
-# For more details, see
-#   http://developer.android.com/guide/developing/tools/proguard.html
-
-# Add any project specific keep options here:
-
-# If your project uses WebView with JS, uncomment the following
-# and specify the fully qualified class name to the JavaScript interface
-# class:
-#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
-#   public *;
-#}
diff --git a/testapps/javaProjectTest/lib1/project.properties b/testapps/javaProjectTest/lib1/project.properties
deleted file mode 100644
index 36f1594..0000000
--- a/testapps/javaProjectTest/lib1/project.properties
+++ /dev/null
@@ -1,15 +0,0 @@
-# This file is automatically generated by Android Tools.
-# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
-#
-# This file must be checked in Version Control Systems.
-#
-# To customize properties used by the Ant build system edit
-# "ant.properties", and override values to adapt the script to your
-# project structure.
-#
-# To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home):
-#proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt
-
-# Project target.
-target=android-15
-android.library=true
diff --git a/testapps/javaProjectTest/lib1/res/drawable-hdpi/ic_launcher.png b/testapps/javaProjectTest/lib1/res/drawable-hdpi/ic_launcher.png
deleted file mode 100644
index 8074c4c..0000000
--- a/testapps/javaProjectTest/lib1/res/drawable-hdpi/ic_launcher.png
+++ /dev/null
Binary files differ
diff --git a/testapps/javaProjectTest/lib1/res/drawable-ldpi/ic_launcher.png b/testapps/javaProjectTest/lib1/res/drawable-ldpi/ic_launcher.png
deleted file mode 100644
index 1095584..0000000
--- a/testapps/javaProjectTest/lib1/res/drawable-ldpi/ic_launcher.png
+++ /dev/null
Binary files differ
diff --git a/testapps/javaProjectTest/lib1/res/drawable-mdpi/ic_launcher.png b/testapps/javaProjectTest/lib1/res/drawable-mdpi/ic_launcher.png
deleted file mode 100644
index a07c69f..0000000
--- a/testapps/javaProjectTest/lib1/res/drawable-mdpi/ic_launcher.png
+++ /dev/null
Binary files differ
diff --git a/testapps/javaProjectTest/lib1/res/layout/main.xml b/testapps/javaProjectTest/lib1/res/layout/main.xml
deleted file mode 100644
index b79cddb..0000000
--- a/testapps/javaProjectTest/lib1/res/layout/main.xml
+++ /dev/null
@@ -1,13 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:orientation="vertical"
-    android:layout_width="fill_parent"
-    android:layout_height="fill_parent"
-    >
-<TextView
-    android:layout_width="fill_parent"
-    android:layout_height="wrap_content"
-    android:text="Hello World, Main"
-    />
-</LinearLayout>
-
diff --git a/testapps/javaProjectTest/lib1/res/values/strings.xml b/testapps/javaProjectTest/lib1/res/values/strings.xml
deleted file mode 100644
index 549e4ea..0000000
--- a/testapps/javaProjectTest/lib1/res/values/strings.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<resources>
-    <string name="app_name">Main</string>
-</resources>
diff --git a/testapps/javaProjectTest/lib1/src/com/android/tests/javaprojecttest/lib1/Lib1.java b/testapps/javaProjectTest/lib1/src/com/android/tests/javaprojecttest/lib1/Lib1.java
deleted file mode 100644
index fe4a2a1..0000000
--- a/testapps/javaProjectTest/lib1/src/com/android/tests/javaprojecttest/lib1/Lib1.java
+++ /dev/null
@@ -1,33 +0,0 @@
-package com.android.tests.javaprojecttest.lib1;
-
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-
-public class Lib1 {
-
-    public static String getContent() {
-        InputStream input = Lib1.class.getResourceAsStream("Lib1.txt");
-        if (input == null) {
-            return "FAILED TO FIND Lib1.txt";
-        }
-
-        BufferedReader reader = null;
-        try {
-            reader = new BufferedReader(new InputStreamReader(input, "UTF-8"));
-
-            return reader.readLine();
-        } catch (IOException e) {
-        } finally {
-            if (reader != null) {
-                try {
-                    reader.close();
-                } catch (IOException e) {
-                }
-            }
-        }
-        
-        return "FAILED TO READ CONTENT";
-    }
-}
diff --git a/testapps/javaProjectTest/lib1/src/com/android/tests/javaprojecttest/lib1/Lib1.txt b/testapps/javaProjectTest/lib1/src/com/android/tests/javaprojecttest/lib1/Lib1.txt
deleted file mode 100644
index b3e210d..0000000
--- a/testapps/javaProjectTest/lib1/src/com/android/tests/javaprojecttest/lib1/Lib1.txt
+++ /dev/null
@@ -1 +0,0 @@
-SUCCESS from Lib1
\ No newline at end of file
diff --git a/testapps/javaProjectTest/lib1/src/com/android/tests/javaprojecttest/lib1/Main.java b/testapps/javaProjectTest/lib1/src/com/android/tests/javaprojecttest/lib1/Main.java
deleted file mode 100644
index f09e1cd..0000000
--- a/testapps/javaProjectTest/lib1/src/com/android/tests/javaprojecttest/lib1/Main.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package com.android.tests.javaprojecttest.lib1;
-
-import android.app.Activity;
-import android.os.Bundle;
-
-public class Main extends Activity
-{
-    /** Called when the activity is first created. */
-    @Override
-    public void onCreate(Bundle savedInstanceState)
-    {
-        super.onCreate(savedInstanceState);
-        setContentView(R.layout.main);
-    }
-}
diff --git a/testapps/javaProjectTest/lib2/.classpath b/testapps/javaProjectTest/lib2/.classpath
deleted file mode 100644
index 3cdb2e0..0000000
--- a/testapps/javaProjectTest/lib2/.classpath
+++ /dev/null
@@ -1,9 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="src" path="gen"/>
-	<classpathentry kind="con" path="com.android.ide.eclipse.adt.ANDROID_FRAMEWORK"/>
-	<classpathentry kind="con" path="com.android.ide.eclipse.adt.LIBRARIES"/>
-	<classpathentry combineaccessrules="false" exported="true" kind="src" path="/javaProjectTest-javaProject"/>
-	<classpathentry kind="output" path="bin/classes"/>
-</classpath>
diff --git a/testapps/javaProjectTest/lib2/.project b/testapps/javaProjectTest/lib2/.project
deleted file mode 100644
index 63d7a48..0000000
--- a/testapps/javaProjectTest/lib2/.project
+++ /dev/null
@@ -1,33 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>javaProjectTest-Lib2</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>com.android.ide.eclipse.adt.ResourceManagerBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>com.android.ide.eclipse.adt.PreCompilerBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>com.android.ide.eclipse.adt.ApkBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>com.android.ide.eclipse.adt.AndroidNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/testapps/javaProjectTest/lib2/AndroidManifest.xml b/testapps/javaProjectTest/lib2/AndroidManifest.xml
deleted file mode 100644
index 10d4a00..0000000
--- a/testapps/javaProjectTest/lib2/AndroidManifest.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
-    package="com.android.tests.javaprojecttest.lib2"
-    android:versionCode="1"
-    android:versionName="1.0" >
-
-    <application
-        android:icon="@drawable/ic_launcher"
-        android:label="@string/app_name" >
-        <activity
-            android:name="com.android.tests.javaprojecttest.lib2.Main"
-            android:label="@string/app_name" >
-            <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/testapps/javaProjectTest/lib2/libs/android-support-v4.jar b/testapps/javaProjectTest/lib2/libs/android-support-v4.jar
deleted file mode 100644
index d006198..0000000
--- a/testapps/javaProjectTest/lib2/libs/android-support-v4.jar
+++ /dev/null
Binary files differ
diff --git a/testapps/javaProjectTest/lib2/proguard-project.txt b/testapps/javaProjectTest/lib2/proguard-project.txt
deleted file mode 100644
index f2fe155..0000000
--- a/testapps/javaProjectTest/lib2/proguard-project.txt
+++ /dev/null
@@ -1,20 +0,0 @@
-# To enable ProGuard in your project, edit project.properties
-# to define the proguard.config property as described in that file.
-#
-# Add project specific ProGuard rules here.
-# By default, the flags in this file are appended to flags specified
-# in ${sdk.dir}/tools/proguard/proguard-android.txt
-# You can edit the include path and order by changing the ProGuard
-# include property in project.properties.
-#
-# For more details, see
-#   http://developer.android.com/guide/developing/tools/proguard.html
-
-# Add any project specific keep options here:
-
-# If your project uses WebView with JS, uncomment the following
-# and specify the fully qualified class name to the JavaScript interface
-# class:
-#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
-#   public *;
-#}
diff --git a/testapps/javaProjectTest/lib2/project.properties b/testapps/javaProjectTest/lib2/project.properties
deleted file mode 100644
index 36f1594..0000000
--- a/testapps/javaProjectTest/lib2/project.properties
+++ /dev/null
@@ -1,15 +0,0 @@
-# This file is automatically generated by Android Tools.
-# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
-#
-# This file must be checked in Version Control Systems.
-#
-# To customize properties used by the Ant build system edit
-# "ant.properties", and override values to adapt the script to your
-# project structure.
-#
-# To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home):
-#proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt
-
-# Project target.
-target=android-15
-android.library=true
diff --git a/testapps/javaProjectTest/lib2/res/drawable-hdpi/ic_launcher.png b/testapps/javaProjectTest/lib2/res/drawable-hdpi/ic_launcher.png
deleted file mode 100644
index 8074c4c..0000000
--- a/testapps/javaProjectTest/lib2/res/drawable-hdpi/ic_launcher.png
+++ /dev/null
Binary files differ
diff --git a/testapps/javaProjectTest/lib2/res/drawable-ldpi/ic_launcher.png b/testapps/javaProjectTest/lib2/res/drawable-ldpi/ic_launcher.png
deleted file mode 100644
index 1095584..0000000
--- a/testapps/javaProjectTest/lib2/res/drawable-ldpi/ic_launcher.png
+++ /dev/null
Binary files differ
diff --git a/testapps/javaProjectTest/lib2/res/drawable-mdpi/ic_launcher.png b/testapps/javaProjectTest/lib2/res/drawable-mdpi/ic_launcher.png
deleted file mode 100644
index a07c69f..0000000
--- a/testapps/javaProjectTest/lib2/res/drawable-mdpi/ic_launcher.png
+++ /dev/null
Binary files differ
diff --git a/testapps/javaProjectTest/lib2/res/layout/main.xml b/testapps/javaProjectTest/lib2/res/layout/main.xml
deleted file mode 100644
index b79cddb..0000000
--- a/testapps/javaProjectTest/lib2/res/layout/main.xml
+++ /dev/null
@@ -1,13 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:orientation="vertical"
-    android:layout_width="fill_parent"
-    android:layout_height="fill_parent"
-    >
-<TextView
-    android:layout_width="fill_parent"
-    android:layout_height="wrap_content"
-    android:text="Hello World, Main"
-    />
-</LinearLayout>
-
diff --git a/testapps/javaProjectTest/lib2/res/values/strings.xml b/testapps/javaProjectTest/lib2/res/values/strings.xml
deleted file mode 100644
index 549e4ea..0000000
--- a/testapps/javaProjectTest/lib2/res/values/strings.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<resources>
-    <string name="app_name">Main</string>
-</resources>
diff --git a/testapps/javaProjectTest/lib2/src/com/android/tests/javaprojecttest/lib2/Lib2.java b/testapps/javaProjectTest/lib2/src/com/android/tests/javaprojecttest/lib2/Lib2.java
deleted file mode 100644
index 5831cb2..0000000
--- a/testapps/javaProjectTest/lib2/src/com/android/tests/javaprojecttest/lib2/Lib2.java
+++ /dev/null
@@ -1,33 +0,0 @@
-package com.android.tests.javaprojecttest.lib2;
-
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-
-public class Lib2 {
-
-    public static String getContent() {
-        InputStream input = Lib2.class.getResourceAsStream("Lib2.txt");
-        if (input == null) {
-            return "FAILED TO FIND Lib2.txt";
-        }
-
-        BufferedReader reader = null;
-        try {
-            reader = new BufferedReader(new InputStreamReader(input, "UTF-8"));
-
-            return reader.readLine();
-        } catch (IOException e) {
-        } finally {
-            if (reader != null) {
-                try {
-                    reader.close();
-                } catch (IOException e) {
-                }
-            }
-        }
-        
-        return "FAILED TO READ CONTENT";
-    }
-}
diff --git a/testapps/javaProjectTest/lib2/src/com/android/tests/javaprojecttest/lib2/Lib2.txt b/testapps/javaProjectTest/lib2/src/com/android/tests/javaprojecttest/lib2/Lib2.txt
deleted file mode 100644
index 3ba8e35..0000000
--- a/testapps/javaProjectTest/lib2/src/com/android/tests/javaprojecttest/lib2/Lib2.txt
+++ /dev/null
@@ -1 +0,0 @@
-SUCCESS from Lib2
\ No newline at end of file
diff --git a/testapps/javaProjectTest/lib2/src/com/android/tests/javaprojecttest/lib2/Main.java b/testapps/javaProjectTest/lib2/src/com/android/tests/javaprojecttest/lib2/Main.java
deleted file mode 100644
index 1459896..0000000
--- a/testapps/javaProjectTest/lib2/src/com/android/tests/javaprojecttest/lib2/Main.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package com.android.tests.javaprojecttest.lib2;
-
-import android.app.Activity;
-import android.os.Bundle;
-
-public class Main extends Activity
-{
-    /** Called when the activity is first created. */
-    @Override
-    public void onCreate(Bundle savedInstanceState)
-    {
-        super.onCreate(savedInstanceState);
-        setContentView(R.layout.main);
-    }
-}
diff --git a/testapps/legacyTest/.classpath b/testapps/legacyTest/.classpath
deleted file mode 100644
index 1f92faf..0000000
--- a/testapps/legacyTest/.classpath
+++ /dev/null
@@ -1,9 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="src" path="gen"/>
-	<classpathentry kind="con" path="com.android.ide.eclipse.adt.ANDROID_FRAMEWORK"/>
-	<classpathentry kind="con" path="com.android.ide.eclipse.adt.LIBRARIES"/>
-	<classpathentry kind="lib" path="libs/basicJar.jar"/>
-	<classpathentry kind="output" path="bin/classes"/>
-</classpath>
diff --git a/testapps/legacyTest/.project b/testapps/legacyTest/.project
deleted file mode 100644
index 3e2af0e..0000000
--- a/testapps/legacyTest/.project
+++ /dev/null
@@ -1,33 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>legacyTest</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>com.android.ide.eclipse.adt.ResourceManagerBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>com.android.ide.eclipse.adt.PreCompilerBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>com.android.ide.eclipse.adt.ApkBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>com.android.ide.eclipse.adt.AndroidNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/testapps/legacyTest/AndroidManifest.xml b/testapps/legacyTest/AndroidManifest.xml
deleted file mode 100644
index 36ec8fb..0000000
--- a/testapps/legacyTest/AndroidManifest.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
-    package="com.android.tests.javaprojecttest.app"
-    android:versionCode="1"
-    android:versionName="1.0" >
-
-    <uses-sdk android:minSdkVersion="15" />
-
-    <application
-        android:icon="@drawable/icon"
-        android:label="@string/app_name" >
-        <activity
-            android:name="com.android.tests.javaprojecttest.app.Main"
-            android:label="@string/app_name" >
-            <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/testapps/legacyTest/ECLIPSEONLY b/testapps/legacyTest/ECLIPSEONLY
deleted file mode 100644
index e69de29..0000000
--- a/testapps/legacyTest/ECLIPSEONLY
+++ /dev/null
diff --git a/testapps/legacyTest/SUCCESS b/testapps/legacyTest/SUCCESS
deleted file mode 100644
index e69de29..0000000
--- a/testapps/legacyTest/SUCCESS
+++ /dev/null
diff --git a/testapps/legacyTest/libs/basicJar.jar b/testapps/legacyTest/libs/basicJar.jar
deleted file mode 100644
index 319ed02..0000000
--- a/testapps/legacyTest/libs/basicJar.jar
+++ /dev/null
Binary files differ
diff --git a/testapps/legacyTest/project.properties b/testapps/legacyTest/project.properties
deleted file mode 100644
index 0840b4a..0000000
--- a/testapps/legacyTest/project.properties
+++ /dev/null
@@ -1,14 +0,0 @@
-# This file is automatically generated by Android Tools.
-# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
-#
-# This file must be checked in Version Control Systems.
-#
-# To customize properties used by the Ant build system edit
-# "ant.properties", and override values to adapt the script to your
-# project structure.
-#
-# To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home):
-#proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt
-
-# Project target.
-target=android-15
diff --git a/testapps/legacyTest/res/drawable-hdpi/icon.png b/testapps/legacyTest/res/drawable-hdpi/icon.png
deleted file mode 100644
index 8074c4c..0000000
--- a/testapps/legacyTest/res/drawable-hdpi/icon.png
+++ /dev/null
Binary files differ
diff --git a/testapps/legacyTest/res/drawable-ldpi/icon.png b/testapps/legacyTest/res/drawable-ldpi/icon.png
deleted file mode 100644
index 1095584..0000000
--- a/testapps/legacyTest/res/drawable-ldpi/icon.png
+++ /dev/null
Binary files differ
diff --git a/testapps/legacyTest/res/drawable-mdpi/icon.png b/testapps/legacyTest/res/drawable-mdpi/icon.png
deleted file mode 100644
index a07c69f..0000000
--- a/testapps/legacyTest/res/drawable-mdpi/icon.png
+++ /dev/null
Binary files differ
diff --git a/testapps/legacyTest/res/layout/main.xml b/testapps/legacyTest/res/layout/main.xml
deleted file mode 100644
index 3e65644..0000000
--- a/testapps/legacyTest/res/layout/main.xml
+++ /dev/null
@@ -1,15 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:tools="http://schemas.android.com/tools"
-    android:layout_width="fill_parent"
-    android:layout_height="fill_parent"
-    android:orientation="vertical" >
-
-    <TextView
-        android:id="@+id/basicJar"
-        android:layout_width="fill_parent"
-        android:layout_height="wrap_content"
-        android:text="\\?"
-        tools:ignore="HardcodedText" />
-
-</LinearLayout>
\ No newline at end of file
diff --git a/testapps/legacyTest/res/values/strings.xml b/testapps/legacyTest/res/values/strings.xml
deleted file mode 100644
index 705a565..0000000
--- a/testapps/legacyTest/res/values/strings.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<resources>
-
-    <string name="app_name">javaProjectTest-app</string>
-
-</resources>
\ No newline at end of file
diff --git a/testapps/legacyTest/src/com/android/tests/javaprojecttest/app/Main.java b/testapps/legacyTest/src/com/android/tests/javaprojecttest/app/Main.java
deleted file mode 100644
index 5790753..0000000
--- a/testapps/legacyTest/src/com/android/tests/javaprojecttest/app/Main.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package com.android.tests.javaprojecttest.app;
-
-import android.app.Activity;
-import android.os.Bundle;
-import android.widget.TextView;
-
-import com.android.tests.basicjar.BasicJar;
-
-public class Main extends Activity {
-    /** Called when the activity is first created. */
-    @Override
-    public void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-        setContentView(R.layout.main);
-
-        TextView tv = (TextView) findViewById(R.id.basicJar);
-        tv.setText("basicJar: " + BasicJar.getContent());
-    }
-}
\ No newline at end of file
diff --git a/testapps/libsAndJarTest/COMPILE_AND_RUN b/testapps/libsAndJarTest/COMPILE_AND_RUN
deleted file mode 100644
index e69de29..0000000
--- a/testapps/libsAndJarTest/COMPILE_AND_RUN
+++ /dev/null
diff --git a/testapps/libsAndJarTest/SUCCESS b/testapps/libsAndJarTest/SUCCESS
deleted file mode 100644
index e69de29..0000000
--- a/testapps/libsAndJarTest/SUCCESS
+++ /dev/null
diff --git a/testapps/libsAndJarTest/app/.classpath b/testapps/libsAndJarTest/app/.classpath
deleted file mode 100644
index a4763d1..0000000
--- a/testapps/libsAndJarTest/app/.classpath
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="src" path="gen"/>
-	<classpathentry kind="con" path="com.android.ide.eclipse.adt.ANDROID_FRAMEWORK"/>
-	<classpathentry kind="con" path="com.android.ide.eclipse.adt.LIBRARIES"/>
-	<classpathentry kind="output" path="bin/classes"/>
-</classpath>
diff --git a/testapps/libsAndJarTest/app/.project b/testapps/libsAndJarTest/app/.project
deleted file mode 100644
index dc5f570..0000000
--- a/testapps/libsAndJarTest/app/.project
+++ /dev/null
@@ -1,33 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>libsAndJarTest-app</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>com.android.ide.eclipse.adt.ResourceManagerBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>com.android.ide.eclipse.adt.PreCompilerBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>com.android.ide.eclipse.adt.ApkBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>com.android.ide.eclipse.adt.AndroidNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/testapps/libsAndJarTest/app/AndroidManifest.xml b/testapps/libsAndJarTest/app/AndroidManifest.xml
deleted file mode 100644
index 36ec8fb..0000000
--- a/testapps/libsAndJarTest/app/AndroidManifest.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
-    package="com.android.tests.javaprojecttest.app"
-    android:versionCode="1"
-    android:versionName="1.0" >
-
-    <uses-sdk android:minSdkVersion="15" />
-
-    <application
-        android:icon="@drawable/icon"
-        android:label="@string/app_name" >
-        <activity
-            android:name="com.android.tests.javaprojecttest.app.Main"
-            android:label="@string/app_name" >
-            <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/testapps/libsAndJarTest/app/build.xml b/testapps/libsAndJarTest/app/build.xml
deleted file mode 100644
index c084512..0000000
--- a/testapps/libsAndJarTest/app/build.xml
+++ /dev/null
@@ -1,90 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project name="libsAndJarTest-app" default="help">
-
-    <!-- The local.properties file is created and updated by the 'android' tool.
-         It contains the path to the SDK. It should *NOT* be checked into
-         Version Control Systems. -->
-    <property file="local.properties" />
-
-    <!-- The ant.properties file can be created by you. It is only edited by the
-         'android' tool to add properties to it.
-         This is the place to change some Ant specific build properties.
-         Here are some properties you may want to change/update:
-
-         source.dir
-             The name of the source directory. Default is 'src'.
-         out.dir
-             The name of the output directory. Default is 'bin'.
-
-         For other overridable properties, look at the beginning of the rules
-         files in the SDK, at tools/ant/build.xml
-
-         Properties related to the SDK location or the project target should
-         be updated using the 'android' tool with the 'update' action.
-
-         This file is an integral part of the build system for your
-         application and should be checked into Version Control Systems.
-
-         -->
-    <property file="ant.properties" />
-
-    <!-- if sdk.dir was not set from one of the property file, then
-         get it from the ANDROID_HOME env var. -->
-    <property environment="env" />
-    <condition property="sdk.dir" value="${env.ANDROID_HOME}">
-        <isset property="env.ANDROID_HOME" />
-    </condition>
-
-    <!-- The project.properties file is created and updated by the 'android'
-         tool, as well as ADT.
-
-         This contains project specific properties such as project target, and library
-         dependencies. Lower level build properties are stored in ant.properties
-         (or in .classpath for Eclipse projects).
-
-         This file is an integral part of the build system for your
-         application and should be checked into Version Control Systems. -->
-    <loadproperties srcFile="project.properties" />
-
-    <!-- quick check on sdk.dir -->
-    <fail
-            message="sdk.dir is missing. Make sure to generate local.properties using 'android update project' or to inject it through the ANDROID_HOME environment variable."
-            unless="sdk.dir"
-    />
-
-    <!--
-        Import per project custom build rules if present at the root of the project.
-        This is the place to put custom intermediary targets such as:
-            -pre-build
-            -pre-compile
-            -post-compile (This is typically used for code obfuscation.
-                           Compiled code location: ${out.classes.absolute.dir}
-                           If this is not done in place, override ${out.dex.input.absolute.dir})
-            -post-package
-            -post-build
-            -pre-clean
-    -->
-    <import file="custom_rules.xml" optional="true" />
-
-    <!-- Import the actual build file.
-
-         To customize existing targets, there are two options:
-         - Customize only one target:
-             - copy/paste the target into this file, *before* the
-               <import> task.
-             - customize it to your needs.
-         - Customize the whole content of build.xml
-             - copy/paste the content of the rules files (minus the top node)
-               into this file, replacing the <import> task.
-             - customize to your needs.
-
-         ***********************
-         ****** IMPORTANT ******
-         ***********************
-         In all cases you must update the value of version-tag below to read 'custom' instead of an integer,
-         in order to avoid having your file be overridden by tools such as "android update project"
-    -->
-    <!-- version-tag: 1 -->
-    <import file="${sdk.dir}/tools/ant/build.xml" />
-
-</project>
diff --git a/testapps/libsAndJarTest/app/libs/basicJar2.jar b/testapps/libsAndJarTest/app/libs/basicJar2.jar
deleted file mode 100644
index 5af7cf0..0000000
--- a/testapps/libsAndJarTest/app/libs/basicJar2.jar
+++ /dev/null
Binary files differ
diff --git a/testapps/libsAndJarTest/app/libs/basicJar2.jar.properties b/testapps/libsAndJarTest/app/libs/basicJar2.jar.properties
deleted file mode 100644
index d8099d2..0000000
--- a/testapps/libsAndJarTest/app/libs/basicJar2.jar.properties
+++ /dev/null
@@ -1 +0,0 @@
-src=../../../basicJar2/src/
\ No newline at end of file
diff --git a/testapps/libsAndJarTest/app/proguard-project.txt b/testapps/libsAndJarTest/app/proguard-project.txt
deleted file mode 100644
index 349f80f..0000000
--- a/testapps/libsAndJarTest/app/proguard-project.txt
+++ /dev/null
@@ -1,22 +0,0 @@
-# To enable ProGuard in your project, edit project.properties
-# to define the proguard.config property as described in that file.
-#
-# Add project specific ProGuard rules here.
-# By default, the flags in this file are appended to flags specified
-# in ${sdk.dir}/tools/proguard/proguard-android.txt
-# You can edit the include path and order by changing the ProGuard
-# include property in project.properties.
-#
-# For more details, see
-#   http://developer.android.com/guide/developing/tools/proguard.html
-
-# Add any project specific keep options here:
-
-# If your project uses WebView with JS, uncomment the following
-# and specify the fully qualified class name to the JavaScript interface
-# class:
-#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
-#   public *;
-#}
-
--adaptclassstrings
\ No newline at end of file
diff --git a/testapps/libsAndJarTest/app/project.properties b/testapps/libsAndJarTest/app/project.properties
deleted file mode 100644
index 9df4221..0000000
--- a/testapps/libsAndJarTest/app/project.properties
+++ /dev/null
@@ -1,15 +0,0 @@
-# This file is automatically generated by Android Tools.
-# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
-#
-# This file must be checked in Version Control Systems.
-#
-# To customize properties used by the Ant build system edit
-# "ant.properties", and override values to adapt the script to your
-# project structure.
-#
-# Project target.
-target=android-15
-android.library.reference.1=../lib1
-
-# To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home):
-proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt
diff --git a/testapps/libsAndJarTest/app/res/drawable-hdpi/icon.png b/testapps/libsAndJarTest/app/res/drawable-hdpi/icon.png
deleted file mode 100644
index 8074c4c..0000000
--- a/testapps/libsAndJarTest/app/res/drawable-hdpi/icon.png
+++ /dev/null
Binary files differ
diff --git a/testapps/libsAndJarTest/app/res/drawable-ldpi/icon.png b/testapps/libsAndJarTest/app/res/drawable-ldpi/icon.png
deleted file mode 100644
index 1095584..0000000
--- a/testapps/libsAndJarTest/app/res/drawable-ldpi/icon.png
+++ /dev/null
Binary files differ
diff --git a/testapps/libsAndJarTest/app/res/drawable-mdpi/icon.png b/testapps/libsAndJarTest/app/res/drawable-mdpi/icon.png
deleted file mode 100644
index a07c69f..0000000
--- a/testapps/libsAndJarTest/app/res/drawable-mdpi/icon.png
+++ /dev/null
Binary files differ
diff --git a/testapps/libsAndJarTest/app/res/layout/main.xml b/testapps/libsAndJarTest/app/res/layout/main.xml
deleted file mode 100644
index 16df43c..0000000
--- a/testapps/libsAndJarTest/app/res/layout/main.xml
+++ /dev/null
@@ -1,43 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:tools="http://schemas.android.com/tools"
-    android:layout_width="fill_parent"
-    android:layout_height="fill_parent"
-    android:orientation="vertical" >
-
-    <TextView
-        android:id="@+id/app"
-        android:layout_width="fill_parent"
-        android:layout_height="wrap_content"
-        android:text="\\?"
-        tools:ignore="HardcodedText" />
-
-    <TextView
-        android:id="@+id/lib1"
-        android:layout_width="fill_parent"
-        android:layout_height="wrap_content"
-        android:text="\\?"
-        tools:ignore="HardcodedText" />
-
-    <TextView
-        android:id="@+id/lib2"
-        android:layout_width="fill_parent"
-        android:layout_height="wrap_content"
-        android:text="\\?"
-        tools:ignore="HardcodedText" />
-
-    <TextView
-        android:id="@+id/basicJar"
-        android:layout_width="fill_parent"
-        android:layout_height="wrap_content"
-        android:text="\\?"
-        tools:ignore="HardcodedText" />
-
-    <TextView
-        android:id="@+id/basicJar2"
-        android:layout_width="fill_parent"
-        android:layout_height="wrap_content"
-        android:text="\\?"
-        tools:ignore="HardcodedText" />
-
-</LinearLayout>
\ No newline at end of file
diff --git a/testapps/libsAndJarTest/app/res/values/strings.xml b/testapps/libsAndJarTest/app/res/values/strings.xml
deleted file mode 100644
index 6dc9f47..0000000
--- a/testapps/libsAndJarTest/app/res/values/strings.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<resources>
-
-    <string name="app_name">libsAndJarTest-app</string>
-    <string name="main">foo</string>
-
-</resources>
\ No newline at end of file
diff --git a/testapps/libsAndJarTest/app/src/com/android/tests/javaprojecttest/app/App.java b/testapps/libsAndJarTest/app/src/com/android/tests/javaprojecttest/app/App.java
deleted file mode 100644
index aa5d157..0000000
--- a/testapps/libsAndJarTest/app/src/com/android/tests/javaprojecttest/app/App.java
+++ /dev/null
@@ -1,33 +0,0 @@
-package com.android.tests.javaprojecttest.app;
-
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-
-public class App {
-
-    public static String getContent() {
-        InputStream input = App.class.getResourceAsStream("App.txt");
-        if (input == null) {
-            return "FAILED TO FIND App.txt";
-        }
-
-        BufferedReader reader = null;
-        try {
-            reader = new BufferedReader(new InputStreamReader(input, "UTF-8"));
-
-            return reader.readLine();
-        } catch (IOException e) {
-        } finally {
-            if (reader != null) {
-                try {
-                    reader.close();
-                } catch (IOException e) {
-                }
-            }
-        }
-        
-        return "FAILED TO READ CONTENT";
-    }
-}
diff --git a/testapps/libsAndJarTest/app/src/com/android/tests/javaprojecttest/app/App.txt b/testapps/libsAndJarTest/app/src/com/android/tests/javaprojecttest/app/App.txt
deleted file mode 100644
index d488bc4..0000000
--- a/testapps/libsAndJarTest/app/src/com/android/tests/javaprojecttest/app/App.txt
+++ /dev/null
@@ -1 +0,0 @@
-SUCCESS from App
\ No newline at end of file
diff --git a/testapps/libsAndJarTest/app/src/com/android/tests/javaprojecttest/app/Main.java b/testapps/libsAndJarTest/app/src/com/android/tests/javaprojecttest/app/Main.java
deleted file mode 100644
index 95dd00c..0000000
--- a/testapps/libsAndJarTest/app/src/com/android/tests/javaprojecttest/app/Main.java
+++ /dev/null
@@ -1,34 +0,0 @@
-package com.android.tests.javaprojecttest.app;
-
-import android.app.Activity;
-import android.os.Bundle;
-import android.widget.TextView;
-
-import com.android.tests.basicjar.BasicJar;
-import com.android.tests.basicjar2.BasicJar2;
-import com.android.tests.javaprojecttest.lib1.Lib1;
-import com.android.tests.javaprojecttest.lib2.Lib2;
-
-public class Main extends Activity {
-    /** Called when the activity is first created. */
-    @Override
-    public void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-        setContentView(R.layout.main);
-
-        TextView tv = (TextView) findViewById(R.id.app);
-        tv.setText("App: " + App.getContent());
-
-        tv = (TextView) findViewById(R.id.lib1);
-        tv.setText("Lib1: " + Lib1.getContent());
-
-        tv = (TextView) findViewById(R.id.lib2);
-        tv.setText("Lib2: " + Lib2.getContent());
-
-        tv = (TextView) findViewById(R.id.basicJar);
-        tv.setText("BasicJar: " + BasicJar.getContent());
-
-        tv = (TextView) findViewById(R.id.basicJar2);
-        tv.setText("BasicJar2: " + BasicJar2.getContent());
-    }
-}
\ No newline at end of file
diff --git a/testapps/libsAndJarTest/lib1/.classpath b/testapps/libsAndJarTest/lib1/.classpath
deleted file mode 100644
index a4763d1..0000000
--- a/testapps/libsAndJarTest/lib1/.classpath
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="src" path="gen"/>
-	<classpathentry kind="con" path="com.android.ide.eclipse.adt.ANDROID_FRAMEWORK"/>
-	<classpathentry kind="con" path="com.android.ide.eclipse.adt.LIBRARIES"/>
-	<classpathentry kind="output" path="bin/classes"/>
-</classpath>
diff --git a/testapps/libsAndJarTest/lib1/.project b/testapps/libsAndJarTest/lib1/.project
deleted file mode 100644
index 616ff1f..0000000
--- a/testapps/libsAndJarTest/lib1/.project
+++ /dev/null
@@ -1,33 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>libsAndJarTest-Lib1</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>com.android.ide.eclipse.adt.ResourceManagerBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>com.android.ide.eclipse.adt.PreCompilerBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>com.android.ide.eclipse.adt.ApkBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>com.android.ide.eclipse.adt.AndroidNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/testapps/libsAndJarTest/lib1/AndroidManifest.xml b/testapps/libsAndJarTest/lib1/AndroidManifest.xml
deleted file mode 100644
index c51696b..0000000
--- a/testapps/libsAndJarTest/lib1/AndroidManifest.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
-    package="com.android.tests.javaprojecttest.lib1"
-    android:versionCode="1"
-    android:versionName="1.0" >
-
-    <application
-        android:icon="@drawable/ic_launcher"
-        android:label="@string/app_name" >
-        <activity
-            android:name=".Main"
-            android:label="@string/app_name" >
-            <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/testapps/libsAndJarTest/lib1/build.xml b/testapps/libsAndJarTest/lib1/build.xml
deleted file mode 100644
index ed25521..0000000
--- a/testapps/libsAndJarTest/lib1/build.xml
+++ /dev/null
@@ -1,90 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project name="libsAndJarTest-lib1" default="help">
-
-    <!-- The local.properties file is created and updated by the 'android' tool.
-         It contains the path to the SDK. It should *NOT* be checked into
-         Version Control Systems. -->
-    <property file="local.properties" />
-
-    <!-- The ant.properties file can be created by you. It is only edited by the
-         'android' tool to add properties to it.
-         This is the place to change some Ant specific build properties.
-         Here are some properties you may want to change/update:
-
-         source.dir
-             The name of the source directory. Default is 'src'.
-         out.dir
-             The name of the output directory. Default is 'bin'.
-
-         For other overridable properties, look at the beginning of the rules
-         files in the SDK, at tools/ant/build.xml
-
-         Properties related to the SDK location or the project target should
-         be updated using the 'android' tool with the 'update' action.
-
-         This file is an integral part of the build system for your
-         application and should be checked into Version Control Systems.
-
-         -->
-    <property file="ant.properties" />
-
-    <!-- The project.properties file is created and updated by the 'android'
-         tool, as well as ADT.
-
-         This contains project specific properties such as project target, and library
-         dependencies. Lower level build properties are stored in ant.properties
-         (or in .classpath for Eclipse projects).
-
-         This file is an integral part of the build system for your
-         application and should be checked into Version Control Systems. -->
-    <loadproperties srcFile="project.properties" />
-
-    <!-- if sdk.dir was not set from one of the property file, then
-         get it from the ANDROID_HOME env var. -->
-    <property environment="env" />
-    <condition property="sdk.dir" value="${env.ANDROID_HOME}">
-        <isset property="env.ANDROID_HOME" />
-    </condition>
-
-    <!-- quick check on sdk.dir -->
-    <fail
-            message="sdk.dir is missing. Make sure to generate local.properties using 'android update project' or to inject it through the ANDROID_HOME environment variable."
-            unless="sdk.dir"
-    />
-
-    <!--
-        Import per project custom build rules if present at the root of the project.
-        This is the place to put custom intermediary targets such as:
-            -pre-build
-            -pre-compile
-            -post-compile (This is typically used for code obfuscation.
-                           Compiled code location: ${out.classes.absolute.dir}
-                           If this is not done in place, override ${out.dex.input.absolute.dir})
-            -post-package
-            -post-build
-            -pre-clean
-    -->
-    <import file="custom_rules.xml" optional="true" />
-
-    <!-- Import the actual build file.
-
-         To customize existing targets, there are two options:
-         - Customize only one target:
-             - copy/paste the target into this file, *before* the
-               <import> task.
-             - customize it to your needs.
-         - Customize the whole content of build.xml
-             - copy/paste the content of the rules files (minus the top node)
-               into this file, replacing the <import> task.
-             - customize to your needs.
-
-         ***********************
-         ****** IMPORTANT ******
-         ***********************
-         In all cases you must update the value of version-tag below to read 'custom' instead of an integer,
-         in order to avoid having your file be overridden by tools such as "android update project"
-    -->
-    <!-- version-tag: 1 -->
-    <import file="${sdk.dir}/tools/ant/build.xml" />
-
-</project>
diff --git a/testapps/libsAndJarTest/lib1/libs/android-support-v4.jar b/testapps/libsAndJarTest/lib1/libs/android-support-v4.jar
deleted file mode 100644
index d006198..0000000
--- a/testapps/libsAndJarTest/lib1/libs/android-support-v4.jar
+++ /dev/null
Binary files differ
diff --git a/testapps/libsAndJarTest/lib1/proguard-project.txt b/testapps/libsAndJarTest/lib1/proguard-project.txt
deleted file mode 100644
index f2fe155..0000000
--- a/testapps/libsAndJarTest/lib1/proguard-project.txt
+++ /dev/null
@@ -1,20 +0,0 @@
-# To enable ProGuard in your project, edit project.properties
-# to define the proguard.config property as described in that file.
-#
-# Add project specific ProGuard rules here.
-# By default, the flags in this file are appended to flags specified
-# in ${sdk.dir}/tools/proguard/proguard-android.txt
-# You can edit the include path and order by changing the ProGuard
-# include property in project.properties.
-#
-# For more details, see
-#   http://developer.android.com/guide/developing/tools/proguard.html
-
-# Add any project specific keep options here:
-
-# If your project uses WebView with JS, uncomment the following
-# and specify the fully qualified class name to the JavaScript interface
-# class:
-#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
-#   public *;
-#}
diff --git a/testapps/libsAndJarTest/lib1/project.properties b/testapps/libsAndJarTest/lib1/project.properties
deleted file mode 100644
index 480c5b6..0000000
--- a/testapps/libsAndJarTest/lib1/project.properties
+++ /dev/null
@@ -1,16 +0,0 @@
-# This file is automatically generated by Android Tools.
-# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
-#
-# This file must be checked in Version Control Systems.
-#
-# To customize properties used by the Ant build system edit
-# "ant.properties", and override values to adapt the script to your
-# project structure.
-#
-# To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home):
-#proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt
-
-# Project target.
-target=android-15
-android.library=true
-android.library.reference.1=../lib2
diff --git a/testapps/libsAndJarTest/lib1/res/drawable-hdpi/ic_launcher.png b/testapps/libsAndJarTest/lib1/res/drawable-hdpi/ic_launcher.png
deleted file mode 100644
index 8074c4c..0000000
--- a/testapps/libsAndJarTest/lib1/res/drawable-hdpi/ic_launcher.png
+++ /dev/null
Binary files differ
diff --git a/testapps/libsAndJarTest/lib1/res/drawable-ldpi/ic_launcher.png b/testapps/libsAndJarTest/lib1/res/drawable-ldpi/ic_launcher.png
deleted file mode 100644
index 1095584..0000000
--- a/testapps/libsAndJarTest/lib1/res/drawable-ldpi/ic_launcher.png
+++ /dev/null
Binary files differ
diff --git a/testapps/libsAndJarTest/lib1/res/drawable-mdpi/ic_launcher.png b/testapps/libsAndJarTest/lib1/res/drawable-mdpi/ic_launcher.png
deleted file mode 100644
index a07c69f..0000000
--- a/testapps/libsAndJarTest/lib1/res/drawable-mdpi/ic_launcher.png
+++ /dev/null
Binary files differ
diff --git a/testapps/libsAndJarTest/lib1/res/layout/main.xml b/testapps/libsAndJarTest/lib1/res/layout/main.xml
deleted file mode 100644
index b79cddb..0000000
--- a/testapps/libsAndJarTest/lib1/res/layout/main.xml
+++ /dev/null
@@ -1,13 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:orientation="vertical"
-    android:layout_width="fill_parent"
-    android:layout_height="fill_parent"
-    >
-<TextView
-    android:layout_width="fill_parent"
-    android:layout_height="wrap_content"
-    android:text="Hello World, Main"
-    />
-</LinearLayout>
-
diff --git a/testapps/libsAndJarTest/lib1/res/values/strings.xml b/testapps/libsAndJarTest/lib1/res/values/strings.xml
deleted file mode 100644
index 1993ff6..0000000
--- a/testapps/libsAndJarTest/lib1/res/values/strings.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<resources>
-
-    <string name="app_name">Main</string>
-    <string name="foo1">foo</string>
-
-</resources>
\ No newline at end of file
diff --git a/testapps/libsAndJarTest/lib1/src/com/android/tests/javaprojecttest/lib1/Lib1.java b/testapps/libsAndJarTest/lib1/src/com/android/tests/javaprojecttest/lib1/Lib1.java
deleted file mode 100644
index fe4a2a1..0000000
--- a/testapps/libsAndJarTest/lib1/src/com/android/tests/javaprojecttest/lib1/Lib1.java
+++ /dev/null
@@ -1,33 +0,0 @@
-package com.android.tests.javaprojecttest.lib1;
-
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-
-public class Lib1 {
-
-    public static String getContent() {
-        InputStream input = Lib1.class.getResourceAsStream("Lib1.txt");
-        if (input == null) {
-            return "FAILED TO FIND Lib1.txt";
-        }
-
-        BufferedReader reader = null;
-        try {
-            reader = new BufferedReader(new InputStreamReader(input, "UTF-8"));
-
-            return reader.readLine();
-        } catch (IOException e) {
-        } finally {
-            if (reader != null) {
-                try {
-                    reader.close();
-                } catch (IOException e) {
-                }
-            }
-        }
-        
-        return "FAILED TO READ CONTENT";
-    }
-}
diff --git a/testapps/libsAndJarTest/lib1/src/com/android/tests/javaprojecttest/lib1/Lib1.txt b/testapps/libsAndJarTest/lib1/src/com/android/tests/javaprojecttest/lib1/Lib1.txt
deleted file mode 100644
index b3e210d..0000000
--- a/testapps/libsAndJarTest/lib1/src/com/android/tests/javaprojecttest/lib1/Lib1.txt
+++ /dev/null
@@ -1 +0,0 @@
-SUCCESS from Lib1
\ No newline at end of file
diff --git a/testapps/libsAndJarTest/lib1/src/com/android/tests/javaprojecttest/lib1/Main.java b/testapps/libsAndJarTest/lib1/src/com/android/tests/javaprojecttest/lib1/Main.java
deleted file mode 100644
index 1c3ed35..0000000
--- a/testapps/libsAndJarTest/lib1/src/com/android/tests/javaprojecttest/lib1/Main.java
+++ /dev/null
@@ -1,20 +0,0 @@
-package com.android.tests.javaprojecttest.lib1;
-
-import android.app.Activity;
-import android.os.Bundle;
-
-import com.android.tests.javaprojecttest.lib2.Lib2;
-
-public class Main extends Activity
-{
-    /** Called when the activity is first created. */
-    @Override
-    public void onCreate(Bundle savedInstanceState)
-    {
-        super.onCreate(savedInstanceState);
-        setContentView(R.layout.main);
-
-        //Access some class from Lib2 to make sure we can access them.
-        String foo = Lib2.getContent();
-    }
-}
diff --git a/testapps/libsAndJarTest/lib2/.classpath b/testapps/libsAndJarTest/lib2/.classpath
deleted file mode 100644
index a4763d1..0000000
--- a/testapps/libsAndJarTest/lib2/.classpath
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="src" path="gen"/>
-	<classpathentry kind="con" path="com.android.ide.eclipse.adt.ANDROID_FRAMEWORK"/>
-	<classpathentry kind="con" path="com.android.ide.eclipse.adt.LIBRARIES"/>
-	<classpathentry kind="output" path="bin/classes"/>
-</classpath>
diff --git a/testapps/libsAndJarTest/lib2/.project b/testapps/libsAndJarTest/lib2/.project
deleted file mode 100644
index 3f2ef16..0000000
--- a/testapps/libsAndJarTest/lib2/.project
+++ /dev/null
@@ -1,33 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>libsAndJarTest-Lib2</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>com.android.ide.eclipse.adt.ResourceManagerBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>com.android.ide.eclipse.adt.PreCompilerBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>com.android.ide.eclipse.adt.ApkBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>com.android.ide.eclipse.adt.AndroidNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/testapps/libsAndJarTest/lib2/AndroidManifest.xml b/testapps/libsAndJarTest/lib2/AndroidManifest.xml
deleted file mode 100644
index 10d4a00..0000000
--- a/testapps/libsAndJarTest/lib2/AndroidManifest.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
-    package="com.android.tests.javaprojecttest.lib2"
-    android:versionCode="1"
-    android:versionName="1.0" >
-
-    <application
-        android:icon="@drawable/ic_launcher"
-        android:label="@string/app_name" >
-        <activity
-            android:name="com.android.tests.javaprojecttest.lib2.Main"
-            android:label="@string/app_name" >
-            <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/testapps/libsAndJarTest/lib2/build.xml b/testapps/libsAndJarTest/lib2/build.xml
deleted file mode 100644
index 4f351c8..0000000
--- a/testapps/libsAndJarTest/lib2/build.xml
+++ /dev/null
@@ -1,90 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project name="libsAndJarTest-lib2" default="help">
-
-    <!-- The local.properties file is created and updated by the 'android' tool.
-         It contains the path to the SDK. It should *NOT* be checked into
-         Version Control Systems. -->
-    <property file="local.properties" />
-
-    <!-- The ant.properties file can be created by you. It is only edited by the
-         'android' tool to add properties to it.
-         This is the place to change some Ant specific build properties.
-         Here are some properties you may want to change/update:
-
-         source.dir
-             The name of the source directory. Default is 'src'.
-         out.dir
-             The name of the output directory. Default is 'bin'.
-
-         For other overridable properties, look at the beginning of the rules
-         files in the SDK, at tools/ant/build.xml
-
-         Properties related to the SDK location or the project target should
-         be updated using the 'android' tool with the 'update' action.
-
-         This file is an integral part of the build system for your
-         application and should be checked into Version Control Systems.
-
-         -->
-    <property file="ant.properties" />
-
-    <!-- The project.properties file is created and updated by the 'android'
-         tool, as well as ADT.
-
-         This contains project specific properties such as project target, and library
-         dependencies. Lower level build properties are stored in ant.properties
-         (or in .classpath for Eclipse projects).
-
-         This file is an integral part of the build system for your
-         application and should be checked into Version Control Systems. -->
-    <loadproperties srcFile="project.properties" />
-
-    <!-- if sdk.dir was not set from one of the property file, then
-         get it from the ANDROID_HOME env var. -->
-    <property environment="env" />
-    <condition property="sdk.dir" value="${env.ANDROID_HOME}">
-        <isset property="env.ANDROID_HOME" />
-    </condition>
-
-    <!-- quick check on sdk.dir -->
-    <fail
-            message="sdk.dir is missing. Make sure to generate local.properties using 'android update project' or to inject it through the ANDROID_HOME environment variable."
-            unless="sdk.dir"
-    />
-
-    <!--
-        Import per project custom build rules if present at the root of the project.
-        This is the place to put custom intermediary targets such as:
-            -pre-build
-            -pre-compile
-            -post-compile (This is typically used for code obfuscation.
-                           Compiled code location: ${out.classes.absolute.dir}
-                           If this is not done in place, override ${out.dex.input.absolute.dir})
-            -post-package
-            -post-build
-            -pre-clean
-    -->
-    <import file="custom_rules.xml" optional="true" />
-
-    <!-- Import the actual build file.
-
-         To customize existing targets, there are two options:
-         - Customize only one target:
-             - copy/paste the target into this file, *before* the
-               <import> task.
-             - customize it to your needs.
-         - Customize the whole content of build.xml
-             - copy/paste the content of the rules files (minus the top node)
-               into this file, replacing the <import> task.
-             - customize to your needs.
-
-         ***********************
-         ****** IMPORTANT ******
-         ***********************
-         In all cases you must update the value of version-tag below to read 'custom' instead of an integer,
-         in order to avoid having your file be overridden by tools such as "android update project"
-    -->
-    <!-- version-tag: 1 -->
-    <import file="${sdk.dir}/tools/ant/build.xml" />
-
-</project>
diff --git a/testapps/libsAndJarTest/lib2/libs/android-support-v4.jar b/testapps/libsAndJarTest/lib2/libs/android-support-v4.jar
deleted file mode 100644
index d006198..0000000
--- a/testapps/libsAndJarTest/lib2/libs/android-support-v4.jar
+++ /dev/null
Binary files differ
diff --git a/testapps/libsAndJarTest/lib2/libs/basicJar.jar b/testapps/libsAndJarTest/lib2/libs/basicJar.jar
deleted file mode 100644
index 319ed02..0000000
--- a/testapps/libsAndJarTest/lib2/libs/basicJar.jar
+++ /dev/null
Binary files differ
diff --git a/testapps/libsAndJarTest/lib2/libs/basicJar.jar.properties b/testapps/libsAndJarTest/lib2/libs/basicJar.jar.properties
deleted file mode 100644
index c6b82fb..0000000
--- a/testapps/libsAndJarTest/lib2/libs/basicJar.jar.properties
+++ /dev/null
@@ -1 +0,0 @@
-src=../../../basicJar/src/
\ No newline at end of file
diff --git a/testapps/libsAndJarTest/lib2/proguard-project.txt b/testapps/libsAndJarTest/lib2/proguard-project.txt
deleted file mode 100644
index f2fe155..0000000
--- a/testapps/libsAndJarTest/lib2/proguard-project.txt
+++ /dev/null
@@ -1,20 +0,0 @@
-# To enable ProGuard in your project, edit project.properties
-# to define the proguard.config property as described in that file.
-#
-# Add project specific ProGuard rules here.
-# By default, the flags in this file are appended to flags specified
-# in ${sdk.dir}/tools/proguard/proguard-android.txt
-# You can edit the include path and order by changing the ProGuard
-# include property in project.properties.
-#
-# For more details, see
-#   http://developer.android.com/guide/developing/tools/proguard.html
-
-# Add any project specific keep options here:
-
-# If your project uses WebView with JS, uncomment the following
-# and specify the fully qualified class name to the JavaScript interface
-# class:
-#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
-#   public *;
-#}
diff --git a/testapps/libsAndJarTest/lib2/project.properties b/testapps/libsAndJarTest/lib2/project.properties
deleted file mode 100644
index 9be8830..0000000
--- a/testapps/libsAndJarTest/lib2/project.properties
+++ /dev/null
@@ -1,17 +0,0 @@
-# This file is automatically generated by Android Tools.
-# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
-#
-# This file must be checked in Version Control Systems.
-#
-# To customize properties used by the Ant build system edit
-# "ant.properties", and override values to adapt the script to your
-# project structure.
-#
-# To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home):
-#proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt
-
-# Project target.
-target=android-15
-android.library=true
-verbose=true
-
diff --git a/testapps/libsAndJarTest/lib2/res/drawable-hdpi/ic_launcher.png b/testapps/libsAndJarTest/lib2/res/drawable-hdpi/ic_launcher.png
deleted file mode 100644
index 8074c4c..0000000
--- a/testapps/libsAndJarTest/lib2/res/drawable-hdpi/ic_launcher.png
+++ /dev/null
Binary files differ
diff --git a/testapps/libsAndJarTest/lib2/res/drawable-ldpi/ic_launcher.png b/testapps/libsAndJarTest/lib2/res/drawable-ldpi/ic_launcher.png
deleted file mode 100644
index 1095584..0000000
--- a/testapps/libsAndJarTest/lib2/res/drawable-ldpi/ic_launcher.png
+++ /dev/null
Binary files differ
diff --git a/testapps/libsAndJarTest/lib2/res/drawable-mdpi/ic_launcher.png b/testapps/libsAndJarTest/lib2/res/drawable-mdpi/ic_launcher.png
deleted file mode 100644
index a07c69f..0000000
--- a/testapps/libsAndJarTest/lib2/res/drawable-mdpi/ic_launcher.png
+++ /dev/null
Binary files differ
diff --git a/testapps/libsAndJarTest/lib2/res/layout/main.xml b/testapps/libsAndJarTest/lib2/res/layout/main.xml
deleted file mode 100644
index b79cddb..0000000
--- a/testapps/libsAndJarTest/lib2/res/layout/main.xml
+++ /dev/null
@@ -1,13 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:orientation="vertical"
-    android:layout_width="fill_parent"
-    android:layout_height="fill_parent"
-    >
-<TextView
-    android:layout_width="fill_parent"
-    android:layout_height="wrap_content"
-    android:text="Hello World, Main"
-    />
-</LinearLayout>
-
diff --git a/testapps/libsAndJarTest/lib2/res/values/strings.xml b/testapps/libsAndJarTest/lib2/res/values/strings.xml
deleted file mode 100644
index e1e7a9d..0000000
--- a/testapps/libsAndJarTest/lib2/res/values/strings.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<resources>
-
-    <string name="app_name">Main</string>
-    <string name="foo2">foo</string>
-
-</resources>
\ No newline at end of file
diff --git a/testapps/libsAndJarTest/lib2/src/com/android/tests/javaprojecttest/lib2/Lib2.java b/testapps/libsAndJarTest/lib2/src/com/android/tests/javaprojecttest/lib2/Lib2.java
deleted file mode 100644
index 5831cb2..0000000
--- a/testapps/libsAndJarTest/lib2/src/com/android/tests/javaprojecttest/lib2/Lib2.java
+++ /dev/null
@@ -1,33 +0,0 @@
-package com.android.tests.javaprojecttest.lib2;
-
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-
-public class Lib2 {
-
-    public static String getContent() {
-        InputStream input = Lib2.class.getResourceAsStream("Lib2.txt");
-        if (input == null) {
-            return "FAILED TO FIND Lib2.txt";
-        }
-
-        BufferedReader reader = null;
-        try {
-            reader = new BufferedReader(new InputStreamReader(input, "UTF-8"));
-
-            return reader.readLine();
-        } catch (IOException e) {
-        } finally {
-            if (reader != null) {
-                try {
-                    reader.close();
-                } catch (IOException e) {
-                }
-            }
-        }
-        
-        return "FAILED TO READ CONTENT";
-    }
-}
diff --git a/testapps/libsAndJarTest/lib2/src/com/android/tests/javaprojecttest/lib2/Lib2.txt b/testapps/libsAndJarTest/lib2/src/com/android/tests/javaprojecttest/lib2/Lib2.txt
deleted file mode 100644
index 3ba8e35..0000000
--- a/testapps/libsAndJarTest/lib2/src/com/android/tests/javaprojecttest/lib2/Lib2.txt
+++ /dev/null
@@ -1 +0,0 @@
-SUCCESS from Lib2
\ No newline at end of file
diff --git a/testapps/libsAndJarTest/lib2/src/com/android/tests/javaprojecttest/lib2/Main.java b/testapps/libsAndJarTest/lib2/src/com/android/tests/javaprojecttest/lib2/Main.java
deleted file mode 100644
index 1459896..0000000
--- a/testapps/libsAndJarTest/lib2/src/com/android/tests/javaprojecttest/lib2/Main.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package com.android.tests.javaprojecttest.lib2;
-
-import android.app.Activity;
-import android.os.Bundle;
-
-public class Main extends Activity
-{
-    /** Called when the activity is first created. */
-    @Override
-    public void onCreate(Bundle savedInstanceState)
-    {
-        super.onCreate(savedInstanceState);
-        setContentView(R.layout.main);
-    }
-}
diff --git a/testapps/libsTest/COMPILE_AND_RUN b/testapps/libsTest/COMPILE_AND_RUN
deleted file mode 100644
index e69de29..0000000
--- a/testapps/libsTest/COMPILE_AND_RUN
+++ /dev/null
diff --git a/testapps/libsTest/SUCCESS b/testapps/libsTest/SUCCESS
deleted file mode 100644
index e69de29..0000000
--- a/testapps/libsTest/SUCCESS
+++ /dev/null
diff --git a/testapps/libsTest/app/.classpath b/testapps/libsTest/app/.classpath
deleted file mode 100644
index a4763d1..0000000
--- a/testapps/libsTest/app/.classpath
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="src" path="gen"/>
-	<classpathentry kind="con" path="com.android.ide.eclipse.adt.ANDROID_FRAMEWORK"/>
-	<classpathentry kind="con" path="com.android.ide.eclipse.adt.LIBRARIES"/>
-	<classpathentry kind="output" path="bin/classes"/>
-</classpath>
diff --git a/testapps/libsTest/app/.project b/testapps/libsTest/app/.project
deleted file mode 100644
index 4edc688..0000000
--- a/testapps/libsTest/app/.project
+++ /dev/null
@@ -1,33 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>libsTest-app</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>com.android.ide.eclipse.adt.ResourceManagerBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>com.android.ide.eclipse.adt.PreCompilerBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>com.android.ide.eclipse.adt.ApkBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>com.android.ide.eclipse.adt.AndroidNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/testapps/libsTest/app/AndroidManifest.xml b/testapps/libsTest/app/AndroidManifest.xml
deleted file mode 100644
index 74f0ff2..0000000
--- a/testapps/libsTest/app/AndroidManifest.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
-    package="com.android.tests.libstest.app"
-    android:versionCode="1"
-    android:versionName="1.0" xmlns:tools="http://schemas.android.com/tools">
-
-    <uses-sdk
-        android:minSdkVersion="15"
-        tools:ignore="UsesMinSdkAttributes" />
-
-    <application
-        android:icon="@drawable/icon"
-        android:label="@string/app_name" >
-        <activity
-            android:name="com.android.tests.libstest.app.MainActivity"
-            android:label="@string/app_name" >
-            <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/testapps/libsTest/app/build.xml b/testapps/libsTest/app/build.xml
deleted file mode 100644
index c084512..0000000
--- a/testapps/libsTest/app/build.xml
+++ /dev/null
@@ -1,90 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project name="libsAndJarTest-app" default="help">
-
-    <!-- The local.properties file is created and updated by the 'android' tool.
-         It contains the path to the SDK. It should *NOT* be checked into
-         Version Control Systems. -->
-    <property file="local.properties" />
-
-    <!-- The ant.properties file can be created by you. It is only edited by the
-         'android' tool to add properties to it.
-         This is the place to change some Ant specific build properties.
-         Here are some properties you may want to change/update:
-
-         source.dir
-             The name of the source directory. Default is 'src'.
-         out.dir
-             The name of the output directory. Default is 'bin'.
-
-         For other overridable properties, look at the beginning of the rules
-         files in the SDK, at tools/ant/build.xml
-
-         Properties related to the SDK location or the project target should
-         be updated using the 'android' tool with the 'update' action.
-
-         This file is an integral part of the build system for your
-         application and should be checked into Version Control Systems.
-
-         -->
-    <property file="ant.properties" />
-
-    <!-- if sdk.dir was not set from one of the property file, then
-         get it from the ANDROID_HOME env var. -->
-    <property environment="env" />
-    <condition property="sdk.dir" value="${env.ANDROID_HOME}">
-        <isset property="env.ANDROID_HOME" />
-    </condition>
-
-    <!-- The project.properties file is created and updated by the 'android'
-         tool, as well as ADT.
-
-         This contains project specific properties such as project target, and library
-         dependencies. Lower level build properties are stored in ant.properties
-         (or in .classpath for Eclipse projects).
-
-         This file is an integral part of the build system for your
-         application and should be checked into Version Control Systems. -->
-    <loadproperties srcFile="project.properties" />
-
-    <!-- quick check on sdk.dir -->
-    <fail
-            message="sdk.dir is missing. Make sure to generate local.properties using 'android update project' or to inject it through the ANDROID_HOME environment variable."
-            unless="sdk.dir"
-    />
-
-    <!--
-        Import per project custom build rules if present at the root of the project.
-        This is the place to put custom intermediary targets such as:
-            -pre-build
-            -pre-compile
-            -post-compile (This is typically used for code obfuscation.
-                           Compiled code location: ${out.classes.absolute.dir}
-                           If this is not done in place, override ${out.dex.input.absolute.dir})
-            -post-package
-            -post-build
-            -pre-clean
-    -->
-    <import file="custom_rules.xml" optional="true" />
-
-    <!-- Import the actual build file.
-
-         To customize existing targets, there are two options:
-         - Customize only one target:
-             - copy/paste the target into this file, *before* the
-               <import> task.
-             - customize it to your needs.
-         - Customize the whole content of build.xml
-             - copy/paste the content of the rules files (minus the top node)
-               into this file, replacing the <import> task.
-             - customize to your needs.
-
-         ***********************
-         ****** IMPORTANT ******
-         ***********************
-         In all cases you must update the value of version-tag below to read 'custom' instead of an integer,
-         in order to avoid having your file be overridden by tools such as "android update project"
-    -->
-    <!-- version-tag: 1 -->
-    <import file="${sdk.dir}/tools/ant/build.xml" />
-
-</project>
diff --git a/testapps/libsTest/app/proguard-project.txt b/testapps/libsTest/app/proguard-project.txt
deleted file mode 100644
index 349f80f..0000000
--- a/testapps/libsTest/app/proguard-project.txt
+++ /dev/null
@@ -1,22 +0,0 @@
-# To enable ProGuard in your project, edit project.properties
-# to define the proguard.config property as described in that file.
-#
-# Add project specific ProGuard rules here.
-# By default, the flags in this file are appended to flags specified
-# in ${sdk.dir}/tools/proguard/proguard-android.txt
-# You can edit the include path and order by changing the ProGuard
-# include property in project.properties.
-#
-# For more details, see
-#   http://developer.android.com/guide/developing/tools/proguard.html
-
-# Add any project specific keep options here:
-
-# If your project uses WebView with JS, uncomment the following
-# and specify the fully qualified class name to the JavaScript interface
-# class:
-#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
-#   public *;
-#}
-
--adaptclassstrings
\ No newline at end of file
diff --git a/testapps/libsTest/app/project.properties b/testapps/libsTest/app/project.properties
deleted file mode 100644
index 9df4221..0000000
--- a/testapps/libsTest/app/project.properties
+++ /dev/null
@@ -1,15 +0,0 @@
-# This file is automatically generated by Android Tools.
-# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
-#
-# This file must be checked in Version Control Systems.
-#
-# To customize properties used by the Ant build system edit
-# "ant.properties", and override values to adapt the script to your
-# project structure.
-#
-# Project target.
-target=android-15
-android.library.reference.1=../lib1
-
-# To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home):
-proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt
diff --git a/testapps/libsTest/app/res/drawable-hdpi/icon.png b/testapps/libsTest/app/res/drawable-hdpi/icon.png
deleted file mode 100644
index 8074c4c..0000000
--- a/testapps/libsTest/app/res/drawable-hdpi/icon.png
+++ /dev/null
Binary files differ
diff --git a/testapps/libsTest/app/res/drawable-ldpi/icon.png b/testapps/libsTest/app/res/drawable-ldpi/icon.png
deleted file mode 100644
index 1095584..0000000
--- a/testapps/libsTest/app/res/drawable-ldpi/icon.png
+++ /dev/null
Binary files differ
diff --git a/testapps/libsTest/app/res/drawable-mdpi/icon.png b/testapps/libsTest/app/res/drawable-mdpi/icon.png
deleted file mode 100644
index a07c69f..0000000
--- a/testapps/libsTest/app/res/drawable-mdpi/icon.png
+++ /dev/null
Binary files differ
diff --git a/testapps/libsTest/app/res/layout/main.xml b/testapps/libsTest/app/res/layout/main.xml
deleted file mode 100644
index f735960..0000000
--- a/testapps/libsTest/app/res/layout/main.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:tools="http://schemas.android.com/tools"
-    android:layout_width="fill_parent"
-    android:layout_height="fill_parent"
-    android:orientation="vertical" >
-
-    <TextView
-        android:id="@+id/app_text1"
-        android:layout_width="fill_parent"
-        android:layout_height="wrap_content"
-        android:text="@string/app_string" />
-
-    <TextView
-        android:id="@+id/app_text2"
-        android:layout_width="fill_parent"
-        android:layout_height="wrap_content" />
-
-    <include layout="@layout/lib1_main" />
-
-</LinearLayout>
\ No newline at end of file
diff --git a/testapps/libsTest/app/res/values/strings.xml b/testapps/libsTest/app/res/values/strings.xml
deleted file mode 100644
index 2a2e006..0000000
--- a/testapps/libsTest/app/res/values/strings.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<resources>
-
-    <string name="app_name">libsTest-app</string>
-    <string name="app_string">SUCCESS-APP</string>
-
-</resources>
\ No newline at end of file
diff --git a/testapps/libsTest/app/src/com/android/tests/libstest/app/App.java b/testapps/libsTest/app/src/com/android/tests/libstest/app/App.java
deleted file mode 100644
index 54e2a09..0000000
--- a/testapps/libsTest/app/src/com/android/tests/libstest/app/App.java
+++ /dev/null
@@ -1,43 +0,0 @@
-package com.android.tests.libstest.app;
-
-import android.app.Activity;
-import android.widget.TextView;
-
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-
-public class App {
-
-    public static void handleTextView(Activity a) {
-        TextView tv = (TextView) a.findViewById(R.id.app_text2);
-        if (tv != null) {
-            tv.setText(getContent());
-        }
-    }
-    
-    private static String getContent() {
-        InputStream input = App.class.getResourceAsStream("App.txt");
-        if (input == null) {
-            return "FAILED TO FIND App.txt";
-        }
-
-        BufferedReader reader = null;
-        try {
-            reader = new BufferedReader(new InputStreamReader(input, "UTF-8"));
-
-            return reader.readLine();
-        } catch (IOException e) {
-        } finally {
-            if (reader != null) {
-                try {
-                    reader.close();
-                } catch (IOException e) {
-                }
-            }
-        }
-        
-        return "FAILED TO READ CONTENT";
-    }
-}
diff --git a/testapps/libsTest/app/src/com/android/tests/libstest/app/App.txt b/testapps/libsTest/app/src/com/android/tests/libstest/app/App.txt
deleted file mode 100644
index 084e7d0..0000000
--- a/testapps/libsTest/app/src/com/android/tests/libstest/app/App.txt
+++ /dev/null
@@ -1 +0,0 @@
-SUCCESS-APP
\ No newline at end of file
diff --git a/testapps/libsTest/app/src/com/android/tests/libstest/app/MainActivity.java b/testapps/libsTest/app/src/com/android/tests/libstest/app/MainActivity.java
deleted file mode 100644
index 8992066..0000000
--- a/testapps/libsTest/app/src/com/android/tests/libstest/app/MainActivity.java
+++ /dev/null
@@ -1,20 +0,0 @@
-package com.android.tests.libstest.app;
-
-import android.app.Activity;
-import android.os.Bundle;
-
-import com.android.tests.libstest.lib1.Lib1;
-import com.android.tests.libstest.lib2.Lib2;
-
-public class MainActivity extends Activity {
-    /** Called when the activity is first created. */
-    @Override
-    public void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-        setContentView(R.layout.main);
-        
-        App.handleTextView(this);
-        Lib1.handleTextView(this);
-        Lib2.handleTextView(this);
-    }
-}
\ No newline at end of file
diff --git a/testapps/libsTest/appTest/.classpath b/testapps/libsTest/appTest/.classpath
deleted file mode 100644
index ad42d94..0000000
--- a/testapps/libsTest/appTest/.classpath
+++ /dev/null
@@ -1,9 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="src" path="gen"/>
-	<classpathentry kind="con" path="com.android.ide.eclipse.adt.ANDROID_FRAMEWORK"/>
-	<classpathentry kind="con" path="com.android.ide.eclipse.adt.LIBRARIES"/>
-	<classpathentry combineaccessrules="false" kind="src" path="/libsTest-app"/>
-	<classpathentry kind="output" path="bin/classes"/>
-</classpath>
diff --git a/testapps/libsTest/appTest/.project b/testapps/libsTest/appTest/.project
deleted file mode 100644
index 5fa994d..0000000
--- a/testapps/libsTest/appTest/.project
+++ /dev/null
@@ -1,34 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>libsTest-appTest</name>
-	<comment></comment>
-	<projects>
-		<project>testProjectTest-app</project>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>com.android.ide.eclipse.adt.ResourceManagerBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>com.android.ide.eclipse.adt.PreCompilerBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>com.android.ide.eclipse.adt.ApkBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>com.android.ide.eclipse.adt.AndroidNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/testapps/libsTest/appTest/AndroidManifest.xml b/testapps/libsTest/appTest/AndroidManifest.xml
deleted file mode 100644
index 5c3bbbd..0000000
--- a/testapps/libsTest/appTest/AndroidManifest.xml
+++ /dev/null
@@ -1,29 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
-    package="com.android.tests.libstest.app.test"
-    android:versionCode="1"
-    android:versionName="1.0" xmlns:tools="http://schemas.android.com/tools">
-
-    <uses-sdk
-        android:minSdkVersion="15"
-        tools:ignore="UsesMinSdkAttributes" />
-
-    <!--
-         We add an application tag here just so that we can indicate that
-         this package needs to link against the android.test library,
-         which is needed when building test cases.
-    -->
-    <application android:label="libsTest-appTest" >
-        <uses-library android:name="android.test.runner" />
-    </application>
-
-    <!--
-    This declares that this app uses the instrumentation test runner targeting
-    the package of com.android.tests.testprojecttest.app.  To run the tests use the command:
-    "adb shell am instrument -w com.android.tests.testprojecttest.test/android.test.InstrumentationTestRunner"
-    -->
-    <instrumentation
-        android:name="android.test.InstrumentationTestRunner"
-        android:targetPackage="com.android.tests.libstest.app" />
-
-</manifest>
\ No newline at end of file
diff --git a/testapps/libsTest/appTest/build.xml b/testapps/libsTest/appTest/build.xml
deleted file mode 100644
index 4f12210..0000000
--- a/testapps/libsTest/appTest/build.xml
+++ /dev/null
@@ -1,92 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project name="testProjectTest-testapp" default="help">
-
-    <!-- The local.properties file is created and updated by the 'android' tool.
-         It contains the path to the SDK. It should *NOT* be checked into
-         Version Control Systems. -->
-    <property file="local.properties" />
-
-    <!-- The ant.properties file can be created by you. It is only edited by the
-         'android' tool to add properties to it.
-         This is the place to change some Ant specific build properties.
-         Here are some properties you may want to change/update:
-
-         source.dir
-             The name of the source directory. Default is 'src'.
-         out.dir
-             The name of the output directory. Default is 'bin'.
-
-         For other overridable properties, look at the beginning of the rules
-         files in the SDK, at tools/ant/build.xml
-
-         Properties related to the SDK location or the project target should
-         be updated using the 'android' tool with the 'update' action.
-
-         This file is an integral part of the build system for your
-         application and should be checked into Version Control Systems.
-
-         -->
-    <property file="ant.properties" />
-
-    <!-- if sdk.dir was not set from one of the property file, then
-         get it from the ANDROID_HOME env var.
-         This must be done before we load project.properties since
-         the proguard config can use sdk.dir -->
-    <property environment="env" />
-    <condition property="sdk.dir" value="${env.ANDROID_HOME}">
-        <isset property="env.ANDROID_HOME" />
-    </condition>
-
-    <!-- The project.properties file is created and updated by the 'android'
-         tool, as well as ADT.
-
-         This contains project specific properties such as project target, and library
-         dependencies. Lower level build properties are stored in ant.properties
-         (or in .classpath for Eclipse projects).
-
-         This file is an integral part of the build system for your
-         application and should be checked into Version Control Systems. -->
-    <loadproperties srcFile="project.properties" />
-
-    <!-- quick check on sdk.dir -->
-    <fail
-            message="sdk.dir is missing. Make sure to generate local.properties using 'android update project' or to inject it through the ANDROID_HOME environment variable."
-            unless="sdk.dir"
-    />
-
-    <!--
-        Import per project custom build rules if present at the root of the project.
-        This is the place to put custom intermediary targets such as:
-            -pre-build
-            -pre-compile
-            -post-compile (This is typically used for code obfuscation.
-                           Compiled code location: ${out.classes.absolute.dir}
-                           If this is not done in place, override ${out.dex.input.absolute.dir})
-            -post-package
-            -post-build
-            -pre-clean
-    -->
-    <import file="custom_rules.xml" optional="true" />
-
-    <!-- Import the actual build file.
-
-         To customize existing targets, there are two options:
-         - Customize only one target:
-             - copy/paste the target into this file, *before* the
-               <import> task.
-             - customize it to your needs.
-         - Customize the whole content of build.xml
-             - copy/paste the content of the rules files (minus the top node)
-               into this file, replacing the <import> task.
-             - customize to your needs.
-
-         ***********************
-         ****** IMPORTANT ******
-         ***********************
-         In all cases you must update the value of version-tag below to read 'custom' instead of an integer,
-         in order to avoid having your file be overridden by tools such as "android update project"
-    -->
-    <!-- version-tag: 1 -->
-    <import file="${sdk.dir}/tools/ant/build.xml" />
-
-</project>
diff --git a/testapps/libsTest/appTest/proguard-project.txt b/testapps/libsTest/appTest/proguard-project.txt
deleted file mode 100644
index f2fe155..0000000
--- a/testapps/libsTest/appTest/proguard-project.txt
+++ /dev/null
@@ -1,20 +0,0 @@
-# To enable ProGuard in your project, edit project.properties
-# to define the proguard.config property as described in that file.
-#
-# Add project specific ProGuard rules here.
-# By default, the flags in this file are appended to flags specified
-# in ${sdk.dir}/tools/proguard/proguard-android.txt
-# You can edit the include path and order by changing the ProGuard
-# include property in project.properties.
-#
-# For more details, see
-#   http://developer.android.com/guide/developing/tools/proguard.html
-
-# Add any project specific keep options here:
-
-# If your project uses WebView with JS, uncomment the following
-# and specify the fully qualified class name to the JavaScript interface
-# class:
-#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
-#   public *;
-#}
diff --git a/testapps/libsTest/appTest/project.properties b/testapps/libsTest/appTest/project.properties
deleted file mode 100644
index 4c13b85..0000000
--- a/testapps/libsTest/appTest/project.properties
+++ /dev/null
@@ -1,15 +0,0 @@
-# This file is automatically generated by Android Tools.
-# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
-#
-# This file must be checked in Version Control Systems.
-#
-# To customize properties used by the Ant build system edit
-# "ant.properties", and override values to adapt the script to your
-# project structure.
-#
-# To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home):
-#proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt
-
-# Project target.
-target=android-15
-tested.project.dir=../app
diff --git a/testapps/libsTest/appTest/src/com/android/tests/libstest/app/MainActivityTest.java b/testapps/libsTest/appTest/src/com/android/tests/libstest/app/MainActivityTest.java
deleted file mode 100644
index 65e081b..0000000
--- a/testapps/libsTest/appTest/src/com/android/tests/libstest/app/MainActivityTest.java
+++ /dev/null
@@ -1,100 +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.tests.libstest.app;
-
-import android.test.ActivityInstrumentationTestCase2;
-import android.test.suitebuilder.annotation.MediumTest;
-import android.widget.TextView;
-
-/**
- * An example of an {@link ActivityInstrumentationTestCase2} of a specific activity {@link Focus2}.
- * By virtue of extending {@link ActivityInstrumentationTestCase2}, the target activity is automatically
- * launched and finished before and after each test.  This also extends
- * {@link android.test.InstrumentationTestCase}, which provides
- * access to methods for sending events to the target activity, such as key and
- * touch events.  See {@link #sendKeys}.
- *
- * In general, {@link android.test.InstrumentationTestCase}s and {@link ActivityInstrumentationTestCase2}s
- * are heavier weight functional tests available for end to end testing of your
- * user interface.  When run via a {@link android.test.InstrumentationTestRunner},
- * the necessary {@link android.app.Instrumentation} will be injected for you to
- * user via {@link #getInstrumentation} in your tests.
- *
- * See {@link com.example.android.apis.AllTests} for documentation on running
- * all tests and individual tests in this application.
- */
-public class MainActivityTest extends ActivityInstrumentationTestCase2<MainActivity> {
-
-    private TextView mAppTextView1;
-    private TextView mAppTextView2;
-    private TextView mLib1TextView1;
-    private TextView mLib1TextView2;
-    private TextView mLib2TextView1;
-    private TextView mLib2TextView2;
-
-    /**
-     * Creates an {@link ActivityInstrumentationTestCase2} that tests the {@link Focus2} activity.
-     */
-    public MainActivityTest() {
-        super(MainActivity.class);
-    }
-
-    @Override
-    protected void setUp() throws Exception {
-        super.setUp();
-        final MainActivity a = getActivity();
-        // ensure a valid handle to the activity has been returned
-        assertNotNull(a);
-        
-        mAppTextView1 = (TextView) a.findViewById(R.id.app_text1);
-        mAppTextView2 = (TextView) a.findViewById(R.id.app_text1);
-        mLib1TextView1 = (TextView) a.findViewById(R.id.lib1_text1);
-        mLib1TextView2 = (TextView) a.findViewById(R.id.lib1_text2);
-        mLib2TextView1 = (TextView) a.findViewById(R.id.lib2_text1);
-        mLib2TextView2 = (TextView) a.findViewById(R.id.lib2_text2);
-    }
-
-    /**
-     * The name 'test preconditions' is a convention to signal that if this
-     * test doesn't pass, the test case was not set up properly and it might
-     * explain any and all failures in other tests.  This is not guaranteed
-     * to run before other tests, as junit uses reflection to find the tests.
-     */
-    @MediumTest
-    public void testPreconditions() {
-        assertNotNull(mAppTextView1);
-        assertNotNull(mAppTextView2);
-        assertNotNull(mLib1TextView1);
-        assertNotNull(mLib1TextView2);
-        assertNotNull(mLib2TextView1);
-        assertNotNull(mLib2TextView2);
-    }
-
-    @MediumTest
-    public void testAndroidStrings() {
-        assertEquals("SUCCESS-APP", mAppTextView1.getText());
-        assertEquals("SUCCESS-LIB1", mLib1TextView1.getText());
-        assertEquals("SUCCESS-LIB2", mLib2TextView1.getText());
-    }
-
-    @MediumTest
-    public void testJavaStrings() {
-        assertEquals("SUCCESS-APP", mAppTextView2.getText());
-        assertEquals("SUCCESS-LIB1", mLib1TextView2.getText());
-        assertEquals("SUCCESS-LIB2", mLib2TextView2.getText());
-    }
-}
diff --git a/testapps/libsTest/lib1/.classpath b/testapps/libsTest/lib1/.classpath
deleted file mode 100644
index a4763d1..0000000
--- a/testapps/libsTest/lib1/.classpath
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="src" path="gen"/>
-	<classpathentry kind="con" path="com.android.ide.eclipse.adt.ANDROID_FRAMEWORK"/>
-	<classpathentry kind="con" path="com.android.ide.eclipse.adt.LIBRARIES"/>
-	<classpathentry kind="output" path="bin/classes"/>
-</classpath>
diff --git a/testapps/libsTest/lib1/.project b/testapps/libsTest/lib1/.project
deleted file mode 100644
index 6271335..0000000
--- a/testapps/libsTest/lib1/.project
+++ /dev/null
@@ -1,33 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>libsTest-Lib1</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>com.android.ide.eclipse.adt.ResourceManagerBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>com.android.ide.eclipse.adt.PreCompilerBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>com.android.ide.eclipse.adt.ApkBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>com.android.ide.eclipse.adt.AndroidNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/testapps/libsTest/lib1/AndroidManifest.xml b/testapps/libsTest/lib1/AndroidManifest.xml
deleted file mode 100644
index 194faea..0000000
--- a/testapps/libsTest/lib1/AndroidManifest.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
-    package="com.android.tests.libstest.lib1"
-    android:versionCode="1"
-    android:versionName="1.0" >
-
-    <application
-        android:icon="@drawable/ic_launcher"
-        android:label="@string/lib1_name" >
-        <activity
-            android:name="com.android.tests.libstest.lib1.MainActivity"
-            android:label="@string/lib1_name" >
-            <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/testapps/libsTest/lib1/build.xml b/testapps/libsTest/lib1/build.xml
deleted file mode 100644
index ed25521..0000000
--- a/testapps/libsTest/lib1/build.xml
+++ /dev/null
@@ -1,90 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project name="libsAndJarTest-lib1" default="help">
-
-    <!-- The local.properties file is created and updated by the 'android' tool.
-         It contains the path to the SDK. It should *NOT* be checked into
-         Version Control Systems. -->
-    <property file="local.properties" />
-
-    <!-- The ant.properties file can be created by you. It is only edited by the
-         'android' tool to add properties to it.
-         This is the place to change some Ant specific build properties.
-         Here are some properties you may want to change/update:
-
-         source.dir
-             The name of the source directory. Default is 'src'.
-         out.dir
-             The name of the output directory. Default is 'bin'.
-
-         For other overridable properties, look at the beginning of the rules
-         files in the SDK, at tools/ant/build.xml
-
-         Properties related to the SDK location or the project target should
-         be updated using the 'android' tool with the 'update' action.
-
-         This file is an integral part of the build system for your
-         application and should be checked into Version Control Systems.
-
-         -->
-    <property file="ant.properties" />
-
-    <!-- The project.properties file is created and updated by the 'android'
-         tool, as well as ADT.
-
-         This contains project specific properties such as project target, and library
-         dependencies. Lower level build properties are stored in ant.properties
-         (or in .classpath for Eclipse projects).
-
-         This file is an integral part of the build system for your
-         application and should be checked into Version Control Systems. -->
-    <loadproperties srcFile="project.properties" />
-
-    <!-- if sdk.dir was not set from one of the property file, then
-         get it from the ANDROID_HOME env var. -->
-    <property environment="env" />
-    <condition property="sdk.dir" value="${env.ANDROID_HOME}">
-        <isset property="env.ANDROID_HOME" />
-    </condition>
-
-    <!-- quick check on sdk.dir -->
-    <fail
-            message="sdk.dir is missing. Make sure to generate local.properties using 'android update project' or to inject it through the ANDROID_HOME environment variable."
-            unless="sdk.dir"
-    />
-
-    <!--
-        Import per project custom build rules if present at the root of the project.
-        This is the place to put custom intermediary targets such as:
-            -pre-build
-            -pre-compile
-            -post-compile (This is typically used for code obfuscation.
-                           Compiled code location: ${out.classes.absolute.dir}
-                           If this is not done in place, override ${out.dex.input.absolute.dir})
-            -post-package
-            -post-build
-            -pre-clean
-    -->
-    <import file="custom_rules.xml" optional="true" />
-
-    <!-- Import the actual build file.
-
-         To customize existing targets, there are two options:
-         - Customize only one target:
-             - copy/paste the target into this file, *before* the
-               <import> task.
-             - customize it to your needs.
-         - Customize the whole content of build.xml
-             - copy/paste the content of the rules files (minus the top node)
-               into this file, replacing the <import> task.
-             - customize to your needs.
-
-         ***********************
-         ****** IMPORTANT ******
-         ***********************
-         In all cases you must update the value of version-tag below to read 'custom' instead of an integer,
-         in order to avoid having your file be overridden by tools such as "android update project"
-    -->
-    <!-- version-tag: 1 -->
-    <import file="${sdk.dir}/tools/ant/build.xml" />
-
-</project>
diff --git a/testapps/libsTest/lib1/proguard-project.txt b/testapps/libsTest/lib1/proguard-project.txt
deleted file mode 100644
index f2fe155..0000000
--- a/testapps/libsTest/lib1/proguard-project.txt
+++ /dev/null
@@ -1,20 +0,0 @@
-# To enable ProGuard in your project, edit project.properties
-# to define the proguard.config property as described in that file.
-#
-# Add project specific ProGuard rules here.
-# By default, the flags in this file are appended to flags specified
-# in ${sdk.dir}/tools/proguard/proguard-android.txt
-# You can edit the include path and order by changing the ProGuard
-# include property in project.properties.
-#
-# For more details, see
-#   http://developer.android.com/guide/developing/tools/proguard.html
-
-# Add any project specific keep options here:
-
-# If your project uses WebView with JS, uncomment the following
-# and specify the fully qualified class name to the JavaScript interface
-# class:
-#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
-#   public *;
-#}
diff --git a/testapps/libsTest/lib1/project.properties b/testapps/libsTest/lib1/project.properties
deleted file mode 100644
index 480c5b6..0000000
--- a/testapps/libsTest/lib1/project.properties
+++ /dev/null
@@ -1,16 +0,0 @@
-# This file is automatically generated by Android Tools.
-# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
-#
-# This file must be checked in Version Control Systems.
-#
-# To customize properties used by the Ant build system edit
-# "ant.properties", and override values to adapt the script to your
-# project structure.
-#
-# To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home):
-#proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt
-
-# Project target.
-target=android-15
-android.library=true
-android.library.reference.1=../lib2
diff --git a/testapps/libsTest/lib1/res/drawable-hdpi/ic_launcher.png b/testapps/libsTest/lib1/res/drawable-hdpi/ic_launcher.png
deleted file mode 100644
index 8074c4c..0000000
--- a/testapps/libsTest/lib1/res/drawable-hdpi/ic_launcher.png
+++ /dev/null
Binary files differ
diff --git a/testapps/libsTest/lib1/res/drawable-ldpi/ic_launcher.png b/testapps/libsTest/lib1/res/drawable-ldpi/ic_launcher.png
deleted file mode 100644
index 1095584..0000000
--- a/testapps/libsTest/lib1/res/drawable-ldpi/ic_launcher.png
+++ /dev/null
Binary files differ
diff --git a/testapps/libsTest/lib1/res/drawable-mdpi/ic_launcher.png b/testapps/libsTest/lib1/res/drawable-mdpi/ic_launcher.png
deleted file mode 100644
index a07c69f..0000000
--- a/testapps/libsTest/lib1/res/drawable-mdpi/ic_launcher.png
+++ /dev/null
Binary files differ
diff --git a/testapps/libsTest/lib1/res/layout/lib1_main.xml b/testapps/libsTest/lib1/res/layout/lib1_main.xml
deleted file mode 100644
index 3666d12..0000000
--- a/testapps/libsTest/lib1/res/layout/lib1_main.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="fill_parent"
-    android:layout_height="fill_parent"
-    android:orientation="vertical" >
-
-    <TextView
-        android:id="@+id/lib1_text1"
-        android:layout_width="fill_parent"
-        android:layout_height="wrap_content"
-        android:text="@string/lib1_string" />
-
-    <TextView
-        android:id="@+id/lib1_text2"
-        android:layout_width="fill_parent"
-        android:layout_height="wrap_content" />
-
-    <include layout="@layout/lib2_main" />
-
-</LinearLayout>
\ No newline at end of file
diff --git a/testapps/libsTest/lib1/res/values/strings.xml b/testapps/libsTest/lib1/res/values/strings.xml
deleted file mode 100644
index 8d20610..0000000
--- a/testapps/libsTest/lib1/res/values/strings.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<resources>
-
-    <string name="lib1_name">LibsTest-lib1</string>
-    <string name="lib1_string">SUCCESS-LIB1</string>
-
-</resources>
\ No newline at end of file
diff --git a/testapps/libsTest/lib1/src/com/android/tests/libstest/lib1/Lib1.java b/testapps/libsTest/lib1/src/com/android/tests/libstest/lib1/Lib1.java
deleted file mode 100644
index c62bec2..0000000
--- a/testapps/libsTest/lib1/src/com/android/tests/libstest/lib1/Lib1.java
+++ /dev/null
@@ -1,43 +0,0 @@
-package com.android.tests.libstest.lib1;
-
-import android.app.Activity;
-import android.widget.TextView;
-
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-
-public class Lib1 {
-    
-    public static void handleTextView(Activity a) {
-        TextView tv = (TextView) a.findViewById(R.id.lib1_text2);
-        if (tv != null) {
-            tv.setText(Lib1.getContent());
-        }
-    }
-
-    public static String getContent() {
-        InputStream input = Lib1.class.getResourceAsStream("Lib1.txt");
-        if (input == null) {
-            return "FAILED TO FIND Lib1.txt";
-        }
-
-        BufferedReader reader = null;
-        try {
-            reader = new BufferedReader(new InputStreamReader(input, "UTF-8"));
-
-            return reader.readLine();
-        } catch (IOException e) {
-        } finally {
-            if (reader != null) {
-                try {
-                    reader.close();
-                } catch (IOException e) {
-                }
-            }
-        }
-        
-        return "FAILED TO READ CONTENT";
-    }
-}
diff --git a/testapps/libsTest/lib1/src/com/android/tests/libstest/lib1/Lib1.txt b/testapps/libsTest/lib1/src/com/android/tests/libstest/lib1/Lib1.txt
deleted file mode 100644
index 452e397..0000000
--- a/testapps/libsTest/lib1/src/com/android/tests/libstest/lib1/Lib1.txt
+++ /dev/null
@@ -1 +0,0 @@
-SUCCESS-LIB1
\ No newline at end of file
diff --git a/testapps/libsTest/lib1/src/com/android/tests/libstest/lib1/MainActivity.java b/testapps/libsTest/lib1/src/com/android/tests/libstest/lib1/MainActivity.java
deleted file mode 100644
index 078bf64..0000000
--- a/testapps/libsTest/lib1/src/com/android/tests/libstest/lib1/MainActivity.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package com.android.tests.libstest.lib1;
-
-import android.app.Activity;
-import android.os.Bundle;
-
-import com.android.tests.libstest.lib2.Lib2;
-
-public class MainActivity extends Activity {
-    /** Called when the activity is first created. */
-    @Override
-    public void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-        setContentView(R.layout.lib1_main);
-        
-        Lib1.handleTextView(this);
-        Lib2.handleTextView(this);
-    }
-}
diff --git a/testapps/libsTest/lib1Test/.classpath b/testapps/libsTest/lib1Test/.classpath
deleted file mode 100644
index a4763d1..0000000
--- a/testapps/libsTest/lib1Test/.classpath
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="src" path="gen"/>
-	<classpathentry kind="con" path="com.android.ide.eclipse.adt.ANDROID_FRAMEWORK"/>
-	<classpathentry kind="con" path="com.android.ide.eclipse.adt.LIBRARIES"/>
-	<classpathentry kind="output" path="bin/classes"/>
-</classpath>
diff --git a/testapps/libsTest/lib1Test/.project b/testapps/libsTest/lib1Test/.project
deleted file mode 100644
index 10f729c..0000000
--- a/testapps/libsTest/lib1Test/.project
+++ /dev/null
@@ -1,34 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>libsTest-lib1Test</name>
-	<comment></comment>
-	<projects>
-		<project>testProjectTest-app</project>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>com.android.ide.eclipse.adt.ResourceManagerBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>com.android.ide.eclipse.adt.PreCompilerBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>com.android.ide.eclipse.adt.ApkBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>com.android.ide.eclipse.adt.AndroidNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/testapps/libsTest/lib1Test/AndroidManifest.xml b/testapps/libsTest/lib1Test/AndroidManifest.xml
deleted file mode 100644
index 851b295..0000000
--- a/testapps/libsTest/lib1Test/AndroidManifest.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:tools="http://schemas.android.com/tools"
-    package="com.android.tests.libstest.lib1.test"
-    android:versionCode="1"
-    android:versionName="1.0" >
-
-    <uses-sdk
-        android:minSdkVersion="15"
-        tools:ignore="UsesMinSdkAttributes" />
-
-    <!--
-         We add an application tag here just so that we can indicate that
-         this package needs to link against the android.test library,
-         which is needed when building test cases.
-    -->
-    <application
-        android:icon="@drawable/ic_launcher"
-        android:label="@string/lib1_name" >
-        <uses-library android:name="android.test.runner" />
-    </application>
-
-    <!--
-    This declares that this app uses the instrumentation test runner targeting
-    the package of com.android.tests.testprojecttest.testlib.  To run the tests use the command:
-    "adb shell am instrument -w com.android.tests.testprojecttest.testlib/android.test.InstrumentationTestRunner"
-    -->
-    <instrumentation
-        android:name="android.test.InstrumentationTestRunner"
-        android:targetPackage="com.android.tests.libstest.lib1.test" />
-
-</manifest>
\ No newline at end of file
diff --git a/testapps/libsTest/lib1Test/build.xml b/testapps/libsTest/lib1Test/build.xml
deleted file mode 100644
index b59cc65..0000000
--- a/testapps/libsTest/lib1Test/build.xml
+++ /dev/null
@@ -1,92 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project name="testProjectTest-testlib" default="help">
-
-    <!-- The local.properties file is created and updated by the 'android' tool.
-         It contains the path to the SDK. It should *NOT* be checked into
-         Version Control Systems. -->
-    <property file="local.properties" />
-
-    <!-- The ant.properties file can be created by you. It is only edited by the
-         'android' tool to add properties to it.
-         This is the place to change some Ant specific build properties.
-         Here are some properties you may want to change/update:
-
-         source.dir
-             The name of the source directory. Default is 'src'.
-         out.dir
-             The name of the output directory. Default is 'bin'.
-
-         For other overridable properties, look at the beginning of the rules
-         files in the SDK, at tools/ant/build.xml
-
-         Properties related to the SDK location or the project target should
-         be updated using the 'android' tool with the 'update' action.
-
-         This file is an integral part of the build system for your
-         application and should be checked into Version Control Systems.
-
-         -->
-    <property file="ant.properties" />
-
-    <!-- if sdk.dir was not set from one of the property file, then
-         get it from the ANDROID_HOME env var.
-         This must be done before we load project.properties since
-         the proguard config can use sdk.dir -->
-    <property environment="env" />
-    <condition property="sdk.dir" value="${env.ANDROID_HOME}">
-        <isset property="env.ANDROID_HOME" />
-    </condition>
-
-    <!-- The project.properties file is created and updated by the 'android'
-         tool, as well as ADT.
-
-         This contains project specific properties such as project target, and library
-         dependencies. Lower level build properties are stored in ant.properties
-         (or in .classpath for Eclipse projects).
-
-         This file is an integral part of the build system for your
-         application and should be checked into Version Control Systems. -->
-    <loadproperties srcFile="project.properties" />
-
-    <!-- quick check on sdk.dir -->
-    <fail
-            message="sdk.dir is missing. Make sure to generate local.properties using 'android update project' or to inject it through the ANDROID_HOME environment variable."
-            unless="sdk.dir"
-    />
-
-    <!--
-        Import per project custom build rules if present at the root of the project.
-        This is the place to put custom intermediary targets such as:
-            -pre-build
-            -pre-compile
-            -post-compile (This is typically used for code obfuscation.
-                           Compiled code location: ${out.classes.absolute.dir}
-                           If this is not done in place, override ${out.dex.input.absolute.dir})
-            -post-package
-            -post-build
-            -pre-clean
-    -->
-    <import file="custom_rules.xml" optional="true" />
-
-    <!-- Import the actual build file.
-
-         To customize existing targets, there are two options:
-         - Customize only one target:
-             - copy/paste the target into this file, *before* the
-               <import> task.
-             - customize it to your needs.
-         - Customize the whole content of build.xml
-             - copy/paste the content of the rules files (minus the top node)
-               into this file, replacing the <import> task.
-             - customize to your needs.
-
-         ***********************
-         ****** IMPORTANT ******
-         ***********************
-         In all cases you must update the value of version-tag below to read 'custom' instead of an integer,
-         in order to avoid having your file be overridden by tools such as "android update project"
-    -->
-    <!-- version-tag: 1 -->
-    <import file="${sdk.dir}/tools/ant/build.xml" />
-
-</project>
diff --git a/testapps/libsTest/lib1Test/proguard-project.txt b/testapps/libsTest/lib1Test/proguard-project.txt
deleted file mode 100644
index f2fe155..0000000
--- a/testapps/libsTest/lib1Test/proguard-project.txt
+++ /dev/null
@@ -1,20 +0,0 @@
-# To enable ProGuard in your project, edit project.properties
-# to define the proguard.config property as described in that file.
-#
-# Add project specific ProGuard rules here.
-# By default, the flags in this file are appended to flags specified
-# in ${sdk.dir}/tools/proguard/proguard-android.txt
-# You can edit the include path and order by changing the ProGuard
-# include property in project.properties.
-#
-# For more details, see
-#   http://developer.android.com/guide/developing/tools/proguard.html
-
-# Add any project specific keep options here:
-
-# If your project uses WebView with JS, uncomment the following
-# and specify the fully qualified class name to the JavaScript interface
-# class:
-#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
-#   public *;
-#}
diff --git a/testapps/libsTest/lib1Test/project.properties b/testapps/libsTest/lib1Test/project.properties
deleted file mode 100644
index 53eb848..0000000
--- a/testapps/libsTest/lib1Test/project.properties
+++ /dev/null
@@ -1,16 +0,0 @@
-# This file is automatically generated by Android Tools.
-# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
-#
-# This file must be checked in Version Control Systems.
-#
-# To customize properties used by the Ant build system edit
-# "ant.properties", and override values to adapt the script to your
-# project structure.
-#
-# To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home):
-#proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt
-
-# Project target.
-target=android-15
-android.library.reference.1=../lib1
-manifestmerger.enabled=true
diff --git a/testapps/libsTest/lib1Test/res/values/strings.xml b/testapps/libsTest/lib1Test/res/values/strings.xml
deleted file mode 100644
index ee6ef66..0000000
--- a/testapps/libsTest/lib1Test/res/values/strings.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<resources>
-
-    <string name="lib1_name">LibsTest-lib1Test</string>
-
-</resources>
\ No newline at end of file
diff --git a/testapps/libsTest/lib1Test/src/com/android/tests/libstest/lib1/MainActivityTest.java b/testapps/libsTest/lib1Test/src/com/android/tests/libstest/lib1/MainActivityTest.java
deleted file mode 100644
index 4ed7ae6..0000000
--- a/testapps/libsTest/lib1Test/src/com/android/tests/libstest/lib1/MainActivityTest.java
+++ /dev/null
@@ -1,92 +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.tests.libstest.lib1;
-
-import android.test.ActivityInstrumentationTestCase2;
-import android.test.suitebuilder.annotation.MediumTest;
-import android.widget.TextView;
-
-/**
- * An example of an {@link ActivityInstrumentationTestCase2} of a specific activity {@link Focus2}.
- * By virtue of extending {@link ActivityInstrumentationTestCase2}, the target activity is automatically
- * launched and finished before and after each test.  This also extends
- * {@link android.test.InstrumentationTestCase}, which provides
- * access to methods for sending events to the target activity, such as key and
- * touch events.  See {@link #sendKeys}.
- *
- * In general, {@link android.test.InstrumentationTestCase}s and {@link ActivityInstrumentationTestCase2}s
- * are heavier weight functional tests available for end to end testing of your
- * user interface.  When run via a {@link android.test.InstrumentationTestRunner},
- * the necessary {@link android.app.Instrumentation} will be injected for you to
- * user via {@link #getInstrumentation} in your tests.
- *
- * See {@link com.example.android.apis.AllTests} for documentation on running
- * all tests and individual tests in this application.
- */
-public class MainActivityTest extends ActivityInstrumentationTestCase2<MainActivity> {
-
-    private TextView mLib1TextView1;
-    private TextView mLib1TextView2;
-    private TextView mLib2TextView1;
-    private TextView mLib2TextView2;
-
-    /**
-     * Creates an {@link ActivityInstrumentationTestCase2} that tests the {@link Focus2} activity.
-     */
-    public MainActivityTest() {
-        super(MainActivity.class);
-    }
-
-    @Override
-    protected void setUp() throws Exception {
-        super.setUp();
-        final MainActivity a = getActivity();
-        // ensure a valid handle to the activity has been returned
-        assertNotNull(a);
-        
-        mLib1TextView1 = (TextView) a.findViewById(R.id.lib1_text1);
-        mLib1TextView2 = (TextView) a.findViewById(R.id.lib1_text2);
-        mLib2TextView1 = (TextView) a.findViewById(R.id.lib2_text1);
-        mLib2TextView2 = (TextView) a.findViewById(R.id.lib2_text2);
-    }
-
-    /**
-     * The name 'test preconditions' is a convention to signal that if this
-     * test doesn't pass, the test case was not set up properly and it might
-     * explain any and all failures in other tests.  This is not guaranteed
-     * to run before other tests, as junit uses reflection to find the tests.
-     */
-    @MediumTest
-    public void testPreconditions() {
-        assertNotNull(mLib1TextView1);
-        assertNotNull(mLib1TextView2);
-        assertNotNull(mLib2TextView1);
-        assertNotNull(mLib2TextView2);
-    }
-
-    @MediumTest
-    public void testAndroidStrings() {
-        assertEquals("SUCCESS-LIB1", mLib1TextView1.getText());
-        assertEquals("SUCCESS-LIB2", mLib2TextView1.getText());
-    }
-
-    @MediumTest
-    public void testJavaStrings() {
-        assertEquals("SUCCESS-LIB1", mLib1TextView2.getText());
-        assertEquals("SUCCESS-LIB2", mLib2TextView2.getText());
-    }
-}
diff --git a/testapps/libsTest/lib2/.classpath b/testapps/libsTest/lib2/.classpath
deleted file mode 100644
index a4763d1..0000000
--- a/testapps/libsTest/lib2/.classpath
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="src" path="gen"/>
-	<classpathentry kind="con" path="com.android.ide.eclipse.adt.ANDROID_FRAMEWORK"/>
-	<classpathentry kind="con" path="com.android.ide.eclipse.adt.LIBRARIES"/>
-	<classpathentry kind="output" path="bin/classes"/>
-</classpath>
diff --git a/testapps/libsTest/lib2/.project b/testapps/libsTest/lib2/.project
deleted file mode 100644
index 456bba8..0000000
--- a/testapps/libsTest/lib2/.project
+++ /dev/null
@@ -1,33 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>libsTest-Lib2</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>com.android.ide.eclipse.adt.ResourceManagerBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>com.android.ide.eclipse.adt.PreCompilerBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>com.android.ide.eclipse.adt.ApkBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>com.android.ide.eclipse.adt.AndroidNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/testapps/libsTest/lib2/AndroidManifest.xml b/testapps/libsTest/lib2/AndroidManifest.xml
deleted file mode 100644
index 0765eff..0000000
--- a/testapps/libsTest/lib2/AndroidManifest.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
-    package="com.android.tests.libstest.lib2"
-    android:versionCode="1"
-    android:versionName="1.0" >
-
-    <application
-        android:icon="@drawable/ic_launcher"
-        android:label="@string/lib2_name" >
-        <activity
-            android:name="com.android.tests.libstest.lib2.MainActivity"
-            android:label="@string/lib2_name" >
-            <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/testapps/libsTest/lib2/build.xml b/testapps/libsTest/lib2/build.xml
deleted file mode 100644
index 4f351c8..0000000
--- a/testapps/libsTest/lib2/build.xml
+++ /dev/null
@@ -1,90 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project name="libsAndJarTest-lib2" default="help">
-
-    <!-- The local.properties file is created and updated by the 'android' tool.
-         It contains the path to the SDK. It should *NOT* be checked into
-         Version Control Systems. -->
-    <property file="local.properties" />
-
-    <!-- The ant.properties file can be created by you. It is only edited by the
-         'android' tool to add properties to it.
-         This is the place to change some Ant specific build properties.
-         Here are some properties you may want to change/update:
-
-         source.dir
-             The name of the source directory. Default is 'src'.
-         out.dir
-             The name of the output directory. Default is 'bin'.
-
-         For other overridable properties, look at the beginning of the rules
-         files in the SDK, at tools/ant/build.xml
-
-         Properties related to the SDK location or the project target should
-         be updated using the 'android' tool with the 'update' action.
-
-         This file is an integral part of the build system for your
-         application and should be checked into Version Control Systems.
-
-         -->
-    <property file="ant.properties" />
-
-    <!-- The project.properties file is created and updated by the 'android'
-         tool, as well as ADT.
-
-         This contains project specific properties such as project target, and library
-         dependencies. Lower level build properties are stored in ant.properties
-         (or in .classpath for Eclipse projects).
-
-         This file is an integral part of the build system for your
-         application and should be checked into Version Control Systems. -->
-    <loadproperties srcFile="project.properties" />
-
-    <!-- if sdk.dir was not set from one of the property file, then
-         get it from the ANDROID_HOME env var. -->
-    <property environment="env" />
-    <condition property="sdk.dir" value="${env.ANDROID_HOME}">
-        <isset property="env.ANDROID_HOME" />
-    </condition>
-
-    <!-- quick check on sdk.dir -->
-    <fail
-            message="sdk.dir is missing. Make sure to generate local.properties using 'android update project' or to inject it through the ANDROID_HOME environment variable."
-            unless="sdk.dir"
-    />
-
-    <!--
-        Import per project custom build rules if present at the root of the project.
-        This is the place to put custom intermediary targets such as:
-            -pre-build
-            -pre-compile
-            -post-compile (This is typically used for code obfuscation.
-                           Compiled code location: ${out.classes.absolute.dir}
-                           If this is not done in place, override ${out.dex.input.absolute.dir})
-            -post-package
-            -post-build
-            -pre-clean
-    -->
-    <import file="custom_rules.xml" optional="true" />
-
-    <!-- Import the actual build file.
-
-         To customize existing targets, there are two options:
-         - Customize only one target:
-             - copy/paste the target into this file, *before* the
-               <import> task.
-             - customize it to your needs.
-         - Customize the whole content of build.xml
-             - copy/paste the content of the rules files (minus the top node)
-               into this file, replacing the <import> task.
-             - customize to your needs.
-
-         ***********************
-         ****** IMPORTANT ******
-         ***********************
-         In all cases you must update the value of version-tag below to read 'custom' instead of an integer,
-         in order to avoid having your file be overridden by tools such as "android update project"
-    -->
-    <!-- version-tag: 1 -->
-    <import file="${sdk.dir}/tools/ant/build.xml" />
-
-</project>
diff --git a/testapps/libsTest/lib2/proguard-project.txt b/testapps/libsTest/lib2/proguard-project.txt
deleted file mode 100644
index f2fe155..0000000
--- a/testapps/libsTest/lib2/proguard-project.txt
+++ /dev/null
@@ -1,20 +0,0 @@
-# To enable ProGuard in your project, edit project.properties
-# to define the proguard.config property as described in that file.
-#
-# Add project specific ProGuard rules here.
-# By default, the flags in this file are appended to flags specified
-# in ${sdk.dir}/tools/proguard/proguard-android.txt
-# You can edit the include path and order by changing the ProGuard
-# include property in project.properties.
-#
-# For more details, see
-#   http://developer.android.com/guide/developing/tools/proguard.html
-
-# Add any project specific keep options here:
-
-# If your project uses WebView with JS, uncomment the following
-# and specify the fully qualified class name to the JavaScript interface
-# class:
-#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
-#   public *;
-#}
diff --git a/testapps/libsTest/lib2/project.properties b/testapps/libsTest/lib2/project.properties
deleted file mode 100644
index e94ecb8..0000000
--- a/testapps/libsTest/lib2/project.properties
+++ /dev/null
@@ -1,16 +0,0 @@
-# This file is automatically generated by Android Tools.
-# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
-#
-# This file must be checked in Version Control Systems.
-#
-# To customize properties used by the Ant build system edit
-# "ant.properties", and override values to adapt the script to your
-# project structure.
-#
-# To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home):
-#proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt
-
-# Project target.
-target=android-15
-android.library=true
-
diff --git a/testapps/libsTest/lib2/res/drawable-hdpi/ic_launcher.png b/testapps/libsTest/lib2/res/drawable-hdpi/ic_launcher.png
deleted file mode 100644
index 8074c4c..0000000
--- a/testapps/libsTest/lib2/res/drawable-hdpi/ic_launcher.png
+++ /dev/null
Binary files differ
diff --git a/testapps/libsTest/lib2/res/drawable-ldpi/ic_launcher.png b/testapps/libsTest/lib2/res/drawable-ldpi/ic_launcher.png
deleted file mode 100644
index 1095584..0000000
--- a/testapps/libsTest/lib2/res/drawable-ldpi/ic_launcher.png
+++ /dev/null
Binary files differ
diff --git a/testapps/libsTest/lib2/res/drawable-mdpi/ic_launcher.png b/testapps/libsTest/lib2/res/drawable-mdpi/ic_launcher.png
deleted file mode 100644
index a07c69f..0000000
--- a/testapps/libsTest/lib2/res/drawable-mdpi/ic_launcher.png
+++ /dev/null
Binary files differ
diff --git a/testapps/libsTest/lib2/res/layout/lib2_main.xml b/testapps/libsTest/lib2/res/layout/lib2_main.xml
deleted file mode 100644
index bb639d1..0000000
--- a/testapps/libsTest/lib2/res/layout/lib2_main.xml
+++ /dev/null
@@ -1,18 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="fill_parent"
-    android:layout_height="fill_parent"
-    android:orientation="vertical" >
-
-    <TextView
-        android:id="@+id/lib2_text1"
-        android:layout_width="fill_parent"
-        android:layout_height="wrap_content"
-        android:text="@string/lib2_string" />
-
-    <TextView
-        android:id="@+id/lib2_text2"
-        android:layout_width="fill_parent"
-        android:layout_height="wrap_content" />
-
-</LinearLayout>
\ No newline at end of file
diff --git a/testapps/libsTest/lib2/res/values/strings.xml b/testapps/libsTest/lib2/res/values/strings.xml
deleted file mode 100644
index 215b8fa..0000000
--- a/testapps/libsTest/lib2/res/values/strings.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<resources>
-
-    <string name="lib2_name">LibsTest-lib2</string>
-    <string name="lib2_string">SUCCESS-LIB2</string>
-
-</resources>
\ No newline at end of file
diff --git a/testapps/libsTest/lib2/src/com/android/tests/libstest/lib2/Lib2.java b/testapps/libsTest/lib2/src/com/android/tests/libstest/lib2/Lib2.java
deleted file mode 100644
index bb8e4db..0000000
--- a/testapps/libsTest/lib2/src/com/android/tests/libstest/lib2/Lib2.java
+++ /dev/null
@@ -1,43 +0,0 @@
-package com.android.tests.libstest.lib2;
-
-import android.app.Activity;
-import android.widget.TextView;
-
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-
-public class Lib2 {
-    
-    public static void handleTextView(Activity a) {
-        TextView tv = (TextView) a.findViewById(R.id.lib2_text2);
-        if (tv != null) {
-            tv.setText(getContent());
-        }
-    }
-
-    private static String getContent() {
-        InputStream input = Lib2.class.getResourceAsStream("Lib2.txt");
-        if (input == null) {
-            return "FAILED TO FIND Lib2.txt";
-        }
-
-        BufferedReader reader = null;
-        try {
-            reader = new BufferedReader(new InputStreamReader(input, "UTF-8"));
-
-            return reader.readLine();
-        } catch (IOException e) {
-        } finally {
-            if (reader != null) {
-                try {
-                    reader.close();
-                } catch (IOException e) {
-                }
-            }
-        }
-        
-        return "FAILED TO READ CONTENT";
-    }
-}
diff --git a/testapps/libsTest/lib2/src/com/android/tests/libstest/lib2/Lib2.txt b/testapps/libsTest/lib2/src/com/android/tests/libstest/lib2/Lib2.txt
deleted file mode 100644
index 94cabe4..0000000
--- a/testapps/libsTest/lib2/src/com/android/tests/libstest/lib2/Lib2.txt
+++ /dev/null
@@ -1 +0,0 @@
-SUCCESS-LIB2
\ No newline at end of file
diff --git a/testapps/libsTest/lib2/src/com/android/tests/libstest/lib2/MainActivity.java b/testapps/libsTest/lib2/src/com/android/tests/libstest/lib2/MainActivity.java
deleted file mode 100644
index 012f203..0000000
--- a/testapps/libsTest/lib2/src/com/android/tests/libstest/lib2/MainActivity.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package com.android.tests.libstest.lib2;
-
-import android.app.Activity;
-import android.os.Bundle;
-
-public class MainActivity extends Activity {
-    /** Called when the activity is first created. */
-    @Override
-    public void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-        setContentView(R.layout.lib2_main);
-        
-        Lib2.handleTextView(this);
-    }
-}
diff --git a/testapps/libsTest/lib2Test/.classpath b/testapps/libsTest/lib2Test/.classpath
deleted file mode 100644
index a4763d1..0000000
--- a/testapps/libsTest/lib2Test/.classpath
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="src" path="gen"/>
-	<classpathentry kind="con" path="com.android.ide.eclipse.adt.ANDROID_FRAMEWORK"/>
-	<classpathentry kind="con" path="com.android.ide.eclipse.adt.LIBRARIES"/>
-	<classpathentry kind="output" path="bin/classes"/>
-</classpath>
diff --git a/testapps/libsTest/lib2Test/.project b/testapps/libsTest/lib2Test/.project
deleted file mode 100644
index 5ef5c2c..0000000
--- a/testapps/libsTest/lib2Test/.project
+++ /dev/null
@@ -1,34 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>libsTest-lib2Test</name>
-	<comment></comment>
-	<projects>
-		<project>testProjectTest-app</project>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>com.android.ide.eclipse.adt.ResourceManagerBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>com.android.ide.eclipse.adt.PreCompilerBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>com.android.ide.eclipse.adt.ApkBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>com.android.ide.eclipse.adt.AndroidNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/testapps/libsTest/lib2Test/AndroidManifest.xml b/testapps/libsTest/lib2Test/AndroidManifest.xml
deleted file mode 100644
index e6b59a1..0000000
--- a/testapps/libsTest/lib2Test/AndroidManifest.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:tools="http://schemas.android.com/tools"
-    package="com.android.tests.libstest.lib2.test"
-    android:versionCode="1"
-    android:versionName="1.0" >
-
-    <uses-sdk
-        android:minSdkVersion="15"
-        tools:ignore="UsesMinSdkAttributes" />
-
-    <!--
-         We add an application tag here just so that we can indicate that
-         this package needs to link against the android.test library,
-         which is needed when building test cases.
-    -->
-    <application android:label="testProjectTest-testlib" >
-        <uses-library android:name="android.test.runner" />
-    </application>
-
-    <!--
-    This declares that this app uses the instrumentation test runner targeting
-    the package of com.android.tests.testprojecttest.testlib.  To run the tests use the command:
-    "adb shell am instrument -w com.android.tests.testprojecttest.testlib/android.test.InstrumentationTestRunner"
-    -->
-    <instrumentation
-        android:name="android.test.InstrumentationTestRunner"
-        android:targetPackage="com.android.tests.libstest.lib2.test" />
-
-</manifest>
\ No newline at end of file
diff --git a/testapps/libsTest/lib2Test/build.xml b/testapps/libsTest/lib2Test/build.xml
deleted file mode 100644
index b59cc65..0000000
--- a/testapps/libsTest/lib2Test/build.xml
+++ /dev/null
@@ -1,92 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project name="testProjectTest-testlib" default="help">
-
-    <!-- The local.properties file is created and updated by the 'android' tool.
-         It contains the path to the SDK. It should *NOT* be checked into
-         Version Control Systems. -->
-    <property file="local.properties" />
-
-    <!-- The ant.properties file can be created by you. It is only edited by the
-         'android' tool to add properties to it.
-         This is the place to change some Ant specific build properties.
-         Here are some properties you may want to change/update:
-
-         source.dir
-             The name of the source directory. Default is 'src'.
-         out.dir
-             The name of the output directory. Default is 'bin'.
-
-         For other overridable properties, look at the beginning of the rules
-         files in the SDK, at tools/ant/build.xml
-
-         Properties related to the SDK location or the project target should
-         be updated using the 'android' tool with the 'update' action.
-
-         This file is an integral part of the build system for your
-         application and should be checked into Version Control Systems.
-
-         -->
-    <property file="ant.properties" />
-
-    <!-- if sdk.dir was not set from one of the property file, then
-         get it from the ANDROID_HOME env var.
-         This must be done before we load project.properties since
-         the proguard config can use sdk.dir -->
-    <property environment="env" />
-    <condition property="sdk.dir" value="${env.ANDROID_HOME}">
-        <isset property="env.ANDROID_HOME" />
-    </condition>
-
-    <!-- The project.properties file is created and updated by the 'android'
-         tool, as well as ADT.
-
-         This contains project specific properties such as project target, and library
-         dependencies. Lower level build properties are stored in ant.properties
-         (or in .classpath for Eclipse projects).
-
-         This file is an integral part of the build system for your
-         application and should be checked into Version Control Systems. -->
-    <loadproperties srcFile="project.properties" />
-
-    <!-- quick check on sdk.dir -->
-    <fail
-            message="sdk.dir is missing. Make sure to generate local.properties using 'android update project' or to inject it through the ANDROID_HOME environment variable."
-            unless="sdk.dir"
-    />
-
-    <!--
-        Import per project custom build rules if present at the root of the project.
-        This is the place to put custom intermediary targets such as:
-            -pre-build
-            -pre-compile
-            -post-compile (This is typically used for code obfuscation.
-                           Compiled code location: ${out.classes.absolute.dir}
-                           If this is not done in place, override ${out.dex.input.absolute.dir})
-            -post-package
-            -post-build
-            -pre-clean
-    -->
-    <import file="custom_rules.xml" optional="true" />
-
-    <!-- Import the actual build file.
-
-         To customize existing targets, there are two options:
-         - Customize only one target:
-             - copy/paste the target into this file, *before* the
-               <import> task.
-             - customize it to your needs.
-         - Customize the whole content of build.xml
-             - copy/paste the content of the rules files (minus the top node)
-               into this file, replacing the <import> task.
-             - customize to your needs.
-
-         ***********************
-         ****** IMPORTANT ******
-         ***********************
-         In all cases you must update the value of version-tag below to read 'custom' instead of an integer,
-         in order to avoid having your file be overridden by tools such as "android update project"
-    -->
-    <!-- version-tag: 1 -->
-    <import file="${sdk.dir}/tools/ant/build.xml" />
-
-</project>
diff --git a/testapps/libsTest/lib2Test/proguard-project.txt b/testapps/libsTest/lib2Test/proguard-project.txt
deleted file mode 100644
index f2fe155..0000000
--- a/testapps/libsTest/lib2Test/proguard-project.txt
+++ /dev/null
@@ -1,20 +0,0 @@
-# To enable ProGuard in your project, edit project.properties
-# to define the proguard.config property as described in that file.
-#
-# Add project specific ProGuard rules here.
-# By default, the flags in this file are appended to flags specified
-# in ${sdk.dir}/tools/proguard/proguard-android.txt
-# You can edit the include path and order by changing the ProGuard
-# include property in project.properties.
-#
-# For more details, see
-#   http://developer.android.com/guide/developing/tools/proguard.html
-
-# Add any project specific keep options here:
-
-# If your project uses WebView with JS, uncomment the following
-# and specify the fully qualified class name to the JavaScript interface
-# class:
-#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
-#   public *;
-#}
diff --git a/testapps/libsTest/lib2Test/project.properties b/testapps/libsTest/lib2Test/project.properties
deleted file mode 100644
index dfe40b0..0000000
--- a/testapps/libsTest/lib2Test/project.properties
+++ /dev/null
@@ -1,16 +0,0 @@
-# This file is automatically generated by Android Tools.
-# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
-#
-# This file must be checked in Version Control Systems.
-#
-# To customize properties used by the Ant build system edit
-# "ant.properties", and override values to adapt the script to your
-# project structure.
-#
-# To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home):
-#proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt
-
-# Project target.
-target=android-15
-android.library.reference.1=../lib2
-manifestmerger.enabled=true
diff --git a/testapps/libsTest/lib2Test/res/values/strings.xml b/testapps/libsTest/lib2Test/res/values/strings.xml
deleted file mode 100644
index 68ce771..0000000
--- a/testapps/libsTest/lib2Test/res/values/strings.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<resources>
-
-    <string name="lib2_name">LibsTest-lib2Test</string>
-
-</resources>
\ No newline at end of file
diff --git a/testapps/libsTest/lib2Test/src/com/android/tests/libstest/lib2/MainActivityTest.java b/testapps/libsTest/lib2Test/src/com/android/tests/libstest/lib2/MainActivityTest.java
deleted file mode 100644
index 6ac4a5c..0000000
--- a/testapps/libsTest/lib2Test/src/com/android/tests/libstest/lib2/MainActivityTest.java
+++ /dev/null
@@ -1,86 +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.tests.libstest.lib2;
-
-import android.test.ActivityInstrumentationTestCase2;
-import android.test.suitebuilder.annotation.MediumTest;
-import android.widget.TextView;
-
-import com.android.tests.libstest.lib2.R;
-
-/**
- * An example of an {@link ActivityInstrumentationTestCase2} of a specific activity {@link Focus2}.
- * By virtue of extending {@link ActivityInstrumentationTestCase2}, the target activity is automatically
- * launched and finished before and after each test.  This also extends
- * {@link android.test.InstrumentationTestCase}, which provides
- * access to methods for sending events to the target activity, such as key and
- * touch events.  See {@link #sendKeys}.
- *
- * In general, {@link android.test.InstrumentationTestCase}s and {@link ActivityInstrumentationTestCase2}s
- * are heavier weight functional tests available for end to end testing of your
- * user interface.  When run via a {@link android.test.InstrumentationTestRunner},
- * the necessary {@link android.app.Instrumentation} will be injected for you to
- * user via {@link #getInstrumentation} in your tests.
- *
- * See {@link com.example.android.apis.AllTests} for documentation on running
- * all tests and individual tests in this application.
- */
-public class MainActivityTest extends ActivityInstrumentationTestCase2<MainActivity> {
-
-    private TextView mTextView1;
-    private TextView mTextView2;
-
-    /**
-     * Creates an {@link ActivityInstrumentationTestCase2} that tests the {@link Focus2} activity.
-     */
-    public MainActivityTest() {
-        super(MainActivity.class);
-    }
-
-    @Override
-    protected void setUp() throws Exception {
-        super.setUp();
-        final MainActivity a = getActivity();
-        // ensure a valid handle to the activity has been returned
-        assertNotNull(a);
-        
-        mTextView1 = (TextView) a.findViewById(R.id.lib2_text1);
-        mTextView2 = (TextView) a.findViewById(R.id.lib2_text2);
-    }
-
-    /**
-     * The name 'test preconditions' is a convention to signal that if this
-     * test doesn't pass, the test case was not set up properly and it might
-     * explain any and all failures in other tests.  This is not guaranteed
-     * to run before other tests, as junit uses reflection to find the tests.
-     */
-    @MediumTest
-    public void testPreconditions() {
-        assertNotNull(mTextView1);
-        assertNotNull(mTextView2);
-    }
-
-    @MediumTest
-    public void testAndroidStrings() {
-        assertEquals("SUCCESS-LIB2", mTextView1.getText());
-    }
-
-    @MediumTest
-    public void testJavaStrings() {
-        assertEquals("SUCCESS-LIB2", mTextView2.getText());
-    }
-}
diff --git a/testapps/proguard.config b/testapps/proguard.config
deleted file mode 100644
index b9dab40..0000000
--- a/testapps/proguard.config
+++ /dev/null
@@ -1,31 +0,0 @@
--optimizationpasses 5
--dontusemixedcaseclassnames
--dontskipnonpubliclibraryclasses
--dontpreverify
--verbose
--optimizations !code/simplification/arithmetic,!field/*,!class/merging/*
-
--keep public class * extends android.app.Activity
--keep public class * extends android.app.Application
--keep public class * extends android.app.Service
--keep public class * extends android.content.BroadcastReceiver
--keep public class * extends android.content.ContentProvider
--keep public class com.android.vending.licensing.ILicensingService
-
--keepclasseswithmembernames class * {
-    native <methods>;
-}
-
--keepclasseswithmembernames class * {
-    public <init>(android.content.Context, android.util.AttributeSet); 
-}
-
--keepclasseswithmembernames class * {
-    public <init>(android.content.Context, android.util.AttributeSet, int); 
-}
-
--keepclassmembers enum * {
-    public static **[] values();
-    public static ** valueOf(java.lang.String);
-}
-
diff --git a/testapps/testProjectTest/COMPILE_AND_RUN b/testapps/testProjectTest/COMPILE_AND_RUN
deleted file mode 100644
index e69de29..0000000
--- a/testapps/testProjectTest/COMPILE_AND_RUN
+++ /dev/null
diff --git a/testapps/testProjectTest/SUCCESS b/testapps/testProjectTest/SUCCESS
deleted file mode 100644
index e69de29..0000000
--- a/testapps/testProjectTest/SUCCESS
+++ /dev/null
diff --git a/testapps/testProjectTest/app/.classpath b/testapps/testProjectTest/app/.classpath
deleted file mode 100644
index a4763d1..0000000
--- a/testapps/testProjectTest/app/.classpath
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="src" path="gen"/>
-	<classpathentry kind="con" path="com.android.ide.eclipse.adt.ANDROID_FRAMEWORK"/>
-	<classpathentry kind="con" path="com.android.ide.eclipse.adt.LIBRARIES"/>
-	<classpathentry kind="output" path="bin/classes"/>
-</classpath>
diff --git a/testapps/testProjectTest/app/.project b/testapps/testProjectTest/app/.project
deleted file mode 100644
index 344feb8..0000000
--- a/testapps/testProjectTest/app/.project
+++ /dev/null
@@ -1,33 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>testProjectTest-app</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>com.android.ide.eclipse.adt.ResourceManagerBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>com.android.ide.eclipse.adt.PreCompilerBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>com.android.ide.eclipse.adt.ApkBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>com.android.ide.eclipse.adt.AndroidNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/testapps/testProjectTest/app/AndroidManifest.xml b/testapps/testProjectTest/app/AndroidManifest.xml
deleted file mode 100644
index 41e6b82..0000000
--- a/testapps/testProjectTest/app/AndroidManifest.xml
+++ /dev/null
@@ -1,14 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
-    package="com.android.tests.testprojecttest.app"
-    android:versionCode="1"
-    android:versionName="1.0" >
-
-    <uses-sdk android:minSdkVersion="15" />
-
-    <application
-        android:icon="@drawable/ic_launcher"
-        android:label="@string/app_name" >
-    </application>
-
-</manifest>
\ No newline at end of file
diff --git a/testapps/testProjectTest/app/build.xml b/testapps/testProjectTest/app/build.xml
deleted file mode 100644
index 1a886ce..0000000
--- a/testapps/testProjectTest/app/build.xml
+++ /dev/null
@@ -1,92 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project name="testProjectTest-app" default="help">
-
-    <!-- The local.properties file is created and updated by the 'android' tool.
-         It contains the path to the SDK. It should *NOT* be checked into
-         Version Control Systems. -->
-    <property file="local.properties" />
-
-    <!-- The ant.properties file can be created by you. It is only edited by the
-         'android' tool to add properties to it.
-         This is the place to change some Ant specific build properties.
-         Here are some properties you may want to change/update:
-
-         source.dir
-             The name of the source directory. Default is 'src'.
-         out.dir
-             The name of the output directory. Default is 'bin'.
-
-         For other overridable properties, look at the beginning of the rules
-         files in the SDK, at tools/ant/build.xml
-
-         Properties related to the SDK location or the project target should
-         be updated using the 'android' tool with the 'update' action.
-
-         This file is an integral part of the build system for your
-         application and should be checked into Version Control Systems.
-
-         -->
-    <property file="ant.properties" />
-
-    <!-- if sdk.dir was not set from one of the property file, then
-         get it from the ANDROID_HOME env var.
-         This must be done before we load project.properties since
-         the proguard config can use sdk.dir -->
-    <property environment="env" />
-    <condition property="sdk.dir" value="${env.ANDROID_HOME}">
-        <isset property="env.ANDROID_HOME" />
-    </condition>
-
-    <!-- The project.properties file is created and updated by the 'android'
-         tool, as well as ADT.
-
-         This contains project specific properties such as project target, and library
-         dependencies. Lower level build properties are stored in ant.properties
-         (or in .classpath for Eclipse projects).
-
-         This file is an integral part of the build system for your
-         application and should be checked into Version Control Systems. -->
-    <loadproperties srcFile="project.properties" />
-
-    <!-- quick check on sdk.dir -->
-    <fail
-            message="sdk.dir is missing. Make sure to generate local.properties using 'android update project' or to inject it through the ANDROID_HOME environment variable."
-            unless="sdk.dir"
-    />
-
-    <!--
-        Import per project custom build rules if present at the root of the project.
-        This is the place to put custom intermediary targets such as:
-            -pre-build
-            -pre-compile
-            -post-compile (This is typically used for code obfuscation.
-                           Compiled code location: ${out.classes.absolute.dir}
-                           If this is not done in place, override ${out.dex.input.absolute.dir})
-            -post-package
-            -post-build
-            -pre-clean
-    -->
-    <import file="custom_rules.xml" optional="true" />
-
-    <!-- Import the actual build file.
-
-         To customize existing targets, there are two options:
-         - Customize only one target:
-             - copy/paste the target into this file, *before* the
-               <import> task.
-             - customize it to your needs.
-         - Customize the whole content of build.xml
-             - copy/paste the content of the rules files (minus the top node)
-               into this file, replacing the <import> task.
-             - customize to your needs.
-
-         ***********************
-         ****** IMPORTANT ******
-         ***********************
-         In all cases you must update the value of version-tag below to read 'custom' instead of an integer,
-         in order to avoid having your file be overridden by tools such as "android update project"
-    -->
-    <!-- version-tag: 1 -->
-    <import file="${sdk.dir}/tools/ant/build.xml" />
-
-</project>
diff --git a/testapps/testProjectTest/app/proguard-project.txt b/testapps/testProjectTest/app/proguard-project.txt
deleted file mode 100644
index f2fe155..0000000
--- a/testapps/testProjectTest/app/proguard-project.txt
+++ /dev/null
@@ -1,20 +0,0 @@
-# To enable ProGuard in your project, edit project.properties
-# to define the proguard.config property as described in that file.
-#
-# Add project specific ProGuard rules here.
-# By default, the flags in this file are appended to flags specified
-# in ${sdk.dir}/tools/proguard/proguard-android.txt
-# You can edit the include path and order by changing the ProGuard
-# include property in project.properties.
-#
-# For more details, see
-#   http://developer.android.com/guide/developing/tools/proguard.html
-
-# Add any project specific keep options here:
-
-# If your project uses WebView with JS, uncomment the following
-# and specify the fully qualified class name to the JavaScript interface
-# class:
-#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
-#   public *;
-#}
diff --git a/testapps/testProjectTest/app/project.properties b/testapps/testProjectTest/app/project.properties
deleted file mode 100644
index 01b6493..0000000
--- a/testapps/testProjectTest/app/project.properties
+++ /dev/null
@@ -1,16 +0,0 @@
-# This file is automatically generated by Android Tools.
-# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
-#
-# This file must be checked in Version Control Systems.
-#
-# To customize properties used by the Ant build system edit
-# "ant.properties", and override values to adapt the script to your
-# project structure.
-#
-# To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home):
-#proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt
-
-# Project target.
-target=android-15
-android.library.reference.1=../lib
-manifestmerger.enabled=true
diff --git a/testapps/testProjectTest/app/res/drawable-hdpi/ic_launcher.png b/testapps/testProjectTest/app/res/drawable-hdpi/ic_launcher.png
deleted file mode 100644
index 96a442e..0000000
--- a/testapps/testProjectTest/app/res/drawable-hdpi/ic_launcher.png
+++ /dev/null
Binary files differ
diff --git a/testapps/testProjectTest/app/res/drawable-ldpi/ic_launcher.png b/testapps/testProjectTest/app/res/drawable-ldpi/ic_launcher.png
deleted file mode 100644
index 9923872..0000000
--- a/testapps/testProjectTest/app/res/drawable-ldpi/ic_launcher.png
+++ /dev/null
Binary files differ
diff --git a/testapps/testProjectTest/app/res/drawable-mdpi/ic_launcher.png b/testapps/testProjectTest/app/res/drawable-mdpi/ic_launcher.png
deleted file mode 100644
index 359047d..0000000
--- a/testapps/testProjectTest/app/res/drawable-mdpi/ic_launcher.png
+++ /dev/null
Binary files differ
diff --git a/testapps/testProjectTest/app/res/drawable-xhdpi/ic_launcher.png b/testapps/testProjectTest/app/res/drawable-xhdpi/ic_launcher.png
deleted file mode 100644
index 71c6d76..0000000
--- a/testapps/testProjectTest/app/res/drawable-xhdpi/ic_launcher.png
+++ /dev/null
Binary files differ
diff --git a/testapps/testProjectTest/app/res/values/strings.xml b/testapps/testProjectTest/app/res/values/strings.xml
deleted file mode 100644
index c933032..0000000
--- a/testapps/testProjectTest/app/res/values/strings.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<resources>
-
-    <string name="app_name">TestProjectTest-app</string>
-
-</resources>
\ No newline at end of file
diff --git a/testapps/testProjectTest/app/src/readme.txt b/testapps/testProjectTest/app/src/readme.txt
deleted file mode 100644
index 103fd76..0000000
--- a/testapps/testProjectTest/app/src/readme.txt
+++ /dev/null
@@ -1 +0,0 @@
-Just there so that the src folder doesn't disappear.
\ No newline at end of file
diff --git a/testapps/testProjectTest/lib/.classpath b/testapps/testProjectTest/lib/.classpath
deleted file mode 100644
index a4763d1..0000000
--- a/testapps/testProjectTest/lib/.classpath
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="src" path="gen"/>
-	<classpathentry kind="con" path="com.android.ide.eclipse.adt.ANDROID_FRAMEWORK"/>
-	<classpathentry kind="con" path="com.android.ide.eclipse.adt.LIBRARIES"/>
-	<classpathentry kind="output" path="bin/classes"/>
-</classpath>
diff --git a/testapps/testProjectTest/lib/.project b/testapps/testProjectTest/lib/.project
deleted file mode 100644
index 274b512..0000000
--- a/testapps/testProjectTest/lib/.project
+++ /dev/null
@@ -1,33 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>testProjectTest-lib</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>com.android.ide.eclipse.adt.ResourceManagerBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>com.android.ide.eclipse.adt.PreCompilerBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>com.android.ide.eclipse.adt.ApkBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>com.android.ide.eclipse.adt.AndroidNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/testapps/testProjectTest/lib/AndroidManifest.xml b/testapps/testProjectTest/lib/AndroidManifest.xml
deleted file mode 100644
index b8bc11c..0000000
--- a/testapps/testProjectTest/lib/AndroidManifest.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
-    package="com.android.tests.testprojecttest.lib"
-    android:versionCode="1"
-    android:versionName="1.0" >
-
-    <uses-sdk android:minSdkVersion="15" />
-
-    <application>
-        <activity
-            android:name="com.android.tests.testprojecttest.lib.LibActivity"
-            android:label="@string/app_name" >
-            <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/testapps/testProjectTest/lib/build.xml b/testapps/testProjectTest/lib/build.xml
deleted file mode 100644
index 88c6845..0000000
--- a/testapps/testProjectTest/lib/build.xml
+++ /dev/null
@@ -1,92 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project name="testProjectTest-lib" default="help">
-
-    <!-- The local.properties file is created and updated by the 'android' tool.
-         It contains the path to the SDK. It should *NOT* be checked into
-         Version Control Systems. -->
-    <property file="local.properties" />
-
-    <!-- The ant.properties file can be created by you. It is only edited by the
-         'android' tool to add properties to it.
-         This is the place to change some Ant specific build properties.
-         Here are some properties you may want to change/update:
-
-         source.dir
-             The name of the source directory. Default is 'src'.
-         out.dir
-             The name of the output directory. Default is 'bin'.
-
-         For other overridable properties, look at the beginning of the rules
-         files in the SDK, at tools/ant/build.xml
-
-         Properties related to the SDK location or the project target should
-         be updated using the 'android' tool with the 'update' action.
-
-         This file is an integral part of the build system for your
-         application and should be checked into Version Control Systems.
-
-         -->
-    <property file="ant.properties" />
-
-    <!-- if sdk.dir was not set from one of the property file, then
-         get it from the ANDROID_HOME env var.
-         This must be done before we load project.properties since
-         the proguard config can use sdk.dir -->
-    <property environment="env" />
-    <condition property="sdk.dir" value="${env.ANDROID_HOME}">
-        <isset property="env.ANDROID_HOME" />
-    </condition>
-
-    <!-- The project.properties file is created and updated by the 'android'
-         tool, as well as ADT.
-
-         This contains project specific properties such as project target, and library
-         dependencies. Lower level build properties are stored in ant.properties
-         (or in .classpath for Eclipse projects).
-
-         This file is an integral part of the build system for your
-         application and should be checked into Version Control Systems. -->
-    <loadproperties srcFile="project.properties" />
-
-    <!-- quick check on sdk.dir -->
-    <fail
-            message="sdk.dir is missing. Make sure to generate local.properties using 'android update project' or to inject it through the ANDROID_HOME environment variable."
-            unless="sdk.dir"
-    />
-
-    <!--
-        Import per project custom build rules if present at the root of the project.
-        This is the place to put custom intermediary targets such as:
-            -pre-build
-            -pre-compile
-            -post-compile (This is typically used for code obfuscation.
-                           Compiled code location: ${out.classes.absolute.dir}
-                           If this is not done in place, override ${out.dex.input.absolute.dir})
-            -post-package
-            -post-build
-            -pre-clean
-    -->
-    <import file="custom_rules.xml" optional="true" />
-
-    <!-- Import the actual build file.
-
-         To customize existing targets, there are two options:
-         - Customize only one target:
-             - copy/paste the target into this file, *before* the
-               <import> task.
-             - customize it to your needs.
-         - Customize the whole content of build.xml
-             - copy/paste the content of the rules files (minus the top node)
-               into this file, replacing the <import> task.
-             - customize to your needs.
-
-         ***********************
-         ****** IMPORTANT ******
-         ***********************
-         In all cases you must update the value of version-tag below to read 'custom' instead of an integer,
-         in order to avoid having your file be overridden by tools such as "android update project"
-    -->
-    <!-- version-tag: 1 -->
-    <import file="${sdk.dir}/tools/ant/build.xml" />
-
-</project>
diff --git a/testapps/testProjectTest/lib/proguard-project.txt b/testapps/testProjectTest/lib/proguard-project.txt
deleted file mode 100644
index f2fe155..0000000
--- a/testapps/testProjectTest/lib/proguard-project.txt
+++ /dev/null
@@ -1,20 +0,0 @@
-# To enable ProGuard in your project, edit project.properties
-# to define the proguard.config property as described in that file.
-#
-# Add project specific ProGuard rules here.
-# By default, the flags in this file are appended to flags specified
-# in ${sdk.dir}/tools/proguard/proguard-android.txt
-# You can edit the include path and order by changing the ProGuard
-# include property in project.properties.
-#
-# For more details, see
-#   http://developer.android.com/guide/developing/tools/proguard.html
-
-# Add any project specific keep options here:
-
-# If your project uses WebView with JS, uncomment the following
-# and specify the fully qualified class name to the JavaScript interface
-# class:
-#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
-#   public *;
-#}
diff --git a/testapps/testProjectTest/lib/project.properties b/testapps/testProjectTest/lib/project.properties
deleted file mode 100644
index 36f1594..0000000
--- a/testapps/testProjectTest/lib/project.properties
+++ /dev/null
@@ -1,15 +0,0 @@
-# This file is automatically generated by Android Tools.
-# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
-#
-# This file must be checked in Version Control Systems.
-#
-# To customize properties used by the Ant build system edit
-# "ant.properties", and override values to adapt the script to your
-# project structure.
-#
-# To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home):
-#proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt
-
-# Project target.
-target=android-15
-android.library=true
diff --git a/testapps/testProjectTest/lib/res/layout/main.xml b/testapps/testProjectTest/lib/res/layout/main.xml
deleted file mode 100644
index 14a9c4b..0000000
--- a/testapps/testProjectTest/lib/res/layout/main.xml
+++ /dev/null
@@ -1,15 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:tools="http://schemas.android.com/tools"
-    android:layout_width="fill_parent"
-    android:layout_height="fill_parent"
-    android:orientation="vertical" >
-
-    <TextView
-        android:id="@+id/text"
-        android:layout_width="fill_parent"
-        android:layout_height="wrap_content"
-        android:text="some string"
-        tools:ignore="HardcodedText" />
-
-</LinearLayout>
\ No newline at end of file
diff --git a/testapps/testProjectTest/lib/res/values/strings.xml b/testapps/testProjectTest/lib/res/values/strings.xml
deleted file mode 100644
index fdb2272..0000000
--- a/testapps/testProjectTest/lib/res/values/strings.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<resources>
-
-    <string name="app_name">TestProjectTest-lib</string>
-
-</resources>
\ No newline at end of file
diff --git a/testapps/testProjectTest/lib/src/com/android/tests/testprojecttest/lib/LibActivity.java b/testapps/testProjectTest/lib/src/com/android/tests/testprojecttest/lib/LibActivity.java
deleted file mode 100644
index 7d7f607..0000000
--- a/testapps/testProjectTest/lib/src/com/android/tests/testprojecttest/lib/LibActivity.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package com.android.tests.testprojecttest.lib;
-
-import android.app.Activity;
-import android.os.Bundle;
-
-public class LibActivity extends Activity {
-    /** Called when the activity is first created. */
-    @Override
-    public void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-        setContentView(R.layout.main);
-    }
-}
\ No newline at end of file
diff --git a/testapps/testProjectTest/testapp/.classpath b/testapps/testProjectTest/testapp/.classpath
deleted file mode 100644
index 9afbc38..0000000
--- a/testapps/testProjectTest/testapp/.classpath
+++ /dev/null
@@ -1,9 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="src" path="gen"/>
-	<classpathentry combineaccessrules="false" kind="src" path="/testProjectTest-app"/>
-	<classpathentry kind="con" path="com.android.ide.eclipse.adt.ANDROID_FRAMEWORK"/>
-	<classpathentry kind="con" path="com.android.ide.eclipse.adt.LIBRARIES"/>
-	<classpathentry kind="output" path="bin/classes"/>
-</classpath>
diff --git a/testapps/testProjectTest/testapp/.project b/testapps/testProjectTest/testapp/.project
deleted file mode 100644
index 796ccc1..0000000
--- a/testapps/testProjectTest/testapp/.project
+++ /dev/null
@@ -1,34 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>testProjectTest-testapp</name>
-	<comment></comment>
-	<projects>
-		<project>testProjectTest-app</project>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>com.android.ide.eclipse.adt.ResourceManagerBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>com.android.ide.eclipse.adt.PreCompilerBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>com.android.ide.eclipse.adt.ApkBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>com.android.ide.eclipse.adt.AndroidNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/testapps/testProjectTest/testapp/AndroidManifest.xml b/testapps/testProjectTest/testapp/AndroidManifest.xml
deleted file mode 100644
index 5252972..0000000
--- a/testapps/testProjectTest/testapp/AndroidManifest.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
-    package="com.android.tests.testprojecttest.test"
-    android:versionCode="1"
-    android:versionName="1.0" >
-
-    <uses-sdk android:minSdkVersion="15" />
-
-    <!--
-         We add an application tag here just so that we can indicate that
-         this package needs to link against the android.test library,
-         which is needed when building test cases.
-    -->
-    <application android:label="testProjectTest-testapp">
-        <uses-library android:name="android.test.runner" />
-    </application>
-
-    <!--
-    This declares that this app uses the instrumentation test runner targeting
-    the package of com.android.tests.testprojecttest.app.  To run the tests use the command:
-    "adb shell am instrument -w com.android.tests.testprojecttest.test/android.test.InstrumentationTestRunner"
-    -->
-    <instrumentation
-        android:name="android.test.InstrumentationTestRunner"
-        android:targetPackage="com.android.tests.testprojecttest.app" />
-
-</manifest>
\ No newline at end of file
diff --git a/testapps/testProjectTest/testapp/build.xml b/testapps/testProjectTest/testapp/build.xml
deleted file mode 100644
index 4f12210..0000000
--- a/testapps/testProjectTest/testapp/build.xml
+++ /dev/null
@@ -1,92 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project name="testProjectTest-testapp" default="help">
-
-    <!-- The local.properties file is created and updated by the 'android' tool.
-         It contains the path to the SDK. It should *NOT* be checked into
-         Version Control Systems. -->
-    <property file="local.properties" />
-
-    <!-- The ant.properties file can be created by you. It is only edited by the
-         'android' tool to add properties to it.
-         This is the place to change some Ant specific build properties.
-         Here are some properties you may want to change/update:
-
-         source.dir
-             The name of the source directory. Default is 'src'.
-         out.dir
-             The name of the output directory. Default is 'bin'.
-
-         For other overridable properties, look at the beginning of the rules
-         files in the SDK, at tools/ant/build.xml
-
-         Properties related to the SDK location or the project target should
-         be updated using the 'android' tool with the 'update' action.
-
-         This file is an integral part of the build system for your
-         application and should be checked into Version Control Systems.
-
-         -->
-    <property file="ant.properties" />
-
-    <!-- if sdk.dir was not set from one of the property file, then
-         get it from the ANDROID_HOME env var.
-         This must be done before we load project.properties since
-         the proguard config can use sdk.dir -->
-    <property environment="env" />
-    <condition property="sdk.dir" value="${env.ANDROID_HOME}">
-        <isset property="env.ANDROID_HOME" />
-    </condition>
-
-    <!-- The project.properties file is created and updated by the 'android'
-         tool, as well as ADT.
-
-         This contains project specific properties such as project target, and library
-         dependencies. Lower level build properties are stored in ant.properties
-         (or in .classpath for Eclipse projects).
-
-         This file is an integral part of the build system for your
-         application and should be checked into Version Control Systems. -->
-    <loadproperties srcFile="project.properties" />
-
-    <!-- quick check on sdk.dir -->
-    <fail
-            message="sdk.dir is missing. Make sure to generate local.properties using 'android update project' or to inject it through the ANDROID_HOME environment variable."
-            unless="sdk.dir"
-    />
-
-    <!--
-        Import per project custom build rules if present at the root of the project.
-        This is the place to put custom intermediary targets such as:
-            -pre-build
-            -pre-compile
-            -post-compile (This is typically used for code obfuscation.
-                           Compiled code location: ${out.classes.absolute.dir}
-                           If this is not done in place, override ${out.dex.input.absolute.dir})
-            -post-package
-            -post-build
-            -pre-clean
-    -->
-    <import file="custom_rules.xml" optional="true" />
-
-    <!-- Import the actual build file.
-
-         To customize existing targets, there are two options:
-         - Customize only one target:
-             - copy/paste the target into this file, *before* the
-               <import> task.
-             - customize it to your needs.
-         - Customize the whole content of build.xml
-             - copy/paste the content of the rules files (minus the top node)
-               into this file, replacing the <import> task.
-             - customize to your needs.
-
-         ***********************
-         ****** IMPORTANT ******
-         ***********************
-         In all cases you must update the value of version-tag below to read 'custom' instead of an integer,
-         in order to avoid having your file be overridden by tools such as "android update project"
-    -->
-    <!-- version-tag: 1 -->
-    <import file="${sdk.dir}/tools/ant/build.xml" />
-
-</project>
diff --git a/testapps/testProjectTest/testapp/proguard-project.txt b/testapps/testProjectTest/testapp/proguard-project.txt
deleted file mode 100644
index f2fe155..0000000
--- a/testapps/testProjectTest/testapp/proguard-project.txt
+++ /dev/null
@@ -1,20 +0,0 @@
-# To enable ProGuard in your project, edit project.properties
-# to define the proguard.config property as described in that file.
-#
-# Add project specific ProGuard rules here.
-# By default, the flags in this file are appended to flags specified
-# in ${sdk.dir}/tools/proguard/proguard-android.txt
-# You can edit the include path and order by changing the ProGuard
-# include property in project.properties.
-#
-# For more details, see
-#   http://developer.android.com/guide/developing/tools/proguard.html
-
-# Add any project specific keep options here:
-
-# If your project uses WebView with JS, uncomment the following
-# and specify the fully qualified class name to the JavaScript interface
-# class:
-#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
-#   public *;
-#}
diff --git a/testapps/testProjectTest/testapp/project.properties b/testapps/testProjectTest/testapp/project.properties
deleted file mode 100644
index 4c13b85..0000000
--- a/testapps/testProjectTest/testapp/project.properties
+++ /dev/null
@@ -1,15 +0,0 @@
-# This file is automatically generated by Android Tools.
-# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
-#
-# This file must be checked in Version Control Systems.
-#
-# To customize properties used by the Ant build system edit
-# "ant.properties", and override values to adapt the script to your
-# project structure.
-#
-# To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home):
-#proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt
-
-# Project target.
-target=android-15
-tested.project.dir=../app
diff --git a/testapps/testProjectTest/testapp/src/com/android/tests/testprojecttest/lib/LibActivityTest.java b/testapps/testProjectTest/testapp/src/com/android/tests/testprojecttest/lib/LibActivityTest.java
deleted file mode 100644
index 9be6f97..0000000
--- a/testapps/testProjectTest/testapp/src/com/android/tests/testprojecttest/lib/LibActivityTest.java
+++ /dev/null
@@ -1,72 +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.tests.testprojecttest.lib;
-
-import android.test.ActivityInstrumentationTestCase2;
-import android.test.suitebuilder.annotation.MediumTest;
-import android.widget.TextView;
-
-import com.android.tests.testprojecttest.app.R;
-
-/**
- * An example of an {@link ActivityInstrumentationTestCase2} of a specific activity {@link Focus2}.
- * By virtue of extending {@link ActivityInstrumentationTestCase2}, the target activity is automatically
- * launched and finished before and after each test.  This also extends
- * {@link android.test.InstrumentationTestCase}, which provides
- * access to methods for sending events to the target activity, such as key and
- * touch events.  See {@link #sendKeys}.
- *
- * In general, {@link android.test.InstrumentationTestCase}s and {@link ActivityInstrumentationTestCase2}s
- * are heavier weight functional tests available for end to end testing of your
- * user interface.  When run via a {@link android.test.InstrumentationTestRunner},
- * the necessary {@link android.app.Instrumentation} will be injected for you to
- * user via {@link #getInstrumentation} in your tests.
- *
- * See {@link com.example.android.apis.AllTests} for documentation on running
- * all tests and individual tests in this application.
- */
-public class LibActivityTest extends ActivityInstrumentationTestCase2<LibActivity> {
-
-    private TextView mTextView;
-
-    /**
-     * Creates an {@link ActivityInstrumentationTestCase2} that tests the {@link Focus2} activity.
-     */
-    public LibActivityTest() {
-        super(LibActivity.class);
-    }
-
-    @Override
-    protected void setUp() throws Exception {
-        super.setUp();
-        final LibActivity a = getActivity();
-        // ensure a valid handle to the activity has been returned
-        assertNotNull(a);
-        mTextView = (TextView) a.findViewById(R.id.text);
-    }
-
-    /**
-     * The name 'test preconditions' is a convention to signal that if this
-     * test doesn't pass, the test case was not set up properly and it might
-     * explain any and all failures in other tests.  This is not guaranteed
-     * to run before other tests, as junit uses reflection to find the tests.
-     */
-    @MediumTest
-    public void testPreconditions() {
-        assertNotNull(mTextView);
-    }
-}
diff --git a/testapps/testProjectTest/testapp/src/com/android/tests/testprojecttest/test/AllTests.java b/testapps/testProjectTest/testapp/src/com/android/tests/testprojecttest/test/AllTests.java
deleted file mode 100644
index a77b53c..0000000
--- a/testapps/testProjectTest/testapp/src/com/android/tests/testprojecttest/test/AllTests.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.tests.testprojecttest.test;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-import android.test.suitebuilder.TestSuiteBuilder;
-
-/**
- * A test suite containing all tests for ApiDemos.
- *
- * To run all suites found in this apk:
- * $ adb shell am instrument -w \
- *   com.example.android.apis.tests/android.test.InstrumentationTestRunner
- *
- * To run just this suite from the command line:
- * $ adb shell am instrument -w \
- *   -e class com.example.android.apis.AllTests \
- *   com.example.android.apis.tests/android.test.InstrumentationTestRunner
- *
- * To run an individual test case, e.g. {@link com.example.android.apis.os.MorseCodeConverterTest}:
- * $ adb shell am instrument -w \
- *   -e class com.example.android.apis.os.MorseCodeConverterTest \
- *   com.example.android.apis.tests/android.test.InstrumentationTestRunner
- *
- * To run an individual test, e.g. {@link com.example.android.apis.os.MorseCodeConverterTest#testCharacterS()}:
- * $ adb shell am instrument -w \
- *   -e class com.example.android.apis.os.MorseCodeConverterTest#testCharacterS \
- *   com.example.android.apis.tests/android.test.InstrumentationTestRunner
- */
-public class AllTests extends TestSuite {
-
-    public static Test suite() {
-        return new TestSuiteBuilder(AllTests.class)
-                .includeAllPackagesUnderHere()
-                .build();
-    }
-}
diff --git a/testapps/testProjectTest/testlib/.classpath b/testapps/testProjectTest/testlib/.classpath
deleted file mode 100644
index 9afbc38..0000000
--- a/testapps/testProjectTest/testlib/.classpath
+++ /dev/null
@@ -1,9 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="src" path="gen"/>
-	<classpathentry combineaccessrules="false" kind="src" path="/testProjectTest-app"/>
-	<classpathentry kind="con" path="com.android.ide.eclipse.adt.ANDROID_FRAMEWORK"/>
-	<classpathentry kind="con" path="com.android.ide.eclipse.adt.LIBRARIES"/>
-	<classpathentry kind="output" path="bin/classes"/>
-</classpath>
diff --git a/testapps/testProjectTest/testlib/.project b/testapps/testProjectTest/testlib/.project
deleted file mode 100644
index 8450217..0000000
--- a/testapps/testProjectTest/testlib/.project
+++ /dev/null
@@ -1,34 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>testProjectTest-testlib</name>
-	<comment></comment>
-	<projects>
-		<project>testProjectTest-app</project>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>com.android.ide.eclipse.adt.ResourceManagerBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>com.android.ide.eclipse.adt.PreCompilerBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>com.android.ide.eclipse.adt.ApkBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>com.android.ide.eclipse.adt.AndroidNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/testapps/testProjectTest/testlib/AndroidManifest.xml b/testapps/testProjectTest/testlib/AndroidManifest.xml
deleted file mode 100644
index 93b02e4..0000000
--- a/testapps/testProjectTest/testlib/AndroidManifest.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
-    package="com.android.tests.testprojecttest.testlib"
-    android:versionCode="1"
-    android:versionName="1.0" >
-
-    <uses-sdk android:minSdkVersion="15" />
-
-    <!--
-         We add an application tag here just so that we can indicate that
-         this package needs to link against the android.test library,
-         which is needed when building test cases.
-    -->
-    <application android:label="testProjectTest-testlib">
-        <uses-library android:name="android.test.runner" />
-    </application>
-
-    <!--
-    This declares that this app uses the instrumentation test runner targeting
-    the package of com.android.tests.testprojecttest.testlib.  To run the tests use the command:
-    "adb shell am instrument -w com.android.tests.testprojecttest.testlib/android.test.InstrumentationTestRunner"
-    -->
-    <instrumentation
-        android:name="android.test.InstrumentationTestRunner"
-        android:targetPackage="com.android.tests.testprojecttest.testlib" />
-
-</manifest>
\ No newline at end of file
diff --git a/testapps/testProjectTest/testlib/build.xml b/testapps/testProjectTest/testlib/build.xml
deleted file mode 100644
index b59cc65..0000000
--- a/testapps/testProjectTest/testlib/build.xml
+++ /dev/null
@@ -1,92 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project name="testProjectTest-testlib" default="help">
-
-    <!-- The local.properties file is created and updated by the 'android' tool.
-         It contains the path to the SDK. It should *NOT* be checked into
-         Version Control Systems. -->
-    <property file="local.properties" />
-
-    <!-- The ant.properties file can be created by you. It is only edited by the
-         'android' tool to add properties to it.
-         This is the place to change some Ant specific build properties.
-         Here are some properties you may want to change/update:
-
-         source.dir
-             The name of the source directory. Default is 'src'.
-         out.dir
-             The name of the output directory. Default is 'bin'.
-
-         For other overridable properties, look at the beginning of the rules
-         files in the SDK, at tools/ant/build.xml
-
-         Properties related to the SDK location or the project target should
-         be updated using the 'android' tool with the 'update' action.
-
-         This file is an integral part of the build system for your
-         application and should be checked into Version Control Systems.
-
-         -->
-    <property file="ant.properties" />
-
-    <!-- if sdk.dir was not set from one of the property file, then
-         get it from the ANDROID_HOME env var.
-         This must be done before we load project.properties since
-         the proguard config can use sdk.dir -->
-    <property environment="env" />
-    <condition property="sdk.dir" value="${env.ANDROID_HOME}">
-        <isset property="env.ANDROID_HOME" />
-    </condition>
-
-    <!-- The project.properties file is created and updated by the 'android'
-         tool, as well as ADT.
-
-         This contains project specific properties such as project target, and library
-         dependencies. Lower level build properties are stored in ant.properties
-         (or in .classpath for Eclipse projects).
-
-         This file is an integral part of the build system for your
-         application and should be checked into Version Control Systems. -->
-    <loadproperties srcFile="project.properties" />
-
-    <!-- quick check on sdk.dir -->
-    <fail
-            message="sdk.dir is missing. Make sure to generate local.properties using 'android update project' or to inject it through the ANDROID_HOME environment variable."
-            unless="sdk.dir"
-    />
-
-    <!--
-        Import per project custom build rules if present at the root of the project.
-        This is the place to put custom intermediary targets such as:
-            -pre-build
-            -pre-compile
-            -post-compile (This is typically used for code obfuscation.
-                           Compiled code location: ${out.classes.absolute.dir}
-                           If this is not done in place, override ${out.dex.input.absolute.dir})
-            -post-package
-            -post-build
-            -pre-clean
-    -->
-    <import file="custom_rules.xml" optional="true" />
-
-    <!-- Import the actual build file.
-
-         To customize existing targets, there are two options:
-         - Customize only one target:
-             - copy/paste the target into this file, *before* the
-               <import> task.
-             - customize it to your needs.
-         - Customize the whole content of build.xml
-             - copy/paste the content of the rules files (minus the top node)
-               into this file, replacing the <import> task.
-             - customize to your needs.
-
-         ***********************
-         ****** IMPORTANT ******
-         ***********************
-         In all cases you must update the value of version-tag below to read 'custom' instead of an integer,
-         in order to avoid having your file be overridden by tools such as "android update project"
-    -->
-    <!-- version-tag: 1 -->
-    <import file="${sdk.dir}/tools/ant/build.xml" />
-
-</project>
diff --git a/testapps/testProjectTest/testlib/proguard-project.txt b/testapps/testProjectTest/testlib/proguard-project.txt
deleted file mode 100644
index f2fe155..0000000
--- a/testapps/testProjectTest/testlib/proguard-project.txt
+++ /dev/null
@@ -1,20 +0,0 @@
-# To enable ProGuard in your project, edit project.properties
-# to define the proguard.config property as described in that file.
-#
-# Add project specific ProGuard rules here.
-# By default, the flags in this file are appended to flags specified
-# in ${sdk.dir}/tools/proguard/proguard-android.txt
-# You can edit the include path and order by changing the ProGuard
-# include property in project.properties.
-#
-# For more details, see
-#   http://developer.android.com/guide/developing/tools/proguard.html
-
-# Add any project specific keep options here:
-
-# If your project uses WebView with JS, uncomment the following
-# and specify the fully qualified class name to the JavaScript interface
-# class:
-#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
-#   public *;
-#}
diff --git a/testapps/testProjectTest/testlib/project.properties b/testapps/testProjectTest/testlib/project.properties
deleted file mode 100644
index 01b6493..0000000
--- a/testapps/testProjectTest/testlib/project.properties
+++ /dev/null
@@ -1,16 +0,0 @@
-# This file is automatically generated by Android Tools.
-# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
-#
-# This file must be checked in Version Control Systems.
-#
-# To customize properties used by the Ant build system edit
-# "ant.properties", and override values to adapt the script to your
-# project structure.
-#
-# To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home):
-#proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt
-
-# Project target.
-target=android-15
-android.library.reference.1=../lib
-manifestmerger.enabled=true
diff --git a/testapps/testProjectTest/testlib/res/values/strings.xml b/testapps/testProjectTest/testlib/res/values/strings.xml
deleted file mode 100644
index ef42478..0000000
--- a/testapps/testProjectTest/testlib/res/values/strings.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<resources>
-
-    <string name="hello">Hello World!</string>
-    <string name="app_name">TestProjectTest-testTest</string>
-
-</resources>
\ No newline at end of file
diff --git a/testapps/testProjectTest/testlib/src/com/android/tests/testprojecttest/lib/LibActivityTest.java b/testapps/testProjectTest/testlib/src/com/android/tests/testprojecttest/lib/LibActivityTest.java
deleted file mode 100644
index 6632c58..0000000
--- a/testapps/testProjectTest/testlib/src/com/android/tests/testprojecttest/lib/LibActivityTest.java
+++ /dev/null
@@ -1,72 +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.tests.testprojecttest.lib;
-
-import android.test.ActivityInstrumentationTestCase2;
-import android.test.suitebuilder.annotation.MediumTest;
-import android.widget.TextView;
-
-import com.android.tests.testprojecttest.lib.R;
-
-/**
- * An example of an {@link ActivityInstrumentationTestCase2} of a specific activity {@link Focus2}.
- * By virtue of extending {@link ActivityInstrumentationTestCase2}, the target activity is automatically
- * launched and finished before and after each test.  This also extends
- * {@link android.test.InstrumentationTestCase}, which provides
- * access to methods for sending events to the target activity, such as key and
- * touch events.  See {@link #sendKeys}.
- *
- * In general, {@link android.test.InstrumentationTestCase}s and {@link ActivityInstrumentationTestCase2}s
- * are heavier weight functional tests available for end to end testing of your
- * user interface.  When run via a {@link android.test.InstrumentationTestRunner},
- * the necessary {@link android.app.Instrumentation} will be injected for you to
- * user via {@link #getInstrumentation} in your tests.
- *
- * See {@link com.example.android.apis.AllTests} for documentation on running
- * all tests and individual tests in this application.
- */
-public class LibActivityTest extends ActivityInstrumentationTestCase2<LibActivity> {
-
-    private TextView mTextView;
-
-    /**
-     * Creates an {@link ActivityInstrumentationTestCase2} that tests the {@link Focus2} activity.
-     */
-    public LibActivityTest() {
-        super(LibActivity.class);
-    }
-
-    @Override
-    protected void setUp() throws Exception {
-        super.setUp();
-        final LibActivity a = getActivity();
-        // ensure a valid handle to the activity has been returned
-        assertNotNull(a);
-        mTextView = (TextView) a.findViewById(R.id.text);
-    }
-
-    /**
-     * The name 'test preconditions' is a convention to signal that if this
-     * test doesn't pass, the test case was not set up properly and it might
-     * explain any and all failures in other tests.  This is not guaranteed
-     * to run before other tests, as junit uses reflection to find the tests.
-     */
-    @MediumTest
-    public void testPreconditions() {
-        assertNotNull(mTextView);
-    }
-}
diff --git a/testapps/testProjectTest/testlib/src/com/android/tests/testprojecttest/test/AllTests.java b/testapps/testProjectTest/testlib/src/com/android/tests/testprojecttest/test/AllTests.java
deleted file mode 100644
index a77b53c..0000000
--- a/testapps/testProjectTest/testlib/src/com/android/tests/testprojecttest/test/AllTests.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.tests.testprojecttest.test;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-import android.test.suitebuilder.TestSuiteBuilder;
-
-/**
- * A test suite containing all tests for ApiDemos.
- *
- * To run all suites found in this apk:
- * $ adb shell am instrument -w \
- *   com.example.android.apis.tests/android.test.InstrumentationTestRunner
- *
- * To run just this suite from the command line:
- * $ adb shell am instrument -w \
- *   -e class com.example.android.apis.AllTests \
- *   com.example.android.apis.tests/android.test.InstrumentationTestRunner
- *
- * To run an individual test case, e.g. {@link com.example.android.apis.os.MorseCodeConverterTest}:
- * $ adb shell am instrument -w \
- *   -e class com.example.android.apis.os.MorseCodeConverterTest \
- *   com.example.android.apis.tests/android.test.InstrumentationTestRunner
- *
- * To run an individual test, e.g. {@link com.example.android.apis.os.MorseCodeConverterTest#testCharacterS()}:
- * $ adb shell am instrument -w \
- *   -e class com.example.android.apis.os.MorseCodeConverterTest#testCharacterS \
- *   com.example.android.apis.tests/android.test.InstrumentationTestRunner
- */
-public class AllTests extends TestSuite {
-
-    public static Test suite() {
-        return new TestSuiteBuilder(AllTests.class)
-                .includeAllPackagesUnderHere()
-                .build();
-    }
-}
diff --git a/testapps/testSensors/.classpath b/testapps/testSensors/.classpath
deleted file mode 100644
index a4763d1..0000000
--- a/testapps/testSensors/.classpath
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="src" path="gen"/>
-	<classpathentry kind="con" path="com.android.ide.eclipse.adt.ANDROID_FRAMEWORK"/>
-	<classpathentry kind="con" path="com.android.ide.eclipse.adt.LIBRARIES"/>
-	<classpathentry kind="output" path="bin/classes"/>
-</classpath>
diff --git a/testapps/testSensors/.project b/testapps/testSensors/.project
deleted file mode 100644
index de0da91..0000000
--- a/testapps/testSensors/.project
+++ /dev/null
@@ -1,33 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>TestSensorsActivity</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>com.android.ide.eclipse.adt.ResourceManagerBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>com.android.ide.eclipse.adt.PreCompilerBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>com.android.ide.eclipse.adt.ApkBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>com.android.ide.eclipse.adt.AndroidNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/testapps/testSensors/AndroidManifest.xml b/testapps/testSensors/AndroidManifest.xml
deleted file mode 100644
index 3757174..0000000
--- a/testapps/testSensors/AndroidManifest.xml
+++ /dev/null
@@ -1,41 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
- * Copyright 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.
- */
--->
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
-    package="com.android.tests.testsensors"
-    android:versionCode="1"
-    android:versionName="1.0" >
-
-    <uses-sdk android:minSdkVersion="8" />
-    <uses-permission android:name="android.permission.INTERNET" />
-
-    <application
-        android:icon="@drawable/ic_launcher"
-        android:label="@string/app_name" >
-        <activity
-            android:label="@string/app_name"
-            android:name=".TestSensorsActivity" >
-            <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/testapps/testSensors/project.properties b/testapps/testSensors/project.properties
deleted file mode 100644
index ea89160..0000000
--- a/testapps/testSensors/project.properties
+++ /dev/null
@@ -1,11 +0,0 @@
-# This file is automatically generated by Android Tools.
-# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
-#
-# This file must be checked in Version Control Systems.
-#
-# To customize properties used by the Ant build system use,
-# "ant.properties", and override values to adapt the script to your
-# project structure.
-
-# Project target.
-target=android-8
diff --git a/testapps/testSensors/res/drawable-hdpi/ic_launcher.png b/testapps/testSensors/res/drawable-hdpi/ic_launcher.png
deleted file mode 100644
index 8074c4c..0000000
--- a/testapps/testSensors/res/drawable-hdpi/ic_launcher.png
+++ /dev/null
Binary files differ
diff --git a/testapps/testSensors/res/drawable-ldpi/ic_launcher.png b/testapps/testSensors/res/drawable-ldpi/ic_launcher.png
deleted file mode 100644
index 1095584..0000000
--- a/testapps/testSensors/res/drawable-ldpi/ic_launcher.png
+++ /dev/null
Binary files differ
diff --git a/testapps/testSensors/res/drawable-mdpi/ic_launcher.png b/testapps/testSensors/res/drawable-mdpi/ic_launcher.png
deleted file mode 100644
index a07c69f..0000000
--- a/testapps/testSensors/res/drawable-mdpi/ic_launcher.png
+++ /dev/null
Binary files differ
diff --git a/testapps/testSensors/res/layout/main.xml b/testapps/testSensors/res/layout/main.xml
deleted file mode 100644
index 1f73c9c..0000000
--- a/testapps/testSensors/res/layout/main.xml
+++ /dev/null
@@ -1,15 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-
-<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
-    android:id="@+id/scrollView1"
-    android:layout_width="fill_parent"
-    android:layout_height="fill_parent" >
-
-    <TableLayout
-        android:id="@+id/tableLayout"
-        android:layout_width="fill_parent"
-        android:layout_height="wrap_content"
-        android:saveEnabled="false" />
-
-</ScrollView>
-
diff --git a/testapps/testSensors/res/layout/one_row.xml b/testapps/testSensors/res/layout/one_row.xml
deleted file mode 100644
index e3c54b8..0000000
--- a/testapps/testSensors/res/layout/one_row.xml
+++ /dev/null
Binary files differ
diff --git a/testapps/testSensors/res/values/strings.xml b/testapps/testSensors/res/values/strings.xml
deleted file mode 100644
index bc7d7c8..0000000
--- a/testapps/testSensors/res/values/strings.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<resources>
-
-    <string name="hello">Hello World, TestSensorsActivity!</string>
-    <string name="app_name">TestSensors</string>
-
-</resources>
\ No newline at end of file
diff --git a/testapps/testSensors/src/com/android/tests/testsensors/TestSensorsActivity.java b/testapps/testSensors/src/com/android/tests/testsensors/TestSensorsActivity.java
deleted file mode 100644
index c30e05f..0000000
--- a/testapps/testSensors/src/com/android/tests/testsensors/TestSensorsActivity.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.tests.testsensors;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import android.app.Activity;
-import android.hardware.Sensor;
-import android.hardware.SensorEvent;
-import android.hardware.SensorEventListener;
-import android.hardware.SensorManager;
-import android.os.Bundle;
-import android.view.LayoutInflater;
-import android.widget.TableLayout;
-import android.widget.TableRow;
-import android.widget.TextView;
-
-public class TestSensorsActivity extends Activity {
-    private static final String TAG = "testSensors";
-    /** Array containing monitored sensors. */
-    private List<MonitoredSensor> mSensors;
-    /** Controls displayed list of sensors. */
-    private TableLayout mTableLayout;
-
-    /**
-     * Encapsulates a sensor.
-     */
-    private class MonitoredSensor implements SensorEventListener {
-        /** Sensor to monitor. */
-        private final Sensor mSensor;
-        /** Check box representing the sensor on the screen. */
-        private final TextView mName;
-        /** Text view displaying the value of the sensor. */
-        private final TextView mVal;
-        /** Formats string to show in the TextView. */
-        private String mTextFmt;
-
-        /**
-         * Constructs MonitoredSensor instance, and register the listeners.
-         *
-         * @param sensor Sensor to monitor.
-         */
-        MonitoredSensor(Sensor sensor) {
-            mSensor = sensor;
-
-            // Add a row representing this sensor on the display
-            final LayoutInflater inflater = getLayoutInflater();
-            final TableRow row = (TableRow) inflater.inflate(R.layout.one_row, mTableLayout, false);
-            mTableLayout.addView(row);
-
-            // Initialize displayed checkbox for this sensor, and register
-            // checked state listener for it.
-            mName = (TextView) row.findViewById(R.id.row_textview_name);
-
-            // Initialize displayed text box for this sensor.
-            mVal = (TextView) row.findViewById(R.id.row_textview_value);
-            mVal.setText("");
-
-            // Set appropriate sensor name depending on the type. Unfortunately,
-            // we can't really use sensor.getName() here, since the value it
-            // returns (although resembles the purpose) is a bit vaguer than it
-            // should be. Also choose an appropriate format for the strings that
-            // display sensor's value, and strings that are sent to the
-            // emulator.
-            switch (sensor.getType()) {
-                case Sensor.TYPE_ACCELEROMETER:
-                    mName.setText("Accelerometer");
-                    // 3 floats.
-                    mTextFmt = "%+.2f %+.2f %+.2f";
-                    break;
-                case 9: // Sensor.TYPE_GRAVITY is missing in API 7
-                    // 3 floats.
-                    mName.setText("Gravity");
-                    mTextFmt = "%+.2f %+.2f %+.2f";
-                    break;
-                case Sensor.TYPE_GYROSCOPE:
-                    mName.setText("Gyroscope");
-                    // 3 floats.
-                    mTextFmt = "%+.2f %+.2f %+.2f";
-                    break;
-                case Sensor.TYPE_LIGHT:
-                    mName.setText("Light");
-                    // 1 integer.
-                    mTextFmt = "%.0f";
-                    break;
-                case 10: // Sensor.TYPE_LINEAR_ACCELERATION is missing in API 7
-                    mName.setText("Linear acceleration");
-                    // 3 floats.
-                    mTextFmt = "%+.2f %+.2f %+.2f";
-                    break;
-                case Sensor.TYPE_MAGNETIC_FIELD:
-                    mName.setText("Magnetic field");
-                    // 3 floats.
-                    mTextFmt = "%+.2f %+.2f %+.2f";
-                    break;
-                case Sensor.TYPE_ORIENTATION:
-                    mName.setText("Orientation");
-                    // 3 integers.
-                    mTextFmt = "%+03.0f %+03.0f %+03.0f";
-                    break;
-                case Sensor.TYPE_PRESSURE:
-                    mName.setText("Pressure");
-                    // 1 integer.
-                    mTextFmt = "%.0f";
-                    break;
-                case Sensor.TYPE_PROXIMITY:
-                    mName.setText("Proximity");
-                    // 1 integer.
-                    mTextFmt = "%.0f";
-                    break;
-                case 11: // Sensor.TYPE_ROTATION_VECTOR is missing in API 7
-                    mName.setText("Rotation");
-                    // 3 floats.
-                    mTextFmt = "%+.2f %+.2f %+.2f";
-                    break;
-                case Sensor.TYPE_TEMPERATURE:
-                    mName.setText("Temperature");
-                    // 1 integer.
-                    mTextFmt = "%.0f";
-                    break;
-                default:
-                    mName.setText("<Unknown>");
-                    mTextFmt = "N/A";
-                    break;
-            }
-        }
-
-        /**
-         * Gets sensor type.
-         *
-         * @return Sensor type as one of the Sensor.TYPE_XXX constants.
-         */
-        private int getType() {
-            return mSensor.getType();
-        }
-
-        /**
-         * Starts monitoring the sensor. NOTE: This method is called from
-         * outside of the UI thread.
-         */
-        private void startListening() {
-            SensorManager sm = (SensorManager) getSystemService(SENSOR_SERVICE);
-            sm.registerListener(this, mSensor, SensorManager.SENSOR_DELAY_UI);
-        }
-
-        /**
-         * Stops monitoring the sensor. NOTE: This method is called from outside
-         * of the UI thread.
-         */
-        private void stopListening() {
-            SensorManager sm = (SensorManager) getSystemService(SENSOR_SERVICE);
-            sm.unregisterListener(this);
-        }
-
-        /**
-         * Handles "sensor changed" event. This is an implementation of the
-         * SensorEventListener interface.
-         */
-        @Override
-        public void onSensorChanged(SensorEvent event) {
-            // Display current sensor value, and format message that will be
-            // sent to the emulator.
-            final int nArgs = event.values.length;
-            String val;
-            if (nArgs == 3) {
-                val = String.format(mTextFmt, event.values[0], event.values[1], event.values[2]);
-            } else if (nArgs == 2) {
-                val = String.format(mTextFmt, event.values[0], event.values[1]);
-            } else if (nArgs == 1) {
-                val = String.format(mTextFmt, event.values[0]);
-            } else {
-                return;
-            }
-            mVal.setText(val);
-        }
-
-        /**
-         * Handles "sensor accuracy changed" event. This is an implementation of
-         * the SensorEventListener interface.
-         */
-        @Override
-        public void onAccuracyChanged(Sensor sensor, int accuracy) {
-        }
-    } // MonitoredSensor
-
-    /** Called when the activity is first created. */
-    @Override
-    public void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-        setContentView(R.layout.main);
-
-        mTableLayout = (TableLayout) findViewById(R.id.tableLayout);
-
-        // Iterate through the available sensors, adding them to the array.
-        mSensors = new ArrayList<MonitoredSensor>();
-        SensorManager sm = (SensorManager) getSystemService(SENSOR_SERVICE);
-        List<Sensor> sensors = sm.getSensorList(Sensor.TYPE_ALL);
-        int cur_index = 0;
-        for (int n = 0; n < sensors.size(); n++) {
-            Sensor avail_sensor = sensors.get(n);
-
-            // There can be multiple sensors of the same type. We need only one.
-            if (!isSensorTypeAlreadyMonitored(avail_sensor.getType())) {
-                // The first sensor we've got for the given type is not
-                // necessarily the right one. So, use the default sensor
-                // for the given type.
-                Sensor def_sens = sm.getDefaultSensor(avail_sensor.getType());
-                MonitoredSensor to_add = new MonitoredSensor(def_sens);
-                cur_index++;
-                mSensors.add(to_add);
-                to_add.startListening();
-            }
-        }
-    }
-
-    /**
-     * Checks if a sensor for the given type is already monitored.
-     *
-     * @param type Sensor type (one of the Sensor.TYPE_XXX constants)
-     * @return true if a sensor for the given type is already monitored, or
-     *         false if the sensor is not monitored.
-     */
-    private boolean isSensorTypeAlreadyMonitored(int type) {
-        for (int n = 0; n < mSensors.size(); n++) {
-            if (mSensors.get(n).getType() == type) {
-                return true;
-            }
-        }
-        return false;
-    }
-}
diff --git a/testapps/userLibTest/.classpath b/testapps/userLibTest/.classpath
deleted file mode 100644
index 132d8c9..0000000
--- a/testapps/userLibTest/.classpath
+++ /dev/null
@@ -1,9 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="src" path="gen"/>
-	<classpathentry kind="con" path="com.android.ide.eclipse.adt.ANDROID_FRAMEWORK"/>
-	<classpathentry kind="con" path="com.android.ide.eclipse.adt.LIBRARIES"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.USER_LIBRARY/USERLIBTEST"/>
-	<classpathentry kind="output" path="bin/classes"/>
-</classpath>
diff --git a/testapps/userLibTest/.project b/testapps/userLibTest/.project
deleted file mode 100644
index 226edb7..0000000
--- a/testapps/userLibTest/.project
+++ /dev/null
@@ -1,33 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>userLibTest</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>com.android.ide.eclipse.adt.ResourceManagerBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>com.android.ide.eclipse.adt.PreCompilerBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>com.android.ide.eclipse.adt.ApkBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>com.android.ide.eclipse.adt.AndroidNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/testapps/userLibTest/AndroidManifest.xml b/testapps/userLibTest/AndroidManifest.xml
deleted file mode 100644
index 5883607..0000000
--- a/testapps/userLibTest/AndroidManifest.xml
+++ /dev/null
@@ -1,15 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
-      package="com.android.tests.userlibtest"
-      android:versionCode="1"
-      android:versionName="1.0">
-    <application android:label="@string/app_name" android:icon="@drawable/ic_launcher">
-        <activity android:name="Main"
-                  android:label="@string/app_name">
-            <intent-filter>
-                <action android:name="android.intent.action.MAIN" />
-                <category android:name="android.intent.category.LAUNCHER" />
-            </intent-filter>
-        </activity>
-    </application>
-</manifest>
diff --git a/testapps/userLibTest/COMPILE_AND_RUN b/testapps/userLibTest/COMPILE_AND_RUN
deleted file mode 100644
index e69de29..0000000
--- a/testapps/userLibTest/COMPILE_AND_RUN
+++ /dev/null
diff --git a/testapps/userLibTest/ECLIPSEONLY b/testapps/userLibTest/ECLIPSEONLY
deleted file mode 100644
index e69de29..0000000
--- a/testapps/userLibTest/ECLIPSEONLY
+++ /dev/null
diff --git a/testapps/userLibTest/README.txt b/testapps/userLibTest/README.txt
deleted file mode 100644
index 5d63f4e..0000000
--- a/testapps/userLibTest/README.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-This test requires a workspace setup:
-
-- Create User Library called "USERLIBTEST"
-- Add to this library the jar located in jars/basicJar.jar
-- App should compile, and deploy on device and UI show show SUCCESS
\ No newline at end of file
diff --git a/testapps/userLibTest/SUCCESS b/testapps/userLibTest/SUCCESS
deleted file mode 100644
index e69de29..0000000
--- a/testapps/userLibTest/SUCCESS
+++ /dev/null
diff --git a/testapps/userLibTest/jars/basicJar.jar b/testapps/userLibTest/jars/basicJar.jar
deleted file mode 100644
index 319ed02..0000000
--- a/testapps/userLibTest/jars/basicJar.jar
+++ /dev/null
Binary files differ
diff --git a/testapps/userLibTest/proguard-project.txt b/testapps/userLibTest/proguard-project.txt
deleted file mode 100644
index f2fe155..0000000
--- a/testapps/userLibTest/proguard-project.txt
+++ /dev/null
@@ -1,20 +0,0 @@
-# To enable ProGuard in your project, edit project.properties
-# to define the proguard.config property as described in that file.
-#
-# Add project specific ProGuard rules here.
-# By default, the flags in this file are appended to flags specified
-# in ${sdk.dir}/tools/proguard/proguard-android.txt
-# You can edit the include path and order by changing the ProGuard
-# include property in project.properties.
-#
-# For more details, see
-#   http://developer.android.com/guide/developing/tools/proguard.html
-
-# Add any project specific keep options here:
-
-# If your project uses WebView with JS, uncomment the following
-# and specify the fully qualified class name to the JavaScript interface
-# class:
-#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
-#   public *;
-#}
diff --git a/testapps/userLibTest/project.properties b/testapps/userLibTest/project.properties
deleted file mode 100644
index 0840b4a..0000000
--- a/testapps/userLibTest/project.properties
+++ /dev/null
@@ -1,14 +0,0 @@
-# This file is automatically generated by Android Tools.
-# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
-#
-# This file must be checked in Version Control Systems.
-#
-# To customize properties used by the Ant build system edit
-# "ant.properties", and override values to adapt the script to your
-# project structure.
-#
-# To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home):
-#proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt
-
-# Project target.
-target=android-15
diff --git a/testapps/userLibTest/res/drawable-hdpi/ic_launcher.png b/testapps/userLibTest/res/drawable-hdpi/ic_launcher.png
deleted file mode 100644
index 8074c4c..0000000
--- a/testapps/userLibTest/res/drawable-hdpi/ic_launcher.png
+++ /dev/null
Binary files differ
diff --git a/testapps/userLibTest/res/drawable-ldpi/ic_launcher.png b/testapps/userLibTest/res/drawable-ldpi/ic_launcher.png
deleted file mode 100644
index 1095584..0000000
--- a/testapps/userLibTest/res/drawable-ldpi/ic_launcher.png
+++ /dev/null
Binary files differ
diff --git a/testapps/userLibTest/res/drawable-mdpi/ic_launcher.png b/testapps/userLibTest/res/drawable-mdpi/ic_launcher.png
deleted file mode 100644
index a07c69f..0000000
--- a/testapps/userLibTest/res/drawable-mdpi/ic_launcher.png
+++ /dev/null
Binary files differ
diff --git a/testapps/userLibTest/res/layout/main.xml b/testapps/userLibTest/res/layout/main.xml
deleted file mode 100644
index 3e65644..0000000
--- a/testapps/userLibTest/res/layout/main.xml
+++ /dev/null
@@ -1,15 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:tools="http://schemas.android.com/tools"
-    android:layout_width="fill_parent"
-    android:layout_height="fill_parent"
-    android:orientation="vertical" >
-
-    <TextView
-        android:id="@+id/basicJar"
-        android:layout_width="fill_parent"
-        android:layout_height="wrap_content"
-        android:text="\\?"
-        tools:ignore="HardcodedText" />
-
-</LinearLayout>
\ No newline at end of file
diff --git a/testapps/userLibTest/res/values/strings.xml b/testapps/userLibTest/res/values/strings.xml
deleted file mode 100644
index 549e4ea..0000000
--- a/testapps/userLibTest/res/values/strings.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<resources>
-    <string name="app_name">Main</string>
-</resources>
diff --git a/testapps/userLibTest/src/com/android/tests/userlibtest/Main.java b/testapps/userLibTest/src/com/android/tests/userlibtest/Main.java
deleted file mode 100644
index b2f1be3..0000000
--- a/testapps/userLibTest/src/com/android/tests/userlibtest/Main.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package com.android.tests.userlibtest;
-
-import android.app.Activity;
-import android.os.Bundle;
-import android.widget.TextView;
-
-import com.android.tests.basicjar.BasicJar;
-
-public class Main extends Activity {
-    /** Called when the activity is first created. */
-    @Override
-    public void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-        setContentView(R.layout.main);
-
-        TextView tv = (TextView) findViewById(R.id.basicJar);
-        tv.setText("BasicJar: " + BasicJar.getContent());
-    }
-}
